
    z%i֏                     F   	 d dl mZmZmZmZmZ d dlmZ d dlm	Z	 d dl
mZ d dl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Zd Z G d	 d
      Z G d de      Z G d dej4                  e      Z G d de      Z G d de      Z G d dej<                        Z G d d      Z  G d de      Z! G d dee       Z" G d dee       Z#e$dk(  rd dl%Z% G d d      Z& ed       5 Z'e'jQ                  e)       e'jQ                  d! d"       e'jU                   e&       d#       e'jW                           e,d$        e,d%       	 e'j[                          ddd       yy# e$ r dZY 'w xY w# e.$ r  e,d&        ej^                  d        Y 9w xY w# 1 sw Y   yxY w)(    )Faultdumpsloadsgzip_encodegzip_decode)BaseHTTPRequestHandler)partial)	signatureNTc                     	 |r|j                  d      }n|g}|D ]-  }|j                  d      rt        d|z        t        | |      } / | S )N._z(attempt to access private attribute "%s")split
startswithAttributeErrorgetattr)objattrallow_dotted_namesattrsis        A/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/xmlrpc/server.pyresolve_dotted_attributer   |   sd     

3 !<< :Q>  #a.C! J    c           	          	 t        |       D cg c]*  }|j                  d      st        t        | |            r|, c}S c c}w )Nr   )dirr   callabler   )r   members     r   list_public_methodsr      sI    3 "%S 4v((-WS&12  4 4 4s   /Ac                   \    e Zd Z	 	 	 ddZddZddZd Zd ZddZd Z	d	 Z
d
 Zd Zd Zy)SimpleXMLRPCDispatcherNc                 R    i | _         d | _        || _        |xs d| _        || _        y Nutf-8)funcsinstance
allow_noneencodinguse_builtin_typesselfr&   r'   r(   s       r   __init__zSimpleXMLRPCDispatcher.__init__   s+    
$ +G!2r   c                 "    	 || _         || _        y N)r%   r   )r*   r%   r   s      r   register_instancez(SimpleXMLRPCDispatcher.register_instance   s    	@ !"4r   c                 t    	 |t        | j                  |      S ||j                  }|| j                  |<   |S )N)name)r	   register_function__name__r$   )r*   functionr0   s      r   r1   z(SimpleXMLRPCDispatcher.register_function   sE    	 411==<$$D#

4r   c                     	 | j                   j                  | j                  | j                  | j                  d       y )N)zsystem.listMethodszsystem.methodSignaturezsystem.methodHelp)r$   updatesystem_listMethodssystem_methodSignaturesystem_methodHelpr*   s    r    register_introspection_functionsz7SimpleXMLRPCDispatcher.register_introspection_functions   s<    	 	

$2I2I151L1L,0,B,BD 	Er   c                 T    	 | j                   j                  d| j                  i       y )Nzsystem.multicall)r$   r5   system_multicallr9   s    r   register_multicall_functionsz3SimpleXMLRPCDispatcher.register_multicall_functions   s'    	<
 	

-0E0EFGr   c           	          	 	 t        || j                        \  }}|
 |||      }n| j                  ||      }|f}t        |d| j                  | j
                        }|j                  | j
                  d      S # t        $ r,}t        || j                  | j
                        }Y d }~Ld }~wt        $ rD}t        t        dt        |      d|      | j
                  | j                        }Y d }~d }~ww xY w)N)r(      )methodresponser&   r'   )r&   r'   :r'   r&   xmlcharrefreplace)
