Ë
    ®Ó^jÝ5  ã                   óˆ  — d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZm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mZ ddlmZ dd	lmZmZ dd
lm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-  ej\                  d«      Z/eee0ef      Z1g d¢Z2 G d„ de$«      Z3edejh                  dejj                  de
ejh                  e0f   fd„«       Z6edejh                  ddde
ejh                  df   fd„«       Z6dejh                  de	ejj                     de
ejh                  e	e0   f   fd„Z6de0dz  dejh                  dejj                  dejj                  de	ejj                     de	ejj                     de
ejh                  ejj                  ejj                  e	ejj                     e	ejj                     f   fd„Z7dee   dee0ee   f   fd „Z8d!e1dee0ee   f   fd"„Z9d#e1d$e	e#   d%e	e   d&e	e   de
ee0ee   f   e	eeef      f   f
d'„Z:d#e	e1   de;fd(„Z<d)e;dejz                  fd*„Z>dAd+„Z?dd,œd-e	e   d%e	e   d.e	e   d/e@d0eAd#e	e1   d1eAd2e;d3e	eA   d4e	e%   d$e	e#   d5e	e   de&fd6„ZBd-e	e   d%e	e   d.e	e   d/e@d0eAd2e;d#e	e1   d$e	e#   d5e	e   de%fd7„ZCd8e;dede%fd9„ZDd:eEd;eAd<eEd=eeA   d>ee0   d?eAd$e	e#   de
e%ee
e%e0f      f   fd@„ZFy)Bz)Copyright 2019-2025, XGBoost contributorsé    N)ÚSequence)
ÚAnyÚCallableÚDictÚListÚOptionalÚTupleÚTypeVarÚUnionÚcastÚoverload)Ú	dataframeé   )Ú
collective)Ú
Categories)ÚFeatureNamesÚFeatureTypes)ÚconcatÚimport_cupy)ÚBoosterÚDataIterÚDMatrixÚQuantileDMatrix)Ú
is_on_cuda)Úget_model_categoriesÚpick_ref_categories)Ú	_RefErrorz[xgboost.dask])ÚlabelÚweightÚbase_marginÚqidÚlabel_lower_boundÚlabel_upper_boundc                   ó¬   ‡ — e Zd ZdZ	 	 	 ddee   dee   deee	e
f      dee   deee      ddfˆ fd	„Zd
edee   fd„Zdefd„Zdd„Zdedefd„Zˆ xZS )ÚDaskPartitionIterz.A data iterator for the `DaskQuantileDMatrix`.NÚdataÚfeature_namesÚfeature_typesÚfeature_weightsÚkwargsÚreturnc           	      óF  •— t         t        d «      f}|| _        t        D ]7  }t	        | ||j                  |d «      «       t        t        | |«      |«      rŒ7J ‚ || _        || _	        || _
        t        | j                  t         «      sJ ‚d| _        t        ‰| �5  d¬«       y )Nr   T)Úrelease_data)r   ÚtypeÚ_dataÚmetaÚsetattrÚgetÚ
isinstanceÚgetattrÚ_feature_namesÚ_feature_typesÚ_feature_weightsÚ_iterÚsuperÚ__init__)	Úselfr&   r'   r(   r)   r*   ÚtypesÚkÚ	__class__s	           €ú\/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/xgboost/dask/data.pyr:   zDaskPartitionIter.__init__4   sœ   ø€ ô œ4 ›:Ð&ˆàˆŒ
Üò 	7ˆAÜ�D˜!˜VŸZ™Z¨¨4Ó0Ô1Üœg d¨AÓ.°Õ6Ð6Ð6ð	7ð
 ,ˆÔØ+ˆÔØ /ˆÔä˜$Ÿ*™*¤hÔ/Ð/Ð/àˆŒ
