§
    �’j™<  ã                   ó   — 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 ddlmZ  e j        e¦  «        ZdZde	d	efd
„Zde	d	efd„Zde	d	efd„Zde	d	efd„Zded	efd„Zdeded	efd„Zde	ded	efd„Zde	d	efd„Zddee         ded	efd„ZdS )é    N)ÚBytesIO)ÚIOé   )ÚWHITESPACESÚWHITESPACES_AS_BYTESÚBinaryStreamTypeÚ
StreamTypeÚlogger_warningÚread_non_whitespace)ÚPdfReadErrori    ÚstreamÚreturnc                 óÖ   — t          | ¦  «        }||                      d¦  «        z  }|                      dd¦  «         |d d…         dk    o|dd…         dk    p|dd…         t          v S )Nr   éýÿÿÿé   ó   EIé   ó    )r   ÚreadÚseekr   )r   Úei_toks     úIC:\Projects\DSCons\.venv\Lib\site-packages\pypdf\generic\_image_inline.pyÚ_check_end_image_markerr   1   sn   € Ý  Ñ(Ô(€FØ
ˆf�kŠk˜!‰nŒnÑ€FØ
‡K‚K��AÑÔÐØ�"�1�"Œ:˜ÒÐU F¨1¨Q¨3¤K°3Ò$6Ð$T¸&ÀÀ1À¼+ÍÐ:TÐUr   c                 ó�  — t          ¦   «         }	 t          | ¦  «        |                      t          ¦  «        x}z   }|r|st	          d¦  «        ‚|                     d¦  «        }|dk    r;||d|dz   …         z  }|                      t          |¦  «         |z   dz   d¦  «         nö|                     d¦  «        }|dk    r�|                      t          |¦  «         |z   dz
  d¦  «         |                      d¦  «        }|t          v r9|                      dd¦  «         |                      d¦  «        }|dz  }|t          v °9||d|…         z  }nLt          |¦  «        d	k    r||z  }t	          d¦  «        ‚||dd…         z  }|                      dd¦  «         �Œ‹t          | ¦  «        st	          d
