
    ӊ^              
          d Z ddlZddlZddlmZ ej                  dv r	ddl	m
ZmZ nddlm
ZmZ ddlmZmZmZ ddlmZmZmZmZmZmZmZ ddl m!Z! d	Z"d
Z#dZ$dZ%eZ&dZ'dZ(dZ)de"z  dz
  Z*e"e#z  Z+de#z  dz
  Z, e- e.de"dz         D  cg c]  } | e*de"| z
  z  dz
  z  f c}       Z/ e- e.de"dz         D  cg c]  } e*de"| z
  z  dz
  z  | f c}       Z0 e- e.de"dz         D  cg c]  } | de"| z
  z  dz
  f c}       Z1 e- e.de"dz         D  cg c]  } de"| z
  z  dz
  | f c}       Z2d"dZ3d"dZ4d#dZ5d Z6d Z7d Z8d Zd Z9d Z:d Zd Zd#dZd Zd Zd  Zd! Z;yc c} w c c} w c c} w c c} w )$zIPv4 address logic.    N)	inet_aton)win32cygwin)	inet_ptonAF_INET)AddrFormatErrorZEROFILL	INET_PTON)valid_words
valid_bitsbits_to_intint_to_bits	valid_bin
int_to_bin
bin_to_int)	_str_type       %d.IPv4   
         c           	      .   | dk(  rt        d      d}|t        z  r:dj                  | j                  d      D cg c]  }dt	        |      z   c}      } 	 |t
        z  rt        t        |        |S t        |        	 |S c c}w # t        $ r d}Y |S w xY w)aP  
    :param addr: An IPv4 address in presentation (string) format.

    :param flags: decides which rules are applied to the interpretation of the
        addr value. Supported constants are INET_PTON and ZEROFILL. See the
        netaddr.core docs for details.

    :return: ``True`` if IPv4 address is valid, ``False`` otherwise.
     z Empty strings are not supported!Tr   r   F)
r   r	   joinsplitintr
   
_inet_ptonr   
_inet_aton	Exception)addrflagsvalidityis       7/usr/lib/python3/dist-packages/netaddr/strategy/ipv4.py	valid_strr)   Q   s     rz@AAHxxx

3@1A@A9w% O	 t O A  Os   B B 2B BBc           	      n   |t         z  r:dj                  | j                  d      D cg c]  }dt        |      z   c}      } 	 |t        z  r't        j                  dt        t        |             d   S t        j                  dt        |             d   S c c}w # t        $ r t        | d      w xY w)aP  
    :param addr: An IPv4 dotted decimal address in string form.

    :param flags: decides which rules are applied to the interpretation of the
        addr value. Supported constants are INET_PTON and ZEROFILL. See the
        netaddr.core docs for details.

    :return: The equivalent unsigned integer for a given IPv4 address.
    r   r   >Ir   z$ is not a valid IPv4 address string!)r	   r   r   r    r
   _structunpackr!   r   r"   r#   r   )r$   r%   r'   s      r(   
str_to_intr.   n   s     xxx

3@1A@AR9>>$
7D(AB1EE>>$
4(89!<< A  R$PQQRs   B/B 5!B B4c                 x    d| cxk  r	t         k  rn nd| dz	  | dz	  dz  | dz	  dz  | dz  fz  S t        | d      )z
    :param int_val: An unsigned integer.

    :param dialect: (unused) Any value passed in is ignored.

    :return: The IPv4 presentation (string) format address equivalent to the
        unsigned integer provided.
    r   z%d.%d.%d.%d         r   z( is not a valid 32-bit unsigned integer!max_int
ValueError)int_valdialects     r(   
int_to_strr8      sY     	GwrM]d"\T!dN	   	 RSS    c                     t        |       D cg c]  }d|z  	 }}|j                          |j                  g d       dj                  |      S c c}w )z
    :param int_val: An unsigned integer.

    :return: The reverse DNS lookup for an IPv4 address in network byte
        order integer form.
    r   )zin-addrarpar   r   )int_to_wordsreverseextendr   )r6   r'   wordss      r(   int_to_arpar@      sI      ,G45!TAX5E5	MMO	LL()88E? 6s   Ac                 .    t        j                  d|       S )z
    :param int_val: the integer to be packed.

    :return: a packed string that is equivalent to value represented by an
    unsigned integer.
    r+   )r,   packr6   s    r(   int_to_packedrD      s     <<g&&r9   c                 4    t        j                  d|       d   S )a  
    :param packed_int: a packed string containing an unsigned integer.
        It is assumed that string is packed in network byte order.

    :return: An unsigned integer equivalent to value of network address
        represented by packed binary string.
    r+   r   )r,   r-   )