r   r(   	_dispatchr   r&   r'   r   BaseExceptiontypeencode)	r*   datadispatch_methodpathparamsmethodresponsefaultexcs	            r   _marshaled_dispatchz*SimpleXMLRPCDispatcher._marshaled_dispatch   s    			"44;Q;QRNFF **66:>>&&9 {HXa(,$--QH t}}.ABB  	5Ut&*mm5H 	aDIs344??H	s$   AA= =	C="B--C=9:C88C=c                 t   	 t        | j                  j                               }| j                  ~t	        | j                  d      r1|t        | j                  j                               z  }t        |      S t	        | j                  d      s!|t        t        | j                              z  }t        |      S )N_listMethodsrD   )setr$   keysr%   hasattrrR   r   sorted)r*   methodss     r   r6   z)SimpleXMLRPCDispatcher.system_listMethods  s    	B djjoo'(==$ t}}n53t}}99;<< g T]]K8324==ABBgr   c                      	 y)Nzsignatures not supported )r*   method_names     r   r7   z-SimpleXMLRPCDispatcher.system_methodSignature)  s    	@ *r   c                 |   	 d }|| j                   v r| j                   |   }nu| j                  it        | j                  d      r| j                  j                  |      S t        | j                  d      s"	 t	        | j                  || j
                        }|yt        j                  |      S # t        $ r Y #w xY w)N_methodHelprD    )	r$   r%   rU   r\   r   r   r   pydocgetdoc)r*   rZ   rL   s      r   r8   z(SimpleXMLRPCDispatcher.system_methodHelp6  s    	O $**$ZZ,F]]&t}}m4}}00== T]]K85 $ + $ 7 7"F ><<'' & s   6!B/ /	B;:B;c                 V   	 g }|D ]/  }|d   }|d   }	 |j                  | j                  ||      g       1 |S # t        $ r2}|j                  |j                  |j                  d       Y d }~jd }~wt
        $ r,}|j                  dt        |      d|d       Y d }~d }~ww xY w)N
methodNamerK   )	faultCodefaultStringr?   rA   )appendrD   r   rb   rc   rE   rF   )r*   	call_listresultscallrZ   rK   rN   rO   s           r   r<   z'SimpleXMLRPCDispatcher.system_multicallU  s    	  	D|,K(^F {F CDE	$   #(??%*%6%68  ! #$04S	3%?A s!   ":	B((A00B(<"B##B(c                 t   	 	 | j                   |   }| || S t        d|z        # t        $ r Y nw xY w| j                  jt	        | j                  d      r| j                  j                  ||      S 	 t        | j                  || j                        }| || S # t        $ r Y nw xY wt        d|z        )Nzmethod "%s" is not supportedrD   )	r$   	ExceptionKeyErrorr%   rU   rD   r   r   r   )r*   rL   rK   funcs       r   rD   z SimpleXMLRPCDispatcher._dispatcht  s    	(	E::f%D V}$:VCDD  		 ==$t}}k2}}..vv>>
)/MM++ #=(	 "  6?@@s   ' 	335!B 	B)(B)FNF)FNN)r2   
__module____qualname__r+   r.   r1   r:   r=   rP   r6   r7   r8   r<   rD   rY   r   r   r    r       sL     37#(3"5H 	EH!CF$*(>>1Ar   r    c                       e Zd Z	 dZdZdZdZ ej                  dej                  ej                  z        Zd Zd Zd Zd	 Zd
 ZddZy)SimpleXMLRPCRequestHandler)/z/RPC2
/pydoc.cssix  Tz
                            \s* ([^\s;]+) \s*            #content-coding
                            (;\s* q \s*=\s* ([0-9\.]+))? #q
                            c                    i }| j                   j                  dd      }|j                  d      D ]T  }| j                  j	                  |      }|s!|j                  d      }|rt        |      nd}|||j                  d      <   V |S )NzAccept-Encodingr]   ,   g      ?r?   )headersgetr   	aepatternmatchgroupfloat)r*   raeer{   vs         r   accept_encodingsz+SimpleXMLRPCRequestHandler.accept_encodings  s    \\/4# 	&ANN((+EKKN !E!Hs$%%++a.!	& r   c                 L    | j                   r| j                  | j                   v S y)NT)	rpc_pathsrJ   r9   s    r   is_rpc_path_validz,SimpleXMLRPCRequestHandler.is_rpc_path_valid  s!    >>99.. r   c                 @   	 | j                         s| j                          y 	 d}t        | j                  d         }g }|rOt	        ||      }| j
                  j                  |      }|sn%|j                  |       |t        |d         z  }|rOdj                  |      }| j                  |      }|y | j                  j                  |t        | dd       | j                        }| j                  d       | j!                  dd       | j"                  Xt        |      | j"                  kD  r@| j%                         j'                  d	d
      }|r	 t)        |      }| j!                  dd	       | j!                  dt-        t        |                   | j/                          | j0                  j3                  |       y # t*        $ r Y [w xY w# t4        $ r}	| j                  d       t7        | j                  d      rs| j                  j8                  r]| j!                  dt-        |	             t;        j<                         }
