ó
    x[höD  ã            	       ó`  • S r SSKrSSKrSSKrSSKrSSKrSSKJrJr  SSK	J
r
  SSKJrJrJrJrJrJrJr  SSKrSSKJr  SSKJr  SSKJr  SS	KJrJrJrJrJr  SS
K J!r!  \RD                  " \#5      r$Sr%Sr&Sr'SSSSSSS.r(S\)4S jr* S1S\\\)      S\\)\4   4S jjr+ " S S\5      r, " S S\5      r- " S S\5      r.S\)S\/4S jr0 " S S\Rb                  5      r2 S2S \Rf                  S!\)S"\44S# jjr5 S2S \Rf                  S!\)S"\4S\Rl                  4S$ jjr7 " S% S&\5      r8 " S' S(5      r9\&\8Rt                  4S)\)S*\8S\/4S+ jjr;\2\Rx                  44/r=S, r>\#S-:X  aM  SSK?r?S.r@\?R‚                  " \@S/9rB\BR‡                  5         \D" \RŠ                  " \;" \8Rt                  S095      5        gg)3a•  Datasource for LXD, reads /dev/lxd/sock representation of instance data.

Notes:
 * This datasource replaces previous NoCloud datasource for LXD.
 * Older LXD images may not have updates for cloud-init so NoCloud may
   still be detected on those images.
 * Detect LXD datasource when /dev/lxd/sock is an active socket file.
 * Info on dev-lxd API: https://documentation.ubuntu.com/lxd/en/latest/dev-lxd/
é    N)ÚFlagÚauto)ÚJSONDecodeError)ÚAnyÚDictÚListÚOptionalÚTupleÚUnionÚcast)ÚHTTPAdapter)ÚHTTPConnection)ÚHTTPConnectionPool)Úatomic_helperÚsourcesÚsubpÚ
url_helperÚutil)Úfind_fallback_nicz/dev/lxd/sockz1.0z
http://lxdú	user-dataúnetwork-configúvendor-data)úcloud-init.user-datazcloud-init.network-configúcloud-init.vendor-dataúuser.user-datazuser.network-configúuser.vendor-dataÚreturnc                  ób  • Sn [         R                  " S5      (       aX   [         R                   " S/5      u  pUR                  5       S;   a*  [        R                  " 5       S   S   nUS:X  a  gUS	:X  a  g
gU $ ! [         R                   a"  n[        R	                  SU5        U s S nA$ S nAff = f)NÚeth0zsystemd-detect-virtzHUnable to run systemd-detect-virt: %s. Rendering default network config.)ÚkvmÚqemuÚunameé   Úppc64leÚenp0s5Ús390xÚenc9Úenp5s0)r   ÚwhichÚProcessExecutionErrorÚLOGÚwarningÚstripr   Úsystem_info)Údefault_nameÚ	virt_typeÚ_ÚerrÚarchs        ÚA/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceLXD.pyÚ_get_fallback_interface_namer5   /   s²   € Ø€LÜ‡z‚zÐ'×(Ñ(ð	 ÜŸ9š9Ð&;Ð%<Ó=‰LˆIð �?‰?Óð !
ó 
ô ×#Ò#Ó% gÑ.¨qÑ1ˆDØ�yÓ ØØ˜“ØàØÐøô% ×)Ñ)ó 	 Ü�K‰Kð5àôð
  Õûð	 ús   ŸA8 Á8B.ÂB)Â#B.Â)B.Únicsc                 ó®   • [        5       nU(       a  [        R                  SU5        O [        5       n[        R                  SU5        SSUSSS./S./S	.$ )
zCReturn network config V1 dict representing instance network config.zCLXD datasource generating network from discovered active device: %szVLXD datasource generating network from systemd-detect-virt platform default device: %sé   ÚphysicalÚdhcpr   )ÚtypeÚcontrol)r;   ÚnameÚsubnets)ÚversionÚconfig)r   r+   Údebugr5   )r6   Úprimary_nics     r4   Úgenerate_network_configrC   I   sm   € ô $Ó%€KÞÜ�	‰	ðàõ	
ô 3Ó4ˆÜ�	‰	ð+àô	
ð ð #Ø#Ø%+¸Ñ?Ð@ñð
ñ	ð 	ó    c                   ó.   ^ • \ rS rSrU 4S jrS rSrU =r$ )ÚSocketHTTPConnectionéo   c                 ó>   >• [         TU ]  S5        Xl        S U l        g ©NÚ	localhost)ÚsuperÚ__init__Úsocket_pathÚsock©ÚselfrM   Ú	__class__s     €r4   rL   ÚSocketHTTPConnection.__init__p   s   ø€ Ü‰Ñ˜Ô%Ø&ÔØˆ�	rD   c                 ó¾   • [         R                   " [         R                  [         R                  5      U l        U R                  R	                  U R
                  5        g ©N)ÚsocketÚAF_UNIXÚSOCK_STREAMrN   ÚconnectrM   ©rP   s    r4   rX   ÚSocketHTTPConnection.connectu   s6   € Ü—M’M¤&§.¡.´&×2DÑ2DÓEˆŒ	Ø�	‰	×Ñ˜$×*Ñ*Õ+rD   )rN   rM   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rL   rX   Ú__static_attributes__Ú__classcell__©rQ   s   @r4   rF   rF   o   s   ø† õ÷
,ð ,rD   rF   c                   ó.   ^ • \ rS rSrU 4S jrS rSrU =r$ )ÚSocketConnectionPooléz   c                 ó0   >• Xl         [        TU ]	  S5        g rI   )rM   rK   rL   rO   s     €r4   rL   ÚSocketConnectionPool.__init__{   s   ø€ Ø&ÔÜ‰Ñ˜Õ%rD   c                 ó,   • [        U R                  5      $ rT   )rF   rM   rY   s    r4   Ú	_new_connÚSocketConnectionPool._new_conn   s   € Ü# D×$4Ñ$4Ó5Ð5rD   )rM   )r[   r\   r]   r^   rL   rh   r_   r`   ra   s   @r4   rc   rc   z   s   ø† õ&÷6ð 6rD   rc   c                   ó*   • \ rS rSrSS jr SS jrSrg)ÚLXDSocketAdapteréƒ   Nc                 ó    • [        [        5      $ rT   )rc   ÚLXD_SOCKET_PATH)rP   ÚurlÚproxiess      r4   Úget_connectionÚLXDSocketAdapter.get_connection„   s   € Ü#¤OÓ4Ð4rD   c                 ó:   • U R                  UR                  U5      $ rT   )rq   ro   )rP   ÚrequestÚverifyrp   Úcerts        r4   Úget_connection_with_tls_contextÚ0LXDSocketAdapter.get_connection_with_tls_context‰   s   € ð ×"Ñ" 7§;¡;°Ó8Ð8rD   © rT   )NN)r[   r\   r]   r^   rq   rw   r_   ry   rD   r4   rk   rk   ƒ   s   † ô5ð 37÷9rD   rk   Úmetadata_typec                 ó$  • [        U[        5      (       a  U$ Uc  0 $  [        R                  " U5      nUc#  [
        R                  " SR                  XS95      eU$ ! [         a)  n[
        R                  " SR                  XS95      UeSnAff = f)a"  Convert raw instance data from str, bytes, YAML to dict

