§
    ¼y»j÷8  ã                   óZ  — d Z ddl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mZ ddlmZmZmZmZ ej        defd„¦   «         Zej        defd„¦   «         Z G d	„ d
¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )a  
Unit Test Suite for FreeExile Map, Dungeon Instance, and Secret Chamber Engine.
Validates:
1. Zone Registry & Metadata (Sanctuary, Open World, Dungeons, Secret Chambers).
2. Waypoint Network, Discovery, and Fast Travel Authority.
3. Portal Traversal with Level and Quest Prerequisite Gates.
4. Dungeon Instance Lifecycle (Layer Progression, Time Limits, Spatial Isolation).
5. Secret Chamber Spawning, Event-Driven Discovery, and Auto-Collapse Mechanics.
6. Deep Closed-Loop Integration with QuestEngine & Combat Subsystems.
é    N)ÚSet)Ú
ZoneEngineÚZoneTypeÚZoneEnvironmentÚZoneDefinitionÚWaypointÚ
ZonePortalÚPlayerLocationÚDungeonTemplateÚInstanceSessionÚSecretChamberTemplateÚSecretChamberSession)ÚQuestEngineÚQuestStatusÚHiddenTriggerTypeÚcreate_default_quest_engineÚreturnc                  ó   — t          ¦   «         S ©N)r   © ó    ú<C:\Projects\FreeExile\tests\unit\test_map_instance_system.pyÚzone_enginer   %   s   € å‰<Œ<Ðr   c                  ó   — t          ¦   «         S r   )r   r   r   r   Úquest_enginer   *   s   € å&Ñ(Ô(Ð(r   c                   ó2   — e Zd Zdefd„Zdefd„Zdefd„ZdS )ÚTestMapAndZoneRegistryr   c                 óp  — d|j         v sJ ‚|                     d¦  «        }|j        t          j        k    sJ ‚|j        t          j        k    sJ ‚|j        dk    sJ ‚ddt          j        fddt          j	        fddt          j
        fdd	t          j        fd
dt          j        fddt          j        fddt          j        fddt          j        fddt          j        fg	}|D ]W\  }}}||j         v sJ ‚|                     |¦  «        }|j        t          j        k    sJ ‚|j        |k    sJ ‚|j        |k    sJ ‚ŒXdS )zPVerifies that all 10 canonical open world / sanctuary zones and templates exist.Úzone_boundless_sanctuaryé   Úzone_tang_kiem_nhaiÚzone_ancient_sword_barrowé   Úzone_boundless_sandstormé   Úzone_blood_scale_ruinsé   Úzone_five_elements_altaré(   Úzone_abyssal_ice_pondé2   Úzone_infinite_blood_rifté<   Úzone_purgatory_lava_cavernéF   Úzone_boundless_celestial_palaceéU   N)ÚzonesÚget_zoneÚ	zone_typer   Ú	SANCTUARYÚenvironmentr   ÚNORMALÚ	min_levelÚMIASMA_TOXICÚ	SANDSTORMÚVOID_CORRUPTIONÚFREEZING_CHILLÚSCORCHING_HEATÚ
OPEN_WORLD)Úselfr   Ú	sanctuaryÚexpected_zonesÚzone_idÚmin_lvlÚenvÚzs           r   Ú#test_all_canonical_zones_registeredz:TestMapAndZoneRegistry.test_all_canonical_zones_registered0   st  € ð *¨[Ô->Ð>Ð>Ð>Ð>Ø×(Ò(Ð)CÑDÔDˆ	ØÔ"¥hÔ&8Ò8Ð8Ð8Ð8ØÔ$­Ô(>Ò>Ð>Ð>Ð>ØÔ" aÒ'Ð'Ð'Ð'ð # A¥Ô'=Ð>Ø(¨!­_Ô-IÐJØ'¨­_Ô-FÐGØ% r­?Ô+JÐKØ'¨­_Ô-CÐDØ$ b­/Ô*HÐIØ'¨­_Ô-KÐLØ)¨2­Ô/MÐNØ.°µOÔ4SÐTð

