From 9c9d3c28eb3d25386b02a0ebb24114a0e79f3c57 Mon Sep 17 00:00:00 2001 From: ayunami2000 Date: Wed, 6 Jul 2022 16:38:13 -0400 Subject: [PATCH] make it actually connect servers now :D crazy right??!?!?!???! --- .gitignore | 1 + README.md | 8 +- .../java/me/ayunami2000/ayungee/Client.java | 9 +- .../me/ayunami2000/ayungee/EntityMap.java | 81 ++++++++++++ .../java/me/ayunami2000/ayungee/Main.java | 42 ++++-- .../me/ayunami2000/ayungee/ServerItem.java | 17 +++ .../java/me/ayunami2000/ayungee/Skins.java | 115 +++++++++++++++++ .../ayunami2000/ayungee/WebSocketProxy.java | 121 ++++++++++++++---- src/main/resources/config.yml | 9 +- ...gee-1.0-SNAPSHOT-jar-with-dependencies.jar | Bin 803871 -> 811105 bytes 10 files changed, 359 insertions(+), 44 deletions(-) create mode 100644 src/main/java/me/ayunami2000/ayungee/EntityMap.java create mode 100644 src/main/java/me/ayunami2000/ayungee/ServerItem.java create mode 100644 src/main/java/me/ayunami2000/ayungee/Skins.java diff --git a/.gitignore b/.gitignore index 7a89cb1..8d150ef 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ web target/* !target/ayungee-1.0-SNAPSHOT-jar-with-dependencies.jar +test diff --git a/README.md b/README.md index bc8d902..8fdb62b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ lightweight bungeecord alternative for eaglercraft servers running protocolsupport -Thanks to LAX1DUDE for very small snippets of EaglerBungee used in this project (specifically for the server icon) +Thanks to LAX1DUDE and md-5 for very small snippets of EaglerBungee used in this project (specifically for the server icon, skins, & entity remapping) -**TODO: skins & capes** +**TODO: ability for plugins to change a player's server & built-in auth system** + + + +**if you have questions about the license, please, reach out to me. i just put the license i put on most of my projects on this, but if you have a problem with it, let me know. diff --git a/src/main/java/me/ayunami2000/ayungee/Client.java b/src/main/java/me/ayunami2000/ayungee/Client.java index 5d9767e..f6c128c 100644 --- a/src/main/java/me/ayunami2000/ayungee/Client.java +++ b/src/main/java/me/ayunami2000/ayungee/Client.java @@ -16,10 +16,17 @@ public class Client { public String username; + public int server = 0; + + public byte[] handshake = null; + + public int clientEntityId; + public int serverEntityId; + public void setSocket(Socket sock) throws IOException { socket = sock; socketOut = sock.getOutputStream(); - socketIn = socket.getInputStream(); + socketIn = sock.getInputStream(); } public Client(String uname) { diff --git a/src/main/java/me/ayunami2000/ayungee/EntityMap.java b/src/main/java/me/ayunami2000/ayungee/EntityMap.java new file mode 100644 index 0000000..983febf --- /dev/null +++ b/src/main/java/me/ayunami2000/ayungee/EntityMap.java @@ -0,0 +1,81 @@ +package me.ayunami2000.ayungee; + +// https://github.com/LAX1DUDE/eaglercraft/blob/a8d5c856de28ba2a263abc055d7b26d50dc2bf7e/eaglercraftbungee/src/main/java/net/md_5/bungee/EntityMap.java + +public class EntityMap { + public static final int[][] entityIds; + + public static void rewrite(final byte[] packet, final int oldId, final int newId) { + final int packetId = packet[0] & 0xFF; + if (packetId == 29) { + for (int pos = 2; pos < (short) ((packet[1] << 8) + packet[2] & 0xff); pos += 4) { + final int readId = readInt(packet, pos); + if (readId == oldId) { + setInt(packet, pos, newId); + } else if (readId == newId) { + setInt(packet, pos, oldId); + } + } + } else { + final int[] idArray = EntityMap.entityIds[packetId]; + if (idArray != null) { + for (final int pos2 : idArray) { + final int readId2 = readInt(packet, pos2); + if (readId2 == oldId) { + setInt(packet, pos2, newId); + } else if (readId2 == newId) { + setInt(packet, pos2, oldId); + } + } + } + } + if (packetId == 23) { + final int type = packet[5] & 0xFF; + if (type == 60 || type == 90) { + final int index20 = readInt(packet, 20); + if (packet.length > 24 && index20 == oldId) { + setInt(packet, 20, newId); + } + } + } + } + + public static void setInt(final byte[] buf, final int pos, final int i) { + buf[pos] = (byte) (i >> 24); + buf[pos + 1] = (byte) (i >> 16); + buf[pos + 2] = (byte) (i >> 8); + buf[pos + 3] = (byte) i; + } + + public static int readInt(final byte[] buf, final int pos) { + return (buf[pos] & 0xFF) << 24 | (buf[pos + 1] & 0xFF) << 16 | (buf[pos + 2] & 0xFF) << 8 | (buf[pos + 3] & 0xFF); + } + + static { + (entityIds = new int[256][])[5] = new int[] { 1 }; + EntityMap.entityIds[7] = new int[] { 1, 5 }; + EntityMap.entityIds[17] = new int[] { 1 }; + EntityMap.entityIds[18] = new int[] { 1 }; + EntityMap.entityIds[19] = new int[] { 1 }; + EntityMap.entityIds[20] = new int[] { 1 }; + EntityMap.entityIds[22] = new int[] { 1, 5 }; + EntityMap.entityIds[23] = new int[] { 1 }; + EntityMap.entityIds[24] = new int[] { 1 }; + EntityMap.entityIds[25] = new int[] { 1 }; + EntityMap.entityIds[26] = new int[] { 1 }; + EntityMap.entityIds[28] = new int[] { 1 }; + EntityMap.entityIds[30] = new int[] { 1 }; + EntityMap.entityIds[31] = new int[] { 1 }; + EntityMap.entityIds[32] = new int[] { 1 }; + EntityMap.entityIds[33] = new int[] { 1 }; + EntityMap.entityIds[34] = new int[] { 1 }; + EntityMap.entityIds[35] = new int[] { 1 }; + EntityMap.entityIds[38] = new int[] { 1 }; + EntityMap.entityIds[39] = new int[] { 1, 5 }; + EntityMap.entityIds[40] = new int[] { 1 }; + EntityMap.entityIds[41] = new int[] { 1 }; + EntityMap.entityIds[42] = new int[] { 1 }; + EntityMap.entityIds[55] = new int[] { 1 }; + EntityMap.entityIds[71] = new int[] { 1 }; + } +} \ No newline at end of file diff --git a/src/main/java/me/ayunami2000/ayungee/Main.java b/src/main/java/me/ayunami2000/ayungee/Main.java index ea5a2e7..9349782 100644 --- a/src/main/java/me/ayunami2000/ayungee/Main.java +++ b/src/main/java/me/ayunami2000/ayungee/Main.java @@ -7,9 +7,7 @@ import org.yaml.snakeyaml.Yaml; import javax.imageio.ImageIO; import java.io.*; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLConnection; +import java.net.*; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; @@ -19,8 +17,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; public class Main { - public static String hostname = "localhost"; - public static int port = 25569; + public static List servers = new ArrayList<>(); public static int webPort = 25565; public static String motdJson = ""; @@ -28,8 +25,6 @@ public class Main { public static boolean forwarded = false; - public static boolean eaglerPackets = false; - public static WebSocketServer webSocketServer = null; public static Map clients = new HashMap<>(); @@ -107,12 +102,19 @@ public class Main { }).start(); } + servers.add(new ServerItem("localhost", 25569)); + + List stringServers = (List) config.getOrDefault("servers", new ArrayList<>()); + + if (!stringServers.isEmpty()) { + servers.clear(); + for (String serverEntry : stringServers) { + servers.add(new ServerItem(serverEntry)); + } + } - hostname = (String) config.getOrDefault("hostname", "localhost"); - port = (int) config.getOrDefault("port", 25569); webPort = (int) config.getOrDefault("web_port", 25565); forwarded = (boolean) config.getOrDefault("forwarded", false); - eaglerPackets = (boolean) config.getOrDefault("eag_packets", false); List defaultMotd = new ArrayList<>(); @@ -168,7 +170,7 @@ public class Main { switch (pieces[0]) { case "help": case "?": - System.out.println("help ; unban ; banip ; ban ; stop"); + System.out.println("help ; unban ; banip ; ban ; send ; stop"); break; case "unban": case "pardon": @@ -229,6 +231,24 @@ public class Main { System.out.println("IP " + pieces[1] + " is already banned!"); } break; + case "send": + case "server": + if (pieces.length == 1 || pieces.length == 2) { + System.out.println("Usage: " + pieces[0] + " "); + break; + } + Client targetUser = clients.values().stream().filter(client -> client.username.equals(pieces[1])).findFirst().orElse(clients.values().stream().filter(client -> client.username.equalsIgnoreCase(pieces[1])).findFirst().orElse(null)); + if (targetUser == null) { + System.out.println("Unable to find any user with that username!"); + break; + } + try { + int destServer = Integer.parseInt(pieces[2]); + targetUser.server = Math.max(0, Math.min(servers.size() - 1, destServer)); + } catch (NumberFormatException e) { + System.out.println("That is not a valid number!"); + } + break; case "stop": case "end": case "exit": diff --git a/src/main/java/me/ayunami2000/ayungee/ServerItem.java b/src/main/java/me/ayunami2000/ayungee/ServerItem.java new file mode 100644 index 0000000..c9bd731 --- /dev/null +++ b/src/main/java/me/ayunami2000/ayungee/ServerItem.java @@ -0,0 +1,17 @@ +package me.ayunami2000.ayungee; + +public class ServerItem { + public String host; + public int port = 25565; + + public ServerItem(String h, int p) { + host = h; + port = p; + } + + public ServerItem(String hp) { + String[] pieces = hp.split(":"); + if (pieces.length > 1) port = Integer.parseInt(pieces[1]); + host = pieces[0]; + } +} diff --git a/src/main/java/me/ayunami2000/ayungee/Skins.java b/src/main/java/me/ayunami2000/ayungee/Skins.java new file mode 100644 index 0000000..872bed3 --- /dev/null +++ b/src/main/java/me/ayunami2000/ayungee/Skins.java @@ -0,0 +1,115 @@ +package me.ayunami2000.ayungee; + +import org.java_websocket.WebSocket; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; + +public class Skins { + private static final HashMap skinCollection = new HashMap(); + private static final HashMap capeCollection = new HashMap(); + private static final HashMap lastSkinLayerUpdate = new HashMap(); + + private static final int[] SKIN_DATA_SIZE = new int[] { 64*32*4, 64*64*4, -9, -9, 1, 64*64*4, -9 }; // 128 pixel skins crash clients + private static final int[] CAPE_DATA_SIZE = new int[] { 32*32*4, -9, 1 }; + + public static boolean setSkin(String user, WebSocket conn, byte[] initMsg) { + if(initMsg.length >= 3) { + try { + ByteBuffer bb = ByteBuffer.wrap(initMsg); + bb.get(); + int tagLen = bb.getShort(); + if (!(tagLen >= 0 && tagLen < initMsg.length - 1)) return false; + StringBuilder tagBuilder = new StringBuilder(); + for (int i = 0; i < tagLen; i++) tagBuilder.append(bb.getChar()); + //int dataLen = bb.getShort(); + int dataLen = bb.remaining() - 2; + String tag = tagBuilder.toString(); + int offset = 3 + tagLen * 2 + 2; + byte[] msg = new byte[dataLen]; + System.arraycopy(initMsg, offset, msg, 0, dataLen); + if("EAG|MySkin".equals(tag)) { + if(!skinCollection.containsKey(user)) { + int t = (int)msg[0] & 0xFF; + if(t >= 0 && t < SKIN_DATA_SIZE.length && msg.length == (SKIN_DATA_SIZE[t] + 1)) { + skinCollection.put(user, msg); + } + } + }else if("EAG|MyCape".equals(tag)) { + if(!capeCollection.containsKey(user)) { + int t = (int)msg[0] & 0xFF; + if(t >= 0 && t < CAPE_DATA_SIZE.length && msg.length == (CAPE_DATA_SIZE[t] + 2)) { + capeCollection.put(user, msg); + } + } + }else if("EAG|FetchSkin".equals(tag)) { + if(msg.length > 2) { + String fetch = new String(msg, 2, msg.length - 2, StandardCharsets.UTF_8); + byte[] data; + if((data = skinCollection.get(fetch)) != null) { + byte[] conc = new byte[data.length + 2]; + conc[0] = msg[0]; conc[1] = msg[1]; //synchronization cookie + System.arraycopy(data, 0, conc, 2, data.length); + if((data = capeCollection.get(fetch)) != null) { + byte[] conc2 = new byte[conc.length + data.length]; + System.arraycopy(conc, 0, conc2, 0, conc.length); + System.arraycopy(data, 0, conc2, conc.length, data.length); + conc = conc2; + } + byte[] packetPrefix = new byte[] { (byte) 250, 0, 12, 0, 69, 0, 65, 0, 71, 0, 124, 0, 85, 0, 115, 0, 101, 0, 114, 0, 83, 0, 107, 0, 105, 0, 110, (byte) ((conc.length >>> 8) & 0xFF), (byte) (conc.length & 0xFF) }; + byte[] fullPacket = new byte[packetPrefix.length + conc.length]; + System.arraycopy(packetPrefix, 0, fullPacket, 0, packetPrefix.length); + System.arraycopy(conc, 0, fullPacket, packetPrefix.length, conc.length); + conn.send(fullPacket); + } + } + }else if("EAG|SkinLayers".equals(tag)) { + long millis = System.currentTimeMillis(); + Long lsu = lastSkinLayerUpdate.get(user); + if(lsu != null && millis - lsu.longValue() < 700l) { // DoS protection + return false; + } + lastSkinLayerUpdate.put(user, millis); + byte[] data; + if((data = capeCollection.get(user)) != null) { + data[1] = msg[0]; + }else { + data = new byte[] { (byte)2, msg[0], (byte)0 }; + capeCollection.put(user, data); + } + ByteArrayOutputStream bao = new ByteArrayOutputStream(); + DataOutputStream dd = new DataOutputStream(bao); + dd.write(msg[0]); + dd.writeUTF(user); + byte[] bpacket = bao.toByteArray(); + byte[] packetPrefix = new byte[] { (byte) 250, 0, 14, 0, 69, 0, 65, 0, 71, 0, 124, 0, 83, 0, 107, 0, 105, 0, 110, 0, 76, 0, 97, 0, 121, 0, 101, 0, 114, 0, 115, (byte) ((bpacket.length >>> 8) & 0xFF), (byte) (bpacket.length & 0xFF) }; + int off = bpacket.length == 0 ? 2 : 0; + byte[] fullPacket = new byte[(packetPrefix.length - off) + bpacket.length]; + System.arraycopy(packetPrefix, 0, fullPacket, 0, packetPrefix.length - off); + if (bpacket.length != 0) System.arraycopy(bpacket, 0, fullPacket, packetPrefix.length, bpacket.length); + for (WebSocket pl : Main.clients.keySet()) { + if (pl.equals(conn)) continue; + if (pl.isOpen()) pl.send(fullPacket); + } + } else { + return false; + } + }catch(Throwable t) { + // hacker + } + } else { + return false; + } + + return true; + } + + public static void removeSkin(String username) { + skinCollection.remove(username); + capeCollection.remove(username); + lastSkinLayerUpdate.remove(username); + } +} \ No newline at end of file diff --git a/src/main/java/me/ayunami2000/ayungee/WebSocketProxy.java b/src/main/java/me/ayunami2000/ayungee/WebSocketProxy.java index 8e66f09..3cc4521 100644 --- a/src/main/java/me/ayunami2000/ayungee/WebSocketProxy.java +++ b/src/main/java/me/ayunami2000/ayungee/WebSocketProxy.java @@ -63,6 +63,7 @@ public class WebSocketProxy extends WebSocketServer { Client selfClient = Main.clients.remove(conn); if (selfClient != null) { System.out.println("Player " + selfClient.username + " (" + Main.getIp(conn) + ") left!"); + Skins.removeSkin(selfClient.username); if (selfClient.socket.isClosed()) { try { selfClient.socket.close(); @@ -88,7 +89,7 @@ public class WebSocketProxy extends WebSocketServer { } @Override - public void onMessage(WebSocket conn, ByteBuffer message) { + public void onMessage(WebSocket conn, ByteBuffer message) { // todo: make use of the fact that it's already a bytebuffer dumbass if (Main.bans.contains(Main.getIp(conn))) { conn.close(); return; @@ -97,60 +98,132 @@ public class WebSocketProxy extends WebSocketServer { byte[] msg = message.array(); if (!Main.clients.containsKey(conn)) { if (msg.length > 3 && msg[1] == (byte) 69) { - if (msg[3] < 3 || msg[3] > 16) { + // todo: it uses shorts dumbass, get with the system + short unameLen = (short) ((msg[2] << 8) + msg[3] & 0xff); + if (unameLen < 3 || unameLen > 16) { conn.close(); return; } - byte[] uname = new byte[msg[3]]; if (msg.length < 5 + msg[3] * 2) { conn.close(); return; } + byte[] uname = new byte[unameLen]; for (int i = 0; i < uname.length; i++) uname[i] = msg[5 + i * 2]; String username = new String(uname); - Main.clients.put(conn, new Client(username)); + Client selfClient = new Client(username); + Main.clients.put(conn, selfClient); new Thread(() -> { try { - Socket selfSocket = new Socket(Main.hostname, Main.port); - Client selfClient = Main.clients.get(conn); - selfClient.setSocket(selfSocket); - while (selfClient.msgCache.size() > 0) selfClient.socketOut.write(selfClient.msgCache.remove(0)); - while (conn.isOpen() && !selfSocket.isInputShutdown()) { - byte[] data = new byte[maxBuffSize]; - int read = selfClient.socketIn.read(data, 0, maxBuffSize); - if (read == maxBuffSize) { + boolean firstTime = true; + while (conn.isOpen()) { + int currServer = selfClient.server; + ServerItem chosenServer = Main.servers.get(currServer); + Socket selfSocket = new Socket(chosenServer.host, chosenServer.port); + selfClient.setSocket(selfSocket); + if (!firstTime) sendToServer(selfClient.handshake, selfClient); + while (selfClient.msgCache.size() > 0) sendToServer(selfClient.msgCache.remove(0), selfClient); + while (conn.isOpen() && !selfSocket.isInputShutdown() && selfClient.server == currServer) { + byte[] dataa = new byte[maxBuffSize]; + int read = selfClient.socketIn.read(dataa, 0, maxBuffSize); + byte[] data; + if (read == maxBuffSize) { + data = dataa; + } else if (read > 0) { + data = new byte[read]; + System.arraycopy(dataa, 0, data, 0, read); + } else { + continue; + } + if (firstTime && data[0] == 1) selfClient.clientEntityId = selfClient.serverEntityId = EntityMap.readInt(data, 1); + if (!firstTime && data[0] == 1) { + selfClient.serverEntityId = EntityMap.readInt(data, 1); + // assume server is giving valid data; we don't have to validate it because it isn't a potentially malicious client + byte[] worldByte = new byte[data[6] * 2 + 2]; + System.arraycopy(data, 5, worldByte, 0, worldByte.length); + byte gamemode = data[worldByte.length + 5]; + byte dimension = data[worldByte.length + 6]; + byte difficulty = data[worldByte.length + 7]; + Arrays.fill(data, (byte) 0); + data[0] = 9; + EntityMap.setInt(data, 1, dimension); + data[5] = difficulty; + data[6] = gamemode; + data[7] = (byte)(256 & 0xff); + data[8] = (byte)((256 >> 8) & 0xff); + System.arraycopy(worldByte, 0, data, 9, worldByte.length); + read = 9 + worldByte.length; + byte[] trimData = new byte[read]; + System.arraycopy(data, 0, trimData, 0, read); + data = trimData; + if (conn.isOpen()) conn.send(new byte[] { 9, 0, 0, 0, 1, 0, 0, 1, 0, 0, 7, 0, 100, 0, 101, 0, 102, 0, 97, 0, 117, 0, 108, 0, 116 }); + if (conn.isOpen()) conn.send(new byte[] { 9, 0, 0, 0, -1, 0, 0, 1, 0, 0, 7, 0, 100, 0, 101, 0, 102, 0, 97, 0, 117, 0, 108, 0, 116 }); + } + EntityMap.rewrite(data, selfClient.serverEntityId, selfClient.clientEntityId); if (conn.isOpen()) conn.send(data); - } else if (read > 0) { - byte[] trueData = new byte[read]; - System.arraycopy(data, 0, trueData, 0, read); - if (conn.isOpen()) conn.send(trueData); } + if (conn.isOpen() && selfClient.server == currServer) conn.close(); + if (!selfSocket.isClosed()) selfSocket.close(); + selfClient.socketOut = null; + firstTime = false; } - if (conn.isOpen()) conn.close(); - if (!selfSocket.isClosed()) selfSocket.close(); } catch (IOException ex) { conn.close(); } }).start(); msg[1] = (byte) 61; + selfClient.handshake = msg; System.out.println("Player " + username + " (" + Main.getIp(conn) + ") joined!"); } else { conn.close(); return; } } - byte[] packet = message.array(); - if (!Main.eaglerPackets && packet.length >= 11 && packet[0] == -6 && packet[2] >= 4 && packet[4] == 69 && packet[6] == 65 && packet[8] == 71 && packet[10] == 124) return; // EAG| Client currClient = Main.clients.get(conn); - if (currClient.socketOut == null) { - currClient.msgCache.add(packet); - } else if (!currClient.socket.isOutputShutdown()) { + if (msg.length >= 3 && msg[0] == 3) { + int msgLen = (short) ((msg[1] << 8) + msg[2] & 0xff); + if (msgLen != 0) { + if (msg.length >= 3 + msgLen * 2) { + byte[] chatBytes = new byte[msgLen]; + for (int i = 0; i < chatBytes.length; i++) chatBytes[i] = msg[4 + i * 2]; + String chatMsg = new String(chatBytes); + if (chatMsg.toLowerCase().startsWith("/server")) { + String msgArgs = chatMsg.substring(7 + (chatMsg.contains(" ") ? 1 : 0)); + if (msgArgs.isEmpty()) { + //usage msg + conn.send(new byte[] { 3, 0, 25, 0, (byte) 167, 0, 57, 0, 85, 0, 115, 0, 97, 0, 103, 0, 101, 0, 58, 0, 32, 0, 47, 0, 115, 0, 101, 0, 114, 0, 118, 0, 101, 0, 114, 0, 32, 0, 60, 0, 110, 0, 117, 0, 109, 0, 98, 0, 101, 0, 114, 0, 62 }); + } else { + try { + int destServer = Integer.parseInt(msgArgs); + currClient.server = Math.max(0, Math.min(Main.servers.size() - 1, destServer)); + } catch (NumberFormatException e) { + //not a number + conn.send(new byte[] { 3, 0, 29, 0, (byte) 167, 0, 57, 0, 84, 0, 104, 0, 97, 0, 116, 0, 32, 0, 105, 0, 115, 0, 32, 0, 110, 0, 111, 0, 116, 0, 32, 0, 97, 0, 32, 0, 118, 0, 97, 0, 108, 0, 105, 0, 100, 0, 32, 0, 110, 0, 117, 0, 109, 0, 98, 0, 101, 0, 114, 0, 33 }); + } + } + return; // don't send to underlying server + } + } + } + } + if (msg.length > 0 && msg[0] == (byte) 250) { + if (Skins.setSkin(currClient.username, conn, msg)) return; + } + if (currClient.socketOut == null || currClient.socket.isOutputShutdown()) { + currClient.msgCache.add(msg); + } else { try { - currClient.socketOut.write(packet); + sendToServer(msg, currClient); } catch (IOException ignored) {} } } + public void sendToServer(byte[] orig, Client client) throws IOException { + byte[] data = orig.clone(); + EntityMap.rewrite(data, client.clientEntityId, client.serverEntityId); + client.socketOut.write(data); + } + @Override public void onError(WebSocket conn, Exception ex) { // diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1ccadee..971bcc4 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,13 +1,10 @@ -# mc server ip -hostname: localhost -# mc server port -port: 25569 +# mc servers in network. first one is default/hub +servers: + - localhost:25569 # ayungee port web_port: 25565 # if this is behind a reverse proxy, such as caddy or nginx. uses X-Real-IP header. forwarded: false -# forward eagler-specific packets? -eag_packets: false # origin blacklist URL (leave empty to disable syncing) origin_blacklist: "https://g.eags.us/eaglercraft/origin_blacklist.txt" # whitelisted origins -- if specified, only allows the listed origins to connect diff --git a/target/ayungee-1.0-SNAPSHOT-jar-with-dependencies.jar b/target/ayungee-1.0-SNAPSHOT-jar-with-dependencies.jar index 5ad9ce73a7d22cba79d044119ee2be26653cf465..c3ac5b39147f74414a1504b1e2d17236da6e25eb 100644 GIT binary patch delta 33794 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%0AdOd zxhRP|D4=bn-az0c(z8}+Co;Q*5MPMtVS7QW%L?iXaWOl3Rg8pF`>u%zOUPuiWyoEZ z36*h=L<^TEoQYt&9Z%e@F-VRgTNYB~*+OU>jI15BEZFU!`%BFNg(7T(%{3rz2j;~)1&Ax9 zHR0V3l-E~eh?~BogJc^e+Ec?Yw&a?jsLV)J3`5tq?!=&6`)Ms4~Nsj<}2L5!)! zUAW$Q;MvDMJdUv4jU%*BL>R#3IxL|gzjJqEXmUM>i~$T^gzEq8)7l9y#*^@jz-|xb zMTi$627yr;TMmNu<2Y9CL75~U1}^`M`z&0WO{m2I1aSn}%q~OQ_M)KcXaajc$6oAi zY%n1bsPs^BwE}-&^Cdd>Z67u`Ig#Nl+|0(i-~FgLVG4sdY-9I?8iLeL70Ym8>vkNL zzemxtgdN?2^JO}bGJ`D#aCbd6jv=@QaY{~^%MiT}u$AEYankfSDjBnzHV3^_HXCA( z;MTO^AQs};sf=g=S)CnDp%gCUof$Ca5c-?2L_*+SlwJ{D-f{_^Nd_jTXaoWdBk%bd zF;A5&`$9NNV9Rx4SQ`G^Wy|JV!|A7e1bf|MQ+Jj!WE{caw%gJj)+Xa21l^;kZOFFn zJY`5Zij^O>cZa#qd=&e7VFv?`IfjSU&R7#k^!_&D1b%xA?LRmuM$};6JB$Yo2F}ao zZc!h7jFCEh90R@PBq0nz=LC*^@=Zc$!;BNSUW}?Ggce*pfeS-B?gEQ3Iu$2z$uT&I zwk+;QAkPFcxYH5eOsqYLJv(q;EZ|PLHHZlg=$GM2Hm^~HSm9k<&9ZsFW(;;`E1S0g2kq3uz^wmU30xl}YdlDZF z2}JQMBKNc;ki}!nsPXbYLPhX{#VQs(OH9N?>VF#0;_Q%ovA{V$(@8*y9}Q0-0I5e-d8a`Dd!kL z^B*z_FykspFFj8XeK>U$U9+rY2$gEA1TQZVBAhC^%z*c+@l0-V6(O`>;5FR-zp7@4 ztZR7Czq5uRK3v1e98xPLxG>^6YE!(;AiJ-lY~>w>=qJyiAz79q2f8=Vmqqu)uqHHD z=8p`)gWj56Ncccazq{M+&p-zb0kN&vYwH0 zzKPDnKNk}+V64dzGN$)vb!%eyl9Bpx6RjvVGQ{v&5;WXik&x8uVLwE-_l<_#noj!2 z2*?{@Z$$$lyoEOmCtDcU{}zU4(&tVYQ;rIeF`;z7kW^NIZ4Mk6pl;(bKKdWRh5&00 z8~ko#hX4F378JoWl-{QOsqH_y!-jDEHb&I@4o39M@9sQ4th|HSwYP(TZ{ER^@pe4t zb2Vlu69)_=4%Noo#S`#Y_CF>Yw4E_%TkqnjX$B8#uREt7e7lRcW%qDfaE}gW8S^<% z=)tjvihKC5Sr+R%QchrVAG^6z4#MtZFKXmq(|y{3^;?buS>7C7GBX7*ayUm>;_2aS z6`1t^%frIq96qT-0vP@Pw^ODX1oowxMORh0{QwKkc|8K+hVCI&<-__6F@8J_!J>y~ z_kuA5KEi{>N-DVSplN-TNW^RU;)S;08GX_3Whr<=%z!1OZqKs%&vU-Fv z_!&V|>QBi8LE$4hKzeovrw7zOA$zPBv>Z1F$!T+EPK62XXxaG%4#&#-SoJQ2K;&bb zPhUcy_%W6eolvMJ*P)@H@dQtj<3l+RIFzddQ=edri;;?L!zk=Sih39dbx*LnJtly{ zQ+)JjBf6@?tfv^%xeSr>8}B+QpQ7~sPHsybmkYvYh`jGaW;{V8lpuX45>4vx=^3ti zdk7Nw4{@OO{Udk~P>%)uDF_{>z3jtwnH)hCl|gUSa_g)Z>0qB;Y40@H>~o1)CSRVPE(h8?Wx-=?IkI z=yNoEGYlG@V`1%q_uVfrz~WkZ$w>X?s}ny=DErB9<|VG#%Ob(|6^^RfD_oB*L=$2JwPiYNdxeikGiSl4 zSNKr2K8{?~AgB>rNXIk8{(YE$@Eu3~Vk1sOvw6_ah;1Is1FP4xH+2qony=}eFzpoP z)!=p%JMkK)8!YC)*7F=qXnBq4z+EY#`a-C=KnRoHpq>TkVA+IE1}fDAs&JAZ_Uj1J z7kgfioZR zc~I|<9C$2`x9N_bFr6KmQN!^z4t!F=3>%e1E5OobG@JH~10~HU?(hqXpo>6*5jPyz zO?%;Q4mh>YLs%F8a9}z4QU4cv;3m+9tU+8hd}_g5EA8OGA~$@Djs`7Q&+*j|(KKKD z2_I6&0@0=%fN#F&Cz4cTz>Iv^6V7uaj~P=JMfW8d_`*;VMf!6rI^(!6)rQ%eItgpn_`fLBibB*aV*;DP+R0oQ=CE^k8^SM42|Ssa zV-9!Qa0BFS0h(WFS5}B67d}npYC_UioPsG7Lcc{^4RT{CgxBA2B+G_y!EzZ2=(f`ytgXHx%7Dq>P3@SVR{n6b9W^Em zhwtsU4y+9TyYJ{neITTLM>=gJNd3XOn4irRf@22uo6p9qlKFvcZ;h7VWvs4K zp0$mu2Y*D;Q4(-V0s0yG3#GMZNWytsOvs=35K=TxuKhyyBWDr;ZBQ-c>N3lj$aCx8 z$on{p@Os0X-#Gan#WBQ<-#AsH;|Vc}a!DaqJ#hYu$CoL8@W8+(RRZ}`##LwP0P8R6 zJGoTM^Q6YE6cZfS|ChFu!ZS+@D2NuQK3BO4%sxQmszC=fKf9i^P-g@tc3^Qomm@+p zrU>wTgATOL%M}9~tp!$;TV5CKO}Q6{n`>?SE5I|hA_lgj1e)Tu59%wi3v-;55mTMvakpvd0z-0x7n@n)-Z-A!f3% z_55>$m`Z)eGd;Gz7Tje7mQ)p<;IRexp?E@Uy-f%s_%4Iu&+ZVy0M2p*T5v!XH*K*T z)c@zM7@kCZc_=0{A(V?M`n(V$d^pX;fNXy!MtESr6ZldgEewJi13sjf@VKy@hfOO! zb%#|+h=gFo7ih4&+PF~27pTCeemt~9)-+Cko@Aw7{9Pn5ku~!-{>a6pQH>V3QPKED zhbp#$it z>-|H)Gnl79goThJk4fTdAi=AZ#~%Ob%^;Je^LVg-0#A)BY$nt%d;^dKqCqH-g@a)j z^lbz#F%iR#)KfEwrkRmEEeKLTnUnawAZdykwV8!PXf9wwm4ZNBN(!WC+)f~i4@YM5 zRG3xNND*B-V=HdPgBfvMysEj~V(IQcq*P&I0=iV8C~%;TJBblZuuwt=&bf*aF2pY2 z;ei%`wLKX4rjo#edMYBcA!8B7$5Fj&i664Go3#ob(nK4d)bjB4NRmdoS9KHUgRdzP zffi--q$H3bd{hMPRN5#)7{I_x?8#H>E(7;fu&b$~#XLE1U&}LK(q@z@^40`1y!EOA zN6K?DAtq5iQ^?foEJrD%efLyVk2ky#V!2z+%m9O{YlQ@1Bh=b!Nmv8X30 z28o0iPx&n%S7WeM$2s(IDIt2n8g;Bo%hnK;+F)}TL$X(=%VV|%>UGKjeGS1F>JdJU z))44J<}IFp$OwVH&lBRO;g~O?UohzK+B?uu>DXE-8`_ z82p6S6Y4c_pd#>nNa9FeEexuD2}3N=5_nVh_AB#;lyIGIHEg(4;2Te}VKoHDVf7gcmxOwc*H7%)!7KL94{ z3hY>>l{|R<9N)`2sw;40rCjc$xOxHymiZMPcm=1(vJ{ zH9QED;~PMbzMwyA!>vy0puWJDb>psx>MPORfd*LT9O^{45}Yv*$U(dTHjI7z4{~Ca zJmtY31JqFQj0e8G1U{@&FL>auh5K63BNb7neRTPfrSVcDzBSedSBdGmd?hfI$3$QP z+#4+>z7sL=&7$6d0W7r-om531e&>mMK_8s!35I-miLG5LBc=fbhA8&a2GfSs2bDc* z5jEFw6SdSCqL%r8@C~)Wd<_s9p_XeMB1(_!k2;slxki{VsT8a;!jkOGg6HIF zAq!T01%4D3!ax&TNe>3_<-m^IavbW5;?PqJ%fOqyIEOlP7$hZ#F9X)bIMp8NiVPv#1|zvU?Lbo_3bAnaN}l*dSfglkog2@ z?=MDh?`4X5Wd}+iea%og*H(*ATIp`((sN5x)1IS50V-OSwYAYpTx)?n)%RnFhGp1%=WE=7ds?E*On(N> zv_zT90fY#pG)FR^pA~{}qZz_-Ejn6mg@a)hL=aOrVTJKG>5p1eCJ;mqs(`O0F~zu> z`I5`{l8KB|O@Ay)o|Bj$=vpK3c@i8NfPvbSi@B0wjW*_lGsrn>tXf$SVnS7-U=JOD zrZcfdlctFS1Oq9Bd4vd&nh&@7VJHI5^V!gG9H)$>4c4vE$%Ly91vWSc%a#yA4J^v} z3S@Z^0)HT?gJoivPgV;nsXY*8$>_pYiO3vQ#*l%)JeEygZqez=Qy#ZeB&FE`#m85vZ#d@m}WQZ&>4p+ zhIlK5x7haf82&!^zA-V8W{+h$x|$*G6C(E><2bG@I^gag&|!Jq$Csbv@#JNq3q~== z0V_wyBR;u9*Ma2@2t6mz{>OagMq0rU>)zd`oz!?jeXH-J@J3q5w7KMnZBD%q;i~Z6 zQDDxZ8%31pM%tDo|E815a6%1--gZ)W=S;&ZClo*Uz7sNW#_F~AV<&~T&umC^MuC`? zPUxJoz?$X!nGau`1w&arU-{$&!JEZz=R>|F-uLWq!TLDxJHCNHPWbS~Sq{Ftpn}RD zBFF?rx(X~>^Remt!QB)bWQQ@bgMb;l@v zaKnhd5)o$L;Z9~4i*Q1zSZQ*#gbsIHL-xkeTy~EharpOwjGbvsRTDN%{x#wM{^g-y zFiogPq^Vs3sMN&^SgrP8T@u}Km2wv^LLNB_8|LE z^W<4GBd120C(fAu&j6PgALVk*qyGtPcLD$7c5PhnTAa3yL-&}94b5X`M*X){w|}R-n*}d{NYvp!|8Dz#js5o@UGCCR zoK__y3h;c*g%+^T7QA!8aK&0O9^l8DwL~6t`>u0WYrGbxW!Q*CIWT+`ts;`|_JQAS y@>gs{@+|z|FEos%l||y+K3vvKT-%*dj~_BqRc6Z&-W%!-6(%Fq<6RKhCjJlKAj9l&a7))EADmoX7+Y3UtugCwze7)GA082AA0)RRBR?BH1I?41^fdLL4nd-e=$aZ za$J9jLV@zbK$X5A@rFqUA_9UD5&{C;+}6Y0;hrN;fSYTuZeRQ=FJ2erC2rl6J?TzK zMwzx{7R^JpFWMxk(9*~_$z%olF{fS8s~@Tj9T?W^WY#YO1wOrWGJHoA`7=(+r_iw` z-KydZ<}f?|L9SyJrS7Mo#FD1|j`gE~5#(2bOEAXIkmR5xONa3`K!P$6J&fGq{ zSUIrjxwG?ZNAHy@<{H`A=oz&a>og)dD#8)2j()Ir~@IlIiF3)qb zDJCN|jvuvo-*o?>xvX^M6uL3)ywNaFkrQR*W zx*zQel#@`!V+=S1j&lDHEm^RsT6X1FeY@t2jr@(tU!&1cx$9!**o#haLw-a!>4A|y z!_w1K{kok@PXcRs*4NZg-2h_?W2qPb5a4d=yicb0!Ufz<;2>b9QrIqlKo1L~^z*b(aLs0v))tTENWwPF| z=BJC?T&-D(ciWJ68>tAhMa@^w$0YMbFEm5P=pPL+!Aj%0<_6R33O{kTRNxf7H3Jiit4IbfKA|~d!x*cSG$3qUOvtd5%AcU>?HlM z)Y3tV5PGuXLfRRfgely1$CFb3#Ef(a=0%+%hbhcSX2|=*W$h8I0rJ zo5bVVr-4~ew}ZknlcPF9`>b_2N_r4#?vHPghs4t<-^a~yHHsp4GIDu=fpqI-lxAmQ zjI@Dg6;yF++6?)sEgY!wj|w+x-;#HoL?MP1ZyE5AMHvY!3vpOf?L6Qa9r!>DyDY^C z6=~~@5&68oh`F&7?$xS^Hh9-Sv}DIk-KPW7qt%Lkqj)QSt(pIrhxpUp84dBqgFf|6 zqrStntE{jdy_0WiS29D?ZQ9{LMXTPBFv=(IK8UOSNeY)qM|_9=N9_i^p>>WUos$rh zZye{LP(v$582THT;kELe5aM4Yu$@8!$)X)O9?4kT&-?hKx8qYP&Pj=BjZQF#3w^fr z&IMrwIwvN3CsfeW&T!ZR8T4Pn5u|44euig5R6!WOw!_)FC%cUFFUz5pLyP*7gQySl zr9F=KHHbHN&MY~)Yjz|!x~p~qIj-&weKWYcGc>>v@@z+m<4S2L#o$tY2&QFlsowXi z-HOxYhggf{vvcN_>Eo&3(w#*P8l4kL;vV~)c4ZC3Hb~Tr47y{jc4TFQhSS=F-b_t| zx#$B=bPZzn6&Ia5iIH3P)|oMf?kEsd*x*fL84f+7@|X43=hMd@(DzE@h_2c(p1Vu6 z-w#9@5i{Q3#^FmdlCnT67lrAdDP-_B@dIq6Puq-&(F+-d*>>zmKU#lU;~uWGp)!$8 z-0wsFzNKZrmr8_JUN2Z)X+xl8bn4j1P}aJI&zHGosy;DE!Uvj;Fe)!q_NP6vEmD*tV_V5_`nG;jionB{T`-leL2C9mesq#NB{h1QC z;wc-xDprg4A~iU$$ZEz-6a>hu!mVC3q6@yz#;LY2t~9taY*Sfqa~25R09vr38OK2os4b zRgEO{*PBoCv3` zN4 z@{HAB;`h?%9t-!TW?1v8_Jl2cBqEDLwy@j997VHIKdp-(K?SwE=-E37^#Z~~o`lIS z>9=!LT-|w~Az#*6Sv6VdIsz7hSmU^7)LDDUu_+KE*f5)nA0^7T-kaOl@nB(=(nUJ@ zv19#9T<*+pHiq{#T~6*{Zex_aV^-}xo?+8%8*FMLQbH~qcR`r!^U#fnixLg*4@syn z{)}g(uM)R3y?ZER>ATyb>P2@w_-wog>v|zmX%Zg&W?|36`e&_YSG@6)`TQawQMYJZ zlcTXVFWVKM_r}qA1A!C5^1`F^OGa%XRntBbQ&sj#=o@Mu+!4YcM$hnJ=h8zh_K{I7z099H zqARROW=Q0|-R_ZP_Z6F;=TU9)Fg#%171!I#;BVX%f8Jv|?jYA$AuHkZi|3Z)iEBD6`IF#%ozpYB3$x|%9$E!}GV8S=*#)T+qmz;a&UU6&tZeV0w($nEDPpGwM3b?mI&~9bT zlGn?cq7Ha<4Z~~$leEh8%=5^t#9CJ&VFHIr7-emptPnpy)D`4FP21E_2gjGWnrwbc*D`Eu% zy~;!rxEv{x7hH-S~^NzH{cM-zJBQkp7Ggcj`jgKwj+>eKCM{6l^ z2OrsmKt>_2D(*q}d@$ukv1hK-A^|IpD+d83p)25^5vd>_k+MywAwLw58{5zT4b(SY zAWCrE8ihTJYgKjF?E1zBe% zmBGWo;N`3-<1A4{%D#j`0%doJLpsY8DQP{g^bBm!!BAW6n`i$yy{(zD1Fl!v4u@%k z+;KY#4*{v)W4T&I@|^g#Y!)8;yMq2m8%z;;IHHfCF4!C4B00NC&$D2{+UN#&A z3#-7scSKAyw6cWsKbA4EVMIw)UaFq`xHq&FNp9`ov0)%(*s@UkGdcGG1W0NmAj|7+ z*?yoH?EJd;Cn+kEZZEA9|9PmHYIXRjvvu7!*30>7;F8*wW7sfpn?rcXm2HP#<5J)C z_2Bg2G_jZ1>SxS?r{Q7Ri^G@JJcG(RkqybPtuecL3w$Hz9nu{R4Kr?rpz_#;dmn_n zuzy_jY(1E3FN`P{UrDe{P2&E@u;_ezJE$o3!?SQTlnzh9oT35u^T#i3%VIwWov1Y= zVYtr>ChZvQhLUJ`PXAti`?6BkZB<8$~}M4szBI7A2wKH1I5^|i+qyXs*$Jk z3ikYQvYkISY10(jdh?QEC2}H8S}^hQTZ?2d&f?1D{o0pIhr@oxOK1KJ{Y|KkC*57K z=6si?)$R+V0^c;xRHruB``!ssC^tS2^HWXh3|o&zWNGT_db&Aj$7`4MaN^CC;?p$! zF7q`RS!KoC)^wpS^UO&4q9c@P#o7sNPT8=_+J_CmVESf|2k#NK5`l$x{H3IbTL3oB zKuoR^u^;=6yT%&h(SwA~@7CP?5;mQ8{C2*@pGUCx#^$@vDsKH)Yt<)&5gq0(F^i+m zsPuH;@A2SzKYJsvfQPjh_|uvodg0g|oh7$3js@1g+O>=B!KWhko+&qx#KW6kGmRW( z@tG^rNff)>#U`cI5qvs z=@HK)_jRLQro4Z3H$^e&82!@|WkCxao#Jh~yt&oHEc{YPuK%NT$&q<^)91Wul`L$l z%d|V$%X79L`j*Mmc*Gt&Kh#;-$EUc0#o(ZYFw~ajNpjAusk7=F86&a2#?M`1J#*R7 z+L^ZdfaHFH_h~|=rBzT`N%A8}%5jKf<@UWDK7~sK!juG7!IKhy4o1fb`B$t>HP1Ol z6J>jmPcH&Eur85 zJVy_f44#JVhw6a@4ep1C2y*nsuk~QcQ^Uk--gcU(w$IUHxrb*a~e)js*!y+ z&)~JIZ0!Mx`rQ({+ZQ6td7{#FOYs-{dV`~s!F>*@1e1BI?-iccnsgg{spj02;c7Y; zVNy@i7km_1G87x4X>GnjSSE1?Hc6-`?qqi|OAZ{ns99U4F!<@2%u$%AVRKDA9BaAw z@FB3xh{N zmk_P*+#!ZcM2$y2o$&;TMzakbUU7bd9hYLA@R&QG?@TsA1$mT_kJK=W?(z!fGJ;WTih9yR(Kw<~vgz5Ua1i7*=MA*)GGretDGe$j+Q_d%v!K z=i=Z4pXdGI;CmOR@0W?j+F;#Df{&59M1KZHS-Zx{4}KA8<2PDamy=jd7B1Qi?CEjb zu)n)Qbcv6=8I5V9x)hRV? zamv`1mJSye>J=J3x<`gf?fnWRWcJS7rMQ?i&XuBge%C>1`=Bed?b& zPIxW^UbN({R*7Gqdx!JEgjb6ahhB2M-3R=;Ze@I$Y^Z$XQ+4zKLBS1kNPqyNeNuRW zpHl#(WG9AWlh~gAuJ+oGw^=AZp6wIa2V_yL!t&mG*q(oi`*py6_o2W`mR+yq76vz3 z&6mzUXV=D8teIFCqcq4e*wsNhw_%4J7t>?tHac`7C4)#NvD%M zJter;hnv8CQ9PbZQPiqrf6keK-`li#>&>IO75-AnkdWjIm0R6uJeEH*s!owd!e8n( z>^%$mQZ*WGobR4BDNU7zoBMTA);8j+v-0hGrESj_>0V);SoA&rbw5nr`!QcrJ0DdX zxr014Uh!6rMHKGgMguti1|H_A-Q%~-v($Z}$TgcLmF-x!n;AMbd5NTA>b$M`v}b1( zAD0|e+FRS%yf`*R=p^pEE*i0YZ;QjMX8WMkY#_5$f53k2ZhzNBt2SX_!cU@Ob7jM=*a3YnY5&p5`ldMxD2oeI=s_^@@#Z9g3?lZ+S@NwzZ5T zXQZ+mllrk^D_fP-kb`E<=Dbq%D;?3tNLwjqRw`C2dzZyPntd7LBORQ6E5(!M{!Z1` zPyOe8$(AwoxR(53;T41O!S(zx7>Xr?Sk*rGVQK`=2=>MT9<^sq;fRLdCYl=57S^L_ zmIRAd5XQUJ6EwrhB787Fpky`v}~N(3|+Gf)XZ2t$nYLrDY&P7?y2XtHp`lIY%kkWhVV{ z0a1W!YtlFSHEPqu*UH z5`Ho|OWKB}%3i%~!yNov-ZJ<7;t7jakD2A(SVN?V#lZ>^XY9%N_}WqO-YoineXXqV zq33s1NKIopjv)+&uW{>rZks3}v^^AQGW&^@;_!89e!B6Y8oHYb zu6b>UFIwI!oGTn-7evT+{wkw7O2fKhB#PDIF$xsD`!gz%E!Yc(VKbHayuqY`Ei(SB zk*oAJ-@P+>_YcF#Bzy{jcS7^=76}g@aZ%L2+;}&}_^Eah_HFmWhgEC2($zQ3v(rny zOU5H^_F>u20x?&L-&$N0I&8Ci-}R8L|BCY-_qJ!9+{}5moQOqZ&I(e@t)Ne6^S8Bn zULAa+=!KqQq%cgE{wngleJ-9->WiHi;EejxBMgI)bXF9Z&|oJboyzFYQp>I3^VxXM z?B$`sW~aZ%i$d6owartm7ak8Wzi1qKUJ0Mi2b03Zs&KyLIwZ zaD!_ES3F=%xu z3EiRL)wwnIDYcpOTiAsM!p{Zc9?l;Z!C}WSradAhzfO;SW%%|O2nMX-E_sBdqc@^8 z&xM`mTz&R!U0b`F_{#b26^@bWdGZ|zav zOx=NX{3ohl*iV;N+TV^MKZtKXjMO}54j<`y99eXQ4e=dFTKkb%#2BJyUtE41Mp;yi zd-jt3qvf~0to?10wn$i8Nd(l`(mRWE(DD?GxIM+Us8w)zQzO}MBC@%T(ShF?r zVndO=nc965%}*ca1S^2d*z%{QP2+$-36d$Nlq+wFIx%e3N;WszuOT|(Q$&Z!P@w`YM~B^rzqa z3om1g4))BS1q8jcru2ZLFYnx<$VY_CtNk!rI<$!sJ1Sg8UNog0$trVM$18QS1k|K` zYwDD3J=Z=Mlujv*^Ft;{E9pnGfvpiw#Fv=_BD5!zN>n4go}%O|1IFUmgjOi(k)OAT z;=uVapSJk8J&BYtElJ9LP zXeWvELDq1D{AuTRZW~9VS)<%W;yf`hj;WK2w2O;}QHg5#)3dPLF`JAjc@}}aqrSvO zVVxe^k77gUN&@so?O?VluVIlU9D2sR3+3KHxHOhT1LA>g{u2^cV$0rXSKsrt8g!nP zq)<**+ilgm#Afz)k&RXj`-Gakw@p_sJo68gJi87t&r1(kmK-`L-Jc(ZK6b_Jec6oU znQ({#J5M@fZhd_wzUB}}c~nmwE#X!uS7qL7p4>CgmAq)x@dn$;yA$o3nD=(d6k`2^ z7?pTldeJK}>NC;lu&yZtg>i4|LT}EGeik@r&#L`LFIcF2y3ueYq@$Jc3j1tTZ(k~~ zM~x8EN*3oqv^dK9Uyb|tD^`R#W{OJIRmb#jz#ea-yk+U{!nV*oiZsgD?3d1D-8Ohj zE?UxwTF0rhg&lwHQ86;G`abTs+Z2)Z8S8*`rms>yCT&G|-^hE(bA9tWQMX=KiDvk& zAPLK_NXbYX$%P5m_r2XxlE_@qn1Kzm8gBR>*Zt3 zg9W3{nU+mrlPsBin;nB>#e47rfA1+Jrd!NmRowoEM;<@cx{)7nA&VFdi9UKbuj6Qo zkMo41T@gjCl6V~E#fw8<(ae@o6l2#sU}!Im^K@=AY&E}Si*In6{XLcCj;ACE5&nbD z#1S1WVnCEe;g;7J{C-PUb9ebsWso@jYBhHQcf;(*Q?=_QtRFMqxnP}>=OWBU| zi6aYTO_hB0%o#ZAvq_U5ACz*bNt-uiUU!+TenIlp%ve=;1Df7GIw{-7k1~NsOcjhA zglR|>hKUlq8D6_Z7M1+T$a6}>PKc^%tCe2uUAhEt`}4aNC}yAi93eG+4iO8-@h$## zSXV-%&)E=Cwo1ZEO0O%*2=0e|p3&)H*UoUlU9G6g95&eS9CjJh_s;gOJM^sRfs(U( z6EOD=mK%%OA2_JJgAVYGYkM`0Jm>+6L61;$EuG_e9#QP*tDY=|+i96&F?6o!DrdL0 zmTvW)5Tl#EeuXmr>sfoRYQPX75r<_lFHC~G+_oR5RS$pQ(W@ zW}N!8Pc@=4e(QDTc=&BpZS7}=)u(XXpNQkZ)W=p5A35D(eo7hH;2JP;SJRfC%??MkLF8HwDwB95Enj1O8fOAM(TEpEzm^H zzWpwD=;=u*dba}yXc-tdZC8wti!?cU2Mbl|xRt2|&_piVqZQZdTi~(2&dQuv-6r!k z)4gkSGpkY1g)GkZH^~lei;GUI)WOF0&N2u>3y_(S1o-Bz) zw(WSiHNuLjdAQP%3HR2pyu?sjbMHIiEN;!H#y`GmGM34@Cqq9pZcW6jq!URMAr4b7 z&2Gg@D9YKhnYT!a*cNxLD@PBIP#El(VSM?X`8K1~^Tb!-SV0YmuMigH3KC!SdZAbL z{lvx+upP!HQ`W2tMmdTS)ZL$PY)%xou=+%7VAjmj_KQDych-@h)%=piAwS|Ei*!Hh zLBFMwi}=>bVGdeY$U`cAqjvhy4F)q9mhxoQ*4%~`m)y60!mjC8atB&m#v`|6v(^9G?E1Zj624l^bE8+=}@>Dg1fEJ{MNBxeE{PI=E zPq)79F60sc>kAq>qu|pPRxQ=D6pqX7(e;5sxmMa)9yhkNZU+pMh4w=YwqSxlRo!7 zp)5#B&dJiX4HevG_|8LruFIZPpQZP#CDb@w@GJX*ky-*?T!<=Vo++N_JgOcPQun;i z=VzgtenoTG$O3B9fgjG-frV97O0$t^wT`XV!lJ^je|T3K4f7F{%G;`l`y#;5uuwT3 zkKU2HCz#khux%`gqnH+_75SzDPdW@T7{^Pg`9yZ`5q>+Oi+u)hYiMMx*IumF5b2J< zF`fCQvIMaQ-5TYI(HEDq5Zkjzjio5Lv-^>1yQcMs?8YIO!m4?6fvj;hI;XJz{t@<_ zvUcDS_;-II^p;p&C@#wN4+4BX7phL-A|QCuARutw{2+h~5V67{g5?`SgY*p^{(`0F zw55-s$kL^TI*}oM#v!<)5tJG#o_&X@^W=emcRG2_WRmwM1bmZ|!=3i-8RC@(v(8QH z3%(j|bT&0F%n#jPth%=}R|UInHm|x{cDN~+eV6_=rA|PG2kprVq}jZf`gRW6^qUIW zcdY9|w928HJFc=u4}ozfl66;XXX+;IEDjvMdCh-`Iy`@@jIK1no4h#giB(s1u&Mu& z(*B&gvm$qM;n=YK5PHl^4z8TN2inw>Pl2yLiP<&?vg^_I>W5 z9hSU|bKWrOxO$ESi>7rtFCwDdnHIWKAS2zrC3nvG^`|vE$yOaq?))(?`!C_h9=-HW z(I?-|(O#UUSg*yV=zngHhUt!6d813~#{5jM`B_JQDVhiy=&9P1o?rNdwcXQyjuBEx zfqAy+JpGGp<(I+B5odqNL@iHQm9G`ih3pQj1IBb)iOMK1zK1BQDszVj5f)Jq=qDMn z(6g8F65y!iyt8&qhuzCnH!2a(*Q;G{;IJT$_sMd0a1kvk;}ojkKs*aB5zQyf64Rv~ zj^P(U__kRcbMID8`PfD7WI0>J@KLfW4CZmFsYj>N_gs_HO+s;H*{-B94{DLB&YE9^ ze6`}V&JrSCBU)|5uwB4@dAH?Kpp#H)-G9{#Z^#S}h9XdAefM6AfRh+z*ebI1 zs`}SJR6H|(mR*13L-`ICA*_ed+}y6E9U7~`sH2r%n;v=RI;ry0n;PZ4n(~=*J|Oc| zC%)}4yqZUZobgO@qoqp@Z+zu>nZyF>=Wqj(^;>M@&(WOX>E)=D=t>>xl)NOJ4XPqh4cv{D@6@~xd=VQD;j)@M~ci*QEJ&;qxFm9 z4mNu)R8T&e=n<+k*)V6{6=fbDzH3RI;`l5r8IfrT{qqTIGLEfvqn;28OM{`^EK(}o ziaxb&g2AMEVrWSYEdcSEN)68gU9B$%bD;z6f~x5}FX#HnX6@si^vGxNdrsrowm%=| z*U0+NC_8Hr9}~ODt?@yF@io!m>|6deGeG#>;#OR$;V5E*|+trgLI_IgIUt1+zVfe?Gsrb*G5 zqPg&xgL$)+JW$h^jl;DQl)oIR_I*4%*Qx5jq9x4P6=vkntrD=)C54aDpuAdu-lQZs z*DQ6qpzO+NtwVTNp|T?6k;L^uVD6s4lts0)E%w5*`}zafYxf*-8AU`CZ4|kz6<3Iy zC>g7xQk$8RQkgynl+cA{3mG+-I-4?C*uL-X&QjQwl$w7eYp3#gZjU*2 zI5s{2hZQ!KM!4(4PQj?Di|=y3iKk_>rhSbin%}ChC@W!dV|SNhiR@sap2@Ryh0Jr3 zI&ah=-MLyt9cbkxaJbK(r6b04bnwCm2(kZwDB8~Cc?UZ^cdd2;N9BN@O+&AKx6J^N zxq`x7JwXAXVJdUs^_u%E*$GPfT3C$Fm~zWhqzbItWVvFD$K025A8W!!<7nO<*JRXO znKx7m!_WLom!ibFQlPtNV!crd2;8+m8TsMUW_b}jE4EJV6L5!SewUv5*4RLMkj~kM z)7YT6xBjx_PPvG{7><}jCjyU*d8*x>nEg(yh2Ny9XsJ8Dv}WSdT{lqm$5CCw z)d#S>pk0>f0LPiuRc(<}@`Z}bo_1ed#81z4*#!)hznRWiNQv%Zb&v<&wf?pzKgZX# zo>aJxDoco!J@rCGfOy&*i*%8sqG*UmEiBv51f8#%%DEr&u2{gQ_U=`7zYYTa3@);! z%I4Y+K8#hmnY}AXzj#pYt%tG*^CVj%|Hi`Gu#v;d-?c|=B0w#$`a!b; z;X&Zzm4w~HBgq~r$M-s>t!Q(%h4T-N$1})$)O>ZQ53)H{yt)F{b07#1;W{O+(E1&0 z^(O`19AA;wKiYh*6ueuYr75%=S^lwDKkbR7+2o5=twQL;(^LDe;sJ?l6LxX4_Jt1= zvSEXE!NU25B5L*@R%||xn!L)TjsIn8&9!qxCfyg4O`Kq||0#_A{{x zmRq`9>kWpuCJpj_{F$ol7Y^9z)`z)G%hul`r-j`UYZ+P%?3+-#WQH=fjJ)69bLt?$ ztU#tGpt(@f53NZV*d%HdM15LM%^vW@GNgw ze@cAl2!`A%GUc2cnr~N{a#>hx>A=Hg%W}r;iYCl=8vIb{!r2_sRmC&0lFDo;r5f>>-f^j!gZz_b7B_5U zx}&Db^fCWo)W$Hwr&j`Q`nZ?BHlO(IE`M9d?_RlAqT3};Wa)?&pe4Z?TxK>JKWmNH zOphA+NqErubagrvcU5QncA<-FdY%ckv}4%4uOoDK_o>4^p{rVWsdzY2`jR@zjJSTZ zsvBoi#Edw)W%X+QMS3+dNwj3vDZOeD%(0MKeQ41x?D=z9oS^z>!+hpmX4MY`kUgGsavM`u zpQTvuk#XRV_$KBB!HAl0Y^-gEJ~HeJJ!9kuChNPv&Z{Iy-0tL?tawH3#?6cuuW1#fCeXTt$c42xmiAi|n+VX@8>;Y)OtbvV1f2hD3kFJ<*C zj_%MZ(jDlAYTkL}skJ_GoZl;{Nu}hEBeI_G&35s!nDxpcyV3iatcC zwyjPd@VTmu1R@lp@m?xHH-z4Qar)%Pq6gbVE z6n%h|HrO1Hnc~_^uw}6ao0HKF!b-6Ns<_Hel^SfYfaLAQ_=$C$RkD>#>)K;1fn-i% z9!^R{ugq1){r6sGZ{%<~B=0vGEbyBx&T>dmZN_RKZ`3?j3+E_l7KiSe8t~>2`FciRgR}&%9|Ae*Quey2N$hwr+{VKwxC@B z=EMhRJr%ohafb8f6o!ZBRctWzfaTAvPgX4FOhYbtO{;!}86F1kraRRpr#i#LUf&HM z^In3!$g=b!d$kO0$=ZC7O>&ypREEb>w-fEhs}|g$&;S0+`ZN08KE(QvUcZ%zqp4;> zDQcaSX67f}f{X$e&mPY77W)t?m8QpUx?9>1GI_A86S zOfdG(=yF{CVb5~%bk{d=_LzlnTPZP$)>b+sTV z6JRzm@SY)qGxJuu;@gUE$=ixq<6ob?lM2T+M^+A|p<7Rq-x*f4v894_T1myUecUV> zW`46&t=!CJmUn60MHz!~=`S&^>MsJwNE*zq!_riL>8z!db5269tSy&IJM_!bA>emaR0CWLKzxJ_upT@ZG#EkB|IF7Z`VD^0;#t%oi6>0c0FR2ochs7ftj5+D}jl zfXEa|e*InvuPIbo5dNOQ^_wWa{{vqw`TY+M;ZSB1{O)FdOIz(QNgI>iHz?ANR z93D@1$NwSx?;8^T_(doQV?epig_j=Qz<+sZ1zbpkD;WSK zGbkHmR08lagPKD~CDZBoX@Da$C_6-3^4gJy7$PPhY7QDCTm$Jz0#G0lE|1*EyfK)- zG+c&AT^rz8fRV*-zH56!Q2=ubQ0XZJ#92TkAo)@Ny*HTOj0+SOcn{aC|BKK7DwZI^ zbvu0)nFolc!omW0ZJ@|NlO>b_A|(5}G5CO}4-^kTwF1FU^4Bd&e-0%B@TmXcJHu5y zia=iyA`4J$1r>pasr+e7`cGV9;K~E^z-|rFWK@A!Cn!n!B_0Kk1NR#RM_sjmVr!@Y zBwQOzg$1Co0joW7_jdv)fQt=O9AaYu%5=bp4OAYYZG9aqosta-+_nYV5aa?@k_%9C zg5sq+3*ce>)2k(6uUz4&fMuitRPDfcNOoYn4mWrf%z(Td7>Fz+9iN0IeN~{bV`C7mtc;Nrfiji@6??rMeCoC64P zgo;7@+pi-^g;4;KFQ7O5l`b0fcY}+&uLqTs6I2x9+Y8Snoi~OYK(_}IeBlH-jO~L* zH-y+PfPqQU>GFR!(cvDbtX@plDG>N;Fbu&_>=k$pu8?1=@bG|#GuR&)>tGyeVAL5* z>-*;KIGE|(WjFw@3)qmfT{s3@kI57$A}SE%0+oVzy#F&GwIIY_0D4!bCq()?+&x1& zYTrM@$`>5S8?I1tNYmxD3ZQg@DnhES(shP-u6r3Mb_4T*A^@rWP-0-y14^F0G5mL- z(cM8kIpU2ToFr(#9e1cUm0#7Ub*Gm#$Iq7#9fjPKE8Q!%%-D;5vp!EQo@rD-; zkODJ~P>l2>2oV7DfT}>=NZ+^t1FJwb?%W91Q3}xznQz8XpeN{WM*c?kPZ_X)E>F;F zgvkvIGepD!FulN0_{tTI&;e#%Pz4CK$Bi)H1-jSry5Z9KKrsNW`_S8v7x!-vaEws{ z1@}RJKfG^{>l8Z05!vA>a6mTvZeTFF5~S|ojR3~P2YS4rst}ss8wB($3*nEw5kRMe zz%Nb2zl&Mn12#n>?uPJBG0}i`K47QlB;LT+EyUA91Q){x;7gDgDTn|f5|juidH{~K zp_CgE7@HI*htETiM8v;GZP5^%KnHmGLNy^&BRA|`XDB+bk%Wi~eDnod<1~5$UuSs7 z4_w~vkKZ8hl(H5<-ZMY2lpS9H>mVo%5YmB&1JK<1XX=sogN;Ro z0S5^0<&CTBDw76)&Yxc0AYeFBAT$6fgcJdR0L9{nlwc@Y;4}crkK~R50jxW~UXXtX z9!LTLe;SwxDz7Ea1QP#J~=0cOphRDgaU zR166N2a?_}Oas&gLgkU9@owS)ctKDtBm}bGv0y<^5v2Q+5TGpxOez=rauNjQJ4y-2 zM1TdC4F=194x%2xphG4q2v8Lanh#JzfS<* zg2#QwTi&h?g3h-9=@_tAO+f|ZS0LaU1x{tdbf7N^DvLys2?2WVLTGLr@J2&vAd%UC zb~IE5qLBlnM?=*iLXUy%Xs9$2?Gp$v@)MCKidiWFq&^d!r5nOUAfdDuzHxeFz z5(`E$ECuLe!4!+iAUD%5Zo=i+@3Qz%m>nEB}{81n|T`xse8|{)K3OM{!`Y zgQ|i0cyLrNz=g(ZfeB!V2ZhsXfel(4Pz* znVK*DAXtF0Jh({A6oVs~B?TNzFz%CQow{hApl+(U@T9#v)T~| zAwc&CMiF8$u`mu6Qnw|FEHeqzw}8&Dwh1k?7eVJ39Y{pl*l608Bpz zTQBN}^!K(?Ty#TlbVQ=OF}@D92{+z&0wCr?`2emQaJW#E!Ub_4CkL$6^K!Uw8z9Jq z53R}@!PN^16MoA2o$Zrc&;@4AjqcDJ2@0^)g7I_w{}Uh5cth}d3>5&khTE}rKOOzy-~k>*VCkGs{vag4ogpL?z_Skt4d7V?GvO@-GdV2+ zn{e>;|71CwBH;s}WgyF;7-T*E{(rCtfI~O|ZRkG@^1S*ll@u^72U%_7|6ws81GAN2 z(dkOScEvpb2UP(2Ux>;y5&3hpx+M1K%kVCpG&Os)rS zlD`Aog^-f}5h#F~641bl@-Kv{6g=Fm(EWwf?IV%gLe?o(|q<`F!0A{D)XxRMt zPd%y2z)B@>{+B=ruObITKjzkO($^j`6{R0yN4dvhjwUf9; zvYvq(WZ&%@tyK{e2k?CcPXDThe<734z>&le^cTWe0fr(DzCmW>kST$d7vL6IR{@T# zN*Ej_2bLDe74Wn}#sp|>k#PW=#(x%wg&NRzUH*Sr z6u_N2uvwzDppNv(-@00;BqY4_FGSrP868k_1$}PSg25BY|EnW|d*XnESN;XZ)`53I ztlGbjjXJPLQX2k3wEe-_n!uMa?RxN7LiqeIU1B|0ulW~$AqVx~22s)a7vc;<#s%U> z!A3YXfQ{&C|E+5Tx4EJQa6(-6{6TQC8o`8m!22kChG;iJl_9|3jZohRUh|cP{|HzB zP7*R6yiM2TCjiFof`jIK1n_DD2Tjp)(7R6)*j~ZWKL~hdgCn8;BJ9BJ=io)C@8utk z3FOYkAAts-Dh2xqyjXKU7`Okxq(Jry@a#su3rA=Gf&_5L^0t7{^?oC2%}^dl>TjW- z3QV)28FaDwFG3Hr>tX#){Myv{6WkdCVABE;pIr;=Knq+rycTW&1g)STdJLxt0{7uU z?6n{PEW?G(YvB%{&;|+;;0oIY^@CWP!awf-9PQvbQv2gZz#9iUq^%vwhr|gky|ZJ; z20%N_KYMb=1Tr4>zYj~8P_7voKxYSdok7M$0s6YYGXY*Fcvh7CN3!UIiX%mkb3TnCb<+)0qB-Ht0~mN!kZO8&_%)8pevH`JU;FZK;09-in zLx4vE;FV+t20VHRWd&*#QP2R&L9lJFLg5HkmKE4F)7l_fuY`gF)Q*EW?GoU z^i!%R*Zb=4a|q@TNVsyomqsIbr4N$Ow%^@)Ue)|8Y#!SJ=tt^7^ z?+t^dh`_)4=3(#va4Y8@fD-sV2-2eMQT{%1eJZ%t1HJZO8KmItXdQu4ASwYVFQMF7 zqu~5>F1ukAdV%94cof`qrYip+_(1NHf0j_BF))F(+CMsU;9w3sX!Vx-LvV)^oSWeU zUO+k+1rMka|7Ym0z;y?0H@fan6jFFH9FR|)e-LoN8VA=WqTaudD@J{>KFA6i#3Prdm-@fh)Ml7w}ZH48QYKgMFej1Mch-7=I8npkM~Pthar<)MYabzm2- zfgA3VRj@8H|01{mmNF_ja0!Q9BK{Di|6dnZ9#_SYtz$RPeQy`n%MOM zJ1FjgxJ6^s5nnXR)2K;YGGoSxNznLHjuG6FafwDl^i2$oLCreOi%VkEOcYV#3W~Ty zQ9ABVBO; zU5-BILbGc4&X5a&dFi62(Vwc(qvftl-c~P^8TfYkmuftJLA8r?#x}1|-WDT`u5r+V zq|(a{5J10OgtNx~?qo_1!hdk2VkDObABd*%LtYA%T!OCqPDZ8bOEB?4qeCW`CSHXt zV{2f`lgEP2{tY2zO%1$fdy@-uy9PPf_@@qLs2uW)LR*e_MNs)~C{6v^Mn~8UU)Iv) z2_6cy`G2oCT6~!=m8y>Hbn!U4UwIV|(3A6Usrh;@fyr&>Tt^uVC{u z>?bcPwba1Q9akWq>g{aoC;x77B8~E{;_h;*lfu^Ps+KL!@pYxl*I;i~e}lU9D||*D zhNAOcu512J0jT+3^0Lz!@O1t%47hZS8xW%Nk<{+GmMquVbQCXClwOCx2D_p9+22}K z-{Jh*;RZkW3V1zN)~g1CZlG~{gweR<2DF~-kXtXaa|0m;Wo_C4bG{>jb~#F zerYXosFJP<`An7lX~aEvKvk_4E&t#`c~XxDUY@k-9>SBp5mFzx_4(yE=k2;|9AB~- zZT=FWd4C-alWo2JAfeI2I&Fa5E9nosnP*(cyjNqJbD+iTDN!k|vU_eKDVl?yakbj* zMcrk^P7$}@I@dCtyeG}L1t;|AMRAu4SqJH~z8-UPS${58B!%Zt z+HHi60Xg)_ZES}AH;2k^qtcl>T%p?mN(6;9;5i?T)=?l$Y0whn>0@++ibbfxL@DW; z2K=kWr+i9QXTqItrnicai@-^P16CnXPCv{2m^$XthD5jZ?hoo$Cm(yY692 zd1EadyN4q|?-FWrAJHnkgtG6WtFuaI@qNtrwIx)+uZK(MKCW_I34C^v52)zxY4ktygMbn9U*k{b1#4OT$qR$>;x8(5vWBiE$KAog$G=?)b4d#Of*v@oZ zCuB3%t18v<=BWk~Fok(x0V`XwDi8#Mc+}%KbI=>V?Wl8 z);+Ar^hcXK$Q!@f_ z3hIXjohA8h6X4xuyid=M1*mGqOD@U;ndNi0F?dVw}ckUn_HVCU~p^y4^`@;+8v1N4a+Lt@3pkid5cR+_oX zP2$JPhQzzOFptY+n3jLjpsf2ahgvulR_~-dX;3q23KKn;O^Rry1s-gee6(4i7r#;3 zQ=JE-{o1NjaaxHICxnAMS-AYHRi&ApY=G?Tt5Ufq8!VUOk7iFcM2-nn>EtCPoZoBo zd7&5j+}Kg2jW-cHPI`j>$_rXbJE_#?78K(cf|0KRs#|xJ-pgk;8mh23xiL;9{6J~2 zye~ne9~71=2Pdgi*@O|D&5zWwRNRu*Tcu0QpzN7Yyqr@7$w;oA!hY1$W8`)z>e`Js zF^wrkY8P!{;Zk8beWo#gx^T|yMN>^IPRh*|%ytt?lv4W(u%rMATg>=MW#&yht*sfi zCgk$AK)T&lMb2l&%ifwNm??g$g-SVt@6dIbDl?SHV+5$Qsa8tW(0s9gGeNXSV~Akm zIT$S6nkdBZBZmZO?_>`AX%b^ea^4h`N2?&(%~*z<^Sps>KQ{YOkT<+^+;k^pr$ycv zxY|Fdw5q#mqodv!fCDpCni8i560_j(r-~@q!UjqYX3nm+sK;Q7|$=6A3%lgW7 zZ>aQsKh;h}Z6R%4Ol#Y+0aA}8lx1aM^r$WCFZsR2!BA<(aw@j6zScW`Q}qx!Yu=oq zxpAZB(a7m2M^3T8-y5xX_g*Vh`eX#miSvQVf_G?w56hMs-=!n|EQC6b$H;u=gMR0% zbYVLBVt9&h4rs^(QdV}WN3HXPx85lcZ3xUUROE%pp!k7CrBJ^GbRhj@ni@a{mbK2l z`CK4wlZ${n!%g6tu3@u7Ab_UcL{VSwO6+XaHH56$=8*EGVt*DdRc+_Y3~AcO6d%YU zC^vv5OCxs)@KFFulB#zL@FW1e-Tws#%PL9J5kYAUCs8&`rx!9FZrY z>$(*Kg3xyS2t60X#!A=!C2Y_apFJy8AG#TY5l;NUg?_RcJscJcI_ac?4x*jGuz2Yy z2NO<5`7A_`3YRL*IOrgHDFlKC{^MW*sdzJdf0NSsGOmZfqU7^J0E?bVPd~&|KsCrP zxt|RJf!Gy9vi5Yr#!R%r#(GEz*b5j;s+50Gfb>wf;>v3R*tcUm?<8Xk^Y>#=#@RzfC__Jw0CUc@fJU;-$t9cEw_3JN~qtP5Fwz{o6V z$Acz%391uS|Af7O?t%L2yU`BwA>Z3XZ-%l+vj40`(clQk&$T!yJB>Y!$#R_YvwU0m zNCeli&{p&_MrL*mCeFCLR?qlHBvjivI3-Nf#BVwkZBR%ud}&d87~DI?Nkxdk&A;#F z-Id)aKAHv4g8PUB!=f+{kKzThGKvk6t|SVusY%5m-T}?kse&2Yfen%trVFs61Iv~6 zW(x3vr^$zAb;OJ8(h-BdGE30oJF-+Ms*eCwipf{Zfn!`IFNf1O{cmgPz`qTPkm$ALoRgT{1=HL<%}G?pn9Ovn z3k)4I!^sB4AOgp|;3O8s!1@JqoW!{pgveemJBhSdmL(mSM_YQreTVlqq2ia0!TKZ? zs=F<4p&K$yew?;aNLTbB>2;U3M}18Gyvdx{cd5t^mO$*}?I=(D(&^XiR-rAkQ>2BRQve6;sOX)o@bysY0Fg~=Q2Q+1W zBA6*XnHTMeX9~VFL0-sj$yEPefd?u-`&bwepe zPXeDTb5lI6(jl59HR0=yo~%&%$5BDP)C;Sqy%#cxkv}?^RH^wi`6M9fo#+KO@%)v8 z|B)V_6XaJP!uu-{VAr`SanFXovh{_?sc>M$2u3$jeAW|RFQ<|?x=UCy~)-aqg{K~h2CEQoAgyeS6tE?hK2m@ z5U@~HZ_K5|`22*s9IOkap~=wwVG}J(W}~DBEp#lIjg+@OW2VRyHc0M^FM6)M<3GAL~rrW6cU*Sgn-Q&FmWDHqGDyg;GtC5Zu!Pg7~T_ zMw;^iXFAc&{&>u?7X=ueWHu8UfaWDHaR#N20f^jJU#86ipyj|T{Mv!S2O^(4F;{>E z1CdD7&KKgJW}1zOS3eN`y?X&29t15hgV6QWZ*UMr~O-DncSyWFx^TciXEDFs- zCuXjvJ0tL(hU6g!t}PYd@HBHEt$H3ymosL6&!v@(4got~wyhL36tw3aL08Vj%bq+G zz4_axg4r|_fvdjU0W72qgJ=Elxr6bh*M^}FO$P;Yco^1K%OMBw=DA!DRV;Vwe)}UX z0`rDr#72GX!W`wyrEdje9l=nbI3qx1nK_tV8vzT8&kE+i2)JWy6$gdVs!RMDMRP_X zqD5X7;OIyU&6`&R$lZ-DI#cGpqtN~R^}NkS3r4Yi(#$&o9NTOPFG<4)eRt5!^tcBU zIhxIq?mf}vO2%M4+dUd(jeYneb!3wk0wzl?lLVj%V_1q@jWa;rMCBa$wAIL`2{o0L zF)UrK1j6P#oF?Y8?(!)=jql5ISMNr9j z7&19gY@5)nq7Cjd33XsASVpegw{zWD0|79mHbYy9ieF#2u+?wue| wH;S0ZqUDbSiltX4V%V-_=#sJYg@