Ë
    éÓ^jÁ¢  ã            )       óØ  — d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
 ddlZ	 ddlmZ dZddlmZmZmZmZmZ dd	lmZ dd
lmZ ddlmZ  ej4                  e«      ZdZdZdgg d¢g d¢g d¢dœZe
e e	e!e!e!f   ee	e!e!e!f      f   Z"dFdejF                  de$dejF                  fd„Z%de!de	e&df   de!fd„Z'edejP                  dfdejF                  de&dee	e!e!e!f      de!de!d ejR                  d!e$dejF                  fd"„Z*	 dGd#ejV                  d$e de!fd%„Z,	 dGd#ejV                  d$e de	e!e$f   fd&„Z-	 	 	 dHdejF                  d'e&d(e!d)e$de
e$e	e$e f   f   f
d*„Z.	 dId+ejF                  d,e de	ejF                  ejV                  f   fd-„Z/dd.œd/eejF                     d0eejF                     d1eejF                     d2e!d3e!d4e!d5e$d6e&d7e"de!de!d$ee    d8e d9e$d!e$de$ddf"d:„Z0dd.œd/eejF                     d0eejF                     d1eejF                     d;eejF                     d<eejF                     d2e!d3e!d4e!d5e$d=e!d6e&d7e"de!de!d$ee    d8e d9e$d!e$de$ddf(d>„Z1dd.œd/eejF                     d0eejF                     d1eejF                     d2e!d3e!d4e!d5e$d6e&d7e"de!de!d$ee    d8e d9e$d!e$de$ddf"d?„Z2dd.œd/eejF                     d0eejF                     d1eejF                     d;eejF                     d<eejF                     d2e!d3e!d4e!d5e$d=e!d6e&d7e"de!de!d$ee    d8e d9e$d!e$de$ddf(d@„Z3 G dA„ dBejh                  jj                  «      Z6dCe
e ee!   eee!      f   dDee eee!      f   dee	e!e!e!f      fdE„Z7y# e$ r dZY �Œ<w xY w)Ja¸   Muon Optimizer

Improved Muon optimizer implementation with flexible handling of high-dimensional tensors.

Combines PyTorch-style structure with options for:
- Batched spatial processing for convolutions in addition to flatten
- Optional spatial normalization
- Selectable coefficient presets
- Automatic fallback to AdamW for 1D / scalar parameters (biases, norms, etc.) and optional fallback via param groups
- AdaMuon (https://arxiv.org/abs/2507.11005)
- mUP eps damping factor (https://arxiv.org/abs/2512.05620v1)

TODO look into mUP LR scaling and independent weight-decay scale

Based on implementation by Keller Jordan, see
- https://github.com/KellerJordan/Muon/blob/master/muon.py
- https://github.com/KellerJordan/modded-nanogpt/blob/master/train_gpt.py
- https://github.com/KellerJordan/modded-nanogpt/blob/master/train_gpt_medium.py
- https://github.com/NoahAmsel/PolarExpress/blob/main/polar_express.py

Hacked together by Ross Wightman
é    N)ÚListÚMappingÚOptionalÚSequenceÚTupleÚUnion)ÚDTensorTFé   )Ú_add_scaled_Ú_check_capturable_devicesÚ
_get_valueÚ_validate_scalarÚ_zeros_scalar)ÚParamsT)Úadamw)ÚnadamwgH¯¼šò×z>é   )gu“VŽ@gš™™™™Àg�—nƒ@ @))gŸÍªÏÕV@g£¼”ÀgÑ"Ûù~j@)g´Èv¾Ÿš@ggÕçj+6ÀgF%u@)gåa¡Ö4ï@gÌH¿}]Àg’\þCúm@)g2æ®%ä@gÉå?$	Àgƒ/L¦
Fó?)g6«>W[±@gìQ¸…kÀg€H¿}8ó?))g°8Ó�y @gWŽr"b(7ÀgÓÙ=»9®0@)g‰3ç¬kT@gž)6ö$Àg—}U"Ïà?)g——Û")i@gVú}…ÖÀgêTÒ"†á?)gß¸%~Àb
@g_O"DveÀg)Ÿ™EÞß?)gÈÀ®çT`@gUß4Nž/ú¿gç³èè�Ù?)gÍ¶”˜§þ?gµ!ÙÌ²Áó¿güG‡ß†øÖ?)g··_äü³ý?g]ž“sió¿g??N!ÑÕÖ?)g9û+_ÿÿý?gŸW¾þÿó¿g—-¬|ýÿ×?))ghþ(ê'P @gÖ¾Í¹{6Àg«]!îÁ/@)gï=.Óõ+@g»íi¸©xÀgÛ’„l% à?)gúñ�º""@gPüõ+.ÀgPYJØ®1à?)gõ.¶69I
@gGË4àíñÀg—H5ºÝ?)gSO¥|g@gî•VÇù¿g@¡ýÄ™ˆØ?)gÎ�âXÏý?gžÀxDó¿gºPhæÕ?)gãkÐe€iý?gÂB?GÉØò¿gdÝˆÒØ¼Õ?)g1ïðýÿÿý?gÈj™ûÿÿó¿gZî¡öÿÿ×?)ÚoriginalÚquinticÚpolar_expressÚpolar_express_saferÚparamÚ
capturableÚreturnc                 ó@   — t        |r| j                  ¬«      S d ¬«      S )N)Údevice)r   r   )r   r   s     úZ/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/optim/muon.pyÚ
_init_stepr   Z   s   € Ü±
 §¡ÔEÐEÀÔEÐEó    ÚepsÚshape.c                 ó,   — |d   |d   }}| ||z  dz  z  S )u¨  Scale epsilon for Newton-Schulz based on matrix dimensions (Î¼P-style).

    For Î¼P compatibility, epsilon should scale as eps * sqrt(din/dout) to maintain
    consistent damping behavior across different model widths.

    Reference: https://arxiv.org/abs/2512.05620

    Args:
        eps: Base epsilon value
        shape: Shape of the matrix (out, in) or (batch, out, in)

    Returns:
        Scaled epsilon value
    éþÿÿÿéÿÿÿÿç      à?© )r    r!   ÚdoutÚdins       r   Úscale_eps_for_nsr)   ^   s)   € ð( �r‘˜E "™Iˆ#€DØ�#˜‘* Ñ$Ñ$Ð$r   ç      ð?ÚGÚstepsÚcoefficientsÚsafety_factorÚdtypeÚ	scale_epsc           	      ó2  — | j                   dv sJ d| j                   › d�«       ‚t        |«      }|dk\  rt        |d   «      dk(  sJ ‚||k  r|d| n||d   g||z
  z  z   }|rt        || j                  «      }| j	                  |d	¬
