
    *'hNK                        U d Z dZdZddlZ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
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 ej4                  dd
 dk\  rddlmZ nddlmZ ej4                  dk\  rddlmZ nddlmZ 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e   Z&ee'e&f   Z(dee'   dee
   fdZ)de'de'de'fdZ*dZ+djY                  e+      Z-de-z   dz   Z.dNde&dee/   de0fdZ1de&de0fd Z2de&de3fd!Z4d"e0de3fd#Z5de&ddfd$Z6de&d%ee0   de0fd&Z7de&d'e/de0fd(Z8de&de0fd)Z9d*e#d+e#de#fd,Z:de&ddfd-Z;ed+e'de/fd.       Z<ed+e0de0fd/       Z<ed+e/de/fd0       Z<d+ee/e'e0f   dee/e0f   fd1Z<dOd2e'd3e/ddfd4Z=d2e'ddfd5Z>d6e'd7e'd8e'ddfd9Z?d6e'd7e'd8e'ddfd:Z@d;e'd8e'ddfd<ZAd;e'd8e'ddfd=ZBd2e'd>e'ddfd?ZCd2e'd>e'ddfd@ZD	 dPdAe'dBee'ef   dCee'e'f   dDe3ddf
dEZEdFe/de'fdGZF G dH dI      ZGe	 G dJ dK             ZHej                   G dL dM             ZJy)Qz"Utility functions for PDF library.zMathieu Fenniakzbiziqe@mathieu.fenniak.net    N)	dataclass)datetimetimezone)DEFAULT_BUFFER_SIZE)SEEK_CUR)	IOAnyDictListOptionalPatternTupleUnionoverload   )   
   )	TypeAlias)r      )Self   )STREAM_TRUNCATED_PREMATURELYDeprecationErrorPdfStreamErrorTransformationMatrixTypeCompressedTransformationMatrixtextreturnc                 4   | }| y | d   j                         rd| z   } | j                  d      r| dz  } | j                  dd      j                  dd      j                  dd	      } t        | j	                  d      | j	                  d
            }|dkD  r|t        |       dz
  k7  r| dz  } dD ]M  }	 t        j                  | |      }| j                  d      r |j                  t        j                        }|c S  t        d|       # t        $ r Y iw xY w)Nr   zD:)Zz0000r!   +r    ' -   00)zD:%YzD:%Y%mzD:%Y%m%dz
D:%Y%m%d%HzD:%Y%m%d%H%MzD:%Y%m%d%H%M%SzD:%Y%m%d%H%M%S%zz+0000)tzinfozCan not convert date: )isdigitendswithreplacemaxfindlenr   strptimer   utc
ValueError)r   orgtextifds        S/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/pypdf/_utils.pyparse_iso8824_dater8   Q   s   G|Awd{}}Z <<S!))#s3;;CDDDIIcNDIIcN+A1uc$i!m# 	!!$*A }}W%IIX\\I2H!" -gY7
88  		s   1D	DDheader1header2c                     d}g }| |v r |j                  |j                  |              ||v r |j                  |j                  |             t        |      dk(  rt        d| d|d      |t	        |         S )N)z%PDF-1.3z%PDF-1.4z%PDF-1.5z%PDF-1.6z%PDF-1.7z%PDF-2.0r   zNeither z nor z are proper headers)appendindexr/   r2   r-   )r9   r:   versionspdf_header_indicess       r7   _get_max_pdf_version_headerr@   q   s    H (!!(.."9:(!!(.."9:
!#8G;eG;>QRSSC*+,,    )       	   
          rA      [   ]streammaxcharsc                     d}	 | j                  d      }|j                         s|s	 |S ||z  }t        |      |k(  r	 |S =)a<  
    Read non-whitespace characters and return them.

    Stops upon encountering whitespace or when maxchars is reached.

    Args:
        stream: The data stream from which was read.
        maxchars: The maximum number of bytes returned; by default unlimited.

    Returns:
        The data which was read.

    rA   r   )readisspacer/   )rJ   rK   txttoks       r7   read_until_whitespacerQ      sR     C
