U
    ?eņ                     @   sh  d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlm  mZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZ d d	lmZm Z m!Z!m"Z" d d
l#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 z d dl3m4Z4m5Z5 d dl6m7Z7 W n e8k
rT   dZ7dZ5Y nX e9dZ:dZ;dZ<G dd de=Z>G dd dZ?G dd deZ@G dd deZAdZBG dd  d eCZDG d!d" d"e e?ZEG d#d$ d$e"e?ZFG d%d& d&e-e?ZGG d'd( d(e!e?ZHG d)d* d*e&e?ZIG d+d, d,eZJG d-d. d.e$ZKG d/d0 d0eZLG d1d2 d2eZMG d3d4 d4e ZNdS )5    N)md5)escape)BytesIOStringIO)TA_RIGHT)ParagraphStyle)LazyImageReaderflatten
haveImagesopen_for_read)BaseDocTemplateIndexingFlowablePageTemplate)CondPageBreakFlowableKeepInFrameParagraphAndImage)TableOfContents)Table
TableStyle)register_reset)
WaterMarks)	Paragraph)getBorderStylegetUID)pisaTempFile)	renderPDFrenderPM)svg2rlgZ	xhtml2pdfgffffff?z3xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>c                   @   s   e Zd Zdd Zdd ZdS )PTCyclec                 C   s   d| _ d| _t|  d S Nr   )_restart_idxlist__init__self r'   A/tmp/pip-unpacked-wheel-35p66c5k/xhtml2pdf/xhtml2pdf_reportlab.pyr$   9   s    zPTCycle.__init__c                 c   s6   | | j  V  |  j d7  _ | j t| kr | j| _ q d S )N   )r"   lenr!   r%   r'   r'   r(   cyclicIterator>   s    zPTCycle.cyclicIteratorN)__name__
__module____qualname__r$   r+   r'   r'   r'   r(   r   8   s   r   c                   @   s   e Zd Zdd Zdd ZdS )PmlMaxHeightMixInc                 C   sb   || _ |dk rFt| drLt| jds,d| j_t|| jj | _ | j_n|| _ t| ds\d| _ | j S )Nip canvmaxAvailHeightValuer   availHeightValue)r2   hasattrr0   r1   max)r&   availHeightr'   r'   r(   setMaxHeightG   s    

zPmlMaxHeightMixIn.setMaxHeightc                 C   s   t | dsdS | jS )Nr2   r   )r3   r2   r%   r'   r'   r(   getMaxHeightX   s    
zPmlMaxHeightMixIn.getMaxHeightN)r,   r-   r.   r6   r7   r'   r'   r'   r(   r/   F   s   r/   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )
PmlBaseDoczj
    We use our own document template to get access to the canvas
    and set some informations once.
    c                 C   s   t | jjj_d S N)PRODUCERr0   _docinfoZproducerr%   r'   r'   r(   
beforePaged   s    zPmlBaseDoc.beforePagec                 C   s4   t |ddr0| d|jtt|jd| jf d S )NoutlineFZTOCEntryr)   )getattrnotifyoutlineLevelhtml_escapecopydeepcopytextpage)r&   Zflowabler'   r'   r(   afterFlowabley   s    zPmlBaseDoc.afterFlowablec                 C   s@  |  |d }|  |d }|r4|r4|d |d g}t|trt| drL| `| jD ]"}|j|krR| j|| _ dS qRt	d| nt|t
rt| dr| `|| _nt|ttfr4t }|D ]@}|dkrt||_q| jD ] }|j| kr||  qqq|st	dn|jt|kr(t	d| | _ntd	dS )
zS
        if pt has also templates for even and odd page convert it to list
        _leftZ_right_nextPageTemplateCycleNzcan't find template('%s')*z No valid page templates in cyclezInvalid cycle restart positionz/Argument pt should be string or integer or list)_has_template_for_name
isinstancestrr3   rI   pageTemplatesidindexZ_nextPageTemplateIndex
ValueErrorintr#   tupler   r*   r!   stripappendr+   	TypeError)r&   ptZhas_left_templateZhas_right_templatetcZptnr'   r'   r(   handle_nextPageTemplate   s@    