¦  «        ‚t          |¦  «        S )z`
    Extract HexEncoded stream from inline image.
    The stream will be moved onto the EI.
    TúUnexpected end of stream.ó   >r   Nr   r   éþÿÿÿr   úEI stream not found.)Ú	bytearrayr   r   ÚBUFFER_SIZEr   Úfindr   Úlenr   r   Úbytes)r   Údata_outÚ
read_bytesÚdata_bufferedÚpos_tokÚpos_eiÚcs          r   Ú extract_inline__ascii_hex_decoder*   8   sè  € õ
 ‰{Œ{€HðÝ+¨FÑ3Ô3ÀVÇ[Â[ÕQ\ÑE]ÔE]Ð7]°zÑ^ˆØð 	< Jð 	<ÝÐ:Ñ;Ô;Ð;Ø×$Ò$ TÑ*Ô*ˆØ�aŠ<ˆ<Ø˜ m¨°!© mÔ4Ñ4ˆHØ�KŠK�˜]Ñ+Ô+Ð+¨gÑ5¸Ñ9¸1Ñ=Ô=Ð=ØØ×#Ò# EÑ*Ô*ˆØ�QŠ;ˆ;Ø�KŠK�˜]Ñ+Ô+Ð+¨fÑ4°qÑ8¸!Ñ<Ô<Ð<Ø—’˜A‘”ˆAØ•{Ð"Ð"Ø—’˜B Ñ"Ô"Ð"Ø—K’K ‘N”N�Ø˜!‘�ð •{Ð"Ð"ð ˜ g v gÔ.Ñ.ˆHØÝˆ}ÑÔ Ò"Ð"Ø˜Ñ%ˆHÝÐ:Ñ;Ô;Ð;à�M # 2 #Ô&Ñ&ˆØ�Š�B˜ÑÔÐñ1õ4 # 6Ñ*Ô*ð 3ÝÐ1Ñ2Ô2Ð2Ý�‰?Œ?Ðr   c                 ó:  — t          ¦   «         }	 t          | ¦  «        |                      t          ¦  «        x}z   }|r|st	          d¦  «        ‚|                     d¦  «        }|dk    r;||d|dz   …         z  }|                      t          |¦  «         |z   dz   d¦  «         nKt          |¦  «        dk    r||z  }t	          d¦  «        ‚||dd…         z  }|                      dd¦  «         Œàt          | ¦  «        st	          d	¦  «        ‚t          |¦  «        S )
zY
    Extract A85 stream from inline image.
    The stream will be moved onto the EI.
    Tr   s   ~>r   Nr   r   r   r   )
r   r   r   r    r   r!   r   r"   r   r#   )r   r$   r%   r&   r'   s        r   Úextract_inline__ascii85_decoder,   ^   s?  € õ
 ‰{Œ{€HðÝ+¨FÑ3Ô3ÀVÇ[Â[ÕQ\ÑE]ÔE]Ð7]°zÑ^ˆØð 	< Jð 	<ÝÐ:Ñ;Ô;Ð;Ø×$Ò$ UÑ+Ô+ˆØ�aŠ<ˆ<Ø˜ m¨°!© mÔ4Ñ4ˆHØ�KŠK�˜]Ñ+Ô+Ð+¨gÑ5¸Ñ9¸1Ñ=Ô=Ð=ØÝˆ}ÑÔ Ò"Ð"Ø˜Ñ%ˆHÝÐ:Ñ;Ô;Ð;Ø�MØˆRˆCô
ñ 	
ˆð 	�Š�B˜ÑÔÐðõ" # 6Ñ*Ô*ð 3ÝÐ1Ñ2Ô2Ð2Ý�‰?Œ?Ðr   c                 óÐ  — t          ¦   «         }	 |                      t          ¦  «        }|st          d¦  «        ‚|                     d¦  «        }|dk    rÞ||dz   |dz   …         }|                     d¦  «        s|                     d¦  «        r;||d|dz   …         z  }|                      t          |¦  «         |z   dz   d¦  «         nht          d	t          ¬
¦  «         |                     d¦  «        }|dk    r7||d|…         z  }|                      t          |¦  «         |z   dz
  d¦  «         n||z  }�Œ+t          | ¦  «        st          d¦  «        ‚t          |¦  «        S )zj
    Extract RL (RunLengthDecode) stream from inline image.
    The stream will be moved onto the EI.
    Tr   ó   €r   r   é   r   Nz=Early EOD in RunLengthDecode of inline image, using fallback.)Úsourcer   )r   r   r    r   r!   Ú
startswithÚendswithr   r"   r
   Ú__name__r   r#   )r   r$   r&   r'   Úafter_tokenÚ	ei_markers         r   Ú!extract_inline__run_length_decoder6   {   s‹  € õ
 ‰{Œ{€Hð"ØŸš¥KÑ0Ô0ˆØð 	<ÝÐ:Ñ;Ô;Ð;Ø×$Ò$ WÑ-Ô-ˆØ�aŠ<ˆ<ð (¨°!©°gÀ±kÐ(AÔBˆKØ×%Ò% eÑ,Ô,ð H°×0DÒ0DÀUÑ0KÔ0Kð HØ˜M¨-¨G°a©K¨-Ô8Ñ8�Ø—’�S Ñ/Ô/Ð/°'Ñ9¸AÑ=¸qÑAÔAÐAÐAåÐ^ÕgoÐpÑpÔpÐpØ)×.Ò.¨uÑ5Ô5�	Ø˜q’=�=Ø ¨k°	¨kÔ :Ñ:�HØ—K’K¥ ]Ñ!3Ô!3Ð 3°iÑ ?À!Ñ CÀQÑGÔGÐGØØ�MÑ!ˆñ3"õ6 # 6Ñ*Ô*ð 3ÝÐ1Ñ2Ô2Ð2Ý�‰?Œ?Ðr   c                 óÔ  ‡ — dt           dt          fˆ fd„}t          ¦   «         }d}	  |d¦  «        }|s|dk    r||z  }|dk    rŒ d} |d¦  «        }||z  }|dk    r‰                      dd¦  «         nG|d	k    rn@|d
k    rn:|dv r5 |d¦  «        }||z  }|d         dz  |d         z   }| ||dz
  ¦  «        z  }Œ–t	          ‰ ¦  «        st          d¦  «        ‚t          |¦  «        S )z`
    Extract DCT (JPEG) stream from inline image.
    The stream will be moved onto the EI.
    Úlengthr   c                 óz   •— ‰                      | ¦  «        }|�t          |¦  «        | k    rt          d¦  «        ‚|S )Nr   )r   r"   r   )r8   Ú_resultr   s     €r   r   z(extract_inline__dct_decode.<locals>.read§   s?   ø€ ð —+’+˜fÑ%Ô%ˆØˆ?�c '™lœl¨fÒ4Ð4ÝÐ:Ñ;Ô;Ð;Øˆr   FTr   ó   ÿéÿÿÿÿó    ó   Ùs&   ÀÁÂÃÄÅÆÇÉÊËÌÍÎÏÚÛÜÝÞßàáâãäåæçèéêëìíîïþr   r   é   r   )Úintr#   r   r   r   r   )r   r   r$   Ú	not_firstr)   Úszs   `     r   Úextract_inline__dct_decoderC   ¢   sT  ø€ ð
