o
    àý°jA&  ã                   @   s&   d dl Z d dlmZ G dd„ dƒZdS )é    N)Ústring_typesc                   @   sò   e Zd ZdZdZdZed Zee e ZdZdZ	dd„ Z
d	d
„ Zdd„ Zd7d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d$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zed2d3„ ƒZ d4d5„ Z!d6S )8ÚIP6_Addressé   é   é   é   ú:ú%c                 C   s@   t   dd| j ¡| _d| _t|tƒr|  |¡ d S |  |¡ d S )NÚBó    Ú )ÚarrayÚADDRESS_BYTE_SIZEÚ_IP6_Address__bytesÚ_IP6_Address__scope_idÚ
isinstancer   Ú_IP6_Address__from_stringÚ_IP6_Address__from_bytes©ÚselfÚaddress© r   ú‡/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/IP6_Address.pyÚ__init__   s
   
zIP6_Address.__init__c                 C   s  |   |¡r| | j¡}|d }|d dkrtdƒ‚|d | _|  |¡r(|  |¡}|  |¡}t|ƒ| j	kr=tdt
| j	ƒ ƒ‚| | j¡}t|ƒ| jkrStdt
| jƒ ƒ‚d}|D ]-}t|ƒ| jkritdt
| jƒ ƒ‚t|dƒ}|d	@ d
? | j|< |d@ | j|d < |d7 }qWd S )Nr   r   r   zEmpty scope IDz,IP6_Address - from_string - address size != z#IP6_Address - parsed hex groups != z)IP6_Address - parsed hex group length != r   i ÿ  r   éÿ   é   )Ú!_IP6_Address__is_a_scoped_addressÚsplitÚSCOPE_SEPARATORÚ	Exceptionr   Ú+_IP6_Address__is_address_in_compressed_formÚ'_IP6_Address__expand_compressed_addressÚ#_IP6_Address__insert_leading_zeroesÚlenÚADDRESS_TEXT_SIZEÚstrÚ	SEPARATORÚTOTAL_HEX_GROUPSÚHEX_GROUP_SIZEÚintr   )r   r   Úsplit_partsÚ
hex_groupsÚoffsetÚgroupÚgroup_as_intr   r   r   Ú__from_string(   s.   






ùzIP6_Address.__from_stringc                 C   s*   t |ƒ| jkrtdt| jƒ ƒ‚|| _d S )Nz)IP6_Address - from_bytes - array size != )r#   r   r   r%   r   )r   ÚtheBytesr   r   r   Ú__from_bytesL   s   
zIP6_Address.__from_bytesTc                 C   s–   d}t | jƒD ]\}}|t|ƒdd …  dd¡7 }|d dkr$|| j7 }q|d d…  ¡ }|r9|  |¡}|  |¡}|rI|  ¡ dkrI|| j	| j
 7 }|S )Nr   r   Ú0r   éÿÿÿÿ)Ú	enumerater   ÚhexÚrjustr&   ÚupperÚ!_IP6_Address__trim_leading_zeroesÚ%_IP6_Address__trim_longest_zero_chainÚget_scope_idr   r   )r   Úcompress_addressÚscoped_addressÚsÚiÚvr   r   r   Ú	as_stringS   s   
€