z"PmlBaseDoc.handle_nextPageTemplatec                 C   s$   | j D ]}|j| kr dS qdS )NTF)rN   rO   rT   )r&   nametemplater'   r'   r(   rK      s    
z!PmlBaseDoc._has_template_for_nameN)r,   r-   r.   __doc__r=   rG   rZ   rK   r'   r'   r'   r(   r8   ^   s
   .r8   c                   @   s@   e Zd ZdZdZeZdd Zdd Zdd Zd	d
 Z	dd Z
dS )PmlPageTemplateZportraitZ	landscapec                 K   sN   g | _ g | _d | _tj| f| d| _d| _d | _d| _d| _	d| _
g | _d S )Nr   T)pisaStaticListpisaBackgroundListpisaBackgroundr   r$   _page_count_first_flowimgphhwbackgroundids)r&   kwr'   r'   r(   r$      s    zPmlPageTemplate.__init__c                 C   s8   | j r2| | jkrd| _ n| | _| |j_| j S NF)rc   getPageNumberrb   _doctemplate)r&   canvasr'   r'   r(   isFirstFlow   s    
zPmlPageTemplate.isFirstFlowc                 C   s   | j | jkS r9   )pageorientationPORTRAITr%   r'   r'   r(   
isPortrait   s    zPmlPageTemplate.isPortraitc                 C   s   | j | jkS r9   )ro   	LANDSCAPEr%   r'   r'   r(   isLandscape   s    zPmlPageTemplate.isLandscapec                    s<      z"|jj| jkrd }t| dr|| jr|| j s|| j 	drft
j| j| j|  | jd}n| j}| j|jj |r| j  || jf  fddz\  | jkr҈  | _   j_| jD ](}t|}|j}| ||  qW n$ tk
r(   tjddd Y nX W 5    X d S )	Nra   zimage/)contextc                    sr   t | D ]d}t|trJ|jD ]*}|jr2t|_q|jrt jj	|_qqt|t
rdd |jD }| qd S )Nc                 S   s   g | ]}|D ]}|qqS r'   r'   ).0Zsublistitemr'   r'   r(   
<listcomp>   s       zIPmlPageTemplate.beforeDrawPage.<locals>.pageNumbering.<locals>.<listcomp>)r	   rL   PmlParagraphfragsZ
pageNumberrM   rE   Z	pageCountrl   rb   PmlTableZ_cellvalues)ZobjListobjfragZ
flat_cellsrm   pageNumberingZ
pagenumberr'   r(   r~      s    


z5PmlPageTemplate.beforeDrawPage.<locals>.pageNumberingr^   r)   exc_info)	saveStaterestoreStateZpageTemplaterO   rh   r3   ra   ZnotFoundZgetMimeType
startswithr   Zgenerate_pdf_backgroundZpagesizerq   ZbackgroundContextrU   r`   rk   rb   rl   r_   rC   rD   ZpisaStaticStoryZaddFromList	Exceptionlogdebug)r&   rm   docra   frameZstoryr'   r}   r(   beforeDrawPage   s:     



zPmlPageTemplate.beforeDrawPageN)r,   r-   r.   rp   rr   ro   r$   rn   rq   rs   r   r'   r'   r'   r(   r^      s   	r^   r)   c                   @   s\   e Zd ZdZi Zdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd ZdS )PmlImageReaderz>
    Wraps up either PIL or Java to get data from bitmaps
    c           
   	   C   sd  t |tr|j| _d S || _d | _d | _d | _d | _d | _d}t	rt |t	j
r|| _t|dd | _z
|| _W n" tk
r   dt|  | _Y nX n̐z`t|d| _t | jt jrd}|dkr0| j }|d@ rz| j  W n   Y nX |d@ r$| jst| jj | jt| |}t|| _n*|dkrZt |trZ| j  | `t| _tr| jsv| | j| _t| jdd d	kr| j| _ n`dd
l!m"} z|| j\| _| _}W n   t#dY nX | j| _ | j | _d | _$| j%d W nh   t&' \}}}t(|drXt|j)d d|  }	|j)d d |	f |_)t#d*|||n Y nX d S )Nr   fpzPILIMAGE_%db      formatZJPEG)readJPEGInfozBImaging Library not available, unable to import bitmaps only jpegsargsz fileName=%rz{0} {1} {2})+rL   r   __dict__fileName_image_width_heightZ_transparent_dataPILImageImager?   r   AttributeErrorrO   r   r   	__class__readclose_cacher   clear
setdefaultr   digestr   rM   r   r
   _read_image_jpeg_fhjpeg_fhZreportlab.pdfbase.pdfutilsr   RuntimeError_dataAseeksysr   r3   r   r   )
