
    9ix                        d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlm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e)e         ddfdZ*	 d-dedef         de+dee,e-ef                  de.e)e         e)e         f         fdZ/dededdfdZ0 ej1        d            G d! d"                      Z2ej1         G d# d$                      Z3d%ee         d&ee         d'eeege4f         de)e         fd(Z5d)e.edf         de)e         fd*Z6 G d+ d,          Z7dS ).a  
This module provides functionality for resuming Python execution at specific points in code,
primarily used by PyTorch Dynamo for control flow handling and optimization. It implements
bytecode transformation and execution state management to enable:

- Resuming execution at arbitrary points in Python bytecode
- Managing context managers and their state across execution boundaries
- Transforming and generating new code objects with preserved execution state
- Supporting Python 3.11+ exception handling and block management
- Restoring torch function mode stacks and other execution context

The module is critical for PyTorch Dynamo's ability to optimize code while preserving
Python semantics and execution state.
    N)CallableIterable)AbstractContextManager)AnycastOptional   )add_push_nullbytecode_from_templatecreate_binary_subscrcreate_call_functioncreate_call_function_excreate_instructioncreate_jump_absolutecreate_load_constInstructionoverwrite_instructiontransform_code_object	unique_id)ExactWeakKeyDictionary                @         i   torch_dynamo_resume_in__is_tracing_resume_prologueinstsreturnc                     t           j        dk    rX|                     t          d                     t           j        dk     r(|                     t          dd                     d S d S d S )N      	PUSH_NULL)r%      SWAPr   arg)sysversion_infoappendr   )r!   s    Q/var/www/icac/venv/lib/python3.11/site-packages/torch/_dynamo/resume_execution.py_initial_push_nullr0   ;   sm    
7""'44555g%%LL+F:::;;;;; #"%%    template.stack_indexvarname_mapc                    t          | |          }|                    t          d                     |D ]}|j        r|j        xj        |z  c_        t          d t          |          D             d          \  }}||J t          |t          d          g           ||dz            j        dk    sJ t          ||dz            t          d          g           |d |dz            ||dz   d          fS )Nr4   POP_TOPc              3   L   K   | ]\  }}|j         d v r|j        dk    ||fV   dS )	LOAD_FASTLOAD_FAST_BORROWdummyNopnameargval).0iinsts      r/   	<genexpr>z5_bytecode_from_template_with_split.<locals>.<genexpr>R   sS       	
 	
4{???w&& I '&&&		
 	
r1   )NNNOPr	   )	r   r.   r   exn_tab_entrydepthnext	enumerater   r>   )r2   r3   r4   template_coderB   	dummy_idx
dummy_insts          r/   "_bytecode_from_template_with_splitrL   C   s@   
 +8MMMM+I66777  4 4 	4$$3$$ !	
 	
$]33	
 	
 	
 	 Iz  Z%;%;%; *'9%'@'@&ABBB Q'.);;;;-	A69KE9R9R8STTT9q=)=Q+IIIr1   r<   stack_var_namec                 L    	 |  d S #  t                               |            xY wN)$__import_torch_dot__dynamo_dot_utilsset_torch_function_mode_stack)r<   rM   s     r/   _try_except_tf_mode_templaterR   f   s9    
,JJ	
 	
 	
 	s    #T)frozenc            	          e Zd ZU eed<   dZeeedf                  ed<   de	e
ef         dee         dee         fdZde	e
ef         dee         dee         fd	Zde	e
ef         dee         deee         ee         f         fd
ZdS )ReenterWithr3   N.target_valuescode_optionscleanupr"   c                 x    ddl m} t          t          | j        d |            i          \  }}||z   |dd<   |S )z
        Codegen based off of:
        try:
            (rest)
        except:
            (restore previous tf mode stack)
            raise
        r	   )get_prev_stack_var_namerM   r6   N)variables.torch_functionrZ   rL   rR   r3   )selfrW   rX   rZ   setup_try_exceptepilogues         r/   try_except_torch_function_modez*ReenterWith.try_except_torch_function_modey   sf     	FEEEEE%G()+B+B+D+DE&
 &
 &