«      }	|	j                  d«      |	j                  d«      kD  }
|
r|	j                  }	|rB|	j                  |	j                  ddd	¬«      j                  |«      j                  |«      «       nB|	j                  |	j                  ddd	¬«      j                  |«      j                  |¬«      «       t        xr t        | t        «      }|r4|D ].  \  }}}|	|	j                  z  }||z  |||z  z  z   }||	z  ||	z  z   }	Œ0 nù|	j                   dkD  rt        j                   nt        j"                  }|	j%                  «       }	t        j&                  g |	j                  dd ¢|	j                  d«      ‘­|	j(                  |	j*                  ¬«      }t        j,                  |«      }t        j,                  |	«      }|D ]>  \  }}} |||	|	j                  dd|¬«        |||||||¬«        ||	||	|d|¬«       ||	}}	Œ@ |
r|	j                  }	|	S )u”  Newton-Schulz quintic iteration to compute the zeroth power / orthogonalization of gradient.

    Supports batched operation over leading dimensions.

    See
    - https://github.com/KellerJordan/Muon/blob/master/muon.py
    - https://github.com/NoahAmsel/PolarExpress/blob/main/polar_express.py
    - https://github.com/KellerJordan/modded-nanogpt/blob/master/train_gpt.py

    Args:
        G: Input gradient tensor of shape (m, n) or (batch, m, n)
        steps: Number of Newton-Schulz iterations
        coefficients: Coefficients (a, b, c) for the iteration
        eps: Numerical stability epsilon for norm
        safety_factor: Multiplicative safety factor for norm (1.01 is common safety value in 'polar express' variants)
        dtype: Computation dtype
        scale_eps: If True, scale epsilon by sqrt(din/dout) for Î¼P compatibility

    Returns:
        Orthogonalized tensor of same shape as G
    )é   é   zInput must be 2D or 3D, got zD. Flatten batch dims first.r
   r   r3   Nr$   T)r/   Úcopyr#   r2   )r#   r$   )ÚdimÚkeepdim)Úmin)r   r/   g        r*   )ÚbetaÚalphaÚout)ÚndimÚlenr)   r!   ÚtoÚsizeÚmTÚdiv_ÚnormÚmulÚadd_Úclamp_Úhas_dtensorÚ
isinstancer	   ÚtorchÚbaddbmmÚaddmmÚ
contiguousÚemptyr   r/   Ú
empty_like)r+   r,   r-   r    r.   r/   r0   Únum_csÚcoeff_sequenceÚXÚ
transposedÚ
is_dtensorÚaÚbÚcÚAÚBÚmm_fnÚCs                      r   Úzeropower_via_newtonschulzrY   v   s‚  € ð< �6‰6�VÑÐ`Ð;¸A¿F¹F¸8ÐC_Ð`Ó`ÐÜ�Ó€FØ�QŠ;œ3˜|¨A™Ó/°1Ò4Ð4Ð4à-2°fª_�\ & 5Ñ)Ø˜ RÑ(Ð)¨U°V©^Ñ<Ñ<ð ñ Ü˜s A§G¡GÓ,ˆà	�‰�5˜tˆÓ$€Að —‘˜“˜aŸf™f R›jÑ(€JÙØ�D‰Dˆñ à	�‰ˆq�v‰v�a˜X¨tˆvÓ4×8Ñ8¸ÓG×LÑLÈSÓQÕRà	�‰ˆq�v‰v�a˜X¨tˆvÓ4×8Ñ8¸ÓG×NÑNÐSVÐNÓWÔXäÒ7¤¨A¬wÓ!7€JÙà%ò 	 ‰GˆAˆq�!Ø�A—D‘D‘ˆAØ�A‘˜˜Q ™U™Ñ#ˆAØ�A‘˜˜Q™‘‰Añ	 ð "#§¡¨!¢”—’´·±ˆð �L‰L‹NˆÜ�K‰KÐ3˜!Ÿ'™' # 2˜,Ð3¨¯©¨r«
Ñ3¸A¿H¹HÈAÏGÉGÔTˆÜ×Ñ˜QÓˆÜ×Ñ˜QÓˆð &ò 	‰GˆAˆq�!Ù�!�Q˜Ÿ™ 3¨c°qÕ9Ù�!�Q˜ ¨°Õ2Ù�!�Q˜ ¨°!Õ4Ø�aˆq‰Að		ñ Ø�D‰Dˆà€Hr   Úparam_shapeÚadjust_lr_fnc                 óÈ   — t        | «      dkD  r
| d   | d   fnd\  }}|dk(  rt        d||z  «      dz  S |dk(  rdt        ||«      dz  z  S |d	k(  r||z  dz  S J d
|› d�«       ‚)av  Adjust learning rate based on parameter shape for Muon.

    Args:
        param_shape: Shape of the parameter tensor
        adjust_lr_fn: Scaling function name
            - "original": sqrt(max(1, out/in)) - Original Muon impl
            - "match_rms_adamw": 0.2 * sqrt(max(out, in)) - Kimi scaling
            - "rms_to_rms": sqrt(out/in) - Scion/Bernstein scaling
    r
   r#   r$   ©r*   r*   r   r%   Úmatch_rms_adamwçš™™™™™É?Ú
rms_to_rmsúInvalid scaling function "z
" for Muon)r<   Úmax©rZ   r[   Úout_chsÚin_chss       r   Úget_lr_scalerf   Í   s—   € ô =@ÀÓ<LÈqÒ<P�{ 2‘¨°B©Ñ8ÐV^�O€GˆVà�zÒ!ä�1�g Ñ&Ó'¨3Ñ.Ð.Ø	Ð*Ò	*à”S˜ &Ó)¨SÑ0Ñ0Ð0Ø	˜Ò	%ð ˜&Ñ  SÑ(Ð(àKÐ2°<°.À
ÐKÓKˆur   c                 ó¬   — t        | «      dkD  r
| d   | d   fnd\  }}|dk(  rd||z  dz  z  dfS |d	k(  r
||z  dz  d
fS |dk(  r|dz  d
fS J d|› d�«       ‚)zåAdjust learning rate based on parameter shape for AdaMuon.

    Args:
        param_shape: Shape of the parameter tensor
        adjust_lr_fn: Scaling function name

    Returns:
        Tuple of (scale_factor, use_rms_norm)
    r
   r#   r$   r]   r^   r_   r%   Tr`   FÚrsqrt_inç      à¿ra   z" for AdaMuon)r<   rc   s       r   Úget_adamuon_lr_scalerj   ê   s—   € ô =@ÀÓ<LÈqÒ<P�{ 2‘¨°B©Ñ8ÐV^�O€GˆVàÐ(Ò(ð �g Ñ&¨3Ñ.Ñ.°Ð4Ð4Ø	˜Ò	%Ø˜&Ñ  SÑ(¨%Ð/Ð/Ø	˜Ò	#Ø˜‰~˜uÐ$Ð$àNÐ2°<°.ÀÐNÓNˆur   Úmin_dim_sizeÚmax_aspect_ratioÚreturn_reasonc                 ór  — | j                   }| j                  dk  st        d„ |D «       «      dk  r|rdS dS |d   dk(  s|d   dk(  r|rdS dS | j                  dk\  r|d   }d}|dd	 D ]  }||z  }Œ	 ||f}n|}t        |«      }	|	|k  r
