
    =Og5                       	 d Z ddlZdZdZ G d de          Z G d de          Zd	 Zd2dZd Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Z G d d          Zdaej         G d de                      Zej         G d de                      Z G d d          Zee_         G d d          Z G d  d!ee          Z G d" d#e          Z G d$ d%ee          Z G d& d'          Zee_        ee_         G d( d)          Z G d* d+ee          Z  G d, d-e           Z! G d. d/ee          Z" G d0 d1          Z#e#e _        e#e"_        dS )3z1.0    N       c                       e Zd ZdS )AddressValueErrorN__name__
__module____qualname__     "/usr/lib64/python3.11/ipaddress.pyr   r              //r   r   c                       e Zd ZdS )NetmaskValueErrorNr   r   r   r   r   r      r   r   r   c                     	 	 t          |           S # t          t          f$ r Y nw xY w	 t          |           S # t          t          f$ r Y nw xY wt	          | d          )Nz. does not appear to be an IPv4 or IPv6 address)IPv4Addressr   r   IPv6Address
ValueErroraddresss    r   
ip_addressr      s    7###01   7###01    QQQ
R
RR    &&9 AATc                     	 	 t          | |          S # t          t          f$ r Y nw xY w	 t          | |          S # t          t          f$ r Y nw xY wt	          | d          )Nz. does not appear to be an IPv4 or IPv6 network)IPv4Networkr   r   IPv6Networkr   )r   stricts     r   
ip_networkr   9   s    7F+++01   7F+++01    QQQ
R
RRs    ''; AAc                     	 	 t          |           S # t          t          f$ r Y nw xY w	 t          |           S # t          t          f$ r Y nw xY wt	          | d          )Nz0 does not appear to be an IPv4 or IPv6 interface)IPv4Interfacer   r   IPv6Interfacer   r   s    r   ip_interfacer!   V   s    (W%%%01   W%%%01    SSS
T
TTr   c                 j    	 	 |                      d          S # t          $ r t          d          w xY w)N   z&Address negative or too large for IPv4to_bytesOverflowErrorr   r   s    r   v4_int_to_packedr'   x   sO    C""" C C CABBBC    2c                 j    	 	 |                      d          S # t          $ r t          d          w xY w)N   z&Address negative or too large for IPv6r$   r   s    r   v6_int_to_packedr+      sO    C### C C CABBBCr(   c                     	 t          |                               d          }t          |          dk    rt          d|           |S )N/   zOnly one '/' permitted in )strsplitlenr   )r   addrs     r   _split_optional_netmaskr3      sI    Kw<<c""D
4yy1}} HW H HIIIKr   c              #      K   	 t          |           }t          |          x}}|D ]}|j        |j        dz   k    r||fV  |}|} ||fV  d S N   )iternext_ip)	addressesitfirstlastips        r   _find_address_ranger?      s|       
iB88ED  6TX\!!+E
+r   c                 f    	 | dk    r|S t          ||  | dz
  z                                            S )Nr   r6   )min
bit_length)numberbitss     r   _count_righthand_zero_bitsrE      s>    	 {{tvg*6688999r   c              #   l  K   	 t          | t                    rt          |t                    st          d          | j        |j        k    rt          | d|d          | |k    rt	          d          | j        dk    rt
          }n"| j        dk    rt          }nt	          d          | j        }| j        }|j        }||k    rmt          t          ||          ||z
  dz                                   dz
            } ||||z
  f          }|V  |d|z  z  }|dz
  |j        k    rd S ||k    kd S d S )	Nz1first and last must be IP addresses, not networks and  are not of the same versionz*last IP address must be greater than firstr#      zunknown IP versionr6   )
isinstance_BaseAddress	TypeErrorversionr   r   r   _max_prefixlenr9   rA   rE   rB   	_ALL_ONES)r<   r=   r>   ip_bits	first_intlast_intnbitsnets           r   summarize_address_rangerU      s     2 |,, Ml++MKLLL}$$& ' ' 	't||EFFF}	!		-..."G	IxH
x

.y'BB	)A-99;;a?A Ab)Wu_-..			Q%Z	q=BL((E x





r   c              #   z  K   	 t          |           }i }|re|                                }|                                }|                    |          }||||<   n||k    r||= |                    |           |ed }t          |                                          D ]}||j        |j        k    r|V  |}d S N)listpopsupernetgetappendsortedvaluesbroadcast_address)r:   to_mergesubnetsrT   rZ   existingr=   s          r   _collapse_addresses_internalrc      s      0 IHG
 	&llnn<<>>;;x(( #GH__!OOH%%%  	& Dgnn&&''   %)>>>			 r   c                 L   	 g }g }g }| D ]2}t          |t                    rI|r1|d         j        |j        k    rt          |d|d         d          |                    |           a|j        |j        k    ry|r1|d         j        |j        k    rt          |d|d         d          	 |                    |j                   # t          $ r |                    |j	                   Y w xY w|r1|d         j        |j        k    rt          |d|d         d          |                    |           4t          t          |                    }|r8t          |          D ](\  }}|                    t          ||                     )t          ||z             S )NrG   rH   )rJ   rK   _versionrL   r\   
_prefixlenrN   r>   AttributeErrornetwork_addressr]   setr?   extendrU   rc   )r:   addrsipsnetsr>   r<   r=   s          r   collapse_addressesro   0  s   " E
CD   b,'' 	 /s2w'2;66!#SWWW!. / / /JJrNNNN]b/// /s2w'2;66!#SWWW!. / / //

25!!!!! / / /

2-...../  0R)R[88!#T"XXX!/ 0 0 0KKOOOO S

C  ?.s33 	? 	?KE4LL0==>>>>'555s   /C

$C10C1c                     	 t          | t                    r|                                 S t          | t                    r|                                 S t
          S rW   )rJ   _BaseNetwork_get_networks_keyrK   _get_address_keyNotImplemented)objs    r   get_mixed_type_keyrv   f  sW    " #|$$ &$$&&&	C	&	& &##%%%r   c                      e Zd Z	 dZed             Zed             Zed             Zed             Zd Z	d Z
ed             Zed	             Zed
             Zed             Zed             Zed             Zd ZdS )_IPAddressBaser   c                 ,    	 |                                  S rW   )_explode_shorthand_ip_stringselfs    r   explodedz_IPAddressBase.exploded  s    H00222r   c                 "    	 t          |           S rW   r/   r{   s    r   