Ü‰Ñ dÐÕ+ó    Úattrc                 óN   — t        | |«      �t        | |«      | j                     S y ©N)r4   r8   )r;   rA   s     r?   Ú_getzDaskPartitionIter._getM   s(   € Ü�4˜ÓÐ*Ü˜4 Ó& t§z¡zÑ2Ð2Ør@   c                 ó4   — | j                   | j                     S )z5Utility function for obtaining current batch of data.)r/   r8   ©r;   s    r?   r&   zDaskPartitionIter.dataR   s   € à�z‰z˜$Ÿ*™*Ñ%Ð%r@   c                 ó   — d| _         y)zReset the iteratorr   N)r8   rF   s    r?   ÚresetzDaskPartitionIter.resetV   s	   € àˆ�
r@   Ú
input_datac           	      ó8  — | j                   t        | j                  «      k(  ryt        D �ci c]  }|| j	                  |«      “Œ }} |d| j                  «       d| j                  | j                  | j                  dœ|¤Ž | xj                   dz  c_         yc c}w )zYield next batch of dataFN)r&   Úgroupr'   r(   r)   é   T© )	r8   Úlenr/   r0   rD   r&   r5   r6   r7   )r;   rI   r=   r*   s       r?   ÚnextzDaskPartitionIter.nextZ   s�   € à�:‰:œ˜TŸZ™Z›Ò(àä+/Ö0 a�!�T—Y‘Y˜q“\‘/Ð0ˆÐ0Ùð 	
Ø—‘“ØØ×-Ñ-Ø×-Ñ-Ø ×1Ñ1ñ	
ð ò	
ð 	�
Š
�a‰�
Øùò 1s   ¬B)NNN©r+   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r:   ÚstrrD   r&   rH   r   ÚboolrO   Ú__classcell__)r>   s   @r?   r%   r%   1   s°   ø„ Ù8ð
 15ØCGØ)-ñ,à�3‰ið,ð   Ñ-ð,ð    l°JÐ&>Ñ ?Ñ@ð	,ð
 " #™ð,ð ˜4 ™9Ñ%ð,ð 
õ,ð2˜ð  ¨#¡ó ð
&�có &óð˜xð ¨D÷ r@   r%   ÚdfÚcolr+   c                  ó   — y rC   rM   ©rX   rY   s     r?   Ú_add_columnr\   m   s   € ØORr@   c                  ó   — y rC   rM   r[   s     r?   r\   r\   q   s   € ØKNr@   c                 óÊ   — |€| |fS d}|j                   › d|› �}|| j                  v r%|dz  }|j                   › d|› �}|| j                  v rŒ% | j                  di ||i¤Ž} | |fS )Nr   Ú_rL   rM   )ÚnameÚcolumnsÚassign)rX   rY   ÚtrailsÚuids       r?   r\   r\   u   s„   € ð €{Ø�3ˆwˆà€FØ�X‰XˆJ�a˜�xÐ
 €CØ
�—‘Ñ
Ø�!‰ˆØ—‘�
˜!˜F˜8Ð$ˆð �—‘Ò
ð 
ˆ�‰Ñ	 �c˜3�ZÑ	 €BØˆsˆ7€Nr@   Údevicer!   ÚyÚsample_weightr    c                 ó®  ‡— t        ‰|«      \  Š}t        ‰|«      \  Š}t        ‰|«      \  Š}t        ‰|«      \  Š}	| �| dk(  rdnd}
t        j                  j                  d|
i«      5  ‰j	                  «       Š‰|   j                  d«      j                  j                  «       j                  j                  ‰|<   ‰j                  |¬«      Š‰j                  |«      |   j                  «       }|j                  j                  «       j                  j                  «       }t!        |«      }t#        ||d   d	z   gz   «      }‰j%                  |d
|¬«      j	                  «       Šddd«       ‰|   }‰|   }ˆfd„||	fD «       \  }}||||	fD �cg c]  }|€Œ|‘Œ	 }}‰j'                  |d	¬«      j	                  «       Š‰||||fS # 1 sw Y   ŒaxY wc c}w )zÏA function to prevent query group from being scattered to different
    workers. Please see the tutorial in the document for the implication for not having
    partition boundary based on query groups.

    NÚcpuÚp2pÚtaskszdataframe.shuffle.methodÚcategory)ÚbyéÿÿÿÿrL   F)ÚdropÚ	divisionsc              3   ó`   •K  — | ]%  }|�t        t        j                  ‰|   «      nd –— Œ' y ­wrC   )r   ÚddÚSeries)Ú.0rd   rX   s     €r?   ú	<genexpr>z!no_group_split.<locals>.<genexpr>¯   s.   øè ø€ ò "ØBE C OŒŒR�Y‰Y˜˜3™Ô ¸Ó=ñ"ùs   ƒ+.)Úaxis)r\   ÚdaskÚconfigÚsetÚpersistÚastypeÚcatÚas_knownÚcodesÚsort_valuesÚgroupbyÚcountÚindexÚcomputeÚvaluesÚtolistÚsortedÚtupleÚ	set_indexro   )re   rX   r!   rf   rg   r    Úqid_uidÚy_uidÚw_uidÚbm_uidÚshuffleÚcntÚdivrd   Úuidss    `             r?   Úno_group_splitr‘   …   sØ  ø€ ô  ˜b #Ó&�K€BˆÜ˜B Ó"�I€BˆÜ˜B Ó.�I€BˆÜ˜R Ó-�J€Bˆð �~¨°5ª‰e¸g€GÜ	�‰�‰Ð4°gÐ>Ó	?ñ Ø�Z‰Z‹\ˆà˜‘k×(Ñ(¨Ó4×8Ñ8×AÑAÓC×GÑG×MÑMˆˆ7‰à�^‰^˜wˆ^Ó'ˆØ�j‰j˜Ó! 'Ñ*×0Ñ0Ó2ˆØ�i‰i×ÑÓ!×(Ñ(×/Ñ/Ó1ˆÜ�S‹kˆÜ�C˜3˜r™7 Q™;˜-Ñ'Ó(ˆà�\‰\ØØØð ó 
