From d79fe57f16d8b7c341f344b780e6064c4bd005d5 Mon Sep 17 00:00:00 2001 From: ayunami2000 Date: Thu, 7 Jul 2022 19:44:55 -0400 Subject: [PATCH] Kicking & slight bungee plugin compatibility!! poggers!! --- .../me/ayunami2000/ayungee/ChatHandler.java | 81 ++++++++++++++ .../java/me/ayunami2000/ayungee/Client.java | 11 +- .../java/me/ayunami2000/ayungee/Main.java | 104 ++++++++++++------ .../ayunami2000/ayungee/PluginMessages.java | 65 +++++++++++ .../java/me/ayunami2000/ayungee/Skins.java | 17 +-- .../ayunami2000/ayungee/WebSocketProxy.java | 68 ++++-------- ...gee-1.0-SNAPSHOT-jar-with-dependencies.jar | Bin 811447 -> 815090 bytes 7 files changed, 251 insertions(+), 95 deletions(-) create mode 100644 src/main/java/me/ayunami2000/ayungee/ChatHandler.java create mode 100644 src/main/java/me/ayunami2000/ayungee/PluginMessages.java diff --git a/src/main/java/me/ayunami2000/ayungee/ChatHandler.java b/src/main/java/me/ayunami2000/ayungee/ChatHandler.java new file mode 100644 index 0000000..9da05c0 --- /dev/null +++ b/src/main/java/me/ayunami2000/ayungee/ChatHandler.java @@ -0,0 +1,81 @@ +package me.ayunami2000.ayungee; + +import java.io.IOException; +import java.nio.ByteBuffer; + +public class ChatHandler { + // return true to cancel being sent to server/client + + public static boolean fromServer(Client client, String message) { + return false; + } + + public static boolean fromClient(Client client, String message) { + if (!message.startsWith("/")) return false; + int ind = message.indexOf(' '); + String commandBase = message.substring(1, ind != -1 ? ind : message.length()).toLowerCase(); + String args = ind != -1 ? message.substring(ind + 1) : ""; + switch (commandBase) { + case "server": + if (args.isEmpty()) { + //usage msg + client.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(args); + client.server = Math.max(0, Math.min(Main.servers.size() - 1, destServer)); + try { + client.socket.close(); + } catch (IOException ignored) {} + } catch (NumberFormatException e) { + //not a number + client.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 }); + } + } + break; + /* + case "register": + + break; + case "login": + + break; + */ + default: + return false; + } + return true; + } + + public static boolean serverChatMessage(Client client, byte[] packet) { + return fireChatMessage(client, true, packet); + } + + public static boolean clientChatMessage(Client client, byte[] packet) { + return fireChatMessage(client, false, packet); + } + + private static boolean fireChatMessage(Client client, boolean fromServer, byte[] packet) { + if (packet.length >= 3 && packet[0] == 3) { + ByteBuffer bb = ByteBuffer.wrap(packet); + bb.get(); + int msgLen = bb.getShort(); //(short) ((msg[1] << 8) + msg[2] & 0xff); + if (msgLen >= 0) { + if (packet.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); + StringBuilder chatBuilder = new StringBuilder(); + for (int i = 0; i < msgLen; i++) chatBuilder.append(bb.getChar()); + String chatMsg = chatBuilder.toString(); + if (fromServer) { + return fromServer(client, chatMsg); + } else { + return fromClient(client, chatMsg); + } + } + } + } + return false; + } +} diff --git a/src/main/java/me/ayunami2000/ayungee/Client.java b/src/main/java/me/ayunami2000/ayungee/Client.java index 6ebf653..76d1562 100644 --- a/src/main/java/me/ayunami2000/ayungee/Client.java +++ b/src/main/java/me/ayunami2000/ayungee/Client.java @@ -1,5 +1,7 @@ package me.ayunami2000.ayungee; +import org.java_websocket.WebSocket; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -14,6 +16,8 @@ public class Client { public List msgCache =new ArrayList<>(); + public WebSocket conn; + public String username; public int server = 0; @@ -33,7 +37,12 @@ public class Client { socketIn = sock.getInputStream(); } - public Client(String uname) { + public Client(WebSocket c, String uname) { + conn = c; username = uname; } + + public String toString() { + return username + " (" + Main.getIp(conn) + ")"; + } } diff --git a/src/main/java/me/ayunami2000/ayungee/Main.java b/src/main/java/me/ayunami2000/ayungee/Main.java index 9349782..b0d014c 100644 --- a/src/main/java/me/ayunami2000/ayungee/Main.java +++ b/src/main/java/me/ayunami2000/ayungee/Main.java @@ -14,7 +14,6 @@ import java.nio.file.StandardCopyOption; import java.time.Instant; import java.util.*; import java.util.regex.Pattern; -import java.util.stream.Collectors; public class Main { public static List servers = new ArrayList<>(); @@ -92,7 +91,7 @@ public class Main { Files.copy(cc.getInputStream(), Paths.get("origin_blacklist.txt"), StandardCopyOption.REPLACE_EXISTING); readUrlBlacklist(); } catch (IOException e) { - System.out.println("An error occurred attempting to update the origin blacklist!"); + printMsg("An error occurred attempting to update the origin blacklist!"); } try { Thread.sleep(300000); @@ -161,16 +160,49 @@ public class Main { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); boolean running = true; - System.out.println("ayungee started!"); + printMsg("ayungee started!"); while (running) { - //System.out.print("> "); String cmd = reader.readLine(); String[] pieces = cmd.split(" "); pieces[0] = pieces[0].toLowerCase(); switch (pieces[0]) { case "help": case "?": - System.out.println("help ; unban ; banip ; ban ; send ; stop"); + printMsg("help ; unban ; banip ; ban ; kickip ; kick ; send ; stop"); + break; + case "kick": + if (pieces.length == 1) { + printMsg("Usage: " + pieces[0] + " "); + break; + } + //there should NEVER be duplicate usernames... + Client[] targetClientss = clients.values().stream().filter(client -> client.username.equals(pieces[1])).toArray(Client[]::new); + if (targetClientss.length == 0) targetClientss = clients.values().stream().filter(client -> client.username.equalsIgnoreCase(pieces[1])).toArray(Client[]::new); + if (targetClientss.length == 0) { + printMsg("Unable to find any user with that username!"); + break; + } + for (Client targetClient : targetClientss) { + targetClient.conn.close(); + printMsg("Successfully kicked user " + targetClient); + } + break; + case "kickip": + case "kick-ip": + if (pieces.length == 1) { + printMsg("Usage: " + pieces[0] + " "); + break; + } + //there should NEVER be duplicate usernames... + Client[] targetClientsss = clients.values().stream().filter(client -> getIp(client.conn).equals(pieces[1])).toArray(Client[]::new); + if (targetClientsss.length == 0) { + printMsg("Unable to find any user with that IP!"); + break; + } + for (Client targetClient : targetClientsss) { + targetClient.conn.close(); + printMsg("Successfully kicked user " + targetClient); + } break; case "unban": case "pardon": @@ -179,103 +211,105 @@ public class Main { case "pardon-ip": case "pardonip": if (pieces.length == 1) { - System.out.println("Usage: " + pieces[0] + " "); + printMsg("Usage: " + pieces[0] + " "); break; } if (bans.remove(pieces[1])) { - System.out.println("Successfully unbanned IP " + pieces[1]); + printMsg("Successfully unbanned IP " + pieces[1]); saveBans(); } else { - System.out.println("IP " + pieces[1] + " is not banned!"); + printMsg("IP " + pieces[1] + " is not banned!"); } break; case "ban": if (pieces.length == 1) { - System.out.println("Usage: " + pieces[0] + " "); + printMsg("Usage: " + pieces[0] + " "); break; } //there should NEVER be duplicate usernames... Client[] targetClients = clients.values().stream().filter(client -> client.username.equals(pieces[1])).toArray(Client[]::new); if (targetClients.length == 0) targetClients = clients.values().stream().filter(client -> client.username.equalsIgnoreCase(pieces[1])).toArray(Client[]::new); if (targetClients.length == 0) { - System.out.println("Unable to find any user with that username! (note: they must be online)"); + printMsg("Unable to find any user with that username! (note: they must be online)"); break; } for (Client targetClient : targetClients) { - WebSocket targetWebSocket = getKeysByValue(clients, targetClient).stream().findFirst().orElse(null); - if (targetWebSocket == null) { - System.out.println("An internal error occurred which should never happen! Oops..."); - return; - } + WebSocket targetWebSocket = targetClient.conn; String ipToBan = getIp(targetWebSocket); if (bans.add(ipToBan)) { - System.out.println("Successfully banned user " + targetClient.username + " with IP " + ipToBan); + printMsg("Successfully banned user " + targetClient.username + " with IP " + ipToBan); try { saveBans(); } catch (IOException ignored) {} } else { - System.out.println("IP " + ipToBan + " is already banned!"); + printMsg("IP " + ipToBan + " is already banned!"); } } break; case "ban-ip": case "banip": if (pieces.length == 1) { - System.out.println("Usage: " + pieces[0] + " "); + printMsg("Usage: " + pieces[0] + " "); break; } if (bans.add(pieces[1])) { - System.out.println("Successfully banned IP " + pieces[1]); + Client[] targetClientssss = clients.values().stream().filter(client -> getIp(client.conn).equals(pieces[1])).toArray(Client[]::new); + for (Client client : targetClientssss) client.conn.close(); + printMsg("Successfully banned IP " + pieces[1]); saveBans(); } else { - System.out.println("IP " + pieces[1] + " is already banned!"); + printMsg("IP " + pieces[1] + " is already banned!"); } break; case "send": case "server": if (pieces.length == 1 || pieces.length == 2) { - System.out.println("Usage: " + pieces[0] + " "); + printMsg("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!"); + printMsg("Unable to find any user with that username!"); break; } + // 99% sure don't need to worry about this + /* + if (!targetUser.hasLoginHappened) { + printMsg("This user is still logging in to a server; please wait until they have logged in to change their server!"); + break; + } + */ try { int destServer = Integer.parseInt(pieces[2]); targetUser.server = Math.max(0, Math.min(servers.size() - 1, destServer)); + targetUser.socket.close(); + printMsg("Successfully send user " + targetUser + " to server " + destServer + "!"); } catch (NumberFormatException e) { - System.out.println("That is not a valid number!"); + printMsg("That is not a valid number!"); } break; case "stop": case "end": case "exit": case "quit": - System.out.println("Stopping!"); + printMsg("Stopping!"); running = false; webSocketServer.stop(10); System.exit(0); break; default: - System.out.println("Command not found!"); + printMsg("Command not found!"); } } } - public static String getIp(WebSocket conn) { - return conn.getAttachment(); + public static void printMsg(String msg) { + System.out.println(msg); + //System.out.print("> "); // todo: copy current input to after the > } - // https://stackoverflow.com/a/2904266/6917520 - - public static Set getKeysByValue(Map map, E value) { - return map.entrySet() - .stream() - .filter(entry -> Objects.equals(entry.getValue(), value)) - .map(Map.Entry::getKey) - .collect(Collectors.toSet()); + public static String getIp(WebSocket conn) { + return conn.getAttachment(); } private static void saveBans() throws IOException { diff --git a/src/main/java/me/ayunami2000/ayungee/PluginMessages.java b/src/main/java/me/ayunami2000/ayungee/PluginMessages.java new file mode 100644 index 0000000..f89b1b4 --- /dev/null +++ b/src/main/java/me/ayunami2000/ayungee/PluginMessages.java @@ -0,0 +1,65 @@ +package me.ayunami2000.ayungee; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; + +public class PluginMessages { + // return true to cancel being sent to server/client + + public static boolean fromServer(Client client, String name, byte[] data) { + if (name.equals("BungeeCord")) { // eat all bungeecord messages + DataInputStream dataIn = new DataInputStream(new ByteArrayInputStream(data)); + try { + String bungeeTag = dataIn.readUTF(); + if (bungeeTag.equals("Connect")) { // actually send current player to server :D + String destServer = dataIn.readUTF(); + try { + int destServerInt = Integer.parseInt(destServer); + client.server = Math.max(0, Math.min(Main.servers.size() - 1, destServerInt)); + } catch (NumberFormatException ignored) {} + } + } catch (IOException e) { + // broken packet + } + return true; + } + return false; + } + + public static boolean fromClient(Client client, String name, byte[] data) { + return Skins.setSkin(client.username, client.conn, name, data); + } + + public static boolean serverPluginMessage(Client client, byte[] packet) { + return firePluginMessage(client, true, packet); + } + + public static boolean clientPluginMessage(Client client, byte[] packet) { + return firePluginMessage(client, false, packet); + } + + private static boolean firePluginMessage(Client client, boolean fromServer, byte[] packet) { + if(packet.length >= 3 && packet[0] == (byte) 250) { + ByteBuffer bb = ByteBuffer.wrap(packet); + bb.get(); + int tagLen = bb.getShort(); + if (tagLen < 0 || tagLen * 2 > packet.length - 3) 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; // - 2 for the 2 bytes specifying data length + String tag = tagBuilder.toString(); + int offset = 3 + tagLen * 2 + 2; // - 2 for the 2 bytes specifying data length + byte[] msg = new byte[dataLen]; + System.arraycopy(packet, offset, msg, 0, dataLen); + if (fromServer) { + return fromServer(client, tag, msg); + } else { + return fromClient(client, tag, msg); + } + } + return false; + } +} diff --git a/src/main/java/me/ayunami2000/ayungee/Skins.java b/src/main/java/me/ayunami2000/ayungee/Skins.java index 872bed3..fa5e473 100644 --- a/src/main/java/me/ayunami2000/ayungee/Skins.java +++ b/src/main/java/me/ayunami2000/ayungee/Skins.java @@ -4,7 +4,6 @@ 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; @@ -16,21 +15,9 @@ public class Skins { 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) { + public static boolean setSkin(String user, WebSocket conn, String tag, byte[] msg) { + if(msg.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; diff --git a/src/main/java/me/ayunami2000/ayungee/WebSocketProxy.java b/src/main/java/me/ayunami2000/ayungee/WebSocketProxy.java index b4ca237..0349339 100644 --- a/src/main/java/me/ayunami2000/ayungee/WebSocketProxy.java +++ b/src/main/java/me/ayunami2000/ayungee/WebSocketProxy.java @@ -62,7 +62,7 @@ public class WebSocketProxy extends WebSocketServer { public void onClose(WebSocket conn, int code, String reason, boolean remote) { Client selfClient = Main.clients.remove(conn); if (selfClient != null) { - System.out.println("Player " + selfClient.username + " (" + Main.getIp(conn) + ") left!"); + Main.printMsg("Player " + selfClient + " left!"); Skins.removeSkin(selfClient.username); if (selfClient.socket.isClosed()) { try { @@ -97,31 +97,33 @@ public class WebSocketProxy extends WebSocketServer { if (!conn.isOpen()) return; byte[] msg = message.array(); if (!Main.clients.containsKey(conn)) { - if (msg.length > 3 && msg[1] == (byte) 69) { - // todo: it uses shorts dumbass, get with the system - short unameLen = (short) ((msg[2] << 8) + msg[3] & 0xff); + if (msg.length > 3 && msg[0] == 2 && msg[1] == 69) { + message.get(); + message.get(); + short unameLen = message.getShort(); if (unameLen < 3 || unameLen > 16) { conn.close(); return; } - if (msg.length < 5 + msg[3] * 2) { + if (msg.length < 5 + unameLen * 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); - if (Main.clients.values().stream().anyMatch(client -> client.username.equals(username))) { + StringBuilder unameBuilder = new StringBuilder(); + for (int i = 0; i < unameLen; i++) unameBuilder.append(message.getChar()); + String username = unameBuilder.toString(); + if (Main.clients.values().stream().anyMatch(client -> client.username.equals(username) || client.conn == conn)) { conn.close(); return; } - Client selfClient = new Client(username); + Client selfClient = new Client(conn, username); Main.clients.put(conn, selfClient); new Thread(() -> { try { while (conn.isOpen()) { int currServer = selfClient.server; selfClient.hasLoginHappened = false; + if (!selfClient.firstTime) Main.printMsg("Player " + selfClient + " joined server " + selfClient.server + "!"); ServerItem chosenServer = Main.servers.get(currServer); Socket selfSocket = new Socket(chosenServer.host, chosenServer.port); selfClient.setSocket(selfSocket); @@ -142,12 +144,16 @@ public class WebSocketProxy extends WebSocketServer { } else { continue; } - if (data[0] == 1 && !selfClient.hasLoginHappened) selfClient.hasLoginHappened = true; - if (selfClient.firstTime && data[0] == 1) selfClient.clientEntityId = selfClient.serverEntityId = EntityMap.readInt(data, 1); - if (!selfClient.firstTime && data[0] == 1) { + if (ChatHandler.serverChatMessage(selfClient, data)) continue; + if (PluginMessages.serverPluginMessage(selfClient, data)) continue; + boolean loginPacket = data[0] == 1; + if (loginPacket && !selfClient.hasLoginHappened) selfClient.hasLoginHappened = true; + if (selfClient.firstTime && loginPacket) selfClient.clientEntityId = selfClient.serverEntityId = EntityMap.readInt(data, 1); + if (!selfClient.firstTime && loginPacket) { 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]; + short worldByteLen = (short) ((data[5] << 8) + data[6] & 0xff); + byte[] worldByte = new byte[worldByteLen * 2 + 2]; System.arraycopy(data, 5, worldByte, 0, worldByte.length); byte gamemode = data[worldByte.length + 5]; byte dimension = data[worldByte.length + 6]; @@ -169,6 +175,7 @@ public class WebSocketProxy extends WebSocketServer { } EntityMap.rewrite(data, selfClient.serverEntityId, selfClient.clientEntityId); if (conn.isOpen()) conn.send(data); + if (loginPacket) sendToServer(new byte[] { (byte) 250, 0, 8, 0, 82, 0, 69, 0, 71, 0, 73, 0, 83, 0, 84, 0, 69, 0, 82, 0, 10, 66, 117, 110, 103, 101, 101, 67, 111, 114, 100 }, selfClient); } if (conn.isOpen() && selfClient.server == currServer) conn.close(); if (!selfSocket.isClosed()) selfSocket.close(); @@ -181,42 +188,15 @@ public class WebSocketProxy extends WebSocketServer { }).start(); msg[1] = (byte) 61; selfClient.handshake = msg; - System.out.println("Player " + username + " (" + Main.getIp(conn) + ") joined!"); + Main.printMsg("Player " + selfClient + " joined!"); } else { conn.close(); return; } } Client currClient = Main.clients.get(conn); - 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 (ChatHandler.clientChatMessage(currClient, msg)) return; + if (PluginMessages.clientPluginMessage(currClient, msg)) return; if (!currClient.firstTime && !currClient.hasLoginHappened && !(msg[0] == 1 || msg[0] == 2)) return; if (currClient.socketOut == null || currClient.socket.isOutputShutdown()) { currClient.msgCache.add(msg); diff --git a/target/ayungee-1.0-SNAPSHOT-jar-with-dependencies.jar b/target/ayungee-1.0-SNAPSHOT-jar-with-dependencies.jar index 3fb828bc7282de0ce9fca6124728830cc8c1e421..879581d92eab9cb28200cee75aa433b5e891ab05 100644 GIT binary patch delta 21991 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 delta 18446 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