r&   r   ZimageReaderFlagsdatar   rY   etZevtbar'   r'   r(   r$     st    






zPmlImageReader.__init__c                 C   sR   t jdd dkr@ddlm} ddlm} || }||S trNt|S d S )Nr   r   java)ByteArrayInputStream)ImageIO)	r   platformZjava.ior   Zjavax.imageior   r   r   open)r&   r   r   r   Zinput_streamr'   r'   r(   r   ^  s    
zPmlImageReader._read_imagec                 C   s   | j }|d |S r    )r   r   )r&   r   r'   r'   r(   r   g  s    
zPmlImageReader._jpeg_fhc                 C   s   d S r9   r'   r%   r'   r'   r(   r   l  s    zPmlImageReader.jpeg_fhc                 C   s\   | j d ks| jd krPtjdd dkr@| j | _ | j | _n| jj\| _ | _| j | jfS )Nr   r   r   )r   r   r   r   r   ZgetWidthZ	getHeightsizer%   r'   r'   r(   getSizeo  s    zPmlImageReader.getSizec              	   C   s^  | j dkrXd| _tjdd dkrddl}ddlm} |  \}}||| d}|| j	dd|||d|}|
  g }|j}|D ]<}	|t|	d? d@  |t|	d	? d@  |t|	d@  qd
|| _ d| _n| j	}
|
j }| _|dkr|
  t|
 d | _|
d}
d| _n|dkr6|
d}
d| _t|
drN|
 | _ n
|
 | _ | j S )z'Return byte array of RGB data as stringNr   r   r   )PixelGrabberi          RGBZRGBA   )Lr   ZCMYKtobytes)r   r   r   r   jarrayZjava.awt.imager   r   zerosr   Z
grabPixelsrU   chrjoinmodeloadr   splitconvertr3   r   tostring)r&   r   r   widthheightbufferZpgZpixelsr   ZrgbZimr   r'   r'   r(   
getRGBDatax  s>    




zPmlImageReader.getRGBDatac                 C   s   |   \}}|||  fS r9   )r   r   )r&   r   r   r'   r'   r(   getImageData  s    zPmlImageReader.getImageDatac              
   C   s   t jdd dkrd S d| jjkr| jjd d }| jj}t|drL|j}nt|dr^|j}nd S zt|||d  W S  tk
r } zt	j
t||d W Y d S d }~X Y qX nd S d S )	Nr   r   r   transparencyr   paletter   r   )r   r   r   r<   r   r3   r   r#   r   r   r   rM   )r&   r   r   er'   r'   r(   getTransparent  s     

zPmlImageReader.getTransparentc                 C   sL   z$| j  }|st| }dt| W S    | j }|s>t| }| Y S X d S )NzPmlImageObject_%s)r   r   rO   hash)r&   fnr'   r'   r(   __str__  s    
zPmlImageReader.__str__N)r,   r-   r.   r]   r   r$   r   r   r   r   r   r   r   r   r'   r'   r'   r(   r     s   F		(r   c                   @   sJ   e Zd ZdddZdd ZdddZd	d
 Zdd Zdd ZdddZ	dS )PmlImageNautoc           
      K   s   || _ d| _|| _t|tr$| n|| _|| _|  }|rV|	 pFd\}}| _
