ó
    ‡Ž¡jT  ã                   óê   • S SK Jr  S SKJrJr  S SKrS SKJr  SSK	J
r
JrJrJrJr  SSKJr  SSKJr  SSKJrJrJrJr  SS	KJr  SS
KJr  SSKJr  SSKJr  \R@                  " \!5      r" " S S\5      r#g)é    )ÚCallable)ÚAnyÚOptionalNé   )Ú(DiaClassifierFreeGuidanceLogitsProcessorÚ"DiaEOSChannelFilterLogitsProcessorÚ!DiaEOSDelayPatternLogitsProcessorÚLogitsProcessorListÚTemperatureLogitsWarper)ÚStoppingCriteriaList)ÚBaseStreamer)ÚGenerateOutputÚGenerationConfigÚGenerationMixinÚGenerationMode)Úis_deepspeed_zero3_enabled)Úis_fsdp_managed_module)ÚPreTrainedModel)Úloggingc                   óh  ^ • \ rS rSrSr        S'S\S\S-  S\R                  S-  S\	\\R                  /\\   4   S-  S\S-  S\S-  S	\\\4   S-  S
\R                  S-  S\R                  S-  S\4U 4S jjjrS\S-  S\S\\\4   4U 4S jjr   S(S\R                  S-  S\R                  S-  S	\\\R                  4   S-  S\\R                  \S-  \\\R                  4   4   4U 4S jjjr S)S\S\S	\\\R                  4   S\R                  S\R(                  S-  S\\R                  \\\R                  4   4   4S jjr   S*S\S-  4U 4S jjjr\S\R                  S\S\R                  S-  S\R                  4S j5       r           S+S\R                  S-  S\S-  S\S-  S\S-  S\	\\R                  /\\   4   S-  S\S-  S\S    S!\S"   S
\R                  S-  S\R                  S-  S#\S-  4S$ jjr\R:                  " 5                  S+S\R                  S-  S\S-  S\S-  S\S-  S\	\\R                  /\\   4   S-  S\S-  S\S    S!\S"   S
\R                  S-  S\R                  S-  S#\S-  S\\R                  -  4S% jj5       rS&r U =r!$ ),ÚDiaGenerationMixiné(   NÚgeneration_configÚinput_ids_seq_lengthÚencoder_input_idsÚprefix_allowed_tokens_fnÚlogits_processorÚdeviceÚmodel_kwargsÚnegative_prompt_idsÚnegative_prompt_attention_maskÚreturnc
                 ó¤  >• UR                   n
UR                  nS Ul         S Ul        [        5       nUb   US:w  a  UR                  [	        U5      5        UR                  [        [        U R                  R                  5      U R                  R                  R                  S95        [        TU ]1  UUUS UUUUU	S9	nU
b,  U
S:w  a&  [        U
UR                  S9nUR                  SU5        UR                  [!        U R                  R                  U R                  R                  R                  UR"                  US95        X¡l         X±l        U$ )Nç      ð?)Únum_channelsÚeos_token_id©	r   r   r   r   r   r   r   r    r!   é   )Úguidance_scaleÚguidance_top_kr   )Údelay_patternr&   Úmax_generation_lenr   )r)   Útemperaturer
   Úappendr   r   ÚlenÚconfigr+   Údecoder_configr&   ÚsuperÚ_get_logits_processorr   Útop_kÚinsertr	   Ú
max_length)Úselfr   r   r   r   r   r   r   r    r!   Úoriginal_guidance_scaleÚoriginal_temperatureÚcustom_processorsÚmerged_processorsÚcfg_processorÚ	__class__s                  €Ú´C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/models/dia/generation_dia.pyr3   Ú(DiaGenerationMixin._get_logits_processor,   sY  ø€ ð #4×"BÑ"BÐØ0×<Ñ<ÐØ+/ÐÔ(Ø(,ÐÔ%ô 0Ó1ÐàÑ+Ð0DÈÓ0KØ×$Ñ$Ô%<Ð=QÓ%RÔSà× Ñ Ü.Ü  §¡×!:Ñ!:Ó;Ø!Ÿ[™[×7Ñ7×DÑDñô	
ô "™GÑ9Ø/Ø!5Ø/Ø%)Ø.ØØ%Ø 3Ø+Ið :ð 

Ðð #Ñ.Ð3JÈaÓ3OÜDØ6Ø0×6Ñ6ñˆMð ×$Ñ$ Q¨Ô6à× Ñ Ü-Ø"Ÿk™k×7Ñ7Ø!Ÿ[™[×7Ñ7×DÑDØ#4×#?Ñ#?Øñ	ô	
ð ,CÔ(Ø(<Ô%à Ð ó    Úkwargsc                 ót  >• [         TU ]  " U40 UD6u  pUR                  b:  UR                  S:  a*  [        R	                  SUR                   S35        SUl        U=R
                  [        U R                  R                  5      -  sl        UR                  S L=(       a    UR                  S:g  U l
        X4$ )Nr$   zAtemperature < 1.0 is not supported for Dia; clamping to 1.0 (got Ú)r(   )r2   Ú_prepare_generation_configr-   ÚloggerÚwarning_oncer6   Úmaxr0   r+   r)   Ú	_uses_cfg)r7   r   rA   r   r=   s       €r>   rD   Ú-DiaGenerationMixin._prepare_generation_configo   s¹   ø€ ô +0©'Ò*LÐM^Ñ*iÐbhÑ*iÑ'Ðà×(Ñ(Ñ4Ð9J×9VÑ9VÐY\Ó9\Ü×ÑØSÐTe×TqÑTqÐSrÐrsÐtôð -0ÐÔ)ð 	×$Ò$¬¨D¯K©K×,EÑ,EÓ(FÑFÕ$ð +×9Ñ9ÀÐE×oÐJ[×JjÑJjÐnoÑJoˆŒà Ð.Ð.r@   ÚinputsÚbos_token_idc                 ó   >• [         TU ]  UUUS9u  pnU R                  (       aW  [        R                  " U5      n[        R
                  " X/SS9nUR                  SS 5      b  US   R                  SS5      US'   XU4$ )N)rJ   rK   r   r   ©ÚdimÚattention_maské   r(   )r2   Ú_prepare_model_inputsrH   ÚtorchÚ
zeros_likeÚcatÚgetÚrepeat)r7   rJ   rK   r   Ú
input_nameÚunconditioned_inputsr=   s         €r>   rQ   Ú(DiaGenerationMixin._prepare_model_inputs‚   s”   ø€ ô ,1©7Ñ+HØØ%Ø%ð ,Ið ,
Ñ(ˆ˜Lð �>�>Ü#(×#3Ò#3°FÓ#;Ð Ü—Y’Y Ð=À1ÑEˆFà×ÑÐ 0°$Ó7ÑCØ1=Ð>NÑ1O×1VÑ1VÐWXÐZ[Ó1\�Ð-Ñ.à <Ð/Ð/r@   Ú
batch_sizeÚmodel_input_nameÚdecoder_start_token_idc                 óP  • S=pgUb  SU;   a  UR                  S5      nUb  SU;   a  UR                  S5      nUb  Ucµ  [        R                  SUSL SUSL S35        U R                  R                  R
                  nU R                  (       a  US-  OUn	Uc(  [        R                  " U	SU4U[        R                  US	9n[        R                  " X–R                  S   4[        R                  US
9nUR                  5       n
UR                  S   USS2SS2S4   U R                  R                  R                  :H  R                  SS9R                  5       -
  nU
SS2SU24   R                  SS5      R                  5       nUSS2SU24   R                  5       nXsS'   X£S'   Xc4$ )zGPrepares `decoder_input_ids` for generation with encoder-decoder modelsNÚdecoder_input_idsÚdecoder_attention_maskz[In order to generate with Dia, we need the processed audio input: Got `decoder_input_ids`: z" and got `decoder_attention_mask`=z]. This can be achieved via the [`DiaProcessor`] but now defaulting to non-delayed generation.rP   r(   )Údtyper   )Úsizer`   r   r   éÿÿÿÿrM   Údecoder_delay_mask)ÚpoprE   rF   r0   r1   r%   rH   rR   ÚfullÚlongÚonesÚshapeÚpad_token_idÚsumrG   Ú	transpose)r7   rZ   r[   r   r\   r   r^   r_   r%   Úreal_batch_sizeÚ
delay_maskÚvalid_input_sizes               r>   Ú)_prepare_decoder_input_ids_for_generationÚ<DiaGenerationMixin._prepare_decoder_input_ids_for_generation˜   sç  € ð 6:Ð9ÐØÑ#Ð(;¸|Ó(KØ ,× 0Ñ 0Ð1DÓ EÐØÑ#Ð(@ÀLÓ(PØ%1×%5Ñ%5Ð6NÓ%OÐ"ð Ñ$Ð(>Ñ(FÜ×ÑðØ%¨TÐ1Ð2Ð2TÐUkÐswÐUwÐTxð yoðpôð  Ÿ;™;×5Ñ5×BÑBˆLØ15··˜j¨AšoÀZˆOà Ñ(Ü$)§J¢JØ$ a¨Ð6Ð8NÔV[×V`ÑV`Ðioñ%Ð!ô &+§Z¢ZØ%×'>Ñ'>¸qÑ'AÐBÌ%Ï*É*Ð]cñ&Ð"ð
 '×+Ñ+Ó-ˆ
à×#Ñ# AÑ&Ø ¢¢A q Ñ)¨T¯[©[×-GÑ-G×-TÑ-TÑT×YÑYÐ^`ÐYÐa×eÑeÓgñhð 	ð '¢qÐ*;Ð+;Ð*;Ð';Ñ<×FÑFÀqÈ!ÓL×QÑQÓSÐØ!7ºÐ;LÐ<LÐ;LÐ8LÑ!M×!RÑ!RÓ!TÐð 2HÐ-Ñ.Ø-7Ð)Ñ*à Ð.Ð.r@   Úis_first_iterationc                 óì  >• U R                   (       a  US   R                  S   S-  OUS   R                  S   nUR                  X`R                  R                  R
                  S5      R                  SS5      n[        T
U ]   " U4SU0UD6nU R                  XR                  R                  R                  U5      US'   UR                  SS5      (       a#  U(       d  US   S S 2SS S 24   S S 2S S S 24   US'   US   R                  5       US'   U R                   (       aS  S	 HM  nUR                  US 5      c  M  [        S/S/Xx   R                  S-
  -  -   5      n	Xx   R                  " U	6 Xx'   MO     U$ )
Nr   rP   rb   r(   Úencoder_outputsr^   Ú	use_cacheF)r^   r_   Údecoder_position_ids)rH   rh   Úreshaper0   r1   r%   rk   r2   Úprepare_inputs_for_generationÚapply_delay_maskri   rU   Ú
contiguousÚtupleÚndimrV   )r7   Ú	input_idsrs   rc   rq   rA   rZ   Úmodel_inputsÚkeyÚrepeat_patternr=   s             €r>   rw   Ú0DiaGenerationMixin.prepare_inputs_for_generationË   s…  ø€ ð :>¿¿�_ QÑ'×-Ñ-¨aÑ0°AÒ5È_Ð]^ÑM_×MeÑMeÐfgÑMhˆ
Ø×%Ñ% j·+±+×2LÑ2L×2YÑ2YÐ[]Ó^×hÑhÐijÐlmÓnˆ	ô ‘wÒ<¸YÑrÐXgÐrÐkqÑrˆð -1×,AÑ,AØ—{‘{×1Ñ1×>Ñ>Ð@Ró-
ˆÐ(Ñ)ð
 ×Ñ˜K¨×/Ñ/Ö8JØ0<Ð=PÑ0QÒRSÐUWÒYZÐRZÑ0[Ò\]Ð_cÒefÐ\fÑ0gˆLÐ,Ñ-ð -9Ð9LÑ,M×,XÑ,XÓ,ZˆÐ(Ñ)ð �>�>Û^�Ø×#Ñ# C¨Ó.Ó:ä%*¨A¨3°!°¸Ñ8I×8NÑ8NÐQRÑ8RÑ1SÑ+SÓ%T�NØ(4Ñ(9×(@Ò(@À.Ð(Q�LÓ%ñ	 _ð Ðr@   r|   Úpad_idrm   c                 óÞ   • Uc  U $ [        U R                  S   UR                  S   5      nUS S 2S U2S S 24   nU S S 2S U2S S 24   n[        R                  " XA:H  XT5      U S S 2S U2S S 24'   U $ )Nr(   )Úminrh   rR   Úwhere)r|   r�   rm   Úmask_lenÚ
valid_maskÚvalid_inputs         r>   rx   Ú#DiaGenerationMixin.apply_delay_maskñ   s€   € àÑØÐä�y—‘ qÑ)¨:×+;Ñ+;¸AÑ+>Ó?ˆØ¢ 9 H 9ªa Ñ0ˆ
Ø¢ 9 H 9ªa Ñ0ˆô &+§[¢[°Ñ1EÀ{Ó%_ˆ	’!�Y�h�Y¢�/Ñ"àÐr@   Ústopping_criteriaÚsynced_gpusÚassistant_modelr   Ústreamerr   Úcustom_generatec                 óD  • U R                  UUUUU5      nU R                  " U40 UD6u  p.UR                  U5      nU[        R                  [        R
                  4;  a  [        S5      eU R                  UR                  5       5        U R                  XòU5        Uc;  [        5       =(       d    [        U 5      =(       a    [        R                  " 5       S:„  nUb  UO	[        5       nUb  UO	[        5       nUR!                  SS 5      S LnU R#                  XR$                  U5      u  nnnUR&                  S   nUR(                  nU R+                  UUUS9  SU;  a  U R-                  UUUU5      nU R/                  UUUUR0                  UR(                  S9u  nnUR2                  (       a!  U R5                  UUR!                  S5      5      nUb  UR7                  UR9                  5       5        UR&                  S	   nUR!                  S
5      S L =(       a    UR:                  S LnUR!                  S5      S L =(       a    UR<                  S LnU R?                  UUUUUUS9nU RA                  5       (       a  SU;  a  SUS'   U RC                  UUU5        UR:                  S-
  nUR&                  S   U:w  a3  US:X  a-  U RD                  RF                  (       d  UUR&                  S   -  nU RI                  X.UUU5        U RK                  UUUUUUR(                  UU	U
S9	nU RM                  UUUR!                  S5      S9nURN                  US'   URQ                  S	UR&                  S	   5      nURR                  S:”  a  [        S5      eU RT                  " U4UUUS.UDUD6$ )NzŒGot incompatible mode for generation, should be one of greedy or sampling. Ensure that beam search is de-activated by setting `num_beams=1`.r(   rO   r   )r   rs   )rZ   r[   r   r\   r   Ú	tokenizerrb   r6   Ú
min_length)r   Úhas_default_max_lengthÚhas_default_min_lengthr[   Úinputs_tensorÚinput_ids_lengthÚlogits_to_keepÚinputs_embedsr'   )r   r‰   r�   rt   z2`num_return_sequences>1` is incompatible with Dia.)r   r‰   r   )+Ú_extract_generation_mode_kwargsrD   Úget_generation_moder   ÚSAMPLEÚGREEDY_SEARCHÚ
ValueErrorÚ_validate_model_kwargsÚcopyÚ_validate_generation_moder   r   ÚdistÚget_world_sizer
   r   rU   rQ   rK   rh   r   Ú_prepare_special_tokensÚ._prepare_encoder_decoder_kwargs_for_generationro   Ú_decoder_start_token_tensorÚtoken_healingÚheal_tokensÚputÚcpur6   r�   Ú_prepare_generated_lengthÚ_supports_logits_to_keepÚ_validate_generated_lengthr0   Úis_encoder_decoderÚ_prepare_cache_for_generationr3   Ú_get_stopping_criteriart   rv   Únum_return_sequencesÚ_sample)r7   rJ   r   r   r‰   r   rŠ   r‹   rŒ   r    r!   r�   rA   Úgeneration_mode_kwargsr   Úgeneration_modeÚkwargs_has_attention_maskr“   r[   rZ   r   r|   r”   r‘   r’   Úmax_cache_lengthÚprepared_logits_processorÚprepared_stopping_criterias                               r>   Ú_main_generate_loopÚ&DiaGenerationMixin._main_generate_loopÿ   s  € ð" "&×!EÑ!EØØØØØó"
Ðð +/×*IÒ*IÐJ[Ñ*fÐ_eÑ*fÑ'ÐØ+×?Ñ?ÀÓPˆà¤>×#8Ñ#8¼.×:VÑ:VÐ"WÓWÜðTóð ð
 	×#Ñ# L×$5Ñ$5Ó$7Ô8Ø×&Ñ& ÐKaÔbð ÑÜ5Ó7×WÔ;QÐRVÓ;W×vÔ]a×]pÒ]pÓ]rÐuvÑ]vˆKà/?Ñ/KÑ+ÔQdÓQfÐØ1BÑ1NÑ-ÔThÓTjÐð %1×$4Ñ$4Ð5EÀtÓ$LÐTXÐ$XÐ!Ø8<×8RÑ8RØ×2Ñ2°Ló9
Ñ5ˆÐ'¨ð #×(Ñ(¨Ñ+ˆ
à×%Ñ%ˆØ×$Ñ$Ð%6Ð8QÐZ`Ð$Ñað  LÓ0à×NÑNØ˜|Ð-=Ð?PóˆLð
 #'×"PÑ"PØ!Ø-Ø%Ø#4×#PÑ#PØ ×'Ñ'ð #Qð #
Ñˆ	�<ð ×*×*Ø×(Ñ(¨Ð4J×4NÑ4NÈ{Ó4[Ó\ˆIàÑØ�L‰L˜Ÿ™›Ô)ð %Ÿ?™?¨2Ñ.ÐØ!'§¡¨LÓ!9¸TÐ!A×!nÐFW×FbÑFbÐjnÐFnÐØ!'§¡¨LÓ!9¸TÐ!A×!nÐFW×FbÑFbÐjnÐFnÐØ ×:Ñ:Ø/Ø#9Ø#9Ø-Ø'Ø-ð ;ð 
Ðð ×(Ñ(×*Ñ*Ð/?À|Ó/SØ-.ˆLÐ)Ñ*à×'Ñ'Ð(9Ð;KÐMcÔdð -×7Ñ7¸!Ñ;Ðà×Ñ Ñ"Ð&6Ó6Ø  OÓ3Ø—K‘K×2×2à × 3Ñ 3°AÑ 6Ñ6ÐØ×*Ñ*Ø¨_¸jÐJZô	
ð
 %)×$>Ñ$>Ø/Ø!1Ø+Ø%=Ø-Ø ×'Ñ'Ø%Ø 3Ø+Ið %?ð 
%
Ð!ð &*×%@Ñ%@Ø/Ø/Ø,×0Ñ0°Ó=ð &Að &
Ð"ð %6×$?Ñ$?ˆ�[Ñ!ð ×%Ñ% b¨)¯/©/¸"Ñ*=Ó>ˆ	ð ×1Ñ1°AÓ5ÜÐQÓRÐRð �|Š|Øð
à6Ø8Ø/ñ	
ð
 %ð
ð ñ
ð 	
r@   c                 ó$  • UR                  S5      nUb  UR                  5       nU R                  " SUUUUUUUUU	U
US.UD6n[        U[        R
                  5      (       + nU(       a  UR                  nOUnU R                  R                  R                  nUR                  S   U-  nUR                  UUS5      R                  SS5      nU R                  UU R                  R                  R                  U5      nU(       a	  UUl        U$ UnU$ )Nr^   )rJ   r   r   r‰   r   rŠ   r‹   rŒ   r    r!   r�   r   rb   r(   rP   © )rU   Úcloner¶   Ú
isinstancerR   ÚTensorÚ	sequencesr0   r1   r%   rh   rv   rk   rx   ri   )r7   rJ   r   r   r‰   r   rŠ   r‹   rŒ   r    r!   r�   rA   rm   ÚoutputÚreturn_dict_in_generateÚoutput_sequencesr%   Úbszs                      r>   ÚgenerateÚDiaGenerationMixin.generate–  s)  € ð" —Z‘ZÐ 3Ó4ˆ
ØÑ!Ø#×)Ñ)Ó+ˆJà×)Ò)ð 
ØØ/Ø-Ø/Ø%=Ø#Ø+ØØ 3Ø+IØ+ñ
ð ñ
ˆô '1°¼¿¹Ó&FÔ"FÐæ"Ø%×/Ñ/Ñà%Ðð —{‘{×1Ñ1×>Ñ>ˆØ×$Ñ$ QÑ'¨<Ñ7ˆØ+×3Ñ3°C¸ÀrÓJ×TÑTÐUVÐXYÓZÐð  ×0Ñ0Ð1AÀ4Ç;Á;×C]ÑC]×CjÑCjÐlvÓwÐæ"Ø/ˆFÔð ˆð &ˆFàˆr@   )rH   )NNNNNNNN)NNN)N)NNF)NNNNNNNNNNN)"Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rH   r   ÚintrR   Ú
LongTensorr   r¼   Úlistr
   ÚstrÚdictr   r3   rz   rD   rQ   r   ro   Úboolrw   Ústaticmethodrx   r   r   r¶   Úno_gradr   rÂ   Ú__static_attributes__Ú__classcell__)r=   s   @r>   r   r   (   s•  ø† à€Ið
 ,0Ø59ØTXØ7;Ø!Ø.2Ø37Ø>BñA!à+ðA!ð " D™jðA!ð !×+Ñ+¨dÑ2ð	A!ð
 #+¨C°·±Ð+>ÀÀSÁ	Ð+IÑ"JÈTÑ"QðA!ð .°Ñ4ðA!ð �d‘
ðA!ð ˜3 ˜8‘n tÑ+ðA!ð #Ÿ\™\¨DÑ0ðA!ð ).¯©°tÑ(;ðA!ð 
÷A!ð A!ðF/Ø!1°DÑ!8ð/ØDGð/à	Ð Ð%Ñ	&÷/ð* '+Ø,0Ø7;ñ	0à—‘˜tÑ#ð0ð —l‘l TÑ)ð0ð ˜3 §¡Ð,Ñ-°Ñ4ð	0ð
 
ˆu�|‰|˜S 4™Z¨¨c°5·<±<Ð.?Ñ)@Ð@Ñ	A÷0ð 0ð8 '+ñ1/àð1/ð ð1/ð ˜3 §¡Ð,Ñ-ð	1/ð
 !&§¡ð1/ð —‘˜tÑ#ð1/ð 
ˆu×Ñ  c¨5¯<©<Ð&7Ñ!8Ð8Ñ	9õ1/ðl ØØ*/ñ$ð
 ! 4™K÷$ð $ðL ð E§L¡Lð ¸#ð È5Ï<É<ÐZ^ÑK^ð Ðch×coÑcoó ó ðð '+Ø59Ø7;Ø9=ØTXØ#'Ø7;Ø-1Ø37Ø>BØ&*ñU
à—‘˜tÑ#ðU
ð ,¨dÑ2ðU
ð .°Ñ4ð	U
ð
 0°$Ñ6ðU
ð #+¨C°·±Ð+>ÀÀSÁ	Ð+IÑ"JÈTÑ"QðU
ð ˜D‘[ðU
ð "Ð"3Ñ4ðU
ð ˜>Ñ*ðU
ð #Ÿ\™\¨DÑ0ðU
ð ).¯©°tÑ(;ðU
ð ˜t™õU
ðn ‡]‚]ƒ_ð '+Ø59Ø7;Ø9=ØTXØ#'Ø7;Ø-1Ø37Ø>BØ&*ñ7à—‘˜tÑ#ð7ð ,¨dÑ2ð7ð .°Ñ4ð	7ð
 0°$Ñ6ð7ð #+¨C°·±Ð+>ÀÀSÁ	Ð+IÑ"JÈTÑ"Qð7ð ˜D‘[ð7ð "Ð"3Ñ4ð7ð ˜>Ñ*ð7ð #Ÿ\™\¨DÑ0ð7ð ).¯©°tÑ(;ð7ð ˜t™ð7ð 
˜%×*Ñ*Ñ	*ô7ó ö7r@   r   )$Úcollections.abcr   Útypingr   r   rR   Útorch.distributedÚdistributedrŸ   Úgeneration.logits_processr   r   r	   r
   r   Úgeneration.stopping_criteriar   Úgeneration.streamersr   Úgeneration.utilsr   r   r   r   Úintegrations.deepspeedr   Úintegrations.fsdpr   Úmodeling_utilsr   Úutilsr   Ú
get_loggerrÄ   rE   r   r¹   r@   r>   Ú<module>rß      sX   ðõ %ß  ã Ý  ÷õ õ AÝ 0ß aÓ aÝ @Ý 7Ý -Ý ð 
×	Ò	˜HÓ	%€ôf˜õ fr@   