•Sð �Uð ð ð ð ð ð õ ‰{Œ{€Hð €Ið%ØˆD�‰GŒGˆØð 	˜˜gš˜Ø˜‰MˆHØ�Š<ˆ<ØØˆ	ØˆD�‰GŒGˆØ�A‰ˆØ�Š<ˆ<Ø�KŠK˜˜AÑÔÐÐØ�'Š\ˆ\ØØ�'Š\ˆ\ØØðTð
ð 
ð
 ��Q‘”ˆAØ˜‰MˆHØ�1”˜‘˜a œdÑ"ˆBØ˜˜˜R !™V™œÑ$ˆHð/%õ2 # 6Ñ*Ô*ð 3ÝÐ1Ñ2Ô2Ð2Ý�‰?Œ?Ðr   Ú
stream_outÚpositionc                 óÐ   — |dk    rdS |                       ¦   «         }|                      |dz
  ¦  «         |                      d¦  «        t          v }|                      |¦  «         |S )a3  
    Check whether the byte in front of `position` is a whitespace.

    Returns:
        Whether the preceding byte is whitespace. If no preceding byte exists,
        returns ``False`` because the ``EI`` marker is at the beginning of the
        image data and is therefore not delimited by anything.
    r   Fr   )Útellr   r   r   )rD   rE   Úsaved_positionÚis_whitespaces       r   Ú_is_preceded_by_whitespacerJ   Ñ   sg   € ð �1‚}€}ØˆuØ—_’_Ñ&Ô&€Nð ‡O‚O�H˜q‘LÑ!Ô!Ð!Ø—O’O AÑ&Ô&­+Ð5€MØ‡O‚O�NÑ#Ô#Ð#ØÐr   Ú
first_bytec                 óF  — |                       ¦   «         }|dk    r%|                      d¦  «        }|dk    p|t          v }nK|dk    rC|                      d¦  «        }|dd…         dk    o|dd…         dk    p|dd…         t          v }nd	}|                      |d
¦  «         |S )a<  
    Check whether `first_byte` starts an exact `Q` or `EMC` operator.

    `first_byte` has already been consumed from the stream, which is restored to its
    current position afterwards. Looking at this byte alone is not sufficient, as
    binary image data can easily be mistaken for one of these operators.
    ó   Qr   r   ó   Er   Nr   s   MCFr   )rG   r   r   r   )r   rK   rE   ÚsuffixÚis_closing_operators        r   Ú _is_followed_by_closing_operatorrQ   å   sº   € ð �{Š{‰}Œ}€HØ�TÒÐØ—’˜Q‘”ˆØ$¨šmÐD¨v½Ð/DÐÐØ	�tÒ	Ð	Ø—’˜Q‘”ˆØ$ R a Rœj¨EÒ1Ðh°v¸aÀ¸c´{ÀcÒ7IÐ7gÈVÐTUÐVWÐTWÌ[Õ\gÐMgÐÐà#ÐØ
‡K‚K�˜!ÑÔÐØÐr   c                 ó”  — t          ¦   «         }	 |                      t          ¦  «        }|st          d¦  «        ‚|                     d¦  «        }|dk    r|                     |¦  «         �nÇ|                     |d|dz   …         ¦  «         |                     ¦   «         dz
  }|                      |dz   t          |¦  «        z
  d¦  «         |                      ¦   «         }|                      d¦  «        }|dk    r|                      |d¦  «         �Œ|                      d¦  «        }|dk    r/|                      |dz
  d¦  «         | 	                    |¦  «         nØ|t          vr|                      |d¦  «         �Œp|t          v r|                      d¦  «        }|t          v °t          ||¦  «        s(t          | |¦  «        s|                      |d¦  «         �ŒÏt          | ¦  «        r|                      |d¦  «         �Œö|                      |dz
  d¦  «         | 	                    |¦  «         n�Œ&|                     ¦   «         S )	zLegacy method, used by defaultTr   rN   r<   r   r   ó   Ir   )r   r   r    r   r!   ÚwriterG   r   r"   Útruncater   rJ   rQ   Úis_followed_by_binary_dataÚgetvalue)r   rD   r&   r(   Ú
