From ba014d54f702040b1df8c291b38898835e9ace4c Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 24 Nov 2023 15:00:52 +0100 Subject: [PATCH] new radar targeting interface, second GUI, target localiaztion --- .../api/hbm/entity/IRadarDetectableNT.java | 8 ++ src/main/java/api/hbm/entity/RadarEntry.java | 15 ++-- .../com/hbm/crafting/ConsumableRecipes.java | 2 +- .../missile/EntityMissileAntiBallistic.java | 28 ++++++- .../entity/missile/EntityMissileBaseNT.java | 20 ++++- .../entity/missile/EntityMissileCustom.java | 33 ++++++++ .../entity/missile/EntityMissileDoomsday.java | 11 +++ .../entity/missile/EntityMissileShuttle.java | 11 +++ .../entity/missile/EntityMissileTier0.java | 13 +++ .../entity/missile/EntityMissileTier1.java | 11 +++ .../entity/missile/EntityMissileTier2.java | 11 +++ .../entity/missile/EntityMissileTier3.java | 11 +++ .../entity/missile/EntityMissileTier4.java | 13 ++- .../container/ContainerMachineRadarNT.java | 76 ++++++++++++++++++ .../hbm/inventory/gui/GUIMachineRadarNT.java | 5 ++ .../inventory/gui/GUIMachineRadarNTSlots.java | 69 ++++++++++++++++ .../hbm/inventory/gui/GuiInfoContainer.java | 4 + .../machine/TileEntityMachineRadarNT.java | 69 +++++++++++----- src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 20 ++++- .../textures/gui/machine/gui_radar_link.png | Bin 1491 -> 2030 bytes .../hbm/textures/gui/machine/gui_radar_nt.png | Bin 19931 -> 20169 bytes 22 files changed, 405 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerMachineRadarNT.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIMachineRadarNTSlots.java diff --git a/src/main/java/api/hbm/entity/IRadarDetectableNT.java b/src/main/java/api/hbm/entity/IRadarDetectableNT.java index 19b3f85bf..0b327620c 100644 --- a/src/main/java/api/hbm/entity/IRadarDetectableNT.java +++ b/src/main/java/api/hbm/entity/IRadarDetectableNT.java @@ -15,11 +15,19 @@ public interface IRadarDetectableNT { public static final int TIER_AB = 10; public static final int PLAYER = 11; public static final int ARTY = 12; + /** Reserved type that shows a unique purple blip. Used for when nothing else applies. */ + public static final int SPECIAL = 13; + /** Name use for radar display, uses I18n for lookup */ public String getUnlocalizedName(); + /** The type of dot to show on the radar as well as the redstone level in tier mode */ public int getBlipLevel(); + /** Whether the object can be seen by this type of radar */ public boolean canBeSeenBy(Object radar); + /** Whether the object is currently visible, as well as whether the radar's setting allow for picking this up */ public boolean paramsApplicable(RadarScanParams params); + /** Whether this radar entry should be counted for the redstone output */ + public boolean suppliesRedstone(RadarScanParams params); public static class RadarScanParams { public boolean scanMissiles = true; diff --git a/src/main/java/api/hbm/entity/RadarEntry.java b/src/main/java/api/hbm/entity/RadarEntry.java index 56bb41df4..91733b81e 100644 --- a/src/main/java/api/hbm/entity/RadarEntry.java +++ b/src/main/java/api/hbm/entity/RadarEntry.java @@ -7,34 +7,39 @@ import net.minecraft.entity.player.EntityPlayer; public class RadarEntry { + /** Name use for radar display, uses I18n for lookup */ public String unlocalizedName; + /** The type of dot to show on the radar as well as the redstone level in tier mode */ public int blipLevel; public int posX; public int posY; public int posZ; public int dim; + /** Whether this radar entry should be counted for the redstone output */ + public boolean redstone; public RadarEntry() { } //blank ctor for packets - public RadarEntry(String name, int level, int x, int y, int z, int dim) { + public RadarEntry(String name, int level, int x, int y, int z, int dim, boolean redstone) { this.unlocalizedName = name; this.blipLevel = level; this.posX = x; this.posY = y; this.posZ = z; this.dim = dim; + this.redstone = redstone; } - public RadarEntry(IRadarDetectableNT detectable, Entity entity) { - this(detectable.getUnlocalizedName(), detectable.getBlipLevel(), (int) Math.floor(entity.posX), (int) Math.floor(entity.posY), (int) Math.floor(entity.posZ), entity.dimension); + public RadarEntry(IRadarDetectableNT detectable, Entity entity, boolean redstone) { + this(detectable.getUnlocalizedName(), detectable.getBlipLevel(), (int) Math.floor(entity.posX), (int) Math.floor(entity.posY), (int) Math.floor(entity.posZ), entity.dimension, redstone); } public RadarEntry(IRadarDetectable detectable, Entity entity) { - this(detectable.getTargetType().name, detectable.getTargetType().ordinal(), (int) Math.floor(entity.posX), (int) Math.floor(entity.posY), (int) Math.floor(entity.posZ), entity.dimension); + this(detectable.getTargetType().name, detectable.getTargetType().ordinal(), (int) Math.floor(entity.posX), (int) Math.floor(entity.posY), (int) Math.floor(entity.posZ), entity.dimension, entity.motionY < 0); } public RadarEntry(EntityPlayer player) { - this(player.getDisplayName(), IRadarDetectableNT.PLAYER, (int) Math.floor(player.posX), (int) Math.floor(player.posY), (int) Math.floor(player.posZ), player.dimension); + this(player.getDisplayName(), IRadarDetectableNT.PLAYER, (int) Math.floor(player.posX), (int) Math.floor(player.posY), (int) Math.floor(player.posZ), player.dimension, true); } public void fromBytes(ByteBuf buf) { diff --git a/src/main/java/com/hbm/crafting/ConsumableRecipes.java b/src/main/java/com/hbm/crafting/ConsumableRecipes.java index a7a2b6e3f..caac98962 100644 --- a/src/main/java/com/hbm/crafting/ConsumableRecipes.java +++ b/src/main/java/com/hbm/crafting/ConsumableRecipes.java @@ -52,7 +52,7 @@ public class ConsumableRecipes { CraftingManager.addShapelessAuto(new ItemStack(ModItems.med_ptsd, 1), new Object[] { ModItems.med_ipecac }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.pancake, 1), new Object[] { REDSTONE.dust(), DIAMOND.dust(), Items.wheat, ModItems.bolt_tungsten, ModItems.wire_copper, STEEL.plate() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.pancake, 1), new Object[] { REDSTONE.dust(), EMERALD.dust(), Items.wheat, ModItems.bolt_tungsten, ModItems.wire_copper, STEEL.plate() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.chocolate_milk, 1), new Object[] { KEY_ANYPANE, new ItemStack(Items.dye, 1, 3), Items.milk_bucket, KNO.block(), S.dust(), S.dust(), S.dust(), P_RED.dust() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.chocolate_milk, 1), new Object[] { KEY_ANYPANE, new ItemStack(Items.dye, 1, 3), Items.milk_bucket, Fluids.NITROGLYCERIN.getDict(1_000) }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.loops), new Object[] { ModItems.flame_pony, Items.wheat, Items.sugar }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.loop_stew), new Object[] { ModItems.loops, ModItems.can_smart, Items.bowl }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.coffee), new Object[] { COAL.dust(), Items.milk_bucket, Items.potionitem, Items.sugar }); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java b/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java index 8c0ca9511..21657fafb 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java @@ -10,6 +10,7 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineRadarNT; import api.hbm.entity.IRadarDetectable; +import api.hbm.entity.IRadarDetectableNT; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; @@ -23,7 +24,7 @@ import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager.Type; -public class EntityMissileAntiBallistic extends EntityThrowableInterp implements IChunkLoader, IRadarDetectable { +public class EntityMissileAntiBallistic extends EntityThrowableInterp implements IChunkLoader, IRadarDetectable, IRadarDetectableNT { private Ticket loaderTicket; public Entity tracking; @@ -226,4 +227,29 @@ public class EntityMissileAntiBallistic extends EntityThrowableInterp implements public RadarTargetType getTargetType() { return RadarTargetType.MISSILE_AB; } + + @Override + public String getUnlocalizedName() { + return "radar.target.abm"; + } + + @Override + public int getBlipLevel() { + return IRadarDetectableNT.TIER_AB; + } + + @Override + public boolean canBeSeenBy(Object radar) { + return true; + } + + @Override + public boolean paramsApplicable(RadarScanParams params) { + return params.scanMissiles; + } + + @Override + public boolean suppliesRedstone(RadarScanParams params) { + return false; + } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java index aa45fc7ef..9cc8c9456 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java @@ -9,6 +9,7 @@ import com.hbm.explosion.ExplosionLarge; import com.hbm.main.MainRegistry; import api.hbm.entity.IRadarDetectable; +import api.hbm.entity.IRadarDetectableNT; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.ItemStack; @@ -23,7 +24,7 @@ import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager.Type; -public abstract class EntityMissileBaseNT extends EntityThrowableInterp implements IChunkLoader, IRadarDetectable { +public abstract class EntityMissileBaseNT extends EntityThrowableInterp implements IChunkLoader, IRadarDetectable, IRadarDetectableNT { public int startX; public int startZ; @@ -62,6 +63,23 @@ public abstract class EntityMissileBaseNT extends EntityThrowableInterp implemen this.setSize(1.5F, 1.5F); } + + @Override + public boolean canBeSeenBy(Object radar) { + return true; + } + + @Override + public boolean paramsApplicable(RadarScanParams params) { + if(!params.scanMissiles) return false; + return true; + } + + @Override + public boolean suppliesRedstone(RadarScanParams params) { + if(params.smartMode && this.motionY >= 0) return false; + return true; + } @Override protected void entityInit() { diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java index f2ebf4584..7c82eb017 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java @@ -21,6 +21,7 @@ import com.hbm.items.weapon.ItemMissile.WarheadType; import com.hbm.main.MainRegistry; import api.hbm.entity.IRadarDetectable; +import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -233,6 +234,38 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo return RadarTargetType.MISSILE_TIER1; } + @Override + public String getUnlocalizedName() { + + ItemMissile part = (ItemMissile) Item.getItemById(this.dataWatcher.getWatchableObjectInt(10)); + PartSize top = part.top; + PartSize bottom = part.bottom; + + if(top == PartSize.SIZE_10 && bottom == PartSize.SIZE_10) return "radar.target.custom10"; + if(top == PartSize.SIZE_10 && bottom == PartSize.SIZE_15) return "radar.target.custom1015"; + if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_15) return "radar.target.custom15"; + if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_20) return "radar.target.custom1520"; + if(top == PartSize.SIZE_20 && bottom == PartSize.SIZE_20) return "radar.target.custom20"; + + return "radar.target.custom"; + } + + @Override + public int getBlipLevel() { + + ItemMissile part = (ItemMissile) Item.getItemById(this.dataWatcher.getWatchableObjectInt(10)); + PartSize top = part.top; + PartSize bottom = part.bottom; + + if(top == PartSize.SIZE_10 && bottom == PartSize.SIZE_10) return IRadarDetectableNT.TIER10; + if(top == PartSize.SIZE_10 && bottom == PartSize.SIZE_15) return IRadarDetectableNT.TIER10_15; + if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_15) return IRadarDetectableNT.TIER15; + if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_20) return IRadarDetectableNT.TIER15_20; + if(top == PartSize.SIZE_20 && bottom == PartSize.SIZE_20) return IRadarDetectableNT.TIER20; + + return IRadarDetectableNT.TIER1; + } + @Override public List getDebris() { return new ArrayList(); } @Override public ItemStack getDebrisRareDrop() { return null; } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java b/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java index e4f8609b4..63e14e7f3 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java @@ -4,6 +4,7 @@ import java.util.List; import com.hbm.explosion.ExplosionLarge; +import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -108,4 +109,14 @@ public class EntityMissileDoomsday extends EntityMissileBaseNT { public RadarTargetType getTargetType() { return RadarTargetType.MISSILE_TIER4; } + + @Override + public String getUnlocalizedName() { + return "radar.target.doomsday"; + } + + @Override + public int getBlipLevel() { + return IRadarDetectableNT.TIER4; + } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java index 42edb75dd..356588f64 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java @@ -11,6 +11,7 @@ import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import api.hbm.entity.IRadarDetectableNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; @@ -64,4 +65,14 @@ public class EntityMissileShuttle extends EntityMissileBaseNT { public RadarTargetType getTargetType() { return RadarTargetType.MISSILE_TIER3; } + + @Override + public String getUnlocalizedName() { + return "radar.target.shuttle"; + } + + @Override + public int getBlipLevel() { + return IRadarDetectableNT.TIER3; + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java index e3aee4b0b..d1d6ecba9 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java @@ -13,6 +13,9 @@ import com.hbm.entity.logic.EntityNukeExplosionMK3; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.ExplosionNukeSmall; import com.hbm.items.ModItems; + +import api.hbm.entity.IRadarDetectableNT; + import com.hbm.items.ItemAmmoEnums.AmmoFatman; import net.minecraft.item.ItemStack; @@ -38,6 +41,16 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public RadarTargetType getTargetType() { return RadarTargetType.MISSILE_TIER0; } + + @Override + public String getUnlocalizedName() { + return "radar.target.tier0"; + } + + @Override + public int getBlipLevel() { + return IRadarDetectableNT.TIER0; + } public static class EntityMissileMicro extends EntityMissileTier0 { public EntityMissileMicro(World world) { super(world); } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java index 8fe5cae83..f640def7a 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java @@ -7,6 +7,7 @@ import com.hbm.explosion.ExplosionChaos; import com.hbm.explosion.ExplosionLarge; import com.hbm.items.ModItems; +import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -29,6 +30,16 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { return RadarTargetType.MISSILE_TIER1; } + @Override + public String getUnlocalizedName() { + return "radar.target.tier1"; + } + + @Override + public int getBlipLevel() { + return IRadarDetectableNT.TIER1; + } + public static class EntityMissileGeneric extends EntityMissileTier1 { public EntityMissileGeneric(World world) { super(world); } public EntityMissileGeneric(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java index 9296e0448..8c9917324 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java @@ -8,6 +8,7 @@ import com.hbm.explosion.ExplosionChaos; import com.hbm.explosion.ExplosionLarge; import com.hbm.items.ModItems; +import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -33,6 +34,16 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { return RadarTargetType.MISSILE_TIER2; } + @Override + public String getUnlocalizedName() { + return "radar.target.tier2"; + } + + @Override + public int getBlipLevel() { + return IRadarDetectableNT.TIER2; + } + public static class EntityMissileStrong extends EntityMissileTier2 { public EntityMissileStrong(World world) { super(world); } public EntityMissileStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java index 11c527b0e..17602263a 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java @@ -10,6 +10,7 @@ import com.hbm.explosion.ExplosionThermo; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.items.ModItems; +import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -34,6 +35,16 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public RadarTargetType getTargetType() { return RadarTargetType.MISSILE_TIER3; } + + @Override + public String getUnlocalizedName() { + return "radar.target.tier3"; + } + + @Override + public int getBlipLevel() { + return IRadarDetectableNT.TIER3; + } public static class EntityMissileBurst extends EntityMissileTier3 { public EntityMissileBurst(World world) { super(world); } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java index 7e859c779..826f4143f 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java @@ -10,6 +10,7 @@ import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.explosion.ExplosionLarge; import com.hbm.items.ModItems; +import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -31,7 +32,17 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { @Override public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER1; + return RadarTargetType.MISSILE_TIER4; + } + + @Override + public String getUnlocalizedName() { + return "radar.target.tier4"; + } + + @Override + public int getBlipLevel() { + return IRadarDetectableNT.TIER4; } public static class EntityMissileNuclear extends EntityMissileTier4 { diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineRadarNT.java b/src/main/java/com/hbm/inventory/container/ContainerMachineRadarNT.java new file mode 100644 index 000000000..0bd1f475b --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineRadarNT.java @@ -0,0 +1,76 @@ +package com.hbm.inventory.container; + +import com.hbm.items.ModItems; +import com.hbm.tileentity.machine.TileEntityMachineRadarNT; + +import api.hbm.energy.IBatteryItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerMachineRadarNT extends Container { + + private TileEntityMachineRadarNT radar; + + public ContainerMachineRadarNT(InventoryPlayer invPlayer, TileEntityMachineRadarNT tedf) { + this.radar = tedf; + + for(int i = 0; i < 8; i++) this.addSlotToContainer(new Slot(tedf, i, 26 + i * 18, 17)); + + this.addSlotToContainer(new Slot(tedf, 8, 26, 44)); + this.addSlotToContainer(new Slot(tedf, 9, 152, 44)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 103 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 161)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= 9) { + if(!this.mergeItemStack(var5, 10, this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(var3.getItem() instanceof IBatteryItem || var3.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(var5, 9, 10, false)) { + return null; + } + } else { + if(!this.mergeItemStack(var5, 0, 9, false)) { + return null; + } + } + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + } + + return var3; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return radar.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java b/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java index 3674c9ea9..8a937f3af 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java @@ -53,6 +53,8 @@ public class GUIMachineRadarNT extends GuiScreen { if(checkClick(x, y, -10, 118, 8, 8)) cmd = "smart"; if(checkClick(x, y, -10, 128, 8, 8)) cmd = "red"; if(checkClick(x, y, -10, 138, 8, 8)) cmd = "map"; + if(checkClick(x, y, -10, 158, 8, 8)) cmd = "gui1"; + if(checkClick(x, y, -10, 178, 8, 8)) cmd = "clear"; if(cmd != null) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); @@ -81,6 +83,8 @@ public class GUIMachineRadarNT extends GuiScreen { if(checkClick(mouseX, mouseY, -10, 118, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.smartMode")), mouseX, mouseY); if(checkClick(mouseX, mouseY, -10, 128, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.redMode")), mouseX, mouseY); if(checkClick(mouseX, mouseY, -10, 138, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.showMap")), mouseX, mouseY); + if(checkClick(mouseX, mouseY, -10, 158, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.toggleGui")), mouseX, mouseY); + if(checkClick(mouseX, mouseY, -10, 178, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.clearMap")), mouseX, mouseY); if(!radar.entries.isEmpty()) { for(RadarEntry m : radar.entries) { @@ -102,6 +106,7 @@ public class GUIMachineRadarNT extends GuiScreen { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); drawTexturedModalRect(guiLeft - 14, guiTop + 84, 224, 0, 14, 66); + drawTexturedModalRect(guiLeft - 14, guiTop + 154, 224, 66, 14, 36); if(radar.power > 0) { int i = (int) (radar.power * 200 / radar.maxPower); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNTSlots.java b/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNTSlots.java new file mode 100644 index 000000000..4cc5406c9 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNTSlots.java @@ -0,0 +1,69 @@ +package com.hbm.inventory.gui; + +import java.util.Arrays; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMachineRadarNT; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.machine.TileEntityMachineRadarNT; +import com.hbm.util.I18nUtil; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.network.play.client.C0DPacketCloseWindow; +import net.minecraft.util.ResourceLocation; + +public class GUIMachineRadarNTSlots extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_radar_link.png"); + private TileEntityMachineRadarNT radar; + + public GUIMachineRadarNTSlots(InventoryPlayer invPlayer, TileEntityMachineRadarNT tedf) { + super(new ContainerMachineRadarNT(invPlayer, tedf)); + radar = tedf; + + this.xSize = 176; + this.ySize = 184; + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(checkClick(x, y, 5, 5, 8, 8)) { + this.mc.thePlayer.sendQueue.addToSendQueue(new C0DPacketCloseWindow(this.mc.thePlayer.openContainer.windowId)); // closes the server-side GUI component without resetting the client's cursor position + FMLNetworkHandler.openGui(this.mc.thePlayer, MainRegistry.instance, 0, radar.getWorldObj(), radar.xCoord, radar.yCoord, radar.zCoord); + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + if(checkClick(mouseX, mouseY, 5, 5, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.toggleGui")), mouseX, mouseY); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.radar.hasCustomInventoryName() ? this.radar.getInventoryName() : I18n.format(this.radar.getInventoryName()); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + if(radar.power > 0) { + int i = (int) (radar.power * 160 / radar.maxPower); + drawTexturedModalRect(guiLeft + 8, guiTop + 64, 0, 185, i, 16); + } + } + +} diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index e5b244fc5..1ae9a28e9 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -75,6 +75,10 @@ public abstract class GuiInfoContainer extends GuiContainer { return this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, x, y); } + protected boolean checkClick(int x, int y, int left, int top, int sizeX, int sizeY) { + return guiLeft + left <= x && guiLeft + left + sizeX > x && guiTop + top < y && guiTop + top + sizeY >= y; + } + /* Getters for external use of the GUI's rect rendering, such as NumberDisplay */ public int getGuiTop() { return this.guiTop; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index 89ef0ec5c..9dba6fd2d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -11,8 +11,11 @@ import com.hbm.blocks.ModBlocks; import com.hbm.config.WeaponConfig; import com.hbm.extprop.HbmLivingProps; import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.container.ContainerMachineRadarNT; import com.hbm.inventory.gui.GUIMachineRadarNT; +import com.hbm.inventory.gui.GUIMachineRadarNTSlots; import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -23,6 +26,7 @@ import api.hbm.entity.IRadarDetectable; import api.hbm.entity.IRadarDetectableNT; import api.hbm.entity.IRadarDetectableNT.RadarScanParams; import api.hbm.entity.RadarEntry; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -70,6 +74,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public static int chunkLoadCap = 5; public byte[] map = new byte[40_000]; + public boolean clearFlag = false; public List entries = new ArrayList(); @@ -99,12 +104,12 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } public TileEntityMachineRadarNT() { - super(1); + super(10); } @Override public String getName() { - return ""; + return "container.radar"; } @Override @@ -113,6 +118,8 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I if(this.map == null || this.map.length != 40_000) this.map = new byte[40_000]; if(!worldObj.isRemote) { + + this.power = Library.chargeTEFromItems(slots, 9, power, maxPower); if(worldObj.getTotalWorldTime() % 20 == 0) this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord); @@ -158,6 +165,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I } this.networkPackNT(50); + if(this.clearFlag) this.clearFlag = false; } else { prevRotation = rotation; if(power > 0) rotation += 5F; @@ -181,15 +189,20 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I buf.writeBoolean(this.jammed); buf.writeInt(entries.size()); for(RadarEntry entry : entries) entry.toBytes(buf); - if(this.showMap) { + if(this.clearFlag) { buf.writeBoolean(true); - short index = (short) (worldObj.getTotalWorldTime() % 400); - buf.writeShort(index); - for(int i = index * 100; i < (index + 1) * 100; i++) { - buf.writeByte(this.map[i]); - } } else { buf.writeBoolean(false); + if(this.showMap) { + buf.writeBoolean(true); + short index = (short) (worldObj.getTotalWorldTime() % 400); + buf.writeShort(index); + for(int i = index * 100; i < (index + 1) * 100; i++) { + buf.writeByte(this.map[i]); + } + } else { + buf.writeBoolean(false); + } } } @@ -210,10 +223,14 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I entry.fromBytes(buf); this.entries.add(entry); } - if(buf.readBoolean()) { - int index = buf.readShort(); - for(int i = index * 100; i < (index + 1) * 100; i++) { - this.map[i] = buf.readByte(); + if(buf.readBoolean()) { // clear flag + this.map = new byte[40_000]; + } else { + if(buf.readBoolean()) { // map enabled + int index = buf.readShort(); + for(int i = index * 100; i < (index + 1) * 100; i++) { + this.map[i] = buf.readByte(); + } } } } @@ -289,6 +306,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I for(int i = 0; i < entries.size(); i++) { RadarEntry e = entries.get(i); + if(!e.redstone) continue; double dist = Math.sqrt(Math.pow(e.posX - xCoord, 2) + Math.pow(e.posZ - zCoord, 2)); int p = 15 - (int)Math.floor(dist / maxRange * 15); @@ -303,9 +321,10 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I int power = 0; for(int i = 0; i < entries.size(); i++) { - - if(entries.get(i).blipLevel + 1 > power) { - power = entries.get(i).blipLevel + 1; + RadarEntry e = entries.get(i); + if(!e.redstone) continue; + if(e.blipLevel + 1 > power) { + power = e.blipLevel + 1; } } @@ -340,14 +359,20 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I return this.isUseableByPlayer(player); } + @Override public void receiveControl(NBTTagCompound data) { } + @Override - public void receiveControl(NBTTagCompound data) { + public void receiveControl(EntityPlayer player, NBTTagCompound data) { + if(data.hasKey("missiles")) this.scanMissiles = !this.scanMissiles; if(data.hasKey("shells")) this.scanShells = !this.scanShells; if(data.hasKey("players")) this.scanPlayers = !this.scanPlayers; if(data.hasKey("smart")) this.smartMode = !this.smartMode; if(data.hasKey("red")) this.redMode = !this.redMode; if(data.hasKey("map")) this.showMap = !this.showMap; + if(data.hasKey("clear")) this.clearFlag = true; + + if(data.hasKey("gui1")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord); } AxisAlignedBB bb = null; @@ -375,12 +400,18 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I return 65536.0D; } - @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == 1) return new ContainerMachineRadarNT(player.inventory, this); + return null; + } @Override @SideOnly(Side.CLIENT) public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIMachineRadarNT(this); + if(ID == 0) return new GUIMachineRadarNT(this); + if(ID == 1) return new GUIMachineRadarNTSlots(player.inventory, this); + return null; } /** List of lambdas that are supplied a Pair with the entity and radar in question to generate a RadarEntry @@ -422,7 +453,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I Entity e = x.getX(); if(e instanceof IRadarDetectableNT) { IRadarDetectableNT detectable = (IRadarDetectableNT) e; - if(detectable.canBeSeenBy(x.getY()) && detectable.paramsApplicable(x.getZ())) return new RadarEntry(detectable, e); + if(detectable.canBeSeenBy(x.getY()) && detectable.paramsApplicable(x.getZ())) return new RadarEntry(detectable, e, detectable.suppliesRedstone(x.getZ())); } return null; }); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 0d3763b16..88e385bbc 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3439,10 +3439,14 @@ potion.hbm_stability=Stabilität potion.hbm_taint=Verdorben potion.hbm_telekinesis=! ! ! +radar.clearMap=Karte zurücksetzen radar.detectMissiles=Raketen erkennen radar.detectPlayers=Spieler erkennen +radar.detectShells=Geschosse erkennen radar.redMode=Redstone Mode$Ein: Redstonesignal basiert auf Nähe$Aus: Redstonesignal basiert auf Größe +radar.showMap=Karte anzeigen radar.smartMode=Smart Mode$Redstonesignal ignoriert aufsteigende Raketen +radar.toggleGui=Ansicht umschalten rbmk.heat=Komponententemperatur: %s rbmk.boiler.water=Wasser: %s / %s diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index f45980c13..d0dc54d01 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3017,7 +3017,7 @@ item.mike_kit.name=Ivy Mike Kit item.mirror_tool.name=Mirror Adjustment Tool item.mirror_tool.linked=Alignment position set! item.mirror_tool.desc=Right-click boiler to memorize the position.$Click on mirrors to turn them towards the boiler. -item.missile_anti_ballistic.name=Anti Ballistic Missile +item.missile_anti_ballistic.name=Anti-Ballistic Missile item.missile_assembly.name=Small Missile Assembly item.missile_bhole.name=Black Hole Missile item.missile_burst.name=Spare Missile @@ -4368,10 +4368,28 @@ potion.hbm_stability=Stability potion.hbm_taint=Tainted potion.hbm_telekinesis=! ! ! +radar.clearMap=Clear Map radar.detectMissiles=Detect Missiles radar.detectPlayers=Detect Players +radar.detectShells=Detect Shells radar.redMode=Redstone Mode$On: Redstone output based on range$Off: Redstone output based on tier +radar.showMap=Show Map radar.smartMode=Smart Mode$Redstone output ignores ascending missiles +radar.toggleGui=Switch View + +radar.target.abm=Anti-Ballsitic Missile +radar.target.custom10=Size 10 Custom Missile +radar.target.custom1015=Size 10/15 Custom Missile +radar.target.custom15=Size 15 Custom Missile +radar.target.custom1520=Size 15/20 Custom Missile +radar.target.custom20=Size 20 Custom Missile +radar.target.doomsday=Doomsday Missile +radar.target.shuttle=Reliant Robin Space Shuttle +radar.target.tier0=Tier 0 Missile +radar.target.tier1=Tier 1 Missile +radar.target.tier2=Tier 2 Missile +radar.target.tier3=Tier 3 Missile +radar.target.tier4=Tier 4 Missile rbmk.heat=Column temperature: %s rbmk.boiler.water=Feedwater: %s / %s diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_radar_link.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_radar_link.png index dafca0ee5008dd68020698ad8aa9b3db38d24317..423352af03dd38d8099adaa3ff25005eba8027b3 100644 GIT binary patch literal 2030 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 diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_radar_nt.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_radar_nt.png index 095c54c69a8aeca9352d8d94124f6ade7da290fe..572179845e349f5e366159eb3a8f1c2a4a403d07 100644 GIT binary patch literal 20169 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 P6G6@xoi{8tAV&QUgPWL# literal 19931 zcmXtAbyO7J-=5v2ySrQIE`g;(B&3yYMY?;D6p(I^E>QtNknU~-LAtxU;hpdAoR@!g z&RJ$=@7{Z#&l8{7Pa0~9*ccQT003YsE6KeE00?*p0nkvu7ekj)Yw!ihRYqAG4gB*% zvy1=$IzU-YTH7n@z~A4A$SV73YbU)w1c|^HibSu3XoF%x5Bo97y->6F$-h~~RxVd` zX*te_eT5R2yQ%+Hb!dkDCNX+Z?LK%|#Xi-Z;_Uu%EwW^B_c^o?gMx`e!I&us361*` zlO-Sb=uxbr)R)8TY)fOG?8A^p?N`I9>aDLl16xP0Zd&|Wuq2j`m)nD>O*fJ6Ke1w+ zc9)e6?G-)`bnaC`HD}FoRezN5s)R-J!dY{zSEi@-G@;K1X|-?@o+Y{A9JU9CcU>QM z;zHczgwX=6n47grTScD-2AqAA@VyjqrlEO(MfT!sh`+S76#nYfXU*%2oQoy*IL<&6 z(QJvjlVM@P3Jsl52}`5pz`BcHP{1P}qlQD2RyqqA{Al4EaH(BZvIjwJ z9fKoin|;HPxLNb!mjAvnF7u6!gx7K0bF9UH#2rU`bRLJOb;F06XyctWEr8~QCAsd$ z#nj`$k0rnhue!*UX8GLuxJ?SYFB|x3#g<+_E?FVua4*jvKNc2CxzOaer ztIcK76{%(dB@+KPz@0(>hTkH#AMs23QHKsEWH$7%tsWkyyqw3>zsTn;H48ImN~E`U zPGZokC^28jbkhi^YJdA8w(lKB{u;^YAY{Y`{UkHcbo&#=wpq->bX9gKoNs#$-7B9m zEk!o4uGOp%H;o#p=UVw#3j4xjg%+(2ufTVV3`OAvAu8RV_<$`-l<vG6_Qob&INMca5lF%k;@ve?Cn7zqlF`;}cgx73&Us(@fj-Ue1h z9eEycG@{Eyo0n)$;|>X*nKaXvUHO!Bizk$kR1V9oNST*Wd7c5P{dt0vZ1srS`*{|AR{?lVw}n2^867$3RnP9>&ovQeyg(U&$i7TY8yhW;B#`wP$O!>b zzhqOhReVsiw+fmlF_YrzLPXK$cHs_%;i(atFF4qb!)qfLd8h`yYU3K)qvX z<>Os?&@n&aQ++^Dw<8bs>ES4n+n^g9;`D|3tPbR9%`M6VbPm2-5KAke!&23~Bx`1~5eIv>_CU+D>?G z+>6(NP~Kavwc0thdv*P+6GEUu#S;0PQVpIy5oCxmgaMUS___W~>DsPB*M=6ED$PuCp=r8~r@kgI=HvVL>5(*F9xL`hvyBzN(>t%S?6vvqlOcTse=5s$#p>0el&xY2Z5C zp#d`^08wQQE}a%LUDJJdljf2vfe2xd&4>3maTRe4O2`C50nG$s+||bQ&!1sRkD{lc zSIMF!loO;;2_4)4HoHzA<9^C^nEb6)y&KLNm!nxX;ShX4 z&pb&lkQv3z`F7qt*>-xgu|HLSU#W%ZpDD&p8Z{HmnvMeFjrTFu5bJ9hHZ>2 z-i0ED4#*utC1N{2#x_5Pdz5{gA%}659{CdtVdeiW@Mjy$Ei*;orPG6i@zSa1HTs86 zTsX!;?8k$|7sT*UdTy1`sSb;u4mv~w8PdX!_!7x%Rfya6j|6Wy7T6 zcMm&KJG^pvHV1AeN6 z$qgcgEIyuUhlVWM6KDB#w6RJW(Y&pD*%(F9)9lh=a=-}f>k^o|(Vr4At-5#jHqBS) z+pXycT@5(tqu;OIea{SSCLN-izORLdkd;J@*pdJ`1{8{iQTca~`~&Kdh~UksA6z*t z2BPsH@8>RA!z(ipe&-=SRg1 z>A93}tq|i*;@xVERaSYYk)cfH_Q6#B_qrpf)df$ zG>Tbnm?F;_LoGCLQB0$8uNAn`?-ZMh87R)P9y|TpF6!NW7`p5wU|djRPVkE|E6%=K zD59J`Qh6Vp8od7oNQ7BR((HDA*=KnPo=rxX>ngHO%)~6`i)DLMT)A2YG-ohc5{tO^ zzy5S4>;~h1{hc}v0p3_dTJK-t5Nzca0a?CADccaLKy%%}_Ii?c>fm;^2`Q6Z#qb7F zHkAN!8gb#7T1_O6{65@jo`{Y_)XsQ!;~{M)jw3I3c*(d;knTq8`^q z*TEm#t8FHYJ1y!Xkl6wzZ9bG~H~xF`TDYl^E9a@sQ6HrHp68&HZivI@v}-)b@F$dR3%fn?~sA(!s|sDs8Bz*CgKx9^qeQ zw{dMX)BU0z+;I8)cdK;%Udam=xz8zymXn@;DdkH#zAQqrY@=Z{Er0XDnGJJB$3q0= zOeZDnQhzr_8TS&d4FV&SR2Nz9ap=suwO|8O~`5-$%BmkksRm&R}aZq!h1ud~ggfUHQuR7W% zpjoOds6GG53aX}IH&Fd*>C1>)uBtu%gFzo*fN-85#$@RBViL3HR*LdwJaQl+pi5ok zRvad;UWH=zOgzKzVnI zDHPfuf3fDnoNJQe6dcfwuD^=PCI7{&Nx2XSnp?k7q(7x4F7Yp-z-;$Pgi&cGGeiW1XzfBG41>2XRPox&|xpM_k|MqymKKQx$(hdp)mF8laODl2-d z`L1F1aqis;sYo6{0hZd*mhQ-!)xY=Yvd=nWeS5?lH+`6RtsJH|k7E8kUOqd|0$G<>UbRxYv!VvW+H*Fz#( z|ASAq-1##cPuW-ui6ypU7Aohh?2H7|E0@e|Z_Bzt9L17)cIST^E&*i)U6L9tV7uw>S@f+5j%fD=n{6J2&o@p{?C^P|fPbxw&# zpSbeF6}*k6-mdTY*%`8rXyi(){j4YrSIiI}k}NsjXiIZ1g6Ws6 z_Z!Iv3R3VUbJJ%{AEcL_a^;GAJqRSnU_LLhZk3o{q7$*n@k?+jg{0AX;&Y}@GO&Ca z>wgA2TH`v!SH&0$BunYuOHvLqVJ)#SEyFBr%wS}qRF>hsZdQOWG1fmrOt?OM3d&YU z-l5B!0Pz`%xvlS|UpZ~<A-`q@O*AgROh;dnxYizXzUZp?x;ByO64fwbTyS@5 z`)#a{*o!OLA0v1C7t;Ui(b=}2nTnDk<6z;91WmDd*QqP^Wjw=6Q;4`E#wJ3=z6Y_!$3N9e<-TDbuQ^$AEX8Dq}`;_lQj5Hd~X?`ALVu0;E$i z-mWeH|&Is>roG7N4umdrZ3qT=N5HZ5F~i<(>RCN6D;M~_bhy5_8CE`pnI({vo@ls>-h}UauY;T;1 zUtMW+Y%LUGfgma98rj2+l3deUq>G4J;X>w7;1qM|n4DsV;2YmI(Xw3h_59=sm9;_n zvTM&m-0LCM<%#ml~8?Ep_r7*-zlhD~sW+kJr@?p5|6AurU zsYP)U_E`8`HX9E{E2d1)p(fBRX_F{M1ej<&%b{Q*#k;WCe%JJdab$DH)5Rxj-Ws`1 z1h*}F5#eF_A-6q`zqyrg+Yzpm?e3tfl7t!OJ@QP%_dC#nGK_t|n)5>NXIB`TrT7EwphyrHhZvf_4; z$)>>kiDm4WR>EgOylw?W4h0T%bo~Nu$EU4@5t6;Em@)nhlyjDCE)D32)L(f?j5U#! z7X;ux`k-HUtF%Q}%J}n+2~yK4N!tHY`_+qZz=?M1ec+3}Ct3Oua;9hdeJMS`qMgI< z#k^-iYzY$D*RC7+pCd%!Ssy>+N1}Oc6JvP(!645c>s*oRKj{ME%~>*Cood*F+!FlW z6bMj=$LBI~sF2RH3nd$WY7s|2*xjG0R(u>+w3_mju*cG?zm6@j^)~#WLYIiux@Klt znLrhoy&yul^Ui9ENYduh7QFd^1wB9!i8hx_DPBFG03TUfwFaB;m;@k zZpkF6PBW6cl6}-Yz_MiNw9GvS|K|5ZuXa}-C#_rqGQ8f-wk*RN3A7P~9RpVl$T8~b z0q!Fpa+iKK10PYfbcGLf@oH&glLHEZflgU>vg=)`=Y3!4a{dASgW~y z_XTFNy(c^eu0C-w_^KzOg9oGHC18v!6+%a|3! zDzweb%R}N+&Cw;IJYRZ3o4*05G^=zbAlxk2SqT*nS-{H^jEW{w3DSswp6j4d8OyT4 zA%BeE7b~c;a*jg%9ayRIo6c%AP)lpH+TQJSS3d6T86#4;NuE{aYdCJW!iLka$5q=aEuJ66nrfTYmkO!zfFr4yl z;Ve+DmvsSbOzsBx0x_q9o+7vK8x&5>jH^aod#?zYQ2i2yu5LEp06#93D+LmVW5eQv=c`;_M(qx9cenB+rxNSu?FcheR_;sV5MF2rq0v{rxny9$BO%aC__wNM83a1*VN zQ{?aYu$hoFl)jI$0SJ`^-=cTm9eoAE*aS!uAt(diQq%241{9MWv5Vs;IaP9n9iPT| zbd(0ZXN%Joom&}LEbH-lvYC-e9}=1373iw*@yJ2MEKVD)ZsAxWIn1SAiAM6a3MP3i zWDx^f5Q7{{D}s68D$04QVrsg-ozn-ob>+r;82SY zAfT9_ev~Xot;E{NjdjaCje_82vQ!TsF7Pda$GHC^cD1E2EeBi_B`f7H;q-@rEs`r9&Z1Gy$I zS|5<%N?da!+hnw66p#DL9QQe45mWOvc4pI|i9u9yY4{Vh3IV-+e!NMnTtOq=W($(2 zQC(qB#^>XpUyWEDpI3xRC`!H|Rq2cdYI6STuZ2c@%nFk1Q-&u*EGm4c)?mGphz~V= zTzK!#zfLA2?LDjOQ@bLc$@y8k1UAETR>#Kcei_+yY$%*cxS~OiR7o)Uz96tx;ar;+ zwEaUNn#vdmdhxs-OU|GV{5MX0FZEUcznO+ylHLTY-)K$bE|b2%smQTqdc3sthbc4R z+bSf>aj$*~&PH#S@7*4BP@5ZwQAi;t;&cLjAn4Cs9nyhFW2)J+fy;IL{768R$?`I{ zsfrrVXw+f|H%S}J?6_gZPS8{vwIpDZvTuIzb*qIIK0*Z7&0vj_sGg6`;&=-{%fR;t zWDm5fkOpGAG{m(C!cByQFPVo(^5eu8l-e(;**Y9TTZr3sp%=1^hx|SUQpBbX>zvoJ1R)SId`dcSJ8ycpH7iUHAcFYh8ME+%NC>ag?SC z=VS;5JE}i=3;Ce)`x%s(gXI+Cauf37!|lQVW~cqPid7kejUhH>#%mn07T zd7`$Q`M~$2ZEO&%pUD*ssQ0!e$Oi;S0=W$h6bMbzP`XGx9x|jYs+TDo5DTnVuU^fH zRWx5_)GizaT#0w`n*SuD@mda&yjq%_#Q-7{3QB+cK#u!}Y|4DB%pSzE-fdJ6N2rct zH3QvdAK{MDW>QRm_L-gjK|CmlaWhY#wN;vRVli@AUF!Kj%5oBa!w23PE`!`$1;F9x&sL4_nK}_fC zoM-tE3a6fn-l)KF^N~O9moHz!mMU5weN;1ruwSNf{f!Yc>p*)K|Lc$DH5$ruOAq+{dM zb0m!@FT$}YQGn~~wb&Y~616XXBpqj}x=mXg7aE9xXNe{cyLy0<^!?J)1Ff<52Jx#l z^(>JfMOuF%anC~meQI;5j&`;b2<#^b9fr$spOREd?&<8D4qlRjk7I2ytka&u^AKCI zlmvc>yFqjg#Rl>;&?;JP!2t2e|NGnDYHvsPXQl(Wo;`zXQC%$sN|9MyF9+lDSPzj! z(@4CTBLNN@_R8zlb_1umQ!OBJOd><)aou+w$~u4t-NgLk2YqO#zY9fuUttui4;t5} zev+7Tj|89_$;!gWEc%9ryBC{%1y{DREGCLy&D#8Ip&7TG%vE~aFnL5C9v-%R_wFYa z>h9Ll>ecP7PbcrXKA?G#3=>u6&@(^Ruo72Y#O7lTx3qmer}NLEgqcS!?}=qCU_+TH zdKf|sQx=(8uFSj}hJ1hEdsAHp=zVG=%AlHg0f*F7XQm)1*(({_bu^i~k+C zHk_S#$t?6+1Dee!tAR}7pz9CD>S({wBz6@80I&6UMGa$P2MsO)VuW1YeuQSMBzYZP z(f2ktoYWr)i>k>8=&gDcQJZP#VLH~jinb7-mQ!2^=^?9iScud!@h6TVC)3heSoU3$oL%MHJx3tC{=+uMg(pywTKZ^OaE`T0QbyYzavn8sF- z&L-5but+}EsOd#~jm+ZFWi9bO)en5X-!@aeHEJowGo}8dtnk(yTi3rDrA;4V zB=shildNd^|9b&wr4~(N0*~8K>voDWf5pGmBUsi=&s-B z!I|xUY0xPa&HD)>Hwq@pYyj|%b+Uikv9v%+BSw0Yu#dwOHN;5Gj0b4!qwdPgh;vJX zv4Mo3-?AL~>!kyEg?WDhGnwG~B>LDK*OFbLlmlB}L4*))!R%NJ#i8!%9lbGTU*rw0qo}HCgZsIYSB0B#lw-`miTg3L3ue2prNT5lxpmwJQr|t zx&eI0jBsea&<$oDpPh|NNg*L3C8Z4UpR2W>z4AWWB){YoCf4^zG0tWf9mGdIwjxVQ zu&~z?Wxj{{8$hw#4o$)~HrKaa4han&sx>^!r-9ceQ%Gi&TOo+B!lYCmq$O;jnF@9k7; zo?5H(y+Y0+2?$zDYFh`~x8pTqxp_Jin^D1;E54z4XS&ef{-(h}i}1pr@$Rq@dryD( ziIRds)$=SudD(yle_4Hyh+vW&H)PhWa2qH$lY_z9A-U@5P)x=VV#rD7)OFgE~|2 z3A1XfHxGAzwgyvp(W^jOpH)5k`{$9?+rJe~Oa52y_Vylt-dNh{6v)ZDj*6yJjFz)6 zN4BkywlbY>zm8%WxO{ZBvL@ZyJVT13xpEu^RY;+sp@0ukeO{h4Wqar`W)RV4z2qXU z{xlj`1+-uCqaY6EepA*G$}37e?5MYkPKTJ_)??6NopRx(u*GdLoX#3zhDbBcc}az$ zEHK?ew=CeUNNIQgMd#_Q5L)#4cyoNHU-FF7<&(CiiAgLt)K0!8R+S*gvZB;2{^h|O zD&SlkU}3?S9r);NzW^2h?Lh|1=#`_#!=qnIB3o&~jx_J>?A9VbOI|O-P;Y=)=35A` zT1B~$`UVz5kD);UsLA!A@{WYcr%qq*G-PQfBfgWELK*#Mw#X+fO4W_4;*pEhb7C9= z@8(cq?|1)x8=smAlLG51xS)Uh!1kPXMs2wncI>gI#R%1S{rV#~_wNSQzLsS3>7y|- zGtX{uzO6Og`BPN479%cD755R!An@M;pvr&(ZiJTITM!k#o97BF^;p|m_rv(hrV+cl zgU~};yXN(4lIAo}tu2s}r-wn2397N(@w&2PmgW4iU1Ln{S4r78IOGfr z$aO1>Kj+DYug)z!3W;oqxNXPP;`XE|kfLblEQ0{>{edeh#K&%>9hJ6=y`l*^B0BZm z05&2zJ2$uHg1s)4V6W*jW*O5rj8Ab=g$;^9vNoHAq`Tvb+Pu%bH)>vz_t=7yV_7`{qPir(7RG^9l-J|?y)}>ki%;cMsEU-El`X#2S*$KmisM zrR%p0ZKNw+;W-@4JcfC1{L%}YgJedtU}sNYQC^}e1<;qkp?$#HFM64}THbibhxTCq zd!hJ8wbdXAP$)7mFtAD$a{B;`l|80#7<~Nm=QR;A@w>Ub->%j!vlPty#|d5G%Wg8nLCW+i{%+Ie&M3zV}hg7Nw|kUQ_t|62Tj$&k;6l5@-a9 zm%k7ZL3RmJ`dadI#a6Nc%~1z-y1ycUL`3u=WAb^G_4Vr^)e{U9`D2n>n}2wBW!Cp! zDxg%oLnpe~rs<3B=GVAZx9*ZgeQ5Fn+r+|-vRwBUo8R6wfoL-CGRT?Y2Y{7xD&%I- z_vr5>zsJ7*{W7W)01y!o(UC;Gn-9F*mF5>r(?A)~2NviEokDO$SoxJpDAPy^_xZ(f zGL;k5$t)wc%Hlr~Nb$($QQSw3(}X5tk@by>%qv#ll{`#_|8f0g)k$z1l=R1}zh8mT z&+QSXMvK4tI8AZIYA}Ud#@C$kq4xHm>#o**4ok+!(2#0tov;ZCU$tf$=`I0%6st5< zfP@!p`H z-&{*8aQhP`M3rgrcU8ZwwM!)+8&dk|&+u~qFSo=u0($><#-VKV#aVR9Q>)X846t5E zxZpkH>gGBL&b6&Tnc#Wp_wQZBuQIU;9&(=UZGw~OZ_#)CaqOnPOS`)Z_I#!cFD_>J zu-HUCz(4vT*e2UsVI+AhxPVnzkwxzBVqw;KZR(df+Sd}BKCHTSNh$rMGrv1od6Zp} z^FSQH7C0Sz!X}dncwy|df(%G7*5L)L)Y-j%-*MG)CE+wu69DOrp`Mr`?ZDM2P;blN zAj%DZaW@@9Nw|%_zoHj%T#U|n*tZGGFTB{BPDDN)lf_->p>*uZmhfFS#1E=2BOYU# zk)9|c@K!?uSYM}M)cvSbB;oss#8RpgrslO0b^mo?i35(dC2=)xp^wt#`UpwF^+MSK1~P_xI#cS?8)>wykI0xworrZ5@S(2xP1c3+tRg^ygq=odLN+~NAK_W$n&i+?! zK2r)qf&Ww;p>wT%|31uXJ1@NQXuXBQkc3d->xo@SQ;ih_!CSUA-D%&^no(9?DLBU& zo6v?9`kj?Mr!9#J;hNi?cXKsKHBc1S=Fp{nCQ^^Db^%V(plE}RN48E3!UJpZH$hFt zUeu`T)<`!f+9BsoI1Rl}fK5$YpMLlNiJ~K^lut7?_ef~PlajyyN(go1{6g^fLSbvo zbl(Km-{I+eX9Bx03vRw5B#w5m*_52m6MK1kgo;BomKNUKsNYMCfq;n+qxAHDkKKNyHNz$8O51-R(eS8Yf)G}GgB5VyNecxQy|<`g3!ZP^ zQnILJmD*#%2f4|F9SrArK~WF!yPUCk4)j@xLs=Q99dn?F~eO>`LoKs^9at;uSQH?xd%B#4siGIh@p!2B$ zQ6Hk;I@A;+f?}b%M{KL(!!gyomF-&@@ZfXM*jNleSv$0uk`5|O`4%5hk_YUpH5^ju zf1B6IOs}dkIhU%l^qO+P6vT7Ra?qlAIrJ;xgaeNLdvEI=F6U}KQn_xcHL*vUlYPB_ zO8DQN*Ns2@?4^NiQH__nUu$VZf<%91rz8gjt_iy`0D$Cfp|8ZgsMT_G@hYW9s!0lI zUqzFCdd>S67ZXL?1n|j$rghLK2*zE#)}vsWve@a_8Kf(A|2E#F@+RZtv!kEv-G^-R zYd=Z9Bj2TofL6C10t`&d@jrje^=Sc+-x|G#0C3l&O^San=VAj-x5SdB$(#1W;h+xOq-u=4$n%0WiFJ72ti0M8lmgSS>8ciw8HBybMfs(s@%UEgI zPjFDZ_gzHT{|sN7l0#WBdgpRUw_!V^mN(1cNI|8`Rw}fG&6oS zC|=UEHUq_gV1Z%4CIIrkeMB~B_^v?u;2ZSr*ROqxJQ=`L`YE3APhy66@~7s z4;-iJzF`2K#2k)=is(+Q_8(6=*9@S1Szb z3E1_@<*clV+9|HbV*`*z>Zc^2*9IVRieeyE;UoI(|$B;5SE0n^JtuJeCYD72n>=jOhJ`VK7pL4j4_&aW11R| zK9}xmGR*z?6MwBYRygfJmkOzWhW8b|=dU`4m_PFs9Ow!rB`T>N=H_a)@8Qp16q}xpZK1#PK03llTHM1vAhegA-q_a zwDN4qQQ(o7XSw%r8WSj!Q0OQ{D6IK~E-K!=+ijEfzNC_%4muxw`*olJhL^(t<58+% zYY?&b4b|Fjk=VTVs~0{mLh89w{zUE8?%E5ViF+nS7Zn-VM%KBN6G%fki0Tv4T3>H) zCuu(`Kqcu%24Lk3M|SM9n?{=*%+^H6G5l8v^W~#{5iI*2HIo8kV`I4otlo_+oC?Av zT{7F2j3^kI!)OHPp*)xi9QV2rL1IjqjZ9JThGyq8qtO$gI69(o+II8<%Ev~g)Fq*E zDyGq~O^<2`(c78{KI8Gp{J0U^oA`rBIJA;jBch-eht*L*yP{Wa`00zdXAkun=rA#h ziHRM9`fBCi_mWUn>`mR*ZgaJecS#iMc%C^lW_X{r{{f;&x0%ORVQi)L2ENg=h%fy3 zhS@p=n4~&(`31C?t%w;`jr9Uw-?}+!@5f-W8iOaki$ro>^AM}A++&G5sQRQRHMO$tJOp_G^nrdqPnw~BN+#P`FgK6~2YIju198b?N zXtBfS5+Aq&Z=!VJU821pS_uT@NCmc-JwXF+22HT;_}}7zUXnUvVzd0gmfpH6@{!oR z*g*<>&}UoGbn|Wpimb8D*lR-I9LPT;BkX_c_TS`1=9@m=-{{x8CocQ;t>z+soQ+5x zVxc;?4@1n)8v-Y~GGM+i<<#|D&Nka6?MKl0pPw=AiKKHoA;M;tf#a|0A%su?$MZ2M zUWJ2cFE+WW$!9*i5`MX^1C?Kz@Lur#MrF%%Tx|0GS7S#Sa66F$ax{=ei$cukB9@{Y7Ec!91(SBJg6n&gZywx*IElbfkfhnK)#7S+0f@7V>~ZsjyR43)^xs| z#=XBZ*>nmq<~Rfe>sx_>wYQ&JR;!OeSF33wm8 z>uSN1bJPmlo3mRMy)i5IH)rJ9)ryd;Z5Gt5A)Z&Dd&0BrSNtuez11fqyBry2b-h7% z!oN;5UJ7N9kVq$=i~GyQm0}P2GfPj8S2as=T&;`dc&>rp{2$h&9vNq6XMb%}TMt+L z5)e7cW0=m7-8F;rk9-4Xf%$W7f7q>gE=DsC>!Vo7n;37UXhVhihb%389Y>dg5N4id zaPkcD6e>(iI&N-mu65Qo-g|cU-B+L~^X5>Idl__+$0H*Ei-a){dum2O8QczP$ATZ# zJ{Rv_oc1w3D}-K!t(i5%gRa|;P<7UkB|MhiKhwc(*$>USfw>@I30ANWxtR}0PieEI zwW1Bk5XB86d-wFP^h8Z5^g&6#t5ekd0{@`-za+?>`s@~P0>3TFKIw~rZYuP#iQv6h z&jt7CnYQXq>82Zo-x8F4O#LOIDgi+RQt#YH$((Son6B3z+|*xl?#G*@|LvNDzJWDxJpaRaY| zNlpnFe{Judb<#d+uMHt<;|In;f`$ZtQkAOI<)7!m@xfjN?m|9ku)Jgg? z0|!zCYUt(vsU~c9Y#4EUboq&3S-&G|c+P?feCW=;m|`OJG$SfdWQ)T7xBevvkK{vv z&GMD+CRl*B(~ZHOW}PTN8>pT`KuUseEq8vxocG@P;=I$o+E|IUZv`?J+ijF$)P4%3 z>F5CuGj-OIq4x2z;A7R0)23#pJPA`eX!>}-``LI-0^CNbVDrVN^oN!GrluFbBx>6{ zgJI=8bRC9wc8f~m)s{>2efHCi)ZW$u)coP})Megh?}rx{y{^yC!fk2F`oo&OJ&v~jwhMtTh@aFGYD zp6HD!q5SJ=Cxxem_23p^iJq~I;3nfvY73o0h;o`}&vFo8e|mC>&>4YFo#0udyG zn7&P4ozl674D@=y*tgOYfeEf8uHM=_j_fJw%Z=@!o4e}{B=#>ynFx=>o-p= zO{kX3wjrUrNG-YykG$d{=r(Hs7Rn2g}s&fz}lFX>C()~QcdHLp5wYxcf(rGqb?hxdW$QJ z(MrCR-v$v3(V@uYs<-gl5f!;(zt4So!LKw8H%zS7)H`{{?!#TOWRqOh2{b1^@_!U3%HD<)Tz$C?2iCdX^ni!SAI2aX!}rn1PxtXl%5FPp?Oy)u)vj;l|kY33O!^4gM({SF{cgwA=0D)K5^U0F z&0*qE_|bfIv_z|i_6s!G1%!m&lLz{sNoNb$Q|#{T3AP)7dm;rtjg9(W*|L%xZkHpd zBw=)ojSs{)0-?&LYKpfx$9wJ4jAnL8epHMP0>7!c`Y;!13aqI-g#Z1byul*dWo+lx z-lnNh2;y%1!_ekNJ<^M4$A69@&ei&*4zKRv?#gb_6Vg6%2YP`h@E2Q88-uCwIXSVb ztE+WxrV>Mc1G~GsMO-(dYq@_efxQv$_WoxT(!GUXX^O9AMdNk5kb1UsS5t4J2(EyB z&JsNDxrUYKWZhc+dvd>IX^%pqJ_|Qm3?hn+MxEOeSIyNGN?X%4I!2RX#*1rKJtpO4sIb99O;SHm7sDlK8uHf2buV^nw{8wXYK$S@);X}m9 z$%+0lSPu+~K<~#KGJ6R-Q5dq>xjqU)lb-0?mq3{;h1qhlXVT-t zz2*4AsFTmwQonN7=;+6d|7>}Ehn*Fd_I(Yh=l0#mlR*U0QF0n1Rj_pmEu!K41t{zP zHF@)c%;m6t>p$PtK9iVT*Az^BDR}!17aC9IT}R)wN&nB?m|V8T+KYY zM8UQ&lrdZIF@ZcDi^7$v*(2^AUj?UEW=>aK>tDdWqlSQRnG=#2OJ=$(569*UlK)({ zN)#k8D?kOV|5gNqf)O(=Ja&hx0g$>s?gTv)R802#qN4vIWv{&-zwywJjvw!i?1trt zonwP#@pI-Cod=z`JLeK|lxQ z*XdT& EPp&jo$!OOjQ0|T6PC!Yb9<-dRZ%B`y-1KUzkh!H^OMeTr=r0?CYz2`AV%%XT9*e;y9I6Z$ai6uS!&ihOt6gqQ({TL_&nZu=ADNlKgj* zNu2x9r+f9Rn*VwMs;c;aHqeg*p%s*LCB#?%%{$IZl|-fUq-MoPAXRAP=MX-K0& z*~M7KFz0&C_fPmfKg{cS%@1?Wv)uP}U7yeUzJ#AL0_N{YIv;*R&;2y`&iX5^K)*=q z*Ad?S0@Y8B7}N*`Am^HKc}a;3kH_OoNUzqr+~Znf({44S8c{PPj`u^YAC&k)EZ_D6 z{vblqvj*AR^!AFY_BOE;g#2JG``XR?Vm%4n$-{A+yR$JYYmBY6_!djwy0bTIa{y)8 zTE{Dm@cqfkL%!XOCIa_1UzM0)fSS>#rbi^&P7(XH5 z_4Xul8HHZB5HA`xvk{=tQDtgHqj(#7JE8GNtIG$oumG56i`Q6 zrm-IMP-bPN^3S>?#Y6O76vOL$aA0MD8VYZ<$cD9V!38%X9|e%soPZpZV`%$2Z+Li^ zki9Ebj~cdWwh4)oFN|AMe#utZe;%KXAIlHx-1cgAuk{ljsq}RhI;?~i%RF!4D(e(k zF^Hldrt2vtqujx3H|fEp;jgv%fWA27iG=Cpdf{UIVJ9bS z3m&S~3i6mcD256Ms@h#V9o1f`LcO!)Xvj#d;P*SURI7}(&clI7P_oW!DPhRQvOZlQ zi;jFqG|}=Dqb2@FhmykmG0+)+=`W&2#9`jdXdGd1{&CT9>n;!#O{=Hg+0M-F*z*u=L)u?!7U>wqPShmu`9e zRinDWL8m1?lH$b;EzA2v-E)Jn@2Egyn7r|cdiWu1V^RVzSWN#IvN}~X>hlwSPT*8s z^oZ-Ln2DO{>%MD^w}*319`kllHfkw9(Y!*$8JF9o&RSr}L8)dqItk4#8tZN?()UKX z&%ejFQLmWaUXx%SUt6V@zE^-LM#K$Ocp~)iqNYc+N%%bERtW_wFk#%f3r?muNlv<~ z&t=Wv5;%5~u;tBtP#l>$sqPw&EY-o_4ticSc+{Vi+*j(vcrV+`W@q*!sppQCRpZQ8 z1d9GOJ&F|kRGD-}#H-I4Ut~Lf`|#(^B=y!-1s}R5RF@9;a}#~xl5a4q!9jF^^YhDp zAQAyT$T3=)Kr72k)6jAdcaes*5jDO92~5Sk%d2&S5xu&Cn5-*UiRy={WHJsj?Ky5r-dH2wtH=ZYOk_9+rUCcl0T1V#^+I4i2fY8JpnUCy6!Qfg-Li;Iij;hflI+a^c6g(_K5 zrB%6vOP_~>B8pxXL`eJCSt-U_w%h(P^~Bg=Nm9CZCwE&3wuxZA5s{OFIU_}%JsTB% z7JpxrdpPn6-g2mkwa9jM^aXb*C^XdC*H_cs!{e~4>m>$}zi*^p0#V%Pz_kDAOZNp$ zDAJWymk;j0y!M`4(4=xDV~!x8kG_H~D7T*LsGYpu`AZSn$e3< zaDHyhR(FWQfc+GeYD-#^N4se+#;XtXFg_Qd&)gHLd;)ni{i%IcidyYvs+jcZreuNz zw3D%z(S8~QX8ceMQ-QCAi!Qk8MAa+^MqDU+0&=n^>ri<<;x?P>b^j_5~7Ed zx*i|D8kj>_ofUOEHPxwN%xrxt1)643!n|AEnSpjpWM!39)Tw>5odUWRR*3C3JjvXxV_ zXhH>~T8CS_#)$Ro7++6d`oGgk%H}EO3D;l8r z&#MyAHtZwe*g%^1_O>w(cXtGFBrcrH`uj9UQ}f@|g%3XpN9N8=zc&kA7NG{UIAmM= zmAt;0$UjG>OUUV`cm+*QPgmaboLW1i3U$hh+2c7!~}68c&v+0*f~#H-Jh$)vC?l zq8@u!257GS90Tru?TJ=sCP8FXM{YrJJdy&2x^VtA-u#RXqJ>>&c1jf$V8Ee^GG6XiU*45Ju8_O~QmO2C zelXN7-%z?>C1r_kw1f#!3@{ag1O+4%o)gXTeCu|#1VN<5!jD^-!NgO&1cMftl_aZ$ zABz90$U}RieD6UFw6n7_Ij}oIS+XtDR6063+J~N3S$X8HJL00LJ6i>EmBn0dlx3G_ z%p1`e?n~_w0v*oOn>@nXRXB|r3OG9w}V`yk?m$djrs5dwVVS|1GP12Tel&& z=}>(Gz|Y_DctK%d^hL@ME$FuC*g>K~S z>opmafWMDd(e}XRcYl9>@h7-q9&g|6dA~a;+y~fL=zEp!H}72J&xm)d#VU4s6pSmuEcf}R3TNfM{|SrCfla}YlB5!m>%*-6}#G(z#n+9`Jw?h z<=?h=fp-V+KDeL9YR(&?)Q~COkUm_JVwxTmqM~(On{`Wq>xN{D!N+GN;<*wA_n~2y s+G1HR(LP_$e+y&+m<9jG$>O9C