
     h w                        d dl Z d dlmZ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 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 ddlmZ ddl 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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6 ddlm7Z7m8Z8m9Z9m:Z:m;Z; dZ< G d d          Z= G d d          Z> G d de>          Z?dS )    N)BytesIOFileIOIOBase)Path)TracebackType)	AnyDictIterableListOptionalTupleTypeUnioncast   )
Encryption)
PageObject)	PdfReader)StrByteTypedeprecation_bookmarkdeprecation_with_replacementstr_)	PdfWriter)GoToActionArguments)PagesAttributes)TypArgumentsTypFitArguments)PAGE_FITArrayObjectDestinationDictionaryObjectFitFloatObjectIndirectObject
NameObject
NullObjectNumberObjectOutlineItemTextStringObject
TreeObject)	PageRangePageRangeSpec)FitType
LayoutTypeOutlineTypePagemodeTypeZoomArgTypez=close() was called and thus the writer cannot be used anymorec                   *    e Zd ZdZdedededdfdZdS )_MergedPagez@Collect necessary information on each page that is being merged.pagedatasrcidreturnNc                 >    || _         || _        d | _        || _        d S N)r5   r4   out_pagedatar6   )selfr4   r5   r6   s       S/var/www/flask_pdf_extract_app/myenv/lib/python3.11/site-packages/PyPDF2/_merger.py__init__z_MergedPage.__init__Q   s#          )__name__
__module____qualname____doc__r   r   intr=    r>   r<   r3   r3   N   sJ        JJ )        r>   r3   c                   r   e Zd ZdZ ed          	 dAdedeeef         dd	fd
            Z	dBdZ
deee                  dee         dee         dd	fdZ edd          	 	 	 	 	 	 dCdee         deeeef         dee         dee         dedee         dd	fd            Zdeeeef         deeee         f         fdZ edd          	 	 	 dDdeeeef         dee         ded	eeeef         eeeef         ee         f         dedd	f
d            Zdeeef         dd	fdZdEdZdeeef         dd	fdZ deeef         dd	fdZ!de"dd	fd Z#de"dd	fd!Z$d"e%dd	fd#Z&d"e%dd	fd$Z'd%ed&eeeeef         f         deeeef         eeeef         ee         f         deeeef                  fd'Z(d%ede)deeeef         eeeef         ee         f         de)fd(Z*dEd)Z+ ed          	 	 dFdee,e-                  d*ee.         dd	fd+            Z/ ed,          dee-e0f         d-e1dd	fd.            Z2dee1         dd	fd/Z3 ed          	 dGdee1         dee,e-                  dd	fd0            Z4 ed,          	 dGdeeef         d1ee)         deee                  fd2            Z5 ed,          	 dGdeeef         d1ee)         deee                  fd3            Z6d	d	d	dde7d	fd4edee         d*ed	e.e8f         d5eee9e9e9f                  d6ed7ed8e:d9ee         de8fd:Z;	 	 	 	 	 dHd4ed9ed*ed	e.e8f         d5eee9e9e9f                  d6ed7ed8e<d<e=de8fd=Z>	 	 	 	 	 dHd4ed9ed*ed	e.e8f         d5eee9e9e9f                  d6ed7ed8e<d<e=de8fd>Z?d4ed9edd	fd?Z@	 	 dFd4edee         d9ee         dd	fd@ZAd	S )I	PdfMergeraI  
    Initialize a ``PdfMerger`` object.

    ``PdfMerger`` merges multiple PDFs into a single PDF.
    It can concatenate, slice, insert, or any combination of the above.

    See the functions :meth:`merge()<merge>` (or :meth:`append()<append>`)
    and :meth:`write()<write>` for usage information.

    :param bool strict: Determines whether user should be warned of all
            problems and also causes some correctable problems to be fatal.
            Defaults to ``False``.
    :param fileobj: Output file. Can be a filename or any kind of
            file-like object.
    outline)	bookmarksF strictfileobjr7   Nc                     g | _         g | _        t                      | _        g | _        g | _        d| _        || _        || _        d S )Nr   )	inputspagesr   outputrG   named_destsid_countrK   rJ   )r;   rJ   rK   s      r<   r=   zPdfMerger.__init__i   sE     46 "
