+
    }n j¿=  ã            
       ó  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
HtHtHtHtHt ^ RIHtHt ^ RIHt ^ RIHt ]! 4       tR R lt]P4                  ! ]! ]4      4      t ! R	 R
]P:                  4      t ! R R]P>                  4      t R t!R5R R llt"R. 3R R llt#R6R R llt$R R lt%. R7Ot&]&3R R llt'R R lt(R R lt)R R lt*R t+R  t,R!R"R#R$R%R&R'R(R)R*/t-R+ R, lt.R- R. lt/R/ R0 lt0R1 R2 lt1R3 R4 lt2R# )8é    N©Úwraps)ÚAnyÚDictÚListÚOptionalÚUnion)Ú
exceptionsÚmessages)ÚCONFIG_FIELD_ENVVAR_ALLOWLIST)ÚMessagingOperationsc                ó0   € V ^8„  d   QhR\         R\         /# )é   ÚnameÚreturn©Ústr)Úformats   "Ú//usr/lib/python3/dist-packages/uaclient/util.pyÚ__annotate__r      s   € ÷ ñ ¬ð ´ñ ó    c                ób   € V R8X  d   R# V P                  R4      pRV^ &   RP                  V4      # )z1Replace the name of the root logger from __name__Ú Ú.Ú	ubuntupro)ÚsplitÚjoin)r   Únamess   & r   Úreplace_top_level_logger_namer      s0   € àˆr„zÙØ�J‰J�s‹O€EØ€Eˆ!�HØ�8‰8�E‹?Ðr   c                   ó6   a a€ ] tR t^t oRtV 3R ltRtVtV ;t# )ÚDatetimeAwareJSONEncoderzBA json.JSONEncoder subclass that writes out isoformat'd datetimes.c                ó‚   <€ \        V\        P                  4      '       d   VP                  4       # \        SV `  V4      # ©N)Ú
isinstanceÚdatetimeÚ	isoformatÚsuperÚdefault)ÚselfÚoÚ	__class__s   &&€r   r(   Ú DatetimeAwareJSONEncoder.default"   s1   ø€ Ü�aœ×*Ñ*×+Ò+Ø—;‘;“=Ð Ü‰w‰˜qÓ!Ð!r   © )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r(   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r+   Ú__classdict__s   @@r   r!   r!      s   ù‡ € ÙL÷"õ "r   r!   c                   óF   a a€ ] tR t^(t oRtV 3R lt]R 4       tRtVt	V ;t
# )ÚDatetimeAwareJSONDecodera  
A JSONDecoder that parses some ISO datetime strings to datetime objects.

Important note: the "some" is because we seem to only be able extend
Python's json library in a way that lets us convert string values within
JSON objects (e.g. '{"lastModified": "2019-07-25T14:35:51"}'). Strings
outside of JSON objects (e.g. '"2019-07-25T14:35:51"') will not be passed
through our decoder.

(N.B. This will override any object_hook specified using arguments to it,
or used in load or loads calls that specify this as the cls.)
c                óp   <€ R V9   d   VP                  R 4       \        SV `  ! VR V P                  /VB  R# )Úobject_hookN)Úpopr'   Ú__init__r;   )r)   ÚargsÚkwargsr+   s   &*,€r   r=   Ú!DatetimeAwareJSONDecoder.__init__6   s4   ø€ Ø˜FÔ"Ø�J‰J�}Ô%Ü‰Ò˜$ÐG¨D×,<Ñ,<ÐGÀÔGr   c                ó®   € V P                  4        F-  w  r\        V\        4      '       g   K   \        V4      pW0V&   K/  	  V #   \         d    Tp Li ; ir#   )Úitemsr$   r   Úparse_rfc3339_dateÚ
ValueError)r*   ÚkeyÚvalueÚ	new_values   &   r   r;   Ú$DatetimeAwareJSONDecoder.object_hook;   sY   € àŸ'™'ž)‰JˆCÜ˜%¤×%Ô%ð&Ü 2Øó!�Ið #�#“ñ $ð ˆøô	 "ô &à %’Ið&ús   ¯AÁAÁAr-   )r.   r/   r0   r1   r2   r=   Ústaticmethodr;   r3   r4   r5   r6   s   @@r   r9   r9   (   s)   ù‡ € ñõHð
 ñó ÷ð r   r9   c                ó   a a€ V V3R lpV# )a¶  Decorator to retry on exception for retry_sleeps.

@param retry_sleeps: List of sleep lengths to apply between
   retries. Specifying a list of [0.5, 1] tells subp to retry twice
   on failure; sleeping half a second before the first retry and 1 second
   before the second retry.
@param exception: The exception class to catch and retry for the provided
   retry_sleeps. Any other exception types will not be caught by the
   decorator.
c                 ó6   <a € \        S 4      VV V3R  l4       pV# )c                  ó  <€ SP                  4       p  S! V / VB #   S dd   pT'       g   Th\        P                  R\        T4      \	        T4      4       \
        P                  ! TP                  ^ 4      4        Rp?Ko  Rp?ii ; i)Tz%s: Retrying %d more times.N)ÚcopyÚLOGÚdebugr   ÚlenÚtimeÚsleepr<   )r>   r?   ÚsleepsÚeÚ	exceptionÚfÚretry_sleepss   *,  €€€r   Ú	decoratorÚ)retry.<locals>.wrapper.<locals>.decoratorW   su   ø€ à!×&Ñ&Ó(ˆFØð.Ù˜dÐ- fÑ-Ð-øØ ô .ß!Ø˜Ü—I‘IØ5´s¸1³v¼sÀ6»{ôô —J’J˜vŸz™z¨!›}×-Ò-ûð.ús   ” œB£ABÂBr   )rV   rX   rU   rW   s   f €€r   ÚwrapperÚretry.<locals>.wrapperV   s!   ù€ Ü	ˆq‹ö	.ó 
ð	.ð Ðr   r-   )rU   rW   rZ   s   ff r   Úretryr\   J   s   ù€ öð" €Nr   r   c          
      ó®   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          R\        R\         \        \        3,          /# )r   Ú	orig_dictÚnew_dictÚpathr   )r   r   r   )r   s   "r   r   r   j   sD   € ÷ ñ Ü”Cœ�H�~ðÜ)-¬c´3¨h­ðÜ?Bðä	Œ#Œsˆ(…^ñr   c                óÒ  € / pV P                  4        F«  w  rEVP                  V\        4      pV'       g   TMVR,           V,           p\        V\        4      '       d5   WA9   d%   \        WQV,          VR7      pV'       d   WƒV&   Ks  Ku  \        W4&   K  WV8w  g   K‡  \        P                  RV\        V4      4       WcV&   K­  	  VP                  4        F  w  rEW@9  g   K  WSV&   K  	  V# )z<Return a dictionary of delta between orig_dict and new_dict.r   )r`   z'Contract value for '%s' changed to '%s')	rB   ÚgetÚDROPPED_KEYr$   ÚdictÚget_dict_deltasrN   rO   r   )	r^   r_   r`   ÚdeltasrE   rF   rG   Úkey_pathÚ	sub_deltas	   &&&      r   re   re   j   sÎ   € ð €FØ—o‘oÖ'‰
ˆØ—L‘L ¤kÓ2ˆ	ß"‘3¨¨s­
°SÕ(8ˆÜ�eœT×"Ò"ØŒÜ+Ø C�=¨xô�	÷ Ø"+˜3“Kñ ô *�“ØÖÜ�I‰IØ9ØÜ�I“ôð
 $�3‹Kñ% (ð& —n‘nÖ&‰
ˆØÖØ�3‹Kñ 'ð €Mr   c                óR   € V ^8„  d   QhR\         R\        \         ,          R\         /# )r   ÚmsgÚvalid_choicesr   )r   r   )r   s   "r   r   r   ˆ   s%   € ÷ ñ œð ´´cµð ÄCñ r   c           
     óF  € ^ RI Hp VP                  4       pRpRP                  TRP	                  V Uu. uF  qUP                  4       NK  	  up4      4      p VP                  V 4       \        R4      P                  4       pWA9   d    V# VP                  V4       KG  u upi )a3  Interactive prompt message, returning a valid choice from msg.

Expects a structured msg which designates choices with square brackets []
around the characters which indicate a valid choice.

Uppercase and lowercase responses are allowed. Loop on invalid choices.

:return: Valid response character chosen.
)Úevent_loggerr   z{} is not one of: {}z, z> )	Úuaclientrm   Úget_event_loggerr   r   ÚupperÚinfoÚinputÚlower)rj   rk   rm   ÚeventrF   ÚchoiceÚ	error_msgs   &&     r   Úprompt_choicesrw   ˆ   s�   € õ &à×)Ñ)Ó+€EØ€EØ&×-Ñ-Øˆt�y‰y±}ÓE±}¨VŸ,™,ž.±}ÑEÓFó€Ið Ø�
‰
�3ŒÜ�d“×!Ñ!Ó#ˆØÔ!Øà€Lð 	�
‰
�9Öùò Fs   ´Bc                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r   rj   Ú
assume_yesr(   r   )r   Úbool)r   s   "r   r   r   ¢   s,   € ÷ ñ Ü	ðÜ#ðÜ6:ðä	ñr   c                ó¼   € V'       d   R# V '       g   \         P                  p \        V 4      P                  4       P	                  4       pVR8X  d   V# VR9   d   R# R# )a}  
Display a confirmation prompt, returning a bool indicating the response