÷ ‰'‹)ð	 	÷ð" ˆW‰+€CØ
ˆ5‰	€Aó"ØJOÐQWÈô"Ñ€M�;ð $ U¨E°6Ð:ÖN�C¸c¹oŠCÐN€DÐNØ	�‰�˜AˆÓ	×	&Ñ	&Ó	(€BØˆs�A�} kÐ1Ð1÷3ð üò. Os   Á*C<GÆGÆGÇGr*   c                  ó¢  ‡ ‡‡— ‰ j                  d«      }|€J ‚t        |«      }t        |d   «      rddlmŠ nddlmŠ dt        dt        t        t        f   fˆ fd„Šdt        dt        j                  fˆˆfd„}t        |«      D �cg c]
  } ||«      ‘Œ }}t        |«      }|j                  j                  r‰ S t        j!                  d	t#        j$                  «       |«       t        |«      }t        |«      r&t'        «       }|j)                  |j                  «      }	nt+        j(                  |j                  «      }	|j,                  |	dd…f   }t/        |d
«      r|j,                  |	dd…f   }n	||	dd…f   }‰ j1                  d|gi«       t3        |j4                  «      D ]"  \  }}
|
‰ v sJ ‚‰ j1                  |
||
   gi«       Œ$ ‰ S c c}w )z>Sort worker-local data by query ID for learning to rank tasks.r&   Nr   )Ú	DataFrameÚir+   c           
      ó  •‡ — dt         t        t              dt         t           fˆ fd„}t        D �ci c]  }| |‰j                  |d«      «      “Œ }}|j                  «       D ��ci c]  \  }}|€Œ	||“Œ }}}|S c c}w c c}}w )zDReturn a dictionary containing all the meta info and all partitions.rA   r+   c                 ó   •— | �| ‰   S y rC   rM   )rA   r”   s    €r?   rD   z0sort_data_by_qid.<locals>.get_dict.<locals>._getÆ   s   ø€ ØÐØ˜A‘w�Ør@   N)r   r   r   Úlistr0   r2   Úitems)r”   rD   r`   Údata_optr=   Úvr&   r*   s   `      €r?   Úget_dictz"sort_data_by_qid.<locals>.get_dictÃ   sƒ   ù€ ð	”x¤¤S¡	Ñ*ð 	¬x¼©~õ 	ô
 DHÖH¸4�D™$˜vŸz™z¨$°Ó5Ó6Ñ6ÐHˆÐHà!)§¡Ó!1×C™˜˜A°Q±]��1‘ÐCˆÑCØˆùò IùãCs   ² A<Á'