compressedz_IPAddressBase.compressed  s    I4yyr   c                 ,    	 |                                  S rW   )_reverse_pointerr{   s    r   reverse_pointerz_IPAddressBase.reverse_pointer  s    	 $$&&&r   c                 F    dt          |           fz  }t          |          )Nz%200s has no version specifiedtypeNotImplementedErrorr|   msgs     r   rM   z_IPAddressBase.version  s"    .$t**>!#&&&r   c                     |dk     rd}t          ||| j        fz            || j        k    r!d}t          ||| j        | j        fz            d S )Nr   z-%d (< 0) is not permitted as an IPv%d addressz2%d (>= 2**%d) is not permitted as an IPv%d address)r   rf   rO   rN   )r|   r   r   s      r   _check_int_addressz!_IPAddressBase._check_int_address  sn    Q;;AC#C7DM*B$BCCCT^##FC#C7D4G+/=+: %: ; ; ; $#r   c                 j    t          |          }||k    rd}t          ||||| j        fz            d S )Nz6%r (len %d != %d) is not permitted as an IPv%d address)r1   r   rf   )r|   r   expected_lenaddress_lenr   s        r   _check_packed_addressz$_IPAddressBase._check_packed_address  sS    'll,&&JC#C7K+7+H %H I I I '&r   c                 (    	 | j         | j         |z	  z  S rW   )rO   )cls	prefixlens     r   _ip_int_from_prefixz"_IPAddressBase._ip_int_from_prefix  s    	 } :;;r   c                     	 t          || j                  }| j        |z
  }||z	  }d|z  dz
  }||k    r4| j        dz  }|                    |d          }d}t          ||z            |S )Nr6      bigz&Netmask pattern %r mixes zeroes & ones)rE   rN   r%   r   )	r   ip_inttrailing_zeroesr   leading_onesall_onesbyteslendetailsr   s	            r   _prefix_from_ip_intz"_IPAddressBase._prefix_from_ip_int  s    
	 5V585GI I&8	0Na'8##)Q.Hooh66G:CS7]+++r   c                 ,    d|z  }t          |          d )Nz%r is not a valid netmask)r   )r   netmask_strr   s      r   _report_invalid_netmaskz&_IPAddressBase._report_invalid_netmask  s    )K7$$$.r   c                 @   	 |                                 r|                                s|                     |           	 t          |          }n%# t          $ r |                     |           Y nw xY wd|cxk    r| j        k    sn |                     |           |S Nr   )isasciiisdigitr   intr   rN   )r   prefixlen_strr   s      r   _prefix_from_prefix_stringz)_IPAddressBase._prefix_from_prefix_string  s    
	 %%'' 	7M,A,A,C,C 	7''666	7M**II 	7 	7 	7''66666	7Y4444#"44444''666s    A A21A2c                 T   	 	 |                      |          }n%# t          $ r |                     |           Y nw xY w	 |                     |          S # t          $ r Y nw xY w|| j        z  }	 |                     |          S # t          $ r |                     |           Y d S w xY wrW   )_ip_int_from_stringr   r   r   r   rO   )r   ip_strr   s      r   _prefix_from_ip_stringz%_IPAddressBase._prefix_from_ip_string  s    
		0,,V44FF  	0 	0 	0''/////	0	**6222 	 	 	D	 	#-	0**6222 	0 	0 	0''//////	0s/    ;;A 
A! A!/B B'&B'c                     	 t          |t          t          f          r	|| j        fS t          |t                    st          |          }t          |          dk    r|S |d         | j        fS )Nr6   r   )rJ   bytesr   rN   tupler3   r1   )r   r   s     r   _split_addr_prefixz!_IPAddressBase._split_addr_prefix  sx    	 gs|,, 	/C...'5)) 	7 .g66G w<<!Nqz3---r   c                 0    | j         t          |           ffS rW   	__class__r/   r{   s    r   
__reduce__z_IPAddressBase.__reduce__-  s    ~D		|++r   N)r   r	   r
   	__slots__propertyr}   r   r   rM   r   r   classmethodr   r   r   r   r   r   r   r   r   r   rx   rx     sY       I3 3 X3   X ' ' X' ' ' X'; ; ;I I I 
