
    i                     |   U 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mZ d dl	m
Z
 d dlmZmZmZmZmZmZmZmZ d dlmZmZmZ d dlZd dlmc mZ d dlmZ d dlmZ m!Z! d dl"m#Z#m$Z$ d d	l%m&Z& erd d
l'm(Z(  ede      Z) edd      Z* e+ed      xr	  e+ed      Z,ejZ                  d        Z. G d d      Z/de/de!fdZ0i Z1e2e3df   e4d<   e!jj                  e!jl                  e!jn                  e!jp                  e!jr                  e!jt                  e!jv                  gZ< G d de/e jz                        Z>d Z?d Z@d ZAd ZB G d d      ZC eC       aDdAd ZEd! ZFd" ZGd# ZHd$ ZId% ZJd& ZK eL       aMeLd'   e4d(<   d) ZNd* ZOd+ ZP G d, d'e/ee*e)f         ZQ G d- d.eQe*e)f         ZRd/ ZSd0ej                  d1eUfd2ZV G d3 d4ee*e)f         ZWdeWe*e)f   d5e*j                  d6e*j                  d1e)fd7ZZ G d8 d9ej                        Z\d: Z]d; Z^ G d< d=ej                        Z_ G d> d?ej                        Z` e`       Zae`e4d@<   y)B    N)Iterator)cached_property)AnyCallableClassVarfinalGenericOptionalTYPE_CHECKINGUnion)Concatenate	ParamSpecTypeVar)_utils_internal)_dispatch_is_included_in_aliasDispatchKey)dispatch_functorchTransformType)TorchDispatchMode)BaseFunctionalizeAPI_T)default_P.getdlopenflagssetdlopenflagsc               #      K   t         sd yt        j                         } t        j                  | t        j
                  z         	 d t        j                  |        y# t        j                  |        w xY ww)z
    Context manager to set the RTLD_GLOBAL dynamic linker flag while we open a
    shared library to load custom operators.
    N)_SET_GLOBAL_FLAGSsysr   r   ctypesRTLD_GLOBAL)	old_flagss    D/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_ops.pydl_open_guardr#   +   s\      ""$Iy6#5#556&9%9%s   AA=	A# A=#A::A=c                       e Zd ZdZd Zd Zd Zd Zdee	e
   e	ej                     eef   deeeef   geeef   f   fdZd	eed
ef   ef   deed
ef   ef   fdZd Zy)OperatorBasez
    Base class for OpOverload (which represents C++ ATen operators) and HigherOrderOperator
    (which represents Python-only operators that are unrepresentable in TorchScript).
    c                 <    i | _         i | _        i | _        i | _        y N)_dispatch_cache
py_kernelspython_key_tablefunctorch_tableselfs    r"   __init__zOperatorBase.__init__B   s1    $  	 BD  	  "    c                     t         r'   NotImplementedErrorr-   argskwargss      r"   __call__zOperatorBase.__call__n       !!r/   c                     || j                   v S r'   )r)   )r-   ks     r"   has_kernel_for_dispatch_keyz(OperatorBase.has_kernel_for_dispatch_keyq   s    DOO##r/   c                     | j                   D ]5  }t        j                  j                  |      r#|j	                  |      s5 y y)NTF)r)   torch_C_dispatch_is_alias_keyhas)r-   ksr9   s      r"   has_kernel_for_any_dispatch_keyz,OperatorBase.has_kernel_for_any_dispatch_keyt   s9     	A882215"&&)	 r/   r9   returnc                 d     dt         t        t        f   dt         t        t        f   f fd}|S )NfnrB   c                 b   t        j                        ret        t              st        t        j
                        r;j                  vsJ | j                  <   j                  j                          | S t        t              r!j                  vsJ | j                  <   | S t        t              sJ t        j                  k7  sJ d       j                  v rt        d dj!                                | j                  <   j                  j                          | S )Nz>Please register a mode for the DispatchKey.Python key instead.z%Trying to override a python impl for z on operator )inspectisclass
issubclassr   r<   Tensorr*   r(   clear
isinstancer   r+   r   Pythonr)   RuntimeErrorname)rD   r9   r-   s    r"   innerz#OperatorBase.py_impl.<locals>.inner   s   q!1/0Jq%,,4O 5 5555+-%%a($$**,	!]+ 4 4444*,$$Q'	a---*** P* DOO#";A3mDIIK=Y  "$DOOA  &&(Ir/   )r   r   r   )r-   r9   rO   s   `` r"   py_implzOperatorBase.py_implz   s/    	hr2v& 	8BF+; 	8 r/   rD   r   c                    ddl mm}mm dt
        j                  dt
        j                  dt        ffd}dt        |   dt
        j                  dt
        j                  dt        ffd}dt
        j                  dt
        j                  dt        ffd	} | j                  t        j                        |        | j                  |      |        | j                  t        j                        |       S )