BÁ2Bc                 ó$   •—  ‰| «      } ‰|«      S rC   rM   )r”   r&   r“   r›   s     €€r?   Úmap_fnz sort_data_by_qid.<locals>.map_fnÐ   s   ø€ Ù˜‹{ˆÙ˜‹Ðr@   a  [r%d]: Sorting data with %d partitions for ranking. This is a costly operation and will increase the memory usage significantly. To avoid this warning, sort the data based on qid before passing it into XGBoost. Alternatively, you can use set the `allow_group_split` to False.Úiloc)r2   rN   r   Úcudfr“   ÚpandasÚintr   rU   r—   ÚpdÚranger   r!   Úis_monotonic_increasingÚLOGGERÚwarningÚcollÚget_rankr   ÚargsortÚnprž   ÚhasattrÚupdateÚ	enumeratera   )r*   Ú
data_partsÚn_partsr�   r”   Ú
meta_partsÚdfqÚdfxÚcpÚ
sorted_idxÚcr“   r›   s   `          @@r?   Úsort_data_by_qidr¶   ¸   sš  ú€ à—‘˜FÓ#€JØÐ!Ð!Ð!Ü�*‹o€Gä�*˜Q‘-Ô Þ"å$ð”Cð œD¤¤d ™Oõ ð”#ð œ"Ÿ,™,ö ô &+¨7£^Ö4 ‘&˜•)Ð4€JÐ4Ü
�Ó
€CØ
‡w�w×&Ò&Øˆä
‡N�Nð	Tô 	�‰‹Øôô" �Ó
€Cä�#„Ü‹]ˆØ—Z‘Z §¡Ó(‰
ä—Z‘Z §¡Ó(ˆ
Ø
�(‰(�:šq�=Ñ
!€Cäˆs�FÔØ�h‰h�z¢1�}Ñ%‰à�*ša�-Ñ ˆà
‡M�M�6˜C˜5�/Ô"Ü˜#Ÿ+™+Ó&ò %‰ˆˆ1Ø�F‰{Ðˆ{Ø�‰�q˜3˜q™6˜(�mÕ$ð%ð €MùòS 5s   ÂGÚlist_of_partsc                 óú   ‡ ‡— t        ‰ t        «      sJ ‚i Šdt        dt        ddfˆ ˆfd„}t	        ‰ «      D ]"  \  }} ||d«       t
        D ]  } |||«       Œ Œ$ ‰j                  dd«      }|�t        di ‰¤ŽŠ‰S )	z8Convert list of dictionaries into a dictionary of lists.r”   r`   r+   Nc                 ój   •— |‰|    v r	‰|    |   }nd }|�|‰vrg ‰|<   ‰|   j                  |«       y y rC   )Úappend)r”   r`   Úpartr·   Úresults      €€r?   rº   z!_get_worker_parts.<locals>.append  sR   ø€ Ø�= Ñ#Ñ#Ø  Ñ# DÑ)‰DàˆDØÐØ˜6Ñ!Ø!��t‘Ø�4‰L×Ñ Õ%ð r@   r&   r!   rM   )r3   r—   r¡   rU   r­   r0   r2   r¶   )r·   rº   r”   r_   r=   r!   r¼   s   `     @r?   Ú_get_worker_partsr½      s—   ù€ ä�m¤TÔ*Ð*Ð*Ø#%€Fð&”#ð &œSð & Tö &ô ˜-Ó(ò ‰ˆˆ1Ùˆq�&ÔÜò 	ˆAÙ�1�a�Lñ	ðð
 �*‰*�U˜DÓ
!€CØ
€Ü!Ñ+ FÑ+ˆØ€Mr@   ÚpartsÚmodelr(   Úxy_catsc                 ój   — t        | «      }|d   d   }t        |||«      \  }}t        |||«      }||fS )Nr&   r   )r½   r   r   )r¾   r¿   r(   rÀ   Úunzipped_dictÚXr_   Ú
model_catss           r?   Ú_extract_datarÅ     sH   € ô & eÓ,€MØ�fÑ˜aÑ €AÜ(¨¨E°=ÓA�M€A€zÜ$ Q¨
°GÓ<€JØ˜*Ð$Ð$r@   c                 ó  — | �t        | d   j                  d«      «      }nd}t        t        j                  t        j                  |gt
        j                  ¬«      t        j                  j                  «      d   «      }|S )Nr   r&   F)Údtype)