"(
 '
r1   c                    g }| j         rd | j         D             }t          d| j                   }||d         vr|dxx         |fz  cc<   dD ]}||d         vr|dxx         |fz  cc<   g }t          |           |                    g |t          t          |          d          t          d|                     d	t          t                   d
t          ddfd}t          || j        d	|i          \  }}	|	|z   |dd<   ||z   S )z
        Codegen based off of:
        load args
        enter context
        try:
            (rest)
        finally:
            exit context
        c                 ,    g | ]}t          |          S  r   r@   vals     r/   
<listcomp>z+ReenterWith.try_finally.<locals>.<listcomp>   !    NNNC*3//NNNr1   ___context_manager_co_varnames	__enter____exit__co_namesF
STORE_FASTr?   ctxr<   r"   Nc                     |                                   	 | |                     d d d            d S # |                     d d d            w xY wrO   rj   rp   r<   s     r/   	_templatez*ReenterWith.try_finally.<locals>._template   sQ    MMOOO/T4.....T4....s	   1 A
r6   )rV   r   r3   r0   extendr   lenr   r   r   rL   )
r\   rW   rX   	load_argsctx_namename
create_ctxrs   setup_try_finallyr^   s
             r/   try_finallyzReenterWith.try_finally   s    	 	ONN4;MNNNIE43CEEFF<666'''H;6'''- 	4 	4D<
333Z(((TG3((((*
:&&&%c)nne<< #<AAA	
 	
 	
	/1#6 	/s 	/t 	/ 	/ 	/ 	/ 'It'eX5F'
 '
 '
#8 '
---r1   c                 D   g }| j         rd | j         D             }g }t          j        dk     rt          |           |                    g |t          t          |          d                     dt          t                   dt          ddfd}t          || j
                  \  }}||z   |dd<   t          d	 |D             d          }|J t          |t          d
          g           d |D             }	t          |	d          }
t          |	d          J ||z   |
fS )zR
        Codegen based off of:
        with ctx(args):
            (rest)
        c                 ,    g | ]}t          |          S rb   rc   rd   s     r/   rf   z(ReenterWith.__call__.<locals>.<listcomp>   rg   r1   )r%      Frp   r<   r"   Nc                 @    | 5  | d d d            d S # 1 swxY w Y   d S rO   rb   rr   s     r/   rs   z'ReenterWith.__call__.<locals>._template   sq                       s   c              3   B   K   | ]}|j         d v r|j        dk    |V  dS )r9   rp   Nr=   r@   rB   s     r/   rC   z'ReenterWith.__call__.<locals>.<genexpr>   sK        ;"CCCK5((  )(((	 r1   rD   c              3   0   K   | ]}|j         d k    |V  dS )PUSH_EXC_INFON)r>   r   s     r/   rC   z'ReenterWith.__call__.<locals>.<genexpr>   s7       
 
)G)GD)G)G)G)G
 
r1   )rV   r,   r-   r0   rt   r   ru   r   r   rL   r3   rG   r   r   )r\   rW   rX   rv   ry   rs   
setup_withr^   load_fast_ctx_instpush_exc_info_genpush_exc_info_insts              r/   __call__zReenterWith.__call__   s    	 	ONN4;MNNNI(*
g%%z***%c)nne<<	
 	
 	
	1#6 	s 	t 	 	 	 	  Bt' 
  

H '
! &   
 
 "---03Ee3L3L2MNNN
 
%
 
 
 ""3T::%t,,444J&(:::r1   )__name__
