From 987a18c36065fcbbe0eb96b66906143fb42c15ba Mon Sep 17 00:00:00 2001 From: Andrew-71 Date: Sat, 29 Jul 2023 21:07:20 +0300 Subject: [PATCH] Begin 1.20 port (god this is horrible) --- CHANGELOG.txt | 2 + Common/build.gradle | 56 +- .../main/java/su/a71/tardim_ic/Constants.java | 11 + .../java/su/a71/tardim_ic/Registration.java | 8 + .../su/a71/tardim_ic/platform/Services.java | 25 + .../platform/services/IPlatformHelper.java | 38 + .../su/a71/tardim_ic/tardim_ic/Constants.java | 19 - .../{tardim_ic => }/utils/FakePlayer.java | 12 +- .../resources/{ => assets/tardim_ic}/icon.png | Bin .../block/digital_tardim_interface.json | 4 +- .../tardim_ic/models/block/food_machine.json | 4 +- .../models/block/redstone_tardim_input.json | 6 +- .../tardim_ic/models/block/tardim_dock.json | 4 +- .../digital_tardim_interface.png | Bin .../{blocks => block}/food_machine.png | Bin .../redstone_input.mcmeta} | 0 .../redstone_input.png} | Bin .../textures/block/redstone_input_lit.mcmeta | 7 + .../textures/block/redstone_input_lit.png | Bin 0 -> 923 bytes .../{blocks => block}/tardim_dock.png | Bin .../tardim_soviet_chronobox.png | Bin Common/src/main/resources/iconCurseForge.png | Bin 121412 -> 0 bytes Common/src/main/resources/pack.mcmeta | 10 +- .../src/main/resources/tardim_ic.mixins.json | 20 + Fabric/build.gradle | 61 +- .../com/example/examplemod/ExampleMod.java | 18 + .../examplemod/mixin/MixinTitleScreen.java | 20 + .../platform/FabricPlatformHelper.java | 24 + .../{tardim_ic => }/TardimInControl.java | 4 +- .../blocks/food_machine/FoodMachineBlock.java | 19 +- .../food_machine/FoodMachineTileEntity.java | 4 +- .../redstone_input/RedstoneInputBlock.java | 2 +- .../RedstoneInputTileEntity.java | 2 +- .../blocks/roundels/roundels.txt | 0 .../command/CommandCloisterBell.java | 2 +- .../command/CommandListBiomes.java | 2 +- .../command/CommandListDimensions.java | 2 +- .../command/CommandModemTransmit.java | 2 +- .../command/CommandSender.java | 2 +- .../FakeTardimPeripheralTileEntity.java | 2 +- .../ITardimPeripheralTileEntity.java | 2 +- .../TardimPeripheralProvider.java | 12 +- .../DigitalInterfaceBlock.java | 2 +- .../DigitalInterfaceTileEntity.java | 2 +- .../DigitalInterfacePeripheral.java | 13 +- .../peripherals/FuelStoragePeripheral.java | 4 +- .../peripherals/TardimPeripheral.java | 4 +- .../peripherals/TardimScannerPeripheral.java | 7 +- .../peripherals/TimeRotorPeripheral.java | 4 +- .../cartridge_loader/temp_ideas.txt | 0 .../display_source/dock/temp_ideas.txt | 0 .../fuel_storage/FuelLevelDisplaySource.java | 2 +- .../RequiredFuelDisplaySource.java | 2 +- .../display_source/scanner/temp_ideas.txt | 0 .../display_source/time_rotor/temp_ideas.txt | 0 .../jammer/PersonalJammerMaterial.java | 2 +- .../mixin/BetterFuelMapMixin.java | 21 +- .../mixin/BetterFuelStorageMixin.java | 5 +- .../{tardim_ic => }/mixin/JammerMixin.java | 2 +- .../platform/FabricPlatformHelper.java | 24 + .../SovietChronoboxTileEntity.java | 2 +- .../a71/tardim_ic/tardim_ic/Registration.java | 78 -- .../tardim_ic/registration/CommandInit.java | 6 +- .../registration/ComputerCraftCompat.java | 8 +- .../tardim_ic/registration/CreateCompat.java | 4 +- .../tardim_ic/registration/Exteriors.java | 2 +- ...amplemod.platform.services.IPlatformHelper | 1 + Fabric/src/main/resources/fabric.mod.json | 49 +- .../src/main/resources/mixins.tardim_ic.json | 17 - .../resources/tardim_ic.fabric.mixins.json | 18 + Forge/build.gradle | 77 +- .../com/example/examplemod/ExampleMod.java | 19 + .../examplemod/mixin/MixinTitleScreen.java | 20 + .../platform/ForgePlatformHelper.java | 26 + ...dimInControl.java => TardiminControl.java} | 7 +- .../platform/ForgePlatformHelper.java | 26 + .../a71/tardim_ic/tardim_ic/Registration.java | 64 -- .../command/CommandCloisterBell.java | 59 -- .../tardim_ic/command/CommandListBiomes.java | 54 -- .../command/CommandListDimensions.java | 47 - .../command/CommandModemTransmit.java | 69 -- .../tardim_ic/command/CommandSender.java | 40 - .../DigitalInterfaceBlock.java | 27 - .../DigitalInterfacePeripheral.java | 887 ------------------ .../DigitalInterfaceTileEntity.java | 118 --- .../FakeDigitalInterfaceTileEntity.java | 89 -- .../IDigitalInterfaceEntity.java | 12 - .../tardim_ic/tardim_ic/mixin/Commands.java | 18 - .../redstone_input/RedstoneInputBlock.java | 102 -- .../RedstoneInputTileEntity.java | 41 - .../tardim_ic/registration/CommandInit.java | 17 - Forge/src/main/resources/META-INF/mods.toml | 60 +- ...amplemod.platform.services.IPlatformHelper | 1 + .../resources/examplemod.forge.mixins.json | 17 + .../src/main/resources/mixins.tardim_ic.json | 15 - SWD_MOMENT.txt | 1 - TODO | 5 + TODO.txt | 95 -- build.gradle | 39 +- gradle.properties | 14 +- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 275 +++--- gradlew.bat | 14 +- settings.gradle | 15 +- 105 files changed, 757 insertions(+), 2300 deletions(-) create mode 100644 Common/src/main/java/su/a71/tardim_ic/Constants.java create mode 100644 Common/src/main/java/su/a71/tardim_ic/Registration.java create mode 100644 Common/src/main/java/su/a71/tardim_ic/platform/Services.java create mode 100644 Common/src/main/java/su/a71/tardim_ic/platform/services/IPlatformHelper.java delete mode 100644 Common/src/main/java/su/a71/tardim_ic/tardim_ic/Constants.java rename Common/src/main/java/su/a71/tardim_ic/{tardim_ic => }/utils/FakePlayer.java (73%) rename Common/src/main/resources/{ => assets/tardim_ic}/icon.png (100%) rename Common/src/main/resources/assets/tardim_ic/textures/{blocks => block}/digital_tardim_interface.png (100%) rename Common/src/main/resources/assets/tardim_ic/textures/{blocks => block}/food_machine.png (100%) rename Common/src/main/resources/assets/tardim_ic/textures/{blocks/red_contr.png.mcmeta => block/redstone_input.mcmeta} (100%) rename Common/src/main/resources/assets/tardim_ic/textures/{blocks/red_contr.png => block/redstone_input.png} (100%) create mode 100644 Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input_lit.mcmeta create mode 100644 Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input_lit.png rename Common/src/main/resources/assets/tardim_ic/textures/{blocks => block}/tardim_dock.png (100%) rename Common/src/main/resources/assets/tardim_ic/textures/{blocks => block}/tardim_soviet_chronobox.png (100%) delete mode 100644 Common/src/main/resources/iconCurseForge.png create mode 100644 Common/src/main/resources/tardim_ic.mixins.json create mode 100644 Fabric/src/main/java/com/example/examplemod/ExampleMod.java create mode 100644 Fabric/src/main/java/com/example/examplemod/mixin/MixinTitleScreen.java create mode 100644 Fabric/src/main/java/com/example/examplemod/platform/FabricPlatformHelper.java rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/TardimInControl.java (82%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/blocks/food_machine/FoodMachineBlock.java (81%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/blocks/food_machine/FoodMachineTileEntity.java (91%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/blocks/redstone_input/RedstoneInputBlock.java (98%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/blocks/redstone_input/RedstoneInputTileEntity.java (94%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/blocks/roundels/roundels.txt (100%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/command/CommandCloisterBell.java (98%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/command/CommandListBiomes.java (98%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/command/CommandListDimensions.java (97%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/command/CommandModemTransmit.java (98%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/command/CommandSender.java (95%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/FakeTardimPeripheralTileEntity.java (97%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/ITardimPeripheralTileEntity.java (89%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/TardimPeripheralProvider.java (73%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/blocks/digital_interface/DigitalInterfaceBlock.java (91%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/blocks/digital_interface/DigitalInterfaceTileEntity.java (85%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/peripherals/DigitalInterfacePeripheral.java (98%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/peripherals/FuelStoragePeripheral.java (93%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/peripherals/TardimPeripheral.java (94%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/peripherals/TardimScannerPeripheral.java (95%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/computercraft_compat/peripherals/TimeRotorPeripheral.java (96%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic/create_compat => }/display_source/cartridge_loader/temp_ideas.txt (100%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic/create_compat => }/display_source/dock/temp_ideas.txt (100%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic/create_compat => }/display_source/fuel_storage/FuelLevelDisplaySource.java (96%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic/create_compat => }/display_source/fuel_storage/RequiredFuelDisplaySource.java (96%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic/create_compat => }/display_source/scanner/temp_ideas.txt (100%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic/create_compat => }/display_source/time_rotor/temp_ideas.txt (100%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/jammer/PersonalJammerMaterial.java (97%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/mixin/BetterFuelMapMixin.java (72%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/mixin/BetterFuelStorageMixin.java (94%) rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/mixin/JammerMixin.java (98%) create mode 100644 Fabric/src/main/java/su/a71/tardim_ic/platform/FabricPlatformHelper.java rename Fabric/src/main/java/su/a71/tardim_ic/{tardim_ic => }/soviet_chronobox/SovietChronoboxTileEntity.java (90%) delete mode 100644 Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java create mode 100644 Fabric/src/main/resources/META-INF/services/com.example.examplemod.platform.services.IPlatformHelper delete mode 100644 Fabric/src/main/resources/mixins.tardim_ic.json create mode 100644 Fabric/src/main/resources/tardim_ic.fabric.mixins.json create mode 100644 Forge/src/main/java/com/example/examplemod/ExampleMod.java create mode 100644 Forge/src/main/java/com/example/examplemod/mixin/MixinTitleScreen.java create mode 100644 Forge/src/main/java/com/example/examplemod/platform/ForgePlatformHelper.java rename Forge/src/main/java/su/a71/tardim_ic/{tardim_ic/TardimInControl.java => TardiminControl.java} (64%) create mode 100644 Forge/src/main/java/su/a71/tardim_ic/platform/ForgePlatformHelper.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandCloisterBell.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListBiomes.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListDimensions.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceBlock.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfacePeripheral.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceTileEntity.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/FakeDigitalInterfaceTileEntity.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/IDigitalInterfaceEntity.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/Commands.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redstone_input/RedstoneInputBlock.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redstone_input/RedstoneInputTileEntity.java delete mode 100644 Forge/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CommandInit.java create mode 100644 Forge/src/main/resources/META-INF/services/com.example.examplemod.platform.services.IPlatformHelper create mode 100644 Forge/src/main/resources/examplemod.forge.mixins.json delete mode 100644 Forge/src/main/resources/mixins.tardim_ic.json create mode 100644 TODO delete mode 100644 TODO.txt diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 3afeadc..9265a1a 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,5 @@ +TODO: Rewrite for 1.20 + Added list-biomes and list-dimensions TARDIM commands + Corresponding ComputerCraft methods This is a community-requested QOL feature that lets users scroll through available biomes and, with lua methods, make advanced navigation dashboards even easier. diff --git a/Common/build.gradle b/Common/build.gradle index 16f36a0..4b3e231 100644 --- a/Common/build.gradle +++ b/Common/build.gradle @@ -1,66 +1,34 @@ plugins { + id 'idea' id 'java' - id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' id 'maven-publish' + id 'org.spongepowered.gradle.vanilla' +} +base { + archivesName = "${mod_name}-common-${minecraft_version}" } - -archivesBaseName = "${mod_name}-common-${minecraft_version}" - minecraft { version(minecraft_version) - runs { - if (project.hasProperty('common_runs_enabled') ? project.findProperty('common_runs_enabled').toBoolean() : true) { - - server(project.hasProperty('common_server_run_name') ? project.findProperty('common_server_run_name') : 'vanilla_server') { - workingDirectory(this.file("run")) - } - client(project.hasProperty('common_client_run_name') ? project.findProperty('common_client_run_name') : 'vanilla_client') { - workingDirectory(this.file("run")) - } - } - } -} - -repositories { - maven { - url "https://cursemaven.com" - content { - includeGroup "curse.maven" - } + if(file("src/main/resources/${mod_id}.accesswidener").exists()){ + accessWideners(file("src/main/resources/${mod_id}.accesswidener")) } } dependencies { - compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' - implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' + compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' + implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' - // CC: R and TARDIM - //implementation("curse.maven:cc-restitched-462672:3908334") - //compileOnly("org.squiddev:cc-tweaked-1.19.1:${cc_version}") - //compileOnly("curse.maven:tardim-531315:4453925") - //implementation ("org.squiddev:cc-tweaked-1.19.1:${cc_version}") -} - -processResources { - - def buildProps = project.properties.clone() - - filesMatching(['pack.mcmeta']) { - - expand buildProps - } + // ComputerCraft + compileOnly("cc.tweaked:cc-tweaked-$minecraft_version-common-api:$cc_version") } publishing { publications { mavenJava(MavenPublication) { - groupId project.group - artifactId project.archivesBaseName - version project.version + artifactId base.archivesName.get() from components.java } } - repositories { maven { url "file://" + System.getenv("local_maven") diff --git a/Common/src/main/java/su/a71/tardim_ic/Constants.java b/Common/src/main/java/su/a71/tardim_ic/Constants.java new file mode 100644 index 0000000..2866edb --- /dev/null +++ b/Common/src/main/java/su/a71/tardim_ic/Constants.java @@ -0,0 +1,11 @@ +package su.a71.tardim_ic; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Constants { + + public static final String MOD_ID = "tardim_ic"; + public static final String MOD_NAME = "TARDIM: In Control"; + public static final Logger LOG = LoggerFactory.getLogger(MOD_NAME); +} \ No newline at end of file diff --git a/Common/src/main/java/su/a71/tardim_ic/Registration.java b/Common/src/main/java/su/a71/tardim_ic/Registration.java new file mode 100644 index 0000000..690fc4c --- /dev/null +++ b/Common/src/main/java/su/a71/tardim_ic/Registration.java @@ -0,0 +1,8 @@ +package su.a71.tardim_ic; + +public class Registration { + + public static void register() { + + } +} diff --git a/Common/src/main/java/su/a71/tardim_ic/platform/Services.java b/Common/src/main/java/su/a71/tardim_ic/platform/Services.java new file mode 100644 index 0000000..9d04e24 --- /dev/null +++ b/Common/src/main/java/su/a71/tardim_ic/platform/Services.java @@ -0,0 +1,25 @@ +package su.a71.tardim_ic.platform; + +import com.example.examplemod.Constants; +import su.a71.tardim_ic.platform.services.IPlatformHelper; + +import java.util.ServiceLoader; + +public class Services { + + // Platform helper that lets us do stuff for Forge/Fabric while being in Common + public static final IPlatformHelper PLATFORM = load(IPlatformHelper.class); + + // This code is used to load a service for the current environment. Your implementation of the service must be defined + // manually by including a text file in META-INF/services named with the fully qualified class name of the service. + // Inside the file you should write the fully qualified class name of the implementation to load for the platform. For + // example our file on Forge points to ForgePlatformHelper while Fabric points to FabricPlatformHelper. + public static T load(Class clazz) { + + final T loadedService = ServiceLoader.load(clazz) + .findFirst() + .orElseThrow(() -> new NullPointerException("Failed to load service for " + clazz.getName())); + Constants.LOG.debug("Loaded {} for service {}", loadedService, clazz); + return loadedService; + } +} \ No newline at end of file diff --git a/Common/src/main/java/su/a71/tardim_ic/platform/services/IPlatformHelper.java b/Common/src/main/java/su/a71/tardim_ic/platform/services/IPlatformHelper.java new file mode 100644 index 0000000..e453066 --- /dev/null +++ b/Common/src/main/java/su/a71/tardim_ic/platform/services/IPlatformHelper.java @@ -0,0 +1,38 @@ +package su.a71.tardim_ic.platform.services; + +public interface IPlatformHelper { + + /** + * Gets the name of the current platform + * + * @return The name of the current platform. + */ + String getPlatformName(); + + /** + * Checks if a mod with the given id is loaded. + * + * @param modId The mod to check if it is loaded. + * @return True if the mod is loaded, false otherwise. + */ + boolean isModLoaded(String modId); + + /** + * Check if the game is currently in a development environment. + * + * @return True if in a development environment, false otherwise. + */ + boolean isDevelopmentEnvironment(); + + /** + * Gets the name of the environment type as a string. + * + * @return The name of the environment type. + */ + default String getEnvironmentName() { + + return isDevelopmentEnvironment() ? "development" : "production"; + } + + // TODO: Add registration stuff here? +} \ No newline at end of file diff --git a/Common/src/main/java/su/a71/tardim_ic/tardim_ic/Constants.java b/Common/src/main/java/su/a71/tardim_ic/tardim_ic/Constants.java deleted file mode 100644 index 7ad9f1f..0000000 --- a/Common/src/main/java/su/a71/tardim_ic/tardim_ic/Constants.java +++ /dev/null @@ -1,19 +0,0 @@ -package su.a71.tardim_ic.tardim_ic; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class Constants { - - public static final String MOD_ID = "tardim_ic"; - public static final String MOD_NAME = "TARDIM: In Control"; - public static final Logger LOG; - public static final Gson GSON; - - static { - LOG = LoggerFactory.getLogger(MOD_NAME); - GSON = (new GsonBuilder()).setPrettyPrinting().create(); - } -} \ No newline at end of file diff --git a/Common/src/main/java/su/a71/tardim_ic/tardim_ic/utils/FakePlayer.java b/Common/src/main/java/su/a71/tardim_ic/utils/FakePlayer.java similarity index 73% rename from Common/src/main/java/su/a71/tardim_ic/tardim_ic/utils/FakePlayer.java rename to Common/src/main/java/su/a71/tardim_ic/utils/FakePlayer.java index c55aabc..c37a7d9 100644 --- a/Common/src/main/java/su/a71/tardim_ic/tardim_ic/utils/FakePlayer.java +++ b/Common/src/main/java/su/a71/tardim_ic/utils/FakePlayer.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.utils; +package su.a71.tardim_ic.utils; import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; @@ -7,14 +7,18 @@ import net.minecraft.world.level.Level; import java.util.UUID; +/** + * This class is used whenever we need a player for a function but cannot get one + * (i.g we are on server side and need to execute TARDIM command) + */ public class FakePlayer extends Player { public FakePlayer(Level lvl, BlockPos blockPos) { - super(lvl, blockPos, 0, new GameProfile(UUID.randomUUID(), "FakePlayer_tardimic"), null); + super(lvl, blockPos, 0, new GameProfile(UUID.randomUUID(), "FakePlayer_tardimic")); } public FakePlayer(Level lvl, BlockPos blockPos, UUID id) { - super(lvl, blockPos, 0, new GameProfile(id, "FakePlayer_tardimic"), null); + super(lvl, blockPos, 0, new GameProfile(id, "FakePlayer_tardimic")); } @@ -28,5 +32,3 @@ public class FakePlayer extends Player { return false; } } - - diff --git a/Common/src/main/resources/icon.png b/Common/src/main/resources/assets/tardim_ic/icon.png similarity index 100% rename from Common/src/main/resources/icon.png rename to Common/src/main/resources/assets/tardim_ic/icon.png diff --git a/Common/src/main/resources/assets/tardim_ic/models/block/digital_tardim_interface.json b/Common/src/main/resources/assets/tardim_ic/models/block/digital_tardim_interface.json index 424c48e..490fd9d 100644 --- a/Common/src/main/resources/assets/tardim_ic/models/block/digital_tardim_interface.json +++ b/Common/src/main/resources/assets/tardim_ic/models/block/digital_tardim_interface.json @@ -3,8 +3,8 @@ "parent": "digital_tardim_interface", "texture_size": [64, 64], "textures": { - "1": "tardim_ic:blocks/digital_tardim_interface", - "particle": "tardim_ic:blocks/digital_tardim_interface" + "1": "tardim_ic:block/digital_tardim_interface", + "particle": "tardim_ic:block/digital_tardim_interface" }, "elements": [ { diff --git a/Common/src/main/resources/assets/tardim_ic/models/block/food_machine.json b/Common/src/main/resources/assets/tardim_ic/models/block/food_machine.json index c4b5c76..7cbaf76 100644 --- a/Common/src/main/resources/assets/tardim_ic/models/block/food_machine.json +++ b/Common/src/main/resources/assets/tardim_ic/models/block/food_machine.json @@ -2,8 +2,8 @@ "credit": "Made by karoter2 (Feulim)", "texture_size": [128, 128], "textures": { - "0": "tardim_ic:blocks/food_machine", - "particle": "tardim_ic:blocks/food_machine" + "0": "tardim_ic:block/food_machine", + "particle": "tardim_ic:block/food_machine" }, "elements": [ { diff --git a/Common/src/main/resources/assets/tardim_ic/models/block/redstone_tardim_input.json b/Common/src/main/resources/assets/tardim_ic/models/block/redstone_tardim_input.json index 4c58cdf..2068e27 100644 --- a/Common/src/main/resources/assets/tardim_ic/models/block/redstone_tardim_input.json +++ b/Common/src/main/resources/assets/tardim_ic/models/block/redstone_tardim_input.json @@ -3,9 +3,9 @@ "parent": "block/cube_all", "ambientocclusion": false, "textures": { - "1": "tardim_ic:blocks/red_contr", - "2": "tardim_ic:blocks/red_contr2", - "particle": "tardim_ic:blocks/red_contr" + "1": "tardim_ic:block/redstone_input", + "2": "tardim_ic:block/redstone_input", + "particle": "tardim_ic:block/redstone_input" }, "elements": [ { diff --git a/Common/src/main/resources/assets/tardim_ic/models/block/tardim_dock.json b/Common/src/main/resources/assets/tardim_ic/models/block/tardim_dock.json index b9be28f..33ff950 100644 --- a/Common/src/main/resources/assets/tardim_ic/models/block/tardim_dock.json +++ b/Common/src/main/resources/assets/tardim_ic/models/block/tardim_dock.json @@ -2,8 +2,8 @@ "credit": "Made by karoter2 (Feulim)", "texture_size": [64, 64], "textures": { - "1": "tardim_ic:blocks/tardim_dock", - "particle": "tardim_ic:blocks/tardim_dock" + "1": "tardim_ic:block/tardim_dock", + "particle": "tardim_ic:block/tardim_dock" }, "elements": [ { diff --git a/Common/src/main/resources/assets/tardim_ic/textures/blocks/digital_tardim_interface.png b/Common/src/main/resources/assets/tardim_ic/textures/block/digital_tardim_interface.png similarity index 100% rename from Common/src/main/resources/assets/tardim_ic/textures/blocks/digital_tardim_interface.png rename to Common/src/main/resources/assets/tardim_ic/textures/block/digital_tardim_interface.png diff --git a/Common/src/main/resources/assets/tardim_ic/textures/blocks/food_machine.png b/Common/src/main/resources/assets/tardim_ic/textures/block/food_machine.png similarity index 100% rename from Common/src/main/resources/assets/tardim_ic/textures/blocks/food_machine.png rename to Common/src/main/resources/assets/tardim_ic/textures/block/food_machine.png diff --git a/Common/src/main/resources/assets/tardim_ic/textures/blocks/red_contr.png.mcmeta b/Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input.mcmeta similarity index 100% rename from Common/src/main/resources/assets/tardim_ic/textures/blocks/red_contr.png.mcmeta rename to Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input.mcmeta diff --git a/Common/src/main/resources/assets/tardim_ic/textures/blocks/red_contr.png b/Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input.png similarity index 100% rename from Common/src/main/resources/assets/tardim_ic/textures/blocks/red_contr.png rename to Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input.png diff --git a/Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input_lit.mcmeta b/Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input_lit.mcmeta new file mode 100644 index 0000000..fe2f8d3 --- /dev/null +++ b/Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input_lit.mcmeta @@ -0,0 +1,7 @@ +{ + "animation": { + "frametime": 10, + "interpolate": true, + "frames": [0, 1, 2, 3] + } +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input_lit.png b/Common/src/main/resources/assets/tardim_ic/textures/block/redstone_input_lit.png new file mode 100644 index 0000000000000000000000000000000000000000..78091034e6ade15ab81a72cc3d69f37b68dd57f2 GIT binary patch literal 923 zcmV;M17!S(P)Px&RY^oaR7i>KmS1RFbri=xX>xnhE=^5s5_XMyGJ*Nfmpk@Qoa@vVh0>xAT4mj6 z(HCKY6dZ$MyTYDSMxh9bpsZUMO6geNZNb6R9ux$HpYz2wSMo=*ByE$J1%3FXw`nMA z_gZ$I&hOsu@6S2E^WpqFsZ>ftlv2-syuh}FOfQhH)py2RHCilFgROAHAWkBYa2&_;!_j`< zJ6+Xctvhz4BjWFj`dg-Kr7Pu3rLewf28{=wm3+_3w%JeSOYpDe&9sd0xon-a2yfg^*1f(h^%Q@ujy@T zIq}@ktcU~`-z$869=N{ntlnYgNX-KgN#9QcYuUon;clQ(UTYTQt94(#S_eaqZQHh2 zY!T^x`^zFIrN-X^ENDy%nclXL={17}P|j3DBsn~&lp34g9R2hU!1>~u<2dC^1u%m~ zV+S9EBL<+9a!w6cFdF+20E?Gj)N5-&BTKHm7X7}n&ktGp^oJ~c`r>vpo>VHO!wr9X zb&t~6UjEp`wVmRdo}Nx563@hrbjKRS=St0>;SaWJe^>E2jcTj!x`yRZSM<*Oy& zUc4dm*|y!1X?FAAW_%~;!^Xq8h;rGesXyW1SZhqk={%1-nzgey_a-<`0v=!e>x4|#IJJ)>JRx`F4Wr#tYr($f_$~!rf*7{ zZQCP@w}GCmn&;2Ilv3%_mn_S21tHVx3z^&MQXDYvljLmOeJelI=4QHcnji3Fd xe!V|^rtEQfsI>Ah8gsyMdFW4{(axdb;eUe3asc`m;~4+|002ovPDHLkV1k;6$<6=( literal 0 HcmV?d00001 diff --git a/Common/src/main/resources/assets/tardim_ic/textures/blocks/tardim_dock.png b/Common/src/main/resources/assets/tardim_ic/textures/block/tardim_dock.png similarity index 100% rename from Common/src/main/resources/assets/tardim_ic/textures/blocks/tardim_dock.png rename to Common/src/main/resources/assets/tardim_ic/textures/block/tardim_dock.png diff --git a/Common/src/main/resources/assets/tardim_ic/textures/blocks/tardim_soviet_chronobox.png b/Common/src/main/resources/assets/tardim_ic/textures/block/tardim_soviet_chronobox.png similarity index 100% rename from Common/src/main/resources/assets/tardim_ic/textures/blocks/tardim_soviet_chronobox.png rename to Common/src/main/resources/assets/tardim_ic/textures/block/tardim_soviet_chronobox.png diff --git a/Common/src/main/resources/iconCurseForge.png b/Common/src/main/resources/iconCurseForge.png deleted file mode 100644 index dac272e1390fc1f4e6dfd1548ec3640687c4caaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121412 zcmZ^KbyOSg^EK{J2o`8?x8fy8i@OwecXudWT!Ry!#VNG7yA!-P6n8JBI0cHd?|#0& zzu!Z0PO=2DJI_3K?%cT>r>-WCk3)%rgoK2zs34<>goK>(-xCW1I1<|XdIEUk;vg-p z?qFqwgv2@xPwiGl@c@sAJ8G2ds7uQX;gjLxXc8vcL?lFJOX?=%yM=L&qJV2k;C{pM4dqAFPC>1)CXeF8g{pjVYVzBCFPmn6niFN? za>Q=}s*BFo8i@x64#xoKKMH4Of6t zK7^FxuE3x2cr0$%TMtR3K;_znq{FvRS8%eHVZMqgVvpz*4%Y__&rg2|yI1GLFt;}& z8^<#PJl8o0DChU84efq2S?Bw|5 z0N-$~%G$cmKqBkJ0x*Ui-4Ak!$>G7>)BZx{ z4?=^g&PWYHGl9q&Ppux$ha33h@r|<$DMlnOq zz!mX;Wxk3HHfqD6VpA?gg3Nwh z03U7A(TtApex8NZK1p69%;Xw@E!J_KyS8z3gRIU9=ktzCsJ^eey}f|JCSVinBsdbU z^ouGQr2N_fe>E=|7MTCL`?vOQc88aG@Bbe8{U6Ry{a_>idzjgZF{k|B%Mm~I|KID; zf=49a&)+f|KlgHp-}P_zfl>AEMSq-&_xD4g(0|lZG?8lT*MyTdI{ksp(B!PjL(LREVP$rRn3K@i?|M7i`V6>+4{YHuy;C3@^adp!p-YKw$X(cSdtq z3F3B>R8SqVJnh1Cr6$WHU3x<0vstB+zdiK?QJ$k5iCqn&I{GAB?5fvjHjDhIkA0B7 z&;siO>bJPh=yiqum?TKqrz5-5I@x=XKN-u7d?3~Og?X_e?Sq=dIn_r}-=Lhzi8_jL z)&_I6O0{-eQ?1iAkUb!Y2MbO(5ABCQ8=O+T z2S(;(GsDH|WY-9D4a%yg+AcnIUz3k-hONW|{=4XP4#e(ckP~wzUbTKzWr7Sn{N`GL zaCHnSfBHp=f!jf294@Otp*=ijzKpUuH{-`q^;-zZuG+}?!sV+f9)F`b5?PNDk>v)C zGW{nCCeOUV`Pk2=wF%`%tbGmN^)t11s+F`_k(+&b_#S- zi!O`KhkpJud0}PpnF~YQNrNzV)jX~w)1nN`C{BXj;qUix=mQtB3q1*ZsDV!(PNr;@ zNAjsA?~fXb7X06t*Y|k^X39>?oHJEn?h-=)8cp=x5?IuA65% zaVksO)5+q_E#BSBB+P#zAFX-n{_~(G%p@R=bTNA!+9zTr9kJvAXZ=xAIQ#bY+BBHv zQ?vbEiXK_IP8kS$AyY2n*W*W-URkfQnt%KfGlvE>ye1SAIEgwAKTpVJoRcrXIsXO2 z%83U-TlFOOsUy0xRM{p)Men zX4OfP=M&vMqy9h)>g9zNquFNw|ijJzXk$*jq*lqe5V@U88g<+XEZgS{Tb~^Z_)qDBXIkqoZIjiYMQ~b)D zwsjOF@oseKQ{;-(oM9S>vUY|Eni%@nE%Z-x(0d~H@oQuTopb{jWBtHbu@3t-iV*W^nm$y) zqB?;kitWYL^|vML?;$)`4T^fXBYN& zYut@p4QGVx*cXY6JJkE|q7RMIKJVEXcEeUP90q6IG%B5HsVq7)BY(0>CCr)3{tHlH z?yUv_-`kIcRWW+L{n#VB;HGFz#P-Co$77`N(yBo_n{?2^k5`2jDqUXfW}?HIQN3o+ z+0}Xx_vJ9oZ&R8xP9d8~;7OIiwDoIAp{$TZ09Tod_Ch2=FmCG4YmMyQ@1D#A?)k=T zE~b~;?k68{CQX+O)1o5GC*IBu{q>4wXU7s{PL<%eJi;ncuzb5RYo231_4hhpwDEOK zrig*p8(*iFuel9oF4^Hj_C-GfKj$dot$`j-vAR_(XEN14750BFMOc?(bM8z(*PK6t zdz1dVoce9NQOhtOwIziRAuLk#!caS&MT@5I+4q}wh`Y09k65Mw4esIVZW4#VOAF22 zkpxKTYBe`C*>@SwWW3^vuX$KayXuN)WDfy-)p%n*Dtcs5e4~|hT3PusAVI%we$+}I=E~k3lKGBgvFM6F zQ?`hgJ65c%Vo{+YCi40yIFtCpzP09V8_izwJHsEgAWa^#BCM`;)WfJ@`yw7gRux@J zxNoxb-IfBtTg*Hn7gcHRefTS02UPn6B1B^REqJB{zqAi`6-xTiUJJ`h{{${s?~$S* zdoSqAg{!uuMs@)CmJE56uePxsX$H?~NPe137qvU?)DEOs@+uyryYn6ae+QDRkomKy znvJP1|KWv8rIX;y(SDM1aV;f?JqNsXC@pN%c!&O?@sk9^nEy|Dp%|pZTY5PdSw%*I z4&KA|FBLwrTs7ZjhWsN@{)z1IhCSgh5I)mSr3^tfv=@VanKIKsBlrl?NrPvP1b^vD zV>T!9>S1ejCb903rAF_U=nHx^SSpV+pq0fqH z(`6mErW>AN`I2BzVAY>0?9wS70E?zdc zR#lHOJvaKSGVMG1#9r>c9(gkMz8;xsEzFhOeJ0LhCUHg$4GHm>oQ0Ex`_Rme?=3y_ zo82w^;qDzKFM$Y=lFg;B_O@qHVYM{l3cN*IloZ^A1)|LGMt;H4Opt)M&#UiWmzL%z zP=R%~pZ2#@BYF|bPuY4l$K}-}u>K0ef-D|+r6(k@(UB(NxCyKJ>yrhL=wUy}5rWLMUQpixETNwoH}ZzE|`E zpcV^&8VAl4*bsZ9kZPyyr9~|jT^w|~>|O9%Eif0He5J7!GzbZmaTlXuhMo-}LDaqo z2rLa3WodH2VjYMK<0J;-Xi(%`GG>1|n)RqB-ZdBfzJYoN+Y1ObW!ODkqi;9I=dN25^;kxF zAog+6Bz5Fo_#X8vQ+JYE7-7Bv_3Jk?bI~4dB_nMZoh}q}FUm`yTbh@IJ*#Oa7);?P zv0jIl*nN5;JqXNfNR>c5V*c&H7=!xrJ2+CzTn)8#5;@MiaUk^MAtAu%iVy;BqVHN(o^=}gRKV*j zAM&LinMa#?s-07iEUMf{n}eHy8kYG3zg9URXbMY2qlnZiD&vlK3FTyZND`4Mt|wq* zj;vTJfZu0Vc=Aa`8$QDvn*D>T_T$1ha9XRJ6P{XTYc>uFB=amE=HT% z^7F1Lyeb1}z4Hf8&tY1$8AbH`TPv~S5yD)u4H>@CmdN^x1YG>B5e~;VHZOQKd33G# zd!Fb3>hG$hF<&*sL+1O>>4^GJ`%T~LIA%PI|G0KzKQYAIH~sF}r2YGe{fCtgzrl$W z{_6KbLlVlYYn=9mp4CA(*`n%E?&kD@=GD69tqz&5^63Wc-Rm$%dxM zJj!cvoH6N<7XZ8xb7+B%pU^8_gX03@lb=@fvD}o(KUx!_!uRo9%w`GJhytiB7N*g3 zXiVR!xPR}k>I{-OQb;&){=#GE=nV>saD{y~g@x5BB?a)R*)dJoRj4s0UmgIo@(+UH z=Cm>Pap=uZq3kuL71di6B^VhgvvB(?n=0m@n#cW4B+a4sr| z>Yhe8#>w~`fNwML!U0@qEyuPcJrfkoLcOajQa=Z$mDyd~4g%5M)FACJ51B^|yqYu* z_$a~Quv4dOo}Azx<1bd{vlerIZu8rqI z8*dLb{{|p&U3d(p`0sQ{ZpV~>960+VD3!Bt>2Xb8*~^#Z(1x_SmZJY5qQ|^)s>a7m zTV-vo#18+qT+n1m1S`tH7JJF)SD)1+h^}Fr&(pc@Pkywb{4L>|=ST zn2OBK(FbN*ik1~9OjZbpVo$rm)vI@zQiJ(;zg5ET2g@nb;}NWaVm7cI^S};_?%x@< zhn-7-l{e(5?m{mi+8hy)m%w%F79AJ76(uTX@Gf30{AH?=Z@yf_j#Ra>=!}V zyQS}_-Q>|XlW-<*QKv#LmG%l>TJ=hwrt5-s>d4bQYxtT`T(4niAIT#2y?d(M#&f63 zPx&SVb5VykuxbhT@C-p)5SzNB6nC=#(27_Lj1`6!Uxvrb5oKdBqsRod;z?SKc!!A% zq%Ocz{!}5LJTvg9_R?mGTMFD4*FDCpzusg0UUE|u+fwHFrH~8b0JhOYf*}1b-kw|l z)XmHp(|}XjTjA-i&B`PiJKcE92sa%0T?8LGO0Ye|>xHl#&aNq5TAo2}31DKC!kR+BR_I_C;7GJ|n?D zAxssHmb|8#f}Ucr^;=07ry9`_)cC8@UosS^(?_$20Rn*=+jo=_ZZXY0h1m@@m`K$l zJ3j*YhlxdyNA?qGMP*;cex9iAv z{+Qy}K&Fls$gy9yae#lAt~$x5Y|gc9T~Tx9{<&62b{RrM@Gu^tr(()0@6tM)xMt*e z5R@pH3$R<&vkDIPxU4BNt;!F21&DuXaWwsS`e2uQX#mi|AY>wsT`z#}kG!c6=?k5e z@{j$DDE=;}7IH#Pc%rK_a$<(RCi&$Jid|oW0GLY&mKj;b4rekBVJE_lzSP{=C>azJ zTEe(AnDF?XaOo&63%WF9YRyuzKdECE9Of|L->79G6c0SM1%(sk-e^UkHfI4v+8t^I zSFdqpuSMtvQ!am|0l zX|emTLz;YzSHk9;gdRz1h@W1X4l(PvP>cpk+Pqt%xd>hoU8XqeO(+Ahx*zf=t^aii zja9F5npiz;$?`$?Yi)Q-a@@Wh48S^m47cUsx5q3{YQ|Xffd)Qkp6)%*tJ;iTLW#ms zyRl5tETtAl8r*U$aQCSqZH#pI@NpBuPw^UaI8;)3_hbNXpkcMo%{(RlB)Z1A|M3Oiw^4KcHUEP-tNO8ayXQ{71!hkjeIAh5t3 zse^(k*_Ym3q#9@@%y-_XEK^NKo&UikU7uv!l~8d$tZST(p3{!&qByv}t&19Ph1ob< z>@i`>{RNSUjZr+fbjTBQ^5$j@7BK>Psx-X;J}XkFP!_t{7gCY9z7QcfZeqXog55GV z4`DrM9%!(=%SH}#)-7cal%0`%BvAH&PeI|&e`*QSX7adC&M)$H>L;fEs@})&C8;Rv zd_2$%AGS-_`#ltvzsg^HZ**cAPd$?#fRc-C$Sb^8trXE{pmV;ca1`72GD2l{$TVJ3 z*;27cY>}f zs@97D?#XyLYkspu3QO%8IWCbBPq^^T-d^EhqEou&IU75|n*xiJ_qE1Q5Ip$@^Rx4q zI&yNvAV7YdTvQn4ef+f_Z!Nj|-`fd?baA?iRCaX{j7^Ha1ie4@l#H`((iSy2x3N)A z!i8m`Jq80{woG?_17O#qV%&<7xTkzbGyt9j!nvOf5T-G!lt3{GNBzvyTq%burB`lb zo)GpDgc~i%fv`x9Bo-}?B!MKPEe}}C7-)aFy*0=C!3cTxz@Jk84#vbg(is^_~>X}`MuH2*2ZJts&CTv zXv*%Fv`}Bcfg#IpfMedQ5~>83@|v*W84}$-SDh|T&oFZ&uN%&(>@ojM^Sac8s>aP&MK3Po%GP7VfUs`uBN! z@nnYZ8G-6cRJk&;W(QDoEV!KE&}NtA0Rs3Yi%R z$_bIT5T@n41;y#IYd9p_?V%)S?zL@636W+WQQ9@)RDMH(71nHI&}PebFFU=P!{K-KJG(vbh1e?ev+f*{QciX#Uq-?LlNH@qm`ue zn81mk;r7f`eWr&{_nr#YwM0_2#J%)fX3~b$_x&;68z|`;$|cmEY>z`V@3$A;C(7jP zUoqZ(EbsR}D|99fA6IX{Vqh`PkX^#ct%6i(-t#c&ESWNIL)>@BPk7doWw+580bPe) zh&54`k#*cKCP{B1CUt$~PkOCP4N5`Gv3*wF4Og2y%3d(kOMV9n6D9 zEe*?hWV7r)G5J-@Q#SF*AkY8pRBFsC)JX5n?8-cl3AG=I4J^#ACYkJKf^$1sT&4gS z(vjaA{`*$miw!=+H*D6CT4#3wsNCz}uDWdf1PJB70gp)5cv>_}^Bo99w#n2Oc}W)b ze*)->UBeH64!6^tmBm(3NiC?CluT6O_p6^0=nBW5@qi6tMq~S<1m*n6d4JaM?rSno z4k+m1keF^T_pR0qKei2LNY})rD@hm8*(R54TF~44$G4tjsTpHKU5K#~#DV7{`80AF zWaJw*r%B|xLWZ!qLBuztLkt~5)TDBY`z+4ND5qTS(c|uZLwx zh}wymZDe!}8u5;F-FquEy(6+nPh$dca9sXtNBZl9ms^A8DSq8{oX+lU%pN_&H1N2- z&4Xd6fpm3H=>K2UVTnKsq)Jnv;1X2(V#BrVw^pvx^QMgxKPe#O z^=?1I*Ll$S@Xd1or0(B;vw)Cd_X|RWtxwn`oyYM#wB*-ovU`YE?>wVJobW&6b^gLQ@Tj0k4HcTVL~H&RXm6s_YJw!Lw$4R_>~F!9ypVd6;B#14(653lrjNXoiH~@ z-E!U*lL-fO5_Z{|n0YvJmMGGO%-)~Aq8yFNqSwy9VP~2vt2eBP(0hV6&QlbC{Lfhy zEHwRlDsB5T(pJ=f)6sITVa9$L{=JB5tP_?+>Glfu>8$O5ZizQUTUg2GE^v-hV(-sP zDvdmQNDCUs);^aA(h5)Es!2hKB8IXty&^;5nBge= z(2$3*j{~&ddr?=N0($)Yf?yIx90g7j7&@yz*d1zX@e%!q3?^J#9Qb$!>mT!Lp`jK2+Vm0tW6rh$>%VW#1+|CCh##SPler6_Ln2%PVwydn1>GGpu&oXIwEt~OM+I} zF_hA03kcK6#X>i<$i3+K-?lWpbphh{4wB1TLi9Ov!8G1f4)w>2bYPw#yK&W)I=}N~ zvXkx9z2KCHb4h>OQ}QXAf12cl8TtrR0E`FDRI?02!yO#WGvL*fsQzMw2}>H zi>70}DJbT_`;aFh11lP`^8P57#qVvN5_nzA$!xvQCR^}kbP#un$8;{qv+_*w^hgcw zsB={#&8rE7d;;;bsp*S#OOTLDU>aFzLKK%cfw1K`Z@AzeuciMfr5B8v#;Cg~4%V|z z=G7TH#r-jLOpx(3vk9g~tthM}Q;hbdfAf<|>XU;0u!n(XR}QN91jQE|);B1hB6-mv zM|F#fy^BZt7z>tF+-?q`OJ3Vlc0Yze@&=K$9Rwy0sSZ(9e4`vvPThBW_drV3udES0 ze3W@_xbV-H7)@kCF8uz8a|xh_#an5kz*v;?!dKhUU=H?+H!Z$pcJn-VD4M2IcV>&UHYrF)pt({{w|`eI1k z(@^K*B~vRNn;9p-5rinY*CGxA#POBLFNF$_UBVoW>$C~Zv-)^!{bu7XzrIO&Eu>$i zUEOx^Y>)(0y7Um(UP$3R7Wz zE)zWd292J3F|0gNF9l1J<$(=I{OY2OLZdH@Y$j7G50G@9+W4q~rvP7&C~iOj`~fU| z2#TkW9~UJIGm2$HO{{oD&WAYgdVG6cx^YM3fey;{=Wb!ESm^04hn3U)wQIrJKLStR zpx3a}VU&SP8OA@q(GLF=C(4>?q`CM{XKb7kDbWtnSiB8Gs!$yNCnJf3dKIv8Ez{#m z+0Pf9fY^CP>~5s(bnWX?hQTeGExuP*Jr55{V?8`sT-T3d3_|{Me%}_DWlh$!yiG%A(`SLEf{S~7a_MV zklm<K_Vl4Mnol4ZDb!S1>ZMe3Fqk~MDnn1ql!hhZPG=e| z>5*}TD3HHA$Cg=0&U`RGBTNsU z0Wl1td)mGG85%?b4!zq00UTih2Q?V8mEl$_GV3u?qzJhYv8Hj19njRMnPhcFJTjrg zI$}Y!77y~oFPX4Svw!s<#6)hsaZV=HXP5w-CS%$~heiDg8G!^kvW;-2E`6BP3#RBQ znZZSum_e2;S9+u)bFOCUaF?@pq!v3bJ_a|HT|5-`tyEPB)4E2`5c}36IbKSzf%9*y zGN@agyrMI{*95d@73Rri>-6=0nDKkle4m2qHB_|mTd7)@q;=6%m1Ku{)ps)I`UM+P zB%zONaYi`rm%n$1PR4;$gc5rjI8g4;XPI5uoIQ8KA`_DATKh~Ww?O_My2opa@ER6^ zeAg5YA?cSfV@jXz>kvSRc&*~Go}4NN5jQ2|Imohp_+1J(TiWf=jxXMD^Y|?%YB(m$ zJH*|YzR}w%wvy!|vi|x|Li2fxp7r>+X%MIm_T}~31RMkP-T?coyPBh4z`(s9wz|=g z(Z7(E!onReA?jI|!W#52o>usj&~I{0M0v%ZL8xv%v(1_(F|KRRpZH8RGHwC;`izE@ zq9+68Y?3TLgT`Q;()vNUI}e9KuI*57SBY*{89AnrUQpRKe+cw5PW1FD!l4sg=RBOr z%)SArJ^#DNsx$r2aQr${|FocrH*VZ;=#L?=w-uQA;z&7$#+J;EBSsN>KT{AY)oRTD zVN2hME;2OZ%22BPq-RA1YIwo{A9cAaKvg#=1Y|yNrrfslATO*8!RCXW&H>gk*P(>? z7b@<$6o>;Of~<$d%*6%)Kk-)@4l#Dpt6jl?>r$CmL11#~pO0mw%}xMYp<>`%cNp|o zF5Q?mWuYJV>ap`)zI8lCK0G!GP(dV{iRaQq0GUjv+P$StADlGTT1lo`=nfg4MhE*k z!JS*+Z<(d8u3qDH@P8yy_`MrMJu3B)>h<}%ynyr z+bvF1#UK4X!95yxS04V-Zl-wl`K$Ft*GnXfgjy(Y4(L0mut&+-6g3U>6o@mYF{Hk) ze5z4OAT|nMQPj-&3+RZ9`uG9u$>1Y5VL+`<>VMw#0`$d6x*|#2_Td*t-ycSSDbffe z(5grelZ`+G@ScFVfVPVJBIFA%dsulQuOJA%$3xqsb1mqaV2iMCp+qFrwl}WZ2(_R7 zmS#e{>zr|oNK||JOHjH5>T$GETYCO@|l+llRWH#9^~cTR-9Lw45{CTW6@&fg!=s7 zbc#2LWo~lV7^J<@vneaR{B03^6iDHD>TZDa;UkiGCLRqlL2VXBeRW|x$fh(^A!$}K zbv;0Rt6;NWb#b%5g_p)~&-EM*)46I5cRlq7$W2b2&+k4EcLe66MN%xn~n* z5YqS#7^yxV9peDAhy&C3BWVyyu$RGZkZEvgc$S$aut`P3c?-`s&hiOHU;RFf^)38- zFu5BniCbAP_Q_yvl5wT_l|WAc>IV}g7<)AQU`bo;ecU0r|58Qqp95#adm7DD0rE&5 z=!Ub`hPP`5IyEmEEK51tbn?R`;LsV%+`bAE-)uwqgmjr0@I zSwJYz*sFVwg1+VUWqU9p$0s`>MU1=kk`g5S)Y1MtFaz?kJUce?LXc z{;~tJ&;0MT-+%us$1`@>#WHsS*1-4qxP%JQyx1q4SH@PRtk6;m*ub>~tUD=kpMqX7 zp0IMxx%+GQ^k|?K0>xSrj?*Qg(2tZm$+0gacGpS`(23}jTww6owffFuIl-c8U`-=z ziTn>KRmCJ$#A?K=mB6$2^kCeeY;8ZGFZqwXiR@24#k^XOQ{S~fmRL-tFk7Rz&3_?q znIFnAM`t1oE3fyKty#C2x>&%3UYJ&#O|z`ch<3pr9!j*W7z_%I;Ewm2VUk9htjE+y zSh@UAnG!za168SGr{pxW;*Qjq3$b{m+VqrM4L zO3Y)v>F1PXK10|x1Nm3WADxe8s21*&m_ac*Tq)D@@Wa2cO13=*QzbZ9V&LJ~6h*M; zMwf&MrW;#~QJx309|;-P6<@b>xNF89 zThmEBnj{m~<`TYz6cU_Wl&AFMmueM&`ggl@EvXS6haV8q)+liu=9pOy-V0F$84 z0Qa=F%g~8YF`QA6aO4smzhBeP^M?tSKkjit_O%%YWAvmW<5L%#SHtP@YvMQ`f+<5D zyHso?%8ogG{R(O&7pDU6>wvG>1YS7uET_dFned}w?z1IG|9QcfFn%9)11FDT+ZnJw*jn741In%)# zkC|0SJ3U**UIJFUv4cx?nIymPUG zqL@AFEZURBGxwK#BP%LJ+O{WIV`0A81HO?*fr^tX&>Xm*DD!2Xs)|2nSqXtSUT1yZ zX5tf2PVBtx!+fj&4vlfecEZ*)_+i0$lzSLrTC=x_(`++ zpNTNW0U8wQ$&$(+N5Jm=vHw~(T#Z?S-N=aGJgrUxLXpvF zf%AeGXPHmQ_*`QfwId6Tuh)}R2}Wz~-nHF*${~Az;po29Z{74myKdHyZ`q`IgM+BMmLE#Uv5W(z9EktKp&0Cp7C#~OOJ5a2#AM!=3#A%^^$Ur+ z7c+(f;D};YLRq2)PU%dW*kb!58TYNCAF8vtiILoYgMCY7OubT&IPpsOLv^4=8LT?` z?X@&4YjCcWSRET)L-t?q6(!s=<@GZ#622jzpFAdvVdY7w?*?_3`q!og)Q;YWZB8pF zvGB^n)^+^Cv51F?#&P!GlFbn}q7t~fl0w6c7D};&3E_kPC{Jq-|KQ%e%RllFO#9+6 z$+~si5loN59vYza-C1MfYlTJP61F0r!pZl>-eD`N{)-Y0WYtvzIAPk~V1{5D~fM<|w-UC5n_k0jANckwK~pM|62Nzd2U@ zEpFAPfphbDBYCACmq(<^pPJIIaks4r`;~Kid7=|r_G4~B#rGK{X(vY`tolb3g)y1! z25UdjR_I5k40tKoAr*H&1#qVK1LAz60={KU3<9M0yIM-db@MM)aAG_7A4&S%0~P-8xXP@hOpO4l2=7X$^l5@Nydba5|`60lgcOp zihDw#h<1hL#vk=c%iaV3_|kMT3vda*aR58l4;v6LX6ht57T6f+uWKh#S1Mw~DRBs> z7VJnQzDilf$X)J=d7Y}KM-tFI`q3R@(Vmmkzl>wg{7k|YIV2)e$(x~r=9TTwZ~i*b zL8oC5xF_^%#BYa5WiwG3rswGN_+4ZdKTkyodUUZ65+C7;$Fm)C4M{JpIYka}y3A3d z^%%S?q1mf^CaIPITwxb`fc+@o5%5jTsImHsy(|Hw-f>|`?`c~de7cPwM~*Llp8x@N z!KOZa)fsI6`n?w*FE01A6Rr!r#>}wz8nEPr)bQSCN|F!L0vp^{74;ei{+cy0qD3Ys z;_g%1i)ouItOCOb3md4M@W>cCPct5|Y=EWfUj5os{q+wFE4(ING>%0Kxfl~?g)%&y za`VK93>2~KcY;W$LR6nU@o-Rt(L7mF_`_Za7|tkUhgp*$dbNJReUcxsGd!RlGup7K zegx(s+*OL2b#xY*AHQNR`~B$ReCkP%y@Hn@Mq?s9c`^IUxtLy*3VNz`{B>RPYR$F7 zkW!;+We_`FiLP0F@aVtQrNFeI%70-Ac>%)e?~}i1X+K+a5-pI~OjhQ>=(>@rVC>Q- z40;lR691WGPLc71cw2S>UJfO6Inz(pB;Una*RgYXt$7tw#Az56EW;Wd;+DuWyj>qQ zWx@|R%uY+UA=x!IQ?B-t$o3i}tm6&Q&n;`G93YarxXyh!S8?W0)a|-h&Obp=<(g2h zNinVLh2&>81Ra!~uPS$NLUF<+GKga5t!=53HHBm)oKMfU{TB{VIK6B;{99S@nymzg~r7uJ#qslKAEc)$YJ8~-95M4s?dZg6H}$?=)diR(&C zUPs4A_EFtMVB1l)BSC#PlRVUmtd1;G7(8yCC~3p#`jgc~`Fn{M2G0?Xp|;&^ZHP-5^Z3@L z%D&J?355IA`wh{@KA<{3vU^}O5hwlkVLtuG5C3r+)9jb&m{xrudb`J= zU6`9m%CIbJDh_Bwcg(r$eVU$*PM}YTL%iD82u4NUfJ9Z+v*49+JPCHBG0v(*_vmOu zY1ke6pEjpGUqTdyd(N?qcP6l?1a)C#RP(Gi=FsF}{Vn?M?u*E-@3{z_xV|-@=zaed zPanp(LiP4#8!JD#l?|gN+2?W6+en0I7D))MjYEFR4&6UqqKZ}b7i^^|UmP~5H-6ve z@HYf*Ny9$*P6+o=vVJaXifXu%4_>InmY_%g;yfJ)dZg0)QF=RfJ84+XWokyk+B^U- zFTfa)i(Jc%V?42tI98}l#xjpHjNB{ky5k@oZQZwJ{5MD1?)eaeb%Y1VQD&#<6q7)# zjJ8@jjuHGw-732WA@Oz*;8l@amC99ommF5pWl|shIJ*dvXR`9U9-8#5F!Lh&-d=hq z1tbfJisl+3AyvK=<`Pe>Lf7}u8aE;+CU!)HfW9N@Q4lFA#>ims;+D~t)5)}C_YWM1 z7rBK6!+r{DZs?}P@a%rWOuH6qJV?m_>=wof?QLM#YFXRZZ_(C4KY>8)SmSXNL3BwB zjvgK%mFC5$&0BbAO?#}>5=mIyQhifM+CO!9`;z0_#WQTMt?<4z$UsI$8>((Yv8yg7 zkHp$`FEm|Hh5=?GN6%ToGV-Hj4uiJ{d@D!J=W#Tn) z=%OI?d3W=rMF;RW)yt<%uZnaPWB^Qrck=fs=qzndv7iLeY_KoD{|8c z*Hl+p5FI;Ib8R&7sr4Fu${jS+SN0_0D0TWC|NBS*Ydb7wWKEo-Yd?06HMeh0al#}L zo<6hv+v-dNeqzyZTZk4_K~J&{f7|0l*qY6{kYHx@nl!(boqXpHP#SxjG`Zt&29OTc&`3F|Nz2-rh?KwEnzaBiwXu zm_^2@PY6H6?V*Edw6r1OZR7^x8>aB@hUxCZHzn&bJu zarUIn^_sy~BMX`?K*ci~oGp5NfC|Z7k|3dnQzwkqr!1xeC zlrW1Tou%``1OE`|#Pvg>iTR@5rk9mmgJJbgN5+ZOPhZsUx- zOlaLh85R!m$_DOt32PRpDmY*?xp7L`l0m^v`(;LBz3e2P%_+EPOa}c37rGK_yA%6& zTNVWfElNf}-T}@<4ej@MeN@1$75N09Cd)A3R*7^r|5u{&{Mq_`FLiG{YP@g$e8Sa_ ztEixjlpv8^D&aaaL~GkRz_COAT&HQx>r@qCb!QdlmY<<&eI=uU^T*~PzO%BnKIgl5a#7=q;q#{zv#RTm0%d_j_II@P(w-e2 zA<{Ny_AD!0t{qwZK0^Z_VwV4pqO*XBYm1^N?xi>bOwqx;P`tQ16n8D|?#11;Kyi1c zxI=L(QrxGw7MK5iLP9c`gyizxxkvV1#}E&R&?PkeDFx6M#{!C|XWs;oKSP~C!NK*I zBV7o9#-!f^%Bx6=UqNy+9z^{K=J{0yefsW;W8X#VJbv0xEq~g2vd5 z^1&?5@NVebJ0+o9&nGnX?IldI$Q8a=hn8C(TkOWd%H!nUce!t{D|JQ~SwCQE=frn|=kut~xyQHnZL0NfNFYDNmg$;x; zOLjsLi5u`T;MMJ2yOwH{SrDGzZnq)D-RIA13UU97VT2bYo3F+Cve!LjqdPOl zLDm=5@47Cll&uZ-3}Tm_B7cUp#l1u~-0&F};&czsUjpOE2(NNRMy!cB{`ka}MzA7_ z3%MJ!e@koK{QVhC2p)z4GDjy`Ixo?~4Fei5``B;GC!(FIEUV9Jk8WgQs#X)4?E-@t zq|Ijd&X#1OMxpwqnMi8O$+wDSS*)O~H@v8(`SKY(lBZjLxQFJB9g~I!Fy+f9EjWqQ z^F*06t=gTuyK{QpBU<@^86_}sc!(S`OqenKb!qDQ$7xgS9^P5LLUoJdGZ>=3n;pu5 zG)zZlr|g+O(GkMHU8|J*`;VIV@>rb5F%b&Ljw7Wd0}8R4larBs3$C(vufjM-Z|LaK zo9Ut=V!LtqV&{+(sRh#pjg+3c@QrV3lvR*!ABwAcG1Pgs#*MgWpfEfw{T=i%Zbc*c zYIv`Yhq*E~m`j6$~_(ur)_QrQY9t^R`Ii&W@7lPHv4gOO)s-_06$1Yg!7g(KYu51^} zR=&UPj~VhK8Iv^171rcFV2#YctWTH9&X^;=P{wr72Nqk(j1$WlGM#29mu6%iBl55L zyh3Cz@=@|DIdEhhf1B7gtBNOf20f!K>7u}%jk+_D7wCaXlBN9chL%@XN1_R9FBUXw z*+3^0lONU8BQ2&4x1OI7gq|-xvrJ9rsi_-6pDz93PX6d+B^FtsQ9vj$9lxqPcoESb za2f38K$##h2~Awp8Qk%?10vr(9jJ5eb!Th-rJ)DZRJ7O`Iv!AP61z$D7aXViv}VA& z11Rf}pkNm0k_Ba;EuaSjgtS}WizBunK(t?lxS?(B_qJl4XlM>+48vD`F?XaU(b>gx zY46*iDUO4kxnm_1*o+AjdWt2~XwAA;c?g4m^C|+d+;7U+uMska=`qhW|0DdSIq)Bx zaw>kic8mdmv6Zw}iu>LB-KeD#R~wrT#fqijFI{3q+UQoXWn~W=o6EAvIalYE*BXH2kX||JFr4E9_J66HT&l7_6O`3T_?O(1eIx za(TMW<&6O_%nx)993672VPOuOAeiKT?8GL4vG7R3>LZRn!)cXrwuifsIa)sL9de7py!icr;Asehu$G$ zypHPD$^(8z{u7m#EOuXkb}_f4sgGYkWJI?EhujlB4Fw8_gI6o;8iT8{{0SX zQ{4&}-UqpCE%=9}KUux&ogIFyNcvU#G4N&;XF8ld2h+rI7Z8=~1lJ0*NU)uFaminp zWc2oLo5|W$Zi%`tElu!#L;qNCR05aU@>5T_tz+^jkX`tsOudypTEF!jDP5Y@A2d11 zq#Xhii?`S;gLw8Zx~SPh*V)tC8GE;cW*zC|2{Ohz3omA4iV*QkXL0QEVU|a+iGweA z4`?comx6kvzl+uESbFZMP%UN`HCd74%8NODLJ6Jh%+u8c#vF@3PR1*Q9lE{q#KM`~f=oV@%L zr{o0=Kj)mf48uv$UETDRda#xu&{6VlsYNitG?LlT&478}`{aroLt7+M;Ss8mocCYY zh8?-`tD=4Pl8I zs0jK?+my*vH7<&(kC8-6xcSJ*MnXns&TiO2XQlyfSioPm%7pD*Y*D*jYtpd;elU=q zT)R8;^|EtKxUvdPq z>}jx3MXgVLV`0=*woOF(V}dv^p7qpq!(ANi>K?#Bm)6fb4CI}LGvi%&vbunqkKyH* zocPrm2gOwQDAg_Z9qwS#0@Jm5z5_WboE6jm7ODp}5hmV^IP_;v83WP|$t^!u)s=k^ zlx^};T5%V4GX*FC?Kba+^nJg9%EzvebdQ&zPN51q0Yj9-Rb?^Y&Y3y9Nq|^&p>IfJ zV8eiDIaM>wEt~m`V)7Z#-;j9Jq974Ki9MJ>mc?6#U!Ie`C;4EMI zNWEVubgJDaFaOBE;M(-lZ_S*#_T_eo_pFZW@AI;-JbP)N4QDg$(~c%83#w&5G+ z)@zwh?#pZZO0+BTg}#RIHwVwm{PKiC>AlyI=)AldCHnewtV?E=_@AjR$_#>H80HIN{+^((@Q=)3EMs?%QDcVr2rvD9Ui_`(UgpzJb0zY?@^3sVOD4 zEQLhq!(>FM?grF!Hy=8oBbVuH-$5gi&m?P}FoZp)C4BWH7yFwd@qbGw5Bd3bpsDK{ zfGLZz3W)_fwvmq}ODBA*{D?UQvs=9K0@FPM9AUz82daN_Zov-}y$Knxlk))OS+>~0 z{sNFFL?Da+TJU4^^ERXNkt+ARTXojxULrPD&UeT5-knr6(){@d4a@-{`s;S+5-xok zH=4_C6q^s=5%!f+%=RCo?d!l}f(eY&woFQwFy178<)b(yk;{CMCJOXvQn_wK$If3k z+xl}|OJ0a@sz?ZhT7dKoL~Zx$3W%?62feR~=GHnTQ zA{Q%i;-!g}PHXik_2l|^Z*Om%933MD2E3NMGYiF{=AqB-1qLS=85J?=`JuwPuzpLtz zqh21V(p53Mk-z_*cmxFc59v>npx3+v*ALBuUi1G@?HDp0JX^Z3G(+GWnxMf({5~bVSNgREn@hMpKDKTZkl<4=uFOyZqmG*}q3dPT>La3Z3f3)R8lsA_sNj zX1xNYF=Co7uei)RX)vvHQq#e4%&?$wJj?k$?)8_!1CRW}L|lmZ77qyFA>4KiDYV4^ zGdJ%g(da$>JnEIP?u(PKis^br#iW=Ux3rdQievA@cM|#jL&yy zYqKs{_C^F-@w#O}J!x$y`~ zh;Y(Z%jVTj6WrkA4`fJ-ph1-w;O-UhyTS-~?hrB-Al@F~uDu+%+cf=1B<7RT`*j$z znn9M7c=3qQu3_ubCiv^Qv;TmFO{O=ZmW_*~s=7H)x!*QBv|O6u<*y#@JX{mrKdw4B zxq8MxWNI=Z*17wI4e0m7cYikOpy%q3p#VX%p(>V6mhHQI4VDg2uH{z5y3HSlA1{Ji z!d*s*#PIe4ea*M(UN@{vRlM$PiJgAwZ^v_!zNan*6ll_HK-1Q7Ia);<*(K4Txe-bF zYH!j!5VGSbD1W&i5?0UvxMy1D(7X5UhiI^nDj?mw5c+-9`61r#I5)SMt{i~B!Xr|B z#X$lP1On~~5c6*-nXepxIha@|yY|9FXh?)sl!3S5XYXi{XpMYVOELDybr-^Vnz+|l ze&_pj%yn$z48P=tlc^5LVIb|4+?6xa4&xj>a-VKlA}?c?0@Fq$BUq(TMD6_GOlkRG zm}&mkz2mPd->(LYDedQZp*Id7c*Y03qzCl97xE1sAD2^;fSp3@ORf%W4wMtV6Vo~o z3khY6x;XeJPq#<;uvzYMr26?#E647g?n zf&lqXVFNrZ76Pq%!@KWNA*Qm81O+@I-8%UdvTEkqt*tbR^=c9+Gsd z>}|jTNEnQ;$kX{Dd2+zb4V7Gzz=1{1aTvJ8w-#XY+orxQu+GIC5q=j2>Y-8yxASuJ z_Wy#3&RncR2ba$@4w$MVFOTGvy84^BU#`joKR$6tl1`A(;LDx@>T08zlDjDCkte4} z?HUT+5nympXn=7F)+l}`tFTD7q>Ljy`mPv(6W+j-rxr@d@EinM`c;XQ?PC4q(~L|( zzEhLj6^dRu(|Ce8(TbqcFS?)`{|_=rK-a*?!GY|2;{`k5b@P?vwKd>H6Hfy3mnq<7=waNQtj*v~+~I)v-9Gc}O~|;kHN58+`Zcqi(0~1I`n2 zxMk}qR?x4sn0euz1^dDUd(&pUMU*=ISqtO&Uj7ddhCtcT&^kJ_<=Bc6CiKVWnE9y> z&5`G+QC!)%lP))3Xj2sov+QQ&sDb3af8IVMB3b-tNOap(r=UzavviIiaxVgbs;f%L z$X|m2=to=s5WmF%9UIvOs++gcU|%6JSh=r8UYM{3auGnU4L6iufYVNj06gA6vr7cR zqiB)3ltoeBZUb)xvmTRi2mq8S=eADEex@pTZ`Q>LBv(dClr!g8$=XkcqXJIdT+M{+ z?LYq;%mC7iyr!o4P(X#{k@csZ=Z?E-?P}G^l%QEasV+q~9#xUVDVC&KNh5ve#%i@@$TiW>dhu z3|P$o`*4R!;P`{PlJoF44SDfCLLd63{66($37v832WY^A9sVzgP)Y|V@OjR;ii8Qq zgMKZ;6(gNcAlKB(#g(QbxePg%z^+c}`;NqY`BbO2?AETov1l z;yhmPcHOOygSEGvf7%Rs{4OZq&Lg1z8ajPR_V&7|g2%{|?!xL-P%B`ubUiQL7fSI| z1N|9!Bs-56Jp?C{v~?G7PxU(emj1?Q(Dk_3y0fMMx3#d%mEX?y19Pll&`e<1xvgrQ z?mWtS777M3mMBw{DdTF9a@iF1NFG30GP>|Ix*kTUm;2Oi{Ya$k6bTV}oE0@rwGj_8 zo{6*WH_W$GSq%GWxP#kN$7Pz6EFn(d1or->sFFxL#1$uPF3l$x%{!^w&VDtvGcvv- zITXXn?yrIx!VzZAP@eR6@RwXL*_2C6n)R_gW!-?`SuvpDhJ)FNLCc=1c%*ciI?A#1 zL_Nw9)SE^orw?9&A~Ng)0|Ov#hq*POqoFcw4GSF@`2S6BZQJc)L{a(LmvI4Yw!%kX z(v}aSH2HTe&Z#)rOVB-3{h}|giszKA^2Sk?X>)g3LlO^ zcm%G9dm>Y7p_mf=3;iWXCxN=f;9~qPict3}sZ93H=)8q=l9|QNW-PdB4RotalV%;` zHoZAkA*w$T`b(hT2VW!>o+QptE~M;nn{y9Cme~@VYiJDlY!B0ijhKp+HYdQtcr14H z_UGE4JT?Csf>?NTgX=~Hb0o}!9(+FSBHdRHv|uK&DH>ax`uj2V2Y!kYC&tVH_LDZU z3c^PgXcjA#KRaqj*a4W;k3^Oz+G95_{{4`PLhi; z#ZCv$lVEb$$qD2D$m=Lp;x6yo1v|9Kg&<9C8C7LC+ZYhThTQ%Yxa5U@4@mD8-fhI9 zPW}UG)FJ<R^yV_Xle2(SS$JB?PL**;ct!Kuizqe!w%ve3y?qTgqyLCc;;Vx zRWnMfjkN>8uax&D3pz>1Na*8(j+NlcvNJ#4;zMyW+arwyvu8$mDr>{Pcb`ZifRc3WfeH%`*7n!aFwq(KkNyu zGDT!@kP*bzm!^S7x?`P@|7kU^DZjWl1qdO%`}>F+-CnUhFQ>JhPX|)+G^T3ms8bT} z2sgk<4lJHog6pt{^S0-Rss{HlI>$E8iH@WL)0v}G*_#5>^;#3`KNKCE{KFdOae*em z&S4`V&$5ts$2=flmYkB}xn;A7EG(1!#!QHgXCB$02;s!E@E_Wn(7lPm+~JYj)_%d{ zR)60U^1>Q=(O(o)%|APpe^BA84zW6|ZWPsLnDm;UsmOJ)!fpVLsY5dJ>0 zZmFzt>t-Fxj~ObM!OCXwr^Wwk4u{F<*^|Mj$HXw<96Yy)=Ye=#V+OQ;f#KsVOZXU% z9t*w+CYy!v2QR@j?tV;OHA>^97pqm&ES=J&LYcJjYjEWPTH!2W*udwLbFu;uiH6Q)f49}p7xDfom}^p>vE6b08b!$3-B0#*|Nj19b+b?i zq{qw3t$*zZFGtS~#+*HMuh*$&%bf)3U?A~)NWaKS9X>)JOfvDa0;n1a6aF=~sVev~m2nD7Zh|hP!|NmXVU5 zue=)N#5;O>2L-&f3hh3fzlF^w<1!IkGlC=a3Fkjz6(Cl*MIE4CXAMtls^CG z4dmSX6l*+C6n-)&*x>Er!|*QlMo&QS%YfMPq0(DKVIeKQSdN(boOLtS2>U@a5rcaE zx^?j7@yWGP+p-WI@kR_=LXQ$-6{=?f_-_d?b%`uc{bYGiCKY^WRim;PmnY~igu9wp?aYh0_lVo^m@wZd^+d%s2tK5yUrx`~g z!t$AZ{N}zK31`t?@Hyt&y8{`CL{ot_ac9vhYAGq8cz%p10A)8;SN|l3O@i`D7NS3& z3cUphy*(H@d0)X^KY-QM7b8kL)`-M7U%Cd)$&R7e420is#9CLY86zCy9C+%6a|8FC z1IYrOVM|NN*s>HaC%JnDfGEudIui+LSsccoZK6+ArHg{AT*zcif}nz+@AW+U>o*zLgyE!)n)<}Nu%fHq?5y^>Cm9y!sRG}f$xno+~=gq`b}-o&QT72?BBzhVh(4>M@{p1L z-JF8V^1xfaq4aCqSC~(9#cIKc%Rdx0MudVIybM`C+o7PVEjxW~&q9jwi;RV0giQ+GJv&b&aPDy<4)(tOr zkI4jFQ+zagI~c<*h$3b*7sal8d=%F%9=8Sdy$r6+baFbJvux#Dprkm8+DRt%DtH<4 z!#_KDMl@@?`y3s}s@;*D@bm+X!l&!?a7??H(DA%rS)?y6DRM0)w`gx4M`)Jo61`By zdx)~k`VX9}#7_65*-+>$BMdBo-t2~w?B19WId#a=kH(I|aWb%(C8E4b>>V!UyE8XR z0O-XQc0$_n*+0!DTYfB)?8;V{1bX=Sgj&$Tw;nabr?3=AX!+Pj%!&bbv5_16EX`F! z1@O^a#IAGAMd4C$TP0r^C%ZZ|Gy;+NuUp5s5PL!ZVDT|4zBI|$0_Y%1$V3RHp1Wuh zpA#=zX2Q(S`O1a4lP#%tR?f=)u(aDDd)!?-8J{_B-?`bq`u7nebZ_?9td>u3y2V(@+7Xc)x0?K zSn;|nc0RhQle3~FpN79-a1eojjc^@x@I9OTrjtvb*omh#>@Xm%E-i!*cXal)rnH!{ z!O02U`^KauK@xl_z6B_qWr^@s>`x1x*DfV!fS#}R#q#uLG;=3_$=9aLo#y7c{Fjqb6bKx-V&ul|Q z|L`aODj=uKPryL73&JvFTF}s1;#$vDa*3-2^breTLgC_)G3M&5C>0e);&UO5XE=SY zi=g1-+AV{d9EWLY^5szJ>O||-Iup= zFLn>*QcJH`+NG=o6>;(*-Q4AdaY`L z3`Gl=HO1_ttbSO?lfm9h&QpP!TP=}%LLG>na>KvV)9Fh2rJwEU`pc*2Lp-Lj^k2YHHEG+#eqvHJqbmHu=BLod{3r#o4O!%COM7-GMAJuGQr84Wcw-_FsF#);vJ z4)Nn}*TYURjN|0-N5B>qrH+eR;bh$do}8jNwRz1ogloEn)w5^lE^&a8rAOVDmN zv{V~*1NvZ0fPcUY)FtzWzk?EBW8GFMKRhp|k0VAE^xE z-_|J)1N+teE=NMgQ9RSIg}7lB(*Uostf@xEv_>F| zE6adz=MNM>UGqPVivX#xc!lr1b{a7)E+9!N$dwTwf_zHt^%YU2HPnMM#sD=@1BO)x z%whm-#n#hD&6b2A)dd>q8oU-`$eymS5&as-m?VAXL9J$oGR1ED#fuT4tF;Ald@k?i zqDLVI^;*;xaAcjDV~!H#V3>4*xH5_s+<6}yR{;|cdczK0_WDEUI*mvDDfBKf0ppC5 zVMVz1_kgz)lm_bwfiNMlv$0tcg(tI`DIHzj0#}|Em+8O-PvWeL&&+Ps`{||sNFuuE zcO@g!)f3C}B+@|u)c{r4GBM7#r536;FnQ-gA8`;Isff?-hbkV)7d+o0LMKxan^ z7_v+C2#GI_kq@#!e*`)qRews01}L6H8kP7J4SKZN0fA=&vep_O-k0A9rp17S>9q%q znVM@;XyG+q)9ag@bkmTccS;G_yPP++xql#9T@+(Wu@>L@=G#?od;GiXtsdT8qJS_jClG+ZacmYmr|NJ#|?l$k`CBIrj26)Sw4MD zCYn-Ia`N($nK;SHIOg}AAWwAGH1}PdhIicQR^Gr$g7uO(T9K>0%IoypDNUe$#KRWm zBt#E&SKT=d#u$0Yz|tPpherw>$yHRDiA|YQ|hq{nblI%9kA#a_-!CCQE&MapGpHb_1slHEsm7d274>!~G3ElD-;cZo8J}6 zlDZ=%1+|Vgk`1$lS6l;=&FFW9*Re$xw7fD5mJc)D4Ho9eG#@7QP;9k z0wX2Os*OI9Xi$zkqZxbiVeWfewH2ez=a0(ThVpRRF?;ETo`%<#vR(o2eH6F`d5?TZ z|Cxeaepx44fDy9kh2V}@kKTsshFCRZ5!@t{q zVva2Ik6}9aW#Yf@nOPrptp3*=8?&9AAhfTch(bGo699{n|u754#yImps|Eo=L- zgVg=8SKO?u{-xRbXx)n)d#{Ih#g14`YSuX5mwD-zb9?k$=`*V5yV-5a@D80CWuQSu zz+pyIKh?HXrWQGS4|n|s52&WiRrGAI?MO9Upkz}bWtkNf?Zf+kq+pHOY3(+fM*gu| zW)&2?#+qULmn=cILknk#Mp@SQuuC#6nwN!js=g;6VtWI2jtLm84Y~^SjgBH``||WT z*9SFXT4jJbhBwwoZmr|D`rVeOq`Pf=p7E)pb;2N$a6?RL)`4i}Lg_xQ zwR^Ev)drqxpoDdW?DF7BBZ?KTPwBV`Spc;`qjsn}fW*#UR4Zqej6U|(=7NY}$v*%x zyfmA=h4k66M@pOs_?ajK%op-bH3AEc&{5f?IjTvl?63IKNT?>GPJGNj;$ZDyjQq`| zA_`F`zS()tX9}WPI3>GdHv#2fB6MNWM0e%;EYDK*juK#Vh95?|G`pt=O=G& z7QjyVyA$i%-u8S1RVsLxSCmI9=$`=#9>9V1EWemkK?hpNl$kn$1FZw%LsbhWE>|>uTS8$s|SW(+`_cVst3kR|Vb5o772Cr=D056=d z3yo3Cuq)Tq`D_`N`<^rBK108eFCjNYzJkYTFof#?OqKP+1MgJf!gYwCkWdfDdwh8e8`7f>m7F;2{G)VkwLh1(~-^Fl?H z4~Z$#$q4;65ko3X>TbM$BbysABvg#r^t_YIQ7xEpMlXt}FPfO^)18|jlk5(<(%Sl| zw#N&hxdGiRgr;U~{8w?2fEtkJh#J5nT5RmGG~M`UhZOn;G3{hjapH{5j+g!Tq;0jg z07XQw4ZF{M+unb>y6*Zc!LM(##Do^iT?ht51Kt#&D2s`E=a&N#an}#(x+_}F0v~AZ z59r`wI=ksE+{FzJw-OnydI-G{(p~U_dKL>;mjJsaQ!# zz3}wjopF!?_7yDhPM`+^ZR7- ziOK%=F46ptA~QWb_31?e24$2{Y?l)c5kY6ij6@8(_{Xa`DjS0KIkd_Jxa$WzuSEDd zqnPBY8Z09LtQL2}3vLf+-vVpdUf9SQw^zvbQ6*IN^^ljd$M0G3=n>UJCV>mq>WzN} z+*TyM=iPFaGkoJ^!?Y|^CNPt!Y7$l1%a|_F+UJEKkAf8GJ*^R%2M(FU?K{I>1^s#D z6;*ed?>Yoi1C>;;L2WcdrmUfT*B3!zcdL{#M3~{5&<(Z0KgjJD%9jmJz8lk49nhy( zp1BNMTmM~6oZ0iBaE2s>BqJ$XmdZsf; ze=V?!=;|s^h~^X#x&DDzd{+yC-7Q`9Y@mBlzC9Esc?Gp>Z!NjoPDbYxTRJfva4mn_E$tU@Q-cOzH?*& zUFTnuNFZ(X5BSz+^jo8BuLd&G+Xn+XdUw_LZM56X{K6q2RMxi*DA zNn));?wg6Y%J)M*Ul*8~U^t@{dnILIRa45#W+Z zQpy1{4xSUqt?WdHUVzPsl-X(j)_Gp+Bk1Qca`dNkmqt z!hi}QW|VapEvt=A?V^vok%zThVDtXKn?joN)ews-+M^Oxf5!(%hYVtWCCNIujNf738$HB?wQ$p7C-Xi2`pNrrJ1zpnbd1}(x-sUc_njd z>$D~kik&u(?i2N^C%Q-2umrdmu(?#xl{-V0Yucp3Cs!WVN`f03EByt51c!$ol{ zlk|;B(ilIxTDd?pOVbiP*Z{#5CzG}bCy=S+Tpu!Or{-;v@6u$c+ghwNR9398lT$RM zZ-u@Ua@j%luN%Qs1sz5NDL#Rz~13d2`^Qvwui_fo)ki z-&HkIB-*IgVjd@Y&bIn1@D)pmzs(Rdb9Ms*yWmg3>_PMTz}3VU3jkJM6l0QQB2^8$ z9)1AtO!Lq7a$$ao&0Fq5oE5$sjw7phO(e1swDjWMpkg{g)QZ$z*>K}6`)JZ_=xCuy zn-0aaT#C6{s5s$@Y#$*dB>2DwVSnx7z78hj0g?GA)d9X*J(x-e#m{obQbSV#ZfgYN zEvqp(cb=Kmk%X(V;VGMhLcH1sU%na;M$DYLpMx8?k$NzOy+bUFKPN{QUP-n-NymR2eWhSJjQ7n`uY6^NVFdA}9}y zZ@AIHi%YmL7i9EQ`p(|@tJrs7O- z5Gf{Y1s?k$II*5?Iy?5!NHQ*cD_~XC9Nq1%CyjB<$~elu2eX8{IRd~pHb$a`C?y8{ z7Ofqs!89W{c3~@xT3U8uVZIc8{|Cq(E_O`lfflD=C4l;hSnS#NSyYr>{G3?i@AI)b zZ*l?A(D8TGmAV9acbkYz{V|jU+v2{itVQ&1CN^gy3n5yUd;z{o(-+icwNEAt;^k!s z?l28n!p>pZiXr0kAWj4V4HIjQ2`#iCNENUFG~?RZ{LJ!!OYN z)EwCQZ3o-jnpZjljx43&R6goaOrsAvg&4HPaw;4}Suaf&QPeqtL!;{SwB@shobs_& z(JJQXIGeL0lr2Al30g5n2i8JdWN9LE6Pru}4deG%? zQx$_WHpS(i!S$%ee!pgfz&3ai%bS~0J)5*7t2`TCVah!OAj+>4 zu926vn1!-cvRy+|{_D2|*Tv7DvAm4L_mB_fXt9x}zFYKMpN^W!aeiuS;*w4V0kzF# z&v~Xa6G(Q%(ZHE0c7T7FJVnGBAE%Pyd4dKK|DzVB@DGzkQ7R#7nCH~2ERVNUh<|iS zQ!WM$z?H^qCnj{k@zGB^Aa<}zpBXl8QRVrb26+ASep=N4rAj?h&5ApJ0^Bfw7&D;# ze-o9!9mm>qr{<$JPQ;%0Z~mhpwzRRiQgJidK)jSp zRpNcPT7-eTqKRt^CQjzV`6~3GzUt(xW5kQZq=a7yJrJ3%jF+VMxxM;2Bx_d}Kc9CL z99nGPv93LXvt&$H3y2vq-5RQn@~`{~tr%BtkRHl$MqBngb1iS5;qPe2KVpQNA%o4t z+_`Vyj6P&A(_8KFe!Zqn;VR>9Y6VlhyP=N+nUWXZM(#0utn%t||E#qAZ@l5=S0kDe zIDcU*p$L_do&sUSjsvH+!W<~&a7YyY?21%XPsKR0r z?@|xY0pOOUI5t~3;3XKa7r(_Q2kwEbx73EZ<^^4{l0M%C!lr1Zy;#ff|s3e396G8v|9@rq8Q_4$^u8;x$EWbpf)Zzgm{wGTha_4GufS7}SOXn}sb}l#z6vL#M!VV{Hcc+#eD5wcRhWNhYHB->aN6|4zwNP;;17y zZW~cXx-vGt1PF#bS}2hNME!LXl z9rRLcNGILpq)M2vu1OlBZ-9Z3%9-Mz6Nv)|MRt4n0}MPSV%(BkAekV{IRQo^Ly-G# zS;yA_-WkjhI>bI+vjHZn&%1SWV-06SHg+|R6z;Kg$~qnNT7(st(NCw-_PATuLU*I6 zm}b>u=bK?@9BGQ-dg$oW@|YJJ;h4o)Vz=Q(7NM3?Jf!UzIyTr6*nomar&=Sn39UAu z$4m+;Pk&{bt6-swUw*2CoGFFyJ=-U{^anTT%Y&=ywijc*#`ZF33)RKKj%4 zJ5AFjg^25J#zp-&vHVb`AY>^6zQsYAvbJ9aw1dDbb&dox?48qaa87@tNEGb=0wFr0 zonWrVDn6H071``^RmiD)uH9OzF;y z9YAyAV+V*5FAtK!zTBxaV~Dj}2r6*qA&DJA2v|g611l2BWXYG*64zYeL(!;wk)}{M z3^nk_3M%%&mcveO6~P3f2fqD}Lmte!m&uL}B*b!yL~P?nA8!2!25CwufBDS7JvhP+ z9hhuZ$(}tClW~wcT!}xv_%mOU9)LS&;_AF8c>OSqKaCFWA-pjA?hh~DT0b0pHEEp| zfp-sYfZzvJQ~>g2{$+>U6CaQ5mVC%V42B(;kfh7#O_E~M zE1bqRk+PeOcOv$P1MPFj!F-pnx+sd0`RSHG9t-SCpaV8ODO-C`9b(4`#OAy^bT`NrtA1eR3BFluN)ez0;7_0yDgd|Anog})x*yBX!;P5w zJ%pJ%4Rlm&uEiVJFQN4lMUGY_P>kOophmY`!(X#FHgJwul0>bzAgOyL+i9(}bfb!| zYz(FGooE&?gZV*_#UCHJEqhGe8?t2Ue!sioesYYKKU!(|u@Qc@#wy4y*X1{O@oZ)B z5zi&=TNN5}yMIrB#G+riyE>2TDBQxls8(#j99@d!wgvjOjsw5^BL-Xy5zmObV8D`0 zZrE?X-Mz6Gv(F@jvUlBjAb>(JCrqE2SY#f=q(ENu)A@sahY7|vSU)L7Mx$zR*ho@M zODQBAq$%QM=Ic3q%Dm#Mv4Y=w@M?77w0^2LVTETSp$=Ad(Gbd>8=$4uNolg(NzT3C z5U0a)G6blEN*j-KYFsfvtoZHUg=r@p!Gi>H*V-u&Lb`C+Fp7_;`65v%&0T5+Au{_lz_vZGz^3Cu~Z1>zpE z6mJi)Nxk>Py~s&_SVYvZoRm-+=mqF!YgTbATUJkEgRg1c5PDZAE&~^Sebu$mrF>9x ziM#OcGI%c~B?X9QHSfV4{z$c2p&(K}3r;n4BON|aIHLgrH?0H`eI$oDhI-pwx#SXh zmxwwxsv2NplEEH{>=B&kVX-Ei^TUy0CeWr=OC2_;7tN%Ro?jlXT|3nxno4)-6?clk zE+muioNch=K+I=^L2D*>4z6MR?3QMO7sc=mASB-MVN=RTPuwLpq|sXm#tVyLLoB*a zi|d$}DQg@#+5YS8WB-G>& z2=c2rB|8VItRu)H;1mo6M-^O&vmjQxu6Gn|uaBfG8J99*kMwtJBjz55pDXYX`d^S` zKs(ggw+lmBlB=4V#qB;eAAjqJ)EH~1`dWkhkR0BmSaV{@jUyusdY@|leq@5THnymr z)#$EBg^clA2GO8mA>F438IWe7$JxM8WC4PxIGd!;l+s~j!5zQHlmkLCL^89u4mit< zCu@kc9u%fb%SFoF>*c^};u=o97)t_21(Ik^UtoDx90RLm8P>y$fHTD&Ly18dI*9je z@x3A?1%sUv7o&=GuqHAQkRW%jC~brP*rofElM0IhL&0FKa+_?0QH2GaaIbPFF8WL7 z+;&<3$rY`QxL>2Y#e(K-kLC2Eh7;}IJUX*~8bUwl-+kPZnqR_d?h58ABG4M;xiQO3 zwhFcK*Dquc$be4>qKf88^!pgOocs;og0kXImEcbi;veWvl$;5;zjYX6FiK~aqtvqU zDr)q$MH%(FpB09+CDb2n*179YqQL{=v{0E1@=4 zMj+ed{@D;!en&r^o$2P={}!aUTmg|B=>1v8n|LDOopo*KkUmNvT~q=@W_^Y7F!ibV zwcj-Bv^w08w5)c#sIR~IA04xwqmG(lUE1*#8ss;Pqi!H1*y6m1e>|K0%FwgKd zXuvNk>6nY)F1qUm-g*B)h?};kB*m}pe-;d2g-KQ20&B5oZv6Y$L`rRGyM45{GH}zs zm~$;_1(Av2iSvzidAHe39|Io)%P^jo-5bNvL^KkpmQVs06K3>&)0%!4SjP9$1*cNr zuQ))Ez;5(atgey1@}4rb#d7)d=|S5n92h7VXQg!HzQdVte%IBfZJI~0vM;)QIFpwp z19nAO)LpNWc~iU8#*xNx0=y>c@+Jl#AisV{^C!QK|NJ+J>``Ee$KgI&ZVK2?s5*W2 zH6}qPvIt>L25|+|53*Z18_i4fh53wK4eb;UU6?m+4s{Q!OfRHSJ>QY zi~ZgQ&Y4Li^ZyG%{{fPtYbdKS9`Ehl`-{ha?|B|BNWHo%;{DR6*Y);*W6Un3i(mq{gjNgv##xbP+xSr*K8^h%rXa9=^Lc%G%sMY=p9@hc0!&E@!p! z^zcX|LLme{Ifxk?85gga+J_4i>2$7#pKYHkFo<qUudm@(le|cH_P646-PG>i&4Yh(fefgmHZ`|y_>vhI2 z@JOdXg;(#0gG*w%55d3{E=+D2|711AQz2{I%y6a-d*bX5i$r0WUz(<__4jbIpOBO3 ztAvW)w#FLdAE|rku|{&o$NQ3@b-lyZ&5RfxDM}O9c6|ZATX4YhZtnjs7WftrGN**XQ8*HH)Oyx5KjEb{o2A}$*3ux7*%YI=H$*roF|7<0T@`++AcRW5`r60`Qae#i;9(|iW(9&bC7S!Bv-{{eVGhrZ>l zbHWhoV^|Nj!_NWK%yJlp5bfGS(xZxsMhe-G(6fRN1Y z%PVOts@4(2CGaX>Kyj z2}b-=#ZQ_*7-)e%>=J9U@S0x9qWT3`-|5^QfxA321QGdvgw`^+2k)70R-@X3+ET z$%7IH?YgAju{Ry&fGYrJpRmHNv8t-tpSwA*Ztg;Z?$PGL6y_GR0J%oOxxNT6#?bE% z@bx#p!{7bg-{b3Veuw@2ea|1@_2S-Ywees6>;HuQV1PgW`M=?BfBg$iPv6(AsLj`G z+NCx>Bd{hShWSWQ6jzc60NxK9ARxl<7KB1-n*Xrt=p} z%Sf0ptFOVfb1Q_XJw2#(t5KHPw{F#y>f=*{wHA3!O4L+|L|0}cyIgVE@zWNU z^9svC*BRLYwSmgOpZt?)MHp*kp^Zb;5Kgm>vivs(8Cl;7hIixAtL`>A5ERNMj)jY{ zbh1ty2D`PY==E5mRi#iAm6sd&bTf{iHxxy}_k4xlaj$pbcYR61F1g8k4yH{&*wL?1 zTA{)V#}K4NtR=fz>N&4bL`|sbU@*kD-~Jxo{_YQW{`@5l4v*03w0$r9DsqZ3jx1~8 z_rL!m_Vy0&```TmZ{EDdfBeV4;lulPsH(Dl-LPogc0NNDA|)l)=I7kB!+mJbIS}Y{ zIyG}VP17slfV)70n}%0M`+NB6#aDR#@+&+$K1QoMM3lC`y)tie@sHvJPoF(Ux7)?D z=P&T#{X2aB-GAcEn;)@ShDT;%&pfIfOYi!FPy-VNlaaYA+OM4 z8WHTh+FF$+>5(^=1-?GaFlb3AZR-}*qP!U-q>RHf*SK70JRQW?>qtyvHXZNJEcJFj}bE>!bM?PoyQm zM8PmwX}q5hLaWjarg2kf<4}00ZZ{L?W#srJIP=b9L^M+1So${A#Ko8*!OBVKy7Rfq zoP&1zS{sz5LRnU|Cr6X)_9OxYCfX^; z!LJcDtY!xb&e84l@bbl1_=kV|C;XTH^1sKQ{{A0vbo2ySmeoLlZC_&N9FinKzu(8f z!66P0kI?P(kY*{QkXNMM?*j!5i&sb_q4N0{W`9r-?sPiX+uOsz!2!}Vy{1rnS7<}C zfp)ut!C;8L`{Uo^AO7K=@bcB~&>8N7#~B>hR$VgZEQwII+87M>uzzrXPN#>&OQ3}6 ztE#Fk8<;hW`|3Pvy=7vIAxRQ+Is^jf_j_0TNbbAn(>)g2tx-LjYbK(P-Dqv1>FC}K z1lp^Qx$|0kR(lD7!buoUPP87bAldGSPU{>h?a=pN9|vH()Hs_3IVE<}LDZbGy-tKA z;;6K{v7=%v&5{Rg2`M<{g}%C$e!}?45(sC+#rWnhLpveOtGAG{u67N~VsiZIwzkAf-T(#NNvxt;_PYdC$XNKkU+z zBmw7y+ov5mo&R9;6cWdJ0d3Ao7-SS7%UU=*Ji;IT`1km)|MmZX|M7qPpYY`AbHs66 zC!srce>J*`cJ?p7dWDxSUZK+JIRLp!D2Zr8{2kl9E`ylI+ZFc@Gk z7@*tj?wmM+oJ~+n;EZ87*uyu!|0DkJhrh?4{^6f-aQqBloJ@Oy z@$Bhy42FAXx7w(x5@l8X|Ec@aCr6SjKM?%sWfu;2k2@o;s$y4nliVSj!`bC>_W%F3 zB0DlWA|#v5VpV135r-eR?9yvLJXM1MZU78$kE~j4iHht@z+k3krcd8{zvB_>eyg6l zTLRpYHmUzLn@wNdh6skW7ZG^tnd-jct?NbX=Enkacl}JQ!*( zQ9+>b0+um|P{JM7p58wnKym7O%rbgbTH~<{26X<&_pGDM*;OGi4}M1v8{I*-`@>id zDX82(&jmJ(3)Z*KU&i_(0mOSCO~@JW>l@N?`T3#2-Fg_hJIMszU8i_8OYnKs5^Ack zgEz#5##^d5u0s^Bf@SQX&#!8-pEb@yNsgse__0y=p;q`sE0j*ao(+K9rpk5QV6&-E z*Ue6;>eBZt&Jkk>frC^^r_%yyngkP`EhnMhNPcP=AnwwI;PBoB#29&p3?G~DYI&aH z{rj)+_kaJd@t^+F|BnCgAO1Id^UZh2Lm%L>g<)GZ%d!lw-@L`Uuf7K79Gh~3auKG$7GUs&s<-E<&q4fKjIV-c#QY5L)HcN=L%K?CZQ?;mCh`z zbzR?(J~-}p4xCiBA+hla7M%JU3bKPlF9eQ?J;~*HrESH#N62^K|t%Wwj-!aZ(t$|Ms#~;=b|FRPJvEsOI z85+mnM(iHwTqAst0!P~r2E8wG_>>oFcfpg$vb1xLBh#J3%DwwLs(nS>(YLPGoQ}aH zUUNSP#B4+=iMMax;ott>{vG}w|LK3H(#vYc3BiH8%>Xf)0X_tkms5oz5ooN({pR_-)4xan5dri3&5I1q z13%r@xE;to7z1)8@Lgb9E-H&3ZtFp5_x_0KoZw_Ml_}DlsLP95Z4@OOXrd;HTs{jd0^fBKL3yWjrNoo2m{u0@C6 z6+&P(o8$HCH+c2>HKx-U^1OiHTh2niBo~{#Ly{NqI%ANDu86>vF`uR>ilV@DI>mfG z$MyAfC$T=1@eM(BIp2QnYJP>k`~Exp>)-!9e*61>#CN~@drYohgUb|A=<>P5Eqz#p zNzr(Q*RS8=_3Jk%ih^L-mNHE5J(5IWHk;z=Y8HeY^B!mA^s}-bL@t+li5bpzG2cfM zUOFPYJL;(cpU#-`W1}sL7oV_yGrr(O@=bauoJ&S zVwMZQ6WU4}f6zz7gVw%G3CwbVJQY}$B%RXt03i+ueSVe^|IT@kGO%^e^mK(e{SpDB zNCngLwW?c_8@c!2K?o&#_hU=vB%e7#u$wCXpBRVkhgiBN?7O77!TtB z1CH8DJop56KEu6FvGEeFv)&xbRrg3Y;&O(Lc8&QK59E;2f1lzW@F=_<#QA{~iDNKmWh*@BaONz}t6U?UWuy zIm$WLm5$B{BwL=r1mAx99p1hB3R#|`scWoOD{#)ba@CmKabNA17FXV7GdDLkxW2x| z)zuY>qB!fm_5+D?9%+){AO7**;6MJ;f5314?jMm}y@3S}9E)-HC-RE=+?#Xe?E3l! zUw!o+Z{EB?q7pnjJiuCm$t1^%7uT3hC*3o1?sL*d_dT`e7dJ24KHp{gvi^Iil|V^FBF|x1sEzXQGrmLmN9U6a4_6VB))r*Axk)ZzHjj3eS@;G;G8mw zG-M%>iGJuOV|gl11m?MfwWNjB>`^1)BPtm6LQ=_5g)-K28cuzY0P<#@;QdVsDfqS| zHQ=h1DuM4_QTDN_E&lwuLaj%>oS9`KA6lWLeUAL-!%M=e~%$*@Jq-e7>Zl)yae;3DPXZ zSMT5B-~ao6!vFSv|4(@L)mI^~jC0D1=Vz_OYPG`0k00Tz?RJG+h|%T5SYnE-=kdnC{6gAIQYw7=?RWS$|MuVE#hb4n(mXs2rvpd- zI*c(`EEXusvfCuYzsJCZ2?DN=X9co6gLN9-+nvqErSlfcX0bHb2Nj(A?8ReIuWBoC z9~XJLR(5iuDTF|x6jUf*4!x7R!NkKF8?sq!1IZcl;lR*>qY6C|r3Bv06kg91%G%(^ z`vwmsL2$LBEaAG4kb>cEL-HfXhIJl^3e}f{V-@&syVpd28|QIdD9n4PFMWoE#i{YE z0VI+Ezj>MC%J}g>%Shi;&1-vIzR-?(GFiix0DINZ_ zX870&G)$4K`USzmIR~R{hgIK7j*Ntk(m#ar+%0KrQB@?nK+2*NIHIo9enWT60~{BV zxS;fRgE4jA&fVb`y1$#;Kb{PT8Rs0Dx&|1aRDwh$VEk|szaKc7rom#dz}@XF%CZdJ z?hSO?Qrh2>0)KoQKu8G_#QIjNCGPLOXV+XQ*#4Jmwzk zKX-8xLw!Io_>K%6tJ|2I6A%NBERtt=crVWx(Tl`@N?RI~VQe-vmZk0_ORV!qWsqnJ zsM4x+M|;55(fT<_$(y}yN&R;}F!=DZ(5>F-z4S9rVpUgIEtfQB%OzIf+Q>(|>4YQuXtchxOLPh}M&se(0e|=( z|BV0gU;Z!rxBvEE@Rz^*fU?{SZY0KRVD@EWhURDgzxSWv{Xo^f2SfAU@5ya9Th#50 zO?Ub%9-TMC_$(sw%@}84!*qU0E(R>;97^r5F{FcswubBVA>ujb2~iWY_1H9aP^|+y z-(gUJ{@?+WtsO*JdEW~*nMB!Il#L^c+-Im`JzoYAU}|sYfjFogez>i%uI*q`=z5~? z?TZXWBJlH~4V3%K!(wZQt$ANr{P<8|Q8o~s%3F+cfSngW7-Li~m1H+dFZA(%5??qI z2zPxFVcfk_#*rdTRd0blF|`L?=KexIwAc@gZbueg=zefJ7C8212LPb8#_jDV+}(Xf z)6`HQ3)wmkl2=4T{oLK&V!2pgwOXNV+eZR=9qCQ$ZujV8z1Dje-J&Tsc=+@q7PlYJ zwhfGDK^k77ZCiZ&^a15&4P)A_#}Xyp`z4zGT%KA4_t8fC!8ZaiI14XjSF+gxHIg*N zbV|Bd6oA)QE*H4FyG5cBWWmBVN{YmQ`{~msEFK=PUaud`8Dk7K1d=*P(s-aNUD7!^ zl;s8=Km3CK@jw0<|KI=f|G=OA_&>2;Esypq4l%>~b8*gd*GKjZG4x{wHKvC`YUhnZXhUY9EtFCLXQ0s4- z26uP2_^Q+h<}{(;BZKp$BlH5dxvyk^F7TZCYiuG z@Yar%^SuW=Jc?9co=Jd3l+|Nmp|u`~WOy-+D(7_k=O|-6n--Q7tb?T0#$!<$G};fI zcx1X_Et?LXxB%a_CsSx<8!vu-d?wHFlPECGV2p+_0)`2IiAN92w%IwfqjsH)eO(j8 zH_vnAc{T{g9dY64vyWrx3ZS~Sb;IfiyYoh$uj?8gKmLOCdWHM@I|_;(U|hhv^X{=R z2EY9L6aMt48tc^(x3`~g`}q@=%LQdHj8R5@=Gf1?V&CP`L7S>{=XpEZSgV(brD^Do z368dn{H$KUK(JH@=WcsImwt6XN&$Z1dm4jyU$8Qk!F~AegH&8kWax)d<0_Y!rUJR* zN1N#$2;L$ZHxq?vD)DlnP`4J=?7kY#Q(5e8qw)Sa#Z@jbNd=bGX_LNF<5>cT_vEZ~ zJ&{Nx$L(6as(n8B0?CN9!@=O-(O3^{gB-Q9;HidC8JJK2 zkJ8fP77rpiNeJ$@yFP7U!cJq0UzboS)@x?Lu&~L3C0C1 z&pJET{n_l0PuRsNZWlg>wza713T3%LUFT@q35ufFk?1&fpQxPXz?=s|&$AsKj)fAY z!>FEH|DI{Baesdo`a*z`3dLlCEX|-)a#RG6a}MV{blae+O5ELk#@*d#ELRWMtk)eR zIUeJjvH#q~=c6A)F3m*x68G`hJ4f<<-#JnU9*BIxA8%6B%j&NHmEM`asimBu7*k>&+hlGAR?k8hQGPpFKPQ_760-=9E71njfM zFI5^nhOLjg`aWBF4B7D582XJv=N(_(erDmlhmaD^SuB?iSg)73yZel)+~CdIuP~oo zK_%(Yn!DB-3HL~(hZG)86tFCTXFT-Mjx6p2IQYlc$j~&@c;0N*Sglrg`SK;^^Z7}g zC&n1KceD}lMEI+n4L&I&?s2!0JpK*NiL4p>HCi{Q>Jmjh31rC}LdZww6Mwg9YTV!7 z;?sv;aDVq1o6Q==nv>|PW7pa*bsl;y;zE4Mv)5l_V_B;Yd>Esd*4Ji>f5%2U^~Iue zynziR#lA{G9#kGgEPsvU#(d18tpI%6`-Fv8`LH|XFN*)5e%5664!-7rAeZ=-b=qc2n}$R z3(PVB>wvord3iiX`6|Aa31?886n;A3EepI62b9jCHWkvwU^>y5yo3b~V02Gns2O=_HWGh7?hFsT%zf$cV~tjLpsq{&PL zc<~DF-+zbs)m8T!F#yJ9x7H1Kk;AGS5Ta+}b6WM3YS;>#iIbm;pa?1-eMDK79a%62 z5<0&)(Fj4~@v)*D`E!i@jBvSnK;2ZB6jMwl6BNaC2LzzC#(KTN?dK2p`0*F4mJ67m zTXtz?&<`B(-yItL^5nTaw4vYb2a+rn zq=N*<tu1eRZ8;meX&ngNfCp<5>boo(N1cvYGu{8f=Dwf~V5b%|xL{1#0bZyV6gN zfIEW$ij%hpCv;!`KLJ4J72?_e^VBW!EQ3r_aGAh5Lhzq@1h#H@kvp(m5HBfLJ%(SN z_wpYqD?H_8?&JC6E~_6{PF`cc>g(W7-nI?uy28!POT2pZ2J@?HY&M&Y`@%Ue3z+~q zz{B2+JaWE5NMw1@^>oJ0Tido+EEcHi21QYHf6_Do3otO|J(zc)_H4Tz$9a?5{m-Zo z<@LRD*pzG3H3@c3r&9pHYPG<_{T=Qf?yy=d(bN^JHHb{=OYV6eRW%y+y4PgC4^he@|aNqs@$R*}%F|+2JDj=C~F#9sLA$YJDKzb#$_`5OdpbgR1 zQs5*s7=U8O7i#Z4%3$HGBu6SaRcKCZXlqTVs#?3Q3IDKRJCI(+C<|GX2BmhmE+noe z5+9cw+Fq{G`{V$^1EYMB3N!(IHPq7(oS_K%EzSY!`gs_UF;2w8#2v)Ra!2@bV}Z6Z zXibSLW02)Jgi7JL3W)9D6EwzPv)OdM5K(I3DWm_QJf)Y>*Gsw-ZW)i$FH!8XlgI4< zqkd21omf09?opR3uy%vr|L%7v@(esJI;6}cZ(Rv*D#@vaL$O56>(vRjps=* z0TaBdk@itn7_gG_ z;rvJYXYiqacley02ddD&kb)r*3~WRKZXM}iEo*~!^ORWUia!D;5gLnF>(_H2ZEIw8ix)+TEH40=!*c#;a^p@7AZduIs*vaTBQ(!B<51@Cl%Nz-?L*DbW8WL< zf5crJfG%}E^%9en>h@g9vV<`j$@L9bafMb*QE&y$0C&Ojz!;-ozTV*D$4|JwyTf|D zL0#7Xh*Wp(@#5kh13G8Nv(aPo7z1#*DFOcp&N{q&^%D7+!i?SdaR$N2V%AxYs;bbo zE!wty@|Z>kX*?jB-DP5`H+-~=-BzgB`wYcq!4IA|6_|( zArEW@f;&6L;Lmt+`{x}4QeD?*f)t9i7TRdkbq(j-j{R!9#1W{$XPJr=6i-tyVvCOip zTe!|`s>jbpeWMsmp3)TW*NyiVg=2`TgY&i5^zWA&BKy`^M=5=#noU1PJ}pw(>`+oPakemnk@QhpahyW;?a%qX_f2#w z<)K^@gEn&pb!$M{$?!B3Qz``K&U;8azOG-Xh; z>|jYMDByHnN1PEmeeAHI0l%sYUQ83rGUDV7m8Uk1#kw|lGf!|+D11~cRu||H0#7Vq z$-wDQg5kck*fc~Q+`sHha!fOURBm9}NPTZMC`0#U%eL~yexeUQJh$Plc1M$Eyzq-QgYK|;TA=PCbFnusUR6I_Sq;uo{XTv=3MZ@V4%nI3TW$aUm9Emo?Vd;o89cK z$&DtDbZs1_nZP6!5FEHr??)qMBp$%B)@aNMv!=%NWP+ra z!Ui-?h|yRq&bzWZ>0kIiO-JkKG8#P!P?6h(3LSn>WHD)B^qLR9M| zSaSNT&(TxHKF{N+{XXi?am=N`qBMA@8g)A%csHNZn0dZLwyqu9fR-TB9Jku`< zARa&>h%K3hrueEFR)XY=VU`I@a{=o;9)ceIS-7 zWkWK>Z{`Yu0auv-gFd^@(%(^c^;-|r#=>q$l<(SEh$KNG4=-DBS6`MT+P3Yqm!gk0 zUDxR}eMo%nDdSLirSBVZ>YVz=i3@Ywd5z6ve21JHmgWF}s;cner(aN(CAbh!iP~vm z_FwES`{==j_s4!<>;JiQ9`_l@mkj3|+PXnoH)xs`b<^PWo7X5N6G%DKAKA|RspER@ zyPb6Oe&4tF9do~)L+N1u-1_CJW2y^-^B?|)b83)V>(DeBi>Ae@(x_Y0@wA2p>z#+O z7G+stxm?mY^@7^i5qTj^(>&_;0098N8Q4)Rh06y6p{$lQRd^k5p07JjjFwSe7c+idYu%(9cYow_{8%T%4 z-=SmnRXJmCJ3h*L`R{_m2~UdCWZakHNqo7*$Z7 ziSl+}eu2i2WXa7`VU|hcp+CLDHfJO>yQ(a#^_XVVVz^!Fv*Em#1rSEk?NG~)PfDjC`OyccTib*C= z+#cSY?Uxi~2?>1Q$5u zF@8wXX-p=v-{UyDXN2R0HZEw9uF4A4ro`RnJG}k+9j3D>ib;VY-)gsQ+2*Hfq)p2PUQ?L%{i=69bJAA><`HVfvEaf?P<7^|UM3vJ>AGce|l zo{KgHWhghrV0P#lhpxZ>zVuZZ4jn_XaV4y$1{mki`H9SPiD@RWu4#Sl_Xw@^s5Fre zCxHkqF3`rhD1dMV6sg2K+9@^`t=+{Ddk=5{Oj3bN3A6#`d(H{65U9R=mErwOipE&{ z@l%D*t9Iu&-V;pt?L5JCA#u0XxLdU+kKYd@(Hr6kA4oRB! z&+fcaU|a8yXy6q&Onq0xu|`p2#{P!wobR{*>*Ru9;ewM+sxcOeszPHtw58@V=i`(C z;<4MnlNfW2{T@vpFf!_S2$63TKs!`modb-y>{+WCi?Xq}nUFTt{YF1(8(8nrwB)5e z%>;^sEOkp~&uXS$6hIQeQ78^2816cc-N(_FGh(SHilb^RR#iB;k!_iXDUMl234wLv<)tnPAVtut_ugX}rAx5C8>K$URiPj_DM6O49fbJ~ zO=cn(Zl)6NuTuyPd|0&j>Aps#?M`2V1un{)d4eJp_~oI&-CDyK2gQKXc}V!p-eU1< zAXOq{uq;aewCKm$^d&FvK8*Czrfz&u`jFiH{>ak@XSqi zG zx(=p9&cIm!J%ZM;u`eg`B{PwJU3#vE!wb6db&VgG1AjgJ4x}9%sW{S(9V4DY0I! zVV&;88J{xx&v@ImST2`cS*zb484G0{k{~(zoWkG4g<#OFg)t2pXHhxPS@xdc{q*RX z&w01|+2>H^cq&k`a4p9tk3N%1*7YJfd)hOv(|HQAtJv;%Kc$)slA0e*c5eR|0}DY#Q68RAWY_I9^Q^UQZRO*5T*H zW6yN&1F3MT@Oqj69{A;<#luF!SVz*^x<%7C2$h_ziS%m^7szF?Ha(e4I$fh5VYOV~n{U2HF`3}==TG?j z`4jH$?yy;J;AqEyB*{Y4-%u&&45OfUewSZcTDK>&ir9nu68EG}h9&XGs@v40X?j#9|CC3^IYaPZ%fKA0Zm?-IHmxPdu6TN* zd4CL@@4m9YvFq7q+3$};FeHNG6pfHEhD363&S12IwwIN#7y=rrvUolBm}C+~Ds}=0 zoj7GHRcqm)FwF!K$x)pla(h+)VS!#hO*sT-Sdn_!z2^9TWkFM&~!ZyLQQ#+Yj;hzla6ACU%Jn6?&#Ny zW0SpKla8MmYUn=YWhHp$R;TKzyYBJV+xve8Zp9GlMQe@aa)Ceo@ejDWyG5F2sB2>T zwr#uD4DW*ySO~OsbRaobDm2Lq5sn}r~4A`ZoF4!gM{TOtx;Q+?6SgOp(cy z9{IcH1rRW#iX%$|yz^LA0adlv7-yhVY?_hV7ddU6UYH{4>h+AYT$Z)Lhh>Yhd5rMN z6vwMsf|pZ;T04APwpdg_N+qPeiJ%w48uI;!sc3uwV#9avhCZ>re9qY4>BpLM>_0?Z ztv(OqDLoFdV0B&apcg1$=ivtz@8_S7;Eyq~GS-*8Sgn>=t(E~LCcwEQulj*98p4c8Piv`6)iiAg65BVGhb#*~_z@7>WmB z#A9<0>Xl4Vaw2SvLu)RxyI|OAV?|c_Bop9_!R{T#o5%w5<*h zXB+18@i_}Y=he0bfIB$X2d)~C@8La=qzODM)*H6L5)4B;eX_N)I>i%M}h;X;>Z)~Emtj-ur3|eQwFnc zEG8-OL6q1EPWDHo9m>|>#T1z50-skLWi#%<8lQm#?W##Cpaj8k*Nq!g-<5(RSLCSm zP?8|wiTDw+7LIpUDYAr0Qok%(>Syd7f0jwSnWwnQCGIvFA6M-T4c~+MBe@hEBrYBz zrsk)Jde0R+`i<>N8uQMPqHSH*kWykYnRL2Z@%X347Fp#&kHy0K^Dz0RYQTLF#WB(= z-Ml^CUN$n056~ChtEvWd-3$f}`aD3=Be8sT zo&zT>(EaCTADMHSNZ1!ceCjhDwY7+}nRJcza}XTw3Wh8Zp~Sy?z7#+# z7-(%xWi-+oQBFPQoOnpFl;l`c1j`+&(PfIGNCgN-(^=O7P}N!8nhf9~vx!jC}w2f{~*aAAtGwYrN0J_&zlHWv4#t{hZO)U5YPB zl%gYa4S0rS`a|52{U&6xwom)2BWjb4ME)E6~T9gIi3lhspW3VTiula_s^BGp)E0t&|v2*3Wt=!c4uqMy!87MPZj1IlCnvXq|@0t1wnTn$OSRU z8{@DHL2=3IyCK5#gQs%<&PrUZU|XmGdQbu9FtRPee`csoy!2##MC4Q^M|$ltklK9tcU zksa9qRg?ar^IVb*2QSg@8VvQl3{KB|&*UaZq4dqGhRRy~g(KFlpQBbi#1n}x;iVj! zzCn_87S2bxdD-pS$1W?h5Nw;eLii2>yFX%o#5vIg5h{s2UI1gpu^&9P?BU13gY)f+ z>ixON7R`wik|3ACrS4ocr6CQpbDzJRv)WsL_n(2j2T8o{xZH6DWSk71tZ`^{&jNyt zyTkipo^eAJHQB~wzWcTV=T;l~9HCR76Dp@u2`k=z!2uO2G>K$LmB4i&@p7gB5a_7V z!^ibLIhl z`-UKAdy^N{f@i_=mveR$LflsbjSv2p3MBix!E?sG=RZ9=*2%p-aSV_G<8L;ph_=#Ov+LCtvYEsW9Kv(g7E zG);@LtOG1}cs^scu?-$inG;5?j#3dU*cpI}ZFV+-aX(agJoNmXORVdEryod?B7$g|WcLMT`42SvC$GJAQte3Ov*XjXQo0LnOjJ^5;26zl0Y3 zDb88o`!DWlwL(=@oiLu15`uHspuD>Oou{00O!?1wfsS5B_}e&xsxHy!8rsC2q(qX? z!fs3pW42k&IV1KStTjRJEa?JC|NLWFODS?pi~x(6X;f9y1(%^khx3TGI-eQcpJQ6o zBf3n4-r*KC$HCF+7GM$laG7jNeEyz8du>0EMCtfE&yXcau)MZdR4rCk!#E!nyYqiD zX5mrFem|IgdPR-9Hd)nD`(bnPNyK z$9jYz-$=T1CijkByi)#B$Xz+U__?@m#c3+$fzJI2>rLnF)sP<_iDt zw!l|6DN@OyEmc{fwRf!vvTGdKQZxglqe&|8&C3k$uTyXa)PcY~&B#d4dvwR?pQ3X> z**G-XBN0?K6O8ThJQy|HtJc9ek4$mo$+)#>bO}oeIw)g6qbX|c+!zECdr8sDIbc-> z^wo(7GR*|0nSik#59Mz50Z@Q>JtKJUy0-YZY_X~i=U0pYlSJSu6L^2Zg@-yfkxNCk~8wzE^;yAs4FDP|v+49WmRK(0xUPT0`r zwh(1w^{A%*x%Z_1{9SUN_xU5vIWTxIp8$-*N1)3EQ`Ik>9=qoUJw*I@+Fbo|RX^w) z4Nlkwjwxq&B{{w-1b%;=;_ZyoGVV484;zh#QWL<)I9TgLA0tTC@BIYl3|EE3yDL&l z{;+IuyQXaT)hxkR*9l(D5`121+->xZg{=p<57ycuPpCX4grUuM_)z4H#726gV4TMH zol(M4f+0@?T%f-X?fyA{R1p+STQ^F+gfn24kt0^s5^lLKjlwy@>p3ygt@rrpp~1t3 z0@I;;sRSuYzM4wBPB^}i47mj!9Pq&b?Ff!cUkjo?B(=XYrS`be|=?;O2m5HB|84Bse@f5;?WPZeIK66@OF!&>7$SbE#Nb&;{d@Q6q- z%oBkRiw1xGT;ub)?Hb+loS?V!T;QS9k2dVJcBoqiHl_Zw;tciv+y>rAJYJqqR(*k5snhPjNT}{P+YX%g8g51IZC5{J@e*YuZb~)!esHgse{9KFne)()aI6U{F z@ukQ93*0Z6?2`gdABz^!G$qi0F#!T<^x0*#Sk}_og=TdE&eK8IFF_iKluEi{A`)BL??v}{~bf1Sm=;P5EhuYBQWRglK z$>CvlkL!XimUfsIgbY)X!=2E@8WlizXauEFplV2)#`(tzlaVJP1@Ecv4mYnosNo(B zr;PPjRlCsLL~*>oPH;Vus9J}g?rW5R8*+Hzr;^w#lMoDWp(MZoqzrf`fEy0ng>0np zk8ctkXV)7&roTW8a{1mH6~GheEf*2 zlG1_mwwIBdH)3#$!vEe|NU3^R$hPFR-SuBCTuHiSvB$x?mvg77+1vf|FDT(LW^VS& zs(twH-|A+j|Go}!JciD@|D28~bL~F`vygRspKwe$gAC7gYaMKB0frzyfByAY@6m?f zb3IXbGq>QN#`@c<1e26^WWb>fdux1WYdg&ZQW@X5-49wveQRqyl%Q5bs~-~&`(so9 zk(>@DI1Aaww*K26f-`EMbDY+42?1!55@d`@UM56SDw$p95^t{(cn^GDQQgm+Ky(RC z9_&Rb&@>jF0X`@`FaQOkKQbKT!7`KpOqBEJ9cyUU6?ZgIm~ot^`tblVTw}*zP5M;o z{kQN^_hFV_;+(c6MFC*z;z(#Mb3u8>2d6~`YX#sf5=k=V+PNo}jC?>GF(x1cHOk|^ z8!lIErBD9aqM!Ra_j3h2f9-4Nm!HN2f_~80FIgY_4Fv5fFeD7PmJDwt$2-aJLXzgL z_1o+K-h<=v5}pmlPoI`8Ud|G{zfN$K6A|{hkg(3l|? z%`b;Ls~ZFT+b{mfhCM}fY5PW|p@4J|%_VGw-Y$39w1Sj;7fj6sSFqD)iUm&1x>Y9w z8z)v67JE(>?H^m>2cQ!}s^;YCaj`Sd&5EzGtj2HB>H~cOVE*_xnpeI9zk&!&1wSo%n;cz2lxH`GJMr9cF+U!AVDOp8QqVGN7gj10Mp0x(yJvo50LWuCojY4db?|#BB z7CTF=jJ!#jDs7=+i`p{+qiP8Y@`%O#Ga@C;Ar_k|=#NILyBd+YQ}Mo%L}{vi zcgj{*?mO8)WT>vlN$O{CgDdO$M$`(b!4vNV%JC`eEgo z0DK59$lphk5tJ;U5Z{K41A|!2e11zq7}~hcAj%wA%4|V}UvzAUH}phhn2CZit;S2B z{p3j;kItulKPJiH9WGto={oQ|YbfVCLNI(lr>#>zN9s*($4D@|jzFg)4+OE2jaK$J zDJjt8l-~u?fH0gb)M9BtYb5yLPf2Fr$#fm1^lQ4JE*MgD9OCNk*$Q`;ZK_8r+sR}0=MZ0tm!o#do1HQ-4o>_FH@ zakzLL(LoG2P5A?yL=$aNVKjB`X`#2%01E6AVY^S<$YUXnT{q+$S1Wk9CS6-TAc?)d z7mhwwO4(+)TxO`NM-)QmV=zO3IE|4vm2nZ|{CZ==E(+4a`kK6Rl(}3760^4Xnh7+j zC=MU^i)#CPvWo1;45#2ie8J~e@MRViTa-w_XNF-Y-G+eR2OR-F@-Cq{@t*H05H92r zW0FIDM$IJx35(}>5aYD|Mgu#Eyx%P9NGVP8R$cDGBYyGiiH^e565ESk?Oe^~gC=g) zvHI(am$SsvWbtPE>3nA2*UC5E34N*VJGQ^8bI9oig13723}V>g!N2J7aE+*Cf@-^| zoZDZ{3H_dr*roaU;NH10Bcg9H{NbktnM(x?393q;dTO;j9gvgIBjLuZ=qIhuJKf-HZ|l44AyaG>#p9Tr6)^H7S-g%UT>CwvlJS$G7Vi#^{B^A^0n zy!GHXC&iEc?zWxNYIhaM-PASV!>V*IlX#%3nA+0XZAGXWj--Sl-Xkq5#L6}=W9p|) zW_|$Fef6IzvGd$F2U6Vv?@1`h(@;1^=CM>j!34o>l|xpB*&j}XcvAVv-X92XWM9-& zGNX1Mc41WcGY1C0&=ZBEwm>Wt?Q%AXm}&WsvUjxAV63@$e$-N;qFSsE?2xsBa0L>B zLdCTKb-RF>qImcf|1}o_FfB)6p{TK*f+cIluQ^I-3D@|}PhT~_$EM-?#vEZh;HLnz zb+FrgqdOuE4x>OSk+j4mP*ucBj&`Asd{z}pBQv*ctii}d*80fdlQ-lXG4<7lQ)|RX zNn{wEjT+X@Sbb1(81s}4QW@w!)~KETer8Yg+%`_0D)yjPX(=nSQF?GvDkc_(^I8tS z#Ub8BZd!`yB7WwAu0rHi)>QM>@r2-xYg^Rj$kATYHNGbSZdj@QoPenuXLAjwAp4ay zGRAHL#~JYX)6v)CwWN!<6d*A213Ob-&Z@%|_T50EoEUpW=%X)t)O=~qjaM14_bgiW zeKs*JMCxp#fIKs1Uvx4o<2|HD37B=AbLckBY*w&-lbX zD8sG;g1Hs_)B1eT2C2}Fsdkgtj;89*fw-rbOQre>sW#NHI_QwpI!6!^VKa`gPau@S zoGNLw#G)@;%LJQEs~ITOIDX-_O-?}y)Dq;MDJ1v#c7jS&N39+Rh7CuyIwll<^ry^F zOoI6`ueop)W$F*^Cl!0r%Bz;5RV)=wuzYMARDOGI+3EgTWBPf&dw%Ja$0`3?mu6}0 z0#fGbX|W5Mz4VntZoE+ry<8KMw4Lw>^kwCb7@z75dX(#}@XYvC9QaR-8cZ0H~|Fyl@inUX?d0Kd$|k+m{@LlkkRkZ%b`VHr-s8;GbIX!XXngBQ<7@H|> z*3wm`)M=W1r42^KoGP}s6qlnJWwg2%Wr(N{PUFL+Sk0AM@cxuA&`&Ux8Uu?$NP&ZG z4YO2aRj9i?&9xj6xbjPc8<-05Z@=#oO-LhF`_X>vsIvMSJj_z71aZziMIx%4OCD7Y zYAIfnO_BOX?&`20vya@X5rjbqWM~+|&(=F?L%63yKIdCQepUDi&#w*A_xC@oG0=V| z&&m0Td?FD=TJCTS*s5VgGSUb6-rapvU>nbncT$1PX-XQoa%XgcVL{;>m!R3nAez(3 zqZ&+_B!opwvi9?$`YR^n2Q#e6v-P^R>eSEYo+yS`{f*ISL)-){zB40Jf<}@moc%Ky zMb@{Stq|w%Jw>WK#hwQpL__}^_~4>f&E6|J`Dvg;z5gfpGskPbv-_iBNCZ_~W$hW! z(N+p}Z1TaS;21((aQg^Q`pM8IGR9-a5F9mFQ{*E{y6|N4p6W3kaou$YFOtj)vLq)8 zJGGVMEmAUY;V@NF5YqmlvI$RmGNK`p*-+~n$Gbcm#fw*+AP9Ig0OLh6Ng|baA>lJO z%;gQM-eLOp*a8m8exHo}DFYKdb$XXbWZd30sKB5HALieE4^_DaS_QNy!p=~?9Mg*; z2vqE|_}>8xtXu7`4Z~A|Nz@XU5noz#hY(8R;XBvuJ^20FPCMC*Dal<>m7BJyo^AVk z*5@+74^2*%RA~P&EoonH!!gVxsLcYOPjM+JCwi}_syk)${4TP<>zvzt8XxoUti9&; z-n52jnf^ky|9wz5az70q1&tOxtx}Q&!i`|y8a?52C7wm2n_usOHQUt9u&m+mmr)(I zEHir**#lC<&EXc;B>AvD)VGdvfk8!a4FgJci_2Xib10mc z-6?rR<{++j;dC`xCZHr_{oG34!~d>J!|mw&$}i+8PPUrgzYBV=K_XcmGd+V1)#>4Wr{{_e6DySTlK$|LAi47m;0U2Tw!tfFB9Kh z-U%WJ;!tyfGK~->h#!TA77-^$*=; zCjZh5BplCUGAfdS`=GooT!bsc(GNd#nTX1mn}@LlZ295-_Uz>`?behv_4eO9RZp;-TnTuM*CQbl ztuWGofL{IhV@fSke5k;1T=G4z&O-e0wDB-&kuI=iKuRAU-1ajm5E2g>rKb_M(Q6+( z7qv4KVTup9q8X0K8UiLr6Mk_<1fO;+av5Crgl|edDHzk81-0v-ZW&cnwhpt!AZZ^_ zyw~cfz)i=5Wla)^mO67?Q=`q}Aiyz+2s#^4(xnbdBCF)N5f7)=L5sH7dYZMuZrBsAi>Vc|3%J>?{C=4v+ViKkr8>|_fGytc6tE0Uvr%^>7L-JipqZHBTZp<%$monus8Rc6Yuy3d@EsX(Z;*ZlR4 zwdh?O&OJZ&$qQo2%oXBrfysJT;vLc1;D^Zzrj;lm$mjm35Zarz+IvaA=x1+&baO zi&Z$y-|x^I`_koI^iA#p)`iv@K*1a8+g};j(^;7O{i%dbM{oE&*wqwl z)JdKPY@DXg0W04!9}~&RZ1&+?H&jG2psQUJKA||It~Vnw8r%- z>e0I>HM>vytv3x@QkWP=F}sc{jp{_gx7MnwhT#j{x6Z}ux(Y;IRDT97Sy-cwsH zoRjgR8~ny~tiuJg1T*bC0LCCSuA9;6*a(}bff3Wc%Q2B*fz(TcOLsXua-kR7M~za* z5w`RjgbG<7Ut$?6dcglA z?nFb;=B^_Y6XZ6jjE!-tVj9jp7P-+3Ovhnez4#wp)jDQ=$(5Sk|LaD$vJF}{!VrBe zZPe@dX#ewEr#oj%Bm_L{%8h{D+fw7En0c|X!Z#kJH(Vy9G%Wz6Xc^)I=~-U+9_Y&X zP#g{8*0sXAoM!g>8J;#=_Saa%*HN05;q>jkz*w(DHJS?^$nL~n`H$oy%2&fn4AHc^g}aETvPL7?W(DC9Ay8%rEoOtk z&gkat!o)dNhd0wjcR)+ z1laF>vkX?ZF|Kztk3{P0yrcdgAmtsHNrDG!Plm9~xgPe;p1oMIj81Iy{FwO z`DGrp_F>wq6n2l)2d`OqXOZRaw+4PN^?)4%=(X)&A=9yC8>ghab8uVaj_f7{~s6oxOIN;Fh zM>R@C{1I(xYQ$kFYoG|5P?fIV(Q;m>9p?0IIGc**qVP7~`4Y27ACyRDJj~XPOocFP zMqh}FR76D3PJms2neO3EDt#LSQwZ5uVE|VqJ<%DKQvaT-c($0-wQ3wsGABk%z{+d! z5vHTVrAq>#DI^0LE<0Yj?9Ty>RJdI698FslkiO1eRe|elGB?yeUXDMw2;^tGNvCd^ zX%vnEKK5YlPl6z$fZ_LCGIVrJEK*5OT}R%^>VGxjE-F#>1(~Ze{sB|T7QU>+Fz=Q! ziYjQ35C?<)rVT7A1uYvX0k@U&mA)w_;clm(Q?Ciw#3shYT&_ADrc1f|f2Io~6XKCsL(SJJLur{N^wabxVJz z`G$4)s7e@nD~WAxAlqsWSRWK~kK!kxbB#6Du{O95zOeW^9i5AbIpr(w5k9Z@v7wj#sLVY?^mYO*Q zil!+!tKnl`8|s3BKa6aX95H*?T$^i*$~ZmWwV5j}BXYs??u$%0<|>K-M|amoR4Uz^ zYW@Ir#b$Z?U8V~CXfsChD#pYj+T9%h@!%~99;F*B=@04z6^dz_3!dK=3B%v7-y8Fw<15GDfj-p~5mBX?+d1-{mtevT6v;zuu>tcu$AgP;tg(jYGi=nO%;o89 zL=5ACbn?fYV(za9WuIZXnB#DVe=}k0Uwt_laQ!CorwC)u7-ly%I2adp$QGMgClX#V z?sk@4E;5q!9lYk)g+)1)7c3qBVdsxxPGC=U0Z_H9souNDGDa=ChB+FVWtzhQ3!iSc zr$}kWV82rqTDdwmdpHG)bJNP#c8-pxqEKc8dNvJZBf7z}NAapbWPBOO`KeFXD&X$4 z3@Lb9Fnur{BpyI43yNYei@2iDp2@YD9KPJ>=CB1!VEOGZ3v%A?nTfqTwc#_|(wl{(7S{tpBHxKvm) ze6R4oc4%~Tr6Au&FLBr);hCaT$zpub?XA7t-CbpH*)P|X2soolvUrKlc_hp|Iecn3 zL@s;iFI%Z5uNr&pZ<#wUj(Ez4zUV)H?(Pfct?9bg1TsTNh@%i$b=lHln$*;VA zcf7K(kc0^Wuc3>NYIjj~f1LWMB^n6v!nBwUqCGgzjJ8WVm?H!4q1_}g)jEP`dfRMQ=ZW*oRI- z(eq4Qn+K2`FVSz*Pgum(c|8fKj(0tOR?Lg{BZ_jdv1?9>QLQ)zQHPq z0ZxaFiycWU3V4rqrW9=$DV)x(3m<#yTmD|2TtJUkKsr{jOf4^ ziVBk!c)$f*?VzS@CP#|u1kHT|Z{KesJ(jud3{Ty?a>g}R#Qw3TDJwM8sCMEhpqbKe zn)b$a^ID(41bJ&gqo>)pIC>UdJnM7=h5BM`okPaA#ialxGE%C;Q{6Qu|K0Dwh z>nO~V>z%LEA!#d%1?7A|`B_QK%l=)IyYLcKj$^;WUn07)of2bQ`#8>%5oVqXWUR|o zh)==lG3pt2lvPgm3&-31A|!!g4F7#fdfn9-*A;uw0Lz zHB>d`XT?0!WE>Y!$NCRBZe7elZOayoEH?-_fR=Flf+C;jw7;n-M$C!0QT0w-H>&a&7$$p1^rCMM+R1Sq}){;cDe~dJL zy(k*2Fpv2J#!jCqHO?%>O;L8&I6rwu-Q@XKh>v3w3r4(`bGB7RLw<6rjIj>CW2faD zBR9~MVp22Zd(%>KtB(o(cPON;inlQO1gp~t<{ahD`{;2+h zWMVC3EId8ZgqiOo3RM@2ZXu?e5s0Aqo)3$UaDW{BZ!eZSh-G=k2IEacyh6m#dXTyP|88zfDq8xMRn zS8D@hIiJ%vvaa9FA;O&Vva?}ID1ACfoTAgBANbLbX7a3K4M{u{zK#iuP(_LnifJp4 zPI4mFWr7 zS|jnOBM~yn0BpjqYBw2Q`|+7fIPgk;0)J+p1V3WwSR^6 zmwO!HPuQq#@poexWKu!<8@9i5rI6y4l0iF)!F=me!4VOz3n=-9sL!`X6`pVF2tQ*> zGB3#=2X+ix23oLgh6)XBSi}}8PkEG&+Jx@?KzOu%!uBGUskGXANy!k`gh=JIp!Q|J zpwm0kISaqKCUr(>l@sJiX+;9Hpn5^faCaJJ{k9h~yRmKvV}db?8(;4r@6ut%0`z(f zXd1M;>x>#fgqmU8+`iu$z6#%x5mpU=emmuFbdvaaTaG;vy}me+zOE7{*c6$NM7Yx? z0W*(!{7~VI#Q5J`zC#y_9;g<}a1W|T?UdZSN`&nDgP>^psbU(%e;XY1Wnxge*zSLg zxQxJ@CCH3ex8AE*-3)V{J4BHaC2gp2WrZREM=>>2qg2u^_U|k2;k+G!&_--u#v@$_ zLGP@=!MiOVrh<^eaC!gG%IF@fs)f}-@W>7e0*;57iD>Dd`#%a1okB0PBKCjvKRFqx z=RsuPz-=0wGULo?ggPVijh^KD+dBYbTUIuc4c~)BkTVu&KRR{2%l7_XnCurl&!cXa z#iA!0VKwUrTS%e;784`sD=u~D=<>oB75oTie#VnivM!#_?%B581y`_PzlWTE($UrQ z{=46?^u$Iq^=XA@xd6UF$9hhFPhb7E`=0qA#7+?xTk`6q;2;+AE9pXx2qTAS1wW5u zG@_%%YRQLxKdvT;&xFf1sTXkIcLLq*QEIj4g3}0+y=jqkk3~zB6sFIs)ke|dLE!t} z$Z=h_jKeQ~pIClSnNH((kbXCDn-0c-Uo{u<&Bn49`BtXROCmFGY}mp`&m~T0tel$` z_XCLyJYc3l^$BmmEu^c?WYWB>@+3TR&<6>!p_feiH1dyEl`xv(G@no|nNgV@Fb~Lk?XIidAV)Xu{Xag` zz8AmXv9!Qc{*O}g=oC{LCHf@5G1YxF7#8~H#y+i*U*d*v&ap(TjUh8sG({+B;ms^J z#TljLVs+G|IQ^QS2NmM=HOo44tQIkKN^lVx7W2tO9vVZ8;lN#9Qx*5k{c~j>zs;5twFEDB!87nZUuiHn8P)Q15{Ib>_1qCNq`LLp&Nm%U*rC~MD}Vx zjpSRAc50T{O<6V(aX@SJ~q)BFld=x?f59pkszRM2~)FFlp@1w`W|wZ%+t1^~G#6 z?yuOG5aQem#xs52#|)l-Vd0oZ@7B-UgtK!xrrC89^&LvaC~hs1jlb$NAZ5_kM9c`( z#Ie!iD!SAxk$ktv)IE7l#~a16SMydPv$P!Y41(D|sc;6!=$p>)#4{m^%Jmkg4)nMa z;zS0YhuObi8!zhCkjC&;{jaxG!_B#LwvKO@>MU*=?P{|Mo;n3q&BUQ*@|su>zY%)M zS0{cx7i=FSY zy1s>iE*bf*+Ba6|$6zPXX+<1aUc4?%$aQ2ePSZsET`$Wwt2MygAGT846Q1q8!D>@0 zRNH6-KDO<0gI?45GxRX%Wz#5WqEKTw$kg0)tOwAd??r3%t$g}wUgsWQ z(~1E{`;GLVE}DUxkaCTCFH$#tf{w6pP8(7S_}pet9(ApS9r0GjsgIx$<0l`d|rKhpW9=1{lgh zlapuVK81AI<ko!jEOx%qG~kXz0ZhH3m8#@a5aWr&(8WN2oCkpn5^2G}j<56G7La zhAFAIGVh)c0oW*3{tguV`KJc{puZjpO~Qo!OHD`t^H+@gr`x;G9rV`F1fpONa)8VfGlM%uRTDgt;WC$%a1b-GuK-uhf#6#@81HfnEn$|)mRTpumRR*ixBm^ErN;~nrR zgkOJqG5XW>nwt`y=0+jIe7@)w4S4q2Z7xjalAXts#%x-KtJ|zvjzS5~cn{xk>$rsH zP+>Pzv!JeL!LSgiOw&S;AHW&;=Dj=WDI?leIVomFHs33=HA2rPJ zB~q0yY_G9ClUTCXj&kp zh~}H5&{yD0mg{3Tq0d1I3vPgj=X~A!O?P?BU11uL>v_7up|N%}_w|vC6Gl=)wQ`j6 zzzd5B!91FQUKu4EL=L6;TO-%aq3c)I__|WuW9#wm^T>1(tOh5eOaQ;7Q==NGqD+Af zD?QW59hBo&OtXW8ndnBE|TyUOc+2j=KH9A0CQ*r=3)S zbfPPE2eA}+m#waG#HF-BU<0gGE8+(qlD-ISg)H;oS3x@mpo_O0ySel>6ri2&OX2i$ z9pR}v7|idC=v}pgtHo?t`kzp+Df)L!C{aq9O9Wml*qaO$NWMrO#lrL)a|SQHYmTd} zT6}>0nBH5{s-|ednRR@9@KL~m68AaPE5;pGCZBeOvy#hibp!$Hk*cB7*7;2;YLU%t zG!og996rQbmrOxYB;nN&8H)m@(2f-lb>deI9O(t086Cn9iL$OUASSKc0ZQ(l?QEQY z5f3`^UbKD<>#yJ*Bf}f|jY7DXtL}Jc5jZnvwpGj>51@&7mpgrB)IGZ}S>3zEc-X6^ zW7-4e&vo=@0P!s%?(Zl|GRJ`;LMj2%OB*f5*S#CY!9*q4Uk$y2oWu$o5Y#;Oz07HE zZYB72{>rFY_%NG`qW>-Fy7aPDHBb#1C;C@2-Cf8MHROFreJ`@9@+fF>|Goy{KW0zh2l&AF0JHy6^1CmIO zddWij@F31|0=|b_I>hG%aZ%i?8Q&Didey75q4v$(U&spZjDeR1g^X1S_Do(rYY`L% z7-}JjZ7l){dN=ApFRU@9Na=SgjhbXnH8PUoW%c!%jAIuQQXvHtHcfp4yKWJj{EyOF z`+mwGj99m`BquC4(O5o;O!vcxy@*1h5M}k-B>8yCGg6@asGLHv)hpZ&U||lC0caA% z=cbC76*3C>G>W)hYN+8dt!WOFeEX^7Q!e3C;U4nUo({S2${go`NNv1@)A84`xmQ~A zHU@-6S6(jX;gmw!XYk*6(pQI0mC%BunY2CuQ*z^Jvp=FTFV~p~@&==O0WnRd3_i3b zmo@OQJe6NC!QACxQpti%Nxx}ysS?DtSH9rTpwb}*m9O%y{CQ{xBuJssfbO@$ z(%jqB>ltSvIRu&(Zv4K_E6XHb>G@DQUfFr0&aI-{*(Mv&QvSU)a$i1!XFy&s?0t*f z#jt&xj7+}#NZk+FWUBaUU^V^2Cz-ReG>XD!L5~!{q1g55WPEq15uq_0_h_0mkrh zO+{@*x1~}BM`ZXO%UQ_opxT=$5b!92m1Q=Y*kCCv;#W*VtfL-f-^`@0J+*rr#39KS z)+gCt|LZKMayEyPc4c0nxG+^Zy$pzqSkE#fnFMDsS)haAS7#gdIMyiCO1Am_9;J-U zR@NPLO~_CGO~}34_(|`T1kF^YmwyZbJMQo04wu)MH3XV+PE!J4%LbUojEmh4Q4R==@%18dBv1uo37y)-zxH>^mmfDN^i#o^) zB-eg@l&Gjfl$FO&<^BK3Cmtz#?ou{ASqGVxxYH?~ri<~|RAgGFIi)VPH~~~6`?(U% z|MZBa3U4mHO33Z?IE6rnq)JHbc;CnJcH|2wGd!pSNT9(cnah_-uX0!Zd!&NBnAi6- z>he2=dvA29dm33B30~BpMYH+k&0P*@;pxb-jszil!l85g<9~UlnuAe8FOM76<>20w zbieKQXSyvERq%dx4s?w# zW-LsV{JLCOZPW61q3UYmf({ic$}13h`{sk;1ktVGBV}181^Ohw^J6gv%P5rQ*+ufY zi-(vg_Hc?ToIyRo4-sDT8iJisUv4Q^7#v;tqETNzhZWFS+gOF!*EM#2noXw9S3BGU zvM%?Z2!vHj1}CFUx-##>H?l14{Hm7mnhy8g5hX(xYU#mLolk+27iNU_y4c%lE<9#5ySioKNK^ZNn*isW>W zAyTisb5U;YxIvpgn%{$&N$TQa7BylGX$h&+}? z>R{z@v6%E=HjZxvvEmfyIg)Udy;*ESmYYKjbl*EiDtj(vq)9v!{pd*q2!`eA#nv+e z(P8dz@a7yb^MK=`W1R>POUJd9bT}EA8c>K6EzVp@i=z=FB4P5jmXU0P>45V_psn;t zKc#o3gp0ZgKrFAt+?D$O0?w1fa9c0Z4)WYiGv8sh@*`u!Uzy|!?x8QYu#(iy*}y}E z>Alt(?X4MTs7p)3VmY|&mFOCJ53d?=mzLy)JYoP|DsI24H4X=aN+CH9OlI38w-xDr zz`*(?LhH)`gi4!9D_K$=71`gtSS~17ipi$Qadq|O+e^>W4+($l*c8e*MJ;2Q1bE=B z?H27C&z$g8-)r2vdy2dCd zS_cydcT7r)TNRDM*^VSeb&%|JkwwB?imlv@;*OL&`wIGo0>-GqFN)=%;Acii>p3QD zDvib2^=Iv}UTa9iA8p3BZd!cWg{`8KJn66@X@PfPltLKxFQ8poz7ty(n-*|+{}S#x zDf>9JTC)AK4PTl>63M)TBaN`f!uKjO$nj^8|VKg%w ztZ1dyXaqM`x8CGS`dV%wsvaIeEdRVov)OtLH2T3}p0VT*FZrQsp9Ps)pJ#L(4@_qtUV^J42k2m>$ORM+eVFvX8e^f5j_O zf3hDqa3pjDvk-je8SjGFX&Ce79Um));{2G@M$`UUVv`**-sQJ?{F41R`zM1Hf`jZ) zpQeZn_*_s5Dl-L{znd(yUs80`>(~4v_*DbBv5Wr38G;u*s!td>AGL#9ks8QB&_$QF z&CwIVXjzP_fqqy-=B+Rrc?Uwe5QG6ezP)Tb(0^2RZ7iV`9~46>0Hd_^34u3a$#SHq z5t_JvmNEhrT3T}NcE};8C$vGgwo$iMeVO%N`AMSb3~%x4uXodg&<;jVPnfui*>sYv ztWwJZsCLZTYmxM(pq&MQB0I2)H$atlnA1f@PH1X1CJI#dVz%{@VBe70FNR5$-=c=a zy)b7HCEa&wpSuTwxcJ!QZ#Q+9|2F4x`Tj8Xp;QAOv+R-JP%y(9&oa&o3t?M6W8t&E zB01YsayV}8Q=WDp=SILZt(O4o__FQ7MI^m!V+}Jk4YwF+EyuW3c|7;VX>~tCw8oH{ zCdfB`m=UNwY2+T(d9FBa|8fLEg|+vRsd$$@0c2@*X;0DC=D7SISl$#7%C>_*3M}k? z*$|O`N_XdD;E+dUN(^ODli$PqDtP;(l5x#&%N3OAmW$pQHxj95O%6i>e*E~NVL8be zw=~;(HZqV@21rkeKK-B#)mU+AA<@>}_iy}BUM;Axy)WRkCTT;0uBj&|n$K4dRY77) zHVrS#C{B7LWV_xGaq^M&^$i*Br_pz5HybikDiOzo*B|UVT~rvCp!c&7qrfx)ksgMY zp(YxI6os8YX~(307_7wD!L@pFvY#`KS>jRucp*1+7+4=HC#iMx#%pmHydUT}_gu02 zx!g9g#ingXdBi%eph?SrtZ_BzfwLgGz%3b2>uT172N&r9dxTX8s0_h`HU3qm+djS< zz1KqL%Z*M(f#Ysi7`1K3tjKoA* zuVk?>8H#>F0ir`xPEg~_J3hndepr(ArH&(`drE9jV#!Me4qM!6bSDvj<8a1Y_o71Ur6R2KuR6=D{23 zVjBS6V45Ax<}w%y+r+?|!5joE)2-r$Bg}=ef2%N3Ml5-kMg`(N=Ms!Y?)$Wq$=uB1 z5=z?@k!-47pl(EC|x)BdV?7tcDyG(KBe!NxXgN4EWwc{ zMbDIpW6VEu*~&J{7#f(y%ToF=^%F|=hXaDfo791KTnYZ2Hj_8ln6~!F-%l*rG6E?c zMH*e>sfWXV+W-+&zVR#*g&`OTOC*wt%9p+oI30P|iIL@QD_ZX<2$WdTkK)-qtwIKg zj`(>k6B5sZSFF%*&o!X5AwI^+wIXHdY`KD4mz_U6Mwdtd)Mh%Io9#%XbWl zff?*6ekMHC+wXA~qj(Ci2U)88Ls-}+7F}Yh`GiYjISX#+FbLWw)Ow|8l$ z9;BnGLl({Nq6t*#Ez^46Ogm|ceM|$)j`t>srH+Eycy-%tmH#2}{UZBmhL(TWz#m}Q z^&8}L;6-Av-!^r*vJqgjbfKkt`s&w_N;<#Hd*nz189(4ZOJWXtunT|iRmn-F`c4x% z@QriTOZL%~?5rO(==#Bfc`y$qJK50$tE^rxHX>CpCx=-Oy?H zKUOC(x2W}p;@j^ciA{fMhk>MBpSSK_XvRrp!WQE8Q;r5#P`v}^LDT>+*aMgqJ-L-C zS$6`OkJK%cC zu{TlK3K@36)YfKf!uX{COMTB<`8aZ2KqL)ZD~0uk2L z{6|Ddo(?rXyIf`=rgfNg7Uf5Ay65QG#~20x(ZPLaWowzs!MI<6;tBOB=EgNv$&>zN zz!|GVj*Tb-{u+g?Z{;K*q5WCVV%HCsR@p`F$|DP8H{R2aB6A_Hq3NH^ za*Q~IiI(ER6h+F32YdKxe?rqBBj)G>!~BH~BcOg_mHZ1 z)tHBvD4MY(^B6aKj+s9=b9{Wb_W3RWB8=-yxIqTaE!m+20bW)+xg&S=E9QV} zt}Hvtq5P^S9{aC;!B&lyr}a-j&D9Dw(zFhst{mmLWQovXB1`G83RvF8_{!+LvRuD5 zL-0yca)r4{8=Ft^GAW@L_3$m4Ch={4;6~t34$mh7!q06V(ze)P#L}qmXk3Gtz5?wd zZ|rG*2vROTe2zEgBufP`9RZZ5S=t1?@^eYV5$=yOlO_?M$02sw|% zX8_Q)5Q~Qz0|ei#X*~8rfS9v$rKp+p0mb1b?s78*HYnL79Z$hoJzK@@I3t1}n8Wvp zbNI+>-dxnfR^wGfT<}CV*!F}9QH};t|K*6k-EZujN5H2NXGa~Nby^MWpdBGubk3)N zV^P5UU)yJ`mTtaWL&>#gN*r*OOf^69K-t73^6e#;!|KSn-Jzk1$M6%0G6SL~CpGd9 z2CDLp#7P6o+q-YA!E#2$<&Js2)6cT3ZNd}hmxtl^q(%5V7W`24MV`}BfOtjnNeN1w zkC**ar5!M9EYeCVeGm$~4`UoK~N`nVZ~y=8Bk`acTmIECwm&Mjd^vt6DG z3=+q>BBzO|AmN+^dC{{gAOi5nh`7Ou_f>Mt3e{~Kn*nv?LC954hJ*{g>)Zt9;BJfi z1ZvMst)6p11I+Fk~>X6$_%P z98D&fkHmjJ@Gs$VHJ8I~+yyyaz~aY@AhauaVdW|TI@f03zD~Z+*W`l{4&nFJT?CHF zl|oEuX5jZ&xG2gG`Ywadck42bk`{FeQa}>ttimJb=W56F@uAp(;Y?Tz({5 zQfTxE~pCo!g!O2VQqMe=yUJ5Z0Zr#sFUl4eX-VU2F zh{tuBm6KPs!0LZb;MYkKR6k%sfrL1703zi7BnU9!{q?wk6sK9T@zBHf@QIemij>nH zo>v?p=me=OGu`D_+b_zl+|Q)nuIZ_4|CRqVOD-90jz@Q~V~0=)Fr+&Hn#C_QOSUcg z9)1m)C93pCv?0?$&ycM_I;;?i)HoK>5J>v}B<_i%_lWb{5jTX~JSw@4ls^~lK0VA2 z?kCzQ_8ah&ay!`omo0*8^Ml=zS7JgKyX&-Zt(2a9Ggd9z9f5%DHz9A;%uTkh6}L&W zkO5Ex-0(!Ay|5j(C=01pEg;XlXyE9`k_RZu8NU#g@xnf9vXwfJ6W855N7h{FYM1|d z^|`ecYCPJ`>)f5m6E~T|oWYm--|1(&Q8x+`hA6Y{r+nvX0InvYuM(%Jq}Fb8AJNPU ziVO$5$HKyWonz;w#s7bsqCk|lGUitEKCb4yBYssJ3S?de$V_15f$m=t)J>Y3MS-q= z_Vn<*X+K84NeWfwiz4LBhMW3F0ESZgV`3KtKxqg zJSAK1U8&)rV6T-aVb!u_=RmSMEHr~dL7iD?KE5^86f`_DYMyxqJt?O5N_D~hJxMdu z?LR_vwE5bslZH9oHR!Er+GsFHw);&OdVcP-6{dXUwN$JbqI4;4862b(AM2{@x|;Q` z);0!$vklfJ-f#rfp*5Z4m%;&%TMcgpH!2bcMUyK9cG>?7l2g7zJGh&oxu0=?l|n7G zzwK;!-Tv5!+bqJs1i~mtOK4SKBPGW7l7BQ)*8>=Eg-b=!_*i5)?7_&JnOA1zNOC}= z1!vPk7n=h2@f;|SvlMVK)lw%l0ZeA!H%>VKNaSsG-Y_@oepLQPB&~7h>j10xkE}CSZ-4OTtVFPSO6xh!b;!#xD@%($W%$DF>PUs*p{E1T>@1Ra zrJD*eshL$|?aU3xImNGjix!?x`~3cM&L{r2U*I>gJHMtG;-{Qcj*y5P3)sx1ffdZ2 zxsGfC`FXNL)PbKe5~Yq^@9D%owgv)=j_o6&b0wj0ZNL z$rlnm1?0E^k92BwlA8j`n(;J#qSj@DSBL`$A@ZITVFX{{V3YOVh*)gFhg(Dus^1Ab zNaLgvyCA{{DKzioK_Leiu_*-UdjmaG=rNU_U&uH@y{W#b90rbiBFH#T8`lW^k>IY5 z>a!+ySY|z4>H>d)9I?l%h`WdjYa($fAeL7Jy7hsJDM_|M;KGXNAKKXzjNYmf|DT=y z5=q-oW{c!rJ4?hFd*dIK%&g=TeDx(}fUov0QWtC4VbetU$@CqyzY1X(1fL3HV{eRc z_Tx8=M+xI)gO9I47qyIuB$G_eVq=W7*&_*f=NNRK72^=Z&x-&}EDEI#71z_&qH*2d zpx-~cD^r_ZnQQUQ%rbKbX<_noNWG*6e@Qq-2+#6=)}jXoL5XO7p= z40ANH02=Ti-2^dTpqLSP$mW+KygnW%7dU;B8P$p%{{8723~(8IDSe8FI^ai`Uv%w} z%!O^XJM!zRQ(bV+rmnb zjulnS0Z@k+WbRLX!D^z-q3)(>hkep^!#s2TweOLA%;A|Y^l?nK&2^^;7#P~jk;Eui zuz%3-OdDiJ^?~!JKuvscSv2B0iu`n`^c4+ujcT$&6NnNqllX2E3-WuOEU!^p1Q}_h zFB~;E_?|_V-fG`$4>yp05<_L3(5{Yds7ZKLoUuqNR6!EALKe2fKlRYCWh=T-p6?OJ=|hG$s0~%xEHG zIRrll}Yk>{NPuso1N~8@#C7 zlb>>+$UHWE>tBM3Yv7}GI?yTFD6(56*~YcMm6Et8Y$;EN2n!X_byVM6dKi)SX;4v( zJ~;`;_D9ybs?Q;)<=vc?Vp{W~xcUz&LDjzO?mHt!LnXmEDk+IkJ`!;hcgv5wAI^Lm z`b5TaS?~bRS_d82(A*oOnFCWPI9CAY^g8#lp8Y2IC9)yUG5X?((VF&LXl~~}E+x`5 zMWPgytcrqk$4&&IzW8F@w79!pgshY@XU@k<|8Koo)L9~(v8?XA+XnOge>;F?@(%FU z!M1MDHg@!V;OtRccv=a{6Q(^_TkwN^#6mf%i8l){VikG*2qe ziBK)_K=3^uzCXkR33Gj5c^M8MjDm-?v9U%P^#ivA!CIGeg9Ph#wC4^Fx~N$$ktdv7 zyFw%U9MX_=gtS`M7WW&2_b*c16qJp;xk~YA(c#;1kB;=pF-aLZl?l2rj}7cdK;UFBe`C@SdZ&-bbiKpYn6F zpr}GHDT=PY6~5OIK-InR(3M5A z(y)!CAaKbZ;J}vLI*&!EQ8qy!@d^72&ggg_7A=aDBYTNN(hu8AdQ9I_8skFIqR5+-q9)V z1>vzf*|_^N4tS_7Hf@Dew#f1VMV^9jfyxl*VXSe|vGaSX{#75^dmQ~o=23#A8jgj?3#Q`0gg1;L%=h&g*TM?dj~k{;f^?qlK=UEX9wg7blC5m zL|dOhD|35H0ISO4)2hW)Au-DYUe6M28jD3aKI`APMoyb`?}^$lBt6AhK!h;@O4)Oo z=&^+3JV9V1rG2QhV?Ba|2-!GZ+Dhk)AyXXFRKPh}@EiR!`^I=Cjdq>4$fC5E7Xn(_ zEgSRlpBNk-u@^!QE(6HVdxYrYQ$}pCd(MfU0Kgx4nj>c-ZUVHiU<}Z~xGG7L4uW`W zp^3c_Ap|+H^~4$Dd7TIU)pm^sj3)F@1`eSv+adP}g%KHb zY4C`gj&m}O9sQ~Rez=;=Fe!@BO!7F4p65$Pk>tdVjEq9xF-!S$P|GMgWNuYMmz>cZf#&tF8AmVe#NeP%=Gtb3wZ# zA`fPYvVvu44xaS6Bc6{9#GGZN;hcss<7?CLV~i2Om7RM3;xq06+d9B`ILk&wtHJp@ zL((I@WFCMU*%+nYBvegVRw(ie*H^PnZS~lQWk97AZmzD-v@O<~4OW}YSqnuUCL0&J zOMStIvXT9NKXl7F5~91zC@n7fkpX@QQma1?eUjo?`d|U_oo5+tuC7qz`B@7$mCP*G zWrfvhjrE4~(a!BPkpwE%m7`^Gtg6x1Y&ZmvV)Z~y^C9b-N6gd>sR zNB0gyjP(#eBp)SrF*N(BWSAF(zA77wP4ne+s$w&H1o`~Y5Q0Gp$}U2sX51w@52r)J z3dd`tLnSQQ-O$c<$e?HU`&*<9fUN@SNV1#r9#u`s$9bNi$TOtLX?SP+Z%LA10)TOj zHu!X(OKgjaX5VwjHD}0K$T> z^>iXqT-Zcs#6G_+Bsgc-G~{&nWe3AfnlScTY+Lf!O~K4;Ufyu~SECV66@;rx35-`ru)b&{cgZm5lCA^V+x%qgE zE<-zX9cKoQAtK+{(f8@-y91tcpZlIFS(Z^xD$9rjIwJT+?Fel%J|1ns7-gmvI^#!{0-g$5L7=iNWWiPk?!C0gUL zZVVdzjGd^#apFm2hwGq&mll|VZDo-Z4t&6nhM1}hf_c~jhhU6@u>)L;3v0)WF^FD+ z-8y%)Hxh^Q9#-o>)bg;#AxRX{9{jfE{9t_f-I% zG9o%^410QLj^bQI$HG{?8*Q!?<|IiHWLZXkf^tCo@5knv2TicLZL!%@DC-*QO^K#y zyK@|K9Wl#Gl5LaxDZP%v*E?=rznI7Nk#VY`;k*BN{5jV9hoN7I5b9NJ@K73D<)o=K z%>)|lphxsqBeF_~Xo285UB8`63!o_#bpN)VA&u)4Mbpiu^b1XH%9g?ya%eKK~hMlJRq-n-xUma zIRO?GLsLG6J}^c|6@n=~?~BJ70}t}(+8CG-J7oqcLpkR<#_=T2aW$JDO_P&ItGIYY zrm?ja>-Bmkh>RJ1GGAO=FDZ+}KxB*|!APaTykGvH^&95r_Ge| zW|&SUJI5X;bK}rzjfdq5xAzaw#&$2nIfTI2D1VM#$5Y3b_*KS8w&c*1Y*jf955cHG z&jTQ7hd_w1VfR6k@4$6w>+!JBxG5y&g~UyvNUfu`r-LRV65);xmLL2Wq+n2z!@9$t z1C9g`7AB=Nw3tZ_D9Jjt$o|lQXu_C4BB{f#&3OJsgw%RZEY2^VeViD9Y05p|EC73+ zHrCK^p5Sxe-f(ZJZPI-NFR9RK9&LYoJWLb*r z2ybNn?1d2IE0LyXng&hNoCTBJ40rgOm{I4}4ui;n(x#*1w@+AbvKm6Mk+hDN& zJ4!H2Gl82)f_YBDiQPPVbRHoO8-sN)n;QHbPeP50z;C;mDtunISl8y{)iF^2BO)UAaM6^Nn7;-n|KwjS0~O)L={^?<8|w&WGUfUem-`ra^Lnh8uZ0b_}X z)1DE04&3jp1o6Ra_B5J=F$OM3?)_j9@XQlaf_4Fi&-%+|UeP>?^~xk;q)_5;&Ud_# zrq#dmmlx10`#WeONvec{G5d&kqRqC{MH$HW`y@Cc@kGT@wl;_-j#ql^4<#6`3x!N^ z80R|++bD<94<=L(j9LcAA+DTn1Jb3$#yG~{#Gmr;pVMGxj6sIKN0ZdpZf^u&$kL?y z(@EJJISl6kZ1PM$@*P6w%2FNZ0G&kWxXZ z?eZ~J@|`wr!~cD&HFo|SdryJmyB7@e{0U_&-!E4&a7BI}r?55=!V7FaDj1pZeSMSS z%{)P>II7lSS-Y-z?Zdkw1w*E2BTW?<4td|;cCB}OjR0yHY+8r1vACHkOcL@HsgG4| zLZ2g595Muu#<;<`7C{-9v1oaFn6!B!fRH$tbsmBRt*e30ZA)0JJHg{T(J;}B%&Lln z&>EY@qSnK1f~Q6zIbKX8e)}fJRW4C$kIzASe^nXO#=*J1|8Ur8_R`3M=gC>u&v4cO z>>09=FEFAqK(}y=n8er{5uEQ>u^zj^euH$q*`TZ{Oo|)~Qz$9H#c9701|WsN3<@{-6$I@HOc=mt)xsncS%SA$DH6%4w6!mu=!qP?tSznzg(4Lw5^+3$(4`TGhch(VqwRS+ z^+zJ9m+d`*xBC$i@v&d?pdN^I9*JN`qOQ|kbTE#z?c( zUql|{oZ-b(;difd+)N|@hCK23{#AzeFEXqugS&N$`;7?*FCWCt7`P-KV{b|7;M5)9 zf`fDaw;4oy&~EDSC&Xy%KJR2EqCEDPvR2$(R}~?M5~VPkPH1;}YS$M2WZ-xOg#rRA z7_4ETL9Ul$%Ub&mi03SD{hmNl{_JWjtKDa(4LuX*JtnC@kqX>x^vQG0lzJ&nZ>IYP&9U>W%eC!;g>Yg9yej&m>YMP&O71r9r5QoHcF=iTBqe z-CnlD*le}KRUvUbk+_*i%rk*Eb0R3NYfG{wb%S-wU_C8W4zA;C9KH*HOgNMSoU_AE z>xo9*ml_eS>w1=^P>Sxw2yLqV;%lvij+w}aCVQ-_H!aoEiz0(mqwHqDz>t7Jf*}Qi z0K*y<1|DW)AnC(ZFC`%M&6zIoWABg1B)^21=s+)K;W%D7fr;Zt!6CZE@l>-k5)ut` ztFc_Iv0SgwH0Sg>qO^zX2!V`^7fqzO+y)NnYm5^Xeai3$-aYRJ)m*;YtL<%c;WGHyJ!A^H`J`uV)I^g~F<~_^@cOsx69y zw5{G;C8%4{xB9%&fG2BnrtnisS^tv4nnJXq>>|3lx-eU;})DDRV1Wn9eLvn zeOd`>S9lM!7iS;{Y;;S|GR_IsHS_>@P!B{~2PJu6q#x&kFh;1Zd7&UUL#3mG*Z3Yo zEP=hdPVjn`z&ekg?i>7cU!yS&)3wBlsl;`mFwG<;sl-*G&<6Ly&ufl9-M84Z9u6Ly z1sB1nV|D08NCqJN6Iv#u&kKo2Ers*4UIK+TgAKG+}h%(xvX7DE3W59rSpTn-$^T90OJ zV9js<5sE=2?4-_DENOGmGnUd@uEZ>tcr{BRUSd#V_j z0~Ccskn#wytw0@`)8kvjz??SW0Er+5-g{J4jfaOtSJE6igb+|l?vw)0;q2%x1K!mhi-Blp4O{9)bp-bq*gE4c=X+f$u?vc=5bELNmRwm?Q$3;!uL2N8@=kA4+hflEYe$x*Y~9 zP@ja702czyF-MJ)Fkb6DYHeXH`E*F}_>uOWT;A%|;id>BEY1!>U#a26G0!EW07c`< zoTV(u8Hq1``y#_66}Vk%{ONOzs@+{?oDWWg+TnJs@xyJ6JQ0}Z5{U$&{dk`V$|Zwm zfYXOxoTCJ~;7Z88K)E+AQUFF_@8fw|=iu75+q-B3O_$I6!bN<4C1=AtTbLs6sEa^5`1eb?kS@x8wWcj z-iG9d+m4(uB$6Rf9NJQEV+bP5IekusV5IGFle&{dYUe3cvK~m4AX)c;2yHEW&U@c= z@sAM#Q$+zp1nsMJeSCkpD+Ay|?NDKs%g!tKq11yx$a_FLDzi1(VbfTwDgz;a(%9h% zVvLxC_Q?4h81>pfBpj0$>hVqsL1WD0h}!Gnqj%oo;R$9@HsZv6j0;=$VxJ)k()C8d zXPt8a&Grn7@d?rw1CWD5LSX`dWoWXua2RVIu%8(`^}PGGt`WgCw#>JG*#!g&2+SaH zR$Q|LSri$?`nGpAcmr2BXe{WMpM^ZB=id z+3s`pWgq8@&8M8*>C;u28N{hkP-P;r4_6chGXr2Sb8`=mtdTrHG8|B-imJ+$d+(pL zj?HFItH-)Nr&YV)d$ZKv3%Al`C`K>gy|@3oJGaD&ZFLCZ8rVd6-qwo@Nr!6c7Vi$} znp-#=rf98L#C~w&Jky2au$NFIQdU~cFuJu_h~A=CsFc6c81Ep(iBTA(ShQ{h1$OhU z7%jwZ(Ijj)mbtpIlOti>iq=(X^|ci6t)n{6(!V3Knk>;w%Js+8ie(l6o%i|OhpxkM zE&WJVCYrwCeymHde2)g4YhzL==D2Vr38@?9wFJ=RE}oh@U6Y0 z%VRY3Ges{6G=4?SU?tVxwy=i~1Tq*T%~dfF>@yrq?2W+v+0Ikh%67+UqRMa=Ja&~1>CQj_Jv1kz46*cr zp+Msa+e=oFko1&`X=n7b+T`Aq*U>cXirLjRRakZ7dk^guUHghW(*D?sk<@3Ub$Uf- zYeV_RYO#y;u}85Ahz~&+=jzsX_Hyw%f3crQKe%?hy{PzbRa3RHS+lyc6~8`aKr$F9 zQC_R(-o5zPK##rY+6C%$7PU&wKTBk5wy3Z9Dx0Q!#{eQck37*!$@X@&si|a9E@J@6 z6F~)R8rEp~siB`qU2wLBy07BJq*iz$c@p8l@gY0f6V%nLbi(y0cVEm@{F@-J)cR*C zV!-b~qHY}C2V5<-nJUT_C?GZPe5e?giuYIH4pZJ3(ZiCI-faye%YO^czK^CI5f zkw2tIaASA+8380Ha7NSQ8oltS)^levy3elMg8_yVO%KPImPzD}e2sD2le{d;W%*~< z;L(8vdKeC{ya*XtELXL=K53s*AH01ir7*@msJtfu;5q~A0>Jh;xDMc}`eC~UDk-gr zY|4XpIw1y+*5m6h_@u;#bXDJK?R?+<{|XKVV!1tv8|q~d>W1&f52TqwWrnISPZ&6Nd-gkY-?fI|%-2{8*A^(?7XcrTy*{y0Z#czaPjB8WV4$x(tN zbKBnH5O-^hIHLut&}rAR2={O;AFc%yLLkKc#LnM~T#pb@RyMNIpN5USt(OC67#&#- zjuc_qa&_sLjeSJLY(KI_2#C)}De+8bxuRVLk*5qKt7^HAk!=qMAmA_rAC@?ol z5nI0>MAS3yDgOL#8PmivpJ?1vMPlKG@qkIVzyA=T=ZV|UB;P!){YIom@|dyQT<#)o z5uz($<8krb!?V4K@)?i1AR~#WB~R_Vl<6~r)rxA%Ifo#b#^t<~5|dWUqaIe(czSUi z?PwCWOJc1Tpi?Kty6NJqQ52b8ve@g}8A#l~7imOud1>h1w*>4IKmO&=siIcKj1`tK$b&N7zALbN^UY4io)<+(| z0@PQ?M7mSV3(d1bP38?}pIYAjy=Fe~O9wQyp`_JKZx6HVjVPcbP~mY%N$k-`uod=n zx8vSbziM^%HBbc2C}{RE5fGs6=bCoAO%1)Frav?sJ~RCJ-!lF-)A09zp9ajirRT8Ukx?{NbFJR1 z5G?XAH{^+8Tz2A#GP~9&PKGJ34>IyZ^I=@^+j&K5^-^`Rmq|0JY(1ybnpx?j%vD%^ zILfIS&(&hRisjm;;*oEkF^VkHvZHEP8nbNt8MwB!?R1~N@QeSL(MB8Chbr7Yc6cAi z3(eusk`D|a!1;%U>DW_O+Z%Yml3>`6y^#{n88x#V%0gS`p>0_#7B>)9J8Nta>&XGK zpg8n~LvP7rlU#zwJ=qzMq>915;n|ynmp>#NzqIrQieLU3HWJ33dMKr6+a_{5u6uG{ zygf^?VptoK5Rxwqdp6`6#2GTNaU_zOK5WZk@=w=}E1MJ!H*f(L^ZlU3Fcp zpqEL;Q@4RCmaw)>;Z6a>d8k`Q-MA&w+~~U{jt~N~s*Q|v(OsFA*Xq40Mz|t1xB%lQ zN!-;82btxEu-ts6|gY>0PSfP1}! z*M})q!^KPp(T^Rey#_T+I=hTplcVAWK8v5LW1r+nN?3ugWKoWKkx;0iSq-XDx@1v{ ze0pj$y;NXh-Nb4G!$PFn>sI<2;t?(o;r+g4kXy#3(DtoSJRhZ`R&z0HsN2BvQHl<- z@b49dm-`uSFDuR_HKW3CG)y?3HB77BnslE>dAm-3uLb#7F18l_I6tUx$jKHZ=;Uv<9j~bEl>)QOp)dar7T**_}p=E+A^PZP3z5v>HesPCM98j z<(!6DWU=pZm%H9i$4z)h;OJyXj-6rT4JnE=sO6vESF%D$*74%|gy-KS9KW(0JhRy3 zdY=&zz3eU7{5-)gDCe0P+y-%B`)-XODThmGcjGFuvH6-4IyI=c+5B}*w% zL*oMT+ObQUYd5t!B&C_vj)Q(e7PF95Gj|myq4VG9rQ*P)m&&}7IqVmfG|@~JZB&z# z?`Kh7#2UrrTnIPM_EHA9<>R>G{bfyJ6-Pr!3CqTlS;g@%<$TsKuSF=aQ>L^V8u;t3 z&2$90H6P#Q2;C0ZCfCQ&`o1s6GEwvle@IjE-YbgN^VooNA4#y2i{B*PCjKH4K#C$q z?MTUAE{+QFp62;?38O@-*L zSXodEf~My+hu+c)yX#kV&rjahJbRt+{XeH1zqF*e7NADk&Fc;){)Zp;m-b{X)RN#D zf+DqnK>~@nyHQXI+Qw7IszegYRW|~M5^bvup!s{xYxUf`m+Hzd=OxA{4*HfKjtdfF zIGfhYBf)UBcVV@nNHzQYgjf3+!@@8vTYfvQxSX|XdlvEA9d2N4rl=6)Y@TS@;5SZ6 zVXHDM$nWQgAu-}vvZ!}ceAp>~2uwFHucRiHMLx*v)-FFFD1@@{9P|~#!Y=)Hm5TBu zJu7U;Mlu>Ng+o%S=|`#OMeQ+K6fJ!Se7LH)m^HjP%+U(Yrwymmno(}~{y3+fN>hDO zIfg|NC0FhbAPP|g)>hL7eFxg6kkmEo(3D@QmnQO-8?8jn5X@KF2d>NrOh{UOQ|)VrHIZivGxO^3w9tzhyD&kh17El9Yb&v5OW~*Cg(w z=sU=}j|i(yPULO`k+NXDaHNSM>B@mzFStsB?zBK2eD1e+_K~c2I%)7e@TZf4$U8PN&DLX=wPwMdazrSO4e{n9x(iOz*>m+MMwlyG);14yTf|dp?UdZ!r^nn zhhJOX{{jdTC{0Q)~<#e}Kp0Q6p?v0B?^~nf_hpA_OU)XQ?9G&$WH<=wQ67Lm}Ld^I1#l z=S(ZltAmW^dkN2m$bU35_o>SsCai#aXxEs_iSDhEdsY4g!uNSwN~_VOO{9* zU{f!~8by&vU@o6JfOM0wXrz8tq!I|$X<~UVkh8LO5jAC)ln!g8>7B$9)nw7$nDoHS z5|WSb*u->Bh}Ybaj$)t23-)olXQI-k54-K$I+OX#S^{p{2OmDVoN~>7%57kj1^Q*6 zbl2{UT_z#{WLwSkVGznc^yq5CiNaXJi|-U!t~meLa&>;q8_{}uMxs&l&EdNr#P{S(?&(OG5)A-$Xuigh-E9I(_SC*p}mX|-I96qz8nPknu|KDwn zbweqQH6{Xh9{624Yue94=dBytHVv&0T+JP=TQDhGMulZq2#;;`aj9FOG+ZrOuI8=u zD%x;w&(COCFMNm%_>~MyDagA9dVodjf85^h1peKZgY(oVFoNF~5@HoW)U^iJY9F;KfF<~?k<@gB%cU@!Ib6HVo~$--Z{ zzge25S^J_q28aKL9+5}~Pz*F_p3>hl^xikT|G8l?7rg&A$ZrS{=dKicR+EK*Re_lg zOkALez>IZyQ}<3L3Q}NC!-;|CT9JFj7)8tWMc+q{nIu!>h2rFO!cYH}arDAc^mT;G ze%-Lq=}YZu6!m$(^?2xS_YP>?d38KoIim9(5AdWA`c1uu<#i+3!MKzj?L}(n=SJLJ zS3Xy_foat;udg$Ndz4|8)CaAgiKc#G<&RAyerHBW)hAYlZV#;#xz+SDyCe`c?GpzO zk!+VP{(dhZPYk)$%=}$l`9vKo?$0CqMs~$LA5FLxC7b^xY>p zgg}xcq^YAUYn*FY_q5;FNU!_B3s`}a)2k%oN@uZ&{fMAV^&UGRQdLy~I_o>>k~EH8gZc=e|g zr6P>^(cUwUAD!c%F<) zT*u{Nn`Vmd{wd?+wdcbx4Zr?-MP2%Pg2?r?nHWeC1?Mhs75@s{+%4w{UK{u+Q51kx zJ2uJV&>9Y(S>F65<@ja7@IaI0df7DoePjKXy~EPzeoA8MV{lSmZiH}c&+xT}R?_&^ zDr#~0ZYE?{E$eR*J#cxAkR&_#)yWOkZ14zVHPZrYrPOWB;S+QBX^?R)k zENaKRYAF)U@gR-0I?;U*k*=HKiLIA3@7-n1>%)xaqm(1vGp~bt(#Q$EyCW^i_y!Z~XTrs_LoW5(Bj^!CJ_lPqZ1tX&=bYM>h6rO328hZk~ zv2dUj2O9PiJ0q-C#SdTnknsIqGM;^xkYoxQ-#Y(TG2^cU=k1;W5k7oa$@Cg#`*co_ z-)dI9rrr6O*U3s>bi;>KmpKS4$(AFJJbHn)|8AYNLsS-fLI4FWu z>>I^TRxwo92*Ga6-&BPUK@e0~ELR=Bw7mQ=;pnBM=!u=^qXWl7=KVA0e%0hj{<+)t zR$=K+m34H`U27k&jPN;UvF$oK7Wz{KH>1^3K(T7Wa_H{0&RnVs0E0s6Yj*>J7{gCW$Fn^tI|X1`3jDTN zbAny7>2ltn&g8dV9%TIKS;3-qBIh1hGS~MC%i+K>$SkvH!1C*PdB;~|>&;R^V7yPU zqeG;I4VlRAHFj;JuYP7VE4lC3t3kv(%2Paim4<)E($)rs`-WG4O6d(Xm#31AG_{YA z;Pv0{+7AYJZZ$_Jj8*I1I@}~Yen+#dh zd{n-DV6%DUzCToQ{qwSpZRe>-5=)-vk4wjwM|s?rw2la_HD??`*ctVC|NMz=)vJR{ zY`SMHZ_mrMJP?tK*W}T={02NXMEUkesGgLLS+!oJ+bFg4RBxPL_K%-D1L-ELjU0~J z1&Ty|cvjsa?I~i@rls|eMP~A%cFbyN&}=)wtGN(x>elo6Fk`=$V6^P`j|K?`ed&id z7x*}-d3#Zb{P7OjEvq-nXu&?CWOWgd^>FKR>e_qOeLHFNvc&WNTiWh(yBhg)!+XDs zo)7gKajwOfhkKknZcZd4=?yeRKjrY5CrRPsZ!NQlzZWRc%}Ao4uLW%d_p{06Sp;q2 z=!N0s4++n|PuM@PXv4L5=9VEqD77=+Xxr%ABBfWfJ7TF*WPVKF?6JY4^Ay?kOlqx2 zl7u`1q4(7Wvd$p{Zf1*YuEb!76ES*Tup| zxQUM%S-bjI3qi~;vyjIGlI5KHfJtIX5H^2SDal5PzUI}BDWgNn*~gZ%cMZOFVl1?! zq@|Fb*o7P7o!E)?hnj<9!(aZloTC?l5Hlvicemb)7=Y@4YaAxk_nK<4=G+3;WhZtH z08s`bTrc9c7xK=1aNF@7(*8HL#vJi_+oeOUdM z`*9rvL~8xhMC497U-X;56Y!BaKFkeT!Mwh!_M0U!fN0_6tqmY3ibTlX-d}sTKO`7F zIDmizkXhw8=q2nG!t=Q8Y3{w0yShNrMDGu`!-K6NvvN{8X0<$EMWQi1%g1re`Lva$ zP}JR8-t-3yt%O7<^2r^Goz4A@NK#Zm;qlPbJvTkHD~sL|Q}=+4lTsS34dAzyfL2RH z56MQlf9~Q(y}YNZkfB>;v2Eja8B1#wg+_KZTC~+0ck2>xPj;j@gR=Z055CM3Bgxciya-9lAQ8m6Z; zZRyy5Q;_!U*2LjfS8Exh-HHI@E{nkJ1$!XQsr$`)@Bfw(Q2-JR zg@vA#jluelZaF`F^PNy8@=c7|nt6cel&urgRtl`T?yb5IaBh32Gz94bzq_c>nx*Zm zm^_I*QxbU}dxhnopDYciR@Yx^MD@I%X_{6x@^>5vgKV+}xgm=%-)XrU{b6-HDu66% z!7>Z1R@8Z~*67cK7%jWT&V$*bad#x1>>?L1EghHhhB`LNACoqAikw;Wcdy$(-FSK7 zw=kN!HBYeu$8p=1nui6A>+=(z@;uLO*r(q2orjdPx*=LZy9W`7fu!5*KJdC^kx~To zs&>ux@3n#Qs^RkOg8DFHFXUuHQTbIJ`)@7bGTwz4NYYF(In>Nf6^qN7rhL2!t~SE! z7z|Qg{+FDSA9J!o;oE>~?yFbHqT?EmZv&UVm0bKhm-5?DO473uWbe!J=&}PJEB+?uExYPq*>xi+y%U}Dx`^}T@u zWMk8I>&D7Z3W~(AR~WIG)glivUbJ^gP3x|wYW>m@x1U*hxuKt$sA;81jUutvz8$mb zCUZPbG=tdxxR}dk+pXbsbmF$zZE@QNyb_NJAdM3_k*f9d^G^NtroF2I5~~^HLi$UM zVy`fK7(bjv`XxHmMhk>jBMi=_4TM&-m$YT;1EjQ+q=Jt1?KWbZA8?wAYv%L1VXdLp zD}caaQ7voJ_eq>QrlhsX7ukJB_&D6z@^?bO>p%!*C!zIDFm7?#&{m#&&(c3kDfSbT zzLv9D|Cu0w~^6}m~C)J$~R}EM5n~D`h z3^s6$dc9pl?>KP7!eEW2Y@=B20~+Y?$N&<8WFh0SmHe&q zH-E?r?BlNKMbB|jD&}tej~JsVih?vvD9f6%ENNSr<6TNx4+$jKChHpx-{j;&!}Ppi{IQ~%xh1a$ZpEV5 zoYzJ%dX{ncUC!uvMn1G8x$IW&Rg#SYnf1ca%pH?YC0D;Ls28y(vvb{9Em2afb7;b& zvhdaW@Q{thW3rCbKFTiWKWhzHmXc*Dd&2=~nnbykEq$1Hf7g|iLkP=~?I8I7?7goo)2&~ZD^doq5BsCOFyLNqm+Z5rI(5o z#-jFI&D$k?qH073&__h-ycX-(>l2W&)G#+V-|;%`u9Y2ts7MV}BY>yIJzS^yQ2_*` zR(CaPI36Snazj764j=?+;*5G0YviTZ5iZtC1@`-pTATBM)_2(FXi~M~&`QWQ9V5P% znq?sASeko<-LNK5Tw>qm|N|ziNgo+kDk|>p;!0gg}Oi!pshXrvL^UIHn8NQ zgkn#!k+3Bb39*5m4J>KjlJ%w0I6Z4tOXzN&d1(nM6Io9r4^~6NX+sa17cA-$jq{A z-uZi&$QD2BC!7ou_WKC|nAMKy!f`QgnN^ZS)NP<~9_PEjf6YbfM%P@=6D`Lm9qlax zsSd@}$()QAEt9f+$P#w_dk_B#OPKC>A>@={ZWtAYvk6Np$vn~Q_XLVIucMKRRg8K` zY{Kupb8^1pf5Z%A$1e(%-*Pfccs9xy_3Tnjt(&W|@f3;Sc$jiAO<2?ou9X!ecp@Su zY%FPYbyFPI?m|0^09XUBM}Z~;&Sq+(GOX;%Ed72jW+N3*h|n>(c5pC zp4D7^tnjsPje-g&qv;l>1oZ?uM5gaOH)dz;0D_2 z+dzk}9nx2Om>A+Ui~Rw-ETicaIeU9Uiac8$=T2jvYg|f^!zhP5`Mf#YTKW&y!NbLf z(Zw3??^drH7w({$oEL;uw~lqylu^&}`XJ|IFC{UGY1#5|-0*2qGg&xcm*2WBy`lN5 z6-%Y`09?*n=8eOx$-J^eyqUC8%qzFmvwhomQ~*(NlIGE?V;EI;jS*E{(P%LYG9jmY z7}r>%crnTt6_&H9W>)Y1V6{F(7cE6qZxo_IvQ(Uk6_FJw*sS5)ZKD;;(xh zAsztD#byO&`S+fE82qX8j&ugBuhHz%R3^1w2#9;Ke~j~LC(gDR%~Qb`DWyqvtt;!-OO^_m*Ln=VKJj%rSmfGWl3hP9#I>nsN8a zbnkZA-_*FNxpsf>2(c2Nl%iMU^!q)sEFnpftB1dbrEN9(UE_iH%ebd;5|54Ws#%QdycNYb9Eg1J%3u5>E0KWAsE`?K( z4J?C`jI?j0Tol#^lCV-EFZL4hzGaYFP7ZSR52cji+U*fY#VFO3o~CrnPHQfITQI+< zi2|^L#Jm^!M}G9m0k|5ulvp+NWhxco5d4{xxpyK<*bb=y}QY`-yV+-AS#;2&!vpD zS6B{umeWbiurLgBi}NAE$RxMCoVWCI%djvEGP834aY5>bbt``Cnbnvz6bosxE1r*1 zo{v(T5B%-Zf)7^}i^i|#jdcG%s3^(2zG2?&K6hSlfBqv~7#`>E|D8$2nI@ z;TzAQ^3=1I-~;{RjI0YH_YgXL8!$$Z=2F&j?GC-VxG1{DGx=CDepj)$sA+1q6RZ4> zI=XivgpR>}|92!I*Q9Amzh96fc3HAo2Mp=z3|7N1hyTa(z<+rb7!}aQ{=;U_L=c95 z{F{a9wfXu${FT{(`m!Mzn^opXoaVt zxnsxeZ*y2SoJ$g$^!?0GMz!*Fs44}q4ACUqREuyV307l z6wAgusz6Rl$v%|wT+Ulw><5OKT)_FP+3BGJ6&<@Ay)2=K<*`*fbwCge!`yN_NU>V+ z{;J~BxQ;mJ?ZXFXgFz{SlCIeuDCgF(;m^GbqM_v_2R7LTkMtltc&*{pUf{3~S0((< zkBZBMoZqGmtk#C2$Vt<5*=bFw`vNUd%4 z^5w#~!%t~NTRG~PV}99i_SYHpyaoUHJ*01WbkN*~=&C72G)qg!vWz@Wm(R$$%~{u^ z-tQ}(4Fj)+fqy;@^ipW9D}uLvq{}*F^VXCteix_5AcR%#{B_o`WjGIY8~ZW$mFtl5 z(x|Zf>7-y(Sk7k+fBU##T((P+UuwmGFSXKh^#K-*XI6?8?Y1At6VcEz8pfq#QnqWK zUlUQM{kVa@UY{TL9DG&@D+FnNP8N=G;OV7?lf6`$*1&ktvWP^jrj>q4)p~lFVbrsv zmqMYx@AfJrn$JoHdxRzg-DQIYTO0xech}%faDo%u-95NF zi+h0J?sn&^x>Z~IXaCL2o_SCA(|sCtV;Vj#!Ufu2pm`z3OUQH7|Fy5k`L(wRAr*nF z>z%fG>2mlPs!e^q)vL?)f7#l0A9ZV=a$k0;)?(7fSZK>q|IE_6qI|ct*`?*f8@T2j z>4MGB93{2IpsXv#(pl_|nkYDC5YE&0ZJ#!(;PbgSC{G)=chY7xj#tS!&~(*a`!nTD&lSdp>&!XsO3M z=~Bvb=_QQ0Jaa3G*ils8)gS{I)%_URA+)VKYpcM8N@xr%vZSz=s>`v>i!P^T=D*`@ z_~18L+D~vw$SPMkt2&PD1yAoOr7!%?fgRO`QJLS4juus`oB3B(L}0_RxaeW|mt{@U zq1{35oNxDAzmq5w+bbxkr|S3W8(;kHf070C5%PVeGXOp$J)*)vK{!XPOiRc9bWE6E zCwjN7X#4*#=Ss%2&49kPJXZ~RmV6#(7|4s~woU!Sf;BP1wr9#}hFM7~qF5C)M8*q9 z)g2<^(S#%g1?+AJ8=Zcb0Rk3`NQ|{i2rdDb6?0+T`z%<3@awgXy8Cl2 z;*GJ-*K<1dzyLV;R}zZzE`ewW3|0r^1V5n8O1lLpaZiq)#X*udY?hFfByvFT*02m| zBFR6qI(IQ`>WAwRRr`#N^F6WW{T6Q!c?MQj72NIlHkjK8F5B1Cs80kkoARLjn`5S6 zV$cJ~nLH3#9TRiU3f**R+~{j(@(+(|J?IVCq8x_Fcb@#rCMPCbw!5*ZMYW!}&HL8% z#tFCA^)OT7X;^en_vX*NGTnf06E$!$!UNqMsxS7UR*@(r#CyFFHq&i*h3F47(~wxV zZK)`xHBuoPyPDQNvbkeTtv15y%wHI#Pu;XwW|3my0FRhnhu*LKAK`w&B|$#la$+1b(@AA=9uPGDd ztBmj^82{C)RaIt8RF^a*{v!VWlRnCx^{ak&0?K zB9q?Qr;%;?EA9qm@Sh-SDh%dQ^Yj>1)PnXYltg}j&s~3= zemIo=DBZc%>6>gs)T4pcJkPZ9AtqLhR&mbH4dbvbHVlEx?e7AYA_3ZSfu)lq#rM-n z)#73G8#(PbLr zgmf9&bt|}5m1N2&taqGuUZGLozOZsD%ht*ygfQ-|&LXyeID5lcpOkPvb}H7-EAj`5Y8YKw z6!fn+bQG3FxtPl88mb~mqL|Q3oI60}xsrPcL;7<@5ltm?=PS-anig~Y^RXF4?ZuIp zBcJ+bRH64bgUdq>xlZkBK~l{)9bm1YA5$Pn_s&jdT{r4}{8q=;oQ#inTCD7}%AN#6$2F~&WB2s#4)y4#$aw>Q zi$>xFdbV~*JwY>|1)Fb3?9OED7d%&~Ql*I(>-dO7Q*gO^lYDeM`l`TQ4xNZJdRL@< z5~GV#PO8aBNGpVP9%AVy^kwNBe8dBc-jQ+3c7<4;cauMNtyrd4+mah=Bx@(jQpB^_ znV8D+`jIdzh;Nys8NdTnaKBdf%KMReO5|>xP^(CP`?`7y$$$7b!pCBc3b0h{!`Gi2Kg>0tR+b%a3Ayjqz}5LvrD-NO1-uwRO? zddQ%-!viXXTiLgwAyF5NB|XC!k8Z1N%blRizr8c{vggE2gZW)4RwY-Tl6V#4*B^WqA~q%_o<&G%G}j-o zwdTE5LpC?Cv4QL7G%R-J~Edu+64 z#NtGA%3h;KqTw;F7*)4ly1?QIFoZ{%R`r#MT|)*_YEld9`yX|L%JYL3%rrr4H!4do zq$rj42%`Zy(CBAp-7-%U!)G(@`)bEB7|EJi-ZoXzMLre-P6dc`#NZ44rqf(GTv3s^ z2O|&v-+UP!MNzkQChL-xm4AL^Ho3<0);&*Nu^UkSBvdLWbNvwB8A04#hO;Dv8Q9yH z1$834IfHZ_cw)*ZKJplp)N7%zuCfqNZU{2RcOB;wqivrEfFOM{b#%6CzHa>!XeazT zxi0zqfv#PfdJtNe#p43Oqv{9GELS029T9kl22<*Xc-2GmIrIAzDf5(!j!KqpO2F3d zbpA5Wv6DPwH-mfxD&P83J`P5;+F%zV)Os*#A%_Ae`XY) zh0BMN@3RNCnFl_Qnv(U(XVQYTGiZTGh9b>5uQZr^shNB^6d3LKMF=!ZZNBhlgi2!r zex;!pvNF4@3bk2U{*$pmiw+FY;$i~jlmI?fNW?*XsFwVof!#7A3Vyu6XQy*U57jaWPb9aTi6< zkkE!t2u*M>296GY!yQFO^KThzjv#qh*uM(RO=;_;S>fufL1a-H?_}U^-FPcF2%Vpo z@x$5D#ohR||J#a_$R!0->tTpmBvq}W`>=xi@%>)(8c9}gaGl!V>MfiVGpgFRTw9z| zG_gpu1ftJhL^bEJ!@6Bs^2o<2S-0BGYUY5=mRUMgYl`=>>(F9t?rN)US(l$B*G(DD zh$P{jSn$FAU)2wnBIHV>TSjDmcKu(L>lWv95d)CKZCyL1>q~2^=^o*$#0P`EalsCz0%U_?FYJ4IzK=W#scQ zvgV7}rk^h^KCSXt8D4^cK_87AKQ$bdlC8*I8k>O1+nqruZN9w_FJnFSNOf@x9^12N z|CZ106~Z~oGNyB%++b(0ihuSs_=D|DkY!)z3fe4ua&|m>9&1r!FTV+#gFkC;t5~N4 zlaHikAnJ_&{zmqUYwM_vbOPOFI=D*r{xca%Th&zqa@ZA@e-IIV_Hbg1HREnjh#j3?etB!ydlf5v7 zuH1F%cN0>^r%P-0;{~PEPF&a^3bX1|c6#WXBGgpIs9WEB8=>=W{=oNKomm`_D&=Cj zCB5mf>-B6~&yc)gycM7gyt$}dIEnT>{@_kX_8{fUn$Mg%+T*8|kqZl2t0@WLP_<{{ zBKjNJnT;@-tw?CTa3JokHIxV&X9w@gZ~rSf7Lasy#R*k4-D&L&1eIt}W&4s|4SL0^ zV`?^^?N{>RlP)aCg_HUMdIH9Drj79HLw!Vdm+AJLW}J9R3)vefNegno*{36(iVDqN zMB9z?KI|IUdDiA!`3W7&nTjKz;qIB9%OO~ZTYfAFpGG=;vg!AR8Qbt!8O@K*Q_*)$ zBZ5EY8SGTQe2v&%_9Ii?wkOq@q%oEsZu356aFUTKE-SM-N{=xMv#WSp{@N?W`)=@e zN~ppA1E{wM;&i^sx2YR~+fEXBZ9;*&pnm@BTA2^l7#AQZY$5`p*^K^`nitfy$c(*V z=zx=lP;TIYbaG!os$HjGGQz-a(ui?zcc*7f24a>klaDTROIJ>etOtYEPw0Fl78jEhi|%(K zwF^v+=J}?4VrV^ieSVCADQCZkkC(uOfJc9;$EfRV=tIW8L6g9&yYk7&RqW5T>^niK zPWi11m(Ho9ktFBfCe2T=BwlcK^Dr`}*2OokUvT4fd5y6q7sH72+Gv7@_e1bYG?u-p4kB(`i;b~-k#(kWDUCys-n z0m%>p%6vB(RYau_XDxz-(MPoNM`OI#zaP`Ocy8v#j{shZJV4P$38Cy6UUPZaI;P0NZNJ(a!!#e_Y$ zx~NgfC&V2r7W6!4hjdC@Ua4H~a*lO(u%Fz{JLNZ=Wo*bJ)@So%zPgUye2pphb#Ya< zo{B;+s7=FD_H6I;EJ~)BNf%F#vl?4iyBvEA9E<&a85ar56d+0VZ$fCMK$DYR7q8Lq zSbigB5LQHyuqgS!PlcVrF?` zf=(7X8AO^H_w*~`L|zc?W)?x6l%ojZ%gcx(|Gjl%gB|Zu);0R<+>_Pr$Ja1dNo(nJ zhRm=c#F`-g$Eu+T4qWIVUJfl~p|)cMEbpMjj~VqUg*|kb7{FFi=j|9hCFpktEAg$# z+^>P?Z;lIckeSe!yIBg1-!*Bm<|a^6>m)+CIXX}Bqa8OL#HpDB(q5_AL%x)akxcRT z-a7n8#7kb2@cSBL_AyEE?YVzDm-ee-{b)+6{jB&hc*b}F+LDvO`Ftm|C{6*GIZ7ct zEg*XL#mm1RsmSQc$E3$**!C>qWReytX%gDZi%4(3hK3}?0Fu@O+8z>VmFsp`hR>&oPtIcM8GZN~HeX-#_(70~HPft7DPNq0z$@ z(k8H2bH5uJW=&~+J4QnIzx<81L81^?pu*#zMM!MA0|m~+Sl|9g+!%RShZ4eh-YFmvd4KqjQ{^+B4G|S19xbyD)zo-R=8UbCaV{v`4S#tk0#>=L!EFkfN2}Ds%Nj}!LRm=Z@SE)em z?P~PuN$z^RcHg0dJ>6o+%R2qrat$-_Ud!H2D(u{x)kq^)t-~%0pWLWIh{$p(uX3f0 zg8^34`Xc@C^JIFuWs>m`!iaKh6^%^dV4VT(YnU5<6?&Gf7*pe5_pwF6;uK20gp~D9 z_&lQ*OSS6L>f9<%x=wXKZ{^S8;!<{vcNFsc@X?Y1@uN(x4ZznfbhK`J6~_G&$c_SS z)x;IGOO2V+{#8Gw{&0$$0z@CG(Kw0%?L z1b!Nr!Kf7URBqBi+{9Viej7&D%GlMBNIIM}_L5u#3mg_Crcu{Tzb3&+ISBrp(WisI zZsxyDc!fOZs&$eWEE!~1IC1h}Y#ThRs$nn-$v`;LKxLb%5z5DXja;i<9oJ3kYRq~j zWxfN=4jGaorF*WaL>{CJD;qnDlq0yG{>af00&=xEf7d1kROTg2W9{CfAy=JL@qS@C z*m`f6GWSfTU@T0{$JrIPjAd-`dFS`X#=ZC3#J%M%8ulx{hGR(U@CEBo%rAR=B%x+7 zAHAU6KWa;89(L0Z^5YCMf5$oDe}4XFFia|%0rH>fgC4qsz+hQq|LE{KukiXUC+s|v zWJ=7_GGlU!1y!kEp&!1_gE zly}ofW1WGVRO)q#wEp@q6Z9-Hf6hYh7gi?V@s?)hde)C)HQNP{ym-QasMl!TuuqlO zKIw7-PupeYIs$0Lh_v2^SUc_Wd)opT{2B8;9c5`rr?2A=$<_#rd$=JOQDWOc$%{Kt5l&M)CE5V@ zgX~Km-&60#0yA6j)g~r9TymG$XG5dpjtv*v&-Vm^A|5Vs%xcq0hzjMB!mue9%Qbnh zxsAEy70G^K8>*tmKY0pNtJntF2yTY!Z0PIj&%7kpqW?xvfVK>~vF(PADLdI6T>9X( z^|%2l=-?_fV|+w1 zx@|9?^!bi8{D_?(zusc`PDuW})rOOZ_3|+_5FVSwVQ{By1NP<{1`Jo)qgI&?q5$Ya z7G7O;o2g_SIUl!ttiv>{$fB#f;KBj3THGorC&xp;KBN zLX-;J>UgSJF2!~x>sON7H`dEUeZ*10lH*|_@T*ub8WAORIhO_~c;TE-sH;cMB_oUp zH0(?cb7sQ6$`^3(wpX~#TFq3A#@#1T$*d**H-aqY%4)?4a32!ysJ5{g0EC+_sEFs zC4M>9M*d*i334?CmbXHV4T}(C4}!rzDCC-N2q?qkzg^gL2N6(az09C>e@Zc+fw*)X zxgUt<^PPP^!4;l7pni807~pr8oHKuX)Fv5uhO5lYj8JntP_1eE5$XOBPH;naCiLh^Uv8*gyWE{SB zDKu?76U0EkDcz@9e0eO~?tZo4|7tp1|lG43b@Vmn*)$jAM7cn`E zO&&d5N{79?v+q}N&xyxI78OXqh)_+5cDti*S?!AC@l&bvY`pr}yPYi3+BrD(UJWo2 z#qDb2gWUMB)piSP(zIgRP(g!_ZGB_4{rHv!t=g}ig!_-Dmu4JseC!&G6DO+1pY~^| zax~ocR_4{r9fzwfHUi5L1xV2(}9_wY+ z?C~AVv(<=XWoolZjRkZR%`|A?99wMXr&Ye`nJZbX6ENJ#VRvc}zUUGPK%PjjfOEvf za$9%SYqM5oY6sz4fmxKufS7ROv!wy?p_zFXiw7W4@B$CO<#Xhi;X%U;#B1)6knu-Y z#rJ zaw@z~;R;%FSV|py5Vwh)Vr1VE%!25RQ#rVZUvxR085r|_){e&VymxH2e21cc!AB+| zo_sceuvG%?Ey|P(J?UU_iP(mODYMm7u_F+Sk2YpOy`78T3U^cN1Q_dM&k)T>-Y|Yv zS?~>kfrE&3%Hi>M<@^M)hLXLaJB~{aQT=+|<0m#5YXegA7Y{C~=Jcq?z?H^$;kK1O zG3Z)(!`MXR(dmir7iB+N-lo%&zM;C=_b`cm@%Th>-L`CJ*g+J-!?uI}z}jy>o9+Tp6>+ zP(IA5m~v>r`ee&1C_wTvLQbIaJVzcJ9xSJW^Xb*ku{u-(ev;sCq*hq^`@JY&xJKa* z@Z1!*Q_ML(US~c^D{|xJoivFRbL03Df!af<+S9<*89`FkOmKU@n+O-K=T!^yuo+LF zjEs2c+_gR#n9q;({2r;u%R$_%(S-?sDsh#)3A>AR>ARV?eajt2VQ%s?SovT+c&ebRMRO83=y=4JI>0zrt7L8i0hqQgw}e2uJnBRP6AxuMZ;v~E+l zwIzTf4lnd=I026$utj(omjzAB4RN&IiVWreuR!t1yoXl(_%pS`5S?Eyi%U-o{EdF zs<9|6CW>0M;EC>~_V&bA^=Zl-9!A*QXXXRc)pV9}Ve~@$&0thJcPm=_?OU1oJT~8X zlqwBX8a$n>+i(T2E!yZqr{xcO4eqCNDu3jwD!l1GFr!$1%vRKe3o&Em{d_Z!Q_yLq zMjGcVkOkqIte=_cueIbXYNQx5OI>UVXuBFqfUKbO!H&u!C&8eDH%;n* zPUL(0&M&G3k)09>>h`Qc_;X_5kjlJh2%%Re0Qf3Of>YdsKS?sFRRd4lW&tvV9sE|W z7V)NE#y9@x_yY+`-w7AAfSPSW38TZg_@Z8#ZWgV|_t@)RYOkj69-bEe>8I7PH%>vd zXAswz`$vt5h1G;*OKDE`Ue}d*8x*XTn1zB?nsaFrBUy^I=_vZ+o;)m%vpp)dVdkK< zX=PN)JbpqdpoBor2SP}j)^rWk)CzZF|LYs`CrS7z?zV5)$e-FOq}Sc>xU2UYKRB&1 z%d|rze)%<}UfC$ybjF0v$@l%o(|=JPX)hZKBD!W{A%e%Sd4)BpF? z2Ec;80D#+Twpj;;Vu~GIxJh`R?b-Lxd~uf*tJg^#&2??AZ1i2E%I#b6NdsefWtbTU zf%x@5ry*~@^BpOi-1snl^o#{Xd%BqDJwNhXSgtv+Tc@_;oulZpYtc{9 zb<+bbT=Qo4GUu7K@KLdwbH*sNS)r{!I^0eV2x;lwK z*#s+_Jk@?D9Tj(xbD!J_<2HnGkn&t_p_8e6{Wyl#f3-k&Mw)?Q*>XJ#j2ptoq3DYu zl9TcmX&Tua3_n;2XWEVeWtuVD){BSp1kM4wIqH||xYf|IM&D4m*Wq5RQxqvzgTx0^ z?^5kmr2-f?!EoW*2ZoOYZYC72m<#UcPl$m2s(d<;p!P!>y5bXFXkQoC#zAAgo8ZGn z6-o%xl0B=G+~uwDAYhFTB?eNk19A^l`|?1(ao=Sper3AyZm0nsXOU;r^{vc&&_8y4 z>`&ZCLDac3d_u83G_f*Fmbio&blcJD$HGhPS7SSB6}lPHQL}OAr~2=%RqK$a5R)a& z&uCoIWe!X%^03Qq}AGX z`)C^ZeiJvgf5tJt?N(xjTVnN6KmE7F`M=liO|jaJ6D;PYS0$3_ozl@V@7`0VcC$D% z;s-ULB7=*yQmE2REc!o}Q8HD@7rK0>$H=u6;N%I>G)_BBjX5w`VaiyOL003aSMwXi zCZ5=F8LwM}Z-ju1{>8SI6rw=*x~1Ghbr+qU_3D4Yc8U!1krdIv0_yT63rIw7A*u11 z3D4)l6+x~{NMW=|y;(gG!lCn^79!b)dIhzzKEK`>GGooQ@YuF7>6T31Ohsw4d+8zM z!)aag%q57YNUWK7j#eyhn6RG^{nELvUpt0x#TlH4IUl}pm_|Gbi8UEs0>4!N?ZXA0wNWdBZbLtiIOG=DzUnO8Ju4Fai~m#RXt={=%koj zK@yj#S_xGzZu>32ypB>(y>zl5>b(|R1(rH^Q3(TidMPzLsLS$1>K7o%%EE|w|NS3M z-u?Tv?g7&u$OXP^AY-GNf=6>Vzp?#eUZ-zPM#;h#F3$hGGf~^)y!rXiY_L{79X|In zZ|1x0m;a083$3ZL!v9RAv)h z<&A+fpdO)VP|VvncGh9t1uyV%xF)fySd(JtZJ+I6z)vAQT;RNY3}~I$L3&t1J(=Lg z9JvEZH6m0y+LIWD7E6%)lRxCejqjL1oOo6;${K;`;I+)Eypz&!D@ImsdHPb4vmp0u*UcjIUa{^829~V_QKG=<}(`3 zGxTzyJ>~WS=g>=sxtk_CfP+ry&^HcPYv1cCh^JVKgZCK!)T}zMZ41-WAWxx$*b}?a z!R#3u143YA&w_;9aFmW0qAO9=?}oA6kw5O+#HHNt+g-&R!Bs%h!x`JbGTngHz+T7p zsTr;?zesoRMhp|C)Z8S6Eku-J{pXQ8~!?f{l^HLuVnD|KN|20u=5*r598Nl6p21I`&M!5zPTn?qeriT5eQZIjb?V^FvjJ$wpQWq(j{MU9^aPv z`L_T25jZgw(YeAJmt`*R4^56L~!QY3;jmSg$jO#4);jBr;E(=>(;(2fvg9z zu;I{mi12g>O}|_-ju{#t{$6D!fI=7_Cq^z<*R*kN#)E~1?7gVF| z$DvIBG&z2%MxtLh>RsOf%xw!8D=vq^gU+a%_HIMQT120zUu(oSt1Itu^ZmB{eK+bI ziD}}S4*pI|lc}aNzdcNCO`Z6^@zPBE?>(K_0|2BU$t#p+u;jb(*wc_;q~4s}uaNGE zVcZAKt7UX*)NwqI`3I%G0ApS#Y0ZBgWFWyB!`2;6&dcB>E5$YB)l3m0kv}sQ;=kL3 zNfx~4IZ9Dmy5v*obHt!5?B0+(MAdtu->l+J9W_6ybmNelcMi&xB(=^z_aH`47)zjX zv(#&}C6Tq<0xSC<^{V-+{f^G8w}+mP7*4=yfv~;fQr%g~`A5v)M0lu+4n+OaON!s* z3bcWH3M*~-M=xy=v_!_6y(QpLyHhdmqi0bRW0E!6sy3^~8W~M7m4XD-{2WtGqb7}H zAB*yygm$j=63vjTZ@h5z zsqF(AL+1(AY%i6Zc`RWc=RKQ9%;%*D4iD5GKhl}ac%-lTk@w^|zPPE*g1Gy7ulC8lX^Nmg+7E^H z8+V&QQ;!vUHLMa*@V<=ZYR`d1ZRy-VfdmcmP~M%Yw|OUhvK()C@4@>M*&vraniRZE z_a=7vSecmtqTmAjGOWJTzYVWa*bp?l{124~4XP5R>(ZDR%jq)kD?C!-J>0S}qg@kB zEW<1qK1%0oF=1^Qvyt!F)N!YlkvLDEUUFt?6rL3`;}LK?=vpaxRD7}b)Y{;8L`M+N z^mZK^`*?rqB1N;0^?c08hF&HUCW@Fi5$)#b5J}p<(&2d=y-%NI^%X24WlRsrt>8&6 z*Q}3Kf_v}U2YYthLbobEEDK6YF&6a zQW&gUbr43XWE!>T;1CPC=k=y6x3zMN!Ir6W4k$8qmS==<$O|Qu=;6*T_%4U+U0krR zj$LS^ZP6tfFXqB?nW>Cxc73CLjRDmKd!e>+wGMuPj`aX{UAD~r5nlVHZ*H6+8gU=c z-=ka|jPvj`JUxX2vB8r)BWv5!=v!EY1qK|&!*3&2&KD{QE=zS4*AbgOcl!B+Fx)A$ zh(Q#_tlApw#+gs#UWgaI?Osxv(7=|VGqBYvj>9T$CmqQ<{Kaiyzb z?UbsXyZrF~%tG;>={HIDa7zDApB}1Dt0-IU%*V_#08NW1&SM2Ok8D-as9VnRcIX6# z!ash5(`G9Z#eTE$1@E}{Y+*J6BEYJOE}>PXE7u1(kXM_Uh->DXD!uyZ}m zdZ?jW$-OYxwc^X-E7Mfy?bCbEd=?(s(`zwJoMryq$db~Tb)OVtIuJCTmz-BYBob5j zJwa!?_J*@>q2u)g);*5MKuR=k+zPPsy0egb>%aXIHM>9%%Ue)$AA9Usma40<)toRi zd0_$0Gl+Na_g-#AECQ-`8l2qs8ZgIQM9V)(FZNza{EgP~4HW(Ef(^u;bBmI9Uo{j{ z!t3_gfCRwupBpvRm6PvRh2EH-aD-{ONk|FtH2U)F z%-$QXObmD#apj>R#a0c9U)`$=89RcUC{W#Y?C3W^kj?Iv@)NVXh$QL&p%B9h74F=3EgM|Kh&mbvqqv(y_cfYPL{ZBA z$bn3vyl;)|=o2A+OJ>BP^!JZ5QU^--Ch~`DyB2XkHu2#e9a+NSzbF-6C{2-BNQby{fcX0J%C0*iSyu65vEzSa zFq;n0Wo$k9eOn2&+D;g-Q;ZF+_t}6MX0YSx#Y@#MK7-2qOWl%I%&+F~kV=akf_%9Y zm_lal7mrMuGN&dHm3C{ca0iyN#hs6(@aMPymXeg%iKDpHw-EULc$VO}yL^LXfofS) z8jw-G-P(&>*RH}dcNjlVU1gO)I|)OBTl4+{asziU86a`nRDR?#&!IXg|sv@;C5T0lZYy zM0DIl<>VVu_wX4A!<8QEso(Mi(WqQscMkQ*J;#%Dq$VM$0Hk@>ge76$|FvZc|Etrq zG9QTo_`#GFh+DE%{}mR_h%}V>F1>E{oNx$F$m(y&{F*T3DZ^Rr>HOfe< z`ESHCakH!mR~V-FkAq>hAemSEc*dsfr?P%TrF;#&-!)o7`9f@#J5WNO=JC;Vx0OYWI^B4hI14O zxohlk{Qby>9;xBt6&G79yF~A01n{Rd38RTdEV6v05v&L31-Vzw3~Yr8`Kq%F#}cEx ztGZFAJsyi&4^%|twuZ4hJaZo|({?7}cLo9|*aJ~?p+D#)oE*(MzBTjD%^^%x_FZwh zAJ`PWn^$EKHQyTd+YkI`Qm@>1!u-V@ljL1l6h3ioY|Kw07xCPuo%t~NebIOR6$sIO z@=DXznqqi7+3VPI+Hm0ixf6`ptIM005J#&jdlE2}i9QVqxxQUjjhz9Se*+uRlhE$d zgp;31eg>6H$LkE(A5h%CQNv<4$80hK-bll>qaNrYoa6`CUYS3{tp6W8o96jZ`I6r4fuC>8Z0&YE20M>}N`W1=YltVyIpja!{T ze^%7h0#szruWGiJ7`nCsnlMXKU85@0R7tulEg8~uwLBAg8QEeaV`)t@|gHZgYhjUy!;kMVS7y0q_#i8TIIe@Sx<$P1NV?y>)O0YqHJKpWtgVkah16><-`>C92l;kk)_|I>zt$iG=mFRx3R4^tv-C z^*POIT!At1P@Q7CKV{UxvF6 z>VaNIAmV^{RFdlool(nU`S&LAF z1g!nYo|*!)|78%VL0r4TJ^HuN_$Kk@-C7PD|K_+*yR#=-(lv;vvl`)&=^Dfpbaej$ zC#(^H^&l{$!^McpJql#Tom4GsSKDFvVpBZ>R2Qq-sxp)R@N4n4>UxN5v+m0_+9T=>y;QX}jboleE+DFL+!bFiO#w1iX7?(3$5Ie4?Zs;?g|gt`b^CQe zUZy9%9gz4QpRzJPz`Y&c?(CUfOx6*UX=PvhBYDi+iB@2$;XTl6eMI)>TPnFY?bcCG zT6yZl!)xzVpQF;kllEw`VjK*%YQ--m9T7#UUnjEKZ`)+zveMxgIJA9IKPZ!LFd^XN zU^41PK&?}z6@F^n_JLg7&n;a)^!9gRkSTKy^#ubzQ7A~bYBqKsJkUUeqwhq#-Q}75 zibDBQFKn4GRo1RHl=XUQpnC0O_-i+6@cKBCSD^UXlkwTIp&el%u(qpHSwDzD|Lt6)i5HJ z$r$88I*~|r#Or~-r39q0eHppv7+_MZBQ9lV4j-QCj3&gBjRqIyx1{7xC5J?KP z)D5;tTh`oi@ZPgR$5W_iVS&pfpEfHn)#AcCI;w#}u`A6;BFP@^k{2XxRU>oxB&MJW z=+N>mEGL9#`fQkk?!E4^{9(|TKVENN2+N)eIX_f}BaEYzvSX%_H{;q8&hbc$;^AEPHoNW5nrV}7pOWrU3gc!hd9B)Gfk31in|!ii}IMXtgyp1O5q zw7~Gbb*m9D3X{Be(GE7=57GtB=AE12(%@3&)r_TT?aK}5KQ?v@-LW!MMPvyw%dPv) zC3toa^!oc^J{+>e>G0>RHejkmdd+YMmV@=Uzieo!)#==Y@QlZ3stZa8^cNb}1D^DRC5dZxGVs~k)G@T((t23am=6yXnY}lqSzt8%&&DQPqHA^Gba8f}ew)^wc?%h9WtlK|59L&;4R&@`r zga_rj83<(SCAw49->F}}EFD&(JJS^Yn%nf_BgB^?dF!bpedU)j4=fNA`k0 z==z6gn$s=!9)MC{IaqZhTI9d)Kdd?JFmavFzzN%J?r% zKtbP+TEw*3hN9n=RvoK)`*S*Sh8t3o!*EV%P&4~iY=Y&Ejl~4ifBUG+DH)N)Wc7Io zb*9LWZ@%)K{b5bLXht6JH82J(N--j9%~gbLRtc)wHky*_`+o}~&X0V7$&w-;uyx22 zbS{~;#6i$Y3w-W|m#2^toqydtEV>OZ;(rYzPeLx+d8ttV<0yOU5?ut|~fB2wbATK4ZZanG10yE%w>cM{0 zj|BaG>G)^4;n6A?EkF4Kf(-p+A8W1g`@GcpP^>+}4?fl|V$y1cNU2(_VQ97H>@iR0 zIcp-%xD9=vS+y@pxHd9VBT!R^3tcg(dxK5Js!WH`k>6SfOtDw|O7VvfckhHziL&C+ zW<~1OXhNuNubq7yl~yvoP!wRcTFTNi7t0z4E!r_1muNSilb|ftapxab zIA?^2iH5N{&1Peu3%VK=;)suoR>p_etN&2j>3lHGW4k};019~$7*uo!-_QKsq!;@T zFy9Gx8rH)Qz6zbdYNTsdtyJAM2ne7lCRkvV_p2O|l+@pI_;*Ux#lGKRWuL=(MfCr3 zo#j)YhvG0iU2}ZQSQ^*-Dtlo}IeJtSyTG0C(zV4-hvkyMW|w<4o73V;9D#>>lGy1& z|7repnL>d$ONkKATJKiCV5zv)1NrnG`|e;?th@UOgVPpPgVGmLc8gNCL>tkW01)Y& z*@ceTepU!Qj|Htw+3VAcK4qAJFh3`qC>qo2E&C4D=f}E}8&5Nk$jDIZehvC~OLX+G7_JhxPr||k zSmIg}{f0W6EGkp>3S-GUxZ>8o9z)p!|9-qvMX6+{N)!gn$R?|Tf<~p~dvkeE?Dkqp zLJC%Wnb*e7Zlfu*B*ctz-A({P9|$jtLc#CTjUL1m2eZ@LzMVbL721SERK0F#nG_~B zzb5nWRY5Mt*por|8p-YcLt&GGcg1ryJCv{D*T-T5DoWu3L`ooEa8iL6eijz#1aB9HKw5`FvP!teQ5`8%|2Z0|EZ0-88j_s|7dp_mtcIn5 z_Ln4baIQvf*k+&_e~;MPqObspogUVxPHQ;NzJU(YhDfJ2_*}E{yCy#XV_tUbnV6@% zNzT?ZX)`;~My&vwluI&lZUI6~{qOS1#9s>3D*-y9b~ADC5wLhX7qQ=DD293Q#Xb}j z=Ar=d)Qs3{votfLq1l~)yr;M}$sewD+aivw8V1UT|J}=VGz^94HBB;!pBzT5d>Fg) z#!@a?Zpo0f?5h7E8D5j#xSs?)SnSqv)`7>mWaV~6M}a;;s(^xUVVZ}V+~$sDQ77J9 zDxZNB>(XHn2Q=n%vfA_a+sKIoC!dprejJYZNV7JvzK!TVSTygeo#w^|zqJT*{hH_t zaHT|2PaKKtT*))h-sRImqUa@3mP1zE$t)$%Heq2M;?bN5Vg8JYYZUj#{}bF3?1>o` zSGsOgk&b0S%OLCd*rES;=^$pdw{petWHqwWJuEuDn022;wUPa=Ys;07MrVGd$BVx1 zNzeh;X~RETe(4jVsmXK(pGa}qf6f_{cx#V|E+Z5-0?=3k29BG1aDN$rm>6@$G=&o3 zm~OK629NC|8K*~|Q$BERf)uyW2n@^jx>{TPo)B7f%5Y~FE;$c=Ec9Ezv@dpiT^PVR zC)zaqfcTN+fLSz0>&9v9l1(28QwhQ~0-L3pNSjXjbHKmlGC-O#;IA$+1<%ejv`Rb1 z0G{ym${Yw)Mp8qtYF{xJp-Q%&O2&~(?h{^$^sc8rn3*%(wof~1mhc;wqW*Rh26{jt zkcLrk>7Y59*^|%nsUr zGId8Gu`ElS-EWV@@HhVzz}!PsXJHTZ*&-i-#oOzxWFMEle+-101O=fVACZyUP3rj ze5pSficYT37Dl&fN4Hu7lVj7t!>AOc|I_i-5&JCx!!t%R`T#fxr6Apr3&>^y#3s=4 z`W26TDO0JRw?xw3_l!-)abEf1vYBr5<<^FZ@1aGgdw<~j{$D+&36`1e z3aW%*mJ;Mr#f#>9tw{SZMOmW^HKKyG-s&t5svU^8{aZC7s$$=4jg>71BGMwR(9^58Gl@n6-+QJ|b0Ql#m55{?DjF)_cy_ zd(*k6W9fmR@<>RS^=oDJ4G6CFcWOlXLqQUa-}fl}MuW4ds*<+k+Rgfor741a3f}j( zx_zt5y^+YDpEhkiAciXs0bOtg42nDWl<_QwJ|U?(;P9i<0vEtg0c`Wv>=xun2Fqb? zWmBW~!m9sKbPn8gZBZ0%(zvnJ*tV0#jm;a|Zfx6X?8dfj+g6h_w%>VUV$ROui1J%Up`TO4o6DOY(mAhxL*~uD z&fy((R0bC-%YjZ?0V4yQr2je}FHdm~+v2$6;zL666%VHFJOpu1L`z9Nf={`+YzhpU z2dK3O@0jKy_uRv$(Wu%iHK!Xza8JDOb^%4HuuWX1y#2T$iKKDXVHO&e=$hnfoaJD> z!B{>2t`;x=-yv2-S}oL_)S5C=v@D?%js>s9`Z+(IeP}t$5`*7V_pofz`07UjV{r9M zb?8Plw!USMb9RSzagOnrJ-vDGk1 z+D{ATSeU)W3fc5i&*LdlM>3NnG6%(&1KgnY@06Q|FaoCAXFIl1I?#nWkLaA>TW#C1 zc#%F7al32oM~jWbnTmV0*Dpi`sg{6m18DC~Sak=<1p0YZ9ib9!=|v!07bo$LkUMd$ zN~fjdS2=K0rls^zJNQ>#Z4X$=g#fcU7Sw`gd)4dRvOm^uKosT<9wO1^6_`MjRfX!? zvt}$%G`RmF%1Cl0#+rfzDlY8Gr}_E-U{unWs?+m?M+^*K!ro(j7#g*ii(mL~u!=;b zrSU|xI2&xD*ZXi3aT8PwGV{X`9%P%cq$2r7yy#B5{ufY^7xFuWc7DY2bqzR2@O2kg z@+~$T?wt$6=OnGIxhCjK-~Ch2VokE;%Dn;AAy%hw-0P^;)ieB^vN~t(=vm4_0HBgzn5HJ6z!SHsYq03WYI1Zja+bxonTld5#cOe;HjX&B?hJ>4y+ zf|O@4wDFosJ29vFC_kT>hA#B~`z`KwSp=ZMXE0+2y4{g!EAkB&NA6Gu-dmTNK71%y zmGu^r+w#(wdI}bA)I*$vfbj9CI59*QbnR_j)yQzQEFamp)O0%ryhf7xh|Ab-y60w` zY>qyc_hq-x#5ZRIZD^MSEj|<#^Uq##+xe;4i@e zoFPY+SS7|ESL4OcZKKE8`&sS%v~0Br2E6n+MaGRz6Fw`9p@>iSVXAEoZ9fXCQ+kpx z0f=kLM=-p}r6mMHjj<2_`T%U}iZJFwp~#E2^F{ps20IMYnymOa&`Bz78}n@kOKg-! z)g8Y7RtRVTEr5?mMqSYZzZVb+%#7i4w04# zNO_ObrFc&Slq-=S-19|5i6Tbsfp$&Zuz`}Fg~c~BShdtT%|adg+2+_rl2IByYRuv8uAEKyxV(vpNd(3UbT@G$ZsFQs(ZKrL!{@Tb~Ql9>P zUt#iAYRGI0la0YJI$3L-M44VOqd_|PZljtX)2+-{B*B*9IES3;P$#s0Mt)ElbG6d` z6YKe&=i&ttVs7#IRup`M32QZ`8LNn>Vd;)NDn&MFF#xdw)ZG-@)V6zCY)aj*@|^q) zh0`Do4=5N2DcR>8n=QpC(@+gzJ!VhrWCzF1e2LN)h_HM{OPKyWepjz|u?Qzz=t8f01vG9}wK*4k zt7p$aNlIkmmlN7uU0r`)Ohx|`IDd?4&+yoe>KcqD29(*hW=^!GCnw!QL3vvDS(eW( z^=nr+ao&q5C{^oev#YSKLOzH~1~vM;GEQEyv}NGs8y!>}o_b4m+P9d$G?p&U-iOHK zk9daAEtephmrt&?D8X5=aY+77-Q4SN54&rVxQKcgtwU;!k<{hrJDJ1v;iE~3G&>8R zVxv+td^+#g+cXi=+&*NtpvQFxoER|Tv1|sbBRr@t&=pRn63~VHhe-zW{ioLX5agDw znzY=QNd2DNJZ+GMnk|0ue26Z^R0O4GDfWQa*NQrn!cwIO#p$6T@5#{e(~!A`WS2<@FRh$Qp{xoBzi1;hS<0u;+MxPd}Z423;C~ zD#bwQo4YUUyA7noWusV1~ASzM8Re5(V35(x+eY##j>%;0HW?MC+7x9{8ScU6Gae5Cu?vsYUTTvh?QaSGDp zAMS5p)@9T$=@n)v11jCYcKctAOLy&6>>Kp-r)f?BUdJ^94F0?EUux9;61&oBzRC2- z$qvi~15HnWX5Fv-&!k)}sr5&Ul^o?H=ps-eFDy%hk#)jqda=*OLIK*N6!}(=nPGEI zqpaK0B02m#EIJy~MSqV(y#8@Q_bdwDiE)yGOD2gwcbITEt3;k{ zKKx0*fSJj|#=a4jPD5!uay~u_Y=KPCRpf{$48aONJoF#&dGpY`mRoaGtFo>o{qktLvc_sG*T@jM?IrKuAD&PD9)r8eMggS0aQ>wGoJr+=AH52P zYD}A7cX!5WG0Ze%ctEe1b^ETuXXuJ}2V|a^TRZfPTCbCD#GPA85)DP-{jlP|vZ&$V zC$?|Nm$_&;^O{uL>}VEXUu3I1UXHY^6z^K;jo26kL|TBpWfVL=drG~oUKjDwNTmC| zFr1>%qg-V`9Y-^q}T zX>pMl+@PKRYa55cv<|weN)Q+2X(R+Hw`3)|E^Mt~C%;|G#}7_9?4()LgMd5Iu7k;M z0y~!S^~knAm3cZ6S*Eh4t0sICEazlA2uv}AJC0P8%O#biPcZ6(%|If*8}a3=5MTSc zx2&y) z3|3ous(T4f(75g8-QFT1ariMg(*r2h3({`RaZWSRHFz(u^GYw2W{K$oRJsE_iIhj> z^$Xr{SeA<8Q_^u{NZlAn)Sl*JiKFBU2Gjw{E{201?Q42^j{{AkSmiU#f+ zGMxG4ZL=QKcsa6o6^bNKE6via56pVxPviN_2_X;ii zE$Cm~_>dx5enzvp#uzAIrox(VvS`iOd|>;3bN@3H=~K`8cmg1=#Jq2&Z2z_WBw|Vg zS4tmIc@U5zH$eFunwVL4FEjoy6@3K;q-gvQpr27R`fMkCetR8{5PLUqA;_r8wftH? z23V&TCnw5y^W8GUiQ4`Jw=-@Z%akG61MC6yy7t#pb?@4F88+ay_abjqsc0dUpuuvU zHYGiF1RDSQFoQcMoOr*dj>81*2p%?6;6vwTE-D(F)5;K4~4vhg>^u zfFhqwo90 z=ToQr9&-ULvr6T#xfmlWd_Ioy>QkeF4q-e=bmHZ|d%Dhrxgo4S?-7PxpwgnfKeq;@ z5N-2~p;kZprzrK`(xRK?!1M17sC%7gZv~s_36LS%()PcUIIE4%6VifqCES35%-phQz7s zL~|!7q((DDhn>2qSz0<`Y#t}-Q50%C5Ghz8DBok6ezgp3*I3_Ww--)+k*qqoEWUe0 zOSmJ@mGxT^Srx`%Gr6Nymx>y_8BpMzcH6aAEKxY%VM`1)a+q!>nKarJM-NA7+z3l4 z%kmR&>Gk?mL{|yqA^}3BH+yY`!kdXtFEvLT6lK@!<`JM`m+UQJOlbss+%+Zq;XqoS zNk`NYQn!vu=JXn4+v{cS0HZh#5ElrvQx7W+?ST9(_BWJP1>X^P2(=x@NoZqLlZJWPIEzT4w z141T0XjsAavG(%xvzMC5q4ooHCX^wJN(_cz5eLa4x(S32H}yB`e2w07!p`92x>KUlgLAYzf{Q!Vq3_v~Yw;1R)YEKrO z@Y1m$zPOa~wO8V6HfGE3;})TB6Pf^0uh?Noz_N{5S$wvnS3hibf=WH`KvWM-{eu9m zg;bucct1psQEG}}axKK^%S&na)lO2K3ji{Xl8*m-vH@KLvBX5Z&e-M-FH~0?DAbox zkZEA>JH_^-e9OxS^&APucjZeR4}%#!NVO0}_1ch3=wLG#B4|BU!@OaJGrY`i@uNqb;kHv~;wLD!%7HaeW0l%*(%jmx1pf(L40sUfp;l~&{<>=WgT>n%&T;=zZL22%#z zB3`N;-3bX-glsNfK8e5}^!eei&U+pX4I~QWy z&B=az%JCT*{6{Nz($^R}O2i587#}W>#n$i`2i~6Qq}B+bbfc0ecCet18;$R zJ@H&(a0ruYt?_KU>cA2OXkHfG)J0?IHN~tWlpgEyQcRW0O(=@-SE45k&F^#=Q7>G8 zIe8-&p-WQ0Tckp+jpYf)O}}rgvq1jhG1>kiHFR}Bz^Up zGosDJsJ_MNIYTW*ahhc!dZn4hzL%e*i73F)#+8U0ARFgUON6^Miqp_@_)Ps;1C8JWALof^Bh`MKq4}^BWyMa`#+43 zSfk)qI22LhY{d5ox@dPb;3QxZr&L@o8+>)K$nqrZ{cHII5XlAcgb0EW5$-)>={v%= z_xT!BfAhg9h(BGwSit>-p_lWo+4F=zu>P8%X=Hj8|wZVWeQ!5WTtq@s{p6(qGu-AfYz8PR~(xpK$$9y*ZXYZE_awjBav=*&u zH;)%gQsc4Z)|KH8qXp@a#E9pwvPA@}QJCg-@wn+rk@%05ni_n?oe~*= zTCGZt5lE3+ndU?K{YTjFAJE*N*BK*EYs5!lOBVrZ&DfGn1&>9MB83=jV6j+A^W?Hg zg}ByLWj=kUJ<$gmQV|9PJ3t#Fg+4^IJXtEy3hs>~r-pt{>hIdiUA{VV9|dl}-tzhn zDBKmu1w};>H&T(O)CARXw5Lh)l;q5o-#oSd|rV*c8EG z1OZoFMkE%7Ba+S!@}GtSa_V5WbBde>v@BB8-_OO_!G7kF*AO!epawUk7sd(h0a-Qu zwtvg1vho{VNa!A*V-LB1ylFS6u53t|x|C1U+qxk|(lF^lWICzXMBnzg1HLE8%6tg~ zfPFIW=){=UZ|}_ecqqRWuqJSbZu5!MT*d0Q*mvuOwtYT8HT4I<_XkFhn)f%ZL=bbL zRMe57F6)Od!M+-;?u9hrpB&sN3e=YA;z{+xH1Eo5Bs@XBtUa^v*()IP;Lt~Wm1|2^ zg7xy@6&ZQ6qB%98)64butyj`s{P*`oEMc=?A_9O`NCQmog!I^aFdNNu?R;i=&-3af z`b-Pf71oyov4sO5K;4Y37$U7DCOtQR&*I=;R|Tlp7okuP{z-n4 z$g>d+v8y`?5p8DAk=qh&hz2`b^7>a-uP?o4s?Er=1AV;2&LE%{2TTYtTB6E`@vfo^Y#|nUmf{v&*USFhd45aA?lGCc;BWr^dyYH&>{#NpJaobbn zl~>w?05%J--c}>kW0Ubu7JeAc!M`uej87y8ZF6ZNAak13pkl>aL>%KJK@&FHDUrBJzejTp1W5^+3w{j<)3FX7f_EXAcyPV{jl?lFJ~1@Bz&uZ9)EwgYP+# zG-5M>`_~a?zjn}8nP(v>PquXYm^)P8cjE=+7$8}a(vw;i@9DWhd;DqJr&4K3Njmc% z|Gyi#(*Y_KGNK^*AFIhV4XU&y-<^+HGaB;2>m-f>jHQco0eVuL+|Uj2d!J7 z1UrB@1^{>E!7DoQrV{sV33Ah zdrBDT42yztX4|d`<9Y|obqSAvTV7(_;dyY9B*8~QNyewLr4?`_^(Py&4sM9@{R;?W zakOsmGP{40ClDlw5d3+9W}_~Kh0%2n1Pw=JtkGB-NWj&jTWxR%$5rfG;{HzYFYEFZ z*$?<4cGOsG%dZys1yN^hCtApkkC=&L&&G@85=rjYhaE^7mWAfvAnCs0Oyn?Pb+;WKB@Kzn}Qm7cv8;YW^Zma!@&VA;TFCz zo6XL9^1r&Jdl;-}qBiiW&IDYu)VUnFbQl}2w%O$GQ7H+%4k`$0a024sb8YF)i!c!t zIe0+H2TT*qb#^vQ8iPoDFTNEdKh+$E>pE%(VC~VRg^@sDV7WK9_R57yC0w?)xNYy8 zZpfJ$QcLcI>BhgT9B#ODLN$_oKP9s?J-;$3DpE0ajGjc`(X?Q(#;y!(18hzHqZ``> zNp|g+grc>1wq)g%plO32yQ>l$;;oA^w8Odv#9^0m=Me16qAjhn_I${korwm0x(u0- zlGNV83?gS~EC9F!T=1aI0u$UbjRBtUvgmOL2n)CWp$ZjP^ zRW}gN9xPmZHcjs)^I8fREaST`S@M1FcECO*!C|yTP#Db+MBC?puk}af$llw7qli2N zEXgGUZTiyf@iFAEr^THuW?IN;cwpGAfBi_1IvfDjdT0?OO;|XDdNNpa^Wmn2gmsL& zewXxLQVMy}PVopGJ1NRvU2MoM7kd>Q5DV@z3>cz@Tvq_a_g0~;ZhBIJ%Xe-15a>AZ zy9Hn77OX4P*BI5iLEaa^x5F|(Q9G=ve4}P!pQ~>@ZU#Z$Dh2%1JSX6@oeu2T0F-+B z_x{M6fJ`=U1BgBB*Z!5yU}m#HR6?%5f2<58UgjXrWsd3f$O zQr63b$Ar2edN@Ggi!YulN5(<(r<g|)uSHoz7}L&#yT}%MyHouTLnsN z!YwR)_2r2dduL>115E;$2u(Kmj4GEoy3gCqOhUN)NoMvIp$cV&CFB-9yE`w}Y)MC( zHg@NF=cS62oVVMIwvN6Y@gAifv6^k3GPv_RvF#r1ijoP!-4%*Twk|8Bj$jHA`A4BS zOmXM~3%Pc1t_>_Ikt4XPl`HjmrrfX-drL6nM%1w%m*-EDj}jupzr z?{Lhh$)%U~)IoiXC)UK|N{}JAO3c(!6IwDnifh{b#3=o-mLVf zmZcIEykodx9@7Q&mpgn$peUTk`{L&ggIQ(7m7wtxe!$&=Ne5?wHqhC~06xp|;$;n| zKuv>D<7Qf#N0DD`eh{09hU~*VZr3eI>1v4^BX*sQ;|HEkIL?Tw^|a{Il8mT*NL`-) zeU)>(DTzahaOa{B#TO>FA$|)zjNFVy*nX*AY;i~vTC#+G?lsAaxq9<61-v>VoTCHY zBy#X6G-=9*vddR(w9#u1;j%|nF^-qX#Gm$cO_hrg!d0?vaKS;Ln>K}+j+p53g^79%`*%e&kgPBuqTFkh=FVU@`3+sLqXhIPC94FY`e4*)edRbzkq zEgWGnJI%Wl2GR}|zd!JDJ_O2pP)tcYaVl<~*ovYKbqGU;+Bh^PJt2;#(K8jx&7A{n z_lav_{&s#Tr2v+)ZnUy-1il-otP^kC5Ts6cBSC;-1y!&-^PN(}7oA0yf&r7}AKNV% zc*b|})FMdyO^Vqm7Q*!Oh=@GPgRLXUuEyp1_K1Ai1(5vDI_wT*wLHH zt*N;jA8}Gm=;9H?RKm2;V6c2D^e19#zVCLyg%KWqL%K!UDgJvm>D{te-w`6gd@I#e6 z-5$B1!TUze<%35#f(AC9e$G#?5l6rh6#U4c759W%5!&oi-t6ztmcf1H7L38XL`_x=CNe)-S2ezK-k@!Q0|xj@2SsM?Y&L+XbXi>tndM% zRBX(EeA_^dQ}UL94Jh&vN~`K(;V`stic2jKGP4yzsyBD-9sM|cUEH^`h8I)VKa4m! zV7*5}l?d0Pz(10TZmg(j#?*-1`~KM6Oype~lu2zr9N0i2?_H3VE33&#hMpAg^p;2v z-tkfz1lRe=)w8gaw?syvwTKyguaIdJ2Mg~MEGcg=r;d$zhkZxs)m_YVA^8s}%$aq9 zjEqvgsI#l@g9uEpxbe6qlt{Eu;@_n58e+wR$H}f!X-YZBlF5HrKa-g|~g8S;~p3WM`ge89Ksq{+y zv`4)`5J`a&tkiyou>Nx_T1Iu0&L(Ya^-GVIgc@5n8tv^iZjad1%F@#}jk9F3T8GcC z%I`}q-k87b01a8{z4BVA6K2vsgXPAvkkY`@b&qX|Yz$Zv6Si1v(4|)uOk}i+#v-Qk zZzHPF8F>+uQL-Bqh%x$~Bodk8%xw)+GgT=8{w!j>0uDO@G-N}NV(BrSb@XI`+D)3s zQVM65n_Sv-vKfi*QI~UnqH3Z|_08}A&f#h8exvi|B}k&n1WdBXuO1#tI&?5Ss8F3< zlI`CgGzSuHsI-BaI0^FFKN|W>?u5ABdC^#-ReUSi!+oC~nS0HW5e5wFn)>M7VAnoZ z8o|?Wf+7zsLWaG2n;Z6eUg{9VTbzmL?tRQUI9|WECbuYkj7Jjq5jd{lBIkDW%*eYY z?(01!-zEOSNeI5tv4z;GAn9vJ{JTfH>dESk5g5f@YiJzeI*72H6ROhB3T-Mh^(}iJ zd-&p{s5!Cp2jjjdqCf(2h(9>czmJIY(4LWa(1FB##48sqp-E*&R71N?zbTb^_Cpfm zJ@epTasfLZ+qb3U`cX4@nl*y|o#PTMa0fh4#!#Dz%{25kGiF?6b!`!-TN>pV6LP>4 zbw>6EeGASj`xMW0WGZph%mg2T(y6CpTcZD!6v74$bu@nH2k-;TmF@A5oQDh0rI<3S z;XimP*Zv+)I&Zzn;U>&G|G8ob7ZRuZl^)Lb{&rRymua9N(UD!KAGK#Ck2RTfA!KM5 zf4r3QlRG4Bz{}=p*+SBZ=**6E`km#;B=j$*!J@{Sw_3px!KZuD{ykT40={on3YV6) z-FSrvl&1}!&-V1yI@h4@kEvOC0C%FG_src_YPk;@+Xr^X{!BT<0$~y){(mK+O~fT; z{r0f!?mh_eLj?$jC{cOV*6W}2{a?18j~_+Wpv>T3-{I|$l)|RrbB@VrL}pugQHFV@ zzC!s8RNjUihdBGy3sR6fmg*-X%vLqO0|tqUd)|7HtO z&Tt}_pW7L)0QTV0KX$AzI*`h9CMMS|jQt;iyFe`>#BlY|@ke&xTe!ucfxwe#LcT)2 zb5oa9G%c$C_7L?4*9ho%uY0-)Kz2NS^Ah?CH-g9|-vpau#?I#@y`Gp!j6yDVgqyr2 zyFTBmn#zWSSUrrlcK#ZPOF6CYi;CrL#GlSYm{x^QXOA1+K7$QT9(W$|P1eDtxe%Ui z#bhOy3{hlQGFAfoc5cV3lrw)|xXy&Y&y5GW5H68#*!ocM3|By7VEb2ANkqP?cs(!7 za1Lq|%>out|WOqL|E*MNBmm3&g&qO6lA`>Y?NR1wdYyMsBNhk zAjifr-vF=aOfo{{hJKpPJvs(%R&1AE#iSkI*=j(G3@;RrF8RcLg(&r%SH z@Sbq!@;-W^fC)2M!amuIZBCtQ2mMVM!lW_w7wRvgCy#%Gc!ggY&wN>#%e-FSZbh|k zx@r3JZ#y}z*Vp*TAs|xqvo};nrO#fnYLMXRkG@RvOJWk<2z%9pBjF#n)BRqWwfEBW zsE~rb#0kO4+Tnr@TA3NQ^Jsapqmd1~aJL8;C8j@+x~k5OZOZdgX<}Eo)5197FjZRL zYeY1Ye(_qouHP&W<4ndUG;@~b{seeAEl*hCJ+pBEi{h<8&IE+V>;iIUc%=EA#RlBZ zAVso(9e6@B_7886L7Pv<)0LT+x}dFp6Tu~;<-*WDAvDf|C!DYX$}^XZ!dZ1C${s>j z85LTtCBD!0IMd1O7Zz1~;2qD{@_D~fMpSi>dADs9U}~XvXvsMc8`>f+T7o(cnlf(aJNb-pq31_v!8+_to9^YV>Tm5W@dh!K;cMwo8O~^~SI+KMCv#0D zbz^A$1z_(CEcOsvItx$ey8X_jfdmKLnq=VJvLz;}WccF|djxWr9>uJ#q1Ce(ah^Rq z+n8`h)NaR%zyHQb%}o_=B{NU{70*bfn82XZl~;;#3T}R-zUjFOJKZjxi{itiTS+x0 zE;dxv`b)Xcz=u9-y6LHuUSI9;1fLoCz&oYsW@i`GcfTvdZ*OAqcz(4RtURnk;)r)% zTjlR8Cai4a%9tH64}Q_v&Y^f!+Jmh*-GN*DE!?VIp7_`TH36q(R3?q^sj2py5ZO-l6(S@p`3kJ~34?w;RL} z9)Ay%0rv8}$4>O{gWpvMTcJcHsT(M67QpWNl}T$pTEQyxlWW3(PfAN@`6PceZMpWk z*wM{Z?lyM&apceYxlo7?!}X)PnAl$eo1o(W=vfz|8HI(+j-ZFg+XJ?LeBt{~>^78B z++6YoS^kZD*KTMKu!R{Hwq(Tt`Y9ZG8q^< z56nr}0P>%DyN|GnzT<0qO&JHzB;lsQkZ&(K zhDP)K-v=utFCwe__`Zk^7HUkcalP#m^%oXj{m^?}IFc?RS}nzF?t#l;Swx}AH;vAOWk@`_CC zY_Z&LX6x2^IWXl!*SED8(x5F7Ce)3C%xyJ&!(GNefm6lk85hE+Nvna{hKf*NyHNuD zX?sBR_qp%v-zo6SPk$EL=pZHAL_9vWbFLfGpJ#bY`YBKVfBU+&W#6>um|lo&ipoP~ z>(f%gOpDOa*~&yc3W#~GhXu%CK*!hB^Kigk>R9aqmUB)BELL|SKJ&kBxHpix^4e!( z8IUQ9&o>?>4h_8@Ttzzb*I_YlikbH&TRX;E`kL#~n(*7Gnap>rVC2{-$p{w%+ufZ< znLjISG@c~Lx7P|TAsQR7jr61Xxp|_seaDP!mReo?y2{lQN^E+c~X+cS3kD$jO{efW>B(U`pWw}w(x;_{LRD&^=&59E1Jf88H7#$cvH zDpY^@dMGSu?_yb{Z2N!r2@eGE0l~-HJHLc(`_BeC2kK(z%OR?VsiAOM5xbFY6N)3e zJ}`g<`!hggXHxu@S;_&Q<&W~HL(@WGMvD@}-u5zas?p{QxHnh6zdnIuru-3tDKG&2 zT)H?2_}Z^6%p{)v)y58^)%%;9ym3&S%U=X?7V=!Kc6NjqW<+8QDl&L`sI68jJ;jEW z?vLv)y<81oQs=eWycMVICxl$<#=dwzH8Ge+{;eVhG*mp61gM2|eMiO4vI@t4L(J1^ z_P@ zHJM-#k|yKtYd4*@syNCl;}SAhdZn}5&d&GM2Jk}H!7n*YNT(yQ^Emd~ zhCpK+|K)BfvpBliI2Sq_`J{_)aKnPN`(98)liCSjMN$rC%e`gCJig!2(zWjTw!sf=h^C;X_K=#i`h|$=XMFtE zYxUxvLyB54iI7=57s>z5!UH_G3bj*C#&*W@-PJhv%{LQhLWIO~D5lr?Nll&MouuAh?S4X1cth^{#m?h?UVcl% zQFF~*L1gj&@!<64uA*OE9oFHfwp*Qey2^LrBle3jj#BhjS#*2GNaPP(YGc^p;s)Ev zGnYwrzAxu|)+QXh|Ac^K>wrL^IgmrM4ZYK+eP(+nG7V8@l8Ajs8ixiuqn{5(kKod4 zn%-<*jIPZT8V{mNw6uc5$%lvHn;ti!CN;in0oCl9zVH3%5eSTLrGatlW&Hi@)k-raf>ig$3Mk-qv1- z*9&uIk3Ey5v7v!V&dpVEcifs(G^*MJPf-K=T;^kC+@4A13sh!E3WgYBOV*F=-QB-( zMALpt-^!bS20>qbgB$DUNcnM`1{ER0$Wb20$J%PxV^3XO3GPetFsafc!5vziwVtIH z9Ae3Az#jF>61=GUzamruQOznnh3hb;7&=o5{%{|fnjg7p!QMSin>7s(@VH!dvvOIz z`uP2I4;t*ouPD{?B1|yc1Ocp>bidZ8KQRNfu?A|+*7mGRnI#~(%u3j^{$eiPHoLkZ z`=mtouPPa7lrSOf>F2)PL?#byA7dQ(>v}4OM54pLEAVYyn2adG1yuuYr zM^D$|nrT%e4f{FWNS+qqN9Sebx2h+8KBJ66AJYb|uI(&x4chIan@M|@6YRVUlciwJ zy0I5tAxHI!t_gU2kU{kC67}lpR!drbFufNyV2KvgOIcrhg z3aiKh#emK((K76aAZ6YHw#vZ2}&&i~en1#R$Rr3&rp0$BC@t z61?Zh8wG$AdopY4W!rm~EHdU^!rgr1{*SyDE?N93vG84S9~MPoDCtk4$R`!`fJx zN@tPtK0XwK9=RMdKZEY>QRl}P!@^Hz(C&VP#dkNoQ?q+B5m)eMIrAve@`SNHbBXI* zXzySHhHI0mD+kc7mwSCT5+sJr5ovKG)N3F_wYbH&r8~Qnecj9xOKkAY!?R$#Jvw!$ zQ(^VY!}`Nt!T@)%v`sM@dnT32=#LIIq*H%Z%*su|&kdzfpeDZ}48`I4DggB@I%lyZ zmNi!b^5K<+YJ?nhaNWKsQ8Q3e5|X zc&n*Mb$v6g$`Dh5dg&74vh=$N4QN4~9V3Cu6WbWv?ElpaRllPTH{?=fwxq0pqUd|_ z2k#LbxQrJBR0uqHB$@d%Su^RZFY)ZtAS658n2n)_-WQrM|L9@hK5BeBD;&rfhKvcJ z?tuQ_p=Z|Fq)$+RIE&JyS(^`q|GMo!tcX`f+bum#{gI*V@J8@*7k=>cS}|0t*~yCd z{4*Gdkpl%jFiH+Tkzf)CC{SEV2`ZrtJOPEuj!v@j?0;G3l1c0J**2V0A3;Mr;^!y3`RtDT+Ttgmv+FVMUYkFclgIbP~^XBm;AG!vI zCqAn<8vkZb_~8PGEl&wV?TU#;9?U5THk_=l9;Mc+f&_)iPu`3oWp1999g;PF`8AX8 zSi;o{8rWCf_{y&@I!Ls<-msVN{w%|Y5BRCfg*#*a9o-iehK=FLtdqyWHIv?K0`*oc zPY=`-%P4lek|E1xKDKCB(Mbm~?lPxp5v%H4KM4R2`0a}k8+>*uRQZr$+kzXroC90_ z{76Y07vTFrNAHU!KM(6Zs{L|P^^$9G%*jBuYI=v^kv34Gz_o;lB@L98Lv&AW+{f{> zF?=ZYh`%c*NTFu82?&gBpC2`0jlO@l3yL_`c~O2Al(*qcjXVIoUn$tcfPOAZ=A|KU z_Qu@*7ol9*!{ro>%(4e%5og;!pr%pZhxh$=ypy>*-_YlqmGnFLC^W~jMu97-5N((X z5L!dx*l~pPWyxU{5>a;3Z-4x2jQ!@ZL6>*t%_d_%qmCS4q>Jm7srJNDj3#5P{ywsN zZ6>HLsEb{3&!wkK%&lqOk%o+SIH?=bNwE6cx)^H<0*;fUcBz96IF|IgtL@pOn8wI; zk&dG#ai*gUObi|xlrqv>wKBu!CFIpUmXzOZX7)Zx)~CV?ojxWP zm_AigdHSl?mxBmg#r$igfC$G18wIP#NDM_xO8#(8PaF#G;9K&0e@3-*>xuV!da(U4 zk!@_2ii~93er@2Si-HR`5TZ=9lsIyaH^p5y5#XDNoujxSnjf8a|9ZwpFCpa1OoQGv zftN{-Ykmf77YSPyFD>1`P*?eKZv0-iFP@6Air%eU#z8)>e{7|dMV!3~1 zvLuKX3eo~>`!XJIt$WyqNd=wT@(N_&$F$LjkdSURDvt-P2D>vA7K->ssNK=Z_=pMi zaCendzqBRbonZGz6mG{WC>~dM5x2TI4QF=@F#iO6ki4`Yu!if>^x!;eW(Cg={jyn` z9(gd^Z$m&33<{=m8#uo&?c^CDuP8DPoUaiArDW6;SGjfY{r`ZZTS03H$MY3z3q05q zT-a3j@L}hUZ3~qmmu(Kqxa{B=88ys^$I_uEQl!c3Kp*#-3h3&=hv%wITqf2iRIwp2 z_50~+xsDE8llQyVC4_6z0#k*=?13}pLxW*H=OI5`l7NDnvsx+y1~oP}J+*;D*Xhi| zce3S}**&qQ-8`5_G{el=Xj%Bx+8Vh~PMf$GmaqG6Ow_%7 zk|Kt4iIpX)upZmvL>iqMr$l~5(;=P1P$VyE(Qy9#U^ad)IGUFeOHh=zxW(VTb5Q-5 zYJ6Rs%@Xt>vYuw0NT6$GT*CDX?kkk{jo6X$?3&|3>c1V@*oghpm;i?c&HbgjJ2&r; zC=vS*PcOefC;&KoEI`&~R&6Je{Qq(%4|~c}>pZQUIhXQbeKb|~uZ|TF&%zqT-`%z@ z!WdJ<^6!TF3_FL*YPodGC;CpTH{;~Uj>5X*Qn#A^?5PK^l0_7xhH*$2<-isy5h>$u zc_yvxT1#GZTp!@9|DJl)GBaFvswcs~KCGL3{%dw{!>5IpS#2&-M}l3_O+uy#MS7E>^rtza6j*S&ftb) zgRA`Ba#t{s=49p1%ijgAkB9lg`}JQ1w3Me`yozeePDJ;rW{8suyEw7Wht7~63M%`5 z$(}yM=KT6G=>eAsnfI7`#A!Xm- z+RIf}@0E2c@yF6NQ*TY2JtCKuc?HcYNgc)7U>2YZwukD)A)_=~*Co<{cjU2==-vI^ znD<{@R~`*@zs4nG9oyI=*|QFjX_726uYDQWTkJBK5oYYYWX6!0QA3m@*%D=onUO46 z2W3~rQW#z$Dawm1b$^|E?t9KX=ia}*%lUrJbH3;KKF{~r&Uuz{y3tkoTImjMD>W+( z`=A;p2+#3elL#tu1S;)(hNAELPNag3o1x;blT&}T)cB;O6=^A+`os@bKh37QcS{ivb>Wr9^COxM=H%OZE?4;Rb6fwm~HMth6v zd`LE68KzS8Kl*u1ZmGC(|J~GRF7jiaMaI_!hh{8@E@H12oCobh9mKTTEM%S-(R}vs z*Uw_J!FfJq$b$|Wz?9eMquSs{6TPJ`#;wIastqvofM7ogtL*k53AGhjnz6NxS}1@ z-EHo@Ps!aa1x)DEQ*AJ)fKR2M#2w0VTjRWj*e(0?Em|bhdf1aCnG?0(jDoFY=LL%e zYrXmF8Sj`nI-)C<1-O4D`IKKjfuFRA{M2o)bC2rM>rLNfI~SqLyQNNg6)d*wf709R zF7pg8B`N1LKgMmlB*Vis`tVpCIt;L5WUGx4eWPlHt+oTq500GEr_|zBIUF8jE3vCG z`X=oI+^_btB;QP>{20#JrgaKu0B_e-`0t9e?2V)g?_gER{gi}_fLBBc-T z%wxKtMqdm>j@+!0B9ANHTdS;++8=w(Wc$DKeK`vCkR`qRcBjr?-B2;E9*&&@peG zcW2qA+K&|G=)cyh=;Tuc9hBf(uO77xm_`f}`@tU%R2ON&K4`tSO$DvnrJld`D)9^u z;D;UsS-!8Fd?6y0Zl)xoxwihLG7QW3x_7y@>MPvuVt-6}(#QPcLYOD;$iMoQXqoDq z_e;fj4tJRFLB@%vd4$>;rd^u6Q?|W&WlDy4t{AGXrbRDahB#!mhZ_V}KGI!wy?{zs zIXN}}O?1S;s6MZY%_P7GX|LbCI$4;>E~kv!_FIFQc3 zX+ATetKZ8JD!aY88}PGX+e!IbY5Cj$CA7vW1t<-FO7BEKQT=vTi8CI@M%g`o03IN5 z_>;AEp%C3@N%iy=ke)Kv)Yo1PT-WS_tRQQyyCHF3itEleeEU+@ge#zlZ zF4ETK2xSmKysrqFHiyI8sL-$0Iiq(gZX8}~L#^AXXO(v}fYzLIH;?K5l{9t>C-UF*)y;Z%@>E$-j#lNpAxy0KbcF4E z5S=+Zwb!;oN<IXRUPuw!0wTSf{=N4{?yIK$7Da}g$9v(ljU$!L^`zqbh zXuK11ATI1pL3qCR3OVF5`^azf4*W`sx4z}76F(@iyS{I4&Fip0_dvs|*%#&aidLn` zmQ|M$>PE+pM4D@Z6)?1kaeC_*$Mw}ncm}UNy&Nj+qB-0`A<@7To{cF#y2`k$P`B~R z;vLUR4?eLh0oCY-UQ*%J5lQnx6_!Pf%ixbDFTHyim?naX_{S3+`V_GT( zQ-qevnX^SSg?}B{N;l*{2Wvjp)3cD%5T%`w%&$A+8j^gXU6IR56Pnd#Pa>N0^Qi7* z46T`}SFYW+3w*jV4Agaq)2H*yL_#`P%=i#1)|afk4Ivi!tncHp#v=k%bO*UAYil{N zBl84%7gLAfUUE_%s%LF|wOC70z7@|6Og zZ$=u=-?J>E=ht;tKnAagz2Y<8_m6p{snL9jt=!+ncIDrUwQY1-4U(GokG9!qAS)-V zq*&g>-h85|XbLH2JbEL+*Aw(P)=_x3W%{_*} zFT}Z}ZFvR8N7ZM5nt*5|h^3_aIfD9Ln#`>Y_tjbC6S`1xGefd`0M$+47UGo1oM7oa za9F1D9sK#R!^FSGB4N6tyZT^0o@ROQ&MFF8lqHX=@Z;~cUI5HmjhvaHZgP0ygc zIU^(jU6!Cxc34Fy{}Na@40)mRk?k32aqNsSHYb|evbM9Td`>g6x!?!v;;vliC3H=J zB0PaKNA?;s_u1zL0dBJz@no3XN_W;ZehZ~I5pXKargh^L=?Rydq2ek`bLi~D ze#Z5#s}8dbgLMA=HHLCRKl$@8TlP2o`uV5A+1sTlfVGe2sO&wjDSPB;;gCpvooZc3 zZ!Y!CHL=w0#@#6=ezQ=CFv}S$lbqb~{7lJ3X!C3^;VhTwi&5J_@5hZ|l@g~k`=(Fx zoLGx{U=J-o{?{EGp4G$uA_hMfq>p zU3N3kn0&;k%gbA`?QSwj%?!}sVDC-61oUpMNtl4(hjG@uLD3Ht#hn6h4>MS^b*)y? zB(1IY+_Mja%2(VD=5=%Eh9qpXZG#qZYSLY$-{8V>sr5c888`U1GQe( zX}>pPMS!amSpsu~lwZQ^#MJ>=Bm>OB!J&#nc;W*6a6zzu$RJ?gFn}1G)PWf4=o`60 zj9~@_Fhc_^2m}U!h}#!N{ucmqEf5tP_x}O@qSAu^K;s_@I20xbi}S;T{|^lG-$XKT z!9D;+?KcJ$5C99f79JOgx)OrpaJ;7Y&q7-<3LB&t92pdZj(d`~jt3C(|3L%>VFMyj l;W*T_Fb=GXm4%{z6bg;gL4_?4`?`UH95x6?c(sKu{$G`aDIWj; diff --git a/Common/src/main/resources/pack.mcmeta b/Common/src/main/resources/pack.mcmeta index 760e561..52854ec 100644 --- a/Common/src/main/resources/pack.mcmeta +++ b/Common/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { - "pack": { - "description": "TARDIM: In Control resources", - "pack_format": 6 - } -} + "pack": { + "description": "${mod_name}", + "pack_format": 8 + } +} \ No newline at end of file diff --git a/Common/src/main/resources/tardim_ic.mixins.json b/Common/src/main/resources/tardim_ic.mixins.json new file mode 100644 index 0000000..55703bf --- /dev/null +++ b/Common/src/main/resources/tardim_ic.mixins.json @@ -0,0 +1,20 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "su.a71.tardim_ic.mixin", + "refmap": "${mod_id}.refmap.json", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + ], + "server": [ + "BetterFuelMapMixin", + "BetterFuelStorageMixin", + "JammerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} + diff --git a/Fabric/build.gradle b/Fabric/build.gradle index 5196415..52fa666 100644 --- a/Fabric/build.gradle +++ b/Fabric/build.gradle @@ -1,36 +1,32 @@ plugins { - id 'fabric-loom' version '0.12-SNAPSHOT' - id 'maven-publish' + id 'java' id 'idea' + id 'maven-publish' + id 'fabric-loom' +} +base { + archivesName = "${mod_name}-fabric-${minecraft_version}" } - -archivesBaseName = "${mod_name}-fabric-${minecraft_version}" - dependencies { minecraft "com.mojang:minecraft:${minecraft_version}" mappings loom.officialMojangMappings() modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' - implementation project(":Common") + implementation project(":common") - // Blame CC: Restitched for this... - modApi 'com.electronwill.night-config:core:3.6.3' - modApi 'com.electronwill.night-config:toml:3.6.3' - modApi 'org.squiddev:Cobalt:0.5.5' - modImplementation "io.netty:netty-codec-http:4.1.77.Final" - - modImplementation "curse.maven:tardim-531315:4453924" - //modImplementation "curse.maven:cc-restitched-462672:3908334" - //.. maybe? - modApi "curse.maven:cc-restitched-462672:3908334" - modCompileOnly "curse.maven:cc-restitched-462672:3908334" - - // Create! - modCompileOnly "curse.maven:create-fabric-624165:4597892" + // Obfuscation forced my hand, TARDIM will be here for now :/ + modImplementation(files("/Users/andreynikitin/Downloads/tardim.jar")) + modCompileOnly("cc.tweaked:cc-tweaked-$minecraft_version-fabric-api:$cc_version") } loom { + if (project(":common").file("src/main/resources/${mod_id}.accesswidener").exists()) { + accessWidenerPath.set(project(":common").file("src/main/resources/${mod_id}.accesswidener")) + } + mixin { + defaultRefmapName.set("${mod_id}.refmap.json") + } runs { client { client() @@ -47,30 +43,27 @@ loom { } } - -processResources { - from project(":Common").sourceSets.main.resources - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } +tasks.withType(JavaCompile).configureEach { + source(project(":common").sourceSets.main.allSource) +} +tasks.withType(Javadoc).configureEach { + source(project(":common").sourceSets.main.allJava) +} +tasks.named("sourcesJar", Jar) { + from(project(":common").sourceSets.main.allSource) } -tasks.withType(JavaCompile) { - source(project(":Common").sourceSets.main.allSource) +processResources { + from project(":common").sourceSets.main.resources } publishing { publications { mavenJava(MavenPublication) { - groupId project.group - artifactId project.archivesBaseName - version project.version + artifactId base.archivesName.get() from components.java } } - repositories { maven { url "file://" + System.getenv("local_maven") diff --git a/Fabric/src/main/java/com/example/examplemod/ExampleMod.java b/Fabric/src/main/java/com/example/examplemod/ExampleMod.java new file mode 100644 index 0000000..e53f1a7 --- /dev/null +++ b/Fabric/src/main/java/com/example/examplemod/ExampleMod.java @@ -0,0 +1,18 @@ +package com.example.examplemod; + +import net.fabricmc.api.ModInitializer; + +public class ExampleMod implements ModInitializer { + + @Override + public void onInitialize() { + + // This method is invoked by the Fabric mod loader when it is ready + // to load your mod. You can access Fabric and Common code in this + // project. + + // Use Fabric to bootstrap the Common mod. + Constants.LOG.info("Hello Fabric world!"); + CommonClass.init(); + } +} diff --git a/Fabric/src/main/java/com/example/examplemod/mixin/MixinTitleScreen.java b/Fabric/src/main/java/com/example/examplemod/mixin/MixinTitleScreen.java new file mode 100644 index 0000000..3680cdb --- /dev/null +++ b/Fabric/src/main/java/com/example/examplemod/mixin/MixinTitleScreen.java @@ -0,0 +1,20 @@ +package com.example.examplemod.mixin; + +import com.example.examplemod.Constants; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TitleScreen.class) +public class MixinTitleScreen { + + @Inject(at = @At("HEAD"), method = "init()V") + private void init(CallbackInfo info) { + + Constants.LOG.info("This line is printed by an example mod mixin from Fabric!"); + Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); + } +} \ No newline at end of file diff --git a/Fabric/src/main/java/com/example/examplemod/platform/FabricPlatformHelper.java b/Fabric/src/main/java/com/example/examplemod/platform/FabricPlatformHelper.java new file mode 100644 index 0000000..1a3371f --- /dev/null +++ b/Fabric/src/main/java/com/example/examplemod/platform/FabricPlatformHelper.java @@ -0,0 +1,24 @@ +package com.example.examplemod.platform; + +import com.example.examplemod.platform.services.IPlatformHelper; +import net.fabricmc.loader.api.FabricLoader; + +public class FabricPlatformHelper implements IPlatformHelper { + + @Override + public String getPlatformName() { + return "Fabric"; + } + + @Override + public boolean isModLoaded(String modId) { + + return FabricLoader.getInstance().isModLoaded(modId); + } + + @Override + public boolean isDevelopmentEnvironment() { + + return FabricLoader.getInstance().isDevelopmentEnvironment(); + } +} diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java b/Fabric/src/main/java/su/a71/tardim_ic/TardimInControl.java similarity index 82% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java rename to Fabric/src/main/java/su/a71/tardim_ic/TardimInControl.java index 785cf51..5c88b34 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/TardimInControl.java @@ -1,9 +1,9 @@ -package su.a71.tardim_ic.tardim_ic; +package su.a71.tardim_ic; import net.fabricmc.api.ModInitializer; public class TardimInControl implements ModInitializer { - + @Override public void onInitialize() { Registration.register(); diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/food_machine/FoodMachineBlock.java b/Fabric/src/main/java/su/a71/tardim_ic/blocks/food_machine/FoodMachineBlock.java similarity index 81% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/food_machine/FoodMachineBlock.java rename to Fabric/src/main/java/su/a71/tardim_ic/blocks/food_machine/FoodMachineBlock.java index fb1565e..52cc8e6 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/food_machine/FoodMachineBlock.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/blocks/food_machine/FoodMachineBlock.java @@ -1,19 +1,13 @@ -package su.a71.tardim_ic.tardim_ic.blocks.food_machine; +package su.a71.tardim_ic.blocks.food_machine; import com.swdteam.tardim.common.init.TRDDimensions; import com.swdteam.tardim.common.init.TRDSounds; -import com.swdteam.tardim.network.NetworkHandler; -import com.swdteam.tardim.network.PacketOpenEditGui; import com.swdteam.tardim.tardim.TardimData; import com.swdteam.tardim.tardim.TardimManager; -import com.swdteam.tardim.tileentity.TileEntityBaseTardimPanel; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.game.DebugPackets; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -29,25 +23,20 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MapColor; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; -import su.a71.tardim_ic.tardim_ic.Registration; -import su.a71.tardim_ic.tardim_ic.blocks.redstone_input.RedstoneInputTileEntity; -import su.a71.tardim_ic.tardim_ic.utils.FakePlayer; +import su.a71.tardim_ic.Registration; import javax.annotation.Nullable; -import static net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING; - public class FoodMachineBlock extends HorizontalDirectionalBlock implements EntityBlock { public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; public FoodMachineBlock() { - super(FabricBlockSettings.of(Material.METAL).strength(2, 4).noOcclusion()); // No occlusion? + super(Properties.of().strength(2, 4).noOcclusion().mapColor(MapColor.METAL)); // No occlusion? this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH)); //this.registerDefaultState(this.stateDefinition.any().setValue(HORIZONTAL_FACING, Direction.NORTH)); } diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/food_machine/FoodMachineTileEntity.java b/Fabric/src/main/java/su/a71/tardim_ic/blocks/food_machine/FoodMachineTileEntity.java similarity index 91% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/food_machine/FoodMachineTileEntity.java rename to Fabric/src/main/java/su/a71/tardim_ic/blocks/food_machine/FoodMachineTileEntity.java index 272b893..fbe304f 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/food_machine/FoodMachineTileEntity.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/blocks/food_machine/FoodMachineTileEntity.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.blocks.food_machine; +package su.a71.tardim_ic.blocks.food_machine; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -7,7 +7,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import su.a71.tardim_ic.tardim_ic.Registration; +import su.a71.tardim_ic.Registration; import java.util.UUID; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/redstone_input/RedstoneInputBlock.java b/Fabric/src/main/java/su/a71/tardim_ic/blocks/redstone_input/RedstoneInputBlock.java similarity index 98% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/redstone_input/RedstoneInputBlock.java rename to Fabric/src/main/java/su/a71/tardim_ic/blocks/redstone_input/RedstoneInputBlock.java index 99ed818..2b572e5 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/redstone_input/RedstoneInputBlock.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/blocks/redstone_input/RedstoneInputBlock.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.blocks.redstone_input; +package su.a71.tardim_ic.blocks.redstone_input; import com.swdteam.tardim.common.block.BlockBaseTardimPanel; import com.swdteam.tardim.common.init.TRDDimensions; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/redstone_input/RedstoneInputTileEntity.java b/Fabric/src/main/java/su/a71/tardim_ic/blocks/redstone_input/RedstoneInputTileEntity.java similarity index 94% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/redstone_input/RedstoneInputTileEntity.java rename to Fabric/src/main/java/su/a71/tardim_ic/blocks/redstone_input/RedstoneInputTileEntity.java index f75390c..4943711 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/redstone_input/RedstoneInputTileEntity.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/blocks/redstone_input/RedstoneInputTileEntity.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.blocks.redstone_input; +package su.a71.tardim_ic.blocks.redstone_input; import com.swdteam.tardim.tileentity.TileEntityBaseTardimPanel; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/roundels/roundels.txt b/Fabric/src/main/java/su/a71/tardim_ic/blocks/roundels/roundels.txt similarity index 100% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/blocks/roundels/roundels.txt rename to Fabric/src/main/java/su/a71/tardim_ic/blocks/roundels/roundels.txt diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandCloisterBell.java b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandCloisterBell.java similarity index 98% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandCloisterBell.java rename to Fabric/src/main/java/su/a71/tardim_ic/command/CommandCloisterBell.java index eb02775..028d439 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandCloisterBell.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandCloisterBell.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.command; +package su.a71.tardim_ic.command; import com.swdteam.tardim.common.command.tardim.CommandTardimBase; import com.swdteam.tardim.common.command.tardim.ICommand; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListBiomes.java b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandListBiomes.java similarity index 98% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListBiomes.java rename to Fabric/src/main/java/su/a71/tardim_ic/command/CommandListBiomes.java index 146ac06..1dda83c 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListBiomes.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandListBiomes.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.command; +package su.a71.tardim_ic.command; import com.swdteam.tardim.common.command.tardim.CommandTardimBase; import com.swdteam.tardim.common.command.tardim.ICommand; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListDimensions.java b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandListDimensions.java similarity index 97% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListDimensions.java rename to Fabric/src/main/java/su/a71/tardim_ic/command/CommandListDimensions.java index d5cebda..8cd5efe 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListDimensions.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandListDimensions.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.command; +package su.a71.tardim_ic.command; import com.swdteam.tardim.common.command.tardim.CommandTardimBase; import com.swdteam.tardim.common.command.tardim.ICommand; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandModemTransmit.java similarity index 98% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java rename to Fabric/src/main/java/su/a71/tardim_ic/command/CommandModemTransmit.java index f7472bc..7061ea0 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandModemTransmit.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.command; +package su.a71.tardim_ic.command; // This will be added whenever I manage to convince TARDIM devs to make CommandManager.register public // 13.04.23 ITS ALIVE diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandSender.java similarity index 95% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java rename to Fabric/src/main/java/su/a71/tardim_ic/command/CommandSender.java index 89af0db..df3b10f 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/command/CommandSender.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.command; +package su.a71.tardim_ic.command; import dan200.computercraft.api.network.IPacketSender; import net.minecraft.core.BlockPos; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/FakeTardimPeripheralTileEntity.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/FakeTardimPeripheralTileEntity.java similarity index 97% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/FakeTardimPeripheralTileEntity.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/FakeTardimPeripheralTileEntity.java index 173e76e..99cadbf 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/FakeTardimPeripheralTileEntity.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/FakeTardimPeripheralTileEntity.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat; +package su.a71.tardim_ic.computercraft_compat; import com.swdteam.tardim.tardim.TardimData; import com.swdteam.tardim.tardim.TardimManager; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/ITardimPeripheralTileEntity.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/ITardimPeripheralTileEntity.java similarity index 89% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/ITardimPeripheralTileEntity.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/ITardimPeripheralTileEntity.java index 3485898..feca725 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/ITardimPeripheralTileEntity.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/ITardimPeripheralTileEntity.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat; +package su.a71.tardim_ic.computercraft_compat; import com.swdteam.tardim.tardim.TardimData; import net.minecraft.core.BlockPos; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/TardimPeripheralProvider.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/TardimPeripheralProvider.java similarity index 73% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/TardimPeripheralProvider.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/TardimPeripheralProvider.java index 9561de3..316e12c 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/TardimPeripheralProvider.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/TardimPeripheralProvider.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat; +package su.a71.tardim_ic.computercraft_compat; import com.swdteam.tardim.common.block.BlockFuelStorage; import com.swdteam.tardim.common.block.BlockRotor; @@ -10,11 +10,11 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import org.jetbrains.annotations.NotNull; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals.FuelStoragePeripheral; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals.TardimScannerPeripheral; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals.TimeRotorPeripheral; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.blocks.digital_interface.DigitalInterfaceBlock; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals.DigitalInterfacePeripheral; +import su.a71.tardim_ic.computercraft_compat.peripherals.TimeRotorPeripheral; +import su.a71.tardim_ic.computercraft_compat.peripherals.FuelStoragePeripheral; +import su.a71.tardim_ic.computercraft_compat.peripherals.TardimScannerPeripheral; +import su.a71.tardim_ic.computercraft_compat.blocks.digital_interface.DigitalInterfaceBlock; +import su.a71.tardim_ic.computercraft_compat.peripherals.DigitalInterfacePeripheral; public class TardimPeripheralProvider implements IPeripheralProvider { @Override diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceBlock.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceBlock.java similarity index 91% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceBlock.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceBlock.java index 6aec966..72ab616 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceBlock.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceBlock.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat.blocks.digital_interface; +package su.a71.tardim_ic.computercraft_compat.blocks.digital_interface; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Block; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceTileEntity.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceTileEntity.java similarity index 85% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceTileEntity.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceTileEntity.java index d7f39e4..0aefa98 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceTileEntity.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/blocks/digital_interface/DigitalInterfaceTileEntity.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat.blocks.digital_interface; +package su.a71.tardim_ic.computercraft_compat.blocks.digital_interface; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/DigitalInterfacePeripheral.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/DigitalInterfacePeripheral.java similarity index 98% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/DigitalInterfacePeripheral.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/DigitalInterfacePeripheral.java index 8825990..f12797a 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/DigitalInterfacePeripheral.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/DigitalInterfacePeripheral.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals; +package su.a71.tardim_ic.computercraft_compat.peripherals; import com.swdteam.tardim.common.command.tardim.CommandTravel; import com.swdteam.tardim.common.data.DimensionMapReloadListener; @@ -20,6 +20,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -34,10 +35,10 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.phys.Vec3; -import su.a71.tardim_ic.tardim_ic.Registration; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.FakeTardimPeripheralTileEntity; -import su.a71.tardim_ic.tardim_ic.utils.FakePlayer; -import static su.a71.tardim_ic.tardim_ic.Registration.PERSONAL_JAMMER; +import su.a71.tardim_ic.computercraft_compat.FakeTardimPeripheralTileEntity; +import su.a71.tardim_ic.Registration; +import su.a71.tardim_ic.utils.FakePlayer; +import static su.a71.tardim_ic.Registration.PERSONAL_JAMMER; import javax.annotation.Nonnull; import java.util.*; @@ -761,7 +762,7 @@ public class DigitalInterfacePeripheral extends TardimPeripheral implements IPer @LuaFunction(mainThread = true) public final ObjectLuaTable getBiomes() throws LuaException { Map biomes = new HashMap<>(); - Registry biomeRegistry = tileEntity.getLevel().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); + Registry biomeRegistry = tileEntity.getLevel().registryAccess().registryOrThrow(Registries.BIOME); Iterator biome_it = biomeRegistry.keySet().iterator(); int i = 0; while (biome_it.hasNext()) { diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/FuelStoragePeripheral.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/FuelStoragePeripheral.java similarity index 93% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/FuelStoragePeripheral.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/FuelStoragePeripheral.java index 9a22a02..085f8a3 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/FuelStoragePeripheral.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/FuelStoragePeripheral.java @@ -1,11 +1,11 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals; +package su.a71.tardim_ic.computercraft_compat.peripherals; import com.swdteam.tardim.tardim.TardimData; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.peripheral.IPeripheral; import net.minecraft.world.phys.Vec3; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.FakeTardimPeripheralTileEntity; +import su.a71.tardim_ic.computercraft_compat.FakeTardimPeripheralTileEntity; import javax.annotation.Nonnull; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TardimPeripheral.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TardimPeripheral.java similarity index 94% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TardimPeripheral.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TardimPeripheral.java index 4dee2ed..539412e 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TardimPeripheral.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TardimPeripheral.java @@ -1,10 +1,10 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals; +package su.a71.tardim_ic.computercraft_compat.peripherals; import com.swdteam.tardim.tardim.TardimData; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.ITardimPeripheralTileEntity; +import su.a71.tardim_ic.computercraft_compat.ITardimPeripheralTileEntity; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TardimScannerPeripheral.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TardimScannerPeripheral.java similarity index 95% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TardimScannerPeripheral.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TardimScannerPeripheral.java index e4caaee..99b5bef 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TardimScannerPeripheral.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TardimScannerPeripheral.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals; +package su.a71.tardim_ic.computercraft_compat.peripherals; import com.swdteam.tardim.common.init.TardimRegistry; import com.swdteam.tardim.tardim.TardimData; @@ -7,11 +7,12 @@ import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.ObjectLuaTable; import dan200.computercraft.api.peripheral.IPeripheral; import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.players.PlayerList; import net.minecraft.world.level.biome.Biome; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.FakeTardimPeripheralTileEntity; +import su.a71.tardim_ic.computercraft_compat.FakeTardimPeripheralTileEntity; import javax.annotation.Nonnull; import java.util.HashMap; @@ -120,7 +121,7 @@ public class TardimScannerPeripheral extends TardimPeripheral implements IPeriph @LuaFunction(mainThread = true) public final ObjectLuaTable getBiomes() throws LuaException { Map biomes = new HashMap<>(); - Registry biomeRegistry = tileEntity.getLevel().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); + Registry biomeRegistry = tileEntity.getLevel().registryAccess().registryOrThrow(Registries.BIOME); Iterator biome_it = biomeRegistry.keySet().iterator(); int i = 0; while (biome_it.hasNext()) { diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TimeRotorPeripheral.java b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TimeRotorPeripheral.java similarity index 96% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TimeRotorPeripheral.java rename to Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TimeRotorPeripheral.java index 7a2d622..73dcd2d 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/computercraft_compat/peripherals/TimeRotorPeripheral.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/computercraft_compat/peripherals/TimeRotorPeripheral.java @@ -1,11 +1,11 @@ -package su.a71.tardim_ic.tardim_ic.computercraft_compat.peripherals; +package su.a71.tardim_ic.computercraft_compat.peripherals; import com.swdteam.tardim.tardim.TardimData; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.ObjectLuaTable; import dan200.computercraft.api.peripheral.IPeripheral; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.FakeTardimPeripheralTileEntity; +import su.a71.tardim_ic.computercraft_compat.FakeTardimPeripheralTileEntity; import javax.annotation.Nonnull; import java.util.Map; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/cartridge_loader/temp_ideas.txt b/Fabric/src/main/java/su/a71/tardim_ic/display_source/cartridge_loader/temp_ideas.txt similarity index 100% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/cartridge_loader/temp_ideas.txt rename to Fabric/src/main/java/su/a71/tardim_ic/display_source/cartridge_loader/temp_ideas.txt diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/dock/temp_ideas.txt b/Fabric/src/main/java/su/a71/tardim_ic/display_source/dock/temp_ideas.txt similarity index 100% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/dock/temp_ideas.txt rename to Fabric/src/main/java/su/a71/tardim_ic/display_source/dock/temp_ideas.txt diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/fuel_storage/FuelLevelDisplaySource.java b/Fabric/src/main/java/su/a71/tardim_ic/display_source/fuel_storage/FuelLevelDisplaySource.java similarity index 96% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/fuel_storage/FuelLevelDisplaySource.java rename to Fabric/src/main/java/su/a71/tardim_ic/display_source/fuel_storage/FuelLevelDisplaySource.java index 1820305..f82cb14 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/fuel_storage/FuelLevelDisplaySource.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/display_source/fuel_storage/FuelLevelDisplaySource.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.create_compat.display_source.fuel_storage; +package su.a71.tardim_ic.display_source.fuel_storage; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/fuel_storage/RequiredFuelDisplaySource.java b/Fabric/src/main/java/su/a71/tardim_ic/display_source/fuel_storage/RequiredFuelDisplaySource.java similarity index 96% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/fuel_storage/RequiredFuelDisplaySource.java rename to Fabric/src/main/java/su/a71/tardim_ic/display_source/fuel_storage/RequiredFuelDisplaySource.java index 31fcd5c..336d08f 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/fuel_storage/RequiredFuelDisplaySource.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/display_source/fuel_storage/RequiredFuelDisplaySource.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.create_compat.display_source.fuel_storage; +package su.a71.tardim_ic.display_source.fuel_storage; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.source.NumericSingleLineDisplaySource; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/scanner/temp_ideas.txt b/Fabric/src/main/java/su/a71/tardim_ic/display_source/scanner/temp_ideas.txt similarity index 100% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/scanner/temp_ideas.txt rename to Fabric/src/main/java/su/a71/tardim_ic/display_source/scanner/temp_ideas.txt diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/time_rotor/temp_ideas.txt b/Fabric/src/main/java/su/a71/tardim_ic/display_source/time_rotor/temp_ideas.txt similarity index 100% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/create_compat/display_source/time_rotor/temp_ideas.txt rename to Fabric/src/main/java/su/a71/tardim_ic/display_source/time_rotor/temp_ideas.txt diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/jammer/PersonalJammerMaterial.java b/Fabric/src/main/java/su/a71/tardim_ic/jammer/PersonalJammerMaterial.java similarity index 97% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/jammer/PersonalJammerMaterial.java rename to Fabric/src/main/java/su/a71/tardim_ic/jammer/PersonalJammerMaterial.java index e9b6adf..d216899 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/jammer/PersonalJammerMaterial.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/jammer/PersonalJammerMaterial.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.jammer; +package su.a71.tardim_ic.jammer; import net.minecraft.sounds.SoundEvent; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/BetterFuelMapMixin.java b/Fabric/src/main/java/su/a71/tardim_ic/mixin/BetterFuelMapMixin.java similarity index 72% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/BetterFuelMapMixin.java rename to Fabric/src/main/java/su/a71/tardim_ic/mixin/BetterFuelMapMixin.java index bbaba40..5fa64cf 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/BetterFuelMapMixin.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/mixin/BetterFuelMapMixin.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.mixin; +package su.a71.tardim_ic.mixin; import com.swdteam.tardim.tardim.TardimManager; import com.swdteam.tardim.tileentity.TileEntityFuelStorage; @@ -10,14 +10,22 @@ import org.spongepowered.asm.mixin.Overwrite; import static com.swdteam.tardim.tardim.TardimManager.FUEL_MAP; // This mixin aims to make TARDIM fuel system less awful by allowing users to put standard furance fuel into it. -@Mixin(value = TardimManager.class, remap = false) +@Mixin(value = TardimManager.class, remap = true) public class BetterFuelMapMixin { + /** + * @author Andrew_7_1 + * @reason The original function is too small to bother with insert + */ @Overwrite public static boolean isFuel(Item i) { return FUEL_MAP.containsKey(i) || AbstractFurnaceBlockEntity.getFuel().containsKey(i); } + /** + * @author Andrew_7_1 + * @reason The code change is drastic enough to warrant an overwrite + */ @Overwrite public static double getFuel(Item i) { if (!isFuel(i)) { @@ -30,13 +38,4 @@ public class BetterFuelMapMixin { else return AbstractFurnaceBlockEntity.getFuel().get(i) / 8000.0; // Adapt with coal's 1600 ticks -> 0.2 fuel } - -// //@Inject(method = "getFuel(Lnet/minecraft/world/item/Item;)V", at = @At("TAIL")) -// @Overwrite -// public static void getFuel(Item i, CallbackInfo info) { -// LOG.info("We're in #TARDIM"); -// if (AbstractFurnaceBlockEntity.getFuel().containsKey(i)) { -// -// } -// } } \ No newline at end of file diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/BetterFuelStorageMixin.java b/Fabric/src/main/java/su/a71/tardim_ic/mixin/BetterFuelStorageMixin.java similarity index 94% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/BetterFuelStorageMixin.java rename to Fabric/src/main/java/su/a71/tardim_ic/mixin/BetterFuelStorageMixin.java index a685dea..8e0fd7f 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/BetterFuelStorageMixin.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/mixin/BetterFuelStorageMixin.java @@ -1,11 +1,10 @@ -package su.a71.tardim_ic.tardim_ic.mixin; +package su.a71.tardim_ic.mixin; import com.swdteam.tardim.common.block.BlockFuelStorage; import com.swdteam.tardim.common.init.TRDDimensions; import com.swdteam.tardim.tardim.TardimData; import com.swdteam.tardim.tardim.TardimManager; import com.swdteam.tardim.tileentity.TileEntityFuelStorage; -import net.fabricmc.loader.impl.util.log.Log; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.BucketItem; @@ -23,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import static su.a71.tardim_ic.tardim_ic.Constants.LOG; +import static su.a71.tardim_ic.Constants.LOG; @Mixin(value = TileEntityFuelStorage.class, remap = false) public class BetterFuelStorageMixin { diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/JammerMixin.java b/Fabric/src/main/java/su/a71/tardim_ic/mixin/JammerMixin.java similarity index 98% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/JammerMixin.java rename to Fabric/src/main/java/su/a71/tardim_ic/mixin/JammerMixin.java index 129451c..c4441a1 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/JammerMixin.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/mixin/JammerMixin.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.mixin; +package su.a71.tardim_ic.mixin; import com.swdteam.tardim.common.command.tardim.CommandLocate; import com.swdteam.tardim.common.command.tardim.CommandTardimBase; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/platform/FabricPlatformHelper.java b/Fabric/src/main/java/su/a71/tardim_ic/platform/FabricPlatformHelper.java new file mode 100644 index 0000000..5d6ad25 --- /dev/null +++ b/Fabric/src/main/java/su/a71/tardim_ic/platform/FabricPlatformHelper.java @@ -0,0 +1,24 @@ +package su.a71.tardim_ic.platform; + +import com.example.examplemod.platform.services.IPlatformHelper; +import net.fabricmc.loader.api.FabricLoader; + +public class FabricPlatformHelper implements IPlatformHelper { + + @Override + public String getPlatformName() { + return "Fabric"; + } + + @Override + public boolean isModLoaded(String modId) { + + return FabricLoader.getInstance().isModLoaded(modId); + } + + @Override + public boolean isDevelopmentEnvironment() { + + return FabricLoader.getInstance().isDevelopmentEnvironment(); + } +} diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/soviet_chronobox/SovietChronoboxTileEntity.java b/Fabric/src/main/java/su/a71/tardim_ic/soviet_chronobox/SovietChronoboxTileEntity.java similarity index 90% rename from Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/soviet_chronobox/SovietChronoboxTileEntity.java rename to Fabric/src/main/java/su/a71/tardim_ic/soviet_chronobox/SovietChronoboxTileEntity.java index 0a81513..5b225fb 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/soviet_chronobox/SovietChronoboxTileEntity.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/soviet_chronobox/SovietChronoboxTileEntity.java @@ -1,4 +1,4 @@ -package su.a71.tardim_ic.tardim_ic.soviet_chronobox; +package su.a71.tardim_ic.soviet_chronobox; import com.swdteam.tardim.common.init.TRDTiles; import com.swdteam.tardim.tileentity.TileEntityTardim; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java deleted file mode 100644 index d11e342..0000000 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java +++ /dev/null @@ -1,78 +0,0 @@ -package su.a71.tardim_ic.tardim_ic; - -import net.fabricmc.loader.api.FabricLoader; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.*; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.core.Registry; - -import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; -import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; - -import su.a71.tardim_ic.tardim_ic.blocks.food_machine.FoodMachineBlock; -import su.a71.tardim_ic.tardim_ic.blocks.food_machine.FoodMachineTileEntity; -import su.a71.tardim_ic.tardim_ic.jammer.PersonalJammerMaterial; -import su.a71.tardim_ic.tardim_ic.blocks.redstone_input.RedstoneInputBlock; -import su.a71.tardim_ic.tardim_ic.blocks.redstone_input.RedstoneInputTileEntity; -import su.a71.tardim_ic.tardim_ic.registration.CommandInit; -import su.a71.tardim_ic.tardim_ic.registration.ComputerCraftCompat; -import su.a71.tardim_ic.tardim_ic.registration.CreateCompat; -import su.a71.tardim_ic.tardim_ic.registration.Exteriors; - -public class Registration { - // Blocks - public static final Block REDSTONE_TARDIM_INPUT = new RedstoneInputBlock(); - public static final Block FOOD_MACHINE = new FoodMachineBlock(); - - // Tile Entities - public static final BlockEntityType REDSTONE_TARDIM_INPUT_TILEENTITY = Registry.register( - Registry.BLOCK_ENTITY_TYPE, - new ResourceLocation("tardim_ic", "redstone_tardim_input"), - FabricBlockEntityTypeBuilder.create(RedstoneInputTileEntity::new, REDSTONE_TARDIM_INPUT).build() - ); - - public static final BlockEntityType FOOD_MACHINE_TILEENTITY = Registry.register( - Registry.BLOCK_ENTITY_TYPE, - new ResourceLocation("tardim_ic", "food_machine"), - FabricBlockEntityTypeBuilder.create(FoodMachineTileEntity::new, FOOD_MACHINE).build() - ); - - public static final CreativeModeTab TARDIM_IC_TAB = FabricItemGroupBuilder - .create(new ResourceLocation("tardim_ic")) - .icon(() -> new ItemStack(REDSTONE_TARDIM_INPUT)) - .build(); - - // Cloister bell - public static final ResourceLocation CLOISTER_SOUND = new ResourceLocation("tardim_ic:cloister"); - public static SoundEvent CLOISTER_SOUND_EVENT = new SoundEvent(CLOISTER_SOUND); - - public static final ArmorMaterial PERSONAL_JAMMER_MATERIAL = new PersonalJammerMaterial(); - public static final Item PERSONAL_JAMMER = new ArmorItem(PERSONAL_JAMMER_MATERIAL, EquipmentSlot.CHEST, new Item.Properties().tab(TARDIM_IC_TAB)); - - // Register our stuff - public static void register() { - Registry.register(Registry.ITEM, new ResourceLocation(Constants.MOD_ID, "personal_jammer"), PERSONAL_JAMMER); - - if (FabricLoader.getInstance().isModLoaded("computercraft")) { - ComputerCraftCompat.register(); // Register ComputerCraft-related features - } - if (FabricLoader.getInstance().isModLoaded("create")) { - CreateCompat.register(); // Register Create-related features - } - Exteriors.register(); // Register custom TARDIM exteriors - - Registry.register(Registry.BLOCK, new ResourceLocation(Constants.MOD_ID, "redstone_tardim_input"), REDSTONE_TARDIM_INPUT); - Registry.register(Registry.ITEM, new ResourceLocation(Constants.MOD_ID, "redstone_tardim_input"), new BlockItem(REDSTONE_TARDIM_INPUT, new Item.Properties().tab(TARDIM_IC_TAB))); - - Registry.register(Registry.BLOCK, new ResourceLocation(Constants.MOD_ID, "food_machine"), FOOD_MACHINE); - Registry.register(Registry.ITEM, new ResourceLocation(Constants.MOD_ID, "food_machine"), new BlockItem(FOOD_MACHINE, new Item.Properties().tab(TARDIM_IC_TAB))); - - Registry.register(Registry.SOUND_EVENT, CLOISTER_SOUND, CLOISTER_SOUND_EVENT); - - CommandInit.init(); - } -} \ No newline at end of file diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CommandInit.java b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CommandInit.java index 406069b..66254f7 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CommandInit.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CommandInit.java @@ -3,9 +3,9 @@ package su.a71.tardim_ic.tardim_ic.registration; import com.swdteam.tardim.common.init.CommandManager; -import su.a71.tardim_ic.tardim_ic.command.CommandCloisterBell; -import su.a71.tardim_ic.tardim_ic.command.CommandListBiomes; -import su.a71.tardim_ic.tardim_ic.command.CommandListDimensions; +import su.a71.tardim_ic.command.CommandCloisterBell; +import su.a71.tardim_ic.command.CommandListBiomes; +import su.a71.tardim_ic.command.CommandListDimensions; public class CommandInit { public static void init() { diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/ComputerCraftCompat.java b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/ComputerCraftCompat.java index dd634cd..1d7a287 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/ComputerCraftCompat.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/ComputerCraftCompat.java @@ -11,10 +11,10 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import su.a71.tardim_ic.tardim_ic.Constants; import su.a71.tardim_ic.tardim_ic.Registration; -import su.a71.tardim_ic.tardim_ic.command.CommandModemTransmit; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.TardimPeripheralProvider; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.blocks.digital_interface.DigitalInterfaceBlock; -import su.a71.tardim_ic.tardim_ic.computercraft_compat.blocks.digital_interface.DigitalInterfaceTileEntity; +import su.a71.tardim_ic.command.CommandModemTransmit; +import su.a71.tardim_ic.computercraft_compat.TardimPeripheralProvider; +import su.a71.tardim_ic.computercraft_compat.blocks.digital_interface.DigitalInterfaceBlock; +import su.a71.tardim_ic.computercraft_compat.blocks.digital_interface.DigitalInterfaceTileEntity; public class ComputerCraftCompat { public static final Block DIGITAL_TARDIM_INTERFACE = new DigitalInterfaceBlock(); diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CreateCompat.java b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CreateCompat.java index 120d1a1..c5198a7 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CreateCompat.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CreateCompat.java @@ -4,8 +4,8 @@ package su.a71.tardim_ic.tardim_ic.registration; import com.simibubi.create.content.redstone.displayLink.AllDisplayBehaviours; import net.minecraft.resources.ResourceLocation; import su.a71.tardim_ic.tardim_ic.Constants; -import su.a71.tardim_ic.tardim_ic.create_compat.display_source.fuel_storage.FuelLevelDisplaySource; -import su.a71.tardim_ic.tardim_ic.create_compat.display_source.fuel_storage.RequiredFuelDisplaySource; +import su.a71.tardim_ic.display_source.fuel_storage.FuelLevelDisplaySource; +import su.a71.tardim_ic.display_source.fuel_storage.RequiredFuelDisplaySource; import static com.swdteam.tardim.common.init.TRDTiles.TILE_FUEL_STORAGE; diff --git a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/Exteriors.java b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/Exteriors.java index dbf7e0e..2f2cd60 100644 --- a/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/Exteriors.java +++ b/Fabric/src/main/java/su/a71/tardim_ic/tardim_ic/registration/Exteriors.java @@ -21,7 +21,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import su.a71.tardim_ic.tardim_ic.Constants; -import su.a71.tardim_ic.tardim_ic.soviet_chronobox.SovietChronoboxTileEntity; +import su.a71.tardim_ic.soviet_chronobox.SovietChronoboxTileEntity; public class Exteriors { // Soviet Chronobox diff --git a/Fabric/src/main/resources/META-INF/services/com.example.examplemod.platform.services.IPlatformHelper b/Fabric/src/main/resources/META-INF/services/com.example.examplemod.platform.services.IPlatformHelper new file mode 100644 index 0000000..30c54ee --- /dev/null +++ b/Fabric/src/main/resources/META-INF/services/com.example.examplemod.platform.services.IPlatformHelper @@ -0,0 +1 @@ +com.example.examplemod.platform.FabricPlatformHelper \ No newline at end of file diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json index 38fb260..bdeb9b5 100644 --- a/Fabric/src/main/resources/fabric.mod.json +++ b/Fabric/src/main/resources/fabric.mod.json @@ -2,40 +2,35 @@ "schemaVersion": 1, "id": "tardim_ic", "version": "${version}", - - "name": "Tardim: In Control", - "description": "All of time and space, now automated and improved. This mod aims to make TARDIM even better.", + "name": "${mod_name}", + "description": "All of time and space, now automated and improved. This mod aims to improve your TARDIM experience", "authors": [ - "Andrew_7_1" + "${mod_author}" ], "contact": { - "sources": "https://github.com/Andrew-71/tardim-in-control" + "homepage": "https://tardim.a71.su/", + "sources": "https://github.com/Andrew-71/tardim-in-control" }, - "license": "MIT", - "icon": "icon.png", - + "icon": "assets/tardim_ic/icon.png", "environment": "*", "entrypoints": { - "main": [ - "su.a71.tardim_ic.tardim_ic.TardimInControl" - ] + "main": [ + "su.a71.tardim_ic.TardimInControl" + ] }, - "mixins": [ - "mixins.tardim_ic.json" - ], - + "mixins": [ + "tardim_ic.mixins.json", + "tardim_ic.fabric.mixins.json" + ], "depends": { - "fabricloader": ">=0.14.10", - "fabric": "*", - "minecraft": "1.19.x", - "java": ">=17", - "tardim": ">=1.2.2" + "fabricloader": ">=0.14", + "fabric": "*", + "minecraft": "1.20", + "java": ">=17", + "tardim": ">=1.2.2" }, - - "suggests": { - "computercraft": ">=1.101.0", - "create": ">=0.5.1" - } - } - \ No newline at end of file + "suggests": { + "computercraft": ">=${cc_version}" + } +} \ No newline at end of file diff --git a/Fabric/src/main/resources/mixins.tardim_ic.json b/Fabric/src/main/resources/mixins.tardim_ic.json deleted file mode 100644 index 1335fd3..0000000 --- a/Fabric/src/main/resources/mixins.tardim_ic.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "required": true, - "package": "su.a71.tardim_ic.tardim_ic.mixin", - "compatibilityLevel": "JAVA_17", - "refmap": "refmap.tardim_ic.json", - "mixins": [ - "BetterFuelMapMixin", - "BetterFuelStorageMixin", - "JammerMixin" - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - }, - "minVersion": "0.8.4" -} \ No newline at end of file diff --git a/Fabric/src/main/resources/tardim_ic.fabric.mixins.json b/Fabric/src/main/resources/tardim_ic.fabric.mixins.json new file mode 100644 index 0000000..ad174ea --- /dev/null +++ b/Fabric/src/main/resources/tardim_ic.fabric.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.example.examplemod.mixin", + "refmap": "${mod_id}.refmap.json", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + "MixinTitleScreen" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } + } + diff --git a/Forge/build.gradle b/Forge/build.gradle index 35c37d8..562ac05 100644 --- a/Forge/build.gradle +++ b/Forge/build.gradle @@ -1,29 +1,27 @@ -buildscript { - repositories { - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - classpath 'org.spongepowered:mixingradle:0.7.+' - } +plugins { + id 'idea' + id 'maven-publish' + id 'net.minecraftforge.gradle' + id 'org.spongepowered.mixin' } -apply plugin: 'java' -apply plugin: 'net.minecraftforge.gradle' -apply plugin: 'eclipse' -apply plugin: 'maven-publish' -apply plugin: 'org.spongepowered.mixin' +base { + archivesName = "${mod_name}-forge-${minecraft_version}" +} +mixin { + add(sourceSets.main, "${mod_id}.refmap.json") -archivesBaseName = "${mod_name}-forge-${minecraft_version}" + config("${mod_id}.mixins.json") + config("${mod_id}.forge.mixins.json") +} minecraft { mappings channel: 'official', version: minecraft_version - - if (project.hasProperty('forge_ats_enabled') && project.findProperty('forge_ats_enabled').toBoolean()) { - // This location is hardcoded in Forge and can not be changed. - // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 + + // Automatically enable forge AccessTransformers if the file exists + // This location is hardcoded in Forge and can not be changed. + // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 + if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) { accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - project.logger.debug('Forge Access Transformers are enabled for this project.') } runs { @@ -36,7 +34,7 @@ minecraft { mods { modClientRun { source sourceSets.main - source project(":Common").sourceSets.main + source project(":common").sourceSets.main } } } @@ -50,7 +48,7 @@ minecraft { mods { modServerRun { source sourceSets.main - source project(":Common").sourceSets.main + source project(":common").sourceSets.main } } } @@ -65,48 +63,43 @@ minecraft { mods { modDataRun { source sourceSets.main - source project(":Common").sourceSets.main + source project(":common").sourceSets.main } } } } } -mixin { - add sourceSets.main, 'refmap.tardim_ic.json' - config 'mixins.tardim_ic.json' -} - sourceSets.main.resources.srcDir 'src/generated/resources' dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - compileOnly project(":Common") - - implementation fg.deobf("curse.maven:tardim-531315:4453925") - implementation fg.deobf("org.squiddev:cc-tweaked-1.19.1:${cc_version}") - - annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' + compileOnly project(":common") + annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT:processor") } -tasks.withType(JavaCompile) { - source(project(":Common").sourceSets.main.allSource) +tasks.withType(JavaCompile).configureEach { + source(project(":common").sourceSets.main.allSource) +} +tasks.withType(Javadoc).configureEach { + source(project(":common").sourceSets.main.allJava) +} +tasks.named("sourcesJar", Jar) { + from(project(":common").sourceSets.main.allSource) } processResources { - from project(":Common").sourceSets.main.resources + from project(":common").sourceSets.main.resources } - jar.finalizedBy('reobfJar') publishing { publications { mavenJava(MavenPublication) { - groupId project.group - artifactId project.archivesBaseName - version project.version - artifact jar + artifactId base.archivesName.get() + from components.java + fg.component(it) } } repositories { diff --git a/Forge/src/main/java/com/example/examplemod/ExampleMod.java b/Forge/src/main/java/com/example/examplemod/ExampleMod.java new file mode 100644 index 0000000..06f3628 --- /dev/null +++ b/Forge/src/main/java/com/example/examplemod/ExampleMod.java @@ -0,0 +1,19 @@ +package com.example.examplemod; + +import net.minecraftforge.fml.common.Mod; + +@Mod(Constants.MOD_ID) +public class ExampleMod { + + public ExampleMod() { + + // This method is invoked by the Forge mod loader when it is ready + // to load your mod. You can access Forge and Common code in this + // project. + + // Use Forge to bootstrap the Common mod. + Constants.LOG.info("Hello Forge world!"); + CommonClass.init(); + + } +} \ No newline at end of file diff --git a/Forge/src/main/java/com/example/examplemod/mixin/MixinTitleScreen.java b/Forge/src/main/java/com/example/examplemod/mixin/MixinTitleScreen.java new file mode 100644 index 0000000..a2e0c4b --- /dev/null +++ b/Forge/src/main/java/com/example/examplemod/mixin/MixinTitleScreen.java @@ -0,0 +1,20 @@ +package com.example.examplemod.mixin; + +import com.example.examplemod.Constants; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TitleScreen.class) +public class MixinTitleScreen { + + @Inject(at = @At("HEAD"), method = "init()V") + private void init(CallbackInfo info) { + + Constants.LOG.info("This line is printed by an example mod mixin from Forge!"); + Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); + } +} \ No newline at end of file diff --git a/Forge/src/main/java/com/example/examplemod/platform/ForgePlatformHelper.java b/Forge/src/main/java/com/example/examplemod/platform/ForgePlatformHelper.java new file mode 100644 index 0000000..22ef9e4 --- /dev/null +++ b/Forge/src/main/java/com/example/examplemod/platform/ForgePlatformHelper.java @@ -0,0 +1,26 @@ +package com.example.examplemod.platform; + +import com.example.examplemod.platform.services.IPlatformHelper; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.loading.FMLLoader; + +public class ForgePlatformHelper implements IPlatformHelper { + + @Override + public String getPlatformName() { + + return "Forge"; + } + + @Override + public boolean isModLoaded(String modId) { + + return ModList.get().isLoaded(modId); + } + + @Override + public boolean isDevelopmentEnvironment() { + + return !FMLLoader.isProduction(); + } +} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java b/Forge/src/main/java/su/a71/tardim_ic/TardiminControl.java similarity index 64% rename from Forge/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java rename to Forge/src/main/java/su/a71/tardim_ic/TardiminControl.java index 170718f..8897bcb 100644 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/TardimInControl.java +++ b/Forge/src/main/java/su/a71/tardim_ic/TardiminControl.java @@ -1,15 +1,10 @@ -package su.a71.tardim_ic.tardim_ic; +package su.a71.tardim_ic; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; -import su.a71.tardim_ic.tardim_ic.registration.CommandInit; -import com.swdteam.tardim.TardimSaveHandler; - -// The value here should match an entry in the META-INF/mods.toml file @Mod(Constants.MOD_ID) public class TardimInControl { - public TardimInControl() { Registration.register(); diff --git a/Forge/src/main/java/su/a71/tardim_ic/platform/ForgePlatformHelper.java b/Forge/src/main/java/su/a71/tardim_ic/platform/ForgePlatformHelper.java new file mode 100644 index 0000000..66ca310 --- /dev/null +++ b/Forge/src/main/java/su/a71/tardim_ic/platform/ForgePlatformHelper.java @@ -0,0 +1,26 @@ +package su.a71.tardim_ic.platform; + +import com.example.examplemod.platform.services.IPlatformHelper; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.loading.FMLLoader; + +public class ForgePlatformHelper implements IPlatformHelper { + + @Override + public String getPlatformName() { + + return "Forge"; + } + + @Override + public boolean isModLoaded(String modId) { + + return ModList.get().isLoaded(modId); + } + + @Override + public boolean isDevelopmentEnvironment() { + + return !FMLLoader.isProduction(); + } +} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java deleted file mode 100644 index a54e62a..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/Registration.java +++ /dev/null @@ -1,64 +0,0 @@ -package su.a71.tardim_ic.tardim_ic; - -import com.google.common.collect.Sets; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - -import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfaceBlock; -import su.a71.tardim_ic.tardim_ic.digital_interface.DigitalInterfaceTileEntity; -import su.a71.tardim_ic.tardim_ic.redstone_input.RedstoneInputBlock; -import su.a71.tardim_ic.tardim_ic.redstone_input.RedstoneInputTileEntity; - -import java.util.function.Supplier; - -public class Registration { - - public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Constants.MOD_ID); - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Constants.MOD_ID); - public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, Constants.MOD_ID); - public static final DeferredRegister SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, Constants.MOD_ID); - - public static final CreativeModeTab TARDIM_IC_TAB = new CreativeModeTab("tardim_ic") { - @Override - public ItemStack makeIcon() { - return new ItemStack(Registration.DIGITAL_TARDIM_INTERFACE.get()); - } - }; - - // Blocks - private static RegistryObject register(String name, Supplier block) { - RegistryObject registryObject = BLOCKS.register(name, block); - ITEMS.register(name, () -> new BlockItem(registryObject.get(), new Item.Properties().tab(TARDIM_IC_TAB))); - return registryObject; - } - public static final RegistryObject DIGITAL_TARDIM_INTERFACE = register("digital_tardim_interface", DigitalInterfaceBlock::new); - public static final RegistryObject REDSTONE_TARDIM_INPUT = register("redstone_tardim_input", RedstoneInputBlock::new); - - // Tile Entities - public static final RegistryObject> DIGITAL_TARDIM_INTERFACE_TILEENTITY = Registration.BLOCK_ENTITIES.register("digital_tardim_interface", () -> new BlockEntityType<>(DigitalInterfaceTileEntity::new, Sets.newHashSet(DIGITAL_TARDIM_INTERFACE.get()), null)); - public static final RegistryObject> REDSTONE_TARDIM_INPUT_TILEENTITY = Registration.BLOCK_ENTITIES.register("redstone_tardim_input", () -> new BlockEntityType<>(RedstoneInputTileEntity::new, Sets.newHashSet(REDSTONE_TARDIM_INPUT.get()), null)); - - // Cloister bell - public static final RegistryObject CLOISTER_SOUND = SOUNDS.register("cloister", () -> new SoundEvent(new ResourceLocation(Constants.MOD_ID, "cloister"))); - - // Register our stuff - public static void register() { - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - BLOCKS.register(modEventBus); - ITEMS.register(modEventBus); - BLOCK_ENTITIES.register(modEventBus); - SOUNDS.register(modEventBus); - } -} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandCloisterBell.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandCloisterBell.java deleted file mode 100644 index 4bfa48a..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandCloisterBell.java +++ /dev/null @@ -1,59 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.command; - -import com.swdteam.common.command.tardim.CommandTardimBase; -import com.swdteam.common.command.tardim.ICommand; -import com.swdteam.tardim.TardimData; -import com.swdteam.tardim.TardimManager; - -import net.minecraft.core.BlockPos; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import su.a71.tardim_ic.tardim_ic.Registration; - -public class CommandCloisterBell implements ICommand { - @Override - public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) { - if (args.length == 0) { - TardimData data = TardimManager.getFromPos(pos); - if (data != null) { - if (data.hasPermission(player)) { - try { - Level lvl = player.getLevel(); - if (!lvl.isClientSide) { - lvl.playSound( - null, - pos, - Registration.CLOISTER_SOUND.get(), - SoundSource.BLOCKS, - 1.5f, - 1f - ); - } - } catch (Exception var9) { - CommandTardimBase.sendResponse(player, "There was an error", CommandTardimBase.ResponseType.FAIL, source); - } - } else { - CommandTardimBase.sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source); - } - } - } else { - CommandTardimBase.sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source); - } - } - - @Override - public String getCommandName() { - return "cloister-bell"; - } - - @Override - public String getUsage() { - return "/cloister-bell"; - } - - @Override - public CommandTardimBase.CommandSource allowedSource() { - return CommandTardimBase.CommandSource.BOTH; - } -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListBiomes.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListBiomes.java deleted file mode 100644 index 1455788..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListBiomes.java +++ /dev/null @@ -1,54 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.command; - -import com.swdteam.common.command.tardim.CommandTardimBase; -import com.swdteam.common.command.tardim.ICommand; -import com.swdteam.tardim.TardimData; -import com.swdteam.tardim.TardimManager; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.biome.Biome; - - -public class CommandListBiomes implements ICommand{ - @Override - public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) { - ; - if (args.length == 1 || args.length == 0) { - TardimData data = TardimManager.getFromPos(pos); - if (data != null) { - if (data.hasPermission(player)) { - Registry biomeRegistry = player.getLevel().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); - biomeRegistry.keySet().forEach( - (ResourceLocation res) -> { - String out = res.toString(); - if (args.length == 0 || (args[0].equals(out.split(":")[0]))) { - CommandTardimBase.sendResponse(player, out, CommandTardimBase.ResponseType.INFO, source); - } - } - ); - } else { - CommandTardimBase.sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source); - } - } - } else { - CommandTardimBase.sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source); - } - } - - @Override - public String getCommandName() { - return "list-biomes"; - } - - @Override - public String getUsage() { - return "/list-biomes"; - } - - @Override - public CommandTardimBase.CommandSource allowedSource() { - return CommandTardimBase.CommandSource.BOTH; - } -} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListDimensions.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListDimensions.java deleted file mode 100644 index 2ff16ea..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandListDimensions.java +++ /dev/null @@ -1,47 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.command; - -import com.swdteam.common.command.tardim.CommandTardimBase; - -import com.swdteam.common.command.tardim.ICommand; -import com.swdteam.tardim.TardimData; -import com.swdteam.tardim.TardimManager; - -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; - -public class CommandListDimensions implements ICommand{ - @Override - public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) { - if (args.length == 0) { - TardimData data = TardimManager.getFromPos(pos); - if (data != null) { - if (data.hasPermission(player)) { - // TODO: Does this really work? - for (ServerLevel serverLevel : player.getLevel().getServer().getAllLevels()) { - CommandTardimBase.sendResponse(player, serverLevel.dimension().location().toString(), CommandTardimBase.ResponseType.INFO, source); - } - } else { - CommandTardimBase.sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source); - } - } - } else { - CommandTardimBase.sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source); - } - } - - @Override - public String getCommandName() { - return "list-dimensions"; - } - - @Override - public String getUsage() { - return "/list-dimensions"; - } - - @Override - public CommandTardimBase.CommandSource allowedSource() { - return CommandTardimBase.CommandSource.BOTH; - } -} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java deleted file mode 100644 index 9e95ffc..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandModemTransmit.java +++ /dev/null @@ -1,69 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.command; - -// This will be added whenever I manage to convince TARDIM devs to make CommandManager.register public -// 13.04.23 ITS ALIVE - -import com.swdteam.common.command.tardim.CommandTardimBase; -import com.swdteam.common.command.tardim.ICommand; -import com.swdteam.tardim.TardimData; -import com.swdteam.tardim.TardimManager; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.player.Player; - -import dan200.computercraft.api.network.Packet; -import dan200.computercraft.api.ComputerCraftAPI; - -public class CommandModemTransmit implements ICommand { - @Override - public void execute(String[] args, Player player, BlockPos pos, CommandTardimBase.CommandSource source) { - if (args.length == 3) { // TODO: 3 or 4??? - TardimData data = TardimManager.getFromPos(pos); - if (data != null) { - if (data.hasPermission(player)) { - try { - int sendChannel = Integer.parseInt(args[0]); - int replyChannel = Integer.parseInt(args[1]); - String message = args[2]; - boolean allDimensions = Boolean.parseBoolean(args[3]) || args[3].equals("true"); - - if (data.getTravelLocation() == null) { - data.setTravelLocation(new TardimData.Location(data.getCurrentLocation())); - } - - if (allDimensions) - { - ComputerCraftAPI.getWirelessNetwork().transmitInterdimensional(new Packet(sendChannel, replyChannel, message, new CommandSender(player, data.getTravelLocation().getPos()))); - } - else { - ComputerCraftAPI.getWirelessNetwork().transmitSameDimension(new Packet(sendChannel, replyChannel, message, - new CommandSender(player, data.getTravelLocation().getPos())), 300); - } - CommandTardimBase.sendResponse(player, "Sent modem message", CommandTardimBase.ResponseType.COMPLETE, source); - } catch (Exception var9) { - CommandTardimBase.sendResponse(player, "Invalid coordinates", CommandTardimBase.ResponseType.FAIL, source); - } - } else { - CommandTardimBase.sendResponse(player, "You do not have permission", CommandTardimBase.ResponseType.FAIL, source); - } - } - } else { - CommandTardimBase.sendResponse(player, this.getUsage(), CommandTardimBase.ResponseType.FAIL, source); - } - } - - @Override - public String getCommandName() { - return "cc-modem-transmit"; - } - - @Override - public String getUsage() { - return "/cc-modem-transmit "; - } - - @Override - public CommandTardimBase.CommandSource allowedSource() { - return CommandTardimBase.CommandSource.BOTH; - } -} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java deleted file mode 100644 index aec340f..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/command/CommandSender.java +++ /dev/null @@ -1,40 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.command; - -import dan200.computercraft.api.network.IPacketSender; -import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; - -public class CommandSender implements IPacketSender { - - private final Player player; - private final Level level; - private final BlockPos pos; - - CommandSender(Player player, BlockPos pos) { - this.player = player; - this.level = player.level; - this.pos = pos; - } - - @NotNull - @Override - public Level getLevel() { - return this.level; - } - - @NotNull - @Override - public Vec3 getPosition() { - return new Vec3(this.pos.getX(), this.pos.getY(), this.pos.getZ()); - } - - @NotNull - @Override - public String getSenderID() { - return this.player.getName().getString(); - } -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceBlock.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceBlock.java deleted file mode 100644 index 284345f..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceBlock.java +++ /dev/null @@ -1,27 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.digital_interface; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import org.jetbrains.annotations.NotNull; - -import su.a71.tardim_ic.tardim_ic.Registration; - -import javax.annotation.Nullable; - - -public class DigitalInterfaceBlock extends Block implements EntityBlock { - - public DigitalInterfaceBlock() { - super(Properties.of(Material.METAL).strength(2, 4).noOcclusion()); - } - - @Nullable - @Override - public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { - return Registration.DIGITAL_TARDIM_INTERFACE_TILEENTITY.get().create(pos, state); - } -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfacePeripheral.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfacePeripheral.java deleted file mode 100644 index 7df5118..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfacePeripheral.java +++ /dev/null @@ -1,887 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.digital_interface; - -import com.mojang.datafixers.util.Pair; -import com.swdteam.common.command.tardim.CommandTardimBase; -import com.swdteam.common.command.tardim.CommandTravel; -import com.swdteam.common.data.DimensionMapReloadListener; -import com.swdteam.common.init.TRDSounds; -import com.swdteam.common.init.TardimRegistry; -import com.swdteam.common.item.ItemTardim; -import com.swdteam.main.Tardim; -import com.swdteam.tardim.TardimData; -import com.swdteam.tardim.TardimData.Location; -import com.swdteam.tardim.TardimManager; - -import dan200.computercraft.api.lua.LuaException; -import dan200.computercraft.api.lua.LuaFunction; -import dan200.computercraft.api.lua.ObjectLuaTable; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.peripheral.IPeripheral; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.players.PlayerList; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.DimensionSpecialEffectsManager; -import su.a71.tardim_ic.tardim_ic.Registration; -import su.a71.tardim_ic.tardim_ic.utils.FakePlayer; - -import net.minecraftforge.registries.ForgeRegistries; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.*; - - -public class DigitalInterfacePeripheral implements IPeripheral { - - private final List connectedComputers = new ArrayList<>(); // List of computers connected to the peripheral - private final IDigitalInterfaceEntity tileEntity; // Peripheral's BlockEntity, used for accessing coordinates - /** - * @param tileEntity the tile entity of this peripheral - * @hidden - */ - public DigitalInterfacePeripheral(IDigitalInterfaceEntity tileEntity) { - this.tileEntity = tileEntity; - } - - /** Setting name for the peripheral. A computer will see it as "digital_tardim_interface_n" - * @hidden - */ - @Nonnull - @Override - public String getType() { return "digital_tardim_interface"; } - - /** Apparently CC uses this to check if the peripheral in front of a modem is this one - * @hidden - * @param iPeripheral The peripheral to compare against. This may be {@code null}. - * @return {@code true} if the peripheral is the same as this one. - */ - @Override - public boolean equals(@Nullable IPeripheral iPeripheral) { return this == iPeripheral; } - - /** Called when a computer disconnects from the peripheral - * @hidden - * @param computer The interface to the computer that is being detached. Remember that multiple computers can be - * attached to a peripheral at once. - */ - @Override - public void detach(@Nonnull IComputerAccess computer) { connectedComputers.remove(computer); } - - /** Called when a computer connects to the peripheral - * @hidden - * @param computer The interface to the computer that is being attached. Remember that multiple computers can be - * attached to a peripheral at once. - */ - @Override - public void attach(@Nonnull IComputerAccess computer) { connectedComputers.add(computer); } - - /** - * I *think* I use this to get peripheral's world position - * @hidden - * @return - */ - public IDigitalInterfaceEntity getTileEntity() { - return tileEntity; - } - - /** - * Get TARDIM's data, which we need for *every* function - *

- * We can't do a simple - * TardimManager.getFromPos(getTileEntity().getPos()) - *

- * because if someone attempts to call a method outside a TARDIM, this would create a new TARDIM/Point to the one with ID of 0 (Due to the way TardimSaveHandler.loadTardisData works). - * Which is obviously not what we want. - *

- * So instead we use this, and get the ability to give user a LuaException if they think that fiddling with time is funny - * This is mostly a copy of getIDForXZ function with some added checks - * - * @return TardimData of the TARDIM that the peripheral is in - * @hidden - */ - public TardimData getTardimDataInitial() { - int X = getTileEntity().getPos().getX(), Z = getTileEntity().getPos().getZ(); - - int index = 0; - int x = 0; - int y = 0; - int dx = 0; - int dy = 1; - int segment_length = 1; - int segment_passed = 0; - boolean found = false; - long timecheck = System.currentTimeMillis(); - - while(true) { - if (System.currentTimeMillis() - timecheck > 10000L) { - System.out.println("Finding ID from XZ Coordinates is taking too long!"); - break; - } - - if (X >= x * TardimManager.INTERIOR_BOUNDS - && X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS - && Z >= y * TardimManager.INTERIOR_BOUNDS - && Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) { - found = true; - break; - } - - x += dx; - y += dy; - if (++segment_passed == segment_length) { - segment_passed = 0; - int buffer = dy; - dy = -dx; - dx = buffer; - if (buffer == 0) { - ++segment_length; - } - } - - ++index; - } - - // We really don't want to access a ghost TARDIM, do we? - // If we fail checks here are not inside a TARDIM - if (!found) { - return null; - } - TardimData T = TardimManager.getTardim(index); - if (T.getCurrentLocation() == null || T.getOwnerName() == null) { - return null; - } - - return T; - } - - public TardimData getTardimData() throws LuaException { - TardimData data = this.getTileEntity().getTardim(); - if (data == null || data.getCurrentLocation() == null || data.getOwnerName() == null) { - throw new LuaException("Peripheral is not inside a TARDIM"); - } - return data; - } - - // Peripheral methods =============================================================== - - /** - * Return how much fuel is left in the TARDIM - * - * @return Fuel left (Out of 100) - */ - @LuaFunction(mainThread = true) - public final double getFuel() throws LuaException { - return getTardimData().getFuel(); - } - - /** - * Get how much fuel it would take to travel to the destination - * @return Amount of fuel needed (Out of 100) - */ - @LuaFunction(mainThread = true) - public final double calculateFuelForJourney() throws LuaException { - TardimData data = getTardimData(); - - if (data.getTravelLocation() == null) return 0; - - Location curr = data.getCurrentLocation(); - Location dest = data.getTravelLocation(); - - double fuel = 0.0; - - if (curr.getLevel() != dest.getLevel()) - { - fuel = 10.0; - } - - Vec3 posA = new Vec3(curr.getPos().getX(), curr.getPos().getY(), curr.getPos().getZ()); - Vec3 posB = new Vec3(dest.getPos().getX(), dest.getPos().getY(), dest.getPos().getZ()); - fuel += posA.distanceTo(posB) / 100.0; - if (fuel > 100.0) fuel = 100.0; - - return fuel; - } - - /** - * Check whether the TARDIM is locked - * @return true if locked, false if not - */ - @LuaFunction(mainThread = true) - public final boolean isLocked() throws LuaException { - return getTardimData().isLocked(); - } - - /** - * Check whether the TARDIM is in flight - * @return true if in flight, false if not - */ - @LuaFunction(mainThread = true) - public final boolean isInFlight() throws LuaException { return getTardimData().isInFlight(); } - - /** - * Supposedly gets UNIX timestamp of when we entered flight - * @return UNIX timestamp if in flight, -1 if not - */ - @LuaFunction(mainThread = true) - public final long getTimeEnteredFlight() throws LuaException { - TardimData data = getTardimData(); - if (!data.isInFlight()) { - return -1; - } - return data.getTimeEnteredFlight(); - } - - /** - * Get username of the TARDIM's owner - * @return String of the owner's username - */ - @LuaFunction(mainThread = true) - public final String getOwnerName() throws LuaException { - TardimData data = getTardimData(); - return data.getOwnerName(); - } - - /** - * Lock/unlock the TARDIM - * @param locked true to lock, false to unlock - */ - @LuaFunction(mainThread = true) - public final void setLocked(boolean locked) throws LuaException { - getTardimData().setLocked(locked); - } - - /** - * Get the current location of the TARDIM - * @return ObjectLuaTable of the current location with the following keys: - *

    - *
  • dimension - String of the dimension
  • - *
  • pos - table with the keys x, y, z that hold numbers
  • - *
  • facing - String of the facing
  • - *
- */ - @LuaFunction(mainThread = true) - public final ObjectLuaTable getCurrentLocation() throws LuaException { - Location loc = getTardimData().getCurrentLocation(); - return new ObjectLuaTable(Map.of( - "dimension", loc.getLevel().location().toString(), - "pos", new ObjectLuaTable(Map.of( - "x", loc.getPos().getX(), - "y", loc.getPos().getY(), - "z", loc.getPos().getZ() - )), - "facing", loc.getFacing().toString() - )); - } - - /** - * Get the current location of the TARDIM - * @return if there is no destination returns null. - *

- * Otherwise, ObjectLuaTable of the current location with the following keys: - *

    - *
  • dimension - String of the dimension
  • - *
  • pos - table with the keys x, y, z that hold numbers
  • - *
  • facing - String of the facing
  • - *
- */ - @LuaFunction(mainThread = true) - public final ObjectLuaTable getTravelLocation() throws LuaException { - TardimData data = getTardimData(); - if (data.getTravelLocation() == null) { - data.setTravelLocation(data.getCurrentLocation()); - } - Location loc = data.getTravelLocation(); - return new ObjectLuaTable(Map.of( - "dimension", loc.getLevel().location().toString(), - "pos", new ObjectLuaTable(Map.of( - "x", loc.getPos().getX(), - "y", loc.getPos().getY(), - "z", loc.getPos().getZ() - )), - "facing", loc.getFacing().toString() - )); - } - - /** - * Get list of the TARDIM owner's companions - * @return ObjectLuaTable containing the usernames of the companions - */ - @LuaFunction(mainThread = true) - public final ObjectLuaTable getCompanions() throws LuaException { - TardimData data = getTardimData(); - Map companions = new HashMap<>(); - for (int i = 0; i < data.getCompanions().size(); i++) { - companions.put(i + 1, data.getCompanions().get(i).getUsername()); - } - return new ObjectLuaTable(companions); - } - - - /** - * Set dimension for the TARDIM to travel to - *

- * This is a serious hazard right now due to the fact that I am unable to check if the dimension is valid. - *

- * TODO: If invalid dimension is given, the TARDIM is unable to land until the dimension is changed. Add proper checks. - * @param dimension String of the dimension e.g. "minecraft:overworld" - */ - @LuaFunction(mainThread = true) - public final void setDimension(String dimension) throws LuaException { - TardimData data = getTardimData(); - - String key = dimension; - dimension = DimensionMapReloadListener.toTitleCase(dimension); - if (TardimManager.DIMENSION_MAP.containsKey(dimension)) { - key = (String)TardimManager.DIMENSION_MAP.get(dimension); - } else { - dimension = dimension.toLowerCase(); - } - - if (!CommandTravel.isValidPath(key)) { - throw new LuaException("Invalid dimension"); - } else { - ResourceKey dim = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(dimension)); - if (data.getTravelLocation() == null) { - data.setTravelLocation(new Location(data.getCurrentLocation())); - } - - data.getTravelLocation().setLocation(dim); - } - } - - /** - * Set the destination's coordinates - * @param x X coordinate - * @param y Y coordinate - * @param z Z coordinate - */ - @LuaFunction(mainThread = true) - public final void setTravelLocation(int x, int y, int z) throws LuaException { - TardimData data = getTardimData(); - if (data.getTravelLocation() == null) { - data.setTravelLocation(new Location(data.getCurrentLocation())); - } - - data.getTravelLocation().setPosition(x, y, z); - } - - - /** - * Set destination to the TARDIM's owner's home (Must be online) - */ - @LuaFunction(mainThread = true) - public final void home() throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return; - } - TardimData data = getTardimData(); - - UUID uuid = data.getOwner(); - String username = data.getOwnerName(); - if (uuid == null || username == null) { - throw new LuaException("TARDIM has no owner"); - } - - PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList(); - ServerPlayer player = playerList.getPlayer(uuid); - if (player == null) { - throw new LuaException("TARDIM owner is not online"); - } - - ResourceKey dim = player.getRespawnDimension(); - BlockPos pos = player.getRespawnPosition(); - if (pos == null) { - throw new LuaException("TARDIM owner has no home"); - } - - setDimension(dim.location().toString()); - setTravelLocation(pos.getX(), pos.getY(), pos.getZ()); - } - - /** - * Set destination for a player's location (Player must be online) - * @param username - String of the username of the player - */ - @LuaFunction(mainThread = true) - public final void locatePlayer(String username) throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return; - } - - PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList(); - - ServerPlayer player = playerList.getPlayerByName(username); - if (player == null) { - throw new LuaException("Player not found"); - } - - ResourceKey dim = player.getCommandSenderWorld().dimension(); - BlockPos pos = player.blockPosition(); - - setDimension(dim.location().toString()); - setTravelLocation(pos.getX(), pos.getY(), pos.getZ()); - } - - /** - * Get online players. Useful for making a GUI for the locate function or just a nice dashboard. - * - * @return ObjectLuaTable of the online players - */ - @LuaFunction(mainThread = true) - public final ObjectLuaTable getOnlinePlayers() throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return null; - } - - PlayerList playerList = this.tileEntity.getLevel().getServer().getPlayerList(); - Map players = new HashMap<>(); - for (int i = 0; i < playerList.getPlayers().size(); i++) { - players.put(i + 1, playerList.getPlayers().get(i).getGameProfile().getName()); - } - - return new ObjectLuaTable(players); - } - - /** - * Get the rotation of the TARDIM's door - * @return String of the door rotation ("north", "south", "east", "west") - */ - @LuaFunction(mainThread = true) - public final String getDoorRotation() throws LuaException { - TardimData data = getTardimData(); - Direction rotation = data.getTravelLocation().getFacing(); - switch (rotation) { - case NORTH -> { - return "north"; - } - case EAST -> { - return "east"; - } - case SOUTH -> { - return "south"; - } - case WEST -> { - return "west"; - } - default -> { - throw new LuaException("Invalid door rotation"); - } - } - } - - /** - * Set the rotation of the TARDIM's door - * @param rotation String of the door rotation ("north", "south", "east", "west") - */ - @LuaFunction(mainThread = true) - public final void setDoorRotation(String rotation) throws LuaException { - TardimData data = getTardimData(); - switch (rotation) { - case "north" -> data.getTravelLocation().setFacing(Direction.NORTH); - case "east" -> data.getTravelLocation().setFacing(Direction.EAST); - case "south" -> data.getTravelLocation().setFacing(Direction.SOUTH); - case "west" -> data.getTravelLocation().setFacing(Direction.WEST); - default -> throw new LuaException("Invalid door rotation"); - } - - data.save(); - } - - /** - * Toggle the rotation of the TARDIM's door (north -> east -> south -> west -> north) - */ - @LuaFunction(mainThread = true) - public final void toggleDoorRotation() throws LuaException { - TardimData data = getTardimData(); - if (data.getTravelLocation() == null) { - data.setTravelLocation(new Location(data.getCurrentLocation())); - } - - if (data.getTravelLocation().getFacing() == null) { - data.getTravelLocation().setFacing(Direction.NORTH); - } - - switch (data.getTravelLocation().getFacing()) { - case NORTH -> data.getTravelLocation().setFacing(Direction.EAST); - case EAST -> data.getTravelLocation().setFacing(Direction.SOUTH); - case SOUTH -> data.getTravelLocation().setFacing(Direction.WEST); - case WEST -> data.getTravelLocation().setFacing(Direction.NORTH); - default -> data.getTravelLocation().setFacing(Direction.NORTH); - } - - data.save(); - } - - /** - * Add a number to the destination's coordinates - * @param axis String of the axis ("x", "y", "z") - * @param amount Number to add to the axis - */ - @LuaFunction(mainThread = true) - public final void coordAdd(String axis, int amount) throws LuaException { - TardimData data = getTardimData(); - if (data.getTravelLocation() == null) { - data.setTravelLocation(new Location(data.getCurrentLocation())); - } - - Location location = data.getTravelLocation(); - switch (axis) { - case "x" -> location.addPosition(amount, 0, 0); - case "y" -> location.addPosition(0, amount, 0); - case "z" -> location.addPosition(0, 0, amount); - default -> throw new LuaException("Invalid axis"); - } - } - - /** - * Dematerialize the TARDIM - */ - @LuaFunction(mainThread = true) - public final void demat() throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return; - } - - TardimData data = getTardimData(); - - if (data.isInFlight()) { - throw new LuaException("TARDIM is already in flight"); - } - Location loc = data.getCurrentLocation(); - ServerLevel level = this.tileEntity.getLevel().getServer().getLevel(loc.getLevel()); - ItemTardim.destroyTardim(level, loc.getPos(), Direction.NORTH); - data.setInFlight(true); - if (data.getTravelLocation() == null) { - data.setTravelLocation(new Location(data.getCurrentLocation())); - } - - // TODO: This is a horrendous way of doing this. Please fix. - String level_str = "tardim:tardis_dimension"; - this.tileEntity.getLevel().getServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_TAKEOFF.get(), SoundSource.AMBIENT, 1.0F, 1.0F); - - data.save(); - } - - /** - * Materialize the TARDIM at the destination - *

- * Has a LOT of checks to make sure the TARDIM can materialize, so please implement error handling if you use this. - */ - @LuaFunction(mainThread = true) - public final void remat() throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return; - } - - TardimData data = getTardimData(); - - if (data.isInFlight()) { - if (data.getTimeEnteredFlight() < System.currentTimeMillis() / 1000L - 10L) { - Location loc = data.getTravelLocation(); - ServerLevel level = this.tileEntity.getLevel().getServer().getLevel(loc.getLevel()); - double fuel = data.calculateFuelForJourney( - this.tileEntity.getLevel().getServer().getLevel(data.getCurrentLocation().getLevel()), level, data.getCurrentLocation().getPos(), loc.getPos() - ); - if (data.getFuel() >= fuel) { - level.getChunk(loc.getPos()); - BlockPos landingPosButBetter = CommandTravel.getLandingPosition(level, loc.getPos()); - boolean recalc = false; - - for(int jj = 0; jj < 32; ++jj) { - if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) { - BlockPos pos2 = landingPosButBetter.offset( - level.random.nextInt(10) * (level.random.nextBoolean() ? 1 : -1), - 0, - level.random.nextInt(10) * (level.random.nextBoolean() ? 1 : -1) - ); - landingPosButBetter = CommandTravel.getLandingPosition(level, pos2); - if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) { - recalc = true; - break; - } - } - } - - if (!recalc) { - for(int jj = 0; jj < 32; ++jj) { - if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) { - BlockPos pos2 = landingPosButBetter.offset( - level.random.nextInt(30) * (level.random.nextBoolean() ? 1 : -1), - 0, - level.random.nextInt(30) * (level.random.nextBoolean() ? 1 : -1) - ); - landingPosButBetter = CommandTravel.getLandingPosition(level, pos2); - if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) { - recalc = true; - break; - } - } - } - } - - if (!recalc) { - for(int jj = 0; jj < 32; ++jj) { - if (!Block.canSupportRigidBlock(level, landingPosButBetter.below())) { - BlockPos pos2 = landingPosButBetter.offset( - level.random.nextInt(50) * (level.random.nextBoolean() ? 1 : -1), - 0, - level.random.nextInt(50) * (level.random.nextBoolean() ? 1 : -1) - ); - landingPosButBetter = CommandTravel.getLandingPosition(level, pos2); - if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) { - recalc = true; - break; - } - } - } - } - - if (Block.canSupportRigidBlock(level, landingPosButBetter.below())) { - loc.setPosition(landingPosButBetter.getX(), landingPosButBetter.getY(), landingPosButBetter.getZ()); - if (Tardim.isPosValid(level, loc.getPos())) { - TardimRegistry.TardimBuilder builder = TardimRegistry.getTardimBuilder(data.getTardimID()); - builder.buildTardim(level, loc.getPos(), data.getTravelLocation().getFacing(), data.getId()); - data.setCurrentLocation(data.getTravelLocation()); - data.setTravelLocation(null); - data.setInFlight(false); - data.addFuel(-fuel); - data.save(); - -// if (!recalc) { -// sendResponse(player, "TARDIM is landing", CommandTardimBase.ResponseType.COMPLETE, source); -// } else { -// sendResponse(player, "Landing recalculated due to obstruction", CommandTardimBase.ResponseType.INFO, source); -// sendResponse(player, "TARDIM is landing", CommandTardimBase.ResponseType.COMPLETE, source); -// } - - String level_str = "tardim:tardis_dimension"; - this.tileEntity.getLevel().getServer().getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(level_str))).playSound(null, this.tileEntity.getPos(), (SoundEvent) TRDSounds.TARDIM_LANDING.get(), SoundSource.AMBIENT, 1.0F, 1.0F); - - } else { - throw new LuaException("TARDIM landing obstructed. Aborting..."); - } - } else { - throw new LuaException("TARDIM landing obstructed. Aborting..."); - } - } else { - throw new LuaException("Not enough fuel for journey"); - } - } else { - throw new LuaException("TARDIM is still taking off"); - } - } else { - throw new LuaException("TARDIM has already landed"); - } - } - - /** - * Locate a biome - * @param biome_str String of the biome e.g. "minecraft:plains" - */ - @LuaFunction(mainThread = true) - public final void locateBiome(String biome_str) throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return; - } - - TardimData data = getTardimData(); - if (data.getTravelLocation() == null) { - data.setTravelLocation(new Location(data.getCurrentLocation())); - } - - Optional biome = this.tileEntity.getLevel().getServer() - .registryAccess() - .registryOrThrow(Registry.BIOME_REGISTRY) - .getOptional(new ResourceLocation(biome_str)); - if (biome != null && biome.isPresent()) { - if (data.getTravelLocation() == null) { - data.setTravelLocation(new Location(data.getCurrentLocation())); - } - - ServerLevel level = this.tileEntity.getLevel().getServer().getLevel(data.getTravelLocation().getLevel()); - BlockPos blockpos = new BlockPos( - data.getTravelLocation().getPos().getX(), - level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, data.getTravelLocation().getPos()).getY(), - data.getTravelLocation().getPos().getZ() - ); - BlockPos blockpos1 = this.findNearestBiome(level, (Biome)biome.get(), blockpos, 6400, 8); - if (blockpos1 != null) { - data.getTravelLocation().setPosition(blockpos1.getX(), blockpos1.getY(), blockpos1.getZ()); - data.save(); - } else { - throw new LuaException("Biome not found"); - } - } else { - throw new LuaException("Unknown biome"); - } - } - - /** - * Helper method to find a biome - * @param level ServerLevel to search - * @param biome Biome to find - * @param pos BlockPos to start from - * @param i Idk what this is, likely a radius - * @param j No idea about this either - * @return BlockPos of the biome - * @hidden - */ - public BlockPos findNearestBiome(ServerLevel level, Biome biome, BlockPos pos, int i, int j) { - Pair> bb = level.getChunkSource() - .getGenerator() - .getBiomeSource() - .findBiomeHorizontal( - pos.getX(), - pos.getY(), - pos.getZ(), - i, - j, - b_val -> b_val.value() == biome, - level.random, - true, - level.getChunkSource().randomState().sampler() - ); - return bb != null && bb.getFirst() != null ? (BlockPos)bb.getFirst() : null; - } - - /** - * Set the skin of the TARDIM - * @param skin Skin name to change to - * @hidden - */ - @LuaFunction(mainThread = true) - public final void setSkin(String skin) throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return; - } - - TardimData data = getTardimData(); - - ResourceLocation skinToApply = null; - Iterator var13 = TardimRegistry.getRegistry().keySet().iterator(); - - label39: { - ResourceLocation builder; - TardimRegistry.TardimBuilder b; - do { - if (!var13.hasNext()) { - break label39; - } - - builder = (ResourceLocation)var13.next(); - b = TardimRegistry.getTardimBuilder(builder); - } while(!b.getDisplayName().equalsIgnoreCase(skin) && !builder.toString().equalsIgnoreCase(skin)); - - skinToApply = builder; - } - - if (skinToApply == null) { - throw new LuaException("Skin '" + skin + "' not found"); - } - - TardimData.Location loc = data.getCurrentLocation(); - ServerLevel level = this.tileEntity.getLevel().getServer().getLevel(loc.getLevel()); - data.setIdentifier(skinToApply); - - // FakePlayer... - TardimRegistry.getTardimBuilder(skinToApply).changeTardimSkin(data, level, loc.getPos(), loc.getFacing(), new FakePlayer(this.tileEntity.getLevel(), this.tileEntity.getPos())); - } - - /** - * Get all available TARDIM skins. Useful for making a GUI skin selection. - * - * @return ObjectLuaTable of the available skins - */ - @LuaFunction(mainThread = true) - public final ObjectLuaTable getSkins() throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return null; - } - - Map skins = new HashMap<>(); - - Iterator var5 = TardimRegistry.getRegistry().keySet().iterator(); - int i = 0; - while(var5.hasNext()) { - ResourceLocation builder = (ResourceLocation)var5.next(); - TardimRegistry.TardimBuilder b = TardimRegistry.getTardimBuilder(builder); - skins.put(i + 1, b.getDisplayName()); - i++; - } - - return new ObjectLuaTable(skins); - } - - /** - * Play cloister bell sound. - */ - @LuaFunction(mainThread = true) - public final void cloisterBell() throws LuaException { - if (this.tileEntity.getLevel().isClientSide()) { - return; - } - try { - Level lvl = this.tileEntity.getLevel(); - if (!lvl.isClientSide) { - lvl.playSound( - null, - this.tileEntity.getPos(), - Registration.CLOISTER_SOUND.get(), - SoundSource.BLOCKS, - 1.5f, - 1f - ); - } - } catch (Exception var9) { - throw new LuaException("There was an error trying to play the sound"); - } - } - - /** - * Get a table with all registered biomes' names. - * Useful for creating advanced navigation systems. - * @return ObjectLuaTable with all biomes' technical names - */ - @LuaFunction(mainThread = true) - public final ObjectLuaTable getBiomes() throws LuaException { - Map biomes = new HashMap<>(); - Registry biomeRegistry = tileEntity.getLevel().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); - Iterator biome_it = biomeRegistry.keySet().iterator(); - int i = 0; - while (biome_it.hasNext()) { - biomes.put(i + 1, biome_it.next().toString()); - i++; - } - - return new ObjectLuaTable(biomes); - } - - /** - * Get a table with all registered dimensions' names. - * Useful for creating advanced navigation systems. - * @return ObjectLuaTable with all dimensions' technical names - */ - @LuaFunction(mainThread = true) - public final ObjectLuaTable getDimensions() throws LuaException { - Iterator dim_it = this.tileEntity.getLevel().getServer().getAllLevels().iterator(); // TODO: Does this really work? - Map dimensions = new HashMap<>(); - int i = 0; - while (dim_it.hasNext()) { - dimensions.put(i + 1, dim_it.next().dimension().location().toString()); - i++; - } - return new ObjectLuaTable(dimensions); - } -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceTileEntity.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceTileEntity.java deleted file mode 100644 index d03667d..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/DigitalInterfaceTileEntity.java +++ /dev/null @@ -1,118 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.digital_interface; - -import com.swdteam.tardim.TardimData; -import com.swdteam.tardim.TardimManager; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import org.jetbrains.annotations.NotNull; -import su.a71.tardim_ic.tardim_ic.Registration; - -import dan200.computercraft.api.peripheral.IPeripheral; -import static dan200.computercraft.shared.Capabilities.CAPABILITY_PERIPHERAL; - -public class DigitalInterfaceTileEntity extends BlockEntity implements IDigitalInterfaceEntity { - public TardimData data; // Our TARDIM - - public DigitalInterfaceTileEntity(BlockPos pos, BlockState state) { - super(Registration.DIGITAL_TARDIM_INTERFACE_TILEENTITY.get(), pos, state); - this.data = getTardimDataInitial(); - } - - /** - * Our peripheral, we create a new peripheral for each new tile entity - */ - protected DigitalInterfacePeripheral peripheral = new DigitalInterfacePeripheral(this); - private LazyOptional peripheralCap; - public BlockPos getPos() { - return this.worldPosition; - } - - @Override - public TardimData getTardim() { - return this.data; - } - - /** - * When a computer modem tries to wrap our block, the modem will call getCapability to receive our peripheral. - * Then we just simply return a {@link LazyOptional} with our Peripheral - */ - @Override - @NotNull - public LazyOptional getCapability(@NotNull Capability cap, Direction direction) { - if (cap == CAPABILITY_PERIPHERAL) { - if (peripheralCap == null) { - peripheralCap = LazyOptional.of(() -> peripheral); - } - return peripheralCap.cast(); - } - return super.getCapability(cap, direction); - } - - public TardimData getTardimDataInitial() { - int X = this.getPos().getX(), Z = this.getPos().getZ(); - - int index = 0; - int x = 0; - int y = 0; - int dx = 0; - int dy = 1; - int segment_length = 1; - int segment_passed = 0; - boolean found = false; - long timecheck = System.currentTimeMillis(); - - while(true) { - if (System.currentTimeMillis() - timecheck > 10000L) { - System.out.println("Finding ID from XZ Coordinates is taking too long!"); - break; - } - - if (X >= x * TardimManager.INTERIOR_BOUNDS - && X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS - && Z >= y * TardimManager.INTERIOR_BOUNDS - && Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) { - found = true; - break; - } - - x += dx; - y += dy; - if (++segment_passed == segment_length) { - segment_passed = 0; - int buffer = dy; - dy = -dx; - dx = buffer; - if (buffer == 0) { - ++segment_length; - } - } - - ++index; - } - - // We really don't want to access a ghost TARDIM, do we? - // If we fail checks here are not inside a TARDIM - if (!found) { - return null; - } - TardimData T = TardimManager.getTardim(index); - if (T.getCurrentLocation() == null || T.getOwnerName() == null) { - return null; - } - - return T; - } - - @Override - public void load(CompoundTag tag) { - super.load(tag); - this.data = getTardimDataInitial(); - } -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/FakeDigitalInterfaceTileEntity.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/FakeDigitalInterfaceTileEntity.java deleted file mode 100644 index df5fe94..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/FakeDigitalInterfaceTileEntity.java +++ /dev/null @@ -1,89 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.digital_interface; - -import com.swdteam.tardim.TardimData; -import com.swdteam.tardim.TardimManager; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; - -public class FakeDigitalInterfaceTileEntity implements IDigitalInterfaceEntity { - public BlockPos blockPos; - public Level level; - public TardimData data; // Our TARDIM - - - FakeDigitalInterfaceTileEntity(BlockPos in_block, Level in_level) { - this.blockPos = in_block; - this.level = in_level; - this.data = getTardimDataInitial(); - } - - @Override - public BlockPos getPos() { - return this.blockPos; - } - - @Override - public Level getLevel() { - return this.level; - } - - @Override - public TardimData getTardim() { - return this.data; - } - - public TardimData getTardimDataInitial() { - int X = this.getPos().getX(), Z = this.getPos().getZ(); - - int index = 0; - int x = 0; - int y = 0; - int dx = 0; - int dy = 1; - int segment_length = 1; - int segment_passed = 0; - boolean found = false; - long timecheck = System.currentTimeMillis(); - - while(true) { - if (System.currentTimeMillis() - timecheck > 10000L) { - System.out.println("Finding ID from XZ Coordinates is taking too long!"); - break; - } - - if (X >= x * TardimManager.INTERIOR_BOUNDS - && X <= TardimManager.INTERIOR_BOUNDS + x * TardimManager.INTERIOR_BOUNDS - && Z >= y * TardimManager.INTERIOR_BOUNDS - && Z <= TardimManager.INTERIOR_BOUNDS + y * TardimManager.INTERIOR_BOUNDS) { - found = true; - break; - } - - x += dx; - y += dy; - if (++segment_passed == segment_length) { - segment_passed = 0; - int buffer = dy; - dy = -dx; - dx = buffer; - if (buffer == 0) { - ++segment_length; - } - } - - ++index; - } - - // We really don't want to access a ghost TARDIM, do we? - // If we fail checks here are not inside a TARDIM - if (!found) { - return null; - } - TardimData T = TardimManager.getTardim(index); - if (T.getCurrentLocation() == null || T.getOwnerName() == null) { - return null; - } - - return T; - } -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/IDigitalInterfaceEntity.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/IDigitalInterfaceEntity.java deleted file mode 100644 index ccbb39c..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/digital_interface/IDigitalInterfaceEntity.java +++ /dev/null @@ -1,12 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.digital_interface; - -import com.swdteam.tardim.TardimData; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; - -public interface IDigitalInterfaceEntity { - public BlockPos getPos(); - public Level getLevel(); - - public TardimData getTardim(); -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/Commands.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/Commands.java deleted file mode 100644 index 1e9262a..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/mixin/Commands.java +++ /dev/null @@ -1,18 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import com.swdteam.common.init.CommandManager; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import su.a71.tardim_ic.tardim_ic.registration.CommandInit; - -// TARDIM loads commands a bit later on Forge, so we have to use mixins for this :/ -@Mixin(value = CommandManager.class, remap = false) -public abstract class Commands { - @Inject(method="init()V", at=@At("TAIL")) - private static void init(CallbackInfo ci) { - CommandInit.init(); - System.out.println("TARDIM: IC added commands using mixin"); - } -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redstone_input/RedstoneInputBlock.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redstone_input/RedstoneInputBlock.java deleted file mode 100644 index 675132b..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redstone_input/RedstoneInputBlock.java +++ /dev/null @@ -1,102 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.redstone_input; - -import com.swdteam.common.block.BlockBaseTardimPanel; -import com.swdteam.common.init.TRDDimensions; -import com.swdteam.common.init.TRDSounds; -import com.swdteam.network.NetworkHandler; -import com.swdteam.network.packets.PacketOpenEditGui; -import com.swdteam.tardim.TardimData; -import com.swdteam.tardim.TardimManager; -import com.swdteam.tileentity.TileEntityBaseTardimPanel; - -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.game.DebugPackets; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.phys.BlockHitResult; - -import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; - -import su.a71.tardim_ic.tardim_ic.Registration; -import su.a71.tardim_ic.tardim_ic.utils.FakePlayer; - -public class RedstoneInputBlock extends BlockBaseTardimPanel implements EntityBlock { - public RedstoneInputBlock() { - super(Properties.of(Material.METAL).strength(2, 4).noOcclusion()); - } - - @Nullable - @Override - public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { - return Registration.REDSTONE_TARDIM_INPUT_TILEENTITY.get().create(pos, state); - } - - @Override - public InteractionResult use(BlockState blockState, Level w, BlockPos blockPos, Player player, InteractionHand hand, BlockHitResult p_60508_) { - if (!w.isClientSide) { - - w.playSound((Player)null, blockPos, (SoundEvent) TRDSounds.TARDIM_BEEP.get(), SoundSource.BLOCKS, 0.3F, 0.5F); - - BlockEntity be = w.getBlockEntity(blockPos); - if (be instanceof TileEntityBaseTardimPanel && w.dimension() == TRDDimensions.TARDIS) { - TardimData data = TardimManager.getFromPos(blockPos); - if (data != null && data.hasPermission(player)) { - ((RedstoneInputTileEntity) be).lastPlayer = player.getGameProfile().getId(); - NetworkHandler.sendTo((ServerPlayer)player, new PacketOpenEditGui(1, blockPos)); - return InteractionResult.CONSUME; - } - - player.displayClientMessage( - Component.literal("You do not have permission").withStyle(ChatFormatting.DARK_RED).withStyle(ChatFormatting.BOLD), true - ); - } - } - - return InteractionResult.CONSUME; - } - - public boolean canSurvive(BlockState blockState, LevelReader levelReader, BlockPos blockPos) { - return true; - } - - public void neighborChanged(BlockState blockState, Level level, BlockPos blockPos, Block block, BlockPos fromPos, boolean isMoving) { - DebugPackets.sendNeighborsUpdatePacket(level, blockPos); - - BlockEntity be = level.getBlockEntity(blockPos); - if (!(be instanceof RedstoneInputTileEntity)) { - return; - } - - // get redstone signal - Direction direction = blockState.getValue(FACING); - int redstoneSignal = level.getSignal(blockPos, direction); - if (redstoneSignal > 0 && !((RedstoneInputTileEntity) be).isPowered) { - ((RedstoneInputTileEntity) be).isPowered = true; - if (level.dimension() == TRDDimensions.TARDIS) { - TardimData data = TardimManager.getFromPos(blockPos); - if (data != null && !level.isClientSide && ((RedstoneInputTileEntity) be).lastPlayer != null) { - if (((TileEntityBaseTardimPanel)be).hasCommand()) { - ((TileEntityBaseTardimPanel)be).execute(new FakePlayer(level, blockPos, ((RedstoneInputTileEntity) be).lastPlayer)); - } - } - } - - } else if (redstoneSignal == 0 && ((RedstoneInputTileEntity) be).isPowered) - ((RedstoneInputTileEntity) be).isPowered = false; - } -} diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redstone_input/RedstoneInputTileEntity.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redstone_input/RedstoneInputTileEntity.java deleted file mode 100644 index 06f4303..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/redstone_input/RedstoneInputTileEntity.java +++ /dev/null @@ -1,41 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.redstone_input; - -import com.swdteam.tileentity.TileEntityBaseTardimPanel; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.state.BlockState; -import su.a71.tardim_ic.tardim_ic.Registration; - -import java.util.UUID; - - -public class RedstoneInputTileEntity extends TileEntityBaseTardimPanel { - public boolean isPowered = false; - public UUID lastPlayer = null; - - public RedstoneInputTileEntity(BlockPos pos, BlockState state) { - super(Registration.REDSTONE_TARDIM_INPUT_TILEENTITY.get(), pos, state); - } - - public BlockPos getPos() { - return this.worldPosition; - } - - - @Override - public void saveAdditional(CompoundTag tag) { - tag.putBoolean("is_powered", isPowered); - if (lastPlayer != null) { - tag.putUUID("last_player", lastPlayer); - } - super.saveAdditional(tag); - } - - @Override - public void load(CompoundTag tag) { - super.load(tag); - isPowered = tag.getBoolean("is_powered"); - lastPlayer = tag.getUUID("last_player"); - } -} \ No newline at end of file diff --git a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CommandInit.java b/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CommandInit.java deleted file mode 100644 index 20be2d0..0000000 --- a/Forge/src/main/java/su/a71/tardim_ic/tardim_ic/registration/CommandInit.java +++ /dev/null @@ -1,17 +0,0 @@ -package su.a71.tardim_ic.tardim_ic.registration; - - -import su.a71.tardim_ic.tardim_ic.command.CommandListBiomes; -import su.a71.tardim_ic.tardim_ic.command.CommandListDimensions; -import su.a71.tardim_ic.tardim_ic.command.CommandModemTransmit; -import su.a71.tardim_ic.tardim_ic.command.CommandCloisterBell; -import com.swdteam.common.init.CommandManager; - -public class CommandInit { - public static void init() { - CommandManager.register(new CommandModemTransmit()); - CommandManager.register(new CommandCloisterBell()); - CommandManager.register(new CommandListBiomes()); - CommandManager.register(new CommandListDimensions()); - } -} diff --git a/Forge/src/main/resources/META-INF/mods.toml b/Forge/src/main/resources/META-INF/mods.toml index 23b11c1..7c9fa79 100644 --- a/Forge/src/main/resources/META-INF/mods.toml +++ b/Forge/src/main/resources/META-INF/mods.toml @@ -1,48 +1,28 @@ - modLoader = "javafml" #mandatory -loaderVersion="[43,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. -license = "MIT" +loaderVersion = "[46,)" #mandatory This is typically bumped every Minecraft version by Forge. See https://files.minecraftforge.net/ for a list of versions. +license = "C0-1.0" # Review your options at https://choosealicense.com/. +#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional [[mods]] #mandatory -# The modid of the mod -modId = "tardim_ic" #mandatory -version = "1.2" #mandatory -# A display name for the mod -displayName = "TARDIM: In Control" #mandatory -# The description text for the mod (multi line!) (#mandatory) +modId = "multiloader" #mandatory +version = "${file.jarVersion}" #mandatory +displayName = "${mod_name}" #mandatory +#updateJSONURL="https://change.me.example.invalid/updates.json" #optional (see https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/) +#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional (displayed in the mod UI) +logoFile = "multiloader.png" #optional (needs to be in the root of your mod jar (root of your 'resources' folder)) +credits = "Thanks for this example mod goes to Java" #optional +authors = "${mod_author}" #optional description = ''' - All of time and space, now automated and improved. This mod aims to make TARDIM even better. -''' -logoFile = "icon.png" -authors = "Andrew_7_1" -# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. -[[dependencies.tardim_ic]] #optional -# the modid of the dependency +This is a long form description of the mod. You can write whatever you want here +''' #mandatory (Supports multiline text) +[[dependencies.multiloader]] #optional modId = "forge" #mandatory -# Does this dependency have to exist - if not, ordering below must be specified mandatory = true #mandatory -# The version range of the dependency -versionRange="[43,)" #mandatory -# An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory -ordering = "NONE" -# Side this dependency is applied on - BOTH, CLIENT or SERVER -side = "BOTH" -# Here's another dependency -[[dependencies.tardim_ic]] -modId = "computercraft" -mandatory = true -versionRange = "1.95.3" -ordering = "NONE" -side = "BOTH" -[[dependencies.tardim_ic]] -modId = "tardim" -mandatory = true -versionRange = "1.2.2" -ordering = "AFTER" -side = "BOTH" -[[dependencies.tardim_ic]] +versionRange = "[46,)" #mandatory +ordering = "NONE" # The order that this dependency should load in relation to your mod, required to be either 'BEFORE' or 'AFTER' if the dependency is not mandatory +side = "BOTH" # Side this dependency is applied on - 'BOTH', 'CLIENT' or 'SERVER' +[[dependencies.multiloader]] modId = "minecraft" mandatory = true -# This version range declares a minimum of the current minecraft version up to but not including the next major version -versionRange = "1.19.2" +versionRange = "[1.20,1.21)" ordering = "NONE" -side = "BOTH" \ No newline at end of file +side = "BOTH" diff --git a/Forge/src/main/resources/META-INF/services/com.example.examplemod.platform.services.IPlatformHelper b/Forge/src/main/resources/META-INF/services/com.example.examplemod.platform.services.IPlatformHelper new file mode 100644 index 0000000..ff2910d --- /dev/null +++ b/Forge/src/main/resources/META-INF/services/com.example.examplemod.platform.services.IPlatformHelper @@ -0,0 +1 @@ +com.example.examplemod.platform.ForgePlatformHelper \ No newline at end of file diff --git a/Forge/src/main/resources/examplemod.forge.mixins.json b/Forge/src/main/resources/examplemod.forge.mixins.json new file mode 100644 index 0000000..95882ac --- /dev/null +++ b/Forge/src/main/resources/examplemod.forge.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.example.examplemod.mixin", + "refmap": "${mod_id}.refmap.json", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + "MixinTitleScreen" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/Forge/src/main/resources/mixins.tardim_ic.json b/Forge/src/main/resources/mixins.tardim_ic.json deleted file mode 100644 index 68e23e1..0000000 --- a/Forge/src/main/resources/mixins.tardim_ic.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "required": true, - "package": "su.a71.tardim_ic.tardim_ic.mixin", - "compatibilityLevel": "JAVA_17", - "refmap": "refmap.tardim_ic.json", - "mixins": [ - "Commands" - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - }, - "minVersion": "0.8.4" -} \ No newline at end of file diff --git a/SWD_MOMENT.txt b/SWD_MOMENT.txt index e3487d8..8e6d1d4 100644 --- a/SWD_MOMENT.txt +++ b/SWD_MOMENT.txt @@ -8,7 +8,6 @@ return new ResourceLocation("tutorial", "tardim_dimension_lookup"); } 5.1 Forge's MANIFEST.MF too! -6. Panel buttons might still be broken on 1.2.2 1.19.2 Andrew71's proposals: 1. Quick-return command diff --git a/TODO b/TODO new file mode 100644 index 0000000..babc252 --- /dev/null +++ b/TODO @@ -0,0 +1,5 @@ +== TODO for v1.2 == +(Yes we had a lot of these) + +* Good-looking documentation (MKDocs maybe?) hosted on https://tardim.a71.su +* Full 1.20 port diff --git a/TODO.txt b/TODO.txt deleted file mode 100644 index e0e8cc1..0000000 --- a/TODO.txt +++ /dev/null @@ -1,95 +0,0 @@ -TODO for 1.2 and beyond -re-written 21.06.23 - -NEW ==================== - -Blocks: - Cartridge Loader - 2 buttons, one to load information from a cartridge, another to write it. - Has a slot where when r-clicked with a cartridge inserts it/Takes it out - TARDIM Dock - Has a GUI, where you can configure: - * Name/id - * Landing facing - * White/Blacklist of users who can land - * (Potentially) Fallback id if this one is disabled - When configured, a CC method/TARDIM command can take you to it - When powered by a lever, no TARDIM can land (and potentially take off) - Food Machine - 2 buttons. One changed chosen food (hopefully shown on screen), another throws it out. - Uses a bit of fuel but you get FOOD! -Items - Personal Jammer - When worn, other players are unable to locate the user with /locate command - Location cartridge - Contains coordinates, dimension of place and date when it was written to (potentially other metadata using CC) - Can be locked like a map - Potentially can be inserted into a disk drive peripheral - -Compat: - CC: - * Look into what other things can be improved, how to automate doc creation - * Add creative digital TARDIM interface... (maybe remove TARDIM from item name?) - * Add a craftable treasure disk with pre-installed useful programs - Create: - Update to 0.5.1, add more display sources - -Code: - Datapack-driven way to control where a TARDIM can land and at what price. - -Achievements: -(need to decide on root) - "Nobody needs soup more than me" - Get soup from TARDIM's food machine - - "Power of the Redstone" - Activate a redstone input - - "From Russia with love" - Set exterior to Soviet Chronobox (or any other potential USSR-themed exteriors) - - "Cyber-Upgrade" - Craft a digital interface - - "???" - Register a dock - - "It appears to be... jammed!" - "I've lost the bleeps, I lost the sweeps, and I lost the creeps." - Put on a location jammer - - "I will always remember..." - Save (or maybe lock like a map?) a location cartridge - - -UPDATES ================ - -Blocks: - Redstone TARDIM Interface - add powered blockstate - (TARDIM) Fuel Storage - add comparator output based on fuel (0 - 9 I think) - (TARDIM) Time Rotor - add comparator/redstone output when in flight -Code: - Add config&datapack support (e.g. disable compat, more food machine food, only getters from digital interface) - Make 1WTC fix package names on forge and further improve multi-loader structure - (so that it's not just Fabric to Forge translation at last second). - Overall some code from TARDIM: IC might make its way into TARDIM hopefully - Try to smash all TODOs and warnings -Outside appearance: - Make a proper wiki/docs with CC methods, item recipes and explanations. Maybe even technical things. - Update README and Modrinth/Curse pages - Look into re-licensing and/or making proper public facing source code - Improve Discord server - Improve/Change icon - Make background image for modrinth - -LOOK INTO ============== -Things to overall re-search -* Applications for SWD Discord moderator. Could be a path to actually getting the bloody source code access -* Making TARDIM doors sync between TARDIM and external dimension -* Some kind of CC scanner method to see the outside (and?) GUI panel that lets you see said outside (or pre-installed iso. program) - see: dev9551's isometric renderer (or pine3d) -* Advanced drive/fuel storage for interstellar travel. Like a "stores 10000 fuel but you have to use it at once" -* Change block appearance based on item name when placed (like Supplementaries) -* More Create compat: engine powered by tardim fuel and way to "wind up" the TARDIM -* (Likely only if access to TARDIM source) Weblate for localisation -* Possibly an enchantment that works same as personal jammer \ No newline at end of file diff --git a/build.gradle b/build.gradle index c789a22..0628cf9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,13 @@ +plugins { + id 'fabric-loom' version '1.2-SNAPSHOT' apply(false) + id 'net.minecraftforge.gradle' version '[6.0,6.2)' apply(false) + id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' apply(false) + id("org.spongepowered.mixin") version "0.7-SNAPSHOT" apply(false) +} + subprojects { - apply plugin: 'java' - + java.toolchain.languageVersion = JavaLanguageVersion.of(17) java.withSourcesJar() java.withJavadocJar() @@ -19,7 +25,7 @@ subprojects { 'Implementation-Version' : project.jar.archiveVersion, 'Implementation-Vendor' : mod_author, 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - 'Timestamp' : System.currentTimeMillis(), + 'Timestamp' : System.currentTimeMillis(), 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", 'Built-On-Minecraft' : minecraft_version ]) @@ -33,34 +39,43 @@ subprojects { } repositories { - mavenCentral() - maven { name = 'Sponge / Mixin' url = 'https://repo.spongepowered.org/repository/maven-public/' } - maven { - name = 'BlameJared Maven (CrT / Bookshelf)' + name = 'BlameJared Maven (JEI / CraftTweaker / Bookshelf)' url = 'https://maven.blamejared.com' } - maven { url 'https://squiddev.cc/maven/' } - maven { url "https://cursemaven.com"} + // CC: Tweaked + maven { + url "https://squiddev.cc/maven/" + content { + includeGroup("cc.tweaked") + includeModule("org.squiddev", "Cobalt") + } + } } tasks.withType(JavaCompile).configureEach { it.options.encoding = 'UTF-8' - it.options.release = 17 + it.options.getRelease().set(17) + } + + processResources { + filesMatching(['pack.mcmeta', 'fabric.mod.json', 'mods.toml', '*.mixins.json']) { + expand project.properties + } } // Disables Gradle's custom module metadata from being published to maven. The // metadata includes mapped dependencies which are not reasonably consumable by // other mod developers. - tasks.withType(GenerateModuleMetadata) { + tasks.withType(GenerateModuleMetadata).configureEach { enabled = false } -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 6b170a9..db34cb7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,18 +3,14 @@ version=1.2 group=su.a71.tardim_ic # Common -minecraft_version=1.19.2 -common_runs_enabled=false -common_client_run_name=Common Client -common_server_run_name=Common Server +minecraft_version=1.20 # Forge -forge_version=43.1.30 -//forge_ats_enabled=true +forge_version=46.0.12 # Fabric -fabric_version=0.62.0+1.19.2 -fabric_loader_version=0.14.10 +fabric_version=0.83.0+1.20 +fabric_loader_version=0.14.21 # Mod options mod_name=tardim_in_control @@ -25,4 +21,4 @@ mod_id=tardim_ic org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -cc_version=1.100.9 \ No newline at end of file +cc_version=1.105.0 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 10158 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 delta 9041 zcmY*t@kVBCBP!g$Qih>$!M(|j-I?-C8+=cK0w!?cVWy9LXH zd%I}(h%K_>9Qvap&`U=={XcolW-VA%#t9ljo~WmY8+Eb|zcKX3eyx7qiuU|a)zU5cYm5{k5IAa3ibZf_B&=YT!-XyLap%QRdebT+PIcg$KjM3HqA3uZ5|yBj2vv8$L{#$>P=xi+J&zLILkooDarGpiupEiuy`9uy&>yEr95d)64m+~`y*NClGrY|5MLlv!)d5$QEtqW)BeBhrd)W5g1{S@J-t8_J1 zthp@?CJY}$LmSecnf3aicXde(pXfeCei4=~ZN=7VoeU|rEEIW^!UBtxGc6W$x6;0fjRs7Nn)*b9JW5*9uVAwi) zj&N7W;i<Qy80(5gsyEIEQm>_+4@4Ol)F?0{YzD(6V~e=zXmc2+R~P~< zuz5pju;(akH2+w5w!vnpoikD5_{L<6T`uCCi@_Uorr`L(8zh~x!yEK*!LN02Q1Iri z>v*dEX<(+_;6ZAOIzxm@PbfY4a>ws4D82&_{9UHCfll!x`6o8*i0ZB+B#Ziv%RgtG z*S}<4!&COp)*ZMmXzl0A8mWA$)fCEzk$Wex*YdB}_-v|k9>jKy^Y>3me;{{|Ab~AL zQC(naNU=JtU3aP6P>Fm-!_k1XbhdS0t~?uJ$ZvLbvow10>nh*%_Kh>7AD#IflU8SL zMRF1fmMX#v8m=MGGb7y5r!Qf~Y}vBW}fsG<{1CHX7Yz z=w*V9(vOs6eO>CDuhurDTf3DVVF^j~rqP*7S-$MLSW7Ab>8H-80ly;9Q0BWoNV zz8Wr2CdK!rW0`sMD&y{Ue{`mEkXm0%S2k;J^iMe|sV5xQbt$ojzfQE+6aM9LWH`t& z8B;Ig7S<1Dwq`3W*w59L(opjq)ll4E-c?MivCh!4>$0^*=DKI&T2&j?;Z82_iZV$H zKmK7tEs7;MI-Vo(9wc1b)kc(t(Yk? z#Hgo8PG_jlF1^|6ge%;(MG~6fuKDFFd&}>BlhBTh&mmuKsn>2buYS=<5BWw^`ncCb zrCRWR5`IwKC@URU8^aOJjSrhvO>s}O&RBD8&V=Fk2@~zYY?$qO&!9%s>YecVY0zhK zBxKGTTyJ(uF`p27CqwPU1y7*)r}y;{|0FUO)-8dKT^>=LUoU_6P^^utg|* zuj}LBA*gS?4EeEdy$bn#FGex)`#y|vg77NVEjTUn8%t z@l|7T({SM!y$PZy9lb2N;BaF}MfGM%rZk10aqvUF`CDaC)&Av|eED$x_;qSoAka*2 z2rR+OTZTAPBx`vQ{;Z{B4Ad}}qOBqg>P4xf%ta|}9kJ2$od>@gyC6Bf&DUE>sqqBT zYA>(sA=Scl2C_EF8)9d8xwdBSnH5uL=I4hch6KCHj-{99IywUD{HR`d(vk@Kvl)WD zXC(v{ZTsyLy{rio*6Wi6Lck%L(7T~Is-F_`2R}q z!H1ylg_)Mv&_|b1{tVl!t{;PDa!0v6^Zqs_`RdxI%@vR)n|`i`7O<>CIMzqI00y{;` zhoMyy>1}>?kAk~ND6}`qlUR=B+a&bvA)BWf%`@N)gt@@Ji2`p1GzRGC$r1<2KBO3N z++YMLD9c|bxC;za_UVJ*r6&Ea;_YC>-Ebe-H=VAgDmx+?Q=DxCE4=yQXrn z7(0X#oIjyfZUd}fv2$;4?8y|0!L^ep_rMz|1gU-hcgVYIlI~o>o$K&)$rwo(KJO~R zDcGKo-@im7C<&2$6+q-xtxlR`I4vL|wFd<`a|T}*Nt;(~Vwx&2QG_j$r0DktR+6I4W)gUx*cDVBwGe00aa803ZYiwy;d{1p)y0?*IT8ddPS`E~MiS z1d%Vm0Hb4LN2*f8FZ|6xRQev@ZK-?(oPs+mT*{%NqhGL_0dJ$?rAxA{2 z`r3MBv&)xblcd>@hArncJpL~C(_HTo&D&CS!_J5Giz$^2EfR_)xjgPg`Bq^u%1C*+ z7W*HGp|{B?dOM}|E)Cs$61y8>&-rHBw;A8 zgkWw}r$nT%t(1^GLeAVyj1l@)6UkHdM!%LJg|0%BO74M593&LlrksrgoO{iEz$}HK z4V>WXgk|7Ya!Vgm#WO^ZLtVjxwZ&k5wT6RteViH3ds{VO+2xMJZ`hToOz~_+hRfY{ z%M;ZDKRNTsK5#h6goUF(h#VXSB|7byWWle*d0$IHP+FA`y)Q^5W!|&N$ndaHexdTn z{vf?T$(9b&tI&O`^+IqpCheAFth;KY(kSl2su_9|Y1B{o9`mm)z^E`Bqw!n+JCRO) zGbIpJ@spvz=*Jki{wufWm|m`)XmDsxvbJR5dLF=kuf_C>dl}{nGO(g4I$8 zSSW#5$?vqUDZHe_%`Zm?Amd^>I4SkBvy+i}wiQYBxj0F1a$*%T+6}Yz?lX&iQ}zaU zI@%8cwVGtF3!Ke3De$dL5^j-$Bh3+By zrSR3c2a>XtaE#TB}^#hq@!vnZ1(An#bk_eKR{?;Z&0cgh4$cMNU2HL=m=YjMTI zT$BRltXs4T=im;Ao+$Bk3Dz(3!C;rTqelJ?RF)d~dP9>$_6dbz=_8#MQFMMX0S$waWxY#mtDn}1U{4PGeRH5?a>{>TU@1UlucMAmzrd@PCwr|il)m1fooO7Z{Vyr z6wn=2A5z(9g9-OU10X_ei50@~)$}w4u)b+mt)z-sz0X32m}NKTt4>!O{^4wA(|3A8 zkr(DxtMnl$Hol>~XNUE?h9;*pGG&kl*q_pb z&*$lH70zI=D^s)fU~A7cg4^tUF6*Oa+3W0=7FFB*bf$Kbqw1&amO50YeZM)SDScqy zTw$-M$NA<_We!@4!|-?V3CEPnfN4t}AeM9W$iSWYz8f;5H)V$pRjMhRV@Z&jDz#FF zXyWh7UiIc7=0U9L35=$G54RjAupR&4j`(O3i?qjOk6gb!WjNtl1Fj-VmltDTos-Bl z*OLfOleS~o3`?l!jTYIG!V7?c<;Xu(&#~xf-f(-jwow-0Hv7JZG>}YKvB=rRbdMyv zmao*-!L?)##-S#V^}oRm7^Db zT5C2RFY4>ov~?w!3l_H}t=#X=vY-*LQy(w>u%r`zQ`_RukSqIv@WyGXa-ppbk-X=g zyn?TH(`-m*in(w=Ny$%dHNSVxsL|_+X=+kM+v_w{ZC(okof9k1RP5qDvcA-d&u{5U z?)a9LXht1f6|Tdy5FgXo;sqR|CKxDKruU9RjK~P6xN+4;0eAc|^x%UO^&NM4!nK_! z6X14Zkk=5tqpl&d6FYuMmlLGQZep0UE3`fT>xzgH>C*hQ2VzCQlO`^kThU6q%3&K^ zf^kfQm|7SeU#c%f8e?A<9mALLJ-;)p_bv6$pp~49_o;>Y=GyUQ)*prjFbkU;z%HkOW_*a#j^0b@GF|`6c}7>=W{Ef!#dz5lpkN>@IH+(sx~QMEFe4 z1GeKK67;&P%ExtO>}^JxBeHii)ykX8W@aWhJO!H(w)DH4sPatQ$F-Phiqx_clj`9m zK;z7X6gD2)8kG^aTr|oY>vmgOPQ4`_W+xj2j!$YT9x(DH6pF~ zd_C#8c>Gfb)k2Ku4~t=Xb>T^8KW;2HPN#%}@@hC1lNf~Xk)~oj=w-Y11a@DtIyYk8 z9^|_RIAA(1qUSs3rowxr&OuRVFL8(zSqU_rGlqHpkeYT4z7DGdS0q4V-b!3fsv$Yb zPq4UP^3XFd(G%JAN|0y>?&sLzNir30K(lyzNYvCtE2gDyy-nthPlrXXU75fhoS7kA zg%GYyBEFQ(xgdjtv+>?>Q!G!8& z3+F>)4|N+F1a^T?XC8 zxRRx7-{DV%uUYt&*$z2uQTbZDbUn)PozID*(i^{JDjNq`v?;&OW^&~{ZPE_e+?RMk z!7O5CUKJSnGZvjTbLX2$zwYRZs_$f{T!hvVHuTg77|O;zBHlA|GIUu_bh4`Bl?7KE zYB~a`b?O;0SfD?0EZiPYpVf=P4=|zr(u_w}oP0S`YOZziX9cuwpll&%QMv4bBC_JdP#rT3>MliqySv0& zh)r=vw?no&;5T}QVTkHKY%t`%{#*#J;aw!wPs}?q2$(e0Y#cdBG1T09ypI@#-y24+fzhJem1NSZ$TCAjU2|ebYG&&6p(0f>wQoNqVa#6J^W!3$gIWEw7d<^k!U~O5v=8goq$jC`p8CS zrox#Jw3w`k&Ty7UVbm35nZ}FYT5`fN)TO6R`tEUFotxr^BTXZGt|n(Ymqmr^pCu^^w?uX!ONbm?q{y9FehdmcJuV8V%A-ma zgl=n9+op{wkj-}N;6t;(JA1A#VF3S9AFh6EXRa0~7qop~3^~t1>hc6rdS_4!+D?Xh z5y?j}*p@*-pmlTb#7C0x{E(E@%eepK_YycNkhrYH^0m)YR&gRuQi4ZqJNv6Rih0zQ zqjMuSng>Ps;?M0YVyh<;D3~;60;>exDe)Vq3x@GRf!$wgFY5w4=Jo=g*E{76%~jqr zxTtb_L4Cz_E4RTfm@0eXfr1%ho?zP(>dsRarS>!^uAh~bd0lEhe2x7AEZQmBc%rU; z&FUrs&mIt8DL`L4JpiFp3NNyk3N>iL6;Nohp*XbZZn%BDhF_y{&{X3UtX(7aAyG63P zELC;>2L`jnFS#vC->A(hZ!tGi7N7^YtW7-LB6!SVdEM&7N?g}r4rW2wLn{Ni*I~$Y z@#;KwJIl0^?eX{JWiHQxDvccnNKBhHW0h6`j=)OH1`)7)69B$XNT@)l1s25M+~o2_ zpa&X<_vHxN_oR|B#ir2p*VNB~o6Z1OE&~a+_|AxS)(@Dgznq(b(|K8BN_nQ7+>N`= zXOx_@AhcmmcRvp6eX#4z6sn=V0%KonKFVY@+m&)Rx!Z5U@WdyHMCF4_qzJNpzc9Fw z7Bdzx54(e7>wcEqHKqH-Paiut;~ZVJpS6_q>ub)zD#TQ4j*i(I8DvS$BfyX~A%<#} z*=g2$8s;YYjEHl`7cKw!a9PFRt8tVR zM&X|bs?B1#ycjl>AzgbdRkr-@NmBc^ys)aoT75F(yweV&Y-3hNNXj-valA&=)G{NL zX?smr5sQWi3n;GGPW{%vW)xw-#D0QY%zjXxYj?($b4JzpW0sWY!fkwC5bJMkhTp$J z6CNVLd=-Ktt7D<^-f|=wjNjf0l%@iu2dR+zdQ&9NLa(B_okKdRy^!Q!F$Ro=hF$-r z!3@ocUs^7?cvdTMPbn*8S-o!PsF;>FcBkBkg&ET`W`lp?j`Z}4>DF|}9407lK9y~^No&pT7J|rVQ9Dh>qg|%=gxxg=! z>WX$!;7s~gDPmPF<--(?CvEnvV*E1KdXpr>XVv!DN~PyISE7d+K_9+W^pnR6cX&?E ziLr{0`JIs@NcA|;8L|p!3H~9y8mga2Dsm4I?rBS7$3wcT!_l*$^8U3hKUri|_I3N2 zz$xY`)IWA7P*Y1BJtyBEh?8EEvs8Oyl^{(+`gi{9hwpcN#I%Z0j$^yBp?z<;Ny!G$ zra3J_^i0(~LiKuITs%v)qE+YrJr?~w+)`Rcte^O=nwmPg@&!Q7FGTtjpTdI6wH&ZV z)2}VZY6(MbP`tgoew++(pt$jVj- zvPK)pSJ)U(XfUqBqZNo|za#Xx+IVEb?HGQ^wUVH&wTdWgP(z#ijyvXjwk>tFBUn*2 zuj5ENQjT{2&T`k;q54*Z>O~djuUBNwc6l(BzY?Ed4SIt9QA&8+>qaRIck?WdD0rh@ zh`VTZPwSNNCcLH3J}(q zdEtu@HfxDTpEqWruG=86m;QVO{}E&q8qYWhmA>(FjW`V&rg!CEL1oZCZcAX@yX(2tg8`>m1psG0ZpO+Rnph@Bhjj!~|+S=@+U{*ukwGrBj{5xfIHHP7|} z^7@g2;d%FMO8f(MS&6c##mrX2i(5uiX1o(=Vw89IQcHw)n{ZTS@``xT$Af@CQTP#w zl3kn6+MJP+l(;K-rWgjpdBU|CB4>W%cObZBH^Am~EvRO%D>uU^HVRXi$1 zb?Pr~ZlopLfT5l%03SjI7>YiGZZs=n(A!c;N9%%aByY~5(-hS4z_i2wgKYsG%OhhxH#^5i%&9ESb(@# zV_f5${Gf=$BK)1VY=NX#f+M}6f`OWmpC*OU3&+P@n>$Xvco*Nm$c<=`S|lY6S}Ut- z80}ztIpkV>W%^Ox`enpk<25_i7`RPiDugxHfUDBD8$bp9XR15>a?r^#&!1Ne6n{MI z){H`!jwrx}8b-w@@E8H0v)l!5!W8En=u67v+`iNoz<_h4{V*qQK+@)JP^JqsKAedZ zNh4toE+I7;^}7kkj|hzNVFWkZ$N9rxPl9|_@2kbW*4}&o%(L`WpQCN2M?gz>cyWHk zulMwRxpdpx+~P(({@%UY20LwM7sA&1M|`bEoq)Id zyUHt>@vfu**UOL9wiW*C75cc&qBX37qLd`<;$gS+mvL^v3Z8i4p6(@Wv`N|U6Exn< zd`@WxqU^8u^Aw+uw#vuDEIByaD)vucU2{4xRseczf_TJXUwaUK+E_IoItXJq88${0 z=K5jGehPa2)CnH&Lcxv&1jQ=T8>*vgp1^%)c&C2TL69;vSN)Q)e#Hj7!oS0 zlrEmJ=w4N9pID5KEY5qz;?2Q}0|4ESEio&cLrp221LTt~j3KjUB`LU?tP=p;B=WSXo;C?8(pnF6@?-ZD0m3DYZ* z#SzaXh|)hmTC|zQOG>aEMw%4&2XU?prlk5(M3ay-YC^QLRMN+TIB*;TB=wL_atpeD zh-!sS%A`3 z=^?niQx+^za_wQd2hRR=hsR0uzUoyOcrY!z7W)G2|C-_gqc`wrG5qCuU!Z?g*GL^H z?j^<_-A6BC^Dp`p(i0!1&?U{YlF@!|W{E@h=qQ&5*|U~V8wS;m!RK(Q6aX~oH9ToE zZYKXZoRV~!?P1ADJ74J-PFk2A{e&gh2o)@yZOZuBi^0+Hkp`dX;cZs9CRM+##;P!*BlA%M48TuR zWUgfD1DLsLs+-4XC>o>wbv-B)!t*47ON5wgoMX%llnmXG%L8209Vi;yZ`+N2v2Ox+ zMe7JHunQE$ckHHhEYRA+e`A3=XO5L%fMau71`XL7v)b{f1rkTY+WWSIkH#sG=pLqe zA(xZIp>_=4$zKq0t_G7q9@L zZ5D-0{8o%7f>0szA#c;rjL;4Y%hl}wYrx1R`Viq|Pz}c-{{LJY070ym@E~mt*pTyG z79bfcWTGGEje;PLD;N-XHw=`wS^howfzb$%oP8n)lN$o$ZWjZx|6iSsi2piI_7s7z zX#b$@z6kIJ^9{-Y^~wJ!s0V^Td5V7#4&pyU#NHw#9)N&qbpNFDR1jqC00W}91OnnS z{$J@GBz%bka`xsz;rb_iJ|rgmpUVyEZ)Xi*SO5U&|NFkTHb3y@e@%{WrvE&Jp#Lw^ zcj13CbsW+V>i@rj@SEfFf0@yjS@nbPB0)6D`lA;e%61nh`-qhydO!uS7jXGQd%i7opEnOL;| zDn!3EUm(V796;f?fA+RDF<@%qKlo)`0VtL74`!~516_aogYP%QfG#<2kQ!pijthz2 zpaFX3|D$%C7!bL242U?-e@2QZ`q$~lgZbvgfLLyVfT1OC5<8@6lLi=A{stK#zJmWd zlx+(HbgX)l$RGwH|2rV@P3o@xCrxch0$*z1ASpy(n+d4d2XWd~2AYjQm`xZU3af8F p+x$Nxf1895@0bJirXkdpJh+N7@Nb7x007(DEB&^Lm}dWn{T~m64-^0Z diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661..fae0804 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index b4f908a..a69d9cb 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env bash +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + 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 @@ -106,78 +140,101 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "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 or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # 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=`expr $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" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -ARGV=("$@") -eval set -- $DEFAULT_JVM_OPTS +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -IFS=$' -' read -rd '' -a JAVA_OPTS_ARR <<< "$(echo $JAVA_OPTS | xargs -n1)" -IFS=$' -' read -rd '' -a GRADLE_OPTS_ARR <<< "$(echo $GRADLE_OPTS | xargs -n1)" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) -exec "$JAVACMD" "$@" "${JAVA_OPTS_ARR[@]}" "${GRADLE_OPTS_ARR[@]}" "-Dorg.gradle.appname=$APP_BASE_NAME" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "${ARGV[@]}" + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 107acd3..f127cfd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 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 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/settings.gradle b/settings.gradle index 299e94c..ada7750 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,10 @@ pluginManagement { repositories { gradlePluginPortal() + maven { + name = 'Forge' + url = 'https://maven.minecraftforge.net/' + } maven { name = 'Fabric' url = 'https://maven.fabricmc.net/' @@ -12,5 +16,12 @@ pluginManagement { } } -rootProject.name = 'tardim_ic' -include("Common", "Fabric", "Forge") \ No newline at end of file +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' +} + +// This should match the folder name of the project, or else IDEA may complain (see https://youtrack.jetbrains.com/issue/IDEA-317606) +rootProject.name = 'Tardim-In-Control' +include("common") +include("fabric") +include("forge")