a
    zet#                    @   s  d Z ddlZdZdZG dd deZG dd deZd	d
 Zd<ddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! ZG d"d# d#ZdaejG d$d% d%eZejG d&d' d'eZG d(d) d)ZG d*d+ d+eeZG d,d- d-eZG d.d/ d/eeZG d0d1 d1Zee_G d2d3 d3ZG d4d5 d5eeZG d6d7 d7eZ G d8d9 d9eeZ!G d:d; d;Z"e"e_dS )=z1.0    N       c                   @   s   e Zd ZdS )AddressValueErrorN__name__
__module____qualname__ r	   r	   /usr/lib/python3.9/ipaddress.pyr      s   r   c                   @   s   e Zd ZdS )NetmaskValueErrorNr   r	   r	   r	   r
   r      s   r   c              	   C   sV   z
t | W S  ttfy    Y n0 z
t| W S  ttfyB   Y n0 t| dd S )Nz. does not appear to be an IPv4 or IPv6 address)IPv4Addressr   r   IPv6Address
ValueErroraddressr	   r	   r
   
ip_address   s    

r   Tc              	   C   sZ   zt | |W S  ttfy"   Y n0 zt| |W S  ttfyF   Y n0 t| dd S )Nz. does not appear to be an IPv4 or IPv6 network)IPv4Networkr   r   IPv6Networkr   )r   strictr	   r	   r
   
ip_network8   s    r   c              	   C   sV   z
t | W S  ttfy    Y n0 z
t| W S  ttfyB   Y n0 t| dd S )Nz0 does not appear to be an IPv4 or IPv6 interface)IPv4Interfacer   r   IPv6Interfacer   r   r	   r	   r
   ip_interfaceU   s    

r   c                 C   s.   z|  ddW S  ty(   tdY n0 d S )N   bigz&Address negative or too large for IPv4to_bytesOverflowErrorr   r   r	   r	   r
   v4_int_to_packedw   s    r   c                 C   s.   z|  ddW S  ty(   tdY n0 d S )N   r   z&Address negative or too large for IPv6r   r   r	   r	   r
   v6_int_to_packed   s    
r    c                 C   s,   t | d}t|dkr(td| |S )N/   zOnly one '/' permitted in )strsplitlenr   )r   addrr	   r	   r
   _split_optional_netmask   s    r'   c                 c   sN   t | }t| }}|D ]&}|j|jd kr:||fV  |}|}q||fV  d S N   )iternext_ip)	addressesitfirstlastipr	   r	   r
   _find_address_range   s    

r2   c                 C   s$   | dkr|S t ||  | d @  S )Nr   r)   )min
bit_length)Znumberbitsr	   r	   r
   _count_righthand_zero_bits   s    r6   c                 c   s   t | trt |tstd| j|jkr8td| |f | |krHtd| jdkrXt}n| jdkrht}ntd| j}| j}|j}||krt	t
|||| d  d }|||| f}|V  |d|> 7 }|d |jkrqqd S )Nz1first and last must be IP addresses, not networks%%s and %s are not of the same versionz*last IP address must be greater than firstr      zunknown IP versionr)   )
isinstance_BaseAddress	TypeErrorversionr   r   r   _max_prefixlenr,   r3   r6   r4   	_ALL_ONES)r/   r0   r1   Zip_bitsZ	first_intZlast_intZnbitsnetr	   r	   r
   summarize_address_range   s6    



r@   c                 c   s   t | }i }|rV| }| }||}|d u r<|||< q||kr||= || qd }t| D ]$}|d ur|j|jkrqf|V  |}qfd S N)listpopsupernetgetappendsortedvaluesbroadcast_address)r-   Zto_mergesubnetsr?   rD   Zexistingr0   r	   r	   r
   _collapse_addresses_internal   s$    

rK   c              	   C   s.  g }g }g }| D ]}t |trR|rF|d j|jkrFtd||d f || q|j|jkr|r|d j|jkrtd||d f z||j W q ty   ||j	 Y q0 q|r|d j|jkrtd||d f || qt
t|}|r"t|D ]\}}|t|| qt|| S )Nr7   )r9   r:   _versionr;   rF   
_prefixlenr=   r1   AttributeErrornetwork_addressrG   setr2   extendr@   rK   )r-   ZaddrsZipsZnetsr1   r/   r0   r	   r	   r
   collapse_addresses/  s:    
rS   c                 C   s(   t | tr|  S t | tr$|  S tS rA   )r9   _BaseNetwork_get_networks_keyr:   _get_address_keyNotImplemented)objr	   r	   r
   get_mixed_type_keye  s
    