Nr   )CppFunctionalizeAPIFunctionalTensorModeFunctorchFunctionalizeAPIPythonFunctionalizeAPIr4   r5   rB   c                  &             g| i |S r'    )r4   r5   rR   rD   s     r"   functionalize_dk_fnz?OperatorBase.py_functionalize_impl.<locals>.functionalize_dk_fn   s    )+=d=f==r/   modec                 (      |       g|i |S r'   rW   )rY   r4   r5   rU   rD   s      r"   functionalize_dispatch_mode_fnzJOperatorBase.py_functionalize_impl.<locals>.functionalize_dispatch_mode_fn   s      ,T2DTDVDDr/   c                 (      |       g|i |S r'   rW   )interpreterr4   r5   rT   rD   s      r"   functionalize_functorch_fnzFOperatorBase.py_functionalize_impl.<locals>.functionalize_functorch_fn   s      /<NtNvNNr/   )#torch._subclasses.functional_tensorrR   rS   rT   rU   r   r4   r5   r   r
   rP   r   Functionalizer   )	r-   rD   rS   rX   r[   r^   rR   rT   rU   s	    `    @@@r"   py_functionalize_implz"OperatorBase.py_functionalize_impl   s    	
 	
	>rww 	>")) 	> 	>	E/0	E9;	ELNII	E	E
	O "	O3599	O	O
 	0[../0CD*)*+IJ1]0012LM	r/   c                     t         r'   r1   r,   s    r"   rN   zOperatorBase.name   r7   r/   N)__name__
__module____qualname____doc__r.   r6   r:   rA   r   typer   r<   rI   r   r   r   r   r   rP   r   ra   rN   rW   r/   r"   r%   r%   <   s    
*"X"$%"#
% 
8BF#$hr2v&66	7%d;'=r'ABBFG	+4b892=	>>"r/   r%   opr9   c                    | j                  |      r|S t        j                  }|t        j                  k(  st	        ||      r| j                  |      r|S t        j
                  }|t        j                  k(  st	        ||      r| j                  |      r|S | j                  t        j                  j                  |            xs | j                  t        j
                        }t        j                  }|t        j                  k7  r!t	        ||      r| j                  |      r|s|S t        j                  }|t        j                  k(  st	        ||      r\| j                  |      rK|t        j                  k(  r4| j                  t        j                  j                        rt        d      |s|S t        j                  }t	        ||      r| j                  |      r|S t        j                   }t	        ||      r| j                  |      r|S t        j                  j#                  |      r|S t%        d|  d|       )Nzambiguous autogradother kernelzcould not find kernel for  at dispatch key )r:   r   &CompositeExplicitAutogradNonFunctional	Undefinedis_included_in_aliasCompositeExplicitAutogradrA   r<   r=   *_dispatch_get_backend_keyset_from_autograd%CompositeImplicitAutogradNestedTensorCompositeImplicitAutogradAutogradOther _dispatch_autogradother_backendsrM   AutogradFuncTorchBatchedDecomposition_dispatch_has_backend_fallbackr2   )rh   r9   candhas_backend_kernels       r"   resolve_keyry      s   	%%a(==D	["""&:1d&C

(
(
.00D	["""&:1d&C

(
(
.;;;;A> O		'	'(M(M	N  <<D	
k##	#(<Q(E**40"00D	["""&:1d&C

(
(
.)))b.P.PHH55/
 ?@@#KDAt$)G)G)M44DAt$)G)G)Mxx..q1 
 :2$>OPQsS
TTr/   HigherOrderOperator_higher_order_opsc                       e Zd Zdd fd
Zdeee   eej                     e	e
f   deeeef   geeef   f   f fdZdeeef   deeef   fdZed	        Zedefd
       Zd Zd Zej0                  d        Zd Zd Zd Z xZS )rz   F)	cacheablec                0   t         |           t        |       t        u rt	        d      || _        || _        | t        |<   d| _        d| _	        || _
        t        j                  j                         | _        t        D ]  }| j!                  |        y )NzODirect instantiation of HigherOrderOperator is not allowed. Please subclass it.higher_ordertorch.ops.higher_order)superr.   rg   rz   rM   _namerc   r{   _nsrd   
_cacheabler<   r=   _dispatch_keyset_fullnon_fallthrough_keys2_HIGHER_ORDER_OP_DEFAULT_FALLTHROUGH_DISPATCH_KEYSfallthrough)r-   rN   r}   dispatch_key	__class__s       r"   r.   zHigherOrderOperator.__init__  s    :,,a  
 "&$!2#$)HH$B$B$D!N 	+L\*	+r/   r9   rB   c                     t        |t              r;| j                  j                  |      s | j                  j	                  |      | _        t
        |   |      S r'   )rK   r   r   r?   addr   rP   r-   r9   r   s     r"   rP   zHigherOrderOperator.py_impl4  sJ     a%d.G.G.K.KA.N(,(A(A(E(Ea(HD%wq!!r/   rD   c                      dt         j                  dt         j                  dt        f fd}  j	                  t
        j                        |       S )Nr4   r5   rB   c                     t        j                         r+t        j                  t         j                  d g | |      r0t         j
                  j                         5   | i |cd d d        S ddlm}  |      rK j                  | i |}t        d |j                  D              rt        dj                          d       | i |S # 1 sw Y   jxY w)Nc                     | j                    S r'   )requires_grad)ts    r"   <lambda>zRHigherOrderOperator.py_autograd_impl.<locals>.maybe_run_autograd.<locals>.<lambda>H  s    aoo- r/   r   )_has_gen_schemac              3   4   K   | ]  }|j                     y wr'   )is_write.0args     r"   	<genexpr>zSHigherOrderOperator.py_autograd_impl.<locals>.maybe_run_autograd.<locals>.<genexpr>R  s     @s||@s   zThe z HigherOrderOperator does not currently support training with in-place input or buffer mutations If you require this feature, please submit an issue to PyTorch. Alternatively, consider creating your own custom autograd.Function. )r<   is_grad_enabledpytreetree_all_onlyrI   r=   _AutoDispatchBelowAutogradtorch._higher_order_ops.utilsr   
gen_schemaany	argumentsrM   rN   )r4   r5   r   schemarD   r-   s       r"   maybe_run_autogradz@HigherOrderOperator.py_autograd_impl.<locals>.maybe_run_autogradE  s    ((*f.B.B-$/
 XX88: 1001 1 Ft$($9&9@v/?/?@@&tyy{m ,_ _  t&v&&1 1s   CC)r   r4   r5   r   rP   r   rt   )r-   rD   r   s   `` r"   py_autograd_implz$HigherOrderOperator.py_autograd_implA  sF    	'bgg 	' 	'r 	'. 	+[))*+=>	r/   c                     | j                   S r'   )r   r,   s    r"   	namespacezHigherOrderOperator.namespace`      xxr/   c                    ddl m} | j                  xss | j                   d| j                   t
        j                  j                  j                  v xs2 t        | |      xr$ t
        j                  j                  j                  S )Nr   )AutogradFunctionApply.)"torch._functorch.autograd_functionr   r   rd   rc   r<   	_inductorconfig!unsafe_marked_cacheable_functionsrK   
_functorch.autograd_cache_allow_custom_autograd_functions)r-   r   s     r"   r}   zHigherOrderOperator.cacheabled  su    L OO //"!DMM?3%%GGH 4!67 [$$++ZZ	
r/   c                 D    | j                   j                  |      | _         y r'   )r   remove)r-   r   s     r"   r   zHigherOrderOperator.fallthroughr  s    $($=$=$D$D\$R!r/   c                   ddl m} || j                  v r)| j                  |   }t        |t              rJ  ||i |S |t        j
                  k(  rt        | ||      S |t        j                  k(  rqg d fd}g ||j                         D ]0  } ||       t        |t        t        f      s"|D ]
  } ||        2 t              }	ddl m}
  |       }|t        |      | j                  v r5| j                  t        |         } |
       5 } ||g|i |}d d d        nc|j                  r% |
       5 }|j                  | g ||      cd d d        S t!        d| j"                   d| d| d	| d