kk!n;;= J 	s
s8xJ rA   c                 l    | j                  d      }|t        v r| j                  d      }|t        v r|S )z
    Find and read the next non-whitespace character (ignores whitespace).

    Args:
        stream: The data stream from which was read.

    Returns:
        The data which was read.

    r   rM   WHITESPACESrJ   rP   s     r7   read_non_whitespacerV      s5     ++a.C

kk!n 
JrA   c                     | j                  d      }d}|t        v r|dz  }| j                  d      }|t        v r|dkD  S )a  
    Similar to read_non_whitespace, but return a boolean if at least one
    whitespace character was read.

    Args:
        stream: The data stream from which was read.

    Returns:
        True if one or more whitespace was skipped, otherwise return False.

    r   r   rS   )rJ   rP   cnts      r7   skip_over_whitespacerY      sI     ++a.C
C

qkk!n 
 7NrA   valuec                 &    t        d | D              S )z
    Check if the given value consists of whitespace characters only.

    Args:
        value: The bytes to check.

    Returns:
        True if the value only has whitespace characters, otherwise return False.

    c              3   ,   K   | ]  }|t         v   y wN)WHITESPACES_AS_BYTES).0bs     r7   	<genexpr>z+check_if_whitespace_only.<locals>.<genexpr>   s     8Qq((8s   )all)rZ   s    r7   check_if_whitespace_onlyrc      s     8%888rA   c                     | j                  d      }| j                  dd       |dk(  r,|dvr'| j                  d      }|dk(  rt        d      |dvr&y y y )Nr      %)rD   rF   rA   zFile ended unexpectedly.)rM   seekr   rU   s     r7   skip_over_commentrh      s[    
++a.C
KKA
d{'++a.Ccz$%?@@ ' rA   regexc                    d}	 | j                  d      }|s|S |j                  ||z         }|Q| j                  |j                         t	        |      t	        |      z   z
  d       ||z   d|j                          }	 |S ||z  })z
    Read until the regular expression pattern matched (ignore the match).
    Treats EOF on the underlying stream as the end of the token to be matched.

    Args:
        regex: re.Pattern

    Returns:
        The read bytes.

    rA      Nr   )rM   searchrg   startr/   )rJ   ri   namerP   ms        r7   read_until_regexrp      s     D
kk"oKLL$=KK	SYS%9:A>3J!''),DK 	 rA   to_readc                     | j                         |k  rt        d      | j                  | t               | j	                  |      }| j                  | t               |S )a  
    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.

    Args:
        stream:
        to_read:

    Returns:
        The data which was read.

    z!Could not read malformed PDF file)tellr   rg   r   rM   )rJ   rq   rM   s      r7   read_block_backwardsrt      sQ     {{}w@AA
KK(#;;wD
KK(#KrA   c                    g }d}| j                         dk(  rt        t              	 t        t        | j                               }|dk(  rnt        | |      }t        |      dz
  }|s%|dk\  r||   dvr|dz  }|dk\  r||   dvr|dk\  rd}|r6|j                  ||dz   d        |dk\  r+||   dv r$|dz  }|dk\  r||   dv rn|j                  |       |dk\  r| j                  |dz   t               ndj                  |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.

    Args:
        stream: StreamType:

    Returns:
        The data which was read.

    Fr   Tr   s   
