Ë
    ìmxia5  ã                   óú  — 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ZddlZddl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 ddlZddlZddlZd„ Zej*                  d„ «       Zd„ Zd„ Zd„ Z	 	 dd	„Zd
„ Zd„ Zej*                  d„ «       Zej*                  d„ «       Zej*                  d„ «       Zd„ Z  G d„ d«      Z! G d„ dejD                  jF                  «      Z$ej*                  ddœd„«       Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*d„ Z+y)z
Utility functions for testing
é    N)Útagsc                  ó,   — t        j                  d«      S )zLRandomly choose either 1 or -1.

    Returns
    -------
    sign : int
    )éÿÿÿÿé   ©ÚrandomÚchoice© ó    úI/home/htdocs/ttos/venv/lib/python3.12/site-packages/pyarrow/tests/util.pyÚrandsignr   +   s   € ô �=‰=˜Ó!Ð!r   c              #   óÆ   K  — t        j                  «       }t        j                  | «       	 d–— t        j                  |«       y# t        j                  |«       w xY w­w)a  Set the random seed inside of a context manager.

    Parameters
    ----------
    seed : int
        The seed to set

    Notes
    -----
    This function is useful when you want to set a random seed but not affect
    the random state of other functions using the random module.
    N)r   ÚgetstateÚseedÚsetstate)r   Úoriginal_states     r   Úrandom_seedr   5   s@   è ø€ ô —_‘_Ó&€NÜ
‡K�K�Ôð(Ûä�‰˜Õ'øŒ�‰˜Õ'üs   ‚*A!­A ±A!ÁAÁA!c                 ój  — d| cxk  rdk  sJ d«       ‚ J d«       ‚|dk  rt        d«      ‚d| |z
  z  dz
  }t        j                  | |«      }|st        j                  |«      S d|z  dz
  }t        j                  d|«      }t        j                  |› dt        |«      j                  |d«      › �«      S )	aû  Generate a random decimal value with specified precision and scale.

    Parameters
    ----------
    precision : int
        The maximum number of digits to generate. Must be an integer between 1
        and 38 inclusive.
    scale : int
        The maximum number of digits following the decimal point.  Must be an
        integer greater than or equal to 0.

    Returns
    -------
    decimal_value : decimal.Decimal
        A random decimal.Decimal object with the specified precision and scale.
    r   é&   z,precision must be between 1 and 38 inclusiver   zHranddecimal does not yet support generating decimals with negative scaleé
   ú.Ú0)Ú
ValueErrorr   ÚrandintÚdecimalÚDecimalÚstrÚrjust)Ú	precisionÚscaleÚmax_whole_valueÚwholeÚmax_fractional_valueÚ
fractionals         r   Úranddecimalr%   K   sÍ   € ð" �	Ô˜RÒÐOÐ!OÓOÑÐOÐ!OÓOÐØˆq‚yÜðó
ð 	
ð ˜Y¨Ñ.Ñ/°!Ñ3€OÜ�N‰N˜OÐ+¨_Ó=€EáÜ�‰˜uÓ%Ð%à ™;¨™?ÐÜ—‘ Ð#7Ó8€Jä�?‰?Øˆ'�”3�z“?×(Ñ(¨°Ó4Ð5Ð6óð r   c           	      óx   — t        t        | «      D �cg c]  }t        j                  dd«      ‘Œ c}«      S c c}w )NéA   éz   )ÚbytesÚranger   r   )ÚlengthÚis     r   Úrandom_asciir-   p   s*   € Ü´5¸³=ÖA¨a”&—.‘.  SÕ)ÒAÓBÐBùÒAs   “7c                 óž   ‡— t        t        j                  t        j                  z   «      Šdj	                  ˆfd„t        | «      D «       «      S )z%
    Generate one random string.
    Ú c              3   óH   •K  — | ]  }t        j                  ‰«      –— Œ y ­w©Nr   )Ú.0r,   ÚRANDS_CHARSs     €r   ú	<genexpr>zrands.<locals>.<genexpr>y   s   øè ø€ ÒE°!”6—=‘= ×-ÑEùs   ƒ")ÚlistÚstringÚascii_lettersÚdigitsÚjoinr*   )Úncharsr3   s    @r   Úrandsr;   t   s7   ø€ ô ”v×+Ñ+¬f¯m©mÑ;Ó<€KØ�7‰7ÓE´u¸V³}ÔEÓEÐEr   c                 ó°   ‡‡‡‡‡	‡
