o
    ,˜Žj¶  ã                   @  s¶   d dl m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 G dd„ dejƒZG dd	„ d	ejƒZG d
d„ dejƒZG dd„ deejƒZG dd„ deejƒZddd„Ze e¡ dS )é    )ÚannotationsN)ÚAnyé   )Ú	IDNAErrorÚ_unicode_dots_reÚalabelÚdecodeÚencodeÚulabelc                   @  s(   e Zd ZdZdddd	„Zdddd„ZdS )ÚCodecaf  Stateless IDNA 2008 codec.

    Implements the :class:`codecs.Codec` protocol so that the whole-domain
    encoder (:func:`idna.encode`) and decoder (:func:`idna.decode`) are
    accessible through the standard codec machinery as ``"idna2008"``.

    Only the ``"strict"`` error handler is supported; any other handler
    raises :exc:`~idna.IDNAError`.
    ÚstrictÚdataÚstrÚerrorsÚreturnútuple[bytes, int]c                 C  ó4   |dkrt d|› d�dd�‚|sdS t|ƒt|ƒfS )Nr   úUnsupported error handling "ú"Úunsupported_errors©Úcode©ó    r   )r   r	   Úlen©Úselfr   r   © r   úG/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/idna/codec.pyr	      ó
   zCodec.encodeÚbytesútuple[str, int]c                 C  r   )Nr   r   r   r   r   ©Ú r   )r   r   r   r   r   r   r   r      r   zCodec.decodeN)r   )r   r   r   r   r   r   )r   r    r   r   r   r!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r   r   	   s    
	r   c                   @  s   e Zd ZdZdd	d
„ZdS )ÚIncrementalEncodera·  Incremental IDNA 2008 encoder.

    Buffers a partial trailing label across calls until either the next
    label separator is seen or ``final=True``, so that streamed input is
    encoded one whole label at a time. Any of the four Unicode label
    separators (``U+002E``, ``U+3002``, ``U+FF0E``, ``U+FF61``) ends a
    label; the result always uses ``U+002E`` as the separator.

    Only the ``"strict"`` error handler is supported.
    r   r   r   ÚfinalÚboolr   r   c           
      C  s¶   |dkrt d|› d�dd�‚|sdS t |¡}d}|r.|d s%d	}|d= n	|s.|d= |r.d	}g }d
}|D ]}| t|ƒ¡ |rC|d7 }|t|ƒ7 }q4d	 |¡| }	|t|ƒ7 }|	|fS )Nr   r   r   r   r   r   r   éÿÿÿÿó   .r   r   )r   r   ÚsplitÚappendr   r   Újoin)
r   r   r   r)   ÚlabelsÚtrailing_dotÚresultÚsizeÚlabelÚresult_bytesr   r   r   Ú_buffer_encode3   s0   
z!IncrementalEncoder._buffer_encodeN)r   r   r   r   r)   r*   r   r   )r$   r%   r&   r'   r6   r   r   r   r   r(   '   s    r(   c                   @  s   e Zd ZdZdd
d„ZdS )ÚIncrementalDecodera  Incremental IDNA 2008 decoder.

    Buffers a partial trailing label across calls until either the next
    label separator is seen or ``final=True``, so that streamed input is
    decoded one whole label at a time.

    Only the ``"strict"`` error handler is supported.
    r   r   r   r   r)   r*   r   r!   c              
   C  sö   |dkrt d|› d�dd�‚|sdS t|tƒs2zt|dƒ}W n ty1 } zt dd	d�|‚d }~ww t |¡}d
}|rN|d sEd}|d= n	|sN|d= |rNd}g }d}|D ]}	| t|	ƒ¡ |rc|d7 }|t|	ƒ7 }qTd 	|¡| }
|t|ƒ7 }|
|fS )Nr   r   r   r   r   r"   ÚasciizInvalid ASCII in A-labelÚinvalid_asciir#   r+   Ú.r   r   )
r   Ú
isinstancer   ÚUnicodeDecodeErrorr   r-   r.   r
   r   r/   )r   r   r   r)   Úerrr0   r1   r2   r3   r4   Ú
result_strr   r   r   Ú_buffer_decode]   s>   
€ÿ
z!IncrementalDecoder._buffer_decodeN)r   r   r   r   r)   r*   r   r!   )r$   r%   r&   r'   r?   r   r   r   r   r7   S   s    	r7   c                   @  ó   e Zd ZdS )ÚStreamWriterN©r$   r%   r&   r   r   r   r   rA   ƒ   ó    rA   c                   @  r@   )ÚStreamReaderNrB   r   r   r   r   rD   ‡   rC   rD   Únamer   r   úcodecs.CodecInfo | Nonec              	   C  s,   | dkrdS t j| tƒ jtƒ jttttd�S )a£  Codec search function registered with :mod:`codecs`.

    Returns a :class:`codecs.CodecInfo` for the ``"idna2008"`` codec name
    so that ``str.encode("idna2008")`` and ``bytes.decode("idna2008")``
    invoke the IDNA 2008 codec defined in this module.

    :param name: The codec name being looked up.
    :returns: A :class:`codecs.CodecInfo` instance if ``name`` is
        ``"idna2008"``, otherwise ``None``.
    Úidna2008N)rE   r	   r   ÚincrementalencoderÚincrementaldecoderÚstreamwriterÚstreamreader)	ÚcodecsÚ	CodecInfor   r	   r   r(   r7   rA   rD   )rE   r   r   r   Úsearch_function‹   s   ùrN   )rE   r   r   rF   )Ú
__future__r   rL   Útypingr   Úcorer   r   r   r   r	   r
   r   ÚBufferedIncrementalEncoderr(   ÚBufferedIncrementalDecoderr7   rA   rD   rN   Úregisterr   r   r   r   Ú<module>   s     ,0