< 
< [
<   [0 / / [/   [0 0 0 [0B . . [.., , , , ,r   rx   c                   `     e Zd Z	 dZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Z fdZ xZS )rK   r   c                     | j         S rW   )r9   r{   s    r   __int__z_BaseAddress.__int__>  s	    xr   c                 r    	 | j         |j         k    o| j        |j        k    S # t          $ r
 t          cY S w xY wrW   )r9   rf   rh   rt   r|   others     r   __eq__z_BaseAddress.__eq__A  sP    	"H	) 879 	" 	" 	"!!!!	"s   " 66c                     t          |t                    st          S | j        |j        k    rt	          | d|d          | j        |j        k    r| j        |j        k     S dS NrG   rH   F)rJ   rK   rt   rf   rL   r9   r   s     r   __lt__z_BaseAddress.__lt__H  sp    %.. 	"!!=EN**!TT555* + + +8uy  8ei''ur   c                     t          |t                    st          S |                     t          |           |z             S rW   rJ   r   rt   r   r   s     r   __add__z_BaseAddress.__add__T  7    %%% 	"!!~~c$ii%/000r   c                     t          |t                    st          S |                     t          |           |z
            S rW   r   r   s     r   __sub__z_BaseAddress.__sub__Y  r   r   c                 @    | j         j        dt          |           dS N()r   r   r/   r{   s    r   __repr__z_BaseAddress.__repr__^  "    >222CIIII>>r   c                 P    t          |                     | j                            S rW   )r/   _string_from_ip_intr9   r{   s    r   __str__z_BaseAddress.__str__a  s     4++DH55666r   c                 ^    t          t          t          | j                                      S rW   )hashhexr   r9   r{   s    r   __hash__z_BaseAddress.__hash__d  s     CDH&&'''r   c                     | j         | fS rW   rf   r{   s    r   rs   z_BaseAddress._get_address_keyg  s    t$$r   c                      | j         | j        ffS rW   )r   r9   r{   s    r   r   z_BaseAddress.__reduce__j  s    ~{**r   c                    	 |r|d         dk    rt          t          |           |          S t          dd l}|                    d          at                              |          }|s!t                                          |          S |                                \  }}}|dk    r| j	        dk    rd}nd}|dk    r| j
        }n
| j
        dz  }|r||dz  d	z
  z  }|r|d
z  }t          t          |           | d| | |           S )Nre   sr   z(#?)(_?)([xbnX])nr#   bxr6   r.   0)formatr/   _address_fmt_rerecompile	fullmatchsuper
__format__groupsrf   rN   r   )	r|   fmtr   m	alternategroupingfmt_basepadlenr   s	           r   r   z_BaseAddress.__format__m  s;   
	  	*c"gnn#d))S))) "III jj);<<O%%c** 	+77%%c***()

%	8X s??}!!s??(FF(A-F 	&fkAo%F 	aKFc$iiI!L!L!L!L(!L!LMMMr   )r   r	   r
   r   r   r   r   r   r   r   r   r   rs   r   r   __classcell__r   s   @r   rK   rK   3  s         I  " " "  1 1 1
1 1 1
? ? ?7 7 7( ( (% % %+ + +/N /N /N /N /N /N /N /N /Nr   rK   c                      e Zd Z	 d Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zej        d             Zej        d             Zed             Zed             Zed             Zed             Zed             Zed             Zd Zd Zd Zd$dZd$dZed             Zed             Zd Z d Z!ed             Z"ed             Z#ed              Z$ed!             Z%ed"             Z&ed#             Z'dS )%rq   c                 @    | j         j        dt          |           dS r   r   r{   s    r   r   z_BaseNetwork.__repr__  r   r   c                 $    d| j         | j        fz  S N%s/%d)ri   r   r{   s    r   r   z_BaseNetwork.__str__  s    $.???r   c              #      K   	 t          | j                  }t          | j                  }t          |dz   |          D ]}|                     |          V  d S r5   r   ri   r_   range_address_classr|   network	broadcastr   s       r   hostsz_BaseNetwork.hosts  sq      	 d*++.//	w{I.. 	) 	)A%%a((((((	) 	)r   c              #      K   t          | j                  }t          | j                  }t          ||dz             D ]}|                     |          V  d S r5   r   r   s       r   __iter__z_BaseNetwork.__iter__  sj      d*++.//	w	A.. 	) 	)A%%a((((((	) 	)r   c                 (   t          | j                  }t          | j                  }|dk    r0||z   |k    rt          d          |                     ||z             S |dz  }||z   |k     rt          d          |                     ||z             S )Nr   zaddress out of ranger6   )r   ri   r_   
IndexErrorr   )r|   r   r   r   s       r   __getitem__z_BaseNetwork.__getitem__  s    d*++.//	66{Y&& !7888&&w{333FA1}w&& !7888&&y1}555r   c                    t          |t                    st          S | j        |j        k    rt	          | d|d          | j        |j        k    r| j        |j        k     S | j        |j        k    r| j        |j        k     S dS r   )rJ   rq   rt   rf   rL   ri   netmaskr   s     r   r   z_BaseNetwork.__lt__  s    %.. 	"!!=EN**!TT555* + + +5#888'%*???<5=((<%-//ur   c                     	 | j         |j         k    o9| j        |j        k    o)t          | j                  t          |j                  k    S # t          $ r
 t
          cY S w xY wrW   )rf   ri   r   r  rh   rt   r   s     r   r   z_BaseNetwork.__eq__  su    	"MU^3 <(E,AA<%%U]););;=  	" 	" 	"!!!!	"s   A	A A A c                 n    t          t          | j                  t          | j                  z            S rW   )r   r   ri   r  r{   s    r   r   z_BaseNetwork.__hash__  s*    C,--DL0A0AABBBr   c                     | j         |j         k    rdS t          |t                    rdS |j        | j        j        z  | j        j        k    S NF)rf   rJ   rq   r9   r  ri   r   s     r   __contains__z_BaseNetwork.__contains__  sM    =EN**5e\** 	L5 9t|//43G3KKKr   c                 L    	 | j         |v p| j        |v p|j         | v p|j        | v S rW   ri   r_   r   s     r   overlapsz_BaseNetwork.overlaps  sE    8#u, 7"e+ 6%- 5+t3	7r   c                 z    |                      t          | j                  t          | j                  z            S rW   )r   r   ri   hostmaskr{   s    r   r_   z_BaseNetwork.broadcast_address  s9    ""3t';#<#<#&t}#5#5$6 7 7 	7r   c                 `    |                      t          | j                  | j        z            S rW   )r   r   r  rO   r{   s    r   r  z_BaseNetwork.hostmask  s'    ""3t|#4#4t~#EFFFr   c                 $    d| j         | j        fz  S r   )ri   rg   r{   s    r   with_prefixlenz_BaseNetwork.with_prefixlen  s    $.@@@r   c                 $    | j         d| j        S Nr-   )ri   r  r{   s    r   with_netmaskz_BaseNetwork.with_netmask  s    ...==r   c                 $    | j         d| j        S r  )ri   r  r{   s    r   with_hostmaskz_BaseNetwork.with_hostmask  s    ...>>r   c                 \    	 t          | j                  t          | j                  z
  dz   S r5   )r   r_   ri   r{   s    r   num_addressesz_BaseNetwork.num_addresses  s+    44)**S1E-F-FFJJr   c                 F    dt          |           fz  }t          |          )Nz%%200s has no associated address classr   r   s     r   r   z_BaseNetwork._address_class  s$    
 6dE!#&&&r   c                     | j         S rW   )rg   r{   s    r   r   z_BaseNetwork.prefixlen  s
    r   c              #     K   	 | j         |j         k    st          | d|d          t          |t                    st          d|z            |                    |           st          |d|           || k    rd S |                    |j        d|j                  }| 	                                \  }}||k    r||k    r|                    |          r|V  |	                                \  }}nI|                    |          r|V  |	                                \  }}nt          d|d|d|          ||k    r||k    ||k    r|V  d S ||k    r|V  d S t          d|d|d|          )	NrG   rH   z%s is not a network objectz not contained in r-   z Error performing exclusion: s1: z s2: z other: )rf   rL   rJ   rq   	subnet_ofr   r   ri   r   ra   AssertionError)r|   r   s1s2s       r   address_excludez_BaseNetwork.address_exclude  s     "	F }..!TT555* + + + %.. 	B85@AAAt$$ 	GEFFFD==F 5+@+@+@+0??!< = = BEkkbEkkr"" 
6BB$$ 6BB %n&(bb"""ee&5 6 6 6 EkkbEkk ;;HHHHH5[[HHHHH !."$""bbb%%"1 2 2 2r   c                     	 | j         |j         k    rt          | d|d          | j        |j        k     rdS | j        |j        k    rdS | j        |j        k     rdS | j        |j        k    rdS dS )NrG   z are not of the same typere   r6   r   )rf   rL   ri   r  r   s     r   compare_networksz_BaseNetwork.compare_networksg  s    	@ =EN**!TT555* + + + %"7772%"7771<%-''2<%-''1qr   c                 ,    	 | j         | j        | j        fS rW   )rf   ri   r  r{   s    r   rr   z_BaseNetwork._get_networks_key  s    	 t3T\BBr   r6   Nc              #     K   	 | j         | j        k    r| V  d S |9|| j         k     rt          d          |dk    rt          d          || j         z
  }|dk     rt          d          | j         |z   }|| j        k    rt          d|| fz            t          | j                  }t          | j                  dz   }t          | j                  dz   |z	  }t          |||          D ]}|                     ||f          }|V  d S )Nznew prefix must be longerr6   (cannot set prefixlen_diff and new_prefixr   zprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s)	rg   rN   r   r   ri   r_   r  r   r   )	r|   prefixlen_diff
new_prefixnew_prefixlenstartendstepnew_addrcurrents	            r   ra   z_BaseNetwork.subnets  sR     	2 ?d111JJJF!DO++ !<==="" !KLLL'$/9NA=>>>.84...B!4F) )* * * D())$())A-DM""Q&>9eS$// 	 	Hnnh%>??GMMMM	 	r   c                 h   	 | j         dk    r| S |9|| j         k    rt          d          |dk    rt          d          | j         |z
  }| j        |z
  }|dk     rt          d| j        |fz            |                     t	          | j                  t	          | j                  |z  z  |f          S )Nr   znew prefix must be shorterr6   r"  z;current prefixlen is %d, cannot have a prefixlen_diff of %d)rg   r   r   r   r   ri   r  )r|   r#  r$  r%  s       r   rZ   z_BaseNetwork.supernet  s    	( ?aK!DO++ !=>>>"" !KLLL!_z9N71M012 2 2 ~~$%%T\):):n)LM   	r   c                 4    	 | j         j        o| j        j        S rW   )ri   is_multicastr_   r{   s    r   r-  z_BaseNetwork.is_multicast  s%    	 $1 4&3	5r   c                     	 | j         |j         k    rt          |  d| d          |j        | j        k    o|j        | j        k    S # t          $ r t          d|  d|           w xY w)NrG   rH   z*Unable to test subnet containment between )rf   rL   ri   r_   rh   )ar   s     r   _is_subnet_ofz_BaseNetwork._is_subnet_of  s    	4zQZ''1 J J1 J J JKKK%):: ?'1+>>@ 	4 	4 	4 3'(3 3/03 3 4 4 4	4s   AA  A'c                 0    	 |                      | |          S rW   r0  r   s     r   r  z_BaseNetwork.subnet_of  s    ?!!$...r   c                 0    	 |                      ||           S rW   r2  r   s     r   supernet_ofz_BaseNetwork.supernet_of  s    A!!%...r   c                 4    	 | j         j        o| j        j        S rW   )ri   is_reservedr_   r{   s    r   r6  z_BaseNetwork.is_reserved  %    	 $0 3&2	4r   c                 4    	 | j         j        o| j        j        S rW   )ri   is_link_localr_   r{   s    r   r9  z_BaseNetwork.is_link_local+  s%    	 $2 5&4	6r   c                      	 t           fd j        j        D                       o$t           fd j        j        D                       S )Nc              3   <   K   | ]}j         |v oj        |v V  d S rW   r  ).0priv_networkr|   s     r   	<genexpr>z*_BaseNetwork.is_private.<locals>.<genexpr>?  sW       J J# '<7 :)\9J J J J J Jr   c              3   <   K   | ]}j         |voj        |vV  d S rW   r  )r<  r   r|   s     r   r>  z*_BaseNetwork.is_private.<locals>.<genexpr>A  sY       R R   (7 :*'9R R R R R Rr   any
_constants_private_networksall_private_networks_exceptionsr{   s   `r   
is_privatez_BaseNetwork.is_private6  s    	  J J J J'+'HJ J J J J NQ R R R R $(?#OR R R O O	r   c                     	 | j          S rW   )rF  r{   s    r   	is_globalz_BaseNetwork.is_globalG  s    	 ?""r   c                 4    	 | j         j        o| j        j        S rW   )ri   is_unspecifiedr_   r{   s    r   rJ  z_BaseNetwork.is_unspecifiedR  s%    	 $3 6&5	7r   c                 4    	 | j         j        o| j        j        S rW   )ri   is_loopbackr_   r{   s    r   rL  z_BaseNetwork.is_loopback^  r7  r   )r6   N)(r   r	   r
   r   r   r   r   r   r   r   r   r  r	  	functoolscached_propertyr_   r  r   r  r  r  r  r   r   r  r  rr   ra   rZ   r-  staticmethodr0  r  r4  r6  r9  rF  rH  rJ  rL  r   r   r   rq   rq     s       ? ? ?@ @ @
) 
) 
)) ) )6 6 6
 
 
" " "C C C
L 
L 
L7 7 7 7 7 7 G G G A A XA > > X> ? ? X? K K XK ' ' X'   XI2 I2 I2V. . .`C C C3 3 3 3j' ' ' 'R 	5 	5 X	5 	4 	4 \	4/ / // / / 	4 	4 X	4 6 6 X6   X  # # X# 	7 	7 X	7 	4 	4 X	4 	4 	4r   rq   c                       e Zd Zg ZdS )_BaseConstantsN)r   r	   r
   rC  r   r   r   rQ  rQ  k  s        r   rQ  c                       e Zd Z	 dZdZdez  dz
  ZeZi Zd Z	e
d             Ze
d             Ze
d             Ze
d	             Zd
 Zed             Zed             ZdS )_BaseV4r   r#   r.   r6   c                      t          |           S rW   r   r{   s    r   rz   z$_BaseV4._explode_shorthand_ip_string  s    4yyr   c                    	 || j         vrt          |t                    r,|}d|cxk    r| j        k    sn |                     |           n<	 |                     |          }n%# t          $ r |                     |          }Y nw xY wt          | 	                    |                    }||f| j         |<   | j         |         S r   )
_netmask_cacherJ   r   rN   r   r   r   r   r   r   r   argr   r  s       r   _make_netmaskz_BaseV4._make_netmask  s    	 c(((#s## @	Y<<<<#*<<<<<//	:::@ # > >s C CII( @ @ @ !$ : :3 ? ?III@ "#"9"9)"D"DEEG&-y&8Cs#!#&&s   A# #BBc                 F   	 |st          d          |                    d          }t          |          dk    rt          d|z            	 t                              t          | j        |          d          S # t          $ r}t          |d|          d d }~ww xY w)NAddress cannot be empty.r#   zExpected 4 octets in %rr    in )r   r0   r1   r   
from_bytesmap_parse_octetr   )r   r   octetsexcs       r   r   z_BaseV4._ip_int_from_string  s    	  	?#$=>>>c""v;;!#$=$FGGG	J>>#c&6"?"?GGG 	J 	J 	J####vv$>??TI	Js   -A< <
B BB c                    	 |st          d          |                                r|                                sd}t          ||z            t          |          dk    rd}t          ||z            |dk    r |d         dk    rd}t          ||z            t	          |d          }|d	k    rt          d
|z            |S )NzEmpty octet not permittedz#Only decimal digits permitted in %r   z$At most 3 characters permitted in %rr   r   z%Leading zeros are not permitted in %r
      zOctet %d (> 255) not permitted)r   r   r   r1   r   )r   	octet_strr   	octet_ints       r   r`  z_BaseV4._parse_octet  s    	  	:8999!!## 	.	(9(9(;(; 	.7CS9_--- y>>A8CS9_--- 	! 3 39CS9_---	2&&	s??=	IJJJr   c           	      |    	 d                     t          t          |                    dd                              S )Nr\  r#   r   )joinr_  r/   r%   )r   r   s     r   r   z_BaseV4._string_from_ip_int  s3    	 xxCE!:!:;;<<<r   c                     	 t          |                               d          d d d         }d                    |          dz   S )Nr\  re   z.in-addr.arpa)r/   r0   rj  )r|   reverse_octetss     r   r   z_BaseV4._reverse_pointer  sB    	
 T--ddd3xx''/99r   c                     | j         S rW   rN   r{   s    r   max_prefixlenz_BaseV4.max_prefixlen      ""r   c                     | j         S rW   r   r{   s    r   rM   z_BaseV4.version  
    }r   N)r   r	   r
   r   rf   
IPV4LENGTHrO   rN   rV  rz   r   rY  r   r`  r   r   r   ro  rM   r   r   r   rS  rS  s  s        IHJ!#IN N   ' ' ['2 J J [J2 ! ! [!F 
= 
= [
=: : : # # X#   X  r   rS  c                      e Zd Z	 dZd Zed             Zed             Ze ej	                    d                         Z
e ej	                    d                         Zed             Zed             Zed	             Zed
             ZdS )r   )r9   __weakref__c                    	 t          |t                    r|                     |           || _        d S t          |t                    r7|                     |d           t                              |          | _        d S t          |          }d|v rt          d|          | 	                    |          | _        d S )Nr#   r-   Unexpected '/' in )
rJ   r   r   r9   r   r   r^  r/   r   r   r|   r   addr_strs      r   __init__zIPv4Address.__init__  s    	 gs## 	##G,,,DHF gu%% 	&&w222~~g..DHF w<<(??#$D$D$DEEE++H55r   c                 ,    	 t          | j                  S rW   )r'   r9   r{   s    r   packedzIPv4Address.packed)      8)))r   c                      	 | | j         j        v S rW   )rB  _reserved_networkr{   s    r   r6  zIPv4Address.is_reserved.  s    	 t888r   c                      	 t           fd j        j        D                       o$t           fd j        j        D                       S )Nc              3       K   | ]}|v V  	d S rW   r   r<  rT   r|   s     r   r>  z)IPv4Address.is_private.<locals>.<genexpr>K  '      IIIIIIIIr   c              3       K   | ]}|vV  	d S rW   r   r  s     r   r>  z)IPv4Address.is_private.<locals>.<genexpr>L  '      \\DO\\\\\\r   r@  r{   s   `r   rF  zIPv4Address.is_private9  s_    	 IIIIt'HIIIII ]\\\\t/[\\\\\	
r   c                 0    	 | | j         j        vo| j         S rW   )rB  _public_networkrF  r{   s    r   rH  zIPv4Address.is_globalO  s#    	 4?::R4??RRr   c                      	 | | j         j        v S rW   )rB  _multicast_networkr{   s    r   r-  zIPv4Address.is_multicasta  s    	 t999r   c                 $    	 | | j         j        k    S rW   )rB  _unspecified_addressr{   s    r   rJ  zIPv4Address.is_unspecifiedl  s    	 t;;;r   c                      	 | | j         j        v S rW   )rB  _loopback_networkr{   s    r   rL  zIPv4Address.is_loopbackw  s    	 t888r   c                      	 | | j         j        v S rW   )rB  _linklocal_networkr{   s    r   r9  zIPv4Address.is_link_local  s    	 t999r   N)r   r	   r
   r   rz  r   r|  r6  rM  	lru_cacherF  rH  r-  rJ  rL  r9  r   r   r   r   r      s3       9&I!6 !6 !6F * * X* 9 9 X9 Y
 
  X
( YS S  XS  : : X: < < X< 9 9 X9 : : X: : :r   r   c                       e Zd Zd Zej        d             Zd Zd Zd Z	d Z
ej        Zed             Zed             Zed	             Zed
             ZdS )r   c                     |                      |          \  }}t                              | |           t          ||fd          | _        | j        j        | _        | j        j        | _        d S NF)r   )r   r   rz  r   r   r  rg   r|   r   r2   masks       r   rz  zIPv4Interface.__init__  c    ,,W55
dT4((("D$<>>>|+,1r   c                     | j         j        S rW   r   r  r{   s    r   r  zIPv4Interface.hostmask      |$$r   c                 J    d|                      | j                  | j        fz  S r   r   r9   rg   r{   s    r   r   zIPv4Interface.__str__  s+    $2248<</+ + 	+r   c                     t                               | |          }|t          u s|s|S 	 | j        |j        k    S # t          $ r Y dS w xY wr  )r   r   rt   r   rh   r|   r   address_equals      r   r   zIPv4Interface.__eq__  e    #**477N**-*  	<5=00 	 	 	 55		   : 
AAc                     t                               | |          }|t          u rt          S 	 | j        |j        k     p| j        |j        k    o|S # t          $ r Y dS w xY wr  )r   r   rt   r   rh   r|   r   address_lesss      r   r   zIPv4Interface.__lt__  sz    "))$66>))!!	L5=0 CLEM1BlD 	 	 	 55	s   !A 
AAc                 h    t          | j        | j        t          | j        j                  f          S rW   r   r9   rg   r   r   ri   r{   s    r   r   zIPv4Interface.__hash__  (    TXtDL4P0Q0QRSSSr   c                 *    t          | j                  S rW   )r   r9   r{   s    r   r>   zIPv4Interface.ip      48$$$r   c                 J    |                      | j                  d| j        S r  r  r{   s    r   r  zIPv4Interface.with_prefixlen  ,    2248<<<<//+ 	+r   c                 J    |                      | j                  d| j        S r  r   r9   r  r{   s    r   r  zIPv4Interface.with_netmask  ,    2248<<<<,,( 	(r   c                 J    |                      | j                  d| j        S r  r   r9   r  r{   s    r   r  zIPv4Interface.with_hostmask  ,    2248<<<<--) 	)r   N)r   r	   r
   rz  rM  rN  r  r   r   r   r   rx   r   r   r>   r  r  r  r   r   r   r   r     s        2 2 2 % % %+ + +
 
 

 
 
T T T  *J% % X% + + X+ ( ( X( ) ) X) ) )r   r   c                   \    e Zd Z	 eZddZe ej                    d                         Z	dS )r   Tc                    	 |                      |          \  }t                    | _        |                     |          \  | _        | _        t          | j                  }|t          | j                  z  |k    r=|rt          d| z            t          |t          | j                  z            | _        | j        | j        dz
  k    r| j	        | _
        d S | j        | j        k    rfd| _
        d S d S )N%s has host bits setr6   c                  $    t                     gS rW   )r   r2   s   r   <lambda>z&IPv4Network.__init__.<locals>.<lambda>      +d"3"3!4 r   )r   r   ri   rY  r  rg   r   r   rN   r   r   r|   r   r   r  r|  r2   s        @r   rz  zIPv4Network.__init__  s   !	D ,,W55
d*400(,(:(:4(@(@%doT)**C%%%// F !7$!>???'2636t|3D3D4E (F (F$ ?t2Q677DJJJ_!4554444DJJJ 65r   c                 n    	 | j         t          d          v o| j        t          d          v  o| j         S )N100.64.0.0/10)ri   r   r_   rF  r{   s    r   rH  zIPv4Network.is_global  sM    	 )[-I-II K*k/.J.JJL $O#	%r   NT)
r   r	   r
   r   r   rz  r   rM  r  rH  r   r   r   r   r     sf        	 !N25 25 25 25h Y
% 
%  X
% 
% 
%r   r   c                      e Zd Z ed          Z ed          Z ed          Z ed          Z ed           ed           ed           ed           ed           ed           ed	           ed
           ed           ed           ed           ed           ed           ed          gZ ed           ed          gZ	 ed          Z
 ed          ZdS )_IPv4Constantsz169.254.0.0/16z127.0.0.0/8z224.0.0.0/4r  z	0.0.0.0/8z
10.0.0.0/8z172.16.0.0/12z192.0.0.0/24z192.0.0.170/31z192.0.2.0/24z192.168.0.0/16z198.18.0.0/15z198.51.100.0/24z203.0.113.0/24z240.0.0.0/4z255.255.255.255/32z192.0.0.9/32z192.0.0.10/32z0.0.0.0N)r   r	   r
   r   r  r  r  r  rC  rE  r  r   r  r   r   r   r  r  !  s\       $%566#M22$]33!k/22O
 	K  L!!M""$%%O$$N##$%%N##$%%O$$%&&$%%M""())
$ 	N##O$$$ 
 $M22&;y11r   r  c                      e Zd Z	 dZdZdez  dz
  ZdZ ed          Z	eZ
i Zed             Zed             Zed	             Zed
             Zedd            Zd Zd Zed             Zed             Zed             ZdS )_BaseV6r   rI   r.   r6   r   0123456789ABCDEFabcdefc                 8   	 || j         vrt          |t                    r,|}d|cxk    r| j        k    sn |                     |           n|                     |          }t          |                     |                    }||f| j         |<   | j         |         S r   )rV  rJ   r   rN   r   r   r   r   rW  s       r   rY  z_BaseV6._make_netmask_  s    	 c(((#s## @	Y<<<<#*<<<<<//	:::::3??	!#"9"9)"D"DEEG&-y&8Cs#!#&&r   c                    	 |st          d          |                    d          }d}t          |          |k     rd||fz  }t          |          d|d         v r	 t          |                                          j        }n'# t           $ r}t          |d|          d d }~ww xY w|                    d|d	z	  d
z  z             |                    d|d
z  z             | j        dz   }t          |          |k    rd|dz
  |fz  }t          |          d }t          dt          |          dz
            D ]"}	||	         s|d|z  }t          |          |	}#||}
t          |          |z
  dz
  }|d         s|
dz  }
|
rd}t          ||z            |d         s|dz  }|rd}t          ||z            | j        |
|z   z
  }|dk     rd}t          || j        dz
  |fz            n~t          |          | j        k    rd}t          || j        |fz            |d         sd}t          ||z            |d         sd}t          ||z            t          |          }
d}d}	 d}t          |
          D ]%}	|d	z  }|| 	                    ||	                   z  }&|d	|z  z  }t          | d          D ]%}	|d	z  }|| 	                    ||	                   z  }&|S # t          $ r}t          |d|          d d }~ww xY w)Nr[  :rd  z At least %d parts expected in %rr\  re   r]  %xr*     r6   z!At most %d colons permitted in %rz At most one '::' permitted in %rr   z0Leading ':' only permitted as part of '::' in %rz1Trailing ':' only permitted as part of '::' in %rz/Expected at most %d other parts with '::' in %rz,Exactly %d parts expected without '::' in %r)r   r0   r1   r   rY   r9   r\   _HEXTET_COUNTr   _parse_hextetr   )r   r   parts
_min_partsr   ipv4_intrb  
_max_parts
skip_indexiparts_hiparts_loparts_skippedr   s                 r   r   z_BaseV6._ip_int_from_strings  s   	  	?#$=>>>S!! 
u::
""4
F7KKC#C((( %)N&uyy{{337$ N N N'ccc66(BCCMNLL(b.F!:;<<<LLF!23444
 &*
u::
""5Av8NNC#C((( 
q#e**q.)) 	 	A8 )<vEC+C000
 !!H5zzJ.2H8 :A :LC+C&L9999 :A :MC+C&L999-H1DEMq  G's/@/BF.K(KLLL ! 5zzS...D's/@&.I(IJJJ8 6H'f5559 6I'f5555zzHHM	JF8__ 6 62#++E!H555rM))FH9a(( 6 62#++E!H555M 	J 	J 	J####vv$>??TI	Js1   &B 
B)B$$B)0A7K( (
L2LLc                     	 | j                             |          st          d|z            t          |          dk    rd}t          ||z            t	          |d          S )NzOnly hex digits permitted in %rr#   z$At most 4 characters permitted in %rr*   )_HEX_DIGITS
issupersetr   r1   r   )r   
hextet_strr   s      r   r  z_BaseV6._parse_hextet  sq    	 ))*55 	M>KLLL z??Q8CS:-...:r"""r   c                     	 d}d}d}d}t          |          D ]'\  }}|dk    r|dz  }|dk    r|}||k    r|}|}#d}d}(|dk    r2||z   }|t          |          k    r|dgz  }dg|||<   |dk    rdg|z   }|S )Nre   r   r   r6    )	enumerater1   )	r   hextetsbest_doublecolon_startbest_doublecolon_lendoublecolon_startdoublecolon_lenindexhextetbest_doublecolon_ends	            r   _compress_hextetsz_BaseV6._compress_hextets  s    	 "$ &w// 	' 	'ME6}}1$$**(-%"%999+:(->*"#$&!!!##$:$8%9  $s7||33B4DF4G*+??@%**$.r   Nc                     	 |t          | j                  }|| j        k    rt          d          d|z  fdt	          ddd          D             }|                     |          }d                    |          S )NzIPv6 address is too large%032xc           	      L    g | ] }d t          ||dz            d          z  !S )r  r#   r*   )r   r<  r   hex_strs     r   
<listcomp>z/_BaseV6._string_from_ip_int.<locals>.<listcomp>:  s4    KKKa4#ga!enb111KKKr   r   r   r#   r  )r   r9   rO   r   r   r  rj  )r   r   r  r  s      @r   r   z_BaseV6._string_from_ip_int%  s    	 >\\FCM!!8999F"KKKK5B??KKK''00xx   r   c                    	 t          | t                    rt          | j                  }n9t          | t                    rt          | j                  }nt          |           }|                     |          }d|z  fdt          ddd          D             }t          | t          t          f          rdd	                    |          | j
        fz  S d	                    |          S )Nr  c                 *    g | ]}||d z            S )r#   r   r  s     r   r  z8_BaseV6._explode_shorthand_ip_string.<locals>.<listcomp>O  s%    999A1Q3999r   r   r   r#   r   r  )rJ   r   r/   ri   r    r>   r   r   rq   rj  rg   )r|   r   r   r  r  s       @r   rz   z$_BaseV6._explode_shorthand_ip_string?  s    	 dK(( 	-..FFm,, 	\\FFYYF))&11F"9999q"a999d\=9:: 	@chhuoot???xxr   c                 |    	 | j         d d d                             dd          }d                    |          dz   S )Nre   r  r  r\  z	.ip6.arpa)r}   replacerj  )r|   reverse_charss     r   r   z_BaseV6._reverse_pointerT  sB    	
 ddd+33C<<xx&&44r   c                 x    	 |                      d          \  }}}|sd }n|rd|v rt          d| z            ||fS )N%zInvalid IPv6 address: "%r")	partitionr   )r   r2   sepscope_ids       r   _split_scope_idz_BaseV6._split_scope_id]  sb    
	 %..s33c8 	KHH 	KSH__#$@6$IJJJX~r   c                     | j         S rW   rn  r{   s    r   ro  z_BaseV6.max_prefixlenq  rp  r   c                     | j         S rW   r   r{   s    r   rM   z_BaseV6.versionu  rr  r   rW   )r   r	   r
   r   rf   