+4;;$&&(r>   c                     | S r9   rD   )r;   s    r<   	__enter__zPdfMerger.__enter__v   s    r>   exc_typeexc	tracebackc                 p    | j         r|                     | j                    |                                  dS )z*Write to the fileobj and close the merger.N)rK   writeclose)r;   rT   rU   rV   s       r<   __exit__zPdfMerger.__exit__z   s3     < 	%JJt|$$$

r>   outline_itemimport_outline)bookmarkimport_bookmarksTpage_numberrN   positionc                    |8|'|}d}d}t          j        | d| dt                     nt          d          |t          d          |t          d          |                     |          \  }	}
t          |	| j        	          }| j                            |	|f           |
|
|_	        |d
t          |j                  f}nwt          |t                    r(|                    t          |j                            }n:t          |t                    rn$t          |t                     st#          d          g }g }|r|j        }|                     |||          }|rTt)          t+          |          t-          | j                  t1          j                              }| xj        ||gz  c_        n| xj        |z  c_        |j        }|                     |||          }| xj        |z  c_        t;          | D ]L}|j        |         }| j        }| xj        dz  c_        t=          |||          }|                    |           M|                     |           |                      |           || j        ||<   dS )a  
        Merge the pages from the given file into the output file at the
        specified page number.

        :param int page_number: The *page number* to insert this file. File will
            be inserted after the given number.

        :param fileobj: A File Object or an object that supports the standard
            read and seek methods similar to a File Object. Could also be a
            string representing a path to a PDF file.

        :param str outline_item: Optionally, you may specify an outline item
            (previously referred to as a 'bookmark') to be applied at the
            beginning of the included file by supplying the text of the outline item.

        :param pages: can be a :class:`PageRange<PyPDF2.pagerange.PageRange>`
            or a ``(start, stop[, step])`` tuple
            to merge only the specified range of pages from the source
            document into the output document.
            Can also be a list of pages to merge.

        :param bool import_outline: You may prevent the source document's
            outline (collection of outline items, previously referred to as
            'bookmarks') from being imported by specifying this as ``False``.
        Nr`   r_   zG is deprecated as an argument and will be removed in PyPDF2=4.0.0. Use  insteadzCThe argument position of merge is deprecated. Use page_number only.page_number may not be Nonezfileobj may not be None)rJ   r   z0"pages" must be a tuple of (start, stop[, step])r   )!warningswarnDeprecationWarning
ValueError_create_streamr   rJ   rM   append_encryptionlenrN   
isinstancer+   indiceslisttuple	TypeErrorrG   _trim_outliner(   r)   r'   rQ   r"   fitnamed_destinations_trim_destsrP   ranger3   _associate_dests_to_pages!_associate_outline_items_to_pages)r;   r_   rK   r[   rN   r\   r`   old_termnew_termstreamencryption_objreadersrcpagesrG   outline_item_typdeststrimmed_destsipager6   mps                        r<   mergezPdfMerger.merge   s   F "&%(# K K8@K K K '    !Y    :;;;? 6777!%!4!4W!=!= 6$+666FF+,,,%!/F =FL))*EEy)) 	PMM#fl"3"344EEt$$ 	PE5)) 	PNOOO 	AnG((%@@G 	$* ..T]++		   
 LL-w77LLLLLG#LL)((>>M)  	  	 A<?DBMMQMMT62..BOOB&&x000..x888 /7