rY   c                   @   s   e Zd ZdZedd Zedd Zedd Zedd	 Zd
d Z	dd Z
edd Zedd Zedd Zedd Zedd Zedd Zdd ZdS )_IPAddressBaser	   c                 C   s   |   S rA   )_explode_shorthand_ip_stringselfr	   r	   r
   exploded  s    z_IPAddressBase.explodedc                 C   s   t | S rA   r#   r\   r	   r	   r
   
compressed  s    z_IPAddressBase.compressedc                 C   s   |   S rA   )_reverse_pointerr\   r	   r	   r
   reverse_pointer  s    	z_IPAddressBase.reverse_pointerc                 C   s   dt | f }t|d S )Nz%200s has no version specifiedtypeNotImplementedErrorr]   msgr	   r	   r
   r<     s    z_IPAddressBase.versionc                 C   sF   |dk rd}t ||| jf || jkrBd}t ||| j| jf 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   rM   r>   r=   )r]   r   rg   r	   r	   r
   _check_int_address  s    

z!_IPAddressBase._check_int_addressc                 C   s.   t |}||kr*d}t||||| jf d S )Nz6%r (len %d != %d) is not permitted as an IPv%d address)r%   r   rM   )r]   r   Zexpected_lenZaddress_lenrg   r	   r	   r
   _check_packed_address  s    z$_IPAddressBase._check_packed_addressc                 C   s   | j | j |? A S rA   )r>   )cls	prefixlenr	   r	   r
   _ip_int_from_prefix  s    z"_IPAddressBase._ip_int_from_prefixc           	      C   s\   t || j}| j| }||? }d|> d }||krX| jd }||d}d}t|| |S )Nr)      r   z&Netmask pattern %r mixes zeroes & ones)r6   r=   r   r   )	rj   ip_intZtrailing_zeroesrk   Zleading_onesZall_onesZbyteslenZdetailsrg   r	   r	   r
   _prefix_from_ip_int  s    

z"_IPAddressBase._prefix_from_ip_intc                 C   s   d| }t |d d S )Nz%r is not a valid netmask)r   )rj   Znetmask_strrg   r	   r	   r
   _report_invalid_netmask  s    z&_IPAddressBase._report_invalid_netmaskc                 C   sj   |  r| s| | zt|}W n tyB   | | Y n0 d|  krZ| jksfn | | |S Nr   )isasciiisdigitrp   intr   r=   )rj   Zprefixlen_strrk   r	   r	   r
   _prefix_from_prefix_string  s    

z)_IPAddressBase._prefix_from_prefix_stringc                 C   s   z|  |}W n ty*   | | Y n0 z| |W S  tyJ   Y n0 || jN }z| |W S  ty~   | | Y n0 d S rA   )_ip_int_from_stringr   rp   ro   r   r>   )rj   ip_strrn   r	   r	   r
   _prefix_from_ip_string  s    
z%_IPAddressBase._prefix_from_ip_stringc                 C   sH   t |ttfr|| jfS t |ts*t|}t|dkr:|S |d | jfS )Nr)   r   )r9   bytesrt   r=   tupler'   r%   )rj   r   r	   r	   r
   _split_addr_prefix  s    

z!_IPAddressBase._split_addr_prefixc                 C   s   | j t| ffS rA   )	__class__r#   r\   r	   r	   r
   
__reduce__,  s    z_IPAddressBase.__reduce__N)r   r   r   	__slots__propertyr^   r`   rb   r<   rh   ri   classmethodrl   ro   rp   ru   rx   r{   r}   r	   r	   r	   r
   rZ   ~  s0   




	




!
rZ   c                       sp   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Z fddZ  ZS )r:   r	   c                 C   s   | j S rA   r,   r\   r	   r	   r
   __int__=  s    z_BaseAddress.__int__c                 C   s6   z| j |j ko| j|jkW S  ty0   t Y S 0 d S rA   )r,   rM   rO   rW   r]   otherr	   r	   r
   __eq__@  s    
z_BaseAddress.__eq__c                 C   sF   t |tstS | j|jkr*td| |f | j|jkrB| j|jk S dS Nr7   F)r9   r:   rW   rM   r;   r,   r   r	   r	   r
   __lt__G  s    
z_BaseAddress.__lt__c                 C   s    t |tstS | t| | S rA   r9   rt   rW   r|   r   r	   r	   r
   __add__S  s    
z_BaseAddress.__add__c                 C   s    t |tstS | t| | S rA   r   r   r	   r	   r
   __sub__X  s    
z_BaseAddress.__sub__c                 C   s   d| j jt| f S Nz%s(%r)r|   r   r#   r\   r	   r	   r
   __repr__]  s    z_BaseAddress.__repr__c                 C   s   t | | jS rA   )r#   _string_from_ip_intr,   r\   r	   r	   r
   __str__`  s    z_BaseAddress.__str__c                 C   s   t tt| jS rA   )hashhexrt   r,   r\   r	   r	   r
   __hash__c  s    z_BaseAddress.__hash__c                 C   s
   | j | fS rA   rM   r\   r	   r	   r
   rV   f  s    z_BaseAddress._get_address_keyc                 C   s   | j | jffS rA   )r|   r,   r\   r	   r	   r
   r}   i  s    z_BaseAddress.__reduce__c                    s   |r|d dkrt t| |S td u r8dd l}|dat|}|sRt |S | \}}}|dkr|| j	dkrxd}nd}|dkr| j
}n
| j
d }|r||d d	 7 }|r|d
7 }t t| | d| | | S )NrL   sr   z(#?)(_?)([xbnX])nr   bxr)   r"   0)formatr#   _address_fmt_rerecompile	fullmatchsuper
__format__groupsrM   r=   rt   )r]   fmtr   mZ	alternategroupingZfmt_baseZpadlenr|   r	   r
   r   l  s*    