| j"                   d| d      t$        ur|S |	D ]  }t        |      }|j                  t&        j(                  j*                  k(  r6|t&        j,                  j.                  j0                  u rMt&        j,                  j.                  j2                  }| j                  |   } ||j4                  g|i |}|c S || j                  v r| j                  |   } ||i |}nt!        d| j"                   d| d      |t$        us|c S  t7        d| j"                   d| d|	D cg c]  }t        |      j8                   c} d| j"                   d| d      t&        j(                  j;                  |      }|t        j<                  k(  rddl m}
 t?               dkD  rt&        j(                  jA                  t        j                        sktC               }|J d       t        |      | j                  v sJ d| d       | j                  t        |         } |
|      5 } ||g|i |cd d d        S tE        | |      }|| jF                  vrt!        d| j"                   d| d| d      |t        j<                  k7  r| jF                  |   | j                  |<   | jF                  |   }t        |t              rJ  ||i |S # 1 sw Y   xY w# 1 sw Y   xY wc c}w # 1 sw Y   xY w)Nr   _get_current_dispatch_modec                 ^    t         j                  j                  |       j                  d      S )NrL   )r<   r=   _dispatch_keysr?   )tensors    r"   has_python_keyz4HigherOrderOperator.dispatch.<locals>.has_python_key  s"    xx..v6::8DDr/   c                 p    t        | t        j                        r |       rj                  |        y y y r'   )rK   r<   rI   append)r   r   overloaded_args_lists    r"   check_overloadedz6HigherOrderOperator.dispatch.<locals>.check_overloaded  s/    c5<<0^C5H(//4 6I0r/   )_pop_mode_temporarilyz5There was no rule registered for HigherOrderOperator z
 and mode z.Hint: set zc's supports_higher_order_operators to True. This causes all higher order operators to pass through zk's __torch_dispatch__, so handle them accordingly by adding support for HigerOrderOperators (in this case, z) in zC.__torch_dispatch__ or returning NotImplemented when not supported.z%There was no rule registered for HOP z and subclass z. We recommend filing an issue.zHigherOrderOperator 'z' is not supported for the given input types. This typically happens when using custom tensor types or dispatch modes that don't have implementations for this operation.

Current mode: z
Input types: z$

To fix this, can add support for 'z' in z's __torch_dispatch__
zIIllegal invocation of dispatch on DispatchKey.PreDispatch without a mode.zCurrent active mode z not registeredz.could not find kernel for HigherOrderOperator rj   z (resolved from ))$torch.utils._python_dispatchr   r(   rK   r   FuncTorchDynamicLayerFrontModer   rL   valueslisttupler   rg   r*   supports_higher_order_operators__torch_dispatch__r2   r   NotImplementedr<   r=   _disabled_torch_dispatch_impl_subclassesfake_tensor
FakeTensorFakeTensorMode	fake_mode	TypeErrorrc   _to_functionality_keyPreDispatch&_len_torch_dispatch_stack_pre_dispatch&_dispatch_tls_is_dispatch_key_excluded'_get_current_dispatch_mode_pre_dispatchry   r)   )r-   r   r4   r5   r   kernelr   r   aoverloaded_argsr   	curr_modehandlerrY   resultsubclass_typefunctionality_key	final_keyr   r   s                     @@r"   dispatchzHigherOrderOperator.dispatchw  s   K4///)),7F!&+6664*6**;EEE%dD&99;--- $& E5 100 , %cD%=1  ,(+,, $$89O K24I$	?d&;&;;"33DODG.0 @D ")!?!?!?@ @
 !@@24 X#,#?#?b$PV#WX X 2STXT^T^S__ijsit u))2 4WW`Va bVVZV`V`Ua b  ){ +LM  /!M ' " $S	!44xx==>  !E$5$5$A$A$L$LL$)$5$5$A$A$P$PM"33MBG$S]]DTDVDF!M D$9$99"33MBG %d5f5F-?

|>ZgYh i8 9  /!M="B '

| 4! "+ , ;J Kaa!1!1 KL M559ZZLi[Pgi  "HH::<H 7 77J
 781<hhEE"" DE	 , _, I$*?*?? *9+_E? //Y@*+<= :"49$9&9: :  l3	 DOO+%@ M##,+-=l^1N  ;222151KD  .+ fk222t&v&&U@ @X Xl !L.: :s*   Q Q /Q-,Q2Q Q*2Q;c                $      fd} |       S )Nc                     t              } t        j                  j                  |       r$t        j                  j                  | gi S t        j                        } j                  |j                         gi S r'   )	_to_flat_tupler<   	overrideshas_torch_functionhandle_torch_function_compute_keysetr   r   highestPriorityTypeId)	flat_argsdispatch_key_setr4   r5   r-   s     r"   wrapperz-HigherOrderOperator.__call__.<locals>.wrapper  s    &tV4I11)<<<)&*.4   /tVT=V=VW 4== 668;?CI r/   rW   )r-   r4   r5   r   s   ``` r"   r6   zHigherOrderOperator.__call__
  s    
	 yr/   c                 4    t        d| j                   d      )NzHigherOrderOperator z does not implement a gen_schema. This is OK as long as the hop is functional. e.g. it should not mutate its inputs and there are no input, output aliasing via views or direct referencing.)r2   r   r3   s      r"   r   zHigherOrderOperator.gen_schema&  s$    !"4::, // 0
 	
r/   c                 $    | j                          S r'   )rN   r,   s    r"   __str__zHigherOrderOperator.__str__.  s    ))+r/   c                     | j                   S r'   r   r,   s    r"   rN   zHigherOrderOperator.name1      zzr/   )rc   rd   re   r.   r   rg   r   r<   rI   r   r   r   r   r   rP   r   propertyr   r   boolr}   r   r   abcabstractmethodr6   r   r   rN   __classcell__r   s   @r"   rz   rz     s     +0 +8""#
" 
8BF#$hr2v&66	7"RV 
"b&	>   
4 
 