|rdd
|	› �fS yt	        |«      }
|
|	z  }||kD  r|rdd|d›�fS y|rdS dS )a†  Check if a parameter is suitable for Muon optimization.

    Args:
        param: Parameter tensor
        min_dim_size: Minimum size for non-unit dimensions
        max_aspect_ratio: Maximum allowed aspect ratio
        return_reason: If True, return (bool, reason_string), else just bool (faster)

    Returns:
        If return_reason=False: bool indicating suitability
        If return_reason=True: Tuple of (is_suitable, reason_string)

    Examples:
        (64, 128) -> True (or (True, "ok") if return_reason=True)
        (96, 3, 4, 4) -> True - will be flattened to (96, 48)
        (4, 2048) -> False - extreme aspect ratio
        (64,) -> False - insufficient dims
        (1, 196, 768) -> False - leading unit dims

    NOTE: these rules were created to balance complexity with covering common timm model cases
    Please let me know if there are non-optimal cases that you run into.
    r2   c              3   ó,   K  — | ]  }|d kD  sŒ	d –— Œ y­w)r
   Nr&   )Ú.0Údim_sizes     r   ú	<genexpr>z(_is_suitable_for_muon.<locals>.<genexpr>$  s   è ø€ ÒA 8°H¸q³LœQÑAùs   ‚
�)FÚinsufficient_dimsFr   r
   )FÚleading_unit_dimsr3   Nzmin_dim_too_small:zextreme_aspect_ratio:z.1f)TÚokT)r!   r;   Úsumr7   rb   )r   rk   rl   rm   ÚsÚout_chÚin_ch_with_spatialÚdÚ
check_dimsÚmin_sizeÚmax_sizeÚaspect_ratios               r   Ú_is_suitable_for_muonr     s  € ð: 	�‰€Aà‡z�z�A‚~œÑA¨qÔAÓAÀAÒEÙ/<Ð+ÐGÀ%ÐGð 	ˆ�tˆq‚y�A�a‘D˜A’IÙ/<Ð+ÐGÀ%ÐGà‡z�z�Q‚ð �1‘ˆØÐØ�1�2�ò 	$ˆAØ !Ñ#Ñð	$àÐ0Ð1‰
ð ˆ
ô �:‹€HØ�,ÒÙØÐ.¨x¨jÐ9Ð9Ð9Øô �:‹€HØ˜hÑ&€LØÐ&Ò&ÙØÐ1°,¸sÐ1CÐDÐDÐDØá(ˆ<Ð2¨dÐ2r   ÚtensorÚmodec                 ó^  — | j                   }| j                  dk(  r| |fS | j                  dk  rt        d| j                  › �«      ‚| j                   dd \  }}|dk(  r| j                  |d«      |fS |dk(  r*| j                  ||d«      }|j	                  ddd«      }||fS t        d	|› �«      ‚)
a´  Reshape high-dimensional tensor for Muon processing.

    Args:
        tensor: Input tensor of shape (out, in, *spatial)
        mode: How to handle spatial dimensions
            - "flatten": Flatten spatial into output dimension (out, in*H*W)
            - "batched": Batch over spatial positions (spatial_prod, out, in) for per-position orthogonalization

    Returns:
        Reshaped tensor and original shape for restoration
    r2   z,Tensor must have at least 2 dimensions, got NÚflattenr$   Úbatchedr   r
   zUnknown mode: )r!   r;   Ú
ValueErrorÚreshapeÚpermute)r€   r�   Úoriginal_shaperx   Úin_chÚreshapeds         r   Úreshape_for_muonr‹   M  sÅ   € ð —\‘\€NØ‡{�{�aÒØ�~Ð%Ð%Ø‡{�{�Q‚ÜÐGÈÏÉÀ}ÐUÓVÐVà—L‘L  !Ð$�M€FˆEØˆyÒà�~‰~˜f bÓ)¨>Ð9Ð9Ø	�Ò	ð —>‘> &¨%°Ó4ˆØ×#Ñ# A q¨!Ó,ˆØ˜Ð'Ð'ä˜>¨$¨Ð0Ó1Ð1r   )r   ÚparamsÚgradsÚmomentum_bufsÚlrÚweight_decayÚmomentumÚnesterovÚns_stepsÚns_coefficientsÚ	conv_modeÚnormalize_spatialc                ó:   — t        | |||||||||	|
|||||¬«       y)z8Functional API that performs Muon algorithm computation.©r�   r�   r‘   r’   r“   r”   r    r.   r[   r•   r–   r0   r   N)Ú_single_tensor_muon)rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r    r.   r[   r•   r–   r0   r   s                   r   Úmuonrš   p  s<   € ô( ØØØØØ!ØØØØ'ØØ#Ø!ØØ+ØØö!r   Úexp_avg_sqsÚstate_stepsÚbeta2c                ó>   — t        | ||||f|||||	|
||||||||dœŽ y)a<  Functional API that performs AdaMuon algorithm computation.

    AdaMuon extends Muon with element-wise second moment estimation applied
    to orthogonalized update directions, providing Adam-like adaptive scaling
    while preserving Muon's geometric benefits.

    Reference: https://arxiv.org/abs/2507.11005
    ©r�   r�   r‘   r’   r�   r“   r”   r    r.   r[   r•   r–   r0   r   N)Ú_single_tensor_adamuon)rŒ   r�   rŽ   r›   rœ   r�   r�   r‘   r’   r�   r“   r”   r    r.   r[   r•   r–   r0   r   s                      r   Úadamuonr¡   ˜  sL   € ô< ØØØØØðð Ø!ØØØØØ'ØØ#Ø!ØØ+ØØô'r   c          	      óv  — t        |t        «      }t        | «      D �]  \  }}||   }||   }|j                  d||z  z
  «       |j	                  |d|z
  «       |r|j	                  ||«      n|j                  «       }|j                  dk\  rt        ||¬«      \  }}n|}|j                  }t        ||||	|