z_BaseAddress.__format__)r   r   r   r~   r   r   r   r   r   r   r   r   rV   r}   r   __classcell__r	   r	   r   r
   r:   2  s   	r:   c                   @   s\  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zejdd Zejdd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zd%d& Zd'd( Zd)d* ZdEd-d.ZdFd/d0Zed1d2 Zed3d4 Zd5d6 Z d7d8 Z!ed9d: Z"ed;d< Z#ed=d> Z$ed?d@ Z%edAdB Z&edCdD Z'd,S )GrT   c                 C   s   d| j jt| f S r   r   r\   r	   r	   r
   r     s    z_BaseNetwork.__repr__c                 C   s   d| j | jf S N%s/%d)rP   rk   r\   r	   r	   r
   r     s    z_BaseNetwork.__str__c                 c   s8   t | j}t | j}t|d |D ]}| |V  q"d S r(   rt   rP   rI   range_address_classr]   network	broadcastr   r	   r	   r
   hosts  s    

z_BaseNetwork.hostsc                 c   s8   t | j}t | j}t||d D ]}| |V  q"d S r(   r   r   r	   r	   r
   __iter__  s    

z_BaseNetwork.__iter__c                 C   sl   t | j}t | j}|dkr>|| |kr0td| || S |d7 }|| |k rZtd| || S d S )Nr   zaddress out of ranger)   )rt   rP   rI   
IndexErrorr   )r]   r   r   r   r	   r	   r
   __getitem__  s    

z_BaseNetwork.__getitem__c                 C   s^   t |tstS | j|jkr*td| |f | j|jkrB| j|jk S | j|jkrZ| j|jk S dS r   )r9   rT   rW   rM   r;   rP   netmaskr   r	   r	   r
   r     s    
z_BaseNetwork.__lt__c                 C   sJ   z.| j |j ko,| j|jko,t| jt|jkW S  tyD   t Y S 0 d S rA   )rM   rP   rt   r   rO   rW   r   r	   r	   r
   r     s    
z_BaseNetwork.__eq__c                 C   s   t t| jt| jA S rA   )r   rt   rP   r   r\   r	   r	   r
   r     s    z_BaseNetwork.__hash__c                 C   s8   | j |j krdS t|trdS |j| jj@ | jjkS d S NF)rM   r9   rT   r,   r   rP   r   r	   r	   r
   __contains__  s
    
z_BaseNetwork.__contains__c                 C   s(   | j |v p&| j|v p&|j | v p&|j| v S rA   )rP   rI   r   r	   r	   r
   overlaps  s
    


z_BaseNetwork.overlapsc                 C   s   |  t| jt| jB S rA   )r   rt   rP   hostmaskr\   r	   r	   r
   rI     s    z_BaseNetwork.broadcast_addressc                 C   s   |  t| j| jA S rA   )r   rt   r   r>   r\   r	   r	   r
   r     s    z_BaseNetwork.hostmaskc                 C   s   d| j | jf S r   )rP   rN   r\   r	   r	   r
   with_prefixlen  s    z_BaseNetwork.with_prefixlenc                 C   s   d| j | jf S N%s/%s)rP   r   r\   r	   r	   r
   with_netmask  s    z_BaseNetwork.with_netmaskc                 C   s   d| j | jf S r   )rP   r   r\   r	   r	   r
   with_hostmask  s    z_BaseNetwork.with_hostmaskc                 C   s   t | jt | j d S r(   )rt   rI   rP   r\   r	   r	   r
   num_addresses
  s    z_BaseNetwork.num_addressesc                 C   s   dt | f }t|d S )Nz%%200s has no associated address classrc   rf   r	   r	   r
   r     s    z_BaseNetwork._address_classc                 C   s   | j S rA   )rN   r\   r	   r	   r
   rk     s    z_BaseNetwork.prefixlenc                 c   s  | j |j kstd| |f t|ts2td| || sLtd|| f || krXd S |d|j|jf }| 	 \}}||kr||kr||r|V  |	 \}}qz||r|V  |	 \}}qzt