| _n|  }	|	rr|	 \| _
| _|pz| j
| _|p| j| _d S )NZCENTER)r   r   r   r   )ri   ZhAlign_maskrL   r   getvalue_imgdatamimetype
getDrawingZ	getBoundsZ
imageWidthZimageHeightgetImager   	drawWidth
drawHeight)
r&   r   r   r   maskr   ri   drawing_rd   r'   r'   r(   r$     s    zPmlImage.__init__c                 C   sp   |  |}t| j|}t|| j }t| j|t }t|| j }t||}| j| | _| j| | _| j| jfS )zS This can be called more than once! Do not overwrite important data like drawWidth )r6   minr   floatr   MAX_IMAGE_RATIOdWidthdHeight)r&   
availWidthr5   r   wfactorr   hfactorfactorr'   r'   r(   wrap  s    

zPmlImage.wrapc                 C   s   t rzt t| j}W n tk
r,   Y dS X |rd}d}t| dddk	rb|dkrX| j}||j }t| dddk	r|dkr| j}||j }|dks|dkr|	|| |S dS )z[ If this image is a vector image and the library is available, returns a ReportLab Drawing.Nr)   r   r   )
r   r   r   r   r?   r   r   r   r   Zscale)r&   r   r   r   Zscale_xZscale_yr'   r'   r(   r     s(    

zPmlImage.getDrawingc                 C   s2   t r.tr.|  }|r.t }tj||dd |S dS )zX If this image is a vector image and the libraries are available, returns a PNG raster. ZPNG)fmtN)r   r   r   r   Z
drawToFile)r&   svgimgdatar'   r'   r(   getDrawingRaster  s    zPmlImage.getDrawingRasterc                 C   s"   |   }|pt| j}t|}|S )z Returns a raster image. )r   r   r   r   )r&   ZvectorRasterr   rd   r'   r'   r(   r     s    zPmlImage.getImagec                 C   s*   |   }| jj|dd| j| j| jd d S )Nr   )r   )r   r0   Z	drawImager   r   r   )r&   rd   r'   r'   r(   draw  s     zPmlImage.drawc                 C   s   t | |}|S r9   )r   identity)r&   maxLenrr'   r'   r(   r   %  s    zPmlImage.identity)NNr   N)NN)N)
r,   r-   r.   r$   r   r   r   r   r   r   r'   r'   r'   r(   r     s   


r   c                   @   s   e Zd Zdd Zdd ZdS )PmlParagraphAndImagec                 C   s"   | j | j_ t| ||}| j` |S r9   )r0   Ir   r   )r&   r   r5   resultr'   r'   r(   r   +  s    
zPmlParagraphAndImage.wrapc                 C   s.   t | ds | j||\| _| _t| ||S )NwI)r3   r   r   r   ZhIr   r   r&   r   r5   r'   r'   r(   r   1  s    
zPmlParagraphAndImage.splitN)r,   r-   r.   r   r   r'   r'   r'   r(   r   *  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
rx   c           
      C   s   d| _ | jD ]}t|dr|jjdkr|j}|jdkr|jdkrd| _ t|j|}t||j }t|j|t	 }t||j }t||}	| j|	9  _| j|	9  _qd S )NFcbDefnrd   r   T)
Z	hasImagesry   r3   r   kindr   r   r   r   r   )
r&   r   r5   r|   rd   r   r   r   r   r   r'   r'   r(   _calcImageMaxSizes9  s    

zPmlParagraph._calcImageMaxSizesc                 C   s   |  |}| j}|j|j |j |j | _|j|j |j	 |j
 | _|| j8 }|| j8 }| || t| || | j| j | _| j| j | _| j| jfS r9   )r6   stylepaddingLeftZpaddingRightborderLeftWidthborderRightWidth
deltaWidth
paddingTopZpaddingBottomborderTopWidthborderBottomWidthdeltaHeightr   r   r   r   r   )r&   r   r5   r   r'   r'   r(   r   H  s    


zPmlParagraph.wrapc                 C   sJ   t | jdkrg S t| ds(| || || j8 }|| j8 }t| ||S )Nr   r   )r*   ry   r3   r   r   r  r   r   r   r'   r'   r(   r   e  s    


zPmlParagraph.splitc              	      s  t | ddrt | jddd }|| jk r\t }| j| | j| j||| j  |d7 }q| j| j_t }| j| | j| j|| j| j  |d7 }| j | j	j
}j}d}|| }| }| j|j  d|  }| jd|  }	|r     |  j||||	ddd    d _
    jj djj   t|     |_
    fd	d
}
|
jjj|||||	  |
jjj|| ||| ||	  |
jjj |||	 || ||	  |
j!j"j#|||| |    d S )Nr>   FoutlineLastr   r)   r   r   )fillZstrokec                    sJ   |rFt | rF|d krj}|d k	rF |  |  |||| d S r9   )r   Z	textColorZsetStrokeColorZsetLineWidthline)Zbstyler   colorx1y1Zx2y2rm   r   r'   r(   _drawBorderLine  s    

