Ë
    x[höD  ã            	       óV  — d Z ddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZmZmZmZmZmZmZ ddl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mZmZ dd
l m!Z!  ejD                  e#«      Z$dZ%dZ&dZ'dddddddœZ(de)fd„Z*	 d1deee)      dee)ef   fd„Z+ G d„ de«      Z, G d„ de«      Z- G d„ de«      Z.de)de/fd„Z0 G d„ dejb                  «      Z2	 d2d ejf                  d!e)d"e4fd#„Z5	 d2d ejf                  d!e)d"e4dejl                  fd$„Z7 G d%„ d&e«      Z8 G d'„ d(«      Z9e&e8jt                  fd)e)d*e8de/fd+„Z;e2ejx                  ffgZ=d,„ Z>e#d-k(  rSddl?Z?d.Z@ e?j‚                  e@¬/«      ZBeBj‡                  «         eD ejŠ                   e;e8jt                  ¬0«      «      «       yy)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                  óJ  — d} t        j                  d«      rS	 t        j                   dg«      \  }}|j                  «       dv r't        j                  «       d   d   }|dk(  ry|d	k(  ry
y| S # t         j                  $ r"}t        j	                  d|«       | cY d }~S d }~ww xY w)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�qð �?‰?Óð !
ñ 
ô ×#Ñ#Ó% gÑ.¨qÑ1ˆDØ�yÒ ØØ˜’ØàØÐøô% ×)Ñ)ò 	 Ü�K‰Kð5àôð
  Õûð	 ús   ™A- Á-B"Â BÂB"ÂB"Únicsc                 ó¤   — t        «       }|rt        j                  d|«       n t        «       }t        j                  d|«       dd|dddœgdœgd	œ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                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚSocketHTTPConnectionc                 ó@   •— t         ‰| �  d«       || _        d | _        y ©NÚ	localhost)ÚsuperÚ__init__Úsocket_pathÚsock©ÚselfrL   Ú	__class__s     €r4   rK   zSocketHTTPConnection.__init__p   s   ø€ Ü‰Ñ˜Ô%Ø&ˆÔØˆ�	rD   c                 ó¼   — t        j                   t         j                  t         j                  «      | _        | j                  j	                  | j
                  «       y ©N)ÚsocketÚAF_UNIXÚSOCK_STREAMrM   ÚconnectrL   ©rO   s    r4   rV   zSocketHTTPConnection.connectu   s6   € Ü—M‘M¤&§.¡.´&×2DÑ2DÓEˆŒ	Ø�	‰	×Ñ˜$×*Ñ*Õ+rD   )Ú__name__Ú
__module__Ú__qualname__rK   rV   Ú__classcell__©rP   s   @r4   rF   rF   o   s   ø„ ôö
,rD   rF   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚSocketConnectionPoolc                 ó2   •— || _         t        ‰| �	  d«       y rH   )rL   rJ   rK   rN   s     €r4   rK   zSocketConnectionPool.__init__{   s   ø€ Ø&ˆÔÜ‰Ñ˜Õ%rD   c                 ó,   — t        | j                  «      S rR   )rF   rL   rW   s    r4   Ú	_new_connzSocketConnectionPool._new_conn   s   € Ü# D×$4Ñ$4Ó5Ð5rD   )rX   rY   rZ   rK   ra   r[   r\   s   @r4   r^   r^   z   s   ø„ ô&ö6rD   r^   c                   ó   — e Zd Zdd„Z	 dd„Zy)ÚLXDSocketAdapterNc                 ó    — t        t        «      S rR   )r^   ÚLXD_SOCKET_PATH)rO   ÚurlÚproxiess      r4   Úget_connectionzLXDSocketAdapter.get_connection„   s   € Ü#¤OÓ4Ð4rD   c                 ó:   — | j                  |j                  |«      S rR   )rh   rf   )rO   ÚrequestÚverifyrg   Úcerts        r4   Úget_connection_with_tls_contextz0LXDSocketAdapter.get_connection_with_tls_context‰   s   € ð ×"Ñ" 7§;¡;°Ó8Ð8rD   rR   )NN)rX   rY   rZ   rh   rm   © rD   r4   rc   rc   ƒ   s   „ ó5ð 37ô9rD   rc   Úmetadata_typec                 ó  — t        |t        «      r|S |€i S 	 t        j                  |«      }|€&t        j                  dj                  | |¬«      «      ‚|S # t        $ r,}t        j                  dj                  | |¬«      «      |‚d}~ww xY w)a6  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)ro   Ú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                   ó&  ‡ — e Zd ZU dZej
                  Zeee	f   e
