Ë
    îÿæií+  ã                   óæ  — d dl m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 ddlmZmZmZ ddlmZ e G d„ d	e«      «       Zd
„ Z G d„ dej.                  «      Z G d„ dej.                  «      Z G d„ dej.                  «      Z G d„ dej.                  «      Z G d„ dej.                  «      Z G d„ dej.                  «      Z G d„ dej.                  «      Z G d„ dej.                  «      Zy)é    )Ú	dataclass)ÚAnyÚDictÚOptionalÚTupleÚUnionNé   )Úswiglu)ÚBaseModelArgsÚcreate_attention_maskÚscaled_dot_product_attention)Ú	SwitchGLUc                   ó  — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   eed<   eed<   eed<   eed<   eed<   eed<   ded<   dZe	e
eef      ed<   dZe	eee
eef   f      ed<   dZeed<   d„ Zy)Ú	ModelArgsÚ
model_typeÚ
vocab_sizeÚhidden_sizeÚnum_hidden_layersÚintermediate_sizeÚnum_attention_headsÚnum_key_value_headsÚattention_biasÚmoe_topkÚnum_expertsÚnum_shared_expertÚuse_mixed_mlp_moeÚuse_qk_normÚrms_norm_epsÚ
rope_thetaÚuse_claé   Úcla_share_factorNÚmoe_intermediate_sizeÚrope_scalingFÚtie_word_embeddingsc                 ól   ‡ — ‰ j                   r'ddh}t        ˆ fd„|D «       «      st        d|› �«      ‚y y )NÚfactorÚtypec              3   ó:   •K  — | ]  }|‰j                   v –— Œ y ­w©N)r$   )Ú.0ÚkeyÚselfs     €új/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_lm/models/hunyuan.pyÚ	<genexpr>z*ModelArgs.__post_init__.<locals>.<genexpr>)   s   øè ø€ ÐI¹=°C�s˜d×/Ñ/Ô/¹=ùs   ƒzrope_scaling must contain keys )r$   ÚallÚ
ValueError)r-   Úrequired_keyss   ` r.   Ú__post_init__zModelArgs.__post_init__%   sB   ø€ à×ÒØ% vÐ.ˆMÜÓI¹=ÓIÔIÜ Ð#BÀ=À/Ð!RÓSÐSð Jð ó    )Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__ÚintÚboolÚfloatr#   r   r   Úlistr$   r   r%   r3   © r4   r.   r   r      s°   … àƒOØƒOØÓØÓØÓØÓØÓØÓØƒMØÓØÓØÓØÓØÓØÓØƒMØÓØ8<Ð˜8 E¨#¨t¨)Ñ$4Ñ5Ó<Ø;?€L�(˜4  U¨5°#¨:Ñ%6Ð 6Ñ7Ñ8Ó?Ø %Ð˜Ó%óTr4   r   c                 ó0   — t        | t        «      r| |   S | S r*   )Ú
isinstancer=   )ÚargÚidxs     r.   Ú_int_or_listrC   -   s   € Ü�#”tÔØ�3‰xˆØ€Jr4   c                   ó@   ‡ — e Zd Z	 	 ddededefˆ fd„Zddefd„Zˆ xZS )	ÚDynamicNTKAlphaRoPEÚdimsÚbaseÚscaling_alphac                 ó¸   •— t         ‰| �  «        || _        ||||dz
  z  z  z  }|t        j                  d| j                  d«      | j                  z  z  | _        y )Nr!   r   )ÚsuperÚ__init__rF   ÚmxÚarangeÚ_freqs)r-   rF   rG   rH   Ú	__class__s       €r.   rK   zDynamicNTKAlphaRoPE.__init__4   sU   ø€ ô 	‰ÑÔØˆŒ	Ø�m¨°°q±Ñ(9Ñ:Ñ:ˆØœrŸy™y¨¨D¯I©I°qÓ9¸D¿I¹IÑEÑFˆ�r4   Úoffsetc           	      óv   — t         j                  j                  || j                  dd d|| j                  ¬«      S )NFç      ð?)ÚtraditionalrG   ÚscalerP   Úfreqs)rL   ÚfastÚroperF   rN   )r-   ÚxrP   s      r.   Ú__call__zDynamicNTKAlphaRoPE.__call__?   s9   € Ü�w‰w�|‰|ØØ�I‰IØØØØØ—+‘+ð ó 
ð 	
r4   )i'  rR   ©r   )r5   r6   r7   r:   r<   rK   rY   Ú__classcell__©rO   s   @r.   rE   rE   3   s<   ø„ ð Ø"ñ		Gàð	Gð ð	Gð õ		Gñ	
 #÷ 	
r4   rE   c            	       ó�   ‡ — e Zd Zdedefˆ fd„Z	 	 	 d	dej                  deej                     dee	   dej                  fd„Z
ˆ xZS )
Ú	AttentionÚkv_projÚargsc                 óJ  •— t         ‰| �  «        |j                  }|j                  x| _        }|j
                  €J ‚|j
                  x| _        }|j                  |z  }|dz  | _        t        j                  |||z  |j                  ¬«      | _        |rTt        j                  |||z  |j                  ¬«      | _        t        j                  |||z  |j                  ¬«      | _        t        j                  ||z  ||j                  ¬«      | _        |j                  | _        | j                  rJt        j                   ||j"                  «      | _        t        j                   ||j"                  «      | _        t)        ||j*                  |j,                  d   ¬«      | _        y )Ng      à¿©ÚbiasÚalpha)rG   rH   )rJ   rK   r   r   Ún_headsr   Ú
n_kv_headsrT   ÚnnÚLinearr   Úq_projÚk_projÚv_projÚo_projr   ÚRMSNormr   Úquery_layernormÚkey_layernormrE   r   r$   rW   )r-   r_   r`   Údimre   rf   Úhead_dimrO   s          €r.   rK   zAttention.__init__L   s`  ø€ Ü‰ÑÔà×ÑˆØ!%×!9Ñ!9Ð9ˆŒ�wØ×'Ñ'Ð3Ð3Ð3Ø'+×'?Ñ'?Ð?ˆŒ˜*à×#Ñ# wÑ.ˆØ˜t‘^ˆŒ
Ü—i‘i  W¨xÑ%7¸d×>QÑ>QÔRˆŒÙÜŸ)™)Ø�Z (Ñ*°×1DÑ1DôˆDŒKô Ÿ)™)Ø�Z (Ñ*°×1DÑ1DôˆDŒKô —i‘i ¨(Ñ 2°C¸d×>QÑ>QÔRˆŒØ×+Ñ+ˆÔØ×ÒÜ#%§:¡:¨h¸×8IÑ8IÓ#JˆDÔ Ü!#§¡¨H°d×6GÑ6GÓ!HˆDÔä'ØØ—‘Ø×+Ñ+¨GÑ4ô
ˆ�	r4   rX   ÚmaskÚcacheÚreturnc                 ó\  — |j                   \  }}}| j                  |«      }|€'| j                  |«      | j                  |«      }
}	|	|
f}n|\  }	}
|j	                  ||| j
                  d«      j                  dddd«      }|	j	                  ||| j                  d«      j                  dddd«      }	|
j	                  ||| j                  d«      j                  dddd«      }
|r|j                  nd}| j                  ||¬«      }| j                  |	|¬«      }	| j                  r"| j                  |«      }| j                  |	«      }	|�|j                  |	|
«      \  }	}
t        ||	|
|| j                  |¬«      }|j                  dddd«      j	                  ||d«      }| j!                  |«      |fS )Néÿÿÿÿr   r!   r	   é   )rP   )rs   rT   rr   )Úshaperi   rj   rk   Úreshapere   Ú	transposerf   rP   rW   r   rn   ro   Úupdate_and_fetchr   rT   rl   )r-   rX   rr   rs   Ú	kv_statesÚBÚLÚDÚqueriesÚkeysÚvaluesrP   Úoutputs                r.   rY   zAttention.__call__j   sš  € ð —'‘'‰ˆˆ1ˆaà—+‘+˜a“.ˆØÐØŸ;™; q›>¨4¯;©;°q«>�&ˆDØ˜f˜‰Ià$‰LˆD�&ð —/‘/ ! Q¨¯©°bÓ9×CÑCÀAÀqÈ!ÈQÓOˆØ�|‰|˜A˜q $§/¡/°2Ó6×@Ñ@ÀÀAÀqÈ!ÓLˆØ—‘  1 d§o¡o°rÓ:×DÑDÀQÈÈ1ÈaÓPˆá!&�—’¨AˆØ—)‘)˜G¨F�)Ó3ˆØ�y‰y˜ fˆyÓ-ˆØ×ÒØ×*Ñ*¨7Ó3ˆGØ×%Ñ% dÓ+ˆDàÐØ ×1Ñ1°$¸Ó?‰LˆD�&ä-Ø�T˜6¨°d·j±jÀtô
ˆð ×!Ñ! ! Q¨¨1Ó-×5Ñ5°a¸¸BÓ?ˆØ�{‰{˜6Ó" IÐ-Ð-r4   ©NNN)r5   r6   r7   r;   r   rK   rL   Úarrayr   r   rY   r[   r\   s   @r.   r^   r^   K   sb   ø„ ð
 ð 
¨Iõ 
ðB $(Ø#Øñ#.à�8‰8ð#.ð �r—x‘xÑ ð#.ð ˜‰}ð	#.ð 
�‰÷#.r4   r^   c                   ó>   ‡ — e Zd Zˆ fd„Zdej
                  fd„Zˆ xZS )ÚMLPc                 óÐ   •— t         ‰| �  «        t        j                  ||d¬«      | _        t        j                  ||d¬«      | _        t        j                  ||d¬«      | _        y ©NFrb   )rJ   rK   rg   rh   Ú	gate_projÚ	down_projÚup_proj)r-   rp   Ú
hidden_dimrO   s      €r.   rK   zMLP.__init__‘   sJ   ø€ Ü‰ÑÔÜŸ™ 3¨
¸Ô?ˆŒÜŸ™ :¨s¸Ô?ˆŒÜ—y‘y  j°uÔ=ˆ�r4   rt   c                 ót   — | j                  t        | j                  |«      | j                  |«      «      «      S r*   )r‹   r
   rŠ   rŒ   ©r-   rX   s     r.   rY   zMLP.__call__—   s)   € Ø�~‰~œf T§^¡^°AÓ%6¸¿¹ÀQ»ÓHÓIÐIr4   ©r5   r6   r7   rK   rL   r…   rY   r[   r\   s   @r.   r‡   r‡   �   s   ø„ ô>ðJ˜RŸX™X÷ Jr4   r‡   c                   ó>   ‡ — e Zd Zˆ fd„Zdej
                  fd„Zˆ xZS )ÚGatec                 ó\   •— t         ‰| �  «        t        j                  ||d¬«      | _        y r‰   )rJ   rK   rg   rh   Úwg)r-   rp   r   rO   s      €r.   rK   zGate.__init__œ   s"   ø€ Ü‰ÑÔÜ—)‘)˜C °5Ô9ˆ�r4   rt   c                 ó$   — | j                  |«      S r*   )r”   r�   s     r.   rY   zGate.__call__    s   € Ø�w‰w�q‹zÐr4   r�   r\   s   @r.   r’   r’   ›   s   ø„ ô:ð˜RŸX™X÷ r4   r’   c                   óJ   ‡ — e Zd Zddedefˆ fd„Zdej                  fd„Zˆ xZ	S )ÚMoeBlockr`   Ú	layer_idxc                 óÜ  •— t         ‰| �  «        |j                  }|j                  }|j                  | _        |j                  r3t        |j                  |«      }t        |t        ||z  «      «      | _
        |j                  x| _        }t        |j                  |«      | _        t        ||«      | _        |}|j                   �t        |j                   |«      }t#        |||«      | _        y r*   )rJ   rK   r   r   r   Úuse_shared_mlprC   r   r‡   r:   Ú