— ddl }|j                  «       Š
ˆˆ
fd„Š ‰«       Šˆˆˆ	ˆfd„}t        |«      D ]  Š	 | «        ‰	|z  dk(  sŒ |«        Œ y)aÙ  
    Execute the function and try to detect a clear memory leak either internal
    to Arrow or caused by a reference counting problem in the Python binding
    implementation. Raises exception if a leak detected

    Parameters
    ----------
    f : callable
        Function to invoke on each iteration
    metric : {'rss', 'vms', 'shared'}, default 'rss'
        Attribute of psutil.Process.memory_info to use for determining current
        memory use
    threshold : int, default 128K
        Threshold in number of bytes to consider a leak
    iterations : int, default 10
        Total number of invocations of f
    check_interval : int, default 1
        Number of invocations of f in between each memory use check
    r   Nc                  ó`   •— t        j                  «        t        ‰j                  «       ‰ «      S r1   )ÚgcÚcollectÚgetattrÚmemory_info)ÚmetricÚprocs   €€r   Ú_get_usez#memory_leak_check.<locals>._get_use”   s"   ø€ Ü
�
‰
ŒÜ�t×'Ñ'Ó)¨6Ó2Ð2r   c                  óN   •—  ‰«       } | ‰z
  ‰kD  rt        d| ‰z
  › d‰› d�«      ‚y )Nz.Memory leak detected. Departure from baseline z after z iterations)Ú	Exception)Úcurrent_userD   Úbaseline_user,   Ú	thresholds    €€€€r   Ú_leak_checkz&memory_leak_check.<locals>._leak_checkš   sE   ø€ Ù“jˆØ˜Ñ%¨	Ò1ÜØ@Ø Ñ-Ð.¨g°a°S¸ðEóð ð 2r   )ÚpsutilÚProcessr*   )ÚfrB   rI   Ú
iterationsÚcheck_intervalrK   rJ   rD   rH   r,   rC   s    ``    @@@@r   Úmemory_leak_checkrP   |   sT   ý€ ó* Ø�>‰>Ó€Dõ3ñ “:€L÷ô �:Óò ˆÙ	ŒØˆ~Ñ Ó"Ù�Mñr   c                  óŠ  — t         j                  j                  «       } | j                  dd«      }t         j                  j                  t         j                  j                  t         j                  j                  t        j                  «      «      «      }|r"t         j                  j                  ||f«      }n|}|| d<   | S )NÚ
PYTHONPATHr/   )ÚosÚenvironÚcopyÚgetÚpathÚabspathÚdirnameÚpaÚ__file__Úpathsepr9   )ÚenvÚexisting_pythonpathÚmodule_pathÚnew_pythonpaths       r   Ú get_modified_env_with_pythonpathra   ¨   s‡   € ä
�*‰*�/‰/Ó
€CØŸ'™' ,°Ó3Ðä—'‘'—/‘/Ü
�‰�‰œŸ™Ÿ™¬¯©Ó4Ó5ó7€Kñ ÜŸ™Ÿ™¨+Ð7JÐ)KÓL‰à$ˆØ&€CˆÑØ€Jr   c                 óL  — t        «       }t        j                  j                  t        j                  j	                  t
        «      «      }t        j                  j                  || «      }t        j                  |g}|j                  |«       t        j                  ||¬«       y )N)r]   )ra   rS   rW   rY   Úrealpathr[   r9   ÚsysÚ
executableÚextendÚ
subprocessÚ
check_call)Úscript_nameÚargsÚsubprocess_envÚdir_pathÚpython_fileÚcmds         r   Úinvoke_scriptro   ¸   si   € Ü5Ó7€Nä�w‰w�‰œrŸw™w×/Ñ/´Ó9Ó:€HÜ—'‘'—,‘,˜x¨Ó5€Kä�>‰>˜;Ð
'€CØ‡J�JˆtÔä×Ñ˜# >Ö2r   c              #   ó   K  — t         j                  j                  | «      }|t         j                  | <   	 d–— |€t         j                  | = y|t         j                  | <   y# |€t         j                  | = w |t         j                  | <   w xY w­w)zA
    Temporarily set environment variable *name* to *value*.
    N)rS   rT   rV   )ÚnameÚvalueÚ
orig_values      r   Úchanged_environrt   Ä   ss   è ø€ ô
 —‘—‘ Ó%€JØ„B‡J�JˆtÑð*ÛàÐÜ—
‘
˜4Ñ à)ŒB�J‰J�tÒøð ÐÜ—
‘
˜4Ñ à)ŒB�J‰J�tÒüs   ‚3B¶A" º(BÁ")BÂBc              #   óØ   K  — t        j                  «       }t        j                  t        | «      «       	 d –— t        j                  |«       y # t        j                  |«       w xY w­wr1   )rS   ÚgetcwdÚchdirr   )rW   Úcurdirs     r   Ú
change_cwdry   Ô   sA   è ø€ ä�Y‰Y‹[€FÜ‡H�HŒS�‹YÔðÛä
�‰�ÕøŒ�‰�Õüs   ‚3A*¶A ºA*ÁA'Á'A*c               #   ó˜   K  — t        j                  «        	 d –— t        j                  «        y # t        j                  «        w xY w­wr1   )r>   ÚdisableÚenabler
   r   r   Údisabled_gcr}   Þ   s)   è ø€ ä‡J�J„LðÛä
�	‰	�øŒ�	‰	�üs   ‚A
˜1 œA
±AÁA
c                 óD   — t         j                  dk(  rd| › �}|S d| › �}|S )NÚntzfile:///zfile://)rS   rq   )rW   Úuris     r   Ú_filesystem_urir�   ç   s3   € ä	‡w�w�$‚Ø˜˜Ðˆð €Jð ˜�vÐˆØ€Jr   c                   ó   — e Zd Zd„ Zd„ Zy)ÚFSProtocolClassc                 ó   — || _         y r1   )Ú_path©ÚselfrW   s     r   Ú__init__zFSProtocolClass.__init__ñ   s	   € Øˆ�
r   c                 ó,   — t        | j                  «      S r1   )r   r…   ©r‡   s    r   Ú
__fspath__zFSProtocolClass.__fspath__ô   s   € Ü�4—:‘:‹Ðr   N)Ú__name__Ú
__module__Ú__qualname__rˆ   r‹   r
   r   r   rƒ   rƒ   ð   s   „ òór   rƒ   c                   ó|   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚProxyHandlerz�
    A dataset handler that proxies to an underlying filesystem.  Useful
    to partially wrap an existing filesystem with partial changes.
    c                 ó   — || _         y r1   )Ú_fs)r‡   Úfss     r   rˆ   zProxyHandler.__init__þ   s	   € Øˆ�r   c                 ó`   — t        |t        «      r| j                  |j                  k(  S t        S r1   ©Ú
isinstancer�   r’   ÚNotImplemented©r‡   Úothers     r   Ú__eq__zProxyHandler.__eq__  ó%   € Ü�eœ\Ô*Ø—8‘8˜uŸy™yÑ(Ð(ÜÐr   c                 ó`   — t        |t        «      r| j                  |j                  k7  S t        S r1   r•   r˜   s     r   Ú__ne__zProxyHandler.__ne__  r›   r   c                 ó4   — d| j                   j                  z   S )Nzproxy::)r’   Ú	type_namerŠ   s    r   Úget_type_namezProxyHandler.get_type_name  s   € Ø˜4Ÿ8™8×-Ñ-Ñ-Ð-r   c                 ó8   — | j                   j                  |«      S r1   )r’   Únormalize_pathr†   s     r   r¢   zProxyHandler.normalize_path  s   € Ø�x‰x×&Ñ& tÓ,Ð,r   c                 ó8   — | j                   j                  |«      S r1   ©r’   Úget_file_info)r‡   Úpathss     r   r¥   zProxyHandler.get_file_info  s   € Ø�x‰x×%Ñ% eÓ,Ð,r   c                 ó8   — | j                   j                  |«      S r1   r¤   )r‡   Úselectors     r   Úget_file_info_selectorz#ProxyHandler.get_file_info_selector  s   € Ø�x‰x×%Ñ% hÓ/Ð/r   c                 ó<   — | j                   j                  ||¬«      S )N)Ú	recursive)r’   Ú
create_dir)r‡   rW   r«   s      r   r¬   zProxyHandler.create_dir  s   € Ø�x‰x×"Ñ" 4°9Ð"Ó=Ð=r   c                 ó8   — | j                   j                  |«      S r1   )r’   Ú
delete_dirr†   s     r   r®   zProxyHandler.delete_dir  s   € Ø�x‰x×"Ñ" 4Ó(Ð(r   c                 ó<   — | j                   j                  ||¬«      S )N)Úmissing_dir_ok©r’   Údelete_dir_contents)r‡   rW   r°   s      r   r²   z ProxyHandler.delete_dir_contents  s%   € Ø�x‰x×+Ñ+¨DØ;Ið ,ó Kð 	Kr   c                 ó<   — | j                   j                  dd¬«      S )Nr/   T)Úaccept_root_dirr±   rŠ   s    r   Údelete_root_dir_contentsz%ProxyHandler.delete_root_dir_contents!  s   € Ø�x‰x×+Ñ+¨BÀÐ+ÓEÐEr   c                 ó8   — | j                   j                  |«      S r1   )r’   Údelete_filer†   s     r   r·   zProxyHandler.delete_file$  s   € Ø�x‰x×#Ñ# DÓ)Ð)r   c                 ó:   — | j                   j                  ||«      S r1   )r’   Úmove©r‡   ÚsrcÚdests      r   r¹   zProxyHandler.move'  s   € Ø�x‰x�}‰}˜S $Ó'Ð'r   c                 ó:   — | j                   j                  ||«      S r1   )r’   Ú	copy_filerº   s      r   r¾   zProxyHandler.copy_file*  s   € Ø�x‰x×!Ñ! # tÓ,Ð,r   c                 ó8   — | j                   j                  |«      S r1   )r’   Úopen_input_streamr†   s     r   rÀ   zProxyHandler.open_input_stream-  s   € Ø�x‰x×)Ñ)¨$Ó/Ð/r   c                 ó8   — | j                   j                  |«      S r1   )r’   Úopen_input_filer†   s     r   rÂ   zProxyHandler.open_input_file0  s   € Ø�x‰x×'Ñ'¨Ó-Ð-r   c                 ó<   — | j                   j                  ||¬«      S ©N)Úmetadata)r’   Úopen_output_stream©r‡   rW   rÅ   s      r   rÆ   zProxyHandler.open_output_stream3  ó   € Ø�x‰x×*Ñ*¨4¸(Ð*ÓCÐCr   c                 ó<   — | j                   j                  ||¬«      S rÄ   )r’   Úopen_append_streamrÇ   s      r   rÊ   zProxyHandler.open_append_stream6  rÈ   r   N)rŒ   r�   rŽ   Ú__doc__rˆ   rš   r�   r    r¢   r¥   r©   r¬   r®   r²   rµ   r·   r¹   r¾   rÀ   rÂ   rÆ   rÊ   r
   r   r   r�   r�   ø   se   „ ñò
òò
ò
.ò-ò-ò0ò>ò)òKòFò*ò(ò-ò0ò.òDóDr   r�   F©Úwarn_on_full_bufferc              #   ó¼  K  — t        j                  «       \  }}d }	 |j                  d«       |j                  d«       t        j                  |j                  «       | ¬«      }|–— |�t        j                  |«       |j                  «        |j                  «        y # |�t        j                  |«       |j                  «        |j                  «        w xY w­w)NFrÌ   )ÚsocketÚ
socketpairÚsetblockingÚsignalÚset_wakeup_fdÚfilenoÚclose)rÍ   ÚrÚwÚold_fds       r   Úsignal_wakeup_fdrÙ   :  s­   è ø€ ô ×ÑÓ�D€A€qØ€Fð
Ø	�‰�eÔØ	�‰�eÔÜ×%Ñ%Ø�H‰H‹JÐ,?ôAˆàŠàÐÜ× Ñ  Ô(Ø	�‰Œ	Ø	�‰�	øð ÐÜ× Ñ  Ô(Ø	�‰Œ	Ø	�‰�	üs   ‚C�AB  Á(8CÂ 9CÃCc                 óž  — | dg}t        j                  |t         j                  t         j                  d¬«      5 }|j                  d«      dk7  r
	 d d d «       y|j                  j                  «       }| dz   }t        j                  ||«      }|r(|j                  d«      }t        |«      |k\  cd d d «       S t        d	«      ‚# 1 sw Y   y xY w)
Nz	--versionúutf-8©ÚstdoutÚstderrÚencodingr   r   Fz version RELEASE\.(\d+)-.*r   z+minio component older than the minimum year)rg   ÚPopenÚPIPEÚwaitrÝ   ÚreadÚreÚsearchÚgroupÚintÚFileNotFoundError)Ú	componentÚminimum_yearÚ	full_argsrC   rÝ   ÚpatternÚversion_matchÚversion_years           r   Ú_ensure_minio_component_versionrï   M  sÇ   € Ø˜KÐ(€IÜ	×	Ñ	˜)¬J¯O©OÜ!+§¡¸7ô
Dð ?ØGKØ�9‰9�R‹=˜AÒØ÷?ð ?ð —‘×!Ñ!Ó#ˆØÐ;Ñ;ˆÜŸ	™	 '¨6Ó2ˆÙØ(×.Ñ.¨qÓ1ˆLÜ�|Ó$¨Ñ4÷?ñ ?ô $Ø=ó?ð ?÷?ð ?ús   ºCÁACÂ8CÃCc           	      ó   — t        j                   «       }t        j                   «       |z
  dk  r	 t        | dddd|› �||«       y t	        d«      ‚# t        $ r t        j                  d«       Y nw xY wt        j                   «       |z
  dk  rŒ`ŒK)Nr   ÚaliasÚsetÚmyminiozhttp://r   z+mc command could not connect to local minio)ÚtimeÚ_run_mc_commandÚChildProcessErrorÚsleeprF   )ÚmcdirÚaddressÚ
access_keyÚ
secret_keyÚstarts        r   Ú_wait_for_minio_startuprý   ^  s‡   € Ü�I‰I‹K€EÜ
�)‰)‹+˜Ñ
 Ò