;{*+++r>   c                 f   d }t          |t          t          f          rt          |d          }nt          |t                    r|j        r|j        }|j                                        }|j                            d           t          |j        
                                          }|j                            |           nht          |d          rIt          |d          r9|                    d           |
                                }t          |          }nt          d          ||fS )Nrbr   seekreadzPdfMerger.merge requires an object that PdfReader can parse. Typically, that is a Path or a string representing a Path, a file object, or an object implementing .seek and .read. Passing a PdfReader directly works as well.)rl   strr   r   r   rj   rz   tellr   r   r   hasattrNotImplementedError)r;   rK   r{   rz   	orig_tellfilecontents         r<   rh   zPdfMerger._create_stream   s&    gT{++ 	GT**FF++ 	" 5!(!4++--IN"""W^002233F N	****Wf%% 
	''6*B*B 
	LLOOO!,,..K[))FF%>   ~%%r>   c                 \    |                      t          | j                  ||||           dS )a  
        Identical to the :meth:`merge()<merge>` method, but assumes you want to
        concatenate all pages onto the end of the file instead of specifying a
        position.

        :param fileobj: A File Object or an object that supports the standard
            read and seek methods similar to a File Object. Could also be a
            string representing a path to a PDF file.

        :param str outline_item: Optionally, you may specify an outline item
            (previously referred to as a 'bookmark') to be applied at the
            beginning of the included file by supplying the text of the outline item.

        :param pages: can be a :class:`PageRange<PyPDF2.pagerange.PageRange>`
            or a ``(start, stop[, step])`` tuple
            to merge only the specified range of pages from the source
            document into the output document.
            Can also be a list of pages to append.

        :param bool import_outline: You may prevent the source document's
            outline (collection of outline items, previously referred to as
            'bookmarks') from being imported by specifying this as ``False``.
        N)r   rk   rN   )r;   rK   r[   rN   r\   s        r<   ri   zPdfMerger.append  s-    B 	

3tz??G\5.QQQQQr>   c                 \   | j         t          t                    | j        D ]}| j                             |j                   t          t          t          t          f         | j         j
                                                  }| j                             |t          j                 d                                                   |_        |                                  |                                  | j                             |          \  }}|r|                                 dS dS )z
        Write all data that has been merged to the given output file.

        :param fileobj: Output file. Can be a filename or any kind of
            file-like object.
        N)rO   RuntimeErrorERR_CLOSED_WRITERrN   add_pager4   r   r	   r   r   _pages
get_objectget_referencePAKIDSr:   _write_dests_write_outlinerX   rY   )r;   rK   r   	pages_objmy_fileret_fileobjs         r<   rX   zPdfMerger.writeA  s    ;0111
 J 	 	DK  ///T#s(^T[-?-J-J-L-LMMI $ 9 9"'"2&1133! !D 	  ${0099 	 	  	 r>   c                 r    g | _         | j        D ]\  }}|                                 g | _        d| _        dS )zHShut all file descriptors (input and output) and clear all memory usage.N)rN   rM   rY   rO   )r;   fo_readers      r<   rY   zPdfMerger.closea  s?    
; 	 	KBHHJJJJr>   infosc                 p    | j         t          t                    | j                             |           dS )z
        Add custom metadata to the output.

        :param dict infos: a Python dictionary where each key is a field
            and each value is your new metadata.
            Example: ``{u'/Title': u'My title'}``
        N)rO   r   r   add_metadatar;   r   s     r<   r   zPdfMerger.add_metadataj  s7     ;0111  '''''r>   c                 P    t          dd           |                     |           dS )zW
        .. deprecated:: 1.28.0

            Use :meth:`add_metadata` instead.
        addMetadatar   N)r   r   r   s     r<   r   zPdfMerger.addMetadatav  s.     	%]NCCC%     r>   layoutc                 P    t          dd           |                     |           dS )zZ
        .. deprecated:: 1.28.0

            Use :meth:`set_page_layout` instead.
        setPageLayoutset_page_layoutN)r   r   r;   r   s     r<   r   zPdfMerger.setPageLayout  s/     	%_6GHHHV$$$$$r>   c                 p    | j         t          t                    | j                             |           dS )a  
        Set the page layout.

        :param str layout: The page layout to be used

        .. list-table:: Valid ``layout`` arguments
           :widths: 50 200

           * - /NoLayout
             - Layout explicitly not specified
           * - /SinglePage
             - Show one page at a time
           * - /OneColumn
             - Show one column at a time
           * - /TwoColumnLeft
             - Show pages in two columns, odd-numbered pages on the left
           * - /TwoColumnRight
             - Show pages in two columns, odd-numbered pages on the right
           * - /TwoPageLeft
             - Show two pages at a time, odd-numbered pages on the left
           * - /TwoPageRight
             - Show two pages at a time, odd-numbered pages on the right
        N)rO   r   r   _set_page_layoutr   s     r<   r   zPdfMerger.set_page_layout  s7    0 ;0111$$V,,,,,r>   modec                 R    t          ddd           |                     |           dS )zX
        .. deprecated:: 1.28.0

            Use :meth:`set_page_mode` instead.
        setPageModeset_page_mode3.0.0N)r   r   r;   r   s     r<   r   zPdfMerger.setPageMode  s0     	%]OWMMM4     r>   c                 p    | j         t          t                    | j                             |           dS )aP  
        Set the page mode.

        :param str mode: The page mode to use.

        .. list-table:: Valid ``mode`` arguments
           :widths: 50 200

           * - /UseNone
             - Do not show outline or thumbnails panels
           * - /UseOutlines
             - Show outline (aka bookmarks) panel
           * - /UseThumbs
             - Show page thumbnails panel
           * - /FullScreen
             - Fullscreen view
           * - /UseOC
             - Show Optional Content Group (OCG) panel
           * - /UseAttachments
             - Show attachments panel
        N)rO   r   r   r   r   s     r<   r   zPdfMerger.set_page_mode  s7    , ;0111!!$'''''r>   pdfr   c                    g }t          |t                    r|nt          t          |           }|                                D ]\  }}|D ]}|j        |                                         |d                                         k    ri|d                                         |t          d          <   t          |          t          |d                   k    sJ |                    |            n|S )zHRemove named destinations that are not a part of the specified page set./Page/Title)	rl   rn   ru   itemsrN   r   r%   r   ri   )	r;   r   r   rN   	new_destslstkeyobjjs	            r<   rt   zPdfMerger._trim_dests  s     	!%..GeeD4G4G 	 	HC  9Q<**,,G0G0G0I0III/27|/F/F/H/HC