shared_mlpr   r   Útop_kr’   Úgater#   r   Ú
switch_mlp)	r-   r`   r˜   rp   r   Ú
num_sharedr   Úexpert_intermediate_sizerO   s	           €r.   rK   zMoeBlock.__init__¥   s×   ø€ Ü‰ÑÔØ×ÑˆØ ×2Ñ2ÐØ"×4Ñ4ˆÔà×!Ò!Ü% d×&<Ñ&<¸iÓHˆJÜ! #¤sÐ+<¸zÑ+IÓ'JÓKˆDŒOà)-×)9Ñ)9Ð9ˆÔ˜;Ü! $§-¡-°Ó;ˆŒ
ä˜˜kÓ*ˆŒ	ð $5Ð Ø×%Ñ%Ð1Ü'3Ø×*Ñ*¨Ió(Ð$ô $ CÐ)AÀ;ÓOˆ�r4   rX   c                 ó  — | j                  |«      }t        j                  |dd¬«      }| j                  }t        j                  t        j
                  | |dz
  d¬«      dd |…f   «      }t        j                  ||d¬«      }| j                  ||«      }||d   j                  t        j                  «      z  j                  d	¬«      j                  |j                  «      }| j                  r| j                  |«      }||z   }|S )
Nrv   T)ÚaxisÚpreciser	   )Úkthr¢   .©r¢   ).Néþÿÿÿ)r�   rL   Úsoftmaxrœ   Ústop_gradientÚargpartitionÚtake_along_axisrž   ÚastypeÚfloat32ÚsumÚdtyperš   r›   )r-   rX   ÚgatesÚkÚindsÚscoresÚyÚshared_expert_outputs           r.   rY   zMoeBlock.__call__½   sæ   € ð —	‘	˜!“ˆÜ—
‘
˜5 r°4Ô8ˆà�J‰JˆÜ×Ñ¤§¡°°¸AÀ¹EÈÔ KÈCÐQSÐRSÐQSÈGÑ TÓUˆÜ×#Ñ# E¨4°bÔ9ˆà�O‰O˜A˜tÓ$ˆØ�˜	Ñ"×)Ñ)¬"¯*©*Ó5Ñ5×:Ñ:ÀÐ:ÓC×JÑJÈ1Ï7É7ÓSˆà×ÒØ#'§?¡?°1Ó#5Ð ØÐ(Ñ(ˆAàˆr4   rZ   )
r5   r6   r7   r   r:   rK   rL   r…   rY   r[   r\   s   @r.   r—   r—   ¤   s*   ø„ ñP˜Yð P°3õ Pð0à�8‰8÷r4   r—   c                   óº   ‡ — e Zd Zd
dededefˆ fd„Z	 	 	 ddej                  de	ej                     de	e
   de	eej                  ej                  f      fd	„Zˆ xZS )ÚDecoderLayerr`   r_   r˜   c                 óÀ  •— t         ‰| �  «        |j                  | _        t        ||«      | _        |j
                  dk(  r&t        |j                  |j                  «      | _        nt        ||«      | _        t        j                  |j                  |j                  ¬«      | _        t        j                  |j                  |j                  ¬«      | _        || _        y )Nr	   ©Úeps)rJ   rK   r   r^   Ú	self_attnr   r‡   r   Úmlpr—   rg   rm   r   Úinput_layernormÚpost_attention_layernormr`   )r-   r`   r_   r˜   rO   s       €r.   rK   zDecoderLayer.__init__Ó   sª   ø€ Ü‰ÑÔØ×+Ñ+ˆÔÜ" 7¨DÓ1ˆŒØ×Ñ˜qÒ Ü˜4×+Ñ+¨T×-CÑ-CÓDˆD�Hä  iÓ0ˆDŒHä!Ÿz™z¨$×*:Ñ*:À×@QÑ@QÔRˆÔÜ(*¯