d|||f qz||kr|V  n"||kr|V  nt
d|||f d S )Nr7   z%s is not a network objectz%s not contained in %sr   z3Error performing exclusion: s1: %s s2: %s other: %s)rM   r;   r9   rT   	subnet_ofr   r|   rP   rk   rJ   AssertionError)r]   r   s1s2r	   r	   r
   address_exclude  s>    $




z_BaseNetwork.address_excludec                 C   s`   | j |j krtd| |f | j|jk r,dS | j|jkr<dS | j|jk rLdS | j|jkr\dS dS )Nz"%s and %s are not of the same typerL   r)   r   )rM   r;   rP   r   r   r	   r	   r
   compare_networksf  s    !z_BaseNetwork.compare_networksc                 C   s   | j | j| jfS rA   )rM   rP   r   r\   r	   r	   r
   rU     s    z_BaseNetwork._get_networks_keyr)   Nc           	      c   s   | j | jkr| V  d S |d urJ|| j k r0td|dkr@td|| j  }|dk rZtd| j | }|| jkr~td|| f t| j}t| jd }t| jd |? }t|||D ]}| ||f}|V  qd S )Nznew prefix must be longerr)   (cannot set prefixlen_diff and new_prefixr   zprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s)	rN   r=   r   rt   rP   rI   r   r   r|   )	r]   prefixlen_diff
new_prefixnew_prefixlenstartendstepZnew_addrcurrentr	   r	   r
   rJ     s0    




z_BaseNetwork.subnetsc                 C   s   | j dkr| S |d urB|| j kr(td|dkr8td| j | }| j| }|dk rftd| j|f | t| jt| j|> @ |fS )Nr   znew prefix must be shorterr)   r   z;current prefixlen is %d, cannot have a prefixlen_diff of %d)rN   r   rk   r|   rt   rP   r   )r]   r   r   r   r	   r	   r
   rD     s&    



z_BaseNetwork.supernetc                 C   s   | j jo| jjS rA   )rP   is_multicastrI   r\   r	   r	   r
   r     s    	z_BaseNetwork.is_multicastc                 C   sf   z:| j |j kr"t|  d| d|j| jko8|j| jkW S  ty`   td|  d| Y n0 d S )Nz and z are not of the same versionz*Unable to test subnet containment between )rM   r;   rP   rI   rO   )ar   r	   r	   r
   _is_subnet_of
  s    
z_BaseNetwork._is_subnet_ofc                 C   s   |  | |S rA   r   r   r	   r	   r
   r     s    z_BaseNetwork.subnet_ofc                 C   s   |  || S rA   r   r   r	   r	   r
   supernet_of  s    z_BaseNetwork.supernet_ofc                 C   s   | j jo| jjS rA   )rP   is_reservedrI   r\   r	   r	   r
   r     s    	z_BaseNetwork.is_reservedc                 C   s   | j jo| jjS rA   )rP   is_link_localrI   r\   r	   r	   r
   r   *  s    z_BaseNetwork.is_link_localc                 C   s   | j jo| jjS rA   )rP   
is_privaterI   r\   r	   r	   r
   r   5  s    	z_BaseNetwork.is_privatec                 C   s   | j  S rA   r   r\   r	   r	   r
   	is_globalA  s    	z_BaseNetwork.is_globalc                 C   s   | j jo| jjS rA   )rP   is_unspecifiedrI   r\   r	   r	   r
   r   L  s    	z_BaseNetwork.is_unspecifiedc                 C   s   | j jo| jjS rA   )rP   is_loopbackrI   r\   r	   r	   r
   r   X  s    	z_BaseNetwork.is_loopback)r)   N)r)   N)(r   r   r   r   r   r   r   r   r   r   r   r   r   	functoolscached_propertyrI   r   r   r   r   r   r   r   rk   r   r   rU   rJ   rD   r   staticmethodr   r   r   r   r   r   r   r   r   r	   r	   r	   r
   rT     sb   







K0

5
)








rT   c                   @   s   e Zd ZdZdZde d ZeZi Zdd Z	e
dd Ze
d	d
 Ze
dd Ze
dd Zdd Zedd Zedd ZdS )_BaseV4r	   r   r"   r)   c                 C   s   t | S rA   r_   r\   r	   r	   r
   r[   w  s    z$_BaseV4._explode_shorthand_ip_stringc                 C   s   || j vrt|tr<|}d|  kr.| jkshn | | n,z| |}W n tyf   | |}Y n0 t| 	|}||f| j |< | j | S rq   )