7++,99S](;(;;;;;$$S)))E	 J
 r>   c                 v   g }d}t          |t                    r|nt          t          |           }t          |          D ]\  }}t          |t                    rO|                     |||          }	|	r5|s|                    ||dz
                      |                    |	           id}|D ]}
|d         |j        |
                                         |d                                         k    rC|d                                         |t          d          <   |                    |           d} n|S )zJRemove outline item entries that are not a part of the specified page set.Tr   Fr   )	rl   rn   ru   	enumeraterq   ri   rN   r   r%   )r;   r   rG   rN   new_outlineprev_header_addedr   r   r[   subr   s              r<   rq   zPdfMerger._trim_outline  s_     !%..GeeD4G4G(11 	 	OA|,-- ((lC@@ ,, ;#**71q5>:::&&s+++$)! 	 	A#G,4 y|..00L4I4T4T4V4VVV<H#=$*,, %Z%8%89 $**<888,0) W r>   c                    | j         t          t                    | j        D ]h}d }d|v rDt	          | j                  D ]/\  }}|j        |d         k    r|j        |t          d          <    n0|| j         	                    |           id S )Nr   )
rO   r   r   rP   r   rN   r6   r:   r%   add_named_destination_object)r;   
named_destpagenor   s       r<   r   zPdfMerger._write_dests  s    ;0111* 		E 		EJF*$$$-dj$9$9  LFDw*W"555:>:K
:g#6#67 6 !88DDD		E 		Er>   parentc                    | j         t          t                    || j        }|
J d            d }|D ]}t	          |t
                    r|                     ||           .d }d|v rCt          | j                  D ].\  }}|j	        |d         k    r| 
                    ||            n/|!|d= |d= | j                             ||          }d S )Nhint for mypyr   /Type)rO   r   r   rG   rl   rn   r   r   rN   r6   _write_outline_item_on_pageadd_outline_item_dict)r;   rG   r   
