
    9ip                     F   S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	J
r
  S SKrS SKrS SKJs  Jr  S SKJrJrJr  S SKJr  S SKJr  S SKJrJr  S S	KJr  S S
KJrJ r   S SK!J"r"J#r#  S SK$J%r%  S SK&J'r'  SSK(J)r)  SSK*J+r+  SSK,J-r-J.r.J/r/J0r0  S\Rb                  S\Rb                  S\24S jr3S\Rb                  S\44S jr5S\4\6   S\4\Rn                     4S jr8\Rr                  Rt                  S 5       r;S r<S\Rz                  R|                  S\\
\6      S\?\@\6\Rz                  R                  4   \@\6\Rz                  R                  4   4   4S jrBS\Rz                  R|                  S \\
\6      S!\@\6\Rz                  R                  4   S"\@\6\Rz                  R                  4   SS4
S# jrC S=S\Rb                  S$\
\Rb                     S%\
\4\6      S\4S& jjrD S=S\Rz                  R|                  S\\
\6      S \\
\6      S\Rb                  S$\
\Rb                     S%\
\4\6      4S' jjrES(\Rz                  R|                  S)\.S*\@\6\	4   S+\@\6\	4   SS4
S, jrF " S- S.\G5      rH " S/ S0\Rz                  R|                  \HS19rIS2\Rz                  R|                  S3\-S\I4S4 jrJS5 rKS6\4\Rz                  R                     S7\@\R                  \'4   S8\4\Rn                     4S9 jrM S>S3\-S\Rz                  R|                  4S: jjrN " S; S<\R                  R                  5      rQg)?    N)Sequence)chain)AnyOptional),_enter_enable_graph_inputs_of_type_nn_module+_exit_enable_graph_inputs_of_type_nn_module#_get_graph_inputs_of_type_nn_module)_convert_range_to_int)"_check_input_constraints_for_graph)_assign_attr	_AttrKind)!_pytree_subclasses_that_lose_info)_PyTreeCodeGen_PyTreeInfo)
NodeSourceNodeSourceAction)	try_solve)ValueRanges   )_remove_effect_tokens)reorder_kwargs)ExportedProgramExportGraphSignature	InputKind
OutputKindselfotherreturnc                 *   ^^ S mUU4S jmT" X5      $ )z
Refinement of TreeSpec.__eq__ where, e.g., torch.Size(...) matches tuple(...).
See _pytree_subclasses_that_lose_info in proxy_tensor.py for more details.
c                 @    [        [        R                  " X 5      5      $ N)strr   get)ts    T/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/torch/export/_unlift.py_normalize_type eq_spec.<locals>._normalize_type.   s    488>??    c                 R  > XL a  gT" U R                   5      T" UR                   5      :w  a  gU R                  UR                  :w  a  g[        U R                  5      [        UR                  5      :w  a  g[	        U4S j[        U R                  UR                  5       5       5      $ )NTFc              3   8   >#    U  H  u  pT" X5      v   M     g 7fr!    ).0ab_match_normalized_structures      r%   	<genexpr>?eq_spec.<locals>._match_normalized_structure.<locals>.<genexpr>:   s"      
? (--?s   )typecontextlenchildren_specsallzip)r-   r.   r/   r&   s     r%   r/   ,eq_spec.<locals>._match_normalized_structure1   s    6166"oaff&==99		!q C(8(8$99 
A,,a.>.>?
 
 	
r(   r+   )r   r   r/   r&   s     @@r%   eq_specr9   (   s    @
 't33r(   in_specc                     [        X5      n[        R                  " X45      u  pE[        XR5      (       d  [	        SU SU S35      eU$ )Nz>Trying to flatten user inputs with exported input tree spec: 
z-
but actually got inputs with tree spec of: 
zr.
Please check that the inputs have the same number and type of args and kwargs as the ones you used when tracing.)r   pytreetree_flatten_with_pathr9   
ValueError)argskwargsr:   reordered_kwargsflat_args_with_pathreceived_specs         r%   _check_inputs_matchrD   B   sg    %f6)/)F)F	 *& =**Mi <o AA
 	
 r(   guards_codepaths_of_placeholdersc                    SSK nSSKJn  / n/ nU  H  nXfp[        U5       H  u  pUR	                  S[
        R                  " U
5      -   SU	 S35      nUR	                  S[
        R                  " U
5      -   U
S   R                  [
        R                  " U
SS 5      -   5      nM     UR                  U5        UR                  UR	                  SS	5      5        M     S
n[        XE5       H0  u  pUR                  UR                  USS95      nUSU SU S3-  nM2     US-  n0 UEn[        X5        [        5       n[        R                  R!                  US   5      Ul        SUl        U$ )a  
Generates Python code given guards code and paths of placeholders.
We assume that, based on source information,
- the tracer generates the guards code
- the input spec generates the paths of placeholders.

Example:

Suppose we are given the guards code "L['z']['k'].size()[1] == 3"
and we are given that ['z']['k'] is the path of placeholder #2.
Then we will generate:
```
torch._assert(
    args[2].size()[0] == 3,
    "Guard failed: z['k'].size()[0] == 3",
)
```

FAQ: Why do we generate code based on (flattened) args instead of
the original (unflattened) inputs? Because this would require
inserting an additional pytree.unflatten call in our graph.

FAQ: Why do we not emit RuntimeError on guard failure as we used to?
Because it is inconvenient :/, get used to AssertionError instead.
r   N)SYMPY_INTERPLzargs[]r   
 z
def _(*args):
eval)modez  torch._assert(z, "Guard failed: z")
z	  return
_T)ast%torch.fx.experimental.symbolic_shapesrH   	enumeratereplacer<   keystrkeyappendr7   unparseparseexecGuardsFntorch_dynamodont_skip_tracingforward
_is_impure)rE   rF   rP   rH   actual_guards_codeshadow_guards_codecr-   sidxpathcode_stractualshadow_shadow	namespace	guards_fns                    r%   _convert_guards_code_to_fnrl   U   sh   < B1"#89IC		#d 33uSE^DA		fmmD))QfmmDH55A	 : 	!!!$!!!))D""56  #H0E ++ciiVi<=&vh.?yMM F H !< I 
I77	#GIIr(   c                     [        XU R                  5      n[        U R                  R	                  SS9UU R
                  5        g )Nplaceholderop)rD   _in_specr   graph
find_nodesrange_constraints)r   r?   r@   rB   s       r%   #_check_input_constraints_for_moduleru      s<    -dDMMJ&

/r(   c                     U R                   (       d  g [        U S5      (       a  [        XU R                  5        g [	        XU5        g )N
_guards_fn)validate_inputshasattrrD   rq   ru   )r   r?   r@   s      r%   !_check_input_constraints_pre_hookrz      s:    
 t\""D$--8 (F;r(   gmlifted_inputsc                 2   0 n0 nU R                   R                   Vs/ s H  oDR                  S:X  d  M  UPM     nn[        U5      [        U5      :X  d   e[	        XQ5       GH  u  pgUc  XcUR
                  '   M  U R                   R                  U5         [        R                  " 5          [        R                  " S5        U R                   R                  U5      nSSS5        UR                  W5        UR                  n	U R                   R                  U5        Xl        [        US[        R                   [        R"                  /5      /UR                  S'   XU'   SSS5        GM
     X#4$ s  snf ! , (       d  f       N= f! , (       d  f       GM5  = f)zS
Unlift inputs referring to params/buffers/constants as getattr nodes in the
graph
rn   Nignore!ExportedProgram.module().unlift()	from_node)rr   nodesrp   r4   r7   nameinserting_afterwarningscatch_warningssimplefilterget_attrreplace_all_uses_withmeta
erase_noder   r   CREATEREPLACE)
r{   r|   unlifted_name_to_nodeinput_name_to_nodenodeplaceholder_nodes
input_nodelifted_nodegetattr_nodemetadatas
             r%   _unlift_inputs_as_getattrr      sZ    *,((..U.$GG}<T.U}%6!7777#&'8#H
2<z/ ))*5 ,,.))(3#%88#4#4[#AL / 00>%??##J/$,!";)002B2J2JK2!!+. 6Bk2% 65 $I2 !447 V /.	 65s/   E0E0F+2E5BF5
F?F
F	mutated_outputsr   r   c                 `  ^ U R                   R                  5       n[        R                  " UR                  5      S   n[        U5      [        U5      :X  d   e/ n0 m[        XQ5       H  u  pxUc  UR                  U5        M  X;   a  X(   n	OX;   a  X8   n	O[        SU S35      eU R                   R                  U5         U R                   R                  [        R                  R                  R                  R                  X45      n
U
TU'   SSS5        M     [!        U4S jU 5       5      nU R                   R                  U5         U R                   R#                  U5      nUR%                  U5        U R                   R'                  U5        UR(                  Ul        UR*                  R-                  UR*                  5        [/        US[0        R2                  [0        R4                  /5      /UR*                  S'   SSS5        g! , (       d  f       GM  = f! , (       d  f       g= f)zh
Find the all the buffers and inputs that were mutated and insert copy_
operators to reflect mutations.
r   NzCould not find z  in either buffer or input nodesc              3   >   >#    U  H  nUT;   a  TU   OUv   M     g 7fr!   r+   )r,   r   return_nodes_to_copys     r%   r0   -_insert_copy_for_mutations.<locals>.<genexpr>  s+      %D '+.B&BT"L%s   r   r   )rr   output_noder<   tree_flattenr?   r4   r7   rV   RuntimeErrorinserting_beforecall_functionr[   opsatencopy_defaulttupleoutputr   r   r   r   updater   r   r   r   )r{   r   r   r   r   outputsuser_output_nodesreturn_nodemutated_node_namemutated_node	copy_nodeoutput_args
new_outputr   s                @r%   _insert_copy_for_mutationsr      s    ((&&(K!!+"2"23A6Gw<3////*-g*G&$$$[150CL4-@L!"3!44TU  XX&&{3..		$$,,|.II 1: -	 43 +H(  % K 
	"	";	/XX__[1
))*5
K(%**
{//03!((*:*B*BC(

$ 
0	/ 43 
0	/s   AHB7H
H	
H-out_specforward_arg_namesc                 .   U(       a  UnOU R                   [        :X  a  U R                  S:X  a  U R                  S   R                   [        :X  a  U R                  S   R                   [        :X  a^  [        U R                  S   R                  5       Vs/ s H  nSU 3PM
     nnUR                  U R                  S   R                  5        O([        U R                  5       Vs/ s H  nSU 3PM
     nn[        [        UU U5      5      $ s  snf s  snf )zC
Create the codegen for the graph module based on the in/out specs
   r   r   arg_)
r2   r   num_childrenr5   dictrangeextendr3   r   r   )r:   r   r   namesis        r%   _get_codegenr     s     !  A%""1%**e3""1%**d2 &+7+A+A!+D+Q+Q%RS%R4s%RSW++A.667%*7+?+?%@A%@4s%@A	
  T Bs   D&Dc                     [        X5      u  pg[        XXg5        [        X4U5      U R                  l        U R                  R                  5         U R                  5         U $ )a  
Args:
    lifted_inputs: A list matching the graph module's input nodes. For
    an input node that is referring to a lifted parameter/buffer, this
    list will contain the fqn the corresponding attribute. Otherwise, this
    list will contain None. This is used to unlift the lifted parameters as
    get_attr nodes.

    mutated_outputs: A list matching the graph module's output nodes. For
    an output node that is referring to a mutated buffer or user input, this
    list will contain the name of the corresponding buffer or user input
    that needs to be mutated. Otherwise, this list will contain None. This
    is used to re-insert an inplace copy_ operator to copy the mutated
    values back to the original node.
)r   r   r   rr   _codegenlint	recompile)r{   r|   r   r:   r   r   r   r   s           r%   _unliftr   ;  sW    . 1J
1- 
2 %W8IJBHHHHMMOLLNIr(   new_gmgraph_signature
state_dict	constantsc           	         [        UR                  5      nUR                   H/  nXT;   a  SnX5   nOSnX%   n[        XpU[        R
                  US9  M1     UR                   H!  nX%   n[        UU U[        R                  S9  M#     [        UR                  UR                  5       H!  nX5   n[        UU U[        R                  S9  M#     g )NFT	attr_kind
persistentr   )setnon_persistent_buffersbuffersr   r   BUFFER
parameters	PARAMETERr   lifted_custom_objslifted_tensor_constantsCONSTANT)r   r   r   r   r   r   r   values           r%   _register_attrs_to_new_gmr   ^  s     !!G!GH'')JOEJ$E49+;+;
	
 (  ** ))		
 + **O,S,S ((		
	r(   c                   6   ^  \ rS rSrSrS rSU 4S jjrSrU =r$ )_StatefulGraphModuleFactoryi  zG
Metaclass that ensures a private constructor for _StatefulGraphModule
c                 L    [        U R                   SU R                   S35      e)N.z has no public constructor. )	TypeError
__module____qualname__)clsr?   r@   s      r%   __call__$_StatefulGraphModuleFactory.__call__  s,    ~~a 0 011MN
 	
r(   c                 "   > [         TU ]  UUUS9$ )Nrt   )superr   )r   rootrr   rt   	__class__s       r%   _create#_StatefulGraphModuleFactory._create  s#    w/   
 	
r(   r+   r!   )	__name__r   r   __firstlineno____doc__r   r   __static_attributes____classcell__r   s   @r%   r   r     s    


 
r(   r   c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )_StatefulGraphModulei  c                 R   > [         TU ]  X5        U=(       d    / U l        SU l        g )NT)r   __init__rt   rx   )r   r   rr   rt   r   s       r%   r   _StatefulGraphModule.__init__  s%    %!2!8b#r(   )rt   rx   r!   )r   r   r   r   r   r   r   r   s   @r%   r   r     s    $ $r(   r   )	metaclassplain_graph_moduleepc           	        ^ [         R                  U U R                  US9n[        UR                  5      mUR                  U4S j5        UR                  [        SS9  UR                  U4S jSS9  0 nUR                  R                   H  nUR                  U5      nUR                  (       a0  [        R                  " SU S35        UR                  5       nXtU'   UnUR                  S	5      Gt p[         R"                  R$                  R'                  X85      n
[)        X5        [+        XcU[,        R.                  S
9  M     UR0                  R3                  5        H  u  p[         R"                  R$                  R5                  X;5      (       a  M5  [7        U[         R8                  5      (       aK  UR                  (       a:  [        R                  " SU S35        X;   a  XL   nOUR                  5       nXU'   Un[+        UUU[,        R.                  S
9  M     UR                  R:                   H-  n[+        U R                  U5      UU[,        R<                  SS9  M/     U$ )Nr   c                     > [        T5      $ r!   )r   r?   r@   module_typess     r%   <lambda>/_create_stateful_graph_module.<locals>.<lambda>  s     L!
r(   T)with_kwargsc                     > [        T5      $ r!   )r   r   s     r%   r   r     s     K!
r(   )always_callzA model attribute `z` requires gradient. but it's not properly registered as a parameter. torch.export will detach it and treat it as a constant tensor but please register it as parameter instead.r   r   z` requires gradient but it's not properly registered as a parameter. torch.export will detach it and treat it as a constant tensor but please register it as parameter instead.Fr   )r   r   rr   r	   example_inputsregister_forward_pre_hookrz   register_forward_hookr   r   
get_bufferrequires_gradr   warndetachrsplitr[   fxgraph_module_get_attr_via_attr_listdelattrr   r   r   r   items	_has_attr
isinstanceTensorr   r   )r   rt   r   stateful_gm"original_tensor_to_detached_tensorconstant_fqnbufferdetached_bufferprefixfieldsubmod
const_namer   detached_valuer   s                 @r%   _create_stateful_graph_moduler    s;   
 '..  + / K 7r7H7HIL))	

 )))t *  %%	
 	 &  *,& **BB ''5MM%l^ 4? @ %mmoO9Hv6$F%,,S1&&>>{SV,)BTBTU) C.  \\//1
xx$$..{GG%..&&MM-j\ :G H B B I).DR5A .#,,	! 24 $$;;))&1&&	
 < r(   c                     U u  p#UR                   " U0 UD6R                  n[        R                  " U5      nU VVs/ s H  u  pgUPM	     snn$ s  snnf )z
Generate paths of placeholders, needed for generating the guards function.

NOTE: Here we make use of the example inputs used for export as well as
the signature of the unlifted graph module (not preserved by export).
)bind	argumentsr<   tree_leaves_with_path)r   	signaturer?   r@   ctxflat_example_inputs_with_pathsre   rO   s           r%   _get_input_pathsr    sQ     "LD
..$
)&
)
3
3C%+%A%A#%F" >? >WTD >???s   Aplaceholdersrt   paths_for_placeholdersc                   ^^^^ / m/ m0 mUUUU4S jn[        X5       GHJ  u  pES[        R                  " U5      -   nUR                  S   n[	        U[
        5      (       a  TR                  U SU 35        [	        U[        5      (       am  U[        R                  :X  a  TR                  U S35        M  U[        R                  * :X  a  TR                  U S35        M  TR                  U SU 35        M  [	        U[        5      (       a  TR                  U SU S35        GM
  [	        U[        R                  5      (       a:  UR                  R                  T;   a   U" UR                  R                  U5        GMc  [	        U[        R                  5      (       d  GM  [!        UR"                  5       H  u  pS[        R                  " U5      -   S	U S
3-   n[	        U	[
        5      (       a  TR                  U SU	 35        MR  [	        U	[        R                  5      (       d  Ms  U	R                  R                  T;   d  M  U" U	R                  R                  U5        M     GMM     0 n
[        R$                  R&                  R(                  R+                  5       nT H  u  pl[-        [/        UR0                  5      5      nUT;   a  M+  X;   a\  UR3                  U
5      nTR                  UR5                  [6        R8                  " U[6        R:                  " U5      5      5      5        M  [=        [6        R8                  " U[6        R:                  " U5      5      U5      nUc  M  US   nUX'   M     T$ )a   
Guards generated by the tracer include conditions observed in code, but
but do not include some additional checks we typically do in export.
For example, when dynamic shapes get specialized, are specified to be
within a range, or are specified to be in some equational relation,
corresponding input invalidation is done within a pre_hook, specifically,
`_check_input_constraints_for_graph`.

Here we generate guards corresponding to the checks that happen in
`_check_input_constraints_for_graph`, and add them to the guards already
generated by the tracer. In the future, it may be worthwhile to separate
them so that we can allow clients to turn off one but not the other.
(Looking at you, AOTI.)

NOTE: We should eventually reconcile this logic with `build_guards` that
is used by AOT Precompile.
c                 X  > [        U R                  5      S:X  a  TR                  X45        U T;   a  TU    nTR                  U SU 35        g UTU '   [        TU    5      u  p4US:  a  TR                  U SU 35        U[        R
                  :  a  TR                  U SU 35        g g )Nr    == r   z >= z <= )r4   free_symbolsrV   r
   mathinf)	exprsrcorig_srcmin_valmax_valdeferred_expressionsnew_guards_codert   sourcess	        r%   handle_symint2_get_input_guards_for_graph.<locals>.handle_symint/  s    t  !Q& !''47? t}H""cU$xj#9:GDM45Ft5LMG{&&#d7)'<=!&&#d7)'<= "r(   rI   valr$  z == math.infz == -math.infz == ''z.size()[rJ   r   )r7   r<   rT   r   r  intrV   floatr&  r'  r"   r[   SymIntr   r(  r  rR   shapeutils_sympyprintersPythonPrinternextiterr%  subsdoprintsympyEqSymbolr   )r   rt   r!  r0  rn   re   r)  r   r   dimunification_map
py_printerr(  symbolsubstitutionsolution
definitionr-  r.  r/  s    `               @@@r%   _get_input_guards_for_graphrJ    s   . O%'G> >* !FFMM$''&dC  ""cU$tf#56dE""txx&&#l';<$(("&&#m'<=&&#d4&'9:c""""cU%vQ#78ell++		BS0S$))..#.ell++#DJJ/FMM$//HQCq/Ac3''#**cU$se+<=sELL11chhmmGX6X "#((--5 0' G< 79O##,,::<J *	d4,,-.W  $  99_5L""""588L%,,s:K#LM !$S0A!BFKH#%a[
*4'1 *4 r(   c           	      	   [         R                  " 5       nUb.  SUR                  R                  ;   a  SnOUR                  nUb  M.  U R
                  S   R                  S:w  a  [        U 5      n [        R                  R                  U R                  [        R                  " U R                  5      5      n[        X0R                   U R"                  U R$                  5        U R&                  S   R(                  =n(       a  UR*                  OS nU R                   R,                   Vs/ s H]  nUR.                  [0        R2                  [0        R4                  [0        R6                  [0        R8                  4;   a  UR:                  OS PM_     nnU R                   R<                   Vs/ s HN  nUR.                  [>        R@                  [>        RB                  [>        RD                  4;   a  UR:                  OS PMP     n	nU R                  RF                   V
s0 s H!  oRH                  S:w  d  M  U
RJ                  U
_M#     nn
U R                  RF                   V
s0 s H!  oRH                  S:X  d  M  U
R:                  U
_M#     nn
UR                  RF                   Hu  n
S nU
RH                  S:X  a  URM                  U
R:                  5      nOURM                  U
RJ                  5      n[O        US[P        RR                  5      /U
RT                  S'   Mw     U RV                  RX                  c   e[[        UUU	U RV                  RX                  U RV                  R\                  US9n[_        X0R`                  U 5      nURT                  Rc                  U R                  RT                  5        UR                  nURe                  SS	9nU(       Ga  U(       Ga  U Rf                  (       a  [i        U Rf                  [         R(                  " URj                  5      5      n[m        UU R`                  U5      nURo                  U Rp                  5        [s        UU5      Ul:        [        R                  Rv                  Ry                  U5      nUR{                  US
   5         UR}                  S[        U5      5      n
UU
RT                  S'   S S S 5        UR                  5         U$ s  snf s  snf s  sn
f s  sn
f ! , (       d  f       N4= f)N
executorchFr   TRAININGrn   zExportedProgram.module()r   )r   ro   rw   nn_module_stack)Ainspectcurrentframef_codeco_filenamef_back	verifiersdialectr   r[   r  GraphModuler  copydeepcopyrr   r   r   r   r   module_call_graphr  r   input_specskindr   r   CONSTANT_TENSORr   
CUSTOM_OBJtargetoutput_specsr   BUFFER_MUTATIONUSER_INPUT_MUTATIONPARAMETER_MUTATIONr   rp   r   r#   r   r   r   r   	call_specr:   r   r   r  rt   r   rs   r   r  r^   rJ  r   _guards_coderl   rw   _utils#first_call_function_nn_module_stackr   call_moduler   r   )r   check_guardsframer   sigr   r:   r|   r   r   r   source_node_dictplaceholder_source_node_dictsource_node	unlift_gmrr   r   input_pathsrE   root_nn_module_stacks                       r%   &_unlift_exported_program_lifted_statesrr    s6      "E

5<<333 L	 
 
||A*,"2&XX!!"//4==3JKFf&8&8"--V)+)=)=a)@)J)J"J#"JQU  ))55* 6G ||  ))##$$	 NN  6  *4 **77, 8H }}**..-- OO  8  , %'HHNN$2Dgg6N		4N  
 ')hhnn$&4d=8PTn ! $ ""77m#6::4;;GK*..tyy9K* ''"
		+ # <<+++

+F .f6J6JBOINN"//../ OOE##}#5L):):&i//0
 2"..
 	2??+9+{S	$xxRR 
 ""<#34$$\53FGD+?DII'( 5 	k*,$\ 54s2   (A$S&ASS#,S#S(.S(+S--
S;c                       \ rS rSrSrS rSrg)rZ   i  z#
Module class for guard functions.
c                     g r!   r+   )r   r?   s     r%   r^   GuardsFn.forward  s    r(   r+   N)r   r   r   r   r   r^   r   r+   r(   r%   rZ   rZ     s    r(   rZ   r!   )T)RrX  rP  r&  r   collections.abcr   	itertoolsr   typingr   r   r@  r[   torch.utils._pytreer8  _pytreer<   torch._export.non_strict_utilsr   r   r	   @torch._export.passes.add_runtime_assertions_for_constraints_passr
   torch._export.utilsr   torch.export.unflattenr   r   "torch.fx.experimental.proxy_tensorr   torch.fx.graphr   r   torch.fx.tracebackr   r   torch.utils._sympy.solver   torch.utils._sympy.value_rangesr   _remove_effect_tokens_passr   _tree_utilsr   exported_programr   r   r   r   TreeSpecboolr9   listrD   r"   KeyPathrl   r\   disableru   rz   r  rW  r   r   Noder   r   r   r   r   r2   r   r   r  r  rB  rJ  rr  nnModulerZ   r+   r(   r%   <module>r     s       $      $ $ 
 C : P 6 ; . 7 = ' 4&// 4&// 4d 44v 4 &HcH/HV  < &5&5HSM*&5 4UXX]]"#T#uxx}}*<%==>&5R5
5
hsm,5
  UXX]] 235
 S%((--/0	5

 
5
v .2__v'  S	* 	L .2  HSM*  hsm,  __	 
 v'   S	* F&
HH  &
)&
 S#X&
 CH~	&

 
&
R
$ 
$$588//;V $b,,b 	b 	bJ@luxx}}%lELL+56l !0l` '+ll
XXl^uxx r(   