diff --git a/FastLogin-Patches/0004-remove-bukkit-IDK-HOW-IT-REAPPEARED.patch b/FastLogin-Patches/0004-remove-bukkit-IDK-HOW-IT-REAPPEARED.patch
new file mode 100644
index 0000000..f620b7c
--- /dev/null
+++ b/FastLogin-Patches/0004-remove-bukkit-IDK-HOW-IT-REAPPEARED.patch
@@ -0,0 +1,151816 @@
+From 200a3fff4055ee5666aa1c04f323d9d078f68207 Mon Sep 17 00:00:00 2001
+From: mohammed jasem alaajel
+Date: Mon, 26 Jul 2021 21:55:28 +0400
+Subject: [PATCH] remove bukkit IDK HOW IT REAPPEARED.
+
+
+diff --git a/bukkit/pom.xml b/bukkit/pom.xml
+deleted file mode 100644
+index 5c3b87a..0000000
+--- a/bukkit/pom.xml
++++ /dev/null
+@@ -1,312 +0,0 @@
+-
+-
+- 4.0.0
+-
+-
+- com.github.games647
+- fastlogin
+- 1.11-SNAPSHOT
+- ../pom.xml
+-
+-
+-
+- fastlogin.bukkit
+- jar
+-
+- FastLoginBukkit
+-
+-
+-
+-
+- org.apache.maven.plugins
+- maven-shade-plugin
+- 3.2.4
+-
+- false
+- false
+-
+-
+- com.zaxxer.hikari
+- fastlogin.hikari
+-
+-
+- org.slf4j
+- fastlogin.slf4j
+-
+-
+- net.md_5.bungee.config
+- fastlogin.config
+-
+-
+- com.google.gson
+- fastlogin.gson
+-
+-
+- io.papermc.lib
+- fastlogin.paperlib
+-
+-
+-
+-
+-
+- package
+-
+- shade
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- papermc
+- https://papermc.io/repo/repository/maven-public/
+-
+-
+-
+-
+- dmulloy2-repo
+- https://repo.dmulloy2.net/nexus/repository/public/
+-
+- false
+-
+-
+-
+-
+-
+- codemc-releases
+- https://repo.codemc.io/repository/maven-public/
+-
+-
+-
+-
+- jitpack.io
+- https://jitpack.io
+-
+- false
+-
+-
+-
+-
+-
+- placeholderapi
+- https://repo.extendedclip.com/content/repositories/placeholderapi
+-
+- false
+-
+-
+-
+-
+-
+- nukkitx-snapshot
+- https://repo.nukkitx.com/maven-snapshots/
+-
+-
+-
+-
+-
+-
+- com.github.games647
+- fastlogin.core
+- ${project.version}
+-
+-
+-
+-
+- com.destroystokyo.paper
+- paper-api
+- 1.15.2-R0.1-SNAPSHOT
+- provided
+-
+-
+-
+-
+- io.papermc
+- paperlib
+- 1.0.6
+- compile
+-
+-
+-
+-
+- com.comphenix.protocol
+- ProtocolLib
+- 4.6.0
+- provided
+-
+-
+- *
+- *
+-
+-
+-
+-
+-
+-
+- com.github.ProtocolSupport
+- ProtocolSupport
+-
+- 3a80c661fe
+- provided
+-
+-
+- *
+- *
+-
+-
+-
+-
+-
+-
+- me.clip
+- placeholderapi
+- 2.10.8
+- provided
+- true
+-
+-
+- *
+- *
+-
+-
+-
+-
+-
+-
+- org.geysermc.floodgate
+- api
+- 2.0-SNAPSHOT
+- provided
+-
+-
+-
+-
+- fr.xephi
+- authme
+- 5.4.0
+- provided
+- true
+-
+-
+- *
+- *
+-
+-
+-
+-
+-
+- com.lenis0012.bukkit
+- loginsecurity
+- 3.0.2
+- provided
+- true
+-
+-
+- *
+- *
+-
+-
+-
+-
+-
+- com.github.games647
+- LogIt
+- 9e3581db27
+- provided
+- true
+-
+-
+- *
+- *
+-
+-
+-
+-
+-
+- de.luricos.bukkit
+- xAuth
+- 2.6
+- provided
+- true
+-
+-
+-
+- *
+- *
+-
+-
+-
+-
+-
+-
+- de.st_ddt.crazy
+- CrazyCore
+- 10.7.7
+- true
+- system
+- ${project.basedir}/lib/CrazyCore v10.7.7.jar
+-
+-
+-
+- de.st_ddt.crazy
+- CrazyLogin
+- 7.23
+- true
+- system
+- ${project.basedir}/lib/CrazyLogin v7.23.2.jar
+-
+-
+-
+- ultraauth
+- ultraauth
+- 2.0.2
+- true
+- system
+- ${project.basedir}/lib/UltraAuth v2.1.2.jar
+-
+-
+-
+- com.github.Mohist-Community.SodionAuth
+- SodionAuth-Bukkit
+- 2bdfdc854b
+-
+-
+- com.github.Mohist-Community.SodionAuth
+- SodionAuth-Libs
+-
+-
+- true
+- provided
+-
+-
+-
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java
+deleted file mode 100644
+index ebfa144..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java
++++ /dev/null
+@@ -1,309 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit;
+-
+-import com.github.games647.fastlogin.bukkit.command.CrackedCommand;
+-import com.github.games647.fastlogin.bukkit.command.PremiumCommand;
+-import com.github.games647.fastlogin.bukkit.listener.ConnectionListener;
+-import com.github.games647.fastlogin.bukkit.listener.PaperCacheListener;
+-import com.github.games647.fastlogin.bukkit.listener.protocollib.ProtocolLibListener;
+-import com.github.games647.fastlogin.bukkit.listener.protocollib.SkinApplyListener;
+-import com.github.games647.fastlogin.bukkit.listener.protocolsupport.ProtocolSupportListener;
+-import com.github.games647.fastlogin.bukkit.task.DelayedAuthHook;
+-import com.github.games647.fastlogin.core.CommonUtil;
+-import com.github.games647.fastlogin.core.PremiumStatus;
+-import com.github.games647.fastlogin.core.shared.FastLoginCore;
+-import com.github.games647.fastlogin.core.shared.PlatformPlugin;
+-
+-import io.papermc.lib.PaperLib;
+-
+-import java.net.InetSocketAddress;
+-import java.nio.file.Path;
+-import java.util.Locale;
+-import java.util.Map;
+-import java.util.UUID;
+-import java.util.concurrent.ConcurrentHashMap;
+-import java.util.concurrent.ConcurrentMap;
+-
+-import org.bukkit.Bukkit;
+-import org.bukkit.command.CommandSender;
+-import org.bukkit.entity.Player;
+-import org.bukkit.plugin.PluginManager;
+-import org.bukkit.plugin.java.JavaPlugin;
+-import org.slf4j.Logger;
+-
+-/**
+- * This plugin checks if a player has a paid account and if so tries to skip offline mode authentication.
+- */
+-public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin {
+-
+- //1 minutes should be enough as a timeout for bad internet connection (Server, Client and Mojang)
+- private final ConcurrentMap loginSession = CommonUtil.buildCache(1, -1);
+- private final Map premiumPlayers = new ConcurrentHashMap<>();
+- private final Logger logger;
+-
+- private boolean serverStarted;
+- private BungeeManager bungeeManager;
+- private final BukkitScheduler scheduler;
+- private FastLoginCore core;
+-
+- private PremiumPlaceholder premiumPlaceholder;
+-
+- public FastLoginBukkit() {
+- this.logger = CommonUtil.createLoggerFromJDK(getLogger());
+- this.scheduler = new BukkitScheduler(this, logger, getThreadFactory());
+- }
+-
+- @Override
+- public void onEnable() {
+- core = new FastLoginCore<>(this);
+- core.load();
+-
+- if (getServer().getOnlineMode()) {
+- //we need to require offline to prevent a loginSession request for a offline player
+- logger.error("Server has to be in offline mode");
+- setEnabled(false);
+- return;
+- }
+-
+- // Check Floodgate config values
+- if (!isValidFloodgateConfigString("autoLoginFloodgate")
+- || !isValidFloodgateConfigString("allowFloodgateNameConflict")) {
+- setEnabled(false);
+- return;
+- }
+-
+- bungeeManager = new BungeeManager(this);
+- bungeeManager.initialize();
+-
+- PluginManager pluginManager = getServer().getPluginManager();
+- if (bungeeManager.isEnabled()) {
+- markInitialized();
+- } else {
+- if (!core.setupDatabase()) {
+- setEnabled(false);
+- return;
+- }
+-
+- if (pluginManager.isPluginEnabled("ProtocolSupport")) {
+- pluginManager.registerEvents(new ProtocolSupportListener(this, core.getRateLimiter()), this);
+- } else if (pluginManager.isPluginEnabled("ProtocolLib")) {
+- ProtocolLibListener.register(this, core.getRateLimiter());
+-
+- //if server is using paper - we need to set the skin at pre login anyway, so no need for this listener
+- if (!PaperLib.isPaper() && getConfig().getBoolean("forwardSkin")) {
+- pluginManager.registerEvents(new SkinApplyListener(this), this);
+- }
+- } else {
+- logger.warn("Either ProtocolLib or ProtocolSupport have to be installed if you don't use BungeeCord");
+- setEnabled(false);
+- return;
+- }
+- }
+-
+- //delay dependency setup because we load the plugin very early where plugins are initialized yet
+- getServer().getScheduler().runTaskLater(this, new DelayedAuthHook(this), 5L);
+-
+- pluginManager.registerEvents(new ConnectionListener(this), this);
+-
+- //if server is using paper - we need to add one more listener to correct the usercache usage
+- if (PaperLib.isPaper()) {
+- pluginManager.registerEvents(new PaperCacheListener(this), this);
+- }
+-
+- //register commands using a unique name
+- getCommand("premium").setExecutor(new PremiumCommand(this));
+- getCommand("cracked").setExecutor(new CrackedCommand(this));
+-
+- if (pluginManager.isPluginEnabled("PlaceholderAPI")) {
+- premiumPlaceholder = new PremiumPlaceholder(this);
+- premiumPlaceholder.register();
+- }
+-
+- dependencyWarnings();
+- }
+-
+- @Override
+- public void onDisable() {
+- loginSession.clear();
+- premiumPlayers.clear();
+-
+- if (core != null) {
+- core.close();
+- }
+-
+- bungeeManager.cleanup();
+- if (premiumPlaceholder != null && getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) {
+- try {
+- premiumPlaceholder.unregister();
+- } catch (Exception | NoSuchMethodError exception) {
+- logger.error("Failed to unregister placeholder", exception);
+- }
+- }
+- }
+-
+- public FastLoginCore getCore() {
+- return core;
+- }
+-
+- /**
+- * Gets a thread-safe map about players which are connecting to the server are being checked to be premium (paid
+- * account)
+- *
+- * @return a thread-safe loginSession map
+- */
+- public ConcurrentMap getLoginSessions() {
+- return loginSession;
+- }
+-
+- public BukkitLoginSession getSession(InetSocketAddress addr) {
+- String id = getSessionId(addr);
+- return loginSession.get(id);
+- }
+-
+- public String getSessionId(InetSocketAddress addr) {
+- return addr.getAddress().getHostAddress() + ':' + addr.getPort();
+- }
+-
+- public void putSession(InetSocketAddress addr, BukkitLoginSession session) {
+- String id = getSessionId(addr);
+- loginSession.put(id, session);
+- }
+-
+- public void removeSession(InetSocketAddress addr) {
+- String id = getSessionId(addr);
+- loginSession.remove(id);
+- }
+-
+- public Map getPremiumPlayers() {
+- return premiumPlayers;
+- }
+-
+- /**
+- * Fetches the premium status of an online player.
+- *
+- * @param onlinePlayer
+- * @return the online status or unknown if an error happened, the player isn't online or BungeeCord doesn't send
+- * us the status message yet (This means you cannot check the login status on the PlayerJoinEvent).
+- */
+- public PremiumStatus getStatus(UUID onlinePlayer) {
+- return premiumPlayers.getOrDefault(onlinePlayer, PremiumStatus.UNKNOWN);
+- }
+-
+- /**
+- * Wait before the server is fully started. This is workaround, because connections right on startup are not
+- * injected by ProtocolLib
+- *
+- * @return true if ProtocolLib can now intercept packets
+- */
+- public boolean isServerFullyStarted() {
+- return serverStarted;
+- }
+-
+- public void markInitialized() {
+- this.serverStarted = true;
+- }
+-
+- public BungeeManager getBungeeManager() {
+- return bungeeManager;
+- }
+-
+- @Override
+- public Path getPluginFolder() {
+- return getDataFolder().toPath();
+- }
+-
+- @Override
+- public Logger getLog() {
+- return logger;
+- }
+-
+- @Override
+- public BukkitScheduler getScheduler() {
+- return scheduler;
+- }
+-
+- @Override
+- public void sendMessage(CommandSender receiver, String message) {
+- receiver.sendMessage(message);
+- }
+-
+- /**
+- * Checks if a config entry (related to Floodgate) is valid.
+- * Writes to Log if the value is invalid.
+- *
+- * This should be used for:
+- *
+- * - allowFloodgateNameConflict
+- *
- autoLoginFloodgate
+- *
- autoRegisterFloodgate
+- *
+- *
+- *
+- * @param key the key of the entry in config.yml
+- * @return true if the entry's value is "true", "false", or "linked"
+- */
+- private boolean isValidFloodgateConfigString(String key) {
+- String value = core.getConfig().get(key).toString().toLowerCase(Locale.ENGLISH);
+- if (!value.equals("true") && !value.equals("linked") && !value.equals("false") && !value.equals("no-conflict")) {
+- logger.error("Invalid value detected for {} in FastLogin/config.yml.", key);
+- return false;
+- }
+- return true;
+- }
+-
+- /**
+- * Checks if a plugin is installed on the server
+- * @param name the name of the plugin
+- * @return true if the plugin is installed
+- */
+- @Override
+- public boolean isPluginInstalled(String name) {
+- // the plugin may be enabled after FastLogin, so isPluginEnabled() won't work here
+- return Bukkit.getServer().getPluginManager().getPlugin(name) != null;
+- }
+-
+- /**
+- * Send warning messages to log if incompatible plugins are used
+- */
+- private void dependencyWarnings() {
+- if (isPluginInstalled("floodgate-bukkit")) {
+- logger.warn("We have detected that you are running Floodgate 1.0 which is not supported by the Bukkit "
+- + "version of FastLogin.");
+- logger.warn("If you would like to use FastLogin with Floodgate, you can download development builds of "
+- + "Floodgate 2.0 from https://ci.opencollab.dev/job/GeyserMC/job/Floodgate/job/dev%252F2.0/");
+- logger.warn("Don't forget to update Geyser to a supported version as well from "
+- + "https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/floodgate-2.0/");
+- } else if (isPluginInstalled("floodgate") && isPluginInstalled("ProtocolLib")) {
+- logger.warn("We have detected that you are running FastLogin alongside Floodgate and ProtocolLib.");
+- logger.warn("Currently there is an issue with FastLogin that prevents Floodgate's name prefixes from " +
+- "showing up when it is together used with ProtocolLib.");
+- logger.warn("If you would like to use Floodgate name prefixes, you can replace ProtocolLib with " +
+- "ProtocolSupport which does not have this issue.");
+- logger.warn("For more information visit https://github.com/games647/FastLogin/issues/493");
+- }
+- }
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/ConnectionListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/ConnectionListener.java
+deleted file mode 100644
+index 10ce38d..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/ConnectionListener.java
++++ /dev/null
+@@ -1,116 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.listener;
+-
+-import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
+-import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
+-import com.github.games647.fastlogin.bukkit.task.FloodgateAuthTask;
+-import com.github.games647.fastlogin.bukkit.task.ForceLoginTask;
+-
+-import org.bukkit.Bukkit;
+-import org.bukkit.entity.Player;
+-import org.bukkit.event.EventHandler;
+-import org.bukkit.event.EventPriority;
+-import org.bukkit.event.Listener;
+-import org.bukkit.event.player.PlayerJoinEvent;
+-import org.bukkit.event.player.PlayerLoginEvent;
+-import org.bukkit.event.player.PlayerLoginEvent.Result;
+-import org.geysermc.floodgate.api.FloodgateApi;
+-import org.geysermc.floodgate.api.player.FloodgatePlayer;
+-import org.bukkit.event.player.PlayerQuitEvent;
+-
+-/**
+- * This listener tells authentication plugins if the player has a premium account and we checked it successfully. So the
+- * plugin can skip authentication.
+- */
+-public class ConnectionListener implements Listener {
+-
+- private static final long DELAY_LOGIN = 20L / 2;
+-
+- private final FastLoginBukkit plugin;
+-
+- public ConnectionListener(FastLoginBukkit plugin) {
+- this.plugin = plugin;
+- }
+-
+- @EventHandler(priority = EventPriority.LOWEST)
+- public void onPlayerLogin(PlayerLoginEvent loginEvent) {
+- removeBlockedStatus(loginEvent.getPlayer());
+- if (loginEvent.getResult() == Result.ALLOWED && !plugin.isServerFullyStarted()) {
+- loginEvent.disallow(Result.KICK_OTHER, plugin.getCore().getMessage("not-started"));
+- }
+- }
+-
+- @EventHandler(ignoreCancelled = true)
+- public void onPlayerJoin(PlayerJoinEvent joinEvent) {
+- Player player = joinEvent.getPlayer();
+-
+- Bukkit.getScheduler().runTaskLater(plugin, () -> {
+- // session exists so the player is ready for force login
+- // cases: Paper (firing BungeeCord message before PlayerJoinEvent) or not running BungeeCord and already
+- // having the login session from the login process
+- BukkitLoginSession session = plugin.getSession(player.getAddress());
+-
+- boolean isFloodgateLogin = false;
+- if (Bukkit.getServer().getPluginManager().isPluginEnabled("floodgate")) {
+- FloodgatePlayer floodgatePlayer = FloodgateApi.getInstance().getPlayer(player.getUniqueId());
+- if (floodgatePlayer != null) {
+- isFloodgateLogin = true;
+- Runnable floodgateAuthTask = new FloodgateAuthTask(plugin.getCore(), player, floodgatePlayer);
+- Bukkit.getScheduler().runTaskAsynchronously(plugin, floodgateAuthTask);
+- }
+- }
+-
+- if (!isFloodgateLogin) {
+- if (session == null) {
+- String sessionId = plugin.getSessionId(player.getAddress());
+- plugin.getLog().info("No on-going login session for player: {} with ID {}", player, sessionId);
+- } else {
+- Runnable forceLoginTask = new ForceLoginTask(plugin.getCore(), player, session);
+- Bukkit.getScheduler().runTaskAsynchronously(plugin, forceLoginTask);
+- }
+- }
+-
+- plugin.getBungeeManager().markJoinEventFired(player);
+- // delay the login process to let auth plugins initialize the player
+- // Magic number however as there is no direct event from those plugins
+- }, DELAY_LOGIN);
+- }
+-
+- @EventHandler
+- public void onPlayerQuit(PlayerQuitEvent quitEvent) {
+- Player player = quitEvent.getPlayer();
+-
+- removeBlockedStatus(player);
+- plugin.getCore().getPendingConfirms().remove(player.getUniqueId());
+- plugin.getPremiumPlayers().remove(player.getUniqueId());
+- plugin.getBungeeManager().cleanup(player);
+- }
+-
+- private void removeBlockedStatus(Player player) {
+- player.removeMetadata(plugin.getName(), plugin);
+- }
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/PaperCacheListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/PaperCacheListener.java
+deleted file mode 100644
+index 884960c..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/PaperCacheListener.java
++++ /dev/null
+@@ -1,66 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.listener;
+-
+-import com.destroystokyo.paper.profile.ProfileProperty;
+-import com.github.games647.craftapi.model.skin.Textures;
+-import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
+-import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
+-import org.bukkit.event.EventHandler;
+-import org.bukkit.event.EventPriority;
+-import org.bukkit.event.Listener;
+-import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
+-import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result;
+-
+-public class PaperCacheListener implements Listener {
+-
+- private final FastLoginBukkit plugin;
+-
+- public PaperCacheListener(final FastLoginBukkit plugin) {
+- this.plugin = plugin;
+- }
+-
+- @EventHandler(priority = EventPriority.HIGHEST)
+- //if paper is used - player skin must be set at pre login, otherwise usercache is used
+- //using usercache makes premium name change basically impossible
+- public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent event) {
+- if (event.getLoginResult() != Result.ALLOWED) {
+- return;
+- }
+-
+- // event gives us only IP, not the port, so we need to loop through all the sessions
+- for (BukkitLoginSession session : plugin.getLoginSessions().values()) {
+- if (!event.getName().equals(session.getUsername())) {
+- continue;
+- }
+-
+- session.getSkin().ifPresent(skin -> event.getPlayerProfile().setProperty(new ProfileProperty(Textures.KEY,
+- skin.getValue(), skin.getSignature())));
+- break;
+- }
+- }
+-
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/NameCheckTask.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/NameCheckTask.java
+deleted file mode 100644
+index 54d2ea3..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/NameCheckTask.java
++++ /dev/null
+@@ -1,114 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.listener.protocollib;
+-
+-import com.comphenix.protocol.ProtocolLibrary;
+-import com.comphenix.protocol.events.PacketEvent;
+-import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
+-import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
+-import com.github.games647.fastlogin.bukkit.event.BukkitFastLoginPreLoginEvent;
+-import com.github.games647.fastlogin.core.StoredProfile;
+-import com.github.games647.fastlogin.core.shared.JoinManagement;
+-import com.github.games647.fastlogin.core.shared.event.FastLoginPreLoginEvent;
+-
+-import java.security.PublicKey;
+-import java.util.Random;
+-
+-import org.bukkit.command.CommandSender;
+-import org.bukkit.entity.Player;
+-
+-public class NameCheckTask extends JoinManagement
+- implements Runnable {
+-
+- private final FastLoginBukkit plugin;
+- private final PacketEvent packetEvent;
+- private final PublicKey publicKey;
+-
+- private final Random random;
+-
+- private final Player player;
+- private final String username;
+-
+- public NameCheckTask(FastLoginBukkit plugin, Random random, Player player, PacketEvent packetEvent,
+- String username, PublicKey publicKey) {
+- super(plugin.getCore(), plugin.getCore().getAuthPluginHook());
+-
+- this.plugin = plugin;
+- this.packetEvent = packetEvent;
+- this.publicKey = publicKey;
+- this.random = random;
+- this.player = player;
+- this.username = username;
+- }
+-
+- @Override
+- public void run() {
+- try {
+- super.onLogin(username, new ProtocolLibLoginSource(player, random, publicKey));
+- } finally {
+- ProtocolLibrary.getProtocolManager().getAsynchronousManager().signalPacketTransmission(packetEvent);
+- }
+- }
+-
+- @Override
+- public FastLoginPreLoginEvent callFastLoginPreLoginEvent(String username, ProtocolLibLoginSource source,
+- StoredProfile profile) {
+- BukkitFastLoginPreLoginEvent event = new BukkitFastLoginPreLoginEvent(username, source, profile);
+- plugin.getServer().getPluginManager().callEvent(event);
+- return event;
+- }
+-
+- //Minecraft server implementation
+- //https://github.com/bergerkiller/CraftSource/blob/master/net.minecraft.server/LoginListener.java#L161
+- @Override
+- public void requestPremiumLogin(ProtocolLibLoginSource source, StoredProfile profile
+- , String username, boolean registered) {
+- try {
+- source.enableOnlinemode();
+- } catch (Exception ex) {
+- plugin.getLog().error("Cannot send encryption packet. Falling back to cracked login for: {}", profile, ex);
+- return;
+- }
+-
+- String ip = player.getAddress().getAddress().getHostAddress();
+- core.getPendingLogin().put(ip + username, new Object());
+-
+- byte[] verify = source.getVerifyToken();
+-
+- BukkitLoginSession playerSession = new BukkitLoginSession(username, verify, registered, profile);
+- plugin.putSession(player.getAddress(), playerSession);
+- //cancel only if the player has a paid account otherwise login as normal offline player
+- synchronized (packetEvent.getAsyncMarker().getProcessingLock()) {
+- packetEvent.setCancelled(true);
+- }
+- }
+-
+- @Override
+- public void startCrackedSession(ProtocolLibLoginSource source, StoredProfile profile, String username) {
+- BukkitLoginSession loginSession = new BukkitLoginSession(username, profile);
+- plugin.putSession(player.getAddress(), loginSession);
+- }
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java
+deleted file mode 100644
+index 1121862..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java
++++ /dev/null
+@@ -1,133 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.listener.protocollib;
+-
+-import com.comphenix.protocol.PacketType;
+-import com.comphenix.protocol.ProtocolLibrary;
+-import com.comphenix.protocol.events.PacketAdapter;
+-import com.comphenix.protocol.events.PacketContainer;
+-import com.comphenix.protocol.events.PacketEvent;
+-import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
+-import com.github.games647.fastlogin.core.RateLimiter;
+-
+-import java.security.KeyPair;
+-import java.security.SecureRandom;
+-
+-import org.bukkit.entity.Player;
+-
+-import static com.comphenix.protocol.PacketType.Login.Client.ENCRYPTION_BEGIN;
+-import static com.comphenix.protocol.PacketType.Login.Client.START;
+-
+-public class ProtocolLibListener extends PacketAdapter {
+-
+- public static final String SOURCE_META_KEY = "source";
+-
+- private final FastLoginBukkit plugin;
+-
+- //just create a new once on plugin enable. This used for verify token generation
+- private final SecureRandom random = new SecureRandom();
+- private final KeyPair keyPair = EncryptionUtil.generateKeyPair();
+- private final RateLimiter rateLimiter;
+-
+- public ProtocolLibListener(FastLoginBukkit plugin, RateLimiter rateLimiter) {
+- //run async in order to not block the server, because we are making api calls to Mojang
+- super(params()
+- .plugin(plugin)
+- .types(START, ENCRYPTION_BEGIN)
+- .optionAsync());
+-
+- this.plugin = plugin;
+- this.rateLimiter = rateLimiter;
+- }
+-
+- public static void register(FastLoginBukkit plugin, RateLimiter rateLimiter) {
+- // they will be created with a static builder, because otherwise it will throw a NoClassDefFoundError
+- // TODO: make synchronous processing, but do web or database requests async
+- ProtocolLibrary.getProtocolManager()
+- .getAsynchronousManager()
+- .registerAsyncHandler(new ProtocolLibListener(plugin, rateLimiter))
+- .start();
+- }
+-
+- @Override
+- public void onPacketReceiving(PacketEvent packetEvent) {
+- if (packetEvent.isCancelled()
+- || plugin.getCore().getAuthPluginHook() == null
+- || !plugin.isServerFullyStarted()) {
+- return;
+- }
+-
+- if (isFastLoginPacket(packetEvent)) {
+- // this is our own packet
+- return;
+- }
+-
+- Player sender = packetEvent.getPlayer();
+- PacketType packetType = packetEvent.getPacketType();
+- if (packetType == START) {
+- if (!rateLimiter.tryAcquire()) {
+- plugin.getLog().warn("Simple Anti-Bot join limit - Ignoring {}", sender);
+- return;
+- }
+-
+- onLogin(packetEvent, sender);
+- } else {
+- onEncryptionBegin(packetEvent, sender);
+- }
+- }
+-
+- private Boolean isFastLoginPacket(PacketEvent packetEvent) {
+- return packetEvent.getPacket().getMeta(SOURCE_META_KEY)
+- .map(val -> val.equals(plugin.getName()))
+- .orElse(false);
+- }
+-
+- private void onEncryptionBegin(PacketEvent packetEvent, Player sender) {
+- byte[] sharedSecret = packetEvent.getPacket().getByteArrays().read(0);
+-
+- packetEvent.getAsyncMarker().incrementProcessingDelay();
+- Runnable verifyTask = new VerifyResponseTask(plugin, packetEvent, sender, sharedSecret, keyPair);
+- plugin.getScheduler().runAsync(verifyTask);
+- }
+-
+- private void onLogin(PacketEvent packetEvent, Player player) {
+- //this includes ip:port. Should be unique for an incoming login request with a timeout of 2 minutes
+- String sessionKey = player.getAddress().toString();
+-
+- //remove old data every time on a new login in order to keep the session only for one person
+- plugin.removeSession(player.getAddress());
+-
+- //player.getName() won't work at this state
+- PacketContainer packet = packetEvent.getPacket();
+-
+- String username = packet.getGameProfiles().read(0).getName();
+- plugin.getLog().trace("GameProfile {} with {} connecting", sessionKey, username);
+-
+- packetEvent.getAsyncMarker().incrementProcessingDelay();
+- Runnable nameCheckTask = new NameCheckTask(plugin, random, player, packetEvent, username, keyPair.getPublic());
+- plugin.getScheduler().runAsync(nameCheckTask);
+- }
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibLoginSource.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibLoginSource.java
+deleted file mode 100644
+index f35569d..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibLoginSource.java
++++ /dev/null
+@@ -1,129 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.listener.protocollib;
+-
+-import com.comphenix.protocol.ProtocolLibrary;
+-import com.comphenix.protocol.ProtocolManager;
+-import com.comphenix.protocol.events.PacketContainer;
+-import com.comphenix.protocol.reflect.StructureModifier;
+-import com.comphenix.protocol.wrappers.WrappedChatComponent;
+-import com.github.games647.fastlogin.core.shared.LoginSource;
+-
+-import java.lang.reflect.InvocationTargetException;
+-import java.net.InetSocketAddress;
+-import java.security.PublicKey;
+-import java.util.Arrays;
+-import java.util.Random;
+-
+-import org.bukkit.entity.Player;
+-
+-import static com.comphenix.protocol.PacketType.Login.Server.DISCONNECT;
+-import static com.comphenix.protocol.PacketType.Login.Server.ENCRYPTION_BEGIN;
+-
+-class ProtocolLibLoginSource implements LoginSource {
+-
+- private final Player player;
+-
+- private final Random random;
+- private final PublicKey publicKey;
+-
+- private final String serverId = "";
+- private byte[] verifyToken;
+-
+- public ProtocolLibLoginSource(Player player, Random random, PublicKey publicKey) {
+- this.player = player;
+- this.random = random;
+- this.publicKey = publicKey;
+- }
+-
+- @Override
+- public void enableOnlinemode() throws Exception {
+- verifyToken = EncryptionUtil.generateVerifyToken(random);
+-
+- /*
+- * Packet Information: https://wiki.vg/Protocol#Encryption_Request
+- *
+- * ServerID="" (String) key=public server key verifyToken=random 4 byte array
+- */
+- PacketContainer newPacket = new PacketContainer(ENCRYPTION_BEGIN);
+-
+- newPacket.getStrings().write(0, serverId);
+- StructureModifier keyModifier = newPacket.getSpecificModifier(PublicKey.class);
+- int verifyField = 0;
+- if (keyModifier.getFields().isEmpty()) {
+- // Since 1.16.4 this is now a byte field
+- newPacket.getByteArrays().write(0, publicKey.getEncoded());
+- verifyField++;
+- } else {
+- keyModifier.write(0, publicKey);
+- }
+-
+- newPacket.getByteArrays().write(verifyField, verifyToken);
+-
+- //serverId is a empty string
+- ProtocolLibrary.getProtocolManager().sendServerPacket(player, newPacket);
+- }
+-
+- @Override
+- public void kick(String message) throws InvocationTargetException {
+- ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
+-
+- PacketContainer kickPacket = new PacketContainer(DISCONNECT);
+- kickPacket.getChatComponents().write(0, WrappedChatComponent.fromText(message));
+-
+- try {
+- //send kick packet at login state
+- //the normal event.getPlayer.kickPlayer(String) method does only work at play state
+- protocolManager.sendServerPacket(player, kickPacket);
+- } finally {
+- //tell the server that we want to close the connection
+- player.kickPlayer("Disconnect");
+- }
+- }
+-
+- @Override
+- public InetSocketAddress getAddress() {
+- return player.getAddress();
+- }
+-
+- public String getServerId() {
+- return serverId;
+- }
+-
+- public byte[] getVerifyToken() {
+- return verifyToken.clone();
+- }
+-
+- @Override
+- public String toString() {
+- return this.getClass().getSimpleName() + '{' +
+- "player=" + player +
+- ", random=" + random +
+- ", serverId='" + serverId + '\'' +
+- ", verifyToken=" + Arrays.toString(verifyToken) +
+- '}';
+- }
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/VerifyResponseTask.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/VerifyResponseTask.java
+deleted file mode 100644
+index 15a85c8..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/VerifyResponseTask.java
++++ /dev/null
+@@ -1,297 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.listener.protocollib;
+-
+-import com.comphenix.protocol.ProtocolLibrary;
+-import com.comphenix.protocol.events.PacketContainer;
+-import com.comphenix.protocol.events.PacketEvent;
+-import com.comphenix.protocol.injector.server.TemporaryPlayerFactory;
+-import com.comphenix.protocol.reflect.FieldUtils;
+-import com.comphenix.protocol.reflect.FuzzyReflection;
+-import com.comphenix.protocol.utility.MinecraftReflection;
+-import com.comphenix.protocol.wrappers.WrappedChatComponent;
+-import com.comphenix.protocol.wrappers.WrappedGameProfile;
+-import com.github.games647.craftapi.model.auth.Verification;
+-import com.github.games647.craftapi.model.skin.SkinProperty;
+-import com.github.games647.craftapi.resolver.MojangResolver;
+-import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
+-import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
+-
+-import java.io.IOException;
+-import java.lang.reflect.InvocationTargetException;
+-import java.lang.reflect.Method;
+-import java.net.InetAddress;
+-import java.net.InetSocketAddress;
+-import java.security.GeneralSecurityException;
+-import java.security.Key;
+-import java.security.KeyPair;
+-import java.security.PrivateKey;
+-import java.util.Arrays;
+-import java.util.Optional;
+-import java.util.UUID;
+-
+-import javax.crypto.Cipher;
+-import javax.crypto.SecretKey;
+-
+-import org.bukkit.entity.Player;
+-
+-import static com.comphenix.protocol.PacketType.Login.Client.START;
+-import static com.comphenix.protocol.PacketType.Login.Server.DISCONNECT;
+-
+-public class VerifyResponseTask implements Runnable {
+-
+- private static final String ENCRYPTION_CLASS_NAME = "MinecraftEncryption";
+- private static final Class> ENCRYPTION_CLASS;
+-
+- static {
+- ENCRYPTION_CLASS = MinecraftReflection.getMinecraftClass("util." + ENCRYPTION_CLASS_NAME, ENCRYPTION_CLASS_NAME);
+- }
+-
+- private final FastLoginBukkit plugin;
+- private final PacketEvent packetEvent;
+- private final KeyPair serverKey;
+-
+- private final Player player;
+-
+- private final byte[] sharedSecret;
+-
+- private static Method encryptMethod;
+- private static Method cipherMethod;
+-
+- public VerifyResponseTask(FastLoginBukkit plugin, PacketEvent packetEvent, Player player,
+- byte[] sharedSecret, KeyPair keyPair) {
+- this.plugin = plugin;
+- this.packetEvent = packetEvent;
+- this.player = player;
+- this.sharedSecret = Arrays.copyOf(sharedSecret, sharedSecret.length);
+- this.serverKey = keyPair;
+- }
+-
+- @Override
+- public void run() {
+- try {
+- BukkitLoginSession session = plugin.getSession(player.getAddress());
+- if (session == null) {
+- disconnect("invalid-request", true
+- , "GameProfile {0} tried to send encryption response at invalid state", player.getAddress());
+- } else {
+- verifyResponse(session);
+- }
+- } finally {
+- //this is a fake packet; it shouldn't be send to the server
+- synchronized (packetEvent.getAsyncMarker().getProcessingLock()) {
+- packetEvent.setCancelled(true);
+- }
+-
+- ProtocolLibrary.getProtocolManager().getAsynchronousManager().signalPacketTransmission(packetEvent);
+- }
+- }
+-
+- private void verifyResponse(BukkitLoginSession session) {
+- PrivateKey privateKey = serverKey.getPrivate();
+-
+- SecretKey loginKey;
+- try {
+- loginKey = EncryptionUtil.decryptSharedKey(privateKey, sharedSecret);
+- } catch (GeneralSecurityException securityEx) {
+- disconnect("error-kick", false, "Cannot decrypt received contents", securityEx);
+- return;
+- }
+-
+- try {
+- if (!checkVerifyToken(session) || !enableEncryption(loginKey)) {
+- return;
+- }
+- } catch (Exception ex) {
+- disconnect("error-kick", false, "Cannot decrypt received contents", ex);
+- return;
+- }
+-
+- String serverId = EncryptionUtil.getServerIdHashString("", loginKey, serverKey.getPublic());
+-
+- String requestedUsername = session.getRequestUsername();
+- InetSocketAddress socketAddress = player.getAddress();
+- try {
+- MojangResolver resolver = plugin.getCore().getResolver();
+- InetAddress address = socketAddress.getAddress();
+- Optional response = resolver.hasJoined(requestedUsername, serverId, address);
+- if (response.isPresent()) {
+- Verification verification = response.get();
+- plugin.getLog().info("Profile {} has a verified premium account", requestedUsername);
+- String realUsername = verification.getName();
+- if (realUsername == null) {
+- disconnect("invalid-session", true, "Username field null for {}", requestedUsername);
+- return;
+- }
+-
+- SkinProperty[] properties = verification.getProperties();
+- if (properties.length > 0) {
+- session.setSkinProperty(properties[0]);
+- }
+-
+- session.setVerifiedUsername(realUsername);
+- session.setUuid(verification.getId());
+- session.setVerified(true);
+-
+- setPremiumUUID(session.getUuid());
+- receiveFakeStartPacket(realUsername);
+- } else {
+- //user tried to fake a authentication
+- disconnect("invalid-session", true
+- , "GameProfile {0} ({1}) tried to log in with an invalid session ServerId: {2}"
+- , session.getRequestUsername(), socketAddress, serverId);
+- }
+- } catch (IOException ioEx) {
+- disconnect("error-kick", false, "Failed to connect to session server", ioEx);
+- }
+- }
+-
+- private void setPremiumUUID(UUID premiumUUID) {
+- if (plugin.getConfig().getBoolean("premiumUuid") && premiumUUID != null) {
+- try {
+- Object networkManager = getNetworkManager();
+- //https://github.com/bergerkiller/CraftSource/blob/master/net.minecraft.server/NetworkManager.java#L69
+- FieldUtils.writeField(networkManager, "spoofedUUID", premiumUUID, true);
+- } catch (Exception exc) {
+- plugin.getLog().error("Error setting premium uuid of {}", player, exc);
+- }
+- }
+- }
+-
+- private boolean checkVerifyToken(BukkitLoginSession session) throws GeneralSecurityException {
+- byte[] requestVerify = session.getVerifyToken();
+- //encrypted verify token
+- byte[] responseVerify = packetEvent.getPacket().getByteArrays().read(1);
+-
+- //https://github.com/bergerkiller/CraftSource/blob/master/net.minecraft.server/LoginListener.java#L182
+- if (!Arrays.equals(requestVerify, EncryptionUtil.decrypt(serverKey.getPrivate(), responseVerify))) {
+- //check if the verify token are equal to the server sent one
+- disconnect("invalid-verify-token", true
+- , "GameProfile {0} ({1}) tried to login with an invalid verify token. Server: {2} Client: {3}"
+- , session.getRequestUsername(), packetEvent.getPlayer().getAddress(), requestVerify, responseVerify);
+- return false;
+- }
+-
+- return true;
+- }
+-
+- //try to get the networkManager from ProtocolLib
+- private Object getNetworkManager() throws IllegalAccessException, ClassNotFoundException {
+- Object injectorContainer = TemporaryPlayerFactory.getInjectorFromPlayer(player);
+-
+- // ChannelInjector
+- Class> injectorClass = Class.forName("com.comphenix.protocol.injector.netty.Injector");
+- Object rawInjector = FuzzyReflection.getFieldValue(injectorContainer, injectorClass, true);
+- return FieldUtils.readField(rawInjector, "networkManager", true);
+- }
+-
+- private boolean enableEncryption(SecretKey loginKey) throws IllegalArgumentException {
+- plugin.getLog().info("Enabling onlinemode encryption for {}", player.getName());
+- // Initialize method reflections
+- if (encryptMethod == null) {
+- Class> networkManagerClass = MinecraftReflection.getNetworkManagerClass();
+-
+- try {
+- // Try to get the old (pre MC 1.16.4) encryption method
+- encryptMethod = FuzzyReflection.fromClass(networkManagerClass)
+- .getMethodByParameters("a", SecretKey.class);
+- } catch (IllegalArgumentException exception) {
+- // Get the new encryption method
+- encryptMethod = FuzzyReflection.fromClass(networkManagerClass)
+- .getMethodByParameters("a", Cipher.class, Cipher.class);
+-
+- // Get the needed Cipher helper method (used to generate ciphers from login key)
+- cipherMethod = FuzzyReflection.fromClass(ENCRYPTION_CLASS)
+- .getMethodByParameters("a", int.class, Key.class);
+- }
+- }
+-
+- try {
+- Object networkManager = this.getNetworkManager();
+-
+- // If cipherMethod is null - use old encryption (pre MC 1.16.4), otherwise use the new cipher one
+- if (cipherMethod == null) {
+- // Encrypt/decrypt packet flow, this behaviour is expected by the client
+- encryptMethod.invoke(networkManager, loginKey);
+- } else {
+- // Create ciphers from login key
+- Object decryptionCipher = cipherMethod.invoke(null, Cipher.DECRYPT_MODE, loginKey);
+- Object encryptionCipher = cipherMethod.invoke(null, Cipher.ENCRYPT_MODE, loginKey);
+-
+- // Encrypt/decrypt packet flow, this behaviour is expected by the client
+- encryptMethod.invoke(networkManager, decryptionCipher, encryptionCipher);
+- }
+- } catch (Exception ex) {
+- disconnect("error-kick", false, "Couldn't enable encryption", ex);
+- return false;
+- }
+-
+- return true;
+- }
+-
+- private void disconnect(String reasonKey, boolean debug, String logMessage, Object... arguments) {
+- if (debug) {
+- plugin.getLog().debug(logMessage, arguments);
+- } else {
+- plugin.getLog().error(logMessage, arguments);
+- }
+-
+- kickPlayer(plugin.getCore().getMessage(reasonKey));
+- }
+-
+- private void kickPlayer(String reason) {
+- PacketContainer kickPacket = new PacketContainer(DISCONNECT);
+- kickPacket.getChatComponents().write(0, WrappedChatComponent.fromText(reason));
+- try {
+- //send kick packet at login state
+- //the normal event.getPlayer.kickPlayer(String) method does only work at play state
+- ProtocolLibrary.getProtocolManager().sendServerPacket(player, kickPacket);
+- //tell the server that we want to close the connection
+- player.kickPlayer("Disconnect");
+- } catch (InvocationTargetException ex) {
+- plugin.getLog().error("Error sending kick packet for: {}", player, ex);
+- }
+- }
+-
+- //fake a new login packet in order to let the server handle all the other stuff
+- private void receiveFakeStartPacket(String username) {
+- //see StartPacketListener for packet information
+- PacketContainer startPacket = new PacketContainer(START);
+-
+- //uuid is ignored by the packet definition
+- WrappedGameProfile fakeProfile = new WrappedGameProfile(UUID.randomUUID(), username);
+- startPacket.getGameProfiles().write(0, fakeProfile);
+- try {
+- //we don't want to handle our own packets so ignore filters
+- startPacket.setMeta(ProtocolLibListener.SOURCE_META_KEY, plugin.getName());
+- ProtocolLibrary.getProtocolManager().recieveClientPacket(player, startPacket, true);
+- } catch (InvocationTargetException | IllegalAccessException ex) {
+- plugin.getLog().warn("Failed to fake a new start packet for: {}", username, ex);
+- //cancel the event in order to prevent the server receiving an invalid packet
+- kickPlayer(plugin.getCore().getMessage("error-kick"));
+- }
+- }
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolLoginSource.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolLoginSource.java
+deleted file mode 100644
+index 2e98178..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolLoginSource.java
++++ /dev/null
+@@ -1,67 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.listener.protocolsupport;
+-
+-import com.github.games647.fastlogin.core.shared.LoginSource;
+-
+-import java.net.InetSocketAddress;
+-
+-import protocolsupport.api.events.PlayerLoginStartEvent;
+-
+-public class ProtocolLoginSource implements LoginSource {
+-
+- private final PlayerLoginStartEvent loginStartEvent;
+-
+- public ProtocolLoginSource(PlayerLoginStartEvent loginStartEvent) {
+- this.loginStartEvent = loginStartEvent;
+- }
+-
+- @Override
+- public void enableOnlinemode() {
+- loginStartEvent.setOnlineMode(true);
+- }
+-
+- @Override
+- public void kick(String message) {
+- loginStartEvent.denyLogin(message);
+- }
+-
+- @Override
+- public InetSocketAddress getAddress() {
+- return loginStartEvent.getAddress();
+- }
+-
+- public PlayerLoginStartEvent getLoginStartEvent() {
+- return loginStartEvent;
+- }
+-
+- @Override
+- public String toString() {
+- return this.getClass().getSimpleName() + '{' +
+- "loginStartEvent=" + loginStartEvent +
+- '}';
+- }
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolSupportListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolSupportListener.java
+deleted file mode 100644
+index d25bb49..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolSupportListener.java
++++ /dev/null
+@@ -1,129 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.listener.protocolsupport;
+-
+-import com.github.games647.craftapi.UUIDAdapter;
+-import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
+-import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
+-import com.github.games647.fastlogin.bukkit.event.BukkitFastLoginPreLoginEvent;
+-import com.github.games647.fastlogin.core.RateLimiter;
+-import com.github.games647.fastlogin.core.StoredProfile;
+-import com.github.games647.fastlogin.core.shared.JoinManagement;
+-import com.github.games647.fastlogin.core.shared.event.FastLoginPreLoginEvent;
+-
+-import java.net.InetSocketAddress;
+-import java.util.Optional;
+-
+-import org.bukkit.command.CommandSender;
+-import org.bukkit.entity.Player;
+-import org.bukkit.event.EventHandler;
+-import org.bukkit.event.Listener;
+-
+-import protocolsupport.api.events.ConnectionCloseEvent;
+-import protocolsupport.api.events.PlayerLoginStartEvent;
+-import protocolsupport.api.events.PlayerProfileCompleteEvent;
+-
+-public class ProtocolSupportListener extends JoinManagement
+- implements Listener {
+-
+- private final FastLoginBukkit plugin;
+- private final RateLimiter rateLimiter;
+-
+- public ProtocolSupportListener(FastLoginBukkit plugin, RateLimiter rateLimiter) {
+- super(plugin.getCore(), plugin.getCore().getAuthPluginHook());
+-
+- this.plugin = plugin;
+- this.rateLimiter = rateLimiter;
+- }
+-
+- @EventHandler
+- public void onLoginStart(PlayerLoginStartEvent loginStartEvent) {
+- if (loginStartEvent.isLoginDenied() || plugin.getCore().getAuthPluginHook() == null) {
+- return;
+- }
+-
+- if (!rateLimiter.tryAcquire()) {
+- plugin.getLog().warn("Simple Anti-Bot join limit - Ignoring {}", loginStartEvent.getConnection());
+- return;
+- }
+-
+- String username = loginStartEvent.getConnection().getProfile().getName();
+- InetSocketAddress address = loginStartEvent.getAddress();
+-
+- //remove old data every time on a new login in order to keep the session only for one person
+- plugin.removeSession(address);
+-
+- ProtocolLoginSource source = new ProtocolLoginSource(loginStartEvent);
+- super.onLogin(username, source);
+- }
+-
+- @EventHandler
+- public void onConnectionClosed(ConnectionCloseEvent closeEvent) {
+- InetSocketAddress address = closeEvent.getConnection().getAddress();
+- plugin.removeSession(address);
+- }
+-
+- @EventHandler
+- public void onPropertiesResolve(PlayerProfileCompleteEvent profileCompleteEvent) {
+- InetSocketAddress address = profileCompleteEvent.getAddress();
+- BukkitLoginSession session = plugin.getSession(address);
+-
+- if (session != null && profileCompleteEvent.getConnection().getProfile().isOnlineMode()) {
+- session.setVerified(true);
+-
+- if (!plugin.getConfig().getBoolean("premiumUuid")) {
+- String username = Optional.ofNullable(profileCompleteEvent.getForcedName())
+- .orElse(profileCompleteEvent.getConnection().getProfile().getName());
+- profileCompleteEvent.setForcedUUID(UUIDAdapter.generateOfflineId(username));
+- }
+- }
+- }
+-
+- @Override
+- public FastLoginPreLoginEvent callFastLoginPreLoginEvent(String username, ProtocolLoginSource source, StoredProfile profile) {
+- BukkitFastLoginPreLoginEvent event = new BukkitFastLoginPreLoginEvent(username, source, profile);
+- plugin.getServer().getPluginManager().callEvent(event);
+- return event;
+- }
+-
+- @Override
+- public void requestPremiumLogin(ProtocolLoginSource source, StoredProfile profile, String username
+- , boolean registered) {
+- source.enableOnlinemode();
+-
+- String ip = source.getAddress().getAddress().getHostAddress();
+- plugin.getCore().getPendingLogin().put(ip + username, new Object());
+-
+- BukkitLoginSession playerSession = new BukkitLoginSession(username, registered, profile);
+- plugin.putSession(source.getAddress(), playerSession);
+- }
+-
+- @Override
+- public void startCrackedSession(ProtocolLoginSource source, StoredProfile profile, String username) {
+- BukkitLoginSession loginSession = new BukkitLoginSession(username, profile);
+- plugin.putSession(source.getAddress(), loginSession);
+- }
+-}
+diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/task/FloodgateAuthTask.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/task/FloodgateAuthTask.java
+deleted file mode 100644
+index 2df2305..0000000
+--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/task/FloodgateAuthTask.java
++++ /dev/null
+@@ -1,72 +0,0 @@
+-/*
+- * SPDX-License-Identifier: MIT
+- *
+- * The MIT License (MIT)
+- *
+- * Copyright (c) 2015-2021
+- *
+- * Permission is hereby granted, free of charge, to any person obtaining a copy
+- * of this software and associated documentation files (the "Software"), to deal
+- * in the Software without restriction, including without limitation the rights
+- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+- * copies of the Software, and to permit persons to whom the Software is
+- * furnished to do so, subject to the following conditions:
+- *
+- * The above copyright notice and this permission notice shall be included in all
+- * copies or substantial portions of the Software.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- */
+-package com.github.games647.fastlogin.bukkit.task;
+-
+-import java.net.InetSocketAddress;
+-import java.util.UUID;
+-
+-import org.bukkit.Bukkit;
+-import org.bukkit.command.CommandSender;
+-import org.bukkit.entity.Player;
+-import org.geysermc.floodgate.api.player.FloodgatePlayer;
+-
+-import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
+-import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
+-import com.github.games647.fastlogin.core.shared.FastLoginCore;
+-import com.github.games647.fastlogin.core.shared.FloodgateManagement;
+-
+-public class FloodgateAuthTask extends FloodgateManagement {
+-
+- public FloodgateAuthTask(FastLoginCore core, Player player, FloodgatePlayer floodgatePlayer) {
+- super(core, player, floodgatePlayer);
+- }
+-
+- @Override
+- protected void startLogin() {
+- BukkitLoginSession session = new BukkitLoginSession(player.getName(), isRegistered, profile);
+-
+- // enable auto login based on the value of 'autoLoginFloodgate' in config.yml
+- session.setVerified(autoLoginFloodgate.equals("true")
+- || (autoLoginFloodgate.equals("linked") && isLinked));
+-
+- // run login task
+- Runnable forceLoginTask = new ForceLoginTask(core.getPlugin().getCore(), player, session);
+- Bukkit.getScheduler().runTaskAsynchronously(core.getPlugin(), forceLoginTask);
+- }
+-
+- protected String getName(Player player) {
+- return player.getName();
+- }
+-
+- protected UUID getUUID(Player player) {
+- return player.getUniqueId();
+- }
+-
+- protected InetSocketAddress getAddress(Player player) {
+- return player.getAddress();
+- }
+-
+-}
+diff --git a/bungee/target/LimeLoginBungee.jar b/bungee/target/LimeLoginBungee.jar
+new file mode 100644
+index 0000000000000000000000000000000000000000..d9f6c2eca1bdcbd050e28b7c5ded7a673bc0c375
+GIT binary patch
+literal 7653202
+zcmbrlV|1nM(k_|~I!-#aof+GPA-}%n@)?V+}bBy_G
+z-i2q5s_U++o+>#>5Kv?w2nYzEzN%LRp#SoL1Of$;7FOb?7MBsB{Tu@V0s)ef1c&(R
+z1n|F($^DPQ$bU}!FJWnZ8F3L|MI{<(kvr*$aVbe^nps#$YRajJ>3Rja-;CP__EZv6
+zBUF;q0ubQ)1u6-sfF5Gk){JlkBuNED$4tsfWNc`}ct!;jPo!~$JLHH5s(To>)(ixyahp36?q3#_r$ol{>Wl;p_%2X^F)jSN#5b|F^UK|LsXZ|NLrT
+zV@3P#9`L`*K>tg|#LUsuN&jz&{`KGdW$s_1CVEyz4lGQpe@h4M|DeNI&%x2s#>C9}
+zZ)qd>KWfu=vNka?`ddml{!^tQe|(nu%V&Xq7@;w+)N^o{)Nu1een9!^GK_~z59H&c
+z0qY|n2nG;niMPc4fV31a%>N;0TgSPwQPW;OF$Ij!SouJu#zk4Fp$Sl4HCNVH`B9pr
+zA*t!H_2jknq*uB6l%BeAZp|`E>dj;IwVau{^}hMm`Q&wU)%>r|V_;i)8TH{#Vu`i3E};;BSqq`-1ytV0|&aKC1$GN3a|rMoJN&PNG@
+zcp0L67!VvF(ANO-Kzou1KLScoCY1k;SxRjmk!UIf7lNU>hOEd;Le0busoBatAg~h<
+zY_@`Ow4yhdf2ThMr^55&k(oqP1Y||uAk5lyhvk3;r~z^V(qc%rlo(T*YlJEbkM`oY
+z&HOa?*RE0geQl?MZRmQ=2wkyne?ZA_wW|TYFcH0q>VN08UDnnKSY>a38RNu<`>KiZLEkseYnvjGb+rV#DYg
+zvUDE|r*YV*FgS|amP#S5L`#cjsfFX5JGk+l0KXSPyH!Z=bEJ5N{~iY&+8wA}DhQHp
+z_Af3f-Qn4fZ>YKl&-f-JzpsmG)^QAv(zg{IlfgEH%@`oXR#uRJIBGx-oOOICayh`U
+zm@#a%dNYWX5R2TIgcnib)x(Q|nwV@3VAOct{Un1K3qclI2BIk0a8mpfd`B7j>geAh
+z0}cX4D}0KxjqaL8aJ3g+Md+kgxlj$jRG|1&5Ehf+$t-Cyq+GNNM5#})$$JfR6+rYB
+z*bFp*JziFC?a+WEb6}k-hDE@!Q^-Nh^}C_V>Xv+^2^|;n1L^3?j%&s0E56I$mQ)3xOq!v5OMal*k?12vHEF-T&^H7W
+z%+!c+&XR1e2}48}_v;aQR#>Dxc8x{hw4}*p0Xz{O>mZp1$>?Sf#eOs;9nED$(2?|x
+z{g4uA##!nSG{sC0q*8C)uB-8PMnrMRXh~yxIY0Kzj%U|w&opZl7dMQ^nRpqmw8$7*
+zj_F(`%U~BHzkV*ycSq=J1#=onSfOYUC8`tM@gwpr7on#e4Q=H7q0+Igo(Qk)bS$Pa
+z%OrHM44)|%SMxLer*X8g9_>h;LENgN
+zi67$d<6-OmaYnZV;Amva>o6=@j$x#Nu&m&D#s
+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
+z>g0PmFk~8n@Y|Sp&0OPQh6A=7OcS2fAHy
+zj7b|0ctWK+K0*anP_=54imhvFA5%jecyF}iLyZnFPk>66Kf8^I+S(vVLQRy%1V^%G
+z7bqK93OueLX&$e_P^FmCsCE?S3&E&Cg~Y>u>6rv=Mj9z6LYXn=v#+c!dwf%ZV<+gh
+zffFR3A}JkIiXojGAl{i6VExd86pkfDxH!}S0uFbMgzR#oGl$8#1UST8K8-komV`ZW
+zx5F(e=bhN&A*!Xrq|bBr$1wih2{f++@lz}!;fb!wDuOft_qPa6GHfsUg#$f}{FHs^
+z_Of90k}bO=_*1Q5n+fXi%SbTbCR0Gmw|p7?p%)9OvbP1-xj`0?zk{hlYu(1Q5mswA
+zJ}2|ww0_*)qC#MYQ<=2AThJRgSh%rN8q$u->RJoQddsa!GruQNpBtR)%rR1ftu8ma
+z5uu5^Q3v->4cbdT%)5jyVcu
+zJRyXKtCXW~_!{}=%q4Vsx-yhpEnTsRK1WF{yn=7mkZi|&x`|qAeZFwNgE~^7VE&Gq
+zz{I2fg=~viCc?wE@D#QTma!1$ULIBRi9HOC(tGi9Dw^hv!(wOvj%H^5c*ET1G>t@g
+z@{J@d)D6H_$^9B?o}siN2Z3ZdpMhFQkk?W{8l`1mxPK0cd5W8Clb4R3N?V~lZR2I+758lZtYty;*%jzBgx3y$
+zX?-ao$?xTO(ko6{nQ_)%{47Oq$4(?sC~-j4c+NY&FDR)xH5r@IJ&@hG9Nlf$J}1Hw
+zVukrR=BH1pE*Hceu
+z!tbY3KbL69!@&C%)Fudy5r-y_bbuLQ5w1`k&!_>|kK`5#sWuKL2qG{UOl68;GF*}=
+zQjD1cyv#GGlV~Gc3^CT+X)vNt>xUx2eH0!HVt>dC7`@I?&E0ID*SXWzB6?g3QZu3G
+zCbh~(Y}KQ9J%$Y9SfW%8q)}!_O~J(Z(^LCNR0Tq!h1+}vKj&ITr5e-&h*h=qhKU#q
+z$N@idZwNz$m0*v|PZjt@R~*A*n%z0ynKGm=}Wzzeh#H9-U9wiuFt-(r3U0@u!Lo
+zgYz23s{8WR?8poCe0G%Sl+~EFKfx3>)E=ZcW^3SlNCK3|le=!dcxqbY1=<~JjQ_^n
+zBWu3#1DXOsq7DU`%#FW(6hQus1X=cJ)b3Pw51T!UrSUF9yO_iTeEs|;l?BGN0caw5kJ6A0pw}3G~l(g$H$~oMW
+zp2%@HI(pTE$q>YV1u>ID_Qa=qaHfXC{c6fEej~1&nSdFNEw44+8TusBaDocyl?BwW
+z@%@f9;67yoYs9Q1?RT-4GcABnQI
+zjVfVgUy38dYNYM3P<~D0l+8lOOvb+~hC|X%N1fWdgN10vv4;WzdfuLWkw%wy9$m}Ll4GC%FdS;=-lXJ_J+o%GY~{2R!Pe@-lvd&Js!v9?KQ+HGyxr33tG6#V
+zgRx3{ni!G-M`VJ=yo?(cTc3bEmDIA^6UUsxuAjDp%26m9H!vv1R?Ox!8-U^%h3+6D
+zUtxY`1QHCo^UOIL(G03_9~p7iB$pGP-|1yFtnD;0v#(_W+|XJtX>geL+pC~x{b;-y
+z`hcqyUo`L(mQk99G9g^KXX=Vw^s(s=xo#^Mq3bP_h#7x%>RKq2nlsn#BTLgFaD9|J
+z(ger*{d&X}oNJ1QGsg1~cjbB@(JDdLB`cJs)i0t5Ch#PPo9&4g{dt0++yn}fOTv#;`;DXXXLVoeeH50
+zFnEWG$%IgJND;5=HC6S(#wH3s{w?$WJ
+z-klS@@!ZQ(4a4GmjfImh{QPsJ!euSVgEYr^f{Nc|ONWR}ML#CoR%dQvhXU0xo~Z
+zFiqCSI1X>jUx$kvem1F9#q^f0b$naEO{i(!rf(&$hV!I(EJITkPIzvM>;t3UlQ>0;
+zDNUs^H6n;nqZ&EAIf6*1a|N|h`zQK*W_)@?WBbCd#7}cBinBW@TD*eLzP-Ao@ZMX4
+zqj#%11(Uk`sePKS)Qk;Pk9~3AIcaa{$Jz~J(OpkMOrH<~(Db0UFQKfPvH9DII|9=z
+z+^`a2MT_HDo($mu95LWWdxkaIX@D`UAFR_1r#*iA*V6V1hyY-tFi#TknYM!I2Ur
+zhBWQfv$Kw}`^*R2H--Z@b?=iwgj)cdV=M3Ig1sx_9u~9PpqXt(ahdY*w}swrq%oWQ
+zW*s+W9VDs>NRj-a1DivtQy0JGY}_2SSPsG1Z0k`OMXwA=Jar=AUm!XKX1|tocaP
+zpOMw+=dnu*scO}t{wtMd5^jo4LpE+k(U|CDkFyA+UFMDR&a~|0hfT?x=#gyb_9m!&f{T5sL3MWFM4#}3lndY>?5CY)O-mYVs)
+z$!rcf@|_q^B1vF-L2a_U*rwBau)S)pU50iH<``D54E>Kg=0;8)9*0~%arRiO%Zp`N
+zI;4%`P`Z=$V266ZSRn{+=@Es=gGRD}cyNZ^cG%*Ugim>?m%EAV5zY5uh8xN-U$%6_Vft^7QbL@h2HfT~2*o?t6$7oNgKkY-
+zia0Nv56of~3d5cO2t@E`6ee-9^mgi@L?e@anqAvtz*S}Y)%fC{EV!3$TFk%bXz`Jc
+z0OZea7vCw}Vs#mbdw;L|bP24!l;F18gCf0j0Ml-3dR22LhYtjjCQDdga8
+z)Pp=-4Bv)%Eo&6AYk9}?5eajyx7Tt8l0EL!B0pO3>#2vT#C1bY8&|lMuBGiFQV0H2
+za+BcFVxkHBX%oMe@e!^gz2l;37>}67$?S~QEIHNbYVbnSp?>cSb;UmI8rv7lc`Xk0
+z^L)rh73I9=%dz5>w@XQ5J+^O&qVc{zVc(^b7Ijh`e>20z>(q+>s66gnpWV;TddL(U
+zJJ@R0_*qPuO0dBco8-;|b`GrvQwvju=+{z>c)vF+t!ay5zsfcc2vhYPbLS0^PEb;i
+zOL=fhdI;7%4C^7vEf`p~&=k$v&Y$gQF5CR;fx&ioSv?=FaBJ6?xIOKzYFe&BQG?E@
+z{y24r(GrZ#5}dJZK@c6ZAZM+<+=RmOpJ%qayO
+zkFZsNDUfaHqGBAUofu+swj-~u2-kSi^xBu&SjZ$LBa&tT)2PX3#RUz8ZOkbh6a^=i
+zKSLsq&y~G52qx`Y$o6z{Ro9udwhwGHaCPUIx$(QriUFZrwe&ZYYslS^Pje$st>sG*}Of4R3~3UWSxU+T@z5A?Ql)KeL-BsbWJ%ta(s`_;n#aC98l!Ef
+z2k+2TA|Sb#(L^}3-9A}s!`C=G%rq%`DuH~dw65?rPpi5l+oZ0T);W$b{whwhE#5_?
+zn!wg8Qbd|&(QsZBy>Rq_B~7`4u1ECur-ADYBw)Gtet25VhL;TYXU?~uc?dp67oS**
+zyH{$#K0CmkgJN%ONDJ(iHa13yV`K+HD^!{xly=7hR`Khk&1)!^60L$=qU#+kLYE2c
+zA=Oa|uU8udEx)ub<+bW8GS>l5g%)2!j_nBeEo+!{zOi^Mwj!diad=Mno&K`zt1*Nm
+zDIrh@5iwj+s4gPVh{wom_|anqO+7|YJ?eyRhGY~OaK}ItC{~RbO`2IHv`NLz;|?as
+zR@9hDacEeS=mg#5)ncR7vTH%|55iR&x9ve;`fmB2(H)igeTuTmn-m_%Po+O>V=vTJ
+zjJ~E~xXt=ug*U%N7-=NfKbWY-lX_%`r3`ukKcdlSlmbCxP!-n)YED#@hGMJ4nnDiE
+zCXc6p72kS)|9BL7L?+vlTD5Gfe5G2m5VZ&OOg@Db%zf9{BpPOLJ@9(@rMkz4;Z5$d
+zy@rH=;*${VdeBGpvTTj4eOm}y5w0ypK;!`QVMdo(DfDUCoUrQikLj71a5E|qBp@KN
+zKYhRdxhW|Ax7&7dmQH`BJ*15s9P~_#{@=~JN;NlKY-NnE&PmdE%O+{8)j8@0KCH1r
+ztuU+H6JPPwRld0IaZOA+Y3DL5f+i+OsVfONeqqhKf#jvTp}V0VD>`5^mpbh`qd@oyFO~G0PsmLgT0ZqK
+zYpg5F5!MX-URR^ETL`ifH`j;5H)1Ags8kEHu8LVH%+HoXO6}UH&BKYw|L4*u*}Rn
+zh|g&_0GPX~GF@DOI^>S6^dNMs>A2|98fh6hb8E2C156^X(WAd)DDH=!8s-o%RRteV
+zF;oU`{X~nAMQsASV})c^@j{DpElVCgVU0Hr6a||!pSXDyGFc6=1}91oor=CPMDZSs
+zZ%#lZwh3egQlr0eH1pb2ui9r^50MiL&2Ch
+z&DalmRFAA!Znc~RoWPu6{$7VQ#Rlb64s)?RZKk5RF-t+r^O;n}!RxnN>WqPdWKZPp
+zJ&DQ86T&rp_aYd+r^@kqmI=?6JukqCZSzHGc9V1s0ce6=dX@t9TpL^ze|mZ-mL$;@
+zPHN!H?b1#m4}l7cEL^Ji`z>V`9B&Z$J#)ZO34NNgq@&Hy0XS_|yO+8RvTaUeS!A?Z
+zBy#*#9!!k6E5MNvIRb}6)W&k_3)GB@Nk17HX!-^fB)}~OsVuqExT!2;lJRQRlvNYk
+zem^z`%|=QVBuEbXjyqxIoxi6oF;C{S0O
+zAmfQ-SId1dS#yf#TCcUqEFo?LaS%SV`SFS4?+R)V8i-M`{0JvxXdA?!-*aQpw@0Z;
+zIw_**L-aieO2ZT@VV;IsPIE|w2^4hZK!GkW@hQJI1l9;qXHhG}r>Jq4Ah^6{(q&fx
+zUudydsbJ;Mla#iE;PSLbo|HR-Ca1?SxDwMy-^%qlnCNI!lwDKmKc3Z&q+tUh3b2SN
+zqXcP}3eDU(x)5G`R}Y*1>NO#=(n+J2cIt`YD7Ld=E(ZC&*~TuK39OovVeGyJyp|Vu
+zIih`TgvK0YVyTHrpLE~QtBXH66_H+B$k5M*F7SP+wzjDFH=A!!D~cwmwPy!7IFimG
+z_^YP6+jr_UaC45>dEjxNCT8Z?>aVb+bjvChwB)9#7;}rz&>+fGvu8=$c&W`~sEiZH
+z+KPhQSfa!{s5TS}96M%r1w}x<>!Hq{j4<2*6qK{Z&JTj`Vo^U7PBzGC>D$
+zwQ=Np)nrM~U4`Few4)Bc54Cj?*oPBUT++&3G;e)lx7kj-(;lpAeg&2drL`?ZK(ZgJ
+zLmc^>2AB;(i!B_HLON@Q)0&3Fbb);mWeatHJXPYX%+pmvB{IOP!E~T-!=`_&Fk+1z
+zkHOTF@7?Y&vu-eIR~wtov3PiF*{*VV1I8E~vX{&51c;!=
+zh9w9$0JZ2@GOSi&ir7P}XulC(LAol)|9eepqCAurHi|m>8P3TTrnKhHHD9S!-$K@=?zL9%6KQ{bjZE&Z2vl=NygR
+z-NtiC_XCkHweW+IsuSEZb@`G6gZSObJCZM!@!9x%^4V7-+S9`ed`5QAHM;kZqeP@2
+zY62#sJ5=NBdpiTXtt36_gwi58W5N^~;kQ{)lwBQ858JL|%Tywcz!D5}3OIw$Gu^xQ
+z&51SB^&+?S6fkD`S)Fj3%KME1;CRNgtMiqgY>F)@nm$864He#%x7S2j_A^Je;;qz=i
+zXSzm1D(`!>2FaOa?Dx*iIITcOFi)21Js~n!qk($DJBuqza$l?_uqd~Bkx$18zB9F}
+zq8hwJ^8%_cJ(M+*yB*S@-L;s#f8}Ps;pp8sKO{7%x;R=lq!b;v@4=Zw8O4KL+oc*n
+zH8c8Oun0O~M>-Pt;IE&k*N1>4owYQjJ#H1iP3@B77|tc+2H+TdL%pR|rT(Hm^rC(2
+zl62FFRKy?9_{2QC0_vVF$Lg(Xicn}(|o;K90|^1KgID?r3C2Xdp~5YbW;{xN^4
+z-lVhIY%_~TEBa_YP2s#3I>hD|w#jy2i!bi7%$dzV_zz^K0xF^f2V!G}9M5|YdGcHD
+z+-HsM3if4Jhhw{lOT7Nv!#Xkb0;X^mp|Ltw
+zmwLkP%Vjm1?n~@JD}=&NbRPWe8?B^v{P1X{EflUWkGhs8@Ab^VVv$-B0bM-&n$}6S
+z3|2yvIcS&N3NC(e0^pOPoTDNLziHh@KTVX52T*HyI*H^^Ct2OXqeg%oCGQjc>LX*@
+zTMh7sTIBdiBcLX>SksPqR@ILF`*Ay4XUw*w;vTfw4;TDUB6LC;a5ipCS5S&~L{e|q
+za2#stv2E9^E?m92>H*s01tgdkHcYN1Ps9*+PsW)$Q82cnkRVtz9$rOMrB3fuJ2be;xgIUNEsX((H!H~{%yjUpQ4Gc8$G{i#U+?Ozr&Y4?|IDAmWBt3boclj5%l|ob{f_}`#Xlvv
+znT_>7-=ilgUCGYNA#=kIsTk|A#gyj!0=D*-=l6yH0VNG-$*~I<@H%S}rJ$fT<3!B=
+z6!o4F63q+s`Q?*v)71ow1@a)db+N&Il;yE?;r;pg2-3rJ3*%sPCO7No(ygJu^bo^Y
+zKkqP>b=neCcv7TLmWFvWmgcfAT-Jjl+B^Y)-haNZUuWbnxT0#MBY)aj2@@Kgh6H|E
+zJBD8#G`TRg=I1^EfTwo|0NRug@#9zj-&Jx=Hqx(39z}!LFMaw$enozV0
+zHmLNgS*G8vb$nJhX5FOPb?q!%(
+zF+b=Ge5Q1RP!xE85%g(zX}+BS#KWU$WHTd)hzi>5%IqRyP50B5FN_&gF#d{f*9bay`Yh_v(Khs1Wly_(M<=&cF-OGcJFhc7~3w0?MA
+zL$n|`$2Z!r+;Al!q4Kj_l7ZPsm9kBLEdD^FX^PhP@#^1Oj83aGE0Jf}*$=cNpD
+zZK0aJNdmA=|*lQPdhcDxazy^`
+zzW=)%1N^5sX5?&S?fAEbVPyWE>VGEj|JtPBcXG7(M@9?(W%!@@oT;d7gUFA}4FV0J
+zEi7NF!K?AR%`!3`{hbBf$}*Cm2r@`WXQEC@Z?aDEF~55ZT$-4a=NaT(eu%SP(&7ig
+zTMeVjW#>@_=hM{Z^UDS2ukWWY)s{X3;4(}R9-g|9LayC6zpga(_FqAU_d1ucAbJOV
+zuL(Z|aGc4P<9d(m_5pi^5vV=ri`)n|@?RgF6f>Bdp65exl#^o&=QN8AAAHxgreJy5
+zP+!Un!!@mZ_G`D6J8de{C}7Cw=Fm2_NB&N_^vD7TK~Y!qT$a>7OY+RfM#zL1;NHE4
+zQD9t>3Cu(r9-k0ldc&O+T8|lPXaqk?_t@p*^$f9_i@s>{H}ys^AEKh>OA>N+Dxwfo
+z!bY|`;Bd$aoqYMjgJedoU-6*Ec}dLq%<%Ib9pR!QUvJ0=QXh-@O{s>NIHOR=)_E`?
+z9tz6$kjHL6v0&WE^S1iZW)m~#n?86bk~E{pHV5*vAU4NbM&!(1nhu;RdSZ`$tDC>s
+z>4xLX^?#o=zdx`8R#!5dKC!7BiJH%f9cwu1F{Lpv?G!I|*`J=%Vd>t@Xl3SK=-}=>
+zH33^zvW-;nU*rg*3pIpp9;wgju|-G*G7@JmqM}G4@PJKL#E@x^IGCU<@#Y|&29T)+
+zxW~mHGHCTKux~G@+Zxb3V=g?AwLIE=e>bIh=CCfUZ!p^dMQeA>yi+{?g?
+zDN2;Ll=Hf#?gZ$xQqJxXOm>aD7425cnv@^au8mQ=VxZ?d4SkHx;&Yj6R;olJaUpmT7I=?o%t&KXg3*$UG~ymGzC
+znc4Whv=@@5A=dpZHE>DmmYmbmA@X{5{v}U}!4dR`Kgr=(<2HGlqCftnN3HOjp`CFo>+}~aqH4dVL^#WTO3w~o(Cga
+zP9#sHc8u*zqicTB=co(HkMDn>Z1)PT`29B^prbzi;Q@vp7K|G#~?|Gn$>ukEyd
+zqU?Wz!aw0=W#(k1WMg7tY4l&v
+zK6!5vA8+EMk;jU?3)W>J@8DLhF2egZ{IzIkeR6nCK-220k+HLJ)=_G@_T^i2^%hV=
+zZQqQYQxA6{%skJN5dL2Ag^B0SfzWDhlv{61cLjSl^8SGCDY$f{^Avs7I9~~WoC~)u
+zPXmrIU6=9BiEO%+Nz>)!-5E-{50MbmZ5qN11Gq+A%eX%
+zE>UAo-jbckgo}C@Xy}JU$mnDFVpo8l3|u^VS1ZVCkSqKy5pGj-NC#ZIOvm+}{sR)f3lemJlv*+w3yJ4`<%;0D{N^(8Q;K{ZtLQCish9&wzl@4Bq4LED@
+z;x6{77b15*tLg=?*>vSB&Q@J}5GovIkYzUO
+zk>|ty9H=e8SzY6Z)M^#)-=ncw0_H}%Wv+L9&HO#FI*LZ|bC7C<({Z&hitxq!4Ej(5
+zK8kKjgSW4bOai4Qp_i)eX|yWOk2%jYM<(?ZJ?Kmgv~FaihKfM|EX-!xn5KU;U8D2?
+z;||X!cG__CA;K1h<{$v3+13Nfbw~C(pJE%B8mNXsHJ9dXfiS7w@`dcLK)ZzDAwT&O
+zXd3?(*SP-EK>M#HvyGFzfziKiSmiTCEM?@cjhG*5Nx>9_=9;CnZQ{QwnfT1UQ6o?x
+z;<6-2lvlE*OV-t_Oj@$w;0)7#GI}cyf44AsKaKE7*lTUq>nFm0KH!<+K6>J;=6-wP
+z^?8TH2MO03v!!$&y&rq<)7eFlPal&ynGGLV2x7;~N
+z+`StGd2(I&t%>;>R1;pLJr)$_0n@3>+N14BU>QxYf+{p3>a|xxx#B#P)^sw-$Td$R
+z<7J(-k180Pw62hwC(DogLD@F55ecy=mzyJ+MME#tS*LE$6949tnD6>MU=lh>t(kfr
+z6{VOQ-CCQeifyx?U@-tKr{a}d{v!1L%S!8_SF=ULk9&UEprztKqcZMEOW?M@(`{;f
+zz|Nnaq>ic?R!=>zWS3h@`I=_4SfS~mbAp@uOsOnN8VK5Ho)U^R3cfTAupdwEyi+uB
+zU*m^Bj8WALGKwg+Sc}ad#W;Y=tG20Sh;FSpC-;;UMjzo~fXuOit}qZ|vBgfE|M;=Y
+z0!8=?fi!ouh8(#Abt!*2uW@^Ff)3q5Du4}~GLQh8Vtfog|0;K#_TDAZ=m0WmKD}K<
+z1^TcsQmT@^t4Z4sW)PKYGwejkF26hEavQ5xr5&w>pBH@->gTp@5;ET`w?{H2zDrCz
+z85ehbi55;nLEn*20)jJIFD1E|d&uTWwk%9Fs`D9q$U1B1m~vJIu!7FL!HPXdcRpiA~uQ
+zqj(JwU7G3IC?Ufb(FhoZlrJZ0z7gVhO4vzD;?}&eD1DB|Elw6#Z;i#wab`1nb(oLx12OdXu_Vl=KpwN087xN|oqLo}4K-scH9x
+zV7ae3QW_>szjO-TC~RpuK}xSF2wuTgUkz9H(1^3Zn&_$Ox;g%QPv&=HAAxL7$*(A|
+zHt{aF^EnChv|UDc0+BPORvy6$mt4Ih&y=T5bf}a*AjXkh#asW;tFjZ>p>9P`h6+{J
+zo@)nm<>Ie8TXI5@2vdw~R)l*}0VzUkRvivQZ0N{Ry|kg|GhE1P+irgI;=3$z*w4P8u;a1@W8mCxOOVNj1C+8XAci_Qx2-(7Z;|0xEU
+z+Spk9Ek?ofw=^r-82;%5{NWL%Vt)+%3*S^U6|sfUxjVJKCmp2m!H8sR2X>AU`|{~R
+zLRrKd+ta6S9|(Jxq#2EzPb_K?CmfV3eLt(8E^Q%;)xBpd=3*xbhi;-9
+z*EyU9ad5xsC|%&duqCrg4Z!e|5!q7@gE=}SKqO~|J(qO=by`YZ)s7+GR&Z@Uw+5Ff
+znK>c`ToYvAE^*_`Oz1(n+&l69z{{uqf5>
+zBoiEtEtw6fpKk+Cb`&Du;ndcSng$@nsVKj(gFS&Rit{)yBH8=-Aeu?y^Lu0*SX
+zEBqDN4Gn1tZ{+*y6YsHej>9n8`s&ilsJGOq@MT(`on>9#~
+zq+CZ%Bh5M(Y)5Xe3u87?2Xg-WzV
+zwvyrXu{<^hQiXQ9uB4RqVGR|#gcsx&zlhW8A71wF0CBmpqdHZn{}iKBWPlWq2N4IKw0r6E!G6NbEl)V7HUr(R6t
+zJXSObuQD!jNUQ%HHoMRkjZwTUaY-iDTq9ddd$4A`R=l|ASY4?2&m^uscbRg)SBfe&
+zfyJZLrKR0g(w%EUP_)1V;m|oLD2)zg>~_h
+zTD;2V4`}c+X_au=+5~)sFa@a2glhg!P|bN$QVdv%0HfDNu?U_aSVTF7(K&a#?;)dg
+zlwRi{qiPdEQDMljIrMJyhfJb2qa8#pAq)OQ2b{`$Cjq-SqQ7ul#po<`LnYprf>NVU
+zWQ`qsaua-_9_H2D0uvSXT08=5QLyOyl+OLF1Fx~Ov%zO@;>C3(x!0}(-CaKZ(blBu
+z$BxkWgO6fR{|+Dj9*X_5Q2TEvmY^w%#E(4uB?ypgE>s$L)0X%6CbFL=2Z|sp6^2Mh
+z{Hot{Q4?Y5Vn>^YC*1vuw#yVbpLEECH=aIgMH{n6WDq=vvHs|N>Lr_T{)(5^2aGO)
+zJ;;K&xL5k5`n$3X3p9m;{F*Q;-#4>TixQ8Z^9-cZM$apTs~7ZXGyjgP>Dg?)BCI2Gs`1Q
+z-cq#d2jQGrrG1Z(W|BT}dQ@M@Sp#V%Cpmd=gto0U6EP!bNsRvwYwrLg*|v58mTlX%
+zZQHhOblKHq+qUhhuIf^kZQHh|?z=DMpLr8=<9{&|k(m*BBF;XUd!MsEt#2)fLgisT
+z6HK}fV_#TK+_(4%0#M$cY&ZrIua&dL7+0+;cl60%AdIJ0GhOe1KcI_HC)y8K8QsT0z31kw<8~-?BM!(h5
+z`o42j?gtj8mi=r^Ajk_q`>wbP>Mw(@{@CMB|D0Br#Sl!b#(h8sl9^aKogvy)+z2Cw
+zIGW%^LmWaP-%pBHo%=-8&*KS=R0<
+zmP2s0VsA!KVrC>PLfWB-U^FbFR77NB{2=d58DJX^u?BMc{e}B?#wamfVpIwk0KgUe
+zpPpL9|H}9H`>7SScQX0w$^A}XS{fU=*gO4w_fOw)7Jt`_I
+z0h2C*MIl9j>Qs&qqG5!>zB+Pw-w2U!*o`k2A3uIO*grMV2K~21ef%4aT79n}`meJKoV)kmGNd$;>`k=H_wTQ_v|1JjKvT?>hs<*hGOZRg`|8E0a%L^V-!5tl
+z0>1LNC=ziFTP
+zxYo})d6j~4+fJU!vPVK&KOz%5w?V&;b5Dvh;Iu|hO3Ncxcw(~9}>Y!G<0?nb)M;*-X`za
+z$a^nuAWy6FY$eQO^uD-Q!`ir~*Nex4%i|Ke(K{DfjWjUL_r@@MIBG6A$mT76S%aG_$lmK~7T?X<+yI)?fX7`WP#
+zE;e{p#lbX04DkTdHro8wvCy)H_nu3Tq^bDfj`{=w0*Uj71+_yDWHh%|!}>XD2JUjK
+z05^D69gu}~@8Fe}xTNwO`HdL--lc54C5s$(;k>JjJD`mjQFmJLGt)(#4xbcyOAuKFd{$qji~7tVSCvrlF=
+z>XYh=ce8#5huIXEIi_6FCH9pbUCX!|K~D44>h%b_!5KklX}Eun&Etvq65sN5A6{
+zu9xjx(l5{TAWotC{>;Ix-tjdm^a(OodZ*(USj*{k&N&q!aux4ihzT2WoD_`0D=1=+
+z9phZp>o+v>ipxIds1ff1^LS<0o7xc^a473@fPk+@VSERRH3~5tcMxE#*x~-XC22=&
+zEIl4r
+z_5RXmf1P-|8I`*c@oQj1eE&J^?f}9s_>7maC!+dSz!pAro|v`CY)S?pGPxO(oV96f
+zY?cRTs>~>MwA68!T(szC;*3VES8*sMPc*MiQFBBa^{s+%U3O4Sni_V+408bbjNj4M
+zUtuKSBj(EOx0`eT^G_S@|2m9xF?9a#!brjY?N~z#$hz{a
+z(4g2+m=M9{yhX}-k?Wa+#}8M97M{@GVO^6rmRpV4I8P55<{)N}+bF+2=3iC0U
+z76p?HCaZnWFdCxUR1}fh+X~Gz$rNxjQYNFCNxP{$o4JMF=3(gx+sbSX(U;v=
+z6xD&i%jz8C$c5LB<`K1fA#$=YSARByR|BXYV)Bh6n(xUz${nll+Vm7sU?lwlLoPUvVM(73E
+zDE#9J8i?C?A~SAPPJ0vQttFt7kqmjSs25fm!J31#PViR!2fSAe`Sh=_EPD^if|6b@
+zN3CIwSs=G&lWm2a>G6q$MTgwp!Q{woHk`6qE2Uu&Um67K1uU!*(8WJ(QNOQ`Rrh$M
+zc8Vooc>KX#*JDHfIGGAb_seS_jg1Q6Os!79E@mlNFmsO3tWC<;PjTUEnDSd8D86`h
+z4c42HCNwjSmzZj=8kBS1B`Me8vc*)H62t;(TG+~kT9K8*I(nf=rdOhQ05?)dgbb33
+zCylPG*oLiKgzg5^hV`;=09kfA$$2E{{Oo{tjhr(em2I7`#65nMxw
+zWXGEAO>~zUMt)B2_0*&h=BFaZc#g&qZrN!CTGI8nbud70XdvSuo*4bp9&DcOWL7Q$
+z2LvpewMfBdB!u#-|B5t{zmD|TuFY~=9%+^IJ$=Ws7@Xx@b@)!H=u(rj^IY4d+27#j
+zX`Qr8SA)H$?R34*>92uQXTaMyfW$&=>M((|{8iXZQhY
+z0DaHgk2a;dsDM2VLRQbjTqH^~)x&v=vol^n$D!NFKY`T0(sf&=A?F$oobMaRFPN1$
+z$Hb?sXMapGehB!YpXM8hL!z?BzfjfD=0h+2nZojS^PMl_<~Nzo&SmSWCEF0=yJ60d
+zPn{k~?5z&(fvQRU1@&WmuS8_a^jzj%|8S_+^jyy7q9f`#l;pgZyUR|v^%Z{F^L%fa
+zHLQ9$7Pm^jb(>&Ql{5UNq&?_8?WWi#We_68+
+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
+zyxBvaRV}Wdxer7PZXVzZl2s>Xo7x-D
+zl=yVpenM@k3auSeLSRg+uI&EhTY32m?&Z|XT!{i
+z!y)L)AsL@cL~mkY2iIAi&LI<^8@5~~&T+c>Csyzs39P&kGy56UR~Dj^Qqebv{TO@i
+zU|6*@bW_K&T)B>>ZJ>UPSoB9c55`F2n05|u1Zek!gKv7?Ff~NMSS$50-wpP%6q*&U
+zIH>7NnBRW-1D>#?UkmNSQKD#i{X&5Dmb?vo2SMk$gC&e|UDo8z)YuD^C=eDep!szw
+z6VRrZ~u2xIHCTcj=hBXnS+2wJhTi*-;8}V09gNrP%mSf6iir%
+z2C#*}P6Ed~E@xnQHj0V4Ag)DjmTcpRw0fh&Ywyx>oq+s;lb83S{!8X7Agg676EoZ?
+z4!6&7>V*F8((9_n?N?_H_t*1M?ibWH#3m|7e0^ki*U3b(IkHC~#fGtX47pRt8R~hL
+zC8^n%n%-!zdD{|_`MM}Iv+2<@Smdg|lmwZq&2*}4}#F7LRbV%+rD{XBVd4_awQ13q7=JF)8C!`T8)Z&$!%u-}4
+zw2?iGw$zL#%g`m`a%fSaCoqc#crB5l{i7wt$*MH4gA%X}P<=Ap*DJR)TZJW(@@>Me#l?IdJ
+zF7nX%)!4mXvD{aYq|@^Yyw%3wKL!y7#a(TLw4sTXtBs-Y6z27CFOC)FeQ~wxWfj3)
+zZQ#p7({whoPN1@^WMVs$=tAVH_K9(i6o<4eMfX`aO-pXff-)wsb71;q#A|=!3gQP%
+zP;)Pe(5bIUfoO+<#?;O&V1b22DCR!egkpe#b#!2dXEK}G)A2BuHP+xq?BGS5hYaYq=B*CEtV*|AO-t3}_cwFl
+z31DW-8bYW9XzV!+YV13OSg5n9twpJ_A4t?uD5h}f>22}!WTYFuZgSe?eC;!RC|66h
+zSc+PeHPq4NC!8MNU<^EgxT5qjBXqpkUDo_cxogXNp5-}4YU-T{ne{84m={H7tgiYY
+znde43Qo4hw6%~Lo@Tev>LuKpA6M3Y?7&HcTdVqT6-dnH(S~H41Cf0{Lrai!B)8^KQ
+ztIHHA0|RD}EZdJ
+zM#tBtUhFf8@GlPxQ2DtrMx9}5Al+|P_)OY$L*B_(nV_e8k=}wm)-Jq$
+z^Bc|{_F(I&v4f09&_m5@i-n4Z-c{LAvJuG4MYci#rp{$@beSb*_T9>=3^BG&n%lF!
+zJC(|U(9<3`SE&j18`@;Lt;6^ZSDVReBxR>Q<3gndT7HopX#vh*Ix^GEKQtAx0f`U$
+zyxPC$71iPD^%iPKqONw{7`pb`_mSl=5^?I|I&N~n$ufR!}Nq1c3#D~_b7)pVB<
+z*zQvL@IqW%mM5K-vsh?3_2?$0%%whR%WJf=v)FKyC;A63sL|1-7oue?r~c?jV-`Eq
+z#NN0%g+Pa#Nj+NEH|hRha!OJR{qQy}G&s*spTN@=nEka!ZwZpgX-+KBq1znr`G;&8
+zzxBjaf+}?4$*HQl+4lnA7#!$Y?ExfUZ6er9+k}jXQr`iKDbdyjX`Lp*5
+z&*B}gQR|%q!50!i&
+zia%jd_)~ViykbL6iFbLh_IJ)wz6N}gSn^Y
+z)%F4upC9Gsr>LukY&M$+zd&io+{c74)vl(Bs{_oWCSJRwNs9P3M5!Um3#!pPF!md?}!qMjo
+z{kv*}V${o8z@GY5fKE&QOH<(c!sIQ=3Ws<>zG!gA@Q}1Vz()%ocQ|>a;yZUdG(G=e
+zG;7TlC)pRBviFxSrJN0$viD5i-!t=2)UMBRR0=XbH+wdp9PWI&F#Bk2eBk-Zx6$`}
+z`c|tUQsVEP&VbM73~X)$uWp@5#!N@D{vb}{^rekgSo8IAfbvCQ`2N&?QvkPGVe#K$
+z(9sM!-q}h}Qm}XCJ*;gO@-rg;+z)Md#Q!V0XH_fb!TYwxl}P_&jlZ#K07iey7J1m(
+zs47j^%`+hMyitm2!4bG75)sBZX-6Q0-V)pD8|=y?oUG!F{pg7BcQa2g(`I9z^8WnX
+z#T_7tHGy`~K=72j_J9JO$u62a-!|Nb;pGlw<_4#w%prB$k-`0gOd4i~#i7#Z=76^n
+zW57rw;G$`uWl&p%E*47;L?@7DP64FmJr?je2L_XkCr>VVKq)2(%HdCOtT_#GKi|vi
+z)scG86~zAQ$xq*VS7pH1FmiGtj)JS{v^aZ*n@^DekCP?Rfz<)Cv;`}P-tYao{FD*B
+zRYC2-s`RxYNYxnHkmZNj%-L1t+UXC!cgJVf_s6@wvO|jU0O$qSsN#Y3`G=Bxrw3Eb
+zU(<`izc~(9r6|I+S#xeDGR|pER6wbQOisqoBfg~%FsAL@R8yeryZ2o?w_3n;bzsq+
+znTqOE3Z=A5%*PeECYtq_a7{BgQdp03Q61V&T`nZHfIV_}x}yJB4QQncja<#cPQG%H
+z00iE5Yx~xw#tSpg`O=tG~;Y=s<{q4m$h2(oxyA1|y<7FV-?&>JF&6>9?MOnbkEyYix}bcHpL1P9Li5F74jcT>M(!|e*eJ8Q&CU_qB}KRrOZgg~n9r+42v#gI^4m{DA~5t=GzUcb_b&U6&Sy&h0gV;-O5
+zqabwzq0!W>`;MWvCcbYu2R)}q$D;{{$mXyCOJ0G6pU
+z_yJ7`^h2sem?^56N)axKvSAjeNdC8Piu-fe3QNNS>#C3&>3;YYec
+zQfkscXINRiwc-ts3bGHK*|t#i3wC%>K^ZZ0is`v%UvOtsxe&P>+fIP+qYMijGAwAK
+zK?|d(u2g&bg{O28$C!eI6?mYX1N&ysP%@^Fkb**1eu87Q8-9c8n&VZ0fhYUd?lavj
+z5X)U@Zg)Pnh`AiVStH!*?!;9oyfX++4|6(y!3nMtS?qD{rpdD45hG(MuG1{bD$u$CxJ0O8O--492V-7Y&fbkOkdjD+ugV^SKec{gykGt>$
+zANGg%AhQ_$Cop*8Vev+AKQ>q$24jc<^3DB8aM{b{>~Y#@7?yqC5KySg>=}vjx!Wvo
+zfn93t83Qh_`)>IsXBU24SY3k64ugDWZl`E201gb!&9o>*Q)T5i69+0aW6D>j
+zE2@Usv)(C#OIdQLSp%;0x4LrxBflQL&q3&QI45szNGJTX+m`z`g(ZO>(#Jq9lX5!{BY%g+BS&kY*HXZk7usd_S@c$
+zp6(<@J89hzqE^D$MHo{W2w7f;LaUm3)zXG<02<-zF9gN)>0WDevmjgcA_eg!e6vRO
+zf;3k>8T<&8fL22AFnk};>ZLb~HsCaZr1kvK-^>}hqe$yO5>OUn8c}Oq^mJZ5F%f>W
+zngDI8%bv#3xb4ezwF2wYKOzY>=}E>+GuLCfLOMp<7M|1HXb7+ZOVk+r%A%f549Z?k
+zQp5}zh$G@2oDcDno!N{e(fKz+WAqFXq(
+z8*Kf2aB_IP)?|PepUV~*2qE%tk+mFN&kera=V(V$4ZO~C24ciOAQ|eC{K2qKe?KJ3
+zAt9wCpssk+t)z}9Nlty&uikWk*z9c%8YSWIY^*@yVkg=4FzyB~4VAr6|3CdW8Id%u
+zH%P;pESYd-U^7^z)A0hPb03mm*G3Rp$Z}L&vSlzBv5FUKWF>ly0{m}0m%d$$^|%31
+zHSIrhHm;izQTm8wF{GJ{MC076Kwd+!A1Z(5v5q0e+U%Z{>8s9`IiEwe+BtRuRSqa2
+z=~-xe4ULiRs7d8Al%9HIR?h*+ERS1lf}+im#EXqyenKuaF}@r*mg5jK3_i5#4=O`@
+zFmtTofZHMEJe`mL0!kK~is0B_$faqPDA2x=#S6nRjP0F62I<^H0Hez5cS7D)y?zBJ
+z%KcHcKPdaq&U{nt+oXqv6=g|os-ZI*lpF#1ITC5dKML#7OrA63^KgDwR;l61wlNmh
+z9bx`a(x^z2V%SR2$S!pDCqRZ)9{dHK@IO8!d&pHbK;MFh)e7x8YFB(#H5$73!V37TlA*8ntn@WXIDYx7BN4(#KB|KX3p
+zLeiDER#DIe0|+AjG;Pfki_f%}wCsy-8D&dr^+rI4>gPf#XE=y^35&^C=at-rnoy5H67(c-Z3oIf9-K~t#9_zJT?IHAdXN3`=aZ8&FS
+z4gu12gae8b7CFd8n_xXCWo3iL1a#K^IVKoz7`jU;BO3X%Y=Jb!I1muF)y!!{jCawBfj$I
+z#-xRXz0FA=nY4VbcB$UOYGqDEyVn}qnQq7pQH<}GJ1$;l2YY*p{_kg~MMT)a%*~=r!{Q7ugY~#B
+zAn|V$O5DxjyjnYsn0Z7a+7jJovLc1c)-HpUgC-IRWq9jMJF$3bc00lgl$v#iLdf
+zVvfoSP8bKtvFu<6r=@9K^3u3B$(dOzKDtX+BY
+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
+z1o%o!Ix6Zg9|S!_h_>pG~G^
+zJ?;I{LwXETD}Rb5stAtqZATeJ1zG;G3tZ6OkP==k9wW>e`C~S6_D!9?Ik%oA_763h
+zBZ=t1kPU{#O!6_OyUGi|PWvPjGBf$!oV8h;N89#K)R=-I4SU>3ppUbw2(K
+z`YI32A&C+BYo}+Z=M|1WNIw?69?qayL_99&jxH2z>hOrosn071crsN{?-f8Hqo*0z
+z2IVc&FV`rt;$ZFz>&?f`|(OCxzIuw??{lQuXf@X4!<^boA<|
+z)dicgz3^()YKPd3xu9GxITRa(RI>K*acr)>Ga4n;OYeD3eLA5V7}epo*2oSnB>6
+z+g+&d>=`aOa?=8XP4z0LtbDp2g@HKMey3CB(hKQw1h=z!msRZ@@CAwebce-vAa6uF
+zsD}9%%ystpavO(3Y3hj586DwM|^$MWw-`{l<@
+zma&|z?4dU*ySXv$hPdk*vWzQp{QDsAQt<6F17WnHI-+rdOn
+z;^#}MbX9FP-cXZbm8Yx*$G{o}6H5cKV{pZUO&7z2q#f#{O~xL!!Av^Yn-c28%{9Us
+zQ=uvNlQW+IN&M+1Uf^)n^JzY@uX8LgwK{2Rt-id)RGq#!wm2<8HS9QbhIetpv#0wm
+z_2)I|Da6|jcy332uzLJ{cYwlsEu+WcVQ*Y}6qNUsqH;UVyldwe6sYp>}b!@Gxr
+z2R8SFl)lBl9CBg34^JjuB`@fg9~8$FrD*U_
+z7@?577?=x~Id|B30UivpM+U&NMk!e5m+l*
+zH3SG`OgQ9vqVVw@Z`7+XWyD3ZKE24A_yf=_~Y>A=N
+z=6Y6dQ3>NOfpe0l0gey-&VX+32om`2Aj3)G@D*2;n!?zi{MsE=j3sW*PHaiejR$(1
+zBt&S>b^L5R-c*ZaouLhPFyS^KKt5^lAEF@jYo$w2yExI^RPp!)&YDH6mzuAfD8Y9q
+zpi`Ea5?`>3Haglt-EgfenFgO{ZAuxatZgy1$!5wjJuKABXR};Ah;-xVt1*TJt}yh?
+z5ht)lLtaPxLt`$Q-pbm8m6h(!s9RS)cBuU0?`b4IIwM+{`5zAQRl5>jis{WY9fMK*
+zF6b3jH^<&n4p`q~^eQ!aG%?piuxgaNdW4c4nxj`={4;|2Ausm-j`hRdLkXb2D`mI{
+z|JRVW|3B(3l>a+(`xmW^^FJ0c{&Qf?|7PI7dL#appZFUGV;esu_gesA=$jRo93qfn
+z-4mJqo?u2KN)nhg1A$aQ_TDI^A!)GKdbK(pLw`I7ep?tb6e|Frbmgj*dCNER<@4no
+z$e&9E0%y&sfLkXzu;+3b@=pG=^fm5PN+PtggO;}>w#fU@l~|!L1|p8kAE7MAZF1H4
+zRmxRRSNzvSYOZxJ3KaO^Nu!&$N^=4hFDDAWFQKZ7QI6IdgYv_@eS)7+(p{Xygb1v^x9&P$UH5&B0Va
+zmSMYUErdZP{3M$5+;N#_Jg2%8d3*x6{T-qAS9DMZbwhvOD#jga9@gI_I^F+UiS9qM
+zBLe@;iYgd7JAYT+OvL}v8~%$X;NJ@?FDnhqh~Q)Cy0i#?U*LXAb~dOJAw(OP8bQ$J
+zGWcebQBvLsNuv2-kM|DvNx?`BHRwubznPiN&WxXHe+3}6Y>WY|?Ofd7K-pfP^%^-t
+zsvifRth(x8n7uD;oy$8l@}_=v*g7jA-q(Q=MVPt2_lDYyQ2U4CQ=z5^LVZa$-0-V5
+z#VBZ}ZqIA;kuj^vLk62TuqC8|8@Wh3E^g*pV1$8~x%HtIyx($B*QbRHwa>C}_ge8W
+z?MojMMGF%uIuWM-H=Ep_@){z}99FVpEk4WIF{w=qW8h}P4;^KV{_zcO$WY;A5I-xC@2J>CEBi74^^W~xO@%?w>_T>f8XyjtB-
+z`z*cy728<5P)#p@T0KV<+@kOQ`gbDv;F6*`3d4TB7Fcs3S-4UtC{&_#UR7{
+zr)$TX%(scqW}dCUlffu~FoQAPgn|o0nX-NaX{{3Nmw|)UOCR#oVqzPk@Woo76+M%iLKiP@QsP*>Gw
+zI23hIS;i#h{QXcwR@FkWGI@l;!f?K(p(02uoJ~D7&4U;*STalwULy`Z9I{6YL!%_S
+zQf|JirUexnOeVbZyloPdf2x%>FWX>hf~lnwao17-N}kPWR8}Lup!&um+|18#FbH>k
+zpNH0op@nNGO>$deg&xSriBOXf$cxuxl#0Gq*A1xZo{~Q_S%%jC=P*$%eBfaH=T|3X
+zLjxT(-5Jq(chX@B#bux@kJ=ry|pBvh88l;2n
+zgycDPGp_CRc6r{c{|9OB7$s@cWeI1cS!vt0ZQHi3NZXaRZQFKcrJY%6+jiyT`}TZ2
+z-TkfZnV$I(5i6b_5o_&r?!D)pv(Mg>th6O-fgC(Rjd)oj?MGY>4DRl9rKmz^^^*+8
+zU-(w`F3`#zyoQybbcybo$7Y5+>PdG6@bpcyWGUJV6PBrApP5SDLLptjaaD1?p}2n~
+z^18NsF#eR8#4umzRiaNjBvJ`V{1(PYSz-}dRJ?>^UgWw^G<>BN#MsbmJ%=VX_liNv%a!q)8kBGyje4OPFPNcLuP*sk?eACcd$k_miP}Y+%
+zTnn0LBMR3MHysbFTok4B&0pBM+)%NmWP@q=%cK|2ySH?trIVUeE8PYdC{7d+Iw<3r
+zd87V*^tUcw`?YGHKEMRVRF1~2&WR1R2s0_k@aLU~7+WD6?KoelQ4J#Iq%xoFV8~$I
+zX0P1#0}+hwh_wO>XEb`Sq^dk`3xK2gXv%VH+74+f`Ka3*gsrte6i*xmfLAkE7?_E&
+z3cPY>#6vpvQ@!F^+kG<#c#FV+b5N^Ctcr^RwM(`H;J8o%{kW&Qs=M9q1t6##64Do<
+z#;Z7fwIQNZI*sCDuQhccb{lNE_!!um8mLzAb2o6Xa3^uvH39%^y!Yl!XnZ}a-o_`F
+zYWB(HTywd6jxO3gy_=4H?vGUNAX`nf5F&=jB%&WsBDA4B?J;{_^_RW`8b(gWO}ThU
+zg-Qb(5=+(|l~qL6d%LQoIr3FPjdjNFtf8>0zUpRew7VvFS~}(vmXx^IEy()!W6x1?
+z8b&h_|00&3{GAEKSR}=%-)s0sMUCgU#TaHrS}lohY)cFDFK{qPn|gtZ3iddG(!9NF4!JI
+zB=uK-f>TN(mtvWOw`s%kycyzk`}oX67Gh%S7u3k=P57H5TycrOa%VIyb;No9)?cnK
+z6$iF?76fu}MV%#2+x4kYJQb2#gYUgbLQd5H4mBMES<)BTmp;jT=zdwz*~gc09>u%lm0)B3Zl`}x|Z)jrl$W=QsRHFj{46M%)caX|2mBNzvOzd)!&_w
+zzbVHxG+w5X!3NmCbhHJ<{qk%G>jvpk=`{NJWt
+z1HS=IWUN_ICFsqS8CF(mg4r4Ri;Y_jWa%>3eGQ#?oSt&B6UkA!t_^QDr+5Q!0QW<&|D^F%+(%b5UM<3J8{>kk9kRTY0_`H*11-*(5l>x
+zFrKdE9bA%!Nw$Zw#OF{vE6w5Pm@|x30}es3((7`9v?miaS165EzMnj*)RCwVxL@fb3B+?ag?
+zBt>t~FihAfmP>1wAjJMr(3p#%g232B_h2Fizw8$md-+F>m;&mE_c>aG+Y14OyuwPa
+zPEVZflSG@VT1tfe8emm|qgBiIjH@CR_1OKkBwrwM&=@}ha0(2BKU0}SaMqGDV3EK+
+zLoVprrZWsnQ}aXI!HJBpdr1P$dd#}Kfg~^?e*x+Ez+Rm#?}hJDIK=K6duEiDj6Pn7
+zS%$awrk~0s-t!hEfr?tok)-yT2HPDIRw9slIMd?s0~niw?>ZH;i7X`p(`h`0^hkRh
+zWU_jFZADX}0Rdt(6cWfXTXjwgG1=@gx=v3ufK|_2Nf}Yb0Ly^>(6fL*X~70Jhsn12rz=E4mOvay1m5ego;2RT4k)TN{gZGhYM6J^GiL-avBW
+zwkUaM9l2Fg=F~bH`d#$-A=XXp*=&*Iv2g#eaPu7AGcuYzNfTU@26
+zome*OdaKnc-Igwwx;aeOM$oTR-IC$x24nF{YK@r%?D5^hxIH+Dr}7+6{KumLhFH
+z#G$ZgU{Cf0NmST&QGF!Nux=S$%d|7s^^@u_Ei!cpeZz{p$A2IntjV?Y_;d*=tDK|NHl&e_TEJO}mB_2$}jnG=O#vp~FEK<_fIj<)1HSZosg`F&cg+78)6TNjq~2s71o=m|=u
+zxHtvU@Y?Avh?aKE*tvata29Va9U6EI(LLO1C;9cf)h%zgWG3qc#UHf`@e(hvNI!9h
+zbP@Y*&80O?c4c$8d563ahs8dYYehNOLZN4l={5s9_E87G%C}fgWKXQAs|+cJByc6ftUx0I`T|l^d3-=ht)6tQbd$$d
+zD#xXG4^cPN8$VVBu3g^jP?Xz(Ka=Ydc}qdjA#S1dic{g0_Us=9_kV4T7=poPA-2v@
+zUd?t#1R|iLn4rKq5uvc*{N;3qfD$>gahllngZH}cN3ePZ@d&YlkefF{5`S6b2?%?=
+zh9#6#Kn_mci#)=~*Cl9U+0_-njNQfF@IhP%&LI55xt3v=XO5XpeuKXp`L!pRi{cU5
+zA#*;n<4iIL3-v`~4sFU!)u`x=nLB!K5l>i~aE#XDPoIF`^h7EZ{IRNjqnc0%a=mB0
+z0f&6c{lZnxqArQ1;Z$*pG=>lMH>6)u=~^{~Dc5-Fv$lGpowNudh+udQfE|X?<^95&L$Jc_1M6`i
+z7@()yN6g@WCjC%+=tb6_nbmhSp8c!L^SOR}bNl8pVqC8?mr8JeWmneE=JlT}*(l%<
+z#-Q(N&BTA%Z(;dAyB8{b%T0W?xXJvY`_?%T=1
+z3Df{95je5AukqZjX|ra{Wi+um{Z#Wkc_9KzaP#p}3qi_jDcofEaYG`MELh+<=6<9e
+zJ4U}%y@I;|E&W&HoBDdu8G=NJQ!A~uqBKE^CYr>=X9@PW%Ss|}V2BE{MSDE6aM%ECd5>&hN`Z!U#|eSzeA!d72&h}
+zl$D(EAe3%$E?Va@QR&lL_yW(=g0&!b)!3+=u+c9D*ntS*(kA01*>u6sb$F$IF6j
+zgO)M5rEOy$p;p$L=6eKA>l=hu_>QG{7?nYaOAPd=!ptCc4a@@y2uD00t#CY@9k+a9
+z7bV<|Uw;#YX|SDdIoPai*F{Crrpb-
+z#ixWrKg02__s1uTE#8&4e-X!uQ#ijPr8LtUi@tN%&BqY9PRc_eGY&Es#?3J9VwiIV
+zho5IuipKk|5BWi8PC8ucqBz7}95aM?pw#z?!nbvnvDR_u7_dm$Ne*ABM5AzzXzcS3
+z6S1BXAO&b^EezTJBU^3z`*ThIyM7e&tvdO?3LF2iDoFKz7QoIHhTq-2|5m;6e?QRw
+z&ph~l{<4CNA>f-6Zu@VGj>W3$P77)%x}$D5VW7&H0-jK$KSuk1Niz%uD?qjty98>R
+zGbz6TXmWo`nT`>UrH^^_7Sa2hH_?Cl)V}!tmGH}#pC#pFbJ=snID^P8ba~SAx}1pr
+za{qj%2C94!+o`z%unaz|cbAy`j=3AJbZg>0eN8b=YboKbneS==s7hCA&u=?#$Zek8
+zQa}+ZXlz$4J{<-u(pX}zH6HcMe|lk)69#+>ry?;1H0~Fz022ok<$u^lAim_)eZV(_
+zUT3rjHeh1G@>IkuDb)!0T3BSpw3us2RZ92DE`Z8f#}GOMpxGneS9LG>L_>r+S+X8d
+zb~YFD$YVu$7CSHnB{HSBfgM3}XMQ;)8SaE`sa5BoLUv8vTq~T1ZRJP*xC
+zKXxRH=A3K{K%P!~p$M|f$`Jz1W#|%R1YVVlj(W9SKz6^OD^BMKJ+Jx#52w1G5;#t(
+z1eoH1+D0VU>zrEzCT1H7ny;>9w^W)`Qn_q9!h_MlAJ-mdq7|-s&bTCBS{u8XP=;~g
+zj_&+&T6etoa`jkb4uX>3qcZo{Y?Ad0qJo*|#MB8&5rbL*o5rQT{C#eQ)#|_-M4}|f
+zZI>wG+KGc4Fkj@F>mQT$=YhKoJFdE(2gYTz9u1reosM=>!=@Nvan21~4s%1CilJoL
+z(%vDxva0PMX^AY<130n(?7X#)f*q*E>$ntc+QCjeP-BqNQV-=S5p#2eVSa)fG`4oZ?BZy@2}K7
+zM$1c<*a52?`E5OdpCR6Qa03r8Ht$StqG*k1(ruJP{0onZ-cYFo=&b{kv>_gKTNE%W
+zSf^=@n8GpNjEg}tM?=RQ8~IhlkVx9#4`;}aNP5M$C-x2ZaBZD$MQa7Llfneu<4yA+cOQ(3vHhVZJ{6dtk;A
+z?&Skma-G$5t^Urrk_>ebMDwqiTI`CM3pH5Q9qmf%co!)Vs0u??BS``w2S;mRFK1(C
+z;fbHc^0y&L60@!O&S7V*SnF6=T4HjYqLWRhii5RmbeM8c40O(NfsqV+x+Pro;X6o4
+zP?1hMy$R;Fm>C`ktF#l(7kf|3VlBVippYrm3e=vhbgu~~v7x%{wyfSVUKFe;#v5gf
+zMA#;I$W0JFq&tN=@F1yD&LHa@4u;f9a!izDJ@8~%#pjG@3pAx6xvB4;Wc19c&Ioie
+z*=Gn*@18^A^6DBY27??iu16@6ya@8$S)du_K-i^**4u+$Uo|xcOa}Hos?Q)@bFh^i
+zdLW81h=)@!<_Vn%h4gt&0|XigEe4TPjkr2;J)VQG=vhLx5NPS}&^q)(T;L#@v8`Ic^Mjo6zk45zf}*K41&GVtOV5)&5?R+B=g
+z1_F6LN%AuoxXQHTETB@=5A)ouCF(l>#5m$15Y1)Ih2T9|6#`tSP&&d98YE~54C#lM
+zT&AHNXKs+r5UN4#Q=&dlM+SKLHqA&-!QT^+_7bP+a2_*TMl=L6lfG&LL_bAo=Zlfe
+z%Y5hJB%{iPx8&}ygV;bKS!vf|TafH-_ZMfD@3L-I2qUD~sgXJsg$PNnje
+zW;>e@VCtA6!HJP1<5Z9V8fB;&rz1{PM3du>O~I@eU~JM%kxgqc1Xbfy*><2lg3a41
+z(RJIYG*o;)fJcLRV1;P5Of3*!O>o6SdbJ;)N!+T;p)wyO)FtkKqEB0muk)&SaL3{YDE*ZGliG^iG4xo|$
+zfcmn8eUTDV7HRh0?R)a*nYJJ)tB_Htdd;F$6h^d+g|ZoD3&^K#Lm!v+fwFhb+dzSI
+zI67=#NlssHK}D+C^|S5hC2yamY2C*qb?0s)&hmcqLHZ~FH;I!XE$BcLK+oq{{|U7j
+z%t*6rwTXjN%_B&^bcuH%5Q~i^WFwNOOjg-dlFC4ceZ;{)JiDm@vqflWmN{PvenDoG
+z2>~usKd{TH#k{I)NQ?E9HXE*c@8BINedgRW!bejdq9NF$#6HJh>)Bv}p@PZO-<*EV)
+zFtF_f^_E=QQT3t%g*&eu0`!&y2K9I+7SxT@#s@P}JxX&^-0TWID{R2h(ZM-aacbc?
+z*#-@QD~zEMS)!>TEegWvS-0JVFlVYwacgQjf>k5g$3m7l+4X33;1I-%tMTb{0Yqzf
+z+g2Dz@Tombc`$bxzj)eKDfDGS()F$~o;Rdh%1#i+?;R%95?qT08rF@>8&k%g$kUiy
+ztuiaZ6$AMAlmzNJTyMNg)qLcz{aqs~9KfE&-XpvOCi{VS&=iP{`>fvjyNbYoz2oFy~t&*HJ?c2KsPGaly67V&Tf4L@LUL
+zxqk+TctS@vIl}E7YJUAvtH|7(_-Y@f8bQVZNG;B@4=Z~!_8f9JD1X!t5pjEcvpBRG
+z<+l5akjc~U-ENX37`90lkA(#X7HDKr(J-w-spWHhn3n$j@I4uMzAY4)VqPW0`w;o_
+zN#dKK>7+dS;#|Lr4tkAg`t$q;>w)ys=uDlTeCe?Be=6`Iuj=mg3}&&{ao)y9K5v~aBoO>%Y@#=Dm+y9&ztJ37@T=JLAv!k@V6
+zfe~os)Fb?$H*mu2JnpOQZGR&(vy-8Cmfl~P;rYRZt({S5R)q}&<|5@
+zBX*vtj-QzCjftULYoQdgo7OV!Kldg>s^ag3vr6k4USPR-&}pW@xc3^BJz9bXvZC^5
+z*h=5oSQG4dWhw+rp^=p)GdnbJ4$C6`2+(3*k=ljGU`K6uG_~G32hqC*zo8*_?40mhVaXo7
+z(!WYG3pxxXTa1ELl$xxIL@7OtuI@UOMYpOb;rJ&l`XSVNqo1G;Os_fuUFD>7U={kT
+zh(k{D1l}{ftrkOphT<)Da%H;h*dOaTqO&)PHf7ee#D8!`R=g
+zAtB4m;VDx6nmuDTrXT4%4opK*DZgEQq@F4QK`YYv`U5GV#zHe>jM^oUjN&DQZ~sWx
+zukXtAg3k&9zPp>Oc3^}vh;Rc!?phjU7}Iu!McqP9YiRZaQjQhmqxz%3`juih{G$|@nkYwp%wU?@H$Y1n1ZKcY>1A`Yx*JhLVz-KXtmtdb03U6L8$Llx{@RP!-6ugDsvW!DY9p0Z-H_4SISjsAikP9B@*oXQ
+zV0fEq3L|O15<#w*Fe45PY+!}-$19uUZGH(Hr7
+zqMadqV&VU$!81PQ;tr|U%Qm}z9u~U00`>9+OS>0*fAR;nJ0d54ep?Q_VAU%<8NvGD
+z4oQP?WYhsIvq@Oa|4l6ZbR*nOF*m3ANKOB_mjq+kSW9jeTL4LwJdda{kHKZYZ(lmN
+zXE_7kXFU^Hns!XCqcZBq3{za{P#@e}%AhIqZvBU1mka6|>yyegM<_ZtG3PY7HqRnG
+zczlA?-TJbu2Ok&`29qO_gAbeI3XAhDWgv_!=GydQIZC=7xUwD^yB>VK9*s&1VSp=5
+zBQ~?{N9*mluEprWNgwl{Ky(LAy#Y0<0aTR;YD-uYteN~}Nd9UubX&1F6@W6l>nz+!
+zJ_zL80;{rLBqM0XWC0SMIT2$cSiSAx_2B7v#$GXoGH(|CBl8?$PhuTG)A>wd8?GJU
+zBlqD2picW;&-U=58RqDn?)0AnWxM;p@2`b
+zb31GHxpc{+Vlr)VqFjTC9>qm=#y!rG0*;yFW5;jqQv-W|r
+zo?9c+)}AdxU_PDT#`e<6(85}Gt>|0~^~b`o_%qw7d@q{miG{uHM81isQ26QT-o}g|
+zyy7&gGuLFqqgawK$rgem^F3O&G{GoiIx?GwW_tpA?)5Z%y^0OI0$XJ)JyB%)ps;N2_D{p7-Zz-6`QoY-Q8;R{{-2X$?n!yVz>JxrwprTom
+z6lrO2mVH68-6o$C4flf0+`x(Ow}tIrLq8R#Y~+BN16YJKG$rErP0zM#SlY6Hw4Y29
+z&VO5vUpDVe!+exzgc|Uen7_a
+z32mhnGNgy0PD9*r_1ZxRxYkL5Hy0S%-H$NqY%I*7AIcW>ktws3b{TTaC2@JhGA^7B
+ziv{rT=l#(HwF<-}YuNV?Z(1tb1T<6Uwzk#d!w_wjoY_YOWLmo==_-V&VTBnfS(ND)
+z%R7GR?Pa1&oRKk!g*)qLxKoHqC$Q+%iNP_Y9tpFa7%J0NI@OPr^#Xt_P0Gci0$0iA
+zhzimrIJ*pCXVX&}_s^3&{40w`#1l^1d5J{9s=$omT^epJrnGa&6Dxfpv)9MaWjO1n
+zm!`M}6lhzs4BOGF=>Gh?9_}`|SP|t=n~+lcmI3k4tzG}b>CpY?vQ8FhChN~1WquuQ
+zT?;8K9(1;Df+XAqv?Yy9mIM)8q{c@FBQ}Z7&aQTMin%(1&I?d1`Vsg!PQG-`sCR>^
+zKP~2%o4aS1Wb9R+c6Lh$q1!CT;h2-nvGe0%m@&gcSy6?}isu-$4@+)9l#Z3#;)GDf
+z;?htTD_W8jqAaZhaIY?vkENle_`}P`GBX((Bpfp{T^H~u^SXz@0R5m50}bemQ`itZ
+zYp{Gk{ENOz5QPv$?VyN89IJf~HdOtRb+TwzWEm8M3v(_R(sF#QR^IlJSdai>Z$ZJ-
+zxkI{+BtBqEUBa1qv~Z^CDa9Y<8P~C3aOXg1i*Fx%OL@Mex~kANuB;1;$bWtb;fF9j
+zzJrLp=pJQf?U|H3F?Q6%)fAr_CTLnzHA6#h{%SnA4sv@E&!2AJs>+mrh1kqIO%dt{
+zx07{VEBOJEwe@orb9p-UbxCZC*J$H~u*%HS&zhrzkYH0$?J
+z8t3bLuS3G_T8>;kO`&I|!^(UGAa1RD!=%)P>zP?|>F`r$%e$svJ5CT@SSarw(&8?`
+zTqU%cOXdq%P0W#2m#TeJ=%>Eum!wC=rH@;6GL-`Q5vh$_FM-EOw<}<@N{B$o1I3ZQ$
+z1_irnE0+cN6AuqMKj=jR<+-Qe9sI0^!1M~F!_4?LS@@qO0U^pZ;Sr?oOZb{O1+&(15v?xWP^27slR#Skd~!K6jPilm
+zDd(?(&xB#j&Tx5zCjkxpEBWO#xBg%c+Uh2CqCa1{sU+p`K-YCy2hflvchg7=$$UQX
+zn@{Y@-GxE}w()W{m?oml)V?j%eulH0JL=){f0Ibe49DaP6m|S@oXn7#Ak38Af^?Vb
+zd2OPil)`XjE}&*uO2Q3hqDy)~BZ~D{v)j{YdXb(8H(tzPNVjM7{U&*z!{oNB)Mw^b
+zCdZl@is{%6+c+m8#6uhns9gG)!2E)d20mj#g}YsQQ(reJ$U2{Y8IE7xGQDJ{s%mXLfH-Y)(}aSnd{3*!*%5BVSRWxXQ@#KrkBK;G((1CRam3>TQGQZJ
+zr3gPtux{4twJ!d4Npj~$pBj2x*v42Sxqs(8^=&yvM$}L%O93JMCNbs}Q|Z12S68(I
+z?8a|d30x1(h4BrhnSKkF#o1!<0E$46(0CW?l4gpip|3O*JJ@0}Z(ERB!0qV4f^d
+zQ#w=e@45|<)U0vZE-j|;hc+B#_Mrk0E;M^N4ZJ