§
    Ç»©ja+  ã                  ó  — d Z ddlm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 ddlmZmZmZ dd	lm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m Z m!Z!m"Z"m#Z#m$Z$m%Z% dZ&dZ'dZ(dZ)d%d„Z*d&d„Z+d'd(d„Z,d)d„Z-e)ddfd*d$„Z.dS )+zIOrchestrate read-only GGPK extraction into assets/game_data/poe2_ggpk.db.é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚPathé   )Údecompress_bundleÚparse_bundle_header)Úload_schemaÚparse_datc64Úpoe2_table_schema)ÚGgpkFs)Úparse_hashcache)Údecompress_index_blob)Úoodle_backend)Úfind_hashcacheÚfind_oodle_dll)ÚconnectÚinit_catalog_schemaÚinsert_ggpk_filesÚinsert_hashcacheÚinsert_logical_filesÚupsert_metaÚwrite_dat_tableÚwrite_projectionszShttps://github.com/poe-tool-dev/dat-schema/releases/download/latest/schema.min.jsonz0.5.5zForbidden Rites)ÚBaseItemTypesÚItemClassesÚ
WorldAreasÚModsÚStatsÚTagsÚMonsterVarietiesÚDefaultMonsterStatsÚ	SkillGemsÚActiveSkillsÚQuestÚQuestStatesÚWordsÚUniqueStashLayoutÚArmourTypesÚWeaponTypesÚCurrencyItemsÚNPCsÚ	SoulCoresÚSoulCoreStatsÚSoulCoreTypesÚSoulCoreLimitsÚEndgameMapTabletsÚGoldConstantsÚreturnr   c                 ód   — t          t          ¦  «                             ¦   «         j        d         S )Né   )r   Ú__file__ÚresolveÚparents© ó    ú@C:\Projects\AutoPOE2\src\assistant_tool\ggpk_extract\pipeline.pyÚ	repo_rootr<   =   s"   € Ý•‰>Œ>×!Ò!Ñ#Ô#Ô+¨AÔ.Ð.r:   Úschema_pathc                óî   — | j                              dd¬¦  «         |                      ¦   «         r|                      ¦   «         j        dk    r| S t
          j                             t          | ¦  «         | S )NT)r8   Úexist_okéè  )	ÚparentÚmkdirÚis_fileÚstatÚst_sizeÚurllibÚrequestÚurlretrieveÚ
SCHEMA_URL)r=   s    r;   Úensure_schemarJ   A   so   € ØÔ×Ò T°DÐÑ9Ô9Ð9Ø×ÒÑÔð  ×!1Ò!1Ñ!3Ô!3Ô!;¸dÒ!BÐ!BØÐÝ
„N×Ò�z¨;Ñ7Ô7Ð7ØÐr:   Úbundle_nameÚstrc                ó$  ‡‡— |                      dd¦  «                             d¦  «        }d„ | D ¦   «         Šdˆˆfd„}|g}|                     d¦  «        d         }||vr|                     |¦  «         d}d	}t	          ¦   «         }	|D ]C}
|D ]>}|D ]9}|› |
› |› �}||	v rŒ|	                     |¦  «          ||¦  «        }|�|c c c S Œ:Œ?ŒD|                     ¦   «         }||› d�|› d�h}‰                     ¦   «         D ]Ž\  }}|j        dk    rŒ|j	                             ¦   «         |v r|c S |                      dd¦  «                             ¦   «         }| 
                    d|› d�¦  «        s| 
                    d|› d�¦  «        r|c S Œ�d
S )zéMap an index bundle name (e.g. ``data``) onto a GGPK FILE record.

    PoE2 stores the dat bundle as ``Bundles2/Folders/data.dat.bundle.bin``.
    Hashed bundles may sit deeper than the catalog walk; ``fs.find`` is the fallback.
    ú\ú/c                óF   — i | ]}|j                              d d¦  «        |“ŒS )rN   rO   ©ÚpathÚreplace©Ú.0Úes     r;   ú
