
    ^              
          d Z ddlZddlZddlmZ ddlmZ	m
ZmZmZmZmZmZmZmZ dZdZeZdZdZdez  dz
  Z G d	 d
e       Z! G d de!      Z" G d de"      Z# G d de!      Z$ G d de!      Z%e!Z&ddjO                  dgdz        z   dz   ddjO                  dgdz        z   dz   ddjO                  dgdz        z   dz   ddjO                  dgdz        z   dz   ddjO                  dgdz        z   dz   ddjO                  dgdz        z   d z   fZ(e(D  cg c]  }  ejR                  | ejT                        ! c} Z(d! Z+d" Z,d# Z-d0d$Z.d% Z/d& Z0d0d'Zd0d(Z
d0d)Zd0d*Zd0d+Zd0d,Zd0d-Zd. Zd/ Zyc c} w )1z6
IEEE 64-bit EUI (Extended Unique Indentifier) logic.
    N)AddrFormatError)	valid_wordsint_to_wordswords_to_int
valid_bitsbits_to_intint_to_bits	valid_bin
int_to_bin
bin_to_int@   zEUI-64      c                   :    e Zd ZdZdZeez  Zdez  dz
  ZdZdZ	dZ
y)	
eui64_basez%A standard IEEE EUI-64 dialect class.   r   r   -z%.2X   N)__name__
__module____qualname____doc__	word_sizewidth	num_wordsmax_wordword_sepword_fmt	word_base     8/usr/lib/python3/dist-packages/netaddr/strategy/eui64.pyr   r   +   s;    /I "I I~!H H H Ir!   r   c                   *    e Zd ZdZdZeez  ZdZdZdZ	y)
eui64_unixz'A UNIX-style MAC address dialect class.r   :z%xr   N
r   r   r   r   r   r   r   r   r   r   r    r!   r"   r$   r$   @   s#    1I"IHHIr!   r$   c                       e Zd ZdZdZy)eui64_unix_expandedz;A UNIX-style MAC address dialect class with leading zeroes.%.2xN)r   r   r   r   r   r    r!   r"   r(   r(   I   s
    EHr!   r(   c                   *    e Zd ZdZdZeez  ZdZdZdZ	y)eui64_ciscoz2A Cisco 'triple hextet' MAC address dialect class.r   .%.4xNr&   r    r!   r"   r+   r+   N   s#    <I"IHHIr!   r+   c                   *    e Zd ZdZdZeez  ZdZdZdZ	y)
eui64_barez1A bare (no delimiters) MAC address dialect class.r    z%.16Xr   Nr&   r    r!   r"   r/   r/   W   s#    ;I"IHHIr!   r/   ^r%   z([0-9A-F]{1,2})r   $r   z([0-9A-F]{1,4})   z\.z^(r0   z[0-9A-F]r   z)$c                 F    |D ]  }|j                  |       }|s|d   c S  y )Nr   )findall)addressformatsregexpmatchs       r"   _get_match_resultr:   x   s+     w'8Or!   c                 H    	 t        | t              ry	 y# t        $ r Y yw xY w)z
    :param addr: An IEEE EUI-64 indentifier in string form.

    :return: ``True`` if EUI-64 indentifier is valid, ``False`` otherwise.
    TF)r:   RE_EUI64_FORMATS	TypeError)addrs    r"   	valid_strr?      s6    T#34 5
   s    	!!c                 :   g }	 t        | t              }|st        	 t	        |t
              rn|f}t        |      dk(  r8t        dj                  |D cg c]  }dt        |d      z   c}      d      }|S t        |      dk(  r8t        dj                  |D cg c]  }dt        |d      z   c}      d      }|S t        |      d	k(  rt        d
t        |d   d      z  d      }|S t        d| z        # t        $ r t        d| d      w xY wc c}w c c}w )z
    :param addr: An IEEE EUI-64 indentifier in string form.

    :return: An unsigned integer that is equivalent to value represented
        by EUI-64 string address formatted according to the dialect
    z invalid IEEE EUI-64 identifier: !r   r0   r)   r   r3   r-   r   z%016xr   z)bad word count for EUI-64 identifier: %r!)	r:   r<   r=   r   