IPV6LENGTHrO   r  	frozensetr  rN   rV  r   rY  r   r  r  r   rz   r   rO  r  r   ro  rM   r   r   r   r  r  K  sU        IHJ!#IM)455KN N' ' ['& eJ eJ [eJN # # [#2 - - [-^ ! ! ! [!2  *5 5 5   \& # # X#   X  r   r  c                       e Zd Z	 dZd Z fdZd Z fdZd Ze	d             Z
e	d             Ze	d	             Ze	d
             Ze	d             Ze	d             Ze	 ej                    d                         Ze	d             Ze	d             Ze	d             Ze	d             Ze	d             Ze	d             Z xZS )r   )r9   	_scope_idru  c                    	 t          |t                    r%|                     |           || _        d | _        d S t          |t
                    r?|                     |d           t                              |d          | _        d | _        d S t          |          }d|v rt          d|          | 
                    |          \  }| _        |                     |          | _        d S )Nr*   r   r-   rw  )rJ   r   r   r9   r  r   r   r^  r/   r   r  r   rx  s      r   rz  zIPv6Address.__init__  s    	" gs## 	##G,,,DH!DNF gu%% 	&&w333~~gu55DH!DNF w<<(??#$D$D$DEEE#'#7#7#A#A $.++H55r   c                 p    t                                                      }| j        r|dz   | j        z   n|S )Nr  )r   r   r  )r|   r   r   s     r   r   zIPv6Address.__str__  s3    ""04Jv|dn,,FJr   c                 8    t          | j        | j        f          S rW   )r   r9   r  r{   s    r   r   zIPv6Address.__hash__  s    TXt~.///r   c                     t                                          |          }|t          u rt          S |sdS | j        t	          |dd           k    S )NFr  )r   r   rt   r  getattr)r|   r   r  r   s      r   r   zIPv6Address.__eq__  sO    u--N**!! 	5~T!B!BBBr   c                 0    | j         t          |           ffS rW   r   r{   s    r   r   zIPv6Address.__reduce__  s    T--r   c                     	 | j         S rW   )r  r{   s    r   r  zIPv6Address.scope_id  s    	 ~r   c                 ,    	 t          | j                  S rW   )r+   r9   r{   s    r   r|  zIPv6Address.packed  r}  r   c                 @    	 | j         }||j        S | | j        j        v S rW   )ipv4_mappedr-  rB  r  r|   r  s     r   r-  zIPv6Address.is_multicast  s0    	 &"++t999r   c                 p     	  j         }||j        S t           fd j        j        D                       S )Nc              3       K   | ]}|v V  	d S rW   r   )r<  r   r|   s     r   r>  z*IPv6Address.is_reserved.<locals>.<genexpr>  s'      II419IIIIIIr   )r  r6  rA  rB  _reserved_networksr  s   ` r   r6  zIPv6Address.is_reserved  sI    	 &"**IIIIdo&HIIIIIIr   c                 @    	 | j         }||j        S | | j        j        v S rW   )r  r9  rB  r  r  s     r   r9  zIPv6Address.is_link_local  s0    	 &",,t999r   c                      	 | | j         j        v S rW   )rB  _sitelocal_networkr{   s    r   is_site_localzIPv6Address.is_site_local  s    		 t999r   c                      	  j         }||j        S t           fd j        j        D                       o$t           fd j        j        D                       S )Nc              3       K   | ]}|v V  	d S rW   r   r  s     r   r>  z)IPv6Address.is_private.<locals>.<genexpr>  r  r   c              3       K   | ]}|vV  	d S rW   r   r  s     r   r>  z)IPv6Address.is_private.<locals>.<genexpr>  r  r   )r  rF  rA  rB  rC  rD  rE  r  s   ` r   rF  zIPv6Address.is_private  sv    	 &"))IIIIt'HIIIII ]\\\\t/[\\\\\	
r   c                 4    	 | j         }||j        S | j         S rW   )r  rH  rF  r  s     r   rH  zIPv6Address.is_global  s+    	 &"((?""r   c                 :    	 | j         }||j        S | j        dk    S r   )r  rJ  r9   r  s     r   rJ  zIPv6Address.is_unspecified/  s,    	 &"--x1}r   c                 :    	 | j         }||j        S | j        dk    S r5   )r  rL  r9   r  s     r   rL  zIPv6Address.is_loopback=  s,    	 &"**x1}r   c                 R    	 | j         dz	  dk    rd S t          | j         dz            S )Nr   r      r9   r   r{   s    r   r  zIPv6Address.ipv4_mappedK  s4    	 HNv%%448j0111r   c                     	 | j         dz	  dk    rd S t          | j         dz	  dz            t          | j          dz            fS )N`   i   @   r  r  r{   s    r   teredozIPv6Address.teredoX  sS    	 HNz))4TX^z9::TXI
2335 	5r   c                 X    	 | j         dz	  dk    rd S t          | j         dz	  dz            S )Np   i   P   r  r  r{   s    r   	sixtofourzIPv6Address.sixtofourg  s8    	 HO&&4DHNj8999r   )r   r	   r
   r   rz  r   r   r   r   r   r  r|  r-  r6  r9  r	  rM  r  rF  rH  rJ  rL  r  r  r  r   r   s   @r   r   r   z  s	       93I&6 &6 &6PK K K K K0 0 0C C C C C. . . 	 	 X	 * * X* : : X: J J XJ 