:param msg: String custom prompt text to emit from input call.
:param assume_yes: Boolean set True to skip confirmation input and return
    True.
:param default: Boolean to return when user doesn't enter any text

This function will only prompt a single time, and defaults to "no" (i.e. it
returns False).
Tr   F)ÚyÚyes)r   ÚPROMPT_YES_NOrr   rs   Ústrip)rj   ry   r(   rF   s   &&& r   Úprompt_for_confirmationr€   ¢   sM   € ÷ ÙßÜ×$Ñ$ˆÜ�#‹J×ÑÓ×$Ñ$Ó&€EØ�„{ØˆØ�ÔÙÙr   c                ó^   € V ^8„  d   QhR\         \        \        3,          R\        R\        /# )r   ÚconfigÚpath_to_valuer   )r   r   r   rz   )r   s   "r   r   r   ¼   s)   € ÷ $
ñ $
¤¤c¬3 h¥ð $
Äð $
Ìñ $
r   c                óX  € T p/ pVP                  R4      pVR,          pV F5  pWe8X  d   Rp\        V\        4      '       d   VP                  Wc4      pK4   R# 	  \	        V4      pVP                  4       R8X  d   R# VP                  4       R8X  d   R# \        P                  ! VRVR7      h)	a"  Check if value parameter can be translated into a boolean 'True' value.

@param config: A config dict representing
               /etc/ubuntu-advantange/uaclient.conf
@param path_to_value: The path from where the value parameter was
                      extracted.
@return: A boolean value indicating if the value paramater corresponds
         to a 'True' boolean value.
@raises exceptions.UbuntuProError when the value provide by the
        path_to_value parameter can not be translated into either
        a 'False' or 'True' boolean value.
r   ÚfalseFÚtrueTzboolean string: true or false)rƒ   Úexpected_valuerF   éÿÿÿÿ)r   r$   rd   rb   r   rs   r
   ÚInvalidBooleanConfigValue)r‚   rƒ   rF   Údefault_valueÚpathsÚ