__module____qualname__int__annotations__rV   r   tupler   dictstrlistr   r_   r{   r   rb   r1   r/   rU   rU   t   s	        /3M8E#s(O,333  cN 59+5F 	k	       0,. cN,.59+5F,.	k	,. ,. ,. ,.\6; cN6;59+5F6;	tK (;"77	86; 6; 6; 6; 6; 6;r1   rU   c                       e Zd ZU ej        ed<    ej        e          Z	ee
         ed<    ej        e          Zee         ed<    ej        e          Zeeeef         eeef         f         ed<   dS )ResumeFunctionMetadatacode)default_factoryinstructions prefix_block_target_offset_remapblock_target_offset_remapN)r   r   r   typesCodeTyper   dataclassesfieldr   r   r   r   r   r   r   r   rb   r1   r/   r   r      s         
.&7k&7&M&M&ML${#MMM 3D+2C3 3 3$d3i   
 	$/// tE#s(OT#s(^$CD     r1   r   l1l2condc                     t          |          }g }	 t          |          }| D ]2} |||          r$|                    |           t          |          }3n# t          $ r Y nw xY w|S )z
    Two-pointer conditional filter.
    e.g. _filter_iter(insts, sorted_offsets, lambda i, o: i.offset == o)
    returns the instructions with offsets in sorted_offsets
    )iterrG   r.   StopIteration)r   r   r   itrescurre   s          r/   _filter_iterr   
  s     
bBC2hh 	 	CtC~~ 

32hh	    Js   AA 
A%$A%tupc                     g }t          |           |                    d | D                        |                    t          t          |           d                     |S )Nc              3   4   K   | ]}t          |          V  d S rO   rc   rd   s     r/   rC   z'_load_tuple_and_call.<locals>.<genexpr>$  s+      77C"3''777777r1   F)r0   rt   r   ru   )r   r!   s     r/   _load_tuple_and_callr   !  s^    !Eu	LL773777777	LL%c#hh66777Lr1   c            !       <   e Zd Z e            Z e            Zedej        de	de	de
dej        f
d            Zedej        de	de	de	dee	d	f         d
e	deed	f         deed	f         deed	f         dedeee	ee
d	f         f         d	f         deeeee
d	f         f         d	f         dee	d	f         deej                 dedej        f d            Zedeee
f         dee         fd            Zedej        de	de	de	dee	d	f         de
dej        fd            ZdS )ContinueExecutionCacher   linenoinit_offsetkeyr"   c                     || j         vr
i | j         |<   t          |          }|| j         |         vr | j        |||g|R  | j         |         |<   | j         |         |         S rO   )cacher   generate)clsr   r   r   r   s        r/   lookupzContinueExecutionCache.lookup-  sq     sy   CIdOCjjcio%%#/3<fk#PC#P#P#PCIdOC ys##r1   resume_offsetsetup_fn_target_offsets.nstackargnamesargnames_null	setup_fnshandle_inactive_ctxstack_ctx_varsargnames_ctx_vars
null_idxesnested_code_objspop_nested_resume_resultc                 
   	
 J |j         t          t          z  t          z  t          z  z  rJ |j         t
          z  sJ |t          j        v r#                     ||	
          S t          j
        dk    t          |          dt          t                   dt          t          t           f         dd f 
	fd}t#          ||          \  }}t          j        |<   |S )Nr$   r   rW   r"   c           
      >   t          j        |           "_        ddgd t          $          D             z                      fdD                        t          |d         pg           t          |d         pg           z   }t          t          |                    }t           d|d          d	! |d<    rk|d
                             dd          }t          |          dk    r|d         |d
