3 ¢báW ã @ s€ d Z ddlZddlZddlZddlZddlmZmZm Z ej dƒZdd„ Zej dƒZ ej d ƒZej d ƒZdd„ ZdZdd„ ZdS )zIPv6 helper functions.é Né )ÚxrangeÚbinary_typeÚmaybe_decodes 0+([0-9a-f]+)c C s¢ t | ƒdkrtdƒ‚tj| ƒ}g }d}t |ƒ}xJ||k rx|||d … }tj|ƒ}|dk rd|jdƒ}|j|ƒ |d7 }q0W d}d}d} d} xNtdƒD ]B}|| d krÊ| rÖ|}|| }||krÄ| }|}d} q”| s”|} d } q”W | � rþd}|| }||k� rþ| }|}|dk�r�|dk�rb|dk�s4|dk�rb|d d k�rb|dk�rDd} nd} | t j j| dd… ƒ }n,dj|d|… ƒd dj||| d… ƒ }n dj|ƒ}t |ƒS )zÂConvert a network format IPv6 address into text. @param address: the binary address @type address: string @rtype: string @raises ValueError: the address isn't 16 bytes long é z IPv6 addresses are 16 bytes longr é Nr Fé ó 0Té é s ffffs ::s ::ffff:é ó :éÿÿÿÿ)ÚlenÚ ValueErrorÚbinasciiZhexlifyÚ _leading_zeroÚmatchÚgroupÚappendr ÚdnsÚipv4Ú inet_ntoaÚjoinr )ÚaddressÚhexÚchunksÚiÚlÚchunkÚmZ best_startZbest_lenÚstartZ last_was_zeroÚendZcurrent_lenÚprefix© r$ ú/usr/lib/python3.6/ipv6.pyr s^ r s (.*):(\d+\.\d+\.\d+\.\d+)$s ::.*s .*::$c C sÈ t | tƒs| jƒ } | dkrd} tj| ƒ}|dk rvttjj|j dƒƒƒ}d|j dƒj ƒ |d |d |d |d f jƒ } tj| ƒ}|dk r–| dd… } ntj| ƒ}|dk r´| dd… } | j d ƒ}t|ƒ}|d krÖtjj‚d}g }x�|D ]ˆ}|dk�r.|�r tjj‚d }xftdd | d ƒD ]}|jdƒ �qW qät|ƒ} | dk�rHtjj‚| dk�rbdd| | }|j|ƒ qäW |d k �rŠ| �rŠtjj‚dj|ƒ} y tj| ƒS tjtfk �r tjj‚Y nX dS )z×Convert a text format IPv6 address into network format. @param text: the textual address @type text: string @rtype: string @raises dns.exception.SyntaxError: the text was not properly formatted s ::s 0::Né z%s:%02x%02x:%02x%02xr r é r r Fó Ts 0000r r r )Ú isinstancer ÚencodeÚ _v4_endingr Ú bytearrayr r Ú inet_atonr ÚdecodeÚ_colon_colon_startÚ_colon_colon_endÚsplitr Z exceptionÚSyntaxErrorr r r r Z unhexlifyÚErrorÚ TypeError) Útextr Úbr r Z seen_emptyZ canonicalÚcr Zlcr$ r$ r% r- b sR r- ó é s ÿÿc C s | j tƒS )N)Ú startswithÚ_mapped_prefix)r r$ r$ r% Ú is_mapped« s r<