ˆð &4ð 	(ð 	(Ñ!ˆG�W˜cØ˜kÔ/Ð/Ð/Ð/Ð/Ø×$Ò$ WÑ-Ô-ˆAØ”;¥(Ô"5Ò5Ð5Ð5Ð5Ø”; 'Ò)Ð)Ð)Ð)Ø”= CÒ'Ð'Ð'Ð'Ð'ð	(ð 	(r   c                 ó  — d|j         v sJ ‚|                     d¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚d|j         v sJ ‚|                     d¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚d|j         v sJ ‚d	S )
ur   Verifies canonical dungeon instance templates (Phong Ma Cá»• Tráº­n, BÃ­ Cáº£nh HÆ° KhÃ´ng, ThÃ­ Luyá»‡n Ä�iá»‡n).Úinst_phong_ma_co_tranr+   r'   Ú"quest_norm_05_khai_mo_van_gioi_cacÚinst_bi_canh_hu_khongéd   r-   Úinst_van_gioi_thi_luyenN)Údungeon_templatesÚget_dungeon_templateÚ
max_layersr8   Úrequired_quest_id)r?   r   Úphong_maÚbi_canhs       r   Ú!test_dungeon_templates_registeredz8TestMapAndZoneRegistry.test_dungeon_templates_registeredM   sÑ   € à&¨+Ô*GÐGÐGÐGÐGØ×3Ò3Ð4KÑLÔLˆØÔ" bÒ(Ð(Ð(Ð(ØÔ! RÒ'Ð'Ð'Ð'ØÔ)Ð-QÒQÐQÐQÐQà&¨+Ô*GÐGÐGÐGÐGØ×2Ò2Ð3JÑKÔKˆØÔ! SÒ(Ð(Ð(Ð(ØÔ  BÒ&Ð&Ð&Ð&à(¨KÔ,IÐIÐIÐIÐIÐIÐIr   c                 ó®   — g d¢}|D ]M\  }}}||j         v sJ ‚|                     |¦  «        }|j        |k    sJ ‚|j        |k    sJ ‚|j        dk    sJ ‚ŒNdS )zQVerifies canonical cryptic secret chamber templates matching the 4 hidden quests.))Úsecret_huyen_anh_to_sur&   Úloc_secret_phantom_shrine)Úsecret_tan_bi_than_tuongr$   Úaction_decipher_ancient_stele)Úsecret_ngu_hanh_tran_nhanr(   Úloc_five_elements_altar)Úsecret_tang_kiem_kiem_chungr!   Úaction_cleanse_rusted_blader   N)Úsecret_chamber_templatesÚget_secret_chamber_templateÚparent_zone_idÚtarget_objective_idÚlifespan_sec)r?   r   Úexpected_chambersÚ
chamber_idÚparent_zoneÚ
target_keyÚtmpls          r   Ú(test_secret_chamber_templates_registeredz?TestMapAndZoneRegistry.test_secret_chamber_templates_registered\   s�   € ð
ð 
ð 
Ðð 4Eð 	)ð 	)Ñ/ˆJ˜ ZØ Ô!EÐEÐEÐEÐEØ×:Ò:¸:ÑFÔFˆDØÔ&¨+Ò5Ð5Ð5Ð5ØÔ+¨zÒ9Ð9Ð9Ð9ØÔ$ qÒ(Ð(Ð(Ð(Ð(ð	)ð 	)r   N)Ú__name__Ú
__module__Ú__qualname__r   rF   rS   rg   r   r   r   r   r   /   sj   € € € € € ð(¸zð (ð (ð (ð (ð:J¸Zð Jð Jð Jð Jð)ÀJð )ð )ð )ð )ð )ð )r   r   c                   ó&   — e Zd Zdefd„Zdefd„ZdS )Ú TestPlayerNavigationAndWaypointsr   c                 ó´  — d}|                      |d¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|                     |dd¦  «        \  }}|sJ ‚|dk    sJ ‚|                     |¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|                     d¦  «        }|j        dz   }|                     ||d¦  «        \  }}|rJ ‚d|v sJ ‚d	S )
zBTests spawning in sanctuary and boundary-checked position updates.Úplayer_test_01r   g        ç      Y@g     Àb@Ú g     @�@u   VÆ°á»£t quÃ¡ ranh giá»›iN)Úspawn_playerrB   ÚxÚyÚupdate_player_positionÚget_player_locationr3   Úbounds_width)	r?   r   Ú	player_idÚlocÚsuccessÚerrÚcurrent_locÚzoneÚhuge_xs	            r   Ú"test_player_spawn_and_bounds_checkzCTestPlayerNavigationAndWaypoints.test_player_spawn_and_bounds_checkn   s  € à$ˆ	Ø×&Ò& yÐ2LÑMÔMˆØŒ{Ð8Ò8Ð8Ð8Ð8ØŒu˜Š|ˆ|ˆ|ˆ|ØŒu˜Š|ˆ|ˆ|ˆ|ð #×9Ò9¸)ÀUÈEÑRÔR‰ˆ�ØˆˆˆwØ�bŠyˆyˆyˆyØ!×5Ò5°iÑ@Ô@ˆØŒ} Ò%Ð%Ð%Ð%ØŒ} Ò%Ð%Ð%Ð%ð ×#Ò#Ð$>Ñ?Ô?ˆØÔ" VÑ+ˆØ"×9Ò9¸)ÀVÈSÑQÔQ‰ˆ�ØÐÐˆ{Ø)¨SÐ0Ð0Ð0Ð0Ð0Ð0r   c                 ó¨  — d}|                      |d¦  «         |                     |¦  «        }d|v sJ ‚d|vsJ ‚|                     |dd¦  «        }d|v sJ ‚d|                     |¦  «        v sJ ‚|                     |d¦  «        \  }}|sJ ‚|                     |¦  «        }|j        dk    sJ ‚|                     |d¦  «        \  }}|rJ ‚d	|v sJ ‚d
S )zITests discovering waypoints upon proximity and authoritative fast travel.Úplayer_test_02r!   Úwp_sanctuary_centralÚwp_tang_kiem_cliffg     àb@g     Ðb@r   Úwp_celestial_peaku   ChÆ°a kÃ­ch hoáº¡tN)rq   Úget_unlocked_waypointsÚcheck_waypoint_proximityÚteleport_via_waypointru   rB   )r?   r   rw   ÚunlockedÚ
discoveredry   Úmsgr{   s           r   Ú)test_waypoint_discovery_and_teleportationzJTestPlayerNavigationAndWaypoints.test_waypoint_discovery_and_teleportation…   s+  € à$ˆ	Ø× Ò  Ð,AÑBÔBÐBð ×5Ò5°iÑ@Ô@ˆØ%¨Ð1Ð1Ð1Ð1ð $¨8Ð3Ð3Ð3Ð3ð !×9Ò9¸)ÀUÈEÑRÔRˆ
Ø# zÐ1Ð1Ð1Ð1Ø# {×'IÒ'IÈ)Ñ'TÔ'TÐTÐTÐTÐTð #×8Ò8¸ÐDZÑ[Ô[‰ˆ�ØˆˆˆwØ!×5Ò5°iÑ@Ô@ˆØÔ"Ð&@Ò@Ð@Ð@Ð@ð #×8Ò8¸ÐDWÑXÔX‰ˆ�ØÐÐˆ{Ø# sÐ*Ð*Ð*Ð*Ð*Ð*r   N)rh   ri   rj   r   r~   rŠ   r   r   r   rl   rl   m   sJ   € € € € € ð1¸jð 1ð 1ð 1ð 1ð.+ÀZð +ð +ð +ð +ð +ð +r   rl   c                   ó&   — e Zd Zdefd„Zdefd„ZdS )Ú!TestPortalTraversalAndLevelGatingr   c                 óÊ   — d}|                      |d¦  «         d}|                     ||d¬¦  «        \  }}}|sJ ‚|dk    sJ ‚|                     |¦  «        j        dk    sJ ‚dS )zCTests crossing a zone portal when level requirements are satisfied.Úplayer_heror   Úportal_sanctuary_to_tang_kiemé   ©Úplayer_levelr!   N)rq   Útraverse_portalru   rB   ©r?   r   rw   Ú	portal_idry   Únew_zoner‰   s          r   Útest_portal_traversal_successz?TestPortalTraversalAndLevelGating.test_portal_traversal_success£   s‹   € à!ˆ	Ø× Ò  Ð,FÑGÔGÐGð 4ˆ	Ø!,×!<Ò!<¸YÈ	Ð`aÐ!<Ñ!bÔ!bÑˆ�˜3ØˆˆˆwØÐ0Ò0Ð0Ð0Ð0Ø×.Ò.¨yÑ9Ô9ÔAÐEZÒZÐZÐZÐZÐZÐZr   c                 ó–   — d}|                      |d¦  «         d}|                     ||d¬¦  «        \  }}}|rJ ‚|dk    sJ ‚d|v sJ ‚dS )	zJTests that a low-level player cannot traverse into high-tier danger zones.Úplayer_newbier.   Úportal_lava_to_celestialr%   r‘   rp   õ   ChÆ°a Ä‘áº¡t cáº¥p Ä‘á»™N)rq   r“   r”   s          r   Ú*test_portal_traversal_level_gate_rejectionzLTestPortalTraversalAndLevelGating.test_portal_traversal_level_gate_rejection¯   sv   € à#ˆ	Ø× Ò  Ð,HÑIÔIÐIð /ˆ	Ø!,×!<Ò!<¸YÈ	Ð`bÐ!<Ñ!cÔ!cÑˆ�˜3ØÐÐˆ{Ø˜2Š~ˆ~ˆ~ˆ~Ø)¨SÐ0Ð0Ð0Ð0Ð0Ð0r   N)rh   ri   rj   r   r—   rœ   r   r   r   rŒ   rŒ   ¢   sO   € € € € € ð
[¸ð 
[ð 
[ð 
[ð 
[ð
1Àjð 
1ð 
1ð 
1ð 
1ð 
1ð 
1r   rŒ   c                   ó&   — e Zd Zdefd„Zdefd„ZdS )ÚTestDungeonInstanceLifecycler   c                 ó¶  — d}ddg}|                      d||ddh¬¦  «        \  }}}|sJ ‚|€J ‚|j        d	k    sJ ‚|j        d
k    sJ ‚|j        dk    sJ ‚t	          |j        ¦  «        dk    sJ ‚|j        }|j        D ]6}|                     |¦  «        }	|	j        |j	        k    sJ ‚|	j        |k    sJ ‚Œ7| 
                    |¦  «        \  }
}|
dk    sJ ‚|rJ ‚d
|_        | 
                    |¦  «        \  }
}|sJ ‚|j        sJ ‚|                     |¦  «         ||j        vsJ ‚|j        D ]-}|                     |¦  «        }	|	j        dk    sJ ‚|	j        �J ‚Œ.dS )uc   Tests full lifecycle of Phong Ma Cá»• Tráº­n (Creation, layer advances, party members, completion).Úplayer_leaderÚplayer_member_1Úplayer_member_2rH   é#   rI   ©Útemplate_idÚ	leader_idÚmembersÚleader_levelÚcompleted_questsNr    r+   é   é   r   )Úcreate_dungeon_instanceÚcurrent_layerrO   Úlives_remainingÚlenÚall_playersÚinstance_idru   rB   Úinstance_zone_idÚadvance_instance_layerÚis_completedÚclose_instanceÚactive_instances)r?   r   r¦   r§   ry   Úsessionr‰   r±   Úprx   Úcleared_layerÚis_dones               r   Ú)test_create_and_progress_dungeon_instancezFTestDungeonInstanceLifecycle.test_create_and_progress_dungeon_instance½   s   € à#ˆ	Ø$Ð&7Ð8ˆð !,× CÒ CØ/ØØØØBÐCð !Dñ !
ô !
Ñˆ�˜#ð ˆˆˆwØÐ"Ð"Ð"ØÔ$¨Ò)Ð)Ð)Ð)ØÔ! RÒ'Ð'Ð'Ð'ØÔ&¨!Ò+Ð+Ð+Ð+Ý�7Ô&Ñ'Ô'¨1Ò,Ð,Ð,Ð,àÔ)ˆð Ô$ð 	2ð 	2ˆAØ×1Ò1°!Ñ4Ô4ˆCØ”; 'Ô":Ò:Ð:Ð:Ð:Ø”? kÒ1Ð1Ð1Ð1Ð1ð "-×!CÒ!CÀKÑ!PÔ!PÑˆ�wØ Ò!Ð!Ð!Ð!ØÐÐˆ{ð !#ˆÔØ!,×!CÒ!CÀKÑ!PÔ!PÑˆ�wØˆˆˆwØÔ#Ð#Ð#Ð#ð 	×"Ò" ;Ñ/Ô/Ð/Ø +Ô">Ð>Ð>Ð>Ð>ØÔ$ð 	+ð 	+ˆAØ×1Ò1°!Ñ4Ô4ˆCØ”;Ð"<Ò<Ð<Ð<Ð<Ø”?Ð*Ð*Ð*Ð*ð	+ð 	+r   c                 óz   — d}|                      d|g dt          ¦   «         ¬¦  «        \  }}}|rJ ‚|�J ‚d|v sJ ‚dS )zLTests instance creation failure when level or quest prerequisite is missing.Úplayer_underleveledrH   é   r¤   Nr›   )r¬   Úset)r?   r   r¦   ry   r·   r‰   s         r   Ú1test_dungeon_entry_rejection_without_prerequisitezNTestDungeonInstanceLifecycle.test_dungeon_entry_rejection_without_prerequisiteì   si   € à)ˆ	Ø +× CÒ CØ/ØØØÝ ™UœUð !Dñ !
ô !
Ñˆ�˜#ð ÐÐˆ{ØˆˆˆØ)¨SÐ0Ð0Ð0Ð0Ð0Ð0r   N)rh   ri   rj   r   r»   rÀ   r   r   r   rž   rž   ¼   sK   € € € € € ð-+ÀZð -+ð -+ð -+ð -+ð^1ÈZð 1ð 1ð 1ð 1ð 1ð 1r   rž   c                   ó   — e Zd Zdefd„ZdS )ÚTestSecretChamberMechanicsr   c                 óš  — d}|                      |d¦  «         |                     d|dddd¬¦  «        \  }}}|sJ ‚|€J ‚|j        dk    sJ ‚|j        sJ ‚|                     ||j        ¦  «        \  }}|sJ ‚|                     |¦  «        }|j        |j        k    sJ ‚|j	        |j        k    sJ ‚| 
                    ||j        ¦  «        \  }	}