:param metadata_type: string, one of as: meta-data, vendor-data, user-data
    network-config

:param metadata_value: str, bytes or dict representing or instance-data.

:raises: InvalidMetaDataError on invalid instance-data content.
NzAInvalid {md_type}. Expected str, bytes or dict but found: {value})Úmd_typeÚvaluez:Invalid {md_type} format. Expected YAML but found: {value})Ú
isinstanceÚdictr   Ú	load_yamlÚAttributeErrorr   ÚInvalidMetaDataExceptionÚformat)rz   Úmetadata_valueÚparsed_metadataÚexcs       r4   Ú_raw_instance_data_to_dictr‡   �   s¤   € ô �.¤$×'Ñ'ØÐØÑØˆ	ðÜŸ.š.¨Ó8ˆð ÑÜ×.Ò.ðß‘v m�vÐJó
ð 	
ð Ðøô ó Ü×.Ò.ðß‘v m�vÐJó
ð ð	ûðús   žA Á
BÁ&$B
Â
Bc                   ó<  ^ • \ rS rSr% Sr\R                  r\\	\
4   \S'   \R                  r\\\	\
4      \S'   \R                  R                  S-   r\\
S4   \S'   SrS	\S
S4U 4S jjr\S
\4S j5       rS
\4S jrS
\
4S jrS
\
4S jr\S
\4S j5       rSrU =r$ )ÚDataSourceLXDé¬   ÚLXDÚ_network_configÚ_crawled_metadata)úuser.meta-datar   r   r   r   .Úsensitive_metadata_keysTÚci_pkl_versionr   Nc                 ó2   >• [         TU ]  U5        SU l        g )NT)rK   Ú	_unpickleÚskip_hotplug_detect)rP   r�   rQ   s     €r4   r’   ÚDataSourceLXD._unpickleÀ   s   ø€ Ü‰Ñ˜.Ô)Ø#'ˆÕ rD   c                  ó:  • [         R                  R                  [        5      (       d  [        R                  S[        5        g[        R                  " [         R                  " [        5      R                  5      (       d  [        R                  S[        5        gg)z@Check platform environment to report if this datasource may run.z%s does not exist.Fz%s is not a socketT)
ÚosÚpathÚexistsrn   r+   r,   ÚstatÚS_ISSOCKÚlstatÚst_modery   rD   r4   Ú	ds_detectÚDataSourceLXD.ds_detectÄ   s\   € ô �w‰w�~‰~œo×.Ñ.Ü�K‰KÐ,¬oÔ>ØÜ—’œrŸxšx¬Ó8×@Ñ@×AÑAÜ�K‰KÐ,¬oÔ>ØØrD   c                 ó  • [        5       U l        [        SU R                  R                  S5      5      U l        U R                  R                  S0 5      nUR                  S0 5      nU(       a%  U R                  R                  [        SU5      5        SU R                  ;   a  U R                  S   U l        SU R                  ;   a  [        SU R                  S   5      U l        SU R                  ;   a  U R                  S   U l        g)z=Crawl LXD socket API instance data and return True on successú	meta-datar@   rŽ   r   r   r   T)	Úread_metadatar�   r‡   ÚgetÚmetadataÚupdateÚuserdata_rawrŒ   Úvendordata_raw)rP   r@   Úuser_metadatas      r4   Ú	_get_dataÚDataSourceLXD._get_dataÏ   sî   € ä!.£ˆÔÜ2Ø˜×/Ñ/×3Ñ3°KÓ@ó
ˆŒð ×'Ñ'×+Ñ+¨H°bÓ9ˆØŸ
™
Ð#3°RÓ8ˆÞØ�M‰M× Ñ Ü*Ð+;¸]ÓKôð ˜$×0Ñ0Ó0Ø $× 6Ñ 6°{Ñ CˆDÔØ˜t×5Ñ5Ó5Ü#=Ø  $×"8Ñ"8Ð9IÑ"Jó$ˆDÔ ð ˜D×2Ñ2Ó2Ø"&×"8Ñ"8¸Ñ"GˆDÔØrD   c                 ó2   • SR                  [        [        S9$ )z.Return subplatform details for this datasourcez"LXD socket API v. {ver} ({socket}))ÚverrU   )rƒ   ÚLXD_SOCKET_API_VERSIONrn   rY   s    r4   Ú_get_subplatformÚDataSourceLXD._get_subplatformå   s   € à3×:Ñ:Ü&¬ð ;ð 
ð 	
rD   c                 ó  • [        [        R                  S9nUR                  S0 5      n[	        U[
        5      (       d  [        R                  " U5      nUR                  S5      U R                  R                  S5      :H  $ )z%Return True if instance_id unchanged.©Úmetadata_keysr    zinstance-id)	r¡   ÚMetaDataKeysÚ	META_DATAr¢   r~   r   r   r€   r£   )rP   Úsys_cfgÚresponseÚmds       r4   Úcheck_instance_idÚDataSourceLXD.check_instance_idë   s`   € ä ¬|×/EÑ/EÑFˆØ�\‰\˜+ rÓ*ˆÜ˜"œd×#Ñ#Ü—’ Ó#ˆBØ�v‰v�mÓ$¨¯©×(9Ñ(9¸-Ó(HÑHÐHrD   c                 ó
  • U R                   [        R                  :X  Ga  U R                  [        R                  :X  a  U R	                  5         [        U R                  [        5      (       a¶  U R                  R                  S5      (       a*  [        R                  S5        U R                  S   U l         OlU R                  R                  S5      (       aL  U R                  S   R                  5        VVs/ s H  u  pUS   S:X  d  M  UPM     nnn[        U5      U l         U R                   [        R                  :X  a$  [        R                  S5        [        5       U l         [        [        U R                   5      $ s  snnf )z~Network config read from LXD socket config/user.network-config.

If none is present, then we generate fallback configuration.
r   z,LXD datasource using provided network configÚdevicesr;   Únicz8LXD datasource generating network config using fallback.)rŒ   r   ÚUNSETr�   r¨   r~   r   r¢   r+   rA   ÚitemsrC   r   )rP   ÚkÚvrº   s       r4   Únetwork_configÚDataSourceLXD.network_configó   s3  € ð ×Ñ¤7§=¡=Ô0Ø×%Ñ%¬¯©Ó6Ø—‘Ô Ü˜$×0Ñ0´$×7Ñ7Ø×)Ñ)×-Ñ-Ð.>×?Ñ?Ü—I‘IÐLÔMØ+/×+AÑ+AØ(ñ,�DÕ(ð ×+Ñ+×/Ñ/°	×:Ñ:ð
 %)×$:Ñ$:¸9Ñ$E×$KÑ$KÔ$Mô*â$M™D˜AØ˜V™9¨Ñ-÷ Ù$Mð ñ *ô
 ,CÀ7Ó+K�DÔ(Ø×Ñ¤7§=¡=Ó0ä�I‰IØJôô $;Ó#<ˆDÔ ä”D˜$×.Ñ.Ó/Ð/ùó*s   Ã7E?Ä
E?)r�   rŒ   r£   r“   r¥   r¦   )r[   r\   r]   r^   Údsnamer   r¼   rŒ   r   r   ÚstrÚ__annotations__r�   r	   Ú
DataSourcer�   r
   r“   Úintr’   ÚstaticmethodÚboolr�   r¨   r­   r·   Úpropertyr   rÀ   r_   r`   ra   s   @r4   r‰   r‰   ¬   sâ   ø‡ à€Fà(/¯©€O�U˜4 ˜9Ñ%Ó5Ø4;·M±MÐ�x  d¨C iÑ 0Ñ1ÓAð 	×Ñ×2Ñ2ð
ñ	
ð ˜U 3¨ 8™_ó 	ð Ðð(¨ð (°÷ (ð ð�tó ó ðð˜4ô ð,
 #ô 
ðI¨Cô Ið ð0 ó 0ó ö0rD   r‰   Úsessionro   Údo_raisec           	      óv  • [        XU5      nUR                  (       d=  [        R                  SUUR                  UR
                  R                  S5      5        0 $  UR                  5       $ ! [         aB  n[        R                  " SR                  XR
                  R                  S5      S95      UeS nAff = f)NúSkipping %s on [HTTP:%d]:%súutf-8zFUnable to process LXD config at {url}. Expected JSON but found: {resp})ro   Úresp)Ú_do_requestÚokr+   rA   Ústatus_codeÚcontentÚdecodeÚjsonr   r   r‚   rƒ   )rÊ   ro   rË   Úurl_responser†   s        r4   Ú_get_json_responser×     s±   € ô ˜w¨XÓ6€LØ�?�?Ü�	‰	Ø)ØØ×$Ñ$Ø× Ñ ×'Ñ'¨Ó0ô		
ð ˆ	ðØ× Ñ Ó"Ð"øÜó Ü×.Ò.ð/ß/5©vØ×2Ñ2×9Ñ9¸'ÓBð 06ð 0ó
ð
 ð	ûðús   ÁA, Á,
B8Á6=B3Â3B8c           	      óæ  • [        SSS5       H^  nU R                  U5      nSUR                  :X  a:  [        R                  " S5        [
        R                  SUR                  UU5        M^    O   [
        R                  SWR                  U5        U(       aY  UR                  (       dH  [        R                  " SR                  UR                  UUR                  R                  S	5      S
95      eU$ )Né   r   éÿÿÿÿiô  gš™™™™™¹?z,[GET] [HTTP:%d] %s, retrying %d more time(s)z[GET] [HTTP:%d] %sz3Invalid HTTP response [{code}] from {route}: {resp}rÎ   )ÚcodeÚrouterÏ   )Úranger¢   rÒ   ÚtimeÚsleepr+   r,   rA   rÑ   r   r‚   rƒ   rÓ   rÔ   )rÊ   ro   rË   Úretriesrµ   s        r4   rÐ   rÐ   ,  sÓ   € ô ˜˜Q Ö#ˆØ—;‘;˜sÓ#ˆØ�(×&Ñ&Ó&ô �JŠJ�sŒOÜ�K‰KØ>Ø×$Ñ$ØØö	ñ ñ $ô ‡I�IÐ" H×$8Ñ$8¸#Ô>Þ˜ŸŸÜ×.Ò.ØA×HÑHØ×)Ñ)ØØ×%Ñ%×,Ñ,¨WÓ5ð Ið ó
ð 	
ð €OrD   c                   ó\   • \ rS rSr\" 5       r\" 5       r\" 5       r\" 5       r\\-  \-  r	Sr
g)r²   iI  ry   N)r[   r\   r]   r^   r   ÚNONEÚCONFIGÚDEVICESr³   ÚALLr_   ry   rD   r4   r²   r²   I  s-   † Ù‹6€DÙ‹V€FÙ‹f€GÙ“€IØ
�7Ñ
˜YÑ
&ƒCrD   r²   c                   ó`   • \ rS rSr\4S\4S jjrS\R                  S\	4S jr
S\S\	4S jrS	rg
)Ú_MetaDataReaderiQ  Úapi_versionc                 ód   • Xl         [        R                  " [        U R                   5      U l        g rT   )rè   r   Úcombine_urlÚLXD_URLÚ_version_url)rP   rè   s     r4   rL   Ú_MetaDataReader.__init__R  s#   € Ø&ÔÜ&×2Ò2´7¸D×<LÑ<LÓMˆÕrD   rÊ   r   c           
      óF  • S0 0n[         R                  " U R                  S5      n[        X5      n[	        U5       Há  n[         R                  " [
        U5      n[        XSS9nUR                  R                  S5      nUR                  (       d$  [        R                  SUUR                  U5        Mx  UR                  S5      S   n	X‚S   U	'   U	[        ;   d  MŸ  [        U	   U;  a  X‚[        U	   '   M¹  [        R                  SU	U	R!                  S	S
S5      5        Mã     U$ )ab  Iterate on LXD API config items. Promoting CONFIG_KEY_ALIASES

Any CONFIG_KEY_ALIASES which affect cloud-init behavior are promoted
as top-level configuration keys: user-data, network-data, vendor-data.

LXD's cloud-init.* config keys override any user.* config keys.
Log debug messages if any user.* keys are overridden by the related
cloud-init.* key.
r@   F©rË   rÎ   rÍ   Ú/rÚ   z,Ignoring LXD config %s in favor of %s value.Úuserz
cloud-initr8   )r   rê   rì   r×   Úsortedrë   rÐ   rÓ   rÔ   rÑ   r+   rA   rÒ   Ú
rpartitionÚCONFIG_KEY_ALIASESr,   Úreplace)
rP   rÊ   r@   Ú
config_urlÚconfig_routesÚconfig_routeÚconfig_route_urlÚconfig_route_responseÚresponse_textÚcfg_keys
             r4   Ú_process_configÚ_MetaDataReader._process_configV  s  € ð ! "�~ˆÜ×+Ò+¨D×,=Ñ,=¸xÓHˆ
ô +¨7Ó?ˆô
 # =Ö1ˆLÜ)×5Ò5´g¸|ÓLÐÜ$/Ø°Eñ%Ð!ð 2×9Ñ9×@Ñ@ÀÓIˆMØ(×+×+Ü—	‘	Ø1Ø$Ø)×5Ñ5Ø!ô	ñ à"×-Ñ-¨cÓ2°2Ñ6ˆGð )6�8Ñ˜WÑ%àÔ,Õ,ô & gÑ.°fÓ<Ø:GÔ-¨gÑ6Ó7ä—K‘KØFØØŸ™¨°¸aÓ@öñ9 2ðB ˆrD   r±   c                ó~  • [         R                  " 5        nUR                  U R                  [	        5       5        SU R
                  0n[        R                  U;   aH  [        R                  " U R                  S5      n[        X$5      R                  R                  S5      US'   [        R                  U;   a   UR                  U R                  U5      5        [        R                   U;   a6  [        R                  " U R                  S5      n[#        X%SS9nU(       a  XcS'   UsS S S 5        $ ! , (       d  f       g = f)NÚ_metadata_api_versionr    rÎ   rº   Frï   )ÚrequestsÚSessionÚmountrì   rk   rè   r²   r³   r   rê   rÐ   rÓ   rÔ   rã   r¤   rý   rä   r×   )rP   r±   rÊ   r¶   Úmd_routero   rº   s          r4   Ú__call__Ú_MetaDataReader.__call__Œ  sö   € Ü×ÒÔ 7Ø�M‰M˜$×+Ñ+Ô-=Ó-?Ô@à/°×1AÑ1AÐBˆBÜ×%Ñ%¨Ó6Ü%×1Ò1Ø×%Ñ% {ó�ô #.Øó#ç‘'Ÿ&™& ›/ð �;‘ô ×"Ñ" mÓ3Ø—	‘	˜$×.Ñ.¨wÓ7Ô8Ü×#Ñ# }Ó4Ü ×,Ò,¨T×->Ñ->À	ÓJ�Ü,¨WÀEÑJ�ÞØ$+�y‘MØ÷%  ××ús   –DD.Ä.
D<)rì   rè   N)r[   r\   r]   r^   r¬   rÃ   rL   r  r  r   rý   r²   r  r_   ry   rD   r4   rç   rç   Q  s@   † Ø*@ñ N Cõ Nð4 x×'7Ñ'7ð 4¸Dô 4ðl¨ð ¸$÷ rD   rç   rè   r±   c                 ó   • [        U S9" US9$ )aÏ  Fetch metadata from the /dev/lxd/socket routes.

Perform a number of HTTP GETs on known routes on the devlxd socket API.
Minimally all containers must respond to <LXD_SOCKET_API_VERSION>/meta-data
when the LXD configuration setting `security.devlxd` is true.

When `security.devlxd` is false, no /dev/lxd/socket file exists. This
datasource will return False from `ds_detect` in that case.

Perform a GET of <LXD_SOCKET_API_VERSION>/config` and walk all `user.*`
configuration keys, storing all keys and values under a dict key
    LXD_SOCKET_API_VERSION: config {...}.

In the presence of the following optional user config keys,
create top level aliases:
  - user.user-data -> user-data
  - user.vendor-data -> vendor-data
  - user.network-config -> network-config

:param api_version:
    LXD API version to operated with.
:param metadata_keys:
    Instance of `MetaDataKeys` indicating what keys to fetch.
:return:
    A dict with the following optional keys: meta-data, user-data,
    vendor-data, network-config, network_mode, devices.

    Below <LXD_SOCKET_API_VERSION> is a dict representation of all raw
    configuration keys and values provided to the container surfaced by
    the socket under the /1.0/config/ route.
)rè   r°   )rç   )rè   r±   s     r4   r¡   r¡   ¢  s   € ôF  {Ò3Ø#ñð rD   c                 ó8   • [         R                  " U [        5      $ rT   )r   Úlist_from_dependsÚdatasources)Údependss    r4   Úget_datasource_listr  Ñ  s   € Ü×$Ò$ W¬kÓ:Ð:rD   Ú__main__z*Query LXD metadata and emit a JSON object.)Údescriptionr°   rT   )T)FÚ__doc__Úloggingr–   rU   r™   rÞ   Úenumr   r   Újson.decoderr   Útypingr   r   r   r	   r
   r   r   r  Úrequests.adaptersr   Úurllib3.connectionr   Úurllib3.connectionpoolr   Ú	cloudinitr   r   r   r   r   Úcloudinit.netr   Ú	getLoggerr[   r+   rn   r¬   rë   rô   rÃ   r5   rC   rF   rc   rk   r   r‡   rÅ   r‰   r  rÈ   r×   ÚResponserÐ   r²   rç   rå   r¡   ÚDEP_FILESYSTEMr
  r  Úargparser  ÚArgumentParserÚparserÚ
parse_argsÚprintÚ
json_dumpsry   rD   r4   Ú<module>r"     s  ðñó Û 	Û Û Û ß Ý (ß @× @Ñ @ã Ý )õ .Ý 5ç DÕ DÝ +à×Ò˜Ó!€à!€ØÐ Ø
€ð (Ø!1Ø+Ø!Ø+Ø%ñÐ ð cô ð6 !%ñ#Ø
�4˜‘9Ñ
ð#à	ˆ#ˆsˆ(�^õ#ôL,˜>ô ,ô6Ð-ô 6ô	9�{ô 	9ð¨cð Àdô ô:f0�G×&Ñ&ô f0ðT ;?ñØ×ÑðØ$'ðØ37õð0 ;?ñØ×ÑðØ$'ðØ37ðà×Ñõô:'�4ô '÷Nñ Nðd .Ø".×"2Ñ"2ñ%Øð%àð%ð 
õ%ðT �W×+Ñ+Ð-Ð.ð€ò;ð ˆzÓÛàB€KØ×$Ò$°Ñ=€FØ
×ÑÔÙ	Ø× Ò ¡¸\×=MÑ=MÑ!NÓOõð rD   