_netmask_cacher9   rt   r=   rp   ru   r   rx   r   rl   rj   argrk   r   r	   r	   r
   _make_netmaskz  s    	

z_BaseV4._make_netmaskc              
   C   s   |st d|d}t|dkr.t d| ztt| j|dW S  tyz } zt d||f d W Y d }~n
d }~0 0 d S )NAddress cannot be empty.r   zExpected 4 octets in %rr   %s in %r)r   r$   r%   rt   
from_bytesmap_parse_octetr   )rj   rw   Zoctetsexcr	   r	   r
   rv     s    
z_BaseV4._ip_int_from_stringc                 C   s   |st d| r| s,d}t || t|dkrHd}t || |dkrl|d dkrld}t || t|d}|d	krt d
| |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   rr   rs   r%   rt   )rj   Z	octet_strrg   Z	octet_intr	   r	   r
   r     s    
z_BaseV4._parse_octetc                 C   s   d tt|ddS )Nr   r   r   )joinr   r#   r   )rj   rn   r	   r	   r
   r     s    z_BaseV4._string_from_ip_intc                 C   s&   t | dd d d }d|d S )Nr   rL   z.in-addr.arpa)r#   r$   r   )r]   Zreverse_octetsr	   r	   r
   ra     s    z_BaseV4._reverse_pointerc                 C   s   | j S rA   r=   r\   r	   r	   r
   max_prefixlen  s    z_BaseV4.max_prefixlenc                 C   s   | j S rA   r   r\   r	   r	   r
   r<     s    z_BaseV4.versionN)r   r   r   r~   rM   
IPV4LENGTHr>   r=   r   r[   r   r   rv   r   r   ra   r   r   r<   r	   r	   r	   r
   r   d  s&   	


#
	
r   c                   @   s   e Zd ZdZdd Zedd Zedd Zee	 dd	 Z
ee	 d
d Zedd Zedd Zedd Zedd ZdS )r   )r,   __weakref__c                 C   st   t |tr| | || _d S t |trF| |d t|d| _d S t|}d|v rdtd|| 	|| _d S )Nr   r   r!   Unexpected '/' in )
r9   rt   rh   r,   ry   ri   r   r#   r   rv   r]   r   Zaddr_strr	   r	   r
   __init__  s    


zIPv4Address.__init__c                 C   s
   t | jS rA   )r   r,   r\   r	   r	   r
   packed  s    zIPv4Address.packedc                 C   s   | | j jv S rA   )
_constants_reserved_networkr\   r	   r	   r
   r     s    	zIPv4Address.is_reservedc                    s   t  fdd jjD S )Nc                 3   s   | ]} |v V  qd S rA   r	   .0r?   r\   r	   r
   	<genexpr>4      z)IPv4Address.is_private.<locals>.<genexpr>anyr   _private_networksr\   r	   r\   r
   r   *  s    
zIPv4Address.is_privatec                 C   s   | | j jvo| j S rA   )r   _public_networkr   r\   r	   r	   r
   r   6  s    zIPv4Address.is_globalc                 C   s   | | j jv S rA   r   _multicast_networkr\   r	   r	   r
   r   ;  s    	zIPv4Address.is_multicastc                 C   s   | | j jkS rA   )r   _unspecified_addressr\   r	   r	   r
   r   F  s    	zIPv4Address.is_unspecifiedc                 C   s   | | j jv S rA   )r   _loopback_networkr\   r	   r	   r
   r   Q  s    zIPv4Address.is_loopbackc                 C   s   | | j jv S rA   r   _linklocal_networkr\   r	   r	   r
   r   [  s    zIPv4Address.is_link_localN)r   r   r   r~   r   r   r   r   r   	lru_cacher   r   r   r   r   r   r	   r	   r	   r
   r     s(   #








	r   c                   @   sx   e Zd Zdd Zejdd Zdd Zdd Zd	d
 Z	dd Z
ejZedd Zedd Zedd Zedd ZdS )r   c                 C   sD   |  |\}}t| | t||fdd| _| jj| _| jj| _d S NF)r   )r{   r   r   r   r   r   rN   r]   r   r&   maskr	   r	   r
   r   h  s
    