last_addedr[   page_nor   s          r<   r   zPdfMerger._write_outline  s    ;0111?lG""O"""
# 	U 	UL,-- ##L*===G,&&%.tz%:%:  MGTw,w"77788tLLL 8 " )<+@![>>|VTT
	U 	Ur>   )r]   r   c                    t          t          |d                   }t          |j                  t	          |          g}t
          j        t          j        ft
          j	        t          j        ft
          j
        t          j        ft
          j        t          j        ft
          j        t          j        t          j        dft
          j        t          j        t          j        t          j        t          j        fi}|                    |t%                                D ]o}||v rDt'          ||         t(                    s)|                    t-          ||                              n"|                    t-          d                     ||= pt/          t	          t0          j                  t	          d          t	          t0          j                  t7          |          i          |t	          d          <   d S )Nr   z/Zoomr   z/GoToz/A)r   r   r'   r6   r%   r   FIT_Hr   TOPFIT_BHFIT_VLEFTFIT_BVXYZFIT_RBOTTOMRIGHTgetro   rl   r&   ri   r#   r!   r   SDr   )r;   r[   r   oi_typeargsfit2arg_keysarg_keys          r<   r   z%PdfMerger._write_outline_item_on_page"  s    sL122TW%%z'':':;!L$4#6"\%5$7!L$5#7"\%6$8,"3\5Ew!O!!#" 	$4
 $''99 	& 	&G,&&zW%z0 0& KW(=>>????KNN+++W%%)9.011:g3F3F.011;t3D3D*
 *
Z%%&&&r>   c                 D   | j         D ]}d }|d         }t          |t                    r"|D ]8}|                                |j                                        k    r|j        }9|t          d|d          d          t          |          |t          d          <   d S )Nr   zUnresolved named destination 'r   ')rP   rl   r'   r   r4   r6   rg   r%   )r;   rN   r   r   npr   s         r<   rv   z#PdfMerger._associate_dests_to_pagesE  s    * 	C 	CJFG$B"l++  % %==??dm&>&>&@&@@@!WF~ LZ5ILLL   /;6.B.BJz'**++	C 	Cr>   c                    || j         }|
J d            |D ]}t          |t                    r|                     ||           .d }|d         }t          |t                    rN|D ]8}|                                |j                                        k    r|j        }9|t	          |          |t          d          <   d S )Nr   r   )	rG   rl   rn   rw   r'   r   r4   r6   r%   )r;   rN   rG   r[   r   outline_item_pageps          r<   rw   z+PdfMerger._associate_outline_items_to_pagesW  s     ?lG""O"""# 	I 	IL,-- 66ulKKKF ,W 5+\::  " "$//11QZ5J5J5L5LLLTF!4@4H4HZ001!	I 	Ir>   rootc                 &   || j         }t          |          D ]w\  }}t          |t                    r!|                     ||          }|r|g|z   c S ;||k    s1t          t          t          t          f         |d                   |k    r|gc S xd S )Nr   )rG   r   rl   rn   find_outline_itemr   r	   r   )r;   r[   r   r   oi_enumress         r<   r   zPdfMerger.find_outline_itemp  s     <<D#D// 	 	JAw'4((  ,,\7CC %39$$$% <''S#X(9::lJJ s


 K
 tr>   c                 .    |                      ||          S )zZ
        .. deprecated:: 2.9.0
            Use :meth:`find_outline_item` instead.
        )r   )r;   r[   r   s      r<   find_bookmarkzPdfMerger.find_bookmark  s     %%lD999r>   titlecolorbolditalicrr   pagenumc	           
         ||t          d          |&d}	d}
t          j        |	 d|
 dt                     |}|t          d          | j        }|t          t                    |                    |||d||||          S )al  
        Add an outline item (commonly referred to as a "Bookmark") to this PDF file.

        :param str title: Title to use for this outline item.
        :param int page_number: Page number this outline item will point to.
        :param parent: A reference to a parent outline item to create nested
            outline items.
        :param tuple color: Color of the outline item's font as a red, green, blue tuple
            from 0.0 to 1.0
        :param bool bold: Outline item font is bold
        :param bool italic: Outline item font is italic
        :param Fit fit: The fit of the destination page.
        NzMThe argument pagenum of add_outline_item is deprecated. Use page_number only.r   r_   H is deprecated as an argument and will be removed in PyPDF2==4.0.0. Use rb   rc   )rg   rd   re   rf   rO   r   r   add_outline_item)r;   r   r_   r   r   r   r   rr   r   rx   ry   writers               r<   r   zPdfMerger.add_outline_item  s    0 "w':_    H$HM H H5=H H H #   "K:;;;>0111&&	
 	
 		
r>   /Fitr   c                 x    t          ddd           |                     ||||||t          ||                    S )zZ
        .. deprecated:: 1.28.0
            Use :meth:`add_outline_item` instead.
        addBookmarkr   r   fit_typefit_argsr   r   r"   	r;   r   r   r   r   r   r   rr   r   s	            r<   r   zPdfMerger.addBookmark  Q     	%]4FPPP$$t,,,
 
 	
r>   c                 x    t          ddd           |                     ||||||t          ||                    S )zY
        .. deprecated:: 2.9.0
            Use :meth:`add_outline_item` instead.
        r   r   r   r   r   r   s	            r<   add_bookmarkzPdfMerger.add_bookmark  r  r>   c                 P    t          ddd           |                     ||          S )z_
        .. deprecated:: 1.28.0
            Use :meth:`add_named_destination` instead.
        addNamedDestinationadd_named_destinationr   )r   r  )r;   r   r   s      r<   r  zPdfMerger.addNamedDestination   s6    
 	%!#:G	
 	
 	
 ))%999r>   c                 N   ||t          d          |&d}d}t          j        | d| dt                     |}|t          d          t	          t          |          t          |          t          j        d	                    }| j	        
                    |           dS )