z*PmlParagraph.draw.<locals>._drawBorderLine)$r?   r0   rA   r   ZbookmarkPageZaddOutlineEntryrE   ZoutlineOpenr  r   Z	backColor
leftIndentr   ZrightIndentr   r   ZsetFillColorrectr   	translater   r   r   r  r   r   ZborderLeftStyleZborderLeftColorZborderRightStyler   ZborderRightColorZborderTopStyleZborderTopColorZborderBottomStyler  ZborderBottomColor)r&   lastkeybgr  Zbpxyrg   rf   r  r'   r  r(   r   s  s    





            zPmlParagraph.drawN)r,   r-   r.   r   r   r   r   r'   r'   r'   r(   rx   8  s   rx   c                   @   s   e Zd Zdd ZdS )PmlKeepInFramec                 C   s4   t |d}t |d}|| _| || _t| ||S )Ng      ?)r4   ZmaxWidthr6   Z	maxHeightr   r   r   r'   r'   r(   r     s
    

zPmlKeepInFrame.wrapNr,   r-   r.   r   r'   r'   r'   r(   r    s   r  c                   @   s&   e Zd Zdd Zd	ddZdd ZdS )
rz   c                 C   sH   t |t dkr*|d t|dd  }n|dks:|dkr>|}t||S )z4
        Helper for calculating percentages
        r   g      Y@Nr   rJ   )typer   r   )r&   rg   Zmaxwr'   r'   r(   
_normWidth  s
    zPmlTable._normWidthN@ c              	   C   s,   |dkr|   p|}tj| ||||||dS )Nr  )WHaH)r7   r   _listCellGeom)r&   Vrg   sr  r  r  r'   r'   r(   r    s    zPmlTable._listCellGeomc                 C   s<  |  | z
| j W n   || _Y nX | | j|}|}d}| j}t|D ]B\}}|d k	sd|dkrz| ||}||8 }n|d7 }d }|||< qL|d }	|dkrt|D ]"\}}|d krt|	|| ||< qt||kr|t| }
tt|D ]}|| |
 ||< qt|| }|dkr.|d  |8  < t	
| ||S )Nr   rJ   r)   g{Gz?)r6   
totalWidthr  Z
_colWidths	enumerater4   sumranger*   r   r   )r&   r   r5   r   ZremainingWidthZremainingColsZnewColWidthsr   ZcolWidthZminCellWidthZquotientZdiffr'   r'   r(   r     s:    




zPmlTable.wrap)NNr  )r,   r-   r.   r  r  r   r'   r'   r'   r(   rz     s   

rz   c                   @   s&   e Zd Zdd Zdd Zd	ddZdS )
PmlPageCountc                 C   s   t |  d| _d S rj   )r   r$   second_roundr%   r'   r'   r(   r$   &  s    
zPmlPageCount.__init__c                 C   s   | j }d| _ |S )NT)r%  )r&   r  r'   r'   r(   isSatisfied*  s    zPmlPageCount.isSatisfiedr   c                 C   s   d S r9   r'   )r&   rm   r  r  Z_sWr'   r'   r(   drawOn/  s    zPmlPageCount.drawOnN)r   )r,   r-   r.   r$   r&  r'  r'   r'   r'   r(   r$  %  s   r$  c                   @   s   e Zd Zdd ZdS )PmlTableOfContentsc              	   C   s  || j  | j f}t| jdkr&dg}n| j}d}g }dddddg}t|D ]\}}	|	dd	 \}
}}| j|
 }|r|d
d|fd|ft||jf |j}t	d|
 |dt
d}t||}tt||}|||g qJt||t|d| _| j| j||\| _| _| j| jfS )z>
        All table properties should be known by now.
        r   )r   z!Placeholder for table of contentsr   )ZVALIGNr   r   r   r   ZTOP)ZLEFTPADDINGr)  r*  r   )ZRIGHTPADDINGr)  r*  r   )