d<   ej
                  Zeeee	f      e
d<   ej                  j                  dz   Zee	df   e
d<   dZded	d
fˆ fd„Zed	efd„«       Zd	efd„Zd	e	fd„Zd	e	fd„Zed	efd„«       Zˆ xZS )ÚDataSourceLXDÚLXDÚ_network_configÚ_crawled_metadata)úuser.meta-datar   r   r   r   .Úsensitive_metadata_keysTÚci_pkl_versionr   Nc                 ó2   •— t         ‰| �  |«       d| _        y )NT)rJ   Ú	_unpickleÚskip_hotplug_detect)rO   r„   rP   s     €r4   r†   zDataSourceLXD._unpickleÀ   s   ø€ Ü‰Ñ˜.Ô)Ø#'ˆÕ rD   c                  ó"  — t         j                  j                  t        «      st        j                  dt        «       yt        j                  t        j                  t        «      j                  «      st        j                  dt        «       yy)z@Check platform environment to report if this datasource may run.z%s does not exist.Fz%s is not a socketT)
ÚosÚpathÚexistsre   r+   r,   ÚstatÚS_ISSOCKÚlstatÚst_modern   rD   r4   Ú	ds_detectzDataSourceLXD.ds_detectÄ   sV   € ô �w‰w�~‰~œoÔ.Ü�K‰KÐ,¬oÔ>ØÜ—‘œrŸx™x¬Ó8×@Ñ@ÔAÜ�K‰KÐ,¬oÔ>ØØrD   c                 ó   — t        «       | _        t        d| j                  j                  d«      «      | _        | j                  j                  di «      }|j                  di «      }|r%| j                  j                  t        d|«      «       d| j                  v r| j                  d   | _        d| j                  v rt        d| j                  d   «      | _        d| j                  v r| j                  d   | _        y)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)rO   r@   Úuser_metadatas      r4   Ú	_get_dataz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                 ó8   — dj                  t        t        ¬«      S )z.Return subplatform details for this datasourcez"LXD socket API v. {ver} ({socket}))ÚverrS   )rx   ÚLXD_SOCKET_API_VERSIONre   rW   s    r4   Ú_get_subplatformzDataSourceLXD._get_subplatformå   s   € à3×:Ñ:Ü&¬ð ;ó 
ð 	
rD   c                 óþ   — t        t        j                  ¬«      }|j                  di «      }t	        |t
        «      st        j                  |«      }|j                  d«      | j                  j                  d«      k(  S )z%Return True if instance_id unchanged.©Úmetadata_keysr’   zinstance-id)	r“   ÚMetaDataKeysÚ	META_DATAr”   rs   rt   r   ru   r•   )rO   Úsys_cfgÚresponseÚmds       r4   Úcheck_instance_idzDataSourceLXD.check_instance_idë   s]   € ä ¬|×/EÑ/EÔFˆØ�\‰\˜+ rÓ*ˆÜ˜"œdÔ#Ü—‘ Ó#ˆBØ�v‰v�mÓ$¨¯©×(9Ñ(9¸-Ó(HÑHÐHrD   c                 óÚ  — | j                   t        j                  k(  rî| j                  t        j                  k(  r| j	                  «        t        | j                  t        «      r§| j                  j                  d«      r*t        j                  d«       | j                  d   | _         nb| j                  j                  d«      rG| j                  d   j                  «       D ��cg c]  \  }}|d   dk(  r|‘Œ }}}t        |«      | _         | j                   t        j                  k(  r$t        j                  d«       t        «       | _         t        t        | j                   «      S c c}}w )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š   rs   rt   r”   r+   rA   ÚitemsrC   r   )rO   ÚkÚvr©   s       r4   Únetwork_configzDataSourceLXD.network_configó   s)  € ð ×Ñ¤7§=¡=Ò0Ø×%Ñ%¬¯©Ò6Ø—‘Ô Ü˜$×0Ñ0´$Ô7Ø×)Ñ)×-Ñ-Ð.>Ô?Ü—I‘IÐLÔMØ+/×+AÑ+AØ(ñ,�DÕ(ð ×+Ñ+×/Ñ/°	Ô:ð
 %)×$:Ñ$:¸9Ñ$E×$KÑ$KÓ$M÷*á ˜A˜qØ˜V™9¨Ò-ò ð*�Gñ *ô
 ,CÀ7Ó+K�DÔ(Ø×Ñ¤7§=¡=Ò0ä�I‰IØJôô $;Ó#<ˆDÔ ä”D˜$×.Ñ.Ó/Ð/ùó*s   Ã%E')rX   rY   rZ   Údsnamer   r«   r€   r   r   ÚstrÚ__annotations__r�   r	   Ú
DataSourcerƒ   r
   r‡   Úintr†   ÚstaticmethodÚboolr�   rš   rž   r§   Úpropertyrt   r¯   r[   r\   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~   Úsessionrf   Údo_raisec           	      ór  — t        | ||«      }|j                  s=t        j                  d||j                  |j
                  j                  d«      «       i S 	 |j                  «       S # t        $ rE}t        j                  dj                  ||j
                  j                  d«      ¬«      «      |‚d }~ww xY w)NúSkipping %s on [HTTP:%d]:%súutf-8zFUnable to process LXD config at {url}. Expected JSON but found: {resp})rf   Úresp)Ú_do_requestÚokr+   rA   Ústatus_codeÚcontentÚdecodeÚjsonr   r   rw   rx   )r¸   rf   r¹   Úurl_responser{   s        r4   Ú_get_json_responserÅ     sµ   € ô ˜w¨¨XÓ6€LØ�?Š?Ü�	‰	Ø)ØØ×$Ñ$Ø× Ñ ×'Ñ'¨Ó0ô		