packed_ints    r(   packed_to_intrG      s     >>$
+A..r9   c                 ,    t        | t        t              S N)_valid_words	word_size	num_wordsr?   s    r(   r   r      s    y)44r9   c                 p    d| cxk  r	t         k  sn t        | d      | dz	  | dz	  dz  | dz	  dz  | dz  fS )z
    :param int_val: An unsigned integer.

    :return: An integer word (octet) sequence that is equivalent to value
        represented by an unsigned integer.
    r   z< is not a valid integer value supported bythis address type!r0   r1   r2   r   r3   rC   s    r(   r<   r<      sV     "7"18; < 	<]]d"]d"t^ r9   c                     t        |       st        | d      t        j                  dt        j                  dg|        d   S )z
    :param words: A list or tuple containing integer octets.

    :return: An unsigned integer that is equivalent to value represented
        by word (octet) sequence.
    z/ is not a valid octet list for an IPv4 address!r+   4Br   )r   r5   r,   r-   rB   rM   s    r(   words_to_intrQ      s?     uPUWXX>>$T :E :;A>>r9   c                 ,    t        | t        t              S rI   )_valid_bitswidthword_sepbitss    r(   r   r      s    tUH--r9   c                 ,    t        | t        t              S rI   )_bits_to_intrT   rU   rV   s    r(   r   r      s    eX..r9   c                 L    |t               d   }t        | t        t        |      S )NrU   )globals_int_to_bitsrK   rL   )r6   rU   s     r(   r   r      s%    9Z(Ix@@r9   c                 "    t        | t              S rI   )
_valid_binrT   bin_vals    r(   r   r      s    gu%%r9   c                 "    t        | t              S rI   )_int_to_binrT   rC   s    r(   r   r          w&&r9   c                 "    t        | t              S rI   )_bin_to_intrT   r_   s    r(   r   r      rc   r9   c                    g }t        d| z        }t        | t              rd| v r|	 d| v r+| j                  d      D cg c]  }dt	        |      z   }}ndt	        |       z  g}dt        |      cxk  rdk  r2n |t        dt        |      z
        D ]  }|j                  d        n||s|dt        |      z  S c c}w # t
        $ r |w xY w)	z
    Expands a partial IPv4 address into a full 4-octet version.

    :param addr: an partial or abbreviated IPv4 address

    :return: an expanded IP address in presentation format (x.x.x.x)

    z!invalid partial IPv4 address: %r!:r   r   r   r   0z%s.%s.%s.%s)
r   
isinstancer   r   r    r5   lenrangeappendtuple)r$   tokenserroror'   s        r(   expand_partial_addressrq      s     F?$FGE$	"$;K	d{15CAA$Q-AAT*+ F q  K 1s6{?+ #c"# K5=(( B  	K	s   C C C  C C)r   rI   )<__doc__sys_sysstructr,   socketr   r"   platformnetaddr.fbsocketr   r!   r   netaddr.corer   r	   r
   netaddr.strategyr   rJ   r   rS   r   rY   r   r\   r   r^   r   rb   r   re   netaddr.compatr   rT   rK   word_fmtrU   familyfamily_nameversion	word_baser4   rL   max_worddictrk   prefix_to_netmasknetmask_to_prefixprefix_to_hostmaskhostmask_to_prefixr)   r.   r8   r@   rD   rG   r<   rQ   rq   )r'   s   0r(   <module>r      s      *=='' BA 8 = =   % 	 	   
   	 u*q. Y	 	>A 49!UQY4GHqaA%!)$q(	)*HJ  49!UQY4GHqguqy!A%&*HJ  */519*=>Qa!	
Q
 >@  */519*=>QqUQY!a >@ :R,T&
'/5 	?./A&''#)c I I ? ?s   E5E##E(E-