|¬«      }|rt        |j                  |«      }nd}|dk(  r9|j                  dk\  r*|r||j                  d   dz  z  }|j                  dd	d«      }|j                  |«      }t        ||| |z  «       �Œ y
)zSingle tensor Muon update.r
   r*   r3   ©r�   ©r    r.   r0   r„   r   ri   r2   N)Úresolve_ns_coefficientsÚ_COEFFICIENTSÚ	enumerateÚmul_Úlerp_Úcloner;   r‹   r!   rY   rf   r‡   r†   r   )rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r    r.   r[   r•   r–   r0   r   Úir   ÚgradÚmomentum_bufÚupdateÚupdate_reshapedrˆ   Úupdate_orthoÚscales                            r   r™   r™   Í  s\  € ô( .¨o¼}ÓM€Oä˜fÓ%ó -7‰ˆˆ5Ø�Q‰xˆØ$ QÑ'ˆð 	�
‰
�1�r˜LÑ(Ñ(Ô)ð 	×Ñ˜4  h¡Ô/Ù7?�—‘˜L¨(Ô3À\×EWÑEWÓEYˆð �;‰;˜!ÒÜ.>¸vÈIÔ.VÑ+ˆO™^à$ˆOØ#Ÿ\™\ˆNô 2ØØØØØ'Øô
ˆñ Ü  ×!3Ñ!3°\ÓB‰EàˆEð ˜	Ò! l×&7Ñ&7¸1Ò&<Ù Ø˜×+Ñ+¨AÑ.°$Ñ6Ñ6�à'×/Ñ/°°1°aÓ8ˆLð $×+Ñ+¨NÓ;ˆô 	�U˜L¨2¨#°©+Ö6ñ[-7r   c          	      ó¶  — t        |t        «      }|rt        | |«       t        | «      D �],  \  }}||   }||   }||   }||   }|j	                  d«       |r|n
t        |«      }|j                  d||z  z
  «       |j                  |d|z
  «       |r|j                  ||«      n|j                  «       }|j                  dk\  rt        ||¬«      \  }}n|}|j                  }t        ||
||||¬«      }|dk(  r"|j                  dk\  r|j                  ddd«      }|j                  |«      }|j                  |	«      j                  ||d|	z
  ¬	«       |rt!        |j                  |«      \  }}nd