S
Q'f 	 6
 r/   c                 ,    t        j                  | i |S r'   )r   arg_tree_leavesr4   r5   s     r"   r   r   5  s    !!42622r/   c                 2    t        | |      }t        ||      S r'   )_get_tensorskey_extractor)r4   r5   r   tensorss       r"   r   r   9  s    4(G"677r/   c                     t        | |      }|D cg c]  }t        |t        j                        s|! }}t	        |      S c c}w r'   )r   rK   r<   rI   r   )r4   r5   flat_allr   tensor_argss        r"   r   r   >  s?    dF+H&F*Q*E1FKF Gs
   AAc                     t         j                  j                         }| D ]$  }|t         j                  j                  |      z  }& |t         j                  j	                         z
  }||z  }|S r'   )r<   r=   _dispatch_tls_local_include_setr   _dispatch_tls_local_exclude_set)r   key_maskkey_setr   s       r"   r   r   F  sb    hh668G <EHH33F;;<@@BBG GNr/   c                   $    e Zd Zd Zd Zd Zd Zy)_ModeStackStateForPreDispatchc                 $    d d g| _         d | _        y r'   )*_ModeStackStateForPreDispatch__infra_modes_schema_check_moder,   s    r"   r.   z&_ModeStackStateForPreDispatch.__init__]  s    "D\"&r/   c                 V    |t        | j                        k  sJ || j                  |<   y r'   lenr  )r-   indexrY   s      r"   setz!_ModeStackStateForPreDispatch.seta  s+    s4--....$(5!r/   c                 T    |t        | j                        k  sJ | j                  |   S r'   r  )r-   r  s     r"   getz!_ModeStackStateForPreDispatch.gete  s,    s4--....!!%((r/   c                     t        | j                  D cg c]  }||	 c}      t        | j                  d u      z   S c c}w r'   )r  r  intr	  )r-   is     r"   countz#_ModeStackStateForPreDispatch.counti  sB    t11C!Q]ACDs##4/H
 
 	
Cs   ??N)rc   rd   re   r.   r  r  r  rW   r/   r"   r  r  \  s    '))
r/   r  c                 Z    t                L t        j                  j                  j                  t        j                  j                  j
                  fv sJ |r J  fd} |       }t               }|dk(  r.t        j                  j                  t        j                  d       |S )Nc                     t         j                  j                  j                  k(  r-j	                  d      } t               j                  dd        | S t         j                  j                  j                  k(  r-j	                  d      } t               j                  dd        | S t               j                  } d t               _        | S Nr      )	r<   r=   _TorchDispatchModeKeyPROXYr  !mode_stack_state_for_pre_dispatchr  
FUNCTIONALr	  )current_modecurrent_mode_stack_pre_dispatchmode_keys    r"   _unset_modez,unset_mode_pre_dispatch.<locals>._unset_mode{  s    uxx55;;;:>>qAL-/33At<77BBB:>>qAL-/33At<<>QQLEI-/Br/   r   F)
r  r<   r=   r  r  r  r   '_dispatch_tls_set_dispatch_key_includedr   r   )r  schema_checkr   r  new_pre_dispatch_lenr  s   `    @r"   unset_mode_pre_dispatchr$  r  s    &G&I#x&&,,&&11,       =LAC
 q 889P9PRWXr/   c                 <   ddl m} ddlm} ddlm} t        | |||f      sJ t               }t        | |      r4t               j                  }|dkD  rt        d      | t               _	        n{t        | |      r8t               j                  d      }|J t               j                  d|        n7t               j                  d      }|J t               j                  d|        |dk(  r/t        j                  j                  t         j"                  d       y y )Nr   )rS   )SchemaCheckMode)ProxyTorchDispatchModezYSchemaCheckMode for pre-dispatch must be used exclusively, found other modes on the stackr  T)r_   rS   #torch._subclasses.schema_check_moder&  "torch.fx.experimental.proxy_tensorr'  rK   r   r  r	  AssertionErrorr  r  r<   r=   r!  r   r   )rY   rS   r&  r'  previous_mode_stack_lenr  s         r"   _set_mode_pre_dispatchr,    s   HCI "	
   EF$(8:MM"Q& k  BF)+>	D.	/8:>>qA###)+//488:>>qA###)+//48 !#889P9PRVW $r/   c                  v   t               } t               }|dk(  rt        d      | j                  t	        d d      S | j                  d      -t	        t        j                  j                  j                        S | j                  d      -t	        t        j                  j                  j                        S y )Nr   zTrying to pop empty mode stackT)r"  r  )r  r   r*  r	  r$  r  r<   r=   r  r  r  )
mode_stackpre_dispatch_lens     r"   _pop_mode_from_pre_dispatchr0    s    24J=?1=>>$$0&t$??~~a$&uxx'E'E'P'PQQ~~a$&uxx'E'E'K'KLL %r/   c                  2    t               j                         S r'   )r  r  rW   r/   r"   r   r     s    ,.4466r/   c                 L   | t         j                  j                  j                  t         j                  j                  j                  fv sJ | t         j                  j                  j                  k(  rt               j                  d      S t               j                  d      S r  )r<   r=   r  r  r  r  r  )r  s    r"   _get_dispatch_mode_pre_dispatchr3    s    &&,,&&11    588117770266q990266q99r/   c                  `   t               j                  t               j                  S t               j                         } | dk(  rt               j                  d      S | dk(  rKt               j                  d      t               j                  d      S t               j                  d      S y )N   r  r   )r  r	  r  r  )	stack_lens    r"   r   r     s    (*==I02EEE57==?	>46::1==> 56::1=I 2377: 78<<Q?
 r/   c                      t         S r'   )"_mode_stack_state_for_pre_dispatchrW   r/   r"   r  r    s    --r/   
OpOverload
cached_opsc                 .    t         j                  |        y r'   )r:  r   )op_overloads    r"   add_cached_opr=    s    NN;r/   c                  ,    t         j                          y r'   )r:  rJ   rW   r/   r"   reset_cached_opsr?    s    r/   c                      t         S r'   )r:  rW   r/   r"   get_cached_opsrA    s    r/   c                       e Zd Zdddeeef   deeeef   ef   dej                  j                  dee   ddf fd	Zedefd
       Zedefd       Zedej                  j$                  fd       Zd$dZd Zdej,                  dej.                  defdZdej                  j2                  dej,                  dej.                  defdZd Zd Zdedef fdZdej                  j2                  def fdZe defd       Z!defdZ"dej,                  dej.                  defdZ#deddfdZ$dede%eeeef   f   fdZ&d  Z'e d!        Z(e d"        Z)e d#        Z* xZ+S )%r9  overloadpacketOpOverloadPacketrh   op_dkr   tagsrB   Nc                    t         |           || _        || _        || _        || _        || _        |j                  dk(  rdn|j                  | _        |r!t        j                  j                  |v | _        | j                  j                  | _        |j                  r"| xj                  d|j                  z   z  c_        | j                  j                  j                  d      d    d| j                   | _        |j"                  | _        |j"                  |_        | j                  | _        i | _        | j$                  t        j(                  j*                  v | _        d }| j                  j.                  D ]B  }|j0                  ||j0                  j2                  })|j0                  j2                  xs |}D |d uxr | | _        y )N r   r   ::r  )r   r.   _op_op_dk_schema_overloadpacket_tagsoverload_name_overloadnamer<   Tagnondeterministic_seeded_nondeterministic_seededrN   r   splitrc   rd   re   __annotations__library_defs_defined_in_pythonr   
