
    Lwg'                    -   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ZddlZddlZddl	Z	ddl
Z
ddlZddl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 Z edej*                        Z edej*                        Z e       Zdad	 Zd
 Zd ZdSdZdTdZd Z  e!e
jD                  dz    e#d      z         Z$d Z%d Z& e&dd      Z' e%dd      Z( G d d      Z) e)       Z*ejV                  jY                  d      Z-e- ee. de-d        ee. dejV                  d           e-dk(  rddl-Z-n.ddl/Z/e/j`                  jc                  de-      je                         Z-e-jf                  jh                  jj                  Z5n	 ddlm5Z5  e5jn                          d Z8e5jr                  Z:d Z;d!Z<e<j{                  d"d      j{                  d#d      j{                  d$d      Z>e;e:e>fZ? e@e;j                  d%      D  cg c]
  }  e8|        c}       ZBe5j                  e5j                  e5j                  fZFeF e@e:j                  d%      D  cg c]
  }  e8|        c}       k(  sJ d&eFd'e:       d(d)d*ZGeGZHej                  ej                     ZKej                  eL   ZMej                  eN   ZOej                  eQdf   ZRej                  ej                     ZTej                  eU   ZVd+ZWd,ZXejV                  jY                  d-      ZYd.ZZd/Z[d0Z\d1Z]d2 Z^d3 Z_d4 Z`d5 ZadZb G d6 d7      Zc G d8 d9      Zd G d: d;      Ze G d< d=      Zf G d> d?      Zg G d@ dA      Zhe(rej                  Zj G dB dC      ZkekZl G dD dE      Zm G dF dG      Zn G dH dI      Zo G dJ dK      Zp G dL dM      Zq G dN dOeq      Zr er       Zs G dP dQ      Zt G dR dS      ZuddTlmvZv  G dU dV      Zw	 	 	 	 	 	 dUdWZx G dX dY      ZW G dZ d[      Zy[X G d\ d]      ZX G d^ d_      Zz G d` da      Z{ G db dc      Z| G dd de      Z} G df dg      Z~ G dh di      Z G dj dk      Z	 ej                  e   Z	 e5j                  j                         D ]5  \  ZZej                  dl      sej                  dm      r, eeee       7 	 de5j                  z  e5j                  z  e5j                  z  e5j                  z  e5j                  z  e5j                   z  Ze5j$                  dk(  sJ ee5j&                  k(  sJ ee5j(                  k(  sJ [[[i Zi Zej.                  ZdnZi ZeD ]  Zeeej9                         <    doedp<   dqedr<   dsedt<   duedv<   dwedx<   dyedz<   d{ed|<   d}ed~<   ded<   ded<   ded<   ded<   ded<   ded<   dZdZdZdZdag adadadZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdez  ez  ez  ez  Zdez  ez  ez  ez  Zdez  ez  ez  ez  ez  ZeZdez  ez  ez  ez  ez  Zdez  ez  ez  ez  ez  Zdez  ez  ez  ez  ez  Zdez  ez  ez  ez  Zdez  ez  ez  ez  ZdZdZdZdadZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd d d d d d d dZ G d de      Z G d de      Z G d de      Z efe      Z  efe      Z efe      ZdZdZdZdZdZdZdÐZ	dĐZ
dŐZdƐZdǐZdȐZdɐZdʐZdːZd̐Zd͐ZdΐZdϐZdАZdѐZdҐZdӐZdԐZdՐZd֐ZdאZdؐZdِZdڐZdېZ dܐZ!dݐZ"dސZ#dߐZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4	 ddl5m6Z6m7Z7  e6jp                         Z9e9ju                         D ]  Z;e7e;   e9e;   d<    [6[7dZ=dZ>d Z?d Z@d ZAd ZBd ZCd ZDd ZEd ZFd ZGd ZHd ZId ZJd  ZKd ZLd ZMd ZNd ZOd ZPdej                  de@fdZQdej                  de@fd	ZRd
 ZSd ZTd ZUd ZVd ZWd ZXd ZYd ZZd Z[d Z\d Z]d Z^d Z_d Z`d Zad Zbd Zcd Zdd Zed Zfd Zgd Zhd  Zid! Zjd" Zkd# Zld$ Zmd% Znd& Zod' Zpd( Zqd) Zrd* Zsd+ Ztd, Zud- Zvd. Zwd/ Zxd0e5j                  d1eQfd2Zzd3e5j                  d0e5j                  d1eQfd4Z|d5 Z}d6 Z~d7 Zd8 Zd9 Zd: Zd; Zd< Zd= Zd> Zd? Zd@ ZdA ZdB ZdC ZdD ZdE ZdF ZdadG ZdH ZdI ZdJ ZdK ZdL ZdM ZdN ZdO ZdP ZdQ ZdR ZdS ZdT ZdU ZdV ZdW ZdX ZdY ZdZ Zd[ Zd\ Zd] Zd^ Zd_ Zd` Zda Zdb Zdc Zdd Zde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Zdm Zdn Zdo Zdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz ZÐd{ ZĐd| ZŐd} ZƐd~ Zǐd ZȐd Zɐd Zʐd Zːd Z̐dZ͐dZΐdZϐdZАdZѐdZҐdZӐdZԐdZՐdZ֐dZאdZؐdZِdZڐdZېdZܐdZݐdZސdZߐdZdZdZdZdZdZdZdZdZdZd ZdVdZdeTfdZdeWdeUde@fdZd3ekdeQdefdZdej.                  de@fdZdej.                  defdZdej.                  fdZdej.                  defdZdej.                  defdZdej                  ee@eNdf   deUdeUfdZd Zd Zd3ekdej                  fdZd Zd Zd Zd ZdeUdej                  ee@df   dedeQdeUf
dZdeUdeUfdZdeUfdZdddddeUdeVdedeVdeUf
dĄZ dWdeUdeUdeNdeQdeNf
dǄZdej                  deLfdɄZdʄ Zd˄ Zd̄ Zd̈́ Zd΄ Zdτ ZdЄ Z	dф Z
d҄ Zdӄ ZdԄ ZdՄ Zdք Zdׄ Zd؄ Zdل Zdڄ Zdۄ Zd܄ Z G d݄ de5j,                        Zd߄ Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&de[de[deqfdZ' G d de5jP                        Z) G d de5jT                        Z+ G d de5jX                        Z-d Z. G d de5jT                        Z/ G d de5jT                        Z0de1fdZ2dXdeUdeVfdZ3deUfdZ4de@fd Z5de@fdZ6ddYdeQfdZ7dYdZ8d Z9d Z:d Z;d Z<d Z=deUfd	Z> G d
 de?      Z@d ZAdZde[de[de]defdZBdeUdeQfdZCd ZDd[de]deQdeQdefdZEd ZFddddddddZGddddddddZHd ZId ZJd ZKd ZLd ZMd ZNd  ZOd! ZPd" ZQd# ZRd$ ZSd% ZTd& ZUd' ZVd( ZWd) ZXdeUde{fd*ZYdeUde@fd+ZZd, Z[eFd-k\  rd. Z\n
d/ Z]d0 Z\dTd1Z^d\d2Z_d3eQde@fd4Z`d3eQde@fd5Zad6 Zbd7 Zcd8 ZddZedZfdZgdZhd9eQdeUfd:Zid; Zjd< eL       dd< eL       dd=ddd>	d?Zkdd=ddddddddd@
dAZl G dB dC      ZmddDlmnZn  eL enj                         j                         D cg c]  \  }\  }}}||dEz  |dEz  |dEz  ff c}}}}      Zpe-s( e5j                  e        e5j                  e       dF Zs ej                  es       enj                  Zuenj                  Zvenj                  Zwenj                  Zxenj                  Zyenj                  ec_l        enj                  ec_z        enj                  ek_|        enj                  ek_}        enj                  ek_~        enj                  ek_        enj                   ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj
                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                  ek_        enj                   ek_        enj"                  ek_        enj$                  ek_        ekj&                  ek_        enj*                  ek_        enj,                  e_        enj.                  eW_        enj0                  eW_        enj2                  eW_        enj4                  eW_        enj6                  eW_        enj8                  eW_        enj:                  eW_        enj<                  eW_        enj>                  eW_        enj@                  eW_        enjB                  eW_        enjD                  eW_        enjF                  eW_        enjH                  eW_        enjJ                  eW_        enjL                  eW_        enjN                  eW_        enjP                  eW_        enjR                  eW_        enj                  eW_l        enjT                  eW_        enjV                  eW_        enjX                  eW_        enj                  eW_z        enjZ                  eW_        enj\                  eW_        enj^                  eW_        enj`                  eW_        enjb                  eW_        enjd                  eW_        dG eW_        enjh                  eW_        enjj                  eW_        enjl                  eW_        enjn                  eW_        enjp                  eW_        ddHlmZ eeW_        enj,                  e{_        enjv                  e_         G dI dJe      ZdK Z	 e;ZdLe; dMe: dNej                  d    d%ej                  d    dOej                   dPej                  dQkD  rdnd dRZ y# e6$ r ddl5Z5Y Rw xY wc c} w c c} w # e<$ r i Z9Y w xY wc c}}}}w (]  zk
PyMuPDF implemented on top of MuPDF Python bindings.

License:

    SPDX-License-Identifier: GPL-3.0-only
    N   )extrac                 @   t         j                  j                  |       }||S |j                  d      rt	        t        |dd       dd      S |j                  d      rt	        |dd d      S |j                  d	      rt	        |d
d d      S t        d| d|      )zI
    Returns a stream to use based on environmental variable `name`.
    Nzfd:   wF)modeclosefdzpath:   zpath+:   az&Unrecognised stream specification for z? should match `fd:<int>`, `path:<string>` or `path+:<string>`: )osenvironget
startswithopenint	Exception)namedefaultts      G/var/www/horilla/myenv/lib/python3.12/site-packages/pymupdf/__init__.py_set_streamr   .   s     	

tAy	
e	C!"JS%88	
g	AabE3	
h	AabE3@  IH  IJ  HM  N  O  	O    PYMUPDF_LOGPYMUPDF_MESSAGEFc                      t         S N_g_log_items r   r   
_log_itemsr!   D   s    r   c                     | a y r   )_g_log_items_active)actives    r   _log_items_activer%   G   s     r   c                      t         d d = y r   r   r    r   r   _log_items_clearr'   K   s	    Qr    c                 R   t        j                  d      |   }t        j                  j	                  |j
                        }|j                  }|j                  }| d| d| d|  } t        rt        j                  |        t        | t               t        j                          y)z0
    For development/debugging diagnostics.
    r   )context:: fileN)inspectstackr   pathrelpathfilenamelinenofunctionr#   r   appendprint
_g_out_logflush)textcallerframe_recordr3   liner5   s         r   logr>   O   s     ==!,f5L''//,"7"78H%%D''HZqazD62DD!	$Z r   c                 N    t        | t               t        j                          y)z
    For user messages.
    r-   N)r7   _g_out_messager9   r:   s    r   messagerB   ^   s     
$^$r   c                  T    dd l } t        d       t        | j                                y )Nr   zexception_info:)	tracebackr>   
format_exc)rD   s    r   exception_inforF   f   s    /	r   z
()<>[]{}/%c                     t         j                  j                  |       }||}n|dk(  rd}n|dk(  rd}nJ d|  d|       ||k7  rt        d|  d|       |S )}
    Returns `True`, `False` or `default` depending on whether $<name> is '1',
    '0' or unset. Otherwise assert-fails.
    1T0FzUnrecognised value for r,   Using non-default setting from )r   r   r   r>   r   r   vrets       r   get_env_boolrO   o   sr    
 	

Ay	
c	
c9+D6A599q
g~-dV2aU;<Jr   c                     t         j                  j                  |       }||}nt        |      }||k7  rt	        d|  d|        |S )rH   rK   r,   )r   r   r   r   r>   rL   s       r   get_env_intrQ      sK    
 	

Ay!f
g~-dV2aS9:Jr   PYMUPDF_EXCEPTIONS_VERBOSEPYMUPDF_USE_EXTRATc                       e Zd Zd Zy)_Globalsc                 <    d| _         d| _        d| _        d| _        y Nr   )no_device_cachingsmall_glyph_heightssubset_fontnamesskip_quad_correctionsselfs    r   __init__z_Globals.__init__   s"    !"#$  !%&"r   N__name__
__module____qualname__r^   r    r   r   rU   rU      s    'r   rU   MUPDF_CPPYYz: $MUPDF_CPPYY=z% so attempting to import mupdf_cppyy.z: $PYTHONPATH=
PYTHONPATHmupdf_cppyy)mupdfc                 N    | j                  d      }|dk\  r| d| } t        |       S )z<
    Converts string to int, ignoring trailing 'rc...'.
    rcr   N)findr   )r:   rh   s     r   _int_rcrj      s-     
4B	QwCRyt9r   z1.24.5z2024-05-30 00:00:01- r+   .z8Inconsistent MuPDF version numbers: mupdf_version_tuple=z != VersionFitz=z%gfmtc                    t        | t        t        f      r"d}| D ]  }|r|dz  }|t        ||      z  } |S t        dk\  rt        j                  ||       S || z  S )z
    Returns `value` formatted with mupdf.fz_format_double() if available,
    otherwise with Python's `%`.

    If `value` is a list or tuple, we return a space-separated string of
    formatted values.
    r(   rl   rn   )r         )
isinstancelisttuple	_format_gmupdf_version_tuplerf   fz_format_double)valuero   rN   rM   s       r   rv   rv      so     %$' 	)As
9QC((C	) 
*,))#u55;r   Page_forward_declPoint_forward_declTESSDATA_PREFIXmatrix_like
point_like	quad_like	rect_likec                 ,   t        | t              r#| j                  rt        d      | j                  } t        | t
        j                        r| S t        | t
        j                        r| j                         S | J d       J dt        |              )zz
    Returns document as a mupdf.FzDocument, upcasting as required. Raises
    'document closed' exception if closed.
    document closeddocument is NoneUnrecognised type(document)=)
rs   Document	is_closed
ValueErrorthisrf   
FzDocumentPdfDocumentsupertypedocuments    r   _as_fz_documentr     s    
 (H%.//==(E,,-	He//	0~~		%$%q31$x.!233qr   c                 6   t        | t              r#| j                  rt        d      | j                  } t        | t
        j                        r| S t        | t
        j                        rt        j                  |       S | J d       J dt        |              )z
    Returns document as a mupdf.PdfDocument, downcasting as required. If we
    fail (i.e. document is a mupdf.FzDocument(), <ret>.m_internal will be
    None. Raises 'document closed' exception if closed.
    r   r   r   )	rs   r   r   r   r   rf   r   r   r   r   s    r   _as_pdf_documentr     s     (H%.//==(E--.	He..	/  **		%$%q31$x.!233qr   c                     t        | t              r| j                  } t        | t        j                        r| j                         S t        | t        j                        r| S | J d       J dt        |              )z@
    Returns page as a mupdf.FzPage, upcasting as required.
    page is NoneUnrecognised type(page)=)rs   Pager   rf   PdfPager   FzPager   pages    r   _as_fz_pager   '  si     $yy$&zz|	D%,,	'	!L!q/-$t*//qr   c                    t        | t              r| j                  } t        | t        j                        r| S t        | t        j
                        rt        j                  |       S | J d       J dt        |              )z
    Returns page as a mupdf.PdfPage, downcasting as required. If we fail (i.e.
    page is a mupdf.FzPage(), <ret>.m_internal will be None.
    r   r   )rs   r   r   rf   r   r   pdf_page_from_fz_pager   r   s    r   _as_pdf_pager   6  sn    
 $yy$&	D%,,	'**400	!L!q/-$t*//qr   c                      e Zd Zd Zd Zd Zd Zd Zd ZdFdZ	dGd	Z
ed
        Zed        Zed        Zed        ZdHdZed        Zd Zed        Zed        Zd Zd Zd ZdIdZd ZdJdZed        Zed        Zed        Zed        Zed        Zed        Z ed        Z!ed         Z"ed!        Z#ed"        Z$ed#        Z%ed$        Z&ed%        Z'd& Z(d' Z)d( Z*dKd)Z+dLd*Z,d+ Z-dMd,Z.d- Z/dNd.Z0d/ Z1d0 Z2dFd1Z3d2 Z4d3 Z5d4 Z6d5 Z7dFd6Z8ed7        Z9	 	 	 	 	 	 	 	 	 dOd8e:d9e;d:e<d;e:d<e=d=e=d>e=d?e>d@e?fdAZ@dPdBZAeBdC        ZCedD        ZDedE        ZEy)QAnnotc                 J    t        |t        j                        sJ || _        y r   )rs   rf   PdfAnnotr   r]   annots     r   r^   zAnnot.__init__O  s    5%..111	r   c                 X    t        | dd      }d| j                  d   dt        |      S )Nparentz<>'r   z' annotation on )getattrr   str)r]   r   s     r   __repr__zAnnot.__repr__S  s'    x.*.))A,FDDr   c                 "    | j                         S r   )r   r\   s    r   __str__zAnnot.__str__W  s    }}r   c                 .    t        | dd      rd| _        y y )NthisownF)r   r   r\   s    r   _erasezAnnot._eraseZ  s    4E* DL +r   c                    | j                   }t        j                  |      t        j                  k7  ry t	               }	 t        j
                  t        j                  |      d      }|j                  r)t        d       t        j                  |      }||t        <   t        j
                  t        j                  |      d      }|j                  r(t        j                  |      }t        |      |t        <   n	d|t        <   t        j                  t        j                  |      t        d            }d}|j                  rt        j                   |      }||t"        <   |}|s|S | j*                  |d<   t,        j/                  |       \  }}	}
||d<   |	|d	<   |
|d
<   | j0                  d   }||d<   |S # t$        $ r t&        r
t)                Y y w xY w)NROzIgnoring redaction key '/RO'.OverlayTextr(   Qr   rect
text_colorfontnamefontsizefill)r   rf   pdf_annot_typePDF_ANNOT_REDACTdictpdf_dict_getspdf_annot_obj
m_internalmessage_warning
pdf_to_numdictkey_xrefpdf_to_text_stringJM_UnicodeFromStrdictkey_textpdf_dict_getPDF_NAME
pdf_to_intdictkey_alignr   g_exceptions_verboserF   r   TOOLS	_parse_dacolors)r]   r   valuesobjxrefr:   alignvalr   r   r   r   s               r   _get_redact_valueszAnnot._get_redact_values^  s   		&%*@*@@	%%e&9&9%&@$GC~~ ?@'','+|$%%e&9&9%&@-PC~~//4'8'>|$')|$$$U%8%8%?#OCE~~((-$)F=! JiiF).)>&
Hh&L"J"J{{6"F
  	#(8	s   D"F4 4GGc                    t         rYt        | j                  t        j                        sJ t        j                  | j                        }t        |t              sJ |S d }d }| j                  }t        |t        j                        sJ t        j                  |      }t        j                  |t        d      t        d            }t        j                  |      rt        j                  |      }|r|j                  rt        |      }|S )NAPN)g_use_extrars   r   rf   r   r   Annot_getAPbytesr   pdf_dict_getlr   pdf_is_streampdf_load_streamr   JM_BinFromBuffer)r]   rN   rresr   	annot_objaps          r   _getAPzAnnot._getAP  s    tyy%..999##DII.CsE***JACIIEuenn555++U3I$$i$#OB""B'++R0s~~$S)Hr   c                    	 | j                   }t        j                  |      }t        j                  |      }t        j                  |t        d      t        d            }|j                  st        t              t        j                  |      st        t              t        |      }|j                  st        t              t        |j                         ||d       |r@t        j                  |t        d            }t        j                   |t        d      |       y y # t"        $ r t$        rt'                Y y Y y w xY w)Nr   r   r   RectBBox)r   rf   r   pdf_annot_pager   r   r   RuntimeErrorMSG_BAD_APNr   JM_BufferFromBytesr   MSG_BAD_BUFFERJM_update_streamdocpdf_dict_get_rectpdf_dict_put_rectr   r   rF   )	r]   buffer_r   r   r   r   apobjr   bboxs	            r   _setAPzAnnot._setAP  s    	9IIE++U3I''/D''HTNHSMRE##"K00&&."K00$g.C>> .11dhhj%a8..	8F;KL''0@$G   	9#(8#	9s   D!D% %EENc                 
   | j                   }|j                  sJ t        j                  |      }t        j                  |      }|j                         }t        j                  |      }	t        |      \  }
}	 |
dk(  sO|	t        j                  t        j                  t        j                  t        j                  t        j                  fvr t        j                  |t        d             n|
dkD  rt        j                  ||d |
        |dk\  rdnd}|	t        j                   t        j                  t        j"                  t        j$                  t        j&                  t        j                  t        j                  t        j                  t        j                  t        j(                  t        j*                  fvrd}|r t        j,                  |t        d      |       t        j.                  |       t        j0                  |       d|_        |	t        j"                  k(  r|
dkD  rt        j4                  ||d |
        nr|
dkD  rmt        j6                  |j                         |
      }t9        |
      D ]  }t        j:                  |||           t        j<                  |t        d      |       |dk  s|dk\  r|sy	 t        jF                  t        j                  |      t        d      t        d            }|j                  stI        tJ              t        jL                  |t        d	            }|j                  s t        jN                  |t        d	      d
      }t        jP                  |j                         d      }|dk\  re|dk  r`t        jR                  |t        d      |       t        jR                  |t        d      |       t        jR                  |t        d      |       |r@t        jT                  |t        d      |       t        jT                  |t        d      |       t        jL                  |t        d            }|j                  s t        jN                  |t        d      d
      }t        j<                  |t        d      |       y# t>        $ r$}t@        r
tC                tE        d|         d }~ww xY w# t>        $ r$}t@        r
tC                tE        d|         d }~ww xY w)Nr   ICr   Rotatezcannot update annot: Tr   r   	Resourcesrr   r   CAcaBM	ExtGStateHz#cannot set opacity or blend mode
: )+r   r   rf   r   r   r   r   JM_color_FromSequencePDF_ANNOT_SQUAREPDF_ANNOT_CIRCLEPDF_ANNOT_LINEPDF_ANNOT_POLY_LINEPDF_ANNOT_POLYGONpdf_dict_delr   pdf_set_annot_interior_colorPDF_ANNOT_CARETPDF_ANNOT_FREE_TEXTPDF_ANNOT_FILE_ATTACHMENTPDF_ANNOT_INKPDF_ANNOT_STAMPPDF_ANNOT_TEXTpdf_dict_put_intpdf_dirty_annotpdf_update_annotresynth_requiredpdf_set_annot_colorpdf_new_arrayrangepdf_array_push_realpdf_dict_putr   r   rF   rB   r   r   r   r   pdf_dict_put_dictpdf_new_dictpdf_dict_put_realpdf_dict_put_name)r]   opacity
blend_mode
fill_colorrotater   r   r   pdftype_nfcolfcol
insert_rotcolier   	resourcesalp0extgs                       r   _update_appearancezAnnot._update_appearance  s   		''/	##U+hhj$$e,+J7t0	 zU****((--+++  ""Ix~>22E4<H$kqJ))**--33''((--++**))((  
&&	8H3EvN!!5)""E*#$C 11119--ud6ElC))488:u= =A--sDG<=""Ix~sC aK7a< 	$$''.TNSMB
 =="K00**B0EFI''!33R+9NPQR	%%txxz15D!|!''x~wG''x~wG''HTNGL''x~zJ''HTNJO%%y(;2GHD??..	8K;PRSThsmT: U  	#(8,QC01	J  	#(8;A3?@	s2   9H=R" GS "	S+S

S	S?S::S?c                    t        |        | j                  }t        j                  |      }t        j                  |t        d      t        d            }|j                  s7t        t        j                  t        j                  j                              }n*t        j                  |t        d            }t        |      }t        |      | j                         j                  z  }|| j                         j                  z  }|S )zannotation appearance bboxr   r   r   )CheckParentr   rf   r   r   r   r   JM_py_from_rectFzRectFixed_INFINITEr   r   
get_parenttransformation_matrixderotation_matrix)r]   r   r   r   r   r   s         r   apn_bboxzAnnot.apn_bbox  s     	D		''.	  HTNHSMJ}}!%,,u||/J/J"KLC**2x/?@D!$'C3i$//+AAAt 222
r   c                    	 t        |        | j                  }t        |t        j                        sJ t        j
                  t        j                  |      t        j                  t        j                        }|j                  st        t        j                               S t        j                  |t        j                        }t        |      }t        |      }|S # t        $ r t         r
t#                 w xY w)zannotation appearance matrix)r&  r   rs   rf   r   r   r   PDF_ENUM_NAME_APPDF_ENUM_NAME_Nr   JM_py_from_matrixFzMatrixpdf_dict_get_matrixPDF_ENUM_NAME_MatrixMatrixr   r   rF   )r]   r   r   matr   s        r   
apn_matrixzAnnot.apn_matrix  s    	IIEeU^^444$$''.**))B
 ==()9::++B0J0JKC#C(C+CJ 	#(8	s   B!C  $;C   C;c           
      h   t        |        | j                  }t        j                  |      }t        j                  |t        d            }d}|j                  r t        t        j                  |            }|S t        j                  |t        d      t        d      t        d      t        d            }t        j                  |      rt        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  |      s/t        j                  |      }t        |      D ]r  }	t        j                  ||	      }
t        j                  |
t        d            dk(  s<t        t        j                  t        j                  ||	                  }|c c S   |S )zannotation BlendModer   Nr   r   r   r   r   )r&  r   rf   r   r   r   r   r   pdf_to_namer   pdf_is_dictpdf_dict_lenr  pdf_dict_get_valpdf_dict_get_key
pdf_objcmp)r]   r   r   r   r  nr  obj1mjobj2s              r   	blendmodezAnnot.blendmode7  sf    	D		''.	  HTN;
>>*5+<+<S+ABJ!!%% S!""3'A1X .--c15$$T***40A"1X .$55dA> ++D(4.AQF):5;L;LUMcMcdhjkMl;m)nJ#--	.	. r   c                 |   t        |        | j                  d   }|t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  fvr
t               S t        j                  | j                        }t        |      }|S )zBorder information.r   )r&  r   rf   r   r  r  r   r   r   r   r   r   r   JM_annot_border)r]   atypeaorN   s       r   borderzAnnot.borderW  s     	D		!&&))##$$))''&&  6M  +b!
r   c                     t        |        | j                  }t        j                  t        j                  |            }t        ddd|      }t        j                  |||       y)z!Clean appearance contents stream.r   r   )recurseinstance_formsasciisanitizeN)r&  r   rf   pdf_get_bound_documentr   _make_PdfFilterOptionspdf_filter_annot_contents)r]   rN  r   r  filter_s        r   clean_contentszAnnot.clean_contentsj  sQ    D		**5+>+>u+EF(1AX`a''UG<r   c                     	 t        |        | j                  }t        |t        j                        sJ t        t        j                  |            S # t        $ r t        r
t                 w xY w)zColor definitions.)
r&  r   rs   rf   r   JM_annot_colorsr   r   r   rF   r   s     r   r   zAnnot.colorsr  s\    	IIEeU^^444"5#6#6u#=>> 	#(8	s   AA A.c                    t        |        | j                  }t        j                  |      }t        j                  |      }	 t        |      }|j                  snt        j                  ||       /t        j                  |t        d             t        j                  |j                         t        d            }t        j                  |      }d}t        |dz
  dd      D ]s  }t        j                  ||      }	t        j                  |	t        d            }
|	j                  sEt        j                  |
|      r\t        j                   ||       d}u |r/t        j"                  |j                         t        d      |       yy)z*Delete 'Popup' and responding annotations.r   PopupAnnotsr   ParentN)r&  r   rf   r   r   JM_find_annot_irtr   pdf_delete_annotr   r   r   r   pdf_array_lenr  pdf_array_getr>  pdf_array_deleter  )r]   r   r   r   	irt_annotannotsr?  foundr  ops              r   delete_responseszAnnot.delete_responses~  sE   D		''.	##E*)%0I''""43	 
 	9hw&78##DHHJ0BC'qsB# 	A##FA.A""1hx&89A<<##Ay1&&vq1	 txxz8H+=vF r   c                    t        |        t               }d}d}d}| j                  }t        j                  |      }t        j
                  |      }|t        j                  k7  rt        t              t        j                  |t        d      t        d      t        d            }|j                  st        dt               t        j                  |t        d            }	t        j                  |	t        d            }
|
j                  rt        j                  |
      }n@t        j                  |	t        d            }
|
j                  rt        j                  |
      }t        j                  |	t        d            }
|
j                  rt        j                  |
      }t        j                  |t        d	            }
|
j                  rt        j                   |
      }t        j                  |t        d
      t        d            }
|
j                  rt        j                   |
      }t#              |t$        <   t'        |      |t(        <   ||t*        <   ||t,        <   |S )zAttached file information.rY  NFSEFFbad PDF: file entry not foundUFDescLengthParamsSize)r&  r   r   rf   r   r   r  	TypeErrorMSG_BAD_ANNOT_TYPEr   r   r   RAISEPYJM_Exc_FileDataErrorr   r   r   JM_EscapeStrFromStrdictkey_filenamer   dictkey_descdictkey_lengthdictkey_size)r]   r   lengthsizedescr   r   r  streamfsrc  r3   s               r   	file_infozAnnot.file_info  s    	Df		''.	$$U+E333/00$$	   46JK	8D>:r8D>2<<//2H""2x}5A|| 33A6r8F#34<<++A.Dvx'9:<<%%a(F(:HV<LM<<##A&D!4X!>.t4\%^!\
r   c                 Z    t        |        | j                  }t        j                  |      S )zFlags field.)r&  r   rf   pdf_annot_flagsr   s     r   flagszAnnot.flags  s&     	D		$$U++r   c                    t        |        | j                  }t        j                  |      }t        j                  |      }|t        j
                  k7  rt        t              t        j                  |t        d      t        d      t        d            }|j                  st        dt               t        j                  |      }t        |      }|S )zRetrieve attached file content.rg  rh  ri  rj  )r&  r   rf   r   r   r  rp  rq  r   r   r   rr  rs  r   r   )r]   r   r   r   r|  bufr   s          r   get_filezAnnot.get_file  s    D		''.	##E*5222/00$$YPXY\P]^  46JK##F+s#
r   c                     t        |        d}| j                  }t        j                  |      }t        j                  |t        d            }|j                  rt        j                  |      }|S )z*Get annotation optional content reference.r   OCr&  r   rf   r   r   r   r   r   )r]   ocr   r   r   s        r   get_oczAnnot.get_oc  sZ    D		''.	  HTN;>>!!#&B	r   c                 *   	 t        | d      }|S # t        $ ry t        j                  | j                        }t        |t        j                        sJ |j                  rt        |j                               nd }t        ||      }|| _        Y |S w xY w)Nr   )r   AttributeErrorrf   r   r   rs   r   r   r   r   r   r   )r]   rN   r   r   s       r   r*  zAnnot.get_parent  s    	4*C 
  	''		2DtU]]33304x,THtX&CDK 
	s    A>BBc                    t        |        t        t        t        d}t	        |      t
        u r |j                  |j                         d      }|rt        |dz  |dz        }t        |      }|}|st        j                         }t        j                  | j                  ||t        j                  d      |      }t        |      }	|r|	j!                  ||       |	S )zannotation Pixmap)grayrgbcmykNH   r   )r&  csGRAYcsRGBcsCMYKr   r   r   lowerr5  JM_matrix_from_pyrf   fz_device_rgbpdf_new_pixmap_from_annotr   FzSeparationsPixmapset_dpi)
r]   matrixdpi
colorspacealphacspacesctmcspixrN   s
             r   
get_pixmapzAnnot.get_pixmap  s     	D!%@
s" Z%5%5%7>JC"HcBh/F'$$&B--diib%BUBUVWBXZ_`SkKKS!
r   c                 ~   t        |        | j                  }t        j                  |      }t        j                  |      }t        j
                  |t        d            }|t        j                  k7  s|j                  st        t              t        j
                  |t        d            j                  rt        dt               t               }t        j
                  |t        d            }|j                  rt        j                  |      |d<   t        j
                  |t        d            }|j                  rt        j                  |      |d<   t        j
                  |t        d            }|j                  rt        j                  |      |d	<   t        j
                  |t        d
            }|j                  rt        j                   |      |d<   t        j"                  |d      }|j                  rt        j                   |      |d<   t        j$                  |      }t'        |      }||d<   |S )zRetrieve sound stream.Soundri  zunsupported sound streamRrateCchannelsBbpsEencodingCOcompressionr|  )r&  r   rf   r   r   r   r   PDF_ANNOT_SOUNDr   rp  rq  rr  rs  r   pdf_to_realr   r9  r   r   r   )	r]   r   r   r   soundr   r   r  r|  s	            r   	get_soundzAnnot.get_sound  s   D		''.	##E*""9hw.?@5(((0@0@/00eXc]3>>/1EFf  6>>++C0CK  6>>#..s3C
O  6>>))#.CJ  6>>#//4C
O!!%.>>!&!2!23!7C##E*!#&H
r   c                 F   t        |        t        j                         }||_        | j                  }t        j
                  ||      }t        |      }| j                         }t        |t        j                        r	||_        |S t        j                  |      |_        |S )zMake annotation TextPage.)r&  rf   FzStextOptionsr  r   FzStextPageTextPager*  rs   weakref	ProxyTyper   proxy)r]   clipr  optionsr   	stextpagerN   rd  s           r   get_textpagezAnnot.get_textpage1  s    D&&(		%%eW5	y!OOa**+CJ 
 !q)CJ
r   c                     t        |        | j                  }t        j                  t        j                  |      t        d            }|j                  rdS dS )z Check if annotation has a Popup.rW  TF)r&  r   rf   r   r   r   r   )r]   r   r   s      r   	has_popupzAnnot.has_popup@  sH     	D		  !4!4U!;Xg=NO~~t050r   c                 ^   t        |        | j                  }t               }t        t	        j
                  |            |t        <   t	        j                  t	        j                  |      t        d            }t        t	        j                  |            |t        <   t	        j                  t	        j                  |      t        d            }t        t	        j                  |            |t        <   t	        j                  t	        j                  |      d      }t        t	        j                  |            |t        <   t	        j                  t	        j                  |      t        d            }t        t	        j                  |            |t         <   t	        j                  t	        j                  |      d      }t	        j                  |      |t"        <   t	        j                  t	        j                  |      d      }t        t	        j                  |            |t$        <   |S )zVarious information details.NameTCreationDateMSubjNM)r&  r   r   r   rf   pdf_annot_contentsdictkey_contentr   r   r   r9  dictkey_namer   dictkey_titler   dictkey_creationDatedictkey_modDatedictkey_subject
dictkey_id)r]   r   r   rc  s       r   infoz
Annot.infoH  s    	D		f01I1I%1PQOu22598F;KL-e.?.?.BCL u22598C=I.u/G/G/JKM  3 3E :NK$5e6N6Nq6Q$R ! u22598C=I01I1I!1LMO  3 3E :FC$77:O  3 3E :DA+E,D,DQ,GHJ
r   c                     | j                   }t        j                  |      }t        j                  |t	        d            }|j
                  syt        j                  |      S )z%
        annotation IRT xref
        IRTr   )r   rf   r   r   r   r   r   )r]   r   r   irts       r   irt_xrefzAnnot.irt_xrefj  sN    
 		''/	  )Xe_=~~%%r   c                 V    t        |        t        j                  | j                        S )z-Get 'open' status of annotation or its Popup.)r&  rf   pdf_annot_is_openr   r\   s    r   is_openzAnnot.is_openv  s!     	D&&tyy11r   c                     | j                   }t        j                  |      }|t        j                  k(  ryt	        t        d      sJ t        j
                  |      S )zannotation languageNfz_string_from_text_language2)r   rf   pdf_annot_languageFZ_LANG_UNSEThasattrr  )r]   
this_annotlangs      r   languagezAnnot.language|  sP     YY
''
35&&&u=>>>22488r   c                     t        |        | j                  }t        j                  |      syt        j                  |      }t        j
                  |      }||fS )zLine end codes.N)r&  r   rf    pdf_annot_has_line_ending_stylespdf_annot_line_start_stylepdf_annot_line_end_style)r]   r   lstartlends       r   	line_endszAnnot.line_ends  sP     	D		55e<11%8--e4t|r   c                    t        |        | j                  }t        |t        j                        sJ |j
                  sJ t        j                  |      }|t        j                  k7  rt        j                  |      }nt        j                  |      }|j
                  rt        |      nd}|syd|_        |j                         j                  j                         | j                         j                  j                         k(  sJ ||j                  j                  t!        |      <   |j"                  d   t        j                  k(  r"t%               }t&        j)                  ||       |}|S )zNext annotation.NTr   )r&  r   rs   rf   r   r   r   PDF_ANNOT_WIDGETpdf_next_annotpdf_next_widgetr   r   r*  m_internal_valuer   _annot_refsidr   Widgetr   _fill_widget)r]   r  r  r   r   widgets         r   nextz
Annot.next  s    	DYY
*enn555$$$$$$Z0E***((4E))*5E#..eElD~~$$5574??;L;Q;Q;b;b;dddd*-

r#w'88A;%000XFsF+C
r   c                     t        |        | j                  }d}t        j                  t        j                  |      t        j
                        }t        j                  |      rt        j                  |      }|S )zOpacity.rY  )r&  r   rf   r   r   PDF_ENUM_NAME_CApdf_is_numberr  )r]   r   opyr   s       r   r  zAnnot.opacity  s`     	D		!4!4U!;U=S=STr"##B'C
r   c                    t        |        t        j                  t        j                  j                        }| j                  }t        j
                  |      }t        j                  |t        d            }|j                  rt        j                  |t        d            }t        |      }t        |      | j                         j                  z  }|| j                         j                  z  }|S )zannotation 'Popup' rectanglerW  r   )r&  rf   r(  r)  r   r   r   r   r   r   r'  r   r*  r+  r,  )r]   r   r   r   r   r   s         r   
popup_rectzAnnot.popup_rect  s     	D||ELL778		''/	  )Xg->?>>**30@ADd# 3i$//+AAAt 222
r   c                     t        |        d}| j                  }t        j                  |      }t        j                  |t        d            }|j                  rt        j                  |      }|S )zannotation 'Popup' xrefr   rW  r  )r]   r   r   r   r   s        r   
popup_xrefzAnnot.popup_xref  s]     	D		''.	  HW,=>>>##C(Dr   c                     t         r t        j                  | j                        }nt	        j
                  | j                        }t        |      }| j                         }||j                  z  }|S )zannotation rectangle)	r   r   Annot_rect3r   rf   pdf_bound_annotr   r*  r,  )r]   r   rd  s      r   r   z
Annot.rect  s]     ##TYY/C''		2C3i OO 	q"""
r   c           	         t        j                  | j                        }t        j                  |t	        d            }t        j
                  |      dk(  rt        j                  t        j                  |d            t        j                  t        j                  |d            t        j                  t        j                  |d             t        j                  t        j                  |d             fS y)z6
        annotation delta values to rectangle
        RD   r   r   rr   r   N)rf   r   r   r   r   r]  r  r^  )r]   r   arrs      r   
rect_deltazAnnot.rect_delta  s    
 ''		2	  )Xd^<$)%%u':':C'CD%%u':':C'CD&&(;(;S!(DEE&&(;(;S!(DEE	  *r   c                     t        |        | j                  }t        j                  t        j                  |      t        j
                        }|j                  syt        j                  |      S )zannotation rotationrY  )r&  r   rf   r   r   PDF_ENUM_NAME_Rotater   r   )r]   r   rotations      r   r  zAnnot.rotation  sU     	D		%%u':':5'A5C]C]^""**r   c                    t        |        | j                         }|j                  }|j                  }||| z  z  }| j                  }t        j                  |      }t        j                  |t        d      t        d            }|j                  st        t              t        |      }t        j                  |t        d      |       y)z1
        Set annotation appearance bbox.
        r   r   r   N)r&  r*  rotation_matrixr+  r   rf   r   r   r   r   r   r   JM_rect_from_pyr   )	r]   r   r   rotr6  r   r   r   r   s	            r   set_apn_bboxzAnnot.set_apn_bbox  s     	D ""((sd
		''.	  HTNHSMJ}},,t$HV$4d;r   c                 :   t        |        | j                  }t        j                  |      }t        j                  |t        d      t        d            }|j                  st        t              t        |      }t        j                  |t        d      |       y)z!Set annotation appearance matrix.r   r   r5  N)r&  r   rf   r   r   r   r   r   r   r  pdf_dict_put_matrix)r]   r  r   r   r   r6  s         r   set_apn_matrixzAnnot.set_apn_matrix  sr    D		''.	  HTNHSMJ}},,'!!"hx&8#>r   c                     t        |        | j                  }t        j                  |      }t        j                  |t        d      |       y)zSet annotation BlendMode.r   Nr&  r   rf   r   r  r   )r]   r  r   r   s       r   set_blendmodezAnnot.set_blendmode  s9    D		''.		8D>:Fr   c                    t        |        | j                  dd \  }}|t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  fvrt        d| d       y|t        j                  t        j                  t        j                  t        j                  fvr|dkD  rt        d| d       d}t        |      t        ur||||d}|j                  d	d       |j                  d
d       |j                  dd       |j                  dd       |d	   d|d	<   |d   d|d<   t        |d   d      r2t        |d         |d<   |d   D ]  }t        |t               rd|d<    n | j"                  }	t        j$                  |	      }
t        j&                  |
      }t)        |||
      S )zbSet border properties.

        Either a dict, or direct arguments width, style, dashes or clouds.Nrr   zCannot set border for ''.r   zCannot set cloudy border for 'rY  )widthstyledashescloudsr  r  r  r  __getitem__)r&  r   rf   r   r  r  r   r   r   r   rB   r   
setdefaultr  ru   rs   r   r   r   rO  JM_annot_set_border)r]   rI  r  r  r  r  rG  atnameitemr   r   r  s               r   
set_borderzAnnot.set_border&  s    	D		"1v&&))##$$))''&&  -fXR89&&))''&&	  z8CD<t#$uRXYF'2&'4((D)(B''?" F7O(#!F86(#]3$VH%56F8x( !$,'+F8$ 		''/	**I6"FC;;r   c                    t        |        | j                         j                  }t        |      t        ur||d}|j                  d      }|j                  d      }t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  f}|g dfv r|j                  | j                  dd       n`|^t        |d      rt!        |      g}t#        |       t%        |      d	v sJ d
t'        |       d}|j                  | j                  d|       |r-| j                  d   |vrt)        d| j                  d   z         y|g dfv r|j                  | j                  dd       y|_t        |d      rt!        |      g}t#        |       t%        |      d	v sJ d
t'        |       d}|j                  | j                  d|       yy)z\Set 'stroke' and 'fill' colors.

        Use either a dict or the direct arguments.
        r   stroker   r  r    r  []N	__float__r   r   r  []r   z0Warning: fill color ignored for annot type '%s'.r   r   )r&  r*  r   r   r   r   rf   r   r   r   r   r   r   xref_set_keyr   r  float
CheckColorlenrv   rB   )r]   r   r  r   r   fill_annotsss          r   
set_colorszAnnot.set_colorsU  s   
 	Doo&&<t#"f5Fzz&!H%--u/E/EuG[G[]b]v]vx}  yP  yP--0b"XTYYT2v{+-vv;)+++If%&a(ATYYQ/DIIaL3FSTUVB8TYYd3t[)d}tt9	)))IdO$A&ATYYa0 r   c                 ^    t        |        | j                  }t        j                  ||       y)zSet annotation flags.N)r&  r   rf   pdf_set_annot_flags)r]   r  r   s      r   	set_flagszAnnot.set_flagsy  s#    D		!!%/r   c                    t        |        t        |      t        u r\|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }d}| j                  }t        j                  |      }|rt        j                  ||       |r|rt        j                  ||       |r3t        j                  t        j                  |      t        d      |       |r3t        j                  t        j                  |      t        d      |       |r>t        j                  t        j                  |      d	t        j                  |             yyy)
zSet various properties.contentNtitlecreationDatemodDatesubjectr  r  r  )r&  r   r   r   r   rf   pdf_annot_has_authorpdf_set_annot_contentspdf_set_annot_authorpdf_dict_put_text_stringr   r   pdf_dict_putspdf_new_text_string)	r]   r  r/  r0  r1  r2  r3  r   	is_markups	            r   set_infozAnnot.set_info  s0   D:hhy$/GHHWd+E88ND9Lhhy$/Ghhy$/GD		..u5	((8**5%8..u/B/B5/I8TbKceqr..u/B/B5/I8TW=Zab##E$7$7$>HaHabiHjk  r   c                 $   | j                   }t        j                  |      }t        j                  |      }|dk  s&|t        j                  |j                               k\  rt        t              t        j                  |j                         |d      }t        j                  |t        d            }t        j                  t        j                  |            }|dk  rt        t              t        j                  |t        d      |       y)z)
        Set annotation IRT xref
        r   r   Subtyper  N)r   rf   r   r   pdf_xref_lenr   r   MSG_BAD_XREFpdf_new_indirectr   r   pdf_annot_type_from_stringr9  MSG_IS_NO_ANNOTr  )r]   r   r   r   r   r  subtirt_subts           r   set_irt_xrefzAnnot.set_irt_xref  s     		''/	##U+!8tu11488:>>l++$$dhhj$:!!3(;<33U5F5F5MNa<o..Ix<r   c                     t        |        | j                  }|st        j                  }nt        j                  |      }t        j
                  ||       y)zSet annotation language.N)r&  r   rf   r  fz_text_language_from_stringpdf_set_annot_language)r]   r  r  r  s       r   set_languagezAnnot.set_language  sA    DYY
&&D55h?D$$Z6r   c                     t        |        | j                  }t        j                  |      rt        j                  |||       yt        d       y)zSet line end codes.zbad annot type for line endsN)r&  r   rf   r   pdf_set_annot_line_ending_stylesr   )r]   startendr   s       r   set_line_endszAnnot.set_line_ends  s<    D		11%8225%E:;r   c                     t        |        | j                  }t        j                  |      }t        j                  |t        d      |       y)zSet /Name (icon) of annotation.r  Nr  )r]   r   r   r   s       r   set_namezAnnot.set_name  s:    D		''.		8F+;TBr   c                     t        |        | j                  }t        j                  |      }|s t        j                  |t        d             yt        t        j                  |      ||       y)z Set / remove annotation OC xref.r  N)r&  r   rf   r   r   r   JM_add_oc_objectrO  )r]   r  r   r   s       r   set_oczAnnot.set_oc  sR    D		''.	y(4.9U99)DiQSTr   c                     t        |        | j                  }t        |dd      st        j                  |d       yt        j                  ||       |dk  rt        j
                  |      }d|_        yy)zSet opacity.              ?r   N)r&  r   _INRANGErf   pdf_set_annot_opacityr   transparency)r]   r  r   r   s       r   set_opacityzAnnot.set_opacity  sf    D		c*''q1##E73S=''.D !D r   c                 ^    t        |        | j                  }t        j                  ||       y)z-Set 'open' status of annotation or its Popup.N)r&  r   rf   pdf_set_annot_is_open)r]   r  r   s      r   set_openzAnnot.set_open  s#    D		##E73r   c                     t        |        | j                  }t        j                  |      }t	        |      }t        j
                  t        |      |      }t        j                  ||       y)z@
        Create annotation 'Popup' or update rectangle.
        N)r&  r   rf   r   JM_rotate_page_matrixfz_transform_rectr  pdf_set_annot_popup)r]   r   r   pdfpager  r   s         r   	set_popupzAnnot.set_popup  sV     	D		&&.#G,##OD$93?!!%+r   c                    t        |        | j                  }t        j                  |      }t	        |      }t        j
                  t        |      |      }t        j                  |      st        j                  |      rt        t              	 t        j                  ||       y# t        $ r}t        d|        Y d}~yd}~ww xY w)zSet annotation rectangle.zcannot set rect: NF)r&  r   rf   r   r_  r`  r  fz_is_empty_rectfz_is_infinite_rectr   MSG_BAD_RECTpdf_set_annot_rectr   rB   )r]   r   r   rb  r  r   r   s          r   set_rectzAnnot.set_rect  s    D		&&u-#G,##OD$93?!!!$(A(A!(Dl++	$$UA. 	's+,	s   B( (	C	1CC	c                    t        |        | j                  }t        j                  |      }|t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  fvry|}|dk  r|dz  }|dk  r|dk\  r|dz  }|dk\  r|t        j                  k(  r
|dz  dk7  rd}t        j                  |      }t        j                   |t#        d      |       y)zSet annotation rotation.Nr   h  Z   r   )r&  r   rf   r   r  r   r  r  r  r   r   r   r   r  r  r   r  r   )r]   r  r   r   r  r   s         r   set_rotationzAnnot.set_rotation  s   D		##E*%%&&))//##$$))''&&%%$$  Ag3JC AgSj3JC Sj5,,,rQC''.	y(8*<cBr   c                    t        |        | j                  j                  syt        j                  | j                        }t        j
                  |      }t        j                  t        j                  | j                        d      }|j                  rt        j                  |      r||fS t        j                  |      }|||fS )zannotation typenullIT)
r&  r   r   rf   r   pdf_string_from_annot_typer   r   pdf_is_namer9  )r]   r  crc  its        r   r   z
Annot.type  s     	Dyy##$$TYY/,,U3!4!4TYY!?F||u0031:q!q"~r   r  r  r   r   r   border_colorr  	cross_outr  c
                    t         j                          t        |        d }
| j                  d   }| j                  j                  dd      }| j                  j                  dd      }| j                  d   }||}n| j                  d   }d}| j                  }|	dk7  r=|	dk  r|	d	z  }	|	dk  r|	d	k\  r|	d	z  }	|	d	k\  r|t        j                  k(  r
|	d
z  dk7  rd}	|| j                  }t        |d      s| j                  }d|cxk  rdk  sn |d}nd}|t        j                  k(  rt        |       t        |       t        |       t        j                  |       \  }}}d}|dk  rd}d}||}d}||}d}|dkD  r|}d}|r]d}t!        |      dk(  rd}n!t!        |      dk(  rd}nt!        |      dk(  rd} j"                  |||d}t        j%                  | |       | j'                  ||||	      }|du rt)        d       |
|d      } |
|d      }| j+                         j,                  }| }|r7ddj/                  t1        t2        |            z   dz   }|j5                  d      }nd}| j6                  r| j6                  \  }} nd \  }} | j9                         }!|!j;                         }"d}#|t        j<                  k(  r|rud}#|"dd }"|"\  }$}%}&}'}(|"j?                  |&       |"j?                  |%       |"j?                  |'       |"j?                  |%       |"j?                  |(       |"j?                  d!       |dkD  s|d"k7  rmd}#|dkD  rtA        |      j5                         d#z   gng })|"D ]@  }*|*jC                  d$      r|*jC                  d%      r
|d"k7  r|dd }*|)j?                  |*       B |)}"d&j/                  |"      }!|t        j                  k(  r|!jE                  d'      }+|!jG                  d(      d)z   },|!|+|, }!| jH                  jJ                  | jH                  jL                  }.}-|	d*v s!|jN                  |jP                  cxk(  rdk(  sn |.|-}.}-d+tA        |-|.f      j5                         z   d,z   }/|/d-z   |!z   }!d}0 |
|d      }1|1rd.}0 |
|d      }2|2r$|dkD  rd!}0tA        |      j5                         d/z   }nd"x}}2|1r|2rd0}0|0||1z   |2z   |/z   d&z   |0z   d&z   |!z   }!|
|d&z   |!z   }!d}d}#|t        jR                  t        jT                  fv rd&j/                  |"dd       d&z   }!d}#|d"k7  r5|t        jR                  k(  r	|!|z   d1z   }!nJ|t        jT                  k(  r7|!d!z   }!n1|t        jR                  k(  r|!d2z   }!n|t        jT                  k(  r|!d!z   }!|||!z   }!|!jW                  d3d4d      }!d}#|r|j5                  d      |!z   }!d}#d5|!z   d6z   }!|| z   dkD  r|t        jR                  t        jT                  fv rndt        jX                  t        jZ                  t        j\                  t        j^                  t        j`                  t        jb                  t        jd                  t        jf                  t        jh                  f
}3tk        dt!        |3            }4d)tm        d| j                  d         z  }5| jH                  |5 |5 |5|5fz   }d}#| jn                  }6||4v rDtq        |6d         |z  }7tq        |6d         |z  }8 |3|   | |7|8d|      }9|!|9j5                         z  }!| |4v rDtq        |6d7         |z  }7tq        |6d         |z  }8 |3|    | |7|8d|      }9|!|9j5                         z  }!|#r:|r%| js                  |       | ju                  |!d8       n| ju                  |!d8       |t        jv                  t        jx                  t        jz                  t        j|                  t        j~                  t        jT                  t        jR                  t        j                  t        j                  t        j                  f
vry| j                  }:|:dk(  ry| jH                  j                  | jH                  j                  z   d)z  };|:dk(  rpt        |t        dd      z
        d9k  ry| jH                  j                  |;|       }<| j                  |<jH                         | j                  t        dd             yt        |:      }=| jH                  j                  |;|=      }<| js                  |<jH                         | j                  ||=z         y):a"  Update annot appearance.

        Notes:
            Depending on the annot type, some parameters make no sense,
            while others are only available in this method to achieve the
            desired result. This is especially true for 'FreeText' annots.
        Args:
            blend_mode: set the blend mode, all annotations.
            opacity: set the opacity, all annotations.
            fontsize: set fontsize, 'FreeText' only.
            fontname: set the font, 'FreeText' only.
            border_color: set border color, 'FreeText' only.
            text_color: set text color, 'FreeText' only.
            fill_color: set fill color, all annotations.
            cross_out: draw diagonal lines, 'Redact' only.
            rotate: set rotation, 'FreeText' and some others.
        c                 F    t        | |      }|sy|dz   j                         S )zHReturn valid PDF color operator for a given color sequence.
            r   
)	ColorCodeencode)r  codeccs      r   color_stringz"Annot.update.<locals>.color_stringH  s)     2t$BI%%''r   r   r  Nr  rY  r  r   rk  rl  r   r   /H gs
r(   F   Tr   !{:g} {:g} {:g} rg /{f:s} {s:g} Tf{:g} g /{f:s} {s:g} Tfr  %{:g} {:g} {:g} {:g} k /{f:s} {s:g} Tffr)  )r  r  r  r  zError updating annotation.r  rs  r"  rl   z] 0 d
utf-8r   r      Sr   s    w   ws   RG   
   BT   ETrr   rl    s   0 0 s    re   
W
n
   fs    w
   B   b   ss   
S
s
   
S
[] 0 d
   q
s   
Q
r   h㈵>)Kr   update_timing_testr&  r   rI  r   r   r7  rf   r  rD  r  r  r&  r   r   r'  format
_update_dar$  r   r*  r+  joinmapr   r{  r  r   
splitlinesr   r6   rv   endswithri   rfindr   r  heightbrs  r   r   replace
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashr  maxverticesPointri  r   r  r   r  r  r   r   r  r  r  tlbrabsr5  morphsetRectr  )>r]   r  r  r   r   r   ru  r  rv  r  r~  
annot_typedtbwidthr  r   r   apnmatopa_codetcolfnamefsizeupdate_default_appearanceda_strro   r   bfillbstrokep_ctmimatr  line_end_leline_end_rir   ap_tab
ap_updated_LLLRURULntabr=   BTETr   hreopefill_stringstroke_stringle_funcsle_funcs_rangedpointsp1p2leftr  r  quadr6  s>                                                                 r   updatezAnnot.update*  s	   8 	  "D	( YYq\
[[__Xt,"-X&!D;;v&DR<1*# 1*C-# C-U6666B;!;K
 Jw,llG!z5 HH222|$z"z"!&!6D% ).%z,0)%!,0)# ,0)!| ,0)(t9>=CY!^2CY!^AC#TUe<  v.
 %%!	 & 
 %<;<<T3'vs+!77v388CRL11I=F]]7+FF>>'+~~$K'+$K [[]
///!
$*!2r2rb!b!b!b!b!d#zW^!
?Ez	&)002U:;r" &D}}T* }}U+3&s|KK%& F#B222B%1$BBrB99??DII$4$4qA"688vxx+D1+D!19aV,3355>Bk!B&BC&tS1K(s;M!"6*113g=),,}k)M9B>FLuTWYY!e^b(J%1153L3LMMF3BK(50BJ|!8!88ed*B5#<#<<dB!8!88dB5#<#<<dB"BH&6:BJ)B.BJb[8# $q(ZE<S<SUZUnUn;o-oe..0@0@))5+>+>--u~~,,e.D.D	)H
 #1c(m4NC4;;w/00A99QB1~-DJ]]Fn,6!9%,6!9%,,x,T2r5*Mdkkm#n,6":&-6":&-,x,T2r4Ldkkm#d#BQ'BQ'
 %%&&//##$$))''&&%%$$  mm"9YY\\DIILL(A-!86F1aL()D099??1vg.DLL#q!-Skyyq#&dii FSL)r   c                 |   t        |        | j                  }t        j                  |      }t        j                  |      }t        j
                  |      }|t        j                  k7  rt        t              t        j                  |t        d      t        d      t        d            }	|	j                  st        dt               t        j                  |t        d            }
t        |      }|r|j                  st!        t"              |rt%        ||	|d       t        j&                  |      \  }}t        j(                  |      }t        j*                  |	t        d      |       t        j,                  |	|t        d      t        d             |rt        j.                  |	t        d      |       t        j.                  |
t        d      |       t        j.                  |	t        d	      |       t        j.                  |
t        d	      |       t        j.                  |t        d
      |       |r@t        j.                  |	t        d	      |       t        j.                  |
t        d	      |       |rAt        j.                  |	t        d      |       t        j.                  |
t        d      |       yy)zUpdate attached file.rg  rh  ri  bad PDF: no /EF objectr   DLrn  ro  rk  Contentsrl  N)r&  r   rf   r   rO  r   r  rp  rq  r   r   r   rr  rs  r   r   r   r   r   fz_buffer_storagepdf_new_intr  pdf_dict_putlr7  )r]   r   r3   	ufilenamer{  r   r   r  r   r|  r}  r   r'  r  ls                  r   update_filezAnnot.update_fileF  s   D		''.	**95##E*5222/00$$YPXY\P]^  -/CD	8D>: !)3>>n--S&#q1,,S1FC!!#&Avx~q98H+=x?OP**68C=(K**2x}hG**68D>8L**2x~xH**9hz6JHU**68D>9M**2x~yI**68F3CTJ**2x/?F r   c                  4    d} t        d      D ]  }| |z  } 	 | S )Nr   i0u  )r  )totalr  s     r   r  zAnnot.update_timing_testq  s(     	AQJE	r   c           	         t        |        | j                  }t        |t        j                        sJ t        j
                  |      }t        j                  |      }t        j                         }t        j                         }t        j                  |||       t        |      }t        j                  ||      }t        j                  |t        d            }|j                  st        j                  |t        d            }|j                  st        j                  |t        d            }|j                  st        j                  |d      }|j                  rg }t!        dt        j"                  |      d      D ]  }	t        j$                  t        j&                  ||	            }
t        j$                  t        j&                  ||	dz               }t        j(                  |
|      }t        j*                  ||      }|j-                  |j.                  |j0                  f        |S t        j                  |d      }|j                  rg }t!        t        j"                  |            D ]  }	g }t        j&                  ||	      }t!        dt        j"                  |      d      D ]  }t        j$                  t        j&                  ||            }
t        j$                  t        j&                  ||dz               }t        j(                  |
|      }t        j*                  ||      }|j-                  |j.                  |j0                  f        |j-                  |        |S y	)
zannotation vertex pointsVerticesL
QuadPointsCLr   rr   r   InkListN)r&  r   rs   rf   r   r   r   r2  r(  pdf_page_transformJM_derotate_page_matrix	fz_concatr   r   r   r   r  r]  r  r^  FzPointfz_transform_pointr6   xy)r]   r   r   r   page_ctmdummyderotrc  r   r  r  r  pointres1o1rB  s                   r   r  zAnnot.verticesx  s    	D		%000''.	##E*>>#  uh7'-??8U3 y(:*>?||E$6$6y(3-$P||E$6$6y(<BX$Y||E$7$7	4$H<< C1e11!4a8 0%%e&9&9!Q&?@%%e&9&9!QqS&ABa+00A

UWWegg./0 J	95<< C5..q12 	!((A.q%"5"5b"91= 5A))%*=*=b!*DEA))%*=*=b!A#*FGA!MM!Q/E!44UHEEKK%''577!345 

4 	! J r   c                     t        |        | j                  }t        j                  t        j                  |            S )zannotation xref number)r&  r   rf   r   r   r   s     r   r   z
Annot.xref  s1     	D		 3 3E :;;r   r   )rY  NNrY  r   )NNNr   rW   )NrY  NNrY  NNNNNNNNNr   )	NNr   NNNNTrY  NNNN)Fr`   ra   rb   r^   r   r   r   r   r   r   r$  propertyr-  r7  rD  rI  rS  r   re  r~  r  r  r  r*  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r	  r  r  r  r*  r-  r;  rE  rI  rN  rP  rS  rZ  r]  rc  ri  rm  r   OptStrOptFloatr%  OptSeqboolr   r  r  staticmethodr  r  r   r    r   r   r   r   M  s!   E!%N&9(`D     .  >  $= 	 	G6 / /b , ,	(@ 1 1  B 	& 	& 2 2
 9 9 	 	  2    $ 	 	  &   + +<"	?G-<^"1H0l<= 7<CU
"4	, C<   !%#" $"& $!Z*Z*Z* Z* 	Z*
 Z* !Z* Z* Z* Z*x)GV   3 3j < <r   r   c                   d    e Zd Zd Zd ZddZddZddZddZddZ	dd	Z
ed
        Zd Zd Zy)Archivec                 x    t               | _        t        j                         | _        |r | j
                  |  yy)z
        Archive(dirname [, path]) - from folder
        Archive(file [, path]) - from file name or object
        Archive(data, name) - from memory item
        Archive() - empty archive
        Archive(archive [, path]) - from archive
        N)rt   _subarchivesrf   fz_new_multi_archiver   addr]   argss     r   r^   zArchive.__init__  s4     !F..0	DHHt r   c                 2    dt        | j                         S )NzArchive, sub-archives: )r'  r
  r\   s    r   r   zArchive.__repr__  s    (T->->)?(@AAr   Nc                 F    t        j                  | j                  ||       y r   )rf   fz_mount_multi_archiver   )r]   subarchr1   s      r   	_add_archzArchive._add_arch  s    $$dii$?r   c                 p    t        j                  |      }t        j                  | j                  ||       y r   )rf   fz_open_directoryr  r   )r]   folderr1   subs       r   _add_dirzArchive._add_dir  s(    %%v.$$diid;r   c                     t        |      }t        j                  t        j                               }t        j                  |||       t        j
                  | j                  ||       y r   )r   rf   fz_new_tree_archiveFzTreefz_tree_archive_add_bufferr  r   )r]   memoryr   r1   buffr  s         r   _add_treeitemzArchive._add_treeitem  sJ    !6*''8((#tT:$$diid;r   c                     |dk(  rt        j                  |      }nt        j                  |      }t        j                  | j                  ||       y Nr   )rf   fz_open_zip_archivefz_open_tar_archiver  r   )r]   filepathr  r1   r  s        r   _add_ziptarfilezArchive._add_ziptarfile  s?    A:++X6C++X6C$$diid;r   c                     t        |      }t        j                  |      }|dk(  rt        j                  |      }nt        j                  |      }t        j
                  | j                  ||       y r!  )r   rf   fz_open_bufferfz_open_zip_archive_with_streamfz_open_tar_archive_with_streamr  r   )r]   r  r  r1   r  r|  r  s          r   _add_ziptarmemoryzArchive._add_ziptarmemory  sY    !6*%%t,!877@C77@C$$diid;r   c                     d } fd}t        |t        j                        rt        |      }t        |t              rt        j
                  j                  |      r/ j                  ||        |t	        j                  |      |d      S t        j
                  j                  |      rat        |t              r|dk7  sJ d|d       t        |      5 }|j                         }ddd        j                  |        ||gdd      S t        d	|       ||      r8t        |t              r	|d|dk7  sJ  j                  ||        ||gdd      S t        |t        j                        rht!        |d
d      }|.|j"                  j%                         } j'                  |d|       n j)                  |d|        ||j+                         |d      S t        |t,        j.                        rt!        |j0                  dd      }|T|j0                  }t        |t2        j4                        s|j0                  } j'                  |j%                         d|       n j)                  |d|        ||j7                         |d      S t        |t8              r j;                  ||        |g |d      S t        |t<              rt?        |      dk(  r|\  }	}
t        |
t              sJ dtA        |
              ||	      r j                  |	|
|       n}t        |	t              rYt        j
                  j                  |	      rNt        |	d      5 }|j                         }ddd        j                  |
|       nJ dtA        |	      d        ||
g|d      S tC        |d      r|D ]  } jE                  ||        ytG        dtA        |       d      # 1 sw Y   xY w# 1 sw Y   xY w)a  
        Add a sub-archive.

        Args:
            content:
                The content to be added. May be one of:
                    `str` - must be path of directory or file.
                    `bytes`, `bytearray`, `io.BytesIO` - raw data.
                    `zipfile.Zipfile`.
                    `tarfile.TarFile`.
                    `pymupdf.Archive`.
                    A two-item tuple `(data, name)`.
                    List or tuple (but not tuple with length 2) of the above.
            path: (str) a "virtual" path name, under which the elements
                of content can be retrieved. Use it to e.g. cope with
                duplicate element names.
        c                 L    t        | t        t        t        j                  f      S r   )rs   r   	bytearrayioBytesIOr  s    r   is_binary_dataz#Archive.add.<locals>.is_binary_data  s    a%BJJ!?@@r   c                 J   t        || |      }|dk7  sj                  g k(  rj                  j                  |       y j                  d   }|d   dk7  s|d   |d   k7  rj                  j                  |       y |d   j                  |d          |j                  d<   y )N)ro   entriesr1   treerY  ro   r1   r3  )r   r
  r6   extend)r3  mountro   r  ltreer]   s        r   make_subarchz!Archive.add.<locals>.make_subarch  s    sG%@Gf} 1 1R 7!!((1))"-<6)U6]gfo-M%%,,W5)$++GI,>?,1D%%b)r   dirr(   z'Need name for binary content, but path=rm   Nr4  zNot a file or directory: r3   r   zipr   r   tarmultirr   zUnexpected type(name)=)r1   rbzUnexpected type(data)=r  zUnrecognised type )$rs   pathlibPathr   r   r1   isdirr  listdirisfiler   readr  r   zipfileZipFiler   fpgetvaluer*  r%  namelisttarfileTarFilefileobjr.  r/  getnamesr  r  ru   r'  r   r  r  rp  )r]   r/  r1   r1  r8  r  ffr3   rF  datar   r  s   `           r   r  zArchive.add  s   $	A
	2 gw||,'lGgs#ww}}W%gt,#BJJw$7uEE(!$, FBTG1EF;'] "aB"""2t,#TFD&99 #<WK!HIIG$dC(T 6?9=q6B .B B Bw-f551w
D9HZZ((*&&r1d3$$Xq$7 0 0 2D%@@1w=H__!"bjj1B&&r{{}a>$$Xq$7 0 0 2D%@@)NN7D)D'22gu%#g,!*; JD$dC(E,CT
}*EE(d#""4D"9D#&77>>$'dD) &QVVX&&&r4d&;63T
}A66qf55Wm, %t$% 0gqABBw" "Z& &s   O$O1$O.1O:c                     | j                   S )z'
        List of sub archives.
        )r
  r\   s    r   
entry_listzArchive.entry_listM  s    
    r   c                 B    t        j                  | j                  |      S r   )rf   fz_has_archive_entryr   r]   r   s     r   	has_entryzArchive.has_entryT  s    ))499d;;r   c                 X    t        j                  | j                  |      }t        |      S r   )rf   fz_read_archive_entryr   r   )r]   r   r  s      r   
read_entryzArchive.read_entryW  s#    **DIIt<&&r   r   )r`   ra   rb   r^   r   r  r  r  r%  r*  r  r  rP  rT  rW  r    r   r   r  r    sL    B@<<<<gR ! !<'r   r  c                   Z   e Zd Zd Zd Zd Zd Zd Zd ZdHdZ	d	 Z
d
 Zd ZdIdZd ZdJdZdHdZd ZdKdZd Zd Zd ZdHdZdHdZd Zd Zd Zd Zd Zed        Zd Zd Z d Z!d  Z"d! Z#e$d"        Z%d# Z&d$ Z'd% Z(d& Z)d' Z*e$d(        Z+e$d)        Z,e$d*        Z-e$d+        Z.e$d,        Z/d- Z0d. Z1e$d/        Z2d0 Z3d1 Z4d2 Z5dLd3Z6d4 Z7d5 Z8d6 Z9d7 Z:d8 Z;dLd9Z<d: Z=d; Z>d< Z?d= Z@d> ZAd? ZBd@ ZC	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dMdAZDdB ZEdNdCZFdD ZGdE ZHe$dF        ZIe$dG        ZJe	ZKe	ZLe	ZMy)OXmlc                     | S r   r    r\   s    r   	__enter__zXml.__enter__^      r   c                      y r   r    r  s     r   __exit__zXml.__exit__a      r   c                     t        |t        j                        r|| _        y t        t              r0t        j
                  |      }t        j                  |      | _        y J dt        |              )NzUnsupported type for rhs: )rs   rf   FzXmlr   r   fz_new_buffer_from_copied_datafz_parse_xml_from_html5r   )r]   rhsr  s      r   r^   zXml.__init__d  sW    sEKK(DI77=D55t<DI>249+>>1r   c                 .    fdd}g } | ||      }|S )Nc           	         | | j                   r.|j                  |d| j                   df       | j                  } <|j                  |d| j                   f       | j                         j                         D ]  \  }}|j                  |d| d| df       ! | j                  }|r |||dz         }|j                  |d| j                   f       | j                  } | |S )N"(=z 'r   r   ))is_textr6   r:   r  tagnameget_attributesitemsfirst_child)nodern  shiftkrM   child	show_nodes         r   rt  z%Xml._get_node_tree.<locals>.show_noden  s    "<<LL%1TYYKq)9!:;99Deq%789 //1779 9DAqLL%1QCr!A!789((%eUEAI>Eeq%789yy " Lr   r   r    )r]   rq  rn  rt  s      @r   _get_node_treezXml._get_node_treem  s'    	  $u-r   c                 J    | j                  d      }| j                  |       |S )zAdd bulleted list ("ul" tag)ulcreate_elementappend_childr]   rs  s     r   add_bullet_listzXml.add_bullet_list  %    ##D)% r   c                     | j                  d      }|||v r| S | j                  d       ||}n|d|z   z  }| j                  d|       | S )z5Set some class via CSS. Replaces complete class spec.classrl   get_attribute_valueremove_attributeset_attribute)r]   r:   clss      r   	add_classzXml.add_class  s]    &&w/?ts{Kg&;C3:C7C(r   Nc                     | j                  d      }t        |      t        u r |j                  | j	                  |             | j                         }|| }|j                  |       | S )zAdd a "code" tagr|  ry  r   r   rz  create_text_nodespan_bottomr]   r:   rs  prevs       r   add_codezXml.add_code  sb    ##F+:t44T:;!<D% r   c                 J    | j                  d      }| j                  |       |S )z!Add monospaced lines ("pre" node)prerx  r{  s     r   add_codeblockzXml.add_codeblock  %    ##E*% r   c                 J    | j                  d      }| j                  |       |S )zAdd description list ("dl" tag)dlrx  r{  s     r   add_description_listzXml.add_description_list  r}  r   c                 J    | j                  d      }| j                  |       |S )zAdd "div" tagdivrx  r{  s     r   add_divisionzXml.add_division  r  r   c                     |t        dd      vrt        d      | j                  }d| }| j                  |      }|dvr| j	                  |       |S | j
                  j	                  |       |S )zAdd header tagr      zHeader level must be in [1, 6]r  )h1h2h3h4h5h6rd  )r  r   rl  ry  rz  r   )r]   levelthis_tagnew_tagrs  s        r   
add_headerzXml.add_header  ss    a#=>><<eW+##G,DDe$L  'r   c                 J    | j                  d      }| j                  |       |S )zAdd horizontal line ("hr" tag)hrrx  r{  s     r   add_horizontal_linezXml.add_horizontal_line  r}  r   c                    | j                  d      }||j                  d|        ||j                  d|        ||j                  dd|        ||j                  d|        |j                  d|        | j                  |       |S )zAdd image node (tag "img").imgr  r  r  zfloat: r   src)ry  r  rz  )r]   r   r  r  imgfloatr   rs  s          r   	add_imagezXml.add_image  s    ##E*E74VH678*)=>E74EdV-% r   c                     | j                  d      }t        |t              s|}|j                  d|       |j	                  | j                  |             | j                         }|| }|j	                  |       | S )zAdd a hyperlink ("a" tag)r   href)ry  rs   r   r  rz  r  r  )r]   r  r:   rs  r  s        r   add_linkzXml.add_link  su    ##C($$DFD)40067!<D% r   c                     | j                   dvrt        d| j                         | j                  d      }| j                  |       |S )z8Add item ("li" tag) under a (numbered or bulleted) list.)olrw  zcannot add list item toli)rl  r   ry  rz  r{  s     r   add_list_itemzXml.add_list_item  sC    <<|+6EE##D)% r   c                     | j                  d      }|dkD  r|j                  dt        |             ||j                  d|       | j                  |       |S )zAdd numbered list ("ol" tag)r  r   rL  r   )ry  r  r   rz  )r]   rL  numtypers  s       r   add_number_listzXml.add_number_list  sV    ##D)19U40% r   c                     | j                  d      }| j                  dk7  r| j                  |       |S | j                  j                  |       |S )zAdd "p" tagrd  )ry  rl  rz  r   r{  s     r   add_paragraphzXml.add_paragraph  sL    ##C(<<3e$  KK$$U+r   c                 J    | j                  d      }| j                  |       |S Nspanrx  r{  s     r   add_spanzXml.add_span  s%    ##F+% r   c                     | j                  d      }|||v r| S | j                  d       ||}n|d|z   z  }| j                  d|       | S )z;Set some style via CSS style. Replaces complete style spec.r  ;r  )r]   r:   r  s      r   	add_stylezXml.add_style  s^    ((1Kg&=ES4ZE7E*r   c                     | j                  d      }t        |      t        u r |j                  | j	                  |             | j                         }|| }|j                  |       | S )zAdd a subscript ("sub" tag)r  r  r  s       r   add_subscriptzXml.add_subscript  b    ##E*:t44T:;!<D% r   c                     | j                  d      }t        |      t        u r |j                  | j	                  |             | j                         }|| }|j                  |       | S )zAdd a superscript ("sup" tag)supr  r  s       r   add_superscriptzXml.add_superscript  r  r   c                    |j                         }t        |      }| j                         }|| }t        |      D ]N  \  }}|j	                  | j                  |             ||dz
  k  s/|j	                  | j                  d             P | S )z"Add text. Line breaks are honored.r   r  )r  r'  r  	enumeraterz  r  ry  )r]   r:   lines
line_countr  r  r=   s          r   add_textzXml.add_text%  s    !Z
!<D ' 	=GAtd33D9::>!!!$"5"5d";<	= r   c                 X    t        j                  | j                  |j                         y r   )rf   fz_dom_append_childr   r{  s     r   rz  zXml.append_child3  s    !!499ejj9r   c                     | j                  d      }|j                  |       | j                         }|| }|j                  |       |S r  )ry  r  r  rz  )r]   r  r  r  s       r   append_styled_spanzXml.append_styled_span6  sI    ""6*u!<D$r   c                 R    t        t        j                  | j                              S r   )rY  rf   fz_dom_bodyr   r\   s    r   bodytagzXml.bodytag?  s    E%%tyy122r   c                 V    t        j                  | j                        }t        |      S r   )rf   fz_dom_cloner   rY  r]   rN   s     r   clonez	Xml.cloneB  s       $)),Cyr   c                     t        |       t        u r| S t        |       t        u rdt        |        dS t        |       t        t
        fv rdt	        |        S | S )Nzrgb(rj  r  )r   r   r   sRGB_to_rgbru   rt   )colors    r   
color_textzXml.color_textF  sZ    ;#L;#+e,-Q//;5$-'u''r   c                 T    t        t        j                  | j                  |            S r   )rY  rf   fz_dom_create_elementr   )r]   tags     r   ry  zXml.create_elementP  s    E//C@AAr   c                 T    t        t        j                  | j                  |            S r   )rY  rf   fz_dom_create_text_noder   r]   r:   s     r   r  zXml.create_text_nodeS  s    E11499dCDDr   c                     | j                         }|D ])  }t        d|d   z  |d   j                  dd      z          + y)z)Print a list of the node tree below self.z  r   r   ry  \nN)ru  rB   r  )r]   rn  r  s      r   debugz	Xml.debugV  sE    ##% 	CDD47NT!W__T5%AAB	Cr   c                 v    t        j                  | j                  |||      }|j                  rt	        |      S y r   )rf   fz_dom_findr   r   rY  r]   r  attmatchrN   s        r   ri   zXml.find\  s2    Ce<>>9 r   c                 v    t        j                  | j                  |||      }|j                  rt	        |      S y r   )rf   fz_dom_find_nextr   r   rY  r  s        r   	find_nextzXml.find_nexta  s2    $$diic5A>>9 r   c                     t        j                  | j                        ry t        j                  |       }|j                  rt        |      S y r   )rf   fz_xml_textr   fz_dom_first_childr   rY  r  s     r   ro  zXml.first_childf  s=    dii(&&->>9 r   c                 J    |sJ t        j                  | j                  |      S r   )rf   fz_dom_attributer   r]   keys     r   r  zXml.get_attribute_valueo  s     
s%%tyy#66r   c                     t        j                  | j                        ry t               }d}	 t        j                  | j                  |      \  }}|r|s	 |S |||<   |dz  }5Nr   r   )rf   r  r   r   fz_dom_get_attribute)r]   resultr  r   r  s        r   rm  zXml.get_attributess  sh    dii(11499a@HCc  FCLFA r   c                 X    t        j                  | j                  |j                         y r   )rf   fz_dom_insert_afterr   r]   rp  s     r   insert_afterzXml.insert_after  s    !!499dii8r   c                 X    t        j                  | j                  |j                         y r   )rf   fz_dom_insert_beforer   r  s     r   insert_beforezXml.insert_before  s    ""DIItyy9r   c                     |j                         }t        |      }t        |      D ]N  \  }}| j                  | j	                  |             ||dz
  k  s/| j                  | j                  d             P | S )Nr   r  )r  r'  r  rz  r  ry  )r]   r:   r  r  r  r=   s         r   insert_textzXml.insert_text  st    !Z
 ' 	=GAtd33D9::>!!!$"5"5d";<	= r   c                     | j                   duS )zCheck if this is a text node.NrA   r\   s    r   rk  zXml.is_text  s     yy$$r   c                 H    | j                   }|y	 |j                  }|s|S |})zReturn last child node.N)ro  r  )r]   rs  r  s      r   
last_childzXml.last_child  s5       =::DE	 r   c                 p    t        j                  | j                        }|j                  rt	        |      S y r   )rf   fz_dom_nextr   r   rY  r  s     r   r  zXml.next  s,    +>>9 r   c                 p    t        j                  | j                        }|j                  rt	        |      S y r   )rf   fz_dom_parentr   r   rY  r  s     r   r   z
Xml.parent  s,    !!499->>9 r   c                 p    t        j                  | j                        }|j                  rt	        |      S y r   )rf   fz_dom_previousr   r   rY  r  s     r   previouszXml.previous  s,    ##TYY/>>9 r   c                 B    t        j                  | j                         y r   )rf   fz_dom_remover   r\   s    r   removez
Xml.remove  s    TYY'r   c                 L    |sJ t        j                  | j                  |       y r   )rf   fz_dom_remove_attributer   r  s     r   r  zXml.remove_attribute  s    
s%%tyy#6r   c                 R    t        t        j                  | j                              S r   )rY  rf   fz_xml_rootr   r\   s    r   rootzXml.root  s    E%%tyy122r   c                     d}t        |t              r|}n>|t        k(  rd}n2|t        k(  rd}n&|t        k(  rd}n|t
        k(  rd}nt        d|      ||z  }| j                  |       | S )z Set text alignment via CSS styleztext-align: %sr  centerrightjustifyzUnrecognised align=)rs   r   TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr   r  )r]   r   r:   r   s       r   	set_alignzXml.set_align  sz    uc"Ao%A''A&&A((A3UH566axtr   c                 N    |sJ t        j                  | j                  ||       y r   )rf   fz_dom_add_attributer   )r]   r  ry   s      r   r  zXml.set_attribute  s    
s""DIIsE:r   c                 P    d| j                  |      z  }| j                  |       | S )z"Set background color via CSS stylezbackground-color: %s)r  r  r]   r  r:   s      r   set_bgcolorzXml.set_bgcolor  s&    %)??tr   c                 @    |rd}nd}d|z  }| j                  |       | S )zSet bold on / off via CSS styleboldnormalzfont-weight: %sr  r]   r   r:   s      r   set_boldzXml.set_bold  s,    CC 3&%r   c                 P    d| j                  |      z  }| j                  |       | S )zSet text color via CSS stylez	color: %s)r  r  r  s      r   	set_colorzXml.set_color  s(    dooe44%r   c                 2    d| }| j                  |       | S )z(Set number of text columns via CSS stylez	columns: r   )r]   colsr:   s      r   set_columnszXml.set_columns  s!    4&!%r   c                 2    d|z  }| j                  |       | S )z"Set font-family name via CSS stylezfont-family: %sr   )r]   fontr:   s      r   set_fontzXml.set_font  s     4'%r   c                 b    t        |      t        u rd}nd}d| | }| j                  |       | S )z Set font size name via CSS styler(   pxzfont-size: )r   r   r  )r]   r   r,  r:   s       r   set_fontsizezXml.set_fontsize  s;    >S BBXJrd+%r   c                     | j                   }|j                  dd|      rt        d| d      | j                  d|       | S )zSet a unique id.Nr  zid 'z' already exists)r  ri   r   r  )r]   uniquer  s      r   set_idz
Xml.set_id	  sG     yy99T4(tF8+;<==4(r   c                 @    |rd}nd}d|z  }| j                  |       | S )z!Set italic on / off via CSS styleitalicr  zfont-style: %sr   r!  s      r   
set_italiczXml.set_italic
	  s,    CC#%%r   c                 2    d| }| j                  |       | S )z>Set inter-line spacing value via CSS style - block-level only.z-mupdf-leading: r  )r]   leadingr:   s      r   set_leadingzXml.set_leading	  s    !'+tr   c                 2    d| }| j                  |       | S )z,Set inter-letter spacing value via CSS stylezletter-spacing: r   r]   spacingr:   s      r   set_letter_spacingzXml.set_letter_spacing	  s!    !'+%r   c                 2    d| }| j                  |       | S )z6Set line height name via CSS style - block-level only.zline-height: r5  )r]   
lineheightr:   s      r   set_lineheightzXml.set_lineheight 	  s    zl+tr   c                 2    d|z  }| j                  |       | S )zSet margin values via CSS stylezmargins: %sr   r!  s      r   set_marginszXml.set_margins&	  s    s"%r   c                 2    d| }| j                  |       | S )zSet opacity via CSS stylez	opacity: r   )r]   r  r:   s      r   rZ  zXml.set_opacity,	  s!    7)$%r   c                 ,    d}| j                  |       | S )z$Insert a page break after this node.zpage-break-after: alwaysr5  r  s     r   set_pagebreak_afterzXml.set_pagebreak_after2	  s    )tr   c                 ,    d}| j                  |       | S )z%Insert a page break before this node.zpage-break-before: alwaysr5  r  s     r   set_pagebreak_beforezXml.set_pagebreak_before8	  s    *tr   c                    | j                   }|j                         }||j                  |       ||j                  |       ||j	                  |       ||j                  |       ||j                  |       ||j                  |       ||j                  |       ||j                  |       |	|j                  |	       |
|j                  |
       ||j                  |       ||j                  |       ||j                  |       ||j                          ||j!                          ||j#                  |       || j%                  |       || j'                  |       g }|j)                  d      }||j+                  |       |j,                  }|r/|j+                  |j)                  d             |j,                  }|r/| j/                  ddj1                  |             |j3                          | S )zaSet any or all properties of a node.

        To be used for existing nodes preferrably.
        r  r  )r  r  r  r  r"  r$  r'  r*  r-  set_text_indentr3  r7  r;  r>  r@  rC  rE  set_word_spacingr0  r  r  r6   ro  r  r  r	  )r]   r   bgcolorr  r  columnsr)  r   indentr2  r6  letter_spacingr=  marginspagebreak_afterpagebreak_beforeword_spacingunqidr  r  tempstyles	top_stylers  s                           r   set_propertieszXml.set_properties>	  s   2 yy  "NN5!W%MM$NN5!W%MM$h'  (OOF#W%%##N3!
+W%&$$&'%%'#!!,/KK?NN3,,W5	 MM)$  MM%33G<=%%E  	7CHHV$45r   c                 2    d| }| j                  |       | S )z;Set text indentation name via CSS style - block-level only.ztext-indent: r5  )r]   rK  r:   s      r   rG  zXml.set_text_indent	  s    vh'tr   c                 2    d|z  }| j                  |       | S )Nztext-decoration: %sr   r!  s      r   set_underlinezXml.set_underline	  s    $s*%r   c                 2    d| }| j                  |       | S )z*Set inter-word spacing value via CSS stylezword-spacing: r   r9  s      r   rH  zXml.set_word_spacing	  s!    y)%r   c                 2   | }| j                   }|y|j                  r|j                  }|n|j                  r||j                  dk7  ry	 ||S |j                  dv s|j                  r|j                  },|j                  dk(  r|}|j
                  }n|S L)z$Find deepest level in stacked spans.Nr  )r   r  r  body)r  rk  r  rl  r  ro  )r]   r   rs  s      r   r  zXml.span_bottom	  s    =mmNNE} mm =EMMV3}}} 99U]]

}}&)) r   c                 @    t        j                  | j                        S r   )rf   
fz_xml_tagr   r\   s    r   rl  zXml.tagname	  s    ++r   c                 @    t        j                  | j                        S r   )rf   r  r   r\   s    r   r:   zXml.text	  s      $)),,r   r   r  r   r   NT)NNNNNNNNNNNNNNNNNN)	underline)Nr`   ra   rb   r[  r^  r^   ru  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rz  r  r  r  r  r  ry  r  r  ri   r  r  ro  r  rm  r  r  r  rk  r  r  r   r  r	  r  r  r  r  r  r"  r$  r'  r*  r-  r0  r3  r7  r;  r>  r@  rZ  rC  rE  rU  rG  rX  rH  r  rl  r:   add_varadd_sampadd_kbdr    r   r   rY  rY  \  sD   ?,	
		:3  BEC

  79: % % 	 	  
  
  
(7 3 3&;  !'JX
2 , , - - GHGr   rY  c                   >    e Zd Zd Zd Zd Zed        Zed        Zy)
Colorspacec                    t        |t        j                        r|| _        y|t        k(  r3t        j                  t        j                  j
                        | _        y|t        k(  r3t        j                  t        j                  j                        | _        y|t        k(  r3t        j                  t        j                  j                        | _        yt        j                  t        j                  j                        | _        y)z!Supported are GRAY, RGB and CMYK.N)
rs   rf   FzColorspacer   CS_GRAY
Fixed_GRAYCS_CMYK
Fixed_CMYKCS_RGB	Fixed_RGB)r]   r  s     r   r^   zColorspace.__init__	  s    ue001DIg**5+=+=+H+HIDIg**5+=+=+H+HIDIf_**5+=+=+G+GHDI**5+=+=+G+GHDIr   c                 D    d| j                      }d|d| j                  S )N)r(   GRAYr(   RGBCMYKzColorspace(CS_z) - )r?  r   r]   r  s     r   r   zColorspace.__repr__	  s    +DFF3+,dii88r   c                 @    t        j                  | j                        S r   )rf   fz_colorspace_namer   r\   s    r   _namezColorspace._name	  s    ''		22r   c                 @    t        j                  | j                        S )zSize of one pixel.)rf   fz_colorspace_nr   r\   s    r   r?  zColorspace.n	       $$TYY//r   c                 "    | j                         S )zName of the Colorspace.rv  r\   s    r   r   zColorspace.name	  s     zz|r   N)	r`   ra   rb   r^   r   rv  r  r?  r   r    r   r   rf  rf  	  s:    I93 0 0  r   rf  c                       e Zd Zd Zy)DeviceWrapperc                    t        |t        j                        r|\  }|| _        y t        |t        d       r|\  }}t        |      }t        j                  |      r.t        j                  t        j                         |      | _        y t        j                  t        j                         ||      | _        y t        |t        j                        r|\  }t        j                  |      | _        y t        |t        j                  d       r6|\  }}t        j                  |      }	t        j                  ||	      | _        y t        d|      )Nz%Unrecognised args for DeviceWrapper: )
args_matchrf   FzDevicer   r  JM_irect_from_pyfz_is_infinite_irectfz_new_draw_devicer2  fz_new_draw_device_with_bboxFzDisplayListfz_new_list_devicer  r  fz_new_stext_devicer   )
r]   r  devicepmr  r   r  tpr  optss
             r   r^   zDeviceWrapper.__init__	  s    tU^^,GFDIvt,HB#T*D))40!44enn6FK	!>>@PRTVZ[	u223CB00"5DIu00$7IB''/D112t<DIDTHMNNr   Nr_   r    r   r   r}  r}  	  s    Or   r}  c                   >    e Zd Zd Zd ZddZd	dZed        Zd Z	y)
DisplayListc                 6    t        |       t        ury d| _        y NF)r   r  r   r\   s    r   __del__zDisplayList.__del__	  s    Dz[(&r   c                    t        |      dk(  r;t        |d   t        j                        rt        j                  |d         | _        y t        |      dk(  r(t        |d   t        j                        r|d   | _        y J d|       )Nr   r   zUnrecognised args=)r'  rs   rf   r(  r  r   r  s     r   r^   zDisplayList.__init__	  so    t9>ja%,,?++DG4DIY!^
47E4G4G HQDI-+dW--1r   Nc                     t        |t              r|j                  }n-t        j                  t        j                  j
                        }t        | j                  ||||d       }d|_        |S NT)rs   rf  r   rf   rh  rn  JM_pixmap_from_display_listr   )r]   r  r  r  r  r   s         r   r  zDisplayList.get_pixmap
  sW    j*-#J++E,>,>,H,HIJ)$))VZPTVZ[
r   c                     t        j                         }||_        t        j                  | j                  |      }d|_        |S )z#Make a TextPage from a DisplayList.T)rf   r  r  r  r   r   )r]   r  stext_optionsr   s       r   r  zDisplayList.get_textpage
  s:    ,,.#		=9
r   c                 l    t        t        j                  | j                              }t	        |      }|S r   )r'  rf   fz_bound_display_listr   r   r]   r   s     r   r   zDisplayList.rect
  s)    e99$))DE3i
r   c                     t        j                  | j                  |j                  t	        |      t        |      t        j                                y r   )rf   fz_run_display_listr   r  r  r  FzCookie)r]   dwrA  areas       r   runzDisplayList.run
  s8    !!				!!$% 	r   )NNr   N)r   )
r`   ra   rb   r  r^   r  r  r  r   r  r    r   r   r  r  	  s/    .  
r   r  c                      e Zd ZdefdZddZd Zd ZddefdZ	dd	Z
defd
ZdefdZd Zd Zd Zd Zd Zdej(                  eef   defdZddZd Zd Zd ZddZd ZdefdZddededededed efd!Zd" Zd# Z d$ Z!d% Z"d& Z#dd'Z$d( Z%d) Z&d* Z'dd+Z(d, Z)d- Z*d. Z+d/ Z,dd0Z-e.d1        Z/dd2Z0dd3Z1d4 Z2d5 Z3d6d6d7d8ed9eddfd:Z4e.d;        Z5d< Z6d= Z7dd>Z8dd?ed@efdAZ9dB Z:dd?efdCZ;dD Z<	 	 	 ddEedFejz                  dGe>dHe>dIe>ddfdJZ?defdKZ@dej(                  eef   fdLZAdej(                  eef   deBfdMZCdej(                  eef   deDfdNZEdeFfdOZG	 	 	 	 ddej(                  eef   dFeHdGe>dHe>dIe>ddfdPZIddQZJdR ZK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddSZLdT ZMddUZNddVZOdW ZPdX ZQdY ZRdZ ZSdd?ed[edeFfd\ZTdd?ed[edeFfd]ZUd?edeFfd^ZVd_ ZWd` ZXda ZY	 	 	 	 	 	 	 	 ddbZZ	 	 	 	 	 	 	 	 	 ddcZ[e.dd        Z\e.de        Z]e.df        Z^e.dg        Z_e.dh        Z`e.di        Zadj Zbdk Zcdl Zddm Zedn Zfdo Zgdp Zhdq ZiddrZjds Zkdt Zle.du        Zme.dv        Zndw ZoddxZpdy Zqdz Zrd{ Zse.deDfd|       Ztdd?ed@efd}Zue.d~        ZvddZwe.d        Zxd Zyd Zze.d        Z{d Z|d Z}d Z~e.defd       Ze.defd       Zej                  j                  dk  rej
                  j                  Znej
                  j                  e   ZddedededefdZd ZddZe.d        Zd ZdedefdZddZd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd Zd Zd ZddZddZddZdeDdefdZdefdZdefdZd ZddZddZddZe.d        Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZe.d        Zd Zd Zd Zd ZddZd Zd ZddZd Zd Zd Zd ZdZ e.d       ZeZeZy)r   returnc                 @   t        |      t        u r|| j                  k  ryyt        |      t        t        fvst        |      dk7  ry|\  }}	 t        |t              r|dk  s|| j                  k\  ry	 t        |t              r|dk  s|| j                  |      k\  ryy)NTFrr   r   )	r   r   
page_countru   rt   r'  rs   chapter_countchapter_page_count)r]   locchapterpnos       r   __contains__zDocument.__contains__,
  s    9T__$9UDM)SX]!'3/Q;d000!#s+7$11'::r   Nc                 r   | j                   st        d      t        |      t        u r| j	                  |      S t        |      t
        t        t        fv r| j                  |      S t        |      t        urt        d      | j                  }|j                  r|j                  nd}|j                  r|j                  n|}|j                  r|j                  nd}|dk  r||z  }|dk  r||k\  rt        d      |dk  r||z  }|dk  r||kD  rt        d      | j                  t        |||            S )N	is no PDFzbad argument typer   r   bad page number(s))is_pdfr   r   r   delete_pagert   ru   r  delete_pagesslicer  rL  stopstep)r]   r  pcrL  r  r  s         r   __delitem__zDocument.__delitem__B
  s   {{[))7c>##A&&7tUE**$$Q''7%011__77qvvRqvvQaiRKE aiB;122QhBJD Qh"9122  udD!9::r   c                     | S r   r    r\   s    r   r[  zDocument.__enter__Y
  r\  r   c                 $    | j                          y r   closer  s     r   r^  zDocument.__exit__\
      

r   r  c                 l   t        |t              r1t        |j                  t	        |              D cg c]  }| |   	 c}S t        |t
              s;t        |t              r t	        |      dk(  rt        d |D              sJ d|d       || vrt        d| d      | j                  |      S c c}w )Nrr   c              3   <   K   | ]  }t        |t                y wr   )rs   r   ).0r  s     r   	<genexpr>z'Document.__getitem__.<locals>.<genexpr>b
  s     RqjkS]^_adSeRqs   zInvalid item number: i=rm   page z not in document)
rs   r  r  indicesr'  r   ru   all
IndexError	load_page)r]   r  rB  s      r   r  zDocument.__getitem___
  s    a%*AIIc$i,@%ABDGBB!S!jE&:s1v{sRqopRqOq 	.*t1-	.rD=uQC'7899~~a   Cs   B1c                    t         }da 	 d| _        d| _        d| _        d| _        g | _        i | _        i | _        i | _        t        j                         | _
        t        |t        j                        r|}	|	| _        d| _        	 |a y|rt!        |      t"        u rnLt%        |d      rt#        |      }n4t%        |d      r|j&                  }nt)        dt!        |      d|d	      |t!        |      t*        u r|| _        nkt!        |      t.        u rt+        |      | _        nIt!        |      t0        j2                  u r|j5                         | _        nt)        d
t!        |      d	      | j,                  }|s|s
d}nd| _        |r| j,                  
d}
|| _        n	d}
d| _        |
r`t8        j:                  j=                  |      sd| d}t?        |      t8        j:                  jA                  |      sd| d}tC        |      |
r1t8        j:                  jE                  |      dk(  rtG        d|d	      t!        | j,                        t*        u r#tI        | j,                        dk(  rtG        d      |}|}tK        |      }t        jL                  |      s2|jN                  |jP                  z
  }|jR                  |jT                  z
  }|rt        |t*              sJ |}tV        r+t        jX                  |      }t        jZ                  |      }n2t        j\                  t        j^                  |      tI        |            }|}|s|}t        j`                  ||      }n|rY|s	 t        jb                  |      }nht        jj                  |      }|r|jl                  r	 tn        dk\  rt        jp                  |      }t        jp                         }t        jr                  d      }t        jt                  |jl                  |jv                  |jv                  |jv                        }n t        jt                  |jl                  |      }t        jx                  |      }ntn        dk  rB|jz                  rpt        j|                  |      }t        j~                  |jz                  |      }n:J t        t              t        j                         }t        jx                  |      }|dkD  r|dkD  rt        j                  |||       n-t        j                        rt        j                  |ddd       |}|| _        d| _D        | j                  rt        j                         | _G        | j                  rd| _        n| j                          |r|j                         j                  d      s|r#d|j                         v r	 | j                         }t        rbt        | j                  t        j                        | _        | j                  rt        j                  | _P        |a yt        j                  | _P        |a y# td        $ r(}tf        dkD  r
ti                tC        d|d	      |d}~ww xY w# td        $ r+}tf        dkD  r
ti                tC        d|d|d	      |d}~ww xY w# td        $ r$}tf        dkD  r
ti                tC        d      |d}~ww xY w# |a w xY w)aV  Creates a document. Use 'open' as a synonym.

        Notes:
            Basic usages:
            open() - new PDF document
            open(filename) - string or pathlib.Path, must have supported
                    file extension.
            open(type, buffer) - type: valid extension, buffer: bytes object.
            open(stream=buffer, filetype=type) - keyword version of previous.
            open(filename, fileype=type) - filename with unrecognized extension.
            rect, width, height, fontsize: layout reflowable document
            on open (e.g. EPUB). Ignored if n/a.
        r   FNTabsoluter   zbad filename: type(filename)=z
 filename=rm   zbad stream: type(stream)=r  r(   zno such file: 'r   z' is no filez!Cannot open empty file: filename=zCannot open empty stream.r   zFailed to open file r   rq   z	 as type i  iX     svgcannot open broken document)RJM_mupdf_show_errorsr   is_encryptedmetadata	FontInfos	Graftmaps
ShownPagesInsertedImagesr  WeakValueDictionary
_page_refsrs   rf   r   r   this_is_pdfr   r   r  r   rp  r   r|  r-  r.  r/  rG  rv  r   r1   existsFileNotFoundErrorrB  FileDataErrorgetsizeEmptyFileErrorr'  r  rf  x1x0y1y0re   rb  r'  fz_open_memorypython_buffer_datafz_open_document_with_streamfz_open_documentr   r   rF   ll_fz_recognize_documentr   rw   FzStream	FzArchivell_fz_document_open_fn_callr   r   open_with_streamfz_open_file$fz_document_open_with_stream_fn_callr   MSG_BAD_FILETYPEfz_layout_documentfz_is_document_reflowabler   r   gen_id	_graft_id
needs_passinit_docr  r  convert_to_pdfr   r   page_count_pdfpage_count2page_count_fz)r]   r3   r|  filetyper   r  r  r   JM_mupdf_show_errors_oldpdf_document	from_filemsgr   r  r   rs  r   rN  magicr   r   handleraccelarchiver  r   r  s                              r   r^   zDocument.__init__h
  s
   $ $8  j	< %DN %D %D#DM!DN!DN!DO#%D&::<DO(E$5$56'(	#' x $< m tH~4:.x=6*#=="@h0A8+Q OPP!<5("(DK&\Y."'-DK&\RZZ/"(//"3DK#&@4</$CDD H$H"DKK/ 	%
!	
ww~~h/+H:Q7C+C001hZ|4C',,RWW__X6!;$'I{!%LMMDKK E)c$++.>!.C$'@BBAA%A,,Q/DD144KDD144K!&%000 #BBAFG //9D !//0H0H0KSQRVTD $E
 88E#]"'"8"8"BC
 #("@"@"J"&||!z':g'E161I050@27//$2G.3.O.O07060A0A050@0@070B0B	/2 /4.O.OQXQ]Q]_g.h ',&6&6&<#6#@'.'?'?/4/A/A8/L.3.X.XZaZrZrtx.y$,1",.>"??++-C**3/C1uQ((aH=005((c3;DDI  DL||!&??(,D%MMO  0 9 9% @HQVZbZhZhZjQjR //1
 #-tyy%:K:K#L ##',';';D$ $<  (-':':D$#; Q  ) ]3a7N<L"/2FxlRS0T"U[\\], (1 !z';a'?NDT*7:NxlZcdlcoop8q*rxy$y!zN % R/!38H+,IJPQQR $< s   A;[$ 	K&[$ 0Y	 &[$ ,B(Y= E9[$ Z4 A[$ 1[$ 		Y:#Y55Y::[$ =	Z1&Z,,Z11[$ 4	[!=[[!![$ $[(c                     | j                   S r   )r  r\   s    r   __len__zDocument.__len__(  s    r   c                     | j                   rdnd}| j                  4| j                  dk(  r|d| j                  z  z   S |d| j                  dz   S |d| j                  | j                  fz  z   S )Nzclosed r(   zDocument(<new PDF, doc# %i>)z
Document('z')z!Document('%s', <memory, doc# %i>))r   r|  r   r  r]   rA  s     r   r   zDocument.__repr__+  si    IR;;yyB9DNNJJJ4996666$))T^^9TTTTr   c           	         | j                   s| j                  rt        d      t        |       }|syt	        j
                  t	        j                  |      t        d      t        d      t        d      t        d            }|j                  rt	        j                  |      st        d      t	        j                  |      }t        ||      }t	        j                  |||       y)zAdd new form font.document closed or encryptedNRootAcroFormDRFontzPDF has no form fonts yet)r   r  r   r   rf   r   pdf_trailerr   r   r:  r   pdf_new_nameJM_pdf_obj_from_strr  )r]   r   r)  r  fontsrr  rM   s          r   _addFormFontzDocument._addFormFont3  s    >>T..;<<t$##!!3' $  u'8'8%'@ ;<<%d+E1a(r   c                    | j                   s| j                  rt        d      g }t        |       }|s|S t	        j
                  t	        j                  |      t        d            }t	        j
                  |t        d            }|j                  s|S t	        j
                  |t        d            }t        ||      }t        |      }t	        j                  |      }t	        j                  ||       t	        j                  |t        d             t        |      D ]'  }t        ||      \  }	}
t	        j                  ||
       ) |j!                  |       |}| j#                          |S )zDelete the TOC.r   r  OutlinesFirst)r   r  r   r   rf   r   r  r   r   JM_outline_xrefsr'  r   pdf_delete_objectr   r  JM_INT_ITEMr6   r  )r]   xrefsr  r  olrootfirst
xref_countolroot_xrefr  r  r   r   s               r   _delToCzDocument._delToCG  s1   >>T..;<<t$L!!%"3"3C"8(6:JK##D(:*>?  L""68G+<= .Z
&&v.[14*!56z" 	/A!%+GAt##C.	/ 	[!
r   c                     t        |       }t        j                  ||       |j                  j                  r t        j
                  |j                         y y r   )r   rf   pdf_delete_pager   rev_page_mapll_pdf_drop_page_tree)r]   r  r  s      r   _delete_pagezDocument._delete_pageg  s@    t$sC(>>&&''8 'r   c                     t        |       }t        |       t        |dt        j                  |      dz
        st        t              t        j                  ||       y)zDelete object.r   N)r   
ASSERT_PDFrW  rf   r>  r   r?  r  r]   r   r  s      r   _deleteObjectzDocument._deleteObjectm  sJ    t$3a!3!3C!8!:;l++T*r   c           	         t        |       }t        j                  t        j                  |      t	        d      t	        d      t	        d      t	        d            }t        j
                  |d|z  dz         }t        j                  |t	        d      t	        d            }t        j                  |      }t        |      }|S )Nr  NamesEmbeddedFilesrr   r   rh  ri  )r   rf   r   r  r   r^  r   r   )r]   idxr  namesentryfilespecr  conts           r   _embeddedFileGetzDocument._embeddedFileGetu  s    t$##!!#& !)! ##E1S573&&uhtnhsmL##H-$r   r  c                     | j                         }dt        |      z  }||v r|j                  |      }|S |t        t	        |            v r|}|S t        |      )Nz '%s' not in EmbeddedFiles array.)embfile_namesr   indexr  r'  r   )r]   r  	filenamesr  r"  s        r   _embeddedFileIndexzDocument._embeddedFileIndex  sf    &&(	03t9<9//$'C
 
	 U3y>**C 
 S/!r   c           	      V   t        |       }t        |       t        |      }|j                  st	        t
              t        j                  t        j                  |      t        d      t        d      t        d      t        d            }t        j                  |      s|t        j                  t        j                  |      t        d            }	t        j                  |d      }t        j                  |	|t        d      t        d      t        d             t        |||||d      }
t        j                  t        j                  |
t        d      t        d                  }t        j                   |t        j"                  |             t        j                   ||
       |S )Nr  r   r!  r   r   rh  ri  )r   r  r   r   rp  r   rf   r   r  r   pdf_is_arrayr   r  r  JM_embed_filer   pdf_array_pushr9  )r]   r   r   r3   r  r{  r  rN  r#  r  	fileentryr   s               r   _embfile_addzDocument._embfile_add  sO   t$3!'*^,,##!!#& !)! !!%(%%e&7&7&<hv>NOD''Q/EW%_-W% "#tXy$J	##Ix~x}M 	UE$=$=d$CDUI.r   c           	         t        |       }t        j                  t        j                  |      t	        d      t	        d      t	        d      t	        d            }t        j
                  ||dz          t        j
                  ||       y )Nr  r   r!  r   )r   rf   r   r  r   r_  )r]   r"  r  r#  s       r   _embfile_delzDocument._embfile_del  sp    t$##!!#& !)! 	ucAg.uc*r   c           	      `   t        |       }d}d}t        j                  |      }t        j                  |t	        d      t	        d      t	        d      t	        d            }t        j
                  |d|z  dz         }t        j                  |t	        d            }	|	j                  rt        j                  |	      }||d<   t        j                  t        j                  |t	        d	                  }
t        |
      |t        <   t        j                  t        j                  |t	        d
                  }
t        |
      |t        <   t        j                  t        j                  |t	        d                  }
t        |
      |t        <   d}d}t        j                  |t	        d      t	        d	            }t        j                  |      }t        j                  |t	        d            }|j                  rt        j                  |      }t        j                  |t	        d            }|j                  rt        j                  |      }nJt        j                  |t	        d      t	        d            }|j                  rt        j                  |      }||t         <   ||t"        <   |S )Nr   r  r   r!  rr   r   CI
collectionri  rk  rl  rY  rh  rm  r  rn  ro  )r   rf   r  r   r   r^  r   r   r   r   rt  ru  dictkey_ufilenamer   rv  r   rx  rw  )r]   r"  infodictr  r   ci_xreftrailerr#  rc  cir   len_r  r1  s                 r   _embfile_infozDocument._embfile_info  s   t$##C(## !)! quQw/8D>2==&&r*G!(''(:(:1hsm(LM%8%>!"''(:(:1htn(MN&9$&?"#''(:(:1hv>N(OP!24!8''8D>8C=I		*y(8*<=<<##A&Dy(4.9<<!!!$B##Ix/A8FCSTA||%%a(!##' r   c           	         t        |       }t        |       t        j                  t        j                  |      t        d      t        d      t        d      t        d            }t        j                  |      rkt        j                  |      }t        d|d      D ]E  }t        t        j                  t        j                  ||                  }|j                  |       G yy)z Get list of embedded file names.r  r   r!  r   rr   N)r   r  rf   r   r  r   r.  r]  r  rt  r   r^  r6   )r]   rH  r  r#  r?  r  r   s          r   _embfile_nameszDocument._embfile_names  s    t$3##!!#& !)! e$##E*A1a^ %)00!//q9
 $% %r   c           	         t        |       }d}t        j                  t        j                  |      t	        d      t	        d      t	        d      t	        d            }t        j
                  |d|z  dz         }	t        j                  |	t	        d      t	        d            }
|
j                  st        d	t               t        |      }|r'|j                  r|j                  st        t              |j                  r|r|j                  rt        ||
|d       t        j                  |      \  }}t        j                  |      }t        j                  |
t	        d
      |       t        j                   |
|t	        d      t	        d             t        j"                  |
      }|r t        j$                  |	t	        d      |       |r t        j$                  |	t	        d      |       |r t        j$                  |	t	        d      |       |S )Nr   r  r   r!  rr   r   rh  ri  r  r  rn  ro  rk  rl  )r   rf   r   r  r   r^  r   rr  rs  r   rp  r   r   r  r  r  r  r   r7  )r]   r"  r   r3   r  r{  r  r   r#  r$  r%  r   r'  r  r  s                  r   _embfile_updzDocument._embfile_upd  s   t$##!!#& !)! ##E1S573&&uhtnhsmL""-/CD )w))#..^,,>>g'*<*<S(C3,,S1FC!!#&Ax$;!Xh-?&AQR)**5(3-J**5(4.)L**5(62BDIr   c           	         | j                   rt        d      t        r t        j                  | j
                  |      S t        |       }d}d}d}d}t        j                  t        j                  |      t        d            }|j                  syt        j                  |t        d            }|j                  syt        j                  |t        d	            }	|	j                  syg }
t        |	|
      }
t        |
      }t        |      }|sy||k7  rt        d
      t        |      D ]  }t!        |
|         }||   }|d   }t#        |t$              st        d      |
|   |t&        <   t        j(                  ||      }t        j*                  t        j                  |t        d                  }|dk(  rd||<   n|dk(  rd||<   n|dk(  r
d||<   d||<   t        j*                  t        j                  |t        d                  }|dk  rd||<   n
|dkD  rd||<   t        j                  |t        d            }t        j,                  |      rt        j.                  |      dk(  rt        j0                  t        j2                  |d            t        j0                  t        j2                  |d            t        j0                  t        j2                  |d            f}||t4        <   d}t        j                  |t        d            }|j                  rt        j,                  |      s)t        j6                  |t        d      t        d            }t        j,                  |      rAt        j.                  |      dk(  r)t        j0                  t        j2                  |d            }t9        |      ||<   ||d<   |||<    y)z4Add color info to all items of an extended TOC list.r   zoomr  r2  collapser  Nr  r  z$internal error finding outline xrefsr   zneed non-simple TOC formatri  r   Trr   Countr   Fr  DestADr
   r  )r   r   r   r   Document_extend_toc_itemsr   r   rf   r   r  r   r   r  r'  r  r  r   rs   r   r   pdf_load_objectr   r.  r]  r  r^  dictkey_colorr   r%  )r]   rn  r  rD  r  r2  rE  r  r  r  r  r?  rA  r  r   r  itemdictbmr  countr  r  zr   s                           r   _extend_toc_itemszDocument._extend_toc_items#  sH   >>.//22DIIuEEt$!!%"3"3C"8(6:JK##D(:*>?  ""68G+<= .JJ6DEE q %	AuQx=D8DAwHh- ">??%*1XH\"&&sD1B$$e&8&8Xc]&KLEz#' !!%!#' !%$$e&8&8Xg=N&OPEqy%)"%*"$$R#7C!!#&5+>+>s+Cq+H))%*=*=c1*EF))%*=*=c1*EF))%*=*=c1*EF
 +0'A$$R&)9:C>>););C)@))"hsmXc]K!!#&5+>+>s+Cq+H%%e&9&9#q&AB"1XHTNDGE!HK%	r   r   c                 R    t        |      }|| j                  v r| j                  |= yy)z&Remove a page from document page dict.N)r  r  )r]   r   pids      r   _forget_pagezDocument._forget_pagei  s(    h$//!$ "r   r   bfnameextorderinglimitr"  c                    t        |       }|}|dk  rd}t        |      d|f |dk\  r3t        j                  |      \  }	}
}t        j                  d |	|
|d      }nrt        j
                  |      \  }	}
|	rt        j                  ||	|
dd      }n>t        ||      }|j                  st        d|z        t        j                  d ||d      }g }t        |      D ]b  }t        j                  ||      }t        j                  ||d      }|dk\  r|}|dkD  r|j                  ||f       P|j                  |df       d |S )N   zpdf=r   z font at xref %d is not supportedrU  )r   r  rf   fz_lookup_cjk_fontfz_new_font_from_memoryfz_lookup_base14_fontJM_get_fontbufferr   r   fz_new_font_from_bufferr  fz_encode_characterfz_advance_glyphr6   )r]   r   rU  rV  rW  rX  r"  r  mylimitrN  rz  r*  r)  r  wlistr  glyphadvs                     r   _get_char_widthszDocument._get_char_widthsp  sF   t$S=G3DC6"q= % 8 8 BD$00tT5!LD44V<JD$44VT4AN'T2~~#$F$MNN44T3QGw 	,A--dA6E((ua8C1}qyucl+ucl+	, r   c           	         t        |       }t        |       g }t        j                  d      }t        j                  t        j
                  |      t        d      |      }|j                  s|S t        j                  t        j                  |t        d                  }|j                  rt        ||       |S t        j                  t        j                  |t        d      t        d                  }|j                  rt        ||       |S t        j                  t        j                  |t        d                  }|j                  rt        j                  |      s|S t        j                  |      }t        |      D ]T  }t        j                  t        j                  t        j                  ||            t        d            }t        ||       V |S )N
PageLabelsr  NumsKids)r   r  rf   r  r   r  r   r   pdf_resolve_indirectr   JM_get_page_labelsr.  r]  r  r^  )	r]   r  rh   
pagelabelsr   numskidsr?  r  s	            r   _get_page_labelszDocument._get_page_labels  su   t$3''5
!!5#4#4S#98F;KZX~~I))5+=+=sHVDT+UV??r4(I))5+>+>sHVDTV^_eVf+gh??r4(I))5+=+=sHVDT+UVe&8&8&>I%q 	)A--&&(;(;D!(DEV$D r4(	) 	r   c                     	 t        j                  | j                  |      S # t        $ r t        dkD  r
t                Y yw xY w)zGet metadata.rr   r(   )rf   fz_lookup_metadata2r   r   r   rF   r  s     r   _getMetadatazDocument._getMetadata  s=    	,,dii== 	#a'N,<	s   " A Ac                    | j                   s| j                  rt        d      t        |       }t	        |       t        j                  t        j                  |      t        d            }t        j                  |t        d            }|j                  st        j                  |d      }t        j                  |t        d      t        d             t        j                  ||      }t        j                  |t        d      |       t        j                  |t        d            }t        j                  |      S )z/Get xref of Outline Root, create it if missing.r   r  r  r  Type)r   r  r   r   r  rf   r   r  r   r   r  r  pdf_add_objectr   )r]   r  r  r  ind_objs        r   _getOLRootNumberzDocument._getOLRootNumber  s    >>T..;<<t$3!!5#4#4c#:HV<LM##T8J+?@  ''a0F(8(::NO**C8Ghz&:GD''x
/CDF((r   c                    t        |       }|syg }t        j                  t        j                  |      t	        d            }|j
                  rvt        j                  |      }t        |      D ]S  }t        j                  ||      }t        j                  |      }t        j                  |      }|j                  |       U |S )zGet PDF file id.NID)r   rf   r   r  r   r   r]  r  r^  r   binasciihexlifyr6   )	r]   r  idlistidentityr?  r  rc  r:   hex_s	            r   _getPDFfileidzDocument._getPDFfileid  s    t$%%e&7&7&<htnM##H-A1X $''!4//2''-d#	$
 r   c                    | j                   s| j                  rt        d      | j                  }t	        |       }t        |t        j                        rt        j                  |      nt        j                  |      }|}|dk  r||z  }|dk  r||k\  rt        t              t        j                  ||      }t        j                  |t        j                        }g }	g }
|j                  rt        |||	|d|
       |	S )z,List fonts, images, XObjects used on a page.r   r   )r   r  r   r   r   rs   rf   r   pdf_count_pagesfz_count_pagesMSG_BAD_PAGENOpdf_lookup_page_objpdf_dict_get_inheritablePDF_ENUM_NAME_Resourcesr   JM_scan_resources)r]   r  whatr   r  	pageCountr?  pagerefrsrclistetracers              r   _getPageInfozDocument._getPageInfo  s    >>T..;<<iit$2<S%BSBS2TE))#.Z_ZnZnorZs	!eNA !e	>n--++C3--gu7T7TU??c4a@r   c                     t        |       }t        |       |s|st        t              t	        |d||dddddd
      }|S )z;
        Utility: insert font from file or binary.
        Nr   rY  )r   r  r   MSG_FILE_OR_BUFFERJM_insert_font)r]   fontfile
fontbufferr  ry   s        r   _insert_fontzDocument._insert_font  sG     t$3
011sD(J1aArRr   c                     | j                   }t        |t        j                        sJ 	 t        j                  |      }t        |      S # t
        $ r t        dkD  r
t                Y yw xY w)zLoad first outline.r   N)	r   rs   rf   r   fz_load_outliner   r   rF   Outline)r]   r   r  s      r   _loadOutlinezDocument._loadOutline  sc    ii3 0 0111	&&,B |  	#a'N,<	s   A
 
A)(A)c                 >    | j                   rt        d      J d       )z)Make an array page number -> page object.r   z_make_page_map() is no-op)r   r   r\   s    r   _make_page_mapzDocument._make_page_map  s     >>.//.-.qr   c                    t        |       }d}t        |       t        ||      \  }}}	t        j                  |t        d            }
t        ||      \  }}}t        j                  |t        d            }|r|}n|dz   }t        j                  |
|      }|s%|dk7  r t        j                  |t        d      |       t        j                  |||       |dk7  r|}|j                  rnt        j                  |t        d            }t        j                  |t        d      |dz          t        j                  |t        d            }|j                  rn|sHt        j                  |
|	       |}|j                  r#t        j                  |t        d            }t        j                  |t        d      |dz
         t        j                  |t        d            }|j                  rnn|r}|}|j                  rt        j                  |t        d            }t        j                  |t        d      |dz          t        j                  |t        d            }|j                  rnn5|	|k  rt        j                  |
|	       nt        j                  |
|	dz          |j                  j                  rt        j                  |j                         | j                          y)z"Move or copy a PDF page reference.r   rj  r   rZ  rF  N)r   r  pdf_lookup_page_locrf   r   r   r>  r  pdf_array_insertr   pdf_dict_get_intr  r_  r  r  _reset_page_refs)r]   r  nbbeforecopyr  samepage1parent1i1kids1page2parent2i2kids2posr   rO  s                     r   _move_copy_pagezDocument._move_copy_page
  sf   t$3 1#s;w""GXf-=>0#r:w""GXf-=>Cq&C . 	x'97Cuc219F##..8IJ&&0A519M++VXh5GH ## &&r2 ''!22FHW<MNE**FHW4EuqyQ"//(9KLF ''
  ''!22FHW<MNE**FHW4EuqyQ"//(9KLF ''
 8**E26**E26:>>&&''8r   c                 d   | j                   s| j                  rt        d      t        r#t	        j
                  | j                  |||       nt        |       }t        |t        j                        sJ t        j                  t        j                  j                        }||_        ||_        t        j                         }|dk  rt        t               t        j"                  |d      }t        j$                  ||d||      }t        j&                  |||       | j)                          | |   S )zMake a new PDF page.r   rY  r   r   )r   r  r   r   r   _newPager   r   rs   rf   r   r(  
Fixed_UNITr  r  FzBufferr  pdf_add_new_dictpdf_add_pagepdf_insert_pager  )	r]   r  r  r  r  mediaboxcontentsr!  page_objs	            r   r  zDocument._newPageC  s    >>T..;<<NNDIIsE6:"4(Cc5#4#4555||ELL$;$;<HHK HK~~'HRx .11 ..sA6I))3!YQH!!3X6 	Cyr   c                 2    t        |       }t        ||       y r   )r   _remove_dest_range)r]   numbersr  s      r   _remove_links_tozDocument._remove_links_to\  s    t$3(r   c                 |   t        |       }t        j                  ||d      }t        j                  |t	        d             t        j                  |t	        d             t        j
                  |d      }t        d      D ]  }t        j                  |d        t        j                  |t	        d      |       y )Nr   rG  rH  r   皙?r  )	r   rf   r@  r   r   r  r  r  r  )r]   r   r  r  r  r  s         r   _remove_toc_itemzDocument._remove_toc_item`  s    t$%%c43D(6"23D(3-0##S!,q 	3A%%uc2	3D(3-7r   c                     t        | dd      ry| j                  j                         D cg c]  }| }}|D ]  }|s|j                          d} | j                  j	                          yc c}w )z,Invalidate all pages in document dictionary.r   TN)r   r  r   r   clear)r]   rd  pagesr   s       r   r  zDocument._reset_page_refsk  sh    4d+ OO2245q55 	D	 	 6s   	A-c                    t        |       }t        |       t        j                  d      }t        j                  t        j
                  |      t        d            }t        j                  ||       t        j                  |t        j                  |d      |t        d             | j                         }| j                  |d      }|j                  dd|z        }| j                  ||       y )	Nrh  r  r   ri  T
compressedz/Nums[]z	/Nums[%s])r   r  rf   r  r   r  r   r   r  r  pdf_catalogxref_objectr  update_object)r]   labelsr  rm  r  r   r:   s          r   _set_page_labelszDocument._set_page_labelsv  s    t$3''5
!!%"3"3C"8(6:JK4,D%"5"5c1"=z8TZK[\!6||I{V';<4&r   c                 z   t        |       }t        j                  ||d      }|r t        j                  |t	        d      |       |rKt        j
                  |t	        d             t        ||      }	t        j                  |t	        d      |	       t        j                  |t	        d      |       |rbt        j                  |d      }
t        d      D ]  }||   }t        j                  |
|        t        j                  |t	        d      |
       n!|t        j
                  |t	        d             |t        j                  |t	        d	            j                  rYt        j                  |t	        d	            }|dk  r|d
u s	|dkD  r+|du r&|dz  }t        j                  |t	        d	      |       yyyyy)zB
        "update" bookmark by letting it point to nowhere
        r   TitlerG  rH  ri  r   r  NrF  FTrY  )r   rf   r@  r7  r   r   r  r  r  r  r  r  r   r   r  )r]   r   actionr0  r  rE  r  r  r  r   rs  r  r  s                r   _update_toc_itemzDocument._update_toc_item  s    t$%%sD!4**D(72CUKhv&67%sF3ChsmS9hsmU;##S!,A1X 1!H))1a01 hsmQ7hsm4!!4'):;FF**D(72CDEh%/QUx4?ORA**D(72CQG @PU G  r   c           	         t        |       }|syt        j                  t        j                  |      t	        d      t	        d      t	        d      t	        d            }t               }|j                  r}t        j                  |      rht        j                  |      }t        |      D ]E  }t        j                  ||      }|j                  t        t        j                  |                   G |S )z&Get list of field font resource names.Nr  r  r  r  )r   rf   r   r  r   rt   r   r:  r;  r  r=  r6   r   r9  )r]   r  r  r  r?  r  r  s          r   	FormFontszDocument.FormFonts  s     t$##!!#& $   1 1% 8""5)A1X F**5!4.u/@/@/CDEF r   c                     t        |       }t        |       t        ||||       t        j                  |j
                         y)zAdd a new OC layer.N)r   r  JM_add_layer_configrf   ll_pdf_read_ocgr   )r]   r   creatoronr  s        r   	add_layerzDocument.add_layer  s3    t$3S$4s~~.r   c                    d}t        |       }t        |       t        j                  |d      }t        j                  |t        d      t        d             t        j                  |t        d      |       t        j                  |t        d      d      }	|s t        j                  |	t        d             nSt        |t              sJ d	t        |      d
t               t        j                  |	t        j                  |             t        j                  |t        d      d      }
t        j                  d      }t        j                  |
|d      }t        j                  |t        d      d       |r!t        j                  |t        d      |       n t        j                  |t        d      d       t        j                  ||      }t!        |      }t        j"                  |t        d            }t        j                  ||       |dkD  rtt        j"                  |t        d            }t        j$                  |      st'        t(              t        j*                  ||      }|j,                  s.t'        t(              t        j"                  |t        d            }t        j"                  |t        d            }|j,                  s t        j                  |t        d      d      }t        j                  ||       |rLt        j"                  |t        d            }|j,                  slt        j                  |t        d      d      }nKt        j"                  |t        d            }|j,                  s t        j                  |t        d      d      }t        j                  ||       t        j.                  |j,                         t        j0                  |      }|S )zAdd new optional content group.r   r   ru  OCGr  Intentrr   Viewz)fixme: intent is not a str. type(intent)= type=UsageCreatorInfoCreatorPyMuPDFr=  ArtworkOCGsrY  ConfigsrI  Orderr   ONOFF)r   r  rf   r  r  r   r7  pdf_dict_put_arrayr0  rs   r   r   r  r  r  rv  JM_ensure_ocpropertiesr   r.  r   MSG_BAD_OC_CONFIGr^  r   r  r   )r]   r   configr  intentusager   r  ocgintentsuse_forci_namecre_infoindocgocpr   cfgs                    r   add_ocgzDocument.add_ocg  s   t$3 $$S!,3 0(5/B&&sHV,<dC**30BAF  (6*:;FC(LBT&\O7TGLL1   %*<*<V*DE))#x/@!D$$]3**7GQ?&&x)1DiP##Hhy.A5I##Hhy.A9M%%c3/ %S)  hv&67S&)B;$$S(9*=>C%%c* "344%%c62C>> "344$$S(3-8C  hw&78~~**30A1ECS&)$$S(4.9C>>..sHTNAF##C%9C>>--c8E?AFS&) 	cnn-'r   c                     | j                   rt        d      t        j                  | j                  |      }|r%d| _        d| _        | j                          d| _        |S )zDecrypt document.r   FT)r   r   rf   fz_authenticate_passwordr   r  r  r   )r]   passwordr   s      r   authenticatezDocument.authenticate  sS    >>.//,,TYYA %D %DMMODL
r   c                 H    t        |       }|syt        j                  |      S )z-Check whether incremental saves are possible.F)r   rf   pdf_can_be_saved_incrementallyr]   r  s     r   can_save_incrementallyzDocument.can_save_incrementally  s#    t$33C88r   T)ra  widgetsra  r  c                    t        |       }|st        d      t        j                  |t	        |      t	        |             y)a  Convert annotations or fields to permanent content.

        Notes:
            Converts annotations or widgets to permanent page content, like
            text and vector graphics, as appropriate.
            After execution, pages will still look the same, but no longer
            have annotations, respectively no fields.
            If widgets are selected the PDF will no longer be a Form PDF.

        Args:
            annots: convert annotations
            widgets: convert form fields

        	not a PDFN)r   r   rf   pdf_bake_documentr   )r]   ra  r  r  s       r   bakezDocument.bake  s6     t$[))S[#g,?r   c                 n    | j                   rt        d      t        j                  | j                        S )zNumber of chapters.r   )r   r   rf   fz_count_chaptersr   r\   s    r   r  zDocument.chapter_count)  s,     >>.//&&		22r   c                     | j                   rt        d      t        j                  | j                        }|dk  s||k\  rt        d      t        j
                  | j                  |      }|S )zPage count of chapter.r   r   zbad chapter number)r   r   rf   r  r   fz_count_chapter_pages)r]   r  chaptersr  s       r   r  zDocument.chapter_page_count0  s^    >>.//**DII6Q;'X-233,,diiAr   c                     t        | dd      rt        d      t        | d      r| j                  rd| _        | j	                          d| _        i | _        d| _        y)zClose document.r   Tr   _outlineN)r   r   r  r  r  r   r  r   r\   s    r   r  zDocument.close:  sV    4d+.//4$ DM ! 	r   c                    | j                   s| j                  rt        d      | j                  }|}|}t	        j
                  |      }|dk  rd}||dz
  kD  r|dz
  }|dk  r|dz
  }||dz
  kD  r|dz
  }t        t              }t        ||||      }	t        t              }
t        ||
      D ]  }t        t        |            |	S )z[Convert document to a PDF, selecting page range and optional rotation. Output bytes object.r   r   r   )r   r  r   r   rf   r  r'  JM_mupdf_warnings_storeJM_convert_to_pdfr  rB   )r]   	from_pageto_pager  fz_docrF  r  srcCountlen0r   len1r  s               r   r  zDocument.convert_to_pdfL  s    >>T..;<<''/6B1AB6AB1AB*+B7*+tT" 	5A.q124	5
r   r  toc                     | j                   rt        d      t        |       }|t        |      vs|t        d|      vrt        d      d}d}|dk(  r|dz
  }d}| j	                  ||||      S )zCopy a page within a PDF document.

        This will only create another reference of the same page object.
        Args:
            pno: source page number
            to: put before this page, '-1' means after last page.
        r   rY  r  r   r   r   r   r'  r  r  r]   r  r  r  r  r  s         r   	copy_pagezDocument.copy_pagec  s~     >>.//Y
5,,U2z221228aBF##CVT::r   c                    | j                   s| j                  rt        d      t        |       }t	        j
                  t	        j                  |      t        d            }|j                  r t	        j                  |t        d             yy)zDelete XML metadata.r   r  MetadataN)
r   r  r   r   rf   r   r  r   r   r   )r]   r  r  s      r   del_xml_metadatazDocument.del_xml_metadata|  sj    >>T..;<<t$!!5#4#4c#:HV<LM??hz&:; r   c                    | j                   st        d      | j                  rt        d      | j                  }|dk  r||z  }|dk  r||k\  rt        d      | j	                         }| j                         }t        |      D ]%  \  }}|d   |dz   k(  s| j                  ||          ' | j                  t        |f             | j                  |       | j                          y)z% Delete one page from a PDF.
        r  r   r   r  rr   r   N)r  r   r   r  get_tocget_outline_xrefsr  r  r  	frozensetr  r  )r]   r  r  tocol_xrefsr  r  s          r   r  zDocument.delete_page  s     {{[))>>.//__
Ag:C Ag *122 lln))+ ~ 	3GAtAw#'!%%hqk2	3 	i/0#r   c                 N   | j                   st        d      | j                  rt        d      | j                  }dx}}|r|rt        d      |j	                  dd      }|j	                  dd      }|dk  r||z  }|dk  r|dk  r||z  }|dk  r||cxk  r|k  st        d       t        d      t        t        ||d	z               }nt        |      d
kD  s|g k(  rt        d      t        |      d
k(  rv|\  }}t        |      t        u rt        |      t        u st        d      ||kD  r||}}||cxk  r|k  st        d       t        d      t        t        ||d	z               }n<|d   }t        |      t        t        t        t
        fvrt        d      t        |      }t        t        t        t        |                  }|g k(  rt        d       y|j                          |d   dk  s|d   |k\  rt        d      t        |      }| j!                         }	t#        | j%                               D ]$  \  }
}|	|
   d
   d	z
  |v s| j'                  |       & | j)                  |       t+        |      D ]  }
| j-                  |
        | j/                          y)a	  Delete pages from a PDF.

        Args:
            Either keywords 'from_page'/'to_page', or two integers to
            specify the first/last page to delete.
            Or a list/tuple/range object, which can contain arbitrary
            page numbers.
        r  r   rY  z*cannot mix keyword and positional argumentr  r  r   r  r   rr   z need 1 or 2 positional argumentszboth arguments must be intz$need int or sequence if one argumentznothing to deleteN)r  r   r   r  r   ru   r  r'  r   r   rt   r  setrB   sortr  r  r  r  r  r  reversedr  r  )r]   r  kwr  r  r   r  r   frozen_numbersr  r  r   s               r   r  zDocument.delete_pages  s    {{[))>>.//__

A !MNN{B'Ay"%Aa%Z a%a%Z a%&J& !566 ' !566E!QUO,G4y1}
 !CDD4yA~1Q347c>$%ABBq5aqAA*
*$%9:: +$%9::aQ0G73tU";;$%KLL(s3G-.b='(1:>WR[J6122"7+lln !7!7!9: 	,GAt1vay1}.%%d+	, 	n-'" 	!Aa 	! 	r   r   r   r3   r  r{  c                 N   | j                         }dt        |      z  }||v rt        |      ||}||}||}| j                  |||||      }t	               }	| j                  |dd       | j                  |dt        |	             | j                  |dt        |	             |S )a\  Add an item to the EmbeddedFiles array.

        Args:
            name: name of the new item, must not already exist.
            buffer_: (binary data) the file content.
            filename: (str) the file name, default: the name
            ufilename: (unicode) the file name, default: filename
            desc: (str) the description.
        zName '%s' already exists.r   r3   r  r{  ru  z/EmbeddedFileParams/CreationDateParams/ModDate)r)  r   r   r2  get_pdf_nowr$  get_pdf_str)
r]   r   r   r3   r  r{  r+  r  r   dates
             r   embfile_addzDocument.embfile_add  s      &&(	)CI59S/!H I<D  !# !  }$8$ 5{47HI$ 0+d2CDr   c                 4    t        | j                               S )zGet number of EmbeddedFiles.)r'  r)  r\   s    r   embfile_countzDocument.embfile_count	  s    4%%'((r   c                 F    | j                  |      }| j                  |      S )aT  Delete an entry from EmbeddedFiles.

        Notes:
            The argument must be name or index of an EmbeddedFiles item.
            Physical deletion of data will happen on save to a new
            file with appropriate garbage option.
        Args:
            item: name or number of item.
        Returns:
            None
        )r,  r4  r]   r  r"  s      r   embfile_delzDocument.embfile_del  s%     %%d+  %%r   c                 F    | j                  |      }| j                  |      S )zGet the content of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            (bytes) The file content.
        )r,  r'  r1  s      r   embfile_getzDocument.embfile_get  s%     %%d+$$S))r   c                    | j                  |      }d| j                         |   i}| j                  ||      }| j                  |d      \  }}|dk7  r||d<   | j                  |d      \  }}|dk7  r||d<   | j                  |d      \  }}|dk7  r4t	        j
                  |j                               j                         |d<   |S )	zGet information of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            Information dictionary.
        r   r(  ro  r1  r)  r2  zParams/CheckSumchecksum)r,  r)  r>  xref_get_keyr{  r|  r{  decode)r]   r  r"  r9  r   r   r,  md5s           r   embfile_infozDocument.embfile_info'  s     %%d+D..056!!#x0##D*?@4;'+H^$##D*:;4;"&HY""4):;3;#+#3#3CJJL#A#H#H#JHZ r   c                 ,    g }| j                  |       |S )z#Get list of names of EmbeddedFiles.)r@  )r]   r+  s     r   r)  zDocument.embfile_names=  s    	I&r   c                     | j                  |      }| j                  |||||      }t               }| j                  |dt	        |             |S )a  Change an item of the EmbeddedFiles array.

        Notes:
            Only provided parameters are changed. If all are omitted,
            the method is a no-op.
        Args:
            item: number or name of item.
            buffer_: (binary data) the new file content.
            filename: (str) the new file name.
            ufilename: (unicode) the new filen ame.
            desc: (str) the new description.
        r'  r)  )r,  rB  r*  r$  r+  )	r]   r  r   r3   r  r{  r"  r   r,  s	            r   embfile_updzDocument.embfile_updC  s^    & %%d+  !# !  }$ 0+d2CDr   c           
         t        |       }t        |       t        j                  ||      }t        j                  |t        d            }t        j                  |t        d            }t        j                  |t        d            r\t        j                  |      j                  d      s7t        j                  |t        d            }|j                  rt        j                  |      r t        j                  |t        d            }	n|}	t        ||      }
|
dk7  r|st        ||      }t        |      }nd}|sIt        t        j                  |	            t        |
      t        t        j                  |            |f}|S t         t        t        j                  |	            t"        t        |
      t$        t        t        j                  |            t&        |i}|S |sd	}|S t         d
t"        d
t$        d
t&        di}|S )zD
        Get a font by xref. Returns a tuple or dictionary.
        ru  r=  r  CIDFontTypeBaseFontr  n/ar   )r(   r(   r(   r   r(   )r   r  rf   rK  r   r   pdf_name_eqr9  r   r   pdf_is_nullJM_get_fontextensionr^  r   rt  r   r  dictkey_extdictkey_typer  )r]   r   	info_onlynamedr  r   r  subtypebasefontbnamerV  r   bytes_rh   s                 r   extract_fontzDocument.extract_fontb  s   
 t$3##C.""3(89$$S(9*=>eXf%56))73>>}M))#x
/CDH&&%*;*;H*E**30@A &sD1Ce|I+C6)'2+E,=,=e,DE)#.)%*;*;G*DE	. 	 %&9%:K:KE:R&S#%6s%;$&78I8I'8R&S'	  	 $ 	 %b#R$b'	 	r   c                 t   | j                   s| j                  rt        d      t        |       }d}d}t	        |       t        |dt        j                  |      dz
        st        t              t        j                  ||d      }t        j                  |t        d            }t        j                  |t        d            st        d      t        j                  |t        d      t        d            }|j                  rt        j                  |      }t        j                   |      r't        j"                  }t        j$                  |      }d	}	t'        |      r't        j(                  }t        j$                  |      }d
}	t        j*                  |      }|t        j,                  k(  rMt        j*                  |      }t        j.                  |      \  }
}t        j0                  |      }t3        |      }	|t        j,                  k(  r*d}t        j4                  ||      }t        j6                  |j                        }|r|j8                  j:                  t        j<                  t        j>                  t        j@                  t        jB                  t        jD                  fvrT|j8                  j:                  }t3        |      }	t        jF                  t        jH                  |jJ                              }nOt        jL                  |t        jN                  t        jP                              }d}	nt        jR                  |      }t        jT                  |      \  }}|jW                         }|jY                         }|j[                         }|j]                         }t        j^                  |ja                               }tc               }	|td        <   ||tf        <   ||th        <   ||tj        <   ||tl        <   ||tn        <   ||tp        <   ||tr        <   ||tt        <   tw        |      |tx        <   |S )z(Get image by xref. Returns a dictionary.r   r   r   r=  Imageznot an imageSMaskMaskjpxjb2Npng)=r   r  r   r   r  rW  rf   r>  r?  r@  r   r   rB  pdf_dict_getar   r   pdf_is_jpx_imageFZ_IMAGE_JPXr   JM_is_jbig2_imageFZ_IMAGE_JBIG2pdf_load_raw_streamFZ_IMAGE_UNKNOWNr  fz_recognize_image_formatJM_image_extensionpdf_load_imagell_fz_compressed_image_bufferparamsr   FZ_IMAGE_RAWFZ_IMAGE_FAXFZ_IMAGE_FLATEFZ_IMAGE_LZWFZ_IMAGE_RLDr  ll_fz_keep_bufferbufferfz_new_buffer_from_image_as_pngFzColorParamsfz_default_color_paramsfz_new_image_from_bufferfz_image_resolutionr   r  r?  bpcru  r  r   rE  dictkey_smaskdictkey_widthdictkey_heightdictkey_colorspacedictkey_bpcdictkey_xresdictkey_yresdictkey_cs_namer   dictkey_image)r]   r   r  img_typesmaskr   rI  rc  r   rV  r  rs  r  ll_cbufxresyresr  r  r  rm  cs_namerh   s                         r   extract_imagezDocument.extract_image  sT   >>T..;<<t$3a!3!3C!8!:;l++$$S$2$$S(9*=>  (7*;<n--Xg%68HI<<$$Q'E!!#&))H'',CCS!++H'',CC'',u---++C0C**3/DAq66q9H$X.Cu---C&&sC0C99#..IG++****,,****4  #>>..(2nnU%<%<W^^%LM;;++E,I,IJ 005C..s3
dUUW
ggi**3>>+;<VK"M"M$N",K L L&O-c2M	r   c                 J    | j                  |||||||||	|
|||||||||      S )z8
        Save PDF using some different defaults
        )garbagecleandeflatedeflate_imagesdeflate_fontsincrementalrM  expandlinearpretty
encryptionpermissionsowner_pwuser_pw	no_new_idpreserve_metadatause_objstmscompression_effort)save)r]   r3   r  r  r  r  r  r  rM  r  r  r  r  r  r  r  r  r  r  r  s                       r   ez_savezDocument.ez_save  sS    2 yy-+'%'!#"3'#5'   	r   c                     | j                   s| j                  rt        d      t        j                  | j
                  |      }|j                  |j                  fS )z-Find new location after layouting a document.r   )r   r  r   rf   fz_lookup_bookmark2r   r  r   )r]   rN  locations      r   find_bookmarkzDocument.find_bookmark  sH    >>T..;<<,,dii<..r   c                    t        |       }t        j                  |      }	 t        |       t	        |d|dz
        rt	        |d|dz
        st        t              t        j                  t        j                  ||            }t        j                  |      }t        j                  |t        d            }|j                  rt        j                  |      }t        j                  ||      }	t        |      D ]8  }
t        j                   ||
      }t        j                  |t        d            }t        j"                  |t        d            rYt        j$                  |d      j                  rzt        j                  t        j                  |            }t        j&                  |      }t        j(                  |||       t        j*                  ||d      }t        j,                  |t        d             t        j,                  |t        d             t        j.                  |	|       ; t        j0                  |t        d      |	       t3        |      }|j                  rkt        j4                  |t        j6                  d	      t        j8                         d      }t;        |||d       t        j0                  |t        d
      |       t        j&                  |      }t        j(                  |||       t        j*                  ||d      }t        j<                  |||       t        j>                  |j                         | jA                          y# t        j>                  |j                         w xY w)zMake a full page duplicate.r   r   rY  rX  r=  rW  r  P    r  N)!r   rf   r  r  rW  r   r  rk  r  pdf_deep_copy_objr   r   r   r]  r  r  r^  rB  r   pdf_create_objectpdf_update_objectr@  r   r0  r  JM_read_contentspdf_add_streamrb  PdfObjr   r  r  r  )r]   r  r  r  r  r  r  
old_annotsr?  
new_annotsr  rc  rI  copy_or   r   r  s                    r   fullcopy_pagezDocument.fullcopy_page  s   t$**C0
1	9sOS!Z!^4#BJN; .11..0I0I3PS0TUE++U3E++UHX4FGJ $$''4"00#q9
q >A++Z;A#00!Xi5HIG(('8G3DE **Au5@@ "44e6P6PRS6TUF 22C8D++S$?"33S$BF&&0AB&&>((*f=> ""E8H+=zJ #E*C ~~ //e6Z6Z\`6achcococqstu #xa8""E8J+?J **C0D##S$6**Cq9E!!3E2''8 ''8s   LM$ $!Nc                    t        |       }t        |       t        j                  t        j                  |      t        d      t        d            }|j                  sy|dk(  r t        j                  |t        d            }n3t        j                  t        j                  |t        d            |      }|j                  st        t              t        |      }|S )z,Content of ON, OFF, RBGroups of an OC layer.r  OCPropertiesNrY  rI  r  )r   r  rf   r   r  r   r   r   r^  r   r  JM_get_ocg_arrays)r]   r  r  r  r   rh   s         r   	get_layerzDocument.get_layerU  s    t$3!!!!3' (
 ~~R<$$c8C=9C%%&&Xi-@AC ~~/00$	r   c                    t        |       }t        |       t        j                  |      }|dk(  r]t        j                  t        j
                  |      t        d      t        d      t        d            }t        j                  |      sd}g }t        j                         }t        |      D ]D  }t        j                  |||       ||j                  |j                  d}|j                  |       F |S )zShow optional OC layers.r   r  r  r  r   )numberr   r  )r   r  rf   pdf_count_layer_configsr   r  r   r.  PdfLayerConfigr  pdf_layer_config_infor   r  r6   )r]   r  r?  r   rh   r  r  r  s           r   
get_layerszDocument.get_layersl  s    t$3))3/6%%%%s+V$^,Y'	C %%s+##%q 	A''a6 II#||D
 IIt	 	r   c                     | j                   s| j                  rt        d      t        |       }d}t	        |       t        |       t        j                  |      }|S )zMake new xref.r   r   )r   r  r   r   r  ENSURE_OPERATIONrf   r  )r]   r  r   s      r   get_new_xrefzDocument.get_new_xref  sP    >>T..;<<t$3&&s+r   c           	      V   t        j                  d      }t        |       }t        |       t        j                  t        j
                  t        j                  |      t        d            t        d      t        d            }t               }t        j                  |      s|S t        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  |      }t        j                  t        j
                  |t        d                  }	t        j                  |t        d      |t        d            }
d}|
j                  rt        j                   |
      }t#               }t        j
                  |t        d	            }|j                  rt        j$                  |      r%|j'                  t        j                   |             nt        j                  |      rut        j                  |      }t        |      D ]R  }t        j                  ||      }t        j$                  |      s/|j'                  t        j                   |             T t        j(                  |t        j*                         ||      }|	|| |d
}|}|||<    |S )z&Show existing optional content groups.r  r  r  r  r  r  r=  Nr  )r   r  r  r  )rf   r  r   r  r   r   r  r   r   r.  r]  r  r^  r   r   r   r9  rt   rr  r6   pdf_is_ocg_hiddenr  )r]   r<  r  ocgsrh   r?  r  r  r   r   r   r  r  r  rA  rB  rc  hiddenr  rR  s                       r   get_ocgszDocument.get_ocgs  s"   /t$3""""E$5$5s$;Xf=MN( 
 V!!4(I&q 	A%%tQ/C##S)D++U-?-?hvFV-WXD%%sHW,=r8ICVWCE~~))3/fG''hx.@AF  $$f-NNE$5$5v$>?''0++V4A"1X C!//; ,,a0#NNE,=,=q,ABC ,,c5<<>5#NF %$*"	D DBI7	8 	r   c                 t   g }t        |       }|s|S t        j                  t        j                  |      t	        d            }|j
                  s|S t        j                  |t	        d            }|j
                  s|S t        j                  |t	        d            }|j
                  s|S t        ||      }|S )z!Get list of outline xref numbers.r  r  r  )r   rf   r   r  r   r   r  )r]   r  r  r  r  r  s         r   r  zDocument.get_outline_xrefs  s    t$L!!%"3"3C"8(6:JKL##D(:*>?  L""68G+<=L .r   fullc                 B   | j                   s| j                  rt        d      | j                  syt	        |      t
        ur	 |j                  }| j                  |d      }|du r|D cg c]  }|dd 	 c}S |S # t        $ r t                t        d      w xY wc c}w )z1Retrieve a list of fonts used on a page.
        r   r    zneed a Page or page numberr   FNrY  )
r   r  r   r  r   r   r  r   rF   r  r]   r  r  r   rM   s        r   get_page_fontszDocument.get_page_fonts  s     >>T..;<<{{9C?jj Q'5=$'(qAcrF((
  ?  !=>>?
 )s   A: )B:Bc                     | j                   s| j                  rt        d      | j                  sy| j	                  |d      }|du r|D cg c]  }|dd 	 c}S |S c c}w )z2Retrieve a list of images used on a page.
        r   r    rr   FNrY  r   r  r   r  r  r  s        r   get_page_imageszDocument.get_page_images  sc     >>T..;<<{{Q'5=$'(qAcrF((
 )s   Ac                     | j                   s| j                  rt        d      | j                  sy| j	                  |d      }|S )z4Retrieve a list of XObjects used on a page.
        r   r    r   r  )r]   r  r   s      r   get_page_xobjectszDocument.get_page_xobjects  s@     >>T..;<<{{Q'
r   c                     t        |       }|syt        j                  t        j                  |      t	        d      t	        d      t	        d            }d}|j
                  rt        j                  |      }|S )zGet the /SigFlags value.rY  r  r  SigFlags)r   rf   r   r  r   r   r   )r]   r  sigflagssigflags       r   get_sigflagszDocument.get_sigflags  sm    t$&&!!#& $$	 &&x0Gr   c                    d}t        |       }|j                  r<t        j                  t        j                  |      t        d      t        d            }|r.|j                  r"t        j                  |      }t        |      }|S d}|S )zGet document XML metadata.Nr  r  r(   )r   r   rf   r   r  r   r   JM_UnicodeFromBuffer)r]   xmlr  r  rh   s        r   get_xml_metadatazDocument.get_xml_metadata  s~    t$>>%%%%c*V$Z(C
 3>>((-D%d+B 	 B	r   c                 j   | j                   rt        d      | j                         | _        t	        dddddddd	d
dd
j                         D cg c]  \  }}|| j                  |      f c}}      | _        | j                  d      dk(  rd n| j                  d      | j                  d<   y c c}}w )Nz,cannot initialize - document still encryptedr  z
info:Titlezinfo:Authorzinfo:Subjectzinfo:Keywordszinfo:Creatorzinfo:Producerzinfo:CreationDatezinfo:ModDatezinfo:Trapped)
r  r0  authorr3  keywordsr  producerr1  r2  trappedr  None)r  r   r  r  r   rn  rs  r  )r]   rr  rM   s      r   r  zDocument.init_doc  s    KLL))+ &.$0%2&4'6&4'6+>&4&4= $eg58Qq4,,Q/0  /3.?.?.Mv.Ud[_[l[lmy[zl#s   B/
c
                    d}
t        |t              rD|j                  j                  dkD  rt        t        |      }t        d|j                               }
nt        |t
              r|}
nt        |      }
|
st        d      |
j                  s|
j                         }t        d|      }
| j                  |
||||||||		      S )z
        Insert an arbitrary supported document to an existing PDF.

        The infile may be given as a filename, a Document or a Pixmap.
        Other paramters - where applicable - equal those of insert_pdf().
        Nr   rT  zbad infile parameterr  )r  r  start_atr  linksra  show_progressfinal)rs   r  r  r?  r  r   tobytesr   r  r  
insert_pdf)r]   infiler  r  r  r  r  ra  r  r  r  pdfbytess               r   insert_filezDocument.insert_file.  s    " ff%  ""Q&v.5&.."23C)C6"C344zz))+H5(+C#!+  
 
	r   c                    | j                   s| j                  rt        d      | j                  |j                  k(  rt        d      |}|dk  r| j                  }t        |      |cxkD  rdkD  ron nlt        j                  j                  |j                        }|sd}t        j                  j                  | j                        }|sd}t        d|d|d       |j                  }| j                  j                  |d      }
|
t        |       }
|
| j                  |<   t        r*t        | j                   |j                   ||||||||	|
       nt#        |       }t#        |      }t%        j&                  |       }t%        j&                  |j                         }|}|}|}t)        |d      }t+        ||d	z
        }|dk  r|d	z
  }t+        ||d	z
        }|dk  r|}t+        ||      }|j,                  r|j,                  st/        d
      t1        |       t3        ||||||||||

       | j5                          |r| j7                  ||||       |	d	k(  rd| j                  |<   yy)a,  Insert a page range from another PDF.

        Args:
            docsrc: PDF to copy from. Must be different object, but may be same file.
            from_page: (int) first source page to copy, 0-based, default 0.
            to_page: (int) last source page to copy, 0-based, default last page.
            start_at: (int) from_page will become this page number in target.
            rotate: (int) rotate copied pages, default -1 is no change.
            links: (int/bool) whether to also copy links.
            annots: (int/bool) whether to also copy annotations.
            show_progress: (int) progress message interval, 0 is no messages.
            final: (bool) indicates last insertion from this source PDF.
            _gmap: internal use only

        Copy sequence reversed if from_page > to_page.r   z'source and target cannot be same objectr   z
memory PDFzInserting 'z' at 'r   Nr   zsource or target not a PDF)r  r  r  )r   r  r   r  r  r'  r   r1   basenamer   rB   r  r   Graftmapr   extra_FzDocument_insert_pdfr   r   rf   r  r  minr   rp  r  JM_merge_ranger  	_do_links)r]   docsrcr  r  r  r  r  ra  r  r  _gmapsainnameoutnameisrtpdfoutpdfsrcoutCountr  rF  r  s                        r   r  zDocument.insert_pdfY  sD   B >>T..;<<>>V---FGG6Bv;**WW%%fkk2F%gg&&tyy1G&@A ""4.=TNE#(DNN4 'IIKK! &d+F%f-F++D1H++FKK8H BBB RBRA&BAv\RA&BAvR"B$$F,=,=!=>>V$662r2vufm]bc 	NN6yGXZN[A:#'DNN4  r   c                 h    t        |       }|j                  syt        j                  |      }|rdS dS )NFT)r   r   rf   pdf_has_unsaved_changesr]   r  r   s      r   is_dirtyzDocument.is_dirty  s3    t$~~))#.t#e#r   c                 \    t        |       }|j                  rt        j                  |      S y)z9
        Check whether we have a linearized PDF.
        F)r   r   rf   pdf_doc_was_linearizedr  s     r   is_fast_webaccesszDocument.is_fast_webaccess  s)    
 t$>>//44r   c                    t        |       }|j                  syd}	 t        j                  t        j                  |      t        j
                  t        j                  t        j                        }t        j                  |      rt        j                  |      }|dk\  r|S y# t        $ r t        r
t                Y yw xY w)z Either False or PDF field count.FrY  r   )r   r   rf   r   r  PDF_ENUM_NAME_RootPDF_ENUM_NAME_AcroFormPDF_ENUM_NAME_Fieldsr.  r]  r   r   rF   )r]   r  rO  fieldss       r   is_form_pdfzDocument.is_form_pdf  s     t$~~	((%%c*,,00..	F !!&)++F3 A:L  	#(8	s   A?B# #B?>B?c                     t        | j                  t        j                        ryt        j                  | j                  j
                        rd}|S d}|S )zCheck for PDF.TF)rs   r   rf   r   ll_pdf_specificsr   r  s     r   r  zDocument.is_pdf  sM     dii!2!23
 !!$))"6"67C 
 C
r   c                 l    | j                   rt        d      t        t        j                  |             S )z Check if document is layoutable.r   )r   r   r  rf   r  r\   s    r   is_reflowablezDocument.is_reflowable   s-     >>.//E33D9::r   c                 d    t        |       }|j                  syt        j                  |      }|ryy)zCheck whether PDF was repaired.FT)r   r   rf   pdf_was_repairedr  s      r   is_repairedzDocument.is_repaired  s1     t$~~""3'r   c                     | j                   s| j                  rt        d      d}d}t        |       }t	        |       t        j                  |      }t        j                  |      }t        |      t        |      dS )z(Show if undo and / or redo are possible.r   r   )undoredo)	r   r  r   r   r  rf   pdf_can_undopdf_can_redor  )r]   r  r  r  s       r   journal_can_dozDocument.journal_can_do  sk    >>T..;<<t$3!!#&!!#&T
DJ77r   c                     | j                   s| j                  rt        d      t        |       }t	        |       t        j                  |       y)zActivate document journalling.r   N)r   r  r   r   r  rf   pdf_enable_journalr  s     r   journal_enablezDocument.journal_enable  s<    >>T..;<<t$3  %r   c                     | j                   s| j                  rt        d      t        |       }|j                  xr |j                  j
                  }|S )z Check if journalling is enabled.r   )r   r  r   r   r   journal)r]   r  enableds      r   journal_is_enabledzDocument.journal_is_enabled&  sD    >>T..;<<t$..;S^^%;%;r   c                 ~   | j                   s| j                  rt        d      t        |       }t	        |       t        |t              rt        j                  ||       n6t        |      }t        j                  |      }t        j                  ||       |j                  j                  st        dt               yy)zLoad a journal from a file.r   z!Journal and document do not matchN)r   r  r   r   r  rs   r   rf   pdf_load_journalr   r'  pdf_deserialise_journalr   r  rr  rs  )r]   r3   r  r   stms        r   journal_loadzDocument.journal_load.  s    >>T..;<<t$3h$""31$X.C&&s+C))#s3~~%%8:NO &r   c                     | j                   s| j                  rt        d      t        |       }t	        |       t        j                  ||      }|S )z#Show operation name for given step.r   )r   r  r   r   r  rf   pdf_undoredo_step)r]   r  r  r   s       r   journal_op_namezDocument.journal_op_name=  sE    >>T..;<<t$3&&sD1r   c                     | j                   s| j                  rt        d      d}t        |       }t	        |       t        j                  |      \  }}||fS )zShow journalling state.r   r   )r   r  r   r   r  rf   pdf_undoredo_state)r]   stepsr  rh   s       r   journal_positionzDocument.journal_positionF  sQ    >>T..;<<t$3,,S1	E5yr   c                     | j                   s| j                  rt        d      t        |       }t	        |       t        j                  |       y)zMove forward in the journal.r   T)r   r  r   r   r  rf   pdf_redor  s     r   journal_redozDocument.journal_redoP  =    >>T..;<<t$3sr   c                 &   | j                   s| j                  rt        d      t        |       }t	        |       t        |t              rt        j                  ||       yt        |      }t        j                  ||       |j                          y)zSave journal to a file.r   N)r   r  r   r   r  rs   r   rf   pdf_save_journalJM_new_output_fileptrpdf_write_journalfz_close_output)r]   r3   r  outs       r   journal_savezDocument.journal_saveY  sn    >>T..;<<t$3h$""31'1C##C-!r   c                    | j                   s| j                  rt        d      t        |       }t	        |       |j
                  j                  st        d      |rt        j                  ||       yt        j                  |       y)zBegin a journalling operation.r   zJournalling not enabledN)r   r  r   r   r  r   r  r   rf   pdf_begin_operationpdf_begin_implicit_operation)r]   r   r  s      r   journal_start_opzDocument.journal_start_opf  sh    >>T..;<<t$3~~%% 9::%%c40..s3r   c                     | j                   s| j                  rt        d      t        |       }t	        |       t        j                  |       y)zEnd a journalling operation.r   N)r   r  r   r   r  rf   pdf_end_operationr  s     r   journal_stop_opzDocument.journal_stop_ops  s<    >>T..;<<t$3$r   c                     | j                   s| j                  rt        d      t        |       }t	        |       t        j                  |       y)zMove backwards in the journal.r   T)r   r  r   r   r  rf   pdf_undor  s     r   journal_undozDocument.journal_undo{  r  r   c                     t        |       }|syt        j                  |      }|t        j                  k(  ryt        dk  rJ d       t        j
                  |      S )zDocument language.N)r      r  znot implemented yet)r   rf   pdf_document_languager  rw   r  )r]   r  r  s      r   r  zDocument.language  sY     t$**3/5&&&++++122488r   c                     | j                   rt        d      t        j                  | j                        }|j
                  |j                  fS )z Id (chapter, page) of last page.r   )r   r   rf   fz_last_pager   r  r   )r]   last_locs     r   last_locationzDocument.last_location  s@     >>.//%%dii0..r   c                    t        |       }t        |       t        j                         }t        j                  |      }g }t        |      D ]  }t        j                  |||       |j                  dk(  rd}n|j                  dk(  rd}nd}||j                  |j                  ||j                  |j                  d}|j                  |        |S )z-Show OC visibility status modifiable by user.r   checkboxrr   radioboxlabel)r  r:   depthr   r  locked)r   r  rf   PdfLayerConfigUipdf_count_layer_config_uir  pdf_layer_config_ui_infor   r:   r5  selectedr6  r6   )r]   r  r  r?  rh   r  r  r  s           r   layer_ui_configszDocument.layer_ui_configs  s    t$3%%'++S1q 	A**CD9yyA~"a" II!ZZ!--"kkD IIdO!	" 	r   c                    | j                   s| j                  rt        d      | j                  }t	        j
                  |      sy|}|}t        |      }t	        j                  |      s2|j                  |j                  z
  }|j                  |j                  z
  }|dk  s|dk  rt        d      t	        j                  ||||       | j                          | j                          y)z Re-layout a reflowable document.r   NrU  zbad page size)r   r  r   r   rf   r  r  rf  r  r  r  r  r  r  r  )	r]   r   r  r  r   r   r   r  r   s	            r   layoutzDocument.layout  s    >>T..;<<ii..4D!((+qttAqttA8qCxo..  #q!X6r   c                 (   | j                   s| j                  rt        d      |d}|| vrt        d      t        |      t        u r!|dk  r| j
                  }|dk  r||z  }|dk  rt        |t              r!t        j                  | j                  |      }n&|\  }}t        j                  | j                  ||      }t        ||       }d|_        | |_        || j                  t        |      <   t!        j"                         |_        ||_        |S )zLoad a page.

        'page_id' is either a 0-based page number or a tuple (chapter, pno),
        with chapter number and page number within that chapter.
        r   r   zpage not in documentT)r   r  r   r   r   r  rs   rf   fz_load_pager   fz_load_chapter_pager   r   r   r  r  r  r  r  r  )r]   page_idnpr   r  pagenumr   s          r   r  zDocument.load_page  s     >>T..;<<?G$344=CGaKBA+2 A+gs#%%dii9D&GW--dii'JD4
#&3 !557

r   c                 B   | j                   rt        d      | j                  }t        j                  dd      }t        j
                  |      }|dk  r||z  }|dk  r||k\  rt        t              t        j                  ||      }|j                  |j                  fS )zConvert pno to (chapter, page).r   rY  r   )
r   r   r   rf   fz_make_locationr  r  fz_location_from_page_numberr  r   )r]   r  this_docr  r  s        r   location_from_page_numberz"Document.location_from_page_number  s    >>.//99$$R,))(3
Ag:C Ag*n--003?{{CHH$$r   c                     | j                   s| j                  rt        d      t        j                  | }t        j
                  | j                  j                  |j                               }|S )z.Make a page pointer before layouting document.r   )	r   r  r   rf   
FzLocationll_fz_make_bookmark2r   r   internal)r]   r  marks      r   make_bookmarkzDocument.make_bookmark  sT    >>T..;<<$))499+?+?Pr   c                    | j                         }|dk(  ry| j                  |d      }|d   dk(  ri S |d   dk(  r3t        |d   j                         d         }| j	                  |d      }n|d   d	k(  r|d   }nd}||dd
 dk(  r|dd dk(  si S dddd}|d
d j                  d      }|dd D ]!  }	 |j                         \  }}|dk(  sd||<   # |S # t
        $ r t        dkD  r
t                |cY c S w xY w)zReturn the PDF MarkInfo value.r   NMarkInforo  r   r   Tr  r   rr   <<r  >>FMarkedUserPropertiesSuspects/true)r  r7  r   splitr  r   r   rF   )r]   r   rh   r   validrM   r  ry   s           r   markinfozDocument.markinfo  s8    !19tZ0a5F?Ia5F?r!u{{}Q'(D""4D"9CUf_Q%CC;s2Aw$3rs8t3CI EuM!Biooc"QR 	"AWWY
U !c
	"   '!+0@s   5CC:9C:c                     | j                   rt        d      t        |       }|t        |      vs|t        d|      vrt        d      d}d}|dk(  r|dz
  }d}| j	                  ||||      S )zMove a page within a PDF document.

        Args:
            pno: source page number.
            to: put before this page, '-1' means after last page.
        r   rY  r  r   r   r  r  s         r   	move_pagezDocument.move_page  s}     >>.//Y
uZ((BeB
6K,K1228aBF##CVT::r   c                     | j                   S r   r{  r\   s    r   r   zDocument.name-  s    zzr   c                    | j                   syt        |       }d}d}t        j                  t        j                  |      d      }t        j
                  ||      }t        j                  |      rt        j                  |      }|r&t        j                  ||t        j                         n%t        j                  ||t        j                         ||dk\  S |S )z"Get/set the NeedAppearances value.NrY  NeedAppearanceszRoot/AcroFormr   )r  r   rf   pdf_dict_getpr  r   pdf_is_boolpdf_to_boolr8  PDF_TRUE	PDF_FALSE)r]   ry   r  oldvalappkeyformapps          r   need_appearanceszDocument.need_appearances1  s    t$"""!!#& !!$/S!&&s+Ffenn=feoo>=Q;r   c                     | j                   rt        d      t        | j                  t        j
                        r| j                  n| j                  j                         }t	        j                  |      }|S )zIndicate password required.r   )r   r   rs   r   rf   r   r   fz_needs_password)r]   r   rN   s      r   r  zDocument.needs_passI  sU     >>.// *499e6F6F G499TYY__M^%%x0
r   c                    | j                   s| j                  rt        d      t        |      t        u rd|f}|| vrt        d      t        |      | j                  k(  ryt        |       }|d   }t        |t              st        t        t               |}|d   }|}t        j                  ||      }t        j                  ||      }|j                  |j                   fS )z!Get (chapter, page) of next page.r   r   page id not in documentr    r   )r   r  r   r   r   ru   r0  r   rs   rr  MSG_BAD_PAGEIDPyExc_ValueErrorrf   rE  fz_next_pager  r   )r]   rA  rG  r   r  r  r  next_locs           r   next_locationzDocument.next_locationR  s    >>T..;<<=C'lG$677>T///"4(qk#s#N$45qk$$Wc2%%x5..r   c                    t         r t        j                  | j                  |      S t	        | j                  t
        j                        r,t        j                  | j                        }| j                  }n*t        j                  | j                        }t        |       }|dk  r||z  }|dk  r||kD  rt        t              t        j                  ||      }t        |      }|S rW   )r   r   page_annot_xrefsr   rs   rf   r   r  r  r   r   r  r  JM_get_annot_xref_list)r]   r?  r  r  r  ra  s         r   ru  zDocument.page_annot_xrefsg  s    ))499a88dii!2!23..tyy9J99L--dii8J+D1L!eOA !ez>n--,,\1='1r   c                 "   | j                   rt        d      t        r| j                  |       S t	        | j
                  t        j                        rt        j                  | j
                        S t        j                  | j
                        S )zNumber of pages.r   )
r   r   r   r  rs   r   rf   r   r  r  r\   s    r   r  zDocument.page_county  si     >>.//##D))tyy%"2"23''33(($))44r   c                 \   | j                   rt        d      | j                  }t        j                  |      }|}|dk  r||z  }|dk  rt        |       }||k\  rt        t              t        |       t        j                  ||      }t        |      }t        |      }t        |      }|S )z2Get CropBox of page number (without loading page).r   r   )r   r   r   rf   r  r   r  r  r  
JM_cropboxr'  r   )	r]   r  rG  r  r?  r  r  cropboxr   s	            r   page_cropboxzDocument.page_cropbox  s    >>.//99))84
!eOA !et$
?n--3++S!4W%g&3i
r   c                     t        |      t        u r | j                  }|dk  r||z  }|dk  rd|f}|| vrt        d      |\  }}t	        j
                  ||      }t	        j                  | j                  |      }|S )z&Convert (chapter, pno) to page number.r   rn  )r   r   r  r   rf   rE  fz_page_number_from_locationr   )r]   rA  rB  r  r  r  page_ns          r   page_number_from_locationz"Document.page_number_from_location  s    =CBA+2 A+'lG$677$$gs333TYYDr   c                    t         r t        j                  | j                  |      S | j                  rt        d      t        j                  | j                        }|}|dk  r||z  }|dk  rt        |       }d}||k\  rt        t              t        |       t        j                  t        j                  ||            }|S )zGet xref of page number.r   r   )r   r   	page_xrefr   r   r   rf   r  r   r  r  r   r  )r]   r  r  r?  r  r   s         r   r  zDocument.page_xref  s    ??DIIs33>>.//))$))4
!eOA !et$
?n--3 9 9#q ABr   c                     | j                         }|dk(  ry| j                  |d      }|d   dk(  ry|d   dk(  r|d   dd S y)z)Return the PDF PageLayout value.
        r   N
PageLayoutro  
SinglePager   r   r  r7  r]   r   rh   s      r   
pagelayoutzDocument.pagelayout  sZ     !19t\2a5F?a5F?a59r   c                     | j                         }|dk(  ry| j                  |d      }|d   dk(  ry|d   dk(  r|d   dd S y)z'Return the PDF PageMode value.
        r   NPageModero  UseNoner   r   r  r  s      r   pagemodezDocument.pagemode  sZ     !19tZ0a5F?a5F?a59r   )r   	   rL  r  r  c              #   P  K   |xs d}|dk  r|| j                   z  }|dk  r|t        | j                         vrt        d      ||| j                   k  r|n| j                   }|dk(  rt        d      |
||kD  rd}nd}t        |||      D ]  }| j                  |        yw)z}Return a generator iterator over a page range.

        Arguments have the same meaning as for the range() built-in.
        r   zbad start page numberNzarg 3 must not be zerorY  r   )r  r  r   r  )r]   rL  r  r  r  s        r   r  zDocument.pages  s      
aiT__$E aidoo..455 'DDOO,Ct 19566<t|d+ 	(C>>#&'	(s    B&BB&c                     t        |       }d}|s|S t        j                  t        j                  |      t	        d            }t        j
                  |      }|S )zGet xref of PDF catalog.r   r  )r   rf   r   r  r   r   )r]   r  r   r  s       r   r  zDocument.pdf_catalog  sP    t$K!!%"3"3C"8(6:JK%r   c                 *    | j                  d||      S )zGet PDF trailer as a string.rY  )r  rM  )r  )r]   r  rM  s      r   r  zDocument.pdf_trailer  s    zGGr   c                 `   | j                   ry| j                  }t        j                  |      }|j                  rt        j
                  |      S d}t        j                  |t        j                        s|t        j                  z  }t        j                  |t        j                        s|t        j                  z  }t        j                  |t        j                        s|t        j                  z  }t        j                  |t        j                        s|t        j                  z  }|S )zDocument permissions.r   l    )r  r   rf   pdf_document_from_fz_documentr   pdf_document_permissionsfz_has_permissionFZ_PERMISSION_PRINTPDF_PERM_PRINTFZ_PERMISSION_EDITPDF_PERM_MODIFYFZ_PERMISSION_COPYPDF_PERM_COPYFZ_PERMISSION_ANNOTATEPDF_PERM_ANNOTATE)r]   r   r  perms       r   r  zDocument.permissions  s     YY11#6 >>11#66 &&sE,E,EF%...D&&sE,D,DE%///D&&sE,D,DE%---D&&sE,H,HI%111Dr   c                 B   | j                   s| j                  rt        d      t        |      t        u rd|f}|| vrt        d      |dk(  ry|\  }}t        j                  ||      }t        j                  | j                  |      }|j                  |j                  fS )z%Get (chapter, page) of previous page.r   r   rn  r  r    )r   r  r   r   r   rf   rE  fz_previous_pager   r  r   )r]   rA  r  r  r  prev_locs         r   prev_locationzDocument.prev_location  s     >>T..;<<=C'lG$677v$$Wc2))$))S9..r   c                 ,   i }|j                   }|j                  j                         D ]
  \  }}|||<    |j                  j                  j
                  }|j                  j                         }d|_        |j                          d}t        j                  d       | j                  |      }|j                         D ]  \  }}||   }||j                  |<    |dk(  r	 |S |j                  j                         }	|	|k7  sJ d|d|dd|	d       |S )zMake a fresh copy of a page.Nd   r   z	refs_old=z m_internal_old=z#xz m_internal_new=)r  r  rn  r   r   refsr  r   r   store_shrinkr  )
r]   r   r  r  rr  rM   refs_oldm_internal_oldr   m_internal_news
             r   reload_pagezDocument.reload_page.  s/   
kk$$**, 	DAqJqM	6 99'',,335	3~~c" $$& 	(DAqqME"'DQ	( q=
   "YY779N!^3 M xk!2>2"66G7KLM3r   c                 "   |s|ryy	 t        j                  | j                  |      \  }}}|r|j                  |j                  f||fS t        j                  | j                  |      }|||fS # t        $ r t        r
t                |rY yY yw xY w)aM  Calculate internal link destination.

        Args:
            uri: (str) some Link.uri
            chapters: (bool) whether to use (chapter, page) format
        Returns:
            (page_id, x, y) where x, y are point coordinates on the page.
            page_id is either page number (if chapters=0), or (chapter, pno).
        )rY  rY  r   r   )rY  r   r   )	rf   fz_resolve_linkr   r   r   rF   r  r   r}  )r]   urir  r  xpypr  s          r   resolve_linkzDocument.resolve_linki  s     %	//		3?KCR KK*B2200C@B{  	#(8%		s   $A. .BBc                 <  	
 t        | d      r| j                  S t        | j                        D ci c]  }| j	                  |      | c}d 

fd		fd}t        j                  |       }t        j                  t        j                  |      d      }i }t        j                  d      }t        j                  ||      }|j                         r	 |||       t        j                  ||      }|j                         r	 |||       || _        |S c c}w )af  Convert the PDF's destination names into a Python dict.

        The only parameter is the pymupdf.Document.
        All names found in the catalog under keys "/Dests" and "/Names/Dests" are
        being included.

        Returns:
            A dcitionary with the following layout:
            - key: (str) the name
            - value: (dict) with the following layout:
                * "page":  target page number (0-based). If no page number found -1.
                * "to": (x, y) target point on page - currently in PDF coordinates,
                        i.e. point (0,0) is the bottom-left of the page.
                * "zoom": (float) the zoom factor
                * "dest": (str) only occurs if the target location on the page has
                        not been provided as "/XYZ" or if no page number was found.
            Examples:
            {'__bookmark_1': {'page': 0, 'to': (0.0, 541.0), 'zoom': 0.0},
            '__bookmark_2': {'page': 0, 'to': (0.0, 481.45), 'zoom': 0.0}}

            or

            '21154a7c20684ceb91f9c9adc3b677c40': {'page': -1, 'dest': '/XYZ 15.75 1486 0'}, ...
        _resolved_namesc                     t        j                  d      }t        j                  |      }t        j                  || dd       |j	                          t        |      S )z1Return string version of a PDF object definition.   r   r   )rf   fz_new_bufferFzOutputpdf_print_objr  r  )r   rg  outputs      r   
obj_stringz*Document.resolve_names.<locals>.obj_string  sK    ((-F^^F+FQ2""$'//r   c                    ddd}| j                         rt        j                  |       } | j                         r	 	|       }n/| j	                         r 	t        j
                  | d            }n|S |j                  dd      dd }|j                  d      }|dk  r||d	<   |S |d
| }||d
 }||d	<   |j                  d      r?|d	= |j                         dd
 }t        t        t        |            \  }}}||f|d<   ||d<   d|v r1
j                  t        |j                         d         d      |d<   |S t        |      |d<   |S )z3Generate value of one item of the names dictionary.rY  r(   )r   destrI  ro  rJ   r   rW  r  Nz/XYZr  rD  0 Rr   r   )pdf_is_indirectrf   rk  r.  r:  r   r  ri   r   rY  ru   r  r%  r   r   )r   
templ_dictarrayr"  subvalarr_tr  r  rP  r  
page_xrefss            r   	get_arrayz)Document.resolve_names.<locals>.get_array  si   "$b1J""$005!"3""5#6#6sC#@A!! MM&#.q4E **S/CQw%*
6"!!4C[F#$KE!&Jv 'v&ab)E5 121a$%q6
4 %&
6" %/^^Cq8I4J2%N
6"  &)[
6"r   c                 (   t        j                  |      }t        |      D ]n  }t        j                  ||      }t        j                  ||      }|j                         r|j                         }nt        d| d       d}|sd |      | |<   p y)zyGenerate name resolution items for pdf_dict.

            This may be either "/Names/Dests" or just "/Dests"
            zkey z is no /NameN)rf   r;  r  r=  r<  rr  r9  rB   )	dest_dictpdf_dict
name_countr  r  r   dict_keyr  s          r   	fill_dictz)Document.resolve_names.<locals>.fill_dict  s     ++H5J :& 
9,,Xq9,,Xq9??$"0Hd1#\23#H*3C.Ih'
9r   r  Dests)r  r  r  r  r  rf   r  r   r  r  r   r:  pdf_load_name_tree)r]   r  r  r  catalogr  dests	old_destsr4  r  r  r  s            @@@r   resolve_nameszDocument.resolve_names  s   2 4*+'''49$//4JKqdnnQ'*K
	0&	P	9, 11$7 %%e&7&7&<fE	 ""7+ &&w6	  "i+ ''U3i&({ Ls   Dc                    | j                   s| j                  rt        d      t        |      t        u rnHt        |d      rt	        |      }n0t        |d      r|j                  }nt        |d      st        d      || j                  k(  r|st        d      | j                  dk  rt        d      |r&| j                  |k7  s| j                  rt        d	      |rt        |      d
kD  s|rt        |      d
kD  rt        d      t        |       }t        j                         }||_        ||_        ||_        ||_        ||_        |	|_        ||_        ||_        |
|_        ||_        ||_        ||_        ||_        ||_        ||_        ||j9                  |       n||j9                  |       ||j;                  |       ||_        ||_        ||_         d}tC        |       d|jD                  _#        tI        |       |dk(  rtK        |       tM        |t              rt        jN                  |||       ytQ        |      }t        jR                  |||       |jU                          y)z/Save PDF to file, pathlib.Path or file pointer.r   r   r   seek)filename must be str, Path or file objectz$save to original must be incrementalr   zcannot save with zero pageszincremental needs original file(   z"password length must not exceed 40Nr   )+r   r  r   r   r   r  r   r  r|  r'  r   rf   PdfWriteOptionsdo_incrementaldo_asciido_compressdo_compress_imagesdo_compress_fontsdo_decompress
do_garbage	do_pretty	do_lineardo_cleando_sanitizedont_regenerate_iddo_appearance
do_encryptr  opwd_utf8_set_valueupwd_utf8_set_valuedo_preserve_metadatado_use_objstmsr  r  r   r  JM_embedded_cleanJM_ensure_identityrs   pdf_save_documentr  pdf_write_documentr  )r]   r3   r  r  r  r  r  r  rM  r  r  r  
appearancer  r  r  r  r  r  r  r  r  r  r  s                           r   r  zDocument.save  s5   4 >>T..;<<>S Xv&8}HXv&}}H6*HIItyy CDD??Q:;;yyH$ !BCCs7|b(HX9KABBt$$$&)""0!.#! "+'$&$$X. $$W-$$W-$5!)"43*+'#>s#h$##C48'1C$$S#t4!r   c                 Z   | j                   rt        d      t        |      t        u rn<t	        |d      rt        |      }n$t	        |d      r|j
                  }nt        d      || j
                  k(  rt        d      t        |       }t        |       t        j                  ||       y)z.Save a file snapshot suitable for journalling.zdoc is closedr   r   r  zcannot snapshot to originalN)
r   r   r   r   r  r   r   r  rf   pdf_save_snapshot)r]   r3   r  s      r   save_snapshotzDocument.save_snapshotV  s    >>_-->S Xv&8}HXv&}}HHIItyy :;;t$3X.r   c                 Z    | j                  | j                  dt        j                        S )z Save PDF incrementallyT)r  r  )r  r   rf   PDF_ENCRYPT_KEEPr\   s    r   saveIncrzDocument.saveIncrh  s!    yyAWAWyXXr   c                    | j                   s| j                  rt        d      | j                  st        d      t	        |d      st        d      t        t        |             }t        |      dk(  st        |      |vst        |      |vrt        d      t        |       }t        dk\  rt        j                  ||       nt        j                  |t        |             | j!                          y)	z,Build sub-pdf with page numbers in the list.r   r  r  zsequence requiredr   r  r  N)r   r  r   r  r  r  r'  r  r  r   rw   rf   pdf_rearrange_pages2r   rearrange_pages2ru   r  )r]   pylistevalid_ranger  s       r   selectzDocument.selectl  s    >>T..;<<{{[))w.011CI&LA7|;.7|;.122 t$ ')&&sG4 ""3g7 	r   c                     t        |       }t        |       |st        j                  }nt        j                  |      }t        j
                  ||       yr  )r   r  rf   r  rG  pdf_set_document_language)r]   r  r  r  s       r   rI  zDocument.set_language  sD    t$3&&D55h?D''T2r   c                 4   | j                   rt        d      t        | j                         j	                               }|t               k(  rt        d      |rWt        |      t        t        fvrt        d      t        |      j                  |      }|t               k7  rt        d|z        |rWt        |      t        t        fvrt        d      t        |      j                  |      }|t               k7  rt        d|z        |rWt        |      t        t        fvrt        d      t        |      j                  |      }|t               k7  rt        d|z        |rt        |      t        t        fvrt        d	      |D ]\  }	t        |	      t        t        fvrt        d
|	z        t        |	      j                  |      }|t               k7  sPt        d|z         |r/t        |      j                         }|dk(  rd}|dvrt        d      t        |       }
t        |
       t        j                  t        j                  |
      t!        d      t!        d            }|j"                  sy|dk(  r t        j$                  |t!        d            }n3t        j&                  t        j$                  |t!        d            |      }|j"                  st        t(              t+        ||||||       t        j,                  |
j"                         y)z5Set the PDF keys /ON, /OFF, /RBGroups of an OC layer.r   z document has no optional contentzbad type: 'on'zbad OCGs in 'on': %szbad type: 'off'zbad OCGs in 'off': %szbad type: 'locked'zbad OCGs in 'locked': %szbad type: 'rbgroups'zbad RBGroup '%s'zbad OCGs in RBGroup: %s	UNCHANGED	Unchanged)r  r  r  zbad 'basestate'r  r  NrY  rI  r  )r   r   r!  r  keysr   rt   ru   
differencer   upperr   r  rf   r   r  r   r   r   r^  r  JM_set_ocg_arraysr  )r]   r  	basestater  offrbgroupsr6  r  r)  r  r  r  r   s                r   	set_layerzDocument.set_layer  s   >>.//4==?'')*35=?@@Bxe}, !122B""4(ACEz !7!!;<<Cyu- !233C##D)ACEz !81!<==F|D%=0 !566F&&t,ACEz !;a!?@@H~dE]2 !788 DAw4-/$%7!%;<<F%%d+:$%>%BCCD I,,.IK''	 :: !233t$3!!!!3' (
 ~~R<$$c8C=9C%%&&Xi-@AC ~~/003	2sHfEs~~.r   c                 l   t        |t              rB| j                         D cg c]  }|d   |k(  s|d    }}|g k(  rt        d| d      |d   }t	        |       }|sJ |dk(  rt        j                  ||       y|dk(  rt        j                  ||       yt        j                  ||       yc c}w )	z$Set / unset OC intent configuration.r:   r  z	bad OCG 'r  r   r   rr   N)	rs   r   r;  r   r   rf   pdf_toggle_layer_config_uipdf_deselect_layer_config_uipdf_select_layer_config_ui)r]   r  r  uir  r  s         r   set_layer_ui_configzDocument.set_layer_ui_config  s     fc"-1-B-B-D]r6
V\H\bl]F]| 9VHB!788AYFt$
sQ;,,S&9q[..sF;,,S&9 ^s
   B1B1r[  c                 d   | j                         }|dk(  rt        d      |rt        |t              sydddd}t	        |j                               j                  |j                               sDdt	        |j                               j                  |j                                }t        |      d}|j                  |       |j                         D ]?  \  }}t        |      j                         }|dvrt        d| d	| d
      |d| d| z  }A |dz  }| j                  |d|       y)zSet the PDF MarkInfo values.r   r  FrS  zbad MarkInfo key(s): rQ  )rX  falsezbad key value 'z': 'r   rW  rl   rR  rP  T)r  r   rs   r   r!  r  
issupersetr  r  rn  r   r  r$  )r]   r[  r   rZ  badkeyspdfdictr  ry   s           r   set_markinfozDocument.set_markinfo  s&   !19[))z(D9 EuM5::< ++HMMO<-c(--/.B.M.Mejjl.[-\]GW%%X++- 	)JCe*""$E-- ?3%tE7!!DEE3%q((G		)
 	4$
G4r   r  c                    d}| j                         }|dk(  rt        d      |st        d      |d   dk(  r|dd }|D ];  }|j                         |j                         k(  s%| j                  |dd|         y	 t        d      )
zSet the PDF PageLayout value.)r  	OneColumnTwoColumnLeftTwoColumnRightTwoPageLeftTwoPageRightr   r  zbad PageLayout valuerW  r   Nr  Tr  r   r  r$  )r]   r  rZ  r   rM   s        r   set_pagelayoutzDocument.set_pagelayout  s    m!19[))344a=C#ABJ 	A!QWWY.!!$!g>	 /00r   r  c                    d}| j                         }|dk(  rt        d      |st        d      |d   dk(  r|dd }|D ];  }|j                         |j                         k(  s%| j                  |dd|         y	 t        d      )
zSet the PDF PageMode value.)r  UseOutlines	UseThumbs
FullScreenUseOCUseAttachmentsr   r  zbad PageMode valuerW  r   Nr  Tr  )r]   r  rZ  r   rM   s        r   set_pagemodezDocument.set_pagemode  s    `!19[))122A;#|H 	A~~1779,!!$
asG<	 -..r   c                    | j                   s| j                  rt        d      t        |       }t	        |       t        j                  t        j                  |      t        d            }|j                  st        t        t               t        j                  |j                  d            }t        j                  |t        d            }|j                  rt        |||d       y	t        j                   ||t        j"                         d      }t        j$                  |t        d      t        d             t        j$                  |t        d      t        d             t        j$                  |t        d      |       y	)
z"Store XML document level metadata.r   r  r  r  r   ru  r=  XMLN)r   r  r   r   r  rf   r   r  r   r   rr  MSG_BAD_PDFROOTrs  rb  r{  r   r  r  r  )r]   r  r  r  r   r  s         r   set_xml_metadatazDocument.set_xml_metadata  s   >>T..;<<t$3!!5#4#4c#:HV<LM_&:;22HOOG4LM  $(<=>>c3Q/&&S%,,.!DCXf%5x
7KLXi%8(5/Jhz&:C@r   c                    t        |       }t        |       t        j                  t        j                  |      t        d      t        d      t        d            }t        j                  |      rt        j                  |      s|dk  ryt        t              |dk  ryt        j                  ||       |r5t        j                  |       t        j                  |j                         yy)zActivate an OC layer.r  r  r  r   Nr   )r   r  rf   r   r  r   r.  r]  r   MSG_BAD_OC_LAYERpdf_select_layer_configpdf_set_layer_config_as_defaultr  r   )r]   r  
as_defaultr  cfgss        r   switch_layerzDocument.switch_layer2  s    t$3""!!3' (#	 !!4(0C0CT0Jz.//A:%%sF31137!!3>>2 r   c                 t   | j                   s| j                  rt        d      t        |       }t	        |       t        j                  |      }t        |d|dz
        st        dt        t               t        |       t        ||      }t        j                  |||       |rt        t        |             yy)z!Replace object definition source.r   r   bad xrefN)r   r  r   r   r  rf   r>  rW  rr  r?  rp  r  r  r  JM_refresh_linksr   )r]   r   r:   r   r  xreflennew_objs          r   r  zDocument.update_objectG  s    >>T..;<<t$3$$S)a+J.>?%c40T73l401 r   c                    | j                   s| j                  rt        d      t        |       }t	        j
                  |      }|dk  s||kD  rt        t              t	        j                  ||d      }t	        j                  |      st        t              t        |      }|st        t              t        ||||       d|_        y)zReplace xref stream part.r   r   r   N)r   r  r   r   rf   r>  r?  r@  r:  MSG_IS_NO_DICTr   rp  r   r   dirty)	r]   r   r|  newcompressr  r-  r   r   s	            r   update_streamzDocument.update_streamW  s    >>T..;<<t$$$S)!8tg~l++$$S$2  %n-- (^,,c31	r   c                 \    t        |       }|j                  rt        j                  |      S y)z1
        Count versions of PDF document.
        r   )r   r   rf   pdf_count_versionsr  s     r   version_countzDocument.version_counti  s)    
 t$>>++C00r   c                     ddl m}  |       }| j                  ||||
||||||||	||||||||       |j                         S )Nr   r/  )r  r  r  r  r  r  r  r  rM  r  r  r  r  r  r  r  r  r  r  )r.  r/  r  rG  )r]   r  r  r  r  r  r  rM  r  r  r  r  r  r  r  r  r  r  r  r  r/  bios                         r   writezDocument.writes  si    , 	i		#%-+'%'!"3'#5) 	 	
, ||~r   c                 b    t        |        | j                  j                  | j                        S zPDF xref number of page.r&  r   r  r  r\   s    r   r   zDocument.xref  %     	D{{$$T[[11r   c                 ^   t        |       }t        |       t        j                  |      }t	        |d|dz
        s|dk7  rt        t              |dkD  rt        j                  ||      }nt        j                  |      }|j                  syt        j                  ||      }|j                  syd}t        j                  |      rd}dt        j                  |      z  }n-t        j                  |      rd}nt        j                  |      rd	}nt        j                  |      rd
}dt        j                   |      z  }nt        j"                  |      rd}nt        j$                  |      rd}d}nt        j&                  |      rd}t        j(                  |      rd}nkd}nht        j*                  |      rd}dt        j,                  |      z  }n8t        j.                  |      r!d}t1        t        j2                  |            }nd}|t5        |dd      }	t7        |	      }||fS )z+Get PDF dict key value of object at 'xref'.r   rY  r   )ro  ro  Nr   %i 0 Rr  r   r   z%ir%  ro  r  rX  r  r   z/%sstringunknown)r   r  rf   r>  rW  r   r?  rK  r  r   ra  r  r   r.  r:  
pdf_is_intr   pdf_is_realrC  rb  rc  rr  r9  pdf_is_stringr   r   JM_object_to_bufferr  )
r]   r   r  r  r-  r   subobjr:   r   r   s
             r   r7  zDocument.xref_get_key  s   t$3$$S)a+
l++!8''T2C##C(C~~#$$S#.  #  (De..v66D'Dv&Df%D%**622Dv&Dv&DDv&D  (v&D5,,V44D  (D$U%=%=f%EFDD<%fa3C',Dd|r   c                    t        |       }t        |       t        j                  |      }t	        |d|dz
        s|dk7  rt        t              |dkD  rt        j                  ||      }nt        j                  |      }t        j                  |      }g }|dk(  r|S t        |      D ]<  }t        j                  t        j                  ||            }|j                  |       > |S )zFGet the keys of PDF dict object at 'xref'. Use -1 for the PDF trailer.r   rY  r   )r   r  rf   r>  rW  r   r?  rK  r  r;  r  r9  r=  r6   )	r]   r   r  r-  r   r?  rh   r  r  s	            r   xref_get_keyszDocument.xref_get_keys  s    t$3$$c*a+
l++!8''d3C##S)C$6Iq 	A##U%;%;S!%DECIIcN	 	r   c                 |    | j                   s| j                  rt        d      | j                  |d      d   dk(  ryy)zCheck if xref is a font object.r   ru  r   z/FontTFr   r  r   r7  r]   r   s     r   xref_is_fontzDocument.xref_is_font  s=    >>T..;<<T6*1-8r   c                 |    | j                   s| j                  rt        d      | j                  |d      d   dk(  ryy)z!Check if xref is an image object.r   r=  r   z/ImageTFrL  rM  s     r   xref_is_imagezDocument.xref_is_image  s=    >>T..;<<T9-a0H<r   c                 \    t        |       }|syt        t        j                  ||            S )z!Check if xref is a stream object.F)r   r  rf   pdf_obj_num_is_streamr  s      r   xref_is_streamzDocument.xref_is_stream   s*    t$E//T:;;r   c                 |    | j                   s| j                  rt        d      | j                  |d      d   dk(  ryy)z Check if xref is a form xobject.r   r=  r   z/FormTFrL  rM  s     r   xref_is_xobjectzDocument.xref_is_xobject  s=    >>T..;<<T9-a0G;r   c                 N    d}t        |       }|rt        j                  |      }|S )zGet length of xref table.r   )r   rf   r>  )r]   r-  r  s      r   xref_lengthzDocument.xref_length  s)    t$((-Gr   c                    | j                   rt        d      t        r$t        j                  | j
                  |||      }|S t        |       }t        |       t        j                  |      }t        |d|dz
        s|dk7  rt        t              |dkD  rt        j                  ||      }nt        j                  |      }t        t        j                  |      ||      }t!        |      }	|	S )z#Get xref object source as a string.r   r   rY  r   )r   r   r   r   r  r   r   r  rf   r>  rW  r?  rK  r  rG  rk  JM_EscapeStrFromBuffer)
r]   r   r  rM  rN   r  r-  r   r   r:   s
             r   r  zDocument.xref_object  s    >>.//##TYYj%HCJt$3$$S)a+
l++!8''T2C##C(C!%"<"<S"A:uU%c*r   c           	      v   | j                   rt        d      |r2t        |t              r"t        j                  |      t               dhfvrt        d      t        |t              r-|r+|d   dk(  r.t        j                  |dd       t               k7  rt        d      t        |       }t        |       t        j                  |      }t        |d|dz
        s|dk7  rt        t              |dk7  rt        j                  ||      }nt        j                  |      }t        |||      }|j                   sy|dk7  rt        j"                  |||       yt        j$                  |      }t'        |      D ]A  }	t        j(                  |t        j*                  ||	      t        j,                  ||	             C y)	z&Set the value of a PDF dictionary key.r   rW  z	bad 'key'r   r   Nzbad 'value'rY  )r   r   rs   r   INVALID_NAME_CHARSintersectionr!  r   r  rf   r>  rW  r?  rK  r  JM_set_object_valuer   r  r;  r  r  r=  r<  )
r]   r   r  ry   r  r-  r   r.  r?  r  s
             r   r$  zDocument.xref_set_key+  s   >>.//*S#.2D2Q2QRU2V_b_dgjfk^l2l[))%%UeAh#oJ\JiJijopqprjsJtx{x}J}]++t$3$$S) a+
l++2:''T2C##C(C%c36!!2:##Cw7""7+A1X ""..w:..w:r   c                    | j                   s| j                  rt        d      t        |       }t	        |       t        j                  |      }t        |d|dz
        s|dk7  rt        t              |dk\  rt        j                  ||d      }nt        j                  |      }d}t        j                  |      r!t        j                  ||      }t        |      }|S )zGet decompressed xref stream.r   r   rY  r   N)r   r  r   r   r  rf   r>  rW  r?  r@  r  r   pdf_load_stream_numberr   r]   r   r  r-  r   r   r   s          r   xref_streamzDocument.xref_streamR  s    >>T..;<<t$3$$c*a+
l++19((#tQ7C##S)C$..T:C #&Ar   c                    | j                   s| j                  rt        d      t        |       }t	        |       t        j                  |      }t        |d|dz
        s|dk7  rt        t              |dk\  rt        j                  ||d      }nt        j                  |      }d}t        j                  |      r!t        j                  ||      }t        |      }|S )z&Get xref stream without decompression.r   r   rY  r   N)r   r  r   r   r  rf   r>  rW  r?  r@  r  r   pdf_load_raw_stream_numberr   r`  s          r   xref_stream_rawzDocument.xref_stream_rawe  s    >>T..;<<t$3$$c*a+
l++19((#tQ7C##S)C$22C>C #&Ar   c                 Z   t        |       }t        |       t        j                  t        j                  |      t        d            }|j                  st        t        t               t        j                  |t        d            }d}|j                  rt        j                  |      }|S )z"Get xref of document XML metadata.r  r  r   )r   r  rf   r   r  r   r   rr  r!  rs  r   )r]   r  r  r  r   s        r   xref_xml_metadatazDocument.xref_xml_metadatax  s    t$3!!5#4#4c#:HV<LM_&:;  $(<=>>##S)Dr   )r   r  r  __dict__c                     | j                   S r   )r  r\   s    r   <lambda>zDocument.<lambda>  s
    DMM r   )r  Nr  )NNNNr   r   r  r  r   NN)rY  S  J  NNr   NN)rY  r   NN)r   rY  r   )rY  )r   r   N)r   FTTTFFFFFr     NNTr   r   r   F)rY  rY  rY  rY  TTr   r   )	rY  rY  rY  rY  r   r   r   r   Nr   )Nr   r   r  r  rW   )r   r   r   r   r   r   r   r   r   r   r   r   r   rn  NNr   r   r   )NNNNN)r   Nr   r   )FFFFFFFFFFFFr   rn  NNr   r   r   )r`   ra   rb   r  r  r  r[  r^  r   r  r^   r  r   r   r	  r  r  r  r'  typingUnionr,  r2  r4  r>  r@  rB  rQ  r   rT  rf  rp  rs  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  
ByteStringr  r-  r/  r2  r   r4  r   r:  rt   r)  OptBytesr=  rM  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r&  r)  r  r0  r;  r=  r  rH  rN  r[  r]  r   rj  r  rs  ru  r  r{  r  r  r  r  sysimplementationversioncollectionsabcIterable
_pages_retOptIntr  r  r  r  r  r  r  r  r  r  r  r  rI  r  r	  r  r  r  r"  r)  r  r4  r7  r;  r   r7  rJ  rN  rP  rS  rU  rW  r  r$  ra  rd  rf  	__slots__outliner  	is_streamr    r   r   r   r   *
  s   4 ,;.!S !~<@ U# U)(@9+	v||CH'= 	# 	@
+-^%*"HDL% %S # C 3 WZ ad >@)$ (
	/7 r2)	8	 'H8  (/EN
9 &*4 @d @D @D @( 3 3$.;S ;c ;2< s  4@ J ##&&&&& & 	&
 & &P)s )&S#X 6 &	*S#X 6 	*5 	*c3h!7 D ,t   $"#,,sCx(  	
  >0dPj  )-^/7 r.4	*X$# T T $
3 
d 
d 
S T  "{0 )\ l(^ $ $    ,   ; ;  
8&P"4% 
9 
9 / /4(<% $  :;S ;c ;(  0  /*$ 	5 	5*$ C   #   !!F* __--
 __--d3
(6 (v (6 (T^ (6H  0/ 9 9 9v4y|  +V"p/$Y <@/D:$T d .1 1 /S / A&3*2 $     ).` 2 2
1f(<(%N&& CI12GGIr   r   c                   2    e Zd Zd Zd ZddZd Zd Zd Zy)	DocumentWriterc                     | S r   r    r\   s    r   r[  zDocumentWriter.__enter__  r\  r   c                 $    | j                          y r   r  r  s     r   r^  zDocumentWriter.__exit__  r  r   c                    t        |t              rn0t        |d      rt        |      }nt        |d      r|j                  }t        |t              r5t	        j
                  ||t        j
                  j                        | _        y t        |      }t	        j
                  ||t        j
                  j                        | _        |j                         dk(  sJ t        | j                  d      sJ y )Nr  r   r   _out)rs   r   r  r   rf   FzDocumentWriterPathType_PDFr   r  OutputType_PDFr  )r]   r1   r  r  s       r   r^   zDocumentWriter.__init__  s    tS!dJ':DdF#99DtS!..gu?U?U?b?bcDI (.C..We>T>T>c>cdDI'')Q...DIIv...r   c                 r    t        |      }t        j                  | j                  |      }t	        |      }|S r   )r  rf   fz_begin_pager   r}  )r]   r  	mediabox2r  device_wrappers        r   
begin_pagezDocumentWriter.begin_page  s2    #H-	$$dii;&/r   c                 B    t        j                  | j                         y r   )rf   fz_close_document_writerr   r\   s    r   r  zDocumentWriter.close  s    &&		2r   c                 B    t        j                  | j                         y r   )rf   fz_end_pager   r\   s    r   end_pagezDocumentWriter.end_page  s    499%r   Nr(   )	r`   ra   rb   r[  r^  r^   r  r  r  r    r   r   r  r    s     /.3&r   r  c                   4   e Zd Zd Z	 	 	 	 	 	 	 	 	 	 ddZd Zd Zed        Zed        Z	ed        Z
dd	Zed
        Zed        ZddZddZed        Zd ZddZed        Zed        Zed        Zed        Zed        Zed        ZddZd Zd Zy)r  c                 (    t        |       t        ury y r   )r   r  r\   s    r   r  zFont.__del__  s    :T! "r   Nc                    |rSt        |d      r|j                         }nt        |t              rt	        |      }t        |t              st        d      t        |t              r|j                         }d|v sd|v sd|v rt        d       |dv rd}n|j                  d	      rd
}nr|j                  d      rd}n^|j                  d      rd}nJ|t        j                         v rdd l}|j                  |      }d }~n|dk  rt        j                  ||      }t!        j"                  |      }t%        |||||||||	|

      }|| _        y )NrG  zbad type: 'fontbuffer'rW  \rm   z!Warning: did you mean a fontfile?)cjkchina-tchina-tsr   china-sr   korear   japanrr   )r  rG  rs   r-  r   r   r   r  rB   r   fitz_fontdescriptorsr  pymupdf_fontsmyfontBase14_fontdictr   rf   rG  JM_get_fontr   )r]   r   r  r  scriptr  rW  is_bold	is_italicis_serifembedfname_lowerr  r  r)  s                  r   r^   zFont.__init__  sD    z:.'002
J	2":.
j%0 !9::h$"..*Kk!T[%8C;<N;<<<''	2''0''0 4 9 9 ;;$*11+>
!A*..xB11(;8XvtXIx8 	r   c                      d| j                   z  S )Nz
Font('%s')r   r\   s    r   r   zFont.__repr__  s    dii''r   c                     J d       )NzHNot implemented because implementation requires FT_Get_First_Char() etc.r    )r]   r   s     r   _valid_unicodeszFont._valid_unicodes  s    \\\qr   c                 @    t        j                  | j                        S )z Return the glyph ascender value.)rf   fz_font_ascenderr   r\   s    r   ascenderzFont.ascender       %%dii00r   c                 6    | j                   j                         S r   )r   fz_font_bboxr\   s    r   r   z	Font.bbox  s    yy%%''r   c                     t        j                  t        j                  | j                  j                  j
                              }t        j                  |      S r   )rf   r  rf  r   r   rg  fz_buffer_extract_copy)r]   r   s     r   rg  zFont.buffer  s<    ..%"9"9499;O;O;V;V"WX++W55r   c           	      \   t        j                  |      }g }|D ]  }	t        |	      }
|r2t        j                  | j                  |
      }|dk\  r2| j                  }n%t        j
                  | j                  |
||      \  }}|j                  |t        j                  ||      z          |S )z@Return tuple of char lengths of unicode 'text' under a fontsize.r   )rf   rG  ordfz_encode_character_scr   !fz_encode_character_with_fallbackr6   ra  )r]   r:   r   r  r  wmode
small_capsr  rh   chrs  gidr)  s                r   char_lengthszFont.char_lengths  s    11(; 	KBBA22499a@!899D!CCDIIqRXZ^_	TIIh!7!7c5!IIJ	K 	r   c                 @    t        j                  | j                        S )z!Return the glyph descender value.)rf   fz_font_descenderr   r\   s    r   	descenderzFont.descender  s     &&tyy11r   c                    t        j                  | j                  j                        }|sy t	        |t         j
                        sJ t        rz|j                  gfd} |d      } |d      } |d      } |d      } |d      } |d      } |d      }	 |d      }
 |d      } |d      } |d      } |d      } |d      }t        rn|j                  t        rn|j                  t        rn|j                  t        rn|j                  t        rn|j                  t        rn|j                  t        r	n|j                  t        r
n|j                  t        rn|j                  t        rn|j                   t        rn|j"                  t        rn|j$                  t        rn|j&                  t        rdS |j(                  dS )Nc                 :    d   d| z  dz
  z  }d   | z	  d<   |S r  r    )bitsrN   rM   s     r   r  zFont.flags.<locals>.b*  s/    dqDy!m,tt|!
r   r   )monoserifr  r2  
substitutestretchz	fake-boldzfake-italicopentypezinvalid-bboxr  zcjk-langr  znever-embed)rf   ll_fz_font_flagsr   r   rs   fz_font_flags_tre   is_monor  r  r  ft_substitute
ft_stretch	fake_boldfake_italichas_opentypeinvalid_bboxr  cjk_langr  never_embed)r]   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rM   s                   @r   r  z
Font.flags   sv   ""499#7#781e33444A dGtHdG!IaDM1J!IA$KQ4LQ4LtHaDEA$K+6AII,7QZZ+6AII-8	akk1<!//.9
q||-8	akk/:0;0;,7QUU,7QZZ)4!''/: 	 AB 	r   c                    t        j                  |      }|r2t        j                  | j                  |      }|dk\  r2| j                  }n%t        j                  | j                  |||      \  }}t        j
                  ||      S )z2Return the glyph width of a unicode (font size 1).r   )rf   rG  r  r   r  ra  )	r]   chr_r  r  r  r  r  r  r)  s	            r   glyph_advancezFont.glyph_advanceL  sp    11(;..tyy$?Caxyy??		4QWY]^IC%%dC77r   c                 B   t        j                  |      }|r2t        j                  | j                  |      }|dk\  r2| j                  }n%t        j                  | j                  |||      \  }}t        t        j                  |t        j                                     S )z1Return the glyph bbox of a unicode (font size 1).r   )rf   rG  r  r   r  r   fz_bound_glyphr2  )r]   charr  r  r  r  r  r)  s           r   
glyph_bboxzFont.glyph_bboxW  s|    11(;..		4@Caxyy??DRXZ^_ICE(($U^^5EFGGr   c                 B    | j                   j                  j                  S r   )r   r   glyph_countr\   s    r   r  zFont.glyph_countb  s    yy##///r   c                     t        |      S )z$Return the unicode for a glyph name.)glyph_name_to_unicoderS  s     r   r  zFont.glyph_name_to_unicodef  s    $T**r   c                 
   |r<t        j                  |      }t        j                  | j                  |||      \  }}|S |r"t        j                  | j                  |      }|S t        j
                  | j                  |      }|S )z0Check whether font has a glyph for this unicode.)rf   rG  r  r   r  r`  )	r]   chrr  r  fallbackr  r  r  r)  s	            r   	has_glyphzFont.has_glyphj  s{    55h?D??		3PVX\]IC 
	 22499cB 
 //		3?
r   c                 @    t        j                  | j                        S r   )rf   fz_font_is_boldr   r\   s    r   r  zFont.is_boldv  s    $$dii00r   c                 @    t        j                  | j                        S r   )rf   fz_font_is_italicr   r\   s    r   r  zFont.is_italicz  s    &&		22r   c                 @    t        j                  | j                        S r   )rf   fz_font_is_monospacedr   r\   s    r   is_monospacedzFont.is_monospaced~  s    **DII66r   c                 @    t        j                  | j                        S r   )rf   fz_font_is_serifr   r\   s    r   r  zFont.is_serif  s    %%tyy11r   c                      yr  )r   rf   r  r   re   cppyygbl"mupdf_mfz_font_flags_ft_substituter  ll_fz_font_t3_procspdf_font_writing_supported)r]   r)  r  r  r  s        r   is_writablezFont.is_writable  s    r   c                 D    t        j                  | j                        }|S r   )rf   fz_font_namer   r  s     r   r   z	Font.name  s      +
r   c                 b   | j                   }t        j                  |      }d}	t        |t              st        t              |D ]b  }
t        |
      }|rt        j                  ||      }|dk\  r|}nt        j                  ||||      \  }}|	t        j                  ||      z  }	d |	|z  }	|	S )z1Return length of unicode 'text' under a fontsize.r   )r   rf   rG  rs   r   rp  MSG_BAD_TEXTr  r  r  ra  )r]   r:   r   r  r  r  r  thisfontr  rh   r  rs  r  r)  s                 r   text_lengthzFont.text_length  s    9911(;$$\** 	;BBA228Q?!8#D!CCHaQWY]^	T%((sE::B	; 	h	r   c                     t        |      S )z$Return the glyph name for a unicode.)unicode_to_glyph_name)r]   r  s     r   r  zFont.unicode_to_glyph_name  s    $R((r   c                     g S )z5
        list of valid unicodes of a fz_font
        )r  r  buffer_infor  sortedr!  )r]   r  gccpr   s        r   valid_codepointszFont.valid_codepoints  s	     	r   )
NNNr   NrY  r   r   r   r   )r  Nr   r   r   )Nr   r   r   )Nr   r   )r`   ra   rb   r  r^   r   r  r  r  r   rg  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r    r   r   r  r    sR    1f(] 1 1 ( ( 6 6 2 2 ) )V	8	H 0 0+
 1 1 3 3 7 7 2 2  $  
&)/r   r  c                       e Zd Zd Zd Zy)r  c                 6    t        |       t        ury d| _        y r  )r   r  r   r\   s    r   r  zGraftmap.__del__  s    DzX%r   c                 v    t        |      }t        |       t        j                  |      }|| _        d| _        y r  )r   r  rf   pdf_new_graft_mapr   r   )r]   r   dstmap_s       r   r^   zGraftmap.__init__  s1    s#3&&s+	r   N)r`   ra   rb   r  r^   r    r   r   r  r    s    
r   r  c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	        Zed
        Zed        Zedefd       Zed        Zed        Zed        ZddZddZd Zed        ZdZy)Linkc                 $    | j                          y r   )r   r\   s    r   r  zLink.__del__  s    r   c                 J    t        |t        j                        sJ || _        y r   )rs   rf   FzLinkr   )r]   r   s     r   r^   zLink.__init__  s    4...	r   c                 H    t        |        dt        | j                        z   S Nzlink on r&  r   r   r\   s    r   r   zLink.__repr__      DC,,,r   c                 H    t        |        dt        | j                        z   S r	  r	  r\   s    r   r   zLink.__str__  r	  r   c                     t        |      }|sy t        j                  ||d      }|j                  sy t	        |      }|S rW   )r   rf   r@  r   rF  r]   r   r   r  link_objr  s         r   _borderzLink._border  sA    s#))#tQ7""H%r   c                     t        |      }|sy t        j                  ||d      }|j                  st	        t
              t        |      }|S rW   )r   rf   r@  r   r   r?  rU  r	  s         r   _colorszLink._colors  sI    s#))3a8""l++X&r   c                      d | _         d| _        y r  )r   r   r\   s    r   r   zLink._erase  s    r   c                     t        |      }|sy t        j                  ||d      }|j                  sy t	        |||      }|S rW   )r   rf   r@  r   r  )r]   rI  r   r   r  r	  r  s          r   
_setBorderzLink._setBorder  sE    s#))#tQ7""X6r   c                 v    | j                  | j                  j                  j                  | j                        S r   )r	  r   r   r   r\   s    r   rI  zLink.border  '    ||DKK..33TYY??r   c                 v    | j                  | j                  j                  j                  | j                        S r   )r	  r   r   r   r\   s    r   r   zLink.colors	  r	  r   c                    t        | d      r| j                  t        d      | j                  j                  j                  s | j                  j                  j                  rt        d      | j                  j                  }| j
                  s| j                  j                  d      rd}n|j                  | j                        }t        | ||      S )z Create link destination details.r   Norphaned object: parent is Noner   #)
r  r   r   r   r  is_externalr  r   r  linkDest)r]   r   r  s      r   r  z	Link.dest  s     4"t{{':>??;;''4;;+=+=+J+J;<<kk  txx2237C""488,Cc3''r   r  c                     t        |        | j                  j                  }|j                  sy|j                  | j                  d      }|d   dk7  rt        |d         S y)Nr   ri  r   ro  )r&  r   r  r7  r   r   )r]   r   r  s      r   r  z
Link.flags  sU    Dkk  zzTYY,Q46>qt9r   c                 $   t        |        t        rt        j                  | j                        S | j                  }|j
                  r|j
                  j                  syt        t        j                  |j
                  j                              S )zFlag the link as external.F)
r&  r   r   Link_is_externalr   r   r  r  rf   fz_is_external_linkr]   	this_links     r   r	  zLink.is_external(  si     	D))49955II	##9+?+?+C+CU..	0D0D0H0HIJJr   c                    | j                   j                  syt        |        	 | j                   j                         }|j                  syt        |      }|rd|_        | j                  |_	        ||j                  j                  t        |      <   | j                  dkD  r| j                  j                         D cg c]  }|d   t        j                  k(  s|d     }}| j                  j                         D cg c]  }|d   t        j                  k(  s|d     }}|j!                  | j                        }||dz      |_        ||dz      |_        |S d|_        d|_        |S c c}w c c}w )z
Next link.Nr   Tr   rr   r(   )r   r   r&  r   r   	Link_nextr  r	  r   r   r  r  r   annot_xrefsrf   PDF_ANNOT_LINKr*  )r]   r   r  
link_xrefslink_idsr"  s         r   r  z	Link.next3  s@    yy##D )).."C~~CjCKCJ.1CJJ""2c7+yy1},0KK,C,C,Efq1QVQeQeIeadf
f*.++*A*A*CdQqtuOcOcGcAaDdd &&tyy1%cAg.!#'* 
 
 gds   >E+E+?E0E0c                    t        |        | j                  r| j                  j                  st        d      | j                  sJ | j                  j                  sJ t	        | j                  j                               }t        |      }|S )zRectangle ('hot area').z"self.this.m_internal not available)r&  r   r   r   r'  r   r   r  s     r   r   z	Link.rectO  so     	D yy		 4 4ABByyyyy####tyy~~/03i
r   Nc                     t        |      t        ur|||d}| j                  || j                  j                  j                  | j
                        S )N)r  r  r  )r   r   r	  r   r   r   )r]   rI  r  r  r  s        r   r  zLink.set_border]  sA    <t#$uGFvt{{'9'9'>'>		JJr   c                    t        |        | j                  j                  }t        |      t        ur||d}|j	                  d      }|j	                  d      }|t        d       |g dfv r|j                  | j                  dd       yt        |d	      rt        |      g}t        |       t        |      d
v sJ dt        |       d}|j                  | j                  d|       y)zSet border colors.r  r   r  Nz!warning: links have no fill colorr    r  r  r   r!  r"  r#  )r&  r   r   r   r   rB   r$  r   r  r%  r&  r'  rv   )r]   r   r  r   r   r)  s         r   r*  zLink.set_colorsb  s    Dkk  <t#"f5Fzz&!H%78b"XTYYT26;'Fm_F66{i'''	&!"!$C+r   c                     t        |        | j                  j                  }|j                  st        d      t	        |      t
        urt        d      |j                  | j                  dt        |             y )Nr  zbad 'flags' valueri  )	r&  r   r  r   r   r   r$  r   r   )r]   r  r   s      r   r-  zLink.set_flagsv  s`    Dkk  zz[))E{c!011CU4r   c                     t         rt        j                  | j                        S | j                  }|j                  r|j                  j
                  S dS )zUri string.r(   )r   r   link_urir   r   r  r%	  s     r   r  zLink.uri  sB     >>$)),,II	+4+?+?y##''GRGr   rY  )Nr   NNr  )r`   ra   rb   r  r^   r   r   r	  r	  r   r	  r  rI  r   r  r   r  r	  r  r   r  r*  r-  r  r   r    r   r   r	  r	    s    -- @ @ @ @ ( ( S   K K  6  K
,( H H Dr   r	  c                       e Zd Zd Zd Zd Zd Zd ZddddddddZd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd ZddZed        Zd Zd Zd Zd Ze	ZeZeZy)r5  c           	      j    t        j                  t        | D cg c]  }||z  	 c}            S c c}w r   mathsqrtsumr]   rs  s     r   __abs__zMatrix.__abs__  (    yy40aac01220   0c           
         t        |d      r^t        | j                  |z   | j                  |z   | j                  |z   | j
                  |z   | j                  |z   | j                  |z         S t        |      dk7  rt        d      t        | j                  |d   z   | j                  |d   z   | j                  |d   z   | j
                  |d   z   | j                  |d   z   | j                  |d	   z         S 
Nr   r   Matrix: bad seq lenr   r   rr   r   r  r
   
r  r5  r   r  rs  r  r   r  r'  r   r  s     r   __add__zMatrix.__add__      1k"$&&1*dffqj$&&1*&&1*dffqj$&&1*> >q6Q;233dffqtmTVVad]DFFQqTM&&1Q4-!A$1G 	Gr   c                 J    t        |       t        |       cxk(  xr dk(   S c  S rW   r  r  r\   s    r   __bool__zMatrix.__bool__  &    IT/a/00/00r   c                 \    t        |d      syt        |      dk(  xr t        | |z
        du S )Nr  Fr   r  r'  r  )r]   r6  s     r   __eq__zMatrix.__eq__  s0    sI&3x1}:dSj!1U!::r   c                     | j                   | j                  | j                  | j                  | j                  | j
                  f|   S r   r   r  rs  r  r   r  r]   r  s     r   r  zMatrix.__getitem__  s2    ?BBr   NrK	  c                   |s,dx| _         x| _        x| _        x| _        x| _        | _        nt        |      dkD  rt        d      t        |      dk(  r7t        t        |      \  | _         | _        | _        | _        | _        | _        nBt        |      dk(  rbt        |d   t        j                        rz|d   j                   | _         |d   j                  | _        |d   j                  | _        |d   j                  | _        |d   j                  | _        |d   j
                  | _        nt        |d   d      rt        j                  |d         }t!        t        j"                  |      d      }	t!        t        j$                  |      d      }
|	x| _         | _        |
| _        |
 | _        dx| _        | _        n
t        t        |d         \  | _         | _        | _        | _        | _        | _        nt        |      dk(  st        |      d	k(  rN|d   dk(  rFt        |d         ddt        |d         ddf\  | _         | _        | _        | _        | _        | _        ngt        |      d	k(  rN|d   dk(  rFd
t        |d         t        |d         d
ddf\  | _         | _        | _        | _        | _        | _        nt        d      ||| _         ||| _        ||| _        ||| _        ||| _        ||| _        yy)a  
        Matrix() - all zeros
        Matrix(a, b, c, d, e, f)
        Matrix(zoom-x, zoom-y) - zoom
        Matrix(shear-x, shear-y, 1) - shear
        Matrix(degree) - rotate
        Matrix(Matrix) - new copy
        Matrix(sequence) - from 'sequence'
        Matrix(mupdf.FzMatrix) - from MuPDF class wrapper for fz_matrix.
        
        Explicit keyword args a, b, c, d, e, f override any earlier settings if
        not None.
        rU  r   r?	  r   r   r      rr   r   rV  zMatrix: bad argsN)r   r  rs  r  r   r  r'  r   r  r%  rs   rf   r2  r  r6	  radiansroundcossin)r]   r   r  rs  r  r   r  r  thetac_s_s              r   r^   zMatrix.__init__  s    BEEDFETVEdfEtvEY]233Y!^=@=M:DFDFDFDFDFDFY!^$q'5>>2aaaaaaa+.T!W-488E?A.488E?A."$$"%%ADUDQRGAT>Y!^s4yA~$q'Q,=B47^S%Q.#s>3:DFDFDFDFDFDFY!^Q1=@d1gd1gS#>>:DFDFDFDFDFDF /00 =QDF=QDF=QDF=QDF=QDF=QDF=r   c                 <    t               }|j                  |        |S )zCalculate inverted matrix.)r5  invert)r]   m1s     r   
__invert__zMatrix.__invert__  s    X
		$	r   c                      y)Nr   r    r\   s    r   r  zMatrix.__len__      r   c           	         t        |d      r^t        | j                  |z  | j                  |z  | j                  |z  | j
                  |z  | j                  |z  | j                  |z        S t        dd      }|j                  | |      S )Nr   r   )	r  r5  r   r  rs  r  r   r  concat)r]   rA  rX	  s      r   __mul__zMatrix.__mul__  sr    1k"$&&1*dffqj$&&1*&&1*dffqj$&&1*> >Aa[yyq!!r   c                     t        | j                   | j                   | j                   | j                   | j
                   | j                         S r   )r5  r   r  rs  r  r   r  r\   s    r   __neg__zMatrix.__neg__  s;    tvvgw$&&466'DFF7KKr   c                 J    t        |       t        |       cxk(  xr dk(   S c  S rW   rD	  r\   s    r   __nonzero__zMatrix.__nonzero__  rF	  r   c                     t        |       S r   )r5  r\   s    r   __pos__zMatrix.__pos__  s    d|r   c                 0    dt        t        |             z   S )Nr5  r   ru   r\   s    r   r   zMatrix.__repr__  s    #eDk***r   c                     t        |      }|dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y t        d      )Nr   r   rr   r   r  r
   index out of range)r%  r   r  rs  r  r   r  r  r]   r  rM   s      r   __setitem__zMatrix.__setitem__  s    !H!VaTV 	 !VaTV 	 !VaTV 	 !VaTV
 		 !VaTV 	 !VaTV 	 122r   c           
         t        |d      r^t        | j                  |z
  | j                  |z
  | j                  |z
  | j
                  |z
  | j                  |z
  | j                  |z
        S t        |      dk7  rt        d      t        | j                  |d   z
  | j                  |d   z
  | j                  |d   z
  | j
                  |d   z
  | j                  |d   z
  | j                  |d	   z
        S r>	  r@	  r  s     r   __sub__zMatrix.__sub__  rB	  r   c           	      l   t        |d      rpt        | j                  dz  |z  | j                  dz  |z  | j                  dz  |z  | j
                  dz  |z  | j                  dz  |z  | j                  dz  |z        S t        |      d   }|st        d      t        dd      }|j                  | |      S Nr   rV  r   zmatrix not invertible)r  r5  r   r  rs  r  r   r  util_invert_matrixZeroDivisionErrorr]	  )r]   rA  rX	  m2s       r   __truediv__zMatrix.__truediv__  s    1k"$&&2+a-"QA&&2+a-"QAG G"1%#$;<<Aa[yyr""r   c                     t        |      t        |      cxk(  rdk(  st        d       t        d      t        ||      \  | _        | _        | _        | _        | _        | _        | S )z.Multiply two matrices and replace current one.r   r?	  )	r'  r   util_concat_matrixr   r  rs  r  r   r  )r]   onetwos      r   r]	  zMatrix.concat  s_    3x3s8(q(233 )2339KCQT9U6r   c                     |t        |       }nt        |      }|d   dk(  ry|d   \  | _        | _        | _        | _        | _        | _        y)z}Calculate the inverted matrix. Return 0 if successful and replace
        current one. Else return 1 and do nothing.
        r   r   )ro	  r   r  rs  r  r   r  )r]   r  r	  s      r   rW	  zMatrix.invert  sP     ;$T*C$S)Cq6Q;9<Q6r   c                     t        | j                        t        k  xr t        | j                        t        k  xs: t        | j                        t        k  xr t        | j
                        t        k  S )z,True if rectangles are mapped to rectangles.)r  r  EPSILONrs  r   r  r\   s    r   is_rectilinearzMatrix.is_rectilinear+  sR     DFFg%?#dff+*? >[7"<s466{W'<	>r   c                 P   t        |      }|dk  r|dz  }|dk  r|dk\  r|dz  }|dk\  rt        d|z
        t        k  r	 | S t        d|z
        t        k  rL| j                  }| j                  }| j
                  | _        | j                  | _        | | _        | | _        | S t        d|z
        t        k  rJ| j                   | _        | j                   | _        | j
                   | _        | j                   | _        | S t        d|z
        t        k  rL| j                  }| j                  }| j
                   | _        | j                   | _        || _        || _        | S t        j                  |      }t        j                  |      }t        j                  |      }| j                  }| j                  }||z  || j
                  z  z   | _        ||z  || j                  z  z   | _        | |z  || j
                  z  z   | _        | |z  || j                  z  z   | _        | S )z2Calculate pre rotation and replace current matrix.r   rk  g     V@g     f@g     p@)r%  r  ry	  r   r  rs  r  r6	  rO	  rR	  rQ	  )r]   rS	  r   r  radr)  rs  s          r   	prerotatezMatrix.prerotate1  s   eai#eaislESLEeslq5y>G#F C (AAVVDFVVDFRDFRDF6 3 ')ffWDFffWDFffWDFffWDF* ' ')AAffWDFffWDFDFDF  ,,u%CAAAAUQZ'DFUQZ'DFBFQZ'DFBFQZ'DFr   c                     t        |      }t        |      }| xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        | S )z1Calculate pre scaling and replace current matrix.r%  r   r  rs  r  )r]   sxsys      r   prescalezMatrix.prescale\  sM    2Y2Y""""r   c                 J   t        |      }t        |      }| j                  | j                  }}| xj                  || j                  z  z  c_        | xj                  || j                  z  z  c_        | xj                  ||z  z  c_        | xj                  ||z  z  c_        | S )z2Calculate pre shearing and replace current matrix.r	  )r]   r  rM   r   r  s        r   preshearzMatrix.preshearf  sx    !H!Hvvtvv1!dff*!dff*!a%!a%r   c                     t        |      }t        |      }| xj                  || j                  z  || j                  z  z   z  c_        | xj                  || j
                  z  || j                  z  z   z  c_        | S )z5Calculate pre translation and replace current matrix.)r%  r   r   rs  r  r  r  )r]   txtys      r   pretranslatezMatrix.pretranslateq  s_    2Y2Y"tvv+TVV++"tvv+TVV++r   r   )r`   ra   rb   r:	  rA	  rE	  rI	  r  r^   rY	  r  r^	  r`	  rb	  rd	  r   rj	  rl	  rr	  r]	  rW	  r  rz	  r}	  r	  r	  r	  __inv____div__normr    r   r   r5  r5    s    3G1;
C !% 5'n"L1+
G# > >
)V	 GGDr   r5  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)IdentityMatrixz"Identity matrix [1, 0, 0, 1, 0, 0]c                     t        d      S )N)r   r   r   r   r   r   )hashr\   s    r   __hash__zIdentityMatrix.__hash__  s    M""r   c                 2    t         j                  | dd       y )NrV  )r5  r^   r\   s    r   r^   zIdentityMatrix.__init__  s    c3'r   c                      y)Nz,IdentityMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)r    r\   s    r   r   zIdentityMatrix.__repr__  s    =r   c                 r    |dv rd| j                   |<   y |dv rd| j                   |<   y || j                   |<   y )NadrV  bcefrU  )rg  )r]   r   ry   s      r   __setattr__zIdentityMatrix.__setattr__  s:    4<"%DMM$V^"%DMM$"'DMM$r   c                      t        d      )NzIdentity is readonly)NotImplementedError)r  s    r   	checkargszIdentityMatrix.checkargs  s    !"899r   N)	r`   ra   rb   __doc__r	  r^   r   r	  r	  r    r   r   r	  r	  ~  s    ,#(>(:r   r	  c                       e Zd ZdZddZy)r 	  z#link or outline destination detailsNc           	      0	    |j                   }| }d _        d _        d _        d _        d _        t         _        t        dd       _	        t                _        d _        |j                   _        t        dd       _        |j                   _         fd}|rI j                  j!                  d      s.d|d   dz    dt#        |d          d	t#        |d
           _        |j                   rd _        t$         _         j                  sd _        t         _        |r j                  r j                  j'                  dd       _         j                  j!                  d      rt(         _        t+        j,                  d j                        }|rt/        |j1                  d            dz
   _        t        t3        |j1                  d            t3        |j1                  d                   _	         j                  t4        z  t6        z   _        nt+        j,                  d j                        }|r#t/        |j1                  d            dz
   _        nt8         _        t+        j,                  d j                        }|sJ |rb|r`|j1                  d      }|j;                         j=                  |       _         j                  t                _        | j                  d<   n= | j                  dd         _        n"t8         _         | j                         _        |j                   r6 j                  sn( j                  j!                  d      rډ j                  dd   _         j                  j!                  d      r j                  d
d   _        d _        d _        t>         _         j                  jA                  d      }	tC        |	      d
k(  r|	d   j!                  d      rttD         _        |	d    _        t/        |	d   jA                  d      d   dd        dz
   _        n3d j                  v rd _        t$         _        nd _        t>         _        tG         j                  t              sJ y )Nr(   r   Fc                     j                   dd  j                  d      }t               }|D ],  }|j                  d      }|dk\  r||dz   d  ||d | <   (d ||<   . |S )Nr   &ri  r   )r  rY  r   ri   )r  rn  rN   r  eqr]   s        r   uri_to_dictz&linkDest.__init__.<locals>.uri_to_dict  sp    HHQRL&&s+E&C %YYs^7%)"Q$%[CSb	N $CI% Jr   r	  z#page=r   z&zoom=0,,rr   rY  z	&zoom=nanz&zoom=0z7^#page=([0-9]+)&zoom=([0-9.]+),(-?[0-9.]+),(-?[0-9.]+)$r   r  z^#page=([0-9]+)$z^#nameddest=(.*)	nameddestzfile:r
   z//zpage=r	  r+   T)$r	  r  	file_specr  is_mapis_uri	LINK_NONEkindr  ltr   rH  
new_windowr   r=  r  r   rv   LINK_URIr  	LINK_GOTOr  r  r   groupr%  LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDr  r   LINK_LAUNCHrY  r'  
LINK_GOTORrs   )
r]   r   rlinkr   isExtisIntr	  rA  rH  ftabs
   `         r   r^   zlinkDest.__init__  s   		
	1+V
HH	1+77		 ,,S1a1~Xia6I5J!IV[\]V^L_K`aDH??DI DIxxDI!DITXXxx''Y?DHxx""3'%	HHVX\X`X`a #AGGAJ! 3DI#E1771:$7qwwqz9JKDG!%.?!?BS!SDJ!3TXX>A$'
Oa$7	$.	HH%7B'x#$%GGAJE)1)?)?)A)E)Ee)LDJ#zz1 .2V
6;DJJ{3)4TXXab\)BDJ&	(2
??88$$W-!%!">>,,T2%)^^AB%7DN#'	~~++C0t9>Aw))'2$.	)-a$'Qc(:1(=ab(A$BQ$F	"$	"'	$**d+++r   r   r`   ra   rb   r	  r^   r    r   r   r 	  r 	    s    -W,r   r 	  c                   \    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
ed	        Zd
 Zd Zd Zy)r  z6
    Class describing a PDF form field ("widget")
    c                    d | _         d| _        d| _        d | _        d | _        d | _        d | _        d | _        d | _        d| _	        d| _
        d| _        d | _        d | _        d | _        d | _        d| _        d| _        d| _        d| _        d| _        d| _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d| _        y )NSr   r   r   r   Helvr(   )ru  border_styleborder_widthborder_dasheschoice_values	rb_parent
field_namefield_labelfield_valuefield_flagsfield_display
field_typefield_type_stringr  button_caption	is_signedr   	text_fonttext_fontsizetext_maxlentext_format_text_dar  script_strokescript_formatscript_changescript_calcscript_blurscript_focusr   r   r\   s    r   r^   zWidget.__init__  s     !!!%"#!!! 		r   c                 <    d| j                    d| j                   dS )NzWidget:(field_type=z script=rj  )r	  r  r\   s    r   r   zWidget.__repr__  s%     %T%;%;$<HT[[MQRSSr   c                     | j                   sd| _         yd}|D ]6  }| j                   j                         |j                         k(  s/|| _          y d| _         y)zAEnsure text_font is from our list and correctly spelled.
        r	  N)CourTiRor	  ZaDb)r	  r  )r]   valid_fontsr  s      r   _adjust_fontzWidget._adjust_font$  sZ     ~~#DN6 	A~~##%2!"	  r   c           	         | j                   t        dd      vrt        d      | j                   t        j                  k(  r| j
                  dvrt        | d      r| j                  j                  }|j                  | j                  d      \  }}|dk(  ret        t        t        |dd j                  d	d
      j                                     }|D ]%  }|| j                  k7  s|j                  |dd       ' yyyyy)z Any widget type checks.
        r   rN	  zbad field type)FOffr   zParent/Kidsr  rY  r  r(   ASz/OffN)r	  r  r   rf   PDF_WIDGET_TYPE_RADIOBUTTONr	  r  r   r7  r   ru   r  r   r  rY  r$  )r]   r   	kids_type
kids_valuer  r   s         r   _checkerzWidget._checker2  s     ??%1+--.. ??e???DDTDT\jDjovw{  ~F  pG ++$$C$'$4$4TYY$N!IzG#c#z!B'7'?'?b'I'O'O'QRS! =Dtyy(((tV<= $ pGDj?r   c                     | j                   syd}d}d}| j                   j                         }t        |      D ]  \  }}|dk(  r2||dz
     dd }t        ||dz
           }dx||<   x||dz
  <   ||dz
  <   =|d	k(  r t        ||dz
           g}dx||<   ||dz
  <   b|d
k(  sh||dz
  | D cg c]  }t        |       }}dx||<   x||dz
  <   x||dz
  <   ||dz
  <    || _        || _        || _        d| _         yc c}w )zExtract font name, size and color from default appearance string (/DA object).

        Equivalent to 'pdf_parse_default_appearance' function in MuPDF's 'pdf-annot.c'.
        Nr	  r   r	  Tfrr   r   r(   grgr   )r	  rY  r  r%  r	  r	  r   )r]   r)  r  r  datr  r  r  s           r   r   zWidget._parse_daG  sO   
 }}mm!!# ~ 	GAtt|1q5z!"~c!a%j)/11A1QqSC!Hs{c!a%j)+$&&AQqSt|),QU16AuQx66:<<A<QqS<C!Hs1Q3x	 " 7s   +C;c                    | j                   j                  s| j                   j                  rt        d      | j                  st        d      | j
                  dk(  rd| _        t        | j                         t        | j                         | j                  sd| _	        t        | j                         | j                  sd| _
        | j                  sd| _        | j                  j                         dd | _        | j                  t        j                   t        j"                  t        j$                  fv }| j&                  sd| _        n&t)        | j&                        t*        urt        d      |s| j,                  sd| _        n&t)        | j,                        t*        urt        d	      |s| j.                  sd| _        n&t)        | j.                        t*        urt        d
      |s| j0                  sd| _        n&t)        | j0                        t*        urt        d      |s| j2                  sd| _        n&t)        | j2                        t*        urt        d      |s| j4                  sd| _        n&t)        | j4                        t*        urt        d      |s| j6                  sd| _        n&t)        | j6                        t*        urt        d      | j9                          y)z$Validate the class entries.
        zbad rectzfield name missingUnnamedNr	  r   r   zscript content must be a stringz$script_calc content must be a stringz&script_change content must be a stringz&script_format content must be a stringz&script_stroke content must be a stringz$script_blur content must be a stringz%script_focus content must be a string)r   is_infiniteis_emptyr   r	  r	  r&  ru  r  r   r	  r	  r	  r  r	  rf   PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXr	  r  r   r   r	  r	  r	  r	  r	  r	  r	  )r]   btn_types     r   	_validatezWidget._validatef  sZ    II!!yy!!Z((122y(#D4$$%4??#'DO4??#   !D!!!"D --335a: ??,,..11' 
 {{DK$++c)>?? 4++#D$""#3.CDD4--!%D$$$%S0EFF4--!%D$$$%S0EFF4--!%D$$$%S0EFF4++#D$""#3.CDD4,, $D$##$C/DEEr   c                    | j                   dvryt        | d      r| j                  j                  }ny| j                  }ddd}|j	                  |d      }|d   dk(  rLg }|d   d	d
 }|j                  d      dd }|D ]$  }|j                  |j                         d          & ||d<   |d   dk(  rug }t        |d   j                  d      d         }|j                  |      }|j                  d      dd }|D ]$  }|j                  |j                         d          & ||d<   |j	                  |d      }	|	d   dk(  rLg }
|	d   d	d
 }	|	j                  d      dd }|D ]$  }|
j                  |j                         d          & |
|d<   |	d   dk(  rug }
t        |	d   j                  d      d         }|j                  |      }	|	j                  d      dd }|D ]$  }|
j                  |j                         d          & |
|d<   |S )a	  Return the on/off state names for button widgets.

        A button may have 'normal' or 'pressed down' appearances. While the 'Off'
        state is usually called like this, the 'On' state is often given a name
        relating to the functional context.
        rr   r
   Nr   )r  downzAP/Nr   r   r   rr   r  rW  r  r   rl   zAP/Dr	  )	r	  r  r   r   r7  rY  r6   r   r  )r]   r   r   statesAPNnstatesapntr  nxrefAPDdstatesapdtdxrefs                r   button_stateszWidget.button_states  s+    ??&(4"++$$Cyy $/tV,q6VGa&2,C99S>!"%D -qwwy|,-&F8q6VGAS)!,-E//%(C99S>!"%D -qwwy|,-&F8tV,q6VGa&2,C99S>!"%D -qwwy|,-$F6Nq6VGAS)!,-E//%(C99S>!"%D -qwwy|,-$F6Nr   c                 .    | j                   j                  S r   )_annotr  r\   s    r   r  zWidget.next  s    {{r   c                     | j                   dvry| j                   dk(  ry| j                         }|
t               }|j                         D ]  }||   D ]  }|dk7  s	|c c S   t	        d       y)a  Return the "On" value for button widgets.
        
        This is useful for radio buttons mainly. Checkboxes will always return
        "Yes". Radio buttons will return the string that is unequal to "Off"
        as returned by method button_states().
        If the radio button is new / being created, it does not yet have an
        "On" value. In this case, a warning is shown and True is returned.
        r	  Nrr   Yesr	  z(warning: radio button has no 'On' value.T)r	  r	  r   r  rB   )r]   bstaterr  rM   s       r   on_statezWidget.on_state  s~     ??&(??a##%>VF 	AAY :H	 	:;r   c                 B    t         j                  | j                         y)z.Reset the field value to its default.
        N)r   _reset_widgetr	  r\   s    r   resetzWidget.reset  s     	DKK(r   c                 <   | j                          | j                          d| _        t        | j                        dk(  rd| j                  z   }nOt        | j                        dk(  rd| j                  z   }n't        | j                        dk(  rd| j                  z   } j
                  | j                  | j                  | j                  d| _        | j                  rt        | j                         t        j                  | j                  |        d| _        y	)
z*Reflect Python object in the PDF.
        r(   r   r  r   r  r  r  r  N)r	  r	  r	  r'  r   r  r	  r	  r	  util_ensure_widget_calcr	  r   _save_widget)r]   ro   s     r   r  zWidget.update  s     	 !Q&5EC!Q&*T]]:C!Q&9DMMIC"

DOOt~~&*&8&8: #DKK0 	4;;-r   N)r`   ra   rb   r	  r^   r   r	  r	  r   r	  r	  r  r  r
  r
  r  r    r   r   r  r    sQ    #J8=*>EN/b    .)
r   r  )_extrac                       e Zd Zd Zed        Zd Zed        Zed        Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        ZdgZy)r  c                     || _         y r   )r   r]   r  s     r   r^   zOutline.__init__!  s	    	r   c                     t        | dd      S )zoutline destination detailsNr 	  r\   s    r   r  zOutline.dest$  s     dD))r   c                     t        | d|      S )zo
        Like `dest` property but uses `document` to resolve destinations for
        kind=LINK_NAMED.
        Nr
  )r]   r   s     r   destinationzOutline.destination)  s    
 dH--r   c                 j    | j                   }|j                         }|j                  sy t        |      S r   )r   r	  r   r  )r]   r  down_ols      r   r	  zOutline.down0  -    YY'')!!wr   c                     t         rt        j                  | j                        S | j                  }|j                  sy|j                  j
                  }|yt        j                  |      S r  )r   r	
  Outline_is_externalr   r   r  rf   r$	  )r]   r  r  s      r   r	  zOutline.is_external8  sW     --tyy99YY}}mm;((--r   c                 D    	 | j                   j                  j                  S r   )r   r   r  r\   s    r   r  zOutline.is_openG  s    99''///r   c                 j    | j                   }|j                         }|j                  sy t        |      S r   )r   r  r   r  )r]   r  next_ols      r   r  zOutline.nextM  r
  r   c                 X    	 | j                   j                  j                  j                  S r   )r   r   r   r\   s    r   r   zOutline.pageU  s!    99'',,111r   c                 B    | j                   j                  j                  S r   )r   r   r0  r\   s    r   r0  zOutline.title[  s    yy##)))r   c                 `    | j                   }|j                  sy |j                  j                  S r   )r   r   r  r
  s     r   r  zOutline.uri_  s%    YY}}}}   r   c                 B    | j                   j                  j                  S r   )r   r   r  r\   s    r   r  z	Outline.xf      yy##%%%r   c                 B    | j                   j                  j                  S r   )r   r   r  r\   s    r   r  z	Outline.yj  r
  r   r   N)r`   ra   rb   r^   r  r  r
  r	  r	  r  r  r   r0  r  r  r  r|  r    r   r   r  r    s     * *.     . . # #
     % %
 * * ! ! & & & & 	Ir   r  c                 `   t        j                         }| |_        ||_        ||_        ||_        |rzrt        t         j                        sJ t        j                          G fddt         j                        } |       }|j                  |j                                ||_        |S )z4
    Returns a mupdf.PdfFilterOptions instance.
    c                   (     e Zd Z fdZd Z xZS )'_make_PdfFilterOptions.<locals>.Factoryc                 P    t         |           | j                          | _        y r   )r   r^   use_virtual_filtersopts)r]   	__class__r$
  s    r   r^   z0_make_PdfFilterOptions.<locals>.Factory.__init__  s!     "'')"
r   c           	      h    	 t        j                  |||||| j                  j                               S r   )r>   r$
  rL  rf   ll_pdf_new_sanitize_filter)r]   ctxr   chainstruct_parents	transformr  s          r   filterz._make_PdfFilterOptions.<locals>.Factory.filter  s9     77&!

++- r   )r`   ra   rb   r^   r,
  __classcell__)r%
  r$
  s   @r   Factoryr!
    s    #r   r.
  )rf   PdfFilterOptionsrK  rL  rM  	no_updaters   PdfSanitizeFilterOptionsPdfFilterFactory2add_factoryrL  _factory)	rK  rL  rM  r0
  rN  r$
  rR  r.
  factorys	        `   r   rP  rP  q  s     $$&GGO+GGM!G eU%C%CDDD224E	e-- 	2 )G,,./"Nr   c                   n   e Zd Zd Zd Zd Zd ZddZ	 	 	 	 	 	 	 ddZd Z	d	 Z
d
 ZddZd ZddZddZd Zd Zd Zd Zd Zd ZdedefdZd ZddZ	 	 	 ddZd Zd ZddZd Zd Z d  Z!dd!Z"d" Z#d# Z$dd$Z%d%e&de'fd&Z(d'e)de'fd(Z*	 	 	 dd%e&d)e+jX                  d*e-d+ed,ed-ede'fd.Z.	 	 	 	 	 	 	 dd'e)d/e-d0e/d1ed2e0d3e0d4e0d5e1d6e1de'fd7Z2	 	 dde'fd8Z3d9e4de'fd:Z5d;e&d<e&de'fd=Z6d>e4de'fd?Z7d>e4de'fd@Z8d'e)de'fdAZ9	 	 	 	 	 	 	 dd/ed1ed0e/d5e1dBe0d3e0dCe:de'fdDZ;	 	 	 	 dde'fdEZ<dd'e)dFe1de'fdGZ=dde'fdHZ>dd%e&d/e-d-e-de'fdIZ?dde'fdJZ@dKeAde'fdLZBdM ZCdN ZDddOZEeFdP        ZGeFdQ        ZHdR ZIddSZJeFdT        ZKeFdU        ZLdV ZMdW ZNeFdeOfdX       ZPddYZQeFdZ        ZReFd[        ZSeFd\        ZTdd]ZUdd^ZVd_ ZWdd`ZXddae:de4fdbZYdc ZZ	 ddde/dee/de4fdfZ[ddgZ\ddhZ]ddiZ^de4fdjZ_ddkZ`	 ddlead'e)de-fdmZbddne)doe1ddpfdqZcdr Zdds Ze	 	 ddtZfeFdu        ZgeFdv        ZhddwZidxe+j                  e-e1f   de'fdyZkdz Zld{ ZmeFd|        ZneFd}        Zod~ Zpd ZqeFd        ZreFdeOfd       Zsd Ztd Zud Zvd Zwd ZxddZyd Zzd Z{d Z|eFd        Z}eFd        Z~ddZd ZeFd        Z eFeId      Zy)r   c                    t        |t        j                  t        j                  f      s
J d|        || _        d| _        d | _        d| _        t               | _	        || _
        |j                  r\t        |t        j                        r&|j                  j                  j                  | _        y |j                  j                  | _        y d | _        y )Nz	page is: Tr(   )rs   rf   r   r   r   r   
last_point	draw_contr   r  r   r   r   r  )r]   r   r   s      r   r^   zPage.__init__  s    $u}} =>R)D6@RR>	6??4/"oo33::"oo44DKr   c                 "    | j                         S r   )r   r&  r   r   r|  r  r  rs  s     r   r   zPage.__repr__  s    ||~r   c                    t        | dd       }t        | j                  j                  t        j
                        r+| j                  j                  j                  j                  }n | j                  j                  j                  }d| }|rl| j                  j                  }| j                  j                  d| j                  j                  fz  }|dk(  rd| j                  j                  z  }|d| z  }|S )Nr   r  z<memory, doc# %i>r(   z<new PDF, doc# %i> of )r   rs   r   r   rf   pdf_pager   r  r   r   r|  r  )r]   r   r  rN   r  s        r   r   zPage.__str__  s    x.dii**ENN;YY))//66FYY))00FfX  A{{!!-'4;;+@+@*BBBw(4;;+@+@@T!:C
r   c                 X   t         r+t        j                  | j                  t	        |            }|S t         rqt        | j                  t        j                        r| j                  }nt        j                  | j                        }t        j                  |t	        |            }|S | j                         }t        j                  |t        j                        }|rt	        |      }t        j                  |      }t        j                  |j                  |j                  |j                  |j                   z   |j"                  z
  |j                  |j$                  z   |j&                  z
        }t        j(                  ||       t        j*                  |       t-        |d       |S NrH  )r   r   _add_caret_annotr   JM_point_from_pyrs   rf   r   r   	_pdf_pagepdf_create_annotr  pdf_annot_rectr(  r  r  r  r  r  r  rh  r
  JM_add_annot_id)r]   r  r   r   rd  r   s         r   r@
  zPage._add_caret_annot  s3   **DII7G7NOE* )  499emm4yy22DII>**D2B52IJE  >>#D**41F1FGE$U+((/LLacc133:+<accADDj144>OP((2""5)E3'r   Nc                 l   | j                         }|r|n|}|r|n|}	t        |      }
t        |       t        |      }|j                  st        t              t        j                  |t        j                        }t        j                  |      }t        j                  |
j                  |
j                  |
j                  |j                  z   |j                  z
  |
j                  |j                   z   |j"                  z
        }t        j$                  ||       t        j&                  }t        j(                  ||       |rt        j*                  ||       t-        |j/                         ||||	d      }t        j0                  t        j2                  |      t5        d      |       t        j6                  t        j2                  |      t5        d      |       t        j8                  |       t        j$                  ||       t        j(                  ||       t;        |d       t=        |      S )Nr   rg  r  rH  )rB
  rA
  r  r   r   rp  r   rf   rC
  r  rD
  fz_make_rectr  r  r  r  r  r  rh  PDF_ANNOT_IS_PRINTr,  pdf_set_annot_icon_namer/  r   r  r   r   r7  r
  rE
  r   )r]   r  r   r3   r  r{  iconr   ufr  rd  filebufr   r   r  r   s                   r   _add_file_annotzPage._add_file_annot  s   ~~#YDhU#4$W-!!^,,&&tU-L-LM  'qssACCqttadd):ACC!$$J<MN  *((!!%/))%6DHHJ2q!D5..u5x~sK&&u':':5'A8JCWYabu%  *!!%/s#U|r   c
                    | j                         }
t        |      \  }}t        |      \  }}t        |      }t        j                  |      st        j
                  |      rt        t              t        j                  |
t        j                        }t        j                  |      }t        j                  ||       t        j                  ||       t        j                  |t        d      |	       t        j                  |t        d      |       |dkD  rt        j                  ||d |        t!        |||||       t        j"                  |       t%        |d       t'        |      }|j)                         }|j+                  d      }|j-                  d      dz   }||| }|d   |d   z
  }|d   |d	   z
  }|	d
v r||}}dt/        ||f       dj1                         }|dz   |z   }d }d}t3        |d      j1                         }|r|dz  }d}t3        |d      j1                         }|r	|dz  }d}d}|r|rd}|||z   |z   |z   dz   |z   dz   |z   }|j5                  |       |S )Nr   r   r   rH  r  r  rr   r   r   )rl  ir  z0 0 z rer  r   r  r  r  rs  s   1 w
r  r  )rB
  r   r  rf   rf  re  r   rg  rC
  r  r   r5  rh  r  r   r  JM_make_annot_DAr
  rE
  r   r   ri   r  rv   r{  rz  r   )r]   r   r:   r   r   r   r  ru  r   r  r   r  r  ntcolr  r   r   r   r   r   r  r  r   r  r  r  r  r  r  s                                r   _add_freetext_annotzPage._add_freetext_annot  s`    ~~+J7t+J7tD!$$Q'5+A+A!+Dl++&&e.G.GH''/	$$eT2  %+	8H+=vF	8C=%@19%%ud6El; 	tXx@&s#El ZZ\WWU^XXe_q 2YGDGOGDGO^#aqAIq!f%&c*113+"
C07795 KC!,4;;=U"MFC=C?+%5:UBSH5PSUUB

2
r   c                    t        j                  | j                        }t        |       t	        |      st        t              t        j                         }t        j                  |t        j                  d      |       t        j                  |      }t        j                  |t         j                        }t        j                  |      }t        |      }t        j                  |j!                         |      }t#        |      D ]  }	||	   }
t        |
      }t        j                  |j!                         d|z        }t#        |      D ]  }|
|   }t	        |      rt%        |      dk7  rt        t              t        j&                  t)        |      |      }t        j*                  ||j,                         t        j*                  ||j.                          t        j0                  ||        t        j2                  |t5        d      |       t        j6                  |       t9        |d       t;        |      S )Nr   rr   r  rH  )rf   r   r   r  PySequence_Checkr   MSG_BAD_ARG_INK_ANNOTr2  r  r(  fz_invert_matrixrC
  r  r   r'  r  r   r  PySequence_Sizer  rA
  r  r  r  r0  r  r   r
  rE
  r   )r]   rt   r   r  inv_ctmr   r   n0inklistrB  sublistn1r  r  rd  r  s                   r   _add_ink_annotzPage._add_ink_annotO  s   **49954%344nn  u||A<((-&&tU-@-@A''.	Y%%dhhj"5r 	2A1gGWB((QV<F2Y ;AJ'*oa.@A.E$&;<<001A!1DgN))&%'':))&%'':;   &1	2 	9hy&97Cu%s#U|r   c                 N   | j                         }t        |       t        j                  |t        j                        }t        |      }t        |      }t        j                  |||       t        j                  |       t        |d       |j                  sJ t        |      S r?
  )rB
  r  rf   rC
  r   rA
  pdf_set_annot_liner
  rE
  r   r   )r]   r  r  r   r   r   r  s          r   _add_line_annotzPage._add_line_annotp  s    ~~4&&tU-A-ABR R   1-u%s#U|r   c                 j   | j                         }t        |      dk  rt        t              t	        j
                  ||      }|D ]@  }t        |      dk7  rt        t              t        |      }t	        j                  ||       B t	        j                  |       t        |d       t        |      S )Nrr   rH  )rB
  r'  r   MSG_BAD_ARG_POINTSrf   rC
  rV
  rA
  pdf_add_annot_vertexr
  rE
  r   )r]   r  r  r   r   rd  r  s          r   _add_multilinezPage._add_multiline|  s    ~~v;?011&&tZ8 	5A"a' "455$Q'E&&ue4		5 	u%s#U|r   c                    | j                         }g d}d}	t        j                  |t        j                        }
t	        |      }t        j
                  |      }t        j                  |
|       |rt        |      \  }	}t        j                  |j                         |	      }t        |	      D ]  }t        j                  |||           t        j                  t        j                  |
      t        d      |       |rt        j                  t        j                  |
      dt        j                   |             t        j"                  t        j                  |
      t        d      |       t        j$                  t        j                  |
      t        d      |       t        j&                  |
       t)        |
d       t        j*                  |
j,                        }
t        j.                  |
      }
t1        |
      S )N)r   r   r   r   r   r   r   DAr   rH  )rB
  rf   rC
  r   JM_quad_from_pyfz_rect_from_quadrh  r   r  r   r  r  r  r   r   r8  r9  r7  r  r
  rE
  ll_pdf_keep_annotr   r   r   )r]   r  r:   r  r   r   r   r   r  r  r   qr   r   r  s                  r   _add_redact_annotzPage._add_redact_annot  s   ~~&&tU-C-CDD!##A&  */5KE4%%dhhj%8C5\ 8))#tAw78u22598D>3O''.!--d3
 **5+>+>u+ExPT~W]^""5#6#6u#=x}eTu%s#''(8(89&U|r   c                 v   | j                         }t        |      }t        j                  |      st        j                  |      rt        t              t        j                  ||      }t        j                  ||       t        j                  |       t        |d       |j                  sJ t        |      S r?
  )rB
  r  rf   rf  re  r   rg  rC
  rh  r
  rE
  r   r   )r]   r   r  r   r   r   s         r   _add_square_or_circlezPage._add_square_or_circle  s    ~~D!$$Q'5+A+A!+Dl++&&tZ8  *u%s#U|r   c                 8   | j                         }t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d	      t        d
      t        d      t        d      t        d      t        d      g}t        |      }|d   }t        |       t	        |      }t        j                  |      st        j                  |      rt        t              t        |d|dz
        r||   }t        j                  |t
        j                        }t        j                  ||       	 t        d      }t        j                  t        j                  |      t        d      |       t        j&                  |t        j(                  t        j                  |      t        d                   t        j*                  |       t-        |d       t/        |      S # t         $ r t"        r
t%                 w xY w)NApprovedAsIsConfidentialDepartmentalExperimentalExpiredFinal
ForCommentForPublicReleaseNotApprovedNotForPublicReleaseSold	TopSecretDraftr   r   r  rH  )rB
  r   r'  r  r  rf   rf  re  r   rg  rW  rC
  r  rh  r  r   r   r   rF   r5  pdf_dict_get_namer
  rE
  r   )	r]   r   stampr   stamp_idr?  r   r   r   s	            r   _add_stamp_annotzPage._add_stamp_annot  s   ~~$ (((#!&+,'./ %!  M{4D!$$Q'5+A+A!+Dl++E1ac"E?D&&tU-B-BC  *	 Au22598F;KTR 	$$''(;(;E(BHVDTU	 	u%s#U|  	#(8	s   >G> >Hc                    | j                         }t        |      }t        |       t        j                  |t        j
                        }t        j                  |      }t        j                  |j                  |j                  |j                  |j                  z   |j                  z
  |j                  |j                  z   |j                  z
        }t        j                  ||       t        j                  ||       |rt        j                   ||       t        j"                  |       t%        |d       t'        |      S r?
  )rB
  rA
  r  rf   rC
  r  rD
  rG
  r  r  r  r  r  r  rh  r5  rI
  r
  rE
  r   )r]   r  r:   rJ
  r   rd  r   r   s           r   _add_text_annotzPage._add_text_annot  s    ~~e$4&&tU-A-AB  'qssACCqttadd):ACC!$$J<MN  *$$UD1))%6u%s#U|r   c                     t        |        | j                  j                  st        d      t	        | ||      }|sy t        j                  |       |_        || j                  t        |      <   |S )Nr  )	r&  r   r  r   Page__add_text_markerr  r  r  r  )r]   quadsr  r   s       r   _add_text_markerzPage._add_text_marker  s_    D{{!![))#D%<]]4(
$'C!
r   c                    t        |        t        r?t        j                  | j                  _        t        j                  | j                  |      S t        j                  | j                        }t        |      }|dk  ryd}t        |       t        |t              st        d      t        j                  |j                         t!        d            j"                  s.t        j$                  |j                         t!        d      |       t        j                  |j                         t!        d            }|j"                  sJ d|d|j"                         t'        |      D ]  }||   }t)        |      }|st+        d|       "	 t        j,                  |j/                         t1        |j/                         |            }t        j2                  |j/                         t        j4                  |      d	      }	t        j6                  ||	        y# t8        $ r! t:        r
t=                t+        d
|z         Y w xY w)z&Add links from list of object sources.r   NrY  zbad 'linklist' argumentrX  zlcount=z annots.m_internal=z"skipping bad link / annot item %i.r   z#skipping bad link / annot item %i.
)r&  r   r   Page_addAnnot_FromStringr%
  _addAnnot_FromStringr   rf   r   r'  r  rs   ru   r   r   r   r   r   r  r  JM_StrAsCharrB   rv  r   r  r@  r   r0  r   r   rF   )
r]   linklistr   lcountr  ra  txtpyr:   r   rw  s
             r   r
  zPage._addAnnot_FromString  s   D272P2PDNN/11499hGG**4995XA: 	4(E*788!!488:x/ABMM$$dhhj(82DfM##TXXZ(1CD  CWVI-Av/@/@.B"CC v 	DAQKE&D<a@D,,dhhj:Mtxxz[_:`a00$((*e>N>NPU>VXYZ$$fg6	D  D'N,<>BCDs   B
H'IIc                     | j                         }|j                         }t        ||||      }|j                  st	        d      t        |d       t        |      S )Nzcannot create widgetW)rB
  r   JM_create_widgetr   r   rE
  r   )r]   r	  r	  r   r  r   s         r   
_addWidgetzPage._addWidget  sR    ~~hhj dJ
C 677s#U|r   c                     | j                         }t        j                         }d|_        ||_        ||_        ||_        t        |       t        j                  |j                         ||      }|S rW   )
rB
  rf   PdfRedactOptionsblack_boxesr:   image_methodline_artr  pdf_redact_pager   )r]   r:   imagesgraphicsr   r  successs          r   _apply_redactionszPage._apply_redactions'  sa    ~~%%'	" 4''
D$?r   c                     | j                          	 | j                  j                  |        d | _        d| _        d | _        d | _        y # t        $ r t	                Y 2w xY wr  )_reset_annot_refsr   rT  r   rF   r   r  r   r\   s    r   r   zPage._erase2  s]     	KK$$T* 	  		s   A
 
A A c                 8   t        |       }t        j                  |j                         t        j                        }t        j                  |j                         t        j
                        }t        | j                        }t        j                  |||      S )a  Count missing graphic state pushs and pops.

        Returns:
            A pair of integers (push, pop). Push is the number of missing
            PDF "q" commands, pop is the number of "Q" commands.
            A balanced graphics state for the page will be reached if its
            /Contents is prepended with 'push' copies of string "q
"
            and appended with 'pop' copies of "
Q".
        )	r   rf   r   r   r  PDF_ENUM_NAME_Contentsr   r    pdf_count_q_balance_outparams_fn)r]   r   r   r&  r  s        r   _count_q_balancezPage._count_q_balance>  s{     D!  HHJ))
 !!HHJ((
 t{{+ 55c3EEr   r  r  c                 v   ||dk(  ry | j                   }|j                  |d      }d|v sd|v st        d      i }| j                         D ]
  \  }}|||<    ||j	                         v r||   S d}d|z  }||j                         v r|dz  }d|z  }||j                         v r| j                  ||       |S )	Nr   Tr  	/Type/OCG
/Type/OCMDzbad optional content: 'oc'zMC%ir   )r   r  r   _get_resource_propertiesr  r   _set_resource_property)	r]   r  r   checkpropsrd  r  r  mcs	            r   _get_optional_contentzPage._get_optional_contentV  s    :qkkt4u$(=9::113 	DAqE!H	9aZELLN"FA!B ELLN" 	##B+	r   c                 n    | j                         }t        |       t        |j                               }|S )z/
        page list Resource/Properties
        )rB
  r  JM_get_resource_propertiesr   )r]   r   rh   s      r   r
  zPage._get_resource_propertiesm  s-     ~~4'
3	r   c                 $   t         r9t        j                  | j                  |||      }t	        j
                  |      }|S | j                  }t	        j                  |      }t        |      }|t	        j                  |      n
t        |      }t        |      }	t	        j
                  |      }t	        j                  ||      }
t        j                  r$t	        j                  |
t        j                         t        |t        j                         rn>t        |t        j"                        r|j%                         }nJ dt'        |             t	        j(                  ||
|	t	        j*                                t	        j,                  |
       |S )Nr   )r   r   page_get_textpager   rf   r  r  r  fz_bound_pager  r  _globalsrX   fz_enable_device_hintsFZ_NO_CACHErs   r   r   r   r   fz_run_pager  fz_close_device)r]   r  r  r  ll_tpagetpager   r  r   r  devs              r   _get_textpagezPage._get_textpagev  s+   ..tyy$vNH%%h/ELyy&&u-t$,0Lu""4(od>S'!!$'''w7%%((#u/@/@AdELL)emm,::<D31d4j]331$S%..*:;c"r   c                    t        j                         }| j                         }|j                         }|
}|}|}d}d}d}d}d}d}|dkD  rt        j                  ||d      }t        j
                  t        j                  |t        d      t        d                  }t        j
                  t        j                  |t        d      t        d                  }||z   dk(  rt        t              d}d}d}d}n)|rt        |      }d}n|rt        j                  |      }d}|rt|j                  }|j                         }|j                         }t        j                  |      }|} |j!                  | d       }!|!.|!}t        j                  |j                         |d      }d}d}d}n|j#                         dk(  r)t        j$                  |t        j&                               }"nt        j(                  |t        j*                         t        j*                         t        j,                  d       t        j.                         d      }#d|#_        d |#_        t        j$                  |#t        j&                               }$t        j$                  ||$      }"d}d}|rt        j2                         }%t4        rt        j6                  |%       n?t        j8                  |%j:                  j<                  |j:                  j>                         |rgt        |      }t4        rt        j6                  |%|       n?t        j8                  |%|j:                  j<                  |j:                  j>                         t        j@                  |%      }tC        |      } |j!                  | d       }!|!|!}t        j                  |j                         |d      }t        j
                  t        j                  |t        d      t        d                  }t        j
                  t        j                  |t        d      t        d                  }d}d}n9t        jD                  |      }"|"j                         }|"j                         }|sd}|r|tF        dk\  rt        jH                  "      }&|&j:                  st        d      |"jK                         }'|"j1                         }(t        jL                  |"      \  })}*t        jD                  |      }$t        jN                  |||'|(|)|*ddtQ               tQ               |&|$      }"nt        jR                  "j:                        }&|&st        d      |"jK                         }'|"j1                         }(t        jL                  |"      \  })}*t        jD                  |      }$tU        jV                  |||'|(j:                  |)|*dd|&|$j:                  
      }+t        j&                  |+      }+d |"_        |+}"|rAt        jX                  |"      }|	rt[        |||	       t        j\                  |      }|| <   d}|rst        j^                  |ja                         t        d	            },|,j:                  s.t        jb                  |ja                         t        d	      d
      },t        jd                  |,t        d            }-|-j:                  s t        jb                  |,t        d      d
      }-tg        |||||      }.t        jh                  |-|       t        jj                  d      }/dtm        |.jn                  |.jp                  |.jr                  |.jt                  |.jv                  |.jx                  f       d| d}0t        jz                  |/|0       t}        ||ja                         |/|       |r||fS |d fS )Nr   r   Widthr
  Heightr   r  z#uncompressed image cannot have maskr   rr   XObject2   
q
z cm
/z Do
Q
)?rf   r  rB
  r   r@  r   rU  r   r   MSG_IS_NO_IMAGEr   fz_read_filer   r   r  fz_md5_pixmap2r   r  fz_new_image_from_pixmapFzImagefz_convert_pixmaprh  FzDefaultColorspacesri  r  FzMd5re   fz_md5_update_bufferfz_md5_updater   rN  r'  fz_md5_final2r   rk  rw   fz_compressed_image_bufferrm  rl  $fz_new_image_from_compressed_buffer2rt   r_  r   #fz_new_image_from_compressed_bufferpdf_add_imagerR  r   r  r   r  r   calc_image_matrixr8  r  rv   r   r  rs  r  r   r  fz_append_stringJM_insert_contents)1r]   r3   pixmapr|  imaskr  overlayr  keep_proportionr  r  r  r   r  _imgnamedigestsmaskbufr   r  r   r  img_xref	rc_digestdo_process_pixmapdo_process_streamdo_have_imaskdo_have_imagedo_have_xrefrefimgbufarg_pixdigestmd5_pyrR  imager  maskstatecbuf1rm  r  rz  r{  zimgr!  xobjectr6  nresr)  s1                                                    r   _insert_imagezPage._insert_image  s   
 .."~~ hhj	!8((dA6C  %"5"5sHW<MxX[}"]^A  %"5"5sHX<NPXY\P]"^_A1uz /22 ! !MM +F3$%!"//9F()% kkG		A		A))'2FF;;vt,D,,TXXZ1E$%! ! !==?a'!::7EMMOTE00#!..0!..0!66t<!//1B  !BH$(BM 99"emmoND!::7DIE$%! ! KKME**E6:##E6+<+<+A+A6CTCTCXCXY,U3..w?''w/A/A/F/FHZHZH^H^_((/F6]F;;vt,D,,TXXZ1E$$e&9&93@QS[\_S`&ab$$e&9&93@RT\]`Ta&bc ! !66v>GGIGGI$%M"g- 88%@''$&KLLiik"--/
"66u=
d55g>BB", ;;U=M=MN$&KLLiik"--/
"66u=
d55g> @@"-- }}T*" $( %%c51C c2.'',H&GFOI66txxz8KCXYI''!33DHHJ@UWXY	((HY4GHG%%11)Xi=PRST#Aq$HC37&&r*D	355#%%suucee"LMNfU]T^^fgA""4+sDHHJg>W$$T>!r   c                 d   | j                         }t        |       |j                         }t        |||||||||	|

      }t	        j
                  |j                         t        d            }t	        j                  |t        d            }|j                  sNt	        j                  |d      }t	        j                  |j                         |t        d      t        d             t        |d      \  }}|st        d      t	        j                  ||d      }t	        j                  |||       |S )Nr   r  r
   r   zcannot insert font)rB
  r  r   r  rf   r  r   r   r   r   r  r  r  r   r@  r8  )r]   r   rU  r  r  
set_simpler"  r  r  r  rW  r   r  ry   r!  r  r  r   font_objs                      r   _insertFontzPage._insertFontn  s    ~~4hhjsFHZSRWY^`hjrs22DHHJ@UV	""9hv.>?&&sA.E
E8K3H(SYJZ[eQ'4 455))#tQ7E8X6r   c                     | j                         }t        |       |dk(  rt        ||      }nt        ||      }|rt	        |      S d S rW   )rB
  r  JM_get_annot_by_nameJM_get_annot_by_xrefr   )r]   r   r   r   r   s        r   _load_annotzPage._load_annot  sF    ~~419(t4E(t4E$uU|.$.r   c           	      N    t        || j                  |||||      }t        |      S r   )JM_pixmap_from_pager   r  )r]   r   r  r  r  ra  r  r  s           r   _makePixmapzPage._makePixmap  s&    !#tyy#r5&$Oc{r   c                    t        j                  t         j                  j                        }t        j                  | j                        }|j
                  rNt        j                  |j                         |      }t        j                  |      rt        j                  |      }t        j                  |      ry t        |      S r   )rf   r(  r)  r   r   r   r   r   r.  pdf_to_rectrf  r'  )r]   boxtyper   r   r   s        r   
_other_boxzPage._other_box  s    ||U\\889**DII6??%%txxz7;C!!#&((-$$d+t$$r   c                     t        | j                  t        j                        r| j                  S t        j                  | j                        S )zi
        Returns self.this as a mupdf.PdfPage using pdf_page_from_fz_page() if
        required.
        )rs   r   rf   r   r   r\   s    r   rB
  zPage._pdf_page  s5    
 dii/99**49955r   c                 8    | j                   j                          y)z,Invalidate / delete all annots of this page.N)r  r  r\   s    r   r
  zPage._reset_annot_refs  s     r   c                 4   |dk\  r|dk\  r|y t        t        t        |d      dz              }|dk\  rd}t        t        t        |d      dz              }|dk\  rd}d||fz  }|sy t        j                  | j
                        }t        |       t        j                  |j                         t        d            }|j                  s.t        j                  |j                         t        d      d      }t        j                  |t        d            }	|	j                  s t        j                  |t        d      d      }	t        j                  |	      }
t        |
      D ]6  }t        j                  |	|      }t        j                  |      }||k(  s4|c S  t        j                   |j#                         d	      }t        j$                  |t        d
      |       t        j$                  |t        d      |       t        j&                  |	||       |S )Nr   r   r  c   zfitzca%02i%02ir   rr   r   r   r   r   )r   rP	  r  rf   r   r   r  r   r   r   r   r  r;  r  r=  r9  r  r   r  r8  )r]   gstater   r   rD  tCAtcar   r!  r#  r?  r  r  r   opas                  r   _set_opacityzPage._set_opacity  s   7rQw9#4%Bc)*+#:C%B
S()*#:C!S#J.**49954&&txxz8K3HI	##//
H[<QSTUI!!)Xk-BC**9h{6KQODt$q 	A''a0B$$R(Dv~		
   Q/Xd^R8Xd^R8D&#.r   c           
         | j                   }|t        d      |j                  st        d      d}||vrt        d      t        |      }| j                  }t        |d   |j
                  |d   z
  |d   |j
                  |d   z
        }|j                  |j                  cxk  r|j                  cxk  r|j                  k  r>n n;|j                  |j                  cxk  r|j
                  cxk  r|j
                  k  sn t        | d	      |j                  | j                  |d
t        t        |             d       y )Nr	  r  )CropBoxBleedBoxTrimBoxArtBoxzbad boxtyper   r   rr   r   z not in MediaBoxr"  r#  )r   r   r  r   r  r  r  r  r  r$  r   rv   ru   )r]   r
  r   r   valid_boxesmbs         r   _set_pageboxzPage._set_pagebox  s
   kk;>??zz[))B+%]++Dz]]DGRUUT!W_d1gruutAwG34773bee38[4778[VXV[V[8[y(89::Gq5;1G0H-JKr   c                 p    | j                         }t        |       t        |j                         ||       y r   )rB
  r  JM_set_resource_propertyr   )r]   r   r   r   s       r   r
  zPage._set_resource_property  s(    ~~4 T48r   c	                    t        |      }	t        |      }
|}t        j                  | j                        }|j                         }|j                         }t        |       t        ||||j                        }|st        j                  |      }t        j                  |d      }t        j                  |d|       t        j                  |d      }t        j                  |t        d      |       t        j                  d      }t        j                  |d       t        j                   ||	|
||      }|dkD  r t#        |t        j$                  |      |       t        j&                  |t        d            }t        j(                  |t        d            }|j*                  s t        j,                  |t        d      d      }t        j                  |||       t        j                  d      }t        j                  |d	       t        j                  ||       t        j                  |d
       t/        ||||       |S )Nr
   fullpager
     z/fullpage Dor   r   r
  z q /z Do Q )r  r  rf   r   r   r   r   r  JM_xobject_from_pager   r  r8  r  r   r  r
  pdf_new_xobjectrR  rk  r  r   r   r  r
  )r]   
fz_srcpager
  r  r   r  r  graftmapr
  rz  r6  rc_xrefr
  tpagerefr  xobj1subres1subresr   xobj2r!  r
  s                         r   _show_pdf_pagezPage._show_pdf_page  s   !$''++DII699;  %VZx}}M&&u-G $$VQ/GZ7##FA.68I#6@!!"%sN3%%fgsFCH6VU%?%?%FK 228Xk=RS	##Ix	/BC  ,,Y8KQOFFHe4
 ""2&tV,tX.tX.68T7;r   r  c                     t        |       }	 | j                  |      }|dk7  r| j                  |       	 t        |      }t	        | |       t        |d      sJ |S # |dk7  r| j                  |       w w xY w)zAdd a 'Caret' annotation.r   r   )annot_preprocessr@
  rm  r   annot_postprocessr  )r]   r  old_rotationr   s       r   add_caret_annotzPage.add_caret_annot   s~    '-	0))%0Eq !!,/u$&x((( q !!,/ !s   A A5r   c                     t        |       }	 | j                  |t        j                        }|dk7  r| j	                  |       	 t        | |       |S # |dk7  r| j	                  |       w w xY w)z*Add a 'Circle' (ellipse, oval) annotation.r   )r  rl
  rf   r   rm  r  r]   r   r  r   s       r   add_circle_annotzPage.add_circle_annot'   m    '-	0..tU5K5KLEq !!,/$& q !!,/ !    A A+r   r3   r  r{  rJ
  c                     t        |       }	 | j                  ||||||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)z"Add a 'FileAttachment' annotation.)r  r{  rJ
  r   )r  rM
  rm  r  )	r]   r  r   r3   r  r{  rJ
  r  r   s	            r   add_file_annotzPage.add_file_annot2   s     (-
	0((' ) E q !!,/$& q !!,/ !s   A	 	A"r:   r   r   ru  r   r  r   r  c
                     t        |       }
	 | j                  |||||||||		      }|
dk7  r| j                  |
       	 t        | |       |S # |
dk7  r| j                  |
       w w xY w)zAdd a 'FreeText' annotation.)r   r   ru  r   r  r   r  r   )r  rQ
  rm  r  )r]   r   r:   r   r   ru  r   r  r   r  r  r   s               r   add_freetext_annotzPage.add_freetext_annotK   s     (-	0,,%%!-))! - 
E q !!,/$& q !!,/ !s   A A%c                     |t        | |||      }nt        |      }| j                  |t        j                        }|S )zAdd a 'Highlight' annotation.rL  r  r  )get_highlight_selectionCheckMarkerArgr
  rf   PDF_ANNOT_HIGHLIGHT)r]   r
  rL  r  r  ri
  rN   s          r   add_highlight_annotzPage.add_highlight_annotl   s@     ='E4PAu%A##Au'@'@A
r   handwritingc                     t        |       }	 | j                  |      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)znAdd a 'Ink' ('handwriting') annotation.

        The argument must be a list of lists of point_likes.
        r   )r  r\
  rm  r  )r]   r/  r  r   s       r   add_ink_annotzPage.add_ink_annotv   sg    
 (-	0''4Eq !!,/$& q !!,/ !s   A Ar  r  c                     t        |       }	 | j                  ||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)zAdd a 'Line' annotation.r   )r  r_
  rm  r  )r]   r  r  r  r   s        r   add_line_annotzPage.add_line_annot   sg    '-	0((R0Eq !!,/$& q !!,/ !   A Ar  c                     t        |       }	 | j                  |t        j                        }|dk7  r| j	                  |       	 t        | |       |S # |dk7  r| j	                  |       w w xY w)zAdd a 'Polygon' annotation.r   )r  rc
  rf   r   rm  r  r]   r  r  r   s       r   add_polygon_annotzPage.add_polygon_annot   sm    '-	0''0G0GHEq !!,/$& q !!,/ !r$  c                     t        |       }	 | j                  |t        j                        }|dk7  r| j	                  |       	 t        | |       |S # |dk7  r| j	                  |       w w xY w)zAdd a 'PolyLine' annotation.r   )r  rc
  rf   r   rm  r  r6  s       r   add_polyline_annotzPage.add_polyline_annot   sm    '-	0''0I0IJEq !!,/$& q !!,/ !r$  c                     t        |       }	 | j                  |t        j                        }|dk7  r| j	                  |       	 t        | |       |S # |dk7  r| j	                  |       w w xY w)z&Add a 'Square' (rectangle) annotation.r   )r  rl
  rf   r   rm  r  r!  s       r   add_rect_annotzPage.add_rect_annot   r#  r$  r   rv  c	                 B   d}	|rt        |       t        |       |sd}|sd}|sd}t        |d      r|||f}t        |      dkD  r|dd }d}
 |
j                  |||d}	|d	}|r$t        |d      r|||f}t        |      dkD  r|dd }t	        |       }	 | j                  |||	||
      }|dk7  r| j                  |       	 t        | |       |r|j                         j                         dd }|\  }}}}}|j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  d       dj                  |      }|j                  |d       |S # |dk7  r| j                  |       w w xY w)zAdd a 'Redact' annotation.Nr	  r  r	  r   r   r  r  r   r   r   )r:   r  r   r   r   rY  r  r  )r&  r  r'  r  r  rj
  rm  r  r   r  r6   r  r   )r]   r  r:   r   r   r   r   r   rv  r  ro   r  r   r  r  r  r  r  r  r   s                       r   add_redact_annotzPage.add_redact_annot   s    tz"!&
z;/(*jA
:"'^
5CSZZx8DF| 4- $-Dt9q=8D'-	0**4d6" + /E q !!,/$& \\^..0"5F &Ar2r2MM"MM"MM"MM"MM"MM$F#BLLQ# q !!,/ !s   F Fc                 |    |t        | |||      }nt        |      }| j                  |t        j                        S )zAdd a 'Squiggly' annotation.r*  )r+  r,  r
  rf   PDF_ANNOT_SQUIGGLYr]   r
  rL  r  r  ri
  s         r   add_squiggly_annotzPage.add_squiggly_annot   s<     ='E4PAu%A$$Q(@(@AAr   r}
  c                     t        |       }	 | j                  ||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)z$Add a ('rubber') 'Stamp' annotation.r   )r  r
  rm  r  )r]   r   r}
  r  r   s        r   add_stamp_annotzPage.add_stamp_annot   sg    '-	0))$6Eq !!,/$& q !!,/ !r4  c                 |    |t        | |||      }nt        |      }| j                  |t        j                        S )zAdd a 'StrikeOut' annotation.r*  )r+  r,  r
  rf   PDF_ANNOT_STRIKE_OUTrA  s         r   add_strikeout_annotzPage.add_strikeout_annot!  s:    ='E4PAu%A$$Q(B(BCCr   c                     t        |       }	 | j                  |||      }|dk7  r| j                  |       	 t        | |       |S # |dk7  r| j                  |       w w xY w)z&Add a 'Text' (sticky note) annotation.)rJ
  r   )r  r
  rm  r  )r]   r  r:   rJ
  r  r   s         r   add_text_annotzPage.add_text_annot!  sl    '-	0((4(@Eq !!,/$& q !!,/ !s   A Ac                 |    |t        | |||      }nt        |      }| j                  |t        j                        S )zAdd a 'Underline' annotation.r*  )r+  r,  r
  rf   PDF_ANNOT_UNDERLINErA  s         r   add_underline_annotzPage.add_underline_annot!  s:    ='E4PAu%A$$Q(A(ABBr   r  c                    t        |        | j                  }|j                  st        d      |j	                          | j                  |j                  |j                        }|syd|_        t        j                  |       |_        || j                  t        |      <   |j                  |_        ||_        |j                          |S )zAdd a 'Widget' (form field).r  NT)r&  r   r  r   r	  r
  r	  r	  r   r  r  r  r  r	  r  )r]   r  r   r   s       r   
add_widgetzPage.add_widget !  s    Dkkzz[)) 1 163D3DE}}T*&+E#r   c                 l    	 t        |        | j                         }|j                  sg S t        |      S )z.
        page get list of annot names
        )r&  rB
  r   JM_get_annot_id_listr]   r   s     r   annot_nameszPage.annot_names2!  s2     	>D~~I#D))r   c                     t        |       S )zH
        List of xref numbers of annotations, fields and links.
        )JM_get_annot_xref_list2r\   s    r   r)	  zPage.annot_xrefs=!  s     't,,r   c              #     K   t         j                  t         j                  t         j                  f}t	        |d      s)| j                         D cg c]  }|d   |vs|d    }}n0| j                         D cg c]  }|d   |v s|d   |vs|d    }}|D ]  }| j                  |      }d|_        |   yc c}w c c}w w)a   Generator over the annotations of a page.

        Args:
            types: (list) annotation types to subselect from. If none,
                   all annotations are returned. E.g. types=[PDF_ANNOT_LINE]
                   will only yield line annotations.
        r  r   r   TN)rf   r*	  PDF_ANNOT_POPUPr  r  r)	  
load_annot_yielded)r]   types
skip_typesr   r)	  r   r   s          r   ra  zPage.annotsC!  s      **E,A,A5CYCYZ
um,)-)9)9);VAqt:?U1Q4VKV)-)9)9);hAqtu}QRSTQU]gQg1Q4hKh 	DOOD)EENK	 Whs0   ACB;B;$C9C C C 0Cc                     | j                  d      }|| j                  S | j                  }t        |d   |j                  |d   z
  |d   |j                  |d   z
        S )z
The ArtBoxr  r   r   rr   r   r
  rz  r  r   r  r]   r   r	  s      r   artboxzPage.artboxU!  s[     x(<<<]]DGRUUT!W_d1gruutAwGGr   c                     | j                  d      }|| j                  S | j                  }t        |d   |j                  |d   z
  |d   |j                  |d   z
        S )zThe BleedBoxr  r   r   rr   r   r\  r]  s      r   bleedboxzPage.bleedbox^!  s[     z*<<<]]DGRUUT!W_d1gruutAwGGr   c                    t        |        t        | j                        }t        j                  |      }t        |      }|j                  r| j                  j                  rv| j                  }|j                  |j                  }}| j                  dvr||}}t        dd||      }t        j                  d      j                         d   }t!        |       |S )zGet page rectangle.)r      r   F)r
  rY  )r&  r   r   rf   r
  r   r	  r   r  rz  r  r  r  r   mupdf_warningsr  rB   )r]   r   r   cbr   r  r  s          r   boundz
Page.boundg!  s    D499%!!$'3i??t{{11B88RYYqA}}H,!1q!Q"C&&U&3>>@DCCL
r   c                     |s| j                   s| j                          t        j                  | j                        }|j
                  sy t        d|      }t        j                  |j                         ||       y )Nr   )rK  rN  )	
is_wrappedwrap_contentsrf   r   r   r   rP  pdf_filter_page_contentsr   )r]   rN  r   rR  s       r   rS  zPage.clean_contentsy!  sY     **DII6(XF&&
D'Br   c                     t        |        | j                         }|j                  s t        j                  | j
                        }nt        |j                               }t        |      }|S )zThe CropBox.)	r&  rB
  r   rf   r
  r   ry  r   r   )r]   r   r   s      r   rz  zPage.cropbox!  sQ     	D~~%%dii0CTXXZ(C3i
r   c                 .    | j                   j                  S r   )rz  r  r\   s    r   cropbox_positionzPage.cropbox_position!  s    ||r   c                    t        |        t        |       | j                         }	 t        |j                        }|sn!t	        j
                  ||j                         9t	        j                  |j                        }t	        j
                  ||j                         t        |      }|rCd|_        t        j                  |       |_        ||j                  j                  t        |      <   |j                          |S )z!Delete annot and return next one.T)r&  rB
  r[  r   rf   r\  r  r   r   r  r  r   r  r  r   )r]   r   r   r`  	nextannotr   s         r   delete_annotzPage.delete_annot!  s    DE~~)%**5I""48  ((4	tUZZ0ICK t,CJ.1CJJ""2c7+
r   c                 *    t                t        t              sy fd}t        j                   j
                        }|j                  s |       S t           }|dk  r |       S t        j                  |j                         t        d            }|j                  s |       S t        j                  |      }|dk(  r |       S d}t        |      D ]2  }t        j                  t        j                  ||            }||k(  s2 n ||k7  r |       S t        j                  |       t        j                   |j#                         |       t        j$                  |j                         t        d      |       t'        |        |       S )zDelete a Link.Nc                      d   dk(  ry 	 d   } j                   |    }|j                          y # t        $ r t        dkD  r
t	                Y y w xY w)Nr   r   r  r   )r  r   r   r   rF   )linkidlinkobjlinkdictr]   s     r   finishedz"Page.delete_link.<locals>.finished!  sY    1$f!$**62  '!+0@s   $1 AAr   rX  r   )r&  rs   r   rf   r   r   r   r   r   r   r   r]  r  r   r^  r_  r  r   r  r,  )	r]   rt  ru  r   r   ra  r=  oxrefr  s	   ``       r   delete_linkzPage.delete_link!  sK   D8T*		 **DII6:%!8:##TXXZ(1CD  :""F+19: 	A$$e&9&961&EFEu}	
 5=:*T2DHHJ(:FC$zr   c                 *   t         r(t        t        j                  | j                              S | j                         }|j                  s6t        t        j                  t        j                  j                              S t        t        |            S )zReflects page de-rotation.)r   r5  r   Page_derotate_matrixr   rB
  r   rf   r(  UNITr  )r]   rb  s     r   r,  zPage.derotation_matrix!  se     %44dii@AA.."!!%,,u||'8'89::-g677r   c                 b   | j                   }|j                   }t        |t        j                        sJ t        j                         }||_        t        |      }t        j                  ||      }t        j                  |||t        j                                t        j                  |       y r   )r   rs   rf   r  r  r  r  r  r
  r  r
  )	r]   r
  r  r  r   r  r  r  r
  s	            r   extend_textpagezPage.extend_textpage!  s    yyZZ2u00111&&('nnR)4c5>>+;<s#r   c                    t        |        | j                         }|syt        j                  |      }|j                  syt        |      }d|_        t        j                  |       |_	        || j                  t        |      <   |S )zFirst annotation.NT)r&  rB
  rf   pdf_first_annotr   r   r   r  r  r   r  r  )r]   r   r   r   s       r   first_annotzPage.first_annot!  ss     	D~~%%d+El]]4(
$'C!
r   c                 "    | j                         S )z$
        First link on page
        )
load_linksr\   s    r   
first_linkzPage.first_link!  s    
   r   c                 V   t        |        d}| j                         }|syt        j                  |      }|j                  syt        |      }d|_        t        j                  |       |_	        || j                  t        |      <   t               }t        j                  ||       |}|S )zFirst widget/field.r   NT)r&  rB
  rf   pdf_first_widgetr   r   r   r  r  r   r  r  r  r   r  )r]   r   r   r   r  s        r   first_widgetzPage.first_widget"  s     	D~~&&t,El]]4(
$'C!3'
r   c                 n   t        |        | j                  }|dk7  r| j                  d       | j                  }g }|rdnd}t	        ||      }t        j                  ||t        j                         t        j                                t        j                  |       |dk7  r| j                  |       |S )Nr   TF)
r&  r  rm  r   JM_new_bbox_devicerf   r
  r2  r  r
  )r]   layersr  r   rh   
inc_layersr
  s          r   get_bboxlogzPage.get_bboxlog"  s    D}}1a yy#T
 "j14enn&68HIs#1l+	r   c                 F   t        |        | j                  }|dk7  r| j                  d       | j                  }t	        |t
        j                        rt        j                  |      }t	        |t
        j                        sJ d| j                         |rdnd}t        j                  |      }t        rt        j                  ||||      }nt               }t        |      s|t        |||      }	nt        |||      }	t        j                  ddddd|j                         |	_        t        j$                  ||	t        j                         t        j&                                t        j(                  |	       |dk7  r| j                  |       t        |      s|y|S )z3Extract vector graphics ("line art") from the page.r   z
self.this=TFNr   rY  )r&  r  rm  r   rs   rf   r   r   r
  r   r   get_cdrawingsrt   callableJM_new_lineart_device_Devicer2  r  ptmr
  r  r
  )
r]   extendedcallbackmethodr  r   clipsprectrh   r
  s
             r   r  zPage.get_cdrawings&"  sL   D}}1a yydEMM*<<%D$->*$))>- e##D)$$T8XvFBB!V%728UFK22ufEnnQ1b!UXX>CGdC)95>>;KL!!#&1l+H!3	r   c                    t        |        g }t        j                  | j                        }|j	                         }t        j
                  |t        j                        }t        j                  |      rct        j                  |      }t        |      D ]>  }t        j                  ||      }t        j                  |      }|j                  |       @ |S |j                  r&t        j                  |      }|j                  |       |S )zGet xrefs of /Contents objects.)r&  rf   r   r   r   r   r
  r.  r]  r  r^  r   r6   r   )	r]   rN   r   r   r  r?  r  icontr   s	            r   get_contentszPage.get_contentsE"  s    D**4995hhj%%c5+G+GHh'##H-A1X !++Ha8''.

4 ! 
   ##H-DJJ
r   c                     t        |        |r*t        j                  | j                        }t        |      S t        j                  | j                        }t        |      S )z|
        Make a DisplayList from the page for Pixmap generation.

        Include (default) or exclude annotations.
        )r&  rf   fz_new_display_list_from_pager   &fz_new_display_list_from_page_contentsr  )r]   ra  r  s      r   get_displaylistzPage.get_displaylistW"  sO     	D44TYY?B 2 ==diiHB2r   r  c                 h   d}| j                  |      }t        t        |            D ]   }||   }|d   j                  d      st	        |d         |d<   nt	        |d         |d<   |d   dk7  r|d   }g }|D ]  }|d	   }	|d
d }
|	dk(  r#dt	        |
d	         j                         |
d
   f}n<|	dk(  rdt        |
d	         f}n&t        |	g|
D cg c]  }t        |       c}z         }|j                  |        ||d<   |d   dv r|D ]  }|j                  |      ||<    ||<    |S c c}w )a<  Retrieve vector graphics. The extended version includes clips.

        Note:
        For greater comfort, this method converts point-likes, rect-likes, quad-likes
        of the C version to respective Point / Rect / Quad objects.
        It also adds default items that are missing in original path types.
        )
	closePathr   r  r  lineCaplineJoinr  stroke_opacityfill_opacityeven_odd)r  r   r  r   scissorr	  rn  r   r   Nr  qur  )r  r  r'  r   r   	normalizeQuadru   r  r6   r   object)r]   r  allkeysr   r  npathrn  newitemsr  cmdrestrr  DrawpathDrawpathlistget_linearts                  r   get_drawingszPage.get_drawingsd"  so      ( 3s3x 	AFE=++F3 $U6] 3f#'i(8#9i V}g%g! 	*Dq'C8Dt $d47m&=&=&?aI $d47m4$cU-E1eAh-E%EFOOD)	* "*gV}
*  ,A$yy|E!H, CF1	2 
 .Fs   D/c           	      X   | j                   }|dk(  rt        S | j                  }|dk(  rBt        dddd|j                  |j
                  z
  |j                  z
  |j                  z
  d      }nq|dk(  rBt        ddddd|j
                  |j                  z
  |j                  z
  |j                  z
        }n*t        ddddd|j                  z  d|j                  z        }|| j                  z  }t        t        |            dz   }|j                  d      }t        j                  | |d      }|d	v r4|\  }}}	}
||_        ||_        |
|_        |	|_        | j                  |       | j                  d       | }| j!                         D ]"  }|j"                  |z  }|j%                  |       $ | j'                         D ]1  }|d
   |z  }| j)                  |       ||d
<   | j+                  |       3 | j-                         D ](  }|j"                  |z  }||_        |j/                          * |S )z;Set page rotation to 0 while maintaining visual appearance.r   rl  r   r  r  z cm utf8Fr  from)r  Identityr  r5  r  r  r  r  r,  rv   ru   r{  r   _insert_contentsset_mediaboxrm  ra  r   ri  	get_linksrw  insert_linkr  r  )r]   r  r	  mat0r6  r  r  r  r  r  r  r   r   linkr  s                  r   remove_rotationzPage.remove_rotation"#  s   mm!8 ]]"9!Q1beebeembee&;bee&CQGDCZ!Q1a)>)FGD!Q1b255j"ruu*=D T+++c
#f,jj ""4e4 )NBBBEBEBEBEb!!d[[] 	E

S ANN1	 NN$ 	#DVs"AT"DLT"		#
 lln 	Fc!AFKMMO	 
r   x_tolerancey_tolerancec                    t        |        | j                  }|t        |      }|||| j                         }fd}|D cg c]u  }	 |d   j                  |j                  k\  rV|d   j
                  |j
                  k  r:|d   j                  |j                  k\  r|d   j                  |j                  k  r|w }}t        |D cg c]  }|d   	 c}d       }	g }
|	r|	d   }d}|rYd}t        t        |	      dz
  dd	      D ]8  } ||	|   |      s||	|   j                  z  }||	|   j                  z  }|	|= d}: |rY|
j                  |       |	d= t        t        |	      d
       }	|	rt        t        |
      d       }
|
D cg c]$  }|j                  kD  s|j                   kD  s#|& c}S c c}w c c}w c c}w )a  Join rectangles of neighboring vector graphic items.

        Args:
            clip: optional rect-like to restrict the page area to consider.
            drawings: (optional) output of a previous "get_drawings()".
            x_tolerance: horizontal neighborhood threshold.
            y_tolerance: vertical neighborhood threshold.

        Notes:
            Vector graphics (also called line-art or drawings) usually consist
            of independent items like rectangles, lines or curves to jointly
            form table grid lines or bar, line, pie charts and similar.
            This method identifies rectangles wrapping these disparate items.

        Returns:
            A list of Rect items, each wrapping line-art items that are close
            enough to be considered forming a common vector graphic.
            Only "significant" rectangles will be returned, i.e. having both,
            width and height larger than the tolerance values.
        c                    | j                   | j                  kD  r| j                  | j                   fn| j                   | j                  f\  }}| j                  | j                  kD  r| j                  | j                  fn| j                  | j                  f\  }}|j                   |j                  kD  r|j                  |j                   fn|j                   |j                  f\  }}|j                  |j                  kD  r|j                  |j                  fn|j                  |j                  f\  }}		 ||
z
  k  s||
z   kD  s||z
  k  s||	z   kD  ryy)zDetect whether r1, r2 are "neighbors".

            Items r1, r2 are called neighbors if the minimum distance between
            their points is less-equal delta.

            Both parameters must be (potentially invalid) rectangles.
            FTr  r  r  r  )r1r2rr1_x0rr1_x1rr1_y0rr1_y1rr2_x0rr2_x1rr2_y0rr2_y1delta_xdelta_ys             r   are_neighborsz,Page.cluster_drawings.<locals>.are_neighborss#  s
    02uuruu}beeRUU^255"%%.NFF/1uuruu}beeRUU^255"%%.NFF/1uuruu}beeRUU^255"%%.NFF/1uuruu}beeRUU^255"%%.NFFFW,,FW,,FW,,FW,,  r   r   r   c                 2    | j                   | j                  fS r   r  r  r   s    r   ri  z'Page.cluster_drawings.<locals>.<lambda>#  s    144, r   r  r   TFrY  c                 2    | j                   | j                  fS r   r  r  s    r   ri  z'Page.cluster_drawings.<locals>.<lambda>#  s    add| r   c                 2    | j                   | j                  fS r   r  r  s    r   ri  z'Page.cluster_drawings.<locals>.<lambda>#  s    !$$ r   )r&  r   r   r  r  r  r  r  r  r  r'  r  r  r6   r!  r  r  )r]   r  drawingsr  r  parear  rd  pathsprects	new_rectsr   repeatr  r  r  s                 @@r   cluster_drawingszPage.cluster_drawingsS#  s   . 	D		JE((*H	: 
&	(&	(&	(&	( 
 
 E2q628NO	
 
AFs6{Q26 &A$VAY2VAY\\)VAY\\)"1I!%&  Qq	CK-CDF   3y>/EF	$Qa'(9ahh>PQQG
 30 Rs   A:F>GG'G7Gc                 f    t        |        | j                  j                  | j                  |      S )z)List of fonts defined in the page object.r  )r&  r   r  r  r]   r  s     r   	get_fontszPage.get_fonts#  s(    D{{))$++D)AAr   c           	      h   t        |        | j                  }|j                  s|j                  rt	        d      t        dddd      }t               }|r||f}n|}t        |      t        t        fv r"t        |d         t        urt	        d      |}nd|j                  | j                  d      D cg c]  }||d   k(  s| }	}t        |	      dk(  r|	d   }n|	g k(  rt	        d      t	        d	|z        |d   }
|
dk7  s|du r	 | j                  ||
      d   S | j#                         }t%        |      }t'        |      s|S |D ]  }|d   |d   k7  rt)        |d         }|j*                  }|dk(  r|} |}|S t        t-        |j.                  |j0                              }t3        |j.                  |j4                  z
        }t3        |j6                  |j4                  z
        }t        d|z  ddd|z  dd      }||z   }||f} |}|S  |}|S c c}w # t        $ r t!                |cY S w xY w)zGet rectangle occupied by image 'name'.

        'name' is either an item of the image list, or the referencing
        name string - elem[7] of the resp. item.
        Option 'transform' also returns the image transformation matrix.
        r   r   rY  z!need item of full page image listTr  r   zbad image namez!found multiple images named '%s'.)r+
  )r&  r   r   r  r   r   r5  r   rt   ru   r   r  r  r'  get_image_rectsr   rF   rB
  JM_image_reporterr  r  r   util_hor_matrixlllrr  rw  ur)r]   r   r+
  r   inf_rectnull_matrh   r  r  imglistr   r=
  r   rM   ri
  r   hmr  r   m0rA  s                        r   get_image_bboxzPage.get_image_bbox#  sU    	Dkk==C,,;<<1b"%8H%BB:$&R>S( !DEED"%"5"5dkk4"HYQDTUVWTXLqYGY7|q qzB !122 !Dt!KLLBx19	T) ++DI+FqII >>#)CyI 	AttBxQqT
A66DA~ 
 add34BADD144K AADD144K AAq!QUAq1Br'
AB
%	  
M Z     s   3HHH H10H1c                 f    t        |        | j                  j                  | j                  |      S )z*List of images defined in the page object.r  )r&  r   r  r  r  s     r   
get_imageszPage.get_images#  s(    D{{**4;;T*BBr   c                     g }| j                         D ]E  \  }}| j                  j                  |d      }d|v rd}nd|v rd}n2|j                  |||f       G |S )zGet OCGs and OCMDs used in the page's contents.

        Returns:
            List of items (name, xref, type), where type is one of "ocg" / "ocmd",
            and name is the property name.
        Tr  r
  r  r
  ocmd)r
  r   r  r6   )r]   rh   pnamer   r:   octypes         r   get_oc_itemszPage.get_oc_items#  su     88: 	-KE4;;**4D*ADd"%IIudF+,	- 	r   c                    t        |        t        j                  | j                        }t	        |      }|}|dk(  rt        j
                  nt        j                  }t        j                  ||      }t        j                  d      }t        j                  |      }t        j                  ||j                  |j                  z
  |j                  |j                  z
  |d      }	t        j                  | j                  |	|t        j                                 t        j"                  |	       |j%                          t'        |      }
|
S )zMake SVG image from page.r      )r&  rf   r
  r   r  FZ_SVG_TEXT_AS_PATHFZ_SVG_TEXT_AS_TEXTr`  r  r  fz_new_svg_devicer  r  r  r  r
  r  r
  r  rY  )r]   r  text_as_pathr  r  tboundstext_optionr   r  r
  r:   s              r   get_svg_imagezPage.get_svg_image$  s    D&&tyy1'3?13De//%JcJc))'37!!$'nnS!%%

7::%

7::% 	$))S#u~~/?@c"%c*r   r   c                     |}|| j                         }nt        |d      | k7  rt        d      |j                  |      }|~|S )Nr   znot a textpage of this page)r  r   r   extractTextbox)r   r   textpager  rh   s        r   get_textboxzPage.get_textbox($  sU    
 :""$BR"d*:;;t$	r   r  r  r  c                 V   t        |        |t        dd      }| j                  }|dk7  r| j                  d       	 | j	                  |||      }|dk7  r| j                  |       	 t        |      }t        j                  |       |_        |S # |dk7  r| j                  |       w w xY w)Nr   r   )r  r  )	r&  r5  r  rm  r
  r  r  r  r   )r]   r  r  r  r  r  s         r   r  zPage.get_textpage7$  s    D>Aq\F}}1a 	0))$eF)KHq !!,/H%!---	 q !!,/ !s   B B(c                    t        |        | j                  }|dk7  r| j                  d       | j                  }g }t        rt        j                  |      }nt        |      }t        j                  |      }t        j                  ddddd|j                        |_        t        j                  ||t        j                         t        j                                t        j                  |       |dk7  r| j                  |       |S Nr   r   rY  )r&  r  rm  r   r   r   JM_new_texttrace_devicerf   r
  r2  r  r  r
  r  r
  )r]   r  r   rh   r
  r  s         r   get_texttracezPage.get_texttraceG$  s    D}}1a yy//3C)"-C##D)..Aq"a:$U^^%5u~~7GHc"1l+	r   c                 b    t        |        | j                  j                  | j                        S )z,List of xobjects defined in the page object.)r&  r   r  r  r\   s    r   get_xobjectszPage.get_xobjects\$  s#    D{{,,T[[99r   c                 $   | j                   }|t        d      d}|j                  d      r|dd  }t        j	                  |      }	|	t               k7  rt        d|	       t        | |      }
|
&|
d   }t        ||      r|S |j                  |       |S t        j                  |j                         d       }d}d}g d}g d}	 |j                  |      }d}|dk  r	 |j                  |      }d}|j                         t         j#                         v rdd l}|j'                  |      }~|Pt)        |      t*        u r|}n>t-        |d	      rt+        |      }n&t-        |d
      r|j.                  }nt        d      d }| j1                  ||||||||||
      }|s|S |d   }|d   }t        ||      r|S |j                  ||       |S # t        $ r t        dkD  r
t                Y w xY w# t        $ r t        dkD  r
t                Y w xY w)Nr	  r   rW  r   zbad fontname chars rY  )r  r  r  r  )r  china-ssjapan-skorea-sr  r   zbad fontfile)fontdict)r   r   r   r[  r\  r!  	CheckFontCheckFontInfoget_char_widthsr  r   r  r*  r   r   rF   r  r  r  r  r   r   r  r   r
  )r]   r   r  r  r
  r  r  r   r"  	inv_charsr)  r   rU  r  
CJK_number
CJK_list_n
CJK_list_sr  fontfile_strr   r  s                        r   insert_fontzPage.insert_fonta$  s>   kk;>??s#|H&33H=	29+>??x(7DS$'%K !$$X^^%5t<
=
C
	#))(3JE >'--h7
 >>388:: &--h7J H~$':."8}6*'}} 00Lxz:WZ$eXzC J1vq6d#K 	D84[  	#a'N,<	  '!+0@s$   G  G/ G,+G,/HHc                 (    | j                         dk(  S )z3Check if /Contents is in a balanced graphics state.r  )r
  r\   s    r   rg  zPage.is_wrapped$  s     $$&&00r   c                     t        j                  | j                        }|j                  syt        j                  |j                         t        d            }|j                  syt        j                  |      S )zPage language.NLang)rf   r   r   r   r  r   r   pdf_to_str_buf)r]   rb  r  s      r   r  zPage.language$  s\     --dii8!!--gkkmXf=MN##D))r   c              #   V   K   | j                         }|D ]  }||d   |v s|  yw)z Generator over the links of a page.

        Args:
            kinds: (list) link kinds to subselect from. If none,
                   all links are returned. E.g. kinds=[LINK_URI]
                   will only yield URI links.
        Nr	  )r  )r]   kinds	all_linksr  s       r   r  z
Page.links$  s8      NN$	 	D}V 5	s   ))identc                 (   t        |        t        |      t        u rd}|}n!t        |      t        u r|}d}nt	        d      | j                  ||      }|s|S d|_        t        j                  |       |_	        || j                  t        |      <   |S )zLoad an annot by name (/NM key) or xref.

        Args:
            ident: identifier, either name (str) or xref (int).
        r   Nz&identifier must be a string or integerT)r&  r   r   r   r   r
  r   r  r  r   r  r  )r]   r  r   r   r   s        r   rW  zPage.load_annot$  s     	D;#DD%[CDDEFFtT*J]]4(
$'C!
r   c                    t        |        t        j                  | j                        }|j                  syt        |      }d|_        t        j                  |       |_	        || j                  t        |      <   d|_        d|_        | j                  j                  rS| j                         }|D cg c]  }|d   t        j                  k(  s| }}|r|d   }|d   |_        |d   |_        |S d|_        d|_        |S c c}w )zGet first Link.NTr   r(   r   rr   )r&  rf   fz_load_linksr   r   r	  r   r  r  r   r  r  r   r  r)	  r*	  )r]   r   r  r  link_ids        r   r  zPage.load_links$  s    D!!499-~~Cj]]4(
$'C!;;$$&E %F111E1E)EQFEF("1:  
 CHCF
 Gs   4DDc                 J   t        |        t        j                  | j                        }t	        |       t        ||      }|}|s|S d|_        t        j                  |       |_	        || j                  t        |      <   t               }t        j                  ||       |}|S )zLoad a widget by its xref.T)r&  rf   r   r   r  JM_get_widget_by_xrefr   r  r  r   r  r  r  r   r  )r]   r   r   r   r   r  s         r   load_widgetzPage.load_widget%  s    D**DII64%tT2J]]4(
$'C!3'
r   c                     t        |        | j                         }|j                  s*t        j                  | j
                        }t        |      S t        |j                               }t        |      S )zThe MediaBox.)	r&  rB
  r   rf   r
  r   JM_mediaboxr   r   )r]   r   r   s      r   r  zPage.mediabox%  s[     	D~~&&		2D Dz 
+DDzr   c                 j    t        | j                  j                  | j                  j                        S r   )r  r  r  r  r\   s    r   mediabox_sizezPage.mediabox_size!%  s#    T]]%%t}}'7'788r   c                 ,    t         j                  |       S )z7All /Contents streams concatenated to one bytes object.)r   _get_all_contentsr\   s    r   read_contentszPage.read_contents,%  s    &&t,,r   c                 b    t        |        | j                  }|j                  |       }|| _        y)z-Refresh page after link/annot/widget updates.N)r&  r   r  r   )r]   r   r   s      r   refreshzPage.refresh0%  s(    Dkkt$	r   c                     t        |        t        | j                  t        j                        r| j                  nt        j
                  | j                        }|j                  syt        |      S )zPage rotation.r   )r&  rs   r   rf   r   r   r   JM_page_rotationrQ  s     r   r  zPage.rotation8%  sO     	D&tyy%--@tyyeFaFabfbkbkFl%%r   c                 >    t        t        j                  |             S )zReflects page rotation.)r5  r   _rotate_matrixr\   s    r   r  zPage.rotation_matrixA%  s     e**4011r   c                     t        |        t        j                  | j                  |j                  t        |      t        j                                y)z=Run page through a device.
        dw: DeviceWrapper
        N)r&  rf   r
  r   r  r  r  )r]   r  rA  s      r   r  zPage.runF%  s5     	D$))RYY0A!0DennFVWr   c                 &    | j                  d|      S )zSet the ArtBox.r  r
  r]   r   s     r   
set_artboxzPage.set_artboxM%  s      400r   c                 &    | j                  d|      S )zSet the BleedBox.r  r4  r5  s     r   set_bleedboxzPage.set_bleedboxQ%  s      T22r   c                 T   t        |        | j                  }|j                  rt        d      |j                  st        d      |t        d|j                               vrt        d      |j                  |      st        d      |j                  | j                  dd|z         y)	z-Set object at 'xref' as the page's /Contents.r   r  r   r+  zxref is no streamr  rA  N)
r&  r   r   r   r  r  rW  rS  r$  r   )r]   r   r   s      r   set_contentszPage.set_contentsU%  s    Dkk==.//zz[))uQ 122Z((!!$'011J4@r   c                 &    | j                  d|      S )z,Set the CropBox. Will also change Page.rect.r  r4  r5  s     r   set_cropboxzPage.set_cropboxc%        D11r   c                    t        |        t        j                  | j                        }t	        |       |s.t        j
                  |j                         t        d             yt        j                  |      }t        t        d      sJ t        j                  |j                  t        d      t        j                  |             y)zSet PDF page default language.r  r  N)r&  rf   r   r   r  r   r   r   rG  r  r7  r  )r]   r  rb  r  s       r   rI  zPage.set_languageg%  s    D--dii87w{{}hv.>?55h?D5"ABBB**KKV$77=r   c                    t        |        | j                         }t        |       t        |      }t	        j
                  |      st	        j                  |      rt        t              t	        j                  |j                         t        d      |       t	        j                  |j                         t        d             t	        j                  |j                         t        d             t	        j                  |j                         t        d             t	        j                  |j                         t        d             y)zSet the MediaBox.MediaBoxr  r  r  r  N)r&  rB
  r  r  rf   re  rf  r   rg  r   r   r   r   )r]   r   r   r  s       r   r  zPage.set_mediaboxw%  s    D~~4"4(""8,,,X6l++Xj-A8LDHHJ(;<DHHJ(:;DHHJ(<=DHHJ(;<r   c                     t        |        t        j                  | j                        }t	        |       t        |      }t        j                  |j                         t        d      |       y)zSet page rotation.r   N)	r&  rf   r   r   r  JM_norm_rotationr  r   r   )r]   r  r   r  s       r   rm  zPage.set_rotation%  sM    D**DII64x(
HX,>Dr   c                 &    | j                  d|      S )zSet the TrimBox.r  r4  r5  s     r   set_trimboxzPage.set_trimbox%  r=  r   c                    t        |        t        j                         }| j                         }|j                  st        |      S t        j                  t        j                  j                        }t        j                  |||       t        |      }| j                  dz  dk(  rt        |      }|S t        ddddd| j                  j                        }|S )zPage transformation matrix.rk  r   r   rY  )r&  rf   r2  rB
  r   r1  r(  r  r  r  r5  rz  r  )r]   r  r   r  r   s        r   r+  zPage.transformation_matrix%  s     	Dnn~~$S))<< 7 78  x5$==3!#+C 
 Aq"a)<)<=C
r   c                     | j                  d      }|| j                  S | j                  }t        |d   |j                  |d   z
  |d   |j                  |d   z
        S )zThe TrimBoxr  r   r   rr   r   r\  r]  s      r   trimboxzPage.trimbox%  s[     y)<<<]]DGRUUT!W_d1gruutAwGGr   c              #      K   | j                         D cg c]  }|d   t        j                  k(  s|d     }}|D ](  }| j                  |      }||j                  |v s%| * yc c}w w)a    Generator over the widgets of a page.

        Args:
            types: (list) field types to subselect from. If none,
                    all fields are returned. E.g. types=[PDF_WIDGET_TYPE_TEXT]
                    will only yield text fields.
        r   r   N)r)	  rf   r  r$  r	  )r]   rY  r   widget_xrefsr   r  s         r   r  zPage.widgets%  su      '+&6&6&8[AaDEDZDZ<Z![[  	D%%d+F} 1 1U :	 \s   A-A(A((A-!A-c                     | j                         \  }}|dkD  rd|z  }t        j                  | |d       |dkD  r d|z  dz   }t        j                  | |d       yy)z,Ensure page is in a balanced graphics state.r   r  Fs   
Qr  TN)r
  r   r  )r]   pushpopprependr6   s        r   rh  zPage.wrap_contents%  sb    ))+	c!8tmG""4%87c\E)F""46 r   c                 b    t        |        | j                  j                  | j                        S r=  r>  r\   s    r   r   z	Page.xref%  r?  r   zpage rectangle)r   r  )r  NNNNr   r   rm  r  r   )Nr   N)NNNNNr   r   r   r   r   r   r   rY  NN)r   r   N)Nr   r   N)r   Nr   r   NNNr   )NNr  r   NNT)Noter  r   Nro  )NNr   r   r!  )helvNNFr   r   )r`   ra   rb   r^   r   r   r@
  rM
  rQ
  r\
  r_
  rc
  rj
  rl
  r
  r
  r
  r
  r
  r
  r   r
  r{  r  r
  r
  r
  r
  r
  r
  r
  r
  rB
  r
  r  r
  r
  r  r~   r   r  r   r"  rp  rr  r   r&  r%  r  r   r(  r.  rt   r1  r3  r7  r9  r;  r  r>  rB  rD  rG  rI  rL  r  rN  rR  r)	  ra  r  r^  r`  re  rS  rz  rl  ro  rw  r5  r,  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  rg  r  r  rq  rW  r  r$  r  r(  r+  r-  r  r  r  r6  r8  r:  r<  rI  r  rm  rD  r+  rG  r  rh  r   r   r    r   r   r   r     sF    2"2> <|B
:
(T!DF	
F0 6 .4 GKJK59]"~(/	%6! DL*9
5nZ E 	Y 	5 	   $ && 	
    :  ""& $ $  	
  !     B 59*.38 % 	 	 	 		 	 		 	% 		9 	 	 " $!: : 	:
 : : : : : :| B B	I 	c 	 	DSX D	J 	c 	 	QV 	CSX C E $	*-$ H H H H$C 
 
  .*X 86 8 8	$   ! !  & >$|T |D ||/d VW^R5:^RMR^R	^R@B
>@C
d &6  	 # S]  *:
 FJ78Qf 1 1 * *S#X 6 5 .6&   9 9- & & 2 2 2X13A2 = E2  $ H H"7 2 2
 E/0Dr   r   c                      e Zd Zd Zd Zd Zd Zd Zed        Z	d/dZ
d0d	Zd1d
Zed        Zd Zed        Zd Zed        Zd1dZed        Zed        Zed        Zed        Zd2dZd3dZd Zd Zd Zedefd       Zed        Zed        Zd4dZ d5dZ!d6d Z"d! Z#d" Z$d# Z%d$ Z&d% Z'ed&        Z(ed'        Z)d( Z*ed)        Z+d* Z,ed+        Z-ed,        Z.ed-        Z/ed.        Z0e+Z1eZ2y)7r  c                    	 t        |t        t        j                  ft        j                  t        j
                  t        t        t        f      rJ|\  }}d}t        j                  |t        |      t        j                  d      |      }|| _        d| _U        yt        |t        t        j                  ft        j                  t        j
                  t        t        t        ft        t        f      rI|\  }}}t        j                  |t        |      t        j                  d      |      }|| _        d| _U        yt        |t        t        j                  t        d      ft         t        j"                  f      r)|\  }}t%        |t              r|j                  }n|t        j                  d      }t%        |t               r|j                  }t        j&                  |      j(                  st+        d      |j(                  r^t        j,                  ||t        j                         t        j.                  d      t        j0                         d      | _        d| _U        yt        j2                  |      | _        | j                  j(                  	st5        t6              t        |t         t        j"                  ft         t        j"                  f      r|\  }}t%        |t               r|j                  }t%        |t               r|j                  }|}|}	|j(                  s0t        j2                  |	      }
|
j(                  s%t5        t6              t        j8                  ||	      }
|
| _        d| _U        yt        |t         t        j"                  ft:        t        ft:        t        fd      s7t        |t         t        j"                  ft:        t        ft:        t        f      r@t<        dk  rJ d|d       t?        |      dk(  r*|\  }}}t        j
                  t        j@                        }n|\  }}}}t        |      }|\  }}}}t%        |t               r|j                  n|}t        |      }t        jB                  |      s7t        jD                  ||jG                         |jI                         |||      }nWt        jD                  ||jG                         |jI                         ||t        j
                  t        j@                              }|| _        d| _U        yt        |tJ        t         t        j"                  f      r8|d   d	k(  r0|\  }}t%        |t               r|j                  }|| _        d| _U        yt        |t         t        j"                  ft        df      r|d   }t?        |      d
k(  r|d   nd}t%        |t               r|j                  n|}tM        |dd      st+        d      t        j&                  |      }|j(                  s|st+        d      t        j                         }t        jN                  |      }t        jP                  |      }t        jR                  |      }t        jT                  |||||      }|j(                  jF                  |j(                  _#        |j(                  jH                  |j(                  _$        |j(                  jV                  |j(                  _+        |j(                  jX                  |j(                  _,        	 t        jZ                  |j(                  |j(                  |       || _        d| _U        yt        |t        j                  t        ft        t        dt        t        f      rd|\  }}}}$}t%        |t              r(|j                  }t%        |t        j                        sJ t        jj                  |      }||z   |z  }%t        j                         }t        jT                  |||||      }t%        |$tl        tn        f      r!t        jp                  |$      }&t?        |$      }nOts        |$      }'|'j(                  st+        d      t        jt                  |'      \  }}(t        jp                  |$      }&|%|z  |k7  rt+        d|d|d|d|d|%d|      t        jv                  |j(                  |&       || _        d| _U        yt        |d      r|\  })d}*ty        |)d      r(|)j{                         }+|+rt        j|                  |+      },nty        |)|*      r$|)j~                  }+|+rt        j|                  |+      },nst%        |)tJ              rt        j|                  |)      },nMts        |)      }'|'j(                  r|'j(                  j>                  st+        d      t        j                  |'      },t        j                  ,t        j
                  t        t        t        t              t        j                  |,j                         dd|,j                         dd            \  }}}t        j                  |,      \  }-}.|-|j(                  _+        |.|j(                  _,        || _        d| _U        yt        |t        t        j                  ft              r|\  }/}0t        |/      }1t        |1       t        j                  |1      }2tM        |0d|2dz
        st+        t              t        j                  |1|0d      }3t        j                  |3t        d            }4t        j                  |4t        d            sMt        j                  |4t        d            s.t        j                  |4t        d            st+        t              t        j                  |1|3      },t        j                  |,t        j
                  t        t        t        t              t        j                  |,j                         dd|,j                         dd            \  }5}}|5| _        d| _U        yd}6|D ]  }7|6dt        |7       d|7 dz  }6 t        |6      d| _U        y)a  
        Pixmap(colorspace, irect, alpha) - empty pixmap.
        Pixmap(colorspace, src) - copy changing colorspace.
        Pixmap(src, width, height,[clip]) - scaled copy, float dimensions.
        Pixmap(src, alpha=1) - copy and add or drop alpha channel.
        Pixmap(filename) - from an image in a file.
        Pixmap(image) - from an image in memory (bytes).
        Pixmap(colorspace, width, height, samples, alpha) - from samples data.
        Pixmap(PDFdoc, xref) - from an image at xref in a PDF document.
        r   Nz"source colorspace must not be Noner   r   r+  rN	  zCannot handle args=zY because fz_scale_pixmap() and fz_scale_pixmap_cached() are not declared in MuPDF headersr   rawrr   zbad alpha valuez'cannot drop alpha for 'NULL' colorspacezbad samples datazbad samples length w=z h=z alpha=z n=z stride=z size=r   resolvebad image datar=  rO  Alpha
Luminosityz+Unrecognised args for constructing Pixmap:
    r,   ry  )Vr  rf  rf   rh  r(  FzIrectIRectr   ru   fz_new_pixmap_with_bboxr  r  r   r   r  r   r  FzPixmaprs   fz_pixmap_colorspacer   r   r
  r
  ri   fz_new_pixmap_from_alpha_channelr   MSG_PIX_NOALPHA!fz_new_pixmap_from_color_and_maskr%  rw   r'  fz_infinite_irectr  fz_scale_pixmapr  r  r   rW  fz_pixmap_colorantsfz_pixmap_widthfz_pixmap_heightfz_new_pixmaprz  r{  ll_fz_pixmap_copyfz_pixmap_samples_memoryviewr  strider?  r  fz_samples_setfz_samples_getrx  r   r-  r  r   r  ll_fz_pixmap_copy_rawr  r   fz_new_image_from_filer   rk  fz_get_pixmap_from_imageFZ_MIN_INF_RECTFZ_MAX_INF_RECTr2  r   r  rl  r   r   r   r  r>  r?  r@  r   r   rB  r
  r^  r   _memory_view)8r]   r  r  r   r  r  spixmpixspmmpmr	  r   r  r   r  src_pixr  sepsr?  src_viewpm_viewrz  tptrsptr	pm_stridepm_npm_alpha
src_stridesrc_nr  r  pm_isrc_ir  src_pix_alpharB  samplesrk  samples2r   rs  	imagedatar   r  r  rz  r{  r   r   r  r-  r
  r  r  r:   args8                                                           r   r^   zPixmap.__init__%  s/
     U//0u}}eT5A
 HBE..r3CD3I5K^K^_`KachiBDID !A U//0u}}eT5Ad #OBe..r3CD3I5K^K^_`KachiBDIp !m z5+=+=tDzJVUZUcUcLdeHB"j)WW''-$'yy--d3>> "FGG}}!33**,2248++-	R !A "BBDI	yy++&88vu~~68PQJD$$'yy$'yyCC??<<SA~~&88==c3GDIZ !W 7%s|UYZvu~~6uclS"Z/ L04'  2K  L  Lq4yA~!
a}}U%<%<=#' aD'-#D!Q#-dF#;diiG#D)D--d3**7GIIKaQRTXY**7GIIKaQRTYTaTabgbybyTz{DIn !k cFENN#;<aEAQEAr"f%WWDI` !] vu~~6dD 7D"4yA~DG1E#-dF#;diiGE1a( "344++G4B== "KLL&&(D))'2A%%g.A&&w/A$$RAtU;B%0022BMMO%0022BMMO!(!3!3!8!8BMM!(!3!3!8!8BMM  ''8J8JANh DI@ !} u11:>S$QTVZP[\'+$B1gu"j)WW!"e&8&8999%%b)A%i1_F&&(D$$RAtU;B7UI$67 33G<7|(1~~$&89911#6a 33G<zT! $:t4QD%1$iPVyX_Z^Y`"abb''ADIL !I d#JIDy),!))+66u=CD)!66u=CIs+229=(3~~S^^-?-?$&67744S9
 55MM/?OUdeNNCEEGQ3557AqAHB1
 2237JD$!%BMM!%BMMDIJ !G x)9)9:C@IC"3'CsO((-GD!WQY/ ,//((dA6C&&sHY,?@E%%eXg->?!--eXg5FG!--eXl5KL /22&&sC0C 66MM/?OUdeNN3557Aq#%%'1a@ICA
 DI ! BD 4$tCykC5334T""
 !r   c                     | j                   S r   )rz  r\   s    r   r  zPixmap.__len__&  s    yyr   c                    t        |       t        ury | j                  rHd| j                  j                  j                  j
                  d| j                  d| j                  dS ddd| j                  d| j                  dS )NzPixmap(z, rj  r  )r   r  r  r   r   r   irectr  r\   s    r   r   zPixmap.__repr__&  sd    DzV#V??+/??+?+?+J+J+O+OQUQ[Q[]a]g]ghh  ,24::tzzJJr   c                    | j                   }t        j                  |      |j                         z  }t        j                  |      }t        j
                  |      }|dk(  rt        j                  ||       n|dk(  rt        j                  ||       n|dk(  rt        j                  ||       n|dk(  rt        j                  ||       nq|dk(  rt        j                  ||       nU|dk(  r:t        dk  rt        j                  |||       n/t        j                  |||d       nt        j                  ||       |j                          t        |      }|S )	z!
        Pixmap._tobytes
        r   rr   r   r
   r   r  r  r   )r   rf   fz_pixmap_strider  r  r  fz_write_pixmap_as_pngfz_write_pixmap_as_pnmfz_write_pixmap_as_pamfz_write_pixmap_as_psdfz_write_pixmap_as_psrw   fz_write_pixmap_as_jpegr  r   )r]   format_jpg_qualityr  rz  r   r  barrays           r   _tobyteszPixmap._tobytes&  s    YY%%b)BDDF2!!$'nnS!\E88bA\E88bA\E88bA\E88bA\E77R@\"W,--c2{C--c2{AF((b1!#&r   c                    | j                   }|dk(  rt        j                  ||       y |dk(  rt        j                  ||       y |dk(  rt        j                  ||       y |dk(  rt        j
                  ||       y |dk(  rt        j                  ||       y |dk(  rt        j                  |||       y t        j                  ||       y )Nr   rr   r   r
   r   r  )r   rf   fz_save_pixmap_as_pngfz_save_pixmap_as_pnmfz_save_pixmap_as_pamfz_save_pixmap_as_psdfz_save_pixmap_as_psfz_save_pixmap_as_jpeg)r]   r3   r  r  r  s        r   	_writeIMGzPixmap._writeIMG'  s    YY\E77HE\E77HE\E77HE\E77HE\E66r8D\E88X{S!77HEr   c                 @    t        j                  | j                        S )z$Indicates presence of alpha channel.)rf   fz_pixmap_alphar   r\   s    r   r  zPixmap.alpha'  ry  r   Nc                     | t        j                  | j                         y|!t        j                  | j                  |       yt	        | j                  |t        |             y)z*Fill all color components with same value.N)rf   fz_clear_pixmapr   fz_clear_pixmap_with_valueJM_clear_pixmap_rect_with_valuer  )r]   ry   r   s      r   
clear_withzPixmap.clear_with '  sH    =!!$)),\,,TYY>+DIIu>Nt>TUr   c                 r    | j                   }t        ||      }|st        t              |st	        |      S |S )z-
        Return count of each color.
        )r   JM_color_countr   MSG_COLOR_COUNT_FAILEDr'  )r]   r   r  r  rh   s        r   color_countzPixmap.color_count)'  s9     YYR& 6778O	r   c                    d}d}|#| j                   t        |      v r| j                   }| j                  d|      j                         D ]  \  }}||z  }||kD  s|}|} |sdt	        dg| j
                  z        fS ||z  fS )z/Return most frequent color and its usage ratio.r   T)r   r  r      )r  r   r  rn  r   r?  )r]   r  	allpixelscntpixelrO  maxpixels          r   color_topusagezPixmap.color_topusage5'  s    	

d4j 8::D ,,Dd,CIIK 	!LE5Is{ 		!
 ucUTVV^,--i**r   c                 R    t        t        j                  | j                              S )zPixmap Colorspace.)rf  rf   r_  r   r\   s    r   r  zPixmap.colorspaceD'  s     %44TYY?@@r   c                 4   | j                   }|j                   }t        j                  |      st        d      |j	                         |j	                         k7  rt        d      t        j
                  ||t        |      t        j                  d             y)zCopy bbox from another Pixmap.z'cannot copy pixmap with NULL colorspacez%source and target alpha must be equalN)r   rf   r_  r   r  fz_copy_pixmap_rectr  r
  )r]   r  r   r  rx  s        r   r  zPixmap.copyI'  st    YY(())'2GHH88:(EFF!!"g/?/EuGaGabfGghr   c                 V    t        j                  | j                        }t        |      S )zMD5 digest of pixmap (bytes).)rf   r
  r   r   r  s     r   r
  zPixmap.digestS'  s"     ""499-Szr   c                     t        j                  | j                        st        d       yt        j                  | j                  |       y)z=Apply correction with some float.
        gamma=1 is a no-op.zcolorspace invalid for functionN)rf   r_  r   r   fz_gamma_pixmap)r]   gammas     r   
gamma_withzPixmap.gamma_withY'  s6     ))4995=>tyy%0r   c                 @    t        j                  | j                        S )zThe height.)rf   rg  r   r\   s    r   r  zPixmap.ha'  r  r   c                     | j                   }t        j                  |      st        d       yt	        |      }t        j
                  |      rt        j                  |      }t        t        ||            S )z Invert the colors inside a bbox.zignored for stencil pixmapF)	r   rf   r_  r   r  r  fz_pixmap_bboxr  JM_invert_pixmap_rect)r]   r   r  r   s       r   invert_irectzPixmap.invert_irectf'  s`    YY))"-89T"%%a($$b)A)2q122r   c                 V    t        j                  | j                        }t        |      S )zPixmap bbox - an IRect object.)rf   r  r   JM_py_from_irectr  s     r   r  zPixmap.irectq'  s#     ""499-%%r   c                 @    t        j                  | j                        S )zCheck if pixmap is monochrome.)rf   fz_is_pixmap_monochromer   r\   s    r   is_monochromezPixmap.is_monochromew'  s     ,,dii88r   c                     | j                   }|j                         }|j                         |j                         z  |z  }d } ||d|      }t	        |||      D ]  } ||||      }||k7  s y y)z5
        Check if pixmap has only one color.
        c                     t               }t        |      D ]*  }|j                  t        j                  | ||z                , |S r   )rt   r  r6   rf   rm  )r  offsetr?  rN   r  s        r   _pixmap_read_samplesz0Pixmap.is_unicolor.<locals>._pixmap_read_samples'  s>    &C1X ?

5//F1H=>?Jr   r   FT)r   r?  r   r  r  )r]   r  r?  rO  r  sample0r  samples           r   is_unicolorzPixmap.is_unicolor|'  s}    
 YYDDF!#	
 'Aq1Qq) 	F)2vq9F 	 r   c                     t         r)d }t        |      | j                  _        | j                  S t	        j
                  | j                        S )zThe size of one pixel.c                 @    t        j                  | j                        S r   )r   pixmap_nr   r\   s    r   n2zPixmap.n.<locals>.n2'  s    ~~dii00r   )r   r  r%
  r?  rf   fz_pixmap_componentsr   )r]   r  s     r   r?  zPixmap.n'  s:     1'|DNN66M))$))44r   c                 z   t         s|st        d      t        j                         }||_        |r|j                  |       |r|j                  |       | j                  }t        |t              rt        j                  ||d|       yt        |      }t        j                  |||       |j                          y)z4
        Save pixmap as an OCR-ed PDF page.
        'No OCR support: TESSDATA_PREFIX not setr   N)r|   r   rf   FzPdfocrOptionsr3  language_set2datadir_set2r   rs   r   fz_save_pixmap_as_pdfocrr  fz_write_pixmap_as_pdfocrr  )r]   r3   r3  r  tessdatar  r  r  s           r   pdfocr_savezPixmap.pdfocr_save'  s     xHII$$& )x(iih$**C1dC'2C++S#t<!r   c                     t         s|st        d      ddlm}  |       }| j	                  ||||       |j                         S )a  Save pixmap as an OCR-ed PDF page.

        Args:
            compress: (bool) compress, default 1 (True).
            language: (str) language(s) occurring on page, default "eng" (English),
                    multiples like "eng+ger" for English and German.
            tessdata: (str) folder name of Tesseract's language support. Must be
                    given if environment variable TESSDATA_PREFIX is not set.
        Notes:
            On failure, make sure Tesseract is installed and you have set the
            environment variable "TESSDATA_PREFIX" to the folder containing your
            Tesseract's language support data.
        r  r   r9  )r3  r  r  )r|   r   r.  r/  r  rG  )r]   r3  r  r  r/  r:  s         r   pdfocr_tobyteszPixmap.pdfocr_tobytes'  sB     xHIIix(XV||~r   c                    	 ddl m} | j                  }|d}nH|j
                  dk(  r| j                  dk(  rdnd}n%|j
                  dk(  r| j                  dk(  rd	nd
}nd}|j                  || j                  | j                  f| j                        }d|j                         vr| j                  | j                  f|d<    |j                  |i | y# t        $ r t        d        w xY w)zWrite to image file using Pillow.

        Args are passed to Pillow's Image.save method, see their documentation.
        Use instead of save when other output formats are desired.
        r   )rO  zPIL/Pillow not installedNr  r   LAr   rq  RGBArr  r  )PILrO  ImportErrorrB   r  r?  r  	frombytesr  r  r  r  rz  r{  r  )r]   r  kwargsrO  cspacer   r  s          r   pil_savezPixmap.pil_save'  s    	!
 >DXX]**/3tDXX] JJ!O5DDoodTZZ$=t||L%!YY		2F5M$!&!'  	./	s   C C*c                 h    ddl m}  |       } | j                  |g|i | |j                         S )zConvert to binary image stream using pillow.

        Args are passed to Pillow's Image.save method, see their documentation.
        Use instead of 'tobytes' when other output formats are needed.
        r   r9  )r.  r/  r  rG  )r]   r  r  r/  	bytes_outs        r   pil_tobyteszPixmap.pil_tobytes'  s5     	I	i1$1&1!!##r   c                    t         r+t        j                  | j                  j                  ||      S 	 |dk  sK|| j                  j                  j
                  k\  s(|dk  s#|| j                  j                  j                  k\  rt        t        t               | j                  j                  j                  }| j                  j                  j                  }||z  ||z  z   }t        | j                  |||z          }|S )zXGet color tuple of pixel (x, y).
        Last item is the alpha if Pixmap.alpha is true.r   )r   r   pixmap_pixelr   r   r   r  rr  MSG_PIXEL_OUTSIDErp  r?  rk  ru   
samples_mv)r]   r  r  r?  rk  r  rN   s          r   r  zPixmap.pixel'  s     %%dii&:&:AqAAq5		,,...q5		,,...%'78II  ""%%,,QJQT__a1-.
r   r  c                 0    | j                   }t        |      S r   )r  r   )r]   mvs     r   r  zPixmap.samples (  s    __bzr   c                 @    t        j                  | j                        S )z,
        Pixmap samples memoryview.
        )rf   rj  r   r\   s    r   r  zPixmap.samples_mv(  s    
 11$))<<r   c                 @    t        j                  | j                        S r   )rf   fz_pixmap_samples_intr   r\   s    r   samples_ptrzPixmap.samples_ptr(  s    **49955r   c                    ddddddddddd
}t        |      t        u rn0t        |d      rt        |      }nt        |d	      r|j                  }|'t        j
                  j                  |      \  }}|dd
 }|j                  |j                         d
      }|(t        d| dt        |j                                      | j                  r|dv rt        d|z        | j                  r+| j                  j                  dkD  r|dv rt        d|z        |dk(  r&| j                  | j                   | j"                         | j%                  |||      S )zOutput as image in format determined by filename extension.

        Args:
            output: (str) only use to overrule filename extension. Default is PNG.
                    Others are JPEG, JPG, PNM, PGM, PPM, PBM, PAM, PSD, PS.
        r   rr   r   r
   r   r  )
rT  pnmpgmppmpbmpampsdpsjpgjpegr  r   NImage format  not in rr   r   r  z'%s' cannot have alphar   rr   r  zunsupported colorspace for '%s')r   r   r  r   r   r1   splitextr   r  r   ru   r  r  r  r?  r  rz  r{  r  )r]   r3   r  r  valid_formatsr  rV  r"  s           r   r  zPixmap.save(  sK     >S Xz*8}HXv&}}H>WW%%h/FAsWF5;}VHHU=CUCUCW=X<YZ[[::#*5>????t0014	9I>GHH!8LLDII.~~h[99r   c                 <   | j                   }d}d}|j                         dk(  rt        t              t	        j
                  |      }t	        j                  |      }	t	        j                  |      }
|	|
z  |dz   z  }g d}g d}d}d}|r>t        |t        t        f      r(t        |      |k(  rt        |      D ]
  }||   ||<    d}|r>t        |t        t        f      r(t        |      |k(  rt        |      D ]
  }||   ||<    d}t               }d}|rJt        |t        t        f      r|}t        |      }nJ dt        |              ||	|
z  k  rt        d      	 t	        j                   ||||t	        j"                  |      |j$                  ||||
       y)a  Set alpha channel to values contained in a byte array.
        If omitted, set alphas to 255.

        Args:
            alphavalues: (bytes) with length (width * height) or 'None'.
            premultiply: (bool, True) premultiply colors with alpha values.
            opaque: (tuple, length colorspace.n) this color receives opacity 0.
            matte: (tuple, length colorspace.n)) preblending background color.
        r   r   r   r   r   r   z!unexpected type for alphavalues: zbad alpha valuesN)r   r  r   ra  rf   re  rf  rg  rs   rt   ru   r'  r  r   r-  r   Pixmap_set_alpha_helperr  r   rm  rl  )r]   alphavaluespremultiplyopaquematter  r  rA  r?  r   r  balenr   rI  zero_outbgroundr  rN  data_lenrr  rB  data_fix	fz_mul255s                          r   	set_alphazPixmap.set_alpha9(  s    ii99;!o..%%c*!!#&""3'A1j$7CK1<L1X &"1Iq	&HZ63u:?1X &"1X
&Gw +y'9:"{+Q=d;>O=PQQq!a% "455)),,d3NNr   c                    ddddddddddddd}|j                  |j                         d	      }|(t        d
| dt        |j	                                      | j
                  r|dv rt        d      | j                  r(| j                  j                  dkD  r|dv rt        d      |dk(  r&| j                  | j                  | j                         | j                  ||      }|S )zA
        Convert to binary image stream of desired type.
        r   rr   r   r  r
   r   r  )rT  r  r  r  r  r  tgatpicr  r  r  r  Nr  r  r  z'{output}' cannot have alphar  z%unsupported colorspace for '{output}')r   r  r   ru   r  r  r  r?  r  rz  r{  r  )r]   r  r  r  r"  r  s         r   r  zPixmap.tobytes(  s    
  5;}VHHU=CUCUCW=X<YZ[[::#*;<<??t0014	9IDEE!8LLDII.sK0r   c                 `    | j                   }||j                  _        ||j                  _        y)z"Set resolution in both dimensions.N)r   r   rz  r{  )r]   rz  r{  r  s       r   r  zPixmap.set_dpi(  s#    YY!!r   c                 `    | j                   }||j                  _        ||j                  _        y)zSet top-left coordinates.N)r   r   r  r  )r]   r  r  r  s       r   
set_originzPixmap.set_origin(  s!    YYr   c                 *   t         r,t        j                  | j                  j                  |||      S | j                  }t        |d|j                         dz
        rt        |d|j                         dz
        st        t              |j                         }t        |      D ]#  }||   }t        |dd      rt        t               t        j                  |      }||z  ||z  z   }	 t        |      D ]  }|j#                  ||z   ||           y)zSet color of pixel (x, y).r   r   r  N)r   r   	set_pixelr   r   rW  r   r  r   r  r?  r  MSG_BAD_COLOR_SEQrf   r  rs  r  rl  )	r]   r  r  r  r  r?  rB  r  rk  s	            r   r  zPixmap.set_pixel(  s    ??499#7#7AuEEYY1bddfqj)!Q
1K/00DDFq 	5AaAAq#& "344	5 '',QJQ 1X 3!!!a%q23r   c                    | j                   }|j                         }g }t        |      D ]4  }||   }t        |dd      st	        t
              |j                  |       6 t        |      }t        |||      }t        |      }|S )z Set color of all pixels in bbox.r   r  )
r   r?  r  rW  r   r  r6   r  JM_fill_pixmap_rect_with_colorr  )	r]   r   r  r  r?  rs  rB  r  rh   s	            r   ri  zPixmap.set_rect(  s    YYDDFq 	AaAAq#& "344HHQK		
  %*2q$7!W	r   c                 t    |dk  rt        d       yt        j                  | j                  |       d| _        y)zgDivide width and height by 2**factor.
        E.g. factor=1 shrinks to 25% of original size (in place).r   zignoring shrink factor < 1N)r   rf   fz_subsample_pixmapr   rs  )r]   factors     r   shrinkzPixmap.shrink(  s3     A:89!!499f5 r   c                     t         dk\  rt        j                  | j                        S | j                  }|j	                         |j                         z  |j                         z  S )zPixmap size.rT  )rw   rf   fz_pixmap_sizer   r?  r   r  )r]   r  s     r   rz  zPixmap.size(  sM     *,(($))44 YYttv''r   c                 6    | j                   j                         S )z%Length of one image line (width * n).)r   rk  r\   s    r   rk  zPixmap.stride(  s     yy!!r   c                     | j                   r| j                   j                  dkD  rt        d       yt        j                  | j
                  ||      S )z/Tint colors with modifiers for black and white.r   z(warning: colorspace invalid for functionN)r  r?  rB   rf   fz_tint_pixmapr   )r]   blackwhites      r   	tint_withzPixmap.tint_with)  s?    $//"3"3a"7>?##TYYu==r   c                 @    t        j                  | j                        S )z
The width.)rf   rf  r   r\   s    r   r   zPixmap.w
)  ry  r   c                     |j                   st        d      t        |      }|j                  |j                  |j
                  |j                  g}t        j                  | j                  |||      }t        |      S )z!Return pixmap from a warped quad.zquad must be convex)	is_convexr   rf
  rw  r  r  r  rf   fz_warp_pixmapr   r  )r]   r  r  r  ri
  r  r	  s          r   warpzPixmap.warp)  s`    ~~Z0E%FFD!44qttQTT*""DIIvufEs|r   c                 @    t        j                  | j                        S )zx component of Pixmap origin.)rf   fz_pixmap_xr   r\   s    r   r  zPixmap.x)         ++r   c                 6    | j                   j                         S )zResolution in x direction.)r   rz  r\   s    r   rz  zPixmap.xres)       yy~~r   c                 @    t        j                  | j                        S )zy component of Pixmap origin.)rf   fz_pixmap_yr   r\   s    r   r  zPixmap.y!)  r.  r   c                 6    | j                   j                         S )zResolution in y direction.)r   r{  r\   s    r   r{  zPixmap.yres&)  r0  r   rj  rP  r   )r   NN)TengN)N_   )Nr   NN)rT  r5  )3r`   ra   rb   r^   r  r   r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r?  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  ri  r  rz  rk  r&  r   r+  r  rz  r  r{  r  r  r    r   r   r  r  %  s
   X!tK0F 0 0V
+ A Ai  
1 1 1	3 & &
 9 9  & 
5 
5"(*":	$$ u   = = 6 6':R]~<"32! ( ( " "> 0 0 , ,     , ,     EFr   r  c                       e Zd Zd Zd Zd Zd Zd Zd Zdddd	Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zed        Zd Zd Zed        ZeZeZy)r  c                     t        j                  | j                  | j                  z  | j                  | j                  z  z         S r   )r6	  r7	  r  r  r\   s    r   r:	  zPoint.__abs__2)  s.    yy$&&466DFF?:;;r   c                     t        |d      r&t        | j                  |z   | j                  |z         S t	        |      dk7  rt        d      t        | j                  |d   z   | j                  |d   z         S Nr   rr   Point: bad seq lenr   r   r  r  r  r  r'  r   r]   rd  s     r   rA	  zPoint.__add__5)  e    1k"!TVVaZ00q6Q;122TVVad]DFFQqTM22r   c                 J    t        |       t        |       cxk(  xr dk(   S c  S rW   rD	  r\   s    r   rE	  zPoint.__bool__<)  rF	  r   c                 \    t        |d      syt        |      dk(  xr t        | |z
        du S )Nr  Frr   rH	  r<  s     r   rI	  zPoint.__eq__?)  s/    q)$1v{6tD1H~66r   c                 8    | j                   | j                  f|   S r   r  r  rL	  s     r   r  zPoint.__getitem__D)  s    ""r   c                 *    t        t        |             S r   r	  ru   r\   s    r   r	  zPoint.__hash__G)      E$K  r   NrA  c                r   |sd| _         d| _        nt        |      dkD  rt        d      t        |      dk(  r't	        |d         | _         t	        |d         | _        nt        |      dk(  r|d   }t        |t        j                  t        j                  f      r#|j                   | _         |j                  | _        ndt        |d      du rt        d      t        |      dk7  rt        d      t	        |d         | _         t	        |d         | _        nt        d      ||| _         ||| _        y	y	)
z
        Point() - all zeros
        Point(x, y)
        Point(Point) - new copy
        Point(sequence) - from 'sequence'

        Explicit keyword args x, y override earlier settings if not None.
        rU  rr   r:  r   r   r  FzPoint: bad argsN)
r  r  r'  r   r%  rs   rf   r  fz_pointr  )r]   r  r  r  r  s        r   r^   zPoint.__init__J)  s
    DFDFY]122Y!^47^DF47^DFY!^QA!emmU^^<=1m,5$%677q6Q;$%9::qtqt122=QDF=QDF=r   c                      yNrr   r    r\   s    r   r  zPoint.__len__l)  r[	  r   c                     t        |d      r&t        | j                  |z  | j                  |z        S t        |       }|j	                  |      S Nr   )r  r  r  r  r+
  )r]   rA  rd  s      r   r^	  zPoint.__mul__o)  s@    1k"!TVVaZ00$K{{1~r   c                 F    t        | j                   | j                         S r   )r  r  r  r\   s    r   r`	  zPoint.__neg__u)  s    dffWtvvg&&r   c                 J    t        |       t        |       cxk(  xr dk(   S c  S rW   rD	  r\   s    r   rb	  zPoint.__nonzero__x)  rF	  r   c                     t        |       S r   )r  r\   s    r   rd	  zPoint.__pos__{)      T{r   c                 0    dt        t        |             z   S )Nr  rf	  r\   s    r   r   zPoint.__repr__~)      U4[)))r   c                 b    t        |      }|dk(  r|| _        y |dk(  r|| _        y t        d      )Nr   r   rh	  )r%  r  r  r  ri	  s      r   rj	  zPoint.__setitem__)  s?    !H!VaTV  !VaTV  122r   c                     t        |d      r&t        | j                  |z
  | j                  |z
        S t	        |      dk7  rt        d      t        | j                  |d   z
  | j                  |d   z
        S r9  r;  r<  s     r   rl	  zPoint.__sub__)  r=  r   c                     t        |d      r,t        | j                  dz  |z  | j                  dz  |z        S t	        |      d   }|st        d      t        |       }|j                  |      S rn	  )r  r  r  r  ro	  rp	  r+
  )r]   rA  rX	  rd  s       r   rr	  zPoint.__truediv__)  sf    1k""QA66"1%#$;<<$K{{2r   c                 ,   | j                   | j                   z  | j                  | j                  z  z   }|t        k  rt        dd      S t	        j
                  |      }t        t        | j                         |z  t        | j                        |z        S )z&Unit vector with positive coordinates.r   )r  r  ry	  r  r6	  r7	  r  r]   r)  s     r   abs_unitzPoint.abs_unit)  sk     FFTVVOdfftvvo-w;1:IIaLS[1_c$&&kAo66r   c                    t        |      dkD  st        d      |d   }t        |      dk(  rt        |      }n%t        |      dk(  rt        |      }nt        d      t        |      dkD  r|d   }nd}dd	d
dd}||   d   ||   d   z  }t	        |      t        u rt        | |z
        |z  S t        |j                  |j                        }||j                  z  }| |v ry| j                  |j                  kD  r| j                  |j                  k\  r| j                  |j                  |      S | j                  |j                  k  r| j                  |j                  |      S | j                  |j                  z
  |z  S |j                  | j                  cxk  r|j                  k  rTn nQ| j                  |j                  k\  r| j                  |j                  z
  |z  S |j                  | j                  z
  |z  S | j                  |j                  k\  r| j                  |j                   |      S | j                  |j                  k  r| j                  |j                  |      S |j                  | j                  z
  |z  S )z.Return distance to rectangle or another point.r   z$at least one parameter must be givenrr   r  z$arg1 must be point-like or rect-liker   r,  )rV  rV  )rV        R@)gRQ@rX  )gffffff9@rX  )r,  incmmmrU  )r'  r   r  r   r   r  top_leftbottom_rightr  r  r  r  distance_tor  	top_rightr  bottom_left)r]   r  r  unitur  r   s          r   r^  zPoint.distance_to)  s   4y1}CDDGq6Q;aAVq[QACDDt9q=7DD(+ dGAJ4#7etax=1$$ QZZ(1966ADD=vv~''==144''T::**TTTVV#qtt#vv~**tvv**vv~''t<<144''

D99tvv**r   c                 j    t        |      dk7  rt        d      t        | |      \  | _        | _        | S )z7Replace point by its transformation with matrix-like m.r   r?	  )r'  r   util_transform_pointr  r  r  s     r   r+
  zPoint.transform)  s2    q6Q;233-dA6r   c                    | j                   | j                   z  | j                  | j                  z  z   }|t        k  rt        dd      S t	        j
                  |      }t        | j                   |z  | j                  |z        S )zUnit vector of the point.r   )r  r  ry	  r  r6	  r7	  rU  s     r   ra  z
Point.unit)  sc     FFTVVOdfftvvo-w;1:IIaLTVVaZ!,,r   )r`   ra   rb   r:	  rA	  rE	  rI	  r  r	  r^   r  r^	  r`	  rb	  rd	  r   rj	  rl	  rr	  r  rV  r^  r+
  ra  r	  r	  r    r   r   r  r  0)  s    <317
#! !%  'D'1*3 7 70+d - - GDr   r  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	ddddd	d
Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zed        Zed        Zd Zed        Zd ZeZ ed       Z ed       Zy)r  c                     | j                   ryt        | j                  | j                  z
        t        | j                  | j                  z
        z  S NrU  )r	  r  rw  r  r  r\   s    r   r:	  zQuad.__abs__)  s;    ==477TWW$%DGGdgg,=(>>>r   c                 l   t        |d      rBt        | j                  |z   | j                  |z   | j                  |z   | j
                  |z         S t        |      dk7  rt        d      t        | j                  |d   z   | j                  |d   z   | j                  |d   z   | j
                  |d   z         S Nr   r  Quad: bad seq lenr   r   rr   r   r  r  rw  r  r  r  r'  r   r]   ri
  s     r   rA	  zQuad.__add__)      1k"!TWWq[$''A+tww{KKq6Q;011DGGadNDGGadNDGGadNDGGaPQdNSSr   c                     | j                    S r   r	  r\   s    r   rE	  zQuad.__bool__)      ==  r   c                 t   	 |j                         }|dk(  rt	        ||       S |dk7  ryt        |      r6t        |      j                  ryt	        |d d |       xr t	        |dd  |       S t        |      r"t        d      D ]  }t	        ||   |       r y yy# t        $ r t        dkD  r
t                Y yw xY w)Nr   Frr   r  T)
r  r   r   rF   util_point_in_quad	CheckRectr   r	  	CheckQuadr  )r]   r  r  r  s       r   r  zQuad.__contains__)  s    			A 6%a..6Q<Aw%aeT2V7I!AB%QU7VVQ<1X !)!A$5 ! !  	#a'N,<	s   B B76B7c                     t        |d      syt        |      dk(  xrN | j                  |d   k(  xr: | j                  |d   k(  xr& | j                  |d   k(  xr | j
                  |d   k(  S Nr  Fr  r   r   rr   r   )r  r'  rw  r  r  r  )r]   r  s     r   rI	  zQuad.__eq__*  su    tY'4yA~ 
GGtAw GGtAwGGtAw GGtAw		
r   c                 d    | j                   | j                  | j                  | j                  f|   S r   rw  r  r  r  rL	  s     r   r  zQuad.__getitem__*  &    $''4773A66r   c                 *    t        t        |             S r   rC  r\   s    r   r	  zQuad.__hash__*  rD  r   Nry  c                   |s&t               x| _        x| _        x| _        | _        nYt        |      dkD  rt        d      t        |      dk(  r+t        t         |      \  | _        | _        | _        | _        nt        |      dk(  r|d   }t        |t        j                        rs|| _        t        |j                        t        |j                        t        |j                        t        |j                        f\  | _        | _        | _        | _        ngt        |d      du rt        d      t        |      dk7  rt        d      t        t         |      \  | _        | _        | _        | _        nt        d      |t        |      | _        |t        |      | _        |t        |      | _        |t        |      | _        yy)	z
        Quad() - all zero points
        Quad(ul, ur, ll, lr)
        Quad(quad) - new copy
        Quad(sequence) - from 'sequence'

        Explicit keyword args ul, ur, ll, lr override earlier settings if not
        None.
    
        r  rk  r   r   r  FzQuad: bad argsN)r  rw  r  r  r  r'  r   r  rs   rf   FzQuadr   r  )r]   rw  r  r  r  r  r  s          r   r^   zQuad.__init__*  sl    49G;DG;dg;$'Y]011Y!^14UD1A.DGTWdgtwY!^QA!U\\*	5:144[%+uUVUYUY{\abcbfbf\g5g2$'47M*e3 !122Q1 !45558]2$'47-..>eBiDG>eBiDG>eBiDG>eBiDG>r   c                      yNr  r    r\   s    r   r  zQuad.__len__A*  r[	  r   c                 >    t        |       }|j                  |      }|S r   )r  r+
  )r]   rA  ri
  s      r   r^	  zQuad.__mul__D*  s    JKKNr   c                 v    t        | j                   | j                   | j                   | j                         S r   )r  rw  r  r  r  r\   s    r   r`	  zQuad.__neg__I*  +    TWWHtwwh477(;;r   c                     | j                    S r   rp  r\   s    r   rb	  zQuad.__nonzero__L*  rq  r   c                     t        |       S r   )r  r\   s    r   rd	  zQuad.__pos__O*      Dzr   c                 0    dt        t        |             z   S )Nr  rf	  r\   s    r   r   zQuad.__repr__R*      E$K(((r   c                     |dk(  rt        |      | _        y |dk(  rt        |      | _        y |dk(  rt        |      | _        y |dk(  rt        |      | _        y t        d      Nr   r   rr   r   rh	  )r  rw  r  r  r  r  ri	  s      r   rj	  zQuad.__setitem__U*  sn    !VuQxTW  !VuQxTW
 	 !VuQxTW  !VuQxTW  122r   c                 l   t        |d      rBt        | j                  |z
  | j                  |z
  | j                  |z
  | j
                  |z
        S t        |      dk7  rt        d      t        | j                  |d   z
  | j                  |d   z
  | j                  |d   z
  | j
                  |d   z
        S rj  rl  rm  s     r   rl	  zQuad.__sub__^*  rn  r   c                     t        |d      rd|z  }nt        |      d   }|st        d      t        |       }|j	                  |      }|S )Nr   rV  r   zMatrix not invertible)r  ro	  rp	  r  r+
  )r]   rA  imri
  s       r   rr	  zQuad.__truediv__e*  sN    1k"aB#A&q)B'(?@@JKKOr   c                 p   t        | j                  | j                        }| j                  |z  }| j                  |z  }|j
                  |j
                  z  dkD  ryt        | j                  | j                        }| j                  |z  }| j                  |z  }|j
                  |j
                  z  dkD  ryy)zCheck if quad is convex and not degenerate.

        Notes:
            Check that for the two diagonals, the other two corners are not
            on the same side of the diagonal.
        Returns:
            True or False.
        r   FT)planish_linerw  r  r  r  r  )r]   rA  r  r  s       r   r)  zQuad.is_convexp*  s     $''*WWq[WWq[44"$$;?$''*WWq[WWq[44"$$;?r   c                 R    | j                   t        k  xs | j                  t        k  S )zsCheck whether all quad corners are on the same line.

        This is the case if width or height is zero.
        )r  ry	  r  r\   s    r   r	  zQuad.is_empty*  s!     zzG#<t{{W'<<r   c                 .    | j                   j                  S )z(Check whether this is the infinite quad.)r   r	  r\   s    r   r	  zQuad.is_infinite*  s     yy$$$r   c                    t        | j                  | j                  | j                        }t	        |dz
        t
        kD  ryt        | j                  | j                  | j                        }t	        |dz
        t
        kD  ryt        | j                  | j                  | j                        }t	        |dz
        t
        kD  ryy)zCheck if quad is rectangular.

        Notes:
            Some rotation matrix can thus transform it into a rectangle.
            This is equivalent to three corners enclose 90 degrees.
        Returns:
            True or False.
        r   FT)util_sine_betweenrw  r  r  r  ry	  r  )r]   sines     r   is_rectangularzQuad.is_rectangular*  s     !$''477;tax=7" $''477;tax=7" $''477;tax=7"r   c                     | j                   r
t               S t        dd      j                  |j                  |j
                        }| | z  |z  |z  }|S )zSMorph the quad with matrix-like 'm' and point-like 'p'.

        Return a new quad.r   )r	  INFINITE_QUADr5  r	  r  r  )r]   rd  rA  deltari
  s        r   r  z
Quad.morph*  sO      ?"q!))!##qss3E6MA%r   c                 2   t               }t        | j                  j                  | j                  j                  | j
                  j                  | j                  j                        |_        t        | j                  j                  | j                  j                  | j
                  j                  | j                  j                        |_	        t        | j                  j                  | j                  j                  | j
                  j                  | j                  j                        |_        t        | j                  j                  | j                  j                  | j
                  j                  | j                  j                        |_        |S r   )r   r  rw  r  r  r  r  r  r  r  r  r  r  r]   r   s     r   r   z	Quad.rect*  s    F47799dggiiDGGII>47799dggiiDGGII>47799dggiiDGGII>47799dggiiDGGII>r   c                     t        |d      rnt        |      dk7  rt        d      | xj                  |z  c_        | xj                  |z  c_        | xj
                  |z  c_        | xj                  |z  c_        | S )z1Replace quad by its transformation with matrix m.r   r   r?	  )r  r'  r   rw  r  r  r  r  s     r   r+
  zQuad.transform*  s_    1k"Vq[2331111r   c                     t        t        | j                  | j                  z
        t        | j                  | j
                  z
              S r   )r  r  rw  r  r  r  r\   s    r   ri  zQuad.<lambda>*  1    3s477TWW+<'=s477TWWCT?U#V r   c                     t        t        | j                  | j                  z
        t        | j                  | j
                  z
              S r   )r  r  rw  r  r  r  r\   s    r   ri  zQuad.<lambda>*  r  r   )r`   ra   rb   r:	  rA	  rE	  r  rI	  r  r	  r^   r  r^	  r`	  rb	  rd	  r   rj	  rl	  rr	  r  r)  r	  r	  r  r  r   r+
  r	  r  r  r    r   r   r  r  )  s    ?
T!*
7! "&$4D !0F
<!)T	  * = = % %  0  
 GVWEVWFr   r  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	d	d	d	d	d	d
dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zd Zed        Zd Zd Zd Zd Zed        Zed        Z ed         Z!d! Z"d" Z#d# Z$ed$        Z%d% Z&ed&        Z'ed'        Z(d( Z)d) Z*ed*        Z+eZ,eZ-eZ. ee&      Z/e'Z0e(Z1y	)+r   c                     | j                   s| j                  ry| j                  | j                  z
  | j                  | j
                  z
  z  S rh  )r	  r	  r  r  r  r  r\   s    r   r:	  zRect.__abs__*  s9    ==D,,$''!dgg&788r   c                 l   t        |d      rBt        | j                  |z   | j                  |z   | j                  |z   | j
                  |z         S t        |      dk7  rt        d      t        | j                  |d   z   | j                  |d   z   | j                  |d   z   | j
                  |d   z         S Nr   r  Rect: bad seq lenr   r   rr   r   r  r   r  r  r  r  r'  r   r<  s     r   rA	  zRect.__add__*  rn  r   c                 ~    t        |d      st        d      t        |      }t        |       }|j                  |      S )Nr  bad operand 2)r  r   r   	intersectr]   r  r  r   s       r   __and__zRect.__and__*  s7    q)$_--!WJ{{2r   c                 J    t        |       t        |       cxk(  xr dk(   S c  S rW   rD	  r\   s    r   rE	  zRect.__bool__*  rF	  r   c                    t        |d      r|t        |       v S t        |      }|dk(  rt        ||       S |dk(  rt	               }	 t        |      }| j                  |j                  cxk  xr! |j                  cxk  xr | j                  k  nc xr@ | j                  |j                  cxk  xr! |j                  cxk  xr | j                  k  S c S y# t        $ r+ t        dkD  r
t                t        |      j                  }Y w xY w)Nr   rr   r  r   F)r  ru   r'  util_is_point_in_rectINFINITE_RECTr   r   r   rF   r  r   r  r  r  r  )r]   r  r  r   s       r   r  zRect.__contains__*  s    1k"d##F6(D116A!G GGqtt6qtt6tww6 7GGqtt6qtt6tww6868  !'!+0@GLL!s   C 1DDc                 \    t        |d      syt        |      dk(  xr t        | |z
        du S )Nr  Fr  rH	  r5  s     r   rI	  zRect.__eq__*  s0    tY'4yA~<$td{"3u"<<r   c                 d    | j                   | j                  | j                  | j                  f|   S r   r  r  r  r  rL	  s     r   r  zRect.__getitem__*  rz  r   c                 *    t        t        |             S r   rC  r\   s    r   r	  zRect.__hash__+  rD  r   Np0r  r  r  r  r  c          
          t        |||||||d\  }}}}t        |      | _        t        |      | _        t        |      | _        t        |      | _        y)aa  
        Rect() - all zeros
        Rect(x0, y0, x1, y1)
        Rect(top-left, x1, y1)
        Rect(x0, y0, bottom-right)
        Rect(top-left, bottom-right)
        Rect(Rect or IRect) - new copy
        Rect(sequence) - from 'sequence'
    
        Explicit keyword args p0, p1, x0, y0, x1, y1 override earlier settings
        if not None.
        r  N)util_make_rectr%  r  r  r  r  r]   r  r  r  r  r  r  r  s           r   r^   zRect.__init__+  sO     ($2"rVXYBB****r   c                      yr  r    r\   s    r   r  zRect.__len__+  r[	  r   c                     t        |d      rBt        | j                  |z  | j                  |z  | j                  |z  | j
                  |z        S t        |       }|j                  |      }|S rJ  )r  r   r  r  r  r  r+
  )r]   rA  r   s      r   r^	  zRect.__mul__+  sX    1k"!TWWq[$''A+tww{KKJKKNr   c                 v    t        | j                   | j                   | j                   | j                         S r   )r   r  r  r  r  r\   s    r   r`	  zRect.__neg__"+  r  r   c                 J    t        |       t        |       cxk(  xr dk(   S c  S rW   rD	  r\   s    r   rb	  zRect.__nonzero__%+  rF	  r   c                     t        |d      st        d      t        |       }t        |      dk(  r|j	                  |      S t        |      dk(  r|j                  |      S t        d      )Nr  r  rr   r  )r  r   r   r'  include_pointinclude_rect)r]   r  r   s      r   __or__zRect.__or__(+  s_    q)$_--Jq6Q;??1%%q6Q;>>!$$))r   c                     t        |       S r   r   r\   s    r   rd	  zRect.__pos__2+  r  r   c                 0    dt        t        |             z   S )Nr   rf	  r\   s    r   r   zRect.__repr__5+  r  r   c                     t        |      }|dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y t        d      r  )r%  r  r  r  r  r  ri	  s      r   rj	  zRect.__setitem__8+  sg    !H!VqTW  !VqTW
 	 !VqTW  !VqTW  122r   c                 l   t        |d      rBt        | j                  |z
  | j                  |z
  | j                  |z
  | j
                  |z
        S t        |      dk7  rt        d      t        | j                  |d   z
  | j                  |d   z
  | j                  |d   z
  | j
                  |d   z
        S r  r  r<  s     r   rl	  zRect.__sub__B+  rn  r   c                 .   t        |d      rNt        | j                  dz  |z  | j                  dz  |z  | j                  dz  |z  | j
                  dz  |z        S t        |      d   }|st        d|       t        |       }|j                  |      }|S )Nr   rV  r   zMatrix not invertible: )	r  r   r  r  r  r  ro	  rp	  r+
  )r]   rA  r  r   s       r   rr	  zRect.__truediv__I+  s    1k""Q"Q"QRTUVWW"1%#&=aS$ABBJKKOr   c                 B    t        | j                  | j                        S zBottom-left corner.r  r  r  r\   s    r   r`  zRect.bottom_leftS+       TWWdgg&&r   c                 B    t        | j                  | j                        S zBottom-right corner.r  r  r  r\   s    r   r]  zRect.bottom_rightX+  r  r   c                 $    | j                  |      S )z.Check if containing point-like or rect-like x.)r  rs  s     r   containszRect.contains]+        ##r   c                 H    t        d| j                  | j                  z
        S rW   r  r  r  r\   s    r   r  zRect.heighta+      1dgg'((r   c                     t        |      dk7  rt        d      t        | |      \  | _        | _        | _        | _        | S )zExtend to include point-like p.rr   r:  )r'  r   util_include_point_in_rectr  r  r  r  r<  s     r   r  zRect.include_pointe+  s;    q6Q;122-Ga-P*$'47r   c                    t        |      dk7  rt        d      t        |      }|j                  s| j                  r1t        t        t
        t
        f\  | _        | _        | _        | _	        | S |j                  r| S | j                  rI|j                  |j                  |j                  |j                  f\  | _        | _        | _        | _	        | S t        | |      \  | _        | _        | _        | _	        | S )zExtend to include rect-like r.r  r  )r'  r   r   r	  rq  rr  r  r  r  r  r	  util_union_rectr  s     r   r  zRect.include_rectl+  s    q6Q;011G==D,,1@/Sbds1s.DGTWdgtw  ZZK]]12qttQTT1441G.DGTWdgtw  2Aq1I.DGTWdgtwr   c                 $   t        |      dk(  st        d      t        |      }|j                  r| S | j                  rI|j                  |j
                  |j                  |j                  f\  | _        | _        | _        | _        | S |j                  rI|j                  |j
                  |j                  |j                  f\  | _        | _        | _        | _        | S | j                  r| S t        | |      \  | _        | _        | _        | _        | S )z)Restrict to common rect with rect-like r.r  r  )
r'  r   r   r	  r  r  r  r  r	  util_intersect_rectr  s     r   r  zRect.intersect{+  s    1v{011G==K12qttQTT1441G.DGTWdgtw  ZZ12qttQTT1441G.DGTWdgtw
 	 ]]K1DT11M.DGTWdgtwr   c                     t        |      }| j                  s$| j                  s|j                  s|j                  ryt        |       }|j                  |      j                  ryy)z4Check if intersection with rectangle x is not empty.FT)r   r	  r	  r  r  s       r   
intersectszRect.intersects+  sI    !W==D,,r~~J;;r?##r   c                 j    | j                   | j                  k\  xs | j                  | j                  k\  S z True if rectangle area is empty.r  r  r  r  r\   s    r   r	  zRect.is_empty+  )     ww$''!7TWW%77r   c                     | j                   | j                  cxk(  xr	 t        k(  nc xr( | j                  | j                  cxk(  xr	 t
        k(  S c S )z'True if this is the infinite rectangle.r  r  rq  r  r  rr  r\   s    r   r	  zRect.is_infinite+  9     ww$''4_4^DGG9^9^^9^^r   c                 j    | j                   | j                  k  xr | j                  | j                  k  S zTrue if rectangle is valid.r  r\   s    r   is_validzRect.is_valid+  )     ww$''!8dgg&88r   c                 f    | j                   r
t               S | j                  j                  ||      S zGMorph with matrix-like m and point-like p.

        Returns a new quad.r	  r  r  r  r]   rd  rA  s      r   r  z
Rect.morph+  *      ?"yyq!$$r   c           	      j    t        j                  t        | D cg c]  }||z  	 c}            S c c}w r   r5	  r9	  s     r   r	  z	Rect.norm+  r;	  r<	  c                     | j                   | j                  k  r#| j                   | j                  c| _        | _         | j                  | j                  k  r#| j                  | j                  c| _        | _        | S )z*Replace rectangle with its finite version.r  r\   s    r   r  zRect.normalize+  W    77TWW#wwDGTW77TWW#wwDGTWr   c                 n    t        | j                  | j                  | j                  | j                        S z!Return Quad version of rectangle.r  r  trblr  r\   s    r   r  z	Rect.quad+  %     DGGTWWdggtww77r   c                 *    t        t        |             S )zReturn the IRect.)r\  util_round_rectr\   s    r   rP	  z
Rect.round+  s    _T*++r   c                 B    t        | j                  | j                        S zTop-left corner.r  r  r  r\   s    r   r\  zRect.top_left+  r  r   c                 B    t        | j                  | j                        S zTop-right corner.r  r  r  r\   s    r   r_  zRect.top_right+  r  r   c           	         t        |      }| j                  s$| j                  s|j                  s|j                  rt        d      t	        dddd| j
                   | j                         t	        |j                  | j                  z  |j                  | j                  z        z  t	        dddd|j
                  |j                        z  S z+Return matrix that converts to target rect.z'rectangles must be finite and not emptyr   r   	r   r	  r	  r   r5  r  r  r  r  r  s     r   torectzRect.torect+  s     Gt}}FGG1aAx$''2QWWtzz)188dkk+ABCQ1aqtt,-	
r   c                     t        |      dk(  st        d      t        | |      \  | _        | _        | _        | _        | S )z1Replace with the transformation by matrix-like m.r   r?	  )r'  r   util_transform_rectr  r  r  r  r  s     r   r+
  zRect.transform+  s;    1v{233-@q-I*$'47r   c                 H    t        d| j                  | j                  z
        S rW   r  r  r  r\   s    r   r  z
Rect.width+  r  r   )2r`   ra   rb   r:	  rA	  r  rE	  r  rI	  r  r	  r^   r  r^	  r`	  rb	  r  rd	  r   rj	  rl	  rr	  r  r`  r]  r  r  r  r  r  r  r	  r	  r  r  r	  r  r  rP	  r\  r_  r  r+
  r  r	  r  r  r  r  r  r    r   r   r   r   *  s   9
T1"=
7! "&$4DTd &<1*)T ' ' ' '$ ) )" 8 8 _ _ 9 9%3 8 8, ' ' ' '

 ) ) G	B	BUOE	B	Br   r   c            %       
   e Zd ZdZdefdZd;deddfdZded	e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fdZdej                  eef   fdZdefdZdefdZdefdZ	 d;dedede
defdZ	 d<ded	efdZ	 d<ded	ede
fd Z	 	 	 	 	 	 	 	 	 	 	 	 d=d!e
d"ed#ed$ed%ed&ed'ed(ed)ed*e
d+e
d,eddfd-Zed.        Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d>ded/ej                  e ef   d0e
d1e!d2e d3ed4ed5ed"ed#ed6ed7e
d8ed(ed+e
d*e
d,edef$d9Z"d: Z#y)?ShapezCreate a new shape.r   c                    t        |       || _        |j                  | _        | j                  j                  st        d      |j                  j                  | _        |j                  j                  | _
        |j                  j                  | _	        |j                  j                  | _        |j                  | _        | j                   | _        d| _        d| _        d| _        d | _        d | _        y )Nr  r(   )r&  r   r   r   r  r   r(  r  r  r  r  rl  r+  pctmipctmr9
  	text_cont	totalcontr8
  r   rQ  s     r   r^   zShape.__init__+  s    D	;;xx[))((**''))
&&((&&((..	iiZ
	r   r
  r  Nc                    t        | j                         | xj                  | j                  z  c_        | j                  j	                         | _        | j                  dk7  rLt
        j                  | j                  d|      }t        j                  | j                  || j                         d| _
        d| _        d| _        d| _        d| _        y)z
        Update the page's /Contents object with Shape data. The argument
        controls whether data appear in foreground (default) or background.
        r   r  Nr(   )r&  r   r  r  r{  r   r  rf   pdf_update_streamr   r8
  r   r9
  )r]   r
  r   s      r   commitzShape.commit,  s    
 	DII$..(..0>>S ))$))T7CD##DHHdDNNC	r   r  r  p3p4c                    t        |      }t        |      }t        |      }t        |      }| j                  |k(  s9t        || j                  z        }| xj                  t        |       dz  c_        t        t        || j                  z        t        || j                  z        z   t        || j                  z        z         }| xj                  t        |       dz  c_        | j                  |       | j                  |       | j                  |       | j                  |       || _        | j                  S )z#Draw a standard cubic Bezier curve. m
 c
)r  r8
  JM_TUPLEr  r9
  rv   rt   
updateRect)r]   r  r  r  r  r  s         r   draw_bezierzShape.draw_bezier,  s     2Y2Y2Y2Y2%BO,DNN4 166NR$**_-R$**_0EERRVR\R\_H]]^Yt_-T22r   r  radiusc                 x    |t         kD  st        d      t        |      }||dfz
  }| j                  ||dd      S )z*Draw a circle given its center and radius.zradius must be postiver   rk  F)
fullSector)ry	  r   r  draw_sector)r]   r  r  r  s       r   draw_circlezShape.draw_circle1,  sG    566vvqk!CEBBr   c                     d}t        |      }t        |      }t        |      }|||z
  |z  z   }|||z
  |z  z   }| j                  ||||      S )z4Draw a curve between points using one control point.7.SQ?)r  r  )r]   r  r  r  kappak1k2s          r   
draw_curvezShape.draw_curve9,  sa     2Y2Y2Y27e##27e##BB//r   c                    t        |      }t        |      }| j                  |k(  sO| xj                  t        t	        || j
                  z              dz   z  c_        || _        | j                  |       | xj                  t        t	        || j
                  z              dz   z  c_        | j                  |       || _        | j                  S )zDraw a line between two points.r   l
)r  r8
  r9
  rv   r  r  r  )r]   r  r  s      r   	draw_linezShape.draw_lineH,  s    2Y2Y2%NNidjj(ABVKKN DOOOB)HR$**_$=>GGr   tetrac                    t        |      dk7  rt        d      t        |d   d      rt        |      j                  }nt        |      }|j                  |j                  |j                  z
  dz  z   }|j                  |j                  |j                  z
  dz  z   }|j                  |j                  |j                  z
  dz  z   }|j                  |j                  |j                  z
  dz  z   }| j                  |k(  s>| xj                  t        t        || j                  z              dz   z  c_        || _
        | j                  ||j                  |       | j                  ||j                  |       | j                  ||j                  |       | j                  ||j                  |       | j!                  |j"                         || _
        | j                  S )z"Draw an ellipse inside a tetrapod.r  zinvalid arg lengthr   r         ?r  )r'  r   r  r   r  r  rw  r  r  r  r8
  r9
  rv   r  r  r  r  r   )r]   r"  ri
  mtmrr	  mls          r   	draw_ovalzShape.draw_ovalV,  sd   u:?12258[)U  AUATTQTTADD[C''TTQTTADD[C''TTQTTADD[C''TTQTTADD[C''2%NNidjj(ABVKKN DOADD"%ADD"%ADD"%ADD"%r   r  c           
         t        |      D ]  \  }}|dk(  ri| j                  t        |      k(  s| xj                  t	        t        t        |      | j                  z              dz   z  c_        t        |      | _        n@| xj                  t	        t        t        |      | j                  z              dz   z  c_        | j                  |        t        |d         | _        | j                  S )z%Draw several connected line segments.r   r  r   rY  )r  r8
  r  r9
  rv   r  r  r  )r]   r  r  rd  s       r   draw_polylinezShape.draw_polylinen,  s    f% 	DAqAv583NNiqDJJ9N0O&PSY&YYN&+AhDO)HU1X

5J,K"Lv"UUOOA	  r
+r   r  c                     t        |      }| j                  |j                  |j                  |j                  |j
                  |j                  g      S )zDraw a Quad.)r  r*  rw  r  r  r  )r]   r  ri
  s      r   	draw_quadzShape.draw_quad|,  s;    J!!144qttQTT144"@AAr   r   c                 >   t        |      }t        t        |j                  | j                  z        |j
                  |j                  gz         }| xj                  t        |      dz   z  c_        | j                  |       |j                  | _        | j                  S )zDraw a rectangle.z re
)r   r  rt   r  r  r  r  r9
  rv   r  r  r8
  )r]   r   r   r  s       r   	draw_rectzShape.draw_rect,  sq    JQTTDJJ./177AHH2EEF)D/G33$$r   r  betar  c                 v   t        |      }t        |      }d }d }d }t        j                  |       }t        j                  t        j                  d|            dz  }	t        j                  t        j                  d|            }
|
dz  }t	        |      dt        j
                  z  kD  r%||	z  }t	        |      dt        j
                  z  kD  r%| j                  |k(  s8| xj                   |t        || j                  z              z  c_        || _        t        dd      }|}|}||z
  }t	        |      }|t        kD  st        d	      | j                  ||      }t	        |      t	        |
      kD  r|j                  t        j                  ||
z         |z  z   }|j                  t        j                   ||
z         |z  z   }t        ||      }|j                  t        j                  ||z         |z  t        j                  |      z  z   }|j                  t        j                   ||z         |z  t        j                  |      z  z   }t        ||      }d
t        j                  |      z
  dz  dz  t	        ||z
        z  }|t	        ||z
        z  }|||z
  |z  z   }|||z
  |z  z   }| xj                   |t        t#        || j                  z        t#        || j                  z        z   t#        || j                  z        z               z  c_        ||
z  }||
z  }|}t	        |      t	        |
      kD  rt	        |      dkD  r|dz  }|j                  t        j                  ||z         |z  z   }|j                  t        j                   ||z         |z  z   }t        ||      }|j                  t        j                  ||z         |z  t        j                  |      z  z   }|j                  t        j                   ||z         |z  t        j                  |      z  z   }t        ||      }d
t        j                  |      z
  dz  dz  t	        ||z
        z  }|t	        ||z
        z  d
t        j                  |      z
  z  }|||z
  |z  z   }|||z
  |z  z   }| xj                   |t        t#        || j                  z        t#        || j                  z        z   t#        || j                  z        z               z  c_        |r| xj                   |t        || j                  z              z  c_        | xj                   |t        || j                  z              z  c_        | xj                   |t        || j                  z              z  c_        || _        | j                  S )zDraw a circle sector.c                 "    t        | |f      dz   S )Nr  rv   r   r  s     r   l3zShape.draw_sector.<locals>.l3,      aV$v--r   c                 *    t        | |||||f      dz   S )Nr  r2  rK	  s         r   l4zShape.draw_sector.<locals>.l4,  s    aAq!Q/0699r   c                 "    t        | |f      dz   S )Nr   r2  r3  s     r   l5zShape.draw_sector.<locals>.l5,  r5  r   rk  rY  rl  rr   r   zradius must be positiver   r  r   MbP?)r  r6	  rO	  copysignr  pir8
  r9
  r  r  ry	  r   horizontal_angler  rQ	  r  rR	  rt   )r]   r  r  r/  r  r4  r7  r9  betarw360w90w45r   r  r  r	  r|	  alfaq1q2r  r  r  kappahr  cp1cp2beta2s                               r   r  zShape.draw_sector,  s    ve	.	:	.dU#||DMM#u56"=ll4==U34Ag%j1tww;&TME %j1tww;&5(NNb%$***<!=>>N#DO!QKE!fW}677$$VU3%j3s8#txxs
+c11Btxxs
+c11Bb"Atxxs
+c1DHHSMAABtxxs
+c1DHHSMAABb"A$((3-'1,q03q1u:=FSQZ'Eq1uo%Cq1uo%CNNbS4::%&cDJJ.>)??$q4::~BVV"  N SLECKDA# %j3s8#& u:AIEtxxu-33Btxxu-33Bb"Atxxu-3dhhuoEEBtxxu-3dhhuoEEBb"A$((5/)Q.2SQZ?FSQZ'1txx+>?Eq1uo%Cq1uo%CNNbS4::%&cDJJ.>)??$q4::~BVV"  N NNb%$***<!=>>NNNb&4::*=!>??NNNb!djj.!9::Nr   c                 l   t        |      }t        |      }||z
  }t        |      }dt        t        |d|z  z  d            z  }|dk  rt	        d      ||z  }t        t        j                  ||            }| }	d}
g }t        d|      D ]V  }|dz  dk(  rt        ||
       |z  }n'|dz  dk(  rt        ||
      |z  }nt        |d      |z  }|j                  ||	z         X |g|z   |gz   }t        |      }d}|dz   |k  r0| j                  ||   ||dz      ||dz             |dz  }|dz   |k  r0|S )z#Draw a squiggly line from p1 to p2.r  r   points too closegh?3OP@r   r   rr   )r  r  r   rP	  r   r5  r   _hor_matrixr  r6   r'  r  )r]   r  r  breadthr	  r|	  r  r	  r  i_matrr  r  r  rd  s                 r   draw_squigglezShape.draw_squiggle,  sf    2Y2YG!f#eC1w;/3447/003Y))"b12q# 	%A1uz!aRL2%Q!!QK"$!QK"$MM!e)$	% "%&k!eckOOF1Iva!e}fQUmDFA !eck 	r   rL  c                    t        |      }t        |      }||z
  }t        |      }dt        t        |d|z  z  d            z  }|dk  rt	        d      ||z  }t        t        j                  ||            }| }	g }
t        d|      D ]G  }|dz  dk(  rt        |d      |z  }n|dz  dk(  rt        |d      |z  }n4|
j                  ||	z         I | j                  |g|
z   |gz          |S )z%Draw a zig-zagged line from p1 to p2.r  r   rJ  r   rY  r   )r  r  r   rP	  r   r5  r   rK  r  r6   r*  )r]   r  r  rL  r	  r|	  r  r	  r  rM  r  r  rd  s                r   draw_zigzagzShape.draw_zigzag,  s    2Y2YG!f#eC1w;/3447/003Y))"b12q# 	%A1uz!RL2%Q!!QK"$MM!e)$	% 	B4&=B4/0	r   r  r  r   r  r  r  r  r  r  r  r  r  c           
      v   | j                   dk(  ry|dk(  rd}n|d}t        |d      }t        |d      }| j                  j                  |      }|d|z  | j                   z   | _         d}nd}| j                  j	                  ||
      }|d	|z  | j                   z   | _         |d
k7  r&|dk7  r!| xj                   t        |      dz   z  c_         |dk7  rd|z  | j                   z   | _         |dk7  rd|z  | j                   z   | _         |dvrd|z  | j                   z   | _         |	r| xj                   dz  c_         d| _        || xj                   |z  c_         |s| xj                   |z  c_         |.|s| xj                   dz  c_         nY| xj                   dz  c_         nC|s| xj                   dz  c_         n+| xj                   dz  c_         n| xj                   dz  c_         | xj                   |z  c_         t        |      rt        d
ddd
|d   j                  | j                  z   | j                  |d   j                  z
  | j                  z
        }| |d
   z  |z  }t        t        |      | j                   z         dz   | _         | xj                  d| j                   z   dz   z  c_        d| _         d| _        y)zFinish the current drawing segment.

        Notes:
            Apply colors, opacity, dashes, line style and width, or
            morphing. Also whether to close the path
            by connecting last to first point.
        r(   Nr   rs  r  /OC /%s BDC
EMC
r   r   /%s gs
r    w
z%i J
z%i j
)Nr(   [] 0z%s d
zh
zB
zB*
zf
zf*
zS
 cm
r
  Q
)r9
  rz  r   r
  r  rv   r8
  
CheckMorphr5  r  r  r  r  r  )r]   r  r  r   r  r  r  r  r  r  r  r  r  	color_strfill_stroptcontemcr  rX	  r6  s                       r   finishzShape.finish-  sv   , >>RA:E]E eS)	T3'))11"5,w6GDNCC		&&.\&J'%/$..@DNA:%1*NNi.77Na<%/$..@DNq=%04>>ADN++%.?DNNNe#N"DONNi'NNNh&N NNe+NNNf,NNNe+NNNf,NNNe#N#e1aE!HJJ/uQxzz1IDFF1RB #a.2%C&x}t~~'EFPDN'DNN2U::r   c                 B   t        || z
        j                  }t        j                  t	        |j
                              }|j                  dk  r:|j
                  dk  rt        j                  |z
   }|S t        j                  |z
  }|S |j
                  dk\  r	 |S | }|S )zReturn the angle to the horizontal for the connection from C to P.
        This uses the arcus sine function and resolves its inherent ambiguity by
        looking up in which quadrant vector S = P - C is located.
        r   )r  ra  r6	  asinr  r  r  r<  )r  r  r	  rB  s       r   r=  zShape.horizontal_angleu-  s     !a%LyyQSS"337ssax4(  ww~ 	 ssax  ur   r   r   r=  r   r  r
  r  render_moder	  r  c           
      	   t        |      syt        |      t        t        fvr|j	                         }n|}t        |      dkD  syt        |      }	 t        dj                  |      D cg c]  }t        |       c}      }|}|j                  d      r|dd  }| j                  j                  ||||      }t        | j                   |      }|d   }|d   }|d   }|d   }|d	   }|d
   }|r||z  }n||z
  dk  r|dz  }n|||z
  z  }|dkD  r | j                   j#                  ||dz         }n|d   }g } |D ]*  }!|r|dvrd }"n|}"| j%                  t'        |!|"||             , | }t)        |	d      }#t)        |
d      }$|
s|dk(  r|	}
t)        |	d      }$t+        |      }%|}&|&dz  dk7  rt-        d      |&dk  r|&dz  }&|&dk  r|&dz  }&d }'d }(d})d}*d}+| j.                  },| j0                  }-|%rkt3        dddd|d   j4                  | j4                  z   |,|d   j6                  z
  | j6                  z
        }.|. |d   z  |.z  }/t9        t;        |/            dz   }0nd}0|,|j6                  z
  | j6                  z
  }1|j4                  | j4                  z   }2|1}3|&dk(  rJ|,|j6                  z
  | j6                  z
  }2|j4                   | j4                  z
  }1|0|)z  }0|-t=        |1      z
  }3n|&dk(  rG|, |j6                  z   | j6                  z   }2|j4                  | j4                  z   }1|0|*z  }0t=        |1      }3nc|&dk(  r^|j4                   | j4                  z
  }2|, |j6                  z   | j6                  z   }1|0|+z  }0t=        |j6                  | j6                  z         }3| j                  j?                  |      }4|4d|4z  }5d}6ndx}5}6| j                  jA                  ||      }7|7d}7nd |7z  }7 |'|5|7|0|2|1||      }8|dkD  r|8d!|z  z  }8|dk7  r|8t9        |      d"z   z  }8|	|8|#z  }8|
|8|$z  }8|8|d   z  }8d}9t        |      dkD  r|8 |(|      z  }8n|8d#z  }8tC        dt        |            D ](  }:|3|k  r n!|:dkD  r|8d$z  }8|8||:   d#z   z  }8|3|z  }3|9dz  }9* |8d%|6z  z  }8| xjD                  |8z  c_"        |9S c c}w # t        $ r t                Y yw xY w)&Nr   rl   rW  r   )r   r  r  r
  rW  simpler   r  r  333333?r  glyphs)SymbolZapfDingbatsrs  r  rl  zbad rotate valuerk  c                 @    d|  | d| dt        ||f       d| d| dS )Nr
  zBT
%1 0 0 1 z Tm
/rl   z Tf r2  r   r  rs  r  r   r  r	  s          r   ri  z#Shape.insert_text.<locals>.<lambda>-  s?    uQCs%s(9VWYZU[K\J]]cdecffghigjjn-o r   c                      dt        |        dS )NzTJ
0 -z TD
r2  r   s    r   ri  z#Shape.insert_text.<locals>.<lambda>-  s    WYq\N%8 r   z0 1 -1 0 0 0 cm
z0 -1 1 0 0 0 cm
z-1 0 0 -1 0 0 cm
rX  r(   r  rb  rR  rS  rT  rU  z%i Tr z w TJz
T* z
ET
%sQ
)#r  r   rt   ru   r  r'  r  r  r  r  r   rF   r   r   r  r  r   r  r6   getTJstrrz  rZ  r   r  r  r5  r  r  rv   r  r  r
  r  r  r  );r]   r  r   r   r=  r   r  r
  r  r  r   rb  r	  r  r  r  r  r  r:   rs  maxcoder  r   fontinfor  rW  rd  rU  r  r  lheightrf  tabr   r	  r[  r\  morphingr  templ1templ2cmp90cmm90cm180r  r  rX	  r6  rZ  topr  spacer]  bdcr^  r  r
  nlinesr  s;                                                              r   r  zShape.insert_text-  s_   * G}=u-%%'DD4y1}e	388D>:a3q6:;G C !"IEyy$$!!%	 %  !40A;J'(#&!J'[)	+G	!Q&nG(Y"67GS=XX--dGaK@Fh'F 	9A&(BBJJx1fh78	9 eS)	T3'q(D ,He$8q=/00Ag3JC AgCio8##$

 1aE!HJJ$7%(**9Ltvv9UVB#a.2%C8C=)G3BBuww'ww"9EGG#dff,D77(TVV#C%KBCH$ECZ7UWW$tvv-D''DFF"C%KBHECZGG8dff$D'EGG#dff,C%KB$&&()E))11"5!G+CCNC#		&&.\&J=E&Ec5"dCA?H{**D1Il+e33DIDHD
 	Qt9q=F7O#DDLDq#d)$ 	Aw1uDGdN"DWEaKF	 	## 	$a ; 		s$   R/ *R*<R/ *R/ /SSc                 X   | j                   1t        |      dk(  rt        ||      | _         y t        |      | _         y t        |      dk(  rt        |      }t	        | j                   j
                  |j                        | j                   _        t	        | j                   j                  |j                        | j                   _        t        | j                   j                  |j                        | j                   _
        t        | j                   j                  |j                        | j                   _        y t        |      }t	        | j                   j
                  |j
                        | j                   _        t	        | j                   j                  |j                        | j                   _        t        | j                   j                  |j                        | j                   _
        t        | j                   j                  |j                        | j                   _        y rH  )r   r'  r   r  r  r  r  r  r  r  r  r  rs  s     r   update_rectzShape.update_rect=.  s<   991v{ AJ	 G	1v{!H"499<<5		"499<<5		"499<<5		"499<<5		G"499<<6		"499<<6		"499<<6		"499<<6		r   r`  )rr   )r   r  Nr   r   NFNTr   r   r   )r  NrQ  Nr   r   NNr   r   r   Nr   r   r   )$r`   ra   rb   r	  r   r^   r  r  r~   r  r%  r  r  r!  rp  rq  r   r   r(  rt   r*  r,  r.  r  rN  rP  r  r   r  r_  r  r=  r   r  r  r  r    r   r   r  r  +  s,   T (d d .  	
 0C* Ce C00 0 	0J J v||Iy,@A 0D Bi B
i   $KK K 	K
 Kb 	## #R 	  	>  !" ""#$%YY Y 	Y
 Y Y Y Y Y Y  Y "Y Y Yv  . !#'"#   "# $%"#%rr \\#t),r 	r
 !r r r r r r r r  r r r  "!r"  #r$ %r& 'rh7r   r  c                       e Zd ZddZd Zed        Zed        Zd Z	ddZ
ddZd	 Zd
 ZddZedd       Zedd       ZddZ G d d      ZddZddZddZddZy)StoryNc                 b   t        j                  |j                  d            }|rt        |t              st	        |      }|r|j
                  nt        j                  d       }t        t         d      rt        j                  ||||      | _        y t        j                  ||||      | _        y )Nr  FzStoryS)
rf   rb  r{  rs   r  r   r  r  r  FzStory)r]   htmluser_cssemr  r   archs          r   r^   zStory.__init__T.  s}    66G8LM:gw7g&G&w||EOOT,B5*%2tDDIw"dCDIr   c                 (   | j                   }d}|j                  ddd      }|ro|j                  }t        |      dk(  r>|d   dk(  r6|d   dv r/|j	                  d      }|sd| }|j                  d|       |dz  }|j                  ddd      }|rnyy)	zt
        Look for `<h1..6>` items in `self` and adds unique `id`
        attributes if not already present.
        r   Nrr   r  r   123456r  h_id_)r[  ri   rl  r'  r  r  r  )r]   domr  r  r   attrid_s          r   add_header_idszStory.add_header_ids^.  s    
 iiHHT4&99D4yA~$q'3,47h3F,,T2!!+COOD#.FAD$-A r   c                    t        | t              r| }nt        d|       }t               }|D ]=  }|j                  dz  s|j                  s |j                  |v r/|||j                  <   ? |D ]  }|j                  dz  s|j
                  s!t               }t        |j                        |d<   |j
                  j                  d      rR|j
                  dd }	 ||   }	 t        |d<   |j                  \  }
}}}t        |
|      |d	<   |j                   dz
  |d
<   nO|j
                  j                  d      rt"        |d<   |j
                  dd |d<   nt$        |d<   |j
                  |d<   ||j                   dz
     j'                  |       " |S # t        $ r*}	t        dkD  r
t                t        d| d|       |	d}	~	ww xY w)a  
        Adds links to PDF document.
        Args:
            document_or_stream:
                A PDF `Document` or raw PDF content, for example an
                `io.BytesIO` instance.
            positions:
                List of `ElementPosition`'s for `document_or_stream`,
                typically from Story.element_positions(). We raise an
                exception if two or more positions have same id.
        Returns:
            `document_or_stream` if a `Document` instance, otherwise a
            new `Document` instance.
        We raise an exception if an `href` in `positions` refers to an
        internal position `#<name>` but no item in `postions` has `id =
        name`.
        r  r   r  r	  NzNo destination with id=z, required by position_from: r	  r  r   zname:r
   r   r  )rs   r   r   
open_closer  r  r   r   r   r   r   rF   r   r>   r	  r  page_numr	  r	  r  )document_or_stream	positionsr   id_to_positionpositionposition_fromr  	target_idposition_tor   r  r  r  r  s                 r   add_pdf_linkszStory.add_pdf_linksq.  s   & ((3)H'9:H
 ! 	<H##a'X[[;;.03;NHKK0	< ' (	GM((1,-2D2D v#M$6$67V %%005 - 2 212 6IE&4i&@ 
 $-DL%0%5%5NBB "'r2DJ#.#7#7!#;DL %))44W='1V'4'9'9!"'=V'/V&3&8&8U //!34@@FQ(	GT ; % E/!38H*-DYKOlmzl{+|}  DE  EEs   F	G%GGc                 B    | j                         }|j                         S r   )r   r  r]   r  s     r   r[  z
Story.body.  s    mmo{{}r   c                 V    t        j                  | j                        }t        |      S r   )rf   fz_story_documentr   rY  r  s     r   r   zStory.document.  s     %%tyy1Cyr   c                     t        |      }|r|j                  nt        j                  d       }t        j                  | j                  ||       y r   )r  r   rf   r  fz_draw_story)r]   r  r  ctm2r
  s        r   drawz
Story.draw.  s8     &)#fkk)>TYYT2r   c                 d   t              t        u rFj                         D ]2  }t        |      t        u r|j	                         r%t        d| d       ni t              rj                  j                  dk7  rt        d      fd}t        j                  | j                  |       y)zU
        Trigger a callback function to record where items have been placed.
        zinvalid key 'r   r   z@callback 'function' must be a callable with exactly one argumentc                     G d d      } |       }| j                   |_         | j                  |_        | j                  |_        t        | j                        |_        | j
                  |_        | j                  |_        | j                  |_        | j                  |_	        r%j                         D ]  \  }}t        |||         |       y )Nc                       e Zd Zy)=Story.element_positions.<locals>.function2.<locals>.Position2Nr`   ra   rb   r    r   r   	Position2r  .  s    r   r  )r5  headingr  r'  r   r:   r  rectangle_numrect_numr  rn  setattr)r  r  	position2rr  rM   r  r5   s        r   	function2z*Story.element_positions.<locals>.function2.  s     !I&nnIO ( 0 0I#;;IL,X]];IN%]]IN#+#6#6I !)!7!7I%]]IN JJL .DAqY1-.i r   N)r   r   r  r   isidentifierr   r  __code__co_argcountrf   fz_story_positionsr   )r]   r5   r  rr  r  s    ``  r   element_positionszStory.element_positions.  s     :YY[ ;Q31>>+;$}QCq%9::; D!X%6%6%B%Ba%G_``	!  	  $))Y7r   c                     t        |      }t        j                         }t        j                  | j                  ||      }|t        |      fS r   )r  rf   r(  fz_place_storyr   r'  )r]   wherefilledmores       r   placezStory.place.  s?    '##TYYv>_f---r   c                 B    t        j                  | j                         y r   )rf   fz_reset_storyr   r\   s    r   r
  zStory.reset.  s    dii(r   c                    d }dd}t        dddd      }	  |||      \  }}	}
|dz  }|rdz  | j                  |	      \  }}rfd}| j                  |       |rq|r=|r|r |||d       |j                          |j	                  |      }|r |||d       | j                  ||
       |s0|r |||d       |j                          n| j                  d |
       |sy )Nr   r   c                 $    | _          |        y r   )r  )r  r  
positionfns    r   positionfn2z Story.write.<locals>.positionfn2	/  s     )1H%x(r   )r   r  r  r  r  r  )r]   writerrectfnr  pagefnr
  r  r  r  r   r  r  r  r  s      `         @r   r;  zStory.write.  s   aAq!"(6":HdCMHA::t,LD&)
 &&{3!"8XsA>) ++X6Cx3:		3$(C;OO%		$$A r   c	                     t               d }		 |	}
 |      }	d|	|
k(  rd|	}t        ||||      }|r|j                          t               fd}|j                  r| nd |||       ry b)NFTc                 D    j                  |        rr	 |        y y y r   r6   )r  r  r  stables    r   r  z+Story.write_stabilized.<locals>.positionfn25/  s%      *jx( )6r   )rt   r  r  r;  )r  	contentfnr  r  r  r  r  r  r  r/  content_prevcontent2storyr  r  r  s        `        @@r   write_stabilizedzStory.write_stabilized#/  s    F	"L+GF,&H(Hb':E$$&I)
 KK$F$	 3 r   c                     t        j                         }t        |      }	g fd}
t        j	                  |	| ||||
|||	       |	j                          |j                  d       t        j                  |      S )Nc                 >    j                  |        r	 |        y y r   r  r  r  r  s    r   r  z6Story.write_stabilized_with_links.<locals>.positionfn2I/  !    X&8$ r   r   )r.  r/  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  r|  r  r  r  s       `      @r   write_stabilized_with_linksz!Story.write_stabilized_with_linksC/  sn     '		%
 	vy&(BU[]dftuA""6955r   c                     t        j                         }t        |      }g fd}| j                  ||||       |j	                          |j                  d       t        j                  |      S )Nc                 >    j                  |        r	 |        y y r   r  r  s    r   r  z+Story.write_with_links.<locals>.positionfn2X/  r  r   )r  r  r   )r.  r/  r  r;  r  r  r  r  )r]   r  r  r  r|  r  r  r  s     `    @r   write_with_linkszStory.write_with_linksS/  s_    '		%
 	

66k&
IA""6955r   c                       e Zd ZdZddZd Zy)Story.FitResulta  
        The result from a `Story.fit*()` method.
        
        Members:
        
        `big_enough`:
            `True` if the fit succeeded.
        `filled`:
            From the last call to `Story.place()`.
        `more`:
            `False` if the fit succeeded.
        `numcalls`:
            Number of calls made to `self.place()`.
        `parameter`:
            The successful parameter value, or the largest failing value.
        `rect`:
            The rect created from `parameter`.
        Nc                 X    || _         || _        || _        || _        || _        || _        y r   
big_enoughr  r  numcalls	parameterr   )r]   r  r  r  r  r  r   s          r   r^   zStory.FitResult.__init__u/  s,    (DO DKDI$DM&DNDIr   c                     d| j                    d| j                   d| j                   d| j                   d| j                   d| j
                   S )Nz big_enough=z filled=z more=z
 numcalls= parameter= rect=r  r\   s    r   r   zStory.FitResult.__repr__}/  sP    "4??"3t{{mTYYK !$..!1TYYK)r   r  )r`   ra   rb   r	  r^   r   r    r   r   	FitResultr  b/  s    	$		r   r  c                    
 fd
t        t        t        f      sJ t        t        t        f      sJ  G fdd      } |       r# 
dj                  dj                  d        j                          
fd}
 fd	d
 }j                  -r 
d        |j                  d      }		  |	      sn7|	dz  }	 j                        rr 
dj                  d        |       S j                  -r 
d        |j                  d      }		  |	      rn>|	dz  }	 j                        s&d_        r 
dj                  d        |       S r# 
dj                  dj                  d       	 j                  j                  z
  |k  r |       S j                  j                  z   dz  }	 |	       H)aB  
        Finds optimal rect that contains the story `self`.
        
        Returns a `Story.FitResult` instance.
            
        On success, the last call to `self.place()` will have been with the
        returned rectangle, so `self.draw()` can be used directly.
        
        Args:
        :arg fn:
            A callable taking a floating point `parameter` and returning a
            `pymupdf.Rect()`. If the rect is empty, we assume the story will
            not fit and do not call `self.place()`.

            Must guarantee that `self.place()` behaves monotonically when
            given rect `fn(parameter`) as `parameter` increases. This
            usually means that both width and height increase or stay
            unchanged as `parameter` increases.
        :arg pmin:
            Minimum parameter to consider; `None` for -infinity.
        :arg pmax:
            Maximum parameter to consider; `None` for +infinity.
        :arg delta:
            Maximum error in returned `parameter`.
        :arg verbose:
            If true we output diagnostics.
        c                 *    sJ t        d|         y )Nzfit(): rB   )r:   verboses    r   r>   zStory.fit.<locals>.log/  s    N7gdV$%r   Nc                       e Zd Z fdZy)Story.fit.<locals>.Statec                 |    | _         | _        d | _        d | _        d | _        d| _        r| _        | _        y y rW   )pminpmaxpmin_resultpmax_resultr  r  pmin0pmax0)r]   r  r  r  s    r   r^   z!Story.fit.<locals>.State.__init__/  sE     	 	#' #' " !!%DJ!%DJ r   Nr_   )r  r  r  s   r   Stater  /  s    	&r   r  zstarting. state.pmin= state.pmax=rm   c            
         j                   Fj                  j                   k7  r r d        j                         } | sJ j                  }n8j                  rj                  nt        j                  j                        }r2 dj                  dj                  dj                   d|       |S )NzCCalling update() with pmax, because was overwritten by later calls.)r  zfinished. state.pmin0=z state.pmax0=r  z: returning result=)	r  last_pr  r  r  r  r  r  r  )r  r  r>   r
  r  r  s     r   rN   zStory.fit.<locals>.ret/  s    zz%<<5::-ac!'

!3J%%:**.3.?.?**U__^c^l^l_Em-n~]uzzmK_X^W`abMr   c                 
    |       }t        |t              sJ dt        |      d|       |j                  r.d}t        j                  | 	j                        }
r| d       nsj                  |      \  }}	xj                  dz  c_        | }t        j                  ||	j                  | ||      }
r  d	j                  d	d
|d| d|d	       |r| 	_        |	_	        n| 	_
        |	_        | 	_        |S )a  
            Evaluates `more, _ = self.place(fn(parameter))`. If `more` is
            false, then `rect` is big enought to contain `self` and we
            set `state.pmax=parameter` and return True. Otherwise we set
            `state.pmin=parameter` and return False.
            ztype(rect)=r  F)r  r  z9update(): not calling self.place() because rect is empty.r   )r  r  r  r  r   r  zupdate(): called self.place(): z>2dz: more=r  rm   )rs   r   r   r	  r  r  r  r  r  r  r  r  r  )r  r   r  r  r  r  fnr>   r]   r
  r  s         r   r  zStory.fit.<locals>.update/  s    i=DdD)Ckd4j]'D7+CC)}}"
9u~~VSU#zz$/f!#!%X
%!!&"+!#- )  9%..9MXPTwVbXaWccjeidkklmn&
$*!&
$*!$ELr   c                 4    | | dk(  r|S || z  dkD  rd| z  S |  S )z
            Returns same sign as `direction`, larger or smaller than `p` if
            direction is positive or negative respectively.
            r   rr   r    )rd  	directions     r   oppositezStory.fit.<locals>.opposite/  s1    
 yAqD  1}q 1u2Ir   zfinding pmin.rY  r   rr   zstate.pmin=z is big enough.zfinding pmax.z No solution possible state.pmax=z$doing binary search with state.pmin=)rs   r   r%  r  r  r
  )r]   r  r  r  r  r  r  rN   r  r  r>   r
  r  s   ```` `    @@@r   fitz	Story.fit/  s   8	& $e-==$e-==
	& 
	& (UZZM5::-q9:

	#	 #	J		 ::m- R0Ii(Q	 
 ejj!C;5::- ?@u::m- R0I)$Q	 
 %**%!
C"C

}A FGu C?EJJ=%**aPQzzEJJ&.uejj0A5I9	 r   c                 f   	
 |\  }}|z
  
|z
  		
fd}| j                  |||||      S )ao  
        Finds smallest value `scale` in range `scale_min..scale_max` where
        `scale * rect` is large enough to contain the story `self`.

        Returns a `Story.FitResult` instance.

        :arg width:
            width of rect.
        :arg height:
            height of rect.
        :arg scale_min:
            Minimum scale to consider; must be >= 0.
        :arg scale_max:
            Maximum scale to consider, must be >= scale_min or `None` for
            infinite.
        :arg delta:
            Maximum error in returned scale.
        :arg verbose:
            If true we output diagnostics.
        c                 8    t        | z  z   | z  z         S r   r  )scaler  r  r  r  s    r   r  zStory.fit_scale.<locals>.fn60  s&    BU5[ 0"uV|2CDDr   r  )r]   r   	scale_min	scale_maxr  r  r  r  r  r  r  r  r  s            @@@@r   	fit_scalezStory.fit_scale0  sA    * BBRb	ExxIy%AAr   c                 T   	
 |\  
|z   		
fd}| j                  |||||      S )a  
        Finds smallest height in range `height_min..height_max` where a rect
        with size `(width, height)` is large enough to contain the story
        `self`.

        Returns a `Story.FitResult` instance.

        :arg width:
            width of rect.
        :arg height_min:
            Minimum height to consider; must be >= 0.
        :arg height_max:
            Maximum height to consider, must be >= height_min or `None` for
            infinite.
        :arg origin:
            `(x0, y0)` of rect.
        :arg delta:
            Maximum error in returned height.
        :arg verbose:
            If true we output diagnostics.
        c                 &    t        | z         S r   r  )r  r  r  r  s    r   r  zStory.fit_height.<locals>.fnR0  s    BBvI..r   r  )r]   r  
height_min
height_maxoriginr  r  r  r  r  r  s           @@@r   
fit_heightzStory.fit_height:0  s3    , B%Z	/xxJ
E7CCr   c                 T   	
 |\  	|z   
	
fd}| j                  |||||      S )a  
        Finds smallest width in range `width_min..width_max` where a rect with size
        `(width, height)` is large enough to contain the story `self`.

        Returns a `Story.FitResult` instance.
        Returns a `FitResult` instance.

        :arg height:
            height of rect.
        :arg width_min:
            Minimum width to consider; must be >= 0.
        :arg width_max:
            Maximum width to consider, must be >= width_min or `None` for
            infinite.
        :arg origin:
            `(x0, y0)` of rect.
        :arg delta:
            Maximum error in returned width.
        :arg verbose:
            If true we output diagnostics.
        c                 &    t        | z         S r   r  )r  r  r  r  s    r   r  zStory.fit_width.<locals>.fnn0  s    B5"--r   r  )r]   r  	width_min	width_maxr  r  r  r  r  r  r  s           @@@r   	fit_widthzStory.fit_widthV0  s3    , B&[	.xxIy%AAr   )r(   Nr  Nr   rj  )Nr  NNNT)NNr:  F)r   Nr:  F)r   Nr  r:  F)r`   ra   rb   r^   r  r  r  r  r[  r   r  r  r  r
  r;  r  r  r  r  r  r  r  r  r    r   r   r  r  R.  s    D.& R Rh  3
8>.)%N  > 6 66# #JUnB8D8Br   r  c                       e Zd Zd Zd Zd ZddZd ZddefdZ	de
fd	Zdd
Zdde
fdZddefdZdde
fdZd Zdde
fdZd ZddZde
fdZde
fdZd Zed        ZddZeZy)r  c                     t        |t        j                        r |d   }t        j                  |      | _        n3t        |t        j                        r|d   | _        nt        d|       d| _        d | _        y )Nr   Unrecognised args: T)r  rf   r(  r  r   r   r   r   )r]   r  r  s      r   r^   zTextPage.__init__u0  sg    dELL)AwH))84DIe//0QDI1$899r   c                 n   | j                   }t        j                  d      }t        j                  |      }|dk(  rt        j                  ||d       nF|dk(  rt        j
                  ||d       n)|dk(  rt        j                  ||d       nt        ||       |j                          t        |      }|S )Nr  r   r   r   r  )
r   rf   r  r  fz_print_stext_page_as_htmlfz_print_stext_page_as_xmlfz_print_stext_page_as_xhtmlJM_print_stext_page_as_textr  rY  )r]   r  
this_tpager   r  r:   s         r   _extractTextzTextPage._extractText0  s    YY
!!$'nnc" a<--c:qA\,,S*a@\..sJB'Z8%c*r   c                 2    t        | j                  ||       y r   )JM_make_textpage_dictr   )r]   	page_dictrU  s      r   _getNewBlockListzTextPage._getNewBlockList0  s    diiC8r   c                     | j                   j                  | j                   j                  d}| j                  ||       |S )N)r  r  )r   r  r  r  )r]   rU  r  s      r   _textpage_dictzTextPage._textpage_dict0  s4    "iioo9I9IJ	i-r   c                    t         rt        j                  | j                        S d}| j                  }t	        j
                  |j                  j                        }t	        j                  d      }g }|D ]  }|dz  }t	        j
                  t        j
                  j                        }|j                  j                  t        j                  k(  r%t	        j                  |       d}d}	|D ]  }
|dz  }t	        j
                  t        j
                  j                        }|
D ]|  }t        |
|      }t        ||      st	        j                  |      s1t!        ||j                  j"                         |j                  j"                  }	t	        j$                  ||      }~ |	dk7  r+t	        j&                  |      st	        j(                  |d       t	        j$                  ||      } t+        |      }nt        ||j                  j,                        st	        j                  |      r|j/                         }|j1                         }dt	        j2                  |      |j5                         |j7                         |j9                         fz  }t	        j$                  |t	        j
                  |j                  j,                              }t	        j&                  |      rr|j:                  |j<                  |j>                  |j@                  ||j                  j                  f}|jC                  |        |S )z*Return a list with text block information.rY  r  r   r   
   z+<image: %s, width: %d, height: %d, bpc: %d>)"r   r   extractBLOCKSr   rf   r(  r   r  r  Fixed_EMPTYr   FZ_STEXT_BLOCK_TEXTfz_clear_bufferJM_char_bboxJM_rects_overlaprf  JM_append_runers  fz_union_rectre  fz_append_byterY  r   i_imager  ru  r   r  rm  r  r  r  r  r6   )r]   block_nr  tp_rectr   r  block	blockrectline_n	last_charr=   linerectr  cbboxr:   r  r  litems                     r   r  zTextPage.extractBLOCKS0  s   &&tyy11YY
,,z44==>!!$' +	$EqLGU\\%=%=>I$$(A(AA%%c*	! IDaKF$||ELL,D,DEH" H ,T2 6 0% @(-(A(A'(J$&sBMMOO<$&MMOO	#(#6#6x#GH !Bu/E/Eh/O,,S"5 % 3 3Ix HII .c2"7E,<,<,A,AB009mmo^^%D004#'')H  "//	5<<HXHXH]H];^_	)))4!!!!((-- U#W+	$X r   Nr  c                     | j                  d      }||j                  |d<   |j                  |d<   |du r|d   }|j                  d        ||d<   |S )	z>Return page content as a Python dict of images and text spans.FrU  r  r  Tblocksc                 "    | d   d   | d   d   fS Nr   r   r   r    r  s    r   ri  z&TextPage.extractDICT.<locals>.<lambda>0      qy|QvYq\&B r   r  r  r  r  r"  r]   rd  r"  r   r/  s        r   extractDICTzTextPage.extractDICT0  sa    !!e!,>88CLIICM4<]FKKBKC"CM
r   c                 $    | j                  d      S )z%Return page content as a HTML string.r   r  r\   s    r   extractHTMLzTextPage.extractHTML0  r  r   c           	         d}| j                   }g }|D ]  }|dz  }|j                  j                  t        j                  k(  r1|j                         }d}t        dk\  r*t        j                  |      }|rI|j                         }d}n6t        j                  |j                        }|rt        j                  |      }|rt        j                  t        t        t        t              }	t        j                  |	      sJ t        j                  |j!                         dd|j#                         dd      }
t        j$                  ||	|
      \  }}}t        j&                  |      }t)        |      }|dk(  r2|j!                         |j#                         z  |j+                         z  }t        j,                  t        j.                  |j                  j0                              }t3               }||t4        <   t7        |j                  j8                        |t:        <   t=        |j?                               |t@        <   |j!                         |tB        <   |j#                         |tD        <   t        jF                  |      |tH        <   t        jJ                  |      |tL        <   |jO                         |tP        <   |jS                         |tT        <   |jW                         |tX        <   ||tZ        <   |r|d<   |j]                  |        |S )z*Return a list with image meta information.rY  r   r   r  Nr
  )/r   r   r   rf   r  r#  rw   r
  fz_compressed_buffer_sizer_  ll_fz_compressed_buffer_sizer[  rq  rr  r  r2  r   r  rp  r
  r   r?  rh  ll_fz_keep_colorspacer  r   dictkey_numberr'  r   dictkey_bboxr1  i_transformdictkey_matrixro  rp  rx  rq  ru  ru  rz  rs  r{  rt  rm  rr  rx  r6   )r]   hashesr$  r  rh   r&  r  img_size
compr_buffr   rA  r  r   r  r
  r  
block_dicts                    r   extractIMGINFOzTextPage.extractIMGINFO0  sj   YY
 '	"EqLG$$(A(AA--/CH"g-"==cB
)CCEH!%J"@@P
$AA*MHMM/?OUde11!444NN3557Aq#%%'1a@!::31E	Q--c2vq="uuw03557:H##E$?$?@Y@Y$Z[BJ*1J'(78H8H8M8M(NJ%*;E<M<M<O*PJ'),J&*-%%'J'.3.C.CB.GJ*++0+C+CB+GJ((+
J%(+
J%'*wwyJ$(0J%(.
H%IIj!O'	"P 	r   c                    ddl ddl}| j                  d      } G fdd|j                        }||j                  |d<   |j
                  |d<   |d	u r|d
   }|j                  d        ||d
<   |j                  |d|d      }|S )z.Return 'extractDICT' converted to JSON format.r   NFr.  c                       e Zd Z fdZy)'TextPage.extractJSON.<locals>.b64encodec                 r    t        |      t        t        fv rj                  |      j	                         S y r   r   r   r-  	b64encoder8  r]   r)  base64s     r   r   z/TextPage.extractJSON.<locals>.b64encode.default1  3    7ui00!++A.5577 1r   Nr`   ra   rb   r   rN  s   r   rL  rI  1      8r   rL  r  r  Tr/  c                 "    | d   d   | d   d   fS r1  r    r2  s    r   ri  z&TextPage.extractJSON.<locals>.<lambda>#1  r3  r   r  r	  r+   r   
separatorsr  rK  rN  jsonr  JSONEncoderr  r  r"  dumpsr]   rd  r"  rX  r   rL  r/  rN  s          @r   extractJSONzTextPage.extractJSON1  s    !!e!,	8(( 	8
 >88CLIICM4<]FKKBKC"CMjj1jM
r   c                     | j                  d      }||j                  |d<   |j                  |d<   |du r|d   }|j                  d        ||d<   |S )zCReturn page content as a Python dict of images and text characters.Tr.  r  r  r/  c                 "    | d   d   | d   d   fS r1  r    r2  s    r   ri  z)TextPage.extractRAWDICT.<locals>.<lambda>11  r3  r   r  r4  r5  s        r   extractRAWDICTzTextPage.extractRAWDICT)1  sa    !!d!+>88CLIICM4<]FKKBKC"CM
r   c                    ddl ddl}| j                  d      } G fdd|j                        }||j                  |d<   |j
                  |d<   |du r|d	   }|j                  d
        ||d	<   |j                  |d|d      }|S )z1Return 'extractRAWDICT' converted to JSON format.r   NTr.  c                       e Zd Z fdZy)*TextPage.extractRAWJSON.<locals>.b64encodec                 r    t        |      t        t        fv rj                  |      j	                         S y r   rK  rM  s     r   r   z2TextPage.extractRAWJSON.<locals>.b64encode.default<1  rO  r   NrP  rQ  s   r   rL  rb  ;1  rR  r   rL  r  r  r/  c                 "    | d   d   | d   d   fS r1  r    r2  s    r   ri  z)TextPage.extractRAWJSON.<locals>.<lambda>E1  r3  r   r  rT  r   rU  rW  r[  s          @r   extractRAWJSONzTextPage.extractRAWJSON51  s    !!d!+	8(( 	8
 >88CLIICM4<]FKKBKC"CMjj1jM
r   c                 v    t        |      }t        |      }t        j                  | j                  ||d      }|S rW   )rA
  rf   fz_copy_selectionr   )r]   pointapointbr   r  rb  s         r   extractSelectionzTextPage.extractSelectionJ1  s5    V$V$''		1a;r   c                     |du r| j                  d      S | j                         dd }|j                  d        dj                  |D cg c]  }|d   	 c}      S c c}w )z%Return simple, bare text on the page.Fr   Nc                     | d   | d   fS )Nr   r   r    r2  s    r   ri  z&TextPage.extractText.<locals>.<lambda>U1  s    1Q41, r   r  r(   r  )r  r  r"  r  )r]   r"  r/  r  s       r   extractTextzTextPage.extractTextP1  s]    5=$$Q''##%a(./wwf-!-..-s   Ac                     | j                   }t        |t        j                        sJ t	        |      }t        ||      }t        |      }|S r   )r   rs   rf   r  r  JM_copy_rectangle PyUnicode_DecodeRawUnicodeEscape)r]   r   r  r  rb  rh   s         r   r  zTextPage.extractTextboxX1  sF    YY
*e&7&7888t$!*d3-e4	r   c                 *   t         r t        j                  | j                  |      S d}d}t	        j
                  t        j
                  j                        }| j                  }t	        j
                  |j                  j                        }d}t	        j                  d      }g }|D ]g  }	|dz  }|	j                  j                  t        j                  k7  r1d}
|	D ]/  }|
dz  }
d}t	        j                  |       d}|D ]  }t        ||      }t        ||      st	        j                  |      s1t!        |j                  j"                  |      }|rF|dk(  rYt	        j$                  |      st'        |||||
|      \  }}t	        j                  |       d}t)        ||j                  j"                         |dz  }t	        j*                  |t        ||            } |r(t	        j$                  |      st'        |||||
|      \  }}d}2 j |S )z)Return a list with text word information.r   rY  N@   r   )r   r   extractWORDSr   rf   r(  r  r   r  r  r   r  r  r  r  rf  JM_is_word_delimiterrs  re  JM_append_wordr   r!  )r]   
delimitersbuflenr$  wbboxr  r%  r  r  r&  r(  r=   word_nr  r+  word_delimiters                   r   rs  zTextPage.extractWORDS`1  s   %%dii<<U\\556YY
,,z44==>""2&  	EqLG$$(A(AAF !%%d+ OB(r2E,We<$)$=$=g$F %9"--//:%VN%!Q;$$55e<,:5$wX^`f,gMFE--d3!" "49aKF!//|D"7MNE'O( %"8"8"?$25$wPVX^$_MFE7 	B r   c                 $    | j                  d      S )z&Return page content as a XHTML string.r  r8  r\   s    r   extractXHTMLzTextPage.extractXHTML1  r  r   c                 $    | j                  d      S )z$Return page content as a XML string.r   r8  r\   s    r   
extractXMLzTextPage.extractXML1  r  r   c                     | j                   }t        j                  |j                  j                        }t        j
                  |      }d|_        |S )zTextPage current poolsize.N)r   rf   Poolr   poolfz_pool_size)r]   r
  r  rz  s       r   poolsizezTextPage.poolsize1  sA    		zz%**//0!!4(r   c                 v    | j                   }|j                  j                  }t        |      }t	        |      }|S )zPage rectangle.)r   r   r  r'  r   )r]   r  r  r   s       r   r   zTextPage.rect1  s6     YY
((11h'3i
r   c                    t        | j                  |      }|s|S t        |      }t        |      D ]'  }t	        ||         }|r|||<   |j
                  ||<   ) |r|S d}||dz
  k  rW||   }||dz      }	|j                  |	j                  k7  s||	z  j                  r|dz  }C||	z  ||<   ||dz   = |dz  }||dz
  k  rW|S )z)Locate 'needle' returning rects or quads.r   r   )JM_search_stext_pager   r'  r  r  r   r  r	  )
r]   needlehit_maxr
  r   rn  r  ri
  v1v2s
             r   searchzTextPage.search1  s    "499f5JCu 	 ASVAAA	  J%!)mQBQUBuu~"r'!3!3Q"WCFAE
QJE %!)m 
r   ro  r  r  r   )r   r   )r`   ra   rb   r^   r  r  r  r  r   r6  r   r9  rF  r\  r_  re  rj  rm  r  rs  r|  r~  r  r  r   r  extractTEXTr    r   r   r  r  s0  s    	*9
5n
$ 
$S $-^# ,
T 
S */ /.`$c $$C $  4 Kr   r  c                   B    e Zd ZddZed        Zd	dZd
dZd ZddZ	y)
TextWriterNc                    t        j                         | _        || _        || _        t        |      | _        t        ddddd| j                  j                        | _	        | j                   | _
        t               | _        d| j                  _        t               | _        d| j                  _        t               | _        d| _        y)z;Stores text spans for later output on compatible PDF pages.r   r   rY  z'Position following last text insertion.zAccumulated area of text spans.TN)rf   fz_new_textr   r  r  r   r   r5  r  r  ictmr  r8
  r	  	text_rectr!  
used_fontsr   )r]   	page_rectr  r  s       r   r^   zTextWriter.__init__1  s    %%'	
O	!Q2q$))*:*:;XXI	'"K!B%r   c                     t        t        j                  | j                  t        j                  d       t        j
                                     }t        |      }|S r   )r'  rf   fz_bound_textr   FzStrokeStater2  r   r  s     r   _bboxzTextWriter._bbox1  sC    u22DIIu?R?RSW?XZ_ZhZhZjkl3i
r   c           
      p   t        |      | j                  z  }|t        d      }|j                  s	 t        d|j                  z        |r-| j                  |      }dj                  t        |            }d}t!        j"                  |      }	t%        |      }
t!        j&                  |dd||
j(                  |
j*                        }d}d}|dk(  r1t!        j,                  | j                  |j                  ||||||	      }n&t/        | j                  |j                  ||||||	      }t1        |      }t        |dd       | j2                  z  | _        | j6                  | j2                  z  | _        | j8                  | j4                  f}|j:                  d   dk(  r| j<                  j?                  |       |S )	z8Store 'text' at point 'pos' using 'font' and 'fontsize'.NrQ  r   zUnsupported font '%s'.r(   r  r  r   ) r  r  r  r  r>   re   r  r  mupdf_font_namer   r   r   r   	clean_rtlr  r#  rf   rG  rA
  fz_make_matrixr  r  fz_show_stringJM_show_string_csr1  r  r8
  r  r  r  r  r  )r]   r  r:   r)  r   r  right_to_leftr  r  r  rd  trm
markup_dirr  r   s                  r   r6   zTextWriter.append1  sw   Cj499$<<D 5		ABB>>$'D778D>*DM11(;S!""8Q8QSS!##F
?&&		499c4P]_ikopC#TYY		3e]\fhlmC$BC/DHH4dhh.nndoo-::f"OO%
r   c           	          |dz  }|D ].  }| j                  ||||||       |xj                  |z  c_        0 | j                  | j                  fS )Nre  )r)  r   r  r  )r6   r  r  r8
  )	r]   r  r:   r)  r   r  r  rr  rs  s	            r   appendvzTextWriter.appendv2  s[    S. 	AKKQTH!j  :EEWE	 ~~t..r   c           	         |s|S |j                  d      }g }t        t        |            D ]j  }||   }t        |      dk  rt        |D cg c]  }t	        |       c}      dkD  r=dj                  t        |            ||<   |j                  |       l g }t        t        |            D ]  }|g k(  r|j                  ||          ||   |d   dz   kD  r8t        |      dkD  r#t        ||d   |d   dz          ||d   |d   dz    ||   g}c||   |d   dz   k(  sr|j                  ||           dj                  |      }|S c c}w )a)  Revert the sequence of Latin text parts.

        Text with right-to-left writing direction (Arabic, Hebrew) often
        contains Latin parts, which are written in left-to-right: numbers, names,
        etc. For output as PDF text we need *everything* in right-to-left.
        E.g. an input like "<arabic> ABCDE FG HIJ <arabic> KL <arabic>" will be
        converted to "<arabic> JIH GF EDCBA <arabic> LK <arabic>". The Arabic
        parts remain untouched.

        Args:
            text: str
        Returns:
            Massaged string.
        rl   rr   r  r(   rY  r   r   )rY  r  r'  r  r  r  r#  r6   )r]   r:   wordsr"  r  r   rs  idx2s           r   r  zTextWriter.clean_rtl2  sW    K

3s5z" 	AaAFQJ#q&9!s1v&9":S"@778A;/a

1	 s3x 	$ArzCF#Q$r(Q,&t9q=4<d1gR155E$q'DHqL1 AxQ48a<'CF#	$ xx+ ':s   E

c	                    t        |       t        | j                  |j                  z
        dkD  rt        d      |Jt	        |      t
        t        fvs(t	        |d         t        ust	        |d         t        urt        d      ||t        d      t        |dd      |d	k(  r| j                  }|| j                  }	 |j                         }	d}
|dk\  r|dk  r|}
d}g d
}|rt        |      \  }}|dk(  rt        j                         }n.|dk(  rt        j                          }nt        j"                         }t%        |	       t        j&                  |	j)                         d      }t        j*                  d      }t        j,                  |	j)                         t        j.                         ||      }t        j0                  || j2                  t        j.                         |||
t        j4                  t        j6                               t        j8                  |       t;        |	|      }t=        |      }||f}|}|d   }|d   }|\  }}|j?                         }|jA                  |      }|d|z  }d}ndx}}dg}|r|jC                  |       |jD                  }|jF                  dv r.|j                  jH                  |j                  jJ                  z
  }nd}|jL                  }tO        |      s|jP                  dk7  s|dk7  rD|jC                  dtS        |jT                  |jV                  |jP                  z   |z
  f       d       |rN|d   | jX                  z  } t        dd      j[                  | jT                  | jV                        }| |d   z  |z  }|s|r&|jC                  tS        t]        |            dz          |D ]  }!|!j_                  d      r|!dk(  r&|jC                  |!       |jC                  d|z         A|!j_                  d      r)ta        |!jc                         d   dd       |z   }"d|"z  }!n!|!j_                  d      rx|!jc                         }#te        |#d         }$|dk7  r|$dz  }%nd}%|jC                  tS        |%      dz          ta        |#d   dd       |z   }&djg                  d|&z  g|#dd z         }!n|!j_                  d       r"|jC                  |!ji                  d!d"             ne|!j_                  d#      r"|jC                  |!ji                  d#d$             n2|!j_                  d%      r!|jC                  |!ji                  d%d&             |jC                  |!        |r|jC                  |       |jC                  d'       d(jg                  |      jk                  d)      }tl        jo                  |||*       d}| jp                  D ]  }&ts        ||&        |S )+a  Write the text to a PDF page having the TextWriter's page size.

        Args:
            page: a PDF page having same size.
            color: override text color.
            opacity: override transparency.
            overlay: put in foreground or background.
            morph: tuple(Point, Matrix), apply a matrix with a fixpoint.
            matrix: Matrix to be used instead of 'morph' argument.
            render_mode: (int) PDF render mode operator 'Tr'.
        r:  zincompatible page rectNr   r   z%morph must be (Point, Matrix) or Nonez$only one of matrix, morph is allowedr   rY  r  r   r  r
   r  z/OC /%s BDCEMCr(   ri
  r  rj  z cmr  z%i Trz gsz	/Alp%i gs Tf皙?z wrr   rl   z/F%iz rgr	  RGz gz Gz kz KrY  ry  r  )r
  ):r&  r  r   r   r   ru   rt   r  r5  r   r  r  rB
  r   rf   r  fz_device_cmykfz_device_grayr  r  r   r  pdf_new_pdf_devicer2  fz_fill_textr   ri  rj  r
  JM_merge_resourcesrY  r  r
  r6   rl  r  r  r  r  r  r  rv   r  r  r  r	  r  r  r   rY  r%  r  r  r{  r   r  r  repair_mono_font)'r]   r   r  r  r
  r  r  rb  r  rb  r  ncol	dev_colorr  r!  r  r
  max_numscont_stringr  r   r/  max_alpmax_fontold_cont_linesr]  r|  r^  new_cont_linesrd  r  r	  rd  r=   alprR  r  r   r)  s'                                          r   
write_textzTextWriter.write_textB2  sa    	Dtyy499$%,566UE4=0E!H~U2E!H~V3 !HII%"3CDD7K.6'R-llG=JJEnn&GE!|!D$I"7">iqy"002
"113
"113
w**7;;=!<I**40H**GKKM5>>;KYX`aCIINN$''(E(EF !!3' *7I>H0(;K,FCq6a&$ ++-,,R0')CCNC#!!#&""==I%II$$tyy6EE]]8ruuzUaZ!!HYbddRUUlU>R7S-T,UUX"YZa499$A1aL--acc1337EVeAh&.FF!!)HV,<"="EF" 	(D}}U#t|%%d+%%g&;<}}U#$**,q/!"-.8"S(u%zz|d1g!#AA%%ilT&9:4712;'(2xx$$qr( :;u%%%dll4&>?t$%%dll4&>?t$%%dll4&>?!!$'5	(6 !!#&e$))N+227;tWg>OO 	)DT4(	)
r   r_  )Nr  Nr   r   )Nr  NF)NrY  r   NNr   r   )
r`   ra   rb   r^   r  r  r6   r  r  r  r    r   r   r  r  1  s2    "  
*X/,\Er   r  c                   p   e Zd ZdZd Zd Zd Zd Zd Zdddddddd	Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zed        Zd Zd Zd Zd Zed        Zed        Zed        Zd Zd Zd Z ed         Z!ed!        Z"ed"        Z#ed#        Z$d$ Z%d% Z&ed&        Z'eZ(eZ)e#Z*e$Z+y)'r\  a  
    IRect() - all zeros
    IRect(x0, y0, x1, y1) - 4 coordinates
    IRect(top-left, x1, y1) - point and 2 coordinates
    IRect(x0, y0, bottom-right) - 2 coordinates and point
    IRect(top-left, bottom-right) - 2 points
    IRect(sequ) - new from sequence or rect-like
    c                 J    t         j                  | |      j                         S r   )r   rA	  rP	  r<  s     r   rA	  zIRect.__add__2      ||D!$**,,r   c                 J    t         j                  | |      j                         S r   )r   r  rP	  rs  s     r   r  zIRect.__and__2  r  r   c                 .    t         j                  | |      S r   )r   r  rs  s     r   r  zIRect.__contains__2  s      q))r   c                     t        |d      syt        |      dk(  xrN | j                  |d   k(  xr: | j                  |d   k(  xr& | j                  |d   k(  xr | j
                  |d   k(  S rw  )r  r'  r  r  r  r  r  s     r   rI	  zIRect.__eq__2  sk    q)$1v{jtww!A$j477ad?jtwwRSTURVj[_[b[bfghifj[jjr   c                 d    | j                   | j                  | j                  | j                  f|   S r   r  rL	  s     r   r  zIRect.__getitem__2  rz  r   Nr  c          
      V    t        |||||||d\  | _        | _        | _        | _        y )Nr  )util_make_irectr  r  r  r  r  s           r   r^   zIRect.__init__2  s-    -<trVX]_dfkm-n*$'47r   c                      yr  r    r\   s    r   r  zIRect.__len__2  r[	  r   c                 J    t         j                  | |      j                         S r   )r   r^	  rP	  r  s     r   r^	  zIRect.__mul__2  r  r   c                 v    t        | j                   | j                   | j                   | j                         S r   )r\  r  r  r  r  r\   s    r   r`	  zIRect.__neg__2  s+    dggXx$''DGG8<<r   c                 J    t         j                  | |      j                         S r   )r   r  rP	  rs  s     r   r  zIRect.__or__2  s    {{4#))++r   c                     t        |       S r   )r\  r\   s    r   rd	  zIRect.__pos__2  rN  r   c                 0    dt        t        |             z   S )Nr\  rf	  r\   s    r   r   zIRect.__repr__2  rP  r   c                     t        |      }|dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y t        d      r  )r   r  r  r  r  r  ri	  s      r   rj	  zIRect.__setitem__2  sg    F!VqTW  !VqTW
 	 !VqTW  !VqTW  122r   c                 J    t         j                  | |      j                         S r   )r   rl	  rP	  r<  s     r   rl	  zIRect.__sub__3  r  r   c                 J    t         j                  | |      j                         S r   )r   rr	  rP	  r  s     r   rr	  zIRect.__truediv__3  s    a(..00r   c                 B    t        | j                  | j                        S r  r  r\   s    r   r`  zIRect.bottom_left
3  r  r   c                 B    t        | j                  | j                        S r  r  r\   s    r   r]  zIRect.bottom_right3  r  r   c                 H    t        d| j                  | j                  z
        S rW   r  r\   s    r   r  zIRect.height3  r  r   c                 P    | j                   j                  |      }|j                  S )z$Extend rectangle to include point p.)r   r  r  )r]   rd  r   s      r   r  zIRect.include_point3  s     yy&&q)zzr   c                 P    | j                   j                  |      }|j                  S )z(Extend rectangle to include rectangle r.)r   r  r  )r]   r   r   s      r   r  zIRect.include_rect3  s     yy%%a(zzr   c                 J    t         j                  | |      j                         S )z4Restrict rectangle to intersection with rectangle r.)r   r  rP	  r  s     r   r  zIRect.intersect"3  s    ~~dA&,,..r   c                 .    t         j                  | |      S r   )r   r  rs  s     r   r  zIRect.intersects&3  s    tQ''r   c                 j    | j                   | j                  k\  xs | j                  | j                  k\  S r  r  r\   s    r   r	  zIRect.is_empty)3  r  r   c                     | j                   | j                  cxk(  xr	 t        k(  nc xr( | j                  | j                  cxk(  xr	 t
        k(  S c S )zTrue if rectangle is infinite.r  r\   s    r   r	  zIRect.is_infinite.3  r  r   c                 j    | j                   | j                  k  xr | j                  | j                  k  S r  r  r\   s    r   r  zIRect.is_valid33  r  r   c                 f    | j                   r
t               S | j                  j                  ||      S r  r  r  s      r   r  zIRect.morph83  r  r   c           	      j    t        j                  t        | D cg c]  }||z  	 c}            S c c}w r   r5	  r9	  s     r   r	  z
IRect.norm@3  r;	  r<	  c                     | j                   | j                  k  r#| j                   | j                  c| _        | _         | j                  | j                  k  r#| j                  | j                  c| _        | _        | S )z)Replace rectangle with its valid version.r  r\   s    r   r  zIRect.normalizeC3  r  r   c                 n    t        | j                  | j                  | j                  | j                        S r  r  r\   s    r   r  z
IRect.quadK3  r  r   c                     t        |       S r   r  r\   s    r   r   z
IRect.rectP3  s    Dzr   c                 B    t        | j                  | j                        S r  r  r\   s    r   r\  zIRect.top_leftT3  r  r   c                 B    t        | j                  | j                        S r  r  r\   s    r   r_  zIRect.top_rightY3  r  r   c           	         t        |      }| j                  s$| j                  s|j                  s|j                  rt        d      t	        dddd| j
                   | j                         t	        |j                  | j                  z  |j                  | j                  z        z  t	        dddd|j
                  |j                        z  S r  r  r  s     r   r  zIRect.torect^3  s    Gt}}FGGq!QDGG8dggX64::-qxx$++/EFGAq!QTT14401	r   c                 J    t         j                  | |      j                         S r   )r   r+
  rP	  r  s     r   r+
  zIRect.transformi3  s    ~~dA&,,..r   c                 H    t        d| j                  | j                  z
        S rW   r  r\   s    r   r  zIRect.widthl3  r  r   ),r`   ra   rb   r	  rA	  r  r  rI	  r  r^   r  r^	  r`	  r  rd	  r   rj	  rl	  rr	  r  r`  r]  r  r  r  r  r  r	  r	  r  r  r	  r  r  r   r\  r_  r  r+
  r  r  r  r  r  r    r   r   r\  r\  2  s   --*k
7 "&$4DTd o-=,*-1 ' ' ' ' ) )

/( 8 8 _ _ 9 9%3 8 8   ' ' ' '	/ ) ) 
B	B	B	Br   r\  )PDF_UCDN_SCRIPT_PDF_ENUM_NAME_)CourierCourier-ObliqueCourier-BoldCourier-BoldOblique	HelveticaHelvetica-ObliqueHelvetica-BoldHelvetica-BoldObliqueTimes-RomanTimes-Italic
Times-BoldTimes-BoldItalicrg  rh  r  rQ  r  heitr  hebor  hebir  courr  coitr  cobor  cobir  tiror  tibor  tiitr  tibirg  symbrh  zadbr  i   ifitzrr   r   r  r
   rN	         rr  r   r  r  r  r  r        Color	ColorBurn
ColorDodgeDarken
Difference	Exclusion	HardLightHueLightenrY  MultiplyNormalOverlay
SaturationScreen	Softlightc                 2    d|  dt        |||f       d| dS )Nz<</A<</S/GoTo/D[z	 0 R/XYZ z	]>>/Rect[]/BS<</W 0>>/Subtype/Link>>r2  )r   r  rs  r  r   s        r   ri  ri  4  s7    )9!IiQRTUWXPYFZE[[defdg  hC  (D r   c                     d|  d| dS )Nz<</A<</S/GoTo/Dz>>/Rect[r  r    r3  s     r   ri  ri  4  s    s(1#=XY r   c                 >    d|  dt        |||f       d| d| d| dS )Nz<</A<</S/GoToR/D[z /XYZ z]/F<</F()/UF()/Type/Filespec>>>>/Rect[r  r2  rk  s          r   ri  ri  4  sU    0A!F9VWYZ\]U^K_J``hijhkkpqrps  tM  NO  MP  Pk  /l r   c                     d|  d| d| dS )Nz<</A<</S/GoToR/Dz/F(	)>>/Rect[r  r    r   r  rs  s      r   ri  ri  4  s    $4QCs1#YqcId"e r   c                     d|  d| d| dS )Nz<</A<</S/Launch/F<</F(r  r  r  r    r  s      r   ri  ri  4  s     $:1#U1#E^_`^aa|"} r   c                     d|  d| dS )Nz<</A<</S/URI/URI(r  r  r    r3  s     r   ri  ri  4  s    /s)A3>YZ r   c                     d|  d| dS )Nz<</A<</S/GoTo/D(z)/Type/Action>>/Rect[r  r    r3  s     r   ri  ri  4  s     03HKfg r   )goto1goto2gotor1gotor2launchr  rH  c                       e Zd ZdZy)r  z0Raised for documents with file structure issues.Nr`   ra   rb   r	  r    r   r   r  r  4  s    :r   r  c                       e Zd ZdZy)r  zRaised if file does not exist.Nr$  r    r   r   r  r  4  s    (r   r  c                       e Zd ZdZy)r  z5Raised when creating documents from zero-length data.Nr$  r    r   r   r  r  4  s    ?r   r  r   r  r   r/  rm  rs  charsr  r  r/  r1  zcs-namedar  r{  r  r9  effectrV  r3   r   r  r)  rd  r  r  r
  rn  ry  r  r+
  r2  r   r  r  r   rz  rx  spansr  r  r3  r:   r0  r   r  r  r  r   rz  r{  )fontdescriptorsfontbuffersloader(      gq=
ףp?r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  )r         ?)!   Zd;O?)"   7A`?)#   r$  )$    rh?)%   -?)&   gL7A`?)'   jt?)r  r2  ))   r2  )*   r$  )+   r7  ),   r0  )-   r7  ).   r0  )/   n?)0   r$  )1   r$  )r
  r$  )3   r$  )4   r$  )5   r$  )6   r$  )7   r$  )8   r$  )9   r$  ):   rD  );   rD  )<   r7  )=   r7  )>   r7  )?   g"~j?)rr  r7  )A   v?)B   MbX?)C   rU  )D   g/$?)E   Zd;O?)F   "~j?)G   粝K?)r  rU  )I   r2  )J   x&1?)K   rU  )L   ʡE?)M   g r?)N   rU  )O   rU  )P   ~jt?)Q   gʡE?)R   gn?)S   gl?)T   r[  )U   Gz?)V   r<  )W   rj  )X   gp=
ף?)Y   q=
ףp?)rl  r[  )[   r2  )\   gV-?)]   r2  )^   uV?)r5  r$  )`   r$  )a   rb  )b   r7  )r
  r7  )r  V-?)e   r<  )f   y&1?)g   M?)h   r_  )i   uV?)j   r_  )k   r7  )l   r7  )m   ;On?)n   r  )o   r7  )p   r7  )q   r  )r   r7  )s   r_  )t   r<  )u   r  )v   r4  )w   re  )x   gZd;O?)y   re  )z   r~  ){   Q?)|   皙?)}   r  )~   r7  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  r.  )   r0  )   gףp=
?)   gV-?)   r7  )   gK7A`?)   r4  )   r$  )   jt?)   r  )   r  )   r  )   y&1?)   r4  )   r_  )   /$?)   r_  )   g?)   r7  )   r  )   r7  )rb  r7  )   r  )   r~  r.  )   r7  )   r7  )   r7  )   r7  )   r   )   r_  )   r   )   rz  )   tV?)   re  )   ru  )   r  )   rj  )   rj  )   r  )   rj  )   rj  )   r4  )   r4  )   r4  )   r4  )   r4  )   r4  )   r4  )   rj  )   r4  )   HzG?)   r  )   g{Gz?)   r  )   r7  )   r7  )   r4  )   r_  )   r_  )   r  )   r  )   r_  )   r  )   r_  )   r~  )   r  )   r  )   r  )   x&?)   r4  )   ~jt?)   r  )   r  )   r  )   r  )   r  )   r~  )   r~  )   r~  )   r~  r.  )   r  )   gK7?)   re  )   re  )   re  )   r  )   r7  )   r  )   r  )   r  )   r  )   r~  )   r~  )   r~  r.  (   r/  K7?r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r   rD  )r1  ^I+?)r3  gn?)r5  r  )r6  g\(\?)r8  g5^I?)r:  sh|??)r;  r  )r  Zd;O?)r=  rp  )r>  gQ?)r?  g?5^I?)r@  r7  )rA  g\(\?)rB  x&?)rC  gB`"?)rE  r  )rF  g=
ףp=?)r
  r  )rG  g)\(?)rH  gOn?)rI  Mb?)rJ  '1Z?)rK  gʡE?)rL  gDl?)rM  r]  )rN  RQ?)rO  }?5^I?)rP  gT㥛 ?)rQ  r~  )rR  gDl?)rS  gv/?)rr  gX9v?)rT  g/$?)rV  r  )rX  r  )rY  r  )rZ  r  )r\  gK7A`?)r^  g rh?)r  &1?)r`  r  )ra  r  )rc  gx?)rd  r  )rf  r9  )rg  r  )rh  d;O?)ri  gK7?)rk  g+?)rl  gA`"?)rm  g+?)rn  r  )ro  MbX?)rq  g=
ףp=?)rr  E?)rs  rj  )rt  r  )rl  r  )rv  9v?)rw  g-?)rx  gm?)ry  g;On?)r5  g;On?)r{  gGz?)r|  r  )r}  r  )r
  r  )r  gCl?)r  ʡE?)r  g?5^I?)r  r  )r  gv/?)r  r4  )r  r  )r  gQ?)r  r  )r  V-?)r  r	  )r  r  )r  r  )r  r  )r  r  )r  %C?)r  r  )r  r  )r  gJ+?)r  gx&1?)r  gDl?)r  g|?5^?)r  g(\?)r  J+?)r  r  )r  K7A`?)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  gCl?)r   rh?)r  r  )r  gQ?)r  rW  )r  r
  )r  r
  )r  r  )r  g
ףp=
?)r  gh|?5?)r  gx&1?)r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )rb  r  )r  r  )r  r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  gS㥛?)r  g7A`?)r  gK7A?)r  gZd;O?)r  V-?)r   rh?)r  r  )r  gK7A`?)r  Dl?)r  V-?)r  r  )r  g㥛 ?)r  r  )r  g"~?)r  r  )r  r  )r  gMbX?)r  g(\?)r  gn?)r  goʡ?)r  gK7A?)r  獗n?)r  r  )r  X9v?)r  r  )r  r  )r  r  )r  +?r  )r  r  )r  r
  )r  gʡE?)r  y&1?)r  gGz?)r  r  )r  "~j?)r  gl?)r  r  )r  r  )r  r  )r  r  )r   g
ףp=
?r  r  c                     g }t        |      D ]*  }|j                  t        j                  | ||z                , t	        |      S r   )r  r6   rf   rm  r   )r
  r  r?  rN   r  s        r   _read_samplesr!  6  sC     CAY ?

E((&&1*=>?#;r   c                     || k  xr | |k  S r   r    )rM   lowhighs      r   rW  rW  6  s    !8!T	!r   c           
         t        j                  |       }t        |      D ]6  }|}||v rt        j                  | |      }t        j                  |t        d            }|j                  sMt        j                  |      }t        |dz
  dd      D ]  }t        j                  ||      }	t        j                  t        j                  |	t        d            t        d            sWt        j                  |	t        d            }
t        j                  |	t        d            }|
j                  r\t        j                  t        j                  |
t        d            t        d	            st        j                  |
t        d
            }d}t        j                  |      r-t        j                  |d      }t        j                  | |      }n\t        j                  |      rGt        j                  | j                         t        j                  |            \  }}}|j                   }|dk  r|}||v st        j"                  ||        9 y )NrX  r   rY  r=  r	  rH  rG  r	  GoTorI  r   )rf   r  r  r  r   r   r   r]  r^  rB  r.  pdf_lookup_page_numberrF  r  r   r   r   r_  )r  r  	pagecountr  r[
  r  ra  r=  rB  rc  r  r  r  targetr  r  s                   r   r  r  6  s   %%c*I9 3=++S!4##Whx.@A  ""6*taxR( 	3A##VQ/A$$e&8&8!Xi=P&QS[\bScd''HSM:F%%q(6*:;D  ((%*<*<fhsm*TV^_eVfg))68C=AC!!4(,,dA622C@$$d+!&!6!6		UE]E]_cEd!e!QmmQwBW}&&2+	33r   c                     t        | t        j                  t        j                  f      sJ dt	        |       d|        | j
                  st        t              y )Nztype(cond)=z cond=)rs   rf   r   r   r   r   r   MSG_IS_NO_PDF)conds    r   r  r  "7  sQ    dU]]E,=,=>?YKDJ=PWRVQXAYY???&& r   c                  >    t        t        t        t        t              S r   )r\  rr  rq  r    r   r   EMPTY_IRECTr.  (7      /?OTTr   c                  *    t               j                  S r   )
EMPTY_RECTr  r    r   r   
EMPTY_QUADr2  ,7  s    <r   c                  >    t        t        t        t        t              S r   )r   rr  rq  r    r   r   r1  r1  07      /?SSr   c                 0    t        |       st        d      y )Nz No journalling operation started)JM_have_operationr   r  s    r   r  r  47  s    S!:;; "r   c                  >    t        t        t        t        t              S r   )r\  rq  rr  r    r   r   INFINITE_IRECTr9  97  r/  r   c                  *    t               j                  S r   )r  r  r    r   r   r  r  =7  s    ?r   c                  >    t        t        t        t        t              S r   )r   rq  rr  r    r   r   r  r  A7  r4  r   c                 h    t        | t        j                        sJ t        j                  |       }|S )z3
    Turn fz_buffer into a Python bytes object
    )rs   rf   r  r  )r   rN   s     r   r   r   E7  s-     gu~~...

&
&w
/CJr   c                     | yt        | t              sJ dt        |              | j                  dd      }d}|D ]  }|t	        |      z  } |S )Nr(   ztype(c)=r  surrogateescape)rs   r   r   r{  r  )rs  r  rN   bbs       r   rt  rt  N7  sb    & 	ya,($q'},	*+A
C s2wJr   c                 Z   t        | t        t        f      r| }n~t        | d      r^| j	                         }t        |t
              r|j                  d      }t        |t        t        f      s+t        dt        |             t        j                         S t        j                  |      S )z
    Make fz_buffer from a PyBytes, PyByteArray or io.BytesIO object. If a text
    io.BytesIO, we convert to binary by encoding as utf8.
    rG  r  z&.getvalue() returned unexpected type: )rs   r   r-  r  rG  r   r{  r   r   rf   r  rb  )r|  rN  s     r   r   r   k7  s    
 &5),-		$ dC ;;w'D$	 23DT$ZLQRR~~//55r   c                 6    t        |       sy t        | |         S r   )rS
  r%  )r   r"  s     r   JM_FLOAT_ITEMrB  }7  s    C S?r   c                 ^    |t        |       k  r| |   }t        |t        t        f      rd|fS y)Nr   r_  )r'  rs   r   r%  )r   r"  rR  s      r   r  r  7  s0    
SX~3xdS%L)d7Nr   c                    d}d}d}	d}
|
r|}n|}d}|}t        |      }t        j                  |      }t        |      }t        j                  ||      }t        j
                  ||      }t        j                  |      }t        j                  |       }|j                  r@t        j                  |      t        j                  |      k(  rt        j                  |      }||k7  rt        j                  |      }|j                  rt        j                  |      }||	k(  r6t        |      D ]'  }t        j                  ||t        j                         ) nt        |      D ]'  }t        j                  ||t        j                          ) nwt        j"                  |      rt        j$                  d      }nL|j                  r@t        j                  |      t        j                  |      k7  rt        j$                  d      }t        j&                  ||||      }|rt        j(                  |       nt        j*                  |d       t        j,                  ||      }|r=t        j.                  ||t        j0                         t        j2                                n<t        j4                  ||t        j0                         t        j2                                t        j6                  |       |S )zf
    Pixmap creation directly using a short-lived displaylist, so we can support
    separations.
    r   r   rr   TNr  )r  rf   r
  r  fz_intersect_rectr`  fz_round_rectfz_document_output_intentr   rx  fz_keep_colorspacefz_page_separationsfz_count_separationsr  fz_set_separation_behaviorFZ_SEPARATION_SPOTFZ_SEPARATION_COMPOSITEfz_page_uses_overprintfz_new_separationsr]  r  r  r  r
  r2  r  fz_run_page_contentsr
  )r   r   r  r  r  ra  r  
SPOTS_NONESPOTS_OVERPRINT_SIM
SPOTS_FULLFZ_ENABLE_SPOT_RENDERINGspotsry  r  r  r   rclipr   oir?  r  r  r
  s                          r   r
  r
  7  s_   
 JJ##DJs#Ft$DD!E""4/D""40Dt$D 
	(	(	-B	}}  $(=(=b(AA11"5J 
((.??**40A
"q XA44T1e>V>VWX q ]A44T1e>[>[\]))$/ ++A.D]]u44R8E<Q<QR\<]]
 ++A.D

'
'
D$
FCc"((d3

"
"63
/C$U^^%5u~~7GH""4enn.>@PQ	#Jr   c                     | S r   r    r0  s    r   r
  r
  7  s    Hr   rc  r  c                 .    t        t        d |             S )Nc                 :    t        |       dk\  rt        | d      S dS )Ng-C6?r
   r   r  rP	  r0  s    r   ri  zJM_TUPLE.<locals>.<lambda>7      c!fnuQ{ ! r   ru   r  rc  s    r   r  r  7      CQGHHr   c                 .    t        t        d |             S )Nc                 :    t        |       dk\  rt        | d      S dS )Nr:  r   r   r[  r0  s    r   ri  zJM_TUPLE3.<locals>.<lambda>7  r\  r   r]  r^  s    r   	JM_TUPLE3rb  7  r_  r   c                     | yt        | t              r| j                  d      } t        | t              sJ dt	        |       d|        | S )Nr(   r  ztype(s)=z s=)rs   r   r8  r   r   r)  s    r   r   r   7  sM    y!UHHVa1($q'4QD11Hr   c                    t        | t        j                        sJ t        j                  |       }t        j                  |       }t        |      }d}	 t         d| | }||vrn|dz  }t        |      }t        j                  |t        |            }t        j                  |d|       d|j                         j                  _        y)z
    Add a unique /NM key to an annotation or widget.
    Append a number to 'stem' such that the result is a unique name.
    r   r   rk   r  N)rs   rf   r   r   r   rP  JM_annot_id_stemr
  pdf_new_stringr'  r8  r   r   r  )	r   stemr   r   r#  r  stem_idresponser   s	            r   rE
  rE
  7  s    
 eU^^,,,'D##U+I &E	A
%&avaS1%	Q	 
 G$H3x=9D		4.-.DHHJ*r   c                    t        j                  | |d      }t        j                  |      st        t        t
               t        j                  |t        d            }t        j                  |t        d            dk(  s"t        j                  |t        d            dk(  r!t        j                  |t        d      |       yt        t        t
               y)z1
    Add OC object reference to a dictionary
    r   ru  r  OCMDr  N)
rf   r@  r:  rr  MSG_BAD_OC_REFrp  r   r   r>  r  )r  r
  r   indobjr  s        r   rR  rR  7  s     ##Cq1FV$ 01vx'78E0A5x'78A=37 01r   c                 V   t               }d }d}d}d }t        j                  | t        d            }t        j                  |      rt        j
                  t        j                  |d            }t        j                  |      dk(  rst        j                  |d      }t        t        j                  |            D ]<  }t        j                  t        j                  ||            }|j                  |       > t        j                  | t        d            }	|	j                  rt        j
                  t        j                  |	t        d                  }t        j                  t        j                  |	t        d                  }|d	k(  rd }t        j                  |	t        d
            }|j                  r]t        t        j                  |            D ]<  }t        j                  t        j                  ||            }|j                  |       > t        j                  | t        d            }|j                  r2t        j                  t        j                  |t        d                  }t               }
||
t        <   t        |      |
t         <   ||
t"        <   ||
d<   |
S )NrY  Borderrr   r  r   BSr
  r	  r(   rI  BEIr  )rt   rf   r   r   r.  r  r^  r]  r  r   r6   r   r9  r   ro  ru   dictkey_dashesdictkey_style)r   dash_pyr  r  r  r   dashr  r   bs_or   s              r   rF  rF  8  s   fGEEF
C


i();
<C3!!5#6#6Q#?@$)&&Q/DE//67 %&&(;(;T1(EF$% y(4.9D!!5#5#5tXc]#KL!!5#5#5tXc]#KLB;E  $6>>E//56 %&&(;(;S!(DE$% 

i$
8C
~~!!5#5#5sHSM#JK
&CC '?CCCNJr   c                    t               }t               }t               }t        j                  | t        j                        }t        j
                  |      r_t        j                  |      }t        |      D ]<  }t        j                  t        j                  ||            }|j                  |       > ||t        <   t        j                  | d      }t        j
                  |      r_t        j                  |      }t        |      D ]<  }t        j                  t        j                  ||            }|j                  |       > ||t        <   |S )Nr   )r   rt   rf   r   PDF_ENUM_NAME_Cr.  r]  r  r  r^  r6   dictkey_stroker   dictkey_fill)r   r   bcfcrc  r?  r  r  s           r   rU  rU  48  s   
&C	BB9e&;&;<A!"q 	A##U%8%8A%>?CIIcN	 CIt,A!"q 	A##U%8%8A%>?CIIcN	 CJr   c                    t        | t              sJ d }d}| j                  t              }| j                  t              }| j                  t
              }| j                  d      }t        |      }	t        j                  |t        d             t        j                  |t        d             t        j                  |t        d             |dk  r|	j                  t              }||	j                  t              }||	j                  t
              }|dk  r|	j                  d      }t        |t              rvt        |      dkD  rht        |      }t        j                  ||      }
|D ]  }t        j                  |
|        t        j                  ||
t        d      t        d             t        j                  |t        j                  |      t        d      t        d             |dk(  rt!        |      }nt        d      }t        j                  ||t        d      t        d             |dkD  rt        j"                  |t        d      d	       t        j$                  |t        d            }t        j&                  |t        d      t        d
             t        j(                  |t        d      |       y y )Nr   r  rq  rr  rp  rI  r
  r	  rr   r  rs  )rs   r   r   ro  rt  ru  rF  rf   r   r   ru   r'  r  pdf_array_push_intr  pdf_new_realJM_get_border_styler  r   r  r  )rI  r   r   r   dashlennwidthndashesnstylencloudsoborderdarrr  s               r   r  r  K8  s)   fd###
CGZZ'Fjj.)GZZ'Fzz8$G y)G 
	8D>2		8D>2		8H#56 zm,++~.~++}-{;;)7E"sG}q'8w-""C1 	/A$$dA.	/YhtnhsmL	'TNSM	 !|!6*sm	C$#G{HTNA>  )Xd^<C#>Xc]G<	 r   c                     | dk(  ryd| cxk  rdk  sn | dk(  rt        |       S d| cxk  rdk  ry | d	k  rd
| z  S d| z  S )Nrw  z\u005cr      r  i   i  z\ufffd  z\u%04xz\U%08xr  )r  s    r   make_escaper  8  sV    	Rx	rSB"H2w	2		 
 	v2~2~r   c                 B    t        j                  | t        |             y)zG
    APPEND non-ascii runes in unicode escape format to fz_buffer.
    N)rf   r
  r  )r  r  s     r   r   r   8  s     
4R1r   c                    t        |      }|j                  |j                  |j                  |j                  ||||f}| j                  |       |dz   t        j                  t        j                  j                        fS )z'
    Functions for wordlist output
    r   )	rY  r  r  r  r  r6   rf   r(  r  )r  r  rx  r$  r(  ry  r)  r,  s           r   ru  ru  8  sm     	t$AHHHHHHHH	E 
LLA:u||ELL$<$<===r   c                 `   t        |       }t        j                  |t        d            }t        j                  |      s t        j
                  |t        d      d      }t        j                  | d      }t        j                  |t        d      |       | t        j                  |t        d      |       t        j                  |t        d      t        d             t        j
                  |t        d	      d      }|snt        j                  |t        d
            }t        |      }	t        |	      D ]]  }
d}t        ||
      \  }}|dk(  rt        j                  | |d      }t        j                  ||      sHt        j                  ||       _ t        j                  ||       y)z1
    Add OC configuration to the PDF catalog
    r  r   r
   r  Nr  	BaseStater  r  r  r   )r  rf   r   r   r.  r  r  r7  r  r'  r  r  r@  pdf_array_containsr0  )r  r   r  r  r  configsrI  onarrayr  r?  r  r   r   inds                 r   r  r  8  sc    !#
&C  #x	':;Gw'**C)1DaHC#A	""Ax'7>&&8I+>H	8K0(5/B&&8D>1=G!!3(89Gq 	4AD!"a(GAtAv((#tQ7C''s3$$gs3	4 
'1%r   c                 (   t        | |      }t        j                  |      }| j                  j                  s|S |j
                  |j                  |j                  j                  z   k  r(|j
                  |j                  j                  z
  |_        |S )z"
    return rect of char quad
    )JM_char_quadrf   rg
  r   r  r  r  rz  )r=   r  ri
  r   s       r   r  r  8  sp     	T2A"A??  ttaddR]]''''ttbmm(((Hr   c                    t        ||      }|t        j                  |       t        z  z  }|t        j                  |       t
        z  z  }|t        j                  |       t        z  z  }|t        j                  |       t        z  z  }|S r   )
detect_super_scriptrf   r  TEXT_FONT_ITALICr  TEXT_FONT_SERIFEDr  TEXT_FONT_MONOSPACEDr  TEXT_FONT_BOLD)r)  r=   r  r  s       r   JM_char_font_flagsr  8  s~    b)E	U$$T*-===E	U##D),===E	U((.1EEEE	U""4(>99ELr   c                 
   t         r=t        j                  t        j                  | j
                  |j
                              S t        | t        j                        sJ t        |t        j                        sJ t        j                  r|j                  S | j
                  j                  r|j                  S t        j                  t        j                  |j
                  j                              }t!        |      }t#        |      }|j
                  j$                  }||z
  t&        z   }|dk\  r<t        j(                  dk(  r)t        j                  |j
                  j                        S |j
                  j$                  }t        j*                  |      }|j,                  |j.                  z
  }|dk  rd}d}d}t        j(                  s|dk  r
||z  }||z  }||z
  }||z  |z  }||z  |z  }| j
                  j0                  j2                  }	| j
                  j0                  j4                  }
t        j6                  |	|
 |
|	dd      }t        j6                  |	|
|
 |	dd      }|	dk(  rd|_        d|_        t        j6                  dddd|j
                  j:                  j2                   |j
                  j:                  j4                         }t        j6                  dddd|j
                  j:                  j2                  |j
                  j:                  j4                        }t        j<                  t        j                  |j
                  j                        |      }t        j<                  ||      }|	dk(  r^|j>                  j4                  dkD  rE||j>                  _        ||j@                  _        ||jB                  _        ||jD                  _        nH| |j>                  _        | |j@                  _        | |jB                  _        | |jD                  _        |jB                  j2                  dk  r"d|jB                  _        d|j>                  _        |jD                  j2                  |jB                  j2                  z
  }|t&        k  rt        jF                  ||j
                  jH                        }|r{t        jJ                  ||| j
                  j                        }|jB                  j2                  ||z  z   |jD                  _        |jD                  j2                  |j@                  _        t        j<                  ||      }t        j<                  ||      }|S )zI
    re-compute char quad if ascender/descender values make no sense
    r   r   r:  皙?rV  rY  )&r   rf   r}  r   r  r   rs   FzStextLineFzStextCharr
  r[   r  r  FzFontll_fz_keep_fontr)  JM_font_ascenderJM_font_descenderrz  FLT_EPSILONrY   r  r  r  r9  r  r  r  r  r  fz_transform_quadrw  r  r  r  r`  rs  ra  )r=   r  r)  ascdscr  asc_dscr   fwidthrs  r)  trm1trm2xlate1xlate2r  cwidthrd  s                     r   r  r  8  s     ||E..OPPdE--...b%++,,,%%wwww<<--bmm.@.@ABD
4
 C
D
!CMMECi+%G!|449||BMM..//
 MMEd#DWWtwwF
Tz##w{GmGmCiG
+
C
+
C
 	AAA2q!Q2D1qb!Q2D	R!!!Q1r}}/C/C/E/E.EH\H\H^H^G^_F!!!Q1bmm.B.B.D.DbmmFZFZF\F\]F""5<<0B0B#CVLD""4.D 	Av$''))a-				D	D	D	D	
 wwyy1}		WWYY"F))4A++T5$//:O:OPF		FUN2DGGI		DGGI""4.D""40DKr   c           
        	 t        j                  | j                        	t        dk\  rt        j                  | d      }n	fd} || d      }t        |      }|dk(  ryt        j                  	t        d            }g }t        |      D ]  }t        j                  t        j                  ||            }|dk(  rt        j                  t        j                  t        j                  ||      d            t        j                  t        j                  t        j                  ||      d            f}|j                  |       t        j                  t        j                  ||            }|j                  |        |S )z8
    return list of choices for list or combo boxes
    r  r   c           
         t        j                  t        j                  | j                        t	        d            }t        j
                  |      }g }|s|S t        j                  t	        d            }t        |      D ]   }t        j
                  t        j                  ||            }|dk(  rt        j                  t        j                  t        j                  ||      d            t        j                  t        j                  t        j                  ||      d            f}|j                  |       t        t        j                  t        j                  ||                  }|j                  |        |S )NOptrr   r   r   )rf   r  r   r   r   r]  r   r  r^  r   r6   r   )	r   	exportvaloptarrr?  r  r  rA  r   r   s	           r   pdf_choice_widget_optionsz4JM_choice_options.<locals>.pdf_choice_widget_optionsA9  s7   33U5H5H5TV^_dVefF##F+AD''	8E?CF1X 
%''(;(;FA(FG6!44U5H5HI\I\]cefIgij5kl!44U5H5HI\I\]cefIgij5klC KK$+E,D,DUEXEXY_abEc,deCKK$
% Kr   Nr  rr   r   )rf   r   r   rw   pdf_choice_widget_options2r'  r   r   r  r]  r^  r   r6   )
r   r  r  r?  r  r  r  rA  r   r   s
            @r   JM_choice_optionsr  59  sF    ##UZZ0Ig%//:
	, )%3T
AAvHUO<FEAY 
!4!4fa!@A6,,e.A.A5CVCVX^`aCbde.fg,,e.A.A5CVCVX^`aCbde.fgC LL#**E,?,?,KLCLL#
 Lr   c                    t        j                  |t        j                  |             }|j                  |j                  z
  }|j
                  |j                  z
  }|dk  s|dk  ry| j                         }||j                  | j                         z
  z  | j                         |j                  | j                         z
  z  z   }t        j                  | j                               dk(  rd|z
  }	 |}t        d|      D ]  }t        j                  | |d       |dz  }t        j                  | |d       |dz  }t        j                  | |d       |dz  }t        j                  | ||       |dz  }| j                         st        j                  | |d       |dz  } ||z  }|dk(  r	 y|dz  }	 |}t        |      D ]  }t        | j                         dz
        D ]  }	t        j                  | ||       |dz  }  | j                         rt        j                  | |d       |dz  }mt        j                  | ||       |dz  } ||z  }|dk(  r	 y|dz  })zO
    Clear a pixmap rectangle - my version also supports non-alpha pixmaps
    r   r  r  r   )rf   fz_intersect_irectr  r  r  r  r  rk  r  r?  r  rx  r  r  rl  r  )
r  ry   r  r   r  destspandestpr)  r  rr  s
             r   r  r  m9  sO    	  E$8$8$>?A	qttA	qttAAva{{}Htvvx(4668qttdffh+GGE T__./14eA1a[ $$T1a0Q$$T1a0Q$$T1a0Q$$T1e4Q::<((q#6FA XEAv FA# ( q 		A4668A:& $$T1e4Q zz|$$T1c2Q$$T1e4Q		 	6 	
Q r   c                    t        | t        t        f      r| d   } t        | t        t        f      sdg fS t        |       dvrdg fS | d d  }t        t        |            D ]  }||   dk  s	||   dkD  sd||<    t        |      |fS )Nr   rY  )r   r   r   r  r   )rs   r   r%  rt   ru   r'  r  )r  rN   r  s      r   r   r   9  s    %#u&autUm,2v
5z%2v
(C3s8_ q6A:Q!CF s8S=r   c                 2   t               }d}t        j                  |       }t        j                  |t        j                  t        |                  }| j                         }|j                  |j                  z
  }|j                  |j                  z
  }| j                         }||z  }	||j                  | j                         z
  z  |j                  | j                         z
  |z  z   }
t        | |
|      }d}t        j                  |      r|S t!        |      D ]X  }t!        d|	|      D ]A  }t        | |
|z   |      }||k7  r%|}|j#                  |d       }|||z  }|||<   d}|}=|dz  }C |
|z  }
Z |}|j#                  |      }|||z  }|||<   |S r  )r   rf   r  r  rF  r  rk  r  r  r  r  r?  r  r  r!  fz_is_empty_irectr  r   )r  r  rh   r  r  rk  r  r  r?  	substrider)  oldpixr  rB  newpixr  rs  s                    r   r  r  9  s   	B
C  "%E$$UE,?,?PT@U,VWEYY[FHHuxxEXX F
A	I%((RTTV#$2446(9Q'>>AB1%F
Cu%	F^ 9a( 	A"BAq1FFFE4(=1HC E
q	 	
V E
A}qBJIr   c                     t        j                  | t         j                        \  }}|r|dk(  ryt        j                  t        j                  ||            }t        j
                  ||       |S )z*
    compress char* into a new buffer
    r   N)rf    fz_new_deflated_data_from_bufferFZ_DEFLATE_BESTr  fz_new_buffer_from_datafz_resize_buffer)inbufferrN  compressed_lengthr  s       r   JM_compress_bufferr  9  sh     $DD!!D

 $)
..66t=NO
PC	3 12Jr   c                    d}t        j                         }| D ]  }|j                  j                  t        j
                  k7  r+|D ]n  }d}|D ]`  }t        ||      }t        ||      sd}|r|j                  d       d}|j                  t        |j                  j                               b |smd}p  |j                         }	|	S )Nr   r   ry  )r.  StringIOr   r   rf   r  r  r  r;  r  rs  rG  )
r   r  need_new_linerg  r&  r=   line_had_textr  r   r)  s
             r   ro  ro  9  s    M[[]F "  E$=$== 	"DM ? r*#D!,$%M$T*()LLR]]__!=>?  !	""  	AHr   c                    t        j                         }d}|}|}||kD  rd}|}|}t        |      }|}		 t        |	||      snt        j                  | |	      }
t        j
                  |
      }t        j                  ||      \  }}}t        j                  |
|t        j                         t        j                                t        j                  |       d}t        j                  |||||      }t        j                  |d|       |	|z  }	t        j                         }d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        t        j2                  d      }t        j4                  |      }t        j6                  |||       |j9                          t        j:                  |      }t=        |t>              sJ |S )zx
    Convert any MuPDF document to a PDF
    Returns bytes object containing the PDF, created via 'write' function.
    r   rY  Nr  r   i    ) rf   r   rB  rW  r?  r
  pdf_page_writer
  r2  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rs   r   )r   rF  r  r  r  incrr)  r   r  r  r   r  r
  r!  r  r  r  r   r  rs  s                       r   r  r  :  s   
  FD
A
A	Bw
6
"C
A
1a !!#q)&&t,#(#7#7#I Y$U^^%5u~~7GHc"%%fhYQfb(3	T	    "DDODDDDDDMDDNDMDN


d
#C
..
C	VS$/$$S)AaHr   c           
         t        j                  t        j                  t        j                  |       d            }t        j                  |t         j
                        }t        j                  |      }	 t        | ||       t        j                  |t        d      |       |t         j                  k(  rj|t        t        z  z  }t        j                  t        j                  |       t        j                  |      t        d      t        d      t        d             t        j                  t        j                  |       d      }|j                  s]t        j                   | d      }t        j                  t        j                  |       |t        d      t        d      t        d             t        j"                  ||       |S # t$        $ r t&        r
t)                t        j*                  ||       |t         j                  k(  rZt        j                  t        j                  |       t        j,                  |      t        d      t        d      t        d              w xY w)	NzRoot/AcroForm/SigFlagsr  r  r  r  zRoot/AcroForm/Fieldsr   Fields)rf   r   ra  r  pdf_create_annot_rawr  r   JM_set_field_typer7  r   PDF_WIDGET_TYPE_SIGNATURESigFlag_SignaturesExistSigFlag_AppendOnlyr  
pdf_new_ntr   r  r0  r   r   rF   r\  r  )	r   r   r   	fieldnameold_sigflagsr   r   r  rh  s	            r   r
  r
  7:  s   ##E$7$78I8I#8NPh$ijL
 &&tU-C-CDE##E*I&#y$/&&y(3-K5222#'>AS'STH%%c*$$X.V$Z(Z( ""5#4#4S#9;QR&&sA.D%%c*V$Z(X& 	T9- L  N$4tU+5222%%c*%%l3V$Z(Z( 	s   7EG BI)c                    t         rt        j                  |       S t        |       }t	        j
                  t	        j                  | t        d                  }t	        j                  |      st	        j                  |      r|}|j                  |j                  z
  }|j                  |j                  z
  }||_        ||_
        |S )z%
    return a PDF page's CropBox
    r  )r   r   ry  r&  rf   r
  r  r   rf  re  r  r  )r  r  rz  r  r  s        r   ry  ry  i:  s     ))8$H..x)9LMG   )U-C-CG-L	wzz	!B	wzz	!BGJGJNr   c                     t        |       }t        |j                  |j                  z
        }t        |j                  |j
                  z
        }t        j                  ||      }|S r   )ry  r  r  r  r  r  rf   fz_make_point)r  r   r   r  rz  s        r   JM_cropbox_sizer  }:  sQ    hDDGGdggADGGdggAq!$DKr   c                 B    t        |       }t        j                  |      S )z&
    just the inverse of rotation
    )r_  rf   rU
  )r   mps     r   r  r  :  s     
t	$B!!"%%r   c                    d}t        j                  | d      }t        j                  |t        d      d       t        j                  |t        d      d      }t        j                  |t        d      |       t        j                  |t        d      |       t        j                  |t        d      |       t        j
                  |t        d	      t        d
             d}	t        j                  | t        j                  |	      t        j                         d      }
t        j
                  |t        d      |
       t        | |
||       t        j                  |      \  }}t        j                  |
t        d      |       t        j                  |
t        d      |       t        j                  |
t        d      d      }t        j                  |t        d      |       |S )zE
    embed a new file in a PDF (not only /EmbeddedFiles entries)
    r   r   r6  r  rh  ri  rk  rl  ru  Filespecs     r  rm  rn  ro  )rf   r  r  r   r7  r  r  rb  r  r   r  r  )r  r  r3   r  r{  r3  r=  r   efbsr  r  r`  s                r   r/  r/  :  sv    D


S!
$C	C$3		 	 htna	8B	""3x@	""3	B	""3(8$?	sHV,hz.BC	B004LLN	A 
r8C=!,S!S(+%%c*GD!	1htnd3	1hx0$7$$Q(:A>F	68F#3T:Jr   c                    t        j                  t        j                  |       t        d            }t        j                  |t        d            }|j                  r7t        j
                  |      dk(  rt        j                  |t        d             t        j                  |t        d      t        d      t        d            }|j                  r!t        j                  |t        d      d       yy)	z
    perform some cleaning if we have /EmbeddedFiles:
    (1) remove any /Limits if /Names exists
    (2) remove any empty /Collection
    (3) set /PageMode/UseAttachments
    r  
Collectionr   r   r!  r  r  N)	rf   r   r  r   r   r;  r   r   r  )r  r  collefiless       r   r  r  :  s     u00#68HID dH\$:;D5--d3q84,!78  W_%W	F hz&:<LM r   c                 d    | j                   syt        j                  |       }t        |d      }|S )Nr(   r  errors)r   rf   r  rp  )r  r)  r   s      r   rY  rY  :  s-    ??$$T*A
*1Y
?CJr   c           	         t        j                  t        j                  |       t        d            }|j                  st        j
                  d      }d}|D ]  }|t        |      z  } t        j                  t        j                  |       t        d      d      }t        j                  |t        j                  |t        |                   t        j                  |t        j                  |t        |                   yy)z!
    Store ID in PDF trailer
    rz  r  r(   rr   N)rf   r   r  r   r   
fz_memrnd2r  r  r0  rg  r'  )r  r  rnd0rndr  s        r   r  r  :  s     

e//4htn
EC>>#  	A3q6MC	&&(9(93(?$QRSc5#7#7c#h#GHc5#7#7c#h#GH r   c                    t        j                  t        j                  t        j                  |       t        d            t        d            }|j                  r|S t        j                  t        j                  |       t        d            }t        j
                  |t        d      d      }t        j                  |t        d      d       t        j
                  |t        d      d      }t        j                  |t        d      d       t        j                  |t        d	      d       t        j                  |t        d
      d       t        j                  |t        d      d       |S )z7
    Ensure OCProperties, return /OCProperties key
    r  r  rr   r  r   rI  r
   r  r  r  RBGroups)rf   r   r  r   r   r  r  )r  r  r  rI  s       r   r  r  :  s    

U//0A0A#0FQWHXY[cdr[s
tC
~~
e//4hv6FGD

!
!$(@!
DC	S(6"2A6Xc]A6A	Q2	Q3	Q 115	Q 4a8Jr   c                 *   | sy| j                  d      ry| j                  d      ry| j                  d      ry| j                  d      ry| j                  d      ry	| j                  d
      ry	| j                  d      ry| j                  d      ryy)z'
    Make /DA string of annotation
    r	  Cor	  coTir	  tiSySymbr	  Zar	  za)r   r  s    r   JM_expand_fnamer  :  s|     6tvtvtvtvtvtvtvtvr   c                    | t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j
                  k(  ry| t         j                  k(  ry| t         j                  k(  ryy)	z!
    String from widget type
    ButtonCheckBoxRadioButtonTextListBoxComboBox	SignaturerC  )rf   r	  r	  r	  PDF_WIDGET_TYPE_TEXTPDF_WIDGET_TYPE_LISTBOXPDF_WIDGET_TYPE_COMBOBOXr  )wtypes    r   JM_field_type_textr  ;  s~     ,,,...111***---...///r   c                    t        | t        j                        sJ t        j                  |t        j                  |             }|j
                  |j                  z
  }|j                  |j                  z
  }|dk  s|dk  ry| j                         }||j                  | j                         z
  z  | j                         |j                  | j                         z
  z  z   }	 |}t        |      D ]?  }t        | j                               D ]!  }	t        j                  | |||	          |dz  }# A ||z  }|dz  }|dk(  r	 yar  )rs   rf   r^  r  r  r  r  r  r  rk  r  r?  r  r  rl  )
r  r  r  r   r  r  r  r)  r  r  s
             r   r  r  ;  s!   dENN+++  E$8$8$$?@A	qttA	qttAAva{{}Htvvx(4668qttdffh+GGE
q 	ADFFH% $$T1c!f5Q	 		Q6 r   c                    t        | t        j                        sJ d}t        j                  |       }d}t        j                  |       }t        j
                  |      }	 t        |t        j                        sJ |j                  snft        j                  |      }t        j                  |d      }|j                  rt        j                  ||      sd}nt        j                  |      }|r|S y)z
    Return the first annotation whose /IRT key ("In Response To") points to
    annot. Used to remove the response chain of a given annotation.
    Nr   r   r  )
rs   rf   r   r   r   r~  r   r   r>  r  )r   r`  r   rb  r   irt_annot_objrc  s          r   r[  r[  0;  s    
 eU^^,,,I##E*IE&D%%d+I
)U^^444##++I6u5<<##Ay1((3	   r   c                     t        | t        j                        sJ t        j                  ryt        j
                  |       S )3
    need own versions of ascender / descender
    r  )rs   rf   r  r
  r[   r  )r)  s    r   r  r  K;  s5     dELL)))%%!!$''r   c                     t        | t        j                        sJ t        j                  ryt        j
                  |       }|S )r  gɿ)rs   rf   r  r
  r[   r  )r)  rN   s     r   r  r  U;  s9     dELL)))%%

!
!$
'CJr   c                 R    | dk  s| dk(  ry|syt        |       }|D ]	  }||k(  s	 y y)z7Check if ch is an extra word delimiting character.
    r   r  TFr  )r  rv  r  r  s       r   rt  rt  `;  sA     
Rx29r7D 9 r   c                     t        | t        j                        sJ t        j                  |       }|j	                  d      }t
        j                  s
|dk(  s|dk7  r|S ||dz   d  S )N+rY  r   r   )rs   rf   r  r  ri   r
  rZ   )r)  r   r)  s      r   JM_font_namer  n;  s]    dELL)))d#D		#A  AGqAvA<r   c           	      b   d}t        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  ||      }t        j
                  |      sCt        j                  dt        j                  |       dt        j                  |       d       t        j                  |t         j                        }	t        j                  |t         j                        }
|
j                  rt        j                  |
      r%t        j                  |t         j                        }n|
}t        j                  |t         j                        }t        j
                  |      r$t        j                  |t         j                         }t        j                  |      }d}|rt#        | |      }||t        j                  |	      t%        t        j                  |            t        j                  |      t        j                  |      |f}|j'                  |        |S )Nr   r   z' is no font dict ( 0 R)rA  )rf   r;  r  r=  r<  r:  fz_warnr9  r   r   PDF_ENUM_NAME_SubtypePDF_ENUM_NAME_BaseFontr   rC  PDF_ENUM_NAME_NamePDF_ENUM_NAME_EncodingPDF_ENUM_NAME_BaseEncodingrD  rt  r6   )r  dict_fontliststream_xrefrh   r?  r  refnamer  rI  rJ  r   r  r   rV  r$  s                   r   JM_gather_fontsr#  w;  s   	
B5!A1X ((2))%3  *MMQu009::MeN^N^_gNhMiinop$$Xu/J/JK%%h0L0LM""e&7&7&A%%h0H0HIDD%%h0L0LMX&))(E4T4TUH)&sD1C!!'*#E$5$5d$;<!!'*!!(+ 	=> Ir   r  r!  c           	      T   t        | t        j                        sJ d}t        j                  |      }t	        |      D ]  }t        j
                  ||      }t        j                  ||      }t        j                  |      sCt        j                  dt        j                  |       dt        j                  |       d       t        j                  |t        d            }	t        j                  |	t        d            st        j                  |t        d            }
t        j                  |t        d            }|j                  rt        j                  |      }nt        j                          }|
j                  r*t        j"                  t        j$                  |
      |      }n-t        j&                  t        j&                  j(                        }t        j                  |      }|t        j                  |      |t+        |      f}|j-                  |        |S )	z6
    Store info of a /Form xobject in Python list
    r   r   z' is no form dict (r  r=  Formr   r5  )rs   rf   r   r;  r  r=  r<  r:  r  r9  r   r   r   rB  r   pdf_to_matrixr2  r`  r
  r(  r)  r'  r6   )r   r  	imagelistr!  rh   r?  r  r"  	imagedictr  rc  rA  r6  r   r   r$  s                   r   JM_gather_formsr)  ;  s    c5,,---	
B5!A1X  ((%3**5!4	  +MMQu009::MeN^N^_hNiMjjopq""9hy.AB  (89y(6*:;y(8*<=<<%%a(C.."C<<**E,=,=a,@#FD<< ; ;<D	* !!7+%	 	; < Ir   r   c                    d}t        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  ||      }t        j
                  |      sCt        j                  dt        j                  |       dt        j                  |       d       t        j                  |t        d            }	t        j                  |	t        d            st        j                  |      }
d}t        j                  |t        d      t        d	            }|j                  rt        j                  |      }t        j                  |t        d
      t        d            }t        j                  |      rt        j                  |d      }t        j                   d      }t        j                  |t        d      t        d            }t        j                  |      r|}t        j                  |d      }t        j                  |t        d            st        j                  |t        d            rAt        j                  |d      }t        j                  |      rt        j                  |d      }t        j                  |t        d      t        d            }t        j                  |t        d      t        d            }t        j                  |t        d      t        d            }|
|t        j"                  |      t        j"                  |      t        j"                  |      t%        t        j                  |            t%        t        j                  |            t%        t        j                  |            t%        t        j                  |            |f
}|j'                  |        |S )z/
    Store info of an image in Python list
    r   r   z' is no image dict (r  r=  rO  r   rP  rQ  Filterri  
ColorSpaceCSDeviceN
Separationrr   r
  r
  r
  r   BitsPerComponentBPC)rf   r;  r  r=  r<  r:  r  r9  r   r   r   rB  rU  r   r.  r^  r  r   rt  r6   )r   r  r'  r!  rh   r?  r  r"  r(  r  r   genrx  rR  altcsr  csesr  r  rm  r$  s                        r   JM_gather_imagesr5  ;  s    
BE"A1X 0 ((2**5!4	  +MMAe//899MeN^N^_hNiMjjopq""9hy.AB  (9:	*##Ix/@(6BRS""5)C%%i(1CXc]Sg&))'15GQ  H\,BHTNSb!D$$T1-B!!"hy&9:((Xl-CD++D!4%%e,!//q9E##Ix/@(3-P$$Y0BHSMR!!)X6H-I8TY?[   '  (  %#E$5$5b$9:#E$5$5e$<=#E$5$5g$>?#E$5$5g$>? 	a0 b Ir   c                 0   t        | t        j                        sJ d}t        j                  |       }	 |j                  snD|t        j
                  t        j                  |            k(  rd}nt        j                  |      }Q|st        d|z        |S )z$
    retrieve annot by its xref
    r   r   z$xref %d is not an annot of this page)	rs   rf   r   r~  r   r   r   r  r   )r   r   rb  r   s       r   r
  r
  ;  s     dEMM***E!!$'E
5##E$7$7$>??E$$e,  >EFFLr   c                 h   t        | t        j                        sJ |syd}t        j                  |       }	 |j                  sn]t        j
                  t        j                  t        j                  |      d            \  }}||k(  rd}nt        j                  |      }j|st        d|z        |S )z*
    retrieve annot by name (/NM key)
    Nr   r   r  z!'%s' is not an annot of this page)
rs   rf   r   r~  r   pdf_to_stringr   r   r  r   )r   r   rb  r   rj  r=  s         r   r
  r
  <  s     dEMM***E!!$'E
,,U-@-@ATATUZA[]a-bc$8E$$U+  ;dBCCLr   c                    g }t        j                  | j                         t         j                        }|j                  s|S t        t        j                  |            D ]_  }t        j                  ||      }t        j                  |d      }|j                  s<|j                  t        j                  |             a |S )Nr  )rf   r   r   PDF_ENUM_NAME_Annotsr   r  r]  r^  r   r6   r   )r   r#  ra  r  r   r   s         r   rP  rP  *<  s    EU-G-GHFE''/0 ''2	""9d3??LL((.	 Lr   c                 l   t         rt        j                  |       }|S g }t        j                  | t        d            }t        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  |      }t        j                  |t        d            }|j                  sZt        j                  t        j                  |            }|t        j                  k(  rt        j                  |d      }	|j                  ||t        j                   |	      f        |S )zK
    return the xrefs and /NM ids of a page's annots, links and fields
    rX  r=  r  )r   r   rv  rf   r   r   r]  r  r^  r   r   rA  r9  PDF_ANNOT_UNKNOWNr   r6   r   )
r  r#  ra  r?  r  r   r   rI  r  r  s
             r   rv  rv  8<  s    ,,h7E8H+=>FV$AAY 
E''3	+$$i)1DE!!00%2C2CW2MNE+++!!9d3tUE$<$<c$BCD
E Lr   c                     | j                         } | j                  s
t               S t        | j	                               S r   )rB
  r   rt   rv  r   r   s    r   rT  rT  Q<  s-    >>D??v!488:..r   c                 6   t         j                  }| |S | }|j                  d      s|j                  d      rt         j                  }|S |j                  d      s|j                  d      rt         j                  }|S |j                  d      s|j                  d      rt         j
                  }|S |j                  d      s|j                  d      rt         j                  }|S |j                  d	      s|j                  d
      rt         j                  }|S )z7
    return pdf_obj "border style" from Python str
    r  r  r  rI  r  rs  rb  Ur)  r	  )rf   PDF_ENUM_NAME_Sr   PDF_ENUM_NAME_BPDF_ENUM_NAME_DPDF_ENUM_NAME_IPDF_ENUM_NAME_U)r  r   r)  s      r   r  r  X<  s     

C}
A	
c	all3/%:O:OC
 J	 
c	all3/%:O:OC J 
c	all3/%:O:OC J 
c	all3/%:O:OCJ 
c	all3/%:O:OCJr   c
                 d  	 	fd}
d}d}|r t        j                  d||d      } |
|      S |r+t        |      }t        j                  d||d      } |
|      S |dkD  rt        j                  |      } |
|      S | rHt        j
                  |       }|j                  r |
|      S t        j                  | ||      } |
|      S t        j                  ||      \  }}}d}|rt        j                  d|||d      }|j                  r |
|      S t        j                  |||||      } |
|      S )z6
    return a fz_font from a number of parameters
    c                     | j                   st        t              | j                   j                  j                  st        j                  |        | S r   )r   r   MSG_FONT_FAILEDr  r  rf   fz_set_font_embedding)r)  r  s    r   fertigzJM_get_font.<locals>.fertigw<  s=    //$$00''e4r   r   NrY  )rf   fz_new_font_from_filer   r_  fz_new_cjk_fontfz_new_base14_fontr   fz_new_builtin_fontfz_lookup_noto_fontr\  fz_load_fallback_font)r   r  r  r  r  rW  r  r  r  r  rI  r*  r)  r   rN  rz  s            `      r   r  r  h<  s7    ED**D(E1Ed| ,,,dCBd|"}$$X.d| ''1??$<((7IFd| 1164@D$D,,dD$qId|&&hSD$<r   c                 Z   |dk  ryt        j                  | |      }t        j                  |t        d            }|j                  rIt        j
                  t        j                  |d            }t        j                  |t        d            }nt        j                  |t        d            }|j                  st        d       y|}d}t        j                  |t        d            }|j                  r|}t        j                  |t        d            }|j                  r|}t        j                  |t        d	            }|j                  r|}t        j                  |t        d
            }|j                  r!t        j                  |      st        d       yt        j                  |t        d            rnKt        j                  |t        d            rn+t        j                  |t        d            rnt        d       |st        d       yt        j                  |      S )z@
    Return the contents of a font file, identified by xref
    r   NDescendantFontsr   FontDescriptorz%invalid font - FontDescriptor missingFontFile	FontFile2	FontFile3r=  invalid font descriptor subtypeType1CCIDFontType0COpenTypez6warning: unhandled font type {pdf_to_name(ctx, obj)!r}zwarning: unhandled font type)rf   rK  r   r   r   rk  r^  rB   rr  rB  r   )r   r   rc  desftr   r|  s         r   r^  r^  <  s    axc4(Aq(+<"=>E(()<)<UA)FG  h/?&@A  H-=$>?>>79AF


Q 4
5C
~~


Q 5
6C
~~


Q 5
6C
~~  hy&9:>>%"3"3C"856S(8"45sH_$=>sHZ$89LM./  ((r   c                    t        j                  | t        d      t        d            }|j                  syt        j                  |      }|dk  ryg }t        |      D ]k  }t        j                  ||      }t        j                  ||      }t        j                  |      }t        j                  |      }|j                  ||f       m |S )z
    Return the items of Resources/Properties (used for Marked Content)
    Argument may be e.g. a page object or a Form XObject
    r   
Propertiesr    r   )rf   r   r   r   r;  r  r=  r<  r9  r   r6   )	r
  
propertiesr?  rh   r  r  r   rs  r   s	            r   r
  r
  <  s    
 $$S(;*?,AWXJ  z*q5q 	!A((Q7C((Q7C!!#&A##C(DIIq$i 	! Ir   c                 $   d}t        j                  |       }|j                  rRt        j                  |      }|t        j                  |      k(  rd}n"t        j
                  |      }|j                  rR|st        d| d      t        |      S )z%
    retrieve widget by its xref
    FTzxref z is not a widget of this page)rf   r  r   r   r   r  r   r   )r   r   rb  r   r   s        r   r#  r#  <  s     E""D)E


''/	5##Y//E%%u- 

 5&CDEE%=r   c                    t        j                  | j                        }t        j                  | j                        }|j	                         }| }fd}d }t        j
                  |j                        }|_        |t         j                  k(  r*t        j                  ||      r
 |dd       n |dd       n	 |dd        |dt        t        j                  |                    |dt        t        |                   t        j                  |      }	 |d	|	       t        j                  |t        d
            }
|
j                  rt        j                   |
      } |d|       d}|t         j"                  k(  rt        j                  |t        d            }
|
j                  r |dt        j$                  |
             t        j                  |t        d            }
|
j                  rt        j&                  |
      }|st        j(                  |      } |dt        |              |dt        j*                  |             t        j,                  t        j.                  |t        d      t        d                  }|dk(  rd} |d|       t        j.                  |t        d      t        d            }
t        j0                  |
      rat        j2                  |
      }dg|z  }t5        |      D ].  }t        j6                  t        j8                  |
|            ||<   0  |d|        |dt        j:                  |j                                |dt        j<                  |j                               t        j.                  |t        d      t        d            }
t        j0                  |
      rat        j2                  |
      }dg|z  }t5        |      D ].  }t        j,                  t        j8                  |
|            ||<   0  |d|       t        j.                  |t        d      t        d            }
t        j0                  |
      rat        j2                  |
      }dg|z  }t5        |      D ].  }t        j,                  t        j8                  |
|            ||<   0  |d|        |dt?        |              t        j                   t        j@                  |t        d                   } |d!t        |             t        j.                  |t        d      t        d"            }
|
j                  r& |d#t        t        j                   |
                    |d$t        jB                  |             jE                          t        j                  |t        d%            }tG        |      } |d&|        |d'tG        t        j.                  |t        d(      t        d)                          |d*tG        t        j.                  |t        d(      t        d+                          |d,tG        t        j.                  |t        d(      t        d-                          |d.tG        t        j.                  |t        d(      t        d/                          |d0tG        t        j.                  |t        d(      t        jH                  d1                          |d2tG        t        j.                  |t        d(      t        jH                  d3                         y)4z
    Populate a Python Widget object with the values from a PDF form field.
    Called by "Page.first_widget" and "Widget.next".
    c                      t        | |       y r   r  )r  ry   r  s     r   SETATTRz)JM_get_widget_properties.<locals>.SETATTR=  s    U#r   c                     t        | ||       y r   ra  )modr  ry   s      r   SETATTR_DROPz.JM_get_widget_properties.<locals>.SETATTR_DROP=  s     	S% r   r	  TFNr	  r	  r	  TUr	  rZ  r	  r	  r	  r	  rq  r
  r   r   r	  rI  r	  r	  r	  MKBGr  BCru  r	  re
  r	  r   r	  r	  rH  r  r	  AAKr	  ri  r	  Vr	  r  r	  Blr	  Fo)%rf   r   r   r   r   pdf_widget_typer	  r  pdf_signature_is_signedr   pdf_field_border_styler  pdf_load_field_namer   r   r   r   r	  r   r9  pdf_field_valuepdf_field_displayr  r   r.  r]  r  r   r^  pdf_text_widget_max_lenpdf_text_widget_formatr  r  pdf_field_flagsr   JM_get_scriptr  )r   r  r   r   r  twrb  re  r	  r	  r   r4  fvaluer	  r?  r  r  r  r(  r)  sss    `                   r   JM_get_widget_propertiesr|  =  s    ##EJJ/I

+D
((*C	B$! &&rww/J"FU444((i8K&K&T"):5;W;WXa;b)cd,.?@RS]@^._`**95Jz2


Y
7C
~~((-V]E2FU666  )Xh-?@>>e.>.>.DE  HTN;>>&&s+F&&y1(9&(AB%*A*A)*LM$$U%8%8HTNT\]`Ta%bcLq6


i$#
GC#$C!Gq 	AA##E$7$7Q$?@AaD	AV_a0(E(Ebgg(NO(D(DRWW(MN


i$$
HC#$cAgq 	DA&&u':':3'BCCF	DV\3/


i$$
HC#$cAgq 	DA&&u':':3'BCCF	DV^S1*;E*BC		!	!%"@"@HUYN"[	\B%6r%:;


i$$
HC
~~V-/@AYAYZ]A^/_`(=(=i(HI  	9hsm4A	q	B2&%--i$RUWX %--i$RUWX %--i$RUWX %--i$RUWX %--i$I[I[\`Iabc %--i$I[I[\`Iabcr   c                    |dk  ryt        j                  | |      }t        j                  |t        d            }|j                  rIt        j
                  t        j                  |d            }t        j                  |t        d            }nt        j                  |t        d            }|j                  sy|}t        j                  |t        d            }|j                  ryt        j                  |t        d            }|j                  ry	t        j                  |t        d
            }|j                  rt        j                  |t        d            }|j                  r!t        j                  |      st        d       yt        j                  |t        d            ryt        j                  |t        d            ryt        j                  |t        d            ryt        dt        j                  |             y)zF
    Return the file extension of a font file, identified by xref
    r   rA  rQ  r   rR  rS  pfarT  ttfrU  r=  rV  rW  cffrX  cidrY  otfzunhandled font type '%s')rf   rK  r   r   r   rk  r^  rr  rB   rB  r9  )r   r   rc  rZ  r   s        r   rD  rD  =  s    axc4(Aq(+<"=>E(()<)<UA)FG  h/?&@A  H-=$>?>>A


Q 4
5C
~~


Q 5
6C
~~


Q 5
6C
~~  hy&9:>>%"3"3C"856S(8"45sH_$=>sHZ$89.0A0A#0FGr   c                    t               }t        j                  |       rft        j                  |       }t	        |      D ]C  }t        j
                  | |      }t        j                  |      }||vs3|j                  |       E |S )z
    Get OCG arrays from OC configuration
    Returns dict {"basestate":name, "on":list, "off":list, "rbg":list, "locked":list}
    )rt   rf   r.  r]  r  r^  r   r6   )r   list_r?  r  r   r  s         r   JM_get_ocg_arrays_impr  =  sy    
 FE3%q 	#A%%sA.C##S)D5 T"		#
 Lr   c                    t               }t        j                  | t        d            }t	        |      }|r||d<   t        j                  | t        d            }t	        |      }|r||d<   t        j                  | t        d            }t	        |      }|r||d<   t               }t        j                  | t        d            }t        j                  |      rWt        j                  |      }t        |      D ]4  }t        j                  ||      }t	        |      }|j                  |       6 |r||d<   t        j                  | t        d	            }|j                  rt        j                  |      }||d
<   |S )Nr  r  r  r  Lockedr6  r  r  r  r   )r   rf   r   r   r  rt   r.  r]  r  r^  r6   r   r9  )	confrh   r   r  r?  r  r   list1r
  s	            r   r  r  =  sO   	B


dHTN
3C!3'E4


dHUO
4C!3'E5	


dHX$6
7C!3'E8FE


dHZ$8
9C3%q 	 A%%sA.C)3/ELL	  :


dH[$9
:C
~~!!3';Ir   c                    t        j                  |      }t        d|d      D ]  }t        j                  t        j                  ||            }t        j
                  |      }t        j                  t        j                  ||dz               }t        |dd      }t        j                  |      }t        |t              sJ |j                  d      }| j                  ||f        y )Nr   rr   r   r  )rf   r]  r  rk  r^  r   rG  fz_buffer_extractrs   r   r8  r6   )	r  rn  r?  r  r  r  r   r   rs  s	            r   rl  rl  =  s    D!A1a^  ((%*=*=dA*FGs#((%*=*=dAE*JK!#q!,##C(!U###HHWsAh r   c                    | j                   syt        j                  | t        d            }t        j                  |      }|dk(  r,t        j                  | t        d            }|j                   syyt        j
                  |      rt        t        j                  |            }n7t        j                  |      r!t        j                  |      }t        |      }ny|r|S y)z
    JavaScript extractor
    Returns either the script source or None. Parameter is a PDF action
    dictionary, which must have keys /S and /JS. The value of /S must be
    '/JavaScript'. The value of /JS is returned.
    Nr	  
JavaScriptJS)r   rf   r   r   r9  rF  r   r   r   r   rY  )r  rB  jjjsr  r   s         r   rx  rx  =  s     >>3.A			1	B	\Xd^4}}2"5#;#;B#?@			R	 ##B'',
r   c                 ^    | j                   j                  rt        j                  | d      syy)z(
    Ensure valid journalling state
    r   r   )r   r  rf   r  r7  s    r   r6  r6  >  s&     ~~e&=&=c1&Er   c                 4   | t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j
                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry	| t         j                  k(  ry
| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ry| t         j                  k(  ryy)z/
    return extension for MuPDF image type
    faxrU  flatelzwrldbmpgifrS  r  rR  jxrrT  r  tiffrA  )rf   rb  ra  rc  rd  re  FZ_IMAGE_BMPFZ_IMAGE_GIFrY  FZ_IMAGE_JPEGrW  FZ_IMAGE_JXRFZ_IMAGE_PNGFZ_IMAGE_PNMFZ_IMAGE_TIFF)r  s    r   r]  r]  >  s     """u"""u$$$w"""u"""u"""u"""u$$$u###v"""u"""u"""u"""u###vr   c                 `   t        |t        j                        sJ t        j                  t        j                  j                        }t        j
                  t        j                  |      |      }t        j
                  |t              }|t        |      f}t        j                  |       y r   )rs   rf   r2  r(  r  r  fz_quad_from_rectg_img_info_matrixJM_py_from_quad
g_img_infor6   )r  r  r   r
  r   ri
  rR  s          r   JM_image_filterr  6>  s{    c5>>***U\\,,-A!8!8!;SAA$56A##Ddr   c                 V   | syt        |       }|dk  rt        d       y| }t        j                  |      }|t        j                  k(  ry|rt        j
                  ||      }nt        j                  ||      }t        j                  |      }t        j                  |      }t        j                  |      \  }}	t        j                  |      }
t        j                  |j                               }t               }|j                         |t        <   |j!                         |t"        <   |
|d<   t%        |      |t&        <   ||t(        <   |	|t*        <   |j-                         |t.        <   |j1                         |t2        <   t5        |      |t6        <   ||t8        <   |r	||t:        <   |S )z
    Return basic properties of an image provided as bytes or bytearray
    The function creates an fz_image and optionally returns it.
    NrN	  rW  orientation)r'  rB   rf   r\  r[  rb  fz_new_buffer_from_shared_datark  fz_image_orientation_matrixrl  fz_image_orientationru  r  r   r   ro  r  rp  r1  rA  rs  rt  r?  rq  rm  rr  r]  rE  ru  rv  )r  
keep_imager=  rs  r  r   r
  r  rz  r{  r  r|  r  s                r   JM_image_profiler  ?>  sp   
 	?Dax!"A++Q/E&&&22At<22At<**C0E

+
+U
3C**51JD$,,e4K&&(8(8(:;GVF"WWYFM#ggiFN(FM/4FN FL FL"''')F 99;FK-e4FK&FO!&Mr   c                 `   | j                         }t        j                         at        j                         }t        j
                  | |t                G d dt        j                        } |       }t        dddd|      }g at        j                  || |       t        t              }g a|S )Nc                   <     e Zd Z fdZedk\  rd Z xZS d Z xZS )0JM_image_reporter.<locals>.SanitizeFilterOptionsc                 B    t         |           | j                          y r   r   r^   use_virtual_image_filterr]   r%
  s    r   r^   z9JM_image_reporter.<locals>.SanitizeFilterOptions.__init__s>  s    G))+r   )r   r+  r  c                 F    t        d t        j                  |      ||       y r   r  rf   r2  )r]   r(
  r  r   r
  r  s         r   image_filterz=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filterw>      ennS&94Gr   c                 F    t        d t        j                  |      ||       y r   r  r]   r(
  r  r   r
  s        r   r  z=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filterz>  r  r   )r`   ra   rb   r^   rw   r  r-
  r%
  s   @r   SanitizeFilterOptionsr  r>  s    	, +-HHr   r  r   )rL  rM  r0
  rN  r$
  )r   rf   r2  r  r(  r  PdfSanitizeFilterOptions2rP  r  ri  ru   )r   r   r  r  sanitize_filter_optionsfilter_optionsrh   s          r   r  r  k>  s    
((*C(||~H	T8->?	H ? ? 	H 45+)N J	""C~>	z	BJIr   c                     t        t        d       } t        t        d       }t        t        d       }t        t        d       }t        t        d       }t        t        d       }t        t        d       }t        t        d       }t        t        d	       }t               }	||	d
<   t        t        j                        |	d<   t        t        j
                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t        j                        |	d<   t        t               |	d<   t        t        j"                        |	d<   | |	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d <   t        t        j$                        |	d!<   |	S )"NTOFUTOFU_BASE14TOFU_CJKTOFU_CJK_EXTTOFU_CJK_LANG
TOFU_EMOJITOFU_HISTORICTOFU_SILTOFU_SYMBOLbase14cbzepubr  iccr  rR  r  r  zplotter-cmykz	plotter-gz	plotter-nzplotter-rgbz	py-memoryr  tofuztofu-cjkztofu-cjk-extztofu-cjk-langz
tofu-emojiztofu-historicztofu-silztofu-symbolxps)r  rf   r   r  FZ_ENABLE_CBZFZ_ENABLE_EPUBFZ_ENABLE_HTMLFZ_ENABLE_ICCFZ_ENABLE_IMGFZ_ENABLE_JPXFZ_ENABLE_JSFZ_ENABLE_PDFFZ_PLOTTERS_CMYKFZ_PLOTTERS_GFZ_PLOTTERS_NFZ_PLOTTERS_RGB	JM_MEMORYFZ_ENABLE_SVGFZ_ENABLE_XPS)
	have_TOFUhave_TOFU_BASE14have_TOFU_CJKhave_TOFU_CJK_EXThave_TOFU_CJK_LANGhave_TOFU_EMOJIhave_TOFU_HISTORIChave_TOFU_SILhave_TOFU_SYMBOLrN   s
             r   JM_fitz_configr  >  s   %eV44I%e];;%eZ88M%e^<<%e_==%e\::O%e_==%eZ88M%e];;
&C.CM"5#6#67CJ"5#7#78CK"5#7#78CK"5#6#67CJ"5#6#67CJ"5#6#67CJ"5#5#56CI"5#6#67CJ"5#9#9:C"5#6#67C"5#6#67C"5#8#89C"9oC"5#6#67CJ'CK+C
O/C0C-C0C+C
O.C"5#6#67CJJr   c                    t        j                  |t        d            }t        j                  | |t        j                         d      }t        j
                  |      }t        j                  |      r3|rt        j                  ||       |S t        j                  ||d       |S t        j                  | d      }|r9|j                  rt        j                  ||       t        j                  ||       n8t        j                  ||       |j                  rt        j                  ||       t        j                  |t        d      |       |S )ag  
    Insert a buffer as a new separate /Contents object of a page.
    1. Create a new stream object from buffer 'newcont'
    2. If /Contents already is an array, then just prepend or append this object
    3. Else, create new array and put old content obj and this object into it.
       If the page had no /Contents before, just create a 1-item array.
    r  r   r
   )rf   r   r   r  r  r   r.  r0  r  r  r   r  )r  r  newcontr
  r  newcontsr   carrs           r   r
  r
  >  s    !!'8J+?@H##C%,,.!DHH%D(#  84 K ""8Xq9 K ""3*""$$T84  x0  x0""$$T847HZ$8$?Kr   c
           
      z   d}
d}d}d}d}d}d}d}d}d}t        |        |	dkD  rt        j                  |	      \  }}}|r7t        j                  d||d      }
t        j                  | |
|	||      }d}d}n|rt        j
                  |      \  }}|r5t        j                  ||dd      }
t        j                  | |
|      }d}d}n|rt        j                  d||d      }
nCt        |      }|j                  st        t        t               t        j                  d||d      }
|st        j                  | |
      }d}nt        j                  | |
|      }d}t        j                  |      }t!        t        j"                  t        j$                  |t'        d                        }t)        t        j"                  t        j$                  |t'        d                        }|st)        t+        | |            }t        j,                  |
      }t        j.                  |
      }||||t1        |      |	||d	g}|S )
z 
    Insert a font in a PDF
    Nr   rY  rA  r   rr   r@  r=  )r   r   rV  rd  rW  r  r  )r  rf   r[  r\  pdf_add_cjk_fontr]  pdf_add_simple_fontrJ  r   r   rr  r  rp  r_  pdf_add_cid_fontr   rt  r9  r   r   r   rD  r  r  r  )r  rU  r  r  r
  r"  r  r  r  rW  r)  r   rN  ixrefr*  rd  ry   r   rC  extorz  r
  r  r  s                           r   r  r  >  s1    D
CDEEF
E	D	DDS"}!44X>dE,,T4uaH))#tXueL
 44V<JD$00tQJD00dHEHDF 2243J(4~~.0@A44T3QG 11#t< 44S$IX&E 1 153E3EhPXYcPd3e fgDe//1C1CXxXaOb1cdeD !5c5!AB

 
 
&C

!
!$
'Cv,$ E Lr   c                    t        | t        j                        sJ t        |t        j                        sJ t        j                  |t        j
                  |             }|j                  |j                  z
  }|j                  |j                  z
  }|dk  s|dk  ry| j                         }||j                  | j                         z
  z  | j                         |j                  | j                         z
  z  z   }| j                         | j                         z
  }| j                         }	 |}t        |      D ]~  }	t        |      D ]9  }
t        j                   | |      }d|z
  }t        j"                  | ||       |dz  }; |sMt        j                   | |      }|dz  }t        j"                  | ||        ||z  }|dz  }|dk(  r	 y)z>
    invert a rectangle - also supports non-alpha pixmaps
    r   r   r  )rs   rf   r^  r[  r  r  r  r  r  r  rk  r  r?  r  r  r  rm  rl  )r  r  r   r  r  r  rX
  r  r)  r  r  r{  s               r   r  r  $?  s    tU^^,,,q%--(((  E$8$8$$?@A	qttA	qttAAva{{}Htvvx(4668qttdffh+GGE	DJJL	 BJJLE
 		3ABZ ))432X$$dAr2Q	
 ))43a$$dAr2		3 		Q6! r   c                    t        | t        j                        r| S t        | t              rBt        j                  | j                  | j
                  | j                  | j                        } | S t        | t              rWt        j                  | j                  | j
                  | j                  | j                        }t        j                  |      }|S t        | t        j                        rt        j                  |       }|S | rt        |       rt        |       dk7  r#t        j                  t        j                        S g d}t        d      D ]_  }| |   ||<   ||   %t        j                  t        j                        c S ||   t        k  r	t        ||<   ||   t        kD  sWt        ||<   a t        j                   |d   |d   |d   |d         S )z>
    PySequence to mupdf.FzIrect. Default: infinite irect
    r  r  r   r   rr   r   )rs   rf   r[  r\  r  r  r  r  r   r(  rS
  rV
  rc  r  rq  rr  fz_make_irect)r   rN   r  r  s       r   r  r  G?  sn    !U]]#!UMM144qttQTT2!Tll144qttQTT2mmC 
!U\\"mmA
$Q'?1+=+B}}U4455A1X #t!Q4<==!8!899Q4/!"AaDQ4/!"AaD# qtQqT1Q4166r   c                      yrW   r    )r  s    r   rX  rX  e?  s    r   c                    t        j                  |       }t        j                  |t        d            }t        j                  |      rt        j
                  |      S t        j                  |      }g }t        |      D ]p  }t        j                  ||      }t        j                  |      rt        j                  |d      }|j                  t        t        j
                  |                   r |S )z 
    ListBox retrieve value
    rl  r   )rf   r   r   r   rF  r   r]  r  r^  r.  r6   r   )r   r   r  r?  r  r  elems          r   JM_listbox_valuer  q?  s    
 ##U+IHSM:FF#''00 	V$AE AY K""FA.t$&&a0D')A)A4)HIJ	K
 Lr   c           	      l   d}|dk  r|dz  }nZ|dk(  r||d   ddz  }nH|dk(  rJ |dk(  r||d   dd	|d   dd	|d   dd
z  }n!||d   dd	|d   dd	|d   dd	|d   ddz  }|dt        |       d	| dz  }t        j                  t        j                  |       t        j                  |       y )Nr(   r   z0 g r   r	  z g rr   r   rl   z rg z k rW  r  )r  rf   r7  r   PDF_ENUM_NAME_DA)r   r  r  r   r   r  s         r   rO
  rO
  ?  s    
 Cax	#a&3	q	#a&1SVAJaAqz66#a&1SVAJaAqz3q6!*C@@Qx()8*C88C	""5#6#6u#=u?U?UWZ[r   c                    t         rt        j                  | ||||      S d }g }t        j                  |       t        j
                  t        j
                  j                        }t        j
                  t        j
                  j                        } G d d      }	 |	       }
 |	       }d }d }|D ]	  }t        ||      }t        ||      st        j                  |      s2t        t        j                  t        j                  |j                  j                              ||      }t        j                  |j                  j                         }|j                  j"                  |_        ||_        t'        t        j                  t        j                  |j                  j                                    |_        |j                  j(                  |_        t+        t        j                  t        j                  |j                  j                                    |_        t/        t        j                  t        j                  |j                  j                                    |_        |j"                  |
j"                  k7  sL|j$                  |
j$                  k7  s3|j(                  |
j(                  k7  s|j                  |
j                  k7  r1|
j"                  dk\  r|r||t2        <   d }n't5        |      |t6        <   t        j                  |       t9        |      |t:        <   t=        |      |t>        <   t        j@                  ||      }|jC                  |       d }tE               }|j,                  }|j0                  }|j,                  dk  rd}d}|j"                  |tF        <   |j$                  |tH        <   tK        |j                        |tL        <   |j(                  |tN        <   ||d<   ||d<    |	|      }
|}|}t        j@                  ||      }|rtE               }t9        |j                  j                         |t:        <   t=        |      |t>        <   tQ        |j                  jR                        |tT        <   |g }|jC                  |       tW        ||j                  jR                          |r|r||t2        <   d }n't5        |      |t6        <   t        j                  |       t9        |      |t:        <   t=        |      |t>        <   t        jX                  |      s'|jC                  |       t        j@                  ||      }d }t        jX                  |      s|| tZ        <   |S || tZ        <   |S )	Nc                       e Zd ZddZd Zy)$JM_make_spanlist.<locals>.char_styleNc                 *   |rg|j                   | _         |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j
                  | _        y d| _         d| _        d| _        d| _        d| _        d| _        y )NrY  r(   r   rz  r  r)  r  r  r{  )r]   rd  s     r   r^   z-JM_make_spanlist.<locals>.char_style.__init__?  sq    HH	 YY
HH	 YY
77HH		
	
	r   c                     | j                    d| j                   d| j                   d| j                   d| j                   d| j
                   S )Nrl   r  r\   s    r   r   z,JM_make_spanlist.<locals>.char_style.__str__?  sH    ii[$**Qtyyk4::,azQRSWS\S\R]^^r   r   )r`   ra   rb   r^   r   r    r   r   
char_styler  ?  s    		_r   r  r   r:  r  r  r  r  ).r   r   JM_make_spanlistrf   r  r(  r  r  r  rf  r  r  r  r   r)  r  r  rz  r  r  r  r  r  r  r{  dictkey_charsrY  r   JM_py_from_pointdictkey_originr'  r?  r!  r6   r   rx  dictkey_flagsrt  dictkey_fontrL  r  rs  	dictkey_cr   re  dictkey_spans)	line_dictr=   rU  r  r%  	char_list	span_list	span_rect	line_rectr  	old_styler  r  span_originr  r   r  r  r  r{  	char_dicts                        r   r  r  ?  sG   %%isD'JJII	$U\\556IU\\556I_ _& ILEDK G2r" !,11':"5<<0E0EbmmFXFX0Y#Z\`bder}}334]]''
!%,,u/D/DR]]EWEW/X"YZ
mm))$U\\%2G2GHZHZ2[%\]	&u||E4I4I"--J\J\4]'^_
JJ)..(;;)//1;;)//1::/~~"*3D' $I *@)FD&))$/'7'D^$%4Y%?\"!//	9E	  $'6D))C::Dyy4!&D"'++D!4UZZ!@D"'++D"D $D #5)II K''	15	I(8"--:N:N(OIn%&5a&8Il##&r}}#7Ii  	Y'41OG2T "+DI!7!=D!!$'/<^,Y7\%%i0T"++IyAI!!),#,	-   $-	- r   c                     | j                         }t        j                  |j                               }|j	                         }|j                         }t        j                  }t        j                  |j                        }|r|j                  j                  }|t        j                  k  s|t        j                  k(  rt        j                  }d }|rQ|t        j                  k7  r>t        j                  t        j                  |j                              }	t!        |      }
n*t        j"                  |t        j$                               }	d}
t'        |	      }||t(        <   ||t*        <   |
|t,        <   ||t.        <   |j1                         |t2        <   |j5                         |t6        <   |j9                         |t:        <   t=        | j?                               |t@        <   tC        |      |tD        <   ||tF        <   y )NrT  )$r#  rf   rx  r  r   r  r[  r_  r   r`  r   r  rY  r  rf  rg  r]  rh  ri  r   ro  rp  rE  rq  rz  rs  r{  rt  rm  rr  r1  r@  rA  r'  rx  rv  )r&  rE  r
  r?  r   r  r  ll_fz_compressed_bufferrL  r  rV  s              r   JM_make_image_blockr  @  s   MMOEe..01A	A	A""E $AA%BRBRS'..33u!!!Ue.B.B%B&&F5E,B,B#Bnne557N7U7UVW '33E5;N;N;PQc"F!"J"#J"J&'J"# %

J %

J$yy{J"3E4E4E4G"HJ #FJ!'Jr   c           	         t         r7t        j                  | j                  |||j                  |j                        S g }t	        j
                  t        j
                  j                        }| D ]  }t	        j                  t	        j                  |t	        j
                  |j                  j                                    rt	        j                  |      sit               }t        |||||      }	t	        j                  ||	      }|j                  j                  |t        <   t!        |j                  j"                        |t$        <   t'        |	      |t(        <   |j+                  |        t'        |      |t(        <   ||t,        <   y r   )r   r   JM_make_text_blockr   rf   r(  r  re  rE  r   rf  r   r  r!  r  dictkey_wmoder  r9  dictkey_dirr'  r?  r6   dictkey_lines)
r&  rE  rU  r  r%  	line_list
block_rectr=   r  r  s
             r   r  r  >@  s-   ''(8(8*c4??\c\n\nooIell667J $""5#:#:7ELLQUQ`Q`QeQeDf#gh11':F	$Yc4I	((Y?
#'??#8#8	- !1$//2E2E!F	+"1)"<	,#$  /z:J| )J}r   c           	         t         r!t        j                  | j                  ||      S t	        j
                  d      }g }t	        j                  | j                  j                        }d}| D ]  }|dz  }t	        j                  |t	        j                  |j                  j                              s=t	        j                  |      s(|j                  j                  t        j                  k(  rt	        j                  |      sQt	        j                  t	        j                  |t	        j                  |j                  j                                    rt               }||t         <   |j                  j                  |t"        <   |j                  j                  t        j                  k(  r3t%        |j                  j                        |t&        <   t)        ||       nt+        |||||       |j-                  |        ||t.        <   y )Nr  rY  r   )r   r   r  r   rf   r  r(  r  fz_contains_rectr   rf  r   FZ_STEXT_BLOCK_IMAGEre  rE  r   r>  rF  r'  r?  r  r  r6   dictkey_blocks)	r  r  rU  text_buffer
block_listr%  r$  r&  rE  s	            r   r  r  U@  s   **2==)SII%%c*KJll2==112GG &1&&wU=M=M=R=R0ST11':$$))U-G-GG))'2**5+B+B7ELLY^YiYiYnYnLo+pqV
%,
>"#(#3#3#8#8
<   E$>$>>'6u7G7G7L7L'MJ|$z2uj#{GL*%+&, !+Inr   c           	      8   g d}t        | t        j                        r| S t        | t              rVt        j                  | j                  | j
                  | j                  | j                  | j                  | j                        S | rt        |       rt        |       dk7  rt        j                         S t        d      D ],  }t        | |      ||<   ||   t        j                         c S  t        j                  |d   |d   |d   |d   |d   |d         S )	N)r   r   r   r   r   r   r   r   r   rr   r   r  r
   )rs   rf   r2  r5  r   r  rs  r  r   r  rS
  rV
  r  rB  r(  )rA  r   r  s      r   r  r  v@  s    A!U^^$!V~~acc133QSS!##qss;;$Q'?1+=+B~~1X "Q"!Q4<<<>!" >>!A$!adAaD!A$!==r   c           	         t        j                  t         j                  j                        }t        j                  t        j                  | t        d                  }t        j                  |      st        j                  |      rd|_        d|_	        d|_
        d|_        t        j                  t        j                  |j                  |j                        t        j                  |j                  |j                        t        j                  |j                  |j                        t        j                  |j                  |j                              }|j                  |j                  z
  dk  s|j                  |j                  z
  dk  r-t        j                  t         j                  j                        }|S )z&
    return a PDF page's MediaBox
    r@  r   d    r   )rf   r(  r  r
  r  r   re  rf  r  r  r  r  fz_minfz_max)r  page_mediaboxr  s      r   r&  r&  @  s2    LL!8!89M  **8Xj5IJH h'5+D+DX+NLLLLhkk2LLhkk2LLhkk2LLhkk2	M 	=+++a/-"2"22Q6U\\%<%<=r   c
                    t         rt        j                  | |||||||||	
      S |}
d}t        j                  ||z
        dz   }||k  rO|}||k  rGt        | |||
||||	       |dz  }|dkD  r||z  dk(  rt        d| d| d       |dz  }|
dz  }
||k  rFyy|}||k\  rGt        | |||
||||	       |dz  }|dkD  r||z  dk(  rt        d| d| d       |dz  }|
dz  }
||k\  rFyy)z
    Copy a range of pages (spage, epage) from a source PDF to a specified
    location (apage) of the target PDF.
    If spage > epage, the sequence of source pages is reversed.
    r   r   z	Inserted r<
  z pages.N)r   r   r  rf   fz_absi
page_mergerB   )doc_desdoc_srcspageepageapager  r  ra  r  	graft_map	afterpagecounterr  r   s                 r   r  r  @  sH   " ## 	 IGMM%%-(1,Eu}emwy&%QZ[qLGq W}%<%A)G9Dw?@AIDNI em emwy&%QZ[qLGq W}%<%A)G9Dw?@AIDNI emr   c                    t        j                  | j                         t        d            }t        j                  |t        d            }t        j                  |t        d            }t        j                  |t        d            }t        j                  |t        d            }d}d}t        j                  |      rTt        j
                  |      }	t        j                  |      rt        t        j
                  |            D ]]  }
t        j                  t        j                  ||
            }|j                  d      s>t        j                  |dd       }||kD  s\|}_ n t        j                  |t        d      |	      }|dz  }t        |	      D ]x  }
t        j                  t        j                  ||
            }t        j                  |dd       |z   }d| }t        j                  ||
      }t        j                  |||       z t        j                  |      rt        t        j
                  |            D ]]  }
t        j                  t        j                  ||
            }|j                  d	      s>t        j                  |dd       }||kD  s\|}_ n t        j                  |t        d      d
      }|dz  }t        t        j
                  |            D ]x  }
t        j                  t        j                  ||
            }t        j                  |dd       |z   }d	| }t        j                  ||
      }t        j                  |||       z ||fS )aW  
    Merge the /Resources object created by a text pdf device into the page.
    The device may have created multiple /ExtGState/Alp? and /Font/F? objects.
    These need to be renamed (renumbered) to not overwrite existing page
    objects from previous executions.
    Returns the next available numbers n, m for objects /Alp<n>, /F<m>.
    r   r   r  rY  Alpr   Nr   ri  rr   )rf   r   r   r   r:  r;  r  r9  r=  r   fz_atoir  r<  r8  )r   temp_resr!  	main_extg
main_fonts	temp_extg
temp_fontsr  	max_fontsr?  r  r  rB  r:   r   r)  s                   r   r  r  @  s    ""488:x/DEI""9h{.CDI##Ix/?@J ""8Xk-BCI##Hhv.>?JGI #y)Y'5--i89  '')?)?	1)MN~~e,MM#ab'*w;G  //	8K;PRSTI1q 	6A##U%;%;Y%JKCc!"g&0A9D(()Q7C	45	6 $u))*56 	A$$e&<&<j!&LMD??3'd12h'A9}		 ,,Y8H!L
NI5%%j12 3  %"8"8*a"HIMM$qr(#i/1#w$$Z3Jc23 Yr   c                 X    t         j                  |        t        rt        d|         yy)z!
    redirect MuPDF warnings
    zMuPDF warning: N)r
  r6   JM_mupdf_show_warningsrB   rA   s    r   JM_mupdf_warningrA  A  s)     ""4(/$() r   c                 Z    t         j                  |        t        rt        d|  d       y y )NzMuPDF error: ry  )r
  r6   r  rB   rA   s    r   JM_mupdf_errorrC  !A  s)    ""4(-vR() r   c                 >    t        | t              sJ t        | |      S r   )rs   rt   JM_new_bbox_device_Device)rh   r  s     r   r  r  'A  s    b$$b*55r   c           
      \   t        | t        j                        sJ t        j                  | j                  j
                        }t        j                  d      }| D ]  }|j                  j                  t        j                  k(  s+|D ]~  }|D ]X  }t        |t        ||            st        j                  |      s/t        j                  ||j                  j                         Z t        j                  |t        d              t        j                  |t        d              |S )z1
    make a buffer from an stext_page's text
    rZ  ry  )rs   rf   r  r(  r   r  r  r   r  r  r  rf  fz_append_runers  r"  r  )r   r   r  r&  r=   r  s         r   JM_new_buffer_from_stext_pagerH  ,A  s     dE--...<<001D


c
"C 
1  E$=$== 5 ?B,T<b3IJ$)$=$=d$C ((bmmoo>? $$S#d)45   c$i0
1 Jr   c                    |yt        |      }|yt        j                  |j                  d            }t        j                  | |t        j
                         d      }t        j                  | d      }t        j                  |t        d      t        j                  d             t        j                  |t        d      |       |S )z
    make new PDF action object from JavaScript source
    Parameters are a PDF document and a Python string.
    Returns a PDF action object.
    Nr  r   r  r	  r  r  )
r
  rf   rb  r{  r  r  r  r  r   r  )r  ry   rN  r   source	newactions         r   JM_new_javascriptrL  AA  s     }D|

.
.t{{6/B
CC!!#sELLNA>F&&sA.I	y(3-1C1CL1QR	y(4.&9r   c                     t        |       S r   )JM_new_output_fileptr_Output)r:  s    r   r  r  WA  s    '--r   c                 X    | dk  r| dz  } | dk  r| dk\  r| dz  } | dk\  r| dz  dk7  ry| S )zB
    # return normalized /Rotate value:one of 0, 90, 180, 270
    r   rk  rl  r    )r  s    r   rB  rB  [A  sJ     1*# 1*
C-# C-{aMr   c                     t        j                  d      }t        j                  |      }t        j                  || ||       |j	                          t        j
                  |       |S )Nr  )rf   r  r  r  r  fz_terminate_buffer)r  r3  rM  r   r  s        r   rG  rG  hA  sS    


c
"C
..
C	T8U3	c"Jr   c                 .   | j                   s|S | }|j                   rt        j                  |      }||v s)t        j                  |t	        d            j                   r	 |S |j                  |       t        j                  |t	        d            }t        j                  |      rt        ||      }t        j                  |t	        d            }t        j                  |t	        d            }t        j                  |      s|}|j                   r|S )z
    Return list of outline xref numbers. Recursive function. Arguments:
    'obj' first OL item
    'xrefs' empty Python list
    ru  r  NextrZ  )r   rf   r   r   r   r6   r:  r  )r   r  thisobjnewxrefr  r   s         r   r  r  qA  s     >>G


""G,eu117HV<LMXX L 	g""GXg->?e$$eU3E$$gx/?@##Whx.@A  '*G 

 Lr   c                     d}t        j                  | j                         t         j                        }t        j                  |      }t        |      }|S )zE
    return a PDF page's /Rotate value: one of (0, 90, 180, 270)
    r   )rf   r  r   r  r   rB  )r   r  r   s      r   r/  r/  A  sF     F

(
($((*e6P6P
QCc"Ff%FMr   c                     t        j                  t        |d            }t        j                  |      }t        j                  t         j
                        }t        j                  | ||      }|S )zP
    create PDF object from given string (new in v1.14.0: MuPDF dropped it)
    r  )rf   rb  r   r'  	PdfLexbufPDF_LEXBUF_SMALLpdf_parse_stm_obj)r   r  r   r|  lexbufr  s         r   r  r  A  sX     225f3EFG!!'*F__U334F$$S&&9FMr   c                 x   t        | t        j                        sJ |t        j                         }|0t        |t        j                        sJ dt	        |      d|        t        j
                  |       }t        |      }t        |      }t        j                  ||      }t        j                  ||      }t        j                  |      }	t        |t        j                        sJ t        j                  ||	||      }
|rt        j                  |
       nt        j                  |
d       t        j                  |      sUt        j                   ||
|	      }t        j"                  | |t        j$                         |t        j&                                n~t        j(                  ||
      }t        j"                  | |t        j$                         t        j*                  t        j*                  j,                        t        j&                                t        j.                  |       t1        d|
      S )z
    Version of fz_new_pixmap_from_display_list (util.c) to also support
    rendering of only the 'clip' part of the displaylist rectangle
    ztype(seps)=r,   r  rU  )rs   rf   r  r  r   r  r  r  rE  r`  rF  rh  r]  r  r  rf  r  r  r2  r  r  r(  r)  r
  r  )r  r  r  r  r  ry  r   r  rV  r  r  r
  s               r   r  r  A  s    eU00111|""$<:dE,?,?@Z[T$ZMQSTXSYBZZ@&&u-Ds#FD!E""4/D""40D%Er5--...

'
'E4
?Cc"((d3$$U+00eD!!%enn.>u~~GWX&&vs3!!%enn.>U\\MhMh@ikpkykyk{|	#5#r   c                    t        | t        j                        r| S t        | t              r*t        j                  | j                  | j
                        S t        rt        j                  |       S t        j                  dd      }t        | d      }t        | d      }|||S t        |t              }t        |t              }t        |t              }t        |t              }t        j                  ||      S )zM
    PySequence to fz_point. Default: (FZ_MIN_INF_RECT, FZ_MIN_INF_RECT)
    r   r   )rs   rf   r  r  r  r  r   r   rA
  rB  r  rq  r  rr  )rd  r  r  r  s       r   rA
  rA
  A  s     !U]]#!U}}QSS!##&&%%q))	q!	BaAaAyAI	Q AQ AQ AQ A==Ar   c                 N   t         rt        j                  | |      S t        | t        j
                        sJ t        |t        j                        sJ t	        j                  |j                  j                        }d}d}d}d}t        |      D ]a  \  }}|j                  j                  t        j                  k(  r0t        |      D ]  \  }	}
t        |
      D ]  \  }} |z  } |	z  }||z  }c |D ]  }|j                  j                  t        j                  k(  s+|D ]}  }
d}|
D ]R  }t        |
|      }t	        j                  |      st        ||      s1|j                  j                   }t#        | |       T |dk7  sb|dkD  sht	        j$                  | d         y)z
    Plain text output. An identical copy of fz_print_stext_page_as_text,
    but lines within a block are concatenated by space instead a new-line
    character (which else leads to 2 new-lines).
    r   r  ry  N)r   r   r  rs   rf   r  r  r(  r   r  r  r   r  r  rf  r  rs  r   r
  )r   r   r   r)  n_blocksn_linesn_chars	n_blocks2r&  n_lines2r=   n_chars2r  chbboxs                 r   r  r  A  s    00d;;c5>>***dE--...<<001DIHGG%t, 	5  E$=$=="+U"3 $$$-t$4 LHb8#$ xGI  6  E$=$== 6	 7B)$3F11$7/f= %'MMOO	&sI67 ?y1}**3566r   c                    t        j                  | |      }t        j                  |       }|sH|r|j                  st        j                  | |       y|j                  rt        j                  ||       y|j                  r|j                  st        |      }nt        t        j                  ||            }||k7  rIt        ||      }|j                  st        j                  | ||       yt        j                  | |||       yy)a   
    Create a JavaScript PDF action.
    Usable for all object types which support PDF actions, even if the
    argument name suggests annotations. Up to 2 key values can be specified, so
    JavaScript actions can be stored for '/A' and '/AA/?' keys.
    N)	rf   r   rO  r   r   rx  rL  r  r  )r   key1key2ry   key1_objr  r  rK  s           r   JM_put_scriptrj  B  s     !!)T2H

&
&y
1C 4??y$/ 	   x. ??("5"5x(u11(DAB %c51	y$	:	9dDA r   c                 ^    | j                   | j                  | j                  | j                  fS r   r  r  s    r   r  r  4B  !    44qttQTT!!r   c                     | j                   | j                  | j                  | j                  | j                  | j
                  fS r   rK	  )rA  s    r   r1  r1  8B  s-    33QSS!##qssACC''r   c                 2    | j                   | j                  fS r   rA  )rd  s    r   r  r  <B  s    338Or   c                 ^   | j                   j                  | j                   j                  f| j                  j                  | j                  j                  f| j                  j                  | j                  j                  f| j
                  j                  | j
                  j                  ffS )z"
    PySequence from fz_quad.
    )rw  r  r  r  r  r  )ri
  s    r   r  r  @B  sn    
 TTVVQTTVVTTVVQTTVVTTVVQTTVVTTVVQTTVV	 r   c                 ^    | j                   | j                  | j                  | j                  fS r   r  r  s    r   r'  r'  LB  rl  r   c           
      8   t        | t        j                        r| S t        | d      r8t	        |       dk(  r*t        | d   d      rt        j
                  t        |        } t        | t        j
                        rt        j                  |       S t        | t              rt        j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                        S t        j                  dddddddd      }g d}| r$t        | t        t         f      rt	        |       dk7  r|S t#        | d      t        j                  t%        |             S t'        d      D ]  }|t	        |       k\  r|c S | |   }t)        |      rt+        |      dk7  r|c S t#        |d      ||   _        t#        |d      ||   _        ||   j                  ||   j                  |c S t-        ||   j                  t.              ||   _        t-        ||   j                  t.              ||   _        t1        ||   j                  t2              ||   _        t1        ||   j                  t2              ||   _         |d   |_
        |d   |_        |d   |_        |d   |_        |S )	Nr  r  r   r   r  rr   r   r   )rs   rf   r}  r  r'  r(  ru   r  r  fz_make_quadrw  r  r  r  r  r  rt   rB  r  r  rS
  rV
  r  rq  r  rr  )r   ri
  rd  r  r   s        r   rf
  rf
  PB  sa   !U\\"q- SVq[WQqT;5OLL%(#1ell#&&**1d!!	 	 	1aAq!Q2AAJq5$-0CFaKQ"&&q'9::1X /A;Hd$(<(AHsA&!sA&!Q466>QqTVV^Hadffo.!adffo.!adffo.!adffo.!/ Q4ADQ4ADQ4ADQ4ADHr   c                 h   t        | t        j                        sJ t        |               t        j                  | t        j
                        }t        j                  |      rt        j                  d      }t        t        j                  |            D ]t  }|dkD  rt        j                  |d       t        j                  ||      }t        j                  |      sJt        j                  |      }t        j                  ||       v |S |j                  rt        j                  |      }S )zJ
    Read and concatenate a PDF page's /Conents object(s) in a buffer
    r  r   r   )rs   rf   r  r   r   r
  r.  r  r  r]  r"  r^  r   r   fz_append_bufferr   )r  r  r   r  r   r
  s         r   r  r  }B  s     gu||,@g@,!!'5+G+GHH(#nnT"u**845 	2A1u$$S"-%%h2C""3',,S1&&sD1	2 J 
		##H-Jr   c                    t        | t        j                        r| S t        | t        j                        rt        j                  |       S t        | t              r@t        j
                  | j                  | j                  | j                  | j                        S t        | t              r@t        j
                  | j                  | j                  | j                  | j                        S | rt        |       rt        |       dk7  r-t        j                  t        j                  j                        S g d}t        d      D ]p  }t        | |      ||<   ||   /t        j                  t        j                  j                        c S ||   t         k  r	t         ||<   ||   t"        kD  sht"        ||<   r t        j
                  |d   |d   |d   |d         S )Nr  r  r   r   rr   r   )rs   rf   r(  r[  r   rG
  r  r  r  r  r\  rS
  rV
  r)  r  rB  rq  rr  )r   r  r  s      r   r  r  B  s`   !U\\"!U]]#||A!T!!!$$addADD99!U!!!$$addADD99$Q'?1+=+B||ELL7788A1X #Q"!Q4<<< ; ;<<Q4/!"AaDQ4/!"AaD# adAaD!A$!55r   c                     	 | j                   |j                  k\  sK| j                  |j                  k\  s2| j                  |j                   k  s| j                  |j                  k  ryyr  r  r3  s     r   r  r  B  sG    	ttqtt|ttqtt|ttqtt|ttqtt|r   c                    | syt        j                  | j                         t        d            }|j                  r| j                         }t        j                  || j                               }t        j                         }t        j                         }t        j                  | ||       t        j                  || |||      }t        j                  |j                        | j                  _        yy)z<
    refreshes the link and annotation tables of a page
    NrX  )rf   r   r   r   r   r   r'  r(  r2  r  pdf_load_link_annotsll_fz_keep_linkr  )r   r   r  r  r*  r  r  s          r   r,  r,  B  s     


dhhj(8*<
=C
~~hhj--sDHHJ?>>#  $x@))3c68L % 5 5t G r   c                    | j                   st        j                         S t        |       }|dk(  rt        j                         S t	        | j                               }|j                  }|j                  }|dk(  rt        j                  dddd|d      }|S |dk(  rt        j                  dddd||      }|S t        j                  ddddd|      }|S )z*
    calculate page rotation matrices
    r   rl  r   rY  rb  )	r   rf   r2  r/  r  r   r  r  r  )r   r  cb_sizer   r  rA  s         r   r_  r_  B  s     ??~~%H1}~~dhhj)G		A		A2~  Ar1a3 H 
S  Q2q!4 H   B1a3Hr   c                    t         r t        j                  | j                  |      S t	        j
                  | j                  j                        }|sy g } G d d      } |       }d|_        ||_        d|_	        d|_
        t        |       }t	        j                  |      }d}t        ||d  |      \  }	}
|	|S |	|z  }	|
|z  }
d}d}| D ]  }|j                  j                  t        j                  k7  r+|D ]  }|D ]  }|dz  }t	        j                   |      st#        ||      }t%        ||      s6	 |s||	k\  rd}|r<||
k  rt'        |||       n*d}t        ||d  |      \  }	}
|	|c c c S |	|z  }	|
|z  }
H	 |dz  } ||   dk(  sJ d|d	||          |dz  } ||   dk(  sJ d|d	||          |dz  } |S )
Nc                       e Zd Zd Zy)"JM_search_stext_page.<locals>.Hitsc                 n    d| j                    d| j                   d| j                   d| j                   S )Nz	Hits(len=z quads=z hfuzz=z vfuzz=)r'  r
  hfuzzvfuzzr\   s    r   r   z*JM_search_stext_page.<locals>.Hits.__str__B  s5    txxj

|74::,gVZV`V`Uabbr   N)r`   ra   rb   r   r    r   r   Hitsr~  B  s    	cr   r  r   r  皙?r   ry  z	haystack=z haystack_string[haystack]=)r   r   r  r   rf   r(  r  r'  r
  r  r  rH  fz_string_from_bufferfind_stringr   r  rf  r  r  on_highlight_char)r   r  r   r
  r  hitsr   haystack_stringhaystackbeginrM  insider  r&  r=   r  r   s                    r   r  r  B  sC   ))$//6BB<<001DEc c 6DDHDJDJDJ+D1G11':OH_XY7@JE3}	XE8OCF	A '  E$=$== !	D Q006$T2.A+D!4 !#u,%&F#c>-dD"=!%&F)4_XY5OQW)XJE3$}', !& 1 #x (A9< #8,4 @ xk!=?8#<">?@4MHC!	D x(D0 	<8+9x8:;	<0AO'R Lr   c           	         t        j                  |      rt        j                  d       y	 t        j                  |t         j                        }|dk(  r3t        j                  |t         j
                        }t        | |||       n?|dk(  rt        | |||       n+|dk(  rt        | |||       n	 t        j                  |       yt        j                  |      }t        |      D ]  }	t        j                  ||	      }
t        j                  |
      rt        j                  |
      }nd}t        j                  |
t         j                        }|j                   sw|}||vr"|j#                  |       t%        | |||||       t        j                  d        t        j                  |       y 	 t        j                  |       y# t        j                  |       w xY w)zP
    Step through /Resources, looking up image, xobject or font information
    z.Circular dependencies! Consider page cleaning.Nr   rr   r   r   )rf   pdf_mark_objr  r   PDF_ENUM_NAME_XObjectPDF_ENUM_NAME_Fontr#  r5  r)  pdf_unmark_objr;  r  r<  r   r   r  r   r6   r  )r  r  r  r  r!  r  xobjr)  r?  r  r   sxrefsubrsrcsxref_ts                 r   r  r  %C  s    $FG#!!$(C(CD19%%dE,D,DEDCuk:QYS${;QYCuk:( 	T"# t$q 	A((q1C""3'((-((e.K.KLG!!&(MM'*%sGUD%PMM"RST"!	  	T"T"s   BG BG >G 3G G"c                    |syt        |t        t        f      sJ t        |      }|dk(  ryt	        j
                  |       }t	        j                  |      }t	        j                  ||      }t        |      D ]  }||   }|}t        |t              rt	        j                  ||       1t        |t        t        f      rt        |      dk(  sJ d       |\  }	}
|	r|
sJ d       t	        j                  |d      }t	        j                  ||	       t	        j                  ||
        t	        j                  |t        d      |       y)z'
    set ListBox / ComboBox values
    Nr   rr   zbad choice field listr  )rs   ru   rt   r'  rf   r   rO  r  r  r   pdf_array_push_text_stringpdf_array_push_arrayr  r   )r   r  r?  r   r  r  r  r   optopt1opt2	optarrsubs               r   JM_set_choice_optionsr  NC  s%    uudm,,,UAAv##U+I

&
&	
2C  #q)F1X ?Ahc3,,fc:sUDM2sCyA~^G^^EJD$D9"99=22FA>I,,i>,,i>? 
	8E?F;r   c                    d}d}d}|t         j                  k(  rt        d      }t         j                  }n|t         j                  k(  r,t        d      }t         j                  }t         j
                  }n|t         j                  k(  r-t        d      }t         j                  t         j
                  z  }n|t         j                  k(  rt        d      }n||t         j                  k(  rt        d      }t         j                  }nM|t         j                  k(  rt        d      }t         j                  }n|t         j                  k(  rt        d      }|r t        j                  |t        d      |       |dk7  s|dk7  rKt        j                  |t        d            }|| z  }||z  }t        j                  |t        d      |       yy)	z
    Set the field type
    r   NBtnTxChSigFTFf)rf   r	  r   PDF_BTN_FIELD_IS_PUSHBUTTONr	  PDF_BTN_FIELD_IS_RADIOr	  r  r	  PDF_CH_FIELD_IS_COMBOr
  r  r  r  r  )r   r   r   setbits	clearbitstypenamer  s          r   r  r  jC  sm    GIHu+++E?33	22	2E?55	..	//	/E?669U9UU		++	+D>	..	.D>//		//	/D>--	00	0E?39!|yA~%%c8D>:
sHTND9	 &r   c                 f   d}t        j                  |       }|j                  d      }t        |      }|dz
  }||   }||= t        |      }t        j                  | |      }	|	j
                  st|dkD  rodj                  |      }
t        j                  t        j                  | t        |
                  rt        dt        |            ||dz
  = t        |      }|dkD  rot        j                  | |t        j                  |             t        j                  | |      }	t        j                  |	      st        d|      t        j                  |	      }||k7  rt        d|      t        | dd      }t        |      }d|d|d}d|d	|}|j!                  ||d      }t#        ||      }|S )
z*
    Set a PDF dict key to some value
    zfitz: replace me!rW  r   r   zpath to '%s' has indirectszcannot insert value for '%s'rh  rj  rl   )rf   rO  rY  r'  ra  r   r  r  r
  r   pdf_dict_putpr9  rF  r   rG  rY  r  r  )r   r  ry   
eyecatcherr  r  r=  r  skeytestkeyr   rR  r   objstrnullvalnewvalnewstrr.  s                     r   r]  r]  C  s    %J

&
&s
+CIIcNEu:DqA8Dau:D!!#s+G QhA$$U%8%8l1o%NO <l4>PQQdQhu:D Qh 
S%";";J"GH!!#s+Gw'6<<##G,Dz6<<
c1a
(C#C(F !*-Gu%F^^GVQ/F "#v.GNr   c                 0   |r t        j                  | t        d      |       |Mt        j                  | t        d             |r,t        j                  | t        d      d      }t        ||       |Mt        j                  | t        d             |r,t        j                  | t        d      d      }t        ||       |Mt        j                  | t        d             |r,t        j                  | t        d      d      }t        ||       |t        j                  | t        d             |rct        j                  | t        d      d      }t        |      }t        |      D ])  }||   }	t        j                  |d      }
t        |
|	       + y y y )Nr  r  r   r  r  r  )	rf   r  r   r   r  JM_set_ocg_arrays_impr'  r  r  )r  r   r  r  r  r6  r   r?  r  item0r   s              r   r  r  C  s[   x'<iH	~D(4.1**D(4.!DC!3+
D(5/2**D(5/1EC!3,D(8"45**D(82DaHC!3/D(:"67**D(:2FJC8}A1X 3 00#q9%sE23  r   c                     t        j                  |       }|D ]/  }t        j                  ||d      }t        j                  | |       1 y)z
    Set OCG arrays from dict of Python lists
    Works with dict like {"basestate":name, "on":list, "off":list, "rbg":list}
    r   N)rf   rO  r@  r0  )r   r  r  r   r   s        r   r  r  C  sG    
 
&
&s
+C '$$S$2S#&'r   c                    t        j                  |       }t        j                  ||d      }|j                  st	        t
        t               t        j                  | t        d            }|j                  s t        j                  | t        d      d      }t        j                  |t        d            }|j                  s t        j                  |t        d      d      }t        j                  |t        j                  |      |       y)z
    Insert an item into Resources/Properties (used for Marked Content)
    Arguments:
    (1) e.g. page object, Form XObject
    (2) marked content name
    (3) xref of the referenced object (insert as indirect reference)
    r   r   r   r\  N)rf   rO  r@  r   rr  r?  rp  r   r   r  r  r  )r
  r   r   r  r  r!  r]  s          r   r  r  C  s     
&
&s
+C

 
 dA
.C>>./""3(=>I++C+1FJ	##Ix/EFJ  ,,Y8NPQR
	z5#5#5d#;SAr   c                    t        | t              r| j                  } t        | t        j                        sJ dt        |       dt
               t        j                  |       }t        j                  |       }|j                         }fd} |d      }|} |d      }t        |      }t        |      }	t        j                  ||	      }t        j                  | |        |d      }|rot        |      rdt        |      }
t        j                  ||
      }d}t!        |
      D ]  }||   }t        j"                  ||        t        j$                  ||        |d      }|rt        |      rtt        |      }
t        j                  ||
      }t!        |
      D ]  }t        j&                  |||           t        j(                  ||t+        d	      t+        d
              |d      }|rt        |      rxt        |      }
t        j                  ||
      }d}t!        |
      D ]  }||   }t        j"                  ||        t        j(                  ||t+        d      t+        d              |d      }|+t-        |      }t        j.                  |t+        d      |        |d      }|Et-        |      }t        j0                  |      }||k7  r t        j.                  |t+        d      |       |t        j2                  k(  r, |d      }|}|r t        j4                  |t+        d      |        |d      }|}t        j6                  ||       |t        j8                  t        j:                  fv r |d      }t=        | |        |d      }t?        |      }t        j(                  ||t+        d	      t+        d              |d      }|}t        j(                  |t        j@                  |      t+        d	      t+        d              |d      }t-        |      }t        j.                  |t+        d      |       t        jB                  |t+        d             t        jB                  |t+        d              |d      }||t        j:                  k(  r|t        jD                  z  }nM|t        jF                  k(  r|t        jH                  z  }n&|t        jJ                  k(  r|t        jL                  z  }t        j4                  |t+        d       |        |d!      }t-        |      }|rt        jN                  ||        |d"      }tQ        |t+        d#      t        jR                         |        |d$      }tQ        |t+        d%      t+        d&      |        |d'      }tQ        |t+        d%      t+        d(      |        |d)      }tQ        |t+        d%      t+        d*      |        |d+      }tQ        |t+        d%      t+        d,      |        |d-      }tQ        |t+        d%      t        jT                  d.      |        |d/      }tQ        |t+        d%      t        jT                  d0      |        |d1      }t-        |      }|t        jF                  k(  r|s:t        jV                  ||d2d3       t        jX                  |t+        d4      d2       nt        jZ                  |      }|j\                  rOt        j^                  |      }t        jV                  |||d3       t        jX                  |t+        d4      |       n`|r]t        jX                  |t+        d4      |       n;|t        j`                  k(  r|d5u s|d6k(  rt        jZ                  |      }t        j^                  |      }t        jV                  |||d3       t        jX                  |t+        d4      d6       t        jX                  |t+        d*      d6       nt        jX                  |t+        d4      d2       t        jX                  |t+        d*      d2       n[|rYt        jV                  |||d3       |t        j:                  t        j8                  fv rt        jB                  |t+        d7             t        jb                  |        t        jd                  | d3       t        jf                  | d3       t        jh                  |        y)8z
    Update the PDF form field with the properties from a Python Widget object.
    Called by "Page.add_widget" and "Annot.update_widget".
    ztype(annot)=r  c                     t        | d       S r   )r   )r   r  s    r   GETATTRz)JM_set_widget_properties.<locals>.GETATTR	D  s    vtT**r   r	  r   r  r   r	  rq  rI  ru  rg  ri  r	  Nrf  r	  r  r	  MaxLenr	  r	  r	  r	  r	  r
  r	  re
  DSRCr	  r  r	  r  rH  r	  rj  rk  r	  ri  r	  rl  r	  r  r	  rm  r	  rn  r	  r	  r   r	  Tr 
  rs  )5rs   r   r   rf   r   r   r   r   r   r  r_  r`  rh  rS
  r'  r  r  r  pdf_field_set_fill_colorr  r  r   r
  r7  rr  r  r  pdf_field_set_displayr	  r
  r  r  r  r   r  r	  r  r	  r  pdf_field_set_button_captionrj  r  r  pdf_set_field_valuer  pdf_button_field_on_stater   r9  r	  r	  pdf_set_annot_hotpdf_set_annot_activer
  )r   r  r   r   r  r  ry   r	  r   rot_matr?  fill_colr  r  r  
border_colr4  r   old_namer	  r  r   r	  r(  r	  r   r:   onstater  s    `                           r   JM_set_widget_propertiesr  C  s   
 5% 

uenn-H,$u+w/HH-&D##E*I
((*C+ L!EJ FOE5!D#D)G""41D	UD) L!E!%(J&&sA.q 	5A(C%%h4	5 	&&y(; O$E!%(J$$S!,q 	7A$$VU1X6	7Ivx~x}M N#E!%(J((a0
q 	7A(C%%j#6	7 	Iz8D>8D>R M"EU#&&y(4.%H L!EE",,Y78**9hsmTJ U///&""9hx.@+NO$EA		1- e33U5S5STT(eU+ N#E
e
$C		3F N#EL	|,TNSM	 JE	e	B	""9htnbA	y(4.1	y(4.1 -(K7775666K5<<<5777K57775<<<K	8D>;G $%E	e	B	**9b9 HE)Xc]ELLNEB O$E)Xd^Xc]EB O$E)Xd^Xc]EB O$E)Xd^Xc]EB M"E)Xd^Xc]EB M"E)Xd^U-?-?-EuM N#E)Xd^U-?-?-EuM M"EDU666%%c9eQ?##Ix~uE 55i@G!!&&w/))#y"a@''	8D>2F''	8D>4H	u55	5D=DEM55i@G""7+B%%c9b!<##Ix~uE##Ix}eD##YF##YuE%%c9dA>e<<e>[>[\\""9hsm<	% 	E1%	ua(	5!r   c                    d}|t        |      k  rt        j                  ||d        \  }	}
||	z  }t        j                  ||
      }|dk(  rt        j                  ||
d|      \  }}n|}t        j
                  | ||||
||||	       t        j                  |||      }|dk(  rt        j                  ||d      }nt        j                  |d|       }|t        |      k  r|S rW   )r'  rf   fz_chartoruner  r  fz_show_glyphra  fz_pre_translate)r:   	user_fontr  r)  r  
bidi_levelr  r  r  r  ucsr  r)  re  s                 r   r  r  D  s     	
A
c!f*$$QqrU+3	Q**9c:!8??	3PQS[\ICDD$S#uj*V^_$$T36A:((c15C((a#6C c!f* Jr   c                     t        j                  |       }|j                  d      }|j                  t	        d            }|dk\  r|d | }|S )Nr  r  r   )rf   r  r8  ri   r  )r  
buff_bytesr   rP  s       r   r  r  D  sN    --d3J


9

-CQAAv"1gJr   c                      t        d|         y)z
    Generate a warning.
    z	warning: Nr  rA   s    r   r   r   D  s     ivr   c                    t        j                  |      \  }}|}|dkD  r?t        |      }t        |t         j                        sJ t        j                  |      \  }}||k  rSrQ|dk(  rLt        j
                  |t         j                  t         j                         t        j                  | ||d       yt        j                  | ||d       y)zD
    update a stream object
    compress stream when beneficial
       r   r   N)	rf   r  r  rs   r  r  PDF_ENUM_NAME_FilterPDF_ENUM_NAME_FlateDecoder
  )r   r   r   r3  r=  r  nlenr
  s           r   r   r   D  s    
 %%g.GD!Dby!'*$///))$/ad{t!**//	
 	S$2S'15r   c                    t        |t        j                        sJ dt        |             |dkD  rt        j                  | |d      }|S t        j
                  |j                        }|j                         }t        j                  t        j                  |t        d                  }t        j                  |t        d            }|j                  rt        j                  ||      }	nt        j                  | |      }	t        |      }
t        j                  | |t        j                          t        j"                  d      |
      }t%        | ||
d       t        j&                  |t        d      |	       |S )zl
    Make an XObject from a PDF page
    For a positive xref assume that its object can be used instead
    ztype(gmap)=r   r@  r   r   )rs   rf   PdfGraftMapr   r@  r   r   r   r
  r  r   r   pdf_graft_mapped_objectpdf_graft_objectr  r  r2  r  r   r  )r  fsrcpager   gmapr  srcpagespagerefr  rc  r!  r   s              r   r  r  E  s5   
 dE--.@;4:-0@@.ax&&vtQ72 L/ --hmm<;;=$$U%C%CHhWaNb%cd**8Xk5JK??55dA>I..vq9I x(
 %%fh8H%,,WX/[^_Q/ 	5(;"7CLr   c                 .    t        | t        t        f      S r   )rs   ru   rt   rd  s    r   rS
  rS
  &E  s    a%''r   c                     t        |       S r   )r'  rd  s    r   rV
  rV
  *E  s    q6Mr   zbad annot typezbad or missing annot AP/Nz%arg must be seq of seq of float pairszbad seq of pointszbad type: 'buffer'zbad color sequencer  zbad filetypezbad locationzbad config numberzbad layer numberzbad 'oc' referencezbad page idr  zPDF has no rootzrect is infinite or emptyzbad type: 'text'r+  zcolor count failedzneed font file or bufferzcannot create fontzis no annotationzis no imager  zobject is no PDF dictzsource pixmap has no alphazpixel(s) outside imager   c                     t        |       r   )r   )r  excs     r   rr  rr  PE  s     S/r   c                     | syt        | t              r| j                  d|      }nt        | t              r| d d  }j	                  d|      }|S )Nr(   r  r  raw_unicode_escape)rs   r   r{  r   r8  )r)  r  rh   rN   s       r   rp  rp  VE  sO    !SXXfVX,	Au	qT
))()
8CJr   c                     | rLt        |       t        t        fvs)t        |       dvst	        |       dk  st        |       dkD  rt        d      y y )Nr!  r   r   z/need 1, 3 or 4 color components in range 0 to 1)r   rt   ru   r'  r  r  r   rs  s    r   r&  r&  bE  sM    GD%=(1vY&1vz1vzNOO  	r   r   r   c                 F    | j                         D ]  }|d   |k(  s|c S  y)zGReturn an entry in the page's font list if reference name matches.
    r  N)r  )r   r   r  s      r   r  r  mE  s+     ^^ Q48Hr   c                 >    | j                   D ]  }||d   k(  s|c S  y)z3Return a font info if present in the document.
    r   N)r  )r   r   r  s      r   r  r  uE  s'     ]] 1Q4<Hr   r
  c                     t        |       rt        |       }|j                  fS t        |       r| fS | D ]$  }t        |      rt        |      rt	        d       | S )Nzbad quads entry)rt  r   r  ru  r   )r
  r   ri
  s      r   r,  r,  }E  s]    Kyx 0!	!.//0 Lr   c                 2   t        |       syt        |       t        t        fv rt	        |       dk(  st        d      t	        | d         dk(  rt	        | d         dk(  st        d      | d   d   | d   d	   cxk(  rdk(  st        d
       t        d
      y)NFrr   z$morph must be a sequence of length 2r   r   r   zinvalid morph parm 0r  r
   zinvalid morph parm 1T)r  r   rt   ru   r'  r   r^  s    r   rZ  rZ  E  s    7Ge}$Q1?@@!INs1Q4yA~/00Q47ad1g""/00 #/00r   c                      y r   )r  r   r   r   r^  s    r   r&  r&  E  s    
r   ri
  c                 v    	 t        |       }|j                  S # t        $ r t        dkD  r
t                Y yw xY w)zkCheck whether an object is convex, not empty  quad-like.

    It must be a sequence of 4 number pairs.
    r   F)r  r   r   rF   r)  )ri
  q0s     r   ru  ru  E  s=    
!W <<  !#(8s    88r   c                     	 t        |       } | j                  xs | j
                   S # t        $ r t        dkD  r
t                Y yw xY w)zbCheck whether an object is non-degenerate rect-like.

    It must be a sequence of 4 numbers.
    r   F)r   r   r   rF   r	  r	  r  s    r   rt  rt  E  sI    
G 

+amm,,  !#(8s   ( AAr  c                 L   | syt        | d      r| f} t        |        t        |       dk(  r t        | d         dz   }|dk(  r|dz   S |dz   S t        |       d	k(  r&t        t	        |             dz   }|dk(  r|d
z   S |dz   S t        t	        |             dz   }|dk(  r|dz   S |dz   S )Nr(   r   r   r   rl   rs  zG zg r   zRG zrg zK zk )r  r&  r'  rv   ru   )rs  r  r)  s      r   rz  rz  E  s    q+DqM
1v{adOc!8q4x1T1
1v{eAh#%Hq5y3!e)3%(c!ACx1t8-QX-r   c                    | j                         t              fd}	 dk7  r.t        j                  j	                         t        d      d       t        j                  |      }|D ]#  }t        |      }t        j                  ||       % t        j                  |       t        |d        |        t        |      S # t        $ r t        r
t                 |        Y y w xY w)Nc                  n    dk7  r/t        j                   j                         t        d             y y )Nr   r   )rf   r  r   r   )rb  r  s   r   r  z$Page__add_text_marker.<locals>.finalE  s,    q=""7;;=(82DhO r   r   r   rH  )rB
  r/  rf   r  r   r   rC
  rf
  pdf_add_annot_quad_pointr
  rE
  r   r   rF   r   )	r]   r
  r  r  r   r  ri
  rb  r  s	          @@r   r
  r
  E  s    nnG(HPq=""7;;=(82DaH&&w
; 	5D%A**5!4	5 	u%s#
 <	  N$4s   BC	 	 C,+C,c                 L    t        | t              sJ t        t        d|        S )Nr  )rs   r   r   rf   r0  s    r   r   r   E  s&    a5N1#.//r   r  c                     |d   }d}t        | j                        D ]  \  }}|d   |k(  sd} n |r|| j                  <   y | j                  j                  |       y )Nr   FT)r  r  r6   )r   r  r   rb  r  fis         r   UpdateFontInfor  E  sd    7DE3==) 2a5D=E aT"r   c                     d}t        t        |            D ]D  }||   }|t        |       k\  rt        |t              rd|v r+ y|t        | |   |      s y|dz  }F |t        |       k7  ryy)z
    Returns true if <args> matches <types>.

    Each item in <types> is a type or tuple of types. Any of these types will
    match an item in <args>. `None` will match anything in <args>. `type(None)`
    will match an arg whose value is `None`.
    r   NFr   T)r  r'  rs   ru   )r  rY  rB  r  r  s        r   r  r  E  s}     	
A3u: 
aD	>%'DEMZQ%?	Q
 	CI~r   c                 p   t        |      }t        j                  |      }|j                  |j                  z
  }|j
                  |j                  z
  }|}	|}
|rt        | |      }| |z  }||z  }ndx}}t        ||      }|dk7  r|dk7  r|}|}|}|dk  r||z  ||z  kD  r||z  }	|}
n,|}	||z  }
n$||k7  r||z  ||z  kD  r||z  }	|}
n|}	||z  }
n|}	|}
t        j                  |j                  |j                  z   dz  |j                  |j
                  z   dz        }t        j                  dddddd      }t        j                  ||      }t        j                  |t        j                  |	|
            }t        j                  |t        j                  |j                  |j                              }|S )z*
    # compute image insertion matrix
    r   r   rb  rr   g      )r  rf   	fz_rotater  r  r  r  r  r  r  r  r  fz_scalefz_translater  r  )r  r  r  r  keeptrectr  trwtrhr   r  largefwfhsmallr  tmpr6  s                     r   r
  r
  	F  s    BE
//&
!C
((UXX
C
((UXX
CAAE6"U]e^RBKE{v}	Av8cBheAAAeA	r8cBheAAAeA


XX A%XX A%C 

q!Q4
6C
//#s
#C
//#u~~a3
4C
//#u11#%%?
@CJr   c                    | j                   j                  dk(  r| j                   j                  j                  dk(  r| j                   j                  j                  dk(  re|j                   j
                  j                  | j                   j                  j
                  j                  |j                   j                  dz  z
  k  S y)Nr   r   r  )r   r  r9  r  r  r  
first_charrz  )r=   r  s     r   r  r  :F  s    !doo&9&9&;&;q&@T__EXEXEZEZ^_E_}}##%%(B(B(I(I(K(KbmmN`N`cfNf(fffr   c           	          |  dt        |        dt        t        |              d}t        |       D ]  }|d| dz  } |S )Nrl    (z):
rZ  ry  )r   r'  r9  )r  rN   r  s      r   dir_strr  @F  sP    Cqa	CAK=
-CV aS|Jr   rf  rd  rW  c           
      p   | j                  d      r| j                  d      r| S t        |       sy|r|<dj                  | D cg c]   }t	        |      dk  rdt	        |      z  nd" c}      }nAdj                  | D cg c]&  }t	        |      dk  rd|t	        |         d   z  nd( c}      }d|z   dz   S |dk  r2dj                  | D cg c]  }d	|t	        |         d   z   c}      }n+dj                  | D cg c]  }d	t	        |      z   c}      }d|z   dz   S c c}w c c}w c c}w c c}w )
a   Return a PDF string enclosed in [] brackets, suitable for the PDF TJ
    operator.

    Notes:
        The input string is converted to either 2 or 4 hex digits per character.
    Args:
        simple: no glyphs: 2-chars, use char codes as the glyph
                glyphs: 2-chars, use glyphs instead of char codes (Symbol,
                ZapfDingbats)
        not simple: ordering < 0: 4-chars, use glyphs not char codes
                    ordering >=0: a CJK font! 4 chars, use char codes as glyphs
    z[<z>]z[<>]r(   rZ  z%02xb7r   z%04x)r   r  r  r  r  )r:   rf  rd  rW  rs  otxts         r   ro  ro  GF  s)    tt!4:>77tT!s1v|FSVOETUD77OST!s1v|&Q.++ETD d{T!! !|wwDAqA!22ABww6AQ67$; U U B6s   %D$ +D)D. D3r)  c                 <   t        |       syd }d}| D ]  }t        |      }|dkD  r
 ||       c S |dkD  r|dk  r|dv r|dz  }||z  }6|dkD  r	|d	|z  z  }D|d
k(  r|dz  }O|dk(  r|dz  }Z|dk(  r|dz  }e|dk(  r|dz  }p|dk(  r|dz  }{|dz  } d|z   dz   S )a   Return a PDF string depending on its coding.

    Notes:
        Returns a string bracketed with either "()" or "<>" for hex values.
        If only ascii then "(original)" is returned, else if only 8 bit chars
        then "(original)" with interspersed octal strings 
nn is returned,
        else a string "<FEFF[hexstring]>" is returned, where [hexstring] is the
        UTF-16BE encoding of the original.
    z()c                 b    t        ddg      t        | d      z   }d|j                         z   dz   S )Nr  r  zUTF-16BE<>)r-  hex)r)  r   s     r   make_utf16bez!get_pdf_str.<locals>.make_utf16beyF  s1    sCj!Ia$<<QUUW}s""r   r(   r     r  )rh  rj  r  r  z\%03orN	  z\br  z\tr  r  r  z\fr  z\rz\267rh  rj  )r  r  )r)  r  r   rs  r  s        r   r+  r+  lF  s     7# 	A V8?"7rCx$$T	FA8BA 7JA1WJA2XJA2XJA2XJALA7: 7S=r   c                     t        j                  d      } | | S t        j                  dk(  rd}nd}t         j                  j                  |      r|S 	 ddl}t        j                  dk(  r|j                  dddd	      }|j                  j                         }|j                  s|st        d
       yt         j                  j                  |      }t         j                  j                  |d      }t         j                  j                  |      r|S t        d       y|j                  dddd	      }|j                  j                         j                         }|j                  st        |      dk7  rt        d
       yd}|j!                         D ]5  }|j!                         D ]   }t#        |      j%                  d      s|} 5 7 ||S t        d       y)a  Detect Tesseract-OCR and return its language support folder.

    This function can be used to enable OCR via Tesseract even if the
    environment variable TESSDATA_PREFIX has not been set.
    If the value of TESSDATA_PREFIX is None, the function tries to locate
    Tesseract-OCR and fills the required variable.

    Returns:
        Folder name of tessdata if Tesseract-OCR is available, otherwise False.
    r|   Nwin32z'C:\Program Files\Tesseract-OCR\tessdataz&/usr/share/tesseract-ocr/4.00/tessdatar   zwhere tesseractr   )shellcapture_outputr
  zTesseract-OCR is not installedFr  z2unexpected: Tesseract-OCR has no 'tessdata' folderzwhereis tesseract-ocrrr   z2unexpected: tesseract-ocr has no 'tessdata' folder)r   getenvrt  platformr1   r  
subprocessr  stdoutstrip
returncoderB   dirnamer  rY  r'  iterdirr   r  )r|   r  r  r  rj  r!  sub_responsesub_subs           r   get_tessdatar%  F  s    ii 12O"
||w?;	ww~~h 
||w^^-QqPQ^R99??$==45''//(+77<<477>>(#OHI 
/qRS	TByy &&(H	}}H*01 H ((* #++- 	G7|$$Z0"	
 DEr   )CSSr  r   fontcoder&  r  c                   d}t        |      t        urt        d      |d}t        j	                         D cg c]  }|j                  |       s| }}|g k(  rt        d|  d      t        |      dkD  rt        d      || }|D ]I  }t        |   }|d   }	|d	   }
 |d
          }|j                  ||       |	rdnd}|
rdnd}||||||fz  z  }K |S c c}w )a  Create @font-face items for the given fontcode of pymupdf-fonts.

    Adds @font-face support for fonts contained in package pymupdf-fonts.

    Creates a CSS font-family for all fonts starting with string 'fontcode'.

    Note:
        The font naming convention in package pymupdf-fonts is "fontcode<sf>",
        where the suffix "sf" is either empty or one of "it", "bo" or "bi".
        These suffixes thus represent the regular, italic, bold or bold-italic
        variants of a font. For example, font code "notos" refers to fonts
        "notos" - "Noto Sans Regular"
        "notosit" - "Noto Sans Italic"
        "notosbo" - "Noto Sans Bold"
        "notosbi" - "Noto Sans Bold Italic"

        This function creates four CSS @font-face definitions and collectively
        assigns the font-family name "notos" to them (or the "name" value).

    All fitting font buffers of the pymupdf-fonts package are placed / added
    to the archive provided as parameter.
    To use the font in pymupdf.Story, execute 'set_font(fontcode)'. The correct
    font weight (bold) or style (italic) will automatically be selected.
    Expects and returns the CSS source, with the new CSS definitions appended.

    Args:
        fontcode: (str) font code for naming the font variants to include.
                  E.g. "fig" adds notos, notosi, notosb, notosbi fonts.
                  A maximum of 4 font variants is accepted.
        CSS: (str) CSS string to add @font-face definitions to.
        archive: (Archive, mandatory) where to place the font buffers.
        name: (str) use this as family-name instead of 'fontcode'.
    Returns:
        Modified CSS, with appended @font-face statements for each font variant
        of fontcode.
        Fontbuffers associated with "fontcode" will be added to 'archive'.
    z1
@font-face {font-family: %s; src: url(%s);%s%s}
z'archive' must be an Archiver(   zNo font code 'z' found in pymupdf-fonts.r  zfontcode too shortr  r2  r-  zfont-weight: bold;zfont-style: italic;)r   r  r   r  r  r   r'  r  )r'  r&  r  r   CSSFONTrr  	font_keysfkeyr)  r  r2  fbuff	bold_textitalic_texts                 r   css_for_pymupdf_fontr/  F  s   R DG=G#788
{ 1557Rq1<<;QRIRB>(3LMNN
9~-..| >#D)F|hX E4 ,0(b	/5+2w$i===> J# Ss   CCr   r  c           	         |j                         }t        j                  |d      }d}|dk(  rt        }|dk(  rt        }|Ct        | D cg c])  }t        |      dk  r|t        |         d   n|d   d   + c}      }||z  S |t        j                         v rt        | t        |   ||      S |dv rt        |       |z  S t        d|z        c c}w )	a  Calculate length of a string for a built-in font.

    Args:
        fontname: name of the font.
        fontsize: font size points.
        encoding: encoding to use, 0=Latin (default), 1=Greek, 2=Cyrillic.
    Returns:
        (float) length of text.
    Nrg  rh  rZ  r   r/  )r  r  r  r	  r  r
  r  r  zFont '%s' is unsupported)r  r  r   symbol_glyphszapf_glyphsr8	  r  r  util_measure_stringr'  r   )r:   r   r   r  r  rf  rs  r   s           r   get_text_lengthr4  &G  s     ~~H""8T2HF8>!PTU1c!fslA"sAFUV8|?''))"/(+Xx
 	
  	 	 4y8##
/(:
;;) Vs   
.Cr  c                    t        |       t        j                  u r| j                         }nBt	        | d      r| j                         }n%t        |       t        t        fv r| }nt        d      t        j                  |      S )aG   Return basic properties of an image.

    Args:
        img: bytes, bytearray, io.BytesIO object or an opened image file.
    Returns:
        A dictionary with keys width, height, colorspace.n, bpc, type, ext and size,
        where 'type' is the MuPDF image type (0 to 14) and 'ext' the suitable
        file extension.
    rC  zbad argument 'img')r   r.  r/  rG  r  rC  r   r-  r   r   image_profile)r  r|  s     r   r6  r6  PG  sg     CyBJJ	f		cui(	(-..v&&r   c                     t         j                  t              sJ t         j                        s j                  rS j                  J  t         j                   j                         j                        }|st        d       d _        y fd}t         j                  t              sJ t         j                        }|dk(  r |       S  j                  t           }|dk7  r |       S  j                  |dz
     }|t           }|dk7  r |       S |t           } j                  t           }||k7  r |       S 	  j                  j                         D ]  \  }	}
|	|vs|
||	<    d}|dk(  r$d	|t        <    j                  j                          yt        d
        |        y# t        $ r t        r
t                d}Y Yw xY w)aq  
    Append current path to list or merge into last path of the list.
    (1) Append if first path, different item lists or not a 'stroke' version
        of previous path
    (2) If new path has the same items, merge its content into previous path
        and change path["type"] to "fs".
    (3) If "out" is callable, skip the previous and pass dictionary to it.
    Nr   z2calling cdrawings callback function/method failed!c                       j                   j                   j                  j                                 j                  j	                          y r   )r  r6   pathdictr  r  )r
  s   r   r6   zjm_append_merge.<locals>.appendG  s0    s||((*+r   r)  r   r  rY  r}  z$could not merge stroke and fill path)rs   r  rt   r  r  r   r9  rB   r'  rF  dictkey_itemsrn  r   r   rF   r  )r
  respr6   r=  thistyper  prevtype	previtems	thisitemsrr  rM   rh   s   `           r   jm_append_merger@  fG  s    cggt$$$ 

szz::1 07377CJJ/=DHI cggt$$$sww<Dqyx||\*H3x77DFD\"H3xm$Im,IIxLL&&( 	DAq}Q	 
 
Qw"l67  N$4s   $F- (	F- -G
Gc                     | j                   s'| j                  j                  |t        |      f       y | j                  j                  |t        |      | j                  f       y r   )r  r  r6   r'  
layer_name)r
  r(
  r   r|  s       r   jm_bbox_add_rectrC  G  sG    ::

D/$"789

D/$"7HIr   c                     t        j                  t         j                  j                        }t        j                  |j	                         |      }t        | ||d       y )Nz
fill-image)rf   r(  r  ll_fz_transform_rectrL  rC  )r
  r(
  r
  r  r  color_paramsr   s          r   jm_bbox_fill_imagerG  G  s@    U\\,,-A""AJJL#6Ac3<0r   c                     	 t        | |t        j                  t        j                  |      d       y # t        $ r t
        r
t                 w xY w)Nzfill-imgmask)rC  rf   rE  fz_unit_rectr   r   rF   )r
  r(
  r
  r  r  r  r  rF  s           r   jm_bbox_fill_image_maskrJ  G  sD    #sE$>$>u?Q?QSV$WYgh N$4s	   03 Ac	           	          |rdnd}	 t        | |t        j                  |d |      d       y # t        $ r t        r
t                 w xY w)NTFz	fill-pathrC  rf   ll_fz_bound_pathr   r   rF   	r
  r(
  r1   r  r  r  r  r  rF  s	            r   jm_bbox_fill_pathrO  G  sG    tUH#sE$:$:4s$K[Y N$4s	   #, Ac                     	 t        | |t        j                  ||      d       y # t        $ r t        r
t                 w xY w)Nz
fill-shade)rC  rf   ll_fz_bound_shader   r   rF   )r
  r(
  shader  r  rF  s         r   jm_bbox_fill_shaderS  G  s<    #sE$;$;UC$H,W N$4s	   "% A c           	          	 t        | |t        j                  |||      d       y # t        $ r t        r
t                 w xY w)Nzstroke-textrC  rf   ll_fz_bound_textr   r   rF   )r
  r(
  r:   r  r  r  s         r   jm_bbox_stroke_textrW  G  ?    #sE$:$:D&#$NP]^ N$4	   #& Ac           	          	 t        | |t        j                  |d |      d       y # t        $ r t        r
t                 w xY w)Nz	fill-textrU  )r
  r(
  r:   r  r  s        r   jm_bbox_fill_textr[  G  s>    #sE$:$:D$$LkZ N$4rY  c           	      J    t        | |t        j                  |d |      d       y )Nzignore-text)rC  rf   rV  )r
  r(
  r:   r  s       r   jm_bbox_ignore_textr]  G  s    c3 6 6tT3 GWr   c	           	          	 t        | |t        j                  |||      d       y # t        $ r t        r
t                 w xY w)Nzstroke-pathrL  )	r
  r(
  r1   r  r  r  r  r  rF  s	            r   jm_bbox_stroke_pathr_  G  rX  rY  c                    | j                   t           }t        |      }dgdz  }t        d      D ]P  }||dz
  |z      }t	        |d         }|j
                  ||dz  <   |j                  ||dz  dz   <   t	        |d         }R j
                  |d   k7  s|j                  |d   k7  ryd| _        t        j                  |d   |d   |d   |d   |d   |d   |d   |d	         }d
t        |      f}	|	||dz
  <   ||dz
  |= y)a  
    Check whether the last 4 lines represent a quad.
    Because of how we count, the lines are a polyline already, i.e. last point
    of a line equals 1st point of next line.
    So we check for a polygon (last line's end point equals start point).
    If not true we return 0.
    r   rN	  r  r   rr   r   r  r   r
   r  )r9  r:  r'  r  rA
  r  r  	linecountrf   rr  r  )
r
  rn  r=  r  r  r=   rR  lpri
  r   s
             r   jm_checkquadrc  G  s*    LL-(Eu:D	
aAAY )dQhl#a)66!a%vv!a%!)tQx() 
ttqt|rttqt|  CM 	1Q41qtQqT1Q41qtQqTJA/!$%DE4!8tax$r   c                 &   d| _         d}| j                  t           }t        |      }||dz
     }t	        |d         }t	        |d         }||dz
     }t	        |d         }t	        |d         }		 |j
                  |j
                  k7  sK|j                  |	j                  k7  s2|j
                  |	j
                  k7  s|j                  |j                  k7  ry|	j
                  |j
                  k  rCt        j                  |	j                  |	j
                  |j                  |j
                        }
d}nBt        j                  |j                  |j
                  |j                  |j
                        }
d}dt        |
      |f}|||dz
  <   ||dz
  |= y)z}
    Check whether the last 3 path items represent a rectangle.
    Returns 1 if we have modified the path, otherwise 0.
    r   r   r   rr   rY  r  )
ra  r9  r:  r'  rA
  r  r  rf   rG
  r'  )r
  r  rn  r=  line0r  r  line2r  rw  r   r   s               r   jm_checkrectrg  H  sZ    CMKLL-(Eu:D4!8E	5!9	%B	5!9	%B 4!8E	5!9	%B	5!9	%B 	
ttrtt|ttrtt|ttrtt|ttrtt| 
ttbdd{rttRTT2446rttRTT2446?1%{3DE4!8tax$r   c           
      `    |j                   }	 |sy t        | |||||||       |j                  }"r   )headjm_trace_text_spanr  )	r
  r:   r  r  r  r  r  seqnor  s	            r   jm_trace_textrl  GH  s8    99D
Cuc:ueUSyy	 r   c                    d}t        |t        j                        sJ t        j                  |      }t        |t        j                        sJ t        j
                  |      }t        |j                               }	t        j                  |j                         |      }
t        j                  t        j                  dd      |
      }t        j                  |j                  |j                  z  |j                  |j                  z  z         }t        j                   |      }d}t#        |j                               }t%        |j                               }|dk  rd}d}||z  ||z
  z  }||z  ||z
  z  }d}t        j&                  |j                               }||t(        z  z  }|t        j*                  |j                               t,        z  z  }|t        j.                  |j                               t0        z  z  }|t        j2                  |j                               t4        z  z  }d}t        j6                         }t        j8                  |j                  |j                  |j                   |j                  dd      }|j                  dk(  rd|_        g }t=        |j>                  j@                        D ]  }d}|jC                  |      jD                  dk\  rRt        jF                  |j                         |jC                  |      jD                  |j>                  jH                        }||z  }|}|jC                  |      jJ                  dk(  r|}t        j                  |jC                  |      j                  |jC                  |      j                        }t        jL                  ||      }t        j8                  dddd|j                   |j                         }t        j                  ||      }t        j                  |t        j
                  dddd|j                  |j                              }|j                  }||z   }|
j:                  dkD  r|j                  dk(  s8|j                  dk(  s)|
jN                  dk7  r9|
jN                  |
jP                   k(  r|j                  |z   }|j                  |z   }n|j                  |z
  }|j                  |z
  }t        jR                  ||||      } t        jT                  | |      } |jW                  |jC                  |      jJ                  |jC                  |      jD                  |j                  |j                  f| jX                  | jZ                  | j\                  | j^                  ff       |dkD  rt        j`                  ||       }| } tc        |      }|sp|slt        jd                  |j                         ddd      \  }!}t        jF                  |j                         |!|j>                  jH                        }||z  }|s|}n|}tg               }"ti        |      |"d	<   tk        |	      |"d
<   |j>                  jH                  |"d<   ||"d<   |j>                  jl                  |"d<   |j>                  jn                  |"d<   ||"d<   ||"d<   d|"d<   |r{t        jp                  t        jr                  t        jt                  |            |t        jv                         t        jr                         t        jx                               }#|#dd }#nd}#| jz                  dkD  r| jz                  }$n|dz  }$|#|"d<   ||"d<   ||"d<   |$|"d<   ||"d<   ||"d<   t}        |      |"d<   | j~                  |"d<   ||"d<   ||"d<   | j                  jW                  |"       y)z
    jm_trace_text_span(fz_context *ctx, PyObject *out, fz_text_span *span, int type, fz_matrix ctm, fz_colorspace *colorspace, const float *color, float alpha, size_t seqno)
    Nr   r   r:  r  r  rY  r   r9  r)  r  r  bidi_lvlbidi_dirr  r  r   r  r	  r  r  rz  r  	linewidth
spacewidthr   r   layerrk  r'  )Ars   rf   fz_text_span
FzTextSpan	fz_matrixr2  r  r)  r  r  fz_transform_vectorr  r6	  r7	  r  r  fz_normalize_vectorr  r  r  r  r  r  r  r  r  r  r(  r  r  r  r   r'  rn  r  ra  r  r  r  r  rs  rG
  r`  r6   r  r  r  r  r!  ru   r  r   r  rt  r  r  fz_convert_colorrh  r=  r  ri  rp  r'  rB  r  )%r
  r  r  r  r  r  r  rk  out_fontr   r6  r9  r  	space_advr  r  ascsizedscsizefflagsr  last_adv	span_bboxr  r'  r  re  	char_origrX	  r  r  r  r  	char_bboxrs  	span_dictr  rp  s%                                        r   rj  rj  PH  s|    HtU//000T"DsEOO,,,
..#
CTYY[)H //$((*c
*C

#
#E$7$71$=s
CCIIceeceemceeceem34E

#
#C
(CI
DIIK
(C
TYY[
)C
Tz EkS3Y'GEkS3Y'GF&&		4D
d)))F
e%%tyy{36FFFF
e$$diik25FFFF
e##TYY[1NBBFH I


suuceeceeVSUUAq
AC
uu{EDOO''( ."::a=!(($))+tzz!}7H7H$//J_J_`Cu::a="I''

1AI	,,Y<	!!!Q1y{{lY[[LI__R%__R1aIKK!UV[[#X
ceerk!#%%w&Bw&Bw&Bw&B&&r2r26	++Ir:	JJqM%%JJqM%%!!
 "!!!		  q5++IyAI!I]."^ %LEAA499;PRTUWXYKAx..IIKOO))I
 I$	 I I(-Iu,X6Iv////IwIw OO66Iz!__77Iz Iz!I{ I|$$""E$?$?$LM##%""$##% "1g
}}qMM	DL	 IwIv!Iy'I{(I|Iv(3Iv..IwIwIwGGNNIr   c                 4   | rx	 t        j                  t         j                  j                        }t        j                         }t        j                  | ||j
                  d |j                               }|d d S y# t        $ r t        r
t                 w xY w)Nr   r    )
rf   rh  rn  ri  ll_fz_convert_colorr   rL  r   r   rF   )r  r  r  r  r  s        r   jm_lineart_colorr  H  s    	 ##U%7%7%A%ABB$$&B++MMKKMC 2Aw	  	#(8	s   A2A< <Bc                 T    t        | j                  t              rg | _        g | _        y r   )rs   r  rt   scissorsr
  r(
  s     r   jm_lineart_drop_devicer  I  s    #''4 CLr   c	                    |rdnd}	 t        |t        j                        sJ t        j                  |      | _        t
        | _        t        | ||       | j                  y d| j                  t        <   || j                  d<   || j                  d<   t        ||      | j                  d<   t        | j                        | j                  t        <   | j                  | j                  d<   | j                  | j                  d<   | j                   r| j"                  | j                  d	<   t%        |        | xj                  d
z  c_        y # t&        $ r t(        r
t+                 w xY w)NTFr  r  r  r   rk  rr  r  r   )rs   rf   ru  r2  r  trace_device_FILL_PATH	path_typejm_lineart_pathr9  rF  r  r'  pathrectdictkey_rectrk  rB  r  r5  r@  r   r   rF   rN  s	            r   jm_lineart_fill_pathr  
I  s     tUH3000..#&.c4(<< &)l#$,j!(-n% !1*e Df&5cll&Cl#!$g!$g99%(YYCLL'"		Q	 N$4s   AE #C'E E&c           
      h    	 t        | |d||||| j                         | xj                  dz  c_        y r  )r>   r   rl  rk  )r
  r(
  r:   r  r  r  r  rF  s           r   jm_lineart_fill_textr  1I  s.     #tQZsyyIIINIr   c           
      f    t        | |d|d d d| j                         | xj                  dz  c_        y )Nr   r   rl  rk  )r
  r:   r  s      r   jm_lineart_ignore_textr  ?I  s)    #tQT4CII>IINIr   c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )Walkerc                     t         |           | j                          | j                          | j	                          | j                          || _        y r   )r   r^   use_virtual_movetouse_virtual_linetouse_virtual_curvetouse_virtual_closepathr
  )r]   r
  r%
  s     r   r^   zWalker.__init__GI  sE    !!  """$r   c                    	 | j                   j                  dk(  rt        | j                         ry d| j                   _        | j                   j                  r| j                   j                  | j                   j
                  k7  rdt        | j                   j                        t        | j                   j
                        f}| j                   j                  t           j                  |       | j                   j
                  | j                   _        d| j                   j                  d<   nd| j                   j                  d<   d| j                   _        y # t        $ r t        r
t                 w xY w)Nr   r   r  Fr  T)r
  ra  rg  havemove	lastpoint
firstpointr  r9  r:  r6   r   r   rF   )r]   r(
  r  s      r   	closepathzWalker.closepathOI  s   	xx!!Q&)!"DHHxx  88%%)<)<<!1$((2D2D!E!1$((2E2E!FHDHH%%m4;;DA)-)<)<DHH&16!!+. 37!!;/ !"DHH 	#(8	s   .E D(E E5c                 2   	 d| j                   _        t        j                  ||      }t        j                  ||      }	t        j                  ||      }
t        j                  || j                   j
                        }t        j                  |	| j                   j
                        }	t        j                  |
| j                   j
                        }
t        j                  | j                   j                  |      | j                   _        t        j                  | j                   j                  |	      | j                   _        t        j                  | j                   j                  |
      | j                   _        dt        | j                   j                        t        |      t        |	      t        |
      f}|
| j                   _	        | j                   j                  t           j                  |       y # t        $ r t        r
t                 w xY w)Nr   rs  )r
  ra  rf   r  r  r  fz_include_point_in_rectr  r  r  r9  r:  r6   r   r   rF   )r]   r(
  r  r  x2y2x3y3r  r  r  r  s               r   curvetozWalker.curvetokI  s~   	!"DHH$$R,B$$R,B$$R,B))"dhhll;B))"dhhll;B))"dhhll;B % > >txx?P?PRT UDHH % > >txx?P?PRT UDHH % > >txx?P?PRT UDHH $TXX%7%78$R($R($R(E "$DHHHH}-44e< 	#(8	s   G8G; ;Hc                    	 t        j                  t        j                  ||      | j                  j                        }t        j
                  | j                  j                  |      | j                  _        dt        | j                  j                        t        |      f}|| j                  _        | j                  j                  t           }|j                  |       | j                  xj                  dz  c_        | j                  j                  dk(  r4| j                  j                  t        k7  rt        | j                         y y y # t         $ r t"        r
t%                 w xY w)Nr  r   r  )rf   r  r  r
  r  r  r  r  r  r9  r:  r6   ra  r  r  rc  r   r   rF   )r]   r(
  r  r  r  r  rn  s          r   linetozWalker.linetoI  s   	))5+>+>q!+DdhhllSB % > >@Q@QSU VDHH$dhh&8&89$R(E
 "$DHHHH%%}5ELL% HH!#xx!!Q&488+=+=AW+WTXX& ,X&  	#(8	s   EE E+c                    	 	 t        j                  t        j                  ||      | j                  j                        | j                  _
        t        j                  | j                  j                        rt        j                  | j                  j                  j                  | j                  j                  j                  | j                  j                  j                  | j                  j                  j                        | j                  _        | j                  j                  | j                  _        d| j                  _        d| j                  _        y # t&        $ r t(        r
t+                 w xY wr  )rs   r
  r9  r   r>   rn  rf   r  r  r  r  rf  r  rG
  r  r  r  r  ra  r   r   rF   )r]   r(
  r  r  r?  rM   s         r   movetozWalker.movetoI  s   	!&!9!9''1-HHLL"DHH (($((*;*;<$)$6$6**,,**,,**,,**,,	%! #'(("4"4DHH !DHH!"DHH 	#(8	s   EE   E;)	r`   ra   rb   r^   r  r  r  r  r-
  r  s   @r   r  r  EI  s    86*r   r  c                    	 t        j                  t         j                  j                        | _        d| _        t        j
                  dd      | _        t               | _        g | j                  t        <   t        |       }t        j                  t        j                  t        j                  |            ||j                         | j                  t           sd| _        yy# t        $ r t         r
t#                 w xY w)a#  
    Create the "items" list of the path dictionary
    * either create or empty the path dictionary
    * reset the end point of the path
    * reset count of consecutive lines
    * invoke fz_walk_path(), which create the single items
    * if no items detected, empty path dict again
    r   N)rf   r(  r)  r  ra  r  r  r   r9  r:  r  fz_walk_pathFzPathll_fz_keep_pathr   r   r   rF   )r
  r(
  r1   walkers       r   r  r  I  s    ||U\\%@%@Aq!,v')m$ ELL)>)>t)DEvvO`O`a||]+CL , N$4s   C"C& &Dc	                 j   	 t        |t        j                        sJ d| _        t	        |j
                        t	        |j                        k(  rt	        |j
                        | _        t        j                  |      | _        t        | _
        t        | ||       | j                  y d| j                  t        <   || j                  d<   t        ||      | j                  d<   | j                  |j                  z  | j                  t         <   |j"                  |j$                  |j&                  f| j                  d<   | j                  |j(                  z  | j                  d<   d| j                  vrd| j                  d<   |j*                  rt        j,                  d	      }	t        j.                  |	d
       t1        |j*                        D ]Q  }
t        j2                  |j4                  |
      }t        j.                  |	t7        | j                  |z         d       S t        j.                  |	dt7        | j                  |j8                  z                |	| j                  d<   nd| j                  d<   t;        | j<                        | j                  t>        <   | j@                  | j                  d<   | jB                  | j                  d<   | jD                  r| jF                  | j                  d<   tI        |        | xjB                  dz  c_!        y # tJ        $ r tL        r
tO                 w xY w)Nr   r)  r  r  r  r  r  FrZ  z[ rl   z] r  rW  rr  rk  r  )(rs   rf   ru  
pathfactorr  r   r  r2  r  trace_device_STROKE_PATHr  r  r9  rF  r  rp  ro  	start_capdash_capend_caplinejoindash_lenr  r
  r  floats_getitem	dash_listrv   
dash_phaser'  r  r  rB  rk  r  r5  r@  r   r   rF   )r
  r(
  r1   r  r  r  r  r  rF  r  r  ry   s               r   jm_lineart_stroke_pathr  I  sw   03000suu:SUU# ZCN..#&0c4(<<&)l#*/&'!1:u!Eg'*~~8H8H'Hm$  $i 
 %(NNV__$Dj!cll*(-CLL% ??&&,D""D$/FOO, W ,,f.>.>B&&3>>E;Q1R0SST.UV	W
 ""DBy&J[J[9[/\.]*^_&*CLL(#&,CLL(#&5cll&Cl# #W!$g99%(YYCLL'"		Q	 N$4s   B&L )I-L L2c                    | j                   sy t        j                  |      | _        t        | _        t        | ||       | j                  y d| j                  t        <   t        |      | j                  d<   d| j                  vrd| j                  d<   t        t        |             | j                  d<   | j                  | j                  d<   | j                  | j                  d<   t        |        | xj                  dz  c_        y )	Nr  r  r  Fr  r  rr  r   )r  rf   r2  r  trace_device_CLIP_PATHr  r  r9  rF  r  r'  compute_scissorr5  rB  r@  )r
  r(
  r1   r  r  r  s         r   jm_lineart_clip_pathr  J  s    99nnS!CG*CMCd#
||"(CLL, $XCLL*#,,&$)[!-oc.BCCLLIICLLNNCLLCIINIr   c                    | j                   sy t        j                  |      | _        t        | _        t        | ||       | j                  y d| j                  d<   d | j                  d<   d| j                  vrd| j                  d<   t        t        |             | j                  d<   | j                  | j                  d<   | j                  | j                  d<   t        |        | xj                  d	z  c_
        y )
Nr  rF  r  r  Fr  r  rr  r   )r  rf   r2  r  trace_device_CLIP_STROKE_PATHr  r  r9  r'  r  r5  rB  r@  )r
  r(
  r1   r  r  r  s         r   jm_lineart_clip_stroke_pathr  !J  s    99nnS!CG1CMCd#
||#)CLL #CLL#,,&$)[!-oc.BCCLLIICLLNNCLLCIINIr   c                 ^    | j                   sy t        |        | xj                  dz  c_        y r!  r  r  r5  )r
  r(
  r:   r  r  r  s         r   jm_lineart_clip_stroke_textr  5J  !    99CIINIr   c                 ^    | j                   sy t        |        | xj                  dz  c_        y r!  r  )r
  r(
  r:   r  r  s        r   jm_lineart_clip_textr  <J  r  r   c                 ^    | j                   sy t        |        | xj                  dz  c_        y r!  r  )r
  r(
  r
  r  r  s        r   jm_lineart_clip_image_maskr  CJ  r  r   c                     | j                   r| j                  sy t        | j                        }|dk  ry | j                  d= | xj                  dz  c_        y )Nr   rY  )r  r  r'  r5  )r
  r(
  r=  s      r   jm_lineart_pop_clipr  JJ  sC    99CLLs||DaxRIINIr   c                 &    |r|| _         y d| _         y Nr(   rB  )r
  r(
  r   s      r   jm_lineart_begin_layerr  TJ  s    r   c                     d| _         y r  r  r  s     r   jm_lineart_end_layerr  [J  s	    CNr   c           	         | j                   sy dt        |      t        |      t        |      t        j                  |      || j
                  | j                  d| _        t        |        | xj
                  dz  c_        y )Nr	  )r   r   isolatedknockoutrD  r  r  rr  r   )	r  r'  r  rf   fz_blendmode_namer5  rB  r9  r@  )r
  r(
  r   r  r  r  rD  r  s           r   jm_lineart_begin_groupr  _J  sd    99#D)XX00;YY^^	CL CIINIr   c                 H    | j                   sy | xj                  dz  c_        y r!  )r  r5  r  s     r   jm_lineart_end_groupr  qJ  s    99IINIr   c	           
      f    t        | |d||||| j                         | xj                  dz  c_        y r!  r  )	r
  r(
  r:   r  r  r  r  r  rF  s	            r   jm_lineart_stroke_textr  xJ  s)    #tQZsyyIIINIr   c	                 >    |j                   | _         t        | |       y r   )rp  jm_increase_seqno)	r
  r(
  r1   r  r  r  r  r  rF  s	            r   jm_dev_linewidthr  }J  s    $$CMsC r   c                 l    	 | xj                   dz  c_         y # t        $ r t        r
t                 w xY wr!  )rk  r   r   rF   )r
  r(
  vargss      r   r  r  J  s.    		Q	 N$4s    3r  r  c                 X    t        |       } t        |      }t        t        | |            S )am  Compute matrix which maps line from p1 to p2 to the x-axis, such that it
    maintains its length and p1 * matrix = Point(0, 0).

    Args:
        p1, p2: point_like
    Returns:
        Matrix which maps p1 to Point(0, 0) and p2 to a point on the x axis at
        the same distance to Point(0,0). Will always combine a rotation and a
        transformation.
    )r  r5  r  )r  r  s     r   r  r  J  s(     
rB	rB/"b)**r   c                   $     e Zd Z fdZd Z xZS )JM_image_reporter_Filterc                 B    t         |           | j                          y r   r  r  s    r   r^   z!JM_image_reporter_Filter.__init__J  s    %%'r   c                     t        |t        j                        sJ t        | t        j                  |      ||       t
        ryy rW   )rs   rf   ru  r  r2  re   r  s        r   r  z%JM_image_reporter_Filter.image_filterJ  s:    #u///ennS14?  r   )r`   ra   rb   r^   r  r-
  r  s   @r   r  r  J  s    (r   r  c                   F     e Zd Z fdZeZeZeZ	e
ZeZeZeZeZeZeZ xZS )rE  c                 ~   t         |           || _        || _        | j	                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          y r   )r   r^   r  r  use_virtual_fill_pathuse_virtual_stroke_pathuse_virtual_fill_textuse_virtual_stroke_textuse_virtual_ignore_textuse_virtual_fill_shadeuse_virtual_fill_imageuse_virtual_fill_image_maskuse_virtual_begin_layeruse_virtual_end_layer)r]   r  r  r%
  s      r   r^   z"JM_new_bbox_device_Device.__init__J  s    ""$$$&""$$$&$$&##%##%((*$$&""$r   )r`   ra   rb   r^   r  begin_layerr  	end_layerrO  	fill_pathr_  stroke_pathr[  	fill_textrW  stroke_textr]  ignore_textrS  
fill_shaderG  
fill_imagerJ  fill_image_maskr-
  r  s   @r   rE  rE  J  s<    %  )K$I!I%K!I%K%K#J#J-Or   rE  c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )rN  c                     t         |           || _        | j                          | j	                          | j                          | j                          y r   )r   r^   r:  use_virtual_writeuse_virtual_seekuse_virtual_telluse_virtual_truncate)r]   r:  r%
  s     r   r^   z%JM_new_output_fileptr_Output.__init__J  sE     !!#r   c                 :    | j                   j                  ||      S r   )r:  r  )r]   r(
  r  whences       r   r  z!JM_new_output_fileptr_Output.seekJ  s    xx}}ff--r   c                 :    | j                   j                         }|S r   )r:  tell)r]   r(
  rN   s      r   r  z!JM_new_output_fileptr_Output.tellJ  s    hhmmo
r   c                 6    | j                   j                         S r   )r:  truncate)r]   r(
  s     r   r	  z%JM_new_output_fileptr_Output.truncateJ  s    xx  ""r   c                 d    t        j                  ||      }| j                  j                  |      S r   )rf   raw_to_python_bytesr:  r;  )r]   r(
  data_rawdata_lengthrN  s        r   r;  z"JM_new_output_fileptr_Output.writeJ  s'    ((;?xx~~d##r   )	r`   ra   rb   r^   r  r  r	  r;  r-
  r  s   @r   rN  rN  J  s    $.#$r   rN  c                 L   | j                   t               | _         t        | j                         }|dkD  r>| j                   |dz
     }t        |      }t	        j
                  || j                        }n| j                  }| j                   j                  t        |             |S )zt
    Every scissor of a clip is a sub rectangle of the preceeding clip scissor
    if the clip level is larger.
    r   r   )	r  rt   r'  r  rf   rE  r  r6   r'  )r
  num_scissorslast_scissorr  s       r   r  r  J  s    
 ||vs||$La||LN3!,/))'3<<@,,LL01Nr   c                   j     e Zd ZdZ fdZeZeZe	Z
eZeZeZeZeZeZeZeZeZeZeZeZeZe Z!e"Z# xZ$S )r  z?
    LINEART device for Python method Page.get_cdrawings()
    c                 ,   t         |           | j                          | j                          | j	                          | j                          | j                          | j                          | j                          | j                   | j                   | j                   | j                          | j                          | j                          | j                          | j!                          | j#                          | j%                          | j'                          || _        d| _        d| _        || _        || _        d | _        d| _        d | _        d| _        t;        j<                         | _        t;        j<                         | _         t;        j<                         | _!        t;        jD                         | _#        t;        jD                         | _$        d| _%        t;        jL                         | _        d| _'        d| _(        d| _)        y Nr   r(   )*r   r^   r  r  use_virtual_clip_pathuse_virtual_clip_image_maskuse_virtual_clip_stroke_pathuse_virtual_clip_stroke_textuse_virtual_clip_textr  r  r  r  r  r  use_virtual_pop_clipuse_virtual_begin_groupuse_virtual_end_groupr  r  r  rk  r5  r  r  r  rB  r  rp  rf   r2  r  r  r  r  r  r  r  r(  r  ra  r  )r]   r  r  r  r%
  s       r   r^   z%JM_new_lineart_device_Device.__init__J  s    	""$$$&""$((*))+))+""$""$$$$##%##%((*!!#$$&""$$$&""$


>>#>>#>>#--/r   )%r`   ra   rb   r	  r^   r  r  r  r  r  clip_image_maskr  	clip_pathr  clip_stroke_pathr  	clip_textr  clip_stroke_textr  r  r  r  r  r  r  r  pop_clipr  begin_groupr  	end_groupr  r  r  r  r-
  r  s   @r   r  r  J  sl    1j /I0K4O.I5.I5+I+K+K+J+J+O-H0K.I0K.Ir   r  c                   J     e Zd ZdZ fdZeZeZe	Z
eZeZeZeZeZeZeZ xZS )r  zB
    Trace TEXT device for Python method Page.get_texttrace()
    c                 2   t         |           | j                          | j                          | j	                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          || _        d| _        d| _        d| _        d | _        d| _        t#               | _        t'               | _        d| _        t-        j.                         | _        t-        j.                         | _        t-        j.                         | _        t-        j6                         | _        t-        j:                         | _        d| _        d| _         d| _!        d| _"        y r  )#r   r^   r  r  r  r  r  r  r  r  r  r  r  rk  r5  r  r  r   r9  rt   r  rp  rf   r2  r  r  r  r  r  r(  r  r  ra  r  rB  )r]   r  r%
  s     r   r^   z JM_new_texttrace_device.__init__HK  s)   ""$$$&""$$$&$$&##%##%((*$$&""$



>>#>>#>>#r   )r`   ra   rb   r	  r^   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r-
  r  s   @r   r  r  CK  sB    "H "I"K$I(K(K"J"J'O(K$Ir   r  c                      ddl } ddl}|j                  | j                  d            j	                         j                         S )#
    Adobe Glyph List function
    r   Ns~  H4sIABmRaF8C/7W9SZfjRpI1useviPP15utzqroJgBjYWhEkKGWVlKnOoapVO0YQEYSCJEIcMhT569+9Ppibg8xevHdeSpmEXfPBfDZ3N3f/t7u//r//k/zb3WJ4eTv2T9vzXTaZZH/NJunsbr4Z7ru7/7s9n1/+6z//8/X19T/WRP7jYdj/57//R/Jv8Pax2/Sn87G/v5z74XC3PmzuLqfurj/cnYbL8aEzyH1/WB/f7h6H4/70l7vX/ry9G47wzK/hcr7bD5v+sX9YM4i/3K2P3d1Ld9z353O3uXs5Dl/7DT7O2/UZ/3Tw9zjsdsNrf3i6exgOm57eTsbbvjv/1w2xTnfDo5fnYdjA3eV0vjt25zXkRJB36/vhKwN+kEw4DOf+ofsLuP3pboewGISO7bAxPkUU+EaUD7t1v++O/3FTCESmcsILgQRuLhDs/w857lz6NsPDZd8dzmtfSP85HO8GcI53+/W5O/br3QkeJa9NERmPKgE2Ue+73vgj97Ded5TH1pPDEFCT4/35RFFtAMORMezXb3dwiioCsYe77rABjjCOjHs/nLs7mx3wuYFYX+HsEQyTfHg/DY/nVxa0rzmnl+6BVQfeegTyemSlOdjqczqJ0J9/evfp7tOH1ed/zj+2d/j+9eOHf7xbtsu75jcw27vFh19/+/jux58+3/304edl+/HT3fz9kq3iw/vPH981Xz5/APR/5p/g9/+Qhb+/3bX/8+vH9tOnuw8f79798uvP7xAcwv84f//5XfvpL/D97v3i5y/Ld+9//Msdgrh7/+Hz3c/vfnn3GQ4/f/iLifja492HFbz+0n5c/ARg3rz7+d3n30ycq3ef3zO+FSKc3/06//j53eLLz/OPd79++fjrh0/tHRIHr8t3nxY/z9/90i7/AxIg1rv2H+37z3effpr//PPN1CIF47Q2LUSdNz+3NjakdvnuY7v4/BcEGb4WyEPI+DMT++nXdvEOn8iWFomaf/ztL8wZhPqp/e8vcAbm3XL+y/xHpPH/xlnDejXKHJTQ4svH9hdK/mF19+lL8+nzu89fPrd3P374sDSZ/qn9+I93i/bTD/D+8wcWxOruy6f2L4jl89xEjkCQaZ9+4Hfz5dM7k33v3n9uP3788uvndx/e/zu8/vThn8ggSDqH56XJ6Q/vTZKRVx8+/sZgmRemIP5y98+fWuAo8vc+z+bMjE/Iu8Vn7RBxIis/q7TevW9//Pndj+37RWuz/AND+ue7T+2/o+zefaKTdzbqf84R7xeTdJYYJLOf7z4xq11N/osp2bt3q7v58h/vKLxzjtrw6Z2rOSbzFj+5rEd7+P84ULxH8/6vO/lj2/6Pu7eX7d3P6C3Y2tb3u+7ua3dkA/yvu+w/JqyV6GeUt0/dy7nb36MjySZ/MUMO3Hz5+LNycsdx54SB5wmN/XJvRh0z/vz1/PaCf4Zhd/rP9dPur/j7eDDtfIV+dX3+r7vz63B36vb9w7AbDn/ddLseown7kr7bbU4YIhD6/03//e7JiM0O669/vbyg1/hPdKLd8WGNPmnXoSs52h5200OGk/WW/fvdl0NvhpHTw3q3Pt59Xe8uCOARA8ydCcX433Z/rjfonfbrnfhP5j9MJtM0mbf4XZT4XT9czt0Pk3S1ALFfPxyHA6g2A3WCz90Pq6qFO+dsskjdtzAB3B+7rwwDeWi/reu0nbcOeMBostv1Dz9MpsuJwzbD+b5DcuGuKR32dFx/pcfGO9oOw7MZlAj64M/9bmOAaTJ/WFuJF0t898eHXfdDNmV4JC77x133J8XONCDiTTWq5JkvNMMLNY9C1ZLNa82RrIki9ULP50AZ/6pczOyn92DSE3IqRSZs7nc2+gmqKMi+O3an/sQkTQOpszcLsBTnsg2gSEf/KskTQ4YaANrFPFn4b/ELIEo/Iu2jQkbg/QEtEJXe1Y6MtWP3sl3/MMlnqf08D4cBaclr5KzEzHTuyXhZPyCXVhkcD0/DoXsmEwEfoWVQqsJ+Sg2eW9qniOGQFqHh3n+XCNMWCMLJ3bc4BPB2vz5CYenXkKjI06Rhu8mSJlSxKmmQX+uHB6g1jC0ztEQ+TRqdISmC6A46TLiH/sfMwBczE0mo4WrXHzoJpUyaKCvglLnpJC1XiEWSBN55eIHcDChLFpQ4TxZrHWkL2mUXwl6YtoN6OLefEmyRLHy7mizwDT1yt1szryqhfCOa1AJJBtKVZFRtCd8WU3pATvFrbr5cHlo6DometzoF0xmAbn3/vF2fgKgcbhbkKCCrCKBYETp0uZt+2siJ5pSGc92+kOVgbLVIOREE/rw+jcJfNGSxGWBysYMmOzxrCU3qelSBOUV1VQCf456kXEGaqB4gykGJUKTJQupBnixZ9NNk+S+2ihS/0kkCjOoD6ccjhCO3niVLKfYW367Y0xY90TIU6MwSVkRfVdMM6HFYsxzpPGobc0NLrV4ky6htQIoOA9rLmWTeIupuh6aRZaij5vPp2LH15zO49PmEMH1niBrcCCWd60KgH00/BmgpkM8t9NzL/mm930scS/j7XYuHlr2MGiXkiwoDQvnESoFVyfKEarx1uSGFA7ehkULobywiRPBNiqgAcbOCo9MFRwtGp1GVn6wSDuzTImllwJ65b2mcAPyAjZxvfcTpHN+2xC0bZboApKt6joBDPZhbIgyyEeD7B7Sx9kZ1qTWqKgeUkvZ66MUI1N4eejGytzeG3kgUP/QumFyVWyD1+EpSja9NICVYYqbrSkvzJV2Xo0WhQfIedV+EsGU0rd23hAogyuUKtNZ7kBjOxTEPBT9LS/CvBlfE32OqDgVzo+JFfWt3uqkhATv4OEhYCFtGXrRhR/jCY7Is4kuCVWavQ0QdiVoDqoiutekS9K0eFjpDy3E8nc75EdVjKGbtgVmg+1KkWtQAVp/hpaPQM1SNl1O/YwryWeEJUS3gUkebwTnzDLP+DdtgG0jtClLrXh86SHu6mQoIb1r5HM1KWjmksEN7xQ9VsjVpEQ1ezvA7gUqMD+97RcpruAv3Le0G8V2Oww/ZBDpq+40xQxPBh2/G6D1BqRSiKq7YJ5TJKjTdJlnpDjptk1U0phVwrbvkabJy/S5Ut1UPnyELqgwIovM1Cm6jCoGgMDERdp6sJJ/K5EeKViU/Nqc/Lutj90OeYwD8UVS6Kb7RNzMrc/sZhqsZmYenfh3EnCc/StfWJj9KniAe0WFSKFE/hpxYWEK0k5TAwIh806Z72+hRd37UjZ50NJBBxu16o3UD+N1iHrjZ7LpRfab42+5KJ5gZH5eX8+WomxFq+Y++BBALJnWqVgGIRywArlFjJgefUXkgf/142NpPKQ84le/KfdtYs1kD2gjLDJ0mP7Hg6uSntEb8P2TFYmW+p/xGo+B3kfK7SX7CQF4ZPE1++lUKGh3sT+tbAx3G5J/WN5WyDIzj5tQ/aecZYrMDKqraT6b8fWshK2gxGcINBb+0hBQ8uuifpPuHY4SlmwhqwU+qg6frKFcRttbIphPQR9WCwJesxfcF85bjZb9bX84siFWEiBYBh98kv1AF3jHTZ8k7PUvMVsm7v0F+TCjefdF4m7wTJWDpvmXIAeBbSrZI3on2gcBCFrWWCAN8BEhYRFXlK5N3elStQapRdRVIP8hQ0huaNirZu6sBmN5NW8wn5kvaoqNFjZgn77qrpQeIFrXXInn3eFw/o62hZ8IU7Z2M0Qv3LREDiNQOJKvXQZEej8mQoT9th+NZO0TxyYCL+ukInW4UZFS14AO1SrX3Jnk36ByH4DIyMjMHO/jMzJfqMEsDhNLI0VCJyIAEUiopfEt7xzj2zk2XU9T0d9GQxPrzbdufT9GgMPWgrwuaWSZ/Y02eJ3+L5nZp8rdQ+VaWkPaJucrfok6uTv42mog1yd+ijEP4kpx58ndG2SR/V0NNkfz976E/WiZ/X99DZ3/uoxF+AtjV1Nx8q8JEqDd7qhkZYwUmB/byYoqG7OuuvwX63cnibJH8XQa0Gt8yoOUlKJ9v0JT/Ho9fZKuWgX7i7/FYPwUQLU2skr9vdTKh0/19q9UBhOgHI0gSjz0QU8+WUGx/jwoFJTAgF5SXemIhmYEhH066cZUEfEE2yc8syEXyM3s9aIU//4yuEtXlZ6815DN87+83Jqfh3OdavsR3yDVyJNdSS8STlByRjPISnlz/szJfgWNp8VoGUoZiqH8/969RViOG35kMcOJsRBqibJwnP0fZCI9+gol2Y79l3IBnya9F8gvza5n8oip+mfxihVqVUD7tt0yJVwRchW+TX0ImZckvekjEGPeLSjJ0nV+iejSdJr9EMkMGEQvfVHGMioqq/cuFhbVI3lPWNnlvynaevPdlOs2T974coS++D+WIye77IGJuibgc0dG8j8uRnqKkTA0tHsrkPSv4rnuk69kyeY+yEBW2Tt6bQmvwGxUa4tGFBv3ofZQBSNjwqnMI8UiOgOmXJJep+5Y5AQCTQ8vkA3NolXzARD8tMvxKqc+TD37AX+buWwIAACXpGM1y0I048Nbwi+C8ioAS+eBzH7J9YK7Bw8aPCTPIE8pgaglRG5YR4KsW6t2HmysAy1oz/LxzmWlUD8Vx8JLgCPXzKWgAH3T/jXRhfPKVrJgYUlSXBcigutDvrXxSsEROTCkjCMiMz1JUDQCnajBhkaqxAhD1zwXoPeodVNIPkQ7Skj6yUDBImU/J3LmllRBtZiHJ0IWlo6x0IfrsahmsVlVtHvWMEcFdKTzwLroNeugP8WICa2u8mMDA9t3T2iWOn7rbd1w/LmCKbejjcDnoalzNLX7uzzutF1ULh3v1BrV031vx8pkQwqZz3VrhQjV6CCNKFtuGJcJ+CXy7FQn0rh9c3zxhZTbfMqVtHSDFTRe+D0CUduDXzrX6WJH2vUThvn0GM8sNoOYxU+9B4iuSX+EZWf+rFMw0+TU0X/B111iUya+R0rwCHaldcwA3p7hzeLXr2/ywCsMccRkI8fevR13P8+RXnf9Qtn49Gac1P3QmkOOSg+//ZnLS5L9DEsrkv6OQwBT3afKR7rPkY6R7LkD7bmCafPS9XVHjW8Ya5MXHEEsFIhpVyFb9RzoBqXOyNrRvkMU8kKIiFJAj1s4QiJqjgL0dmCdIRtjbKlcLknFrTJFEPRoVbfIxyhXwJVf8tw8E/ut0hJ0uLx2tXMBryuQTczFPPq24YzeZYHqP/hJU5qh0Sir31ITU1FM1qcJRufFXOiozVOV5JpTa+zO8mXdJnoncxM4YUpElI+VdlimozLssycu8SxQaKC81OltQXuqS6cu81IUJxUtdVKS81MWSlJe6oJyZl7poQOXisiUlLlekxOWclJe6YPqmIvWMlJe6pNRTL3XJtE+91IWhvNQlZZl6qUtKPfWylCyHqZelNPF5WUrmxFRkYeyFl6Wgv0JykPlZSA4yzwrJQaa9EFmQPmll/ls3EYqw3r/0vsvHAPTJN8XSf0ceSgdKS0BBqAaLzH7YvvITvb/51OsBtYVubaNDutDSa0vIXJTlGzX9jDU6kmtiaN/2WOU8GTmDt7gzhfjR+jzSF2+AVgT05AxBbB9iCIUVzdcQ+zZy0SB5236vlk6Rov7JrLTOUYD9nyIAqkHUa4A7PJ7Ha3DwLn0JXJwZlszn5slndhbT5POaSiyGgM92wQ6p+yzFCzQUHDLsc8j/mSVirR49/+e4/6WnKHfnhpZCWCSfow1iOL+5+Tunw1AEiL07n6KNW8i6dbv3NT7d0LbgJ/WxCRQp8ymDLmlkh4SJqNWgXJIfzwyh4n/WvTemB5+jcoAIesERk97PUEgee6OwNwtDnXrW1npqiPPrQCGr5POxg47h1WhiCDtKH5Sxz6d4Z7EB4gsY4b12O7XkD+brIFSafGFxF8kXmY7M3bfkBwA/uUCxfJHJRY5vKfa5JcJEotGA1INSoxID3aoUIWCl6aPufNEj9RSk0vQXgfQ+llXAJOYsYJKCmcKU2cAkwC7WlMm5NtUpAihpoTxKk4e0MnuYuW9xC0Cr9JiefPGThJX99Gofpn9fRpMEiqknCVB0v4wnCegqvkSThBZ0PElg9mpIZwTy7EpTgYxab6wgmGQIGvGX6zXS1oNK1a3oUjcRZKWo7Cwr2SacF55I2T8Jy+QM03p6298PO+nAcnEgi6lN6jG9ntqMwRuBTb2bwIuEkPkI0mhNnVI0/i/jheQJMd8ikR7MG9bcJdb9WBvga+MTlJGfv2MY+hLNJCoPSFWfJv9goy6Tf4T22ST/UHUHU5N/RBOFDHS02gEHrsdpwIuKCuFG2yd18g9JHHi+rmFK90+KUSX/9KLWWfLPINLCEjJSQ+5/qipSk1QjBKZq/1RJqOvkn77q15Pkn5GIiFNEqpL/oRh18j8h6mXyPzqmBUgd0zz5n2ikz+Ges5tZm/xPFA8ClXjq5DfGM0t+k6506b6lwRPQpY6x5bcgVWuJkCFl8luosSljuOpuVsC06K2hpY+YJr9hHqA714bI5Va3h+B9hqLl/+aLP7efvktZQSi9wzEtQOu6XoGOhkfonL9FuYYsklzDt68wFOByuu+fdAbNHXbLYGJB3q4/n3e6LkNREfiWrzr5F8tpnvwrMq8qQfsRZ5aIGVa1dN8y/K8ASJE5whVZ2s4myb/sonPVmC9ReBztS2aWJf+KWmAF+ub2RE3GDa23BW7VGoi+7XRa5gTGO2qLlKiO0vi7Gafl3Ih0kfxLazqzafKvqGgRsxQtv/2uVFMktEmEvrFe33cYbXZoTzM06bVvLC1Zm+4rnM0mxJ8uv6+P6zPczWtLH/eXZ65RzA1/v0Z3qcC8BXi8yML5JAf9dYD2QwU4RNq0Gncx5hGooqbre2Zlb87D7NfHZ121VxFXBYhhVScUyb8fXob98Dj8kNN+ay2G2Ln7FkvnlQN0vqcO03ZLlcPEENs7igySfPBipgJRZAsZiZO6vJxYQlQ4TEXWNwyxC41qq+SlZoghdqXRyBB5pjlict0kvkZAczefJoKH/T2qelpZyFKT1FFDRLoSKJx3LtkMXCRBYzUABm0XwJQ+Qi7nyAG9pgzuZrN+VnWsIuTqKPJB6aFQ9G7OTfMAB70RguiMSw0ZlidBmxaBWh4WF5G73fNw7FDvcq7srrvgAZE89v2EO/g/QOzCkvVsmtL4aGrIdII+yFqqe7K2xs6enFlFwJHZxFrJeDK11p+ezOyevCdzu7ftyantXjxZ2A7Ok6XdhPdkZbfaPVnbzVpPzqwpnCPzibVj82RqzdY8mdmNAk/mdg3Uk1NrU+bJwhqLebK000xPVnYm4snaWgZ6cma3Wh05ndiJmCdTa9LsycxO/T2Z22m/J6fWLsaThR2kPVnaGbsnK2vw5snaGo94cmZtTBxZTKwxkidTayDrycxaH3kyt1aWnpxao1VPFtZaxJOlHeg9Wdk9fk/WdlPUkzO73ebIcmKnqJ5M7Ua0JzOrLnsyp8WNSFVOSYpUZeEarSMpVS4FWlKqXNJbUqpc0ltSqlxCrihVLiFXlKqQoCpKlUvyK+ZVLsmvmFe5JL8yUknyKyOVJL8yUknyKyOVJL8yUkn51kYqyY2aUuVSvjWlmkrya0o1FZlrSjWV5NeUairJrynVVJJfU6qpJL+mVFNJb02pppLeGaWaSnpnlGoq6Z0ZqSS9MyOVpHdmpJL0zoxUkt6ZkUrSOzNSSXpnlGomCZxRqsInEADJXEhTglMhKVVRCEmpilJISlVUQlKqohaSUhUzISlVMReSUhWNkEYqn8A0NVL5FKWmdU9WQpZ2DuDJyppoerK2xjmORMai8ovMJmMLCcpkbCnJNxlbBZIRVT75NbpNBFUJaUL26a2NVEub3gy5nE1cg8y5MDxx4mO4JWHLrqhyVs6ynAsJ4UvXrkGyVpTlRMicZCrklGQmZEEyF7IkORWyIlkIyYjKUsgZycqRU9aKsqyFNELOhKQYbnAhyZDdeEGSQWVeyCmLsswyIRlUlgvJBGZTIRlyVgjJBGalkExgJkKmTGAmQnKYLjMRksN0mc2FNFKJzJmRaiGkkWoppJGqFdJIJQnkMF3mEyEpVS7p5TBd5pJeDtNlLunlMF3mkl4O02Uu6eUwXeaSXg7TZS7p5TBd5pJeDtNlLunNjVSSXo6t5VSE5NhaTkVIjq3lVITk2FpORUiOreVUhGTrK6ciJOt5ORUh2dzKqUjFwbScilSFEUOkKowYUgqFEUNKoTBiSCkURgwphcKIIaXAwbQsJIEcTMtCEsjBtCwkgZURw+dkwZ6qnE+FZFBVKySDqkshGdSsFpIJnHsxClOfq5mQTFEtjk19nqVCMkXNXEgGtfRCFqYElz6fUQ+ohXrHJUuhaLyQJRNYLHyRoZ2DXE6EpONlKmRJMhOyIhn8MqjlVMgZSRGDWVcsSyFTkpWQGclayJzkTEgjlSShMlI1QhqpFkIaqZZCGqkkvZWRymd7ySG+aCW97EWLVtLLIb5oJb0c4otW0sshvmglvRzii1bSyyG+aCW9HOKLVtLL/rloJb0c4otW0jszUkl60T+vmiyQBUmf/Ap97KqZBpJc6UUrdm7FaiIkxVilQlKMlU9ghQ5q1Ug3UnGYKJqpkExvE7imIpVCMqJGxOAwUTS1kIyoqYRkehsvVc1homgyIVkKTSokS6HJhaRUi+CYUi2CYyPGTEgjhq8bdW7i9XWjnpqIVkIyooWXasZONXN+yzRDB5WlTicHiSLLUjdBK9McXVCWujlXmRY04p9kCyGnJJdCFiRbR7LRYSh3jvO0NCOsczydcSqUUWa/kcHqqldniiRanAG57Y/rp/Vh/UPOk7jraNoPifuwMsL5Sa+XRiBU76bYnKrGR5URdK9iNp5V1MbDeF2IXTpvUlnfMwwz0PSHRyA7h61ogQ4M/517jTZE990mAhcER7ZUTNKNlSaqVP14pWkagSoxdP28PuOvybd5Fsjtevf42m/O2x9WKy5ByDoAR5Fd9+i6THxJMqldgN6sn7rT1iwGvrJpWVdx6uvWgNv1/tvalFIIJB9xRh6ngW0WM4LHYsQZeawt24olwu/WyGyR1aVtzzWYkVjZiDMK3bOfT5fjWnxxLA9w7GU10bxxRVjlmjuqECubCS8oqpDPmc3SP7hIeQqoSdHLFg2Vfdxu1/1xWe9+yDJqDu64PXsdfdx+DlY4bg+mXm6lHrR/6Y6n9WHzAxdWAqmdTRTuV2eN22BPjyw7qFbIHD48aWBK4Hm7PjxvL+ftGhWWRlHAuHaYcVWFn/fH9cNzdza2uJgt1FeoN5lHxnEiq7jmCiN6ml3DytfUxWSiyPLMuba+QRuZuOxsrDDRgg/DGY575m2NNnG4bNbns1/Eo2J1uJy+sjTDYm0A/VpfQHS/BzRcdoACfVmj2ML684TIsTv8kPFAwPploFgv0Uo9s1Bwu0rJ/v7lBbm6qlcrfh6H9cO2OyGXqSSS/lPqTa2B4Yi+74nFwWQZnJ1ht3sT9xDyuO7UQiLbPpEAoJ8/PiAnuRJocpWdj9nbTNvZnJi50YF6RnSjQ2NpOXmNqnk8Dq/3w5n1fTa15GZ92m6GV9oeUI/xkC1NXmQhkCtRXm8i2OWFgAt5c79zgS+ngriwl7kgLujlRBAf8jITyAS89AHbMGZ5IF0gs1mAfChUqD32uu2RGRDRuUNZb4i79ecioAzQoVlATZgOzgN8eXGYS+cWJf2t+xM1hPocES/fJJBIlUq2Q9x+TMYrWARHB3r0qeH6gsclNQ6TFGeKjgJdKQYE//r2Q1bNWgUyKierT4zBJSqXmWfeCmSrxFQQqREuH02hzVJPbEyhFYG8PzHIeS0ISuJ+PQJ9zpUaGB5dHVhIcJL4yiMis0OMTmAKBWGdHvrebm5wr7HVQLRf5jjeTLjStHZogzj2LzRg4+zQEv5Yhmnx9gio0rxSh2mtYoxp1YLLJife8HZ65mgyF2q9456JjKRUDT3nBoY+B60yS0No0WAUgnVjUcuFIAuh0zYKo5ivrkq2pdPb/uU8mCFAdWZoIWcesEAV9/nHPuUcGYaTKfGgjwo5Bs5F6aFTkmrAI9vroeRptdPSQe0kvUNQ5y33B0OgnF5ervRRdPCXW9pihHttMQK1tgjGV2rkWz9Icdk4ugqH2frWH9wM8o0KD4sxqCMTg4oWBlf33KPFjxoNoYDcYyT2RvKFIqOaTNxJkvFbyTq3tOSA4auKWk1In51aAb3gXivCS3KPbBz0doxaBRBVZhiD78N2ZprcRxeb5IaW8QluO+pyp/7PcwcnWyoKGGXLEoF2D+sLO4ospzO9RYhQaRriNdGaZKxLohMGNtYhZ8ajSvOM9EiXRM9qwG4/8r6YrYRzGnYY1DfCmhgZDsMQT2oWaJH3nc5HxqjtMljQ3dmur9xbU4LGQOuRFRQTdLYzCc4h0kCGiYUBg0JvSGjZobahJt9vdb1akvY1xhC6yjgg1BkC9nh7gZLsdVaS1gklvUMurHcPKDVzIh551B82eq4Ine6+V+YCTMEONdtXIJ6SNwBKCHVuQ6R0CAaHl6E/nKHvQEF1SjBn+YbNEcSzzW93pOfpNVd5xqzfscF5uKAYY106/d/4WqtuvuPO69dp+r850CH55PCWO8aipEU/G3jGo2ZmlnnsHs4em7vAjNvrzGnmN9g6a13Om57cFZm5u8Ch/Q7uH9kpZKXPgeDMZd3pjG4kK9nySZrb98bpmireVbqCRyehEUeLOR270EyTLYdn9E0Zs09fU1SBHlBTswJT4/toigdfwz1XNXrXP6ZI9aCrP7J20NUftMw70Gr+CLM8RIuy7oyWgnmrIey5yUnVBPL+TH4egH2/IZIpRPfCyqsfajV2fqHnNAC6klUWtrUTYiwVbeVoFeIE0Y4iSTRDRFko0MqiES1MnehGh8Gu0YAVZ6Ihq++tNBQNipF/E3fbJlGDRCTLCLGxNBFmC2weYVE8cRA2keju3frUsk7CVRvW8iVrLeQMaUpLycKWcriKWc4OJ43RzXCBwm55JXn95imKbu6wGzHk5GECcbCj/ByyiNlYjdzWuiCchiu5UEEvuh3A40W3A9KY/p251Jm5bxM/R3au9VtoQPCYtx+pss4MdureTJfcJg/Uh/LkQVsKloDVOIY58YPc01fh2yuNxLXSaOmgNJLehWPeNcjDhoP3YaP00jrVuMv9icb8GkXkUC9TkPFysv0Lj0M+IMbh0a4lO0uwbFHZT11mCwu5KmIo9GZP3bGjEg3/DfzrpVskQe6kW+JbriLEFOlhfBXhDJDoapklwr2D5F6OO472iMRdQdiYr3AFIenQucGdRNjUnnBpgQDGE5dV+dU/cXGHeZBb+vDoK9lyZRDdvtqJgYbd5nR+49JM5YLRdRNuotM/0PAetMIza0j72mEIXT0cEOoHAZ27U9C3b1NckvPwzLkHJtxpbsjAn1YE/vfLFVeRE82xnm+YCxdkaCvpykR8+3LFBVnfv1yRWUUDa1bDbd9deEbKVA6/LpVVgWMGN2Gkwhj5KGeeEZbL5x6Kw2B12w4ImlM4M8hO5h7xQG2BPjhxnobOA0yku/EQrhnPVSpKh4/S4OBxClwoQX4HjKR36GUUKMQRXbZx3/vL7ty/7N7Q2c0qh6FxgZo56mV34VrjrPD0AL1pZ+pWjs7dobxTnWMalw+MysMedaKYsnQo3DTRTTxblMnofJBrqkuFu74HjW3XUXkzDZk6/Xr3tcM8iOPAIrPQhnfW7whMLMBp0tEiqUXkMBUx1Nbd5Z4TPvt1uvRnJ6yG3DIPbUoe9g/omUOXM0eTjHQ1+HJr6soRpNHHJdgdD+ZoywQjn/nc88TX+vjGbfJUIAk2dc64AqCciH5TWNqqmlTome12xXCZjnkOp1DmsjbuEdqTedxIceNLriBTkA4vEn2Ib1UuvEM/H574wNQS99JCqodtUwtFy0LOp78NT4szjVlundyFK9ngkqS75MxCds1HhxgxXHgNsRd0XZxDUJrD0/HCdJp1c75NMFyOnLA8Hc36E1Qo82DBAILG5o6YL3h5ETQqRzct78ChZuBoHsZmk7XkYs5rVNJA88Q7R09LLhcp2WmgM9JZoHPSeaCnpKdCm9irldA/89JRKhCWbnnhDNQeT77nAf1JIfQHngadSHDtJ15VzKHJ0Z952XJaBZpnbUJmrHidoSlaSzLtqZA/GlLS+pOJS2T52fide/L9nPmaimgfjWcpg0+8b20i6fzEq1cmgWvTIdn2ycop2frpi0mHRPbpN1MqUohfTGQS+j9MaMwF9/QGFYtZIE/rw4m6voZQKR+pXRBDrRtN700ejeBoaTa75utdsTRmy2ba8gYehZvfcKADNvG+DEd7vsF3aqZCBdWL5Q9Pz08BQtbJJBTFcLx863p7FyZChALQnalWcGkGnqHpvXELM6ONvqGMOk4F/HJEIA9vzGDUwrejuVOb+ZiSWrEvX9H0CMS9ZxmHj45VJNwaLafJJlLiSavFqBLkJtgIGNItTZnveImvaYmNl/igRAEd2wtMErdyZsxAomUzjzxxDWSSTdy32bmZZClJtSJWGjosiJFW05+S3tX0x0S8CyuVFG5nl/ty+xlW9CIgrOk5eItA7f628XxnLGVGnLDyd8U/dU88Nek46Zgz8un5AXVAf+z/EFdTBY4C8CxoB3sBZwocuXesOH2VAkfuHctu7Qtaa3Tkw/Mu9xflo9HoyIfjxTlXKnDk3rO2pso6cKLAkXvHYqfUCVgocOTesOImMJ8D00P/dGUBbQbisfP6MNpCmi4CJ8IOvApuZprn8SnIPa8sYPrFCMRM4+XQcZdFjvKYQX5aQ+r7nb8/lfWIy2/XRgrzWwy9KrQcO5DetbnJ0X5b4+LIecP10or1rvZv0XN5RG1Sc1vb54tJ05NPUymUU5RXBLSOsiCAGLnayKNBlaLd8ovJGLMxGzATzsux33ujBJNJPmFcf8k4OiqMnpWGNWHC1c4MWtl9GBzQImShAFGpy+vR/MOqQG6J0W3kRP3l9XAedeOG9h23IXQP6oDQhRog9JGYtW3GFb2pIfpmIxP3Ajm6ifYxskSxM0vpWD0SoiWid6YaQ8tiMOqbfQrm1L2szdJU2GVtrni06zFjmmOqvSrUpo6bOFwQQZPvtn1oOktDh9EDFUPfQoJS0XtHC7LROYjZTeNosbspCdg9pKn9lCsDa8Z1GPbIVsiLn8sJXcHhsrfrbiErV8j/jvdkZxjr40yuEpXHhtBZ7ICQwwTcZhE+MR6/nblD5E/rFyPMnQacJrLXwxMFjogmgSi6cOZvXifx1RNoklUS3TzhWvpUUNc8gk9pzAGK5NSFxNh1qZA+nwc3OYfaven5JhtEW1Xum3P5zDL4wpLdxs0y6NGb6D7EAmE9n7ZmUayYwUO0P4HqEJYqobFtwj30aEPRHBhJPchmBgguomzWfokE3cKAmuW3MsjXCURb01sZC9I7M82fMA/Nt55I5g6LZpLeoVquE89iCuBD1tNFOjo8UUdF9R7U3iBrd1h4zJazQLryrBLfgl2J5wEYFKISt2IkGGxOvDgtzVNP/c4rUluh7GKZq80mQ8/OwGJRkOCavCzzoHMyK/Fvw8YqNMYSO8ZEvzOc1wMS8qyP2LaCurUCRCOqPLzoHEMSzuveLNMii8LSPOTQS/MctvTSPCU3r2kgT75ZzYCNnpQcTS5J2CXgOZ3ffmcjJUdXYzqNVj+LVcIGARE6OWo+w/eReciTJJ1abIdbveS6SDq5ox7+7fq6X29fekCvtQt4ZchRXHG0NYfhuhbV4Hv0uAeD1UutTM3D9i2+Z6GuAMrgObVEOM0914C8+LHSqIyxM43q2zErzZAXP1KNRtde5pojb3tQelVCEFUfuwbX5zGk02eskTPuSY8q6aInPSwtR+Mhf6f3+hFOd2WHAz/63Q/0XJ1YuNf4VsUK/1H2w2u0No/y0YZX8B2dwYfckY07gnOrBnltP8MI74BQKdvWIlK0jD0AbkeLSw52jSGrZql14HKxdAF0mEj7MKpUMN+2MdoIxAa+YXufWUzlhRdH5aSPYIs+4yohXFT/th0uyJfMQzS1sdY3HFMbi2KwGpD/L9verRzkWeZSKl1+NqldGNECqcNUh+/z1SeucpFIyuqVAE59Wjkv/m6sykUu/V02qZwTbwBNcnwWgL5u3DqCzNVmeHUgI+N+1MHn4YBc1JcOGNCf/AehX4nJkbBdt7frlFArOvNkTKgrc4dIRrQekDLOHCIJp59d/8JGl9Go3FMyscky1oKgA+SekLdoKo/IWzTIAP0WTY6+db8xygiXK+23njmhgkZ6Bf2/cAA4je/gaMg5v506kwVwF1myQzY9YmA21x18vLn71vFmxG5dNEfH5g2chh86CkY5ehSH0PhOeRTOwSbHPGHZhRdy0MqGUMKIyN5OmzFp/HzYDSe7WDa3QHgzBoN+DInboo0ZXiFGBvjKMJ/g21+0hVl+F99qhUmCNbZEP+U+o2bnMNGpSkerBrMg1H/FvP3AdGclivWo8w5+dC5PIZFOXB1I7Qox671IjuK3n/xBBnLpLatzfjh9oi5JDEffQUIrtfTVoG0cegF2w/DCq9nmBKkbnpWk7D2vDHArh+mWP8ai1VgGfTZG+xseX6BcSttCZtoZVsUPNRzVpKXU4Ms8VbRCXsqtL0v3LUM8cuaM2M/rxwH9jEwMOXYoPFpvCbwb0LVLP/9bIu6LVG/WAHkVqbtlB1sp2BeExrTeBPzPB7PSxwVT+637hoXD7JpqLiTNuyfcSgu03KnvwWhS4UE5P0MAUzXaDpgeEbMvO3dlf6reeFoZyla8mXGjH3yaEbAqdNrMk0dqqmXyKKsNLb7VUGBoBHDYdj1XhyYz0OetWoVrLRCtwjksWmtrkke9PlMnj0F1LJLH6MWpVfKobF7R2B4jbQjN6XFsBLvMiI1XyJc50dEKOTTVR730gNgxdlASHvt+fMRMZcLfnh8I4HHHD3gyAITpHyPVBtqIg0SzyQSRQQ8y0xq080MBnex2GMeHP63JoCVpw2jNF036nteP9iCwp8Ia+hgLy+iBE5ZVAxYWkud2sThmKC8xWxZ753ZFN8JHvhx33+3tyWRPBWcOO1wO9nSyp4ILh7109giyI4LxuIP4ikxvzyEHOrgiejydzRVMqB7diToTpvmPPeS2Vlck4kfLGLRRy/PCfAUd09JKV24MEOrCVNE3NOW6NXyvKFvfVkeF7pMWSwNo7bdxSFB+LRLrvoXDguprkVs6rhVRq7jWbTTUWkgruBYRta62pKi3C0977da6Fx3PxqqHauvAq7agTDtDu+DBMvMmEb4jlQxtKBwhxFThcXgUexl2GsOjX/eBqvAIXXAv7CnZR3alvM474XPYLN+p+Qr5aGlVvnMDhPLNFX2rfJeG78vX+tbF6ZFQnBaJi3PqsFCcFrlVnFYiXZzWbVScFrq1BFoZji5o61YK2joIBd142he0dS8FbeXRBW0dxH3mUjDpNNMASa9ZWMzVERfQdtSaIZEomAjkuH7g3jFP9kxJHR449ucJTxFiKvukTeRI+gOFBb69tRzxcLZ5viIZL9NjaH3iod5owGlmU6LxgNPMGLI2vasMHSzvSGs1bgFaq3Ck7UuHTW4/dwjJKRCYMDlQ3cHfTgDF7x82iZ5DTJYg/VITkifqA2RRzyEi5DBMl5YIzyEijNFziHDvnkNMzVfggI72CuBSL2EUGWiV5ob0sOcOV3QIq2A4x45vZjDkoAAuHC7IKnfI/vLHRu3CzpbEUVl5kpCXpq5II8A33nkeB9oGVggXRQzt162BY0r3FBld1qT1M49VZhBXsQxb1wUHhMpgAH1/wNwCoxsEWote3SGwsvhY50F9+N5bkwVZ10+KMWE33ppE/m/D5tTcUFphJGInfiXjVE8UIkC9uQAt8UlvLsxJa12a1brfdzt7A4v5DNpPBATVx8FBiwAQbzsg0N1wxvRBXq6QK0NbzzqdOfHK2JgDoF6/gDKnGO6s7ERjaqLG/L1mOE/pLZ5ux5EIXtRsnl7DKso5Uh3e+ITbaBRFC9d7IOhVn/QeSANautOM38G0EI3syOsl7eJPlfjlSxY1P/WyfpnojWLnwN+c6UhfjXJLhpszWwtEcjs/6jZNIh2NLjmUt57wXQWUIo0MR25vAF82Ho+GSPE/HGUJgcms8sBwIVSVQF9VfILKAgUkkEO0mIc+hUdSwdEbFgWScuEEYD/4syDzJkDe5qux2Kk/PLlz5pN8FiC3OUo7zye9/dEw9ON6HzaY2Mu8hf3xWcL5O6b129uPrs7IiA0qUHV1v9fQyU177jwJJ0bpSN91a+lwoy5pddhxSXJkBpIRG/d689ygYf9nRXrUB86nAPuz2mWbJ9vIgmmlaL1MUtPhDrqkXs2ncLymRKRNLRBbqWTpnTFLCSw9K7bcheXGE2vLahXr2mNjudFFKKlgz+vTcRQeqlnEvQ7Spep0eb6MWAVznja9ZqJ65MoKM/Tqyd0pM+v4MgzmEoP79fHenJtvFh62p448vqBIoSbSs7L+ajJFm5udIiTLr5DHMRJs3zR6cJcd3OJRGLTi20zUie6KI3NqU9sFSO+voKy+gvLpFRQiiOCx0BHzSuqIG4vtWN7eq0kVbS7MipBsOkbyyRgJYWt0LLDmXcmrmbG44LhHnKtEb4NN0K7iN53RItSbzuhOgvZaWSK86VwkW/2mM/jRm865oSVkuO7sbW+8UOXMfaTCfkZ2/AoTGw6I3wXNZSpUUFuIbW90sHoVrCIpeo3xYbtG7W3VzCvNOb8O0v9h7rkdL5tZ7Dv3LTXzIuaOj4I3cyOG741HgtSaJxE2Bg2H6Iwr11OPApgplvhHNwI5OhRc6DUqBqpP4tWKjjryJRmXc3Rve14CPIjWyvw7XtQwwVHJ2rGSpSxFQXpPpf3Ur6Ch+Prucn2uqHH46PCMg8cncpYWDidyWguMTuTQmc5V9EvRCXVNRxnCaK2hK/Q+85lOFZGlmtgoIrROB4zbuoOvmrnD4xYOMLrmH/kZ6X4oUH2mpcKgAR32xS0MsNlHJ5RJ6+RrOko+ctPZ7VIX4Wc6U0RWKiLPFBFEd8A4+Q6+Sr7D4+QTPAzP24s3VMoomNvQ9zrzzEAPmnjhQgAUsG+xnWdqmHL4SLMysoJd/ZS0fop+ZuhvA482ObPLgpA7lclqOpxPL7x5ydxdwYIxN1fw0NRW5g3oPHVbQHHJPSjsIqNjtKT7Xl1klcN3dLC2UHRUfOgMoseFsuUyQlxmQeivXE9EOG8vW+508mpC+62tuzw/2ojxDkWpzz2gdspKh/EdrYzHXXrq07OkFxOgJb+VlrRK1KWEdZVoe42MpFucgaC9vB+FcMOAVid9bHDTJvpdlKJMem3lAmH86qExRnIB5Vm9CpzH/tgFRpOoBUea3GJW0PmFx3yluWQLZx5xkCsqUIwpmsnNY5oSlhFqjorlPC8zRs2sZ7WC6hlxuO1/vuzMoRERo4rdHLm3EuTINdfkiCypRikzzxmjwp9CypcR/8+Hbse5ogQ9i/iP3GHFbNL7xqxVczHgHh54c4j4Lm/yJfIR+yhiZVFxbddfg8BZxIH+HbIhysieBxj9syMsgKiwduiOjkHO+oon8cUsFFmILyoU9kvCiRLGYf+B9uHCnsXsc8gSdJaaNYQqkEU18bDehyyJ0u0WnHOaSWiYx+9CgqNoMPI+SI2Z5jHrBVolaoRENovZJ24hBFHicJXpFVId5eSpe+A5JhFoFjN3jyJPlIzT8NB35zeJLxLW9nN8kjNGu6jSRfXgdB4enoWVxqzLJkQUVcjTJbTMOC72o191+1po9itXVKRAY9YwbIQTNbpv3XFgolRtM1Um9G0q01ljAkNVGVaYkNuqxiAtAVeJMbKGoJSwFDUwjKzWFIQSKovDVSC9bVOmMG2KyjJRlpLI7KsnmKCiRvfZshw7jo9jpdTjI6XUwWOltLJwUEodMFJKgYp9I7JC2zeSpcwlQeqVYeR0ZNSJeq4HS7QJPdCxt5Hs5LeOyNIhJtJXhpkowSuzOmRnP35Wj+345r27E417E5II1DYkYPxOC2y0Q73+PU1uqujQ5ftgzAI/5ua5bIkc3V3ewgEL0GIgx6Hg+l3EPDH3dQ7Hm3d1FoY9euIKVS/Sw5EBB/RB3vwPXfbB7IHxfH+KJnXQL7WVkEIdDQrU/cBDBDzFkQbsHNP2CppCaC7Jw8EkAIo+ome0e35ZRhHPfbgVlUF89Rez8BYWkGLAvqTrr7zPqQu3OfX6ofgCIonhHJviYE2iZuZLve+4mEeIt45i9wDYbNhR+7X+xHYKAYrSjApw1JWVJX9l4pU7TNecMRaZeCHBp9N2rfd8IalsJRi+0mTRNXklQEU7U7A+UkDYvRPJjI8svtgjRzccwsFFq8CoL7eeS1slV20p15heQAb+bdufT5H5RuFBOaymmFXyO1XzefJ7dHdKClrt4i1A+i07fusdO0uHDTvQ2tZ6kvzu9fUVv0Vfn1lCFqDQGf+OJno6df5MA3L5d3cMQ8qnWCXxBlYNutuHtdmFoUdXArYGvLoTcGXg8bo4pFQLTTNGsB2dSWuS36NdziVpn0GG0DnkgJBFBOKrWxAgWk3Oo/6/Rz0MCkYaBDJIzyKzhNeEolfByLA+bZ/7yPIyJRwkLEC6ATQnS3fjc9A3nyFsDMOmigE82mcXnpUtABpgZIbVJDcssAw4MlBjpMogyzi5slcz6HjvdkEwvttwCUjneGHokOGkda/BcMfmwVNguhdpFB0NQCUYLy+m15vbz/i+RlRzoG/dcDnsoQfsZbSqUmG8cNXqJaxj1dPAIif4qYVxOq2hU8TcGbjH4dirDp55cdr2mzUm/EMop4mGUcF69kz2CunYzag3XTHvwjVZlFPvoxST5GrrxBTH9Q76KmGwLAYMtztjjnR8jnKWYX33kiI0o2e92N0mz9EFXjPSzmqD32K1gYnvc+h2UGSxkQbZSnGEGvIcm1dOCai9SZRiZJqh6Sg5kCK+8BM5cGWQvEJ1Ys057NaHDROaQoF7jnqXkrQeKQoCvmEarq78Dgi13wBqH7E19Ggj0Tq62kmsDDzuIimhthmlq2AFMTOUtoIggor7fL38WwtnpGsLY6xtzz0j6NuNh0YaN50Oz1u5uhHTWQMMcqtUYYHL2p8pmeQWeQ2epkT2Fzl1wtjsNVMzpgv647O+uYoZqcw8UDsiZR61OFJzNR3VHuRpfxzGG9WFQfddd9YHJFnEgAMNmXt0Gs/j/C5bzxhllcfH7icOl8zm6GGQUQDe4akfTsExcjMertF565VtDPrP6mQrCn18xxNSFg2IyP3rO55QrpENR05aPa8A4ZBkKdHUkKEF54qOygAVaECXE/IV2TSgw1cpqhkYk3s685KA48Y9U466vSJnOPhDxxwqZSwv+R0SgIhOehLHruIc5CflF4yhzDzrBeMpmHp5eK7pKDXI3a8SZgPqNVBtwmMm5SLZaSuGDKSzB4SWsBPDBeJa77R0mCeRfjat4m09eJPTIuHhgKvnT1YLj3/vnZNVfe1ivPfWrqrI0Y1XT1bzaxfXwcy8o2tW41nfe/kEffmVi+tgbD7IYDkleb8x+kTjvsUwZmYQljsfuDKfQdeKgKBtOTjoVh7wV7Is7L0rAZQbchzrztyMM+arAG+6GvPJGil9LbHrYWaxMEVzpf6tiN7Q3BcLE/jzrZBMhhlptuOsX65YL8f6fjuxYHdDsGVde+ZVRAvPuTW1WK7uEPL0zkwnnLtb46tyx5iOT2I7X7RIvd3mnyF3UFuN1RRi1UoQSK/05MhcpfSQI0pPY4n4lHG+BBqrQvBk7VWhCu60vaqjxWsVSLGsy1Eo3aO9clpf9jY38PiYO5JL67EJDwXxS8zGpoEcjt6gLcuWc4NHNmrW59hALXNo8AuV3UDaOs1CsovFWM3xIYyQvDTRXaCAGKK9QzpAtqH3tS877+Ij4CwermWxfsbjHgC+Xo+RaBe60ZyE7kcJ6NER5aacI7rd1wFKb/+gTPLTgHo7ewXdWFFo8xts7xU8axbr1jEyzC+jU4dTJDGMrEukZ3jYcqvJ7dSCPTxRgbcXimWVpw+DMeNbKFpsNDPeqetwc/VYhuox7MJlnxk6zYF7rJMUw6q/QMfsRZmrdVbttE3ie3UyT/OIEeKAE5Tc8A35YM65oD7JaAwh3QML6RT+/NXlPFm706tBiOMsl3Qgl/1TTBlq01XJsPLEBTMJyK1yyZLvFgtYf4ZMzxMeuENF3Os7WtrEL3hSB7Df+p7n1GFuF3jqyGBlunRIdPVuTtAtHDBUfwkMY9N3wFg6XAFDmkq9Ots4nwoW3yNlcLUFTr/cskOn8UrjPNN/MKdXNab2Me8oB8LBnGqm1zsaDYZb550Xpq/vnuNYUHQe1eHXjYV9yLUlx2HWc+LQfrh+oPGpwv1rGyyV/rzuMQnRTmcB9rFVBsJQG4u6CnAka+tw733m6Ctpl4aBrirO6CzAUR6nDvfhzh19lbMTMt7W+0HyqwSiDRlaRUeGDEyTPYFIKQ6nN22jwXz4Q60dNQzmePKu0fO7WU+oYAwvrBSgyPUYivDC3VhLlFEYN1ENRtMRVD9tFjdNDe07bKj4e70aCZ13f7UaiXZ+Q6FoW+t3rJ1MHXqtgSzTwBo/SsKqOZojovfb63WMmt77b7HlGLJSr220qaJ1CbF22NOM9LEPOqkig0ZqwKAektSjZsU0cikoFFjhkOfuEWNLwMsIj3sRz4tRhOSs0iokRs/MkQQz0qlrgaKdgsLwzajVoI5wKe9q+SJz+GjxwsHjyfQ0iRcEWXsIvKCK62lzNfF4NMV23uMlQOgrBo0CwPRxHxnAkdYtT9NRuTLmg7mB2iQCn9pcynF9A6FxhgHcTUWVpdwV1hg8SdLoE17xfezvI0tDdh0AA40uiqP8rnuS2S6zQi0QIL5xi0QskX6Can61QDBDevUCQZ2RVgsEKAi9IsAmenNFgMPFEORZQp5hL7oPQ6FGE4SrIkRJjfYp2of5DiwMMiEEqIR7rYEgIcF0DMSFtRM19ZL6D9XRIRWXh23Qg6HLEXDHNkpk/+UxuEZnd/Fr2I0hAg+ZqtccapSKXnNoNR3lF7LkosqPArob0CcT1peLOsFK6Q7KQp1FSyBu0ARPToE09sRzDZiLBkqTUGCP6BXttd18IM1A3Pt78RgzUOU180utkKBwL2qJBFnydd89hfzFFHevnCM1rzEfwSv/y4SqGdrrQWttNUlM2cwBooNfbZlO8e1VLTrRqpalg6pFWp/2mCeH6ByHpqNhtgBDnr9krDMAodDTRN/kMmlA2lYGBXOSHPzEE2PNIUw8MciHc63LpSXiiSc0skM88aSnaFgtDC0ekDPRbYkINroeUdNRCiFa9wr1/w+rTtuH0A+q0kOU6ATsjLRfWjeEXlp3QFhaJ4Aey+toLEK9TZwn5hYae4SJo8VhPJus4ITGIlcLtSuHj8YAB8fvEuSFR+MwUgvHJtN5adEATC0wHoXK2uORBC7Q2GllwXP/3F3OAWZUutyQ29EFipqOyo0ezXqJ1p+Z/Q71GiUKntO/Cc998SucGbe0ml2tDBCOXNeKvnWJV2b4fgJmfeuj6x4JR9ctEh9dnzksHF23yK2j61YifXTduo3WPCykD6hbRA6oLywpZ8YnnvYH1K17OaBuY9UH1K2D+L6yTDA5oF4GSCKbW8ztlCAgsxoCkeLVEDjTW2B5IKPBA6ULXcDMPqgXcCkMvadeIWGPFY3+4KsRBfFEnW1O2nerhtD9qgNCx0oguEdU0WWZiCq6LFPTUWWmxwOGr/UzzcRVD8prWP0NDTlJ34+wlIdB7aiWydUDg21rwaftBUKK02au0NEZ/ZVh3TqGUt2ZsyRkX/MMfGsZdpkF1tUMpDG88XSmduiNwIrAugqsNbzrRxahmGDU57MA6/5ApWbCRJzVlWwzRfPVJY/4dUAWw1mpSCtFHwZZL8TkIcL90VcTWL8xj/nZAJknZ69itZ7QQZkoeX3wbtcZU7DSAEdeO2kujK2Ni9Pl3t6pVk8tidERKiSB1AJs1NYF8+5VT6kQpOiXkFEpOfCrGzvS619vXYF1ofKHTI2uD0WeRteHajqq6RUZZ72DtLCIX8J0pF7zFChsHxHa37PHejKHE3JFR4cRNEMeIlkl9mIPax3lFFrMMRVq3k0UVmFZAxf8kG/mDh5otPiQee1UkcHsxIDhch2QSh1EqEr5Q2t403pGS9rrGYbQeoYDgp7RJgN1x1Uy+BMU6DSHsOucLZPhfn082jlT4Qlt7jjz4C3j2QbMIByC1iZcZLrjF1NIEF3DmqYe0PILeGUFOrviaFNQw3WHOzJ8ix7ZWkIOd6ymGvALlMtUo0qBXM40w9+JuMw1qk1s0RcN1/emYr6iTSFzCMXr4p3KXqSGlAMmKBGfR4hHGTWvykDqMkDo2oAZ/k2w8Kyun5wn3vqSB/ftt5uc18ng7YtXyDxdHggjMmlB8vQOMgKNDIxXpI8shXlqPyWHG0srQdvcQpKrS0tH+elC9DnZMtjoqJLJPl7EjFF4uLI+hne9wz1Pbm/XI1khp5CdegkQgos9MNTGIb4wk7kcX5hJefbeomWCb8zsaNY6s58pH+Yt7bfet08tZOxb5SrIqrLocUAfoq0vG4ufoebqmlUtHe7MYqFaDHtVnkvK09vEcJbpCHG+AKKVIriwSnKaRO+IG1KpyBXpoCFPAnnrbqc52V4/Nl5RKzpobOgbzIMqU2L2Ni9e5tWQfOx5YzbvW1+Q1Ap1ZYGgTxsgVqdTC+14UR+GqSFWrQ33lmZtUqIVa+My0qsNcutGKJMKrW8bl6JuG3a4Dqp2pFe2jWN36pEym1SL7m3kCjadk2ZGwKvPqSX6Iy+jZA0Vw2v215aQOt0uCakhg+6vTPvpz91tCsFFQ0BRAhWrcGiWNO2iAXmeoVEdN49GXzOViI6Pm/369HDZWaQhct5SIKPgpKhv+n7PNHP01WgAj/5h81XtvuUCKoYyNveeOUz3BmMsWsRFgq0xRRRsWFBboQj0mQboQ4PoQ4X79r0E+w0DqIPybFyRWTdKzT3mwXXPVqh4t3KexE9+TAoBwn7lLGD3u9f11zeCCwE90hjk9DAcO7v3N9w6lNEo2Oe/xvQ43CQvfLZskrys1/uXoDzWBuFZrmATlcGxnmPNQfpetcC3nz4Rf+rMzZ9ZigGBlLnyAoP7SzQPMy7VNIy0XsxOQfdva0wH/CZUxuD0+jaduLPAxkh/9DTNlOzhYRvZQS+YuNFCPMNFxOxOWNHLRKvtTN2xO7gLajD+Chkf3V/mbWCZ94XRWAWwbxgvAqD7KeUuUnxVXKL3zhSmFHwVhH0BuQmAvnjZpcbfrZPNFD1Oz0rx7IPJtULsWZVKITpJrcKjNOkIJVFzDapU6VDse8ulQnS6DM6Z5qZ/NPO/DMCpCyf2Tbmfolt1KUpYkCfl7l+p7GeaamKjiGytiLBF6YDxqXgHX52Kd3h8Kp7gN+UKutmLXp9FQoPCjBLSC6rQhuzNoaj50Qk4uAuXcUynQoVJDrHuW9ilyVF/rN3b2GUORjAzZhHFhxzmib6wlOGOzlUYKceLE01RGzS0fxPO6FJB1v7ozgs6unnB25yRxMcHKOnRPVDMVm2JoHXMPRTVV3EoRkTGHRUBBNO6b612zxxmhwKqhtxZtFg0aqUO1KfxvcNIBh+LtJfMA2rPqDbYCTUFkphZrzNINY4x8G/6B75NisYxN4milcDJ2O9gYAJw4r3XGe/OflFL50ht9EZQQ9r39obQnboDQq9OwLw5XPLD6NNF4s5FXO2zzoUz2mkVxnjte5GMz1hg9HbQaEXbOPUn0qqa1OEsdhe5iSI+4mEktTbgc/P5El4qxlzdABeZnKeMYDiteX++N8eASvpiUs9fyHSV4tzho/Q6OF7/r0qPxnlQWHhkwV1lSbyFPHXAKFucbzMgjkKYKpaEosDRPkDlgjoz+8+hRDAvsvjIOROpGzxD1m2b9KhAmAOvR93YEAj3odEUG/OljQ9XBgnb2IWh7c73hCc6DGk3tUtHqFZnA5Rmn1lSjU6oMtoD5o8vymYONSy6ngX1cuAhzcNTD83sT6pI/rIkSqp5HLSFt4h5ZuQTZhszLy/CYXQ6N0m/iAFfisTpJ6ehvAf60R6OZ+WVuQPch5VLphyasbnkz8wfUgqiHrKbWSpY/vFS6ZfjsLk8mOXaFYnfeXz1q7lFxTC5+N9t/G7BgtBLtzOWgjQkNeQxLJdmgoQF0txgmIPYY7F5pWg7aUE2nEyLrPmhpwQpgV3/nWcOUT/U6ipyJrrNBfFEd7eAVmuEqMhqjXCe/EGtO03+kKM0Nb/3ygCGgDp9l5EcGVmXxK4MjSui46N0DM1f1ea/00lErSPqQVNZFVEzTeW5pjidClRQaTwy1os8/gfPlX0H/l/9XGlUETfWq4T1PT/Xzo+Hjtc6KI1xlfyhl0xRhqKLtZPkD2eCNMdn1DHA3cBTlRjd8REUMUUGNcWA0X2AbWVfe43woGKNuP5+O4unMT7yZbkBM6S7Gsu6mAo08moZ7rCBhWYCjdwaRpyaSqCRW8OQ+mqxOmAj15bj33y1WBOwkWvDifOnFGjk1jLc9f8Wmgg0cmsY/p1XCxUCjdyCIZ3qInG10Ru5IKN8Wiis+U5rTWWFpvJUU6H2emTcejx+1Qg8I24ERHmRj7E2xiTCU9IzpRoL74G0gronQJpVhPjnPRQs2zTBb7RwF1x6z0YeZwuE4T8T6n59Mq+wtoK4W2PThSDRQB+8mlGLw2EbQzKQ5XxJ3bP8zbMe8tHUgVQjYNpY+BbkA5op+mBNdQxgLrr16ZorjEtBWaWBKGVVwvVGqILH6Nz/ArTavZuA9NsbRSKbPjnxjdvwRKyOsCsZxt3IDK4dYcoQbkVWIJcJp2asYqtETdIcrfcNJ0l8NwdpbaI2A61N1DQdWRkgK9ZmQxBjo1nCVIu/KXjOSvSayRj3J7tTQuNOcx8ElYsy0W8spSD9rhamqcdgK4X5bnhLoUVcsVUU2WpHCYPKMZrTzwzt92GKJpByJqdAfnaYQ/L5J6PQQd9qCKGwgsJUChIUJsTdPfGBHTtPZRE6mpsALOg6IGZLYFVi0n1UKwB5asmgk08IjA4eM2BdbgvSb52x49UH5fL0btWucvxTt3fm3NwxMlVeKDoqXwplTrcZiU/b8bBq0Xhcre3IGTNCfz1my8hR27EzZoz8OXYALe0H19qOoYKNfDuOH15rO4oKNnJtOXGyqoCNXFtOGGJrO5AGcOTesWSQre1QGsCRe8uKM6sM2Mi14/iBtrbjqWAj15YjQ21tR1TBRq7JsZ2tXezPeIsdoF6pdJUFaBS7VuVlcXWoyRxeOvIFHW9o3gZSXUNfoQfTCyaYeB3DoXkSA6cfKT9sOEv7GYyhGw3ou0AKMkbXUJiAzv0Dfbi5LATDfHt3tdiQOny02ODg8bJCbuHRTawTi46Pi881HBsNzhxL3DogNpJnf0X0yjxx4fFo1cIJN178gU5g8WjlI18oNA7dxRofZ19acLyOkbt8HZs/urQj5cd+ZIVZMiiurJuh2uyZ2bXs0THJmYOPvXfJgVCvjtSMRXeEmo46QjTXnlZ0PEvJL23ZXxjE7UVZNv06y1UTZ0C0RjeLOFr0RcQJa57ZMheO223ImjaG9Lm1WczSAWVkxbYCKQM/RydfMMs6aqPBAqlx5wzYqBZChYaGHIjmaYgoOj+A0ovOC2g6ynNUI4giJwQgnOj48KOVreWCtNewUhL6Cg1y9bVEqaFH9xIxyOsTopOA+u16BekteAXf2kKc3mD7rcRbPL2lCL7edoX4Z3/KdoZoQ9bPPKH7N/iOzh8gW6PzB5qO8h+hIRij+yjNLbNonLxVTrTnq90l+2Y53InIrw93NskoTycB0TfuBfRWjubJdzP0BkvnZ55wqbLCj1bY6+QkCnvjvrXOWBYAN0GnMqSrcvS7iZWzZk5svJbUMOTNaC2pWQDU+nlt6KCfk9Z3dDBqfQmHpiOrHsYGfRn/b4cLYnzbdq9rA+3DyX4Kuu+ejZaTuu+wnBIjQfXzeNAOiGBK5Btsnlna22RMHb/f8/+dXCmC6h/wS3hmLbfw3gfnaE9ODCmBW7Lv9enM0mHeS2Fp7cRB3oUVRc592hRcuk57qT3oPVUO0I485t1YUWRfxIUh9Cw56VkPSD/rKVP3HVVFBK+mQitQ29c1LVNm9lNf3OmgG2Zzy8ay/PO6qAhhSpVZQu6Yg5Z1iuZYGcWMpEoN7YcK6DpCRs7grUP13u30SIUm0D0Mdt8sd9+jx9nmib+bccL9tFPXqaetckOPmmBmwKs2aN2OGyHK3j9iUdrPNNfEoyKyB0WEebYDxgtEDr5aH3K43j3PkhuPVtBdtBu8JKD6A5RjdK2WpqP+oAVj3z8MO7v41AQyrD4pMFosUrhsmU4N9nXoURs5TjgBZosbeDS2oMp2+m7NLEtGpjEspK/mgnU2MH6GTWUHqHF6aZFggFdq4NYZlYl14Ed1F4B6QLO1iB7jlx4KhnYOik3tKg8G+zoH3bKwc6JqQw/nOsp/h2lzOgeJQd3c0WJS1wrgjeqcFzGjc5HrHTjnJD7EMgmgnGKZKkyOsdQOdIZ4COzxLHflQ3E7baNVs4qAGoVL0vrCtpoAbwSSa/NSh+jnkVaLMoLDnXqrBUvScPSzSPAw0bC+hK9wTyJZtr60D74yDUfRrBK538I64ikMo6TlltzZFUlef2Fo9kCXvXJvlQmTBVodcEDQBwyww1R+px4RMbHoUQRj2/Yhzkx0vduo25xaYNRvlha96jgri497ThaRvtKOgvDYoD0yaL+dmB4x6xLNxH5CVE1pIss00SkidI8OGPe6Dr7qdR0ed7EEo6xiH7rlzceSKlbd3pxvmJmvoCJpOihIGjVfwxlwtriGxU/MFC/LKzT4cLwh1INFaqCgl1lBlAhzDYSgHCzOGkUHV0StvlCj1vZP5jFRqtT8pCnKwsGmTil6dzmsz91ooYU8PZKhhukJeaPpaCRDTvW7i3o7ZmmB6MCzAfe9tc+hijHKKcY+nK6WdKYWHq3oWHRkPdI6MF7lKZNblh/zJDb6KAwdHyilxt6zz48WZmx4o/tLl8ktcxEmkqc82Ef0f4YhyZBqwDTuwnBZBPKWvfqKbD9UGq96WHRAGBQNEA+JpYXCgGiAW8OhEUUPhsZlNBQaRA+EBpBhcGYoGQSXjvRDoHEsA6CJTg9/hh0/MbwS6HLkfsDbBuPwHvU7NnefeWcyQuaCyPhYGciNjojL2XBnK/sZ7TQRs4c3K/epFekZ6oq+bhz1K1p4QeTcDT6pVrIwWDwec0d19O4eyi+6E5KudKvUdNQqIeWw6zcXI6uxtV6/OQW/9ixjzh7zkCdcdBKTZGQk2l+4GIt+T35WNmlIhXUhJNudC80m9lPXPAduzE6w+4yeWVOYPLM2TU6y1IQWbnRSPVlpHPbwwAswpp7a89zs0lF+08vcyw394mHL1w4x2M9nzkV4HslzfEjPTzQSXHnKhNsK9bB+6eGJUXtwd6BxVOqpgf6XmSP3JjTvFDWGzMKTJvCFp5zs3E70oYXzCddJKZ2bcIHRYLYDzWqjd1RpR3ZJ1rqiB++odo68+bHHvZymbF5RQ8zcw5Ueb7Q4HYN1GMolWtKpSHu1yhBarTIAn6TQPTqHbaLxkjPXCYjGj1XUE4uO1+0zC8c9e+mCGNkP5haNR4bSgqO+nU1IrwMiGnsqgs+RMyccFd1BhlI0ZziuG2TpODfaI0RVFmH2Wx38recOCwdz2UmHQ7YcxS4PW6rVNEwjpbsTZHH0pqymo+5kmcSvhxYUhtq9tURLkbgLLyPh0B4ZrHlKC90IqsRGHQg2ZUsE8zZcXtfRvU6LhLbNUAr04dw5yYdneyQjc5Q1VeB7UHJqNyNH2/JaOpjyklbbvhXJ0fvcGbGr17nz5BytCa5IjzTzBUPvmaYoRcvkHC0frhQdnUmegHF+7bqdvuf8vOZBZxP0V6qXc34Y5ZRab6C2IzJoxgYM+ilIe1kn5s1nbZUPhiyDFfjG6Mu3DdBXnMPqV4mMeNDPW6IqGiBe30eVNOjYQp7F+3D1OGTDPLLw1Wl7eDEXjybnsFiWWyK+q6VKgUZWCZRVnX+CLnCOVsYaQ8sCGmTQBw6mqAjdrccG5nSoLimfkxw941ASu3Hp6zzzjPHFAZMFOVcPP1QGDQfcTcC3bjjAAOI5V0E3ZO35cO9ZvSs8U+hI/KlhxbV7VlvwRtRT4VxF3ZJ1fRtChaKJ7sUpFR01CjrcdS9bngvNeGZNSK9TmDh2PSft3WbQd7BNPOOPjksHgcGkK4XTkLeUY8MQRXdpKFEtKUpY2aFTqpZ8KO1sXx1lhp3DhXOKDBfOGTBcOGfIk66GDZpi97UPM+pZY4Fo6kUwOuJQkPa9oiF0t+iA0C8aIPQ7+cTQI/uXBUEuNT1jpBndwViPeNFFjJVm+tX+KLSrKxlRH3QvkzWGHlXTuQGv2ox1O66+jA99Qfdnfzqb+zdyCzzyMGLGd+VA2ieCavtpTnqk9ntkxE/U7KxfzWZnwhlNaIUxnr42yXiX3uSNgUYzU+P0GM+WFoLJPGgSIKmtTB60SqOvhLs2UybEHQ9Z8vPFnCYRdkaMVmOTVZtYb+r8SOUgASYWGMKBktoi6ogJS9Ye2tF302eCnsx7cpzrhens4gY3TDENGyXDeXhuP4NXB6i5+MwiIQczDdyaj7vw/YzcBaAWr50DPUufeSjM0x0Uz9RzD4a5uoNudUhOVD1fd66jGbvDbh0SLy1LT+eda+nnnJMwpZ8L4Cf1zotb7TNHUdoY4t2aJ7NB7RjSU7o06MPkLjg/Tyeprr9E1Y3u5kKdje7m0nQ0dhgGmtFVI514xqiNenzcRLNkPDmoHDJqoHQoz7yFR7Wcoj+xkLNdyR01RORmuNzvnJPSeeARERajXVazUDSDmFrQz+Yciozv9506PEShedIxDBulQ+LBxKAv0YtmlERd/eBOlFDm6FrxCsqtNmApQUerJJBUvwfNNhFdVYX+IrqqStNR2TIgxIPs//NMc9qnrbUca4uIIXdGs0FaXLktPRac1R7a9xsHVQZ67M29Ms3SUGbZjxNVEnw8GB2o8WrutbDShd01hkAzRn+/8ATZwmlgj45m22GCfUSf0Jkb5GiePf0uV7YCl991ok8Uz266sqZMOR+I/i5bImq/70bHhC4CqrWMGwjZHWv3o0uTnGWRB6mn/ZA1803ZqXnSW+zOFeRNdhGC3Efo18SR5cd+/bRBsHziwRC7R16aPrXEkTtAzdwSPMRPa1jagPLZWr4013NO5D7DRCoCwlTKwWEyRSCaNBjAGHZSceNnmmlCc7J7RYRVdAeMN1gcfLXB4vB4g4XgNrrIDrmnVzPQcvUEe7Yi7W/BMIS+lccB4coOAvoE9czQ8RyQ88vrKU3DJn41u2jYEcQa7MQAXoW1lNZhPRKUWCLeOKtG5NHNYKgP0c1gmo46FlSPy/g2D47Sl/F1HosrMDoZjSx67XZflZ7ROEQGWu8kaGm5Q2SwNH4O57ewNZw7RDSGIp9OHSYaYOUBCZkB8WauPONH0D8MqbSjmnSQOQ3kLc3IhOr1IuN1dLNO4bDvIboPmZCjdajaAkGDMkCsP2UWCtqTAW7pTiYpWnMyLiO9ySC3tCYjtNaZjEspSMMO+tLMkV5bMo6lSI0c8m5OY7JQK0PGtVeFHNEfN0bRnCa8RhnxXeR2tXlyMes5GaK9KLM/UuqylxqkuxqtXCYXubwMIYaFFUeEy8saDchKS5VEz4HmyWWzDt1HkYIOt41VlpSzIZDd2yFCRH3b2CKQ3jMmxIJJ9HnAJBlzhQXRVmmAnQDpUkUjdxItS4DqpjAIKTeUQUptJmnI8C4xSH3tD8LR14lBd7i4C8qaif30V860M0uraCmuvqCsbSwdhbi0mFxQtgIdX1DGHNeQzhDk3ZUdMmTUtxSVye3lYXjVt1Ogz7+EO8yQqZKZ6Ogu148YrzyoluQq43J08xOkj1RGlAVX4PytQcVK0eYS7QlTIJD2m2u3uqvJFe4vJ6Jb9xTxnJ/s7cyy9QQlJxdaMRt8u2eRvsgLPCTQiqMtbzQonsg2158tCk/ox4ebMeh1SBO44fgLHzAPc4jcn4bK8DI2xPeYO0kBEaL8ZQKsdT0v37+Mn8qGwnc1/E2L5Gr0m4+xaPBD3UAPtzZW8GrldBXgq1czG5S7f5KY/qP7rCoPSCeA6HVvh6yRboXfusVaOjRZ0le1LgN4y+45wr3FcwRqW2cwbgWSJtdhaEwHkSZf2cWXyVfZSyvwrbfSLB0MlEjrW4or0NwsWJIRtgdyRZbFCAhLkgYMS5KWNKe4oAE3QgWt2GDaz2pC5G0IL7uhZ/sahhkEqXo9qEHRS88YW78q3XI+JTlSLRtiV5rlguhYsVwC1JkzA23ejeDuiu8TzAg6qRYCcBKrngabLCOOPo8yizjhjaI4LAfWAKPbb9vkq5/LIE16WWMFt2iC+uEkNHcL+TrkaV1/iJ3WR31XPObpDvNNRADdTgBGHS+qoJ6rVxDImJjefGe8HTN1UjxTG602yf9isEoPOoB58lU6XVQlP/hVSGxQ+ZHjeiyeoeLogW01TV5ZyFXy6rsVJPl1re4snYHUhzdWoPXhDU1H8i7IkGBqUOM+tG49qAMkeFZ2uAWF+2ou1uMEncF+fbs9hCE169ewU8g4R89ImtBfw0uUYTV9GjNib3WZvKpnhpbJa2i5pSXETB3d8Ksaz2uSaosN85BX1dKhO73q3axZChq+OSbwFuo0RSqixkoHIV+Rnk7dmwrJvKZUwyFNFvTFkAaQRwox0CrAzWWAL2cOh07VHeOFmEn7HZ4qB2i/1278Cstk9T2mDmFqHaHb2huT/GJRRYi7NJzn4LjlZSqRclw7x8PrwV+kY5yEk3g8kn7lRrOXls2kfS+IRX7tRrNTz+b94ryja7SmVX6HL4tRLs2G/m46Zjccab4LxPjzb+PxRl2H9jTYCAZcFhVnLgmnMw0Yy4mTWG0/lr48/7fFu/r7TiStLhnQF7+X0GLsQjNRFHpBfDYBrVuNoaWZQOaoW0ce6SXXWQZa+9Z0pNQhQwbzMMmMH5HdC1noSf1GUIY4pL9GeEbfTLmF/KrPysFV6L1RB98OZqK0Sjj3xHDzpxqB82Xypza3zpJgT4lZ1p+6F4LTqBdqkj+jEx3QCf7kBUpNm0SWjui4xawRmfynkrXNEz4EBD30bb3ehA572ib6tnRouG8yM18mcnF6Rlz1ZFkSXaNuvOmlLNJ68JiC1uOGpqOByDAkmhTUfs3h1e+6UtyroSn3oI7iCozqwgJcrdqXcB7Ko7ZEGCaq5E3P9JG8qIAsLdPgInlTCuB0TtLcCB+GsGUWwFg3ZF6Od4pXxvWtkbCMGaORcB5zxzvNqFgRf7TlDIXk7Xp7GlPwt6vdaegmb7eNKzD+vn3HuALV9e2WccXMBGa3LIezXTcJGYc6oSoi029MU5nncZsmokZbQ16dDq8ZwHG9RRN4Q9sMJhbzCI8fxjI8fXHZlBl5vLmCgwYHKDYETAUbH7VnVXasGGcFOPdhijKDDF55YIm4bYpmaj/9agumUm+91oGRC1rwgvxgdIhY+sMb+mmMFWzD8eYYhYi6G6RtMA9mm48wT1NkmJYZMEzLDBlNsTKH6PsyVk0KMaID4ag0QxC5Zji62deKjnqWkgypDSiwqzuvoe29XV163V6BUT+C/sg8VmLPJ6AgBt1PGmFVh2ZieJNttIxJfgtv72KWJkvgLMmX4alDIe9ZAryXaR5D+oJRlCtt4uZIpR+skDN6sIIoftrBShkGLiQhOvGNIC4qg9EJRAfAS0VHGVyQIVVpAup03z/pPrZxWD+c+8c+ejQDQxp4u/4MPUTDVYBv+ZqRPS7GwoNa7CswKkbGrroVdowX3XuwJ9Xj5HJF2i8Yr5JvHFvnyTd9WA36xjdZRCbPO2/wrS8cIK2MOmuSI6NOBnVt1FkZNBh1Gldjo04G16szXJmhR0e4JgC1jSdD+qN7xIRbHVhFCRs0visQvfW39fEPtSnPGN/M2adlaT9D1xABoXNwcOgeAGhtCSn1S+VVi28ZqWeWcCM1an0KwBp+8tO+sV4tzJcYVjraj9ezPPkWLeAgtpuWk2hS37pbJ6NRAaITtgg/OmFL+mh2rybmK2z/WFrtX5UG8FtSltJ7Sh4Jm0oWiXeVbLB6s8gi0W6RhfSukEXUzo8F9HkXi/jtHUuZZvT7wLfOqAusAngYDg7PJpNFwK0MwFD3ndEakhGdR0ShbDvdnOYEzKK/vko+I6oLj+HcLr3KcG4U3zL5Fh0rQwWOjpWRPgzqPnBUQW0lwoYRDYwQNToRA/fRiRjQ0s/D79gsABOib2GDDQmK7OEReGQPP0/+7a59v0z+H+SUGTTsMAEA)rN  gzip
decompress	b64decoder8  r  )rN  r(  s     r   _get_glyph_textr+  yK  sC     ??6++NLP P` vx

aP%r   r  c                     | j                         }dd l}|j                  d      }|j                  d|z        }|j                  d      }d}d|z  }|dk(  r|}	|	S |dk(  r|}	|	S |d	k(  r|}	|	S |d
k(  r|}	|	S |}	|	S )Nr   a^  
            <!DOCTYPE html>
            <html>
            <head>
            <style>
            body{background-color:gray}
            div{position:relative;background-color:white;margin:1em auto}
            p{position:absolute;margin:0}
            img{position:absolute}
            </style>
            </head>
            <body>
            zP
            <?xml version="1.0"?>
            <document name="%s">
            a  
            <?xml version="1.0"?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <style>
            body{background-color:gray}
            div{background-color:white;margin:1em;padding:1em}
            p{white-space:pre-wrap}
            </style>
            </head>
            <body>
            r(   z{"document": "%s", "pages": [
r  rX  r  xhtml)r  textwrapdedent)
r  r3   r   r.  r  r  r-  r:   rX  r   s
             r   ConversionHeaderr0  RM  s    		A??  D //  	 C OO  E D,x7DF{ H 
f H 
e H 
g H Hr   c                     | j                         }d}d}d}d}|}|dk(  r|}|S |dk(  r|}|S |dk(  r|}|S |dk(  r|}|S |}|S )	Nr(   z]
}z</body>
</html>
z</document>
r  rX  r  r-  )r  )r  r   r:   rX  r  r  r-  r   s           r   ConversionTrailerr2  M  s    		ADDD
CEF{ H 
f H 
e H 
g H Hr   c                      t         i k(  rQt               D ]D  } | j                  d      r| j                  d      \  }}t	        d|dd z   d      }|t         |<   F t        t         j                               S r'  r	  r  0xNr  r  base)_adobe_unicodesr+  r   rY  r   ru   r  r=   gnameuncrs  s       r   adobe_glyph_namesr<  M  st     "#% 	'Ds#CJE3D3r7N,A%&OE"	' %%'((r   c                      t         i k(  rQt               D ]D  } | j                  d      r| j                  d      \  }}t	        d|dd z   d      }|t         |<   F t        t         j                               S r4  )r8  r+  r   rY  r   ru   r   r9  s       r   adobe_glyph_unicodesr>  M  st     "#% 	'Ds#CJE3D3r7N,A%&OE"	' '')**r   c                     t        |        | j                  j                  st        d      | j                  }|dk7  r| j                  d       |S )zPrepare for annotation insertion on the page.

    Returns:
        Old page rotation value. Temporarily sets rotation to 0 when required.
    r  r   )r&  r   r  r   r  rm  )r   r  s     r   r  r  M  sI     ;;%%==Lq!r   c                     t        | t              sJ t        |t              sJ | |_        || j                  t        |      <   d|_        y)ztClean up after annotation inertion.

    Set ownership flag and store annotation in page annotation dictionary.
    TN)rs   r   r   r   r  r  r   )r   r   s     r   r  r  M  sF     tT"""ue$$$EL"'DRYEMr   c                 4   t        | t              sJ | dk(  s
| dk(  s| dk(  rt        d      S | t        d      k(  s| t        d      k(  s| t        d      k(  rt        d      S | t        d      k\  r(| t        d	      k  r| t        d      z
  t        d
      z   S | S )Nr  i(   i)   rl   ry  	rH  Zr   )rs   r   r  r  s    r   canonrE  M  s    a 	DyAK1;3xCI~c$i1D	>3xCH}c#h3s8|c#h&&Hr   c                 t    t        | t              sJ t        j                  |       \  }}t	        |      }||fS r   )rs   r   rf   r  rE  )r)  r?  rs  s      r   chartocanonrG  M  s8    aq!DAqaAa4Kr   c                    t        j                  | t        d            }t        j                  t        j                  |t        d            t        d            r*t	        t        j                  |t        d            |      syt        j                  | t        d            }|j
                  s	 yt        j                  |      rt	        ||      S t        t        j                  |d      ||      syy)NrH  r	  r&  rI  r   rG  r   )	rf   r   r   rB  string_in_names_listr   rF  dest_is_valid_pager^  )rc  r  page_object_nums
names_listrd  s        r   dest_is_validrM  M  s    Ax}-A""Ax}5  )""Ax}5
 Ax/0A<<  
		a	 #Q
33A&
 r   c                 n    t        j                  |       }|dk(  ryt        |      D ]  }||   |k(  s y yr  )rf   r   r  )r   rK  r(  numr  s        r   rJ  rJ  N  sE    


3
C
ax9 A#% r   c                     t        | t              sJ t        t        |             D ]  }t	        | |d  |      }|||z  }||fc S  y)Nrj  )rs   r   r  r'  match_string)r)  r  r  rM  s       r   r  r  N  sW    a3q6] 1QR5&)?1HCc6M	
 r   c                     ddl } t        t        | j                  dz              j	                  dd      dt        t        | j                  dz        dz        j	                  dd      d} | j
                  d | j                               }| j                  dkD  r
|d	|z   z  }|S | j                  dk  r
|d
|z   z  }|S 	 |S )z'
    "Now" timestamp in PDF Format
    r   Ni  rr   rJ   r   rP  zD:%Y%m%d%H%M%Srk   r  )timer   r  altzonerjuststrftime	localtime)rS  tztstamps      r   r*  r*  N  s     C$%&,,Q4S#$r)+11!S9
B T]]+^T^^-=>F||a#(
 M	 
	#( M 	Mr   c                       e Zd ZdZd Zy)ElementPositionzDConvert a dictionary with element position information to an object.c                      y r   r    r\   s    r   r^   zElementPosition.__init__0N  r_  r   Nr	  r    r   r   r[  r[  -N  s
    Nr   r[  c                      t               S r   )r[  r    r   r   make_story_elposr^  4N  s    r   rL  r  r  c                    || j                   }t        |      }||j                  }||j                  }|j                  |_        |j                  |_        |j                  s|j                  rg S | j                  dd|      d   }g }|D ]k  }t        |d         }|j                  s|j                  r*|d   D ]:  }t        |d         }|j                  s|j                  r*|j                  |       < m |g k(  r|S |j                  d        |j                  d      }	|	j
                  |j                  z
  d	|	j                  z  k  rVt        |j                  |	j
                  |	j                        }
|
j                  s1|
j                  s%|j                  d|
       n|j                  d|	       |g k(  r|S |j                         }|j                  |j                  z
  d	|j                  z  k  rVt        |j                  |j                  |j                        }
|
j                  s|
j                  s|j                  |
       |S |j                  |       |S )
a  Return rectangles of text lines between two points.

    Notes:
        The default of 'start' is top-left of 'clip'. The default of 'stop'
        is bottom-reight of 'clip'.

    Args:
        start: start point_like
        stop: end point_like, must be 'below' start
        clip: consider this rect_like only, default is page rectangle
    Returns:
        List of line bbox intersections with the area established by the
        parameters.
    r   r   )r  r  r/  r   r  c                     | j                   S r   )r  )r   s    r   ri  z)get_highlight_selection.<locals>.<lambda>gN  s
     r   r  r  )r   r   r  r  r  r  r  r	  r	  get_textr6   r"  rL  r  r  insert)r   rL  r  r  r/  r  r  r   r=   bboxfr   bboxls               r   r+  r+  8N  s	     |yy:D}|wwggDGffDG}}((	 ]]ad  F E AfIt}}gJ 	DV%D4==LL			 {	JJ'J( IIaLExx%''S5<<//%((EHH-

ammLLAQ{ IIKEvvC%,,..466588,

ammLLO L 	ULr   c                     t         i k(  rNt               D ]A  }|j                  d      r|j                  d      \  }}t	        |dd d      }|t         |<   C t         j                  | d      S )r'  r	  r  Nr  r  r6  i  )r8  r+  r   rY  r   r   )r   r=   r:  r;  rs  s        r   r  r  N  so     "#% 	'Ds#CJE3CG"%A%&OE"	' tU++r   c                     |j                   |j                   z
  }|j                  |j                  z
  }t        j                  || j                   z  || j                  z  z         S r   r  r  rf   fz_absr9  r   r  dxdys        r   hdistrl  N  H    	
qssB	
qssB<<SUU
R#%%Z/00r   r&  rowsc                    t        |       } | j                  s| j                  rt        d      | j                  }| j
                  |z  }| j                  |z  }|d|df}d|d|f}t        ||j                  |z   |j                  |z         }|g}	t        d|      D ]  }
||z  }|	j                  |        |	g}t        d|      D ]8  }
||
dz
     }	g }|	D ]  }|j                  ||z           |j                  |       : |S )a  Return a list of (rows x cols) equal sized rectangles.

    Notes:
        A utility to fill a given area with table cells of equal size.
    Args:
        rect: rect_like to use as the table area
        rows: number of rows
        cols: number of columns
    Returns:
        A list with <rows> items, where each item is a list of <cols>
        PyMuPDF Rect objects of equal sizes.
    z!rect must be finite and not emptyr   r   )r   r	  r	  r   r  r  r  r  r  r  r6   )r   r&  rn  r  r  r  delta_hdelta_vr   rowr  rectsnrows                r   
make_tableru  N  s    :D}}((<==	B[[4FJJEa"G&!V$GRrttf}-A #C1d^ 	W

1
 EE1d^ AEl 	%AKKG$	%T Lr   c                    t        j                  | j                        }t        j                  |      }t        j                  d      }t        j
                  t        j                  |      t        d      t        d            }t        j                  ||      }t        j                  |      st        j                  ||d      }t        j                  |      }d}t        j                  |      }t        |      D ]4  }	t        j                  t        j                  ||	            }
||
k(  s2d} n |s,t        j                  |t        j                   ||d             yy)zL
    Ensure that widgets with /AA/C JavaScript are in array AcroForm/CO
    r  r  r  rr   r   r   N)rf   r   r   rO  r  r   r  r   r   r.  r  r]  r   r  r^  r0  r@  )r   r   r  
PDFNAME_COacror  r?  rb  r   r  r	  s              r   r
  r
  N  s)    ##EJJ/I

&
&y
1C##D)Jc"VZ D 
		D*	-Bb!%%dJ:BAEI&D1X   !4!4R!;<5=E	
 R!7!7T1!EF r   r  c                     d d fd} |       \  }}	}
}|  |       \  }}	| |      \  }
}||}||}	||}
||}||	|
|fS )a  
    Helper for initialising rectangle classes.
    
    2022-09-02: This is quite different from PyMuPDF's util_make_rect(), which
    uses `goto` in ways that don't easily translate to Python.

    Returns (x0, y0, x1, y1) derived from <args>, then override with p0, p1,
    x0, y0, x1, y1 if they are not None.

    Accepts following forms for <args>:
        () returns all zeros.
        (top-left, bottom-right)
        (top-left, x1, y1)
        (x0, y0, bottom-right)
        (x0, y0, x1, y1)
        (rect)

    Where top-left and bottom-right are (x, y) or something with .x, .y
    members; rect is something with .x0, .y0, .x1, and .y1 members.

    2023-11-18: we now override with p0, p1, x0, y0, x1, y1 if not None.
    c                     t        | t        t        f      rt        |       dk(  r
| d   | d   fS t        | t        t
        j                  t
        j                  f      r| j                  | j                  fS y)Nrr   r   r   rj  )
rs   rt   ru   r'  r  rf   r  rF  r  r  )r  s    r   get_xyzutil_make_rect.<locals>.get_xyN  sZ    sT5M*sCyA~q63q6>!sUEMM5>>BC55#%%<r   c                 p   t        | t              r| S t        | t              r| j                  | j                  fS t        | t
        t        t        j                  t        j                  f      r.| j                  | j                  | j                  | j                  fS t        | t        t        f      s| f} | S r   )rs   ru   r  r  r  r   r\  rf   r(  fz_rectr  r  r  r  rt   rm  s    r   
make_tuplez"util_make_rect.<locals>.make_tupleN  s    q% Hq% 338OT5%,,FG44qttQTT))1tUm,Ar   c                     t              dk(  ryt              dk(  rd   } t        | t        t        f      rt        |       dk(  r| \  }}g ||S t        | t        t        f      r7t        |       dk(  r)| \  }}} |      } |      } |      }g |||}|S  |       } | S t              dk(  r d          d         z   S t              dk(  rB d         \  }}||fdk7  r||d   d   fS  d         \  }	}
|	|
fdk7  r,d   d   |	|
fS t              dk(  rd   d   d   d   fS t	        d       )	Nr   r  r   rr   r   rj  r  r
  )r'  rs   rt   ru   r   )r  r  r  r   r  rs  rN   r  r  r  r  r  r{  r~  s              r   handle_argsz#util_make_rect.<locals>.handle_argsO  s   t9>Y!^q'C3u.39>BxRx3u.39>1aqMqMqM qj1jqj
c"CJY!^47#fd1g&666Y!^T!W%FBBx<'2tAwQ//T!W%FBBx<'AwQR//Y!^7DGT!Wd1g55.tf566r   r    )r  r  r  r  r  r  r  r  ret_x0ret_y0ret_x1ret_y1r{  r~  s         `     @@r   r  r  N  sy    .	7: &1]"FFFF	~	~	~	~	~	~666))r   c           
      ~    t        || |||||d\  }}}	}
d } ||      } ||      } ||	      }	 ||
      }
|||	|
fS )Nr  c                     t        |       }|S r   )r   )r  rN   s     r   convertz util_make_irect.<locals>.convert,O  s    !f
r   )r  )r  r  r  r  r  r  r  r   r  rs  r  r  s               r   r  r  *O  sY    $2"rbQJAq!Q 	
A
A
A
AaA:r   c                 P    t        t        j                  t        |                   S r   )r  rf   rF  r  r  s    r   r  r  6O  s    E//0EFGGr   c                     t         rt        j                  | |      S t        t	        j
                  t        |       t        |                  S r   )r   r   r  r'  rf   r`  r  r  )r   r  s     r   r  r  :O  s<    (($77522?43HJ[\bJcdeer   c                 d    t        t        j                  t        |       t        |                  S r   )r'  rf   rE  r  r  r  s     r   r  r  @O  s-    #### r   c                 R    t        j                  t        |       t        |            S r   )rf   fz_is_point_inside_rectrA
  r  )rd  r   s     r   r  r  IO  s%    (( #" r   c                 d    t        t        j                  t        |       t	        |                  S r   )r'  rf   r  r  rA
  )r   rd  s     r   r  r  OO  s-    **" # r   c                 Z    t        |       }t        |      }t        j                  ||      S r   )rA
  rf
  rf   fz_is_point_inside_quad)r  r   rd  ri
  s       r   rs  rs  XO  s)    AA((A..r   c                 d    t        t        j                  t        |       t	        |                  S r   )r  rf   r  rA
  r  )r  r  s     r   rd  rd  ^O  s-    $$ '!&) r   c                 d    t        t        j                  t        |       t        |                  S r   )r'  rf   r!  r  r  s     r   r  r  gO  s-    ## r   c                 d    t        t        j                  t        |       t        |                  S r   )r1  rf   r  r  )rX	  rq	  s     r   rt	  rt	  pO  s+    OO!"%!"% r   c                 4   	 t'        |       }|j                  }||j                  z  |j                  |j                  z  z
  }|t         j"                  j$                   k  s|t         j"                  j$                  kD  rt        j                         }d|z  }|j                  |z  |_        |j                   |z  |_        |j                   |z  |_	        ||z  |_
        |j                   |j                  z  |j                  |j                  z  z
  }|j                   |j                  z  |j                  |j                  z  z
  |_        ||_        d|j                  |j                  |j                  |j                  |j                  |j                  ffS y)Nr   r   )r   r    )rs   ru   rt   rf   r2  ru  r5  r   r  rs  r  r   r  r   rU
  r  rt  
float_infoepsilonr  )r  rN   r  r   detr	  rdets          r   ro	  ro	  yO  s3   ( F
#CA
cee)ceeceem
#C
cnn$$$$cnn.D.D(Dnn3wDUUFSUUNSUUSUU]*.355#%%suucee<<<r   c                    t        j                  |      }d}d}|t        |       k  rt        j                  | |d        \  }}||z  }|t         j                  k(  rt        j
                  |      }n>|t         j                  k(  rt        j                  |      }nt        j                  |      }|dk  rd}t        j                  ||      }	t        j                  ||	d      }
||
z  }|t        |       k  r||z  }|S )Nr   r/  )rf   rL  r'  r  PDF_SIMPLE_ENCODING_GREEKfz_iso8859_7_from_unicodePDF_SIMPLE_ENCODING_CYRILLICfz_windows_1251_from_unicodefz_windows_1252_from_unicoder`  ra  )r:   r   r   r  r)  r   r  r   rs  r	  r  rN   s               r   r3  r3  O  s    ##H-D	A
C
D	/""4:.1qu666//2A;;;2215A2215Aq5A%%dA.##D!Q/	R D	/ h,CJr   c                 r   t        |       }t        |      }t        |      }t        j                  t        j                  |j                  |j                  z
  |j
                  |j
                  z
              }t        j                  dddd|j                   |j
                         }t        j                  |j                  |j
                   |j
                  |j                  dd      }t        j                  ||      }t        j                  ||      }t        j                  |      }|j
                  S )Nr   r   )	rA
  rf   rw  r  r  r  r  r  r  )	r  r  r   rs  rd  ri
  r)  rX	  rq	  s	            r   r  r  O  s    AAA!!%"5"5accACCiqss"KLA			aAq133$	5B			accACC4acc1a	8B	R	 B  B'A!!!$A33Jr   c                     t        |       }t        |      }t        j                  t        j                  |j                  |j                  z
  |j
                  |j
                  z
              }t        j                  dddd|j                   |j
                         }t        j                  |j                  |j
                   |j
                  |j                  dd      }t        t        j                  ||            S )z
    Return the matrix that maps two points C, P to the x-axis such that
    C -> (0,0) and the image of P have the same distance.
    r   r   )	rA
  rf   rw  r  r  r  r  r1  r  )r  r  rs  rd  r)  rX	  rq	  s          r   r  r  O  s    
 	AA 	!!%"5"5accACCiqss"KLA			aAq133$	5B			accACC4acc1a	8BU__R455r   c                    d}d}|}t        | |d        \  }}||z  }t        ||d        \  }}||z  }||k(  r|}|t        d      k(  r'	 t        | |d        \  }}||z  }|t        d      k7  rn&t        | |d        \  }}||z  }|t        d      k(  r'	 t        ||d        \  }}||z  }|t        d      k7  rn&t        ||d        \  }}||z  }||k(  r|dk7  rd S |S )Nr   rl   )rG  r  )	h0rX
  r  r?  r   rp  hcdelta_nncs	            r   rQ  rQ  O  s-   	A	A	Abf%KGRLAbf%KGRLA
(S>)"QR&1WS>	  &bf-KGRLAS>)"QR&1WS>	  &bf-KGRLA' (( 74!!r   c                    | sJ t        |t        j                        sJ t        |t        j                        sJ |j                  j
                  | j                  z  }|j                  j
                  | j                  z  }t        ||      }| j                  dkD  r?| j                  | j                  dz
     }t        |      }	 t        |j                  j                  |j                  |j                        |k  rt!        |j                  j                  |j                  |j                        |k  rt        |j                  j                  |j"                  |j$                        |k  rot!        |j                  j                  |j"                  |j$                        |k  r7|j"                  |_        |j                  |_        | j                  d   |k(  sJ y | j                  j'                  |       | xj                  dz  c_	        y r  )rs   rf   r  r  r   rz  r  r  r  r'  r
  rf
  rl  r9  r  r  vdistr  rw  r6   )r  r=   r  r  r  ch_quadr  rM  s           r   r  r  O  sy   K4dE--...b%++,,,MM+EMM+E4$Gxx!|zz$((Q,'d#$//--svvwzzBUJ$//--svvwzzBUJ$//--svvwzzBUJ$//--svvwzzBUJZZCFZZCF::b>S(((JJgHHMHr   c                 r   t         rt        j                  | |||||||      S t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d	      g	}t	        j
                  ||      }	t	        j                  | d
      }
t	        j                  |
t        d      t        d             t        t        |            D ]`  }t	        j                  |	||         }|j                  s)t	        j                  |
||   t	        j                  |j                  |             b |rt	        j                  |	t        d            }t	        j                  |      }|dkD  rt	        j                   |
t        d      |      }t        |      D ]  }t	        j"                  ||      }|j                  rt	        j$                  |      s<t	        j&                  |d      j                  r]t	        j                  |t        d            }t	        j(                  |t        d            rt	        j(                  |t        d            rt	        j(                  |t        d            rt	        j*                  d       t	        j(                  |t        d            rt	        j,                  |t        d             t	        j,                  |t        d             t	        j                  |j                  |      }t	        j.                  | t	        j0                  |      d      }t	        j2                  ||        |dk7  r t	        j4                  |
t        d      |       t	        j6                  | |
      }t	        j8                  | ||       y)z
    Deep-copies a source page to the target.
    Modified version of function of pdfmerge.c: we also copy annotations, but
    we skip some subtypes. In addition we rotate output.
    r  r   r@  r  r  r  r  r   UserUnitr  ru  r   rX  r   r  r=  r	  rW  r  zskipping widget annotationr  rY  N)r   r   r-  r   rf   r  r  r  r  r'  r  r   r  r   r   r]  r  r^  r:  r   rB  r  r   r@  r   r0  r  rv  r  )r.  r/  	page_frompage_tor  r  copy_annotsr3  known_page_objspage_refr  r  r   r  r?  r  rc  rI  r  r   r
  s                        r   r-  r-  P  s    '9gvuVaclmm 	

O (()<H ""7A.I	y(6"2HV4DE C() s,,h8JK>>	?1+=u?\?\]f]k]kmp?qr	s ''8H3EF
,q5119hx>PRSTJ1X 9''Q7||5+<+<Q+?&&51<<,,a)1DE$$gx/?@$$gx/@A$$gx/ABMM#?@$$Whx.@A""Ax'89""Ax}566	J..9I9I69RTUV$$j%8)9. |	8H+=vF



3C 
7GS1r   c                 :    t        |       \  }}t        dd||      S )zReturn a Rect for the paper size indicated in string 's'. Must conform to the argument of method 'PaperSize', which will be invoked.
    rU  )
paper_sizer   )r)  r  r  s      r   
paper_rectr  VP  s"     qMME6S%((r   c                     | j                         }d}|j                  d      rd}|dd }|j                  d      r|dd }t               j                  |d      }|dk(  r|S |d   |d	   fS )
zReturn a tuple (width, height) for a given paper format string.

    Notes:
        'A4-L' will return (842, 595), the values for A4 landscape.
        Suffix '-P' and no suffix return the portrait tuple.
    rd  z-lr  Nr  z-pr  r   r   )r  r  paper_sizesr   )r)  rz  r  rh   s       r   r  r  ]P  sy     779DA}}TCRy}}TCRy			4	*BCx	qE2a5>r   c                      i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdO
S )Pa6  Known paper formats @ 72 dpi as a dictionary. Key is the format string
    like "a4" for ISO-A4. Value is the tuple (width, height).

    Information taken from the following web sites:
    www.din-formate.de
    www.din-formate.info/amerikanische-formate.html
    www.directtools.de/wissen/normen/iso.htm
    a0)P	  i*  a1)  r  a10)ra  r  a2)  r  a3)rl  r  a4)rk  rl  a5)  rk  a6)*  r  a7)r  r  a8)   r  a9)r  r  b0)  i  b1)  r  b10)rs  r  b2)  r  b3)  r  b4)  r  b5)  r  b6)b  r  r  )r  r  b8)r  r  b9)r  r  c0)'
  i]  c1)-  r  c10)rh  r  c2)  r  c3)  r  c4)  r  c5)  r  c6)C  r  c7)r  r  c8)r  r  c9)r  r  zcard-4x6)i   i  )rk  i  )i)  i  )i
  i  )i  r&  )r'  i  )r&  i  )r&  i  )r&  r'  )i  i  )i`  i  )
zcard-5x7
commercial	executiveinvoiceledgerlegalzlegal-13lettermonarchztabloid-extrar    r    r   r   r  r  qP  s   -
l-
l-
 	y-
 	l	-

 	k-
 	j-
 	j-
 	j-
 	j-
 	j-
 	j-
 	l-
 	l-
 	y-
 	l-
  	l!-
" 	k#-
$ 	j%-
& 	j'-
( 	j)-
* 	j+-
, 	j--
. 	l/-
0 	l1-
2 	y3-
4 	l5-
6 	k7-
8 	j9-
: 	j;-
< 	j=-
> 	j?-
@ 	jA-
B 	jC-
D 	JE-
F  $Y-
 -
r   rT  c                 .    t        j                  | |      S r   )rf   r  )r   r  s     r   r  r  P  s    ((f55r   c                    t        |t        j                        sJ t        |t              rt	        |      dk(  sJ t        |t              rt	        |      dk(  sJ t        |t              r+t	        |      dk(  rt        |d   t        j                        sJ d }g }	 	 t        j
                  |t        d            }t        j                  |      }|dk(  rt        d      |j                  |       t        j                  |      rt        d      t        |      D ]  }	t        j                  ||	      }
t        j
                  |
t        d            }|j                  r t        j                  |t        d            }nUt        j
                  |
t        d            j                  xr* t        j
                  |
t        d            j                   }|r9t        j                  |
t        d	            }|d   |k  r|
} n|dxx   |z  cc<   |j                  r!t        j                  |t        d
             }n*t        j
                  |
t        d            j                   }|r,t        j                   dt        j"                  |       d       |d   dk(  r||d<   |	|d<   |
} n|dxx   dz  cc<    ||j                  	|k  sn6	 t        t	        |      dd      D ]  }	t        j$                  ||	dz
             |S # t        t	        |      dd      D ]  }	t        j$                  ||	dz
             w xY w)Nr   r   rj  zmalformed page treezcycle in page treeru  Pagesr@  rF  r   znon-page object in page tree (rj  rY  )rs   rf   r  rt   r'  r   r   r]  r   r6   r  r  r^  r   rB  r  r  r9  r  )r   rp  skipparentpindexphitr0   ro  r=  r  kidr  r   rO  s                 r   pdf_lookup_page_loc_impr  P  s   $---$%#d)q.88&$'CK1,<<<'4(S\Q->:gVWjZ_ZfZfCggg7	2))$0@A**D119#$9:: T"%%t,#%9::t )A--tQ7C!..Xf5EFE''!--uhw6GH !& 2 2C&9I J U U !b(-(:(:C*AU(V(a(a$a   % 6 6Xg=N O GeO#&D! Gu,G ++$)$5$5uhv>N$O OA$)$6$6Xj=Q$R$]$] ]A!MM-KEL]L]_dLeKffg+hi7a<)-GAJ()F1I"%C! GqLG=)J (>AHg f 3u:q"- 2$$eAaCj12 
 3u:q"- 2$$eAaCj12s   H7L 8Mc                    t        j                  t        j                  |       t        d            }t        j                  |t        d            }|g}|j                  st        d      t        j                         g}dg}t        | ||||      }|d   }|d   }|d   }|j                  st        d|z  dz         |||fS )zA
        Copy of MuPDF's internal pdf_lookup_page_loc().
        r  r  zcannot find page treer   z cannot find page %d in page treer   )rf   r   r  r   r   r   r  r  )r   r  r  rp  r  r  r  r  s           r   r  r  P  s     !!5#4#4c#:HV<LM!!4'):;x344<<>"%c4wGAw!*~~>GIJJGV##r   c                     J d       )zH
    Returns description of mupdf.PdfObj (wrapper for pdf_obj) <o>.
    zuse mupdf.pdf_debug_obj() ?)rf   r.  r]  r  r^  pdfobj_stringrb  array_get_boolr:  r;  r=  r   pdf_is_embedded_fileembedded_file_namer  rD  r   rV  rr  r9  rC  rE  r  r   rF  r8  )rc  prefixrN   r  r  oor  ry   s           r   r  r  Q  s     ,++1r   c                    |j                   d   sy| j                  }| j                         }|D cg c]A  }|d   |j                  k(  r-|d   j	                  d      r|d   j	                  d      r|d   C }}|g k(  ryt        |      }t        t        |j                  d	      d
z              }|D ]4  }t        j                  |||      rt        d|j                  |fz         6 yc c}w )a  Repair character spacing for mono fonts.

    Notes:
        Some mono-spaced fonts are displayed with a too large character
        distance, e.g. "a b c" instead of "abc". This utility adds an entry
        "/W[0 65535 w]" to the descendent font(s) of font. The float w is
        taken to be the width of 0x20 (space).
        This should enforce viewers to use 'w' as the character width.

    Args:
        page: pymupdf.Page object.
        font: pymupdf.Font object.
    r  Nr   r  ri  r
   r  r   r   i  z$Cannot set width for '%s' in xref %i)r  r   r  r   r   r!  r   rP	  r  r   set_font_widthr>   )r   r)  r   r   r  r  r  r   s           r   r  r  8Q  s     ::f
++C~~H aDDII!A$//#"61Q4??:;V 	
!E 
 {JEt))"-467E L##Cu56$))T9JJKLs   AC*srgbc                 F    t        |       }|d   dz  |d   dz  |d   dz  fS )a  Convert sRGB color code to a PDF color triple.

    There is **no error checking** for performance reasons!

    Args:
        srgb: (int) RRGGBB (red, green, blue), each color in range(255).
    Returns:
        Tuple (red, green, blue) each item in intervall 0 <= item <= 1.
    r   g     o@r   rr   )r  )r  r   s     r   sRGB_to_pdfr  XQ  s3     	DAQ4%<1qte|33r   c                 H    | dz	  }| |dz  z
  dz	  }| |dz  z
  |dz  z
  }|||fS )a  Convert sRGB color code to an RGB color triple.

    There is **no error checking** for performance reasons!

    Args:
        srgb: (int) RRGGBB (red, green, blue), each color in range(255).
    Returns:
        Tuple (red, green, blue) each item in intervall 0 <= item <= 255.
    r  rN	  r    )r  r   r	  r  s       r   r  r  fQ  sC     	
A	b	aARAF#Aq!9r   c                     |rt        j                  |      nd}t        j                  |       }t        d|d      D ]0  }t        j                  t        j                  ||            |k(  s0 y y)Nr   rr   r   )rf   r]  r   r  r^  )rd  rL  r?  str_r  s        r   rI  rI  vQ  se    ,6Z(AA##Q'D1a^ ##U%8%8*a%HITQ r   c                 L   d}d}|}d}|j                   rt        | ||||      }	t        ||||      s)|	dk(  rt        j                  |t        d            }
|
j                   s,|j                   rt        j                  |t        d             nl|j                   rAt        j                  |t        d      |
       t        j                  |
t        d      |       nt        j                  |
t        d             |
}nt        j                  |t        d             t        j                  |t        d             t        j                  |t        d            }n6|r|j                   s|}|}t        j                  |t        d            }|dz  }|j                   r|||fS )z'
    Returns (count, first, prev).
    Nr   rS  PrevrG  rH  r   )r   strip_outlinesrM  rf   r   r   r   r  )r   outlinesr  rK  rL  r  rO  currentr  r  r  s              r   strip_outliner  Q  sk    EEGD


 C*6F
SWj2BJOQw ))'8F3CD**4&1AB__&&tXf-=tD&&tXf-=tD&&tXf-=> ""7HV,<=""7HSM:,,Whv6FG  0 0D(((62BCGQJE? 

B %r   c                    |j                   syt        j                  |t        d            }|j                   sd}nt	        | ||||      \  }}}|dk(  r_t        j
                  |t        d             t        j
                  |t        d             t        j
                  |t        d             |S t        j                  t        j                  |t        d                  }t        j                  |t        d      |       t        j                  |t        d             t        j                  |t        d      t        j                  |dkD  r|n|              |S )Nr   r  LastrF  )	r   rf   r   r   r  r   r   r  r  )	r   r  r  rK  rL  r  r  last	old_counts	            r   r  r  Q  s"   x'):;E'UJ@PR\]E4	Qw8Xg%678Xf%568Xg%67 I	 $$U%7%7(7BS%TU	8Xg%6>8Xf%5t<8Xg%68I8IPY\]P]"dfcf8ghIr   r  c                 
   t         i k(  ret               D ]X  }|j                  d      r|j                  d      \  }}|j                         }|D ]  }t	        |dd d      }|t         |<    Z t         j                  | d      S )r'  r	  r  Nr  r  r6  z.notdef)_adobe_glyphsr+  r   rY  r   r   )r  r=   r   r;  unclrs  s         r   r  r  Q  s     #% 	(Ds#

3ID#99;D (BQb)#'a (	( R++r   c                     |j                   |j                   z
  }|j                  |j                  z
  }t        j                  || j                  z  || j                   z  z         S r   rg  ri  s        r   r  r  Q  rm  r   r    single)	pagefn_argspagefn_kwargsinitfninitfn_argsinitfn_kwargsr  r  concurrency_statsc       	         2   |
rt        j                          }|dk(  rE|r ||i | t               }t        |       }|D ]  } ||g|i |}|j                  |       ! nddlm} |q|
rt        j                          }t        |       5 }t        |      }t        t        |            }ddd       |
r&t        j                          z
  }t        |dd       |
rt        j                          }|dk(  r|j                  | ||||||||	|

      }n+|dk(  r|j                  | ||||||||	|

      }nJ d	|d
       |
r&t        j                          z
  }t        |dd       |
r&t        j                          z
  }t        |dd       |S # 1 sw Y   xY w)a  
    Returns list of results from `pagefn()`, optionally using concurrency for
    speed.
    
    Args:
        path:
            Path of document.
        pagefn:
            Function to call for each page; is passed (page, *pagefn_args,
            **pagefn_kwargs). Return value is added to list that we return. If
            `method` is not 'single', must be a top-level function - nested
            functions don't work with concurrency.
        pagefn_args
        pagefn_kwargs:
            Additional args to pass to `pagefn`. Must be picklable.
        initfn:
            If true, called once in each worker process; is passed
            (*initfn_args, **initfn_kwargs).
        initfn_args
        initfn_kwargs:
            Args to pass to initfn. Must be picklable.
        pages:
            List of page numbers to process, or None to include all pages.
        method:
            'single'
                Do not use concurrency.
            'mp'
                Operate concurrently using Python's `multiprocessing` module.
            'fork'
                 Operate concurrently using custom implementation with
                 `os.fork()`. Does not work on Windows.
        concurrency:
            Number of worker processes to use when operating concurrently. If
            None, we use the number of available CPUs.
        _stats:
            Internal, may change or be removed. If true, we output simple
            timing diagnostics.
    
    Note: We require a file path rather than a Document, because Document
    instances do not work properly after a fork - internal file descriptor
    offsets are shared between the parent and child processes.
    r  r   )_apply_pagesNz.2fzs: count pages.r  forkzUnrecognised method=rm   zs: work.z	s: total.)rS  rt   r   r6   r(   r!  r'  r  r>   _multiprocessing_fork)r1   r  r  r  r  r  r  r  r  r  r  t0rN   r   r   r   r!  r   	num_pagess                      r   apply_pagesr'  Q  s   p YY[K1=1fD> 	Dt;k;];AJJqM	 	#=IIK$ /8M	U9-./ IIK!Oqg_-.		AT>//!!C v$$!!C 1-fYa001		aA1S'"#IIK"qgY Ja/ /s   
 FF)
r  r  r  optionr  r  r  r"  rv  r  c       
   	      d    t        ||||||	      }t        | t        j                  |||||
      S )ag  
    Returns list of results from `Page.get_text()`, optionally using
    concurrency for speed.
    
    Args:
        path:
            Path of document.
        pages:
            List of page numbers to process, or None to include all pages.
        method:
            'single'
                Do not use concurrency.
            'mp'
                Operate concurrently using Python's `multiprocessing` module.
            'fork'
                 Operate concurrently using custom implementation with
                 `os.fork`. Does not work on Windows.
        concurrency:
            Number of worker processes to use when operating concurrently. If
            None, we use the number of available CPUs.
        option
        clip
        flags
        textpage
        sort
        delimiters:
            Passed to internal calls to `Page.get_text()`.
    )r(  r  r  r  r"  rv  )r  r  r  r  r  )r   r'  r   ra  )r1   r  r  r  r(  r  r  r  r"  rv  r  	args_dicts               r   ra  ra  \R  sI    X !I MM## r   c                      e Zd ZdZd Zed        Zed        Zed-d       Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zd Zed        Zed        Zed.d       Zed/d       Zed/d       Zed        Zed-d       Zed        Z ed        Z!ed/d        Z"ed!        Z#ed"        Z$ed.d#       Z%ed/d$       Z&ed/d%       Z'ed/d&       Z(ed'        Z)ed(        Z*ed)        Z+ed*        Z,ed/d+       Z-d,Z. e/       Z0y)0r   zU
    We use @staticmethod to avoid the need to create an instance of this class.
    c                     t        | t        j                        rt        t	        |             S t        t        j
                               S r   )rs   rf   r   r1  r  r2  r   s    r   _derotate_matrixzTOOLS._derotate_matrixR  s3    dEMM*$%<T%BCC$U^^%566r   c                    t        | |      }t        | j                        |_        | j                  |_        | j                  |_        | |_        |j                  sd |_        |j                  sd |_        |j                  sd |_        |j                  sd |_	        |j                  sd |_
        |j                  sd |_        |j                  sd |_        |S r   )r|  r   r   r   r   r	  r  r	  r	  r	  r	  r	  r	  )r   r  r   s      r   r  zTOOLS._fill_widgetR  s    &uf55::&jj}} FM###'F ###'F ###'F !!!%F!!!%F"""&F
r   c                     t        j                  | j                        } t        | j	                               }t        |      }|S r   )rf   r   r   r  r   r   )r   r   r  s      r   r*  zTOOLS._get_all_contentsR  s5    **4995txxz*!3'r   c                     | j                         }t        |       t        |      }t        |j	                         |j                         ||      }|S )zDAdd bytes as a new /Contents object for a page, and return its xref.)rB
  r  r   r
  r   r   )r   r  r
  rb  contbufr   s         r   r  zTOOLS._insert_contentsR  sC     .."7$W-!'++-Qr   c                    | j                   d   }| j                  d   }|sd}dj                  t        t        |            dz   }|r|}n| j                  d   }|sd}dj                  t        t        |            dz   }|}	|}
t        t        |	|
            }| }|	|z  }|
|z  }d	| j                  cxk  rd
k  rn nd}nd}||||||||fS )as  Get common parameters for making annot line end symbols.

        Returns:
            m: matrix that maps p1, p2 to points L, P on the x-axis
            im: its inverse
            L, P: transformed p1, p2
            w: line width
            scol: stroke color string
            fcol: fill color store_shrink
            opacity: opacity string (gs command)
        r  r  r	  rl   z RG
r   r=  z rg
r   r   r  r(   )rI  r   r  r  r   r5  r  r  )r   r  r  r  r   scscolr~  r  np1np2rA  r  r  r  r  s                   r   _le_annot_parmszTOOLS._le_annot_parmsR  s     LL!\\(#BxxC%/Bf%BBxxC%/?3,-R!G!G!!GG"aAtT722r   c                 R   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r|n|}|d| dz  fz   |z  }|d|dz  fz   |z  }d||j                  |j                  fz  }|d|j                  |j                  fz  z  }|t        |	      dz   z  }||
dz   z  }|S )	zaMake stream commands for butt line end symbol. "lr" denotes left (False) or right point.
        r   r   r          @
q
%s%f %f m
%f %f l
rV  s
Q
r   r7  r  r  r  rv   )r   r  r  r  r  rA  r  r  r  r   r4  r  r  rq  r  r  rz  botr   s                      r   r  zTOOLS._le_buttR  s     /4.C.CE2rS].^+2q!QdGC1IAAr"u:~#Aqt9}"7CEE355"99
kSUUCEEN**
ilV##
dXo	r   c                    t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz
  n	||dz  dfz   }t        ||      | | ||fz   }d|z   t         j	                  |j
                  |z  |j                  |z  |j                  |z  |j                  |z        z   }|t        |	      dz   z  }||
|z   dz   z  }|S )zcMake stream commands for circle line end symbol. "lr" denotes left (False) or right point.
              @r   r9  r   zq
rV  b
Q
)
r   r7  r  r   _oval_stringr  r  r  r  rv   )r   r  r  r  r  rA  r  r  r  r   r4  r  r  rq  r  r  r   r   s                     r   r  zTOOLS._le_circleS  s     /4.C.CE2rS].^+2q!QdGC1IA2q	MQ!B$]AJ1"qb!Q'W_u11!$$)QTTBYr	STSWSWZ\S\]]
ilV##
dTkH$$	r   c                    t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz   n	||dz  dfz
  }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d||j                  |j                  fz  }|d|j                  |j                  fz  z  }|d|j                  |j                  fz  z  }|t        |	      d	z   z  }||
|z   d
z   z  }|S )ziMake stream commands for closed arrow line end symbol. "lr" denotes left (False) or right point.
        r@  r   r9  r   r  rr   r:  r;  rV  rA  r=  r   r  r  r  r  rA  r  r  r  r   r4  r  r  rq  r  r  r   s                    r   r  zTOOLS._le_closedarrowS  s=    /4.C.CE2rS].^+2q!QdGC1I Q!B$]a1R4)m "R2a4!*_acA2Y!R2a4)^rQqS!H}
b
b
b7BDD"$$"77
kRTT244L((
kRTT244L((
ilV##
dTkH$$	r   c                 D   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz
  n	||dz  dfz   }t        ||      | | ||fz   }|j                  |j
                  |j                  z
  dz  z   |z  }d||j                  |j                  fz  }|j                  |j                  |j                  z
  dz  z   |z  }|d|j                  |j                  fz  z  }|j                  |j                  |j                  z
  dz  z   |z  }|d|j                  |j                  fz  z  }|j                  |j
                  |j                  z
  dz  z   |z  }|d|j                  |j                  fz  z  }|t        |	      dz   z  }||
|z   d	z   z  }|S )
zdMake stream commands for diamond line end symbol. "lr" denotes left (False) or right point.
        r@  r   r9  r   r$  q
%s%f %f m
r;  rV  rA  )r   r7  r  r   r  r  r  r  r  r  rv   r   r  r  r  r  rA  r  r  r  r   r4  r  r  rq  r  r  r   rd  r   s                      r   r  zTOOLS._le_diamond(S  s    /4.C.CE2rS].^+2q!QdGC1IA2q	MQ!B$]AJ1"qb!Q'TTQTTADD[C''2-!##qss 33TTQTTADD[C''2-
kqssACCj((TTQTTADD[C''2-
kqssACCj((TTQTTADD[C''2-
kqssACCj((
ilV##
dTkH$$	r   c                    t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz   n	||dz  dfz
  }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d||j                  |j                  fz  }|d|j                  |j                  fz  z  }|d|j                  |j                  fz  z  }|t        |	      d	z   z  }||
d
z   z  }|S )zgMake stream commands for open arrow line end symbol. "lr" denotes left (False) or right point.
        r@  r   r9  r   r  rr   r:  r;  rV  S
Q
r=  rD  s                    r   r  zTOOLS._le_openarrow>S  s8    /4.C.CE2rS].^+2q!QdGC1I Q!B$]a1R4)m "R2a4!*_acA2Y!R2a4)^rQqS!H}
b
b
b7BDD"$$"77
kRTT244L((
kRTT244L((
ilV##
dXo	r   c                    t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
|d|z  dfz
  n	|d|z  dfz   }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d||j                  |j                  fz  }|d|j                  |j                  fz  z  }|d|j                  |j                  fz  z  }|t        |	      dz   z  }||
|z   d	z   z  }|S )
zoMake stream commands for right closed arrow line end symbol. "lr" denotes left (False) or right point.
        r@  r   rr   r   r  r:  r;  rV  rA  r=  rD  s                    r   r  zTOOLS._le_rclosedarrowRS  s=    /4.C.CE2rS].^+2q!QdGC1IQ!A#q\Q!A#q\!R1Q3)^rRTA2J R1Q3(]bBqD!9n
b
b
b7BDD"$$"77
kRTT244L((
kRTT244L((
ilV##
dTkH$$	r   c                    t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz
  n	||dz  dfz   }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d||j                  |j                  fz  }|d|j                  |j                  fz  z  }|d|j                  |j                  fz  z  }|t        |	      d	z   z  }||
|z   d
z   z  }|S )zmMake stream commands for right open arrow line end symbol. "lr" denotes left (False) or right point.
        r@  r   g      @r   rr   r  r:  r;  rV  rI  r=  rD  s                    r   r  zTOOLS._le_ropenarrowfS  s=    /4.C.CE2rS].^+2q!QdGC1I Q!B$]a1R4)m!R1Q3)^rRTA2J R1Q3(]bBqD!9n
b
b
b7BDD"$$"77
kRTT244L((
kRTT244L((
ilV##
dTkH$$	r   c                    t         j                  | |||      \  }}}}}	}
}}dt        d|	      z  dz  }|r|n|}t        |j                  |z
  |j
                  d|	z  z
  |j                  |z   |j
                  d|	z  z         }|j                  |z  }|j                  |z  }d||j                  |j
                  fz  }|d|j                  |j
                  fz  z  }|t        |	      dz   z  }||
dz   z  }|S )	zbMake stream commands for slash line end symbol. "lr" denotes left (False) or right point.
        g(y?r   rV  rr   r:  r;  rV  r<  )	r   r7  r  r   r  r  r  r  rv   )r   r  r  r  r  rA  r  r  r  r   r4  r  r  rwr  r   rz  r>  r   s                      r   r  zTOOLS._le_slashzS  s     /4.C.CE2rS].^+2q!QdGc!Qi#%Ar133Q;b!##A+>ddRiddRi7CEE355"99
kSUUCEEN**
ilV##
dXo	r   c                 \   t         j                  | |||      \  }}}}}	}
}}d}|t        d|	      z  }|r
||dz  dfz
  n	||dz  dfz   }t        ||      | | ||fz   }|j                  |z  }d||j
                  |j                  fz  }|j                  |z  }|d|j
                  |j                  fz  z  }|j                  |z  }|d|j
                  |j                  fz  z  }|j                  |z  }|d|j
                  |j                  fz  z  }|t        |	      dz   z  }||
|z   dz   z  }|S )	zcMake stream commands for square line end symbol. "lr" denotes left (False) or right point.
        r@  r   r9  r   rF  r;  rV  rA  )r   r7  r  r   r  r  r  r  r  r  rv   rG  s                      r   r  zTOOLS._le_squareS  sG    /4.C.CE2rS].^+2q!QdGC1IA2q	MQ!B$]AJ1"qb!Q'DD2I!##qss 33DD2I
kqssACCj((DD2I
kqssACCj((DD2I
kqssACCj((
ilV##
dTkH$$	r   c                    d }d}| || z
  dz  z   }| || z
  dz  z   }|||z
  dz  z   }|||z
  dz  z   }	|| |z
  |z  z   }
|| |z
  |z  z   }|||z
  |z  z   }|||z
  |z  z   }|||z
  |z  z   }|	||	z
  |z  z   }|	||	z
  |z  z   }|||z
  |z  z   }d|j                   |j                  fz  }| ||
||      z  }| ||||      z  }| ||||	      z  }| ||||      z  }|S )zQReturn /AP string defining an oval within a 4-polygon provided as points
        c                     d}|| j                   | j                  |j                   |j                  |j                   |j                  fz  S )Nz%f %f %f %f %f %f c
rA  )rd  ri
  r   r  s       r   bezierz"TOOLS._oval_string.<locals>.bezierS  s7    'AQSS!##qssACC555r   r  r$  z%f %f m
rA  )r  r  r  r  rQ  r  r'  mor&  muol1ol2or1or2ur1ur2ul1ul2r   s                      r   rB  zTOOLS._oval_stringS  sU   	6 27c/!27c/!27c/!27c/!BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BDD"$$<'
fS#r""
fS#r""
fS#r""
fS#r""	r   c                    t         r t        j                  | j                        }nd } ||       }|syd}d}d}|j	                         }t        |      D ]  \  }}|dk(  r2||dz
     dd  }t        ||dz
           }d	x||<   x||dz
  <   ||dz
  <   =|d
k(  r t        ||dz
           g}d	x||<   ||dz
  <   b|dk(  r<||dz
  | D 	cg c]  }	t        |	       }}	d	x||<   x||dz
  <   x||dz
  <   ||dz
  <   |dk(  s||dz
  | D 	cg c]  }	t        |	       }}	d	x||<   x||dz
  <   x||dz
  <   x||dz
  <   ||dz
  <    |||f}|S c c}	w c c}	w )Nc                    | j                   }t        |t        j                        sJ t        j                  |      }t        j
                  |      }	 t        j                  |t        d            }|j                  sHt        j                  |      }t        j                  |t        d      t        d      t        d            }t        j                  |      }|S # t        $ r t        r
t                Y y w xY w)Nre
  r  r  )r   rs   rf   r   r   rO  r  r   r   r  r   r   r   r   rF   )r   r  this_annot_objr  r(  r;  r  s          r   Tools__parse_daz(TOOLS._parse_da.<locals>.Tools__parse_daS  s    "ZZ
!*enn===!&!4!4j!A22NC77RVXB=="'"3"3C"8"00 ( 0 ( 4 ("
 #55b9F  ! +0@s   BC C:9C:)r  r(   r   r	  r  r	  r	  rr   r   r(   r	  r	  r   rr  r  )r   r   Tools_parse_dar   rY  r  r%  )
r   r   r_  r)  r  r  r	  r  r  r  s
             r   r   zTOOLS._parse_daS  s    &&

3C& "%(C iik ~ 	GAtt|1q5z!"~c!a%j)/11A1QqSC!Hs{c!a%j)+$&&AQqSt|),QU16AuQx66:<<A<QqS<C!Hs1Q3xs{),QU16AuQx66EGGAGQqSGC!HGs1Q3x#ac(#	& D% 
 7 7s   E	Ec                     | }t        j                  |      }t        j                  |      }t        j                  ||       y r   )rf   r   rO  pdf_field_reset)r   r  r^  r  s       r   r
  zTOOLS._reset_widgetS  s7    
,,Z8**>:c>2r   c                     | j                         }|j                  st        t        j                               S t        t        |            S r   )rB
  r   r1  rf   r2  r_  )r   rb  s     r   r1  zTOOLS._rotate_matrixS  s:    .."!!$U^^%566 !6w!?@@r   c                     t        | |       y r   )r  )r   r  s     r   r
  zTOOLS._save_widgetT  s     /r   c                    t         r!t        j                  | j                  |       y 	 | j                  }t	        |t
        j                        sJ t        j                  t        j                  |      t        d      |       t        j                  t        j                  |      t        d             t        j                  t        j                  |      t        d             y # t        $ r t        r
t                Y y w xY w)Nre
  r  r  )r   r   Tools_update_dar   rs   rf   r   r7  r   r   r   r   r   rF   )r   r  r  s      r   r  zTOOLS._update_daT  s    !!5::v6"ZZ
!*enn===..u/B/B:/NPXY]P^`fg""5#6#6z#BHTNS""5#6#6z#BHTNS   'N,<s   B?C) )DDc                       t         dz  a t         S r!  )TOOLS_JM_UNIQUE_IDr    r   r   r  zTOOLS.gen_idT  s     	a!!r   c                  ,    t        j                          y)z(
        Empty the glyph cache.
        N)rf   fz_purge_glyph_cacher    r   r   glyph_cache_emptyzTOOLS.glyph_cache_emptyT  s    
 	""$r   c                     t        | |      S )z5
        Metadata of an image binary stream.
        )r  )r|  r  s     r   r6  zTOOLS.image_profile"T  s    
  
33r   Nc                 (    | t        |       at        S )z;
        Set MuPDF error display to True or False.
        )r  r  r  s    r   mupdf_display_errorszTOOLS.mupdf_display_errors)T  s     >#'8 ##r   c                 (    | t        |       at        S )z>
        Set MuPDF warnings display to True or False.
        )r  r@  rn  s    r   mupdf_display_warningszTOOLS.mupdf_display_warnings3T  s     >%)"X"%%r   c                  "    t         j                  S )z"Get version of MuPDF binary build.)rf   
FZ_VERSIONr    r   r   mupdf_versionzTOOLS.mupdf_version=T  s     r   c                     t        j                          dj                  t              }| rt        j                          |S )zN
        Get the MuPDF warnings/errors with optional reset (default).
        ry  )rf   fz_flush_warningsr  r
  r   reset_mupdf_warnings)r
  rN   s     r   rc  zTOOLS.mupdf_warningsBT  s3     	!ii01&&(
r   c                      t               ay r   )rt   r
  r    r   r   rw  zTOOLS.reset_mupdf_warningsNT  s     #'&r   c                 .    t        j                  |        y)z*
        Set anti-aliasing level.
        N)rf   fz_set_aa_level)r  s    r   set_aa_levelzTOOLS.set_aa_levelST  s    
 	e$r   c                 R    | t         S t        |       dz   }|dkD  rd}| d d a t         S )Nr   r
  )rf  r'  )rh  r=  s     r   set_annot_stemzTOOLS.set_annot_stemZT  s:     <##4y1}"9D9r   c                    t        |       }|syt        j                  ||      }t        j                  |t	        d            }t        j
                  |      rt        j                  |      }t        |      D ]  }t        j                  ||      }t        j                  |d      }	t        j                  |	t        j                  d             t        j                  |	t        j                  d             t        j                  |	t        j                  |             t        j                  |t	        d      |	        y)NFrQ  r   r   r  r
  T)r   rf   rK  r   r   r.  r]  r  r^  r  r0  r  r  )
r   r   r  r  r)  dfontsr?  r  dfontwarrays
             r   r  zTOOLS.set_font_widtheT  s    s#$$S$/##D(3D*EFf%##F+A1X A++FA6,,S!4$$VU->->q-AB$$VU->->u-EF$$VU->->u-EF""5(3-@A r   c                 .    t        j                  |        y)z6
        Set the graphics minimum line width.
        N)rf   fz_set_graphics_min_line_width)min_line_widths    r   set_graphics_min_line_widthz!TOOLS.set_graphics_min_line_widthwT  s    
 	,,^<r   c                     | r6t         j                  rt        j                          yt        dt               yt         j                  rt        j
                          yy)z!Set ICC color handling on or off.zMuPDF built w/o ICC supportN)rf   r  fz_enable_iccrr  rp  fz_disable_iccrn  s    r   set_icczTOOLS.set_icc~T  sB     ""##%67GH    " !r   c                 N    | t        |       t        _        t        j                  S )z!Set / unset MuPDF device caching.)r  r
  rX   rn  s    r   set_low_memoryzTOOLS.set_low_memoryT  s!     >)-bH&)))r   c                     | =t        |       t        _        t        r#t	        j
                  t        j                         t        j                  S )z Set / unset small glyph heights.)r  r
  rY   r   r   set_small_glyph_heightsrn  s    r   r  zTOOLS.set_small_glyph_heightsT  s8     >+/8H(--h.J.JK+++r   c                 N    | t        |       t        _        t        j                  S )zK
        Set / unset returning fontnames with their subset prefix.
        )r  r
  rZ   rn  s    r   set_subset_fontnameszTOOLS.set_subset_fontnamesT  s!    
 >(,RH%(((r   c                      t        t        j                         t        j                         t        j                               S )z,
        Show anti-aliasing values.
        )r
  r:   graphics_min_line_width)r   rf   fz_graphics_aa_levelfz_text_aa_levelfz_graphics_min_line_widthr    r   r   show_aa_levelzTOOLS.show_aa_levelT  s5    
  557--/*/*J*J*L 	r   c                       y)z)
        MuPDF store size limit.
        Nr    r    r   r   store_maxsizezTOOLS.store_maxsizeT       r   c                 t    | dk\  rt        j                          y| dkD  rt        j                  d| z
         yy)z7
        Free 'percent' of current store size.
        r  r   N)rf   fz_empty_storefz_shrink_store)percents    r   r  zTOOLS.store_shrinkT  s8    
 c>  "Q;!!3=1 r   c                       y)z+
        MuPDF current store size.
        Nr    r    r   r   
store_sizezTOOLS.store_sizeT  r  r   c                 N    | t        |       t        _        t        j                  S )zA
        Set ascender / descender corrections on or off.
        )r  r
  r[   rn  s    r   unset_quad_correctionszTOOLS.unset_quad_correctionsT  s!    
 >-1"XH*---r   r  r  r  r   )1r`   ra   rb   r	  r-  r  r  r*  r  r7  r  r  r  r  r  r  r  r  r  rB  r   r
  r1  r
  r  r  rk  r6  ro  rq  rt  rc  rw  r{  r}  r  r  r  r  r  r  r  r  r  r  r  rf  r  fitz_configr    r   r   r   r   R  s1   7  .     #3 #3J      &  *  &  &  &    *  8 4 4l 3 3 A A 0 0 " "
 % % 4 4 $ $ & &     	 	 ) ) % %      " = = # # * * , , ) )     2 2   . .  "Kr   r   )utilsr  c                      t        j                          t        j                  d        t        j                  d        y r   )rf   rv  fz_set_warning_callbackfz_set_error_callbackr    r   r   _atexitr  T  s*    		!!$'	%r   c                 ,    t        j                  |       S r   )r  r  r0  s    r   ri  ri  KU  s    A r   )find_tablesc                       e Zd Zy)FitzDeprecationNr  r    r   r   r  r  ZU  s    r   r  c                     t        j                  dt               dd} | t         _        dd} |t        dd        |t        d        |t        dd	        |t        d
        |t        d        |t        dd        |t        d        |t        dd        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        d        |t        d        |t        dd        |t
        d        |t
        dd        |t        d        |t        d        |t        dd         |t        d!        |t        d"        |t        d#d$        |t        d%d&        |t        d'd(        |t        d)d*        |t        d+d,        |t        d-d.        |t        d/d0        |t        d1d2        |t        d3        |t        d4        |t        d5        |t        d6        |t        d7        |t        d8d9        |t        d:d;        |t        d<d=        |t        d>        |t        d?        |t        d@dA        |t        dBdC        |t        dDdE        |t        dF        |t        dG        |t        dHdI        |t        dJ        |t        dKdL        |t        dMdN        |t        dO        |t        dP        |t        dQ        |t        dR        |t        dS        |t        dT        |t        dU        |t        dV        |t        dW        |t        dX        |t        dYdZ        |t        d[        |t        d\d]        |t        d^d_        |t        d`da        |t        db        |t        dc        |t        dd        |t        de        |t        dfdg        |t        dh        |t        di        |t        dj        |t        dkdl        |t        dm        |t        dn        |t        do        |t        dp        |t        dqdr        |t        ds        |t        dsdt        |t        du        |t        dv        |t        dw        |t        dx        |t        dy        |t        d        |t        d        |t        dz        |t        d{d|        |t        d}d~        |t        dd        |t        dd        |d dd        |d dd        |d d        |d dd        |d dd        |d dd        |d dd        |d d        |d d        |t        dy        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        dd        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        d        |t        dd        |t        d        |t        dd«        |t        dë        |t        d        |t        ddū        |t        d
        |t        dƫ        |t        dǫ        |t        d        |t        dd        |t        dȫ        |t        dɫ        |t        dʫ        |t        d˫        |t        d̫        |t        ddΫ        |t        dϫ        |t        dЫ        |t        ddҫ        |t        ddԫ        |t        dի        |t        d֫        |t        d׫        |t        dث        |t        ddګ        |t        ddܫ        |t        dݫ        |t        dd߫        |t        d        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        d        |t        dd        |t        dd        |t        dd        |t        dd        |t        dd        |t        d        |t        dd        |t        d        |t        d        |t        d        |t        d        |t        dd        |t        dd        |t        dd        |t        d        |t        dw        |t        d        |t        ds        |t        dsdt        |t        du        |t        dv        |t        dw        |t        dx        |t        d        |t        d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d        |t         j"                  d˫        |t         j"                  d̫       y (   Noncecategoryc                     t        j                  | ||||      }|j                  d      }|dk  rt        |       y ||d  j	                         d   dd  }t        |       y )N)r=   r  r   r  )warningsformatwarningri   r>   r  )r  catr3   r4   r.   r=   r:   r)  s           r   showthisz!restore_aliases.<locals>.showthis`U  sa    %%c3&tLII'(q5IABx""$Q'+D	r   c                 x     t         j                  t            s0dd}D ]'  }|dk(  rd}|r|j                         z  d}#|z  ) t	               t	         d      rJ d  d        t              r- fd}t         |       d	 d
j                   |_        yt                y)a  
        Adds an alias for a class_ or module item clled <class_>.<new>.

        class_:
            Class/module to modify; use None for the current module.
        new_name:
            String name of existing item, e.g. name of method.
        legacy_name:
            Name of legacy object to create in <class_>. If None, we generate
            from <item> by removing underscores and capitalising the next
            letter.
        Nr(   Fr  Tzclass z already has c            	          t         j                  d      s%t        j                  d d d dt                | i |S )Nz1.18rg  z" removed from z after v1.19.0 - use "z".r  )VersionBindr   r  warnr  )r  r  class_legacy_namenew_name
new_objects     r   deprecated_functionz<restore_aliases.<locals>._alias.<locals>.deprecated_functionU  sN    "--f5MM}OF8CYZbYccef%4 "D3F33r   z>*** Deprecated and removed in version following 1.19.0 - use "z". ***
)rt  modulesr`   r  r   r  r  r	  )r  r  r  capitalise_nextrs  r  r  s   ```   @r   _aliaszrestore_aliases.<locals>._aliaskU  s     >[[*FK#O %8&*O$1779,K&+O1$K% fh/
FK6c&VaUb8cc6Z 4 V[*=>TU]T^^f!))*,  '
 V[*5r   r  fileGetr  r  soundGetra  r   r  getTextPager  r  setBlendModer  r*  r-  r;  rN  rP  rS  setOCrZ  ri  r  fileUpdr  r  r  convertToPDFr  r  r  deletePageRanger-  embeddedFileAddr/  embeddedFileCountr2  embeddedFileDelr4  embeddedFileGetr:  embeddedFileInfor)  embeddedFileNamesr=  embeddedFileUpdrM  r}  r  r  r  r  getOCGsr  getPageFontListr  getPageImageListget_page_pixmapget_page_textr  getPageXObjectListr  getSigFlagsr  getToCr  insert_pager  	insertPDFr  r  	isFormPDFr  isPDFr  r  r0  r  rN  r]  r  new_pagers  r  r{  pageCropBoxr  r  
PDFCatalogr  
PDFTrailerr  previousLocationr  search_page_forrI  set_metadataset_tocsetToCr"  r  r4  rS  isStreamrW  r  ra  rd  rf  metadataXMLget_areagetRectArear  r  r	  r	  r	  rz	  r}	  	preRotater	  preScaler	  preShearr	  preTranslater*  	getPDFnowr+  	getPDFstrr4  getTextlengthr6  ImagePropertiesr  	PaperRectr  	PaperSizer  r  r  r  r"  r&  r(  r.  r1  r3  r7  r9  r;  r>  rB  rD  rG  rI  rL  rN  rS  rz  r  rl  CropBoxPositionro  rw  delete_widgetr,  r  r  r  r!  r(  r*  r,  r.  r  rN  rP  r  r  r  r  r  getDisplayListr  r  getFontListr  r  getImageListr  r  getSVGimageget_text_blocksget_text_wordsr  insert_imager  r  insert_textboxrg  
_isWrappedrW  r  r  r@  r(  MediaBoxSize	new_shaper+  r  
search_forr<  
setCropBoxr  setMediaBoxrm  show_pdf_pageshowPDFpager+  update_linkrh  r  r  r  
copyPixmapr  r  invertIRectr  pillowWriter  
pillowDatar  
writeImagewritePNGr  r  setResolutionr  r  r&  r  getImageData
getPNGData
getPNGdatar)  r  fill_textboxrj  r   )r  filterwarningsr  showwarningr   r  r   r\  r	  r5  r  r   r  r  r   r  r  r  )r  r  s     r   restore_aliasesr  ]U  s	   Vo> $H*6X E:I6
E< 
E;J7
E:
E=!
E>M:
E;
E?N;
E< 
E< 
E;
E:
E?#
E:
E8W%
E=!
E:
E=I6
K&
KM:
Ho&
H*+
H&N;
Hk"
Hm$
Hn,=>
Hm,=>
Ho,?@
Hm,=>
Hm,=>
Hn,>?
Ho,?@
Hm,=>
Hn%
Ho&
Ho&
Ho&
H'(
HjI6
H&,=>
H',>?
H'(
Ho&
H),@A
HnM:
Hi*
H()
Hm$
HlK8
Hj!
HmK8
Hh(
Ho&
Hm$
Ho&
Hk"
Ho&
Hk"
Hl#
Hj!
Ho&
Hl#
HnM:
Hk"
HmL9
HmL9
Ho,>?
Hn%
H'(
Hn%
Hn%
Hi*
H()
Ho&
Ho&
H&J7
Hm$
Hm$
Hm$
H'(
H)M:
E:
E:M:
E?#
E>"
E:
E=!
D- 
D,
D,
F$%
FKK8
FJJ7
FJJ7
FNN;
D-K8
D-K8
D#$
D#O<
D/,=>
D,K8
D,K8
D- 
D.!
G]#
GY
D#$
D$%
D"#
D&'
D'(
D/"
D"#
D%&
D&'
D"#
D$%
D&'
D#$
D'(
D"#
D'(
D,
D"#
D)I6
D$,=>
D.!
D- 
D/"
D%&
D- 
D- 
D,
D+
D+
D/"
D+
D+
D- 
D/"
D- 
D- 
D,
D.!
D.!
D#,<=
D.!
D+M:
D"#
D,N;
D+
D,
D/M:
D*
D#$
D"#
D- 
D.M:
D- 
D.!
D- 
D- 
D"#
D,L9
D,
D,
D*J7
D/N;
D+
D/"
D#$
D,
D-L9
D.M:
D.!
D/M:
D)*
D- 
D/"
D,
FL!
FFL9
FL!
FNM:
FJM:
FML9
FFL9
FFJ7
FK 
FIO<
FL!
FK 
FJ
FK 
FIN;
FIL9
FIL9
D+
D*
D"#
D*
D*M:
D/"
D.!
D*
D- 
J'
J%
EKK'
EKK'
EKK&
EKK%
EKK%
EKK)
EKK%
EKK%
EKK'
EKK)
EKK'
EKK'
EKK)*r   zPyMuPDF z : Python bindings for the MuPDF z* library (rebased implementation).
Python z running on r  l        z-bit).
)r(   r   r  )r   r   r   r   r   N)strict)rQ  r  r   )rC  )r   r   r   r   r  Nr  ))r   r   r   r   r   r   )r   r   r)  r  r  N(  r	  atexitr{  rw  r/   r.  r6	  r   r>  r  rB  rt  rI  rS  rp  r  r  rD  r(   r   r   r  r8   r@   rt   r   r#   r!   r%   r'   r>   rB   rF   r!  
whitespacer  r[  rO   rQ   r   r   rU   r
  r   r   re   __file__	importlib	machinerySourceFileLoaderload_moduler  r  rf   r   reinit_singlethreadedrj   rs  VersionFitzr  VersionDater  VersionDate2rv  ru   rY  pymupdf_version_tupleFZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHrw   rv   format_gOptionalrr  rs  r   OptDictr%  r  rq  r   r{  Sequencer  r   r  r   r  r|   r}   r~   r   r   r   r   r   r   r  r   r  rY  rf  r}  r  FzDocument_insert_pdfr  r   r   r  r  r  r	  r5  r	  r  r 	  r  r	
  r  rP  r  r  r   r  r  r  r  r\  r  r`   _selfrg  rn  rv  _valuer   r  
getmembersPDF_SIGNATURE_SHOW_LABELSPDF_SIGNATURE_SHOW_DNPDF_SIGNATURE_SHOW_DATEPDF_SIGNATURE_SHOW_TEXT_NAMEPDF_SIGNATURE_SHOW_GRAPHIC_NAMEPDF_SIGNATURE_SHOW_LOGO PDF_SIGNATURE_DEFAULT_APPEARANCEUCDN_EAST_ASIAN_HPDF_TX_FIELD_IS_MULTILINEUCDN_SCRIPT_ADLAMr  r8  AnyAnyTypeBase14_fontnamesr  r  r  ry	  r  rq  rr  rf  r
  r  r@  	PDF_OC_ONPDF_OC_TOGGLE
PDF_OC_OFFr	  r	  r	  r	  r	  r	  r	  r	  LINK_FLAG_R_VALIDLINK_FLAG_B_VALIDLINK_FLAG_FIT_HLINK_FLAG_FIT_VLINK_FLAG_R_IS_ZOOMr  r  STAMP_Approved
STAMP_AsIsSTAMP_ConfidentialSTAMP_DepartmentalSTAMP_ExperimentalSTAMP_ExpiredSTAMP_FinalSTAMP_ForCommentSTAMP_ForPublicReleaseSTAMP_NotApprovedSTAMP_NotForPublicRelease
STAMP_SoldSTAMP_TopSecretSTAMP_Draftr  r  r  r  TEXT_FONT_SUPERSCRIPTr  r  r  r  TEXT_OUTPUT_TEXTTEXT_OUTPUT_HTMLTEXT_OUTPUT_JSONTEXT_OUTPUT_XMLTEXT_OUTPUT_XHTMLTEXT_PRESERVE_LIGATURESTEXT_PRESERVE_WHITESPACETEXT_PRESERVE_IMAGESTEXT_INHIBIT_SPACESTEXT_DEHYPHENATETEXT_PRESERVE_SPANSTEXT_MEDIABOX_CLIPTEXT_CID_FOR_UNKNOWN_UNICODETEXTFLAGS_WORDSTEXTFLAGS_BLOCKSTEXTFLAGS_DICTTEXTFLAGS_RAWDICTTEXTFLAGS_SEARCHTEXTFLAGS_HTMLTEXTFLAGS_XHTMLTEXTFLAGS_XMLTEXTFLAGS_TEXTTEXT_ENCODING_LATINTEXT_ENCODING_GREEKTEXT_ENCODING_CYRILLICrh  rm  ri  rk  PDF_BM_ColorPDF_BM_ColorBurnPDF_BM_ColorDodgePDF_BM_DarkenPDF_BM_DifferencePDF_BM_ExclusionPDF_BM_HardLight
PDF_BM_HuePDF_BM_LightenPDF_BM_LuminosityPDF_BM_MultiplyPDF_BM_NormalPDF_BM_OverlayPDF_BM_SaturationPDF_BM_ScreenPDF_BM_SoftLight
annot_skelr   r  r  r  r  r  r  r   dictkey_ascr?  r!  rr  r
  r  rL  rq  r  r  ru  
dictkey_dart  rv  r  dictkey_effectrE  ru  r|  r  r	  dictkey_glyphrp  r  rv  r:  rw  r  rA  r  r  r>  r  r  rx  rn  r  r{  ru  r  r   r  rF  r8  ro  r  r   rs  rt  r  r+  r,  r  r  r  rr  r  r1  r2  r!  rW  r  r  r.  r2  r1  r  r9  r  r  r   rt  r   rB  r  r
  r
  r  rb  r   rE
  rR  rF  rU  r  r  r   ru  r  r  r  r  r  r  r   r  r  ro  r  r
  ry  r  r  r/  r  rY  r  r  r  r  r  r[  r  r  rt  r  r#  r  r)  r   r5  r
  r
  rP  rv  rT  r  r  r^  r
  r#  r|  rD  r  r  rl  rx  r6  r]  r  r  r  r  r  r
  r  r  r  rX  r  rO
  r  r  r  r  r  r&  r  r  rA  rC  r  rH  rL  r  rB  rG  r  r/  r  r  rA
  r  rj  r  r1  r  r  r'  rf
  r  r  r  r,  r_  r  r  r  r  r]  r  r  r  r  r  r  r   r   r  rS
  rV
  rq  r   rT
  ra
  r   r  MSG_BAD_DOCUMENTr  MSG_BAD_LOCATIONr  r$  rm  ro  r  r!  rg  r  r?  r  r  rG  rB  r
  r+  r0  ra  r  rs  rp  rr  rp  r&  r  r  r,  r  rZ  r&  ru  rt  rz  r
  r   r  r  r
  r  r  ro  r+  r%  r/  r4  r6  r@  rC  rG  rJ  rO  rS  rW  r[  r]  r_  rc  rg  rl  rj  r  r  r  r  r  FzPathWalker2r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  PdfFilterOptions2r  	FzDevice2rE  	FzOutput2rN  r  r  r  r   r+  r0  r2  r<  r>  r  r  rE  rG  rM  rJ  r  r*  r  r[  r^  r+  r  rl  ru  r
  r  r  r  r  r  r  r  rs  rd  r  rt	  ro	  r3  r  r  rQ  r  r-  r  r  r  r  r  r  r  r  r  rI  r  r  r  r  r  r  r  r  r'  ra  r   r  getColorInfoDictpdfcolorr  r  r  registerrecover_bbox_quadrecover_char_quadrecover_line_quadrecover_quadrecover_span_quadr   do_linksr  del_toc_itemr  r  get_ocmdget_page_labelsget_page_numbersr  r  r  
has_annots	has_linksr  r  scrubr  r  rS  set_ocmdset_page_labelsr  set_toc_itemsubset_fontsr;  r  	xref_copyr  apply_redactionsdelete_imager  r  r  r  r!  r(  r*  r,  r.  r  rN  rP  get_image_infor  	get_labelr  r  r  get_text_selectionr  get_textpage_ocrr  r  r  r  insert_htmlboxr  replace_imager  r  r  r  tabler  r  DeprecationWarningr  r  __version__version_infor  maxsize)r  rr  r   r	  r  s   00000r   <module>r     s       	  	  	  
       "O  

3
.

;v !  **\9CFBC $  #$@!D  /6' ' : jjnnm,H:_[O3X	YZH:^BJJ|$<#=	>?b)):: +- 	 !!''E  E! #""3+33C<DDS"M\
2K4E4Ec4JKq
KL --u/E/EuG]G]^ e9J9J39O$PAWQZ$PQQ X
C/B.DDUWXQ ! *  ??6,,-
//$
??5!	c4i	 		)		**..!23
		4$4&00$ 	
f< f<R+c' c'Lb	 b	J BO O.+ +Z "'"="=_5 _5Bk )& )&XG/ G/T v vro od:V :. Z, Z,xe eP	 O Of ;|a$1 a$1HIY Yx 
u upeX eXPX Xvd	7 d	7N^B ^BBQ Qh
@ @Fi i^ KK!E"^^113 	2ME6 89##$45 E5&1	22 )*--).)))* ++), 00	)1
 33)4 ++),$ ""a''' %(G(GGGG 7 7777uf
** " 	 #A!"OAGGI#% - * 1 # + ( / ' & ( , " ( 
      	

 		

       
       
                  " 
!"
"#  '	' 
!"
"#  '	'  
!"
"#  	
 '' # 
!"
"#  	
 ''  
!"
"#  	
 '' 
!"
"#  	
 '' 
!"
"#  '	' 
!"
"#  '	'      


        
           DY le}Zg

	L 		 		] 	 	6	G		G	
 	! % 
 
 ::/?//1!&&( ;,7NQ);A
HA
N"!3H'UT<
U T:6$
CLI IE II IU I/*2 %P.3=l
2>&&<
Vr5p4n$"J .0j/d(&"JN0I $ *.6("J% %c %P7%++ 7ELL 7Z] 7t(02/ ;|4)n,"CL)X B
 >. 
)X#L$N<K\ F7<0\(}@(B*.+B>:3l= @**6
*,.
2	*Z.(6VBB"(	"*Z(6.H"0FR&#R<8#:L-`3<'B*~"B8 60 F( & )? ( %( 0 ! ! ' % %%#*!- / &$(.,  '  	P& PD C E x s t 	&** 	 		&** 	 	H6:: H
 
 

- 
- 
-.dE5$67 .C .C .$.0

# 
# 
#2.b"3 "T5$-> ? " "Y\ "ad "J23 23 2j=c =B %)TRVBB!B3:BIOBBJ'<# '< '< '<UX '<`e '<T'v(( 'T ',DNJ1X$N.bUp8NpU   pf>2j*($
!
+Z +Z +F + u66 . .<$5?? $0$P/5?? P/f3%eoo 3%lV% V%r3 3v 3l *)5 )+e +6 c 

8S &f F F FYb Fmq FR, , ,1(Y (C (# (T (VG8 #t$4 K*\  $$4D 	Hf/$N,6 ">2G2T)# )$ )# % (6
p *$6AF$*/dL@4c 4e 4c e  )X,     ! ,c ,c , 1 ff|D =@y# y#~    !7 6 6 8 > > @	
 	
9Aq! S!c'1s7+,	

 !E!!"23E/(&  
 $55 #55 #55 #00#55 #nn#// #nn #00 #33 #ll#nn #33 #44 #33 #11 #mm #.. #oo #// #nn #kk#33 #00 #ll#nn #33 #mm #00 #00 &nn #oo #nn#44 #00 #11 #// #// #..#oo#oo#11 #oo#oo#// #11 #// #22 #33 #oo#oo#..#nn#33 #66 #22 #// #44 #00 #// #// #22 #22 6#11 #..#11 #// #..   #nn#00
 	( 	V+p  
;-?} M""1%&a(8(8(;'<LVX_b_j_jmr_rY[xzX{  |D	E ym
  $  L %Q``  x	
sE   ;A[ 1A[ A[
AA[! A/!A[1[	A[[A[[!	A[.[-A[.