z
        Add a destination to the output.

        :param str title: Title to use
        :param int page_number: Page number this destination points at.
        NzRThe argument pagenum of add_named_destination is deprecated. Use page_number only.r   r_   r   rb   rc   i:  )top)rg   rd   re   rf   r    r)   r'   r"   fit_horizontallyrP   ri   )r;   r   r_   r   rx   ry   dests          r<   r  zPdfMerger.add_named_destination
  s     "w':d    H$HM H H5=H H H #   "K:;;;U##%% S)))
 

 	%%%%%r>   )FrI   )r7   rF   )NNNNTN)NNT)r7   N)NNr9   )NNFFr   )Br?   r@   rA   rB   r   boolr   r   r   r=   rS   r   r   BaseExceptionr   rZ   rC   r   r   r,   r   r   r   r   rh   r+   r   ri   rX   rY   r	   r   r   r   r.   r   r   r0   r   r   rt   r/   rq   r   r
   r(   r*   r   r    r3   r   rv   rw   r   r   r   r$   floatr"   r   r-   r1   r   r  r  r  rD   r>   r<   rF   rF   X   s)	          I...HJ
 

-243D-E
	
 
 
 /.
   	4./	 m$	 M*		
 
	 	 	 	 >DTUUU &*7;&*)-#"&s7 s7c]s7 t[)34s7 sm	s7
 &s7 s7 3-s7 
s7 s7 s7 VUs7j!&T;	9:!&	vx
++	,!& !& !& !&F >DTUUU '+ # R  R{It34 R sm R )U38_eCcM.BDIM
	 R  R 
 R  R  R VU RD U4#45  $        @   
($sCx. 
(T 
( 
( 
( 
(!c3h !D ! ! ! !%J %4 % % % %-j -T - - - -8! ! ! ! ! !(, (4 ( ( ( (4 Cc3h'( U38_eCcM&:DIEF	
 
d38n	   $  U38_eCcM&:DIEF	
 
   >E E E E I... 48'+U U(;/0U $U 
	U U U /.U6 >222 
!+{":; 
CN 
	 
  
  
 32 
DCtK/@ CT C C C C$ I...SWI I+&I19(;:O1PI	I I I /.I0 >222 '+ 38n {# 
$s)		   320 >222 '+	: 	:38n	: {#	: 
$s)			: 	: 	: 32	: &*:>6:!%5
 5
5
 c]5
 dJ67	5

 eUE1235
 5
 5
 5
 #5
 
5
 5
 5
 5
v ;?6:
 

 
 dJ67	

 eUE123
 
 
 
 
 

 
 
 
< ;?6:
 

 
 dJ67	

 eUE123
 
 
 
 
 

 
 
 
4: :s :t : : : : &*!%	"& "&"& c]"& #	"&
 
"& "& "& "& "& "&r>   rF   c                   ,     e Zd Zdededdf fdZ xZS )PdfFileMergerr   kwargsr7   Nc                     t          ddd           d|vrt          |          dk     rd|d<    t                      j        |i | d S )Nr  rF   r   rJ   r   T)r   rk   superr=   )r;   r   r  	__class__s      r<   r=   zPdfFileMerger.__init__0  sZ    $_k7KKK6!!c$ii!mm#F8$)&)))))r>   )r?   r@   rA   r   r=   __classcell__)r  s   @r<   r  r  /  sR        *c *S *T * * * * * * * * * *r>   r  )@rd   ior   r   r   pathlibr   typesr   typingr   r	   r
   r   r   r   r   r   r   rj   r   _pager   r   r   _utilsr   r   r   r   _writerr   	constantsr   r   r   r   r   genericr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   	pageranger+   r,   r-   r.   r/   r0   r1   r   r3   rF   r  rD   r>   r<   <module>r     s  8  & & & & & & & & & &            
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 $ # # # # #                              * * * * * * , , , , , , 4 4 4 4 4 4 4 4                              0 / / / / / / / N N N N N N N N N N N N N NS        T& T& T& T& T& T& T& T&n* * * * *I * * * * *r>   