t-        |
j?                  dd      d      }
| j!                  d|
       | j!                  dd       | j/                          Y d }	~	y d }	~	ww xY w)Ni   zcontent-lengthrt   r   rD      Content-typeztext/xmlgzipr   zContent-EncodingContent-lengthi  _send_traceback_headerzX-exceptionASCIIbackslashreplacezX-traceback0) r   
report_404intrx   minrfilereadrd   lenjoindecode_request_contentserverrP   r   rJ   send_responsesend_headerencode_thresholdr   ry   r   NotImplementedErrorstrend_headerswfilewriteri   rU   r   	traceback
format_excrG   )r*   max_chunk_sizesize_remainingL
chunk_sizechunkrH   rM   qr   traces              r   do_POSTz"SimpleXMLRPCRequestHandler.do_POST  sR   	 %%'OO9	'
 *N .>!?@NA  @



3#ae*, ! 88A;D..t4D| {{66'$T:DIIH$ s#^Z8$$0x=4#8#88--/33FA>A!'28'<H ,,-?H -s3x=/ABJJX&	  3 ! !1  	s# t{{$<=KK66  A7!,,.ELL2DEwO  6-s3	s7   A,G $G 62G F? ?	G
G	JB<JJc                 v   | j                   j                  dd      j                         }|dk(  r|S |dk(  r	 t        |      S | j                  dd|z         | j                  dd	       | j                          y # t        $ r | j                  dd|z         Y Ct        $ r | j                  dd       Y _w xY w)
Nzcontent-encodingidentityr   i  zencoding %r not supported  zerror decoding gzip contentr   r   )	rx   ry   lowerr   r   r   
ValueErrorr   r   )r*   rH   r'   s      r   r   z1SimpleXMLRPCRequestHandler.decode_request_content  s    <<##$6
CIIKz!KvG"4(( s$?($JK)3/ ' P""3(Ch(NO G""3(EFGs   
A; ;B8B87B8c                     | j                  d       d}| j                  dd       | j                  dt        t        |                   | j	                          | j
                  j                  |       y )Ni  s   No such pager   z
text/plainr   )r   r   r   r   r   r   r   r*   rM   s     r   r   z%SimpleXMLRPCRequestHandler.report_404*  s]    3"6)3s8}+=>