ð ˆ	ðØ× Ñ Ó"Ð"øÜò Ü×.Ñ.ð/ß/5©vØ˜l×2Ñ2×9Ñ9¸'ÓBð 06ó 0ó
ð
 ð	ûðús   ÁA( Á(	B6Á1A B1Â1B6c           	      óÎ  — t        ddd«      D ][  }| j                  |«      }d|j                  k(  r8t        j                  d«       t
        j                  d|j                  ||«       Œ[ n t
        j                  dj                  |«       |rV|j                  sJt        j                  dj                  |j                  ||j                  j                  d	«      ¬
«      «      ‚|S )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   rw   rx   rÁ   rÂ   )r¸   rf   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                   óT   — e Zd Z e«       Z e«       Z e«       Z e«       Zeez  ez  Zy)r¢   N)	rX   rY   rZ   r   ÚNONEÚCONFIGÚDEVICESr£   ÚALLrn   rD   r4   r¢   r¢   I  s-   „ Ù‹6€DÙ‹V€FÙ‹f€GÙ“€IØ
�7Ñ
˜YÑ
&�CrD   r¢   c                   óP   — e Zd Zefdefd„Zdej                  defd„Z	de
defd„Zy)	Ú_MetaDataReaderÚapi_versionc                 ód   — || _         t        j                  t        | j                   «      | _        y rR   )rÖ   r   Úcombine_urlÚLXD_URLÚ_version_url)rO   rÖ   s     r4   rK   z_MetaDataReader.__init__R  s%   € Ø&ˆÔÜ&×2Ñ2´7¸D×<LÑ<LÓMˆÕrD   r¸   r   c           
      ó4  — di i}t        j                  | j                  d«      }t        ||«      }t	        |«      D ]Ù  }t        j                  t
        |«      }t        ||d¬«      }|j                  j                  d«      }|j                  s#t        j                  d||j                  |«       Œu|j                  d«      d   }	||d   |	<   |	t        v sŒšt        |	   |vr||t        |	   <   Œ²t        j                  d|	|	j!                  d	d