zIPv4Interface.__init__c                 C   s   | j jS rA   r   r   r\   r	   r	   r
   r   p  s    zIPv4Interface.hostmaskc                 C   s   d|  | j| jf S r   r   r,   rN   r\   r	   r	   r
   r   t  s    zIPv4Interface.__str__c                 C   sD   t | |}|tu s|s|S z| j|jkW S  ty>   Y dS 0 d S r   )r   r   rW   r   rO   r]   r   Zaddress_equalr	   r	   r
   r   x  s    zIPv4Interface.__eq__c                 C   sP   t | |}|tu rtS z| j|jk p4| j|jko4|W S  tyJ   Y dS 0 d S r   )r   r   rW   r   rO   r]   r   Zaddress_lessr	   r	   r
   r     s    zIPv4Interface.__lt__c                 C   s   t | j| jt| jjfS rA   r   r,   rN   rt   r   rP   r\   r	   r	   r
   r     s    zIPv4Interface.__hash__c                 C   s
   t | jS rA   )r   r,   r\   r	   r	   r
   r1     s    zIPv4Interface.ipc                 C   s   d|  | j| jf S r   r  r\   r	   r	   r
   r     s    zIPv4Interface.with_prefixlenc                 C   s   d|  | j| jf S r   r   r,   r   r\   r	   r	   r
   r     s    zIPv4Interface.with_netmaskc                 C   s   d|  | j| jf S r   r   r,   r   r\   r	   r	   r
   r     s    zIPv4Interface.with_hostmaskN)r   r   r   r   r   r   r   r   r   r   r   rZ   r}   r   r1   r   r   r   r	   r	   r	   r
   r   f  s    



r   c                   @   s.   e Zd ZeZdddZee dd Z	dS )r   Tc                    s   |  |\ }t | _| |\| _| _t| j}|t| j@ |krl|rXtd|  nt|t| j@ | _| j| jd kr| j	| _
n| j| jkr fdd| _
d S )N%s has host bits setr)   c                      s
   t  gS rA   )r   r	   r&   r	   r
   <lambda>  r   z&IPv4Network.__init__.<locals>.<lambda>)r{   r   rP   r   r   rN   rt   r   r=   r   r   r]   r   r   r  r   r	   r  r
   r     s    #


zIPv4Network.__init__c                 C   s&   | j tdv o| jtdv  o$| j S )N100.64.0.0/10)rP   r   rI   r   r\   r	   r	   r
   r     s
    
zIPv4Network.is_globalN)T)
r   r   r   r   r   r   r   r   r  r   r	   r	   r	   r
   r     s
   
4r   c                   @   s   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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/29z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0.0.0.0N)r   r   r   r   r  r   r   r   r   r   r   r   r	   r	   r	   r
   r    s*   r  c                   @   s   e Zd ZdZdZde d ZdZedZ	eZ
i Zedd Zed	d
 Zedd Zedd ZedddZdd Zdd Zedd Zedd Zedd ZdS )_BaseV6r	   r8   r"   r)   rm   0123456789ABCDEFabcdefc                 C   sl   || j vrbt|tr<|}d|  kr.| jksFn | | n
| |}t| |}||f| j |< | j | S rq   )r   r9   rt   r=   rp   ru   r   rl   r   r	   r	   r
   r   1  s    	


z_BaseV6._make_netmaskc              
   C   s  |st d|d}d}t||k r:d||f }t |d|d v rzt| j}W n6 t y } zt d||f d W Y d }~n
d }~0 0 |d|d	? d
@   |d|d
@   | jd }t||krd|d |f }t |d }tdt|d D ]*}	||	 s|d ur"d| }t ||	}q|d ur|}
t|| d }|d sn|
d8 }
|
rnd}t || |d s|d8 }|rd}t || | j|
|  }|dk r4d}t || jd |f njt|| jkrd}t || j|f |d s
d}t || |d s$d}t || t|}
d}d}znd}t|
D ] }	|d	K }|| 	||	 O }qB|d	| K }t| dD ] }	|d	K }|| 	||	 O }q||W S  t
y } zt d||f d W Y d }~n
d }~0 0 d S )Nr   :r   z At least %d parts expected in %rr   rL   r   %xr     r)   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   r$   r%   r   rC   r,   rF   _HEXTET_COUNTr   _parse_hextetr   )rj   rw   partsZ
_min_partsrg   Zipv4_intr   Z
_max_partsZ
skip_indexiZparts_hiZparts_loZparts_skippedrn   r	   r	   r
   rv   E  s    
(







z_BaseV6._ip_int_from_stringc                 C   s>   | j |std| t|dkr4d}t|| t|dS )NzOnly hex digits permitted in %rr   z$At most 4 characters permitted in %rr   )_HEX_DIGITS
issupersetr   r%   rt   )rj   Z
hextet_strrg   r	   r	   r
   r    s    z_BaseV6._parse_hextetc           	      C   s   d}d}d}d}t |D ]>\}}|dkrN|d7 }|dkr<|}||krV|}|}qd}d}q|dkr|| }|t|kr~|dg7 }dg|||< |dkrdg| }|S )NrL   r   r   r)    )	enumerater%   )	rj   hextetsZbest_doublecolon_startZbest_doublecolon_lenZdoublecolon_startZdoublecolon_lenindexZhextetZbest_doublecolon_endr	   r	   r
   _compress_hextets  s0    

