From fe387220ba68708b31a12e232d15d7fd3229050d Mon Sep 17 00:00:00 2001 From: D-Cysteine <54219287+D-Cysteine@users.noreply.github.com> Date: Fri, 6 Aug 2021 20:12:15 -0600 Subject: [PATCH] Add view cell support --- gradle.properties | 2 +- .../gui/GuiWirelessCraftingTerminal.java | 24 ++- .../ContainerWirelessCraftingTerminal.java | 63 ++++++-- .../common/container/slot/SlotViewCell.java | 21 +++ .../inventory/WCTInventoryViewCell.java | 137 ++++++++++++++++++ .../ae2wct/textures/gui/crafting_viewcell.png | Bin 0 -> 12559 bytes 6 files changed, 233 insertions(+), 14 deletions(-) create mode 100644 src/java/net/p455w0rd/wirelesscraftingterminal/common/container/slot/SlotViewCell.java create mode 100644 src/java/net/p455w0rd/wirelesscraftingterminal/common/inventory/WCTInventoryViewCell.java create mode 100644 src/resources/assets/ae2wct/textures/gui/crafting_viewcell.png diff --git a/gradle.properties b/gradle.properties index 2f36058..12f9e17 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ aeversion=rv3 wctchannel= -wctbuild=1.8.7.8-GTNH +wctbuild=1.8.7.9-GTNH wctgroup=net.p455w0rd.wirelesscraftingterminal wctbasename=WirelessCraftingTerminal diff --git a/src/java/net/p455w0rd/wirelesscraftingterminal/client/gui/GuiWirelessCraftingTerminal.java b/src/java/net/p455w0rd/wirelesscraftingterminal/client/gui/GuiWirelessCraftingTerminal.java index 5b24417..5c21285 100644 --- a/src/java/net/p455w0rd/wirelesscraftingterminal/client/gui/GuiWirelessCraftingTerminal.java +++ b/src/java/net/p455w0rd/wirelesscraftingterminal/client/gui/GuiWirelessCraftingTerminal.java @@ -94,7 +94,7 @@ public class GuiWirelessCraftingTerminal extends GuiContainer implements ISortSo private float xSize_lo; private float ySize_lo; - public static int tick = 0, GUI_HEIGHT = 240, GUI_WIDTH = 198, AE_ROW_HEIGHT = 18, AE_NUM_ROWS = 0, + public static int tick = 0, GUI_HEIGHT = 240, GUI_WIDTH = 230, AE_ROW_HEIGHT = 18, AE_NUM_ROWS = 0, GUI_UPPER_HEIGHT = 35, GUI_SEARCH_ROW = 35, SEARCH_X = 81, SEARCH_Y = 5, SEARCH_WIDTH = 88, SEARCH_HEIGHT = 12, SEARCH_MAXCHARS = 15, GUI_LOWER_HEIGHT, AE_TOTAL_ROWS_HEIGHT, BUTTON_SEARCH_MODE_POS_X = -18, BUTTON_SEARCH_MODE_POS_Y = 68, BUTTON_SIZE = 16, NEI_EXTRA_SPACE = 30, @@ -102,7 +102,7 @@ public class GuiWirelessCraftingTerminal extends GuiContainer implements ISortSo protected static final int BUTTON_SEARCH_MODE_ID = 5; protected static final long TOOLTIP_UPDATE_INTERVAL = 3000L; private int currScreenWidth, currScreenHeight; - private static final String bgTexturePath = "gui/crafting.png"; + private static final String bgTexturePath = "gui/crafting_viewcell.png"; private final ContainerWirelessCraftingTerminal containerWCT; private boolean isFullScreen, init = true, reInit, wasResized = false; public static GuiWirelessCraftingTerminal INSTANCE; @@ -142,6 +142,7 @@ public class GuiWirelessCraftingTerminal extends GuiContainer implements ISortSo private int standardSize; private final int lowerTextureOffset = 0; private int rows = 0; + private final ItemStack[] myCurrentViewCells = new ItemStack[5]; public GuiWirelessCraftingTerminal(Container container) { super(container); @@ -674,19 +675,36 @@ public class GuiWirelessCraftingTerminal extends GuiContainer implements ISortSo this.bindTexture(bgTexturePath); final int x_width = 199; + //draw "over inventory area" this.drawTexturedModalRect( offsetX, offsetY, 0, 0, x_width, 18 ); for( int x = 0; x < this.rows; x++ ) { this.drawTexturedModalRect( offsetX, offsetY + 18 + x * 18, 0, 18, x_width, 18 ); } - + + //draw player inv this.drawTexturedModalRect( offsetX, offsetY + 16 + this.rows * 18 + this.lowerTextureOffset, 0, 106 - 18 - 18, x_width, 99 + this.reservedSpace - this.lowerTextureOffset ); + //draw view cells + this.drawTexturedModalRect(offsetX + x_width, offsetY, x_width, 0, 32, 104); + if (Reference.WCT_BOOSTER_ENABLED) { this.drawTexturedModalRect(this.guiLeft + 132, (this.guiTop + this.rows * 18) + 83, 237, 237, 19, 19); } GuiInventory.func_147046_a(this.guiLeft + 51, (this.guiTop + this.rows * 18) + 94, 32, (float) (this.guiLeft + 51) - this.xSize_lo, (float) ((this.guiTop + this.rows * 18) + 50) - this.ySize_lo, this.mc.thePlayer); + + boolean update = false; + for (int i = 0; i < 5; i++) { + if (myCurrentViewCells[i] != containerWCT.getCellViewSlot(i).getStack()) { + update = true; + myCurrentViewCells[i] = containerWCT.getCellViewSlot(i).getStack(); + } + } + + if (update) { + repo.setViewCell(myCurrentViewCells); + } } diff --git a/src/java/net/p455w0rd/wirelesscraftingterminal/common/container/ContainerWirelessCraftingTerminal.java b/src/java/net/p455w0rd/wirelesscraftingterminal/common/container/ContainerWirelessCraftingTerminal.java index 2c02d0b..25b3a7a 100644 --- a/src/java/net/p455w0rd/wirelesscraftingterminal/common/container/ContainerWirelessCraftingTerminal.java +++ b/src/java/net/p455w0rd/wirelesscraftingterminal/common/container/ContainerWirelessCraftingTerminal.java @@ -13,6 +13,7 @@ import java.util.List; import javax.annotation.Nonnull; +import appeng.api.implementations.tiles.IViewCellStorage; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.IMEMonitor; import appeng.api.storage.IMEMonitorHandlerReceiver; @@ -96,10 +97,12 @@ import net.p455w0rd.wirelesscraftingterminal.common.container.slot.SlotMagnet; import net.p455w0rd.wirelesscraftingterminal.common.container.slot.SlotPlayerHotBar; import net.p455w0rd.wirelesscraftingterminal.common.container.slot.SlotPlayerInv; import net.p455w0rd.wirelesscraftingterminal.common.container.slot.SlotTrash; +import net.p455w0rd.wirelesscraftingterminal.common.container.slot.SlotViewCell; import net.p455w0rd.wirelesscraftingterminal.common.inventory.WCTInventoryBooster; import net.p455w0rd.wirelesscraftingterminal.common.inventory.WCTInventoryCrafting; import net.p455w0rd.wirelesscraftingterminal.common.inventory.WCTInventoryMagnet; import net.p455w0rd.wirelesscraftingterminal.common.inventory.WCTInventoryTrash; +import net.p455w0rd.wirelesscraftingterminal.common.inventory.WCTInventoryViewCell; import net.p455w0rd.wirelesscraftingterminal.common.utils.RandomUtils; import net.p455w0rd.wirelesscraftingterminal.common.utils.WCTLog; import net.p455w0rd.wirelesscraftingterminal.core.sync.network.NetworkHandler; @@ -111,10 +114,12 @@ import net.p455w0rd.wirelesscraftingterminal.handlers.LocaleHandler; import net.p455w0rd.wirelesscraftingterminal.helpers.WirelessTerminalGuiObject; -public class ContainerWirelessCraftingTerminal extends Container implements IConfigManagerHost, IConfigurableObject, IMEMonitorHandlerReceiver, IAEAppEngInventory, IContainerCraftingPacket { +public class ContainerWirelessCraftingTerminal extends Container implements IConfigManagerHost, IConfigurableObject, + IMEMonitorHandlerReceiver, IAEAppEngInventory, IContainerCraftingPacket, IViewCellStorage { private final ItemStack containerstack; - public WCTInventoryCrafting craftingGrid; + public final WCTInventoryCrafting craftingGrid; + public final WCTInventoryViewCell viewCellInventory; public final WCTInventoryBooster boosterInventory; public final WCTInventoryMagnet magnetInventory; public final WCTInventoryTrash trashInventory; @@ -126,7 +131,8 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon private static final int HOTBAR_START = 1, HOTBAR_END = HOTBAR_START + 8, INV_START = HOTBAR_END + 1, INV_END = INV_START + 26, ARMOR_START = INV_END + 1, ARMOR_END = ARMOR_START + 3, CRAFT_GRID_START = ARMOR_END + 1, CRAFT_GRID_END = CRAFT_GRID_START + 8, CRAFT_RESULT = CRAFT_GRID_END + 1, - BOOSTER_INDEX = 0, MAGNET_INDEX = CRAFT_RESULT + 1; + VIEW_CELL_START = CRAFT_RESULT + 1, VIEW_CELL_END = VIEW_CELL_START + 4, + BOOSTER_INDEX = 0, MAGNET_INDEX = VIEW_CELL_END + 1; public static int CRAFTING_SLOT_X_POS = 80, CRAFTING_SLOT_Y_POS = 83; private SlotBooster boosterSlot; private SlotMagnet magnetSlot; @@ -136,6 +142,7 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon private SlotArmor[] armorSlot; private SlotCraftingMatrix[] craftMatrixSlot; private SlotCraftingTerm craftingSlot; + private SlotViewCell[] viewCellSlot; public SlotTrash trashSlot; private int firstCraftingSlotNumber = -1, lastCraftingSlotNumber = -1; @@ -188,6 +195,7 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon this.thisItem = (IWirelessCraftingTerminalItem) this.containerstack.getItem(); this.worldObj = player.worldObj; this.craftingGrid = new WCTInventoryCrafting(this, 3, 3, containerstack); + this.viewCellInventory = new WCTInventoryViewCell(RandomUtils.getWirelessTerm(inventoryPlayer)); this.inventoryPlayer = inventoryPlayer; this.player = player; craftMatrixInventory = new ItemStack[9]; @@ -195,6 +203,7 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon inventorySlot = new Slot[27]; armorSlot = new SlotArmor[4]; craftMatrixSlot = new SlotCraftingMatrix[9]; + viewCellSlot = new SlotViewCell[5]; this.obj = getGuiObject(containerstack, player, worldObj, (int) player.posX, (int) player.posY, (int) player.posZ); this.civ = (IPortableCell) this.obj; @@ -270,6 +279,12 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon // Add crafting result slot this.addSlotToContainer(craftingSlot); + // Add view cell slots + for (int i = 0; i < 5; i++) { + viewCellSlot[i] = new SlotViewCell(getViewCellStorage(), i, 207, (i * 18) + 8); + addSlotToContainer(viewCellSlot[i]); + } + magnetSlot = new SlotMagnet(this.magnetInventory, 152, -20); this.addSlotToContainer(magnetSlot); @@ -695,9 +710,24 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon return null; } + @Override + public IInventory getViewCellStorage() { + return viewCellInventory; + } + @Override public ItemStack[] getViewCells() { - return null; + final ItemStack[] list = new ItemStack[viewCellSlot.length]; + + for (int x = 0; x < viewCellSlot.length; x++) { + list[x] = viewCellSlot[x].getStack(); + } + + return list; + } + + public SlotViewCell getCellViewSlot(final int index) { + return viewCellSlot[index]; } private WirelessTerminalGuiObject getGuiObject(final ItemStack it, final EntityPlayer player, final World w, final int x, final int y, final int z) { @@ -1289,6 +1319,9 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon case "crafting": ((WCTInventoryCrafting) craftingGrid).writeNBT(this.containerstack.getTagCompound()); break; + case "viewCell": + ((WCTInventoryViewCell) viewCellInventory).writeNBT(this.containerstack.getTagCompound()); + break; case "magnet": ((WCTInventoryMagnet) magnetInventory).writeNBT(this.containerstack.getTagCompound()); break; @@ -1299,6 +1332,7 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon default: ((WCTInventoryBooster) boosterInventory).writeNBT(this.containerstack.getTagCompound()); ((WCTInventoryCrafting) craftingGrid).writeNBT(this.containerstack.getTagCompound()); + ((WCTInventoryViewCell) viewCellInventory).writeNBT(this.containerstack.getTagCompound()); ((WCTInventoryMagnet) magnetInventory).writeNBT(this.containerstack.getTagCompound()); ((WCTInventoryTrash) trashInventory).writeNBT(this.containerstack.getTagCompound()); break; @@ -1312,7 +1346,7 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon if (tis == null) { return null; } - // Try to place armor in armor slot/booster in booster lost first + // Try to place armor in armor slot/booster in booster slot first if (isInInventory(idx) || isInHotbar(idx)) { if (tis.getItem() instanceof ItemArmor) { int type = ((ItemArmor) tis.getItem()).armorType; @@ -1327,12 +1361,21 @@ public class ContainerWirelessCraftingTerminal extends Container implements ICon return null; } } - else { - if (tis.getItem() instanceof ItemMagnet) { - if (this.mergeItemStack(tis, MAGNET_INDEX, MAGNET_INDEX + 1, false)) { - clickSlot.clearStack(); - return null; + else if (tis.getItem() instanceof ItemMagnet) { + if (this.mergeItemStack(tis, MAGNET_INDEX, MAGNET_INDEX + 1, false)) { + clickSlot.clearStack(); + return null; + } + } + else if (AEApi.instance().definitions().items().viewCell().isSameAs( tis )) { + if (mergeItemStack(tis.copy(), VIEW_CELL_START, VIEW_CELL_END + 1, false)) { + if (tis.stackSize > 1) { + tis.stackSize--; } + else { + clickSlot.clearStack(); + } + return null; } } } diff --git a/src/java/net/p455w0rd/wirelesscraftingterminal/common/container/slot/SlotViewCell.java b/src/java/net/p455w0rd/wirelesscraftingterminal/common/container/slot/SlotViewCell.java new file mode 100644 index 0000000..35f77e1 --- /dev/null +++ b/src/java/net/p455w0rd/wirelesscraftingterminal/common/container/slot/SlotViewCell.java @@ -0,0 +1,21 @@ +package net.p455w0rd.wirelesscraftingterminal.common.container.slot; + +import appeng.api.AEApi; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + + +public class SlotViewCell extends AppEngSlot { + + public SlotViewCell(IInventory inv, int index, int xPos, int yPos) { + super(inv, index, xPos, yPos); + } + + @Override + public boolean isItemValid(ItemStack is) { + if( is == null || is.getItem() == null) { + return false; + } + return AEApi.instance().definitions().items().viewCell().isSameAs( is ); + } +} diff --git a/src/java/net/p455w0rd/wirelesscraftingterminal/common/inventory/WCTInventoryViewCell.java b/src/java/net/p455w0rd/wirelesscraftingterminal/common/inventory/WCTInventoryViewCell.java new file mode 100644 index 0000000..f1869b7 --- /dev/null +++ b/src/java/net/p455w0rd/wirelesscraftingterminal/common/inventory/WCTInventoryViewCell.java @@ -0,0 +1,137 @@ +package net.p455w0rd.wirelesscraftingterminal.common.inventory; + +import appeng.api.AEApi; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class WCTInventoryViewCell implements IInventory { + + private final String name = "ViewCells"; + private final ItemStack invItem; + private ItemStack[] inventory; + + public WCTInventoryViewCell(ItemStack stack) { + super(); + inventory = new ItemStack[5]; + invItem = stack; + if (stack != null) { + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + readFromNBT(stack.getTagCompound()); + } + } + + @Override + public int getSizeInventory() { + return 5; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inventory[slot]; + } + + @Override + public String getInventoryName() { + return name; + } + + @Override + public boolean hasCustomInventoryName() { + return name.length() > 0; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) { + ItemStack stack = getStackInSlot(slot); + if (stack != null) { + if (stack.stackSize > amount) { + stack = stack.splitStack(amount); + markDirty(); + } + else { + setInventorySlotContents(slot, null); + } + } + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + if (inventory[slot] != null) { + ItemStack itemStack = inventory[slot]; + inventory[slot] = null; + return itemStack; + } + else { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + inventory[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) { + stack.stackSize = getInventoryStackLimit(); + } + markDirty(); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) { + return true; + } + + @Override + public void markDirty() { + writeNBT(invItem.getTagCompound()); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) { + return (AEApi.instance().definitions().items().viewCell().isSameAs( itemstack )); + } + + public void readFromNBT(NBTTagCompound nbtTagCompound) { + NBTTagList tagList = nbtTagCompound.getTagList(this.name, 10); + inventory = new ItemStack[this.getSizeInventory()]; + for (int i = 0; i < tagList.tagCount(); ++i) { + NBTTagCompound tagCompound = (NBTTagCompound) tagList.getCompoundTagAt(i); + int slot = tagCompound.getInteger("Slot"); + if (slot >= 0 && slot < inventory.length) { + inventory[slot] = ItemStack.loadItemStackFromNBT(tagCompound); + } + } + } + + public void writeNBT(NBTTagCompound nbtTagCompound) { + NBTTagList tagList = new NBTTagList(); + for (int currentIndex = 0; currentIndex < inventory.length; ++currentIndex) { + if (inventory[currentIndex] != null) { + NBTTagCompound tagCompound = new NBTTagCompound(); + tagCompound.setInteger("Slot", currentIndex); + inventory[currentIndex].writeToNBT(tagCompound); + tagList.appendTag(tagCompound); + } + } + nbtTagCompound.setTag(this.name, tagList); + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } +} diff --git a/src/resources/assets/ae2wct/textures/gui/crafting_viewcell.png b/src/resources/assets/ae2wct/textures/gui/crafting_viewcell.png new file mode 100644 index 0000000000000000000000000000000000000000..21adaced96f377ecb4e51ade21023032f8dea9b4 GIT binary patch literal 12559 zcmbVyWl$YK)9%3!?!kf+2oAyB-QC@S>%rY6cp$h0cXxN^KyY_=cer`&tNT`cb${I5 z+M3y(*`Ds6?x$*Mp9n>H31kF(1ONblEF~$b3;;m1x88 z@`-o2?d9P9sjcMvy|6%G%;Vkq#W$k@Z0-BvHH>Q_o^_DvIHu#5`O)S@QT0)7?@fR3 z5rLy^@Wg*vbadyp41P83cDrvIym9^*`}`23KPKI^boA5`y|Hqkd35um`~`Q(Co6u! zPVcYbrd=HtOI~Yb)}(mjNm*hY$xfX+A%xD)H;w(-<9_iMH%}^0DwVFtuC}$ac9oL` zr65g*6~iK1*A-AF3Qvl$!TlwQ@DS^HY$qiha9{cH_sapo|X~x0Oxe3Gl z4;?n5AZ+ohWDV}IzQvs?zwrx!M}-e>kEwMhXX~nKBijAFT?1JWo}!N%8utG4p~9=h zg|wHkyBC3FO)$!!$$l^7%G`y-?RUSYWPz8{s_*WW&AoLiHy!{=JM0y&pNt=7$m;M2&N#dfNd8*QAmHrD>~bkF5v{R(!(<-IhIm>AAfuHdttMoiAVTJls?+SuCtBeeGcQSZ4FhxH&;r zcfe?{I88xJCIl}-d|tK$R~m~rEOVVLsbzAkOAOKFv0G@L;qu@ngB(|4J6;-`?H?u# z*ZkV-&)YItmRmn?cr5Bc*{iDqCGJ5T%XISlio)o0pWO>x7c z6;!6uZYV2m<{mPi>$8s3`0_=CV@|=)W6-1eU97M7?`xosovw!Q@b$FJN-e{C zFK=IEoXRV#wE#ZzK?fbIj%m+eabJ$=rzY|)g2mUB_zh&6_p{-Tjm7H|*MMLtf25r4 z#j*Pq>F<2ZE$6e#98q%9ciKhE~5*-Yj zg6!6MH9GWc#^l?S7`kQ&<_tCY&8IPw6Q2xC-VjLRSB`1&62VRH8lUQ_(Mjw*ZLk@h zO-`E&$-hU`>bPWLa~|&7C0vF@bt|!(28ir4aUGl9S?lDM@dq z?O)GRy(I~-D(1pq15q~!w4$H(n0r>{REk|EA%}}}E0#8^O`0`JJ9Dg*iRIcIh8BZw z3uJxt*kTE_`Wtsw_bjx%k9=I|%~NV)sE3xtUcAm6l90Cn=Dg7zkUI?3{L3r@NZ|TQ zZVpV{V)g_%9wI~b7oLu+jx_hL=Rwor8<>~N8ekaWO$CRUGk>VK6fGXq-s)F8QWt?g z?B%U?7nevUp2V5RRJG@_6}%?>l27;`4Pyw18_W2ilD5p~Eyua-L5TVxUe>x5c>aFtK1*ma7YV zAHvKm zr}PblCR+?eoPIKrh8T^5^~mJ?HR6VUudNop>`qS8rfr<{eceJn)dyecyC5L$$0lQ^ zPKB*8@*a5fF=dGPdi{-N=QQ7_bL`F5@e!dW4VXDFqhUj|teP4ylmK!MPSis9gZxf1 zu9Y4a>E2efUiG;surKy`XfzANOcE;9bNRMFXePj?ZW84gRgQLz5sx0nuRDsV-A`m9 zOXL#)Zc%s5p4m*A>Zq$+D9vJ%8WR^t`atBzJLf_Whp$9tF>SNeW;5Dnk8U{PR6Ju) zPyM_bV+JUlGt=c9jzai4c!B!ER;dB%J!f{wBKP(#%Dt`PEM zWx<&~!4J6i7B76lQTW=RZ{;>@eKQWZPH;B#*u31+@u6lpNsoC}-%A?*Hl%AQ zFs5+>gK%&$b5xS>4-?!xqtv*}q?(_9+%L}K>-)T%(V-|@>MceQEDXc!Yv*S-9?^^a zS)hzJRa1R(iKm`u$!Tf61NzkxW~|78v$&;0mKoo+zV>E8e_1uoK>>_{%6nUlvabrU z?w?SaOUq0e_vq{=Y>Ctn-#^=@4Cjmx6&YOkc0An4e=!6QXTY>dxCHqJ5{wJSWQWc= zpS3_Dv|WCDX~wloSi*Ac0VgN5S#Z_~X$9e-En%8XK`X=Ve_f9xwp5Vxz*aSv=LfOk zeV<;ovPDAzP%_J_j~KEaM+$jBQJW>$lBOG`((EDY0trWVxb&EIF?(P@XF9l`?hif(ket@9NE^89Lw?7;zSn4;Hr_3I}@W6XOBf492i9gLCP7g+iz z-6Eu|lSUej869^ia>l5O)NYMJ`N9;+_Y)*8gLoiA z5vQkW{5hDP)U>P6``hqNwJ1t$l5rbQQPkPsgL#X=tmydw9NTQ9k{yd_GI`30w0)Oh7hHDN1 z_S4b`$z*k}6f}C__Jyca&kE2gODT&4!6<|?zR|KS0JE?zmti7kKp=?jU zB`LVnV!2v|ZzEFNb-5GA64_V(`ia5~$Nj`x%q^@ziGk6AZNsAsGw?qDHlCsQ7P(sM zF0X0JM*j+_#o|iP0-qe~8v<%iW{RzGttnpr6dMiV*f<0p%vyz8GXJ4b_@2m`R}z}i zUeWOqEl?*nks}aRgH-fvjIn0QK|2xU3WqiFav z0@~vV=vs=l_)B!b^b8G&5MMGhIQtKBt&FE^8`3eK(NFuUFBf8d(9{hr2a6lPOt~-z$ZedFrrGY-N{y z$WhSM@c8}Lv>B@geZZOCp89u5Jq(+UfuD1+g?icsm6%E6eQvTGCpa>T3YC&;?u=*w zfh;+Sv$-LxS%@(8UfWtip~d%K``t=i(99s*6R;|=}j`M(pW;`a_IPq^!mu8LI=9o zd#*8in%}sl640<4qugf=yCRTpv~1f$XXwEGV27c^kt$;>lb5H``T7$Gq9oQV(E#*G z`5q*_-pT1cW+Mt3E2f&_A3zJ_2*QUf|J2HPa4dTlA5TAVLl`E!rHQPX#2>ua_7cyw z_*&Fvf~uC}V`iJq6H#omB^2cr`n+qEFH!sA zDVp?V!f$qVZP$Q(&KD4UUMJ%<6}{QK%;=4GWIq!f(O(w6F3pTo2_8mf&jgF}MQjhz z<>nXiAfwQ}p-x z;uf5qV_BqGC+w7?BaFg*?kt6+M#J(v8PBF$88mYIIiVI3%y1n=n~cqv z(EO%8s9XJWzs^B^M~I3_nZ=C^ljVlL(n2%{QJyHaHc8TK5*n#Hf`9<}$~Yoqx)lc=N!I!G!vSQ=({ zwtxpo2R@G(;*i6&PdG^jP$lRSkS{i$pn>;)Vn#k7ZLtiG!`_}X4>2t=RdR9@6z09= zbE~)_$GQBP%yRnTDykt6{l2ovb=&>pGA84!)=M}DK1gQ8-pKl^*Y_FuV3-pOwd@dG zZg=`DVMyM^r`q(VK8MRna&t7Y8{RB$eh`Jnr_u;dA77(v(w6x&c zrz=03=c=NGm2d3ANs^MHFh}sPX5Lt14Qs8;xlhr};-$j;l{&5+vNxGyL_56kCcf+B ze+Xu%ohi_Oho{s@C^7>w{>Ri^hSH~qqKF%pih**!zhcU3yS3|gwIxfM6h>;yuqguHELy7{CP&VxDH&_P4{?Zx= zQu%8!g01Ti6gk5L)L*2zuVSLFbx_F84Y5$jpC{qZrg7yGp3`j9jxK$!O_k(g#*JWB zea|HKWl#8ZgA`Ybw4O?Q8EjT>P{Z&wH*eAfx)u&6`e+~+c*`=Jea5_PqY{`VTpJ6? z1vNE@xYJ}SbeO3Kdfgl|3Z)U;HyjV27ezWMpNVy*0U(9PqKZ&v zA7R=$a~ILWg)*!3i~NdVtroVkro6YJaDXX^LM6WvDwFco#+>x9JTXLIU2l-2QRexb zf6+_C?Sp}C^o$L=E9E6ySFOt$K%WTzFu%e|1fNiP9H~DTI{k78E14Kkgkx`btHVl&2G9)oS=>~u6__A@LGrmD; zDUY4V;*+3l?9%?8M*Q&qLthmVL}`AOhjs5RNuKK7eN@8 zId+hVAvDUdo0;~HoU2E=5N|S7kKu}xeqG&BT*i?VbbCiraMOvRm~5_a?Fcv^Bye69 zq2!#Fslb&#h3u!E8i*x4HhRC^2Y-oDyec##kvj|X!kOWP%VQWVKlVfedo1JIyh?vU zhH`_^`x(+UIq`6en>f>p6maOsFVnH>o3P168dW&>Diid!l@go^ly5-fqs_Ehyx5`Q zJmKVV9aYdiIiMpE@;!hsf1}1!CDg}83?%rzm#3cTq6jrgh*r~Gube|5_l?o$+IxTn z5t=4Jjmkb=Otp4rlY4i+HEM)A#&La7#h5%5vgpmY zD#ACodP2DjP%Uyh8<6+|`s&JmAai7Y&%c?^4*PT5?=CexU)t7ge;k2P6Q=ogD>B>M zHzTDSF01Ak#W1S38rE`X?(S~?dpALZnEUd&<&dVl<*3QGj!bQl`!jO>4*1xsv2}J5w(p<0luK_vlEg-{_Nc|s~3@aS}BovIs_G`bHhjDHe_lF z|0p&LtiDT543gdK-53sxT_)2;L8 zXIoJvs&U~@_yK~UwhbkpvLlVsAtR79NNXO!lFP{u#v}%xEej?cZrSC9k`>_!kSsc} zw%KY_!l@**(d363zhZimo-DeaEH z+cn`5Fn%4MZ{}r677O{b`&kMq_m`d;4wSps)`nvGs?RG)@5YUxiUQkaP?Wa=#-Ub# zM&4JRp2QRatZ!8oxnWyd6psGkLL7MGv}^)m4@LZZSAM4m*pH4z_qeAiW2?s}nn=z* zo7*=2vs@*WygV36+{NdI3Y)=L<>$;_0?;50jdZ?Im%MA~cC?hHT%FP0Rl%k3AtX#; zrRMfqMg06~)6c@J2Uq^7iejD_4lmrVZgjIN`3i(xx>K_MQAh}D7TqBANVqs$k>D5C z)c>mi4R08awM6%FCm>r8LAEz{i>)TB(CV-sWIfzyH>9$~R>}`ikJj>O56v@lJl{%T zrfQUPv7hs2VYtY6yTouSGhVpUFZlowsSQoC2uRsf8BCm{qe7!uf0jQWnukThb6T5Z!@84ECpdX+Y?>?HmuBq{h}0=AC)m0W zae#P5T$j>$_b7j=v$(%qXzQyDEWSCLmr{c>%$vAK4B}eK6`8K?a^BL_#SQowr%hXW zP0PhLcT(BLcJq_uV^@AZj%rEFVGHo%C*@-aM{j!ju*yku<70(bU=Mrgqp!}9bRExb z0##tfRrk`R>9+PcMvx7^Jx_-v&im}fOIgQ4aTmvrtTH$z;DXe;9K}q(@TC%3c@BGf zWLq^P2vTlXEnVaoo|py#mXQ3lSP;#n=HgQ0rxG7iaPokU7nn32pl(Um8&6DME_MXF z{shwBciyNuR$4f6tXaT?ik%PWmxRFcu)+;vj%Z-jq=e8&eBS%EJ4iq=*%%V8=0-r& zluN5wSAGIk5MP?Ae^K505 zrfaL|?PUbmeUkY=+DvGHhTPmfIQVh#*N`>EZy1Cr7#-*`{=@2XM)b;<2!$XT- zTBQcoBhz=BWD0)OC||&U`HcziG6H6TC@93}CQ({Tl5-%64)19nUqkt<(Ah6SRMp8D zSc-w?e6zEP=;SE$qrk^I>`_%q&q>D$26nP@{czZbKQ!kK{e)GVHA(Y6-EbJB?dMQs zUymJsnVrkeZ$`(ux90@wC8w;v**`;by79D9S(38`29t!{bLz*m%-vdo0?o?BdhR0015dV>=CA}}?hR6#QC9UaH ziee#krKOf_y)Dj(e;Ck)N=qN4T5nY=Dl%JuS!4)YOLGCP(HSv%9Dx4N%ZiQ=5y4lH z>^xA8o7{a>aeJ~hbiRf~JMRda^Yc>eW1h>@Oq*W}>Q68G>x`^EWXTj*v4DQh zBglZ60cbG)FT?8sC@B|&6Y5-~1}9`Jd9!0d<@?;o!P;t+sS*wN?s;_kKdoU3^flwl za>&-jh7JwC-|=nh)daZgiD?SL5_l|Eg%5D^iz^h0ZpG$$WPTA!yZIAtyQ>Fqo|H^g zJg#0sfNvyA%~odbxtav-076VpG8$Ao)b-Y_!6>V1&5Ip%gl~^&T!g0<3me|xcnm;3~n=o`F>(^S>M6I z8*U1znp!d#c%0$cDCk^`-~JuSE&#Ph23Ipv<5GnXuIpLyl`G^?QAmm1Q$*Ll!CrI9 z3&RE9WvFwdcGmm8g!!c2Y%NpsqN6z2?G#-*1M(qK}_ zV&C`kYq|jSp=>>k z^9)jD8=Z`zGVx*7wN&QPF6B1PXBr98odV~4@}--Lf_^TfUG|}w0HDiSgEu?-bjcrT zhn_82VZBzGe8f#K8(1OL7tR{Kst$JSd27HHeu@o=>p?Zllzm?DS8K$j%VoOh|y7o=`_p-hjEa^RksrIW7A|3zJAGVJRSrmA)sI`s~tSuu+5DPa)`6k4rQ zp5DoGhp~?zTdV1hm^KdFRP0qBu3TQ{)3S?3T7n2kyM4cbP*zPthvXh`m63{-1(a%`De-wIxBi<4$ITt0}3plpDo~B4|z< zWa+X-@7Xne-5P1s*%Ec-GGOABJ>=s^Yy4^7|8}s^4NelqPYqF?Ta<7qABO*_i|*h+ zWXsuhEGJz}eP#qVU+$ste7(&7EksP+jN~xp87C1XFIQ@Ve*RVaj1ktI7+?s}bnB_Eo@SA#IB=C>E_I#zi${pFj zu|!Zci(dg2&CTlh=bDS(A;C&2<6xNp_r*o$%Yf6q!c2#X=|=UF0y~Re^Ab-L#PAw! zb)0Umb|8A;x{HZP7<0l>P3J?>gXjlGmLGnq_H)+Q2M>+?y7LoQwew9=bTgo*+r=ml z8WEg{gNJmd_6gCDXZX?i&^)8nbW3SXSQQjkkbbJ3eVgdXDFKZLazQL|9Sfx8cZ*c; zxSmDmv=^2t(iU+j@zQWr7ua?FEuJs8COthgdHh3|ioQXfEK$$=TPyeO7dm0Hl|Vaq zw4#ShO+t&+1>Vkxs>^f)Q>cGBbJDJ7=|P%hALmoLSu zzv3j-d8aFaUl|uc+@>x3K!bRvV;ck?B?&)S7L( z%AYOh34OO<(BVr?^Jap_KE(UmC}}ja$T@*zRI1LJye!=@oKg+P=a)j6(c>H0#F=Li z!pDA|hp|ME7;>@vP(q-f44I(C{#|VkW!$LY^VmW@W@XopC#0uB66_2}wDCv^pL z+?^GwMwHw?s>RG=A!+xStr}XyKMBEmC!*8~)qualae?Y@UN**0s{E>a>(#fKT0ezo zSER@uXhnM`A|g%Xi{h65c<3>nWhrfB)N|z_*4gv)d1gaw(d6K|KLnc<@d`K~)c}ZU zM&Z45JHtuu3*{5?qb%f!dB+WsXTA9D&=r*`ZrzH~#h{)Ka-T&hk=z+>dEKz|Ij~}M zcr~!g586}$I|Uf`(uY!CJU-rb#t)9(IAU4+D(?lnGCVBW{a!e4Cfz^o9rq799uHz! zK1{7YMs~&p9)4yMTfA57ba-VvfnOiNL#bW%XKjh!eb^UgI^bJa4eTpLed6R7TbrQg zwe{|ZC$nN(8(TxgxkKho-aY1u=t^o{TkY}FvKiaj1v+i4Oy=Ni8%qwLBY@AtJteW^ zvv-!khi{H&+caCB`TIO*e6Rf=T;cfHLsu5^{?hn@EJZ{Vr9?#j!`%DJ*URvU=aGaG z!VMP4!$2SC#rpk8LzEWkH(4@<7&?|PMvunU+CabHIg%SXflQBj_2o2fLv_vke6Knh zG%<;*t9m3m#-v}OU?46|@>|Lpo~uRAFK|lo$`opHrt|MaBU?LPp_{Hh!NkDnf^<7q zN_O<3{m0fK`3g7EB(;~->^!!b?KH(A_}DZpDynum-uC!0nspqMlrm4@N8M&{JR*Vs z&Dz(i^ljC69~zd;{ydXj2qSv60def~vY0Qt6rW`^8+Tv!r85-UOBP4V)AzheaT?1P z>zE71PR$dj&BJqys^!y=xQ=L}=_6%S@B7$ZGsXNwbwiu~q-^6_AR~4hO1$-4*sbku z3R0JRL5gO~dYFcK*ZX?vzWz{ifGwZ%j#qga=|_)Bp8fkmwSE)5-nM4|B*t>T=|sSt zRoj|}Q{b7}X^OE9-c8@nefyM#Bh!)ez~$rL?84>)1s67zo^V=#e_>a8ezw7~_wEZY zyLbAXag7!Dmrn_6EF&Qb`1r@2(@~W8R|4-KspSj+ptS$vfk&5Eo6w5 z&MFZ$)%Z&BqoNryW%`aVZCghs@DE(-ASnKFKQk!2b)@OXrAjBDF5uh)@V>rx?h7PM zyf;MEIp_VI1VS*pet0xv&KepTs@ASB|KO6&BtS)}d58PD}+Ic z$Q<#qxl!BFp9BDrwKEsa&$CJg=iF;;d*@sXzZ@3yl4<=(&t17cqZ}7IyJcFJl~>K* zDNcjfA%p+`NB|nZ9{@l&;Qza>c^&mOB@+a|jq@`~$A$A0I`EqT%xx|?+P{|-{MY<$ zpxrtg)9jl3aj{4!#J@T-MKSXHEHHvEh=(FW1fb{n>5(C#|CsytJGVcmfb$%3G*wv% zl4^v*y9W?7K8~J~3!GA}?e5OT& zZ2%YU1p^Q#1C!Pc10gddy zS#%)f>;v^s*VC~|T-jV{coF3pgx~ z^^pF{8j$}e6CVf_IbT{pIkcTZKWd^=DPs`;2muWc26zFmcr95vxD8X48C&pJp4 z1i`JuyE+Ar#0><1Q6QjuR{~&oO%7msLI+MMoDJ&A^^n_W&K`KfT3W4>v01dfJOeDy6svUqB}FO%Q8*r z*uH5+b4(KfP|JQx1^VGwZ|H~s00RD*YbjB3g3S(3+)T9pdM~y_?N-rjIs%GLL*$T8 z*^2NLG}dzi{d*`KjtB#C4gs6aZEJRMW?m(Hk3V7o#m2-r7YHT0W^GsKfXj3H?EUNx zF!a+71?wFOz;*WHT9A8#cE?8x)N7voMrR0`FlRP+Yi~~s2=wRG zBdT9h6P$o^aig0*xqG3>$$UK%024woci!QY?4<%An0kABd5Nls+Rw7*I!_I%7Bqgn zoIPfME#Ur$t|IXE6lINR+Gn4i;iv;t2a8$(IoH_TDF>%OK>6RC+O37;B#Px=%p?PR z?Qe*lx_NpX%5PFe1BelwvKhc1>L0hYQ@HbI3#*c$U_XZtvb868(fA zm`sb(78Vw01g;)cyvXBfbld@lszDAe2;IZ96gxqH;kcyetC36#h;D?<)?Ck4aUB z?veY4gairblYxXpPO3WKj4=n5(0=wv=daM~A1L_WCHQ|E2-%JHcbq1lJdQi6s?Xid z6*}>I$POw9rwgd1DgZF*2k>mW^ykN$7d1{go^21S6RgSazCF5jBtB8rNN)_)1G zr%!|}&=j1xTAPjtzi3x$GeYt6@fDDAGZ^T@{*aq#E|z9EeMfafn37TqLcp$p2mTxK m|5s<@;B9+IMMOZl@5Bopu!lPc_TGTMmz0>iXr-`W;Qs-aj0l+k literal 0 HcmV?d00001