<   n/t          |          dk    sJ |\  }}| dt           d| d	! |d
<   !|d<   d|d<   ||d<   t                    |d<   d|d<   d|d<   t          fdD             z   fd|d         D             z   t          gz             |d<   |d         t          t          z   z  |d<   t          'fd| D                       }g } rW|r1|                    t          dt          |                               |                    t          dd                     |                    t          dd          t          d t                    g           g }d! )D             }	(fd"t!          )          D             }
d# | D             }i }d}d}t#          *          }t          $t          %          z             D ]}|t          %          k     r4%|         |k    r(|                    t          d$                     |dz  }nZ|                    t          d%d&|                      r,||v r(|                    t%          ||                              |dz  }||	v rw|	                    |          } |||          \  }}|                    |            r<|
                    |          }||         }"j                            |           |||<   ! r&t+          t-          "j                            "_        |	rJ rrD ]o\  }}|                    t          d%|                     |                    t%          |                     |                    t          d |                     prPt.          j        d'k    sJ D ];}|vsJ |                    t          d$          t          d |          g           <#r|                    g t3          t          d%d          t          dd(          t5                      g          t          d%d          t          dd(          t          d)          t          d%d          t          d%d          t          d*d          t          d%d          t          dd(          t5                      t          d+d          t          d%d          t          dd(          t          d)          t          d,d          t          d,d          t          dd-          t          d t                    t7          d-d-                     &r"|                    t          d.                     n:|                    t          dd-          t          d t                    g           |                    t9          |                     | D ]2}|j        |j        k    r nd |_        t.          j        d/k    rd |_        3|r=|                    |           |                                         |                     |r: sJ | D ]3}|j!        r*|j!        j"        |v r||j!        j"                 |j!        _"        4|| z   | d d <   d S )0N__nested_resume_fns__nested_frame_valuesc                     g | ]}d | S )___stackrb   )r@   rA   s     r/   rf   zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>r  s    ;;;^^^;;;r1   c              3   $   K   | ]
}|v|V  d S rO   rb   r@   vargss     r/   rC   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>s  s'      ==aq}}}}}}==r1   co_cellvarsco_freevars_co_name_at_co_qualname.r	   )maxsplitr   co_firstlinenorb   co_argcountr   co_posonlyargcountco_kwonlyargcountc                     g | ]}|v|	S rb   rb   r   s     r/   rf   zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>  s    ===q}}1}}}r1   c                     g | ]}|v|	S rb   rb   r   s     r/   rf   zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>  s    KKKQd]]1]]]r1   ri   co_flagsc              3   2   K   | ]}|j         k    |V  d S rO   offset)r@   rA   r   s     r/   rC   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>  s/      OOQX5N5N!5N5N5N5NOOr1   COPY_FREE_VARSr*   RESUME
LOAD_CONSTTro   rn   c                     i | ]
}|j         |S rb   r3   )r@   fns     r/   
<dictcomp>zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>  s    <<<BR^R<<<r1   c                 2    i | ]\  }}|j         |         S rb   r   )r@   rA   r   r   s      r/   r   zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>  s7     # # #Ar  7 :# # #r1   c                     i | ]
}|j         |S rb   r   r   s     r/   r   zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>  s    IIIDdk4IIIr1   r'   r:   r   )r%      DELETE_SUBSCR
BUILD_LISTLIST_EXTENDDELETE_FASTFr7   r$   )#copydeepcopyr   rangert   r   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitru   "IS_TRACING_RESUME_PROLOGUE_VARNAME
CO_VARARGSCO_VARKEYWORDSrG   r.   r   rH   r   r   popr   r   reversedr,   r-   r
   r   r   r   r   starts_line	positionsunreachable_codesrE   target)+r   rW   freevarsqualified_pathmodule_namer   r   prefixrX   hookshook_target_offsetsoffset_to_instold_hook_target_remapstack_inull_istack_ctx_vars_drA   hook
hook_insts
exn_targethook_target_offsetold_hook_targetrx   valsr   rB   r   r   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   r   r   s+                             @r/   updatez/ContinueExecutionCache.generate.<locals>.updatel  s	    !%l ; ;D)+BCD;;U6]];;;;DKK====8======\-8>B??%]+1rC C H VH--..H0XX<	3JXXPVXX #  	!-m!<!C!CCRS!C!T!T~&&!++2>y2IL//~..!3333+9(K&^^)F^^^^V\^^ !/ .4L)**,L'*2L'*-d))L'12L-.01L,-*/====m===>KKKKl=9KKKL 667+ +L' (4J'?^+C (L$ OOOO\OOOOOFF C MM*+;XOOO   0qAAABBB
 MM&|DAAA&$-O     *,G<<)<<<E# # # #&y11# # # JILIIIN$&!GF#N336C