d«      «       ŒÛ |S )a’  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)
rO   r¸   r@   Ú
config_urlÚconfig_routesÚconfig_routeÚconfig_route_urlÚconfig_route_responseÚresponse_textÚcfg_keys
             r4   Ú_process_configz_MetaDataReader._process_configV  s+  € ð ! "�~ˆÜ×+Ñ+¨D×,=Ñ,=¸xÓHˆ
ô +¨7°JÓ?ˆô
 # =Ó1ò  	ˆLÜ)×5Ñ5´g¸|ÓLÐÜ$/ØÐ)°Eô%Ð!ð 2×9Ñ9×@Ñ@ÀÓIˆMØ(×+Ò+Ü—	‘	Ø1Ø$Ø)×5Ñ5Ø!ô	ð à"×-Ñ-¨cÓ2°2Ñ6ˆGð )6ˆF�8Ñ˜WÑ%àÔ,Ò,ô & gÑ.°fÑ<Ø:G�FÔ-¨gÑ6Ò7ä—K‘KØFØØŸ™¨°¸aÓ@õð9 	ðB ˆrD   r¡   c                ód  — t        j                  «       5 }|j                  | j                  t	        «       «       d| j
                  i}t        j                  |v rHt        j                  | j                  d«      }t        ||«      j                  j                  d«      |d<   t        j                  |v r |j                  | j                  |«      «       t        j                   |v r5t        j                  | j                  d«      }t#        ||d¬«      }|r||d<   |cd d d «       S # 1 sw Y   y xY w)NÚ_metadata_api_versionr’   r¼   r©   FrÜ   )ÚrequestsÚSessionÚmountrÚ   rc   rÖ   r¢   r£   r   rØ   r¾   rÁ   rÂ   rÑ   r–   rê   rÒ   rÅ   )rO   r¡   r¸   r¦   Úmd_routerf   r©   s          r4   Ú__call__z_MetaDataReader.__call__Œ  s  € Ü×ÑÓð 	 7Ø�M‰M˜$×+Ñ+Ô-=Ó-?Ô@à/°×1AÑ1AÐBˆBÜ×%Ñ%¨Ñ6Ü%×1Ñ1Ø×%Ñ% {ó�ô #.Ø˜Xó#ç‘'Ÿ&™& ›/ð �;‘ô ×"Ñ" mÑ3Ø—	‘	˜$×.Ñ.¨wÓ7Ô8Ü×#Ñ# }Ñ4Ü ×,Ñ,¨T×->Ñ->À	ÓJ�Ü,¨W°cÀEÔJ�ÙØ$+�B�y‘MØ÷%	÷ 	ò 	ús   •DD&Ä&D/N)rX   rY   rZ   r�   r±   rK   rí   rî   rt   rê   r¢   rñ   rn   rD   r4   rÕ   rÕ   Q  s@   „ Ø*@ñ N Có Nð4 x×'7Ñ'7ð 4¸Dó 4ðl¨ð ¸$ô rD   rÕ   rÖ   r¡   c                 ó(   —  t        | ¬«      |¬«      S )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 4Œ? {Ô3Ø#ôð rD   c                 ó6   — t        j                  | t        «      S rR   )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    rR   )T)FÚ__doc__Úloggingr‰   rS   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   Ú	getLoggerrX   r+   re   r�   rÙ   rá   r±   r5   rC   rF   r^   rc   rt   r|   r³   r~   rî   r¶   rÅ   ÚResponser¾   r¢   rÕ   rÓ   r“   ÚDEP_FILESYSTEMrõ   r÷   Úargparserù   ÚArgumentParserÚparserÚ
parse_argsÚprintÚ
json_dumpsrn   rD   r4   ú<module>r     s   ðñó Û 	Û Û Û ß Ý (ß @× @Ñ @ã Ý )õ .Ý 5ç DÕ DÝ +à€g×Ñ˜Ó!€à!€ØÐ Ø
€ð (Ø!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Ø$ˆX×$Ñ$°Ô=€FØ
×ÑÔÙ	Ø ˆ× Ñ ¡¸\×=MÑ=MÔ!NÓOõð rD   