
    JTh/                       S SK Jr  S SKrS SKJr  S SKJrJr  S SKJ	r	  S SK
Jr  S SKJrJrJrJr  S SKJrJrJrJrJrJrJrJr  S S	KJr  \(       a  S S
KJr  \" SS9 " S S5      5       r\" SS9 " S S5      5       r\" SS9 " S S5      5       r \" SS9 " S S5      5       r!S(S jr"S)S jr#S)S jr$\" SS9 " S S5      5       r%\" SS9 " S S5      5       r&\" SS9 " S S5      5       r'S*S jr(S+S jr)S 1r*1 S!kr+1 S"kr,      S,S# jr- S-         S.S$ jjr.      S/S% jr/        S0S& jr0 S-     S1S' jjr1g)2    )annotationsN)	dataclass)castTYPE_CHECKING)local)cpp)	BaseCTypeBinding
NamedCTypetensorListT)BaseTyBaseTypeFunctionSchemaListTypeNativeFunctionNativeFunctionsViewGroup
SchemaKindType)IDENT_REGEX)SequenceT)frozenc                  *    \ rS rSr% S\S'   S\S'   Srg)SavedAttribute   r   nctypestrexpr N__name__
__module____qualname____firstlineno____annotations____static_attributes__r       M/var/www/auris/envauris/lib/python3.13/site-packages/torchgen/api/autograd.pyr   r      s      Ir&   r   c                  R    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S	'   S
\S'   Srg)
Derivative+   r   formulaoriginal_formulatuple[str, ...]	var_namesztuple[SavedAttribute, ...]saved_inputssaved_outputsset[str]named_gradientsr   Nr   r   r&   r'   r)   r)   +   s1     L   -, .- r&   r)   c                  \    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S\S
'   S\S'   S\S'   Srg)ForwardDerivativeG   r   r+   r-   r.   ztuple[Type, ...]	var_typesztuple[str, ...] | Nonerequired_inputs_fw_gradrequired_inputs_primalboolrequired_original_self_valueis_reusing_outplace_formular   Nr   r   r&   r'   r4   r4   G   s9    
 L    43 32 #'& "&%r&   r4   c                      \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   \SS j5       r    SS jrSrg) DifferentiabilityInfof   r   namer   funcz
str | NoneopzSequence[Derivative]derivativeszSequence[ForwardDerivative]forward_derivativeszSequence[SavedAttribute]all_saved_inputsall_saved_outputszSequence[str]available_named_gradientsr1   used_named_gradientszSequence[Binding]args_with_derivativesnon_differentiable_arg_nameszlist[bool] | Noneoutput_differentiabilityzlist[str] | None#output_differentiability_conditionsc                2    [        U R                  5      S:  $ )Nr   )lenrH   selfs    r'   has_derivatives%DifferentiabilityInfo.has_derivatives   s    4--.22r&   c                   UR                   c  g UR                   nU R                  R                  SSS9nUS    S3SR                  USS  5      -   nU R                  c  S OU R                   S3n[        UUUU R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S9$ )	N.   )maxsplitr   z_copy.   _copyr?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   )	view_copyr?   splitjoinrA   r=   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   )rO   gfname_split_by_periodview_copy_nameview_copy_op_names         r'   %create_view_copy_from_view_derivative;DifferentiabilityInfo.create_view_copy_from_view_derivative   s     ;;KK#yysQ?034F;chh $?
 
 %)GGODDGG9E9J$ (( $ 8 8!22"44&*&D&D!%!:!:"&"<"<)-)J)J%)%B%B040X0X
 	
r&   r   N)returnr9   )r\   r   rc   DifferentiabilityInfo | None)	r    r!   r"   r#   r$   propertyrP   ra   r%   r   r&   r'   r=   r=   f   s     I 
 	N &% 54 /. 0/  -, #"
 -, #0/ 0/ *:93 3
)
	%