\  }}|r |j#                  «       j	                  |«      } nXt%        j&                  |«      rdt%        j(                  |	|«      z
  nd|	|z  z
  }!||!z  j#                  «       j	                  |«      } || z  }"|r$|"j+                  «       j	                  |«      }#|"|#z  }"|dk(  r)t-        |«      dk\  r|rd}$|dd D ]  }%|$|%z  }$Œ	 ||$dz  z  }t/        ||"| |z  «       �Œ/ y)u)  Single tensor AdaMuon update.

    AdaMuon applies second-moment estimation to the orthogonalized directions,
    then rescales using RMS-alignment to maintain stable step sizes.

    Algorithm:
        1. Update momentum buffer: M = Î²â‚�Â·M + (1-Î²â‚�)Â·G
        2. Orthogonalize: O = Newton-Schulz(M) or Newton-Schulz(nesterov_update)
        3. Update second moment: v = Î²â‚‚Â·v + (1-Î²â‚‚)Â·OÂ²
        4. Bias correct: vÌ‚ = v/(1-Î²â‚‚^t)
        5. Adaptive scaling: Ã” = O / (âˆšvÌ‚ + Îµ)
        6. RMS-aligned rescaling and apply update
    r
   r*   r3   r£   r¤   r„   r2   r   )Úvalue)r*   FNri   )r¥   r¦   r   r§   rC   r   r¨   r©   rª   r;   r‹   r!   rY   r‡   r†   Úaddcmul_rj   ÚsqrtrG   Ú	is_tensorÚpowrA   r<   r   )&rŒ   r�   rŽ   r›   rœ   r�   r�   r‘   r’   r�   r“   r”   r    r.   r[   r•   r–   r0   r   r«   r   r¬   r­   Ú
exp_avg_sqÚstep_tÚstepr®   r¯   rˆ   r°   r±   Úuse_rms_normÚdenomÚbias_correction2Úupdate_adaptiveÚupdate_normÚspatial_prodrz   s&                                         r   r    r      s—  € ôF .¨o¼}ÓM€OÙÜ! &¨+Ô6ä˜fÓ%ó M:‰ˆˆ5Ø�Q‰xˆØ$ QÑ'ˆØ  ‘^ˆ
Ø˜Q‘ˆð 	�‰�AŒÙ#‰v¬°FÓ);ˆð 	�
‰
�1�r˜LÑ(Ñ(Ô)ð 	×Ñ˜4  h¡Ô/Ù7?�—‘˜L¨(Ô3À\×EWÑEWÓEYˆð �;‰;˜!ÒÜ.>¸vÈIÔ.VÑ+ˆO™^à$ˆOØ#Ÿ\™\ˆNô 2ØØØØØ'Øô
ˆð ˜	Ò! l×&7Ñ&7¸1Ò&<à'×/Ñ/°°1°aÓ8ˆLØ#×+Ñ+¨NÓ;ˆð 	�‰˜Ó×'Ñ'¨°lÈ#ÐPUÉ+Ð'ÔVñ Ü"6°|×7IÑ7IÈ<Ó"XÑˆE‘<à",ÑˆE�<áà—O‘OÓ%×*Ñ*¨3Ó/‰Eô @E¿¹ÈtÔ?T˜s¤U§Y¡Y¨u°dÓ%;Ò;ÐZ]Ð`eÐimÑ`mÑZmÐØÐ"2Ñ2×8Ñ8Ó:×?Ñ?ÀÓDˆEð '¨Ñ.ˆñ à)×.Ñ.Ó0×5Ñ5°cÓ:ˆKØ-°Ñ;ˆOð ˜	Ò!¤c¨.Ó&9¸QÒ&>Ù Ø �Ø'¨¨Ð+ò &�AØ  AÑ%‘Lð&à˜¨Ñ-Ñ-�ô 	�U˜O¨b¨S°5©[Ö9ñ[M:r   c            '       óæ   ‡ — e Zd ZdZddddededdd	d
dddddddfdededededede	de
dededee   dededee   dedeeef   dededed ef&ˆ fd!„Zˆ fd"„Z ej"                  «       d$d#„«       Zˆ xZS )%ÚMuonaþ  Muon - MomentUm Orthogonalized by Newton-schulz

    Combines Muon for 2D+ parameters (weight matrices) with AdamW for 1D parameters (biases, norms) and
    parameter groups with 'use_fallback=True' set (or 'use_muon=False' for compatibility).

    Supports two algorithms:
    - "muon": Standard Muon algorithm with momentum + orthogonalization
    - "adamuon": AdaMuon algorithm that adds element-wise second moment estimation
                 to orthogonalized directions for Adam-like adaptive scaling
    g{®Gáz”?r   çffffffî?Fr   r*   r^   rƒ   TN)gÍÌÌÌÌÌì?rÃ   rš   rŒ   r�   r�   r‘   r’   r“   r”   r    r.   r[   r•   r–   Úadamw_lrÚfallback_lr_scaleÚbetasÚalgor0   r   Úverbosec                 óò  •— t        d|«       t        d|«       t        d|d¬«       t        d|«       |dvrt        d|› �«      ‚|d	vrt        d
|› d�«      ‚|�Qt        j                  dt        d¬«       t        j                  |«      rt        d«      ‚|dk(  rt        d«      ‚||z  }t        d"i d|“d|“d|“d|“d|“d|“d|“d|	“d|
“d|“d|“d|“d|“d|“d|“d |“d!|“Ž}t        ‰| �%  ||«       y)#u0
   Create Muon optimizer.
        Args:
            params: Iterable of parameters or dicts defining parameter groups
            lr: Learning rate (default: 0.02 for Muon parameters)
            weight_decay: Weight decay coefficient
            momentum: Momentum factor for Muon
            nesterov: Whether to use Nesterov momentum
            ns_steps: Number of Newton-Schulz iterations
            ns_coefficients: Coefficients for NS iteration
            eps: Numerical stability epsilon
            safety_factor: Multiplicative safety factor for NS norm
            adjust_lr_fn: LR adjustment function - "original", "match_rms_adamw", or "rms_to_rms".
                For adamuon mode, can set to None to disable (RMS rescaling handles scaling).
            conv_mode: How to handle convolutions - "flatten" or "batched"
            normalize_spatial: Whether to normalize by sqrt(spatial_size) in batched mode
            fallback_lr_scale: Scale factor applied to lr for AdamW fallback parameters.
                The effective fallback LR is lr * fallback_lr_scale. This ensures the LR scheduler
                properly schedules fallback parameters.
            adamw_lr: Deprecated. Use fallback_lr_scale instead.
            betas: Beta coefficients - (beta1, beta2) where beta1 is used for AdamW fallback
                and beta2 is used for both AdamW fallback and AdaMuon second moment
            algo: Algorithm - "muon" for standard Muon, "adamuon" for AdaMuon with
                adaptive second moment estimation (https://arxiv.org/abs/2507.11005)
            scale_eps: If True, scale epsilon by sqrt(din/dout) in Newton-Schulz for Î¼P
                compatibility (https://arxiv.org/abs/2512.05620)
            capturable: Whether this instance is safe to capture in a CUDA graph. Capturable mode supports
                tensor learning rates and requires optimizer state tensors to live on the parameter device.
            verbose: Log parameter routing decisions (Muon vs AdamW)

        Example:
            ```python
            # Simple usage - automatically uses Muon for 2D+ params, AdamW for 1D
            optimizer = Muon(model.parameters(), lr=0.02)

            # Use AdaMuon algorithm for adaptive scaling
            optimizer = Muon(model.parameters(), lr=6e-4, algo="adamuon")

            # Manual control over parameter groups
            optimizer = Muon([
                {'params': weight_matrices, 'lr': 0.02},
                {'params': biases, 'use_fallback': True, 'lr': 3e-4}, # use AdamW if use_fallback=True
            ])
            ```
        zlearning rater�   r‘   r*   )Ú	max_valueÚepsilon)rƒ   r„   zInvalid conv_mode: )rš   r¡   zInvalid algo: z. Must be 'muon' or 'adamuon'Nzpadamw_lr is deprecated, use fallback_lr_scale=adamw_lr/lr instead. adamw_lr will be removed in a future release.r2   )Ú
stacklevelzHadamw_lr is not supported with tensor lr; use fallback_lr_scale instead.r   z8Cannot compute fallback_lr_scale from adamw_lr when lr=0r�   r’   r“   r”   r    r.   r[   r•   r–   rÅ   rÆ   rÇ   r0   r   rÈ   r&   )
r   r…   ÚwarningsÚwarnÚFutureWarningrG   r¶   ÚdictÚsuperÚ__init__)ÚselfrŒ   r�   r�   r‘   r’   r“   r”   r    r.   r[   r•   r–   rÄ   rÅ   rÆ   rÇ   r0   r   rÈ   ÚdefaultsÚ	__class__s                        €r   rÒ   zMuon.__init__–  s€  ø€ ôD 	˜¨"Ô-Ü˜¨Ô6Ü˜ X¸Õ=Ü˜ CÔ(ØÐ2Ñ2ÜÐ2°9°+Ð>Ó?Ð?ØÐ*Ñ*Ü˜~¨d¨VÐ3PÐQÓRÐRàÐÜ�M‰Mð@äØõ	ô �‰˜rÔ"Ü Ð!kÓlÐlØ�QŠwÜ Ð![Ó\Ð\Ø (¨2¡Ðäò 
Ùð
á%ð
ñ ð
ñ ð	
ñ
 ð
ñ ,ð
ñ ð
ñ (ð
ñ &ð
ñ  ð
ñ 0ð
ñ 0ð
ñ ð
ñ ð
ñ  ð
ñ  "ð!
ñ" ð#
ˆô& 	‰Ñ˜ Õ*r   c                 ó  •— t         ‰| �  |«       | j                  D ]g  }|j                  dd«       |j                  dd«       |j                  dd«       d|vsŒ>|j	                  d|d   «      }|d   d	k7  r||d   z  nd
|d<   Œi y )NrÇ   rš   r0   Fr   rÅ   rÄ   r�   r   r*   )rÑ   Ú__setstate__Úparam_groupsÚ
setdefaultÚpop)rÓ   ÚstateÚgrouprÄ   rÕ   s       €r   r×   zMuon.__setstate__  s–   ø€ Ü‰Ñ˜UÔ#Ø×&Ñ&ò 	aˆEØ×Ñ˜V VÔ,Ø×Ñ˜[¨%Ô0Ø×Ñ˜\¨5Ô1à"¨%Ò/Ø Ÿ9™9 Z°°t±Ó=�ØGLÈTÁ{ÐVWÒGW¨X¸¸d¹Ò-CÐ]`�Ð)Ò*ñ	ar   c                 óF  — | j                   j                  dd«      r9t        | d«      r| j                  «        nt        | d«      r| j	                  «        d}|�$t        j                  «       5   |«       }ddd«       | j                   j                  dd«      }d}d}|ri nd}| j                  D �]Ã  }|j                  dd	«      }g }	g }
g }g }g }g }g }g }g }g }|d
   D �]•  }|j                  €Œ|j                  j                  rt        d«      ‚| j                  |   }d|vr—d}|j                  dd«      r