z_BaseV6._compress_hextetsNc                    sZ   |d u rt | j}|| jkr$tdd|   fddtdddD }| |}d|S )	NzIPv6 address is too large%032xc                    s&   g | ]}d t  ||d  d qS )r  r   r   )rt   r   r   Zhex_strr	   r
   
<listcomp>  r   z/_BaseV6._string_from_ip_int.<locals>.<listcomp>r   r   r   r  )rt   r,   r>   r   r   r"  r   )rj   rn   r   r	   r%  r
   r     s    


z_BaseV6._string_from_ip_intc                    s   t | trt| j}nt | tr,t| j}nt| }| |}d|   fddtdddD }t | ttfrdd	|| j
f S d	|S )	Nr#  c                    s   g | ]} ||d   qS )r   r	   r$  r%  r	   r
   r&  $  r   z8_BaseV6._explode_shorthand_ip_string.<locals>.<listcomp>r   r   r   r   r  )r9   r   r#   rP   r   r1   rv   r   rT   r   rN   )r]   rw   rn   r  r	   r%  r
   r[     s    



z$_BaseV6._explode_shorthand_ip_stringc                 C   s&   | j d d d dd}d|d S )NrL   r  r  r   z	.ip6.arpa)r^   replacer   )r]   Zreverse_charsr	   r	   r
   ra   )  s    z_BaseV6._reverse_pointerc                 C   s:   |  d\}}}|sd }n|r&d|v r2td|  ||fS )N%zInvalid IPv6 address: "%r")	partitionr   )rw   r&   sepscope_idr	   r	   r
   _split_scope_id2  s    z_BaseV6._split_scope_idc                 C   s   | j S rA   r   r\   r	   r	   r
   r   F  s    z_BaseV6.max_prefixlenc                 C   s   | j S rA   r   r\   r	   r	   r
   r<   J  s    z_BaseV6.version)N)r   r   r   r~   rM   
IPV6LENGTHr>   r  	frozensetr  r=   r   r   r   rv   r  r"  r   r[   ra   r   r,  r   r   r<   r	   r	   r	   r
   r    s2   	

g

/	

r  c                       s   e Zd ZdZdd Z fddZdd Z fdd	Zed
d Z	edd Z
edd Zedd Zedd Zedd Zee dd Zedd Zedd Zedd Zedd Zed d! Zed"d# Z  ZS )$r   )r,   	_scope_idr   c                 C   s   t |tr$| | || _d | _d S t |trR| |d t|d| _d | _d S t|}d|v rpt	d|| 
|\}| _| || _d S )Nr   r   r!   r   )r9   rt   rh   r,   r/  ry   ri   r   r#   r   r,  rv   r   r	   r	   r
   r   U  s    


zIPv6Address.__init__c                    s"   t   }| jr|d | j S |S )Nr(  )r   r   r/  )r]   rw   r   r	   r
   r   }  s    
zIPv6Address.__str__c                 C   s   t | j| jfS rA   )r   r,   r/  r\   r	   r	   r
   r     s    zIPv6Address.__hash__c                    s2   t  |}|tu rtS |s dS | jt|dd kS )NFr/  )r   r   rW   r/  getattrr  r   r	   r
   r     s    zIPv6Address.__eq__c                 C   s   | j S rA   )r/  r\   r	   r	   r
   r+    s    
zIPv6Address.scope_idc                 C   s
   t | jS rA   )r    r,   r\   r	   r	   r
   r     s    zIPv6Address.packedc                 C   s   | | j jv S rA   r   r\   r	   r	   r
   r     s    	zIPv6Address.is_multicastc                    s   t  fdd jjD S )Nc                 3   s   | ]} |v V  qd S rA   r	   r$  r\   r	   r
   r     r   z*IPv6Address.is_reserved.<locals>.<genexpr>)r   r   _reserved_networksr\   r	   r\   r
   r     s    	zIPv6Address.is_reservedc                 C   s   | | j jv S rA   r   r\   r	   r	   r
   r     s    zIPv6Address.is_link_localc                 C   s   | | j jv S rA   )r   _sitelocal_networkr\   r	   r	   r
   is_site_local  s    zIPv6Address.is_site_localc                    s   t  fdd jjD S )Nc                 3   s   | ]} |v V  qd S rA   r	   r   r\   r	   r
   r     r   z)IPv6Address.is_private.<locals>.<genexpr>r   r\   r	   r\   r
   r     s    
