§
    b¤½jr/  ã                   ó¤   — d Z ddlZddlmc mZ ddlmZ ddl	Z	ddl
mZmZ ddlmZ ddlmZmZ e	j        defd„¦   «         Z G d	„ d
¦  «        ZdS )a•  
Unit tests for PoE2 Zone Spawning Purity & Encounter Rules in FreeExile.
Verifies that Safe Havens (Sanctuary & Hideout) NEVER spawn hostile monsters,
restricting safe zones strictly to inanimate training dummies, while outer
exploration maps and dungeons support dynamic hostile monster populations.
Also validates spatial grid initialization, entity isolation, and portal traversal
for Player Hideout.
é    N)ÚPath)ÚEntityÚSpatialGrid©Ú
ZoneEngine)ÚZoneEnvironmentÚZoneTypeÚreturnc                  ó   — t          ¦   «         S )Nr   © ó    úDC:\Projects\FreeExile\tests\unit\test_zone_monster_spawning_rules.pyÚzone_enginer      s   € å‰<Œ<Ðr   c                   óÊ   — e Zd ZdZdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd	„Z	deddfd
„Z
deddfd„Zdeddfd„Zdeddfd„Zdd„Zdd„Zdd„Zdd„Zdd„ZdS )ÚTestPoE2ZoneSpawningPurityz>Tests authoritative safe-zone purity and monster spawn gating.r   r
   Nc                 óD  — |                      d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j	        }t          j        }||k    }|sòt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }t          j        }||k    }|sòt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )z@Verifies that Outcast Encampment Hub is registered as SANCTUARY.Úzone_boundless_sanctuaryN©úis not©z%(py0)s is not %(py3)sÚ	sanctuary©Úpy0Úpy3úassert %(py5)sÚpy5©ú==©zP%(py2)s
{%(py2)s = %(py0)s.zone_type
} == %(py6)s
{%(py6)s = %(py4)s.SANCTUARY
}r	   ©r   Úpy2Úpy4Úpy6úassert %(py8)sÚpy8)zO%(py2)s
{%(py2)s = %(py0)s.environment
} == %(py6)s
{%(py6)s = %(py4)s.NORMAL
}r   é   ©z1%(py2)s
{%(py2)s = %(py0)s.min_level
} == %(py5)s©r   r!   r   úassert %(py7)sÚpy7)Úget_zoneÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ	zone_typer	   Ú	SANCTUARYÚenvironmentr   ÚNORMALÚ	min_level)Úselfr   r   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6Ú@py_assert5Ú@py_assert3Ú@py_format7Ú@py_format9Ú@py_assert4Ú@py_format8s                r   Ú%test_sanctuary_zone_type_is_sanctuaryz@TestPoE2ZoneSpawningPurity.test_sanctuary_zone_type_is_sanctuary   s  € à×(Ò(Ð)CÑDÔDˆ	Ø $Ð$ˆy Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆy Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆyÑ$Ô$Ð$Õ$Ô$ˆyÑ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$ØÔ"Ð8¥hÔ&8Ð8Ð"Ð&8Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð"Ð&8Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆyÑ8Ô8Ð8Õ8Ô8ˆyÑ8Ô8Ð8Ð8Õ8Ô8Ð"Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8¥hÑ8Ô8Ð8Õ8Ô8¥hÑ8Ô8Ð8Ð8Õ8Ô8Ð&8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÔ$Ð>­Ô(>Ð>Ð$Ð(>Ò>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð$Ð(>Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆyÑ>Ô>Ð>Õ>Ô>ˆyÑ>Ô>Ð>Ð>Õ>Ô>Ð$Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>­Ñ>Ô>Ð>Õ>Ô>­Ñ>Ô>Ð>Ð>Õ>Ô>Ð(>Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÔ"Ð' aÐ'Ð" aÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð" aÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆyÑ'Ô'Ð'Õ'Ô'ˆyÑ'Ô'Ð'Ð'Õ'Ô'Ð"Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'r   c                 ó&  — |                      d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j	        }d}||k    }|sªt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j
        }t          j        }
||
k    }|sòt          j        d	|fd||
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}
|j        }d}||k    }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}d}|j        }||v }|sªt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}d!}|j        }||v }|sªt          j        d|fd"||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}dS )#uU   Verifies that Player Hideout (TiÃªn Phá»§ Ä�á»™ng ThiÃªn) is registered as SANCTUARY.Úzone_player_hideoutNr   r   Úhideoutr   r   r   r   ©z/%(py2)s
{%(py2)s = %(py0)s.zone_id
} == %(py5)sr(   r)   r*   r   r	   r    r$   r%   u$   TiÃªn Phá»§ Ä�á»™ng ThiÃªn (Hideout))z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)s)z4%(py2)s
{%(py2)s = %(py0)s.display_name
} == %(py5)sr&   r'   éd   )z1%(py2)s
{%(py2)s = %(py0)s.max_level
} == %(py5)sg      ‰@)z4%(py2)s
{%(py2)s = %(py0)s.bounds_width
} == %(py5)s)z5%(py2)s
{%(py2)s = %(py0)s.bounds_height
} == %(py5)sÚwp_hideout_central©Úin)z1%(py1)s in %(py5)s
{%(py5)s = %(py3)s.waypoints
}©Úpy1r   r   Úportal_hideout_to_sanctuary)z/%(py1)s in %(py5)s
{%(py5)s = %(py3)s.portals
})r+   r,   r-   r.   r/   r0   r1   r2   r3   Úzone_idr4   r	   r5   ÚnameÚdisplay_namer8   Ú	max_levelÚbounds_widthÚbounds_heightÚ	waypointsÚportals)r9   r   rG   r:   r;   r<   r=   rB   r?   rC   r>   r@   rA   Ú@py_assert0s                 r   Ú*test_player_hideout_zone_type_is_sanctuaryzETestPoE2ZoneSpawningPurity.test_player_hideout_zone_type_is_sanctuary"   sî	  € à×&Ò&Ð'<Ñ=Ô=ˆØ"Ð"ˆw˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆw˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØŒÐ7Ð"7Ð7ˆÐ"7Ò7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7ˆÐ"7Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7ˆwÑ7Ô7Ð7Õ7Ô7ˆwÑ7Ô7Ð7Ð7Õ7Ô7ˆÑ7Ô7Õ7Ô7Ð"7Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ØÔ Ð6¥HÔ$6Ð6Ð Ð$6Ò6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð Ð$6Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6ˆwÑ6Ô6Ð6Õ6Ô6ˆwÑ6Ô6Ð6Ð6Õ6Ô6Ð Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¥HÑ6Ô6Ð6Õ6Ô6¥HÑ6Ô6Ð6Ð6Õ6Ô6Ð$6Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØŒ|ÐEÐEÐEˆ|ÐEÒEÐEÐEÐEÕEÔEÐEÐEÐEÐEˆ|ÐEÐEÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔEˆwÑEÔEÐEÕEÔEˆwÑEÔEÐEÐEÕEÔEˆ|ÑEÔEÕEÔEÐEÑEÔEÐEÐEÑEÐEÐEÐEÐEÐEÑEÐEÕEÕEÔEÐEÑEÔEÑEÔEÐEÐEÐEÐEÐEÐEÐEØÔ#ÐMÐ'MÐMÐ#Ð'MÒMÐMÐMÐMÕMÔMÐMÐMÐMÐMÐ#Ð'MÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMˆwÑMÔMÐMÕMÔMˆwÑMÔMÐMÐMÕMÔMÐ#ÑMÔMÕMÔMÐ'MÑMÔMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMØÔ Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆwÑ%Ô%Ð%Õ%Ô%ˆwÑ%Ô%Ð%Ð%Õ%Ô%Ð Ñ%Ô%Õ%Ô% AÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÔ Ð' CÐ'Ð  CÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð  CÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'Ð Ñ'Ô'Õ'Ô' CÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÔ#Ð, uÐ,Ð# uÒ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð# uÐ,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Ð,Õ,Ô,Ð#Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÔ$Ð-¨Ð-Ð$¨Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð$¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆwÑ-Ô-Ð-Õ-Ô-ˆwÑ-Ô-Ð-Ð-Õ-Ô-Ð$Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø#Ð8 wÔ'8Ð8Ð#Ð'8Ð8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð#Ð'8Ð8Ñ8Ô8Õ8Ô8Ð#Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8 wÑ8Ô8Ð8Õ8Ô8 wÑ8Ô8Ð8Ð8Õ8Ô8Ð'8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ø,Ð?°´Ð?Ð,°Ð?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð,°Ð?Ñ?Ô?Õ?Ô?Ð,Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?°Ñ?Ô?Ð?Õ?Ô?°Ñ?Ô?Ð?Ð?Õ?Ô?°Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?r   c                 ó¦  — |                      d¦  «        }|j        }t          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}x}}|                      d
¦  «        }|j        }t          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}x}}d	S )zAVerifies that wilderness maps are OPEN_WORLD where monsters roam.Úzone_tang_kiem_nhair   )zQ%(py2)s
{%(py2)s = %(py0)s.zone_type
} == %(py6)s
{%(py6)s = %(py4)s.OPEN_WORLD
}Úbone_strandr	   r    r$   r%   NÚzone_ancient_sword_barrowÚancient_sword)r+   r4   r	   Ú
OPEN_WORLDr,   r-   r.   r/   r0   r1   r2   r3   )	r9   r   r\   r;   r>   r?   r@   rA   r^   s	            r   Ú+test_outer_exploration_zones_are_open_worldzFTestPoE2ZoneSpawningPurity.test_outer_exploration_zones_are_open_world1   sr  € à!×*Ò*Ð+@ÑAÔAˆØÔ$Ð;­Ô(;Ð;Ð$Ð(;Ò;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð$Ð(;Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆ{Ñ;Ô;Ð;Õ;Ô;ˆ{Ñ;Ô;Ð;Ð;Õ;Ô;Ð$Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;­Ñ;Ô;Ð;Õ;Ô;­Ñ;Ô;Ð;Ð;Õ;Ô;Ð(;Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à#×,Ò,Ð-HÑIÔIˆØÔ&Ð=­(Ô*=Ð=Ð&Ð*=Ò=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð&Ð*=Ð=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=ˆ}Ñ=Ô=Ð=Õ=Ô=ˆ}Ñ=Ô=Ð=Ð=Õ=Ô=Ð&Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=­(Ñ=Ô=Ð=Õ=Ô=­(Ñ=Ô=Ð=Ð=Õ=Ô=Ð*=Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=r   c                 óŽ  — |j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}|j         }d
} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}|j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}|j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}|j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}|j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )z7Verifies authoritative can_spawn_hostile_monsters rule.r   F©Úis)z`%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.can_spawn_hostile_monsters
}(%(py4)s)
} is %(py9)sr   )r   r!   r"   r#   Úpy9zassert %(py11)sÚpy11NrF   Úinvalid_unknown_zoner[   Tr]   Úzone_boundless_sandstorm)	Úcan_spawn_hostile_monstersr,   r-   r.   r/   r0   r1   r2   r3   )	r9   r   r;   r?   r>   Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s	            r   Ú$test_can_spawn_hostile_monsters_gatez?TestPoE2ZoneSpawningPurity.test_can_spawn_hostile_monsters_gate9   sø  € ð Ô5ÐZÐ6PÐZÐ5Ð5Ð6PÑQÔQÐZÐUZÐZÐQÐUZÐZÐZÐZÐZÕZÔZÐZÐZÐZÐZÐQÐUZÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆ{ÑZÔZÐZÕZÔZˆ{ÑZÔZÐZÐZÕZÔZÐ5ÑZÔZÕZÔZÐ6PÑZÔZÕZÔZÐQÑZÔZÕZÔZÐUZÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZØÔ5ÐUÐ6KÐUÐ5Ð5Ð6KÑLÔLÐUÐPUÐUÐLÐPUÐUÐUÐUÐUÕUÔUÐUÐUÐUÐUÐLÐPUÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆ{ÑUÔUÐUÕUÔUˆ{ÑUÔUÐUÐUÕUÔUÐ5ÑUÔUÕUÔUÐ6KÑUÔUÕUÔUÐLÑUÔUÕUÔUÐPUÑUÔUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUð Ô5ÐVÐ6LÐVÐ5Ð5Ð6LÑMÔMÐVÐQVÐVÐMÐQVÐVÐVÐVÐVÕVÔVÐVÐVÐVÐVÐMÐQVÐVÑVÔVÐVÕVÔVÑVÔVÐVÐVÕVÔVˆ{ÑVÔVÐVÕVÔVˆ{ÑVÔVÐVÐVÕVÔVÐ5ÑVÔVÕVÔVÐ6LÑVÔVÕVÔVÐMÑVÔVÕVÔVÐQVÑVÔVÐVÐVÑVÐVÐVÐVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVð Ô5ÐTÐ6KÐTÐ5Ð5Ð6KÑLÔLÐTÐPTÐTÐLÐPTÐTÐTÐTÐTÕTÔTÐTÐTÐTÐTÐLÐPTÐTÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔTˆ{ÑTÔTÐTÕTÔTˆ{ÑTÔTÐTÐTÕTÔTÐ5ÑTÔTÕTÔTÐ6KÑTÔTÕTÔTÐLÑTÔTÕTÔTÐPTÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTØÔ5ÐZÐ6QÐZÐ5Ð5Ð6QÑRÔRÐZÐVZÐZÐRÐVZÐZÐZÐZÐZÕZÔZÐZÐZÐZÐZÐRÐVZÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆ{ÑZÔZÐZÕZÔZˆ{ÑZÔZÐZÐZÕZÔZÐ5ÑZÔZÕZÔZÐ6QÑZÔZÕZÔZÐRÑZÔZÕZÔZÐVZÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZØÔ5ÐYÐ6PÐYÐ5Ð5Ð6PÑQÔQÐYÐUYÐYÐQÐUYÐYÐYÐYÐYÕYÔYÐYÐYÐYÐYÐQÐUYÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYˆ{ÑYÔYÐYÕYÔYˆ{ÑYÔYÐYÐYÕYÔYÐ5ÑYÔYÕYÔYÐ6PÑYÔYÕYÔYÐQÑYÔYÕYÔYÐUYÑYÔYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYr   c                 ó@  — |                      dd¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}g }d}||v }|}	|sd}
|
|v }|}	|	�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 	                    |¦  «         |s‹t          j        d|fd|
|f¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}	x}x}x}x}
}|                      dd¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}g }d}||v }|}	|sd}
|
|v }|}	|	�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 	                    |¦  «         |s‹t          j        d|fd|
|f¦  «        t          j        |
¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}	x}x}x}x}
}|                      dd¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}g }d}||v }|}	|sd }
|
|v }|}	|	�sXt          j        d|fd||f¦  «        t          j        |¦  «        d!t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd!dœz  }dd|iz  }| 	                    |¦  «         |s‹t          j        d|fd|
|f¦  «        t          j        |
¦  «        d!t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd!dœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}	x}x}x}x}
}|                      dd¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        d"t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}g }d}||v }|}	|sd }
|
|v }|}	|	�sXt          j        d|fd||f¦  «        t          j        |¦  «        d#t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd#dœz  }dd|iz  }| 	                    |¦  «         |s‹t          j        d|fd|
|f¦  «        t          j        |
¦  «        d#t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd#dœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}	x}x}x}x}
}|                      d$d¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        d%t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd%t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}d
S )&zPVerifies validate_monster_spawn rejects hostile spawns in Sanctuary and Hideout.r   F)rP   Úis_dummyrb   ©z%(py0)s is %(py3)sÚcan_spawn_sancr   r   r   Nu   An ToÃ nÚ	SanctuaryrK   )z%(py3)s in %(py5)sÚreason_sanc)r   r   z%(py7)sr*   )z%(py10)s in %(py12)s)Úpy10Úpy12z%(py14)sÚpy14r&   zassert %(py17)sÚpy17rF   Úcan_spawn_hideoutÚreason_hideoutTÚcan_dummy_sanczTarget Dummyu   KhÃ´i Lá»—iÚreason_dummy_sancÚcan_dummy_hideoutÚreason_dummy_hideoutr[   Úcan_wild)Úvalidate_monster_spawnr,   r-   r.   r/   r0   r1   r2   r3   ÚappendÚ_format_boolop)r9   r   rq   rs   r:   r;   r<   r=   rB   rX   Ú@py_assert9Ú@py_assert11rC   Ú@py_format13Ú@py_format15Ú@py_format16Ú@py_format18rx   ry   rz   r{   r|   r}   r~   Ú_s                            r   Ú'test_validate_monster_spawn_enforcementzBTestPoE2ZoneSpawningPurity.test_validate_monster_spawn_enforcementG   sJ  € ð '2×&HÒ&HØ.Øð 'Iñ '
ô '
Ñ#ˆ˜ð "'Ð&ˆ~ Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ~ Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ~Ñ&Ô&Ð&Õ&Ô&ˆ~Ñ&Ô&Ð&Ð&Õ&Ô& Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØFÐFˆzÐFˆz˜[Ð(ÐFÐFÐFÐFÐF¨KÐF¨K¸;Ð,FÐFÐFÐFÐFÑFÕFÔFÐFÐFÐFÐFˆz˜[ÐFÑFÔFÕFÔFˆzÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔF˜[ÑFÔFÐFÕFÔF˜[ÑFÔFÐFÐFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÐF×FÒFÐFÑFÔFÐFÐFÐFÕFÔFÐFÐFÐFÐF¨K¸;ÐFÑFÔFÕFÔF¨KÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔF¸;ÑFÔFÐFÕFÔF¸;ÑFÔFÐFÐFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÐF×FÒFÐFÑFÔFÐFÕFÔFÐFÐFÑFÔFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFð -8×,NÒ,NØ)Øð -Oñ -
ô -
Ñ)Ð˜>ð %*Ð)Ð  EÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð  EÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)Ð Ñ)Ô)Ð)Õ)Ô)Ð Ñ)Ô)Ð)Ð)Õ)Ô) EÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)ØWÐWÐ$ÐWÐ$¨Ð6ÐWÐWÐWÐWÐW¸+ÐW¸+ÈÐ:WÐWÐWÐWÐWÑWÕWÔWÐWÐWÐWÐWÐ$¨ÐWÑWÔWÕWÔWÐ$ÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔW¨ÑWÔWÐWÕWÔW¨ÑWÔWÐWÐWÐWÐWÑWÐWÐWÐWÐWÐWÑWÐWÐW×WÒWÐWÑWÔWÐWÐWÐWÕWÔWÐWÐWÐWÐW¸+ÈÐWÑWÔWÕWÔW¸+ÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔWÈÑWÔWÐWÕWÔWÈÑWÔWÐWÐWÐWÐWÑWÐWÐWÐWÐWÐWÑWÐWÐW×WÒWÐWÑWÔWÐWÕWÔWÐWÐWÑWÔWÐWÑWÐWÐWÐWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWð -8×,NÒ,NØ.Øð -Oñ -
ô -
Ñ)ˆÐ)ð "&Ð%ˆ~ Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ~ Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ~Ñ%Ô%Ð%Õ%Ô%ˆ~Ñ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%ØXÐXˆ~ÐXˆ~Ð!2Ð2ÐXÐXÐXÐXÐX°mÐX°mÐGXÐ6XÐXÐXÐXÐXÑXÕXÔXÐXÐXÐXÐXˆ~Ð!2ÐXÑXÔXÕXÔXˆ~ÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔXÐ!2ÑXÔXÐXÕXÔXÐ!2ÑXÔXÐXÐXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÐXÐXÕXÔXÐXÐXÐXÐX°mÐGXÐXÑXÔXÕXÔX°mÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔXÐGXÑXÔXÐXÕXÔXÐGXÑXÔXÐXÐXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÕXÔXÐXÐXÑXÔXÐXÑXÐXÐXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXð 3>×2TÒ2TØ)Øð 3Uñ 3
ô 3
Ñ/ÐÐ/ð %)Ð(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(Ð Ñ(Ô(Ð(Õ(Ô(Ð Ñ(Ô(Ð(Ð(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ø^Ð^ˆ~Ð^ˆ~Ð!5Ð5Ð^Ð^Ð^Ð^Ð^¸Ð^¸ÐJ^Ð9^Ð^Ð^Ð^Ð^Ñ^Õ^Ô^Ð^Ð^Ð^Ð^ˆ~Ð!5Ð^Ñ^Ô^Õ^Ô^ˆ~Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^Ð!5Ñ^Ô^Ð^Õ^Ô^Ð!5Ñ^Ô^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Ð^Ð^Õ^Ô^Ð^Ð^Ð^Ð^¸ÐJ^Ð^Ñ^Ô^Õ^Ô^¸Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^ÐJ^Ñ^Ô^Ð^Õ^Ô^ÐJ^Ñ^Ô^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^×^Ò^Ð^Ñ^Ô^Ð^Õ^Ô^Ð^Ð^Ñ^Ô^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^ð "×8Ò8Ø)Øð 9ñ 
ô 
‰ˆ�!ð  Ðˆx˜4ÐÐÐÐÕÔÐÐÐÐˆx˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr   c                 óÜ  — d}|                      |d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j	        }||k    }|sÕt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}|j
        }d}||k    }|sªt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                     |¦  «        }|j
        }d}||k    }|sªt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d}|j        }||v }|sªt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d}|j        }||v }|sªt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        d         }|j        d         }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          |t           ¦  «        }|�sddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd t          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nd t          j        |¦  «        d!œz  }	t          t          j        |	¦  «        ¦  «        ‚d}||u}|sÂt          j        d|fd"||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd#t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd#d$œz  }d%d&|iz  }	t          t          j        |	¦  «        ¦  «        ‚d}|j        }d'}||k    }|sªt          j        d
|fd(||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                     |j        |j        ¦  «        }d)}||k    }|s—t          j        d
|fd*||f¦  «        d+t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd+t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS ),z¿
        Verifies that spawning a player in the hideout succeeds without KeyError,
        sets valid player location coordinates, and guarantees hideout spatial grid initialization.
        Úplayer_hero_hideout_01rF   Nr   r   Úlocr   r   r   r   )z1%(py2)s
{%(py2)s = %(py0)s.player_id
} == %(py4)sÚ	player_id©r   r!   r"   zassert %(py6)sr#   rH   r(   r)   r*   ç        )z)%(py2)s
{%(py2)s = %(py0)s.x
} == %(py5)s)z)%(py2)s
{%(py2)s = %(py0)s.y
} == %(py5)sÚcurrent_locrK   )z:%(py1)s in %(py5)s
{%(py5)s = %(py3)s.zone_spatial_grids
}r   rM   r   Úhideout_gridz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstancer   )r   rN   r!   r"   )z%(py0)s is not %(py2)sÚsanctuary_grid)r   r!   zassert %(py4)sr"   g      P@)z1%(py2)s
{%(py2)s = %(py0)s.cell_size
} == %(py5)s)r   r   ©z%(py0)s == %(py3)sÚcell_coords)Úspawn_playerr,   r-   r.   r/   r0   r1   r2   r3   r�   rP   ÚxÚyÚget_player_locationÚzone_spatial_gridsr’   r   Ú	cell_sizeÚget_cell_coords)r9   r   r�   rŒ   r:   r;   r<   r=   r?   Ú@py_format5r@   rB   rC   r�   rX   r‘   r“   Ú@py_format3r•   s                      r   Ú-test_spawn_player_in_hideout_and_spatial_gridzHTestPoE2ZoneSpawningPurity.test_spawn_player_in_hideout_and_spatial_gridp   s}  € ð
 -ˆ	Ø×&Ò& yÐ2GÑHÔHˆØÐˆs˜$ˆÐÐÐÕÔÐÐÐÐˆs˜$ÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØŒ}Ð)ˆ} 	Ò)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ} 	Ð)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆsÑ)Ô)Ð)Õ)Ô)ˆsÑ)Ô)Ð)Ð)Õ)Ô)ˆ}Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) 	Ñ)Ô)Ð)Õ)Ô) 	Ñ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)ØŒ{Ð3Ð3Ð3ˆ{Ð3Ò3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3ˆ{Ð3Ð3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆsÑ3Ô3Ð3Õ3Ô3ˆsÑ3Ô3Ð3Ð3Õ3Ô3ˆ{Ñ3Ô3Õ3Ô3Ð3Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ØŒuÐ˜Ðˆu˜Š|ÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆuÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØŒuÐ˜Ðˆu˜Š|ÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆuÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐð "×5Ò5°iÑ@Ô@ˆØÔ"Ð;Ð&;Ð;Ð"Ð&;Ò;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð"Ð&;Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆ{Ñ;Ô;Ð;Õ;Ô;ˆ{Ñ;Ô;Ð;Ð;Õ;Ô;Ð"Ñ;Ô;Õ;Ô;Ð&;Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ØŒ}Ð# Ð#ˆ} Ò#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ} Ð#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆ{Ñ#Ô#Ð#Õ#Ô#ˆ{Ñ#Ô#Ð#Ð#Õ#Ô#ˆ}Ñ#Ô#Õ#Ô# Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#ØŒ}Ð# Ð#ˆ} Ò#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ} Ð#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆ{Ñ#Ô#Ð#Õ#Ô#ˆ{Ñ#Ô#Ð#Ð#Õ#Ô#ˆ}Ñ#Ô#Õ#Ô# Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#ð %ÐF¨Ô(FÐFÐ$Ð(FÐFÐFÐFÐFÕFÔFÐFÐFÐFÐFÐ$Ð(FÐFÑFÔFÕFÔFÐ$ÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔF¨ÑFÔFÐFÕFÔF¨ÑFÔFÐFÐFÕFÔFÐ(FÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFØ)ÐK¨[Ô-KÐKÐ)Ð-KÐKÐKÐKÐKÕKÔKÐKÐKÐKÐKÐ)Ð-KÐKÑKÔKÕKÔKÐ)ÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK¨[ÑKÔKÐKÕKÔK¨[ÑKÔKÐKÐKÕKÔKÐ-KÑKÔKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKà"Ô5Ð6KÔLˆØ$Ô7Ð8RÔSˆà#'Ð'ˆ| 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ| 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆ|Ñ'Ô'Ð'Õ'Ô'ˆ|Ñ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ý˜,­Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4�zÑ4Ô4Ð4Õ4Ô4�zÑ4Ô4Ð4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4˜,Ñ4Ô4Ð4Õ4Ô4˜,Ñ4Ô4Ð4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4­Ñ4Ô4Ð4Õ4Ô4­Ñ4Ô4Ð4Ð4Õ4Ô4Ð4Ñ4Ô4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ø >Ð1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1ˆ| >Ð1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1ˆ|Ñ1Ô1Ð1Õ1Ô1ˆ|Ñ1Ô1Ð1Ð1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1 >Ñ1Ô1Ð1Õ1Ô1 >Ñ1Ô1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1ØÔ%Ð-¨Ð-Ð%¨Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð%¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆ|Ñ-Ô-Ð-Õ-Ô-ˆ|Ñ-Ô-Ð-Ð-Õ-Ô-Ð%Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð #×2Ò2°3´5¸#¼%Ñ@Ô@ˆØ$Ð$ˆ{˜fÒ$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ{˜fÐ$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆ{Ñ$Ô$Ð$Õ$Ô$ˆ{Ñ$Ô$Ð$Ð$Õ$Ô$˜fÑ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$r   c                 óp  — |j         d         }|j         d         }t          ddd¬¦  «        }|                     |¦  «         d}|j        }||v }|sªt	          j        d|fd||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j	        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        d	œz  }d
d|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}}d}|j        }||v}|sªt	          j        d|fd||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j	        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        d	œz  }d
d|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}}|                     ddd¬¦  «        }
d}||
v }|s—t	          j        d|fd||
f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j	        |
¦  «        rt	          j        |
¦  «        nddœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}|                     ddd¬¦  «        }d}||v}|s—t	          j        d|fd||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j	        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}dS )z±
        Verifies that entities within the player hideout spatial grid are isolated
        from the sanctuary encampment and cannot be observed across zone boundaries.
        rF   r   ia"  r�   )Ú	entity_idr—   r˜   rK   )z0%(py1)s in %(py5)s
{%(py5)s = %(py3)s.entities
}r‘   rM   r)   r*   N©únot in)z4%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.entities
}r“   r&   )Úradius_cells©z%(py1)s in %(py3)sÚhideout_aoi©rN   r   r   r   ©z%(py1)s not in %(py3)sÚsanctuary_aoi)rš   r   Ú
add_entityÚentitiesr,   r-   r1   r.   r/   r0   r2   r3   Úget_entities_in_aoi)r9   r   r‘   r“   Údummy_entityrX   rB   r:   r=   rC   r¦   r<   r©   s                r   Ú7test_spatial_grid_entity_isolation_hideout_vs_sanctuaryzRTestPoE2ZoneSpawningPurity.test_spatial_grid_entity_isolation_hideout_vs_sanctuary“   sÍ  € ð
 #Ô5Ð6KÔLˆØ$Ô7Ð8RÔSˆå¨°°sÐ;Ñ;Ô;ˆØ×Ò Ñ-Ô-Ð-àÐ,�|Ô,Ð,ˆtÐ,Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,ˆtÐ,Ð,Ñ,Ô,Õ,Ô,ˆtÑ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�|Ñ,Ô,Ð,Õ,Ô,�|Ñ,Ô,Ð,Ð,Õ,Ô,Ð,Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÐ2˜>Ô2Ð2ˆtÐ2Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2ˆtÐ2Ð2Ñ2Ô2Õ2Ô2ˆtÑ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2˜>Ñ2Ô2Ð2Õ2Ô2˜>Ñ2Ô2Ð2Ð2Õ2Ô2Ð2Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð #×6Ò6°s¸CÈaÐ6ÑPÔPˆØÐ"ˆt�{Ð"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆt�{Ð"Ñ"Ô"Õ"Ô"ˆtÑ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�{Ñ"Ô"Ð"Õ"Ô"�{Ñ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ð '×:Ò:¸3ÀÐRSÐ:ÑTÔTˆØÐ(ˆt˜=Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(ˆt˜=Ð(Ñ(Ô(Õ(Ô(ˆtÑ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(˜=Ñ(Ô(Ð(Õ(Ô(˜=Ñ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r   c           	      ó¶
  — d}|                      |d¦  «         |                     |dd¬¦  «        \  }}}d}||u }|s—t          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}}|j
        } ||¦  «        }
|
j        }d}||k    }|�st          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}
x}x}}|                     |dd¬¦  «        \  }}}d}||u }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}}|j
        } ||¦  «        }
|
j        }d}||k    }|�st          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}
x}x}}dS )zFVerifies bidirectional portal traversal between Sanctuary and Hideout.Úwayfarer_hideout_travelerr   Úportal_sanctuary_to_hideoutr&   )Úplayer_levelTrb   rp   Úokr   r   r   NrF   r   r”   Údest)zw%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_player_location
}(%(py3)s)
}.zone_id
} == %(py10)sr   r�   )r   r!   r   r   r*   rt   zassert %(py12)sru   rO   Úok_backÚ	dest_back)r–   Útraverse_portalr,   r-   r.   r/   r0   r1   r2   r3   r™   rP   )r9   r   r�   r³   r´   rˆ   r:   r;   r<   r=   rB   Ú@py_assert6r‚   ri   Ú@py_format11r„   rµ   r¶   s                     r   Ú1test_portal_traversal_sanctuary_hideout_roundtripzLTestPoE2ZoneSpawningPurity.test_portal_traversal_sanctuary_hideout_roundtrip©   sC  € à/ˆ	Ø× Ò  Ð,FÑGÔGÐGà!×1Ò1°)Ð=ZÐijÐ1ÑkÔk‰ˆˆD�!ØÐˆr�TˆzÐÐÐÕÔÐÐÐÐˆr�TÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ�TÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ,Ð,ˆtÐ,Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,ˆtÐ,Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆtÑ,Ô,Ð,Õ,Ô,ˆtÑ,Ô,Ð,Ð,Õ,Ô,Ð,Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,ØÔ.ÐZÐ.Ð.¨yÑ9Ô9ÐZÐ9ÔAÐZÐEZÐZÐAÐEZÒZÐZÐZÑZÕZÔZÐZÐZÐZÐZÐAÐEZÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆ{ÑZÔZÐZÕZÔZˆ{ÑZÔZÐZÐZÕZÔZÐ.ÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ¨yÑZÔZÐZÕZÔZ¨yÑZÔZÐZÐZÕZÔZÐ9ÑZÔZÕZÔZÐAÑZÔZÕZÔZÐEZÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZà +× ;Ò ;ØÐ4À1ð !<ñ !
ô !
Ñˆ�˜Að Ðˆw˜$ˆÐÐÐÕÔÐÐÐÐˆw˜$ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ6Ð6ˆyÐ6Ò6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6ˆyÐ6Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6ˆyÑ6Ô6Ð6Õ6Ô6ˆyÑ6Ô6Ð6Ð6Õ6Ô6Ð6Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6ØÔ.Ð_Ð.Ð.¨yÑ9Ô9Ð_Ð9ÔAÐ_ÐE_Ð_ÐAÐE_Ò_Ð_Ð_Ñ_Õ_Ô_Ð_Ð_Ð_Ð_ÐAÐE_Ð_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ˆ{Ñ_Ô_Ð_Õ_Ô_ˆ{Ñ_Ô_Ð_Ð_Õ_Ô_Ð.Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_¨yÑ_Ô_Ð_Õ_Ô_¨yÑ_Ô_Ð_Ð_Õ_Ô_Ð9Ñ_Ô_Õ_Ô_ÐAÑ_Ô_Õ_Ô_ÐE_Ñ_Ô_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_r   c                 ó$
  — |                      d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j	        }t          j        }||k    }|sòt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                      d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|j	        }t          j        }||k    }|sòt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|                      d¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )zEVerifies deduplicated get_zone_definition method behaves as expected.rF   Nr   r   Úhideout_defr   r   r   r   r   r	   r    r$   r%   rH   r(   r)   r*   r   Úsanctuary_defÚzone_unknown_missingrb   rp   Úinvalid_def)Úget_zone_definitionr,   r-   r.   r/   r0   r1   r2   r3   r4   r	   r5   rP   )r9   r   r¼   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r½   r¿   s                  r   Útest_clean_get_zone_definitionz9TestPoE2ZoneSpawningPurity.test_clean_get_zone_definitionº   s±  € à!×5Ò5Ð6KÑLÔLˆØ"&Ð&ˆ{ $Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ{ $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ{Ñ&Ô&Ð&Õ&Ô&ˆ{Ñ&Ô&Ð&Ð&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØÔ$Ð:­Ô(:Ð:Ð$Ð(:Ò:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð$Ð(:Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆ{Ñ:Ô:Ð:Õ:Ô:ˆ{Ñ:Ô:Ð:Ð:Õ:Ô:Ð$Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:­Ñ:Ô:Ð:Õ:Ô:­Ñ:Ô:Ð:Ð:Õ:Ô:Ð(:Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ØÔ"Ð;Ð&;Ð;Ð"Ð&;Ò;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð"Ð&;Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆ{Ñ;Ô;Ð;Õ;Ô;ˆ{Ñ;Ô;Ð;Ð;Õ;Ô;Ð"Ñ;Ô;Õ;Ô;Ð&;Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à#×7Ò7Ð8RÑSÔSˆØ$(Ð(ˆ} DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(ˆ} DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆ}Ñ(Ô(Ð(Õ(Ô(ˆ}Ñ(Ô(Ð(Ð(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(ØÔ&Ð<­(Ô*<Ð<Ð&Ð*<Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð&Ð*<Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<ˆ}Ñ<Ô<Ð<Õ<Ô<ˆ}Ñ<Ô<Ð<Ð<Õ<Ô<Ð&Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<­(Ñ<Ô<Ð<Õ<Ô<­(Ñ<Ô<Ð<Ð<Õ<Ô<Ð*<Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à!×5Ò5Ð6LÑMÔMˆØ"Ð"ˆ{˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ{˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ{Ñ"Ô"Ð"Õ"Ô"ˆ{Ñ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"r   c                 óä  — t          d¦  «        }|j        } |¦   «         }|s t          j        d¦  «        dz   dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}| 
                    d¬¦  «        }d	}||v}|s¬t          j        d
|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d¦  «        dz   d|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}}d}||v}|s¬t          j        d
|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d¦  «        dz   d|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}}dS )zË
        Regression test on client JavaScript engine:
        Guarantees that monster_system.js does NOT spawn hellhounds or skeletons
        in zone_player_hideout or zone_boundless_sanctuary.
        ú)client/webapp/js/engine/monster_system.jszmonster_system.js must existzC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Újs_pathrŽ   Núutf-8©ÚencodingÚhellhound_sanctuaryr¢   r¨   Úcontentr§   zrCRITICAL BUG: hellhound_sanctuary must NOT exist in monster_system.js! Safe zones must have zero hostile monsters.z
>assert %(py5)sr   Úskeleton_sanctuaryzqCRITICAL BUG: skeleton_sanctuary must NOT exist in monster_system.js! Safe zones must have zero hostile monsters.zisDummy: truerK   r¥   r   )r   Úexistsr,   Ú_format_assertmsgr.   r/   r0   r1   r2   r3   Ú	read_textr-   )
r9   rÄ   r;   r?   r�   rÉ   rX   r:   r<   r=   s
             r   Ú8test_client_monster_system_js_no_hostile_mobs_in_hideoutzSTestPoE2ZoneSpawningPurity.test_client_monster_system_js_no_hostile_mobs_in_hideoutÈ   sV  € õ ÐBÑCÔCˆØŒ~Ð?ˆ~ˆ~ÑÔÐ?ÐÐ?Õ?Ô?Ð!?Ñ?Ô?Ð?Ñ?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆwÑ?Ô?Ð?Õ?Ô?ˆwÑ?Ô?Ð?Ð?Õ?Ô?ˆ~Ñ?Ô?Õ?Ô?ÐÑ?Ô?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ø×#Ò#¨WÐ#Ñ5Ô5ˆð %ð 	
Ð$¨GÐ3ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð$¨Gð 	
ñ 	
ô 	
õ 	
ô 
ð %ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð -4ñ 	
ô 	
ð 	
õ 	
ô 
ð -4ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð:ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð $ð 	
Ð#¨7Ð2ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð#¨7ð 	
ñ 	
ô 	
õ 	
ô 
ð $ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð ,3ñ 	
ô 	
ð 	
õ 	
ô 
ð ,3ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð:ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð Ð)ˆ 'Ð)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ 'Ð)Ñ)Ô)Õ)Ô)ˆÑ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) 'Ñ)Ô)Ð)Õ)Ô) 'Ñ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r   c                 ó  — t          d¦  «                             d¬¦  «        }d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )zÄ
        Verifies that client/webapp/js/engine/monster_system.js implements
        safe haven gating on spawnQAEnemy and spawnSpecificMonster with the exact
        warning notification.
        rÃ   rÅ   rÆ   u=   NghiÃªm cáº¥m sáº£n sinh quÃ¡i váº­t trong khu vá»±c An ToÃ nrK   r¥   rÉ   r§   r   r   NÚisSafeHavenZoneÚnotifySafeHavenBlocked©
r   rÍ   r,   r-   r1   r.   r/   r0   r2   r3   ©r9   rÉ   rX   r:   r<   r=   s         r   Ú0test_client_spawner_blocks_hostile_in_safe_havenzKTestPoE2ZoneSpawningPurity.test_client_spawner_blocks_hostile_in_safe_havenß   s}  € õ ÐBÑCÔC×MÒMÐW^ÐMÑ_Ô_ˆØNÐYÐNÐRYÐYÐYÐYÐYÕYÔYÐYÐYÐYÐYÐNÐRYÐYÑYÔYÕYÔYÐNÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYÐRYÑYÔYÐYÕYÔYÐRYÑYÔYÐYÐYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYØ Ð+Ð  GÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð  GÐ+Ñ+Ô+Õ+Ô+Ð Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ GÑ+Ô+Ð+Õ+Ô+ GÑ+Ô+Ð+Ð+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ø'Ð2Ð'¨7Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð'¨7Ð2Ñ2Ô2Õ2Ô2Ð'Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Ð2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2r   c                 óØ  — t          d¦  «                             d¬¦  «        }d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )z„
        Verifies that worldmap_dungeons.js flushes groundDrops and flying VFX projectiles
        upon zone teleportation.
        z(client/webapp/js/ui/worldmap_dungeons.jsrÅ   rÆ   ÚclearGroundDropsrK   r¥   rÉ   r§   r   r   NÚclearVfxProjectilesrÒ   rÓ   s         r   Ú.test_client_zone_transition_drop_and_vfx_flushzITestPoE2ZoneSpawningPurity.test_client_zone_transition_drop_and_vfx_flushê   s´  € õ
 ÐAÑBÔB×LÒLÐV]ÐLÑ^Ô^ˆØ!Ð,Ð! WÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð! WÐ,Ñ,Ô,Õ,Ô,Ð!Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, WÑ,Ô,Ð,Õ,Ô, WÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ø$Ð/Ð$¨Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð$¨Ð/Ñ/Ô/Õ/Ô/Ð$Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/¨Ñ/Ô/Ð/Õ/Ô/¨Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r   c                 óØ  — t          d¦  «                             d¬¦  «        }d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )zg
        Verifies that monster_loot_dropper.js exposes clearGroundDrops and blocks dummy loot.
        z/client/webapp/js/engine/monster_loot_dropper.jsrÅ   rÆ   rÖ   rK   r¥   rÉ   r§   r   r   Nzmonster.isDummyrÒ   rÓ   s         r   Ú3test_client_monster_loot_dropper_clear_ground_dropszNTestPoE2ZoneSpawningPurity.test_client_monster_loot_dropper_clear_ground_dropsó   s´  € õ ÐHÑIÔI×SÒSÐ]dÐSÑeÔeˆØ!Ð,Ð! WÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð! WÐ,Ñ,Ô,Õ,Ô,Ð!Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, WÑ,Ô,Ð,Õ,Ô, WÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ø Ð+Ð  GÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð  GÐ+Ñ+Ô+Õ+Ô+Ð Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ GÑ+Ô+Ð+Õ+Ô+ GÑ+Ô+Ð+Ð+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r   c                 óØ  — t          d¦  «                             d¬¦  «        }d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )zV
        Verifies that vfx_renderer.js exports clearVfxProjectiles to window.
        z'client/webapp/js/engine/vfx_renderer.jsrÅ   rÆ   r×   rK   r¥   rÉ   r§   r   r   Nz1window.clearVfxProjectiles = clearVfxProjectiles;rÒ   rÓ   s         r   Ú.test_client_vfx_renderer_clear_vfx_projectileszITestPoE2ZoneSpawningPurity.test_client_vfx_renderer_clear_vfx_projectilesû   s´  € õ Ð@ÑAÔA×KÒKÐU\ÐKÑ]Ô]ˆØ$Ð/Ð$¨Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð$¨Ð/Ñ/Ô/Õ/Ô/Ð$Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/¨Ñ/Ô/Ð/Õ/Ô/¨Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/ØBÐMÐBÀgÐMÐMÐMÐMÕMÔMÐMÐMÐMÐMÐBÀgÐMÑMÔMÕMÔMÐBÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMÀgÑMÔMÐMÕMÔMÀgÑMÔMÐMÐMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMr   )r
   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rD   rY   r`   rm   r‰   rŸ   r®   rº   rÁ   rÎ   rÔ   rØ   rÚ   rÜ   r   r   r   r   r      sÒ  € € € € € ØHÐHð(Àð (ÐPTð (ð (ð (ð (ð@Àjð @ÐUYð @ð @ð @ð @ð>Àzð >ÐVZð >ð >ð >ð >ðZÀ
ð ZÈtð Zð Zð Zð Zð' À:ð ' ÐRVð ' ð ' ð ' ð ' ðR!%Èð !%ÐX\ð !%ð !%ð !%ð !%ðF)ÐS]ð )Ðbfð )ð )ð )ð )ð,`ÈZð `Ð\`ð `ð `ð `ð `ð"#¸*ð #Èð #ð #ð #ð #ð*ð *ð *ð *ð.	3ð 	3ð 	3ð 	3ð0ð 0ð 0ð 0ð,ð ,ð ,ð ,ðNð Nð Nð Nð Nð Nr   r   )rà   Úbuiltinsr.   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter,   Úpathlibr   ÚpytestÚserver.world.spatial_gridr   r   Úserver.world.zone_enginer   Úserver.world.zone_typesr   r	   Úfixturer   r   r   r   r   ú<module>rë      sø   ððð ð € € € € € € € € € € € € Ð Ð Ð Ð Ð Ð Ø €€€à 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø /Ð /Ð /Ð /Ð /Ð /Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ð „ð�Zð ð ð ñ „ððjNð jNð jNð jNð jNñ jNô jNð jNð jNð jNr   