a
    còf$e  ã                   @   sn  d dl Z d dlZd dlZd dlZd dl m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 ddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZ dd	lmZmZm Z  d
Z!dZ"G dd„ deƒZ#G dd„ de#ƒZ$G dd„ de#ƒZ%G dd„ de#ƒZ&dZ'G dd„ de(e#ƒZ)G dd„ de*e#ƒZ+G dd„ de,e#ƒZ-G dd„ de.e#ƒZ/G dd„ de.e#ƒZ0e.e,dœd d!„Z1dS )"é    N)Ú	unhexlify)Úlog10)ÚAnyÚCallableÚClassVarÚDictÚOptionalÚSequenceÚUnionÚcasté   )Ú_pdfdoc_encoding_rev)ÚPdfObjectProtocolÚPdfWriterProtocol)Ú
StreamTypeÚb_Údeprecate_no_replacementÚlogger_warningÚread_non_whitespaceÚread_until_regexÚstr_)ÚSTREAM_TRUNCATED_PREMATURELYÚPdfReadErrorÚPdfStreamErrorzMathieu Fenniakzbiziqe@mathieu.fenniak.netc                   @   s´   e Zd ZU ejZed ed< ed ed< e	dœdd„Z
e	dœdd	„Zdeeeeeeef   d dœdd„Zdeeeedœdd„Zed  dœdd„Zdeedee	f ddœdd„ZdS )Ú	PdfObject).zhashlib._HashÚ	hash_funcÚIndirectObjectÚindirect_reference©Úreturnc                 C   s   d|    ¡ S )Nz%s)Úencode©Úself© r#   úP/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/pypdf/generic/_base.pyÚhash_value_data9   s    zPdfObject.hash_value_datac                 C   s"   d| j j|  |  ¡ ¡ ¡ f  ¡ S )Nz%s:%s)Ú	__class__Ú__name__r   r%   Ú	hexdigestr    r!   r#   r#   r$   Ú
hash_value<   s    þÿÿzPdfObject.hash_valueFr#   ©Úpdf_destÚforce_duplicateÚignore_fieldsr   c                 C   s   t | jj› d�ƒ‚dS )aš  
        Clone object into pdf_dest (PdfWriterProtocol which is an interface for PdfWriter).

        By default, this method will call ``_reference_clone`` (see ``_reference``).


        Args:
          pdf_dest: Target to clone to.
          force_duplicate: By default, if the object has already been cloned and referenced,
            the copy will be returned; when ``True``, a new copy will be created.
            (Default value = ``False``)
          ignore_fields: List/tuple of field names (for dictionaries) that will be ignored
            during cloning (applies to children duplication as well). If fields are to be
            considered for a limited number of levels, you have to add it as integer, for
            example ``[1,"/B","/TOTO"]`` means that ``"/B"`` will be ignored at the first
            level only but ``"/TOTO"`` on all levels.

        Returns:
          The cloned PdfObject
        z! does not implement .clone so farN)ÚNotImplementedErrorr&   r'   ©r"   r+   r,   r-   r#   r#   r$   ÚcloneE   s    ÿzPdfObject.clone)r0   r+   r,   r   c                 C   s  z|s|j j|kr|W S W n ty,   Y n0 z
| j }W n tyN   | Y S 0 t|jƒd }|durøt|jƒ|jvrœi |jt|jƒ< |j|jt|jƒ d< |sâ|j|jt|jƒ v râ| 	|jt|jƒ |j ¡}|dusÞJ ‚|S ||jt|jƒ |j< |j 
|¡ t|d|ƒ|_ |S )aW  
        Reference the object within the _objects of pdf_dest only if
        indirect_reference attribute exists (which means the objects was
        already identified in xref/xobjstm) if object has been already
        referenced do nothing.

        Args:
          clone:
          pdf_dest:

        Returns:
          The clone
        é   NZ	PreventGCr   )r   ÚpdfÚ	ExceptionÚAttributeErrorÚlenÚ_objectsÚidÚ_id_translatedÚidnumÚ
get_objectÚappendr   )r"   r0   r+   r,   ÚindÚiÚobjr#   r#   r$   Ú_reference_clonec   s6    