sav_pos_eiÚ	saved_posÚtok2Útok3s           r   Úextract_inline_defaultr\   ú   sW  € å‘”€Jð4ØŸš¥KÑ0Ô0ˆØð 	<ÝÐ:Ñ;Ô;Ð;Ø×#Ò#Øñ
ô 
ˆð �RŠ<ˆ<Ø×Ò˜]Ñ+Ô+Ð+Ñ+ð ×Ò˜]¨1¨v¸©z¨>Ô:Ñ;Ô;Ð;Ø#ŸšÑ*Ô*¨QÑ.ˆJà�KŠK˜ ™
¥S¨Ñ%7Ô%7Ñ7¸Ñ;Ô;Ð;ØŸš™œˆIà—;’;˜q‘>”>ˆDØ�tŠ|ˆ|Ø—’˜I qÑ)Ô)Ð)ÙØ—;’;˜q‘>”>ˆDØ�sŠ{ˆ{ð —’˜I¨™M¨1Ñ-Ô-Ð-Ø×#Ò# JÑ/Ô/Ð/ØØ�;Ð&Ð&Ø—’˜I qÑ)Ô)Ð)ÙØ�+Ð%Ð%Ø—{’{ 1‘~”~�ð �+Ð%Ð%õ
 .¨j¸*ÑEÔEð ÕNnØ˜ñOô Oð ð —’˜I qÑ)Ô)Ð)ÙÝ)¨&Ñ1Ô1ð ð —’˜I qÑ)Ô)Ð)Ùð �KŠK˜	 A™ qÑ)Ô)Ð)Ø×Ò 
Ñ+Ô+Ð+Øñi4ðl ×ÒÑ Ô Ð r   é
   r8   c                 óÚ  — |                       ¦   «         }|                      |¦  «        }|                      |¦  «         |sdS d}d}t          |¦  «        D ].\  }}|dk     r|t          vr dS |t          v }|€|s|}|�|r|} nŒ/|€dS |€|}||z
  }	|||…         }
|
                     d¦  «        r|	dk    rdS |
                     dd¦  «                             ¦   «         rdS |	d	k    rdS dS )
a×  
    Check if the next bytes of the stream look like binary image data or regular page content.

    This is just some heuristics due to the PDF specification being too imprecise about
    inline images containing the `EI` marker which would end an image. Starting with PDF 2.0,
    we finally get a mandatory length field, but with (proper) PDF 2.0 support being very limited
    everywhere, we should not expect to be able to remove such hacks in the near future - especially
    considering legacy documents as well.

    The actual implementation draws some inspiration from
    https://github.com/itext/itext-java/blob/9.1.0/kernel/src/main/java/com/itextpdf/kernel/pdf/canvas/parser/util/InlineImageParsingUtils.java
    FNé    Tó   /r   ó   .r   r   )rG   r   r   Ú	enumerater   r1   ÚreplaceÚisdigit)r   r8   rE   ÚdataÚoperator_startÚoperator_endÚindexÚbyterI   Úoperator_lengthÚoperators              r   rV   rV   7  sH  € ð �{Š{‰}Œ}€HØ�;Š;�vÑÔ€DØ
‡K‚K�ÑÔÐØð ØˆuØ€NØ€Lå  ‘”ð ð ‰ˆˆtØ�"Š9ˆ9˜Õ%9Ð9Ð9ð �4�4ØÕ 4Ð4ˆØÐ!¨-Ð!à"ˆNØÐ%¨-Ð%ð !ˆLØˆEøàÐàˆuØÐàˆØ" ^Ñ3€OØ�N <Ð/Ô0€HØ×Ò˜4Ñ Ô ð  _°qÒ%8Ð%8àˆuØ×Ò˜˜cÑ"Ô"×*Ò*Ñ,Ô,ð àˆuØ˜ÒÐð ˆtØˆ5r   )r]   )ÚloggingÚior   Útypingr   Ú_utilsr   r   r   r	   r
   r   Úerrorsr   Ú	getLoggerr3   Úloggerr    Úboolr   r#   r*   r,   r6   rC   r@   rJ   rQ   r\   rV   © r   r   ú<module>ru      s  ðð8 €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð "Ð !Ð !Ð !Ð !Ð !à	ˆÔ	˜8Ñ	$Ô	$€ð €ðV Jð V°4ð Vð Vð Vð Vð#¨Zð #¸Eð #ð #ð #ð #ðL¨:ð ¸%ð ð ð ð ð:$¨jð $¸Uð $ð $ð $ð $ðN,Ð'7ð ,¸Eð ,ð ,ð ,ð ,ð^¨7ð ¸cð Àdð ð ð ð ð(¨Zð ÀUð Ètð ð ð ð ð*:! :ð :!°%ð :!ð :!ð :!ð :!ðz6ð 6 r¨%¤yð 6¸#ð 6Àtð 6ð 6ð 6ð 6ð 6ð 6r   