zIP6_Address.as_stringc                 C   ó   | j S ©N©r   ©r   r   r   r   Úas_bytesc   ó   zIP6_Address.as_bytesc                 C   s   |   ¡ S rB   ©r@   rD   r   r   r   Ú__str__f   s   zIP6_Address.__str__c                 C   rA   rB   )r   rD   r   r   r   r:   i   rF   zIP6_Address.get_scope_idc                 C   s   |   dd¡S ©NTFrG   rD   r   r   r   Úget_unscoped_addressl   s   z IP6_Address.get_unscoped_addressc                 C   ó   | j d dkS )Nr   r   rC   rD   r   r   r   Úis_multicastq   ó   zIP6_Address.is_multicastc                 C   rK   )Nr   éþ   rC   rD   r   r   r   Ú
is_unicastt   rM   zIP6_Address.is_unicastc                 C   s   |   ¡ o| jd d@ dkS )Nr   éÀ   é€   ©rO   r   rD   r   r   r   Úis_link_local_unicastw   ó   z!IP6_Address.is_link_local_unicastc                 C   s   |   ¡ o| jd d@ dkS )Nr   rP   rR   rD   r   r   r   Úis_site_local_unicastz   rT   z!IP6_Address.is_site_local_unicastc                 C   rK   )Nr   éý   rC   rD   r   r   r   Úis_unique_local_unicast}   rM   z#IP6_Address.is_unique_local_unicastc                 C   s@   |   ¡ rdS |  ¡ r|  ¡ rdS |  ¡ rdS dS |  ¡ rdS dS )NÚ	multicastzlink-local unicastzsite-local unicastÚunicastzunique-local unicastzunknown type)rL   rO   rS   rU   rW   rD   r   r   r   Úget_human_readable_address_type�   s   z+IP6_Address.get_human_readable_address_typec                 C   sF   |  | jd ¡dkrtdƒ‚|  |¡}|dkrdS |dkrdS tdƒ‚)Né   r   z IP6_Address - found triple colonFr   Tz;IP6_Address - more than one compression marker ("::") found)Úcountr&   r   Ú&_IP6_Address__count_compression_marker)r   r   Úcompression_marker_countr   r   r   Ú__is_address_in_compressed_form”   s   
z+IP6_Address.__is_address_in_compressed_formc                 C   s$   |  | jd | j¡}| | j¡d S )Nr   r   )Úreplacer&   r\   )r   r   Útrimmed_addressr   r   r   Ú__count_compressed_groups£   s   z%IP6_Address.__count_compressed_groupsc                 C   s   |  | jd ¡S )Nr   )r\   r&   r   r   r   r   Ú__count_compression_marker¨   ó   z&IP6_Address.__count_compression_markerc                 C   sL   |  | j¡}d}|D ]}t|ƒdk r| dd¡}||| j 7 }q
|d d… S )Nr   r   r2   r3   )r   r&   r#   r6   )r   r   r+   Únew_addressÚ	hex_groupr   r   r   Ú__insert_leading_zeroes¬   s   z#IP6_Address.__insert_leading_zeroesc                 C   sz   |   |¡}| j| }| | jd ¡d }|r1|d |… d | j ||d …  }|d7 }|d8 }|s| | jd | j¡}|S )Nr   r   Ú0000é   )Ú%_IP6_Address__count_compressed_groupsr'   Úfindr&   r`   )r   r   Úgroup_countÚgroups_to_insertÚposr   r   r   Ú__expand_compressed_address¹   s   

"ýz'IP6_Address.__expand_compressed_addressc           	      C   sØ   d}|dkrj|  | j¡}t|ƒD ]Q\}}|dkra|}|}|dk r8||d  dkr8|d7 }|dk r8||d  dks(|| d }||kra| j |d|… ¡| jd  | j ||d d … ¡ }|  S q|d8 }|dks|S )Nr   r   r2   é   r   r   )r   r&   r4   Újoin)	r   r   Ú
chain_sizeÚgroupsÚindexr-   Ústart_indexÚ	end_indexÚ
found_sizer   r   r   Ú__trim_longest_zero_chainË   s$   ÿ6€íz%IP6_Address.__trim_longest_zero_chainc                 C   sR   |  | j¡}d}|D ]}| d¡| j }|| jkrd| j }||7 }q
|d d… S )Nr   r2   r3   )r   r&   Úlstrip)r   ÚtheStrrs   r-   r   r   r   Ú__trim_leading_zeroesæ   s   


z!IP6_Address.__trim_leading_zeroesc                 C   s$   zt |ƒ W dS  ty   Y dS w rI   )r   r   )ÚclsÚtext_representationr   r   r   Úis_a_valid_text_representationó   s   ÿz*IP6_Address.is_a_valid_text_representationc                 C   s   |  | j¡dkS )Nr   )r\   r   )r   r}   r   r   r   Ú__is_a_scoped_addressü   rd   z!IP6_Address.__is_a_scoped_addressN)TT)"Ú__name__Ú
__module__Ú__qualname__r   r'   r(   ÚTOTAL_SEPARATORSr$   r&   r   r   r   r   r@   rE   rH   r:   rJ   rL   rO   rS   rU   rW   rZ   r    rj   r]   r"   r!   r9   r8   Úclassmethodr~   r   r   r   r   r   r      s@    $

r   )r   Úsixr   r   r   r   r   r   Ú<module>   s   