From 9f55b298a8691200d52fde1509b105da333f942c Mon Sep 17 00:00:00 2001 From: Leo dev Date: Mon, 3 Mar 2025 19:35:02 +0100 Subject: [PATCH] custom ui textures and name tab --- .../auraclient/auraclient/auth/AuraApi.java | 4 + .../auraclient/auth/AuraPlayer.java | 5 + .../auraclient/menus/CloakSelector.java | 8 +- .../auraclient/auraclient/menus/MainMenu.java | 19 ++- .../auraclient/mixin/EntityRendererMixin.java | 124 -------------- .../auraclient/mixin/NameTagMixin.java | 158 ++++++++++++++++++ .../auraclient/widgets/AuraButton.java | 37 ++++ .../auraclient/textures/player-badge.png | Bin 0 -> 16902 bytes .../assets/auraclient/textures/player.png | Bin 9940 -> 0 bytes .../widget/{button.png => aura_button.png} | Bin ...tton.png.mcmeta => aura_button.png.mcmeta} | 0 ..._disabled.png => aura_button_disabled.png} | Bin ...mcmeta => aura_button_disabled.png.mcmeta} | 0 ...ighted.png => aura_button_highlighted.png} | Bin ...eta => aura_button_highlighted.png.mcmeta} | 0 src/main/resources/auraclient.mixins.json | 2 +- 16 files changed, 222 insertions(+), 135 deletions(-) create mode 100644 src/main/java/org/auraclient/auraclient/auth/AuraPlayer.java delete mode 100644 src/main/java/org/auraclient/auraclient/mixin/EntityRendererMixin.java create mode 100644 src/main/java/org/auraclient/auraclient/mixin/NameTagMixin.java create mode 100644 src/main/java/org/auraclient/auraclient/widgets/AuraButton.java create mode 100644 src/main/resources/assets/auraclient/textures/player-badge.png delete mode 100644 src/main/resources/assets/auraclient/textures/player.png rename src/main/resources/assets/minecraft/textures/gui/sprites/widget/{button.png => aura_button.png} (100%) rename src/main/resources/assets/minecraft/textures/gui/sprites/widget/{button.png.mcmeta => aura_button.png.mcmeta} (100%) rename src/main/resources/assets/minecraft/textures/gui/sprites/widget/{button_disabled.png => aura_button_disabled.png} (100%) rename src/main/resources/assets/minecraft/textures/gui/sprites/widget/{button_disabled.png.mcmeta => aura_button_disabled.png.mcmeta} (100%) rename src/main/resources/assets/minecraft/textures/gui/sprites/widget/{button_highlighted.png => aura_button_highlighted.png} (100%) rename src/main/resources/assets/minecraft/textures/gui/sprites/widget/{button_highlighted.png.mcmeta => aura_button_highlighted.png.mcmeta} (100%) diff --git a/src/main/java/org/auraclient/auraclient/auth/AuraApi.java b/src/main/java/org/auraclient/auraclient/auth/AuraApi.java index 2921468..221e90c 100644 --- a/src/main/java/org/auraclient/auraclient/auth/AuraApi.java +++ b/src/main/java/org/auraclient/auraclient/auth/AuraApi.java @@ -13,6 +13,8 @@ import java.net.URI; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; public class AuraApi { private static final String URL = "http://localhost:3000"; @@ -20,6 +22,8 @@ public class AuraApi { private static String token = null; private static String uuid = null; + public static List players = new ArrayList<>(); + public static boolean authenticate() { try { MinecraftClient client = MinecraftClient.getInstance(); diff --git a/src/main/java/org/auraclient/auraclient/auth/AuraPlayer.java b/src/main/java/org/auraclient/auraclient/auth/AuraPlayer.java new file mode 100644 index 0000000..5f1db12 --- /dev/null +++ b/src/main/java/org/auraclient/auraclient/auth/AuraPlayer.java @@ -0,0 +1,5 @@ +package org.auraclient.auraclient.auth; + +public class AuraPlayer { + +} diff --git a/src/main/java/org/auraclient/auraclient/menus/CloakSelector.java b/src/main/java/org/auraclient/auraclient/menus/CloakSelector.java index b305a2f..2fa3408 100644 --- a/src/main/java/org/auraclient/auraclient/menus/CloakSelector.java +++ b/src/main/java/org/auraclient/auraclient/menus/CloakSelector.java @@ -1,9 +1,9 @@ package org.auraclient.auraclient.menus; import org.auraclient.auraclient.cloaks.Cloaks; +import org.auraclient.auraclient.widgets.AuraButton; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.text.Text; public class CloakSelector extends Screen { @@ -13,13 +13,13 @@ public class CloakSelector extends Screen { @Override protected void init() { - int y = ((this.height - (35 * (Cloaks.availableCloaks.size()))) / 2) + 30; + int y = ((this.height - (35 * (Cloaks.availableCloaks.size()))) / 2); for (String cloak : Cloaks.availableCloaks) { - addDrawableChild(ButtonWidget.builder(Text.literal(cloak), (__) -> { + addDrawableChild(new AuraButton(Text.literal(cloak), (__) -> { String uuid = client.player.getUuidAsString().replace("-", ""); Cloaks.setCloak(uuid, cloak); - }).dimensions((this.width - 50) / 2, y, 50, 30).build()); + }, (this.width - 50) / 2, y, 50, 30)); y += 35; } diff --git a/src/main/java/org/auraclient/auraclient/menus/MainMenu.java b/src/main/java/org/auraclient/auraclient/menus/MainMenu.java index cc23583..0bbbea2 100644 --- a/src/main/java/org/auraclient/auraclient/menus/MainMenu.java +++ b/src/main/java/org/auraclient/auraclient/menus/MainMenu.java @@ -1,7 +1,8 @@ package org.auraclient.auraclient.menus; +import org.auraclient.auraclient.widgets.AuraButton; + import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.text.Text; public class MainMenu extends Screen { @@ -11,10 +12,16 @@ public class MainMenu extends Screen { @Override protected void init() { - addDrawableChild(ButtonWidget.builder(Text.literal("Cloaks"), (_button) -> { - if (client.player != null) { - client.setScreen(new CloakSelector()); - } - }).dimensions((this.width - 50) / 2, (this.height - 30) / 2, 50, 30).build()); + super.init(); + + int buttonWidth = 50; + int buttonHeight = 30; + + addDrawableChild( + new AuraButton(Text.literal("Cloaks"), (_button) -> { + if (client.player != null) { + client.setScreen(new CloakSelector()); + } + }, (this.width - buttonWidth) / 2, (this.height - buttonHeight) / 2, buttonWidth, buttonHeight)); } } \ No newline at end of file diff --git a/src/main/java/org/auraclient/auraclient/mixin/EntityRendererMixin.java b/src/main/java/org/auraclient/auraclient/mixin/EntityRendererMixin.java deleted file mode 100644 index 0b57e2b..0000000 --- a/src/main/java/org/auraclient/auraclient/mixin/EntityRendererMixin.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.auraclient.auraclient.mixin; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.client.render.LightmapTextureManager; - -import org.joml.Matrix4f; -import org.joml.Quaternionf; -import org.joml.Vector3f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(EntityRenderer.class) -public abstract class EntityRendererMixin { - private static final Identifier BADGE_TEXTURE = Identifier.of("auraclient", "textures/player.png"); - - @Shadow - public EntityRenderDispatcher dispatcher; - - @Overwrite - public void renderLabelIfPresent(S state, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, int light) { - - matrices.push(); - - matrices.translate(0.0f, 0.0f, 0.0f); - - int textWidth = MinecraftClient.getInstance().textRenderer.getWidth(text); - - double y = state.nameLabelPos.y; - - renderTextAtOrigin(y, text, matrices, vertexConsumers, light); - - if (state instanceof net.minecraft.client.render.entity.state.PlayerEntityRenderState) { - float yawAngle = 0.0f; - Quaternionf yawRotation = new Quaternionf().rotateY((float) Math.toRadians(yawAngle)); - matrices.multiply(yawRotation); - - Quaternionf cameraRotation = dispatcher.camera.getRotation(); - Vector3f leftVector = new Vector3f(-1, 0, 0).rotate(cameraRotation); - - float xOffset = textWidth * 0.018f; - - matrices.translate(leftVector.x * xOffset, y + 0.4f, leftVector.z * xOffset); - - matrices.scale(0.25F, 0.25F, 0.25F); - - renderBadgeIcon(matrices, vertexConsumers, light); - } - - matrices.pop(); - } - - private void renderTextAtOrigin(double y, Text text, MatrixStack matrices, - VertexConsumerProvider vertexConsumers, - int light) { - // Push the current matrix stack - matrices.push(); - - // Translate to the origin (0, 0, 0) and adjust the vertical position slightly - matrices.translate(0.0f, y + 0.5f, 0.0f); - - // Apply the camera's rotation to face the text towards the camera - matrices.multiply(dispatcher.getRotation()); - - // Scale the text to a readable size - matrices.scale(0.025F, -0.025F, 0.025F); - - // Get the position matrix for rendering - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); - - // Obtain the text renderer - net.minecraft.client.font.TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - - // Calculate the horizontal offset to center the text - float textWidth = (float) (-textRenderer.getWidth(text)) / 2.0F; - - // Determine the background opacity - int backgroundOpacity = (int) (MinecraftClient.getInstance().options.getTextBackgroundOpacity(0.25F) - * 255.0F) << 24; - - // Render the text with a background - textRenderer.draw(text, textWidth, 0, -2130706433, false, matrix4f, vertexConsumers, - net.minecraft.client.font.TextRenderer.TextLayerType.SEE_THROUGH, backgroundOpacity, light); - - // Render the text without a background if not sneaking - textRenderer.draw(text, textWidth, 0, -1, false, matrix4f, vertexConsumers, - net.minecraft.client.font.TextRenderer.TextLayerType.NORMAL, 0, - LightmapTextureManager.applyEmission(light, 2)); - - // Pop the matrix stack to restore the previous state - matrices.pop(); - } - - private void renderBadgeIcon(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) { - float size = .5f; - Matrix4f matrix = matrices.peek().getPositionMatrix(); - VertexConsumer vertexConsumer = vertexConsumers - .getBuffer(RenderLayer.getEntityTranslucent(BADGE_TEXTURE)); - - // Apply rotation to make the icon face the camera - Quaternionf rotation = dispatcher.camera.getRotation(); - matrices.multiply(rotation); - - vertexConsumer.vertex(matrix, -size, -size, 0).color(255, 255, 255, 255).texture(0, 0).light(light) - .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); - vertexConsumer.vertex(matrix, size, -size, 0).color(255, 255, 255, 255).texture(1, 0).light(light) - .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); - vertexConsumer.vertex(matrix, size, size, 0).color(255, 255, 255, 255).texture(1, 1).light(light) - .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); - vertexConsumer.vertex(matrix, -size, size, 0).color(255, 255, 255, 255).texture(0, 1).light(light) - .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); - } -} \ No newline at end of file diff --git a/src/main/java/org/auraclient/auraclient/mixin/NameTagMixin.java b/src/main/java/org/auraclient/auraclient/mixin/NameTagMixin.java new file mode 100644 index 0000000..08c71fa --- /dev/null +++ b/src/main/java/org/auraclient/auraclient/mixin/NameTagMixin.java @@ -0,0 +1,158 @@ +package org.auraclient.auraclient.mixin; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.font.TextRenderer.TextLayerType; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.state.EntityRenderState; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.Vec3d; +import net.minecraft.client.render.LightmapTextureManager; + +import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(EntityRenderer.class) +public abstract class NameTagMixin { + private static final Identifier BADGE_TEXTURE = Identifier.of("auraclient", "textures/player-badge.png"); + + @Shadow + public EntityRenderDispatcher dispatcher; + + @Overwrite + public void renderLabelIfPresent(S state, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light) { + if (state instanceof PlayerEntityRenderState) { + matrices.push(); + + matrices.translate(0.0f, 0.0f, 0.0f); + + double y = state.nameLabelPos.y; + + renderTextAtOrigin(y, text, matrices, vertexConsumers, light); + + matrices.pop(); + } else { + Vec3d vec3d = state.nameLabelPos; + if (vec3d != null) { + boolean bl = !state.sneaking; + int i = "deadmau5".equals(text.getString()) ? -10 : 0; + matrices.push(); + matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z); + matrices.multiply(this.dispatcher.getRotation()); + matrices.scale(0.025F, -0.025F, 0.025F); + Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + float f = (float) (-textRenderer.getWidth(text)) / 2.0F; + int j = (int) (MinecraftClient.getInstance().options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24; + textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers, + bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light); + if (bl) { + textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0, + LightmapTextureManager.applyEmission(light, 2)); + } + + matrices.pop(); + } + } + } + + private void renderTextAtOrigin(double y, Text text, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light) { + matrices.push(); + + // Move up slightly + matrices.translate(0.0f, y + 0.5f, 0.0f); + + // Apply rotation to face the camera + matrices.multiply(dispatcher.getRotation()); + + // Scale text and badge to a readable size + matrices.scale(0.025F, -0.025F, 0.025F); + + // Offset the text to avoid Z-fighting + matrices.translate(0.0F, 0.0F, -0.01F); + + Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + net.minecraft.client.font.TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + + float textWidth = textRenderer.getWidth(text); + float badgeSize = textWidth * 0.20f; + float totalWidth = textWidth + badgeSize + 6; + + // Adjust text position to make space for badge + float xStart = -totalWidth / 2 + badgeSize; + + // Draw a single background behind both text and badge + drawBackground(matrices, vertexConsumers, -totalWidth / 2 - 4, -1.5f, totalWidth, 10, 0x55000000); + + // Render Badge + renderBadgeIcon(matrices, vertexConsumers, xStart - badgeSize + 1, 3.4f, badgeSize); + + // Render Text with adjusted layer + textRenderer.draw(text, xStart, 0, -1, false, matrix4f, vertexConsumers, + net.minecraft.client.font.TextRenderer.TextLayerType.SEE_THROUGH, 0, + LightmapTextureManager.applyEmission(light, 2)); + + matrices.pop(); + } + + /** + * Draws a single background behind both text and badge. + */ + private void drawBackground(MatrixStack matrices, VertexConsumerProvider vertexConsumers, + float x, float y, float width, float height, int color) { + Matrix4f matrix = matrices.peek().getPositionMatrix(); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getTextBackgroundSeeThrough()); + + int a = (color >> 24) & 255; // Alpha + int r = (color >> 16) & 255; // Red + int g = (color >> 8) & 255; // Green + int b = color & 255; // Blue + + vertexConsumer.vertex(matrix, x, y + height, 0).color(r, g, b, a).texture(0, 1).light(0xF000F0) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, x + width, y + height, 0).color(r, g, b, a).texture(1, 1).light(0xF000F0) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, x + width, y, 0).color(r, g, b, a).texture(1, 0).light(0xF000F0) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, x, y, 0).color(r, g, b, a).texture(0, 0).light(0xF000F0) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + } + + private void renderBadgeIcon(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float x, + float y, float size) { + matrices.push(); + + // Position badge correctly + matrices.translate(x, y, 0); + matrices.scale(size, size, size); // Scale properly + + Matrix4f matrix = matrices.peek().getPositionMatrix(); + VertexConsumer vertexConsumer = vertexConsumers + .getBuffer(RenderLayer.getEntityTranslucent(BADGE_TEXTURE)); + + int fullBright = LightmapTextureManager.MAX_LIGHT_COORDINATE; + + vertexConsumer.vertex(matrix, -0.5f, -0.5f, 0).color(255, 255, 255, 255).texture(0, 0).light(fullBright) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, 0.5f, -0.5f, 0).color(255, 255, 255, 255).texture(1, 0).light(fullBright) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, 0.5f, 0.5f, 0).color(255, 255, 255, 255).texture(1, 1).light(fullBright) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + vertexConsumer.vertex(matrix, -0.5f, 0.5f, 0).color(255, 255, 255, 255).texture(0, 1).light(fullBright) + .overlay(OverlayTexture.DEFAULT_UV).normal(0, 0, 1); + + matrices.pop(); + } +} \ No newline at end of file diff --git a/src/main/java/org/auraclient/auraclient/widgets/AuraButton.java b/src/main/java/org/auraclient/auraclient/widgets/AuraButton.java new file mode 100644 index 0000000..373549a --- /dev/null +++ b/src/main/java/org/auraclient/auraclient/widgets/AuraButton.java @@ -0,0 +1,37 @@ +package org.auraclient.auraclient.widgets; + +import java.awt.Color; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ButtonTextures; +import net.minecraft.client.gui.widget.TextWidget; +import net.minecraft.client.gui.widget.TexturedButtonWidget; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class AuraButton extends TexturedButtonWidget { + private TextWidget textWidget; + private static final ButtonTextures BUTTON_TEXTURES = new ButtonTextures( + Identifier.ofVanilla("widget/aura_button"), Identifier.ofVanilla("widget/aura_button_disabled"), + Identifier.ofVanilla("widget/aura_button_highlighted")); + + public AuraButton(Text message, PressAction onPress, int x, int y, int width, int height) { + super(x, y, width, height, BUTTON_TEXTURES, onPress); + + setMessage(message); + + textWidget = new TextWidget(message, + MinecraftClient.getInstance().textRenderer); + } + + @Override + public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + super.renderWidget(context, mouseX, mouseY, delta); + + context.drawText(MinecraftClient.getInstance().textRenderer, getMessage(), + getX() + (getWidth() - textWidget.getWidth()) / 2, + 1 + getY() + (getHeight() - textWidget.getHeight()) / 2, + Color.WHITE.getRGB(), false); + } +} diff --git a/src/main/resources/assets/auraclient/textures/player-badge.png b/src/main/resources/assets/auraclient/textures/player-badge.png new file mode 100644 index 0000000000000000000000000000000000000000..b11daf6651d44d3aa465e8f3f1a9296417083b9c GIT binary patch literal 16902 zcmeHvWl$c$)8{@94#6!6?(Xgn!6mpm!QF$yg9mpBF2Mo>cMTdKxVr~;_v2r0-F6z~V00vN!SCe=XzW)E~|6AbyRSO^pp&-6F3*f4v zpbEg@3mSOD{%9Io+&VbBx!&JwjB(fJ$Ablo?a|{#u4i3`6faXL9B|jI; zx!9HCde4bJs7{o9d6zVk&QO5Tshc4m_BTqPoLMQHb3U-mM8)V+sT|LD!l~32C)>oj zwk{t45K5F07gh7fJkIij$gdC#?1rW?$i=7A$%(&rL#ZspqSuYAs3}tVlM)@3D)_T|x9-Ro>h+ zx(aw)xpj0m`j`0Mu3MG}Us^z}fyy$w`cqSg@;KX7izJWTw18G#*b`m8` z1+(tM>w7BxyJS%XUWeh5wN%PX5u9m(uyi+OQ~|Q#ZgiAtr^}>&aXf?d?6J#8UF{Pe zT2bo%e0*kr;en9u1-31O?Z^WuLfMV{<7p8ChG(<|kb&jfb=$ z0`X0vx-M5%&8aR6td5UAGvC8)ivt3=ygdv2)15DC(9apWhAs3Y?NB|$E+w}={!~BJ zMxM*S_Kto_hrLE0Po;5}@qzrj6_^K)xSL0Xwq=4A>_N{t(NPp&@#Huw{wz2^AaXaS zI%6f~kf1LUAF4a1CL)~G{>rlcmrt}{)~OABy$L9C5A5&=^6>UU;9lWYH7T%jUkeWb zo$!p7$1)&Irie;}Fq{yqEP)MTBpkJY{Ml$`pAOW6OXVtOg{}Q?9aK`w`-?;kI-@ANZ zk^LOGScuAW=z%G(?0Dr7*(g`fD}dps0W3;RA;%U62>NL)l?cIxpt_3kY#^e2!f#Rs?5GNSlZ=_VOcIPEuPSv=oH#TW`eE>1xYshi9Bj`_&E~ojn$*2HNFxbF4j58!@Xew)$^qc1 zX}V}vNH#K|iNC9b17C zuW`?B?&BFNg4%E;m(wUvzd@m*i|J%oPK^Y=4|gHUXwY*c0_pMsAL)AqaC-cuQZN;~AP>o$7yIURw$;jpWqcj{b;hejV_I8->)ThgUR7 zL>dJpgXm*tqjc&|_;dLfMr}Vgrf*AWrU@DbT?+a?KZ+CHAVaSFJ};71-7-;}t;wuT zFB*SVFpTo+ML0~H{upd%e(VLU0Asiw@vU*fSWfYro@CCTl!`Rl@og{uys?AGBGS}z zpM5FYq7{IHnlhd6(ZTQOP`W@*g4o9^LIrV?um z(xM6&N%6oeb$<3fK^K6a2yBZ1Z4G-Z>o^qkVM10F_>>{Q`g-#U^%qceyOE1)hVpKi z)Nl~6W3#gW6Z&Dp37Vv_hEHzkFD)rY$n!P=-Phg0))0S*{*;Gf9*z!)-ZsE|f8b}J z#4SrZ+lxyuHNnG}A*nX~$Z1anB;s3i@tBQI+E4h65M$7{&?E2Z1H!nT%38_XZ4kkh z(|dkvOL?H?MnH@}!`|qQldb>^+59)-eu9P*Md2X($YJ7DZSg_>1LdXk*G?V?LPTOF z_vf|6@WIh284$0XV9gw&?T-KWUE43}50&ryNpW2em9xl>i8Fy(WG!tQQ~9D?CSGHC zAh7GBm>51dO$yLDw3A$TKEs;}vwgL>7-m#uAanf!f_lmq;pE5Gs;m2_^gw6X|&n&vdi z?&#ypmcJSk6-Hu$CQ}TeXvDXS6C}DU31x3qV+b(b_hWC2CSX?1FRP7UgyP)u1M@s9 zKlclq+i7N=|IKbY#Ir2NK*&aSD(=Mz`W1x8`RMvh5Ctm+SD}{pwzP`pd$flKM=<{J zRm{+H+P6fGulDdm#`*5fqZJ%3d)%m#Ouzt9*;v_|ZDi8*ye)OnRXXu0AId(ktnt|4 zd{2G}H&R9|Fz$h*1Pg9l>@w?Hty29^2fl@RrDm5wy(BlvUx*O~h4x3px>xPw|Akwi z+sK@^F_4>9RdA0p=dCr}pi)>x^U0L~-G`pNhoJTs!PK}{ypZ@d$$ug&ga)&S)yF^6 zw>6$hH2adR{%k`$Z=a&JGMo8IWmV0(m{=m?pQSJp~-S#IblTINC`Z zb(X>?5avHz34dXq>$pVB?Ieh?^BZFhWgaH|3|=QW$XBkY{wN(kS>y>{>pE!vZDnpg z%X`BCP49~fe(l!lRPkapsn4&nG9BGGtb{Ie;`)ZkTFM_1z?0GARrWrqoJh6PbjL9F z${#!U%_*hIU$>KAJ73JJ50c3qr3RFV{#u2locBk*tuyT{zcM~aFI*?UqkO=#lw7npP4B6jK28tRNmAhD zrfBs#;HYDBHAvDt-Z$M#Eko#dt>N)ejVF`O!?TMyx2I#BR6Bt=)&^XG7*gB4l~97t zD&7oqyBr^U7C@@wn?0E@iQf33+Z&-C8&&r3$LU3R%2nWJszE-#rV2~T+h8;{+V4Au z9DG$~gyPhe$8tl$ijh?aW{=s^1I?7~O8pKbyp~=#M}DJQKhU^$)@DAO&k9+2NBFak zTTRNNh#aDC_qCQI%ffZ#aBdm2%aBq9|E_SuSICpTmUf)i8Czdz^zZX$`P;_UHnPzd zX0;gZrYI0ERDm~cx##?s!H+xn5QGfZHAc^9xqxH2JUrvazQtXroI<4L<$tvKWXDfU zoY;Ev_1Vf5{vxQ2`nmDlU-zcF-hJ)*l0?7^jG=$Mf~^J9yN0je&`~k!I;2{I5{QPL zp+zRwncWXx_qapA?`mk%3S+9U?b8__ph>5mg<}RD*J;<=5*lA-v2u-ccNN!==(e4t zH|XwnB!qcs3Y2gNTY@p83E}t^DYvLRO&9?im;d0m>Y1CIOv>PMG@!EMUycH01{f z@DjI-k-yPehVgnM#3`@u2Z~mcTN9?yVnRG@Iu$ecfrU=r*v?m8>5+vGw&|qojH!EQBde zxDSX_O$+Vue*sIgkiMI^&7>jg#3$7U8a#J7@QYxmR`ezcS5skiwtU(g=AtapJyQm| zd{6XavxIAqX`lCDmhSF(23K3i-|+G_?w~QGS>H%i3cvVu!iTZ@Tqium;U`D!?r?nM zrm(Rp6h6?+H?}a5&?Q9=L|V~NA_11T+s0j;mm8c99l1#>h!rp1?>HnOHC9l<)B08# z*yu-&tFnft0*CS1+pa~hcdz@oMR&Ow;dvlG|L{8E)>N zfK}9(?GGH47ta)_?xx8$`ZigZgq}RnOo?zABAc_apc1XPGzL@NCs0ChUaKjJnc&%; zWD@S3DzDyWgetoT>QUdd3P14>S;`>#Yt3#Iu<^-#Qh5t0pTD#=AdXKuj5n~EOYtS> zB|0-w%`COa06JKHO&t6kY#-K0K7b(@?b(pkQ^D0*CG50dfnoFsI|OjZ;MTcbiv7HN z_d$3QaHmt29>oAxiV(BFG3CU12rlM`cqDl34+_XH#F?(pKXm2j=CI5MLq2+cAlL>Z zJTC;2_U^JxV--(=-WxO$Ht^t!gGWO#r!@2^?`f~i!T*p=UZzk{}8^CC+-?Rfckm zb|B9q_~B>Tc_wdqUp}6mwjYfvdLR6XBnitCM0XL0F1nHn!F?|RLNHVJ?_pA}j~D*|)DXOrCMT|`exD{YaX zX+QNl&**$}it(R(L^9of5sOb`rS;BkCT>&POO>@H%yX?8@c=jw@lQv5nb_D)hz$2n%eGaOAbB80VCM6gK2mYv$n7zv zoboOU;_?>O>(V*@#>n8ljZva9`ICbh2U7r*^5cr|bI^Ca& zpr&TdRD#+7xq615w@CS8j1xe7L5btPC$|iSuuBzfu*u51i8#yzwNwdg*idG$5Ir3F z-ySR_*67y2{}IVJjqP#Qn!ov)gts~eY6J+;e<8*nl#&xCZD<_H=<9I=6!z5q`AJ9< zw8H%QEV6@s{KNA10IG_2Kwx8-;F&$jIxcjtL@I4M61j%j(l(E^tSon{rJbkj0r(pJ z!?ra*|NZQ+euGlW@O&OyrQ^qtbL1{^5$yvo>FY&t!xr68zouyBE|YOGYQqtC_QJci zx&ThTRQzV816A+EjWyIe`d&I9QPLV|@|RVs+ZOS%SnNB*D17l?wUyOhJSHWrEW;4? zTBb&sXg+Vw4kqDNL zX==Lq?$lJ=93bk;gYlSfmeg@`j#~GW68*ORom7Md4T?ltiwVTopu%01=EI^Y>#AZ;}qoxp7de z)w@_g+~N8Yn-JvELNYqd^=Ijiy>rj=k z0ij9u7ID%=;CU51)Bf*$*;>jhB;albEbgY!A~Fl-$TVR`*a6~&1%#Ff!wb1~jekDi zFux3cWL2Fm0BMM+>$2ing~|}3+b%-uIa6V8ESXj)BgKG2{P)K9K&r);;Lo=_xvmcg_ZheG zH7MDxYxu)smVdBzcf z(bH-U=0t?4I)X+U(S4r;R6H3Sflm`6GfVdhi(B#Z(5&4{B@)2a`ehps&siBYDpjz&4^zn64CI-gt40#^_!&U3fS{GwAi8IzNF^s$m?r%LDc9&ls4g~G zl;+B<5Qhd__u@hpv)>-$;N50U8$6Jyk{Othlre=*LbGC?j78!^Sf3#{uO*8f!36Yv zNyW6jwccly4(evX*{|~fvJp+OAAKkKG%2o<1|X&n4v2UNKJ>56=WD-A{Vl$|=*dm5 zJ0ta|R~oNk=mK$;KZ$+@YP_FUy8lE~8VbL`hl)+oj#P|N^ZBePRbB!EgXo2l@%1|o zUASwQ)pi8Bwdp&j-J`IyTEG^>YxS{!nB9`qj3)$Mi;|(L8ugc>6~e$uKOe%hU|l8d z`h<)#hUFp}!IK@2n2(;Fxh?nLbDZk1^z>zcD$B01FtsfR$Gs6k6q4Eo8bW^e%|yS= zO3J2rt;fO;)m=}J$BZ{C{7YwEmY%BnU&*Xf>#w0TEoRZ@WIP6wM+`IL!WUC&J@5X8 z(*Y$}Xa~$uUTe%aq1(=B9EX@4yXY);Yc@U<6B`L!hKlaR_lQoiy#Y=IE6xlAwHxF? z#~oXl=ALmpP-|Z%Q8{V7xJ99lHt)J{psHhHB?V`5ZaDqha>%@zP!7oy@m=N)G+ZP> zF9TjKAG`o_P@>v%M6?6+X3g+R{&}JV-0omTTw1$?P(8}hS`U9gEFH9`adQHe^qjMZ zKErMy%IYfpU7InR^R3oqE2~eTHT@IoM93&x*Y(Kg&7yk9b1(<|*bGU1NFBjKrgbE@ zap2=MXCG}i9W=_#@)7cBk1?l(3gXl4yZq?QOu>1kUy^A09FH(p#AV1jDSM{Ar`lIQ zSJ&9g7Tmiv6;zH4Z!op2= zOAzUb6j!azPIi&$1Kdnsz8;TZj&Wa|3wnf1*Fz;B80n%-b*Fw&0>(&Pzo~HgFwqs< z(DH0y;GGN&Vf=mCbmFO+e!1ALD-$o#=aGK@2f_M-roL99SdZG_pS-zqE3oVKr1|OM zCS+q9m7lhth_#ZrpAwJ*hN<5{?!_Gfa*obR3)f$0{}I2inzpT5H(hj+ttj#^y#}r) zS=A}PFjO5ckkkBg?E5Kci#`2t=yt(V3EQKvok!FG5SgI~JgkD^0YTX%%xqfxT*I5I78lN)f{ ztKZ7Zh9d!m#QZ|y0Ed6-FcruKeuIbo%X|qaDyGBshbCDA5wkz2T|w|1=+c9lZoh|c z69_K|5VsSi05S5S)y#+%Hxvv`J2~_4c0Jgk+xSbxYyD2i4UWCPPCF&7O+H7^_1rjD zTrjuffg}#5ZdEG4)jm5T7-TA9Xah~9&nTsN7AXpY}mY&yKh2s6w9 zGD+byrjniEuvmRJOAgRP@Hj_9yN$Vz^)1)%XJrlsu}4Kdui$VxQ!c(gD`9G(_!tVj zQ$Urt?`;Xrul1mAR0F{XL_JsSuUIdSPtpXRNpRrr_?paLSzrS9gqWtHx zow~GFoR5cVm*Byt4;sHy=6JjYvWiB1onD#iexDse3rh-FJ5Ik6;Hy6eG%XRzn;@I6 zU1u`lxd%{1v0xZeVZF4+Tp;Cdyf@vfzT;TTn+)u@Y>+kxo!nLQ%9mRbR(qg$pS}$F z4tL|-SayK!kp^}&h-CM?TB^pbrIIuu7)>ZFmYcL*!>E%F>flfkc4`!!zx`;=ZNSTa zQhGzYNFAJ?H&EB2>>2TrQ$!nf_gN!Xv78Ooks8tLKJD@!in&<+^-=|4h^Iud)`?vs zp1^?wuHb#tB%WPP`qI%?BL})~(LJtVD}@ZbjQK7_Z0cpZ$l%xl(+q({!WlzYIpA0y zUE^6)uY^lOpnFN+YZ@QYvWg|Yu^Fzwu8QS3+>TKcl}ds8>xbW38OZn43WZ;1z3SXR zp;A&R{JUp_p;!v@8$(pnpWcI|NxrcQrwgPR*PA3AkH#7+cP$VQhKk%GC_Y(JjnCez+5Xo!wRUuk`J6i=|kYU5n#KdWw<$ zycH&eFJ=&REs{Q}y!|k7J?3U2S~+_Cax1R77&UBpuY3eC+B13|=r_h!QHuHTf_$2{3wQ}wT2OUijlGEjy4gsBoJP4b-ise&X6>Kd2y0jE zi%I{LMtZ8TISrIkZ=3;h??0m8>i!&I-1T->ZOMsq9-N15Hnc79dh!@N4dd&L@u+Sk zhTaqtt&v~}i58X75@(yP*EmC7FTMpQrb0J7h*UeT`H)^R;1K`#+^)$KcCF_-eygmo zT95ZM@?c3ap@gv-cE52DFf_YlMYj{S?yPIqW3{-yfKM@B;kx|U5#eW*liZJKnpmrO zGU%y25`+AC#gPQpQwJ7*rSHl!>#CexwA-2K#0DcHX4ixA%8bXRr}dprcQ^W3xY@Hl zd+gC(Yi0-)7(-7nqesqTGy3qZ3gYtQvoHtU>AgWGS2Kt)3I{yWmBl>eoX>a8Wf#10 zn2=Ew{_2;EXmyj#lLKKzy9bi`zf*^%?92!PF?IVTfE=ng%{R%*W%t(#o2^9`>^AB8 zWH*960eogO8VwLPdSp|rqiH1IQLyPE_+yuWL2BnO$37CM%5yW&S0Va6IJQhj%NS1^ z&IWe9X}u6Z`0zxE3wF-!z1F`x0YNPIbnP~#A|bcyL=+oXsOd@G={cX^&d zdiOSO3KCKM@;&6EKo>A1-{CKrf!tERd&$K`#&yXZg+o>(zf|TQUK*&}zjVqb%S!L1 zq@d{5L)y*O0!|MbaCI*zF9y-8o|#eNhErfh_XY(c3xyrXgt(Cry&&Ft)?BkkpkF8v}}&P3q^gR zHN^?YdJWFvWE%8Xj2dCZ%%8w&Jp&8{e_M*D`-nH!Ms$^l4GRc z!#jyInCxleT*Q~#waA(ekRh9xUYzv=;I3UDet)!cJ03s0{`to%nm2J}osC-zFPyUs zz`alD0rQe?C#JVSF6wll^B8Pl#~U2cLI;%t|FNo+sEZi7L)t7&gFSPwSn*vKh!Gd# zD0GwoP`E!}RphffRvJ+1f;;lK&NE#OD_nPy?gI+*Y)#NoVb}F;i6`j&dVDhDrXM=6 zg~hL9o|)*a`@28#(0(XKoqca81b4#s>(c_?J63 z;(&yh95NTQKU=tJs*jNHEa85RF!RUGuD?gWbXl}zouz>=!#@cmh%obmrBqY{VuUXH zXiS+`CoXEm$~9@ke3Z~(d($Niy(j)HWSMS1wcg=MajoG^k8Uzh+sW!TBUJwccM<4y zt6P)fTFqSXO9aoB8SM}mXnsyiMwXuAENIS&aK0)rX5?E1hQq--sSghvXh^vmMX#9U z8!U`m=)&Z!3h)rLG&Jw-pq^}b*c|V-CQ*zg_@y(f(fBehxUoZzy%H}fsRgtVd>~s< z07gzn%MVYOXFy?UMRekWD8Fa*i_X2~7QP?a^2?tOAVl*YYm{oDGxK!_qndw(zlclh zhy)WKpMVvucqxF1^ky}}suCf)4`sgG=j%od+q%ntCnu%4W+9`9z|c@Xz9d$ZprObp z?A0f+%c~@ZPF?{GDF~BpCMMJ@t1l5z9U2&qE-z8fNq#2s)T1oBe92^KOFoL&byKU3 zn1`%n$#5Y3CjHX%du!LJ`5#{{g2mfsZx6;?kkp}{{2s+1_Yn&NOP_E3?Gvtbrg0r* zdp>}Id59!G-+Vp9s6mb5aaocrPWd6r`iS3j4r4Qv z2i3W4dRVJM01Mc-NsiQX*wHf^Kl~O!kNfXaf7)>KMfQ|MvOG(ZU+^i@9QB(9v0nAx zTG0~|4=Wa2a4vYlr!Vk{-sUupJ5ho&rA$q3&*Xf!G2v>xr&{9@eq#lHGXjV!YSfYK zl%+=AA)mr&sy)(rS5>+#nkfMth$r7!Tb2r=KM;0$X%e$mPn z=PW-CH)n{bx;^D_Z*91OeAwjKh2_AsqmwypB8TF%7aWEs4N#Z)a~-q-;+_2~@QNKi zWagu^9j^usaI3UPqx(EC+;Cs)(cd=jg!arelB*CC2%IjpZddaUyGf{MYIbSWVvQ1MygwEPi5-BOSqCUnb|fgVmt=N8HwGNXC6*&d|Ryre++``JR;XxaE5Kx9Rh z*q8m)_?H6aBzdy41n~8cUzH9pUOS1VEAJpY9ySb1YH#SS;&g1x5`n0VnEzfF&L3wo z87(;3CvHiO?&%-F1@ZQksMO+L5xFtc4o;sS9(8(mZWbFL?)iOIN0dLcrPIzatoYdn z*lvlq4xCUlI(mL{mIQ)kRq27I`eK$s6wt(h=UV?upq+i;k4#BS*bttfrtRvx+XaZR zwTf}SemwK4?whU9GKlDK0mXrQ6O3eJ$B*Bi?55CStP-R&a-AobvLwedvPiNJ^JyVNH{*BKLZnX128)8vJSUK7-IaW=sPe^T(n zJdr{!#gO;qqIfIY)HU`Zx3xLl z^B!qaR?Woma9!~1r-FQP{pZBTe&ikEpxP!{och)mnHneJ_=~%uP9mmt{hrf^gn@BEVSQRBQBeX~vGySZ_Jy8A`*#fq!QII*Y+pJsB z#ZQ0oxre*0NiSz$YAUpS@K-aTct3L_2N;7&dHa_#uH(ZI?c}Kjq4oOE7GK-tI901T zxuYb2$hj_*Pij%#%n2!S$kyOaij@Mik)Dz`{RejPeq5Hx&X$8CHnR zNT0R#Zz0GnzC1#@mk4xb@DSMFMe*tPAr}&*BCMUoGAh@C@+bR3@i$1J;i;OigBsly zdRv?zfQi%2y2{NFZuWud4J?h3>c|R&0MHiAO+BDXO*x-k?`@n}K*0JnQ;& zqlUwvuU_Sd;J-K>GACY2XwZ_`P!z2|chmeUUgA&aH5y4k)(vf_7??Kule-^@$2Uo! zv>BO6_qfPP3WbLd3)(tl#;^CukD_(K(o>o~7!(HEg`$@CV%e2L=<5wWt0EeB18m4x zg5NYi3ay`T9W`~)ep7*>o*=W$UO=yjIXX(wYeU^zmDaWKrVLJ#{i)a*H_q`JB17Bw z_`?FNH{h-+dzc~RyThL#Iq+El z@=tVOs$dK^J!^#m&2fjW#nzv01>PKi@Vr#Os$ILr^bfQiu?|IrEBO8s1>9vUX#DUb zcdt!6?uP#(Q`nRXBwo0Q3Yru~_1crl5b%+7Tfq|jUI*P-4*1h6%v~bdxR)CzvaFLj z2p@;m2-_v6bDK8N_nz=_#}qw=CgX)D2B}NKWrz~%CmF=AjW(D?ikd7231YhJM4^iE z`}AA!d|{TaqGp5f&_){IkwTHfCX7BewOnHb;L`YfhuVPG_1SnR3W>?PtaclU1mj|7 zfL++!=J}i?FT|R$onD|h4ardfSS)?0dxY2gJ(V~}w|Y?}(8~uxRJrDqF8xLtQhJ_k z{n*R`8byNgxc%hd!^JEdH;o-od&o~wg1v>sSgVX<;&9vz$o786)g*+wo(*_}Xj4f4 z4Cg&y!1sAh>fX5q5a5j3jo@Xt;(^SYKL=vmVYpqQAYQMQe43F$BBw$9j*s{8BvwH| zV2tP+c?(y$Gj!zLsF;%7G4&-@1h}pY;??x*t_=?-1rnd56!;KNDY{@TFov|FdjXx- zh;@}E25s?K#nifcEys8J(05gmZ#%`Co4l0=npaCbDhs0*gsgKI^+uZq0bN)qV=ZyW z?Jl)GP|f1@}f!CVPnMz?&P27>Y!>GpqGOs z{kBP9j(gLSbd%;;j5#T*}vz@jbP8Xl~nZTm%Pd!(gLlUnQowTY7+g19A!wn^ zqJ`&n&w{)p!om1;(CQN>AMZ!-6xtjKqjy>Dmab-6?y6SGkH#Ym$oNP^Lk3S)jNb@} z$B2`Z;_zQQm)MAlWF#9Bza|2D>xy^pc}jWo;saRb6v?3eQw>E&Q@o`=z%&%Y1J zEsQc$ivo)Xp}vZ!YgXfo%l;vjZH6CPx#6nm{x(i;NSEg-pAN>d z%Mxgf&i*2Iir|%QEVR{CX2gJ&oF8jlJ9G-yqo%I=NyrPIWc_~7?jk|NZYk$WrEALa zJASa-Uci=KB#G3rt^Gdrx2{Jp`CH7bivd-E@1;y1g_*qja2s$}5Vh&x?;lsS7P+f< zu2YL4qeKJWBk?D+$@QQ?{<$|kmg2!X>~FbAG?CZ4!P)4=o%H(MNQ=l&nii|{4slGu zBaJ!=jRtr&CLo!Mgjg}-%7xLN-+w#)7O#Ecu<{+22N|%IY%BIO(_vz+^K;?g%&LBF zKO}0!!gJLng~H)5!PDl#^IASdK{#g%uf1|3Y&rqKJ#0m*rea3y=-$3t+GP23goKq2 z2rye)e?3`6d#T_*PXg7#*if!7&M3(cWrc0Ab0?lU&aCJHzdo&~AR#8I+^$MR#_xB$o3re5Fby-Fc|?`;+Q%$B~W6%ussiqx5WTaPZT&G7icCL->maADiV)6!v) z@lZJy?|+^g&>OA={@d73EfaXZo;E-4*HRTXn$%q`mgzN*-$?Qqm$m6#@RzZlp03RH zj{~G={`_pyR8;@473QEx(+Z)C*JuTB?Tz+q;>%-cT(IZ5I9bRYFwcu~xT#0s3sZ%U z;3r+`ZwD>-$Zc4EM3QDjQ>EeLb-|t+6c#tm+pkK{9TACZFR+)A52xyH%QznxmY~_K zn;#We{cupNY&T_4Cb=q>1)Fmq4OF&V8H+eaEP%WLj_pZ&?lB zi^6U)Qh&V!dAg6N1!(rl;w~6m0%J zM|p8!Yt(5o#$n}k^Z`XhY6DaOSSYL=%hbhhb0$+^4TctnuPW8>0pT;;x0D;O^a8M5 zwX$<}e-58cwW8#Hhy%6~tL3%}?HF-&m6;T~6! zUrZrU>a@TL7LXrtE`YU?zg+|rh@vb^Q5{&-0`(aE zbNrL2J3#_VmWn^kRedi&%zaoAa51QQev$bt^+j$H_ogIX?}UG~X~qm2l6>2EVI_S> zycH@E%1-naHVG~T={9_D@};NMXcurnnToz6dP^pq50<62XYXrZP>9fr&wV$$r{$vn zh!bW``WfVyW5I<9h^M!X#*y+;cP+^*FoxAS_e-N()4I419OEz;|2ItMCrQ-VI%MJteM{*Cu#SSVlxv-^rgV zEY^wboII|^avBfgaFXW%XN8mGhSy56t{_uIIk^U@0LamA6!X6!h3`O--)y(j27GC$ ze{vNH?N_{*GWOTs%|zw|Bf6{y7XZbLpwRz4>4?F zvC=*L2k{2fzb?c{Xpj)%b9;RdtCNtm>}$FgAk@^K4o0>h?s3XXq2uXcr)BP5^7wL( zx>Rz7pk$eZM)rTwc0AWL`H~1!J(NXS!@CW>mw=dERLhnd?oaARy3!?0SYOJ;hYy2d zt*kIi$D@>R@dAP)7|8n1Y=R>?BPa;zuC`_KxoF9{x&vStl#roIv~aoW{~g6K0>72k zk-6Q;=D}3r-!5R8FATkQ{GXYj9NxD98t&h>kh1tjj|_6DmiwQ-njg7?f{8put3+kz z6;O&n$*-k2(EL0cXkfvALqT-V0y=~}+hIdXU(>6bD_{$0RgB2Q)n5SlrWJ^qQz))y z^JibDFK8@AkTVx!w*UU9+ts-C79X89o&AH%G_tb6F)q;IypQ{y4)6fA{wq6d`98o zqMH2oG_-=(pR}5tDc|^Ga+p|i^o48Hf7{dlX@#CPAcf64rKGs;v*f9R-!Xr|?OIK+ z5!}%t8vH=6TJprBzf!o#)l0B4GW5MHh&4(Dfc?KIZsY@-SANf{brN(gsB~gGeTRmx z(%eSB$ZEPJKzI5N*N^8eE@?K>9}deAULT|!@{2j&LnFb`7ThUB{KnuSUEs}&DD!au zAzC;HxhyE|n+kB1ivxuJ7d!suYyXk{heiJ{>HkvJ!+{iV$TtFTOYU!XLS|&69+x6r i=%-=rH#YMX291!BK_m+S_w9ELfQ*EK_^(e!f&T+-XG>22 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/auraclient/textures/player.png b/src/main/resources/assets/auraclient/textures/player.png deleted file mode 100644 index 559bc12fb46cdaffbf02fe62447f7ef039f753a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9940 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 z