From d31738b773e2b6926e240d3c8c1478c892eeab98 Mon Sep 17 00:00:00 2001 From: jakub Date: Sun, 29 Oct 2023 10:04:11 +0100 Subject: [PATCH] =?UTF-8?q?prvn=C3=AD=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/uiDesigner.xml | 124 ++++++++++++++++++ .../xyz/soukup/informator/Informator.java | 70 +++++++--- .../informator/handlers/AnimationHandler.java | 61 +++++++++ .../informator/handlers/ConfigHandler.java | 35 +++++ .../informator/handlers/clockHandler.java | 27 ++++ .../informator/handlers/tabHandler.java | 5 + src/main/resources/animations.yml | 25 ++++ src/main/resources/config.yml | 18 +++ src/main/resources/modules/tab.yml | 65 +++++++++ target/classes/animations.yml | 25 ++++ target/classes/config.yml | 18 +++ target/classes/modules/tab.yml | 47 +++++++ .../xyz/soukup/informator/Informator.class | Bin 1755 -> 2891 bytes .../handlers/AnimationHandler.class | Bin 0 -> 3526 bytes .../informator/handlers/ConfigHandler.class | Bin 0 -> 2228 bytes .../informator/handlers/clockHandler$1.class | Bin 0 -> 1419 bytes .../informator/handlers/clockHandler.class | Bin 0 -> 858 bytes 17 files changed, 501 insertions(+), 19 deletions(-) create mode 100644 .idea/uiDesigner.xml create mode 100644 src/main/java/xyz/soukup/informator/handlers/AnimationHandler.java create mode 100644 src/main/java/xyz/soukup/informator/handlers/ConfigHandler.java create mode 100644 src/main/java/xyz/soukup/informator/handlers/clockHandler.java create mode 100644 src/main/java/xyz/soukup/informator/handlers/tabHandler.java create mode 100644 src/main/resources/animations.yml create mode 100644 src/main/resources/config.yml create mode 100644 src/main/resources/modules/tab.yml create mode 100644 target/classes/animations.yml create mode 100644 target/classes/config.yml create mode 100644 target/classes/modules/tab.yml create mode 100644 target/classes/xyz/soukup/informator/handlers/AnimationHandler.class create mode 100644 target/classes/xyz/soukup/informator/handlers/ConfigHandler.class create mode 100644 target/classes/xyz/soukup/informator/handlers/clockHandler$1.class create mode 100644 target/classes/xyz/soukup/informator/handlers/clockHandler.class diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/xyz/soukup/informator/Informator.java b/src/main/java/xyz/soukup/informator/Informator.java index ce16f3d..0f62e78 100644 --- a/src/main/java/xyz/soukup/informator/Informator.java +++ b/src/main/java/xyz/soukup/informator/Informator.java @@ -1,32 +1,61 @@ package xyz.soukup.informator; - -import org.bukkit.Color; +import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitTask; +import xyz.soukup.informator.handlers.AnimationHandler; +import xyz.soukup.informator.handlers.ConfigHandler; +import xyz.soukup.informator.handlers.clockHandler; +import java.io.IOException; import java.util.logging.Logger; public final class Informator extends JavaPlugin { + private static Informator instance; @Override public void onEnable() { + instance = this; Logger logger = Informator.getPlugin(Informator.class).getLogger(); - logger.info( "\u001B[34m \n"+ - " ____ ____ __ \n" + - " / _/___ / __/___ _________ ___ ____ _/ /_____ _____\n" + - " / // __ \\/ /_/ __ \\/ ___/ __ `__ \\/ __ `/ __/ __ \\/ ___/\n" + - " _/ // / / / __/ /_/ / / / / / / / / /_/ / /_/ /_/ / / \n" + - "/___/_/ /_/_/ \\____/_/ /_/ /_/ /_/\\__,_/\\__/\\____/_/ \n" + - " \n" + - "\u001B[33m===========================================================\n\n" + - "\u001B[34m Plugin version:\u001B[37m " + getDescription().getVersion() + - "\n\u001B[34m Author:\u001B[37m Jakub Soukup" + - "\n\u001B[34m Website:\u001B[37m " + getDescription().getWebsite() + - "\n\u001B[34m Source code:\u001B[37m Jakub Soukup" + - "\n\n\u001B[35m Thanks for using my plugin! It means a lot to me <3" + - "\n\n" + - "\u001B[33m===========================================================\n" - - ); + logger.info("\u001B[34m"); + logger.info(" ____ ____ __"); + logger.info(" / _/___ / __/___ _________ ___ ____ _/ /_____ _____"); + logger.info(" / // __ \\/ /_/ __ \\/ ___/ __ `__ \\/ __ `/ __/ __ \\/ ___/"); + logger.info(" _/ // / / / __/ /_/ / / / / / / / / /_/ / /_/ /_/ / /"); + logger.info("/___/_/ /_/_/ \\____/_/ /_/ /_/ /_/\\__,_/\\__/\\____/_/"); + logger.info(""); + logger.info("\u001B[33m==========================================================="); + logger.info(""); + logger.info("\u001B[34m Informator is starting!"); + logger.info(""); + logger.info("\u001B[33m==========================================================="); + logger.info(""); + logger.info("\u001B[34m Plugin version:\u001B[37m " + getDescription().getVersion()); + logger.info("\u001B[34m Author:\u001B[37m Jakub Soukup"); + logger.info("\u001B[34m Plugin's website: \u001B[37m https://informator.soukup.xyz/"); + logger.info("\u001B[34m Author's website:\u001B[37m " + getDescription().getWebsite()); + logger.info("\u001B[34m Source code:\u001B[37m soon will be available"); + logger.info(""); + logger.info("\u001B[34m Thanks for using my plugin! It means a lot to me <3"); + logger.info(" Made in the Czech Republic \uD83C\uDDE8\uD83C\uDDFF"); + logger.info(""); + logger.info("\u001B[33m==========================================================="); + logger.info(""); + try { + ConfigHandler.loadConfigs(); + } catch (IOException | InvalidConfigurationException e) { + throw new RuntimeException(e); + } + AnimationHandler.loadAnimations(); + clockHandler.centralClock + logger.info(""); + logger.info("\u001B[33m==========================================================="); + logger.info(""); + logger.info("\u001B[34m Informator loaded!"); + logger.info(""); + logger.info("\u001B[33m==========================================================="); + } + public static Informator getPlugin(){ + return instance; } @Override @@ -37,4 +66,7 @@ public final class Informator extends JavaPlugin { + + + } diff --git a/src/main/java/xyz/soukup/informator/handlers/AnimationHandler.java b/src/main/java/xyz/soukup/informator/handlers/AnimationHandler.java new file mode 100644 index 0000000..bc490eb --- /dev/null +++ b/src/main/java/xyz/soukup/informator/handlers/AnimationHandler.java @@ -0,0 +1,61 @@ +package xyz.soukup.informator.handlers; + +import org.bukkit.configuration.file.YamlConfiguration; +import xyz.soukup.informator.Informator; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; +import java.util.logging.Logger; + + +public class AnimationHandler { + private static final YamlConfiguration aconfig = ConfigHandler.animationConfig; + static Informator plugin = Informator.getPlugin(); + static Logger logger = plugin.getLogger(); + private static final List animations = new ArrayList(); + private static final HashMap> animationFrames = new HashMap>(); + private static final HashMap tpsCounter = new HashMap(); + private static final HashMap animationSpeed = new HashMap(); + private static final HashMap currentFrame = new HashMap(); + private static Integer cycles = 0; + + public static void loadAnimations(){ + animations.addAll(aconfig.getKeys(false)); + for (String animation: animations) { + animationFrames.put(animation, aconfig.getStringList(animation + ".frames") ); + animationSpeed.put(animation, aconfig.getInt(animation + ".speed")); + tpsCounter.put(animation, 0); + currentFrame.put(animation, 0); + logger.info("\u001B[34m Loaded animation\u001B[37m " + animation); + } + + } + public static void refreshAnimations(){ + for (String animation: animations){ + tpsCounter.put(animation, tpsCounter.get(animation) + 1); + if (Objects.equals(tpsCounter.get(animation), animationSpeed.get(animation))){ + tpsCounter.put(animation, 0); + if (currentFrame.get(animation) != (animationFrames.get(animation).size() - 1)) { + currentFrame.put(animation, currentFrame.get(animation) + 1); + } + else { + currentFrame.put(animation, 0); + } + } + + + } + cycles++; + + } + + + public static String getCurrentFrame(String name){ + if (animations.contains(name)) + return animationFrames.get(name).get(currentFrame.get(name))+ " " + currentFrame.get(name); + else + return null; + } +} diff --git a/src/main/java/xyz/soukup/informator/handlers/ConfigHandler.java b/src/main/java/xyz/soukup/informator/handlers/ConfigHandler.java new file mode 100644 index 0000000..1db3d1d --- /dev/null +++ b/src/main/java/xyz/soukup/informator/handlers/ConfigHandler.java @@ -0,0 +1,35 @@ +package xyz.soukup.informator.handlers; + +import org.bukkit.configuration.Configuration; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import xyz.soukup.informator.Informator; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; + + +public class ConfigHandler { + static Informator plugin = Informator.getPlugin(); + static Logger logger = plugin.getLogger(); + public static YamlConfiguration animationConfig = new YamlConfiguration(); + public static void loadConfigs() throws IOException, InvalidConfigurationException { + List configsToLoad = new ArrayList<>(); + configsToLoad.add("config.yml"); + configsToLoad.add("animations.yml"); + configsToLoad.add("modules/tab.yml"); + for (String configAdress:configsToLoad) { + File file = new File(plugin.getDataFolder(), configAdress); + if (!file.exists()) + plugin.saveResource(configAdress, false); + logger.info("\u001B[34m Loaded configuration file\u001B[37m " + configAdress); + + } + animationConfig.load(new File(plugin.getDataFolder(), "animations.yml")); + + } + +} diff --git a/src/main/java/xyz/soukup/informator/handlers/clockHandler.java b/src/main/java/xyz/soukup/informator/handlers/clockHandler.java new file mode 100644 index 0000000..423fe64 --- /dev/null +++ b/src/main/java/xyz/soukup/informator/handlers/clockHandler.java @@ -0,0 +1,27 @@ +package xyz.soukup.informator.handlers; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import xyz.soukup.informator.Informator; + +import java.util.Objects; + +public class clockHandler { + public static Informator plugin = Informator.getPlugin(); + static int cycles = 0; + + public static BukkitTask centralClock = new BukkitRunnable() { + @Override + public void run() { + cycles++; + AnimationHandler.refreshAnimations(); + for (Player player: Bukkit.getOnlinePlayers()) { + player.sendMessage(ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(AnimationHandler.getCurrentFrame("exampleTitle")))); + } + } + }.runTaskTimer(plugin, 0, 1L); + +} diff --git a/src/main/java/xyz/soukup/informator/handlers/tabHandler.java b/src/main/java/xyz/soukup/informator/handlers/tabHandler.java new file mode 100644 index 0000000..415cf4b --- /dev/null +++ b/src/main/java/xyz/soukup/informator/handlers/tabHandler.java @@ -0,0 +1,5 @@ +package xyz.soukup.informator.handlers; + +public class tabHandler { + +} diff --git a/src/main/resources/animations.yml b/src/main/resources/animations.yml new file mode 100644 index 0000000..a3f54a3 --- /dev/null +++ b/src/main/resources/animations.yml @@ -0,0 +1,25 @@ +#Animations is the way to make text move! +#You can use them on tab, scoreboard and bossbar +#Placeholder: {animation.animationName} + + +exampleTitle: + #Speed is in minecraft ticks + #20 ticks = 1 second so speed 20 = 1 frame per second + speed: 2 + #Also hate making animations manually? + #You can use animation creation tool (ACT) built in web configurator! + # https://informator.soukup.xyz/configurator/act + frames: + - "&b&3I&b&fNFORMATOR" + - "&b&fI&b&3N&b&fFORMATOR" + - "&b&fIN&b&3F&b&fORMATOR" + - "&b&fINF&b&3O&b&fRMATOR" + - "&b&fINFO&b&3R&b&fMATOR" + - "&b&fINFOR&b&3M&b&fATOR" + - "&b&fINFORM&b&3A&b&fTOR" + - "&b&fINFORMA&b&3T&b&fOR" + - "&b&fINFORMAT&b&3O&b&fR" + - "&b&fINFORMATO&b&3R" + - "&cKONEC" + diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..ccadb33 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,18 @@ +#Language of plugin's core messages. Won't affect language of any module +lang: cz +#Settings for each module can be found in the modules folder +#What features should this plugin handle +modules-enabled: + tab: true + scoreboard: true + motd: true + bossbar: true + +#Configuration for plugin's web interface +web-interface: + #online configurator enabled. We recommend to disable it after setting up the plugin + enabled: true + #API address of the configurator. + #DO NOT CHANGE THIS IF SOMEONE TOLD YOU TO. + #Api is a powerful tool. It can destroy all configuration if in wrong hands + api-address: https://informator.soukup.xyz/configurator/api/ \ No newline at end of file diff --git a/src/main/resources/modules/tab.yml b/src/main/resources/modules/tab.yml new file mode 100644 index 0000000..a99dda0 --- /dev/null +++ b/src/main/resources/modules/tab.yml @@ -0,0 +1,65 @@ +# ____ ____ __ +# / _/___ / __/___ _________ ___ ____ _/ /_____ _____ +# / // __ \/ /_/ __ \/ ___/ __ `__ \/ __ `/ __/ __ \/ ___/ +# _/ // / / / __/ /_/ / / / / / / / / /_/ / /_/ /_/ / / +#/___/_/ /_/_/ \____/_/ /_/ /_/ /_/\__,_/\__/\____/_/ +# + +settings: + +tabs: + default: + priority: 0 + header: + - "" + - "{animation.exampleTitle}" + - "" + - "{animation.exampleLine}" + - "" + footer: + - "" + - "{animation.exampleLine}" + - "" + - "Change this in modules/tab.yml" + - "" + world: + enabled: false + priority: 1 + worlds: + exampleWorld: + enabled: true + header: + - "World specified tab" + - "{animation.exampleTitle}" + - "" + - "{animation.exampleLine}" + - "" + footer: + - "" + - "{animation.exampleLine}" + - "" + - "Change this in modules/tab.yml" + - "" + #tab that will show only to players with certain group + group: + + player: + enabled: false + priority: 3 + players: + examplePlayer: + enabled: true + header: + - "World specified tab" + - "{animation.exampleTitle}" + - "" + - "{animation.exampleLine}" + - "" + footer: + - "" + - "{animation.exampleLine}" + - "" + - "Change this in modules/tab.yml" + - "" + + diff --git a/target/classes/animations.yml b/target/classes/animations.yml new file mode 100644 index 0000000..a3f54a3 --- /dev/null +++ b/target/classes/animations.yml @@ -0,0 +1,25 @@ +#Animations is the way to make text move! +#You can use them on tab, scoreboard and bossbar +#Placeholder: {animation.animationName} + + +exampleTitle: + #Speed is in minecraft ticks + #20 ticks = 1 second so speed 20 = 1 frame per second + speed: 2 + #Also hate making animations manually? + #You can use animation creation tool (ACT) built in web configurator! + # https://informator.soukup.xyz/configurator/act + frames: + - "&b&3I&b&fNFORMATOR" + - "&b&fI&b&3N&b&fFORMATOR" + - "&b&fIN&b&3F&b&fORMATOR" + - "&b&fINF&b&3O&b&fRMATOR" + - "&b&fINFO&b&3R&b&fMATOR" + - "&b&fINFOR&b&3M&b&fATOR" + - "&b&fINFORM&b&3A&b&fTOR" + - "&b&fINFORMA&b&3T&b&fOR" + - "&b&fINFORMAT&b&3O&b&fR" + - "&b&fINFORMATO&b&3R" + - "&cKONEC" + diff --git a/target/classes/config.yml b/target/classes/config.yml new file mode 100644 index 0000000..ccadb33 --- /dev/null +++ b/target/classes/config.yml @@ -0,0 +1,18 @@ +#Language of plugin's core messages. Won't affect language of any module +lang: cz +#Settings for each module can be found in the modules folder +#What features should this plugin handle +modules-enabled: + tab: true + scoreboard: true + motd: true + bossbar: true + +#Configuration for plugin's web interface +web-interface: + #online configurator enabled. We recommend to disable it after setting up the plugin + enabled: true + #API address of the configurator. + #DO NOT CHANGE THIS IF SOMEONE TOLD YOU TO. + #Api is a powerful tool. It can destroy all configuration if in wrong hands + api-address: https://informator.soukup.xyz/configurator/api/ \ No newline at end of file diff --git a/target/classes/modules/tab.yml b/target/classes/modules/tab.yml new file mode 100644 index 0000000..80a9543 --- /dev/null +++ b/target/classes/modules/tab.yml @@ -0,0 +1,47 @@ +# ____ ____ __ +# / _/___ / __/___ _________ ___ ____ _/ /_____ _____ +# / // __ \/ /_/ __ \/ ___/ __ `__ \/ __ `/ __/ __ \/ ___/ +# _/ // / / / __/ /_/ / / / / / / / / /_/ / /_/ /_/ / / +#/___/_/ /_/_/ \____/_/ /_/ /_/ /_/\__,_/\__/\____/_/ +# + +settings: + +tabs: + default: + priority: 0 + header: + - "INFORMATOR" + footer: + - "Change this in modules/tab.yml" + world: + enabled: false + priority: 1 + worlds: + exampleWorld: + enabled: true + header: + - "INFORMATOR" + - "" + - "This tab will show up to players" + - "in world exampleWorld" + footer: + - "Change this in modules/tab.yml" + #tab that will show only to players with certain group + group: + + player: + enabled: false + priority: 3 + players: + examplePlayer: + enabled: true + header: + - "INFORMATOR" + - "" + - "This tab will show up to user" + - "with nickname examplePlayer" + footer: + - "Change this in modules/tab.yml" + + diff --git a/target/classes/xyz/soukup/informator/Informator.class b/target/classes/xyz/soukup/informator/Informator.class index 3ab62700e1d6ae1869c81e508a4ac35acff542f7..cee02b9734d7df64e9be79bd6d7aeeef66ffa5be 100644 GIT binary patch literal 2891 zcmbVONpBQK6#mLK?w+C9#w^AdQp4&EcZdNeHUxu#U@`_`I|c&5^vpD#W_r3Oz1S>S zlvDmiltZLMIRTMu6i|qAigG|gf@`E4I7J+CiWDi!tLmO{1CBuHmR`Sl^_Hqv-+R?R z|NY(f0CwY(G`8bF3XK?2a4=2ZLxK#eIGn~2998j_ieoB9R2*0Fwu+pJQ57c?oJ?aS z4yZUKzV8U5u{6dpA%^d&m{f6E#Tg+wtKvNs=Tw|e<9%FEFs0z40wawq@@W)MOu@t@ z71Ihz465b$f#DQPhRwMvSFh>582BlAt{(J{4$v=8xM>^dDN)NWzk6}uoPToNKKo;DLbS93|l)oUnUFf7?{u5WjRmZ-sj%b;_5 zrsxshBo~dJp;J=~gCrxXDP0=rWE^qAiF|~+*wd8G#bj+Al_IM4PxQKG{au84k?$EpQmBO#X{kUgguf9PEIp`VTf|p zSK0snABIgb?VK+hBe#4`wc-VYzbwPL1=NlQ9?1@cmR%HhZI4YODDfH7^9j)dB<-(o z4OM)g!Go_L&=6uq!z^YPcx-hr3`(vSYachtVV)DNs3sZqKjnCb&u7iNZw2OnuqEH6 zAgKBSdZKuHqjK&QfLqv86e3|?TiO+|5Iv3(p_vz`!sFHWuIunw%eHymc)K=hQiP=u<{`p+)B2a`lmu^^QS^NtAxUbuL-cp=XF@ zLM?2@u&v^7QkXDoTR6(G&264S>qvCTVcYQi!Omo>TRadoJJHjkW=X)Lp7vjX zNwvwMPEY+f87hMIpy>6@Mzv}>MTVV=DI}KnR5_5}<+OyureE+Z+1eSpX&uieDauVk zQ8ZFA-|>>F3~3598C4s@>e^;yD&u|7?Du|(H@t#bGF46_!>k)R2MMH+A z;iDrrj6w4_TV)g)ae>GA}>BEcu*cd+v8JXU2gb7<+B z!|FM#A#M(9rTRKaTLrBtuCFV$B@{O#ythk!V?weJ?>07lg=M36kUiTokInaPW6LdU z9qrCMzu;}pIJimqyN?HWh*#n-rwoaVeopBJR#Eyh^pnB$e7{Ue|rP&-dVho#bhP+(>$8}`!DOr4mE%*{!@eQ`&1|9Dl`MyhDex!r_iB9J} zMSMW#^pMW)5qbUvui{sN!ehLK-_VEODbgR8sn+NbyL$1gT*W1;#o4k z#LHqd5l@<6Jb2c#HxK>*jqhxmmPz*geD;0bXXb0_M||h>-}{dMD%cb_kF13&0vwJu zGZu0JQDkk*YCoro^8yQ4w6Uc9vW>j%6a-dq)xx!-)4M#kt+wpc(MddJcRP1Fjop@~ zs%%O9WCdda2{q2=SBkhUaRViWsppMXjbf|O@rw_7d(Do2d%xLw>g_T1E&ZfiX*)vQ zUu7};bQ z6^SZp7F>y&SY>d9T8ubz8cx*CBX9R*v**<*b=!_aU1JV}ZdcW>NX-hv(cm#5v4&L( zwWld~C8#o(%wYGrecfup%-E4;=UJCwQhhg*2M_6n zI6aC!1{mn_$X=kVNS=|8=8wVNQoxZUYlcM|lN8H704YpS#&B`?^J^N$skV{e?_hia z4-nZdd_eT^G0cP&z|IGV1*DV0#JOQEbs8rVU@XA+h<2KYHK9Zt(?q^Zly!>NkqK8x m_2~wyNR)7ia9TlnxKtrrk`^6}o$brXosq+aaxN2|Bl92k!Ewd_ diff --git a/target/classes/xyz/soukup/informator/handlers/AnimationHandler.class b/target/classes/xyz/soukup/informator/handlers/AnimationHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..48f9e336334b6f2d2a250c966418d86df0c6ba92 GIT binary patch literal 3526 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 TVH%Tk&4SVZX{w-$Mj-VQPVRBT literal 0 HcmV?d00001 diff --git a/target/classes/xyz/soukup/informator/handlers/clockHandler.class b/target/classes/xyz/soukup/informator/handlers/clockHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..e36e5d903b06b2c1e3933390baf48a8e948dff9e GIT binary patch literal 858 zcmb7D+iuf95Iq|wacmZPgK%r1DQQVs!3v4DRv;09NEHDRQ6(NX&XR2H*wxxbl)r*V z6oJGC@KK1_Bx>`JKH!HvGiPV!jAqt<{{H+8;3@We_*nO`fqNc2+_%T3i<*y;rAyed z%mWv77uyWH9mmSFBAKQtWhkFS`9Q}ETb<9RUqqVZVSXZX{4p^jnI%TF&&_>`4o-u} zrm;3v3RIjK8MUG$2pMXf#0*3)4?~@aG#ILW9w{SUOo*;bLz{n~W1T%?a2m}chGHw} zD~6?xj@6rd)KjJ_dl50Kog|Raku=)+GqRWsHAz3Zq|u>_`y`l(!1nWc>XByUAc$tF z{`(|1fqJE_#>#x$<74?ra;##_#SX_qG&ne}a$Lg_NiH7ELdE(MjwW_Fma)RH_aB)I z%eD&<$#@{%_KsDMF>Ed_aIqBzZ=kYwvn|#e%}d5}kwG)zCXek(x_YDx!}G@c?xrt7 zOiS(`9yaGM7cLexdSO1jMu(8bMpng6j?lAnAS{5kiZwc~lP3rnVQKda?Ca$E2A$;z z$x$VnPXllhx5%sD_IdJ4inHIw4;035oH2^OQ2KC&@;5l1{~hia67I2670`B4pp-<5^j->tpAqvyT literal 0 HcmV?d00001