OO344 L LC
OO++
60Ba0G0GMM"4["A"ABBBaKFFMM*;?S'?S?STTT   + Ww:J/J/J &:;KG;T&U&UVVVqLG:: 99Q<<D-1T,-H-H*J
MM*---$ L-@-D-DQ-G-G**89K*L=DDEWXXXAK-o>  9=TBCC9 95  # Q"3 Q QJD$MM"4["N"N"NOOOMM"6t"<"<===MM"4\$"O"O"OPPPP  	'72222&  AD====MM.{;;.|AFFF      >.& 2$/8M!" !" !" !3< K K K 4 6 6 . +;?TUUU. +<CCC. +?;;.  +;?TUUU!." +;?VWWW#.$ +<Q???%.( +;?VWWW).* +<CCC+., -..-.8 +=a@@@9.< +;?VWWW=.> +<CCC?.@ +?;;A.D +=AVWWWE.F +)2I  G.P +<FFFQ.R +(1S  S.Z 1>>[.0 0 0b , AMM"4Y"?"?@@@ *<FFF*(1S     MM.v66777
 % * *;&-//E#' #w..%)DN Cg&&&c33LAABBB % 
$$$$(  D* .59NNN4I .55*1
 %|3LOOOr1   )r   CO_GENERATORCO_COROUTINECO_ITERABLE_COROUTINECO_ASYNC_GENERATORCO_OPTIMIZEDr   generated_code_metadata&generate_based_on_original_code_objectr,   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  new_coder   r  r  s   ` ` ````````````   @@r/   r   zContinueExecutionCache.generate8  s   0 (((Ml*-BBEWWY	
 	
 	
 }|++++)AAA=='#! (  $ (G3%d++^	4{+^	4;?S>^	4^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4 ^	4@ ,D&99!CG6x@r1   rW   c                 B    t          d          t          dd          gS )zACodegen a `raise None` to make analysis work for unreachable codeNRAISE_VARARGSr	   r*   )r   r   )rW   s    r/   r   z(ContinueExecutionCache.unreachable_codesP  s)     d##A666
 	
r1   r   c                    t           j                 dt          dt          ffd} ||          } ||          }	|	dk    s
J d            t          j        dk    rz||	fj        vrQi xj        <   dt          t                   dt          t          t          f         dd	ffd
}
t          |
           t          fdD                       t          j        j        |||	g|R  S )a>  
        This handles the case of generating a resume into code generated
        to resume something else.  We want to always generate starting
        from the original code object so that if control flow paths
        converge we only generated 1 resume function (rather than 2^n
        resume functions).
        