alias_infor   is_view)	r-   rC  rh   rE  r   rF  r   r   r   s	           r"   r.   zOpOverload.__init__  s    	-
--3I9M9M 	 ,1II,M,MQU,UD)\\&&
JJ# 4 444J<<,,2248;<Ad>P>P=QR(33&11 JJ! #'"3"3u}}7J7J"J '' 	=A||#<<00 <<00<H	=  t+<Hr/   c                 V    | j                   j                  j                  dd      d   S )NrI  r  maxsplitr   rL  rN   rT  r,   s    r"   
_namespacezOpOverload._namespace1  '    ||  &&ta&8;;r/   c                 V    | j                   j                  j                  dd      d   S )NrI  r  r\  r^  r,   s    r"   _opnamezOpOverload._opname5  r`  r/   c                     t         j                  j                  | j                  j                  | j                  j
                        S r'   )r<   r=   _dispatch_find_schema_or_throwrL  rN   rO  r,   s    r"   _handlezOpOverload._handle9  s2    xx66LLt||99
 	
r/   c                     | S r'   rW   r-   memos     r"   __deepcopy__zOpOverload.__deepcopy__@      r/   c                 V    d| j                    d| j                   d| j                   dS )Nz<OpOverload(op='r   z', overload='z')>)r_  rb  rP  r,   s    r"   __repr__zOpOverload.__repr__C  s.    !$//!2!DLL>tOaOaNbbeffr/   r4   r5   c                &     | j                   |i |S r'   rJ  r3   s      r"   r6   zOpOverload.__call__H  s    txx(((r/   keysetc                B     | j                   j                  |g|i |S r'   )re  redispatch_boxed)r-   ro  r4   r5   s       r"   
redispatchzOpOverload.redispatchM  s%     -t||,,VEdEfEEr/   c                 ,    t        | j                        S r'   hashrJ  r,   s    r"   __hash__zOpOverload.__hash__R      DHH~r/   c                      dj                   g | j                  j                  j                  d      | j                   S )Nz{}.{}.{}rI  )formatrL  rN   rT  rP  r,   s    r"   r   zOpOverload.__str__V  s8     z  T$,,"3"3"9"9$"?TASASTTr/   r9   c                     t         |   |      xs. t        j                  j	                  | j                         |      S r'   )r   r:   r<   r=   %_dispatch_has_kernel_for_dispatch_keyrN   r   s     r"   r:   z&OpOverload.has_kernel_for_dispatch_keyY  s9    w2
 LXX;;DIIKK	Lr/   r@   c                     t         j                  j                  | j                         |      xs t        |   |      S r'   )r<   r=   )_dispatch_has_kernel_for_any_dispatch_keyrN   r   rA   )r-   r@   r   s     r"   rA   z*OpOverload.has_kernel_for_any_dispatch_key^  s7    xxAAIIK
 9W4R8	9r/   c                     | j                   S r'   )r_  r,   s    r"   r   zOpOverload.namespacec  s    r/   c                     t         j                  }|| j                  v xs. t        j                  j                  | j                         |      S r'   )r   rq   r)   r<   r=   r{  rN   )r-   dks     r"   _can_decomposezOpOverload._can_decomposeg  s?    22T__$ 
(V(VIIK)
 	
r/   c                     t         j                  }|| j                  v r | j                  |   |i |S t        j                  j                  | j                         |      r | j                  |g|i |S t        S r'   )	r   rq   r)   r<   r=   r{  rN   rK  r   )r-   r4   r5   r  s       r"   	decomposezOpOverload.decomposem  sq    22 
 '4??2&777XX;;DIIKL4;;r3D3F33!!r/   keyc                 <    | j                   j                  |d        y r'   )r(   pop)r-   r  s     r"   _uncache_dispatchzOpOverload._uncache_dispatch  s      d+r/   c                      j                   vsJ   d        t        j                  k(  rt         t              s( j
                  s j                   <   t                S dt        j                  dt        j                  dt        f fd}| j                   <   t                |S t        j                  j                        }|t        j                  k(  rjt               }|dkD  r[t        j                  j!                  t        j                        s.dt        j                  dt        j                  dt        f fd}|S t#               }t        j                  k7  }t        j$                  k(  rEdd lmc m} |j,                  r0|j/                   |      }|r| j                   <   t                |S  j0                  j3                  ||      }|r| j                   <   t                |S )N r4   r5   rB   c                  0   ddl m} t         |             }|J d       |j                  vrt	        t
              r`t        j                  j                  j                         5 }t        j                  j                  j                  |g| i |cd d d        S  j                  g| i |S t        j                  j                  j                         5 } j                  |   |g| i |cd d d        S # 1 sw Y   TxY w# 1 sw Y   y xY w)Nr   r   zDIllegal invocation of dispatch on DispatchKey.Python without a mode.)r   r   rg   r*   rK   TorchBindOpOverloadr<   utils_python_dispatchr   _libraryhandle_dispatch_moderK  )r4   r5   r   r   rY   r  r-   s        r"   r   z)OpOverload._get_dispatch.<locals>.handler  s   S !!;!=>	 , Z, D$9$99!$(;<!KK88NNPTX#(>>#7#7#L#L $d$-1$5;$   +t{{3@@@@[[11GGI ST;400;DR4R6RS S S Ss   '.D D D	Dr   c                      t         j                  d        } |       5 }t        j                  j                  j
                  |g| i |cd d d        S # 1 sw Y   y xY w)Nc               3   `   K   t               } 	 |  t        |        y # t        |        w xY wwr'   )r0  r,  )top_modes    r"   (_temporarily_pop_modes_from_pre_dispatchz[OpOverload._get_dispatch.<locals>.handler.<locals>._temporarily_pop_modes_from_pre_dispatch  s)     #>#@="*N28<28<s   . .+.)
