From 35d0ce8387b064cdceb13eb425134e0609072bb4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 27 Apr 2021 20:07:29 +0200 Subject: [PATCH] Widget resize - Condensed the main reading space of config UIs - Reworked some of the widgets to better arrange themselves in a column --- .../config/ui/BaseConfigScreen.java | 12 ++--- .../config/ui/ConfigScreenList.java | 4 +- .../config/ui/SubMenuConfigScreen.java | 4 +- .../config/ui/entries/BooleanEntry.java | 42 +++++++++------ .../config/ui/entries/EnumEntry.java | 48 ++++++++++-------- .../config/ui/entries/NumberEntry.java | 20 ++++---- .../config/ui/entries/SubMenuEntry.java | 19 +++---- .../config/ui/entries/ValueEntry.java | 4 +- .../create/foundation/gui/AllIcons.java | 4 +- .../foundation/gui/widgets/ElementWidget.java | 4 +- .../assets/create/textures/gui/icons.png | Bin 18162 -> 3573 bytes 11 files changed, 91 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java index e613bfafd..a88afecd9 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java @@ -28,22 +28,22 @@ public class BaseConfigScreen extends ConfigScreen { widgets.clear(); super.init(); - TextStencilElement text = new TextStencilElement(client.fontRenderer, new StringTextComponent("CLIENT CONFIG").formatted(TextFormatting.BOLD)).centered(true, true); - widgets.add(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 50, 200, 30) + TextStencilElement text = new TextStencilElement(client.fontRenderer, new StringTextComponent("Client Settings").formatted(TextFormatting.BOLD)).centered(true, true); + widgets.add(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16) .showingElement(text) .withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.CLIENT, AllConfigs.CLIENT.specification))) ); text.withElementRenderer(BoxWidget.gradientFactory.apply(clientConfigWidget)); - TextStencilElement text2 = new TextStencilElement(client.fontRenderer, new StringTextComponent("COMMON CONFIG").formatted(TextFormatting.BOLD)).centered(true, true); - widgets.add(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 30) + TextStencilElement text2 = new TextStencilElement(client.fontRenderer, new StringTextComponent("World Generation Settings").formatted(TextFormatting.BOLD)).centered(true, true); + widgets.add(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16) .showingElement(text2) .withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.COMMON, AllConfigs.COMMON.specification))) ); text2.withElementRenderer(BoxWidget.gradientFactory.apply(commonConfigWidget)); - TextStencilElement text3 = new TextStencilElement(client.fontRenderer, new StringTextComponent("SERVER CONFIG").formatted(TextFormatting.BOLD)).centered(true, true); - widgets.add(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 50, 200, 30) + TextStencilElement text3 = new TextStencilElement(client.fontRenderer, new StringTextComponent("Gameplay Settings").formatted(TextFormatting.BOLD)).centered(true, true); + widgets.add(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 30, 200, 16) .showingElement(text3) ); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java index a9c0190c6..c0c387afa 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java @@ -142,12 +142,12 @@ public class ConfigScreenList extends ExtendedList { @Override public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - UIRenderHelper.streak(ms, 0, x, y + height / 2, height - 10, getLabelWidth(width) + ((width - getLabelWidth(width)) / 3), 0xdd_000000); + UIRenderHelper.streak(ms, 0, x, y + height / 2, height - 10, width, 0xdd_000000); IFormattableTextComponent component = label.getComponent(); if (Minecraft.getInstance().fontRenderer.getWidth(component) > getLabelWidth(width) - 10) { label.withText(Minecraft.getInstance().fontRenderer.trimToWidth(component, getLabelWidth(width) - 15).getString() + "..."); } - label.at(x + 5, y + height / 2 - 4, 0).render(ms); + label.at(x + 10, y + height / 2 - 4, 0).render(ms); if (mouseX > x && mouseX < x + getLabelWidth(width) && mouseY > y + 5 && mouseY < y + height - 5) { List tooltip = getLabelTooltip(); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java index ace8dc2c0..3a6b2285c 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java @@ -117,7 +117,7 @@ public class SubMenuConfigScreen extends ConfigScreen { super.init(); //leave 40px on either side and dont be wider than 500px - listWidth = Math.min(width - 80, 500); + listWidth = Math.min(width - 80, 300); int yCenter = height / 2; int listL = this.width / 2 - listWidth / 2; @@ -189,7 +189,7 @@ public class SubMenuConfigScreen extends ConfigScreen { widgets.add(discardChanges); widgets.add(goBack); - list = new ConfigScreenList(client, listWidth, height - 60, 45, height - 15, 50); + list = new ConfigScreenList(client, listWidth, height - 60, 45, height - 15, 40); list.setLeftPos(this.width / 2 - list.getWidth() / 2); children.add(list); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java index 59ffdd120..d7b9d6a98 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java @@ -1,33 +1,42 @@ package com.simibubi.create.foundation.config.ui.entries; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.gui.TextStencilElement; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.RenderElement; import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.widgets.BoxWidget; -import net.minecraft.client.Minecraft; import net.minecraftforge.common.ForgeConfigSpec; public class BooleanEntry extends ValueEntry { - TextStencilElement enabled; - TextStencilElement disabled; + RenderElement enabled; + RenderElement disabled; BoxWidget button; public BooleanEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { super(label, value, spec); - enabled = new TextStencilElement(Minecraft.getInstance().fontRenderer, "Enabled") - .centered(true, true) - .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height/2, height, width, 0xff_88f788, 0xff_20cc20)); +// enabled = new TextStencilElement(Minecraft.getInstance().fontRenderer, "Enabled") +// .centered(true, true) +// .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height/2, height, width, 0xff_88f788, 0xff_20cc20)); +// +// disabled = new TextStencilElement(Minecraft.getInstance().fontRenderer, "Disabled") +// .centered(true, true) +// .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height/2, height, width, 0xff_f78888, 0xff_cc2020)); - disabled = new TextStencilElement(Minecraft.getInstance().fontRenderer, "Disabled") - .centered(true, true) - .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height/2, height, width, 0xff_f78888, 0xff_cc2020)); + enabled = AllIcons.I_CONFIRM.asStencil() + .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, + height, width, 0xff_88f788, 0xff_20cc20)) + .at(10, 0); + + disabled = AllIcons.I_DISABLE.asStencil() + .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, + height, width, 0xff_f78888, 0xff_cc2020)) + .at(10, 0); - button = new BoxWidget() - .showingElement(enabled) - .withCallback(() -> setValue(!getValue())); + button = new BoxWidget().showingElement(enabled) + .withCallback(() -> setValue(!getValue())); listeners.add(button); onReset(); @@ -46,12 +55,13 @@ public class BooleanEntry extends ValueEntry { } @Override - public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { + public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, + boolean p_230432_9_, float partialTicks) { super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - button.x = x + getLabelWidth(width); + button.x = x + width - 80 - resetWidth; button.y = y + 10; - button.setWidth(width - getLabelWidth(width) - resetWidth - 4); + button.setWidth(35); button.setHeight(height - 20); button.render(ms, mouseX, mouseY, partialTicks); } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java index 73b03f892..7dcf9512d 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java @@ -13,7 +13,7 @@ import net.minecraftforge.common.ForgeConfigSpec; public class EnumEntry extends ValueEntry> { - protected static final int cycleWidth = 34;//including 2px offset on either side + protected static final int cycleWidth = 34;// including 2px offset on either side protected TextStencilElement valueText; protected BoxWidget cycleLeft; @@ -23,20 +23,20 @@ public class EnumEntry extends ValueEntry> { super(label, value, spec); valueText = new TextStencilElement(Minecraft.getInstance().fontRenderer, "YEP").centered(true, true); - valueText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.i(Theme.Key.TEXT_1), Theme.i(Theme.Key.TEXT_2))); + valueText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, + height, width, Theme.i(Theme.Key.TEXT_1), Theme.i(Theme.Key.TEXT_2))); DelegatedStencilElement l = AllIcons.I_CONFIG_PREV.asStencil(); - cycleLeft = new BoxWidget(0, 0, 22, 22) - .showingElement(l) - .rescaleElement(16, 16) - .withCallback(() -> cycleValue(-1)); + cycleLeft = new BoxWidget(0, 0, cycleWidth + 8, 16).showingElement(l) +// .rescaleElement(16, 16) + .withCallback(() -> cycleValue(-1)); l.withElementRenderer(BoxWidget.gradientFactory.apply(cycleLeft)); DelegatedStencilElement r = AllIcons.I_CONFIG_NEXT.asStencil(); - cycleRight = new BoxWidget(0, 0, 22, 22) - .showingElement(r) - .rescaleElement(16, 16) - .withCallback(() -> cycleValue(1)); + cycleRight = new BoxWidget(0, 0, cycleWidth + 8, 16).showingElement(r) +// .rescaleElement(16, 16) + .withCallback(() -> cycleValue(1)); + r.at(cycleWidth - 8, 0); r.withElementRenderer(BoxWidget.gradientFactory.apply(cycleRight)); listeners.add(cycleLeft); @@ -47,7 +47,8 @@ public class EnumEntry extends ValueEntry> { protected void cycleValue(int direction) { Enum e = getValue(); - Enum[] options = e.getDeclaringClass().getEnumConstants(); + Enum[] options = e.getDeclaringClass() + .getEnumConstants(); e = options[Math.floorMod(e.ordinal() + direction, options.length)]; setValue(e); bumpCog(direction * 15f); @@ -70,22 +71,29 @@ public class EnumEntry extends ValueEntry> { } @Override - public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { + public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, + boolean p_230432_9_, float partialTicks) { super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - cycleLeft.x = x + getLabelWidth(width) + 2; - cycleLeft.y = y + 12; + cycleLeft.x = x + getLabelWidth(width) + 4; + cycleLeft.y = y + 10; cycleLeft.render(ms, mouseX, mouseY, partialTicks); - valueText - .at(cycleLeft.x - 4 + cycleWidth, y + 12, 0) - .withBounds(width - getLabelWidth(width) - 2 * cycleWidth - resetWidth - 4, 22) - .render(ms); + valueText.at(cycleLeft.x + cycleWidth - 8, y + 10, 200) + .withBounds(width - getLabelWidth(width) - 2 * cycleWidth - resetWidth - 4, 16) + .render(ms); - cycleRight.x = x + width - cycleWidth - resetWidth + 2; - cycleRight.y = y + 12; + cycleRight.x = x + width - cycleWidth * 2 - resetWidth + 10; + cycleRight.y = y + 10; cycleRight.render(ms, mouseX, mouseY, partialTicks); + BoxWidget boxWidget = new BoxWidget(0, 0, 10, 10); + boxWidget.x = cycleLeft.x + cycleWidth + 4; + boxWidget.y = cycleLeft.y + 3; + boxWidget.withBorderColors(java.awt.Color.black, java.awt.Color.black); + boxWidget.active = false; + boxWidget.render(ms, mouseX, mouseY, partialTicks); + } @Override diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java index 237cf8ff4..433d79b53 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java @@ -38,7 +38,7 @@ public abstract class NumberEntry extends ValueEntry { public NumberEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { super(label, value, spec); - textField = new ConfigTextField(Minecraft.getInstance().fontRenderer, 0, 0, 200, 26, unit); + textField = new ConfigTextField(Minecraft.getInstance().fontRenderer, 0, 0, 200, 20, unit); textField.setText(String.valueOf(getValue())); Object range = spec.getRange(); @@ -51,13 +51,13 @@ public abstract class NumberEntry extends ValueEntry { T max = (T) maxField.get(range); FontRenderer font = Minecraft.getInstance().fontRenderer; - if (!min.equals(getTypeMin())) { + if (min.doubleValue() > getTypeMin().doubleValue()) { StringTextComponent t = new StringTextComponent(formatBound(min) + " < "); minText = new TextStencilElement(font, t).centered(true, false); minText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.c(Theme.Key.TEXT_1).darker().getRGB(), Theme.c(Theme.Key.TEXT_2).darker().getRGB())); minOffset = font.getWidth(t); } - if (!max.equals(getTypeMax())) { + if (max.doubleValue() < getTypeMax().doubleValue()) { StringTextComponent t = new StringTextComponent(" < " + formatBound(max)); maxText = new TextStencilElement(font, t).centered(true, false); maxText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.c(Theme.Key.TEXT_1).darker().getRGB(), Theme.c(Theme.Key.TEXT_2).darker().getRGB())); @@ -123,10 +123,10 @@ public abstract class NumberEntry extends ValueEntry { public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - textField.x = x + getLabelWidth(width) + minOffset; - textField.y = y + 10; - textField.setWidth(width - getLabelWidth(width) - resetWidth - minOffset - maxOffset); - textField.setHeight(26); + textField.x = x + width - 82 - resetWidth; + textField.y = y + 8; + textField.setWidth(Math.min(width - getLabelWidth(width) - resetWidth - minOffset - maxOffset, 40)); + textField.setHeight(20); textField.render(ms, mouseX, mouseY, partialTicks); if (minText != null) @@ -172,7 +172,7 @@ public abstract class NumberEntry extends ValueEntry { @Override protected Float getTypeMin() { - return Float.MIN_VALUE; + return -Float.MAX_VALUE; } @Override @@ -194,12 +194,12 @@ public abstract class NumberEntry extends ValueEntry { @Override protected Double getTypeMin() { - return Double.MIN_VALUE; + return (double) -Float.MAX_VALUE; } @Override protected Double getTypeMax() { - return Double.MAX_VALUE; + return (double) Float.MAX_VALUE; } @Override diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java index 0931587c7..adb1d05c6 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java @@ -4,11 +4,11 @@ import com.electronwill.nightconfig.core.UnmodifiableConfig; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.config.ui.ConfigScreenList; import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.DelegatedStencilElement; import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.TextStencilElement; import com.simibubi.create.foundation.gui.widgets.BoxWidget; -import net.minecraft.client.Minecraft; import net.minecraftforge.common.ForgeConfigSpec; public class SubMenuEntry extends ConfigScreenList.LabeledEntry { @@ -17,12 +17,13 @@ public class SubMenuEntry extends ConfigScreenList.LabeledEntry { public SubMenuEntry(SubMenuConfigScreen parent, String label, ForgeConfigSpec spec, UnmodifiableConfig config) { super(label); - TextStencilElement text = new TextStencilElement(Minecraft.getInstance().fontRenderer, "Click to open").centered(true, true); - + DelegatedStencilElement element = AllIcons.I_CONFIG_OPEN.asStencil(); + button = new BoxWidget() - .showingElement(text) + .showingElement(element) .withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(parent, label, parent.type, spec, config))); - text.withElementRenderer(BoxWidget.gradientFactory.apply(button)); + element.withElementRenderer(BoxWidget.gradientFactory.apply(button)); + element.at(10, 0); listeners.add(button); } @@ -37,15 +38,15 @@ public class SubMenuEntry extends ConfigScreenList.LabeledEntry { public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - button.x = x + getLabelWidth(width); + button.x = x + width - 108; button.y = y + 10; - button.setWidth(width - getLabelWidth(width) - 4); + button.setWidth(35); button.setHeight(height - 20); button.render(ms, mouseX, mouseY, partialTicks); } @Override protected int getLabelWidth(int totalWidth) { - return (int) (totalWidth * labelWidthMult); + return (int) (totalWidth * labelWidthMult) + 30; } } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java index 6c594cec3..3cba3a0cd 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java @@ -108,13 +108,13 @@ public class ValueEntry extends ConfigScreenList.LabeledEntry { } resetButton.x = x + width - resetWidth + 6; - resetButton.y = y + 15; + resetButton.y = y + 10; resetButton.render(ms, mouseX, mouseY, partialTicks); } @Override protected int getLabelWidth(int totalWidth) { - return (int) (totalWidth * labelWidthMult); + return (int) (totalWidth * labelWidthMult) + 30; } public void setValue(@Nonnull T value) { diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 99239b56f..e6b6cc573 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -134,7 +134,9 @@ public class AllIcons implements IScreenRenderable { I_CONFIG_RESET = next(), I_CONFIG_BACK = next(), I_CONFIG_PREV = next(), - I_CONFIG_NEXT = next(); + I_CONFIG_NEXT = next(), + I_DISABLE = next(), + I_CONFIG_OPEN = next(); public AllIcons(int x, int y) { iconX = x * 16; diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/ElementWidget.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/ElementWidget.java index 96b05f45c..dc880c26f 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/ElementWidget.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/ElementWidget.java @@ -119,8 +119,8 @@ public class ElementWidget extends AbstractSimiWidget { //element x/y get treated as a border around the element float eX = element.getX(); float eY = element.getY(); - float eWidth = width - 2 * eX; - float eHeight = height - 2 * eY; + float eWidth = width;// - 2 * eX; + float eHeight = height;// - 2 * eY; if (rescaleElement) { float xScale = eWidth / rescaleSizeX; float yScale = eHeight / rescaleSizeY; diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index e27a7e64805274e21956527bae741398ad9aad1f..6d91e2386079b34b59d52b1958acae2d8f6475ba 100644 GIT binary patch literal 3573 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 LO0QDKDdv9w21S1V literal 18162 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