d|d<   |r9d}n6d|v r|d   |d<   |r(d}n%|rt        |d¬«      \  }}nt        |d¬«      }||d<   |�A|�?dj                  d„ |j                  D «       «      }||vrg ||<   ||   j                  |«       |d   }|rà|	j                  |«       |
j                  |j                  «       |dz  }d|vr(t        j                   |t
        j"                  ¬«      |d<   |j                  |d   «       |dk(  s�Œ[d|vr:t%        ||d   «      |d<   t        j                   |t
        j"                  ¬«      |d<   |j                  |d   «       |j                  |d   «       �ŒÃ|j                  |«       |j                  |j                  «       |dz  }d|vrbt%        ||d   «      |d<   t        j                   |t
        j"                  ¬«      |d<   t        j                   |t
        j"                  ¬«      |d<   |j                  |d   «       |j                  |d   «       |j                  |d   «       �Œ˜ |	r”|dk(  rM|d   \  }}t'        |	|
|||f|d   |d   |d   |d   ||d    |d!   |d"   |d#   |d$   |d%   |d&   |d'   |d   d(œŽ nBt)        |	|
||d   |d   |d   |d   |d    |d!   |d"   |d#   |d$   |d%   |d&   |d'   |d   ¬)«       |s�Œb|d   \  }}|d   |d*   z  }|d   r%t+        |||||d||||d   |d"   dd|d   d¬+«       �ŒŸt-        ||||g |dd||||d   |d"   dd|d   d¬,«       �ŒÆ |�ršt/        |«      dkD  �r‹t0        j3                  d-|› d.|› d/�«       i }t5        |j7                  «       «      D ])  \  }}|D ]  }||vrg ||<   ||   j                  |«       Œ! Œ+ g }t5        |j7                  «       «      D ]$  \  }} |j                  |› d0t/        | «      › �«       Œ& t0        j3                  d1d2j                  |«      › �«       t0        j9                  t:        j<                  «      rœt5        |j7                  «       «      D ]€  \  }} |d3k(  rd4nd5}!t0        j3                  d6|› d7|!› d8�«       | dd9 D ]  }"t0        j3                  d:|"› �«       Œ t/        | «      d9kD  sŒ\t0        j3                  d;t/        | «      d9z
  › d<�«       Œ‚ |S # 1 sw Y   �Œ¢xY w)=z$Performs a single optimization step.r   FÚ'_accelerator_graph_capture_health_checkÚ _cuda_graph_capture_health_checkNrÈ   r   rÇ   rš   rŒ   z&Muon does not support sparse gradientsÚuse_muonÚuse_fallbackÚuse_fallback_flagÚuse_muon_flagT)rm   Úxc              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)Ústr)rp   rw   s     r   rr   zMuon.step.<locals>.<genexpr>U  s   è ø€ Ò,E¸¬S°¯VÑ,Eùs   ‚r
   Úmomentum_buffer)Úmemory_formatr¡   rº   r¸   Úexp_avgrÆ   r�   r�   r‘   r’   r“   r”   r    r.   r[   r•   r–   r0   rŸ   r˜   rÅ   )
ÚforeachÚbeta1r�   r�   r�   r    ÚcautionÚmaximizer   Úmax_lr)rë   Úamsgradrì   r�   r�   r�   r    rí   rî   r   rï   zMuon parameter routing: z Muon, z AdamWú=z  Breakdown: ú, ru   rÂ   ÚAdamWz    z -> ú:é
   z      z      ... and z more)rÔ   ÚgetÚhasattrrÞ   rß   rG   Úenable_gradrØ   r¬   Ú	is_sparseÚRuntimeErrorrÛ   r   Újoinr!   ÚappendÚ