cur_offsetr"   c                      ddt           t                   dt          t          t          f         dd f fd}t          |           S )Nr   r   rW   r"   c           	      @   fd| D             \  t          fdt          t          |           t          j                            D                       }|sd S t	          |          dk    sJ |d         }j        |j        k    sJ |j        J |j        d S )Nc              3   2   K   | ]}|j         k    |V  d S rO   r   )r@   rA   r  s     r/   rC   zContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>u  s/      OO1J8N8NQ8N8N8N8NOOr1   c              3   *   K   | ]\  }}|u 	|V  d S rO   rb   )r@   i1i2r   s      r/   rC   zContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>w  s=       ) )B V||	  $|||) )r1   r	   r   )r   zipr   r   ru   opcoder   )r   rW   new_target_tuple
new_targetr   r  r  orig_offsets       @r/   find_orig_offset_transformz{ContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transformq  s     POOOOOO	#( ) ) ) )"% ..9J0K0K# #) ) ) $ $  (  F+,,1111-a0
}
(99999!(444(/r1   )r   r   r   r   r   r   )r  r&  r%  r   r  s   ` @r/   find_orig_offsetzWContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offsetn  sp    K0";/0?CCH~00 0 0 0 0 0 0 06 "$(BCCCr1   r   z>resume instruction not found in original code - this is a bug.r$   r   rW   Nc           
        
 g }| D ]I}t          |          t          j                  k    r n!|j        dk    r|                    |           Jt	          |j                  D ]"\  }}|t          t          |j                  <   #|r t          t          |d         j                  nd
t          
fdD                       }t          | |d           }t          t          t	          t          |           t          j                            t          |          d                     }t	          ||          D ]\  }}	|d         j        |	j        <   d S )Nr   r   c              3   (   K   | ]}|k    |V  d S rO   rb   )r@   ncur_start_offsets     r/   rC   zmContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>  s7       . .aBR>R>R>R>R>R>R. .r1   c                     | j         |k    S rO   r   )rB   os     r/   <lambda>zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    WXHX r1   c                     | d         |u S )Nr   rb   )v1v2s     r/   r.  zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    2a5B; r1   r	   )ru   r   r>   r.   r!  r   r   r   r   r   r   r   )r   rW   prefix_blocksrB   r-  cur_inst_offsetstargetsorig_targetsorigr   r+  r   r  r   s             @r/   remap_block_offsetszZContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets  s    8:M , 
7 
7
 }-- A2 2   "E;/99)00666 $'%t'L$ $ N Na MN1$sDK2H2HII @MTS-"3":;;;RT % (. . . . .#:. . . ( ($ +$&68X8X G $,$ 6 6AR8S8STT$W--66 $ $L &)w%?%? O O	c@DQ1#*==O Or1   c              3   >   K   | ]}j                  |         V  d S rO   )r   )r@   r*  r  
offset_keys     r/   rC   zPContinueExecutionCache.generate_based_on_original_code_object.<locals>.<genexpr>  sD       , , .z:1=, , , , , ,r1   )r   r  r   r,   r-   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r'  orig_init_offsetorig_resume_offsetr7  r   r  r9  s    `   `     @@@r/   r  z=ContinueExecutionCache.generate_based_on_original_code_objectX  s   $ (>'U(
	 	 	 	 	 	 	 	 	B ,+K88 .-m<<!B&&&L '&& w&&
 +,>?J !??? )D,J-1O"&{"31OCGS>1O1O 1O 1O 1O 1O 1O 1O 1Of &d,?@@@ ', , , , , ,0, , , ' '# &,I#
 
 
 
 	
r1   N)r   r   r   r   r   r  classmethodr   r   r   r   r   r   r   rU   boolr   staticmethodr   r   r   r   r  rb   r1   r/   r   r   )  ss       ""$$E4466$>$+.$=@$HK$	$ $ $ [$ UnU U 	U
 U "'sCxU U S/U S#XU c)*U "U eCsCx$893>?U !sE#s(O';!<c!ABU #s(OU"  /#U* #'+U, 
-U U U [Un 
S#X 
4;L 
 
 
 \
 Q
nQ
 Q
 	Q

 Q
 "'sCxQ
 Q
 
Q
 Q
 Q
 [Q
 Q
 Q
r1   r   rO   )8__doc__r   r   r,   r   collections.abcr   r   
contextlibr   typingr   r   r   bytecode_transformationr
   r   r   r   r   r   r   r   r   r   r   r   utilsr   r  CO_NEWLOCALSr   r   	CO_NESTEDr  	CO_NOFREEr  r  r  r   r   r   r0   r   r   r   r   rL   rR   	dataclassrU   r   r=  r   r   r   rb   r1   r/   <module>rI     sm         



  . . . . . . . . - - - - - - & & & & & & & & & &                            * ) ) ) ) ) 
		   !9 %C "<d;/ <D < < < < -1 J  JsCx  J J $sCx.) J 4d;//0	 J  J  J  JF S T     d###@; @; @; @; @; @; @; $#@;F        " C:t#
$ 
#Y	   .eCHo ${2C    A
 A
 A
 A
 A
 A
 A
 A
 A
 A
r1   