o
    ë6Wj¬7  ã                	   @   sH  U d Z dZd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 ddlmZ dd	lmZmZmZmZmZmZmZmZmZ zdd
lmZ W n eyX   dd
lmZ Y nw ddlmZmZmZ eeeeef eeeef eeeef f Z ee!d< eeeeeeef Z"ee!d< eZ#ee$e#f Z%dZ&dZ'dZ(dZ)de*de*de*fdd„Z+dnde#dee, de*fdd„Z-de#de*fdd„Z.de#de/fdd„Z0de#ddfd d!„Z1	"dode#d#ee* d$e/de*fd%d&„Z2de#d'e,de*fd(d)„Z3de#de*fd*d+„Z4d,e d-e de fd.d/„Z5de#ddfd0d1„Z6i Z7eee$e*f e*f e!d2< d3ee$e*f de*fd4d5„Z8ed-e$de$fd6d7„ƒZ9ed-e*de$fd8d7„ƒZ9d-ee$e*f de$fd9d7„Z9ed-e$de,fd:d;„ƒZ:ed-e*de*fd<d;„ƒZ:ed-e,de,fd=d;„ƒZ:d-ee,e$e*f dee,e*f fd>d;„Z:d-e*de*fd?d@„Z;dAe,de$fdBdC„Z<dDZ=dEe,dFe,dGe,de,fdHdI„Z>dpdKe$dLe,ddfdMdN„Z?dKe$ddfdOdP„Z@	QdqdRe$dSe$dTe$ddfdUdV„ZA	QdqdRe$dSe$dTe$ddfdWdX„ZBdqdYe$dTe$ddfdZd[„ZCdqdYe$dTe$ddfd\d]„ZDdKe$d^e$ddfd_d`„ZEdae$defdbdc„ZF	"dodde$deee$ef daee$e$f dfe/fdgdh„ZGdie,de$fdjdk„ZHe	G dldm„ dmƒƒZIdS )rz"Utility functions for PDF library.zMathieu Fenniakzbiziqe@mathieu.fenniak.neté    N©Ú
getencoder)Ú	dataclass)ÚDEFAULT_BUFFER_SIZE)ÚSEEK_CUR)	ÚIOÚAnyÚCallableÚDictÚOptionalÚPatternÚTupleÚUnionÚoverload)Ú	TypeAliasé   )ÚSTREAM_TRUNCATED_PREMATURELYÚDeprecationErrorÚPdfStreamErrorÚTransformationMatrixTypeÚCompressedTransformationMatrixz2{} is deprecated and will be removed in PyPDF2 {}.z.{} is deprecated and was removed in PyPDF2 {}.zE{} is deprecated and will be removed in PyPDF2 3.0.0. Use {} instead.z>{} is deprecated and was removed in PyPDF2 {}. Use {} instead.Úheader1Úheader2Úreturnc                 C   sf   d}g }| |v r|  | | ¡¡ ||v r|  | |¡¡ t|ƒdkr-td| ›d|›d�ƒ‚|t|ƒ S )N)s   %PDF-1.3s   %PDF-1.4s   %PDF-1.5s   %PDF-1.6s   %PDF-1.7s   %PDF-2.0r   zneither z nor z are proper headers)ÚappendÚindexÚlenÚ
ValueErrorÚmax)r   r   ÚversionsÚpdf_header_indices© r!   ú\/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/PyPDF2/_utils.pyÚ_get_max_pdf_version_headerO   s   r#   ÚstreamÚmaxcharsc                 C   s>   d}	 |   d¡}| ¡ s|s	 |S ||7 }t|ƒ|kr	 |S q)z~
    Read non-whitespace characters and return them.

    Stops upon encountering whitespace or when maxchars is reached.
    ó    Tr   )ÚreadÚisspacer   )r$   r%   ÚtxtÚtokr!   r!   r"   Úread_until_whitespaceb   s   
ýùr+   c                 C   s(   |   d¡}|tv r|   d¡}|tv s	|S )zEFind and read the next non-whitespace character (ignores whitespace).r   )r'   ÚWHITESPACES©r$   r*   r!   r!   r"   Úread_non_whitespaces   s
   