zeros_likeÚpreserve_formatr   r¡   rš   r   r   r<   Ú_loggerÚinfoÚsortedÚitemsÚisEnabledForÚloggingÚINFO)#rÓ   ÚclosureÚlossrÈ   Ú
muon_countÚadamw_countÚrouting_reasonsrÜ   rÇ   Úmuon_paramsÚ
muon_gradsÚmuon_momentum_bufsÚmuon_exp_avg_sqsÚmuon_state_stepsÚadamw_paramsÚadamw_gradsÚadamw_exp_avgsÚadamw_exp_avg_sqsÚadamw_state_stepsÚprÛ   ÚreasonÚsuitableÚ	shape_strrà   Ú_r�   rì   Úfallback_lrÚreason_groupsÚreasonsÚreason_summaryÚshapesÚoptimizer_namer!   s#                                      r   rº   z	Muon.step  s7  € ð �=‰=×Ñ˜\¨5Ô1Ü�tÐFÔGØ×<Ñ<Õ>Ü˜ÐAÔBØ×5Ñ5Ô7àˆØÐÜ×"Ñ"Ó$ñ !Ù“y�÷!ð —-‘-×#Ñ# I¨uÓ5ˆð ˆ
ØˆÙ '™"¨Tˆà×&Ñ&ó r	ˆEØ—9‘9˜V VÓ,ˆDð ˆKØˆJØ!#Ðà!ÐØ!ÐàˆLØˆKØˆNØ "ÐØ "Ðà˜8‘_ó H<�Ø—6‘6�>Øà—6‘6×#Ò#Ü&Ð'OÓPÐPàŸ
™
 1™�ð  UÑ*à!�FØ—y‘y °Ô7à,1˜˜jÑ)Ù"Ø%8™FØ# uÑ,à,1°*Ñ,=˜˜jÑ)Ù"Ø%4™Fñ #Ü/DÀQÐVZÔ/[Ñ,˜H¡fä'<¸QÈeÔ'T˜HØ,4˜˜jÑ)ð 'Ð2°vÐ7IØ$'§H¡HÑ,E¸Q¿W¹WÔ,EÓ$E˜	Ø$¨OÑ;Ø9;˜O¨IÑ6Ø'¨	Ñ2×9Ñ9¸&ÔAð ! Ñ,�Ùà×&Ñ& qÔ)Ø×%Ñ% a§f¡fÔ-Ø !‘O�Jð )°Ñ5Ü38×3CÑ3CÀAÔUZ×UjÑUjÔ3k˜Ð/Ñ0Ø&×-Ñ-¨eÐ4EÑ.FÔGð ˜yÔ(Ø!¨Ñ.Ü,6°q¸%ÀÑ:MÓ,N˜E &™MÜ27×2BÑ2BÀ1ÔTY×TiÑTiÔ2j˜E ,Ñ/Ø(×/Ñ/°°lÑ0CÔDØ(×/Ñ/°°f±Ö>ð !×'Ñ'¨Ô*Ø×&Ñ& q§v¡vÔ.Ø 1Ñ$�Kð  UÑ*Ü(2°1°e¸LÑ6IÓ(J˜˜f™Ü+0×+;Ñ+;¸AÌU×MbÑMbÔ+c˜˜iÑ(Ü.3×.>Ñ.>¸qÔPU×PeÑPeÔ.f˜˜lÑ+à"×)Ñ)¨%°	Ñ*:Ô;Ø%×,Ñ,¨U°<Ñ-@ÔAØ%×,Ñ,¨U°6©]Ö;ðQH<ñV Ø˜9Ò$Ø$ W™~‘H�A�uÜØ#Ø"Ø*Ø(Ø(ðð ! ™;Ø%*¨>Ñ%:Ø!& zÑ!2Ø!& zÑ!2Ø#Ø!& zÑ!2Ø(-Ð.?Ñ(@Ø! %™LØ&+¨OÑ&<Ø%*¨>Ñ%:Ø"'¨Ñ"4Ø*/Ð0CÑ*DØ"'¨Ñ"4Ø#(¨Ñ#6ô'ô, Ø#Ø"Ø*Ø  ™;Ø%*¨>Ñ%:Ø!& zÑ!2Ø!& zÑ!2Ø!& zÑ!2Ø(-Ð.?Ñ(@Ø! %™LØ&+¨OÑ&<Ø%*¨>Ñ%:Ø"'¨Ñ"4Ø*/Ð0CÑ*DØ"'¨Ñ"4Ø#(¨Ñ#6õ!ó( Ø$ W™~‘��uØ# D™k¨EÐ2EÑ,FÑF�Ø˜Ò$äØ$Ø#Ø&Ø)Ø)Ø $Ø#Ø#Ø&Ø%*¨>Ñ%:Ø! %™LØ %Ø!&Ø#(¨Ñ#6Ø#÷ô$ Ø$Ø#Ø&Ø)ØØ)Ø $Ø %Ø#Ø#Ø&Ø%*¨>Ñ%:Ø! %™LØ %Ø!&Ø#(¨Ñ#6Ø#÷#ðAr	òj œs ?Ó3°aÓ7ä�L‰LÐ3°J°<¸wÀ{ÀmÐSYÐZÔ[ð ˆMÜ&,¨_×-BÑ-BÓ-DÓ&Eò <Ñ"�	˜7Ø%ò <�FØ ]Ñ2Ø02˜ fÑ-Ø! &Ñ)×0Ñ0°Õ;ñ<ð<ð  ˆNÜ"(¨×)<Ñ)<Ó)>Ó"?ò A‘�˜Ø×%Ñ%¨¨°´#°f³+°Ð&?Õ@ðAä�L‰L˜=¨¯©°>Ó)BÐ(CÐDÔEô ×#Ñ#¤G§L¡LÔ1Ü&,¨]×-@Ñ-@Ó-BÓ&Cò O‘N�F˜FØ/5¸ª~¡VÀ7�NÜ—L‘L 4¨ x¨t°NÐ3CÀ1Ð!EÔFØ!'¨¨ ò 7˜ÜŸ™ v¨e¨WÐ%5Õ6ð7ä˜6“{ RÓ'ÜŸ™ ~´c¸&³kÀBÑ6FÐ5GÀuÐ%MÕNðOð ˆ÷w!ñ !ús   Á.XØX ræ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚDEFAULT_NS_STEPSÚMUON_EPSr   ÚfloatÚboolÚintÚNSCoeffr   rç   r   rÒ   r×   rG   Úno_gradrº   Ú__classcell__)rÕ   s   @r   rÂ   rÂ   Š  sK  ø„ ñ	ð Ø"#Ø"Ø"Ø,Ø'0Ø!Ø#&Ø*;Ø&Ø&*Ø(,Ø'*Ø)4ØØ#Ø$Ø!ñ)k+àðk+ð ðk+ð  ð	k+ð
 ðk+ð ðk+ð ðk+ð %ðk+ð ðk+ð !ðk+ð # 3™-ðk+ð ðk+ð  $ðk+ð ˜u‘oðk+ð  %ðk+ð  ˜ ˜Ñ&ð!k+ð" ð#k+ð$ ð%k+ð& ð'k+ð( õ)k+ôZ	að €U‡]�]ƒ_òeó ôer   rÂ   r³   Úpresetsc                 ó²  ‡‡	— d„ Š	d„ Šdt         t           dt        t        t        t        f   fˆˆ	fd„}t        | t        «      r}| |vr9dj                  t        |j                  «       «      «      }t        d| › d|› �«      ‚||    } ‰	|«      rt        |«      d	k(  rt        d