isinstancetuplelenintjoin)r>   wordswint_vals       r"   
str_to_intrJ      s0    EO!$(89O 
 %
5zQbggEBqvAr
2BCRH N 
UqbggEBqvAr
2BCRH N 
UqgE!Hb 1126
 N 7$>@ 	@%  OtMNNO C Cs   C7 DD7Dc                     |t         }t        | |      }|D cg c]  }|j                  |z   }}|j                  j	                  |      }|S c c}w )z
    :param int_val: An unsigned integer.

    :param dialect: (optional) a Python class defining formatting options

    :return: An IEEE EUI-64 identifier that is equivalent to unsigned integer.
    )r   r   r   r   rF   )rI   dialectrG   itokensr>   s         r"   
int_to_strrO      sX     '*E,12qg"2F2  (DK 3s   Ac                 D    t        |       }t        j                  dg| S )z
    :param int_val: the integer to be packed.

    :return: a packed string that is equivalent to value represented by an
    unsigned integer.
    >8B)r   _structpack)rI   rG   s     r"   int_to_packedrT      s"     !E<<&&&r!   c                     t        t        j                  d|             }d}t        t	        |            D ]  \  }}|}|d|z  z  }||z  } |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.
    rQ   r   r   )listrR   unpack	enumeratereversed)
packed_intrG   rI   rM   numwords         r"   packed_to_intr]      s\     z23EGHUO, !3q1u}D.!
 Nr!   c                 T    |t         }t        | |j                  |j                        S N)DEFAULT_EUI64_DIALECT_valid_wordsr   r   rG   rL   s     r"   r   r      s'    'w00'2C2CDDr!   c                 T    |t         }t        | |j                  |j                        S r_   )r`   _int_to_wordsr   r   rI   rL   s     r"   r   r      s'    ''"3"3W5F5FGGr!   c                 T    |t         }t        | |j                  |j                        S r_   )r`   _words_to_intr   r   rb   s     r"   r   r      s'    ' 1 173D3DEEr!   c                 H    |t         }t        | t        |j                        S r_   )r`   _valid_bitsr   r   bitsrL   s     r"   r   r      s!    'tUG$4$455r!   c                 H    |t         }t        | t        |j                        S r_   )r`   _bits_to_intr   r   rj   s     r"   r   r      s!    'eW%5%566r!   c                 j    |t         }t        | |j                  |j                  |j                        S r_   )r`   _int_to_bitsr   r   r   re   s     r"   r	   r	      s6    '""G$5$5w7G7GI Ir!   c                 2    |t         }t        | t              S r_   )r`   
_valid_binr   )bin_valrL   s     r"   r
   r
     s    'gu%%r!   c                 "    t        | t              S r_   )_int_to_binr   )rI   s    r"   r   r         w&&r!   c                 "    t        | t              S r_   )_bin_to_intr   )rr   s    r"   r   r     ru   r!   r_   )1r   structrR   re_renetaddr.corer   netaddr.strategyr   ra   r   rd   r   rg   r   ri   r   rm   r	   ro   r
   rq   r   rt   r   rw   AF_EUI64r   familyfamily_nameversionmax_intobjectr   r$   r(   r+   r/   r`   rF   r<   compile
IGNORECASEr:   r?   rJ   rO   rT   r]   )_s   0r"   <module>r      s     (    	 
   u*q. * * 
*   #  #((%&*
++c1#((%&*
++c1 #((%&*
++c1#((%&*
++c1%**'(1,
--3 	277J<"$%%,  =MMqKCKK3>>2M "J '&EHF67I&''w Ns   $E1