TOPPADDINGr)  r*  r   )ZBOTTOMPADDINGr)  r*  r   Nr   r+  r   zleftColLevel%d)r[   parentr  	alignment)Z	colWidthsr   )ZrightColumnWidthr*   Z_lastEntriesr!  ZlevelStylesrU   r4   ZspaceBeforeZ
spaceAfterr   r   r   rM   r   r   Z_tableZwrapOnr0   r   r   )r&   r   r5   ZwidthsZ_tempEntriesZ
lastMarginZ	tableDataZ
tableStyler   entrylevelrE   ZpageNumZleftColStyleZrightColStyleZleftParaZ	rightParar'   r'   r(   r   4  sP    
 

zPmlTableOfContents.wrapNr  r'   r'   r'   r(   r(  3  s   r(  c                   @   s   e Zd Zdd Zdd ZdS )PmlRightPageBreakc                 C   s   d S r9   r'   r%   r'   r'   r(   r$   k  s    zPmlRightPageBreak.__init__c                 C   s2   | j  d s"|| _|| _||fS d | _| _dS Nr   r   r)  r0   rk   r   r   r   r'   r'   r(   r   n  s    zPmlRightPageBreak.wrapNr,   r-   r.   r$   r   r'   r'   r'   r(   r0  j  s   r0  c                   @   s   e Zd Zdd Zdd ZdS )PmlLeftPageBreakc                 C   s   d S r9   r'   r%   r'   r'   r(   r$   x  s    zPmlLeftPageBreak.__init__c                 C   s2   | j  d r"|| _|| _||fS d | _| _dS r1  r2  r   r'   r'   r(   r   {  s    zPmlLeftPageBreak.wrapNr3  r'   r'   r'   r(   r4  w  s   r4  c                   @   s&   e Zd ZdddZdd	 Zd
d ZdS )PmlInputrE   
   r   Nr   c                 C   s:   || _ || _|| _|| _|| _|d k	r*|ng | _|| _d S r9   )r   r   r  r[   defaultoptions	multiline)r&   r[   Z
input_typer   r   r7  r8  r9  r'   r'   r(   r$     s    zPmlInput.__init__c                 G   s   | j | jfS r9   )r   r   )r&   r   r'   r'   r(   r     s    zPmlInput.wrapc              
   C   s  | j }|  |dd | jdkrZtj|| jdd| j| j| j	d |
dd| j| j n| jdkrz|
dd| j| j n| jdkr| jrt|| jddd nt|| jd	dd |
dd| j| j nB| jd
krt|| j| j| jdd| j| j |
dd| j| j |  d S )NZ	Helveticar6  rE   r   )r9  ZradioZcheckboxZYesZOffselect)r0   r   ZsetFontr  pdfformZtextFieldRelativer[   r   r   r9  r  r7  ZbuttonFieldRelativeZselectFieldRelativer8  r   )r&   rY   r'   r'   r(   r     s"    
 

"zPmlInput.draw)rE   r6  r6  r   Nr   )r,   r-   r.   r$   r   r   r'   r'   r'   r(   r5    s       

r5  )OrC   loggingr   hashlibr   htmlr   rB   ior   r   Z	PIL.Imager   r   Zreportlab.pdfbase.pdfformZpdfbaser;  Zreportlab.lib.enumsr   Zreportlab.lib.stylesr   Zreportlab.lib.utilsr   r	   r
   r   Zreportlab.platypus.doctemplater   r   r   Zreportlab.platypus.flowablesr   r   r   r   Z"reportlab.platypus.tableofcontentsr   Zreportlab.platypus.tablesr   r   Zreportlab.rl_configr   Zxhtml2pdf.builders.watermarksr   Zxhtml2pdf.reportlab_paragraphr   Zxhtml2pdf.utilr   r   Zxhtml2pdf.filesr   Zreportlab.graphicsr   r   Zsvglib.svglibr   ImportError	getLoggerr   r   r:   r#   r   r/   r8   r^   Z_ctrobjectr   r   r   rx   r  rz   r$  r(  r0  r4  r5  r'   r'   r'   r(   <module>   s\   

XY 7b "	C7