// Path: src/main/java/com/lenis0012/bukkit/loginsecurity/LoginSecurity.java
// public class LoginSecurity extends PluginHolder {
//     private static final ExecutorService executorService = Executors.newCachedThreadPool();
// 
//     /**
//      * Get the executor LoginSecurity uses for async processing.
//      *
//      * @return Executor service.
//      */
//     public static ExecutorService getExecutorService() {
//         return executorService;
//     }
// 
//     /**
//      * Get session manager.
//      *
//      * @return SessionManager
//      */
//     public static SessionManager getSessionManager() {
//         return ((LoginSecurity) getInstance()).sessionManager;
//     }
// 
//     /**
//      * Get configuration settings.
//      *
//      * @return Configuration
//      */
//     public static LoginSecurityConfig getConfiguration() {
//         return ((LoginSecurity) getInstance()).config();
//     }
// 
//     public static LoginSecurityDatabase getDatastore() { return ((LoginSecurity) getInstance()).datastore(); }
// 
//     /**
//      * Translate a message by key.
//      *
//      * @param key Key to translate
//      * @return Translated version by key and selected language
//      */
//     public static TranslatedMessage translate(LanguageKeys key) {
//         return getInstance().getModule(LanguageModule.class).translate(key);
//     }
// 
//     /**
//      * Translate a message by key.
//      *
//      * @param key Key to translate
//      * @return Translated version by key and selected language
//      */
//     public static TranslatedMessage translate(String key) {
//         return getInstance().getModule(LanguageModule.class).translate(key);
//     }
// 
//     private LoginSecurityConfig config;
//     private SessionManager sessionManager;
// 
//     public LoginSecurity() {
//         super(ConfigurationModule.class);
//     }
// 
//     @Override
//     public void enable() {
//         // Load config
//         ConfigurationModule module = getModule(ConfigurationModule.class);
//         this.config = module.createCustomConfig(LoginSecurityConfig.class);
//         config.reload();
//         config.save();
// 
//         // Load session manager
//         this.sessionManager = new SessionManager();
// 
//         // Filter log
//         org.apache.logging.log4j.core.Logger consoleLogger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger();
//         consoleLogger.addFilter(new LoggingFilter());
// 
//         // Register modules
//         registry.registerModules(
//                 LanguageModule.class,
//                 NewStorageModule.class,
//                 GeneralModule.class,
//                 ThreadingModule.class,
//                 CaptchaManager.class);
//     }
// 
//     @Override
//     public void disable() {
//         // Wait for all async processes to complete...
//         getLogger().log(Level.INFO, "Waiting for queued tasks...");
//         executorService.shutdown();
//         getLogger().log(Level.INFO, "ExecutorService shut down, ready to disable.");
//     }
// 
//     public LoginSecurityConfig config() {
//         return config;
//     }
// 
//     public LoginSecurityDatabase datastore() {
//         return getModule(NewStorageModule.class).getDatabase();
//     }
// }
// 
// Path: src/main/java/com/lenis0012/bukkit/loginsecurity/storage/PlayerInventory.java
// public class PlayerInventory {
//     private int id;
// 
//     private String helmet;
// 
//     private String chestplate;
// 
//     private String leggings;
// 
//     private String boots;
// 
//     private String offHand;
// 
//     private String contents;
// 
//     public int getId() {
//         return id;
//     }
// 
//     public void setId(int id) {
//         this.id = id;
//     }
// 
//     public String getHelmet() {
//         return helmet;
//     }
// 
//     public void setHelmet(String helmet) {
//         this.helmet = helmet;
//     }
// 
//     public String getChestplate() {
//         return chestplate;
//     }
// 
//     public void setChestplate(String chestplate) {
//         this.chestplate = chestplate;
//     }
// 
//     public String getLeggings() {
//         return leggings;
//     }
// 
//     public void setLeggings(String leggings) {
//         this.leggings = leggings;
//     }
// 
//     public String getBoots() {
//         return boots;
//     }
// 
//     public void setBoots(String boots) {
//         this.boots = boots;
//     }
// 
//     public String getOffHand() {
//         return offHand;
//     }
// 
//     public void setOffHand(String offHand) {
//         this.offHand = offHand;
//     }
// 
//     public String getContents() {
//         return contents;
//     }
// 
//     public void setContents(String contents) {
//         this.contents = contents;
//     }
// }


