From 6e915394129935844c82295a8f89ead9f66b9019 Mon Sep 17 00:00:00 2001 From: oxmc <67136658+oxmc@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:36:56 -0400 Subject: [PATCH] Upload base --- .gitignore | 23 + LICENSE | 1 + README.md | 18 + build.gradle | 80 ++ gradle.properties | 3 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52271 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++ gradlew.bat | 90 ++ libs/mcef.jar | Bin 0 -> 343177 bytes src/main/java/net/montoyo/wd/SharedProxy.java | 115 ++ src/main/java/net/montoyo/wd/WebDisplays.java | 512 ++++++++ .../montoyo/wd/block/BlockKeyboardRight.java | 224 ++++ .../net/montoyo/wd/block/BlockPeripheral.java | 281 +++++ .../net/montoyo/wd/block/BlockScreen.java | 400 ++++++ .../java/net/montoyo/wd/block/WDBlock.java | 42 + .../montoyo/wd/block/WDBlockContainer.java | 40 + .../net/montoyo/wd/client/ClientProxy.java | 790 ++++++++++++ .../montoyo/wd/client/JSQueryDispatcher.java | 370 ++++++ .../montoyo/wd/client/ResourceModelPair.java | 28 + .../montoyo/wd/client/StaticStateMapper.java | 27 + .../java/net/montoyo/wd/client/WDScheme.java | 149 +++ .../montoyo/wd/client/gui/CommandHandler.java | 18 + .../montoyo/wd/client/gui/GuiKeyboard.java | 204 ++++ .../net/montoyo/wd/client/gui/GuiMinePad.java | 143 +++ .../wd/client/gui/GuiRedstoneCtrl.java | 80 ++ .../wd/client/gui/GuiScreenConfig.java | 503 ++++++++ .../net/montoyo/wd/client/gui/GuiServer.java | 711 +++++++++++ .../net/montoyo/wd/client/gui/GuiSetURL2.java | 121 ++ .../montoyo/wd/client/gui/GuiSubscribe.java | 15 + .../montoyo/wd/client/gui/RenderRecipe.java | 203 +++ .../net/montoyo/wd/client/gui/WDScreen.java | 367 ++++++ .../wd/client/gui/controls/BasicControl.java | 73 ++ .../wd/client/gui/controls/Button.java | 203 +++ .../wd/client/gui/controls/CheckBox.java | 136 +++ .../wd/client/gui/controls/Container.java | 157 +++ .../wd/client/gui/controls/Control.java | 282 +++++ .../wd/client/gui/controls/ControlGroup.java | 187 +++ .../montoyo/wd/client/gui/controls/Event.java | 15 + .../montoyo/wd/client/gui/controls/Icon.java | 91 ++ .../montoyo/wd/client/gui/controls/Label.java | 98 ++ .../montoyo/wd/client/gui/controls/List.java | 383 ++++++ .../wd/client/gui/controls/TextField.java | 307 +++++ .../wd/client/gui/controls/UpgradeGroup.java | 132 ++ .../wd/client/gui/controls/YTButton.java | 78 ++ .../wd/client/gui/loading/FillControl.java | 19 + .../wd/client/gui/loading/GuiLoader.java | 94 ++ .../wd/client/gui/loading/JsonAWrapper.java | 61 + .../wd/client/gui/loading/JsonOWrapper.java | 311 +++++ .../wd/client/renderers/IItemRenderer.java | 13 + .../wd/client/renderers/IModelBaker.java | 14 + .../renderers/LaserPointerRenderer.java | 120 ++ .../wd/client/renderers/MinePadRenderer.java | 136 +++ .../wd/client/renderers/ModelMinePad.java | 56 + .../wd/client/renderers/ScreenBaker.java | 144 +++ .../wd/client/renderers/ScreenRenderer.java | 206 ++++ .../net/montoyo/wd/core/AdvancementIcon.java | 24 + .../java/net/montoyo/wd/core/CCArguments.java | 90 ++ .../montoyo/wd/core/CCPeripheralProvider.java | 39 + .../net/montoyo/wd/core/CraftComponent.java | 44 + .../java/net/montoyo/wd/core/Criterion.java | 75 ++ .../montoyo/wd/core/DefaultPeripheral.java | 67 + .../net/montoyo/wd/core/DefaultUpgrade.java | 39 + .../net/montoyo/wd/core/HasAdvancement.java | 13 + .../net/montoyo/wd/core/IComputerArgs.java | 16 + .../java/net/montoyo/wd/core/IPeripheral.java | 17 + .../montoyo/wd/core/IScreenQueryHandler.java | 19 + .../java/net/montoyo/wd/core/IUpgrade.java | 22 + .../net/montoyo/wd/core/IWDDCapability.java | 13 + .../net/montoyo/wd/core/JSServerRequest.java | 54 + .../wd/core/MissingPermissionException.java | 28 + .../java/net/montoyo/wd/core/OCArguments.java | 46 + .../net/montoyo/wd/core/ScreenRights.java | 20 + .../net/montoyo/wd/core/WDCreativeTab.java | 25 + .../net/montoyo/wd/core/WDDCapability.java | 104 ++ .../java/net/montoyo/wd/data/GuiData.java | 40 + .../net/montoyo/wd/data/KeyboardData.java | 55 + .../net/montoyo/wd/data/RedstoneCtrlData.java | 43 + .../net/montoyo/wd/data/ScreenConfigData.java | 85 ++ .../java/net/montoyo/wd/data/ServerData.java | 40 + .../java/net/montoyo/wd/data/SetURLData.java | 63 + .../wd/entity/TileEntityCCInterface.java | 83 ++ .../wd/entity/TileEntityInterfaceBase.java | 401 ++++++ .../montoyo/wd/entity/TileEntityKeyboard.java | 73 ++ .../wd/entity/TileEntityOCInterface.java | 136 +++ .../wd/entity/TileEntityPeripheralBase.java | 137 +++ .../montoyo/wd/entity/TileEntityRCtrl.java | 43 + .../montoyo/wd/entity/TileEntityRedCtrl.java | 104 ++ .../montoyo/wd/entity/TileEntityScreen.java | 1084 +++++++++++++++++ .../montoyo/wd/entity/TileEntityServer.java | 50 + .../montoyo/wd/item/ItemCraftComponent.java | 51 + .../net/montoyo/wd/item/ItemLaserPointer.java | 37 + .../java/net/montoyo/wd/item/ItemLinker.java | 157 +++ .../net/montoyo/wd/item/ItemMinePad2.java | 132 ++ .../java/net/montoyo/wd/item/ItemMulti.java | 54 + .../montoyo/wd/item/ItemOwnershipThief.java | 137 +++ .../net/montoyo/wd/item/ItemPeripheral.java | 76 ++ .../wd/item/ItemScreenConfigurator.java | 80 ++ .../java/net/montoyo/wd/item/ItemUpgrade.java | 72 ++ src/main/java/net/montoyo/wd/item/WDItem.java | 26 + .../montoyo/wd/miniserv/AbstractClient.java | 161 +++ .../net/montoyo/wd/miniserv/Constants.java | 28 + .../montoyo/wd/miniserv/KeyParameters.java | 15 + .../montoyo/wd/miniserv/OutgoingPacket.java | 108 ++ .../montoyo/wd/miniserv/PacketHandler.java | 18 + .../net/montoyo/wd/miniserv/PacketID.java | 25 + .../net/montoyo/wd/miniserv/PacketReader.java | 60 + .../net/montoyo/wd/miniserv/PacketWriter.java | 62 + .../montoyo/wd/miniserv/client/Client.java | 384 ++++++ .../wd/miniserv/client/ClientTask.java | 56 + .../miniserv/client/ClientTaskCheckFile.java | 61 + .../miniserv/client/ClientTaskDeleteFile.java | 40 + .../wd/miniserv/client/ClientTaskGetFile.java | 157 +++ .../client/ClientTaskGetFileList.java | 44 + .../miniserv/client/ClientTaskGetQuota.java | 44 + .../miniserv/client/ClientTaskUploadFile.java | 120 ++ .../wd/miniserv/server/ClientManager.java | 107 ++ .../montoyo/wd/miniserv/server/Server.java | 240 ++++ .../wd/miniserv/server/ServerClient.java | 397 ++++++ .../net/montoyo/wd/net/DefaultHandler.java | 20 + src/main/java/net/montoyo/wd/net/Message.java | 21 + .../java/net/montoyo/wd/net/Messages.java | 74 ++ .../wd/net/client/CMessageACResult.java | 48 + .../wd/net/client/CMessageAddScreen.java | 115 ++ .../wd/net/client/CMessageCloseGui.java | 71 ++ .../wd/net/client/CMessageJSResponse.java | 86 ++ .../wd/net/client/CMessageMiniservKey.java | 47 + .../wd/net/client/CMessageOpenGui.java | 53 + .../wd/net/client/CMessageScreenUpdate.java | 276 +++++ .../wd/net/client/CMessageServerInfo.java | 44 + .../wd/net/server/SMessageACQuery.java | 76 ++ .../net/server/SMessageMiniservConnect.java | 62 + .../wd/net/server/SMessagePadCtrl.java | 106 ++ .../wd/net/server/SMessageRedstoneCtrl.java | 99 ++ .../wd/net/server/SMessageRequestTEData.java | 78 ++ .../wd/net/server/SMessageScreenCtrl.java | 372 ++++++ .../java/net/montoyo/wd/utilities/AABB.java | 77 ++ .../net/montoyo/wd/utilities/BlockSide.java | 53 + .../java/net/montoyo/wd/utilities/Bounds.java | 29 + .../montoyo/wd/utilities/DontSerialize.java | 15 + .../java/net/montoyo/wd/utilities/Log.java | 36 + .../net/montoyo/wd/utilities/Multiblock.java | 178 +++ .../montoyo/wd/utilities/NameUUIDPair.java | 72 ++ .../net/montoyo/wd/utilities/NibbleArray.java | 47 + .../net/montoyo/wd/utilities/Rotation.java | 28 + .../montoyo/wd/utilities/ScreenIterator.java | 64 + .../net/montoyo/wd/utilities/TypeData.java | 53 + .../java/net/montoyo/wd/utilities/Util.java | 196 +++ .../net/montoyo/wd/utilities/Vector2i.java | 44 + .../net/montoyo/wd/utilities/Vector3f.java | 186 +++ .../net/montoyo/wd/utilities/Vector3i.java | 236 ++++ .../net/montoyo/wd/utilities/VideoType.java | 89 ++ .../webdisplays/keyboard_cat.json | 13 + .../advancements/webdisplays/laser.json | 16 + .../webdisplays/link_peripheral.json | 13 + .../advancements/webdisplays/minepad.json | 21 + .../advancements/webdisplays/minepad2.json | 16 + .../advancements/webdisplays/pad_break.json | 25 + .../advancements/webdisplays/root.json | 27 + .../advancements/webdisplays/screen.json | 30 + .../advancements/webdisplays/upgrade.json | 13 + .../webdisplays/blockstates/keyboard.json | 8 + .../webdisplays/blockstates/peripheral.json | 33 + .../webdisplays/blockstates/screen.json | 6 + .../assets/webdisplays/gui/keyboard.json | 38 + .../assets/webdisplays/gui/redstonectrl.json | 72 ++ .../assets/webdisplays/gui/screencfg.json | 214 ++++ .../assets/webdisplays/gui/seturl.json | 53 + .../assets/webdisplays/html/blacklisted.html | 11 + .../assets/webdisplays/html/front.png | Bin 0 -> 1797 bytes .../resources/assets/webdisplays/html/io.html | 167 +++ .../assets/webdisplays/html/jquery.js | 2 + .../assets/webdisplays/html/main.html | 82 ++ .../assets/webdisplays/html/side.png | Bin 0 -> 479 bytes .../assets/webdisplays/html/wdlib.js | 108 ++ .../assets/webdisplays/html/webdisplays.png | Bin 0 -> 7072 bytes .../assets/webdisplays/lang/en_us.lang | 154 +++ .../assets/webdisplays/lang/fr_fr.lang | 154 +++ .../assets/webdisplays/lang/zh_cn.lang | 149 +++ .../webdisplays/models/block/ccinterface.json | 8 + .../webdisplays/models/block/kb_left.json | 503 ++++++++ .../webdisplays/models/block/kb_right.json | 477 ++++++++ .../webdisplays/models/block/ocinterface.json | 8 + .../webdisplays/models/block/rctrl.json | 6 + .../webdisplays/models/block/redctrl.json | 6 + .../webdisplays/models/block/screen_item.json | 6 + .../webdisplays/models/block/server.json | 12 + .../models/item/advicon_brokenpad.json | 6 + .../models/item/advicon_pigeon.json | 6 + .../webdisplays/models/item/advicon_wd.json | 6 + .../models/item/craftcomp_backlight.json | 6 + .../models/item/craftcomp_badextcard.json | 6 + .../models/item/craftcomp_batcell.json | 6 + .../models/item/craftcomp_batpack.json | 6 + .../models/item/craftcomp_extcard.json | 6 + .../models/item/craftcomp_laserdiode.json | 6 + .../models/item/craftcomp_peripheral.json | 6 + .../models/item/craftcomp_stonekey.json | 6 + .../models/item/craftcomp_upgrade.json | 6 + .../webdisplays/models/item/kb_inv.json | 6 + .../webdisplays/models/item/laserpointer.json | 6 + .../webdisplays/models/item/linker.json | 6 + .../webdisplays/models/item/minepad.json | 6 + .../webdisplays/models/item/ownerthief.json | 6 + .../webdisplays/models/item/screencfg.json | 6 + .../webdisplays/models/item/upgrade_gps.json | 7 + .../models/item/upgrade_lasermouse.json | 7 + .../models/item/upgrade_redinput.json | 7 + .../models/item/upgrade_redoutput.json | 7 + .../assets/webdisplays/recipes/backlight.json | 20 + .../assets/webdisplays/recipes/batcell.json | 24 + .../assets/webdisplays/recipes/batpack.json | 15 + .../webdisplays/recipes/ccinterface.json | 20 + .../assets/webdisplays/recipes/extcard.json | 31 + .../assets/webdisplays/recipes/keyboard.json | 23 + .../webdisplays/recipes/laserdiode.json | 27 + .../webdisplays/recipes/laserpointer.json | 25 + .../assets/webdisplays/recipes/linker.json | 26 + .../assets/webdisplays/recipes/minepad.json | 37 + .../assets/webdisplays/recipes/minepad2.json | 22 + .../webdisplays/recipes/ocinterface.json | 20 + .../webdisplays/recipes/peripheral.json | 22 + .../assets/webdisplays/recipes/rctrl.json | 20 + .../assets/webdisplays/recipes/redctrl1.json | 24 + .../assets/webdisplays/recipes/redctrl2.json | 20 + .../assets/webdisplays/recipes/screen.json | 33 + .../assets/webdisplays/recipes/screencfg.json | 22 + .../assets/webdisplays/recipes/server.json | 20 + .../assets/webdisplays/recipes/stonekey.json | 14 + .../assets/webdisplays/recipes/upgrade.json | 22 + .../webdisplays/recipes/upgrade_gps.json | 18 + .../webdisplays/recipes/upgrade_laser.json | 19 + .../webdisplays/recipes/upgrade_redin.json | 18 + .../webdisplays/recipes/upgrade_redout.json | 18 + .../resources/assets/webdisplays/sounds.json | 45 + .../assets/webdisplays/sounds/ironic.ogg | Bin 0 -> 59295 bytes .../assets/webdisplays/sounds/keyboard1.ogg | Bin 0 -> 8769 bytes .../assets/webdisplays/sounds/keyboard2.ogg | Bin 0 -> 11637 bytes .../assets/webdisplays/sounds/keyboard3.ogg | Bin 0 -> 11716 bytes .../assets/webdisplays/sounds/keyboard4.ogg | Bin 0 -> 9683 bytes .../assets/webdisplays/sounds/keyboard5.ogg | Bin 0 -> 7567 bytes .../assets/webdisplays/sounds/keyboard6.ogg | Bin 0 -> 9827 bytes .../assets/webdisplays/sounds/keyboard7.ogg | Bin 0 -> 7858 bytes .../assets/webdisplays/sounds/keyboard8.ogg | Bin 0 -> 9751 bytes .../webdisplays/sounds/screencfg_open.ogg | Bin 0 -> 5820 bytes .../assets/webdisplays/sounds/server.ogg | Bin 0 -> 37348 bytes .../assets/webdisplays/sounds/upgrade_add.ogg | Bin 0 -> 27697 bytes .../assets/webdisplays/sounds/upgrade_del.ogg | Bin 0 -> 17200 bytes .../webdisplays/textures/blocks/cci_front.png | Bin 0 -> 472 bytes .../webdisplays/textures/blocks/cci_side.png | Bin 0 -> 378 bytes .../textures/blocks/cci_topbot.png | Bin 0 -> 617 bytes .../webdisplays/textures/blocks/kb_base.png | Bin 0 -> 164 bytes .../webdisplays/textures/blocks/kb_key.png | Bin 0 -> 182 bytes .../webdisplays/textures/blocks/oci_front.png | Bin 0 -> 765 bytes .../webdisplays/textures/blocks/oci_side.png | Bin 0 -> 676 bytes .../textures/blocks/oci_topbot.png | Bin 0 -> 645 bytes .../webdisplays/textures/blocks/rctrl.png | Bin 0 -> 673 bytes .../webdisplays/textures/blocks/redctrl.png | Bin 0 -> 761 bytes .../webdisplays/textures/blocks/screen0.png | Bin 0 -> 116 bytes .../webdisplays/textures/blocks/screen1.png | Bin 0 -> 174 bytes .../webdisplays/textures/blocks/screen10.png | Bin 0 -> 205 bytes .../webdisplays/textures/blocks/screen11.png | Bin 0 -> 237 bytes .../webdisplays/textures/blocks/screen12.png | Bin 0 -> 218 bytes .../webdisplays/textures/blocks/screen13.png | Bin 0 -> 237 bytes .../webdisplays/textures/blocks/screen14.png | Bin 0 -> 233 bytes .../webdisplays/textures/blocks/screen15.png | Bin 0 -> 254 bytes .../webdisplays/textures/blocks/screen2.png | Bin 0 -> 182 bytes .../webdisplays/textures/blocks/screen3.png | Bin 0 -> 219 bytes .../webdisplays/textures/blocks/screen4.png | Bin 0 -> 175 bytes .../webdisplays/textures/blocks/screen5.png | Bin 0 -> 198 bytes .../webdisplays/textures/blocks/screen6.png | Bin 0 -> 216 bytes .../webdisplays/textures/blocks/screen7.png | Bin 0 -> 239 bytes .../webdisplays/textures/blocks/screen8.png | Bin 0 -> 178 bytes .../webdisplays/textures/blocks/screen9.png | Bin 0 -> 214 bytes .../webdisplays/textures/blocks/server.png | Bin 0 -> 520 bytes .../webdisplays/textures/blocks/server2.png | Bin 0 -> 351 bytes .../webdisplays/textures/gui/checkbox.png | Bin 0 -> 269 bytes .../textures/gui/checkbox_checked.png | Bin 0 -> 775 bytes .../assets/webdisplays/textures/gui/edges.png | Bin 0 -> 257 bytes .../webdisplays/textures/gui/server_bg.png | Bin 0 -> 817 bytes .../webdisplays/textures/gui/server_fg.png | Bin 0 -> 1314 bytes .../textures/items/advicon_brokenpad.png | Bin 0 -> 373 bytes .../textures/items/advicon_pigeon.png | Bin 0 -> 322 bytes .../webdisplays/textures/items/advicon_wd.png | Bin 0 -> 299 bytes .../webdisplays/textures/items/backlight.png | Bin 0 -> 619 bytes .../webdisplays/textures/items/badextcard.png | Bin 0 -> 382 bytes .../webdisplays/textures/items/batcell.png | Bin 0 -> 211 bytes .../webdisplays/textures/items/batpack.png | Bin 0 -> 228 bytes .../webdisplays/textures/items/extcard.png | Bin 0 -> 276 bytes .../assets/webdisplays/textures/items/gps.png | Bin 0 -> 246 bytes .../webdisplays/textures/items/input.png | Bin 0 -> 203 bytes .../webdisplays/textures/items/kb_inv.png | Bin 0 -> 251 bytes .../webdisplays/textures/items/laserdiode.png | Bin 0 -> 310 bytes .../textures/items/laserpointer.png | Bin 0 -> 368 bytes .../textures/items/laserpointer2.png | Bin 0 -> 268 bytes .../webdisplays/textures/items/linker.png | Bin 0 -> 634 bytes .../webdisplays/textures/items/minepad.png | Bin 0 -> 315 bytes .../webdisplays/textures/items/output.png | Bin 0 -> 200 bytes .../webdisplays/textures/items/ownerthief.png | Bin 0 -> 256 bytes .../webdisplays/textures/items/peripheral.png | Bin 0 -> 300 bytes .../webdisplays/textures/items/screencfg.png | Bin 0 -> 373 bytes .../webdisplays/textures/items/stonekey.png | Bin 0 -> 225 bytes .../webdisplays/textures/items/upgrade.png | Bin 0 -> 650 bytes .../textures/items/upgrade.png.mcmeta | 9 + .../webdisplays/textures/models/minepad.png | Bin 0 -> 341 bytes src/main/resources/mcmod.info | 16 + src/main/resources/pack.mcmeta | 6 + 307 files changed, 21459 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 libs/mcef.jar create mode 100644 src/main/java/net/montoyo/wd/SharedProxy.java create mode 100644 src/main/java/net/montoyo/wd/WebDisplays.java create mode 100644 src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java create mode 100644 src/main/java/net/montoyo/wd/block/BlockPeripheral.java create mode 100644 src/main/java/net/montoyo/wd/block/BlockScreen.java create mode 100644 src/main/java/net/montoyo/wd/block/WDBlock.java create mode 100644 src/main/java/net/montoyo/wd/block/WDBlockContainer.java create mode 100644 src/main/java/net/montoyo/wd/client/ClientProxy.java create mode 100644 src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java create mode 100644 src/main/java/net/montoyo/wd/client/ResourceModelPair.java create mode 100644 src/main/java/net/montoyo/wd/client/StaticStateMapper.java create mode 100644 src/main/java/net/montoyo/wd/client/WDScheme.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/CommandHandler.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/GuiServer.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/GuiSubscribe.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/WDScreen.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/BasicControl.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/Button.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/Container.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/Control.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/Event.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/Icon.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/Label.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/List.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/TextField.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/controls/YTButton.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/loading/FillControl.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/loading/GuiLoader.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/loading/JsonAWrapper.java create mode 100644 src/main/java/net/montoyo/wd/client/gui/loading/JsonOWrapper.java create mode 100644 src/main/java/net/montoyo/wd/client/renderers/IItemRenderer.java create mode 100644 src/main/java/net/montoyo/wd/client/renderers/IModelBaker.java create mode 100644 src/main/java/net/montoyo/wd/client/renderers/LaserPointerRenderer.java create mode 100644 src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java create mode 100644 src/main/java/net/montoyo/wd/client/renderers/ModelMinePad.java create mode 100644 src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java create mode 100644 src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java create mode 100644 src/main/java/net/montoyo/wd/core/AdvancementIcon.java create mode 100644 src/main/java/net/montoyo/wd/core/CCArguments.java create mode 100644 src/main/java/net/montoyo/wd/core/CCPeripheralProvider.java create mode 100644 src/main/java/net/montoyo/wd/core/CraftComponent.java create mode 100644 src/main/java/net/montoyo/wd/core/Criterion.java create mode 100644 src/main/java/net/montoyo/wd/core/DefaultPeripheral.java create mode 100644 src/main/java/net/montoyo/wd/core/DefaultUpgrade.java create mode 100644 src/main/java/net/montoyo/wd/core/HasAdvancement.java create mode 100644 src/main/java/net/montoyo/wd/core/IComputerArgs.java create mode 100644 src/main/java/net/montoyo/wd/core/IPeripheral.java create mode 100644 src/main/java/net/montoyo/wd/core/IScreenQueryHandler.java create mode 100644 src/main/java/net/montoyo/wd/core/IUpgrade.java create mode 100644 src/main/java/net/montoyo/wd/core/IWDDCapability.java create mode 100644 src/main/java/net/montoyo/wd/core/JSServerRequest.java create mode 100644 src/main/java/net/montoyo/wd/core/MissingPermissionException.java create mode 100644 src/main/java/net/montoyo/wd/core/OCArguments.java create mode 100644 src/main/java/net/montoyo/wd/core/ScreenRights.java create mode 100644 src/main/java/net/montoyo/wd/core/WDCreativeTab.java create mode 100644 src/main/java/net/montoyo/wd/core/WDDCapability.java create mode 100644 src/main/java/net/montoyo/wd/data/GuiData.java create mode 100644 src/main/java/net/montoyo/wd/data/KeyboardData.java create mode 100644 src/main/java/net/montoyo/wd/data/RedstoneCtrlData.java create mode 100644 src/main/java/net/montoyo/wd/data/ScreenConfigData.java create mode 100644 src/main/java/net/montoyo/wd/data/ServerData.java create mode 100644 src/main/java/net/montoyo/wd/data/SetURLData.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityCCInterface.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityInterfaceBase.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityKeyboard.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityOCInterface.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityPeripheralBase.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityRCtrl.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityRedCtrl.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityScreen.java create mode 100644 src/main/java/net/montoyo/wd/entity/TileEntityServer.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemCraftComponent.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemLaserPointer.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemLinker.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemMinePad2.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemMulti.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemPeripheral.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemScreenConfigurator.java create mode 100644 src/main/java/net/montoyo/wd/item/ItemUpgrade.java create mode 100644 src/main/java/net/montoyo/wd/item/WDItem.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/AbstractClient.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/Constants.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/KeyParameters.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/OutgoingPacket.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/PacketHandler.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/PacketID.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/PacketReader.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/PacketWriter.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/client/Client.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/client/ClientTask.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/client/ClientTaskCheckFile.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/client/ClientTaskDeleteFile.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/client/ClientTaskGetFile.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/client/ClientTaskGetFileList.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/client/ClientTaskGetQuota.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/client/ClientTaskUploadFile.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/server/ClientManager.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/server/Server.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java create mode 100644 src/main/java/net/montoyo/wd/net/DefaultHandler.java create mode 100644 src/main/java/net/montoyo/wd/net/Message.java create mode 100644 src/main/java/net/montoyo/wd/net/Messages.java create mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageACResult.java create mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java create mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageCloseGui.java create mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageJSResponse.java create mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageMiniservKey.java create mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageOpenGui.java create mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageScreenUpdate.java create mode 100644 src/main/java/net/montoyo/wd/net/client/CMessageServerInfo.java create mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageACQuery.java create mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageMiniservConnect.java create mode 100644 src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java create mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageRedstoneCtrl.java create mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageRequestTEData.java create mode 100644 src/main/java/net/montoyo/wd/net/server/SMessageScreenCtrl.java create mode 100644 src/main/java/net/montoyo/wd/utilities/AABB.java create mode 100644 src/main/java/net/montoyo/wd/utilities/BlockSide.java create mode 100644 src/main/java/net/montoyo/wd/utilities/Bounds.java create mode 100644 src/main/java/net/montoyo/wd/utilities/DontSerialize.java create mode 100644 src/main/java/net/montoyo/wd/utilities/Log.java create mode 100644 src/main/java/net/montoyo/wd/utilities/Multiblock.java create mode 100644 src/main/java/net/montoyo/wd/utilities/NameUUIDPair.java create mode 100644 src/main/java/net/montoyo/wd/utilities/NibbleArray.java create mode 100644 src/main/java/net/montoyo/wd/utilities/Rotation.java create mode 100644 src/main/java/net/montoyo/wd/utilities/ScreenIterator.java create mode 100644 src/main/java/net/montoyo/wd/utilities/TypeData.java create mode 100644 src/main/java/net/montoyo/wd/utilities/Util.java create mode 100644 src/main/java/net/montoyo/wd/utilities/Vector2i.java create mode 100644 src/main/java/net/montoyo/wd/utilities/Vector3f.java create mode 100644 src/main/java/net/montoyo/wd/utilities/Vector3i.java create mode 100644 src/main/java/net/montoyo/wd/utilities/VideoType.java create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/keyboard_cat.json create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/laser.json create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/link_peripheral.json create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/minepad.json create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/minepad2.json create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/pad_break.json create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/root.json create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/screen.json create mode 100644 src/main/resources/assets/webdisplays/advancements/webdisplays/upgrade.json create mode 100644 src/main/resources/assets/webdisplays/blockstates/keyboard.json create mode 100644 src/main/resources/assets/webdisplays/blockstates/peripheral.json create mode 100644 src/main/resources/assets/webdisplays/blockstates/screen.json create mode 100644 src/main/resources/assets/webdisplays/gui/keyboard.json create mode 100644 src/main/resources/assets/webdisplays/gui/redstonectrl.json create mode 100644 src/main/resources/assets/webdisplays/gui/screencfg.json create mode 100644 src/main/resources/assets/webdisplays/gui/seturl.json create mode 100644 src/main/resources/assets/webdisplays/html/blacklisted.html create mode 100644 src/main/resources/assets/webdisplays/html/front.png create mode 100644 src/main/resources/assets/webdisplays/html/io.html create mode 100644 src/main/resources/assets/webdisplays/html/jquery.js create mode 100644 src/main/resources/assets/webdisplays/html/main.html create mode 100644 src/main/resources/assets/webdisplays/html/side.png create mode 100644 src/main/resources/assets/webdisplays/html/wdlib.js create mode 100644 src/main/resources/assets/webdisplays/html/webdisplays.png create mode 100644 src/main/resources/assets/webdisplays/lang/en_us.lang create mode 100644 src/main/resources/assets/webdisplays/lang/fr_fr.lang create mode 100644 src/main/resources/assets/webdisplays/lang/zh_cn.lang create mode 100644 src/main/resources/assets/webdisplays/models/block/ccinterface.json create mode 100644 src/main/resources/assets/webdisplays/models/block/kb_left.json create mode 100644 src/main/resources/assets/webdisplays/models/block/kb_right.json create mode 100644 src/main/resources/assets/webdisplays/models/block/ocinterface.json create mode 100644 src/main/resources/assets/webdisplays/models/block/rctrl.json create mode 100644 src/main/resources/assets/webdisplays/models/block/redctrl.json create mode 100644 src/main/resources/assets/webdisplays/models/block/screen_item.json create mode 100644 src/main/resources/assets/webdisplays/models/block/server.json create mode 100644 src/main/resources/assets/webdisplays/models/item/advicon_brokenpad.json create mode 100644 src/main/resources/assets/webdisplays/models/item/advicon_pigeon.json create mode 100644 src/main/resources/assets/webdisplays/models/item/advicon_wd.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_backlight.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_badextcard.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_batcell.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_batpack.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_extcard.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_laserdiode.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_peripheral.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_stonekey.json create mode 100644 src/main/resources/assets/webdisplays/models/item/craftcomp_upgrade.json create mode 100644 src/main/resources/assets/webdisplays/models/item/kb_inv.json create mode 100644 src/main/resources/assets/webdisplays/models/item/laserpointer.json create mode 100644 src/main/resources/assets/webdisplays/models/item/linker.json create mode 100644 src/main/resources/assets/webdisplays/models/item/minepad.json create mode 100644 src/main/resources/assets/webdisplays/models/item/ownerthief.json create mode 100644 src/main/resources/assets/webdisplays/models/item/screencfg.json create mode 100644 src/main/resources/assets/webdisplays/models/item/upgrade_gps.json create mode 100644 src/main/resources/assets/webdisplays/models/item/upgrade_lasermouse.json create mode 100644 src/main/resources/assets/webdisplays/models/item/upgrade_redinput.json create mode 100644 src/main/resources/assets/webdisplays/models/item/upgrade_redoutput.json create mode 100644 src/main/resources/assets/webdisplays/recipes/backlight.json create mode 100644 src/main/resources/assets/webdisplays/recipes/batcell.json create mode 100644 src/main/resources/assets/webdisplays/recipes/batpack.json create mode 100644 src/main/resources/assets/webdisplays/recipes/ccinterface.json create mode 100644 src/main/resources/assets/webdisplays/recipes/extcard.json create mode 100644 src/main/resources/assets/webdisplays/recipes/keyboard.json create mode 100644 src/main/resources/assets/webdisplays/recipes/laserdiode.json create mode 100644 src/main/resources/assets/webdisplays/recipes/laserpointer.json create mode 100644 src/main/resources/assets/webdisplays/recipes/linker.json create mode 100644 src/main/resources/assets/webdisplays/recipes/minepad.json create mode 100644 src/main/resources/assets/webdisplays/recipes/minepad2.json create mode 100644 src/main/resources/assets/webdisplays/recipes/ocinterface.json create mode 100644 src/main/resources/assets/webdisplays/recipes/peripheral.json create mode 100644 src/main/resources/assets/webdisplays/recipes/rctrl.json create mode 100644 src/main/resources/assets/webdisplays/recipes/redctrl1.json create mode 100644 src/main/resources/assets/webdisplays/recipes/redctrl2.json create mode 100644 src/main/resources/assets/webdisplays/recipes/screen.json create mode 100644 src/main/resources/assets/webdisplays/recipes/screencfg.json create mode 100644 src/main/resources/assets/webdisplays/recipes/server.json create mode 100644 src/main/resources/assets/webdisplays/recipes/stonekey.json create mode 100644 src/main/resources/assets/webdisplays/recipes/upgrade.json create mode 100644 src/main/resources/assets/webdisplays/recipes/upgrade_gps.json create mode 100644 src/main/resources/assets/webdisplays/recipes/upgrade_laser.json create mode 100644 src/main/resources/assets/webdisplays/recipes/upgrade_redin.json create mode 100644 src/main/resources/assets/webdisplays/recipes/upgrade_redout.json create mode 100644 src/main/resources/assets/webdisplays/sounds.json create mode 100644 src/main/resources/assets/webdisplays/sounds/ironic.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/keyboard1.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/keyboard2.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/keyboard3.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/keyboard4.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/keyboard5.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/keyboard6.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/keyboard7.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/keyboard8.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/screencfg_open.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/server.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/upgrade_add.ogg create mode 100644 src/main/resources/assets/webdisplays/sounds/upgrade_del.ogg create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/cci_front.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/cci_side.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/cci_topbot.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/kb_base.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/kb_key.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/oci_front.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/oci_side.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/oci_topbot.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/rctrl.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/redctrl.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen0.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen1.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen10.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen11.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen12.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen13.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen14.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen15.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen2.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen3.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen4.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen5.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen6.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen7.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen8.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/screen9.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/server.png create mode 100644 src/main/resources/assets/webdisplays/textures/blocks/server2.png create mode 100644 src/main/resources/assets/webdisplays/textures/gui/checkbox.png create mode 100644 src/main/resources/assets/webdisplays/textures/gui/checkbox_checked.png create mode 100644 src/main/resources/assets/webdisplays/textures/gui/edges.png create mode 100644 src/main/resources/assets/webdisplays/textures/gui/server_bg.png create mode 100644 src/main/resources/assets/webdisplays/textures/gui/server_fg.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/advicon_brokenpad.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/advicon_pigeon.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/advicon_wd.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/backlight.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/badextcard.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/batcell.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/batpack.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/extcard.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/gps.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/input.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/kb_inv.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/laserdiode.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/laserpointer.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/laserpointer2.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/linker.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/minepad.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/output.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/ownerthief.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/peripheral.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/screencfg.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/stonekey.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/upgrade.png create mode 100644 src/main/resources/assets/webdisplays/textures/items/upgrade.png.mcmeta create mode 100644 src/main/resources/assets/webdisplays/textures/models/minepad.png create mode 100644 src/main/resources/mcmod.info create mode 100644 src/main/resources/pack.mcmeta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23d710b --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project + +# idea +out +*.ipr +*.iws +*.iml +.idea + +# gradle +build +.gradle + +# other +eclipse +run +/_OLD diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b2669d7 --- /dev/null +++ b/LICENSE @@ -0,0 +1 @@ +This mod and its source code is now in public domain. Feel free to do whatever you want with it; make forks, distribute it... whatever I would appreciate it, of course, if you credited me 😊 Thank you! diff --git a/README.md b/README.md new file mode 100644 index 0000000..6438132 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# WebDisplays for Minecraft 1.12.2 +This is the WebDisplays mod for Minecraft 1.12.2. I don't have time to maintain it anymore, so I changed the license recently and anybody is welcome to create forks and/or re-distribute it. For more info see [LICENSE](LICENSE). + +### Wiki +* The Wiki that details all blocks/items can be found on my website https://montoyo.net/wdwiki/ + +### Things before release +* Release ready. Targeted release date: 17/02/2018. + +### Delayed things +* Plugin API +* The Shop +* CC Interface, if CC gets updated... +* Center camera to screen when using keyboard +* minePad management: check GuiContainer.draggedStack for minePad +* In-game command to add/remove blacklisted domains +* Config: RPMP (Real pixels per Minecraft pixels) +* Disable miniserv in solo diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c21c3eb --- /dev/null +++ b/build.gradle @@ -0,0 +1,80 @@ +buildscript { + repositories { + jcenter() + maven { url = "http://files.minecraftforge.net/maven" } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + } +} +apply plugin: 'net.minecraftforge.gradle.forge' +//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. + + +version = "1.12.2-1.4" +group = "net.montoyo.wd" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = "webdisplays" + +sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. +compileJava { + sourceCompatibility = targetCompatibility = '1.8' +} + +minecraft { + version = "1.12.2-14.23.5.2768" + runDir = "run" + + // the mappings can be changed at any time, and must be in the following format. + // snapshot_YYYYMMDD snapshot are built nightly. + // stable_# stables are built at the discretion of the MCP team. + // Use non-default mappings at your own risk. they may not always work. + // simply re-run your setup task after changing the mappings to update your workspace. + mappings = "snapshot_20171003" + makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. +} + +repositories { + mavenCentral() + maven { + name = "forge" + url = "http://files.minecraftforge.net/maven" + } + maven { + name = "ComputerCraft and CC:Tweaked" + url = 'https://maven.squiddev.cc/' + } + maven { + name = "OpenComputers" + url = "http://maven.cil.li/" + } +} + +dependencies { + deobfCompile "org.squiddev:cc-tweaked-1.12.2:1.89.2" + compile "li.cil.oc:OpenComputers:MC1.12.2-1.7.5.+:api" +} + +jar { + exclude 'org/**' + exclude 'net/montoyo/mcef/**' + exclude 'assets/mcef/**' +} + +processResources { + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version':project.version, 'mcversion':project.minecraft.version + } + + // copy everything else except the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..e9b9fd5 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..30d399d8d2bf522ff5de94bf434a7cc43a9a74b5 GIT binary patch literal 52271 zcmafaW0a=B^559DjdyI@wy|T|wr$(CJv+9!W822gY&N+!|K#4>Bz;ajPk*RBjZ;RV75EK*;p4^!@(BB5~-#>pF^k0$_Qx&35mhPenc zNjoahrs}{XFFPtR8Xs)MInR7>x_1Kpw+a8w@n0(g``fp7GXFmo^}qAL{*%Yt$3(FfIbReeZ6|xbrftHf0>dl5l+$$VLbG+m|;Uk##see6$CK4I^ ziDe}0)5eiLr!R5hk6u9aKT36^C>3`nJ0l07RQ1h438axccsJk z{kKyd*$G`m`zrtre~(!7|FcIGPiGfXTSX`PzlY^wY3ls9=iw>j>SAGP=VEDW=wk2m zk3%R`v9(7LLh{1^gpVy8R2tN#ZmfE#9!J?P7~nw1MnW^mRmsT;*cyVG*SVY6CqC3a zMccC8L%tQqGz+E@0i)gy&0g_7PV@3~zaE~h-2zQ|SdqjALBoQBT2pPYH^#-Hv8!mV z-r%F^bXb!hjQwm2^oEuNkVelqJLf029>h5N1XzEvYb=HA`@uO_*rgQZG`tKgMrKh~aq~ z6oX{k?;tz&tW3rPe+`Q8F5(m5dJHyv`VX0of2nf;*UaVsiMR!)TjB`jnN2)6z~3CK@xZ_0x>|31=5G$w!HcYiYRDdK3mtO1GgiFavDsn&1zs zF|lz}sx*wA(IJoVYnkC+jmhbirgPO_Y1{luB>!3Jr2eOB{X?e2Vh8>z7F^h$>GKmb z?mzET;(r({HD^;NNqbvUS$lhHSBHOWI#xwT0Y?b!TRic{ z>a%hUpta3P2TbRe_O;s5@KjZ#Dijg4f=MWJ9euZnmd$UCUNS4I#WDUT2{yhVWt#Ee z?upJB_de&7>FHYm0Y4DU!Kxso=?RabJ*qsZ2r4K8J#pQ)NF?zFqW#XG1fX6dFC}qh z3%NlVXc@Re3vkXi*-&m)~SYS?OA8J?ygD3?N}Pq zrt_G*8B7^(uS7$OrAFL5LvQdQE2o40(6v`se%21Njk4FoLV-L0BN%%w40%k6Z1ydO zb@T(MiW@?G-j^j5Ypl@!r`Vw&lkJtR3B#%N~=C z@>#A{z8xFL=2)?mzv;5#+HAFR7$3BMS-F=U<&^217zGkGFFvNktqX z3z79GH^!htJe$D-`^(+kG*);7qocnfnPr^ieTpx&P;Z$+{aC8@h<0DDPkVx`_J~J> zdvwQxbiM1B{J6_V?~PNusoB5B88S%q#$F@Fxs4&l==UW@>9w2iU?9qMOgQWCl@7C* zsbi$wiEQEnaum!v49B_|^IjgM-TqMW!vBhhvP?oB!Ll4o-j?u3JLLFHM4ZVfl9Y_L zAjz@_3X5r=uaf|nFreX#gCtWU44~pA!yjZNXiZkoHhE$l@=ZTuxcLh53KdMOfanVe zPEX(#8GM7#%2*2}5rrdBk8p#FmzpIC>%1I9!2nRakS|^I*QHbG_^4<=p)(YOKvsTp zE#DzUI>Y&g)4mMaU6Bhrm8rSC{F_4J9sJlF0S5y5_=^l!{?W_n&SPj&7!dEvLzNIRMZBYyYU@Qftts7Zr7r>W- zqqk46|LEF|&6bn#CE~yMbiF&vEoLUA(}WzwmXH_=<~|I(9~{AE$ireF7~XBqPV2)* zcqjOCdi&>tUEuq31s(|TFqx>Wuo(ooWO(sd!W~Hu@AXg=iQgq^O3Lv9xH$vx*vrgDAirQqs9_DLS1e45HcUPdEMziO?Mm1v!)n93L%REy=7 zUxcX!jo!vyl_l0)O(Y~OT``;8mB(tcf}`Rh^weqPnDVDe-ngsZ~C z`onh0WLdaShAAb-3b{hT5ej9a$POQ9;RlPy}IYzKyv+8-HzB7fV!6X@a_T61qZ zWqb&&ip*@{;D-1vR3F2Q&}%Q>TFH&2n?2w8u8g=Y{!|;>P%<@AlshvM;?r7I)yXG% z^IpXZ(~)V*j^~sOG#cWCa+b8LC1IgqFx+Mq$I`6VYGE#AUajA9^$u-{0X#4h49a77 zH>d>h3P@u!{7h2>1j+*KYSNrKE-Q(z`C;n9N>mfdrlWo$!dB35;G4eTWA}(aUj&mNyi-N+lcYGpA zt1<~&u`$tIurZ2-%Tzb1>mb(~B8;f^0?FoPVdJ`NCAOE~hjEPS) z&r7EY4JrG~azq$9$V*bhKxeC;tbBnMds48pDuRy=pHoP*GfkO(UI;rT;Lg9ZH;JU~ zO6gTCRuyEbZ97jQyV7hM!Nfwr=jKjYsR;u8o(`(;qJ(MVo(yA<3kJximtAJjOqT=3 z8Bv-^`)t{h)WUo&t3alsZRJXGPOk&eYf}k2JO!7Au8>cvdJ3wkFE3*WP!m_glB-Rt z!uB>HV9WGcR#2n(rm=s}ulY7tXn5hC#UrNob)-1gzn-KH8T?GEs+JBEU!~9Vg*f6x z_^m1N20Do}>UIURE4srAMM6fAdzygdCLwHe$>CsoWE;S2x@C=1PRwT438P@Vt(Nk` zF~yz7O0RCS!%hMmUSsKwK$)ZtC#wO|L4GjyC?|vzagOP#7;W3*;;k?pc!CA=_U8>% z%G^&5MtFhvKq}RcAl))WF8I#w$So?>+_VEdDm_2=l^K320w~Bn2}p+4zEOt#OjZ6b zxEYoTYzvs$%+ZYwj;mZ@fF42F1-Hb<&72{1J)(D~VyVpo4!dq259t-_Oo3Yg7*R`N zUg!js4NRyfMbS*NLEF}rGrlXz0lHz))&&+B#Tdo@wlh-Q8wr7~9)$;s9+yJH0|m=F zSD9mUW>@HLt}mhAApYrhdviKhW`BfNU3bPSz=hD+!q`t*IhG+Z4XK;_e#AkF5 z&(W7iUWF4PNQ+N!-b-^3B$J4KeA1}&ta@HK=o2khx!I&g#2Y&SWo-;|KXDw!Xb)mP z$`WzPA!F(h*E=QP4;hu7@8J&T|ZPQ2H({7Vau6&g;mer3q?1K!!^`|0ld26 zq|J&h7L-!zn!GnYhjp`c7rG>kd1Y%8yJE9M0-KtN=)8mXh45d&i*bEmm%(4~f&}q@ z1uq)^@SQ~L?aVCAU7ZYFEbZ<730{&m?Un?Q!pxI7DwA^*?HloDysHW{L!JY!oQ8WMK(vT z@fFakL6Ijo$S$GH;cfXcoNvwVc8R7bQnOX2N1s$2fbX@qzTv>748In?JUSk@41;-8 zBw`fUVf$Jxguy{m1t_Z&Q6N$Ww*L9e%6V*r3Yp8&jVpxyM+W?l0km=pwm21ch9}+q z$Z&eb9BARV1?HVgjAzhy);(y1l6)+YZ3+u%f@Y3stu5sSYjQl;3DsM719wz98y4uClWqeD>l(n@ce)pal~-24U~{wq!1Z_ z2`t+)Hjy@nlMYnUu@C`_kopLb7Qqp+6~P=36$O!d2oW=46CGG54Md`6LV3lnTwrBs z!PN}$Kd}EQs!G22mdAfFHuhft!}y;8%)h&@l7@DF0|oy?FR|*E&Zuf=e{8c&hTNu# z6{V#^p+GD@A_CBDV5sM%OA*NwX@k1t?2|)HIBeKk(9!eX#J>jN;)XQ%xq^qVe$I}& z{{cL^a}>@*ZD$Ve)sJVYC!nrAHpV~JiCH3b7AQfAsEfzB$?RgU%+x7jQ_5XQ8Gf*N`i<1mZE zg6*_1dR3B`$&9CxHzk{&&Hf1EHD*JJF2glyBR+hBPnwP@PurN`F80!5{J57z;=kAc za65ouFAve7QEOmfcKg*~HZ04-Ze%9f)9pgrVMf7jcVvOdS{rf+MOsayTFPT}3}YuH z$`%^f$}lBC8IGAma+=j9ruB&42ynhH!5)$xu`tu7idwGOr&t=)a=Y2Sib&Di`^u9X zHQ=liR@by^O`ph|A~{#yG3hHXkO>V|(%=lUmf3vnJa#c%Hc>UNDJZRJ91k%?wnCnF zLJzR5MXCp)Vwu3Ew{OKUb?PFEl6kBOqCd&Qa4q=QDD-N$;F36Z_%SG}6{h2GX6*57 zRQIbqtpQeEIc4v{OI+qzMg_lH=!~Ow%Xx9U+%r9jhMU=7$;L7yJt)q+CF#lHydiPP zQSD=AtDqdsr4G!m%%IauT@{MQs+n7zk)^q5!VQrp?mFajX%NQT#yG9%PTFP>QNtfTM%6+b^n%O`Bk74Ih| zb>Fh1ic{a<8g<{oJzd|@J)fVVqs&^DGPR-*mj?!Z?nr<f)C8^oI(N4feAst}o?y z-9Ne339xN7Lt|Tc50a48C*{21Ii$0a-fzG1KNwDxfO9wkvVTRuAaF41CyVgT?b46; zQvjU!6L0pZM%DH&;`u`!x+!;LaPBfT8{<_OsEC5>>MoJQ5L+#3cmoiH9=67gZa;rvlDJ7_(CYt3KSR$Q#UR*+0hyk z>Dkd2R$q~_^IL2^LtY|xNZR(XzMZJ_IFVeNSsy;CeEVH|xuS#>itf+~;XXYSZ9t%1moPWayiX=iA z!aU~)WgV!vNTU=N;SpQ((yz#I1R#rZ&q!XD=wdlJk4L&BRcq(>6asB_j$7NKLR%v; z9SSp$oL7O|kne`e@>Bdf7!sJ*MqAtBlyt9;OP3UU1O=u6eGnFWKT%2?VHlR86@ugy z>K)(@ICcok6NTTr-Jh7rk=3jr9`ao!tjF;r~GXtH~_&Wb9J^ zd%FYu_4^3_v&odTH~%mHE;RYmeo+x^tUrB>x}Is&K{f+57e-7Y%$|uN%mf;l5Za95 zvojcY`uSCH~kno zs4pMlci*Y>O_pcxZY#?gt1^b-;f(1l9}Ov7ZpHtxfbVMHbX;579A>16C&H5Q>pVpH5LLr<_=!7ZfX23b1L4^WhtD?5WG;^zM}T>FUHRJv zK~xq88?P);SX-DS*1LmYUkC?LNwPRXLYNoh0Qwj@mw9OP&u{w=bKPQ)_F0-ptGcL0 zhPPLKIbHq|SZ`@1@P5=G^_@i+U2QOp@MX#G9OI20NzJm60^OE;^n?A8CH+XMS&3ek zP#E7Y==p;4UucIV{^B`LaH~>g6WqcfeuB#1&=l!@L=UMoQ0$U*q|y(}M(Y&P$Xs&| zJ&|dUymE?`x$DBj27PcDTJJn0`H8>7EPTV(nLEIsO&9Cw1Dc&3(&XFt9FTc{-_(F+ z-}h1wWjyG5(ihWu_3qwi; zAccCjB3fJjK`p=0VQo!nPkr0fT|FG;gbH}|1p`U>guv9M8g2phJBkPC`}ISoje6+? zvX|r5a%Y-@WjDM1&-dIH2XM}4{{d&zAVJQEG9HB8FjX&+h*H=wK=xOgNh8WgwBxW+ z0=^CzC4|O_GM>^_%C!!2jd&x*n2--yT>PZJ`Mok6Vf4YFqYp@a%)W}F4^DpKh`Cr7 z{>Z7xw-4UfT@##s#6h%@4^s^7~$}p2$v^iR5uJljApd9%#>QuxvX+CSZv18MPeXPCizQ*bm);q zWhnVEeM}dlCQP*^8;Q7OM|SSgP+J;DQy|bBhuFwJ2y*^|dBwz96-H;~RNsc}#i= zwu`Tp4$bwRVb7dxGr_e1+bJEc=mxLxN_f>hwb#^|hNdewcYdqXPrOxDE;|mP#H|a% z{u8#Vn}zVP(yJ}+-dx;!8<1in=Q8KsU%Q5CFV%5mGi8L;)*m%Vs0+S`ZY(z7aZ$VCjp?{r>C<9@$zVN;LVhxzPEdDPdb8g<)pckA z?mG@Ri>ode(r|hjNwV#*{!B^l2KO@4A+!X;#PW#?v2U!ydYIFHiXC3>i2k7{VTfji>h z8-(^;x!>f)Qh$mlD-z^1Nxu})XPbN=AUsb%qhmTKjd=1BjKr(L9gb1w4Y8p+duWfS zU>%C>*lCR@+(ku!(>_SA6=4CeM|$k4-zv|3!wHy+H&Oc$SHr%QM(IaBS@#s}O?R7j ztiQ>j^{X)jmTPq-%fFDxtm%p|^*M;>yA;3WM(rLV_PiB~#Eaicp!*NztJNH;q5BW$ zqqlfSq@C0A7@#?oRbzrZTNgP1*TWt(1qHii6cp5U@n|vsFxJ|AG5;)3qdrM4JElmN z+$u4wOW7(>$mMVRVJHsR8roIe8Vif+ml3~-?mpRos62r0k#YjdjmK;rHd{;QxB?JV zyoIBkfqYBZ!LZDdOZArQlgXUGmbpe7B-y7MftT;>%aM1fy3?^CuC{al$2-tfcA?d) z<=t7}BWsxH3ElE^?E&|f{ODX&bs+Ax>axcdY5oQ`8hT)YfF%_1-|p*a9$R~C=-sT| zRA~-Q$_9|G(Pf9I+y!zc>fu)&JACoq&;PMB^E;gIj6WeU=I!+scfSr}I%oD1fh+AQ zB^Q^b@ti5`bhx+(5XG5*+##vV>30UCR>QLYxHYY~k!AR`O6O_a3&wuW61eyHaq;HL zqy@?I*fmB)XY;Z@RH^IR|6m1nwWv>PDONtZV-{3@RkM_JcroRNLTM9?=CI}l%p86A zdxv|{zFWNI;L8K9hFSxD+`-pwvnyS|O?{H-rg6dPH<3oXgF0vU5;~yXtBUXd>lDs~ zX!y3-Pr9l;1Q^Z<15_k1kg|fR%aJKzwkIyED%CdxoXql=^QB;^*=2nVfi{w?0c@Dj z_MQEYjDpf^`%)$|4h>XnnKw05e5p4Jy69{uJ5p|PzY+S?FF~KWAd0$W<`;?=M+^d zhH&>)@D9v1JH2DP?tsjABL+OLE2@IB)sa@R!iKTz4AHYhMiArm)d-*zitT+1e4=B( zUpObeG_s*FMg$#?Kn4%GKd{(2HnXx*@phT7rEV?dhE>LGR3!C9!M>3DgjkVR>W)p3 zCD0L3Ex5-#aJQS6lJXP9_VsQaki5#jx}+mM1`#(C8ga~rPL{2Z;^^b+0{X)_618Sw z0y6LTkk;)quIAYpPY{)fHJLk?)(vxt?roO24{C!ck}A)_$gGS>g!V^@`F#wg+%Cok zzt6hJE|ESs@S^oHMp3H?3SzqBh4AN(5SGi#(HCarl^(Jli#(%PaSP9sPJ-9plwZv{ z1lkTGk4UAXYP^>V+4;nQ4A~n-<+1N)1lPzXIbG{Q;e3~T_=Trak{WyjW+n!zhT*%)q?gx zTl4(Gf6Y|ALS!H$8O?=}AlN=^3yZCTX@)9g5b_fif_E{lWS~0t`KpH8kkSnWWz+G1 zjFrz}gTnQ2k-`oag*031Nj7=MZfP}gvrNvv_crWzf9Cdzv^LyBeEyF2#hGg8_C8jW)NCAhsm2W_P21DeX7x$4EDD){~vBiLoby=d+&(;_f(?PMfamC zI_z%>Nq-rC%#z#1UC49j4@m63@_7LWD$ze=1%GPh`%@PB7yGH6Zh=1#L%&%hU7z%Y zs!IN(ef@!+|1YR28@#kw^XR= zxB$*nNZm7Y@L0&IlmoN}kEI?dBee+z+!MWCy+e4P4MYpOgr}2Q(wnR1ZiA>5_P*Cg zB4BMlcx?(v*+V3O+p~Buk;wIN6v!Ut?gYpl+KFu~elf}{E4`9+lcR0k$bC>+I zWxO5jD8sYPbMS)4c3i2UojI4T7uzE*Zz;POw{0d0`*iHJ%(Pb=sa^pV{t_JtHoPeC zX+t_k*=D%+Sv#+5CeoRfI)G`T90~AE@K9RaFR%8*w#*x9>H$ahFd>PUg_zP`VVPSR zr#Rb;I--8Rq;eTBju;dx2cmZ9Al>aiDY z#7(4S(A#aRvl7jm78sQ+O^S5eUS8|W%5@Pt9fm?J=r`~=l-gdv(LB~C-Gi#srwEDQ z4cCvA*XiRj9VDR6Ccy2k(Nvxic;~%YrfNeWl$cJpa%WO_4k?wxKZ{&`V#!&#jV@x+ z7!!YxOskc;cAF~`&aRWp8E)fnELtvb3-eHkeBPb~lR&iH=lZd^ZB(T6jDg5PnkJQFu9? z+24ww5L%opvEkE$LUHkZDd0ljo!W}0clObhAz`cPFx2)X3Sk91#yLL}N6AE0_O`l| z7ZhaKuAi7$?8uuZAFL(G0x3wE<-~^neGm=*HgJa(((J;yQI$NB)J;i0?vr`M1v+R? zd+{rD^zK}0Gi!2lXo0P+jVQ$HNYn^sRMONYVZPPT@enUb1pHHYgZMo5GN~SIz*;gv z1H<4(%53!6$4+VX_@Kp!>A9wwo{(KdWx)ja>x3&4=H(Urbn?0Vh}W3%ly5SgJ<+X5?N7-B=byoKyICr>3 zIFXe;chMk7-cak~YKL8Bf>VbZbX{5L9ygP_XS?oByNL*zmp8&n9{D42I^=W=TTM4X zwb_0axNK?kQ;)QUg?4FvxxV7L@sndJL0O12M6TMorI&cAL%Q464id6?Tbd_H!;=SRW9w2M*wc00yKVFslv|WN( zY7=Yikt+VY@DpzKq7@z_bVqr7D5B3xRbMrU5IO7;~w2nNyP7J_Gp>>7z?3!#uT4%-~h6)Ee1H z&^g}vZ{g}DIs@FDzE$QG_smSuEyso@I#ID3-kkYXR=nYuaa0{%;$WzZC@j)MDi+jC z!8KC;1mGCHGKr>dR;3;eDyp^0%DH`1?c7JcsCx$=m(cs^4G& zl@Fi8z|>J`^Z-faK{mhsK|;m%9?luacM+~uhN@<20dfp4ZN@qsi%gM67zZ`OHw=PE zr95O@U(HheB7OBYtyF=*Z5V&m?WDvIQ`edwpnT?bV`boB z!wPf&-@7 z0SoTB^Cy>rDHm%^b0cv@xBO%02~^=M79S}TG8cbVhj72!yN_87}iA1;J$_xTb+Zi@76a{<{OP0h&*Yx`U+mkA#x3YQ} zPmJsUz}U0r?foPOWd5JFI_hs_%wHNa_@)?(QJXg>@=W_S23#0{chEio`80k%1S?FWp1U;4#$xlI-5%PEzJcm zxjp$&(9f2xEx!&CyZZw|PGx&4$gQbVM|<2J&H7rpu;@Mc$YmF9sz}-k0QZ!YT$DUw z_I=P(NWFl!G-}aofV?5egW%oyhhdVp^TZH%Q4 zA2gia^vW{}T19^8q9&jtsgGO4R70}XzC-x?W0dBo+P+J8ik=6}CdPUq-VxQ#u4JVJ zo7bigUNyEcjG432-Epy)Rp_WDgwjoYP%W|&U~Gq-r`XK=jsnWGmXW6F}c7eg;$PHh>KZ@{cbTI<`ZP>s(M@zy=aHMA2nb(L0COlVcl8UXK+6`@Di+Wai;lJf^7s6V%NkKcad zDYY%2utqcw#CJFT9*V9U_{DyP&VYb)(6y`Z%Rq& z!PTtuI#psBgLPoNu{xvs^y26`oY;p!fE=bJW!cP^T>bUE*UKBV5Bd%!U{Q5{bKwN> zv)pn@Oc{6RyIS>!@Yvkv+hVLe+bmQ6fY2L}tT)Vbewg8`A`PFYyP+@QmL?b{RED;; zR6fwAAD}Ogejah(58bv{VG&WJhll7X-hjO9dK`8m5uFvthD1+FkJtT_>*{yKA(lXx zKucHMz#F_G)yTJw!)I3XQ7^9ydSlr9D)z?e*jKYE?xTKjR|ci30McU^4unzPsHGKN zMqwGd{W_1_jBQ_oeU^4!Ih}*#AKF%7txXZ0GD}Jzcf+i*?WLAe6#R_R-bSr17K%If z8O2SwYwMviXiJ?+$% zse=E~rK*PH@1Md4PFP)t(NhV%L3$657FUMap?fugnm3|N z79w3|qE%QyqZB}2WG&yc>iOaweUb`5o5p9PgyjqdU*sXP=pi$-1$9fGXYgS2?grS6 zwo#J~)tUTa0tmGNk!bg*Pss&uthJDJ$n)EgE>GAWRGOXeygh;f@HGAi4f){s40n?k z=6IO?H1_Z9XGzBIYESSEPCJQrmru?=DG_47*>STd@5s;1Y|r*+(7s4|t+RHvH<2!K z%leY$lIA{>PD_0bptxA`NZx-L!v}T4JecK#92kr*swa}@IVsyk{x(S}eI)5X+uhpS z8x~2mNLf$>ZCBxqUo(>~Yy4Z3LMYahA0S6NW;rB%)9Q z8@37&h7T$v2%L|&#dkP}N$&Jn*Eqv81Y*#vDw~2rM7*&nWf&wHeAwyfdRd%`>ykby zC*W9p2UbiX>R^-!H-ubrR;5Z}og8xx!%)^&CMl(*!F%or1y&({bg?6((#og-6Hey&3th3S%!n3N|Z2ZCZHJxvQ9rt zv|N#i*1=qehIz_=n*TWC6x-ab)fGr8cu!oYV+N)}3M;H4%$jwO>L!e53sxmJC~;O; zhJw|^&=2p!b8uk{-M|Z*J9n0{(8^>P+Y7vlFLc8#weQMg2iB8MFCe-*^BJV6uVWjg zWZe{-t0f67J<|IIn4{wsKlG*Amy{-yOWMMW)g}rh>uEE;jbkS-om>uAjeTzCg51683UTmY4+yT zW!qe`?~F{~1Y>mPJ9M0hNRBW$%ZwOA-NdIeaE6_K z>y8D3tAD7{3FouIXX9_MbY;zq%Ce0}VmT;aO~=*Mk4mflb_i4CApxEtZ^TDNoOzy_ z-eIE(&n1Vz*j&(BjO*fVvSCozTJU4?tWC8m4=d|D{WV0k+0M2!F1=T}z7V4-JA*y( z!;H(sOBmg=%7p&LLf%z%>VgtdN6jl2y95aXY}v9U;m~YWx{2#lwLpEJWGgs`sE*15 zvK`DtH-Q^ix>9@qVG+d*-C{lYPBbts1|%3!CkLP1t4iz%LO-di4lY%{8>jd{turVrD*_lLv!ShQC~S#SXjCO?##c zh2aZKVAHDf1sQpZiH^C7NRu?44JuEp?%W4-?d;Dg z;`gKA9$oC{WlQuT?fex!ci3GJhU;1J!YLHbyh8B-jsZ~pl59LGannKg9}1qxlbOOq zaJhTl zEJ`2Xd_ffdK^EE1v>8kUZG`eMXw(9S+?Lxx#yTUo?WdV}5kjC|glSJqX zv8RO|m#Ed@hW=};Yfl&2_@11Xm}pz0*SRx%OH_NODo@>e$cMAv(0u`~Yo|qbQ~mzA zMKt^U+GIXKH^xuD9n}NfU|?ZTOSS>XJwlg`lYHgea)!ZR?m^=oj+qyKBd6SJvPZk* zwc-2$b%%V~k$5{=(rG!OcR{;u2V3um|C+oT5F?rt`CER|iU9-!_|GxMe^!f$d6*iz z{?~JnR84mS+!gFUxugG?g9uGFI(?Q0SADS8=n=#aCK^`6@rm4r=LJTBm;)cY zm_6c5!ni$SWFOuj36eKau>6=kl_p=-7>VL_fJuJZI}0=3kASf|t;B~;Mt(vuhCU+c zKCF@SJ5#1>8YLfe{pf?sH*v6C)rOvO1~%@+wN}#>dkcrLw8U@xAySc{UeaP?7^AQ5 zmThfw^(i@*GMlM!xf+dzhRtbo8#;6Ql_s$t15q%*KeCm3`JrXnU*T^hV-aGX)bmxF z;O%jGc{6G+$gZ$YvOM2bZ!?>X<^-D zbT+YCx722}NY88YhKnw?yjF1#vo1v+pjId;cdyT*SH@Bc>6(GV*IBkddKx%b?y!r6 z=?0sTwf`I_Jcm(J8D~X@ESiO`X&i53!9}5l}PXzSYf9 zd&=h`{8BP-R?E*Nk$yzSSFhz2uVerdhbcCWF{S7reTkzXB;U@{9`hvC0AscwoqqU( zKQavt5OPm9y1UpKL%O(SWSSX=eo2rky_8jJ-ew7>iw~T=Xrt3EEzc!slebwG)FrE> z>ASkjJk%#@%SFWs-X4)?TzbBtDuwF#;WVw}?(K`UYqm`3vKbFKuqQ8uL2Y5}%T0y5 zia#E?tyZgnuk$LD^ihIn(i~|1qs(%NpH844QX-2S5E)E7lSM=V56o>5vLB^7??Vy_ zgEIztL|85kDrYF(VUnJ$^5hA;|41_6k-zO#<7gdprPj;eY_Et)Wexf!udXbBkCUA)>vi1E!r2P_NTw6Vl6)%M!WiK+jLRKEoHMR zinUK!i4qkppano|OyK(5p(Dv3DW`<#wQVfDMXH~H(jJdP47Y~`% z#ue|pQaVSv^h#bToy|pL!rWz8FQ53tnbEQ5j#7op?#c#(tj@SM2X*uH!;v8KtS5Fo zW_HE8)jSL zYO}ii#_KujRL4G*5peU)-lDW0%E}!YwL#IKUX_1l9ijy~GTFhO?W^=vEBe?m+tvBe zLaGWcoKg==%dO#6R}`U0>M)2+{b*~uamlaUNN<_NVZTGY4-(ORqK6|HvKFMKwp6^L zR+MC^`6^|^=u^Do;wy8mUp^Oct9~=vQ74vfO-m&Q0#~-mkqkpw&dMkVJ(So<)tf3h z46~mW_3T@Mzh<2XZYO7@F4j|BbhhXjs*hayIjTKyGoYO}`jEFn^!4Y! zL30ubp4U(r>Nx&RhaJkGXuRe%%f%D;1-Zdw2-9^Mq{rP-ZNLMpi~m+v?L=sPSAGcc z{j+Y!3CVrm);@{ z;T?sp1|%lk1Q&`&bz+#6#NFT*?Zv3k!hEnMBRfN47vcpR20yJAYT(5MQ@k;5Xv@+J zLjFd{X_il?74aOAMr~6XUh7sT4^yyLl%D89Io`m5=qK_pimk+af+T^EF>Y)Z{^#b# zt%%Bj9>JW!1Zx_1exoU~obfxHy6mBA{V6E)12gLp-3=21=O82wENQ}H@{=SO89z&c*S8Veq8`a3l@EQO zqaNR8IItz4^}>9d+Oj%YUQlb;;*C0!iC&8gaiDJ)bqg(92<>RbXiqFI3t#jqI%3Y( zPop=j=AyLA?pMYaqp0eHbDViOWV-5IUVwx+Fl6M54*?i+MadJHIRjiQoUe?v-1XdQ z5S305nVbg|sy~qPr2C6}q!v)8E%$i~p5_jGPA0%3*F%>XW6g)@4-z73pVcvWs$J2m zpLeW4!!31%k#VUG76V__S**9oC{-&P6=^fGM$2q<+1eC}Fa2EB3^s{ru^hI}e^KPM zMyj;bLtsRex^QMcgF)1U0biJ|ATXX`YuhzWMwP73e0U?P=>L|R?+13$8(PB23(4Js zy@KS0vvS~rk*^07Bd4}^gpc|e5%248Mei_y^mrD;zUYniPazU>1Dun%bVQ0T7DNXr zMq4Y09V_Dr1OQ$ni)BSyXJZ+D7 zXHh02bToWd;4AlF-G`mk23kD=$9B)}*I@kF9$WcOHc%d6BdemN(!^z0B3rvR>NPQ? z+vv#Qa~Ht|BiTdcN;g6;eb6!Jso)MFD3{sf{T;!fM^OwcEtoJI#ta?+R>|R;Ty2E% zjF8@wgWC=}Kkv52c@8Psigo4#G#E?T(;i}rq+t}E(I(gAekZX;HbTR5ukI>8n5}oC zXXTcy>tC{sG$yFf?bIqBAK3C^X3OAY^Too{qI_uZga0cK4Z$g?Zu$#Eg|UEusQ)t% z{l}Zjf5OrK?wkKJ?X3yvfi{Nz4Jp5|WTnOlT{4sc3cH*z8xY(06G;n&C;_R!EYP+m z2jl$iTz%_W=^)Lhd_8hWvN4&HPyPTchm-PGl-v~>rM$b>?aX;E&%3$1EB7{?uznxn z%yp0FSFh(SyaNB@T`|yVbS!n-K0P|_9dl=oE`7b?oisW)if(`g73bkt^_NHNR_|XU z=g?00`gZRHZm+0B(KvZ0?&(n<#j!sFvr|;G2;8qWg3u%P;M1+UL!9nj)q!}cd}jxK zdw=K$?NuLj?2#YzTCEw1SfLr#3`3x(MB2F(j!6BMK!{jXF%qs;!bIFpar}^=OYmYm z86RJ9cZl5SuR6emPB>yrO)xg5>VucBcrV3UxTgZcUu(pYr+Sa=vl>4ql{NQy4-T%M zlCPf>t}rpgAS15uevdwJR_*5_H?USp=RR?a>$gSk-+w;VuIhukt9186ppP=Lzy1L7 ztx(smiwEKL>hkjH7Y))GcUk`Y z5ECCi%1tZE!rM4TU=lk^UdvMlTfvxem>?j&r?OZ>W4w?APw@uZ8qL`fTtS zQtB<7SczI&5ZKELNH8DU6UNe1SFyvU%S#WTlf%`QC8Z+*k{IQx`J}f79r+Sj-x|4f<|Jux>{!M|pWYf+ z-ST5a#Kn+V{DNZ0224A_ddrj3nA#XfsiTE9S+P9jnY<}MtGSKvVl|Em)=o#A607CfVjjA9S%vhb@C~*a2EQP= zy%omjzEs5x58jMrb>4HOurbxT7SUM@$dcH_k6U7LsyzmU9Bx3>q_Ct|QX{Zxr4Fz@ zGJYP!*yY~eryK`JRpCpC84p3mL?Gk0Gh48K+R$+<|KOB+nBL`QDC%?)zHXgyxS2}o zf!(A9x9Wgcv%(sn!?7Ec!-?CcP%no4K?dJHyyT)*$AiuGoyt=pM`gqw%S^@k8>V0V z4i~0?c>K{$I?NY;_`hy_j6Q{m~KDzkiGK z_ffu;1bT+d;{6`SacCO z!z#1#uQP5`*%p&Urrk=&0`h1PBJxx*71yfl$|0Lt5_Lu$sO+F4>trJ6BS{J-of(R; znqrX@GUAyelkAOB;AqN)kur^1$g*t8&pGsyNZ|n42P$;s}e=Ef0&U zeA`jZs*E%l;3wd$oo^8Kh+#$+NzBNTi(70iEH)=Otim-ufx?&1Fe!w}-a_WL z3b9@#v&pt7wVF#bkr-YWhG|rhfwMABMZ<*Ku}@(4l8Aw|vSX#w9;23Ms1w zSC<+Ir!HNnF0m<+sQEdpqfFZn$+xA08nrn>k%Grb^0QdkgbOV;Kit2W`YwlfP5RRT2G3s4h?t5)!UZt~ ztK#FBL&P1pKsrye8S{&w@^ExelK;!LKh>=_q@VYF? z;_>~#$&OM13&!w@lx3P~g8~N3^wGM$Ybs$gFU+qlyxpp`?%oPWZNF-V;}NI47Q3^L z6zQ5TW`2EtX}l&7$2>xy4$xi;EXMN9^>l^O zpX}dt^G-p)6VSPIUolW9$svfNPfx=thP`;1S+wNs+PSh6QZ=X3FEu=#Ih!t_jC#tY z7t4@L1kbqL!4$7DY4QrHWPRfRvrE1hZcJR!wneIey(qiO(&qR5njE7~Vx5a{vafU= z)ya$}INqMlnsl?CHs*Gm@?JIPF$yE8pr2XE$;!z~-)=K?U$T3tT|t*z%Y~?_FuuG# zdxk5YL7D5##gr{wj@q_8USae@D&~NiU&5b$mcj$)ciL;Pm?1INBK8<9Uy##y@F;CU zG{5BquPJ2$`&r0uq3sHTD{+s!8^B47^RipsiHgpRoUp)5`1Om|oJQYZFd->&WM-2Y z+jMSmGg#v0-K{lm@K7En;FAw9nqm8(_94>4itl{!&h$c5Jhb(>aE;^WG5a0ho_P#k z=`>n+Y4`!6VFcFp<(fDGn0XZI%j$-p+V`Wfsdx5gviUanQCQKMLC02L-kZhqAFDJKEt24JM32 zX>A|&bwLR-xGzX@mrw_b>J0xDVriQ#YH{AYpBzPxW*}IViqyF8u~q zU?C~D8N<#3QCgHa! z%i?KtB+B&v;W5W8oy2USy=LKTj+&_Z`QpJr`GcqVwtDRmc6|RBE?NV#eo})g*6rN} zhVAR1l^#prL+5!{^P0NZ+RejdQ+Ik@^7pH{{xCL;z5Ef)do(8!08u9ieL2#1dVKMYKYZxBy98#CFs?lUx*#_eEO!>K!DVcH zdGN^HncO_w*;SJDV*_W|+&${EN7qQ1S1yi}H5b=0yu!PJ`dqxvn|pgs`A^1u$=l`! z7AEW-85?pZc4n>skM$;VkgurkG)2ecbYIlvN>b%UaLQareR0du>kXIMne04Rjh>ja zOJm_v=A~pE$}gH^TK6G5iT7xseUX#3keV|HJR9+g$u1o)wk^sTKGu+^WK4Dd6|PCC z*&kMT2?F_IS8|8B=Pgvkp`~)4nQ&T0-*6`YgSiY(GYn4))c1*2(ByIjf}HX8)B7rC z&d5F1D8EZT|BW`XU*~9w2)wL&5BLA(s{AwN`Cq`IT#a9vsG4Y>{48Y5F*r`NXsH?- zVTMpq8!(pQLZuRFNJ`bUqAX!QjVN;EgzPSiZEP^R9oBqXv+2Lf41bTiXwO@$_dEag z)4$-NHxpbc;(k6S`E9%V_Z7f<$NO$<=f@U!1BT{FA;w$gJM_RPC15g24TclHHNn= z%3))Msl?FP(v#6f=JB3R3(=~4{1-z9c(u5S4a?YsMm`I{<$RtS!4}}}Ls16B*~;RA zCFE^3T{I0u&U)AygIU#$7lBjVWRxt%JD|3mUGu4?1k3&FxUGkmjn>V`{dku=<;nM6H?3 z8xw;O<`w#tgfx@pCrNvj1x6M;bIoMn)ImU<%Z(~Dvg^o_X`D1>gDTAF1JlQ` z?Y0Rk=%+L12xR2Um(UM}Q!Uv+W%0yiatJP4)MXpxqnE?ceur3dpWVT$$C7W(Ad7OQ zW(07FjoY#!D~GG+S__T8FK&rdV8o2D$m<$v|3OeBckZrXV6vJB?+I0Q&55akuCrPQ zZU*OQXVhoj-{S`xTc(oCS}h)dA5qXgY;`LeY~fN~j3}d%Wj}YsHH!*FgWWVKtEo7% zHJCka&s(kt!Ix0uOwK~ysoe-RpANP#;|q6T$^GHRvO+{woF|P1&w_Kq=aoSqGzz;$ z*Wd$VhR9xrypy(YpJ6@06_07w6Ovvj^KcA}U4Pw$jA_~vwQAZkdkBBr8`%yn^BXnF zY|1lx{c2Y~DyMp-ZA=8M4nE-5zQ0V;O>J}Y+q0W4x)$_;wo<8D%n z!`fVX#C)T*rrWYPfxn@Q6qUT_)*!tiSediBO-cWahFdGUC+AFOSeqs;VqMXEvu z*%o*tngNJ+?;X}x>R4%u!~{AX)S}i#{yd>aw4uJZu8tysnfsX->l#F&^>#dTfy;r$ z9&&l4K^kS`n=Z?f{iVrgD@h2mp&`v~L{?|ix`67n;1n!!9Q9;ZT8{Z%tjs%KO;cRe zPUo=>|D{SI8*Zta^OK+@3{;6}Prl^Xo^!LgN89!4j#^fkSbG(fbc|}r9kfF?xK6Xn z1YQ@5h8GS>!!w45QHt_v&=*8WKMCyg^sG1>yC2jI6$OMH3*2k5pYYxNp2ruxMERnP zt>?dmG`|IjgqE?Y zfm?|c1z(LRCd0xBr_~~k6@@Vn{e_;CW=N{cxgOB7t*8bx)NVks2EHMQr1{_-@iJ4Yow z&jrCB7?wL1L^MwKQ<}W8nuXleT$a{lrIC+Lh^3X%lVS-Jj*O+ZeScuA=u{mU3<%Ru z?1Ta~3{lxdLZaLB{rnA*1cW#L6jcEUfR8x&{D2H-1!dw^=@(e4V zBXPJ#v7Vw?G}0~t&j@4v@@(6bhC0Wq;*N=}g9R&l+ltUp+C|&cLHD8B64iDaD#Ufm zzBugB@HF5v-1b26O3@fuv`ye?Q@;2{aG^N4zvx1n3|nzp+b3F$EEwVhHfn!wWrHgRcNDg+Ls6o&2!~fr|<5?3~C$xM40nq>h0pa?ejgP_Um+osTtap#sTgEz{+V!DVgg2c|zr&qy`*v|%k2qN4o$ zG~S$V&%H9mvmN_*yjnif&S_LWiH3GhJ<5yURu!%M^{oke1@N`vWL^&A({Dt^_*?zF zlEwE&e!1B;B=VjSvmW&#RI9p;59vL-zmfhqVSAUbyVBG~M#rW`BM9#;U-<(X5@k?g z1!baee)903$R-8_!>)ezvDF&ECABnUmq@;}jy$N;%haQ)b&?*%Pj@Zx<&(TSPsQ!- z_%e!bOqU&-@>_GE{lssw9He!Q4iIrZC?rGvemrxq=ZuF&VNVbL`14U6X|at+LC)@` zR8$!C=E++&j+(pty&FMQAxl0-G#pW(N>jQG1P2tvmz#rF&e3`|lwl z_vYYFF~1Qo=)yCVr!-;LzgT&I7&7|z9fN9h9n@0MDUi3~0_6bOhc@D2&^ z3duiUjQ;{H{ue#*zw_EcH6#7eEU^8|o4Z+g;kYqSw5Srw;B7BSV3Jyv$P(N)*#_vK z^_85Oc-QFw)3z4o&}w$QRS)*91nMOQ=(_P~ZMIbN`|4_ZI<*?Q@0jnHODEZYb7YNa z#+SIKx9tP({1fk!sZ{@be~5nfcU3c!&;~H>pIeMLx@HGdj_QX_a-&5s5M$~&{a`c# zA&Ak(q{ef>Gz5c^Ws>UyiFa*j#b4!CQU-ibzM|cGDhWsZV zPSM2}nveE~=5PtYB;8~Plz235H}`j{M)BvqI^wQGEc z9rbH|h#k#qFbKto=fbGP=fs$DGd|LTF%%-<=*%*scyqTgW;|&88`L-(y7Tth9HVaR zp}o`R$h{t3hYWj)%I-A!LZ{EALwwb@{TtF^4+X_7df_N(Eq?3Fxa#anAZ860o$rDoQyT;#i?`Kwurj4}BKysK7>nVQmatS5Nsshp{j zyS7G_fo*7u(Q+P%>ZN*aCp~9=tjao5cGcNm4 zx^?@S<p-aIyE;r_=AYe)b9h zzj^rv6QQ-}v0Cf7A|#5k>wLX}mH8FX52>q6R``I5aj(>*f3i+(F`6LcB&TwV1f zpOPb`4mv{k7WTW=>?1?FmVkn5!big+_SX>=c}=YQa&e+ez~sI1NEr5z9CTehje?9U zeQGJpCSAGIe8Q0$Z1}|?U+hS2PcEBSm6v21_B`XcXFU*4cyc40;{?Dg}W`~c$C^r1u0R%RqHCJ>{7(eSO$^7u3m~WQPS^$-(q&7a_2fFWJdGZdcs!8Yp93#wJGXC#+@-XFx|>~ zWg5SUiLzII8_j2bhj18wt_C_~^6>s+zj6K$qg)Pb`PYDVX=J7L+tMgt(x9w6zse)J zrWWHgUJmp%E@Gd$ZWQOvCOmDbvme4&D>*tpQvISkpoe!jph2$(V=}62#;K-r=px{4 zV=SM&(@pKFvW$W==2-~S-Tw&1LunP`!S#K40}R=1o4hYtUAAOR^O1p%&9v1;e~Mv!?1a_tMZAvG7he; zE(!g+ibYMAV|59+8DrA`A5jc3-gU&9%Ehp+qlG849RhUfZbL>lW#RoS2DMsm_Ux=T z|K|#Hv5ed&H*>KDzXXiopOce3I3(3%28T)wg51@M4yl?`judhBRFQ^Vxk)BpzD!Gdf#ou14?8X#gV$8aQC5b!&aX#wKA5qk_*wO!kHj9#S3 zfpfT#SU6nAV|8c)SSQA-8;;j_hf|h4AmqgK#I6X|Bi^JQUvhn%9ZFX#PLyfSQu$;$ zzM^i?+bX!Uuk9@9_E&+n1OxbcWwm-2^nejN=dF`W8^)>>#Cc$L@=1?vuQ#K}JjXsYEEOT{m5D-P)P}ys7UNH36m!HX{b7{zuY4R~4pfGV5Vi^-?R147 zD%l%2-?es1+bV6G4n$6GR4p(3ko&IXA+~(xQE|GL`XUzQacBze?)~!~HQF&6=utZ0 z$Wf?>HaxHaz7Vdtqw>KzA8y(;k}a|po=YGKx1k_^^zUDdNeGE>hyCRQSXcu*jL_YU zN!=4suP9`?J6XnmB6T|AChiP{Y{!9n6(*xTCBh?gJ`=4!L#e({8F5LQ^NHK@iL&LB zgD@%`@R`-CxQ8~aQh5hAwL^!2&`ZWwUt^g&CcMWa%{?u|%Q0S+=Zk`S=5!;nMj;)A zUkgmCf6>4`t~Sf4PcwYnqZbg3OF+Q)geEkt@yolApC*~;%L4b=P0^y0Dri{El=}4S z$X4s4+!}Hx*_v{nC%i<}C)#4{GV~O3b$(7WKQgmbWK*gp&bxjZMh%oA%7c;!x(UHc zJb*6c%(FyzY$UeZKe>)OnXJ6J#+#kL>6H@(rRUrJPT&TM*qJ(Zen2c1RTdSPih#F! zhNn89$nUneJz{GFdfXdLUFQ%+Dp(t{OZ5rb!Y)=Jk+Cg+kyn#$K#0-9B_~2J6CFQ) z1(JpSx*^=Z{P{OsfeXY>FUNrUD+Bd}BJlGUV)>t%g8pBcg8m;&Wk(?Kfx+?rP={4# zXB4Stq}8RQ<)@~n=q9G;4pa~n<(02#W|Wy4l$aV?SeP4F*wr1~;SrRXSeV$3Xs9OV zWaJsB+vFK#C#L0Fk3jzx>V*bA5$Nc!#SHLCaDciOczy_C>}F+a zO7CoDVrJ#&`nShmSM0V2BSt!Z(j+N{2qK1%?~(#uI1gQ1s>&W^0~xV~$nW z4pqV9;_`dmw}E=^?_$ry*6P1uvj2Kx3FG%^d_azjDv%??{GVSJHvTIB zZQ?5GU}py;Zpm5Mn*nKY?m&d}e?_5F)%1b9Xf%E>*l60e2)o*ydBme)*G+*;5h2RXO{)0P3jBG!L33uaJwzU(K(pv6~PPVzduR2|hw*i9w{(m4H zBS^uZ&rjFbkp|+v;LoK#iFk42d*MUii-&oRJm_hgMI7Ij!|4F79K)8we%~Y;)z64e zS$jZBbNXza<>?Hnzd=__%v}Z)E?tM3@C=^0c3OGpH?ILc;6K7CJHRW^0o;XM&? zRyJSjn0{#e%)dIN5KGml)+6Tt5Rk%+b&h7b*=OocxlFgC6=_Yeu5~|Rx0`VjhDk+} z<1I9`MFiDJFW4|F^V5yTKG8Gp1{v8H^iL1$d}T)KJxxi)uAvV7%^lcAWo61_;M?f+ zt*ei7zH!X4`WH_gd3aFWxuF$D(d1WGLYmrxhA3;SE)ls3ScyeKnCu_!>V(aj4|d;{ zr3d@%!lvC;Q^la)q%*jr_6ZQMqc}5=!j^g{!Y;_gLZ_z1mP1(2ofH+aMc@mO-w%0& zMcrLi=K@|Aj0dKfdi1zjUc8csnps7~J^oOr(crZ%-P>rt(vk^@obDhK%gz+COLyaF zOK@m(fV>GSpm|uvel^6QZJ`+Zq9q=64v>|~qAQ-QRn9AVlh7dTet}Jl$Bf8BlOeSX zRdEVg+lIQiT7;oB750LzS@a{VP{TS=prLli-EQdbR#XfrQuPc7PpO_wgy!O)Ji!_h z%o-Ied!{_J3E>-Q7Wy8R*O)${Vc7n6e#~E8k>#6Nd>OC{o&rDr7D4^1=l-n=Dj7Kg zfy@8pf`-Nj|AlQA|Fmq?fptIXim(x#Q$hn5A3z;;ub{UAm40w!;0p*xQPt~m6u1*4 zG~fRH;R!m96b>aS7IJE9-?nR4o6#^XzbT`CX){A=WdX)s+j*4Jw{yysmET<5g zhm~p#fBsf^D;F0ldkaO!zc%K=&KAJy z2(D)T$~~m&D=r$MjeX8>bk+VgEg0531O;L47sQCx5<0@n!Uiwkdzo^@5myP^w&}xH>73_@ODfWks~GrQLlMjj(6T=VkhF~X=S9fNiHaa$-%?#Z1=j=+S= zuh=Bar9-re^IBgu-N?L&pE2gF)wsS4Hk}wSgKhO1FhZhMJ$QNnak zc_Wg5E#j$$od&Rmk2X^SPW82|hAD%CQdfv%199y+R!Md+Y%xnNa!ceFR9YkOTTG2X z@degv0a@FP( zQGp(nd6$`yUEyu9VQY|1p^_;z5irnE5((Xij0zXIU3O6hr|mv*nf6@YKau^_`vx?U zVzk*ma1d%XK^Zsn6?b(_#C5Y>sgU1np+JAL$q#%lcx_5fq7N~y8$%Y1b@+qlZD)GRtqHiH64d1`M|6%gSI z7E)Ka;0tb#V2V7kP2N5ve8?RHqQI+D^S;>(^p{w&^T-`9T8M^17^E zj64Ug&h1ngxbO5^%8Q*oM^ZU3ix>(+wxqIv#20;@gRteOC|}HiWCLR4chOZ?sIl#j z?HWCs7ES&pYvD@XBAlD2DNS!N?o{H^RV<{m-)}D?NnIgZpCH&_k7h&2!m5!?4~$ha zLL0|~NL2^L;1mhwQu-$|4NgN=T`D#77(jGn_Ram-(H2Uz$; zf+hAb__g8npk=#_HZo1EbdbJvfPcy%j6v0c(TuA~CFWa#IpQ8DxrpD2g$oi(I2o2Z z24*~d>3T%gvGu;W0(7PE2QwGulFsU`yBy^a*R}SEcuz4PGa`L2Shn)X|0CKj$vi!l zaCDGyggSmFjrM}3;YC5#vSN>etg=m3CX&S4Axc2$Ts^+a@NfA#fKQutd*pd^(A_V@omWc_Wn z2hQwncEE}pKwi7qKc@PBPVuRUGcsVzXrYR)ti`QuI(D>YgTN!EudAs+5kX8H4W)0c zIAw{MVl1p@Hk~vb*I#_7n5AXW>4UVl4)eC&0I0WrZeAgG;bu@^)>w=-#R1~M{oE%( z<@`afh5m|!m6*!N-#^rxklo|Mz(ZxZ&B4|4VcoMwNXsBy(X2|3rvfBIt2!o5jEQrv zLw1MLY3@bD$B^%WBD~XC;wrIl$3tP7Ga~QLxD64h(~D$xN9m+3Eh~TMA+@A?zLmjI z$OvS($*mc z>-7O^ek3#vj<28l;F`DCy?7}nY;gV&6-Qpp;dX?e@leTJz3`e<%0*?O&k9$~VgWeC z_Ui4vn7u*k%x~Zav^W@jZEk{?&K;VrjDojuT6A9(_?togSE~qOT7HfJd3E8yiZcJJ z8A#S1STN?F)6hQ^$ln%WfR>FX+7Y_n57T6A3b3$HkU)*{tOQdR#4pkFEyP77VM4fa zF)bTL9&(VJtectZ;O8SUx)%V0c@7QlMyQSNfifr}Jxc}+MGq@Qil2{OuYA6*JNdQz z7Uu5F*?@*f!MBs_yWFd-K9{%I%aPAK|1Uzk+o_EZ9(4ue#Kov4D00}uS~1eMw_XOe z26zT~Ws1^Rh$bR~$k?m96>tz9%=e*8eOiHxdsA|*?Q;7+1~xE5egC=U=gHTn_#;&3_e5qQ+jz( z#pK^U8DYooTFAZK!MuY$$v%@;d#Mf91Ko0^ni3nW;{Y4nNn%=+D(z|A1>5cFT8s;)$qzErjML0 ziD7u7Hr$LASvu{+u9@x_)!~Z@iA6lGvb93@ox@E}w&Xc2)i=D=sh0f+Cvrt#$my5u zNC303wf!W;06T1)$Lm{&d0Y$R)1|S~WyRi7i~gVEJ_xzqMJD)m*o@XwEOICXt`la4cZ3VE78XZw0i9+>*DdZq@D`>yv7e({AvkT zkND$hT?3sR$7&DkeK`u(N14p@CQx#T*#3>0o^v-hT^IV<8ki~k{hDQ=f{o2MNPL zvoYAK@+7+xM*b3hZU-Nmf#%Wt(5PKm=5e#$TEJg!(OX`=TvDG=Tg2WG`EU|Ac*5tY z85?if*_GzFqJ~gBzz)m>lvTx(1B$UZ+(cZKO6+2Bo%rjvjn=Jgk(cRF6ll4EcW62w zIB7jGL}6x)r3O>_+lm-=Y`752QuDc8j|%+N(1)967Rg$7UWvkJG6uMzn_*^66b4*8 zB?j+c4Em#C{Kf`OH?n0qAeXHrx{4J}+xkpj826q~{uJ!Sp9c%>iNsxf+$vwQbbriw ziVukQ&@}iFkJP0kM*QY@SOY8Ws@i3L4^3Z%;3!$fj>B0^ZX+PgA6_;m`3_bu<*7QL zOZRT~u0FT}zGR$QwTrTi-0=wZXdM_w-WG>fwhZAoGj%2mDnDgKbYF(a=o{Fz-^*gj zwzOeIUv7)FSh489crAf{uB+vCZ;S5vy$Yt+fsU^*oAk1xygJ<=eG5BmUWczQfVVcx zAQy^X0uUL(p6C^S+L#7s!HM}|hC1}4ynle4i}drxpbCt(MN7^jC+l&R!+M=xb|n=X z1jf^Ouk_Xc9|v~A>R0)F8)zKkpO&Loh-m(PwZ1qf%wJnQY>+H*#vE8NEs3vT?}hFr z6cxV&Qqi{>kYkYUEsvNiVlfhZ=*&hcj<2^wA+xtF?0iN2RGh~5Z(jDwqHH?_EQL)! z63nv=^p9CAjFTguG~%8f$>GQYv4*SxiY!~i*;ix1?P+pn6s3MH0|SnU=3ORVK8nz} z6$#yIU7NL4`_Y{Bl02XZ7RIqTH#BItO&v$-W^XBo`_< zp;G;l+!qwLoy9y$h^PitL!U|q2HzHJ_k67`3tq0i2gx>cHzkFm$2W&qVDh|>T@Z*- z8wHeE9-zq-8AF!-x~s$f*t5rM;F5bByGh54r^&yPhggy z!rZr6i;^ia)kRBidKTcwqxnG7*JoIDr!?Y{$1{S7R)NY#4k^RKS6X2CER#1qPHoZS zNgXYiv-gACuEa9{Pg()P?0j5$$xQpyySA%fRpa^(9>=Q==fjIFVbM=F9Ky$dxln}? z2R}0&P)+o>emVfEceeQrvWBjB|8kIdz0E6bcDb_4*@yp&u{C2sa6yvG8ece%%-E~c z5L*$Q9ZqZ_1);e}P?>NK{hvNJ3_EQYjuP~ir#tzGx`U;+Pco%E#6dSS$Ou?1QiHOZ zUa3ZZ^!DggCSrpzryEF$k!(+`p3vldJ3W;2>pah|pU77#bbl_nd!o1ebDZ5Xnu^e# z3{mYzgp)o9Aof@d!ajp(M#d8Fg8N;6Vm)hbK`KL6Nzy|#$~TcA7`HT5cJip{bAUOS z3uh4Cv|Qf&V$rVLMOtpZF3?gkg4q`irJfIlQFRR0G=hsYT>AYrtbC72;EY_GyKN7v zE;J^7@d=gq5AHdZnJ=_`IU~)Gmf}u*;HMRD*qF%e-@$u-DFi$ljK&$DX4?er(mDV4 zdz63QousPUDK09Z`Pr}jROZ2QP`!o_gTr+&3m}3+&N0ToWXdGIF~Odp`=ztsKAgXY zxEKAcU&{FTJf0+Plf$J!W>3_6j{k&vuJfs<#lOz)15&9!E{5&c^!`>85g2G2M{1-p zfu2G!kkLv^+Z|^tZ7WxZwT2>`wwXK5$c-7hA-dNxaC#qapj1lhuOQWy<6hy>U@zLp{i>v0goz%WXZfJyM zAMcRmS{A?{94u@#r(Sga6JB##GIpf(C(KEmYBHlqV4p)T8=vpJ8yfL-S}_3RLQTi2 zE+I!C{5lx?OYr^WzKnY)aZ)NsfDs>fz7UP_>3i;YQcK-*4zbgh8(3b+Tgom5;)_}L zij@)AlIK2edojLXpN*)MXmCtss`*^-f%q;wrf}uXd#L!28(5NJmVOj@>Amj zvdBz39zgT8E8&DlkCft^UXevw9xGLOq9z_{a;nr#DeIUmB*`SPGJ;LYufmmDBd6c~Z?xdA z5prm}Ot}XfA@)EW{a1m>zv?{xD_ZbBdv@yfHvc~=x>tQl1-Osr=bs=mViAHux(SV- znm~fuDBFW_@`bagNmm$R#(hd&br zS%lna?|A!i^C_p#_j2a&ePj@OM&C;GzNo1w2szUebw_|!!>W~Bq=b(^OLr_1;37?%(##A z9QqVTl#IL`v(s%~0|Vz+8R>R@70%rCf(8>+;Bolb=5|toH%qQnyJD0H;lj36f&FF- zv%vwW^W=7uE3+{tR{!;xAX|f%`?f<<3qQ4-K?b!^8McJZm&K`-oG9J-tIVR0N)v9> z{aBjsKPjhsqU_1k?ujZzgwvyp;3OIg_9-xmJ4TqE<`xH-meDprmKKT9>?BQJ_c$=4 zjMxCytYKO3UqmSxF|O>r8NQupgg$=6j<$YTZlq-vBOF9{)e1{MgD+H9X&HZ7BELnJ zD)MD({Ai*5$spJF&E#uBOCx_s%Q?Z|#xuboK2JgdNp_GN>mOv6H}Ftj3C_15fk*W6 zQ@LssLl6rPe{u%XKQemMFSN>X5k(eG3>`eO2By+`tF7K7B!hjx!dnk)yJlSR10b2O z2~BPBdu&x5k6P<_Aq3zO_HpDFn zm7Q;ii%GQB6o=RAyOL1UHO{0M8NTY_mJt1l&frMH7X;blR$2Z^D5yG9sg6FBDs+M+ z0hVhb^~MveK6(`s!kkYZt#CVp7HNWEt@Um)yU(WX70HKUY-{esU-SNNJ5ZAE6FNyi z|0@&zKZxo7HhTWK>-?ABtD)<%sDbn+1#7BN90hK8kANt^1a%7oG^Iods$EDbphQ}< zK)g|1QY}$W`*`84_XD=)zV@gTu|;*TWZLz0Sk&T`@>O)hPg28ly-Bt#IdV2{IS=6A z@q_=C(EsxlHz57S4v&|K+=M5NL(a{Rcl)#-&OG$K%yXLD5$q0nYncAVQ+9L{dMk{^ zL|8%~ZuYD)D1nW*m$anFlWw$N%u$kRCw2g-iri@h4N+D?dej@mwEFNgO*?I#-A}T& z`j{rp{;-VALQ7;U#ehw{+}H-?apebor9J#I-EkS7E@$)*rI(2Eg|V45YwoYF?N6q-{yTyLb+>FoKRhs zx~U5_mvk~*TTmNK(Va!L7;yCIocCK5tt};4p-zA$3c$EM%1K#z7s{cmSPeB?LNvCOf8`?3{m|5el48Wx=_l*sG13tpH0Nx;9;ROU zRxz`t)G=g})nwWgNEf6ix%fGhE;~$JZG6&t*Hz%HIDVFJUA0SOyU>EMSEOTLiUz^k zC@Y~I7~Bi<7$GTPNdt4apBM86LtrR3@b)Yu;$fm_>Qk{x>NAb7q8I<$tc`cMXcOkq z=tq#^b!8Bk$SYia^abWU^EVrj9YaFKR$Z6{EW^DM8xMT9Z^mi^n$J1|oFwi$(KPDe zKF)h_X&!ni(>43<-=?*Aya_Y&y1&Qq!+e84G4ArPYMgiLMbtB&Xh_S)x%C$5o~uA! z)ISR^g^3JbT~!XiS`I2O;jyKK!dI6ipD7tIT(q*{w^tTrjSd>98OR8^`1SL%DUMr1 zoty*%29FrQC84%B%?K&EpagbmC9S3#$NlcEJ9y`nDk;d!u(-pfxKAEwX6NZHKgaP1 zYB$t_?F>eqRsQr2>Uw z_(OydVzS-~dc-l>{X`EmXAFX|Rdv9?J-mu_z(Aqxv^0Ze@0{dC$IX3^)}7NO##x~+ z9M3C6>Mb5#EE{I2d$azj^w@8$olxgF)9&oV`R*{O@bEZuYX)Ni|2j$bO%CT)Xd-hQ zwM1mrelZiLpY+Xh)RzFFoN=AYS10)wSREU_e&dln{ z-QKeQ4Br0Rtp2Za%>Rd_n5v@xSMZj?<>`xC}e-2KbVN?1otV0?Gf8uQuiI;twFnF0IOGq z?peO7GocyicU|yBF~GmL;iO|tCQBMo$&+-Fe;;HxPY*S*AkpOSf(S8XHh=UVc##ea zUQaRg{R~7zJCOi?eunC3;h-z&h)|?vFybC5n!%)VF{ASnIgJ@v|1lCxIw-{#tI?R2 zR$KlKZ;d!&&ucn3VFOuYA0z&9T-#_62%0Il%L~~x-znb z^P#1s5Ls!ytkHobY|s>fX`IhDv$zgD*P2LuysS8~D;>;?tiXW96Yq(SMdt#r2AZN7nB( zY5D1c_=t}FcIrtKLhQ>N&i0f&^^xW4qbG2fc#aFXFkfGhFLpNdT4{4F9?z|eK1<@! zYJFJPZP6h}oM)-VgkP@H$qGr1{U!-8lV*r59HgUqeo))HmDcBxVN^SQ=c^=M!;7bF-Vp_D#LR%hU=jFqOXEPi{` zviQDBaVvs_Og+?TFK!#hKwRuun0>tT>GTS9P6N9v|F;E+*IB6uxeN$-&$(;!s^}B; z-_SSmBHt%-G-WN+WHD_Vnn#XuC_+S%<)Mjv>q8!SuJBCStZuSZ+@D>+QWF3)fS95C z+4FTz3MpP=#?w>~0EN%lq3aHC!_fBisQ)?c_lB#r=EUDTW&A4A0 zp*joPiR%T|ptP>8Q(b|7+UP1$b@(sFIc)BKX0JdjS9dPjmnRYt;BuzfPeLlK zOxIUiI;BB2mqZ4H`HIu3HYo0!^@?RLpD@l=q5OG-o-U6*{X?odL|e`4%dJ+x3l>+0 zYqVRBTTQwwuj445KL)KJ!f!aB^(lXK=xFbT78!!PWeYf7)Al$ZQgMZVpOIi{)`?jQ6EGt zN1Fli^1-fQ_AW6%$y~nM{){i_1&A>$M_X2zsV>$$W{(fgty9e0&XaK%Wx9|P?(RQ@ zeG?yL81E?C<W zZN5#>k7@jMrYLPHOIeH1CpOsju9{rH0jI4h`qTq_mOfmrj9}zlOFZ7zYZvFJnE758=N6laV5R<(K#1Kyo z1+WD$nO^oJbwf~l;1+i3LhT5J7^fJYLms*@D>Q~0??Wbi*eH?7ovb#<531*sBqUvH z+U9r0YMiyeOG4U{^oDtp!AW)(StJi2q)@BV3s*IOD-`=*=AY#uTmJ(1^>p@7EIoXFwrc%;%KzWnF5|D26z! z{AaY}HS?db4Dx-hI3$OpXH?G=cY?vO+%f#1#0cmsw{|TTqcs z$L7$Vd%UAhzcx=P+Mg68NA>=MlLqmJuZxP@X2f28{~GD@+LyiN#*x2$(bHArR(-uT znfv3!VgHYf0N^cm@>CR$o9t9P4L#kW7TQA!Pz27Z)<^kRut0`|$oqMS&?>DUdp73?Z9UCZntcGFK-dt^CpAZwmX=VV5T+Ypb^d`CxT@_i6szTlgx ztHgj-1grdsMplBJC`(f}U?U7w`@!%?6;+hmt2Bm_otM`4-fLydBDZ8CKnE9@vHAfX zUoP+WRBN7IyU=;_AFV#%$PL^L-qDLfLgOq&dAd2pPISue{D)>YPcvn&qPdp07-1eU zzJDfttKVorH42n3Q|=R@#KfayWiZSYWe}uptFi1wI=ahv%D{2W04pkz=4cbEtRpWX zD8LmDRE(7XP!T*dRX`z0B$_?w?IiTG$iAuQgQD*ULx_(FGl2j^*?Pb)?RU*2QuMbo zEq&RT8!jCtp>^bPXv!Co^65#Q-Q9T?rJPHk$4=06@MVVAqn~Rm-r(mRmHh48Umucd zs|mYU8p8A|L;auv@pA^4^Y&>0!1Cqe;Qp%&JNaQCa%Cgj=*fBm6^-mmiT`Q zOy(xZDh>*vh0Z~Mi}?sD4HcdDgX5sO9gr%=&=!$lJ&E$BG24a1fkA)DXi_k|fB8do zfL6u4CU!t~`74Ke=ia@{;fk>ynq<)>f_A2MBjx5jg4-*-&yS3@lJS?O*9Tl&(@{Hdun>V2VjoU!p4XJ!u z`sV`b;DAv378}(tQWIx4Ijx6h3rnBHRgtieSnJw{eu?Qv?bCJqTCvm2)7kh_@>RL# zE%Fr9705W0o4C+8Jeu%tkrhY1f)6VZJX9p%e1RJw#{M$Pv5(N0_;s~wQLeYYb@ned&te6Ox{l{(K2M7ESVja1Hb3MN5H12SzFVU&LuBa|JH>666&HxE@r?=J7)GS zR<2g=X8&^*sZ{l!fml`_x?SVMwrA~;s5Hjz(pO`mSQ%pxGHa2=r!SB>=IeIu>A=c# z{=5HQXq0iHFD2-WqV8lzQdX zpKGm1w&DoY#gCFXaYu!X#7~p8CZu^?wQ)Uhs+>J)#PBJe#i}`uWi7Ph0;s#YAz5Jw zw~`e9sp-JY!2B>YhrZ0WjIK*AfMrTq0Qy6cjwymsTqkw_Pg9>xqdU!Lpb?z0#YoJ^ zmSnyN*RguGR$M-9oW0O`yzbsk*yHGP8Q-bGzsI|JiQKmLCN~M z8*#-Cx#tXmK@Ref1SrpIQOnx39dW4^ZlAs~Z@hb&J9NHS#1U;BPiUoAwAd!c9Mj2$ z24#}W2~M5TEN!HZrU{wJ)beG8>6LyKM^9yK@zbEC3o|AQ@u=;&qX>f8xF-JY%P^=s zs8pS7oUnskDO7)cj-gy6M#OT*+zct6a5@B{(0$cU44XEFrn39Q^6T6;+xR{Rn>kr9 zQrP5C&;*oe71IpJJo7gZJ)_U>PCxolSD^3)lF2{qW?^i^sZ!ZVK`FVcQ-G%3vW?@F zb7r)Kt4A4b%}sUAO|?dOLlj*$<3+4c_y7@Goq)wK>Kl%#zS!GZDT>Lnd5SL?sxSJ* zk1i@+wA z`hcof6#rthes>nC!?`F;*Xq!oamK}gk;Q=c^O7PB8pMJK`+Q;+Rf-2^gboUJk(7(| z9ekdg0;2FXcZ%jhp(Iz=Q?;l}MNBG0p|tEo-?GGWiQnSn=wexO!QI+@!OdKAul+J5 z<^6L+ip!0SLq7M4)|vT()00}~*wCtQ|btkyWthyh~dUKeakz#nBpKn!2FunJ_|0?lFez^B?l?~^x~Im2#$gf9FHTua z1}8l|>iSq5U>Ui}f#UQ);$8!wiJM-YCKP)2#6*@>h$>*IGFdW_8OlqBK@ED7?wf@mzih}MD&(oPbMp8oa&M-Vn;!CTRO(PmSZvNd#Vsw&m>#UVlWeC z^B%U}?{rm;HZ6pDMJJ=pif6JxrhB0~MqAI_t`;X!eY~#$r=As2XuY>Exy0Cr?AUUQvr1tQBLDCBVIjO5f1?rZ~# zk(mUxN>!87(fn2tE8~r-6^nDKvi7O& zTN<-k_2v?lG+Pr4odH%FecI+yo}bR-h7pR3=LZiKW-1BS{9S6Fm-WaCRRj>rU)k8u{Jt9)P_v57J2?b z@}gr5rVKk=Ep8KcoyK^rFth^g(-DA41`fi|Nl!Mow2BglypUaG%16C zd-UKWwM_DMf(5=s?}UXyn72%-pv{0e;WbPrq6J9Curr6|pid9sc2b@~nGZ!(_gW}R zd>4#2(+JK4?j)oUQiDsG4IDG%v5xOp7}h_6`JjAN-GmoJ-4NfDjb@t4%hh%3kM$sOK}rVT+G%cLU3MeygHY~yq>H5 zXF*6%U(^`%5(K2pjha}Yh;&dL)d&@mR?T3%_i`4C09IJ%CJ_~ESs{CN3lFp<cEHYvvZxsME}pi^r~`wE zR(Zgs-l?`OOui2RwdVOqNP`MB5%Y(uCqdyuh6XYj&SY`ji&KT8yGk_s0Q+i;aM?5- zdy2{P*c_p3bO^!G;}kI3o#7$-plZ7pE(%o1`*$eB4({rt=cR}Juz3?$kt1+a8 z;q2}fG$OYb{8u2zQ0y)_IOhEnw(C5*RB+CwEeoqwZ4=qSdrSrEIj{YN4rBUoUm1NO zT&9H=c$!s`QXI^CiGQG>?ity42j7-hG3nCYnYDF*aF4$Nl0N*J-rsr?EW|$y)?eTQ z2a_^9HEZiWraH$4_S?5}E;s8VTaYVVQ1ERD?Yf^Vzlix;@9=<_kjoh4!-VxF7(uQK zLIv(V^FP@Z0kLFbm}Hg-?lE-@eHS*8U?e%r$|a%#0Z_k6BX9S^=%5-5q} zh~z!E>VCuTe}W~#+u@A;g;>DwQ@6*!D#Iinq(E1cnMcoR1$4ay6ygxOKhZ`71sEw> zJGoa|#@cGF!myuz3IL(n2d_ac)Ull+s~^G3uRU|o7<8(8p)66!W)zR&>`*4XQ~t9e zj%HD$_=pu3GpiS_FA5d=Zqhlee^l6$tTkf<{yurrMT0T<#@W>k^xkDdjEaprF($T6A#m{3NEFeK?V9UJASIzNF-3;$ZW2DJ1C4 z+60`Xih-PF4DJWLECu}lbSQ&f05tU2g!ZBzDX~SZQWz#fXiB^3r+P9xv;FrroTv=! zni^qGP0eLX5hx{6EmPGNBl^OfAvTVBS!e)CxDIej#izrN?OhdSUs4TwE}r8B55D6> zMRdgCkm#~y!4AsJI09fVghHl;r!B0#0|cnSpHf#TRU3(KQ9_m;c|^YAxJFPg6do+d zcV~ChQN{yZX~k1)4WmyRmPYW3LupYAiXhiQ93_Y~8QAfM5UJu^lIgNpU%JWgHN7ls zmq36DlRpz@a(1!d-W}9$xJmzN(}{k~nv}n`>bdFY2191lQLW$AV2&x8P!Ei+Liqi$XVbQ7&w{*$& zBHO=doIpiDJSm~dY3K#HiD;6*m2T)nhf=X>PTeJhI;iIu&I7GXoptfm;HrW%yy~^2(-j6zk z@fCK+fx#(HG}>f7O`gwf~?U2yt7x2NojM1imx}>oPJI*zX!^ugOE9eJm@Nz$D(bQ5 z9agonHaTb_)4q&ACr{}2`YDuuMA#_TpUF$Q1-FNdsn__Yh78DTE8KH7(ym_t#UbWjpCo-UXKEbpHc=OFO?@3(pH!ps znXe3cF}&h+q6u|mp8X#GIec3BaUoO)dI=O-DSMp6xE$Rd;av z>pJ!+$cC^ag+|Z`Xl2P87>7($#y&tSGI4A3E=kCo1kz*@ld*Zmo40nuLs63hgt!+< zVP&d&^)!*nR$fDWM&@16<>xA3~$dOR_D`4x?e5|#72UnM4tjLE?IvvDb>|Jd#9OqP* zw6YtaPywLJwr9UwZ?y@R(Rb#;RlZfC=aw07;)8ivdEwqd-83jsbjXO|+k`(AOkI%$ z`bnubTn#iAx58rKeIF*#Eo^Hs z2p9*oIW;U{LhUdprOLtN9Z-OjpM<XPqNMAh;5WRA{JA@-VUBE2Asuc$Qh;|2))eC{&v8byr*cob)JHUV#1(swddDYOX=T{0x@Ug9EETtB>jv5?5pBU- zAjHz08TgDn1JYD+_u!mt4_{-Vax!}|+rM=tIOFS+88_5+ z^BXQVNIs;5GoH#GCaDX2XJ({vcktV_nT~cbD*}l`xvf_UM0`+bSCmZR3Vc~HW$Znz zKKC$gOupRqOr$s!35_HL79h|Tt4(;)_|jm{=pnSAGSoNW^=%o{7I!-IiDJK!r$IF5 zGzPts^}}ne$!=@OSr@HcP(GsmjNV8jERE?3m~{agTr3{!bi&#myZuVobHV`XSrbx} z(*=o!s~OV~+v~^ZOQ>PDIdx|Q#>53NLqVK^RF?wY{9aTOfuYowXr}uE-YUnqGujt6 z7+YO;F$pqnpiDx?XVhCvlSL)L$+axX%5Ju7mlU1OIeo$M>-YJbWbf?JT8k?ug9p43 zmOn_j4iUPF;GD|d)>)#=(tH9-{jB-5rlzPRX%xa^22>@9?Fqzz+g?jh7<${~xLtB? z)@bnFv$wXYROVA4-KdwG)U5$RE$nG&1{o+zHlcU7|8r3vOV&e$uM3&`RRUB%UY;45}9WNEqN@ph8b!( zQ8Oi5($^`zUBinEFBIcIO{SV6`D#$`G>|2ajnV2}f{!g|xiq#?%R{=x@pO*sxa?B| ztR)sIlDLqA$_P?m!5m7!CJ8rxlw6&LhC?&O6Hh%BPL)nvLMoFZKEH=}a%mqheg~bj zLK46)Jm&G7QoXPqBy?rX!!2!R%=t#^mT-3bsxfkTP5b=WinPF{>TdrR?ymvzeln=b zh`IWl)VgA`Aj#y0_9S;qZg4GZlIc)JNUaPvQG^(xui-MI;A$iJ$g0Nr_Wc17S#S^YWjl3PusxQ!)wU8b8 zFDF#aeJM!o$?`DADxMHNAZEJ~37%z9K|H`EELfXxd1kk~1D^+fVfB^vE8gX{gus(q zP8#n>$2_-_?mAGc;a!1_r%;Q5A2Rl`D|Ws8XM%2#K&mA6>S3ZSgN+PlDTfZgC=(ls zm&A@kk;cmfW89r0B}hsr6~eFYifW50>0>}L`!=SQWrUPCV>cIK&lak8qFzeUO^%DK zb;G1evX6LifZX+YX)KcE8#6f0K%rmfZCvGrDbX}1=o|~8K3Rr?$7h&k1ziysH@RgY z{wk6x@9k^JpF6y3O+|Vy=g#O%A7KZ_!Z*svG$;09pWmGH?5PE+@IJ+K63A3G zRxQj3C%h%n3+a83X?IpT9C|j9f%VX-U^n`S?1AX(xE>Rd2=n1Z;Z)gMjS=KX0e`3S z7wBro{K8hVEJ`ZaJaVVTROdCtB#>bNW}5@N=l7*#o*|`}5%^--4HcpKSh-7)JenNy zz(_n1cZ_*HlPkY|<1wAGFAe^ejgC#2M~>K80Zsz*A97m>&%{gwf-fO!IGXHtLFPaB z-&53Z_*)T-ofB9e3q0E0{0fPG;tkNTN)22HXZaVdDl#DeP*32mFbMm<{8nWN|B0FI zf2hYh*oDNS3i$x%CkPjxlN-XM-~l}-islg7!sKjDFkQ~(EOz?zTHAvpR5~}5r~}D} zx4z^}Rg52#tlI~!tHl+ron`xltoF9AATRpDATcI!tCII9rBskRRh8cTef438rEkUHMhEA+zg*XY08C@c<&hLhWA^8_Fv^SZM)W~Il7h@#hDRC z;D_T-kWj22P#@^WwO4$^dx9mjFu=&H?b^FyH@T(Ly$Bt!!KMOW$9bv6YG|h&2M^YU zCGxhRi*YJ(LBW(c8<*WZ+Pz2mS#CJ})k@Uo4>!wACtr&wu2dnN-KP`r83?6%l_42R z3D%P12Dd6P;xiy_Xjq=(8^QS3tyzaReeH-TW18P$VF-W!G`Ph>d-x4eY8ZLYmgp_Z zN$pPinOpkuoSq_cpCbmxXSF`rphklW;_gG+x-7lZ>m?x$PFGc&f+o51$}<}B8zzt4 z>4S$Hz4fx|ian>^e7yJc2lsNsE(y&Gmn1~KG}7n2?}h6gDi5h+Z?gyZpALhVB1tKl zyx+4x3bXPMGD}i|@INOM4O5vJ>)#(s4g~!uzHm&n4vs91I=ssj8Ux)V`sV!QOCp|9 z_)YS~Fs67!5t8AeXr`cQlns=!>|H7kiQC2;Z*ghB+|?dPB@U>Ja>Z)GbHAgb_$sMgr~G)JhY{!TEY52na@|#S?S|HmaH06E?59!Gbui(%>6w`R-#h5uMX! z0J{rT_9=QD=D~G4vDNy`P7OnhnumO|Y1EcXWM(=djE1uos--9OP5}>zC!E4gpZ6C( zuD8)|P^CaSANdHayg=YFqVm{k>Z;)4g$6&;Fwb16N#(cZ>?-D|Q$Ew6KV~-!=U7Av zc*Pk>`6Q(P`qiA!!dlj>Yxr#hrp(uX0^y1cbC&^-pjoU5SN^QxRI$TJKUQT^OdMFO zPA2$MH*IjCoTeJVPa3DO`**Oi)^2xR+ATF(WBu+l?`1+>>tS=-VaII8yrzTK*C{e_ zDK)^Mg-2V;&pKI<6S?Nj)K%_Bc+ONA_WB@s;!}K%9rZqZA28~b$32&j`F*+oi`%dm zm(`mzf;~jxBz~Y%;XJ4j-}z{o22D(mZ_g%+g5vo1aLV+J7s4Zz$Rv2aRq=+G7Y??8rDt!e1iy& z)&NN*U#B+|7pcEFX(?*S{}x+~sr_k;458jCT!EMH0>8L)kbk^!4L-?NjJOB(piv7C zo;6lt^LKi^A}3RkE{r$mxtW+{b_}M3LMM<>S)i0Wx*}mC5~~QY5?whdTa5-ih)t`h zerXv`DOtuC2}T6FBT{|Ot#W)CV!A9B_w>Zqn^H`TlVwXLnBLQ9_T)9iVlN%@X^G)- zmP+cbr6;F!2gQm)O=+EcU{cTlHh>V(2mh1uE%#RkaF$v!s##wN?hzfce2EP! z^VPf7wJtvzpICd}rF&j)RJ`(rvVjng(NWe)8b0JPO|bK*)vOO2Y;VeV19|}&w>9@ zA2~5HcZe}|+`+L`Ww2!1ll&Eh6tMw%{O3e{Gmm9d*vm`+lhy}p0JRQtg1&kr){q8o zLcN6|^;}wkg0ifpVwusKmkQ^k9L*NHP-IFY;N5Ccd@9_FZ|75USR#U-rg&}%h9+UO zqJNk#C`giY?8LjC5LY*DcR_PR!90NpCku;h)jY;Y5l+yID$8tEr}DajdRla|C!JZ9jS7ZNR?01x z(29C1wdrL=YOxVlG-&JGxru#`LvRr*x#&9t!iYKezI~KPJOY0uOXC!x^tjzoC!+N3 z{nNF^nX*)eZU>pfhV}$EAxl#9Qv@T9k_3ldr>eURyt9vm3j@@h<(CKp9~)y4yxE9;sUsj8c(7knL%j`1o#`5%Ch&^Sez!sOEPdI&6 zVDw&BqsIW}LMCTJ0HjFlnA&Wa9t9CkDK zXj`8X!ztT=v=f|BhhEyJey-fUg*2Mzmw1dvGsk1nDft>e$HrwSAlXa1HpdRnYj;#G zFAKPvbfbS-by>00KuvT{tAU}ryQZXM^I6aXWk~r!SM*_jo%ySU?%sRWqRO$7btT1h z66E7j5S)>9RjUTgF2?NIVycAJas+~Dw$;R!gXH%!)4&kKZlqnk=?tkW#kscq+yboW z+rDQal~@?2_heHhcafFu&RM;HvEow^*-ICyJ%;E*c@nCl&L(6RdZ}o1F*QZG!QBbI>Sga6MhY zJtASBj*zP)0>ULKMME%=^Q|Ms0&OsoOrGh&Ur|9MWn9}GUE7^opMeEm;Hx)FpK6=$ z_{v~P*=6*BN?ENw4Q@|+L;X1+8)Zi~fzB>%!h`h^bpruB>*Bp-oO;obx^UH&dKbO$ z(q8}M=W`~0+uJFDUkz7WMhiv@aBe0B&dqec8?N7iGXK8YB2rQFKhh#~_4G%i`C8~g zR9HFmLt$7gFG|3fNKAY3ApNaHc+`WwP0I8r-mo7i+OD%hrK3eXflK-y4xi>e$|6?A{B10 zD#AtKv}EPe(^Pt9YGbX4`+_lK8F{KDoVv&%CLAH+g@SXJvA)2b~P z>boypUaQ}6JuuS^2rJSMnz?|-^5S+$xt5PJ^Nq8*`Z&O7bQv`9F3GXQpNe)XQkz^p z^tlEZ8Mr6Sz70+qeI0ZhLc0vns#%y2L@V)bnd_D~!9l`QSKA-FOWT~a)${p8 z+TfUfuJ7Qp31=TU6nIiOcQdZCB3(X$(~<*+*oXDli+H*V(s*JYkt(*HH9Gn}#lFCK`}qFL#aAdF*HX&p9s~sLs?VmvZ?e*GDVXv}phS9WATfZe zCv0Slh59;TF(m5tX|l&tGKmJv5lLF(RIK0?3xFJeW?;XT3&8UX36MatEl}Tbs72&} zRjy4%<~CwS_wcN{yU50+!K1t@+oH+QjGY{erwlNSF7Gm3Fz{lq%(l5Jko+t0+W{vW z<|v)p!~=_#ZPFLCcZ-EBZAY91b2W`SDFK>@N6ZUZq4(xZgDWbsp98!@^srNCj!sou zbnOcjsP4M#a7!8s;T4|YR;^`{MfNy4Y3+m%yOw^u`?}l3!@pdh;-r}iuu}i*!pyg; zUX=Ybu;z8O+89#^3%8YlQg7~Sa=H?=@poZtL4hx}B8}Uq>*&^Qwp7?8S>UhWWNLZf zStvJnd5Lh7mye_o=WBZvN25s|7>tY73Bj-_x>b32R&1Sh^7j=AQ_eI-&RY(<@U<61(X_-G^BC@j6ZrN%T3o%&$Ta80FN_$+ds*mg z4Bl+7KLj8820g-KM9N!88(EefeLyXEr}f1E>FQgJV$ad{#7w~3$WkRnHjdjU+s z@8GxI1|5oJe8gu!J%r%-m&`dt~ z8U?WpmRwOb!9-7yLjq=~7tZ;VEK{yu_+COu9zvF1zI#(71z8uuskuKv@8l5fYXv^L zz_!sKI77Te=J{%r7KM8lznuCrZJbCZGE5c3daD@b-nI3whMy8#5*`N_wP*az8S%T} z|67FDqaeLV1zDMHL1a&04E9t-G35tRR#@>0S!ziIbWm8B<@&uQ3n`AOrTBYxqb{{P3i5k_Xu+7pGy6q}2>-lt{55ZSh?$Q8V533IZ8e z)AAPOU+%Rt@$JMZu%|Jx!Q{_3Rv!@LvA30H^aZ1fEvRDXhrTq~?Qo|&hqP@s<1Nj2 z8NbE7CeK`Zi$&fz?gpc^Qmz&-d^DO?5pe7c*EQm_?vHsBL0kP%DNWEs*D;k|7>z#d z=wqqTDLXzMTjeXI#Z>8j6+|1g9`jA;{$BUbP`~!C$T;TqJ}@HE1NcSouVn0mjR4km zM&hP+_6~}U`rrHiudm-;6-z~6G7~SWDjVBs6G?=Gx;aUIK^PBaUs4kAs7XX+*cG0V2~ddK#KcXI~0Ehk(PZ!Zia~Iclre z2g#qn6e9aNJp#Fo^D}-u&h633g_}c=9-Xm9f>Q5G=Ms%#t!YK|Y8A!ErF1KkdgYRG zbsS*^;3fhFrc!yg?pG3=+e_?P0JAiqq10yFZXCTivnlCRM+ti6LDZoXquQo2jizLd z$k^;*WS#Njw8XjsO~>XjDmG7MD!iZ^^^e6G73Sb+XJj}>`yq0;R78T!A(O6{K|+&M zbHzqGL?4?>Z9GO9H(xKQ)tJOpWDG8XT|luZD@RHf>uNSB3_55Ov=ljCQy_Xx7enuH ze;Kc5A>a+&L|lYO-A0mCY=yMqA~cJmS&6XKVsA`_m+*Z8kF+99<614pv$yTe{4}-3 z1b~yqt4#IQ$kj@ev6tR?MtCvcQNwIbUA z!;4kuj~H{_U;^a5I`?#33lH9fZunudyVD4_>d>guC)K*~adU_y9lS)kavh4CuDmeY zPrQ{x{~!WMV~8;VXqc0m9En$TUyy}@--hr%)xkcriO%#D*}tEYO{jn2HgE1wkqY_B zSQsPyWpzO;-I=z_GLKG?N-d)EN80tTXOKp78?&olk*?c&WYc?SNzb!kCwU?u{Bv6- z2avMfUY=jMMFBWWj|+7|d%Xi0Fy#+BA6P~_U9#pU^&_=Kh%|+LwELk9@e0_w4B|by zaTIFF@wz1%=FV?9Ajc$H>yV1Dodg-LD6w-it5zgtvTlzMgKb3#R7iCcy33OlRFoKAEQIE;yRz}PME$62;E1Bs8Wu2 z$3`~C&1~Vn9L^PdZ z33{h&m3EtM%nU{*tO?j|CYgN}V~4?UnTTf_20QLrwjNr&!BZ8{PR4s&9+`9s`~Bpn zS~`O1I=$5UDEK}u&x}b3yWtwd8W=CKr1(8#zjDNWA^O#Z#DVane2c990<_UwzuRa< zS9=E|%YWlj$cP=5?iNH3`Y=~wSz9+_HZ8WuCX6Q96NnX!iS?4<#hzCx;baUM8pWjW zvb3rn98pIwDy1oMkx-9%I?LIIhmrKg7Vnm}Cml~Ll8BKaNiEQG)B{F9Eikghh`on+ zDL%j$&fi80)(!VdX3rZFEd8qsA)NQ<`4s)1i>B33S;BQuw>+VM(+vPt`H6QJyj@l;B#6*A|Sezu|o?d)gbzUWi2?e>*W zToiD2)QPw&zook6cb8t$CH{hz!)qy@4sh5G3|M^kBB#VHCS)$< zfjGZ}yA4_-2}yHFFfu&`Rb<5xvTet~?^JCdr#yO7xo~13pi9kTui2t#cUN%}BDPZJ zBr{xQ?OOPCx=tQ1ml=l~j5=H? zXt+&1;);Q`jM)zp_OP2u13X+cV`M%rN*IE;O%5#ava-;MAJAkg-8%zu8&3FIuOm~E z6RoI_;MDz;z0ue&HD%%4T@T-whr@q!s3-(ow@f_L(#(B<8?X!6F^4BLDc(jlf_kfzXp@Daq@}O$vpcE`Z zOprA1o(s;W8=33^s4ob%XEhnqnBI${#&-0~;~x8B+Ylh>uLe_zym~D$dzkueR^k)qj?i{>RJ4!OO`P$oF!Z(0Na!A$oZ9jk4)$AW$k@ zsFk0+q*4_|yWUfVko^Ac)hMNGpt+1R#KgsN=QE&Yts2Nw4g zf#f>$@4|ta(=M^M#a&}v5NDcrv|*=8I)iaNSrgTEUQ+BzZ49t{i`qeTJ?4r`6v}UO z0d*>2(eM)y1=Qlq3|O$R>XDqc*qn&L>*oL@`Y0(`S2B3nrbH&A?&sF2#pN)P%r)~Z zo*2}!U2Y%KG~!lYKNO2}#)M~Y8P3#=H;;`SWCPw1RYvB-jaxGO+7D@}tU>Qxf zwOXQKeTsepe_;H1Eu%YJy?4zGYfC1A!5`jNW0WZb$8&gqCXS{e`89LelT1Pwuk^T8 zkrE#XR0<|?U5zeyLKX)uBY(a3<1xnbO$FBG{qcgv- zbcA@3bg-F81b;J2{c|>=lsJx?DNfRC#8GMr5&6An$%;~Hb^8a4BFPTW$l|9ttpZjp z=|Vh-qbV9`&UFO}s@oEP`1`(2bmVpw0dGFTr&Zg`ftxB_%F7qr!c9#|=qwx-ptY z#J~DLx`a^pWv$+V%3ss&YhC-^-rQ$>IuTMsj42=)a2ju@hO$jrIO=T1hmDimUr}X0 z!f#mL@j2wu_y|{1Z3I3?JDid2Iqu5?qb0%7*x88J(@3>T1=;{pANA%OQ~SB1$(KCc z-uH+Gq0vkDB-zOVX&Yk5Ybqnd5 z6{OV1e&TJ`i%i*?w5$C|LIWO+5DO4mz`OqH*QZi5c2-jYXynC!ClT=co&^B7)&2h? z13=A-KV$&d`bGEu2`D-kFi$u%GzdO$(>;**zq0p0^YHyZ200S?_ET0&Nr+xbP8_&X z|JPz&pmmGibc>XLC;GSl{C?#5e*0YfZ!uXRIVo{5MWtu5;*Sx&6#!0k|2cru-S-0- zE8h zKm$d8EgbEE8_UE^EsTT=42c7XPc_ z`L2vjD!__^0DI?~$@p>9_}*ds5&gNf@&D|FQM-dM3}B#%6|l|U_C@_TYJ6V&%)x*XiFW>LwkUonE*6Q zzuqTahCiYSTU$GP%e!GCt7mEjbh`e`w()ofbczuVi2(0WE#_Z26ModS##e^*kI>(T zfS8Msf#ZMW(;uS-;O3Q70a1m49Z2&7@;}X=;{PM+Uk}B1>~EF+b4NVRaQg$g#&=Ze zkGS8v^?#Y4$0-hf;t{;~Bi=8!{(mJreB2w4)93wUp?vvAmj7*W{**Q6C!Dv&e`n9{ z2KbLN=-=!2O>gFL(wm=vD4PE}17FHlHU&C$p3zPo5#?#ere@54V%Y>A7_#I zQM|@iW2al;9OU?hJdTaDgRR2SG{xSSx&Get}{Ko$T z|NTzkB1KdE%B{{_`wo%Vlq*JJ(4pCo>E|AOS7)hr*k=&{`2PqGfje&+o?LU+wvS%=vh)_D{~E(EpqB&*tiJQ0-65Stm4}a^s|D!>Voy|XKl52jW`5Wx_2K{yU2iy19>-ZD@r0!qf|8F1U p \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs/mcef.jar b/libs/mcef.jar new file mode 100644 index 0000000000000000000000000000000000000000..a303b596bd79d1587d57a2bf66f4131cc27fa218 GIT binary patch literal 343177 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

LXq4j;S~{b#9$A1E+mt z3n8}kos1W_7LV-%kjPnMbof_uhu108J85DTlD|N3OYrdUB9>T8Tq*cuMw$ii7sa^8 z`|3?gT1uC~OvPdgr$DzGW_QBTVj^?i3={MZ8pq+tWKv5bskfd4f*^e8QhNKD<#>D( zGpMdk*co<{w zR#Ug};n7hwZlIh^y-Q`7ogp

91SXZ+J1ZVD(yV*@q9Q7B`v~KHTf7s^{6lxYf7^ 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

IAtv!iWE(d zw80%fEXM=;ObiSZeMRhyTo>`3Q#W9_ga~WNyruk%+<%&(5i#EHgnb2B7ftl^K-+d} zd8_6AB&qJb5a{z{klTe+Pe6b${qR0651$l=zc722vBiT75U?N?4VRur=P$4%6B6{c z>$8K{xtYyVA;P`|L-t^&=R$XW;o8G-XF}T!c5{$Lh}yT}2zN$er2T-56_bVt5D7`= z?w-XUC9iV9xo%B}8&2{I62{V6kK!7KkL3^>`;Vn z5JmM6Zzw|z7RFh@@-IkKbSw~IG!JA%TLXGII>JwdMIJ(Xnx2<_pquvfr6h;1!S zyQ;xTTR?-jR?lgU7@0K&pr3ky;H1u$S=NWYW1EipAb_cjjsoNh1yt$Wt`H5q{@t=~ zX_;QTJO;UDA3q9SnYtbomSKO6o#l!C;Bzgj?dSl_9qF>QEgxzbj?_)cKQBz-G}mcj zzGq(IFlUxNFKi?fv(6cU#fmX9gK;aip#qIN3hfqrMK8hX9$r-Q0zGkkP1|_79lDxH*kHGR48dsnd)Mbz(n}yLeuyp~o@E6ss z6-o-#jSHp5ov0FQ&NgP;8p0IAW(k(lM7-o(_+_%$eh5a*I1Ad6QHRU)kHJA*)8L&% zBzJM5yw+Q2Xwrz|B;2c+7q4a-?ec=sl3zVv83?r42gHSU5ohU6E7U?UlgUXY;)kieW`c+OO-d1?>e#Y2V z(-$jXeG+2s@0e*NR<_a7v*FrJsf|f$BMMcGb|U0A&kWuEOJxlKTw(SFYzNH9nc=qf zsF9fgvri4r@$JtafSxpTxL{WCaYTg5Hg$gGls(}hqV># z=Ja$Es~Je>kpNq8N9@K5;;qNV2hJroC`p`+&E`OBb)_Y^tPAf(98kw9$fHAb9TL;O znd?yXK)|AUr*hq|q04ye<}4jcYqKe`;0(?+*@HV1_00M1?NUu@#VVEQ9OG)L)uh2o z%1FBVMnUS$v2Ka4&yBT~OzKg=Hu>IafunZ@EJT(oy~0`15(JF(e|m@VUWH2Rf*^1Y zz{lzfuIVwYyfUttREX~~m!_KiZWz+sgqq>RywV!D8b}_%lS+UHsRc^?#1}nLTe3_$ z28VTl&7qtzLvA99$92Hjq4bV1eG6jh-^PE)j!U^3=Jik}3AHC{ZKC_H^t}eKsdtml za0Gqa8oV6yVz;EMpgg&{zMt~7vaB+DtKlN%1vNfO0;5^!q;j7`)7Z3a0hV8Y=SBza zuNBhzMgR#HHx`7J?mZjoDOKqtt><9;bP4X&gmo%nIaUsKNV#HExPFSD%iFl-3Cw3YqilVUvYWuF7@P9+AikuY5>y`paxiW*OVvs>BB zA%^y`_Q6MuGDVm*rpX%9A!KBqsh&YmaC(Nb;#TM9 zFw7aUx`?~A_Kof8TO4;up0$Xt34(BQ9&4GmETBGkK7?SM>sqodQx3Id-)oA;Ft7tkTPb9PZ0 z=ThYuGO$c{jeii$L@syO+t`@l3QT(ve5QE|z4T@s82ep9fCQwTNY@Ev?s=@)El_ zmar3?2#J6s8Hiyqb!MHM{5b(x^q zTIYdLbiHT9fK?;{62V4{+ZJ*L%_U^a@MBPRY;B7T#M3_WDsK;G$G_mZ)Hx!*>6q2ZlW1{ zW(}P&<_&t4X7RGWJK?lM3gcQPkR7={2wh-CQrM)3!Bn^;fV<=PCr8H1lzIEty(lC{ z9Dz9xTdvq85sP1M``7ScOdgy$?umA(zi0s^y-)VgqAy^MH5JP-XBJNmSDsE^kfx$dFZfL#gRWdBVr#&*7&iPE_z zvj#u0HD(5CqzgyW4Y*PmEO~aOz^LR*4~eTwd|>5%0ep^Aco7Bm1zkt|ph}5?;0_Wq zAmT>}qD+S1ec8%12|`eJW`=mwHqjr~N35CkA&f9^V(6KuW8i8i>jbjg_I@Zsf7!ms z_GK`bs)&KBtbACZzc+JJilaL+hs1Mh7-)^f)Lzjv9|gqO_#XTT+Te?KTW0f1)K9z~ zCo6a!oT0u4A^zhJHvAeDOVKme(e!A4Z#&060WRs^E^@R=7EKon9(3u^)F|@vp@5)& ztf1ROTkdAfR?*V%0o^${GN&z}qz+zoY?iC1FUQaBocSjj=TX*xBc(Q>S$PRLW~;-l zZ{-0c1w&CF$`voxo=;p;WBiRPOe+zsg8Lx2-2r<1*mQ%Pdvk0a8xClfFd>?c`UyQ< z6YPCSA>wy=^324Oi z1LoAOzEwK^c*%MKJcExuWkFdtAD=aF&GcC)+v03*_T7*cyh6+LnFMJJz^0E-*_B!l zRX5R_J6YjHDml-h><*pGvQ#G zXFeD4od{uEp2#8Olu(Sk%;L%fN^r(R*Jv-D%-tnbFmfD;xaJNoLaTngT;O?LpdQ_0 z|0w*jWoHW3MnPMjjyypyf=6^c!E&aTJOkR@b^Ltf#f0D)^6+={)(bw=sI9W`pq=U5 zT1+-4r*lyV;d=)4NC#`^?ZaMrBL_Cz&vu^p;?%>bQ8xILDs(|m7W!shXDmc&^31#P zNUmkJWi3=Ww&fq`oB7X6Ae@5Ko{_n?;kz6uBY^u9*r9PUC$C}LSn>@^XAYk8{I0q8 zk1h8dK2~Hm0i#$fe$sz}QNN1KGaG?{GUiBZbO7r4wB-JVe^YZ(-xMFbJ=12*x4loY z1vlJgDR}`Iywr!Xv|#VmqfwfL^?lR+5E=X=up^#p*$Epp)33D^f#?|Y?v#R+-7U-7 zgqo!)-)#e%tb(gTX)&=k0%YAI-}?Syd86$m*H3ijLs~VrnP>C z_LY2CWQx1uJ;;Ht@QHujr#OuG(wLg-5lT0PWJNN_cGb>ge(or1DBsh?cLpN-T$8B= zMgXBd8;`Vex@5-&LH~r~4NEZdgAdPusb;8I%{sRO;jaB1g2sSN7=UA$$Rza>!#`MX zfx0Jea-W+zhIN%?>?YM}!M22C2J}3kLN3o{woshx5SqJ8Jl65<_E1cmFy3cW8X|ef zS-zc0I5P@I!TPRKA7e4$NJn&Yt!P2I5;bPds56DsdKwC51f@T{Zx8{IgM z^EkhAZyNoE1-D+9x71{(et8`S7hy#4?nS6PP1>Ue$NIjR2j6v-W0cuCZwfN}2Mp`* zA5JhoEc;#gA4mgWWFd+~0ggz2$)U_VxYZTp_MlW037y?}RHz)(Xk zgyyI_5e8wex{x&cAIj>a-C721uetzKLobx-G~Fw`ns+{!l>;{%j{^*!w1qo?do5@` zPC{7rRp2$-f``yOK22VE1+I9`Rclb&V){ZfUcl{VMErPIXTPI5U5|5OcwdioLA=fL zBdqVMvUpsUO=7!(?d|9o(K-Q{J$K;R&*a_>&jzj5f2w_AXDxrK_F_cxc11<$hW$(FFvz1G48;f6I>6Z)v?CU$*0(Upx;~1GJiq4W6;4 zT!kIfHy&JyJm*(x<;|K<)yt(_m%4DAzx2P{EM1Ej$~f(r;h0AcfUocUx&Et#W8VRE zJ?Mv#&kil}%It_oVLoMIPWGp3_pgjOg^xK&MjpVsgU<>0=LkRQHxKZ&e}{uKgXRj4 zJ=nfT<8b=mQkQ*>`U!+RU-W_d*Pru6^{uddyT6;7SQP#@L3qL<*<|WABNEeMMq365 z8r8-#y9VyU^_(apYqwk-&DEX$Fues{(xR>c&Sm=YR?v)hCci8a(rmK<-bO*%YTOYj znOeNq%NdbpjaME-nuGoegHv92Lz%trF8f`H^cfQ`AtB<{>cOb9i zMZDBkVn!$Y2uEyf*n**!fA;LP1FvLdnR(Lye7+_E-Z1ex5i>PNp%Ea(45a%Ex1gVx z2phX>x5a~t5k|}uIWSh~AjJT$U-+MK0$cxhA}(MTvCPAB)oY!@?0{ql@+e3z4j}0} zV$Vsvy&HxA3HKZNa&~zjelw-BOuAS#?;F&Kn}yzZyy8-CJ|ssudvq2QH%f}%DBsD+ z_XH$IA-4*e<6V;DJp&^a6nJWizJNc!Una)iE4`X&jt5AN`}OrKD0b%-enRugNxjv_ z-$SwgCX-l5j#6$_G{@Nz6GQH1oD+Lg6co$SlJ9XqNQ^KWB*u%}Q!+W>z8XI`&=s}B zB$!G4IY2tF87_g0pUkAFN12QSa3}iL{}|ABU@XPNDQwXyIx**Bb@C3rzQloKZv~#{ z3lWD@F|H>gbOy*PyTJ#~ndp28r`W_E8TSRKmeNW!z9Kga@G-Q1P9R!ONVl3$qe(%N zR%cq5{!t#jSMScHF#@qhCoy=hiVCbp0#L-nHsPlbAtxeEB-Bz^#;2+eV3{DybcD(j z0zZ+8EDQn3)BvSInkN5$mujTLGHJEsEhW^yB*qlr<$p%z%3%PN@c)i5dO_F3X;k@# z6okzI+e#Y@P0>OrVQ@+F5s?(aga_3*D&$jT_|s+Z%hu>U`&QEyt&gD^Fp5|+_%qjP z0Z01_%NaA~DixDMWAqsWhZIrzxWJFd;}zSHO%KK?>pQRmtS{lq=(Knn zg(2pZC!k$PFDaEcRVve?kRr+r#SFfe2bbJC>%%HARjH(F!k6-nFZau{Wq?CeO=t92bCF)MS2;p7bC#^3 zb6iR5q>9F+FwIF-kd&QiSVXp$Np>K4QmAug&2fUgTng@iRX|`@U{3_;@t_#Q?FuQ| z^=EvozmdR>H=0Fo8}Ll9Ks~`ZPr*75+9N`}0k|1!WVWHqWhQT9lM00(Hwmtu1oJw> zJc4;t6P-HE9X=E3?7OUPd<Vp`i@`msL=lHHUJoiu{zS5R4X3 z!Ww5pl`IPyWg1=Xr#5LrkeSxCH>BbKM5m!h05Ik!jBdVOw+~c8RJqm0g6uWoPC#glNn4Ut&MpF2>q3##~agk8?xk!xg8S<=&j?WPOhJM7$sA7aSt?-+6pjG!OAzo9y zcd4?Ff-kd0yxiX>^1}tPqlFZ0-jo9GYH`XO5V!-W|npvQa@$utx!z z!1OG1Y-_k>i-5`)pkaR+XwX$wNU)1lXDr_~QrKFkGCN23%MJpxpLX-H>w%kvorQ^- z64>!U@HIA9q3)xZi4wE6`fQ{Y(A6cN%Z(0$P%5aNC{)Doq0ng`WY_8@(G$qg>32j) z?AnRGW;mxrYRBHIkX(2^J|HcJ#(}}=fh66S_znQ0m#ETU9rOrWe}+p_^qFobm`l{u zVcVdzOV-p0+YnV(u*~V}K-Olg&r4eHx(|J(4!rI@T>5~Uv(YooR;;cDK-Kyie7B6y zI|Q3c=A|Aav!ZVyhR1p=2UEo#8Fr^aAVc6CNTOHEhRCPmh$lnVc98%L6a}QguFfy` zNPR<_AmK6Jzjr87%&dPITx*7qsidh7^YiXIU`z zhg?|m?12{L0W4#;#%MTe0cIEleHnr%pV`CTAw~`4`sthTBI-)0hdGx6nNN_|*rCwGiL8&JO zJ*PFhq$}Ij0hp?18OVN_%kmx8ag>e%9@qrl!D3!?po*Yn(1*)VdG=?TtK5e@Q;{)J z@A_mO1~4aZ4`r*So}*fnYsF`rhnSb+k+3Y8_`d-(mDz@|E&1h^`Ia*;nXNX27dDfm zFE)oJ{%DUEK65~RLP=YO%#$|Z)t#6qelYA8ir)izDJU%2g)L)ik>`IgtEkLi96G|1 zXiI4=VLdQCBYJ7%B~>X>X(d<&nFS=A5HF28<|U~uYOZ0Hpk#w-aO;&Nsm&e0z@|v~ zVVf~`)D@FvDvWGWMhvVN;vfN8H&bEWyn&A%i_rU{4XEoH-c37@emWE<4yS!|Ib5RE zi(-%HqWue;n_(kvJh_FqOEocm6L`h~jj7+ELA5y{$-mOpW9!}4V7cqH9qse>>oxJ3 z=jT(#$20aLKFOz63layP0=~nMSZuBwpvSb%NBe3A(hYYmQb(3$eN)he#S%6B!VcT~<jP>m|FwJ&w`GrRT`Gx^EF9y#v-pg|{u zL1$p^nI8(d)d1Vz98fRS{h;w-RDU#Er0@cUeooaoOvBJW5H4pR=>#z}DN@*YJcT^= z(FXKunu$|O@PMydP89!FG1`!=kRN%!T>%Lnp3~roOau<0Lyx8=Aa8V^$lMsjcl$Xp z4xh;47|M5aF+7$>1v$Kg(*yK(_H16$lU2Z&lI z39onr0vXcv(sHips;chH2d^q4dDG3X6Rra88xlHuUN40@fUbjPF;wO-DNS)f7CTb| z5AS+zHs9V54NIw!>|Qzc0XJqU?)sj@a`$Gz{6k?$gUR21Mg{tIMp3*IzK|2KV8`Wu zHbdWB|M&pF@l{kmpkgbnr)bs~*E|O45!6kJefO8Yb8@w5 zgq*3J(&WIQiMKQy>GrFF^=6xL+`-fKb}jtSMP2q*je5+bVAH*EF!e&oyi<{Me4&C` zxlsUe@!T%ZP2kZtUh|L8*XGaH5qW%j6cfTR~HF zc2#3O1{oRT?ActPy{j7g%TTG@KXE7gkF8K~O9_?uTu5O=z2_qd;Oxwd>Sa)~m{j$Z z=-AMVL=)P+8&RN_y}#GORnTnAp)PpWS>32^s2!5Rey23EuP+s0;L$tH97jxx4NRevO&Zz2T!1@Yn^Sx9o*^uO)>a-p?~8%+K0H&4y89 z6WR)1;HGEd&y)I&I$j3jIH)eZrqofg;wK3CE}wwJ7qZk{3iZ4teI2v7MN)2sJQ7v_ z$d|A{e!F732v0s{d(2K_Flm>GoODH(Z|qJvLg}ayRUx<3$kyLSr_qBRejyK>@>e<< zS|vNdayAt88M}iPqC&z-3zLv6UvPrHEFvzY>d|a|!||eLz8#yZ0fP8S;JwZ;$ak9I z`JKFn?`?l!8_6BC>5ITT()f=-!V0{?Eg;D3y~a|Zpuc=N)$)>lhL zK~{BKp+ji7NP!$)r~S~q5R+)qqlt`y-sv72W@cA;#cuV$Z=s-&i%GZ7;akIr`l!QI;Y{KC?3!KP)dVujSkLKJ^Fi?qbt)t?~gKgmicL;95-QC^Y-5Ymz4ekVopuvN?yE_DTC%C)w^~_wE zx!;|<_xPh1&7s%ob$%tg>QwCw{Kt@~nSyLRi7v$Nab^jVm|w&RH<>`~gQY=S;jwn@ zOa@C^MnF86gt9xB_#gZHR3SETeXh^H<*Fl9%UR?wR&fuK6W~=3Z>tkO3c# zv)mLgqkO#p=zytL!Lql(pJ$uxV9#}^fMsVeUeJ-cZx%Sy_vxaG&o7|0P|vkhBb^tW zQViPps>#>}L?IG$o1xHi-+z7nV1vL>Cq^;9r}gCr_4d~$akW0b6gCa2FR}2xWBhRf z6S2X|_Mj43AB|)Eu6JD z{Vo-0)*#^D04G(ab~EpN)5RrBLQq`lfME#(@{Gnf`f!Ps8cQjWud~#61t-Z{LL7#oBY-6t z1EStFlBJ20e<5V(u{pUsM+`Q^yg5zT(JHnQ-!z9%2lpLfn@1XXXgUO0m}Fw+iu97l zLMCRJ>oT_`ezj|dVW?l#-#dLZ2R^THIL;&o-9yz5B4!U_wEioJuyKBqMslw1kLbQm z^xTGlfXhh^l>tTa*6$G4_Md&_gFra2JIQkxWe3iS89*{ezz4f8?LppnK{Kt$d?$OX zou`NC%5}mV$KL;>%D9|l)vF=>@Il1>cXN%z{~Y^LHgR?aa<(~<2-{iPIsUhxXt0v5 z9Wqc*6qE)v!o)_pd|9j19OLJ9AibqBs|azDIT3ugyy=qMA=@#XW-`Ra({`(0Uq0D9 zS=s~Wi{b!tZ-{SDA8D)8S*F({r&|cWpWhqA1rj1ya$uFV)2?kfotrjOgihxQ{TwJg zR3rbbF@#XpY9r!Fn%VQ(^2$Vqb1q!`SeAu`IvR)*N)wX=tnpwF$V^NRK7zGfmxMKR zejab5er}4P6G%4-x^+_rjtvZr77F#qDNkYCB$0oBz_ijOsm=sp@DfkWP;sV*etKijrx)I zPwEq9jyGP?PBUjbUUcgpc$4LvTtwf6K;!c|4hr}TIi zb0URiOkOvQ#6wnG2aQY{us9kP8idvR9hle)b0WQa?@cuBPki;ijnoGS9t@>akXK7x zp}xyQzqv1du_!q<7%&Lg5%}J7z#1RrFI3kat;Uk1wNjKY`u$D z3>LUys{SDwm31JUG}>+;LcTi0 zOv}Zok6o?aP&K$>JMGSRi%U@{k2E(?Y*Yk-+RlK~Ro$rmh=poH@r5f{?$}s&H2O!h zhTIRF$n=eVvxW=U@Ou&ldHYsPRhf)DPv@-zy|`k359>_Mmf%#@$#lw3(AS)g=k|8S za(#Qg-@To?SM#9v&aPz{YX?SLws9Rmuw)#{4}Ew3)HKYBqgK@ePATgDmfQkp&wrElR zKX6*LYWsv4PJc%FOV`hhxma^cUw!G6>0s;X7gzdBNxUDTAxk((I>q@_=?l~O`P}K_ zCRgfVmGQwkY~l#;E@m^qLLK&`DU#?3N2>msw9Tc{j6L3z#d!IwA%_eP-rO^A3=Fqozn>Sbv*3{gSEx){m)JZx05+j0g!#w;YA2B zDb}_7fwT5^+wps{W->A=bb2&G$=%TaIOx|H;ZY)EtQy#?Fw9uS%>b8Af>?qWJZOv* zMnAzPMJbq2F-Sz+N0q5Iyvp4`-UZ!9v&ONxer2o7pK|gf#asQbJ6k{j?vnSsdi?eJC ze*8!@ZKcng?~{+S=2@AZu{+$$pW(eS+R$YU=r8fV<=6TjW9$FvFMrMT1}90|qpG5Y zyiZt3G{s^`8&NG5`3IWyx_G?QQCb>xcpQJqfrNY1szX$yn` zL{;P002M~Eb|W2a`PHj0!Bh4jn+UZk-QLT7me>BOSBKZxm^k8DJE8%GH>@<#4tz@s zm&VVzcsXSLn{8YgSl*OO>Is9*p!H3S#~RlJTrI53TI=+(sw&egI2>3-q;Hp2E}6oi z!4pe4!7kUd^kRCF`cnh)6~BI30Jbu|1h1DkSbB0XDZBQwyRJ!+VbSpM7*I0GF!$}u z;qupwMpq#pSnK*NiOf{9xvo+y$nG9-Oqi<4KLbe95J(K2HKyYG=5v%0ocjY@x_hM9 zOXf1F3?Y4g*bKTe$|IS!f$es*_e`e0a4{pE_RqlvsE+cH^2F?e;uJH&J zY?0leY2pQ=a|H~!fCOkFiDc>C_N#6W)ZSLozaiG(Cc?fMe@Jt1>St}`M%!Z>|t7&9-YNNI&pGyYg@er+l7qUA#RnUl^;47$NiRLZ; znKF>2sFCbBNp(}S9@}#@>lHIuz`>@3orTHA%;mez$K$=bxwPHXbFHxyPKT?YL8u3d zKv^c$>7)U0Ir^-qk>DwgHebk%udER&-cL@00Z6OXK>v{-I8j8qHXbZ$oT_}%)SGbv+7klL2Io?$#=h#A7a&Er&j|wT!KYf zAf~G&q8{>Y5rM0h97I2Km!cs;SaK1&CdyZo5Ur(|?qI>@F+QD)5_4&i0gjQBpC`w0 zYYn87N+y^!$Fx+2%HXi=s8On&`+D(;WDM&C+NLMH9GFEqJ~ewLvxF&oI_@lquAdhD zTyt3?^USQ9MM>XMTv~H^B(q@L!ZzA_Y;*J^!*1-LM^m4Kr~R#AYzl*?Q8aU8qhDY> zO;B%4jdA75hIui|F0)$>>kQeh(cP=>1g%zn?CpgXH$zbH1;9vbC}#5Lz)0Q~70yYE zQjoq{0Zw-co($tHXK!@SM+w3$PQeCy2c!)T)bAy0izs)8=e~e&-QfzkU_;pY9JNUn z(G)uK@FnGyk!~ABr>E%W16<0t+MY2gTKFA~6|k;CiP46bOEB7~HD5&9{qt=d2kAGq zt1>-j>W^Wz#Gq5BeFQBDBqDB~LJn-Nkk*7ra=j!)o$tGGm2Fq7F&3%Ut)UE3)B`w`wP#IUyN8V?+PLU!yvkuFM^O1 ziMQbq^r)oUVeiivoC+ zbbGw>2y@KwSLTA-I7pbQ#|b#W5jrzStk-NYolJH>iS9}x$3cme&3F&Hx)0DLNswD< zcn?%xueuDA_evZM3s}-!wOH)kyhL0mnw^U;x6H{5NW;}^$t91h+wdoVqqSC($H+M| zI`cxRh<%MR-5%Oio6^4fSg3lFEC1ny{OZ>6n|3gCkp`v1sF4I4lx|gukRQsO;TJ;Z zi|+x1Ax+1JG5dO~V79`{Ft&E}O}+frdOkhcp9Q)g6$Fz`)SNnIxR=czZ|bBUATXYI|^uSWOLZQ3CvD;4FEQ zBbYz3CIle+MSj-4eqFd5Mephs#{3Q ziobf2YXKFVwV#YiXs33B>n0WQt5G?UdikgfxTn1w*(P9;IKtO1`PviJBuMSbCmja} zwb9)Z?Jck!R?(TH8&?t{m9x%Qg3p7W0L2k^^VVlHQ#L;EBBTyMSQ%MN9^AMuw7|q{ zvG689p0SobK&K+>6yP}$>K5er9!$$W^_TgG+WD#7jttl}wNhyZg$#Vkr ztcL9uYbAF`Y-u{QA#@Os2!_3FkN!*`LK` z;0BOb&X&M@1bMU( zi%%F}KOSTNwv`fYjTAl3lAvV~h4|^r!5ILu#v*zL!1Hm3e7^hyaRCi+Nold#&(P5Y z@D}#l3NKe`9#xZGu7y{whtS&C zf8nhgU9E))=hU>#ojy3XFF3{nzAdYBO^E(eEg19W9!Ef@7&d#Zr!xjewbvn65~<+j zOJnPNte-Xh{hA)J5XMoDf+c`Lg!jHzqr_!XqaHL*yM?~1Mbf24BNVM1AX=J<(GyWA z8yGhb#Z}RL!?^qYXVN5(Hte7QmL9v%zl*`ZmD>L**Z&rS|Jt7YN8U`*^zc?uM|-nn z0!X-%7?T?i0;I`;LbO~Nq=Y|BOPWK&PnSF}UB|=0F$2&kRJH5Nms{%S%I6yz)U;=X zC}BRfen_U%I?Q!dZY{36MQr3>^?e0gwz}!*t$SS$jJS>jCRP5JWH>0;j>6c5q$ens}zYOHiB!10&l)#gmVLivF}wSTBWvfLpjkKl6L zOAVfE`n3WkrusmZl&HEpsUglFW8-rj%}N~ZDyDooKl-;MTZ;iFGvQGbwIYaQK2f+K-{eVkbxMCN zjD~ksSer((rxz54w;WZ7=JFpY!+c;={qD|@iL7BNK6x@SauO$S7aL-csuu#$HdtK^ zq-tOcY#R_`hi4@4^h@Mkrr4B*7sZ^@?7plC>86Sfdi;#VfIQE(2r3%9s6io$k;i=y zW?L@q462fj8ZoHkNs`<)w74^kt$S^Pt;MKMR~jPK)E zd5}-~vtX;8L;q}y$RE0ts9K^#SoQ{b4AaTkf@YYN1d>RM12f#FlOZnb8jg0R3QT%* zvlr&jr{8?nhVx+XdE}=*8aA0=!r}Ete@_=B+_<&nW{X}icnk?U(F4>Un5O1R?UY%a zve3N7=1mF{w1ZkT%*au`Mi=ihJ9-bjal7_B!%0u^an#JPdX-y5V5CL1So^n}J@tZ? zI@YBm%`vg~yKAJ)w}uGaAksuF|IUDU6ClFO6A68Lggz5E2H3 zB>NxjsO)_biaWTl>uD^tK~l`IK%%R=)ypySXWOBZ;e&WT( zuN&KUPv@>P*DR(<=vDOjYQn{yQmh-@pgPUg!Hph$3>bCSLoh1BD<3Uz5yCg(p$`3( zicn5vUeAUnMNV70v~KE3nqZ|~NiD|N)N&(ZmG%18l!fV5K*u}7HB>UoT{bvS>w5Uj z0cM#vgIG>b+}R|9F1g6LjbkZkOlH}H&2;4DkV4pkdM_{yMl;N}ERa-%`_ttnPSYey>=9<+5GIdF@zbpNK1&XB!pbBiBpYqtJh)bRoSK1PV#Cw`n(tv(rRCH^YVF#W02Ng6$^5LienIEO%aULdz_-p zN36HKNqqYp&3q&;IW2CKs%Sh5cXdu>y2|h*ZMF*WUXtv&Irl}XR+6lg%PYYF!weE@ zAwL9v>pRKy4z6(xbvy9FBJje3=bsnyIEaQ{NFcwR3;@WA^W5CYi`!i|;#th)-;LZw zkU6r5B{N?KWt7ZdujG`(AstDIfnUIggYpu8GA_SD%oLql-7Ym2YwqG&X31|vZ9ymL zU8V4f-=^8IUi7@>@FXIpy`Rh6-4$puB#$Nku{A_B!vB~28)k{Z9? z0QF8;br-McAiuWl&o=$Bd5wtM9O#Ndu@7WU_?3*-AzqNN;f{Js%wgsfc)qJAqopXc zq~Q4S{fZZDrkMY8v=sWzS8ulO2Q>UXzNn9k2?540=AMwg8GFuXor1mLDrLW-J=t6~ zb|r|%p`$f%{XNqIn@Pwv_Hw@2gU~{ys@N4Z+{{$`a5YPfG3YM;!KgpU?SJ%%#+JLe zGrEoZt}au@zRj6`{3Xad=g_((r3U;uX{@SJ;1X+$?2t90c5=XjOcuvtJ_y{IkaHmp zjZ-6IMRr0+PfNCteWrTW(v~+MsT?r}F#4&CD@v-v_2Tw5v^tI1N`g^h9-l{|)*@9f z_7_`UE&;%_Dlh=B!reEmi6`nPzsI zVj3#q51EhX7?o)g2jzHzlWRXx>}JI6hoNs`Hm9wE7rpMBP49$Byqhx_eh$=sMWzcq zhl}XrPMxxu${b_?LudLmvExfmGJY-T%y^nST_hqY+g?}Fyu}=2I0w?uYUN?Dc&WlzHAf6rY7g)` z3J+4gie2&x$)q^-ElXy1^|;b89W;7~UFLM{ef(}0IC-~pv@Ayzt*tFSJ;Q#JG%ovl zMy}@{&R;B_zuDY7t>9G|Dw>E1*ebRsS=~O+@QLs9dE+gl>$s-rjF1M?b5SNT0IX5x zHBpZ^z;U;)p;QqPMxYuGe}L;-2GTcfjzYhag1?)r9)Q2k1#IH)U2~}75w0@!WDkM9 zS;4#=^8oNJHfW&U82PgEM|Og|0xtMRLEqHC-)Ze0xM2eL`}b>AJksnZk=~lywmPG^ z+c(eYpx!+A^m9jGgS_G{==VRq>w>@YuI_-pzXojTZ(X~Tv`IBBK)s9MUGOVh@b3;^ ze(CHac$o3-kWFHTzDM7BPlSB=2>$*7!Lu8m3hHgr`z@Nvk8o8V`u(0~6OsDi6P^a* z10-y~J7o5I;RrwUJ$=tRIpRYo>Ps(A8Qujs@LTonYnHsE*q<9R(GG;Z7YF#ElDBVW zQ-J9`DD)(ADJFhbks)~Lyy3@6z;;G3@EMlHBkJbwMJ4} zHyvr!s4i$rDNr8qDFY~7rB#sF4M|<)mXOd#No6s;UJn$I*zrhRP2}vN4+l#7z+M%# z|D`Uk22M1V0)%;GxW9vXf7c%SJJhqYbvAK#mNl_;`3K&s|H>#0Du@)kLBd$1D5yX) z4O{4dgCm&&+x6#9OTz?)5^SE4J#=t!4i;~PDO=YPK7!fY*ZY`=-T62>udRYXNtWe|KX6_Ag zOgWalhw6YaWO{dqD@=|2Tve_1s^*@y@n zv@Sj$eLjHXrXga`Q1FXN3<= zW<%A|TK<9rFLYagfvO@BNJLcdMI{jwGQYl7QrFtfggY3=FASEP1mWd_FRG!d%{SzN z0s@DNiIqoBJJ*E`Kkruv14uV$L{%n7A5LdPQ64Ch?S@}f<=Zm8Lw6=TzFA(`2z?G@ zD3Br=9LVH7@S;49`kvy`lemjPUKmF^-=)km#H-6&QB3h59b!+BPs&aG5Ky3K5wXlVl|}s1SsE-m1U9#D}1&z?KxU1d032rXWV)NM|0eeup+d65v0kf*j9#L zriyrog?X_)u3}HClch)7#r^_LeH_mVoV%!F#0Gkgq5_tr&q-K0i;ucSaR5p0& z3>&b9kA}D&OdhmtvAmJI{SnVZ&^I0S^9ZvXmnP&;CIufOH>mU>-i?;8c7C}8y3uJH zYWrM(r|>gZRSh3UIp_%oE;RG_pQ1Gcm8Q~1AVy{TBm}!CHzhzu3Pqzgkz&<_kyiZt z5p!GxuQdRlcSfcL6VMoJI{L=aU1f;rdTl;zkOZgp#|yfeLnIc9mXXS@F_%@krmPDy zc^uO<1simtNxTsIK@~3kKRchQuUD4Wz(&~kZ=ad|t7qC-S(peK8JRda0cA9uP5wg$ zv0Y&lp<4izSNW@_h@lNVz=+LNO`?nh+11s^Q@g-4)#4F`-*^kuJJDRZC)di&$!>yp zf0r+-k^2i_8l0{T2;K0$c1~LuTy{MFoG1RYhE$C!x)>uCMpRBaidi>t4oJu1iNpY% z6kMiIFTo5`UA_Xfk{+D_$K76bTl5r0`o8RylS6MhOdJ%%I7MR$!La$QA)XQWBXHus!2j^O zwP}w1F`!p<{8lOQU;XZX-lTu{UAywA+=>DcZ$e*cVVgxx@COq`Xrvw-S3wD+a8)p5 z0(6>K+YD&TD7z-tP3i{}wz61_8_*}kA4bntNI_6+YhybTW1NF|mm8ta{2$aVBdf~B ztM{EoxfK-(DtdWMQyRP=u28rc;&jQDQnN<6$0 z;$k2GIxzaBBIFLVVRH#I$x$)T5g~qlr8h}bAWMu-ARsH7<#ZzmYYl!07-W1%K-R^6I1I^6quq$TSLTS@` zOR#-9;So6AVHtGAq_)rjgO~_Cy~>w-?>zWG1KC^Pfx0_pY8=?FkSL=zlUNG3xKtq*?%N6lK&Q#cvETMmbG{Fj6x8^1tYbWKZ`RG@kCAneE zpOqyMvPvm$aQ?ib_R{jm57sN2O0H9&wuCgv+`1j~a)!;sah>Eb8Y*CRt5j!*F$d%8 zBNf34kZs+GMG1E{-TYY+tz5fAdO{M*buuvDko9%`K47BXU)$a9~s3%o4`*GNX1JMf<*w zNWC|>kXEWU*5t}U&p!%swOR%<0;FGBFPO2=U`$%2gf1KhZH{Je^|T(Ru+@&mI;UcW zGrb>OgIjv4uC~jT&u`Q5W!mUsdz`X0>qmbXkY^jKC+te;gI#qk@XFO=jxahw?Gzx5S;$}q@%P(Z zd>+7fRhQ5wqK+^4B9SawgN!P_FnrCQ(5KUM9>LmsfrfPez@w^IQB(uVtoCI4l*<8h4AV2nUm zmQhq%l*NYbijKYvT%r)|L%THSH|*}AOCRmeAoM?}c%$)x#o_i#Ol>*>DqUv!ca5d6 z+cAw@kMwp;VD3k~eX_xRAz_~hyBpM&&erb-<+nDmG{zrK5WjONv2n-M5 zzeQ?)m!$t2;1#iOvbP3!`~&P}D$2@(Fe3Sg8iPM7q2A_`;oWQx^x1+8vvvIIdkLdZ5O$b(5HjI1~_l*1eozY z!I&I2$X$bAz%68a4pF~HWs!u{q$gb1)>Boc61NoJaq)5FVKw7+*)|gV>T| zbe>m8JgQqxIE5;|W*MJ4u^nrElnloUc!~5l1JUyomhq=bo%uJ~h%eEk zi3u8ltl?JK_b#*XP5!c@L*H%hK`?Q56**SA)#7#kBD3>*A(0gao=xv>&xY>bLigX# z<{z0nGhs~*NZ~m6UVGZ21fy~RiWEd-DVUSHK1ZM-Y+dH5*b|IFHseYm9g=D48gV7J z?ryRjjJPR`HF;u7?H`O>yTofYF=#izS$q9FIjR3aZP153=zVX2A61R8N zL<7QYLkZKAe%+tz%wm|q!O zFEUX>Wxfko(QH!sTswTQHHar!6Izvtx4JPcKegUgNo>OAP7op2~ow1=EY1k_`V z5eZ+>?IE8~doo)r9zwNZaw}I~gE>j8_X>fm5LxVGjx{pZJu0)92{=KpgnBcUbF|eJ zgmV#=sS75XdXj#szGVq5wvmgUMA{m}mY`jK1jI%0R zK?PAhNI$qv_hW(RaIx(-&SL8*I2kw^ID)Reo}sRRu8A%n;$&*FR%9;smoD?)MK&khJBx;mwo({HH`#s&DXg$08E_A58> zk#%}r07&4Mp9s~L@ecr|SU`%4Z)?h=y|V0u(<5xS?2921E$ z@@;qM_9GaagSeXz{jf&?dAHB6nHrFB{O$XMHq4_embw8+m>8q`?YTXP>U4%p!?t zVg@?s#j9_Y4Jn|h{f4ymljoGVMQ7H3oPmM=zfdj+5W{A z90C7@<3)hK%iEhc0-S*=d9nZ}tH1D2Qrw@7m5>d|X)qzFnH$g%aqaH}n_oUUfD(#M zDADL}GsP8TmB_Zp>W*PAA*lPJ{6|{_Fu!GB2pvA^p6%gkHdxE==kxw?6C4jIi|lYV z?FaL*&e4oUL2~&7L~%xk?xw%ybG8cAHN})T)ALV|Pc0Z%wRMKYMaldf3JGn&T!5W( z;4B$g&snFPd5)w;rB3f0gy8!{AAZDlen;=~zH44Vf})A?yb>EfcWYGDq+|Eo&-1opaYks(YAco4D~HT=r~o8?LGMREZ|n=Xq`@-LlrL&e;C5nI~!gB&=7EbD-25Ve>8-@j@>7kUmipd zsegmO(@`L|x~973=Rm=C;+#!=5`TrorE%I`XlvK;vyU6m0f?KSOzR&0L8%=5yX(5W?_#f(~NO(B1sc2zuyIpPjN;_yEvSt>pq6C7{(d;y_8j90Msi!o9V0+e@uL~GH zX}$0BqVqhXPA*L^QHHt%QTLqUe^YR4PzYs1kw4&*jTsJiYgHh-mpaMtO^XJe|JQoZ zi6&-WUvid#`G|8I1VIo&UniVOlRB38dvyg-MitUoqIF{r{Q7I&dbiLdess_#jrY2DVFH7O^SDFQmi`!4ujKcYP9${hK+T}DO zNAGLKvNRuUoK}SPQPmYTT)WAa4+R$TF*2hZtHh@tUgdhW$SPqK57p_>-G*lc5wP;nR<-$ z`0!lJ7t6Ca1@l7Pd@v+ybqOBCc$dJ4+n%pJcEBSHB4?40p0yzM-tFjF22RsBUq{?CKd-)6DH;t7Isj?)IF0; z&=Cg43s6Zq2r&p(g7jX&c)<@eBQSp=qwXfzFS|hJt^Tch)BK;^`ya3-F@~<4EZb>F$ymbC)?7L!jppKYU4yDv1$Yof%~K_8&t#9^yt8AwHQx zZi~3bDTJ;!t_wgEM+=!r@e#QMI0uw-gje%DvcBHJ^9Z%jX5BpLIP8hZMwmSTVb-*eTZ zIiI^bnJDlKCSI!h4W0X?nwyLgzx|tQWHYs-1Lg5MIBPE7;YKdDk*LW&ottxZqspto zaAof~FV=auUSATYJ|xjm1jpD_?t!nO)Ig>LNw~2m`9=$hSj}os|JVMW$FE~Nop>wz z86GF$ud~NaV;K$xTi`1ZloQ{(=f@!x`f0p`;GMu9c>M~>Tro75yOP>8Khz#DW~K50 z@La@@vbHq^8^-z48>KqWs^-KO%e2{!lgE2N(BW5*lVKZZl{>|ka|uiL$2;>i+aT;Y zJcq6)?m*HY>^AXCBo37o}R zzkfQuZ_NInb`dXl+(cUrV5|4(U8zCtAAzc6Ayw(DvzF?AQQGW_VOyKX_f`gZ`SH~srbRn^x4$HogG`)-V*Ru+MPW#)=R$pknp(Rc zerYck_zDNlm>wCAC*qJYh?~g+WACO@6dQkkqy@imBIP4&rnG933p{9QFLWmp+1&B=xBmnr<$Db6fKbMH<<7$4TYPa82 z9I8d@YBwFTz_pq-p%3n-6RufuiZ$*}`xWeR6jDQU$*azD^ELu(H5!_;2yOU%qB?HD z*nyqS37|;!C9u<(;g2-nfaB}~O-gwsenxx;?lyt+E)#Z!Q~vRiPV5D&aPpB_CG>nm zQT~bgEVH}!G3(QtlUCA4*!xR?wxX@65j3WYX~fuRSmvTs?l+)D_TVZP+OG_f0Cyrd zC#(eQE%`TYp4)@Ad(>i-d~l5m=qie?c>OQGx)6od`KCSB76xS2;iujr)N+7-q%zF$_fMqScsxMd3L#XyKl4z;;? zToAlQwU~fLc#af`T48jDYWBJ*S#;mJsT~F?YcvI+(STPSgYVC0jf|upK2rnZN#buC zZ~szt|BnOsXL?c5{X;y3w-Fyz3LH%26PTa~OgIjTcL}3Zw4yLcjszV2cwJ_4|DhZ+ z_w5e<<90$gBHzQoSElu~Ob|o=D<5BxY^%fp3OE(CjKNY6k zO_scsJ+@#Av@4Mpu0swqEF1}X`r;lact``18BwI2%0@T&AW)idI4^n zQ&N-b&(m?7a40ZEyg@nSzMCsWK{r|sonI7DuZA|U35^h6W2>rp?T1N)^dQ@rdn)U9 z7SpD(dq`ZV{R>VL)>XPbf ze?4#THF{;s4ZQPK;i@+;sW1LWgd$g0@$o&UkKQGMQm6R(49Y zVVSXIt$KocwKTDcOXKz>CuB`-kilb)63O)GK8T?_kalTStOGU?J$k)vL*HQ;GVmAr zxIrIcshF4{n4y;vWGho5TeDVmk7Gw9#u3Inv=Nv6u2g7zGn2{M=Fp`Lf2>{WX&Q@H zZlN&?-?-!{?2dSY6S^LxKZ^-zkHS^&kh=52>@R8k;W1>T7xM?kOFyDf?oJ{-^`$HK zqM_Ee&qf=V`4?XnauzxLS@mFt!J}&72NoC)1K`hl6=j}|zYXCy?AkgW5fQTlA3pH( zvzxj{|CC)7;u5Pp8SOh@%d?K!W56%U?DHO{c8$kmKoa67QHE zuyiP{rI>yO=%?g~dDXdHnx`26fd>B!8;e4)+L>YaC=`JjVf_m$`r`GaRLZpOpAh-qghsz6sC0tELzM zc8)A?>G+Uyl6Sw^#_#p*4n+W)8mE^0a&<=f~%f zY;#j)D(l0WJThR0gb6(gPh(N3%^FKD&$HfYaQ>DA*W0Da22B^TbqoicH4yvI*-jz> zr~F<4%$f(sl*Sh>E5?|sW9nDGysK{jUN$N7b`7qPaMF$V8H9@kCs*({A+GC;H*TQK zxAis$*yBnxRD$F5@MKvd>lw|3`3h0Snvsb*b)6+>#^lW zIcio)XA}c3nB6|u!q%PjlL}F{##FM>?8o08bjh?2NXM{_E*(L>0t-LeRHC4MQz$k}Cef_L|lB{ykl*+C^oqEMALMq%=CsGEr4} zzX|1r(sNBEoi=j*D#XGvSs@U=Mc<;XEbUH>y>1TGq4ltFQ}6Sy&mVU|KjWV~Al-K} z`Yt9O1|SMIK|Vzyr4dci`{DHJGx&zbO$K4=CESLYeHzK`3Y7CryW3IpTV#AjOGvT5 z@E%NhA+4#&6n**H@1&GSV0xH%SIu?1eS^G=f2Uxt1=mq#e88#$|5v9?IN)C;2YE;0dbV*Kd*)F7E zP!59<%aS!Ssogx1NI4&CP!W~Y^{{KccEESUOIo+8lP3q?|J4Vm>NSb|4)leF-}(Z} z|FbXrRc>Xf94pNTpuROEHq3rkC>9lr4$~4U$o&DePHkDQC#cdk%c4o3g-j;v;Et9p zWM-W?g@xax&lk6|v?ddr%kh-Qxsg@7&)vxTdbe|}{sCnZ&M2!hvGKvscggvb>i!zM z!#%xHooA-ej%uz-X}rvVJuHy%rj2c3%zMr`g3nK-dZpiCxh!{Ys6DXn9O#Oe4Q!0D^0Kq~#qQm1 z?ZI|=?l|71xr4*9CReVbT?y_jN-^xvW^OHZna+;E1f923kJ`)j z+lrilT1lIXdI_8GN!t!rw`hpf(mVYR4H`OB7+B(KxX(**9`LV=DI%z#*euR&gaNPE zu7)WBkgPWp&Jx0vLZPhrRodT)v7chm4^l&TVWQ24D2{&|ywwQHa$kNOR+>aHv{euI zvOKkB*~xWZ->6^g))*~d;l&sD zd1R>WxMDuDgm(RhtU6;#nQn=XQ{kT+bFng2Agg>{(Hyj zUU9=MeU^GKIj;dWG5D>#f}@UaV~5h#TgF9Bk93xa+P>_@r+tNDG~JZv;1bPJhvnGaGWB~}-?d`L zsF^d7Lw+tnSaDd%AL?a!iM%-{@T9c4iFF}LXV4~MN5nVBgL({YL^qiex+L=0*$n1U zZ1!E4)&lHz>U~_YYiGU6xpB|W|G*%gBNSdPVRBAqa^hR}CM2 zs_Jo(kIYyUrZ9@VzNcUeeEl@)XC0jbU38s#B8Gi{!1|4uf&E~TSnYGrE3{-9D~ycr zSI>i1De(3$tkaeuKoRwe+g}9DI;+G#n+Af>#@l{q_+Pt6q>e*eV!8 zT&v>Z9Pi-B>B$K`qEa@Xc$kK>_x?@~SLuVGwXUl5adO{gEDK>g4aG2Eee`=pB3T&_ zO7`|O7SA=W#-92rbbqlL>(!waIcLl&3i%0we^EQqa^6^{ryqd8yuDiPm$|0@$bt_k z1lGl`{we>;poZwgHQC$goznM@=gKsUPa1wq^Hi1kELRPoP4Bfw&Qu`35x%fq2+lb- zeR4|86hMnE*z6mC?;X2$meo35`Q5_=37sNgM4$D(%OcisO-{WUW4Busz2Ca&dkW!= z305#oj9ang>c;4h&8~5p6&1@K8OV7&w1e1Xodi_zd(3pzYI9-~wT?8C{|2J7m^^eF zNCcQQ+qcQ5AN6OfqrVqx%GF4J$G*yzAnTDFbJ+n$=-6Pftf-z**HQjFglgAcy%o9& zEggy)QHp=z(n@0?y$Lc4^7>$Cco(57LRo73=}7vu;ud%TxJbH~>;UW^qd!KEP??VwBxQ;ii^1 zY#_nWIOX|E6QI&bOjR#h@ata>P5!}r1P3exr^qALxLHfwcMLL@X zp?X)=sO}t|r&ua7kG&pZ4Id6vc2a)u|iAB#>s5V-U4LEvOtod>rzSN0( zEUz9GsNEW5f)k=cT*3MB8KlY1EHUPRjIgil?idly%rWTXjE3PXrF(n(p=WKk>)RekQ94A!T7=$} z&>6PP%M%=btE+h#8Ic#zUgc5(W?J3yL$jL*PnoQR8Gi}@*bQ(o`z|BxmG0b29i+#K%vkez8IrMn2K{t z-;bzF=I!*DiB&;&@2`Q$rTpRT1jxFQhkawbnWRWS3zdngm*al$u>oGtj+yxr5yBQrvb|`9rledy#V<9GPUv+2SX&TmUjx|p5mcrPFuZYj8)`ZGp$a(y zH%B0%IeKkWXnCH~;dDr;$tOBHlC8@B6T?mg-EU z1g!Pt76)I9#{Ovc^*tZ&^a0%`NlYC^jKU4#_-FJ_SeToekYy=4y^=ehJ ze~5u6y1F|(EVL=CMv-I~2~L107cPAIjw>0Y%&YY)FXDaBA1g+%nw+bHnH?#Bz7n-R zazrj9Av9$7TN@7($wAC z_^m7mj&#tl9fphe;L5OB>L8mi^)}_aPW02{Q?awDcdtGe00>{AZ)g#FTfHJSxy{NBUg(QGiEWjmIou!a_)I!^yQniI018LrLymF zqstE83UMp}QwUI#%jW@}p$vxkIxVdH%qF(+Dxa@o}Oy(JpUeRA&Z-S@MY!*hJh^YpF@gN@|5lvuU29(u5L4odpaX1jzsKNLsT z_G;-7MO8p6PGRP0P>glL3n4{D!){NVdx%b~HA8S>k9qAUdbw9;KZ5@jWjzI5XemF|Sx3I#uXnQ@fPJfl3{Q)Gx_8Qa)ZyEH-B2w66J@xXmXe!& zRSEqP*>)KzHn3BB-@Nn<8F@(+rm;QKC&^oAAc^=$aFAeLJGmfAuEj^KRr{Ro_apG6 zcWU$y;5OQVtNW37HPc!I=ho6i=z?toA8-Ce`KnFbof0_JQGS29|VEL9iI?3@MZ1{&$US z2N&RQe~$NFlo642Mvu+S{=kVCjby6QlYQpJ#Wn4=PtP+CW#8ivP45vD=YuRNmNI7@ zO+Pj8e#poxx67%01R3CCr4lS$+hU@|pncx0Sk%M$sQIxlvmP2yGB}$xJL&DuF>YJh za`A39E-dUGXQ8_PzQp4>PG4W7EZ<5Vt@MWLv%bIwFrfw!IUq7~s!&ZlCdIpIf9Rkw z`p}a(FYHL#`O$lr7)5gWaiFVa$D&^o9k^P1U~vtMu-Yv(FyJ>XA|&Tn9Vr&xMMz0D{4IXe#fSVsS*_j|1+RPvA&{t>1{Dcr8sW za$1`4b+nUc>wcr}S9yKqd>b~=q0IWG;zKPr(!m6g|qb$Rd$Sf?x zU4+sk?l}n4N~WzS{92&t;^V}IGnA!sWg@cLQOqUogRn&1Iganw!(O;nU%)4K{mTC^ z$Z2KGcQB*pyRV(dq1Gv}RnKS#f?CUxTzbTI55)K6_G-H~*o8wLBz|X8`x$J(!G+y_ zjG}MDt!=TG@m-2F|7K+Boxk%h$s!ye%CNQS-E*?$a@0iu2xp(UP^u1+u1!g_WTeT! zgia%7zG-Ct^&KL`KwJA#n7mSFQ|qz$4bF_v3^Np24tW@WdVd-q-uY}k^sKt zJkjXNck}NggiBw`VvKz36AkpuIh}S$uh-kWDNIM^dZwBlVoZ=8$tV-2gd5jquNvJ$ zOw-;XmMc@L^I+Umwzp~tCOm}~*eEbOv~8A20q1Gs(qJA0Gl6eRHJmwZ-v6+wa_X^L zKg@L$9{S}d1VcQgOk_i$GO>uZ$)3{PAHI^x8UH3?EV4O!3hjJfYG?nEA^Poh@p#jv zN4YSTGoZd#k@Eb|Pt(ui)FT!gs z)eKD5$K#=Q^|;?32j<)nuhK%I+uW)IJ}{vyt=q?Z&(DI(>onHKB!## zksk1PrK1t&yKPNkRgodg&zxTE!Ev>@tgaE`Ql3i*ljTi3=bfPBxx^mZ|fG|-2v&UDXu|o z)WFLnMiMA)TuXs}|L5%rnZMqt@yuSodkRI{$hVKRcJiP6CXG6=qL;=Tv`L9I<;t!g ze`4aa23B*nS>R4vFatCq!%BcVZ*pxp?E*g`#GL| z7#9zUH4;_oBAwnY{R(M3MB*?nL(*fhc)xUNb-yREWa+nRpX2e3!fd1s4vwvni96~! z+I9Qh!Tyv`&(q<4wK%T-{^2C>UU7lnKY=eu_>UyTX5M3S+Q6CC|#Zk`T0)$$+)R`}*{x_ZQv%ZwOwayZcQI|Hu^y$@EB zL-Z(#q%>y!=($CPBy_TmM^9vObXpwLtUb$(p^q@;8ClG(wDu9u*FG7_eRYPq*106? zm{sgnlw}mrum0&7QEx}hHQ?}Hlb%H)D7B=8`Bt`dqWP0wQ)NM_j_`HZEPPF1`vBlVLSxc#HfyS)j#8SkdK0LqoxsU|Z zU~y%{rn{jP6T5~(I8{t^SingE00Zr3Q$1SsQP?u zs=VL8gi<`nT&SyjZECzJn?|uAbfc!fdZ$7lVqrM|A-b%=yrp{#WJ~s|tzVMHNaBvM zYuMwazxt-WLJ&~>`R-L)!Z(#;#p(1QlW_$kpb@-#*Q=76NaI(~SIC-ds6X+fH+8~3 z0YYf?CRo!=SwWe2VNR%ECx$-d*q7ME3K(?812v+4bpGbbnp_23u}XpGY56uXH{Y>L;*77W2crQidqE{r>&LfNo$jPVB8A|aQk zuVY_u*Ey) zP+Gr1)(lflkPxaV@1XMU46;$o;xi&~Iw?932|hUh6S;>Gw&3hzUo8Nt z`a6wm5VIiOEZntU!HFmgUMg6OBFrV$1(^@kly6Y=hdCaUEmlk|>>RL7_Zt-lfP<~W zD!-8~3dZSk20&G;Mw|qp=h*zLSv}5hpm9_hmn>;8p*WQk6^Iy>#yLv@{81c73J27M zip58*`fGwU!t?{^6KWD4wHn^A@|cRk=DRRDfEq1ej5WoS9)yWH!&|I^H^7>0$`67I z!v}ECVzXt9Isc`a1J*)c9?mSS$$Jf{k%YOJWl{Yyc2NH)_rs zv(1T&f~UC0n+-7u`Vtj#Q*G6nMaDxyxkHF=|fF()l)R)=#!02 z!6r7>8mNtgd=6va{hoJ5*_Q&)RQ1Z(q>rtj6@)r*L1(c&SoQjx(LibV-*;M4A-1UV z&U#YDG<`O)FH0PH6V5^)PdtZ>mLSLjDv!&G^d?1ECa**O8C~BPfJg0j@Fs4oF0J2y z69cpgyUV;KW}6#Xgmq=ySpbxaKj%~lJ|pZS0(dI_PTEwA6`=dmSCeYW1oB7qbY3wJ zMht7`J1O2^Tj_H~2ib-B@|_e-rf&+zKF~UaJ@B2B#6! zWyl#NGzoi<)oyP=kqmN%4OPRAHTTNcwnjz@v*gVIv&L>}$6C_K8+pZU^C8o)3Qn90 zf|BqIHoSr$lwm{w0a|%uuY_$$nZQ0y(O9`sBY`he|V^!v;98)P01zaQshpk+Mat>57g zB2*GrKlx4OFeP4LuoFvP2_RS1>&qrb>;$b~{}~^251X6SulF1Qq=4$nd!y_Xx+xdS zLMJ$Wh6B~aZesHrJLdwG;B{^O4ujOAuDkfjZ6bu7@^%%RedxOdtgCsYY$C>z(025m zQ9$Fc*UWxLY||h+a{L)R=K$T}1#JEXLB8(Cge@{BtB++DH>0jWeNxsb<{$dinxD|0 zG!FewT@e+i$G(5lKpf<8pUGMW6!M&^wHxR9zN3n#)z|qnK~AC0~z_B~)g!yHL(I zWyW01ukh)fLl#$d_MD3lH7Uv*<^ z0M_2oJG3KT%)88k%)#c9bwBDB>iXHu_?BFv%@^um>?Zh)jP-(Z>=yXV@>;37v5f#r zzO_1tOYn|!DpWVe$UEP>Xh$YhBNdB@Mq9C|vMI}iZ`LJa$87{Zl}2~GAkdhc9(cC&#iCcHuXI!pPE~ zXW^Z&<1!M(#8TS5zCZ_qRM2JNJzYHAzUd&lfFrp{}BZ|YdPcsoMKN^S!ZSZsdgdiQ`8(?x*wqu!^s~ce4 z3cZjUsb=hM`ZIW;J95g{-TbHbLTV(JF|g^6q}rHC_ZAQDTHL`4;!?AIi{v-f+44U6 z_^^3Ft$|)CM}TS>A>h~ZPuZj8UoFe=dL@b5k9OlQXhuQpHebxqow&xgrCn~%2Rjd! zrrz1T_HTQ>-KEbvZmE4)gZC{@er4m+RLMQ!6#l^6E+TF|Z-0K_qwudbBUZ(+V){wP zr5aym`jcm6AB*|d*)H4Zbk`H4Jb#rMy6EsS*+0H5U7zjFnzam}IH@q?Dv<=v*4a77 zWQSyZzS$}`9=n^io^hz3agLf<9SCavn*{C;oIt|DaLX;JJC`B$v+rF>(FOnjb3h!*T1`p&##qaqdGmJ|-FF zb>@9Hfiq)7`ugbeKsbDai^#sXTK$gc z&uL7$gh}1{^z(Q)9cA%7;@vs{TXsKccgk}NCWp-Eh3#-T1I2E9`eE~R zH>Zhk1VVs7U>s(YG~>d#q^ACnK|7ywCLBTJh^$e zXNYb|>-T>GKNSH5MYle6=LXhdq9?=$1it)~P+IT^{fvd(1S?|fNi^^qW?Z}%jO3@G zRsS|+(|yPzO7sG7OC~TpunSWu!E1@+fQ4&I`@_WD*SkIZbGQhir_HBUV28w(`SZJH z0EGe7c}8HNbhh~@p_#|MR0QnXV26xFb6|sXw!`SM+1mNn2$=O?ht#frV2d;p_pUfQ z$sL7+O#)kP{2h#hP8B8QE^GAT6B~JBPddwx-%i|zvb#Y)@m*aJQq{}oyPQ$cC(_Fj66`YV!9NPSB;C@576kQaqr%-FNg!~PcVzefQ%lY@o-RIgbqS4tX_>x_$Nv@gvCPHvZ4&;LX1F>e zz3&I$L7x6A8029sU70RQgaB&*sdI6j&#ng2$0M%G<3| z7|U54JPIEeDNSTNdTyq8RuT!@98^!_8_K0t{ff_#FiIKNCXL2boH2?W7$%LzW$Ywn+Hv-8Q4v zW{S5;IAvXfSu(qffw9upY!*o0T>rF^&n~B5{$RY`i-3_0>WS`(1$Ieav+k0!k31rf zw~nOC{m?sL!5+#U)C2Ci1SUv#8IRJlYyOUsyl^-DPVU+mm?3?_x~s!Je^(Oq6J=0O zY4`0jYJ%TddghOnqg=Yg<>=OwQTr!t^1Dzr+aD{NxlD<=G1_vw%t2J-cP%Qn@okzL zfCRtM(gztKQm60I!Zt8|Rdl2*nnc}b9VMHP9@T^uI~Y(k6Mp>TkOI)2>^i*X<-?{* zq0&OkPGD(aI~Z1B6A~lV5E{^)<~q4YlDu`T)KXfAp+=9gNM$0)=hKEsf}SNTs?gv= ziv%SJ=K+ptHL@OkB0AnRe;E(_=kTA8z+>|3;vREy?_3qf1RvcEmxPY_Qcsyqni^Hg zQ?`RQswBvjABNgv?$cp3aGK#i^@0At1J@u1NtY@WUul0jrxfWmYuJ2Y7iNnN_9WJvrZ2Vr*2e{^_LTz+!Ch10OEs8`7$)AnnvpO5^6F6 zwQ;5DC|Taz(@E|f zq2ez?MDLU=rp9^~x^dLFS7}4>m@GXiUX`+S7Pc$m`^qvrM>r}~?tH@YvEt*6N zb4a@{i6l6!iGUOmB z$>~bkj%{foma}x}3@VT(d6{ewRMI6wMWc`!+3rP1qi57f<+xsAlw1qWM9vGB~9OGpvH$#0;9V2I*ab#xF3jAWMn5T9qi7 zZ0fU0Y4(C~QupE>SMqPBu*JgEcY-X5i@@5j}Dyx%jU;a0;2RytMzbo(Q84((D)Jfb-H!Y?Iy4sGW#@wZ>KW9mh-I zKkFH=Yq;tte+1yF^Z|7cPk)zRfdiR)MUP@FixKR&aPHmFhX)|OJ55<5oMWUv6wjTf z%opAx%AX>pEe`ew=NREn5$zKX;}2>c=-LFzs2(D$VLpW6U$d6Qz@0|=OA$7HgW(3< z_6yf5o)c4Dr}sRVBB%GR?OK+*gDddiDGj5@+!R2{4+Q@GM2?+w)>->tthhjknM{&48hrMxO5F^ z`w^o^)3!g|JQEsTwD{b*a3Q-tz_d?f)rMCe1d)K`y%dDyGaI$bcrkDwN} zb_UAAWi_x~TPMz-?5#4$d73DX)u1f|hrZA^9Rj~kT;`PJ_LUC6vYLQQBh8cNl<$Uu zLtms@>6GXu#h@}12)2$MKw5NqMz`(XkYzsM0FobSeNMTcbKc|dUs!a}iSN2vA@zoYpU@(Q4DA%c5Sj#ZgQzNH3n6!}&_w5Rn8oSNL`2WLZ@ zB-(DRawt|GxF%9g_{S~_+YMaH+<0tqSXP-bK1$!RjiD4hgzmEMJIr@Tw@p|vr=478 ze3ZMD9Fr@2h}xp`U}P_H&~vZS4~XD}2!1ntuA2UL24+(c$NRNH(xs}oP= zGc@IH1;%U(9}0FGrynIR`S+i`x9YS7S{tye268#ZJE&d)_xUn-WU3Q($EHW7IwXBs zGn!?q%XaOjFS#7k3{b|nrfrM7zg{ibtkHG8&#*0;*S=)lcc1Cd^%3GcO)y{?^DUa! zycFKQp6@X93E?D(UsE1KEbt+=AL6(;K}%UCYt5xrubT7I_u;YWBJ0%U^prjI7}K9_SG!c$U#)7@^|`g~qUuEC zT2IY^`APYp+jcQ@j%A$6oT`l77By>JzS$Qly8~b4%>9w}nXnFE>?F#_l|D5eQ!2X6 z*tMKqF1u^J@~{mc>-6Njl|J-_VWr z=D`gQkf4|uKnMVLPx>0RYsI9x7q8=<`l4^Awv8{r4)0Hqb8Zp^S$oOBDnGx2a@c$T)8_8fMX>@_UNuWJ&eCxBE01f zG>Xp*>2)APb@nwa_2qo;3f*wJ^#W{;LlRE3d51eurP`Z~(jPFw+LzfNs}Tt&d%S~> zLEBMZB<)32`wVu?n9XRj2c}yFc-QZJ~;l=|9~E$f3m`ta~Jk zrht#Nidy4uw@gywgcq3aW~nU0BQAvHHkuBH0%h!8wog5Er(PrthcnWLAhcC zwwDG&ob|U!Kl2dB9TMh76B6Wt2nnnE6=LQ$b_X+^Kgy#D)Rz9~- zH1nK{62&&Qs;s04V0!M2LxoyLoE%TCTUc&iujD>Z68~5QA-Z<=x2*)8DJK=jE3_H; zCy^~o7QRF0DeD=e=BOWEUKu*|hF@HE|Yo#@PLO;vDf@aQ$UKW9C9{HzewhVF#=M-@suBr<#)}QZo~G zyRjJS%x6a1t6=}bk)02M2UjPSBll|Xs)8XzS3v}_tPt2MFjjZwP|xjEt!>z`ZbvC> z<-sUy$Bj?Ir5hfX$pobtbLcM_o7=3nP};n-Xg`;%udXdwH1PYD_O<$=ZS%0B?@Yk} zscTH&{rb-A#zTkenfO}DZ#GA!fMH*Fk-g4n!wccTYVViB5fQ@f2mAA{fwWIoalM8C zsDTf&zoCYqyH#I}9S=zptDt;}FOyJ~?>VnesT4oo$2nC&!R;l_+y`Zzk35f>QoK&R zlV0k&51Pso538&X&;RMn1O61|+IJpe+hlUb5nG5($CXRN>#^Q$82$@ZczE3|pI$VptZ3N+n zIpca01ieccI3IQ|Ds(9vVXDMrUzZYdhhXc)6}82s^Zc>y7uP?br4}=MP<1mPM&lCa zy(e-YlUm5y!H`vz5cAt?2 zo>L88c$4ds+Es%~HAX3O2%*Y)W;4J1djGo`srp%?yRxovuEB6g=No#iE7txn4`^c; zNek~HKHh#L;ovfi#A$|rt`IZEZ3*^4*TR$lQ=pb94{!N{2O2p@s2(@Eaa6CHR|41D z4zHcWSF`&+P1v?5?a4AP*v7MeZJPWCg4X|QYyJj=ElM6!#rlK+eMUoKz7CL>rI7?3UUgo`PjZ`F5#qHaj9`(_(pHs@kNGg`D5Cc1pjQ9u)kQ zxEnwL5IxT?AkNLtQoqVKFaHA#Lg!Dz}9Zs05H@%waAc zlhI^9!}5HZmljH0{Bn5v*?3)fxv_${bkZv&uWi^xwl`B*f>Q zr0lVqY=Io-Z{@f6t3&Blq=Oj}vh6M3(B$_tE_{P0*rzV05Q(F7a1Bkc&^m}K)J~O8 zacxPWq&;VurR!BsCM6LNpl*q}qwIw{afXACr}`L|ump9+?YzsBWbW;X<0Y!8$Mg{L zxarxgP1J+F5tK*PHm4hVqN$9zDQF9&`ngtuL0LaGM5}aTet^$$i2c^sF$CvgJ0AeT>3A?>naqfab6+F?%5il~C z!~0BwZnJz0C)|m555abXdB$^JPrj^1l2?ZeRX4NF+X1gxZx=;nfg11}B4}#`zq9I3 zwV8e9lToQ`edZ`>>$>=Ts%@F}EJ|X2D0jXEwRI$4rcUvona1Gll#>`9lB zW2P)B3DRS2b#Q`;Ly^?4JQT6&0QVBPgP4BGu_W;~w!RWfr=p zBMD*AK1IYZRA`;O4oKcP&XK_l$8Kw_-glj7UG)rjYHNY70dYYrOzs1I2nFVCIrI-Y zx|~v!lpS2|nI+dQ4jrDh+t7YPB(IER14rh^B6n*~b`4)4DaEEBRXZ#$iKm=hSgegz zA4p&puN`Pvp1#|;2KwU8q?dt%3BZYHZn9ph_s!05!D;=uK)dmGeb-2BrinA0Qh`7E zHrgDQfke(V^L1N)qzC+;NjdmW5WiL(e*baK86`H!i+z!gzd59^5^6J{ikbS%EZ#<> z8@$RKbVJF(=$(Oy`-ClBindtDKgOGiMX6H^Ro!88Aj?%|arj=g6;FY?#PjSM64NAT z%&|WldYu~U9q0x#zLaz)Z@R!rnEDJ{?x3A}pO}E;tt+LcEh*C^+9aOZ#%M4ncEmB{ zcTU;WcK*h*OHLW$TC4V*H}0c}<>i~L(@2^X@y=K1dJMhE6V;??02joZialw>cF-RTv0k|G}+?kbvIOi9aUt{X1aa%f!n*CfuP$MQl%nU6ECaB|mul2j(=Ndc3?n*B% z_)+S>txT+x;oE2bzJ}V@if=)Rd9&n0w2(k?$T=2d0cxOGV(@ycZ9n-!!(>C6)nbb2ahB0(;}3o>o0#FNPhhz+utF(Ac_!L{wOkw zY)mNdWq`m#t+F6ti#UU>>EcQFJ!6QI)dU)^;a~eO^tD8u>t!E;|22yL1Fg>gy$^pg z*_f2|7v2L5sAaWgWYHIsPuLh!HaggfcT`#-v@zh&_(5`D&dQp7HOjnzOEah+(a?W8 z_e_Q4DnbHlyFM`4+2PcO6qZWenZ2BSH|lBOxx60O^$h=oPmA1X!dXGVQlkoJ-)Hi@ zX}Fv!ZP|p$E6`!mzjp;50}e~UFk9y{=)kw@k{ajF7fA;;xNV|%q;M=e>ugJ(G-72q zeWlj10rns*?&j=Zhn8e`oJ4qam2Kjnqrm~QJ)}Z_E^{)1J3^!YQdP@1_+x0-yHP)f zOi}VI8rG%p6w$z>(a?>ih`O9ckd&?a$$r9yg}fAd`WM_M>Q+ifqE!zLY|uy@ z;q9mBOg%yD9sO-c!JMcsnOH} zg-Ktdzw56bFmW<2PGUtM@F6(*a(KjLKvUhnl3!(NUKlO~B4|fbV%+ZF0S}fH}Z0P>n=2IY^Aj_lkiQPsGDgYU`PjtNv zRnx5NbqfJ`YMrEfJYrQUGZ#B&_#WNCHnwUImFT|sWevKoM(Ht!6s?61s75&2{UwUceV zA@|4sHWg?6M?gm0r_mx}BBKV3fD&l8mgFZMJ4uerlZ74yH%i&HgsF#8`#LrlV$ zB19A$G(j7gNBXoeF_gqW7jQdzJbw$N`C^;Jo+X3hBaE>2B`QFExI%4`dWyz97q`v`wTLWm$6!?Qm(W$% z&qKyJ{NcdPk8^`HM2ROrPHRGnz8&vFPoUD!5O21MT->be2>4FIcg}&jU)`J*PXekb zkxvIVYA-?b&$Iubc%(VorG_yTzGOKLM3T*-f3!0}hpP#ADS%i&{!#J-?Ir z(1cY4j_2ABu)j=S(|?+~2%3m`XRRPHUD0V>PW8#Ca;zBPV^JxM4Wq{D5o@8wN1LT= z+`$ZnRb@d`3QYEur&F3c!C2pwz*-V}*AQC=RbDeX{OeX~UB&In_a=}%0d^JPRY^8` z_DZrh4?o#aGk?GVo8w(GpiMJG*jc!>hYg`ZB@et#KH+sU6ac~xeG%T(#@mR0dBBnT zBq^I056J(ok?0>XzrXF?|8Rl!|K$R8H#Xw;5OXo2@*DE9;Dm88X~`7`xJ0FU`puRd zs=r=;Z#5|U{ml24uNj!juq`T}L|XyZ5{` z%x~V^P`<>4o@VU~)jAeN4;Q{!uM_hY-+G9VSOj969cBgJ_9_aneB57(?tF}`M|M=H z?}As=5L2lEp;_C9y{71#lV~U2>?svld5$q%G%$N*jF#-}TIPok{%ph9HdxAW*DN~k zo>2&2kV63g*6eI(OIL?@m0uqyE?VbhE)BZHFNw>+lBoo&E*gcAfKhv+dp`^Pvs{Sn zSCI%jHt4VP9)7GfUEI1i?cg0kbF`|{WLZdy7$CCJ03w=KvIT^Ue)$G)9n>qY8< z*-Ll3AWeF2122}3MVD`Hy>tS2HatJRK`0oydC&U|z2kf8YXn2bK#i>^UP|~#mM|D=_ap& zdW&fj6{QA^MnN`x+l@Mk>biHtbMS~v1|-C5Pj(44FzVPKG&<>vb_ECZc;k4mS)Yf5 z-E4bxP5nw!i*_EsyFG>rOCHQi(lsoUBSX6_xrz-G9%w1YLki?F>wj5dp23MmO~ra` zkAfuU`-rG;GV-HXQ7Y9c|A0&by^Mb~FEf%~p&9PLwPQLbn|am^D;mU#3&C40#z&A- zrAOw*Ldq=SLueQGe3KrbX^W7lR>KrnOJ!#uNlg`Uf{?jZf`F|o8}+;5Sbh49bmCn+ zu_W;~OmDNePf2uw;F8zJ`jcQwYq`j#t?H)2B5Um(i~`G=8&CZp7`Skc9&zPW1Fpsc zG@;QD9d2DcXNlx5!z{TvIuw2}%J_HxcJ}iR&6BF;&hF-}ZsPwnTj+1OqI(>h1LUuo z>`N~tj(z0SWDQ!jfNq_tmKZzH>Q;12OlL*qd_2PrGB)3(Ow_QySbzDIs^<&Hz3F(~LYvVX;pCTLHhfg<13|Fg|nEL$1fDmT1Cc?xfiB|KI`jS@NKm^u}x2^c6y%>35lSEb^%%Sgao_a!(Avw|CH*+tk^s-O4v4(j~1 zqU{Z7R#pZRD`P5?jvf=e7Ab0PfBuZ3Ij@q+b=on->|*g~ZRv<*s?BEq^he`7)K;r3 z(*6?_*VSgpu!9O8eSwB~>}OCCazhxQiK`n{^CYeE$7V^3*pqiQI95c2DM#%Kp??Cs zl(RZc|56yQ$Q97|i?TrfHRkdCQ^xWi)B10lqEt6`vA1^k54W_Mo3Wd_>wgpFsOdX? zc&Xa^<{@oGOie{a*9AB@I!q>IpRF^<^Qlx>8BM~`&E%ThGR-4KrfC9`iz2uP6mlO` z1_j=*aoTel%j~+Gp5HZaXjWjRQ}nR@B-PRBNemT8Ykj2|>{qfpQmHUAJh%a4ag?;9-|s>m9s z`Ms|3!W5O1mTK}&6XvrkS*yM_hJBEt=gng{s(w*K-ghs(hF>gmZr_?bR%Y|)53K4Q z`iR_`h6)A;G-auHdU5c=7*jm(3$3`+ywcS0bNuk8zMN`tMD*2QM#U9_U&eF4ZgJ9w zz=t#&H!)=!)8mrxuTQTftT}}Xgw#Y^k0yH8y6k@;BOx>?kG0ntbMxzetVFjpSE!ni zF{BDOhs0OE!!`4A4(T~?efyh zab%Mva>a3&#b>VN4X;VmQeaZu{?e7;B_Ks1KuFKYF*+zHSwr$(CZChQoZChQotE)WReOuKNdEY{9dz@cr$nMib!=dUk6%May^xjrr-iz5K)|)VvzMP+~Ef#sHFEH1Nl@M1wggxZ|kTn3}fH*H8V&c3It)6P~ zmf1Ke^XbhYg&Mc_u?n*E&Nr+9=!h3o!tA2>LS}F7;doM*ZX`{^KT>c3p;|AeqYm?* z{}SAYFD&-`y(-G!A6G^F2Qid?#m#?9EsaX!HnV&P?@cIDlKw1w_^(Rk19`1mz-wOq zYC2l#w3dBaqfjs;q(Vf^STZt)i69I{XD*K+jp%C)o#oergl_OwoW#3sEfx(uXA) z*^P(wbQb5DOm${Y!#Rpc`FK0MXC+cyuYyFq(3oT7E?wQRRPm;ksMg-6Ap{dhvP2TZ z#(ch5im_20H)-L@o-(}drxKZICSwss9)C7qzS9MaQBV%f(L?WCLzTNN*9gWIs23y1&Ff_Q}y?BfCU(mHUFrq5WO})As zQOv-CQkgQeH3rfn8E*C(ATlsk1r(9xb;+NcF!vYlSK3tGz-;MDJ8h7DX*dzi2)K;0 z+=PXm(ujN4kfNK>9a55$HOe{@e zJ5et6Asdn5!~Ph(M#rG}d8NWkj4NvT`ns$oRWO3P!d}E z67=w#vH83>Zto5-RIw4L6EUa2Nx}xk*xu2EM!SVGZgX+C`#H zxBGAhB6~QzWtYdBwp2Kp^;g?0Ce#m>W#>oY zK8Hu#>FoXwv2#M!7q?~-}sqf1IiAdDoG$7j!liu>=bF${VZkJ0Q7(Xz);l)qY&MMD#Y`5?J%I= zi??9Z*(4h*s6GDbWy4#0LhOD5E@{j$I{F8(|szMHRky% zS}O*`^E#Ol>nQoKM7IbB@XMz%km z#&Mil02r|xS(qnui8avrEO2GWrWE_^DR8r}8*}LykR0{jqO;N&U>ZRC->J>XV;hjV?gD@yFd&%~auqNfa!aB*#kI6JE3pwi!v0%w zw!=jVmDvBAtI6T+c*gQ|&E{{x9HAsR=((PH<4p{x&FjK?jQY)FeL9sUE*YsBEc)<5 z3O|U`!<~d$u5I|rgpJmQ0wAeRJrsVZAIMFI0lZ=Mkdl*Hn^8IlV-{7KeGDq$Kk~$W z2n(_jVKuyG*ksu`7XoPp>udU8jnWZt)tEeWMe=~32*%f}-;bF>Po6?*a$=V0)O3=f z%z>CYA|mL!1NCy#1`{WOGwgg3@yGpXNRCz3GR^9kN}}&urqhyV&Fl?!B#SOfxc~fZ zN#~RSKdBh0=?lT_97!JaF?>G0zM%j=O-kz27YJBTHhJSz1qDD3CW;Csbg0s-1 zp=2wnU0Jo9jhAfHpkn8z$fN9mi{2Fw1Ih=jdvZsd*Twa?fq0$s2d7GRoxv7qro|i=;w%0T~eQm+JR|&rP*5lfM?hq%S8zh<K;)$Bm*Vd6w>Bj`FKN)x%6NS~ucP2-ywtPlx*d;(`AglpIw0OR%Xw z1-}TTPZe+)IpiRK_7g}7;b{m{NC?4qqMIT~WnwR_10a3)`S$2;_rM>;l&h`Q1(^M$ zo&)C{W&D15p0WJ75$qbW2d4=FbsC#@r^y$mT%~WN#=gB*F?O1K%Ebt^%-|K z{t*rS2YIIdiaq~s`F{&RgUWwY`*=!tsTL^I00H@h0m&&M{5<3Z14RM~5odwEk_=fj z&(_yw^)8bWU&DFOp1` zj6thUORFrn!s^tg&3&)TG>tA5PuO1$!El^w!&N6o2M-sAMac7=WMgt#-9q*L-ZCsz z#E*i%&YTQpA6Pb9dZ6_sa0HCXw47$I3%WgP5|lgv)VMUgfSr6~i%H`L;Kfiq33L8i3bN_7@c1fB_|>2QTP zY+UPkS4RChW^<)w`@*7JKh6X=^#V(F{X~SO$%3!8hzfHrV2XD15Tak_A6ZN&c!?jcTN0_nyO9EA4|7Sm4zM6D z8i-V=hv%RrG&b~!u-A!7yt0@?U%q~8@h(Bu0%QINOF92#a(Ar023Xva10==w09yF|j44o2`IWO#P(W$?ypM6g4a;g_& z;d#M+?v6wD2i5TG80S|jWIo3Avy3H>)DHB=bN^;FHr`ufokpm0P>Bo6plyo~+~Edd z(?eHP%?eb2P_&*ww-Al_HWTc53e&Qi=$yVW!nm~&%n5kG2_NDyyV27C-hKw2QM(j4 zNJ0fxTg?jS%8d{4Af}dih9U*7q-nI9SC#g;T>sTfmAEB)GRO|s1SmM1l@NcB$^+yy zH>)m{>7Mn%9eyh>r4ZD%Pe3fEQE8sL4DMD4Bah1u#9KFDG}enANS4d#9RBy| z0ve?4dH#&6=aBytR|)_33YDUvgR!xVxQ&VJU$rQ21vqftwM3bT3|qtmeNlO zDzbc_ouYxI!fB91aGW)&RdVf_3zpUWok<3J!<}!uJs-Oj*BQ&x!D3!Z+=pY?wq3Rp zXEC~)UBF8{l)>@1nW@oc>C~&14Z?aV!nZw;fmaqfvy*=GC^F}ct5&NUVNVy2N^JUI zkipZGL(0ecXqKUli-;6smFjg`6^9bv;!X3q0169=!RKu4}-m-4^f)nTJ z*qgUmDqF4~>@i2Jg@?$>x-GEkSvHUlg~A8;7Kcseh9?g0!g1`Is%@21x=-KvJ%;bs z>{9UM)p_<(d&a5aQ;o!eshfx8sy|p$ttq$=8e-I!E9Rq5C$S+CCaIrYBUq7 zW`4jJ01!uGq9s<2#YHW14I{J|MW9@D-=nW>{}8{_rV?L88n&Z?C5MgnqEao?+9n%t zkp9UW9oI4`7(JcJy@M99Y#4o=%3Xv2WHCbLvyOgL{65rLV>ME~nF~F-s4d&UeTo&a z)%hwWTKaNFh_&KR*{Cyy^JwZ%sMBuk?{1M&s2lffL@Sg&ExfN%L_$bk=2Sn*Jqk36 z5JQwX+8j%jjW3cWZKJ(VNnXsb~4F~0RlYuV9>8r;&J7)cMfpr#)G-s#yQ!jY}5L0jXJfUF!h|d2*XZ7En!@niQD23_Y za<<&ft1fve z9|Max#dki8Eq`)(8QT{>3v3{@VP6BC6W|Mk;PMUgW~C0Mqp`dcIhYeZ9anNt9sd?V z$Sf<=5z$xxzJT^ROe!1!P=8++3Ev`czZ;^vDLwGHX{Ovw5Q1a<8;J?sDjzDWKqH$9 zp+NIT&NmyxzC5a~8>hgii3aM4aihJ}4bPVO^Y+_Nal~Z@9u<<-&Noub{K5Jx99mxO zc7J!O&)vQ^Pd1L9tB~J~h6tawwJdPX_N%_#cOd4Gc(dOxStRZ$ob;1(5R7G}E5Rn- z*9`CG)1}i|4Hw4KEvjnx;N%Q3Y<{&Ll4`d_io*`oTJ{!a`8CESyC<47aza7jbx1YH zE83IB3p9M#5y6IhxKcs6)@mfz3pLzEsHwKUbO)Mw=|Hm9ueJP|d`i)@1AY(#q@$|V z(UMoU#f061el>V_`j1Jyu4 z*xdtzaj~DJGwTy#lJD;^km%eZ4k9VKQlcTjKnDNKs_^M#GJ_a(egBwX-{j5F1(>j> zl7lZOI~@(`s< z(<%=N_XJvYF;x=)6ov+)0wnZNk@P>%+pLFPSS>K>5$XzsvGUIxLTX5)cP?*S--g@e z@G|JdDGlmSA0KA$xEcavY~(-k?462GLMjnI<RhRfzwl)#^0abkonIyY17-&DyDsx-6B)6UqS!m!5e9&#&MiYM9FIct~=P*v*81x#VSzubWKUXX@0HEuP0_Hqmixr1QPP$uKIVCS_qsBY`1a0l6T zCE2JH;-ZAg?sRZD;Roxb_8Wf^$)HW`@!I+^rIF68J@+BDUR-@~B)xFCgL@eF+Sp%V z82&8!J1+uRUBemvvbaUApuWgv5$!|`I5G>mpe12K_o@b56##RBy>YXyi1V01ACclH znrN{l`}GG4ZJ=Iql72q(zJH9Pe^<8rLD=S#GC zd-`@;@jCVZW!o(C`SXiwFv!qVxmO|XDY|5Hds;sCnRQZ$+z;E?A6LeJkUYVIl+QDn z!?n-6-jGP&ZcHJ*-Lb8#$gVy;=(A2_CGt2v4QoxVcbOe36PJs{_XT-SYI}lPl3^v>Hq} zvn5(#_Leux@=I!TX(YZW$A|7?0?8FbPMMUMsZ3voaP-wH>{t+C5dqX#+ANBqI}!1K zSN|9b8W)nDtB4t|YaGEBot5MjYkb!>snqn1(I%_^Q|(Oh)wH49@QaP1vR8?a`974o z+c8+-{oGIVi>%iI?LKcC>`Bl=8Y8Y;XRAG6>pG25;4fDDN;TSzerub zN`M$3puIxdzz)K~hGg5ohJ~A$*m(_qM28jf16dzY1mx}Dqi8t@M{(nYF|H-re3i3(uFTbI|P&avs0Q!Y1sxSz- z64__2_)!#|uPiPRdK2Q@o@Mj3seRm~d`nS(MYQe#A6Lcz)}jCWsxlE2zCZL!7USy7vYaRGDc z9d)&kNSjYbS38|UGseR)sGxDsCaY*i=D+u6X=W8yjq`#cZv}qhA^!d*-+{P=$6vKOjdNVG^Xjx8gHb$lr{W z0f!qUtEG!02qK6z9?G16v2O;bdcq@WnY)8!-FreL>Y0mU=aj2hW*%M5H*V(yUIEYU z5wON3YMYB=e+Oz2R=_J4!wv@2_>(>qQ=)9yI85s@ucq5e-@Ij7gQjT6Yxjp#qn3*n z`ORdsv%Cr~b2xQ$JDPkyH}S24O!ljpY=)99^?qP`Np)D89o*Y5?{Q{jEE2;*>mPPq zhO2$j>Ka7^WRb?1#nx6 z8+TZ1$FRgTT`d-b^5QP836<;Bp)v4x90ZAtVqc*_05Ni~Im* zs*&`*Lg}h zR=^ZR36lL@h6o!u&_%0H%7PDQ>c0e`4n}~l4=WjXu7?k=CL|UX3$gsM4|xOP4&Rqxy=p{XHr1onVT4^+^0&>bC@JW!pJAcU ziX^E9fgu5P&BHE7t$OE$)N<=8l}w-yb~q7^-?VtzQGFnW{jk~P8WJLR3+HPhSpDB;B2 zR5x)dYM#R;VKCztheuRfXYcFAo-^y?~jtpeyxw82;eVx(e5 zhqjgM*0WmJEY+0Ai{oy}u~(CmzaELZ6O-#kxM{b6g$a^sN9mBVf4S97Z2GTmj;IM^ zo-FCF)zA&uvxh$)i~07K9*g@{-GCThDR z)y+RnR0v3Sx-oe8buVWiquMt(d$r8t4HcQ!@C1|s%Xbj{W6?=@C8(Khd>2Ktje}CE zAl?UXa=_?;QOnb-*9m^ZS!0;>EX{ww(`jFX0_>PSQzqv`*T?GJ=XeF*xs8#*e+O0i%%!GWnRGR3i}p;ak+LC(cAmPn0a>f#t!+F6!a?1JcH zoLSOfgSN>;rjs-UDfmdRV(wz^f;jSVCp|PN^kTvO;Y7pdu`9;?wCG5ZVuIPa=`kmR zhF1|SbHfcOrR5fVl5%UR^e_xee8%m%IxCXGsM<8TQWWC66>B7l>V&zKC4xLZtAx4b z7SVjGHPW)?I0Ez9I?)+3LTQ7gAF+>Cdt$FFH$>7b;Y8ysGGnA@KCcW$t0<0Bq;j&? zmxV_$NRx7Vz$g!7!f!On@MJrrD3`coE4&JozWHLj`E0x;d>{OX?+H7vUxTk$gN0E= z0&xrSbK;f4Y}o??W(egaa{^=(h`S7{p8niH^87im;y)3?*+13>|L@UG$l1=y*zI?? z`&YD6wET;*W~skEBZ0fJ@?2WV1rol4JTr$<8HIw;EF6ZLe%>}{ojgb-xeNX;${O!W zL8L2KzFbDJc6@7Qmg6M1Bbd)0Z9_QsV6{-r;zBL8DP^dDkb?~f2PP9L&jH!Pjn3N6%p_g z9cNSc?$MBR={-XvQ3IjR4Nj$uww~w0aJK|o0^Mr0}n~Vd#LKQQH+Zfdm z-V%u_)v-Y-JbsB{6F55y@8su5HjbxmRBWt>1K1j#B0SUlkKeDcvpt9oxP@LnS!ox~ zAY#z5*U+)3TRMDxnRnk}Ki4s7JUGXxoW9f4TX0Va%W(G$yl+Aj3$>VsGYH~SO}$bH z$L0fbAr2evQHCM}t=%3CD#`=<{;7L(J%Ua~eWrEve@yFtFM|KCY5gzn4pOpKM5agB z;4?QTrws^&2qm+K=phe)5(d$nvH%TccrP4&a-(OTyiX zY_c+Om%VEAux!ej@$yGvNG%VBzIAA zZnfb#RyLg`ac)A-mGP$gxd`5Dyj|N=DYVObZ$&-G0A!&+yS3Q{a&`^3Fi<=i#tO(z z#oE3_6rU-Hrnn%6ha$o^9w2(>F=GD_1<4C6{|mwkg#j*WpR*uv4dDI+6Z zz->QZr9|~u6d7Q1O@C5cVK@@k@AWluV*#E;>9Gs0MhJnr{Is4^7u?y#Tf3{Nj9nc; z=RNf8K3yuJj9wC!Zq}SDkKmxX0AW$lurgUKf?Ms!Bk8w-9SliQp00HC>g~O!VWMDXekSmY9Lu9H$qdG1OGgb9C#7d;C>T0OGddjy$isL$hi# z2bb1eLy9z6xVNmNR65y+O;yY?X|1w&zM!1gx~njMWlyN>qyb$pX8*S%S|c8AaeVLz5b5#Nq` zrC)#cXn%VE$_#!1!v*;z_ycXMFS1vZ&e9I<09NB_X$x76@1j}cL9yZMxBDW=(@CKB zL%@%S9v!$d)JpkXiVmihFMIB&S5^JNy^FD|nZjOh1SD6Rojg#_o-5xTC(c~nK!4vq zXP)S|5k4!DMgKUtMf|^2v;K~ob!GlKVpVFIPMGtk+`B)LjbjXlAp?j&;$s8O*yJUF zVA%rwV8c)b#m@&Cg7c$`EREx@#mowc;PQ&NB=G@%Ry6EuV?gCe`|158d~MLyemgoX zIX_X=<+WDretsrD=W!MJoZ!56S~v-DKAc#8IQu@y{&4h@_x))7yHGw$AaBCX!JWlHQ45JQH|XnJc7m;1RHEid0_PBEOqEl_{3Q4qMUrOH-~{*d zL2Z%_bpdTliVF?`MWair^ND^B$`d_5$6j%IhRt-EC4`~3mc(3Ieqo9KsH`lwA4>v} zY93-1oE&YD60hD7ctRPYN!+$4 z46rP+jBJ!YgK5Ayv|9jJhTklNVnp9tBlSxu`01sHaCHD1hJl<%tC9zMbD49P6NDy3 z5!v{~d5=Hsc}AU6=C8^kT*T!Lw$ekPrtt8AI5mb8`Jm(!i!*iDyZ4NfO1JYNT1%+7 z=6c0o9f2)`Z2eYWp^Ps)B_Jp5MIN*aIVl{+!6_rc^0ZW}+imb4@)oSC$rlXUY#7A;{%k)US^;vY(Kgo9gJgMtUH$c$*O zYH=QSB}#CdA4-Ft0h}*D8KB@mRN&-V2(!lTLeRmXGV1zVyo?{>T%_mqQfHTXjJL~M zH`FME*%-!5J+AzOV?mFfK2OtGbyL4;qf@F(N8J+(E~7thi^K<)TiLWavO}F; z76^CorAqJ6xF;sK{E>2+r0+g1!OjNUpTGmU0x_Cb-ECm_IRZhGx@0!>K63bFQ+lb6 zwRp2+^xTSPZhz%@1I}kV0@MiryJ=#-)@vtjI<%!7dLX4{aV)LwbA1W;KC35Cq?>En&8H-8>H#5ke|@I6%U7D&y>36UsWZ02$P^;YV!Y`B0Q# zq*4i~usgi3y!|Qpj;4(k|~(DVrq@R~Usu5GGQ@`USDDV$O{RJdiShBhkjMunqjZE>1X_ zDTs$Zg|ovwq9+ioT=%Kg3wrLMn!X_vugCgu7BAyTu} zgBq1Q&Nt#;JT&NwaFwY=V~{5; z9Q8~)P?v$iF?O%jI_n3BKF|O;z2PzBJNfe_rvhbpY(DE~+gPVhxAFrP zkk{R?d38WHal!!J;dHnXcQ62=fb2kV&4PE>{`sIlgZa=9Gi&)#2*Pe(RW5^nc;Y>G z0Zh*t8APF9+DHBpTOhYgdn^X08GcssJ=d5Cgcfy?g_{NzEKQ)MHl)Ykh@d7Qzm~l ze@>4%G8Mer)HS$QMR>9deV6t-I(&V(jQITh7e8Kr8_v*IZlMo)xjRXjkGEpmes)BH zS>L{s9Q+$vgttY2>6$HsXQStPx%>~X9$vsFPN8?;{0~&JXU;oq@@JH+Ux?l$Ld73Z z^D%fgybW^l2gp@ayC0_pXZs(mKkb2OD7b7KhAi#e_w1L_O6*d0?cpz!xHckB;bJhP zf65Pc1`H#09a_TPT93hVUdFI=cF)%N));;On)t9%GSlko^<>9Gj!=|I$P;2QJgbDZVnHfMf=DnuXbkM2NOoM0ih4*>u z#d)1{@OYmAM*7gbXEAkfRG*X88SWbG-F^;^v|?jJy9^DQN}=X)+RTv?@6A#0F80Z0 zC!sQ-b#TKVIdw)rAVYC63BGMaqPqe`P9K{TFJoep>oYS~|1E`ahaOo8>2_+~_{Z&p zC(OMJQj8*Ei8rD&ki;<&ubJf)9bDzeG9Fs10fKztAhNEIH$4>NJ7y)vh|wPSIvv!N z{|fEwm2-nUptpcq0yl~C(hzW1#Q;2UHR2+%4xWwJ8j((7i*N_gHN$oIK*fM15-)*` zMl*T-9?aOqd*A5jTD_npF}zBxq~-a7pQ>Bd2ZXKT z;@O`hcD(*L!cfR9}69SXugs}=Z*%dSlSP+(x7 zS$=R8xpNPGk+j5i*;=ZZl-45vPvW(c*%SiH;rm$H<;Kg~?Gxx05Gl|&T{>rWCc9+g zO{P4;=7>6uK#xuf=Hm6b-o={C*O`dhA5e)+(YJf@J!>uR8az;;h!K>irEYk!=f6md zQREu*dXVULOdFBRqTnOj_8eUkAEoyqe&mwG&MG;mFceQTx_DygYlX;ql}0J!*)EKh zMdGZLP0AQzc~tY-6DG}>&$huY#*v2nOkpEj*%}XsOGrf@Yb9(P{Hc!;+4>GHQ6t4* zrYOB$xs|H1fq_Pep~T1h##PAKZ$_N+QgT`Q0ikSE#vJ{fy|P;Tyo!^USUro97@Emt zjQ=OogIn?ij(yAmZ*r?)8mCG^_1o@-UiTUHBD;^#Ld*sLvgdX2wn1N*89{IbxpNuuZ(BH;=hI(r zfnN!tZzdO`?cJETJdE3#{CYXOh3+Ai0p-x&(}>R0l(gMfOJKVJdeE7OKma=E+gM7r z1+R8y)f6M8A)u8TmHK+3&9}Mq+Zs&6?EzKC;WdjoTZ4lBUNyW`xqmspEfPxB{mnqQ|wTr5BKBll%q#uP$z0W{zTskvHj(W476r`~^ zns^%tWwT}_4Uwt|MWeZNcOpBP-c$69EKM*RX#}iqjp(6<`nG^YYor{G33MC(DE(;`lYcY|!r#ndW9;N=>tOl+ zi>mT>e#C$M|Fc~$XlrX}{;y(WR{S4H=wMw^naq||FaDKup#6$itCe&WF)Tj`vL14Z zkbEqM)t1$PDnrp|#jQTy9X)*ePa8+D;hQXi6{={poN;|;%uaJ%*!1;z1KWaxgJF~B zvgdX`31)D|9Xzzr&Hhzzw3hM(1~`h*9)FE55c%Q!QOYAMDBpi2r;r@fwaIaOYc#pQQIg(s25=N<5oFS%fi!kr2WZWa7F-yJ2 z=m7khDnXpmINSh%`?0%29iA!0mm1!&H??@fkxeC^ix3|Nvn|EL6TS~uMhtD7{d!;G zJWeLLGp7)k#i=HJgQz^1if|wnGz#=}y;2jWgx-lGmVT(zd`_4O^mW71yy_!BLBfI% zm~pBVeKTX%%!LdoZ;if#tsGiOOQx4;$f_=$D?#^$%qZhmnMmNbz&O%?PX*Kc!<1k4 z4UybWL-0hu$|A&lW2DE$;p7#=rkm0=Ih%Z!Q zev*g&7s>_8r%a~bO2yYT?2gv*t5?kmLYQZoqf3^0pu@R}X%CiBKKH5RikGo4k*|YF zOSsD?%-C2coJgi8zSom90!k*V@Czrb2q-74e3Nc`xSuQ1{lkb7z)#2cbkWj(jN^Z& z82-Q9Oj_UOlab@_SLNcbc^8yS>opE~8gs>T1)kZd8KNXQa2hfQNZ}shK*1F(k201C zl4Y0EC@WIoSBe&Zoj)^08yv-D5*0)7u4jj7?%#jiUh?w#0=oHg2gk#KXVX6G;O#JC zXS=~p+nRY341(ia`9oOK1t%HuY-jKE_Pi`{fAO&*?637ndl{QTOV%0T8>&HPNU|6n zM6v?^QV*lTm53aIA;A=pF1&r9O+BT|u^0QXEY+|z_nas}bE?7VH@|Y z-{6YtUf0YZkPC7E`4_po`7ETZtuJ}TL$PWiTC#(!E3B3Ay(?o|EDQ}_!n*va#{0&| zQZST}8AZmV*LpqD5BdA@NO|o(pz+%gN{r}lS*HX=Izk|M`gTDimn3QH670d;fW91>rVvoY)lkrcX#8Y8mSGw3T&*W*qFZAtvX)T}#n}$j| zE79BQo60qtD!o1u2oBvvLjQS$yMGsjqpSw#veOFCrp3#@l#Ab_Xnxe{nf~lakKP?Hq2ZP2O)si+ucv$czKc1T{u+riv;-a)C zuKuZr7+GX`{3?76Upv*jDUZ<1TX%Qq#QFx@XcXT)%^8+s9vjowhzSUW zw^M@6<{HoYi&iB8)V+=W1Rf$Dv980Fjyn<*&0i7AMw~5r29M*EE^5|0{i+@ZWE4Wg z?NPIKzY?ZtzEYPz`nwCs<4M+x8|s-*;UZ871tQ-Jj_B8gSYN(|DZ(xGVzyG8jQS-PaW?ogw?+Lsa!54yDv7-wAI{ZrQ2At3Ddq ziL~+@F4L{e>!r&)MV7y9)S2`D_?lk=^6`i0A6>~vw)Pn<{r_>I7yo|&i@&*0rUMq3D^h>sS59Fm=OdK)^_#` zNQ)0~U;geH+PbR4yT{hUJJCDayKm=NBS3&$KjIvhI6V*DFT5|-ITN~dKCVgq#JLRE z5Ji-msTS7wN=x+b2C|SXUHgL555rgWV7|pXfw_9)D6Q|$59e1}IVCg$yQmYQA(+3V&WEkpy&K%ue`qHto8Z2$NIqCC=0^5Pv@Uz@C_uY}*sf#SW_gCfaHZ zxuYKIaZ=73$XEP1dKPQ&qe#(v5q>y@cCL1R9b zn11A1d?LP;*Hz{xWOGBr;Os<-Y*Fw`M-0I6EdozPNQk5m{XbNE1hpdHP#z7v@|P3Z zhZ?dLhDu5Jb&7v3F`;jM=pcL7bLr!xoD*doLEv;j?jGwU>F&;qsmz!M|hhT$u zJyFM5igXc)^d@>cc+enqY9ey`=~@ulIZIhr*q#>Q}U`yd=rw14QoSuSaj6O9>tq02&+t;9+_JwsK=Ci)si3 z%pG`09!xaZBmje5fUx*kxkDg)B7?nK2<2?Cj`AQyhLH*a(WCD(nb20AU@vXsjjxbtL|*!fr9fa4{85G<0)+LUSPxD9)iPytdd)lgc0Fwf=}t)7;r? zkbYZWE;0G>8+%7p&+?Rf;%*u6e=4y3eXQkgIO)Gmy|9(B^=HA2=n*Dlh}zwCC$$A?avx&0DF?@mKf0ODVg zK3HXRoJeEbH2QdbyT2lXQu%0#FcP?4gq10B?R->hZ$@)qOK_97$LIs7*^N(O_!EqkzU?Omfl zdFuIm>QFQk+v(E8e_f#=%!;;Sip)6}Kao48!utPk_6|&zhS|1m+E%41S!vt0ZQHhu zO53(=+qP}nxY^yi<8<7(yKlt#4{ObDykm~>ObMGo@vBW(PeSmb&BNcpuaZx1?63l& z0|>nGeE#?wHCiFkDPxAEP&UI1n#dgP@*>*mjM&@{ZPW2t zz5|4`BC41y$s+lcN_iMC6*rJF$AojuX5MtU!&-t}aSy~g54(yf|Hd8OuxvVKdZ5-@ zk2_lTH>*r6=>{SSblbX>tyZilXQ|T!S=w4G=S#Q8Ua0Zw0~7m^0uA zvL>@37UE8K=;%d8#AtuT>GJsx)__RF>IC|89Ym;?gn;IwUFnUo_MPmmy2a1gr@S%o zA4?HP>G`WB9_ymug`qpu;}VA+*9m|9Q{!`f1OCzb(fFPJHyZ!{_1pcQm!qqY%@^YiNaI?3z(wN4fQYlIEDbDA=n@=jq& z@1@#&8;-=yT!~t}Olecvf?E()6Ub1_R~mc%kmDlhu<+fot6zb2@FYd!Gvp7`rF!Uc zd{U(q1UEpW0^M_%QJ`Liwx$2m0E&I*xj#Ufy}7s%Q$Xi!F{dBKUW`Fet6eM;^ZFzLx9jvruvCKG<0s?}D+ER9A^Wj$kFBF=JRoyo7l}`F}mx_hd5BrpsRO%wa z+=Ai28>{K178M_?TbW~caW6D?ngb&RPcCwujX|w+?a!Glb1_rq9#rtW1k3nZl5s-F z`!E{p-aT`%<7;2(XiJQ^Q5-u)RK+Q`v|ez!vy>0ksCAG)uv5Vft3--ZzjL0n+}E$d zaD0eVE9Oc;X_dcTg`#{Y?}A49P;Yd2%HZgl@ph0Q=pD@2^#=4?<_5;|ihb(@$W7*} zjnHXapSY)KvbHD!-q?Vf1savgPL;eubdf8XLdkX+yN%4d4O9cyv=^qxA|@s#`9$+& zg6Bz7k^X82LKxTdyu$pw))$DmBp7YNGDOAp`}w1#FRs+7MyeiUC>XM) zI~e9&$=4{=7VfbcNKY-OG_UPwiH3beC~EMrd( zvegmT0;CylKB07gc7A@ZMiJrm!9lulVaLC6=&9%FDM`uQy~Gvw$RFRXKEY|mMilyz zdO$P(%m@`=C{^FbA~ia*c5QUd;8hbPeD36=y$eby5**GdU2&&+zp`m$`Y+pR1s2W| zk!lB^f9Hi3E1VYio7YpbkjhOJVsAaC6>cFtMv5v*^=jMM{W=55n^kcXxD*N*L9Ogd zpTtnD96acl*U4+|cvV&?ZN#q4&N=ye($J#S96=Y0Ca&#&B4R0R0XDrr;bwg}5KmGw z>0cIInne6WmCM7XvZKUjz^|3uxY+ktZ{FxsQUDX60jX8F7^vX0RG|S%odrA%*A@xB zH!q~)UetSoQK`>}e7*bI732_~O7kT{IGb=Ikj7Lo4NCPm#eE=MLcPzm#b|?WrbifP zr2%9HlqFI_%nOT2$rM9Y1o|WjSon81j^$92GAF)Bh&0;G8*ticovpKbitF2Hj2_39 z?a|hfH@GwVJ@o?{!($DD0)A#{7NJRzvZL(ZRjTNBGJU@*EM3?OpBs6op(LRz3nA)? zXQoQ6l~e%ZnKLJ#Hs%N&FAz$I+_fhg?W0c!|+YzDz(OGnEW4n_^@ z7Le7xvR>p66g+g{mB7p5CzY3Y%r;!btjC z-8V^#S4ebHXp;k}{d+pv3JqC;+F){B^|_{9YOu&J%6M(TqazQ_+EZ+w+L2p?CEoT0 z<8#WzY4$2CknjRSv*MZzj&m?6RDm{p1XvP5fuxi)dFJoZ1$+}&k8DOP8D^s6RJ}E7Nl*EIpShMq<+Awov=IO#qa4@wg z-^+{u>9I*Yfi0m|mZc;#$Rtp)@oWt!!M8}UpVL_NWk#$+>)#B!va1w2s(H6RGiZr> zRl2l+&M>n)Hdt*23wWgT?A~yx3$&i%_0~!!T4ZU$_*Uv3_f1+&!02cvhIc4!ybqc! zFgpFD+>ms3%b@OXCEKIyl=o?s$FQ&l^3M?52G~k!F|!XLMzW?ky2@~4sF>gkt*vhz zTxDS>{ecH*C=jWMN&++$s)YiH1yV)C@e<6I;>l95F19Ld8~M;2dX=2rK0Dat`xVU# zw%uSKplXSW{$z*Dl~ciIbr+?Jyo`$zlKsGv5;GXaO`_uwT{a6!6FBT(9uj`BVK$Zc6o&L#a;viSPzfGX9=Fi+kobCwl9vDm7` zM2Sx&M72C(p>{&zR==e}`RG`bwqp7MSB^wYF(bvA=r7o6&Q?|f(=4LLcs0I8{Imaj zp1Wm3)^w>jPO#2ZV4=x(d_&|BE5?>XIs`I$toe+Pbn;oRS$?o0V~nG|_h`&rFVbvJ z-z=+5egt-@B%&IxK_=>yj|IuKY&AcI#URsx#NAdF-<>Auru^vf9&lr!zAbfV3}sda z_+2}@jp*H<3cv0tZo~`!0YNyuN_uG;q%8=*bS}U{cW^;(=am6ZYWeq#X?boN*CYJK z2FEnS{zSzWm?RtsY8Co0Ee@rxle+HO)v z{g`yR?Q5WTSfZB4Rsg#k7UL5lJ1DKA6+i`vJFm_@a#~Lu3xB0VWViTGO0X3P{dwRD zNho*$E1oZVXQ}!`QYPj!lHjahid_z%iwLQaq6l!$&o%R-#1T=6&=?(AJC4yj#uBMu z8CGhCd5_wr_Yk(dBO8}&sfjR|c?DhP&eGGx)jb)qeb`ajEg~0esAib;aZ9wjL$(0k z^d^RQKEg8iC0bqZ4Yj>=NaL`T(p~UYI%5a_Z!!tj9v&iQ==?PTiD?aQJX_N@=We!Z z!ju&EkZ!3e#WjFjE^_)-C=X_O4R z81$Sef&VWPMGCDDQBnDle`|OQOCL0~R9_gH$MEy7z&lP7G>^^qjZ$#L#JnGeupb$S|I&G#MrrfljtiQgFr@H|*dRc(>o!a9l$L#BfH*wFO z#t-T!dCEDi!cNnIED`v3?0?1Mxq}L8fC<&BZ!(9k5m>Y>b;0Dx;4S&FwHsWe0|l%C zHD{+Z$}2&IHu&y}HlH@)j{_0jM$}0vPpT88I#`t}r^?72!@}U9@WaFS`M&qrgH#!| zfzi<*)QQ&}sT-LoOs>~3mi$JX zWM#6Ia=ge2tf8?4Zjgxzp(z8_ zEGcWLtlCjMiveSmzsyRZm6OF5x_*pE%uVviTjxvG{y^v zOTxX@(@bo=gJMarg;Knmnj@JPI}Ppk(-(g;h}l2@&VbVn%Pq*!T4Jf}=;BU<}i}o)mR=12Hr53;Yh<|6Xzoz$LE^T{ShZ zOj570Yl>$%N0Ev&6aoVb{5Zrm>sW(rq7sR!p~DD5)M)v&=IpTV}1;;JeA6$|^x zNrCxrojvVszQY~s!Q8d>E+Rk70iDQ5eg%(UO}WSHD+EDn3gX%%OHC1*iBM?vAmo_z zhaw3~>dPkQ;oS+rJ4IO>ZYRH>#_D*^cwgRhfnl3rzW91^<5e@j8~YWQlVq^|pv`1M zdZ5*3SO?+bz4;9=r7YkX1dHV0&BF89u|9y~tCx|w_uE`6Sri`(Jgu1yD?wW2Z|E`; zEj+c08_4{NA zQCK<&gNECHStf1I|GnO2A?&c?&`=(bfBM@r{M8IJM3 zlZv-vFFcSwY>n?86*Rt9Th+THfy0SWk6u8>yXGqo2TR@zdg+R|-`o$9HKRXB&trA? zy7_hNCuu^qWIPO%UuX9$tPnr`*!# znnSaddVc+0;2YUc4(oh%JT%Lyhu1x3%q~q5nAc4yt+6d!v;@nzrqZK zhG&`lhTyr;0$Zw{FTlI6cK z4nYg?Ill#SThWLobi48>sgV}bIk9WA$KR?N#~#%e&B`DpuGUUC2zA@Q&I>UsbdoB& zMqoyQG1f*xo6b^PoGI-Q)XMET?Ma|oBiksx(AyRFsf1Q5zhK@zLfOpyJ)M-@%#Tu| zuX)?Svi78+(khFrdj)MS#ViKXWhSS?4NhMTu=J|Bpt2gASn2Rm(4Z8UEEa9)s;1}h25*Yt3aOMEA0Jl8T{BLYZ_Z(2!devFmKc$hrNxNL`$Z*FD_tSLdpy>QkEN}tYs;itYk1kp^=LCcT6jcM%aYto$C7pw<|E|f2_i9$vW!ZMp0>cTLBNXw$;a%yDyqMsw;JhmG+V2&g^!* zPAb~)+^$^BL-o5;^GFp1KG!4&f+T}d(hanK`km8K9^D;xq3!RioWhYkL2--fVc^Q= zez*%g^ zA3p_iIOq&xC&26rp4_6M#O+j1yDqUMnVI6ksrtl90cgf z>r3c$X_#!-a>#sJ9rfF1x(MLje#x%VqA9O+|u}tDX8d8 zU3N0>>{3|8yJr0?oKmEIe+L#Vlr<5^gl76(hJEH)k}CU)U+Y0>>dhoP!$5QoX$!oc zFt5DeD-jd_orBvw>To+0{mfD3#e!1$mg0pqf=15ETbLY~?89&IIP~QAFCH5ANp6r|AU#iAuR1A$YT2nK zE_{4UrrA864!YmZb$GadX#=V;sF~6<6qHOH#+=lju_iZ58|uy2-b1GNEGF#XFheHG z6g*w0Ap_|CIB+E9k12NUSxco}?QU6Kp_a!xhy_>859)zn=+i(|jf}(ee{a%9&<3!s zCg;wRSJ4#Ly*>(2G+NUC(RTZ@TGnD+t^HlB*i;vOm|;efY8;DCz-DEna*{Fc=FFCu z%NQX23;K1h&1fx1i9#wjW&1=(a0#tyn|9v&vaU5o>hz}4-)X+V5!ZvvC>44*7Y?dY z^(aqGl7>$3FjBtIvMt600&zn-FQaB+^oRjwv(C><&fjf=k6U0(J6B8@3T=~vy56B2 zLwzQEcS?a)CX%64zbPi!WdcX3}22^EK;(7wEAlGg5+$r*>eY=Lab){XP_ z%n9h&mfN3M6JnoJz@u@?_H_9Aw@ikup`O8TX%p!)m1fu;!H}7#Q*$42f8#B3s&l!T zLvvj9equSv`TXNpFW;RJtc*s6aca*Y>Dn!`z)a=E?8L24@~pD4g>@y<@XU7{UHxAq z0bNcxq?Dodx^);Q3#(<*aL*=nl|t-U(n}LzyfC=d(rC6o-x=G;e1#l^eom2O-sE6L z5lOrvz1V&PT1G>*HqbVv1J*qtJ6O;t96uabG?8lF>R_cPZa;3=X0|ubH>QnUbOiL7 z8_?mLo}6H);h3J7;CAeOpnl9IR$&lf#tYjBs0j0weO5wS;eM{DdLR>~8EOC1AuV-B zN)?C9kKL`{c}ivGGxNtt^Fr-1MvJ&l-GM5r*2E>f_$i?!r_7=^r$V9pCi@=!%Bu+( zg=^x4hptEBbw|#`g;^SA3(%F>-j((pt#LcV&rYP3UvAWFqC8DY6eg@WNqhX+{VN1 zf~7U(9!hf=tb~LJ^GXU%k`R>?l^;@Pb4{gYkAr0!s!k;G6=s9;%4Q2k7* zFoN^6gq-pgVeR^4uA+l%eBzw?)h&KVZ{hPrlKrM}UINE7(u=3mf6!`9x@@nD1z(`JOvf1v=NziDf09wQJduI#T@~7bc zs@z)NY?f(%`?Kw`b11xKQKy-5>=Fo)qZcAfkEwc9c4 za>?nW^Yl!!d2m&u34M{ZqvO6Sahu3IhH50A_N5}G%{g)Z;xAmAzR84Wb;9}FiS&cGHi$2Y>*5XmeAXtt8$QeuKt#FMdLaLml zc*|mY7>2Jonn)%&cUD@tSv$ZXXjL#5IsGoZct4l81Pd2j`uzkQQU3hd0Bsqmhcwrc zA@Cb+8IgdBLjs;ADxN5ZIx39NJu03E_D^sWqb((?FU6xu1dY$4R|3U2tX)A!}U zc|B15a;WffpIF0XSklkU@ISWWvgAgf0ONiIi>-R|FX(dh#d@|==t<5$qX0q!r5s#X z2I(NuWvfyKSpeCHQ_||O0(3!XB-Z6Z{!W50^G`QsVdtB@7$R;la^6QaHCD;eUB4hl zUYLAm^|`)5qKG+tCDeK%arY5j!p#lLmK&yVO=hOvm8!K8&Mw!DvgX;03~UyR`2J@> z+B}_yO!G&YIRDpz^#9Kb_aVTPVv-p4n2pNng$@U?;WTn2x81Zj><E%`L-(Z5fCyqus(0k6>=#*kt(k5`(wr{(e~D?>sLc-+88^X{8#0fj2HZb z?=vQxKk}hkG!qM8JG}V-KJ$34N2YMqLZ{-5o*9V3HEdM5EgQKPySB zo_7bqV(^KSM}&bmQ6qe8l+ov4samgS;AJ_};#Dc!u9mwcFV!r*8SW^O=a}dXRq~Wu zad}bE*w`k=^ibsMdSH0J+n%NiL%k;tAmEz*rc5S!P6y%dt49KucUkG2-AfzmI3ytD z)m&T5(c&JNRHgy!u!Vv^s}AZlY&v&#lWN%pf2tBn%%oDfuEIYX7pTX)YwCOCE-*yv zZ`p?diI0(66`zt(4@B>MK9shAmvNnn}zpE|KW;LY{s8{&?%Vo3Cf=08TbpH z?$KA~n%V2^WmRa5XZW7^wYoiA1Xxeyf~CVAVi|a=KlPjYy089*TzmhR(e2F;V%)aB zpI)CqA^O(+Vxl^f=RyzU6lI0D0*Y!6ZWuG4A@~JsxxY&bPsrM{r(A#G@6*!JFOqR~ z4})&JuX{RkCvc`}Sdy56;=yD~J8xx9f0FlMKuU1mZg5)+n^gca{lOM610((vw?GOV zY`I@M#o6<)R~!kT9%KHl;Mew`kX7M&TRCR66$rx_*lzxx-Z?r7w_f0;CE%ES*pcCW z+Frr({+v}0>0RQ-9^%PX%HlFVsMAmGhOWY=Z8lRfE_HF4b09RU1*S1QwcQlhwr?)M zX_=cA3?3HlgI~w;XqnJ&0l?fF0r1Z|@h!&v#g>au0q``B;P5zr-?MZf#T!JLBqh`b zfIf*mDn30*aK)Qf!>ZgpQdgUIt}V&?TVcz?ok~}guYy;l8x&#U%T#vHTw<{;8p@tN z@;#fqQjHg!2TO98;CeB0FH! z3#k%LYFkF@AZzs`ZsuhM5!6yGpT$~l5u3aIwNtGeB2V!C5he5gl_G@qUq#8k+>}Zc z4@YbzjBl?|W0U$+W=7tzIawgZv;rvu3Wz_2OGTApV)HQti1Mh#>7&MJla?u|4Y1^) zJJ5(XeobhegfGl69+>&KkHsr)xLgxx9Y{ z+$T;v$=BmeJ^*!ZH0beBhos0F&b9634)0X@#YxjJ_~p5YB@Zp0Kf{ySdu3F`p)tGj z<)%sTXeHXhuZATuP`>j~J7w6l{ifs9Ene#L0u$H)P>FCi|0bxX{;b0{>79d(OErpp ztdc@-B1t|EP!MVtk5$uOekuOJ$ghbu@~n=o&TGuF)9EPpAmtRoebbY!W*iOH2r1!g z{tQkHCO{pCDXhOJ;zD!95TJ>% zw~9-z58#|2k@ll3j54v%q?c{DICl@>R6Xh+?tuL0j$Y>3wwdi>`K$ZLktcWAe$D$e zm}mfAsx&nybC;hU%$>i%HqhbVD|e%^zPoLxHxSo?UBd7V!MP7xve*v&UY}3i#201% z%CU;Pw6CvEV-mM1Y4NC$u|?}7(=;W$!DbP_-Shs#(|#yucOIIP1i*2rOTaSJsH3`U z$CcgaKWS7!q1jac_P{5>0LptgTPGCp+GbjfJ}qMp1q4#tUy??V(}(UP;FNK6nVEM*Z;UU1}!LN}AP!p>&)EeOw2i+7^50DQ3D& zO`~Vc`TId?ZQ&t&r@R#vCNs$cRX}-YeD#~<%*S>TBp>~eElGj~;|qvzX|7x`i2`-_ zJ^*kW+PL|+<4V(duC}yhgD15>+vI9by6H&KO+)qyilMt9I*Z^wd{K!I+J0AQl`@X2 zzaRKA)*NVg=6TN7GS#lm(+W6W>_YC6-umax$W;pai{l+z-8KEKeFs0E=CE^ur8SO9 z?}epw4}C52XPHLP>MQzs7($ajI?JuRW}Y%~1Y~cAke+Qw%F83Mvw@)By^z8gxzUz7*;Go4daGIx@CWaVHMJuhQ8v>o>X;5{)*-4B zS>YWfGL~JTeCyx%2=Yn8Ez7;SnJYBEm|J&b8VC#C}FdO}`?0T=CPrW?@9<{k}&wE~!yvY%B zy{KFjKakJ>@oRzI(DpIoglmNgVb8!KJrG>ojVj3<1HIg6)m03*S(!lf?1G5ccSa8_ zmnm5EWaq~_NKR2f<*>v@iQqj?>BzJfO77$VM9-}O;ttWErxabGAUGpk=|g)LB=~*A zr!=wj`ik5Q*^=7+>6ExEH1GEeW0U;t!-_@M`wQJ62d6)*QzTHozvjNnLh2S19Ub{} z?3ArOaH-|peZ}Rw4igwq8yCyWm`m=Z>E;bKTj?|a*{U{q7#f$Kf)|T3+dPt_o#Op6{8oqG8kOxXj$iv`bEnX20%CeL&fnF2i0d-P7vA7&jw+S+s#}rdba% zORe^}K0QBny0=_YtzP#iLBDffv6(e&Qp1?KJ2`IY9)K4I7g^rCIb$>IPL{*b=|k38 zTemb_BVM#Vp=&o0N2@Sj9K!E&B#98i7mG4tgcaSTP@}r#l9Cdx;fBG*C4^Z+2vt)P zw$Y(!a)h`*ycIGmafkH#Po*hNVsFu~ zM$k3B)$GtQIu9w_vTal^iLgfwhIl3LkO@?BS1B*NB`nEjpnfhF#OF#i`yM4q9>a1PP02+ z0b?wwD7R=&*u`JEL&oV_y>~t_YGMm-a?X;XF^sWmBaew3PV_;=*&F8_r##sJJ&QxA zZu;5?IzDWs7KAHr16&9Lf|RZx8&DkO2ze^Mbd6Ck-og|AKshHIb*I>Y#xv(6cmL1R z0p(zvrZPWv=*dsh_J4N_2>$EG`QKaoN;M1DpU?9b@v2l^`lyvaa={FR`IGB`=l{TW@-Tl4OJe$Um1kFB4r70Y!h=O6&a{pYpLb{&(>E- zba%(69IlU>*K}%q{OaU|^-?iU-SGt5_H*a83)^<8+uf26btk_d)`slSqr@hrdeVL@$(tTX|LK8ZjC(I*=CGsH)bh zCrFVR51QO2W7vz%+REUIkk(Et*_1>TGh2yg(>mUS&DC+0^6M4wWXWPLG)JRZQW9Tkw8!Ch1uRHQ=2Ti%EZ!KqQ9PQjJNoS`3LWZJ4GB5^)(7pEz<_*2GP z)1ve@?QSigonA}C;sZjqUXV#)$3j>#0eO$7Y;0l7Ra?SphiejOdm$V5r?a%5MwdvB zcL6=zRD7IeoD~5-1CFuuh@^yXjZZO!3C+0YPrDdsz`?Mbs-G>1bt+us8ZYQQi7ub` za%HHWWD$uMysJ7=JEACTcvhg10;R7FRiG zsK`|Ai5!^?J;qrfnbMI(*fULGlJ92zenb^zwq-|3nj>%iW9Eij-BFSXj=sIQ!sI`r z7!`D*j1S%2&R@xE-BLAGaJXga(zP{niybFc@{p+teEL#%Tc|$ba?=z`tV-R$5X-`u zgDYHFSheHKwS#_9LsKR!y-PCWgx0_zT5t=4h;A~?)LeKG{tVONXfD)gTlEP%fowy@ zf4!lUh`pw--dSNu|5*N}*>=%fgqDrhE3FfluZZvgVE+~GLy&ZBe~ zMIO4i_5 zN+V(KLn4gCJgkH4?Br@z!d9lZlqtD07L{x=SE{snm5s9yWAp}HxJD-nD4dW1uvV^Zg-MBpE;yzzqB8YdICtD>oKw3| zH`A|{P5Qyhb*gpo+;yt)2+8W1=Tr-x9xv?3p|;@sc7xbmtG@OQmJb4j>NyMUvfO2& zwS>*kFjh$yohJcBkd|T&RFh{Y?YPC8hXZY;XmXF$amO5u&P>j_u$3F320PCX$@7%)TtoTAcH}U<8it+d8>G`&ByuKvM4UdlVI9bK^gfmo_lfgU zsE;pnnNCG0$h^9xB4`xOa5czJkZ#H#5Lg<=t-cCK`%NXjz)G@(u!_<|?EnY6qI@fa=6<{! zg6e)V!i_cAaB(njFj9N3HJb6Jz?*os`#{agJJ#%za$d!t71O6Wr1Rb9we2{7>%O+u z4Tzs`1L|0}#%meCw@V7xwGRtO2pqK@&CCyeFXg zI)DQ>qUxdZD<+_5JE2zh4bZ39rp@!CZ&ieupK7PrfxI9D&AIF$F-;|2p=BVpkR&Np zUjUEyXUV2`#q$9|tX|;GB0C3}wr_->8C_J(^RsywI6*z=wb$w7^1BbNe8nL_^ByMx z{(X9?`fv*xC~L>3(zX!QjchM^6TNzP;Q~NFWTBFMw|@|dSVNRoD$uY~0v?$|+!0-w z-)Z>=-&RB%ig?KgK<8I70n-C`v#4VHJ3})$_FNG|Lux$GA)Wzlw}3+5MaTVE)j;+T zFSr2$!Tnqt0Q8aEM&*o!<&2&nKyU&^@m5muhgN5*kNEZspJUye3 z5wzb&t{>WH=FdrL-kl!K_FY-r#=xo_eV12voE{+M_OlCQAaC+(MzJBoFm>o;vbp)b z(zzmWIKUD^O9;XAXh|IgcGMs|u?R>Ic8*OkxTei4d$g&(&|%?|rRE`^FfE;FjEOv- zFy1J;^>{>{^@8NuX*ihRTMLKcDVR*~Y~ctTLC|N2!&$XA^ei@?g&OSfm)MkfLlf6{LotCeJT4_@Z#EO`1qai`MtBR)v~zi3gJSH6}>|&*&NJr`(e9uPv^ej{e_qnJs+=mZRQ>vO#-@w z(Yw#7wL{od+&U%m*Xt^Q014;L#_C`jR0-XJc1hneS|aiLpI1sA0D2z`e!LX(A7;(} zF4_K!}oa`An0a!c}}`%%`0kur+iH_K-7ro4Gr zuF-7m^|;Q%^9iKO(uJs+Y$p;&#+Kn&z>{h>O|*V+19=*0f-QrI05m?Oj;u^?#YQ-4 z5MW|7#v&_z3DkT!CV)p5!f4JWV0KDgP!++nfGFAA&~80sH4cN=q^Y~Vw*{65gxZSW zhsqvVVN)Exx%86cJnT~Z4jx{LdbSyes`gHS}<#lZj&{Ia^`(yfr@|b%7 zVYQ*HdWQ2lt~ggTcyTv(RPk?@q^CB3&2J220ve1Ib(2UfkiQ^RFx9fFnsPCSw$9yQ zbd$;XBo8uE>T_=znp&d+hy}kJW2n=OH$&qmePOgUJ=eMA0nG- z);w)a316;_3o#QV;izs;1MlZ`b{(2{g^T!J!Gag%o*I(3v-(36M2;Hmabfks`Sl z8}l9-9xWM3KrIBuI!Kk>Z)xOMYC*ku|2B7byOHBTPDypD$gjS3o!8uE6zRRvQGjqD zwI~i*_|1XP&*y|YR(Wf83Udmq!|&Gjf`)A6D#_PS4{G4#B+n$^poJ2h?g{|ugvAa` z3k=l?eIysOYNU^gqnMAw3_QD8)4vEbEVU6`Y3_#%bdC%hzW+#;KmuA8Dz8#Zp0H8t z1+JGxUke)vbyVPgs)>D+;O{2POMAzLES9JRITeG=Xst1HTe#0sx}?Acm$ri1Qd2X2 zJl)oRC(NV(J51}3i5#7y=C;ZyRvKEaQn#5ry$SVmNL+z6A1CBWgE2(6c%N(Z zbh1)89&`?N2jYZhiL!HbtH7~b;7y8jH%agli`ytUe7r$ROBq^XEwasOUL~{l=-+3$ z1)?VJmUvKT{JRI$9?`s4lEHi%N1xU*CVv&am*`vZR_T~j@T9KWF04Tr#v*z|k9VI` zML^SoL<75;ugdsnr}Cz@JR9!tJ(!ZC@Ay@A`6}a*^jzl)0Md3R)BNajQDqCbNLk@= zW3BA68g(%m1uNbx!=-K>pPG<()vT#8DPUCLMNTyAm0r>N`+1EJE_JyuHx4_4eK>)C zc=2`i;&DdTnLWyJeJ<%(On<b?D_tX64m;uHwnoV3DYOF3;L-m#m zoaiNR+rCosugohGF!+?RobbZDI1TCs5||3(gzj%Z<_TcM+=Ok96YX%)C2D{&2tV$5 zU4QPzl~5@??(;@?DjxlDDe+po%(hTj8qP?5x#*+=R;u&a9HLgiabnBmIGEf+xQhjQ z71r(FQ_nm2RJcRhRAL~S=MJ6GXj2-$rq~E@!BWGnOUR19s?$W;y@z_^n{7?kVc?b> zZ~EP_Q~91@q7GBDAS62(PG}gpey4yL-&jtb>RQU7v=suyPoxT)VqRLCX7sKOsj&ia zN!8<#Fp8KH*07+eqW7pe`Vqsim?g-*a=zOsKb4T4JYIYUyQ35e_M=VT<(a^Z z5MG%HfvcY#v~lOu{i_|{lY4ZLhu{|IhshO_Rdy`AI*h)7{;`fp4kWp8mEJ-4jc-|Q=Ga{0~xda|PN8zWJB!ff>eEE$7ASZ&NKj1l=2@ej7e|8M#khSe0-pF>A?b!n*Z zmJFp|wOc);vIzChbseM(P=}dEhE$2lj#tRzBc+HAE%$*{CJ(uiQ21%+R^^tL#59D_ zmwh9@vi*Zv$3lfL#De3P*doaoBK&jFk7tvU8dtjnl~o#71!k)t|E84=3OF5@9E?qs zg5_V=;j!h?5tYs|a>&EcBK@o+9aCI4Q&Z)Udc@I66jV zrG+b@bu*+4D*Z+mAlO)S_5MYp+9BfF{!(LP+Vg;6`9i+1ltJr zN-?$5_gAAt9pi%8<{+?Pj`ah>Zy*t0M}uV<`$h*%6WRxACt)rA;(OM^vQ}x1)2m0v zCAy}m|E84ehwb2&Q4?pBHerKvWyBi9A;M{gMC6b&#SlD_ND*fgJ9fRfFG<*~dFC4^ zVXuy$p~2go^tbS)oF$4!oZ`urGfcK!E1cL-HA`!bR7Z3NN!OZ%)>M{y))Q8A_nAHDso#NzT1FG02kmL&^Z@r4 zw3+9~IBwrzX*O=Z=IJFk6oNR4Ji?pZ6Qv;j(`L1|t>>7Nq64e1bu>B~2CVV-_^24w zOEc>T+ygJE*NX@LoE%ppesYf-z@G^Y4O0(G13D{^JzRsXIG;v{QEE11u1=4%q>LqY z^i=GyAWgXh_~#t515h`+H_Lu!A@Zm453oinLbwD6O)zpdYMb;1q?5fZ#D_YQloz%k z>MDO3kV93kAxrduSr&oL)rN3yDfb)OsxA+wC*_?b(5JA6#(73~w?+;GCJoHF2aE%c z+Ja&NfcG_mr9)h!KMTm8%3qdaq&X&}DKsU{%xdsqhI!3eh&?>1`t>X4m$Gz_Pcec9 zBC@6z$roUd}$(QCiv1NkFYUXdzG zOcq2A@!cw~br}aJUNSEf0S>-8@}-{`%PmKHr2FL`v7Me-SA=e&$l36RxS;ep+jYtf zuV_&7PXp+s{e@p-3(ddEKSfu#|J*8J&7SjG)+6fp37HKDPyo%2nHmi&*RVqb_VaS8 zgW3Ts5$nU9cWeOqt#pcu#BR*uaJ1qWj>c}N%GrnLAq0&=;P^qrxsGkkO`_GbuHJjl z@eZ4cUZm_h=0%){!kTdhEH2~Q!{iN@her8pkhE0^#X9A6d5}Z~>{3PyFs+#*{j>H8Y0GeWokm`3*t|X*`QVf@0T9;RB zfzTPcNEF%uHoIINDxLI;OCkOwowfxw{u%!cO>n!E+m~5gN0w~EG z-Yv5%Kd9{5;1Lk6I@-3Dv!T}u&bAx&O2kU?28P_opGQ!V`j4sqv!zzy1>qfzqm}(C z+YNqx6!y+~Tm5Woz_jiSktDZ>e|L}4U1H8`bR+WzD{OMj?*UfAo`&gnm${jBP6SNq#I~{L5wSZia`$UhzDqf0 zE4(?uGcb&||7bMcJ;Z_cSNFk+@t0M2=kJ~E%)G(j0@GV55_M12zi8Q9d4tUnrni;& z>Yiw!PjO7rY6cww;b=D1d4ub@k?;6J&6x%tI7mNX@o=Q4AV))FF9PL_e|^IozMAeG zenKf7i2v=i@xL@;mE= zbvHo8KAS+D5eozCC#}KhRB_TLzQPQAxyK>br-6tKhuGq5hO`EN!3rg=8HxJPLWOaW zsZ*50Az#62C8a=v4jEn#!nHwl3rujTg$5J?I={9KSZQ0cj*>QcA`4XihpsVaqB<2y zSlJi?zHHe=H#s>6(IIF*!Y;oy8Or$J?_k>8P0zp6L55U1RcK=MH_kKp{3K~&6fmcX z?!2)PdJ%!U{UyGL!MgpHYV7@{OKa_oAkZ944ZriqP+crK50=2q!4Cu;l3E``8WuT(2D?6L_|zP_=@n~W4}H1bwp&u zCV-<$?Q$RgY7dQt7E)*K18@3P;-+l4mFK3iPO@olXu*_=&F2MMr;U@2&)MKbdDX|Q zovpz7EHgY_s+{2#Y*RJx?ydosjCEq2E}B;lZE*3NZn04UK@k7N*8kx!PAYqs(24XJ zJOD+~gP5Ic>wMMCcu`8Zx?Miic2fy|N9*2w0`;cbULKyFqwu2H=+)_xW1K&6RS(J5 z6;Rhs;~V}sWpxCEu5vlxAcsVx#Ns8+J{8_5eg*FGYb10hVL%*vnbcxM3O&{ zk9~OjJH8|NxZf&Pav%-d6Y?LxEoF=_i2>G$Q3=JF17d#(lP57d@)LCM8ijM6rHGF% z(O2v0ij*tP9JE$Om?z-H)-jAmo)t?bkTFLeDEn)g8x9R|kl|=hFe;qY6dx6ha`v$L zPnsg#Dfp3AjlT)l+*G_rvhQ_?21#}FA(C~pN2GKJVFQqO3O{~T~{C~jcaL3c3#XfK zW=k37y1g=m2bYEMNP^I2Mz!Pv-D-#SQN^Rvo{Zr>;S2PoLp9az6H-UB9Dv?I2n|x=Q}P>MH5~e24eny82&< zMy0Bi+z%HauMsv{I;p>d#0aoNe?J@9ue1i)H1T{c!;88{okc3OCP%E`p2a3HtU#b-OR^#bnj=`H)q}|J&!M>)LIiH4 z=OL^8C_;uMw!0On!4lQru( zHJh41!S*#urQ6IoxK9(qt+=_L(UH%&-e&N{0MJ2&64lsLT9(44>U&`DnxI8$n`zYu zJb4&kGr$_U?(xZvwHPGjqo%-{jMVTTCx+Jl+}gg9FM$R+q;9inM-v1y;wr$5$dEe^ z*y~R1p)An@?(+VTTz00-H}r@Eo%jxt^^z=Iwik|LEtWaCYqCMDYpO5jlIVv`9rZ%2 z>lz(0pr(xD+IrUAvgINlwy=E3ITdKgFWV&!*y2Si>{Bwhs%i_BOz=`1VBsq&QCaQG zUw!gURVcPfEEhd1MZLJwEtRRZx3wx_gCA6R<{c`I`!WMUbRBi9#OS|Gier6%n&;X_ zr`a<09?Lzk@?U`Wu_`fA1MSRjt!y>=f+V}M1$3s_E1h7I{(~)&pbu0^hF84Fe=xT_ zF$mANDRa1h!NoW1Bx#oF7N6HY$5F>dOkR48iO@MLUhNT?MIf{(I?SajQImXEfce(~ zwUbR%2{&CA-+OfE#&%ryDK4?xH@$g7g_z!pE{(Rf?L5?Kyz#qE+~qW`_PF{Hbhvgy zW|ktE7LB}4v8=7=aez(}!{h@2BAURgz!<9@N zp5Y;>9-!$ZK}N6}&eNy=pRfkfEifgksM;nloYhj%NtXNs5jw_sHiQpV(K$DZgIA@Lwgj zGqw&=WPRV$V$Zm?c&32 z;!YU9@OEmnYp=Hzu|CXJZwr~rRnypegJ!%unwmvN) zI=Q<7?Tuj~B)6m!_c0Uk@q;>`T9FgjW&qxTy6GVq1pQ7gCh&DI#P@M2;$t$G&ymb> zVaD9HToxyy;y<@Mcvgt|a4d;cYr^tKFLO}3VwTc1LDx4W6v2aMJmY+DWLd0w`X`LI z>eokq=}&WE%KutoLH`%uC#OUrr}W?b(LRb+az9MQyz|Sp$u`i3xhUR*63`NW5qXsm zgeft~&;3HO`^6^h34r;YT48^cc&--5DfJP~l_!{J@TlMa|-IMFXg^uvmExN`My2X^g87M+q zDVi`F{6wKpLe=F*8T3=UI*xE!HcA;`o)MFoOp=@V83thQqsFbiERa3HSKaO%I zE^gg6_zwrNtE`irn`A>{n|(ly$di^`C5&j&&xdCif9G-tVJI*RAT;u3$1lfPUyU(D zei9GcB0huJT4MBb;L^B60f(+$pcbuKwsh!DJU-TWCbk}GOq$l}oj#t#Tmx@bDKu4|%aJ{7q+qK4YDsm(HmybIZcE@+0)$%@ggX3?nRTCn`V#Ki&| zkU3I0;d%g|DU&#n0MXYFRTO6e07a$5Ed}5q+@$Rmqf>H@pE`fK?V4X{eBwP_Z>Fs_ zWYrF6Pj{HFbShu8ooVjsZ=H|HM|3Mn^=&ucrq`KXRVTWn`0S~Taxj3;DRDE(!;arf zL2_Uqu1caJ`b`{Vz`#SwBC5cn37)SP(>kzXCImAb+%!=-klkaPte4|7Sd|1f=`)xq z9Sp+n9Hm#F06&OFWN`Q%20$pn=q8Q3-+)2YFvMbIGm)aOpuZfcx-)D(NF32&q`wDQm4#N#Zd zZ(31U?GeATHLX`SiAw)#J@~EPS1@glH zQ#WXH(vS_1@gUUvgZu#Wd=jaGL*Rb?{G$#y?2_Zd0L%xwTbrH77n{6Z_wU=&dH_R= z^a5;^hGP5YsU1W@2s3r1zN*Zmixj4JR_WSKA|Rl@Jxm685fFF>;SUlEH*M(h6a@0^ z;tkfiX4BgJGYa-AY)_`30eg)tLvkTy#2^p>3C)C?L2H<40>fP1<84tU!Y>(BDHRWX zeO5ggpT$XIXwH%m`@0GqCt_vi0y|<5*+QDnU4p92!wxsFkBn23;|VuMx5@IJyZ&N# z?Q-ArLKCj`TN_4jtps@E{i;*gIdAKQh5_a?j8QM*H7qfq+r8q{NYq*1H9@4zQ)I@c zaZ1;ks`Ae@zJeL6btPWGjuFoo z9;R$Qm@Lsp>(*In0bfQoV3u0uj_NNg2jkzcr0VWGr#ybg>b#xcd`oT+a=~xh)(|3p}3% zsf_Tm;%)K(15I)U2|KgjC6Y8qb$tF9b?#9XcO)I0sk+r_e6ZnV#S!owg4wR?LZ6ef zbn)bIw6ZR{o#emz{r*uq=Qw#6oBc5d=>IjS{a1bmB@ZWO6B{8rJ7*_nM+18j#{aMm z7lrX(eLu+;dVpbNAO#g4JDmV>`5$h4=qNHW6?BZJd8WOTImUUzKC{-jmK)#?ihUbt z!-blYjp5eg3Es@<>SuU>uoWVf#?$tI4ma+6j@TgP%6JaOJ&X4qAVkaPJ&l&!-)~oy z-xNUueJBP_NTc(4jqPxzJ1Z21N%Asy z$};NrWK}*QDUcdNN?nMiBIXSp_{f<9B_)0fS6_8W5$fvp4AE^-qAU=qB_9$nB)MOD z{_LE~yhCMK;RloUJJL?%9}MYB0TAtdB@KA&ndKC5M?5GFG#=k)qA0;!riE6iJSTX) zS3l^n2Zd0iPYU|YALuW!P#?8ERcRTmIDd>Rj!~WHF+0Z0IIY-fhKl3ibHcI2rC_5* z$#Ilg=dQ4md`DcDw0E)7Q+pKoSkNTuO~hU)Yo=5(XN8ukZyM)o#^+ad%0@VAQcE@e znT@WFOKfEi!W~@gO(fYY78XD$C zSlry8f)MH;7xcFH2;pAk`(ZDTCqV z;S3p}+vu?h8mV+8jLtUT zU)+}+KidX}Af0Rd)%df?+n?v(e};c$hx-3M!+&URh@#Fvsgi*cLQE{E6I2(LL^VNK zkdX0Z)?W1U|3In|hZe}0x^nL=nIuiX4Smr(2ACuJu-uAcUc;>mu$+v4@;F_!x;-CP zS8oGs4C97YO2D>vxzAr_4{Ao@iN^kI+%tlXH26&DKHiKOH+XJ!qw=;P9Iv?rf3OWS zT+!%jSdV!5Bae0m^Qti+uLss;mOG*!0`{ENd-<8}nk@kjgn1GMv#RQ~lM|_e%~`>C z@UTu$q%lr$V#A2`CZtsV*sXC1SjpKvI!gkhClatA#QU`qQ42?8kvk-xzN?chjcKur zTt#9IsI_4Ecm(283BA4V8$B&gQ-J}dINCy4;XB4PLUi=vF|j&e*v20!pZcC76H^EGh_EEAt1+vvW<(IdQkn>)KUQ{H5jEvXV~Djcy+)-`OX zJ%JtVrCiwsh98&l&`-cJF6$F=J(J$tm_f}v9^4hOySc}3A1v(vdZAUl)*?pW6zAy{ z#jBL7sm45t0GF6iIGa95s7pebL8N(dB=MhCgoSaOY zo&HZOImrLL%=%}oiLH^NhrRRvNyI=IhGsaDwgJq*fgU_*v@qwuc!wvfZ+m5jjoQVOl zDHJT*0*gGjLrX9!&%Kml#GRrvN}y7_bOe($6>6Yjgc5Q@95c#B#GN!Wj3{idpj2vz z2TxGY25R8ly)+6D4D7*x2dpgY1dI#}EUZi|)eQ|9UtH;d zpH{4iD}4N%Hx&k(#MfV!%;!Z6)7=+*ou)-$jyKQ|E??TOlb-0j{a#p7O`CJw`mmL^X>LR$0 zxLp?sWUpLbZmW6oeuuCtwOJ9=@1 zHCk1s`@(*%zCw*-UtC6*Ze`iuftpIV<8iy!IbISOGMT8PZ(H(6m{gdjo4cx7Q%j5w z9M4C4=NM_H&1iLLRngZ?f9zPxI~1xwjkUW3q84dQefOe2skf~we~P=MGev!Kx>yVX z*u^>?B~6!0jx?CJRSQtZOwerIN6W@4aoWwK}30Vc!O@D&^SrlINC=r!$u z--8Z%sQ{Z07!yDv=@}*(B2sK6z0-JXDwe~Dz~Ml&BB&ZW_Bx`6PqqY@YRGj*z)*a$;y`eyZ;GyB*x#^VMx1CN$TG6Q8`zfW( zSn+5Cpm%WY1W%-Q#YOqnWn=3n-QP@3PyVZgn2%d>?NNAbL7Me7Ojn~jncweijq5R* znmt4Pxw*-9iJmlR`P*)(JFTR$K_R31TPa!6c_4~El3dvJN}hXu(O}~=f8B82`Fpd$ zeo2R`y&HekcVoKEB6}CIaBoi%9iEk@wgH7f)%LD7b-RhuIrM^WvI(zn^&ZbeD@=~{pY7& z6j=OL*ZE>QKDw$LLi+^XF`Bl~)YXF1>qrBqnwjmQCxc2^uTf?+>3b{lm2_Z{<@MUF z*Cpxx&RTI@SF0MjEzecL_k`dki)rnU>(kb8=MZuh_4GF`Low6vAg(- z8e)N!AMM+&-CtqaZ)H`QtByvp^W5O2A=Ifqv&o0o>d#3&b3U_Lo_ZS`!)z~Zj~2r( z-)?9+5)JMgHp6Kvw)f|SYEkeLDBA4HxB3be<9uY|#V^jN(Uj3JTbpGWUq%;5!)Mp6&#P7wMh4v7ECU7J*XdKM^n;n#;@f|} zm&wt)PAd90+DHnuo=Fz|i6LHBcxXcX6aL!$uOTqZe|ugVBNNmAlh^*a)B7*4{m-@L z&NkNnCjnUhlK^u&8xy*Jhze1bbxLPI;O(!LPmmc-T@f&iGX*npG(Ue@iav--)dr!- z5s^?va@hF$?WNZDE3<`}7htYxtE(BGi2Lp3vH$W1Afli#bEMz;8Blds-2PQU6ZSE% zY3a!VXIV-UnN^AvNPSvXxr~l3sJkhN1T z8AtR>o2lR2S01MV-!jWKmbn;E%fGsXjcc!i&c#bT?4Ggjda_o`3kOad1@V31a+YU- zpCBE!?)mlcvSiK#ld1~hmB?)dO$t>N)Pz1aL(+3-bFdhiYEis+^}R^X{eNZVgWI(H zw02dS_W83@doU-E?u_KPpm#Gz6+;BZL-P9mal&fFeBOGU`s1>;YBAJ4MDBiVwzV_k zrcE{OOwv1)0z+pcH3bpc!yZ)~SCTx*OX~2;XCexj^-PnA4h;6aP2il;1F;!02sUt| zUTx6b3vlz}co!W(NLJF+lMJ#N%`YNOj~Jrzb(UKr#WzdkV>H_y(?H8U-7G}RBh9fi1zqi| zqEV))u^0H_;%^`2qjp0~KWv+3N!Qo;=xqr)w?5cNHc7TMk#&9^zR#fUEfeXAxoA<; z4L$Ke1v04EkuzKDp|5ibVFKR+ihg(R$SV97%EgX`_|1wwLK&{DV*Sy9+kMtz4hzmy`UHDe zwpDp|@97sRv3C1;ZOG`3yn)Hs4%F$ylzWzH#^M^@PR`t#X7UD#yVwdKUJk@^$Nlkx z6WJlh<-^DMTpW6^yQX;E>NC(Sl|l1})A{bia?^V7a`c1D9&fI`x>?t{UGA@UA5W+5 zj1^kX(K#z_@-XFe`0siX({@vSx-ip$uj}=L`)|>FJRBN4aDn2*d%Ownef-^+VDb+i z&OhMZJ`TQ~e4ORCkIl%R;uq7(z^$l20fbGFBVm5BhFnCk{mKG=NkBSDKYUf z;-qhJJYDK2<$eva-#rWzv-#@vq>Fejc7vf-?8s@USDPtdzB7Dwa~=kI@neaWFGg4a zWZT8nh1a)~SkX`BCz6x)AP5ohs2`=|-Q*gx;R;Vabkx~KL%p%GeTc2$jDaR3~z4q7+wE}D}3?9@}^+4Q$0y&yV zwOXm`a6^uji*Mxr4b1zjCizFMBd!TSCTnel;r50jb_<<88eU zEPCn_#hTD8(wTsKnx1C*#|xwSdt=0jg^=uB+-RyYsuziw_|keJFN|Ms^4^$M1Fwgh z%hcu{qeKX=w+?^v{foB+yDctWDKuaU3V_P8`ecw;2gixX1KSvNN4&3De&1^iHYY}& ze3nGcV;pM^IafyvxfXp4nYAg>ZCTSmVBaHx*9+N*s%!h>ZK6GN2X?MmZfl2&1=V)- zMRoq!8kUP7YP)as+1PulpScHdBgcuLDmKime_tG-6CbCLEp>RoIO26yh#^A*7y)=` zh$B`>#t+_S_GNJ!;)_IY7`S%_Jb*nx-^n|C7b|SRr#=-j10DlJRZsEf#n)r5nAMIb zV|;uQQ}#jxzJu_(y|{$fzUAvV_7WVQVOI>HL0q&(5*ZU1smEZa4+tU<+F*`az+~3` zb_Agj^Bk5H8zi-%(#&#EOjyi?+S>-0z7WOYRR_6&jeKg(;&fROGW*QG8-{OI9#n6p z+E&$G0#Cr8?+;Zil8TP{;1t}Qw=tKtL#uNcvTKDC9x%NF+5_braP`nQkDDP%gavdG z@;fGW-U>Xuqbk5i+Q8}hM?u!5Ia6d1kv-8pvW65)A*CR_yeP-TOptX};|1I~Vb@-B zs<40O!hXNkZ@XYOLpG_w}-d|j?P0D#5Qlg(izdT=Tly#z@ygLBFz}c?ZqLOO; zJil-_n5Lmcl7RQ?z*_8Gl@9?aoIa02+GGLuuS6BUBwB!n& zjN3btt^0GYb66f7So#WJiF^w{&C6%2?8!DX81l{}SG}Jde>N69@ZpMh^8{FRa>oQ# z((;%uu>FeXa|N33-O0w@i&rcfWCg!=^FVBzZTrVAB>4qViS(^}x1`F8>i3Q8@p*Q@ z)G>P)#1cR+gP8AS=-4j$c5f9$oXIpfusf#DF>?F^lDb^5`i`5v_HT(6QR_FtI}CVU z`U`8bgV{{T89B4@SKRzz4gl*Me&|Q9i>mqnt`$Bb-z8s8d(+}7+Tp&H;A1H8!XfTd z)j`~Vj0p4SXz=ASwLYgTuYmiZ&z?N>UBR%&$!DwSrUq~iv=cjnBhNtZt;>=Pn`Zys z*vAhr3A|lOW0Po@WZSnmP^IHaF?dV?5P9fgl&Q6d$)+}L1}jt*rPin(nUV;`nc_Tv zrP0r_HmbYyeDs$L|DKvzSY6;hS-S9~3NRHSyFH@~(gX;%CP?lWe~45x7BGdupfAJx@U8FJ_Tk^--yRtIM4(+S}Jk&n=DT`X5!6g;H zhzJ|1i;OJs`7x+75*Yw8!f#VmVa8ZLWVnYGE>3{k-Pb1I`-_B1bpn{60djg+TAxBg zYu~I-IP3AjHQti~AN^rc>7>u)BZ4S-t9i6;WZYXPDkn@HKc>zQCDCnF(X$}=W(QBy z*gZ-yWzC4QBBr8Y1!%q1+$v8WAN{Ylim%5rS=$HQ+CY~$F0J{TepYI|;Kgj3SO!zp zpdtJN>vkIs?g)Z~FJd8mj&;zU>Im|Tr5a$YO7O+63!>gD#sy@3KBV3)HfWGmcYs9=qRtc`{19naBppv530`UU` zw7`QD*5CH)hw<+XCczKx&RG2H|$%lwz$>H$L+TqSYEvsfLu_@4?^)n zpTZ#MP;U~>mzMm(1^#;xNRe9SvcbrR6`}>9DmUGau+>--EQZ08YqJQG0NJ4g{dx}M z%n0g$0f48YZ8liHdm5|FFWIp|tQ*{oPq3$IVz=v7F+iC2?Ad24`OyXuVl6qc(9Bj@ zlxX;?;4UhmjMGiogKqRX3dR$Kq3TnvJ!{*@x=Z5%i}KVd|^uU*O`GkiT)`00||jcp}oI+pn{> zuxSLCB9<`-adizzibDjrq#U=idO|-Ke#Zg914=s&16A4XrJ z6+&SqnPM&jEvJ~P2dc_4C77i<<;)*w&)zR&M1vwGabw#Sj+UK*%!4fe2M{7wV0b8N zX2oIYv;zO^l{S_kFN@GSB=l(Pk~}w6pIj$o3_uf8B$X#1gWaOXU06%hF8F*@AVj@g zFpi4AF9rdh^y<+8mPMiq2<-Lpk}pTYMpEnafar|R>wGawd!FGT&+Oiz=rd6(UY@}B zB#-1DHxC7RcWbT#U}fmuIwhFD2aLQkfbtB^qncGTJnYF9?U-FWuRtY_TtovyrmL29 zL`l2pQpAFu9UbJe?`_c?=9l(?0ZVmfD+PG&GnzL&>n5W4HwB+>ZvEnS33>1FZ1nA6 z#QG&7vT;%u&)jt{4lW@52Fdw&E4vvBfVTxJ2&2KQ!4d$J3-`8Wl!f(ZC1Mt<4BNob zsy@=MlLztfMFA(XAO~|7ACZd1rcVVPLN?A)_Q<312Wctz|Ptl9o*b!&(e zeextj>Lo+cs)53l-`ozgbOmZ;-QQV5TQ?%t_73}565W6xZ!ljz(Ht2?)O}<$AKmN741Xxe&JjLd~=J{X#%K*k2dT)9nViKL+bB z>>dZ7?R&%4=y#=XE!kE0I|Pi>F~uuoON`SpRp!HA@%jABYxouy>iG1e>^xBEw};Eq z;Kg-;iVLWB@UAU+WB^|1&r$c1JrfgVMWOJuNy}9-79}BhL^1<=l;plwVNkN+$gVAfE^d#+keSP1Jy?u3eSMNMreY~4M_5`4!#Oidqe-7L;{U3m55hw0|n zn&$rSGCwKszC0U}ZH8rMct!Ly!*&gBi{7}SWn}wl3X}2+ld^t9cL%s-y=Vg2O)k!d zb$$1GYSMoIh&8D%Y~93S4i)cBGt})k$VcP#i?0;C=-in;cQ!A4#aMb;l`Sv!seODQ z$_$cD4A57?<3oQ1sPQ-Iz24XFcGuEZPk0N~`kffM^M?W5Tx1_9mGX!DrLn(=-h|Af z`;bNd;zICqSr5ka0lD^zdDi2HpS{! zXSef($yCJ$-CI0I=jZ+2@`2FtdRkoG=GcVr2~_0@FT1TNof4P{^CNdh&Uh(+D7$}z zv~_9xvSc#MQF7_h>?O*56vlly{z*IqRoel?=@)oA@cOvYOY>QukxqE2`Z64*gzR2O zBhOLhWdzWfvui!ZS}n>12J7zPh_#9u!d$1IX5-YZ7OSO&s_U{nnJG%~;`~n~)x{ zdKpW(Hprb2w_ea7_D8e%zCY&qF=2_qrCl<2Uw1SZjSOKfM7um(QBkM;$6g0xx*+LBI@f$)xE!p<+3BsM_)#Zhed11{~l@$g7}hlo8dhUEz*Y{ZK^pv>q?7+ zE?6F-%@o=l@-AZg7D`Q~IiF|l@~YIU%*+s~)A|#Bf+8rJnR=>R!TJ}biR0dOJD#D`AT0YEas>&rkx)30XmJOfeE_UNJFPD3#On0 zPqe(#cPY*S^yk+YQwc$R~&~< z)o@8v9fY*RC$=Q|?cQ&y%e?e)u9w1{kOsUbVpqt%Q0opCqY5D8U=W~>jzI@vHt178 zFa-H4;Nf}^ctwx78q`7#fVrckJj-?Lnx6R7aoh^p`=*AVFGplmYQZ7 z*Hm6#smWJ!4V%MaG?kUT@M2k<#(vXvh$9QcbvRtwis7ZmeJSi4;i>US_KIB#<|Ms=US85MFei#ahH#~h-)oon2 zxeV-A##zy)thHjpNc8QUj%EO}@ycFFu`G+qZZV6rM@GmGIL~a{QT`YyVo7&JP< zAc6{r{4&+i6J3Qmc(>N20f=8)Yl>RC$-uP)L@cFMmMw6u!M;fKQybfOuu4EWd*fuF z`2M>-ZLfwt1QLmQDMd_KuK%sk!E}=X^UYMhX zu#xPq1pjCV$F*@V5V6aV+hcdxwi^~eSuYLfCMft?yW=`A#YJsc$w3X$6}1{N$!W?= zNhF{#Q7U^c0T9E;5hTH~d2J6eU&ArR3+Pu&E&j;vO}C;LD#UWP_j}ZZls980T;qu; zP6I0LP@cunu7x$SXlM;EKt~R$%h1Ho5@Ifoj#cp`%=8U6Z5TU{iY5WF7{TKw@gKX1 zSwJO6k+oFdT8;K{W9s70NCS33hw?=^Caj{ZE{Kc4&%vzm%&5g^Qv39$?_iA> z2qel{vyexIk2Y%8%LvQC*JYX1IYGcqeE@&o{RSiC|HH@mzK3!(jRhZ#^tpn3`&$I; z%)!bu3&E31U|T`e{1Lr11sGSGl?;r4OR$fBB(2eCu!rP<=aK#mEB%!dv*T}<@0Q{& z0eF!zD=ize{`vC$K6QkJrgn;vLBNi+#SqMIO%A<_XCQ3Z@)mP8t3}JSGc;5Q(xSF4 zlk+;7-&xP^1P`bNti&JPGZk2MdzIKx`w$+MZPTqrQ5LO#=X5ICsFcwKos&P?2NRVp zO8xl?Pd`E4na=%0pLRPPVRLwU=DdqsVqlAc;)jhV@iwfOQs@8ZFj(Z)3)S+O-h`Hp zK6|bdOq#=Q>=u3p)uvaY#59rjT=As=>8lyEB)^2UTEDv4h|QUjDm2_^Y1RK>QUAsN zPPENrR>Bf`hb)5nfk3BBDT0k_yO@3+jrJFEkW?-=za>2cgqO9Prz5AiO1_lN%d)O| zhN^*+YztZ=-No1yFl88RJ$f9#nvfMU>12uJCTrw1G*u7qGqFN(Y%_CL+ z+Kg8s3`A{MlE~JHi_r01MG1h>yO~6Ep$ET5Z@~`b@8uo02dn9fKbord^`fVkL|i$3uI* z7=>V^aU~WJ=>uW|gACibCvC*#sW7FG8ow~L03}KGtBQ!XSJnKsVz#>7$Knm=YbXgb$osuJvtmvO`%)?Rocj7zZDbK)wy3oLk zi!x76FKk=ovL@od_Im^Yq&y8XlKoD~v?Y@R1xp76slK2o=&MX7Djm&@ai z%Wn;V=kE4+XlFZm)8vVqs6FS z*ZQ1xaRBp8dmVHcL2%7#zWArVHB$u+IrIm|2)8G#U25x)qcJreKLt}^dy?yN_{+i~ zEDTaw<5(;8w$hjbcizvu^!fPSVQMOSjTHoY<{cwLYUUml3{&ef*qZ=?m(-F| zKIa>tkUN>Pr+L7M-h0M;6j3T~j3N!@ec=KU-4XEe;mHsDhRrUwLfd6(*~Sv{qi((* z2gPleZVGE&#!W@CUEes>XX=bgMv4*`%|Yn#1z_?rBJry4yiL)Y%3mEKJR+2Mi){mY z`XS6q`x|zQ?(g99p`be;t?xX#r%&qkyQ9F{$-AS!2H|`th#a~$k=l5v(q+iIks%)! zZub!F3qC&-ZOM^zxMsO(=4_fgDCkHaIyy|)*k01OeOPzo6BhS4IJ?`?Vcm)h<#THT965&eKMS&^?BWLM=9pFx;O_ue}qzbS!+3?%L`z_HXcz$ghgfZtkiW zG4!!GHvxpatKdEl(C0YupWf;O&_l>5TV@`pMLw4DJhcP-Au{bv0F#^+a0M3I!a;8}!3(Tc-Q`2A$Vv;4UL<7HF(G#y?AFj! zoja@=ocNyIc%ldHmOM}&y;$kql0~zPolmhr*f8F>Zd7~p`&~^PeFL(uU zKc{wMUltD7v(UD03xkB=Sx0`d+?ND5jI$4}{sUPPI5?tlx%b^8wU29l{t3=mx|QPo zRw|S^S8%6V(C=C1PK879(fxyhYH*LE&t|pdY_^9>n)G4bkKjk^W8EiFJ_ct~kxyd! z=W-6sLDB6K>cOgYyxe^BDTizA$3#=D#P35zE;M>Flr$gZOVCwVx6ki&6QF8JTcv%-- z(fq9O=;~rFY`BOo%MnAtAkGn*Il#AV8S_8yM4F_W5`2-ibaz@EV2r#&+q4pK>>jm! z=f=o7d;LE8tqs!lL-Ol@H7C~WiPc6M! z3K#z4V@tKAA4%sijK7ku8&BXcOe{7`O!w_A8gi6&tZ%GM02PJ!n5gI`4?&($(0b_) z=&e;F|7O)Nk0h%km8Ai>5K0MDo+J4OB!hH%&SoIv{>=%`mO+(T&5I-taop`xgEE2Z z5K82N*+9(nSr?0vn1Du5=pknH>IF!92V9YwH`KY_L7U<0=%MC8Eif0yKM^Ha2mrgu z2G=xG6HPLkz_H4Is>#rxRYT|s8KJy0`2-bF(Ti zC~K=qYcB#?(**E?n+PsP5+wx1*fe{3C^f7z4sjerPIsE~sGVWbJw(Xgp!l4dk#3k)*}^!$Q#o|S^B8Q2pozlXco0q zAN~+tf!RW9pDQSEwp^ z`;C%v8-b%cPH@se;yy1vjJ4g9q`Ru-F77J3VXK+|?h^Afgm0jIfdjbBRlgl4|1%N% zzsH8qL^OQh0q{Ntvu}Po;x9oyKZu3m`9sL}tC@Uo?MQ901RX(-8Kt%&3|bZlmg{~k zqMsFjvFwRX0%8HlnE0PMaTFYOMNwL`Xr8%b zThOdQoM-k2z5>%B>SdDJc`!yg89@m5?X#S5kn_9?F3;$tgWzcOi1=L?>*D#hc=+G?nz{3UxL`+ApaWSBh=KmbsM|I zYMy0Pb|CDmCAU@ZgORgES=0Vw<{0+1dUPB>uVao z5IX?&+;f2E8TN84VG=~KK^ne@>SRCh11{Ow6EH&JmyYp{mxcE_8^d$5dqNbI^-3Z` z0YS?##{QQ|&O`M|5B4jbB_5mulER?}DL8h;#mmdvfk*~#v=e)LCFGtN#DrBR}OwZb5pd`OF+3lB}Z z2E)nbOvPdF6jEg;z(PKtP_#XHwt;{+wj8Xv6lU-tUm{|=5Zc))MbG<8|lei1#{TwU`UOhs-HxS@?D$JgyfcP}wp$0~6vth{P#bYS;@Lpb0Ty^9t!h0SI*v-#OG2<$koL`f(c@XBD zp+cC-OJ=isk%~?)6O8AKm&C9ABQ9J^SJnjhi8`=PytO{0zv22$SrpyT^@y-r6E_@0 zRghbKYQD#!suqGP&wmx;fJ@675(h9!8XH#dTvIvjTsWu<*t5Qsi1wpW?JfiMXp(}d z0YDB#!{c6STVZYu ztq{h>S<0PdG5>!6R6wi0$0;%uI<#Cmx=pi3*1}tL>dQ`dNHCf@^X?}Ht<@68S}jr5 zYB9%68;obIWg$B@3QB}~7ia=SBHk7aBPR814vY*(HQp9ROLME}k8DsPc+BzUjYSxR zn!+HD`O>(>!82oc=olgHwPE1*6q8Bg@RwFq@I9VK-W#f>0`J6(Zu~cd8XI#6BnxK% zHB+M6-;SOE)xC(8@5_dvS}c2_;C)Z$lGu1?gEa4j>S7~o4eOHz@d#MLnE0e+Bf1mw zq0r5ElNWb@@G#yfGGxF$jY%@iWokq948~Jn5A(BV8Zpb7qH0HlTt~!TX}Ntu7JgN} z{XTn%Q8O_-CJ4uj0Z9*q;k0+Noxz<;K+cLj1R-z*(DiVuPa`Oa##Y`(t40`e?15eZ z-OZ^1^P>cZsDseABBe9=RhJ30_he7s5`?h=fGV?bcOVFuS4$R0cam8oY~4zhlWNj1AmZ$_?{Y)-ac`$Bhm2% zxec|vy#;r&z~H=YxtlT0lX$djpo@C{Z!8 zBW{zzS&9k|@GE9-8Yn8^p79 z1GnpNZ9OMG^SP%YkOPgvR0|+USsaAUuFLp{u>w*sRdxk}J$^{B5rnsnlJrC0{YvL> z^j(%$$@&hy+ZOpHS{b*#)t@cUbihMbC^8r-zT4_FQW7&x+{C$C7eOR&f*BW z>vv|gx{5RRbB;)0idl?qg5Oyu?SAZ%D~?{~h!RWL4Es2*kQKtF z{!A8A72@C4rvttPv$&l-!$g@^W5;`3k6@%%z(7Jjd=lKf!s% z$Rg8%=TuTyK@^(l!kyww;;PRlZ{r1gr;!6Zc|!My90Gw$Glpt<;ELX~rz)8hVgIge zmWO`nT~4g0o-vRQ*w_+H@(^1ZH1$2z-(1qsYBw-bzO^Sfe_j^7?bJZWO8*lZU7O%;$Vr$V~s$;-f$R$l)UT} zr=ai(J}!RX7stoafV(ya}Hl1yXV9#5U2!-kYN3Mm4F}#U&j)SMOLodr&TUcy24B% za&V}(^xF90Liwv|lfI6NBubOtV>vkZAuhK29gS3;!U#{5y?sm8qXIZ}6&V(Nmlqpq zV{kfM;uk* z1*g+NISZ9=)I|z0!cU4gO>l>P3y3qxenhPYzkuENI{6(S>_=4sALrVvs!`oD^(=3V zNR<_(weq6RV8Wl92RrkU;vK0_5Gz_=<;8ae_`f}x$v*E+tJ-vIInl2j!MTM(lC&gw zziLD%*uZ_)sZ06MlL-mcM_2#Q<*8PNtoE1Mm!HvQ`)y`1YHCKN^=H%w%RWneHziNl4S%T>Cz7dzE4PTQzQipc4@RhHOH`Yz- z8IG4swm4{tm}F#0)1p61G@SQ_Yo4lVz8-pC?k)g+N?>=E6lE8^+O3jpzC?2n1{+ir zOjimmpd4^nU{cvNVCJo2a4eemKxX24M>KjjCV`0GC@B;A!Jia|CX-9`n z52q)a{P&YX?>I`rq1PTkYCmCMf&%0ZRXBcjfWHt~n>L!xlj;?ISrZEvTZP=h=mHoY zSlKDk(eV`NXL#}#_zy@bPr`|!uwHAoWI^M0)nZ;W&r%ieZ-uqOTpYa|b z{S}6)$mzVKIkt~ktBi!>twcLysv}>o0sgvs$LE9y&t2?5d4ecMZ7Js2e&raf2zPY9KTy6BEr;s=>lK1k^>qwN(gO^J=e z5$I>s79E7Inonr69pEOMWNUrnD%^>28buzFbbXoNeE3YkZH(b z25ZWo;2q|;K5avSY0B(00#dJqNhl7P3Om-|$s4owInP>$qx*EwZuL+HVJckUmJ_s^ zYJ_~mJR}mh0?D}rP=S)kQnJD`mmDDC4|^YGpA`CEQjYEOd(7+odhz&tU!TwQ^#Wra zzk&kurziiyoY(en;zym(gVf}lhXdHWs6rQWCw?v;pCBNgb>|{E-<#3x}ES7MG z_GcmfIX)(byd~Q0Ey+R*tvZ3Kub_5-8_FvAP!6wUUHiI5Ot+3cH#R>>Sc1q0)j=Wr zfpYhN8>*brh~17b^A#Eob`t(&y$Sy^I{TebO-AE{cc^zTy>7muN8~yjk&T!@`?H9i znhUaEj3nQ{HdaYYqB%~QN|^;~jp=2&sf@B2`7B{_7&?HQAJ3bD>%mwgu<>Z+NT(b&mbg5*KVqVRY1=)UNv%%LG zlZcXPI0*=SW0JYY_$4}^of(Pvn#W28lr%q>AcH0ngWLdv8QMIF4N0f2qXDcs=eC?V z_0lw{Exq4cEj-WsJ*I}i`a_DNO-AV=-dx0F*3O_Dddsv-R^js}|L58BFaPx7F1w~;XjWKXsE(o>pCYWlv@0`yX?4;?VT75(C77Q zazR-&>uhKMe^mGStm=8YtSR}kiox>kBdQaWm-XF8Rmo*7+;+W;b zX*}uDo)y z<^U2f$1MRh8lRv>w{*q~8{-|n6P#yog*_}WgQGhAEgjKpYFty*5w9%pgcn6&(R7~o zu+kHc4Qt$OtsUGyhfVwlT7}_I0NUw+j?jV{ODp9i)XC+_DbVQ*z+n;9usOjvI(zo0 zp+Ec~yS0`x>}@RcRAO>DwngZN^;UZDP6PHM+rPb=4d;h$2cY-=3Y%D50fpG-6WZosD0g=CKheDXzU*I6CE5+XKCaxM!W$P>oLT) zsQ9;CylW=p>zJ~{=#uRdD{+hIKIjuqAdJ7$qY2RL(jO$8;a49#%o=4d!>dk)h{Q-+ z8Is{F8OmW0%~jm#5~l1V?g`pwgAS;cO0ipau9lP@F8>tHDE5$Wnh37254YNCINK% zh3A7#U;A@Ks;Q?Eo;`)Ni-5Clr~95Q4h|niw~qngV`qy(%X+O5Pd8t&MMnpNccDp} zl|0ejj-8wmq$HiG2Yt8h6E8GvbBc#yjgv`QTgu^t<{gAU;HladcBB9n4 zy5p`S?jL9l$)5%li@JJX^+PDIx01Az9MteEFuS)i{DbylAW@N>6Edx4L(rM39%HXX zkCQ45-3F!^0j0YSNIj^_6u7K=LC=18aCmC#sD8ly?K|UklUq(`Pd3g~`3T+3s|7Nb z)3u&s&`3~FhUo*KRFUt#!WcFxLSfJmGNvMKY$!ru1@B4R_`{)4ceGDZ>pqnF?m=co zGz^FMyZA-?Bv0q()p>EAov#U|Xwy)8;dSG*1(2fBpp@`63`vjXt)bOts z*t_P8z&B4xmTlxl4GzyG+Vs(!5K5;`_{wmCW{Pdb?9nV5D^JN%ka!EJB4RX5GpD7s zY2>_jXkT8)c1&&zimU78pij;N4*#Tiw4caRHY92GJ~z%82`1}A=Zx{06XeW9k3z9~ zDEWHo)U7kN7riEf|C5zKcD@ZsR%i2nXMLRB{lC0K2UbYMknLHeGdT`0wya4Hr{9Rq zx}o^3Rt}x68jDxumzQa0@f;pVErI4HE;x;6Bb%jNFqzGmL2$MOTWvMh0W}-VJj6YV znAt^idf8aSthI=Od_eX=KY!AQn<+C5p#_;3tER{itg+_Wu{h$)U^&|2a!;yYmN&*# z1z~PSUa`DE8D|oVP+_Ky^0fHPt|Q0u&Ps&dyLaZ*yLVn2SX=k9c?-yuPBk$}`a`wa z(0F=GJ*Hk1c9H-~InA{*ayl8w$>|!mMYeFa16H9QKe!JJoL3CrN_=v{ZeK@fUqndK zSZFl`xxls1ibfVm%M>!`qe2Qa@~Iw=JD41;)fzCUp%nUthU2kTsLpZ;3((2`3ePcQ zU}y!mJWv`G)L-U(aT1-Z_n7n^L)jy51uYUUHK$IJ^AU<9&Bq6{N63A7z^Zx)d0!WJ zqRu1Ag*JL%p_d_*tsioYCyk?jqaS%sC-Mh-aA|r#0T|%cx9w90W?4ucu53WjqsO*N ziGQFuN63?v;bbANNHUXVzjUv{dp6h#?;8P`Vk^avzZpen2z?PIA>prIe4jo?hNbTJb?Th@|VpSI7jZH=2uS zLoe%9a0|53bO})rf#+asApoYYwTSX$65u(>UbK09qvGMyu4bfXz$tjNR~{e#nSY)P zoV{r4I~th$dS& z-MilC)-VlbpY7FHvF7Yo*rdv6&W5LJ1el3?&EG0^=uu@QF2{bqXYmrIEWAepNuY;l z75NgbgbL6bI@ZHoVbsk+_aE<`h^){{rMETv0;8k)S!XqK^+fLsb)wn^)T9Sc6Luyn z!v0N?G&Ttr=Ar7vQ(^Qzk{m&C;*=~!s%E4D|2jjR(_|ck|Lg=`tLwjYp5ciR8q?0k zA?3NS94CWRJNfkd zW_WrTh#qyA_R(~cDiEV$W_H?FLUsn$08SGPx$j#fJm{9%TWZ$69Z(%d&hFQ+ z7xtZP;<_L|Ft7dYuCVkxRNtWwYA?4T!fmY=am@Ut^RLV>tIF@k$G@wsL&q`DB)0c^ zfBib{QOBXzMt8%gI1MnP_rwb{G7YoYlLbaP0nvDh<99QM$I*Hz>}QkbDPWDlis7)i z8kowj`!HjLN&E3K&x=(fp~!#i$?SQQ9+LWNT$%Zh&@$a4)^N%eI-pWnBrPGK3 zNp(cnWgWa|SLMt+AZZF5f0&lz0pbPKDe^S{v7=ZvJ4AlHmRwYe_GBMQb68=T znOjss8?S&Sj%Z;YN2~8KM7r=c(JdzsK}I4@)7R+kfzFzA_loWN@RR%oUS;?^Pu10~ zjK7Vx=ssG&KK+u6OsN2Y@e2jU?t1IRM&iZ7c0-gUEkR>Ol^2MaP599Gj(Bj9Q}>)v zGBYMT?e^4ey&=?hp+9pFveqjQ71qufu5c4;;U+`jM&UKxbL9?0J#RLOa4ZjMCpsY< zl+Zjw+x$?mg?NfdXE*80v{5Xm(EROa@i;(h#*sf71~t5~_7F+sCebjDbLX*>Bs!|pd4=XS zoAH#@X+?~u6|lL{7g%t6Adb*xh(Nf=+K7FV?-_M>0k;RWgidD&{>8 zLri2%86OkXmlAg(hW*SiQ9bzyUdlU(@rA@j`sMtIO24D*{zf{wO&~5|O1Dz?k*Hym zQeFXAyh{*#XIrw$y9CYxrIBzuLZ+Mq$GW~02ftleLr)gkE=3O0Lv`G->02(;B8G*) zWeR!GgkH`t5^l7jFrt~ZjBz)VQ3O*5sE(WhL!AN=M!OeFSmP^+y~Fk8D+-@zM)xe= zW$5y|MS8l!^a^}oqWA-Ju2BveOh_vNkWJ1$-y|iBGR8<2?MD<`5i^a%O^>3u?NH_6PK_#wBb;Up{nqTHBKu+%CvI4TX8~A z^`m^uyFoI#K{Z9s4u)k{=8`@NUd_F{p$)vz`w$IqC|YG7pjTZ$raufP+y6)TvBP$PnMLj%E<|Iem)Ak;gy0pxC7)ndJMmHfYwbu zUSXCXk;>eJ8B=4+VQi6H&(S_KIX=E5ze&AYfKf+-AY5O1&HzwibT|d{BLnkj5)ND~ zmD9TjPbMBe_SjE-V4oA7)3B0bpc40+brX0_P5?9+AaG;wl`%gG0(5m6tgWHs7P=M{ zE09mHxW3jOT#1cFwrW3VNt<^BfV?fCPsefc1DlC$g{EuEKrbhMj$aNDFbGf)n%kCa zOVn|y8g&yLGbE4U)1w?#3aQ(DV1l~#&@ed%iVz|Cz2?E{s8}TYB2Z9h&m-x%|> zjoLl|DdC-uLp(%R$SaeXW91A&BnIui9r1ErimnF%fHbD|;AAoau4 ztXn(FhVOo&?1z`KiJp-9>Xlv&FL68X z8tvDDQKB+XzKMVE{p?1 zE7dLZjbGq`>uc4DO3tL)3R*o&-~seH0r=@zeVO2BFhdhwu;+v5GM$&?Mvis(fnv+= z$T+xNu(EZn&B2r24toj$MXYK=5RMJ3uajH98v_lwskA3t%FeDUpUyXzHr8jU6f&*7 zoy^<&J(;a=E}__N1m3Gu@nDI|_gwY8t{b<`QMMvF!F_3(Q@m8^mJ&PU!wq=nK=LyM z-ti&uz6YAPD{zmfj^&EWxAmZsTsJq5oC?3*Y~odd2}1j7_6KnT1)@sOy=Od-III9A zX;MuA@skNo8@f{^?3YtW-)~QMVz`b4J0dLbG*EmJ-TRq*0{}`7q#^``wBO+2`0_gqqa&hh%Jpl^7NlnXFlIMctjaXrmf=CnE66yc_Oz=in(^%@i1~&3X^bQ+KiY^F-US5YpXk`hE+Mq zVp?jW4(FkSa*Ajs${vdpE_^~2w_d%E@6^#1#*mUF>9|UMN0-_uPu(h$EV{;ET@Dk3 z;VNX&MocrP8|~p%$DZiQl?lX1*{l9VS3v6v`_4 zdweG`C6u}rr3$V-(-#!@D~$OBuME8?t)Se|1&5qCT1MG2P7#)mmQ|7Bs|M~nqMiQ= zgh6x-pf-*uig3JA1&G7M$K1!GD%r%Zt7x-5x(0p&b6qU2JjYj2=ygQJl3g0rz2y}E z2L5>lgFJ%Q_z$mJRZvFSUInra(Mk=|EYg)u6EV`2&+KJbjZ`a`%y%ywSknDs6mrBr zFl}i9)AEb@{pZoT$Tw<9kJ#<`7xnwkBfydIFZB1HN9D4JuoF4@#fL)PTD#Nf#A_tWq*`1>RrGaM;`9NwpSw8G?%EE!PB zZq9ah-;qm=zaonN74oEv{IGc7C~)mlpvQxWtH2cv{fDO%&E8(1cDc7nr%u^u7QdMJ z=8~FHo>-kG@?GVjYY0%nhZ=FtV40It$FLxUn&Sj*%E+PEmBA>~JM-EK)GUA}L?18rbF8Z8b!vf@v{p2?ZdLayW#btFKm>K`>I{0okW3 zH_=gxqtcO)duLRp?ZeZ!uN3M_dmd9hAXvwJ=LnY1en~S?O;J{GgE?taGv=ET%4Aw- znW|CPC&L#U2oIt67z&~4D9OqSsUaQ;aN(IxK_=-4fFZB33R1a+kYK5p7<$m1UujGX z%p>IeUEpCA8l6kMYOI6ulz!D(oLN$Zd8K$2?gH908K`2eP}vL{qAYnt`WAI|83?Fc z%;D51&{@z>0Fh&#o<}G3+kJPq&@s^`T=DYj?DI@RjrQv-H@gPs%4QgV~Qckiyuq%&7IpZ)&2uhj2)p;okp#B z!##08IEO{((KYPb!ehoLjic*WKPH^twlru-{|kBFAQzR;8Y8%5QKHXIp7jBVY|&_n z)?ox<#qp4Lal#?R2R10ZuXBF!?gZ9bOU5Fz5`2H?V4=Q2Q^B?g1VwyPQQO!i)g7^V zPsiT7?Z=Qnj>d>)CZ;ZQE993%?MCmoQe=m>=zXdmc%n0PhJzuydu!TkNG?~R(490J2_i4?hZGv1adawrNjUNtG0Qe@49`iA5|E%GMCnp(x*vH@NZ#&^2 z8kx04<2W`F6fmtD)&>wuCrBDa-YUpM8)&u7sT&8(o@IVSwa1hKD{vtX)558z%xTxY40qG>d_ODEFmK%D5kEs2N;WsP9_qWS5uvNb&$9&z`7HtS ziLZWuVf1h*4`evlgFHvZBc(PfDO*NUy>5dRiVP|Pk(0ax(8n^*`s7wu_28J2Ag>Ia zJmd+XTp!vzH<|P64QpKe!mWEby?T z&)ZQ_Jboo>7}dVxe{DmEG`#rnOax@;<$JbKRoZrE&e=DAJWW)B1&Rt_B@;X^pe3;R zmQ_?~_ak-418a}voz#f3)rsT`JzY2p6Xjf@*u)Cxxv;*QHSQ>@H7cC4ZVn?oMYlfl z(QY`UX+sftaP&p*=vg^I@u=+RG2~yb60bGXwetOq>A0Dh@{Y>*{s@jnvl=qR!2>Dup56F)(ddH$X zt@3?Mn>pp1^Pk&La|T@VAk1+Y$g8Z+fne5?*3HS;#mEWCML^LSbh@q4uTXn&H^b!1 zp@QI0m1eav#*enMGE=Zzl$doB(FmXL3-aXI3hA=^LfY6D|U|G z#6aDcqeS1kz}e|-WTPhy)1hH^zKq;#UM;vs;;#Mi)uCp5%|>)#>)xCf2F@(Nb7_L4@Uy ze_-FIq~jz)($f}Ag@=@R}T)Rr;QJNa-gM;n*p~y zngXotBPXxbE`46|&4CqDZ!wy-E2yHWij6dl0iT2+^$*tLCJV)nG*9q>^C00Rj{5k4?@i&w&5~IqM_ccfUwbH1=_^!m#98%D?-GoG1v5L+@VmWa1_ZcZ1{5uvFT!RK zA5DKRi+I~ecV@HoHvHuGh&2In4|s4=wnen!&^Fy11vhu;WWmS3lg4v&+Xgx|N=ih` z0SR`_M4VuRkDPb-o%(52QDw(KXxz-sz>-R8re=e*y2j;Z+5jetv#lo}Mi{K)EoH zcPIs(m%~$W4OdWXz>yA%dYPv+Mft9;iaOa`*6eeKS-P;lQ4RDW+62BoKfehV!(jgQ zZ1FfaKRr9WOvD9Mrrw;2TfC*jV5f<=!JGQ{kF)ce;q+9z;daAvStQ%4W}jAUC4jQe zDkq%cMSfe8`jH&{zJpgvwS8VbhBEWFa#2gT*1n4)tl>S@@Tfk=Oa#A1*HIlWH&MWi z!Rr_J8e<7Vfze~=>T8~m$6pN4*>C>r`O`N~&*$~YNl@d1#rXoS&!EI3nBu1(1FMKY z^NH}jU`g(1vrDUFo5u1Jef0@u5dY$o-=BF4k;a#RzWJ+l5~r&&uDFc712F^^gUbMo z;@5Ps5H$Pzid823R$rq)3vk8-be?RL3*5wbp~p$rywB-9&N_W@MYpS_rnNf2&Nd@v z9zxSI&IImT>4^iM`Z^bp?{`G1jx&N9I(l@I|2_&CY^xG?;&Y-{LlqyePy$YD^KFzR z+urQXL^(RK(12X`Jo`)gk;ePqXe9xVn8q5$9RC)0-v5U>m}F&KRA16T6jHSYH;moo zGphe#Z#(Cwtp}avwOTP+R|l=k{{LvS!5{5|Ue`yffMG^cS;$)0#(+!AbFtARMI}oX zK;MVMKyiJUvqEkrjF%X41=VhD$9;-dWE5Xnb8iS#4Zo}CQ{gdz@LF}Wvf(t9&)v-7 zWSSzX)-c#u1r=_jjk|C2kF9aUq#4taz6(&z?lfLaO<1#bh$fwylHGj0Sr#*i@%cl#Q;{l%jRkk3a?&b)xUmKuskqlBcX>cpLG?;L_S;Y^Uk zaO86ABuLn23K6sjQ2ZbHmB1~!RU92XWk%E0P=5#S3in1`|!5DhyM8DU?(QX$lBM<5ejRP(n z_v!(4iiD_30A7D` zCYL=5@GHc(jnE&Iwi3|FcM77f9*VSVr2OqD{tY8DU6S4Ccp+V{Bsw94okePp#4f7J z4f;ILWM%4kT_ls00}~qG#4&MFMI}9Lhr(i1l2c3w9!Q zDuya&6OZP)xsyqIpxnnu{8pjE;CPyw{zO>Sd+nE_Esi|b@CACoAq-wzN2wPys3wqQ zQc|Jk4AAX&F%oe`1ctr@$lAQ77i_-5!q|Pzv%t0Qp`2zk*hxW zrfNl;cWE4l;Rza~j}={xI@{&V;FE$>j}NA_CQ=hOnb6*dVMeS_AEMKb>G@YxBOVhO zHu@^!UprnOIl2c!@6;PAqh_a~-yH483r#lISj>j^)0UG!L&9!6NY#Q{>$|FTI@V&r z(6~DwqN1TCYe0*@yi&$82?{r1$^XZLp4GLo@L`M| zm2%EWe)oNIT17JL44Y;mlhzik6@k@ZB;4G{fX!UDzI&U?N15OhIL<_e2x$g}sD!n` zK>4K&Ag1DAuMrb64;YCHcQkuhqFl=<3xSk zh_Gg|q2r02K^%mxC_H^-A5wgDmu+!gK~LD`mIv@mGhV!7uxCo+pp#!$CI(jQq`{_e zR5b2u4u|TiXZi^Zd8@2WFtWX_*Cd9wG0vsD>eyB`{ChJ%Vl!T1us7#@ zjHTY>p~qLAmXz_4y7Yw0v4qNiQa^o4LZe5rqo-LnJo@q+Hm=9yymitNH&5D0t$)k= zH#g*qkxXX&$A%tXx+<(2_sB*vjNoYy#dBA11#rX_keMde*;5yS*0;76GMpr8ZEZHWM-KmM(l3rl zi&BU|dVEZ~%+aM3vXlv@h|Kq*!LlFn%@d8VSTIpaidmy_7ns`>1s&6D%J%GPdc`JA zczAfVz`!w-o;+w67h+Nxm~0q-pdo%G>?z@Fo-e{YFealn3ZS6)JkoW|$um_=n5+6O?0@c-m`o&O%Q|X{4Za+6?IZ zfGPshN~}~A{kF3B&I|{d3K~2K@w%9eMzP-j)hPh8sdQ$}A>a*;r}1(emSO2~F9O4K+b6)W%vy%Tlz*YgjpMi?!;Sv|tG3=$cqf)RZ8LU2 za~oNkZ6{`<^VCm+Fw^0V#8yu|8p~)Y{(utp*XY*2-@$8G0dg|`>x(xYg`8xca|Hw< zD(|voIG6|(t`x4k>Z-_ZN-rd<(zfHlO%ZL|##H~)j9sd(X0|S!c1CG~OkDg!3Zekj zQRBd}o71joA__kZO`on@RBffV^-b;3-|M^)_K6h*0ERG{U?Uc(;0TUI8q^14H906>RpQ4={9K7g zl{}5o?NxN{&))`%$LDCY@HITlF)(#?cV0e5n+ARvoQmJcBBIK-b%D{&>x;aq@=cw_ zYs^R~excVHvc*Jg{n_ATIgf#j8=)b_PxyKh6_-hND*j>ZL*Dw{@Mh=*Xan&`nTGtc z=k;u`y$$Bk$?yNQ80vC=bIZ+#CyPL;;;O)3D|!Fr_s{o--F2b13cO0WkQA% zUUX6BDIh3MTqk96k)$x}(7Q@jt2py0b{b}0H6Q;SJ_Z~JOuCBQ9gf8spzUW0{~mre z9`D7!DmnMw3!c+8M>c^JxM6lcJ(3^UPgLG#*H z2+P{1aA+MVyiBEky2V)S$a1Sm^Z5Mf0inuPU9{8PXhZlhWlwQax9NO_c!Yv6v^Y*Y zMa+s8(s3uw)0OFoz&u?XP+mO~)r`IXW`G93-iLmxl*Cjv9Gk!S0@w#UNO-tekwO{k z8VLV|+$8#z;pf5!DcEg)kT_9xTa^J-4S9|WXO08qEP|5M!Kta7RyqUmdY<;oL^V^> zh3Vn2uApJ)?GV;w*$&?Jfg{zH#3k?d$X)65nK~}Kj-~b^36Y6)KuOL@;+dj(2K>{) z03zPup^Ft9Ba=jZz!ohuM4gYydbLtYrU$uUQ$zn#@b;~{Ux$cd5%pNynBhyW}dzR*d~zR z8w|B^m&Pp{VGNmVvpBihls~ubRSt_rgl*~OxXA(vT1chHa+G10I!q$D-?*1R5OyLB zP#~fgHXoXEn=Ux{nMUQMP485a{7|aAPOvo+l?y5lcW8}_f`lA7BWP7+VW$0nOz8{!z#+oRcBw(=;xE(Ym?S-FY}3cOI- zlvyPWuQVyMV47$~1B$#w9~R0UVTtw#1ZF*8a(LaXGW3HhuHfTi*1fgVkzMLBO4_g% z9K0&x?VFLC0AO=WA){7;4yOLjh5lYqTx3tB7%G5bN@tZL<-AfL*bg%ozgPnFKMMd$6i5#0M|3HhJ*Q`Y zRr#HVRONN@d#uS)yzxSu*WGBF+{P4^aERzce~`E}b9qFyxJ{@#={&3xv+cWc8w$=(uN_Xz!5r^rdnnHcY zEQruNXXGgMF7jIdEa)DfT<*<@ilyUpQWfzO7YgKce1>8FRXhpeBNE2Nr00a!&RZ3q zllBx^Y?@t@7_C$?Er>Sv^y|ksO;8B0>x48twwlC6;t622v1W^tp$0%ebx|M4q4G1J zEn_D)byOx1NLqhIKQlM!Y$kWiK?*DD0HuL9uPO=uP>bPx!A^Kb^p_i!pNu~_V#J46 zoMH_xPtUx7X4zBe!8{`og(RsT4U!E`M}&RWdaE}%9$+`IBU_c9Gh~{M@L2Hd3;xS44P-`z4&dm@Yi8k9r6Lnz9tN5%^y|y)jP4rV zU$>nzp13(CI{YC2VVsi;ZR)ImXcod63l{pIey-Ej3AGox>FXSBqm!ABkd(o7V~+7; zx6$$OFA8A0ssTLgEpH+;r~9E2U0JErsVae_nd`78VVw2ZD~^w8o9Y4U_p?ZIWdDoZ zi}5mpaNJIUrz8{2wsHD7^{_KtmeKiI&5KXbPh9#nYmqbMV5zg=@ohjS7_-rM^4QtQ ztOpxCn!x__!it12&pViaTB8I$?04D}oNr#Ub5#J;4|RmT9+x+qjK`1BoeLWP>_~R2 z+%?Rtt*<<9nvGBplM~@rXA*;=5Voa^kbDk`HZ=BV@e!Ng;n_^<`~Z{Rb}h)bC9R_2 zV8VmK&XTV?BOlq*zD9Gfs5wQxP@b(#ovX<}tZ?bKMC?eZ*Ie?AebJY{Qg1;E^!G-y zm}DsIo@fQ*&y|?Rnyj+=aKXV;-1AQ2US26BCWU0kMqB4rXCWjdWXd|n|7d4B`x+!6 zmKH1lDmdDOY0?j%5~2#B&Qqzh3){k^`Qnu*IgFX}V8qJSKCTp~WecM?PnbA2Y~1xa zeML2XPsK{D`$9G<)+({Mt?%kVQ6_P!?kH)9d$Y(5dWS@(3pSP}Eh+98#n|8_BcD)l zFkO2lvq$mUK7RQ)fsmBa>eGSi2@ zCr{{i?06{e#ZQjEfZysH%E~g&bgINew`0g^!g43iK=BLyS5xtS!$br#U@o!W? z)-&R=Hy<53tLZ&%QyK30j3!p5T9yc-w~-SDgjIO^zNkS?WLaFu#@SOw5fcYmqn7|5 z6zWVAc(Q$!^+l$GFIJi3>aR|T)M@^}7+2vzTXS$tUWD4DRGdvg4*(5*!$vAkwgk_5 zd@Am75Mf1Q5uB^n`jo6Q;hh)f8OG-h!k(g8e^Iu=V-ihE+zRuoOupC-usOWeX&+F% z%GZJ4fR+M570EnNn&5?`Y^d>1KYoqs3cxPJlnp(gjXiIwV9(k;*1n+52amO1$5n;F zF(`YGa}QK8S`l82C^L|rPuzAomW|3Q^eT;#OeI5$(VU1-P3$sMxo=>GeWTb=bgvAI zjJ-e{TxJ+u0j;JpM`xa>1YF0Csr(Wq9mxOQ3d5Ie)2XKRzA}Atm_4Mv_aFsq4OGt1 z@*GGq);9F!-mn{z4U?05nEz|xiG)*fTT>}CXjC5zjF}aN4WKo)15R+jRbZM)sJaSG zcc@0yR}aH79#K@rBNeLgNXKYA!f^3NfT;jY9C03kBaR_|MBzz~Ru?H>P=I8NmdIDT zE&n1bb7W#FAL%g4M>gd0kqxta#8D@Yl#92G0ZjGkSipDz)yGAV0|vG^XPZeSx)!t5 zqCXsZ=Ky5PM-jAk%F!y*k;hd4xTN8+ zFwRtTlZm@bTxU{8XTLxSIy)7&@cYLRM$)^1D}O#aUIg#t{O$4L@u_%2^m6og2GsuO zyjtM-J)%gAkWkDXonCIlGeuIP3jnzqL`nR2QdW6^^mjBop|vYHend(XxdsUlBQJ)~ z=y&S#zrJ`=fA!+&b3FWikI&9e&reUq3wk|2zk!Mt!;mr;!wc-j>Fkdo=Q0j`3>8ts z|4zm0|F5#EZEo90(%DX`ve}CjCzdzPa#>q21;&UefB`^L zI+6eV`stoGfRJ7X?!8g7%U(4WeG{wK-P@IMgQsq7@QJ_E``$u$#_wy27}I^LDZH>DWt9?GsqB+hu_L=$f0{?4k{IHDNMjEI}_ z3C5zMYUoE+$wpFb+LOXQ=~jnB29a~MOtW+p?vfQPj+it!bfh zd2W2Lnu%LqTpnR&EA!Bo8Y{<3saX!pEK-;a8F9n9rm@`Dhuo=aqhszWfIJ zv8lCV4+wLGIGE+1ZplO2Q1AR+vbe`IWLeX`tZs{Sk>4V-R^Dd6aq4z&a>qOfw6k~) zl|}PIwaPZ}l@`YC%EiSpvd)x1Q?1Z*_KKxT?QUt2S7j72F^d)FkvPAf?DzW#knbn- z098P$zd8|%Z|9uU3%cT)n{Ow74V3t|;&}e^ApV-V1dtMrJUZV(xD6ygUrJ<>+~d0Q zrn`-L#ue^y|M!L+ySxf0(KP_Wqg_Tlgt$kviKoxyb^NAtX^EdcNBp=(^6XH=yoROJhmmdPpJ*M(*DP!}Y;1zADVyUFv^2;*f z!kaoP8`xz~_`5FbS;kHwmw5-xl_cDNPZTlVlelsY$FP0bZ4vlbA`kA?;GvRQp>EwJ zwYv7gT-I8Rf*osZvm~ka)aKXungnR1LgK*mt8BA@<3NMV?kgm}yQ^w=l-*I|O`Em5 z=1QX$st4?wAMxiMZTb5oklZb#l&hK7F~_bi36I zSUH()At>L!N9O~jWe_7l~ z&X@tFh(@;4J6$8m&9iQBhH1;-x0f&8vCF*ne!K(YUEE0y$9B0CmGNqtZT8tiLjul~ z9`hddw<1Bh9t1c&9QLLrj=`r~5wSxbLS$BwzOs4XJxoV;1<~iqZB@x{i2hadTG=>~ zE8ZHZfVDijTxSIw>S?VfVVEOXG5tIo9!eYoIF}_MDaqfRlAXlC0 z$%tb~aG*{zkw4??3nwiq)LNmtiMvnh{zR>9D-sD*1b&BeK~L%v!@yQ*~Pz;VEnNhk8v(D_?p1hK;y;Q z2s?bP;7dOoz;ZS1^QSQQemyaDCa(+P&?HjypJdsJM5j+Ra!m_y@)ENlXduN$Gd1nl@X@uqK z7pH-G7L30x$HDyBAIWSw}^5VS`z^!8XWR5Pa1bA zF%@fdrM8jIv>;2zt{u%{qxl{Pn)EZU9eLDTG`>*GKIy+BDK5;CX`7p7|0LJ2|`Y~J2Tfp6|Ny$*C`Mte3- zMq>1MM{nH`{Yc(_P#;WE_-hdlcqfZE;OW`*{6jdoP}ig*@czYD!FBb_N@RiO$Mm7A z{IAr5`l$BmMqMZ6{E`O$9rgQNatZH3cC|F!=XCI`%HYuwkci{cCx0E1hWf^X1DB+v9PkzM3o-RqXU!`Ghao^BhcOo@~!4I@< z?Q$mWcQeEXk{h}){5+PeeN3-ms!j}9I!d1g3m5hVVUy`~5|ov3h>7+0NNIa#IueK1 z$)05e5^3lcv&N6~gXbNQW%LoInUBe}!lpgC#)%BIk&CWKq+-D28MYrIb0oR_3Ed)r zx%(QsJW=aCbk=I~Q38P0YVn}1)zvbJaRU;zDZirfk4x7mi(KStU%-}v=n7NasVK$O)h7@i(0vBe$4ER2nKR%5D z0M%~g6I5Hu1PlxY6PI?%>ua=IWPRiQy<;4}C4?%;!hL;jDcqwDH=03%OMiB(=6&AuD6v(-SqM znAj|H{l-KN0_0Uz#uh=CzjBs+dH`i13QCa& zaaxj3rSwWHq3qgbtfIYpoV=+9%Yj~2PAfiPPVj?;EuLCB18CRog2U5M>4{{A!#SSK zZx2S~J=bpcUL_9f`Sfe})U=Cj`w5gQI|hG}wk_$)g7EB#k`KJP3w2nMu%SK6{CHrlN*^qpdZ zep?DcKZ_}Xo0%EbYx}jFtGfx<*8QX!b&VD)-)|R&i>!m8Dc2B5t zF3CLp;Qt|9M)z6sj3oYNm`1F5fCNX?B}pPuC=OE**nmHN%Z)qKLjFc=W%MfW1DPuI zw%;Re-6Phw7Se>H**dhxP-dY(MbK-L_UHkq&~BuW0ZR3AseVDO(a&JD{gUPLx8h;s z9h&K-!HRW`UH(-Wy#n-_UX@Nn{hqUt(gk8s$M}0tr+-jP zjfS0Q#HwzR(dcKKj_ye*x~lVA8sH+^G>FUlS+`+9b*L?_u6{1fA*tKKd`C~n!KJ@- zbx?5Wt@<>3c!Tnjsxq75eoMNN9r0lJhozfowau|k+08o-$wB# z9>D^mw}^o1^aH;T3PR!)(B-_e>IaFM)BXv-P+906;YIC}s8|GVCwiXcw-bg9s~(xN#WDp2EtnX8?{!(`+)?SQ}KqDr1Jh7CJz_SX?gSG5#XXYw7Ke|Lsc{gQnrPC2!Vmtrwu%Bmdb4vrNLD z;5#CYUfOAnO4uAvBZTcuGNHhS=9jc)eJYx`zRya|U-jr_kzm291M5 z)ZH2SfJ~!#(uT+22=jw?69JJX73{@a&QRadssouwm+<0gcQOVb*myU+-PJ7EPGo|f zyAq5}m0V0}Mw3D4Z;QFybjYyL$SLL~EoB5Bht3Tej`VG@eqcLit`<8*V@*W8ctKN_ zq|`WUIwn|DS&EAqG111J?LOkG;~efZ+a~sbo3Vyq0r0)W9yLzfH(7fW+O=74n8 zMVW1MhNvzaA ziJU!;JM$WhWdzfuyEGa2_>uKJpBB}jojx07=2})3ckxc~1`z8O_~IBLRNmx!Gw(9j z+6zyYvfF|FZ7c{8dmoq@_-z-wE|V*dWwrGQ(v!*@Bzi8C>w%;c34^&yN=7dtqLLVC zz>w&hNyQotavj&4)uE;$b0(cL_CV%iXi%#-$rrUA@_ELthFZ@D%A|d^Ub=2pk@Ob+ zEAm$A7tk`2B9b#VbT}zU1NoAO&kN0=wCA;YEz?KJgXLD`i7@b(T{Eo}b?zfu zcQLYD>J<*>pdEmE#(#N(F<|LhczqSD?;-94fbZjpN_57)@^2@@NG%xF*q;Q>!F&@(h3X&9T&O-# zLKB*eNEMP{BtDzNR>VX{I?#Gk?UTjU{#NeiTkrR;OQoYshhf^h07-jOu#%ztbc-a0_FPP{8;`Z4`vg~5K8#o%)tXx@{) z@!^*`+j1uw>@lZ9;I-k}#z}!k9skaSf9F^K&gJqLd1(w7&04dfe`q?(+Extb*q4ExYJDe3?2r3T|@Ie1rL-jUFp{ z(UnjRZ=roFlR+4%=a>AF;R7*zdNUbG|S0jY&dS2JSw9Fk~m^!^LzI609 zG5UVpU%l3|ZWX!DYSjub6i1J;t0+rImR+YHK}`ET_B6gjt1(0&v1H!!)S9ziK*lyD z`o9O~f!K4sdT<3`luka3y7p04Jo{2zWAke(_M9q6p!ez>we*wJwessFk2H{^3GaZa zAJa`dcM?e?=fVQmMw@b?WAPwUB&E_oZV(~ZnWEV1ku7)5ea9o;$U6%eQT1d$gUjaljlq{afBjG6J0q(tpNch`akoMMBuA zb0k0+Km9T(sp#VqpB7ej1+1|aI2{F-8ejLM_UE~psf*!zQEZY25>Z1#%84U+^m#jW zSKUUMHs9)uWPXu@e-(Apw68Q!Eo?%h@}>Oula#dgwLq#)CaO0d{d>x9FL|_iO?&bF zW+itVgLCfnB9|e-={v4X0KH&V`(>skgciMzXf>P5;eM*HTQHOoqt3OoF5~WN`fwE- z4sp-qwC$giKr-p}E*$8d2dt)_>*A;B!pOlwcDj#!Z9mR=S@nC(JNN!*2S$&dgoWPF z5+5iA_EhrN|61K+A48A}I*DtBUJfK}5BGsLA0=Cjl8vVyXQBhTCE8>@5D41gjxr^P zHw_?EJ`s>4v5gtazj;__GnbNvPohNE8GUl~Cn1>nG_5Q({Exw(R5P=S3DU8BtA(>{ zk2Z8u-+Lm})2y{cSLTV+9D{>-2aun!}81^CB@az?#-<^PZtj zXmykN8}g}%aaNhi{UlScUy2mT&W;{*cBbhoBBrjSvZ$|4ckdM=SIunD+SA^ z>CI3unvMZ8Q5uqV9w%^Kk1$tA>Q#%S*_sAnyGJv9L`k_s=(q_=_v$G<^g%|0~YFc($@$cq@FmexZeVZ3(UQQi5%*;Y8-MlMx8n6DY;_cj+&@thENa2fa^_XwTRC2jkk3?Wc23@Y9jK%ol~uYwRDj+XZHfzN@c=5zs{1kl=3(bISenH>$2fDxQe| z-9`VswV`y=Cmc$bL!1{`gY}h1sPoxi-UnJPtjP@AoBn0Ow)|B^V&dog^VRp!`6Wv+ z!i3 z>_eDhEP28iNb#|ZXL#-Gt<)mOCmk^+Gsfw<7X>1W^s@zUFFt0Q{+Z47@ct1@tE z11oy-5$OLB-%Im=+o6bNokYlvnSTmk^9&$Sr5qONkub8O0D*Pd#qnT2_p{%Sm)7qz z1Bq@B`j&u)`KiKT4D}o;PX&mHJV%y%>$gB z7b`a3u)-r~ZKg&N)cGcZ8;>@F7n0SnN(%kj(AxRYG6xbE@N5(?Bp&BTa|uAS;b>jl z=eK;p3)ZBn617z=GSw`j7n2L)3=X@tTF*CWxT2RkKs>cgR-ijlT?;629B#Yl**KY8 z`$bK}v_ILIAZ(b!9zZjR(R;*@A|!8xJN%cci46AERl&Qt4r3b2^+b>CI#K~pjecXp za@tP$!ksI{1ruy1%B82Q+59QpquWlVBOc`bQmM^SG1`SCw@q!~ra{`$miELPk3)@) zCgc4|C(co=U&@YIF2^JTqjF?DV?$ab!H~_+pqrT?TvM?5Xhm3fVN_$n4b;Q*cNO*0 zlQH48C-wtHIOGH|BeT@>xJdK;s+=@NyND?Nd;ee1bSKn09BgJNmWTW-)G0a(fmaGEWBOii9{pL z3l0p@!;0mtAxlMFOrZ~YNa}r#jYxzXe?qEi*=Sg&_q3`#=18-&QgvFzUil4#hln3f zDn_3|ulie-M!oOAjn}=5S^`vzQ^Gv{ug>XF>Jsx7`5u-#F(1hj@#w;87&^y>g#i}$ zYi&vI4}p2e!dG&N$Y7kCc!C%)=5fF|OsUv=o=r(SV1++mZZ!G?fQ0KAo2>Dnhy;B; zEOh39O5#I|#uXdP>S+Gyx!}8A&rhjZ!a4cL@egFjqih&?q6Ybznr7f_O9Drm(k2fqfxii5B)Og_akg$CzZxf z20LB#>n9?>Hz2EOU6xj*al{A47=j=O;9s-% zU*SppYi3kquWaC%c{P?x0|~Ld&d$taCFgynJ5~W)^pFP6^jLPH%4#JUQ1Ag`-w7%3 zaRX%445Az@*0hXNb@WcqYW7NB*r+QmX#%kmQa- zuTHN=LC6KOl)HW{jkO@MiuLfMOtihixOtA5e$DXpI!v&Jbk2}07G*n%nq!U{(T)Sd zOk)v4S=8C3SJ&Q`I%W;vl3gHSn{j3YAAkZ$K?1!M&1?2AJ-_~o&uW(a$KmT3dOYil z%G?WfukH&#qN1-w1>XwN!lHrHvX1rb$Xfqk-dCy?eQW+L!}w>V3>E>G@TvoE#;$vH zC7rA=2I@msV~OmG+GI616?`c7S^wXE{NL>9;oG;ue=i3eUa_V?QU6b@LI2~=Kd;wo zAz04}HMD;+W1x&Bwc%9&du+ANg*5+|Wf!nmWyQoLHwKFR zj{~Q#2Y!Y04Y!bc{uaiBFvnK)M@SVjwke2nV%H3 z@`tbXDUFY61WHi^1(htevCh5@*YV7NX)i=<%`-($lZB#0$Rk&em+F0*(4#yOQl|JgSd6Y@}Y^Syvpl2BnsB4_SSoXJcULT&_LWA z?p0MPby;d$U0%Wn=Az?jS{qaSqo&$*!f?#=3C_d~lANkzCO9-QD-n&244!sHuak44u&JI`&c8~PM*2_p6YqLBU!vS-sh%rGwOojpuQBWpc9ZwXQ2WTiY01z!IIEUHZ0Pn(NN@;Sa2dWY{ScCKw zjI+jp=T1A+pq%O&nB^QcOFr-bi6^3?1@K zn4GGNUOz~ZJX~YN%=wwkNnA>Ach+Mp$)$LAS4`N;gML+q$^zQIIPM-(soTbaQ0)ya(w-%${5L zZ0_*8Vr{b^J2n8>&`SzOr$Q?PD= z1`7?nF06p-oSQS}N5O-*>UyOYyoUAzWcHw+L}mhH=x(eoJRCA1XMh?oqw0gzGQpos zqH>ta+7dAwSFD$?f)1|!VT>VY7TCZ0VLh=$$nKyp`gTz&bMp!c81&ymA9fD|mmmT_ zO%XkQjvyJM#sL%qGzl-CGpHp;%-S#z7Z&P(W2Nvr4xJQHVGW&Gl#=za$JQ`FeaqW3 zRF!f>MF-n(TMjWsvR*V$OR(>0Y|I}NiCwsa8AI- zT*K$sP@ghP;jDbsED*W;N-&nwG8(A=S$bgzNDLVq(ao_lf94 zB9lHOqK{)mQo z{s=&VUXAxT5YWzce8hQex)2Pb3OqnQ53Z3`8#qq+$i!b^vS;Q@`)!%K<_m1gW#X=8?{ zb!Y)<251x0GU_~VhnBkYc3?7MthTBljyA6EJB&w`skgF#aKPNPHWPg{%cRbk<}(VC zxZFc_PIGKSXq6=x+O$Wgr?2lM6=L2?kCd?#!(g*U`#7tg$4DJcLEd|efpPz6+$VpB zf5W;(klXJYyybz<#qwPsn89DA20b1nnLQ6|T&1~fLIbP?h0V~DlKEe`WJ~-b$>TMR z0Woe)B$TVrY-nQ)p3IaYlw}!oqqe%1Tz|#+=56!W7aR zTQTf<@Dd|rf!b#-Y>opXkR&?j{Sn2g3Y4mXr0r|LjKcAS`T!O(jf2zBUNJ7}w&V)c!*=2|b~!a7kx4%5&O5ihBSaeL+imU4=D&Pz5_ zs^)RpXU^&Zx}J)LiFg-d!~g|XU>h>Lg3(#Q-XJUR^C_r7Xj~haWN)f3I8LzPqu;Ix z2-p@}3U6SjEEeXP$QBH1EbF<&c{GC%Pz6#rOo6j}aU&{( z!hQjNV=T^afeNE>;LUilPLEdkFO}j>n5o!EhrF^Ip*MuL1~m(Y^u}P>gq`;Sv`X1? z!F8cjEYnM>Zzs6KtPx~1D64Lg2UW5m`5F}~^JmvbCAmGwu}aq|`Qn(Jh)e^-gfYEP zg*}VD6Ma=woq+0snnIM->da+5u&b9qRh=p{XbQR?ttl>07t{qbaalvT$yi!cI3))I z@QzVpq1NCa1Ae+fn7YsT981`$gMp4BGY|w5Yz2)$6@&hc1*^ZO5dEd7p2$RssXVn= z^;E-O1AiL+;-03$&pm)X2PHdLB~=Mh%qdqbq;P-FWGr~zi-hy6E?(#kL@^b#O_~^? zdATG)f&c_Hvt-snfyUC?IeIM8yE1X#LBpU5awkno-=oA(0%oMDNLnB&^`an&FIbJx zCPd%m5(}OKsJQUgQZclN12`6;N3docw`hw6Y~nQzSj$1BU>=;PJqIvaRe{V60gY@>Jig9YPaiX6Z1F<|Jw6*Ivb(|~$6Awq=2(5`%(4V8VeVk^5#`T<_ z&h=%S-Vl?@Wv?a$dZghX&D3afoVNpwk^i$}V_%&UWmba*TZ)1zcV2g(gqyKJUxWzQ zlhqC`F-vvjYau(#9Q>x9;t(XNiu;cM5AhT9(lwtT7_)Ig2px~8+fX7L;(DS?jj3|oA#CsXn_b_S9N1ysDlns6_4h{_CQGQ^O(@( zDgfy^)rJ?qpg@J~LmS+Nuv5W07#~Bw5LpZoDBhnLjD%(E9=3p~0CLv018=eB4WRVg zkYO8qE!+>0eqQ!NoM1WhO=w5|4D?{ZyzRI0QM{Y(0YOC2&EEl`Ygvl!jreFCi(G68 zGbiG~Xs6}m;02dNB+ksMSHp^`ZqY(dW6K1xs)bn$NHJ4gMGu;tlgN^#YMck*fG#~h z9DtI>svQRXpCUK1i2vcE9PIYPq|p~Iep7D(jnJ&mLTxWj#Ju5> zh)3U7a`TvR`m%%-O_;l*8fys0W3$@FSRE zbzZ)k_XSm{4>O0bUMIapjyNX^K7_sYALeZ2pLkJOiFfmk1&VSb_ijnv-Jk5WhToEQ z6xCGXUAB<;vbXeL!dR1XGvBj8gGzPWe5}>Ls5!>f_f4ZSKv$0FKFQx=-Nhli;eary z+TG;ddgXMWC>3XlJ2iFOnw#2SW9Q_pLDw|IBk+>pyL4&IqG?Q@q@zrVQ|_GAgw&>1 zpA&#_M%z4&j>vpzQ@s+oP2*3a2Aphb67PVX)40+J#|Vwg=$@874H;VW5)o9(dQ&t# zx@5xdO+-gi#qb*=OjTTY>C|UT#UxT0pM^DJp`epQvkP3`$2<@yt|YVwD+VnBgo!f?7|HGM3g1X~YQRR&@;L+jIR)+cOv9KqVd(-k zjP^+VXdmJd2KHjzX&+O=_qJ0d>u|t`vllpKuNRNxT(&6<>Vp_*Uq6Z{$pIEFF-xho z<2i>qc`jDh`%CHz9FcE`ipS0%#2WrWPkU*y_9Z0&+d7*70FB8u}@x#SKm_lOs z=|N{sqvZA+iyDt`>o)D{;&=dH5$k3PxJO&B8fb=nx`o1OwM)+4Opbt?smmr>vq#d* zC_HtlQY!qJInVznHZuI&F9Z|pzQ%z}A)X zU#pUj2J-AIVsK3rfwlS!(jboeS`P|60YJDJ)%Y26=yvmSZ6fz5it*OxkI-%*8o3=O zAfl87Yk=1Cgn#jZ;An#$R4=NW9Mz+|AxOgLS2Hx`Nd1~dsM<{{!xL!%^>Tgu_HdVs zF^KkT4Z5d6JCHP$75XqNP^XLS7i}i`eNk0jCx%?WO(v>DYAq_fq_c=b^$}=qcjm`j zO!zwR`vGbsRJg*Ca6JlGUVHVr7?Nv>Hzeq#F4fqvX#rVYoeOwPlrx`z+d0O286uF@F-bBpZP%UEp#<7%fUscbIPpUuZ~p7Cj3?9y)l9 znF{(g_^o$~BcH=n9tga!vr-mkeNGqqmR)RIQ7$#d8R(MMF}gq+vsg8&b7Go_5Gb%l znxuwc8X_iIXWMkKVorPz>}teHeYuqlzxI!M9Jt9YiMc%j!myAtR9r5J5+sCQU39tD z+2xu@h4=8K7?4rBv6r~LUPO()qeQ@j5}o};^fc*ry7WA|^og7(H&!thotaAwe-{4Y zZs7vo_p+|1LzUPhMid=0_~(^S2&F|>CrXg{$3@K%rel&h+eZb7iUw!RJDm3@AQu;_ z^rBLiRaOGjLANMg1`` zjC3gPly~YAW@Lv@L(6*cMimaiH&F0dIPWVGt0ti*ITY47w;Z>-##KSGigft`f6>$7 zDA@pdXi>v>lab4VRZw4V^jJGE`cZrm3Uq#ZB4-Dbbrlz$tZ2{xmzV__9P27S z-z=;96hbiL7Wfubec`X@Xo1Tt6Bz-)3+O&K9WMSktGFf0#_b#-uZes%ZnY6yW1fKF z0FInzv;&gdisjl4B-)vjx>!|{g3Oz6NxcCK2GEBKMpBP=cXzpAku$%8Su>WxoCO38 zwBB}vL25y&+m**=7qqmFILp$Ib3o$NJwRXsfZtmHS)w~3{N4n-&`9Pb9?2{KL#}Wp zmNFioJG5cK?=66()t>O10O<4B7dtWzs^Z?m<95!4h)Wr3r2_e?ItCw|&t??K39%Sd zu-c@?=?P>bQudbwuvIqNlj8>TB2%{g1kffe)Cu5~r?kTrD0E_UDb<^RE})pl#S#Lc z7zHwXur2GzpP`DDf-IPXPzEx3_@TchXaWXJ{&1g;U#U(FyK!tPG3b;yWwSHc+)4Oj z@K?c~g}+!$S)#z#t_AwOLhA=bp@acTasPnnB&HhINMw#hi!O{vqqvZTL@PcsxUB^C@b)ZIgHOb1P#0fyvJJ1RpbJ$tqp4^&h&4hAei3Lq0V2LUOBN4d zEG;#%H!3z-r5uS zivebPp6ug6`IBC&%BypS+XaO?m_<08ICu{uIc~`DnbaJT(o11LEu{%39F<4q2aIId zQ>>e%UaNFX@snStD^%m_1^z0TUF)RWyK1rxUlV3}iN+7JWSMLrDN*BQJn)(<9MPtR z^yJ0P(2td4!~7UgRB5$tH1G|3(Ih%CWC%Namaz%lHOpw%!U$0=~UQ}+;ZAvlo0NU~CTBgTC zd(3+XVQO?7u7z^j7)9I3?4amz=p5hQO%h7IhT+)dgS@S<&wzHm^zXs@yv5JWs-)CB zVBB!8Z|g*_c>v;SV`v-8YMYZI-_AmnnyYa z{_f_oC?#}Lc#jq5-@AA~-w^(B1Sbg6TUKr{jBfKYpWXQP7OG~@2TboKgpm1cZ+5i= zl0xgrYe4VM{SjP4nr+hJL2RQxa+zIV@3`9&oqIEln=WDW7&F zS#B!a^Nciz_YmktabvTx6fU{3f(I651?`|nZmy^qx-_PDBRNKgA)k+l>LXP!5cZZ0;ulk-4>2`)0RrzDA*NJfBY5zN_j=>0B%bcw_QvA-ddeq z9MJYGxvYJ*zzx3t$Ee#yj`llN*J!@Wm(8Hxfi|2rFw4<KEK`XZ?I6?- zyqDj(VtN~V-Uh-jj^jxH?;_q4^A4c8`n@{c;l6gG?r6DGT|#OPbnekuC9$+M&XL?Mq)(&*{9jB5*U!JBPJAY=?A$owccfv?O#j-O zKuWd1nQ=+e62B>}bq&=or{tE@{+_hRboEn7Q5~*bqyLravmb5XH^hbia68)b&lY_; z#ov+^_H0o0ZUpf=5+tvN-<%v-=hM3AkEC@NJ8GTu#r^373p`=ucf2v)VhxP<68+(% zsN8V+w4Ev!Z>69)K znZHGvSeDoV_s3INOcPrDdK=x%68)a9FbRI$+UJiZwzCYOBxhX(ef&>mEJ(}g3jF3` z&mT(cSGt%mslIpS{NIt9I|k@?y(V_~1B^G8jrxBvIV~my1KR4$Yu?cG`t2e8PbCW@ z12xpYqZ}zsYW=?-bM9Oz9M%;{1lxKph`=ZS0WT@B7D7L%Z_a z{X~D0Na*K(d1#!m}%^2GZ2m}praepbJoWar1AKOEJ&WaAu$ zAMWpa-Cs;=bx?u8k5|Z>$>EA)W7uu$)K4b+(^Wl65~?K)8h=k}=#=>LLMM@&`q_bT zGOgeEru`^OKK!iRD@yKgBF3+$wsj!Cn9?e!>z^51+)VB_R^Tfyf2{BpN74$HmHnvk zYKe@iG%f44Q(N#*koD%r(!vuvNZ~(=o5Q4+(fRu35SW+3NIk+Z^!rMjG32-{S5Wqv zj&&~9tzcwyvW`cKq8xE9CzX;Y+&K;@rvl`fv2>?pqw|YNIjAYCO#$z85%GBe$k(hR z|6^U3nSNoJ(nHE2UNdEibo?u0ep$3;v4^;B3->L^12|ru1biq@)8X2FF21B5E!?E~ zeo;f-;c}cRE;BrIh`Uop8xec4Xeo-Ts9V|vLf&^&udg#=xaWZLXqmJj1X4;P!%! zvcvV&F%CKhTmi#c_68|otB7~!prhSsOq18Vvn;m*$6d=3POW+pg|?!`Q{C{I%Jj9( z-B!#UpZP5W`A;|x=$q1kb*K#$C7#3$T%7xlG6bmM;(ljZk^%Xi>+EH=*~=BKSGdj{ z{G}FYpx+#nVIkE`Uyc=GJ_X5fr|Vm96a&dS;)l?;I+z67*-1W+cTO~)!GAW_pU;6m z+8N#FegNLE8EUM(y)(kCNQUG2?$s?nf>bn;Q9pn;n)B-X0}-5?B#7>taRe=KFK+Dq zF|gDQDey_VsjrHXb|)(nyO%kG5^ms5e&I9iEkDP?H^w=CgXJ!jCEk;;E{2X;dYq4hq1cg^2Xbnd78)6p&o{bjy!vq+Zr3M*psIcD4|4>GT6{2FG)WT z^nWPFRBuDB>~-;&+|b%HtK>$Mo{7gX-emG*4e?BQPQIUG_Q?eXo~e^7VLa2~>W7=$ zIXcE~V^Sr-y?ZR)7uZ>S78{=U=z!#`K`ZTfT(v>vVU8!`HT*!VJu|NLKx{lS@zgWx z*}82FsfErBUL;lhc ztrj|S_)D}G$=u>*nf%n~Uq&;?$xRF$+j26j<8l@kN+sk^x%hJTfL`q#G|hKp^$j!~ zviK$vg{e9+h}9SAowzWV!B66oYh@b&Vz{OQYvA`b#5B0r34T*~H0Yd}lpesTqjUWh zPM=sdgJ*Np!f*7BGg|lpv7g!jh9)zFC2IU0CZt#EOk!ul15(nto+i~0_Aoki95=A2 zui2#H0a5~-yFK^NwiBIz6Qe7Qr&AZ&?PG_R4F6JlOj>`;3+^0lC+r7gBEdnx4;|ub z6TALcJPnp<(2i%U_wbv5jGWPaJ||G?5(R;Pv=W6oZ$O`dhC#QVVwCvU)TCd)HN$WW z5HH2DUVXH&6=0O?Sj<{zTw*{`4OlfTgetv7^ z+=41$WI^kXReEc%B<{mhX^vf`EQbN& znL3+{g+Bv-aW}E<*ofHVJ}JqgC?gPU+Ye7mX;D|Ep%hcioH&VXXpp`LWcPiN2uT_N zUT*PSmOU!5>n1d8I}Wtn;?<^1X4i%lSCh=UOjDZz*Pr0_c&S!(RUK|MPTf1l?Vzia zU`(JEbt`@ak6reiJ@sWQ@oC0|4~^SW;i_X*=K4Y%GF(#m8D5s{k~&u6QC^7za21Lh zoF#SX>x3)PZY~h^?3+wu((?;58)z&!C(e1AeIJ3>M5;)}8h}HU6kFapBw&_W@S;lZ z73P@rdrXupx0&z7oV&#K&96+dGb_$hUJI=1=fo*e8^$#WM8!S!hMJT+_T`+|K-Qyh zCd}Xj+&cfF5<3W`!399ITXlGH!Ne>3sQ!d|!);=dM~}f#F`0FtC7Z6^eKqb#5D!>x512Xs z`gYjg>h$$30I*W{%_~o=yoSt*AEUEKI|EQKNT2DPUk>fnT>KL9Q!U#NL+dBdu9BCe zsWMh(^W#G{!rv53e;we`?PVQ|rVkLqTY{JXQdZh&4ipHP!h-TLxJ_VuD1>xsC@Fqd zW^@w*+_`h7GAw3fJUGrnR;rL)m9(oMT(YWU@Mq!g4gS7{z}g*Dhss$U@)~peT0jUP zXOd+nyhbcs7pGeqHNYigulgAF!jaN2uTKu+`4UeQcxC9AI=BRkn&TLFcMuE^va#l2 zY1eIad|@Dj5Wo5knIL@X3jSs&WY8L`3jSuBT_5YLY3s~fSr}O+wNbup30YR-Q29-nPvLARU?!Z@Kfxtn@P1M>c;i#p*!jd9BYY7$Gp2Os z;*`;pfaljL)Q~-6J5DB*Yq{0hpXNf-qaank7qA(yKHWnJ_brv1LmOZ6uY*no`|kzV~~6=Q+=L&U2P~|4YDPRWHko#8jr8lWia|->cM!@wFMoRz7EX zi%&maQ8p>P%r)zHjc0L5nn+?(tEr!d_M z-StKH_TGzC`Ih`LCodSfrLJfGR{oMs_iCJ}=ezvI!orciR4SKUIH}#SvwU~cZdZ=2ZC>*_sxm;4AwICyWZ6s~Eoj?h%E(24@ovos0@lJd^SzQ1g4ESa|zzoA~|T zCyTdzA2;#7v7POKubYJCPov#`ZI!=$tp@szdUoZ@gHd=4W{s6Dd{Wi?6xK5Il4=$`Lh*|u;FJ-L0x zVcmjvHF+oZOO6%sDv4XNaMtFzQ9I7HJMT_5x7hda!w%tXO>^xOH&zrHrzMwZhuE#L zHl@pbt}tauA35n+`1R$?S;OWmb!-qmT)E(+?<@JOV-ml({)(RTxK%27U6yI)%tZcT z7k_glG1c@H+ak#M`$ZPcit9+vX<6hI8&^Dsly_ux*~I7uqt2(o-VcQ};$4nWmo4Iw@3;ou^a}sJt>9H814)RB3i&a;= z8ofGh|Rztwa96W?7g zI{ygV@uDg!?DeQc3q`$u{`7t`{oUOvdvCQbHC@^Ul_^Ua%HuKZyaC3<%9mjBjROqHHaFROAe5p540Hfh4!wk@(p zvn+fc`APAoKPzKi-PrMcRa2yOgw#%*+10Nzp47g0?O-f8E>wp8-NzXLqbgb<1XP^^5PlcfPt6>C283OB-pxp17PU^q$V`uTr@OF5maeN7rzkL_QW|Ge#m6FxoMpv7+uDPh`6L=x}YlenL z!P$3R^7Yg54(2uaoi$HM&sin1EdJ^HED7IFqvnjEzH?q_!K|{ruw_+cp{K>{;tfse z^_|gOtDdObA2Houx!olqrk=lJ|C^C5UNmn<1JnI~zSo|)+fjJLPvdc3$FwG!`x?I| zTX|LJw+OsBxM-P&;;FBfO|Q#N+b5W|zue+Yb8~C#oSJ!!O;5|m?}DGdj?SJvN>)92 z=Ht*;ZR3mr_DJ1j*7^8X+nw)x8D8I(tuwinygp;4h^*zIxP6<|b1YIrtfJp~y?Xkr zEbRtceKeox`WTPYSLS67&keCMY;>; zrB+;GuWvs1tts|VRa1qm)6@1V?B(qEw~b1xo2p4^5m6`HH4}0e0{4X`y2(o0cYdzb z{hBUlV==aJrGU)a8kZ8)gtfXGGHx&XasJDJ7A9+ALO|TUxx?dCuHJuDw)NEF-1nwA zl&8XJBLy|PpLE`!Yz*5y*?m`G%!`J#%=L=ZzQL*DA7@(s$}}uUC=ZR2-xloFO(MT9 ziu7)jbY1G| zKZI*)?}H8Ff+fGVczY?8%@VxT5JnUAH)uo<4EPzDZ_;=)KnTs-}*J1!vVC%Lrc{d-RC*)m%fPG32c|=TC&FpUqmMM_wLA&e^(^_4 zY*DN{y1s$wXn0nz{`?}F)}I1FL3wY=$A{P#?g=xwpucDv-z_O8i`1eyvp(OL2hQ)3 z%*q(e7nAm>fRs=AnS0;1yHQJV*{b`|>qT-dJ`#|g8FL`5Lg2rBzI!e#{89QO?hX`K zl$myAdy`3QR%l{f)zkXfub$p8^){4Q1FufSt+hF<7-(O;RC)IM=FGZ}V&V0o|2fmH zWw3T0KM}dB@!Rd|0l{v6@(jNeWLX_l_@v9wNH?9-)-gK7dvdvvoNnM^$B}PqfBT+% z-imhOv3$7*-!AF8OByVh3)>_Dq;Jj2Sg-RdTyC|_rStjC&H9hl>q%UA&|2_xn&7eOMaCWl?~5h(YaiKU zRg#sv@$DNHIerMPwnkHvCPO!MBG{sdhJ*-+Y{gJilhNFwKA2^On{<-Dz z^Zb+)1?hnGmv72-3a{^^q8!VB5{6_?6WnRBOkzxJpP+oSc2Tp7h@`Mk?XCPPjup~a}Y zwZ?URRMo)^H~FSalt0FQy`XcWD7pG+r{m=eMu~*U0=Lb`=gHr1iCWInd>n9vG$!y`#S6E0PiBTpEDY`I(GxL;=GxZn4(^($y*j%^R@kdicA~x|NtNz(ZoRoz=Fa=fwMU=dc)(QBe{p7k z_#Y|h?{9|RvSl!vo;#>^>D>RQUoyJc-^42TeA~VMRvq&^vsCh}N7m2Jd{UVcy(2x2 zJP03dP+PJixH@8$?{bCHEZO~|wj^lh%v+J;QYUtQMNX8I)cwf|xa46-3!k)%3XB90W%~jh}nTPTcgAL zmr5h;wHvNeZE~)R$dou1u1_A-V(+c5RJrI{vGCaFZw2Hd0psQwxt|VG>0Dm^W$F&i zB)O600@hP9F8^BbjupY@$9|RXbZND^y5aFRR$ZA27wW%^nS8~6V_qp~d<*q>LAapa zwh`*Lo&} zxc>Zv=X}BDg1P4>(|}a+!4F0 zIewZsbG=dNrrEk7a~$|n!^A(sA8Un@hih&w4=LQG^?C9BGwO>wU!N?`p2zU~TxCnM zb7?ESdfxFwO#GBqBk4f*dzG(c-sd?^S+k;{D5$GAu%qeGR+}$rb_|zyWr9c39#qB4 z-mJ{27UGlsyyf_kv@fmlx4OIjR2=-u^!Com_gnXF$>)_89hL{LG=w{x`taF1l@WS6jvmxwhO_Razha6j`MCmFM#`;>+fF zj=5gEp+#)m*sl>ucR!w1J@#YI=KT<+zu4`t6K6HN7$z^UqEI1n-NNyqA>!&uuVUoH z6++h(hc}-#OudruQ08>ZjSkn#q40j^&gLiBImgE5J>7oTz5=-3hZuCgo8U98d2#53vLL0OVYU3WLJ(qDSny4Ihj*)Y3@2J#qL=*OpCqYVTzL_UH97Fbg7iEQ7BaomHFYeq%mp1sBiKS zS03cudG0bwYHi4h&XX6V^@pDrlSwtb`Lz0`*0S3Nob==wip#wA-VSpx8e98Dzp3Wa z+{c<5cmIjAI(#Ix05;n0o_pGT!$RM4_NnCT81oSuM1F;rsb+1F|L}r!X!G$0#>*2L z_PwWmd?uCO?)79;l1Zhd&*g)2vl|;VMMkduDG*<48(x@Mw{ONvp^UwY)O~$EZOhBe zv{T5{n;?;C^|Rqpy7kR-JEZE}$z+Bq>_g>FihB7pD$47?(S0A%#s;{3{Fu8gaq02= z^FLp|6E0~jaaqzS$gysn-K?$h!$_pBaO1yiHxjJNq&T{&fQhMW%DFl#5?{*pd+*(5 zDDT>=Dmp7Na$TI=VOz_{n8Xo>Egzbhn^`NG%r2fY+r)hKnkPDn0<+Q+y?*YZ@4A?KEnBB3EY1lHPbOSHZ-tarDA4CR5)66HxTGl_8g)oMsbSz zd(8#Ya-MK!(Af-M2H}%q|31a}g)!*Ko;Mwd3LcLUKZvJpQu8H+ZPb$k-kK*R$ z!08T{7VvIMl*|L*0xrRKMhpQa6zt=BJK!a79f3O?5nLgJ$F+8Jp~8!?m^$wlyxW`! zoR4s;AUuAErr0gj%d?_-Fd1|Ysy>BH!Dfpu+(<45rXpxnL)haXmhi$hqEeiwEDvn_ zxpDau_5$`S+)4=E6#5D&>pNo(rrQ}Eb3xY3TY8Qo)eYeG+7#be$8J-cGy@7~fqu^!ApTvE5W(=O&s9KQH4G_^ z;9xkGo^>+LuN8{f3hl4>uN?Sox&kjnVOvP*Wk}mK=xNeW2{e?sK*z?bfL>2C_P7O} z>9e&(yn6Bt`>bm!{Bqrl zSlHi^XSRVCI5@t;q#k%YIs)|1h5-mI!+zEOSH>#%Vga^|_zKzzB*0U;#|(}g);7GB zflV%M63aaZ>I*MeQe@yTXX4-d*FsujbNjW?ny#O@q+8{ANz%MH(M#0T>*qWX5} z+C2p@AAn&dFyOl9fDisVRxvzTj?^K7jLwWptu=tp;tDdIPXA{S*j5kJBsG19I`}~$ z(02x0S~MOC7-GC#%X$+T0&N-uZHmUoa93XGgd^@R^A@pFFpP#rYjLCzY&iojGK!aYPX0U#NnX6ke(j_?QNim=mk#_uaiU13|-YAGo^|Uzj%~+U3 zs)K1KN>xiEp!U{Z&v_Fzb?(0G9g(2(9rO-JY6e`TSs2t6@C_dWx+BY%$<}d#lph=F zaCuj&G<4)=FrSwmfP{#B4+F|c%dtV6XZt+}&2^^A@5{{oYOdou>7<&$3H zgROe%t;e7{({P%3pdn!vGT@?o#^A!Inmn0Y9r4CK*7B3^XcgS32d3gf!1F9AELbqW z%K_uO%+H5FY<gAf6agTb5ygZXSk=M7a{s+r>oh9iYd zW6;4H+?i}_v~t1vh7BTMS`du-f#fn=Gyol8vP8vMySlPAL(Oyy_!h`T&HBg$mubz3 zo~v<|Tra2?T)qnf(K1N5P?avWLlD_CH|(0vY_>6=L*v^+mPv8k$kx`2H6uN(%3Yr2iMqf&eJ5r34A{XXy`0Fk{G1#>F(|et+a^+&BSpnDjm;b z*S542Zvr!nhI|$+W1S13Sm?5wI7@Cklp%Mz_(u}d;Tc3UG@8wD8@h}&ut>`B;+_E! zyDja1ys^6tR)@elXrPjZ9R{v$_s`-LJ3s=y9_)CiI#2@wli+Dw1{a{Hy0<7f*}=x{|&g>dBSN5 z$_!Kpemmewjv7V+=jReL@CgW31Fjc+PjJ5DIe0s1;8PIZ23%u~_LjqW%At1yiRg3G4hWcI5sN2sn?yr058KEtXr$KN{hRaCvt?oG(B* z>xrmORzhONG33As{)1Y0;HJOkB_oaR1MUl$8Ey8|#G#Ou6dKXWXTxEUyhQLwF`dD? zdyin#k5DbPr>ANd`b9y@WWbG%T{$<1fHpKbEG%I&SLV$ca~SIX09qbprsNVb!J>Fm zilkG5lqzT@4`_Qb;z?n!5RItd z@2JYq!l9VhwzO^%&6o~EHe^94aZ1q;#JSkSQqzO{+R!>WP7rb1nk>=OR$iS}%M(1aToYG4Rd@ z@k~g2t>gx8R!UY96R~;cGTP;>K%FR8on=1}@$Ajef{mtev}Fx8ui1PYQEKFi)5yUI?D@&)HW)i7}FB?wJ^JSGj>j@7XxGEuK^lm_O6mR3Ds~(eNFC3bQ*9wKZWGI}ZT5zQ1xLe%#A^TbvdH*LouD_?ihn+ z&M6dig#P3IqT{Jw_-@st5a1@mJssgEF2Pn$tT$nwt?mra%Q>S*MtGhu&T}<8v|B$9 zPoc?OFJ(LM&l;ejIq|1uI7C=Xg~ML>>yhKHrSOXkhm{iItZ;h`C>G%Dd9?~jC#l~gdqT(C7d zd2zGDhW5ukV>T6MEj$0mXZ~mqc^__cEqlg>p_#<}N$t^v2yf6j9&C(8Y)O0G*?1;i z_LRTc9bDo&6f5R9}UA=0Bst zZ*Tpu*(TP!XqNnX_X7-7q~G8Us5S2U^Tx$fELCfM3lO9fum-Bw334YaJ99=EI9ot< zBXfQ;#yPaGeCovVBH(g1Fwst@v7IL_gbMs{Z)xwXoD1|NBL*);Iqn*Qj_tsbA!Ty8 zBS|Dvu)z$Z;kN7^0*GhXJ9~45VgdCO?x_ee7#66oENc#3)(dCDxmu~)+#mWvEYuo} zx^k6b*(CMPx}#e>>%xKX!Ql8CLCha;C4O;(J)3UWt7-$m!IbCP&~;%Tk$&C|>V zouj~w(WcWpfsM8Dr1Kip4H}G03IVPHa5So~Jc$kOJsic$!R?KQ+ATQA$t}21d$3c8 z*j8|s#DmSE;2h5R_H_BBDPZPP;1y^>>3E7KES{l5BPtU^LF-w#QKxvFiUS_{L}l=K zu?`6^t`I0jV@2i}Z0KsM6;{;V)smjm=Gc+fnKk7(Og%|L(4o;YS<}z`<8mhaOeX#k zePY;ay;)#K3b-t+Iu5u}V0W@V*!EMfl`!>>O&teHY=DC@#$V!MsADsvCq`dO2SzK@ zX6gVHB$DeDE=I4Mp4k&NEwKH}VNXz_JAy=#MQARWSTw?YMUN?uv#ekPv>kGGboppz z_Fx#coCTT9!pER;oJ1PknY;-@{Qx8PzFmN~H2kGx{)Wpl;HWs0L_!abC6;1fu(c!{ zR9+1;1Cl)$S`INy)DHv#rzbeaM?A=S3^xV~Kcz?ybMUMJU?fxy#0|I%ITu*7vjbN6;|-zh-yoecz31Wo_hF zCHIZcZ#4jc8tN9t)4eX)7ZkDOD123v7nI6*_~n{n98e=8}3;MIS=ZvF;VErRAn*XiUXcmxv~ zqw0x9{bLY*6Usn^`%b{&bLQ3=VVXw@l4s9`bJkpw;lfIfcC3_##A72j?%ek6GT=(U&gf#n9!QZe>^x90 zVGE8u|7L_6*g}x2b01N`B=@gw^qZsq&-lZz+6(%5;nlAq??@A4oD}sBtKk=312~Trdl&8^u7kbmh9TG@AWevaxzR*@@O4isDzRY z-)qnN0D~9Xa`4cg4X-<6^wAZtb=dDO2AnrZ^l-;V*O57gjX`)T_#_$ek)X{(v9V1t z-PS_Z6KKvbkfGU#l-p25LNm z?I|;uJfjK4KL|a&Vm_1r>zRW>_gWTa2|X)kgrXO8mz-||TsasT4c%|y@EL|Z1|kW? zKI%NQd^3pE1apAj4Y6=Ozf%p8o!+NgH?(Fuy@t@14)kOhUOfEFo$!h@^mI zbUDY*9|t|~Tn3?RpS_j4ih)}Q($N$(C4hG}q5Q~`r-C>`f&&Z*iw4-5M0x@5r(;^X zM}D7f@+vCJoks83!Qm_qc;am1e5qyrh7)8x@1mnwYt?ohiox#eqV9e|wP2c&BL|y) z)Gi*Ngm#f+o(cH__Q(LyXx3`F2Z!x3@C|Nk#c@V+d^m>?ZgEBGguT2_2_;+2P8Nm3 zxFk)k)M08EA-r$xi_jJM^5@*{1m&M$-ixNhQV0GIIAI0E6+R}rLK#cJI&z3F`b1)u z(ff+0F?>o3+uR)_BipM0g14atg_3zkFoC^ChX@UEU>V(%lLF5H$3sJjR@Bf;!uoTn z4At+sM)&>f{b3aS5A9C#;65)k#$;cZ9;liP&r2bX?i&24E`#A_MRmruSoQdp#R|ZI zv%Q1X@x+b|k^s4&CFfHM6#6Ed>2IbYe-dmalG>p?(Fw`USPWR-hRxq)Ff%w4Nu%Ru zn0l0x;@<(!SqDQ0iVX=vb6`1e2I5fF=Z65|E%wK`*3N;m(>>pokU@}_GX^1h<`x7eT#kgC(B!!LOpZAb zR7ut#lrf!+>+O8sBHPUX0|ymIu$DLAvV~U_kruJ;*>}JtaUKOo&xNjhwr2k$!Anfu z43;a`$|p&8+A%43JQZ3HT|HOL;eHyNLyy5(L&I*l9~&ptbF@qXH%7a~(Od!;;oI5a z=jSR`0xuXwT68pQf-_nDhU%~0Ux9s0JckHNd#ZgJs%#EZ#A$uT>-`~nZ+Lv;tbs2>tl2_89&r$HCxG1pxX+G46c94BVN$hEhYWs$;2lh zmJU`$*QZ0uc%kCib%sH-femo?fm$>eTzo;u#RIPW{Gaqa=qH>6U@p>7Yb!8;eHjJk zWcO+oj5a+fBSC*&Kg+EE5+KqA@C0-Q8&E}90CY$y3(ibiGTdm6IGY>%5wtNOV2)Q@ z$-h(05b)lV4&N^}$1YW}1KnN_c2yC>7}OD>SFtE`_{1BWuq3d`g@T!f13~yx7>rP> zbT{xw$CrL?xR#3rnENAytEq_e*Udz5Y*+qH%KPpJGB-mQosQ7Fe-P2|Jnq@q(T)E> zhdT^i0}Tx`;Q%j2z#;w+okv&ZHxFo|8)FCeh-ZR?I6Qr4ugQLgV+%b8574d~4IkXV z(D!ePnM^cKdN3tN0M0v-6rk>C*F6AlybyA+8)i+{@4IKfhoZrd=s3Q3+z>##y4NRo z)Wg{&66durbXRoY#D7Q&YqEtkzWZr>{AE}MkdaVPbif=YH4uVbtIjO_F>Vl$IN=^0 zFvVp4J#Fm^uhY0gzRTvEZGb&_Y}kw^*UdA)XTQKrMtt|d6nq$GnG5e-4VkngB>|8I zDKiPpbV_A$iP+*edVth(L2n&!$xas_!Iw?pyENSS1pH_H55YeAfNRaahv0y>2etQ$ zHe7(qDIciH&@v3T(e4+64WN0jHnG6aK58mp6{6Q;M-5OzB8e;ht;CR@jfK8D;IbI> zqzl`f`_3D{Lc?uE6(aQO ev) { + ev.getRegistry().registerAll(blockScreen, blockPeripheral, blockKbRight); + } + + @SubscribeEvent + public void onRegisterItems(RegistryEvent.Register ev) { + ev.getRegistry().registerAll(blockScreen.getItem(), blockPeripheral.getItem()); + ev.getRegistry().registerAll(itemScreenCfg, itemOwnerThief, itemLinker, itemMinePad, itemUpgrade, itemLaserPointer, itemCraftComp, itemAdvIcon); + } + + @SubscribeEvent + public void onRegisterSounds(RegistryEvent.Register ev) { + soundTyping = registerSound(ev, "keyboardType"); + soundUpgradeAdd = registerSound(ev, "upgradeAdd"); + soundUpgradeDel = registerSound(ev, "upgradeDel"); + soundScreenCfg = registerSound(ev, "screencfgOpen"); + soundServer = registerSound(ev, "server"); + soundIronic = registerSound(ev, "ironic"); + } + + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load ev) { + if(ev.getWorld().isRemote || ev.getWorld().provider.getDimension() != 0) + return; + + File worldDir = ev.getWorld().getSaveHandler().getWorldDirectory(); + File f = new File(worldDir, "wd_next.txt"); + + if(f.exists()) { + try { + BufferedReader br = new BufferedReader(new FileReader(f)); + String idx = br.readLine(); + Util.silentClose(br); + + if(idx == null) + throw new RuntimeException("Seems like the file is empty (1)"); + + idx = idx.trim(); + if(idx.isEmpty()) + throw new RuntimeException("Seems like the file is empty (2)"); + + lastPadId = Integer.parseInt(idx); //This will throw NumberFormatException if it goes wrong + } catch(Throwable t) { + Log.warningEx("Could not read last minePad ID from %s. I'm afraid this might break all minePads.", t, f.getAbsolutePath()); + } + } + + if(miniservPort != 0) { + Server sv = Server.getInstance(); + sv.setPort(miniservPort); + sv.setDirectory(new File(worldDir, "wd_filehost")); + sv.start(); + } + } + + @SubscribeEvent + public void onWorldSave(WorldEvent.Save ev) { + if(ev.getWorld().isRemote || ev.getWorld().provider.getDimension() != 0) + return; + + File f = new File(ev.getWorld().getSaveHandler().getWorldDirectory(), "wd_next.txt"); + + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(f)); + bw.write("" + lastPadId + "\n"); + Util.silentClose(bw); + } catch(Throwable t) { + Log.warningEx("Could not save last minePad ID (%d) to %s. I'm afraid this might break all minePads.", t, lastPadId, f.getAbsolutePath()); + } + } + + @SubscribeEvent + public void onToss(ItemTossEvent ev) { + if(!ev.getEntityItem().world.isRemote) { + ItemStack is = ev.getEntityItem().getItem(); + + if(is.getItem() == itemMinePad) { + NBTTagCompound tag = is.getTagCompound(); + + if(tag == null) { + tag = new NBTTagCompound(); + is.setTagCompound(tag); + } + + UUID thrower = ev.getPlayer().getGameProfile().getId(); + tag.setLong("ThrowerMSB", thrower.getMostSignificantBits()); + tag.setLong("ThrowerLSB", thrower.getLeastSignificantBits()); + tag.setDouble("ThrowHeight", ev.getPlayer().posY + ev.getPlayer().getEyeHeight()); + } + } + } + + @SubscribeEvent + public void onPlayerCraft(PlayerEvent.ItemCraftedEvent ev) { + if(doHardRecipe && ev.crafting.getItem() == itemCraftComp && ev.crafting.getMetadata() == CraftComponent.EXTENSION_CARD.ordinal()) { + if((ev.player instanceof EntityPlayerMP && !hasPlayerAdvancement((EntityPlayerMP) ev.player, ADV_PAD_BREAK)) || PROXY.hasClientPlayerAdvancement(ADV_PAD_BREAK) != HasAdvancement.YES) { + ev.crafting.setItemDamage(CraftComponent.BAD_EXTENSION_CARD.ordinal()); + + if(!ev.player.world.isRemote) + ev.player.world.playSound(null, ev.player.posX, ev.player.posY, ev.player.posZ, SoundEvents.ENTITY_ITEM_BREAK, SoundCategory.MASTER, 1.0f, 1.0f); + } + } + } + + @Mod.EventHandler + public void onServerStop(FMLServerStoppingEvent ev) { + Server.getInstance().stopServer(); + } + + @SubscribeEvent + public void onLogIn(PlayerEvent.PlayerLoggedInEvent ev) { + if(!ev.player.world.isRemote && ev.player instanceof EntityPlayerMP) { + WebDisplays.NET_HANDLER.sendTo(new CMessageServerInfo(miniservPort), (EntityPlayerMP) ev.player); + IWDDCapability cap = ev.player.getCapability(WDDCapability.INSTANCE, null); + + if(cap == null) + Log.warning("Player %s (%s) has null IWDDCapability!", ev.player.getName(), ev.player.getGameProfile().getId().toString()); + else if(cap.isFirstRun()) { + Util.toast(ev.player, TextFormatting.LIGHT_PURPLE, "welcome1"); + Util.toast(ev.player, TextFormatting.LIGHT_PURPLE, "welcome2"); + Util.toast(ev.player, TextFormatting.LIGHT_PURPLE, "welcome3"); + + cap.clearFirstRun(); + } + } + } + + @SubscribeEvent + public void onLogOut(PlayerEvent.PlayerLoggedOutEvent ev) { + if(!ev.player.world.isRemote) + Server.getInstance().getClientManager().revokeClientKey(ev.player.getGameProfile().getId()); + } + + @SubscribeEvent + public void attachEntityCaps(AttachCapabilitiesEvent ev) { + if(ev.getObject() instanceof EntityPlayer) + ev.addCapability(CAPABILITY, new WDDCapability.Provider()); + } + + @SubscribeEvent + public void onPlayerClone(net.minecraftforge.event.entity.player.PlayerEvent.Clone ev) { + IWDDCapability src = ev.getOriginal().getCapability(WDDCapability.INSTANCE, null); + IWDDCapability dst = ev.getEntityPlayer().getCapability(WDDCapability.INSTANCE, null); + + if(src == null) { + Log.error("src is null"); + return; + } + + if(dst == null) { + Log.error("dst is null"); + return; + } + + src.cloneTo(dst); + } + + @SubscribeEvent + public void onServerChat(ServerChatEvent ev) { + String msg = ev.getMessage().trim().replaceAll("\\s+", " ").toLowerCase(); + StringBuilder sb = new StringBuilder(msg.length()); + for(int i = 0; i < msg.length(); i++) { + char chr = msg.charAt(i); + + if(chr != '.' && chr != ',' && chr != ';' && chr != '!' && chr != '?' && chr != ':' && chr != '\'' && chr != '\"' && chr != '`') + sb.append(chr); + } + + if(sb.toString().equals("ironic he could save others from death but not himself")) { + EntityPlayer ply = ev.getPlayer(); + ply.world.playSound(null, ply.posX, ply.posY, ply.posZ, soundIronic, SoundCategory.PLAYERS, 1.0f, 1.0f); + } + } + + @SubscribeEvent + public void onClientChat(ClientChatEvent ev) { + if(ev.getMessage().equals("!WD render recipes")) + PROXY.renderRecipes(); + } + + private boolean hasPlayerAdvancement(EntityPlayerMP ply, ResourceLocation rl) { + MinecraftServer server = PROXY.getServer(); + if(server == null) + return false; + + Advancement adv = server.getAdvancementManager().getAdvancement(rl); + return adv != null && ply.getAdvancements().getProgress(adv).isDone(); + } + + public static int getNextAvailablePadID() { + return INSTANCE.lastPadId++; + } + + private static SoundEvent registerSound(RegistryEvent.Register ev, String resName) { + ResourceLocation resLoc = new ResourceLocation("webdisplays", resName); + SoundEvent ret = new SoundEvent(resLoc); + ret.setRegistryName(resLoc); + + ev.getRegistry().register(ret); + return ret; + } + + private static void registerTrigger(Criterion ... criteria) { + for(Criterion c: criteria) + CriteriaTriggers.register(c); + } + + public static boolean isOpenComputersAvailable() { + return INSTANCE.hasOC; + } + + public static boolean isComputerCraftAvailable() { + return INSTANCE.hasCC; + } + + public static boolean isSiteBlacklisted(String url) { + try { + URL url2 = new URL(Util.addProtocol(url)); + return Arrays.stream(INSTANCE.blacklist).anyMatch(str -> str.equalsIgnoreCase(url2.getHost())); + } catch(MalformedURLException ex) { + return false; + } + } + + public static String applyBlacklist(String url) { + return isSiteBlacklisted(url) ? BLACKLIST_URL : url; + } + +} + diff --git a/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java b/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java new file mode 100644 index 0000000..3f1a9f3 --- /dev/null +++ b/src/main/java/net/montoyo/wd/block/BlockKeyboardRight.java @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.EnumPushReaction; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyInteger; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.core.DefaultPeripheral; +import net.montoyo.wd.core.IPeripheral; +import net.montoyo.wd.entity.TileEntityKeyboard; +import net.montoyo.wd.item.ItemLinker; +import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.Vector3i; + +import javax.annotation.Nonnull; +import java.util.Random; + +public class BlockKeyboardRight extends Block implements IPeripheral { + + public static final PropertyInteger facing = PropertyInteger.create("facing", 0, 3); + private static final IProperty[] properties = new IProperty[] { facing }; + public static final AxisAlignedBB KEYBOARD_AABB = new AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 1.0 / 16.0, 1.0); + + public BlockKeyboardRight() { + super(Material.ROCK); + setHardness(1.5f); + setResistance(10.f); + setUnlocalizedName("webdisplays.peripheral.keyboard"); + setRegistryName("keyboard"); + fullBlock = false; + } + + @Override + @Nonnull + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, properties); + } + + @Override + public int quantityDropped(Random random) { + return 0; + } + + @Override + public boolean isFullCube(IBlockState state) { + return false; + } + + @Override + public boolean isFullBlock(IBlockState state) { + return false; + } + + @Override + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + return false; + } + + @Override + public boolean isOpaqueCube(IBlockState state) { + return false; + } + + @Override + public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) { + return false; + } + + @Override + @Nonnull + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return KEYBOARD_AABB; + } + + @Override + @Nonnull + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(facing, meta); + } + + @Override + public int getMetaFromState(IBlockState state) { + return state.getValue(facing); + } + + @Override + @Nonnull + public ItemStack getPickBlock(@Nonnull IBlockState state, RayTraceResult target, @Nonnull World world, @Nonnull BlockPos pos, EntityPlayer player) { + return new ItemStack(WebDisplays.INSTANCE.blockPeripheral, 1, 0); + } + + private TileEntityKeyboard getTileEntity(World world, BlockPos pos) { + for(EnumFacing nf: EnumFacing.HORIZONTALS) { + BlockPos np = pos.add(nf.getDirectionVec()); + IBlockState ns = world.getBlockState(np); + + if(ns.getBlock() instanceof BlockPeripheral && ns.getValue(BlockPeripheral.type) == DefaultPeripheral.KEYBOARD) { + TileEntity te = world.getTileEntity(np); + if(te != null && te instanceof TileEntityKeyboard) + return (TileEntityKeyboard) te; + + break; + } + } + + return null; + } + + @Override + public boolean connect(World world, BlockPos pos, IBlockState state, Vector3i scrPos, BlockSide scrSide) { + TileEntityKeyboard keyboard = getTileEntity(world, pos); + return keyboard != null && keyboard.connect(world, pos, state, scrPos, scrSide); + } + + @Override + @Nonnull + public EnumPushReaction getMobilityFlag(IBlockState state) { + return EnumPushReaction.IGNORE; + } + + public static boolean checkNeighborhood(IBlockAccess world, BlockPos bp, BlockPos ignore) { + for(EnumFacing neighbor: EnumFacing.HORIZONTALS) { + BlockPos np = bp.add(neighbor.getDirectionVec()); + + if(ignore == null || !np.equals(ignore)) { + IBlockState state = world.getBlockState(np); + + if(state.getBlock() instanceof BlockPeripheral) { + if(state.getValue(BlockPeripheral.type) == DefaultPeripheral.KEYBOARD) + return false; + } else if(state.getBlock() instanceof BlockKeyboardRight) + return false; + } + } + + return true; + } + + public void removeLeftPiece(World world, BlockPos pos, boolean dropItem) { + for(EnumFacing nf: EnumFacing.HORIZONTALS) { + BlockPos np = pos.add(nf.getDirectionVec()); + IBlockState ns = world.getBlockState(np); + + if(ns.getBlock() instanceof BlockPeripheral && ns.getValue(BlockPeripheral.type) == DefaultPeripheral.KEYBOARD) { + if(dropItem) + ns.getBlock().dropBlockAsItem(world, np, ns, 0); + + world.setBlockToAir(np); + break; + } + } + } + + @Override + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block neighborType, BlockPos neighbor) { + if(world.isRemote) + return; + + if(neighbor.getX() == pos.getX() && neighbor.getY() == pos.getY() - 1 && neighbor.getZ() == pos.getZ() && world.isAirBlock(neighbor)) { + removeLeftPiece(world, pos, true); + world.setBlockToAir(pos); + } + } + + @Override + public boolean removedByPlayer(@Nonnull IBlockState state, World world, @Nonnull BlockPos pos, @Nonnull EntityPlayer ply, boolean willHarvest) { + if(!world.isRemote) + removeLeftPiece(world, pos, !ply.isCreative()); + + return super.removedByPlayer(state, world, pos, ply, willHarvest); + } + + @Override + public void onBlockDestroyedByExplosion(World world, BlockPos pos, Explosion explosionIn) { + if(!world.isRemote) + removeLeftPiece(world, pos, true); + } + + @Override + public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) { + double rpos = (entity.posY - ((double) pos.getY())) * 16.0; + if(!world.isRemote && rpos >= 1.0 && rpos <= 2.0 && Math.random() < 0.25) { + TileEntityKeyboard tek = getTileEntity(world, pos); + + if(tek != null) + tek.simulateCat(entity); + } + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + if(player.isSneaking()) + return false; + + if(player.getHeldItem(hand).getItem() instanceof ItemLinker) + return false; + + TileEntityKeyboard tek = getTileEntity(world, pos); + if(tek != null) + return tek.onRightClick(player, hand, BlockSide.values()[facing.ordinal()]); + + return false; + } + +} diff --git a/src/main/java/net/montoyo/wd/block/BlockPeripheral.java b/src/main/java/net/montoyo/wd/block/BlockPeripheral.java new file mode 100644 index 0000000..49be3ac --- /dev/null +++ b/src/main/java/net/montoyo/wd/block/BlockPeripheral.java @@ -0,0 +1,281 @@ +/* + * Copyright (C) 2019 BARBOTIN Nicolas + */ + +package net.montoyo.wd.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.EnumPushReaction; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.block.properties.PropertyInteger; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumBlockRenderType; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3i; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.NetworkRegistry; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.core.DefaultPeripheral; +import net.montoyo.wd.entity.*; +import net.montoyo.wd.item.ItemLinker; +import net.montoyo.wd.item.ItemPeripheral; +import net.montoyo.wd.net.client.CMessageCloseGui; +import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.Log; + +import javax.annotation.Nonnull; + +public class BlockPeripheral extends WDBlockContainer { + + public static final PropertyEnum type = PropertyEnum.create("type", DefaultPeripheral.class); + public static final PropertyInteger facing = PropertyInteger.create("facing", 0, 3); + private static final IProperty[] properties = new IProperty[] { type, facing }; + + public BlockPeripheral() { + super(Material.ROCK); + setHardness(1.5f); + setResistance(10.f); + setCreativeTab(WebDisplays.CREATIVE_TAB); + setName("peripheral"); + } + + @Override + protected ItemBlock createItemBlock() { + return new ItemPeripheral(this); + } + + @Override + @Nonnull + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, properties); + } + + @Override + @Nonnull + public IBlockState getStateForPlacement(@Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing nocare, float hitX, + float hitY, float hitZ, int meta, @Nonnull EntityLivingBase placer, EnumHand hand) { + int rot = MathHelper.floor(((double) (placer.rotationYaw * 4.0f / 360.0f)) + 2.5) & 3; + return getDefaultState().withProperty(type, DefaultPeripheral.fromMetadata(meta)).withProperty(facing, rot); + } + + @Override + public void getSubBlocks(CreativeTabs tab, NonNullList list) { + for(DefaultPeripheral dp : DefaultPeripheral.values()) + list.add(new ItemStack(getItem(), 1, dp.toMetadata(0))); + } + + @Override + @Nonnull + public IBlockState getStateFromMeta(int meta) { + DefaultPeripheral dp = DefaultPeripheral.fromMetadata(meta); + IBlockState state = getDefaultState().withProperty(type, dp); + + if(dp.hasFacing()) + state = state.withProperty(facing, (meta >> 2) & 3); + + return state; + } + + @Override + public int getMetaFromState(IBlockState state) { + return state.getValue(type).toMetadata(state.getValue(facing)); + } + + @Override + public TileEntity createNewTileEntity(@Nonnull World world, int meta) { + Class cls = DefaultPeripheral.fromMetadata(meta).getTEClass(); + if(cls == null) + return null; + + try { + return cls.newInstance(); + } catch(Throwable t) { + Log.errorEx("Couldn't instantiate peripheral TileEntity:", t); + } + + return null; + } + + @Override + @Nonnull + public EnumBlockRenderType getRenderType(IBlockState state) { + return EnumBlockRenderType.MODEL; + } + + @Override + public int damageDropped(IBlockState state) { + return state.getValue(type).toMetadata(0); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + if(player.isSneaking()) + return false; + + if(player.getHeldItem(hand).getItem() instanceof ItemLinker) + return false; + + TileEntity te = world.getTileEntity(pos); + + if(te instanceof TileEntityPeripheralBase) + return ((TileEntityPeripheralBase) te).onRightClick(player, hand, BlockSide.values()[facing.ordinal()]); + else if(te instanceof TileEntityServer) { + ((TileEntityServer) te).onPlayerRightClick(player); + return true; + } else + return false; + } + + @Override + public boolean isFullCube(IBlockState state) { + return state.getValue(type) != DefaultPeripheral.KEYBOARD; + } + + @Override + public boolean isFullBlock(IBlockState state) { + return state.getValue(type) != DefaultPeripheral.KEYBOARD; + } + + @Override + public boolean isNormalCube(IBlockState state, IBlockAccess world, BlockPos pos) { + return state.getValue(type) != DefaultPeripheral.KEYBOARD; + } + + @Override + public boolean isOpaqueCube(IBlockState state) { + return state.getValue(type) != DefaultPeripheral.KEYBOARD; + } + + @Override + public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) { + return state.getValue(type) != DefaultPeripheral.KEYBOARD; + } + + @Override + @Nonnull + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return state.getValue(type) == DefaultPeripheral.KEYBOARD ? BlockKeyboardRight.KEYBOARD_AABB : FULL_BLOCK_AABB; + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) { + if(world.isRemote) + return; + + if(state.getValue(type) == DefaultPeripheral.KEYBOARD) { + //Keyboard special treatment + int f = state.getValue(facing); + Vec3i dir = EnumFacing.getHorizontal(f).rotateY().getDirectionVec(); + BlockPos left = pos.add(dir); + BlockPos right = pos.subtract(dir); + + if(!world.isAirBlock(pos.down()) && BlockKeyboardRight.checkNeighborhood(world, pos, null)) { + if(world.isAirBlock(right) && !world.isAirBlock(right.down()) && BlockKeyboardRight.checkNeighborhood(world, right, pos)) { + world.setBlockState(right, WebDisplays.INSTANCE.blockKbRight.getDefaultState().withProperty(BlockKeyboardRight.facing, f)); + return; + } else if(world.isAirBlock(left) && !world.isAirBlock(left.down()) && BlockKeyboardRight.checkNeighborhood(world, left, pos)) { + world.setBlockState(left, state); + world.setBlockState(pos, WebDisplays.INSTANCE.blockKbRight.getDefaultState().withProperty(BlockKeyboardRight.facing, f)); + return; + } + } + + //Not good; remove this shit... + world.setBlockToAir(pos); + if(!(placer instanceof EntityPlayer) || !((EntityPlayer) placer).isCreative()) + dropBlockAsItem(world, pos, state, 0); + } else if(placer instanceof EntityPlayer) { + TileEntity te = world.getTileEntity(pos); + + if(te instanceof TileEntityServer) + ((TileEntityServer) te).setOwner((EntityPlayer) placer); + else if(te instanceof TileEntityInterfaceBase) + ((TileEntityInterfaceBase) te).setOwner((EntityPlayer) placer); + } + } + + @Override + @Nonnull + public EnumPushReaction getMobilityFlag(IBlockState state) { + return EnumPushReaction.IGNORE; + } + + private void removeRightPiece(World world, BlockPos pos) { + for(EnumFacing nf: EnumFacing.HORIZONTALS) { + BlockPos np = pos.add(nf.getDirectionVec()); + + if(world.getBlockState(np).getBlock() instanceof BlockKeyboardRight) { + world.setBlockToAir(np); + break; + } + } + } + + @Override + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block neighborType, BlockPos neighbor) { + TileEntity te = world.getTileEntity(pos); + if(te != null && te instanceof TileEntityPeripheralBase) + ((TileEntityPeripheralBase) te).onNeighborChange(neighborType, neighbor); + + if(world.isRemote || state.getValue(type) != DefaultPeripheral.KEYBOARD) + return; + + if(neighbor.getX() == pos.getX() && neighbor.getY() == pos.getY() - 1 && neighbor.getZ() == pos.getZ() && world.isAirBlock(neighbor)) { + removeRightPiece(world, pos); + world.setBlockToAir(pos); + dropBlockAsItem(world, pos, state, 0); + WebDisplays.NET_HANDLER.sendToAllAround(new CMessageCloseGui(pos), point(world, pos)); + } + } + + @Override + public void onBlockDestroyedByPlayer(World world, BlockPos pos, IBlockState state) { + if(!world.isRemote) { + if(state.getBlock() == this && state.getValue(type) == DefaultPeripheral.KEYBOARD) + removeRightPiece(world, pos); + + WebDisplays.NET_HANDLER.sendToAllAround(new CMessageCloseGui(pos), point(world, pos)); + } + } + + @Override + public void onBlockDestroyedByExplosion(World world, BlockPos pos, Explosion explosion) { + onBlockDestroyedByPlayer(world, pos, world.getBlockState(pos)); + } + + @Override + public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) { + if(!world.isRemote && world.getBlockState(pos).getValue(type) == DefaultPeripheral.KEYBOARD) { + double rpos = (entity.posY - ((double) pos.getY())) * 16.0; + + if(rpos >= 1.0 && rpos <= 2.0 && Math.random() < 0.25) { + TileEntity te = world.getTileEntity(pos); + + if(te != null && te instanceof TileEntityKeyboard) + ((TileEntityKeyboard) te).simulateCat(entity); + } + } + } + + private static NetworkRegistry.TargetPoint point(World world, BlockPos bp) { + return new NetworkRegistry.TargetPoint(world.provider.getDimension(), (double) bp.getX(), (double) bp.getY(), (double) bp.getZ(), 64.0); + } + +} diff --git a/src/main/java/net/montoyo/wd/block/BlockScreen.java b/src/main/java/net/montoyo/wd/block/BlockScreen.java new file mode 100644 index 0000000..5bdc5ac --- /dev/null +++ b/src/main/java/net/montoyo/wd/block/BlockScreen.java @@ -0,0 +1,400 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.EnumPushReaction; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.properties.PropertyInteger; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumBlockRenderType; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.property.ExtendedBlockState; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.common.property.IUnlistedProperty; +import net.minecraftforge.common.property.Properties; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.core.DefaultUpgrade; +import net.montoyo.wd.core.ScreenRights; +import net.montoyo.wd.core.IUpgrade; +import net.montoyo.wd.data.SetURLData; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.item.WDItem; +import net.montoyo.wd.utilities.*; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +public class BlockScreen extends WDBlockContainer { + + public static final PropertyBool hasTE = PropertyBool.create("haste"); + public static final PropertyBool emitting = PropertyBool.create("emitting"); + private static final IProperty[] properties = new IProperty[] { hasTE, emitting }; + public static final IUnlistedProperty[] sideFlags = new IUnlistedProperty[6]; + static { + for(int i = 0; i < sideFlags.length; i++) + sideFlags[i] = Properties.toUnlisted(PropertyInteger.create("neighbor" + i, 0, 15)); + } + + private static final int BAR_BOT = 1; + private static final int BAR_RIGHT = 2; + private static final int BAR_TOP = 4; + private static final int BAR_LEFT = 8; + + public BlockScreen() { + super(Material.ROCK); + setHardness(1.5f); + setResistance(10.f); + setCreativeTab(WebDisplays.CREATIVE_TAB); + setName("screen"); + setDefaultState(blockState.getBaseState().withProperty(hasTE, false).withProperty(emitting, false)); + } + + @Override + @Nonnull + public EnumBlockRenderType getRenderType(IBlockState state) { + return EnumBlockRenderType.MODEL; + } + + @Override + @Nonnull + protected BlockStateContainer createBlockState() { + return new ExtendedBlockState(this, properties, sideFlags); + } + + public static boolean isntScreenBlock(IBlockAccess world, Vector3i pos) { + return world.getBlockState(pos.toBlock()).getBlock() != WebDisplays.INSTANCE.blockScreen; + } + + @Override + @Nonnull + public IBlockState getExtendedState(@Nonnull IBlockState state, IBlockAccess world, BlockPos bpos) { + IExtendedBlockState ret = (IExtendedBlockState) blockState.getBaseState(); + Vector3i pos = new Vector3i(bpos); + + for(BlockSide side : BlockSide.values()) { + int icon = 0; + if(isntScreenBlock(world, side.up.clone().add(pos))) icon |= BAR_TOP; + if(isntScreenBlock(world, side.down.clone().add(pos))) icon |= BAR_BOT; + if(isntScreenBlock(world, side.left.clone().add(pos))) icon |= BAR_LEFT; + if(isntScreenBlock(world, side.right.clone().add(pos))) icon |= BAR_RIGHT; + + ret = ret.withProperty(sideFlags[side.ordinal()], icon); + } + + return ret; + } + + @Override + @Nonnull + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(hasTE, (meta & 1) != 0).withProperty(emitting, (meta & 2) != 0); + } + + @Override + public int getMetaFromState(IBlockState state) { + int ret = 0; + if(state.getValue(hasTE)) + ret |= 1; + + if(state.getValue(emitting)) + ret |= 2; + + return ret; + } + + @Override + public boolean onBlockActivated(World world, BlockPos bpos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + ItemStack heldItem = player.getHeldItem(hand); + if(heldItem.isEmpty()) + heldItem = null; //Easier to work with + else if(!(heldItem.getItem() instanceof IUpgrade)) + return false; + + if(world.isRemote) + return true; + + boolean sneaking = player.isSneaking(); + Vector3i pos = new Vector3i(bpos); + BlockSide side = BlockSide.values()[facing.ordinal()]; + + Multiblock.findOrigin(world, pos, side, null); + TileEntityScreen te = (TileEntityScreen) world.getTileEntity(pos.toBlock()); + + if(te != null && te.getScreen(side) != null) { + TileEntityScreen.Screen scr = te.getScreen(side); + + if(sneaking) { //Set URL + if((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) + Util.toast(player, "restrictions"); + else + (new SetURLData(pos, scr.side, scr.url)).sendTo((EntityPlayerMP) player); + + return true; + } else if(heldItem != null && !te.hasUpgrade(side, heldItem)) { //Add upgrade + if((scr.rightsFor(player) & ScreenRights.MANAGE_UPGRADES) == 0) { + Util.toast(player, "restrictions"); + return true; + } + + if(te.addUpgrade(side, heldItem, player, false)) { + if(!player.isCreative()) + heldItem.shrink(1); + + Util.toast(player, TextFormatting.AQUA, "upgradeOk"); + if(player instanceof EntityPlayerMP) + WebDisplays.INSTANCE.criterionUpgradeScreen.trigger(((EntityPlayerMP) player).getAdvancements()); + } else + Util.toast(player, "upgradeError"); + + return true; + } else { //Click + if((scr.rightsFor(player) & ScreenRights.CLICK) == 0) { + Util.toast(player, "restrictions"); + return true; + } + + Vector2i tmp = new Vector2i(); + if(hit2pixels(side, bpos, pos, scr, hitX, hitY, hitZ, tmp)) + te.click(side, tmp); + + return true; + } + } else if(sneaking) { + Util.toast(player, "turnOn"); + return true; + } + + Vector2i size = Multiblock.measure(world, pos, side); + if(size.x < 2 || size.y < 2) { + Util.toast(player, "tooSmall"); + return true; + } + + if(size.x > WebDisplays.INSTANCE.maxScreenX || size.y > WebDisplays.INSTANCE.maxScreenY) { + Util.toast(player, "tooBig", WebDisplays.INSTANCE.maxScreenX, WebDisplays.INSTANCE.maxScreenY); + return true; + } + + Vector3i err = Multiblock.check(world, pos, size, side); + if(err != null) { + Util.toast(player, "invalid", err.toString()); + return true; + } + + boolean created = false; + Log.info("Player %s (UUID %s) created a screen at %s of size %dx%d", player.getName(), player.getGameProfile().getId().toString(), pos.toString(), size.x, size.y); + + if(te == null) { + BlockPos bp = pos.toBlock(); + world.setBlockState(bp, world.getBlockState(bp).withProperty(hasTE, true)); + te = (TileEntityScreen) world.getTileEntity(bp); + created = true; + } + + te.addScreen(side, size, null, player, !created); + return true; + } + + @Override + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block, BlockPos source) { + if(block != this && !world.isRemote && !state.getValue(emitting)) { + for(BlockSide side: BlockSide.values()) { + Vector3i vec = new Vector3i(pos); + Multiblock.findOrigin(world, vec, side, null); + + TileEntityScreen tes = (TileEntityScreen) world.getTileEntity(vec.toBlock()); + if(tes != null && tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_INPUT)) { + EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()]; //Opposite face + vec.sub(pos.getX(), pos.getY(), pos.getZ()).neg(); + tes.updateJSRedstone(side, new Vector2i(vec.dot(side.right), vec.dot(side.up)), world.getRedstonePower(pos, facing)); + } + } + } + } + + public static boolean hit2pixels(BlockSide side, BlockPos bpos, Vector3i pos, TileEntityScreen.Screen scr, float hitX, float hitY, float hitZ, Vector2i dst) { + if(side.right.x < 0) + hitX -= 1.f; + + if(side.right.z < 0 || side == BlockSide.TOP || side == BlockSide.BOTTOM) + hitZ -= 1.f; + + Vector3f rel = new Vector3f(bpos.getX(), bpos.getY(), bpos.getZ()); + rel.sub((float) pos.x, (float) pos.y, (float) pos.z); + rel.add(hitX, hitY, hitZ); + + float cx = rel.dot(side.right.toFloat()) - 2.f / 16.f; + float cy = rel.dot(side.up.toFloat()) - 2.f / 16.f; + float sw = ((float) scr.size.x) - 4.f / 16.f; + float sh = ((float) scr.size.y) - 4.f / 16.f; + + cx /= sw; + cy /= sh; + + if(cx >= 0.f && cx <= 1.0 && cy >= 0.f && cy <= 1.f) { + if(side != BlockSide.BOTTOM) + cy = 1.f - cy; + + switch(scr.rotation) { + case ROT_90: + cy = 1.0f - cy; + break; + + case ROT_180: + cx = 1.0f - cx; + cy = 1.0f - cy; + break; + + case ROT_270: + cx = 1.0f - cx; + break; + + default: + break; + } + + cx *= (float) scr.resolution.x; + cy *= (float) scr.resolution.y; + + if(scr.rotation.isVertical) { + dst.x = (int) cy; + dst.y = (int) cx; + } else { + dst.x = (int) cx; + dst.y = (int) cy; + } + + return true; + } + + return false; + } + + @Nullable + @Override + public TileEntity createNewTileEntity(@Nonnull World world, int meta) { + if((meta & 1) == 0) + return null; + + return ((meta & 1) == 0) ? null : new TileEntityScreen(); + } + + /************************************************* DESTRUCTION HANDLING *************************************************/ + + private void onDestroy(World world, BlockPos pos, EntityPlayer ply) { + if(!world.isRemote) { + Vector3i bp = new Vector3i(pos); + Multiblock.BlockOverride override = new Multiblock.BlockOverride(bp, Multiblock.OverrideAction.SIMULATE); + + for(BlockSide bs: BlockSide.values()) + destroySide(world, bp.clone(), bs, override, ply); + } + } + + private void destroySide(World world, Vector3i pos, BlockSide side, Multiblock.BlockOverride override, EntityPlayer source) { + Multiblock.findOrigin(world, pos, side, override); + BlockPos bp = pos.toBlock(); + TileEntity te = world.getTileEntity(bp); + + if(te != null && te instanceof TileEntityScreen) { + ((TileEntityScreen) te).onDestroy(source); + world.setBlockState(bp, world.getBlockState(bp).withProperty(hasTE, false)); //Destroy tile entity. + } + } + + @Override + public boolean removedByPlayer(@Nonnull IBlockState state, World world, @Nonnull BlockPos pos, @Nonnull EntityPlayer ply, boolean willHarvest) { + onDestroy(world, pos, ply); + return super.removedByPlayer(state, world, pos, ply, willHarvest); + } + + @Override + public void onBlockDestroyedByExplosion(World world, BlockPos pos, Explosion explosion) { + onDestroy(world, pos, null); + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase whoDidThisShit, ItemStack stack) { + if(world.isRemote) + return; + + Multiblock.BlockOverride override = new Multiblock.BlockOverride(new Vector3i(pos), Multiblock.OverrideAction.IGNORE); + Vector3i[] neighbors = new Vector3i[6]; + + neighbors[0] = new Vector3i(pos.getX() + 1, pos.getY(), pos.getZ()); + neighbors[1] = new Vector3i(pos.getX() - 1, pos.getY(), pos.getZ()); + neighbors[2] = new Vector3i(pos.getX(), pos.getY() + 1, pos.getZ()); + neighbors[3] = new Vector3i(pos.getX(), pos.getY() - 1, pos.getZ()); + neighbors[4] = new Vector3i(pos.getX(), pos.getY(), pos.getZ() + 1); + neighbors[5] = new Vector3i(pos.getX(), pos.getY(), pos.getZ() - 1); + + for(Vector3i neighbor: neighbors) { + if(world.getBlockState(neighbor.toBlock()).getBlock() instanceof BlockScreen) { + for(BlockSide bs: BlockSide.values()) + destroySide(world, neighbor.clone(), bs, override, (whoDidThisShit instanceof EntityPlayer) ? ((EntityPlayer) whoDidThisShit) : null); + } + } + } + + @Override + @Nonnull + public EnumPushReaction getMobilityFlag(IBlockState state) { + return EnumPushReaction.IGNORE; + } + + @Override + public int getWeakPower(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side) { + return state.getValue(emitting) ? 15 : 0; + } + + @Override + public boolean canProvidePower(IBlockState state) { + return state.getValue(emitting); + } + + @Override + protected ItemBlock createItemBlock() { + return new ItemBlockScreen(this); + } + + private static class ItemBlockScreen extends ItemBlock implements WDItem { + + public ItemBlockScreen(BlockScreen screen) { + super(screen); + } + + @Nullable + @Override + public String getWikiName(@Nonnull ItemStack is) { + return "Screen"; + } + + @Override + public void addInformation(@Nullable ItemStack is, @Nullable World world, @Nullable List tt, @Nullable ITooltipFlag ttFlags) { + super.addInformation(is, world, tt, ttFlags); + WDItem.addInformation(tt); + } + + } + +} diff --git a/src/main/java/net/montoyo/wd/block/WDBlock.java b/src/main/java/net/montoyo/wd/block/WDBlock.java new file mode 100644 index 0000000..4dab4a7 --- /dev/null +++ b/src/main/java/net/montoyo/wd/block/WDBlock.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.item.ItemBlock; + +public abstract class WDBlock extends Block { + + protected ItemBlock itemBlock; + + public WDBlock(Material mat, MapColor color) { + super(mat, color); + } + + public WDBlock(Material material) { + super(material); + } + + protected void setName(String name) { + setUnlocalizedName("webdisplays." + name); + setRegistryName(name); + } + + public void makeItemBlock() { + if(itemBlock != null) + throw new RuntimeException("WDBlock.makeItemBlock() called twice!"); + + itemBlock = new ItemBlock(this); + itemBlock.setUnlocalizedName(getUnlocalizedName()); + itemBlock.setRegistryName(getRegistryName()); + } + + public ItemBlock getItem() { + return itemBlock; + } + +} diff --git a/src/main/java/net/montoyo/wd/block/WDBlockContainer.java b/src/main/java/net/montoyo/wd/block/WDBlockContainer.java new file mode 100644 index 0000000..4e14b43 --- /dev/null +++ b/src/main/java/net/montoyo/wd/block/WDBlockContainer.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.block; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.item.ItemBlock; + +public abstract class WDBlockContainer extends BlockContainer { + + protected ItemBlock itemBlock; + + public WDBlockContainer(Material material) { + super(material); + } + + protected void setName(String name) { + setUnlocalizedName("webdisplays." + name); + setRegistryName(name); + } + + protected abstract ItemBlock createItemBlock(); + + public void makeItemBlock() { + if(itemBlock != null) + throw new RuntimeException("WDBlockContainer.makeItemBlock() called twice!"); + + itemBlock = createItemBlock(); + itemBlock.setUnlocalizedName(getUnlocalizedName()); + itemBlock.setRegistryName(getRegistryName()); + } + + public ItemBlock getItem() { + return itemBlock; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java new file mode 100644 index 0000000..a9e5645 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -0,0 +1,790 @@ +/* + * Copyright (C) 2019 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client; + +import com.mojang.authlib.GameProfile; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.multiplayer.ClientAdvancementManager; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.SimpleReloadableResourceManager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.EnumHand; +import net.minecraft.util.EnumHandSide; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.client.event.*; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.client.resource.IResourceType; +import net.minecraftforge.client.resource.ISelectiveResourceReloadListener; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.montoyo.mcef.api.*; +import net.montoyo.wd.SharedProxy; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.client.gui.*; +import net.montoyo.wd.client.gui.loading.GuiLoader; +import net.montoyo.wd.client.renderers.*; +import net.montoyo.wd.core.DefaultUpgrade; +import net.montoyo.wd.core.HasAdvancement; +import net.montoyo.wd.core.JSServerRequest; +import net.montoyo.wd.data.GuiData; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.item.ItemMulti; +import net.montoyo.wd.item.WDItem; +import net.montoyo.wd.miniserv.client.Client; +import net.montoyo.wd.net.server.SMessagePadCtrl; +import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.utilities.*; +import org.lwjgl.input.Keyboard; +import paulscode.sound.SoundSystemConfig; + +import javax.annotation.Nonnull; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.*; +import java.util.function.Predicate; + +public class ClientProxy extends SharedProxy implements ISelectiveResourceReloadListener, IDisplayHandler, IJSQueryHandler { + + public class PadData { + + public IBrowser view; + private boolean isInHotbar; + private final int id; + private long lastURLSent; + + private PadData(String url, int id) { + view = mcef.createBrowser(WebDisplays.applyBlacklist(url)); + view.resize((int) WebDisplays.INSTANCE.padResX, (int) WebDisplays.INSTANCE.padResY); + isInHotbar = true; + this.id = id; + } + + } + + private Minecraft mc; + private final ArrayList modelBakers = new ArrayList<>(); + private net.montoyo.mcef.api.API mcef; + private MinePadRenderer minePadRenderer; + private JSQueryDispatcher jsDispatcher; + private LaserPointerRenderer laserPointerRenderer; + private GuiScreen nextScreen; + private boolean isF1Down; + + //Miniserv handling + private int miniservPort; + private boolean msClientStarted; + + //Client-side advancement hack + private final Field advancementToProgressField = findAdvancementToProgressField(); + private ClientAdvancementManager lastAdvMgr; + private Map advancementToProgress; + + //Laser pointer + private TileEntityScreen pointedScreen; + private BlockSide pointedScreenSide; + private long lastPointPacket; + + //Tracking + private final ArrayList screenTracking = new ArrayList<>(); + private int lastTracked = 0; + + //MinePads Management + private final HashMap padMap = new HashMap<>(); + private final ArrayList padList = new ArrayList<>(); + private int minePadTickCounter = 0; + + /**************************************** INHERITED METHODS ****************************************/ + + @Override + public void preInit() { + mc = Minecraft.getMinecraft(); + MinecraftForge.EVENT_BUS.register(this); + registerCustomBlockBaker(new ScreenBaker(), WebDisplays.INSTANCE.blockScreen); + + mcef = MCEFApi.getAPI(); + if(mcef != null) + mcef.registerScheme("wd", WDScheme.class, true, false, false, true, true, false, false); + } + + @Override + public void init() { + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityScreen.class, new ScreenRenderer()); + jsDispatcher = new JSQueryDispatcher(this); + minePadRenderer = new MinePadRenderer(); + laserPointerRenderer = new LaserPointerRenderer(); + } + + @Override + public void postInit() { + ((SimpleReloadableResourceManager) mc.getResourceManager()).registerReloadListener(this); + + if(mcef == null) + throw new RuntimeException("MCEF is missing"); + + mcef.registerDisplayHandler(this); + mcef.registerJSQueryHandler(this); + findAdvancementToProgressField(); + } + + @Override + public World getWorld(int dim) { + World ret = mc.world; + if(dim == CURRENT_DIMENSION) + return ret; + + if(ret.provider.getDimension() != dim) + throw new RuntimeException("Can't get non-current dimension " + dim + " from client."); + + return ret; + } + + @Override + public void enqueue(Runnable r) { + mc.addScheduledTask(r); + } + + @Override + public void displayGui(GuiData data) { + GuiScreen gui = data.createGui(mc.currentScreen, mc.world); + if(gui != null) + mc.displayGuiScreen(gui); + } + + @Override + public void trackScreen(TileEntityScreen tes, boolean track) { + int idx = -1; + for(int i = 0; i < screenTracking.size(); i++) { + if(screenTracking.get(i) == tes) { + idx = i; + break; + } + } + + if(track) { + if(idx < 0) + screenTracking.add(tes); + } else if(idx >= 0) + screenTracking.remove(idx); + } + + @Override + public void onAutocompleteResult(NameUUIDPair[] pairs) { + if(mc.currentScreen != null && mc.currentScreen instanceof WDScreen) { + if(pairs.length == 0) + ((WDScreen) mc.currentScreen).onAutocompleteFailure(); + else + ((WDScreen) mc.currentScreen).onAutocompleteResult(pairs); + } + } + + @Override + public GameProfile[] getOnlineGameProfiles() { + return new GameProfile[] { mc.player.getGameProfile() }; + } + + @Override + public void screenUpdateResolutionInGui(Vector3i pos, BlockSide side, Vector2i res) { + if(mc.currentScreen != null && mc.currentScreen instanceof GuiScreenConfig) { + GuiScreenConfig gsc = (GuiScreenConfig) mc.currentScreen; + + if(gsc.isForBlock(pos.toBlock(), side)) + gsc.updateResolution(res); + } + } + + @Override + public void screenUpdateRotationInGui(Vector3i pos, BlockSide side, Rotation rot) { + if(mc.currentScreen != null && mc.currentScreen instanceof GuiScreenConfig) { + GuiScreenConfig gsc = (GuiScreenConfig) mc.currentScreen; + + if(gsc.isForBlock(pos.toBlock(), side)) + gsc.updateRotation(rot); + } + } + + @Override + public void screenUpdateAutoVolumeInGui(Vector3i pos, BlockSide side, boolean av) { + if(mc.currentScreen != null && mc.currentScreen instanceof GuiScreenConfig) { + GuiScreenConfig gsc = (GuiScreenConfig) mc.currentScreen; + + if(gsc.isForBlock(pos.toBlock(), side)) + gsc.updateAutoVolume(av); + } + } + + @Override + public void displaySetPadURLGui(String padURL) { + mc.displayGuiScreen(new GuiSetURL2(padURL)); + } + + @Override + public void openMinePadGui(int padId) { + PadData pd = padMap.get(padId); + + if(pd != null && pd.view != null) + mc.displayGuiScreen(new GuiMinePad(pd)); + } + + @Override + @Nonnull + public HasAdvancement hasClientPlayerAdvancement(@Nonnull ResourceLocation rl) { + if(advancementToProgressField != null && mc.player != null && mc.player.connection != null) { + ClientAdvancementManager cam = mc.player.connection.getAdvancementManager(); + Advancement adv = cam.getAdvancementList().getAdvancement(rl); + + if(adv == null) + return HasAdvancement.DONT_KNOW; + + if(lastAdvMgr != cam) { + lastAdvMgr = cam; + + try { + advancementToProgress = (Map) advancementToProgressField.get(cam); + } catch(Throwable t) { + Log.warningEx("Could not get ClientAdvancementManager.advancementToProgress field", t); + advancementToProgress = null; + return HasAdvancement.DONT_KNOW; + } + } + + if(advancementToProgress == null) + return HasAdvancement.DONT_KNOW; + + Object progress = advancementToProgress.get(adv); + if(progress == null) + return HasAdvancement.NO; + + if(!(progress instanceof AdvancementProgress)) { + Log.warning("The ClientAdvancementManager.advancementToProgress map does not contain AdvancementProgress instances"); + advancementToProgress = null; //Invalidate this: it's wrong + return HasAdvancement.DONT_KNOW; + } + + return ((AdvancementProgress) progress).isDone() ? HasAdvancement.YES : HasAdvancement.NO; + } + + return HasAdvancement.DONT_KNOW; + } + + @Override + public MinecraftServer getServer() { + return mc.getIntegratedServer(); + } + + @Override + public void handleJSResponseSuccess(int reqId, JSServerRequest type, byte[] data) { + JSQueryDispatcher.ServerQuery q = jsDispatcher.fulfillQuery(reqId); + + if(q == null) + Log.warning("Received success response for invalid query ID %d of type %s", reqId, type.toString()); + else { + if(type == JSServerRequest.CLEAR_REDSTONE || type == JSServerRequest.SET_REDSTONE_AT) + q.success("{\"status\":\"success\"}"); + else + Log.warning("Received success response for query ID %d, but type is invalid", reqId); + } + } + + @Override + public void handleJSResponseError(int reqId, JSServerRequest type, int errCode, String err) { + JSQueryDispatcher.ServerQuery q = jsDispatcher.fulfillQuery(reqId); + + if(q == null) + Log.warning("Received error response for invalid query ID %d of type %s", reqId, type.toString()); + else + q.error(errCode, err); + } + + @Override + public void setMiniservClientPort(int port) { + miniservPort = port; + } + + @Override + public void startMiniservClient() { + if(miniservPort <= 0) { + Log.warning("Can't start miniserv client: miniserv is disabled"); + return; + } + + if(mc.player == null) { + Log.warning("Can't start miniserv client: player is null"); + return; + } + + SocketAddress saddr = mc.player.connection.getNetworkManager().channel().remoteAddress(); + if(saddr == null || !(saddr instanceof InetSocketAddress)) { + Log.warning("Miniserv client: remote address is not inet, assuming local address"); + saddr = new InetSocketAddress("127.0.0.1", 1234); + } + + InetSocketAddress msAddr = new InetSocketAddress(((InetSocketAddress) saddr).getAddress(), miniservPort); + Client.getInstance().start(msAddr); + msClientStarted = true; + } + + @Override + public boolean isMiniservDisabled() { + return miniservPort <= 0; + } + + @Override + public void closeGui(BlockPos bp, BlockSide bs) { + if(mc.currentScreen instanceof WDScreen) { + WDScreen scr = (WDScreen) mc.currentScreen; + + if(scr.isForBlock(bp, bs)) + mc.displayGuiScreen(null); + } + } + + @Override + public void renderRecipes() { + nextScreen = new RenderRecipe(); + } + + @Override + public boolean isShiftDown() { + return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); + } + + /**************************************** RESOURCE MANAGER METHODS ****************************************/ + + @Override + public void onResourceManagerReload(IResourceManager resourceManager, Predicate resourcePredicate) { + Log.info("Resource manager reload: clearing GUI cache..."); + GuiLoader.clearCache(); + } + + /**************************************** DISPLAY HANDLER METHODS ****************************************/ + + @Override + public void onAddressChange(IBrowser browser, String url) { + if(browser != null) { + long t = System.currentTimeMillis(); + + for(PadData pd: padList) { + if(pd.view == browser && t - pd.lastURLSent >= 1000) { + if(WebDisplays.isSiteBlacklisted(url)) + pd.view.loadURL(WebDisplays.BLACKLIST_URL); + else { + pd.lastURLSent = t; //Avoid spamming the server with porn URLs + WebDisplays.NET_HANDLER.sendToServer(new SMessagePadCtrl(pd.id, url)); + } + + break; + } + } + + for(TileEntityScreen tes: screenTracking) + tes.updateClientSideURL(browser, url); + } + } + + @Override + public void onTitleChange(IBrowser browser, String title) { + } + + @Override + public void onTooltip(IBrowser browser, String text) { + } + + @Override + public void onStatusMessage(IBrowser browser, String value) { + } + + /**************************************** JS HANDLER METHODS ****************************************/ + + @Override + public boolean handleQuery(IBrowser browser, long queryId, String query, boolean persistent, IJSQueryCallback cb) { + if(browser != null && persistent && query != null && cb != null) { + query = query.toLowerCase(); + + if(query.startsWith("webdisplays_")) { + query = query.substring(12); + + String args; + int parenthesis = query.indexOf('('); + if(parenthesis < 0) + args = null; + else { + if(query.indexOf(')') != query.length() - 1) { + cb.failure(400, "Malformed request"); + return true; + } + + args = query.substring(parenthesis + 1, query.length() - 1); + query = query.substring(0, parenthesis); + } + + if(jsDispatcher.canHandleQuery(query)) + jsDispatcher.enqueueQuery(browser, query, args, cb); + else + cb.failure(404, "Unknown WebDisplays query"); + + return true; + } + } + + return false; + } + + @Override + public void cancelQuery(IBrowser browser, long queryId) { + } + + /**************************************** EVENT METHODS ****************************************/ + + @SubscribeEvent + public void onStitchTextures(TextureStitchEvent.Pre ev) { + TextureMap texMap = ev.getMap(); + + if(texMap == mc.getTextureMapBlocks()) { + for(ResourceModelPair pair : modelBakers) + pair.getModel().loadTextures(texMap); + } + } + + @SubscribeEvent + public void onBakeModel(ModelBakeEvent ev) { + for(ResourceModelPair pair : modelBakers) + ev.getModelRegistry().putObject(pair.getResourceLocation(), pair.getModel()); + } + + @SubscribeEvent + public void onRegisterModels(ModelRegistryEvent ev) { + final WebDisplays wd = WebDisplays.INSTANCE; + + //I hope I'm doing this right because it doesn't seem like it... + registerItemModel(wd.blockScreen.getItem(), 0, "inventory"); + ModelLoader.setCustomModelResourceLocation(wd.blockPeripheral.getItem(), 0, new ModelResourceLocation("webdisplays:kb_inv", "normal")); + registerItemModel(wd.blockPeripheral.getItem(), 1, "facing=2,type=ccinterface"); + registerItemModel(wd.blockPeripheral.getItem(), 2, "facing=2,type=cointerface"); + registerItemModel(wd.blockPeripheral.getItem(), 3, "facing=0,type=remotectrl"); + registerItemModel(wd.blockPeripheral.getItem(), 7, "facing=0,type=redstonectrl"); + registerItemModel(wd.blockPeripheral.getItem(), 11, "facing=0,type=server"); + registerItemModel(wd.itemScreenCfg, 0, "normal"); + registerItemModel(wd.itemOwnerThief, 0, "normal"); + registerItemModel(wd.itemLinker, 0, "normal"); + registerItemModel(wd.itemMinePad, 0, "normal"); + registerItemModel(wd.itemMinePad, 1, "normal"); + registerItemModel(wd.itemLaserPointer, 0, "normal"); + registerItemMultiModels(wd.itemUpgrade); + registerItemMultiModels(wd.itemCraftComp); + registerItemMultiModels(wd.itemAdvIcon); + } + + @SubscribeEvent + public void onTick(TickEvent.ClientTickEvent ev) { + if(ev.phase == TickEvent.Phase.END) { + //Help + if(Keyboard.isKeyDown(Keyboard.KEY_F1)) { + if(!isF1Down) { + isF1Down = true; + + String wikiName = null; + if(mc.currentScreen instanceof WDScreen) + wikiName = ((WDScreen) mc.currentScreen).getWikiPageName(); + else if(mc.currentScreen instanceof GuiContainer) { + Slot slot = ((GuiContainer) mc.currentScreen).getSlotUnderMouse(); + + if(slot != null && slot.getHasStack() && slot.getStack().getItem() instanceof WDItem) + wikiName = ((WDItem) slot.getStack().getItem()).getWikiName(slot.getStack()); + } + + if(wikiName != null) + mcef.openExampleBrowser("https://montoyo.net/wdwiki/index.php/" + wikiName); + } + } else if(isF1Down) + isF1Down = false; + + //Workaround cuz chat sux + if(nextScreen != null && mc.currentScreen == null) { + mc.displayGuiScreen(nextScreen); + nextScreen = null; + } + + //Unload/load screens depending on client player distance + if(mc.player != null && !screenTracking.isEmpty()) { + int id = lastTracked % screenTracking.size(); + lastTracked++; + + TileEntityScreen tes = screenTracking.get(id); + double dist2 = mc.player.getDistanceSq(tes.getPos()); + + if(tes.isLoaded()) { + if(dist2 > WebDisplays.INSTANCE.unloadDistance2) + tes.unload(); + else if(WebDisplays.INSTANCE.enableSoundDistance) + tes.updateTrackDistance(dist2, SoundSystemConfig.getMasterGain()); + } else if(dist2 <= WebDisplays.INSTANCE.loadDistance2) + tes.load(); + } + + //Load/unload minePads depending on which item is in the player's hand + if(++minePadTickCounter >= 10) { + minePadTickCounter = 0; + EntityPlayer ep = mc.player; + + for(PadData pd: padList) + pd.isInHotbar = false; + + if(ep != null) { + updateInventory(ep.inventory.mainInventory, ep.getHeldItem(EnumHand.MAIN_HAND), 9); + updateInventory(ep.inventory.offHandInventory, ep.getHeldItem(EnumHand.OFF_HAND), 1); //Is this okay? + } + + //TODO: Check for GuiContainer.draggedStack + + for(int i = padList.size() - 1; i >= 0; i--) { + PadData pd = padList.get(i); + + if(!pd.isInHotbar) { + pd.view.close(); + pd.view = null; //This is for GuiMinePad, in case the player dies with the GUI open + padList.remove(i); + padMap.remove(pd.id); + } + } + } + + //Laser pointer raycast + boolean raycastHit = false; + + if(mc.player != null && mc.world != null && mc.player.getHeldItem(EnumHand.MAIN_HAND).getItem() == WebDisplays.INSTANCE.itemLaserPointer + && mc.gameSettings.keyBindUseItem.isKeyDown() + && (mc.objectMouseOver == null || mc.objectMouseOver.typeOfHit != RayTraceResult.Type.BLOCK)) { + laserPointerRenderer.isOn = true; + RayTraceResult result = raycast(64.0); //TODO: Make that distance configurable + + if(result != null) { + BlockPos bpos = result.getBlockPos(); + + if(result.typeOfHit == RayTraceResult.Type.BLOCK && mc.world.getBlockState(bpos).getBlock() == WebDisplays.INSTANCE.blockScreen) { + Vector3i pos = new Vector3i(result.getBlockPos()); + BlockSide side = BlockSide.values()[result.sideHit.ordinal()]; + + Multiblock.findOrigin(mc.world, pos, side, null); + TileEntityScreen te = (TileEntityScreen) mc.world.getTileEntity(pos.toBlock()); + + if(te != null && te.hasUpgrade(side, DefaultUpgrade.LASER_MOUSE)) { //hasUpgrade returns false is there's no screen on side 'side' + //Since rights aren't synchronized, let the server check them for us... + TileEntityScreen.Screen scr = te.getScreen(side); + + if(scr.browser != null) { + float hitX = ((float) result.hitVec.x) - (float) bpos.getX(); + float hitY = ((float) result.hitVec.y) - (float) bpos.getY(); + float hitZ = ((float) result.hitVec.z) - (float) bpos.getZ(); + Vector2i tmp = new Vector2i(); + + if(BlockScreen.hit2pixels(side, bpos, pos, scr, hitX, hitY, hitZ, tmp)) { + laserClick(te, side, scr, tmp); + raycastHit = true; + } + } + } + } + } + } else + laserPointerRenderer.isOn = false; + + if(!raycastHit) + deselectScreen(); + + //Handle JS queries + jsDispatcher.handleQueries(); + + //Miniserv + if(msClientStarted && mc.player == null) { + msClientStarted = false; + Client.getInstance().stop(); + } + } + } + + @SubscribeEvent + public void onRenderPlayerHand(RenderSpecificHandEvent ev) { + Item item = ev.getItemStack().getItem(); + IItemRenderer renderer; + + if(item == WebDisplays.INSTANCE.itemMinePad) + renderer = minePadRenderer; + else if(item == WebDisplays.INSTANCE.itemLaserPointer) + renderer = laserPointerRenderer; + else + return; + + EnumHandSide handSide = mc.player.getPrimaryHand(); + if(ev.getHand() == EnumHand.OFF_HAND) + handSide = handSide.opposite(); + + renderer.render(ev.getItemStack(), (handSide == EnumHandSide.RIGHT) ? 1.0f : -1.0f, ev.getSwingProgress(), ev.getEquipProgress()); + ev.setCanceled(true); + } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload ev) { + Log.info("World unloaded; killing screens..."); + int dim = ev.getWorld().provider.getDimension(); + + for(int i = screenTracking.size() - 1; i >= 0; i--) { + if(screenTracking.get(i).getWorld().provider.getDimension() == dim) //Could be world == ev.getWorld() + screenTracking.remove(i).unload(); + } + } + + /**************************************** OTHER METHODS ****************************************/ + + private void laserClick(TileEntityScreen tes, BlockSide side, TileEntityScreen.Screen scr, Vector2i hit) { + if(pointedScreen == tes && pointedScreenSide == side) { + long t = System.currentTimeMillis(); + + if(t - lastPointPacket >= 100) { + lastPointPacket = t; + WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_LASER_MOVE, hit)); + } + } else { + deselectScreen(); + pointedScreen = tes; + pointedScreenSide = side; + WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_LASER_DOWN, hit)); + } + } + + private void deselectScreen() { + if(pointedScreen != null && pointedScreenSide != null) { + WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.laserUp(pointedScreen, pointedScreenSide)); + pointedScreen = null; + pointedScreenSide = null; + } + } + + private RayTraceResult raycast(double dist) { + Vec3d start = mc.player.getPositionEyes(1.0f); + Vec3d lookVec = mc.player.getLook(1.0f); + Vec3d end = start.addVector(lookVec.x * dist, lookVec.y * dist, lookVec.z * dist); + + return mc.world.rayTraceBlocks(start, end, true, true, false); + } + + private void updateInventory(NonNullList inv, ItemStack heldStack, int cnt) { + for(int i = 0; i < cnt; i++) { + ItemStack item = inv.get(i); + + if(item.getItem() == WebDisplays.INSTANCE.itemMinePad) { + NBTTagCompound tag = item.getTagCompound(); + + if(tag != null && tag.hasKey("PadID")) + updatePad(tag.getInteger("PadID"), tag, item == heldStack); + } + } + } + + private void registerCustomBlockBaker(IModelBaker baker, Block block0) { + ModelResourceLocation normalLoc = new ModelResourceLocation(block0.getRegistryName(), "normal"); + ResourceModelPair pair = new ResourceModelPair(normalLoc, baker); + modelBakers.add(pair); + ModelLoader.setCustomStateMapper(block0, new StaticStateMapper(normalLoc)); + } + + private void registerItemModel(Item item, int meta, String variant) { + ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(item.getRegistryName(), variant)); + } + + private void registerItemMultiModels(ItemMulti item) { + Enum[] values = item.getEnumValues(); + + for(int i = 0; i < values.length; i++) + ModelLoader.setCustomModelResourceLocation(item, i, new ModelResourceLocation(item.getRegistryName().toString() + '_' + values[i], "normal")); + } + + private void updatePad(int id, NBTTagCompound tag, boolean isSelected) { + PadData pd = padMap.get(id); + + if(pd != null) + pd.isInHotbar = true; + else if(isSelected && tag.hasKey("PadURL")) { + pd = new PadData(tag.getString("PadURL"), id); + padMap.put(id, pd); + padList.add(pd); + } + } + + public MinePadRenderer getMinePadRenderer() { + return minePadRenderer; + } + + public PadData getPadByID(int id) { + return padMap.get(id); + } + + public net.montoyo.mcef.api.API getMCEF() { + return mcef; + } + + public static final class ScreenSidePair { + + public TileEntityScreen tes; + public BlockSide side; + + } + + public boolean findScreenFromBrowser(IBrowser browser, ScreenSidePair pair) { + for(TileEntityScreen tes: screenTracking) { + for(int i = 0; i < tes.screenCount(); i++) { + TileEntityScreen.Screen scr = tes.getScreen(i); + + if(scr.browser == browser) { + pair.tes = tes; + pair.side = scr.side; + return true; + } + } + } + + return false; + } + + private static Field findAdvancementToProgressField() { + Field[] fields = ClientAdvancementManager.class.getDeclaredFields(); + Optional result = Arrays.stream(fields).filter(f -> f.getType() == Map.class).findAny(); + + if(result.isPresent()) { + try { + Field ret = result.get(); + ret.setAccessible(true); + return ret; + } catch(Throwable t) { + t.printStackTrace(); + } + } + + Log.warning("ClientAdvancementManager.advancementToProgress field could not be found"); + return null; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java b/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java new file mode 100644 index 0000000..ba67596 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java @@ -0,0 +1,370 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.montoyo.mcef.api.IBrowser; +import net.montoyo.mcef.api.IJSQueryCallback; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.core.DefaultUpgrade; +import net.montoyo.wd.core.IScreenQueryHandler; +import net.montoyo.wd.core.IUpgrade; +import net.montoyo.wd.core.JSServerRequest; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.utilities.*; + +import java.util.*; + +@SideOnly(Side.CLIENT) +public final class JSQueryDispatcher { + + private static final class QueryData { + + private final IBrowser browser; + private final String query; + private final String args; + private final IJSQueryCallback callback; + + private QueryData(IBrowser b, String q, String a, IJSQueryCallback cb) { + browser = b; + query = q; + args = a; + callback = cb; + } + + } + + public static final class ServerQuery { + + private static int lastId = 0; + + private final TileEntityScreen tes; + private final BlockSide side; + private final IJSQueryCallback callback; + private final int id; + + private ServerQuery(TileEntityScreen t, BlockSide s, IJSQueryCallback cb) { + tes = t; + side = s; + callback = cb; + id = lastId++; + } + + public TileEntityScreen getTileEntity() { + return tes; + } + + public BlockSide getSide() { + return side; + } + + public TileEntityScreen.Screen getScreen() { + return tes.getScreen(side); + } + + public void success(String resp) { + callback.success(resp); + } + + public void error(int errId, String errStr) { + callback.failure(errId, errStr); + } + + } + + private final ClientProxy proxy; + private final ArrayDeque queue = new ArrayDeque<>(); + private final ClientProxy.ScreenSidePair lookupResult = new ClientProxy.ScreenSidePair(); + private final HashMap handlers = new HashMap<>(); + private final ArrayList serverQueries = new ArrayList<>(); + private final Minecraft mc = Minecraft.getMinecraft(); + + public JSQueryDispatcher(ClientProxy proxy) { + this.proxy = proxy; + registerDefaults(); + } + + public void enqueueQuery(IBrowser b, String q, String a, IJSQueryCallback cb) { + synchronized(queue) { + queue.offer(new QueryData(b, q, a, cb)); + } + } + + public void handleQueries() { + while(true) { + QueryData next; + synchronized(queue) { + next = queue.poll(); + } + + if(next == null) + break; + + if(proxy.findScreenFromBrowser(next.browser, lookupResult)) { + Object[] args = (next.args == null) ? new Object[0] : parseArgs(next.args); + + if(args == null) + next.callback.failure(400, "Malformed request parameters"); + else { + try { + handlers.get(next.query).handleQuery(next.callback, lookupResult.tes, lookupResult.side, args); + } catch(Throwable t) { + Log.warningEx("Could not execute JS query %s(%s)", t, next.query, (next.args == null) ? "" : next.args); + next.callback.failure(500, "Internal error"); + } + } + } else + next.callback.failure(403, "A screen is required"); + } + } + + public boolean canHandleQuery(String q) { + return handlers.containsKey(q); + } + + private static Object[] parseArgs(String args) { + ArrayList array = new ArrayList<>(); + int lastIdx = 0; + boolean inString = false; + boolean escape = false; + boolean hadString = false; + + for(int i = 0; i < args.length(); i++) { + char chr = args.charAt(i); + + if(inString) { + if(escape) + escape = false; + else { + if(chr == '\"') + inString = false; + else if(chr == '\\') + escape = true; + } + } else if(chr == '\"') { + if(hadString) + return null; + + inString = true; + hadString = true; + } else if(chr == ',') { + array.add(args.substring(lastIdx, i).trim()); + lastIdx = i + 1; + hadString = false; + } + } + + if(inString) + return null; //Non terminated string + + array.add(args.substring(lastIdx).trim()); + Object[] ret = new Object[array.size()]; + + for(int i = 0; i < ret.length; i++) { + String str = array.get(i); + if(str.isEmpty()) + return null; //Nah... + + if(str.charAt(0) == '\"') //String + ret[i] = str.substring(1, str.length() - 1); + else { + try { + ret[i] = Double.parseDouble(str); + } catch(NumberFormatException ex) { + return null; + } + } + } + + return ret; + } + + public void register(String query, IScreenQueryHandler handler) { + handlers.put(query.toLowerCase(), handler); + } + + public ServerQuery fulfillQuery(int id) { + int toRemove = -1; + + for(int i = 0; i < serverQueries.size(); i++) { + ServerQuery sq = serverQueries.get(i); + + if(sq.id == id) { + toRemove = i; + break; + } + } + + if(toRemove < 0) + return null; + else + return serverQueries.remove(toRemove); + } + + private void makeServerQuery(TileEntityScreen tes, BlockSide side, IJSQueryCallback cb, JSServerRequest type, Object ... data) { + ServerQuery ret = new ServerQuery(tes, side, cb); + serverQueries.add(ret); + + WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.jsRequest(tes, side, ret.id, type, data)); + } + + private void registerDefaults() { + register("GetSize", (cb, tes, side, args) -> { + Vector2i size = tes.getScreen(side).size; + cb.success("{\"x\":" + size.x + ",\"y\":" + size.y + "}"); + }); + + register("GetRedstoneAt", (cb, tes, side, args) -> { + if(!tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_INPUT)) { + cb.failure(403, "Missing upgrade"); + return; + } + + if(args.length == 2 && args[0] instanceof Double && args[1] instanceof Double) { + TileEntityScreen.Screen scr = tes.getScreen(side); + int x = ((Double) args[0]).intValue(); + int y = ((Double) args[1]).intValue(); + + if(x < 0 || x >= scr.size.x || y < 0 || y >= scr.size.y) + cb.failure(403, "Out of range"); + else { + BlockPos bpos = (new Vector3i(tes.getPos())).addMul(side.right, x).addMul(side.up, y).toBlock(); + int level = tes.getWorld().getBlockState(bpos).getValue(BlockScreen.emitting) ? 0 : tes.getWorld().getRedstonePower(bpos, EnumFacing.VALUES[side.reverse().ordinal()]); + cb.success("{\"level\":" + level + "}"); + } + } else + cb.failure(400, "Wrong arguments"); + }); + + register("GetRedstoneArray", (cb, tes, side, args) -> { + if(tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_INPUT)) { + final EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()]; + final StringJoiner resp = new StringJoiner(",", "{\"levels\":[", "]}"); + + tes.forEachScreenBlocks(side, bp -> { + if(tes.getWorld().getBlockState(bp).getValue(BlockScreen.emitting)) + resp.add("0"); + else + resp.add("" + tes.getWorld().getRedstonePower(bp, facing)); + }); + + cb.success(resp.toString()); + } else + cb.failure(403, "Missing upgrade"); + }); + + register("ClearRedstone", (cb, tes, side, args) -> { + if(tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_OUTPUT)) { + if(tes.getScreen(side).owner.uuid.equals(mc.player.getGameProfile().getId())) + makeServerQuery(tes, side, cb, JSServerRequest.CLEAR_REDSTONE); + else + cb.success("{\"status\":\"notOwner\"}"); + } else + cb.failure(403, "Missing upgrade"); + }); + + register("SetRedstoneAt", (cb, tes, side, args) -> { + if(args.length != 3 || !Arrays.stream(args).allMatch((obj) -> obj instanceof Double)) { + cb.failure(400, "Wrong arguments"); + return; + } + + if(!tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_OUTPUT)) { + cb.failure(403, "Missing upgrade"); + return; + } + + if(!tes.getScreen(side).owner.uuid.equals(mc.player.getGameProfile().getId())) { + cb.success("{\"status\":\"notOwner\"}"); + return; + } + + int x = ((Double) args[0]).intValue(); + int y = ((Double) args[1]).intValue(); + boolean state = ((Double) args[2]) > 0.0; + + Vector2i size = tes.getScreen(side).size; + if(x < 0 || x >= size.x || y < 0 || y >= size.y) { + cb.failure(403, "Out of range"); + return; + } + + makeServerQuery(tes, side, cb, JSServerRequest.SET_REDSTONE_AT, x, y, state); + }); + + register("IsEmitting", (cb, tes, side, args) -> { + if(!tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_OUTPUT)) { + cb.failure(403, "Missing upgrade"); + return; + } + + if(args.length == 2 && args[0] instanceof Double && args[1] instanceof Double) { + TileEntityScreen.Screen scr = tes.getScreen(side); + int x = ((Double) args[0]).intValue(); + int y = ((Double) args[1]).intValue(); + + if(x < 0 || x >= scr.size.x || y < 0 || y >= scr.size.y) + cb.failure(403, "Out of range"); + else { + BlockPos bpos = (new Vector3i(tes.getPos())).addMul(side.right, x).addMul(side.up, y).toBlock(); + boolean e = tes.getWorld().getBlockState(bpos).getValue(BlockScreen.emitting); + cb.success("{\"emitting\":" + (e ? "true" : "false") + "}"); + } + } else + cb.failure(400, "Wrong arguments"); + }); + + register("GetEmissionArray", (cb, tes, side, args) -> { + if(tes.hasUpgrade(side, DefaultUpgrade.REDSTONE_OUTPUT)) { + final StringJoiner resp = new StringJoiner(",", "{\"emission\":[", "]}"); + tes.forEachScreenBlocks(side, bp -> resp.add(tes.getWorld().getBlockState(bp).getValue(BlockScreen.emitting) ? "1" : "0")); + cb.success(resp.toString()); + } else + cb.failure(403, "Missing upgrade"); + }); + + register("GetLocation", (cb, tes, side, args) -> { + if(!tes.hasUpgrade(side, DefaultUpgrade.GPS)) { + cb.failure(403, "Missing upgrade"); + return; + } + + BlockPos bp = tes.getPos(); + cb.success("{\"x\":" + bp.getX() + ",\"y\":" + bp.getY() + ",\"z\":" + bp.getZ() + ",\"side\":\"" + side + "\"}"); + }); + + register("GetUpgrades", (cb, tes, side, args) -> { + final StringBuilder sb = new StringBuilder("{\"upgrades\":["); + final ArrayList upgrades = tes.getScreen(side).upgrades; + + for(int i = 0; i < upgrades.size(); i++) { + if(i > 0) + sb.append(','); + + sb.append('\"'); + sb.append(Util.addSlashes(((IUpgrade) upgrades.get(i).getItem()).getJSName(upgrades.get(i)))); + sb.append('\"'); + } + + cb.success(sb.append("]}").toString()); + }); + + register("IsOwner", (cb, tes, side, args) -> { + boolean res = (tes.getScreen(side).owner != null && tes.getScreen(side).owner.uuid.equals(mc.player.getGameProfile().getId())); + cb.success("{\"isOwner\":" + (res ? "true}" : "false}")); + }); + + register("GetRotation", (cb, tes, side, args) -> cb.success("{\"rotation\":" + tes.getScreen(side).rotation.ordinal() + "}")); + register("GetSide", (cb, tes, side, args) -> cb.success("{\"side\":" + tes.getScreen(side).side.ordinal() + "}")); + } + +} diff --git a/src/main/java/net/montoyo/wd/client/ResourceModelPair.java b/src/main/java/net/montoyo/wd/client/ResourceModelPair.java new file mode 100644 index 0000000..c1f6664 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/ResourceModelPair.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client; + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.montoyo.wd.client.renderers.IModelBaker; + +public class ResourceModelPair { + + private final ModelResourceLocation resLoc; + private final IModelBaker model; + + public ResourceModelPair(ModelResourceLocation rl, IModelBaker m) { + resLoc = rl; + model = m; + } + + public ModelResourceLocation getResourceLocation() { + return resLoc; + } + + public IModelBaker getModel() { + return model; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/StaticStateMapper.java b/src/main/java/net/montoyo/wd/client/StaticStateMapper.java new file mode 100644 index 0000000..ad5f825 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/StaticStateMapper.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.block.statemap.StateMapperBase; + +import javax.annotation.Nonnull; + +public class StaticStateMapper extends StateMapperBase { + + private final ModelResourceLocation resLoc; + + public StaticStateMapper(ModelResourceLocation rl) { + resLoc = rl; + } + + @Override + @Nonnull + protected ModelResourceLocation getModelResourceLocation(@Nonnull IBlockState state) { + return resLoc; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/WDScheme.java b/src/main/java/net/montoyo/wd/client/WDScheme.java new file mode 100644 index 0000000..8baa669 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/WDScheme.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client; + +import net.montoyo.mcef.api.IScheme; +import net.montoyo.mcef.api.ISchemeResponseData; +import net.montoyo.mcef.api.ISchemeResponseHeaders; +import net.montoyo.mcef.api.SchemePreResponse; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.miniserv.Constants; +import net.montoyo.wd.miniserv.client.Client; +import net.montoyo.wd.miniserv.client.ClientTaskGetFile; +import net.montoyo.wd.utilities.Log; +import net.montoyo.wd.utilities.Util; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.UUID; + +public class WDScheme implements IScheme { + + private static final String ERROR_PAGE = "

%d %s


Miniserv powered by WebDisplays"; + private ClientTaskGetFile task; + private boolean isErrorPage; + + @Override + public SchemePreResponse processRequest(String url) { + url = url.substring("wd://".length()); + + int pos = url.indexOf('/'); + if(pos < 0) + return SchemePreResponse.NOT_HANDLED; + + String uuidStr = url.substring(0, pos); + String fileStr = url.substring(pos + 1); + + try { + fileStr = URLDecoder.decode(fileStr, "UTF-8"); + } catch(UnsupportedEncodingException ex) { + Log.warningEx("UTF-8 isn't supported... yeah... and I'm a billionaire...", ex); + } + + if(uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr)) + return SchemePreResponse.NOT_HANDLED; + + UUID uuid; + try { + uuid = UUID.fromString(uuidStr); + } catch(IllegalArgumentException ex) { + return SchemePreResponse.NOT_HANDLED; //Invalid UUID + } + + task = new ClientTaskGetFile(uuid, fileStr); + return Client.getInstance().addTask(task) ? SchemePreResponse.HANDLED_CONTINUE : SchemePreResponse.NOT_HANDLED; + } + + @Override + public void getResponseHeaders(ISchemeResponseHeaders resp) { + Log.info("Waiting for response..."); + int status = task.waitForResponse(); + Log.info("Got response %d", status); + + if(status == 0) { + //OK + int extPos = task.getFileName().lastIndexOf('.'); + if(extPos >= 0) { + String mime = ((ClientProxy) WebDisplays.PROXY).getMCEF().mimeTypeFromExtension(task.getFileName().substring(extPos + 1)); + + if(mime != null) + resp.setMimeType(mime); + } + + resp.setStatus(200); + resp.setStatusText("OK"); + resp.setResponseLength(-1); + return; + } + + int errCode; + String errStr; + + if(status == Constants.GETF_STATUS_NOT_FOUND) { + errCode = 404; + errStr = "Not Found"; + } else { + errCode = 500; + errStr = "Internal Server Error"; + } + + resp.setStatus(errCode); + resp.setStatusText(errStr); + + try { + dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes("UTF-8"); + dataOffset = 0; + amountToWrite = dataToWrite.length; + isErrorPage = true; + resp.setResponseLength(amountToWrite); + } catch(UnsupportedEncodingException ex) { + resp.setResponseLength(0); + } + } + + private byte[] dataToWrite; + private int dataOffset; + private int amountToWrite; + + @Override + public boolean readResponse(ISchemeResponseData data) { + if(dataToWrite == null) { + if(isErrorPage) { + data.setAmountRead(0); + return false; + } + + dataToWrite = task.waitForData(); + dataOffset = 3; //packet ID + size + amountToWrite = task.getDataLength(); + + if(amountToWrite <= 0) { + dataToWrite = null; + data.setAmountRead(0); + return false; + } + } + + int toWrite = data.getBytesToRead(); + if(toWrite > amountToWrite) + toWrite = amountToWrite; + + System.arraycopy(dataToWrite, dataOffset, data.getDataArray(), 0, toWrite); + data.setAmountRead(toWrite); + + dataOffset += toWrite; + amountToWrite -= toWrite; + + if(amountToWrite <= 0) { + if(!isErrorPage) + task.nextData(); + + dataToWrite = null; + } + + return true; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/CommandHandler.java b/src/main/java/net/montoyo/wd/client/gui/CommandHandler.java new file mode 100644 index 0000000..ed4f299 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/CommandHandler.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface CommandHandler { + + String value(); + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java new file mode 100644 index 0000000..e4d5739 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/GuiKeyboard.java @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2019 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.client.gui.controls.Button; +import net.montoyo.wd.client.gui.controls.Control; +import net.montoyo.wd.client.gui.controls.Label; +import net.montoyo.wd.client.gui.loading.FillControl; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.Log; +import net.montoyo.wd.utilities.TypeData; +import net.montoyo.wd.utilities.Util; +import org.lwjgl.input.Keyboard; + +import java.io.*; +import java.util.ArrayList; +import java.util.Map; + +@SideOnly(Side.CLIENT) +public class GuiKeyboard extends WDScreen { + + private static final String WARNING_FNAME = "wd_keyboard_warning.txt"; + + private TileEntityScreen tes; + private BlockSide side; + private final ArrayList evStack = new ArrayList<>(); + private BlockPos kbPos; + private boolean showWarning = true; + + @FillControl + private Label lblInfo; + + @FillControl + private Button btnOk; + + public GuiKeyboard() { + } + + public GuiKeyboard(TileEntityScreen tes, BlockSide side, BlockPos kbPos) { + this.tes = tes; + this.side = side; + this.kbPos = kbPos; + } + + @Override + protected void addLoadCustomVariables(Map vars) { + vars.put("showWarning", showWarning ? 1.0 : 0.0); + } + + @Override + public void initGui() { + super.initGui(); + + if(mc.isIntegratedServerRunning() && mc.getIntegratedServer() != null && !mc.getIntegratedServer().getPublic()) + showWarning = false; //NO NEED + else + showWarning = !hasUserReadWarning(); + + loadFrom(new ResourceLocation("webdisplays", "gui/keyboard.json")); + + if(showWarning) { + int maxLabelW = 0; + int totalH = 0; + + for(Control ctrl : controls) { + if(ctrl != lblInfo && ctrl instanceof Label) { + if(ctrl.getWidth() > maxLabelW) + maxLabelW = ctrl.getWidth(); + + totalH += ctrl.getHeight(); + ctrl.setPos((width - ctrl.getWidth()) / 2, 0); + } + } + + btnOk.setWidth(maxLabelW); + btnOk.setPos((width - maxLabelW) / 2, 0); + totalH += btnOk.getHeight(); + + int y = (height - totalH) / 2; + for(Control ctrl : controls) { + if(ctrl != lblInfo) { + ctrl.setPos(ctrl.getX(), y); + y += ctrl.getHeight(); + } + } + } else { + mc.inGameHasFocus = true; + mc.mouseHelper.grabMouseCursor(); + } + + defaultBackground = showWarning; + syncTicks = 5; + } + + @Override + public void handleInput() { + if(showWarning) { + try { + super.handleInput(); + } catch(IOException ex) { + Log.warningEx("Caught exception while handling screen input", ex); + } + + return; + } + + if(Keyboard.isCreated()) { + while(Keyboard.next()) { + if(Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) + mc.displayGuiScreen(null); + else { + char chr = Keyboard.getEventCharacter(); + + if(Keyboard.getEventKeyState()) { + int kc = Keyboard.getEventKey(); + + evStack.add(new TypeData(TypeData.Action.PRESS, kc, chr)); + evStack.add(new TypeData(TypeData.Action.RELEASE, kc, chr)); + } + + if(chr != 0) + evStack.add(new TypeData(TypeData.Action.TYPE, 0, chr)); + } + } + + if(!evStack.isEmpty() && !syncRequested()) + requestSync(); + } + } + + @Override + protected void sync() { + if(!evStack.isEmpty()) { + WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.type(tes, side, WebDisplays.GSON.toJson(evStack), kbPos)); + evStack.clear(); + } + } + + @GuiSubscribe + public void onClick(Button.ClickEvent ev) { + if(showWarning && ev.getSource() == btnOk) { + writeUserAcknowledge(); + + for(Control ctrl: controls) { + if(ctrl instanceof Label) { + Label lbl = (Label) ctrl; + lbl.setVisible(!lbl.isVisible()); + } + } + + btnOk.setDisabled(true); + btnOk.setVisible(false); + showWarning = false; + defaultBackground = false; + mc.inGameHasFocus = true; + mc.mouseHelper.grabMouseCursor(); + } + } + + private boolean hasUserReadWarning() { + try { + File f = new File(mc.mcDataDir, WARNING_FNAME); + + if(f.exists()) { + BufferedReader br = new BufferedReader(new FileReader(f)); + String str = br.readLine(); + Util.silentClose(br); + + return str != null && str.trim().equalsIgnoreCase("read"); + } + } catch(Throwable t) { + Log.warningEx("Can't know if user has already read the warning", t); + } + + return false; + } + + private void writeUserAcknowledge() { + try { + File f = new File(mc.mcDataDir, WARNING_FNAME); + + BufferedWriter bw = new BufferedWriter(new FileWriter(f)); + bw.write("read\n"); + Util.silentClose(bw); + } catch(Throwable t) { + Log.warningEx("Can't write that the user read the warning", t); + } + } + + @Override + public boolean isForBlock(BlockPos bp, BlockSide side) { + return bp.equals(kbPos) || (bp.equals(tes.getPos()) && side == this.side); + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java new file mode 100644 index 0000000..60d4bf0 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/GuiMinePad.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2019 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.client.ClientProxy; +import net.montoyo.wd.utilities.BlockSide; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +import static org.lwjgl.opengl.GL11.*; + +@SideOnly(Side.CLIENT) +public class GuiMinePad extends WDScreen { + + private ClientProxy.PadData pad; + private double vx; + private double vy; + private double vw; + private double vh; + + public GuiMinePad() { + } + + public GuiMinePad(ClientProxy.PadData pad) { + this.pad = pad; + } + + @Override + public void initGui() { + super.initGui(); + + vw = ((double) width) - 32.0f; + vh = vw / WebDisplays.PAD_RATIO; + vx = 16.0f; + vy = (((double) height) - vh) / 2.0f; + } + + private static void addRect(BufferBuilder bb, double x, double y, double w, double h) { + bb.pos(x, y, 0.0).endVertex(); + bb.pos(x + w, y, 0.0).endVertex(); + bb.pos(x + w, y + h, 0.0).endVertex(); + bb.pos(x, y + h, 0.0).endVertex(); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float ptt) { + drawDefaultBackground(); + + glDisable(GL_TEXTURE_2D); + glDisable(GL_CULL_FACE); + glColor4f(0.73f, 0.73f, 0.73f, 1.0f); + + Tessellator t = Tessellator.getInstance(); + BufferBuilder bb = t.getBuffer(); + bb.begin(GL_QUADS, DefaultVertexFormats.POSITION); + addRect(bb, vx, vy - 16, vw, 16); + addRect(bb, vx, vy + vh, vw, 16); + addRect(bb, vx - 16, vy, 16, vh); + addRect(bb, vx + vw, vy, 16, vh); + t.draw(); + + glEnable(GL_TEXTURE_2D); + + if(pad.view != null) { + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + pad.view.draw(vx, vy + vh, vx + vw, vy); + } + + glEnable(GL_CULL_FACE); + } + + @Override + public void handleInput() { + while(Keyboard.next()) { + char key = Keyboard.getEventCharacter(); + int keycode = Keyboard.getEventKey(); + boolean pressed = Keyboard.getEventKeyState(); + + if(Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + mc.displayGuiScreen(null); + return; + } + + if(pad.view != null) { + if(pressed) + pad.view.injectKeyPressedByKeyCode(keycode, key, 0); + else + pad.view.injectKeyReleasedByKeyCode(keycode, key, 0); + + if(key != 0) + pad.view.injectKeyTyped(key, 0); + } + } + + int vx = screen2DisplayX((int) this.vx); + int vy = screen2DisplayY((int) this.vy); + int vh = screen2DisplayX((int) this.vh); + int vw = screen2DisplayY((int) this.vw); + + while(Mouse.next()) { + int btn = Mouse.getEventButton(); + boolean pressed = Mouse.getEventButtonState(); + int sx = Mouse.getEventX(); + int sy = Mouse.getEventY(); + + if(pad.view != null && sx >= vx && sx <= vx + vw && sy >= vy && sy <= vy + vh) { + sx -= vx; + sy -= vy; + sy = vh - sy; + + //Scale again according to the webview + sx = (int) (((double) sx) / ((double) vw) * WebDisplays.INSTANCE.padResX); + sy = (int) (((double) sy) / ((double) vh) * WebDisplays.INSTANCE.padResY); + + if(btn == -1) + pad.view.injectMouseMove(sx, sy, 0, false); + else + pad.view.injectMouseButton(sx, sy, 0, btn + 1, pressed, 1); + } + } + } + + @Override + public void updateScreen() { + if(pad.view == null) + mc.displayGuiScreen(null); //In case the user dies with the pad in the hand + } + + @Override + public boolean isForBlock(BlockPos bp, BlockSide side) { + return false; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java b/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java new file mode 100644 index 0000000..823a5eb --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/GuiRedstoneCtrl.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2019 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.montoyo.mcef.api.API; +import net.montoyo.wd.client.ClientProxy; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.client.gui.controls.Button; +import net.montoyo.wd.client.gui.controls.TextField; +import net.montoyo.wd.client.gui.loading.FillControl; +import net.montoyo.wd.net.server.SMessageRedstoneCtrl; +import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.Vector3i; + +import javax.annotation.Nullable; + +public class GuiRedstoneCtrl extends WDScreen { + + private int dimension; + private Vector3i pos; + private String risingEdgeURL; + private String fallingEdgeURL; + + @FillControl + private TextField tfRisingEdge; + + @FillControl + private TextField tfFallingEdge; + + @FillControl + private Button btnOk; + + public GuiRedstoneCtrl() { + } + + public GuiRedstoneCtrl(int d, Vector3i p, String r, String f) { + dimension = d; + pos = p; + risingEdgeURL = r; + fallingEdgeURL = f; + } + + @Override + public void initGui() { + super.initGui(); + loadFrom(new ResourceLocation("webdisplays", "gui/redstonectrl.json")); + tfRisingEdge.setText(risingEdgeURL); + tfFallingEdge.setText(fallingEdgeURL); + } + + @GuiSubscribe + public void onClick(Button.ClickEvent ev) { + if(ev.getSource() == btnOk) { + API mcef = ((ClientProxy) WebDisplays.PROXY).getMCEF(); + + String rising = mcef.punycode(Util.addProtocol(tfRisingEdge.getText())); + String falling = mcef.punycode(Util.addProtocol(tfFallingEdge.getText())); + WebDisplays.NET_HANDLER.sendToServer(new SMessageRedstoneCtrl(dimension, pos, rising, falling)); + } + + mc.displayGuiScreen(null); + } + + @Override + public boolean isForBlock(BlockPos bp, BlockSide side) { + return pos.equalsBlockPos(bp); + } + + @Nullable + @Override + public String getWikiPageName() { + return "Redstone_Controller"; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java new file mode 100644 index 0000000..473b925 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java @@ -0,0 +1,503 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.client.gui.controls.*; +import net.montoyo.wd.client.gui.loading.FillControl; +import net.montoyo.wd.core.ScreenRights; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.item.WDItem; +import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.utilities.*; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.UUID; + +public class GuiScreenConfig extends WDScreen { + + //Screen data + private final TileEntityScreen tes; + private final BlockSide side; + private NameUUIDPair owner; + private NameUUIDPair[] friends; + private int friendRights; + private int otherRights; + private Rotation rotation = Rotation.ROT_0; + private float aspectRatio; + + //Autocomplete handling + private boolean waitingAC; + private int acFailTicks = -1; + + private final ArrayList acResults = new ArrayList<>(); + private boolean adding; + + //Controls + @FillControl + private Label lblOwner; + + @FillControl + private List lstFriends; + + @FillControl + private Button btnAdd; + + @FillControl + private TextField tfFriend; + + @FillControl + private TextField tfResX; + + @FillControl + private TextField tfResY; + + @FillControl + private ControlGroup grpFriends; + + @FillControl + private ControlGroup grpOthers; + + @FillControl + private CheckBox boxFSetUrl; + + @FillControl + private CheckBox boxFClick; + + @FillControl + private CheckBox boxFFriends; + + @FillControl + private CheckBox boxFOthers; + + @FillControl + private CheckBox boxFUpgrades; + + @FillControl + private CheckBox boxFResolution; + + @FillControl + private CheckBox boxOSetUrl; + + @FillControl + private CheckBox boxOClick; + + @FillControl + private CheckBox boxOUpgrades; + + @FillControl + private CheckBox boxOResolution; + + @FillControl + private Button btnSetRes; + + @FillControl + private UpgradeGroup ugUpgrades; + + @FillControl + private Button btnChangeRot; + + @FillControl + private CheckBox cbLockRatio; + + @FillControl + private CheckBox cbAutoVolume; + + private CheckBox[] friendBoxes; + private CheckBox[] otherBoxes; + + public GuiScreenConfig(TileEntityScreen tes, BlockSide side, NameUUIDPair[] friends, int fr, int or) { + this.tes = tes; + this.side = side; + this.friends = friends; + friendRights = fr; + otherRights = or; + } + + @Override + public void initGui() { + super.initGui(); + loadFrom(new ResourceLocation("webdisplays", "gui/screencfg.json")); + + friendBoxes = new CheckBox[] { boxFResolution, boxFUpgrades, boxFOthers, boxFFriends, boxFClick, boxFSetUrl }; + boxFResolution.setUserdata(ScreenRights.CHANGE_RESOLUTION); + boxFUpgrades.setUserdata(ScreenRights.MANAGE_UPGRADES); + boxFOthers.setUserdata(ScreenRights.MANAGE_OTHER_RIGHTS); + boxFFriends.setUserdata(ScreenRights.MANAGE_FRIEND_LIST); + boxFClick.setUserdata(ScreenRights.CLICK); + boxFSetUrl.setUserdata(ScreenRights.CHANGE_URL); + + otherBoxes = new CheckBox[] { boxOResolution, boxOUpgrades, boxOClick, boxOSetUrl }; + boxOResolution.setUserdata(ScreenRights.CHANGE_RESOLUTION); + boxOUpgrades.setUserdata(ScreenRights.MANAGE_UPGRADES); + boxOClick.setUserdata(ScreenRights.CLICK); + boxOSetUrl.setUserdata(ScreenRights.CHANGE_URL); + + TileEntityScreen.Screen scr = tes.getScreen(side); + if(scr != null) { + owner = scr.owner; + rotation = scr.rotation; + + tfResX.setText("" + scr.resolution.x); + tfResY.setText("" + scr.resolution.y); + aspectRatio = ((float) scr.resolution.x) / ((float) scr.resolution.y); + + //Hopefully upgrades have been synchronized... + ugUpgrades.setUpgrades(scr.upgrades); + cbAutoVolume.setChecked(scr.autoVolume); + } + + if(owner == null) + owner = new NameUUIDPair("???", UUID.randomUUID()); + + lblOwner.setLabel(lblOwner.getLabel() + ' ' + owner.name); + for(NameUUIDPair f : friends) + lstFriends.addElementRaw(f.name, f); + + lstFriends.updateContent(); + updateRights(friendRights, friendRights, friendBoxes, true); + updateRights(otherRights, otherRights, otherBoxes, true); + updateMyRights(); + updateRotationStr(); + + mc.getSoundHandler().playSound(PositionedSoundRecord.getRecord(WebDisplays.INSTANCE.soundScreenCfg, 1.0f, 1.0f)); + } + + private void updateRotationStr() { + btnChangeRot.setLabel(I18n.format("webdisplays.gui.screencfg.rot" + rotation.getAngleAsInt())); + } + + private void addFriend(String name) { + if(!name.isEmpty()) { + requestAutocomplete(name, true); + tfFriend.setDisabled(true); + adding = true; + waitingAC = true; + } + } + + private void clickSetRes() { + TileEntityScreen.Screen scr = tes.getScreen(side); + if(scr == null) + return; //WHATDAFUQ? + + try { + int x = Integer.parseInt(tfResX.getText()); + int y = Integer.parseInt(tfResY.getText()); + if(x < 1 || y < 1) + throw new NumberFormatException(); //I'm lazy + + if(x != scr.resolution.x || y != scr.resolution.y) + WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_SET_RESOLUTION, new Vector2i(x, y))); + } catch(NumberFormatException ex) { + //Roll back + tfResX.setText("" + scr.resolution.x); + tfResY.setText("" + scr.resolution.y); + } + + btnSetRes.setDisabled(true); + } + + @GuiSubscribe + public void onClick(Button.ClickEvent ev) { + if(ev.getSource() == btnAdd && !waitingAC) + addFriend(tfFriend.getText().trim()); + else if(ev.getSource() == btnSetRes) + clickSetRes(); + else if(ev.getSource() == btnChangeRot) { + Rotation[] rots = Rotation.values(); + WebDisplays.NET_HANDLER.sendToServer(new SMessageScreenCtrl(tes, side, rots[(rotation.ordinal() + 1) % rots.length])); + } + } + + @GuiSubscribe + public void onEnterPressed(TextField.EnterPressedEvent ev) { + if(ev.getSource() == tfFriend && !waitingAC) + addFriend(ev.getText().trim()); + else if((ev.getSource() == tfResX || ev.getSource() == tfResY) && !btnSetRes.isDisabled()) + clickSetRes(); + } + + @GuiSubscribe + public void onAutocomplete(TextField.TabPressedEvent ev) { + if(ev.getSource() == tfFriend && !waitingAC && !ev.getBeginning().isEmpty()) { + if(acResults.isEmpty()) { + waitingAC = true; + requestAutocomplete(ev.getBeginning(), false); + } else { + NameUUIDPair pair = acResults.remove(0); + tfFriend.setText(pair.name); + } + } else if(ev.getSource() == tfResX) { + tfResX.setFocused(false); + tfResY.focus(); + tfResY.getMcField().setCursorPositionZero(); + tfResY.getMcField().setSelectionPos(tfResY.getText().length()); + } + } + + @GuiSubscribe + public void onTextChanged(TextField.TextChangedEvent ev) { + if(ev.getSource() == tfResX || ev.getSource() == tfResY) { + for(int i = 0; i < ev.getNewContent().length(); i++) { + if(!Character.isDigit(ev.getNewContent().charAt(i))) { + ev.getSource().setText(ev.getOldContent()); + return; + } + } + + if(cbLockRatio.isChecked()) { + if(ev.getSource() == tfResX) { + try { + float val = (float) Integer.parseInt(ev.getNewContent()); + val /= aspectRatio; + tfResY.setText("" + ((int) val)); + } catch(NumberFormatException ex) {} + } else { + try { + float val = (float) Integer.parseInt(ev.getNewContent()); + val *= aspectRatio; + tfResX.setText("" + ((int) val)); + } catch(NumberFormatException ex) {} + } + } + + btnSetRes.setDisabled(false); + } + } + + @GuiSubscribe + public void onRemovePlayer(List.EntryClick ev) { + if(ev.getSource() == lstFriends) + WebDisplays.NET_HANDLER.sendToServer(new SMessageScreenCtrl(tes, side, (NameUUIDPair) ev.getUserdata(), true)); + } + + @GuiSubscribe + public void onCheckboxChanged(CheckBox.CheckedEvent ev) { + if(isFriendCheckbox(ev.getSource())) { + int flag = (Integer) ev.getSource().getUserdata(); + if(ev.isChecked()) + friendRights |= flag; + else + friendRights &= ~flag; + + requestSync(); + } else if(isOtherCheckbox(ev.getSource())) { + int flag = (Integer) ev.getSource().getUserdata(); + if(ev.isChecked()) + otherRights |= flag; + else + otherRights &= ~flag; + + requestSync(); + } else if(ev.getSource() == cbLockRatio && ev.isChecked()) { + try { + int x = Integer.parseInt(tfResX.getText()); + int y = Integer.parseInt(tfResY.getText()); + + aspectRatio = ((float) x) / ((float) y); + } catch(NumberFormatException ex) { + cbLockRatio.setChecked(false); + } + } else if(ev.getSource() == cbAutoVolume) + WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.autoVol(tes, side, ev.isChecked())); + } + + @GuiSubscribe + public void onRemoveUpgrade(UpgradeGroup.ClickEvent ev) { + WebDisplays.NET_HANDLER.sendToServer(new SMessageScreenCtrl(tes, side, ev.getMouseOverStack())); + } + + public boolean isFriendCheckbox(CheckBox cb) { + return Arrays.stream(friendBoxes).anyMatch(fb -> cb == fb); + } + + public boolean isOtherCheckbox(CheckBox cb) { + return Arrays.stream(otherBoxes).anyMatch(ob -> cb == ob); + } + + public boolean hasFriend(NameUUIDPair f) { + return Arrays.stream(friends).anyMatch(f::equals); + } + + @Override + public void onAutocompleteResult(NameUUIDPair pairs[]) { + waitingAC = false; + + if(adding) { + if(!hasFriend(pairs[0])) + WebDisplays.NET_HANDLER.sendToServer(new SMessageScreenCtrl(tes, side, pairs[0], false)); + + tfFriend.setDisabled(false); + tfFriend.clear(); + tfFriend.focus(); + adding = false; + } else { + acResults.clear(); + acResults.addAll(Arrays.asList(pairs)); + + NameUUIDPair pair = acResults.remove(0); + tfFriend.setText(pair.name); + } + } + + @Override + public void onAutocompleteFailure() { + waitingAC = false; + acResults.clear(); + acFailTicks = 0; + tfFriend.setTextColor(Control.COLOR_RED); + + if(adding) { + tfFriend.setDisabled(false); + adding = false; + } + } + + @Override + public void updateScreen() { + super.updateScreen(); + + if(acFailTicks >= 0) { + if(++acFailTicks >= 10) { + acFailTicks = -1; + tfFriend.setTextColor(TextField.DEFAULT_TEXT_COLOR); + } + } + } + + public void updateFriends(NameUUIDPair[] friends) { + boolean diff = false; + if(friends.length != this.friends.length) + diff = true; + else { + for(NameUUIDPair pair : friends) { + if(!hasFriend(pair)) { + diff = true; + break; + } + } + } + + if(diff) { + this.friends = friends; + lstFriends.clearRaw(); + for(NameUUIDPair pair : friends) + lstFriends.addElementRaw(pair.name, pair); + + lstFriends.updateContent(); + } + } + + private int updateRights(int current, int newVal, CheckBox[] boxes, boolean force) { + if(force || current != newVal) { + for(CheckBox box : boxes) { + int flag = (Integer) box.getUserdata(); + box.setChecked((newVal & flag) != 0); + } + + if(!force) { + Log.info("Screen check boxes were updated"); + abortSync(); //Value changed by another user, abort modifications by local user + } + } + + return newVal; + } + + public void updateFriendRights(int rights) { + friendRights = updateRights(friendRights, rights, friendBoxes, false); + } + + public void updateOtherRights(int rights) { + otherRights = updateRights(otherRights, rights, otherBoxes, false); + } + + @Override + protected void sync() { + WebDisplays.NET_HANDLER.sendToServer(new SMessageScreenCtrl(tes, side, friendRights, otherRights)); + Log.info("Sent sync packet"); + } + + public void updateMyRights() { + NameUUIDPair me = new NameUUIDPair(mc.player.getGameProfile()); + int myRights; + boolean clientIsOwner = false; + + if(me.equals(owner)) { + myRights = ScreenRights.ALL; + clientIsOwner = true; + } else if(hasFriend(me)) + myRights = friendRights; + else + myRights = otherRights; + + //Disable components according to client rights + grpFriends.setDisabled(!clientIsOwner); + + boolean flag = (myRights & ScreenRights.MANAGE_FRIEND_LIST) == 0; + lstFriends.setDisabled(flag); + tfFriend.setDisabled(flag); + btnAdd.setDisabled(flag); + + flag = (myRights & ScreenRights.MANAGE_OTHER_RIGHTS) == 0; + grpOthers.setDisabled(flag); + + flag = (myRights & ScreenRights.CHANGE_RESOLUTION) == 0; + tfResX.setDisabled(flag); + tfResY.setDisabled(flag); + btnChangeRot.setDisabled(flag); + + if(flag) + btnSetRes.setDisabled(true); + + flag = (myRights & ScreenRights.MANAGE_UPGRADES) == 0; + ugUpgrades.setDisabled(flag); + cbAutoVolume.setDisabled(flag); + } + + public void updateResolution(Vector2i res) { + aspectRatio = ((float) res.x) / ((float) res.y); + tfResX.setText("" + res.x); + tfResY.setText("" + res.y); + btnSetRes.setDisabled(true); + } + + public void updateRotation(Rotation rot) { + rotation = rot; + updateRotationStr(); + } + + public void updateAutoVolume(boolean av) { + cbAutoVolume.setChecked(av); + } + + @Override + public boolean isForBlock(BlockPos bp, BlockSide side) { + return bp.equals(tes.getPos()) && side == this.side; + } + + @Nullable + @Override + public String getWikiPageName() { + ItemStack is = ugUpgrades.getMouseOverUpgrade(); + if(is != null) { + if(is.getItem() instanceof WDItem) + return ((WDItem) is.getItem()).getWikiName(is); + else + return null; + } + + return "Screen_Configurator"; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java new file mode 100644 index 0000000..51a4213 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java @@ -0,0 +1,711 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import net.minecraft.client.audio.ISound; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.BlockPos; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.miniserv.Constants; +import net.montoyo.wd.miniserv.client.*; +import net.montoyo.wd.utilities.*; +import org.lwjgl.input.Keyboard; + +import javax.annotation.Nullable; +import javax.swing.filechooser.FileSystemView; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; + +import static org.lwjgl.opengl.GL11.*; + +public class GuiServer extends WDScreen { + + private static final ResourceLocation BG_IMAGE = new ResourceLocation("webdisplays", "textures/gui/server_bg.png"); + private static final ResourceLocation FG_IMAGE = new ResourceLocation("webdisplays", "textures/gui/server_fg.png"); + private static final HashMap COMMAND_MAP = new HashMap<>(); + private static final int MAX_LINE_LEN = 32; + private static final int MAX_LINES = 12; + + private final Vector3i serverPos; + private final NameUUIDPair owner; + private final ArrayList lines = new ArrayList<>(); + private String prompt = ""; + private String userPrompt; + private int blinkTime; + private String lastCmd; + private boolean promptLocked; + private volatile long queryTime; + private ClientTask currentTask; + private int selectedLine = -1; + + //Access command + private int accessTrials; + private int accessTime; + private int accessState = -1; + private PositionedSoundRecord accessSound; + + //Upload wizard + private boolean uploadWizard; + private File uploadDir; + private final ArrayList uploadFiles = new ArrayList<>(); + private int uploadOffset; + private boolean uploadFirstIsParent; + private String uploadFilter = ""; + private long uploadFilterTime; + + public GuiServer(Vector3i vec, NameUUIDPair owner) { + serverPos = vec; + this.owner = owner; + //userPrompt = owner.name + "@miniserv$ "; + userPrompt = "> "; + + if(COMMAND_MAP.isEmpty()) + buildCommandMap(); + + lines.add("MiniServ 1.0"); + lines.add(tr("info")); + uploadCD(FileSystemView.getFileSystemView().getDefaultDirectory()); + } + + private static String tr(String key, Object ... args) { + return I18n.format("webdisplays.server." + key, args); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float ptt) { + super.drawScreen(mouseX, mouseY, ptt); + + int x = (width - 256) / 2; + int y = (height - 176) / 2; + + GlStateManager.enableTexture2D(); + mc.renderEngine.bindTexture(BG_IMAGE); + GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f); + drawTexturedModalRect(x, y, 0, 0, 256, 176); + + x += 18; + y += 18; + + for(int i = 0; i < lines.size(); i++) { + if(selectedLine == i) { + drawWhiteQuad(x - 1, y - 2, fontRenderer.getStringWidth(lines.get(i)) + 1, 12); + fontRenderer.drawString(lines.get(i), x, y, 0xFF129700, false); + } else + fontRenderer.drawString(lines.get(i), x, y, 0xFFFFFFFF, false); + + y += 12; + } + + if(!promptLocked) { + x = fontRenderer.drawString(userPrompt, x, y, 0xFFFFFFFF, false); + x = fontRenderer.drawString(prompt, x, y, 0xFFFFFFFF, false); + } + + if(!uploadWizard && blinkTime < 5) + drawWhiteQuad(x + 1, y, 6, 8); + + GlStateManager.disableAlpha(); + GlStateManager.enableTexture2D(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + mc.renderEngine.bindTexture(FG_IMAGE); + GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f); + drawTexturedModalRect((width - 256) / 2, (height - 176) / 2, 0, 0, 256, 176); + GlStateManager.enableAlpha(); + } + + private void drawWhiteQuad(int x, int y, int w, int h) { + double xd = (double) x; + double xd2 = (double) (x + w); + double yd = (double) y; + double yd2 = (double) (y + h); + double zd = (double) zLevel; + + GlStateManager.disableTexture2D(); + GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f); + Tessellator t = Tessellator.getInstance(); + BufferBuilder bb = t.getBuffer(); + bb.begin(GL_QUADS, DefaultVertexFormats.POSITION); + bb.pos(xd, yd2, zd).endVertex(); + bb.pos(xd2, yd2, zd).endVertex(); + bb.pos(xd2, yd, zd).endVertex(); + bb.pos(xd, yd, zd).endVertex(); + t.draw(); + GlStateManager.enableTexture2D(); + } + + @Override + public void updateScreen() { + super.updateScreen(); + + if(accessState >= 0) { + if(--accessTime <= 0) { + accessState++; + + if(accessState == 1) { + if(lines.size() > 0) + lines.remove(lines.size() - 1); + + lines.add("access: PERMISSION DENIED....and..."); + accessTime = 20; + } else { + if(accessSound == null) { + accessSound = new PositionedSoundRecord(WebDisplays.INSTANCE.soundServer.getSoundName(), SoundCategory.MASTER, 1.0f, 1.0f, true, 0, ISound.AttenuationType.NONE, 0.0f, 0.0f, 0.0f); + mc.getSoundHandler().playSound(accessSound); + } + + writeLine("YOU DIDN'T SAY THE MAGIC WORD!"); + accessTime = 2; + } + } + } else { + blinkTime = (blinkTime + 1) % 10; + + if(currentTask != null) { + long queryTime; + synchronized(this) { + queryTime = this.queryTime; + } + + if(System.currentTimeMillis() - queryTime >= 10000) { + writeLine(tr("timeout")); + currentTask.cancel(); + clearTask(); + } + } + + if(!uploadFilter.isEmpty() && System.currentTimeMillis() - uploadFilterTime >= 1000) { + Log.info("Upload filter cleared"); + uploadFilter = ""; + } + } + } + + @Override + public void handleKeyboardInput() throws IOException { + boolean keyState = Keyboard.getEventKeyState(); + int keyCode = Keyboard.getEventKey(); + + if(uploadWizard) { + if(keyState) { + if(keyCode == Keyboard.KEY_UP) { + if(selectedLine > 3) + selectedLine--; + else if(uploadOffset > 0) { + uploadOffset--; + updateUploadScreen(); + } + } else if(keyCode == Keyboard.KEY_DOWN) { + if(selectedLine < MAX_LINES - 1) + selectedLine++; + else if(uploadOffset + selectedLine - 2 < uploadFiles.size()) { + uploadOffset++; + updateUploadScreen(); + } + } else if(keyCode == Keyboard.KEY_PRIOR) { + selectedLine = 3; + int dst = uploadOffset - (MAX_LINES - 3); + if(dst < 0) + dst = 0; + + selectFile(dst); + } else if(keyCode == Keyboard.KEY_NEXT) { + selectedLine = 3; + int dst = uploadOffset + (MAX_LINES - 3); + if(dst >= uploadFiles.size()) + dst = uploadFiles.size() - 1; + + selectFile(dst); + } else if(keyCode == Keyboard.KEY_RETURN || keyCode == Keyboard.KEY_NUMPADENTER) { + File file = uploadFiles.get(uploadOffset + selectedLine - 3); + + if(file.isDirectory()) { + uploadCD(file); + updateUploadScreen(); + } else + startFileUpload(file, true); + } else if(keyCode == Keyboard.KEY_F5) { + uploadCD(uploadDir); + updateUploadScreen(); + } + } + + if(keyCode == Keyboard.KEY_ESCAPE) { + quitUploadWizard(); + return; //Don't let the screen handle this + } + + super.handleKeyboardInput(); + } else { + super.handleKeyboardInput(); + + if(keyState) { + boolean ctrl = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); + + if(keyCode == Keyboard.KEY_L && ctrl) + lines.clear(); + else if(keyCode == Keyboard.KEY_V && ctrl) { + prompt += getClipboardString(); + + if(prompt.length() > MAX_LINE_LEN) + prompt = prompt.substring(0, MAX_LINE_LEN); + } else if(keyCode == Keyboard.KEY_UP) { + if(lastCmd != null) { + String tmp = prompt; + prompt = lastCmd; + lastCmd = tmp; + } + } + } + } + } + + @Override + protected void keyTyped(char typedChar, int keyCode) throws IOException { + super.keyTyped(typedChar, keyCode); + + if(uploadWizard) { + boolean found = false; + uploadFilter += Character.toLowerCase(typedChar); + uploadFilterTime = System.currentTimeMillis(); + + for(int i = uploadFirstIsParent ? 1 : 0; i < uploadFiles.size(); i++) { + if(uploadFiles.get(i).getName().toLowerCase().startsWith(uploadFilter)) { + selectFile(i); + found = true; + break; + } + } + + if(!found && uploadFilter.length() == 1) + uploadFilter = ""; + + return; + } else if(promptLocked) + return; + + if(keyCode == Keyboard.KEY_BACK) { + if(prompt.length() > 0) + prompt = prompt.substring(0, prompt.length() - 1); + } else if(keyCode == Keyboard.KEY_RETURN || keyCode == Keyboard.KEY_NUMPADENTER) { + if(prompt.length() > 0) { + writeLine(userPrompt + prompt); + evaluateCommand(prompt); + lastCmd = prompt; + prompt = ""; + } else + writeLine(userPrompt); + } else if(prompt.length() + 1 < MAX_LINE_LEN && typedChar >= 32 && typedChar <= 126) + prompt = prompt + typedChar; + + blinkTime = 0; + } + + private void evaluateCommand(String str) { + String[] args = str.trim().split("\\s+"); + Method handler = COMMAND_MAP.get(args[0].toLowerCase()); + + if(handler == null) { + writeLine(tr("unknowncmd")); + return; + } + + Object[] params; + if(handler.getParameterCount() == 0) + params = new Object[0]; + else { + String[] args2 = new String[args.length - 1]; + System.arraycopy(args, 1, args2, 0, args2.length); + params = new Object[] { args2 }; + } + + try { + handler.invoke(this, params); + } catch(IllegalAccessException | InvocationTargetException e) { + Log.errorEx("Caught exception while running command \"%s\"", e, str); + writeLine(tr("error")); + } + } + + private void writeLine(String line) { + final int maxl = uploadWizard ? MAX_LINES : (MAX_LINES - 1); //Cuz prompt is hidden + while(lines.size() >= maxl) + lines.remove(0); + + lines.add(line); + } + + private static void buildCommandMap() { + COMMAND_MAP.clear(); + + Method[] methods = GuiServer.class.getMethods(); + for(Method m: methods) { + CommandHandler cmd = m.getAnnotation(CommandHandler.class); + + if(cmd != null && Modifier.isPublic(m.getModifiers())) { + if(m.getParameterCount() == 0 || (m.getParameterCount() == 1 && m.getParameterTypes()[0] == String[].class)) + COMMAND_MAP.put(cmd.value().toLowerCase(), m); + } + } + } + + private void quitUploadWizard() { + lines.clear(); + promptLocked = false; + uploadWizard = false; + selectedLine = -1; + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + + if(accessSound != null) + mc.getSoundHandler().stopSound(accessSound); + } + + private boolean queueTask(ClientTask task) { + if(Client.getInstance().addTask(task)) { + promptLocked = true; + queryTime = System.currentTimeMillis(); //No task is running so it's okay to have an unsynchronized access here + currentTask = task; + return true; + } else { + writeLine(tr("queryerr")); + return false; + } + } + + private void clearTask() { + promptLocked = false; + currentTask = null; + } + + private static String trimStringL(String str) { + int delta = str.length() - MAX_LINE_LEN; + if(delta <= 0) + return str; + + return "..." + str.substring(delta + 3); + } + + private static String trimStringR(String str) { + return (str.length() <= MAX_LINE_LEN) ? str : (str.substring(0, MAX_LINE_LEN - 3) + "..."); + } + + @CommandHandler("clear") + public void commandClear() { + lines.clear(); + } + + @CommandHandler("help") + public void commandHelp(String[] args) { + if(args.length > 0) { + String cmd = args[0].toLowerCase(); + + if(COMMAND_MAP.containsKey(cmd)) + writeLine(tr("help." + cmd)); + else + writeLine(tr("unknowncmd")); + } else { + for(String c : COMMAND_MAP.keySet()) + writeLine(c + " - " + tr("help." + c)); + } + } + + @CommandHandler("exit") + public void commandExit() { + mc.displayGuiScreen(null); + } + + @CommandHandler("access") + public void commandAccess(String[] args) { + boolean handled = false; + + if(args.length >= 1 && args[0].equalsIgnoreCase("security")) { + if(args.length == 1 || (args.length == 2 && args[1].equalsIgnoreCase("grid"))) + handled = true; + } else if(args.length == 3 && args[0].equalsIgnoreCase("main") && args[1].equalsIgnoreCase("security") && args[2].equalsIgnoreCase("grid")) + handled = true; + + if(handled) { + writeLine("access: PERMISSION DENIED."); + + if(++accessTrials >= 3) { + promptLocked = true; + accessState = 0; + accessTime = 20; + } + } else + writeLine(tr("argerror")); + } + + @CommandHandler("owner") + public void commandOwner() { + writeLine(tr("ownername", owner.name)); + writeLine(tr("owneruuid")); + writeLine(owner.uuid.toString()); + } + + @CommandHandler("quota") + public void commandQuota() { + if(!mc.player.getGameProfile().getId().equals(owner.uuid)) { + writeLine(tr("errowner")); + return; + } + + ClientTaskGetQuota task = new ClientTaskGetQuota(); + task.setFinishCallback((t) -> { + writeLine(tr("quota", Util.sizeString(t.getQuota()), Util.sizeString(t.getMaxQuota()))); + clearTask(); + }); + + queueTask(task); + } + + @CommandHandler("ls") + public void commandList() { + ClientTaskGetFileList task = new ClientTaskGetFileList(owner.uuid); + task.setFinishCallback((t) -> { + String[] files = t.getFileList(); + if(files != null) + Arrays.stream(files).forEach(this::writeLine); + + clearTask(); + }); + + queueTask(task); + } + + @CommandHandler("url") + public void commandURL(String[] args) { + if(args.length < 1) { + writeLine(tr("fnamearg")); + return; + } + + String fname = Util.join(args, " "); + if(Util.isFileNameInvalid(fname)) { + writeLine(tr("nameerr")); + return; + } + + ClientTaskCheckFile task = new ClientTaskCheckFile(owner.uuid, fname); + task.setFinishCallback((t) -> { + int status = t.getStatus(); + if(status == 0) { + writeLine(tr("urlcopied")); + setClipboardString(t.getURL()); + } else if(status == Constants.GETF_STATUS_NOT_FOUND) + writeLine(tr("notfound")); + else + writeLine(tr("error2", status)); + + clearTask(); + }); + + queueTask(task); + } + + private void uploadCD(File newDir) { + try { + uploadDir = newDir.getCanonicalFile(); + } catch(IOException ex) { + uploadDir = newDir; + } + + uploadFiles.clear(); + File parent = uploadDir.getParentFile(); + + if(parent != null && parent.exists()) { + uploadFiles.add(parent); + uploadFirstIsParent = true; + } else + uploadFirstIsParent = false; + + File[] children = uploadDir.listFiles(); + if(children != null) { + Collator c = Collator.getInstance(); + c.setStrength(Collator.SECONDARY); + c.setDecomposition(Collator.CANONICAL_DECOMPOSITION); + + Arrays.stream(children).filter(f -> !f.isHidden() && (f.isDirectory() || f.isFile())).sorted((a, b) -> c.compare(a.getName(), b.getName())).forEach(uploadFiles::add); + } + + uploadOffset = 0; + uploadFilter = ""; + + if(uploadWizard) + selectedLine = 3; + } + + private void updateUploadScreen() { + lines.clear(); + + lines.add(tr("upload.info")); + lines.add(trimStringL(uploadDir.getPath())); + lines.add(""); + + for(int i = uploadOffset; i < uploadFiles.size() && lines.size() < MAX_LINES; i++) { + if(i == 0 && uploadFirstIsParent) + lines.add(tr("upload.parent")); + else + lines.add(trimStringR(uploadFiles.get(i).getName())); + } + } + + private void selectFile(int i) { + int pos = 3 + i - uploadOffset; + if(pos >= 3 && pos < MAX_LINES) { + selectedLine = pos; + return; + } + + uploadOffset = i; + if(uploadOffset + MAX_LINES - 3 > uploadFiles.size()) + uploadOffset = uploadFiles.size() - MAX_LINES + 3; + + updateUploadScreen(); + selectedLine = 3 + i - uploadOffset; + } + + @CommandHandler("upload") + public void commandUpload(String[] args) { + if(!mc.player.getGameProfile().getId().equals(owner.uuid)) { + writeLine(tr("errowner")); + return; + } + + if(args.length > 0) { + File fle = new File(Util.join(args, " ")); + if(!fle.exists()) { + writeLine(tr("notfound")); + return; + } + + if(fle.isDirectory()) + uploadCD(fle); + else if(fle.isFile()) { + startFileUpload(fle, false); + return; + } else { + writeLine(tr("notfound")); + return; + } + } + + uploadWizard = true; + promptLocked = true; + uploadOffset = 0; + selectedLine = 3; + updateUploadScreen(); + } + + @CommandHandler("rm") + public void commandDelete(String[] args) { + if(!mc.player.getGameProfile().getId().equals(owner.uuid)) { + writeLine(tr("errowner")); + return; + } + + if(args.length < 1) { + writeLine(tr("fnamearg")); + return; + } + + String fname = Util.join(args, " "); + if(Util.isFileNameInvalid(fname)) { + writeLine(tr("nameerr")); + return; + } + + ClientTaskDeleteFile task = new ClientTaskDeleteFile(fname); + task.setFinishCallback((t) -> { + int status = t.getStatus(); + if(status == 1) + writeLine(tr("notfound")); + else if(status != 0) + writeLine(tr("error")); + + clearTask(); + }); + + queueTask(task); + } + + @CommandHandler("reconnect") + public void commandReconnect() { + Client.getInstance().stop(); + WebDisplays.NET_HANDLER.sendToServer(Client.getInstance().beginConnection()); + } + + private void startFileUpload(File f, boolean quit) { + if(quit) + quitUploadWizard(); + + if(Util.isFileNameInvalid(f.getName()) || f.getName().length() >= MAX_LINE_LEN - 3) { + writeLine(tr("nameerr")); + return; + } + + ClientTaskUploadFile task; + try { + task = new ClientTaskUploadFile(f); + } catch(IOException ex) { + writeLine(tr("error")); + ex.printStackTrace(); + return; + } + + task.setProgressCallback((cur, total) -> { + synchronized(GuiServer.this) { + queryTime = System.currentTimeMillis(); + } + }); + + task.setFinishCallback(t -> { + int status = t.getUploadStatus(); + if(status == 0) + writeLine(tr("upload.done")); + else if(status == Constants.FUPA_STATUS_FILE_EXISTS) + writeLine(tr("upload.exists")); + else if(status == Constants.FUPA_STATUS_EXCEEDS_QUOTA) + writeLine(tr("upload.quota")); + else + writeLine(tr("error2", status)); + + clearTask(); + }); + + if(queueTask(task)) + writeLine(tr("upload.uploading")); + } + + @Override + public boolean isForBlock(BlockPos bp, BlockSide side) { + return serverPos.equalsBlockPos(bp); + } + + @Nullable + @Override + public String getWikiPageName() { + return "Server"; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java new file mode 100644 index 0000000..0fa337f --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2019 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.client.ClientProxy; +import net.montoyo.wd.client.gui.controls.Button; +import net.montoyo.wd.client.gui.controls.TextField; +import net.montoyo.wd.client.gui.loading.FillControl; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.net.server.SMessagePadCtrl; +import net.montoyo.wd.net.server.SMessageScreenCtrl; +import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.Util; +import net.montoyo.wd.utilities.Vector3i; + +import java.util.Map; + +public class GuiSetURL2 extends WDScreen { + + //Screen data + private TileEntityScreen tileEntity; + private BlockSide screenSide; + private Vector3i remoteLocation; + + //Pad data + private final boolean isPad; + + //Common + private final String screenURL; + + @FillControl + private TextField tfURL; + + @FillControl + private Button btnShutDown; + + @FillControl + private Button btnCancel; + + @FillControl + private Button btnOk; + + public GuiSetURL2(TileEntityScreen tes, BlockSide side, String url, Vector3i rl) { + tileEntity = tes; + screenSide = side; + remoteLocation = rl; + isPad = false; + screenURL = url; + } + + public GuiSetURL2(String url) { + isPad = true; + screenURL = url; + } + + @Override + public void initGui() { + super.initGui(); + loadFrom(new ResourceLocation("webdisplays", "gui/seturl.json")); + tfURL.setText(screenURL); + } + + @Override + protected void addLoadCustomVariables(Map vars) { + vars.put("isPad", isPad ? 1.0 : 0.0); + } + + @GuiSubscribe + public void onButtonClicked(Button.ClickEvent ev) { + if(ev.getSource() == btnCancel) + mc.displayGuiScreen(null); + else if(ev.getSource() == btnOk) + validate(tfURL.getText()); + else if(ev.getSource() == btnShutDown) { + if(isPad) + WebDisplays.NET_HANDLER.sendToServer(new SMessagePadCtrl("")); + + mc.displayGuiScreen(null); + } + } + + @GuiSubscribe + public void onEnterPressed(TextField.EnterPressedEvent ev) { + validate(ev.getText()); + } + + private void validate(String url) { + if(!url.isEmpty()) { + url = Util.addProtocol(url); + url = ((ClientProxy) WebDisplays.PROXY).getMCEF().punycode(url); + + if(isPad) { + WebDisplays.NET_HANDLER.sendToServer(new SMessagePadCtrl(url)); + ItemStack held = mc.player.getHeldItem(EnumHand.MAIN_HAND); + + if(held.getItem() == WebDisplays.INSTANCE.itemMinePad && held.getTagCompound() != null && held.getTagCompound().hasKey("PadID")) { + ClientProxy.PadData pd = ((ClientProxy) WebDisplays.PROXY).getPadByID(held.getTagCompound().getInteger("PadID")); + + if(pd != null && pd.view != null) + pd.view.loadURL(WebDisplays.applyBlacklist(url)); + } + } else + WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.setURL(tileEntity, screenSide, url, remoteLocation)); + } + + mc.displayGuiScreen(null); + } + + @Override + public boolean isForBlock(BlockPos bp, BlockSide side) { + return (remoteLocation != null && remoteLocation.equalsBlockPos(bp)) || (bp.equals(tileEntity.getPos()) && side == screenSide); + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiSubscribe.java b/src/main/java/net/montoyo/wd/client/gui/GuiSubscribe.java new file mode 100644 index 0000000..5814b77 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/GuiSubscribe.java @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface GuiSubscribe { +} diff --git a/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java b/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java new file mode 100644 index 0000000..116785d --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.RenderItem; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.montoyo.wd.utilities.Log; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.EXTBgra; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.stream.IntStream; + +import static org.lwjgl.opengl.GL11.*; + +@SideOnly(Side.CLIENT) +public class RenderRecipe extends GuiScreen { + + private static class NameRecipePair { + + private final String name; + private final ShapedRecipes recipe; + + private NameRecipePair(String n, ShapedRecipes r) { + this.name = n; + this.recipe = r; + } + + } + + private static final ResourceLocation CRAFTING_TABLE_GUI_TEXTURES = new ResourceLocation("textures/gui/container/crafting_table.png"); + private static final int SIZE_X = 176; + private static final int SIZE_Y = 166; + private int x; + private int y; + private RenderItem renderItem; + private final ItemStack[] recipe = new ItemStack[3 * 3]; + private ItemStack recipeResult; + private String recipeName; + private final ArrayList recipes = new ArrayList<>(); + private IntBuffer buffer; + private int[] array; + + @Override + public void initGui() { + x = (width - SIZE_X) / 2; + y = (height - SIZE_Y) / 2; + renderItem = mc.getRenderItem(); + + for(IRecipe recipe: CraftingManager.REGISTRY) { + ResourceLocation regName = recipe.getRegistryName(); + + if(regName != null && regName.getResourceDomain().equals("webdisplays")) { + if(recipe instanceof ShapedRecipes) + recipes.add(new NameRecipePair(regName.getResourcePath(), (ShapedRecipes) recipe)); + else + Log.warning("Found non-shaped recipe %s", regName.toString()); + } + } + + Log.info("Loaded %d recipes", recipes.size()); + nextRecipe(); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + drawDefaultBackground(); + GlStateManager.color(1.0f, 1.0f, 1.0f); + mc.getTextureManager().bindTexture(CRAFTING_TABLE_GUI_TEXTURES); + drawTexturedModalRect(x, y, 0, 0, SIZE_X, SIZE_Y); + fontRenderer.drawString(I18n.format("container.crafting"), x + 28, y + 6, 0x404040); + + RenderHelper.enableGUIStandardItemLighting(); + GlStateManager.disableLighting(); + + for(int sy = 0; sy < 3; sy++) { + for(int sx = 0; sx < 3; sx++) { + ItemStack is = recipe[sy * 3 + sx]; + + if(is != null) { + int x = this.x + 30 + sx * 18; + int y = this.y + 17 + sy * 18; + + renderItem.renderItemAndEffectIntoGUI(mc.player, is, x, y); + renderItem.renderItemOverlayIntoGUI(fontRenderer, is, x, y, null); + } + } + } + + if(recipeResult != null) { + renderItem.renderItemAndEffectIntoGUI(mc.player, recipeResult, x + 124, y + 35); + renderItem.renderItemOverlayIntoGUI(fontRenderer, recipeResult, x + 124, y + 35, null); + } + + GlStateManager.enableLighting(); + RenderHelper.disableStandardItemLighting(); + } + + private void setRecipe(ShapedRecipes recipe) { + IntStream.range(0, this.recipe.length).forEach(i -> this.recipe[i] = null); + NonNullList ingredients = recipe.getIngredients(); + int pos = 0; + + for(int y = 0; y < recipe.getRecipeHeight(); y++) { + for(int x = 0; x < recipe.getRecipeWidth(); x++) { + ItemStack[] stacks = ingredients.get(pos++).getMatchingStacks(); + + if(stacks.length > 0) + this.recipe[y * 3 + x] = stacks[0]; + } + } + + recipeResult = recipe.getRecipeOutput(); + } + + private void nextRecipe() { + if(recipes.isEmpty()) + mc.displayGuiScreen(null); + else { + NameRecipePair pair = recipes.remove(0); + setRecipe(pair.recipe); + recipeName = pair.name; + } + } + + private int screen2DisplayX(int x) { + double ret = ((double) x) / ((double) width) * ((double) mc.displayWidth); + return (int) ret; + } + + private int screen2DisplayY(int y) { + double ret = ((double) y) / ((double) height) * ((double) mc.displayHeight); + return (int) ret; + } + + private void takeScreenshot() throws Throwable { + int x = screen2DisplayX(this.x + 27); + int y = mc.displayHeight - screen2DisplayY(this.y + 4); + int w = screen2DisplayX(120); + int h = screen2DisplayY(68); + y -= h; + + if(buffer == null) + buffer = BufferUtils.createIntBuffer(w * h); + + int oldPack = glGetInteger(GL_PACK_ALIGNMENT); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + buffer.clear(); + glReadPixels(x, y, w, h, EXTBgra.GL_BGRA_EXT, GL_UNSIGNED_BYTE, buffer); + glPixelStorei(GL_PACK_ALIGNMENT, oldPack); + + if(array == null) + array = new int[w * h]; + + buffer.clear(); + buffer.get(array); + TextureUtil.processPixelValues(array, w, h); + + File f = new File(mc.mcDataDir, "wd_recipes"); + if(!f.exists()) + f.mkdir(); + + f = new File(f, recipeName + ".png"); + + BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + bi.setRGB(0, 0, w, h, array, 0, w); + ImageIO.write(bi, "PNG", f); + } + + @Override + public void updateScreen() { + if(recipeName != null) { + try { + takeScreenshot(); + nextRecipe(); + } catch(Throwable t) { + t.printStackTrace(); + mc.displayGuiScreen(null); + } + } + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java new file mode 100644 index 0000000..c3e74b3 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java @@ -0,0 +1,367 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.client.gui.controls.Container; +import net.montoyo.wd.client.gui.controls.Control; +import net.montoyo.wd.client.gui.controls.Event; +import net.montoyo.wd.client.gui.controls.List; +import net.montoyo.wd.client.gui.loading.FillControl; +import net.montoyo.wd.client.gui.loading.GuiLoader; +import net.montoyo.wd.client.gui.loading.JsonOWrapper; +import net.montoyo.wd.net.server.SMessageACQuery; +import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.Bounds; +import net.montoyo.wd.utilities.Log; +import net.montoyo.wd.utilities.NameUUIDPair; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public abstract class WDScreen extends GuiScreen { + + public static WDScreen CURRENT_SCREEN = null; + + protected final ArrayList controls = new ArrayList<>(); + protected final ArrayList postDrawList = new ArrayList<>(); + private final HashMap, Method> eventMap = new HashMap<>(); + protected boolean quitOnEscape = true; + protected boolean defaultBackground = true; + protected int syncTicks = 40; + private int syncTicksLeft = -1; + + public WDScreen() { + Method[] methods = getClass().getMethods(); + + for(Method m : methods) { + if(m.getAnnotation(GuiSubscribe.class) != null) { + if(!Modifier.isPublic(m.getModifiers())) + throw new RuntimeException("Found non public @GuiSubscribe"); + + Class params[] = m.getParameterTypes(); + if(params.length != 1 || !Event.class.isAssignableFrom(params[0])) + throw new RuntimeException("Invalid parameters for @GuiSubscribe"); + + eventMap.put((Class) params[0], m); + } + } + } + + protected T addControl(T ctrl) { + controls.add(ctrl); + return ctrl; + } + + public int screen2DisplayX(int x) { + double ret = ((double) x) / ((double) width) * ((double) mc.displayWidth); + return (int) ret; + } + + public int screen2DisplayY(int y) { + double ret = ((double) y) / ((double) height) * ((double) mc.displayHeight); + return (int) ret; + } + + public int display2ScreenX(int x) { + double ret = ((double) x) / ((double) mc.displayWidth) * ((double) width); + return (int) ret; + } + + public int display2ScreenY(int y) { + double ret = ((double) y) / ((double) mc.displayHeight) * ((double) height); + return (int) ret; + } + + protected void centerControls() { + //Determine bounding box + Bounds bounds = Control.findBounds(controls); + + //Translation vector + int diffX = (width - bounds.maxX - bounds.minX) / 2; + int diffY = (height - bounds.maxY - bounds.minY) / 2; + + //Translate controls + for(Control ctrl : controls) { + int x = ctrl.getX(); + int y = ctrl.getY(); + + ctrl.setPos(x + diffX, y + diffY); + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float ptt) { + if(defaultBackground) + drawDefaultBackground(); + + for(Control ctrl: controls) + ctrl.draw(mouseX, mouseY, ptt); + + for(Control ctrl: postDrawList) + ctrl.postDraw(mouseX, mouseY, ptt); + } + + @Override + protected void keyTyped(char typedChar, int keyCode) throws IOException { + if(quitOnEscape && keyCode == Keyboard.KEY_ESCAPE) { + mc.displayGuiScreen(null); + return; + } + + for(Control ctrl: controls) + ctrl.keyTyped(typedChar, keyCode); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) { + for(Control ctrl: controls) + ctrl.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + protected void mouseReleased(int mouseX, int mouseY, int state) { + for(Control ctrl: controls) + ctrl.mouseReleased(mouseX, mouseY, state); + } + + @Override + protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + for(Control ctrl: controls) + ctrl.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); + } + + @Override + public void initGui() { + CURRENT_SCREEN = this; + Keyboard.enableRepeatEvents(true); + } + + @Override + public void onGuiClosed() { + if(syncTicksLeft >= 0) { + sync(); + syncTicksLeft = -1; + } + + for(Control ctrl : controls) + ctrl.destroy(); + + Keyboard.enableRepeatEvents(false); + CURRENT_SCREEN = null; + } + + @Override + public void handleMouseInput() throws IOException { + super.handleMouseInput(); + + int x = Mouse.getEventX() * width / mc.displayWidth; + int y = height - Mouse.getEventY() * height / mc.displayHeight - 1; + int dw = Mouse.getEventDWheel(); + + if(dw != 0) + onMouseScroll(x, y, dw); + else if(Mouse.getEventButton() == -1) + onMouseMove(x, y); + } + + @Override + public void handleKeyboardInput() throws IOException { + super.handleKeyboardInput(); + + int key = Keyboard.getEventKey(); + if(key != Keyboard.KEY_NONE) { + if(Keyboard.getEventKeyState()) { + for(Control ctrl : controls) + ctrl.keyDown(key); + } else { + for(Control ctrl : controls) + ctrl.keyUp(key); + } + } + } + + public void onMouseScroll(int mouseX, int mouseY, int amount) { + for(Control ctrl : controls) + ctrl.mouseScroll(mouseX, mouseY, amount); + } + + public void onMouseMove(int mouseX, int mouseY) { + for(Control ctrl : controls) + ctrl.mouseMove(mouseX, mouseY); + } + + public Object actionPerformed(Event ev) { + Method m = eventMap.get(ev.getClass()); + + if(m != null) { + try { + return m.invoke(this, ev); + } catch(IllegalAccessException e) { + Log.errorEx("Access to event %s of screen %s is denied", e, ev.getClass().getSimpleName(), getClass().getSimpleName()); + } catch(InvocationTargetException e) { + Log.errorEx("Event %s of screen %s failed", e, ev.getClass().getSimpleName(), getClass().getSimpleName()); + } + } + + return null; + } + + public T getControlByName(String name) { + for(Control ctrl : controls) { + if(name.equals(ctrl.getName())) + return (T) ctrl; + + if(ctrl instanceof Container) { + Control ret = ((Container) ctrl).getByName(name); + + if(ret != null) + return (T) ret; + } + } + + return null; + } + + protected void addLoadCustomVariables(Map vars) { + } + + public void loadFrom(ResourceLocation resLoc) { + JsonObject root = GuiLoader.getJson(resLoc); + if(root == null) + throw new RuntimeException("Could not load GUI file " + resLoc.toString()); + + if(!root.has("controls") || !root.get("controls").isJsonArray()) + throw new RuntimeException("In GUI file " + resLoc.toString() + ": missing root 'controls' object."); + + HashMap vars = new HashMap<>(); + vars.put("width", (double) width); + vars.put("height", (double) height); + vars.put("displayWidth", (double) mc.displayWidth); + vars.put("displayHeight", (double) mc.displayHeight); + addLoadCustomVariables(vars); + + JsonArray content = root.get("controls").getAsJsonArray(); + for(JsonElement elem: content) + controls.add(GuiLoader.create(new JsonOWrapper(elem.getAsJsonObject(), vars))); + + Field[] fields = getClass().getDeclaredFields(); + for(Field f: fields) { + f.setAccessible(true); + FillControl fc = f.getAnnotation(FillControl.class); + + if(fc != null) { + String name = fc.name().isEmpty() ? f.getName() : fc.name(); + Control ctrl = getControlByName(name); + + if(ctrl == null) { + if(fc.required()) + throw new RuntimeException("In GUI file " + resLoc.toString() + ": missing required control " + name); + + continue; + } + + if(!f.getType().isAssignableFrom(ctrl.getClass())) + throw new RuntimeException("In GUI file " + resLoc.toString() + ": invalid type for control " + name); + + try { + f.set(this, ctrl); + } catch(IllegalAccessException e) { + if(fc.required()) + throw new RuntimeException(e); + } + } + } + + if(root.has("center") && root.get("center").getAsBoolean()) + centerControls(); + } + + @Override + public void onResize(@Nonnull Minecraft mcIn, int w, int h) { + for(Control ctrl : controls) + ctrl.destroy(); + + controls.clear(); + super.onResize(mcIn, w, h); + } + + protected void requestAutocomplete(String beginning, boolean matchExact) { + WebDisplays.NET_HANDLER.sendToServer(new SMessageACQuery(beginning, matchExact)); + } + + public void onAutocompleteResult(NameUUIDPair pairs[]) { + } + + public void onAutocompleteFailure() { + } + + protected void requestSync() { + syncTicksLeft = syncTicks - 1; + } + + protected boolean syncRequested() { + return syncTicksLeft >= 0; + } + + protected void abortSync() { + syncTicksLeft = -1; + } + + protected void sync() { + } + + @Override + public void updateScreen() { + if(syncTicksLeft >= 0) { + if(--syncTicksLeft < 0) + sync(); + } + } + + public void drawItemStackTooltip(ItemStack is, int x, int y) { + renderToolTip(is, x, y); //Since it's protected... + } + + public void drawTooltip(java.util.List lines, int x, int y) { + drawHoveringText(lines, x, y, fontRenderer); //This is also protected... + } + + public void requirePostDraw(Control ctrl) { + if(!postDrawList.contains(ctrl)) + postDrawList.add(ctrl); + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } + + public abstract boolean isForBlock(BlockPos bp, BlockSide side); + + @Nullable + public String getWikiPageName() { + return null; + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/BasicControl.java b/src/main/java/net/montoyo/wd/client/gui/controls/BasicControl.java new file mode 100644 index 0000000..7d886e9 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/controls/BasicControl.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui.controls; + +import net.montoyo.wd.client.gui.loading.JsonOWrapper; + +public abstract class BasicControl extends Control { + + protected int x; + protected int y; + protected boolean visible = true; + protected boolean disabled = false; + + @Override + public int getX() { + return x; + } + + @Override + public int getY() { + return y; + } + + @Override + public void setPos(int x, int y) { + this.x = x; + this.y = y; + } + + public boolean isDisabled() { + return disabled; + } + + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + + public void enable() { + disabled = false; + } + + public void disable() { + disabled = true; + } + + public boolean isVisible() { + return visible; + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + + public void show() { + visible = true; + } + + public void hide() { + visible = false; + } + + @Override + public void load(JsonOWrapper json) { + super.load(json); + x = json.getInt("x", 0); + y = json.getInt("y", 0); + disabled = json.getBool("disabled", false); + visible = json.getBool("visible", true); + } + +} diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/Button.java b/src/main/java/net/montoyo/wd/client/gui/controls/Button.java new file mode 100644 index 0000000..007df39 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/gui/controls/Button.java @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.gui.controls; + +import net.minecraft.client.gui.GuiButton; +import net.montoyo.wd.client.gui.loading.JsonOWrapper; +import org.lwjgl.input.Keyboard; + +public class Button extends Control { + + protected final GuiButton btn; + protected boolean selected = false; + protected boolean shiftDown = false; + protected int originalColor = 0; + protected int shiftColor = 0; + + public static class ClickEvent extends Event

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