r&   r=   c                    U c  gU R                    HA  nUR                  n[        R                  " [        R
                  " U5      U5      (       d  MA    g   g)NFT)rB   r+   researchr   format)infoident
derivativer+   s       r'   
uses_identrm      sI    |&&
$$99[''.88 ' r&   c                    [        U S5      $ )Nretain_variablesrm   rj   s    r'   uses_retain_variablesrr      s    d.//r&   c                    [        U S5      $ )Ngradrp   rq   s    r'   uses_single_gradru      s    dF##r&   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg)	DifferentiableInput   r   r?   r   typecpp_typer   Nr   r   r&   r'   rw   rw          
I
J Mr&   rw   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg)	DifferentiableOutput   r   r?   r   ry   rz   r   Nr   r   r&   r'   r}   r}      r{   r&   r}   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
'NativeFunctionWithDifferentiabilityInfoi  r   r@   z'dict[str, DifferentiabilityInfo] | Nonerj   z-dict[str, Sequence[ForwardDerivative]] | Nonefw_derivativesr   Nr   r   r&   r'   r   r     s    

11AAr&   r   c                    U R                   R                  (       d<  U R                  b0  [        S U R                  R	                  5        5       5      (       a  gg)a  How are we going to call the underlying implementation of a
declaration?  There are two strategies:
    - use_derived: we want to call the implementation on CPUDoubleType
      (or a similar, derived Type instance).  Because these derived
      instances deal in Tensors, not Variables (it's a completely different
      object, so it doesn't dispatch back to VariableType), code on
      this dispatch path needs to wrap/unwrap tensors.  If the
      derived implementation takes and returns tensors, the
      implementation is usually differentiable (although we also use
      the derived dispatch path for non-differentiable functions
      that we still want to dispatch on the derived Type instance;
      e.g., size())
    - use_type: we want to call the implementation on Type, because
      it is implemented concretely, and the functions it invokes will
      get dispatched back to VariableType (which will ensure that they
      are differentiable.)
c              3  8   #    U  H  oR                   v   M     g 7fN)rP   .0rj   s     r'   	<genexpr>$dispatch_strategy.<locals>.<genexpr>"  s     #VEUT$8$8EUs   use_deriveduse_type)r@   is_abstractrj   anyvalues)fns    r'   dispatch_strategyr     s@    , 
ww
#VRWW^^EU#V V V"  r&   c                t    U R                   R                  R                  R                  R                  S5      $ )N	_foreach_)r@   r?   base
startswith)r]   s    r'   is_foreach_funcr   <  s'    66;;  ++K88r&   _foreach_zero_>   _foreach_add.Tensor_foreach_div.Tensor_foreach_mul.Tensor>   _foreach_add.Scalar_foreach_sub.Scalar_foreach_add_.Scalar_foreach_sub_.Scalar_foreach_add.ScalarList_foreach_sub.ScalarList_foreach_add_.ScalarList_foreach_sub_.ScalarListc                   U R                   R                  R                  R                  R                  S5      S   UR                  R                  R                  :H  =(       Ga$    UR                  R                  R                  (       + =(       d&    [        U R                   R                  5      [        ;   =(       a    [        U R                   R                  5      [        ;   =(       dI    [        U R                   R                  R                  5      [        UR                  R                  5      :H  =(       aN    [        S [        U R                   R                  R                  UR                  R                  5       5       5      $ )Nr   c              3     #    U  H7  u  pUR                   UR                   [        UR                   S S5      4;   v   M9     g7f)elemN)ry   getattr)r   argref_args      r'   r   +is_reference_for_foreach.<locals>.<genexpr>g  s<      
! LLSXXwsxx'FGG!s   ?A)r@   r?   r   rZ   inplacer   _foreach_with_inplace_ref_skip_argument_len_checkrM   	argumentsflat_non_outallzip)r]   function_schemas     r'   is_reference_for_foreachr   X  s   
 	
##K048L8L8Q8Q8V8VV 	
 	
$$))111 =166;;#<<	
  88 ;166##001?,,99:;	
  
 #  --))66!
 
r&   c                v   SnUR                  5        H   u  pV[        X5      (       d  M  Xc   nUc  M     O   Uc  U R                  R                  5       [        R
                  :X  a[  [        U R                  R                  5      [        ;   a4  UR                  5        H   u  pV[        X5      (       d  M  Xc   nUc  M     O   Uc  gU R                  R                  5       [        R
                  :X  a  US4$ 0 0 p[        [        U R                  R                  R                  WR                  R                  5      5       H.  u  n	u  pU
R                  X{R                  '   XU
R                  '   M0     / / / pn/ n[        UR                  5       GH~  u  n	nUR                  R                  SS5      R                  SS5      n/ / nn[         R"                  " U R$                  U R&                  S9   UR(                   GH   nUR*                  R-                  S	5      S
   nUU   n[/        UU   R0                  [2        5      (       a  US-   nOUnUR*                  R                  UU5      nUR                  [5        [        UR6                  R                  5      U5      n[8        R:                  " UU   US9n[=        UR                  UR0                  R?                  5       5      nURA                  [C        UUS95        GM     URD                   HV  nUR6                  R                  S:X  a0  URA                  [C        [=        S[G        [H        5      S9SS95        MM  [K        S5      e   SSS5        URL                   Vs/ s H  nUU   PM
     nnURO                  U5        URO                  U5        URO                  U5        [Q        UUR                  [S        U5      [S        U5      [S        U5      [U        5       S9nURA                  U5        GM     [         R"                  " U R$                  U R&                  S9   U R                  R                  R                   V
s/ s HG  n
U
R                  U;   d  M  [W        U
R                  [8        R:                  " XR                  S9U
SS9PMI     nn
SSS5        / n URX                   GH  n![[        U!RL                  5      n[[        U!R\                  5      n"/ n#/ n$U!R^                  b  [[        U!R^                  5      n#U!R`                  (       a  [[        U!R`                  5      n$U!R                  nSU;   a  U!R                  R                  SS5      n[        U R                  R                  R                  UR                  R                  R                  R                  5       GHY  u  n%n[/        U%R0                  [2        5      (       aJ  U%R0                  Rc                  5       (       d+  UR                  UR                  U%R                  S-   5      nGO8U%R0                  Rc                  5       (       a  [/        U%R0                  [2        5      (       dx  U%R0                  [e        [f        Rh                  5      :X  a'  [        U R                  R                  5      [j        ;   d*   U R                  R                   SU%R0                   35       eS H;  n&UR                  U&-   n'U'U;   d  M  U%R                  U&-   nUR                  U'U5      nM=     O@U%R                  UR                  :w  a&  UR                  UR                  U%R                  5      n[        U5       H6  u  n	n(U(UR                  :X  d  M  U%R                  UU	'   U%R0                  U"U	'   M8     [        U#5       H'  u  n	n(U(UR                  :X  d  M  U%R                  U#U	'   M)     [        U$5       H'  u  n	n(U(UR                  :X  d  M  U%R                  U$U	'   M)     GM\     U RA                  [m        U[S        U5      [S        U"5      [S        U#5      [S        U$5      U!Rn                  U!Rp                  S95        GM     [s        U R                  R                  R                  Rt                  U SURv                   U R                  R                  Rx                   3UU [S        [U        U5      5      [S        [U        U5      5      S[U        5       W/ SSS9S4$ ! , (       d  f       GN= fs  snf s  sn
f ! , (       d  f       GN= f)zGenerate DifferentiabilityInfo for out-place foreach function, return the existing one for in-place.

The second return value indicates whether the info is generated in this function.
NNFFrt   zgrads[i]resultz	result[i])!use_const_ref_for_mutable_tensorsuse_ilistref_for_tensor_listsrS   r   z[i])binds)r   r   )r?   ry    )r+   r,   r.   r/   r0   r2   )r?   r   argumentdefaultz, )_p_tr+   r.   r6   r7   r8   r:   r;   Foreachr   rX   T)=itemsr   r@   kindr   r   r   r?   r   	enumerater   r   r   rB   r+   replacer   parametrizer   part_of_structured_groupr/   r   rZ   
isinstancery   r   r   r   r   argument_typer   remove_const_refappendr   r0   r	   r   RuntimeErrorr.   extendr)   tuplesetr
   rC   listr6   r7   r8   is_tensor_liker   r   Tensor_foreach_with_tensor_overloadr4   r:   r;   r=   r   rA   overload_name))foreach_functionfunctional_info_by_signature non_functional_info_by_signaturedispatch_keyref_diff_infor   	diff_infomap_refarg2foreachargmap_name2argir   r   rD   rE   all_var_namesmodified_derivative_formulasrl   modified_formular/   r0   	ref_inputref_input_jit_namemapped_namemapped_exprnew_exprr   canonical_nctype
ref_outputvarr.   modified_derivativerH   rC   fw_derivativer6   r7   r8   foreach_argsuffix	curr_exprr?   s)                                            r'   gen_foreach_derivativeinfor   r  sT    37M&B&H&H&J"'(8JJ!/$ 'K 	!!&&(J,>,>> %%**+/HH*J*P*P*R&O+,<NN%3M( +S  !!#z'9'99e##*,b<&!!++88%%22	
>C /2hhll+!$SXX :<R#% "=#<#<=:%--55fjIQQk
 ')"m.>.`.`*:*S*S
 (44	%.^^%9%9#%>q%A"34FGl;7<<hGG"-"5K"-K$>>112DkR#3#;#;i..334h$  **<+DKX#-KK!=!=!?$  ##"*:M! 5& )66
$$))X5!((&#-%-Ik4J$ "*	 'r** 7/
F <F;O;OP;OC*3/;O	PY'-  /($'//I&|,.E
 	%++,?@k >n 
		*:*\*\&6&O&O
 (,,66CC	!
 Dxx=(GXX((HH=	 D 	 	!
	
 46&::#M$;$;<	 $]%<%< =	-/,.00<&*=+P+P&Q#//%)-*N*N%O"(00 '',44<<X{S$'!!++88##--::%
 K ;++X66#((7799 $4#;#;LL+"2"2U":$  !!0022 "+"2"2H==$$(??,11667;XXG '++001K4D4D3EFG  +F 'v 5I $44#.#3#3f#<+;+C+CIx+X(	 + ##w||3'7'?'?k&6&6($
 %Y/47<<'#.#3#3IaL#.#3#3IaL 0 %%<=47<<'1<1A1A+A. > %%;<47<<'0;0@0@*1- =Q%
V 	""(	*	*(-.E(F',-C'D-:-W-W,9,U,U
	
u ;N 	!&&++0055!))*+;+@+@+E+E+S+S*TU4 3"3'7#89#C(9$:;&(!$"7)+%)04	
 	! Q
 
F Q$	!
	
 
s7   -E8d;d9#d)d$46d$*d)
d	$d))
d8c                	  ^^^ TR                  5        VVs0 s H9  u  p#UR                  5       [        R                  :X  d  M)  UR	                  SS9U_M;     snnmTR                  5        VVs0 s H9  u  p#UR                  5       [        R                  :w  d  M)  UR	                  SS9U_M;     snnm    SUUU4S jjn/ nU  GH  nU" U5      u  p7UR
                  R                  5       [        R                  :X  av  Ubs  UR                  5        H_  nUR                   HL  n	SU	R                  ;   d  M  U	R                   H'  n
SU
R                  ;  a  M   SUR
                   35       e   MN     Ma     U(       d  UR                  [        USSS95        M  0 nUR                  5        GH  u  pUR                  (       d  / X'   M  UR                  nUR
                  R                  5       [        R                  :X  GaS  [        UR                  5      S	:X  d   eUR                  S
   nUR                   nS S jn["        R$                  " [&        R(                  " S5      U5      (       a<  U(       a#  [+        SUR
                  R,                   S35      eU" US5      nU" US5      nS!S jn["        R.                  " [&        R(                  " S5      UU5      nUR0                  n["        R$                  " [&        R(                  " S5      U5      (       a  U(       a  US-   OSnU(       d  SnSnSnSn["        R2                  " SU5      nU(       aG  UR5                  S	5      UR5                  S5      nnS"S jnU" U5      nU=(       a    UUR,                  :H  nU(       a  Uc   eUc   eSU SU SU 3nOSU SU 3n[7        ["        R$                  " [&        R(                  " S5      U5      5      =(       d4    [7        ["        R$                  " [&        R(                  " S5      U5      5      n[9        USUR:                  UR<                  UUU(       + S9/nXU'   GM     UR                  [        XcUS95        GM     U$ s  snnf s  snnf )#zSets the "derivative" key on declarations to matching autograd function
In-place functions will use the out-of-place derivative definition if there
is no in-place specific derivative.
Tstrip_defaultc                  > SU R                   ;   a-  U R                  R                  5       [        R                  :X  a  gU R                  T;   a  TU R                     S4$ U R                  R                  SS9nUT;   a  [        U 5      (       d  TU   S4$ SU R                   ;   aR  UT;   aL  TU   n[        S UR                  5        5       5      (       a   S[        U R                  5       S35       eUS4$ [        U 5      (       aQ  U R                  T;  d   e[        U TT5      u  p4Uc  gS	U0nU(       a  UTU R                  '   UTU R                  '   XT4$ g)
N	generatedr   Tr   Fc              3  Z   #    U  H!  n[        S  UR                   5       5      v   M#     g7f)c              3  f   #    U  H'  nS [        UR                  R                  5      ;   v   M)     g7f)rO   N)r   r   r?   )r   inpts     r'   r   Lmatch_differentiability_info.<locals>.find_info.<locals>.<genexpr>.<genexpr>{  s&     V@UFc$++"2"233@Us   /1N)r   rD   r   s     r'   r   Bmatch_differentiability_info.<locals>.find_info.<locals>.<genexpr>z  s+      .D V@U@UVVV.s   )+zzAttempted to convert a derivative formula for a mutable operator
 to be used by automatically by its functional variant ("zV").
 this is not currently supported (we'd need to fix up the formula in the codegen).Default)tagsr@   r   r   out	signaturer   r   r   r   r   )	r]   f_sig	info_dictr   is_generateddiff_info_dictdifferentiability_infosr   r   s	         r'   	find_info/match_differentiability_info.<locals>.find_info^  s    !&& QVV[[]jnn%D 66,,*1662D88   t 4009K9K/6== !&& U.N%N8?I %,,.   V::=aff+ GSVV  e## 166!8888&@,0'#I
  "'3N2@'/7E,QVV4!//r&   NrO   strides_or_errorz`Calling '.strides()' in the 'self' derivative formula of an in-place function is not supported: )r@   rj   r   rV   r   c                p   ^ SU4S jjn[         R                  " [        R                  " ST 35      X 5      $ )Nc                R   > U R                  S5       ST U R                  S5       3$ )NrV   original_selfrT   group)mpostfixs    r'   replSmatch_differentiability_info.<locals>.replace_self_with_original_self.<locals>.repl  s(    "#''!*]7)AGGAJ<PPr&   rO   r  zre.Match[str]rc   r   )rg   subr   ri   )r+   r  r	  s    ` r'   replace_self_with_original_selfEmatch_differentiability_info.<locals>.replace_self_with_original_self  s.    Q 66+"4"4tG95E"FVVr&   self_pzThe formula for "z" is using the original value of self that is being modified inplace. This would lead to wrong forward gradients. Please use "result" in the formula only.r   r   c                L    U R                  S5       SU R                  S5       3$ )NrV   r  rT   r  )r  s    r'   r	  *match_differentiability_info.<locals>.repl  s#    ggaj\
|<<r&   r   rN   Fzself_t.([\w]*)\((.*)\)rT   c                Z    SnU  H#  nUS:X  a  US-  nUS:X  a    gUS:X  d  M  US-  nM%     g)NrV   )r   F(Tr   )slevelchs      r'   check_parens_nest_level_gt_zeroEmatch_differentiability_info.<locals>.check_parens_nest_level_gt_zero	  s@    $%E&'#%9$)QJE',z/4#%9$)QJE '( $(r&   z"self_t_raw.defined() ? self_t_raw.z_(z) : z(self_t_raw.defined() ? self_t_raw.copy_(original_self_poriginal_self_tr   )r]   r   rc   z4tuple[dict[str, DifferentiabilityInfo] | None, bool])r+   r   r  r   rc   r   r  )r  r   rc   r9   )r   r   r   
functionalr   r@   r   r   rB   r.   r/   r   r   r   rC   rM   r+   rg   rh   r   ri   r   r?   r  r8   	fullmatchr  r9   r4   r6   r7   )native_functionsr   schemar   r   r   r]   is_exact_matchrj   rl   saved_inputfw_derivative_dictkeyrC   fw_infor+   r  r	  required_primalsis_single_method_on_self_tdirectly_do_inplaceop_namebetween_parensmatchr  r:   r   r   s    `                        @@r'   match_differentiability_infor+  J  su    "9!>!>!@$!@F;;=J111 	8t,i7!@$  "9!>!>!@(!@F;;=J111 	8t,i7!@($66	=6 6p =?F$-aL!	 66;;=J...I4I!((*"&"2"2J!5!55+5+B+BK#5[=M=M#M !GGHvvh!P#M ,C #3 + MM7d
 EG"*IC++*,"'"&":": vv{{}
 2 22* 001Q662215!//W 99[//97CC%*/} =G G  #B'4"P"A'4"P= &&!3!3H!=tWM#*#A#A 99[//97CC8H(94i % & 27.*/'*.G15NLL)BGLE27++a.%++a.	( 6U*62 7O7dii;O , +&222-999$FwirR`Qaaefmen"o %MWIUYZaYb"c/3IIk001BCWM0 0U"))K$6$67H$I7ST -
 & '"+")"3"3070O0O/?5Q8F4F
'# ':s#K +N 	37I	
 J MS$
(s   (Q;Q;.(RRc                b    UR                  5       =(       a    US L =(       d    XR                  ;  $ r   )r   rI   )r?   ry   rj   s      r'   is_differentiabler-  ?  s/       E$E$EEr&   c                J  ^ U R                   nU R                  (       a  U R                  U   OS m[        [        R                  " U5      UR                   R
                  5       VVs/ s H;  u  p4[        UUR                  [        R                  " USS9R                  5       S9PM=     nnnT(       a  TR                  OS nUb  [        U5      [        U5      :w  a$  [        S[        U5       S[        U5       S35      e/ nSU;   a7  UR                   R                  5       [        R                  :X  a  [        S5      e[        Xe5       H  u  pU(       d  M  UR!                  U	5        M!     U$ [#        [%        U4S	 jU5      5      n
['        T5      (       a  U
S S
 $ U
$ s  snnf )NT)symint)r?   ry   rz   z(The length of output_differentiability (z)), does not match the number of outputs (z).FzXoutput_differentiability=False for inplace operation (version_counter won't get updated)c                F   > [        U R                  U R                  T5      $ r   )r-  r?   ry   )rrj   s    r'   <lambda>,gen_differentiable_outputs.<locals>.<lambda>e  s    *1661664@r&   rV   )r@   rj   r   r   return_namesreturnsr}   ry   return_typerz   rJ   rM   r   r   r   r   r   r   filterru   )r   r#  r]   r?   retoutputsrJ   differentiable_outputsdifferentiableoutput candidate_differentiable_outputsrj   s              @r'   gen_differentiable_outputsr>  G  s    	A772773<D S--a0!&&..A+ BID 	__S6??A	

 B  + AEt<<$+'(CL8:3?W;X:Y Z99<WbJ  >@,,*BTBT1Tj  '**B&L"N~&--f5 'M &%'+@'J($ /33//=+s   'AF)rj   rd   rk   r   rc   r9   )rj   rd   rc   r9   )r   r   rc   r   )r]   r   rc   r9   )r]   r   r   r   rc   r9   )r   )
r   r   r   6dict[FunctionSchema, dict[str, DifferentiabilityInfo]]r   r?  r   r   rc   z)tuple[DifferentiabilityInfo | None, bool])r  zlist[NativeFunction]r   r?  rc   z-list[NativeFunctionWithDifferentiabilityInfo])r?   r   ry   r   rj   rd   rc   r9   )r   r   r#  r   rc   zlist[DifferentiableOutput])2
__future__r   rg   dataclassesr   typingr   r   torchgenr   torchgen.apir   torchgen.api.typesr	   r
   r   r   torchgen.modelr   r   r   r   r   r   r   r   torchgen.utilsr   collections.abcr   r   r)   r4   r=   rm   rr   ru   rw   r}   r   r   r   r   r   r   r   r   r+  r-  r>  r   r&   r'   <module>rI     s   " 	 ! &   J J	 	 	 ' ( $   $  6 $& & &< $h
 h
 h
V0$ $    $   $B B B.b9 .. ! 	 # 
D "U$U#U
'U U /Upr*rSr 3rj
!=	 =F#0/#069#0#0r&   