leaf_valuerE   Ú	value_strs   &&      r   Úis_config_value_truerŽ   ¼   s¥   € ð €EØ€MØ×Ñ Ó$€EØ�r•€JÛˆØÔØ#ˆMä�eœT×"Ò"Ø—I‘I˜cÓ1ŠEâñ ô �E“
€IØ‡�Ó˜FÔ"ÙØ	�‰Ó	˜gÔ	%Ùä×2Ò2Ø'Ø:Øô
ð 	
r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   Úredact_regexsr   ©r   r   )r   s   "r   r   r     s    € ÷ ñ ÜœS�	ðäñr   c                óL   € T pV F  p\         P                  ! VRV4      pK  	  V# )z4Redact known sensitive information from log content.z\g<1><REDACTED>)ÚreÚsub)Úlogr�   Úredacted_logÚredact_regexs   &&  r   Úredact_sensitive_logsr˜     s,   € ð €LÛ%ˆÜ—v’v˜lÐ,>ÀÓMŠñ &àÐr   c                óR   € V ^8„  d   QhR\         \        ,          R\        R\        /# )r   Úmsg_opsry   r   )r   r   rz   )r   s   "r   r   r     s*   € ÷ ñ ÜÔ)Õ*ðÜ8<ðä	ñr   c                ó¤   € V '       g   R# V  F?  p\        V\        4      '       d   \        V4       K&  Vw  r4WR&   V! R/ VB '       d   K>   R# 	  R# )aP  Emit messages to the console for user interaction