|	sJ ‚|j        sJ ‚|                     |j        ¦  «         |j        |j        vsJ ‚|                     |¦  «        }|j        dk    sJ ‚|j	        �J ‚|j        dk    sJ ‚|j        dk    sJ ‚dS )	zMTests spawning a secret chamber portal, entering it, and timer auto-collapse.Úplayer_fatedr&   rU   g      ^@g     @U@iX  )r¥   rw   r_   Úportal_xÚportal_yra   N)rq   Úspawn_secret_chamberÚportal_zone_idÚ	is_activeÚenter_secret_chamberrc   ru   rB   Úchamber_zone_idr±   Úcomplete_secret_chamberÚ
is_clearedÚcollapse_secret_chamberÚactive_secret_chambersrr   rs   )r?   r   rw   ry   Úchamberr‰   Úenter_okÚ	enter_msgrx   Ú
cleared_okÚ	clear_msgÚ
return_locs               r   Ú1test_secret_chamber_spawn_enter_and_auto_collapsezLTestSecretChamberMechanics.test_secret_chamber_spawn_enter_and_auto_collapseü   sÄ  € à"ˆ	Ø× Ò  Ð,DÑEÔEÐEð !,× @Ò @Ø0ØØ3ØØØð !Añ !
ô !
Ñˆ�˜#ð ˆˆˆwØÐ"Ð"Ð"ØÔ%Ð)AÒAÐAÐAÐAØÔ Ð Ð Ð ð *×>Ò>¸yÈ'ÔJ\Ñ]Ô]Ñˆ�)ØˆˆˆxØ×-Ò-¨iÑ8Ô8ˆØŒ{˜gÔ5Ò5Ð5Ð5Ð5ØŒ 'Ô"4Ò4Ð4Ð4Ð4ð !,× CÒ CÀIÈwÔOaÑ bÔ bÑˆ
�IØÐÐˆzØÔ!Ð!Ð!Ð!ð 	×+Ò+¨GÔ,>Ñ?Ô?Ð?ØÔ!¨Ô)KÐKÐKÐKÐKð !×4Ò4°YÑ?Ô?ˆ
ØÔ!Ð%=Ò=Ð=Ð=Ð=ØÔ%Ð-Ð-Ð-ØŒ|˜uÒ$Ð$Ð$Ð$ØŒ|˜tÒ#Ð#Ð#Ð#Ð#Ð#r   N)rh   ri   rj   r   rÖ   r   r   r   rÂ   rÂ   û   s/   € € € € € ð($ÈZð ($ð ($ð ($ð ($ð ($ð ($r   rÂ   c                   ó   — e Zd Zdedefd„ZdS )Ú'TestQuestAndCombatClosedLoopIntegrationr   r   c                 ó&  — d}|                      |d¬¦  «         |                     |t          j        dddœ¬¦  «        }|dk    sJ ‚|                     d	|dd
d
¬¦  «        \  }}}|sJ ‚|€J ‚|                     ||j        ¦  «         |                     |d¦  «        }d|v sJ ‚|                     |d¦  «        }	|	€J ‚|	j	        t          j        k    sJ ‚|                     |d¦  «        \  }
}}|
sJ ‚|€J ‚|j        dk    sJ ‚|j        dk    sJ ‚dS )zRTests that moving to a secret location or zone updates quest discovery objectives.Úplayer_integratorr¾   r‘   r&   g{®Gáz´?)r|   Ú
hp_percent)rw   Útrigger_typeÚcontextÚquest_hidden_01_huyen_anh_to_surU   ro   )r¥   rw   r_   rÅ   rÆ   NrV   u   Huyá»…n áº¢nh VÃ´ Songr�   )Úinitialize_playerÚtrigger_hidden_questr   ÚEVASION_NEAR_DEATHrÇ   rÊ   rc   Úrecord_discoveryÚget_player_questÚstatusr   Ú	COMPLETEDÚclaim_quest_rewardÚtitleÚmeridian_points)r?   r   r   rw   Ú	triggeredÚokrÐ   Ú_r©   ÚstateÚclaim_okÚrewards               r   Ú(test_zone_discovery_updates_quest_enginezPTestQuestAndCombatClosedLoopIntegration.test_zone_discovery_updates_quest_engine(  s�  € ð (ˆ	Ø×&Ò& y¸rÐ&ÑBÔBÐBð !×5Ò5ØÝ*Ô=Ø5ÀTÐJÐJð 6ñ 
ô 
ˆ	ð
 Ð=Ò=Ð=Ð=Ð=ð %×9Ò9Ø0ØØ3ØØð :ñ 
ô 
‰ˆˆG�Qð ˆ	ˆ	ˆrØÐ"Ð"Ð"ð 	×(Ò(¨°GÔ4FÑGÔGÐGð (×8Ò8¸ÐD_Ñ`Ô`ÐØ0Ð4DÐDÐDÐDÐDð ×-Ò-¨iÐ9ZÑ[Ô[ˆØÐ Ð Ð ØŒ|�{Ô4Ò4Ð4Ð4Ð4ð +×=Ò=¸iÐIjÑkÔkÑˆ�&˜!ØˆˆˆxØÐ!Ð!Ð!ØŒ|Ð7Ò7Ð7Ð7Ð7ØÔ%¨Ò*Ð*Ð*Ð*Ð*Ð*r   N)rh   ri   rj   r   r   rï   r   r   r   rØ   rØ   '  s8   € € € € € ð++Ø%ð++Ø5@ð++ð ++ð ++ð ++ð ++ð ++r   rØ   )Ú__doc__ÚtimeÚpytestÚtypingr   Úserver.world.zone_enginer   r   r   r   r   r	   r
   r   r   r   r   Úserver.world.quest_enginer   r   r   r   Úfixturer   r   r   rl   rŒ   rž   rÂ   rØ   r   r   r   ú<module>r÷      sC  ðð	ð 	ð €€€Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð „ð�Zð ð ð ñ „ðð „ð)�kð )ð )ð )ñ „ð)ð;)ð ;)ð ;)ð ;)ð ;)ñ ;)ô ;)ð ;)ð|2+ð 2+ð 2+ð 2+ð 2+ñ 2+ô 2+ð 2+ðj1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ð4<1ð <1ð <1ð <1ð <1ñ <1ô <1ð <1ð~)$ð )$ð )$ð )$ð )$ñ )$ô )$ð )$ðX,+ð ,+ð ,+ð ,+ð ,+ñ ,+ô ,+ð ,+ð ,+ð ,+r   