contextlibcontextmanagerr<   r  r  r  )r4   r5   r  r   r-   s       r"   r   z)OpOverload._get_dispatch.<locals>.handler  sh    ..= /= BC y$~~33HH%t .2 6<   s   .AA )r(   r   rL   rK   r  r*   r=  r   r4   r5   r   r<   r=   r   r   r   r   ry   r`   torch._dispatch.python	_dispatchpythonCROSSREF_FUNCTIONALIZEmake_crossref_functionalizer)   r  )	r-   r  r   r   curr_stack_lenr   cache_result
pydispatchrs	   ``       r"   _get_dispatchzOpOverload._get_dispatch  s   $...?4&#?.+$$$d$78AVAV,/$$S)d#
Srww S")) S S0 )0D  %$N!HH::3? 7 77CEN "GG&&
277 bii B & c*	 k555
 ++++7700$@@yQ07D((-!$'OO	95()D  %$r/   c                     | j                   S r'   r   r,   s    r"   rN   zOpOverload.name  r   r/   c                     | j                   S r'   )rM  r,   s    r"   rC  zOpOverload.overloadpacket  s    ###r/   c                     | j                   S r'   rn  r,   s    r"   rh   zOpOverload.op  r   r/   c                     | j                   S r'   )rN  r,   s    r"   rF  zOpOverload.tags  s    zzr/   r'   ),rc   rd   re   r   r   r   r   r   r<   r=   FunctionSchemar   r   r.   r   strr_  rb  _DispatchOperatorHandlere  ri  rl  r4   r5   r6   DispatchKeySetrr  rv  r   r   r:   rA   r   r   r  r  r  r   r  rN   rC  rh   rF  r   r   s   @r"   r9  r9    s7   *=**= RV*= KO4b89	*=
 ''*= 3i*= 
*=X <C < < < < < 
99 
 
g
) )BII )" )
F00F9;FLNIIF	F
UL[ LT L
9%((2I2I 9d 9
 3  
 
"rww "")) " "*,[ ,T ,] ]{HRQSVDT7T1U ]~ $ $    r/   c                       e Zd Zdee   fdZej                  d        Zde	j                  de	j                  defdZdee   de	j                  de	j                  defdZy	)
r  rB   c                 ,    t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  t         j                  g}dt         f fd}|D cg c]  } ||      r| c}S c c}w )Nr  c                 .   t         j                  j                  j                         |       r.t         j                  j	                  j                         |       S | j
                  vxs) j
                  |    t         j                  j                  u S r'   )r<   r=   r{  rN   0_dispatch_kernel_for_dispatch_key_is_fallthroughr)   rV  fallthrough_kernel)r  r-   s    r"   (_may_use_fallthrough_instead_of_fallbackzWTorchBindOpOverload._fallthrough_keys.<locals>._may_use_fallthrough_instead_of_fallback	  ss    xx==diik3OxxPPIIK 
 4??* L??3'5==+K+KKr/   )r   rt   AutogradCPUAutogradCUDAADInplaceOrViewBackendSelectPythonTLSSnapshotPythonDispatcher)r-   _DEFAULT_FALLTHROUGH_KEYSr  r  s   `   r"   _fallthrough_keysz%TorchBindOpOverload._fallthrough_keys  s       ##$$''%%))((%