ÿr.   c                 C   s6   t d }d}|t v r|  d¡}|d7 }|t v s
|dkS )zr
    Similar to read_non_whitespace, but return a Boolean if more than
    one whitespace character was read.
    r   r   )r,   r'   )r$   r*   Úcntr!   r!   r"   Úskip_over_whitespace{   s   
þr0   c                 C   sD   |   d¡}|  dd¡ |dkr|dvr |   d¡}|dvsd S d S d S )Nr   éÿÿÿÿó   %)ó   
ó   )r'   Úseekr-   r!   r!   r"   Úskip_over_commentˆ   s   

ÿÿr6   FÚregexÚ
ignore_eofc                 C   sr   d}	 |   d¡}|s|r|S ttƒ‚| |¡}|dur4||d| ¡ … 7 }|  | ¡ t|ƒ d¡ 	 |S ||7 }q)zñ
    Read until the regular expression pattern matched (ignore the match).

    :raises PdfStreamError: on premature end-of-file
    :param bool ignore_eof: If true, ignore end-of-line and return immediately
    :param regex: re.Pattern
    r&   Té   Nr   )r'   r   r   ÚsearchÚstartr5   r   )r$   r7   r8   Únamer*   Úmr!   r!   r"   Úread_until_regex�   s   


ÿõr>   Úto_readc                 C   s>   |   ¡ |k r
tdƒ‚|  | t¡ |  |¡}|  | t¡ |S )z´
    Given a stream at position X, read a block of size to_read ending at position X.

    This changes the stream's position to the beginning of where the block was
    read.
    z!Could not read malformed PDF file)Útellr   r5   r   r'   )r$   r?   r'   r!   r!   r"   Úread_block_backwardsª   s   
rA   c                 C   s  g }d}|   ¡ dkrttƒ‚	 tt|   ¡ ƒ}|dkrndt| |ƒ}t|ƒd }|sF|dkr@|| dvr@|d8 }|dkr@|| dvs2|dkrFd}|rl| ||d d… ¡ |dkrk|| dv rk|d8 }|dkrk|| dv s]n| |¡ |dkr~|  |d t	¡ nqd 
|ddd… ¡S )	aª  
    Given a byte stream with current position X, return the previous line.

    All characters between the first CR/LF byte found before X
    (or, the start of the file, if no such byte is found) and position X
    After this call, the stream will be positioned one byte after the
    first non-CRLF character found beyond the first CR/LF byte before X,
    or, if no such byte is found, at the beginning of the stream.
    Fr   Tr   s   
Nr&   r1   )r@   r   r   Úminr   rA   r   r   r5   r   Újoin)r$   Úline_contentÚ
found_crlfr?   ÚblockÚidxr!   r!   r"   Úread_previous_line»   s8   

ÿÿ€
à"rH   ÚaÚbc                    s   t ‡ fdd„| D ƒƒS )Nc                 3   s*   � | ]‰ t ‡ fd d„tˆŽ D ƒƒV  qdS )c                 3   s(   � | ]}t d d„ tˆ |ƒD ƒƒV  qdS )c                 s   s$   � | ]\}}t |ƒt |ƒ V  qd S ©N)Úfloat)Ú.0ÚiÚjr!   r!   r"   Ú	<genexpr>ò   s   €" z6matrix_multiply.<locals>.<genexpr>.<genexpr>.<genexpr>N)ÚsumÚzip)rM   Úcol©Úrowr!   r"   rP   ò   s   €& z,matrix_multiply.<locals>.<genexpr>.<genexpr>N)ÚtuplerR   )rM   ©rJ   rT   r"   rP   ñ   s
   € ÿ
