From a803a81933d6178c51fc9f15b5d1ca34fdf31c30 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Thu, 3 Nov 2016 21:59:55 +0100 Subject: [PATCH] Implement disk near capacity state + update transmitter textures --- .../render/BakedModelDiskDrive.java | 4 +- .../render/BakedModelDiskManipulator.java | 6 +- .../refinedstorage/render/ModelDiskDrive.java | 4 + .../render/ModelDiskManipulator.java | 14 +- .../refinedstorage/tile/TileDiskDrive.java | 46 ++++-- .../tile/TileDiskManipulator.java | 20 ++- .../models/block/disk_near_capacity.json | 146 ++++++++++++++++++ .../textures/blocks/disk_near_capacity.png | Bin 0 -> 1074 bytes .../blocks/network_receiver_connected.png | Bin 16247 -> 16769 bytes .../blocks/network_transmitter_connected.png | Bin 16170 -> 16695 bytes 10 files changed, 208 insertions(+), 32 deletions(-) create mode 100755 src/main/resources/assets/refinedstorage/models/block/disk_near_capacity.json create mode 100755 src/main/resources/assets/refinedstorage/textures/blocks/disk_near_capacity.png diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java index 9d1db8b9d..6cf3b2de9 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java @@ -85,7 +85,7 @@ public class BakedModelDiskDrive implements IBakedModel { } }); - public BakedModelDiskDrive(IBakedModel base, IBakedModel disk, IBakedModel diskFull, IBakedModel diskDisconnected) { + public BakedModelDiskDrive(IBakedModel base, IBakedModel disk, IBakedModel diskNearCapacity, IBakedModel diskFull, IBakedModel diskDisconnected) { this.base = base; for (EnumFacing facing : EnumFacing.HORIZONTALS) { @@ -94,10 +94,12 @@ public class BakedModelDiskDrive implements IBakedModel { disks.put(facing, new HashMap<>()); disks.get(facing).put(TileDiskDrive.DISK_STATE_NORMAL, new ArrayList<>()); + disks.get(facing).put(TileDiskDrive.DISK_STATE_NEAR_CAPACITY, new ArrayList<>()); disks.get(facing).put(TileDiskDrive.DISK_STATE_FULL, new ArrayList<>()); disks.get(facing).put(TileDiskDrive.DISK_STATE_DISCONNECTED, new ArrayList<>()); initDiskModels(disk, TileDiskDrive.DISK_STATE_NORMAL, facing); + initDiskModels(diskNearCapacity, TileDiskDrive.DISK_STATE_NEAR_CAPACITY, facing); initDiskModels(diskFull, TileDiskDrive.DISK_STATE_FULL, facing); initDiskModels(diskDisconnected, TileDiskDrive.DISK_STATE_DISCONNECTED, facing); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskManipulator.java index eef3ad583..f9e7efaf7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskManipulator.java @@ -86,7 +86,7 @@ public class BakedModelDiskManipulator implements IBakedModel { } }); - public BakedModelDiskManipulator(IBakedModel baseConnected, IBakedModel baseDisconnected, IBakedModel disk, IBakedModel diskFull, IBakedModel diskDisconnected) { + public BakedModelDiskManipulator(IBakedModel baseConnected, IBakedModel baseDisconnected, IBakedModel disk, IBakedModel diskNearCapacity, IBakedModel diskFull, IBakedModel diskDisconnected) { this.baseDisconnected = baseDisconnected; for (EnumFacing facing : EnumFacing.HORIZONTALS) { @@ -96,10 +96,12 @@ public class BakedModelDiskManipulator implements IBakedModel { disks.put(facing, new HashMap<>()); disks.get(facing).put(TileDiskDrive.DISK_STATE_NORMAL, new ArrayList<>()); + disks.get(facing).put(TileDiskDrive.DISK_STATE_NEAR_CAPACITY, new ArrayList<>()); disks.get(facing).put(TileDiskDrive.DISK_STATE_FULL, new ArrayList<>()); disks.get(facing).put(TileDiskDrive.DISK_STATE_DISCONNECTED, new ArrayList<>()); initDiskModels(disk, TileDiskDrive.DISK_STATE_NORMAL, facing); + initDiskModels(diskNearCapacity, TileDiskDrive.DISK_STATE_NEAR_CAPACITY, facing); initDiskModels(diskFull, TileDiskDrive.DISK_STATE_FULL, facing); initDiskModels(diskDisconnected, TileDiskDrive.DISK_STATE_DISCONNECTED, facing); } @@ -140,7 +142,7 @@ public class BakedModelDiskManipulator implements IBakedModel { } CacheKey key = new CacheKey(((IExtendedBlockState) state).getClean(), side, diskState); - cache.refresh(key); + return cache.getUnchecked(key); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskDrive.java index c2b4efc2a..cc1d41ac3 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskDrive.java @@ -16,6 +16,7 @@ import java.util.Collections; public class ModelDiskDrive implements IModel { private static final ResourceLocation MODEL_BASE = new ResourceLocation("refinedstorage:block/disk_drive"); private static final ResourceLocation MODEL_DISK = new ResourceLocation("refinedstorage:block/disk"); + private static final ResourceLocation MODEL_DISK_NEAR_CAPACITY = new ResourceLocation("refinedstorage:block/disk_near_capacity"); private static final ResourceLocation MODEL_DISK_FULL = new ResourceLocation("refinedstorage:block/disk_full"); private static final ResourceLocation MODEL_DISK_DISCONNECTED = new ResourceLocation("refinedstorage:block/disk_disconnected"); @@ -33,12 +34,14 @@ public class ModelDiskDrive implements IModel { public IBakedModel bake(IModelState state, VertexFormat format, Function bakedTextureGetter) { IModel baseModel; IModel diskModel; + IModel diskModelNearCapacity; IModel diskModelFull; IModel diskModelDisconnected; try { baseModel = ModelLoaderRegistry.getModel(MODEL_BASE); diskModel = ModelLoaderRegistry.getModel(MODEL_DISK); + diskModelNearCapacity = ModelLoaderRegistry.getModel(MODEL_DISK_NEAR_CAPACITY); diskModelFull = ModelLoaderRegistry.getModel(MODEL_DISK_FULL); diskModelDisconnected = ModelLoaderRegistry.getModel(MODEL_DISK_DISCONNECTED); } catch (Exception e) { @@ -48,6 +51,7 @@ public class ModelDiskDrive implements IModel { return new BakedModelDiskDrive( baseModel.bake(state, format, bakedTextureGetter), diskModel.bake(state, format, bakedTextureGetter), + diskModelNearCapacity.bake(state, format, bakedTextureGetter), diskModelFull.bake(state, format, bakedTextureGetter), diskModelDisconnected.bake(state, format, bakedTextureGetter) ); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskManipulator.java index fdee1099a..e1f83f349 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskManipulator.java @@ -18,6 +18,7 @@ public class ModelDiskManipulator implements IModel { private static final ResourceLocation MODEL_BASE_CONNECTED = new ResourceLocation("refinedstorage:block/disk_manipulator_connected"); private static final ResourceLocation MODEL_BASE_DISCONNECTED = new ResourceLocation("refinedstorage:block/disk_manipulator_disconnected"); private static final ResourceLocation MODEL_DISK = new ResourceLocation("refinedstorage:block/disk"); + private static final ResourceLocation MODEL_DISK_NEAR_CAPACITY = new ResourceLocation("refinedstorage:block/disk_near_capacity"); private static final ResourceLocation MODEL_DISK_FULL = new ResourceLocation("refinedstorage:block/disk_full"); private static final ResourceLocation MODEL_DISK_DISCONNECTED = new ResourceLocation("refinedstorage:block/disk_disconnected"); @@ -35,6 +36,7 @@ public class ModelDiskManipulator implements IModel { public IBakedModel bake(IModelState state, VertexFormat format, Function bakedTextureGetter) { IModel baseModelConnected, baseModelDisconnected; IModel diskModel; + IModel diskModelNearCapacity; IModel diskModelFull; IModel diskModelDisconnected; @@ -42,6 +44,7 @@ public class ModelDiskManipulator implements IModel { baseModelConnected = ModelLoaderRegistry.getModel(MODEL_BASE_CONNECTED); baseModelDisconnected = ModelLoaderRegistry.getModel(MODEL_BASE_DISCONNECTED); diskModel = ModelLoaderRegistry.getModel(MODEL_DISK); + diskModelNearCapacity = ModelLoaderRegistry.getModel(MODEL_DISK_NEAR_CAPACITY); diskModelFull = ModelLoaderRegistry.getModel(MODEL_DISK_FULL); diskModelDisconnected = ModelLoaderRegistry.getModel(MODEL_DISK_DISCONNECTED); } catch (Exception e) { @@ -49,11 +52,12 @@ public class ModelDiskManipulator implements IModel { } return new BakedModelDiskManipulator( - baseModelConnected.bake(state, format, bakedTextureGetter), - baseModelDisconnected.bake(state, format, bakedTextureGetter), - diskModel.bake(state, format, bakedTextureGetter), - diskModelFull.bake(state, format, bakedTextureGetter), - diskModelDisconnected.bake(state, format, bakedTextureGetter) + baseModelConnected.bake(state, format, bakedTextureGetter), + baseModelDisconnected.bake(state, format, bakedTextureGetter), + diskModel.bake(state, format, bakedTextureGetter), + diskModelNearCapacity.bake(state, format, bakedTextureGetter), + diskModelFull.bake(state, format, bakedTextureGetter), + diskModelDisconnected.bake(state, format, bakedTextureGetter) ); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java index 0ea7eaa61..8a30835e2 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java @@ -41,12 +41,12 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl public static final TileDataParameter ACCESS_TYPE = IAccessType.createParameter(); public class ItemStorage extends ItemStorageNBT { - private boolean wasFull; + private int lastState; public ItemStorage(ItemStack disk) { super(disk.getTagCompound(), EnumItemStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this); - wasFull = isFull(); + lastState = getDiskState(getStored(), getCapacity()); } @Override @@ -79,8 +79,10 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl public void onStorageChanged() { super.onStorageChanged(); - if (wasFull != isFull()) { - wasFull = isFull(); + int currentState = getDiskState(getStored(), getCapacity()); + + if (lastState != currentState) { + lastState = currentState; updateBlock(); } @@ -88,12 +90,12 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl } public class FluidStorage extends FluidStorageNBT { - private boolean wasFull; + private int lastState; public FluidStorage(ItemStack disk) { super(disk.getTagCompound(), EnumFluidStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this); - wasFull = isFull(); + lastState = getDiskState(getStored(), getCapacity()); } @Override @@ -126,8 +128,10 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl public void onStorageChanged() { super.onStorageChanged(); - if (wasFull != isFull()) { - wasFull = isFull(); + int currentState = getDiskState(getStored(), getCapacity()); + + if (lastState != currentState) { + lastState = currentState; updateBlock(); } @@ -142,9 +146,10 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl private static final String NBT_DISK_STATE = "DiskState_%d"; public static final int DISK_STATE_NORMAL = 0; - public static final int DISK_STATE_FULL = 1; - public static final int DISK_STATE_DISCONNECTED = 2; - public static final int DISK_STATE_NONE = 3; + public static final int DISK_STATE_NEAR_CAPACITY = 1; + public static final int DISK_STATE_FULL = 2; + public static final int DISK_STATE_DISCONNECTED = 3; + public static final int DISK_STATE_NONE = 4; private ItemHandlerBasic disks = new ItemHandlerBasic(8, this, IItemValidator.STORAGE_DISK) { @Override @@ -366,11 +371,10 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl if (!connected) { state = DISK_STATE_DISCONNECTED; } else { - state = DISK_STATE_NORMAL; - - if ((itemStorages[i] != null && itemStorages[i].isFull()) || (fluidStorages[i] != null && fluidStorages[i].isFull())) { - state = DISK_STATE_FULL; - } + state = getDiskState( + itemStorages[i] != null ? itemStorages[i].getStored() : fluidStorages[i].getStored(), + itemStorages[i] != null ? itemStorages[i].getCapacity() : fluidStorages[i].getCapacity() + ); } } @@ -390,6 +394,16 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl } } + public static int getDiskState(int stored, int capacity) { + if (stored == capacity) { + return DISK_STATE_FULL; + } else if ((int) ((float) stored / (float) capacity * 100F) > 85) { + return DISK_STATE_NEAR_CAPACITY; + } else { + return DISK_STATE_NORMAL; + } + } + @Override public int getCompare() { return compare; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java index 1cb9faacc..9364ce0f7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java @@ -111,12 +111,12 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte }; public class ItemStorage extends ItemStorageNBT { - private boolean wasFull; + private int lastState; public ItemStorage(ItemStack disk) { super(disk.getTagCompound(), EnumItemStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskManipulator.this); - wasFull = isFull(); + lastState = TileDiskDrive.getDiskState(getStored(), getCapacity()); } @Override @@ -146,8 +146,10 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte public void onStorageChanged() { super.onStorageChanged(); - if (wasFull != isFull()) { - wasFull = isFull(); + int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); + + if (lastState != currentState) { + lastState = currentState; updateBlock(); } @@ -155,12 +157,12 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte } public class FluidStorage extends FluidStorageNBT { - private boolean wasFull; + private int lastState; public FluidStorage(ItemStack disk) { super(disk.getTagCompound(), EnumFluidStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskManipulator.this); - wasFull = isFull(); + lastState = TileDiskDrive.getDiskState(getStored(), getCapacity()); } @Override @@ -190,8 +192,10 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte public void onStorageChanged() { super.onStorageChanged(); - if (wasFull != isFull()) { - wasFull = isFull(); + int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); + + if (lastState != currentState) { + lastState = currentState; updateBlock(); } diff --git a/src/main/resources/assets/refinedstorage/models/block/disk_near_capacity.json b/src/main/resources/assets/refinedstorage/models/block/disk_near_capacity.json new file mode 100755 index 000000000..5670751f2 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/block/disk_near_capacity.json @@ -0,0 +1,146 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "textures": { + "0": "refinedstorage:blocks/disk_near_capacity" + }, + "elements": [ + { + "name": "disk", + "from": [ + 11.0, + 14.0, + -1.0 + ], + "to": [ + 16.0, + 16.0, + 0.0 + ], + "faces": { + "north": { + "texture": "#0", + "uv": [ + 3.0, + 0.0, + 8.0, + 2.0 + ] + }, + "east": { + "texture": "#0", + "uv": [ + 2.0, + 0.0, + 3.0, + 2.0 + ] + }, + "south": { + "texture": "#0", + "uv": [ + 9.0, + 0.0, + 14.0, + 2.0 + ] + }, + "west": { + "texture": "#0", + "uv": [ + 8.0, + 0.0, + 9.0, + 2.0 + ] + }, + "up": { + "texture": "#0", + "uv": [ + 3.0, + 2.0, + 8.0, + 3.0 + ] + }, + "down": { + "texture": "#0", + "uv": [ + 3.0, + 3.0, + 8.0, + 4.0 + ] + } + } + }, + { + "name": "led", + "from": [ + 12.0, + 13.95, + -1.05 + ], + "to": [ + 13.0, + 15.0, + -0.10000000000000009 + ], + "faces": { + "north": { + "texture": "#0", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "east": { + "texture": "#0", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "south": { + "texture": "#0", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "west": { + "texture": "#0", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "up": { + "texture": "#0", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "down": { + "texture": "#0", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/disk_near_capacity.png b/src/main/resources/assets/refinedstorage/textures/blocks/disk_near_capacity.png new file mode 100755 index 0000000000000000000000000000000000000000..706e89e27a47ae714fb2fb905706238e0787567a GIT binary patch literal 1074 zcmaJ=O=#0l9FNQ|hSjMsKbZK4I2^7`UbA#fTpexFZB<)mEv$+Mv*fLfHF;U`X1n1* zhKOF&gY2e<;k+sMaS%nv^duhiAS&u%vV#|4py02WR5GB z%b~Im!ft_sk|c3_m)jnSEv0L+Eypi+WkL}52R{j z73(7wvPnvfvD6YWOhb+futQSfNhvOLLYRz1BZ80+`Djw$!%*oE>)e#>5zW?7oooK# zs{iH6ii)q=wVuHOQc7UQ(y9IU(n6`n-UYlRunp)(VCy>$OVhdF3Bb$q8 z5EBt73Z02)q%-d8PpHwbD)cB37^R8vQMSf47RkNFRsPB4s2I*~?qAKWo9G1j+lA4k zhlSxsHl28vj`r2$nOS-*CR1uWS9$aC{I1oHL6cg5<1a5in+du=O+LNs1~wddG_iA_ zdAfLj-JYgzZLqk_H3qvzEM@uIoCnq;oV`EdN$&H+vn|ryWjaXhDShi;J8XNuk zK2I0NkcwL>lYG5H0ws>mf4=9gcDY;no^Gj>Icr?^2`Dw|Mrk;0dCj~-H%B<{voed2 zsNfc@UrbJG+ZMQ<7Ma61nNj@FiwwmRG0%_AtUho1+*0=)`;X7{KmQiy=JE<|z2>6Q z!oZ-pbZb~PFGI%(3Gd5O44=&j_TprSh>Z>Ps+UY|5!f2__S?7bTRrc|9eCQCx39{| z+lpthkt% zAN%SnD>bJCF$lCJF28JeEMu+r(o6gM^&M9#aQOK}F&vQ47V9pQQC_5=#PGpp{pFWy z*01MpcYZ#neyf@1q#8SW8NS6DtFC563Nr|F?AX3Nd~KLyvbnkW*Q&W4mrS0{5uR9_ zS5{^wz2I)1u;AsW`}Kcw>+9|Nk~NpU|Gj(n?ypsQFJ_oX_2$?vz4Gzn$3MH}84j%3 z`a~vo&-=37%?B4;f9;7N6HobkJi;G*m%jbnYQ!Ye3FS1l@ zF=S(4P&hp4^iu`}qc7@g$0UTE-jwOqe^=r;oVWe7rMQzw_tDPIP7_~a+vhfwpa0}L zU5j#bQJ?L<>gubPFEb_DI(F>X;o%aMoy;RBnJke!)obb2pArl#3_7~HnQH|<{`yr_ zS-JE6`+hfNh7%i}e6BqIxqeRZ(x8`r{=`^3w|IW-*2Ro1n>Qz~Wo^*tVptHMk)r0M z=_2CvW1oJDKyq?&dU|^K`*Q-83>Fp^AGYuNb*$umo{ztObat~s#@47-r-PQq8GwHE z_45<5e17NQ!^EGL*RQmmdbPEh-|kP&_S=pEM+#%~rXN3keCd=On>I~yR8`VAx6_bK oaP8K8@6+QQj_8z?t@_W*;KEw&eK+)3Cj$_8y85}Sb4q9e0Mtc#mH+?% delta 732 zcmV<20weu_g8}z`kT?Q7YOy-P1Cyr*7LyVLFq5YT7L!;6HIqySCbP2y%>%PK3Jn6Y zkPI6#1fc6ki<7TDFMo$gL_t(|+9Z-aZxc%thR>NfGu~+J#Lm(fDT$y;3a%Ad7Dc2) z>7WP&UBrh3;wONhxdj4>`y-Gb&>)l&TvCCQNVY{1g(@P6lP>bwYscQq&YZc${(x8S z$MfR)`Z^*SW0;wU06;0_oHND%03r$@vMduqc<;5=1ORJmYkyj6Yb_Bqo6Xh#wyd$> z(GvW8@o;HrNo#G4QA!;i9tr@+vTT2UKS`2)zrV7w^5gk~>$l|GtwQVHXSLctL}ZLP zKR-{?)EGlrYXFF%sMqURYmG70YW2&;L#=ffhJXJa1Aq{sQmLeAiipI_08l6tdcEG} z=H_@j_TD?^u79qsN~O|xJdWeI*=*)b0Dus2cXzj5uL~hAFE88eHZx~gCZ%L%@BQN9 zVm?5(+ht~9jJf^peXG?<(^M%H1i{YEPP^UibUK|*Ctpu%eROoxc>M_ggmX?fxWBzM z7z{?EQIaG|sW^@=E-sjvnMb41a5#MW{ex40h=Q53lz*KMjWNYyk%+9d0000vmSV98 z02wkX7D5Oja>{?bw-H6rU@(wU5>cg6nVFf%vMkq2DYx!C@r=$nV&-439@XphlarGu ziV(3@t1+`N##+nF)>8e>-eC3s zu(!9j@$KU^sXp9&Fh4)ofX>gs9^m6@fK)>=e#&LIUskbeOY^Vs>R{vQAyFMCRW`JjIQ O0000_buEl7Ep$x{4U&^BlTA|%Q<64sWI4|~*^iTJ@&&dUqI66yU^hpzZSz+4 zekKKT12ac+15-B(6GIn6Lsv5kLo+u=OD7{ICpTAPV^gQejhvdBUAUx;Sbo|uKbo9u zqhH_a>EaktaZ6>={%o0Wk=FOs@AsK+KBKqzrsGwuh(ZoQL650ETAW`sgO0RHiR;~A z6+n5q49C7lN2iwNoQE$(kyHi=5-}RIE-NTya zyR+)+<27Af&h&IJB&^l#a&mET(OkM!?{rYMuF|=BOO}Scdu^Z3`7S58Si{Q7s%iQD z)_dan>$dOQIrI6>;=YbGTbmC$Fgrv}`&(CUHrsdk<;jyLKRNz=?$_$-+4F1v9sa#} zv$2cHqKg?*o?8koEaqdlWFp&t{N8W3#fxMoT+ zG$}~*A7^K0kDOND=@A<08n`8Dt;XrC0N|&x{lf+<*W7ldJP9=S629Hn6d^eOtDBZ`}Ipudlwge7>*Z@4HW* zgcwX1UL3z~@3FSy%=6DTbJEt%^-(i7H$QXc%;%pn3=t|dzp6!CZ`D`Zf4pg*oJBPyPcEc8xq+NZwg^6gW9 z{w&e)4)My(&HelN(LzHt-{7TJzI`(@7M}Qh-psw(qu_imJyv2?Qf rp6_0oz=Uv3#cSm*Glq<{|K%CZDK}oxn#web0SG)@{an^LB{Ts5s#1k_ delta 728 zcmV;}0w?{qf&r?2kT?Q7A+b8b1Cyr*7LyVLFq5YT7L!;6HIqySCbP2y%>%PK3d8}k zM+_S>1T}L@`jcipFMoqcL_t(|+9Z;_Yg1tq#?Sk8?=3gsHi=zKg<2d6rRgA999lYc z5h*xG!7d#v=pUe)gM)*cgP=thT@=$nDBbGdpj{Fq5IUx%p&e@T(d6dlyzf27;Vx%; z;QXH7Bi7c|gb;{GL|SVAFvd(K6J};+A%v9DS}UbwX3z690Dr8mu6my5oYPu|VYt7) zfA7^NVDbCq_Tu7Vk|dtzA)+y+)oMuqu+}!4&B0*M>-7!~4>!Jlyt$-qE%}f3z8xPQ zYpoHn)9EBhf{0>$eZ5+(_WS)fj-7Le2msEx>{@F9KuQ@!5i_5hoM<8f0N?kouC6vW zH{&>F<}^(wlYdD*pO53X+wC449AqQ_pfjvit5qtMMx#-^UMC`Jtx}4Jn0aAg0TIv7 z&x^$(5lKXBHk3e0XA?>}M1RCwE~mB5hyftelFQ|sb5;-; zLPV*Q`upZ7!pIoY@As8bTI)ig5Ji!-Hp?TTgIx2)wzXCZAu5&1&&N-cQl(N!2(i4p zOhkz2oFgLVoRo5JW2;;)x7%%2dAdX|Pva*s%B_gGib500hjL}+WBppJC?Coq+{|5l~t%_cy-y^C30000< KMNUMnLSTZaGgjjO