ÿþÿzPdfObject._reference_clonec                 C   s   | S )zResolve indirect references.r#   r!   r#   r#   r$   r:   �   s    zPdfObject.get_objectN©ÚstreamÚencryption_keyr   c                 C   s   t ‚d S ©N)r.   ©r"   rA   rB   r#   r#   r$   Úwrite_to_stream”   s    zPdfObject.write_to_stream)Fr#   )F)N)r'   Ú
__module__Ú__qualname__ÚhashlibÚsha1r   r   Ú__annotations__r   Úbytesr%   r)   r   Úboolr	   r
   ÚstrÚintr0   r   r   r?   r:   r   rE   r#   r#   r#   r$   r   4   s.   
  üû ÿþ- ÿþr   c                   @   sr   e Zd Zdeeeeeee	f   d dœdd„Z
deedeef ddœdd	„Zeed d
œdd„ƒZedœdd„ZdS )Ú
NullObjectFr#   r*   c                 C   s   t d|  tƒ ||¡ƒS )úClone object into pdf_dest.rO   )r   r?   rO   r/   r#   r#   r$   r0   ›   s    ÿzNullObject.cloneNr@   c                 C   s    |d urt ddƒ | d¡ d S )Nú/the encryption_key parameter of write_to_streamú5.0.0ó   null)r   ÚwriterD   r#   r#   r$   rE   ¦   s
    ÿzNullObject.write_to_stream©rA   r   c                 C   s    |   d¡}|dkrtdƒ‚tƒ S )Né   rS   zCould not read Null object)Úreadr   rO   )rA   Znulltxtr#   r#   r$   Úread_from_stream¯   s    
zNullObject.read_from_streamr   c                 C   s   dS )NrO   r#   r!   r#   r#   r$   Ú__repr__¶   s    zNullObject.__repr__)Fr#   )N)r'   rF   rG   r   rL   r   r	   r
   rM   rN   r0   r   rK   rE   ÚstaticmethodrX   rY   r#   r#   r#   r$   rO   š   s      üû ÿþ	rO   c                   @   s’   e Zd Zeddœdd„Zdeeeee	e
ef   d dœdd	„Zeed
œdd„Ze
dœdd„Zdee	de
ef ddœdd„Zeed dœdd„ƒZdS )ÚBooleanObjectN©Úvaluer   c                 C   s
   || _ d S rC   ©r]   )r"   r]   r#   r#   r$   Ú__init__»   s    zBooleanObject.__init__Fr#   r*   c                 C   s   t d|  t| jƒ||¡ƒS )rP   r[   )r   r?   r[   r]   r/   r#   r#   r$   r0   ¾   s    þzBooleanObject.clone)Ú_BooleanObject__or   c                 C   s2   t |tƒr| j|jkS t |tƒr*| j|kS dS d S )NF)Ú
isinstancer[   r]   rL   )r"   r`   r#   r#   r$   Ú__eq__Ê   s
    


zBooleanObject.__eq__r   c                 C   s   | j r
dS dS )NÚTrueÚFalser^   r!   r#   r#   r$   rY   Ò   s    zBooleanObject.__repr__r@   c                 C   s2   |d urt ddƒ | jr$| d¡ n
| d¡ d S )NrQ   rR   ó   trues   false)r   r]   rT   rD   r#   r#   r$   rE   Õ   s    ÿzBooleanObject.write_to_streamrU   c                 C   s@   |   d¡}|dkrtdƒS |dkr4|   d¡ tdƒS tdƒ‚d S )NrV   re   Ts   falsr1   FzCould not read Boolean object)rW   r[   r   )rA   Úwordr#   r#   r$   rX   á   s    

zBooleanObject.read_from_stream)Fr#   )N)r'   rF   rG   r   r_   r   rL   r   r	   r
   rM   rN   r0   Úobjectrb   rY   r   rK   rE   rZ   rX   r#   r#   r#   r$   r[   º   s$     üû ÿþr[   c                   @   s  e Zd Zeeeddœdd„Zd*eeee	e