<dictcomp>z%find_bundle_entry.<locals>.<dictcomp>P   s*   € Ð=Ð=Ð=°ˆqŒv�~Š~˜d CÑ(Ô(¨!Ð=Ð=Ð=r:   rR   rL   c                ó  •— |                       dd¦  «                              dd¦  «                             d¦  «        } ‰                     | ¦  «        }|�|j        dk    r|S ‰�&‰                     | d¬¦  «        }|�|j        dk    r|S d S )NrN   rO   z//ÚFILEé   ©Ú	max_depth)rS   ÚlstripÚgetÚtagÚfind)rR   ÚentÚfoundÚby_pathÚfss      €€r;   Ú_tryzfind_bundle_entry.<locals>._tryR   s‘   ø€ Ø�|Š|˜D #Ñ&Ô&×.Ò.¨t°SÑ9Ô9×@Ò@ÀÑEÔEˆØ�kŠk˜$ÑÔˆØˆ?˜sœw¨&Ò0Ð0ØˆJØˆ>Ø—G’G˜D¨A�GÑ.Ô.ˆEØÐ  U¤Y°&Ò%8Ð%8Ø�Øˆtr:   éÿÿÿÿ)Ú z	Bundles2/zBundles2/Folders/)rg   ú.bundle.binú.dat.bundle.binNrh   ri   rY   )rR   rL   )rS   r]   ÚsplitÚappendÚsetÚaddÚlowerÚitemsr_   ÚnameÚendswith)ÚentriesrK   rd   Úwantre   ÚbasesÚleafÚprefixesÚsuffixesÚseenÚbaseÚprefixÚsuffixÚkeyra   Úleaf_lÚwanted_namesrR   Úplrc   s     `                @r;   Úfind_bundle_entryr€   I   s$  øø€ ð ×Ò˜t SÑ)Ô)×0Ò0°Ñ5Ô5€DØ=Ð=°WÐ=Ñ=Ô=€Gð	ð 	ð 	ð 	ð 	ð 	ð 	ð ˆF€EØ�:Š:�c‰?Œ?˜2Ô€DØ�5ÐÐØ�Š�TÑÔÐØ5€HØ5€HÝ‘U”U€DØð 	ð 	ˆØð 	ð 	ˆFØ"ð ð �ØÐ/ Ð/ vÐ/Ð/�Ø˜$�;�;ØØ—’˜‘”�Ø�d˜3‘i”i�Ø�?Ø�J�J�J�J�J�J�Jð #ðð	ð �ZŠZ‰\Œ\€FØ˜vÐ2Ð2Ð2°vÐ4NÐ4NÐ4NÐO€LØ—]’]‘_”_ð ð ‰	ˆˆcØŒ7�fÒÐØØŒ8�>Š>ÑÔ˜|Ð+Ð+ØˆJˆJˆJØ�\Š\˜$ Ñ$Ô$×*Ò*Ñ,Ô,ˆØ�;Š;Ð.˜6Ð.Ð.Ð.Ñ/Ô/ð 	°2·;²;Ð?ZÀ6Ð?ZÐ?ZÐ?ZÑ3[Ô3[ð 	ØˆJˆJˆJð	àˆ4r:   Útablesútuple[str, ...]c                óÜ  ‡
— d„ |D ¦   «         }i Š
| D ]Í}|j                              dd¦  «                             ¦   «         }|                     d¦  «        d         }|                     d¦  «        sŒ`|dt          d¦  «         …         }||vrŒ}|d|› d�k    rdnd	|v rd
nd}|t          |¦  «        |f}‰
                     |¦  «        }	|	�||	d         k     r||f‰
|<   ŒÎˆ
fd„|D ¦   «         S )zNOne .datc64 per table: prefer ``data/<name>.datc64`` over localisation copies.c                ó6   — h | ]}|                      ¦   «         ’ŒS r9   ©rn   )rU   Úts     r;   ú	<setcomp>z-select_canonical_dat_files.<locals>.<setcomp>}   s    € Ð(Ð(Ð(˜Aˆa�gŠg‰iŒiÐ(Ð(Ð(r:   rN   rO   rf   ú.datc64Nzdata/r   z/data/r   é   c                ó|   •— g | ]8}|                      ¦   «         ‰v ¯‰|                      ¦   «                  d          ‘Œ9S )r   r…   )rU   r†   Úbests     €r;   ú
<listcomp>z.select_canonical_dat_files.<locals>.<listcomp>Œ   s<   ø€ ÐDÐDÐD 1°!·'²'±)´)¸tÐ2CÐ2CˆD�—’‘”ŒO˜AÔÐ2CÐ2CÐ2Cr:   )rR   rS   rn   rj   rq   Úlenr^   )Úlogicalr�   ÚwantedÚlfrR   rp   ÚstemÚexactÚscoreÚprevr‹   s             @r;   Úselect_canonical_dat_filesr•   {   s$  ø€ à(Ð( Ð(Ñ(Ô(€FØ€DØð %ð %ˆØŒw�Š˜t SÑ)Ô)×/Ò/Ñ1Ô1ˆØ�zŠz˜#‰Œ˜rÔ"ˆØ�}Š}˜YÑ'Ô'ð 	ØØÐ%•s˜9‘~”~�oÐ%Ô&ˆØ�vÐÐØØÐ2 TÐ2Ð2Ð2Ò2Ð2��¸hÈ$Ð>NÐ>N¸¸ÐTUˆØ�˜D™	œ	 4Ð(ˆØ�xŠx˜‰~Œ~ˆØˆ<˜5 4¨¤7š?˜?Ø ˜ˆD�‰JøØDÐDÐDÐD¨ÐDÑDÔDÐDr:   FÚ	ggpk_pathÚdb_pathÚcatalog_onlyÚboolÚdictc                óè  ‡!— |€d„ }t          | ¦  «        t          |¦  «        ddœ}|                      ¦   «         }t          |¦  «        }	 t          |¦  «         t	          |t          j        t          j        ¦  «         	                    ¦   «         t          | ¦  «        |j
        t          |j        ¦  «        ddt          t          dœ¦  «         t          | ¦  «        5 }	t!          |	                     d¬¦  «        ¦  «        }
t%          ||
¦  «        } |d	|› d
�¦  «         ||d<   t'          | ¦  «        }|rOt)          |¦  «        }t+          ||¦  «          |dt-          |¦  «        › d|› �¦  «         t-          |¦  «        |d<   t/          d„ |
D ¦   «         d ¦  «        }t/          d„ |
D ¦   «         d ¦  «        }|                     ¦   «         r¬|                     ¦   «         j
        dk    r�	 t3          |¦  «        }t	          ||                     d¦  «        |                     d¦  «        t-          |                     d¦  «        pg ¦  «        dœ¦  «         n"# t6          t8          t:          j        f$ r Y nw xY w|rPt?          |	                      |d¦  «        ¦  «        }t	          ||j!        |j"        |j#        dœ¦  «         |j!        |d<   |r@t?          |	                      |d¦  «        ¦  «        }t	          ||j!        |j"        dœ¦  «         | $                    ¦   «          |rMt	          |ddi¦  «         | $                    ¦   «          d|d<   |cd d d ¦  «         | %                    ¦   «          S tM          ¦   «         €Rt	          |ddi¦  «         | $                    ¦   «          d|d<   d |d!<   |cd d d ¦  «         | %                    ¦   «          S |€tO          d"¦  «        ‚ |d#¦  «         tQ          |	 )                    |¦  «        ¦  «        \  }}tU          ||¦  «        }tW          ||¦  «         t	          |tY          ¦   «         t-          |¦  «        t-          |¦  «        t-          |¦  «        d$œ¦  «          |d%t-          |¦  «        › d&t-          |¦  «        › d'�¦  «          |d(t-          |¦  «        › d)t-          |¦  «        › d*�¦  «         t-          |¦  «        |d+<   t3          t[          |¦  «        ¦  «        }|s"d,„ |D ¦   «         d d-…         } |d.|› �¦  «         i }d/}|D �]«}t]          |j/        ¦  «        j0        Š!t/          ˆ!fd0„|D ¦   «         ‰!¦  «        }tc          ||¦  «        }|€ |d1|j/        › d2�¦  «         Œ_te          |
|j3        |	¦  «        }|€ |d1|j/        › d3|j3        ›d4�¦  «         Œ”|                     |j/        ¦  «        }|€I |d5|j/        › d6|j4        d7›d8�¦  «         tk          |	 )                    |¦  «        ¦  «        }|||j/        <   ||j6        |j6        |j7        z   …         }	 tq          ||¦  «        }n;# t8          tr          tt          j;        f$ r}  |d1|› d9| › �¦  «         Y d } ~ �ŒZd } ~ ww xY wty          |||¦  «         | $                    ¦   «           |d:|› d9t-          |¦  «        › d;�¦  «         |d<z  }�Œ­t{          |¦  «         t	          ||d=d>œ¦  «         | $                    ¦   «          ||d?<   d=|d<   |cd d d ¦  «         | %                    ¦   «          S # 1 swxY w Y   	 | %                    ¦   «          d S # | %                    ¦   «          w xY w)@Nc                 ó   — t          | ddiŽS )NÚflushT)Úprint)ÚaÚ_ks     r;   ú<lambda>zextract.<locals>.<lambda>˜   s   € �u aÐ4¨tÐ4Ð4€ r:   Úcatalog)ÚggpkÚdbÚstatusÚpendingzggpk-bundles2-datc64)Úextracted_atr–   Ú	ggpk_sizeÚ
ggpk_mtimer   ÚprotocolÚclient_patchÚclient_leaguer‰   r[   z
[catalog] z GGPK recordsÚggpk_recordsz[hashcache] z files from Úhashcache_recordsc              3  óX   K  — | ]%}|j                              d d¦  «        dk    ¯!|V — Œ&dS )rN   rO   zBundles2/_.index.binNrQ   rT   s     r;   ú	<genexpr>zextract.<locals>.<genexpr>¸   s=   è è € ÐhÐh A°A´F·N²NÀ4ÈÑ4MÔ4MÐQgÒ4gÐ4g˜aÐ4gÐ4gÐ4gÐ4gÐhÐhr:   c              3  óX   K  — | ]%}|j                              d d¦  «        dk    ¯!|V — Œ&dS )rN   rO   z$Bundles2/Folders/data.dat.bundle.binNrQ   rT   s     r;   r°   zextract.<locals>.<genexpr>º   s=   è è € ÐkÐk�q q¤v§~¢~°d¸CÑ'@Ô'@ÐDjÒ'jÐ'j�Ð'jÐ'jÐ'jÐ'jÐkÐkr:   r@   ÚversionÚ	createdAtr�   )Úschema_versionÚschema_created_atÚschema_tablesi  )Úindex_uncompressedÚindex_blocksÚindex_encoderr·   )Údata_bundle_uncompressedÚdata_bundle_blocksr   zskipped-catalog-onlyzcatalog-onlyr¥   Úmissingzcatalog-no-oodlezOodle DLL missingÚerrorz0Bundles2/_.index.bin missing inside Content.ggpkz0[index] decompressing _.index.bin (Leviathan)...)r   Úlogical_filesÚbundlesÚdatc64_selectedz[index] z
 bundles, z logical filesz[dat] selected z / z canonical tablesr¾   c                óœ   — g | ]I}|j                              d d¦  «                             ¦   «                              d¦  «        ¯B|j         ‘ŒJS )rN   rO   rˆ   )rR   rS   rn   rq   )rU   Úfs     r;   rŒ   zextract.<locals>.<listcomp>  sZ   € ð ð ð àØ”v—~’~ d¨CÑ0Ô0×6Ò6Ñ8Ô8×AÒAÀ)ÑLÔLðØ”Fðð ð r:   é   z$[dat] no table match; datc64 sample=r   c              3  óp   •K  — | ]0}|                      ¦   «         ‰                      ¦   «         k    ¯,|V — Œ1d S ©Nr…   )rU   r†   Ú
table_names     €r;   r°   zextract.<locals>.<genexpr>  sA   øè è € ÐSÐS A°1·7²7±9´9À
×@PÒ@PÑ@RÔ@RÒ3RÐ3R˜aÐ3RÐ3RÐ3RÐ3RÐSÐSr:   z[dat] skip z: no schemaz	: bundle z not in GGPKz[bundle] decompress z (ú,z B)...z: z[dat] z rowsr   Úcomplete)Ú
dat_tablesr¥   rÉ   )>rL   rD   r   r   r   r   Únowr   ÚutcÚ	isoformatrE   ÚintÚst_mtimeÚCLIENT_PATCHÚCLIENT_LEAGUEr   ÚlistÚwalkr   r   r   r   r�   ÚnextrC   r
   r^   ÚOSErrorÚ
ValueErrorÚjsonÚJSONDecodeErrorr	   Úread_payload_prefixÚuncompressed_sizeÚblock_countÚencoderÚcommitÚcloser   ÚFileNotFoundErrorr   Úread_payloadr•   r   r   rJ   r   rR   r‘   r   r€   rK   Ú	data_sizer   ÚoffsetÚsizer   ÚOverflowErrorÚstructr½   r   r   )"r–   r—   r=   r�   r˜   ÚlogÚstatsÚstÚconnrd   rr   Ún_filesÚhcÚrecsÚ	index_entÚdata_entÚschÚhdrr¿   rŽ   ÚselectedÚschemaÚsampleÚbundle_cacheÚ	extractedr�   ÚcanonÚspecÚentryÚ
raw_bundleÚslice_bytesÚrowsÚexcrÆ   s"                                    @r;   Úextractrü   �   sÅ  ø€ ð €{Ø4Ð4ˆÝ˜y™>œ>µ°W±´ÈÐSÐS€EØ	�ŠÑ	Ô	€BÝ�7ÑÔ€DðSÝ˜DÑ!Ô!Ð!ÝØå (¤­X¬\Ñ :Ô :× DÒ DÑ FÔ FÝ  ™^œ^ØœZÝ! "¤+Ñ.Ô.Ø!*Ø2Ý ,Ý!.ð	ð 	ñ	
ô 	
ð 	
õ �IÑÔð B	 "Ý˜2Ÿ7š7¨Q˜7Ñ/Ô/Ñ0Ô0ˆGÝ'¨¨gÑ6Ô6ˆGØˆCÐ3˜WÐ3Ð3Ð3Ñ4Ô4Ð4Ø$+ˆE�.Ñ!å 	Ñ*Ô*ˆBØð 7Ý& rÑ*Ô*�Ý   tÑ,Ô,Ð,Ø�Ð>¥3 t¡9¤9Ð>Ð>¸"Ð>Ð>Ñ?Ô?Ð?Ý-0°©Y¬Y�Ð)Ñ*åÐhÐh¨ÐhÑhÔhÐjnÑoÔoˆIÝØkÐk˜GÐkÑkÔkØñô ˆHð ×"Ò"Ñ$Ô$ð ¨×)9Ò)9Ñ);Ô);Ô)CÀdÒ)JÐ)JðÝ% kÑ2Ô2�CÝØà.1¯gªg°iÑ.@Ô.@Ø14·²¸Ñ1EÔ1EÝ-0°·²¸Ñ1BÔ1BÐ1HÀbÑ-IÔ-Iðð ñô ð ð øõ  ¥­TÔ-AÐBð ð ð Ø�Dðøøøð ð 
DÝ)¨"×*@Ò*@ÀÈIÑ*VÔ*VÑWÔW�ÝØà.1Ô.CØ(+¬Ø),¬ðð ñô ð ð /2Ô.C�Ð*Ñ+Øð Ý)¨"×*@Ò*@ÀÈ9Ñ*UÔ*UÑVÔV�ÝØà47Ô4IØ.1¬oðð ñô ð ð �KŠK‰MŒMˆMØð Ý˜D ?Ð4JÐ"KÑLÔLÐLØ—’‘”�Ø"0��h‘ØðuB	ð B	ð B	ð B	ñ B	ô B	ð B	ðH 	�
Š
‰ŒˆˆõQ ÑÔÐ'Ý˜D ?°IÐ">Ñ?Ô?Ð?Ø—’‘”�Ø"4��h‘Ø!4��g‘ØðCB	ð B	ð B	ð B	ñ B	ô B	ð B	ðH 	�
Š
‰ŒˆˆðC Ð Ý'Ð(ZÑ[Ô[Ð[àˆCÐBÑCÔCÐCÝ4°R·_²_ÀYÑ5OÔ5OÑPÔPÑˆG�WÝ1°'¸6ÑBÔBˆHÝ   xÑ0Ô0Ð0ÝØå%2¡_¤_Ý%(¨¡\¤\Ý" 7™|œ|Ý'*¨8¡}¤}ð	ð ñô ð ð ˆCÐO�3˜w™<œ<ÐOÐOµ3°w±<´<ÐOÐOÐOÑPÔPÐPØˆCÐR¥# h¡-¤-ÐRÐRµC¸±K´KÐRÐRÐRÑSÔSÐSÝ%(¨¡\¤\ˆE�/Ñ"å ¥¨{Ñ!;Ô!;Ñ<Ô<ˆFØð Eðð à$ðñ ô ð �2�#ô	�ð
 �ÐC¸6ÐCÐCÑDÔDÐDà-/ˆLØˆIØð ñ �Ý! "¤'™]œ]Ô/�
åÐSÐSÐSÐS¨ÐSÑSÔSÐU_Ñ`Ô`�Ý(¨°Ñ7Ô7�Ø�<Ø�CÐ: b¤gÐ:Ð:Ð:Ñ;Ô;Ð;ØÝ)¨'°2´>À2ÑFÔF�Ø�=Ø�CÐV b¤gÐVÐV¸¼ÐVÐVÐVÑWÔWÐWØØ)×-Ò-¨e¬jÑ9Ô9�
ØÐ%Ø�CÐV¨u¬zÐVÐV¸U¼_ÐVÐVÐVÐVÑWÔWÐWÝ!2°2·?²?À5Ñ3IÔ3IÑ!JÔ!J�JØ/9�L ¤Ñ,Ø(¨¬°R´YÀÄÑ5HÐ)HÔI�ðÝ'¨°TÑ:Ô:�D�DøÝ"¥Mµ6´<Ð@ð ð ð Ø�CÐ4 eÐ4Ð4¨sÐ4Ð4Ñ5Ô5Ð5Ø�H�H�H‘Høøøøðøøøõ    e¨TÑ2Ô2Ð2Ø—’‘”�Ø�Ð6˜UÐ6Ð6¥c¨$¡i¤iÐ6Ð6Ð6Ñ7Ô7Ð7Ø˜Q‘�	‘	Ý˜dÑ#Ô#Ð#Ý˜¨YÀ*ÐMÐMÑNÔNÐNØ�KŠK‰MŒMˆMØ"+ˆE�,ÑØ(ˆE�(‰OØðEB	ð B	ð B	ð B	ñ B	ô B	ð B	ðH 	�
Š
‰ŒˆˆðIB	ð B	ð B	ð B	øøøð B	ð B	ð B	ð B	ð B	ðH 	�
Š
‰Œˆˆˆøˆ�
Š
‰Œˆˆøøøsœ   ÁB] ÃD\9Ç,A+IÉ\9ÉI7É4\9É6I7É7C\9Í] Í1?\9Î0] ÏI.\9Ù YÙ\9ÙZ	Ù-ZÙ>\9ÚZ	Ú	B\9Ü] Ü9\=Ü=] Ý \=Ý] Ý]1)r3   r   )r=   r   r3   r   rÅ   )rK   rL   )r�   r‚   )r–   r   r—   r   r=   r   r�   r‚   r˜   r™   r3   rš   )/Ú__doc__Ú
__future__r   rÖ   rä   Úurllib.requestrF   r   r   Úpathlibr   Úbundler   r	   Údatc64r
   r   r   Úggpk_fsr   Ú	hashcacher   Ú	index_binr   Úoodler   Úpathsr   r   Úsqlite_exportr   r   r   r   r   r   r   r   rI   rÏ   rÐ   ÚDEFAULT_TABLESr<   rJ   r€   r•   rü   r9   r:   r;   ú<module>r
     s  ðØ OÐ OØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð à :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø  Ð  Ð  Ð  Ð  Ð  Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð c€
à€Ø!€ð€ð8/ð /ð /ð /ðð ð ð ð/ð /ð /ð /ð /ðdEð Eð Eð Eð0 -ØØð`ð `ð `ð `ð `ð `ð `r:   