r   r2   rV   r§   Ú	allreducerª   ÚarrayÚint32ÚOpÚMAX)r¾   Úis_cudas     r?   Ú_get_is_cudarÎ   '  s]   € ØÐÜ˜U 1™XŸ\™\¨&Ó1Ó2‰àˆä”4—>‘>¤"§(¡(¨G¨9¼B¿H¹HÔ"EÄtÇwÁwÇ{Á{ÓSÐTUÑVÓW€GØ€Nr@   rÍ   c                 ón   — | rt        «       }|j                  d«      }|S t        j                  d«      }|S )N)r   r   )r   Úemptyrª   )rÍ   r³   rÐ   s      r?   Ú_make_emptyrÑ   1  s6   € ÙÜ‹]ˆØ—‘˜Ó ˆð €Lô —‘˜Ó ˆØ€Lr@   c                  ól   — t        j                  «       } t        j                  d| j                  «       y )NzWorker %s has an empty DMatrix.)ÚdistributedÚ
get_workerr¥   r¦   Úaddress)Úworkers    r?   Ú_warn_emptyr×   :  s#   € Ü×#Ñ#Ó%€FÜ
‡N�NÐ4°f·n±nÕEr@   )Úrefr'   r)   ÚmissingÚnthreadÚmax_binÚenable_categoricalÚmax_quantile_batchesrØ   ÚXy_catsc           
      óÊ   — t        |«      }|€%t        «        t        t        |«      | |||	||¬«      S t	        ||
||«      \  }}t        t        di |¤|| |dœ¤Ž||||	||¬«      S )N)r'   r(   rÛ   rØ   rÜ   rÝ   )r(   r'   r)   )rÙ   rÚ   rÛ   rØ   rÜ   rÝ   rM   )rÎ   r×   r   rÑ   rÅ   r%   )r'   r(   r)   rÙ   rÚ   r¾   rÛ   rÜ   rÝ   rØ   r¿   rÞ   rÍ   rÂ   rÄ   s                  r?   Ú_create_quantile_dmatrixrà   ?  s•   € ô ˜5Ó!€GØ€}ÜŒÜÜ˜Ó Ø'Ø'ØØØ1Ø!5ô
ð 	
ô !.¨e°U¸MÈ7Ó SÑ€M�:äÜñ 	
Øð	
à$Ø'Ø+ó		
ð ØØØØ-Ø1ôð r@   c        	         óH  — t        |«      }	|€"t        «        t        t        |	«      | ||¬«      S t	        d«      }
dt
        t        |
      dt        |
   fd„}t        ||||«      \  }}i }|j                  «       D ]  \  }} ||«      }|||<   Œ t        di |¤|| ||||dœ¤ŽS )zdGet data that local to worker from DaskDMatrix.

    Returns
    -------
    A DMatrix object.

    )r'   r(   rÜ   ÚTr&   r+   c                 ó>   — t        d„ | D «       «      ry t        | «      S )Nc              3   ó$   K  — | ]  }|d u –— Œ
 y ­wrC   rM   )rt   r»   s     r?   ru   z:_create_dmatrix.<locals>.concat_or_none.<locals>.<genexpr>�  s   è ø€ Ò- ˆt�tŒ|Ñ-ùs   ‚)Úanyr   )r&   s    r?   Úconcat_or_nonez'_create_dmatrix.<locals>.concat_or_noneŒ  s   € ÜÑ-¨Ô-Ô-ØÜ�d‹|Ðr@   )rÙ   r'   r(   rÚ   rÜ   r)   rM   )	rÎ   r×   r   rÑ   r
   r   r   rÅ   r˜   )r'   r(   r)   rÙ   rÚ   rÜ   r¾   r¿   rÞ   rÍ   râ   ræ   rÂ   rÄ   Úconcated_dictÚkeyÚvaluerš   s                     r?   Ú_create_dmatrixrê   m  sÛ   € ô& ˜5Ó!€GØ€}ÜŒÜÜ˜Ó Ø'Ø'Ø1ô	
ð 	
ô 	�‹€AðœX¤h¨q¡kÑ2ð ´xÀ±{ó ô
 !.¨e°U¸MÈ7Ó SÑ€M�:à$&€MØ#×)Ñ)Ó+ò ‰
ˆˆUÙ˜5Ó!ˆØˆ�cÒðô ñ Ø
ðàØ#Ø ØØ-Ø'óð r@   Úis_quantilec                 ó2   — | rt        di |¤ŽS t        di |¤ŽS )NrM   )rà   rê   )rë   r*   s     r?   Ú_dmatrix_from_list_of_partsrí   £  s!   € ÙÜ'Ñ1¨&Ñ1Ð1ÜÑ$˜VÑ$Ð$r@   Ú	train_refÚtrain_idÚrefsÚevals_idÚ
evals_nameÚ	n_threadsc          
      ó€  — t        di | ¤||d dœ¤Ž}g }|j                  «       }	t        |«      D ]Š  \  }
}||
   |k(  r|j                  |||
   f«       Œ%|j	                  dd «      �-|d   |k7  rt        t        «      ‚|d= t        di |¤|||	|dœ¤Ž}nt        di |¤||	|dœ¤Ž}|j                  |||
   f«       ŒŒ ||fS )N)rÚ   r¿   rÞ   rØ   )rÚ   rØ   rÞ   r¿   )rÚ   rÞ   r¿   rM   )rí   Úget_categoriesr­   rº   r2   Ú
