From 67e7da2b733cf9220e46fdc87313c7112954775a Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 8 May 2020 22:58:16 +0200 Subject: [PATCH] crafting terminal base --- .../java/de/ellpeck/prettypipes/Registry.java | 16 +++++++-- .../terminal/CraftingTerminalBlock.java | 17 ++++++++++ .../terminal/CraftingTerminalTileEntity.java | 31 ++++++++++++++++++ .../terminal/ItemTerminalTileEntity.java | 6 +++- .../containers/CraftingTerminalContainer.java | 19 +++++++++++ .../containers/CraftingTerminalGui.java | 26 +++++++++++++++ .../containers/ItemTerminalContainer.java | 13 +++++--- .../terminal/containers/ItemTerminalGui.java | 28 ++++++++++------ .../textures/gui/crafting_terminal.png | Bin 0 -> 1910 bytes .../textures/gui/item_terminal.png | Bin 1642 -> 1672 bytes 10 files changed, 139 insertions(+), 17 deletions(-) create mode 100644 src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalBlock.java create mode 100644 src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java create mode 100644 src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalContainer.java create mode 100644 src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalGui.java create mode 100644 src/main/resources/assets/prettypipes/textures/gui/crafting_terminal.png diff --git a/src/main/java/de/ellpeck/prettypipes/Registry.java b/src/main/java/de/ellpeck/prettypipes/Registry.java index 0ea271d..ff0e962 100644 --- a/src/main/java/de/ellpeck/prettypipes/Registry.java +++ b/src/main/java/de/ellpeck/prettypipes/Registry.java @@ -24,8 +24,12 @@ import de.ellpeck.prettypipes.pipe.modules.retrieval.RetrievalModuleItem; import de.ellpeck.prettypipes.pipe.modules.stacksize.StackSizeModuleContainer; import de.ellpeck.prettypipes.pipe.modules.stacksize.StackSizeModuleGui; import de.ellpeck.prettypipes.pipe.modules.stacksize.StackSizeModuleItem; +import de.ellpeck.prettypipes.terminal.CraftingTerminalBlock; +import de.ellpeck.prettypipes.terminal.CraftingTerminalTileEntity; import de.ellpeck.prettypipes.terminal.ItemTerminalBlock; import de.ellpeck.prettypipes.terminal.ItemTerminalTileEntity; +import de.ellpeck.prettypipes.terminal.containers.CraftingTerminalContainer; +import de.ellpeck.prettypipes.terminal.containers.CraftingTerminalGui; import de.ellpeck.prettypipes.terminal.containers.ItemTerminalContainer; import de.ellpeck.prettypipes.terminal.containers.ItemTerminalGui; import net.minecraft.block.Block; @@ -88,6 +92,10 @@ public final class Registry { public static TileEntityType itemTerminalTileEntity; public static ContainerType itemTerminalContainer; + public static Block craftingTerminalBlock; + public static TileEntityType craftingTerminalTileEntity; + public static ContainerType craftingTerminalContainer; + public static EntityType pipeFrameEntity; public static ContainerType extractionModuleContainer; @@ -99,7 +107,8 @@ public final class Registry { public static void registerBlocks(RegistryEvent.Register event) { event.getRegistry().registerAll( pipeBlock = new PipeBlock().setRegistryName("pipe"), - itemTerminalBlock = new ItemTerminalBlock().setRegistryName("item_terminal") + itemTerminalBlock = new ItemTerminalBlock().setRegistryName("item_terminal"), + craftingTerminalBlock = new CraftingTerminalBlock().setRegistryName("crafting_terminal") ); } @@ -129,7 +138,8 @@ public final class Registry { public static void registerTiles(RegistryEvent.Register> event) { event.getRegistry().registerAll( pipeTileEntity = (TileEntityType) TileEntityType.Builder.create(PipeTileEntity::new, pipeBlock).build(null).setRegistryName("pipe"), - itemTerminalTileEntity = (TileEntityType) TileEntityType.Builder.create(ItemTerminalTileEntity::new, itemTerminalBlock).build(null).setRegistryName("item_terminal") + itemTerminalTileEntity = (TileEntityType) TileEntityType.Builder.create(ItemTerminalTileEntity::new, itemTerminalBlock).build(null).setRegistryName("item_terminal"), + craftingTerminalTileEntity = (TileEntityType) TileEntityType.Builder.create(CraftingTerminalTileEntity::new, craftingTerminalBlock).build(null).setRegistryName("crafting_terminal") ); } @@ -145,6 +155,7 @@ public final class Registry { event.getRegistry().registerAll( pipeContainer = (ContainerType) IForgeContainerType.create((windowId, inv, data) -> new MainPipeContainer(pipeContainer, windowId, inv.player, data.readBlockPos())).setRegistryName("pipe"), itemTerminalContainer = (ContainerType) IForgeContainerType.create((windowId, inv, data) -> new ItemTerminalContainer(itemTerminalContainer, windowId, inv.player, data.readBlockPos())).setRegistryName("item_terminal"), + craftingTerminalContainer = (ContainerType) IForgeContainerType.create((windowId, inv, data) -> new CraftingTerminalContainer(craftingTerminalContainer, windowId, inv.player, data.readBlockPos())).setRegistryName("crafting_terminal"), extractionModuleContainer = createPipeContainer("extraction_module"), filterModuleContainer = createPipeContainer("filter_module"), retrievalModuleContainer = createPipeContainer("retrieval_module"), @@ -192,6 +203,7 @@ public final class Registry { ScreenManager.registerFactory(pipeContainer, MainPipeGui::new); ScreenManager.registerFactory(itemTerminalContainer, ItemTerminalGui::new); + ScreenManager.registerFactory(craftingTerminalContainer, CraftingTerminalGui::new); ScreenManager.registerFactory(extractionModuleContainer, ExtractionModuleGui::new); ScreenManager.registerFactory(filterModuleContainer, FilterModuleGui::new); ScreenManager.registerFactory(retrievalModuleContainer, RetrievalModuleGui::new); diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalBlock.java b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalBlock.java new file mode 100644 index 0000000..76ee455 --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalBlock.java @@ -0,0 +1,17 @@ +package de.ellpeck.prettypipes.terminal; + +import de.ellpeck.prettypipes.terminal.containers.ItemTerminalGui; +import net.minecraft.block.ContainerBlock; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockReader; + +import javax.annotation.Nullable; + +public class CraftingTerminalBlock extends ItemTerminalBlock { + + @Nullable + @Override + public TileEntity createNewTileEntity(IBlockReader worldIn) { + return new CraftingTerminalTileEntity(); + } +} diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java new file mode 100644 index 0000000..80aaedd --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java @@ -0,0 +1,31 @@ +package de.ellpeck.prettypipes.terminal; + +import de.ellpeck.prettypipes.PrettyPipes; +import de.ellpeck.prettypipes.Registry; +import de.ellpeck.prettypipes.terminal.containers.CraftingTerminalContainer; +import de.ellpeck.prettypipes.terminal.containers.ItemTerminalContainer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; + +import javax.annotation.Nullable; + +public class CraftingTerminalTileEntity extends ItemTerminalTileEntity { + + public CraftingTerminalTileEntity() { + super(Registry.craftingTerminalTileEntity); + } + + @Override + public ITextComponent getDisplayName() { + return new TranslationTextComponent("container." + PrettyPipes.ID + ".crafting_terminal"); + } + + @Nullable + @Override + public Container createMenu(int window, PlayerInventory inv, PlayerEntity player) { + return new CraftingTerminalContainer(Registry.craftingTerminalContainer, window, player, this.pos); + } +} diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java index 14b05f0..3a2f112 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java @@ -52,8 +52,12 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine public Map networkItems; private final Queue> pendingRequests = new ArrayDeque<>(); + protected ItemTerminalTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + } + public ItemTerminalTileEntity() { - super(Registry.itemTerminalTileEntity); + this(Registry.itemTerminalTileEntity); } @Override diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalContainer.java b/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalContainer.java new file mode 100644 index 0000000..dcfe991 --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalContainer.java @@ -0,0 +1,19 @@ +package de.ellpeck.prettypipes.terminal.containers; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.inventory.container.Slot; +import net.minecraft.util.math.BlockPos; + +import javax.annotation.Nullable; + +public class CraftingTerminalContainer extends ItemTerminalContainer { + public CraftingTerminalContainer(@Nullable ContainerType type, int id, PlayerEntity player, BlockPos pos) { + super(type, id, player, pos); + } + + @Override + protected int getSlotXOffset() { + return 65; + } +} diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalGui.java b/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalGui.java new file mode 100644 index 0000000..99d4fc9 --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalGui.java @@ -0,0 +1,26 @@ +package de.ellpeck.prettypipes.terminal.containers; + +import de.ellpeck.prettypipes.PrettyPipes; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; + +public class CraftingTerminalGui extends ItemTerminalGui { + private static final ResourceLocation TEXTURE = new ResourceLocation(PrettyPipes.ID, "textures/gui/crafting_terminal.png"); + + public CraftingTerminalGui(ItemTerminalContainer screenContainer, PlayerInventory inv, ITextComponent titleIn) { + super(screenContainer, inv, titleIn); + this.xSize = 256; + } + + @Override + protected ResourceLocation getTexture() { + return TEXTURE; + } + + @Override + protected int getXOffset() { + return 65; + } +} diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/containers/ItemTerminalContainer.java b/src/main/java/de/ellpeck/prettypipes/terminal/containers/ItemTerminalContainer.java index de37ba7..b74cf29 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/containers/ItemTerminalContainer.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/containers/ItemTerminalContainer.java @@ -31,16 +31,21 @@ public class ItemTerminalContainer extends Container { super(type, id); this.tile = Utility.getTileEntity(ItemTerminalTileEntity.class, player.world, pos); + int off = this.getSlotXOffset(); for (int i = 0; i < 6; i++) - this.addSlot(new SlotItemHandler(this.tile.items, i, 8 + i % 3 * 18, 102 + i / 3 * 18)); + this.addSlot(new SlotItemHandler(this.tile.items, i, 8 + off + i % 3 * 18, 102 + i / 3 * 18)); for (int i = 0; i < 6; i++) - this.addSlot(new SlotItemHandler(this.tile.items, i + 6, 116 + i % 3 * 18, 102 + i / 3 * 18)); + this.addSlot(new SlotItemHandler(this.tile.items, i + 6, 116 + off + i % 3 * 18, 102 + i / 3 * 18)); for (int l = 0; l < 3; ++l) for (int j1 = 0; j1 < 9; ++j1) - this.addSlot(new Slot(player.inventory, j1 + l * 9 + 9, 8 + j1 * 18, 154 + l * 18)); + this.addSlot(new Slot(player.inventory, j1 + l * 9 + 9, 8 + off + j1 * 18, 154 + l * 18)); for (int i1 = 0; i1 < 9; ++i1) - this.addSlot(new Slot(player.inventory, i1, 8 + i1 * 18, 212)); + this.addSlot(new Slot(player.inventory, i1, 8 + off + i1 * 18, 212)); + } + + protected int getSlotXOffset() { + return 0; } @Override diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/containers/ItemTerminalGui.java b/src/main/java/de/ellpeck/prettypipes/terminal/containers/ItemTerminalGui.java index 0350047..eb120f9 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/containers/ItemTerminalGui.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/containers/ItemTerminalGui.java @@ -47,7 +47,7 @@ public class ItemTerminalGui extends ContainerScreen { @Override protected void init() { super.init(); - this.plusButton = this.addButton(new Button(this.guiLeft + this.xSize / 2 - 7 + 12, this.guiTop + 103, 12, 12, "+", button -> { + this.plusButton = this.addButton(new Button(this.guiLeft + this.getXOffset() + 95 - 7 + 12, this.guiTop + 103, 12, 12, "+", button -> { int modifier = requestModifier(); if (modifier > 1 && this.requestAmount == 1) { this.requestAmount = modifier; @@ -57,13 +57,13 @@ public class ItemTerminalGui extends ContainerScreen { if (this.requestAmount > 384) this.requestAmount = 384; })); - this.minusButton = this.addButton(new Button(this.guiLeft + this.xSize / 2 - 7 - 24, this.guiTop + 103, 12, 12, "-", button -> { + this.minusButton = this.addButton(new Button(this.guiLeft + this.getXOffset() + 95 - 7 - 24, this.guiTop + 103, 12, 12, "-", button -> { this.requestAmount -= requestModifier(); if (this.requestAmount < 1) this.requestAmount = 1; })); this.minusButton.active = false; - this.requestButton = this.addButton(new Button(this.guiLeft + this.xSize / 2 - 7 - 25, this.guiTop + 115, 50, 20, I18n.format("info." + PrettyPipes.ID + ".request"), button -> { + this.requestButton = this.addButton(new Button(this.guiLeft + this.getXOffset() + 95 - 7 - 25, this.guiTop + 115, 50, 20, I18n.format("info." + PrettyPipes.ID + ".request"), button -> { Optional widget = this.streamWidgets().filter(w -> w.selected).findFirst(); if (!widget.isPresent()) return; @@ -91,13 +91,17 @@ public class ItemTerminalGui extends ContainerScreen { })); for (int y = 0; y < 4; y++) { for (int x = 0; x < 9; x++) - this.addButton(new ItemTerminalWidget(this.guiLeft + 8 + x * 18, this.guiTop + 18 + y * 18, x, y, this)); + this.addButton(new ItemTerminalWidget(this.guiLeft + this.getXOffset() + 8 + x * 18, this.guiTop + 18 + y * 18, x, y, this)); } - this.search = this.addButton(new TextFieldWidget(this.font, this.guiLeft + 97, this.guiTop + 6, 86, 8, "")); + this.search = this.addButton(new TextFieldWidget(this.font, this.guiLeft + this.getXOffset() + 97, this.guiTop + 6, 86, 8, "")); this.search.setEnableBackgroundDrawing(false); this.lastSearchText = ""; } + protected int getXOffset() { + return 0; + } + @Override public void tick() { super.tick(); @@ -194,26 +198,30 @@ public class ItemTerminalGui extends ContainerScreen { @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.font.drawString(this.playerInventory.getDisplayName().getFormattedText(), 8, this.ySize - 96 + 2, 4210752); + this.font.drawString(this.playerInventory.getDisplayName().getFormattedText(), 8 + this.getXOffset(), this.ySize - 96 + 2, 4210752); this.font.drawString(this.title.getFormattedText(), 8, 6, 4210752); String amount = String.valueOf(this.requestAmount); - this.font.drawString(amount, (this.xSize - this.font.getStringWidth(amount)) / 2F - 7, 106, 4210752); + this.font.drawString(amount, (176 + 15 - this.font.getStringWidth(amount)) / 2F - 7 + this.getXOffset(), 106, 4210752); } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { - this.getMinecraft().getTextureManager().bindTexture(TEXTURE); + this.getMinecraft().getTextureManager().bindTexture(this.getTexture()); this.blit(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize); if (this.sortedItems != null && this.sortedItems.size() >= 9 * 4) { float percentage = this.scrollOffset / (float) (this.sortedItems.size() / 9 - 3); - this.blit(this.guiLeft + 172, this.guiTop + 18 + (int) (percentage * (70 - 15)), 244, 0, 12, 15); + this.blit(this.guiLeft + this.getXOffset() + 172, this.guiTop + 18 + (int) (percentage * (70 - 15)), 232, 241, 12, 15); } else { - this.blit(this.guiLeft + 172, this.guiTop + 18, 244, 15, 12, 15); + this.blit(this.guiLeft + this.getXOffset() + 172, this.guiTop + 18, 244, 241, 12, 15); } } + protected ResourceLocation getTexture() { + return TEXTURE; + } + @Override public boolean mouseScrolled(double x, double y, double scroll) { if (this.sortedItems != null && this.sortedItems.size() >= 9 * 4) { diff --git a/src/main/resources/assets/prettypipes/textures/gui/crafting_terminal.png b/src/main/resources/assets/prettypipes/textures/gui/crafting_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5a5c324413bc69dfb85afab512a4d623a3bb33 GIT binary patch literal 1910 zcmbVNdoI5?T8d(wvAfL7 zF*d8xW3bl5bi7hY39Y;vqt{R#GwEoIVP?l}b+#>kw10i?z2AGj-_QMi@8|P9jVE z)X#X>8_;_yKWXid`$md$DF(p{-IVBGgf{oz-F&^NytX5cz%1nXY-!ZXFhLPzN6hf) zB1v#YXq;kK`h}?7GU_DF+&lI3?}8Xl8TGa>|0I~3lR?Z9c+u0ATy$x^U(Z;gjIUhk zomvzv4S9Y{H`_I8@NHMHeD7;Q?cc#MCgp|Ac${C+Hp7y!j2^U7Y%JZNQCDQoH|Md&4P z$Bm!n)LabAdVxk~qQLA5lgzU2?zL@Uudyx757p1`yC+1W6qi|XM-kg1a-g?%aKR1j zFlpZS*z^FQco$Wu)H%b<5whEGxdW_G2f71Q=tD(H_QEAB2FC^N%bt6lg`zV!VGm(( zQw$6iT=Z7di*KhP^I&oD&6#%rKpUyWO?oye!;pl33ccu~KXRPI`^@r11^y)^Ytv>zjDN)0wiSjMcUs)p9@<{}ZFO&5u-L#h zrobxV5M(g@+&%^Du2r7GjpW%OH@r46T%^YzW%#H0DA}=LlHXvsKD2Gbo;);P_-!t&lXNM&CT4A-5cYo@ouA!B8vK$*B;Hm#oea z*inTYqWb=W3Nf-#r#kxh8|ynk1|j9+kEnJ5h!sAg-z95G!miu9v*)^QYE#~%DdXV6l5*?k@SRedy5C4snb47HxT)#_9iSk!Hrbflv83CHiA8W)h2 zX1_7n{8e#NKH?&sWK8U`90NKpn#yQj?U>!T&S1M{jsR7jKugy2O`F%~WTU;>a_wN7 zpWNc)lKAC_;j^Uqgke&Owiu!vbORXQu8X&N6j4>SmtIo1^NJ~h#eU^y%BO1SxZ3s- zp3j-;gy}y9VnznUv=Du(@w ze4mf3V&w-%n5rVP1(_#O6x}=tZjM-hFf9pi5%={PVBO2rrelUCc2)t z;e-_5ww)8g^_trC{8BljQANQS8ps@iSClr%b%r=9-xs zG=wdWr`EQ&LlJk*+3L+8?l77BliW7N#GqT6eNo%~*av7Slf>M*zL@H(7P06eHK>;9Yw$ire7c~{TgwEXjW)jEBlQZ7EY~Ld6#{8qz`HH zD-+vX@IR=kLjH*N)tv>=Ic(gSsUmDK;Yc)MYSsJpiHMEXN7bu)9(s)(1{#G<2_7osvIC_7%ATUrgNOWfWl z6pqtYjkhPMYLZE(x$_xiD1doBr>+`ZfZo4`TXEnTS2od1u3mG(SbOi}pJ-qC^ccy! zG+!)i2%eLxgYaUpoY64En+R6cWj9%6-#(xJG%zhxcZH7xqL|L$;J|uV3#8Y==^ZS4y-rwSTGH1>CZ?peuR;VhI{oioEx~4sQ_lEAg^*1y0 zJ=2G;udhFq<301{>({NTR+-KAovPjVtKn(vfZY~=X5`RQ$O?hr00(x{y#t8FOHGt zaKTk|iQ^l$-Ck??EXL;f2d$TPD(fU)SeP>^LQTeLC9*_WiTnWr9`ne^)IQ5CnW3SV zO?*SYKEK_3ni1{+S-lR=Oze-l&HuTB9hZ-gjYoJ@ zy75eA9pC4Tf+yxYdwzq%L>?^A*X!`PkRNNnU^fOBVrEP;FaMEwmaII%^6dGIf*E!Y z0qMqPkL57K7pE~mi5wQAAP7My#L+3KiTG# z@SB;k)@9zV2RLi@?%v0;s(m z;~9H*Pp;G)Hv7brC`rzC@r*}Vd`L>?9 zKl$Q(<{!6v9o6fl|CP$ftbe}g$9YB>yGEOt5B7=u_dKAb{!h7Z&AihW8EjtfX10Gl z`NqdbF%#eO{W-J$%au#lZ+^_W|L8kI!&43tLJOpQP1J8I>$tbpzxFYhow1oV@XV0FP zznpD}E8do6_gRXcfBF00E6YE3FEWJG+A~~7M%(TQ9`E!fL~!IVE2Rd{>z-!j zE6l|9IJy43^4X&+UdFe)HD_0snf1v%KH=xAmGTE>{Mxtwht<6tv!}Nk_OoxkYT_F& zCf7K9`t*X7%d_Fw<}srlTTd3)QN@72X; zByFC5sVY11^T)UM>OWtl9(ZZ15xiA-H+gBSuvl%!GN(LA^kn$mfY&; zx~tC^wp*DlowD!!@1Rrr<@xj66^gTFd@gfe5N*z4S*!9pZ@c!>=Rf7o_BlKYu~#p2 zpYLACKY1ggwgS+QG8Uudzbt!>gXMtajX``aGTawR7K_UH<*z1~9^J%FMp}X}-Oj zSi{#U+aK1)V*EC!T9?0B*44oMtBk*v)8L6p;Ya`XlM3vAJw2c+{(rr6!<5cCu7Z~* zAJspae{ZY!H|4&YyRCmZAG!b6e&!Rk2de6w-St(@`&RoGByW)XAiv+|TW~|M_zs}p z_LviORtEBu|H&P2H)o6eQ~KkLg+<(Hqo3~?_t-Yh@%a!j`M+9%rrsaR!Zp*L<}ghA z_40tXZKtgMI?C$mp1>+(|K?2{L+t5&mb4N-QUO&?xvsyFF3_d*PyERkp_S->Tn!E3=n==2o z0rO446LVfYzaf}m^NtZ_j_et5a%lf}11