: 
: X
: : : X: Y
 
  X
. # # X#&   X   X 
2 
2 X
2 5 5 X5 
: 
: X
: 
: 
: 
: 
:r   r   c                        e Zd Zd Zej        d             Z fdZd Zd Z	d Z
ej        Zed             Zed             Zed	             Zed
             Zed             Ze fd            Z xZS )r    c                     |                      |          \  }}t                              | |           t          ||fd          | _        | j        j        | _        | j        j        | _        d S r  )r   r   rz  r   r   r  rg   r  s       r   rz  zIPv6Interface.__init__w  r  r   c                     | j         j        S rW   r  r{   s    r   r  zIPv6Interface.hostmask  r  r   c                 X    dt                                                      | j        fz  S r   )r   r   rg   r|   r   s    r   r   zIPv6Interface.__str__  s*    %''//++/+ + 	+r   c                     t                               | |          }|t          u s|s|S 	 | j        |j        k    S # t          $ r Y dS w xY wr  )r   r   rt   r   rh   r  s      r   r   zIPv6Interface.__eq__  r  r  c                     t                               | |          }|t          u r|S 	 | j        |j        k     p| j        |j        k    o|S # t          $ r Y dS w xY wr  )r   r   rt   r   rh   r  s      r   r   zIPv6Interface.__lt__  sz    "))$66>))	L5=0 CLEM1BlD 	 	 	 55	s   !A
 

