3
[_ð]—  ã               @   s€   d Z ddlZddlZddlZddlZddlmZmZm	Z	 ej
dƒZdd„ Zej
dƒZej
d	ƒZej
d
ƒZdd„ ZdZdd„ ZdS )zIPv6 helper functions.é    Né   )ÚxrangeÚbinary_typeÚmaybe_decodez0+([0-9a-f]+)c             C   s¢  t | ƒdkrtdƒ‚tj| ƒ}g }d}t |ƒ}xN||k r|t|||d … ƒ}tj|ƒ}|dk	rh|jdƒ}|j|ƒ |d7 }q0W d}d}d}	d}
xNt	dƒD ]B}|| d	krÎ|
rÚ|}||	 }||krÈ|	}|}d}
q˜|
s˜|}	d
}
q˜W |
�rd}||	 }||k�r|	}|}|dk�r”|dk�rf|dk�s8|dk�rf|d dk�rf|dk�rHd}nd}|t
jj| dd… ƒ }n,dj|d|… ƒd dj||| d… ƒ }n
dj|ƒ}|S )zÏConvert an IPv6 address in binary form to text form.

    *address*, a ``binary``, the IPv6 address in binary form.

    Raises ``ValueError`` if the address isn't 16 bytes long.
    Returns a ``text``.
    é   z IPv6 addresses are 16 bytes longr   é   Nr   Fé   Ú0Té   é   Zffffz::z::ffff:é   ú:éÿÿÿÿ)ÚlenÚ
ValueErrorÚbinasciiÚhexlifyr   Ú_leading_zeroÚmatchÚgroupÚappendr   ÚdnsÚipv4Ú	inet_ntoaÚjoin)ÚaddressÚhexÚchunksÚiÚlÚchunkÚmZ
best_startZbest_lenÚstartZlast_was_zeroÚendZcurrent_lenÚprefix© r%   ú-/tmp/pip-build-yz_zf6az/dnspython/dns/ipv6.pyr      s^    	










r   s   (.*):(\d+\.\d+\.\d+\.\d+)$s   ::.*s   .*::$c       
      C   sÈ  t | tƒs| jƒ } | dkrd} tj| ƒ}|dk	rvttjj|j	dƒƒƒ}dj
|j	dƒjƒ |d |d |d |d ƒjƒ } tj| ƒ}|dk	r–| dd… } ntj| ƒ}|dk	r´| dd… } | jd	ƒ}t|ƒ}|d
krÖtjj‚d}g }x�|D ]ˆ}|dk�r.|�r tjj‚d}xftdd
| d ƒD ]}|jdƒ �qW qät|ƒ}	|	dk�rHtjj‚|	dk�rbdd|	  | }|j|ƒ qäW |d
k �rŠ| �rŠtjj‚dj|ƒ} y
tj| ƒS  tjtfk
�rÂ   tjj‚Y nX dS )z�Convert an IPv6 address in text form to binary form.

    *text*, a ``text``, the IPv6 address in textual form.

    Returns a ``binary``.
    s   ::s   0::Né   z{}:{:02x}{:02x}:{:02x}{:02x}r   r   é   ó   :r   Fó    Ts   0000r   ó   0r   )Ú
isinstancer   ÚencodeÚ
_v4_endingr   Ú	bytearrayr   r   Ú	inet_atonr   ÚformatÚdecodeÚ_colon_colon_startÚ_colon_colon_endÚsplitr   Ú	exceptionÚSyntaxErrorr   r   r   r   Ú	unhexlifyÚErrorÚ	TypeError)
Útextr!   Úbr   r   Z
seen_emptyÚ	canonicalÚcr   Úlcr%   r%   r&   r0   d   sT    










r0   ó    é
   s   ÿÿc             C   s
   | j tƒS )z�Is the specified address a mapped IPv4 address?

    *address*, a ``binary`` is an IPv6 address in binary form.

    Returns a ``bool``.
    )Ú
startswithÚ_mapped_prefix)r   r%   r%   r&   Ú	is_mapped­   s    rD   s
             s             ÿÿ)Ú__doc__Úrer   Zdns.exceptionr   Zdns.ipv4Ú_compatr   r   r   Úcompiler   r   r.   r3   r4   r0   rC   rD   r%   r%   r%   r&   Ú<module>   s   
C


G