ValueErrorr   )rî   rï   rñ   rò   ró   r¿   rð   ÚXyÚevalsrÞ   r”   rØ   Úeval_xys                r?   Ú_get_dmatricesrú   ©  s  € ô 
%ñ 
Ø
ð
Ø&¨e¸Tó
€Bð
 (*€EØ×ÑÓ!€Gä˜D“/ò /‰ˆˆ3à�A‰;˜(Ò"Ø�L‰L˜"˜j¨™mÐ,Ô-Øà�7‰7�5˜$ÓÐ+Ø�5‰z˜XÒ%Ü ¤Ó+Ð+Ø�E�
Ü1ñ ØðØ(¨b¸'Èó‰Gô 2ñ ØðØ(°'ÀóˆGð 	�‰�g˜z¨!™}Ð-Õ.ð#/ð$ ˆuˆ9Ðr@   rP   )GrT   ÚloggingÚcollections.abcr   Útypingr   r   r   r   r   r	   r
   r   r   r   rw   rÓ   Únumpyrª   r    r¢   r   rr   Ú r   r§   Ú_data_utilsr   Ú_typingr   r   Úcompatr   r   Úcorer   r   r   r   r&   r   Úsklearnr   r   Útrainingr   Ú	getLoggerr¥   rU   Ú
_DataPartsr0   r%   r“   rs   r\   r‘   r¶   r½   rÅ   rV   rÎ   ÚndarrayrÑ   r×   Úfloatr¡   rà   rê   rí   Údictrú   rM   r@   r?   ú<module>r     sj  ðá /ã Ý $÷÷ ÷ ó Û Û Û Ý  å !Ý $ß 0ß (ß >Ó >Ý ß ?Ý  à	ˆ×	Ñ	Ð+Ó	,€à�$�s˜C�x‘.Ñ!€
ò€ô9˜ô 9ðx 
Ø R�B—L‘LÐ R r§y¡yÐ R°U¸2¿<¹<ÈÐ;LÑ5MÒ Ró 
Ø Rð 
Ø N�B—L‘LÐ N tÐ N°°b·l±lÀDÐ6HÑ0IÒ Nó 
Ø NðØ
�‰ðØ# B§I¡IÑ.ðà
ˆ2�<‰<˜ #™Ð&Ñ'óð 02Ø�$‰Jð02à
�‰ð02ð 
�‰ð02ð 
‡y�yð	02ð
 ˜BŸI™IÑ&ð02ð ˜"Ÿ)™)Ñ$ð02ð Ø‡L�L�"—)‘)˜RŸY™Y¨°·±Ñ(;¸XÀbÇiÁiÑ=PÐPñó02ðfE˜t C™yð E¨T°#°t¸C±y°.Ñ-Aó EðP Zð °D¸¸dÀ3¹i¸Ñ4Hó ð4
%Øð
%à�GÑð
%ð ˜LÑ)ð
%ð �jÑ!ð	
%ð
 ˆ4��T˜#‘Y�Ñ ¨%°¸jÐ0HÑ*IÑ!JÐJÑKó
%ð˜ Ñ,ð °ó ð˜ð  "§*¡*ó óFð  "ò+à˜LÑ)ð+ð ˜LÑ)ð+ð ˜c‘]ð	+ð
 ð+ð ð+ð �JÑð+ð ð+ð ð+ð # 3™-ð+ð 
�'Ñ	ð+ð �GÑð+ð �jÑ!ð+ð ó+ð\3à˜LÑ)ð3ð ˜LÑ)ð3ð ˜c‘]ð	3ð
 ð3ð ð3ð ð3ð �JÑð3ð �GÑð3ð �jÑ!ð3ð ó3ðl%¨Tð %¸Sð %ÀWó %ð$Øð$àð$ð ð$ð �s‰mð	$ð
 ˜‘ð$ð ð$ð �GÑð$ð ˆ7�D˜˜w¨˜|Ñ,Ñ-Ð-Ñ.ô$r@   