eef   d dœdd	„Zed d
œdd„ƒZed d
œdd„Zed dœdd„Zed d
œdd„Zeedœdd„Zeedœdd„Zed
œdd„Zed
œdd„Zeedœd d!„Zeedœd"d#„Zd+ee
deef dd$œd%d&„Zeeed d'œd(d)„ƒZdS ),r   N)r9   Ú
generationr2   r   c                 C   s   || _ || _|| _d S rC   )r9   rh   r2   )r"   r9   rh   r2   r#   r#   r$   r_   î   s    zIndirectObject.__init__Fr#   r*   c                 C   sü   | j |kr|s| S t| j ƒ|jvr2i |jt| j ƒ< | j|jt| j ƒ v rœ| |jt| j ƒ | j ¡}|rÜ|dustJ ‚|jdus‚J ‚|j}t|j|j|j ƒS n@|  ¡ }|du rÈtƒ }t	| tfƒsÂJ ‚| |_| 
| |||¡¡}|dusèJ ‚|jdusöJ ‚|jS )rP   N)r2   r7   r8   r9   r:   r   r   rh   rO   ra   Z_add_objectr0   )r"   r+   r,   r-   ÚdupZidrefr>   r#   r#   r$   r0   ó   s,    ÿzIndirectObject.cloner   c                 C   s   | S rC   r#   r!   r#   r#   r$   r     s    z!IndirectObject.indirect_referencer   c                 C   s   | j  | ¡S rC   )r2   r:   r!   r#   r#   r$   r:     s    zIndirectObject.get_object)Úmemor   c                 C   s   t | j| j| jƒS rC   )r   r9   rh   r2   )r"   rj   r#   r#   r$   Ú__deepcopy__  s    zIndirectObject.__deepcopy__c                 C   s0   |   ¡ }t|tƒr,t|  ¡ › d| ¡ › �ƒ‚|S )Nz references an IndirectObject )r:   ra   r   r   rY   )r"   Úor#   r#   r$   Ú_get_object_with_check!  s    
ÿz%IndirectObject._get_object_with_check)Únamer   c                 C   s8   zt |  ¡ |ƒW S  ty2   td|› d�ƒ‚Y n0 d S )NzNo attribute z* found in IndirectObject or pointed object)Úgetattrrm   r4   )r"   rn   r#   r#   r$   Ú__getattr__*  s    
ÿzIndirectObject.__getattr__)Úkeyr   c                 C   s   |   ¡ | S rC   )rm   )r"   rq   r#   r#   r$   Ú__getitem__3  s    zIndirectObject.__getitem__c                 C   s   |   ¡  ¡ S rC   )r:   Ú__str__r!   r#   r#   r$   rs   7  s    zIndirectObject.__str__c                 C   s"   d| j ›d| j›dt| jƒ› d�S )NzIndirectObject(z, ú))r9   rh   r7   r2   r!   r#   r#   r$   rY   ;  s    zIndirectObject.__repr__)Úotherr   c                 C   s6   |d uo4t |tƒo4| j|jko4| j|jko4| j|ju S rC   )ra   r   r9   rh   r2   ©r"   ru   r#   r#   r$   rb   >  s    ÿ
þ
ý
ûzIndirectObject.__eq__c                 C   s   |   |¡ S rC   )rb   rv   r#   r#   r$   Ú__ne__G  s    zIndirectObject.__ne__r@   c                 C   s4   |d urt ddƒ | | j› d| j› d� ¡ ¡ d S )NrQ   rR   ú z R)r   rT   r9   rh   r    rD   r#   r#   r$   rE   J  s
    ÿzIndirectObject.write_to_stream©rA   r2   r   c                 C   sœ   d}|   d¡}|sttƒ‚| ¡ r$q.||7 }qd}|   d¡}|sHttƒ‚| ¡ rX|sbq2qb||7 }q2t| ƒ}|dkrˆtdt|  ¡ ƒ› �ƒ‚tt	|ƒt	|ƒ|ƒS )Nó    r1   ó   Rz0Error reading indirect object reference at byte )
rW   r   r   Úisspacer   r   ÚhexÚtellr   rN   )rA   r2   r9   Útokrh   Úrr#   r#   r$   rX   S  s,    



ÿzIndirectObject.read_from_stream)Fr#   )N)r'   rF   rG   rN   r   r_   r   rL   r   r	   r
   rM   r0   Úpropertyr   r:   rk   rm   rp   rr   rs   rY   rg   rb   rw   r   rK   rE   rZ   rX   r#   r#   r#   r$   r   í   s6     üû$			 ÿþ	r   é   c                   @   sš   e Zd Zdeeef ee d dœdd„Zdeeee	eee
