From 5da5315a5b1a8986f9c576e200a11fb7d2399267 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 20 Sep 2020 14:47:25 +0200 Subject: [PATCH] Post-merge fixes. Reformat. Optimize Imports. --- .../java/appeng/client/gui/AEBaseScreen.java | 2 +- .../implementations/CraftConfirmScreen.java | 10 ++--- .../implementations/CraftingStatusScreen.java | 4 +- .../implementations/LevelEmitterScreen.java | 6 +-- .../implementations/MEMonitorableScreen.java | 9 +++-- .../implementations/NumberEntryWidget.java | 38 +++++++++--------- .../gui/implementations/PriorityScreen.java | 8 ++-- .../gui/widgets/ConfirmableTextField.java | 8 ++-- .../appeng/client/gui/widgets/IconButton.java | 8 ++-- .../client/gui/widgets/ValidationIcon.java | 15 ++++--- .../appeng/container/AEBaseContainer.java | 2 +- .../implementations/ContainerHelper.java | 33 ++++++++------- .../implementations/CraftingCPUContainer.java | 4 +- .../implementations/CraftingCPUCycler.java | 4 +- .../implementations/InscriberContainer.java | 1 - .../LevelEmitterContainer.java | 9 ++--- .../implementations/PriorityContainer.java | 2 - .../java/appeng/core/sync/BasePacket.java | 2 +- .../client/gui/FluidLevelEmitterScreen.java | 6 +-- .../container/FluidConfigurableContainer.java | 1 - .../container/FluidInterfaceContainer.java | 1 - .../container/FluidLevelEmitterContainer.java | 3 -- .../container/FluidStorageBusContainer.java | 1 - .../fluids/helper/DualityFluidInterface.java | 11 ++--- .../appeng/fluids/util/AEFluidInventory.java | 12 +++--- .../textures/guis/states.png | Bin 13141 -> 13175 bytes 26 files changed, 94 insertions(+), 106 deletions(-) diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index 5d6630516..d867f628f 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -642,7 +642,7 @@ public abstract class AEBaseScreen extends HandledScr this.itemRenderer.zOffset = 0.0F; } - protected ITextComponent getGuiDisplayName(final Text in) { + protected Text getGuiDisplayName(final Text in) { return title.getString().isEmpty() ? in : title; } diff --git a/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java b/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java index b965c91bc..6aec75b56 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java @@ -136,16 +136,16 @@ public class CraftConfirmScreen extends AEBaseScreen { this.selectCPU.setMessage(getNextCpuButtonLabel()); } - private ITextComponent getNextCpuButtonLabel() { - if (this.container.hasNoCPU()) { + private Text getNextCpuButtonLabel() { + if (this.handler.hasNoCPU()) { return GuiText.NoCraftingCPUs.text(); } - ITextComponent cpuName; - if (this.container.cpuName == null) { + Text cpuName; + if (this.handler.cpuName == null) { cpuName = GuiText.Automatic.text(); } else { - cpuName = this.container.cpuName; + cpuName = this.handler.cpuName; } return GuiText.CraftingCPU.withSuffix(": ").append(cpuName); diff --git a/src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java b/src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java index 028b2e113..76a44b411 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java @@ -63,11 +63,11 @@ public class CraftingStatusScreen extends CraftingCPUScreen this.level = new NumberEntryWidget(this, 20, 17, 138, 62, NumberEntryType.LEVEL_ITEM_COUNT); this.level.setTextFieldBounds(25, 44, 75); this.level.addButtons(children::add, this::addButton); - this.level.setValue(container.getReportingValue()); + this.level.setValue(handler.getReportingValue()); this.level.setOnChange(this::saveReportingValue); - this.level.setOnConfirm(this::closeScreen); + this.level.setOnConfirm(this::onClose); this.changeFocus(true); } private void saveReportingValue() { - this.level.getLongValue().ifPresent(container::setReportingValue); + this.level.getLongValue().ifPresent(handler::setReportingValue); } @Override diff --git a/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java b/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java index 60b8e0ff7..6b38d230f 100644 --- a/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java +++ b/src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java @@ -26,6 +26,7 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; +import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import me.shedaniel.math.Rectangle; @@ -297,13 +298,13 @@ public class MEMonitorableScreen extends AEBas this.currentMouseY = mouseY; // Show the number of active crafting jobs - if (this.craftingStatusBtn != null && container.activeCraftingJobs != -1) { + if (this.craftingStatusBtn != null && handler.activeCraftingJobs != -1) { // The stack size renderer expects a 16x16 slot, while the button is normally // bigger int x = this.craftingStatusBtn.x + (this.craftingStatusBtn.getWidth() - 16) / 2; - int y = this.craftingStatusBtn.y + (this.craftingStatusBtn.getHeightRealms() - 16) / 2; - StackSizeRenderer.renderSizeLabel(font, x - this.guiLeft, y - this.guiTop, - String.valueOf(container.activeCraftingJobs)); + int y = this.craftingStatusBtn.y + (this.craftingStatusBtn.getHeight() - 16) / 2; + StackSizeRenderer.renderSizeLabel(textRenderer, x - this.x, y - this.y, + new LiteralText(String.valueOf(handler.activeCraftingJobs))); } } diff --git a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java index 53fa3e271..35ddcabac 100644 --- a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java +++ b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java @@ -6,14 +6,14 @@ import java.util.OptionalInt; import java.util.OptionalLong; import java.util.function.Consumer; -import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.LiteralText; import net.minecraft.text.Text; -import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.text.TranslatableText; import appeng.client.gui.AEBaseScreen; import appeng.client.gui.NumberEntryType; @@ -27,8 +27,7 @@ import appeng.core.AEConfig; */ public class NumberEntryWidget extends DrawableHelper { - private static final ITextComponent INVALID_NUMBER = new TranslationTextComponent( - "gui.appliedenergistics2.validation.InvalidNumber"); + private static final Text INVALID_NUMBER = new TranslatableText("gui.appliedenergistics2.validation.InvalidNumber"); private static final String NUMBER_LESS_THAN_MIN_VALUE = "gui.appliedenergistics2.validation.NumberLessThanMinValue"; private static final Text PLUS = Text.of("+"); private static final Text MINUS = Text.of("-"); @@ -60,18 +59,17 @@ public class NumberEntryWidget extends DrawableHelper { this.y = y; this.type = type; - FontRenderer font = parent.getMinecraft().fontRenderer; - int inputX = parent.getGuiLeft() + x; - int inputY = parent.getGuiTop() + y; - this.textField = new ConfirmableTextField(font, inputX, inputY, width, font.FONT_HEIGHT, - StringTextComponent.EMPTY); - this.textField.setEnableBackgroundDrawing(false); - this.textField.setMaxStringLength(16); - this.textField.setTextColor(TEXT_COLOR_NORMAL); + TextRenderer font = parent.getClient().textRenderer; + int inputX = parent.getX() + x; + int inputY = parent.getY() + y; + this.textField = new ConfirmableTextField(font, inputX, inputY, width, font.fontHeight, LiteralText.EMPTY); + this.textField.setHasBorder(false); + this.textField.setMaxLength(16); + this.textField.setEditableColor(TEXT_COLOR_NORMAL); this.textField.setVisible(true); - this.textField.setFocused2(true); - parent.setFocusedDefault(this.textField); - this.textField.setResponder(text -> { + this.textField.setSelected(true); + parent.setInitialFocus(this.textField); + this.textField.setChangedListener(text -> { validate(); if (onChange != null) { this.onChange.run(); @@ -190,8 +188,8 @@ public class NumberEntryWidget extends DrawableHelper { public void setValue(long value) { this.textField.setText(String.valueOf(Math.max(minValue, value))); - this.textField.setCursorPositionEnd(); - this.textField.setSelectionPos(0); + this.textField.setCursorToEnd(); + this.textField.setSelectionStart(0); validate(); } @@ -204,20 +202,20 @@ public class NumberEntryWidget extends DrawableHelper { } private void validate() { - List validationErrors = new ArrayList<>(); + List validationErrors = new ArrayList<>(); String text = textField.getText().trim(); try { long value = Long.parseLong(text, 10); if (value < minValue) { - validationErrors.add(new TranslationTextComponent(NUMBER_LESS_THAN_MIN_VALUE, minValue)); + validationErrors.add(new TranslatableText(NUMBER_LESS_THAN_MIN_VALUE, minValue)); } } catch (NumberFormatException ignored) { validationErrors.add(INVALID_NUMBER); } boolean valid = validationErrors.isEmpty(); - this.textField.setTextColor(valid ? TEXT_COLOR_NORMAL : TEXT_COLOR_ERROR); + this.textField.setEditableColor(valid ? TEXT_COLOR_NORMAL : TEXT_COLOR_ERROR); if (this.validationIcon != null) { this.validationIcon.setValid(valid); this.validationIcon.setTooltip(validationErrors); diff --git a/src/main/java/appeng/client/gui/implementations/PriorityScreen.java b/src/main/java/appeng/client/gui/implementations/PriorityScreen.java index 40d20530d..9cfc9d26a 100644 --- a/src/main/java/appeng/client/gui/implementations/PriorityScreen.java +++ b/src/main/java/appeng/client/gui/implementations/PriorityScreen.java @@ -40,8 +40,8 @@ public class PriorityScreen extends AEBaseScreen { this.subGui = new AESubScreen(this, container.getPriorityHost()); // This is the effective size of the background image - xSize = 175; - ySize = 128; + backgroundWidth = 175; + backgroundHeight = 128; } @Override @@ -51,7 +51,7 @@ public class PriorityScreen extends AEBaseScreen { this.priority = new NumberEntryWidget(this, 20, 30, 138, 62, NumberEntryType.PRIORITY); this.priority.setTextFieldBounds(62, 57, 50); this.priority.setMinValue(Integer.MIN_VALUE); - this.priority.setValue(this.container.getPriorityValue()); + this.priority.setValue(this.handler.getPriorityValue()); this.priority.addButtons(children::add, this::addButton); this.subGui.addBackButton(this::addButton, 154, 0); @@ -68,7 +68,7 @@ public class PriorityScreen extends AEBaseScreen { private void savePriority() { OptionalInt priority = this.priority.getIntValue(); if (priority.isPresent()) { - container.setPriority(priority.getAsInt()); + handler.setPriority(priority.getAsInt()); } } diff --git a/src/main/java/appeng/client/gui/widgets/ConfirmableTextField.java b/src/main/java/appeng/client/gui/widgets/ConfirmableTextField.java index d8c202bba..d9716fae3 100644 --- a/src/main/java/appeng/client/gui/widgets/ConfirmableTextField.java +++ b/src/main/java/appeng/client/gui/widgets/ConfirmableTextField.java @@ -20,21 +20,21 @@ package appeng.client.gui.widgets; import org.lwjgl.glfw.GLFW; -import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.util.text.ITextComponent; +import net.minecraft.text.Text; public class ConfirmableTextField extends TextFieldWidget { private Runnable onConfirm; - public ConfirmableTextField(FontRenderer fontRenderer, int x, int y, int width, int height, ITextComponent text) { + public ConfirmableTextField(TextRenderer fontRenderer, int x, int y, int width, int height, Text text) { super(fontRenderer, x, y, width, height, text); } @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (canWrite() && (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER)) { + if (isActive() && (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER)) { if (this.onConfirm != null) { this.onConfirm.run(); } diff --git a/src/main/java/appeng/client/gui/widgets/IconButton.java b/src/main/java/appeng/client/gui/widgets/IconButton.java index 01fb550b0..93c3eeefe 100644 --- a/src/main/java/appeng/client/gui/widgets/IconButton.java +++ b/src/main/java/appeng/client/gui/widgets/IconButton.java @@ -21,8 +21,8 @@ package appeng.client.gui.widgets; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.audio.SoundHandler; import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.sound.SoundManager; import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.LiteralText; @@ -48,9 +48,9 @@ public abstract class IconButton extends ButtonWidget implements ITooltip { } @Override - public void playDownSound(SoundHandler soundHandler) { + public void playDownSound(SoundManager soundManager) { if (!disableClickSound) { - super.playDownSound(soundHandler); + super.playDownSound(soundManager); } } @@ -108,7 +108,7 @@ public abstract class IconButton extends ButtonWidget implements ITooltip { RenderSystem.color4f(1.0f, 1.0f, 1.0f, 1.0f); if (isHovered()) { - renderToolTip(matrixStack, mouseX, mouseY); + renderToolTip(matrices, mouseX, mouseY); } } } diff --git a/src/main/java/appeng/client/gui/widgets/ValidationIcon.java b/src/main/java/appeng/client/gui/widgets/ValidationIcon.java index 4078ac964..903270b7e 100644 --- a/src/main/java/appeng/client/gui/widgets/ValidationIcon.java +++ b/src/main/java/appeng/client/gui/widgets/ValidationIcon.java @@ -3,18 +3,17 @@ package appeng.client.gui.widgets; import java.util.ArrayList; import java.util.List; -import com.mojang.blaze3d.matrix.MatrixStack; - -import net.minecraft.client.Minecraft; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.util.text.ITextComponent; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; /** * Displays a small icon that shows validation errors for some input control. */ public class ValidationIcon extends IconButton { - private final List tooltip = new ArrayList<>(); + private final List tooltip = new ArrayList<>(); private boolean valid; @@ -33,7 +32,7 @@ public class ValidationIcon extends IconButton { } } - public void setTooltip(List lines) { + public void setTooltip(List lines) { this.tooltip.clear(); this.tooltip.addAll(lines); } @@ -54,12 +53,12 @@ public class ValidationIcon extends IconButton { return; } - Minecraft client = Minecraft.getInstance(); + MinecraftClient client = MinecraftClient.getInstance(); Screen screen = client.currentScreen; if (screen == null) { return; } - screen.func_243308_b(matrices, this.tooltip, x, y); + screen.renderTooltip(matrices, this.tooltip, x, y); } } diff --git a/src/main/java/appeng/container/AEBaseContainer.java b/src/main/java/appeng/container/AEBaseContainer.java index 64a924e22..499f948b0 100644 --- a/src/main/java/appeng/container/AEBaseContainer.java +++ b/src/main/java/appeng/container/AEBaseContainer.java @@ -1001,7 +1001,7 @@ public abstract class AEBaseContainer extends ScreenHandler { * Returns whether this container instance lives on the client. */ protected boolean isClient() { - return invPlayer.player.getEntityWorld().isRemote(); + return invPlayer.player.getEntityWorld().isClient(); } /** diff --git a/src/main/java/appeng/container/implementations/ContainerHelper.java b/src/main/java/appeng/container/implementations/ContainerHelper.java index adf7877be..4d679948a 100644 --- a/src/main/java/appeng/container/implementations/ContainerHelper.java +++ b/src/main/java/appeng/container/implementations/ContainerHelper.java @@ -1,11 +1,11 @@ package appeng.container.implementations; +import java.util.function.Function; + import javax.annotation.Nullable; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.block.entity.BlockEntity; -import java.util.function.Function; - import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; @@ -14,12 +14,7 @@ import net.minecraft.screen.ScreenHandler; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraftforge.fml.network.NetworkHooks; import appeng.api.config.SecurityPermissions; import appeng.api.features.IWirelessTermHandler; @@ -49,7 +44,7 @@ public final class ContainerHelper { private final SecurityPermissions requiredPermission; - private Function containerTitleStrategy = this::getDefaultContainerTitle; + private Function containerTitleStrategy = this::getDefaultContainerTitle; public ContainerHelper(ContainerFactory factory, Class interfaceClass) { this(factory, interfaceClass, null); @@ -64,11 +59,11 @@ public final class ContainerHelper { /** * Specifies a custom strategy for obtaining a custom container name. - * - * The stratgy should return {@link StringTextComponent#EMPTY} if there's no - * custom name. + *

+ * The stratgy should return {@link LiteralText#EMPTY} if there's no custom + * name. */ - public ContainerHelper withContainerTitle(Function containerTitleStrategy) { + public ContainerHelper withContainerTitle(Function containerTitleStrategy) { this.containerTitleStrategy = containerTitleStrategy; return this; } @@ -86,7 +81,7 @@ public final class ContainerHelper { * Same as {@link #open}, but allows or additional data to be read from the * packet, and passed onto the container. */ - public C fromNetwork(int windowId, PlayerInventory inv, PacketBuffer packetBuf, + public C fromNetwork(int windowId, PlayerInventory inv, PacketByteBuf packetBuf, InitialDataDeserializer initialDataDeserializer) { I host = getHostFromLocator(inv.player, ContainerLocator.read(packetBuf)); if (host != null) { @@ -121,7 +116,7 @@ public final class ContainerHelper { Text title = containerTitleStrategy.apply(accessInterface); - player.openHandledScreen(new HandlerFactory(locator, title, accessInterface)); + player.openHandledScreen(new HandlerFactory(locator, title, accessInterface, initialDataSerializer)); return true; } @@ -134,10 +129,14 @@ public final class ContainerHelper { private final Text title; - public HandlerFactory(ContainerLocator locator, Text title, I accessInterface) { + private final InitialDataSerializer initialDataSerializer; + + public HandlerFactory(ContainerLocator locator, Text title, I accessInterface, + InitialDataSerializer initialDataSerializer) { this.locator = locator; this.title = title; this.accessInterface = accessInterface; + this.initialDataSerializer = initialDataSerializer; } @Override @@ -245,7 +244,7 @@ public final class ContainerHelper { */ @FunctionalInterface public interface InitialDataSerializer { - void serializeInitialData(I host, PacketBuffer buffer); + void serializeInitialData(I host, PacketByteBuf buffer); } /** @@ -254,7 +253,7 @@ public final class ContainerHelper { */ @FunctionalInterface public interface InitialDataDeserializer { - void deserializeInitialData(I host, C container, PacketBuffer buffer); + void deserializeInitialData(I host, C container, PacketByteBuf buffer); } private boolean checkPermission(PlayerEntity player, Object accessInterface) { diff --git a/src/main/java/appeng/container/implementations/CraftingCPUContainer.java b/src/main/java/appeng/container/implementations/CraftingCPUContainer.java index 501fe92f3..a7e848ee7 100644 --- a/src/main/java/appeng/container/implementations/CraftingCPUContainer.java +++ b/src/main/java/appeng/container/implementations/CraftingCPUContainer.java @@ -26,7 +26,7 @@ import net.minecraft.network.PacketByteBuf; import net.minecraft.screen.ScreenHandlerListener; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; +import net.minecraft.text.LiteralText; import appeng.api.config.SecurityPermissions; import appeng.api.networking.IGrid; @@ -61,7 +61,7 @@ public class CraftingCPUContainer extends AEBaseContainer implements IMEMonitorH if (cluster != null && cluster.getName() != null) { return cluster.getName(); } - return StringTextComponent.EMPTY; + return LiteralText.EMPTY; }); private final IItemList list = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) diff --git a/src/main/java/appeng/container/implementations/CraftingCPUCycler.java b/src/main/java/appeng/container/implementations/CraftingCPUCycler.java index d0ada4826..fac9f800b 100644 --- a/src/main/java/appeng/container/implementations/CraftingCPUCycler.java +++ b/src/main/java/appeng/container/implementations/CraftingCPUCycler.java @@ -7,7 +7,7 @@ import java.util.function.Predicate; import com.google.common.collect.ImmutableSet; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.text.LiteralText; import appeng.api.networking.IGrid; import appeng.api.networking.crafting.ICraftingCPU; @@ -75,7 +75,7 @@ class CraftingCPUCycler { for (int i = 0; i < this.cpus.size(); i++) { CraftingCPURecord cpu = cpus.get(i); if (cpu.getName() == null) { - cpu.setName(new StringTextComponent("#" + (i + 1))); + cpu.setName(new LiteralText("#" + (i + 1))); } } diff --git a/src/main/java/appeng/container/implementations/InscriberContainer.java b/src/main/java/appeng/container/implementations/InscriberContainer.java index fd7996b90..c4474901f 100644 --- a/src/main/java/appeng/container/implementations/InscriberContainer.java +++ b/src/main/java/appeng/container/implementations/InscriberContainer.java @@ -36,7 +36,6 @@ import appeng.container.slot.RestrictedInputSlot; import appeng.core.Api; import appeng.tile.misc.InscriberBlockEntity; import appeng.tile.misc.InscriberRecipes; -import appeng.tile.misc.InscriberTileEntity; /** * @author AlgorithmX2 diff --git a/src/main/java/appeng/container/implementations/LevelEmitterContainer.java b/src/main/java/appeng/container/implementations/LevelEmitterContainer.java index 8b2222ec8..ae09b2919 100644 --- a/src/main/java/appeng/container/implementations/LevelEmitterContainer.java +++ b/src/main/java/appeng/container/implementations/LevelEmitterContainer.java @@ -18,13 +18,12 @@ package appeng.container.implementations; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.ContainerType; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.items.IItemHandler; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.screen.ScreenHandlerType; + +import alexiil.mc.lib.attributes.item.FixedItemInv; import appeng.api.config.FuzzyMode; import appeng.api.config.LevelType; diff --git a/src/main/java/appeng/container/implementations/PriorityContainer.java b/src/main/java/appeng/container/implementations/PriorityContainer.java index 7d88e7062..293b4f201 100644 --- a/src/main/java/appeng/container/implementations/PriorityContainer.java +++ b/src/main/java/appeng/container/implementations/PriorityContainer.java @@ -18,8 +18,6 @@ package appeng.container.implementations; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; diff --git a/src/main/java/appeng/core/sync/BasePacket.java b/src/main/java/appeng/core/sync/BasePacket.java index 38202f635..0472e3292 100644 --- a/src/main/java/appeng/core/sync/BasePacket.java +++ b/src/main/java/appeng/core/sync/BasePacket.java @@ -34,7 +34,7 @@ import appeng.core.sync.network.INetworkInfo; public abstract class BasePacket { /** - * Sadly {@link PacketBuffer#readString()} gets inlined by Proguard which means + * Sadly {@link PacketByteBuf#readString()} gets inlined by Proguard which means * it's not available on the Server. This field has the default string length * that is used for writeString, which then also should be used for readString * when it has no special length requirements. diff --git a/src/main/java/appeng/fluids/client/gui/FluidLevelEmitterScreen.java b/src/main/java/appeng/fluids/client/gui/FluidLevelEmitterScreen.java index aaecac4ca..0914b64b3 100644 --- a/src/main/java/appeng/fluids/client/gui/FluidLevelEmitterScreen.java +++ b/src/main/java/appeng/fluids/client/gui/FluidLevelEmitterScreen.java @@ -29,9 +29,9 @@ public class FluidLevelEmitterScreen extends UpgradeableScreen TYPE; diff --git a/src/main/java/appeng/fluids/container/FluidStorageBusContainer.java b/src/main/java/appeng/fluids/container/FluidStorageBusContainer.java index 4830e8833..fc684aeaa 100644 --- a/src/main/java/appeng/fluids/container/FluidStorageBusContainer.java +++ b/src/main/java/appeng/fluids/container/FluidStorageBusContainer.java @@ -44,7 +44,6 @@ import appeng.container.slot.RestrictedInputSlot; import appeng.core.Api; import appeng.fluids.parts.FluidStorageBusPart; import appeng.fluids.util.IAEFluidTank; -import appeng.util.Platform; import appeng.util.iterators.NullIterator; /** diff --git a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java index 67176100a..23f7766c1 100644 --- a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java +++ b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java @@ -18,13 +18,14 @@ package appeng.fluids.helper; +import java.math.RoundingMode; import java.util.Optional; import net.minecraft.block.entity.BlockEntity; import net.minecraft.nbt.CompoundTag; import alexiil.mc.lib.attributes.AttributeList; -import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; +import alexiil.mc.lib.attributes.fluid.amount.FluidAmount; import alexiil.mc.lib.attributes.item.FixedItemInv; import appeng.api.config.Actionable; @@ -319,8 +320,8 @@ public class DualityFluidInterface toStore.setStackSize(-toStore.getStackSize()); // make sure strange things didn't happen... - final FluidVolume canExtract = this.tanks.drain(slot, toStore.getFluidStack(), false); - if (canExtract.isEmpty() || canExtract.getAmount() != toStore.getStackSize()) { + final FluidAmount canExtract = this.tanks.drain(slot, toStore.getFluidStack(), false); + if (canExtract.isZero() || canExtract.asLong(1000, RoundingMode.DOWN) != toStore.getStackSize()) { changed = true; } else { IAEFluidStack notStored = Platform.poweredInsert(src, dest, toStore, this.interfaceRequestSource); @@ -329,8 +330,8 @@ public class DualityFluidInterface if (toStore.getStackSize() > 0) { // extract items! changed = true; - final FluidVolume removed = this.tanks.drain(slot, toStore.getFluidStack(), true); - if (removed.isEmpty() || toStore.getStackSize() != removed.getAmount()) { + final FluidAmount removed = this.tanks.drain(slot, toStore.getFluidStack(), true); + if (removed.isZero() || toStore.getStackSize() != removed.asLong(1000, RoundingMode.DOWN)) { throw new IllegalStateException("bad attempt at managing tanks. ( drain )"); } } diff --git a/src/main/java/appeng/fluids/util/AEFluidInventory.java b/src/main/java/appeng/fluids/util/AEFluidInventory.java index 687ea1226..de09bd675 100644 --- a/src/main/java/appeng/fluids/util/AEFluidInventory.java +++ b/src/main/java/appeng/fluids/util/AEFluidInventory.java @@ -151,19 +151,19 @@ public class AEFluidInventory implements IAEFluidTank { return amountToStore; } - public FluidVolume drain(final int slot, final FluidVolume resource, final boolean doDrain) { + public FluidAmount drain(final int slot, final FluidVolume resource, final boolean doDrain) { final IAEFluidStack fluid = this.fluids[slot]; if (resource.isEmpty() || fluid == EMPTY_AE_FLUIDSTACK || !fluid.getFluidStack().equals(resource)) { - return FluidStack.EMPTY; + return FluidAmount.ZERO; } int toDrain = (int) resource.getAmount_F().asLong(1000, RoundingMode.DOWN); return this.drain(slot, toDrain, doDrain); } - public FluidVolume drain(final int slot, final int maxDrain, boolean doDrain) { + public FluidAmount drain(final int slot, final int maxDrain, boolean doDrain) { final IAEFluidStack fluid = this.fluids[slot]; if (fluid == EMPTY_AE_FLUIDSTACK || maxDrain <= 0) { - return FluidStack.EMPTY; + return FluidAmount.ZERO; } int drained = maxDrain; @@ -171,7 +171,7 @@ public class AEFluidInventory implements IAEFluidTank { drained = (int) fluid.getStackSize(); } - FluidVolume stack = fluid.getFluidStack().withAmount(FluidAmount.of(drained, 1000)); + FluidAmount amount = FluidAmount.of(drained, 1000); if (doDrain) { fluid.setStackSize(fluid.getStackSize() - drained); if (fluid.getStackSize() <= 0) { @@ -179,7 +179,7 @@ public class AEFluidInventory implements IAEFluidTank { } this.onContentChanged(slot); } - return stack; + return amount; } public void writeToNBT(final CompoundTag data, final String name) { diff --git a/src/main/resources/assets/appliedenergistics2/textures/guis/states.png b/src/main/resources/assets/appliedenergistics2/textures/guis/states.png index 7d2f809a950c6831c848c773fd3d251710fd4391..053edcb878753697b20961232585f2f0aebbc824 100644 GIT binary patch literal 13175 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 literal 13141 zcmeAS@N?(olHy`uVBq!ia0y~yU}OMc4mJh`hM1xiX$%YuoCO|{#S9F5%Rrd1{m#mK z1_lKNPZ!6Kid%1Mt7}A_?)~@qUE72S3{ESh0vekqRk$!_I(j=Pw=S3(_C)RAHhBTp z3-d*l*A`rvT(E{+OQc(lD^8$po{~w-?Mq1tOD_s&E3k>0bh_v<2?aWFcQ!)x%3MIw3gOz{U{9q(T=o;${rqx0Z3qu!ANFH0kL z_5~cbb}cP6UB7PKvxm3l3rJ3wEYDE(=7!?VMl(?cYjd0D+B>8Z_B<+*S>I4E8-K9( z+;eZ%^zRHgJO{2dZ~U5&6S7($hVfnT>iF{_$9{+$+i`DWtZ2h)*Z)N;9`|}YpVD*n z>eW5z=jXk+xmo>;%<)(MT23g}`}y$|6&01ZI)pRyO(6}XY!BFOL`CiqXu8N?m3>_P0o(MM`y(@fq6`{ZXwS4;-tN-eDT^WDFMFxG=A0qo-oOpbb&7kc0 z(_M^~Ms-ETyT0xY`uroW;pdHmretlhC@Y32m zhO<0t(YvjGAD#^SarZ!W$ac$K_J+E@zcvOh_glDeW1tYDlkM2Tsim7hgD|#wjSzFZRq^Gna3c|a7E;={!h2-7MOm|7j68$?|lawdyW)9{%aE4d9 zuOjfF`Xkq)3se;+b~bphf4Q(SSp7$h-R<8Nz2#h6LmZa~JYjnj&hq6%z6OI|euVnR zp0jC6_g3&Wyk?Tn=TrMN>q}uk7sGz}IpXZwc{6fyT)e%xml+&0W?1)4?^|H=4YhA~ zFa2U^+0SuK`+#NqLh1ExPmUcs)==WmeZuRLx~l5K`~TkFZ;DH6Rgv*m`Q%9r#SV{OxiQq6tvL}q>Hn3L!3+vlnK=Y6c(JxbbfoT{uw3xb9)=~a z6ZnD+C)O&QZ%HSV& z!5fx}y;Y|j9A|_^+i%bf^LsS)_@w85+;-OPulqZrMt)~S#@qaF5lm^X6gVcTGbKg# z{%K<}*zy0WMa7To+u~QBef-LBzw+k0{g;l*pMU>-`ky^=55%uHr~m(!>u$dNa)ss3 zDJoZ^@?Bzfw}i@dpOBxcq~Px5#nr|yFLy;HBAnsWYCr2uA97{ie`u^3;i494z3k4mq~Kz@DmJBwr{xcPDObA+{Q1jIGuR=oc!ii-qMd- zZN6YrZbMkQLQq*#F{8p3>7;Ge28|p(9QKFw7*>Bi{_!REwn>*eQYNtWzpLoIwEymL z=7_oWeW&j)maVL;yz{C~R8%zNkkBoj!|nY13j1I1s9f7VlR?8%UR%i^_m+v=slR9b z)rEaL#$D`D@o2)2)YQ}xNQILWue^_cegJGnfrrz|G&LY zE1bSejQ@8-UscsrX`jp?-V>LZrpFp(KYaMHx%B&anF`+RN-D+A&OFS_%-r#)OIt_y zl-HY^o6~vYnM_ShcYUn-J@e@A`7)F1nuYH@j%d9*ZC~~Ab9WgS>g!%5M}KU&(L75- zWyaZuXQ$m+pQD$~@FUm!JKwEsS+Ch|{JqGTHti2XKxAa6_jJ97yI!xmtW&!+LG{`h z!{xrSk7Z|NZK(ZSwoF|A{`;fi@lX6*9&DRkt(^RB^@<21;SUkr?{Dmsz877jdQ$EmrUPZ%+zi0D`BhNlOYrzm$)HyqR z!u=lR0O5JBC;30_*57v^eSU4*mMtdUrGjP2S6{K7nG}_6zu8}~sV}_j#y8%Nmm}jJ zOx9gq==`lR$z5hb{Q58Ax1TsY;40v`GB4APAiHl zD)$I5Zsv1%d#8QXc@M)h?*z-AXOFF#dai2gzp^?ii(gH=&$H&*ujt0RkGFCu&FNqWRI*d} z^{=~-;cHQS@LPr_OE-#sYFCOo-zssC?N#&M=8@3rSN1hJTCGhY40G~=JJ z`PAh1Ee9Q+%&&XUvhqjXOYgwwnc^;Wy6Fxa$L|08w!I6^+|Pi5acoZP%KOtxX>57qv-Ixd4R^+gOaQ|26a*WV-0 zy2_R>`*fSp+uAxuiKV?_ug}`(UFq&``+VG~Gr#Q$(8>d)ivTsN^DU@@2n{LM68yk~vKRKWM{xkO^jr&uthX(~EY1>^o zFVC&IUzT0L#o@`XPZn$C8h5o+Rs2batNthCH`kKgI<{)=vD5Q^&sO~Z=xF!OsmBa@ z48`7l{M6>au;b`42Oq~XFS`3DwmC5PZ2x4O#j>PK=k{i1e>u|z>zDoa?tR?I_lifv zn(2a^!5WqluYKS8)CD+hEqHm5^J4$RKskRVhm3G;Uj=rDj^qmyV%|#2pDblyu@~cI zj5lEkjE?G)vz^s1XFJQQx~Y;qARypC^!>MCM>?hTw6s6D^-3LezbeMeaLoQ!NBz@J z_8%&LU)_KH(b4WoSJ&2ehO1Yt3W$o5npRq_TuM$t0H=hW=K8=-uZu3 z=xPQA2gGALME&z?SI%9hu@m#b{gv@sa2UNU|1vwgqI9{oAE-~0A) z`&GJ3qN1V^U*-R|%G();ZcabXcVk=9QLa6of7qmi{@wm;=iFnfC;r>_`<-)Ys_K*1 z9xRKxzcBdlzEfOqEyLs9(Hj8_PoA(hOqw*QOuVtFiD|XcfwzbI}sIKlavCG62v5B+uVesv5ICK&>q4pSz^@vW`c5la7me0ao|9{{AfA5x>zhAE> zzqqilM!(K=O}E0M*Sy?nC!)i`#I7uh_q9noGeb~8ifLCZqsSAk6A!oE%4?Un)5)== zYs$>Wo*y@-pFh?ms%=p8#3T07_q|`gHRM*?-C6bDcVEekQ>Rn*-1~akv;MU1c9xvm z`|Iru^_@<{hlMSRsygkRv-lr_((~|Ve=RL78E+dI8TGtoc*Lvh-gjhO>~4diCnp## zoe7#C$KV$xV^n)bUN2hY!_D-MyUrZTj@>`$3q!$=4~f4HEAt$hr=7cNYTkh|0Y1hD zQLi^`-khk^noxE8?74H-YPAA`f)0u39WY20oVK(2`@4wkd9ezadh@pVRH?4p^T~_B zAvafd)~s1N$N&H5=U=#SpPcD~3bpJRTVJbRa$m}EqjAF@uiN_m>^#8@0uH4?{*#|v zZ@rnkqN72Ni<{f9@>9yy+@eS3@izUo@^SNSMeF|OXP0{Yns>cC!>{k}*L(lz7T0IH z@o#VSccUy$3CV(;F_$##sxHia5j@ZBMDG6{Nn@sCTs+&EIfNRwsq7CG)X>wLwk}k_ z!*A9-2Cwq^ym?>bYh|{q+P3Z5AMw!6^%qx)-P~EME^S+7B5#<)vTD_;5bxiYE?siC zB&-z1^2KAlYfb9h#%aw4e!E1-|1gMLqi?U zzpQP@yuDs@ecJD>E)5>?wHn&mhgSqH4v2}#>Hd<|vCednz+DNW9x2nV>sPNbGJJb` zTU>O1Z;egE#l`O4*Yjt63A{Jo?$+b2Y%CkSs&+3}&T!CAAp8tGMJwNZOgl3pv9l$t>d8!|rx!lTu4i0r%kZ=?Em`Q0Z{2DogPa1Z^4Q6p zi4D1e918Xg>}gLWyAHfwzd!HSk59MC8jp61dn;YKbg8MOg(Xw6;Y;L$@cq9;m&UWi z3PrzUT+w4JJy{^{Q*s zZBwz<{&{_Ebo-qdfzb$R}W zpU>wnuK)k;cu zHa2wz``R=!qs^p)|235VPe@@llx+}Tbga{57f@hg>Q5=qaB(QLmz0|^ zb-5Ok*Qad9DW9r#?wcks$EH$fZ`IdHM-uMssm#dCbo~DA?ovND_kKCoqM}VIEG$iP zb|jU>nEzdsL{Wx_6eIM=Dp zn=wyuV%XY=7v_EPYMbi4RGsmY&3&GqbFCU?=kJqzzvnaGyB&}D{``4v&wr!raj!WO zLu7r^I*yJm2Stvo7W2!e^mX_SXg%>ep!xH=`HL%}8rM#H*I9C<*{$)cyO?milX=I} zY0(qr%;~uvSIs-W_FJUD!<9@E60UMSdGaKKt5HtIvLT?m;pUwCEA$TJd`?&@EU@F< zwUWbrj(#!@US3>sH6I+`+}$ni>grknvVEI=%#H~s{5L#dd9vZszWZIw9kaf@2(#wk zm7a5M^6q7fAHsjUJero88kttJ!iu?2XOeCftAX*yZQOq+QNl9M8;n ztYymC)m%((RogJUnwa)L>B}pb9)q+q5_}AU3?cQ_Nn zv!`b_-O(;QGsCc^I#Q6~!8*g_9rHLQv@WY~|ER(+-ShYBUin4tum4zvA8x-M_MgAO zT=%*>PwWRN27QKv7fsh2{-Stg=MO{p;r~0{dR}AQ|M>aG3t#?U-_>p@xFhCM^~Rm|co`(_ z-|YVA9WG_XsDB_*>%hB@^>Oys?(-#b{m~Vw&2L^TS5WE6!SPUa->oAHvy^#Oma-Ws z&42gpThD(sy%=8kc`30UuJ1eG-}l4yfxB^Co)^m$)&Hljr~YJJuISHvW9zu}RF1l4lxL9gAn%%l=Hy<-8zyBj)|Fdw<$DWW4m!iP+#^mHzOy z^uc3H<#onvm;L4(c<1gtu~TP1$AeA67KM*k-mQ^s-tI2Cu;BKw8=>(|R}^%FZBf=+YaCR)4t?yTbQ_rRV#kpgd-rWls<$}`9D`1~x^n^*Zv^3OB#{Rcb4)D^@V z)8|#P1#f%WB>p>@qh*Fj!?#28K6!0>_;TZ=^qm}6=C5}yS{`zCM`h(^lerC>p3I+a zuDzfzFfdTic`>K@hp6ni4vXtvJ1{L=yC8~vfqBU`NgG33=C`6C$31+xvF6g}+bV(@ zJ3mF8$^SV0Pw2apw>$o{|M+n&C~n?!{it0+vtR3XH{J?nxz1{E|Mr8K_jK0C@8>&j z^OqY-RO8eg~pEO?}uj3=j6_5NIA{N&aTo@R_v^?_!%=Po9 zT`@bb;YqkB`!OE*!`t(--}0E$@I3v~VkXMCdBN-;cE97o0>W*td|ABiHgfts*kWzK z+2AbD$aztR!Nen0!{P5u&3(3yWgDUv3vm?k6fv+k@fd+2WNsiH5 zN0~m(dOh{^mA-V!;WEOpG?0 z#38_;=3U3I%g0>6eZ!;hxT9PC{yU!@ z&}FRQdiYurgG2bQ^_(pVpKkYZ{;XhV`eXm^WB9j?!R%2>Z=Pu*F82gl!^JCfY}l3!imipzt0)$e(wI3sjUA9eU{sIVaJ zb^ce+hPlU_W}D?E39I=%G0(Z#vFlM0LnTAQl*w!3KdC!>e;4vgn4`+iVdnGIQ~%6j z+EDg3N-gWn)Ft`d%MLiPSTS3aEEAKx_qG43eTq}>mbw43m=4YnzM%E9RMsJS`_FJ; z#synF4Fu;q6ojZRxGt&j%G333Bj-n+y&oAKEwVN^oZ_zJ#^ltI{(`GP|7!f?_qzlh zE3*gImvr?%tLVLS|62vazK{YH#+;DX&yxyF+TuAt-ML*Raa*%Qxl3&t1-K>bYAP5W zo<4P|>Do%J2Jr_vq6y!(+?6S|l zUXSPJs{C+}9h7cD&UcJT*a8LqGT`#$pEgG{zPcK=VS{p4hE z%9zt2)b^Nh$DRZW_8;4R&Svtite<%Qo3t70yU2qdQmv-PG`fa_h9(~A5ZqSJP<6*$ zK~RG`gLg&fr`22yHnIm=!xS5i+A)}Q=s)=KQO5S3vcRJp8;0cz-W_PkaJ$pb?!clZ zuw`z8pi&$|+POI=<7>Z$)-HGYds5SG-eXw@p$6aCW{JJ)5?P`C-ptF z6;5dTbN75WrM>>a+OMw*zq|-!IB;>X`^Rg)zWy*M<@lS-(!}{&{}@|bzc*zvVY!R5i! z@Hoe73$hs*w%_%smueIUW8BbuO=kZ0cel+QSXyeg2X)IUIIML3Gr#_e4&UF$mJA18 z{VA;Z)wDK5&_kicnc<(&clA})|4UBB`*t?`(QMf8exX9HawkLMg>QThemR9qzd2fduyQgq3M`he ztJ(4J$ih{c4rOI#`kI=FpU!`J`ziO7#nZa1obcDxv;O{LaatlE z-(X_0qe3MkE26+rL^biuy)O$@+HaM%NJk~PE>U;k{#pL!M&pzzBAIhzI6~CfukLy{ zRaL&xp`(W5(`nZOC0q+!t2W+S)7!UI$T)1jxZ*djddIr{ z-0|o0QV`g3w?S})ra_~?@dY9ZLO~2n2i4~Eu{-b`SlMLs?1igB3->l_W>@PrUccwn zr?eNh$A)maee`=|dP0A`?2Q5+ho@iexLuGw>~ANyVya~070~qZzO=JaX{~?OWg8jt zY*1lhWo7;I>-Bo`t?wTmZVwCy5Gcse-Y?%<@4-=iQeV9$GIHiJ4i*arL)-7{w&|?nXY{2fkj9@1I`( zea_0)Rc}tFhhBgEw=S*Dnn`iWlj-(sSA-a^iZs}-to!iZer5fqna1g#etv%LUCjLL zY`n>T4v)0QnJ!F~>zzuQ%q>$iMl4y!4YVt7!t`{CCr=4p5H%=2FS zjXj*a;%}YXe%VHWtWVn0uevCtOl?^7B>WuTo#p=WK68y!6?6@_`;Rw2KHjgatIK%dWpp{Qd3inq|w5P2qT>xjto|@a~VB?L!>={>}fpkm)en@?v!-1+Tj8 zw|n_ytuD-U>&Ot?u*<(`*VX!~*H~p>Wq?6thP%kSwFg7PV_P2|?|%%M|Mp@3HYMB$ zF%?VAJu2q_79~YJanJ zz)GlT^VvXS!T0|^k$C0*bGe|f(u0o`3qr*O96q@lS%@et*fpQ2v$Ip^W2^84?k33> zXY+g%wk+k4SjxefmY-m3zEObjXK=&zYwOv6r_Em)*~t2nKXm>_f7NdnIq#HSkBwQv zme!{T8Gl=O@E_X?E2f7GEI(cU>AM`zTH~|UPoX7>rRNp9kW;NNx8Q{Ob21gZFIOIH zKB2!_c*8Ge4nct@^+{E2`yV+kpL@X9{L3Qi4gq5&1%JjI?uN4^4ox#eZ+Nh5IU&zw zV`%HV>0j0p`spKW zfQH}vO#XZfb?J}xE>QSkW3ty$agytS4T=-)@yc|~j_5eB@RhOS?L)406WJt8`S%@q zv|H%Pp6LQ7l@_S-6c%50%VJmTbCMG5c$9lQyOcf5?)~*5){rdMCI$fxGe_qpL7B$H zA`6$^NDKS?{?BYJM+>YHK)v(h^7V7{qqnU&d#CsDx&v=>9A*2nmZ+E}&v|d;cuZja z{V$ctx~&Bao($9UUnZL$4PCVg; z(1vBpj_o&cyeqL~%NB-)yzU);{?y!C9j>2gwdl{En!Iq9d9~jn?=5s@_g31FbJOVC zkH`I=XXouYIf-M*k|hgv?YecP^y};E{~0Gcue!dD6qvbE7KL{(oQBS2{T{O`0^x z$C6R?=Gn44f!cSY-!4hW+tCq;xm_Oh4RjV%Sudny^bNKgj`u;zv;z!Jc7)?KQ zTQRP-ZxLX0{P*co5ko_qb>o#QS0?-w1eqdq;m)0$vy3fDvJ>j-UM`*P)7c>Q)4B1} zr=pX;R!_YD_~Q$^`{qG6PH+A7>g?u>6a}a1$+4zSO*c>8^QCfzht@Mb)jHl{1QgDv&~N{_s=X}y`JdPqrj2zdH6>|%EQe=%MoadqYT z%W<(6<>dK#dfwkZ?-TxDh5&<9K(oV!eg(!8XV03dT-jCn+9_(*EX(EZN-sPZ zgR9a3CY7Q4+EDSRjT#(v>{WU(=mz1@ArO}`zw*y6gNE~l<|UA?c8b4 zs`w81oYXI8Xps~X}da@vlhH!cynYjvqFU2vD2BVQ9QS5Ru{A$W)u+tr&!1L3yT<7 zm=p!%`rWG{9V28M>gx8r`n586dD6*As!td=S~vWP2NF8s zuOC^h5E2OClz2Y1!EI&3C0!PgJr~#IU6H+E_-L=5>Z6M`G|)jlrDDp-6cezl&014Gr97YD1qzwHiI_g6AB6ztWtEAjGi zNKRJX_3cI9k|ip2D|br9&n{pAP4LdyIJxk}Wq(7S2P#Yx`?qY_GC}6~>h=33sj=l| zgUfBkwBw9Zx?8XCDHs|~G@i~at{>;JJ@4*;7`=*fbB`YF7B9T`*zs~}_lKCA13N#1 zyFunk|96}fO^Dss%>4A}i&F1tPuMtEoPH?07g_Qx$VsSyPu6O|#*Ko<`(+QmT))rh zv8uk1u<*nOWzD}W&RxB>=wLD9$+?pr6z%5m{@2!fy5Pg#Af8iFo$tl>w5iSWQ4(le z&=&fUxAUZ~uI`7*S`R-jwmW(zbL`uV^U+zwx zxs{sw;-yPjeSLj1c2o%V>@3OsztG?QXye`Yi(m8FempFmuDDX#dAeR~z?PS#b5`zl zQ4(-mv36~0W@e`1`RVg39&xfY%(bna_Ns1?BZJUnYeiL4(cWI(6)S&oP2X|-Jy(sL ziMdHbao>?6E-I?3%8CcqR&8kOJ^kV7_NxpHj?L_kzqq%5JSVLE@uU6s2d5Zo4IkFe zcf57r^~-Q|0i|<{710-NTwpkGf2)D&N?{B38asK01<64|7VNWT&o=pd?A8;jJKGAR zcHO%m{Nf5LL&2{L;uh_0bABz6%I}-szuwNuXTMdWfZCEJOJ3}oGC_{nh(T{Ux805d zH8Q=tyal^sAKc+>cpOx0d?2P^cg%;MdmPzs1;?G-@Jg4DVR^LYy(^E7UVNpzV^Oh| z-nIAxU*c{04*fs1xQvm-Ng`pZu0sPu%&rp8SGmvM&1jh>#&^!L#!g?zx~%2=>(=Y9 zTW=qI@U<$GUroGmirn79HQ$(mc9pa~uaVt%dn@zA`3@Y)M>HIgWEj?#UoB(s_4R%8 z?RI|q>8DJ|JaPHl7R8KfOaJNW>L&2)c>C@4#Vc2qcs{ayIyJ|?QuT99F^}z@`-_Bk zcf2oqtFU(Y{!WJu8I~<9I(m9(3=@i|_Y3+(&pyE8tNGARZnZj;=g$rxbOv>{pL z==SWICI9z7v`d%yUq9^_b3pZ<;}XRp{L7hxHt=3q(IK$Cz{vMrbpGC@+6*zCe%dMg zj(aK%7k*?=+Wq9_RleuQQUT;udAsC~}JE7aLiLr5}lwzrl zMey%6D*N6T8!IX}HaXRoN_;raJ7N0&Wz$lpMnwIN5M}gc^wYkWH04iLp2ItqCk2vI z9$gEzDqUnWHDzAroZ#L+3ZH~It_3qzX0BJ`(c7&awDRP0u^>)0`?hn1Q&jDjE3V;S zDb90P?G*5iDaW5@(G2|w**h4QMWmgoh_pIbdWm73hx!Rl0S>7r=BosFycl`B68Dx) znmaxE*R|BZpXze|HG^4Zc-YTiZFf{Svi5EGvu{>Cp%2+df_>=B?mSB#T2^6Wc(Vc~U?^&(1{SeOnj(!Nl{ zc}8LSb>(fA$D}$s?^e8&xFUN)^HFTb;$QzFH~o<4>gvil{$IXJx9^(L*SCrc3=9mO Lu6{1-oD!M