zIPv6Address.is_privatec                 C   s   | j  S rA   r   r\   r	   r	   r
   r     s    	zIPv6Address.is_globalc                 C   s
   | j dkS rq   r   r\   r	   r	   r
   r     s    	zIPv6Address.is_unspecifiedc                 C   s
   | j dkS r(   r   r\   r	   r	   r
   r     s    	zIPv6Address.is_loopbackc                 C   s    | j d? dkrd S t| j d@ S )Nr   r      r,   r   r\   r	   r	   r
   ipv4_mapped  s    	zIPv6Address.ipv4_mappedc                 C   s4   | j d? dkrd S t| j d? d@ t| j  d@ fS )N`   i   @   r4  r5  r\   r	   r	   r
   teredo  s
    
zIPv6Address.teredoc                 C   s$   | j d? dkrd S t| j d? d@ S )Np   i   P   r4  r5  r\   r	   r	   r
   	sixtofour  s    	zIPv6Address.sixtofour)r   r   r   r~   r   r   r   r   r   r+  r   r   r   r   r3  r   r  r   r   r   r   r6  r9  r<  r   r	   r	   r   r
   r   O  s@   (






	









r   c                       s   e Zd Zdd Zejdd Z fddZdd Zd	d
 Z	dd Z
ejZedd Zedd Zedd Zedd Zedd Zedd Z  ZS )r   c                 C   sD   |  |\}}t| | t||fdd| _| jj| _| jj| _d S r  )r{   r   r   r   r   r   rN   r  r	   r	   r
   r   $  s
    
zIPv6Interface.__init__c                 C   s   | j jS rA   r  r\   r	   r	   r
   r   ,  s    zIPv6Interface.hostmaskc                    s   dt   | jf S r   )r   r   rN   r\   r   r	   r
   r   0  s    
zIPv6Interface.__str__c                 C   sD   t | |}|tu s|s|S z| j|jkW S  ty>   Y dS 0 d S r   )r   r   rW   r   rO   r  r	   r	   r
   r   4  s    zIPv6Interface.__eq__c                 C   sP   t | |}|tu r|S z| j|jk p4| j|jko4|W S  tyJ   Y dS 0 d S r   )r   r   rW   r   rO   r	  r	   r	   r
   r   @  s    zIPv6Interface.__lt__c                 C   s   t | j| jt| jjfS rA   r
  r\   r	   r	   r
   r   L  s    zIPv6Interface.__hash__c                 C   s
   t | jS rA   )r   r,   r\   r	   r	   r
   r1   Q  s    zIPv6Interface.ipc                 C   s   d|  | j| jf S r   r  r\   r	   r	   r
   r   U  s    zIPv6Interface.with_prefixlenc                 C   s   d|  | j| jf S r   r  r\   r	   r	   r
   r   Z  s    zIPv6Interface.with_netmaskc                 C   s   d|  | j| jf S r   r  r\   r	   r	   r
   r   _  s    zIPv6Interface.with_hostmaskc                 C   s   | j dko| jjS rq   )r,   r   r   r\   r	   r	   r
   r   d  s    zIPv6Interface.is_unspecifiedc                 C   s   | j dko| jjS r(   )r,   r   r   r\   r	   r	   r
   r   h  s    zIPv6Interface.is_loopback)r   r   r   r   r   r   r   r   r   r   r   rZ   r}   r   r1   r   r   r   r   r   r   r	   r	   r   r
   r   "  s(   





r   c                   @   s.   e Zd ZeZd	ddZdd Zedd ZdS )
r   Tc                    s   |  |\ }t | _| |\| _| _t| j}|t| j@ |krl|rXtd|  nt|t| j@ | _| j| jd kr| j	| _
n| j| jkr fdd| _
d S )Nr  r)   c                      s
   t  gS rA   )r   r	   r  r	   r
   r    r   z&IPv6Network.__init__.<locals>.<lambda>)r{   r   rP   r   r   rN   rt   r   r=   r   r   r  r	   r  r
   r   }  s    


zIPv6Network.__init__c                 c   s<   t | j}t | j}t|d |d D ]}| |V  q&d S r(   r   r   r	   r	   r
   r     s    

zIPv6Network.hostsc                 C   s   | j jo| jjS rA   )rP   r3  rI   r\   r	   r	   r
   r3    s    zIPv6Network.is_site_localN)T)	r   r   r   r   r   r   r   r   r3  r	   r	   r	   r
   r   m  s
   
0r   c                   @   s   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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100::/64z	2001::/23z2001:2::/48z2001:db8::/32z2001:10::/28zfc00::/7z::/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   r   r1  r2  r	   r	   r	   r
   r=    s.   r=  )T)#__version__r   r   r-  r   r   r   r   r   r   r   r    r'   r2   r6   r@   rK   rS   rY   rZ   r   total_orderingr:   rT   r   r   r   r   r  r   r  r   r   r   r=  r	   r	   r	   r
   <module>   sV   
"716 3k   H uCR  4 TK\!