!		+ 		 1
7< 
 	
 
s   =Bc              #      K   ddl m}m}m} 	 | |vr || |j                         d  | |v r|| = y y # | |v r|| = w w xY ww)Nr   )_EffectType_register_effectful_opSIDE_EFFECTS)torch._higher_order_ops.effectsr  r  r  ORDERED)r-   r  r  r  s       r"   %_register_as_effectful_op_temporarilyz9TorchBindOpOverload._register_as_effectful_op_temporarily  sZ     	
 	
	'<'&t[-@-@A|# & $t|# & $s   ?2 	?
<?r4   r5   c                    t        ||      r>| j                         5   | j                  | j                         g|i |cd d d        S  | j                  |i |S # 1 sw Y   xY wr'   )_must_dispatch_in_pythonr  _dispatch_in_pythonr  rJ  r3   s      r"   r6   zTorchBindOpOverload.__call__,  sx    #D&1 ;;= /t//**,/37=  txx(((	 s   $AA&fallthrough_keysc           	         t         j                  j                         }|D ]  }|j                  |      } t	        |||      }|j                         }|| j                  vr| j                  |      n| j                  |   }t        |t              r]t         j                  j                  | j                         |      r | j                  ||gz   g|i |S t        d|  d| d| d      t        |t              sJ  ||i |S )NzTorchbind op z4 received a FakeScriptObject input when dispatching z. but no python implementation is found. Please file an issue on this when you encounter this error. This error can happen when you export or compile the model. It can still happen even if a C++ implementation for zz.  has been registered. That's because FakeScriptObject purely lives in python and cannot work  with a C++ implementation.)r<   r=   r   r   r   r   r(   r  rK   r   r  rN   r  rM   r   )	r-   r  r4   r5   r   r  r   r   r   s	            r"   r  z'TorchBindOpOverload._dispatch_in_python>  sF     %xx==?# 	DC#7#>#>s#C 	D +49MN'==? 4#7#77 |,%%l3 	 g{+ xxHH		\ 0t//$~5   v%YZaYb cI JV W.	/  '8,,,'''r/   N)rc   rd   re   r   r   r  r  r  r  r   r4   r5   r   r6   r  rW   r/   r"   r  r    s    
4#4 
< ' '") )BII )" )$'( $[ 1'(:<'''(MOYY'(	'(r/   r  c                 4    t        j                  d | |f      S )Nc                 ^    t        | t        j                  j                  j                        S r'   )rK   r<   r  fake_class_registryFakeScriptObject)objs    r"   r   z*_must_dispatch_in_python.<locals>.<lambda>j  s     J33DD
 r/   )r   tree_anyr   s     r"   r  r  h  s!    ??	
 
v	 r/   r   rB   c                 :    t        d | j                  D              S )Nc              3   d   K   | ](  }t        |j                  t        j                         * y wr'   )rK   rg   r<   	ClassTyper   s     r"   r   z)_has_script_object_arg.<locals>.<genexpr>r  s     Qz#((EOO4Qs   .0)r   r   )r   s    r"   _has_script_object_argr  q  s    Q@P@PQQQr/   c            
           e Zd ZU dZee   ed<   dededeee	f   de
e   ddf
d	Zdd
Zd Zd Zd Zed        Zed        Zdedeee	f   fdZdee   fdZdej.                  dej0                  de	fdZd Zy)rD  	torch.ops__file__qualified_op_nameop_namerh   overload_namesrB   Nc                     || _         || _        || _        || _        g | _        t        d | j                  j                         D              | _        y )Nc              3   2   K   | ]  }t        |        y wr'   )r  )r   r   s     r"   r   z,OpOverloadPacket.__init__.<locals>.<genexpr>  s      .
/5"6*.
s   )	_qualified_op_namerc   rJ  _overload_names_dirr   _schemasr   _has_torchbind_op_overload)r-   r  r  rh   r  s        r"   r.   zOpOverloadPacket.__init__z  sP     #4-!	*- .
9=9M9M9O.
 +
'r/   c                     | S r'   rW   rg  s     r"   ri  zOpOverloadPacket.__deepcopy__  rj  r/   c                 R     dj                   | j                  j                  d       S )Nz<OpOverloadPacket(op='{}.{}')>rI  ry  r  rT  r,   s    r"   rl  zOpOverloadPacket.__repr__  s,    6/66$$**40
 	
r/   c                 ,    t        | j                        S r'   rt  r,   s    r"   rv  zOpOverloadPacket.__hash__  rw  r/   c                 R     dj                   | j                  j                  d       S )Nz{}.{}rI  r  r,   s    r"   r   zOpOverloadPacket.__str__  s$    w~~t66<<TBCCr/   c                     | j                   S r'   rn  r,   s    r"   rh   zOpOverloadPacket.op  r   r/   c                     | j                   D ci c]-  }|t        j                  j                  | j                  |      / c}S c c}w r'   )r  r<   r=   _get_schemar  )r-   rO  s     r"   r  zOpOverloadPacket._schemas  sF     "&!5!5
 588//0G0GWW
 	
 
s   2Ar  c           
         	 |j                  d      rt        | j                  |      S 	 	 |dk(  rdn|}t
        j                  j                  | j                  |      }|t        dt	        |        d	| d      |\  }}}t
        j                  j                  | j                  |      }t        |      st        | ||||      nt        | ||||      }t        | ||       | j                  j                  |       |S # t        $ r3 t        dt	        |        dt	        | j                         d| d      d w xY w# t         $ r t        dt	        |        d	| d      d w xY w)
N__'zH' can't have an overload name beginning with '__' and the underlying op z has no attribute z either.r   rH  zThe underlying op of 'z' has no overload name ')
startswithgetattrrJ  AttributeErrorr  r<   r=   _get_operation_overloadr  r  r  r9  r  setattrr  r   rM   )	r-   r  use_key
op_dk_tagsop_op_dk_rF  r   overloads	            r"   __getattr__zOpOverloadPacket.__getattr__  s   	~~d#txx-- $	9,b#G99''J !$,SYK7OPSuTUV  !+CXX))$*A*A7KF .f5 4ffd;(sFFDI  D#x(IIS!OA  	
 !CI; !!$TXX/A#hP 	B  	 (T3KC5PQR	s   &C> CD= ><D:=&E#c                 ,    t        | j                        S r'   iterr  r,   s    r"   __iter__zOpOverloadPacket.__iter__      DIIr/   r4   r5   c                t    | j                   rt        ||      rt        | g|i |S  | j                  |i |S r'   )r  r  !_call_overload_packet_from_pythonrJ  r3   s      r"   r6   zOpOverloadPacket.__call__  sB     **/Gf/U4TKDKFKKtxx(((r/   c                 H    | j                   D cg c]  }|r|nd
 c}S c c}w )Nr   )r  )r-   ns     r"   	overloadszOpOverloadPacket.overloads  s#    /3/C/CD!QI%DDDs   r'   )rc   rd   re   r  r   r  rU  r   r   r   r   r.   ri  rl  rv  r   r   rh   r  r9  r  r   r  r4   r5   r6   r  rW   r/   r"   rD  rD  w  s    )Hhsm)

 
 RV	

 S	
 

&

D   
 
/s /z"b&'9 /b(3- 
) )BII )" )Er/   rD  r4   r5   c                    t        j                  j                  | g|i |\  }}|r|S i }d }| j                         D ]?  }t	        | |      }	 t        j                  j
                  |j                  g|i |}	|} n |r ||i |S d|  d}|j                         D ]  \  }}|d| d| dz  } t        |      # t        $ r}
|
||<   Y d }
~
d }
~
ww xY w)Nz'Fail to match any TorchBindOverload of z with following exceptions:
zOverload name z:
 
)	r<   r=   (_maybe_call_torch_function_for_op_packetr  r  &_check_schema_allow_fake_script_objectrL  rM   items)rh   r4   r5   torch_function_calledret
exceptionsfound_oprO  r<  _eerr_msgr  msgs                 r"   r  r    s+    "'!R!R
"""3 
 JH 	*b-0	*??##&*.4A #H	* ((( 2"5RS  $$& 5S^C5SE445
w
  	*()J}%	*s   /C  	C	CCc                   R     e Zd ZdZdZdeddf fdZdee   fdZdede	fd	Z
 xZS )
_OpNamespacea0  
    An op namespace to dynamically bind Operators into Python.

    Say a user has created a custom Operator called "my_namespace::my_op". To
    call this op, the user will write torch.ops.my_namespace.my_op(...).
    At startup, this operation will not yet be bound into Python. Instead, the
    following sequence of magic tricks will occur:
    1. `torch.ops.my_namespace` will invoke the `__getattr__` magic method
       on the `torch.ops` object, which will create a new `_OpNamespace`
       object called `my_namespace` and set it as an attribute on the `ops`
       object.
    2. `torch.ops.my_namespace.my_op` will then invoke `__getattr__` on
       the `my_namespace` object, which will retrieve the operation via
       `torch.get_operation`, a function bound from C++, and then in a similar
       fashion bind this new object onto the `my_namespace` object.
    3. `torch.ops.my_namespace.my_op(...)` then calls this new operation
        and subsequent accesses will incur no further lookup (the namespace and
        operation will already exist).
    r  rN   rB   Nc                 F    t         |   d|z          || _        g | _        y )Nz
torch.ops.)r   r.   rN   r  )r-   rN   r   s     r"   r.   z_OpNamespace.__init__>  s#    ,-	!	r/   c                 ,    t        | j                        S r'   r  r,   s    r"   r  z_OpNamespace.__iter__C  r  r/   r  c                    |dv rt        d| d| j                   d      | j                  }| d| }| j                  dz   |z   }	 t        ||      \  }}|t        d| j                   d| d      	 ||_        t        ||||      }| j                  dz   |z   |_        t        | ||       | j                  j                  |       |S # t        $ r"}t        d| j                   d| d      |d }~ww xY w)	N)
__origin____self__zInvalid attribute 'z' for '_OpNamespace' 'r  rI  r   z'_OpNamespace' 'z' object has no attribute ')	r  rN   rd   _get_packetrM   rD  r  r  r   )	r-   r  namespace_namer  module_namerh   r  r  opoverloadpackets	            r"   r  z_OpNamespace.__getattr__F  s>   00 %gY.DTYYKqQ  -.b	:oo+n<	!,->!LBz$&tyyk1LWIUVW   $+wN
 '+oo&;n&L# 	g/0		!!  	 !"499+-H	QRS	s   -C 	C6C11C6)rc   rd   re   rf   r  r  r.   r   r  rD  r  r   r   s   @r"   r  r  '  sF    ( H"S "T "
(3- " 3 " +; " r/   r  c                     t         j                  j                  |       \  }}|1t         j                  j                  j                  ||        ||_        ||fS r'   )r<   r=   _jit_get_operationjit	_builtins_register_builtinrd   )qualname	op_modulerh   r  s       r"   r  r  k  sN    44X>B	~ 			--b(;!~r/   c                     t        | j                  | j                  j                        \  }}|J || _        || _        y r'   )r  r  rJ  rd   r  )packetrh   r  s      r"   _refresh_packetr  u  s<    $V%>%>

@U@UVB>>FJ+Fr/   c                   F     e Zd ZdZd fdZdee   fdZdedefdZ	 xZ
S )_HigherOrderNamespacer  rB   c                 2    t         |   d       g | _        y )Nr   )r   r.   r  r-   r   s    r"   r.   z_HigherOrderNamespace.__init__  s    12!	r/   c                 ,    t        | j                        S r'   r  r,   s    r"   r  z_HigherOrderNamespace.__iter__  r  r/   rN   c                     t         j                  |d       }|t        d| d      t        | ||       | j                  j                  |       |S )NzJ'_HigherOrderNamespace' 'torch.ops.higher_order' object has no attribute 'r  )r{   r  r  r  r  r   )r-   rN   rh   s      r"   r  z!_HigherOrderNamespace.__getattr__  sZ    ""4.: \]a\bbcd  	dB			r/   )rB   N)rc   rd   re   r  r.   r   r  r  rz   r  r   r   s   @r"   r  r  |  s1    H"(3- 	 	(; 	r/   r  c                   P     e Zd ZdZ fdZdedefdZdee   fdZ	d Z
d Z xZS )	_Opsz_ops.pyc                 n    t         |   d       t               | _        t	               | _        g | _        y )Nr  )r   r.   r  loaded_librariesr  r   r  r  s    r"   r.   z_Ops.__init__  s,    % #13	r/   rN   rB   c                 l    t        |      }t        | ||       | j                  j                  |       |S r'   )r  r  r  r   )r-   rN   r   s      r"   r  z_Ops.__getattr__  s0     &	dI&		r/   c                 ,    t        | j                        S r'   r  r,   s    r"   r  z_Ops.__iter__  r  r/   c                 .    t        j                  |       y)a{  
        Imports a Python module that has torch.library registrations.

        Generally, to extend PyTorch with custom operators, a user will
        create a Python module whose import triggers registration of
        the custom operators via a torch.ops.load_library call or a call
        to one or more torch.library.* APIs.

        It is unexpected for Python modules to have side effects, so some
        linters and formatters will complain. Use this API to import Python
        modules that contain these torch.library side effects.

        Args:
            module (str): The name of the Python module to import

        N)	importlibimport_module)r-   modules     r"   r)  z_Ops.import_module  s    " 	'r/   c                    t        j                  |      }t               5  	 t        j                  |       	 ddd       | j                  j                  |       y# t
        $ r}t        d|       |d}~ww xY w# 1 sw Y   ExY w)a  
        Loads a shared library from the given path into the current process.

        The library being loaded may run global initialization code to register
        custom operators with the PyTorch JIT runtime. This allows dynamically
        loading custom operators. For this, you should compile your operator
        and the static registration code into a shared library object, and then
        call ``torch.ops.load_library('path/to/libcustom.so')`` to load the
        shared object.

        After the library is loaded, it is added to the
        ``torch.ops.loaded_libraries`` attribute, a set that may be inspected
        for the paths of all libraries loaded using this function.

        Args:
            path (str): A path to a shared library to load.
        zCould not load this library: N)	r   resolve_library_pathr#   r   CDLL	ExceptionOSErrorr$  r   )r-   pathr  s      r"   load_libraryz_Ops.load_library  s    $ 33D9_ 	MMD!	M 	!!$'  M =dVDE1LM	M 	Ms(   A<A	A9%A44A99A<<B)rc   rd   re   r  r.   r  r  r  r   r  r)  r1  r   r   s   @r"   r"  r"    s:    H  (3- (&(r/   r"  ops)F)br   r  r   r(  rF   r   typescollections.abcr   	functoolsr   typingr   r   r   r   r	   r
   r   r   typing_extensionsr   r   r   r<   torch.utils._pytreer  _pytreer   r   torch._Cr   rm   r   torch._functorch.pyfunctorchr   r   r   r   r_   r   r   r   hasattrr   r  r#   r%   ry   r{   dictr  rU  r  r  r  r  AutocastCPUAutocastCUDAAutocastXPUr   ABCrz   r   r   r   r   r  r8  r$  r,  r0  r   r3  r   r  r  r:  r=  r?  rA  r9  r  r  r  r   r  rD  r4   r5   r  
ModuleTyper  r  r  r  r"  r2  rW   r/   r"   <module>rC     s   
     
  $ %	 	 	 > =  $ $ ! X J : H T3tS! C!12UwsDT7U  & & P" P"h2UL 2U[ 2Uj 79 4223 8   !!6 2`, `F	38
,
 
& &C%D "!H$XNM7: .
 !$
C % 

nwr2v nnj(*RV, j(ZR5#7#7 RD RtEwr2v tEr% R % )+% <>II% % nA 5## A H,E,, ,A(5 A(J FT r/   