ÿz"matrix_multiply.<locals>.<genexpr>)rV   )rI   rJ   r!   rW   r"   Úmatrix_multiplyî   s   þrX   c                 C   sx   d}|   | d¡ tddƒ�}| |  |¡¡ | d¡ | |  |¡¡ W d  ƒ n1 s.w   Y  |   | d¡ dS )z5Create text file showing current location in context.iˆ  r   zPyPDF2_pdfLocation.txtÚwbs   HEREN)r5   ÚopenÚwriter'   )r$   ÚradiusÚ	output_fhr!   r!   r"   Úmark_location÷   s   
ýr^   ÚB_CACHEÚsc                 C   s|   t }| |v r
||  S t| tƒr| S z|  d¡}t| ƒdk r!||| < |W S  ty=   |  d¡}t| ƒdk r9||| < | Y S w )Núlatin-1é   zutf-8)r_   Ú
isinstanceÚbytesÚencoder   Ú	Exception)r`   ÚbcÚrr!   r!   r"   Úb_  s    


üri   c                 C   ó   d S rK   r!   rW   r!   r!   r"   Ústr_  ó   rk   c                 C   rj   rK   r!   rW   r!   r!   r"   rk     rl   c                 C   s   t | tƒr
|  d¡S | S )Nra   )rc   rd   ÚdecoderW   r!   r!   r"   rk   "  s   

c                 C   rj   rK   r!   rW   r!   r!   r"   Úord_)  rl   rn   c                 C   rj   rK   r!   rW   r!   r!   r"   rn   .  rl   c                 C   rj   rK   r!   rW   r!   r!   r"   rn   3  rl   c                 C   s   t | tƒr	t| ƒS | S rK   )rc   ÚstrÚordrW   r!   r!   r"   rn   8  s   
c                 C   s   t dƒ}|| ƒ}|d S )NÚ	hex_codecr   r   )rJ   ÚcoderÚcodedr!   r!   r"   Ú	hexencode>  s   rt   Únumc                 C   s   t | ƒ dd¡S )NÚLÚ )ÚhexÚreplace)ru   r!   r!   r"   Úhex_strE  s   rz   )ó    r3   r4   ó   	ó    ÚleftÚupÚup_leftc                 C   sT   | | | }t ||  ƒ}t || ƒ}t || ƒ}||kr"||kr"| S ||kr(|S |S rK   )Úabs)r~   r   r€   ÚpÚ	dist_leftÚdist_upÚdist_up_leftr!   r!   r"   Úpaeth_predictorL  s   r†   é   ÚmsgÚ
stacklevelc                 C   s   t j| t|d� d S )N)r‰   )ÚwarningsÚwarnÚDeprecationWarning)rˆ   r‰   r!   r!   r"   Ú	deprecateZ  s   r�   c                 C   s   t | ƒ‚rK   )r   )rˆ   r!   r!   r"   Údeprecation^  s   rŽ   ú3.0.0Úold_nameÚnew_nameÚ
removed_inc                 C   s   t t | ||¡dƒ dS )zS
    Raise an exception that a feature will be removed, but has a replacement.
    é   N)r�   ÚDEPR_MSGÚformat©r�   r‘   r’   r!   r!   r"   Údeprecate_with_replacementb  s   r—   c                 C   s   t t | ||¡ƒ dS )zW
    Raise an exception that a feature was already removed, but has a replacement.
    N)rŽ   ÚDEPR_MSG_HAPPENEDr•   r–   r!   r!   r"   Údeprecation_with_replacementk  s   r™   r<   c                 C   s   t t | |¡dƒ dS )zP
    Raise an exception that a feature will be removed without replacement.
    r“   N)r�   ÚDEPR_MSG_NO_REPLACEMENTr•   ©r<   r’   r!   r!   r"   Údeprecate_no_replacementt  s   rœ   c                 C   s   t t | |¡ƒ dS )zT
    Raise an exception that a feature was already removed without replacement.
    N)rŽ   Ú DEPR_MSG_NO_REPLACEMENT_HAPPENEDr•   r›   r!   r!   r"   Údeprecation_no_replacement{  s   rž   Úsrcc                 C   s   t  |¡ | ¡ dS )a“  
    Use this instead of logger.warning directly.

    That allows people to overwrite it more easily.

    ## Exception, warnings.warn, logger_warning
    - Exceptions should be used if the user should write code that deals with
      an error case, e.g. the PDF being completely broken.
    - warnings.warn should be used if the user needs to fix their code, e.g.
      DeprecationWarnings
    - logger_warning should be used if the user needs to know that an issue was
      handled by PyPDF2, e.g. a non-compliant PDF being read in a way that
      PyPDF2 could apply a robustness fix to still read it. This applies mainly
      to strict=False mode.
    N)ÚloggingÚ	getLoggerÚwarning)rˆ   rŸ   r!   r!   r"   Úlogger_warning‚  s   r£   Úaliasesc                     s   dt f‡ fdd„}|S )z¶
    Decorator for deprecated term "bookmark"
    To be used for methods and function arguments
        outline_item = a bookmark
        outline = a collection of outline items
    Úfuncc                    s   t  ˆ ¡‡‡ fdd„ƒ}|S )Nc                     s    t ˆj|ˆ dd� ˆ| i |¤ŽS )NT)Úfail)Úrename_kwargsÚ__name__)ÚargsÚkwargs)r¤   r¥   r!   r"   Úwrapperž  s   z9deprecation_bookmark.<locals>.decoration.<locals>.wrapper)Ú	functoolsÚwraps)r¥   r«   ©r¤   )r¥   r"   Ú
decoration�  s   z(deprecation_bookmark.<locals>.decoration)r	   )r¤   r¯   r!   r®   r"   Údeprecation_bookmark•  s   r°   Ú	func_namerª   r¦   c                 C   sŒ   |  ¡ D ]?\}}||v rC|rt|› d|› d�ƒ‚||v r/t| › d|› d|› d|› d|› d�
ƒ‚| |¡||< tj|› d|› d�td� qd	S )
z1
    Helper function to deprecate arguments.
    z# is deprecated as an argument. Use z insteadz received both z and z as an argument. z is deprecated. Use z	 instead.)ÚmessageÚcategoryN)Úitemsr   Ú	TypeErrorÚpoprŠ   r‹   rŒ   )r±   rª   r¤   r¦   Úold_termÚnew_termr!   r!   r"   r§   ¨  s*   ÿÿÿÿü€ôr§   rd   c                 C   sR   | dk r	| › d�S | dk r| d d›d�S | dk r!| d d›d�S | d d›d�S )	Niè  z Bytei@B z.1fz kBi Êš;z MBz GBr!   )rd   r!   r!   r"   Ú_human_readable_bytesÃ  s   
r¹   c                   @   s:   e Zd ZU eed< eed< defdd„Zdefdd„ZdS )	ÚFiler<   Údatar   c                 C   s   d| j › dtt| jƒƒ› d�S )Nú
File(name=ú, data: ú))r<   r¹   r   r»   ©Úselfr!   r!   r"   Ú__str__Ó  s   zFile.__str__c                 C   s*   d| j › dtt| jƒƒ› dt| jƒ› d�S )Nr¼   r½   z, hash: r¾   )r<   r¹   r   r»   Úhashr¿   r!   r!   r"   Ú__repr__Ö  s   *zFile.__repr__N)r¨   Ú
__module__Ú__qualname__ro   Ú__annotations__rd   rÁ   rÃ   r!   r!   r!   r"   rº   Î  s
   
 rº   rK   )F)r‡   )r�   )JÚ__doc__Ú
__author__Ú__author_email__r¬   r    rŠ   Úcodecsr   Údataclassesr   Úior   Úosr   Útypingr   r   r	   r
   r   r   r   r   r   r   ÚImportErrorÚtyping_extensionsÚerrorsr   r   r   rL   r   rÆ   r   Ú
StreamTypero   ÚStrByteTyperš   r�   r”   r˜   rd   r#   Úintr+   r.   Úboolr0   r6   r>   rA   rH   rX   r^   r_   ri   rk   rn   rt   rz   r,   r†   r�   rŽ   r—   r™   rœ   rž   r£   r°   r§   r¹   rº   r!   r!   r!   r"   Ú<module>   sÞ   ,ÿ&ÿÿ	ÿÿÿÿ
þ3ÿÿ
þ	$ÿÿÿÿ
þ
ÿÿÿÿ
þ	ÿÿ
ÿ
ÿ
ÿ