From 1d4512590e0b78355e5c10174a9c6749e1098a72 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:09:09 +0100 Subject: [PATCH 01/34] requirements.txt: _ instead of - to make PyCharm happy (#3043) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9531e3058e8a..d1a7b763f37f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,4 @@ certifi>=2023.11.17 cython>=3.0.8 cymem>=2.0.8 orjson>=3.9.10 -typing-extensions>=4.7.0 +typing_extensions>=4.7.0 From ca1812181106a3645e7f7af417590024b377b25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Thu, 28 Mar 2024 04:27:49 -0400 Subject: [PATCH 02/34] Stardew Valley: Fix generation fail with SVE and entrance rando when Wizard Tower is in place of Sprite Spring (#2970) --- worlds/stardew_valley/data/villagers_data.py | 11 ++++++----- worlds/stardew_valley/logic/logic.py | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/worlds/stardew_valley/data/villagers_data.py b/worlds/stardew_valley/data/villagers_data.py index ae6a346d56d7..718bce743b1c 100644 --- a/worlds/stardew_valley/data/villagers_data.py +++ b/worlds/stardew_valley/data/villagers_data.py @@ -13,9 +13,9 @@ class Villager: name: str bachelor: bool - locations: Tuple[str] + locations: Tuple[str, ...] birthday: str - gifts: Tuple[str] + gifts: Tuple[str, ...] available: bool mod_name: str @@ -366,10 +366,11 @@ def villager(name: str, bachelor: bool, locations: Tuple[str, ...], birthday: st return npc -def make_bachelor(mod_name: str, npc: Villager): +def adapt_wizard_to_sve(mod_name: str, npc: Villager): if npc.mod_name: mod_name = npc.mod_name - return Villager(npc.name, True, npc.locations, npc.birthday, npc.gifts, npc.available, mod_name) + # The wizard leaves his tower on sunday, for like 1 hour... Good enough to meet him! + return Villager(npc.name, True, npc.locations + forest, npc.birthday, npc.gifts, npc.available, mod_name) def register_villager_modification(mod_name: str, npc: Villager, modification_function): @@ -452,7 +453,7 @@ def register_villager_modification(mod_name: str, npc: Villager, modification_fu # Modified villagers; not included in all villagers -register_villager_modification(ModNames.sve, wizard, make_bachelor) +register_villager_modification(ModNames.sve, wizard, adapt_wizard_to_sve) all_villagers_by_name: Dict[str, Villager] = {villager.name: villager for villager in all_villagers} all_villagers_by_mod: Dict[str, List[Villager]] = {} diff --git a/worlds/stardew_valley/logic/logic.py b/worlds/stardew_valley/logic/logic.py index 1c79e9345930..a7fcec922838 100644 --- a/worlds/stardew_valley/logic/logic.py +++ b/worlds/stardew_valley/logic/logic.py @@ -546,6 +546,7 @@ def can_succeed_luau_soup(self) -> StardewRule: def can_succeed_grange_display(self) -> StardewRule: if self.options.festival_locations != FestivalLocations.option_hard: return True_() + animal_rule = self.animal.has_animal(Generic.any) artisan_rule = self.artisan.can_keg(Generic.any) | self.artisan.can_preserves_jar(Generic.any) cooking_rule = self.money.can_spend_at(Region.saloon, 220) # Salads at the bar are good enough From cf133dde7275e171d388fb466b9ed719ab7ed7c8 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Thu, 28 Mar 2024 02:32:27 -0600 Subject: [PATCH 03/34] Pokemon Emerald: Fix typo (#3020) --- worlds/pokemon_emerald/data.py | 2 +- worlds/pokemon_emerald/data/locations.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/pokemon_emerald/data.py b/worlds/pokemon_emerald/data.py index c4f7d7711c81..786740a9e48f 100644 --- a/worlds/pokemon_emerald/data.py +++ b/worlds/pokemon_emerald/data.py @@ -646,7 +646,7 @@ def _init() -> None: ("SPECIES_CHIKORITA", "Chikorita", 152), ("SPECIES_BAYLEEF", "Bayleef", 153), ("SPECIES_MEGANIUM", "Meganium", 154), - ("SPECIES_CYNDAQUIL", "Cindaquil", 155), + ("SPECIES_CYNDAQUIL", "Cyndaquil", 155), ("SPECIES_QUILAVA", "Quilava", 156), ("SPECIES_TYPHLOSION", "Typhlosion", 157), ("SPECIES_TOTODILE", "Totodile", 158), diff --git a/worlds/pokemon_emerald/data/locations.json b/worlds/pokemon_emerald/data/locations.json index fdaec9b83ca0..d654119ad635 100644 --- a/worlds/pokemon_emerald/data/locations.json +++ b/worlds/pokemon_emerald/data/locations.json @@ -2497,7 +2497,7 @@ "tags": ["Pokedex"] }, "POKEDEX_REWARD_155": { - "label": "Pokedex - Cindaquil", + "label": "Pokedex - Cyndaquil", "tags": ["Pokedex"] }, "POKEDEX_REWARD_156": { From 14f5f0127eb753eaf0431a54bebc82f5e74a1cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Thu, 28 Mar 2024 04:42:35 -0400 Subject: [PATCH 04/34] Stardew Valley: Fix potential soft lock with vanilla tools and entrance randomizer + Performance improvement for vanilla tool/skills (#3002) * fix vanilla tool fishing rod requiring metal bars fix vanilla skill requiring previous level (it's always the same rule or more restrictive) * add test to ensure fishing rod need fish shop * fishing rod should be indexed from 0 like a mentally sane person would do. * fishing rod 0 isn't real, but it definitely can hurt you. * reeeeeeeee --- worlds/stardew_valley/logic/fishing_logic.py | 3 +- worlds/stardew_valley/logic/skill_logic.py | 12 ++++- worlds/stardew_valley/logic/tool_logic.py | 20 +++++--- worlds/stardew_valley/test/TestRules.py | 49 ++++++++++++++++++++ 4 files changed, 75 insertions(+), 9 deletions(-) diff --git a/worlds/stardew_valley/logic/fishing_logic.py b/worlds/stardew_valley/logic/fishing_logic.py index 65b3cdc2ac88..a7399a65d99c 100644 --- a/worlds/stardew_valley/logic/fishing_logic.py +++ b/worlds/stardew_valley/logic/fishing_logic.py @@ -73,7 +73,8 @@ def can_catch_quality_fish(self, fish_quality: str) -> StardewRule: return rod_rule & self.logic.skill.has_level(Skill.fishing, 4) if fish_quality == FishQuality.iridium: return rod_rule & self.logic.skill.has_level(Skill.fishing, 10) - return False_() + + raise ValueError(f"Quality {fish_quality} is unknown.") def can_catch_every_fish(self) -> StardewRule: rules = [self.has_max_fishing()] diff --git a/worlds/stardew_valley/logic/skill_logic.py b/worlds/stardew_valley/logic/skill_logic.py index 9134dfae40bf..35946a0a4d36 100644 --- a/worlds/stardew_valley/logic/skill_logic.py +++ b/worlds/stardew_valley/logic/skill_logic.py @@ -44,10 +44,14 @@ def can_earn_level(self, skill: str, level: int) -> StardewRule: tool_material = ToolMaterial.tiers[tool_level] months = max(1, level - 1) months_rule = self.logic.time.has_lived_months(months) - previous_level_rule = self.logic.skill.has_level(skill, level - 1) + + if self.options.skill_progression != options.SkillProgression.option_vanilla: + previous_level_rule = self.logic.skill.has_level(skill, level - 1) + else: + previous_level_rule = True_() if skill == Skill.fishing: - xp_rule = self.logic.tool.has_tool(Tool.fishing_rod, ToolMaterial.tiers[max(tool_level, 3)]) + xp_rule = self.logic.tool.has_fishing_rod(max(tool_level, 1)) elif skill == Skill.farming: xp_rule = self.logic.tool.has_tool(Tool.hoe, tool_material) & self.logic.tool.can_water(tool_level) elif skill == Skill.foraging: @@ -137,13 +141,17 @@ def can_get_fishing_xp(self) -> StardewRule: def can_fish(self, regions: Union[str, Tuple[str, ...]] = None, difficulty: int = 0) -> StardewRule: if isinstance(regions, str): regions = regions, + if regions is None or len(regions) == 0: regions = fishing_regions + skill_required = min(10, max(0, int((difficulty / 10) - 1))) if difficulty <= 40: skill_required = 0 + skill_rule = self.logic.skill.has_level(Skill.fishing, skill_required) region_rule = self.logic.region.can_reach_any(regions) + # Training rod only works with fish < 50. Fiberglass does not help you to catch higher difficulty fish, so it's skipped in logic. number_fishing_rod_required = 1 if difficulty < 50 else (2 if difficulty < 80 else 4) return self.logic.tool.has_fishing_rod(number_fishing_rod_required) & skill_rule & region_rule diff --git a/worlds/stardew_valley/logic/tool_logic.py b/worlds/stardew_valley/logic/tool_logic.py index def02b35dab6..1b1dc2a52120 100644 --- a/worlds/stardew_valley/logic/tool_logic.py +++ b/worlds/stardew_valley/logic/tool_logic.py @@ -12,10 +12,14 @@ from ..stardew_rule import StardewRule, True_, False_ from ..strings.ap_names.skill_level_names import ModSkillLevel from ..strings.region_names import Region -from ..strings.skill_names import ModSkill from ..strings.spells import MagicSpell from ..strings.tool_names import ToolMaterial, Tool +fishing_rod_prices = { + 3: 1800, + 4: 7500, +} + tool_materials = { ToolMaterial.copper: 1, ToolMaterial.iron: 2, @@ -40,27 +44,31 @@ def __init__(self, *args, **kwargs): class ToolLogic(BaseLogic[Union[ToolLogicMixin, HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, MoneyLogicMixin, MagicLogicMixin]]): # Should be cached def has_tool(self, tool: str, material: str = ToolMaterial.basic) -> StardewRule: + assert tool != Tool.fishing_rod, "Use `has_fishing_rod` instead of `has_tool`." + if material == ToolMaterial.basic or tool == Tool.scythe: return True_() if self.options.tool_progression & ToolProgression.option_progressive: return self.logic.received(f"Progressive {tool}", tool_materials[material]) - return self.logic.has(f"{material} Bar") & self.logic.money.can_spend(tool_upgrade_prices[material]) + return self.logic.has(f"{material} Bar") & self.logic.money.can_spend_at(Region.blacksmith, tool_upgrade_prices[material]) def can_use_tool_at(self, tool: str, material: str, region: str) -> StardewRule: return self.has_tool(tool, material) & self.logic.region.can_reach(region) @cache_self1 def has_fishing_rod(self, level: int) -> StardewRule: + assert 1 <= level <= 4, "Fishing rod 0 isn't real, it can't hurt you. Training is 1, Bamboo is 2, Fiberglass is 3 and Iridium is 4." + if self.options.tool_progression & ToolProgression.option_progressive: return self.logic.received(f"Progressive {Tool.fishing_rod}", level) - if level <= 1: + if level <= 2: + # We assume you always have access to the Bamboo pole, because mod side there is a builtin way to get it back. return self.logic.region.can_reach(Region.beach) - prices = {2: 500, 3: 1800, 4: 7500} - level = min(level, 4) - return self.logic.money.can_spend_at(Region.fish_shop, prices[level]) + + return self.logic.money.can_spend_at(Region.fish_shop, fishing_rod_prices[level]) # Should be cached def can_forage(self, season: Union[str, Iterable[str]], region: str = Region.forest, need_hoe: bool = False) -> StardewRule: diff --git a/worlds/stardew_valley/test/TestRules.py b/worlds/stardew_valley/test/TestRules.py index 0d2fc38a19a3..787e0ce39c3e 100644 --- a/worlds/stardew_valley/test/TestRules.py +++ b/worlds/stardew_valley/test/TestRules.py @@ -8,6 +8,7 @@ FriendsanityHeartSize, BundleRandomization, SkillProgression from ..strings.entrance_names import Entrance from ..strings.region_names import Region +from ..strings.tool_names import Tool, ToolMaterial class TestProgressiveToolsLogic(SVTestBase): @@ -596,6 +597,54 @@ def swap_museum_and_bathhouse(multiworld, player): bathhouse_entrance.connect(museum_region) +class TestToolVanillaRequiresBlacksmith(SVTestBase): + options = { + options.EntranceRandomization: options.EntranceRandomization.option_buildings, + options.ToolProgression: options.ToolProgression.option_vanilla, + } + seed = 4111845104987680262 + + # Seed is hardcoded to make sure the ER is a valid roll that actually lock the blacksmith behind the Railroad Boulder Removed. + + def test_cannot_get_any_tool_without_blacksmith_access(self): + railroad_item = "Railroad Boulder Removed" + place_region_at_entrance(self.multiworld, self.player, Region.blacksmith, Entrance.enter_bathhouse_entrance) + collect_all_except(self.multiworld, railroad_item) + + for tool in [Tool.pickaxe, Tool.axe, Tool.hoe, Tool.trash_can, Tool.watering_can]: + for material in [ToolMaterial.copper, ToolMaterial.iron, ToolMaterial.gold, ToolMaterial.iridium]: + self.assert_rule_false(self.world.logic.tool.has_tool(tool, material), self.multiworld.state) + + self.multiworld.state.collect(self.world.create_item(railroad_item), event=False) + + for tool in [Tool.pickaxe, Tool.axe, Tool.hoe, Tool.trash_can, Tool.watering_can]: + for material in [ToolMaterial.copper, ToolMaterial.iron, ToolMaterial.gold, ToolMaterial.iridium]: + self.assert_rule_true(self.world.logic.tool.has_tool(tool, material), self.multiworld.state) + + def test_cannot_get_fishing_rod_without_willy_access(self): + railroad_item = "Railroad Boulder Removed" + place_region_at_entrance(self.multiworld, self.player, Region.fish_shop, Entrance.enter_bathhouse_entrance) + collect_all_except(self.multiworld, railroad_item) + + for fishing_rod_level in [3, 4]: + self.assert_rule_false(self.world.logic.tool.has_fishing_rod(fishing_rod_level), self.multiworld.state) + + self.multiworld.state.collect(self.world.create_item(railroad_item), event=False) + + for fishing_rod_level in [3, 4]: + self.assert_rule_true(self.world.logic.tool.has_fishing_rod(fishing_rod_level), self.multiworld.state) + + +def place_region_at_entrance(multiworld, player, region, entrance): + region_to_place = multiworld.get_region(region, player) + entrance_to_place_region = multiworld.get_entrance(entrance, player) + + entrance_to_switch = region_to_place.entrances[0] + region_to_switch = entrance_to_place_region.connected_region + entrance_to_switch.connect(region_to_switch) + entrance_to_place_region.connect(region_to_place) + + def collect_all_except(multiworld, item_to_not_collect: str): for item in multiworld.get_items(): if item.name != item_to_not_collect: From d0ac2b744eac438570e6a2333e76fa212be66534 Mon Sep 17 00:00:00 2001 From: panicbit Date: Thu, 28 Mar 2024 10:11:26 +0100 Subject: [PATCH 05/34] LADX: fix local and non-local instrument placement (#2987) * LADX: fix local and non-local instrument placement * change confusing variable name --- worlds/ladx/__init__.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/worlds/ladx/__init__.py b/worlds/ladx/__init__.py index 9de3462ad059..d662b526bb61 100644 --- a/worlds/ladx/__init__.py +++ b/worlds/ladx/__init__.py @@ -184,19 +184,22 @@ def create_items(self) -> None: self.pre_fill_items = [] # For any and different world, set item rule instead - for option in ["maps", "compasses", "small_keys", "nightmare_keys", "stone_beaks", "instruments"]: - option = "shuffle_" + option + for dungeon_item_type in ["maps", "compasses", "small_keys", "nightmare_keys", "stone_beaks", "instruments"]: + option = "shuffle_" + dungeon_item_type option = self.player_options[option] dungeon_item_types[option.ladxr_item] = option.value + # The color dungeon does not contain an instrument + num_items = 8 if dungeon_item_type == "instruments" else 9 + if option.value == DungeonItemShuffle.option_own_world: self.multiworld.local_items[self.player].value |= { - ladxr_item_to_la_item_name[f"{option.ladxr_item}{i}"] for i in range(1, 10) + ladxr_item_to_la_item_name[f"{option.ladxr_item}{i}"] for i in range(1, num_items + 1) } elif option.value == DungeonItemShuffle.option_different_world: self.multiworld.non_local_items[self.player].value |= { - ladxr_item_to_la_item_name[f"{option.ladxr_item}{i}"] for i in range(1, 10) + ladxr_item_to_la_item_name[f"{option.ladxr_item}{i}"] for i in range(1, num_items + 1) } # option_original_dungeon = 0 # option_own_dungeons = 1 From 01cdb0d761a82349afaeb7222b4b59cb1766f4a0 Mon Sep 17 00:00:00 2001 From: PoryGone <98504756+PoryGone@users.noreply.github.com> Date: Thu, 28 Mar 2024 09:44:23 -0400 Subject: [PATCH 06/34] SMW: Update World Doc for v2.0 Features (#3034) Co-authored-by: Scipio Wright --- worlds/smw/docs/en_Super Mario World.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/worlds/smw/docs/en_Super Mario World.md b/worlds/smw/docs/en_Super Mario World.md index 26623bac83d3..f7a12839df4d 100644 --- a/worlds/smw/docs/en_Super Mario World.md +++ b/worlds/smw/docs/en_Super Mario World.md @@ -25,10 +25,16 @@ There are two goals which can be chosen: ## What items and locations get shuffled? -Each unique level exit awards a location check. Optionally, collecting five Dragon Coins in each level can also award a location check. +Each unique level exit awards a location check. Additionally, the following in-level actions can be set to award a location check: +- Collecting Five Dragon Coins +- Collecting 3-Up Moons +- Activating Bonus Blocks +- Receiving Hidden 1-Ups +- Hitting Blocks containing coins or items + Mario's various abilities and powerups as described above are placed into the item pool. If the player is playing Yoshi Egg Hunt, a certain number of Yoshi Eggs will be placed into the item pool. -Any additional items that are needed to fill out the item pool with be 1-Up Mushrooms. +Any additional items that are needed to fill out the item pool will be 1-Up Mushrooms, bundles of coins, or, if enabled, various trap items. ## Which items can be in another player's world? From db15dd4bde442aad99048224bdb0d7dc28c26717 Mon Sep 17 00:00:00 2001 From: chandler05 <66492208+chandler05@users.noreply.github.com> Date: Thu, 28 Mar 2024 08:45:19 -0500 Subject: [PATCH 07/34] A Short Hike: Fix incorrect info in docs (#3016) --- worlds/shorthike/docs/en_A Short Hike.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/worlds/shorthike/docs/en_A Short Hike.md b/worlds/shorthike/docs/en_A Short Hike.md index 516bf28e47fc..11b5b4b8ca85 100644 --- a/worlds/shorthike/docs/en_A Short Hike.md +++ b/worlds/shorthike/docs/en_A Short Hike.md @@ -26,5 +26,4 @@ To achieve the Help Everyone goal, the following characters will need to be help ## Can I have more than one save at a time? -No, unfortunately only one save slot is available for use in A Short Hike. -Starting a new save will erase the old one _permanently_. \ No newline at end of file +You can have up to 3 saves at a time. To switch between them, use the Save Data button in the options menu. From fa93488f3fceac6c2f51851766543cab3ba121e6 Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Thu, 28 Mar 2024 09:46:00 -0400 Subject: [PATCH 08/34] Docs: Consistent naming for "connection plando" (#2994) --- worlds/generic/docs/plando_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/generic/docs/plando_en.md b/worlds/generic/docs/plando_en.md index d6a09cf4e610..161b1e465b33 100644 --- a/worlds/generic/docs/plando_en.md +++ b/worlds/generic/docs/plando_en.md @@ -201,7 +201,7 @@ Kirby's Dream Land 3: As this is currently only supported by A Link to the Past, instead of finding an explanation here, please refer to the relevant guide: [A Link to the Past Plando Guide](/tutorial/A%20Link%20to%20the%20Past/plando/en) -## Connections Plando +## Connection Plando This is currently only supported by a few games, including A Link to the Past, Minecraft, and Ocarina of Time. As the way that these games interact with their connections is different, only the basics are explained here. More specific information for connection plando in A Link to the Past can be found in From bcf223081facd030aa706dc7430a72bcf2fdadc9 Mon Sep 17 00:00:00 2001 From: t3hf1gm3nt <59876300+t3hf1gm3nt@users.noreply.github.com> Date: Thu, 28 Mar 2024 09:54:56 -0400 Subject: [PATCH 09/34] TLOZ: Fix markdown issue with game info page (#2985) --- worlds/tloz/docs/en_The Legend of Zelda.md | 1 - 1 file changed, 1 deletion(-) diff --git a/worlds/tloz/docs/en_The Legend of Zelda.md b/worlds/tloz/docs/en_The Legend of Zelda.md index 938496a161ae..96b613673f00 100644 --- a/worlds/tloz/docs/en_The Legend of Zelda.md +++ b/worlds/tloz/docs/en_The Legend of Zelda.md @@ -41,7 +41,6 @@ filler and useful items will cost less, and uncategorized items will be in the m - Pressing Select will cycle through your inventory. - Shop purchases are tracked within sessions, indicated by the item being elevated from its normal position. - What slots from a Take Any Cave have been chosen are similarly tracked. -- ## Local Unique Commands From 9182fe563fc18ed4ccaa8370cfed88407140398e Mon Sep 17 00:00:00 2001 From: Entropynines <163603868+Entropynines@users.noreply.github.com> Date: Thu, 28 Mar 2024 06:56:35 -0700 Subject: [PATCH 10/34] README: Remove outdated information about launchers (#2966) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 905c731b643a..cbfdf75f05b7 100644 --- a/README.md +++ b/README.md @@ -86,9 +86,9 @@ We recognize that there is a strong community of incredibly smart people that ha Archipelago was directly forked from bonta0's `multiworld_31` branch of ALttPEntranceRandomizer (this project has a long legacy of its own, please check it out linked above) on January 12, 2020. The repository was then named to _MultiWorld-Utilities_ to better encompass its intended function. As Archipelago matured, then known as "Berserker's MultiWorld" by some, we found it necessary to transform our repository into a root level repository (as opposed to a 'forked repo') and change the name (which came later) to better reflect our project. ## Running Archipelago -For most people all you need to do is head over to the [releases](https://github.com/ArchipelagoMW/Archipelago/releases) page then download and run the appropriate installer. The installers function on Windows only. +For most people, all you need to do is head over to the [releases](https://github.com/ArchipelagoMW/Archipelago/releases) page then download and run the appropriate installer, or AppImage for Linux-based systems. -If you are running Archipelago from a non-Windows system then the likely scenario is that you are comfortable running source code directly. Please see our doc on [running Archipelago from source](docs/running%20from%20source.md). +If you are a developer or are running on a platform with no compiled releases available, please see our doc on [running Archipelago from source](docs/running%20from%20source.md). ## Related Repositories This project makes use of multiple other projects. We wouldn't be here without these other repositories and the contributions of their developers, past and present. From 17748a4bf1cfd5cc11c6596a09ffc1f01434340f Mon Sep 17 00:00:00 2001 From: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> Date: Thu, 28 Mar 2024 10:00:10 -0400 Subject: [PATCH 11/34] Launcher, Docs: Update UI and Set-Up Guide to Reference Options (#2950) --- Launcher.py | 2 +- worlds/generic/docs/setup_en.md | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Launcher.py b/Launcher.py index 890957958391..9fd5d91df042 100644 --- a/Launcher.py +++ b/Launcher.py @@ -100,7 +100,7 @@ def update_settings(): # Functions Component("Open host.yaml", func=open_host_yaml), Component("Open Patch", func=open_patch), - Component("Generate Template Settings", func=generate_yamls), + Component("Generate Template Options", func=generate_yamls), Component("Discord Server", icon="discord", func=lambda: webbrowser.open("https://discord.gg/8Z65BR2")), Component("18+ Discord Server", icon="discord", func=lambda: webbrowser.open("https://discord.gg/fqvNCCRsu4")), Component("Browse Files", func=browse_files), diff --git a/worlds/generic/docs/setup_en.md b/worlds/generic/docs/setup_en.md index b99cdbc0fe54..ef2413378960 100644 --- a/worlds/generic/docs/setup_en.md +++ b/worlds/generic/docs/setup_en.md @@ -39,7 +39,7 @@ to your Archipelago installation. ### What is a YAML? YAML is the file format which Archipelago uses in order to configure a player's world. It allows you to dictate which -game you will be playing as well as the settings you would like for that game. +game you will be playing as well as the options you would like for that game. YAML is a format very similar to JSON however it is made to be more human-readable. If you are ever unsure of the validity of your YAML file you may check the file by uploading it to the check page on the Archipelago website: @@ -48,10 +48,10 @@ validity of your YAML file you may check the file by uploading it to the check p ### Creating a YAML YAML files may be generated on the Archipelago website by visiting the [games page](/games) and clicking the -"Settings Page" link under the relevant game. Clicking "Export Settings" in a game's settings page will download the +"Options Page" link under the relevant game. Clicking "Export Options" in a game's options page will download the YAML to your system. -Alternatively, you can run `ArchipelagoLauncher.exe` and click on `Generate Template Settings` to create a set of template +Alternatively, you can run `ArchipelagoLauncher.exe` and click on `Generate Template Options` to create a set of template YAMLs for each game in your Archipelago install (including for APWorlds). These will be placed in your `Players/Templates` folder. In a multiworld there must be one YAML per world. Any number of players can play on each world using either the game's @@ -66,17 +66,17 @@ each player is planning on playing their own game then they will each need a YAM #### On the website The easiest way to get started playing an Archipelago generated game, after following the base setup from the game's -setup guide, is to find the game on the [Archipelago Games List](/games), click on `Settings Page`, set the settings for +setup guide, is to find the game on the [Archipelago Games List](/games), click on `Options Page`, set the options for how you want to play, and click `Generate Game` at the bottom of the page. This will create a page for the seed, from which you can create a room, and then [connect](#connecting-to-an-archipelago-server). -If you have downloaded the settings, or have created a settings file manually, this file can be uploaded on the +If you have downloaded the options, or have created an options file manually, this file can be uploaded on the [Generation Page](/generate) where you can also set any specific hosting settings. #### On your local installation To generate a game on your local machine, make sure to install the Archipelago software. Navigate to your Archipelago -installation (usually C:\ProgramData\Archipelago), and place the settings file you have either created or downloaded +installation (usually C:\ProgramData\Archipelago), and place the options file you have either created or downloaded from the website in the `Players` folder. Run `ArchipelagoGenerate.exe`, or click on `Generate` in the launcher, and it will inform you whether the generation @@ -97,7 +97,7 @@ resources, and host the resulting multiworld on the website. #### Gather All Player YAMLs -All players that wish to play in the generated multiworld must have a YAML file which contains the settings that they +All players that wish to play in the generated multiworld must have a YAML file which contains the options that they wish to play with. One person should gather all files from all participants in the generated multiworld. It is possible for a single player to have multiple games, or even multiple slots of a single game, but each YAML must have a unique player name. @@ -129,7 +129,7 @@ need the corresponding ROM files. Sometimes there are various settings that you may want to change before rolling a seed such as enabling race mode, auto-release, plando support, or setting a password. -All of these settings, plus other options, may be changed by modifying the `host.yaml` file in the Archipelago +All of these settings, plus more, can be changed by modifying the `host.yaml` file in the Archipelago installation folder. You can quickly access this file by clicking on `Open host.yaml` in the launcher. The settings chosen here are baked into the `.archipelago` file that gets output with the other files after generation, so if you are rolling locally, ensure this file is edited to your liking **before** rolling the seed. This file is overwritten @@ -207,4 +207,4 @@ when creating your [YAML file](#creating-a-yaml). If the game is hosted on the w room page. The name is case-sensitive. * `Password` is the password set by the host in order to join the multiworld. By default, this will be empty and is almost never required, but one can be set when generating the game. Generally, leave this field blank when it exists, -unless you know that a password was set, and what that password is. \ No newline at end of file +unless you know that a password was set, and what that password is. From 4d954afd9b2311248083fc389ac737995985be86 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Thu, 28 Mar 2024 10:11:20 -0400 Subject: [PATCH 12/34] TUNIC: Add link to AP plando guide to connection plando section of game page (#2993) --- worlds/tunic/docs/en_TUNIC.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worlds/tunic/docs/en_TUNIC.md b/worlds/tunic/docs/en_TUNIC.md index ad328999ac0c..f1e0056041bb 100644 --- a/worlds/tunic/docs/en_TUNIC.md +++ b/worlds/tunic/docs/en_TUNIC.md @@ -86,3 +86,5 @@ Notes: - There is no limit to the number of Shops hard-coded into place. - If you have more than one shop in a scene, you may be wrong warped when exiting a shop. - If you have a shop in every scene, and you have an odd number of shops, it will error out. + +See the [Archipelago Plando Guide](../../../tutorial/Archipelago/plando/en) for more information on Plando and Connection Plando. From cfc1541be9e92f1f59b21f4a81f96fc88f4d9f7e Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:19:32 +0100 Subject: [PATCH 13/34] Docs: Mention the "last received item index" paradigm in the network protocol docs (#2989) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- docs/network protocol.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/network protocol.md b/docs/network protocol.md index 9f2c07883b9d..604ff6708fca 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -31,6 +31,9 @@ There are also a number of community-supported libraries available that implemen | GameMaker: Studio 2.x+ | [see Discord](https://discord.com/channels/731205301247803413/1166418532519653396) | | ## Synchronizing Items +After a client connects, it will receive all previously collected items for its associated slot in a [ReceivedItems](#ReceivedItems) packet. This will include items the client may have already processed in a previous play session. +To ensure the client is able to reject those items if it needs to, each item in the packet has an associated `index` argument. You will need to find a way to save the "last processed item index" to the player's local savegame, a local file, or something to that effect. Before connecting, you should load that "last processed item index" value and compare against it in your received items handling. + When the client receives a [ReceivedItems](#ReceivedItems) packet, if the `index` argument does not match the next index that the client expects then it is expected that the client will re-sync items with the server. This can be accomplished by sending the server a [Sync](#Sync) packet and then a [LocationChecks](#LocationChecks) packet. Even if the client detects a desync, it can still accept the items provided in this packet to prevent gameplay interruption. From 77311719fa0fa5b67fe92f437c3cfed16bd5136f Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Thu, 28 Mar 2024 15:38:34 +0100 Subject: [PATCH 14/34] SC2: Fix HERC upgrades (#3044) --- WebHostLib/templates/tracker__Starcraft2.html | 3 ++- WebHostLib/tracker.py | 1 + worlds/sc2/Items.py | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/WebHostLib/templates/tracker__Starcraft2.html b/WebHostLib/templates/tracker__Starcraft2.html index 089e7d6c2239..d365d126338d 100644 --- a/WebHostLib/templates/tracker__Starcraft2.html +++ b/WebHostLib/templates/tracker__Starcraft2.html @@ -294,7 +294,8 @@

{{ player_name }}'s Starcraft 2 Tracker

{{ sc2_icon('HERC') }} {{ sc2_icon('Juggernaut Plating (HERC)') }} {{ sc2_icon('Kinetic Foam (HERC)') }} - + {{ sc2_icon('Resource Efficiency (HERC)') }} + {{ sc2_icon('Widow Mine') }} {{ sc2_icon('Drilling Claws (Widow Mine)') }} {{ sc2_icon('Concealment (Widow Mine)') }} diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 95bca57493c2..5b246e5aeef0 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -1674,6 +1674,7 @@ def render_Starcraft2_tracker(tracker_data: TrackerData, team: int, player: int) "Resource Efficiency (Spectre)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", "Juggernaut Plating (HERC)": organics_icon_base_url + "JuggernautPlating.png", "Kinetic Foam (HERC)": organics_icon_base_url + "KineticFoam.png", + "Resource Efficiency (HERC)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", "Hellion": "https://static.wikia.nocookie.net/starcraft/images/5/56/Hellion_SC2_Icon1.jpg", "Vulture": github_icon_base_url + "blizzard/btn-unit-terran-vulture.png", diff --git a/worlds/sc2/Items.py b/worlds/sc2/Items.py index 85fb34e875af..8277d0e7e13d 100644 --- a/worlds/sc2/Items.py +++ b/worlds/sc2/Items.py @@ -661,11 +661,11 @@ def get_full_item_list(): description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("HERC")), ItemNames.HERC_JUGGERNAUT_PLATING: ItemData(285 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 16, SC2Race.TERRAN, - parent_item=ItemNames.WARHOUND, origin={"ext"}, + parent_item=ItemNames.HERC, origin={"ext"}, description="Increases HERC armor by 2."), ItemNames.HERC_KINETIC_FOAM: ItemData(286 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 17, SC2Race.TERRAN, - parent_item=ItemNames.WARHOUND, origin={"ext"}, + parent_item=ItemNames.HERC, origin={"ext"}, description="Increases HERC life by 50."), ItemNames.HELLION_TWIN_LINKED_FLAMETHROWER: From 80d7ac416493a540548aad67981202a1483b5e53 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 28 Mar 2024 09:41:32 -0500 Subject: [PATCH 15/34] KDL3: RC1 Fixes and Enhancement (#3022) * fix cloudy park 4 rule, zero deathlink message * remove redundant door_shuffle bool when generic ER gets in, this whole function gets rewritten. So just clean it a little now. * properly fix deathlink messages, fix fill error * update docs --- worlds/kdl3/Client.py | 17 +++-- worlds/kdl3/Regions.py | 85 +++++++++++---------- worlds/kdl3/Rules.py | 2 +- worlds/kdl3/docs/en_Kirby's Dream Land 3.md | 5 +- worlds/kdl3/docs/setup_en.md | 6 +- worlds/kdl3/test/test_locations.py | 3 +- 6 files changed, 66 insertions(+), 52 deletions(-) diff --git a/worlds/kdl3/Client.py b/worlds/kdl3/Client.py index a1e68f8b67e3..e33a680bc025 100644 --- a/worlds/kdl3/Client.py +++ b/worlds/kdl3/Client.py @@ -36,8 +36,10 @@ KDL3_GIFTING_FLAG = SRAM_1_START + 0x901C KDL3_LEVEL_ADDR = SRAM_1_START + 0x9020 KDL3_IS_DEMO = SRAM_1_START + 0x5AD5 -KDL3_GAME_STATE = SRAM_1_START + 0x36D0 KDL3_GAME_SAVE = SRAM_1_START + 0x3617 +KDL3_CURRENT_WORLD = SRAM_1_START + 0x363F +KDL3_CURRENT_LEVEL = SRAM_1_START + 0x3641 +KDL3_GAME_STATE = SRAM_1_START + 0x36D0 KDL3_LIFE_COUNT = SRAM_1_START + 0x39CF KDL3_KIRBY_HP = SRAM_1_START + 0x39D1 KDL3_BOSS_HP = SRAM_1_START + 0x39D5 @@ -46,8 +48,6 @@ KDL3_HEART_STARS = SRAM_1_START + 0x53A7 KDL3_WORLD_UNLOCK = SRAM_1_START + 0x53CB KDL3_LEVEL_UNLOCK = SRAM_1_START + 0x53CD -KDL3_CURRENT_WORLD = SRAM_1_START + 0x53CF -KDL3_CURRENT_LEVEL = SRAM_1_START + 0x53D3 KDL3_BOSS_STATUS = SRAM_1_START + 0x53D5 KDL3_INVINCIBILITY_TIMER = SRAM_1_START + 0x54B1 KDL3_MG5_STATUS = SRAM_1_START + 0x5EE4 @@ -74,7 +74,9 @@ 0x0202: " was out-numbered by Pon & Con.", 0x0203: " was defeated by Ado's powerful paintings.", 0x0204: " was clobbered by King Dedede.", - 0x0205: " lost their battle against Dark Matter." + 0x0205: " lost their battle against Dark Matter.", + 0x0300: " couldn't overcome the Boss Butch.", + 0x0400: " is bad at jumping.", }) @@ -281,6 +283,11 @@ async def game_watcher(self, ctx) -> None: for i in range(5): level_data = await snes_read(ctx, KDL3_LEVEL_ADDR + (14 * i), 14) self.levels[i] = unpack("HHHHHHH", level_data) + self.levels[5] = [0x0205, # Hyper Zone + 0, # MG-5, can't send from here + 0x0300, # Boss Butch + 0x0400, # Jumping + 0, 0, 0] if self.consumables is None: consumables = await snes_read(ctx, KDL3_CONSUMABLE_FLAG, 1) @@ -314,7 +321,7 @@ async def game_watcher(self, ctx) -> None: current_world = struct.unpack("H", await snes_read(ctx, KDL3_CURRENT_WORLD, 2))[0] current_level = struct.unpack("H", await snes_read(ctx, KDL3_CURRENT_LEVEL, 2))[0] currently_dead = current_hp[0] == 0x00 - message = deathlink_messages[self.levels[current_world][current_level - 1]] + message = deathlink_messages[self.levels[current_world][current_level]] await ctx.handle_deathlink_state(currently_dead, f"{ctx.player_names[ctx.slot]}{message}") recv_count = await snes_read(ctx, KDL3_RECV_COUNT, 2) diff --git a/worlds/kdl3/Regions.py b/worlds/kdl3/Regions.py index ed0d86586615..794a565e0a56 100644 --- a/worlds/kdl3/Regions.py +++ b/worlds/kdl3/Regions.py @@ -28,16 +28,30 @@ 0x77001C, # 5-4 needs Burning } +first_world_limit = { + # We need to limit the number of very restrictive stages in level 1 on solo gens + *first_stage_blacklist, # all three of the blacklist stages need 2+ items for both checks + 0x770007, + 0x770008, + 0x770013, + 0x77001E, -def generate_valid_level(level, stage, possible_stages, slot_random): - new_stage = slot_random.choice(possible_stages) - if level == 1 and stage == 0 and new_stage in first_stage_blacklist: - return generate_valid_level(level, stage, possible_stages, slot_random) - else: - return new_stage +} + + +def generate_valid_level(world: "KDL3World", level, stage, possible_stages, placed_stages): + new_stage = world.random.choice(possible_stages) + if level == 1: + if stage == 0 and new_stage in first_stage_blacklist: + return generate_valid_level(world, level, stage, possible_stages, placed_stages) + elif not (world.multiworld.players > 1 or world.options.consumables or world.options.starsanity) and \ + new_stage in first_world_limit and \ + sum(p_stage in first_world_limit for p_stage in placed_stages) >= 2: + return generate_valid_level(world, level, stage, possible_stages, placed_stages) + return new_stage -def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing.Dict[int, Region]): +def generate_rooms(world: "KDL3World", level_regions: typing.Dict[int, Region]): level_names = {LocationName.level_names[level]: level for level in LocationName.level_names} room_data = orjson.loads(get_data(__name__, os.path.join("data", "Rooms.json"))) rooms: typing.Dict[str, KDL3Room] = dict() @@ -49,8 +63,8 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing room.add_locations({location: world.location_name_to_id[location] if location in world.location_name_to_id else None for location in room_entry["locations"] if (not any(x in location for x in ["1-Up", "Maxim"]) or - world.options.consumables.value) and ("Star" not in location - or world.options.starsanity.value)}, + world.options.consumables.value) and ("Star" not in location + or world.options.starsanity.value)}, KDL3Location) rooms[room.name] = room for location in room.locations: @@ -62,33 +76,25 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing world.multiworld.regions.extend(world.rooms) first_rooms: typing.Dict[int, KDL3Room] = dict() - if door_shuffle: - # first, we need to generate the notable edge cases - # 5-6 is the first, being the most restrictive - # half of its rooms are required to be vanilla, but can be in different orders - # the room before it *must* contain the copy ability required to unlock the room's goal - - raise NotImplementedError() - else: - for name, room in rooms.items(): - if room.room == 0: - if room.stage == 7: - first_rooms[0x770200 + room.level - 1] = room - else: - first_rooms[0x770000 + ((room.level - 1) * 6) + room.stage] = room - exits = dict() - for def_exit in room.default_exits: - target = f"{level_names[room.level]} {room.stage} - {def_exit['room']}" - access_rule = tuple(def_exit["access_rule"]) - exits[target] = lambda state, rule=access_rule: state.has_all(rule, world.player) - room.add_exits( - exits.keys(), - exits - ) - if world.options.open_world: - if any("Complete" in location.name for location in room.locations): - room.add_locations({f"{level_names[room.level]} {room.stage} - Stage Completion": None}, - KDL3Location) + for name, room in rooms.items(): + if room.room == 0: + if room.stage == 7: + first_rooms[0x770200 + room.level - 1] = room + else: + first_rooms[0x770000 + ((room.level - 1) * 6) + room.stage] = room + exits = dict() + for def_exit in room.default_exits: + target = f"{level_names[room.level]} {room.stage} - {def_exit['room']}" + access_rule = tuple(def_exit["access_rule"]) + exits[target] = lambda state, rule=access_rule: state.has_all(rule, world.player) + room.add_exits( + exits.keys(), + exits + ) + if world.options.open_world: + if any("Complete" in location.name for location in room.locations): + room.add_locations({f"{level_names[room.level]} {room.stage} - Stage Completion": None}, + KDL3Location) for level in world.player_levels: for stage in range(6): @@ -102,7 +108,7 @@ def generate_rooms(world: "KDL3World", door_shuffle: bool, level_regions: typing if world.options.open_world or stage == 0: level_regions[level].add_exits([first_rooms[proper_stage].name]) else: - world.multiworld.get_location(world.location_id_to_name[world.player_levels[level][stage-1]], + world.multiworld.get_location(world.location_id_to_name[world.player_levels[level][stage - 1]], world.player).parent_region.add_exits([first_rooms[proper_stage].name]) level_regions[level].add_exits([first_rooms[0x770200 + level - 1].name]) @@ -141,8 +147,7 @@ def generate_valid_levels(world: "KDL3World", enforce_world: bool, enforce_patte or (enforce_pattern and ((candidate - 1) & 0x00FFFF) % 6 == stage) or (enforce_pattern == enforce_world) ] - new_stage = generate_valid_level(level, stage, stage_candidates, - world.random) + new_stage = generate_valid_level(world, level, stage, stage_candidates, levels[level]) possible_stages.remove(new_stage) levels[level][stage] = new_stage except Exception: @@ -218,7 +223,7 @@ def create_levels(world: "KDL3World") -> None: level_shuffle == 1, level_shuffle == 2) - generate_rooms(world, False, levels) + generate_rooms(world, levels) level6.add_locations({LocationName.goals[world.options.goal]: None}, KDL3Location) diff --git a/worlds/kdl3/Rules.py b/worlds/kdl3/Rules.py index 91abc21d0623..6a85ef84f054 100644 --- a/worlds/kdl3/Rules.py +++ b/worlds/kdl3/Rules.py @@ -264,7 +264,7 @@ def set_rules(world: "KDL3World") -> None: for r in [range(1, 31), range(44, 51)]: for i in r: set_rule(world.multiworld.get_location(f"Cloudy Park 4 - Star {i}", world.player), - lambda state: can_reach_clean(state, world.player)) + lambda state: can_reach_coo(state, world.player)) for i in [18, *list(range(20, 25))]: set_rule(world.multiworld.get_location(f"Cloudy Park 6 - Star {i}", world.player), lambda state: can_reach_ice(state, world.player)) diff --git a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md index c1e36fed546a..008ee0fcc1ee 100644 --- a/worlds/kdl3/docs/en_Kirby's Dream Land 3.md +++ b/worlds/kdl3/docs/en_Kirby's Dream Land 3.md @@ -1,8 +1,8 @@ # Kirby's Dream Land 3 -## Where is the settings page? +## Where is the options page? -The [player settings page for this game](../player-settings) contains all the options you need to configure and export a +The [player options page for this game](../player-options) contains all the options you need to configure and export a config file. ## What does randomization do to this game? @@ -15,6 +15,7 @@ as Heart Stars, 1-Ups, and Invincibility Candy will be shuffled into the pool fo - Purifying a boss after acquiring a certain number of Heart Stars (indicated by their portrait flashing in the level select) - If enabled, 1-Ups and Maxim Tomatoes +- If enabled, every single Star Piece within a stage ## When the player receives an item, what happens? A sound effect will play, and Kirby will immediately receive the effects of that item, such as being able to receive Copy Abilities from enemies that diff --git a/worlds/kdl3/docs/setup_en.md b/worlds/kdl3/docs/setup_en.md index a13a0f1a74cf..a73d248d4d18 100644 --- a/worlds/kdl3/docs/setup_en.md +++ b/worlds/kdl3/docs/setup_en.md @@ -43,8 +43,8 @@ guide: [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en) ### Where do I get a config file? -The [Player Settings](/games/Kirby's%20Dream%20Land%203/player-settings) page on the website allows you to configure -your personal settings and export a config file from them. +The [Player Options](/games/Kirby's%20Dream%20Land%203/player-options) page on the website allows you to configure +your personal options and export a config file from them. ### Verifying your config file @@ -53,7 +53,7 @@ If you would like to validate your config file to make sure it works, you may do ## Generating a Single-Player Game -1. Navigate to the [Player Settings](/games/Kirby's%20Dream%20Land%203/player-settings) page, configure your options, +1. Navigate to the [Player Options](/games/Kirby's%20Dream%20Land%203/player-options) page, configure your options, and click the "Generate Game" button. 2. You will be presented with a "Seed Info" page. 3. Click the "Create New Room" link. diff --git a/worlds/kdl3/test/test_locations.py b/worlds/kdl3/test/test_locations.py index 543f0d83926d..433b4534d1e5 100644 --- a/worlds/kdl3/test/test_locations.py +++ b/worlds/kdl3/test/test_locations.py @@ -33,7 +33,8 @@ def test_simple_heart_stars(self): self.run_location_test(LocationName.iceberg_kogoesou, ["Burning"]) self.run_location_test(LocationName.iceberg_samus, ["Ice"]) self.run_location_test(LocationName.iceberg_name, ["Burning", "Coo", "ChuChu"]) - self.run_location_test(LocationName.iceberg_angel, ["Cutter", "Burning", "Spark", "Parasol", "Needle", "Clean", "Stone", "Ice"]) + self.run_location_test(LocationName.iceberg_angel, ["Cutter", "Burning", "Spark", "Parasol", "Needle", "Clean", + "Stone", "Ice"]) def run_location_test(self, location: str, itempool: typing.List[str]): items = itempool.copy() From 74ac66b03228988d0885cff556f962a04873cc54 Mon Sep 17 00:00:00 2001 From: BadMagic100 Date: Thu, 28 Mar 2024 08:49:19 -0700 Subject: [PATCH 16/34] Hollow Knight: 0.4.5 doc revamp and default options tweaks (#2982) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/hk/Options.py | 47 +++++++++++++++++++++--------- worlds/hk/docs/en_Hollow Knight.md | 4 ++- worlds/hk/docs/setup_en.md | 44 ++++++++++++++-------------- 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/worlds/hk/Options.py b/worlds/hk/Options.py index 21e8c179e82e..70c7c1689661 100644 --- a/worlds/hk/Options.py +++ b/worlds/hk/Options.py @@ -1,4 +1,5 @@ import typing +import re from .ExtractedData import logic_options, starts, pool_options from .Rules import cost_terms @@ -11,12 +12,16 @@ else: Random = typing.Any - locations = {"option_" + start: i for i, start in enumerate(starts)} # This way the dynamic start names are picked up by the MetaClass Choice belongs to -StartLocation = type("StartLocation", (Choice,), {"__module__": __name__, "auto_display_name": False, **locations, - "__doc__": "Choose your start location. " - "This is currently only locked to King's Pass."}) +StartLocation = type("StartLocation", (Choice,), { + "__module__": __name__, + "auto_display_name": False, + "display_name": "Start Location", + "__doc__": "Choose your start location. " + "This is currently only locked to King's Pass.", + **locations, +}) del (locations) option_docstrings = { @@ -49,8 +54,7 @@ "RandomizeBossEssence": "Randomize boss essence drops, such as those for defeating Warrior Dreams, into the item " "pool and open their locations\n for randomization.", "RandomizeGrubs": "Randomize Grubs into the item pool and open their locations for randomization.", - "RandomizeMimics": "Randomize Mimic Grubs into the item pool and open their locations for randomization." - "Mimic Grubs are always placed\n in your own game.", + "RandomizeMimics": "Randomize Mimic Grubs into the item pool and open their locations for randomization.", "RandomizeMaps": "Randomize Maps into the item pool. This causes Cornifer to give you a message allowing you to see" " and buy an item\n that is randomized into that location as well.", "RandomizeStags": "Randomize Stag Stations unlocks into the item pool as well as placing randomized items " @@ -99,8 +103,12 @@ "RandomizeKeys", "RandomizeMaskShards", "RandomizeVesselFragments", + "RandomizeCharmNotches", "RandomizePaleOre", - "RandomizeRelics" + "RandomizeRancidEggs" + "RandomizeRelics", + "RandomizeStags", + "RandomizeLifebloodCocoons" } shop_to_option = { @@ -117,6 +125,7 @@ hollow_knight_randomize_options: typing.Dict[str, type(Option)] = {} +splitter_pattern = re.compile(r'(? typing.List[int]: random_source.shuffle(charms) return charms else: - charms = [0]*self.charm_count + charms = [0] * self.charm_count for x in range(self.value): - index = random_source.randint(0, self.charm_count-1) + index = random_source.randint(0, self.charm_count - 1) while charms[index] > 5: - index = random_source.randint(0, self.charm_count-1) + index = random_source.randint(0, self.charm_count - 1) charms[index] += 1 return charms @@ -404,6 +417,7 @@ class WhitePalace(Choice): class ExtraPlatforms(DefaultOnToggle): """Places additional platforms to make traveling throughout Hallownest more convenient.""" + display_name = "Extra Platforms" class AddUnshuffledLocations(Toggle): @@ -413,6 +427,7 @@ class AddUnshuffledLocations(Toggle): Note: This will increase the number of location checks required to purchase hints to the total maximum. """ + display_name = "Add Unshuffled Locations" class DeathLinkShade(Choice): @@ -430,6 +445,7 @@ class DeathLinkShade(Choice): option_shadeless = 1 option_shade = 2 default = 2 + display_name = "Deathlink Shade Handling" class DeathLinkBreaksFragileCharms(Toggle): @@ -439,6 +455,7 @@ class DeathLinkBreaksFragileCharms(Toggle): ** Self-death fragile charm behavior is not changed; if a self-death normally breaks fragile charms in vanilla, it will continue to do so. """ + display_name = "Deathlink Breaks Fragile Charms" class StartingGeo(Range): @@ -462,18 +479,20 @@ class CostSanity(Choice): alias_yes = 1 option_shopsonly = 2 option_notshops = 3 - display_name = "Cost Sanity" + display_name = "Costsanity" class CostSanityHybridChance(Range): """The chance that a CostSanity cost will include two components instead of one, e.g. Grubs + Essence""" range_end = 100 default = 10 + display_name = "Costsanity Hybrid Chance" cost_sanity_weights: typing.Dict[str, type(Option)] = {} for term, cost in cost_terms.items(): option_name = f"CostSanity{cost.option}Weight" + display_name = f"Costsanity {cost.option} Weight" extra_data = { "__module__": __name__, "range_end": 1000, "__doc__": ( @@ -486,10 +505,10 @@ class CostSanityHybridChance(Range): extra_data["__doc__"] += " Geo costs will never be chosen for Grubfather, Seer, or Egg Shop." option = type(option_name, (Range,), extra_data) + option.display_name = display_name globals()[option.__name__] = option cost_sanity_weights[option.__name__] = option - hollow_knight_options: typing.Dict[str, type(Option)] = { **hollow_knight_randomize_options, RandomizeElevatorPass.__name__: RandomizeElevatorPass, diff --git a/worlds/hk/docs/en_Hollow Knight.md b/worlds/hk/docs/en_Hollow Knight.md index e31eb892a004..94398ec6ac14 100644 --- a/worlds/hk/docs/en_Hollow Knight.md +++ b/worlds/hk/docs/en_Hollow Knight.md @@ -8,7 +8,9 @@ config file. ## What does randomization do to this game? Randomization swaps around the locations of items. The items being swapped around are chosen within your YAML. -Shop costs are presently always randomized. +Shop costs are presently always randomized. Items which could be randomized, but are not, will remain unmodified in +their usual locations. In particular, when the items at Grubfather and Seer are partially randomized, randomized items +will be obtained from a chest in the room, while unrandomized items will be given by the NPC as normal. ## What Hollow Knight items can appear in other players' worlds? diff --git a/worlds/hk/docs/setup_en.md b/worlds/hk/docs/setup_en.md index b85818f30eca..c046785038d8 100644 --- a/worlds/hk/docs/setup_en.md +++ b/worlds/hk/docs/setup_en.md @@ -3,6 +3,8 @@ ## Required Software * Download and unzip the Lumafly Mod Manager from the [Lumafly website](https://themulhima.github.io/Lumafly/). * A legal copy of Hollow Knight. + * Steam, Gog, and Xbox Game Pass versions of the game are supported. + * Windows, Mac, and Linux (including Steam Deck) are supported. ## Installing the Archipelago Mod using Lumafly 1. Launch Lumafly and ensure it locates your Hollow Knight installation directory. @@ -10,25 +12,25 @@ * If desired, also install "Archipelago Map Mod" to use as an in-game tracker. 3. Launch the game, you're all set! -### What to do if Lumafly fails to find your XBox Game Pass installation directory -1. Enter the XBox app and move your mouse over "Hollow Knight" on the left sidebar. -2. Click the three points then click "Manage". -3. Go to the "Files" tab and select "Browse...". -4. Click "Hollow Knight", then "Content", then click the path bar and copy it. -5. Run Lumafly as an administrator and, when it asks you for the path, paste what you copied in step 4. - -#### Alternative Method: -1. Click on your profile then "Settings". -2. Go to the "General" tab and select "CHANGE FOLDER". -3. Look for a folder where you want to install the game (preferably inside a folder on your desktop) and copy the path. -4. Run Lumafly as an administrator and, when it asks you for the path, paste what you copied in step 3. - -Note: The path folder needs to have the "Hollow Knight_Data" folder inside. +### What to do if Lumafly fails to find your installation directory +1. Find the directory manually. + * Xbox Game Pass: + 1. Enter the XBox app and move your mouse over "Hollow Knight" on the left sidebar. + 2. Click the three points then click "Manage". + 3. Go to the "Files" tab and select "Browse...". + 4. Click "Hollow Knight", then "Content", then click the path bar and copy it. + * Steam: + 1. You likely put your Steam library in a non-standard place. If this is the case, you probably know where + it is. Find your steam library and then find the Hollow Knight folder and copy the path. + * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` + * Linux/Steam Deck - ~/.local/share/Steam/steamapps/common/Hollow Knight + * Mac - ~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app +2. Run Lumafly as an administrator and, when it asks you for the path, paste the path you copied. ## Configuring your YAML File ### What is a YAML and why do I need one? -You can see the [basic multiworld setup guide](/tutorial/Archipelago/setup/en) here on the Archipelago website to learn -about why Archipelago uses YAML files and what they're for. +An YAML file is the way that you provide your player options to Archipelago. +See the [basic multiworld setup guide](/tutorial/Archipelago/setup/en) here on the Archipelago website to learn more. ### Where do I get a YAML? You can use the [game options page for Hollow Knight](/games/Hollow%20Knight/player-options) here on the Archipelago @@ -44,9 +46,7 @@ website to generate a YAML using a graphical interface. * If you are waiting for a countdown then wait for it to lapse before hitting Start. * Or hit Start then pause the game once you're in it. -## Commands -While playing the multiworld you can interact with the server using various commands listed in the -[commands guide](/tutorial/Archipelago/commands/en). As this game does not have an in-game text client at the moment, -You can optionally connect to the multiworld using the text client, which can be found in the -[main Archipelago installation](https://github.com/ArchipelagoMW/Archipelago/releases) as Archipelago Text Client to -enter these commands. +## Hints and other commands +While playing in a multiworld, you can interact with the server using various commands listed in the +[commands guide](/tutorial/Archipelago/commands/en). You can use the Archipelago Text Client to do this, +which is included in the latest release of the [Archipelago software](https://github.com/ArchipelagoMW/Archipelago/releases/latest). From 74b2bf51613a968eb57a5b138a7ad191324b2dd8 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Thu, 28 Mar 2024 15:20:55 -0600 Subject: [PATCH 17/34] Pokemon Emerald: Exclude norman trainer location during norman goal (#3038) --- worlds/pokemon_emerald/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/pokemon_emerald/__init__.py b/worlds/pokemon_emerald/__init__.py index 384bec9f4501..65bcce3a3296 100644 --- a/worlds/pokemon_emerald/__init__.py +++ b/worlds/pokemon_emerald/__init__.py @@ -300,6 +300,7 @@ def exclude_locations(location_names: List[str]): # Locations which are directly unlocked by defeating Norman. exclude_locations([ + "Petalburg Gym - Leader Norman", "Petalburg Gym - Balance Badge", "Petalburg Gym - TM42 from Norman", "Petalburg City - HM03 from Wally's Uncle", From de860623d17d274289e3e4ab13650f2382e2e0b8 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Thu, 28 Mar 2024 22:21:56 +0100 Subject: [PATCH 18/34] Core: differentiate between unknown worlds and broken worlds in error message (#2903) --- Generate.py | 7 ++++++- worlds/__init__.py | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Generate.py b/Generate.py index 56979334b547..f646e994dcac 100644 --- a/Generate.py +++ b/Generate.py @@ -26,6 +26,7 @@ from worlds.alttp.Text import TextTable from worlds.AutoWorld import AutoWorldRegister from worlds.generic import PlandoConnection +from worlds import failed_world_loads def mystery_argparse(): @@ -458,7 +459,11 @@ def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.b ret.game = get_choice("game", weights) if ret.game not in AutoWorldRegister.world_types: - picks = Utils.get_fuzzy_results(ret.game, AutoWorldRegister.world_types, limit=1)[0] + picks = Utils.get_fuzzy_results(ret.game, list(AutoWorldRegister.world_types) + failed_world_loads, limit=1)[0] + if picks[0] in failed_world_loads: + raise Exception(f"No functional world found to handle game {ret.game}. " + f"Did you mean '{picks[0]}' ({picks[1]}% sure)? " + f"If so, it appears the world failed to initialize correctly.") raise Exception(f"No world found to handle game {ret.game}. Did you mean '{picks[0]}' ({picks[1]}% sure)? " f"Check your spelling or installation of that world.") diff --git a/worlds/__init__.py b/worlds/__init__.py index 168bba7abf41..53b0c5ceb948 100644 --- a/worlds/__init__.py +++ b/worlds/__init__.py @@ -20,9 +20,13 @@ "user_folder", "GamesPackage", "DataPackage", + "failed_world_loads", } +failed_world_loads: List[str] = [] + + class GamesPackage(TypedDict, total=False): item_name_groups: Dict[str, List[str]] item_name_to_id: Dict[str, int] @@ -87,6 +91,7 @@ def load(self) -> bool: file_like.seek(0) import logging logging.exception(file_like.read()) + failed_world_loads.append(os.path.basename(self.path).rsplit(".", 1)[0]) return False From eb66886a908ad75bbe71fac9bb81a0177e05e816 Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:23:01 -0500 Subject: [PATCH 19/34] SC2: Don't Filter Excluded Victory Locations (#3018) --- worlds/sc2/Locations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/sc2/Locations.py b/worlds/sc2/Locations.py index 5a03f2232348..22b400a238dd 100644 --- a/worlds/sc2/Locations.py +++ b/worlds/sc2/Locations.py @@ -1620,7 +1620,7 @@ def get_locations(world: Optional[World]) -> Tuple[LocationData, ...]: plando_locations = get_plando_locations(world) exclude_locations = get_option_value(world, "exclude_locations") location_table = [location for location in location_table - if (LocationType is LocationType.VICTORY or location.name not in exclude_locations) + if (location.type is LocationType.VICTORY or location.name not in exclude_locations) and location.type not in excluded_location_types or location.name in plando_locations] for i, location_data in enumerate(location_table): From c97215e0e755224593fdd00894731b59aa415e19 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Thu, 28 Mar 2024 17:23:37 -0400 Subject: [PATCH 20/34] TUNIC: Minor refactor of the vanilla_portals function (#3009) * Remove unused, change an if to an elif * Remove unused import --- worlds/tunic/er_scripts.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/worlds/tunic/er_scripts.py b/worlds/tunic/er_scripts.py index 5756ec90be14..5d08188ace6e 100644 --- a/worlds/tunic/er_scripts.py +++ b/worlds/tunic/er_scripts.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Set, Tuple, TYPE_CHECKING +from typing import Dict, List, Set, TYPE_CHECKING from BaseClasses import Region, ItemClassification, Item, Location from .locations import location_table from .er_data import Portal, tunic_er_regions, portal_mapping, \ @@ -89,7 +89,6 @@ def place_event_items(world: "TunicWorld", regions: Dict[str, Region]) -> None: def vanilla_portals() -> Dict[Portal, Portal]: portal_pairs: Dict[Portal, Portal] = {} portal_map = portal_mapping.copy() - shop_num = 1 while portal_map: portal1 = portal_map[0] @@ -98,11 +97,10 @@ def vanilla_portals() -> Dict[Portal, Portal]: portal2_sdt = portal1.destination_scene() if portal2_sdt.startswith("Shop,"): - portal2 = Portal(name=f"Shop", region="Shop", + portal2 = Portal(name="Shop", region="Shop", destination="Previous Region", tag="_") - shop_num += 1 - if portal2_sdt == "Purgatory, Purgatory_bottom": + elif portal2_sdt == "Purgatory, Purgatory_bottom": portal2_sdt = "Purgatory, Purgatory_top" for portal in portal_map: From 5d9d4ed9f1e44309f1b53f12413ad260f1b6c983 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Fri, 29 Mar 2024 01:01:31 +0100 Subject: [PATCH 21/34] SoE: update to pyevermizer v0.48.0 (#3050) --- worlds/soe/__init__.py | 52 ++++++++--- worlds/soe/logic.py | 7 +- worlds/soe/options.py | 25 +++++- worlds/soe/requirements.txt | 72 +++++++-------- worlds/soe/test/__init__.py | 2 + worlds/soe/test/test_sniffamizer.py | 130 ++++++++++++++++++++++++++++ 6 files changed, 237 insertions(+), 51 deletions(-) create mode 100644 worlds/soe/test/test_sniffamizer.py diff --git a/worlds/soe/__init__.py b/worlds/soe/__init__.py index bbe018da5329..dcca722ad1fe 100644 --- a/worlds/soe/__init__.py +++ b/worlds/soe/__init__.py @@ -13,7 +13,7 @@ from worlds.AutoWorld import WebWorld, World from worlds.generic.Rules import add_item_rule, set_rule from .logic import SoEPlayerLogic -from .options import Difficulty, EnergyCore, SoEOptions +from .options import Difficulty, EnergyCore, Sniffamizer, SniffIngredients, SoEOptions from .patch import SoEDeltaPatch, get_base_rom_path if typing.TYPE_CHECKING: @@ -64,20 +64,28 @@ pyevermizer.CHECK_BOSS: _id_base + 50, # bosses 64050..6499 pyevermizer.CHECK_GOURD: _id_base + 100, # gourds 64100..64399 pyevermizer.CHECK_NPC: _id_base + 400, # npc 64400..64499 - # TODO: sniff 64500..64799 + # blank 64500..64799 pyevermizer.CHECK_EXTRA: _id_base + 800, # extra items 64800..64899 pyevermizer.CHECK_TRAP: _id_base + 900, # trap 64900..64999 + pyevermizer.CHECK_SNIFF: _id_base + 1000 # sniff 65000..65592 } # cache native evermizer items and locations _items = pyevermizer.get_items() +_sniff_items = pyevermizer.get_sniff_items() # optional, not part of the default location pool _traps = pyevermizer.get_traps() _extras = pyevermizer.get_extra_items() # items that are not placed by default _locations = pyevermizer.get_locations() +_sniff_locations = pyevermizer.get_sniff_locations() # optional, not part of the default location pool # fix up texts for AP for _loc in _locations: if _loc.type == pyevermizer.CHECK_GOURD: - _loc.name = f'{_loc.name} #{_loc.index}' + _loc.name = f"{_loc.name} #{_loc.index}" +for _loc in _sniff_locations: + if _loc.type == pyevermizer.CHECK_SNIFF: + _loc.name = f"{_loc.name} Sniff #{_loc.index}" +del _loc + # item helpers _ingredients = ( 'Wax', 'Water', 'Vinegar', 'Root', 'Oil', 'Mushroom', 'Mud Pepper', 'Meteorite', 'Limestone', 'Iron', @@ -97,7 +105,7 @@ def _match_item_name(item: pyevermizer.Item, substr: str) -> bool: def _get_location_mapping() -> typing.Tuple[typing.Dict[str, int], typing.Dict[int, pyevermizer.Location]]: name_to_id = {} id_to_raw = {} - for loc in _locations: + for loc in itertools.chain(_locations, _sniff_locations): ap_id = _id_offset[loc.type] + loc.index id_to_raw[ap_id] = loc name_to_id[loc.name] = ap_id @@ -108,7 +116,7 @@ def _get_location_mapping() -> typing.Tuple[typing.Dict[str, int], typing.Dict[i def _get_item_mapping() -> typing.Tuple[typing.Dict[str, int], typing.Dict[int, pyevermizer.Item]]: name_to_id = {} id_to_raw = {} - for item in itertools.chain(_items, _extras, _traps): + for item in itertools.chain(_items, _sniff_items, _extras, _traps): if item.name in name_to_id: continue ap_id = _id_offset[item.type] + item.index @@ -168,9 +176,9 @@ class SoEWorld(World): options: SoEOptions settings: typing.ClassVar[SoESettings] topology_present = False - data_version = 4 + data_version = 5 web = SoEWebWorld() - required_client_version = (0, 3, 5) + required_client_version = (0, 4, 4) item_name_to_id, item_id_to_raw = _get_item_mapping() location_name_to_id, location_id_to_raw = _get_location_mapping() @@ -238,16 +246,26 @@ def get_sphere_index(evermizer_loc: pyevermizer.Location) -> int: spheres.setdefault(get_sphere_index(loc), {}).setdefault(loc.type, []).append( SoELocation(self.player, loc.name, self.location_name_to_id[loc.name], ingame, loc.difficulty > max_difficulty)) + # extend pool if feature and setting enabled + if hasattr(Sniffamizer, "option_everywhere") and self.options.sniffamizer == Sniffamizer.option_everywhere: + for loc in _sniff_locations: + spheres.setdefault(get_sphere_index(loc), {}).setdefault(loc.type, []).append( + SoELocation(self.player, loc.name, self.location_name_to_id[loc.name], ingame, + loc.difficulty > max_difficulty)) # location balancing data trash_fills: typing.Dict[int, typing.Dict[int, typing.Tuple[int, int, int, int]]] = { - 0: {pyevermizer.CHECK_GOURD: (20, 40, 40, 40)}, # remove up to 40 gourds from sphere 1 - 1: {pyevermizer.CHECK_GOURD: (70, 90, 90, 90)}, # remove up to 90 gourds from sphere 2 + 0: {pyevermizer.CHECK_GOURD: (20, 40, 40, 40), # remove up to 40 gourds from sphere 1 + pyevermizer.CHECK_SNIFF: (100, 130, 130, 130)}, # remove up to 130 sniff spots from sphere 1 + 1: {pyevermizer.CHECK_GOURD: (70, 90, 90, 90), # remove up to 90 gourds from sphere 2 + pyevermizer.CHECK_SNIFF: (160, 200, 200, 200)}, # remove up to 200 sniff spots from sphere 2 } # mark some as excluded based on numbers above for trash_sphere, fills in trash_fills.items(): for typ, counts in fills.items(): + if typ not in spheres[trash_sphere]: + continue # e.g. player does not have sniff locations count = counts[self.options.difficulty.value] for location in self.random.sample(spheres[trash_sphere][typ], count): assert location.name != "Energy Core #285", "Error in sphere generation" @@ -299,6 +317,15 @@ def create_items(self) -> None: # remove one pair of wings that will be placed in generate_basic items.remove(self.create_item("Wings")) + # extend pool if feature and setting enabled + if hasattr(Sniffamizer, "option_everywhere") and self.options.sniffamizer == Sniffamizer.option_everywhere: + if self.options.sniff_ingredients == SniffIngredients.option_vanilla_ingredients: + # vanilla ingredients + items += list(map(lambda item: self.create_item(item), _sniff_items)) + else: + # random ingredients + items += [self.create_item(self.get_filler_item_name()) for _ in _sniff_items] + def is_ingredient(item: pyevermizer.Item) -> bool: for ingredient in _ingredients: if _match_item_name(item, ingredient): @@ -345,7 +372,12 @@ def set_rules(self) -> None: set_rule(self.multiworld.get_location('Done', self.player), lambda state: self.logic.has(state, pyevermizer.P_FINAL_BOSS)) set_rule(self.multiworld.get_entrance('New Game', self.player), lambda state: True) - for loc in _locations: + locations: typing.Iterable[pyevermizer.Location] + if hasattr(Sniffamizer, "option_everywhere") and self.options.sniffamizer == Sniffamizer.option_everywhere: + locations = itertools.chain(_locations, _sniff_locations) + else: + locations = _locations + for loc in locations: location = self.multiworld.get_location(loc.name, self.player) set_rule(location, self.make_rule(loc.requires)) diff --git a/worlds/soe/logic.py b/worlds/soe/logic.py index ee81c76e58de..92ffb14b3f95 100644 --- a/worlds/soe/logic.py +++ b/worlds/soe/logic.py @@ -1,4 +1,5 @@ import typing +from itertools import chain from typing import Callable, Set from . import pyevermizer @@ -11,10 +12,12 @@ # TODO: resolve/flatten/expand rules to get rid of recursion below where possible # Logic.rules are all rules including locations, excluding those with no progress (i.e. locations that only drop items) -rules = [rule for rule in pyevermizer.get_logic() if len(rule.provides) > 0] +rules = pyevermizer.get_logic() # Logic.items are all items and extra items excluding non-progression items and duplicates +# NOTE: we are skipping sniff items here because none of them is supposed to provide progression item_names: Set[str] = set() -items = [item for item in filter(lambda item: item.progression, pyevermizer.get_items() + pyevermizer.get_extra_items()) +items = [item for item in filter(lambda item: item.progression, # type: ignore[arg-type] + chain(pyevermizer.get_items(), pyevermizer.get_extra_items())) if item.name not in item_names and not item_names.add(item.name)] # type: ignore[func-returns-value] diff --git a/worlds/soe/options.py b/worlds/soe/options.py index c5ac02c22d03..5ecd0f9e6666 100644 --- a/worlds/soe/options.py +++ b/worlds/soe/options.py @@ -1,4 +1,5 @@ from dataclasses import dataclass, fields +from datetime import datetime from typing import Any, ClassVar, cast, Dict, Iterator, List, Tuple, Protocol from Options import AssembleOptions, Choice, DeathLink, DefaultOnToggle, Option, PerGameCommonOptions, \ @@ -158,13 +159,30 @@ class Ingredienizer(EvermizerFlags, OffOnFullChoice): flags = ['i', '', 'I'] -class Sniffamizer(EvermizerFlags, OffOnFullChoice): - """On Shuffles, Full randomizes drops in sniff locations""" +class Sniffamizer(EvermizerFlags, Choice): + """ + Off: all vanilla items in sniff spots + Shuffle: sniff items shuffled into random sniff spots + """ display_name = "Sniffamizer" + option_off = 0 + option_shuffle = 1 + if datetime.today().year > 2024 or datetime.today().month > 3: + option_everywhere = 2 + __doc__ = __doc__ + " Everywhere: add sniff spots to multiworld pool" + alias_true = 1 default = 1 flags = ['s', '', 'S'] +class SniffIngredients(EvermizerFlag, Choice): + """Select which items should be used as sniff items""" + display_name = "Sniff Ingredients" + option_vanilla_ingredients = 0 + option_random_ingredients = 1 + flag = 'v' + + class Callbeadamizer(EvermizerFlags, OffOnFullChoice): """On Shuffles call bead characters, Full shuffles individual spells""" display_name = "Callbeadamizer" @@ -207,7 +225,7 @@ def __new__(mcs, name: str, bases: Tuple[type], attrs: Dict[Any, Any]) -> "ItemC attrs["display_name"] = f"{attrs['item_name']} Chance" attrs["range_start"] = 0 attrs["range_end"] = 100 - cls = super(ItemChanceMeta, mcs).__new__(mcs, name, bases, attrs) + cls = super(ItemChanceMeta, mcs).__new__(mcs, name, bases, attrs) # type: ignore[no-untyped-call] return cast(ItemChanceMeta, cls) @@ -268,6 +286,7 @@ class SoEOptions(PerGameCommonOptions): short_boss_rush: ShortBossRush ingredienizer: Ingredienizer sniffamizer: Sniffamizer + sniff_ingredients: SniffIngredients callbeadamizer: Callbeadamizer musicmizer: Musicmizer doggomizer: Doggomizer diff --git a/worlds/soe/requirements.txt b/worlds/soe/requirements.txt index 710f51ddb09a..4bcacb33c33c 100644 --- a/worlds/soe/requirements.txt +++ b/worlds/soe/requirements.txt @@ -1,36 +1,36 @@ -pyevermizer==0.46.1 \ - --hash=sha256:9fd71b5e4af26a5dd24a9cbf5320bf0111eef80320613401a1c03011b1515806 \ - --hash=sha256:23f553ed0509d9a238b2832f775e0b5abd7741b38ab60d388294ee8a7b96c5fb \ - --hash=sha256:7189b67766418a3e7e6c683f09c5e758aa1a5c24316dd9b714984bac099c4b75 \ - --hash=sha256:befa930711e63d5d5892f67fd888b2e65e746363e74599c53e71ecefb90ae16a \ - --hash=sha256:202933ce21e0f33859537bf3800d9a626c70262a9490962e3f450171758507ca \ - --hash=sha256:c20ca69311c696528e1122ebc7d33775ee971f538c0e3e05dd3bfd4de10b82d4 \ - --hash=sha256:74dc689a771ae5ffcd5257e763f571ee890e3e87bdb208233b7f451522c00d66 \ - --hash=sha256:072296baef464daeb6304cf58827dcbae441ad0803039aee1c0caa10d56e0674 \ - --hash=sha256:7921baf20d52d92d6aeb674125963c335b61abb7e1298bde4baf069d11a2d05e \ - --hash=sha256:ca098034a84007038c2bff004582e6e6ac2fa9cc8b9251301d25d7e2adcee6da \ - --hash=sha256:22ddb29823c19be9b15e1b3627db1babfe08b486aede7d5cc463a0a1ae4c75d8 \ - --hash=sha256:bf1c441b49026d9000166be6e2f63fc351a3fda170aa3fdf18d44d5e5d044640 \ - --hash=sha256:9710aa7957b4b1f14392006237eb95803acf27897377df3e85395f057f4316b9 \ - --hash=sha256:8feb676c198bee17ab991ee015828345ac3f87c27dfdb3061d92d1fe47c184b4 \ - --hash=sha256:597026dede72178ff3627a4eb3315de8444461c7f0f856f5773993c3f9790c53 \ - --hash=sha256:70f9b964bdfb5191e8f264644c5d1af3041c66fe15261df8a99b3d719dc680d6 \ - --hash=sha256:74655c0353ffb6cda30485091d0917ce703b128cd824b612b3110a85c79a93d0 \ - --hash=sha256:0e9c74d105d4ec3af12404e85bb8776931c043657add19f798ee69465f92b999 \ - --hash=sha256:d3c13446d3d482b9cce61ac73b38effd26fcdcf7f693a405868d3aaaa4d18ca6 \ - --hash=sha256:371ac3360640ef439a5920ddfe11a34e9d2e546ed886bb8c9ed312611f9f4655 \ - --hash=sha256:6e5cf63b036f24d2ae4375a88df8d0bc93208352939521d1fcac3c829ef2c363 \ - --hash=sha256:edf28f5c4d1950d17343adf6d8d40d12c7e982d1e39535d55f7915e122cd8b0e \ - --hash=sha256:b5ef6f3b4e04f677c296f60f7f4c320ac22cd5bc09c05574460116c8641c801a \ - --hash=sha256:dd651f66720af4abe2ddae29944e299a57ff91e6fca1739e6dc1f8fd7a8c2b39 \ - --hash=sha256:4e278f5f72c27f9703bce5514d2fead8c00361caac03e94b0bf9ad8a144f1eeb \ - --hash=sha256:38f36ea1f545b835c3ecd6e081685a233ac2e3cf0eec8916adc92e4d791098a6 \ - --hash=sha256:0a2e58ed6e7c42f006cc17d32cec1f432f01b3fe490e24d71471b36e0d0d8742 \ - --hash=sha256:c1b658db76240596c03571c60635abe953f36fb55b363202971831c2872ea9a0 \ - --hash=sha256:deb5a84a6a56325eb6701336cdbf70f72adaaeab33cbe953d0e551ecf2592f20 \ - --hash=sha256:b1425c793e0825f58b3726e7afebaf5a296c07cb0d28580d0ee93dbe10dcdf63 \ - --hash=sha256:11995fb4dfd14b5c359591baee2a864c5814650ba0084524d4ea0466edfaf029 \ - --hash=sha256:5d2120b5c93ae322fe2a85d48e3eab4168a19e974a880908f1ac291c0300940f \ - --hash=sha256:254912ea4bfaaffb0abe366e73bd9ecde622677d6afaf2ce8a0c330df99fefd9 \ - --hash=sha256:540d8e4525f0b5255c1554b4589089dc58e15df22f343e9545ea00f7012efa07 \ - --hash=sha256:f69b8ebded7eed181fabe30deabae89fd10c41964f38abb26b19664bbe55c1ae +pyevermizer==0.48.0 \ + --hash=sha256:069ce348e480e04fd6208cfd0f789c600b18d7c34b5272375b95823be191ed57 \ + --hash=sha256:58164dddaba2f340b0a8b4f39605e9dac46d8b0ffb16120e2e57bef2bfc1d683 \ + --hash=sha256:115dd09d38a10f11d4629b340dfd75e2ba4089a1ff9e9748a11619829e02c876 \ + --hash=sha256:b5e79cfe721e75cd7dec306b5eecd6385ce059e31ef7523ba7f677e22161ec6f \ + --hash=sha256:382882fa9d641b9969a6c3ed89449a814bdabcb6b17b558872d95008a6cc908b \ + --hash=sha256:92f67700e9132064a90858d391dd0b8fb111aff6dfd472befed57772d89ae567 \ + --hash=sha256:fe4c453b7dbd5aa834b81f9a7aedb949a605455650b938b8b304d8e5a7edcbf7 \ + --hash=sha256:c6bdbc45daf73818f763ed59ad079f16494593395d806f772dd62605c722b3e9 \ + --hash=sha256:bb09f45448fdfd28566ae6fcc38c35a6632f4c31a9de2483848f6ce17b2359b5 \ + --hash=sha256:00a8b9014744bd1528d0d39c33ede7c0d1713ad797a331cebb33d377a5bc1064 \ + --hash=sha256:64ee69edc0a7d3b3caded78f2e46975f9beaff1ff8feaf29b87da44c45f38d7d \ + --hash=sha256:9211bdb1313e9f4869ed5bdc61f3831d39679bd08bb4087f1c1e5475d9e3018b \ + --hash=sha256:4a57821e422a1d75fe3307931a78db7a65e76955f8e401c4b347db6570390d09 \ + --hash=sha256:04670cee0a0b913f24d2b9a1e771781560e2485bda31e6cd372a08421cf85cfa \ + --hash=sha256:971fe77d0a20a1db984020ad253b613d0983f5e23ff22cba60ee5ac00d8128de \ + --hash=sha256:127265fdb49f718f54706bf15604af1cec23590afd00d423089dea4331dcfc61 \ + --hash=sha256:d47576360337c1a23f424cd49944a8d68fc4f3338e00719c9f89972c84604bef \ + --hash=sha256:879659603e51130a0de8d9885d815a2fa1df8bd6cebe6d520d1c6002302adfdb \ + --hash=sha256:6a91bfc53dd130db6424adf8ac97a1133e97b4157ed00f889d8cbd26a2a4b340 \ + --hash=sha256:f3bf35fc5eef4cda49d2de77339fc201dd3206660a3dc15db005625b15bb806c \ + --hash=sha256:e7c8d5bf59a3c16db20411bc5d8e9c9087a30b6b4edf1b5ed9f4c013291427e4 \ + --hash=sha256:054a4d84ffe75448d41e88e1e0642ef719eb6111be5fe608e71e27a558c59069 \ + --hash=sha256:e6f141ca367469c69ba7fbf65836c479ec6672c598cfcb6b39e8098c60d346bc \ + --hash=sha256:6e65eb88f0c1ff4acde1c13b24ce649b0fe3d1d3916d02d96836c781a5022571 \ + --hash=sha256:e61e8f476b6da809cf38912755ed8bb009665f589e913eb8df877e9fa763024b \ + --hash=sha256:7e7c5484c0a2e3da6064de3f73d8d988d6703db58ab0be4730cbbf1a82319237 \ + --hash=sha256:9033b954e5f4878fd94af6d2056c78e3316115521fb1c24a4416d5cbf2ad66ad \ + --hash=sha256:824c623fff8ae4da176306c458ad63ad16a06a495a16db700665eca3c115924f \ + --hash=sha256:8e31031409a8386c6a63b79d480393481badb3ba29f32ff7a0db2b4abed20ac8 \ + --hash=sha256:7dbb7bb13e1e94f69f7ccdbcf4d35776424555fce5af1ca29d0256f91fdf087a \ + --hash=sha256:3a24e331b259407b6912d6e0738aa8a675831db3b7493fcf54dc17cb0cb80d37 \ + --hash=sha256:fdda06662a994271e96633cba100dd92b2fcd524acef8b2f664d1aaa14503cbd \ + --hash=sha256:0f0fc81bef3dbb78ba6a7622dd4296f23c59825968a0bb0448beb16eb3397cc2 \ + --hash=sha256:e07cbef776a7468669211546887357cc88e9afcf1578b23a4a4f2480517b15d9 \ + --hash=sha256:e442212695bdf60e455673b7b9dd83a5d4b830d714376477093d2c9054d92832 diff --git a/worlds/soe/test/__init__.py b/worlds/soe/test/__init__.py index 1ab852163053..e84d7e669d2c 100644 --- a/worlds/soe/test/__init__.py +++ b/worlds/soe/test/__init__.py @@ -1,9 +1,11 @@ from test.bases import WorldTestBase from typing import Iterable +from .. import SoEWorld class SoETestBase(WorldTestBase): game = "Secret of Evermore" + world: SoEWorld def assertLocationReachability(self, reachable: Iterable[str] = (), unreachable: Iterable[str] = (), satisfied: bool = True) -> None: diff --git a/worlds/soe/test/test_sniffamizer.py b/worlds/soe/test/test_sniffamizer.py new file mode 100644 index 000000000000..45aff1fa4d6d --- /dev/null +++ b/worlds/soe/test/test_sniffamizer.py @@ -0,0 +1,130 @@ +import typing +from unittest import TestCase, skipUnless + +from . import SoETestBase +from .. import pyevermizer +from ..options import Sniffamizer + + +class TestCount(TestCase): + """ + Test that counts line up for sniff spots + """ + + def test_compare_counts(self) -> None: + self.assertEqual(len(pyevermizer.get_sniff_locations()), len(pyevermizer.get_sniff_items()), + "Sniff locations and sniff items don't line up") + + +class Bases: + # class in class to avoid running tests for helper class + class TestSniffamizerLocal(SoETestBase): + """ + Test that provided options do not add sniff items or locations + """ + def test_no_sniff_items(self) -> None: + self.assertLess(len(self.multiworld.itempool), 500, + "Unexpected number of items") + for item in self.multiworld.itempool: + if item.code is not None: + self.assertLess(item.code, 65000, + "Unexpected item type") + + def test_no_sniff_locations(self) -> None: + location_count = sum(1 for location in self.multiworld.get_locations(self.player) if location.item is None) + self.assertLess(location_count, 500, + "Unexpected number of locations") + for location in self.multiworld.get_locations(self.player): + if location.address is not None: + self.assertLess(location.address, 65000, + "Unexpected location type") + self.assertEqual(location_count, len(self.multiworld.itempool), + "Locations and item counts do not line up") + + class TestSniffamizerPool(SoETestBase): + """ + Test that provided options add sniff items and locations + """ + def test_sniff_items(self) -> None: + self.assertGreater(len(self.multiworld.itempool), 500, + "Unexpected number of items") + + def test_sniff_locations(self) -> None: + location_count = sum(1 for location in self.multiworld.get_locations(self.player) if location.item is None) + self.assertGreater(location_count, 500, + "Unexpected number of locations") + self.assertTrue(any(location.address is not None and location.address >= 65000 + for location in self.multiworld.get_locations(self.player)), + "No sniff locations") + self.assertEqual(location_count, len(self.multiworld.itempool), + "Locations and item counts do not line up") + + +class TestSniffamizerShuffle(Bases.TestSniffamizerLocal): + """ + Test that shuffle does not add extra items or locations + """ + options: typing.Dict[str, typing.Any] = { + "sniffamizer": "shuffle" + } + + def test_flags(self) -> None: + # default -> no flags + flags = self.world.options.flags + self.assertNotIn("s", flags) + self.assertNotIn("S", flags) + self.assertNotIn("v", flags) + + +@skipUnless(hasattr(Sniffamizer, "option_everywhere"), "Feature disabled") +class TestSniffamizerEverywhereVanilla(Bases.TestSniffamizerPool): + """ + Test that everywhere + vanilla ingredients does add extra items and locations + """ + options: typing.Dict[str, typing.Any] = { + "sniffamizer": "everywhere", + "sniff_ingredients": "vanilla_ingredients", + } + + def test_flags(self) -> None: + flags = self.world.options.flags + self.assertIn("S", flags) + self.assertNotIn("v", flags) + + +@skipUnless(hasattr(Sniffamizer, "option_everywhere"), "Feature disabled") +class TestSniffamizerEverywhereRandom(Bases.TestSniffamizerPool): + """ + Test that everywhere + random ingredients also adds extra items and locations + """ + options: typing.Dict[str, typing.Any] = { + "sniffamizer": "everywhere", + "sniff_ingredients": "random_ingredients", + } + + def test_flags(self) -> None: + flags = self.world.options.flags + self.assertIn("S", flags) + self.assertIn("v", flags) + + +@skipUnless(hasattr(Sniffamizer, "option_everywhere"), "Feature disabled") +class EverywhereAccessTest(SoETestBase): + """ + Test that everywhere has certain rules + """ + options: typing.Dict[str, typing.Any] = { + "sniffamizer": "everywhere", + } + + @staticmethod + def _resolve_numbers(spots: typing.Mapping[str, typing.Iterable[int]]) -> typing.List[str]: + return [f"{name} #{number}" for name, numbers in spots.items() for number in numbers] + + def test_knight_basher(self) -> None: + locations = ["Mungola", "Lightning Storm"] + self._resolve_numbers({ + "Gomi's Tower Sniff": range(473, 491), + "Gomi's Tower": range(195, 199), + }) + items = [["Knight Basher"]] + self.assertAccessDependency(locations, items) From 4391d1f4c13cdf2295481d8c51f9ef8f58bf8347 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Thu, 28 Mar 2024 18:05:39 -0600 Subject: [PATCH 22/34] Pokemon Emerald: Fix opponents learning non-randomized TMs (#3025) --- worlds/pokemon_emerald/__init__.py | 16 ++++++++-------- worlds/pokemon_emerald/opponents.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/worlds/pokemon_emerald/__init__.py b/worlds/pokemon_emerald/__init__.py index 65bcce3a3296..c7f060a72969 100644 --- a/worlds/pokemon_emerald/__init__.py +++ b/worlds/pokemon_emerald/__init__.py @@ -569,14 +569,6 @@ def generate_output(self, output_directory: str) -> None: self.modified_misc_pokemon = copy.deepcopy(emerald_data.misc_pokemon) self.modified_starters = copy.deepcopy(emerald_data.starters) - randomize_abilities(self) - randomize_learnsets(self) - randomize_tm_hm_compatibility(self) - randomize_legendary_encounters(self) - randomize_misc_pokemon(self) - randomize_opponent_parties(self) - randomize_starters(self) - # Modify catch rate min_catch_rate = min(self.options.min_catch_rate.value, 255) for species in self.modified_species.values(): @@ -591,6 +583,14 @@ def generate_output(self, output_directory: str) -> None: new_moves.add(new_move) self.modified_tmhm_moves[i] = new_move + randomize_abilities(self) + randomize_learnsets(self) + randomize_tm_hm_compatibility(self) + randomize_legendary_encounters(self) + randomize_misc_pokemon(self) + randomize_opponent_parties(self) + randomize_starters(self) + create_patch(self, output_directory) del self.modified_trainers diff --git a/worlds/pokemon_emerald/opponents.py b/worlds/pokemon_emerald/opponents.py index f485282515a1..09e947546d7c 100644 --- a/worlds/pokemon_emerald/opponents.py +++ b/worlds/pokemon_emerald/opponents.py @@ -80,7 +80,7 @@ def randomize_opponent_parties(world: "PokemonEmeraldWorld") -> None: per_species_tmhm_moves[new_species.species_id] = sorted({ world.modified_tmhm_moves[i] for i, is_compatible in enumerate(int_to_bool_array(new_species.tm_hm_compatibility)) - if is_compatible + if is_compatible and world.modified_tmhm_moves[i] not in world.blacklisted_moves }) # TMs and HMs compatible with the species From 9dc708978bd00890afcd3426f829a5ac53cbe136 Mon Sep 17 00:00:00 2001 From: Trevor L <80716066+TRPG0@users.noreply.github.com> Date: Thu, 28 Mar 2024 18:26:58 -0600 Subject: [PATCH 23/34] Hylics 2: Fix invalid multiworld data, use `self.random` instead of `self.multiworld.random` (#3001) * Hylics 2: Fixes * Rewrite loop --- worlds/hylics2/__init__.py | 79 +++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 44 deletions(-) diff --git a/worlds/hylics2/__init__.py b/worlds/hylics2/__init__.py index 1c51bacc5d67..cb7ae4498279 100644 --- a/worlds/hylics2/__init__.py +++ b/worlds/hylics2/__init__.py @@ -34,8 +34,6 @@ class Hylics2World(World): location_name_to_id = {data["name"]: loc_id for loc_id, data in all_locations.items()} option_definitions = Options.hylics2_options - topology_present: bool = True - data_version = 3 start_location = "Waynehouse" @@ -51,10 +49,6 @@ def create_item(self, name: str) -> "Hylics2Item": return Hylics2Item(name, self.all_items[item_id]["classification"], item_id, player=self.player) - def add_item(self, name: str, classification: ItemClassification, code: int) -> "Item": - return Hylics2Item(name, classification, code, self.player) - - def create_event(self, event: str): return Hylics2Item(event, ItemClassification.progression_skip_balancing, None, self.player) @@ -62,7 +56,7 @@ def create_event(self, event: str): # set random starting location if option is enabled def generate_early(self): if self.multiworld.random_start[self.player]: - i = self.multiworld.random.randint(0, 3) + i = self.random.randint(0, 3) if i == 0: self.start_location = "Waynehouse" elif i == 1: @@ -77,26 +71,26 @@ def create_items(self): pool = [] # add regular items - for i, data in Items.item_table.items(): - if data["count"] > 0: - for j in range(data["count"]): - pool.append(self.add_item(data["name"], data["classification"], i)) + for item in Items.item_table.values(): + if item["count"] > 0: + for _ in range(item["count"]): + pool.append(self.create_item(item["name"])) # add party members if option is enabled if self.multiworld.party_shuffle[self.player]: - for i, data in Items.party_item_table.items(): - pool.append(self.add_item(data["name"], data["classification"], i)) + for item in Items.party_item_table.values(): + pool.append(self.create_item(item["name"])) # handle gesture shuffle if not self.multiworld.gesture_shuffle[self.player]: # add gestures to pool like normal - for i, data in Items.gesture_item_table.items(): - pool.append(self.add_item(data["name"], data["classification"], i)) + for item in Items.gesture_item_table.values(): + pool.append(self.create_item(item["name"])) # add '10 Bones' items if medallion shuffle is enabled if self.multiworld.medallion_shuffle[self.player]: - for i, data in Items.medallion_item_table.items(): - for j in range(data["count"]): - pool.append(self.add_item(data["name"], data["classification"], i)) + for item in Items.medallion_item_table.values(): + for _ in range(item["count"]): + pool.append(self.create_item(item["name"])) # add to world's pool self.multiworld.itempool += pool @@ -107,48 +101,45 @@ def pre_fill(self): if self.multiworld.gesture_shuffle[self.player] == 2: # vanilla locations gestures = Items.gesture_item_table self.multiworld.get_location("Waynehouse: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200678]["name"], gestures[200678]["classification"], 200678)) + .place_locked_item(self.create_item("POROMER BLEB")) self.multiworld.get_location("Afterlife: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200683]["name"], gestures[200683]["classification"], 200683)) + .place_locked_item(self.create_item("TELEDENUDATE")) self.multiworld.get_location("New Muldul: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200679]["name"], gestures[200679]["classification"], 200679)) + .place_locked_item(self.create_item("SOUL CRISPER")) self.multiworld.get_location("Viewax's Edifice: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200680]["name"], gestures[200680]["classification"], 200680)) + .place_locked_item(self.create_item("TIME SIGIL")) self.multiworld.get_location("TV Island: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200681]["name"], gestures[200681]["classification"], 200681)) + .place_locked_item(self.create_item("CHARGE UP")) self.multiworld.get_location("Juice Ranch: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200682]["name"], gestures[200682]["classification"], 200682)) + .place_locked_item(self.create_item("FATE SANDBOX")) self.multiworld.get_location("Foglast: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200684]["name"], gestures[200684]["classification"], 200684)) + .place_locked_item(self.create_item("LINK MOLLUSC")) self.multiworld.get_location("Drill Castle: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200688]["name"], gestures[200688]["classification"], 200688)) + .place_locked_item(self.create_item("NEMATODE INTERFACE")) self.multiworld.get_location("Sage Airship: TV", self.player)\ - .place_locked_item(self.add_item(gestures[200685]["name"], gestures[200685]["classification"], 200685)) + .place_locked_item(self.create_item("BOMBO - GENESIS")) elif self.multiworld.gesture_shuffle[self.player] == 1: # TVs only - gestures = list(Items.gesture_item_table.items()) - tvs = list(Locations.tv_location_table.items()) + gestures = [gesture["name"] for gesture in Items.gesture_item_table.values()] + tvs = [tv["name"] for tv in Locations.tv_location_table.values()] # if Extra Items in Logic is enabled place CHARGE UP first and make sure it doesn't get # placed at Sage Airship: TV or Foglast: TV if self.multiworld.extra_items_in_logic[self.player]: - tv = self.multiworld.random.choice(tvs) - gest = gestures.index((200681, Items.gesture_item_table[200681])) - while tv[1]["name"] == "Sage Airship: TV" or tv[1]["name"] == "Foglast: TV": - tv = self.multiworld.random.choice(tvs) - self.multiworld.get_location(tv[1]["name"], self.player)\ - .place_locked_item(self.add_item(gestures[gest][1]["name"], gestures[gest][1]["classification"], - gestures[gest])) - gestures.remove(gestures[gest]) + tv = self.random.choice(tvs) + while tv == "Sage Airship: TV" or tv == "Foglast: TV": + tv = self.random.choice(tvs) + self.multiworld.get_location(tv, self.player)\ + .place_locked_item(self.create_item("CHARGE UP")) + gestures.remove("CHARGE UP") tvs.remove(tv) - for i in range(len(gestures)): - gest = self.multiworld.random.choice(gestures) - tv = self.multiworld.random.choice(tvs) - self.multiworld.get_location(tv[1]["name"], self.player)\ - .place_locked_item(self.add_item(gest[1]["name"], gest[1]["classification"], gest[0])) - gestures.remove(gest) - tvs.remove(tv) + self.random.shuffle(gestures) + self.random.shuffle(tvs) + while gestures: + gesture = gestures.pop() + tv = tvs.pop() + self.get_location(tv).place_locked_item(self.create_item(gesture)) def fill_slot_data(self) -> Dict[str, Any]: From 301d9de9758e360ccec5399f3f9d922f1c034e45 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 28 Mar 2024 19:31:59 -0500 Subject: [PATCH 24/34] Docs: adding games rework (#2892) * Docs: complete adding games.md rework * remove all the now unused images * review changes * address medic's review * address more comments --- docs/adding games.md | 347 +++++----------------- docs/img/creepy-castle-directory.png | Bin 35874 -> 0 bytes docs/img/gato-roboto-directory.png | Bin 81020 -> 0 bytes docs/img/heavy-bullets-data-directory.png | Bin 56842 -> 0 bytes docs/img/heavy-bullets-directory.png | Bin 38535 -> 0 bytes docs/img/stardew-valley-directory.png | Bin 66397 -> 0 bytes docs/options api.md | 9 +- 7 files changed, 82 insertions(+), 274 deletions(-) delete mode 100644 docs/img/creepy-castle-directory.png delete mode 100644 docs/img/gato-roboto-directory.png delete mode 100644 docs/img/heavy-bullets-data-directory.png delete mode 100644 docs/img/heavy-bullets-directory.png delete mode 100644 docs/img/stardew-valley-directory.png diff --git a/docs/adding games.md b/docs/adding games.md index e9f7860fc650..9d2860b4a196 100644 --- a/docs/adding games.md +++ b/docs/adding games.md @@ -1,269 +1,78 @@ -# How do I add a game to Archipelago? - -This guide is going to try and be a broad summary of how you can do just that. -There are two key steps to incorporating a game into Archipelago: - -- Game Modification -- Archipelago Server Integration - -Refer to the following documents as well: - -- [network protocol.md](/docs/network%20protocol.md) for network communication between client and server. -- [world api.md](/docs/world%20api.md) for documentation on server side code and creating a world package. - -# Game Modification - -One half of the work required to integrate a game into Archipelago is the development of the game client. This is -typically done through a modding API or other modification process, described further down. - -As an example, modifications to a game typically include (more on this later): - -- Hooking into when a 'location check' is completed. -- Networking with the Archipelago server. -- Optionally, UI or HUD updates to show status of the multiworld session or Archipelago server connection. - -In order to determine how to modify a game, refer to the following sections. - -## Engine Identification - -This is a good way to make the modding process much easier. Being able to identify what engine a game was made in is -critical. The first step is to look at a game's files. Let's go over what some game files might look like. It’s -important that you be able to see file extensions, so be sure to enable that feature in your file viewer of choice. -Examples are provided below. - -### Creepy Castle - -![Creepy Castle Root Directory in Windows Explorer](/docs/img/creepy-castle-directory.png) - -This is the delightful title Creepy Castle, which is a fantastic game that I highly recommend. It’s also your worst-case -scenario as a modder. All that’s present here is an executable file and some meta-information that Steam uses. You have -basically nothing here to work with. If you want to change this game, the only option you have is to do some pretty -nasty disassembly and reverse engineering work, which is outside the scope of this tutorial. Let’s look at some other -examples of game releases. - -### Heavy Bullets - -![Heavy Bullets Root Directory in Window's Explorer](/docs/img/heavy-bullets-directory.png) - -Here’s the release files for another game, Heavy Bullets. We see a .exe file, like expected, and a few more files. -“hello.txt” is a text file, which we can quickly skim in any text editor. Many games have them in some form, usually -with a name like README.txt, and they may contain information about a game, such as a EULA, terms of service, licensing -information, credits, and general info about the game. You usually won’t find anything too helpful here, but it never -hurts to check. In this case, it contains some credits and a changelog for the game, so nothing too important. -“steam_api.dll” is a file you can safely ignore, it’s just some code used to interface with Steam. -The directory “HEAVY_BULLETS_Data”, however, has some good news. - -![Heavy Bullets Data Directory in Window's Explorer](/docs/img/heavy-bullets-data-directory.png) - -Jackpot! It might not be obvious what you’re looking at here, but I can instantly tell from this folder’s contents that -what we have is a game made in the Unity Engine. If you look in the sub-folders, you’ll seem some .dll files which -affirm our suspicions. Telltale signs for this are directories titled “Managed” and “Mono”, as well as the numbered, -extension-less level files and the sharedassets files. If you've identified the game as a Unity game, some useful tools -and information to help you on your journey can be found at this -[Unity Game Hacking guide.](https://github.com/imadr/Unity-game-hacking) - -### Stardew Valley - -![Stardew Valley Root Directory in Window's Explorer](/docs/img/stardew-valley-directory.png) - -This is the game contents of Stardew Valley. A lot more to look at here, but some key takeaways. -Notice the .dll files which include “CSharp” in their name. This tells us that the game was made in C#, which is good -news. Many games made in C# can be modified using the same tools found in our Unity game hacking toolset; namely BepInEx -and MonoMod. - -### Gato Roboto - -![Gato Roboto Root Directory in Window's Explorer](/docs/img/gato-roboto-directory.png) - -Our last example is the game Gato Roboto. This game is made in GameMaker, which is another green flag to look out for. -The giveaway is the file titled "data.win". This immediately tips us off that this game was made in GameMaker. For -modifying GameMaker games the [Undertale Mod Tool](https://github.com/krzys-h/UndertaleModTool) is incredibly helpful. - -This isn't all you'll ever see looking at game files, but it's a good place to start. -As a general rule, the more files a game has out in plain sight, the more you'll be able to change. -This especially applies in the case of code or script files - always keep a lookout for anything you can use to your -advantage! - -## Open or Leaked Source Games - -As a side note, many games have either been made open source, or have had source files leaked at some point. -This can be a boon to any would-be modder, for obvious reasons. Always be sure to check - a quick internet search for -"(Game) Source Code" might not give results often, but when it does, you're going to have a much better time. - -Be sure never to distribute source code for games that you decompile or find if you do not have express permission to do -so, or to redistribute any materials obtained through similar methods, as this is illegal and unethical. - -## Modifying Release Versions of Games - -However, for now we'll assume you haven't been so lucky, and have to work with only what’s sitting in your install -directory. Some developers are kind enough to deliberately leave you ways to alter their games, like modding tools, -but these are often not geared to the kind of work you'll be doing and may not help much. - -As a general rule, any modding tool that lets you write actual code is something worth using. - -### Research - -The first step is to research your game. Even if you've been dealt the worst hand in terms of engine modification, -it's possible other motivated parties have concocted useful tools for your game already. -Always be sure to search the Internet for the efforts of other modders. - -### Other helpful tools - -Depending on the game’s underlying engine, there may be some tools you can use either in lieu of or in addition to -existing game tools. - -#### [CheatEngine](https://cheatengine.org/) - -CheatEngine is a tool with a very long and storied history. -Be warned that because it performs live modifications to the memory of other processes, it will likely be flagged as -malware (because this behavior is most commonly found in malware and rarely used by other programs). -If you use CheatEngine, you need to have a deep understanding of how computers work at the nuts and bolts level, -including binary data formats, addressing, and assembly language programming. - -The tool itself is highly complex and even I have not yet charted its expanses. -However, it can also be a very powerful tool in the right hands, allowing you to query and modify gamestate without ever -modifying the actual game itself. -In theory it is compatible with any piece of software you can run on your computer, but there is no "easy way" to do -anything with it. - -### What Modifications You Should Make to the Game - -We talked about this briefly in [Game Modification](#game-modification) section. -The next step is to know what you need to make the game do now that you can modify it. Here are your key goals: - -- Know when the player has checked a location, and react accordingly -- Be able to receive items from the server on the fly -- Keep an index for items received in order to resync from disconnections -- Add interface for connecting to the Archipelago server with passwords and sessions -- Add commands for manually rewarding, re-syncing, releasing, and other actions - -Refer to the [Network Protocol documentation](/docs/network%20protocol.md) for how to communicate with Archipelago's -servers. - -## But my Game is a console game. Can I still add it? - -That depends – what console? - -### My Game is a recent game for the PS4/Xbox-One/Nintendo Switch/etc - -Most games for recent generations of console platforms are inaccessible to the typical modder. It is generally advised -that you do not attempt to work with these games as they are difficult to modify and are protected by their copyright -holders. Most modern AAA game studios will provide a modding interface or otherwise deny modifications for their console -games. - -### My Game isn’t that old, it’s for the Wii/PS2/360/etc - -This is very complex, but doable. -If you don't have good knowledge of stuff like Assembly programming, this is not where you want to learn it. -There exist many disassembly and debugging tools, but more recent content may have lackluster support. - -### My Game is a classic for the SNES/Sega Genesis/etc - -That’s a lot more feasible. -There are many good tools available for understanding and modifying games on these older consoles, and the emulation -community will have figured out the bulk of the console’s secrets. -Look for debugging tools, but be ready to learn assembly. -Old consoles usually have their own unique dialects of ASM you’ll need to get used to. - -Also make sure there’s a good way to interface with a running emulator, since that’s the only way you can connect these -older consoles to the Internet. -There are also hardware mods and flash carts, which can do the same things an emulator would when connected to a -computer, but these will require the same sort of interface software to be written in order to work properly; from your -perspective the two won't really look any different. - -### My Game is an exclusive for the Super Baby Magic Dream Boy. It’s this console from the Soviet Union that- - -Unless you have a circuit schematic for the Super Baby Magic Dream Boy sitting on your desk, no. -Obscurity is your enemy – there will likely be little to no emulator or modding information, and you’d essentially be -working from scratch. - -## How to Distribute Game Modifications - -**NEVER EVER distribute anyone else's copyrighted work UNLESS THEY EXPLICITLY GIVE YOU PERMISSION TO DO SO!!!** - -This is a good way to get any project you're working on sued out from under you. -The right way to distribute modified versions of a game's binaries, assuming that the licensing terms do not allow you -to copy them wholesale, is as patches. - -There are many patch formats, which I'll cover in brief. The common theme is that you can’t distribute anything that -wasn't made by you. Patches are files that describe how your modified file differs from the original one, thus avoiding -the issue of distributing someone else’s original work. - -Users who have a copy of the game just need to apply the patch, and those who don’t are unable to play. - -### Patches - -#### IPS - -IPS patches are a simple list of chunks to replace in the original to generate the output. It is not possible to encode -moving of a chunk, so they may inadvertently contain copyrighted material and should be avoided unless you know it's -fine. - -#### UPS, BPS, VCDIFF (xdelta), bsdiff - -Other patch formats generate the difference between two streams (delta patches) with varying complexity. This way it is -possible to insert bytes or move chunks without including any original data. Bsdiff is highly optimized and includes -compression, so this format is used by APBP. - -Only a bsdiff module is integrated into AP. If the final patch requires or is based on any other patch, convert them to -bsdiff or APBP before adding it to the AP source code as "basepatch.bsdiff4" or "basepatch.apbp". - -#### APBP Archipelago Binary Patch - -Starting with version 4 of the APBP format, this is a ZIP file containing metadata in `archipelago.json` and additional -files required by the game / patching process. For ROM-based games the ZIP will include a `delta.bsdiff4` which is the -bsdiff between the original and the randomized ROM. - -To make using APBP easy, they can be generated by inheriting from `worlds.Files.APDeltaPatch`. - -### Mod files - -Games which support modding will usually just let you drag and drop the mod’s files into a folder somewhere. -Mod files come in many forms, but the rules about not distributing other people's content remain the same. -They can either be generic and modify the game using a seed or `slot_data` from the AP websocket, or they can be -generated per seed. If at all possible, it's generally best practice to collect your world information from `slot_data` -so that the users don't have to move files around in order to play. - -If the mod is generated by AP and is installed from a ZIP file, it may be possible to include APBP metadata for easy -integration into the Webhost by inheriting from `worlds.Files.APContainer`. - -## Archipelago Integration - -In order for your game to communicate with the Archipelago server and generate the necessary randomized information, -you must create a world package in the main Archipelago repo. This section will cover the requisites and expectations -and show the basics of a world. More in depth documentation on the available API can be read in -the [world api doc.](/docs/world%20api.md) -For setting up your working environment with Archipelago refer -to [running from source](/docs/running%20from%20source.md) and the [style guide](/docs/style.md). - -### Requirements - -A world implementation requires a few key things from its implementation - -- A folder within `worlds` that contains an `__init__.py` - - This is what defines it as a Python package and how it's able to be imported - into Archipelago's generation system. During generation time only code that is - defined within this file will be run. It's suggested to split up your information - into more files to improve readability, but all of that information can be - imported at its base level within your world. -- A `World` subclass where you create your world and define all of its rules - and the following requirements: - - Your items and locations need a `item_name_to_id` and `location_name_to_id`, - respectively, mapping. - - An `option_definitions` mapping of your game options with the format - `{name: Class}`, where `name` uses Python snake_case. - - You must define your world's `create_item` method, because this may be called - by the generator in certain circumstances - - When creating your world you submit items and regions to the Multiworld. - - These are lists of said objects which you can access at - `self.multiworld.itempool` and `self.multiworld.regions`. Best practice for - adding to these lists is with either `append` or `extend`, where `append` is a - single object and `extend` is a list. - - Do not use `=` as this will delete other worlds' items and regions. - - Regions are containers for holding your world's Locations. - - Locations are where players will "check" for items and must exist within - a region. It's also important for your world's submitted items to be the same as - its submitted locations count. - - You must always have a "Menu" Region from which the generation algorithm - uses to enter the game and access locations. -- Make sure to check out [world maintainer.md](/docs/world%20maintainer.md) before publishing. \ No newline at end of file +# Adding Games + +Adding a new game to Archipelago has two major parts: + +* Game Modification to communicate with Archipelago server (hereafter referred to as "client") +* Archipelago Generation and Server integration plugin (hereafter referred to as "world") + +This document will attempt to illustrate the bare minimum requirements and expectations of both parts of a new world +integration. As game modification wildly varies by system and engine, and has no bearing on the Archipelago protocol, +it will not be detailed here. + +## Client + +The client is an intermediary program between the game and the Archipelago server. This can either be a direct +modification to the game, an external program, or both. This can be implemented in nearly any modern language, but it +must fulfill a few requirements in order to function as expected. The specific requirements the game client must follow +to behave as expected are: + +* Handle both secure and unsecure websocket connections +* Detect and react when a location has been "checked" by the player by sending a network packet to the server +* Receive and parse network packets when the player receives an item from the server, and reward it to the player on +demand + * **Any** of your items can be received any number of times, up to and far surpassing those that the game might +normally expect from features such as starting inventory, item link replacement, or item cheating + * Players and the admin can cheat items to the player at any time with a server command, and these items may not have +a player or location attributed to them +* Be able to change the port for saved connection info + * Rooms hosted on the website attempt to reserve their port, but since there are a limited number of ports, this +privilege can be lost, requiring the room to be moved to a new port +* Reconnect if the connection is unstable and lost while playing +* Keep an index for items received in order to resync. The ItemsReceived Packets are a single list with guaranteed +order. +* Receive items that were sent to the player while they were not connected to the server + * The player being able to complete checks while offline and sending them when reconnecting is a good bonus, but not +strictly required +* Send a status update packet alerting the server that the player has completed their goal + +Libraries for most modern languages and the spec for various packets can be found in the +[network protocol](/docs/network%20protocol.md) API reference document. + +## World + +The world is your game integration for the Archipelago generator, webhost, and multiworld server. It contains all the +information necessary for creating the items and locations to be randomized, the logic for item placement, the +datapackage information so other game clients can recognize your game data, and documentation. Your world must be +written as a Python package to be loaded by Archipelago. This is currently done by creating a fork of the Archipelago +repository and creating a new world package in `/worlds/`. A bare minimum world implementation must satisfy the +following requirements: + +* A folder within `/worlds/` that contains an `__init__.py` +* A `World` subclass where you create your world and define all of its rules +* A unique game name +* For webhost documentation and behaviors, a `WebWorld` subclass that must be instantiated in the `World` class +definition + * The game_info doc must follow the format `{language_code}_{game_name}.md` +* A mapping for items and locations defining their names and ids for clients to be able to identify them. These are +`item_name_to_id` and `location_name_to_id`, respectively. +* Create an item when `create_item` is called both by your code and externally +* An `options_dataclass` defining the options players have available to them +* A `Region` for your player with the name "Menu" to start from +* Create a non-zero number of locations and add them to your regions +* Create a non-zero number of items **equal** to the number of locations and add them to the multiworld itempool +* All items submitted to the multiworld itempool must not be manually placed by the World. If you need to place specific +items, there are multiple ways to do so, but they should not be added to the multiworld itempool. + +Notable caveats: +* The "Menu" region will always be considered the "start" for the player +* The "Menu" region is *always* considered accessible; i.e. the player is expected to always be able to return to the +start of the game from anywhere +* When submitting regions or items to the multiworld (multiworld.regions and multiworld.itempool respectively), use +`append`, `extend`, or `+=`. **Do not use `=`** +* Regions are simply containers for locations that share similar access rules. They do not have to map to +concrete, physical areas within your game and can be more abstract like tech trees or a questline. + +The base World class can be found in [AutoWorld](/worlds/AutoWorld.py). Methods available for your world to call during +generation can be found in [BaseClasses](/BaseClasses.py) and [Fill](/Fill.py). Some examples and documentation +regarding the API can be found in the [world api doc](/docs/world%20api.md). +Before publishing, make sure to also check out [world maintainer.md](/docs/world%20maintainer.md). diff --git a/docs/img/creepy-castle-directory.png b/docs/img/creepy-castle-directory.png deleted file mode 100644 index af4fdc584dc00d6cc6ee1c5a6425b11cc419039b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35874 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 diff --git a/docs/img/gato-roboto-directory.png b/docs/img/gato-roboto-directory.png deleted file mode 100644 index fda0eb5ff992b9870224c1511e0f9108a69b18d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81020 zcmce;Wl&sOw*^WF1PFxS1Si2gNN^9XL4sQ#KnHi1G!~o?+zAfBX*{@VH}3B4Zf}$C zobR4!s*oSF?NfT64`c=NMzom7os_k}sYUK8J&Ydm$|)rVIy%0E2^rFF}3= zyz?uTtq%^498OwHMAapEx4~5dN4@bOf?7W+p_UzbyWf8@>(0KgP&r^IC%5dg+z5lG zhw#bFCh6jc;KYG=MKBS>L~!<=iHK2#Pp}5Kl=O7V7teFEM#ghfo0LadvbDUx4kPDS zy}Qe-3oh6$*xugX_FrE)`JL*grI1#@`%!meEDg#d0u_4TuL~3hJ$z_Cj_n9Imjp3- z6FEzDoh};4DdICJriCxw->#J*uifKKNS``e&|ZJ*oF3!ybbD*<$|!o{O!6(K3x|lF zHsqn!DJ@Enq~+%btANJ3%kH4>>BdonddPLfT2C7L(p6N0pxO4p#$G4(#>cW$1rlGH zX*hc;U&IY{GlC}O=Np`!ygnTpnqy^bdn_Cr(aveXJBtZU(SiasJJWqtpN@|D=3e?W zm3P!Z=aMeKl>>>m)y)k_EQM{Drmvh zN|Ezs`0dkxtqSgp9H{6jBq5&Pk&xP7vBfVa>aAHncPQ~YJflweW)>lM1^ zE@X`?*bt#H#tIf>gkPaK-p1r7e(&>b z>XnsIJlgG9oAE1ZC5egapFeJ1Rxmi{6&z>BNqYxiVHu-Wj(O(6x9HBGRle3^o>VJF zdzZGBN19>$o~lYkYrHbNf#%BlWz^-&Ln@C}G#zu>6x+Ap`-OzN?5aI_qdZAyRLy*2 zjn{Ek@#)p}bS=m5jcg1Bv&t5GKro8a;X@174eeeogybPrt-cAA^xEl+$Z96wL7%84 zV{LW=4L^ou*0lS>jD6xxTMoh3lye8KP}w+GzhB|cyGm9-?e)@iIr4s(UV7mdHwkonaxD(b@I`vb1|Jq<3J)F+03MHnhnG=W ziqSzuwH+aE#IuP$m>joox9@y;djhSMxVzd&TXAl>A*uFi{`%zde8!s9pc$^k>*+JJ z<_Mwt?!AfOVW0T;S84CO)G^4O!VwF&;jpr@f~>40C{t2kT=N{qjCVxKvBt>I@NnrH8GS0*y=jn897~^u*G2upQrk-*91Ds@ z1z^fGZfEo~{F6I7@{!~pSrk*vy+!tHow-)SLs(L$j7ysC>oUX~&Jsf|`g(hnslHWS z^Z)H*uj+mYqdxzEXPo-oR78Xsm80tz?O}3@6|4sMC%RfX%Bm(G4RqgY9PU@;Q@-Hf zWPZ-Q)pWi*9u|w$ghX^Nz|e!qJQNz#`yZUT&~vyDr-8BWA;gcmuFG<&siM7l3y065 z7aeV_si~=>nl$Rz+uQpCCu#n-p7Po8YVA4xD5?Ml|WbrbsD zx@E+iVVH0<;gfqZva+>y<>lozr<+Ps4pR9>-?f5V)*xJZ^}g>0ox| z$&!M=Um@WQ>`7fUuw2_eK&d|-mkSxPjv868ItBG!2>4|!-)ZgTm}cl&j0`zGwsUZB znC_`?znHeky@#`6y2Z6h6MS668C2&yW_5F(S2#F+dJS$p%lodj(aN;@-^){MoEns$ z=W0xsdY_0t@eXCZugjE-urucay*DAq?wfe>-tJiiTIixR&*L1!( zDv>Q~x?q&ImXo}=LL)tRCSzD2W4%UaN^OgM%E-<^paY7nHYptzmgk^IHwM^aEzKRU z$8d$z7e=wlGs?fb#Pq`rbm9zWLNmnDBk18d2a+Ai!(_Pj3+Qs^6#=&%n_L;cIzl24 zVgXON{A3NkKT5VZ%xV2_1!pC2!!Ub)@&p2zf83Y1K6`^CNda~+5=fvhHiZHOj(~)V}R?u>IwekiptrR!8pgx2y2>)HAiCy2-14}sfC%*k%yILIieDK873Wnse zbhb_K8rp-kEys7|IvVeOzU*$^vS`?Ha>x#q&BCBDOt6L*|dzDOAsSnjvw zsVJ&X+uE$r;aQMz{82C2al>t|vuvK{B=p~@1`6laqjDT%+n_rtq|bS94gchCbH1v% z9{=p%(LkWSpd3DGC!U@#fCsGn;^5X(P%0F;Vy1+wxu~|Ob#LO8YbP=X!|^eyYTU0% z;#DpVQ_G5Rqx7;vzCgQUX|ohH_%Qu&?ztgtczJ2wawRV16wi0?^85;f4873^iKAKpz!?btJaWVz=#F-aMXZD~@B9;d5(a&LsT=AiMKJ)UTHhdUg&v$`i05 z(|Tpazmf^E!|45qqdf!^f)uL8vR($*bVKYe3V+;!OqStanVWy?FZG zyvp-mm6;6Fp_wsJriH?NgFPR;EeQKWSk2ZFer<>|DL<_>mrj?klM)ZE4Vh((n6FVN zUM@K^v{gex>a|7M{%;8IIYde(eY$sjm5;tgaGx4>02Q-&_(*>+BuUm0O2B@&nHf<~ z{Jv*@P82-;2FKI`TxGnYHnwKQgf!O@bF$2$Q)AP@e9ZL0po?teSm%o-=@JiE;=jP@ zR3|xHxc>eeN9QIa%s$HYj42@JAxwB=3faS(6Mi8rs99*xZ{>y^^YU_4Y=A*mN7={e z*GF7U?ea0Qq)xli+-6|4WV|VmtwsNVJz<2oh>1cURDYuaN%cdG5lt2TzOYw|)9M;N zITy=Ip4yr3DN!Lz+SPB&WjXa`e~UZT-jn|u8a^0yf48FjdyD;N4O+GTCx8Cu9mG20 z=QRJqz%Hn{rb~Z^&p$T>rXu_w;H=F3FB~fRB>2CH`L72DpnXEr8t(aOve*n3fY;}u z{m=XVd7>}{D{I*XGDnI6KJ4E^f~7`B<6wcn@c;hGJ!x543NRk+zi=zT;+GPI@6*7Mn`g~J(y?V;cW(c8Or)M({zw4>l4+WJFow0J zA%;7CQjNK<`o)&bC2T~8A)%<74ab(JGQ44eBdABsrKXsp8|qGL7SoWR|1+eF5W%Mu zL#E^CrwVua2-!^``X$~kcXk>(yggu{*l|gpc${&cma{B1LQXbQZiP148!&+JPsbRs zB}k2VS5y*%w@g4@C`M({a5;O8h2{3?|*`S%>&3Va&@-4+VqT`4PNKE^+k|4H*o+IlODy25|f)e(-3 zjd45e#*bj_0bbPa_hjpUEvq3!@5{k5I26^zU<@&o@fO+p&K*^+!2|W-_c^?e^1Q@{ zUY=97#$Y7LE|gxj1Ucks$d{-%1VZmx7b3mU=^Om|1mQk00eo{Bz4^fFYYCIEj<0e~ zZP#*2uF8F$uVGmkB^K~ZO$@wy%3gt%y2!^YbCDW@yY{!2RN9~M>-(#Uqzqi~ZKDYu ztjic7CHA|vH!G`Eao_F#L2mOhoe$<+w)1msZZBA9hFMUZs? zHVvC^aQ{WWgMW=?QYD|nkE(UW?4#D`dowcMvS=A+d+TfR`(aNpUiTb@RO1TWNBQ0- z-Pl{?!!Ut~zTTrbTfHAX{$zyxm^ZEF@m)TsjF7WeOqagf!7@%b3nd=ea)7aVH#g5z z4;g+PG!UWqdM%f-_plS0zcbw=sDhL-2q&Al6KScHWfQQf- zYw3a6fiHhcTY|Bwe{3n1M7}IX-ry%HS1|bcDh^>|c{p2k*7o_@KiRt3)?7VTs>iYP z@8e#EyrQCxGNUdGV&c%nMFV0!C$!4SN|&`5^~2RD#eyH8P+>kAfWhP+EIRKHm2Svk z4|=;ILDf8h7Ye=b8#G+2c3F^RZpo~lbC|w?t@v{{L<;I3+SE+1|d+C zpV8z_7?qP?q(kPgI`lkpLeENqelk{P47WdXc0jYc2_SzMwrvk6eKRo8^*@OWV=e-4 z5F>y}yIifs0ocT-OWYl}dL-2!F+rZGfz5X(y_k??mSn(pY)L(b=Ubw*1)IMXzC83+ zURdv`ut%2R54p)?8jeD~)JsnhIl9=DOPP~T=aE@*pd3IeCgp=d?FMM$tYy*P~M8L2ou@G)lP|%I$_kFE-J6yjQ$#f@-N|C5e$;nD7|rn z?+5y%26^cVs&!HDXNZ7x!=H~k86)x$kbH;1Ag>XHT z5(?0i_GZd4{w?nv$>Zx(LGW98R>kAw1V^e?z@MOR@}MQVy|2M|!v9W;7{fbYZ&4tB zxxDot*^j77k30H^K$Rl$VVU4m>zIB&f^(&%)NzyjEmi~RB~1?-kV7#3l|#t0w(e$x z(xKRxE;bItUO%DDET;sIm)HE5pSac&USWZr{4Z3n_kV{0BmMt)n?m{vV(zz#N0p1m z0sk@yIi%w=+w1OELtN33u;y(bRmFzVD&-@sF{`@Ie z@>Jv!-t5M&{sYmQ_76$O#G6`J2qLF)Qt6louTdMwu>^4c|Ng62&krhD;|ci$wy}+~ z9Xc55o3`o7o$m>?c;@4u4F?kCK7TG0k?1rl)QSP0o__4^)(C5Fr##)6fNnTaL0*5D z_Bt(A|G2VK_lyuc902+HfTr8v_JWOV++eJr*c7Ct#j92<_ukBmP_0nv%+=F#jGB7? z4(Ix*JWQSQHKZH`n<43KSq2I=ed62s&YC;m6=S$#Cu`vdneS(8iJZ(G!GZ-8jq(n4o{Q$qqKzz3VZ%F zOnIY8ea-C5k9A&_#@@E_GBW2o=ogDEzDJWr5ldxVq;0@;!+EWuz!?swh0CCoD=3dt zQSd4Y3YArCNx^UT@!2E3x-xvueSCbmYHu+^P07hQPtlc^lM1ZIb6%Hk=p^ghHjCur z#kvv4$Io$a_e6Dce6-IrA)rWTNqy6BwYC1(Ox~1Qknk3<_<&BJ3FN*F&lcN(_T_RSVheMd(}7hyl&=M@)sw)l?a@w#Aq z{P+?0J~(;?1|=n>KN|2t6PfYa8Z86Ew+`ii;RbhBe#-V=8$O-^)YR0Uu8wh~q@>z^ zzW-KcBpLZNF;RuRDa4ZA_*+y{q*IrQK^3Q@BnLClkMPSK z_Af0y{((WRc=qdJMx%L3v&WGXl7{EIJn>vC&sbTZb$2}AVV>amGx|YqXMDKBp{dNg z{6Bg);9DP*G=q-sZa&d5v^9E~h>43|{cZ&N(I9G>n&y&_c<{D6ECM9}2}?_+#_Mf{ z-T4Znwr?*lrfW5Tje$<)h0+(BO)lVx`y)yPK}d|4*WuOJ*gN3q;xfH1bF_&oE8;x6!0Bqgo7 zmq$k^f?K74X8-E(OX%nbf`X)h`8qqxU#OE15Jr^N)fomgTI=OlU0?qM zY;r~|$SeDe!M0?cq4;;^oF;?G*{+{8q`Hy$FJ>k74=^btxZ@hXaAf}c3C|9+F-H;#g4s~!!{ek^s^1W37N=@GtO2VYc6`8K|HHa_R^9J?v}+JylN3s^sPIJ zBFZ@g^oQ#8I%=&CmakK^C)Mhn0ATw2we$9={OV@1Q?$-ZsXLs{$bGu4bn^P;i5v@70v~Jp!*caRkPQa zcqrglO=x`|$(&^Iym|3%*FvuQ{K}t<=SEEltzEDBK5K*e`=9s3T}S+~2W!-6CwBMZE=nRky1@zF{@X?H3SWxI1a6avR zMF8q0WkC>-n53l9{O?zfATomgIM6^_AL6Ma6fl@WQRC_Q)T^cjzIs7Fh%avVXk-m- z_Ri*oR!Lz;LsOCDOfJ#T{nSaR*AYB#<80_)N%_&qL~UYf#ink_G7zjq?{f7G)t1au zKYn}y=XH5h1qVkvU)d+(DkoW87P&BW=CD!i?o>Qy`CbOtS5nI9w#S8Y1+*}$xjKI$ zE~`cBG!Gx3pz&%QF{sLH%&ea5^(umvUHNa}k)&<0g*~_UZ9~`L_!w(pUWU5@Cqi`^lPysRpX1oIfnA4+OYIjl{oJUaMp@+|t zrQDF!scwjF|ii#?!r}v~Y zA`LE+Rn0h8644xkU8o-q8;bWI zEU8-DD6!`d2nUwpIW<~dULg)L$A&VmCCQu|Dj^Zm+ru~%zr?*XCS|4yQV`^opK3GPS>C2hJUY{DYCDYQI(FrcQ8M_uPr!{sCPR{8i7E7t1?QJs$CnvUJIhpiI)>-o? zJkUgme%IJ9^`klGg{9-QK3aPEV<~~FQYfq=B#xYu6CKzJkt9!<=;$Fh)J+{^o}vT0fP)WWh7Di~o2_T;Ia3`wa-TKZ-Yw4kS~Qu7 z))vxHPA`j0He5Y;o$Ws5<=W6M&};ZLTWOz^`j4RIAXFD4to>lfDf7!rN$cZIHCC9s z%J&fdsOyfgxD_u-Alm^M14xx3#>TkI%gZS~Mc$u3M@x1>T`!luMaHRr-AJ7Y1ZZHv zjH0!uZVHN9&zT*(ycx-oE|{7LT8A*r89|(x=$4aP(h4Ly6v`S^tz4YJ`I&u*^ji9% ztkr}j@$?|q)kw*=)_Q2`gDG9&saNl3y3R72&xGK)^qyHYgvTnP+T1*)e!jQAh6X8B z0;RoG0*yoEH$fhlB>GmJP<_j>Q|=7s2Ksc52QRR&kqWQ%_*lNw*6#Ku+q`UzTS=D!T?@J?|nwoD0hxv;6G_?(MU9CzR7#oVJOWo+WXYT4vH>I*>-0?pM90LML5C z;ix^8Pvyo&g|xPcJ^>1%r1>;t=LBXPoo`rKQDox?_vU>Ie!Zka&FH7@ z*5IKImf%X9+Ph>^a3!PDi8M8vZodqswyKhM>SyOXwr~J|UkukLRZVP(*ms}AfL|Jk z7=~Y3ZHShS(Ky{ZW?9VkU$40*=xG>}6WZ z78OcLO2hHOsf;*{jiAs_vCp5gB)4loLxzP~m4pEJimvmNO8*jYfspu{{{#sf8yjmy z(>Lj^OAj9wQNZenus3(c3ag_`Bz0>b1v*32shaCD`HemSB50+j&I5(b9S zo1Lbib9tV99ho-8IQ5@vZDXK@R&?u-z`*9m9Obmj&3`^=M1TI#?TQM#j<$~ifscWg*G%1;Ge0jCw%1XtI_Zj=SN@W+ ze3KL=Y`;G5WQsS)9F(KZG*nl?4=6YBe9oz4&mk1em2t1YPJp3piEBPa%#anfD|#De zz_f(4e8(duGWMb#LlgyXqd^9Yw`qEL=%ms*Edd)eQ0*lwZcL@%WrNMNvu$(in*{GP zoqdkNSNBYof{+Ohm*kULblLC#oUD-m+lyP(54F%pEYP47*Mj4q05zdK7`cKI%!w`xJiD4M|prXQXg5J_y5gPg~Stp8Fa-C0$-hU+jz-0mxf4}S~W|ABN-D}3PCM6-n}Bb6Vc zV(C2*TSgIl@bbAv{*x{W>HYz|vK-cZ?D-oD+hgW9Y2Ytkwlr$lUgYP0k&@R9!evk{ zGZd$fWzh$Zj>aSlYd3lz0?_w+@^3V0=^lj?`=S{^Y|qZ;khcDXfs&Q33l-Z9Wx{m2|RNN5Oo&r`!V-B)KTcIoC&;XsXNPpxJx)|Gj$Fdx?&4$fks>^-Cj z(!ZUk`gJR7CinC7XCfBI5rZ#co}LY>RlO+OELudgpFu$0W#761kVxXkz`nl#rT6P0%^EVG@( zU>~A>la`S3A-O2z!=plB6&k1q3ykq`MF38gipKI?ZYR1<2%xxYDnBS~)YG>dbg`H? zRH3X^$saK4A?9SGBh0 z4q*m|1A7J+HwNH7(U_)tpq14G&(o)f1N)?KF;&3j5CgEs8$rP*K!TdPWPAvxbRMPdjOJQuOA_UA`W=~I8AWm;XLW~B zCQRYs_Lsq}5vF~zZM*5FDKHGp)~2rUD_Cc#)jh&gRi8IKtuc|$837uzK(@9hi4)F8 z%Tz#I%bB4|R>_g;$ddkKHL(G7Aa&keozym^0g^ld(#y8Y2tj&{`%x9ePqQ^gf=%<_ za8rat`(uj(J@(!{hVM~PJAY{FTA%vl8`yL1tYKb%yA2F{aP0T*d3AzXC>$x_WX3rg zpQmbUS3Ee^2_CMxax{5;e+aKQx2FhfXjOY!?NxQmy96d-?ckff$PZ>tdas*)78s(pZh|Y>Y)Hd36G9m z18g{y(E->npfA$Y;+x~~Djo6*N1?q)T#)ax7o9-sRw$iH&SF{Db*A+~V?2*NUaH$R z-DA#wyp{+jUOU+#*#xn`lH*JpF+q6J;LdOIJF3`VJhBo!FLOG;ZEsZN1?N-Wer17S zVMirP$S4n{@Vy)wvcLO~K9vDYM2C|{0`IV_sJ#z<8+JlL9agbtUBxj7Sj=<A??qDGzJY2!u)(I+TsX`9@K`LtA3z+QC`f@7@Rp} z%zCD8`Us1k9Oxl(&E(8px428EUyW2gR!`ugtQY`1l)B}>>z{`c0Hk9bq~QceHV~E~ zkRgbuc!t*wrih6jQUTe_=uy((R!WKsvR&yky1%`O7xET7brZNg-|K_K+~3u%v6~LI z0><5av|bGj>{#5e*VVPkP`m&iA#ugc$?-ncmP9BYqHxsEGFZAJcbYd2WZkG(P-DEM z{n>W$2HA|Q)3Y1oruTv2sSI?mqueqn;(ARjBPr_%&vX*mY zb-yI*!dpg7ASQBW+iU9yR;^pL#TM~&Pyg8a+o&;dnZQ5UA3gmwJ#nVhSfs5DtNNKd z_pcRF%ixO)+o0+WItoRkbJ8VEtyMEJ4Dzgj5+d2`*y1YvSRI@38NU{h9uJWFazl-k1c?prcr9} z8jxis5wyZ3GthO5auZoSH4KebR42Md=#mThcYc738mNaR$uQ7Kcta;AxpO1&K|@&Z z0}W&Wvsj?p%?j^mcC5W^%vlevT86MFTo74Nl{{rB={S@#V+9pEHHEd6VZ!&25!g)H zjK)BGH=st4atkDY?v6YIbFZvw?!E`fUcRs**jv+--4OuPuxihDy6+Ase-|(0 zsIh%GEhZOFf;Sz)sS=y|A^8XluuI>t6U|Ecwl!o3fKLZ@_^kCpWx&)dP;_E$fG8k` zlJJdhY^1^Pob@oOE&IMrSpd_1cg#p-%!9|I6$;cC7y(LSYX_<>kAycXqabLO<$~LFL|%%gq3#%49`K!UrS-0Ev4R6ebJXOK6$R zog)sJKF}IbPLFBLdeER$6UHueh4du^Ay}-W&)slG(ZEtAPxQIS?S?TT^k24C00G&u zN&_}D1Rh^E2kCLaJ4eNj_SdIzAg?7Hy@qr=JgbhC>Z^#2ebfghV-?|x>Z?(FiXR1` zC6Zg2^cQ5T!%MqKjm4Q1lX*D#N8bTK)(-$G=oGN5_Ly9R>Dk&7gST?_eE#hG{P2Ky zb98k@0}+=6uNU&m%E`6fUZEP4MN@Eby%ZPkprxG*|1y&E#VxdWG)nQymY@dXTH=@r z!y{366jA|6)o6FJj6aBThyg3??n#RhLh)%usl;(DAqmNzH+<1!Fz~@NeR%uyp%hO3 zU5%?CW;HXVbC~b>gagDQzNNqYs>coDeND`Ty;1a%%k@+XBehF~WY^P#y^w?i)G!ec zyKY`nYl5J)>>Xx8K{2%NHT+dumQ>Vz*V@MX=>6rE(HB>z$9}MrV^6PQx960)@JN5s zj{tTPCdk9J%1Gbef-Ki*BK?Jrz6?E35R$^ZeS55W;NTc`g{Mq5)Z| ztSjj#h||1a;hU=+CenIzKj%YLB=>_x&tzdEDlPj?WC-)!yF`2;KkX1Q(VJoYmGRbZ zha+7t%8x^_K{Ll5|9i3+AVb$jF|fyBFgZg&Q0P;*l(gn!ew9+#m)Tp+bK&vCfCX|?G_|Jx5LeP@#A>Ccj&!^3fWs+@a^$$r-jZq4j znoiEojpjE()bhG_0%}_Zfa<chjE{Rb8(sM@blA^N4A8M&^YRh`l@JO+L9px@2ceNCBg|#U zbRh=bdja)!1+F+vQS78XRQTrTP8ARdIUqWN%>wgs$)UpTPlUW1rYI)99+EyLp3q z%fuuuB^3xQu_Rvvy3OnG)y$E!v=2~f+*jxmRU{Y3J+>eN^>17O9$QqKny?fP{eP>X zwgjF1T|k{E;;Z^^-0%PzF;@vt8HV&G)izI}vJnCPT*W#ZtwP-~qz`Nfc9VWFRn=%< zv&6)F%quJu)zIJ$c$ur9p8hjiI4VjB0635N0w5sCo!IaLny%xxU^N45kh{kl7$CLX zdUk~p^r1lZDTmhkkKTjNBiI)Cv`?q1shXW{4o|9YZ1(mLW>--leBPA9>4S&?gcTYvLR!;b#wdqiwNMzK!vgn2LP67>8_qY@(l0p zrmbEjpn$c$wU~UHmZmSNJ?kpcKQN%el=CAht`?Z?K#1+ltCYvRvqSjQl8*)^BlDX9 z2Iyb6Y<^glJ`1uCNit8I$4Vd|=ehuL>ut^+`;e)7LU)C=?AN9P@e}v0Wa0X;(ojrL z9PmlNM~0@Rf}DQg?(L~TDyuV#ibyUj9#6AOSDIe}?VCWKWZ%X_b^S^{`uVjhJpgX zN@%F4?`>>Kp-`5eO!F9^LO&T98GsF;VgOa6G61*rC*e~V?9aLq15V`t*rq5qS-7v~ zlQOsLqh%g7BcME2PX*Peqnt(v2TG$?mSWw3m=u4?PpJY(6cV5$(fwHAn?bbOIXutv zJ?6z3fy?`%nqp**82BQ9BP5bQtqslhFrGs=0mD3=n(_Ddr)8!)x;oq2e=M<;YfGnB z7GOQLxAM6E>VhKbr%Mmi)B|OEN*b2;05AEgY#e8~yqi!_s#OHCv=lctXDC!-(BrWc zJ#%aI{*!PqT`pDA&%`vq>oN#hIy%4C&w_%3MFF|@uZ@z&{Z%@u_3h{G4{bUaE#KG zpZg0F1oZLQ%cdUn8B$FH^y-%Rk8w69O45W=%l!QO()F9ZdCs5LXF#2vEZ{s@h^?W7 z-QO)d=&A%cEehiTr<@3E0gXXN<0$rt_xc)Uc7iqlr0$X zpljw=+k%!kXZK)j?+MX?OsJVgTh5^hBtD+00;~|KNkM}c8ONjuWtU@|2 z?%r|+NhLn0cr0pxQxlvcE-**%)bez5C=t2j5%sKgD|yjDC#9cie8B@6?S8)Z-TR!# zGIQ^(5erbtV6e3l+yc(k>2GO?wEvt7(g0UwN)-$WRAlakaAt|wN~25{sl{a{Xrvpv zil-N;;edAEVgb=rqwEbX5tm>DK<9#cm2ODrs#6Y{jK&~ABe{z9`3ZY_dmwZ3HnIp} zrH0hDKLtSs6po_*NVqPKrU5VxB2dpe0a^}uaaD30SY3~CRi z1CkIX9$r9c>07x(oB-Gd0f{g|e-YnjwK@?++V*A6B?Q31F=3GwCyVJ*{%0>qLzkDa z!ZR{-Y3TvIhA*Vd-jvnpV4i{kcKUXVu7UEzyCW7ugSujK!csua@wa{*;J>2@>D3G> zW(&o4{*gAV`os0HD1C>Hqse&i12KWcKo$b{Tgc{S?c{Hs83y1zw{qp`-@ipG-0Ij- zb7S*k?-Q$fo^$xNdX zJdR$7`PEH;x3}zqWb4|QPoC=1T`$9kGE2n^p@NUMQ}h?uqXSKUMV5FuYJ>zi>NNGN z-0wfiiRtM2B9oJSR#%OsWMm|OmI^@00BS72HWmY_O>YEKNs#DC%gSuu5*i7-fju7R zJ3K`8^Y^!BvsiBb07&jnfJ#!=WSJ4GN&l-*QUO8=$#5~C#{!Lv)aO%Mz-w;qSMLMR zI)DZtRuGK5ns-*adOaP`6mt~Qz`%DrLcYVrmdP61s4M^lPKU6_AaelKPbZ&WsF?{D z$Bf@URpDDyl$ob615ao%k{ZzZ9f)C&X-HUT8Fx#|{v zb$yM(S(_9%X7b70in-k0uFTjRof8Pz>r7LCVi5*7M+>T5lNTFxhjy&y_$D>tTNTg#Ilh`!M~$Y02>au;RH-QCB$zsoWq z^170Nmw!`!sD|zScQ1h4ajKI^it3zO>mRV?@dAaTm8E+S;C6tdC=vP!44j02%~AsQ z7<%;d1WDaCU+>OpTHIJ;K3*mX_x+%SDkXkH1;B@?1P@PcX^Cz$(7q}P^i|%AkXLzD zO!@dG9aWhyx5?-IqoBmnA^t5o_G5_t0b;?E(kZz=rdOFb2MGtI}fuC7?d zw8$JH1u-r}pCAb>!$9l2+t#W4RQanX-AG}dGl*?hB{yE7(B*?|kSc>$BB0Sk zU80F-+O0`5vTMNJy?o-$&xw1ZOmvK#pU;2@FE5i?#vb0)MbjNkLHaa|X5f^1luqGI zbM)(5AnLk)7@-CbJ?gKq;PG)aNL5vsbY5QZ%LPnq*cycr&hM9 zLUUs}nhUNA4%^a{#Ja1Azi>Ym$WQ<9_JqX%*u|vU-(xz;2{bj60L;dyNle7apZiH5 z+CRoqHR;;3p5fGI6R6++St{oPI-vOQiDpnsOPlABf9)pgM2xjH`$bIVT0eUQo(#}2 z?g&;*0%~Zzz4X$Lchqq6fXDBYMyTgKR$eH4uY^F-8yZNwd7b3`0V^Mo4*J?D#?>Z! zwr4%pKfY1c=>YFJ1n(#J3MvFR^5m9|UL|sKXK?$*?ESnk(EkXO6Dx9Ycz9-ZS2g2= zLoR@>*C}e?@WVj1NmcbDTX^BkZzuM@zDg9&P2^M%=z{bWwzvTrDuAPeA0sQNW;Ou4 zj9^G)hYKV?pF$uT&@=q1G4=pdK%fkzUllZ=kkZ-{MRU{}gnca4_5E(4piqQ%u1aW(0b>w$+xh$|46Z$3EXrr7Z%NgGpl}&6*E&&!)-HP z#IVHQE@rS6)S=^8=&v5`FSkbrX!#6#LeFh zgF|NDCgPfWb$C{G%hoz;5D*zfd>+XycZ$Iv;WtF3J988(D@KkvhrNNQMbf{{`-w7c zD3mu!I%6*A04bZZ#PQ~M;bzPgOkF8=>!DH+7HnEkAjMT{8rojFR-Aq3x@Y#@4w_SZ z-pS0Bm^~e6ZrP;^HtB(+N8U8rd3eT`aQT*^HR>oi?xT3O(t)Ynatlf}psMs2UY{QZ zsXVMBz0u#Uab*ncr>dVYmJMX}GG>9^4NM~prKFonV;~H%+iIpe%D=Z}Nv(-voYGg_ z&`z1`|gqqB- z=_N(hlU-V-HifP4^+g=0PaqIt`*%8}5-hYb$9X^FotE(8d$%Xtl@jty#Ql3+?D57} zqs4tik5dW|%*xnQtVKzz_0?y>XW$2#g`C5o4dB|Zas&xyAdB7WM(o~q8TE^y!q|-} zC?(amH<8DDakm1+JBwE*yeev5kq=Bw z)-p7?3H%=fFFMd`RmGk)tus%iUtlR!@ zpfxij3Y78_{vXcX0xYVoZ5tjMq(xMaxM^wWh7mAm1O#bOfk9HbLlIO;N$COUR2V>7 zL8+l@WGIpDk|Bop*5LiTPkhh&AK&rs;}~W3?7i38Yp-?1d7am_3zD!|YW~`km&MUd zMq;anv<^b21u6$ji*3+2-+b5KH6J{lZa%X`>ZVF+OQZg^^So(#NCp1>Cqoa?v}fY! zU^K@on@sAn&uf3M*~)@~VL)zYmfrq60R(gCv zVW8=FKhQ%BzC9OV-}kh(!kmE>^yOeseWQUt&1lRvuJUZNvsyTaDw#DpifmSo~UzUu?&EL^Mw((^A#77Y|*G;bUlxbYqj}ozv9SOAt3;5$B`4jv95~Vm& zh}J)o{t=`u{G@sqZ%XMa(wtj(2HrGvbMkW<;oU~@y4Z|2@W_C8d#^?-EGI|E}@<5y|R;Y+kj7w<1`q=j zfh=ts0R5cFHimaDf-SXcKoh9s#R5p*!wff$(!i^HBfFO~3XrAr_)ZitJpXl~kqa_9I5 z`TF}z{jWEDB>KpfUlZkY^i4-sRGeJrAE%DUO}oP&kSO}ThoZLDN3q$W$(fGgzZ;8h z#+ob0g6fIi%$o4b>hK~3?05cUB-3bMr|L<%s~PDO^Orc5Z=MpwwhvI z?m$Qp8_{Or6O!IR)QqMMVC+F)H)3UlFod^*)Qki=VxjuWIA>Z2s-%;>^r2Tr^x( z)+7P2`aJjmd5m2@(R)F`C@0L20EN|%DO=YOel-~s}ROrsyk40#!#9!|TQ>Jl3os@m+21uk` znQm_G<5#A^1*Jg=9HMtN{6=|JXv8wp$Vj-$)=xHo@eo;A&4^m7QQmb5d#6!JrxgsJ zrRH`HyLag;Hxub}pfZtSi>tSXNHUj_(a6I+508eM{Rt}^QZ)4w+tOhcG>z1NyAh05 zoDmuhbMHVRYvOF{y^>l05iI*wgq3*PBM|h7Pux%e5h4fR0s<_;dm-7DvrC^YWVC8( zdDCNT^PyO`2f+6nS5?LC*iUi;m+1nJPR2KW9_^nx?a?zaccOo~Xi);h21mgeq_pX- zj6eaXJIww|y-^4o7F5sB5;yi9y7z$MZCay+II`HKf^_N|eN@!XzGW_{%8w_6;yd$Q zI={K98Z2&PMbB|wrQ-hiQHj+(2v={Y>wGf3e{U<|wjiL5^HXslzF@$}$|@>i1cbvZ zluj(K#xE}PhILZr3R?ok>MYwyyi&Lyus{kfipX{3 zHVEl(6OYRhX7BeuiwN>6<^jX>CAr#JsTjeeK5+3=DT987Y541?)p)gkeTNvJ@I8CB z{ou0;EdXn0w`P()I!zKY$$OI$5xwl_?7Rg?AS?mD@7?qHHN)`j7xJEL{_p*Ql+A~Y zh0)lik<^v6BQ|xUB(2^KFOG>EnoHIysCCuGN%>Z?COJLxP4yLW@r+2o+s#P~ z0eH>wds_x96SBnidkS9S?bAriv2FSX+mrypH2+%j`Mb`K{YKGb5@aH6;~B-p@l5g3 ztW$p|I{Tr7j5AUo-z6p~&-jILr40vPS8%~~0$}0O&|5?A-N3<*~Sz9~oft?GD zs@Hlh3Qtydh=+@+9}M=MF!p3sGszU@dZrIg_a^33U4)&lQh3w497hvy0XYj^^pJ`- z$(z=DGJ_l`kfQPfvFtNE$`UeW7Pda_1urPLid!YX-IsI}RihaCsY#epIo+;qy$l~p z)ittxZh;{YcSL{t)|koucfwv)HW^sZR%@r+k-W~zcV9nvE2GQ~d_-}Ea|GirwyuM- zt68}MC80M494ly_RLmEhINaHL=8-P>$0^Zl;Ouv>%#O7hbj_N0ny3~Yt`QzdcdG5~ zE)LMHuc>xo7v8s9BT^M{PjH$LyDo7o^nG?V)6J)?Kmh*gTts$ZMCw%#Tl42c(3r-N|BBqK&~o0zJfHl)=tB zRx{clUFv~Bh8u61Yqx8!&9b{TebKyUxw)Zd3s7~-;hPLF-kD0#L@KOd}IUVwZgcD@lWT+hYmqszz_(#^_P^yUk2BZf;ICA4p>1pkL z_=0g~a*c!Kny$#4mfGBw*4#we$q+z-Zh82=jSK+*bAY}8Rwf9x+&47Dv1S45#4t}l z#`qhn`?P@Xa&;!t7ue-noXc7bUypNb_Tu^O^axMw5L_LP@>ziC5d^*|`gt`M;}wa) z@2Txj-0ToLE6UH;mkyZB+7S9I)IWS%K^m>?c!6%F{Gjf|I`zIRN56pg%u9j4DXKW4 z8Ea-RD3q23RvDmB{xM%D{Pt6D*?J(_)z*W_>Dui%o}LOJPdGZ}+Jobh zNugS`!0t-oJ@)6}p#?Z5m_X96y$Dm*$`yM_#Seugt-L=2zp^!_~K`^^`W1L|BaRL$EHm zG!k8S(+&@begHz1EdZ<^0zM^XjraS;WVb`w%*-#5e*cKyp{nTW*Uzx2fDNA|FE`cE zT`kkyO^N^k;1_f-K|w*7vvWH@>UR$hm+k&G0=6@tblvVBF6EVaCTk-sCJNu0+&&P) zrMKO_Efa4`PftR_Sk&I}?t{O@BD6h;H*G4nemHLHa)!>#rGRpoW2g92ftH{ws%k0# z!~k|@L>fRgz|@S4904>uJn&@Rft?^?*XmIH7sx2}!^CIjJfVIQp+R%)8jlEhe)&hO zyYR0u*Q3$j0K5CMzsmK#=m08lGlJ)UV*7h}$ZW;N&rc4GMsKxq+&TU!zbCMC%1!!w zDH#_vpkx&9Xl0%2f_7$GSFlaF-^S&54{it1daJ`Jr110cNsfp+J?gR9(H z7hYJD-vPP6AYj-EBCP@7uI@x!QQhMeYdXI%s*RqOLQ%(8XN}yaP6o+}w+@7dzb58^ zP%F*=z;U0oQZ=s&OuWv{ezb*ZYx*Q=XlGi|%)xhKQtbNvN->=uUugBN#GLo87~Gg? zujXg{DJKgReRAU>oKE!ZTZqaohYEgz`N?~ao;N$m%R;nwmTfsE$eaO$Rufrz0vG9nQ->)fNohou~blof+>U%q+EoaWH9f>^CmJ)9I zEBpQcM#K=o76hu#V7ZbtyONsyU;7^-lRA=`ep?@Q+s2Bl_!wd(MXX1Vu16<+^N2Nz zLsif6G~a29!-D|7`S_;Bop*AUW!O^=e{+0D3LPFJgyWyrEr8MWyr?4#9vvPU;&8N0 z`)Z~K>DnfuEqzlR^C_G1=B-p1%P*2lN5J%1xPAYY&XfoT!KAd%df?{)VBAS)sNrE{tBKCY8q zgwW%y|E2f!7_|Lr69?p1_P)H~#(w?iS1`Z$ zTEluTk#bN$;oh-Nl^NrMM88y%f<3HN$-(oh&oTZbBiL{S6z%=hsuSFSf)&<#xn1^V zmHZ>|js<0?`ZkoVV~alOCMra|oIc7g%C4Y}5MrREqZ5M&*ekXy#YX>?qhW-+yiV!H zWvNWs|1(DT)oGrWvu50T@;mP5;zMD?&txp@PEgdwHJdwmYruPXXoK5T8tC|$JFTQRGIzYIj+LuXQI`zG> zBKLCf=t*6ZL}r*BU54-d!{HBoRoTaTBW0WKql`8w^^+jMMJvn8@2X=0e}C|prVYI@ z8SwbS4tc+spoBrymh=aM5XMmIiSiVIe;0_N0 z1`4c#7nY+gv$@;<6jm>NBm63mV%=COhqqhi-hdCi_>*Y2GCj~tqocL&KC$(yPlbYG zcyE~Nw7{b;p4Xc`+p?qV0gd@KidAKf9%b~ucT`@tzG@I-wOaRSwO(ZPBIJf4A&k-n zclP!9+`-a-3;Fv&_zEg*@n>qo!n+JD%S~$g6i9<+Qu-!$k9XDRi!e6KsZ}fX%3ktJrP*(Wvtt2{o^^AtKm~U!M^J=b# zLj+GJ@J!zOikE)yYkc;PPADiS3}Uupf*LmDo^Lh8y<9zAtT|pBDVDn4+VVVc4Cz5l zdqd$WboUm_x5nWo8$M-(@T;%Gomc{As>nsvAG_*7WtMelxhHM4&petf>G}i>9KpCq zINm?eq1HF$qf+n;BPnjKDFBJdR%Kpoo0rfSmEg-78FhLKg5>%!Z9!gLtU?dZ#z$Zw zeyuFbkaEk%D6D=Nl{Txo%9< z;=Tl5ZVBMf4Y=3GkB=bMSK~VGL)${Yrk|zxR86cObmJOc5Ft!3n4ArF_%I6|W4}CU zzX{}uGVXhU0=_uhhX!5+5emh9*YzWWL3jUx+T)p#;%)+tA?*)dxEVZ(@1EelmA}|2 zSFg9z+Z*4|D8}WiloVUz*)8-#(R6A;QUmu1#I6bWtYqeooQUDB2K~SWB}gH`Ga>K4 zzXQ%>Ct;zL`KUejrIj6vy@gTYtT?;*E?_@m4f$qmoo>vpykWb$yDsQ_5Mbi}=m{F) zXv=5d&F#0DD3!r|J}|)rxNhCshdBQF_S*IIa1jaIvZtprJeu$S0>v+yG}EL%ZP3%U z&2`4jgG$jZ_xTRj(+hQHlGlv6NdAoDUloZ|{oIz3F(8(Z}4H8Y7|4KcA-r9qjfgS^E0O5!KsTSDFVj3+-Bv z8^AZd0Xq2ccqggZee`f%ILP?k1BN}feGJAIqkq!S*w|PB3T)iXG&)(!d;GvrKVLfm zSKwR53H;K#J@NV3hsvq8sB7scY8LtH;MbAFnrE}O$Exg&a%2G?Fln)|4ZBNRRs30B z>4mw`2F9>QGH0|fx^VKx-m2ngRf)65^f6ip(&#QL2ztY~A7t-=lH6~u2^=3;nbw4q zay$*L_TK&_n$X}pNr0$a)UaKADLQt7o~yJDT=bXmE3wX0G%5p?MzU*Nk3NsiEQ{{1 z_{7SK%pLJ?TW3@{8zDz_V_koJUQb#LDC^yQ0-o)kcLX$~!}*wVgo?VHrz&OW@DkwUqWqI3A52%W4rDt5n7~GfYEz@&ccgj$SdY zN&}n$-zLPk<Jz%I&ouC*<`_@vf%3YWZvX@d9w58)Wgaw zjQbhw@3_q4Z&I(y5R^sZdl*dEg~sB&K*-O_63|o`w>;pn-#Oi8J-Y|iKBG7^Rp3g> z^NP+Z>Wjyf{KD98Io)pIHay&141Cf>2BBY;!4CaVg#ahrFGhCoTnDeCiMLjd5~j*; zjc`FDRJ<3alAeaacryJf%$|LxcRk*2*YNYJX9_yrcKuFo)X~Y4X?D-&skfopD;ui* z=dEHsC%yf6ChYIt%D63bJZon*8n7+BAG~lnxiNBSAt>q1$aO^2eUEA(Nfdg z#zxs0Xd}M3#DUvclgH}lmy>7ZtX0v&4_zBpoEy;gf+M0(aysJT#ZczzqQ+~h_ol(b zLkEjH?J16~x}+(Yeqe64F<9O%{5_3+N@QY%1S|dqOExiVC{HUc)u~SHvap4~SE<=dzp+Iyg!+Fj#<-B`oC}5!tC$MsVJ^pb1^5iVa%J^zh$z1 zU+=ZLQjOeSl|dHZ&<0>>YWE55_dV@P10|l!hTYM-K5dD_`0BA5M?a2`9TiZfyScy}|6)EIX7i%d+D@a;MG> z$Q6{BnW0ySmQ+BX!q*Ax(@lNdaozDFTuD6JpozUji@wQIKR>_u`6NrvuqPwMO<-{^ z$waT*5UE#mZ|_j-E4uGB`%J+VWfc?@)T3njLv%QZ#2uM!R$lb%_;_l_edCUd;=LH_ ze!rB{ldI*kbPLlaRi~|KmU(p}d(fdhd1`&0o9!L~ShBySdSw=wWM)F?x-68yzjJAB zy=3Ov@eoI#qXvOP0f6wgpjx82O;5@^Aq;qr?*N?8rN)zfsi-86vj2_Bl|?Qc0m}sj zMdOtyk0UdbZhLKheOEFM;H0{hnv#BPP+kywTEF2&)`Z$E{*z%y$&f85jlOZcw={3~ne zJE?MGVwHFgx_#~GmA!>}bfzh)wQVD7{?zO#9LKu1P4+bdsWMAxa-dj?`$B|XQf>Iq z=jmdg1_F0er=_JRJrC$}^JDxnhrfI?5Z*wo|NJ(k(=4m!967w+UW|L~ zF9k05((gxQ+8xB&W&EWdoLA3FIV3qO`zh$`*Olf6hDIBy+SvEMfskK#??$~?azCJ^ z#*g5l{!a(l+aqQ5PlFWAnMYSE4->NFyufqCXfmyC@7DJcrDLt4b+}fK8uK@%W47fL z>sV0iN3|R$Wio-8J)7tSC-QqM-!@H3g^Hgj;eA8ZE@tq9dL@bWWwmW|+37AVWUf6D zsE%LXBjzXE`Y7)k#zWSBMF=N;kGO)g%TMQCUw=81<{9jXw#)Ct9Rz-(x^EZ|?vf$6 zJ95~kEJ$8_$vuHcr3_jqzvNo}f%w@=(Y^7{3!-9_3GyPmyJmQ!uRDFdKU726YfMsC z@g%Rh*@eCI#S{x%rQlOJluxlEb!BjRS{SF>(|i_^wPWD$*%H_3zZA}nchT$ayC%!{ zi0d8(o&6~FmA-QGWnagaGMJkljx`L}7&#cZ-^M|@TOG<{F$EiQ@-_nQrb}77)|Z9( zHbgmN&`PtvSykjLh21T(`rw!B8(C!THFD}-CtI>-ORgVQZ+;*c;oDf$wmoE?f82Yb ze%3>7;w7+YjGWb1JHZA>?xj4IWw{p}gU)Mly5b3*Zj#*fN)_=*d#kQD7vbi9>s1vl zGs?*~tdz$BK=OA&nzF zJw1VX#yuPclE{eB~f$&b|67>wS-Ss<7L z`kr=&NGA3vgGdideXuN5$mtC(BV4O&*ye zEH;-7P_y^EX7>&!JRTtXE>~0R?|pGL)=e$JY}+S5N>fls^_AvWh*o2@s*K`>UL_DR1k6~Ag_Uo#%MhlsJ3ss~?>JWa{>-KL_sy)3w4djbZeWBrg zk2z{Zq`-4Bs(tTnX{$+~WV7hRW}%$d@$+{DsNzq(Y*%bZ^Zm}+IiS~&e$lpAG%#Ja zr>m|zc5F_IOiBo>Y?D28wu-TTe?mwTv_VrEyH(N{;GiNs$!J4rDHDdQlkA9->HuBF#}mE2W0J`no_T3>HhtL$zt z=faMe@yXoLR@fW1PQjQqF);#QH|iJsYBsW|s^YXsM}NOA(01m4Q_1%n z9d`5=nV0TrnbLmF(uS{lb9tc@+8b44r_JTJ<2E!m0~#&zoxG3TOBgiF0z+ z>Sk&Ly7r0~+jUU4CuUx6Ot6+i90fLIGTQHyUZFivVV&4x9VYg0D@ayMl07S&-X5qb zgzuLD)gVs%w~z(X7H4d`4rxhs0^55Ix0G z_FL)1qv1vy5sV*hti}%MxXz`Qr>v$%>I!+6~ zjNwcdoaWouaI&511jwfhcCAt+Nq-ko%00uNYY7$?>rsDr5goj$=8DkmJ<>jhLW3eU zoWxoohLL1sFkH>(EY^6UBeZ;MzS$Qu`lwHY-uhbAq6G)=s*G}2-bUrb$~t0>!j$mE zfu9?}2rg8E1n}b=P@0~;P3HdF-*LX-UF%^)OduvpT^=o0iu+- zB1mIEU+l^B!t+KQZtKmwoVBs|c!k=Wh74@vS|`{1JZrlCejl|s$9{iqL2FO2%^d&` zz}yoEVI#Vm`7Zc91wz!c&|`iEoU?sH66Y`%%rVvedc#lJ&q(&K9zJM#!ljjx5Ed2s zuRs7;6d>JMHF)&yXBvE*!@dr%+nx`xZaMk+;gHgIE^LHgZ!nqz=f*4i2WrqyP)hV~ z2LL}Glui=Dbq4;@Wt!B$a(MR*Krhd?t^ap$-Kw=X1kjO^Ir=A&W}?5@(8 zn;PduFtnWDKPYD$w^r=blm(i4ZU-q`j#Y#|8wgCfwujs%fWT8o`)L^P7+1h!P}`Z@ z3^XchKJ_)Oabk8X`2Org_$T;@xYSD0EC~b(AZs>JeDUE3=8T?9CCiJiLqYw*D4Np$ z<**lw8DpdaCfB6Auacv6+&%=#fC@kc`fK=z7fK2`Q)3CSUY>b#>*>5c*xLAps>hyR zF=IOm)yC(aaa-F?{WJN}4eaWMm< zKfr_NYJn;dZ;XO5y=CzoA$L@%O6X*^K6ac2zB{3Qy%wbVWcq|1Tfy#!RmDv4JIjkz z{<${f8_~b_aOl2~Ieq27!zmGugA=v$$@(F~g#U5ytt;l2$|39j1Wxb?5ZVlH*_Kxe z&K93?-<(N~f>3_(o+YM!d=qQuG%Vas4GDglBI#(-jgMH=!#V42NlZV`H-j&Kfb=kD z5CJVl2haW9waDe1D^b448CP;fMgp%pcHVk}B1|&lHr@}2Zu2-%x8YoDO3W>7S?sdr zEEI|`@tjn$Jx1%GcdFCd992sBZ$K*gvivP}d^84Ms~-A{w%`z*trQSFXuwARM2d<& zqcelPB8VK%#0+@0;^Y?w+JvD2oOJk+0yLhfM;?ilR|B| z51Jo1rfZp597(l&P1IpX`4}GoM**E_J;=~GFB)rLxwt?AsAl*G)k7_}AL}ciC)ZXL z+m_u%0WRjYTRM%nztqU^;v|wEH{BbwW#;4G6aAY5djU7>E+h|`14QRa7R^Toq&Oc5 zuQJgvER|qIifXP?Qx#|gCkjwB@={iAPaS)Q%}XoXGn+AemYkq{S2S*jdR#4W6iG4_ zNpMy89RWgBPqfUUXdXpi{Ubjhid25F-Iem5Z)|PiyeI?8_M=ja7c2QZU*-s+xvj!f z9|7qZ_XO*KKa{sT=(MMx`G!gZGJGzvmuvs<+PZH))A`uT0t0!L9^P2%Xjrhd)@<3+ z(bOY0_ku1af(7pJyYnr@-Tc)mWl2Lb$zdMmI?*=@Lt#hHeVZg|;5-gtB2#!Nhqldo zySZmkLcI~c{6A@%mI-&N``AUuJPVd(un*3&G?Mx)wv-m*OZja5g>5g_W`Mzt%QZhI5KngcuyA9{0_3&sVc+IDo5H*;Ynv6QosqM<`n z!~S6|bzMtK*Pf1Lz$oe9G74InQe_+0mOo7%;}^t;^n_f-`05Tc*zHmEi(@r{FMm2& ziqRL1i!jK0SzVJzJ-fGLunSmW7W9 z^^JRwvdOtwi}%KLH}yJe%Ro-6RPbkVF*WZ)8m-i2-=DspgFOegM5ty2_;tpFQ6KeA zR0y*ZH_?`l$4Uza^Ih@;t0*sxekvKv+07$S*>b*Zwu0LFLNgztnvs=~@ul%_H4dkr z$}=)Dz@pRXqoC-U8!@%+%gfo__ukN141VRkpsM0eAPy-FyCxrbD|fwJjK`3jjUqgX zr;M6O2?8nN^~6Jm{B5gT9E;PC4Kng#mCbR!d$kBWaX6j}P&5SvC-FU8Ni_Hf?_Wn> z&Q;T|D{#m4wNeeqf&8Jlg3}1u zRjhs;d7Kjt$Hh97}A*i3Nk^0;h z4tA2!*G%3Io&+^_oQA7nl&)872EGe0e%Bbl?zfpBm62@x?7svSP^u$kHLNN3JPdTTPhy;l31RnGZ{ORbqdhqQp z`b=L8zl%Tgfi`S(fJa69hxLUfO{D6R0v*{l18q0hD~RB)*6S+)>^Msf5`2&%^7uAT zh*C8@7w9ui_KO+DYJ9@{U4A`V*pWSYa+f$~XwPIZn7QB6RBHEEhn=X|xc06d ztq(n#-!1cSjaB1AzG+v!e|@|$@Pl5=&F!l|lDH{anv@h|j+Dij-Hr{}bmpsnzE1>! ze0dM}t}+&QXy?pydSI>FBY`2!AiA^a+}YF<*edOzBE1gnVSZkv;kOuk_X~}-?NsF( zq#ach4g6NX)mx1^s*u^glHaA#Q7z+#=R9%!j*4aI%vneAn@b5MZk$A}@^Hl=HKr=e z#tSu9L&ruxD!o>Q+va+VFU8yxjdLSXd}&>qCiLZ#O1=%LS4*hDy%!}d+uKSQtFH4H zRY6sZ{~U)1d4EPS&X=&)u-=SQTXdclRiLKTZ7I=4iJuV=WPC&#&-uRk@&yXs6WB_c z9j|{jJ8pt!au9xR7^_OC8_=m)R)R{%-!~HFkZ}~|GkS2@+T4g*VjY{@g&{QO&hzlE z-W$tA&`Vs^d(o2iAaP+gxAai~iejc0NLDKp4=!5vDo(6VUJMM>wZ86i0XO~xxEj0r z2b)H27*6|@^J#P3wZiDGpylzg_`o-bLfxWbY_P>&a^5`A^<*L;p+R3&S#PYtMh-G^ z=@OhvOh!cqzN5?6U1uGVeDPs&SJ~6x#Okz+M++ys7>nI&WsK}lB+iP+xfcTSZz-&H6e_l%p2RB&{L2B7Z7Gi>(9^tZPx* zG^|c2Q>WLBBFZ{xbhlT`)_1x^@+kNc=-9n+d~j-Ru_9A4jDJt8p-tDqxeC}&HX z!544V6?XRS5B3VIF%x;f|I)7K68zRuNZxNwq&+JFzIuP5RB8R0JF~4LGi2_ z|6;)fBY~PSm3wlQn4NC}Y%C(6!@H)m)W#}#dHr0~d=&N>fC}nDD#_+=U?-k3vO$aI ztS+G|^o%>@6u#-j_RzucqKYnQE-kPPHC}#ZKAZM9ufnk^lRzuTY}mE6yZQdHgPqrx zA%U-2T)0R+Qw*eMSTZGx1&qS4nHF;4NTcAe1N&Ey(&yp#V8|6l0m^1gYc3sXakxlr znB-Gd(uYgw^gia3`odbPa&5Mxwp;pl>AK$DteSXB_ak4>TByo~%qhD!fK#wE4?OxwHqayYm3r^u&|SR;kGHP(KHycw`!ep6e{woQ^alPz_uNl z5E>O}WVMLG=dY$or_{6$NqK+-@&0`7D${7G5W?u?ae|K{*yL`+Ji`T}QV(4CTfB0$ ztUek-IUueaY}kntuA+a0t9RX8tOl;9|2z{M4%S*eNV~WQXG;O1^n3@T2#3P5K~+FF z`+NsH;l{tIM?j$Dhsqrc?arl}^ZMA@s!vTN$JS(ObehW9Tye-01knvH+y_{UiSm1W zLn}?qrLX>Wsu8hcmA2sY|9?u-f9)|Vum`KfK=dT8(F=J^hYn5)Up7wUijhAmC^4?j1X?R&TlkzfB%29CkPh&0zL_Fzi}5V0mc?i)&B-J1^!su>ZXG;CxG(x8qUt; zAQIEnb-#Ee@E^Jpkd|IQ4!+Ek(YfkHObjFVbtKkr?A`c5Crn*fJ)a+T?dny&ro7WB zp>%?j3X1Wuko3URHWVqINzhrVsH|)eS>FXbG^kuNzxD2esJuKoe;Yux&*f@iC?{Br z<4Wy6@o5Uq1sVU!V#$6WK{bNw5ID6!af+&)xbh3WR#hG}3|w1foa(Dt1HUzJEr03D zGUkDqww`i|$t-%DVC+8a_@HEEIyn=pzdz36i(j{BzE{}(rC(_6$b*^MD+p0el$>;_$&Y5H#_ zhrS=2x7mxTL)Y@owg>O&MA_k_L7tPGc}&g13K_U*G?*VxzESnd&y0!i$X5~|Lm5~%F zovkeGJIyIA_^Rde;GuC!UsCm(EDNzv#T2+Qo&1mX`<6iC^?dhe!i|)&wKMFpe;`Ab zczR`4nP6^pZ1-F|9JT2WSQJ*@#h~P*AjmzxGm43ri^>;%+g@RNi=uzcDphgy&HX6d2Pwuc0%UZ9ROm*oU!W=~yW zGK&AwrtfC3C^5-y?o2|P>oKPCz%29 zkgDp^Dlc3sB8J%^mw9cbSU2AyTw1@nH#!cV+XJ;SQhTcI`$9VyO?MK$1<~h;$$pab z`0~wJHCK%?+|bNn^?fgIEGE@x`Y{j5TsuX_#%Z>>?p>BZNUUSPL%R!5wrNEB_GAt<9UG8(683BbUud$wn?|8C>?o&|Y)F|9*5=4)33SOAc2k%bb|>Ly$&w2% z)YKEZ^LGAe3(w;l_b+?`X3Z;4xlP}x!-3~rF5%`k=MOgX=PG0Q#(Nu^c%i%F?H}7I zuinWx{CYvEYKl$k2+|_=oASr>o0WH$u09~neWegiJVgz{DN)JSE@>BoA4pJuMdb| zf9$iW+=~6qoZT8rpWf^0>nemTR5NRD75zSB;W3a75%hf4nzavwtT$mRL`6mQSkjnf zeudh;gg8D(6sn(Wme(;VqWNk7tZ}(`y`%&M-7nX)Jt!{|6n?bk#P1>-A`r~Q-548m zck=wkEOR^S64=7gTQ@1kF1{PxYwnbYPruvY4I(ODL+e*olAS&`?$(dt>G5jXV<0_D z-h|ZY7;V_3rEsT@8Y!J#X(-f!T_c42&TOD_ey*)eVGni%FA4F49BONu8Qjj~L`n;VB zsWMQ0d1*Kwp2^ZI@v!zXu@OrD?!L)4kEq>C$z9bWfmGrr&+Z{9>5eZcnWCAw#h(Qm zO1^H`uuBd5D5802U0#gGs1Ux=qiC5;IGjgvA)b=5e2@t?ud_I!loiMG3?D+H1w6k0 z2sHe$o9Y**{K)apR?abEG2C% zu7A79(0wiJIu#XTxNuky0DS~r3UVmROr5wZMSjUZS)Lq&IXkVG5|dgU@Kur>q{|a=wAcMm(@?3@iF11bKf* zIS=9(QEZ-gjK6SFJfYaI^V7_X?&ax*oDH5wZ(BMv_Wd7^KmkJc<$!z$35@=4lT|1S zjo>gCu%S&q?FiLA{(fP(aaP-S$}e1?KA={>+_Qe7+P!eX*YtMcgm3DEKT@#bV1a9= z$9d9hpYBtdJ?RsxhQ|qhnOvcNthHbl5Pvkl7grr3#i4OvgI4(;4P|owt8HlJHR%B$ zm#}{rco$jNgK==p`QiMv+ilm#`e`WtJ|D&f0`UKObZmLRx;@yD2jJ#v9rXg#`FRj` z#qHNRG&rO5LO)s&ytx{MMy~|o{|yt!&ByEGEZGl)u#K&5s_rg}4?KVRN9rh0qL!cCHlMZ*J#Kv{crJ?r5^8xyAzB zobRsDAC?bb)hL$LN9H&kI4b2BaipfsZB$gLXDZTI_R71I)T_5{{O&WQG|aN&|u(M6|w7!M%gV;|GhbZ1~dCs1Ic?(CQlKGRt|B z4?&X#nO0@=1ASwNd8cA^tjNX{5QA_7tQKJXGve?jIBk3j<-Z#O>Ob``fq4}QGZC-t zm@^#%Fg%X8C>^?-4+J%K4+jlJhV7q!w3DuE%ijJNEiNB{}`xX_oWgPW*a(8?$oX$@;G;g?E>4x@C@9+c|KeGii^ zwTSIWO!`jkFEL(XSgQy!!vAbwxT8IWS^b__nfrWq%wSUZIy8-t2-d0D+yCLiah}w< zV~>8(sp|>il!*D?m&7(>yj~@Hetrr-rZ|KB&ZZgX#8fx0;F(j04S4r&H!Hbm3uxQp zb+7ISV`=`quAYC>DaoRE}XEuw4$ zf$(h~_60Rz@X(gp@>-{^zvAB{eQ077fogEZ)0CD9PIwlU%VIo6!dnTkp%ZX#*Djh8<7Z5)RPEW!UPBGBjFx}ILiyGW=}_cQd#bTeiW!bCrdTF_mZG=iVa!Mcd;*(nM zJqYA!L4AFF7#=!wc22=|f^)O(H}y`L#@Sz+GPB%vnJ#7r^RHgsrs$u@GB!0eJ+OcU z;+X)0As>~*yR>84*Av*NL7e{6LAOqRQzw`>^42o_mIC?cPn&6@N>uOK|!Z(Fi|MX8=?2e;6**2{xoqEpeA15cj3|9%UCBG`V`(TKu9f z{fk@m+Hymlr19A-F$Bs{2*MFf)Y@@MDU~Ydg@|_6o-wvf>`%m(`8}$res8=K%b3co z#(oeG@uYn7W5y8lQvWl(YomdrrKG!?i%Y*m4G8e+iu|jhy^>AXDBMe;A16(KbGrK$L7nu3UJEkNy-ybjYh=m~c<~_TDz0WB2JR)09y}E)a z)GY6uv=&Rl;vs_XuJ1_}%R@E1!z_JS+26*N?7D~CWN_aTaFb+M+cDNb>Gv#p;fw#p zzJKGJ-j6K5zo2#n`Ci!@*H^hOlJRJ|_NmO(H&tfN(!d!ocbGHm0;QEZz*XZld&_Gy z9`6#<64_}mOES>FW!4|cv*46$o$kt)A(eakb*@gnW#nZuUytl>SuZ-EyRJ;@GsjNK zF9N`$>i0-_V3j9e@L1S9-K>DmfBkAGqI+$L6UqUNQ_a2#FPt&nuIk5Q4CdBLp=hdG z#Sc!ldj(E}F&UZfH9tM33Hc>&+jiLVJduRR6zAU)45|U>+Xm_aJd&q8n!@@(lY1GR zs??3*p$QKwdChlh_3Ls1T0)nQ1TRWKi1Z@El7JxV)vFgjsZ>QPGPqJ63Y0AJ6;~n} z#F>VjlMB0B0;N|ys9sU*sokN#|7b}4H;j^9U>A%@+Eh|GJvi>^rRh;p45~by$M%sn zHdH{gC|k_3j6pnBX8cNc5Sq>CoArVyNzTw={prk=e<)jVBeO&5Dzg45w>GKy&#O`z zIvZ?<`Ie?TI?dHNJo|5%yiRO<`WU9;_tUnud{9PINlL0e`NQWGZ2iR^1usy2G($?X z%E^&5G>%MIzcg7eweibZOwP|Yodt1|b46R4V}pk#5qi&SAI1{jjnsJ385F3Wc)TdZ zwYziCSnN04|7T_8ys)CU#_7^-JrW%EXgBgJF`=NAnwKTI0A4)xni-b|>*qMyt(dm&pwoa{_TxgC+? zIqOZ5hs{l~@06N;^7>4F6I;1TK?|4A53Y8alx1LMPI%nf>bmyhBa?!sW;BZe_nkMR z<(9(O{mrB+mj3q)%NmOR84*gs(a+X*rYfiSH=Fh*cgje{=gg_AJL{bTY8v)S_SLbW zWJDsQ;WQ<{Oa<@Xx{NO_C%;PwyJHRB+k>OK;}Sw#M~dn)!3!3__E*z_rKit2zW90Y z<_OE02rxD+Z$r}lXeJrH@EE29kmYN9FM$PSE_&UkGw)*TU287qGo}}D@&ghNu1cl% zsq?`mKVn&G`bgjB2;ywHzD2GiwUs1OJHW4rt=@TTiP{Qmvd#y;3969*sgWGIVUX_m@6qRZe$V@T>wVX|{_8sn3|Mo{*?XU}_jO;_ zb>F+lGT=g}VlR$lq!u7O*E6?&Yd2n{&I2i&ad&MvbHk|84+~YM7zeq(peojUwD-6k z95F~*_IhHa&B?ptAFotP5aOX$cOy_k@ocb1b5p2G?+JCsUPGhy>DHV@JF90=!tEhk z`6X#%^4@do(pQ?BulD)2rRjO~N|8dh>69JRZCtGDi)HH@ffQort6kkx#NMo!Z`Jde=x=n5u6KDm~=O*3am z1knP%t{37>_s8d}zV{p$A%9y#Y$jp4R7G^om$*b{P0iFGvJ zo0x!a_(iWG9){Jh(P-WxFcx_$8gg|`GS6~IfTAl7(y9Azym%+;KX~yRY0B)p?0um$ zE9#0(%V({RUu%b>e8T(U&2@Z9hdV`+XPk;@J3FM6kH?zBDw_9G(c4(o^{tO>Eu)pG zYjShOv4W!)@0B~>fD)C`0&&SO+47sZoI{BQcm>)G=DWE8_MJY0y`dmu(_^Sd0q+6^p=_V<2vm^oJV@tM0(rp0pr!OJ88;{k! z*F!Tp*A4u+hCC(O8>!_vYW)xEwkN6|;z#^oIN;n}Y-H{1YgzG72U4wEZ=HK#%GnX4*F-yF``eui`l4Tz3E^YubbcZwPcxt`Oj3tgU-E4d2sZ6xWh@!tkvo1u_3l%=$U?DZ-EGkZZDS}*Amw5%dO zWuq7=H2Fk~*eq{asz*y%iVTI~RJROtViOs6IFAU3PuVj069G728Cs+8X~&S`++PYoyU?08PebXeZQqqP5;>OF!$+lm~0qpjuBYTxwh|^%%@vhuOa$4 zQZ40U%y~bFQwdS=^}BT?e}t~o#) z%QZ12wnki*ujluWzFDWQo+a(s?UB9LFyWp?`)+u> z8h7g;G2o;@)~aZa_%FIhMNWwiaoA^d@PN`{spgB+*)2{ju&fTWBsTbwf%8PT2HKc- z%|wM-rs9q)W=}ysxe6Vd`q$Z&Ut(bsEC-B_yTbV$z|errntW&m11!L&jmIxGZd?Ch zdPaiRos1e>;;+{|d-Ehg;BE043Tw+=4VTfrY(UB}8G%1swgjr$r&AK!B^%vc$2Ci?7@B`(4esEE+<{en4 z{z^m+)ZYwkYy_g=zkYBabPR_PB9|n04W5idow)2qow!p+p$rL#5S;68z3V`^-EiyYpQL8P3%xD%JXanDXr3~kx}!e44AkZl{aY9U3o;q8(cwAFUu z?NOtuPCu`0M%k(q!;NPhOjJ%S%iE8+RRzCC_?@<0DJM~}Ic9&82k5J3eLz9F3bw}s z`+h~g`Jv6k#B0>(U%xt0Z?bM&5lQpMKfIrORNadfR6H7b@PUJ)22*D^92_(*x$^_;NMQ~39Nz@a?v9Rl z{*`}J!er4Z5M^6sK-NG5i+^6<49$oOF4x4}c`_2C(j!a^oj`Q5I^{JQbeKH2jd?A3 z8Sel(&$PHr;s#H9499o@A|D1iITX@;u2+^|L>u35phccU*YWz_u zjnlf;_e4)9k%<2%(&VpffvtroL4gFg9{@mlD~5XI*L79@BHsE%GF(x$u!kbmeFxBN zckF__!8)uE8JE$UBZ4Q4dV7*gzys!6E46yiTRhCSIVf-?1Fkfi+NPR=yED7W9(f;r zf3~nqrDs2=J&uKs5_OY8u7&(6zsxI+cPF{Blv`w|KdvWHk{|{G<7#n-q4qmB6l-x` z!=Iq$kI%qGwN{(7LEN%J?mDJA;ic9gBH5`E$XTS`PIKS!sg*fS+ z{EwO?$8XJYBITf|%=E#ZefCG(U5W=UmHJaCTuh$mLeta@Fcn9X)u@uhp< z?iV8J_V)IVU>g@x|AQ3t6A(UKxe}V|e2QkPKG~gfS$qn3eZb{c7XmaqjTtR;Kn<#p z)JB&0J}=mGC;w_HpTbv&5jVWVkWaRnYFz^_za3`-T=J?~feBr+eql=9&RWfdCJdi= z2onBQJ1eY!+WAx%&O>(zVI8|HKRoqFbUfA9m(7PLYI@-{#@)bt02J&4! za>Rx*oW0%}Yt|oF$_z|}Xoc&l3n}mQwVt>Rd5)ww1-Omg_QR=JldfCC)GT^O9$}D0 zyER#t&}D0Jm6q4>)RZ(fn8JY;p;23Ear*3KyFmuu_RZQSI+hKh+)}=UG^rW~l5cb* zBmErTw|~c6JZNu>Ocepy@XwB-0alviNOkH8VgPPuFsB18k+0Wj^jfWjziKptF9L{u znD5jXerir8@$msH`=!V0o{fptRYH=9@c=v0n`f6jc#=()-9&7#eDitV+_9Nyt^gTv2^zZJ#sbn03Z|K>}a zkH+caQBCV{S6^!^Hat7v$YHZ(zNpM?cx}E6DTj*F>gccUqA|5Y^VY9ZwT}e>k4Uml zhPS!xS#E?*@<$UUm&LKJTC^lFBL{kiy70K^%`ae37gXG$*tst`*1@^onsN*PxGX_( zG1_X0F(KeV<73bQd95$DQclA}tbT<28bZCK6$sI0;r`PYgS*g7qSL* zEd%v$k}AVeDk)tlYkcLF!y*dY`(@iMK?05Mrg`3i5sE38c$}D4t{xsRc6=08TydjD z4N$dF{u1kr?t4z&B8N4m#f#AsV0~p{dd9}^x)T;V>TDsHG`QEwTjQyBp#Q2QiHxy z?2zi(rCV9F>xx*4d1+j1mmw}^)3=^-Vne3Vkzx9gHS!~6<3PA>jy3Q(^scN|>b``4 zT`wrkp_H~A9g=sa`)vr7kV@kr7>SKkftA4pG#h?qDc5lav%B$;bHg(0g|GOq*>}CZ ziUz?de;v0 zfztcXo+e>$mvQrwbEEb7u%`)wcG=2O8nCa3wy3aK(g<4J6BVs zkqeJ5KXvc_!{D)q4)nqIk?J9*J}#(Z&vbt0YS{H|In`a zftI5|hz<11lzPUw(?*2YeoU)R!yfkdM=J-~{A904e04B&mg9FeiFD)T>>Eqrl{Mkd z802%U=P28L1|&%n>#TeepYrRu&^eg$!~3)1q%!d_p=ie8!*EMuCe8K*D!YM`A24>Y zkn#v3vEFK?=}T_T4t|$IQv82@+U1~*^14m{c@dOU-dms%=NWlm9%bx%Hmo9>T zqMo6lA&F}{@*Kc<0YZo4)T1OO{8fet#m?iinDB?%LW{IwidRS5?5aZpN20>%hYt-~ zA@>iKC1*q4Dwyw`*t-Ld^l(5E33RvSU#D_)0&B+z8F$8Y+v6ErY$NV8X4auLKmgrv zT;oQymiV#~r`GU!#=ZIp+W%l|FFjVY#P~9;=7GxiUKPE#dSK43;1)&CUt)IP_uSry zyMZ2?@rmCLFb9>UWsh^aFcl`nep45}L13p_jq&^zezzNT`>=C;?CY;%%nqVzumSuL zzJWO;kC%IwGqiq-R(om(g&*=OF=iqkSNk6s{9N0N)fmJn5w_@$#QMn#0Y{xn(g*+Q z_ymztF0V#_faT2&g=~$9DQW0_L?Q>C)fp*;$vS5P#33fsqkmhJ=-*?(7TA!W}&C znqYb<=REFUw0Pqf7m*g&I0CLujLRz8ahds2oFE1salwgq1?XgVv<|c}@0mvlsIL9Cx93SFlJSl`N(g@S%2nBDsm89< z4Qp%qUuEzJrOUGcL~CXk7Gk=DIhUGG-x{=?vn~TM+O+4wy(4e_Ob3gd>!dU9y#%3z zVtOKP`9rLLd2q6#@OTF~cWxvOCOby}2-2K3E=Aw@B1}iQb3K>LgujXZCmfa0ZUK5W zIng4%z?5L*Ov;waGId5G4(+2h!ZyJHqsAswhWiV`hH+wXqr7Pzzmpq8E~kxrDPa6a z<#rfiyS_v5)s$BSAoy=j>N;R)5P=SMcwj=Tqr78`aMcZBXl50cBGIvwWOf*a77P=z zKGM|ED9+tXZUBk3(;v0TI~^Vt5)&Bn z-?4GAvKEP@phT%Jd|FDT_Y%+3dewI3Ys%s)yjxW3ov!IaDfUFXQUHR>Lpuu#rxjTv0aT2EQ` zl5)6faO08N1lkkRyq!;!&%Kx>kI>{WnV)7OlzG&>x9Fb zu;=ll(4-GFnjTU=?@KOBq=!!kf7qAqXZjw`+DX$HyWG2b6i;35N=-0y?z<~sW0{u1 zR_W25#8hM|t*c+^3%j8o1QzxUxbU2-xwHBx$~*;3EU%XqT4WV{mpsGg;xX*;l>q^_ zM*KI*JBW}y1P0WiX2SH>cy!QJojeKXVeZ`*+K;iw=)RlNyaudJ`IMrpivxwqfjNC= zp#I9zL>Wy(Nw~6O_5({wDEY-osSGPu=YIs`BKEHA5)=juC{y^l?B=$KB;j8(rw%$8s6Z=s|G-8^v4<>n?pvkS$B& zP7pJ%#!wO9VRsIBZj8MPGes+W+N8LRcai-~!t%R{(h~*$g#i~d|G|JZ$qVXJ$%^vq z*A)BXtS74G^Gc*PkVzmvK~!waty{#r^U}I`OpWEVJyvBI06wsDokDIkkyyAbnz^T{9h~Ofx zA4^R)enTjR_JhqZAeh1|nTf>0U{~bT34;GSGSc0k3q(a<1I*Fkg8*6Iy8B*x(Cyi#5%3i9)oAA3M)`xN`m!UE@LSWh$ zp{|;aBk$;NyR*4YaKt%NWtIwRV&QHwI(IX(&ljXHsC~*Q%AHyH$A9qK605b}w8eY% zmHF6*&p*{wRlQm8Iudv(98zBRfS_LVP8YvfnLSDb(B|^dhOXumyQess@sF=Saa_RPS99hQ2GQish1< zM!)kVB_sKP@+`Pcxb-<3ka4uJTIB%`dzzInR)0&K<83keww+g;r_0H2zd^5-jIRu4 zC+*}?IHdcNg1r#aR`Yo!5@-ali~HA`F~9YP7WgvSF4=v^i8wq-NKzKAa5AN4Xg9K| zR=T(_MHmFmPtle9zQO7{Df8$ z(U)Yo|M1BQc?EUPnR*8j3ZJ!r;BRUIZ9Obx4l2rEcx|2F59AM4DK_(1g*vx0PV?yy zW)=5GitF!<)RgsAE}pkD*(I{8^({b-?^%uSVG4CfmKi-N>;oCZRm!XK_Q=Q}Ph zS^mGA4>~g!5NTfH=(#wo-|ZYnAN8J}WmlyXO+M?7Fa(%P)IW+k{(i9$KrG4SOFVLE z<#)x@1N9?(GG0Rh)qdAUK&j`Xv%ZCN?@HRHa=fi^j_vmshEk#?P6o3#xi6aX20ZJ_ zbH`X*wf$)GVk(pBTF>9^h6)WiU!OWcv8om$ow@ff6Tj!C|Gb86*!DSi%M>6K@GCQB z2;OMS`j2xk<5>3v86u$$T%1nep|b{bStfxUUf=0o2rC3alSBxBtdfzo}UrDJh9)E`vY`S&<797Mg5fLiao3)Z2fK zigJA^uP60xzL+Jx{J8ms;#Co%Ge_6@16=dI)O{@^Wy*I|t{$qigJ$i$t*ml>DvtK| zFO$&TjlUFQHBlFiQS=?n)nyGUzA`tGvy$~2y1u{6ovnlxhc@-rGGwh3B%L_M>C2=u zR2E~2U1dp>PbV2ms(zioWHC`-YfZXAdV~5<0_N7YfXZ0h7Rw)GZrIKinlaIoi<;AO z9WQT<*OPrV&FlB;rA1TUrU+j=Us*G$@}Wrcr-#?(chhAle-aqImzN+S61#%au$jye z%~raoPY?8cDVQ0(ebe6Coi(zWCr@BXyHwKY$RVD^jc|@rgjRSC8Axp{cRC&AzEj$p zvX8B1phUF`ta~c`^b8u-R3C)XzqOo6dhy~#mVFWgHhP=gB+-UFfcvgepoF-1sC`9P zW+sOpE*$qtDH8&j@0Y|aSv;NmLc@^Q1%dI%T*r3OhO`b(Jg>7nqZM^XvuoG8*+r^c zbRX`^`yRpVd^RUKjQCO1p>3cVEK55u;i3Codi@O&arIHfFVhsCp1_@NgI4 z8R`jI_Ui%5zI{i)eGeMc1Artul*jX$T+_ml&cEL@5dyQ~udGZGG2={|NqxUV08o-vN`G(9PvC5AQ%+mhJgJEKo_qq8mOA{(jy zuNg~%WSQ+U!U`)aNLNd{SP1$<#)UJ+z9MpNj{d%e=1hx@=8P|HyLZ1Uu_5}PME<$0 zzy8-!A)F}NK{&VYXIx;Nkmb%hep6%DGs&C?a$*Cpz>@Fu=< zcLUFt!n_{QGekS~(DgtGjDJ$qt%i+Ooo%4MFxZUTB}1v`z1(qSJWjP-P^|05DF(e> z`W!@hGlW<_xM8;K+JWx@-_KWyi*wZWP5hG|;$2{F^)2OLSmGsJ7qs{Nmu%NK4oBUl zrMW?SGdyvL7)`anUH-Q2$a0HRN#*j30+7aHf<|qKxtB7~wkXWTrQ@_!gou!p=TPSs zTt4a+^fVK?os>&GeROttpYwFbmj1fmR-4znZNa<7EqO}Hb79+DV6>Gcvp?>^`u4hC37#A(lTK40wab-des9Dm7J8B?4 z!&Il#n|Hz_Y{_kBa$oat#PetqiM5jHe9%0;myd)B@CMM#AC3iWu~rIvqwD#CaVyf1 zvPLWY6r1?86sn!`v}4y9*ZIMvm+xxUTByJ6pMXAc3 zk4#)RITTqMy$M0BFtQ#;P(meOa$@@ZyT%!Lza3ok!nfL69BpFN#E$Ynn zTQuz0vlM%ruA0m?{=jlr8h$usLTJl8HJ}-ER#Vlxw3C-U(YiB()T3(^9qgG9Le{&c zrqCenMz>iQaRo>zwLmoP-WqHUj(c)J6XvctBc_m>vlQ!ksX>D+_y8wSOiHoHEN1Xx zTGkXX1yZyK%U?Gp1~BL3_$bLc-xqK2WJwrg$*mqq@l=Dc!c zL|wolXgAo~btH#1J?$CAM&u}D?(G)`C(=p`L24`N2Oc#fuHOS?E4$QKsx%3u^cE#bB)m!1g+~>t#hcSHQ8+lPV z;5{Ak3Ut3poLjANHQ|~n#XJ#_xz|`~rCqpf$sy-PjZ7dKLzar;o$N{(`b=W{d+LBW&Q*|3bpXS3bD|mYbUrVT0;iv2t+V6nPqJ5iYcjWWx2(z4E4^ZU_$5P^c(1vWUV8odxyd@2APOv@#~4*=z2tu<46qj*1R~NGMUvOiXeiQ*X{c38%K=k$H7O8U`jN2nh-44+VskGY)dN zyVjiEQ2!IIW6@7)m3E*-h<>7_pK<26bZ3nAZzkS9Hal9b(zioVmW6?0^`wcp7T4dpe{{QdrTII^Pt2cE7no zBvKXqnBsyyJRuGe1(sm^0e!z}pG}TjNcTNwdunv9(QWN)<%uPO!XBo4zZEC+(!xK0 zL8wOJ<;8%@FEPjLM#n?!wgeDc3)|BG-^S~T4&qtj!?EE6U>~yIhkI;7zT(!=L5y6O z#o_*AuPLgSDYTOxrO+_gr{U)oV^7`Ejnw+R8+A6A$3G`lEPQkRQFMs=djm z_a)y}CNd|dYw1mozYPC;hT{j%M#P_<`sjW`@%>ML1nUnL-zjR7kRQKw$mWbZ``M?X~i$r3P0%QaudNB>=j0l1+0mY{l#|@|YjsZCSU&&P& zQCqpaj)#ii1^V6Up;kzg)jeRuoV&Vk2NdYp|JvK()qk=uU6EJLvK@bmjAT=e1^%ko z-*;13Vp>ijpZ(4K@3PO-*yP^yqHWS-vKafADVqZ=8Bv3AUbP8fSv+?fz8#LLgQ)%apv_(^M9vG+<%1@2Kj&dC}hnv%X8Va5KEm;c)?`f1(!TiQ_z5g)m0y~zweBu;W6*A;W}c5+VQJ-34bKN)b2X9u z62Vt=Apg>PLQ-7CVLyFddPo+n`;hPr4;n`L8qOW!N8QR=Zr2^q{kfR8*Yo$H^>+`0 zoB&ARJ$65OL4U=s(MJ{$k`tZ`f^~cJUd?hsZD;n}rj9i;f`V^ExnAozyY!O4xNgrf zP_5`{_Hq#UIn9kX4>KtWJ_1HIwX&F8eCp`?At+rUQYOK16n06|*n#fpfwD?~)<@-j z;tZi8qp3SG#88``v}Xk*#Qk1urdtN2e0br~?MeQ_Q)y#I>aj%jas&AfkIy#Xxk-)z zpgjSA_P%g)D#+*kpz^fHatf?mzYf^a%M2uMq`EHLQ##xXRh08)EY3qrQzs7mV>m^Dm1e}g4EINqq(B7Izjx_(`eHjN+WFpo`l zP32X6r>6eIo(_?%YxeNR`MT9rQ)TD}n^CvUR9 zg*RiaNiOsux>y|zGsKIOE~fSBp13!&2j&GYRZwC2W#}~x^e|Z7ub7^rJ&)qYQ>76- zLC_HkITiO^jq2W@kxAx9fkXSIpDki;*ywfZ2`rD=;N(Iu8u&NzPA71z=1lE35za3x z+>n$Ef81tsLsazn`~LoS$;nFoE*EHNX+JM!y-fBmOydI&8y7VnBv5i9fI+YZOaFOe zLbNEq9Mk0OnGuA>?4<0kY1Y$0KAl8g4Bwuk4lxaiw(Y(ly84DxJFB57IEPZ5hl92{ zMyky|)XL*sA}>MH-h~~OIXKH1Xsl~IZ#ALXFNgV(Zrt>Tkd4A}&SVnqhM>I%@W=@X z^+1MInL6Az*w6*U!Cs<9D`iGgUXEXX$3s3hGu3>ve3R7P8O(g~g>piH+B91)G1A<> zy#ObrkD%JrpG_Uwt4sRZu}u0Jbg9>_H_WTF%{$LfkBwz$$QL1h-SnbFIZk7V4_2lg z>sK};1yG5l`+|9~0$L4O1Knd^k^J7cU<#8_gfK431YcS_lVD>AMizG47vCTn_H8F6 z#1K<2EPrZb`IZ7aESC^=l-5W9@mgDJWavu_C=GB%%@W@XhMm(qFhnAFY3RgPuYN0) zplngkWy?pG$ylybQc)K+4fTwq@}>g9 z?~|6MNAsFl`S){v%a+EV_q6#@rWu3M)D6o5&1Bt5geBtj3(SXa*-Z8q5>KOuzFNF@ z2qZ{8mdX5e(|7ZRgMo5nPQ(#f(c$?Gbrlt4tFfSBN=C-*BK>Cj?BKyca;M`}J6Y3H zvIGPD(z>!prOZJ5R(~xKw2Z8B1KTreD)?mpj6Zl1#1!*al{*fIh~Aft7Q;7=_)`m0JZ^;=m*eJF$`f|lO^@z0 zfBHuMc*TTBz&>zjGWl^}<#)9H05$~?_E=&guK)E4a%mwLOqSC4_NAnV5+Mi4*(Cgf z%U!MUtt)QW69X;O;-P!pZS$tv=EhBlAw;7&T|K{gX6lO5q3!(|PGacA3Eyjw$zx4i zg3hzu(F~uwT*5W+48QXb#p*Q!r9*o$fj(BpyE$AVdOAUNab*EVP1$$gEz(0fB+!P6 z?;_b}L9-X z$V~fSH;u*`R`%ktzQo$iI%=@Ik@ve0jFdhu|2Swbb<%HbDzyd2e;==CCKQn)>8}fw zJhJmX6R%Exm5LwbqpiYJ?PP(_Uxghmn6ls&ECa8(ew8zW1iE7VlPV^L?|nMy!F*X+ z_qt*3dsH%o?*j9k2#Yh2RQQTe_%?l|a3gfQ>~-j`s0->;d?;B_@ov4NA6M6!2O9vk z&C-9ZDn%MOo%Ya}PxWlK3U*1xV1k?LbCbx*))D&lRr_{1s#5=QL7&Tt@cdlQ%ylUk zz3Q_j&Z{)n?u^K^Rg)1U&w3sAi_THse!+;~<^AYmSaGkZy2oKA zx4pdFYgBdou%GnGd04!d*wmG^71+JBJh)OC6}@#N4*+M{O-R!-BR`hxbPL1_4IR=4 zlj3c2tabVH05mP;c)F}sOiAZE9%Ovd<~=?*RI8yoXoGV)sjZr@Ev=#$FMc4ab4Lyf z3-{4yug-F2$G8nxmCWvg)<*{8=UPyOQ?z115`MXo#98m%L9^Xk6%`jsl*)3vX14+Z z82_xOKJWkx4A228s&WnI^ie%KGIMp~CXtwE+-8`ahi|#r({7|1NYryVH*RLOxGdnK zTs~nX%u{}}B;fO0#5dXQIXw9Wt2mhUcUL<@bR^9cvU+iTi>An$C*& zSGNbEZ!b8%WI%kcJn-MsYZxr(u-bOsDIKI%1JQyS9x;Lgscl?LxYqtgHh++By?TMI zt#6b3bbe^z6Yg|jL$XRfT*1QYT)g_3=SS2n)TptqhW$jyon7a$+!rq7+9@{*G8KA~Y_^zltm&ggvuky4WZbS_R*Sdtq<) zw_jpw19Ryq0idksPtS*Frsu_-u1%cOXC|FkJ%iChgZ83DLi-C}yN>MoL_2k+U+?%Q zK)87qEXp&Inuv#aRzHka3Z2M$1&50C`F@TnpzxC~CF(D<`|&N(G*Ci9K3cuiBsHqFio}&jZ-7BQ}8DmX063SU$ ziI1%3Z{2kerX&ipR5Z|;UNdHn%(`5}wBpR~-H2-FXQotEu9;e(LE0fpX1yNfuh$7q zC{T3^o5I{a@?s=bO!t%EwWHi-WkK}`Y)FHs=0eyXtO>KRA<+XRHH=z&84@?%X2?5`K=r+BNTJPFuj1Q- zBm=l+!R9aW8fktnPb-b3qoPtnnYKOySr30+P`$hLwj!bo+#a1MisBDeui=*xsRCFX zpOQ8TQquBJCzj6_03kdtZT}#Uqoy*YHQ;)Yn`3v`#IJSMnH|)ar<2@Y26 zDI<+}KUf7a_&Zred!i5S<<*oZ#VsU*srl+B!ryV(?w;hSbE@AV>Hb(^dJDYu_S4NJ z_Q}OkX@i|%k-r$~OMM0;T#W6uo5GJy<3z}PHg}!zkYdDE{Ua_;q)&eAhpds_i#3x z^e=Ohp3`)H@ef38S!B^gXNrSzjBW?!*azEvYiKOrsKrOP%pkrgt#AqS7!U9Jd^#if zXnVd{>R_9CqkSgBlMs2E4JUgo`o0wyfP{o)f{{}qWe&KFmPkMUHV-)+KZk2m;e9ei zGNvj2b>XhTa5pN^uks#e7rfa)$o|G_h(g49wO%K=MKWt5PxHs98gQw>!}lGay^U&&>?6+d~-7VIsVX%_$Tk7`COVp&hN z_P?3Fceq{@@x0li+DW3tm`H5+(B@PeB?W&A22J2}GT8y}W3ok;5b%u}>ZtrJ_(bKd23ST4}P1HPQX&BN#6~M12q)La|;d)g5dvS<^{O_hg z202gk%f4gySK)wLRn@b&j**;0RY!PM?S(t47gkOM#eZ;C{c58z^@;%z8tPNV;)FeP z@@Utk?jPYiYo{A@?Wdpu>3QWsMd(HD!2j_N%F#+n#vf|;_FO!e%WZWP`0u3iuy^z#fnZax4vNNEyM(lTl6_MwX7AxMt zvK^woA6CLnn4!~K(^vzKu2WJDL&>#Z@(LSVH#+w#GZb{2cXT)W1m+SrUjrl)9y^-v z5Dh1|1L6!n@yUWm`OqFsR2Wx}wM(9NyKg&^ z%ME>d<}p}YB;p+G-){s#%EW`FE9o`*9sW;nnj;neppW~MD`{uA1#DHU;r;5ShN}SB zQabat@mqt0GsVv<9!$O3^ln)WDsuF(doORjP#9G#l;=(Yjr1FFKXD#iUw923n3)Q< zz{-1Y!bZ`pS8a1dnqnuPZ<_IwLY3b?#=i%t;=MUGHqZ9z_ii1vto5u&vL|g4Ljgsr zbofdXtew|IZJiUeHuVtk>N}*=0|mW!9-eJatmRN6cQFWpCuh%0{2^yyJuJch1CBh% zyOS>pS^OTYKqBl(nvyU zY-tE93lVYy-MYY4G>k3?Q1__KPyo2A`2(enM} zs)nfB3P;oc-Vp9?uZ_h{9ahxIk%s0*MkwP!-DFjJsD$JBVwip8?_HP;m z8J8v!7^jdz*-!S{Ziw9si#a)=(%Qq`o`28Y+~#zQVPw3df(wkSKOtHit)d2S!D>$f zo+66^18`oOt~f6-C^rKSEVM=OBm5Xc`+0d$l+Agp7PR!g$SwGLz#kGF*pozz^EhNJ zt6p=mBhOY=(9}6_XfVo@iD$QlsNyi@#K-x^;5Uq>=eap6=aU^%ZDCd2Pcf75)jb#3 zNA?1T3>U$L<=$h;tOoo|{5fES3ZLgkhNw^zs6FE1cRt@{f*Ybht_W}1gmAaL^EK%F zO1)}ar#1Jbm7ZbTt_Inf0O14ol%sm(iQ7JP6Yv^WYehFljW7Q}X5X!AiyfmNYw?Zf zm#(Ml1g5CHkjHIbv5(NRqHHqf{7Dzaw?k$I>odM3VdFyYmO;9GG=$Uo^JG_gGEI9j zYYQmqTSZ*zcd^AMp$>&)m7(=9v~|+rjyv$eJ?d?kUJh)W==?to&|UzFZBao1g>8Mo zMQ5#y7VEdYDlQF&oaTa5y_`U+>msMBTtyUKROOc9&qC8W!W0ANhvzBwo&eBlTqPd! zR!8bDD)og#uXSRT7UEp6iZ>m;d2ehg^U%WpJ@(V)*42xODb`ZAi~rzy({k+eSoP z#_zin-N=eKWdOj&;oz4pf;u!B;~hRJxn7aaHY^K82)TjMy6)7-;-ivgAUgc!QD zwFQtZcr`xN7=P_p=F`{LFLmSvXM!J!JxG-b`td{g-^fz1_BitQDQh;$3VfgSG;o*B zw2S_HHp`S+j=g()t+_l0@W>L9lC~sJ53hML)PLm_wuA2c31?J_3bKii#l?bk+so#4 zPT03z;}hJ!9){TpaDXuDPqZGq(M5?$NHq9_tP2J)+Z!7LFirP_m|n&7ZwsBts*D|a z#7F{Y=i;1}(F!p-)mz4*Lm2%{|4ewUIAd6tTXQc5v>$5m{nrQGac{G_0On-N&m)Uk zIt{R)>J8B&k19<*ob;z2OZCuozXma6<$fXZ4YPkD@yJ0j$B)lW+hz=(8FaMVeN#zF ztOdr8x4@mpiOHDADXuIpH{E+!?{yb!LRElQbO2MB&x-JFD%bm6vUBRqn``Hq@GRfV z@u*@$?tulR3XCIL$V?0k<%3|!Y1xE*M%!QJxA zNBQnkA*u{5c`UTJ?NmVpRY} zJ{_wD0!(N2*Gl%jJmpB{|CH&{`y*hXCTuqxHoaAFa-y0g%R9T^>*I&dA;2bji~IND@;`nP>yE& zLBid&7TZ_`*8KdthpuM1O($S3`1t0Y&?unfr-A(=AtMz@h@`i8YGag73O%Bx3NaANa_~>b6-6}qW)BieoO2h#_Kyx{4)aDX* zg9i>RA?hlEznh{4!v^P$OyRMOKfqA3I<|rSOp17@=!k}=;YaS;soi31j>%VJx%&>e z5COF_$+?GJO?(;W=p`oNCk-iIb-U{#vd5{bH(*=3>Xprm;9f?IK`c}Wo}_SBY2Exm zMX$<5@?M6EiJy$~9zA+0{GkM>?7(-V6E*a_j)MZ_^IEbC66FA}N1D%{&%^-fAEs`pitNk2eTLdWzP^4PoR|`zwCCjxN(UD4f)WwSQR+5wteGBdXoFhTb ze)h5nEsvAQkGGr5#ga&A9Vr%tP+hV-l?Y~p5!Nn5_LorUba9Z4{@SwR5~=3ev{ubfo;*BQ$NGg}S$8*4kQqMko zPO8p?_Whg#_c7*I3~9n-I`O$Vw`l_=AVOi1@=oJDcA&19tW z{zo6rH;c8er#?SP*Ykjr6?!>1?aB}2Tf=1dXAigMY)v|sAbk2{V#~^3| z90Cgq`yL7O<-}wcD`IDDwCX!iRJ^rH(N!vejgXos=sguq?sPu9#Bn$F1!T?pEiPhV z?v&NG&fd2_CN%auA}TrxK=+6znwSYZ@WN9nHx1(Wbih<%?`~ka!{AuETGpA&))6u+ zLG74QG}-EWr1;lIU$Hf9w4Vj;ts8Ny-#}Q#I2HgQdj1^PB}%ITAV5a9)Wn#tHsm?K zCH;pj%Hq8DAW&lOQabL}?PUM!aj*UX70~yb+=?lrm8>SM6n(cJua3UF0-^H_9j$e> zhFH(mpr4uoe+s(Bx#>S*?St4t2#oEgM19CbQ%_E{Kz+69>*O_sPm7e5h5r$3Repf; zvK(;uucH)_a6KoCji=EHQI`<(FRg*^X#!TSiZE1pL-5ZXUdf_~AV>9h4N7}`wHS|t zmD3+L?NF;ef^# z;FO1@masdia@d5r?+PhYKVW?5Qn%v%H%QSOA@bnBd%#}2P@m7xtmu)oJ3T*tfng;b z`I%ICI5YQy)Gv#RnK{%de-VQAW)YMq^NouXUZ)lqHc`bDkz6YuzVE^P!fAHt^{P{} zH)~yYiO8fv%fZfc)z#9Xisj9snt_$UKwxo{cnQ9Kl$QScbOKC>VQPx~&=XA4)-_x| zEu!A74Qn;pVplg?hIz@3aCg6I;9(FMK_pS$Rk&zIRMhZw#6q|9TliU|dY}h@Wk9vM zEDLlGVBfkfP=Y5EKhX1`M7SVaPm(wc#?eBfsX zh5a(Jdq3D#H+x7E-A$)k?_Y1X1n^XeYJrdd)sKo*Yzi1cX5TH7i6LWxkAio*wZh2UCb;VS z2&nXqVx{+9Lz(|^d=yp)KDXYDpCW4-a`3i6!+fuo^$Tm=RWu2 z;m7uY9kSM%neUimjCZ_U9f;QjieKv3Tiy?R2Nu#l{F}FHe_;!~j8svRk~YVBSm1IoRtuJcs73-&@TJzA0qlE40Z6*4pU6y6HuAz}5nCS0ld^ z6s!eMuzvYB|76Ds<|;E^`zO^*D4+yaC6#arUj@UWPX|aM-GR6Z|a6`={z5kybM_)=wOa9lQX{@zlCS8 zY!SPUcktdvhbFdS&JRODWLm#riXM>W%_ZD`nmeXg?qBK=GoVDM_nJaLc_a4ZiCa1R z+byw=hVK^2l)z!fp<<}VL;G(i$ApwKpNPL!1uFvf+g>3OEt{!F_1xlB;j)dRBYA!# z1#mpc?uML9+4x~1!mdNJ8gxyDpY0qt%tEaDiCMeFo}{531DVzO(tnj%*`7ZdK~Qq_ z#qA3lCzp~y3Kr(vR2vH`O!<|3&B^SFk@~8S$acL>fnuyGaRiipxd`8te{bJh_ zln4QYkDoXx>r!l%rP9PR01f9sIHY~F$!kC{*uwsT8@D@71HH~~ z+{V%JD|y!ffvx?a%md>Geip93y#S6`4snrY(+eG^JWgiX~^57Q7q1cacda0{D|-Sy)}aLW$wabLg*iN99HKd6>pP9q@KEKwmD zY8zt3WiaS+01@;Ys01!pMF9oz^uho->cs;k2~EI(zj*ijNGteLm9blu0q_UdHY(FJ zV!_p`=Kn@Re^-JTyF&A)!|Nf~2J!Bv-(n6z74OgbOD(?+>{oxX5geAW1d6=~XUokM z*HeGMjJ}6@Tr&EYa0waA-R|Dv*9PUKF!A7Goa^I1UiT6b=#a^s5{&Yb1TfZj&NHnt zqQOgFTBb&l-?E&}FM~8K7(?0jH@E@$F{r6EDJ1;tM`%7nej62WsENln>xJLi^gLd!^X-_0q!htYQAOC;vKl z8}S&fKFj{FVyXJ@q#2a}5G1#R`1`nKs!T~7K>OiHFx=L@dw4(}(O5A}X0iw(-8wpA zL9bepJ2=w;gz}_B7ks}C3k9Ce-y$Ez3do?YhYL_QOt2?%t=oF#pw=f8!*SoCE4nTO zzUOdu%V&*adzB`7CDcc^Ioz9QZX z%hR4)f@`kH9}8O>+i|H`+45nGHb#eXOK@>Jez}S`=u+SgjD`T5amRp)+MYiW! zmcIzs(K}IOKS5`aLeiuZM+PL6lqQA~{uwywV16#?{)2xLdp6?H`LW(TzGG=+Z`4x7 zg_F}#E|O}N|IgCh+C7QAV?$`E%=zoj=s8hBhS4LR+U%C!U-=19_R?M}I-Q^h@Q4QH zL0hJBny?iQ&oSru9Xr6QrR9LnfoE?rOJlsWM2N7D8;PWk=NTX8Wrn?xZ5|PaJ*jiG zSow-W%CW$M4eaEK{Q&`u&&FIRIr4(?gaBGJRonjLo5I}bNHE#%wUz-Ib|nhn?`1&-v5t4s09-B`JQq)bjf`}$?*`2zD(2}>Tk>py5HoFQ@J zYng)FB9LH}mxN5P``;>*0ADh96?fkjoA+eR%Q!I90#DoI0gzpOxX7_m9gB9@7#j&X ztin-e(2RzM|B(O24>#TQgMW|e@}hLzYkD}mA3oL)V7xPWj1;o*v8}$s$G+RWfj({! zPA|(Uhon#Vth=zW#HN-y&j2%?$W(4!~*ku1U%BBmZT8wy7Bg64I1Po+Zl>E?tpi( zZmIWGQ*_8Q z1KPw1JV`R}K6pYSy%NR0hBZBAZtnZpx$8xloaFdPnCuk~9&`P5sK>Corq3xf2q=PGMBQYXdZ=9uk>zuewp0={ zOH2?GKCvchw&nJiH~WWf35;au8z8M|4GSXM^CXqfm(&A*lRW9OK26CJ8m714wEb4O zT8l1_9&fp^e%7pM-%z%Q_Q{@0J#qOyI0CH1bAa8KxMA>n&%4t}gM>q)2LP9TSC|ms zZfhTmzZ~I356M*9Zy?@WSKMkkeuw7r`LqoO0DZ>3gs>i0NuHlGG>}%(zpI*X{cA0? zD#UX}M3`OX{kd=-kF33k<0pv)E|Y4~T%1qc~{HCJSd+gwznF}o`I7f576%GCT* zRQt(Ih&_}ig<#!U#FxWdYlvqOU5zfe;LO=vvjN-szcJ+CwIA>*tfRZA@L(})&6)&` zmRO+t@0fB*xRIj=Z{Z$Z+aqjEm@XX4-b%c*Z_;SXMa`5A2EV6;Xq<=r$*Y@b`QpJh zTfaEJ+FZP=S``YGbVpZLx>i13*Pgc`<<8I7(ba7(&II0{^|@XV$L}Qf?$i7?NCC@l zE0E##Ub?!(6*{T6L3n~HKW2D~!fWz9Ux3HHdj)hgpqmT1P}I(tNAJnZLP?CsAp2W( z9#G-Hb=-4O9^btfK29t=@@jY@JneAOP-J6@@gj85Wf;1JON060iJ!ac9{xABuqTj1 zg8vGU^id#Ke^7}?XDY1K)4dpy(+e;;13W-gai{E2Jt}mhmK{1i`d@K@n~6YRVd|lh z4o*=_hhA=ZujV}CymDX(37W7uPR$~!_QY68|CSqAqsKQ?hIMSNG`5;>YObJId?H4YI`&+o=v*drp zC5)u^H$y$dpUbH>-Z%#N5e-sT^pmjX;fN~~^ZR2Q)@&uC2T+vd7e_#yyd9pZF0_IX zbQH?y*Gz>wtaeE~w~+Fp9^G+`zP*ziJ*n+81@gNpkE89}oPK0GxXiS6ia|!_;+F_u zjCZw>{fXSfNw$U8VdapGnUR)~thh(>5OMGkasdiszZK7!Bv@ZlN#@j%lTrwJKJMmK zusaN0=hURpaB#EJ0T|JQK9c*|tKI?4)GJ=nx?@Qx^7jU=JOQy-53L;oQpZDUf3?m2 zrd>P&U+Z(caRHVoLwL1p$?pzh&{jdq${0{+c~ zq^LQH&j~{BY?t>%XxNvP$efA9tdl0AF34 zq2J~}z4vhXAq+K` z{A=0B{L2*e$D5aBbOg-<%_aS%fZ;g-Jjk$#v)!NZyv(StN4CJ-L_K<#Z3Ka$l&v*4 zG4LXV-oCK%Q#8_=*62d0`(Dxer5I5-B5y5r>cSNm)G`IT1T4C?{JEb;25*}5X5Yo_ zz|DfH@g?vBCPdf-y}4N5yRPz?8fd=l6o_)4ANhoghnvhrwrHUQ-2K5>dPw2wy??jTOiQ`+OQ&QUZ``FzRxWW~&?^Ke&-&Sv0eBkOO)$y`}9KiG1SE~Pm~ zW=$jc>;xf&^D$$UY4;JR?YH`1g^6dBhSEHX-d_Uke`G`{`?CI^M-# zI5GJB`zbAM`kyVT^cQ8;BuG;5cBGV8NmSyr%3eS5- z#lsU?c_+J%IV#%HNzuxbT~Qe>OUpJAGO&j@WjP3WQ{D;Xoo9PI)&6^U zzx~7)GQN-F{qRq?F>fKer4cqbQK%U3vHt806{Jnz;pGv<@1l!~Y{%!gJL!~4irW)v zb#H&w_S53(XOkG$h~4O8yEg8g_(I6nlj*VKlT#q)PO87RTE#V?EF?|D#PRwU=d?Df1@%ybnu9gO58NOo*Bp=nT07vqMGN+a(f&zQel{zRa?p2!DNE+>2Ir z&;)eAKL^G=;G2GNKu8Z|#kM4b2w&T^pO_$!=xc{(N0c|iBh+g~lB;MLNU0F;%$6qGouG&7zS{Pc&4 zCib<8{H}c?e=@h5`ngv$>SjI`g2*2 z@;S_$Q#ti)^$2`1C`>)3_VY&E;BiJ{{#WV;wr`K`4hvMLCdV}kE}52lD|Hx6BC5?d z>E@-yT;zAbe?{yJCZY=cEVQ>gD?2U!Iog4q=aM^i*%z;4fV7cBhX-`eK)A?&H7EW5 zl>71GzvX@u$GZ(udH38Q2U%2aje#;`<6al=LoLrP&hKowK9_=ynK=8mo8Ej2B)C#Xpa!H-;J%oCZr zyix6sg^*o>FTr>fCFOKLQ8blAdbpJ#YF-1g&%$y;7R{%m8b38DngG0>kvkR<;-d}h z;Qt-b#G9Yhjei4`4dZ|{Qw8naN~Kmj?Nx^`5A;~16w_q-2QZH+ku z`5*`rCQ=BeX0(P0sl7)!f{MhvF5cv?ZI7dz=HK(8j@ll9^}4O2a>40EXJ9E$=53lp zCV4!lp|vp$zcm-*>~Dz~Iu&F&P?}@qzgUM6XvHH>)sLHt=nspZrFRmu$RP1*e$(V% z7JRTlOS!|RG#zyhljxP-BJxYyQ5Lm?an{TR^oFB(MI#N+^^s-e)Dx75AB1t`G>*=R zd?M=_CFBbOlD(quX;Y>+IA9>GlQBW}4;%JQmX_WxVunEO%keG#H`tTwfSQ@G!Q2`x zI_Llzi>dnn8NcjBY{V7Ek0%qjejy$SD(n28hzF&9O7U072RJ+wUg#I<=P7nh2dO02 zGma-ey}#J1J6T}zU<&pC_|ln_W(thq4Mk&rSY@Kfkqd&z(Vb3L4k zL@$c5?E%;2QhP6E<7o0cxscw5iykfK!3c$t1Yo{81SFN(Tu zX|Ah^p?4|RV7ttn>++HA!^1CAy`mh)n(}ib1D(~ba@R0#e2 zOd>=VbS1xHakJW?jbrJ#3wlw+yN%<9aRrsr5G+R0n=-6}@j5@;#6ziReV8cAf^iv{ zo@|SR*ItQ{rVX&Bc=DQnXOpgT*VBOClk2*(I?CB(N~a(@U^h$0qfvH(PN|{kvBU4`5Y4Vu% z%b$iZp?9f}^Cs$(fG51o<&!dXIMUC@q?C)0l~JYrwtb7F(YJGpfMh1&^7Vh>n)(M0 zj!`HQG;_RoX9C!+Z=3a}K$zWXs=NbFVRQcBkN&sB0;eGB;{>_Zr~ZwHiU)Y`tVo9{ zQHjj?M4_JwZ!k)|D($jk0cG#rJsK0YCnSRt0cTpNO%MIpPb^9M`Ze5Ir^x|5ZoYL; zTv4_?pUYSu-qrORE~>sO)$rXceLvRJl9sr`>l z6}W>7OLbWGVdt@c3d|_kO0FmCM`^DKZbj)OC6LVZX9x#E!}s3TzgWA;f$Q#%KX%d? z2%L1xe`)pmZ~UMHA(JW{Fn9_mHmwAbws&=z+SyUJgmpXyja|TidIKbD?ftlP<;s;J zrVFmGBnqyL1o#4%9qK%K)AE0P^A8ht8$`k^Pzl1qF`>)vnSx?5UVoL`vxrdske>YBDkA zT$aXc=Zw6p^{Xy9X1h>Rb=Bc9#!+ke&8n|HJX!dh3o4^Fy(-d9d_8YGqS=2&!I43d zmTmff3j1zPGI9g1s}sq^PWzmtEltEHTlmqFvT){9ZRp7b&JU{;mfAAK&F*I`E;1W* zlqM$^C`JG#Z(JPAP#b{y^3)6n#uIpspYZeRILvCf@^N%;?mY( z$cE+LR^0Y3u9LhK{m+d+{sBiO<1Z~)d)1r(zU4uofSUuaH_qWqSC6CSjEa#%CkipHNDM5H-tvNl4*Ve^;RY2d#8IPs|A` zdj~W9zm>q2IbHiknKXh!>f(FiEOtxQpzNNK%ihHxD-CtC$q<}0OJ{uv6lwiI=7VaBotC^xgeZJ*s0CZEe84 zb__xfb~f6cXz4zy-_GTL8-rCAv8VEZ5k?LA!3!VoP%%L>7@=d^M9lqgEX2PfuJJ67 zjI|d(Yt6s%E;C3K297Bn+^{<2#lL5J|fV#JIjzeq>%!6Lem6+J;D~0+wEOpf1}bV=d*$T$7(% zlRlR#Nd?+_VZ^tGgzG}#-uonVdq0F7C+;%dJ&u&%PO0Q-Z1-&|;nn-WnNWMxV>je% z3hAaYz8~RVdZ_0-&ikq!kxI!7D)5^n1NSLwlY}^wn0qN*4jT@0Df2BfpUAie@N<_Z;o?D zDtYpw@=-jg^gXu+;JS!QAailw89VkJz*IU>8Qgd6IzQ{fSz-(&vT9Gc_w^|oaHkpv zWK2niz~KxuZiC*N3xmDou17BEv`%`cB;J~9Wr%;JCdN8{v|T-Axz~3kNcl+EWVzR= zwLtXs?2(Yc$@1}UUWEK>Oj$Dm3SB&pJX{EAq|#czcH>ltYR`?D_JF7oBkln}8fnwn zr&8!wHub+|uc9cBa=SCj2V3=QSkE!sa?(}}*~rL<8yY9TM8XU+Bk?hcYyN5dd;hH8Xw=!fJ*oH!ytuF zJ;nH6VAe?@gd$>^tN01r=P&A_B5*#lh`WprV>&~1{K_ilt+VfrWtYFWqn-R0Z+Nd7 z;m~`Iq{jakCQTl0Ph|nI60{|Q=ZXJH%*Z4XkOOqruYcb8BLnO|hCN5z7og=-^83&A z>rwSv8G@GoukSf-2uXF){)T0@6P-Fm!S5!4&&_|>pjB8kk1vUM4)5<+tFch5C%#u1 zV7Pyg79c~amqmhU`FLoJ9Zg1yVa3A_&$4taEIcl$-Y6VUG8h`zO?$;-@nJT~x%_3E zWs6H0v+&*CSS8}Kb?DHGa?g1)IMt&bJ-EWDCiYB2yzZ0m*&xHFsF7{&$OVyO2^kOH zJ72M^dg)Fa({e{iX~eMR>*x4O-6c4t@d zTLV%o2uDBZgj*~>ox+}Q6>MXZlX*f!0`hKU$P-;mghR_;9%$P)KD)&=vs-;&MzEgX zcCUGwxIiCyQaej$jG^mluUCqJ6*}WY`I>u~y~H?E*5pFX5Q*r(q{rh@Fh!SeXh1kQdE;mlZt9=usQxZ?6zq3f#x!JTX6$T**NS6 zw|jR{TwLlp3|X+;+Z`KTMo@i!UOppRudt2Eq>Ph7XP!!ZWDaV>$TMw>r!d~WOeBy% zp6tmFZq?Zbo?ye8BnF9@43n{Gu-koDZ!j|Pma1P661)c%DKDM=`Lv4?z{6_6Us6h7 zi$xYG8(Y$AXz?bhS4w>;eiN1}joR+elN?|Q;mm!rxsdLzP<5W3!YXw9k^-?#fUN)XL>J4YH(t&!u5v-dWSI+db27!Z^hjNW9QOwE7D!tGlHM}Cz{0D}meEbYl4 zoKu%Mlb;S6sR?ygI%Te^amE+fDNh-8*4Cg--n*cmXKcI=y}93(U1MxaM}#0IqZuGV z=vp`HHf8gd>>^lG7SFYBuhU!(lRrn6DfASuK(cG>x<1y9 zgn3=QN;hd_Z6v=`@f=4o&08iKNGqUqt__@c-@Zn>Q)X{8bCU$ZiZW$Onv+ac`$)jU zpq(|Vy?9E~qUr^KtO!cz(6e{7c3kI1uRGkcT$s&bzvfEl)BS`^_Q6^QA0mRH)qy*{ zQHrrmX=W6Kr*tDDv|FE2uVM4KW#pg8XN6SyqEu zSZXY}Sx2PZbclfbq0#=3?6qiUu9ozU2K2c3ezMtiP8-J2C?8d6;}H=_s9XuVQEsKW(U%hmi~1{<}y zVQ)|BP`c9`m#TXqU+oRXVL_d{U2Y1Ns>@|h(JEmSJ_-Gx-KJ|UlfPI(2HBVdJ6`BQ zwLFNaVPdLN_Y4jy_3ScQ9ICw^Q0-zl^XMLUvZc@#>X8pnnX&EZO|!c0qft#SiqUq} zw&0C}xppt)*bc9%_zJoFfPmh-YwB0chwSpH)lItzd(WBV*0`U^sr6{PG|}_<2BMd> zFc3)S1!pLiJ%)}!ZUwy?Fw&;`J?%&{8YSW}lE z$dtUB&Z)Nw%YLX)Bgc7J@wUXw7+^q>;FG0Nuy=Lm9*we^jX>MiLxIPe!`R!fh0RT8 zYkxoBW|(wJ`ql_McWyFHpf2;`eQfWiKE&tj6QPPsOz{#~A1<~$`yTuF=lc(ga(2s@ zd82?vc6g22KFHWOgGqQ|Co3`%q+ivZS{6ajF|#4k)F4Et_k8A$zsct{L7C4X!%b)0 zr>Sk23DYm1Z{>z-TzHF&;?YMqPTn*0T4}CYZlvr-p|VThlKLPpwh+iR=SDn#=u{BE z&OUYLxo{r+<8af(maBAlNN0D8yihGG_RH!{re?}cEvu&pgmS0-FmCN*EHUCZtdacZ zhyx@ivrs|WT@rtgZ0EH>WC+XOh=qGy0b@zWQo5Y3=EZCEGab!r(2?(y!Yx34t~EW^ z#VTKV$nyJ~(6dy1Wo1YUm@Rk=P1m2Tf4c#kww6zys+~T4UqDK#(6i<9v+ZS*DQcFU z5!W%;1_tH2e+3Mi17G=Q?7g}3e$xiAv<)GN@ ze6Ngo%dzV5V(~grk<^2 z350UP`jbB=oqe3Y>-)2)D=I00ef6H3IXQA#P*M^G67s32s4T~3At?JhKd+?71I$uJ z09XVr8c|X4?L=3S&jIP;NVRtJOfqVCuLk5I2#O2CU zo4(FS*ecNmQ^-Hk5Hj6<1#S&^R#uWS;?J-#qr2lcv5f#W%v3Mid}sH5oFFMaiHaSE zow^QcwB#i`4x%1p<2B8bd{pNDT4BxaX|C=2o5P(mgLNyu)-hovYgVU!=!9cl_Otfv zv!%cm0aR*je*HZQ+MK4Z)9a>!O+C*6UIp^S0a`0RvAHvEE}d9BRA@oJwyU(fWB2fi zehY)7tUX3@lw#b*hq+4%%;5Gq8n3|MIne1QI4EP^ zPz(QE{pO6Z{SyQP{ug9qA*#ob)NE1(R?e!PTTA^dhwG;mm6heyY&SaC_BA{=7y8?6 zcx2Gx0t>y`04fL`()U=>Us?;&t3F83>!6TBg)1`}3<)*nJj2A?7R&PPec4*+J%(aL zjA=(AJnf(xY0w3k= zHFqmXr;+`-yCH}cmbSM;O}cn}S%Z_aH#wrP^k|&bPC}JervwfxcW*GrMGwG@;Z)f? zEyj)3eE9r2cn)<&ew*<6gVH3o2{Wp&>2=6~?*1;Sz8hf6TAUoC0-g!Q8!Eo$FSDAI5Hy=~hGSq|wsp zM#;qR<&L_p&GHY%`jaK&qTxyW&vFg*C;2T770Pm-7N2ALv1c8CbM<%fbQ-;Q zV$J4hNvBn|QtK^NY~6gn?tn}?!xi1UE*njgD772#>v(50KelzSz|EGBhN@goqghL%Fd>B6}3Ean(_6G=clcG{|bE>3K5C+ z5OB}Si~|Lx)nA?xka;E8MAt=sn8r0H6dfUXoWItt1ss3*KG7<*j6KVh6{(e?^loz7 z4?0J7wsFqct9oZ+&wGi`XpB4w{ay-Nf^&hJpkQ6HG_}b9r_uh}yNMR$CJKKfM*Gq?uAWSFUoM$Ks6( zrdQNL-+G0J;iL@T4Q<*|*7Xqv5(w1>LaC4~%k~;W$%#_yb2I2V_rx~Z6nBI0+TvDE z$LGF;de;gSy7?ZwyaKPx)oT*5hWB0%Va0wpl)}=sAC%wVxuzoUB!(*@?iD4%@XklR z>uWongTW?DXXU?GP+2bEw}Wc-1Z!X-#ML?O7cLvnHnu~*6=5#WNUj?J2>tHp$#n1I zV1z^M1yar*RB|D>Fcwfv#RJ|@LijkFR5klvmg#slK7S2%kr!2^CsQsLbH(Nd$mw3L zf+{+{w0YQ?{cJ#&b4pW9$i#lKPBJoDZjgj9E*P4gu9u@hRB4Kn0TtJELsJlze|o#1 z^C5u3+`;$>Q;&G&_6d02YJO#q$y{~Mtb!VbT3ZLXPY@wWI_0kFKShInz*o%z#aLe8 zg@!=3l@?i;2EfjQ|F}{u4P_<06r7 zLX3EBMQSusNA3F3=BvhC1|b=7d5g@|jd{V}0CcJcO{jMv|J`1GhnjouY=!w5O&XXQ zEHxRR`wBBBI!L2Sk~zo5T7RQ>Y*={`+UOR;d2lvE+fYfDY7~J%#XrHswO~!gl#Pvz zxkXoH3@(#x-jfaFK}lbm>my^Es|6)FaZ3uRkF9|Vk4j~tM!mF?#j!P;gmIjYtVka% za@DG}#?Q#*XWMijuSE)znw5=nN5V_3^;x3SMo%sEcg^i~U6gTJ|2Y~A{5_;)K4=^p zPra|PyM5n}2=U?KeKZ*)%=hbAH&K7C`+_lD*iBLjrbwHO#nIFI)ua&iU*et(4mO@~1L4VAIN!y@XDd?hPOP|6Hq(}Vo> z<3=cpXcl0zptu539oAcs?hi7|N;|<396Fonni&iI;CpOZ=2dePpA7#A+56!vy?uQV zS2#EXZ#dooWL1@`jRF|OthIz>XAyCb!Jy#SUBzExzO>3U=~L)K_~!HS3ws7&`py7E zaJ_v1X^Y|+s&Gu_t=oQV=r$2JkHPc~qLN@vU6R@}2~J^4l1~euW1N_U$FS>d0^L5G z@I5syWZXo&?eT19XCf5W2V}m(5V3&P#5x`o^YHQtX)-cu!pansl`)`sf@!2anfBLk zwCxZBFppT957}R(m%P(z;ZFw1??0>g#@XVaB!>h7Vzl%O4Ek>LRY_Xh&j(kY%W&kV}vjKx~;Vrey$$Nky1>fW(w@_OB>6FnomjtWwh&duW=C$ z{rK?&2ujZ_q6ln_090mTV(LL6-)x44x$NIN!sVzu3goE7MrxAx5~<|I!kU<>o077` zegUh`{8>qtv=pqw4uaMF0{lL!j~tD(_iY+!m)k&s&oJ6vvNo(=D!l?YlTV*cf=jM? z4hS4uJ3FHir?otdJSK8=zky_RU9+iO(~#yKE&(4S_NcY;x4eD#XrrCxX@<1aL_wG_ z-<1^8cR{UF#o#+6wgTsUF<0kWR)(t7S{dui+M>8+j)72w4NlBp2q6v#L~!tOs>ZE6 zJUdmKtEd`VVQai!Ta>?HYsaR!xs`Ij`k9|g$kN6ID z4+{NJ!~`;*z#;}ykpVg3)+4}gg-hPVmci!#itXIJLh_%30d`3`(N=;3<6l@UbwMiaB>7uoll3_i5a4g70KhE>dIn842 zr|zVXGMBmAJP}W+(j|tD|=_ODa@xvU!+Z&SH`k?{SN^BS$HsF`YCxy@hqNF7o z4wCp`Rr$JiwZ`nob83coIb|qMEeUoG9!FVOiJk@TP2alM3;jkG<??9AS)68hTWznp@_?!y~`g<>R1O_0>%{(BqbWj{i;&|VH7HUQU8tAJUY^{w3}<@ zYOzcVzUGvOkB#jIdrO01wbw4i=@eaJu9AaYk1G(;c0d!G($0L zCc)GQDqOI44zh%ORcj2lF5`Qy;sbHbRl#hI?X`m&lwM5M#`*0Wq_baaM0@thWhDZF zM)spK(m4qoN~AfA-hwK*vwgl7DEm&=CwsMH*b`Q%lJpuPw9z1V*dW+pfLKtz;xkvm ztZG(jXdxw$8yKHj21DmX+s-iSC9x+gYO{y#Xrz$ydb@M!9YFi6L3 z=@TQ)T059iBg?Sgx;L0lew2II>QJD9dRd0w&^^Esz@N{{?4M~+M#`OcwPBmx4V~36 zHtDVE@trwm{d3oUv~zS)xrkfpS^n}OC@FU^x@!h*TbJc zZN5ct7xHi_Q%&dt#VFZt1eCek$XJKO5XQ+LkNT4Lgu3RGu9BbGyZ6K? zmq2oWt}yrh7R^;%<$aL||5knbttY43w3U5bR;N(Tdw#*rV`I`+C%1{kJjV9p;-m^6 zPU?$2U6)c+P_*`HMSjaj{qWV4N&Kk-M-pcc4N^_Fw`@qIbI1#Fix_Mc`ip-XVNf(P zI`?a8TVe)aRjaMskq<5*%-R@ihbvSWjlDkb)-2z~KfeX*u7S##qt9k?P> za$rqrHvKk^QyurHiAPd<0zn2TXdH|ruzmdf1p_0{xJvZ!(VOtWN_U_EhCa`g!F1&o z6hGa+(frtwK291=+qQ##z-X0>eX6v7YgdW!5`Babsj-4g%O$GFHZ$-|&+oXke^2d$ zj>5xquW4J!&Kb08k4mM@)xk~Y3WTL=LCeM`{^n_yt;zQ{Tg}wt({4JV>vla&v@z&m zsk{a3t$oSY78*8nbs4Xd++Z(A#&9DC|3yxPlM(p7c==yZ9}x+p?W&5IF1Evm0bI=A zKq81m?ZRuhDk^>iRJC|gZl`FD;n}B1&Vlk~{#F6DtI0iY>rV_W3@30!=79}p zeU7^o40EjO0bCB}|1mhR(j~IDz1ujP4dzU zmw1c17%rU|%qE>0%qE^1%nDWG^V%vcG~Ut!JKf^)L=)hzKn+a5*FYF41n3u%IL?^h zU51|GW9nsZ@}#q$<~vHh$kTQetX{T?cM*+73sxpbqr{36Fxu?{+P3lg33mOK;QDwL zi4bmCv#NnpUJs~x22REd5?zDWi8G~K4mHn=+1lvK*WC-sKXx2>(-9{q*w|p?F0$pp zVu!s8HI_(E!yfDDXvkd?VPzC%9dt%VFqxM;UC%=e@nJ^{;6ae zcxOpggx?XZf&_r}@x7I#T)UMx;Z|-Lry#neiAzNqi$ntOosNZMvqnP#f++tZT>8&d zTKelUC7P~+`CsPI@tTirB$vrkApM_vhC1mreb6hjz{Z26nklGT_wU8p53B{HjR+$O zgkSfU}f*(gat@Uitb{c2v4r;#7FZ1b5e3D`reQq}N9 zPYMdQ#G0n;BRs?26Fc#D#<^oNkoHfGDi)|h z8k>(qN#lt-D)q8)6p00&$O&Xbj^LbM02u(o1*P8$CVFFap?Wk(7ix2Wp!lEnYFV21 zCUfggUv(-o{7lf{d^}t7+C>>z8h$FM1PSvrk=y z_-aX83|chTf1wa3(}P)so5br#5fUR}wu&%1*Y1&msoL^)ekl@*^*CSfA-gCNADd_! zWD!bW`)DS`-gwR*bzQ#xF3J32@ATZB;zWeLeha|j7P*9RV4>aule#@Z-OoJ6r1sk0 z@*Pl7#{Aed8T$PAgL%x8q~I^*&^57WcA2#bR@|}zw)rH{G02CCn|JH2qI1N0?~n`B^)k5z_xc%wOuN1te~!0V==L6{1tUwa{NU;weyJ z9S!cZK#`LQ+I0cRf+kxJwFiO!p+~2AI8QQ2==f<;`T1%DiML6aZeKiN9jwWnQrQ0_ zF92%#^B>orpH4j@VSG!UQ~XpL{^PQr^9$(Z0%1lzzb^=K|y7(Z4 zb{-yj$zH23l@i4=p}3{_Kdz1M=vF^{TFj6l*vK#MD+C8v0k1|uAP;c&?gQ59cTv|Q zfyAHoNkQK$5nFF}b#8Mt(pp`z%ye1mwm6vdnfK5k$^JvInmv`&k2gxWcXW2-tL0i< zQXmD+2D8XWOgJZld_Ho|Jy54}>|WLRhj`jv$d*~rx&v2z&`k170hC1pE%1HgwCkAt zCHhy*5dy6iqXUy(bx;maO@rRq8VAeAyR>*1C`+i@*ttqeai$vxm2z^OE?>;AXLKp8 z>sU;0Jz(t{Yr>zWG4idmFHs>6mTSirlbb7UHh+fB?_Fd5s=4d|IK!AiGKle>v`?zf zc7yUpkMyA$9J&hMjkmAQldi!%lzcWH?D1m}J2$++=q!2t_BseaS#i{4CXBl*p%3}_ zIdOaPDVwkUO+hcA9tTc7|9tKnfV-u$4Ln2(31^G{|DNdc@(G6yx4%cPFVJ}Bxq7cy z*W&m}JP_-YnXJ(JFRRyf1KtL2d=K|26ldd}uTR?YG^7coh5Z)1I+tzg=##($$^{Py zFqp}8Y3EXSGU0%O2L*`g|G2>7-|IoPQJuhV`*mhZmM_*inFN7-B#Xx zZ||dQyf;w2oBmaM9bB(7xL$z>A49m$D)$I(;Z+^GX6~gab(5z2De8*j$f~m`K;j0$ z*=uFv1$JfhDd6aZ%I5RD9IfqZZXM0r=b!(q;qr+!2y>2AySI}1w3*qhJIt78SO7Ta(85n;o+Ujho$V@lH2d1YV`sor;e}F-G1h z$@afshRZIKJued0cBEmLFyeN}dd?;P#z9B@TrTYh$&W%=s~O$i8|c%-cg0q6g!OJ#HVNv`>b9$zXu{N`iA;D2A}p(t;Gs~Q zAvL5OR$R;KaPSb`&^h+rI(pF7fH5I?p7f2#r$BleA(PN&6S$D=o7Yi7@`-v=iW42a zqVhy2>DVvpf48Wy=-gh)-l9@HZaM9*ORu?ZUfQlw$Qzr!r$QJ`a02I}5J)iG~4yKz$lj_>OUfniXe)D=b zg+}`fOO$>$-}@d8xO;PJZL*uV%B)*3ALAOO?Cp`ox4Brko=5359pPeNr(*ms)}F}i zzI>r{oR2Khj`ZT!k9+1;7Wvhp%xZe`3M*h`vP)penvu8=JxQWfZ75V!{sKw+#%Y)v zz}UWt@NgOXz{2A&CW1ufJ(4DR5=)zu2{x?oT>tV1QzTIMQ-*Pf)kKG`PUqUR9NMEm z@_Nf$f%!OwSJxH^?E953T=sN+7R{>qEXvw&Yt(?rv=cD%j{++gl>WQf>{*kpucoXZ z$fl|sh9=B}Sj$h^?wOg@7LHqyynPQD4(u$F)`KIdheTqT#BsLXw_%c9c62mSpG_{x zo_b^vX<$7Bl)zByFg=E8N(K1m{u)Uk+M!W?Pf31QR@_;tW2!XPuKU-= zw!WVEg*P4dYz-ODq0E)6B2Snjk4aC~^8-XJ+3oixtjRbcaKXUB$F zd$(cdL(6~6iX^dzuL9f2|0l^UftzRQ6jodTyC<|vx3_Mxq)UmzJmHgM|N3_Beutd* zQ`5O`&0mj%JH z%1hd^fo(-RCep1C+)smXSO$(Q&%F_#0IakFArX`4ZzU-k)4yA$uWAyohUyfirCCz< zX!xq8Wg4o)M$M==bCFgfTiDR9Kq*?wjw%&c)IcvpH{4c5k}fBZtE|4jtbhWXDd5Qq z>{aGJ)l+=3xs(N%O}*u!0NteW&wj4Bs_Mp<>2$Dd`wVWsOni7;IJX7B@`SH`yVVl$ zaCGqv?4dm!3JOgx^%N*|F@zB0GNP7; zT&D*#%YKD!@qo;Ln4D8kFsg9)qreGuI@CH_1@3ctLjda&W_KvS!Pvxz*jOHIaExnA zyFMHtFF8Ovt<;Y`xL6~5eW+Srz!^aGvsEXDTsv@%KAHw{tkR5sf4LHkIJmQ>;?s=RW5p^Vlk-xGg(Hx4DT1L3M8@hG~ytxrgp%;l~zHOOw;=0 zcbh%vF&`qzd4t@G4QrQJ;I=@a4#jR@(g82L-oOdi0T)+ZHa#H>NbJ51CXi45XJOzZ zH|5Cq3~f+0FG6x#)?hFbv3jjEllTlwrQmDeN?8ao(Y{Wd(y%=Zd>8NRpw%a+oUK#T zPbXvM%hTpwi|3CJ#?ORx7fR%%^=Z>rPQO(WP0!Yn&6F_-;7*-jQnu5!-Gfl;F+8gB zNUQ-RmrynJZXd1-?1C2xca0+BR`wB?`~x8qL&msI%KC45`kl%9o+4ej`eyC(GiL2g zT4vq&*Deo!c~BVC0=4dxK_@83&OhuAqzVAmZ9v;XHDFe0>mn0G9>M zt~n4wn3FNa7-C#ghN0SUwbU+9AMnnrnA5ksl3GZ{RAjRy=FOAC#_%}KbMNfv&Qca7 z8rwXim%o4hZDKAHWZi#;!t_&uj2+`RmollbOx&O)rhZlj!$`g67?zgd73RjXF5Icu&}gsG`0;^R=^+_-TA|LGGsjT<*^ zL2lf*sfl$5cn3zAKXT*7{Tol^9&5R$Zq0fnk&XHbU)}K;Y@HR}{5Wf4J?5+o3XiCB z+P^K6kdafIM5*sX7CTs=(9{~0@=4rMYcD~4BtgWOiD2nA(Qwk<`I{2^F^g1*r%d;G zJDK?ko0V5rnLxrn&vA_@4lXYTjYhRcSGCeM47A<+Rz0Npd5yH;s%bU6$7xWNke#X} zf~xAP^G&01_SSeEWB**u#&@rrE$1LVH9P#S7rd1loahQ0t$d#%`w1)OJUJVX^}7oR z26pV-sJlxvXMJuB0omCKGrp+pVBPMoBFGJDN0mbf~M9dV%m=1*UrwaJ%Wh7}+L4ae8zV*fQ~GXQ%;dOWH~kk8p8240uPebwT?bnX zJ5;p2Npm@VlHc>#vYq8TZO$SDiks&f#-Of95`qnY}f_z8xr@?5MmW~d*t{Ij_zVIW8jleE?vFU`3z$V=6nwo#O zqOY|fon>p&>N}>v$Gw!hnm+T7|2!=7{s9ewW`_87a5`r2iyN}t{>_l4AEiw{_?wzE zn;x+a%>Q*H9af)0t)#Io$LPQ6cdl8WTYR%$5=oQ5Z4i~El(?AuGNWx+RXVZ{p8kC) zS~_Z2MZ8zD8ZR~U_bbN`=yQiTTd8CoS?8x~?5)|KbO=MIF6PsjRjClAht+b`1pU`X za1qz7B-7IgK0LygUk$5C?CX#3(Rm!Ht2QeW-Gs|b1^u}lhoX@YtqeCeH-egGf=(O9 zVgM-;OeUM`cMkVEAd^COt|N-Jg;gQFcga$#Gq7SJLE&(|K!BAtg>=xu!CM_zLF7BC1`KxAw1Oy z=jsS9P04zkadpI+>V#l#KN$S1xKxjvYgrro%sm}RCrO1#NGDJs?(`GuV@isT_}QW9 zJmwAE^4E8PUyJSMr38e9&5zawDJUq|5Dj1T%W)(nC8IXW%FFdO%#6o|hs~`v)6?n9 zX(t^^5F&P4U zs#~(nTXmqkyqt2gE5XB7R{c_Ys&Cz8&}$tjff~=#&X3!*EyB^&OPpSXjc63DI184=5UfX$-Y0@k`kX>B znqcXJBE9Cr$_al>2CeC=>S{{GD4ODn%=wv_2>PqNkc4ATPfsVhJ6ny0Mf&9&tOM9$ z@gap~l3GH-!b`ov^UgN(@DQp&j8S%Y>RaJ?@8OcDOA$f9HYO%b?k0oL_M-F&^2Zzy z1I(ZeUmdD=l>dCk$W_D1<|9b0*)08mEl*`h3Sd#|@rPSe<=wi9WF>36_VyU4%N8Z- z1jabWDV@qC_H#d_im!A-RkweRx=I7p_8{+h>6-55niIICd3IHm!{%WTTMgNs5n3`euWRXn z$O?_p@~IdzA-C`h}UZXVkhlmbQtge`u@^Wy)}8pSgTOCl{hZs;MJc9_SIW=&y%vrr&CpbH8VCA>^AR1zT1GZ>)XsU zO*{#4NAbDhQqOG6O-v*~`|{E;gMvXTpl#$0XzgSGxzB8o_cCW8tS(VV>#J9>4CSED za~J8J@lOrcCx@!8(PXpyK?&HeJKze61{v2MDKINN8rZOa^)wE9b#-0jP?x^lq_QTp11=}kPHQ%S)dkddr>I0 z{p!5293v|ye|KhrTkA!+ZAt2TT*2Ia5g`Ch&o=9$Z^CO<-suTt@1(r1cdS{zd3 zNPSti%{(A~c?ixw&Y-5IhOVUWN}ndv7xX|+M0%OcrBz_>1#i9Y#b%hUG%K&JmrzfM zuT|lIg!X9Lf#txaGNE&9|HuE$loOf&nsxTr11R?jc<;3`4&AbYjrns2V62~s{w2Cu0 zc00s?Z3#l3dJ+&C%9f+mcu@$i?`zZTP;JJC7~aI)@*qN08vEC$JZ#?R=y&Ae$xzEa z%!Ttxc;jKFUl0IB;}7Pd-Ovxd)JYALHR^Ww*%Iw=w8ney^7OGi>P2f)E>YVWyScDu znG05AB6vc67m~i(bm8#hM5)-rNpZ3zeY$_e=ip%cwO7&2`-@IM0e2 zF&Uq9ch>|pz%PA&xN5G6C$Nk^ zy0gpkz3H5i!WU_WSKzjz9;3=uYVnjcI3&dJbQCh-1`!JsJ<5knTt~(_tR=2LVxdLQ zv|)t%{(>{s!!XNhr|IkoC}OS0&*k_)r`0S7wBocS>w~z95V@^)PDDHi25ZYuq5=}= z8bpFXnI&l~Nu%_0T2bo7(}r3+(3JR6l{`pN5h)y^viioOF`qe3y`DbDP`bq2w1GvA zA#lxQvV7Z_Mq8FreHMb+cBLaDK}=vcUUo~Q9sm)#65rRvo;(g>s$sxdI^__J!#bQ7Kc>?w&IRU$p5Y)%uTSU>E5oORwzC+QwKk}J>MJU92|XMQL864(nWp3=KAe^*DVxl%OP$8La`6tm-t}oue#t9=Hr34=2lI5% zIfUOukR7DwAu-}N6k`b2jG2r1BWmr5 z(X9=aC)4r56SdWYg72GmP=k#se=Jpc+Qm8y>j|M>Xd#sT4%10k81RE&BsT(P^6Lr& zA!q4z&`2AbOxKfh3uFwy?c@~qyaajB8oA#jn7G%1(BT|4QR|aZ8yL=VUVeRme*=h_ zh5L_Q6sjqV7@vb1xBb3WREAx>vGjZM%`dLXL*@nQR@ylV;n~|675nNtLXAz_D(jVo z(dDsOMRm1ti4dnw+6-c%!Zu|;{bUY56YWB5as2e8P&URIg=ha^v7Yg|9P&WXTST(~ zJ+@oU{T=`o7f`YX{r;MGE~Zz4BhtyRe>Y1z=&-?#j-K z^`7o%p>a<&T{i*<$EEdVc=S~M5p)Qyx?SI6A5Nzq7I3Q0pVJTXT8A%iPCMMfU-gR>yaFZ23tTVJ1bLCo2YHoA%%Mo9@ujF za#=gZbHu?GIpjO_^5yEaEF`bq7U-ixX=o=dFq}<%ikYNh(>r&@;Kz;GFu%0m1{bRH z7^;&8JaS--7QgHHb@`&B&j1xyjiS>Ya_yJ-H8L&EEu$Z2N&;tLFy(LSNL=3oeDn@N zoeriN+Fe!-%GA` z1XA4>yd$a_sA1O=ZwDeJvF3|uH?N#28c$pPx>!k*b-!-va5vpFPW6To%FNG)63?IA zRk=9-Dhln1V~d*%zJ7bWnRflm(s;MUrCls!Z*BH5A!Nnmcp*(!pliFFgYTsv0licz zY}edndpC77q}Vgcq|xo+_b&r91yXfX(3@(izc-s4GeGC~Jda)#=#}0v?}%!1?4W(g zB@QSiyslfi=r;i(`~t^PAuV^|lrvp^E%-Us>_osoq`}@gy`6kZtY542d^N_)4!`K* z`jGt>^TghESJYUSs7)*%d&#KA3-$;x&C)pS?`rMb4yJ6RBC+>O;SP;?Hh!xG?F*w& zt|IIJs^4A7a|iZf@cqSbp2Z+?-)($6=FPBc2qC56G=%Y*frKqjP3Yu|w>fVrp zy@}C{jk?7hH)f8$Gzi;0tu@6}nE7^_we09e;PqN_+==uLx7z3*(teHfetv)z#~Y&t zj;VRgPW%>IbD`Xjc+oh%MmuoFNUbHR0tXkco{P$E%$8@q&Ti{MOGq(v@IjAWnqEH% zPEti>&~1pI6|pOhSD3|#n|cL#Z=ZZDsGG%fu&?Fq_;XYPl$hnVl{D0|CCSfKq#{|Y zUoWjTqy7ACQ^@bdcERuT^9dja-Qj7x__garkARd_rL{GT6g^_IWkkIDdR8K@We-JG zIw(V|k@=EcDftnLfIY6vq0rJPwUD{t1yZ-(oW7zFdA(2qzX~N?u~k?*j|A+@Bs0!D zJpB>DF};^{?KvhIS8Z3@ph6OT68{PF`5fi|O%=^OyzOGiFVrn2CDS{G0_>#j7M|u4 z-=l4KBA@D(4bRiD$KK1rcwk-hL795Zv?X;^gbUxkXCYX$4r|O;-?Lr!Etz#EW8UEx zd2w#rV(6-hx%5~6U!jVa_;xekLXKm4FHMg(M%@>J$oDq#ixx+9z-{QM8qL=+- zrmKDONn~%n0gMLyYCSqLH}>9_M@tZ#FAAE%c^Z=V`y*1&fhTmg?(IO`bA|h)=glnM zCkbEOw}gE{uQzt~;HRsn5& zwk09&F7D8$A@t4E2a61G#dy{+x2c+^`=5rp>Ic&;(;0ZAZBMJ{myzb{6cLPEpF=(J^QMnnOEu>a>s2iiqHM&^~4qe3o^rU?y^lAn{3ZgUms21VUyco zx-P*v#2}TgBaQ@NBYgEYmYi%LE`4~DB|S<@$oE`-f=xIO$A3jg-`&df=(;Q9`2N{# zdlQtGU-Jp_>TQ4j{6_+dLWAfJ-F&&UwB)NT+^{T>mqw!b>-LLjuT zDJPu1HFWm^2e$jQqjOVu(cXS0qOsnQU!h&-zVobDMA9XWg3-}^6_Hh(K!vn8O@e;` zB4e~d>YgwP?4!-M#y_Dw)T8?X{s5c#li>hnM_sFAEKQ-F1Dnp+o#p z+OOf?Tdw{iW^zaegYH_673lqb*6pQIEcJbl`a%kXR+2XX=$CPC4@+OPNS_`woJr{H z=>>LD$|h4aQ8WB>rYvRV#s@bxezzUNc}~?V@y=hjCQ}Cb zpQktn>v=9b`_pSV*BLYUS2y2=!SK|9+h}6QVV({2g*!MXl3`XVI+}QqVOGc&Uq>ce z8N4(DtCF4^3oHb1KcCnuU2oXM_|>y4zBq!(|@GixZRUxKVU)vvDVu<<9ul;w$oLDQd~`Qx2u zG|fH#W9zqX(S7S&rAp?7;K;bmdAwBTKm#C`VHFWP-ShRN+trAsYFisQID*G#U8#W{ zYqWxj-%?qf;J|-dJ?qgOpJ?;Y-?T^FWWPN}D81zn@in=i#@nPmiiEs;{3N z_C3``npM_5GXP?Ci_`ACS+D8o>BwV??m9YLK!l9)AKuJF4qe+9`+YU4eR0;ngSsBs zg}z~XRTm5b)FaUY5AeKfGIaG**0M%~V5889VUJaE02G(o3&GWsBFtlcFFWptLZ!LD zqZAg|=O%f$sma@&<2F^mK6VW6`559+nyu@b{x!01_F7MqCb4Ui&C5^ya@)miS{jM` z2^67PSbe-a4X?HvCV>#t#6Zw4M)s98Pd{w%{_WA(;#Jc zZ`1)+P50~xB{;Yew&b`CTJyRUK&?cNNb*}ZsCDJOx>%K79p&ug;UK)*=D7!0(j7?3 z&`x)(C)y73oSU~tGy`*Hln|1s%M}cRF)WcE02dV%74O`6IhW5Ke_;%TMV$F;k5?jG zm+SlzN@iy_D8kzYrl-T_=8Vm0)jLbfI|u*?dbKQT+GlEAH}1Elc_`Dkn{SgJB4Fni zx`(1+;1Di?DVv)!J*?dV8TwrwR~`0=a|*;!hATl9x+jzdL8~(t-E?0~E6)6V%I?@c zONX$tyRt2*jlIGzecAuLU^3g~7DIQOUNUdn+`Wat0ZZ}G(UYr$Z6#vFPXqGGrPn;- zq(e_y*orzd`V!Sxu>2zmCz^WzPV&vNmnzlwd>t#KMdb2mxY+afbx#r>Q_;bezp_+w zghZSpp~bgV(`B{x^qTzay-aWu$2NJslayA0QSI1qQSiwRg==QNsWPk6*SWxwq0g##>|4@y#37^U7Ap z()x4c?t+6ZQJr!#*KmKr94M;ZLT-2WMI|U0lpdA;X)D#0o~0f}1E%AZ*fd$vRC`#qS7LVLm&% z16uet#S_yAqy-~(`igb&09BpXl~9-m)obs&q#IS8QhpU)*f3WD>5gzh2Lab@{SLd4 zvy1O`fHn)~GjIRV?{`(|F#p|j6a4JhrML0hX5-OEATby-KQ|X;RO?D<)Y9AdApfX| zuXd}XdjODFtD&o&=WW{8`S5Dm?b*@eC5G3Z9YhRA%yqUdOX*u6-3jqN^IF{lm5%x= zt}6FxFH`3{lvu!vzt?bp_u zSF3c;>G$v+-|+s(MPnvX)>S|o!=M~3$~0_RIO1W=!@;&xk-l`kI3I7kbAv|0o#>I+ zr?ceyzWB*+DmB*vYQc6ZH`#Gzq@Irfn#x1BOc{{%&&%IKI35yx&=7G;T|)J z$LYL(B}Cvbm3svOL} zz0amW!uW9opS1JFu6cTC$Aylr*QA})^;y69&P?@fO!5*@LJM21E%X$V(#kfT^ycCX zmNV(Elw)ecwqFubZ;vMpmlq95ofT{zrF%}tZC;SfS|9NoUiNjLL8RL~`^6?VRgU>8 zA4|a^3U*ZdWkvgxMqLxjgCs-w2xURYRO0e|08I9}!B-kq6L}lO4q|jF$cORB7+cnw z-R_eX?zsIDLKT$y)?r|0?|9>t3y=X@2&T6Cc8mXIs^cBIsy?;B>A!0M7Ve<`x(U9n z(a1*RS|G#vWN3dRGKsF>>hEVHX>>W<0*? z7igw(GP8SAf7(2AtxApZzR+Pwy-0RXOpjZPc>mJ`8x_h;2U=^Q*jaLDKc)Fv%z8Z< zQ}jN1cu|HRdCpQnCql89oSD_GGxM7Fp5+Fcy{>6PNFXPf==dH9zc+)|H=`m@9rmEf_SSONr{<&3Y;Za`vV=G65$!I$fI@WzKI z>r6J0L1fFE`4d3;yt;3GC7R&@Y1j+mp)fLe*_XP0CNYj2r!z@ToSe>?=qQ{(v5EyR z&k4tadRBvmL6y)FvTatX>>tkPRm`(_?;t(vHGRC-bE(xtUvRPzw|J}iNsXq@R&)Hg zn!*dWNkOf`!;*n?(1|I0rE99U-c$~0GAL=B6{XT4Q@+!-!EWA|aExl$s5rUK(Ass( zJbvbpPE^eo!sE%y(GKP%oe|llxsBSv3;zh zVxL?r;--T8kb8`k7vkA&v8q!X#NgSF*?p@d2GePB`dU?_+d0JF&>m)y3jb;8s9UoGc3SRLF zW|JVQf0!RV?2$!<2;F!%z3Y^g7!(LPk(O8kubAfBH(m+>>3Wte{Lh|tqO`c`Yj$>< zPQjpaN9Z{jJE~%(CU0&jwGXM0#wy3L#h@(ZuPg$1X0ot79UAbg*r3z4mD&nyv1f5v zN<3)+2??S}{H$NIvO@ipgNcnhW$t!wu3#eX2Z2hAg(^H%KO6^lxy?~ScS#=qSP~<4 zkSfaOt_;-R0FnS7$NAh+9*ACBfB6yS+Yv!Ynq-m$OnJ%yEN$)q;eqyw@7*Xu&@Akx;~E8d!v}4!rT;9o^flM%|6a?|e>Ue0DH>l47a} zPB87ga+X=<`H*OeNQj@gfL$WQaZ=2AaupV3DvAVR7NF)A(oX*Ttg>oRJl)^D$2^Gv zDV9l=nJd-W{_I(_@8r9V8UrX*<-G5-)6DUBZwAFrEqZ8m=9z{Z(jvY_yxd;2uUiI4 z6dFpLR1CH-^FR|kMDHy)oL~Qiy2e$3_WeApv8mo_C@T4SDW+AgDwejJC8ipxl^l@l zeKXmi>f3^nN!PYxYC0QM^3q<&+=$tv3Mb_PhUJ(_u58C#(-|sJ<#W zV?V+qLh)3bM3V@s8otgD(eMN76;a*|@_rZgN~YaGM4bKeE07@|{nOW)?PhFIBv{YS zAkehzWgXl{ihd9j4=qXBW))NHfrYM3@o2MYc6ucooU2!3dWbgmAms)nn=bZtTnkcn zx@ujwownJT@@p@tIFKIe%y|5M>yk2Ze+Bwr#c~Pkksw59aZx`zSFU+1T#)BA1$`>W zOPP}vU%HfjVmJ^st{FA5F!|5W=vS$>Qc&9W-Nd~-SCPV?t&nY|_Q)_F+Fyt+j}7^5YR!B2nf@{- zkUUvefJz?VHFnj@2~C(lJpUk@{QUQ9gfsxNF}r(-e0DN^^=!3VG5nqPN-PYqD0uN; zD2ye8nKASGIu!A<^y_$Zs}ynu>bRQbMnxa?wLjSzxLTZn_G>?cZ^4xHZc;M(#k*vJ zKL9N5lP+YLi7N7i8~`Ka!f}*SBWqNhCPK=GQ@(LnV9f>Rv~-p!3T2nHobS6kjE zCCU_iEqAzl%V_VU1*sN1a#t|UqyDb|YJQ=frl#|nVxXqQ5VqBYAaNWQz+*rC8NEINMfaEX5#nlmW=Igley{xWSN`w~4e{B4l z)w1vGDLg@M`O&ffkv3s4NbrrY3|i^Q+-Oz{&hh+7i<(DFU^20>3`pn zH!k~^v>p7j!Kc!dLv8+r2z8CKEoHD<~4mm9)7UlGafytK{+yADSVE-cs(f=cq95e@Z z#S&8q+ok@yl9IZX`1{eJ=nP6{X}`}7^tSkNoF-A2oEpGdpFEKH`P9cp5@7NkS44&N zC;Ic7kK)5uRb7_$At+#2H-kYxDP<`SG=WBFMRLZen_IWo>~=qlsw3nM$F2U1jrOJP z6DG#ITfqJKf!5@b@00mo5-@(i%2v(jGs$k>hxy|)AHr+)PfIRCLpgxzw1Ws3-dQtU z=Nd)Nh>()o z0Q)QR^P}~K@ehb-LVPW(bm`H^j>K(6IW6p)v=(Fz7KJ#H^SCXv~58Um9Z>vO!I}wAkN2o?oJH!iVS&+}_l&SCqxxn0@>3 zDD!jk^$BM}?c#QoopJc88q2+KO2Ea`bN`F29`DH{+y2&ROxIj0-?Y&sSjc>Q=s3}& z#$r1Y7^Yk2&3ums%#LTNb(6BvBwGNcj2EVblPjmZ=Skw&dyN|v`mXy7#sF32ecCQK zzqu8;ewEesL14byEbPdad1+v)yDniH<$GuMB8<6URb@F{w!B+VYoG`Q+(heU@skHg zv3ygs*o0tmfc5;F5K$itG7Y2_8wh_`#vAwH4v3IP?{y$3(?lUFB*K7Kvqp_2%mNf7 z$AxscdMmHxGb2lRSk8lMH(PNSTkvq*r+9Ajown+tNZpR9p1q=?d z-NKPi#&m`N>W|(uQk;BMt=TtNHtrVR}4B zUdqybB=b;x&rP-dPk<-MY0)*~LMr-z`m=9v+5l=xG77|(5Pm%jDj%O?2tIB7BcR^r zWmIlIwy85PHv!u0Vga8XXQp4QRx z$%2ft*ux@@XTszdvoTRKOa0gU7jRG=pPPvOi9QJ2IJbj2>JJEb>K?atn2G^n&wd-^ zH%r?A)P3ZjhO9gSLCNE{WRvx4K&Ii-C36G7 zpXY9YdqGP*k>D{i>|q|`iUTw3KE6jkV`XG1_iHjuRqe*>#=Syw2@*uP3c7~~gE)|a zArJ+hG(_R^bT33JNy37Cao}8f#Zm@T`OHs&H`@N(*92cd9vMkNB6uo(16U-P2UwPD zOC&(STfju)G0xVkGq&&GnIJGgQ5#b>bM#VRjyJCFkMFEmdy?gRVUhazRl?vr3>ap?Rz$q;P zYolAOed&zJj+HxI4pc}v-)3vI@uBUS|E8~ZX@~ZC2n}>iL$)LK*Gws6O~HA5zWpk~ zKoNer76d8@Xb?$_x0=HsAh3E7RaZ%ZO;^0cU=dxXfE-W71s8RVmL5#G^@yBXa~vAK zvs@^Paax=s_xOE3oQKkH|HN6^p?0NyUbeu`gPhP7;ddHiQ;0_Z){ypl(4i5|l&pOJ zgR_X@t&X_sm$$Y~+ZRO{^mi_lSJKsE%#GTBxI-MT_(LWcsLVCOpxkPpzuXi6Fy5um zV&##7+e(sWhb;$3T-XG?M9ETzW&${`UP4XYsg_5_Y8;aJNi(^V-_1Qn#Z{X3`3
!Z z2=Tw+X_f?5jrvJY{^|@6_5PFGh>d^z0pP2a_36N)pibmPaStC!*c;jAw_!-kU#J0u zTmG`#Uu7+5lF;tfxM^sOj;LyT0Q!6wKa1rTRs|61Umr*kVSe@hTK-U|^Kh@euRIu- zw%fPqsd9+s`sjVCQrNtKjIdmt^fxq|J^mp>i6aGcj*QIv)hC&~i(EU21{-O{%x6HE zf&@CN^0@iG03|5};=K+KRN2_j!})QhIqU8{=_@A}|3>l`g#Pzi@w!Z115vTg^nZ7| zRj>mZQ_;Qr^-^DW2qZm>fz-pF^cBr-#QpoPBHm%Y`t^%sXo>s=_}@)4zZ*GRodFT> zYCn8wUwDcV<*;fwsScI~10gbV_h6pqIX-j+kXSQ(yq zhajtD?zOka`IVnxw_NNWlY0&h61@@PiusLoxPNn(Op>#4ze}A!mJI%8B+-2uf~8?{ z7NU;dbqO14TJQO*F7mV%bowKr+u}@9*Pcj0$`WtD)&o)5zgGTFRD`eA8`~^&@T!r zCsz(HEPUt=>yh?#ys7fBf#UkKZN^kvrTYLEvbFFIc*5GFqGBJ*wOG1TcS9DQQe5tK zzX;=RjJE*p5`6?U9K?`NNBuEO27>kDtFfN8cpif&|lHD6q%K6A7X-EP-T*H zVuIpH5dW0f|Lsm62sbu1h|U#m$RrPvr-xO(` zeF^j3W_Zc~Q{LfaTPVT7f_z`#Ele3V!-jk;s!^!1lMe(j-nvRjk8L7u=vqdFPnR72$C{hq;(?HSq8hOI5g2nL1K*5 zmS*V^5g11%#;0|lfDM8A{n61;1_8U&YangC-Cxw!D{fcfepWA7<|?;G4;t88W~T-9z1K6n+~0R6wdmbLB>-L#Ex_O=>BJ_n;7vwTC7E4?C4i3bl6kS z!9=}0CqG~I)y3(JKu}{^xb>LN^tXewTQ^LW#jy=h)79%lD|G~^8h-35Hs?VhVZOcK z6PR*IxIfON@`l5na;=_lpOW(fA z`j}xCnFdIDKV$qrv<2q+fc-9yftO92?Q@M3I>uz`6D6rx9^~cTc*887@MDw5$mGK7 z{No{?$EcQh)sSPaU%Rw7Gug4V!cUue25wLXT|V3sbpgz71?q!ndBhHo)SQRXb8dRC{KG+ zJ3ebGVfoN|+c;26DqtWsGvY^o)JzDHc(`2bHDp6~% zm@f|esk_?OZ*C=PH92`)aCp)=CtM#X;>-lh)u&&6_Wf3TbmGIWv2b9^8$)!j&Xf9{ z^K9@yCXozbFp)mV_v@;2MG?Mp&I@yk)MytAHcdxZgwp*0NkX&hG0typ!_4l>>sB!( z%729twJzHk4vSPJ?Wbi{15acq*GJD(^&LL+s)5ghim#6 zLceT1xs^rL@Z}y**(|^E==%lT*qKvI@;4Uh0WD3oB^W&7YlqS^5z3MrWccwZ_VnOL z-*@x--t(_T34l2n<>qZk1fr43)l`?rPQw!KVlt6}1nGB2ByC7+qif0TF=PHSEQr*^ z&`+w)AD8kJy3!aeyK|BL$0ZEPD<(|*7P+G|z7s7Z^_US-bzR26i$aC4h)-~Qz>yUv zLyQLN9%hb96mq7u$iJv4ynrG?r`wDR5#B7xKH}pa%=qbsER4d(R zhauyqJS6>_@1(Y$R5ZW@S`ufZeK^dhADZ*%IL1u&C`uTF1Z&Gu{BTjBj9-x9Xi1do z=&?PGDX7#Gq`^chDKB(%LI#BUGk&51q_m@e(Vy6%>$AV1d;vixVt27*%l{d$qM$r? zy;P}u$TWm&v^^0|D#LVx1w~bltTT#&NiRvVl0$x21mF&Ssh>1e84J^`FQ5*Si+IBr ze|UpiZ$9TGwhZM{pDo$gpQIG|z6a64?i!%FE+q8Rz#;s7nD5Pv#&~M%>QX5 z7FYcShL@WksAl;}6D=vv;tnQ`MC|&4BUJQjdIYEY7f)<7{#75FFA!fkW#^B+@r&_ge*cYAGa~c!M=rpp{b8&Au)9qIP9_eN zyr*2er+B=3WV{2|M{YMRRn2x+6y`S#!v6+u;=6@~g#<7lk!@btrI&l zwiY#o9;N8~NNMSQB<_dbBGhZuAHh7d|2k@CD4TrGIaykpqJHg_TCO5)&6mxO34+d_ z#*3BVPH(ph-NgZX*C+-u8FV_n|4^{EjJj6WSnvAIjKLW zgiRR%O(YCZ18@S8fmxO~sX9Q(Jor7{saU!OvQN>ibJy+4zv^F196nd7DM&uZomI00 zsF1sRmj+WD@ooNiB82<4<1+H!i53COK3%#C$=gJQsKNviXb%3ci0>r{1V4Y1IHuKqimjkFBK0r=bSl{abLe0**N*!airQ(kGx`G$Z7?0fY9X!hT zZ{H8<%ef}!C&q3id6K1p{%RN8Kaj)w@Z?spT;84w^X{syE0@0(hkw$hFV>jj^a~Ao z?sNfTa(jAN#(2=zSUJN|?(VW6qZ*sT^LWJEon)br#V1rKa@p^j4I3Q~C_`4xuS!Y| z-NAqbaK50u>S5#kNB@Cys;~%`(-;G`fUTN@YV!v$WhL?f2>pgRCp-)H5xM@&fj%@m zt_Jefgd}pcRbf}x=K!9%KehDC_yuRphbxGLuzS}nA;3xBJ`HEGx)-rXkoJ6r{yyI@PCA5rqKwmD~`6IwQ-J!pt3g2`e1pq3)Qc>TI7d zDMyJYa&FNZw|sC$iB#4nF(I;*-EGw^J<-K{=im1Qq}RQQviB=HaA8 zIJ?2$Z$#)Pmb+ri&aPRq$&x+Mmq;EKZyi#S4`*WE+BU^8sVlJFc*^80tv8vlC#O&m z)lxxl9L8K1jDNDn9wsOA&97LFg)J|*>5~>LV&nW*XJ0=y`F~`zk&TTl|4j)24w|^w zQNYz$Bn7(ofWx3sJrvn9E&48dLgou+jf)fGvNxxt{^%c z_jw!l6)}k@U`>0+5NDEcyfhl{6#6oDNLFRTJ$LyN0JW?x|GVAnK44z^VPu`HB3v4Ah z`6Od&1f(@9ZB`Fv$GceLitTsrNrZ;*vtz!LP499e?(*$Ij{Kv6)Zr>dH73 zKv!3b%V1?&Tb^ScUKYD4a|$#yz?N5CZKQHUm-FvhfPdrl_N$8@UFL-fyjlOcp?jus zbNtG+kokS{A5kYA%=Q_R@4Pd+F!ftjKBqXehHVK zhKC;qn81)8|5;asmjz46VWgT(tX3pc_~6%6(DOa{(&{y89oGD1GHB(QJ>R8O~= zY!aDd!U}ZxzzLnsVo8tbGs{j5YoSy?n9vd}A*{{xFp?|sFw_wX2`{iQI$Mn+t_-g? zj6YKbq3-dA+!-ag^OF>jL(`!V2r7Yoriuc}B-LGTmD!+%)7VvBv$G1|*r1}>aJ7z? zM4kuyp%TZ03I80oahtV%4(#%N$y8p^oQ`@GyjkVbLi7>Sd(4MK%um^ts%VMt2K`^* zFZYtvR(|HPGL=0Dyj?UGeA}p!p^PnXAb=q-A@G~!QYAN#2t^-};co!!qpykmCp#KZ z-w|KM<&{Jt{}MryB=Y=-6W6rP23Ugpgw0)d$TOdMmA0f7kQRID36q3T{3Xw^`j>u5 zgL*$nASmX1B7~)jmG{NvPkQ|QFBa~xyQ`02tEvp7mmGLt#H4~yb;+@=nCemY0-Bk` zKj4Ka1G+~SSe)|u;t2jX>6DhfWaskpkhn9}4`jZn&d06R4B#-HTvOEpbn@LqAuF{{u>?!`&bQ{^vKQK1`Z7&)PPa_I)>Cfw}jXY{~N>s z4di1^Hy;^DRVp<}_; zSoSX@*u$=_B`#VO@guA;1Ysn6gF=f!1B*{JL*E-GD8G~WOR_U3xakq|=^j1la)R5EPOlq(BB z9u(1!SGqw$NRIIFdu*SP@bD9W4TjyakNE!&jIq=u8}L5KZHgJ*78utkQ0!Cx#4<_4 z@`lz+IFvGN@-NNYzE|0GY+{;|nqO;2uTwD92de*n(;u(_3cGJQCE4`t3wJiJELlww zM)b_tE9KG}kr2U^J%BLQ*Vngy%M2#CoIgLuUt1Fl5$XFP8>e5xb?iioh;v*?I!`51 zK<>q4Q3#uw^$7t)8~Ar38e$=T>JNEcdnjW{v_g2QgM=sVGfyRhdY{ME($yFYL&{t+ z04e6m{?dg}!#vrZnO4pM1IvSmL}?-br`$zbCV8eLt=kREnxWR-P;anzAE5f*zp9=A%o7mQGw(g!1 z+pzbj;1CiW?tpU+g{wsW&hL1rzyB1lR|d{r^i&M?P_Phy84n(!zHxpWmp}U0;gSWd z>O_pi`>9Ym)=qS5C-*-nwdaGrQsXv#1XOS$9J%D#n8bzi7DRx(w00$spgWUL<_rN1 zrGqj(^Z}vlhyv!^X@&~j4vv~jHB~Y)GRjVWIO${)V6+#QS^R@Atmn`u|yH)?zK?%sywIv+wJ^ zuIs)xixTwpL9ivVuh<3yt+t0b6RLj~wjZ+;{{hD+X6I>M;JhSQdnUm;`E`qH?Iz;m zf?r7>-Ov}|zBFD>W=iijmCI6EMQj%cj@ek`ph9*%GOf=Z8Io^%EYYWay+Iy&=}%Ua z0X_;!vv+Pb|3Y4&U1~Tmx&#_o>TiSW1`ERdMG)ZldqgI6N5)}+R&aDiir3oiY5YrP zI!#WbEFC_5+TCxWlJY|WD>{BEvTD>veYXzK+w)S7Gig)c*mmDfZbE(>Gn;1^1ptX| z{3D}Q1(p2b3vVG$u+rzopmV@G7fr@CgtefKG?^lf3U%}RMEHn@Hcnze#Yf^l3IJ^b ztJ%y*zRRsm`~BYENfMygiBf@J=vaVS{{c^e6!QPYlYFaQ`b_`2+p+r>OTvz+4|&kWeeIjQ! zMruH*(NB>rmKp`J0N4h2=Umh1xc(b?d`BscoQ}Q^_eY&jWDE+){aJNm4|zv4S?ujx zdFV4s5S^iY=`G61f!SHbXqXaAOYnl`)m@_c!mlScyCN8(?lW9>oWyGqems7EC9~~i zJ92K#?Cu-2Z0DF@+X`4hMX`L`Bf|!@(Q%rAKoGah&P?yRPHLUR-WjMfMEIUKv9{lCH zvW4NmTyV#a;cWwfK>wwaH%QxHCiS}v1len==E&TKtZ$WXQ4%niW;|+r1WXj!*Jxkstu`1;=8oaMWDuQJkc{2lxgO0de+MdyTX36ca)?-bmLz44Qw0VY1iMN2wN z7WS0xWlGcKtcOO>r?X|%Dd9h>vfpu1s%2$7`9yT*oVu|(T+4| z)7>C^AZ@IY2afC(ZVx4 z`vlC|*ViZjyLjmd9?ZRe{M}Vfzs7a~MDWl68rgO!hy;nx$;K<#4K7so5j@-N?)aMs z3#8MsqMUooQ3uF%L6B%Pj&NJvMU;MG9+Gbk7r`f4a)tA|%9UjY zdi*6?`Q1g&6)6pRw(Wv9&x0Rcpv99iz2>2kUQu`-@=~wD@n9VZ(!-HT7c8pQmN+1{ zk-~}PpkzUse072ji|~6J@7UlaYc6cGLPH<6x3$Mqbe}#IL)MCw?kU>Q<4%J00RlmR zz+@~L2Ke&IO8L&iPIM*^D!A?tBi^9JC#7)WP%iQLksMXvUQ})jf6aye+qaZ$Dn%9t zriiNbv_Q*vBU^s+XENR#Va24jaA5vW%qXmnal4v9u*8ny1x<3?$W+T|$}Y^$L3B7E zH}HQ+&(&f&pB4O9*}0@N+0F+^4XK2PKw>8y_d*nw^_gUVm-ut;7R#1C0tDT-Z{UUZ zIX2f(QQ4|~B{50T0-*3J)+xg$>D{0^n?4#@Z36~qC}g}pS;Jjy$nW1t9wH;6KKe|W zI7+4zNiH3TAV5Hd7%m7<(Mgz7KfSYE9c;K=Rp^9EqBC0ky_cE(F^R_qmhA-dU3Lpx zoID2Xk4$h?p@=LDnE9gYFQT8g7C2w@X>8IJNZAdtr#Qe3UR#rt9-%^DECg^55d}cq z6Dl4tIF6wA|C8wacX6Vtt1m-;^tv3dXA5tHmH<&O3ipu%5N32q&g?{GV3y=V^hxiv zK8Ln$S7#`T#1z;;K5a7WDW`^v1a<*fkz~%ljo&+zZt~^&71v~SSy)vRVw0ht+mWLF z7IIDFw=}{5-x4Od3*enPCain*K7ShXZDq3M!=^9S>$HWU-ojNZ0MUKk=R@uc^!ec6 zVBH&dm9eaGOKh~rYedDxmQkZbxysgPc=wvp!lUY%Z(=aevVn19M~x&S(U{8bB@Tzo z%Uz2gAsr^uozlm*2)HkWX!M}HH}}d+VZeah+9|sj-{?Gx2EOAO%ifci+H(Bm+Nt59@`W|O&+u8u)DC2#+M?J(J>ekIX&_^5J z!Z`CUGWcuqa~}_$*SU{}gdRUu`tQ+tMk>K`;gTvAthv2IH&lYJb8R55yUyryOYED} zdJU5sCo5vG?j{A$Oi23YxeSBr-&lC=9hv@S(Ftl*7$ZMO!hydRcplbfL!=;Pm`-fl zpYBdGP3mP6FdqF??q&RsOua^7KSQ~O9(aep@_>c>Zx*D#C?jCya_hc42LJ#{BKt|~ zH(v($#ggOtFXPW|uZnBB0+plhzQLmIADu1E#S+N=pCU#?I<}kUwR8o#=*Dfpo@nN4 z`!1$<;C8)Y@A#Z0ztvsVJGY#ZD!ZtzY_c`i7SC%Pvq5rRU5tg|K@yPe{AY~?Gb6F^KAnLQ1pMHAS0@Nd)=o#=Nzd>MS(i6gX&hK^3+_o%C#m;-lI z+6g{-nxaG9A={t{o*?|eib^(0iMQ>X3e62X_dH1b*v$Xsc@Usd`~Dk6An_Fcq!2nv zMZaA~m=9M53M|7q-$26ps891~b5*YCgUJX-*4?6O5V*IY!`%vC#;5!ZBKde}NL~CHc99nX2 z5nO9JZ6ioX%O&^241{Vx`gb@Q1U^ia(cueDV}0JpYI|9c@=$4*2Os}{9hh+c6L9*= z8jZ@-z?0j)xml7Vxj?T@d#&@=Zf^*TyRoo?=0nGT8~cxZPC%vZzg~h5S!>2OEx<0d$_h+RR1?* zp&exU7MPT0<)5(ENnG154nesTj)@HU@q*akonD)|6RzV0ywd1$&9G9KtF zEo}1%NLHkFVPn4t_PYhFR=cRyoxjMyK&YwwD<@M|S3!ZWgC%j_=iG5PFZ`vQNIzqvC&9 z53=GE5Z^8)=Di-+Nnxx(J+0N+Qcz3v1^uuDri=>qvL8!%fwu7ATw##H2^F9BM%{RV z?S=uT`N} zmC7E{MTJtYggD`|?FdDgr^ zsVT&(bguh(S{hUMbVn^0=v=t!EBScXgF`;Dtky^%IaDYW!FX!U=zZx1zA6`h>3>OB zR9GtkEm~)=wDL*d7y`3zR>>x0+MQ!cRS1Go>w2^=ojQD#K4!Rqm~io#0F%DS(Al9W zClY<%Ia36NYhsS<@}u%TBv9>)58T0ET8sTuGUIH}&y-WuGp&+1E5Dv9PPE096V_7N zEw_JPVmZsy4R}%}Yl5X;*(41g=$d8-89yxQFvYzXy6-$1)pGY%a|%c)FW#v7Nn>6j zJEt)LypfjU1YB*{MiZtIDFQy%dfIs-^vRDUdnHovR^f$9%HqL@r(7DOb(C(LG!J$$ zh|Svd^wG~AesKI`PIBal>u%YSnAL?xo_FEa zI`y~sZrgaamY8*Hkx`rJQ7}Zw<-l|k7FM18EAdK(@{5Ud%H}o=^%%`qWR>W%%Cuo93gWR>iWGRK3#!Hb`>9* zOdp>>b~}gjdO}LdMXqp;9M4QVvB__kO4YK)8#ewT>naTSNzSLTpN0-<(-nq!Czwd6 zM0lWcI1ZvaV~-wh02;w{gaXm+)5|$c>gTV?|zebJe~3vJHBANKuky9ockne4#Z` zv@{ypw@dd3lYDzRR$*mK3hABI~*%xVA>@8Jt<^Gz9QrRf4e37B&N znVdcMOgkZCzdOfNKi}LYqvxBj5B9~z{RU@**^(6cq1Z>%vulY%g!O$JV-lTz@EiRI z7zf<#(3d^h7n^FMZMlYU(Q@q3?iFF=rYq8!6z31HX7vch3IE_DZ%*^P!)0#JAY_|o zjlT#y5PUdI@7d1NaujO(bjvZlTYb+CH9A*3rRAUh%?mQ0IP_H~H$FWqEZbVpeU+4v ziHVz=+jnb=o|J;3CA}qxTUa>cd(-ogN;_))#}n~~iobldYs?<$-CoJ@b;Az57D+;n zg}o~M23(j0o#Xt}tNoaESfAY2+H4WwP_Fy5mQ5y=kl7KDZdfE@vmQGy%Fl;OH9s~Ynds=gI$*=B z$iPh?qo9!fgbNe(?T)$eaU{LFamM(rfh{HCt1ABm4VGN+%;_40U`{S?1`GFsbBtx@ zsw68R9J+|pUi2`r+qoq24nOfOg+7Uhecw?w9sH$f`ziV-uWAlV`qdsIR&=5#mq-Gk z?{AhK4WD_H9(z=zeUPR!GDz8wrK7t~@#~gK2jOLEzPpN+&?Za6(@^{j%-iS2N3_lb z19ubjLC^Gl7Ilru?Kq3G4WT;$95>fyF^yy3&f#y+9VW+qdjarMlr<}vfF(8dnh<}6 zSV*3<`h%sC(-o>!Hk-tm9U|U$nWLDuFH4i@+SVUwZB0d9{v?vYurBs4x7zNO-pC2) zpk(cFVpp4zj?FNDo!-5)1hFZ1r-{6T}rMQX>f6JC6s_34RO5L}Ks7o_>78 zCIMF^@_7wfL_QGqEFH#&Cf)|~r7j~#;G6MrowljIYA-+Un(XKOLiJgf8~FHH-x6&L z0jb%^D-BT>ckRQ35qp`0!Rql5KQ_iF)#5}Xw*r{kFvA?CKt=1FMbhozsPACS849wj zyW&{=%tf%FYG9Rem%8C$k_w}?i|a{0?9~l~YmRB#HJHpmoJQMToM%pd>m<$B&k_H>&Zglf8a(FD15sWWM1Q87ToitP?b30?cfTbs&&geW5nxx?Ev8+V+>o zc;Ig{ihQ*08Wdh=<5_8=I#%-+P+`uXyU8%m*{c$0B^DprlW3ddnmvvo(tSF^7?=Cd z6+-`3B(6nQ(I}?8qfAWpD(A?H?LtsRKaF9f%M8EArPj`KzrDF1gOFwFN7nvcK5qGp zVenXGFHgohqIFfej3N8^Z~+Te_(A7%Ek&=ytB&o+g{_H9H_^T4qA6ZqSq56PW)p%c z=1`vwyvJ=~Mjmo2YmekU0hNoI>~^^(7CO|iP}1V@V=DPCEbd2#QY+tspmQ^~jQEY= z+daMd9QmRECi3!1q4igDWIVdob${4C`pYA|UOw1h;}V{9mA#dA@tjfq$O;Cg?B_Qp z2}RuwQe+X5X}4UbBJ3A2@uz*aTo>)M5HYmx=JWL)_ae``(9z(u2 z9A`fmc%?`xJ;?%9Z@1ZBWi36Q@MK%vNc(=nQF5$%T_Gt?2|swZj42p}cpqwTG$lf5 zkMaTPO8xQqeM}*%%oFRns>*=R^*&>DZh;(&1`H4&!nS$9vyosn1m4$xKe90?0 zb{zwIJa7{TJ-_FXxW>D3Nm3pGi4An59)OaoYIYy zj4~i|ciNb{^Pj#sTriYEpq|}j;-juPP;a}yzN%I+g{9|WB z%Fc-T>2BWA=xFFVrATo>&DF}s8%lo$0!IS?7M1{5n5rmM$#z8NDa;bju4z58kd@VU zb}}`Wbx@!H@6u1(X)pv?=wZZdmfqc>)rM)lX@0G2@1dauWFWxW1(+WE$a0cgj21s) z8*d;JuVmM#`9ywh|NW;{-$Hb-U@2}^w)v6^tMe>9H>bm}I0Yr#AOqkJ6*9ZZKXvQn zd-2dO5q>cVPfH+sL7qM^_6P4$Fj2ly!w*WPWdL|{nI8?32+P^<;jCA$cRB$@^Ljaa zK`#d4{`l|g!=QT)r(Sw@B=rP2*+~Q7fbr zZHVL9tB;abA~#y!0!*~1TajZ+{>(C*4E16i$sf0TUii+tPEZ{Kd?NdPk?em}V)OY-gJj95J;TNMG?0XN}6XvrATv!FY00;tD zD2vrqt$`rN>9R!a{P)4}iN~nOPA%c*UdMr9-mPL`VuHVo6`HGQONvd&tS)o;3gY0) z!_>+i(=7apj3;NhZNVQhl{0>O$4pRC@GayjLO*ro0mVjzFO?KDsK8r|`Th^n^_G5d7q%GGqu z_tJbkzV4~d=xU^`?0S*czABeGEJ_XzR?v%m2VQKIT`(g&{QQB5lnB>L2@Fh8CDIAL zO-)hNLxS+mI8~0qZy$ok;xnXNE@7!I>iFjAjS~{(4cyatJbH<@|KQEHHKmse!ad5G zj6EeWyRN$wpe!k~w(_~v`hc@4sfo*}E^Th`jVdm9dTi9>^ZK>uY2~K1%bzHx_9M1D z1qkp}$13zY0bT>Mx&R)k+%GFlk`^WS9|2lR(=ABnwbui1NJ1@}HnJ2H#8{O>^41SR zOV9R_GNec%cI_{7-9uE%e#Yo!dN+O}<>N<$|4oX1sykoO-?9LmT!G8;bGo(PuvTAw zS}qZaQ+i)vzGu8&$9#y}+2qB}lDAILN&Hj-V_)a9is+;%*zrW&IXF;{y< zjmQmYP<(1x0?@}3*;~P~G$ZHOL+aytllETrYK>%2o=r@&Kp|3Ne-glXYt_P$=AR)y z+jBFG2*GyPOxop14_}@x7kR_s@@x)EJ%q>+C*JgOE@84+w~;hLUW$yTYc>%o^RB&Y zDnw|qLnO&)!g?3?DAI^u334M}r1o?P+I0<9t6nk(IG|sB9h!^u_L9;UP)p8y4JBsKkF7 zf6}DLp*p$=h#wb@pz_4}Tegvw9##-~WUJe7S4pHDI&T3X;ub0MJQ;)8tQ9%|c!Fm4 zEJj@J;`Wql+jGjSjW3e*f5F^?;H%n>R5O@Gwq~!QfdAP?jJ$GPny3Uv03IE;wevLl z$A?MO;w0es%AANe9MW&K+dOettQ)wnstD|UcWeJE8GK~sNZwlzRs&F4Qu#=17_N$z zDS^E#m08MvM8aAj?B^HFYwfeZT9%{|NPiu2-yZ#y8y;wr(fdIlvtD}D-2kcA={Km4 z`?Rs;9BxQkG68s<3o;h3qrKPZ-L)>}VQT>&+-i*jpduciulDgk+%0)6aq^vsH?S1hr^QR3tLs9Ygb%##R& zO;*&$`*=okV!Pbs&D7M>L68FUZ59i_6Sf1n*HyATIwDXDx-REstLE#bS+H|@KSrJ3 zay5DcV9%>5!kD6b*F>Gs<0-FN;GvZTJ>$9R%LAMFfno11k>YJE{~LM!BjV74ka^tN z1^5-v8iHOTDfOx8AZC^{iFt5y2?m2)XvBbA@~m)j2{|1wRWH7}`k=q8jAT;esj;35 z-s8!sR(?wmLwBR!nSwF#1&?}=p~_-@p2);wWimq?K8i5ZwbCe0h2V;M1?nn_|lCLks|yv#4{rmimJY9OMQq zuh1)9N1+rZ$>;#)Qm+dZvV9*i+;!3Z7lg)CDj-?Yn0GYRR~Xqz*%546C5@hZ0Tn{{vr3B3U6dRQcN)5r)ZE~R)_f4?dmkE*ra z>!|q2eEXoC)UWGN26YW|m&imvQ1pr)n}~Xyd2A(r&jLRDWYPo^$jfgk3ri(txx>f^ z-MR>n!`s+kGAXCD_HA-K|8;Ngw~0(S!z%uf;AzR`dXddJN*gYsJ^BpCU_i3<2ZJSL z0&IAI{J&-)ddGQ45TeB>9C5=-(5rIp7`tGgtgncZX4!$gO+;+%no5#EVSsl|4h0_{ zF}9ML^5KSEjX(6pjT;sav#Zb)6$^ZTQy{VT!7;+a3;*-UVFJ9(z)x1ml~ZXtOHg9C z-k?BeE-O|#0kAaS>is0!v0=o-#M}+V!5~L(DhEx!Ia{9jI*8{z#3yn+BSRqx0vW}E z{~wUV=e*D=flo)R^%b7qWIANM;w~57xt#ZSI;Y82ht+%rwO7Pf2OVtK`ZNJRq+7{= z9-2Eg2enV_b`Kw7^NGN>(4q1mMg&38o1UFE4_*ficaFzZZ!jMK16K4jD6vl|3)n3MD{LZ0I~s^oBu1z@s(t8 ziud`LF&CW(|B4~*V@|8}&32ct#Tq~ze%{@6F^DcuS$KO?DRTwtT6;CesqFv&kMyu< zzk!AM)OTvyt9rUEQCFKP4v-H_&I`guMWBP7q`G-LHlEGM@wAX7~L zqC!k*VKi^^cIV2jQ0fo@7qPU@MJhlJYJXlyt^xkbiG4DE4Kk493dZ$wNH zJ;N`yB+TmCqex09a~B>=qivc|#NH+r*C+}9S_VEw3^VhfMf19?txTAcaLnGw{xrL= z#)BJS-rEK_&GRpUA?&{iK4xlBs{m+dJy$z)8UuFdvWEM%3sVe0rVlqAG{h{BY~*;ZHkvfyPTZjnSaD#hQ> z$QMixvpS5)+s`%@bS_te(CY?C6C=gUQOa>ZId6sGV85v7=F zN1^;LKNxg8M8~D2$#j@{Y78U1Jn7S{vs4(H?vnLF$gt$--z+GvU;P?RCm4H zF4a;-i}gIm_oatHO29nsMuw&7zPo%WK}d^+M?fGl%Z3PW-?Yxa7a@vlsA_=|`9s%* z&Aw1;M&#D<{e=bbiux-HGGh0SEC`JrC^iDFElr5f)O9Gd&+c_=oHr43f3jf|98B z`AgTBqmcsnpMGR53x=^=u^7%e+8k9REyc+yd^49iwhCX(EkRd}>!{2O`XOYKV6W2&KF5%SrYKZ*FK@ zI5P^S7)YuOwPR%dkEjhBJCnU^7xy$*9Mb6%DrZitbAaNvtt|KOCqMzYNh>N}Bd6L8 zggQ=fwS!W)jge^7%8bmqphzl(;xVH2?L&aYF?#tCxPfm`vxkji@>Vw-rstykGfOPb z+eda?$5%Z9Wa0TGR#|dhxpGyNyb7mA9&Ks5oWkp*rf+;WD7lWs{poIoM+fdhK?weef>Grp%9F!nszxN)<21LxE%^y-20fu5eja^%P;!YZiM(~S4#fkx zJ{qsU8LxOG?c*a+VK1E}eKg;iiSVd;8eJnHO4h_GRaL5oOXeTil;G zyVASaD<}NG{wQc*hdZI{oE$WXwZ4TA)JY>avINDj390d-Ai1bOqO?8=~0nKGg z690CYvqj*_bWpF6qxy;f{Vysb?qMJlA6(8vxFz)|S4#a^-M-SnXaDptF&Oh3{iP=W zbG^Vv+>NyM*1?5=4&A~R8Y6o|!yC@xm@a|oSywP|UsCqQ!kYHNuRlAYbnVicN;>>h z<#|WLI4w!JhEj%10}vKhfSOXsGIyeT@q<2YNS+7`M_QWp&BNO~tvmODa`!d(-Sq zj1}efCGVA8C55p)Wbry@ipijH>mS^PldC@Am<`OW0jdccIy_qHo zpHcSq)OMTRxpg8=Lzls8&iOA?on|V}^Sf1jb`#6;$)qKCi3#maNzu^HW{F0xq!Unk zKcL$a=cKq93aYhN?C(*x9aC~PCl5Or&$owya#YaP4bFe(i&!%0xsQ#Yu&#d9Vh$ve0(E4fWF9PrHL_!+vH0_^W-x392anx z7r>8dGA^)RKR)0qB)jv)i+-Yc-4Uot<9AS0C`h?bLZ!!(LyoqCgr~2^6~O>)3qM@3 z>>c7hnqad~^3hyb-81sLTJMQ_>a^*SiTo62Qsq#4zkg~Gk70E>G`A6z$dstYsrGPY zQmImSb;yq+CoSP!ekyG~Jy1m8yMi`MV|X+k{AGDKL`>B;Fk_{#=e-sg^b^SGGvyst&uWeBse})o|r@db|Pz`RFe{3ck71#D{zrPY)-ftkD zUl;CmP#MruT(PRYBtuvZe~vK95`^i6I{PKgTZrl%GmZ?DGfgT3H~b);u}9mbKt z5P6R3TY%&KSB1FpHCqtWXup}no|w;b?Z~Lj=yb{8;-2Vfjo{Hq+)O=1PgBEG9m%l1 zqoQl_0Tf&LdbD(j=~aq*(qwkeN^0F@^kL0ouQ^+arD^ZIels2#JCjQh2pvQx58XS= zo|SQWctT0H#e0k1(&M9XR`1HcWF6CkU&#%AUDs?OdpX@%Q)H3pNc1^Y=M(MABZ!gG^ji=EaX1J%*x%HV3 zmeE5(1zL{8)&fz^%d{@g&qH;b9~YJsec$4$yYmqI8Wv2jG+nIq=J!`NemR zRN}q>_powQo2yqyks<0)gE;86R1wi@+sLJEcaE&Eijj7mB- zXeC45AtdOCY`O&pp$Nb+AV@(ETW#>ZDtoP{=O!1-%}qC8Xn8MciM`+OzM?mEFufJE zdr|-Rh$Q`KMPRSz0#E;rJ8=(DBn@{^w1y~cKv`FLpIz4H+)kdATTjI@_ygI0u-X;5 zq)%sjO_~bu-d^DBv3k8!fuGeW#+TD?P0TrlOl~*ZAc=jXz(l}?{qQo$sqmX`$&Nt< zcJ%SOgiP=)MUQAsjhh0ZDrqYwK3;YYn&faohcGdH#uStGMAxMnlIjQZq#9T!h9$e( zvak~CAjLk3rXmxSzz^{pu)41RgK#5tA3bk}#c(@)ds97`QmyEq&kbDM{L9qiufmfL z$!eU;_0pFFK{v!an{k%AGk(4c8zusbGWaJX}MmIAv6Li|=Lgkd=uGf!t*IL@c zDbyRT{Q{(71}ME5Mb7^(1Pn0;x5sZU!2Qc|2o+P1XelTuWf&F#G}882jVM%JURz(k z*$)QTo3gSp!6$R*yQ`zG|0F8@P4hW{$z*|-!LY)PAhPO+|MEa2Y}mI-t@om z(Qk+iE?~#q;QGh-^zPtvL3 z|Hzv7GeJwCv>meVKy=Fg=K(IlsTlpjqqbP-a$Qlx?Hs8^5OGRidjw!=&Oo!2+nmM{nLc5$6?hfQUs zJVLJlcb2vpkBX$-f==XaMR|$hgl49G1b$%eIfhU1{EeK4H2zzl zr%1IHADr2$C-_z0?g;J6(qk3b2gi>}(Q-7GH#-f3mg+w8O=($%V93$+*@WUFaubbz zyxtHd@)iJUx$Y1AjeTLVgs$cPVb(Ys@m-t~irXIYT88L0UanrT=MW3^V=fIOown=GEPEFfLPW{(z zlz+lD7o82?^xC{i)MYiDSikQ2=u;d{qmd;IdJNcVV2|sB^Q2-<$EWG$=>}yF=lX1l!iV|3E%voQ*X7OfJXg47#?sNMc&X9`Wpq)T>c{X6*~(&`Y*nf>HsLG z$GZ?m@ehO;20aH~2@H2N`5YRmrZ^OigzxjvC)@U&awwQxp-*1EN~hBY76D&0*q}|h zF=<)x3_8>TqJGEdtPp4>$xrrzgN!@I`EXml2)SIo)T|0s;*`*~91O;9^0wZ*A-sdw zsmXuzxkBbkdDw2&PPN!=m87>eG0@Mw0^quynsEr*7CxCvcuc>_b@cqTen#nRdf1zF zeOy~UuX{sOy}O`redwQkFz@qB!{E$SBpJJF+hI#K0p}_U*pr3f%!>335}$k0Z}NiZ zvw{mZ+ExO!nCE=ftWc3KkQgHpV}KX!TbG*tEAeH6J>oU#7SIeA=yLA(W0SN7JVp zQkku=$*efX#Itn`SgJ`w=0k>6|na5 zi*-c{^DrMycUT$^TKatve`rhPhIF|umOr=S_VzjNEGFV1y%Iu(s3K{^LFXExYdl?M zJ!R$q`e$kBIzDBJ7cH&as=d?@e@&7{8FHu7u%&b??lbbK;%&Xj0PoAG5(Q{`gh{e; zvhS_z%o5d~7qYxS0KmkQW?zK7t~+JDNDexe?7HTI4L#IRC?(cTlht4;ZXnL8ybTZL zAmr$jHk-fw^%U3UC+(DvyqlnP_MNfzt5`?!@;y$s-Y2z(aRO~q4WN#Uy0FSG9$cqj zhn{-s>ddWKaku1wB?s?p>fHD85FTF9RUFtttx1>&d>L#D_sQ;k`yjaud6M5?24 zZR`E6^GL~1`IsJNSih{91ID$LB&)?L2fj2Y|dQv$VpH|6;>7UhOfo zD;w$=a~-ByGDnf{6Xv`}aCmQLA#WgR*X#7S_#H7;@I3mql`AtAQy&K$worwAy4j4J zav?I@vDMp}!%M*yCpdb}w3TNRE2he9qnHru4{fqmY4*Z~LCFx<>!YE*O}F7!9=EK2 zz5pm>S)((KAG*jJeFAu$lUc*BdEPShUZLbsg^+y)(9}Qjd^(v#Gsi&tKvo~D4Cb)Nc$uAhMr1E(l z9yM4hKG1FLni>n*_WoudxZxbvmOHGAY&%#?MckseN6)fhNJv`W&u(&L?(9x-xW?-< zE7kCucM6W`Dww~UAYZ>le4){|19v7wqHf~gOr-vRL;rhtrE50ZNj@}IYNWBlkmt81 zs4IcwS6i5PBoV&m^2nwA<&TLvG)np+$&OR4w9KqpVskdfcu!Ads2afJRv(()T0{jq}hyB(8RkD#@iOo3Q0dAoPzB4)uaHor3>i zBP*vDL(ileM~~2;uOqJW%tZ3yTx?uD0fpg_uKJZrS3>}#`>!p>*7IN?97M@;LcppF zOuU(zMVXqm@rjAeV0$TUUeRvjU!tZOaD|+keg8X4&@UDofMAd&;hKx4chhBOXRENp zf}_~d3i3aF$Nwn7-3IBBjREinn>2D^FXhoq6%j>seN*WRi;as-;(WjEccrCICD@bF z531TBTkC!2i^&oTys_l6m2Bpxz;x*co=5q6QrbB=p4+TeF~dlAAFd}&0r z!-200S-u};rM`3qW)~On=a=3SABpPveVyXnpgyxKl>AaRtXQmcw)l`TljzN`;mXEE ze0iZNTn=*UVofNw(v{022*pW+`_ltI>B<(>;V+Pb1!5dQe%x z%%YL=vUH;KvQ@_Ry{_?O#!t>ksrd>?W(;dvs{&F|39@c>u4X7pkK8msjw%>wxqYCa z-`S3PA?NTS+c*_j#Qv^4@|qB%QXRZLY9rf^5mNyZLMYRLkXZCv!1bUjWCzsHmuhjZ z7rN3sppOwQH876gU4e#%OImoFT>N5#1F8VjzzBivj3B=A10$3vZaKHJOIz!!XG~-1CiU_F_D5qq?!r{fLDWI5#@^;Kte-mj&9 zQ@ar>!~!9$4S1vsoSMiN>N!i>2tM(nK4#VTLtm#Ar>yU*4nP7@Kd@kKqx+_sAA;)3 z0*Q#93dTR_ZP*mRnY>fOs=%z-?bQ~-I|FL`^jFK9?+$>rs~yZumN zbRcuM?QPx@=HoGXKysq;R@9qrpBAQDK#XlhObnh_uptF-TMz-ux7B7ia7qPekBc?k z12CPe&J^m1dArUp8an0Zj=VQPEYYh%hSdK&Ofy9+SoF0H^AQ-mEnDL9YXI`X?hDIt zcLf3=Fhc9!U_3yogG3%l%Dtj2d~SaZUivzqYoyn_!AN2ftk-wT zmR~2;v8nE3*;ipz8BkaPVgD_s{TnT>4f`&en{B;P7KEebFkPX$;%;PD=0n$EUwlfE zoofG$2O1*5Lpt=lQQ@xFoz)27v4yjA@5U=qY!SJ>(L{mvCDX+hni{lAzTgvvy}5V9 zW0WuhffuV@DQ(Oy@wyD2?o$BAZ!$#l&9!;GeC*=Yf}hreMjw7xG(=9Z&4N7H6hbmn|VDJLX1(#qfi zi6RmE7^|Kct+h`7jR$mqAb-6q->;mCV9-`)G*8{JGFpCVm>6rHZlGmZk#Y^cH>U4*yH|r*95QlCy@xwC`&N zdiX#+`r4K@C>_d?{L*sDGM&_lJlmJ656-^WHo;Mg>xXp`sLZ3gjAEPMxLYnS&v^Fo zhi{EhJz*#0^&m_-8?!w{Ii6zw?}8%xckY%h=JS@ia1=>{DrymvmIfv@v(cf+m;aLw z`G0Xf|0;p`?fgNK0z&4G*sb|^QYyj4+s#vFYU|sR+LNyNw^#82&+}7Qv*IhTg*bN6 zHx@`-sQ-?!`7Owog6dNJj|-bu_t1=LN%kk6%&5DdQ4jdyo$?hslaCz7HNpgV;GG12 zs)?0_pg2^{H$~2OE%H*O=%tB$E)~x{Y*=AE_;WD}$aYi172%wV-#C3)PcK#dV0?nA zVw!D8h{iup0{tqSB8+7#IMcAE)Pp0Ctslb{zbs#qz0-{f@GM-Myb?GTDehd?ETE5wY{cM@TZi(k}`R8p5JrIEs zvu6RN6`z#U+S-cV-VtdGY$_lswSz!_xQaKoJ8swUcP1a|Qf{3FYj`hxeFc$z)l z=IO>ot<%f)ABfs(*J>K|8qo9|%=m#lVPgR!VVM}uIFauk;Y*2&Rq!8PXHx^|gxA!8 zEr!YqiAT?Rr?F}`JQ~0GT&&&3omrc{%yEQkzwGi%arz4XRB^XTcGt~L(;k);_!ZXO z2IEEo0tC2GR|b|4l6RX`7_I(y4D_p<54d$~B#`6?{XH7{6X^wb7Kg2W_u~4+?>;c4 z2ku8MzFqa>7-k#?jx%!-S2=VwA@jP^S+?Z%mk6~+3$2Z-S)bOW00oLZ-un5D8Mw@Z z_;}EnK_qI+9~ufkn$%kja5Sf+r~k!;4ZiMp_GICZdw614TRPiuOyt2b`}CEm<3~JU zZUdFi1U#`^=XY3>>%X2(N{qFMg~)0Y9i`fuW6L4Th5wD4dZJ9Aw%)YO8An4!VLMxK z@D&{kmr7600mI7xeigm{kN7;UG@@7ARQ`2wvx@@{E`t)N^|$Ycru6QAr!+NG4vajj z-!q~>m3PUu6v9yY7XZc^``-oY?Kw9OJi7b2scX9QCEBl<)td!!Q=HwbTGDHzXt-Q^ z+WYM6Ag7UHhy`8}vGIO^3rIN*^NCO(y0*8stCUHTDbtjFMHPGSa0x<+Sd9W_aV5UP z;GxWu#V^K7VQbAr;urNruRiTVOG>dV*#7-<#pCqu@yAph zFoDSV0`U3#x_#@_>-Li6>?gGc?N9U_<^}nuxFSOBNIUKbgv~1sN6v?X4-WY342RDP z6zYuwq;26xZ$U?lU6IoHDTfo(GyWtMg^5YxHs4JrIqM%UD$i!Rh=;p)ITHWDF)|jt zJ9k=>Rq4E}1b%~Z0iO>(GKksKWK(z5WXC_5 zQ|Wc?0mBLIwIdELBnl6Pu&(m~52v*@Xp_`k7kPrV?zKv-snP+JPT<)4daGaK4XN^z zm4|GM*n7hK?5H*SoMm)otCC7MJ7p@{uiFp{2TB4{)oe{!{2#8YkX#hM+*A*&SGG{q zeh#}dHE!~O(C;wb5I4DM^h!Ni*$>=`Z=bA3Rrr62#bc#+r(AH;r$Fx*FVgy+=s4x| z&2(OS1G%;S4%oVC$Zu$B9w%Jqllkp47ZC$hZo(?{xUce2q!DH!4<`NJs@!^D@0|8M zi(0nb7~SwR$r1j8S-E{#13I}vw~ld{t>%_vcgxdl{Gzo@hM}O=jlCQ+d}&P$x-a5N z^8uJ#z)GkKQX}tg$VjsmlKMcb!V_X|$Kz@HZGn`=FLFvk=?cIWi@(Ds6)Jn($9>zKL00lJXvCdu7Iw}wU$QeP) z)N;cJ^~lBYpfA$5W_9e^lGf)@yko2TIq#SwP4s_vtXBle#q7~^{$S{@rY^1aqkQzl zGP#s()Fs&Jjlt&OwJRTgUD^$LSndZ<#OF98Nmj0lgM}69`e}ozwfE6_Td&dR^WhT< zvbeLNpv~pvvti7i=(EVs_RZa_c&x&WISh*AIdV6;aSm*0^jYaNc6{f63i@^A<||gs z+RW#z7w_4p9#<7lx2({{*s?_}zqX-UZ9M!*FjBJIoBVKd$mTF6Uo2%U9k{}1X2t9A zmENmC=BZ=pFl6YapI1@N`P0KhGtJpkrI#Vu^v=Uvsv%Fo!I7jx=PjRF@5Gc_#DHg@E7q&4y2H+ZLRgjcO27!+f!~> zJswA&sx~KET!+8l8UImnXFB|vlY$kON2;;|2NqKS%UaVe2iw;qlzmreH^5UB4aY58 zD*9B~Ajt%L@pyErMdL#G8z>HvH}D@gNZDiF*Tzc(J5;S+5}?GZ<)|`GJ@AUzR1@Uz@I|70R6mVqSgv108vM4WPGPl&r4*Zq@?duK>iw}Q zap!*Wk_aTrE415<4%sI%%8r;KQ-=m)uLPYt5&7naG3IND#oO)T9QVXzxT}Co?QD$g zCp>+r{y*U<#yLFI1X^13MiV*cdx~)rh@evU8l)YBTCrR*b8hnY4E(Gqm;n}g)T{o} zLT~ceyUCJ@vzw3Y!8=fLMxhpG-mljrzMPAHHb~pq{Gop!PHK!GheJoizo_NrHF`U{ zQhbgDy2h!)I36`weZ1%}kFmR;<-p1RsqHKe;B5Dy&pmr5;UA#{J)_-_tDxn{^=~sQ(oESObqa4NKk;!=f0N+&mvOb#d z$9($d{*=+$6Qy&O%A53C-PC->TQ)LV-qXd|`5TqP1?B)~WSA0_Jl<3j%#g@R&3 zw14wN{WC;;*p<|bZS71m;@J|pG7B#!$5^`)kP9Et?sv|kVXof>DF4P!R|foaJ=cTz zf?3=nT38YUp>kBd=^ua{^3a z{6NmSJ^)XErF|P@ZGo5^1)uxvl#~<(YJqnidt3VB4Z)dc-%|=(0)$;@YBTXbuxgrI z4}qX^Axd;zxG%J~ee?hiDzsT9++Zv(5XyQu4j&&!dt9{MUx-w)_Bu|b`)@&1si#Kb z$o*BqBftFpI!X7n4)_lQmEa9hr29@%SNR6(A?dWNfM3W*czE|9aEbFArF~mi)QR%j zMmIk*b|(LpCWdsj9o15bT}XL= ze8}P{=Y~ZoK_!Ct7(T0^0A%H>qyVdxJ@^Y&{=+OpZJ7xSxz&FJDkdm+F z&}pV!?&lTg{yD&VS@q|#GQ#S*4JD+X09gY7IQ`4`aFp|D1pw4IolcwGQ-zlCSN(`$J&4O0Cj!ZNq(q-f`lde; zGgsu-BbXE%mN#$AYqyq+9>(QX7W-@rNbenhW?aF>0wm);YE-hm)r z&4CjjWml%@(C9zWmxx=b*Bi;J%gQ&u$nHHWTVvyomo00O*Q#qHDWk##Yv~vL-###PI&rsV*{Wk zjY{=w@+|@=-y%^RJ13()13SBq9B79bS$3Z2TbwZ^>2`(t^kPhDE%}i>gCxJ;4<*-s z8<+m{^$;}S2q6BfWbfG)8SFs80uG~3Ak^HZ2RndIgQxJS*q`~eq*Ct*?@ePk0razY zPB+o_Zi^ucUsg2zUUHjL>evoV!9Gb1v{Nw7?0BGO0p>uD|KZP>?dK8+e za_u{nO_(*svcw|ECv2k##bqyX3T+8xoD6;#dEqV!%MtdNlj_&#+Y zzQTQ^0cY;Wklugcj*PE=KDXi`@yrFyY^S2|$QgGq;STI$FJZb|$8?0b`&N>2GDF4W z2kWy5my7I8{UTyD z7Fe~4_wvS{TEa@T9OafBj|yzWqKgM4?oViR{fJWeMMT3_VNw~>`UxsEM@ z!=h?Q#hrS;1(!ojd_@iLu3MYX4=m}S#Jb;yYQb~lzQr9ULAKV3Q3n`cwjEZ~?PTdN zF|uQJF8OaqOKv(Wf;fE)gc>=tJ%k$-b#RrB?ud*My)Oc?%(I(_?R{lv3e%`1#X|B- zol#zFO>U@Qn}dgV7W)VnvAAEe(lsyWa&NHzn@of-6f}5fMXqO6KK+L8rB-1lhH<8G z(i>xB*kOQPSC>%k5IAtVkmZ$}auj&WU*!utDH59Yar~ch zK~Tf zUZqXKtL{m`TJq7T-;Em^K@-}Apmc$jJC8ctZeaGI9{Cd*(4(~PUuQ&o+?>qCK!Cp? zS%D51!9g*NDHgtOAwC_P`oIBdrAUrFXgCea=^x|eYK?)Ima<;ZOM`g?w?F0@6X}+e zRCr$L7nox;=$glva!LI8?b>?Jy7L#0lGC0`C_DJ(w&g`$bpV@-`)tHIhv*(yFefuP&TxEp=$F7 z95G0RxjTa4KI*&z&0CT{P%k`{C<_icpv`!h{+H1ENeKNNgX(t@;jT4w6Mb<~2 z?6BzVkf4I6RUTZ_t_!CvzbOSoqVO z@9Ipe%fA>){1oB61s!dIL0YR#vP}L{^$7%*G^jq2DzLMa~r>{yZg~x*&42bvLDZsVM+cAIRA6*=~`tKGfIl;>f+&W z$(3A1k*8crbdk7nr~--P^43|M88xM{jNn?wrnXt4e4rih*qCXc7Vxj8golV0y&tsb zyk}z3cEV`?$eQgU=bn5$n5$cAoT(IBnmA`Puw(rE{Hv3ir`u|?jz(dcrkp6=c~TbJ=z2t-NzzSAspC)o19d2pMmwt^Z?#X7uyw`vaMNweu# z^6l6x`k(0~<)H`=v2ujXD)<#{wMyHa1GYdreOZ4BnPPb-C%(4X2LfQfjV3ei0W$dq^>E0V`$?LJsW z(zE*LOvfg{|DQC%Mj3`KoAG$&Fvq*leP>d4ag>`RuWAokvIA# z3{PtCMWQndXmsJpbC2warAGVCbEI?_)wL%v)p+!}-OcGzuE7v%7>2< z$l7s6%ywRm0j^b(g#k$# z8%W;S5c^pCud6@!ZkA~>5KdFL!0@mlaG2()kcJPUlBbd~+65_JdLdN)dl`rVKIf5; z&&Q6&e}xeL85JsthPkn9xZPp89;oaI1r=!Q{P}L6ZUL7^R;Fk)iF}lPb0Gce#ORBj zTMR3mDc|MM6t|G&Z-|(`L@#O9E2JIN#sG;q&M(%?rMhN#i`=_;zxI4q51G`3GTIzC zuoRs%0G)t>NOgNZwg1QstSYXATlx8@`%oPkQ{UBygu=c&oTQpvYc-%X|X_z z4vI+%%Gwz;bdu4^tfODH7)-h4^Fym|>*8?$oyWm1s9Zs12B5xYhq?&Th$(zsDB`5n z#&&}0Q~iWHE8#N2_wOZdqKJ~3U6hSilWC@Aq9Q3T=w_bFk2$ZquKJ=5^;&Hx><+BI z{e;WaMA_MQwD7gz!MMfZ8VVX(9=#%HH>XgtR}QRCCH} zv13nBV(sTz!P+{3v>PKk;$Fb*C{z?j$uZG%=?(?$7@uypxal|O^oA7y)qEaJ>$78+ zI5DPip*GIv1SY=t4={0TPr61~4fic1VOxR&*%&i$Q$0njco?4N&kz@Q0ui;F8QHK| z?rq#%cB5S9uOoJsL|J`|xM3CQ)`n~){R0v6hN`eBNpzj{=O{fi7>a&pPZg&gy}*VD zb7NQSW`8$_U)o1mW5IXuMyIWHtQf`z(VUik_jS5_808!_^fG9o?@i))xa+qzU*Ws3 zcjAe;j1L3JzdriSwLXM^_AEmTk_solF5w=c(f8>xy_n>^-bRTmM>>o9mWz8&G(B4Q zN^b>VgP#R%oN_1Evbkd!{e75ZwZ{|PspO(5GWvvBuG-cN;qpdWCUPp|v$@vEug|+8 z4Hs7}LOXuoI*wJ%Pxc|W&&TwFa%CymzBJczLW*C-1UzE+=+O{%P`Dc&0$U9VD|q$u ziA=Ja>?^(eAAeN~o6xY0XGjJ$4Pc*`xt)^71bVs9?`|0v2bK);2h``78;Ms9^ZLJVg+;Hv8|>;s2>{L2FAVW9 z%e{5Qa7x>|d1y!gxHbSK>}hXg*;JEr8tZ#d(;Fn&Xo3`uT2WGw@*B4Rlj2s1;#XNm zxyBflBXL%jGVgDxV{=5Bu6?QM!pBLfKVcp?<8XOf!9K|dplL4g;Cn^&N}*#d! z^-7mp$=sS4e)|0%`dRIO!C84#l;CQct??LHL!X zdX%Te^Sz8Z!K77{znkaYfaLEPjC$=~T_N|vsakD&t+yb#wL!bwowDMf18P*|90XTZ zrVS&0M%NhnbJVP}xOM3JK@|P0(f(#7x2_mWO-;uilbAr-EOLG=Puu+M4FFlS1KY`n zRSapMwiToHly31vDBfz^1F1PM`#viSZ~Rz9^1k|XiInK^)Be>W*qPK3ee<~9>s0p( zVHZH7vdUgI!IHFdu0irT(UMk_0FiZ zv2hZ*$hd86zb$msScvak2tmZFC4cFiSv2EsW3MvbNUvgFHP0&Fbs@!CuS3JDSSx{v zTwc26%D0e)vgQIp-vG+|AJl|grdAUk5I79NKHj;dl;7rXi+?px&}qzv(rK(V-f0Y_a!etty0pDe|9$ihP|x~KrdS8x98>bW zNI(U^uSIH4+gf!&_O-X=uwc1^o73Ds3UCn|ZuuA9Ko(#2gUl13WyL^sjCx^7Q-B0` zN?w?RtZ&eoQT>DKumljVkwKE48I=YO^m!-#G0Zi4_RT=_Nq5M@etSmXr+5nz@`e78 z7jo$rL$2OX_UOB>{Yo zyd@}f8G%MSQMqQwgT`X6uePlg2TG**-CTn%w~7p?%m8%}Kv+qu`7?-VY1 ztBNtKuhe*uQBt;$lT!BldiLY+U~jX5+}dPtYw;pG78VwZF9hrQB~j9g&+$Ox#%ecC zKE5pWx;j2PBlYyQxQ^K_V|ym!qr(H&>3FA&-T8d;`QCiL!_YfeSg*gn^)NV(1^UEa zJD&}TF0~~H_A4~t7*ZrPn=Yc^dc(uRb4yFTQ!HAdM-tbuupamQ^SIi@j>pA$5z?

(=yzUsWG71YEh&@^=lg!pCbeB=ke+@Gi4Fq) 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 z%0AKlQv6wkfs>6!z^99=-b6ga3&cviet}8}S5ADRBwsTbkRqBNxGnfPFBfGW9WNJ+ zQDB4*jS|X5Q4O?t-ifD9{>{%CD7)uvInnd;4>~Lpm%s%Xz1w-4XNyU)@xNqz_scC; z%(l7LIA?5_hc*^PWi7R#TtTxK@jE*XkIuGRUcT@+o_)>9E6Cd+L-NwoSz1w3l>t8p z7taGXm<8wXb-GG`1>tO*V*#b)oQ5(FfH6{|r^98krs_dWMBS$TD?a?RZBDXKj_nw~_@&|)@aHe-- zMUx(AOp*AB%U;FoEc#dNw$WEk{}k;Aj~!TOf$zD}d|MG_mtdjp*tQfz2Z`Q<>hLmo#dr^y_-kHf zwC_|MQc#xod~J{ARdC*7F@XWHFT|SDbIN4l8XoNxh9GnW5Wd_OJOX>=uvxU#<=yi^ z3K#|daI_|hr_IPo+;PXHNtnn`8o{9#cU%qUrI3}=%^k5SKF|n0NXko9%;ju{8DM}5 z^c$&Fp|@>U=}BL~Q`}FcTlwkwuYFjs$WV z#ed|mB0s3d`+*CeZ#2NcYA8E%14o-~A4jer-ug7kN-x*iKF}*~d|BS2^hJL@DB{}j zSn@%+TAe!eQ8ncSERZGDAACCGnoJ40tm63({Uh_=C^-eQ@3ST;6&6Hgjml*zCUCYB zoT}^jee8T*Mpg8=*v}$CKn6&nS$F>LU8=@~|9>u3R(TR}q<2?;)+UMGXY&eEgv(2n zDRcloT(lq~O84_GO_X~@K2y}YfC%_d7ot^yHM{#@Y}Cw_u{;z8)~W%)#-O~K`f?~p zySz95%}FXbdfT`gN4LKn4TW_dEq^JVYrQmzJmlaicoK;6OZ_)`=HX|hmvXrGQ99!s zbtYXoa_!B-UzXRvmlrR)|F6mzppb$M{jU7A$oyN){tgX9qX3R7qDKE6P4nyaVh0X7 z{LVT+CorFBWMB64#RHncr2BIph9m(gz5%U-w)v|sf#mS~;CIin{gDIr9i`2_e@E5L z<6)|0dH6qd)r0OsCX>9$KAQrlN`C1G%C^}S>E}PbP@|kD(gD@%??C+EAGI8tl8twJLZpg8a%-#IJsr9tMIioz)znXaLjr^cCLQ5MuC9cj z(L-E9Li@rnJ_BPm$J1=kyv)SJgx_iD7FYu*`o#aQ4hDOFGi?K%Mj6f|@Q-?iNrOHP zpx7c4WubUm3_?;S$nZbvLfp{kh!ytJii!P)RyV4#0Dq$|{6gZJFN{`Aax-ebqYQY< z?3UfNHp!n{tm0?Tx*d$*}OHy4yYc;^P7!JujnxrQVdKtCR*I2ORUF;KU zQ&kwIGUviHK}V5Sd!FgRDTe|_{jrx2xj)cxxZ!|#{B+G0^riCiRlw{M>m3n0l-!lh zHP<*h`%Urlw+8ae<(AF@s4O8@Rh5Y^%CtdkbV+kVV~cEc4eyi*$eT_I=%8=K66h@# zmm?qV1J>+3@Z*o*7O8oGXWnnrv6=l`Jdz7IIfnlRkf4X=N2X$*(updj0 z@-F%dXMeCbk7xT^H-a{!tl0^nLIf_s6fPQv>3&^0i8*ZmnF2MRVOooz(NxDf3gAZqLHfukD zq!ond^x9?$W2^`P<O9FKW92lTd& z!jDceD!lAJ)I#M{)N_PA>!;b}UABadrgYU`?Tws#fFCux{=_=!B!BT0q3^zFoGgt# zwj8OP6?GiQHES^lx#?&01;=#em1r$3zJs-wgm}EnBfgBbdXdp*oq76O$_%8gl!>-( zkFbu{xij;x%uo5ek%+#>#ES8$mw%0#`wIN2u`!z;cTC0trBh!JM|7U)VaRE83;*OB z)~FRjyPs2Qy~9*PJCey%fkontM>afm@gqxLV|;9h{rE1S!562PhgdkEI~b<>Rw2`0 zk=N=+ec~yD70GIq8TPcqvx464!r)jCPXgHeBbL&RVEGYfQuGcJC2sQTzM`|Sog063+O95WTQ5%LYl-qv_ zyKgLeKk9UnVN!LiIM5*XmyNjFD!d_b+#o6z-&|2Yc{F3rpQg~stL1t-v93Ed-KfKG z-6^e&|0cvnG}I|ZmEldNU1h<_TxIWm{oaGsqq^g3=Hbij63p+zr%L&eGpJwf)#dtV``FVTDL+B5LI8`H(& zwI+rt=c4?0WP65p*PxWRu2OGbTuzYkQemwzIBaV6_9>(GUsHt;27@7uK9VAn2d@N^ zg+BUsTraacV)ZobP}QmMmi*+(T}q2kwBKfyZEP3 z!8x46AGP4a74r@=zSn;E7m(*_W2nl;I%Fvry_xfhsPjEsPho~KA5PgJ1PX^X1n8hS z{40{?L)J-O;kJ%fB-YOF`_H{Vc)sQ`xUxCGZ0NY5^j+mfrD&2#+Ju7ciEFzOlSzVp zwBHlVqMB2R~}Dq%FOw;6gmmrMx{{bl0b|zqPopvzR;Z zj-9R76zz<1`>;sL14yukZzw`wf*zV9ck(jSQlDtZL~?VjCM#5TQro09OJSRfwNm(@ zxtrg31v~!V5ue=jDem+Tf7g{W|dC!DoL%IDS-R^BjFk6_v?7-Ie zt8r>0>9}af$i!mGwkr# z+;CWaN0mj5ta5>*+2F+* z%+1QN3L1Fq&E%ok820KwS%Z|Nd38IYOmF5+>+TI-_h_q;IHNlAZ*tgsMXyO4QqYu* zSnRTTtiKTzz>Nf z^!4DQV8hQySEP5*w6LdINbJ1>i|#sN8zxijJEJ9E>;!R&uMG0>K1nF}tUM`THQ z?LnS+jBC@29$^KFRdBsucSuGop9z$4u^2uG;L01D%8Jg@%yU^}DK9G=-X&lIBT^u631rdBXXw-Q#<4{hIGg5D+gae^9bNVLrZlg;8VRGT|_EIf`VMa$}UU8XBfY24V6C>!tlx6J?eVKRj?e(a@}h#+May@|BkgmdRkWM>5ianY4+p zmc+~!vdk7Y`PUOLan6-ziO$JRtZE;g2>ywuA#&GHP(44XnQGbkts9M_9oDqmh_ zR%N{h^(f?2zMJ7+xmIo`Mj}R1dN(cfLEMf_kwDs+rdTiS#F!a9R3*Q-%ryZIwd&{B zEeWR=d*KRHj-)1X+M97IoDafJ*-Oo|Q(*g+WYQ-|ZNiPT-YGZ=bcJdxFz{*0V>3+| z0a^|)<0?fr6m_3GnhbA^mTM!}smE>+_U)+AZ=CVLki=J7L?p@46JR~8fNTb;@+Ua2 z8y3`Uik3e&@Sg;$z1r~+xG3CU2N1qd#uwI z$Yn1)M$8mB@UmP`j7gknp2mVn)zGjAoSfRq5n@$1X)8}VzBRVx!u7AT!{O8~WJT~7 z>S&1xdD@|lWg|(%D|cBteR=|T3e$#f%=~=3fd>z*ey-M~_sodYG>Aaaj1p6tpchLe zsMcP>VdzBfs2@9FE@nPy>JY;*U*1oz(Ty_EZ%X)%g1tP$SD`0oe|iDFh3Ac;WyEcRG{llG88&}yYiV(~Ilq^tZBB}lugXi(k7K(2n?>o-lEzw=UfeFJV<{h4d zTVu-4m85pgBUXH*lmWRN#+ohnr#)Aboxl49_cMNJ5riRZ$J@?!vKf!h4&hF|Hktw+ z>`uLp%ZD79;<2be7uczqJ*C-EQ06%oiyyen(mqEjb_spKgaUqbLz9j9OdqVENDwhG z)0pK&8qPp*Y0TZ7?aJrl2gQTJJ}Y77_p$Ihe|)y0@QqRqQf}|D&Qf@qreM|{SdZWS zl;wSVm{F0VRmFOu3e7ustgtrROQkr@C)JJ>DZ6E#vNNbx<(IB~?d2QDQmAHQsFA2B z)h(kC=KPy?Ub!E_1pKBYoMgg^z1eM!W}Zj%ynJ0h6S#bT$-}vUVIAqRmV!Jv5WuGG zV~1i$zrU|~jOibK7eN@n5w6@?uz`aGq1l--9QcMXp;-4QU!#CawDg&jZiL5PGW_(6 zMN^nCoMlCW(s(>3R7z;FIHqX9P$b?-dUvChc3g$Ck&9<2pI!c^4brtIKUfQ~!L`=R zkJ;i}AbFU#Brt6_{)~Se4=yneX5(;#?b)}hXiTxeiOlb@A!h)>YFMOnw=_Cv%$^49P%BpXVJMnT_iPF6@kMkw&^!uoV7+^h|&Cu z5thO3Ks{;~4Fv*w8ACeIqhj+2{(9jy6|wWG$T*AQDby-qT{ znC1_YT??68Lg~;x(&1%mOen;Eiv?HzzEvK!2xmujy)#D?rZMTn@Ow<62+bGY8 zVP%zv^WyZcxik%Z%EQS8(yfc?d5J#jd2N&ndjHtwFo$cInmwkQ8if`s7H`J|8YdbV zk8kST<$I{w;;7(6!#zYpplb3F+$%Y@9rF#yn_tj%1=LD$v!d?LE5tY7X*;6yK(3FA zs4}UpSARR)tICR`&)oI&tq;$8@sl`I^CbRixMSkf_o13b?kWs|@*+2;`9W8v%mJ1Q zNZq9ekm^&PWP^fKRVKXelmTMxgNai}CSnOh{)&lqfB*s0jh&k1^EFy}+c67$;!)ou z#GbXU5OlbxMC533VXwB$K1-pMG}WWtpn42VnVIE2)Wc_t{^jL(w5Y&67<7lsCVV4-tEoGG>U3Q%pP%~< zPfsTEk&{6}>d{>u$F$G_3iJ5!8-ZM-PF02T#^-b?Pq83cs#2TQPXu0Z&l@+!c-F>gHNrd8^)dcn{vBWgK7Pd!J>S)m$q|PB)A|?S9F9I-Rth&D=EWy zO9V9`Fl;bg)#OYe`00I9b}8urFE zixF2eJ4Bq+`jcbH6T8(YZ+NWZTIa3W4?Af(;_)hkr{%Hm%*w@Fy?dA&S$H_sU_~R! z`T8$Ki{5<)(o>_f%_i)rU%-Wu6@t`aS z;WNLDwR?6-{`%=NB&L&a6$jgdwLZs4&2uYGM35M@?#f%AXR9TCg((?#;8pwCsY>ml z&p2O7XbohJ87}6ja~|DYV7lhWF3ZKXzn0V#nT&y>=`CRf*D~}9@=2msh}nhhUv3R@ zk;|vo=u?_>tOqx~dLkHfwt|(vD>LB3?~#7cUG7?T0Z^6rc8G-y>Tzm3^H{3r-cVCV zOSPZSWEt4-4Vi>{@;k0B%(Y)q%t2hfG@=s!giW6n4Xs7Zfg57rb+LIw?CST!=bJMFTVuybJ6x3F zB$a`_5#$0<2nmMwju+hN$y^?+eEswGqB%RXkzEgLU{TW}P2s4m;brI{`@qW$5GDq2 z1#oGgh9Cp)oi@GiyK^DztE+iM_YsK&o)CG@8#IFe81Y+FqIfn%!mDBm3D91=<8+wV zhu?&RI~%T(bz1y1rjQA8`iTp_14rQMqV7n-CQH4PkNMsTL^e1s~9Gx+4PvX>7U`7DHLR6IBiwo70~}LAxo<{CfS$8Q)q4rDVNBK5EqKQh8AuL4|{* zE_r|-9k0I*;^B`Q8z0Z9_c~gwD7VHiLp=`-BFf~St}f0r1h$-(MtyMm*2hM_$395p z>e`y7y_C6mHmFU{7xFr^=uLP4qK02Ydpqq`um)CIPYj#xV44DNWN{#u&+7WRnzeNv zSVy_sY-8dtV14~-2h6}*CM6|>U*npr6e)~}A*8Rg*R(fG@$^DCr&lUnx#F)=zf=KU zC9MzUJ{Z3B{$!>0+bLhWnJemaxSA}{D&Uigl-C{C8AJRn0Ze7K&p ztAb;7%9k;7Mr7PJaBJf^PmUT_?sL(^m@##xOl78g3ob;BOGAokur%E7HX52GIA3+h zX1)3Y?~G~B!lwXPKk}v64wLokB~&0(>KoQ@QC~>kWqQxK6!Yl%#`2FKzz8Gbv*N&m zm(A3R_WxX!+&Jm=6{>ej(J0W*#*0xlTU;HHtPn}Qa#M^Xly>%GRJCZB(`Q^2&o5C_ zzDGIu0gIjN|g|+B_>u|gRB3wLsYXCCEwYDo9fOt?=flQr8M^Fb zJxQ2cu4jhvtnQtYYoRDLSk!X$kF-pvB z9&wN>vQU;c`Y9fXfU|1m>QSF^32l+r;q-)n5dP>QhG?2R(BVtFl@>YtTpD!Nv*H0@TIVlVmPOM)Y_?Y^ghfzB=t$o?9BeZd=;|*<01OuIlLs}1r zQ&Azvvx0CnoeOA1MIe_?Rp!$az!2f@FFsLi9ecRxCF>Ip0$d8A+}BioI`U)f`;W&m z1U>iTVu~yrK;@hfhEPe;rNH^+r2uL*hwJ1~AY3%-H^Nd*z^i!HktkhT;bJ-^7QN5; zc4@zV<=GqM>+=D&^#mQy25D~;D?p#M1wq?1Tz*X+mcqtWE-GFJ&#w7Kz z6uRBeyKGYL32PNitN^+IuE5P2)~u!`(SyT7OJoq%MClfN{qdyceyKkD$N6!8L3f+S ziLQ<5(yotSkZ#SY%IJ7WJc@Ug^@rYSQ#uU#2r6(hOJCc^ZfV9nSwzY_(B4%QE?ZN{J&24;(+ z<}HTXw4*QQ+(}G{e2v43Z*@HNG{qL4sn(wCy7 zp&FaU7CT=;9eEPBstG0;3b*NaY{--S)z-HL6#X(bekw<%W^fzdCH0Msldzb3Vb`rn zIb+~Gah!onK`ze{@Gi-}4Za0=G+DmiLOAUn$OdIkyRHTI3=KJ~DJWK6Z^*h-yLF0{ zq1v!8P6f0hCt3AKWdyyaC2@Q!8l_n>_DR4SDx;9Q6 z^~9U3@5`L1M2^KwBDYyaaveoSogET;=lE3HvlqUUf_9tQY6eWDh{4Aw8XlQtTskgW zPGX)vuFjDcvc-z;h(0+tZRxkOO$g`i?IAJbc11~OZU_o6diDfzY8N%02T`tjs(}vA zGPS-9n)Xyexoz?>HI)#)d_CazDxVOY>Uw0%o1fjKhbjez4O&$i_NLapBpfdo`D>c{jsH2nJLS! zNguv!EEUO`M*@DMg*yEF@XYfZt6%noGQ*K~9HB9#G|(m6{ev+f1~V?QsgIYwA)iuA za7yC|d&q4oxAV%k3;MS))^%OwKVi3Knx{C$r&L9vjzg{82O+3{uhDm=g`<>-Ukbp6F>yM#yJAi$oLU!yCL{U-bjsOw2qFZ)k!cRn{I;` z=#D)U1$)Y7P@)!MSFc`qPbWW-=spXA%)t~eyf$ zEIM=~kZ2F|^^akH@R7|+St+*WRS(obDC-o=!BhdM*qOZk_J7Yq0VOM+fD`$)W4^|GO~b|6 z*`hm!4Tzzoppn?eT0WaEU{)ruwjbN5oGI*j&lrnTyn%Yt9~A?*m~?zcERrDK8%qHCdTgS)^27?;|)cnf>ymXn}!KqMKJQ z#$qF`RpARhJIjPqIy@Qk^=>w zQ3IbmydHu2_e_~b>Zc9&m-lQQ0?Z}QY&{aZg*c{Ib3mR5qlDFnFs5Yq(RhQBneLJS zKTuI)dGj>sHht^cLYR{4MF3gRx)e#3u!WWYUG)sXO4()4jVzRD%vQnfJE~uFfe1-I zN^d?YMJA!W*rfq_I5<0?dt}CS?lc9&H?sY+B7@=Nnf0+DuOrKm2^T>l42VXd!N#-( zz;Nq3L&U220-3AW*X1xEDsr$v(U5AP#)=RDKv;74;VkiFRs87psA1@ACru7Kd@>}P z4LEIz%TC`!9$EzJhC4YL`&TBzihsu^`xm=3b`kVwxy=Fc_d zDy-V^eBH8t%3}VI7B+aQ+C>v=>c^<%r*v{oDTgWjKIo`u%xh{OX2XpZEp_S!M7hlB z1_TxRpopg2y3)6Li~is+d+eRS^jJ~$;rdYDhguL+Xo8@^O1~OjU$7Ja4bCZkruzW> z3M`PTcqvY$!b^A83Y-WXvq9qi<<{2dG6uJ8sV~wK3mZEJ29s<&|HcXeC1~b;_I>2x3ypk>fgQXRuv zk=!djEJK1(w+|e5xbl)|k*`%n**gsWdk|qDonnqV@iOLftCGKz04Hbu1T#XGP9@%# z1RjRldoz#}B2aI_8;YD-$*fTk9$}zj2$Gb#(h;k(9Vw%O<(xua4nBfaAF~!&b-X9KUlSD0zS#pj zYE+LeP8{{YAxhTHv4e+kx9N#sbXR4f+~T2iD5O!TGIk9BJab3&O>yYH%VKzOatBjq z4*>whz6b7gmkAILGOw_JBl5XoI@p9`1t$PM=J4typA3`9eKHo1c+iC}7&hQzWk-bR zc5^sh*>}K&e|<%~+!Ls9=iN6u-Jv%7#1*e)>){QT?}R`2D+Q9t%x6l96vtfN-bCN6 zj@QVkqPbQin=(#ZG4G$`=iOa^H;)@0Hxp}DYJRUj&!L_eg{*D>S)=rK-29}O{O8m_ zWHqMG2`-P^%1Wg*FhC~zu&=buG^D3&c#2Z=Qw}$oT$w0C5D1mbGlRK>Myobnn;c^( zfh$~_r9zvtB8SVa=~YL6*okA>Qb4&kN*{$#Nux!j7@62TjCSlngX{St=4u0*R8L8z zEwU6$zLYSDkz9>6ygT&N&g9Ixv^$mmdjm+GkG=46hR4>K!zJ`iEp5ka?<{M5*D$C${z1>dLt#w;#$akuYkKj6;p_%U2g%iiOid?@Rz^Ocx8pJ zg(f@fdy)`J%dDQ%HkXGEI#SVQT}x5ySHzleLi@%SnE~2GF_tfJ zKUDVPIH@r{1zaXa4bIQapeweh-hdC+kAPY*Kt)|TZ_6qA*}5VyopBH~g|l-9V;hm} z-iq;`!R{I^6qG*Xx+2=5kl-k?3}ZfPB{d-lH{r1T3u<)@RC z71x;qGO29uF62=5O?k7PMQq?xQMP-rc`D03!eXqG*g{gMRapDo*UOeQ-8<*I0EOL2 zly2O@p|?O`+V=+_%ih(<(}zT5+10CMTD@l;`DtFoa6`(YlI;%8B9~I(ADqq=fHIX0 zNXMmeChg_RCOzW!2d8WHKbi`qM|O~}%hr~?4h{z{61dX3_d`yD?qMF++$+=ljB zk~1`al*}__^3!&+DcH%upnI+{JYuPj4Q;*lOOfV{`5kWo`N+Aay3b9ijvpdS1gDF< zbEE(WOUBjvX&xh!IbwTAh>R(fP~3V6>@q4jT)s9sE*?M6xF0SGCJqZuN05Ol!}eDS{ErDsqo`VuRkKI~C?r;v z`Z-`=E3-Md$);bSARi-D?%t)sR&${7t;C|(&Y&$pg|1J-gowHt$~k<5{7ZoS2Yl5uw~8Z&>49XODi((}VMsr!yN%u8G5o z$H(82D}tW>@Oxh~oKX?9i%t{$;?JDBVlrpYqI};tN1rx_?=J+OtQb5<+dtsVP)nx00g;q+ zk+b!1J&!>uU)R^dr^~9B?Wqhv5?Aw{sDgN+r(=h?TuMok?7PXS$#oUg&6!RKV;svr@#h*E%L4Ad^0yC#^B(_!%6M@KcvD=MsdC(8d)bo=81x%?c) z+a|s`Ri+~dt#|yU^4oqol%jq%>Hl^b(paNLb>1z%Ki$8zUZ za#Afz8#`~r(jsYg)K(BRN&Tf8GI}{`dN?y{9P9IL`I85TZ?Vb}J8BL6Ich2cpG^Kh zXpi z5e{0U>vRw2O-NzGmX*)i$qDaK9)-c5UVus8BXQIpPZ3n#Qbo?zKAd)DuO6K5#jXiy z9FII{NYR2nOnZ` zrB|(Z7b48j6&<=Ap4cI-3XH-;3TGZh^orO~-OZ|`e{a_zAfCiR1jsy;)vj)O_Id5{ zqLq23nvP$t_L9$ndq2Tma#(A@Y}h>UFBv#YpJ}f&&w25Xec8EzIF`<(fp~00q?ScB zcR2e<$uKLzJJ*2fBxLVOS)%qD{n6q*h-0Fx$;3>T@chU?Lc9G1NBSO^P~H{|iu8c>UtThY7^r zHRHmKRu$l?i94?rpoSS+m2J%5l6lnpzCBK*di#Ew*^mGm;sU%=ullAb08dPOvmvqb z)$z(_Up8+@PEAk_C^O*pBVE4zzjxp^5<;##n_Me+gL2`rd$G9p2I~2uOt_F$tw1iu zZ@bbuRX#>`GBw9Ly6R(xq9flCbM>3W>g$SK?em<0cRKy zkRl01kPyqLLx~`vw}=>!u2iYfQFH_Zm6}ij3Za9DfYc~BAR&O#B7GDAlR&5;kdS1r zAUN}V``i1R^XG8!URNN=dRKYYy`J?v_r2aD3ETRG+ZayqK`Uk&Q_Ioe-n(>SPfJm5 zU0>3-HZ=D1s9E-chR=jOV8hfRUSr3quP>=^Y_B;a=UqF5XV@)iPKF`avG@-v?G+N)rXUrL;pK^ahHEg-6x0@8&|Y0UH~cQ(DJ_YTUy^enAgGrrRuV%K zQwu#UyYd;x(stf~j438m(@Ro>w{Gnn9L!}N(7M{$ki7WG2lc))us$=^RgCsm*>_$8 z+$fp;xr8JY)W=~*7mHC(>&ueI63W^iw_Zqct6bwOX^G#PKb&d)|A8C(N5e>ClQJsm zYlL_Rc-VW8F70N+lEmdd)uqUos{{A^yB^0cX4KLJ*V^kWH`%UMS^f>%Et^GW1wqzy zFR%Uk4w6;Aq#AouqV}ppm3UCHz|MmmO$nH_ChA7aJ_KC7iQ$nyA|a}Wjco2fUgeR* zt{Bs6Qe=+$q9~f^p@EM5gPQ2ylWnS*{W`UBfK8xkXxqLWUe;`VcT52W*(&Qj2z-so zmUOi8Q|WcTx-92<1$msA6r*G|6{UH1R%%wf|5Ca%G=^1V2j~Dy zQ)iaAkkW@9Y`Hm$S&FHj+7xac2evhR!x8s{g@yf`jQi-N#H_8gG8Qc?*{%}&Oz+_N zIQO~7IVIE9l58(y{;|^{T$i@w?G#*V1PI-lD$!9H8=>3Wx~Zba|H%v95)KhQclHh> z>)8{7($~QO5V5f0!^Tv4OiTRT&?#a&%=)@&hlkB7W$yh@^_H9Al5FO7C%p_c*KKBc z?jo^Mn=q~z;}%Y$+HTSZM*aAR=p^jG{amt$I%S}K^UdwrUVX~F;bR9z6*wnld!PO< zj_|K@zxRvDm8rR#sK4F|LTCLiY|71p+BGQ&;hAx?i@>aK6&}6tW4qp}L`x)dAN(Mc zrzLPUGyS_=J1rfM-F%geTl_x;Qvdd@JMfz4WbZ$i1NB_zh7PZkyNZ)Ck8e1?f)x5U zMkv$;2{ObMW(v?ChCOiJV{ZD284G1fwCA}Jc0~Ou@K}%W5<)M1FH~_=c-%-qLJ(Db zwTxuk+9uTVM2Z>qi&m65XxQ9X3v7D0)(X#GoowU5;h?C*CqtXWh4RiqX|9C~oJWb` zTH9<-W7+HwE2Cu9-jVvyfL;r$L@wqg__)%k>aFrZrqM3sjN%%fu(1PZ*)LB+%#jKU z69;_uJ`;wP)-U0BR6H+#iZ8wy&X-qCp+YM<%i*s`Q8LGYPjzekyRV~PT5p%n2y8F+ zq%#6fl-O>Hxh$ZZ>Jvw9;W*b5yGrL8x!l@osXCdyp+nOd1FWDSAK>lOu8(vPzPM(K zh{RVLeE{eSH`TXj06bgPD6JpV`r|rJFUYaB=E3cgMnXt(LlRb_d7-+(OT=X8<@DI~ zB0J1PMd9F&s>(wy?80idcb;Otm0nQ$(MB)qt%+q3^f`FmzG#mWy3Qe%UdhjF&5`4y zM3IX2eXG?l?}prkfm-SBtY#^`U&p>#IRP8qO>n{nbj!Ebxgq;+|6mSiY0YX0)fnOn zKF^~IUP?<^8ZGtkJMQ-$}?mx)jmI4mfwm%-xZ*~aM%&Q@gge0=aU zE%2yVnJ3-bhvnH~OH0CVuXNNO8||o!{C5(i?bYe3wjz-+68)vPOE>u5gCJo+ z5?1$)OJ%rmw3-52xLQ1K!=tQMn}yupr`&~zWIXbYuw*l!U5MHopP9!ED=+-Lsur0? za!RKk@_0bkYe4mjGfeh3@Z%wL`R7h!4b7-o9|b}!~e-+(TI}j(K7u9J@rcUGn%ZK5?SZ&2?Ni!&I`eiyCIpQpx zZ5QX~VE0ySRpDS!?x25K>0cprjY?G>Dg;zT<19}z@lZ9)@mHBM%4>HLi{lY|Q*oWWwi6BP$Q>~{jRdZ&Zg@@TdQ=4V9h>w_eX0Ia0l zw3`PqIi#oW(ibDJ!5pgGd-XAQ4`B@O>6}kg?^il>Jiph}<^7Yhy1t+PD5+l>uov>1 zuAtCnvznT4iU8b(7I#P)9s1iXu^I2S3_10YVSyd+`F_&k7rHE!g6`#2{=r@wN3Iwsdt{uM0c1jRZezE(Dt zGhIuFL+_q2&ph;op1~=N>+z~RM{j%<8BNCFQ492}?1)5ewQL(D#g7nk_-#9HYUw34 zL-mF5RmV~*QnFB{8M&xbw$^k)BF=PzZeqwE6{SYC%sUx#<8o}^NraboAWO4v_NN@j z$f$;%*y#mZdY1zN2ajuTQ&}c<$o$D-&%}eIy4Cr%%9G9e$titFQiG<=8r{u>#UB2A z-p4zTq%jf?o_2Elt(X$xHoWRPCqW!gaZLNe!Edfgwe@wELswG_kc`PXjZ-tPhaQQb zJ*SVik>wBY>uGQQe zOo(BW-cQ_ixvsPDN2+h{s6%Cv2=HIhL&MRaCHQXWm73;YA*9zo*pOI=oK3?OTl$~Q zvUU&00P9d+^wm(cpBEa|d^U8r&srf6)txIHTr_%2yK3fbvcQ8;M>gAU-+k=iwWO|| z%L>lQsOKZ0rSped>XmD*ye%x%=lZMQef1o7N!ScLOYGZG71r9L)?E>oOi5zu4mXNd z9U`lkZnN}F!RTWZHwh(P?z2u(8-8i0)6cw85^RWLWiMLA{U*8kD~{{zHqq3zB4*Gn z^O&HgfZ#11JA)-G8YlT%T)ge^>@inqhqc~m>|HHpo)Kd2uE)DbpMxVIIjW1H2==|* zwqLaE8q8l}f~wFum*}3!6g{OT79qCHaRbxl7)qM3PnEWyWj!^NJ5c4IaB?p(c0SUA$Z}_`>V|#9J)PiWysZ z)}TEs!@7Y`9ZGVLRCq-{^z`dW?Yy59=8@|^T;ktqhIF}0rer+akHM*0;8vdb^O{zU zO$=?#_LF%izw>B9S<=5hhzCo9YeNF$2wg>|0-*b9F!-4Q;4%boXltKr{olt|E5NM~Kr zjlnLLcG>Wi(!)V;(5MfeUhYs-e${x|mZ%JMPEkZY%8D60O*|iaur>VWc!O&G5e0$f zrMY%>Dsr9`=@E%sUs9&JlU;^i81QGaHD>NFPNk@MnUu=Li#W>|-cyg4eJIZ@^j{(x zx_ZZ7;6L*3yBZ0>jvat#8uP}DECFZueinJCntEwsJQ>xoMOBTs`dmWA)_jToe(pT* zjmF}@v&kmM{wPGLIMA2Z*LEApnD?iNQ17Aa1)rg8sI~NShi>QMYX!FgT-LNc&G@gto2Zgd z?bWs^gCwo@O8Q^iICZ-(l4D!{A{Te)50C z^!(xyh$R(idC0W z%BQ6?tjMMVIk6CtLF3(HJY4V zhLyvhn*D$mkgEBj91#62sXd1|Rwj10gJe@{^p?li2MhLW6r37xD)J7* zgg6&E9X7TTwlI+zGCS*G%S*NLZ*SnT&l@TD^~Wa2!&d#cZmVv+UJ>U4QdtGwO~gXg zC0W&Jt$f7;Z$NYyknkaQ6|fHpg{^WA%NTgk(D~Of=M|8T-@7NTN49-aFDgROMOkD& zpN3*QF~B%zqv~ ztIDZ|ega(C^@@)u=_jo8z84RnTH|REY@=S-a`eZ05TI4X9wR)H`)&Et5Pa|)p`M_{ z+>@ZK)6x5I^n7JtdX8o6kA)@jP5SF2V_qng`25`rn7KRq_cU4JK+v_jn;`705I+nT z&%DAaFP3wLC6Co19I&&^HlpKQCU(!vH@=+U-8^NBQyi0s{d`*DOunf)6s_DsSP*Z~ z8dR2Q+p&-0m*U#LtZHbyZo7XTV1W*ZIc1PJoAW^vomPIeC@bdUK``rLrlw@U8ZP+B zbDXqd8)I`v!p_@?5{qkM&s(sXT%$$MIGpmSd*`Jt5?0@8e!fccE#f~O8Ex>68F!_; zY7S0=y_r)%`EG`e+=ImWW`%wEWc{o5+am`x`{SN%Jx-m?E-Y*rxAzv|lFF8^IdQ7H12uKn zmvA;4cc{n%b}1$sX3>Tk%54jR=jNNh3aKYB`BI%z-BXeg@nUG+^=ev4JtCl8y*GSP zrdI`H8c+q#si|E`sOK|^WdDTeZ&1H$qPC&+xy38G^w81n&(kJXN%5V__aNGy7l&0? z)NHyoEu0@3(a)JF$Un-@Hy+!(VZ((frt);m1?&@kz*tZKTe+DWaY3&?!j8Q z1vYxz$_-_wshmYa*%xn;0mZ2<$tyu{?CZzhQ%^F zATff(>A1Z3>{5G0rmFL@0T8Y^N9YBKo(VSB9aCo=Ar^=HZO@`;{b!o>c{3b_L9#M> z6PC}4psF>famU57yCW3RpI=MyAT1ZEbwA8^B5hSNGck#CmOvg)ixzFq*)GsX07fOvavc=^`3V z!W6ju#bDf-ZOUwqWrzV-b?LVdaWyr{Mj}@I${S;R z?i^4@%`|XIE?_AHI1gTE!CJ9QUyQWmzL&IP9>Guw#8&Z^;a}Q{*>4kz**++@#9zWc z(H4o~NiQQIi7sJbVOkqTnW{@~ByB^d@&3Bove=@nPhf>ls)t{D?aVIKh7;n3=Tk1& zET`y~Evtvm_qAv^wK}ug6uzwwy*ZapV+T%t%bVK%38)3%hDP^)oOF23&?K0}2fxj` zg+?9VK*TCux&Q0WXJHqRV-Us$t*#ia0ryG%w{$0&0(DjA{ zPNH@J{>1g6zWZgu>W;TIR1}cT{Jl!g z{wIi3Ef4T;jGE9U;bIigv1}=D_<>_ zSAQ$5hh~D*gMcpu82h0t1|X%;e{fOKNcbpMwwC{$1-^|jxDk-G^uUj0@_65=e2B1y zPY2u8hjVGubgO?6tqhVzMs3&PdIGQmlDz)sXd~SOs_Z)xqz_%(3&wWq9K#ntg5hxP%9c1msPTm}b3C%ezQOi{*@+kI`FZ%G3mYzsR+Z^QVVfjiVbV)#JLGGL z)a#|-KdB=-uk1L3ZL0`5ZA_wy5^a3~%mto!Wq@{^k$@837NmVi6C) zW{>8ptdu122WxAn=Ocf=2l@C&35D|!L#v{SrB7JW=gFN5Ge*>gm57#gK)HFT89c_% zfOg~aMedhKlm}}!HFDI580J75I5NHbV6oB3ZDuBi!5vpX`Q8PcLZM0bVIi?ygduf7 zLsn|kkQ0JvYK>1s2xq*oLXLG~X_>6PurSC-g|2-i3*S;$?3?s(lczVz3duo%1h@ne%KEOcX%@y+=3 z$atG7dC51{lu9fHrT>@WkL!~(v0Wu$C3m?N^ig(Sg3egEByEaVZwj5%q&@bDxQOR4 zteA;=MVJ_hPv2t>CKD5^o5S@H-6D!6bchyuH{RI>?s*rm;6WO|rPbQ?-SQpnK0MTG zpQO~%#=Zu9fR2SsMoLlp=`X-sX`&^5cBO#85O-^AtlC>^2fH<}woUY#IL9(B1=L9${guBQ# zhzm!5xF7aUi!fG4jqgOu4@iz`mQG(5Go2WntavwbjFb$aw||h_F1mqNqzMVql+GAb zu7NwAK7*Z$T*oq!mL(K@PGr4{^9-FU2;{4PhjV=y4<^m`Zw!7tWxh5&ELx>V zF`L&RS4h@EmejLhT}tN6Ebon?_2gIqE4j7x0m^$vnXr;BNF+ z*gm^-s@VbubNXH08c}CVsqw6mO%0kxi;Kk8yH`FPj_J4BD?_~Wx}wJONdU3GrrXrakN*?_EQcAHFeWrQz|(K78!%0e>!&LN|gg zcwNw))Dx2P{FL1aYL<7|HO()hLvKn zi*5}!a9$Zs!vNGXR{la-UT4?@l--l7p94tk^xs8P-=Vm@C~DNvl6Pr3ei~@fp7g*0 zH(l^We_DR7`=>Ye1&t37yau%tyw-GT+#F6r;=6L;T(|TPT0WcXs{a&#Jgsh_qZ=&K zSw!w2u@}W>qCDn5x9X0?Ko_Yd7~6PxM32&AODmuyNQ(T9|*nMFECGovlo6XIeqE({{oXLv0(rJ diff --git a/docs/options api.md b/docs/options api.md index 6205089f3dc3..f1c01ac7e7e9 100644 --- a/docs/options api.md +++ b/docs/options api.md @@ -10,10 +10,9 @@ Archipelago will be abbreviated as "AP" from now on. ## Option Definitions Option parsing in AP is done using different Option classes. For each option you would like to have in your game, you need to create: -- A new option class with a docstring detailing what the option will do to your user. -- A `display_name` to be displayed on the webhost. -- A new entry in the `option_definitions` dict for your World. -By style and convention, the internal names should be snake_case. +- A new option class, with a docstring detailing what the option does, to be exposed to the user. +- A new entry in the `options_dataclass` definition for your World. +By style and convention, the dataclass attributes should be `snake_case`. ### Option Creation - If the option supports having multiple sub_options, such as Choice options, these can be defined with @@ -43,7 +42,7 @@ from Options import Toggle, Range, Choice, PerGameCommonOptions class StartingSword(Toggle): """Adds a sword to your starting inventory.""" - display_name = "Start With Sword" + display_name = "Start With Sword" # this is the option name as it's displayed to the user on the webhost and in the spoiler log class Difficulty(Choice): From bb481256de2a511d3b114f164061d440026be4c4 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 28 Mar 2024 21:48:40 -0500 Subject: [PATCH 25/34] Core: Make fill failure error more human parseable (#3023) --- Fill.py | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/Fill.py b/Fill.py index 2d6257eae30a..291ea7e882b7 100644 --- a/Fill.py +++ b/Fill.py @@ -198,10 +198,16 @@ def fill_restrictive(multiworld: MultiWorld, base_state: CollectionState, locati # There are leftover unplaceable items and locations that won't accept them if multiworld.can_beat_game(): logging.warning( - f'Not all items placed. Game beatable anyway. (Could not place {unplaced_items})') + f"Not all items placed. Game beatable anyway.\nCould not place:\n" + f"{', '.join(str(item) for item in unplaced_items)}") else: - raise FillError(f'No more spots to place {unplaced_items}, locations {locations} are invalid. ' - f'Already placed {len(placements)}: {", ".join(str(place) for place in placements)}') + raise FillError(f"No more spots to place {len(unplaced_items)} items. Remaining locations are invalid.\n" + f"Unplaced items:\n" + f"{', '.join(str(item) for item in unplaced_items)}\n" + f"Unfilled locations:\n" + f"{', '.join(str(location) for location in locations)}\n" + f"Already placed {len(placements)}:\n" + f"{', '.join(str(place) for place in placements)}") item_pool.extend(unplaced_items) @@ -273,8 +279,13 @@ def remaining_fill(multiworld: MultiWorld, if unplaced_items and locations: # There are leftover unplaceable items and locations that won't accept them - raise FillError(f'No more spots to place {unplaced_items}, locations {locations} are invalid. ' - f'Already placed {len(placements)}: {", ".join(str(place) for place in placements)}') + raise FillError(f"No more spots to place {len(unplaced_items)} items. Remaining locations are invalid.\n" + f"Unplaced items:\n" + f"{', '.join(str(item) for item in unplaced_items)}\n" + f"Unfilled locations:\n" + f"{', '.join(str(location) for location in locations)}\n" + f"Already placed {len(placements)}:\n" + f"{', '.join(str(place) for place in placements)}") itempool.extend(unplaced_items) @@ -457,7 +468,9 @@ def mark_for_locking(location: Location): fill_restrictive(multiworld, multiworld.state, defaultlocations, progitempool, name="Progression") if progitempool: raise FillError( - f'Not enough locations for progress items. There are {len(progitempool)} more items than locations') + f"Not enough locations for progression items. " + f"There are {len(progitempool)} more progression items than there are available locations." + ) accessibility_corrections(multiworld, multiworld.state, defaultlocations) for location in lock_later: @@ -470,7 +483,9 @@ def mark_for_locking(location: Location): remaining_fill(multiworld, excludedlocations, filleritempool, "Remaining Excluded") if excludedlocations: raise FillError( - f"Not enough filler items for excluded locations. There are {len(excludedlocations)} more locations than items") + f"Not enough filler items for excluded locations. " + f"There are {len(excludedlocations)} more excluded locations than filler or trap items." + ) restitempool = filleritempool + usefulitempool @@ -481,13 +496,13 @@ def mark_for_locking(location: Location): if unplaced or unfilled: logging.warning( - f'Unplaced items({len(unplaced)}): {unplaced} - Unfilled Locations({len(unfilled)}): {unfilled}') + f"Unplaced items({len(unplaced)}): {unplaced} - Unfilled Locations({len(unfilled)}): {unfilled}") items_counter = Counter(location.item.player for location in multiworld.get_locations() if location.item) locations_counter = Counter(location.player for location in multiworld.get_locations()) items_counter.update(item.player for item in unplaced) locations_counter.update(location.player for location in unfilled) print_data = {"items": items_counter, "locations": locations_counter} - logging.info(f'Per-Player counts: {print_data})') + logging.info(f"Per-Player counts: {print_data})") def flood_items(multiworld: MultiWorld) -> None: From 5f0112e78365d19f04e22af92d6ad1f52d264b1f Mon Sep 17 00:00:00 2001 From: Zach Parks Date: Fri, 29 Mar 2024 19:13:51 -0500 Subject: [PATCH 26/34] Tracker: Add starting inventory to trackers and received items table. (#3051) --- WebHostLib/tracker.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 5b246e5aeef0..0b74c6067624 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -124,10 +124,13 @@ def get_player_received_items(self, team: int, player: int) -> List[NetworkItem] @_cache_results def get_player_inventory_counts(self, team: int, player: int) -> collections.Counter: """Retrieves a dictionary of all items received by their id and their received count.""" - items = self.get_player_received_items(team, player) + received_items = self.get_player_received_items(team, player) + starting_items = self.get_player_starting_inventory(team, player) inventory = collections.Counter() - for item in items: + for item in received_items: inventory[item.item] += 1 + for item in starting_items: + inventory[item] += 1 return inventory @@ -358,10 +361,13 @@ def get_enabled_multiworld_trackers(room: Room) -> Dict[str, Callable]: def render_generic_tracker(tracker_data: TrackerData, team: int, player: int) -> str: game = tracker_data.get_player_game(team, player) - # Add received index to all received items, excluding starting inventory. received_items_in_order = {} - for received_index, network_item in enumerate(tracker_data.get_player_received_items(team, player), start=1): - received_items_in_order[network_item.item] = received_index + starting_inventory = tracker_data.get_player_starting_inventory(team, player) + for index, item in enumerate(starting_inventory): + received_items_in_order[item] = index + for index, network_item in enumerate(tracker_data.get_player_received_items(team, player), + start=len(starting_inventory)): + received_items_in_order[network_item.item] = index return render_template( template_name_or_list="genericTracker.html", From b7ac6a4cbd54d5f8e6672e4a6c6ea708e7e6d4de Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Fri, 29 Mar 2024 20:14:53 -0500 Subject: [PATCH 27/34] The Messenger: Fix various portal shuffle issues (#2976) * put constants in a bit more sensical order * fix accidental incorrect scoping * fix plando rules not being respected * add docstrings for the plando functions * fix the portal output pools being overwritten * use shuffle and pop instead of removing by content so plando can go to the same area twice * move portal pool rebuilding outside mapping creation * remove plando_connection cleansing since it isn't shared with transition shuffle --- worlds/messenger/portals.py | 75 ++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/worlds/messenger/portals.py b/worlds/messenger/portals.py index 64438b018400..51f51d7e379e 100644 --- a/worlds/messenger/portals.py +++ b/worlds/messenger/portals.py @@ -1,3 +1,4 @@ +from copy import deepcopy from typing import List, TYPE_CHECKING from BaseClasses import CollectionState, PlandoOptions @@ -18,24 +19,6 @@ ] -REGION_ORDER = [ - "Autumn Hills", - "Forlorn Temple", - "Catacombs", - "Bamboo Creek", - "Howling Grotto", - "Quillshroom Marsh", - "Searing Crags", - "Glacial Peak", - "Tower of Time", - "Cloud Ruins", - "Underworld", - "Riviere Turquoise", - "Elemental Skylands", - "Sunken Shrine", -] - - SHOP_POINTS = { "Autumn Hills": [ "Climbing Claws", @@ -204,30 +187,48 @@ } +REGION_ORDER = [ + "Autumn Hills", + "Forlorn Temple", + "Catacombs", + "Bamboo Creek", + "Howling Grotto", + "Quillshroom Marsh", + "Searing Crags", + "Glacial Peak", + "Tower of Time", + "Cloud Ruins", + "Underworld", + "Riviere Turquoise", + "Elemental Skylands", + "Sunken Shrine", +] + + def shuffle_portals(world: "MessengerWorld") -> None: - def create_mapping(in_portal: str, warp: str) -> None: - nonlocal available_portals + """shuffles the output of the portals from the main hub""" + def create_mapping(in_portal: str, warp: str) -> str: + """assigns the chosen output to the input""" parent = out_to_parent[warp] exit_string = f"{parent.strip(' ')} - " if "Portal" in warp: exit_string += "Portal" world.portal_mapping.append(int(f"{REGION_ORDER.index(parent)}00")) - elif warp_point in SHOP_POINTS[parent]: - exit_string += f"{warp_point} Shop" - world.portal_mapping.append(int(f"{REGION_ORDER.index(parent)}1{SHOP_POINTS[parent].index(warp_point)}")) + elif warp in SHOP_POINTS[parent]: + exit_string += f"{warp} Shop" + world.portal_mapping.append(int(f"{REGION_ORDER.index(parent)}1{SHOP_POINTS[parent].index(warp)}")) else: - exit_string += f"{warp_point} Checkpoint" - world.portal_mapping.append(int(f"{REGION_ORDER.index(parent)}2{CHECKPOINTS[parent].index(warp_point)}")) + exit_string += f"{warp} Checkpoint" + world.portal_mapping.append(int(f"{REGION_ORDER.index(parent)}2{CHECKPOINTS[parent].index(warp)}")) world.spoiler_portal_mapping[in_portal] = exit_string connect_portal(world, in_portal, exit_string) - available_portals.remove(warp) - if shuffle_type < ShufflePortals.option_anywhere: - available_portals = [port for port in available_portals if port not in shop_points[parent]] + return parent def handle_planned_portals(plando_connections: List[PlandoConnection]) -> None: + """checks the provided plando connections for portals and connects them""" for connection in plando_connections: if connection.entrance not in PORTALS: continue @@ -236,22 +237,28 @@ def handle_planned_portals(plando_connections: List[PlandoConnection]) -> None: world.plando_portals.append(connection.entrance) shuffle_type = world.options.shuffle_portals - shop_points = SHOP_POINTS.copy() + shop_points = deepcopy(SHOP_POINTS) for portal in PORTALS: shop_points[portal].append(f"{portal} Portal") if shuffle_type > ShufflePortals.option_shops: - shop_points.update(CHECKPOINTS) + for area, points in CHECKPOINTS.items(): + shop_points[area] += points out_to_parent = {checkpoint: parent for parent, checkpoints in shop_points.items() for checkpoint in checkpoints} available_portals = [val for zone in shop_points.values() for val in zone] + world.random.shuffle(available_portals) plando = world.multiworld.plando_connections[world.player] if plando and world.multiworld.plando_options & PlandoOptions.connections: handle_planned_portals(plando) - world.multiworld.plando_connections[world.player] = [connection for connection in plando - if connection.entrance not in PORTALS] + for portal in PORTALS: - warp_point = world.random.choice(available_portals) - create_mapping(portal, warp_point) + if portal in world.plando_portals: + continue + warp_point = available_portals.pop() + parent = create_mapping(portal, warp_point) + if shuffle_type < ShufflePortals.option_anywhere: + available_portals = [port for port in available_portals if port not in shop_points[parent]] + world.random.shuffle(available_portals) def connect_portal(world: "MessengerWorld", portal: str, out_region: str) -> None: From 72c53513f8bdab5506ffa972c1bf6f8573f097d7 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 31 Mar 2024 03:57:59 +0200 Subject: [PATCH 28/34] WebHost: fix /check creating broken yaml files if files don't end with a newline (#3063) --- WebHostLib/check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebHostLib/check.py b/WebHostLib/check.py index e739dda02d79..da6bfe861a6c 100644 --- a/WebHostLib/check.py +++ b/WebHostLib/check.py @@ -28,7 +28,7 @@ def check(): results, _ = roll_options(options) if len(options) > 1: # offer combined file back - combined_yaml = "---\n".join(f"# original filename: {file_name}\n{file_content.decode('utf-8-sig')}" + combined_yaml = "\n---\n".join(f"# original filename: {file_name}\n{file_content.decode('utf-8-sig')}" for file_name, file_content in options.items()) combined_yaml = base64.b64encode(combined_yaml.encode("utf-8-sig")).decode() else: From 4e3d3963941934c77573e6e0b699edf9e26cd647 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Sun, 31 Mar 2024 10:47:11 -0500 Subject: [PATCH 29/34] The Messenger: Fix precollected notes not being removed from the itempool (#3066) * The Messenger: fix precollected notes not being properly removed from pool * The Messenger: bump required client version --- worlds/messenger/__init__.py | 32 ++++++++++++++++++++++---------- worlds/messenger/constants.py | 7 +++++++ worlds/messenger/options.py | 9 +++++++++ 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index c40ca02f42f1..5e1b12778638 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -1,4 +1,5 @@ import logging +from datetime import date from typing import Any, ClassVar, Dict, List, Optional, TextIO from BaseClasses import CollectionState, Entrance, Item, ItemClassification, MultiWorld, Tutorial @@ -9,7 +10,8 @@ from worlds.LauncherComponents import Component, Type, components from .client_setup import launch_game from .connections import CONNECTIONS, RANDOMIZED_CONNECTIONS, TRANSITIONS -from .constants import ALL_ITEMS, ALWAYS_LOCATIONS, BOSS_LOCATIONS, FILLER, NOTES, PHOBEKINS, PROG_ITEMS, USEFUL_ITEMS +from .constants import ALL_ITEMS, ALWAYS_LOCATIONS, BOSS_LOCATIONS, FILLER, NOTES, PHOBEKINS, PROG_ITEMS, TRAPS, \ + USEFUL_ITEMS from .options import AvailablePortals, Goal, Logic, MessengerOptions, NotesNeeded, ShuffleTransitions from .portals import PORTALS, add_closed_portal_reqs, disconnect_portals, shuffle_portals, validate_portals from .regions import LEVELS, MEGA_SHARDS, LOCATIONS, REGION_CONNECTIONS @@ -110,7 +112,7 @@ class MessengerWorld(World): }, } - required_client_version = (0, 4, 3) + required_client_version = (0, 4, 4) web = MessengerWeb() @@ -127,6 +129,7 @@ class MessengerWorld(World): portal_mapping: List[int] transitions: List[Entrance] reachable_locs: int = 0 + filler: Dict[str, int] def generate_early(self) -> None: if self.options.goal == Goal.option_power_seal_hunt: @@ -146,8 +149,9 @@ def generate_early(self) -> None: self.starting_portals = [f"{portal} Portal" for portal in starting_portals[:3] + self.random.sample(starting_portals[3:], k=self.options.available_portals - 3)] + # super complicated method for adding searing crags to starting portals if it wasn't chosen - # need to add a check for transition shuffle when that gets added back in + # TODO add a check for transition shuffle when that gets added back in if not self.options.shuffle_portals and "Searing Crags Portal" not in self.starting_portals: self.starting_portals.append("Searing Crags Portal") if len(self.starting_portals) > 4: @@ -155,6 +159,10 @@ def generate_early(self) -> None: if portal in self.starting_portals] self.starting_portals.remove(self.random.choice(portals_to_strip)) + self.filler = FILLER.copy() + if (not hasattr(self.options, "traps") and date.today() < date(2024, 4, 2)) or self.options.traps: + self.filler.update(TRAPS) + self.plando_portals = [] self.portal_mapping = [] self.spoiler_portal_mapping = {} @@ -182,12 +190,13 @@ def create_regions(self) -> None: def create_items(self) -> None: # create items that are always in the item pool main_movement_items = ["Rope Dart", "Wingsuit"] + precollected_names = [item.name for item in self.multiworld.precollected_items[self.player]] itempool: List[MessengerItem] = [ self.create_item(item) for item in self.item_name_to_id - if "Time Shard" not in item and item not in { + if item not in { "Power Seal", *NOTES, *FIGURINES, *main_movement_items, - *{collected_item.name for collected_item in self.multiworld.precollected_items[self.player]}, + *precollected_names, *FILLER, *TRAPS, } ] @@ -199,7 +208,7 @@ def create_items(self) -> None: if self.options.goal == Goal.option_open_music_box: # make a list of all notes except those in the player's defined starting inventory, and adjust the # amount we need to put in the itempool and precollect based on that - notes = [note for note in NOTES if note not in self.multiworld.precollected_items[self.player]] + notes = [note for note in NOTES if note not in precollected_names] self.random.shuffle(notes) precollected_notes_amount = NotesNeeded.range_end - \ self.options.notes_needed - \ @@ -228,8 +237,8 @@ def create_items(self) -> None: remaining_fill = len(self.multiworld.get_unfilled_locations(self.player)) - len(itempool) if remaining_fill < 10: self._filler_items = self.random.choices( - list(FILLER)[2:], - weights=list(FILLER.values())[2:], + list(self.filler)[2:], + weights=list(self.filler.values())[2:], k=remaining_fill ) filler = [self.create_filler() for _ in range(remaining_fill)] @@ -300,8 +309,8 @@ def fill_slot_data(self) -> Dict[str, Any]: def get_filler_item_name(self) -> str: if not getattr(self, "_filler_items", None): self._filler_items = [name for name in self.random.choices( - list(FILLER), - weights=list(FILLER.values()), + list(self.filler), + weights=list(self.filler.values()), k=20 )] return self._filler_items.pop(0) @@ -335,6 +344,9 @@ def get_item_classification(self, name: str) -> ItemClassification: if name in {*USEFUL_ITEMS, *USEFUL_SHOP_ITEMS}: return ItemClassification.useful + + if name in TRAPS: + return ItemClassification.trap return ItemClassification.filler diff --git a/worlds/messenger/constants.py b/worlds/messenger/constants.py index 0c4d6a944cef..ea15c71068db 100644 --- a/worlds/messenger/constants.py +++ b/worlds/messenger/constants.py @@ -48,6 +48,11 @@ "Time Shard (500)": 5, } +TRAPS = { + "Teleport Trap": 5, + "Prophecy Trap": 10, +} + # item_name_to_id needs to be deterministic and match upstream ALL_ITEMS = [ *NOTES, @@ -71,6 +76,8 @@ *SHOP_ITEMS, *FIGURINES, "Money Wrench", + "Teleport Trap", + "Prophecy Trap", ] # locations diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index c56ee700438f..167bc285ded4 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from datetime import date from typing import Dict from schema import And, Optional, Or, Schema @@ -123,6 +124,11 @@ class RequiredSeals(Range): default = range_end +class Traps(Toggle): + """Whether traps should be included in the itempool.""" + display_name = "Include Traps" + + class ShopPrices(Range): """Percentage modifier for shuffled item prices in shops""" display_name = "Shop Prices Modifier" @@ -199,3 +205,6 @@ class MessengerOptions(DeathLinkMixin, PerGameCommonOptions): percent_seals_required: RequiredSeals shop_price: ShopPrices shop_price_plan: PlannedShopPrices + + if date.today() > date(2024, 4, 1): + traps: Traps From 2ec93ba82a969865a8addc98feb076898978c8e3 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Sun, 31 Mar 2024 09:48:59 -0600 Subject: [PATCH 30/34] Pokemon Emerald: Fix inconsistent location name (#3065) --- worlds/pokemon_emerald/data/locations.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/pokemon_emerald/data/locations.json b/worlds/pokemon_emerald/data/locations.json index d654119ad635..6affdf414688 100644 --- a/worlds/pokemon_emerald/data/locations.json +++ b/worlds/pokemon_emerald/data/locations.json @@ -1784,7 +1784,7 @@ "tags": ["BerryTree"] }, "BERRY_TREE_65": { - "label": "Route 123 - Berry Master Berry Tree 9", + "label": "Route 123 - Berry Tree Berry Master 9", "tags": ["BerryTree"] }, "BERRY_TREE_66": { From e546c0f7ff2456ddb919a1b65a437a1c61b07479 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 31 Mar 2024 10:50:31 -0500 Subject: [PATCH 31/34] Yoshi's Island: add patch suffix (#3061) --- worlds/yoshisisland/Client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/yoshisisland/Client.py b/worlds/yoshisisland/Client.py index c512a8316ab5..1aff36c553c7 100644 --- a/worlds/yoshisisland/Client.py +++ b/worlds/yoshisisland/Client.py @@ -36,6 +36,7 @@ class YoshisIslandSNIClient(SNIClient): game = "Yoshi's Island" + patch_suffix = ".apyi" async def deathlink_kill_player(self, ctx: "SNIContext") -> None: from SNIClient import DeathState, snes_buffered_write, snes_flush_writes, snes_read From 03d47e460e434b897b313c2ba452d785ecbacebe Mon Sep 17 00:00:00 2001 From: Ixrec Date: Sun, 31 Mar 2024 16:55:08 +0100 Subject: [PATCH 32/34] A Short Hike: Clarify installation instructions (#3058) * Clarify installation instructions * don't mention 'config' folder since it isn't created until the game starts --- worlds/shorthike/docs/setup_en.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/worlds/shorthike/docs/setup_en.md b/worlds/shorthike/docs/setup_en.md index e327d8bed93c..85d5a8f5eb16 100644 --- a/worlds/shorthike/docs/setup_en.md +++ b/worlds/shorthike/docs/setup_en.md @@ -14,12 +14,13 @@ ## Installation -1. Download the [Modding Tools](https://github.com/BrandenEK/AShortHike.ModdingTools/releases), and follow -the [installation instructions](https://github.com/BrandenEK/AShortHike.ModdingTools#a-short-hike-modding-tools) on the GitHub page. +1. Open the [Modding Tools GitHub page](https://github.com/BrandenEK/AShortHike.ModdingTools/), and follow +the installation instructions. After this step, your `A Short Hike/` folder should have an empty `Modding/` subfolder. 2. After the Modding Tools have been installed, download the -[Randomizer](https://github.com/BrandenEK/AShortHike.Randomizer/releases) and extract the contents of it -into the `Modding` folder. +[Randomizer](https://github.com/BrandenEK/AShortHike.Randomizer/releases) zip, extract it, and move the contents +of the `Randomizer/` folder into your `Modding/` folder. After this step, your `Modding/` folder should have + `data/` and `plugins/` subfolders. ## Connecting @@ -29,4 +30,4 @@ Enter in the Server Port, Name, and Password (optional) in the popup menu that a ## Tracking Install PopTracker from the link above and place the PopTracker pack into the packs folder. -Connect to Archipelago via the AP button in the top left. \ No newline at end of file +Connect to Archipelago via the AP button in the top left. From 2a0b7e0def5c00cc2ac273b22581b3cde3b6f6a6 Mon Sep 17 00:00:00 2001 From: LiquidCat64 <74896918+LiquidCat64@users.noreply.github.com> Date: Sun, 31 Mar 2024 09:55:55 -0600 Subject: [PATCH 33/34] CV64: A couple of very small docs corrections. (#3057) --- worlds/cv64/docs/en_Castlevania 64.md | 2 +- worlds/cv64/options.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/cv64/docs/en_Castlevania 64.md b/worlds/cv64/docs/en_Castlevania 64.md index 692bbfe86a71..55f7eb03012f 100644 --- a/worlds/cv64/docs/en_Castlevania 64.md +++ b/worlds/cv64/docs/en_Castlevania 64.md @@ -91,7 +91,7 @@ either filler, useful, or a trap. When you pick up someone else's item, you will not receive anything and the item textbox will show up to announce what you found and who it was for. The color of the text will tell you its classification: -- Light brown-ish: Common +- Light brown-ish: Filler - White/Yellow: Useful - Yellow/Green: Progression - Yellow/Red: Trap diff --git a/worlds/cv64/options.py b/worlds/cv64/options.py index e1be03897dcf..495bb51c5ef8 100644 --- a/worlds/cv64/options.py +++ b/worlds/cv64/options.py @@ -144,8 +144,9 @@ class HardLogic(Toggle): class MultiHitBreakables(Toggle): - """Adds the items that drop from the objects that break in three hits to the pool. There are 17 of these throughout - the game, adding up to 74 checks in total with all stages. + """Adds the items that drop from the objects that break in three hits to the pool. There are 18 of these throughout + the game, adding up to 79 or 80 checks (depending on sub-weapons + being shuffled anywhere or not) in total with all stages. The game will be modified to remember exactly which of their items you've picked up instead of simply whether they were broken or not.""" display_name = "Multi-hit Breakables" From f813a7005fadb1c56bb93fee6147b63d9df2b720 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Sun, 31 Mar 2024 11:11:10 -0500 Subject: [PATCH 34/34] The Messenger: update docs formatting and fix outdated info (#3033) * The Messenger: update docs formatting and fix outdated info * address review feedback * 120 chars --- worlds/messenger/docs/en_The Messenger.md | 29 +++++++++++------------ worlds/messenger/docs/setup_en.md | 14 +++++------ worlds/messenger/options.py | 2 +- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/worlds/messenger/docs/en_The Messenger.md b/worlds/messenger/docs/en_The Messenger.md index f071ba1c1435..8248a4755d3f 100644 --- a/worlds/messenger/docs/en_The Messenger.md +++ b/worlds/messenger/docs/en_The Messenger.md @@ -49,30 +49,29 @@ for it. The groups you can use for The Messenger are: ## Other changes * The player can return to the Tower of Time HQ at any point by selecting the button from the options menu - * This can cause issues if used at specific times. Current known: - * During Boss fights - * After Courage Note collection (Corrupted Future chase) - * This is currently an expected action in logic. If you do need to teleport during this chase sequence, it - is recommended to quit to title and reload the save + * This can cause issues if used at specific times. If used in any of these known problematic areas, immediately +quit to title and reload the save. The currently known areas include: + * During Boss fights + * After Courage Note collection (Corrupted Future chase) * After reaching ninja village a teleport option is added to the menu to reach it quickly * Toggle Windmill Shuriken button is added to option menu once the item is received -* The mod option menu will also have a hint item button, as well as a release and collect button that are all placed when - the player fulfills the necessary conditions. +* The mod option menu will also have a hint item button, as well as a release and collect button that are all placed +when the player fulfills the necessary conditions. * After running the game with the mod, a config file (APConfig.toml) will be generated in your game folder that can be - used to modify certain settings such as text size and color. This can also be used to specify a player name that can't - be entered in game. +used to modify certain settings such as text size and color. This can also be used to specify a player name that can't +be entered in game. ## Known issues * Ruxxtin Coffin cutscene will sometimes not play correctly, but will still reward the item * If you receive the Magic Firefly while in Quillshroom Marsh, The De-curse Queen cutscene will not play. You can exit - to Searing Crags and re-enter to get it to play correctly. -* Sometimes upon teleporting back to HQ, Ninja will run left and enter a different portal than the one entered by the - player. This may also cause a softlock. +to Searing Crags and re-enter to get it to play correctly. +* Teleporting back to HQ, then returning to the same level you just left through a Portal can cause Ninja to run left +and enter a different portal than the one entered by the player or lead to other incorrect inputs, causing a soft lock * Text entry menus don't accept controller input * In power seal hunt mode, the chest must be opened by entering the shop from a level. Teleporting to HQ and opening the - chest will not work. +chest will not work. ## What do I do if I have a problem? -If you believe something happened that isn't intended, please get the `log.txt` from the folder of your game installation -and send a bug report either on GitHub or the [Archipelago Discord Server](http://archipelago.gg/discord) +If you believe something happened that isn't intended, please get the `log.txt` from the folder of your game +installation and send a bug report either on GitHub or the [Archipelago Discord Server](http://archipelago.gg/discord) diff --git a/worlds/messenger/docs/setup_en.md b/worlds/messenger/docs/setup_en.md index d986b70f9c98..c1770e747442 100644 --- a/worlds/messenger/docs/setup_en.md +++ b/worlds/messenger/docs/setup_en.md @@ -18,17 +18,17 @@ Read changes to the base game on the [Game Info Page](/games/The%20Messenger/inf 3. Click on "The Messenger" 4. Follow the prompts +These steps can also be followed to launch the game and check for mod updates after the initial setup. + ### Manual Installation 1. Download and install Courier Mod Loader using the instructions on the release page * [Latest release is currently 0.7.1](https://github.com/Brokemia/Courier/releases) 2. Download and install the randomizer mod 1. Download the latest TheMessengerRandomizerAP.zip from - [The Messenger Randomizer Mod AP releases page](https://github.com/alwaysintreble/TheMessengerRandomizerModAP/releases) +[The Messenger Randomizer Mod AP releases page](https://github.com/alwaysintreble/TheMessengerRandomizerModAP/releases) 2. Extract the zip file to `TheMessenger/Mods/` of your game's install location - * You cannot have both the non-AP randomizer and the AP randomizer installed at the same time. The AP randomizer - is backwards compatible, so the non-AP mod can be safely removed, and you can still play seeds generated from the - non-AP randomizer. + * You cannot have both the non-AP randomizer and the AP randomizer installed at the same time 3. Optionally, Backup your save game * On Windows 1. Press `Windows Key + R` to open run @@ -46,13 +46,13 @@ Read changes to the base game on the [Game Info Page](/games/The%20Messenger/inf 3. Enter connection info using the relevant option buttons * **The game is limited to alphanumerical characters, `.`, and `-`.** * This defaults to `archipelago.gg` and does not need to be manually changed if connecting to a game hosted on the - website. +website. * If using a name that cannot be entered in the in game menus, there is a config file (APConfig.toml) in the game - directory. When using this, all connection information must be entered in the file. +directory. When using this, all connection information must be entered in the file. 4. Select the `Connect to Archipelago` button 5. Navigate to save file selection 6. Start a new game - * If you're already connected, deleting a save will not disconnect you and is completely safe. + * If you're already connected, deleting an existing save will not disconnect you and is completely safe. ## Continuing a MultiWorld Game diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index 167bc285ded4..990975a926f9 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -89,7 +89,7 @@ class ShuffleTransitions(Choice): class Goal(Choice): - """Requirement to finish the game.""" + """Requirement to finish the game. To win with the power seal hunt goal, you must enter the Music Box through the shop chest.""" display_name = "Goal" option_open_music_box = 0 option_power_seal_hunt = 1