AAc                 h    t          | j        | j        t          | j        j                  f          S rW   r  r{   s    r   r   zIPv6Interface.__hash__  r  r   c                 *    t          | j                  S rW   )r   r9   r{   s    r   r>   zIPv6Interface.ip  r  r   c                 J    |                      | j                  d| j        S r  r  r{   s    r   r  zIPv6Interface.with_prefixlen  r  r   c                 J    |                      | j                  d| j        S r  r  r{   s    r   r  zIPv6Interface.with_netmask  r  r   c                 J    |                      | j                  d| j        S r  r  r{   s    r   r  zIPv6Interface.with_hostmask  r  r   c                 0    | j         dk    o| j        j        S r   )r9   r   rJ  r{   s    r   rJ  zIPv6Interface.is_unspecified  s    x1}<!<<r   c                 B    t                      j        o| j        j        S rW   )r   rL  r   r  s    r   rL  zIPv6Interface.is_loopback  s    ww"?t|'??r   )r   r	   r
   rz  rM  rN  r  r   r   r   r   rx   r   r   r>   r  r  r  rJ  rL  r   r   s   @r   r    r    u  sS       2 2 2 % % %+ + + + +
 
 

 
 
T T T  *J% % X% + + X+ ( ( X( ) ) X) = = X= @ @ @ @ X@ @ @ @ @r   r    c                   8    e Zd Z	 eZddZd Zed             ZdS )r   Tc                    	 |                      |          \  }t                    | _        |                     |          \  | _        | _        t          | j                  }|t          | j                  z  |k    r=|rt          d| z            t          |t          | j                  z            | _        | j        | j        dz
  k    r| j	        | _
        d S | j        | j        k    rfd| _
        d S d S )Nr  r6   c                  $    t                     gS rW   )r   r  s   r   r  z&IPv6Network.__init__.<locals>.<lambda>  r  r   )r   r   ri   rY  r  rg   r   r   rN   r   r   r  s        @r   rz  zIPv6Network.__init__  s   	< ,,W55
