From 2c372d717659fb02538c50523f65a3a3fc0f4382 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Thu, 14 Nov 2024 20:59:41 -0500 Subject: [PATCH] Zhuhai working --- .../zbgt/api/recipes/ZBGTRecipeMaps.java | 7 + .../zbgt/api/render/ZBGTTextures.java | 2 + .../materials/ZBGTSecondDegreeMaterials.java | 2 +- .../com/zorbatron/zbgt/common/ZBGTConfig.java | 5 + .../zbgt/common/block/blocks/MiscCasing.java | 3 +- .../ZBGTMetaTileEntities.java | 5 + .../electric/MetaTileEntityFishingPort.java | 111 +++++++++++ .../zorbatron/zbgt/recipe/CasingRecipes.java | 16 +- .../zorbatron/zbgt/recipe/FishingPort.java | 183 ++++++++++++++++++ .../zbgt/recipe/MultiblockRecipes.java | 9 + .../zorbatron/zbgt/recipe/ZBGTRecipes.java | 4 + .../textures/blocks/casings/misc/aquatic.png | Bin 0 -> 700 bytes .../assets/zbgt/blockstates/misc_casing.json | 5 + .../resources/assets/zbgt/lang/en_us.lang | 6 +- 14 files changed, 354 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/zorbatron/zbgt/common/metatileentities/multi/electric/MetaTileEntityFishingPort.java create mode 100644 src/main/java/com/zorbatron/zbgt/recipe/FishingPort.java create mode 100644 src/main/resources/assets/gregtech/textures/blocks/casings/misc/aquatic.png diff --git a/src/main/java/com/zorbatron/zbgt/api/recipes/ZBGTRecipeMaps.java b/src/main/java/com/zorbatron/zbgt/api/recipes/ZBGTRecipeMaps.java index d96c34e1..400e991c 100644 --- a/src/main/java/com/zorbatron/zbgt/api/recipes/ZBGTRecipeMaps.java +++ b/src/main/java/com/zorbatron/zbgt/api/recipes/ZBGTRecipeMaps.java @@ -13,6 +13,7 @@ import gregtech.api.gui.GuiTextures; import gregtech.api.gui.widgets.ProgressWidget; import gregtech.api.recipes.RecipeMap; +import gregtech.api.recipes.builders.SimpleRecipeBuilder; import gregtech.api.unification.material.Materials; import gregtech.core.sound.GTSoundEvents; @@ -38,6 +39,12 @@ public final class ZBGTRecipeMaps { } }); + public static final RecipeMap FISHING_PORT_RECIPES = new RecipeMap<>( + "fishing_port_recipes", + 1, 16, 0, 0, + new SimpleRecipeBuilder(), false) + .setSound(GTSoundEvents.BATH); + public static void modifyMaps() { POLARIZER_RECIPES.setMaxFluidInputs(1); POLARIZER_RECIPES.setMaxFluidOutputs(1); diff --git a/src/main/java/com/zorbatron/zbgt/api/render/ZBGTTextures.java b/src/main/java/com/zorbatron/zbgt/api/render/ZBGTTextures.java index 9b87fec2..bc44d5c2 100644 --- a/src/main/java/com/zorbatron/zbgt/api/render/ZBGTTextures.java +++ b/src/main/java/com/zorbatron/zbgt/api/render/ZBGTTextures.java @@ -33,6 +33,7 @@ public class ZBGTTextures { public static SimpleOverlayRenderer PRECISE_CASING_2; public static SimpleOverlayRenderer PRECISE_CASING_3; public static SimpleOverlayRenderer PRECISE_CASING_4; + public static SimpleOverlayRenderer AQUATIC_CASING; public static SimpleOverlayRenderer IRIDIUM_CASING; @@ -60,6 +61,7 @@ public static void preInit() { PRECISE_CASING_2 = new SimpleOverlayRenderer("casings/precise/precise_2"); PRECISE_CASING_3 = new SimpleOverlayRenderer("casings/precise/precise_3"); PRECISE_CASING_4 = new SimpleOverlayRenderer("casings/precise/precise_4"); + AQUATIC_CASING = new SimpleOverlayRenderer("casings/misc/aquatic"); IRIDIUM_CASING = new SimpleOverlayRenderer("casings/material/iridium"); diff --git a/src/main/java/com/zorbatron/zbgt/api/unification/material/materials/ZBGTSecondDegreeMaterials.java b/src/main/java/com/zorbatron/zbgt/api/unification/material/materials/ZBGTSecondDegreeMaterials.java index 194bdd07..d2332e0f 100644 --- a/src/main/java/com/zorbatron/zbgt/api/unification/material/materials/ZBGTSecondDegreeMaterials.java +++ b/src/main/java/com/zorbatron/zbgt/api/unification/material/materials/ZBGTSecondDegreeMaterials.java @@ -98,7 +98,7 @@ public static void register() { EglinSteel = new Material.Builder(id++, zbgtId("eglin_steel")) .ingot().liquid(new FluidBuilder().temperature(1320)) .color(0x8b4513).iconSet(METALLIC) - .flags(EXT_METAL, DECOMPOSITION_BY_CENTRIFUGING) + .flags(EXT_METAL, DECOMPOSITION_BY_CENTRIFUGING, GENERATE_FRAME) .components(EglinSteelBase, 10, Sulfur, 1, Silicon, 4, Carbon, 1) .build(); } diff --git a/src/main/java/com/zorbatron/zbgt/common/ZBGTConfig.java b/src/main/java/com/zorbatron/zbgt/common/ZBGTConfig.java index 69250c66..9eb565a2 100644 --- a/src/main/java/com/zorbatron/zbgt/common/ZBGTConfig.java +++ b/src/main/java/com/zorbatron/zbgt/common/ZBGTConfig.java @@ -74,6 +74,11 @@ public static class RecipeSettings { "Default: true" }) @Config.Name("CAL Circuit Recipes") public boolean calCircuitRecipes = true; + + @Config.Comment({ "Register Zhuhai recipes", + "Default: true" }) + @Config.Name("Zhuhai Recipes") + public boolean zhuhaiRecipes = true; } @Config.Name("World Generation Settings") diff --git a/src/main/java/com/zorbatron/zbgt/common/block/blocks/MiscCasing.java b/src/main/java/com/zorbatron/zbgt/common/block/blocks/MiscCasing.java index 05bb27ef..59666f28 100644 --- a/src/main/java/com/zorbatron/zbgt/common/block/blocks/MiscCasing.java +++ b/src/main/java/com/zorbatron/zbgt/common/block/blocks/MiscCasing.java @@ -27,7 +27,8 @@ public enum CasingType implements IStringSerializable { COMPACT_FUSION_COIL_1("compact_fusion_coil_1"), COMPACT_FUSION_COIL_2("compact_fusion_coil_2"), COMPACT_FUSION_COIL_3("compact_fusion_coil_3"), - COMPACT_FUSION_COIL_4("compact_fusion_coil_4"); + COMPACT_FUSION_COIL_4("compact_fusion_coil_4"), + AQUATIC_CASING("aquatic_casing"); private final String name; diff --git a/src/main/java/com/zorbatron/zbgt/common/metatileentities/ZBGTMetaTileEntities.java b/src/main/java/com/zorbatron/zbgt/common/metatileentities/ZBGTMetaTileEntities.java index 866cdaeb..6e120620 100644 --- a/src/main/java/com/zorbatron/zbgt/common/metatileentities/ZBGTMetaTileEntities.java +++ b/src/main/java/com/zorbatron/zbgt/common/metatileentities/ZBGTMetaTileEntities.java @@ -6,6 +6,7 @@ import com.zorbatron.zbgt.common.metatileentities.multi.MetaTileEntityYOTTank; import com.zorbatron.zbgt.common.metatileentities.multi.electric.MetaTileEntityCircuitAssemblyLine; import com.zorbatron.zbgt.common.metatileentities.multi.electric.MetaTileEntityCoAL; +import com.zorbatron.zbgt.common.metatileentities.multi.electric.MetaTileEntityFishingPort; import com.zorbatron.zbgt.common.metatileentities.multi.electric.large.*; import com.zorbatron.zbgt.common.metatileentities.multi.electric.mega.*; import com.zorbatron.zbgt.common.metatileentities.multi.electric.quad.*; @@ -39,6 +40,7 @@ public class ZBGTMetaTileEntities { public static MetaTileEntityCoAL CoAL; public static MetaTileEntityCircuitAssemblyLine CAL; + public static MetaTileEntityFishingPort FISHING_PORT; public static MetaTileEntityQueebf QUAD_EBF; public static MetaTileEntityQueezer QUEEZER; @@ -150,5 +152,8 @@ public static void init() { CAL = registerMetaTileEntity(18070, new MetaTileEntityCircuitAssemblyLine(zbgtId("cal"))); + + FISHING_PORT = registerMetaTileEntity(18074, + new MetaTileEntityFishingPort(zbgtId("fishing_port"))); } } diff --git a/src/main/java/com/zorbatron/zbgt/common/metatileentities/multi/electric/MetaTileEntityFishingPort.java b/src/main/java/com/zorbatron/zbgt/common/metatileentities/multi/electric/MetaTileEntityFishingPort.java new file mode 100644 index 00000000..76d9a125 --- /dev/null +++ b/src/main/java/com/zorbatron/zbgt/common/metatileentities/multi/electric/MetaTileEntityFishingPort.java @@ -0,0 +1,111 @@ +package com.zorbatron.zbgt.common.metatileentities.multi.electric; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import org.jetbrains.annotations.NotNull; + +import com.zorbatron.zbgt.api.recipes.ZBGTRecipeMaps; +import com.zorbatron.zbgt.api.render.ZBGTTextures; +import com.zorbatron.zbgt.common.block.ZBGTMetaBlocks; +import com.zorbatron.zbgt.common.block.blocks.MiscCasing; + +import gregicality.multiblocks.api.metatileentity.GCYMRecipeMapMultiblockController; +import gregtech.api.capability.impl.GhostCircuitItemStackHandler; +import gregtech.api.gui.GuiTextures; +import gregtech.api.gui.Widget; +import gregtech.api.gui.widgets.GhostCircuitSlotWidget; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.metatileentity.multiblock.IMultiblockPart; +import gregtech.api.pattern.BlockPattern; +import gregtech.api.pattern.FactoryBlockPattern; +import gregtech.client.renderer.ICubeRenderer; + +public class MetaTileEntityFishingPort extends GCYMRecipeMapMultiblockController { + + private GhostCircuitItemStackHandler circuitSlot; + + public MetaTileEntityFishingPort(ResourceLocation metaTileEntityId) { + super(metaTileEntityId, ZBGTRecipeMaps.FISHING_PORT_RECIPES); + } + + @Override + public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { + return new MetaTileEntityFishingPort(metaTileEntityId); + } + + @Override + protected void initializeInventory() { + super.initializeInventory(); + + circuitSlot = new GhostCircuitItemStackHandler(this); + circuitSlot.addNotifiableMetaTileEntity(this); + } + + @Override + protected void initializeAbilities() { + super.initializeAbilities(); + + this.inputInventory = circuitSlot; + } + + @Override + protected @NotNull BlockPattern createStructurePattern() { + return FactoryBlockPattern.start() + .aisle("XXXXXXXXX", "XXXXXXXXX", "XXXXXXXXX") + .aisle("XXXXXXXXX", "XWWWWWWWX", "XWWWWWWWX").setRepeatable(7, 7) + .aisle("XXXXXXXXX", "XXXXSXXXX", "XXXXXXXXX") + .where('S', selfPredicate()) + .where('X', states(getCasingState()).setMinGlobalLimited(64) + .or(autoAbilities(true, true, false, true, false, false, false))) + .where('W', any()) + .build(); + } + + protected IBlockState getCasingState() { + return ZBGTMetaBlocks.MISC_CASING.getState(MiscCasing.CasingType.AQUATIC_CASING); + } + + @Override + protected @NotNull Widget getFlexButton(int x, int y, int width, int height) { + return new GhostCircuitSlotWidget(circuitSlot, 0, x, y) + .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.INT_CIRCUIT_OVERLAY) + .setConsumer(slotWidget -> slotWidget.setTooltipText("gregtech.gui.configurator_slot.tooltip", + circuitSlot.getCircuitValue() == GhostCircuitItemStackHandler.NO_CONFIG ? + new TextComponentTranslation("gregtech.gui.configurator_slot.no_value") + .getFormattedText() : + String.valueOf(circuitSlot.getCircuitValue()))); + } + + @SideOnly(Side.CLIENT) + @Override + public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { + return ZBGTTextures.AQUATIC_CASING; + } + + @Override + public boolean allowsExtendedFacing() { + return false; + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + + circuitSlot.write(data); + + return data; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + + circuitSlot.read(data); + } +} diff --git a/src/main/java/com/zorbatron/zbgt/recipe/CasingRecipes.java b/src/main/java/com/zorbatron/zbgt/recipe/CasingRecipes.java index 23192654..5f87f7b4 100644 --- a/src/main/java/com/zorbatron/zbgt/recipe/CasingRecipes.java +++ b/src/main/java/com/zorbatron/zbgt/recipe/CasingRecipes.java @@ -25,12 +25,14 @@ import com.zorbatron.zbgt.common.block.blocks.PreciseCasing; import com.zorbatron.zbgt.common.items.ZBGTMetaItems; +import gregicality.multiblocks.api.unification.GCYMMaterials; import gregtech.api.block.VariantBlock; import gregtech.api.recipes.ModHandler; import gregtech.api.recipes.builders.AssemblyLineRecipeBuilder; import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; +import gregtech.api.unification.stack.UnificationEntry; import gregtech.api.util.GTUtility; import gregtech.common.ConfigHolder; import gregtech.common.blocks.BlockFusionCasing; @@ -276,10 +278,22 @@ private static void miscCasings() { ModHandler.addShapedRecipe("yottank_casing", ZBGTMetaBlocks.MISC_CASING.getItemVariant(MiscCasing.CasingType.YOTTANK_CASING, casingsPerCraft), - "BPB", "TFT", "BPB", + "BPB", + "TFT", + "BPB", 'B', OreDictUnifier.get(plate, BlackSteel), 'P', OreDictUnifier.get(pipeNormalFluid, StainlessSteel), 'F', OreDictUnifier.get(frameGt, BlackSteel), 'T', OreDictUnifier.get(plate, Polytetrafluoroethylene)); + + ModHandler.addShapedRecipe("aquatic_casing", + ZBGTMetaBlocks.MISC_CASING.getItemVariant(MiscCasing.CasingType.AQUATIC_CASING, + casingsPerCraft), + "WhW", + "EFE", + "WwW", + 'W', new UnificationEntry(plate, GCYMMaterials.WatertightSteel), + 'E', new UnificationEntry(plate, EglinSteel), + 'F', new UnificationEntry(frameGt, EglinSteel)); } } diff --git a/src/main/java/com/zorbatron/zbgt/recipe/FishingPort.java b/src/main/java/com/zorbatron/zbgt/recipe/FishingPort.java new file mode 100644 index 00000000..17762e00 --- /dev/null +++ b/src/main/java/com/zorbatron/zbgt/recipe/FishingPort.java @@ -0,0 +1,183 @@ +package com.zorbatron.zbgt.recipe; + +import static com.zorbatron.zbgt.api.recipes.ZBGTRecipeMaps.FISHING_PORT_RECIPES; +import static gregtech.api.GTValues.*; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class FishingPort { + + private static int circuit = 1; + + protected static void init() { + // Fish + ItemStack fish = new ItemStack(Items.FISH, 1, 0); + ItemStack salmon = new ItemStack(Items.FISH, 1, 1); + ItemStack tropicalFish = new ItemStack(Items.FISH, 1, 2); + ItemStack pufferFish = new ItemStack(Items.FISH, 1, 3); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .outputs(fish) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .outputs(salmon) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .outputs(tropicalFish) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .outputs(pufferFish) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .outputs(fish) + .outputs(salmon) + .outputs(tropicalFish) + .outputs(pufferFish) + .EUt(VA[LV]).duration(5 * 20 * 4) + .buildAndRegister(); + + // "Treasure" + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.BOW) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.BOOK) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.FISHING_ROD) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.NAME_TAG) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.SADDLE) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.BOW) + .output(Items.BOOK) + .output(Items.FISHING_ROD) + .output(Items.NAME_TAG) + .output(Items.SADDLE) + .EUt(VA[LV]).duration(5 * 20 * 5) + .buildAndRegister(); + + // "Junk" + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Blocks.WATERLILY) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.BOWL) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.LEATHER) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.LEATHER_BOOTS) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.ROTTEN_FLESH) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.STICK) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.STRING) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + ItemStack waterBottle = new ItemStack(Items.POTIONITEM); + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("Potion", "minecraft:water"); + waterBottle.setTagCompound(tag); + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .outputs(waterBottle) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.BONE) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Items.DYE) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Blocks.TRIPWIRE_HOOK) + .EUt(VA[LV]).duration(5 * 20) + .buildAndRegister(); + + FISHING_PORT_RECIPES.recipeBuilder() + .circuitMeta(circuit++) + .output(Blocks.WATERLILY) + .output(Items.BOWL) + .output(Items.LEATHER) + .output(Items.LEATHER_BOOTS) + .output(Items.ROTTEN_FLESH) + .output(Items.STICK) + .output(Items.STRING) + .outputs(waterBottle) + .output(Items.BONE) + .output(Items.DYE) + .output(Blocks.TRIPWIRE_HOOK) + .EUt(VA[LV]).duration(5 * 20 * 11) + .buildAndRegister(); + } +} diff --git a/src/main/java/com/zorbatron/zbgt/recipe/MultiblockRecipes.java b/src/main/java/com/zorbatron/zbgt/recipe/MultiblockRecipes.java index f9a7a176..ce0ae2fb 100644 --- a/src/main/java/com/zorbatron/zbgt/recipe/MultiblockRecipes.java +++ b/src/main/java/com/zorbatron/zbgt/recipe/MultiblockRecipes.java @@ -290,5 +290,14 @@ private static void misc() { .output(ZBGTMetaTileEntities.CAL) .EUt(VA[LuV]).duration(20 * 45) .buildAndRegister(); + + ModHandler.addShapedRecipe("zhuhai", ZBGTMetaTileEntities.FISHING_PORT.getStackForm(), + "PCP", + "WAW", + "PCP", + 'P', new UnificationEntry(plate, GCYMMaterials.WatertightSteel), + 'C', new UnificationEntry(circuit, getMarkerMaterialByTier(IV)), + 'W', new UnificationEntry(wireFine, Electrum), + 'A', ZBGTMetaBlocks.MISC_CASING.getItemVariant(MiscCasing.CasingType.AQUATIC_CASING)); } } diff --git a/src/main/java/com/zorbatron/zbgt/recipe/ZBGTRecipes.java b/src/main/java/com/zorbatron/zbgt/recipe/ZBGTRecipes.java index 1abe0134..3a46266b 100644 --- a/src/main/java/com/zorbatron/zbgt/recipe/ZBGTRecipes.java +++ b/src/main/java/com/zorbatron/zbgt/recipe/ZBGTRecipes.java @@ -23,5 +23,9 @@ public static void init() { if (ZBGTConfig.recipeSettings.calCircuitRecipes) { CALCircuits.init(); } + + if (ZBGTConfig.recipeSettings.zhuhaiRecipes) { + FishingPort.init(); + } } } diff --git a/src/main/resources/assets/gregtech/textures/blocks/casings/misc/aquatic.png b/src/main/resources/assets/gregtech/textures/blocks/casings/misc/aquatic.png new file mode 100644 index 0000000000000000000000000000000000000000..b40e77a3544cf9949b71dfe9540f295167dfcf45 GIT binary patch literal 700 zcmV;t0z>_YP)EX>4Tx04R}tkv&MmKpe$iQ?)9UB6bjQ$WWc^q9Tr^ibb$c+6t{Ym|XfHG-*gu zTpR`0f`cE6RR4rtTPCT<| z>74h8!>lYR#OK5l23?T&k?XR{Z=6dG3p_JyWYcrRVPdh=!Ey()vY`@B6Gs$PqkJLf zvch?bvs$UK);;+Pg9U9l!*!aYNMI33q#!~@4I8MyLX=jG6ccIMk9+t>9Dj;jGPyRu z$T5#9R7j2={11M2YZj*_-K1a~=zg*7k1-&y3pDGt{e5iP%@e@?3|wh#f3*S3ev)2q zYmp-$v<+Nbw>5bWxZDATpLEHP9LY~pC>DYDGy0}HFmwy_ue!ap_Hp_EWT~sA8{ps& z7%x%wn#a3)JA3>0Osl^iQH^q$l$jAi00006VoOIv0RI600RN!9r;`8x010qNS#tmY z4#NNd4#NS*Z>VGd007KML_t(I%f*td7J@(&gg-q5;zmpoi5sajBa!GM_$WMr(MYsu z+(_IAZR19p27X))_y@s>_nw(MXYQ>0O>$=eJOH+rdF(oA1%O}|4|bwd09YAMa?M#e z4qDu*3YlgIl|$4G6*fK$$hs8=Si1|EW`pJT890b!%(bWptZA%@0E$z8;G;mF$-c22 zOxSj@W+DDB;JGie+=iMH)Hq!?3>&jLPHAt*>CJiNBU; iAkcMto