NrA   re   )rs   r   r   minr   rt   r/   r<   rg   r   join)rJ   line_content
found_crlfrq   blockidxs         r7   read_previous_liner|     s?   " LJ{{}9::
)6;;=9a< %VW5%j1n (uSz8q (uSz8ax!

 cAgi 01(uSzW4q (uSzW4
 &!8 KKa*A D 88L2&''rA   ar`   c                 ,    t        fd| D              S )Nc              3   T   K   | ]  t        fd t         D                 yw)c              3   V   K   | ]   }t        d  t        |      D               " yw)c              3   P   K   | ]  \  }}t        |      t        |      z     y wr]   )float)r_   r4   js      r7   ra   z6matrix_multiply.<locals>.<genexpr>.<genexpr>.<genexpr>P  s!     @$!Q%(U1X%@s   $&N)sumzip)r_   colrows     r7   ra   z,matrix_multiply.<locals>.<genexpr>.<genexpr>P  s"     TSc@#c3-@@Ts   &)N)tupler   )r_   r   r`   s    @r7   ra   z"matrix_multiply.<locals>.<genexpr>O  s)       	TCQRGTTs   $()r   )r}   r`   s    `r7   matrix_multiplyr   L  s        rA   c                 8   d}| j                  | d       t        dd      5 }|j                  | j                  |             |j                  d       |j                  | j                  |             ddd       | j                  | d       y# 1 sw Y   xY w)z5Create text file showing current location in context.i  r   zpypdf_pdfLocation.txtwbs   HEREN)rg   openwriterM   )rJ   radius	output_fhs      r7   mark_locationr   U  s     F
KK	%t	, -	F+, F+,- KK	- -s   ABBc                      y r]    r`   s    r7   ord_r   a      rA   c                      y r]   r   r   s    r7   r   r   f  r   rA   c                      y r]   r   r   s    r7   r   r   k  r   rA   c                 <    t        | t              rt        |       S | S r]   )
isinstancestrordr   s    r7   r   r   p  s    !S1vHrA   msg
stacklevelc                 <    t        j                  | t        |       y )N)r   )warningswarnDeprecationWarning)r   r   s     r7   	deprecater   v  s    MM#)jArA   c                     t        |       r]   )r   )r   s    r7   deprecationr   z  s    
3
rA   old_namenew_name
removed_inc                 .    t        |  d| d| dd       y)zFIssue a warning that a feature will be removed, but has a replacement., is deprecated and will be removed in pypdf . Use 	 instead.   Nr   r   r   r   s      r7   deprecate_with_replacementr   ~  s'    *@FS[R\\ef	rA   c                 ,    t        |  d| d| d       y)zMRaise an exception that a feature was already removed, but has a replacement.( is deprecated and was removed in pypdf r   r   Nr   r   s      r7   deprecation_with_replacementr     s"    *<ZLxjXabrA   rn   c                 (    t        |  d| dd       y)zCIssue a warning that a feature will be removed without replacement.r   .r   Nr   rn   r   s     r7   deprecate_no_replacementr     s    B:,aPRSTrA   c                 &    t        |  d| d       y)zJRaise an exception that a feature was already removed without replacement.r   r   Nr   r   s     r7   deprecation_no_replacementr     s    4&@ANOrA   srcc                 L    t        j                  |      j                  |        y)z
    Use this instead of logger.error directly.

    That allows people to overwrite it more easily.

    See the docs on when to use which:
    https://pypdf.readthedocs.io/en/latest/user/suppress-warnings.html
    N)logging	getLoggererrorr   r   s     r7   logger_errorr     s     c  %rA   c                 L    t        j                  |      j                  |        y)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 pypdf, e.g. a non-compliant PDF being read in a way that
      pypdf could apply a robustness fix to still read it. This applies mainly
      to strict=False mode.
    N)r   r   warningr   s     r7   logger_warningr     s      c""3'rA   	func_namekwargsaliasesfailc                 
   |j                         D ]p  \  }}||v s|rt        | d| d      ||v rt        |  d| d| d| d| d
      |j                  |      ||<   t	        j
                  | d| dt               r y	)
z
    Helper function to deprecate arguments.

    Args:
        func_name: Name of the function to be deprecated
        kwargs:
        aliases:
        fail:

    z# is deprecated as an argument. Use z insteadz received both z and z as an argument. z is deprecated. Use r   )messagecategoryN)itemsr   	TypeErrorpopr   r   r   )r   r   r   r   old_termnew_terms         r7   rename_kwargsr     s     &mmo (v&j CH:XV  6! k
%z J$$,: .#*I/ 
  &zz(3F8MMj CH:XV+	rA   bytesc                 `    | dk  r|  dS | dk  r	| dz  ddS | dk  r	| dz  ddS | dz  ddS )	Ni  z Bytei@B z.1fz kBi ʚ;z MBz GBr   )r   s    r7   _human_readable_bytesr     s_    u}u}%-$C((u}%-$C((emC $$rA   c                   4    e Zd ZdZdddZddefdZdefdZy)	classpropertyz
    Decorator that converts a method with a single cls argument into a property
    that can be accessed directly from the class.
    Nr   c                     || _         y r]   fgetselfmethods     r7   __init__zclassproperty.__init__  s	    	rA   c                 $    | j                  |      S r]   r   )r   instanceclss      r7   __get__zclassproperty.__get__  s    yy~rA   c                     || _         | S r]   r   r   s     r7   getterzclassproperty.getter  s    	rA   r]   )r   N)	__name__