"r   c                 b    	 | j                   j                  rt        j                  | ||       y y r-   )r   logRequestsr   log_request)r*   codesizes      r   r   z&SimpleXMLRPCRequestHandler.log_request3  s)    2;;"""..tT4@ #r   N)-r   )r2   rn   ro   r   r   wbufsizedisable_nagle_algorithmrecompileVERBOSE
IGNORECASErz   r   r   r   r   r   r   rY   r   r   rq   rq     sm     -I  H" 

   "$bmm!;=I
	E'N"#Ar   rq   c                   *    e Zd Z	 dZdZedddddfdZy)SimpleXMLRPCServerTFNc                     || _         t        j                  | |||       t        j                  j                  | |||       y r-   )r   r    r+   socketserver	TCPServerr*   addrrequestHandlerr   r&   r'   bind_and_activater(   s           r   r+   zSimpleXMLRPCServer.__init__L  s<     '''j(DUV''dNDUVr   )r2   rn   ro   allow_reuse_addressr   rq   r+   rY   r   r   r   r   9  s,      #,F!ed#'5Wr   r   c                   6    e Zd Z	 edddddfdZd Zd ZddZy)	MultiPathXMLRPCServerTFNc           
      n    t         j                  | |||||||       i | _        || _        |xs d| _        y r"   )r   r+   dispatchersr&   r'   r   s           r   r+   zMultiPathXMLRPCServer.__init__]  sA     	##D$Z$,.?AR	T$ +Gr   c                 $    || j                   |<   |S r-   r   )r*   rJ   
dispatchers      r   add_dispatcherz$MultiPathXMLRPCServer.add_dispatcherg  s    !+r   c                      | j                   |   S r-   r   )r*   rJ   s     r   get_dispatcherz$MultiPathXMLRPCServer.get_dispatcherk  s    %%r   c           	      "   	 | j                   |   j                  |||      }|S # t        $ ra}t        t	        dt        |      d|      | j                  | j                        }|j                  | j                  d      }Y d }~|S d }~ww xY w)Nr?   rA   rB   rC   )	r   rP   rE   r   r   rF   r'   r&   rG   )r*   rH   rI   rJ   rM   rO   s         r   rP   z)MultiPathXMLRPCServer._marshaled_dispatchn  s    
	K''-AA_d,H   	K aDIs344??DH  t}}6IJH	Ks    $ 	BAB		Brm   )r2   rn   ro   rq   r+   r   r   rP   rY   r   r   r   r   U  s-     -G!ed#'5,&r   r   c                   *    e Zd Z	 ddZd Zd ZddZy)CGIXMLRPCRequestHandlerNc                 4    t         j                  | |||       y r-   )r    r+   r)   s       r   r+   z CGIXMLRPCRequestHandler.__init__  s    ''j(DUVr   c                 ^   	 | j                  |      }t        d       t        dt        |      z         t                t        j                  j                          t        j                  j                  j                  |       t        j                  j                  j                          y )NzContent-Type: text/xmlContent-Length: %d)rP   printr   sysstdoutflushbufferr   )r*   request_textrM   s      r   handle_xmlrpcz%CGIXMLRPCRequestHandler.handle_xmlrpc  ss    -++L9&'"S]23



)

!r   c                 &   	 d}t         j                  |   \  }}t        j                  j                  |||dz  }|j                  d      }t        d||fz         t        dt        j                  j                  z         t        dt        |      z         t                t        j                  j                          t        j                  j                  j                  |       t        j                  j                  j                          y )Nr   )r   messageexplainr#   zStatus: %d %szContent-Type: %sr   )r   	responseshttpr   DEFAULT_ERROR_MESSAGErG   r   DEFAULT_ERROR_CONTENT_TYPEr   r   r   r   r   r   )r*   r   r   r   rM   s        r   
handle_getz"CGIXMLRPCRequestHandler.handle_get  s    	 1;;DA;;44   ??7+ow/0 4;;#I#IIJ"S]23



)

!r   c                 X   	 |4t         j                  j                  dd       dk(  r| j                          y 	 t	        t         j                  j                  dd             }|t        j                  j                  |      }| j                  |       y # t
        t        f$ r d}Y Fw xY w)NREQUEST_METHODGETCONTENT_LENGTHrt   )osenvironry   r   r   r   	TypeErrorr   stdinr   r   )r*   r   lengths      r   handle_requestz&CGIXMLRPCRequestHandler.handle_request  s    	 JJNN+T2e;OORZZ^^,<dCD #"yy~~f5|, 	* s   )B B)(B)rl   r-   )r2   rn   ro   r+   r   r   r   rY   r   r   r   r   |  s    =W
""2-r   r   c                   <    e Zd Z	 di i i fdZdi i i dfdZd Zd Zy)ServerHTMLDocNc                 ~   	 |xs | j                   }g }d}t        j                  d      }|j                  ||      x}	rT|	j	                         \  }
}|j                   ||||
              |	j                         \  }}}}}}|r1 ||      j                  dd      }|j                  d|d|d       n|r-dt        |      z  }|j                  d|d ||      d       n|r-d	t        |      z  }|j                  d|d ||      d       ng|||d
z    dk(  r$|j                  | j                  ||||             n8|r|j                  d|z         n!|j                  | j                  ||             |}|j                  ||      x}	rT|j                   |||d               dj                  |      S )Nr   zS\b((http|https|ftp)://\S+[\w/]|RFC[- ]?(\d+)|PEP[- ]?(\d+)|(self\.)?((?:\w|\.)+))\b"z&quot;z	<a href="z">z</a>z(https://www.rfc-editor.org/rfc/rfc%d.txtz!https://peps.python.org/pep-%04d/r?   (zself.<strong>%s</strong>r]   )escaper   r   searchspanrd   groupsreplacer   namelinkr   )r*   textr   r$   classesrW   rf   herepatternr{   startendallschemerfcpepselfdotr0   urls                      r   markupzServerHTMLDoc.markup  s   	F&4;; ** < = ~~dD11e1JE3NN6$tE"23438<<>0Cc7DSk))#x8SAB@3s8KVC[IJ9CHDVC[IJc#a%C't}}T7E7KL9D@At}}T7;<D) ~~dD11e1* 	vd45k*+wwwr   c                    	 |xr |j                   xs ddz   |z   }d}	d| j                  |      d| j                  |      d}
t        |      rt        t	        |            }nd}t        |t              r|d   xs |}|d   xs d}nt        j                  |      }|
|z   |	xr | j                  d	|	z        z   }| j                  || j                  |||      }|xr d
|z  }d|d|dS )Nr]   r   z	<a name="z
"><strong>z</strong></a>z(...)r   r?   z'<font face="helvetica, arial">%s</font>z<dd><tt>%s</tt></dd>z<dl><dt>z</dt>z</dl>
)r2   r   r   r   r
   
isinstancetupler^   r_   greyr  	preformat)r*   objectr0   modr$   r   rW   clanchornotetitleargspec	docstringdecldocs                  r   
docroutinezServerHTMLDoc.docroutine  s    I$*c1D8 KKT!24 F)F+,GGfe$Qi*7Gq	RIV,Iw$ #A49984?,A B kkt~~ugw@2,s2-1377r   c                    	 i }|j                         D ]  \  }}d|z   ||<   ||   ||<    | j                  |      }d|z  }| j                  |      }| j                  || j                  |      }	|	xr d|	z  }	|d|	z  z   }g }
t        |j                               }|D ](  \  }}|
j                  | j                  |||             * || j                  dddj                  |
            z   }|S )	Nz#-z)<big><big><strong>%s</strong></big></big>z<tt>%s</tt>z
<p>%s</p>
)r$   Methods	functionsr]   )
itemsr   headingr  r  rV   rd   r  
bigsectionr   )r*   server_namepackage_documentationrW   fdictkeyvalueheadresultr  contentsmethod_itemss               r   	docserverzServerHTMLDoc.docserver  s   ?!--/ 	&JCE#J :E%L	& kk+.:[Hd#kk/G)mc)-#--gmmo.& 	FJCOODOOE3eODE	F$//{BGGH$57 7 r   c                 *    	 d}d|z  }d|d|d|dS )Nrs   z1<link rel="stylesheet" type="text/css" href="%s">zI<!DOCTYPE>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Python: z	</title>
z</head><body>z</body></html>rY   )r*   r  r%  css_pathcss_links        r   pagezServerHTMLDoc.page"  s/    "? 	 ',XxA 	Ar   )r2   rn   ro   r  r  r'  r+  rY   r   r   r   r     s2    A"&b"b % N ,0R8:4Ar   r   c                   ,    e Zd Z	 d Zd Zd Zd Zd Zy)XMLRPCDocGeneratorc                 .    d| _         d| _        d| _        y )NzXML-RPC Server DocumentationzGThis server exports the following methods through the XML-RPC protocol.)r  server_documentationserver_titler9   s    r   r+   zXMLRPCDocGenerator.__init__7  s!    9 	! ;r   c                     	 || _         y r-   )r0  )r*   r0  s     r   set_server_titlez#XMLRPCDocGenerator.set_server_title?  s    F(r   c                     	 || _         y r-   )r  )r*   r  s     r   set_server_namez"XMLRPCDocGenerator.set_server_nameD  s    E&r   c                     	 || _         y r-   )r/  )r*   r/  s     r   set_server_documentationz+XMLRPCDocGenerator.set_server_documentationI  s    A$8!r   c                    	 i }| j                         D ]  }|| j                  v r| j                  |   }n| j                  d d g}t        | j                  d      r| j                  j	                  |      |d<   t        | j                  d      r| j                  j                  |      |d<   t        |      }|dk7  r|}n1t        | j                  d      s	 t        | j                  |      }n|}	 ||<    t               }|j                  | j                  | j                  |      }|j                  t        j                  | j                         |      S # t        $ r |}Y tw xY w)N_get_method_argstringr   r\   r?   rm   rD   )r6   r$   r%   rU   r8  r\   r
  r   r   r   r'  r  r/  r+  htmlr   r0  )r*   rW   rZ   rL   method_info
documenterdocumentations          r   generate_html_documentationz.XMLRPCDocGenerator.generate_html_documentationN  sW   	! 224 	*Kdjj(K0*#Tl4==*AB%)]]%H%H%UKN4==-8%)]]%>%>{%KKN#K0,.(F <-!9$(MM$/"& )F
 $*GK 7	*: #_
",, $ 0 0 $ 9 9 ' t{{4+<+<=}MM# * -!,-s   EE&%E&N)r2   rn   ro   r+   r2  r4  r6  r=  rY   r   r   r-  r-  0  s!    ;)
'
9
1Nr   r-  c                       e Zd Z	 d Zd Zy)DocXMLRPCRequestHandlerc                 ,   t         j                  j                  t         j                  j                  t                    }t         j                  j                  |ddd      }t        |d      5 }|j                         cd d d        S # 1 sw Y   y xY w)Nz..
pydoc_dataz
_pydoc.cssrb)mode)r   rJ   dirnamerealpath__file__r   openr   )r*   r  	path_herer)  fps        r   _get_cssz DocXMLRPCRequestHandler._get_css  se    GGOOBGG$4$4X$>?	77<<	4|L(& 	"779	 	 	s   0B

Bc                    	 | j                         s| j                          y | j                  j                  d      rd}| j	                  | j                        }n+d}| j
                  j                         j                  d      }| j                  d       | j                  dd|z         | j                  dt        t        |                   | j                          | j                  j                  |       y )	Nz.cssztext/cssz	text/htmlr#   r   zContent-Typez%s; charset=UTF-8r   )r   r   rJ   endswithrJ  r   r=  rG   r   r   r   r   r   r   r   )r*   content_typerM   s      r   do_GETzDocXMLRPCRequestHandler.do_GET  s    	 %%'OO99f%%L}}TYY/H&L{{>>@GGPH3)<|)KL)3s8}+=>

"r   N)r2   rn   ro   rJ  rN  rY   r   r   r?  r?    s    #r   r?  c                   "    e Zd Z	 edddddfdZy)DocXMLRPCServerTFNc           
      f    t         j                  | |||||||       t        j                  |        y r-   )r   r+   r-  r   s           r   r+   zDocXMLRPCServer.__init__  s5     	##D$$.:K$5	7 	##D)r   )r2   rn   ro   r?  r+   rY   r   r   rP  rP    s     -D!ed#'5*r   rP  c                       e Zd Z	 d Zd Zy)DocCGIXMLRPCRequestHandlerc                 z   	 | j                         j                  d      }t        d       t        dt        |      z         t                t        j
                  j                          t        j
                  j                  j                  |       t        j
                  j                  j                          y )Nr#   zContent-Type: text/htmlr   )	r=  rG   r   r   r   r   r   r   r   r   s     r   r   z%DocCGIXMLRPCRequestHandler.handle_get  s    	 335<<WE'("S]23



)

!r   c                 X    t         j                  |        t        j                  |        y r-   )r   r+   r-  r9   s    r   r+   z#DocCGIXMLRPCRequestHandler.__init__  s    ((.##D)r   N)r2   rn   ro   r   r+   rY   r   r   rS  rS    s    " *r   rS  __main__c                   &    e Zd Zd Z G d d      Zy)ExampleServicec                      y)N42rY   r9   s    r   getDatazExampleService.getData  s    r   c                       e Zd Zed        Zy)ExampleService.currentTimec                  >    t         j                   j                         S r-   )datetimenowrY   r   r   getCurrentTimez)ExampleService.currentTime.getCurrentTime  s    ((,,..r   N)r2   rn   ro   staticmethodra  rY   r   r   currentTimer]    s    / /r   rc  N)r2   rn   ro   r[  rc  rY   r   r   rX  rX    s    		/ 	/r   rX  )	localhosti@  c                     | |z   S r-   rY   )xys     r   <lambda>rh    s
    QqS r   add)r   z&Serving XML-RPC on localhost port 8000zKIt is advisable to run this example server within a secure, closed network.z&
Keyboard interrupt received, exiting.)T)0xmlrpc.clientr   r   r   r   r   http.serverr   	functoolsr	   inspectr
   r9  r   r   r   r   r   r^   r   fcntlImportErrorr   r   r    rq   r   r   r   r   HTMLDocr   r-  r?  rP  rS  r2   r_  rX  r   r1   powr.   r=   r   serve_foreverKeyboardInterruptexitrY   r   r   <module>ru     s  eT H G .      
 	 	  04IA IAVPA!7 PAdW///W8%. %N?-4 ?-JmAEMM mA^ON ONb&#8 &#P**** *$;$6*4 z/ / 
/	0 F  %  %8  !1d K++-67[\	  "  u  E^ ! 	;<CHHQK	 s=   E$ ,AF
E2$E/.E/2FFFFF 