import com.lenis0012.bukkit.loginsecurity.LoginSecurity;
import com.lenis0012.bukkit.loginsecurity.storage.PlayerInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.io.BukkitObjectInputStream;
import org.bukkit.util.io.BukkitObjectOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.logging.Level;

    private static String serialize(Object item) {
        if(item == null) return null;
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            BukkitObjectOutputStream output = new BukkitObjectOutputStream(baos);
            output.writeObject(item);
            return Base64.getEncoder().encodeToString(baos.toByteArray());
        } catch(IOException e) {
            LoginSecurity.getInstance().getLogger().log(Level.SEVERE, "Failed to serialize item", e);
            return null;
        } finally {
            if(baos != null) {
                try {
                    baos.close();
                } catch(IOException e1) {}
            }
        }
    }

    private static Object deserialize(String item) {
        if(item == null) return null;
        BukkitObjectInputStream input = null;
        try {
            byte[] bytes = Base64.getDecoder().decode(item);
            input = new BukkitObjectInputStream(new ByteArrayInputStream(bytes));
            return input.readObject();
        } catch(Exception e) {
            LoginSecurity.getInstance().getLogger().log(Level.SEVERE, "Failed to deserialize item", e);
// Path: src/main/java/com/lenis0012/bukkit/loginsecurity/LoginSecurity.java
// public class LoginSecurity extends PluginHolder {
//     private static final ExecutorService executorService = Executors.newCachedThreadPool();
// 
//     /**
//      * Get the executor LoginSecurity uses for async processing.
//      *
//      * @return Executor service.
//      */
//     public static ExecutorService getExecutorService() {
//         return executorService;
//     }
// 
//     /**
//      * Get session manager.
//      *
//      * @return SessionManager
//      */
//     public static SessionManager getSessionManager() {
//         return ((LoginSecurity) getInstance()).sessionManager;
//     }
// 
//     /**
//      * Get configuration settings.
//      *
//      * @return Configuration
//      */
//     public static LoginSecurityConfig getConfiguration() {
//         return ((LoginSecurity) getInstance()).config();
//     }
// 
//     public static LoginSecurityDatabase getDatastore() { return ((LoginSecurity) getInstance()).datastore(); }
// 
//     /**
//      * Translate a message by key.
//      *
//      * @param key Key to translate
//      * @return Translated version by key and selected language
//      */
//     public static TranslatedMessage translate(LanguageKeys key) {
//         return getInstance().getModule(LanguageModule.class).translate(key);
//     }
// 
//     /**
//      * Translate a message by key.
//      *
//      * @param key Key to translate
//      * @return Translated version by key and selected language
//      */
//     public static TranslatedMessage translate(String key) {
//         return getInstance().getModule(LanguageModule.class).translate(key);
//     }
// 
//     private LoginSecurityConfig config;
//     private SessionManager sessionManager;
// 
//     public LoginSecurity() {
//         super(ConfigurationModule.class);
//     }
// 
//     @Override
//     public void enable() {
//         // Load config
//         ConfigurationModule module = getModule(ConfigurationModule.class);
//         this.config = module.createCustomConfig(LoginSecurityConfig.class);
//         config.reload();
//         config.save();
// 
//         // Load session manager
//         this.sessionManager = new SessionManager();
// 
//         // Filter log
//         org.apache.logging.log4j.core.Logger consoleLogger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger();
//         consoleLogger.addFilter(new LoggingFilter());
// 
//         // Register modules
//         registry.registerModules(
//                 LanguageModule.class,
//                 NewStorageModule.class,
//                 GeneralModule.class,
//                 ThreadingModule.class,
//                 CaptchaManager.class);
//     }
// 
//     @Override
//     public void disable() {
//         // Wait for all async processes to complete...
//         getLogger().log(Level.INFO, "Waiting for queued tasks...");
//         executorService.shutdown();
//         getLogger().log(Level.INFO, "ExecutorService shut down, ready to disable.");
//     }
// 
//     public LoginSecurityConfig config() {
//         return config;
//     }
// 
//     public LoginSecurityDatabase datastore() {
//         return getModule(NewStorageModule.class).getDatabase();
//     }
// }
// 
// Path: src/main/java/com/lenis0012/bukkit/loginsecurity/storage/PlayerInventory.java
// public class PlayerInventory {
//     private int id;
// 
//     private String helmet;
// 
//     private String chestplate;
// 
//     private String leggings;
// 
//     private String boots;
// 
//     private String offHand;
// 
//     private String contents;
// 
//     public int getId() {
//         return id;
//     }
// 
//     public void setId(int id) {
//         this.id = id;
//     }
// 
//     public String getHelmet() {
//         return helmet;
//     }
// 
//     public void setHelmet(String helmet) {
//         this.helmet = helmet;
//     }
// 
//     public String getChestplate() {
//         return chestplate;
//     }
// 
//     public void setChestplate(String chestplate) {
//         this.chestplate = chestplate;
//     }
// 
//     public String getLeggings() {
//         return leggings;
//     }
// 
//     public void setLeggings(String leggings) {
//         this.leggings = leggings;
//     }
// 
//     public String getBoots() {
//         return boots;
//     }
// 
//     public void setBoots(String boots) {
//         this.boots = boots;
//     }
// 
//     public String getOffHand() {
//         return offHand;
//     }
// 
//     public void setOffHand(String offHand) {
//         this.offHand = offHand;
//     }
// 
//     public String getContents() {
//         return contents;
//     }
// 
//     public void setContents(String contents) {
//         this.contents = contents;
//     }
// }


// Path: src/main/java/com/lenis0012/bukkit/loginsecurity/util/InventorySerializer.java
import com.lenis0012.bukkit.loginsecurity.LoginSecurity;
import com.lenis0012.bukkit.loginsecurity.storage.PlayerInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.io.BukkitObjectInputStream;
import org.bukkit.util.io.BukkitObjectOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.logging.Level;


    private static String serialize(Object item) {
        if(item == null) return null;
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            BukkitObjectOutputStream output = new BukkitObjectOutputStream(baos);
            output.writeObject(item);
            return Base64.getEncoder().encodeToString(baos.toByteArray());
        } catch(IOException e) {
            LoginSecurity.getInstance().getLogger().log(Level.SEVERE, "Failed to serialize item", e);
            return null;
        } finally {
            if(baos != null) {
                try {
                    baos.close();
                } catch(IOException e1) {}
            }
        }
    }

    private static Object deserialize(String item) {
        if(item == null) return null;
        BukkitObjectInputStream input = null;
        try {
            byte[] bytes = Base64.getDecoder().decode(item);
            input = new BukkitObjectInputStream(new ByteArrayInputStream(bytes));
            return input.readObject();
        } catch(Exception e) {
            LoginSecurity.getInstance().getLogger().log(Level.SEVERE, "Failed to deserialize item", e);
            return null;