"ð	Ü˜E 7¨E°9Ø% g YÐ/°¸ZôIàô ÐAÓ
BÐBøô !ò 	Ü�J‰J�qŽMð	úô �)‰)‹+˜Ñ
 Ó
"øs   °A ÁA1Á0A1c                 óð  — dd| gt        |«      z   }t        j                  |t        j                  t        j                  d¬«      5 }|j	                  d«      }dj                  |«      }t        d|› �«       t        d|› �«       t        d	|j                  j                  «       › �«       t        d
|j                  j                  «       › �«       |dk7  rt        d«      ‚	 d d d «       y # 1 sw Y   y xY w)NÚmcz-CrÛ   rÜ   r   ú zCmd: z
  Return: z
  Stdout: z
  Stderr: r   zCould not run mc)r5   rg   rà   rá   râ   r9   ÚprintrÝ   rã   rÞ   rö   )rø   rj   rë   rC   ÚretvalÚcmd_strs         r   rõ   rõ   j  sÚ   € Ø�t˜UÐ#¤d¨4£jÑ0€IÜ	×	Ñ	˜)¬J¯O©OÜ!+§¡¸7ô
Dð 	8ØGKØ—‘˜2“ˆØ—(‘(˜9Ó%ˆÜ��g�YÐÔ Ü�
˜6˜(Ð#Ô$Ü�
˜4Ÿ;™;×+Ñ+Ó-Ð.Ð/Ô0Ü�
˜4Ÿ;™;×+Ñ+Ó-Ð.Ð/Ô0Ø�QŠ;Ü#Ð$6Ó7Ð7ð ÷	8÷ 	8ñ 	8ús   ÁBC,Ã,C5c           
      ó.  — t         j                  dk(  rt        j                  d«       	 t	        dd«       t	        dd«       | d   }| d   \  }}}}|› d|› �}	t
        j                  j                  |d«      }