__module____qualname____doc__r   r	   r   r   r   r   rA   r7   r   r     s$    
S  rA   r   c                   h    e Zd ZU ddlmZ dZeed<   	 dZe	ed<   	 dZ
ee   ed<   	 d	efd
Zd	efdZy)Filer   )IndirectObjectr%   rn   rA   dataNindirect_referencer   c           	          | j                   j                   d| j                   dt        t	        | j
                               dS )Nz(name=z, data: ))	__class__r   rn   r   r/   r   r   s    r7   __str__zFile.__str__'  s?    ..))*&8DYZ]^b^g^gZhDiCjjkllrA   c                 \    | j                         d d dt        | j                         dz   S )Nre   z, hash: r   )r   hashr   r   s    r7   __repr__zFile.__repr__*  s,    ||~cr"xTYY/@%BBBrA   )r   r   r   genericr   rn   r   __annotations__r   r   r   r   r   r   r   rA   r7   r   r     sW    'D#N D% 4807m mC# CrA   r   c                       e Zd Z ej                  d      ZdeddfdZdedee	e
ef      fdZdedefdZdedefd	Zy)
Versionz^(\d+)(.*)$version_strr   Nc                 >    || _         | j                  |      | _        y r]   )r   _parse_version
components)r   r   s     r7   r   zVersion.__init__2  s    &--k:rA   c                 (   |j                  d      }g }|D ]y  }t        j                  j                  |      }|s|j	                  d|f       8|j                  d      }|j                  d      }|d}|j	                  t        |      |f       { |S )Nr   r   r   r   )splitr   COMPONENT_PATTERNmatchr<   groupint)r   r   r   parsed_components	componentr   integer_prefixsuffixs           r7   r   zVersion._parse_version6  s     &&s+
# 		DI--33I>E!((!Y8"[[^N[[^F%!"$$c.&96%BC		D ! rA   otherc                 V    t        |t              sy| j                  |j                  k(  S )NF)r   r   r   )r   r  s     r7   __eq__zVersion.__eq__E  s$    %)%"2"222rA   c                 B   t        |t              st        dt        |             t	        | j
                  |j
                        D ]+  \  }}|\  }}|\  }}||k  r y||kD  r y||k  r y||kD  s+ y t        | j
                        t        |j
                        k  S )Nz#Version cannot be compared against TF)r   r   r2   typer   r   r/   )r   r  self_componentother_component
self_valueself_suffixother_valueother_suffixs           r7   __lt__zVersion.__lt__J  s    %)B4;-PQQ/24??EDTDT/U 	+NO&4#J(7%KK'K'\)\)	 4??#c%*:*:&;;;rA   )r   r   r   recompiler   r   r   r   r   r  r   objectboolr  r	   r  r   rA   r7   r   r   .  sl    "

>2;C ;D ;!# !$uS#X2G !3F 3t 3
<C <D <rA   r   r]   )r   )F)Kr   
__author____author_email__	functoolsr   r  sysr   dataclassesr   r   r   ior   osr   typingr   r	   r
   r   r   r   r   r   r   version_infor   typing_extensionsr   errorsr   r   r   r   r   r   r   
StreamTyper   StrByteTyper8   r@   rT   rw   r^   WHITESPACES_AS_REGEXPr  r   rQ   rV   r  rY   rc   rh   rp   rt   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   total_orderingr   r   rA   r7   <module>r%     sR  8 )
/    	 
  ! ' " 
 
 
 BQ7" +w&  ',	%
eUE&9 :E%PUBU<VV' )  -2	5%u,- 	  W
CO$9Xc] 9x/A 9@- -s -s -& :xx, 33d: *  QV 2
 u "  (9E 9d 9Aj AT AZ  5 4 c e 27(z 7(e 7(t$<	* 	 	 
C C  
 
E e  
 
C C  
E#sE/" uS%Z'8 B3 BC B B S  T     QU 3 # 3 SW U3 UC UD U
PS Pc Pd P
	&c 	& 	& 	&( (# ($ (( SX cN59#s(^KO	D% % %Z " C C C. -< -< -<rA   