| › d�«      ‚|D �cg c]
  } ||«      ‘Œ c}S  ‰	| «      st        d«      ‚t        | «      dk(  rt        ˆfd„| D «       «      r	 || «      gS g }t        | «      D ]5  \  }} ‰	|«      st        d|› d|›�«      ‚|j                   ||«      «       Œ7 |st        d«      ‚|S c c}w )Nc                 óT   — t        | t        «      xr t        | t        t        f«       S ræ   )rF   r   rç   Úbytes©rä   s    r   ú<lambda>z)resolve_ns_coefficients.<locals>.<lambda>ü  s    € ”z !¤XÓ.ÒR´zÀ!ÄcÌ5À\Ó7RÐ3R€ r   c                 ó\   — t        | t        j                  «      xr t        | t        «       S ræ   )rF   ÚnumbersÚRealr'  r0  s    r   r1  z)resolve_ns_coefficients.<locals>.<lambda>ý  s    € œ
 1¤g§l¡lÓ3ÒO¼JÀqÌ$Ó<OÐ8O€ r   rä   r   c                 óÀ   •—  ‰| «      r"t        | «      dk7  st        ˆfd„| D «       «      st        d| ›�«      ‚| \  }}}t        |«      t        |«      t        |«      fS )Nr3   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wræ   r&   ©rp   ÚvÚis_reals     €r   rr   z<resolve_ns_coefficients.<locals>.as_coeff.<locals>.<genexpr>   s   øè ø€ Ò2IÀ!±7¸1·:Ñ2Iùó   ƒz3Coefficient must be length-3 of real numbers, got: )r<   Úallr…   r&  )rä   rR   rS   rT   r9  Úis_seqs       €€r   Úas_coeffz)resolve_ns_coefficients.<locals>.as_coeffÿ  sZ   ø€ Ù�aŒyœC ›F ašK¬sÓ2IÀqÔ2IÔ/IÜÐRÐSTÐRWÐXÓYÐYØ‰ˆˆ1ˆaÜ�Q‹xœ˜q›¤5¨£8Ð+Ð+r   rò   zUnknown coefficients preset 'z'. Valid options: r   zPreset 'z' is empty or invalidz]Coefficients must be a preset name (str), a 3-sequence (a,b,c), or a sequence of 3-sequences.r3   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wræ   r&   r7  s     €r   rr   z*resolve_ns_coefficients.<locals>.<genexpr>  s   øè ø€ Ò9¨a™w qŸzÑ9ùr:  zItem z is not a sequence: z Coefficient list cannot be empty)r   r&  r   rF   rç   rû   r  Úkeysr…   r<   Ú	TypeErrorr;  r§   rü   )
r³   r,  r=  ÚvalidÚseqÚitemr:   r«   r9  r<  s
           @@r   r¥   r¥   ÷  sj  ù€ ñ
 S€FÙO€Gð,”HœU‘Oð ,¬¬e´U¼EÐ.AÑ(Bö ,ô �%œÔØ˜ÑØ—I‘Iœf W§\¡\£^Ó4Ó5ˆEÜÐ<¸U¸GÐCUÐV[ÐU\Ð]Ó^Ð^Ø�e‰nˆÙ�cŒ{œc #›h¨!šmÜ˜x¨ wÐ.CÐDÓEÐEØ+.Ö/ 4‘˜•Ò/Ð/á�%Œ=Üð,ó
ð 	
ô ˆ5ƒz�Q‚œ3Ó9°5Ô9Ô9Ù˜“Ð Ð ð €CÜ˜UÓ#ò #‰ˆˆ4Ù�dŒ|Ü˜e A 3Ð&:¸4¸(ÐCÓDÐDØ�
‰
‘8˜D“>Õ"ð#ñ ÜÐ;Ó<Ð<Ø€Jùò) 0s   Â0E)F)r^   )é   g      `@F)rƒ   )8r#  r  r3  rÍ   Útypingr   r   r   r   r   r   rG   Útorch.distributed.tensorr	   rE   ÚImportErrorÚ_helpersr   r   r   r   r   Ú_typesr   r   r   Ú	getLoggerr   rÿ   r%  r$  r¦   rç   r&  r)  ÚTensorr'  r   r(  r)   Úbfloat16r/   rY   ÚSizerf   rj   r   r‹   rš   r¡   r™   r    ÚoptimÚ	OptimizerrÂ   r¥   r&   r   r   ú<module>rP     sÏ  ðñó, Û Û ß B× Bã ðÝ0Ø€K÷ kÕ jÝ Ý Ý à
ˆ'×
Ñ
˜HÓ
%€ð €ØÐ ð
 	"ðòòòñ5&€ðR ��U˜5 %¨Ð.Ñ/°°e¸EÀ5È%Ð<OÑ6PÑ1QÐQÑ
R€ñF�e—l‘lð F°ð FÀÇÁó Fð%Øð%à�S˜#�X‰ð%ð ó%ð8 Ø"Ø"Ÿ^™^ØñTØ�<‰<ðTàðTð ˜5 ¨¨uÐ!4Ñ5Ñ6ðTð ð	Tð
 ðTð �{‰{ðTð ðTð ‡\�\óTðr .ñLØ—Z‘ZðLàðLð óLð> .ñOØ—Z‘ZðOàðOð ˆ5�$ˆ;ÑóOð: Ø"&Ø#ñ	E3Ø�|‰|ðE3àðE3ð  ðE3ð ð	E3ð
 ˆ4��t˜S�yÑ!Ð!Ñ"óE3ðT ñ 2Ø—‘ð 2àð 2ð ˆ5�<‰<˜Ÿ™Ð#Ñ$ó 2ðh !ò#%Ø�U—\‘\Ñ"ð%à�E—L‘LÑ!ð%ð ˜EŸL™LÑ)ð%ð
 ð%ð ð%ð ð%ð ð%ð ð%ð !ð%ð ð%ð ð%ð ˜s‘mð%ð ð%ð  ð%ð  ð!%ð" ð#%ð$ 
ó%%ðx !ò)2Ø�U—\‘\Ñ"ð2à�E—L‘LÑ!ð2ð ˜EŸL™LÑ)ð2ð ˜%Ÿ,™,Ñ'ð	2ð
 ˜%Ÿ,™,Ñ'ð2ð ð2ð ð2ð ð2ð ð2ð ð2ð ð2ð !ð2ð ð2ð ð2ð  ˜s‘mð!2ð" ð#2ð$  ð%2ð& ð'2ð( ð)2ð* 
ó+2ðL !ò#C7Ø�U—\‘\Ñ"ðC7à�E—L‘LÑ!ðC7ð ˜EŸL™LÑ)ðC7ð
 ðC7ð ðC7ð ðC7ð ðC7ð ðC7ð !ðC7ð ðC7ð ðC7ð ˜s‘mðC7ð ðC7ð  ðC7ð  ð!C7ð" ð#C7ð$ 
ó%C7ðt !ò)t:Ø�U—\‘\Ñ"ðt:à�E—L‘LÑ!ðt:ð ˜EŸL™LÑ)ðt:ð ˜%Ÿ,™,Ñ'ð	t:ð
 ˜%Ÿ,™,Ñ'ðt:ð ðt:ð ðt:ð ðt:ð ðt:ð ðt:ð ðt:ð !ðt:ð ðt:ð ðt:ð  ˜s‘mð!t:ð" ð#t:ð$  ð%t:ð& ð't:ð( ð)t:ð* 
ó+t:ônjˆ5�;‰;× Ñ ô jðZ)Ø�S˜( 5™/¨8°H¸U±OÑ+DÐDÑEð)à˜˜h x°¡Ñ7Ð7Ñ8ð)ð 
ˆ%��u˜eÐ#Ñ
$Ñ%ô)øðo ò ØƒKðús   ¤M ÍM)Í(M)