f   d dœd	d
„Zedœdd„Zedœdd„Zedœdd„Zdeedeef ddœdd„ZdS )ÚFloatObjectú0.0N)r]   Úcontextr   c              
   C   sf   zt t|ƒƒ}t  | |¡W S  ty` } z.t|› d|› d�tƒ t  | d¡W  Y d }~S d }~0 0 d S )Nz : FloatObject (z) invalid; use 0.0 insteadg        )Úfloatr   Ú__new__r3   r   r'   )Úclsr]   r…   Úer#   r#   r$   r‡   s  s    ÿzFloatObject.__new__Fr#   r*   c                 C   s   t d|  t| ƒ||¡ƒS )rP   rƒ   )r   r?   rƒ   r/   r#   r#   r$   r0   �  s    þzFloatObject.cloner   c                 C   sF   | dkrdS t ttt| ƒƒƒ }| dtd|ƒ› d�› d¡ d¡}|S )Nr   r„   Ú.r1   ÚfÚ0)ÚFLOAT_WRITE_PRECISIONrN   r   ÚabsÚmaxÚrstrip)r"   ÚnbÚsr#   r#   r$   Úmyrepr�  s
    "zFloatObject.myreprc                 C   s   |   ¡ S rC   )r“   r!   r#   r#   r$   rY   ”  s    zFloatObject.__repr__c                 C   s   t | ƒS rC   )r†   r!   r#   r#   r$   Ú
as_numeric—  s    zFloatObject.as_numericr@   c                 C   s*   |d urt ddƒ | |  ¡  d¡¡ d S ©NrQ   rR   Úutf8)r   rT   r“   r    rD   r#   r#   r$   rE   š  s
    ÿzFloatObject.write_to_stream)r„   N)Fr#   )N)r'   rF   rG   r
   rM   r   r   r‡   rL   r	   rN   r0   r“   rY   r†   r”   r   rK   rE   r#   r#   r#   r$   rƒ   r  s*    ÿþ  üû ÿþrƒ   c                   @   s�   e Zd Ze d¡Zed dœdd„Zdeee	e
eeef   d dœdd	„Zed
œdd„Zdeedeef ddœdd„Zeeed dœdd„ƒZdS )ÚNumberObjects	   [^+-.0-9]r\   c                 C   sH   zt  | t |ƒ¡W S  tyB   td|› d�tƒ t  | d¡ Y S 0 d S )NzNumberObject(z) invalid; use 0 insteadr   )rN   r‡   Ú
ValueErrorr   r'   )rˆ   r]   r#   r#   r$   r‡   §  s
    zNumberObject.__new__Fr#   r*   c                 C   s   t d|  t| ƒ||¡ƒS )rP   r—   )r   r?   r—   r/   r#   r#   r$   r0   ®  s    þzNumberObject.cloner   c                 C   s   t t| ƒ d¡ƒS )Nr–   )rN   Úreprr    r!   r#   r#   r$   r”   º  s    zNumberObject.as_numericNr@   c                 C   s*   |d urt ddƒ | t| ƒ d¡¡ d S r•   )r   rT   r™   r    rD   r#   r#   r$   rE   ½  s
    ÿzNumberObject.write_to_stream)r—   rƒ   rU   c                 C   s*   t | tjƒ}| d¡dkr"t|ƒS t|ƒS )Nó   .éÿÿÿÿ)r   r—   ÚNumberPatternÚfindrƒ   )rA   Únumr#   r#   r$   rX   Æ  s    zNumberObject.read_from_stream)Fr#   )N)r'   rF   rG   ÚreÚcompilerœ   r   r‡   rL   r   r	   r
   rM   rN   r0   r”   r   rK   rE   rZ   rX   r#   r#   r#   r$   r—   ¤  s$   

  üû ÿþ	r—   c                   @   sf   e Zd ZdZdeeeeee	e
f   d dœdd„Zeedœdd	„ƒZdeed
e	ef d
dœdd„Zd
S )ÚByteStringObjecta>  
    Represents a string object where the text encoding could not be determined.

    This occurs quite often, as the PDF spec doesn't provide an alternate way to
    represent strings -- for example, the encryption data stored in files (like
    /O) is clearly not text, but is still stored in a "String" object.
    Fr#   r*   c                 C   s   t d|  tt| ƒƒ||¡ƒS )rP   r¡   )r   r?   r¡   rK   r/   r#   r#   r$   r0   ×  s    ÿþzByteStringObject.cloner   c                 C   s   | S )z7For compatibility with TextStringObject.original_bytes.r#   r!   r#   r#   r$   Úoriginal_byteså  s    zByteStringObject.original_bytesNr@   c                 C   s:   |d urt ddƒ | d¡ | t | ¡¡ | d¡ d S )NrQ   rR   ó   <ó   >)r   rT   ÚbinasciiÚhexlifyrD   r#   r#   r$   rE   ê  s    ÿ
z ByteStringObject.write_to_stream)Fr#   )N)r'   rF   rG   Ú__doc__r   rL   r   r	   r
   rM   rN   r0   r�   rK   r¢   r   rE   r#   r#   r#   r$   r¡   Î  s      üû ÿþr¡   c                   @   s¬   e Zd ZU dZeed< eed< eed< ed dœdd„Zdeee	e
eeef   d d
œdd„Zeedœdd„ƒZedœdd„Zedœdd„Zdeedeef ddœdd„ZdS )ÚTextStringObjectzë
    A string object that has been decoded into a real unicode string.

    If read from a PDF document, this string appeared to match the
    PDFDocEncoding, or contained a UTF-16BE BOM mark to cause UTF-16 decoding
    to occur.
    Úautodetect_pdfdocencodingÚautodetect_utf16Ú	utf16_bomr\   c                 C   sˆ   t |tƒr| d¡}t | |¡}d|_d|_d|_| d¡rXd|_|d d…  	d¡|_n,zt
|ƒ d|_W n ty‚   d|_Y n0 |S )NÚcharmapFrz   )u   Ã¾Ã¿u   Ã¿Ã¾Tr   )ra   rK   ÚdecoderM   r‡   rª   r©   r«   Ú
startswithr    Úencode_pdfdocencodingÚUnicodeEncodeError)rˆ   r]   rl   r#   r#   r$   r‡     s    



zTextStringObject.__new__Fr#   r*   c                 C   s4   t | ƒ}| j|_| j|_| j|_td|  |||¡ƒS )rP   r¨   )r¨   r©   rª   r«   r   r?   )r"   r+   r,   r-   r>   r#   r#   r$   r0     s    ÿzTextStringObject.cloner   c                 C   s   |   ¡ S )a-  
        It is occasionally possible that a text string object gets created where
        a byte string object was expected due to the autodetection mechanism --
        if that occurs, this "original_bytes" property can be used to
        back-calculate what the original encoded bytes were.
        )Úget_original_bytesr!   r#   r#   r$   r¢   $  s    zTextStringObject.original_bytesc                 C   sd   | j rJ| jtjkr"tj|  d¡ S | jtjkr>tj|  d¡ S |  d¡S n| jrXt| ƒS tdƒ‚d S )Núutf-16leúutf-16bez#no information about original bytes)	rª   r«   ÚcodecsÚBOM_UTF16_LEr    ÚBOM_UTF16_BEr©   r¯   r3   r!   r#   r#   r$   r±   .  s    z#TextStringObject.get_original_bytesc                 C   s€   z"| j rtdddddƒ‚t| ƒ}W nX tyz   | jtjkrNtj|  d¡ }n(| jtjkrltj|  d¡ }n
|  d¡}Y n0 |S )NÚ Zforcedr›   r²   r³   )rª   r°   r¯   r«   r´   rµ   r    r¶   )r"   Úbytearrr#   r#   r$   Úget_encoded_bytes@  s    z"TextStringObject.get_encoded_bytesNr@   c                 C   sv   |d urt ddƒ |  ¡ }| d¡ |D ]>}t|ƒ ¡ sT|dkrT| d|  ¡ ¡ q(| tt|ƒƒ¡ q(| d¡ d S )NrQ   rR   ó   (ó    z\%03oó   ))r   r¹   rT   ÚchrÚisalnumr    r   )r"   rA   rB   r¸   Úcr#   r#   r$   rE   Q  s    ÿ
z TextStringObject.write_to_stream)Fr#   )N)r'   rF   rG   r§   rL   rJ   rK   r   r‡   r   r	   r
   rM   rN   r0   r�   r¢   r±   r¹   r   rE   r#   r#   r#   r$   r¨   ö  s,   
  üû	 ÿþr¨   c                   @   sÒ   e Zd ZU e d¡ZdZddddddœd	d
„ edƒD ƒ¥Ze	e
eef  ed< d eeeeeeef   d dœdd„Zd!eedeef ddœdd„Zedœdd„Zeeedœdd„ƒZdZeeed dœdd„ƒZdS )"Ú
NameObjects   \s+|[\(\)<>\[\]{}/%]ó   /s   #23s   #28s   #29s   #2Fs   #25)ú#ú(rt   ú/ú%c                 C   s"   i | ]}t |ƒd |d›� ¡ “qS )rÂ   Ú02X)r½   r    )Ú.0r=   r#   r#   r$   Ú
<dictcomp>o  rz   zNameObject.<dictcomp>é!   Úrenumber_tableFr#   r*   c                 C   s   t d|  t| ƒ||¡ƒS )rP   rÀ   )r   r?   rÀ   r/   r#   r#   r$   r0   r  s    þzNameObject.cloneNr@   c                 C   s$   |d urt ddƒ | |  ¡ ¡ d S )NrQ   rR   )r   rT   ÚrenumberrD   r#   r#   r$   rE   ~  s
    ÿzNameObject.write_to_streamr   c              	   C   s    | d   d¡}|dkr(td| › d�dƒ | dd … D ]f}|dkrf|  d¡D ]}|d	|d
›�  ¡ 7 }qJq4z|| j| 7 }W q4 ty˜   ||  d¡7 }Y q40 q4|S )Nr   úutf-8rÁ   z<Incorrect first char in NameObject, should start with '/': (rt   z6.0.0r1   ú~rÂ   rÆ   )r    r   rÊ   ÚKeyError)r"   Úoutr¿   Úxr#   r#   r$   rË   ‡  s    
þzNameObject.renumber)Úsinr   c                 C   s~   |   dd¡}|dkrzzH| d |… t| |d |d … ƒ | |d d …  } |   d|d ¡}W q tyv   |d }Y q0 q| S )Nó   #r   r1   é   )r�   r   r˜   )rÑ   r=   r#   r#   r$   Úunnumber™  s    4zNameObject.unnumber)rÌ   ÚgbkÚlatin1ry   c              
   C   sö   |   d¡}|tjkrtdƒ‚|t| tjƒ7 }zXt |¡}tjD ]2}z| |¡}t|ƒW   W S  t	yn   Y q>0 q>t
d|dddƒ‚W nl tt
fyð } zP|jsÊtd|›d�tƒ t| d¡ƒW  Y d }~S td|›d	�ƒ|‚W Y d }~n
d }~0 0 d S )
Nr1   zname read errorr·   r   zCode Not Foundz!Illegal character in NameObject (z-), you may need to adjust NameObject.CHARSETSr¬   z.). You may need to adjust NameObject.CHARSETS.)rW   rÀ   Úsurfixr   r   Údelimiter_patternrÔ   ÚCHARSETSr­   r3   ÚUnicodeDecodeErrorr°   Ústrictr   r'   )rA   r2   rn   ÚencÚretr‰   r#   r#   r$   rX   ¨  s2    





ý
ÿýzNameObject.read_from_stream)Fr#   )N)r'   rF   rG   rŸ   r    rØ   r×   ÚrangerÊ   r   r   rM   rK   rJ   r   rL   r   r	   r
   rN   r0   r   rE   rË   rZ   rÔ   rÙ   rX   r#   r#   r#   r$   rÀ   f  s:   

ûú  üû ÿþ	rÀ   )Úunicode_stringr   c              
   C   sT   t ƒ }| D ]@}z|ttt| ƒƒ7 }W q
 tyH   td|dddƒ‚Y q
0 q
t|ƒS )NZpdfdocencodingr›   z#does not exist in translation table)Ú	bytearrayr   r½   r   rÎ   r°   rK   )rß   Úretvalr¿   r#   r#   r$   r¯   È  s    
ÿr¯   )2r¥   r´   rH   rŸ   r   Úmathr   Útypingr   r   r   r   r   r	   r
   r   Ú_codecsr   Z
_protocolsr   r   Ú_utilsr   r   r   r   r   r   r   Úerrorsr   r   r   Ú
__author__Ú__author_email__r   rO   r[   r   r�   r†   rƒ   rN   r—   rK   r¡   rM   r¨   rÀ   r¯   r#   r#   r#   r$   Ú<module>   s0   ($	f 3 2*(pb