From fb19e4d93fd8001dd294bf02266e1f6e79231be6 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 7 Apr 2025 16:53:08 +0200 Subject: [PATCH] everybody do the yoinky splinky --- .../com/hbm/blocks/network/PneumoTube.java | 32 +++++++-- .../container/ContainerPneumoTube.java | 5 ++ .../com/hbm/inventory/gui/GUIPneumoTube.java | 67 ++++++++++++++++++ .../hbm/render/block/RenderPneumoTube.java | 34 +++++++-- .../java/com/hbm/render/util/GaugeUtil.java | 6 +- .../network/TileEntityPneumoTube.java | 23 +++++- .../hbm/textures/blocks/pneumatic_tube.png | Bin 230 -> 363 bytes .../blocks/pneumatic_tube_connector.png | Bin 293 -> 322 bytes .../textures/blocks/pneumatic_tube_end.png | Bin 182 -> 0 bytes .../hbm/textures/blocks/pneumatic_tube_in.png | Bin 351 -> 415 bytes .../textures/blocks/pneumatic_tube_out.png | Bin 381 -> 429 bytes .../blocks/pneumatic_tube_straight.png | Bin 0 -> 183 bytes 12 files changed, 152 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/gui/GUIPneumoTube.java delete mode 100644 src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_end.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_straight.png diff --git a/src/main/java/com/hbm/blocks/network/PneumoTube.java b/src/main/java/com/hbm/blocks/network/PneumoTube.java index f9ec4bd25..5b93dbb38 100644 --- a/src/main/java/com/hbm/blocks/network/PneumoTube.java +++ b/src/main/java/com/hbm/blocks/network/PneumoTube.java @@ -7,12 +7,14 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.Library; import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.network.TileEntityPneumoTube; import com.hbm.util.Compat; import api.hbm.block.IToolable; import api.hbm.fluidmk2.IFluidConnectorBlockMK2; import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; @@ -35,6 +37,7 @@ public class PneumoTube extends BlockContainer implements IToolable, IFluidConne @SideOnly(Side.CLIENT) public IIcon iconIn; @SideOnly(Side.CLIENT) public IIcon iconOut; @SideOnly(Side.CLIENT) public IIcon iconConnector; + @SideOnly(Side.CLIENT) public IIcon iconStraight; @SideOnly(Side.CLIENT) public IIcon activeIcon; public boolean[] renderSides = new boolean[] {true, true, true, true, true, true}; @@ -62,6 +65,7 @@ public class PneumoTube extends BlockContainer implements IToolable, IFluidConne iconIn = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_in"); iconOut = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_out"); iconConnector = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_connector"); + iconStraight = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_straight"); this.activeIcon = this.baseIcon = this.blockIcon; } @@ -81,6 +85,24 @@ public class PneumoTube extends BlockContainer implements IToolable, IFluidConne public void resetRenderSides() { for(int i = 0; i < 6; i++) renderSides[i] = true; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(player.getHeldItem() != null && ToolType.getType(player.getHeldItem()) == ToolType.SCREWDRIVER) return false; + if(!player.isSneaking()) { + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityPneumoTube) { + TileEntityPneumoTube tube = (TileEntityPneumoTube) tile; + if(tube.isCompressor()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } + } + return false; + } else { + return false; + } + } @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { @@ -92,12 +114,12 @@ public class PneumoTube extends BlockContainer implements IToolable, IFluidConne ForgeDirection rot = player.isSneaking() ? tube.ejectionDir : tube.insertionDir; ForgeDirection oth = player.isSneaking() ? tube.insertionDir : tube.ejectionDir; - for(int i = 0; i < 6; i++) { + for(int i = 0; i < 7; i++) { rot = ForgeDirection.getOrientation((rot.ordinal() + 1) % 7); if(rot == ForgeDirection.UNKNOWN) break; //unknown is always valid, simply disables this part if(rot == oth) continue; //skip if both positions collide TileEntity tile = Compat.getTileStandard(world, x + rot.offsetX, y + rot.offsetY, z + rot.offsetZ); - if(tile instanceof IInventory) break; //valid if connected to an IInventory + if(tile instanceof IInventory && !(tile instanceof TileEntityPneumoTube)) break; //valid if connected to an IInventory } if(player.isSneaking()) tube.ejectionDir = rot; else tube.insertionDir = rot; @@ -185,12 +207,12 @@ public class PneumoTube extends BlockContainer implements IToolable, IFluidConne public boolean canConnectToAir(IBlockAccess world, int x, int y, int z, ForgeDirection dir) { TileEntityPneumoTube tube = (TileEntityPneumoTube) world.getTileEntity(x, y, z); - if(tube != null && tube.insertionDir == ForgeDirection.UNKNOWN) return false; - return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.AIR); + if(tube != null && !tube.isCompressor()) return false; + return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.AIR) && !(world.getTileEntity(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) instanceof TileEntityPneumoTube); } @Override public boolean canConnect(FluidType type, IBlockAccess world, int x, int y, int z, ForgeDirection dir) { TileEntityPneumoTube tube = (TileEntityPneumoTube) world.getTileEntity(x, y, z); - return tube != null && tube.insertionDir != ForgeDirection.UNKNOWN; + return tube != null && tube.isCompressor(); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoTube.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoTube.java index 9796028ea..5d44904da 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoTube.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoTube.java @@ -1,6 +1,7 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotPattern; +import com.hbm.inventory.SlotUpgrade; import com.hbm.tileentity.network.TileEntityPneumoTube; import net.minecraft.entity.player.EntityPlayer; @@ -22,6 +23,10 @@ public class ContainerPneumoTube extends ContainerBase { } } + //upgrades + this.addSlotToContainer(new SlotUpgrade(tube, 15, 152, 23)); + this.addSlotToContainer(new SlotUpgrade(tube, 16, 152, 47)); + playerInv(invPlayer, 8, 103, 161); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIPneumoTube.java b/src/main/java/com/hbm/inventory/gui/GUIPneumoTube.java new file mode 100644 index 000000000..5aa546860 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIPneumoTube.java @@ -0,0 +1,67 @@ +package com.hbm.inventory.gui; + +import java.util.Arrays; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerPneumoTube; +import com.hbm.lib.RefStrings; +import com.hbm.module.ModulePatternMatcher; +import com.hbm.render.util.GaugeUtil; +import com.hbm.tileentity.network.TileEntityPneumoTube; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIPneumoTube extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_pneumatic_pipe.png"); + public TileEntityPneumoTube tube; + + public GUIPneumoTube(InventoryPlayer invPlayer, TileEntityPneumoTube tedf) { + super(new ContainerPneumoTube(invPlayer, tedf)); + this.tube = tedf; + + this.xSize = 176; + this.ySize = 185; + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + tube.compair.renderTankInfo(this, x, y, guiLeft + 7, guiTop + 16, 18, 18); + + if(this.mc.thePlayer.inventory.getItemStack() == null) { + for(int i = 0; i < 15; ++i) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); + + if(this.isMouseOverSlot(slot, x, y) && tube.pattern.modes[i] != null) { + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", ModulePatternMatcher.getLabel(tube.pattern.modes[i]) }), x, y - 30); + } + } + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.tube.hasCustomInventoryName() ? this.tube.getInventoryName() : I18n.format(this.tube.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); + + drawTexturedModalRect(guiLeft + 6 + 4 * (tube.compair.getPressure() - 1), guiTop + 36, 179, 18, 4, 8); + GaugeUtil.drawSmoothGauge(guiLeft + 16, guiTop + 25, this.zLevel, (double) tube.compair.getFill() / (double) tube.compair.getMaxFill(), 5, 2, 1, 0xCA6C43, 0xAB4223); + } +} diff --git a/src/main/java/com/hbm/render/block/RenderPneumoTube.java b/src/main/java/com/hbm/render/block/RenderPneumoTube.java index b1506d95e..fac248013 100644 --- a/src/main/java/com/hbm/render/block/RenderPneumoTube.java +++ b/src/main/java/com/hbm/render/block/RenderPneumoTube.java @@ -31,20 +31,25 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler { renderer.setRenderBounds(lower, lower, 0, upper, upper, 1); + renderer.uvRotateTop = 2; + renderer.uvRotateBottom = 1; + tessellator.startDrawingQuads(); - tessellator.setNormal(0F, 1F, 0F); renderer.renderFaceYPos(block, 0, 0, 0, duct.getIcon(0, 0)); - tessellator.setNormal(0F, -1F, 0F); renderer.renderFaceYNeg(block, 0, 0, 0, duct.getIcon(0, 0)); - tessellator.setNormal(1F, 0F, 0F); renderer.renderFaceXPos(block, 0, 0, 0, duct.getIcon(0, 0)); - tessellator.setNormal(-1F, 0F, 0F); renderer.renderFaceXNeg(block, 0, 0, 0, duct.getIcon(0, 0)); + tessellator.setNormal(0F, 1F, 0F); renderer.renderFaceYPos(block, 0, 0, 0, duct.iconStraight); + tessellator.setNormal(0F, -1F, 0F); renderer.renderFaceYNeg(block, 0, 0, 0, duct.iconStraight); + tessellator.setNormal(1F, 0F, 0F); renderer.renderFaceXPos(block, 0, 0, 0, duct.iconStraight); + tessellator.setNormal(-1F, 0F, 0F); renderer.renderFaceXNeg(block, 0, 0, 0, duct.iconStraight); tessellator.setNormal(0F, 0F, 1F); renderer.renderFaceZPos(block, 0, 0, 0, duct.iconConnector); tessellator.setNormal(0F, 0F, -1F); renderer.renderFaceZNeg(block, 0, 0, 0, duct.iconConnector); tessellator.draw(); - + + renderer.uvRotateTop = 0; + renderer.uvRotateBottom = 0; } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - + renderer = RenderBlocksNT.INSTANCE.setWorld(world); Tessellator tessellator = Tessellator.instance; @@ -70,6 +75,7 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler { renderer.setRenderBounds(0.0D, lower, lower, 1.0D, upper, upper); duct.renderSides[4] = false; duct.renderSides[5] = false; + duct.activeIcon = duct.iconStraight; renderer.renderStandardBlock(block, x, y, z); duct.resetRenderSides(); @@ -78,16 +84,30 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler { renderer.setRenderBounds(lower, lower, 0.0D, upper, upper, 1.0D); duct.renderSides[2] = false; duct.renderSides[3] = false; + duct.activeIcon = duct.iconStraight; + renderer.uvRotateTop = 2; + renderer.uvRotateBottom = 1; renderer.renderStandardBlock(block, x, y, z); duct.resetRenderSides(); + renderer.uvRotateTop = 0; + renderer.uvRotateBottom = 0; //Straight along Y } else if(mask == 0b001100) { renderer.setRenderBounds(lower, 0.0D, lower, upper, 1.0D, upper); duct.renderSides[0] = false; duct.renderSides[1] = false; + duct.activeIcon = duct.iconStraight; + renderer.uvRotateNorth = 2; + renderer.uvRotateSouth = 2; + renderer.uvRotateEast = 2; + renderer.uvRotateWest = 2; renderer.renderStandardBlock(block, x, y, z); duct.resetRenderSides(); + renderer.uvRotateNorth = 0; + renderer.uvRotateSouth = 0; + renderer.uvRotateEast = 0; + renderer.uvRotateWest = 0; //Any } else { renderer.setRenderBounds(lower, lower, lower, upper, upper, upper); @@ -115,6 +135,8 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler { } } + duct.activeIcon = duct.baseIcon; + return true; } diff --git a/src/main/java/com/hbm/render/util/GaugeUtil.java b/src/main/java/com/hbm/render/util/GaugeUtil.java index 751edabdf..68e90a95b 100644 --- a/src/main/java/com/hbm/render/util/GaugeUtil.java +++ b/src/main/java/com/hbm/render/util/GaugeUtil.java @@ -61,6 +61,10 @@ public class GaugeUtil { } public static void drawSmoothGauge(int x, int y, double z, double progress, double tipLength, double backLength, double backSide, int color) { + drawSmoothGauge(x, y, z, progress, tipLength, backLength, backSide, color, 0x000000); + } + + public static void drawSmoothGauge(int x, int y, double z, double progress, double tipLength, double backLength, double backSide, int color, int colorOuter) { GL11.glDisable(GL11.GL_TEXTURE_2D); progress = MathHelper.clamp_double(progress, 0, 1); @@ -76,7 +80,7 @@ public class GaugeUtil { Tessellator tess = Tessellator.instance; tess.startDrawing(GL11.GL_TRIANGLES); - tess.setColorOpaque_F(0F, 0F, 0F); + tess.setColorOpaque_I(colorOuter); double mult = 1.5; tess.addVertex(x + tip.xCoord * mult, y + tip.yCoord * mult, z); tess.addVertex(x + left.xCoord * mult, y + left.yCoord * mult, z); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPneumoTube.java b/src/main/java/com/hbm/tileentity/network/TileEntityPneumoTube.java index 7da76b82e..7b2952544 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPneumoTube.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPneumoTube.java @@ -3,11 +3,13 @@ package com.hbm.tileentity.network; import com.hbm.inventory.container.ContainerPneumoTube; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIPneumoTube; import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.EnumUtil; +import api.hbm.fluidmk2.IFluidStandardReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -21,7 +23,7 @@ import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIProvider { +public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIProvider, IFluidStandardReceiverMK2 { public ModulePatternMatcher pattern = new ModulePatternMatcher(15); public ForgeDirection insertionDir = ForgeDirection.UNKNOWN; @@ -30,7 +32,7 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP public FluidTank compair; public TileEntityPneumoTube() { - super(15); + super(17); this.compair = new FluidTank(Fluids.AIR, 4_000).withPressure(1); } @@ -43,10 +45,22 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP public void updateEntity() { if(!worldObj.isRemote) { + + if(this.isCompressor()) { + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if(dir != this.insertionDir && dir != this.ejectionDir) { + this.trySubscribe(compair.getTankType(), worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } + } + } this.networkPackNT(15); } } + + public boolean isCompressor() { + return this.insertionDir != ForgeDirection.UNKNOWN; + } @Override public void serialize(ByteBuf buf) { @@ -112,6 +126,9 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return null; + return new GUIPneumoTube(player.inventory, this); } + + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {compair}; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {compair}; } } diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube.png index fc4c085ba400f65833b6fa6fd562415d0698bfc3..591f1dc2218755c4f3ace8a06f56a28faa89ac16 100644 GIT binary patch delta 321 zcmV-H0lxm`0qX*gGk*ahNkl!1Mx_g>PQvva;TN9m2E^~W0SvO zXDagUCTygelto3{>-ebt1b?;3=#GZ2g1FbAEGln; z@UIG@G;#Yr`8=2{S-~m@v|)0q?6ry8`#bJjxV6a$#jx&Z_=8ZJjOW223}E-|cHvo~ z3AJGY5nF4q)^heRh4*+?$UsrvTia zkDVWKE}BpR-8yG6Ov=_~0%*;`XaZyxr>(CO_<* T75gY`00000NkvXXu0mjfR<@k* delta 187 zcmV;s07U=m0_FjbGk*Y`NklJVLQ2L$A_XJd5EL1Jf<0J* zI&P6{H*|I=AdsJvP(+9LI)C^4PO@xJA|hQ~HH0=1Tq3&6d9z1E%#>Yef+hI@ff12z zT6*uX)_&{&%=NUM2@aPnb=3e6+62JywtIEM6g{A&p9Pnod^DfO0;dSd@#X09qf^)- px~vPH@NllN-#_Af{r@X3%^k7nU#n2%B*y>%002ovPDHLkV1lx}RVDxc diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png index 20cfd91defef9e91b4fbd73f55f0ff452dcdf43e..1a0327a1a6fa923581191f2307459f461157af23 100644 GIT binary patch delta 279 zcmV+y0qFjv0>T22G=KR?L_t(Ijm1+j3c@fHeU%_64h07(MO>6(T{<{*>NPxpy9aUi z1YX0blS3Dg(0~*Xr$Ps5ajHYLBO#Qf!uG+=t*et&xahf_7EoCag>&r6+P z*#oi~m1l0SK*2?|?RV8(cSIVj?P``a>~q@ylx=5Orie|`tk<%J)nWos6afG{&r{;E zhUGkNHE4sZ`D&n7CJhQM5FXP;pXD>_kTpNI(a=fT$+-Mxut~0prtuOjdw{mj1OP}> d{{KJI3%43@n-IV#_3;1z002ovPDHLkV1gf=f205a delta 249 zcmVbhRv1tA0$mkDLS|9_cY-$;GiGN_4b00000NkvXXu0mjf^`LG` diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_end.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_end.png deleted file mode 100644 index 4dd947ee909dd4b983688dec10d710048d97a308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfk@PwdQRg)J4X1{$U&@|K9mXV=@!zD#Dl6&8Sc?=AO$Nn?De-_@jYS#U{ c&1cUrmu5)1XB)Oz0WD_mboFyt=akR{0GTB{EdT%j diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_in.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_in.png index a8f60ec3d034d767e206e00795072df02e7d4e6a..b0cb8e0e9c3e3e31d2f77ad8a18af7cb59df1123 100644 GIT binary patch delta 372 zcmV-)0gL|M0-pnrG=Ek}L_t(Ijir;nOT$1IhM%NW+mKCAN-13$LR%;q3PPr??p>U8 zb9b|oQ{8lSbn0OJADlWVgo4PCfE1BVLXeu+q12&9^Wy}e9~{Sh_q^YI+}*2?ih*5U zHabl-(?Bx~0^t$}mr!^-Pv;zro|HJBPZt0Pg-5GDOyn-B6@N-)J;SQ90!6cicYXS^ z9{0M~?QI!~l1^MyD@)l)0MpkQCzF?iMj6=kWgGyct^T#2Z*-c3!lP)`;O-HCtIb_$ zf#dROj%!rSG}ya!&`cu%`@WwT@rY~GNLV{O&z$Hu4vynw@)4_<25KN&X}kZ4K)AmJ z#=UL^uq+G9vTZW?hz*2G?r3N8>?YWtwDpNUTLAEo(Mkc-B^b$msq}+LhFeD>LmU>}-GAIUQf4|B`b| S(AW?F0000xJ5-DZCzwFllw5Dg(nm%gIvXFC_d;Y&hUsRUma4w*#s`FhC zLQH#h)BZYa#w{|j3qs>vsJqGRg50ou#M|hV2>{ba+xP<$X^6o?l%FmD0000+5cHB<8?kSW20ZS=}d+fnq7Itfq=*Yt1@a>60_cFj)XF zJikyHbW713&pFeK3VOSR?Ti!fX0u6*xNK*P-fp28mB=7|VR5;xi|e||Sg$jP3_|HC zfxjq}US#0dmU|KqLLh`t#vI!slpfiw^qJ1r^rawRcK`~7!pX{gOYkF5LyH50&a_7b%- g9%e%)SnZD3Z-UH_nIKn+<^TWy07*qoM6N<$f{&E67XSbN delta 338 zcmV-Y0j>V61N{P!G=DTnL_t(Ijir-4Zo)tmgg;vxzy=}Z2$Wmo0KNhhEoCH-jSKos zO@pHp9DpJR$N?;I0hg)04H8kjZqltu;XwSeL5ecc7W>}3+0~4mLkCjI^K!E5meILk z|G7X)=``zu9`lt-d}6SgWqSZ zQ!>*M5)yvYedc36{r9=OX5|E5oQrg)n5{QNpa e@B11K%nVm;RqTRO6MTU-GkCiCxvX