:param msg_op: A list of strings or tuples. Any string items are printed.
    Any tuples will contain a callable and a dict of args to pass to the
    callable. Callables are expected to return True on success and
    False upon failure.

:return: True upon success, False on failure.
Try   Fr-   )r$   r   Úprint)rš   ry   Úmsg_opÚfunctorr>   s   &&   r   Úhandle_message_operationsrŸ     sJ   € ÷ ÙãˆÜ�fœc×"Ò"Ü�&ŽMà"‰MˆGØ!+�ÑÙ‘?˜T—?’?Úñ ñ r   c                óD   € V ^8„  d   QhR\         R\        P                  /# )r   Údt_strr   )r   r%   )r   s   "r   r   r   &  s    € ÷ 4ñ 4œsð 4¤x×'8Ñ'8ñ 4r   c                óö   € \         P                  ! RRV 4      p\         P                  ! RRV4      pVP                  RR4      p\         P                  ! RRV4      p\        P                  P	                  VR	4      # )
a8  
Parse a datestring in rfc3339 format. Originally written for compatibility
with golang's time.MarshalJSON function. Also handles output of pythons
isoformat datetime method.

This drops subseconds.

:param dt_str: a date string in rfc3339 format

:return: datetime.datetime object of time represented by dt_str
z(\d{2}:\d{2}:\d{2})\.\d+z\g<1>z(\d{2}:\d{2}:\d{2})$z\g<1>ZÚZz+00:00z(-|\+)(\d{2}):(\d{2})$z\g<1>\g<2>\g<3>z%Y-%m-%dT%H:%M:%S%z)r“   r”   Úreplacer%   Ústrptime)r¡   Údt_str_without_subsecondsÚdt_str_with_zÚdt_str_without_zÚdt_str_with_pythonish_tzs   &    r   rC   rC   &  s‚   € ô( !#§¢Ø# X¨vó!Ðô —F’FØ Ð,Eó€Mð %×,Ñ,¨S°(Ó;Ðô  "ŸvšvØ!Ð#5Ð7Gó Ðô ×Ñ×%Ñ%Ø Ð"7óð r   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úmessager   r   )r   s   "r   r   r   ]  s   € ÷ ñ ¤sð ¬sñ r   c                ó˜  € \         P                  P                  e.   R\         P                  P                  P                  4       9  d�   V P	                  RR4      p V P	                  \
        P                  R,           R4      p V P	                  \
        P                  R,           R4      p V P                  RR4      P                  4       p V # )zq
Verify if the system can output unicode characters and if not,
remove those characters from the message string.
zUTF-8u   â€”Ú-Ú r   ÚasciiÚignore)
ÚsysÚstdoutÚencodingrp   r¤   r   ÚOKGREEN_CHECKÚFAIL_XÚencodeÚdecode)r«   s   &r   Úhandle_unicode_charactersr¸   ]  s—   € ô 	�
‰
×ÑÒ#Øœ#Ÿ*™*×-Ñ-×3Ñ3Ó5Ô5ð
 —/‘/ (¨CÓ0ˆð
 —/‘/¤(×"8Ñ"8¸3Õ">ÀÓCˆØ—/‘/¤(§/¡/°CÕ"7¸Ó<ˆð —.‘. ¨(Ó3×:Ñ:Ó<ˆà€Nr   c                  óä   € \         P                  P                  4        U Uu/ uF@  w  rV P                  4       \        9   g!   V P                  R 4      '       g
   V R8X  g   K>  WbKB  	  upp # u upp i )ÚUA_FEATURESÚUA_CONFIG_FILE)ÚosÚenvironrB   rs   r   Ú
startswith)ÚkÚvs     r   Úget_pro_environmentrÁ   w  sc   € ô —J‘J×$Ñ$Ô&ôá&‰DˆAØ�7‰7‹9Ô5Ô5Ø�<‰<˜×&Ò&ØÐ Ñ ô	 	ˆŠÙ&òð ùó s   ¢6A,ÁA,Á"A,c                óÎ  € R pVP                  4        FÍ  w  r4V P                  V4      p\        V\        4      '       d+   \        V\        4      '       d   \	        W,          V4       KV  \        V\
        4      '       d^   \        V\
        4      '       dH   \        V4      '       d0   \        V^ ,          \        4      '       d   V! W,          WCR7       KÂ   W@V&   KÉ  W@V&   KÏ  	  R# )aÂ  Merge the contents of overlay dict into base_dict not only on top-level
keys, but on all on the depths of the overlay_dict object. For example,
using these values as entries for the function:

base_dict = {"a": 1, "b": {"c": 2, "d": 3}}
overlay_dict = {"b": {"c": 10}}

Should update base_dict into:

{"a": 1, "b": {"c": 10, "d": 3}}

@param base_dict: The dict to be updated
@param overlay_dict: The dict with information to be added into base_dict
c                 ó:  € R RRRRR/p. pVP                  V4      pV Fh  pRp\        V 4       F9  w  r‰V	P                  V4      VP                  V4      8X  g   K,  \        W–4       RpK;  	  V'       d   KW  VP                  V4       Kj  	  V P	                  V4       R# )	ÚavailableResourcesr   ÚresourceEntitlementsÚtypeÚ	overridesÚselectorFTN)rb   Ú	enumerateÚdepth_first_merge_overlay_dictÚappendÚextend)
Úbase_valuesÚoverlay_valuesrE   Úmerge_id_key_mapÚvalues_to_appendÚid_keyÚoverlay_valueÚwas_replacedÚ_Ú
base_values
   &&&       r   Úupdate_dict_listÚ8depth_first_merge_overlay_dict.<locals>.update_dict_list‘  s    € à  &Ø" FØ˜ð
Ðð
 ÐØ!×%Ñ% cÓ*ˆÛ+ˆMØ ˆLÜ!*¨;Ö!7‘�Ø—>‘> &Ó)¨]×->Ñ->¸vÓ-FÖFÜ2°:ÔMØ#'’Lñ "8÷
  ‘<Ø ×'Ñ'¨Ö6ñ ,ð 	×ÑÐ+Ö,r   )rE   N)rB   rb   r$   rd   rÊ   ÚlistrP   )Ú	base_dictÚoverlay_dictrÖ   rE   rF   rÕ   s   &&    r   rÊ   rÊ   �  s¥   € ò -ð( #×(Ñ(Ö*‰
ˆØ—]‘] 3Ó'ˆ
Ü�j¤$×'Ò'¬J°u¼d×,CÒ,CÜ*¨9­>¸5ÖAÜ˜
¤D×)Ò)¬j¸Ä×.EÒ.EÜ�:�Š¤:¨j¸­m¼T×#BÒ#BÙ  ¥°×@ðEð "'˜#“à"�c‹Nó +r   Úx86_64Úamd64Úi686Úi386Úppc64leÚppc64elÚaarch64Úarm64Úarmv7lÚarmhfc                ó0   € V ^8„  d   QhR\         R\         /# )r   Úarchr   r   )r   s   "r   r   r   ¾  s   € ÷ 4ñ 4¤ð 4¬ñ 4r   c                 óL   € V P                  4       p\        P                  W4      # r#   )rs   ÚARCH_ALIASESrb   )ræ   Ú
arch_lowers   & r   Ústandardize_arch_namerê   ¾  s   € Ø—‘“€JÜ×Ñ˜JÓ3Ð3r   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r   Úarchesr   r‘   )r   s   "r   r   r   Ã  s"   € ÷ -ñ -œt¤C�yð -¬T´#­Yñ -r   c                 ó„   € \        4       pV  F  pVP                  \        V4      4       K  	  \        \	        V4      4      # r#   )ÚsetÚaddrê   ÚsortedrØ   )rì   Údeduplicated_archesræ   s   &  r   Údeduplicate_archesrò   Ã  s9   € Ü›%ÐÛˆØ×ÑÔ 5°dÓ ;Ö<ñ ä”$Ð*Ó+Ó,Ð,r   c                ó$   € V ^8„  d   QhR\         /# )r   r   )rz   )r   s   "r   r   r   Ê  s   € ÷ ñ œtñ r   c                  ó2   € \         P                  ! 4       ^ 8H  # )r   )r¼   Úgetuidr-   r   r   Úwe_are_currently_rootrö   Ê  s   € Ü�9Š9‹;˜!ÑÐr   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   ÚfilenameÚnew_extensionr   r   )r   s   "r   r   r   Î  s!   € ÷ &ñ &¤Sð &¼ð &Äñ &r   c                 ód   € \         P                  P                  V 4      w  r#VR ,           V,           # )r   )r¼   r`   Úsplitext)rø   rù   r   Ú
_extensions   &&  r   Úset_filename_extensionrý   Î  s(   € Ü—w‘w×'Ñ'¨Ó1Ñ€DØ�#�:˜Õ%Ð%r   c                ó:   € V ^8„  d   QhR\         \        ,          /# )r   Úpackage_listr‘   )r   s   "r   r   r   Ó  s   € ÷ ñ Ü”s•)ñr   c                 ó„   € R P                  \        P                  ! RP                  V 4      ^PRRRRR7      4      R ,           # )Ú
r®   Fz  )ÚwidthÚbreak_long_wordsÚbreak_on_hyphensÚinitial_indentÚsubsequent_indent)r   ÚtextwrapÚwrap)rÿ   s   &r   Úcreate_package_list_strr	  Ó  sF   € ð 	�	‰	Ü�MŠMØ—‘˜Ó&ØØ!&Ø!&Ø#Ø"&ôó		
ð õ
	ðr   )r   )r   FF)z(Bearer )[^\']+z(\'attach\', \')[^\']+z(\'machineToken\': \')[^\']+ú(\'token\': \')[^\']+z((\'X-aws-ec2-metadata-token\': \')[^\']+z*(.*\[PUT\] response.*api/token,.*data: ).*z(https://bearer:)[^\@]+z1(/snap/bin/canonical-livepatch\s+enable\s+)[^\s]+z>(Contract\s+value\s+for\s+'resourceToken'\s+changed\s+to\s+).*z(\'resourceToken\': \')[^\']+z(\'contractToken\': \')[^\']+zF(https://contracts.canonical.com/v1/resources/livepatch\?token=)[^\s]+z(\"identityToken\": \")[^\"]+zT(response:\s+http://metadata/computeMetadata/v1/instance/service-accounts.*data: ).*r
  z(\'userCode\': \')[^\']+z(\'magic_token=)[^\']+z(--registration-key=\")[^\"]+z(--registration-key=\')[^\']+z(--registration-key=)[^ ]+z(--registration-key \")[^\"]+z(--registration-key \')[^\']+z(--registration-key )[^\s]+z(-p \")[^\"]+z(-p \')[^\']+z(-p )[^\s]+)3r%   ÚjsonÚloggingr¼   r“   r±   r  rQ   Ú	functoolsr   Útypingr   r   r   r   r	   rn   r
   r   Úuaclient.defaultsr   Úuaclient.typesr   Úobjectrc   r   Ú	getLoggerr.   rN   ÚJSONEncoderr!   ÚJSONDecoderr9   r\   re   rw   r€   rŽ   ÚREDACT_SENSITIVE_LOGSr˜   rŸ   rC   r¸   rÁ   rÊ   rè   rê   rò   rö   rý   r	  r-   r   r   Ú<module>r     s  ðÛ Û Û Û 	Û 	Û 
Û Û Ý ß 3Õ 3ç )Ý ;Ý .á‹h€õð ×ÒÑ5°hÓ?Ó@€ô"˜t×/Ñ/ô "ô˜t×/Ñ/ô òD÷@ð< !¸R÷ ÷4õ4$
òNÐ ð@ %:÷õõ44õnò4ò1#ðj ˆgØ
ˆFØˆyØˆwØˆgð€õ4õ
-õõ&÷
r   