t
        j                  j                  |
«      rt        j                  |
«       t        j                  |
«       t
        j                  j                  |d	«      }t        |d
¬«      5 }|j                  |«       ddd«       t        |
|	||«       t        |
dddd||«       t        |
ddddd|«       t        |
dddddd|«       t        |
ddd«       t        |
ddd«       y# 1 sw Y   ŒhxY w# t         $ r t        j                  d«       Y yw xY w)ab  
    Attempts to use the mc command to configure the minio server
    with a special user limited:limited123 which does not have
    permission to create buckets.  This mirrors some real life S3
    configurations where users are given strict permissions.

    Arrow S3 operations should still work in such a configuration
    (e.g. see ARROW-13685)
    Úwin32z*The mc command is not installed on Windowsrÿ   iå  ÚminioÚtempdirÚ
connectionú:zlimited-buckets-policy.jsonr×   )ÚmodeNÚadminÚuserÚaddzmyminio/ÚpolicyÚcreatezno-create-bucketsÚattachz--userÚmbzmyminio/existing-bucketz--ignore-existingzmyminio/no-delete-bucketz"Configuring limited s3 user failed)rd   ÚplatformÚpytestÚskiprï   rS   rW   r9   ÚexistsÚshutilÚrmtreeÚmkdirÚopenÚwriterý   rõ   rè   )Ú	s3_serverr  ÚusernameÚpasswordr  ÚhostÚportrú   rû   rù   rø   Úpolicy_pathÚpolicy_files                r   Ú_configure_s3_limited_userr"  x  s„  € ô ‡|�|�wÒô 	�‰Ð@ÔAð":ä'¨¨dÔ3Ü'¨°Ô6à˜IÑ&ˆØ-6°|Ñ-DÑ*ˆˆd�J 
Ø�F˜!˜D˜6Ð"ˆä—‘—‘˜W dÓ+ˆÜ�7‰7�>‰>˜%Ô Ü�M‰M˜%Ô Ü
�‰�ŒÜ—g‘g—l‘l 7Ð,IÓJˆÜ�+ CÔ(ð 	&¨KØ×Ñ˜fÔ%÷	&ô 	   w°
¸JÔGä˜˜w¨°Ø" H¨hô	8ä˜˜w¨°(Ø"Ð$7¸ô	Fä˜˜w¨°(Ø"Ð$7¸À8ô	Mô 	˜˜tÐ%>Ø+ô	-ô 	˜˜tÐ%?Ø+õ	-÷!	&ð 	&ûô& ò :Ü�‰Ð8Ö9ð:ús+   ªCE3 Ã.E'Ä A&E3 Å'E0Å,E3 Å3FÆFc                  ó  — d} dt         j                  v r0t         j                  j                  t         j                  d   «      } | s>t         j                  j	                  d«      }t         j                  j                  |«      } | S )zs
    This is the default location where tz.cpp will look for (until we make
    this configurable at run-time)
    FÚPYARROW_TZDATA_PATHz%USERPROFILE%\Downloads\tzdata)rS   rT   rW   r  Ú
expandvars)Útzdata_boolÚtzdata_paths     r   Úwindows_has_tzdatar(  ®  sa   € ð
 €KØ¤§
¡
Ñ*Ü—g‘g—n‘n¤R§Z¡ZÐ0EÑ%FÓGˆÙÜ—g‘g×(Ñ(Ð)JÓKˆÜ—g‘g—n‘n [Ó1ˆàÐr   c                  ó\   — t        j                  «       D ]  } | j                  d«      sŒ y y)z=
    Checks whether it's running on musl systems or not.
    Ú	musllinuxTF)r   Úplatform_tagsÚ
startswith)Úplatform_tags    r   Úrunning_on_musllinuxr.  ½  s2   € ô ×*Ñ*Ó,ò ˆØ×"Ñ" ;Õ/Ùðð r   )Úrssi   r   r   ),rË   Ú
contextlibr   r>   rS   r   rä   r  rÒ   rÏ   r6   rg   rd   rô   Ú	packagingr   r  ÚpyarrowrZ   Ú
pyarrow.fsr   Úcontextmanagerr   r%   r-   r;   rP   ra   ro   rt   ry   r}   r�   rƒ   r“   ÚFileSystemHandlerr�   rÙ   rï   rý   rõ   r"  r(  r.  r
   r   r   ú<module>r6     s=  ðñ$ó Û Û 	Û 	Û Û 	Û Û Û Û Û Û 
Û Ý ã ã Û ò"ð ×Ññ(ó ð(ò*"òJCòFð FHØ%&ó)òXò 	3ð ×Ññ*ó ð*ð ×Ññó ðð ×Ññó ðò÷ñ ô?D�7—:‘:×/Ñ/ô ?DðD ×ÑØ,1ó ó ðò$?ò"	Cò8ò3:òlór   