From b43d4abdd5052c0b2b0e5e6e33cc7add13d86809 Mon Sep 17 00:00:00 2001 From: Christian Weeks Date: Sat, 11 Feb 2012 00:45:56 -0500 Subject: [PATCH] Adding a crystal chest --- IronChests2/build.xml | 2 +- .../cpw/mods/ironchest/client/GUIChest.java | 3 +- .../client/TileEntityIronChestRenderer.java | 121 +++++++++++++++--- .../cpw/mods/ironchest/BlockIronChest.java | 10 +- .../cpw/mods/ironchest/IronChestType.java | 7 +- .../mods/ironchest/TileEntityIronChest.java | 68 ++++++++++ .../net/minecraft/src/mod_IronChest.java | 2 +- .../mods/ironchest/sprites/block_textures.png | Bin 4750 -> 4915 bytes IronChests2/resources/texturesheet.xcf | Bin 13445 -> 16149 bytes 9 files changed, 187 insertions(+), 26 deletions(-) diff --git a/IronChests2/build.xml b/IronChests2/build.xml index 58713d0..610d139 100644 --- a/IronChests2/build.xml +++ b/IronChests2/build.xml @@ -13,7 +13,7 @@ - + diff --git a/IronChests2/client/cpw/mods/ironchest/client/GUIChest.java b/IronChests2/client/cpw/mods/ironchest/client/GUIChest.java index 3983961..1e2170b 100644 --- a/IronChests2/client/cpw/mods/ironchest/client/GUIChest.java +++ b/IronChests2/client/cpw/mods/ironchest/client/GUIChest.java @@ -18,7 +18,8 @@ public class GUIChest extends GuiContainer { GOLD(184,256,"/cpw/mods/ironchest/sprites/goldcontainer.png",IronChestType.GOLD), DIAMOND(238,256,"/cpw/mods/ironchest/sprites/diamondcontainer.png",IronChestType.DIAMOND), COPPER(184,184,"/cpw/mods/ironchest/sprites/coppercontainer.png",IronChestType.COPPER), - SILVER(184,238,"/cpw/mods/ironchest/sprites/silvercontainer.png",IronChestType.SILVER); + SILVER(184,238,"/cpw/mods/ironchest/sprites/silvercontainer.png",IronChestType.SILVER), + CRYSTAL(184,238,"/cpw/mods/ironchest/sprites/silvercontainer.png",IronChestType.CRYSTAL); private int xSize; private int ySize; diff --git a/IronChests2/client/cpw/mods/ironchest/client/TileEntityIronChestRenderer.java b/IronChests2/client/cpw/mods/ironchest/client/TileEntityIronChestRenderer.java index df0ad25..633e66c 100644 --- a/IronChests2/client/cpw/mods/ironchest/client/TileEntityIronChestRenderer.java +++ b/IronChests2/client/cpw/mods/ironchest/client/TileEntityIronChestRenderer.java @@ -1,32 +1,51 @@ package cpw.mods.ironchest.client; -import org.lwjgl.opengl.GL11; +import static org.lwjgl.opengl.GL11.glColor4f; +import static org.lwjgl.opengl.GL11.glDisable; +import static org.lwjgl.opengl.GL11.glEnable; +import static org.lwjgl.opengl.GL11.glPopMatrix; +import static org.lwjgl.opengl.GL11.glPushMatrix; +import static org.lwjgl.opengl.GL11.glRotatef; +import static org.lwjgl.opengl.GL11.glScalef; +import static org.lwjgl.opengl.GL11.glTranslatef; -import cpw.mods.ironchest.TileEntityIronChest; +import java.util.Random; +import net.minecraft.src.Block; +import net.minecraft.src.ItemStack; import net.minecraft.src.ModelChest; +import net.minecraft.src.RenderBlocks; import net.minecraft.src.TileEntity; import net.minecraft.src.TileEntitySpecialRenderer; +import net.minecraft.src.forge.ForgeHooksClient; +import cpw.mods.ironchest.TileEntityIronChest; public class TileEntityIronChestRenderer extends TileEntitySpecialRenderer { + private Random random; + private RenderBlocks renderBlocks; + + private static float[][] shifts = { { 0.3F, 0.7F, 0.3F }, { 0.7F, 0.7F, 0.3F }, { 0.3F, 0.7F, 0.7F }, { 0.7F, 0.7F, 0.7F }, + { 0.3F, 0.15F, 0.3F }, { 0.7F, 0.15F, 0.3F }, { 0.3F, 0.15F, 0.7F }, { 0.7F, 0.15F, 0.7F }, { 0.5F, 0.35F, 0.5F }, }; public TileEntityIronChestRenderer() { model = new ModelChest(); + random = new Random(); + renderBlocks = new RenderBlocks(); } - public void render(TileEntityIronChest tile, double d, double d1, double d2, float f) { + public void render(TileEntityIronChest tile, double x, double y, double z, float partialTick) { int facing = 3; if (tile != null && tile.worldObj != null) { facing = tile.getFacing(); } bindTextureByName(tile.getType().getModelTexture()); - GL11.glPushMatrix(); - GL11.glEnable(32826 /* GL_RESCALE_NORMAL_EXT */); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glTranslatef((float) d, (float) d1 + 1.0F, (float) d2 + 1.0F); - GL11.glScalef(1.0F, -1F, -1F); - GL11.glTranslatef(0.5F, 0.5F, 0.5F); + glPushMatrix(); + glEnable(32826 /* GL_RESCALE_NORMAL_EXT */); + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + glTranslatef((float) x, (float) y + 1.0F, (float) z + 1.0F); + glScalef(1.0F, -1F, -1F); + glTranslatef(0.5F, 0.5F, 0.5F); int k = 0; if (facing == 2) { k = 180; @@ -40,20 +59,82 @@ public class TileEntityIronChestRenderer extends TileEntitySpecialRenderer { if (facing == 5) { k = -90; } - GL11.glRotatef(k, 0.0F, 1.0F, 0.0F); - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - float f1 = tile.prevLidAngle + (tile.lidAngle - tile.prevLidAngle) * f; - f1 = 1.0F - f1; - f1 = 1.0F - f1 * f1 * f1; - model.chestLid.rotateAngleX = -((f1 * 3.141593F) / 2.0F); + glRotatef(k, 0.0F, 1.0F, 0.0F); + glTranslatef(-0.5F, -0.5F, -0.5F); + float lidangle = tile.prevLidAngle + (tile.lidAngle - tile.prevLidAngle) * partialTick; + lidangle = 1.0F - lidangle; + lidangle = 1.0F - lidangle * lidangle * lidangle; + model.chestLid.rotateAngleX = -((lidangle * 3.141593F) / 2.0F); + // Render the chest itself model.func_35402_a(); - GL11.glDisable(32826 /* GL_RESCALE_NORMAL_EXT */); - GL11.glPopMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + glDisable(32826 /* GL_RESCALE_NORMAL_EXT */); + glPopMatrix(); + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + if (tile.getType().isTransparent()) { + random.setSeed(254L); + glPushMatrix(); + glDisable(2896 /* GL_LIGHTING */); + glEnable(32826 /* GL_RESCALE_NORMAL_EXT */); + glTranslatef((float) x, (float) y, (float) z); + float shiftX; + float shiftY; + float shiftZ; + int shift = 0; + float blockScale = 0.125F; + if (tile.getTopItemStacks()[1] == null) { + shift = 8; + blockScale = 0.25F; + } + for (ItemStack item : tile.getTopItemStacks()) { + if (shift > shifts.length) { + break; + } + if (item == null) { + shift++; + continue; + } + shiftX = shifts[shift][0]; + shiftY = shifts[shift][1]; + shiftZ = shifts[shift][2]; + shift++; + if (item.itemID < Block.blocksList.length && RenderBlocks.renderItemIn3d(Block.blocksList[item.itemID].getRenderType())) { + glPushMatrix(); + bindTextureByName("/terrain.png"); + ForgeHooksClient.overrideTexture(Block.blocksList[item.itemID]); + int j = Block.blocksList[item.itemID].getRenderType(); + float localScale = blockScale; + if (j == 1 || j == 19 || j == 12 || j == 2) { + localScale = 2 * blockScale; + } + glTranslatef(shiftX, shiftY, shiftZ); + glScalef(localScale, localScale, localScale); + float timeD = (float) (360.0 * (double) (System.currentTimeMillis() & 0x3FFFL) / (double) 0x3FFFL); + for (int miniBlocks = 0; miniBlocks < (item.stackSize / 32) + 1; miniBlocks++) { + glPushMatrix(); + glRotatef(timeD, 0.0F, 1.0F, 0.0F); + if (miniBlocks > 0) { + float minishiftX = ((random.nextFloat() * 2.0F - 1.0F) * 0.1F) / localScale; + float minishiftY = ((random.nextFloat() * 2.0F - 1.0F) * 0.1F) / localScale; + float minishiftZ = ((random.nextFloat() * 2.0F - 1.0F) * 0.1F) / localScale; + glTranslatef(minishiftX, minishiftY, minishiftZ); + } + renderBlocks.renderBlockAsItem(Block.blocksList[item.itemID], item.getItemDamage(), 1.0F); + + glPopMatrix(); + } + glPopMatrix(); + } + } + glDisable(32826 /* GL_RESCALE_NORMAL_EXT */); + glEnable(2896 /* GL_LIGHTING */); + glPopMatrix(); + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } } - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - render((TileEntityIronChest) tileentity, d, d1, d2, f); + public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float partialTick) { + render((TileEntityIronChest) tileentity, x, y, z, partialTick); } private ModelChest model; diff --git a/IronChests2/common/cpw/mods/ironchest/BlockIronChest.java b/IronChests2/common/cpw/mods/ironchest/BlockIronChest.java index 0c6c10d..316c162 100644 --- a/IronChests2/common/cpw/mods/ironchest/BlockIronChest.java +++ b/IronChests2/common/cpw/mods/ironchest/BlockIronChest.java @@ -14,9 +14,10 @@ import net.minecraft.src.NBTTagCompound; import net.minecraft.src.TileEntity; import net.minecraft.src.World; import net.minecraft.src.mod_IronChest; +import net.minecraft.src.forge.IMultipassRender; import net.minecraft.src.forge.ITextureProvider; -public class BlockIronChest extends BlockContainer implements ITextureProvider { +public class BlockIronChest extends BlockContainer implements ITextureProvider, IMultipassRender { private Random random; public BlockIronChest(int id) { @@ -179,4 +180,9 @@ public class BlockIronChest extends BlockContainer implements ITextureProvider { } } } -} + + @Override + public boolean canRenderInPass(int n) { + return n==0; + } +} \ No newline at end of file diff --git a/IronChests2/common/cpw/mods/ironchest/IronChestType.java b/IronChests2/common/cpw/mods/ironchest/IronChestType.java index 49d75f1..fc53f30 100644 --- a/IronChests2/common/cpw/mods/ironchest/IronChestType.java +++ b/IronChests2/common/cpw/mods/ironchest/IronChestType.java @@ -15,7 +15,8 @@ public enum IronChestType { GOLD(81, 9, true, "Gold Chest", "guiGoldChest", "goldchest.png", 1, Item.ingotGold, TileEntityGoldChest.class, "mmmmPmmmm","mGmG4GmGm"), DIAMOND(108, 12, true, "Diamond Chest", "guiDiamondChest", "diamondchest.png", 2, Item.diamond, TileEntityDiamondChest.class, "GGGmPmGGG", "GGGG4Gmmm"), COPPER(45, 9, false, "Copper Chest", "guiCopperChest", "copperchest.png", 3, null, TileEntityCopperChest.class, "mmmmCmmmm"), - SILVER(72, 9, false, "Silver Chest", "guiSilverChest", "silverchest.png", 4, null, TileEntitySilverChest.class, "mmmm0mmmm", "mmmm3mmmm"); + SILVER(72, 9, false, "Silver Chest", "guiSilverChest", "silverchest.png", 4, null, TileEntitySilverChest.class, "mmmm0mmmm", "mmmm3mmmm"), + CRYSTAL(72, 9, true, "Crystal Chest", "guiSilverChest", "crystalchest.png", 5, null, TileEntityCrystalChest.class, "GGGGCGGGG"); int size; private int rowLength; public String friendlyName; @@ -129,4 +130,8 @@ public enum IronChestType { return matList; } + public boolean isTransparent() { + return this==CRYSTAL; + } + } \ No newline at end of file diff --git a/IronChests2/common/cpw/mods/ironchest/TileEntityIronChest.java b/IronChests2/common/cpw/mods/ironchest/TileEntityIronChest.java index 53ee324..7b725c4 100644 --- a/IronChests2/common/cpw/mods/ironchest/TileEntityIronChest.java +++ b/IronChests2/common/cpw/mods/ironchest/TileEntityIronChest.java @@ -1,5 +1,8 @@ package cpw.mods.ironchest; +import java.util.Arrays; +import java.util.Comparator; + import net.minecraft.src.EntityPlayer; import net.minecraft.src.IInventory; import net.minecraft.src.ItemStack; @@ -15,6 +18,7 @@ public class TileEntityIronChest extends TileEntity implements IInventory { private int numUsingPlayers; private IronChestType type; public ItemStack[] chestContents; + private ItemStack[] topStacks; private byte facing; public TileEntityIronChest() { @@ -25,6 +29,7 @@ public class TileEntityIronChest extends TileEntity implements IInventory { super(); this.type=type; this.chestContents=new ItemStack[getSizeInventory()]; + this.topStacks = new ItemStack[8]; } public ItemStack[] getContents() { @@ -52,6 +57,65 @@ public class TileEntityIronChest extends TileEntity implements IInventory { return chestContents[i]; } + @Override + public void onInventoryChanged() { + super.onInventoryChanged(); + sortTopStacks(); + } + + protected void sortTopStacks() { + if (!type.isTransparent()) { + return; + } + ItemStack[] tempCopy=new ItemStack[getSizeInventory()]; + boolean hasStuff=false; + int compressedIdx=0; + mainLoop: + for (int i=0; i() { + @Override + public int compare(ItemStack o1, ItemStack o2) { + if (o1==null) { + return 1; + } else if (o2==null) { + return -1; + } else { + return o2.stackSize-o1.stackSize; + } + } + }); + int p=0; + for (int i=0; i0) { + topStacks[p++]=tempCopy[i]; + if (p==topStacks.length) { + break; + } + } + } + for (int i=p; iPBy7@0Gf4i2%l#T+t>bi7H*VRD#5P8lZT zxC3{E#O979W^*Qn|dBz#H$45f*;g96)9sn3N2*-n6`Y5g^{!vuTBi63Oa+zrxYM9W4}Zw7YK!2lIxe2SJu*hwd;1MMD$zWCFj5k7!=A29SFD(;B_O= z%kyxEZ{Y32m!Yt$PWN}K0swoTLoc4Uzt=azhQ09=y0pvsgssrOmXfgRdhxLf@QJT96I4&pNejAq?N^#Z5EGkoFH_8gjF~R5I$kZkqdHGE z^N~1;j-KO6J0`qudm{pvu=vF${F-+PHww$@{|o|6=$y8*fP#)i%vDBeLRUVu;Gs-N zC~qv*Ji*gDfEhG_>hSXBW4%{8Co;PaQWR$7UOxszyje-4Ia&WTgoq0eR=#x z13*8r+m!RAN2IB}dd+W?x(?qDaa*ni|Em&L-5tX0HoNqNuM|A;MDd+VSzx%pfQAn* z*`JGM*XM`y(@S%6|A0)8pDA4LkbYrDc3T4qv0dg9NofzSg`6N`t?54>B;MmC!+(Fb zB9cLgXERSHZe_0;;h8R=zua|FjOeQeX>0FeNhG)p8}G`22w64U%tq^Qz#sCBl^tu$ zANxXi$|S#&1dQ9#5`-7Qj^+gps4I(?neGP%>e>or!@=^6EoMUG14jxm&#lxkMnm&4 zuAQyk62{{@Mb7)U$DdCKxBUbu%;?OH9mv}9V||vd*xW34@-;xGqa)c4zSCAiCX{E8 zYF*#jfFB;?T+Mb+x&)TFqHmD^f0kxd_(1y0!JhWfn$36qtPSySZ~!@;*Le7k4nBQw zWL#$WcX-UaZc))Ccx)-p}YAw5Q0s7 zg9@R-YJ<0~-`IZJJB=~HzUW>Dsyb`*yGm?^0g+KZvHLgm##<^;v14$EPbiNPXUOK| zAXbnmOMUs&;8Ytwpn%#Hu8;X9tZ9XKw5NY$&Ob`2Tv^_4F32qZ^{pIeGrG|I>HH&} zE33MV*tx_zFLirKArL8gr1qSR6@|ZvCRNx!^S=t%m{tKG$)P8qh9X)iMHwH$9G`8U z{v3Cf0Gt2NFyLo%-U+Z6l&x2SpTMdlY`$TK*QlD7TilnPN*&jAvQw`jn z=9(+(!iMAGHe%>4)!8?6ZvIVT_)u@hY{axA;=fk{t~D%8?rC+yaMf?M&&Uu|!=oC1 zXf$3no7io-NZF(UgFFt&FO91)^FMc%E4OV9Msm?cq zvvke-ymzvvt;b5g*^kXt>FN#Rj<%~o8fq6`b@`q)^e85A>|>Dm?_l41sSu791dKdX z$XH&-30zlihn8l5*>j?0z6e0iVXTCf>K-~H*mAZrd@hNa1$tO%`OEpt6Q0#C^)i!s z3oQStgqN>8H|NKgpS6uaHaTlG-E9&9ydNAH6zzk3Ia`)UpWJg6oT%;XZgT^S-!{(Mdh=xi^#0Y@;4ybe4f&%TK3fxwk%2pCx6F&?v<NOm8NM8Jk zN(@mGvdDGn=l(e^cYp-=bG4lpXZlhARwAi-smRfy>-lB%Ls8h%`HR=@PUjA*54?QN zdzI&~ux0SN?BGb&noDRT4VlA&)^|^ZHob-K?7l#5@d##zL+6`LK)?>xg%5P`5$$)| z(V=XSsiA4q9@*=m>p^4opvM*(_6+`V*X$|I5P!MOm%W<8KSAE*~Ov=dZto$2wt*p zPJ%;6KSS|-^tP+$b-UPH_1{!tsb2$Cjz(BMd9E<1zoW6K!di>R{b*4n2zzm}#Lbh( zZCMf!1mLkX^MxjbwmWuZ6X5Y!^*ehhnW}dkKi664Q@_!C?riYbxiDWmtD@kr(A)xM z*&keI*SBt>31F;CRmNqweNv7s0KaA14fbEl!66)kuWw${dOSmI{JsomR*I@XwQ^;O zNjH$J=Pj(ZWyX}ieQJGz!4v@uF?EI6+5ov2h3oOsR|yGL0rZ2|;t&%&F$x4Fk?#cMPo8cd z_oo{#%!~H`MI3$3p+^X-trIvO3b#G`O*(w}!$4Uv{SGCo&w&t~S^@PkbZ}YeF)K@% z$Itt4K)k#nY??u0R1w5q#2TrDa=PPD^VTf?2+GTrybM@Q&C5b{59@l5R8C37p_0UkM6wMP&CCEYeUo)t zHW*)tY~3FE04!E;?mA+uf-8xo_3k%rGhc?8 zJlv${GIGLA0twhlP4V7W!^W{ZOE=t~BU(3u8qHgC?`R!GrS*WJ^@jfJ7q87YDZ9d? zHgSY7jw3~bnpO(MCrsd#c6vST!q$&HBLW26$x-!wr60zZ3V>UM#lxPWm3%wqt?z93|&c}p@h_Krmt zDq8)NX;h02pxdb1V`zrx$xsb5Oc``N$v))pdnl_D|(mC|&e9oCQo!_@`XUAeAvt9ck*AZ~D<^+cPz3D(^!UZd45$lh9o=U*QaD$;OBo z>Q@ptt6dGQn0|i*{nelK-5va%@Q78tNT*GxX?kBqc^ig|A24+#3r5GCK`7m%TgSNU z-jGub-;Px;ToT}+0gPSeSQCAtyapdI-Z@K~%v5qLUK9p!LmqMvBI*p;@P5TI#533X$JLd5h(rZ4i}C>ipRADY70!l|s? z&4L-3>(+BQiT6c_bI46{4_#>v4p)DWp*MQGOPkV*;?5ke)P5o(YPsnn{g$hI=CrVM zGoaGt%0Q3c1aso`8LdXN6Q^R$lP;=e8iLYQ%*OI2hwI;uzqb6wzHu&nt*8(G;OF?L zLB5}O8Ss}phCw49}b9j0Sx0Hw}Va;;s~6nBQMg*c>E@NW*9_!6nEmC9x!1cO$WU*=5Zc+ z5*-qH(t$P8;9psyw}7HAusTP6tz%%iUq%qrhw0&m!pif#@XR)xK#US7yn}M^C$2== z+{aoMxoRgDqfguPAfM*Um`*EiK>RK02Dg=ZpcswhWrqzMTfC6aG5<5zouFP06Hh>T6#VOy}cz)7tJalN>5)LN?Bd~>9s8oU4jJA&i10xMf zdGbkEf&c-*90x>HRu7o=03*dFl)2)oepQHK9d7si$v{%?9UzZJBGpR@>Zj8G0_y~L z$_P31nZ8!R$t!F4`K78>9*w6fFsQt7{x)tK{ri&A%AB2rYiW;>iSZXTnLVKb_(Htz*gW)%<$BFmvRHbSkby63a&0hDIWR1MT#}j4@&&W^Z{!M9o+SM1d^#Lr+|Fdd;bHGX59+E8fiS zTJZY{rO$V)dL)EBT?QmN4>x*Rb H>(T!Q>Md^$ delta 4408 zcmYjUdpwiv|DVc3R0>5&OF2!2DS1>T9uFBMgfgQ?A<3c0A?%ivCx_G`ryP2ioHi*8 zn<0$NDa4$%shr2wh+($<(D#qu{m=cnU$5))xnI|Hy-%M{>Mzt@y6qHG-lndtg^zpk z>W&7mZ^qKhdR5ZIZKVTjg@xV?s&4>%7Mqg648i;C-#DOQcQaP0n9XfKktbR4{@U@@z|8`vJt#L3mL+m z9v?R&r=9q*{m+k}=DmUOOf>+QbDmZ-O?{b3YSAaRIR*#G`e02Z^BjS++zFnrE;-+p z2Ww4&YK4}y_rrN?lucO#-=oqu&x>wJyI2L*6L%(kE3rR$AX%?6xns+1Ea ztlC`}p9UrmM3nJ`)hj&Lx{~lR#zdKTgt1gZD~y|&=SZ;b#nOC$u&Ht6kwBSN?trsk zK1bxiy!BEQ;h;y>e5O15U1kcj#*{FMDcU;8l6dKsz2jM_fma5cJ7;eguNqhr|5TKc zcW_wxD{8Dx6%tx@1DPac2Dli!cC${DxoIjE8Y+4`T$SRV^)@i?#yWb;W0xCk=}uUg zYN&(5gD&rK7od2^FL0lv3V!a%Z5yao%u(k4IM%$_4Ve$M=%bP(6s`}{s3~pImSV$&LjR6GeB_IOxel#6b$iW zhsML#;RAQdU4mHagmIUX3P^X0Au2ULf*67mbpc;jKN3`M=0WTS ze&jV!tzf&r8So(A;-xV|u=XQo78prV4IAqVdjr{fWM~~!Cm*#Kmp*h zT6VYYJy}Bc9VnR_?CpIk0j^S*(YeqKg_GNY&I_q1Aqmus6brz%hl@RvdkA@m__xl5 zwMU&>K$Zx&Ep{D=tE`Ri=(U82zI(lZEuZ_o39eBhw`eCN6Tf5woe17mVkL}f7*}c7 zVADUC@jb9J1xFGVyXAkFL&AWk9~>nSk>5`1SZ?x(*PfPMYV->07gC4PxHT&zPPjk} zF<;>nR(y`Y3uzGnl9Re<1lU~Zs!l0ye?n92sx4nN_vOEdW@^SDKX)n6xkV|^MRp~d z%roG3Q+?u;TB_%hz~pY;_LbVI%+v}}#2{T}%q)K5)5l=#sV+cfi&+Ubv@qCvO9^(v z%ak;`<4lwdPJnxR-r=WG7*jJeq(uOl%sX~--X7Ug-Db&Ll1xZ%zqYtVv>N}rgfL4U zn^a)H4hz$vlOo@R&<#0kiJN5!GGlGq_BMI@aS7u|To))#zA61Jp=^FKag%FDTxPuH z?E$H8CT=@QBjHfjU9kF;ZUur#_yRh8cP-BlmGE9lco~U1GR;7iIgw6PVt>tLsrpoX z46zO|j*6>49Do!bYf%seEIco*Q=^eelh+HKULr(Q;5~|`og`%}T4CD4IwwqcnYty5 z4UY0T0Rr=zb*RIckX z?C$1)H_U$biF=n4f_>{lU~ySOJqCAarQC-eo62I?O7b>}#yD2!==!o70ygfV%brK# zmB~cYK{d`6wxeQsoFd=62&D;^;d+mpVyY%NUlCJ#c9uO;uG9py20HXB8}gJ-y)iEE zYi*mEqe+B`xf2(e5G)Qbx}_Q z_qbqh?vN1wM#C7Yec(Rk5nDCVo~8_LkUJ37?r=rRC(!+=?#hrQW9q=r@VYZfyEM|7 ztX+9sSZy~9OfIc=xv%CS-KWCDULQKxM zWuBiFw$3vIpeldD|0k#_phg+gn;aN>wEi|qPBNqGTecB_8%SRmB$3%_*4tw0w2-O53%hda6~JF<-j7{ZP?a^F=>d z-JsUkx6283%->*%Vub%1cOz-at%u9zl$2M(BWE6G0+2tCN zHL7;&WzY;-JEGSkb>(u~)1z~~EhP!BlGl#u;tPCg7Q-A6nYCE-qU?!JujC*Wgv)hplp@)ik+U8~_@G&c}x25@3v zhYP`}sg|_{8HHpGeHf*cE^b(4#r7BVWkwpfp=YUgiZ1+Pz#J(aQFz8aeE-W|X@|D_ zcKBSIMbSLE)7cw#nt;V42h=w%KqGldWZC;%f4Dgx-dn|wP|8<2-6sQi_9GH=U+3m; zIkQ?}%U1Zgh4!;#93lL#A)<;uG%0%zO`PsU_{k zveU3Ajgz2x^>K?(#BmI}F`KSdP0_&g&R0>pr%!vI0pg7f!VZXPsG9kHM)ixM7l88T zy`SMKlRMX~>U}={HYT(B@PEB5&)vdQ(1r^N+0hY+>>-C`nV4$>s{}^FO&b%nnGUtA z+I-(jc`BO*xq+6ii9_~yKLun5mW%rDY2%so{Z9hG`nBMwB>(#Nxi)h?aWZ3RN220^ zADxC6B}ND#(5F;2J^f&0cI!mg9Fv^?e(olsY~e-SSrNS51lxgu^ioG^8Mh^#|c$159ymR^DgEWuuKfZ207*%%k-~ z*5@b+^+D?nVYGeVhF9Wa?PY*)tw(}i)pL&&+A3Tm`TjByK5M8@X$Uv|g-8;(?{bB& zI=WKuaf}%RAhJN`^VZk>#}m(!sg9po@oP}yNfrWFl&F2NwduPkJH1bY(^D(@Ekq52 zHOGI#i>48n#;i!Mc%?{pCBzalRke=}svtU{ft4)5ieI1#P!CH*qmq2@^&HpklrBz|7DgM|Lg48n51os0mEAQEMP`lE^vCO1%2UF>+rV1X5g zWk&ox(nm`n_RW#|oMDSZ&vwKU2B-woP$?fJKU$5EafSTRGPa-Yh>CnCACe@f>OZOR z?I`d#&!3-PU#y^eatA+L5X;T;pBV5OCN5c4SLc*1K~A zUE^{G5s+%npn7(RlnLa(UrF&C@M!;9BU0$xz{>*>IjP2m@BzImAtkZ!#uL@P!h6Kf zGN<|lg*%)ptR;jf&n&!>Wr8FMqFS}2I0YuZbO~gSbSDz*#04e{AOODj7GYfJD0h!$zuB1Ih{Z_t20#uc8Z`jEo1nU#%lT@O5*q9|DS3 z(Z&@74M~3+H>W#ENtAR#aDg3>63eM)|Ql^z*hcgA&`4O!u}=zaR>azZj8dj+F_OdPV4i66PfGdaA&hHCR%wtxEo|SQi#6SY z2%*Ft< z_XF8Ay0wtl6(YWw;!6}mNh>$|#aGLjtZ|(1JxBm%5m6pVljbK3i~fsxG6zR`T1?p4gp-O{Wq3Z#B=DNlDl1 z!DL=zk@umjtQ^*_^=pi9I`I{Lcj~bZ;4L#q5-rHQwz-W>;Vf^zP<-{e{Ss5@k<0q0 z_|sX)w_Msb5?Fj}3N`s8@Aj!vOOHO;CfIh>ptku90<*w8OQe5D`?|fQI#^UlX((}K z|8Lw{f9y<=5Xj(%#Vfnu$u zCMZjtl@qCLCPpdNsx?WObzV+ds({ZFYc;(?SwG}X`U?|HinVI1{* zcZrMV9ol|Wy`|Lr8fE$SaxGux;s?cA^^=tOS()@-v9MrX2)*E-I7hejkzj_hU{T%* zX1VxEu~thzDJv%>FE6oh(C*)J{PyCV#^oE~i^4)&TT|g9bD%UB9Z*ZiOxO-An zRsBR+bzA)#bL`09RrO~7S8Ro=j{Unq8&1RMl;K5b)KWV}Q|ji_rYWmkRsY>xHuk5C Q7dCqoUxf5XC>h z#Z?b$(50K;Qs*KlS|`Cl1ec=bY8BsuET8wyamnH4?!tavik%LvO8u_@t*i&V*DQzrPN z;$7etvq;q%Huas?)n~%0m_-`${%K>HpBnn)3%Nz&tcOdi3$H}3Ww2?({Go4+IF}KZ zE#Z~Oqg&Xbd;BPBQFet{qzp`lcGgMQ38~-|Y_)w3M|P1H?G?(NFpKk2AK21