©
Ø×Ñ $×"3Ñ"3ô)
ˆÔ%ð ˆ�	r4   rX   rr   rs   Úshared_kv_statesc                 óª   — | j                  | j                  |«      |||«      \  }}||z   }| j                  | j                  |«      «      }||z   }||fS r*   )rº   r¼   r»   r½   )r-   rX   rr   rs   r¾   ÚrÚhÚouts           r.   rY   zDecoderLayer.__call__â   sf   € ð #Ÿn™nØ× Ñ  Ó# T¨5Ð2Bó
ÑˆÐð �‰EˆØ�H‰H�T×2Ñ2°1Ó5Ó6ˆØ�!‰eˆØÐ$Ð$Ð$r4   rZ   r„   )r5   r6   r7   r   r;   r:   rK   rL   r…   r   r   r   rY   r[   r\   s   @r.   r¶   r¶   Ò   s{   ø„ ñ˜Yð °ð À#õ ð$ $(Ø#Ø@Dñ%à�8‰8ð%ð �r—x‘xÑ ð%ð ˜‰}ð	%ð
 # 5¨¯©°2·8±8Ð);Ñ#<Ñ=÷%r4   r¶   c                   óH   ‡ — e Zd Zdefˆ fd„Z	 ddej                  fd„Zˆ xZS )ÚHunYuanModelr`   c                 ó  •— t         ‰| �  «        || _        |j                  | _        |j                  | _        | j                  dkD  sJ ‚t        j                  |j                  |j                  «      | _        t        |j                  «      D �cg c]/  }t        ||j                   xs ||j                  z  dk(  |¬«      ‘Œ1 c}| _        t        j                  |j                  |j                  ¬«      | _        y c c}w )Nr   )r`   r_   r˜   r¸   )rJ   rK   r`   r   r   rg   Ú	Embeddingr   Úembed_tokensÚranger¶   r    r"   Úlayersrm   r   Únorm)r-   r`   ÚirO   s      €r.   rK   zHunYuanModel.__init__ó   sÜ   ø€ Ü‰ÑÔØˆŒ	ØŸ/™/ˆŒØ!%×!7Ñ!7ˆÔØ�‰ Ò"Ð"Ð"ÜŸL™L¨¯©¸$×:JÑ:JÓKˆÔô ˜4×1Ñ1Ô2ó
ñ 3�ô ØØ!Ÿ\™\Ð)ÒN¨q°4×3HÑ3HÑ/HÈQÑ.NØöð
 3ñ
ˆŒô —J‘J˜t×/Ñ/°T×5FÑ5FÔGˆ�	ùò
s   Â4C=Úinputsc                 ór  — | j                  |«      }|€d gt        | j                  «      z  }t        ||d   «      }t	        t        | j                  |«      «      D ]J  \  }\  }}| j                  j                  r|| j                  j                  z  dk(  rd } ||||«      \  }}ŒL | j                  |«      S )Nr   )
rÇ   ÚlenrÉ   r   Ú	enumerateÚzipr`   r    r"   rÊ   )	r-   rÌ   rs   rÁ   rr   rË   ÚlayerÚcr¾   s	            r.   rY   zHunYuanModel.__call__  s±   € ð
 ×Ñ˜fÓ%ˆàˆ=Ø�FœS §¡Ó-Ñ-ˆEä$ Q¨¨a©Ó1ˆÜ&¤s¨4¯;©;¸Ó'>Ö?‰MˆA‰z��qØ—I‘I×%Ò%¨!¨d¯i©i×.HÑ.HÑ*HÈAÒ*MØ#'Ð Ù"'¨¨4°Ð4DÓ"EÑˆAÑð @ð
 �y‰y˜‹|Ðr4   r*   )	r5   r6   r7   r   rK   rL   r…   rY   r[   r\   s   @r.   rÄ   rÄ   ò   s'   ø„ ðH˜Yõ Hð( ñà—‘÷r4   rÄ   c                   ó^   ‡ — e Zd Zdefˆ fd„Z	 ddej                  fd„Zd„ Ze	d„ «       Z
ˆ xZS )ÚModelr`   c                 ór   •— t         ‰| �  «        || _        |j                  | _        t	        |«      | _        y r*   )rJ   rK   r`   r   rÄ   Úmodel)r-   r`   rO   s     €r.   rK   zModel.__init__  s,   ø€ Ü‰ÑÔØˆŒ	ØŸ/™/ˆŒÜ! $Ó'ˆ�
r4   rÌ   c                 óp   — | j                  ||«      }| j                   j                  j                  |«      S r*   )rÖ   rÇ   Ú	as_linear)r-   rÌ   rs   rÂ   s       r.   rY   zModel.__call__  s/   € ð
 �j‰j˜ Ó'ˆØ�z‰z×&Ñ&×0Ñ0°Ó5Ð5r4   c                 óî  — d|v �r:i }| j                   j                  }| j                   j                  }| j                   j                  |z  }|| j                   j                  z  }|j	                  «       D ]Å  \  }}d|v rr|j                  ||dz   |d«      }|j                  ||dz   gd¬«      }	t        g d¢|	«      D ]1  \  }
}|j                  d|
«      }t        j                  |dd«      ||<   Œ3 Œ|d	|v rA|j                  dd¬«      }	t        d
dg|	«      D ]  \  }
}|j                  d	|
«      }|||<   Œ ŒÁ|||<   ŒÇ |}d|vr|S t        | j                   j                  «      D ]ˆ  }d|› �}dD ]|  }dD ]u  }|› d|› d|› �|v sŒt        | j                   j                  «      D �cg c]  }|j                  |› d|› d|› d|› �«      ‘Œ  }}t        j                  |«      ||› d|› d|› �<   Œw Œ~ ŒŠ |S c c}w )Nz*model.layers.0.mlp.gate_and_up_proj.weightÚqkv_projr!   rv   r	   r¥   )ri   rj   rk   r   Úgate_and_up_projrŒ   rŠ   z+model.layers.0.mlp.experts.0.up_proj.weightzmodel.layers.)rŒ   r‹   rŠ   )ÚweightÚscalesÚbiasesz.mlp.experts.0.Ú.z.mlp.experts.z.mlp.switch_mlp.)r`   r   r   r   Úitemsry   ÚsplitrÐ   ÚreplacerL   ÚflattenrÈ   r   r   ÚpopÚstack)r-   ÚweightsÚnew_weightsr   rf   Ún_kv_groupsrq   r°   ÚvÚsplitsÚk_upÚv_newÚk_newÚlÚprefixÚnÚeÚto_joins                     r.   ÚsanitizezModel.sanitize&  s*  € à7¸7ÒBØˆKØ—	‘	×%Ñ%ˆAØŸ™×6Ñ6ˆJØŸ)™)×7Ñ7¸:ÑEˆKØ˜DŸI™I×9Ñ9Ñ9ˆHØŸ™ž‘��1Ø ‘?ØŸ	™	 *¨k¸A©o¸xÈÓL�AØŸW™W k°;À±?Ð%CÈ!˜WÓL�FÜ'*Ò+IÈ6Ö'R™˜˜eØ !§	¡	¨*°dÓ ;˜Ü-/¯Z©Z¸¸qÀ!Ó-D˜ EÒ*ñ (Sð (¨1Ñ,ØŸW™W Q¨Q˜WÓ/�FÜ'*¨I°{Ð+CÀVÖ'L™˜˜eØ !§	¡	Ð*<¸dÓ C˜Ø-2˜ EÒ*ñ (Mð &'�K ’Nð (ð "ˆGà8ÀÑGØˆNÜ�t—y‘y×2Ñ2Ö3ˆAØ$ Q CÐ(ˆFÛ:�Û7�AØ ˜ °°°1°Q°CÐ8¸GÒCô &+¨4¯9©9×+@Ñ+@Ô%Aó#á%A ð $ŸK™K¨6¨(°-À¸sÀ!ÀAÀ3ÀaÈÀsÐ(KÕLØ%Að  ð #ô GIÇhÁhÈwÓFW˜ 6 (Ð*:¸1¸#¸Q¸q¸cÐ BÒCñ 8ñ ;ð 4ð ˆùò#s   Æ%#G2
c                 ó.   — | j                   j                  S r*   )rÖ   rÉ   )r-   s    r.   rÉ   zModel.layersL  s   € à�z‰z× Ñ Ð r4   r*   )r5   r6   r7   r   rK   rL   r…   rY   ró   ÚpropertyrÉ   r[   r\   s   @r.   rÔ   rÔ     s?   ø„ ð(˜Yõ (ð ñ6à—‘ó6ò$ðL ñ!ó ô!r4   rÔ   ) Údataclassesr   Útypingr   r   r   r   r   Úmlx.coreÚcorerL   Úmlx.nnrg   Úactivationsr
   rG   r   r   r   Úswitch_layersr   r   rC   ÚModulerE   r^   r‡   r’   r—   r¶   rÄ   rÔ   r>   r4   r.   Ú<module>rþ      sÍ   ðõ "ß 4Õ 4å Ý å ß TÑ TÝ $ð ôT�ó Tó ðTò<ô
˜"Ÿ)™)ô 
ô0B.�—	‘	ô B.ôJJˆ"�)‰)ô Jôˆ2�9‰9ô ô+ˆr�y‰yô +ô\%�2—9‘9ô %ô@"�2—9‘9ô "ôJ7!ˆB�I‰Iõ 7!r4   