d*400(,(:(:4(@(@%doT)**C%%%// F !7$!>???'2636t|3D3D4E (F (F$ ?t2Q677DJJJ_ 3334444DJJJ 43r   c              #      K   	 t          | j                  }t          | j                  }t          |dz   |dz             D ]}|                     |          V  d S r5   r   r   s       r   r   zIPv6Network.hosts 	  su      	 d*++.//	w{IM22 	) 	)A%%a((((((	) 	)r   c                 4    	 | j         j        o| j        j        S rW   )ri   r	  r_   r{   s    r   r	  zIPv6Network.is_site_local	  s%    		 $2 5&4	6r   Nr  )	r   r	   r
   r   r   rz  r   r   r	  r   r   r   r   r     s_        	 !N.5 .5 .5 .5`
) 
) 
) 6 6 X6 6 6r   r   c                      e Zd Z ed          Z ed          Z ed           ed           ed           ed           ed           ed           ed	           ed
           ed           ed           ed          gZ ed           ed           ed           ed           ed           ed          gZ ed           ed           ed           ed           ed           ed           ed           ed           ed           ed           ed           ed           ed           ed            ed!          gZ ed"          Z	d#S )$_IPv6Constantsz	fe80::/10zff00::/8z::1/128z::/128z::ffff:0:0/96z64:ff9b:1::/48z100::/64z	2001::/23z2001:db8::/32z	2002::/16z	3fff::/20zfc00::/7z2001:1::1/128z2001:1::2/128z2001:3::/32z2001:4:112::/48z2001:20::/28z2001:30::/28z::/8z100::/8z200::/7z400::/6z800::/5z1000::/4z4000::/3z6000::/3z8000::/3zA000::/3zC000::/3zE000::/4zF000::/5zF800::/6zFE00::/9z	fec0::/10N)
r   r	   r
   r   r  r  rC  rE  r  r  r   r   r   r/  r/  	  s       $[11$Z00
 	IHO$$$%%JK  O$$K  K  JK  
" 	O$$O$$M""%&&N##N##$  	F[[33II 6 6IJ 7 7JZ!8!8JZ!8!8JZ!8!8JZ!8!8J	 %[11r   r/  r  )$__version__rM  rs  r  r   r   r   r   r   r!   r'   r+   r3   r?   rE   rU   rc   ro   rv   rx   r   total_orderingrK   rq   rQ  rB  rS  r   r   r   r  r  r   r    r   r/  r   r   r   <module>r2     s`       

0 0 0 0 0
 0 0 00 0 0 0 0
 0 0 0S S S:S S S S:U U UDC C C(C C C     (: : : 4 4 4n. . .b36 36 36l  2o, o, o, o, o, o, o, o,d 
hN hN hN hN hN> hN hN hNV H4 H4 H4 H4 H4> H4 H4 H4V       
 ) J J J J J J J JZI: I: I: I: I:'< I: I: I:X@) @) @) @) @)K @) @) @)FO% O% O% O% O%'< O% O% O%d#2 #2 #2 #2 #2 #2 #2 #2L ( ' l l l l l l l l^	x: x: x: x: x:'< x: x: x:vH@ H@ H@ H@ H@K H@ H@ H@VY6 Y6 Y6 Y6 Y6'< Y6 Y6 Y6x,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2^ ( '   r   