diff --git a/data/emotefilter.json b/data/emotefilter.json deleted file mode 100644 index 5da620d9..00000000 --- a/data/emotefilter.json +++ /dev/null @@ -1,1371 +0,0 @@ -{ - "blacklist": [ - "8Bit", - "AAAAAH", - "AESTHETIC", - "AHEM", - "AK47", - "ALAN", - "ALEC", - "ALERT", - "ALIENS", - "ARMY", - "ASCENSION", - "ATOMIC", - "AVERAGE", - "AWAKENED", - "Abaddon", - "Abnegation", - "Abra", - "Aces", - "Advice", - "Affe", - "Afire", - "Aftertaste", - "Agility", - "Ahaha", - "Ahead", - "Aids", - "Ak47", - "Akame", - "Akeno", - "Akuma", - "Alamo", - "Aldo", - "Alexis", - "Alien", - "Alienated", - "Alkaline", - "Amazed", - "Amazing!", - "Amicable", - "Amine", - "Anarchy", - "Anders", - "Anonymous", - "Antichrist", - "Aped", - "Apollo", - "Arduous", - "Ares", - "Aries", - "Arma3", - "Armos", - "Arnold", - "Ashley", - "Asteroid", - "Astor", - "Attack", - "Attempt", - "Avon", - "Awww", - "Ayaya", - "Ayes", - "AyyLmao", - "Azimuth", - "B1nzy", - "BABE", - "BADGE", - "BALLET", - "BANGER", - "BANISH", - "BANNED", - "BANZAI", - "BAPTIZED", - "BEARS", - "BEER", - "BERSERK", - "BINGO", - "BLESS", - "BLESSED", - "BLURB", - "BOMB", - "BOMB", - "BONK", - "BONUS", - "BOOBS", - "BOOM", - "BOOTY", - "BORK", - "BOTCH", - "BREAKFAST", - "BRUCE", - "BUBBLE", - "BUFFER", - "BULLY", - "BURN", - "BURT", - "BUSTER", - "Baby", - "BabyRoll", - "Bagels", - "Baguette", - "Balance", - "Ballin", - "Bamboozle", - "Bamboozled", - "Banana", - "Bandits", - "Bane", - "Banger", - "Banter", - "Barb", - "Barf", - "Barracks", - "Bear", - "Beard", - "Beardless", - "Beer", - "Behemoth", - "Behind", - "Bella", - "Benito", - "Benny", - "Benson", - "Bepis", - "Berber", - "Berge", - "Bern", - "Berserk", - "Besen", - "BetterDiscord", - "Bighorn", - "Bijou", - "Bilbo", - "Bile", - "Bilingual", - "Billy", - "Binary", - "Birb", - "Birb", - "Birdie", - "Bjorn", - "Blanking", - "Blazed", - "Bleaching", - "Bleeder", - "Blip", - "Blubber", - "Blurred", - "Boeuf", - "Bolts", - "Bomb", - "Bombastic", - "Bombshell", - "Boned", - "Boner", - "Bonfire", - "Bonito", - "Bonnie", - "Booby", - "Boosted", - "Bork", - "Boss", - "Bourbon", - "Brille", - "Brimstone", - "Brittany", - "Brofist", - "Bruh", - "Bryce", - "Bubbles", - "Bubs", - "Bumpy", - "Bunny", - "Burg", - "Burial", - "Busted", - "Bustin", - "Butterfly", - "Butterfly", - "CAKE", - "CASH", - "CAUTION", - "CHAOS", - "CHOCOLATE", - "CLAM", - "CLASSIC", - "CLENCH", - "CLIP", - "COAST", - "COFFIN", - "COGS", - "CONFUSION", - "CONSUME", - "COSMOS", - "COVENANT", - "CRETIN", - "CROSSED", - "CSS3", - "CURSE", - "Cactus", - "Cadence", - "Canard", - "Candlelight", - "Cannon", - "Cara", - "Card", - "Caret", - "Carina", - "Carlton", - "Cart", - "Castle", - "Caveman", - "Chains", - "Challenge", - "Champ", - "Charged", - "Charizard", - "Charlie", - "Charlotte", - "Cheeky", - "Cheese", - "Chelsea", - "Chester", - "Chet", - "Chew", - "Chickpea", - "Chinking", - "Chocobo", - "Chocolate", - "Choke", - "Chris", - "Chrysalis", - "Chuckles", - "Cinder", - "Cinnamon", - "Claire", - "Clank", - "Clarisse", - "Cleft", - "Clinton", - "Clive", - "Coagulant", - "Coaxial", - "Coco", - "Coffee", - "Coldsteel", - "Colonel", - "Commenter", - "Conga", - "Conniptions", - "Constipation", - "Constitution", - "Construction", - "Content", - "Convicted", - "Conway", - "Cookie", - "Cooking", - "Coolest", - "Coop", - "Cooper", - "Corny", - "Costanza", - "Covered", - "Crabby", - "Crafting", - "Credo", - "Creeper", - "Crock", - "Crossover", - "Crown", - "Cruising", - "Crumbs", - "Crusaders", - "Cube", - "Cucumber", - "Cupcake", - "Cupid", - "Cuppa", - "Custard", - "DAMAGE", - "DAVE", - "DEAD", - "DEATH", - "DEEM", - "DEER", - "DELETE", - "DELETED", - "DELUXE", - "DENIAL", - "DENIED", - "DESTROYED", - "DESU", - "DETECTED", - "DETERMINATION", - "DEVIL", - "DICKS", - "DODGE", - "DODO", - "DOGS", - "DRINK", - "DUCKS", - "DUDE", - "DUNKED", - "DUST", - "DWAYNE", - "Dale", - "Dallas", - "Damnit", - "Damnit", - "Dance", - "Dante", - "Darnell", - "Dashing", - "Dauntless", - "Davy", - "Dayum", - "Deadass", - "Deadass", - "Dearest", - "Dedede", - "Dehumidify", - "Demon", - "Denis", - "Dentures", - "Derp", - "Derp", - "Deud", - "Dickered", - "Digestive", - "Ding", - "Dingle", - "Dirk", - "Disgusted", - "Ditto", - "Divination", - "Dodo", - "Doge", - "Dogging", - "Donnie", - "Dons", - "Donuts", - "Dood", - "Dropsy", - "Drunken", - "Duane", - "Dunked", - "Dunno", - "Dyson", - "EDGE", - "EMOTE", - "ENERGY", - "ESCAPE", - "EXACTLY", - "EXCELLENT", - "EXPLOSION", - "EXTERMINATE", - "Earl", - "Eduardo", - "Egging", - "Eggman", - "Eggplant", - "Electrode", - "Elementals", - "Envision", - "Ernie", - "Errol", - "Ethereal", - "Eugh", - "Everyone!", - "Evil", - "Excalibur", - "Exclaim", - "Exclamation", - "Exclusive", - "Exited", - "Exploded", - "Exposed", - "Eyes", - "Eyyy", - "Eyyyyyy", - "Ezreal", - "FAIL", - "FAIL", - "FAILURE", - "FAKER", - "FANCY", - "FAST", - "FEESH", - "FERVOR", - "FEVER", - "FFXV", - "FIREBALL", - "FIVE", - "FOCUS", - "FORESHADOWING", - "FORKED", - "FOUR", - "FOXHOUND", - "FRIG", - "FRISK", - "FUMBLES", - "Face", - "Faded", - "Fail", - "Faithless", - "Farming", - "Faro", - "Fatality", - "Faust", - "Faye", - "Fennec", - "Feuer", - "Fidget", - "Fighting", - "Fire", - "Firefly", - "First", - "Fishing", - "Fishy", - "Fist", - "Fluffy", - "Follow", - "Forman", - "Foxhound", - "Franck", - "Frankie", - "Freddie", - "Freddy", - "Fritz", - "Frog", - "GAME!", - "GAMING", - "GANG", - "GERARD", - "GET!", - "GIBE", - "GLITCH", - "GOBBLE", - "GRIN", - "GROWL", - "GUILE", - "Gaben", - "Gabriel", - "Gambler", - "Gamest", - "Gandalf", - "Garble", - "Gary", - "Gaseous", - "Gasp", - "Gauche", - "Gazorpazorpfield", - "Generated", - "Gengar", - "Genius", - "George!", - "Gerald", - "Gerard", - "Ghastly", - "Ghost", - "Gilbert", - "Gilliam", - "Gilligan", - "Gimpy", - "Glenn", - "Glob", - "Gloom", - "Gloomy", - "Glottis", - "Gnome", - "Goat", - "Godhead", - "Godspeed", - "Gold", - "Goldberg", - "Goldblum", - "Golden", - "Gondola", - "Goofballs", - "Gosu", - "Gramps", - "Greened", - "Greener", - "Gregg", - "Greninja", - "Grimace", - "Grunge", - "Guacamole", - "Guardianship", - "Guff", - "Guile", - "Guinness", - "Gunny", - "Gunter", - "Gunther", - "Gustav", - "H3H3", - "HAAA", - "HAHAHA", - "HALLO", - "HANK", - "HEART", - "HEEHAW", - "HELGA", - "HELLO", - "HELLO!", - "HELP", - "HELP", - "HEY!", - "HOFF", - "HOLLOW", - "HONK", - "HORNLESS", - "HUGO", - "HUNK", - "HUZZAH", - "HYPE", - "HYPE", - "Hacked", - "Hai!", - "Halp", - "Halp", - "Handsome", - "Hannibal", - "Hanzo", - "Happy", - "Harambe", - "Hartz", - "Haste", - "Headliner", - "Heart", - "Heartless", - "Heated", - "Heave", - "Heels", - "Hello", - "Heresy", - "Herz", - "Hey!", - "Heya!", - "Heyo", - "Hiccup", - "Hiccups", - "Hideout", - "Hiho", - "Hillary", - "Hina", - "Hobbes", - "Homeboy", - "Honda", - "Horace", - "Horde", - "Huck", - "Huehue", - "Huffs", - "Hullo", - "Humm", - "Hunter", - "Husk", - "Hydro", - "Hype", - "Hypnosis", - "INFIDEL", - "INHALE", - "INIT", - "INSANE", - "Ibiza", - "Ibuki", - "Icebox", - "Iceman", - "Ichigo", - "Illusionist", - "Imperil", - "Implications", - "Impulse", - "Impulsion", - "Inconceivable", - "Infiltrated", - "Inkling", - "Integrity", - "Interrogation", - "Iota", - "Isaac", - "Isadora", - "Isis", - "JAPANNED", - "JESSE", - "JOBLESS", - "JUMP", - "JUNES", - "JUST", - "JUSTICE", - "Jabba", - "Jace", - "Jaffa", - "Jago", - "James", - "Jazz", - "Jeanne", - "Jeremiah", - "Jerry", - "Jill", - "John", - "Johnny", - "Joint", - "Josef", - "Josuke", - "Juliana", - "Julius", - "KAPPA", - "KAPPA", - "KARL", - "KISS", - "KOBE", - "Kaede", - "Kali", - "Kaput", - "Karma", - "Katze", - "Keith", - "Kenny", - "Kevin", - "Kian", - "Kierkegaard", - "Kill", - "Kipper", - "Kirby", - "Kisses", - "Kitsune", - "Kitsunemimi", - "Kitty", - "Kkkkk", - "Knotty", - "Koba", - "Kola", - "Kona", - "Koopa", - "Krill", - "LEFT", - "LEGENDARY", - "LEVELED", - "LEWD", - "LEXINGTON", - "LIES", - "LINDA", - "LINK", - "LOADS", - "LOCO", - "LOGO", - "LOOT", - "LOST", - "LOUD", - "LOVE", - "LULUL", - "LURK", - "Lamb", - "Lank", - "Lanky", - "Lantern", - "Lapin", - "Lapras", - "Lars", - "Launch", - "Leffen", - "Lemons", - "Lemony", - "Lenny", - "Leon", - "Leonardo", - "Lester", - "LetsPlay", - "Lewd", - "Licky", - "Limpa", - "Link", - "Lion", - "Liquid", - "Lockjaw", - "Loge", - "Logo", - "Lonk", - "Loool", - "Loots", - "Lorraine", - "Lose", - "Lotus", - "Loudness", - "Louie", - "Love", - "Lucarionite", - "Lucas", - "Lucky", - "Ludicrous", - "Lulu", - "Lunch", - "Lunk", - "Lurk", - "Lurking", - "MANGER", - "MART", - "MAST", - "MASTERPIECE", - "MEGA", - "MENACING", - "MERICA", - "MMMMM", - "MODERNS", - "MOIST", - "MONEY", - "MONICA", - "MSPaint", - "MUSTACHE", - "Machine", - "Mackey", - "Macron", - "Mafia", - "Magic", - "Magikarp", - "Mahatma", - "MainMenu", - "Malice", - "Manes", - "Mangle", - "Mania", - "Manny", - "Marco", - "Mari", - "Marius", - "Martin", - "Massage", - "Massey", - "Master", - "Matty", - "Maxi", - "Maya", - "Maytag", - "Memelord", - "Menacing", - "Meow", - "Mercenary", - "Mettaton", - "Mhmm", - "Mick", - "Midair", - "Midna", - "Milk", - "Milkman", - "Millie", - "Mindy", - "Minecraft", - "Minigames", - "Mining", - "Minion", - "Mirabelle", - "Miriam", - "Missile", - "Mitchell", - "Miura", - "Mmmm", - "Moddb", - "Moin", - "Momma", - "Moneybags", - "Mongrels", - "Monkey", - "Monolith", - "Montezuma", - "Moomin", - "Moon", - "Mopping", - "Morreu", - "Mouton", - "Muffin", - "Mustachio", - "Myers", - "NADINE", - "NANA", - "NEAT", - "NERD", - "NICE", - "NICK", - "NICK", - "NITS", - "NOOK", - "NOOOO", - "NOVA", - "NUTS", - "Narwhal", - "Nathaniel", - "Nati", - "Nebby", - "Nein", - "Nemesis", - "Nerdy", - "Nice!", - "Nimbus", - "Nita", - "Nixon", - "Noel", - "Nolan", - "Nono", - "Noodle", - "Nooo", - "Noot", - "Norway", - "Nugget", - "Numb", - "Nuuu", - "OBJECTION", - "OBJECTION", - "OHNO", - "OKAY", - "OMG!", - "OMGG", - "OMGGG", - "OPieOP", - "OUCH", - "OVERTIME", - "OVERWATCH", - "Objection", - "Odin", - "Ohok", - "Okay", - "Okie", - "Oldies", - "Ollie", - "Omniscient", - "OneShot", - "Oooh", - "Ooooohhh", - "Oops", - "Orange", - "Overlord", - "PACE", - "PAINTBALL", - "PANDA", - "PARDON", - "PAUSE", - "PEACE", - "PELICANS", - "PENETRATING", - "PENETRATION", - "PEPPY", - "PERFECT", - "PERFECT", - "PHALANX", - "PINHEAD", - "PINKIE", - "PLANTED", - "PLAYS", - "PLAYSTATION", - "PLEASE", - "PLEASE", - "POISON", - "PONCHO", - "PROPHET", - "PUKE", - "PURE", - "Pachimari", - "Paladins", - "Panther", - "Panzer", - "Parappa", - "Parker", - "Pastor", - "Patches", - "Pathetic", - "Patty", - "Peacemaker", - "Peach", - "Peachy", - "Pedro", - "Peeps", - "Penguin", - "Penn", - "Pent", - "Pera", - "Perez", - "Pfft", - "Phenylalanine", - "Phil", - "Phyllis", - "Picnic", - "Pigeon", - "Piggy", - "Pikachu", - "Pinch", - "Pineapple", - "Pinker", - "Pinkie", - "Pinking", - "Pinto", - "Piper", - "Plating", - "Pleure", - "Plop", - "Plotting", - "Plugged", - "Point", - "PokeBall", - "Pokeball", - "Poked", - "Police", - "Pomeranian", - "Pooch", - "Poodles", - "Poopy", - "Poppa", - "Poppins", - "Port", - "Possessor", - "Potassium", - "Potato", - "Potsdam", - "Poyo", - "Practice", - "Praetor", - "Praise", - "Prayer", - "Prince", - "Profi", - "Pudding", - "Puffball", - "Punchy", - "Puppy", - "Pursed", - "QUAD", - "Quack", - "Question", - "Quickie", - "RAGE", - "RAGE", - "REALLY", - "REGRET", - "REKTangle", - "REMIX", - "RENAULT", - "RENT", - "RESET", - "RICHARD", - "RIDER", - "RIGGED", - "RIGHT", - "RIPPER", - "RITA", - "RNGesus", - "ROMA", - "ROOSTER", - "RUDY", - "RUNAWAY", - "Rabbits", - "Rage", - "Rages", - "Rainbow", - "Rainmaker", - "Ranged", - "Rash", - "Ravage", - "Raven", - "Rebirth", - "Reblochon", - "Reface", - "Reggie", - "Rein", - "Rejected", - "Rengar", - "Reported", - "Reporting", - "Resetti", - "Reuben", - "Ribombee", - "Ricky", - "Riddles", - "Rifleman", - "Rigged", - "Ringside", - "Riolu", - "Ripper", - "Ripperoni", - "Roasted", - "Rocky", - "Roderick", - "Roscoe", - "Roshan", - "Rosy", - "Roxanne", - "Rubicon", - "Rucksack", - "Ruckus", - "Runescape", - "Rusted", - "Rusty", - "SALAMI", - "SARDINES", - "SAWYER", - "SEGA", - "SEXY", - "SHENANIGANS", - "SHINE", - "SHOCKED", - "SHOOT", - "SHOTS", - "SHOVEL", - "SHUCKS", - "SLAM", - "SLAPPED", - "SLAT", - "SLEEPY", - "SLOW", - "SMASH", - "SMASHING", - "SMILE", - "SMILEY", - "SMITHY", - "SMOL", - "SMUG", - "SNACKS", - "SNAIL", - "SONIC", - "SPENCER", - "SPHERICAL", - "SPIKED", - "SPLAT", - "SPLIT", - "SPONGEBOB", - "SPOOK", - "SPOONED", - "SQUAD", - "SQUIRREL", - "SQUIRT", - "SQUISH", - "SQUISHY", - "SRS!", - "STEAK", - "STEAK", - "STEVE", - "STOP", - "SWAG", - "Saber", - "Safari", - "Sally", - "Salty", - "Sammich", - "Samus", - "Sandbag", - "Sans", - "Sartre", - "Schaf", - "Schizoid", - "Schopenhauer", - "Scorpio", - "Scout", - "Screw", - "Scrub", - "Scuffed", - "Scum", - "Sectoid", - "Sense", - "Serena", - "Serious", - "Seriously", - "Serperior", - "Servine", - "Shadow", - "Shaman", - "Shambled", - "Sharpshooter", - "Shat", - "Shawn", - "Shaymin", - "Shearing", - "Shelly", - "Sherlock", - "Shield", - "Shiny", - "Shirase", - "Shitpost", - "Shoryuken", - "Shuffled", - "Shulk", - "Sigh", - "Sizzle", - "Skippy", - "Skitters", - "Skylarked", - "Slapstick", - "Slayer", - "Slicker", - "Slime", - "Slowbro", - "Slowpoke", - "Slums", - "Smashed", - "Smashing", - "Smithing", - "Smokey", - "Smooch", - "Smooches", - "Snake", - "Snapdragon", - "Snapshot", - "Snek", - "Sniped", - "Sniper", - "Snivy", - "Snore", - "Snorlax", - "Snowman", - "Sonya", - "Soraka", - "Sourpuss", - "Soviet", - "Spaghetti", - "Sparta", - "Speared", - "Specialist", - "Spider", - "Spikes", - "Spitz", - "Spla2n", - "Splattered", - "Spongebob", - "Spooky", - "Springfield", - "Spud", - "Spume", - "Squad", - "Squall", - "Squint", - "Stalin", - "Stanchion", - "Stanza", - "Starboard", - "Starr", - "Stellar", - "Steve", - "Strength", - "Stuffs", - "Stygian", - "Success", - "Succubus", - "Summoning", - "Sunshine", - "Survivor", - "Swag", - "Swanky", - "Sweating", - "Sword", - "Swordplay", - "Sylveon", - "TANGO", - "TARA", - "TECHNOLOGY", - "THANKS", - "THIEF", - "THIRST", - "THREE", - "THUD", - "TITS", - "TOASTY", - "TOMFOOLERY", - "TOOTHY", - "TOOTS", - "TORPEDO", - "TOUCHDOWN", - "TRAILERS", - "TRASH", - "TRIGGERED", - "TROLL", - "TRUTH", - "TUNA", - "TURTLE", - "Taiga", - "Takeoff", - "Tambourine", - "Tanner", - "Targets", - "Taro", - "Tater", - "Teatime", - "Technical", - "Teddy", - "Terminated", - "Thanking", - "Thieving", - "Thinking", - "Thirsty", - "Thor", - "Thoughts", - "Thump", - "Tiara", - "Tillie", - "Tilted", - "Tingly", - "Tipsy", - "Toad", - "Toasty", - "Toby", - "Toejam", - "Toils", - "Token", - "Tone", - "Tong", - "Tonne", - "Topkek", - "Torpedo", - "Toss", - "Touchdown", - "Tower", - "Tr4sh", - "Tracy", - "Trap", - "Trash", - "Tree", - "Trekt", - "Tricky", - "Troll", - "Trooper", - "Truelove", - "Trumped", - "Turkey", - "Twink", - "Twinning", - "Twitch", - "Tyrael", - "Tyro", - "UNRELENTING", - "Uhhh", - "Uhhhhh", - "Ulgrim", - "Unacceptable", - "Unbearable", - "Underling", - "Unquenchable", - "Unrivaled", - "Unstoppable", - "Untitled", - "Unwise", - "Uranus", - "VANQUISH", - "VICTORY", - "VIEWS", - "VOLVO", - "Vayne", - "Versus", - "Viking", - "Villager", - "Volcano", - "Voli", - "Volt", - "Voltage", - "WAIT", - "WAOW", - "WARPING", - "WARTIME", - "WELCOME", - "WHACK", - "WHAT!", - "WHOOPS", - "WIGWAM", - "WINNER", - "WONDERFUL", - "WOODS", - "Wacko", - "Waddles", - "Waive", - "Walled", - "Wanker", - "Warning", - "Warwick", - "Wassup", - "Watching", - "Wayne", - "Wdym", - "Weenie", - "Welcome", - "Wendy", - "Whaaa", - "Whaaaat", - "Whalecum", - "Whammy", - "Whelps", - "Whew", - "Whoa!", - "Whoosh", - "Wicket", - "Widespread", - "Wildcat", - "Willy", - "Winder", - "Wining", - "Winston", - "Wolf", - "Woodcutting", - "Woodman", - "Woodpecker", - "Woooh", - "Word", - "Wurst", - "YAHOO", - "YEAH", - "YES!", - "YIPPEE", - "YOUTUBE", - "YUMMY", - "Yalta", - "Yawn", - "Yay!", - "Yikes", - "Yolo", - "Yosh", - "You!", - "YouTube", - "Yup!", - "ZERO", - "ZOMBIE", - "Zangief", - "Zappa", - "Zappy", - "Zerker", - "Zero", - "Ziggs", - "Zilean", - "Zinger", - "Zippy", - "Zombie", - "Zorua", - "Zyra", - "babb", - "bonbon", - "broken", - "chemo", - "conan", - "constructor", - "dale", - "dank", - "dodo", - "double", - "eHHH", - "elgato", - "emote", - "facepalm", - "ghillie", - "hasOwnProperty", - "heartless", - "inverse", - "lamer", - "lenny", - "limburger", - "linger", - "meditation", - "morph", - "nuke", - "objection", - "osu!", - "pebbles", - "penta", - "quadra", - "rekt", - "sinner", - "snap", - "triple", - "unnamed", - "userID", - "vogel", - "xDDDD", - "yukon" - ] -} \ No newline at end of file diff --git a/data/emotes/blacklist.json b/data/emotes/blacklist.json new file mode 100644 index 00000000..0493a27f --- /dev/null +++ b/data/emotes/blacklist.json @@ -0,0 +1,1369 @@ +[ + "8Bit", + "AAAAAH", + "AESTHETIC", + "AHEM", + "AK47", + "ALAN", + "ALEC", + "ALERT", + "ALIENS", + "ARMY", + "ASCENSION", + "ATOMIC", + "AVERAGE", + "AWAKENED", + "Abaddon", + "Abnegation", + "Abra", + "Aces", + "Advice", + "Affe", + "Afire", + "Aftertaste", + "Agility", + "Ahaha", + "Ahead", + "Aids", + "Ak47", + "Akame", + "Akeno", + "Akuma", + "Alamo", + "Aldo", + "Alexis", + "Alien", + "Alienated", + "Alkaline", + "Amazed", + "Amazing!", + "Amicable", + "Amine", + "Anarchy", + "Anders", + "Anonymous", + "Antichrist", + "Aped", + "Apollo", + "Arduous", + "Ares", + "Aries", + "Arma3", + "Armos", + "Arnold", + "Ashley", + "Asteroid", + "Astor", + "Attack", + "Attempt", + "Avon", + "Awww", + "Ayaya", + "Ayes", + "AyyLmao", + "Azimuth", + "B1nzy", + "BABE", + "BADGE", + "BALLET", + "BANGER", + "BANISH", + "BANNED", + "BANZAI", + "BAPTIZED", + "BEARS", + "BEER", + "BERSERK", + "BINGO", + "BLESS", + "BLESSED", + "BLURB", + "BOMB", + "BOMB", + "BONK", + "BONUS", + "BOOBS", + "BOOM", + "BOOTY", + "BORK", + "BOTCH", + "BREAKFAST", + "BRUCE", + "BUBBLE", + "BUFFER", + "BULLY", + "BURN", + "BURT", + "BUSTER", + "Baby", + "BabyRoll", + "Bagels", + "Baguette", + "Balance", + "Ballin", + "Bamboozle", + "Bamboozled", + "Banana", + "Bandits", + "Bane", + "Banger", + "Banter", + "Barb", + "Barf", + "Barracks", + "Bear", + "Beard", + "Beardless", + "Beer", + "Behemoth", + "Behind", + "Bella", + "Benito", + "Benny", + "Benson", + "Bepis", + "Berber", + "Berge", + "Bern", + "Berserk", + "Besen", + "BetterDiscord", + "Bighorn", + "Bijou", + "Bilbo", + "Bile", + "Bilingual", + "Billy", + "Binary", + "Birb", + "Birb", + "Birdie", + "Bjorn", + "Blanking", + "Blazed", + "Bleaching", + "Bleeder", + "Blip", + "Blubber", + "Blurred", + "Boeuf", + "Bolts", + "Bomb", + "Bombastic", + "Bombshell", + "Boned", + "Boner", + "Bonfire", + "Bonito", + "Bonnie", + "Booby", + "Boosted", + "Bork", + "Boss", + "Bourbon", + "Brille", + "Brimstone", + "Brittany", + "Brofist", + "Bruh", + "Bryce", + "Bubbles", + "Bubs", + "Bumpy", + "Bunny", + "Burg", + "Burial", + "Busted", + "Bustin", + "Butterfly", + "Butterfly", + "CAKE", + "CASH", + "CAUTION", + "CHAOS", + "CHOCOLATE", + "CLAM", + "CLASSIC", + "CLENCH", + "CLIP", + "COAST", + "COFFIN", + "COGS", + "CONFUSION", + "CONSUME", + "COSMOS", + "COVENANT", + "CRETIN", + "CROSSED", + "CSS3", + "CURSE", + "Cactus", + "Cadence", + "Canard", + "Candlelight", + "Cannon", + "Cara", + "Card", + "Caret", + "Carina", + "Carlton", + "Cart", + "Castle", + "Caveman", + "Chains", + "Challenge", + "Champ", + "Charged", + "Charizard", + "Charlie", + "Charlotte", + "Cheeky", + "Cheese", + "Chelsea", + "Chester", + "Chet", + "Chew", + "Chickpea", + "Chinking", + "Chocobo", + "Chocolate", + "Choke", + "Chris", + "Chrysalis", + "Chuckles", + "Cinder", + "Cinnamon", + "Claire", + "Clank", + "Clarisse", + "Cleft", + "Clinton", + "Clive", + "Coagulant", + "Coaxial", + "Coco", + "Coffee", + "Coldsteel", + "Colonel", + "Commenter", + "Conga", + "Conniptions", + "Constipation", + "Constitution", + "Construction", + "Content", + "Convicted", + "Conway", + "Cookie", + "Cooking", + "Coolest", + "Coop", + "Cooper", + "Corny", + "Costanza", + "Covered", + "Crabby", + "Crafting", + "Credo", + "Creeper", + "Crock", + "Crossover", + "Crown", + "Cruising", + "Crumbs", + "Crusaders", + "Cube", + "Cucumber", + "Cupcake", + "Cupid", + "Cuppa", + "Custard", + "DAMAGE", + "DAVE", + "DEAD", + "DEATH", + "DEEM", + "DEER", + "DELETE", + "DELETED", + "DELUXE", + "DENIAL", + "DENIED", + "DESTROYED", + "DESU", + "DETECTED", + "DETERMINATION", + "DEVIL", + "DICKS", + "DODGE", + "DODO", + "DOGS", + "DRINK", + "DUCKS", + "DUDE", + "DUNKED", + "DUST", + "DWAYNE", + "Dale", + "Dallas", + "Damnit", + "Damnit", + "Dance", + "Dante", + "Darnell", + "Dashing", + "Dauntless", + "Davy", + "Dayum", + "Deadass", + "Deadass", + "Dearest", + "Dedede", + "Dehumidify", + "Demon", + "Denis", + "Dentures", + "Derp", + "Derp", + "Deud", + "Dickered", + "Digestive", + "Ding", + "Dingle", + "Dirk", + "Disgusted", + "Ditto", + "Divination", + "Dodo", + "Doge", + "Dogging", + "Donnie", + "Dons", + "Donuts", + "Dood", + "Dropsy", + "Drunken", + "Duane", + "Dunked", + "Dunno", + "Dyson", + "EDGE", + "EMOTE", + "ENERGY", + "ESCAPE", + "EXACTLY", + "EXCELLENT", + "EXPLOSION", + "EXTERMINATE", + "Earl", + "Eduardo", + "Egging", + "Eggman", + "Eggplant", + "Electrode", + "Elementals", + "Envision", + "Ernie", + "Errol", + "Ethereal", + "Eugh", + "Everyone!", + "Evil", + "Excalibur", + "Exclaim", + "Exclamation", + "Exclusive", + "Exited", + "Exploded", + "Exposed", + "Eyes", + "Eyyy", + "Eyyyyyy", + "Ezreal", + "FAIL", + "FAIL", + "FAILURE", + "FAKER", + "FANCY", + "FAST", + "FEESH", + "FERVOR", + "FEVER", + "FFXV", + "FIREBALL", + "FIVE", + "FOCUS", + "FORESHADOWING", + "FORKED", + "FOUR", + "FOXHOUND", + "FRIG", + "FRISK", + "FUMBLES", + "Face", + "Faded", + "Fail", + "Faithless", + "Farming", + "Faro", + "Fatality", + "Faust", + "Faye", + "Fennec", + "Feuer", + "Fidget", + "Fighting", + "Fire", + "Firefly", + "First", + "Fishing", + "Fishy", + "Fist", + "Fluffy", + "Follow", + "Forman", + "Foxhound", + "Franck", + "Frankie", + "Freddie", + "Freddy", + "Fritz", + "Frog", + "GAME!", + "GAMING", + "GANG", + "GERARD", + "GET!", + "GIBE", + "GLITCH", + "GOBBLE", + "GRIN", + "GROWL", + "GUILE", + "Gaben", + "Gabriel", + "Gambler", + "Gamest", + "Gandalf", + "Garble", + "Gary", + "Gaseous", + "Gasp", + "Gauche", + "Gazorpazorpfield", + "Generated", + "Gengar", + "Genius", + "George!", + "Gerald", + "Gerard", + "Ghastly", + "Ghost", + "Gilbert", + "Gilliam", + "Gilligan", + "Gimpy", + "Glenn", + "Glob", + "Gloom", + "Gloomy", + "Glottis", + "Gnome", + "Goat", + "Godhead", + "Godspeed", + "Gold", + "Goldberg", + "Goldblum", + "Golden", + "Gondola", + "Goofballs", + "Gosu", + "Gramps", + "Greened", + "Greener", + "Gregg", + "Greninja", + "Grimace", + "Grunge", + "Guacamole", + "Guardianship", + "Guff", + "Guile", + "Guinness", + "Gunny", + "Gunter", + "Gunther", + "Gustav", + "H3H3", + "HAAA", + "HAHAHA", + "HALLO", + "HANK", + "HEART", + "HEEHAW", + "HELGA", + "HELLO", + "HELLO!", + "HELP", + "HELP", + "HEY!", + "HOFF", + "HOLLOW", + "HONK", + "HORNLESS", + "HUGO", + "HUNK", + "HUZZAH", + "HYPE", + "HYPE", + "Hacked", + "Hai!", + "Halp", + "Halp", + "Handsome", + "Hannibal", + "Hanzo", + "Happy", + "Harambe", + "Hartz", + "Haste", + "Headliner", + "Heart", + "Heartless", + "Heated", + "Heave", + "Heels", + "Hello", + "Heresy", + "Herz", + "Hey!", + "Heya!", + "Heyo", + "Hiccup", + "Hiccups", + "Hideout", + "Hiho", + "Hillary", + "Hina", + "Hobbes", + "Homeboy", + "Honda", + "Horace", + "Horde", + "Huck", + "Huehue", + "Huffs", + "Hullo", + "Humm", + "Hunter", + "Husk", + "Hydro", + "Hype", + "Hypnosis", + "INFIDEL", + "INHALE", + "INIT", + "INSANE", + "Ibiza", + "Ibuki", + "Icebox", + "Iceman", + "Ichigo", + "Illusionist", + "Imperil", + "Implications", + "Impulse", + "Impulsion", + "Inconceivable", + "Infiltrated", + "Inkling", + "Integrity", + "Interrogation", + "Iota", + "Isaac", + "Isadora", + "Isis", + "JAPANNED", + "JESSE", + "JOBLESS", + "JUMP", + "JUNES", + "JUST", + "JUSTICE", + "Jabba", + "Jace", + "Jaffa", + "Jago", + "James", + "Jazz", + "Jeanne", + "Jeremiah", + "Jerry", + "Jill", + "John", + "Johnny", + "Joint", + "Josef", + "Josuke", + "Juliana", + "Julius", + "KAPPA", + "KAPPA", + "KARL", + "KISS", + "KOBE", + "Kaede", + "Kali", + "Kaput", + "Karma", + "Katze", + "Keith", + "Kenny", + "Kevin", + "Kian", + "Kierkegaard", + "Kill", + "Kipper", + "Kirby", + "Kisses", + "Kitsune", + "Kitsunemimi", + "Kitty", + "Kkkkk", + "Knotty", + "Koba", + "Kola", + "Kona", + "Koopa", + "Krill", + "LEFT", + "LEGENDARY", + "LEVELED", + "LEWD", + "LEXINGTON", + "LIES", + "LINDA", + "LINK", + "LOADS", + "LOCO", + "LOGO", + "LOOT", + "LOST", + "LOUD", + "LOVE", + "LULUL", + "LURK", + "Lamb", + "Lank", + "Lanky", + "Lantern", + "Lapin", + "Lapras", + "Lars", + "Launch", + "Leffen", + "Lemons", + "Lemony", + "Lenny", + "Leon", + "Leonardo", + "Lester", + "LetsPlay", + "Lewd", + "Licky", + "Limpa", + "Link", + "Lion", + "Liquid", + "Lockjaw", + "Loge", + "Logo", + "Lonk", + "Loool", + "Loots", + "Lorraine", + "Lose", + "Lotus", + "Loudness", + "Louie", + "Love", + "Lucarionite", + "Lucas", + "Lucky", + "Ludicrous", + "Lulu", + "Lunch", + "Lunk", + "Lurk", + "Lurking", + "MANGER", + "MART", + "MAST", + "MASTERPIECE", + "MEGA", + "MENACING", + "MERICA", + "MMMMM", + "MODERNS", + "MOIST", + "MONEY", + "MONICA", + "MSPaint", + "MUSTACHE", + "Machine", + "Mackey", + "Macron", + "Mafia", + "Magic", + "Magikarp", + "Mahatma", + "MainMenu", + "Malice", + "Manes", + "Mangle", + "Mania", + "Manny", + "Marco", + "Mari", + "Marius", + "Martin", + "Massage", + "Massey", + "Master", + "Matty", + "Maxi", + "Maya", + "Maytag", + "Memelord", + "Menacing", + "Meow", + "Mercenary", + "Mettaton", + "Mhmm", + "Mick", + "Midair", + "Midna", + "Milk", + "Milkman", + "Millie", + "Mindy", + "Minecraft", + "Minigames", + "Mining", + "Minion", + "Mirabelle", + "Miriam", + "Missile", + "Mitchell", + "Miura", + "Mmmm", + "Moddb", + "Moin", + "Momma", + "Moneybags", + "Mongrels", + "Monkey", + "Monolith", + "Montezuma", + "Moomin", + "Moon", + "Mopping", + "Morreu", + "Mouton", + "Muffin", + "Mustachio", + "Myers", + "NADINE", + "NANA", + "NEAT", + "NERD", + "NICE", + "NICK", + "NICK", + "NITS", + "NOOK", + "NOOOO", + "NOVA", + "NUTS", + "Narwhal", + "Nathaniel", + "Nati", + "Nebby", + "Nein", + "Nemesis", + "Nerdy", + "Nice!", + "Nimbus", + "Nita", + "Nixon", + "Noel", + "Nolan", + "Nono", + "Noodle", + "Nooo", + "Noot", + "Norway", + "Nugget", + "Numb", + "Nuuu", + "OBJECTION", + "OBJECTION", + "OHNO", + "OKAY", + "OMG!", + "OMGG", + "OMGGG", + "OPieOP", + "OUCH", + "OVERTIME", + "OVERWATCH", + "Objection", + "Odin", + "Ohok", + "Okay", + "Okie", + "Oldies", + "Ollie", +"Omniscient", + "OneShot", + "Oooh", + "Ooooohhh", + "Oops", + "Orange", + "Overlord", + "PACE", + "PAINTBALL", + "PANDA", + "PARDON", + "PAUSE", + "PEACE", + "PELICANS", + "PENETRATING", + "PENETRATION", + "PEPPY", + "PERFECT", + "PERFECT", + "PHALANX", + "PINHEAD", + "PINKIE", + "PLANTED", + "PLAYS", + "PLAYSTATION", + "PLEASE", + "PLEASE", + "POISON", + "PONCHO", + "PROPHET", + "PUKE", + "PURE", + "Pachimari", + "Paladins", + "Panther", + "Panzer", + "Parappa", + "Parker", + "Pastor", + "Patches", + "Pathetic", + "Patty", + "Peacemaker", + "Peach", + "Peachy", + "Pedro", + "Peeps", + "Penguin", + "Penn", + "Pent", + "Pera", + "Perez", + "Pfft", + "Phenylalanine", + "Phil", + "Phyllis", + "Picnic", + "Pigeon", + "Piggy", + "Pikachu", + "Pinch", + "Pineapple", + "Pinker", + "Pinkie", + "Pinking", + "Pinto", + "Piper", + "Plating", + "Pleure", + "Plop", + "Plotting", + "Plugged", + "Point", + "PokeBall", + "Pokeball", + "Poked", + "Police", + "Pomeranian", + "Pooch", + "Poodles", + "Poopy", + "Poppa", + "Poppins", + "Port", + "Possessor", + "Potassium", + "Potato", + "Potsdam", + "Poyo", + "Practice", + "Praetor", + "Praise", + "Prayer", + "Prince", + "Profi", + "Pudding", + "Puffball", + "Punchy", + "Puppy", + "Pursed", + "QUAD", + "Quack", + "Question", + "Quickie", + "RAGE", + "RAGE", + "REALLY", + "REGRET", + "REKTangle", + "REMIX", + "RENAULT", + "RENT", + "RESET", + "RICHARD", + "RIDER", + "RIGGED", + "RIGHT", + "RIPPER", + "RITA", + "RNGesus", + "ROMA", + "ROOSTER", + "RUDY", + "RUNAWAY", + "Rabbits", + "Rage", + "Rages", + "Rainbow", + "Rainmaker", + "Ranged", + "Rash", + "Ravage", + "Raven", + "Rebirth", + "Reblochon", + "Reface", + "Reggie", + "Rein", + "Rejected", + "Rengar", + "Reported", + "Reporting", + "Resetti", + "Reuben", + "Ribombee", + "Ricky", + "Riddles", + "Rifleman", + "Rigged", + "Ringside", + "Riolu", + "Ripper", + "Ripperoni", + "Roasted", + "Rocky", + "Roderick", + "Roscoe", + "Roshan", + "Rosy", + "Roxanne", + "Rubicon", + "Rucksack", + "Ruckus", + "Runescape", + "Rusted", + "Rusty", + "SALAMI", + "SARDINES", + "SAWYER", + "SEGA", + "SEXY", + "SHENANIGANS", + "SHINE", + "SHOCKED", + "SHOOT", + "SHOTS", + "SHOVEL", + "SHUCKS", + "SLAM", + "SLAPPED", + "SLAT", + "SLEEPY", + "SLOW", + "SMASH", + "SMASHING", + "SMILE", + "SMILEY", + "SMITHY", + "SMOL", + "SMUG", + "SNACKS", + "SNAIL", + "SONIC", + "SPENCER", + "SPHERICAL", + "SPIKED", + "SPLAT", + "SPLIT", + "SPONGEBOB", + "SPOOK", + "SPOONED", + "SQUAD", + "SQUIRREL", + "SQUIRT", + "SQUISH", + "SQUISHY", + "SRS!", + "STEAK", + "STEAK", + "STEVE", + "STOP", + "SWAG", + "Saber", + "Safari", + "Sally", + "Salty", + "Sammich", + "Samus", + "Sandbag", + "Sans", + "Sartre", + "Schaf", + "Schizoid", + "Schopenhauer", + "Scorpio", + "Scout", + "Screw", + "Scrub", + "Scuffed", + "Scum", + "Sectoid", + "Sense", + "Serena", + "Serious", + "Seriously", + "Serperior", + "Servine", + "Shadow", + "Shaman", + "Shambled", + "Sharpshooter", + "Shat", + "Shawn", + "Shaymin", + "Shearing", + "Shelly", + "Sherlock", + "Shield", + "Shiny", + "Shirase", + "Shitpost", + "Shoryuken", + "Shuffled", + "Shulk", + "Sigh", + "Sizzle", + "Skippy", + "Skitters", + "Skylarked", + "Slapstick", + "Slayer", + "Slicker", + "Slime", + "Slowbro", + "Slowpoke", + "Slums", + "Smashed", + "Smashing", + "Smithing", + "Smokey", + "Smooch", + "Smooches", + "Snake", + "Snapdragon", + "Snapshot", + "Snek", + "Sniped", + "Sniper", + "Snivy", + "Snore", + "Snorlax", + "Snowman", + "Sonya", + "Soraka", + "Sourpuss", + "Soviet", + "Spaghetti", + "Sparta", + "Speared", + "Specialist", + "Spider", + "Spikes", + "Spitz", + "Spla2n", + "Splattered", + "Spongebob", + "Spooky", + "Springfield", + "Spud", + "Spume", + "Squad", + "Squall", + "Squint", + "Stalin", + "Stanchion", + "Stanza", + "Starboard", + "Starr", + "Stellar", + "Steve", + "Strength", + "Stuffs", + "Stygian", + "Success", + "Succubus", + "Summoning", + "Sunshine", + "Survivor", + "Swag", + "Swanky", + "Sweating", + "Sword", + "Swordplay", + "Sylveon", + "TANGO", + "TARA", + "TECHNOLOGY", + "THANKS", + "THIEF", + "THIRST", + "THREE", + "THUD", + "TITS", + "TOASTY", + "TOMFOOLERY", + "TOOTHY", + "TOOTS", + "TORPEDO", + "TOUCHDOWN", + "TRAILERS", + "TRASH", + "TRIGGERED", + "TROLL", + "TRUTH", + "TUNA", + "TURTLE", + "Taiga", + "Takeoff", + "Tambourine", + "Tanner", + "Targets", + "Taro", + "Tater", + "Teatime", + "Technical", + "Teddy", + "Terminated", + "Thanking", + "Thieving", + "Thinking", + "Thirsty", + "Thor", + "Thoughts", + "Thump", + "Tiara", + "Tillie", + "Tilted", + "Tingly", + "Tipsy", + "Toad", + "Toasty", + "Toby", + "Toejam", + "Toils", + "Token", + "Tone", + "Tong", + "Tonne", + "Topkek", + "Torpedo", + "Toss", + "Touchdown", + "Tower", + "Tr4sh", + "Tracy", + "Trap", + "Trash", + "Tree", + "Trekt", + "Tricky", + "Troll", + "Trooper", + "Truelove", + "Trumped", + "Turkey", + "Twink", + "Twinning", + "Twitch", + "Tyrael", + "Tyro", + "UNRELENTING", + "Uhhh", + "Uhhhhh", + "Ulgrim", + "Unacceptable", + "Unbearable", + "Underling", + "Unquenchable", + "Unrivaled", + "Unstoppable", + "Untitled", + "Unwise", + "Uranus", + "VANQUISH", + "VICTORY", + "VIEWS", + "VOLVO", + "Vayne", + "Versus", + "Viking", + "Villager", + "Volcano", + "Voli", + "Volt", + "Voltage", + "WAIT", + "WAOW", + "WARPING", + "WARTIME", + "WELCOME", + "WHACK", + "WHAT!", + "WHOOPS", + "WIGWAM", + "WINNER", + "WONDERFUL", + "WOODS", + "Wacko", + "Waddles", + "Waive", + "Walled", + "Wanker", + "Warning", + "Warwick", + "Wassup", + "Watching", + "Wayne", + "Wdym", + "Weenie", + "Welcome", + "Wendy", + "Whaaa", + "Whaaaat", + "Whalecum", + "Whammy", + "Whelps", + "Whew", + "Whoa!", + "Whoosh", + "Wicket", + "Widespread", + "Wildcat", + "Willy", + "Winder", + "Wining", + "Winston", + "Wolf", + "Woodcutting", + "Woodman", + "Woodpecker", + "Woooh", + "Word", + "Wurst", + "YAHOO", + "YEAH", + "YES!", + "YIPPEE", + "YOUTUBE", + "YUMMY", + "Yalta", + "Yawn", + "Yay!", + "Yikes", + "Yolo", + "Yosh", + "You!", + "YouTube", + "Yup!", + "ZERO", + "ZOMBIE", + "Zangief", + "Zappa", + "Zappy", + "Zerker", + "Zero", + "Ziggs", + "Zilean", + "Zinger", + "Zippy", + "Zombie", + "Zorua", + "Zyra", + "babb", + "bonbon", + "broken", + "chemo", + "conan", + "constructor", + "dale", + "dank", + "dodo", + "double", + "eHHH", + "elgato", + "emote", + "facepalm", + "ghillie", + "hasOwnProperty", + "heartless", + "inverse", + "lamer", + "lenny", + "limburger", + "linger", + "meditation", + "morph", + "nuke", + "objection", + "osu!", + "pebbles", + "penta", + "quadra", + "rekt", + "sinner", + "snap", + "triple", + "unnamed", + "userID", + "vogel", + "xDDDD", + "yukon" +] \ No newline at end of file diff --git a/data/emotes/bttv.json b/data/emotes/bttv.json new file mode 100644 index 00000000..6d46a1df --- /dev/null +++ b/data/emotes/bttv.json @@ -0,0 +1 @@ +{"OhMyGoodness":"//cdn.betterttv.net/emote/54fa925e01e468494b85b54d/1x","PancakeMix":"//cdn.betterttv.net/emote/54fa927801e468494b85b54e/1x","PedoBear":"//cdn.betterttv.net/emote/54fa928f01e468494b85b54f/1x","PokerFace":"//cdn.betterttv.net/emote/54fa92a701e468494b85b550/1x","RageFace":"//cdn.betterttv.net/emote/54fa92d701e468494b85b552/1x","RebeccaBlack":"//cdn.betterttv.net/emote/54fa92ee01e468494b85b553/1x",":tf:":"//cdn.betterttv.net/emote/54fa8f1401e468494b85b537/1x","aPliS":"//cdn.betterttv.net/emote/54fa8f4201e468494b85b538/1x","CiGrip":"//cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/1x","CHAccepted":"//cdn.betterttv.net/emote/54fa8fb201e468494b85b53b/1x","FuckYea":"//cdn.betterttv.net/emote/54fa90d601e468494b85b544/1x","DatSauce":"//cdn.betterttv.net/emote/54fa903b01e468494b85b53f/1x","ForeverAlone":"//cdn.betterttv.net/emote/54fa909b01e468494b85b542/1x","GabeN":"//cdn.betterttv.net/emote/54fa90ba01e468494b85b543/1x","HailHelix":"//cdn.betterttv.net/emote/54fa90f201e468494b85b545/1x","HerbPerve":"//cdn.betterttv.net/emote/54fa913701e468494b85b546/1x","iDog":"//cdn.betterttv.net/emote/54fa919901e468494b85b548/1x","rStrike":"//cdn.betterttv.net/emote/54fa930801e468494b85b554/1x","ShoopDaWhoop":"//cdn.betterttv.net/emote/54fa932201e468494b85b555/1x","SwedSwag":"//cdn.betterttv.net/emote/54fa9cc901e468494b85b565/1x","M&Mjc":"//cdn.betterttv.net/emote/54fab45f633595ca4c713abc/1x","bttvNice":"//cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/1x","TopHam":"//cdn.betterttv.net/emote/54fa934001e468494b85b556/1x","TwaT":"//cdn.betterttv.net/emote/54fa935601e468494b85b557/1x","WhatAYolk":"//cdn.betterttv.net/emote/54fa93d001e468494b85b559/1x","WatChuSay":"//cdn.betterttv.net/emote/54fa99b601e468494b85b55d/1x","Blackappa":"//cdn.betterttv.net/emote/54faa50d01e468494b85b578/1x","DogeWitIt":"//cdn.betterttv.net/emote/54faa52f01e468494b85b579/1x","BadAss":"//cdn.betterttv.net/emote/54faa4f101e468494b85b577/1x","SavageJerky":"//cdn.betterttv.net/emote/54fb603201abde735115ddb5/1x","Zappa":"//cdn.betterttv.net/emote/5622aaef3286c42e57d8e4ab/1x","tehPoleCat":"//cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/1x","AngelThump":"//cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/1x","Kaged":"//cdn.betterttv.net/emote/54fbf11001abde735115de66/1x","HHydro":"//cdn.betterttv.net/emote/54fbef6601abde735115de57/1x","TaxiBro":"//cdn.betterttv.net/emote/54fbefeb01abde735115de5b/1x","BroBalt":"//cdn.betterttv.net/emote/54fbf00a01abde735115de5c/1x","ButterSauce":"//cdn.betterttv.net/emote/54fbf02f01abde735115de5d/1x","BaconEffect":"//cdn.betterttv.net/emote/54fbf05a01abde735115de5e/1x","SuchFraud":"//cdn.betterttv.net/emote/54fbf07e01abde735115de5f/1x","CandianRage":"//cdn.betterttv.net/emote/54fbf09c01abde735115de61/1x","She'llBeRight":"//cdn.betterttv.net/emote/54fbefc901abde735115de5a/1x","OhhhKee":"//cdn.betterttv.net/emote/54fbefa901abde735115de59/1x","D:":"//cdn.betterttv.net/emote/55028cd2135896936880fdd7/1x","SexPanda":"//cdn.betterttv.net/emote/5502874d135896936880fdd2/1x","(poolparty)":"//cdn.betterttv.net/emote/5502883d135896936880fdd3/1x",":'(":"//cdn.betterttv.net/emote/55028923135896936880fdd5/1x","(puke)":"//cdn.betterttv.net/emote/550288fe135896936880fdd4/1x","bttvWink":"//cdn.betterttv.net/emote/550292c0135896936880fdef/1x","bttvAngry":"//cdn.betterttv.net/emote/550291a3135896936880fde3/1x","bttvConfused":"//cdn.betterttv.net/emote/550291be135896936880fde4/1x","bttvCool":"//cdn.betterttv.net/emote/550291d4135896936880fde5/1x","bttvHappy":"//cdn.betterttv.net/emote/55029200135896936880fde7/1x","bttvSad":"//cdn.betterttv.net/emote/5502925d135896936880fdea/1x","bttvSleep":"//cdn.betterttv.net/emote/55029272135896936880fdeb/1x","bttvSurprised":"//cdn.betterttv.net/emote/55029288135896936880fdec/1x","bttvTongue":"//cdn.betterttv.net/emote/5502929b135896936880fded/1x","bttvUnsure":"//cdn.betterttv.net/emote/550292ad135896936880fdee/1x","bttvGrin":"//cdn.betterttv.net/emote/550291ea135896936880fde6/1x","bttvHeart":"//cdn.betterttv.net/emote/55029215135896936880fde8/1x","bttvTwink":"//cdn.betterttv.net/emote/55029247135896936880fde9/1x","VisLaud":"//cdn.betterttv.net/emote/550352766f86a5b26c281ba2/1x","(chompy)":"//cdn.betterttv.net/emote/550b225fff8ecee922d2a3b2/1x","SoSerious":"//cdn.betterttv.net/emote/5514afe362e6bd0027aede8a/1x","BatKappa":"//cdn.betterttv.net/emote/550b6b07ff8ecee922d2a3e7/1x","KaRappa":"//cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/1x","YetiZ":"//cdn.betterttv.net/emote/55189a5062e6bd0027aee082/1x","miniJulia":"//cdn.betterttv.net/emote/552d2fc2236a1aa17a996c5b/1x","FishMoley":"//cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/1x","Hhhehehe":"//cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/1x","KKona":"//cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/1x","OhGod":"//cdn.betterttv.net/emote/566ca07965dbbdab32ec0552/1x","PoleDoge":"//cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/1x","motnahP":"//cdn.betterttv.net/emote/55288e390fa35376704a4c7a/1x","sosGame":"//cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/1x","CruW":"//cdn.betterttv.net/emote/55471c2789d53f2d12781713/1x","RarePepe":"//cdn.betterttv.net/emote/555015b77676617e17dd2e8e/1x","iamsocal":"//cdn.betterttv.net/emote/54fbef8701abde735115de58/1x","haHAA":"//cdn.betterttv.net/emote/555981336ba1901877765555/1x","FeelsBirthdayMan":"//cdn.betterttv.net/emote/55b6524154eefd53777b2580/1x","RonSmug":"//cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/1x","KappaCool":"//cdn.betterttv.net/emote/560577560874de34757d2dc0/1x","FeelsBadMan":"//cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/1x","BasedGod":"//cdn.betterttv.net/emote/566c9eeb65dbbdab32ec052b/1x","bUrself":"//cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/1x","ConcernDoge":"//cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/1x","FapFapFap":"//cdn.betterttv.net/emote/566c9f9265dbbdab32ec0538/1x","FeelsGoodMan":"//cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/1x","FireSpeed":"//cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/1x","NaM":"//cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/1x","SourPls":"//cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/1x","LuL":"//cdn.betterttv.net/emote/567b00c61ddbe1786688a633/1x","SaltyCorn":"//cdn.betterttv.net/emote/56901914991f200c34ffa656/1x","FCreep":"//cdn.betterttv.net/emote/56d937f7216793c63ec140cb/1x","monkaS":"//cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/1x","VapeNation":"//cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/1x","ariW":"//cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/1x","notsquishY":"//cdn.betterttv.net/emote/5709ab688eff3b595e93c595/1x","FeelsAmazingMan":"//cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/1x","DuckerZ":"//cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/1x","SqShy":"//cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/1x","Wowee":"//cdn.betterttv.net/emote/58d2e73058d8950a875ad027/1x"} \ No newline at end of file diff --git a/data/emotedata_bttv.json b/data/emotes/bttv2.json similarity index 100% rename from data/emotedata_bttv.json rename to data/emotes/bttv2.json diff --git a/data/emotedata_ffz.json b/data/emotes/ffz.json similarity index 100% rename from data/emotedata_ffz.json rename to data/emotes/ffz.json diff --git a/data/emotedata_twitch_global.json b/data/emotes/twitchglobal.json similarity index 100% rename from data/emotedata_twitch_global.json rename to data/emotes/twitchglobal.json diff --git a/data/emotedata_twitch_subscriber.json b/data/emotes/twitchsubscriber.json similarity index 100% rename from data/emotedata_twitch_subscriber.json rename to data/emotes/twitchsubscriber.json diff --git a/data/locales/en.json b/data/locales/en.json index f8cbf1d0..6d832b97 100644 --- a/data/locales/en.json +++ b/data/locales/en.json @@ -168,7 +168,7 @@ "title": "{{name}} v{{version}} by {{author}}", "openFolder": "Open {{type}} Folder", "reload": "Reload", - "pluginSettings": "Settings", + "addonSettings": "Settings", "website": "Website", "source": "Source", "server": "Support Server", diff --git a/data/updater.json b/data/updater.json index 31318cc1..d1303021 100644 --- a/data/updater.json +++ b/data/updater.json @@ -1,4 +1,3 @@ { - "LatestVersion":"0.3.2", - "CDN":"cdn.rawgit.com" + "injectorVersion": "0.3.2" } \ No newline at end of file diff --git a/js/main.js b/js/main.js index 92d87909..12478f69 100644 --- a/js/main.js +++ b/js/main.js @@ -203,7 +203,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _str /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _structs_builtin__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../structs/builtin */ \"./src/structs/builtin.js\");\n/* harmony import */ var data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! data */ \"./src/data/data.js\");\n/* harmony import */ var modules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! modules */ \"./src/modules/modules.js\");\n/* harmony import */ var _ui_emote__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ui/emote */ \"./src/ui/emote.js\");\n/* harmony import */ var _ui_toasts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/toasts */ \"./src/ui/toasts.js\");\n\n\n\n\n // import EmoteMenu from \"./emotemenu\";\n\nconst Emotes = {\n TwitchGlobal: {},\n TwitchSubscriber: {},\n BTTV: {},\n FrankerFaceZ: {},\n BTTV2: {}\n};\nconst bdEmoteSettingIDs = {\n TwitchGlobal: \"twitch\",\n TwitchSubscriber: \"twitch\",\n BTTV: \"bttv\",\n FrankerFaceZ: \"ffz\",\n BTTV2: \"bttv\"\n};\nconst blacklist = [];\nconst overrides = [\"twitch\", \"bttv\", \"ffz\"];\nconst modifiers = [\"flip\", \"spin\", \"pulse\", \"spin2\", \"spin3\", \"1spin\", \"2spin\", \"3spin\", \"tr\", \"bl\", \"br\", \"shake\", \"shake2\", \"shake3\", \"flap\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (new class EmoteModule extends _structs_builtin__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n get name() {\n return \"Emotes\";\n }\n\n get collection() {\n return \"settings\";\n }\n\n get category() {\n return \"general\";\n }\n\n get id() {\n return \"emotes\";\n }\n\n get categories() {\n return Object.keys(bdEmoteSettingIDs).filter(k => this.isCategoryEnabled(bdEmoteSettingIDs[k]));\n }\n\n isCategoryEnabled(id) {\n return super.get(\"emotes\", \"categories\", id);\n }\n\n get(id) {\n return super.get(\"emotes\", \"general\", id);\n }\n\n get MessageContentComponent() {\n return modules__WEBPACK_IMPORTED_MODULE_2__[\"WebpackModules\"].getModule(m => m.defaultProps && m.defaultProps.hasOwnProperty(\"disableButtons\"));\n }\n\n get Emotes() {\n return Emotes;\n }\n\n get TwitchGlobal() {\n return Emotes.TwitchGlobal;\n }\n\n get TwitchSubscriber() {\n return Emotes.TwitchSubscriber;\n }\n\n get BTTV() {\n return Emotes.BTTV;\n }\n\n get FrankerFaceZ() {\n return Emotes.FrankerFaceZ;\n }\n\n get BTTV2() {\n return Emotes.BTTV2;\n }\n\n get blacklist() {\n return blacklist;\n }\n\n get favorites() {\n return this.favoriteEmotes;\n }\n\n getCategory(category) {\n return Emotes[category];\n }\n\n initialize() {\n super.initialize();\n this.favoriteEmotes = {};\n const fe = modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].getBDData(\"bdfavemotes\");\n if (fe !== \"\" && fe !== null) this.favoriteEmotes = JSON.parse(window.atob(fe));\n this.saveFavorites();\n this.addFavorite = this.addFavorite.bind(this);\n this.removeFavorite = this.removeFavorite.bind(this); // EmoteConfig;\n // emoteCollection.button = {title: \"Clear Emote Cache\", onClick: () => { this.clearEmoteData(); this.loadEmoteData(EmoteInfo); }};\n }\n\n async enabled() {\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].registerCollection(\"emotes\", \"Emotes\", data__WEBPACK_IMPORTED_MODULE_1__[\"EmoteConfig\"], {\n title: modules__WEBPACK_IMPORTED_MODULE_2__[\"Strings\"].Emotes.clearEmotes,\n onClick: () => {\n this.clearEmoteData();\n this.loadEmoteData(data__WEBPACK_IMPORTED_MODULE_1__[\"EmoteInfo\"]);\n }\n }); // Disable emote module for now because it's annoying and slow\n // await this.getBlacklist();\n // await this.loadEmoteData(EmoteInfo);\n // while (!this.MessageContentComponent) await new Promise(resolve => setTimeout(resolve, 100));\n // this.patchMessageContent();\n\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].on(\"emotes-favorite-added\", this.addFavorite);\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].on(\"emotes-favorite-removed\", this.removeFavorite);\n }\n\n disabled() {\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].off(\"emotes-favorite-added\", this.addFavorite);\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].off(\"emotes-favorite-removed\", this.removeFavorite);\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].removeCollection(\"emotes\");\n this.emptyEmotes();\n if (!this.cancelEmoteRender) return;\n this.cancelEmoteRender();\n delete this.cancelEmoteRender;\n }\n\n addFavorite(name, url) {\n if (!this.favoriteEmotes.hasOwnProperty(name)) this.favoriteEmotes[name] = url;\n this.saveFavorites();\n }\n\n removeFavorite(name) {\n if (!this.favoriteEmotes.hasOwnProperty(name)) return;\n delete this.favoriteEmotes[name];\n this.saveFavorites();\n }\n\n isFavorite(name) {\n return this.favoriteEmotes.hasOwnProperty(name);\n }\n\n saveFavorites() {\n modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].setBDData(\"bdfavemotes\", window.btoa(JSON.stringify(this.favoriteEmotes)));\n }\n\n emptyEmotes() {\n for (const cat in Emotes) Object.assign(Emotes, {\n [cat]: {}\n });\n }\n\n patchMessageContent() {\n if (this.cancelEmoteRender) return;\n this.cancelEmoteRender = this.after(this.MessageContentComponent.prototype, \"render\", (thisObj, args, retVal) => {\n this.after(retVal.props, \"children\", (t, a, returnValue) => {\n if (this.categories.length == 0) return;\n const markup = returnValue.props.children[1];\n if (!markup.props.children) return;\n const nodes = markup.props.children[1];\n if (!nodes || !nodes.length) return;\n\n for (let n = 0; n < nodes.length; n++) {\n const node = nodes[n];\n if (typeof node !== \"string\") continue;\n const words = node.split(/([^\\s]+)([\\s]|$)/g);\n\n for (let c = 0, clen = this.categories.length; c < clen; c++) {\n for (let w = 0, wlen = words.length; w < wlen; w++) {\n const emote = words[w];\n const emoteSplit = emote.split(\":\");\n const emoteName = emoteSplit[0];\n let emoteModifier = emoteSplit[1] ? emoteSplit[1] : \"\";\n let emoteOverride = emoteModifier.slice(0);\n if (emoteName.length < 4 || blacklist.includes(emoteName)) continue;\n if (!modifiers.includes(emoteModifier) || !modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].get(this.category, \"general\", \"modifiers\")) emoteModifier = \"\";\n if (!overrides.includes(emoteOverride)) emoteOverride = \"\";else emoteModifier = emoteOverride;\n let current = this.categories[c];\n\n if (emoteOverride === \"twitch\") {\n if (Emotes.TwitchGlobal[emoteName]) current = \"TwitchGlobal\";else if (Emotes.TwitchSubscriber[emoteName]) current = \"TwitchSubscriber\";\n } else if (emoteOverride === \"bttv\") {\n if (Emotes.BTTV[emoteName]) current = \"BTTV\";else if (Emotes.BTTV2[emoteName]) current = \"BTTV2\";\n } else if (emoteOverride === \"ffz\") {\n if (Emotes.FrankerFaceZ[emoteName]) current = \"FrankerFaceZ\";\n }\n\n if (!Emotes[current][emoteName] || !modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].get(this.category, \"categories\", bdEmoteSettingIDs[current])) continue;\n const results = nodes[n].match(new RegExp(`([\\\\s]|^)${modules__WEBPACK_IMPORTED_MODULE_2__[\"Utilities\"].escape(emoteModifier ? emoteName + \":\" + emoteModifier : emoteName)}([\\\\s]|$)`));\n if (!results) continue;\n const pre = nodes[n].substring(0, results.index + results[1].length);\n const post = nodes[n].substring(results.index + results[0].length - results[2].length);\n nodes[n] = pre;\n const emoteComponent = modules__WEBPACK_IMPORTED_MODULE_2__[\"DiscordModules\"].React.createElement(_ui_emote__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: emoteName,\n url: Emotes[current][emoteName],\n modifier: emoteModifier,\n isFavorite: this.isFavorite(emoteName)\n });\n nodes.splice(n + 1, 0, post);\n nodes.splice(n + 1, 0, emoteComponent);\n }\n }\n }\n\n const onlyEmotes = nodes.every(r => {\n if (typeof r == \"string\" && r.replace(/\\s*/, \"\") == \"\") return true;else if (r.type && r.type.name == \"BDEmote\") return true;else if (r.props && r.props.children && r.props.children.props && r.props.children.props.emojiName) return true;\n return false;\n });\n if (!onlyEmotes) return;\n\n for (const node of nodes) {\n if (typeof node != \"object\") continue;\n if (node.type.name == \"BDEmote\") node.props.jumboable = true;else if (node.props && node.props.children && node.props.children.props && node.props.children.props.emojiName) node.props.children.props.jumboable = true;\n }\n });\n });\n }\n\n async loadEmoteData(emoteInfo) {\n this.emotesLoaded = false;\n\n const _fs = __webpack_require__(/*! fs */ \"fs\");\n\n const emoteFile = \"emote_data.json\";\n const file = data__WEBPACK_IMPORTED_MODULE_1__[\"Config\"].dataPath + emoteFile;\n\n const exists = _fs.existsSync(file);\n\n if (exists && this.isCacheValid()) {\n _ui_toasts__WEBPACK_IMPORTED_MODULE_4__[\"default\"].show(\"Loading emotes from cache.\", {\n type: \"info\"\n });\n this.log(\"Loading emotes from local cache.\");\n const data = await new Promise(resolve => {\n _fs.readFile(file, \"utf8\", (err, content) => {\n this.log(\"Emotes loaded from cache.\");\n if (err) content = {};\n resolve(content);\n });\n });\n const parsed = modules__WEBPACK_IMPORTED_MODULE_2__[\"Utilities\"].testJSON(data);\n let isValid = !!parsed;\n if (isValid) Object.assign(Emotes, parsed);\n\n for (const e in emoteInfo) {\n isValid = Object.keys(Emotes[emoteInfo[e].variable]).length > 0;\n }\n\n if (isValid) {\n _ui_toasts__WEBPACK_IMPORTED_MODULE_4__[\"default\"].show(\"Emotes successfully loaded.\", {\n type: \"success\"\n });\n this.emotesLoaded = true;\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].dispatch(\"emotes-loaded\");\n return;\n }\n\n this.log(\"Cache was corrupt, downloading...\");\n\n _fs.unlinkSync(file);\n }\n\n if (!modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].get(this.category, \"general\", \"download\")) return;\n _ui_toasts__WEBPACK_IMPORTED_MODULE_4__[\"default\"].show(modules__WEBPACK_IMPORTED_MODULE_2__[\"Strings\"].Emotes.downloading, {\n type: \"info\"\n });\n\n for (const e in emoteInfo) {\n await new Promise(r => setTimeout(r, 1000));\n const data = await this.downloadEmotes(emoteInfo[e]);\n Emotes[emoteInfo[e].variable] = data;\n }\n\n _ui_toasts__WEBPACK_IMPORTED_MODULE_4__[\"default\"].show(modules__WEBPACK_IMPORTED_MODULE_2__[\"Strings\"].Emotes.downloaded, {\n type: \"success\"\n });\n\n try {\n _fs.writeFileSync(file, JSON.stringify(Emotes), \"utf8\");\n } catch (err) {\n this.stacktrace(\"Could not save emote data.\", err);\n }\n\n this.emotesLoaded = true;\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].dispatch(\"emotes-loaded\");\n }\n\n downloadEmotes(emoteMeta) {\n const request = __webpack_require__(/*! request */ \"request\");\n\n const options = {\n url: emoteMeta.url,\n timeout: emoteMeta.timeout ? emoteMeta.timeout : 5000,\n json: true\n };\n this.log(`Downloading: ${emoteMeta.variable} (${emoteMeta.url})`);\n return new Promise((resolve, reject) => {\n request(options, (error, response, parsedData) => {\n if (error) {\n this.stacktrace(\"Could not download \" + emoteMeta.variable, error);\n\n if (emoteMeta.backup) {\n emoteMeta.url = emoteMeta.backup;\n emoteMeta.backup = null;\n if (emoteMeta.backupParser) emoteMeta.parser = emoteMeta.backupParser;\n return resolve(this.downloadEmotes(emoteMeta));\n }\n\n return reject({});\n }\n\n if (typeof emoteMeta.parser === \"function\") parsedData = emoteMeta.parser(parsedData);\n\n for (const emote in parsedData) {\n if (emote.length < 4 || blacklist.includes(emote)) {\n delete parsedData[emote];\n continue;\n }\n\n parsedData[emote] = emoteMeta.getEmoteURL(parsedData[emote]);\n }\n\n resolve(parsedData);\n this.log(\"Downloaded: \" + emoteMeta.variable);\n });\n });\n }\n\n getBlacklist() {\n return new Promise(resolve => {\n $.getJSON(`https://rauenzi.github.io/BetterDiscordApp/data/emotefilter.json`, function (data) {\n resolve(blacklist.push(...data.blacklist));\n });\n });\n }\n\n isCacheValid() {\n const cacheLength = modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].getBDData(\"emoteCacheDays\") || modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].setBDData(\"emoteCacheDays\", 7) || 7;\n const cacheDate = new Date(modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].getBDData(\"emoteCacheDate\") || null);\n const currentDate = new Date();\n const daysBetween = Math.round(Math.abs((currentDate.getTime() - cacheDate.getTime()) / (24 * 60 * 60 * 1000)));\n\n if (daysBetween > cacheLength) {\n modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].setBDData(\"emoteCacheDate\", currentDate.toJSON());\n return false;\n }\n\n return true;\n }\n\n clearEmoteData() {\n const _fs = __webpack_require__(/*! fs */ \"fs\");\n\n const emoteFile = \"emote_data.json\";\n const file = data__WEBPACK_IMPORTED_MODULE_1__[\"Config\"].dataPath + emoteFile;\n\n const exists = _fs.existsSync(file);\n\n if (exists) _fs.unlinkSync(file);\n modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].setBDData(\"emoteCacheDate\", new Date().toJSON());\n\n for (const category in Emotes) Object.assign(Emotes, {\n [category]: {}\n });\n }\n\n}());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL2J1aWx0aW5zL2Vtb3Rlcy5qcz82YTA0Il0sIm5hbWVzIjpbIkVtb3RlcyIsIlR3aXRjaEdsb2JhbCIsIlR3aXRjaFN1YnNjcmliZXIiLCJCVFRWIiwiRnJhbmtlckZhY2VaIiwiQlRUVjIiLCJiZEVtb3RlU2V0dGluZ0lEcyIsImJsYWNrbGlzdCIsIm92ZXJyaWRlcyIsIm1vZGlmaWVycyIsIkVtb3RlTW9kdWxlIiwiQnVpbHRpbiIsIm5hbWUiLCJjb2xsZWN0aW9uIiwiY2F0ZWdvcnkiLCJpZCIsImNhdGVnb3JpZXMiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwiayIsImlzQ2F0ZWdvcnlFbmFibGVkIiwiZ2V0IiwiTWVzc2FnZUNvbnRlbnRDb21wb25lbnQiLCJXZWJwYWNrTW9kdWxlcyIsImdldE1vZHVsZSIsIm0iLCJkZWZhdWx0UHJvcHMiLCJoYXNPd25Qcm9wZXJ0eSIsImZhdm9yaXRlcyIsImZhdm9yaXRlRW1vdGVzIiwiZ2V0Q2F0ZWdvcnkiLCJpbml0aWFsaXplIiwiZmUiLCJEYXRhU3RvcmUiLCJnZXRCRERhdGEiLCJKU09OIiwicGFyc2UiLCJ3aW5kb3ciLCJhdG9iIiwic2F2ZUZhdm9yaXRlcyIsImFkZEZhdm9yaXRlIiwiYmluZCIsInJlbW92ZUZhdm9yaXRlIiwiZW5hYmxlZCIsIlNldHRpbmdzIiwicmVnaXN0ZXJDb2xsZWN0aW9uIiwiRW1vdGVDb25maWciLCJ0aXRsZSIsIlN0cmluZ3MiLCJjbGVhckVtb3RlcyIsIm9uQ2xpY2siLCJjbGVhckVtb3RlRGF0YSIsImxvYWRFbW90ZURhdGEiLCJFbW90ZUluZm8iLCJFdmVudHMiLCJvbiIsImRpc2FibGVkIiwib2ZmIiwicmVtb3ZlQ29sbGVjdGlvbiIsImVtcHR5RW1vdGVzIiwiY2FuY2VsRW1vdGVSZW5kZXIiLCJ1cmwiLCJpc0Zhdm9yaXRlIiwic2V0QkREYXRhIiwiYnRvYSIsInN0cmluZ2lmeSIsImNhdCIsImFzc2lnbiIsInBhdGNoTWVzc2FnZUNvbnRlbnQiLCJhZnRlciIsInByb3RvdHlwZSIsInRoaXNPYmoiLCJhcmdzIiwicmV0VmFsIiwicHJvcHMiLCJ0IiwiYSIsInJldHVyblZhbHVlIiwibGVuZ3RoIiwibWFya3VwIiwiY2hpbGRyZW4iLCJub2RlcyIsIm4iLCJub2RlIiwid29yZHMiLCJzcGxpdCIsImMiLCJjbGVuIiwidyIsIndsZW4iLCJlbW90ZSIsImVtb3RlU3BsaXQiLCJlbW90ZU5hbWUiLCJlbW90ZU1vZGlmaWVyIiwiZW1vdGVPdmVycmlkZSIsInNsaWNlIiwiaW5jbHVkZXMiLCJjdXJyZW50IiwicmVzdWx0cyIsIm1hdGNoIiwiUmVnRXhwIiwiVXRpbGl0aWVzIiwiZXNjYXBlIiwicHJlIiwic3Vic3RyaW5nIiwiaW5kZXgiLCJwb3N0IiwiZW1vdGVDb21wb25lbnQiLCJEaXNjb3JkTW9kdWxlcyIsIlJlYWN0IiwiY3JlYXRlRWxlbWVudCIsIkJERW1vdGUiLCJtb2RpZmllciIsInNwbGljZSIsIm9ubHlFbW90ZXMiLCJldmVyeSIsInIiLCJyZXBsYWNlIiwidHlwZSIsImVtb2ppTmFtZSIsImp1bWJvYWJsZSIsImVtb3RlSW5mbyIsImVtb3Rlc0xvYWRlZCIsIl9mcyIsInJlcXVpcmUiLCJlbW90ZUZpbGUiLCJmaWxlIiwiQ29uZmlnIiwiZGF0YVBhdGgiLCJleGlzdHMiLCJleGlzdHNTeW5jIiwiaXNDYWNoZVZhbGlkIiwiVG9hc3RzIiwic2hvdyIsImxvZyIsImRhdGEiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYWRGaWxlIiwiZXJyIiwiY29udGVudCIsInBhcnNlZCIsInRlc3RKU09OIiwiaXNWYWxpZCIsImUiLCJ2YXJpYWJsZSIsImRpc3BhdGNoIiwidW5saW5rU3luYyIsImRvd25sb2FkaW5nIiwic2V0VGltZW91dCIsImRvd25sb2FkRW1vdGVzIiwiZG93bmxvYWRlZCIsIndyaXRlRmlsZVN5bmMiLCJzdGFja3RyYWNlIiwiZW1vdGVNZXRhIiwicmVxdWVzdCIsIm9wdGlvbnMiLCJ0aW1lb3V0IiwianNvbiIsInJlamVjdCIsImVycm9yIiwicmVzcG9uc2UiLCJwYXJzZWREYXRhIiwiYmFja3VwIiwiYmFja3VwUGFyc2VyIiwicGFyc2VyIiwiZ2V0RW1vdGVVUkwiLCJnZXRCbGFja2xpc3QiLCIkIiwiZ2V0SlNPTiIsInB1c2giLCJjYWNoZUxlbmd0aCIsImNhY2hlRGF0ZSIsIkRhdGUiLCJjdXJyZW50RGF0ZSIsImRheXNCZXR3ZWVuIiwiTWF0aCIsInJvdW5kIiwiYWJzIiwiZ2V0VGltZSIsInRvSlNPTiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7Q0FFQTs7QUFFQSxNQUFNQSxNQUFNLEdBQUc7QUFDWEMsY0FBWSxFQUFFLEVBREg7QUFFWEMsa0JBQWdCLEVBQUUsRUFGUDtBQUdYQyxNQUFJLEVBQUUsRUFISztBQUlYQyxjQUFZLEVBQUUsRUFKSDtBQUtYQyxPQUFLLEVBQUU7QUFMSSxDQUFmO0FBUUEsTUFBTUMsaUJBQWlCLEdBQUc7QUFDdEJMLGNBQVksRUFBRSxRQURRO0FBRXRCQyxrQkFBZ0IsRUFBRSxRQUZJO0FBR3RCQyxNQUFJLEVBQUUsTUFIZ0I7QUFJdEJDLGNBQVksRUFBRSxLQUpRO0FBS3RCQyxPQUFLLEVBQUU7QUFMZSxDQUExQjtBQVFBLE1BQU1FLFNBQVMsR0FBRyxFQUFsQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyxDQUFDLFFBQUQsRUFBVyxNQUFYLEVBQW1CLEtBQW5CLENBQWxCO0FBQ0EsTUFBTUMsU0FBUyxHQUFHLENBQUMsTUFBRCxFQUFTLE1BQVQsRUFBaUIsT0FBakIsRUFBMEIsT0FBMUIsRUFBbUMsT0FBbkMsRUFBNEMsT0FBNUMsRUFBcUQsT0FBckQsRUFBOEQsT0FBOUQsRUFBdUUsSUFBdkUsRUFBNkUsSUFBN0UsRUFBbUYsSUFBbkYsRUFBeUYsT0FBekYsRUFBa0csUUFBbEcsRUFBNEcsUUFBNUcsRUFBc0gsTUFBdEgsQ0FBbEI7QUFFZSxtRUFBSSxNQUFNQyxXQUFOLFNBQTBCQyx3REFBMUIsQ0FB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SyxRQUFYLElBQXVCZCxNQUF2QixFQUErQmlCLE1BQU0sQ0FBQ21ELE1BQVAsQ0FBY3BFLE1BQWQsRUFBc0I7QUFBQyxPQUFDYyxRQUFELEdBQVk7QUFBYixLQUF0QjtBQUNsQzs7QUFqUmdELENBQXRDLEVBQWYiLCJmaWxlIjoiLi9zcmMvYnVpbHRpbnMvZW1vdGVzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ1aWx0aW4gZnJvbSBcIi4uL3N0cnVjdHMvYnVpbHRpblwiO1xyXG5cclxuaW1wb3J0IHtDb25maWcsIEVtb3RlSW5mbywgRW1vdGVDb25maWd9IGZyb20gXCJkYXRhXCI7XHJcbmltcG9ydCB7VXRpbGl0aWVzLCBXZWJwYWNrTW9kdWxlcywgRGF0YVN0b3JlLCBEaXNjb3JkTW9kdWxlcywgRXZlbnRzLCBTZXR0aW5ncywgU3RyaW5nc30gZnJvbSBcIm1vZHVsZXNcIjtcclxuaW1wb3J0IEJERW1vdGUgZnJvbSBcIi4uL3VpL2Vtb3RlXCI7XHJcbmltcG9ydCBUb2FzdHMgZnJvbSBcIi4uL3VpL3RvYXN0c1wiO1xyXG4vLyBpbXBvcnQgRW1vdGVNZW51IGZyb20gXCIuL2Vtb3RlbWVudVwiO1xyXG5cclxuY29uc3QgRW1vdGVzID0ge1xyXG4gICAgVHdpdGNoR2xvYmFsOiB7fSxcclxuICAgIFR3aXRjaFN1YnNjcmliZXI6IHt9LFxyXG4gICAgQlRUVjoge30sXHJcbiAgICBGcmFua2VyRmFjZVo6IHt9LFxyXG4gICAgQlRUVjI6IHt9XHJcbn07XHJcblxyXG5jb25zdCBiZEVtb3RlU2V0dGluZ0lEcyA9IHtcclxuICAgIFR3aXRjaEdsb2JhbDogXCJ0d2l0Y2hcIixcclxuICAgIFR3aXRjaFN1YnNjcmliZXI6IFwidHdpdGNoXCIsXHJcbiAgICBCVFRWOiBcImJ0dHZcIixcclxuICAgIEZyYW5rZXJGYWNlWjogXCJmZnpcIixcclxuICAgIEJUVFYyOiBcImJ0dHZcIlxyXG59O1xyXG5cclxuY29uc3QgYmxhY2tsaXN0ID0gW107XHJcbmNvbnN0IG92ZXJyaWRlcyA9IFtcInR3aXRjaFwiLCBcImJ0dHZcIiwgXCJmZnpcIl07XHJcbmNvbnN0IG1vZGlmaWVycyA9IFtcImZsaXBcIiwgXCJzcGluXCIsIFwicHVsc2VcIiwgXCJzcGluMlwiLCBcInNwaW4zXCIsIFwiMXNwaW5cIiwgXCIyc3BpblwiLCBcIjNzcGluXCIsIFwidHJcIiwgXCJibFwiLCBcImJyXCIsIFwic2hha2VcIiwgXCJzaGFrZTJcIiwgXCJzaGFrZTNcIiwgXCJmbGFwXCJdO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEVtb3RlTW9kdWxlIGV4dGVuZHMgQnVpbHRpbiB7XHJcbiAgICBnZXQgbmFtZSgpIHtyZXR1cm4gXCJFbW90ZXNcIjt9XHJcbiAgICBnZXQgY29sbGVjdGlvbigpIHtyZXR1cm4gXCJzZXR0aW5nc1wiO31cclxuICAgIGdldCBjYXRlZ29yeSgpIHtyZXR1cm4gXCJnZW5lcmFsXCI7fVxyXG4gICAgZ2V0IGlkKCkge3JldHVybiBcImVtb3Rlc1wiO31cclxuICAgIGdldCBjYXRlZ29yaWVzKCkgeyByZXR1cm4gT2JqZWN0LmtleXMoYmRFbW90ZVNldHRpbmdJRHMpLmZpbHRlcihrID0+IHRoaXMuaXNDYXRlZ29yeUVuYWJsZWQoYmRFbW90ZVNldHRpbmdJRHNba10pKTsgfVxyXG5cclxuICAgIGlzQ2F0ZWdvcnlFbmFibGVkKGlkKSB7cmV0dXJuIHN1cGVyLmdldChcImVtb3Rlc1wiLCBcImNhdGVnb3JpZXNcIiwgaWQpO31cclxuXHJcbiAgICBnZXQoaWQpIHtyZXR1cm4gc3VwZXIuZ2V0KFwiZW1vdGVzXCIsIFwiZ2VuZXJhbFwiLCBpZCk7fVxyXG5cclxuICAgIGdldCBNZXNzYWdlQ29udGVudENvbXBvbmVudCgpIHtyZXR1cm4gV2VicGFja01vZHVsZXMuZ2V0TW9kdWxlKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuaGFzT3duUHJvcGVydHkoXCJkaXNhYmxlQnV0dG9uc1wiKSk7fVxyXG5cclxuICAgIGdldCBFbW90ZXMoKSB7cmV0dXJuIEVtb3Rlczt9XHJcbiAgICBnZXQgVHdpdGNoR2xvYmFsKCkge3JldHVybiBFbW90ZXMuVHdpdGNoR2xvYmFsO31cclxuICAgIGdldCBUd2l0Y2hTdWJzY3JpYmVyKCkge3JldHVybiBFbW90ZXMuVHdpdGNoU3Vic2NyaWJlcjt9XHJcbiAgICBnZXQgQlRUVigpIHtyZXR1cm4gRW1vdGVzLkJUVFY7fVxyXG4gICAgZ2V0IEZyYW5rZXJGYWNlWigpIHtyZXR1cm4gRW1vdGVzLkZyYW5rZXJGYWNlWjt9XHJcbiAgICBnZXQgQlRUVjIoKSB7cmV0dXJuIEVtb3Rlcy5CVFRWMjt9XHJcbiAgICBnZXQgYmxhY2tsaXN0KCkge3JldHVybiBibGFja2xpc3Q7fVxyXG4gICAgZ2V0IGZhdm9yaXRlcygpIHtyZXR1cm4gdGhpcy5mYXZvcml0ZUVtb3Rlczt9XHJcblxyXG4gICAgZ2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpIHtcclxuICAgICAgICByZXR1cm4gRW1vdGVzW2NhdGVnb3J5XTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTtcclxuICAgICAgICB0aGlzLmZhdm9yaXRlRW1vdGVzID0ge307XHJcbiAgICAgICAgY29uc3QgZmUgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRmYXZlbW90ZXNcIik7XHJcbiAgICAgICAgaWYgKGZlICE9PSBcIlwiICYmIGZlICE9PSBudWxsKSB0aGlzLmZhdm9yaXRlRW1vdGVzID0gSlNPTi5wYXJzZSh3aW5kb3cuYXRvYihmZSkpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUZhdm9yaXRlcygpO1xyXG4gICAgICAgIHRoaXMuYWRkRmF2b3JpdGUgPSB0aGlzLmFkZEZhdm9yaXRlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGYXZvcml0ZSA9IHRoaXMucmVtb3ZlRmF2b3JpdGUuYmluZCh0aGlzKTtcclxuICAgICAgICAvLyBFbW90ZUNvbmZpZztcclxuICAgICAgICAvLyBlbW90ZUNvbGxlY3Rpb24uYnV0dG9uID0ge3RpdGxlOiBcIkNsZWFyIEVtb3RlIENhY2hlXCIsIG9uQ2xpY2s6ICgpID0+IHsgdGhpcy5jbGVhckVtb3RlRGF0YSgpOyB0aGlzLmxvYWRFbW90ZURhdGEoRW1vdGVJbmZvKTsgfX07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5hYmxlZCgpIHtcclxuICAgICAgICBTZXR0aW5ncy5yZWdpc3RlckNvbGxlY3Rpb24oXCJlbW90ZXNcIiwgXCJFbW90ZXNcIiwgRW1vdGVDb25maWcsIHt0aXRsZTogU3RyaW5ncy5FbW90ZXMuY2xlYXJFbW90ZXMsIG9uQ2xpY2s6ICgpID0+IHsgdGhpcy5jbGVhckVtb3RlRGF0YSgpOyB0aGlzLmxvYWRFbW90ZURhdGEoRW1vdGVJbmZvKTsgfX0pO1xyXG4gICAgICAgIC8vIERpc2FibGUgZW1vdGUgbW9kdWxlIGZvciBub3cgYmVjYXVzZSBpdCdzIGFubm95aW5nIGFuZCBzbG93XHJcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5nZXRCbGFja2xpc3QoKTtcclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmxvYWRFbW90ZURhdGEoRW1vdGVJbmZvKTtcclxuXHJcbiAgICAgICAgLy8gd2hpbGUgKCF0aGlzLk1lc3NhZ2VDb250ZW50Q29tcG9uZW50KSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XHJcbiAgICAgICAgLy8gdGhpcy5wYXRjaE1lc3NhZ2VDb250ZW50KCk7XHJcbiAgICAgICAgRXZlbnRzLm9uKFwiZW1vdGVzLWZhdm9yaXRlLWFkZGVkXCIsIHRoaXMuYWRkRmF2b3JpdGUpO1xyXG4gICAgICAgIEV2ZW50cy5vbihcImVtb3Rlcy1mYXZvcml0ZS1yZW1vdmVkXCIsIHRoaXMucmVtb3ZlRmF2b3JpdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGVkKCkge1xyXG4gICAgICAgIEV2ZW50cy5vZmYoXCJlbW90ZXMtZmF2b3JpdGUtYWRkZWRcIiwgdGhpcy5hZGRGYXZvcml0ZSk7XHJcbiAgICAgICAgRXZlbnRzLm9mZihcImVtb3Rlcy1mYXZvcml0ZS1yZW1vdmVkXCIsIHRoaXMucmVtb3ZlRmF2b3JpdGUpO1xyXG4gICAgICAgIFNldHRpbmdzLnJlbW92ZUNvbGxlY3Rpb24oXCJlbW90ZXNcIik7XHJcbiAgICAgICAgdGhpcy5lbXB0eUVtb3RlcygpO1xyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW90ZVJlbmRlcikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5jYW5jZWxFbW90ZVJlbmRlcjtcclxuICAgIH1cclxuXHJcbiAgICBhZGRGYXZvcml0ZShuYW1lLCB1cmwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZmF2b3JpdGVFbW90ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHRoaXMuZmF2b3JpdGVFbW90ZXNbbmFtZV0gPSB1cmw7XHJcbiAgICAgICAgdGhpcy5zYXZlRmF2b3JpdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRmF2b3JpdGUobmFtZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5mYXZvcml0ZUVtb3Rlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgcmV0dXJuO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmZhdm9yaXRlRW1vdGVzW25hbWVdO1xyXG4gICAgICAgIHRoaXMuc2F2ZUZhdm9yaXRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRmF2b3JpdGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZhdm9yaXRlRW1vdGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVGYXZvcml0ZXMoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkZmF2ZW1vdGVzXCIsIHdpbmRvdy5idG9hKEpTT04uc3RyaW5naWZ5KHRoaXMuZmF2b3JpdGVFbW90ZXMpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZW1wdHlFbW90ZXMoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjYXQgaW4gRW1vdGVzKSBPYmplY3QuYXNzaWduKEVtb3Rlcywge1tjYXRdOiB7fX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoTWVzc2FnZUNvbnRlbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyID0gdGhpcy5hZnRlcih0aGlzLk1lc3NhZ2VDb250ZW50Q29tcG9uZW50LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwgKHRoaXNPYmosIGFyZ3MsIHJldFZhbCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyKHJldFZhbC5wcm9wcywgXCJjaGlsZHJlblwiLCAodCwgYSwgcmV0dXJuVmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhdGVnb3JpZXMubGVuZ3RoID09IDApIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmt1cCA9IHJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuWzFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXJrdXAucHJvcHMuY2hpbGRyZW4pIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gbWFya3VwLnByb3BzLmNoaWxkcmVuWzFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFub2RlcyB8fCAhbm9kZXMubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yobm9kZSkgIT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRzID0gbm9kZS5zcGxpdCgvKFteXFxzXSspKFtcXHNdfCQpL2cpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjbGVuID0gdGhpcy5jYXRlZ29yaWVzLmxlbmd0aDsgYyA8IGNsZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB3ID0gMCwgd2xlbiA9IHdvcmRzLmxlbmd0aDsgdyA8IHdsZW47IHcrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vdGUgPSB3b3Jkc1t3XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb3RlU3BsaXQgPSBlbW90ZS5zcGxpdChcIjpcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW90ZU5hbWUgPSBlbW90ZVNwbGl0WzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVtb3RlTW9kaWZpZXIgPSBlbW90ZVNwbGl0WzFdID8gZW1vdGVTcGxpdFsxXSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW1vdGVPdmVycmlkZSA9IGVtb3RlTW9kaWZpZXIuc2xpY2UoMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb3RlTmFtZS5sZW5ndGggPCA0IHx8IGJsYWNrbGlzdC5pbmNsdWRlcyhlbW90ZU5hbWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kaWZpZXJzLmluY2x1ZGVzKGVtb3RlTW9kaWZpZXIpIHx8ICFTZXR0aW5ncy5nZXQodGhpcy5jYXRlZ29yeSwgXCJnZW5lcmFsXCIsIFwibW9kaWZpZXJzXCIpKSBlbW90ZU1vZGlmaWVyID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3ZlcnJpZGVzLmluY2x1ZGVzKGVtb3RlT3ZlcnJpZGUpKSBlbW90ZU92ZXJyaWRlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZW1vdGVNb2RpZmllciA9IGVtb3RlT3ZlcnJpZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmNhdGVnb3JpZXNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vdGVPdmVycmlkZSA9PT0gXCJ0d2l0Y2hcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbW90ZXMuVHdpdGNoR2xvYmFsW2Vtb3RlTmFtZV0pIGN1cnJlbnQgPSBcIlR3aXRjaEdsb2JhbFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEVtb3Rlcy5Ud2l0Y2hTdWJzY3JpYmVyW2Vtb3RlTmFtZV0pIGN1cnJlbnQgPSBcIlR3aXRjaFN1YnNjcmliZXJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVtb3RlT3ZlcnJpZGUgPT09IFwiYnR0dlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVtb3Rlcy5CVFRWW2Vtb3RlTmFtZV0pIGN1cnJlbnQgPSBcIkJUVFZcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChFbW90ZXMuQlRUVjJbZW1vdGVOYW1lXSkgY3VycmVudCA9IFwiQlRUVjJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVtb3RlT3ZlcnJpZGUgPT09IFwiZmZ6XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW1vdGVzLkZyYW5rZXJGYWNlWltlbW90ZU5hbWVdKSBjdXJyZW50ID0gXCJGcmFua2VyRmFjZVpcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUVtb3Rlc1tjdXJyZW50XVtlbW90ZU5hbWVdIHx8ICFTZXR0aW5ncy5nZXQodGhpcy5jYXRlZ29yeSwgXCJjYXRlZ29yaWVzXCIsIGJkRW1vdGVTZXR0aW5nSURzW2N1cnJlbnRdKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gbm9kZXNbbl0ubWF0Y2gobmV3IFJlZ0V4cChgKFtcXFxcc118Xikke1V0aWxpdGllcy5lc2NhcGUoZW1vdGVNb2RpZmllciA/IGVtb3RlTmFtZSArIFwiOlwiICsgZW1vdGVNb2RpZmllciA6IGVtb3RlTmFtZSl9KFtcXFxcc118JClgKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlID0gbm9kZXNbbl0uc3Vic3RyaW5nKDAsIHJlc3VsdHMuaW5kZXggKyByZXN1bHRzWzFdLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3N0ID0gbm9kZXNbbl0uc3Vic3RyaW5nKHJlc3VsdHMuaW5kZXggKyByZXN1bHRzWzBdLmxlbmd0aCAtIHJlc3VsdHNbMl0ubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzW25dID0gcHJlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vdGVDb21wb25lbnQgPSBEaXNjb3JkTW9kdWxlcy5SZWFjdC5jcmVhdGVFbGVtZW50KEJERW1vdGUsIHtuYW1lOiBlbW90ZU5hbWUsIHVybDogRW1vdGVzW2N1cnJlbnRdW2Vtb3RlTmFtZV0sIG1vZGlmaWVyOiBlbW90ZU1vZGlmaWVyLCBpc0Zhdm9yaXRlOiB0aGlzLmlzRmF2b3JpdGUoZW1vdGVOYW1lKX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKG4gKyAxLCAwLCBwb3N0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShuICsgMSwgMCwgZW1vdGVDb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb25seUVtb3RlcyA9IG5vZGVzLmV2ZXJ5KHIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YocikgPT0gXCJzdHJpbmdcIiAmJiByLnJlcGxhY2UoL1xccyovLCBcIlwiKSA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyLnR5cGUgJiYgci50eXBlLm5hbWUgPT0gXCJCREVtb3RlXCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIucHJvcHMgJiYgci5wcm9wcy5jaGlsZHJlbiAmJiByLnByb3BzLmNoaWxkcmVuLnByb3BzICYmIHIucHJvcHMuY2hpbGRyZW4ucHJvcHMuZW1vamlOYW1lKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmICghb25seUVtb3RlcykgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yobm9kZSkgIT0gXCJvYmplY3RcIikgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5uYW1lID09IFwiQkRFbW90ZVwiKSBub2RlLnByb3BzLmp1bWJvYWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLmNoaWxkcmVuICYmIG5vZGUucHJvcHMuY2hpbGRyZW4ucHJvcHMgJiYgbm9kZS5wcm9wcy5jaGlsZHJlbi5wcm9wcy5lbW9qaU5hbWUpIG5vZGUucHJvcHMuY2hpbGRyZW4ucHJvcHMuanVtYm9hYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEVtb3RlRGF0YShlbW90ZUluZm8pIHtcclxuICAgICAgICB0aGlzLmVtb3Rlc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IF9mcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuICAgICAgICBjb25zdCBlbW90ZUZpbGUgPSBcImVtb3RlX2RhdGEuanNvblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBDb25maWcuZGF0YVBhdGggKyBlbW90ZUZpbGU7XHJcbiAgICAgICAgY29uc3QgZXhpc3RzID0gX2ZzLmV4aXN0c1N5bmMoZmlsZSk7XHJcblxyXG4gICAgICAgIGlmIChleGlzdHMgJiYgdGhpcy5pc0NhY2hlVmFsaWQoKSkge1xyXG4gICAgICAgICAgICBUb2FzdHMuc2hvdyhcIkxvYWRpbmcgZW1vdGVzIGZyb20gY2FjaGUuXCIsIHt0eXBlOiBcImluZm9cIn0pO1xyXG4gICAgICAgICAgICB0aGlzLmxvZyhcIkxvYWRpbmcgZW1vdGVzIGZyb20gbG9jYWwgY2FjaGUuXCIpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgX2ZzLnJlYWRGaWxlKGZpbGUsIFwidXRmOFwiLCAoZXJyLCBjb250ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coXCJFbW90ZXMgbG9hZGVkIGZyb20gY2FjaGUuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIGNvbnRlbnQgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gVXRpbGl0aWVzLnRlc3RKU09OKGRhdGEpO1xyXG4gICAgICAgICAgICBsZXQgaXNWYWxpZCA9ICEhcGFyc2VkO1xyXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkgT2JqZWN0LmFzc2lnbihFbW90ZXMsIHBhcnNlZCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgaW4gZW1vdGVJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gT2JqZWN0LmtleXMoRW1vdGVzW2Vtb3RlSW5mb1tlXS52YXJpYWJsZV0pLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICBUb2FzdHMuc2hvdyhcIkVtb3RlcyBzdWNjZXNzZnVsbHkgbG9hZGVkLlwiLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1vdGVzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIEV2ZW50cy5kaXNwYXRjaChcImVtb3Rlcy1sb2FkZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9nKFwiQ2FjaGUgd2FzIGNvcnJ1cHQsIGRvd25sb2FkaW5nLi4uXCIpO1xyXG4gICAgICAgICAgICBfZnMudW5saW5rU3luYyhmaWxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghU2V0dGluZ3MuZ2V0KHRoaXMuY2F0ZWdvcnksIFwiZ2VuZXJhbFwiLCBcImRvd25sb2FkXCIpKSByZXR1cm47XHJcbiAgICAgICAgVG9hc3RzLnNob3coU3RyaW5ncy5FbW90ZXMuZG93bmxvYWRpbmcsIHt0eXBlOiBcImluZm9cIn0pO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGUgaW4gZW1vdGVJbmZvKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAxMDAwKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmRvd25sb2FkRW1vdGVzKGVtb3RlSW5mb1tlXSk7XHJcbiAgICAgICAgICAgIEVtb3Rlc1tlbW90ZUluZm9bZV0udmFyaWFibGVdID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFRvYXN0cy5zaG93KFN0cmluZ3MuRW1vdGVzLmRvd25sb2FkZWQsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG5cclxuICAgICAgICB0cnkgeyBfZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShFbW90ZXMpLCBcInV0ZjhcIik7IH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7IHRoaXMuc3RhY2t0cmFjZShcIkNvdWxkIG5vdCBzYXZlIGVtb3RlIGRhdGEuXCIsIGVycik7IH1cclxuXHJcbiAgICAgICAgdGhpcy5lbW90ZXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIEV2ZW50cy5kaXNwYXRjaChcImVtb3Rlcy1sb2FkZWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZG93bmxvYWRFbW90ZXMoZW1vdGVNZXRhKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIHVybDogZW1vdGVNZXRhLnVybCxcclxuICAgICAgICAgICAgdGltZW91dDogZW1vdGVNZXRhLnRpbWVvdXQgPyBlbW90ZU1ldGEudGltZW91dCA6IDUwMDAsXHJcbiAgICAgICAgICAgIGpzb246IHRydWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmxvZyhgRG93bmxvYWRpbmc6ICR7ZW1vdGVNZXRhLnZhcmlhYmxlfSAoJHtlbW90ZU1ldGEudXJsfSlgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcmVxdWVzdChvcHRpb25zLCAoZXJyb3IsIHJlc3BvbnNlLCBwYXJzZWREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrdHJhY2UoXCJDb3VsZCBub3QgZG93bmxvYWQgXCIgKyBlbW90ZU1ldGEudmFyaWFibGUsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW1vdGVNZXRhLmJhY2t1cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbW90ZU1ldGEudXJsID0gZW1vdGVNZXRhLmJhY2t1cDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1vdGVNZXRhLmJhY2t1cCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW90ZU1ldGEuYmFja3VwUGFyc2VyKSBlbW90ZU1ldGEucGFyc2VyID0gZW1vdGVNZXRhLmJhY2t1cFBhcnNlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUodGhpcy5kb3dubG9hZEVtb3RlcyhlbW90ZU1ldGEpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdCh7fSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZihlbW90ZU1ldGEucGFyc2VyKSA9PT0gXCJmdW5jdGlvblwiKSBwYXJzZWREYXRhID0gZW1vdGVNZXRhLnBhcnNlcihwYXJzZWREYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVtb3RlIGluIHBhcnNlZERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW1vdGUubGVuZ3RoIDwgNCB8fCBibGFja2xpc3QuaW5jbHVkZXMoZW1vdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJzZWREYXRhW2Vtb3RlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGFbZW1vdGVdID0gZW1vdGVNZXRhLmdldEVtb3RlVVJMKHBhcnNlZERhdGFbZW1vdGVdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUocGFyc2VkRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhcIkRvd25sb2FkZWQ6IFwiICsgZW1vdGVNZXRhLnZhcmlhYmxlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QmxhY2tsaXN0KCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgJC5nZXRKU09OKGBodHRwczovL3JhdWVuemkuZ2l0aHViLmlvL0JldHRlckRpc2NvcmRBcHAvZGF0YS9lbW90ZWZpbHRlci5qc29uYCwgZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoYmxhY2tsaXN0LnB1c2goLi4uZGF0YS5ibGFja2xpc3QpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNDYWNoZVZhbGlkKCkge1xyXG4gICAgICAgIGNvbnN0IGNhY2hlTGVuZ3RoID0gRGF0YVN0b3JlLmdldEJERGF0YShcImVtb3RlQ2FjaGVEYXlzXCIpIHx8IERhdGFTdG9yZS5zZXRCRERhdGEoXCJlbW90ZUNhY2hlRGF5c1wiLCA3KSB8fCA3O1xyXG4gICAgICAgIGNvbnN0IGNhY2hlRGF0ZSA9IG5ldyBEYXRlKERhdGFTdG9yZS5nZXRCRERhdGEoXCJlbW90ZUNhY2hlRGF0ZVwiKSB8fCBudWxsKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgY29uc3QgZGF5c0JldHdlZW4gPSBNYXRoLnJvdW5kKE1hdGguYWJzKChjdXJyZW50RGF0ZS5nZXRUaW1lKCkgLSBjYWNoZURhdGUuZ2V0VGltZSgpKSAvICgyNCAqIDYwICogNjAgKiAxMDAwKSkpO1xyXG4gICAgICAgIGlmIChkYXlzQmV0d2VlbiA+IGNhY2hlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJlbW90ZUNhY2hlRGF0ZVwiLCBjdXJyZW50RGF0ZS50b0pTT04oKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJFbW90ZURhdGEoKSB7XHJcbiAgICAgICAgY29uc3QgX2ZzID0gcmVxdWlyZShcImZzXCIpO1xyXG4gICAgICAgIGNvbnN0IGVtb3RlRmlsZSA9IFwiZW1vdGVfZGF0YS5qc29uXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZSA9IENvbmZpZy5kYXRhUGF0aCArIGVtb3RlRmlsZTtcclxuICAgICAgICBjb25zdCBleGlzdHMgPSBfZnMuZXhpc3RzU3luYyhmaWxlKTtcclxuICAgICAgICBpZiAoZXhpc3RzKSBfZnMudW5saW5rU3luYyhmaWxlKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiZW1vdGVDYWNoZURhdGVcIiwgKG5ldyBEYXRlKCkpLnRvSlNPTigpKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IGluIEVtb3RlcykgT2JqZWN0LmFzc2lnbihFbW90ZXMsIHtbY2F0ZWdvcnldOiB7fX0pO1xyXG4gICAgfVxyXG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/builtins/emotes.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _structs_builtin__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../structs/builtin */ \"./src/structs/builtin.js\");\n/* harmony import */ var data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! data */ \"./src/data/data.js\");\n/* harmony import */ var modules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! modules */ \"./src/modules/modules.js\");\n/* harmony import */ var _ui_emote__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ui/emote */ \"./src/ui/emote.js\");\n/* harmony import */ var _ui_toasts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/toasts */ \"./src/ui/toasts.js\");\n\n\n\n\n // import EmoteMenu from \"./emotemenu\";\n\nconst request = __webpack_require__(/*! request */ \"request\");\n\nconst Emotes = {\n TwitchGlobal: {},\n TwitchSubscriber: {},\n BTTV: {},\n FrankerFaceZ: {},\n BTTV2: {}\n};\nconst bdEmoteSettingIDs = {\n TwitchGlobal: \"twitch\",\n TwitchSubscriber: \"twitch\",\n BTTV: \"bttv\",\n FrankerFaceZ: \"ffz\",\n BTTV2: \"bttv\"\n};\nconst blacklist = [];\nconst overrides = [\"twitch\", \"bttv\", \"ffz\"];\nconst modifiers = [\"flip\", \"spin\", \"pulse\", \"spin2\", \"spin3\", \"1spin\", \"2spin\", \"3spin\", \"tr\", \"bl\", \"br\", \"shake\", \"shake2\", \"shake3\", \"flap\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (new class EmoteModule extends _structs_builtin__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n get name() {\n return \"Emotes\";\n }\n\n get collection() {\n return \"settings\";\n }\n\n get category() {\n return \"general\";\n }\n\n get id() {\n return \"emotes\";\n }\n\n get categories() {\n return Object.keys(bdEmoteSettingIDs).filter(k => this.isCategoryEnabled(bdEmoteSettingIDs[k]));\n }\n\n isCategoryEnabled(id) {\n return super.get(\"emotes\", \"categories\", id);\n }\n\n get(id) {\n return super.get(\"emotes\", \"general\", id);\n }\n\n get MessageContentComponent() {\n return modules__WEBPACK_IMPORTED_MODULE_2__[\"WebpackModules\"].getModule(m => m.defaultProps && m.defaultProps.hasOwnProperty(\"disableButtons\"));\n }\n\n get Emotes() {\n return Emotes;\n }\n\n get TwitchGlobal() {\n return Emotes.TwitchGlobal;\n }\n\n get TwitchSubscriber() {\n return Emotes.TwitchSubscriber;\n }\n\n get BTTV() {\n return Emotes.BTTV;\n }\n\n get FrankerFaceZ() {\n return Emotes.FrankerFaceZ;\n }\n\n get BTTV2() {\n return Emotes.BTTV2;\n }\n\n get blacklist() {\n return blacklist;\n }\n\n get favorites() {\n return this.favoriteEmotes;\n }\n\n getCategory(category) {\n return Emotes[category];\n }\n\n initialize() {\n super.initialize();\n this.favoriteEmotes = {};\n const fe = modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].getBDData(\"bdfavemotes\");\n if (fe !== \"\" && fe !== null) this.favoriteEmotes = JSON.parse(window.atob(fe));\n this.saveFavorites();\n this.addFavorite = this.addFavorite.bind(this);\n this.removeFavorite = this.removeFavorite.bind(this); // EmoteConfig;\n // emoteCollection.button = {title: \"Clear Emote Cache\", onClick: () => { this.clearEmoteData(); this.loadEmoteData(EmoteInfo); }};\n }\n\n async enabled() {\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].registerCollection(\"emotes\", \"Emotes\", data__WEBPACK_IMPORTED_MODULE_1__[\"EmoteConfig\"], {\n title: modules__WEBPACK_IMPORTED_MODULE_2__[\"Strings\"].Emotes.clearEmotes,\n onClick: () => {\n this.clearEmoteData();\n this.loadEmoteData(data__WEBPACK_IMPORTED_MODULE_1__[\"EmoteInfo\"]);\n }\n }); // Disable emote module for now because it's annoying and slow\n\n await this.getBlacklist();\n await this.loadEmoteData(data__WEBPACK_IMPORTED_MODULE_1__[\"EmoteInfo\"]);\n\n while (!this.MessageContentComponent) await new Promise(resolve => setTimeout(resolve, 100));\n\n this.patchMessageContent();\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].on(\"emotes-favorite-added\", this.addFavorite);\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].on(\"emotes-favorite-removed\", this.removeFavorite);\n }\n\n disabled() {\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].off(\"emotes-favorite-added\", this.addFavorite);\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].off(\"emotes-favorite-removed\", this.removeFavorite);\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].removeCollection(\"emotes\");\n this.emptyEmotes();\n if (!this.cancelEmoteRender) return;\n this.cancelEmoteRender();\n delete this.cancelEmoteRender;\n }\n\n addFavorite(name, url) {\n if (!this.favoriteEmotes.hasOwnProperty(name)) this.favoriteEmotes[name] = url;\n this.saveFavorites();\n }\n\n removeFavorite(name) {\n if (!this.favoriteEmotes.hasOwnProperty(name)) return;\n delete this.favoriteEmotes[name];\n this.saveFavorites();\n }\n\n isFavorite(name) {\n return this.favoriteEmotes.hasOwnProperty(name);\n }\n\n saveFavorites() {\n modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].setBDData(\"bdfavemotes\", window.btoa(JSON.stringify(this.favoriteEmotes)));\n }\n\n emptyEmotes() {\n for (const cat in Emotes) Object.assign(Emotes, {\n [cat]: {}\n });\n }\n\n patchMessageContent() {\n if (this.cancelEmoteRender) return;\n this.cancelEmoteRender = this.after(this.MessageContentComponent.prototype, \"render\", (thisObj, args, retVal) => {\n this.after(retVal.props, \"children\", (t, a, returnValue) => {\n if (this.categories.length == 0) return;\n const markup = returnValue.props.children[1];\n if (!markup.props.children) return;\n const nodes = markup.props.children[1];\n if (!nodes || !nodes.length) return;\n\n for (let n = 0; n < nodes.length; n++) {\n const node = nodes[n];\n if (typeof node !== \"string\") continue;\n const words = node.split(/([^\\s]+)([\\s]|$)/g);\n\n for (let c = 0, clen = this.categories.length; c < clen; c++) {\n for (let w = 0, wlen = words.length; w < wlen; w++) {\n const emote = words[w];\n const emoteSplit = emote.split(\":\");\n const emoteName = emoteSplit[0];\n let emoteModifier = emoteSplit[1] ? emoteSplit[1] : \"\";\n let emoteOverride = emoteModifier.slice(0);\n if (emoteName.length < 4 || blacklist.includes(emoteName)) continue;\n if (!modifiers.includes(emoteModifier) || !modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].get(this.category, \"general\", \"modifiers\")) emoteModifier = \"\";\n if (!overrides.includes(emoteOverride)) emoteOverride = \"\";else emoteModifier = emoteOverride;\n let current = this.categories[c];\n\n if (emoteOverride === \"twitch\") {\n if (Emotes.TwitchGlobal[emoteName]) current = \"TwitchGlobal\";else if (Emotes.TwitchSubscriber[emoteName]) current = \"TwitchSubscriber\";\n } else if (emoteOverride === \"bttv\") {\n if (Emotes.BTTV[emoteName]) current = \"BTTV\";else if (Emotes.BTTV2[emoteName]) current = \"BTTV2\";\n } else if (emoteOverride === \"ffz\") {\n if (Emotes.FrankerFaceZ[emoteName]) current = \"FrankerFaceZ\";\n }\n\n if (!Emotes[current][emoteName] || !modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].get(this.category, \"categories\", bdEmoteSettingIDs[current])) continue;\n const results = nodes[n].match(new RegExp(`([\\\\s]|^)${modules__WEBPACK_IMPORTED_MODULE_2__[\"Utilities\"].escape(emoteModifier ? emoteName + \":\" + emoteModifier : emoteName)}([\\\\s]|$)`));\n if (!results) continue;\n const pre = nodes[n].substring(0, results.index + results[1].length);\n const post = nodes[n].substring(results.index + results[0].length - results[2].length);\n nodes[n] = pre;\n const emoteComponent = modules__WEBPACK_IMPORTED_MODULE_2__[\"DiscordModules\"].React.createElement(_ui_emote__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: emoteName,\n url: Emotes[current][emoteName],\n modifier: emoteModifier,\n isFavorite: this.isFavorite(emoteName)\n });\n nodes.splice(n + 1, 0, post);\n nodes.splice(n + 1, 0, emoteComponent);\n }\n }\n }\n\n const onlyEmotes = nodes.every(r => {\n if (typeof r == \"string\" && r.replace(/\\s*/, \"\") == \"\") return true;else if (r.type && r.type.name == \"BDEmote\") return true;else if (r.props && r.props.children && r.props.children.props && r.props.children.props.emojiName) return true;\n return false;\n });\n if (!onlyEmotes) return;\n\n for (const node of nodes) {\n if (typeof node != \"object\") continue;\n if (node.type.name == \"BDEmote\") node.props.jumboable = true;else if (node.props && node.props.children && node.props.children.props && node.props.children.props.emojiName) node.props.children.props.jumboable = true;\n }\n });\n });\n }\n\n async loadEmoteData(emoteInfo) {\n this.emotesLoaded = false;\n\n const _fs = __webpack_require__(/*! fs */ \"fs\");\n\n const emoteFile = \"emote_data.json\";\n const file = data__WEBPACK_IMPORTED_MODULE_1__[\"Config\"].dataPath + emoteFile;\n\n const exists = _fs.existsSync(file);\n\n if (exists && this.isCacheValid()) {\n _ui_toasts__WEBPACK_IMPORTED_MODULE_4__[\"default\"].show(\"Loading emotes from cache.\", {\n type: \"info\"\n });\n this.log(\"Loading emotes from local cache.\");\n const data = await new Promise(resolve => {\n _fs.readFile(file, \"utf8\", (err, content) => {\n this.log(\"Emotes loaded from cache.\");\n if (err) content = {};\n resolve(content);\n });\n });\n const parsed = modules__WEBPACK_IMPORTED_MODULE_2__[\"Utilities\"].testJSON(data);\n let isValid = !!parsed;\n if (isValid) Object.assign(Emotes, parsed);\n\n for (const e in emoteInfo) {\n isValid = Object.keys(Emotes[emoteInfo[e].variable]).length > 0;\n }\n\n if (isValid) {\n _ui_toasts__WEBPACK_IMPORTED_MODULE_4__[\"default\"].show(\"Emotes successfully loaded.\", {\n type: \"success\"\n });\n this.emotesLoaded = true;\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].dispatch(\"emotes-loaded\");\n return;\n }\n\n this.log(\"Cache was corrupt, downloading...\");\n\n _fs.unlinkSync(file);\n }\n\n if (!modules__WEBPACK_IMPORTED_MODULE_2__[\"Settings\"].get(this.category, \"general\", \"download\")) return;\n _ui_toasts__WEBPACK_IMPORTED_MODULE_4__[\"default\"].show(modules__WEBPACK_IMPORTED_MODULE_2__[\"Strings\"].Emotes.downloading, {\n type: \"info\"\n });\n\n for (const e in emoteInfo) {\n await new Promise(r => setTimeout(r, 1000));\n const data = await this.downloadEmotes(emoteInfo[e]);\n Emotes[emoteInfo[e].variable] = data;\n }\n\n _ui_toasts__WEBPACK_IMPORTED_MODULE_4__[\"default\"].show(modules__WEBPACK_IMPORTED_MODULE_2__[\"Strings\"].Emotes.downloaded, {\n type: \"success\"\n });\n\n try {\n _fs.writeFileSync(file, JSON.stringify(Emotes), \"utf8\");\n } catch (err) {\n this.stacktrace(\"Could not save emote data.\", err);\n }\n\n this.emotesLoaded = true;\n modules__WEBPACK_IMPORTED_MODULE_2__[\"Events\"].dispatch(\"emotes-loaded\");\n }\n\n downloadEmotes(emoteMeta) {\n const repoFile = modules__WEBPACK_IMPORTED_MODULE_2__[\"Utilities\"].repoUrl(`data/emotes/${emoteMeta.variable.toLowerCase()}.json`);\n if (emoteMeta.url && !emoteMeta.backup) emoteMeta.backup = repoFile;\n if (!emoteMeta.url) emoteMeta.url = repoFile;\n const options = {\n url: emoteMeta.url,\n timeout: emoteMeta.timeout ? emoteMeta.timeout : 5000,\n json: true\n };\n this.log(`Downloading: ${emoteMeta.variable} (${emoteMeta.url})`);\n return new Promise((resolve, reject) => {\n request.get(options, (error, response, parsedData) => {\n if (error) {\n this.stacktrace(\"Could not download \" + emoteMeta.variable, error);\n\n if (emoteMeta.backup || emoteMeta.url) {\n emoteMeta.url = emoteMeta.backup;\n emoteMeta.backup = null;\n if (emoteMeta.backupParser) emoteMeta.parser = emoteMeta.backupParser;\n return resolve(this.downloadEmotes(emoteMeta));\n }\n\n return reject({});\n }\n\n if (typeof emoteMeta.parser === \"function\") parsedData = emoteMeta.parser(parsedData);\n\n for (const emote in parsedData) {\n if (emote.length < 4 || blacklist.includes(emote)) {\n delete parsedData[emote];\n continue;\n }\n\n parsedData[emote] = emoteMeta.getEmoteURL(parsedData[emote]);\n }\n\n resolve(parsedData);\n this.log(\"Downloaded: \" + emoteMeta.variable);\n });\n });\n }\n\n getBlacklist() {\n return new Promise(resolve => {\n request.get({\n url: modules__WEBPACK_IMPORTED_MODULE_2__[\"Utilities\"].repoUrl(`data/emotes/blacklist.json`),\n json: true\n }, (err, resp, data) => {\n if (err || resp.statusCode != 200) return resolve();\n resolve(blacklist.push(...data));\n });\n });\n }\n\n isCacheValid() {\n const cacheLength = modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].getBDData(\"emoteCacheDays\") || modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].setBDData(\"emoteCacheDays\", 7) || 7;\n const cacheDate = new Date(modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].getBDData(\"emoteCacheDate\") || null);\n const currentDate = new Date();\n const daysBetween = Math.round(Math.abs((currentDate.getTime() - cacheDate.getTime()) / (24 * 60 * 60 * 1000)));\n\n if (daysBetween > cacheLength) {\n modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].setBDData(\"emoteCacheDate\", currentDate.toJSON());\n return false;\n }\n\n return true;\n }\n\n clearEmoteData() {\n const _fs = __webpack_require__(/*! fs */ \"fs\");\n\n const emoteFile = \"emote_data.json\";\n const file = data__WEBPACK_IMPORTED_MODULE_1__[\"Config\"].dataPath + emoteFile;\n\n const exists = _fs.existsSync(file);\n\n if (exists) _fs.unlinkSync(file);\n modules__WEBPACK_IMPORTED_MODULE_2__[\"DataStore\"].setBDData(\"emoteCacheDate\", new Date().toJSON());\n\n for (const category in Emotes) Object.assign(Emotes, {\n [category]: {}\n });\n }\n\n}());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL2J1aWx0aW5zL2Vtb3Rlcy5qcz82YTA0Il0sIm5hbWVzIjpbInJlcXVlc3QiLCJyZXF1aXJlIiwiRW1vdGVzIiwiVHdpdGNoR2xvYmFsIiwiVHdpdGNoU3Vic2NyaWJlciIsIkJUVFYiLCJGcmFua2VyRmFjZVoiLCJCVFRWMiIsImJkRW1vdGVTZXR0aW5nSURzIiwiYmxhY2tsaXN0Iiwib3ZlcnJpZGVzIiwibW9kaWZpZXJzIiwiRW1vdGVNb2R1bGUiLCJCdWlsdGluIiwibmFtZSIsImNvbGxlY3Rpb24iLCJjYXRlZ29yeSIsImlkIiwiY2F0ZWdvcmllcyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJrIiwiaXNDYXRlZ29yeUVuYWJsZWQiLCJnZXQiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIldlYnBhY2tNb2R1bGVzIiwiZ2V0TW9kdWxlIiwibSIsImRlZmF1bHRQcm9wcyIsImhhc093blByb3BlcnR5IiwiZmF2b3JpdGVzIiwiZmF2b3JpdGVFbW90ZXMiLCJnZXRDYXRlZ29yeSIsImluaXRpYWxpemUiLCJmZSIsIkRhdGFTdG9yZSIsImdldEJERGF0YSIsIkpTT04iLCJwYXJzZSIsIndpbmRvdyIsImF0b2IiLCJzYXZlRmF2b3JpdGVzIiwiYWRkRmF2b3JpdGUiLCJiaW5kIiwicmVtb3ZlRmF2b3JpdGUiLCJlbmFibGVkIiwiU2V0dGluZ3MiLCJyZWdpc3RlckNvbGxlY3Rpb24iLCJFbW90ZUNvbmZpZyIsInRpdGxlIiwiU3RyaW5ncyIsImNsZWFyRW1vdGVzIiwib25DbGljayIsImNsZWFyRW1vdGVEYXRhIiwibG9hZEVtb3RlRGF0YSIsIkVtb3RlSW5mbyIsImdldEJsYWNrbGlzdCIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsInBhdGNoTWVzc2FnZUNvbnRlbnQiLCJFdmVudHMiLCJvbiIsImRpc2FibGVkIiwib2ZmIiwicmVtb3ZlQ29sbGVjdGlvbiIsImVtcHR5RW1vdGVzIiwiY2FuY2VsRW1vdGVSZW5kZXIiLCJ1cmwiLCJpc0Zhdm9yaXRlIiwic2V0QkREYXRhIiwiYnRvYSIsInN0cmluZ2lmeSIsImNhdCIsImFzc2lnbiIsImFmdGVyIiwicHJvdG90eXBlIiwidGhpc09iaiIsImFyZ3MiLCJyZXRWYWwiLCJwcm9wcyIsInQiLCJhIiwicmV0dXJuVmFsdWUiLCJsZW5ndGgiLCJtYXJrdXAiLCJjaGlsZHJlbiIsIm5vZGVzIiwibiIsIm5vZGUiLCJ3b3JkcyIsInNwbGl0IiwiYyIsImNsZW4iLCJ3Iiwid2xlbiIsImVtb3RlIiwiZW1vdGVTcGxpdCIsImVtb3RlTmFtZSIsImVtb3RlTW9kaWZpZXIiLCJlbW90ZU92ZXJyaWRlIiwic2xpY2UiLCJpbmNsdWRlcyIsImN1cnJlbnQiLCJyZXN1bHRzIiwibWF0Y2giLCJSZWdFeHAiLCJVdGlsaXRpZXMiLCJlc2NhcGUiLCJwcmUiLCJzdWJzdHJpbmciLCJpbmRleCIsInBvc3QiLCJlbW90ZUNvbXBvbmVudCIsIkRpc2NvcmRNb2R1bGVzIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50IiwiQkRFbW90ZSIsIm1vZGlmaWVyIiwic3BsaWNlIiwib25seUVtb3RlcyIsImV2ZXJ5IiwiciIsInJlcGxhY2UiLCJ0eXBlIiwiZW1vamlOYW1lIiwianVtYm9hYmxlIiwiZW1vdGVJbmZvIiwiZW1vdGVzTG9hZGVkIiwiX2ZzIiwiZW1vdGVGaWxlIiwiZmlsZSIsIkNvbmZpZyIsImRhdGFQYXRoIiwiZXhpc3RzIiwiZXhpc3RzU3luYyIsImlzQ2FjaGVWYWxpZCIsIlRvYXN0cyIsInNob3ciLCJsb2ciLCJkYXRhIiwicmVhZEZpbGUiLCJlcnIiLCJjb250ZW50IiwicGFyc2VkIiwidGVzdEpTT04iLCJpc1ZhbGlkIiwiZSIsInZhcmlhYmxlIiwiZGlzcGF0Y2giLCJ1bmxpbmtTeW5jIiwiZG93bmxvYWRpbmciLCJkb3dubG9hZEVtb3RlcyIsImRvd25sb2FkZWQiLCJ3cml0ZUZpbGVTeW5jIiwic3RhY2t0cmFjZSIsImVtb3RlTWV0YSIsInJlcG9GaWxlIiwicmVwb1VybCIsInRvTG93ZXJDYXNlIiwiYmFja3VwIiwib3B0aW9ucyIsInRpbWVvdXQiLCJqc29uIiwicmVqZWN0IiwiZXJyb3IiLCJyZXNwb25zZSIsInBhcnNlZERhdGEiLCJiYWNrdXBQYXJzZXIiLCJwYXJzZXIiLCJnZXRFbW90ZVVSTCIsInJlc3AiLCJzdGF0dXNDb2RlIiwicHVzaCIsImNhY2hlTGVuZ3RoIiwiY2FjaGVEYXRlIiwiRGF0ZSIsImN1cnJlbnREYXRlIiwiZGF5c0JldHdlZW4iLCJNYXRoIiwicm91bmQiLCJhYnMiLCJnZXRUaW1lIiwidG9KU09OIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtDQUVBOztBQUNBLE1BQU1BLE9BQU8sR0FBR0MsbUJBQU8sQ0FBQyx3QkFBRCxDQUF2Qjs7QUFFQSxNQUFNQyxNQUFNLEdBQUc7QUFDWEMsY0FBWSxFQUFFLEVBREg7QUFFWEMsa0JBQWdCLEVBQUUsRUFGUDtBQUdYQyxNQUFJLEVBQUUsRUFISztBQUlYQyxjQUFZLEVBQUUsRUFKSDtBQUtYQyxPQUFLLEVBQUU7QUFMSSxDQUFmO0FBUUEsTUFBTUMsaUJBQWlCLEdBQUc7QUFDdEJMLGNBQVksRUFBRSxRQURRO0FBRXRCQyxrQkFBZ0IsRUFBRSxRQUZJO0FBR3RCQyxNQUFJLEVBQUUsTUFIZ0I7QUFJdEJDLGNBQVksRUFBRSxLQUpRO0FBS3RCQyxPQUFLLEVBQUU7QUFMZSxDQUExQjtBQVFBLE1BQU1FLFNBQVMsR0FBRyxFQUFsQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyxDQUFDLFFBQUQsRUFBVyxNQUFYLEVBQW1CLEtBQW5CLENBQWxCO0FBQ0EsTUFBTUMsU0FBUyxHQUFHLENBQUMsTUFBRCxFQUFTLE1BQVQsRUFBaUIsT0FBakIsRUFBMEIsT0FBMUIsRUFBbUMsT0FBbkMsRUFBNEMsT0FBNUMsRUFBcUQsT0FBckQsRUFBOEQsT0FBOUQsRUFBdUUsSUFBdkUsRUFBNkUsSUFBN0UsRUFBbUYsSUFBbkYsRUFBeUYs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NkksV0FBVyxHQUFHLElBQUlELElBQUosRUFBcEI7QUFDQSxVQUFNRSxXQUFXLEdBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXRCxJQUFJLENBQUNFLEdBQUwsQ0FBUyxDQUFDSixXQUFXLENBQUNLLE9BQVosS0FBd0JQLFNBQVMsQ0FBQ08sT0FBVixFQUF6QixLQUFpRCxLQUFLLEVBQUwsR0FBVSxFQUFWLEdBQWUsSUFBaEUsQ0FBVCxDQUFYLENBQXBCOztBQUNBLFFBQUlKLFdBQVcsR0FBR0osV0FBbEIsRUFBK0I7QUFDM0IzSSx1REFBUyxDQUFDbUMsU0FBVixDQUFvQixnQkFBcEIsRUFBc0MyRyxXQUFXLENBQUNNLE1BQVosRUFBdEM7QUFDQSxhQUFPLEtBQVA7QUFDSDs7QUFDRCxXQUFPLElBQVA7QUFDSDs7QUFFRGxJLGdCQUFjLEdBQUc7QUFDYixVQUFNNEUsR0FBRyxHQUFHakksbUJBQU8sQ0FBQyxjQUFELENBQW5COztBQUNBLFVBQU1rSSxTQUFTLEdBQUcsaUJBQWxCO0FBQ0EsVUFBTUMsSUFBSSxHQUFHQywyQ0FBTSxDQUFDQyxRQUFQLEdBQWtCSCxTQUEvQjs7QUFDQSxVQUFNSSxNQUFNLEdBQUdMLEdBQUcsQ0FBQ00sVUFBSixDQUFlSixJQUFmLENBQWY7O0FBQ0EsUUFBSUcsTUFBSixFQUFZTCxHQUFHLENBQUNxQixVQUFKLENBQWVuQixJQUFmO0FBQ1poRyxxREFBUyxDQUFDbUMsU0FBVixDQUFvQixnQkFBcEIsRUFBdUMsSUFBSTBHLElBQUosRUFBRCxDQUFhTyxNQUFiLEVBQXRDOztBQUNBLFNBQUssTUFBTXhLLFFBQVgsSUFBdUJkLE1BQXZCLEVBQStCaUIsTUFBTSxDQUFDd0QsTUFBUCxDQUFjekUsTUFBZCxFQUFzQjtBQUFDLE9BQUNjLFFBQUQsR0FBWTtBQUFiLEtBQXRCO0FBQ2xDOztBQXJSZ0QsQ0FBdEMsRUFBZiIsImZpbGUiOiIuL3NyYy9idWlsdGlucy9lbW90ZXMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQnVpbHRpbiBmcm9tIFwiLi4vc3RydWN0cy9idWlsdGluXCI7XHJcblxyXG5pbXBvcnQge0NvbmZpZywgRW1vdGVJbmZvLCBFbW90ZUNvbmZpZ30gZnJvbSBcImRhdGFcIjtcclxuaW1wb3J0IHtVdGlsaXRpZXMsIFdlYnBhY2tNb2R1bGVzLCBEYXRhU3RvcmUsIERpc2NvcmRNb2R1bGVzLCBFdmVudHMsIFNldHRpbmdzLCBTdHJpbmdzfSBmcm9tIFwibW9kdWxlc1wiO1xyXG5pbXBvcnQgQkRFbW90ZSBmcm9tIFwiLi4vdWkvZW1vdGVcIjtcclxuaW1wb3J0IFRvYXN0cyBmcm9tIFwiLi4vdWkvdG9hc3RzXCI7XHJcbi8vIGltcG9ydCBFbW90ZU1lbnUgZnJvbSBcIi4vZW1vdGVtZW51XCI7XHJcbmNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKFwicmVxdWVzdFwiKTtcclxuXHJcbmNvbnN0IEVtb3RlcyA9IHtcclxuICAgIFR3aXRjaEdsb2JhbDoge30sXHJcbiAgICBUd2l0Y2hTdWJzY3JpYmVyOiB7fSxcclxuICAgIEJUVFY6IHt9LFxyXG4gICAgRnJhbmtlckZhY2VaOiB7fSxcclxuICAgIEJUVFYyOiB7fVxyXG59O1xyXG5cclxuY29uc3QgYmRFbW90ZVNldHRpbmdJRHMgPSB7XHJcbiAgICBUd2l0Y2hHbG9iYWw6IFwidHdpdGNoXCIsXHJcbiAgICBUd2l0Y2hTdWJzY3JpYmVyOiBcInR3aXRjaFwiLFxyXG4gICAgQlRUVjogXCJidHR2XCIsXHJcbiAgICBGcmFua2VyRmFjZVo6IFwiZmZ6XCIsXHJcbiAgICBCVFRWMjogXCJidHR2XCJcclxufTtcclxuXHJcbmNvbnN0IGJsYWNrbGlzdCA9IFtdO1xyXG5jb25zdCBvdmVycmlkZXMgPSBbXCJ0d2l0Y2hcIiwgXCJidHR2XCIsIFwiZmZ6XCJdO1xyXG5jb25zdCBtb2RpZmllcnMgPSBbXCJmbGlwXCIsIFwic3BpblwiLCBcInB1bHNlXCIsIFwic3BpbjJcIiwgXCJzcGluM1wiLCBcIjFzcGluXCIsIFwiMnNwaW5cIiwgXCIzc3BpblwiLCBcInRyXCIsIFwiYmxcIiwgXCJiclwiLCBcInNoYWtlXCIsIFwic2hha2UyXCIsIFwic2hha2UzXCIsIFwiZmxhcFwiXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBFbW90ZU1vZHVsZSBleHRlbmRzIEJ1aWx0aW4ge1xyXG4gICAgZ2V0IG5hbWUoKSB7cmV0dXJuIFwiRW1vdGVzXCI7fVxyXG4gICAgZ2V0IGNvbGxlY3Rpb24oKSB7cmV0dXJuIFwic2V0dGluZ3NcIjt9XHJcbiAgICBnZXQgY2F0ZWdvcnkoKSB7cmV0dXJuIFwiZ2VuZXJhbFwiO31cclxuICAgIGdldCBpZCgpIHtyZXR1cm4gXCJlbW90ZXNcIjt9XHJcbiAgICBnZXQgY2F0ZWdvcmllcygpIHsgcmV0dXJuIE9iamVjdC5rZXlzKGJkRW1vdGVTZXR0aW5nSURzKS5maWx0ZXIoayA9PiB0aGlzLmlzQ2F0ZWdvcnlFbmFibGVkKGJkRW1vdGVTZXR0aW5nSURzW2tdKSk7IH1cclxuXHJcbiAgICBpc0NhdGVnb3J5RW5hYmxlZChpZCkge3JldHVybiBzdXBlci5nZXQoXCJlbW90ZXNcIiwgXCJjYXRlZ29yaWVzXCIsIGlkKTt9XHJcblxyXG4gICAgZ2V0KGlkKSB7cmV0dXJuIHN1cGVyLmdldChcImVtb3Rlc1wiLCBcImdlbmVyYWxcIiwgaWQpO31cclxuXHJcbiAgICBnZXQgTWVzc2FnZUNvbnRlbnRDb21wb25lbnQoKSB7cmV0dXJuIFdlYnBhY2tNb2R1bGVzLmdldE1vZHVsZShtID0+IG0uZGVmYXVsdFByb3BzICYmIG0uZGVmYXVsdFByb3BzLmhhc093blByb3BlcnR5KFwiZGlzYWJsZUJ1dHRvbnNcIikpO31cclxuXHJcbiAgICBnZXQgRW1vdGVzKCkge3JldHVybiBFbW90ZXM7fVxyXG4gICAgZ2V0IFR3aXRjaEdsb2JhbCgpIHtyZXR1cm4gRW1vdGVzLlR3aXRjaEdsb2JhbDt9XHJcbiAgICBnZXQgVHdpdGNoU3Vic2NyaWJlcigpIHtyZXR1cm4gRW1vdGVzLlR3aXRjaFN1YnNjcmliZXI7fVxyXG4gICAgZ2V0IEJUVFYoKSB7cmV0dXJuIEVtb3Rlcy5CVFRWO31cclxuICAgIGdldCBGcmFua2VyRmFjZVooKSB7cmV0dXJuIEVtb3Rlcy5GcmFua2VyRmFjZVo7fVxyXG4gICAgZ2V0IEJUVFYyKCkge3JldHVybiBFbW90ZXMuQlRUVjI7fVxyXG4gICAgZ2V0IGJsYWNrbGlzdCgpIHtyZXR1cm4gYmxhY2tsaXN0O31cclxuICAgIGdldCBmYXZvcml0ZXMoKSB7cmV0dXJuIHRoaXMuZmF2b3JpdGVFbW90ZXM7fVxyXG5cclxuICAgIGdldENhdGVnb3J5KGNhdGVnb3J5KSB7XHJcbiAgICAgICAgcmV0dXJuIEVtb3Rlc1tjYXRlZ29yeV07XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5mYXZvcml0ZUVtb3RlcyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGZlID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkZmF2ZW1vdGVzXCIpO1xyXG4gICAgICAgIGlmIChmZSAhPT0gXCJcIiAmJiBmZSAhPT0gbnVsbCkgdGhpcy5mYXZvcml0ZUVtb3RlcyA9IEpTT04ucGFyc2Uod2luZG93LmF0b2IoZmUpKTtcclxuICAgICAgICB0aGlzLnNhdmVGYXZvcml0ZXMoKTtcclxuICAgICAgICB0aGlzLmFkZEZhdm9yaXRlID0gdGhpcy5hZGRGYXZvcml0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRmF2b3JpdGUgPSB0aGlzLnJlbW92ZUZhdm9yaXRlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgLy8gRW1vdGVDb25maWc7XHJcbiAgICAgICAgLy8gZW1vdGVDb2xsZWN0aW9uLmJ1dHRvbiA9IHt0aXRsZTogXCJDbGVhciBFbW90ZSBDYWNoZVwiLCBvbkNsaWNrOiAoKSA9PiB7IHRoaXMuY2xlYXJFbW90ZURhdGEoKTsgdGhpcy5sb2FkRW1vdGVEYXRhKEVtb3RlSW5mbyk7IH19O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVuYWJsZWQoKSB7XHJcbiAgICAgICAgU2V0dGluZ3MucmVnaXN0ZXJDb2xsZWN0aW9uKFwiZW1vdGVzXCIsIFwiRW1vdGVzXCIsIEVtb3RlQ29uZmlnLCB7dGl0bGU6IFN0cmluZ3MuRW1vdGVzLmNsZWFyRW1vdGVzLCBvbkNsaWNrOiAoKSA9PiB7IHRoaXMuY2xlYXJFbW90ZURhdGEoKTsgdGhpcy5sb2FkRW1vdGVEYXRhKEVtb3RlSW5mbyk7IH19KTtcclxuICAgICAgICAvLyBEaXNhYmxlIGVtb3RlIG1vZHVsZSBmb3Igbm93IGJlY2F1c2UgaXQncyBhbm5veWluZyBhbmQgc2xvd1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0QmxhY2tsaXN0KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkRW1vdGVEYXRhKEVtb3RlSW5mbyk7XHJcblxyXG4gICAgICAgIHdoaWxlICghdGhpcy5NZXNzYWdlQ29udGVudENvbXBvbmVudCkgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xyXG4gICAgICAgIHRoaXMucGF0Y2hNZXNzYWdlQ29udGVudCgpO1xyXG4gICAgICAgIEV2ZW50cy5vbihcImVtb3Rlcy1mYXZvcml0ZS1hZGRlZFwiLCB0aGlzLmFkZEZhdm9yaXRlKTtcclxuICAgICAgICBFdmVudHMub24oXCJlbW90ZXMtZmF2b3JpdGUtcmVtb3ZlZFwiLCB0aGlzLnJlbW92ZUZhdm9yaXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlZCgpIHtcclxuICAgICAgICBFdmVudHMub2ZmKFwiZW1vdGVzLWZhdm9yaXRlLWFkZGVkXCIsIHRoaXMuYWRkRmF2b3JpdGUpO1xyXG4gICAgICAgIEV2ZW50cy5vZmYoXCJlbW90ZXMtZmF2b3JpdGUtcmVtb3ZlZFwiLCB0aGlzLnJlbW92ZUZhdm9yaXRlKTtcclxuICAgICAgICBTZXR0aW5ncy5yZW1vdmVDb2xsZWN0aW9uKFwiZW1vdGVzXCIpO1xyXG4gICAgICAgIHRoaXMuZW1wdHlFbW90ZXMoKTtcclxuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsRW1vdGVSZW5kZXIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRmF2b3JpdGUobmFtZSwgdXJsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZhdm9yaXRlRW1vdGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB0aGlzLmZhdm9yaXRlRW1vdGVzW25hbWVdID0gdXJsO1xyXG4gICAgICAgIHRoaXMuc2F2ZUZhdm9yaXRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZhdm9yaXRlKG5hbWUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZmF2b3JpdGVFbW90ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHJldHVybjtcclxuICAgICAgICBkZWxldGUgdGhpcy5mYXZvcml0ZUVtb3Rlc1tuYW1lXTtcclxuICAgICAgICB0aGlzLnNhdmVGYXZvcml0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0Zhdm9yaXRlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mYXZvcml0ZUVtb3Rlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlRmF2b3JpdGVzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGZhdmVtb3Rlc1wiLCB3aW5kb3cuYnRvYShKU09OLnN0cmluZ2lmeSh0aGlzLmZhdm9yaXRlRW1vdGVzKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGVtcHR5RW1vdGVzKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgY2F0IGluIEVtb3RlcykgT2JqZWN0LmFzc2lnbihFbW90ZXMsIHtbY2F0XToge319KTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaE1lc3NhZ2VDb250ZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IHRoaXMuYWZ0ZXIodGhpcy5NZXNzYWdlQ29udGVudENvbXBvbmVudC5wcm90b3R5cGUsIFwicmVuZGVyXCIsICh0aGlzT2JqLCBhcmdzLCByZXRWYWwpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZnRlcihyZXRWYWwucHJvcHMsIFwiY2hpbGRyZW5cIiwgKHQsIGEsIHJldHVyblZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrdXAgPSByZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXTtcclxuICAgICAgICAgICAgICAgIGlmICghbWFya3VwLnByb3BzLmNoaWxkcmVuKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlcyA9IG1hcmt1cC5wcm9wcy5jaGlsZHJlblsxXTtcclxuICAgICAgICAgICAgICAgIGlmICghbm9kZXMgfHwgIW5vZGVzLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tuXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG5vZGUpICE9PSBcInN0cmluZ1wiKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5vZGUuc3BsaXQoLyhbXlxcc10rKShbXFxzXXwkKS9nKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY2xlbiA9IHRoaXMuY2F0ZWdvcmllcy5sZW5ndGg7IGMgPCBjbGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdyA9IDAsIHdsZW4gPSB3b3Jkcy5sZW5ndGg7IHcgPCB3bGVuOyB3KyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb3RlID0gd29yZHNbd107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW90ZVNwbGl0ID0gZW1vdGUuc3BsaXQoXCI6XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vdGVOYW1lID0gZW1vdGVTcGxpdFswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbW90ZU1vZGlmaWVyID0gZW1vdGVTcGxpdFsxXSA/IGVtb3RlU3BsaXRbMV0gOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVtb3RlT3ZlcnJpZGUgPSBlbW90ZU1vZGlmaWVyLnNsaWNlKDApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW90ZU5hbWUubGVuZ3RoIDwgNCB8fCBibGFja2xpc3QuaW5jbHVkZXMoZW1vdGVOYW1lKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGlmaWVycy5pbmNsdWRlcyhlbW90ZU1vZGlmaWVyKSB8fCAhU2V0dGluZ3MuZ2V0KHRoaXMuY2F0ZWdvcnksIFwiZ2VuZXJhbFwiLCBcIm1vZGlmaWVyc1wiKSkgZW1vdGVNb2RpZmllciA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW92ZXJyaWRlcy5pbmNsdWRlcyhlbW90ZU92ZXJyaWRlKSkgZW1vdGVPdmVycmlkZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGVtb3RlTW9kaWZpZXIgPSBlbW90ZU92ZXJyaWRlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5jYXRlZ29yaWVzW2NdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb3RlT3ZlcnJpZGUgPT09IFwidHdpdGNoXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW1vdGVzLlR3aXRjaEdsb2JhbFtlbW90ZU5hbWVdKSBjdXJyZW50ID0gXCJUd2l0Y2hHbG9iYWxcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChFbW90ZXMuVHdpdGNoU3Vic2NyaWJlcltlbW90ZU5hbWVdKSBjdXJyZW50ID0gXCJUd2l0Y2hTdWJzY3JpYmVyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbW90ZU92ZXJyaWRlID09PSBcImJ0dHZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbW90ZXMuQlRUVltlbW90ZU5hbWVdKSBjdXJyZW50ID0gXCJCVFRWXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRW1vdGVzLkJUVFYyW2Vtb3RlTmFtZV0pIGN1cnJlbnQgPSBcIkJUVFYyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbW90ZU92ZXJyaWRlID09PSBcImZmelwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVtb3Rlcy5GcmFua2VyRmFjZVpbZW1vdGVOYW1lXSkgY3VycmVudCA9IFwiRnJhbmtlckZhY2VaXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFbW90ZXNbY3VycmVudF1bZW1vdGVOYW1lXSB8fCAhU2V0dGluZ3MuZ2V0KHRoaXMuY2F0ZWdvcnksIFwiY2F0ZWdvcmllc1wiLCBiZEVtb3RlU2V0dGluZ0lEc1tjdXJyZW50XSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IG5vZGVzW25dLm1hdGNoKG5ldyBSZWdFeHAoYChbXFxcXHNdfF4pJHtVdGlsaXRpZXMuZXNjYXBlKGVtb3RlTW9kaWZpZXIgPyBlbW90ZU5hbWUgKyBcIjpcIiArIGVtb3RlTW9kaWZpZXIgOiBlbW90ZU5hbWUpfShbXFxcXHNdfCQpYCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRzKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZSA9IG5vZGVzW25dLnN1YnN0cmluZygwLCByZXN1bHRzLmluZGV4ICsgcmVzdWx0c1sxXS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zdCA9IG5vZGVzW25dLnN1YnN0cmluZyhyZXN1bHRzLmluZGV4ICsgcmVzdWx0c1swXS5sZW5ndGggLSByZXN1bHRzWzJdLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1tuXSA9IHByZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb3RlQ29tcG9uZW50ID0gRGlzY29yZE1vZHVsZXMuUmVhY3QuY3JlYXRlRWxlbWVudChCREVtb3RlLCB7bmFtZTogZW1vdGVOYW1lLCB1cmw6IEVtb3Rlc1tjdXJyZW50XVtlbW90ZU5hbWVdLCBtb2RpZmllcjogZW1vdGVNb2RpZmllciwgaXNGYXZvcml0ZTogdGhpcy5pc0Zhdm9yaXRlKGVtb3RlTmFtZSl9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShuICsgMSwgMCwgcG9zdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UobiArIDEsIDAsIGVtb3RlQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IG9ubHlFbW90ZXMgPSBub2Rlcy5ldmVyeShyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHIpID09IFwic3RyaW5nXCIgJiYgci5yZXBsYWNlKC9cXHMqLywgXCJcIikgPT0gXCJcIikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoci50eXBlICYmIHIudHlwZS5uYW1lID09IFwiQkRFbW90ZVwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyLnByb3BzICYmIHIucHJvcHMuY2hpbGRyZW4gJiYgci5wcm9wcy5jaGlsZHJlbi5wcm9wcyAmJiByLnByb3BzLmNoaWxkcmVuLnByb3BzLmVtb2ppTmFtZSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9ubHlFbW90ZXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG5vZGUpICE9IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUubmFtZSA9PSBcIkJERW1vdGVcIikgbm9kZS5wcm9wcy5qdW1ib2FibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucHJvcHMgJiYgbm9kZS5wcm9wcy5jaGlsZHJlbiAmJiBub2RlLnByb3BzLmNoaWxkcmVuLnByb3BzICYmIG5vZGUucHJvcHMuY2hpbGRyZW4ucHJvcHMuZW1vamlOYW1lKSBub2RlLnByb3BzLmNoaWxkcmVuLnByb3BzLmp1bWJvYWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRFbW90ZURhdGEoZW1vdGVJbmZvKSB7XHJcbiAgICAgICAgdGhpcy5lbW90ZXNMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBfZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbiAgICAgICAgY29uc3QgZW1vdGVGaWxlID0gXCJlbW90ZV9kYXRhLmpzb25cIjtcclxuICAgICAgICBjb25zdCBmaWxlID0gQ29uZmlnLmRhdGFQYXRoICsgZW1vdGVGaWxlO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IF9mcy5leGlzdHNTeW5jKGZpbGUpO1xyXG5cclxuICAgICAgICBpZiAoZXhpc3RzICYmIHRoaXMuaXNDYWNoZVZhbGlkKCkpIHtcclxuICAgICAgICAgICAgVG9hc3RzLnNob3coXCJMb2FkaW5nIGVtb3RlcyBmcm9tIGNhY2hlLlwiLCB7dHlwZTogXCJpbmZvXCJ9KTtcclxuICAgICAgICAgICAgdGhpcy5sb2coXCJMb2FkaW5nIGVtb3RlcyBmcm9tIGxvY2FsIGNhY2hlLlwiKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgICAgIF9mcy5yZWFkRmlsZShmaWxlLCBcInV0ZjhcIiwgKGVyciwgY29udGVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKFwiRW1vdGVzIGxvYWRlZCBmcm9tIGNhY2hlLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSBjb250ZW50ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb250ZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFV0aWxpdGllcy50ZXN0SlNPTihkYXRhKTtcclxuICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSAhIXBhcnNlZDtcclxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIE9iamVjdC5hc3NpZ24oRW1vdGVzLCBwYXJzZWQpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBlIGluIGVtb3RlSW5mbykge1xyXG4gICAgICAgICAgICAgICAgaXNWYWxpZCA9IE9iamVjdC5rZXlzKEVtb3Rlc1tlbW90ZUluZm9bZV0udmFyaWFibGVdKS5sZW5ndGggPiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICAgICAgICAgICAgVG9hc3RzLnNob3coXCJFbW90ZXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZC5cIiwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtb3Rlc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBFdmVudHMuZGlzcGF0Y2goXCJlbW90ZXMtbG9hZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvZyhcIkNhY2hlIHdhcyBjb3JydXB0LCBkb3dubG9hZGluZy4uLlwiKTtcclxuICAgICAgICAgICAgX2ZzLnVubGlua1N5bmMoZmlsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIVNldHRpbmdzLmdldCh0aGlzLmNhdGVnb3J5LCBcImdlbmVyYWxcIiwgXCJkb3dubG9hZFwiKSkgcmV0dXJuO1xyXG4gICAgICAgIFRvYXN0cy5zaG93KFN0cmluZ3MuRW1vdGVzLmRvd25sb2FkaW5nLCB7dHlwZTogXCJpbmZvXCJ9KTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBlIGluIGVtb3RlSW5mbykge1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMTAwMCkpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kb3dubG9hZEVtb3RlcyhlbW90ZUluZm9bZV0pO1xyXG4gICAgICAgICAgICBFbW90ZXNbZW1vdGVJbmZvW2VdLnZhcmlhYmxlXSA9IGRhdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBUb2FzdHMuc2hvdyhTdHJpbmdzLkVtb3Rlcy5kb3dubG9hZGVkLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuXHJcbiAgICAgICAgdHJ5IHsgX2ZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkoRW1vdGVzKSwgXCJ1dGY4XCIpOyB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikgeyB0aGlzLnN0YWNrdHJhY2UoXCJDb3VsZCBub3Qgc2F2ZSBlbW90ZSBkYXRhLlwiLCBlcnIpOyB9XHJcblxyXG4gICAgICAgIHRoaXMuZW1vdGVzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICBFdmVudHMuZGlzcGF0Y2goXCJlbW90ZXMtbG9hZGVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkRW1vdGVzKGVtb3RlTWV0YSkge1xyXG4gICAgICAgIGNvbnN0IHJlcG9GaWxlID0gVXRpbGl0aWVzLnJlcG9VcmwoYGRhdGEvZW1vdGVzLyR7ZW1vdGVNZXRhLnZhcmlhYmxlLnRvTG93ZXJDYXNlKCl9Lmpzb25gKTtcclxuICAgICAgICBpZiAoZW1vdGVNZXRhLnVybCAmJiAhZW1vdGVNZXRhLmJhY2t1cCkgZW1vdGVNZXRhLmJhY2t1cCA9IHJlcG9GaWxlO1xyXG4gICAgICAgIGlmICghZW1vdGVNZXRhLnVybCkgZW1vdGVNZXRhLnVybCA9IHJlcG9GaWxlO1xyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICB1cmw6IGVtb3RlTWV0YS51cmwsXHJcbiAgICAgICAgICAgIHRpbWVvdXQ6IGVtb3RlTWV0YS50aW1lb3V0ID8gZW1vdGVNZXRhLnRpbWVvdXQgOiA1MDAwLFxyXG4gICAgICAgICAgICBqc29uOiB0cnVlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5sb2coYERvd25sb2FkaW5nOiAke2Vtb3RlTWV0YS52YXJpYWJsZX0gKCR7ZW1vdGVNZXRhLnVybH0pYCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QuZ2V0KG9wdGlvbnMsIChlcnJvciwgcmVzcG9uc2UsIHBhcnNlZERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2t0cmFjZShcIkNvdWxkIG5vdCBkb3dubG9hZCBcIiArIGVtb3RlTWV0YS52YXJpYWJsZSwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW90ZU1ldGEuYmFja3VwIHx8IGVtb3RlTWV0YS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1vdGVNZXRhLnVybCA9IGVtb3RlTWV0YS5iYWNrdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtb3RlTWV0YS5iYWNrdXAgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vdGVNZXRhLmJhY2t1cFBhcnNlcikgZW1vdGVNZXRhLnBhcnNlciA9IGVtb3RlTWV0YS5iYWNrdXBQYXJzZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHRoaXMuZG93bmxvYWRFbW90ZXMoZW1vdGVNZXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3Qoe30pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZW1vdGVNZXRhLnBhcnNlcikgPT09IFwiZnVuY3Rpb25cIikgcGFyc2VkRGF0YSA9IGVtb3RlTWV0YS5wYXJzZXIocGFyc2VkRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbW90ZSBpbiBwYXJzZWREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtb3RlLmxlbmd0aCA8IDQgfHwgYmxhY2tsaXN0LmluY2x1ZGVzKGVtb3RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFyc2VkRGF0YVtlbW90ZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhW2Vtb3RlXSA9IGVtb3RlTWV0YS5nZXRFbW90ZVVSTChwYXJzZWREYXRhW2Vtb3RlXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHBhcnNlZERhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2coXCJEb3dubG9hZGVkOiBcIiArIGVtb3RlTWV0YS52YXJpYWJsZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJsYWNrbGlzdCgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QuZ2V0KHt1cmw6IFV0aWxpdGllcy5yZXBvVXJsKGBkYXRhL2Vtb3Rlcy9ibGFja2xpc3QuanNvbmApLCBqc29uOiB0cnVlfSwgKGVyciwgcmVzcCwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyciB8fCByZXNwLnN0YXR1c0NvZGUgIT0gMjAwKSByZXR1cm4gcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShibGFja2xpc3QucHVzaCguLi5kYXRhKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQ2FjaGVWYWxpZCgpIHtcclxuICAgICAgICBjb25zdCBjYWNoZUxlbmd0aCA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJlbW90ZUNhY2hlRGF5c1wiKSB8fCBEYXRhU3RvcmUuc2V0QkREYXRhKFwiZW1vdGVDYWNoZURheXNcIiwgNykgfHwgNztcclxuICAgICAgICBjb25zdCBjYWNoZURhdGUgPSBuZXcgRGF0ZShEYXRhU3RvcmUuZ2V0QkREYXRhKFwiZW1vdGVDYWNoZURhdGVcIikgfHwgbnVsbCk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IGRheXNCZXR3ZWVuID0gTWF0aC5yb3VuZChNYXRoLmFicygoY3VycmVudERhdGUuZ2V0VGltZSgpIC0gY2FjaGVEYXRlLmdldFRpbWUoKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpKTtcclxuICAgICAgICBpZiAoZGF5c0JldHdlZW4gPiBjYWNoZUxlbmd0aCkge1xyXG4gICAgICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiZW1vdGVDYWNoZURhdGVcIiwgY3VycmVudERhdGUudG9KU09OKCkpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyRW1vdGVEYXRhKCkge1xyXG4gICAgICAgIGNvbnN0IF9mcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuICAgICAgICBjb25zdCBlbW90ZUZpbGUgPSBcImVtb3RlX2RhdGEuanNvblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBDb25maWcuZGF0YVBhdGggKyBlbW90ZUZpbGU7XHJcbiAgICAgICAgY29uc3QgZXhpc3RzID0gX2ZzLmV4aXN0c1N5bmMoZmlsZSk7XHJcbiAgICAgICAgaWYgKGV4aXN0cykgX2ZzLnVubGlua1N5bmMoZmlsZSk7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImVtb3RlQ2FjaGVEYXRlXCIsIChuZXcgRGF0ZSgpKS50b0pTT04oKSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBpbiBFbW90ZXMpIE9iamVjdC5hc3NpZ24oRW1vdGVzLCB7W2NhdGVnb3J5XToge319KTtcclxuICAgIH1cclxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/builtins/emotes.js\n"); /***/ }), @@ -311,7 +311,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n TwitchGlobal: {\n url: \"https://twitchemotes.com/api_cache/v3/global.json\",\n backup: `https://rauenzi.github.io/BetterDiscordApp/data/emotedata_twitch_global.json`,\n variable: \"TwitchGlobal\",\n getEmoteURL: e => `https://static-cdn.jtvnw.net/emoticons/v1/${e.id}/1.0`,\n getOldData: (url, name) => {\n return {\n id: url.match(/\\/([0-9]+)\\//)[1],\n code: name,\n emoticon_set: 0,\n description: null\n };\n }\n },\n TwitchSubscriber: {\n url: `https://rauenzi.github.io/BetterDiscordApp/data/emotedata_twitch_subscriber.json`,\n variable: \"TwitchSubscriber\",\n getEmoteURL: e => `https://static-cdn.jtvnw.net/emoticons/v1/${e}/1.0`,\n getOldData: url => url.match(/\\/([0-9]+)\\//)[1]\n },\n FrankerFaceZ: {\n url: `https://rauenzi.github.io/BetterDiscordApp/data/emotedata_ffz.json`,\n variable: \"FrankerFaceZ\",\n getEmoteURL: e => `https://cdn.frankerfacez.com/emoticon/${e}/1`,\n getOldData: url => url.match(/\\/([0-9]+)\\//)[1]\n },\n BTTV: {\n url: \"https://api.betterttv.net/emotes\",\n variable: \"BTTV\",\n parser: data => {\n const emotes = {};\n\n for (let e = 0, len = data.emotes.length; e < len; e++) {\n const emote = data.emotes[e];\n emotes[emote.regex] = emote.url;\n }\n\n return emotes;\n },\n getEmoteURL: e => `${e}`,\n getOldData: url => url\n },\n BTTV2: {\n url: `https://rauenzi.github.io/BetterDiscordApp/data/emotedata_bttv.json`,\n variable: \"BTTV2\",\n oldVariable: \"emotesBTTV2\",\n getEmoteURL: e => `https://cdn.betterttv.net/emote/${e}/1x`,\n getOldData: url => url.match(/emote\\/(.+)\\//)[1]\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL2RhdGEvZW1vdGVzL2luZm8uanM/OWY4ZSJdLCJuYW1lcyI6WyJUd2l0Y2hHbG9iYWwiLCJ1cmwiLCJiYWNrdXAiLCJ2YXJpYWJsZSIsImdldEVtb3RlVVJMIiwiZSIsImlkIiwiZ2V0T2xkRGF0YSIsIm5hbWUiLCJtYXRjaCIsImNvZGUiLCJlbW90aWNvbl9zZXQiLCJkZXNjcmlwdGlvbiIsIlR3aXRjaFN1YnNjcmliZXIiLCJGcmFua2VyRmFjZVoiLCJCVFRWIiwicGFyc2VyIiwiZGF0YSIsImVtb3RlcyIsImxlbiIsImxlbmd0aCIsImVtb3RlIiwicmVnZXgiLCJCVFRWMiIsIm9sZFZhcmlhYmxlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFlO0FBQ1hBLGNBQVksRUFBRTtBQUNWQyxPQUFHLEVBQUUsbURBREs7QUFFVkMsVUFBTSxFQUFHLDhFQUZDO0FBR1ZDLFlBQVEsRUFBRSxjQUhBO0FBSVZDLGVBQVcsRUFBR0MsQ0FBRCxJQUFRLDZDQUE0Q0EsQ0FBQyxDQUFDQyxFQUFHLE1BSjVEO0FBS1ZDLGNBQVUsRUFBRSxDQUFDTixHQUFELEVBQU1PLElBQU4sS0FBZTtBQUFFLGFBQU87QUFBQ0YsVUFBRSxFQUFFTCxHQUFHLENBQUNRLEtBQUosQ0FBVSxjQUFWLEVBQTBCLENBQTFCLENBQUw7QUFBbUNDLFlBQUksRUFBRUYsSUFBekM7QUFBK0NHLG9CQUFZLEVBQUUsQ0FBN0Q7QUFBZ0VDLG1CQUFXLEVBQUU7QUFBN0UsT0FBUDtBQUE0RjtBQUwvRyxHQURIO0FBUVhDLGtCQUFnQixFQUFFO0FBQ2RaLE9BQUcsRUFBRyxrRkFEUTtBQUVkRSxZQUFRLEVBQUUsa0JBRkk7QUFHZEMsZUFBVyxFQUFHQyxDQUFELElBQVEsNkNBQTRDQSxDQUFFLE1BSHJEO0FBSWRFLGNBQVUsRUFBR04sR0FBRCxJQUFTQSxHQUFHLENBQUNRLEtBQUosQ0FBVSxjQUFWLEVBQTBCLENBQTFCO0FBSlAsR0FSUDtBQWNYSyxjQUFZLEVBQUU7QUFDVmIsT0FBRyxFQUFHLG9FQURJO0FBRVZFLFlBQVEsRUFBRSxjQUZBO0FBR1ZDLGVBQVcsRUFBR0MsQ0FBRCxJQUFRLHlDQUF3Q0EsQ0FBRSxJQUhyRDtBQUlWRSxjQUFVLEVBQUdOLEdBQUQsSUFBU0EsR0FBRyxDQUFDUSxLQUFKLENBQVUsY0FBVixFQUEwQixDQUExQjtBQUpYLEdBZEg7QUFvQlhNLE1BQUksRUFBRTtBQUNGZCxPQUFHLEVBQUUsa0NBREg7QUFFRkUsWUFBUSxFQUFFLE1BRlI7QUFHRmEsVUFBTSxFQUFHQyxJQUFELElBQVU7QUFDZCxZQUFNQyxNQUFNLEdBQUcsRUFBZjs7QUFDQSxXQUFLLElBQUliLENBQUMsR0FBRyxDQUFSLEVBQVdjLEdBQUcsR0FBR0YsSUFBSSxDQUFDQyxNQUFMLENBQVlFLE1BQWxDLEVBQTBDZixDQUFDLEdBQUdjLEdBQTlDLEVBQW1EZCxDQUFDLEVBQXBELEVBQXdEO0FBQ3BELGNBQU1nQixLQUFLLEdBQUdKLElBQUksQ0FBQ0MsTUFBTCxDQUFZYixDQUFaLENBQWQ7QUFDQWEsY0FBTSxDQUFDRyxLQUFLLENBQUNDLEtBQVAsQ0FBTixHQUFzQkQsS0FBSyxDQUFDcEIsR0FBNUI7QUFDSDs7QUFDRCxhQUFPaUIsTUFBUDtBQUNILEtBVkM7QUFXRmQsZUFBVyxFQUFHQyxDQUFELElBQVEsR0FBRUEsQ0FBRSxFQVh2QjtBQVlGRSxjQUFVLEVBQUdOLEdBQUQsSUFBU0E7QUFabkIsR0FwQks7QUFrQ1hzQixPQUFLLEVBQUU7QUFDSHRCLE9BQUcsRUFBRyxxRUFESDtBQUVIRSxZQUFRLEVBQUUsT0FGUDtBQUdIcUIsZUFBVyxFQUFFLGFBSFY7QUFJSHBCLGVBQVcsRUFBR0MsQ0FBRCxJQUFRLG1DQUFrQ0EsQ0FBRSxLQUp0RDtBQUtIRSxjQUFVLEVBQUdOLEdBQUQsSUFBU0EsR0FBRyxDQUFDUSxLQUFKLENBQVUsZUFBVixFQUEyQixDQUEzQjtBQUxsQjtBQWxDSSxDQUFmIiwiZmlsZSI6Ii4vc3JjL2RhdGEvZW1vdGVzL2luZm8uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XHJcbiAgICBUd2l0Y2hHbG9iYWw6IHtcclxuICAgICAgICB1cmw6IFwiaHR0cHM6Ly90d2l0Y2hlbW90ZXMuY29tL2FwaV9jYWNoZS92My9nbG9iYWwuanNvblwiLFxyXG4gICAgICAgIGJhY2t1cDogYGh0dHBzOi8vcmF1ZW56aS5naXRodWIuaW8vQmV0dGVyRGlzY29yZEFwcC9kYXRhL2Vtb3RlZGF0YV90d2l0Y2hfZ2xvYmFsLmpzb25gLFxyXG4gICAgICAgIHZhcmlhYmxlOiBcIlR3aXRjaEdsb2JhbFwiLFxyXG4gICAgICAgIGdldEVtb3RlVVJMOiAoZSkgPT4gYGh0dHBzOi8vc3RhdGljLWNkbi5qdHZudy5uZXQvZW1vdGljb25zL3YxLyR7ZS5pZH0vMS4wYCxcclxuICAgICAgICBnZXRPbGREYXRhOiAodXJsLCBuYW1lKSA9PiB7IHJldHVybiB7aWQ6IHVybC5tYXRjaCgvXFwvKFswLTldKylcXC8vKVsxXSwgY29kZTogbmFtZSwgZW1vdGljb25fc2V0OiAwLCBkZXNjcmlwdGlvbjogbnVsbH07IH1cclxuICAgIH0sXHJcbiAgICBUd2l0Y2hTdWJzY3JpYmVyOiB7XHJcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly9yYXVlbnppLmdpdGh1Yi5pby9CZXR0ZXJEaXNjb3JkQXBwL2RhdGEvZW1vdGVkYXRhX3R3aXRjaF9zdWJzY3JpYmVyLmpzb25gLFxyXG4gICAgICAgIHZhcmlhYmxlOiBcIlR3aXRjaFN1YnNjcmliZXJcIixcclxuICAgICAgICBnZXRFbW90ZVVSTDogKGUpID0+IGBodHRwczovL3N0YXRpYy1jZG4uanR2bncubmV0L2Vtb3RpY29ucy92MS8ke2V9LzEuMGAsXHJcbiAgICAgICAgZ2V0T2xkRGF0YTogKHVybCkgPT4gdXJsLm1hdGNoKC9cXC8oWzAtOV0rKVxcLy8pWzFdXHJcbiAgICB9LFxyXG4gICAgRnJhbmtlckZhY2VaOiB7XHJcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly9yYXVlbnppLmdpdGh1Yi5pby9CZXR0ZXJEaXNjb3JkQXBwL2RhdGEvZW1vdGVkYXRhX2Zmei5qc29uYCxcclxuICAgICAgICB2YXJpYWJsZTogXCJGcmFua2VyRmFjZVpcIixcclxuICAgICAgICBnZXRFbW90ZVVSTDogKGUpID0+IGBodHRwczovL2Nkbi5mcmFua2VyZmFjZXouY29tL2Vtb3RpY29uLyR7ZX0vMWAsXHJcbiAgICAgICAgZ2V0T2xkRGF0YTogKHVybCkgPT4gdXJsLm1hdGNoKC9cXC8oWzAtOV0rKVxcLy8pWzFdXHJcbiAgICB9LFxyXG4gICAgQlRUVjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL2FwaS5iZXR0ZXJ0dHYubmV0L2Vtb3Rlc1wiLFxyXG4gICAgICAgIHZhcmlhYmxlOiBcIkJUVFZcIixcclxuICAgICAgICBwYXJzZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVtb3RlcyA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGxldCBlID0gMCwgbGVuID0gZGF0YS5lbW90ZXMubGVuZ3RoOyBlIDwgbGVuOyBlKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVtb3RlID0gZGF0YS5lbW90ZXNbZV07XHJcbiAgICAgICAgICAgICAgICBlbW90ZXNbZW1vdGUucmVnZXhdID0gZW1vdGUudXJsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBlbW90ZXM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBnZXRFbW90ZVVSTDogKGUpID0+IGAke2V9YCxcclxuICAgICAgICBnZXRPbGREYXRhOiAodXJsKSA9PiB1cmxcclxuICAgIH0sXHJcbiAgICBCVFRWMjoge1xyXG4gICAgICAgIHVybDogYGh0dHBzOi8vcmF1ZW56aS5naXRodWIuaW8vQmV0dGVyRGlzY29yZEFwcC9kYXRhL2Vtb3RlZGF0YV9idHR2Lmpzb25gLFxyXG4gICAgICAgIHZhcmlhYmxlOiBcIkJUVFYyXCIsXHJcbiAgICAgICAgb2xkVmFyaWFibGU6IFwiZW1vdGVzQlRUVjJcIixcclxuICAgICAgICBnZXRFbW90ZVVSTDogKGUpID0+IGBodHRwczovL2Nkbi5iZXR0ZXJ0dHYubmV0L2Vtb3RlLyR7ZX0vMXhgLFxyXG4gICAgICAgIGdldE9sZERhdGE6ICh1cmwpID0+IHVybC5tYXRjaCgvZW1vdGVcXC8oLispXFwvLylbMV1cclxuICAgIH1cclxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/data/emotes/info.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n TwitchGlobal: {\n url: \"https://twitchemotes.com/api_cache/v3/global.json\",\n variable: \"TwitchGlobal\",\n getEmoteURL: e => `https://static-cdn.jtvnw.net/emoticons/v1/${e.id}/1.0`,\n getOldData: (url, name) => {\n return {\n id: url.match(/\\/([0-9]+)\\//)[1],\n code: name,\n emoticon_set: 0,\n description: null\n };\n }\n },\n TwitchSubscriber: {\n variable: \"TwitchSubscriber\",\n getEmoteURL: e => `https://static-cdn.jtvnw.net/emoticons/v1/${e}/1.0`,\n getOldData: url => url.match(/\\/([0-9]+)\\//)[1]\n },\n FrankerFaceZ: {\n variable: \"FrankerFaceZ\",\n getEmoteURL: e => `https://cdn.frankerfacez.com/emoticon/${e}/1`,\n getOldData: url => url.match(/\\/([0-9]+)\\//)[1]\n },\n BTTV: {\n url: \"https://api.betterttv.net/emotes\",\n variable: \"BTTV\",\n parser: data => {\n const emotes = {};\n\n for (let e = 0, len = data.emotes.length; e < len; e++) {\n const emote = data.emotes[e];\n emotes[emote.regex] = emote.url;\n }\n\n return emotes;\n },\n getEmoteURL: e => `${e}`,\n getOldData: url => url\n },\n BTTV2: {\n variable: \"BTTV2\",\n oldVariable: \"emotesBTTV2\",\n getEmoteURL: e => `https://cdn.betterttv.net/emote/${e}/1x`,\n getOldData: url => url.match(/emote\\/(.+)\\//)[1]\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL2RhdGEvZW1vdGVzL2luZm8uanM/OWY4ZSJdLCJuYW1lcyI6WyJUd2l0Y2hHbG9iYWwiLCJ1cmwiLCJ2YXJpYWJsZSIsImdldEVtb3RlVVJMIiwiZSIsImlkIiwiZ2V0T2xkRGF0YSIsIm5hbWUiLCJtYXRjaCIsImNvZGUiLCJlbW90aWNvbl9zZXQiLCJkZXNjcmlwdGlvbiIsIlR3aXRjaFN1YnNjcmliZXIiLCJGcmFua2VyRmFjZVoiLCJCVFRWIiwicGFyc2VyIiwiZGF0YSIsImVtb3RlcyIsImxlbiIsImxlbmd0aCIsImVtb3RlIiwicmVnZXgiLCJCVFRWMiIsIm9sZFZhcmlhYmxlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFlO0FBQ1hBLGNBQVksRUFBRTtBQUNWQyxPQUFHLEVBQUUsbURBREs7QUFFVkMsWUFBUSxFQUFFLGNBRkE7QUFHVkMsZUFBVyxFQUFHQyxDQUFELElBQVEsNkNBQTRDQSxDQUFDLENBQUNDLEVBQUcsTUFINUQ7QUFJVkMsY0FBVSxFQUFFLENBQUNMLEdBQUQsRUFBTU0sSUFBTixLQUFlO0FBQUMsYUFBTztBQUFDRixVQUFFLEVBQUVKLEdBQUcsQ0FBQ08sS0FBSixDQUFVLGNBQVYsRUFBMEIsQ0FBMUIsQ0FBTDtBQUFtQ0MsWUFBSSxFQUFFRixJQUF6QztBQUErQ0csb0JBQVksRUFBRSxDQUE3RDtBQUFnRUMsbUJBQVcsRUFBRTtBQUE3RSxPQUFQO0FBQTJGO0FBSjdHLEdBREg7QUFPWEMsa0JBQWdCLEVBQUU7QUFDZFYsWUFBUSxFQUFFLGtCQURJO0FBRWRDLGVBQVcsRUFBR0MsQ0FBRCxJQUFRLDZDQUE0Q0EsQ0FBRSxNQUZyRDtBQUdkRSxjQUFVLEVBQUdMLEdBQUQsSUFBU0EsR0FBRyxDQUFDTyxLQUFKLENBQVUsY0FBVixFQUEwQixDQUExQjtBQUhQLEdBUFA7QUFZWEssY0FBWSxFQUFFO0FBQ1ZYLFlBQVEsRUFBRSxjQURBO0FBRVZDLGVBQVcsRUFBR0MsQ0FBRCxJQUFRLHlDQUF3Q0EsQ0FBRSxJQUZyRDtBQUdWRSxjQUFVLEVBQUdMLEdBQUQsSUFBU0EsR0FBRyxDQUFDTyxLQUFKLENBQVUsY0FBVixFQUEwQixDQUExQjtBQUhYLEdBWkg7QUFpQlhNLE1BQUksRUFBRTtBQUNGYixPQUFHLEVBQUUsa0NBREg7QUFFRkMsWUFBUSxFQUFFLE1BRlI7QUFHRmEsVUFBTSxFQUFHQyxJQUFELElBQVU7QUFDZCxZQUFNQyxNQUFNLEdBQUcsRUFBZjs7QUFDQSxXQUFLLElBQUliLENBQUMsR0FBRyxDQUFSLEVBQVdjLEdBQUcsR0FBR0YsSUFBSSxDQUFDQyxNQUFMLENBQVlFLE1BQWxDLEVBQTBDZixDQUFDLEdBQUdjLEdBQTlDLEVBQW1EZCxDQUFDLEVBQXBELEVBQXdEO0FBQ3BELGNBQU1nQixLQUFLLEdBQUdKLElBQUksQ0FBQ0MsTUFBTCxDQUFZYixDQUFaLENBQWQ7QUFDQWEsY0FBTSxDQUFDRyxLQUFLLENBQUNDLEtBQVAsQ0FBTixHQUFzQkQsS0FBSyxDQUFDbkIsR0FBNUI7QUFDSDs7QUFDRCxhQUFPZ0IsTUFBUDtBQUNILEtBVkM7QUFXRmQsZUFBVyxFQUFHQyxDQUFELElBQVEsR0FBRUEsQ0FBRSxFQVh2QjtBQVlGRSxjQUFVLEVBQUdMLEdBQUQsSUFBU0E7QUFabkIsR0FqQks7QUErQlhxQixPQUFLLEVBQUU7QUFDSHBCLFlBQVEsRUFBRSxPQURQO0FBRUhxQixlQUFXLEVBQUUsYUFGVjtBQUdIcEIsZUFBVyxFQUFHQyxDQUFELElBQVEsbUNBQWtDQSxDQUFFLEtBSHREO0FBSUhFLGNBQVUsRUFBR0wsR0FBRCxJQUFTQSxHQUFHLENBQUNPLEtBQUosQ0FBVSxlQUFWLEVBQTJCLENBQTNCO0FBSmxCO0FBL0JJLENBQWYiLCJmaWxlIjoiLi9zcmMvZGF0YS9lbW90ZXMvaW5mby5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcclxuICAgIFR3aXRjaEdsb2JhbDoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL3R3aXRjaGVtb3Rlcy5jb20vYXBpX2NhY2hlL3YzL2dsb2JhbC5qc29uXCIsXHJcbiAgICAgICAgdmFyaWFibGU6IFwiVHdpdGNoR2xvYmFsXCIsXHJcbiAgICAgICAgZ2V0RW1vdGVVUkw6IChlKSA9PiBgaHR0cHM6Ly9zdGF0aWMtY2RuLmp0dm53Lm5ldC9lbW90aWNvbnMvdjEvJHtlLmlkfS8xLjBgLFxyXG4gICAgICAgIGdldE9sZERhdGE6ICh1cmwsIG5hbWUpID0+IHtyZXR1cm4ge2lkOiB1cmwubWF0Y2goL1xcLyhbMC05XSspXFwvLylbMV0sIGNvZGU6IG5hbWUsIGVtb3RpY29uX3NldDogMCwgZGVzY3JpcHRpb246IG51bGx9O31cclxuICAgIH0sXHJcbiAgICBUd2l0Y2hTdWJzY3JpYmVyOiB7XHJcbiAgICAgICAgdmFyaWFibGU6IFwiVHdpdGNoU3Vic2NyaWJlclwiLFxyXG4gICAgICAgIGdldEVtb3RlVVJMOiAoZSkgPT4gYGh0dHBzOi8vc3RhdGljLWNkbi5qdHZudy5uZXQvZW1vdGljb25zL3YxLyR7ZX0vMS4wYCxcclxuICAgICAgICBnZXRPbGREYXRhOiAodXJsKSA9PiB1cmwubWF0Y2goL1xcLyhbMC05XSspXFwvLylbMV1cclxuICAgIH0sXHJcbiAgICBGcmFua2VyRmFjZVo6IHtcclxuICAgICAgICB2YXJpYWJsZTogXCJGcmFua2VyRmFjZVpcIixcclxuICAgICAgICBnZXRFbW90ZVVSTDogKGUpID0+IGBodHRwczovL2Nkbi5mcmFua2VyZmFjZXouY29tL2Vtb3RpY29uLyR7ZX0vMWAsXHJcbiAgICAgICAgZ2V0T2xkRGF0YTogKHVybCkgPT4gdXJsLm1hdGNoKC9cXC8oWzAtOV0rKVxcLy8pWzFdXHJcbiAgICB9LFxyXG4gICAgQlRUVjoge1xyXG4gICAgICAgIHVybDogXCJodHRwczovL2FwaS5iZXR0ZXJ0dHYubmV0L2Vtb3Rlc1wiLFxyXG4gICAgICAgIHZhcmlhYmxlOiBcIkJUVFZcIixcclxuICAgICAgICBwYXJzZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVtb3RlcyA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGxldCBlID0gMCwgbGVuID0gZGF0YS5lbW90ZXMubGVuZ3RoOyBlIDwgbGVuOyBlKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVtb3RlID0gZGF0YS5lbW90ZXNbZV07XHJcbiAgICAgICAgICAgICAgICBlbW90ZXNbZW1vdGUucmVnZXhdID0gZW1vdGUudXJsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBlbW90ZXM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBnZXRFbW90ZVVSTDogKGUpID0+IGAke2V9YCxcclxuICAgICAgICBnZXRPbGREYXRhOiAodXJsKSA9PiB1cmxcclxuICAgIH0sXHJcbiAgICBCVFRWMjoge1xyXG4gICAgICAgIHZhcmlhYmxlOiBcIkJUVFYyXCIsXHJcbiAgICAgICAgb2xkVmFyaWFibGU6IFwiZW1vdGVzQlRUVjJcIixcclxuICAgICAgICBnZXRFbW90ZVVSTDogKGUpID0+IGBodHRwczovL2Nkbi5iZXR0ZXJ0dHYubmV0L2Vtb3RlLyR7ZX0vMXhgLFxyXG4gICAgICAgIGdldE9sZERhdGE6ICh1cmwpID0+IHVybC5tYXRjaCgvZW1vdGVcXC8oLispXFwvLylbMV1cclxuICAgIH1cclxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/data/emotes/info.js\n"); /***/ }), @@ -335,7 +335,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n Panels: {\n plugins: \"Plugins\",\n themes: \"Themes\",\n customcss: \"Custom CSS\"\n },\n Collections: {\n settings: {\n name: \"Settings\",\n general: {\n name: \"General\",\n emotes: {\n name: \"Emote System\",\n note: \"Enables BD's emote system\"\n },\n publicServers: {\n name: \"Public Servers\",\n note: \"Display public servers button\"\n },\n voiceDisconnect: {\n name: \"Voice Disconnect\",\n note: \"Disconnect from voice server when closing Discord\"\n },\n twentyFourHour: {\n name: \"24-Hour Timestamps\",\n note: \"Hides channels when in minimal mode\"\n },\n classNormalizer: {\n name: \"Normalize Classes\",\n note: \"Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)\"\n },\n showToasts: {\n name: \"Show Toasts\",\n note: \"Shows a small notification for important information\"\n }\n },\n appearance: {\n name: \"Appearance\",\n voiceMode: {\n name: \"Voice Mode\",\n note: \"Hides everything that isn't voice chat\"\n },\n minimalMode: {\n name: \"Minimal Mode\",\n note: \"Hide elements and reduce the size of elements\"\n },\n hideChannels: {\n name: \"Hide Channels\",\n note: \"Hides channels when in minimal mode\"\n },\n darkMode: {\n name: \"Dark Mode\",\n note: \"Make certain elements dark by default\"\n },\n coloredText: {\n name: \"Colored Text\",\n note: \"Make text colour the same as role color\"\n }\n },\n addons: {\n name: \"Addon Manager\",\n addonErrors: {\n name: \"Show Addon Errors\",\n note: \"Shows a modal with plugin/theme errors\"\n },\n autoScroll: {\n name: \"Scroll To Settings\",\n note: \"Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)\"\n },\n autoReload: {\n name: \"Automatic Loading\",\n note: \"Automatically loads, reloads, and unloads plugins and themes\"\n }\n },\n customcss: {\n name: \"Custom CSS\",\n customcss: {\n name: \"Custom CSS\",\n note: \"Enables the Custom CSS tab\"\n },\n liveUpdate: {\n name: \"Live Update\",\n note: \"Updates the css as you type\"\n },\n startDetached: {\n name: \"Start Detached\",\n note: \"Clicking the Custom CSS tab opens the editor in a separate window\"\n },\n nativeOpen: {\n name: \"Open in Native Editor\",\n note: \"Clicking the Custom CSS tab opens your custom css in your native editor\"\n }\n },\n developer: {\n name: \"Developer Settings\",\n developerMode: {\n name: \"Developer Mode\",\n note: \"Allows activating debugger when pressing F8\"\n },\n copySelector: {\n name: \"Copy Selector\",\n note: \"Adds a \\\"Copy Selector\\\" option to context menus when developer mode is active\"\n }\n },\n window: {\n name: \"Window Preferences\",\n transparency: {\n name: \"Enable Transparency\",\n note: \"Enables the main window to be see-through (requires restart)\"\n },\n frame: {\n name: \"Window Frame\",\n note: \"Adds the native os window frame to the main window\"\n }\n }\n },\n emotes: {\n name: \"Emotes\",\n general: {\n name: \"General\",\n download: {\n name: \"Download Emotes\",\n note: \"Download emotes once a week to stay up to date\"\n },\n emoteMenu: {\n name: \"Emote Menu\",\n note: \"Show Twitch/Favourite emotes in emote menu\"\n },\n hideEmojiMenu: {\n name: \"Hide Emoji Menu\",\n note: \"Hides Discord's emoji menu when using emote menu\"\n },\n autoCaps: {\n name: \"Emote Autocapitalization\",\n note: \"Autocapitalize emote commands\"\n },\n showNames: {\n name: \"Show Names\",\n note: \"Show emote names on hover\"\n },\n modifiers: {\n name: \"Show Emote Modifiers\",\n note: \"Enable emote mods (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)\"\n },\n animateOnHover: {\n name: \"Animate On Hover\",\n note: \"Only animate the emote modifiers on hover\"\n }\n },\n categories: {\n name: \"Categories\",\n twitch: {\n name: \"Twitch\",\n note: \"Show Twitch global & subscriber emotes\"\n },\n ffz: {\n name: \"FrankerFaceZ\",\n note: \"Show emotes from FFZ\"\n },\n bttv: {\n name: \"BetterTTV\",\n note: \"Show emotes from BTTV\"\n }\n }\n }\n },\n Addons: {\n title: \"{{name}} v{{version}} by {{author}}\",\n openFolder: \"Open {{type}} Folder\",\n reload: \"Reload\",\n pluginSettings: \"Settings\",\n website: \"Website\",\n source: \"Source\",\n server: \"Support Server\",\n donate: \"Donate\"\n },\n Emotes: {\n downloading: \"Downloading emotes in the background do not reload.\",\n downloaded: \"All emotes successfully downloaded.\",\n clearEmotes: \"Clear Emote Data\",\n favoriteAction: \"Favorite!\"\n },\n CustomCSS: {\n confirmationText: \"You have unsaved changes to your Custom CSS. Closing this window will lose all those changes.\",\n update: \"Update\",\n save: \"Save\",\n openNative: \"Open in System Editor\",\n openDetached: \"Detach Window\",\n settings: \"Editor Settings\",\n editorTitle: \"Custom CSS Editor\"\n },\n PublicServers: {\n button: \"public\",\n join: \"Join\",\n joining: \"Joining\",\n joined: \"Joined\",\n loading: \"Loading\",\n loadMore: \"Load More\",\n notConnected: \"Not connected to DiscordServers.com!\",\n search: \"Search\",\n connect: \"Connect\",\n reconnect: \"Reconnect\",\n categories: \"Categories\",\n connection: \"Connected as: {{username}}#{{discriminator}}\",\n results: \"Showing {{start}}-{{end}} of {{total}} results in {{category}}\",\n query: \"for {{query}}\"\n },\n Modals: {\n confirmClose: \"Are You Sure?\",\n okay: \"Okay\",\n cancel: \"Cancel\",\n name: \"Name\",\n message: \"Message\",\n error: \"Error\",\n addonErrors: \"Addon Errors\"\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL2RhdGEvc3RyaW5ncy5qcz9iYzcxIl0sIm5hbWVzIjpbIlBhbmVscyIsInBsdWdpbnMiLCJ0aGVtZXMiLCJjdXN0b21jc3MiLCJDb2xsZWN0aW9ucyIsInNldHRpbmdzIiwibmFtZSIsImdlbmVyYWwiLCJlbW90ZXMiLCJub3RlIiwicHVibGljU2VydmVycyIsInZvaWNlRGlzY29ubmVjdCIsInR3ZW50eUZvdXJIb3VyIiwiY2xhc3NOb3JtYWxpemVyIiwic2hvd1RvYXN0cyIsImFwcGVhcmFuY2UiLCJ2b2ljZU1vZGUiLCJtaW5pbWFsTW9kZSIsImhpZGVDaGFubmVscyIsImRhcmtNb2RlIiwiY29sb3JlZFRleHQiLCJhZGRvbnMiLCJhZGRvbkVycm9ycyIsImF1dG9TY3JvbGwiLCJhdXRvUmVsb2FkIiwibGl2ZVVwZGF0ZSIsInN0YXJ0RGV0YWNoZWQiLCJuYXRpdmVPcGVuIiwiZGV2ZWxvcGVyIiwiZGV2ZWxvcGVyTW9kZSIsImNvcHlTZWxlY3RvciIsIndpbmRvdyIsInRyYW5zcGFyZW5jeSIsImZyYW1lIiwiZG93bmxvYWQiLCJlbW90ZU1lbnUiLCJoaWRlRW1vamlNZW51IiwiYXV0b0NhcHMiLCJzaG93TmFtZXMiLCJtb2RpZmllcnMiLCJhbmltYXRlT25Ib3ZlciIsImNhdGVnb3JpZXMiLCJ0d2l0Y2giLCJmZnoiLCJidHR2IiwiQWRkb25zIiwidGl0bGUiLCJvcGVuRm9sZGVyIiwicmVsb2FkIiwicGx1Z2luU2V0dGluZ3MiLCJ3ZWJzaXRlIiwic291cmNlIiwic2VydmVyIiwiZG9uYXRlIiwiRW1vdGVzIiwiZG93bmxvYWRpbmciLCJkb3dubG9hZGVkIiwiY2xlYXJFbW90ZXMiLCJmYXZvcml0ZUFjdGlvbiIsIkN1c3RvbUNTUyIsImNvbmZpcm1hdGlvblRleHQiLCJ1cGRhdGUiLCJzYXZlIiwib3Blbk5hdGl2ZSIsIm9wZW5EZXRhY2hlZCIsImVkaXRvclRpdGxlIiwiUHVibGljU2VydmVycyIsImJ1dHRvbiIsImpvaW4iLCJqb2luaW5nIiwiam9pbmVkIiwibG9hZGluZyIsImxvYWRNb3JlIiwibm90Q29ubmVjdGVkIiwic2VhcmNoIiwiY29ubmVjdCIsInJlY29ubmVjdCIsImNvbm5lY3Rpb24iLCJyZXN1bHRzIiwicXVlcnkiLCJNb2RhbHMiLCJjb25maXJtQ2xvc2UiLCJva2F5IiwiY2FuY2VsIiwibWVzc2FnZSIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFlO0FBQ1hBLFFBQU0sRUFBRTtBQUNKQyxXQUFPLEVBQUUsU0FETDtBQUVKQyxVQUFNLEVBQUUsUUFGSjtBQUdKQyxhQUFTLEVBQUU7QUFIUCxHQURHO0FBTVhDLGFBQVcsRUFBRTtBQUNUQyxZQUFRLEVBQUU7QUFDTkMsVUFBSSxFQUFFLFVBREE7QUFFTkMsYUFBTyxFQUFFO0FBQ0xELFlBQUksRUFBRSxTQUREO0FBRUxFLGNBQU0sRUFBRTtBQUNKRixjQUFJLEVBQUUsY0FERjtBQUVKRyxjQUFJLEVBQUU7QUFGRixTQUZIO0FBTUxDLHFCQUFhLEVBQUU7QUFDWEosY0FBSSxFQUFFLGdCQURLO0FBRVhHLGNBQUksRUFBRTtBQUZLLFNBTlY7QUFVTEUsdUJBQWUsRUFBRTtBQUNiTCxjQUFJLEVBQUUsa0JBRE87QUFFYkcsY0FBSSxFQUFFO0FBRk8sU0FWWjtBQWNMRyxzQkFBYyxFQUFFO0FBQ1pOLGNBQUksRUFBRSxvQkFETTtBQUVaRyxjQUFJLEVBQUU7QUFGTSxTQWRYO0FBa0JMSSx1QkFBZSxFQUFFO0FBQ2JQLGNBQUksRUFBRSxtQkFETztBQUViRyxjQUFJLEVBQUU7QUFGTyxTQWxCWjtBQXNCTEssa0JBQVUsRUFBRTtBQUNSUixjQUFJLEVBQUUsYUFERTtBQUVSRyxjQUFJLEVBQUU7QUFGRTtBQXRCUCxPQUZIO0FBNkJOTSxnQkFBVSxFQUFFO0FBQ1JULFlBQUksRUFBRSxZQURFO0FBRVJVLGlCQUFTLEVBQUU7QUFDUFYsY0FBSSxFQUFFLFlBREM7QUFFUEcsY0FBSSxFQUFFO0FBRkMsU0FGSDtBQU1SUSxtQkFBVyxFQUFFO0FB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RDtBQVlYb0MsY0FBVSxFQUFFLDhDQVpEO0FBYVhDLFdBQU8sRUFBRSxnRUFiRTtBQWNYQyxTQUFLLEVBQUU7QUFkSSxHQS9MSjtBQStNWEMsUUFBTSxFQUFFO0FBQ0pDLGdCQUFZLEVBQUUsZUFEVjtBQUVKQyxRQUFJLEVBQUUsTUFGRjtBQUdKQyxVQUFNLEVBQUUsUUFISjtBQUlKN0UsUUFBSSxFQUFFLE1BSkY7QUFLSjhFLFdBQU8sRUFBRSxTQUxMO0FBTUpDLFNBQUssRUFBRSxPQU5IO0FBT0ovRCxlQUFXLEVBQUU7QUFQVDtBQS9NRyxDQUFmIiwiZmlsZSI6Ii4vc3JjL2RhdGEvc3RyaW5ncy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcclxuICAgIFBhbmVsczoge1xyXG4gICAgICAgIHBsdWdpbnM6IFwiUGx1Z2luc1wiLFxyXG4gICAgICAgIHRoZW1lczogXCJUaGVtZXNcIixcclxuICAgICAgICBjdXN0b21jc3M6IFwiQ3VzdG9tIENTU1wiXHJcbiAgICB9LFxyXG4gICAgQ29sbGVjdGlvbnM6IHtcclxuICAgICAgICBzZXR0aW5nczoge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlNldHRpbmdzXCIsXHJcbiAgICAgICAgICAgIGdlbmVyYWw6IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwiR2VuZXJhbFwiLFxyXG4gICAgICAgICAgICAgICAgZW1vdGVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbW90ZSBTeXN0ZW1cIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkVuYWJsZXMgQkQncyBlbW90ZSBzeXN0ZW1cIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHB1YmxpY1NlcnZlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlB1YmxpYyBTZXJ2ZXJzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJEaXNwbGF5IHB1YmxpYyBzZXJ2ZXJzIGJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdm9pY2VEaXNjb25uZWN0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJWb2ljZSBEaXNjb25uZWN0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJEaXNjb25uZWN0IGZyb20gdm9pY2Ugc2VydmVyIHdoZW4gY2xvc2luZyBEaXNjb3JkXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0d2VudHlGb3VySG91cjoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiMjQtSG91ciBUaW1lc3RhbXBzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJIaWRlcyBjaGFubmVscyB3aGVuIGluIG1pbmltYWwgbW9kZVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOb3JtYWxpemVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOb3JtYWxpemUgQ2xhc3Nlc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiQWRkcyBzdGFibGUgY2xhc3NlcyB0byBlbGVtZW50cyB0byBoZWxwIHRoZW1lcy4gKGUuZy4gYWRkcyAuZGEtY2hhbm5lbHMgdG8gLmNoYW5uZWxzLUllMmw2QSlcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNob3dUb2FzdHM6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNob3cgVG9hc3RzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJTaG93cyBhIHNtYWxsIG5vdGlmaWNhdGlvbiBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYXBwZWFyYW5jZToge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJBcHBlYXJhbmNlXCIsXHJcbiAgICAgICAgICAgICAgICB2b2ljZU1vZGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlZvaWNlIE1vZGVcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkhpZGVzIGV2ZXJ5dGhpbmcgdGhhdCBpc24ndCB2b2ljZSBjaGF0XCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBtaW5pbWFsTW9kZToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTWluaW1hbCBNb2RlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJIaWRlIGVsZW1lbnRzIGFuZCByZWR1Y2UgdGhlIHNpemUgb2YgZWxlbWVudHNcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZGVDaGFubmVsczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiSGlkZSBDaGFubmVsc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSGlkZXMgY2hhbm5lbHMgd2hlbiBpbiBtaW5pbWFsIG1vZGVcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGRhcmtNb2RlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXJrIE1vZGVcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIk1ha2UgY2VydGFpbiBlbGVtZW50cyBkYXJrIGJ5IGRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbG9yZWRUZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb2xvcmVkIFRleHRcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIk1ha2UgdGV4dCBjb2xvdXIgdGhlIHNhbWUgYXMgcm9sZSBjb2xvclwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGFkZG9uczoge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJBZGRvbiBNYW5hZ2VyXCIsXHJcbiAgICAgICAgICAgICAgICBhZGRvbkVycm9yczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2hvdyBBZGRvbiBFcnJvcnNcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIlNob3dzIGEgbW9kYWwgd2l0aCBwbHVnaW4vdGhlbWUgZXJyb3JzXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhdXRvU2Nyb2xsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTY3JvbGwgVG8gU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkF1dG8tc2Nyb2xscyB0byBhIHBsdWdpbidzIHNldHRpbmdzIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIChvbmx5IGlmIG91dCBvZiB2aWV3KVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgYXV0b1JlbG9hZDoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQXV0b21hdGljIExvYWRpbmdcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkF1dG9tYXRpY2FsbHkgbG9hZHMsIHJlbG9hZHMsIGFuZCB1bmxvYWRzIHBsdWdpbnMgYW5kIHRoZW1lc1wiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjdXN0b21jc3M6IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ3VzdG9tIENTU1wiLFxyXG4gICAgICAgICAgICAgICAgY3VzdG9tY3NzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDdXN0b20gQ1NTXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJFbmFibGVzIHRoZSBDdXN0b20gQ1NTIHRhYlwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbGl2ZVVwZGF0ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTGl2ZSBVcGRhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIlVwZGF0ZXMgdGhlIGNzcyBhcyB5b3UgdHlwZVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc3RhcnREZXRhY2hlZDoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RhcnQgRGV0YWNoZWRcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkNsaWNraW5nIHRoZSBDdXN0b20gQ1NTIHRhYiBvcGVucyB0aGUgZWRpdG9yIGluIGEgc2VwYXJhdGUgd2luZG93XCIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbmF0aXZlT3Blbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiT3BlbiBpbiBOYXRpdmUgRWRpdG9yXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJDbGlja2luZyB0aGUgQ3VzdG9tIENTUyB0YWIgb3BlbnMgeW91ciBjdXN0b20gY3NzIGluIHlvdXIgbmF0aXZlIGVkaXRvclwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRldmVsb3Blcjoge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJEZXZlbG9wZXIgU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgIGRldmVsb3Blck1vZGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRldmVsb3BlciBNb2RlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJBbGxvd3MgYWN0aXZhdGluZyBkZWJ1Z2dlciB3aGVuIHByZXNzaW5nIEY4XCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb3B5U2VsZWN0b3I6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvcHkgU2VsZWN0b3JcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkFkZHMgYSBcXFwiQ29weSBTZWxlY3RvclxcXCIgb3B0aW9uIHRvIGNvbnRleHQgbWVudXMgd2hlbiBkZXZlbG9wZXIgbW9kZSBpcyBhY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB3aW5kb3c6IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwiV2luZG93IFByZWZlcmVuY2VzXCIsXHJcbiAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3k6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVuYWJsZSBUcmFuc3BhcmVuY3lcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkVuYWJsZXMgdGhlIG1haW4gd2luZG93IHRvIGJlIHNlZS10aHJvdWdoIChyZXF1aXJlcyByZXN0YXJ0KVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZnJhbWU6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIldpbmRvdyBGcmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiQWRkcyB0aGUgbmF0aXZlIG9zIHdpbmRvdyBmcmFtZSB0byB0aGUgbWFpbiB3aW5kb3dcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbW90ZXM6IHtcclxuICAgICAgICAgICAgbmFtZTogXCJFbW90ZXNcIixcclxuICAgICAgICAgICAgZ2VuZXJhbDoge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJHZW5lcmFsXCIsXHJcbiAgICAgICAgICAgICAgICBkb3dubG9hZDoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRG93bmxvYWQgRW1vdGVzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJEb3dubG9hZCBlbW90ZXMgb25jZSBhIHdlZWsgdG8gc3RheSB1cCB0byBkYXRlXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbW90ZU1lbnU6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVtb3RlIE1lbnVcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIlNob3cgVHdpdGNoL0Zhdm91cml0ZSBlbW90ZXMgaW4gZW1vdGUgbWVudVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlkZUVtb2ppTWVudToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiSGlkZSBFbW9qaSBNZW51XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJIaWRlcyBEaXNjb3JkJ3MgZW1vamkgbWVudSB3aGVuIHVzaW5nIGVtb3RlIG1lbnVcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGF1dG9DYXBzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbW90ZSBBdXRvY2FwaXRhbGl6YXRpb25cIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkF1dG9jYXBpdGFsaXplIGVtb3RlIGNvbW1hbmRzXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzaG93TmFtZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNob3cgTmFtZXNcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIlNob3cgZW1vdGUgbmFtZXMgb24gaG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG1vZGlmaWVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2hvdyBFbW90ZSBNb2RpZmllcnNcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkVuYWJsZSBlbW90ZSBtb2RzIChmbGlwLCBzcGluLCBwdWxzZSwgc3BpbjIsIHNwaW4zLCAxc3BpbiwgMnNwaW4sIDNzcGluLCB0ciwgYmwsIGJyLCBzaGFrZSwgc2hha2UyLCBzaGFrZTMsIGZsYXApXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhbmltYXRlT25Ib3Zlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQW5pbWF0ZSBPbiBIb3ZlclwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiT25seSBhbmltYXRlIHRoZSBlbW90ZSBtb2RpZmllcnMgb24gaG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkNhdGVnb3JpZXNcIixcclxuICAgICAgICAgICAgICAgIHR3aXRjaDoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVHdpdGNoXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJTaG93IFR3aXRjaCBnbG9iYWwgJiBzdWJzY3JpYmVyIGVtb3Rlc1wiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmZ6OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJGcmFua2VyRmFjZVpcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIlNob3cgZW1vdGVzIGZyb20gRkZaXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBidHR2OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCZXR0ZXJUVFZcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIlNob3cgZW1vdGVzIGZyb20gQlRUVlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgQWRkb25zOiB7XHJcbiAgICAgICAgdGl0bGU6IFwie3tuYW1lfX0gdnt7dmVyc2lvbn19IGJ5IHt7YXV0aG9yfX1cIixcclxuICAgICAgICBvcGVuRm9sZGVyOiBcIk9wZW4ge3t0eXBlfX0gRm9sZGVyXCIsXHJcbiAgICAgICAgcmVsb2FkOiBcIlJlbG9hZFwiLFxyXG4gICAgICAgIHBsdWdpblNldHRpbmdzOiBcIlNldHRpbmdzXCIsXHJcbiAgICAgICAgd2Vic2l0ZTogXCJXZWJzaXRlXCIsXHJcbiAgICAgICAgc291cmNlOiBcIlNvdXJjZVwiLFxyXG4gICAgICAgIHNlcnZlcjogXCJTdXBwb3J0IFNlcnZlclwiLFxyXG4gICAgICAgIGRvbmF0ZTogXCJEb25hdGVcIlxyXG4gICAgfSxcclxuICAgIEVtb3Rlczoge1xyXG4gICAgICAgIGRvd25sb2FkaW5nOiBcIkRvd25sb2FkaW5nIGVtb3RlcyBpbiB0aGUgYmFja2dyb3VuZCBkbyBub3QgcmVsb2FkLlwiLFxyXG4gICAgICAgIGRvd25sb2FkZWQ6IFwiQWxsIGVtb3RlcyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZC5cIixcclxuICAgICAgICBjbGVhckVtb3RlczogXCJDbGVhciBFbW90ZSBEYXRhXCIsXHJcbiAgICAgICAgZmF2b3JpdGVBY3Rpb246IFwiRmF2b3JpdGUhXCJcclxuICAgIH0sXHJcbiAgICBDdXN0b21DU1M6IHtcclxuICAgICAgICBjb25maXJtYXRpb25UZXh0OiBcIllvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0byB5b3VyIEN1c3RvbSBDU1MuIENsb3NpbmcgdGhpcyB3aW5kb3cgd2lsbCBsb3NlIGFsbCB0aG9zZSBjaGFuZ2VzLlwiLFxyXG4gICAgICAgIHVwZGF0ZTogXCJVcGRhdGVcIixcclxuICAgICAgICBzYXZlOiBcIlNhdmVcIixcclxuICAgICAgICBvcGVuTmF0aXZlOiBcIk9wZW4gaW4gU3lzdGVtIEVkaXRvclwiLFxyXG4gICAgICAgIG9wZW5EZXRhY2hlZDogXCJEZXRhY2ggV2luZG93XCIsXHJcbiAgICAgICAgc2V0dGluZ3M6IFwiRWRpdG9yIFNldHRpbmdzXCIsXHJcbiAgICAgICAgZWRpdG9yVGl0bGU6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIlxyXG4gICAgfSxcclxuICAgIFB1YmxpY1NlcnZlcnM6IHtcclxuICAgICAgICBidXR0b246IFwicHVibGljXCIsXHJcbiAgICAgICAgam9pbjogXCJKb2luXCIsXHJcbiAgICAgICAgam9pbmluZzogXCJKb2luaW5nXCIsXHJcbiAgICAgICAgam9pbmVkOiBcIkpvaW5lZFwiLFxyXG4gICAgICAgIGxvYWRpbmc6IFwiTG9hZGluZ1wiLFxyXG4gICAgICAgIGxvYWRNb3JlOiBcIkxvYWQgTW9yZVwiLFxyXG4gICAgICAgIG5vdENvbm5lY3RlZDogXCJOb3QgY29ubmVjdGVkIHRvIERpc2NvcmRTZXJ2ZXJzLmNvbSFcIixcclxuICAgICAgICBzZWFyY2g6IFwiU2VhcmNoXCIsXHJcbiAgICAgICAgY29ubmVjdDogXCJDb25uZWN0XCIsXHJcbiAgICAgICAgcmVjb25uZWN0OiBcIlJlY29ubmVjdFwiLFxyXG4gICAgICAgIGNhdGVnb3JpZXM6IFwiQ2F0ZWdvcmllc1wiLFxyXG4gICAgICAgIGNvbm5lY3Rpb246IFwiQ29ubmVjdGVkIGFzOiB7e3VzZXJuYW1lfX0je3tkaXNjcmltaW5hdG9yfX1cIixcclxuICAgICAgICByZXN1bHRzOiBcIlNob3dpbmcge3tzdGFydH19LXt7ZW5kfX0gb2Yge3t0b3RhbH19IHJlc3VsdHMgaW4ge3tjYXRlZ29yeX19XCIsXHJcbiAgICAgICAgcXVlcnk6IFwiZm9yIHt7cXVlcnl9fVwiXHJcbiAgICB9LFxyXG4gICAgTW9kYWxzOiB7XHJcbiAgICAgICAgY29uZmlybUNsb3NlOiBcIkFyZSBZb3UgU3VyZT9cIixcclxuICAgICAgICBva2F5OiBcIk9rYXlcIixcclxuICAgICAgICBjYW5jZWw6IFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgbmFtZTogXCJOYW1lXCIsXHJcbiAgICAgICAgbWVzc2FnZTogXCJNZXNzYWdlXCIsXHJcbiAgICAgICAgZXJyb3I6IFwiRXJyb3JcIixcclxuICAgICAgICBhZGRvbkVycm9yczogXCJBZGRvbiBFcnJvcnNcIlxyXG4gICAgfVxyXG59O1xyXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/data/strings.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n Panels: {\n plugins: \"Plugins\",\n themes: \"Themes\",\n customcss: \"Custom CSS\"\n },\n Collections: {\n settings: {\n name: \"Settings\",\n general: {\n name: \"General\",\n emotes: {\n name: \"Emote System\",\n note: \"Enables BD's emote system\"\n },\n publicServers: {\n name: \"Public Servers\",\n note: \"Display public servers button\"\n },\n voiceDisconnect: {\n name: \"Voice Disconnect\",\n note: \"Disconnect from voice server when closing Discord\"\n },\n twentyFourHour: {\n name: \"24-Hour Timestamps\",\n note: \"Hides channels when in minimal mode\"\n },\n classNormalizer: {\n name: \"Normalize Classes\",\n note: \"Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)\"\n },\n showToasts: {\n name: \"Show Toasts\",\n note: \"Shows a small notification for important information\"\n }\n },\n appearance: {\n name: \"Appearance\",\n voiceMode: {\n name: \"Voice Mode\",\n note: \"Hides everything that isn't voice chat\"\n },\n minimalMode: {\n name: \"Minimal Mode\",\n note: \"Hide elements and reduce the size of elements\"\n },\n hideChannels: {\n name: \"Hide Channels\",\n note: \"Hides channels when in minimal mode\"\n },\n darkMode: {\n name: \"Dark Mode\",\n note: \"Make certain elements dark by default\"\n },\n coloredText: {\n name: \"Colored Text\",\n note: \"Make text colour the same as role color\"\n }\n },\n addons: {\n name: \"Addon Manager\",\n addonErrors: {\n name: \"Show Addon Errors\",\n note: \"Shows a modal with plugin/theme errors\"\n },\n autoScroll: {\n name: \"Scroll To Settings\",\n note: \"Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)\"\n },\n autoReload: {\n name: \"Automatic Loading\",\n note: \"Automatically loads, reloads, and unloads plugins and themes\"\n }\n },\n customcss: {\n name: \"Custom CSS\",\n customcss: {\n name: \"Custom CSS\",\n note: \"Enables the Custom CSS tab\"\n },\n liveUpdate: {\n name: \"Live Update\",\n note: \"Updates the css as you type\"\n },\n startDetached: {\n name: \"Start Detached\",\n note: \"Clicking the Custom CSS tab opens the editor in a separate window\"\n },\n nativeOpen: {\n name: \"Open in Native Editor\",\n note: \"Clicking the Custom CSS tab opens your custom css in your native editor\"\n }\n },\n developer: {\n name: \"Developer Settings\",\n developerMode: {\n name: \"Developer Mode\",\n note: \"Allows activating debugger when pressing F8\"\n },\n copySelector: {\n name: \"Copy Selector\",\n note: \"Adds a \\\"Copy Selector\\\" option to context menus when developer mode is active\"\n }\n },\n window: {\n name: \"Window Preferences\",\n transparency: {\n name: \"Enable Transparency\",\n note: \"Enables the main window to be see-through (requires restart)\"\n },\n frame: {\n name: \"Window Frame\",\n note: \"Adds the native os window frame to the main window\"\n }\n }\n },\n emotes: {\n name: \"Emotes\",\n general: {\n name: \"General\",\n download: {\n name: \"Download Emotes\",\n note: \"Download emotes once a week to stay up to date\"\n },\n emoteMenu: {\n name: \"Emote Menu\",\n note: \"Show Twitch/Favourite emotes in emote menu\"\n },\n hideEmojiMenu: {\n name: \"Hide Emoji Menu\",\n note: \"Hides Discord's emoji menu when using emote menu\"\n },\n autoCaps: {\n name: \"Emote Autocapitalization\",\n note: \"Autocapitalize emote commands\"\n },\n showNames: {\n name: \"Show Names\",\n note: \"Show emote names on hover\"\n },\n modifiers: {\n name: \"Show Emote Modifiers\",\n note: \"Enable emote mods (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)\"\n },\n animateOnHover: {\n name: \"Animate On Hover\",\n note: \"Only animate the emote modifiers on hover\"\n }\n },\n categories: {\n name: \"Categories\",\n twitch: {\n name: \"Twitch\",\n note: \"Show Twitch global & subscriber emotes\"\n },\n ffz: {\n name: \"FrankerFaceZ\",\n note: \"Show emotes from FFZ\"\n },\n bttv: {\n name: \"BetterTTV\",\n note: \"Show emotes from BTTV\"\n }\n }\n }\n },\n Addons: {\n title: \"{{name}} v{{version}} by {{author}}\",\n openFolder: \"Open {{type}} Folder\",\n reload: \"Reload\",\n addonSettings: \"Settings\",\n website: \"Website\",\n source: \"Source\",\n server: \"Support Server\",\n donate: \"Donate\"\n },\n Emotes: {\n downloading: \"Downloading emotes in the background do not reload.\",\n downloaded: \"All emotes successfully downloaded.\",\n clearEmotes: \"Clear Emote Data\",\n favoriteAction: \"Favorite!\"\n },\n CustomCSS: {\n confirmationText: \"You have unsaved changes to your Custom CSS. Closing this window will lose all those changes.\",\n update: \"Update\",\n save: \"Save\",\n openNative: \"Open in System Editor\",\n openDetached: \"Detach Window\",\n settings: \"Editor Settings\",\n editorTitle: \"Custom CSS Editor\"\n },\n PublicServers: {\n button: \"public\",\n join: \"Join\",\n joining: \"Joining\",\n joined: \"Joined\",\n loading: \"Loading\",\n loadMore: \"Load More\",\n notConnected: \"Not connected to DiscordServers.com!\",\n search: \"Search\",\n connect: \"Connect\",\n reconnect: \"Reconnect\",\n categories: \"Categories\",\n connection: \"Connected as: {{username}}#{{discriminator}}\",\n results: \"Showing {{start}}-{{end}} of {{total}} results in {{category}}\",\n query: \"for {{query}}\"\n },\n Modals: {\n confirmClose: \"Are You Sure?\",\n okay: \"Okay\",\n cancel: \"Cancel\",\n name: \"Name\",\n message: \"Message\",\n error: \"Error\",\n addonErrors: \"Addon Errors\"\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL2RhdGEvc3RyaW5ncy5qcz9iYzcxIl0sIm5hbWVzIjpbIlBhbmVscyIsInBsdWdpbnMiLCJ0aGVtZXMiLCJjdXN0b21jc3MiLCJDb2xsZWN0aW9ucyIsInNldHRpbmdzIiwibmFtZSIsImdlbmVyYWwiLCJlbW90ZXMiLCJub3RlIiwicHVibGljU2VydmVycyIsInZvaWNlRGlzY29ubmVjdCIsInR3ZW50eUZvdXJIb3VyIiwiY2xhc3NOb3JtYWxpemVyIiwic2hvd1RvYXN0cyIsImFwcGVhcmFuY2UiLCJ2b2ljZU1vZGUiLCJtaW5pbWFsTW9kZSIsImhpZGVDaGFubmVscyIsImRhcmtNb2RlIiwiY29sb3JlZFRleHQiLCJhZGRvbnMiLCJhZGRvbkVycm9ycyIsImF1dG9TY3JvbGwiLCJhdXRvUmVsb2FkIiwibGl2ZVVwZGF0ZSIsInN0YXJ0RGV0YWNoZWQiLCJuYXRpdmVPcGVuIiwiZGV2ZWxvcGVyIiwiZGV2ZWxvcGVyTW9kZSIsImNvcHlTZWxlY3RvciIsIndpbmRvdyIsInRyYW5zcGFyZW5jeSIsImZyYW1lIiwiZG93bmxvYWQiLCJlbW90ZU1lbnUiLCJoaWRlRW1vamlNZW51IiwiYXV0b0NhcHMiLCJzaG93TmFtZXMiLCJtb2RpZmllcnMiLCJhbmltYXRlT25Ib3ZlciIsImNhdGVnb3JpZXMiLCJ0d2l0Y2giLCJmZnoiLCJidHR2IiwiQWRkb25zIiwidGl0bGUiLCJvcGVuRm9sZGVyIiwicmVsb2FkIiwiYWRkb25TZXR0aW5ncyIsIndlYnNpdGUiLCJzb3VyY2UiLCJzZXJ2ZXIiLCJkb25hdGUiLCJFbW90ZXMiLCJkb3dubG9hZGluZyIsImRvd25sb2FkZWQiLCJjbGVhckVtb3RlcyIsImZhdm9yaXRlQWN0aW9uIiwiQ3VzdG9tQ1NTIiwiY29uZmlybWF0aW9uVGV4dCIsInVwZGF0ZSIsInNhdmUiLCJvcGVuTmF0aXZlIiwib3BlbkRldGFjaGVkIiwiZWRpdG9yVGl0bGUiLCJQdWJsaWNTZXJ2ZXJzIiwiYnV0dG9uIiwiam9pbiIsImpvaW5pbmciLCJqb2luZWQiLCJsb2FkaW5nIiwibG9hZE1vcmUiLCJub3RDb25uZWN0ZWQiLCJzZWFyY2giLCJjb25uZWN0IiwicmVjb25uZWN0IiwiY29ubmVjdGlvbiIsInJlc3VsdHMiLCJxdWVyeSIsIk1vZGFscyIsImNvbmZpcm1DbG9zZSIsIm9rYXkiLCJjYW5jZWwiLCJtZXNzYWdlIiwiZXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBO0FBQWU7QUFDWEEsUUFBTSxFQUFFO0FBQ0pDLFdBQU8sRUFBRSxTQURMO0FBRUpDLFVBQU0sRUFBRSxRQUZKO0FBR0pDLGFBQVMsRUFBRTtBQUhQLEdBREc7QUFNWEMsYUFBVyxFQUFFO0FBQ1RDLFlBQVEsRUFBRTtBQUNOQyxVQUFJLEVBQUUsVUFEQTtBQUVOQyxhQUFPLEVBQUU7QUFDTEQsWUFBSSxFQUFFLFNBREQ7QUFFTEUsY0FBTSxFQUFFO0FBQ0pGLGNBQUksRUFBRSxjQURGO0FBRUpHLGNBQUksRUFBRTtBQUZGLFNBRkg7QUFNTEMscUJBQWEsRUFBRTtBQUNYSixjQUFJLEVBQUUsZ0JBREs7QUFFWEcsY0FBSSxFQUFFO0FBRkssU0FOVjtBQVVMRSx1QkFBZSxFQUFFO0FBQ2JMLGNBQUksRUFBRSxrQkFETztBQUViRyxjQUFJLEVBQUU7QUFGTyxTQVZaO0FBY0xHLHNCQUFjLEVBQUU7QUFDWk4sY0FBSSxFQUFFLG9CQURNO0FBRVpHLGNBQUksRUFBRTtBQUZNLFNBZFg7QUFrQkxJLHVCQUFlLEVBQUU7QUFDYlAsY0FBSSxFQUFFLG1CQURPO0FBRWJHLGNBQUksRUFBRTtBQUZPLFNBbEJaO0FBc0JMSyxrQkFBVSxFQUFFO0FBQ1JSLGNBQUksRUFBRSxhQURFO0FBRVJHLGNBQUksRUFBRTtBQUZFO0FBdEJQLE9BRkg7QUE2Qk5NLGdCQUFVLEVBQUU7QUFDUlQsWUFBSSxFQUFFLFlBREU7QUFFUlUsaUJBQVMsRUFBRTtBQUNQVixjQUFJLEVBQUUsWUFEQztBQUVQRyxjQUFJLEVBQUU7QUFGQyxTQUZIO0FBTVJRLG1CQUFXLEVBQUU7QUFD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O0FBWVhvQyxjQUFVLEVBQUUsOENBWkQ7QUFhWEMsV0FBTyxFQUFFLGdFQWJFO0FBY1hDLFNBQUssRUFBRTtBQWRJLEdBL0xKO0FBK01YQyxRQUFNLEVBQUU7QUFDSkMsZ0JBQVksRUFBRSxlQURWO0FBRUpDLFFBQUksRUFBRSxNQUZGO0FBR0pDLFVBQU0sRUFBRSxRQUhKO0FBSUo3RSxRQUFJLEVBQUUsTUFKRjtBQUtKOEUsV0FBTyxFQUFFLFNBTEw7QUFNSkMsU0FBSyxFQUFFLE9BTkg7QUFPSi9ELGVBQVcsRUFBRTtBQVBUO0FBL01HLENBQWYiLCJmaWxlIjoiLi9zcmMvZGF0YS9zdHJpbmdzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgUGFuZWxzOiB7XHJcbiAgICAgICAgcGx1Z2luczogXCJQbHVnaW5zXCIsXHJcbiAgICAgICAgdGhlbWVzOiBcIlRoZW1lc1wiLFxyXG4gICAgICAgIGN1c3RvbWNzczogXCJDdXN0b20gQ1NTXCJcclxuICAgIH0sXHJcbiAgICBDb2xsZWN0aW9uczoge1xyXG4gICAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgZ2VuZXJhbDoge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJHZW5lcmFsXCIsXHJcbiAgICAgICAgICAgICAgICBlbW90ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVtb3RlIFN5c3RlbVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiRW5hYmxlcyBCRCdzIGVtb3RlIHN5c3RlbVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcHVibGljU2VydmVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiUHVibGljIFNlcnZlcnNcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkRpc3BsYXkgcHVibGljIHNlcnZlcnMgYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB2b2ljZURpc2Nvbm5lY3Q6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlZvaWNlIERpc2Nvbm5lY3RcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkRpc2Nvbm5lY3QgZnJvbSB2b2ljZSBzZXJ2ZXIgd2hlbiBjbG9zaW5nIERpc2NvcmRcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHR3ZW50eUZvdXJIb3VyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCIyNC1Ib3VyIFRpbWVzdGFtcHNcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkhpZGVzIGNoYW5uZWxzIHdoZW4gaW4gbWluaW1hbCBtb2RlXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGFzc05vcm1hbGl6ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk5vcm1hbGl6ZSBDbGFzc2VzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJBZGRzIHN0YWJsZSBjbGFzc2VzIHRvIGVsZW1lbnRzIHRvIGhlbHAgdGhlbWVzLiAoZS5nLiBhZGRzIC5kYS1jaGFubmVscyB0byAuY2hhbm5lbHMtSWUybDZBKVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvYXN0czoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2hvdyBUb2FzdHNcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIlNob3dzIGEgc21hbGwgbm90aWZpY2F0aW9uIGZvciBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhcHBlYXJhbmNlOiB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkFwcGVhcmFuY2VcIixcclxuICAgICAgICAgICAgICAgIHZvaWNlTW9kZToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVm9pY2UgTW9kZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiSGlkZXMgZXZlcnl0aGluZyB0aGF0IGlzbid0IHZvaWNlIGNoYXRcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG1pbmltYWxNb2RlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJNaW5pbWFsIE1vZGVcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkhpZGUgZWxlbWVudHMgYW5kIHJlZHVjZSB0aGUgc2l6ZSBvZiBlbGVtZW50c1wiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlkZUNoYW5uZWxzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJIaWRlIENoYW5uZWxzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJIaWRlcyBjaGFubmVscyB3aGVuIGluIG1pbmltYWwgbW9kZVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZGFya01vZGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhcmsgTW9kZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiTWFrZSBjZXJ0YWluIGVsZW1lbnRzIGRhcmsgYnkgZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29sb3JlZFRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbG9yZWQgVGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiTWFrZSB0ZXh0IGNvbG91ciB0aGUgc2FtZSBhcyByb2xlIGNvbG9yXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWRkb25zOiB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkFkZG9uIE1hbmFnZXJcIixcclxuICAgICAgICAgICAgICAgIGFkZG9uRXJyb3JzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTaG93IEFkZG9uIEVycm9yc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiU2hvd3MgYSBtb2RhbCB3aXRoIHBsdWdpbi90aGVtZSBlcnJvcnNcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGF1dG9TY3JvbGw6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNjcm9sbCBUbyBTZXR0aW5nc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiQXV0by1zY3JvbGxzIHRvIGEgcGx1Z2luJ3Mgc2V0dGluZ3Mgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgKG9ubHkgaWYgb3V0IG9mIHZpZXcpXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhdXRvUmVsb2FkOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJBdXRvbWF0aWMgTG9hZGluZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiQXV0b21hdGljYWxseSBsb2FkcywgcmVsb2FkcywgYW5kIHVubG9hZHMgcGx1Z2lucyBhbmQgdGhlbWVzXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGN1c3RvbWNzczoge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJDdXN0b20gQ1NTXCIsXHJcbiAgICAgICAgICAgICAgICBjdXN0b21jc3M6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkN1c3RvbSBDU1NcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkVuYWJsZXMgdGhlIEN1c3RvbSBDU1MgdGFiXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBsaXZlVXBkYXRlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJMaXZlIFVwZGF0ZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiVXBkYXRlcyB0aGUgY3NzIGFzIHlvdSB0eXBlXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzdGFydERldGFjaGVkOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdGFydCBEZXRhY2hlZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiQ2xpY2tpbmcgdGhlIEN1c3RvbSBDU1MgdGFiIG9wZW5zIHRoZSBlZGl0b3IgaW4gYSBzZXBhcmF0ZSB3aW5kb3dcIixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYXRpdmVPcGVuOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJPcGVuIGluIE5hdGl2ZSBFZGl0b3JcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkNsaWNraW5nIHRoZSBDdXN0b20gQ1NTIHRhYiBvcGVucyB5b3VyIGN1c3RvbSBjc3MgaW4geW91ciBuYXRpdmUgZWRpdG9yXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGV2ZWxvcGVyOiB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkRldmVsb3BlciBTZXR0aW5nc1wiLFxyXG4gICAgICAgICAgICAgICAgZGV2ZWxvcGVyTW9kZToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGV2ZWxvcGVyIE1vZGVcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkFsbG93cyBhY3RpdmF0aW5nIGRlYnVnZ2VyIHdoZW4gcHJlc3NpbmcgRjhcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvcHlTZWxlY3Rvcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29weSBTZWxlY3RvclwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiQWRkcyBhIFxcXCJDb3B5IFNlbGVjdG9yXFxcIiBvcHRpb24gdG8gY29udGV4dCBtZW51cyB3aGVuIGRldmVsb3BlciBtb2RlIGlzIGFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHdpbmRvdzoge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJXaW5kb3cgUHJlZmVyZW5jZXNcIixcclxuICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW5hYmxlIFRyYW5zcGFyZW5jeVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiRW5hYmxlcyB0aGUgbWFpbiB3aW5kb3cgdG8gYmUgc2VlLXRocm91Z2ggKHJlcXVpcmVzIHJlc3RhcnQpXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmcmFtZToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiV2luZG93IEZyYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJBZGRzIHRoZSBuYXRpdmUgb3Mgd2luZG93IGZyYW1lIHRvIHRoZSBtYWluIHdpbmRvd1wiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVtb3Rlczoge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkVtb3Rlc1wiLFxyXG4gICAgICAgICAgICBnZW5lcmFsOiB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkdlbmVyYWxcIixcclxuICAgICAgICAgICAgICAgIGRvd25sb2FkOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEb3dubG9hZCBFbW90ZXNcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkRvd25sb2FkIGVtb3RlcyBvbmNlIGEgd2VlayB0byBzdGF5IHVwIHRvIGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVtb3RlTWVudToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW1vdGUgTWVudVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiU2hvdyBUd2l0Y2gvRmF2b3VyaXRlIGVtb3RlcyBpbiBlbW90ZSBtZW51XCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBoaWRlRW1vamlNZW51OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJIaWRlIEVtb2ppIE1lbnVcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIkhpZGVzIERpc2NvcmQncyBlbW9qaSBtZW51IHdoZW4gdXNpbmcgZW1vdGUgbWVudVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgYXV0b0NhcHM6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVtb3RlIEF1dG9jYXBpdGFsaXphdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiQXV0b2NhcGl0YWxpemUgZW1vdGUgY29tbWFuZHNcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNob3dOYW1lczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2hvdyBOYW1lc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiU2hvdyBlbW90ZSBuYW1lcyBvbiBob3ZlclwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTaG93IEVtb3RlIE1vZGlmaWVyc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiRW5hYmxlIGVtb3RlIG1vZHMgKGZsaXAsIHNwaW4sIHB1bHNlLCBzcGluMiwgc3BpbjMsIDFzcGluLCAyc3BpbiwgM3NwaW4sIHRyLCBibCwgYnIsIHNoYWtlLCBzaGFrZTIsIHNoYWtlMywgZmxhcClcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGFuaW1hdGVPbkhvdmVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJBbmltYXRlIE9uIEhvdmVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZTogXCJPbmx5IGFuaW1hdGUgdGhlIGVtb3RlIG1vZGlmaWVycyBvbiBob3ZlclwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ2F0ZWdvcmllc1wiLFxyXG4gICAgICAgICAgICAgICAgdHdpdGNoOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUd2l0Y2hcIixcclxuICAgICAgICAgICAgICAgICAgICBub3RlOiBcIlNob3cgVHdpdGNoIGdsb2JhbCAmIHN1YnNjcmliZXIgZW1vdGVzXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmZno6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkZyYW5rZXJGYWNlWlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiU2hvdyBlbW90ZXMgZnJvbSBGRlpcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGJ0dHY6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJldHRlclRUVlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vdGU6IFwiU2hvdyBlbW90ZXMgZnJvbSBCVFRWXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBBZGRvbnM6IHtcclxuICAgICAgICB0aXRsZTogXCJ7e25hbWV9fSB2e3t2ZXJzaW9ufX0gYnkge3thdXRob3J9fVwiLFxyXG4gICAgICAgIG9wZW5Gb2xkZXI6IFwiT3BlbiB7e3R5cGV9fSBGb2xkZXJcIixcclxuICAgICAgICByZWxvYWQ6IFwiUmVsb2FkXCIsXHJcbiAgICAgICAgYWRkb25TZXR0aW5nczogXCJTZXR0aW5nc1wiLFxyXG4gICAgICAgIHdlYnNpdGU6IFwiV2Vic2l0ZVwiLFxyXG4gICAgICAgIHNvdXJjZTogXCJTb3VyY2VcIixcclxuICAgICAgICBzZXJ2ZXI6IFwiU3VwcG9ydCBTZXJ2ZXJcIixcclxuICAgICAgICBkb25hdGU6IFwiRG9uYXRlXCJcclxuICAgIH0sXHJcbiAgICBFbW90ZXM6IHtcclxuICAgICAgICBkb3dubG9hZGluZzogXCJEb3dubG9hZGluZyBlbW90ZXMgaW4gdGhlIGJhY2tncm91bmQgZG8gbm90IHJlbG9hZC5cIixcclxuICAgICAgICBkb3dubG9hZGVkOiBcIkFsbCBlbW90ZXMgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQuXCIsXHJcbiAgICAgICAgY2xlYXJFbW90ZXM6IFwiQ2xlYXIgRW1vdGUgRGF0YVwiLFxyXG4gICAgICAgIGZhdm9yaXRlQWN0aW9uOiBcIkZhdm9yaXRlIVwiXHJcbiAgICB9LFxyXG4gICAgQ3VzdG9tQ1NTOiB7XHJcbiAgICAgICAgY29uZmlybWF0aW9uVGV4dDogXCJZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdG8geW91ciBDdXN0b20gQ1NTLiBDbG9zaW5nIHRoaXMgd2luZG93IHdpbGwgbG9zZSBhbGwgdGhvc2UgY2hhbmdlcy5cIixcclxuICAgICAgICB1cGRhdGU6IFwiVXBkYXRlXCIsXHJcbiAgICAgICAgc2F2ZTogXCJTYXZlXCIsXHJcbiAgICAgICAgb3Blbk5hdGl2ZTogXCJPcGVuIGluIFN5c3RlbSBFZGl0b3JcIixcclxuICAgICAgICBvcGVuRGV0YWNoZWQ6IFwiRGV0YWNoIFdpbmRvd1wiLFxyXG4gICAgICAgIHNldHRpbmdzOiBcIkVkaXRvciBTZXR0aW5nc1wiLFxyXG4gICAgICAgIGVkaXRvclRpdGxlOiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJcclxuICAgIH0sXHJcbiAgICBQdWJsaWNTZXJ2ZXJzOiB7XHJcbiAgICAgICAgYnV0dG9uOiBcInB1YmxpY1wiLFxyXG4gICAgICAgIGpvaW46IFwiSm9pblwiLFxyXG4gICAgICAgIGpvaW5pbmc6IFwiSm9pbmluZ1wiLFxyXG4gICAgICAgIGpvaW5lZDogXCJKb2luZWRcIixcclxuICAgICAgICBsb2FkaW5nOiBcIkxvYWRpbmdcIixcclxuICAgICAgICBsb2FkTW9yZTogXCJMb2FkIE1vcmVcIixcclxuICAgICAgICBub3RDb25uZWN0ZWQ6IFwiTm90IGNvbm5lY3RlZCB0byBEaXNjb3JkU2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgc2VhcmNoOiBcIlNlYXJjaFwiLFxyXG4gICAgICAgIGNvbm5lY3Q6IFwiQ29ubmVjdFwiLFxyXG4gICAgICAgIHJlY29ubmVjdDogXCJSZWNvbm5lY3RcIixcclxuICAgICAgICBjYXRlZ29yaWVzOiBcIkNhdGVnb3JpZXNcIixcclxuICAgICAgICBjb25uZWN0aW9uOiBcIkNvbm5lY3RlZCBhczoge3t1c2VybmFtZX19I3t7ZGlzY3JpbWluYXRvcn19XCIsXHJcbiAgICAgICAgcmVzdWx0czogXCJTaG93aW5nIHt7c3RhcnR9fS17e2VuZH19IG9mIHt7dG90YWx9fSByZXN1bHRzIGluIHt7Y2F0ZWdvcnl9fVwiLFxyXG4gICAgICAgIHF1ZXJ5OiBcImZvciB7e3F1ZXJ5fX1cIlxyXG4gICAgfSxcclxuICAgIE1vZGFsczoge1xyXG4gICAgICAgIGNvbmZpcm1DbG9zZTogXCJBcmUgWW91IFN1cmU/XCIsXHJcbiAgICAgICAgb2theTogXCJPa2F5XCIsXHJcbiAgICAgICAgY2FuY2VsOiBcIkNhbmNlbFwiLFxyXG4gICAgICAgIG5hbWU6IFwiTmFtZVwiLFxyXG4gICAgICAgIG1lc3NhZ2U6IFwiTWVzc2FnZVwiLFxyXG4gICAgICAgIGVycm9yOiBcIkVycm9yXCIsXHJcbiAgICAgICAgYWRkb25FcnJvcnM6IFwiQWRkb24gRXJyb3JzXCJcclxuICAgIH1cclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/data/strings.js\n"); /***/ }), @@ -395,7 +395,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _loc /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! data */ \"./src/data/data.js\");\n/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utilities */ \"./src/modules/utilities.js\");\n\n\n\nconst fs = __webpack_require__(/*! fs */ \"fs\");\n\nconst path = __webpack_require__(/*! path */ \"path\");\n\nconst releaseChannel = DiscordNative.globals.releaseChannel; // Schema\n// =======================\n// %appdata%\\BetterDiscord\n// -> data\n// -> [releaseChannel]\\ (stable/canary/ptb)\n// -> settings.json\n// -> plugins.json\n// -> themes.json\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (new class DataStore {\n constructor() {\n this.data = {\n misc: {}\n };\n this.pluginData = {};\n }\n\n initialize() {\n if (!fs.existsSync(this.baseFolder)) fs.mkdirSync(this.baseFolder);\n if (!fs.existsSync(this.dataFolder)) fs.mkdirSync(this.dataFolder);\n if (!fs.existsSync(this.localeFolder)) fs.mkdirSync(this.localeFolder);\n if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data.misc, null, 4));\n if (!fs.existsSync(this.customCSS)) fs.writeFileSync(this.customCSS, \"\");\n const dataFiles = fs.readdirSync(this.dataFolder).filter(f => !fs.statSync(path.resolve(this.dataFolder, f)).isDirectory() && f.endsWith(\".json\"));\n\n for (const file of dataFiles) {\n this.data[file.split(\".\")[0]] = require(path.resolve(this.dataFolder, file));\n } // this.data = __non_webpack_require__(this.BDFile);\n // if (data.hasOwnProperty(\"settings\")) this.data = data;\n // if (!fs.existsSync(this.settingsFile)) return;\n // let settings = __non_webpack_require__(this.settingsFile);\n // fs.unlinkSync(this.settingsFile);\n // if (settings.hasOwnProperty(\"settings\")) settings = Object.assign({stable: {}, canary: {}, ptb: {}}, {[releaseChannel]: settings});\n // else settings = Object.assign({stable: {}, canary: {}, ptb: {}}, settings);\n // this.setBDData(\"settings\", settings);\n\n }\n\n get customCSS() {\n return this._customCSS || (this._customCSS = path.resolve(this.dataFolder, \"custom.css\"));\n }\n\n get baseFolder() {\n return this._baseFolder || (this._baseFolder = path.resolve(data__WEBPACK_IMPORTED_MODULE_0__[\"Config\"].dataPath, \"data\"));\n }\n\n get dataFolder() {\n return this._dataFolder || (this._dataFolder = path.resolve(this.baseFolder, `${releaseChannel}`));\n }\n\n get localeFolder() {\n return this._localeFolder || (this._localeFolder = path.resolve(this.baseFolder, `locales`));\n }\n\n get BDFile() {\n return this._BDFile || (this._BDFile = path.resolve(data__WEBPACK_IMPORTED_MODULE_0__[\"Config\"].dataPath, \"data\", `${releaseChannel}.json`));\n } // get settingsFile() {return this._settingsFile || (this._settingsFile = path.resolve(Config.dataPath, \"bdsettings.json\"));}\n\n\n getPluginFile(pluginName) {\n return path.resolve(data__WEBPACK_IMPORTED_MODULE_0__[\"Config\"].dataPath, \"plugins\", pluginName + \".config.json\");\n } // getSettingGroup(key) {\n // return this.data.settings[key] || null;\n // }\n // setSettingGroup(key, data) {\n // this.data.settings[key] = data;\n // fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4));\n // }\n\n\n _getFile(key) {\n if (key == \"settings\" || key == \"plugins\" || key == \"themes\") return path.resolve(this.dataFolder, `${key}.json`);\n return path.resolve(this.dataFolder, `misc.json`);\n }\n\n getBDData(key) {\n return this.data.misc[key] || \"\";\n }\n\n setBDData(key, value) {\n this.data.misc[key] = value;\n fs.writeFileSync(path.resolve(this.dataFolder, `misc.json`), JSON.stringify(this.data.misc, null, 4));\n }\n\n getLocale(locale) {\n const file = path.resolve(this.localeFolder, `${locale}.json`);\n if (!fs.existsSync(file)) return null;\n return _utilities__WEBPACK_IMPORTED_MODULE_1__[\"default\"].testJSON(fs.readFileSync(file).toString());\n }\n\n saveLocale(locale, strings) {\n fs.writeFileSync(path.resolve(this.localeFolder, `${locale}.json`), JSON.stringify(strings, null, 4));\n }\n\n getData(key) {\n return this.data[key] || \"\";\n }\n\n setData(key, value) {\n this.data[key] = value;\n fs.writeFileSync(path.resolve(this.dataFolder, `${key}.json`), JSON.stringify(value, null, 4));\n }\n\n loadCustomCSS() {\n return fs.readFileSync(this.customCSS).toString();\n }\n\n saveCustomCSS(css) {\n return fs.writeFileSync(this.customCSS, css);\n }\n\n getPluginData(pluginName, key) {\n if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key] || undefined;\n if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined;\n this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName)));\n return this.pluginData[pluginName][key] || undefined;\n }\n\n setPluginData(pluginName, key, value) {\n if (value === undefined) return;\n if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};\n this.pluginData[pluginName][key] = value;\n fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4));\n }\n\n deletePluginData(pluginName, key) {\n if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};\n delete this.pluginData[pluginName][key];\n fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4));\n }\n\n}());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL21vZHVsZXMvZGF0YXN0b3JlLmpzPzEwNTIiXSwibmFtZXMiOlsiZnMiLCJyZXF1aXJlIiwicGF0aCIsInJlbGVhc2VDaGFubmVsIiwiRGlzY29yZE5hdGl2ZSIsImdsb2JhbHMiLCJEYXRhU3RvcmUiLCJjb25zdHJ1Y3RvciIsImRhdGEiLCJtaXNjIiwicGx1Z2luRGF0YSIsImluaXRpYWxpemUiLCJleGlzdHNTeW5jIiwiYmFzZUZvbGRlciIsIm1rZGlyU3luYyIsImRhdGFGb2xkZXIiLCJsb2NhbGVGb2xkZXIiLCJCREZpbGUiLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsImN1c3RvbUNTUyIsImRhdGFGaWxlcyIsInJlYWRkaXJTeW5jIiwiZmlsdGVyIiwiZiIsInN0YXRTeW5jIiwicmVzb2x2ZSIsImlzRGlyZWN0b3J5IiwiZW5kc1dpdGgiLCJmaWxlIiwic3BsaXQiLCJfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyIsIl9jdXN0b21DU1MiLCJfYmFzZUZvbGRlciIsIkNvbmZpZyIsImRhdGFQYXRoIiwiX2RhdGFGb2xkZXIiLCJfbG9jYWxlRm9sZGVyIiwiX0JERmlsZSIsImdldFBsdWdpbkZpbGUiLCJwbHVnaW5OYW1lIiwiX2dldEZpbGUiLCJrZXkiLCJnZXRCRERhdGEiLCJzZXRCRERhdGEiLCJ2YWx1ZSIsImdldExvY2FsZSIsImxvY2FsZSIsIlV0aWxpdGllcyIsInRlc3RKU09OIiwicmVhZEZpbGVTeW5jIiwidG9TdHJpbmciLCJzYXZlTG9jYWxlIiwic3RyaW5ncyIsImdldERhdGEiLCJzZXREYXRhIiwibG9hZEN1c3RvbUNTUyIsInNhdmVDdXN0b21DU1MiLCJjc3MiLCJnZXRQbHVnaW5EYXRhIiwidW5kZWZpbmVkIiwicGFyc2UiLCJzZXRQbHVnaW5EYXRhIiwiZGVsZXRlUGx1Z2luRGF0YSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFDQSxNQUFNQSxF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O0FBQy9DLFNBQUsvQixVQUFMLENBQWdCK0IsVUFBaEIsRUFBNEJFLEdBQTVCLElBQW1DRyxLQUFuQztBQUNBOUMsTUFBRSxDQUFDa0IsYUFBSCxDQUFpQixLQUFLc0IsYUFBTCxDQUFtQkMsVUFBbkIsQ0FBakIsRUFBaUR0QixJQUFJLENBQUNDLFNBQUwsQ0FBZSxLQUFLVixVQUFMLENBQWdCK0IsVUFBaEIsQ0FBZixFQUE0QyxJQUE1QyxFQUFrRCxDQUFsRCxDQUFqRDtBQUNIOztBQUVEdUIsa0JBQWdCLENBQUN2QixVQUFELEVBQWFFLEdBQWIsRUFBa0I7QUFDOUIsUUFBSSxLQUFLakMsVUFBTCxDQUFnQitCLFVBQWhCLE1BQWdDb0IsU0FBcEMsRUFBK0MsS0FBS25ELFVBQUwsQ0FBZ0IrQixVQUFoQixJQUE4QixFQUE5QjtBQUMvQyxXQUFPLEtBQUsvQixVQUFMLENBQWdCK0IsVUFBaEIsRUFBNEJFLEdBQTVCLENBQVA7QUFDQTNDLE1BQUUsQ0FBQ2tCLGFBQUgsQ0FBaUIsS0FBS3NCLGFBQUwsQ0FBbUJDLFVBQW5CLENBQWpCLEVBQWlEdEIsSUFBSSxDQUFDQyxTQUFMLENBQWUsS0FBS1YsVUFBTCxDQUFnQitCLFVBQWhCLENBQWYsRUFBNEMsSUFBNUMsRUFBa0QsQ0FBbEQsQ0FBakQ7QUFDSDs7QUF0RzhCLENBQXBCLEVBQWYiLCJmaWxlIjoiLi9zcmMvbW9kdWxlcy9kYXRhc3RvcmUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSBcImRhdGFcIjtcclxuaW1wb3J0IFV0aWxpdGllcyBmcm9tIFwiLi91dGlsaXRpZXNcIjtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgcmVsZWFzZUNoYW5uZWwgPSBEaXNjb3JkTmF0aXZlLmdsb2JhbHMucmVsZWFzZUNoYW5uZWw7XHJcblxyXG4vLyBTY2hlbWFcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT1cclxuLy8gJWFwcGRhdGElXFxCZXR0ZXJEaXNjb3JkXHJcbi8vICAgICAtPiBkYXRhXHJcbi8vICAgICAgICAgLT4gW3JlbGVhc2VDaGFubmVsXVxcIChzdGFibGUvY2FuYXJ5L3B0YilcclxuLy8gICAgICAgICAgICAgLT4gc2V0dGluZ3MuanNvblxyXG4vLyAgICAgICAgICAgICAtPiBwbHVnaW5zLmpzb25cclxuLy8gICAgICAgICAgICAgLT4gdGhlbWVzLmpzb25cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEYXRhU3RvcmUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0ge21pc2M6IHt9fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGEgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmJhc2VGb2xkZXIpKSBmcy5ta2RpclN5bmModGhpcy5iYXNlRm9sZGVyKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5kYXRhRm9sZGVyKSkgZnMubWtkaXJTeW5jKHRoaXMuZGF0YUZvbGRlcik7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9jYWxlRm9sZGVyKSkgZnMubWtkaXJTeW5jKHRoaXMubG9jYWxlRm9sZGVyKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEubWlzYywgbnVsbCwgNCkpO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmN1c3RvbUNTUykpIGZzLndyaXRlRmlsZVN5bmModGhpcy5jdXN0b21DU1MsIFwiXCIpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZGF0YUZvbGRlcikuZmlsdGVyKGYgPT4gIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZSh0aGlzLmRhdGFGb2xkZXIsIGYpKS5pc0RpcmVjdG9yeSgpICYmIGYuZW5kc1dpdGgoXCIuanNvblwiKSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGRhdGFGaWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFbZmlsZS5zcGxpdChcIi5cIilbMF1dID0gX19ub25fd2VicGFja19yZXF1aXJlX18ocGF0aC5yZXNvbHZlKHRoaXMuZGF0YUZvbGRlciwgZmlsZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLmRhdGEgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyh0aGlzLkJERmlsZSk7XHJcbiAgICAgICAgLy8gaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICAvLyBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpKSByZXR1cm47XHJcbiAgICAgICAgLy8gbGV0IHNldHRpbmdzID0gX19ub25fd2VicGFja19yZXF1aXJlX18odGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgIC8vIGZzLnVubGlua1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgIC8vIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCB7W3JlbGVhc2VDaGFubmVsXTogc2V0dGluZ3N9KTtcclxuICAgICAgICAvLyBlbHNlIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHNldHRpbmdzKTtcclxuICAgICAgICAvLyB0aGlzLnNldEJERGF0YShcInNldHRpbmdzXCIsIHNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VzdG9tQ1NTKCkge3JldHVybiB0aGlzLl9jdXN0b21DU1MgfHwgKHRoaXMuX2N1c3RvbUNTUyA9IHBhdGgucmVzb2x2ZSh0aGlzLmRhdGFGb2xkZXIsIFwiY3VzdG9tLmNzc1wiKSk7fVxyXG4gICAgZ2V0IGJhc2VGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX2Jhc2VGb2xkZXIgfHwgKHRoaXMuX2Jhc2VGb2xkZXIgPSBwYXRoLnJlc29sdmUoQ29uZmlnLmRhdGFQYXRoLCBcImRhdGFcIikpO31cclxuICAgIGdldCBkYXRhRm9sZGVyKCkge3JldHVybiB0aGlzLl9kYXRhRm9sZGVyIHx8ICh0aGlzLl9kYXRhRm9sZGVyID0gcGF0aC5yZXNvbHZlKHRoaXMuYmFzZUZvbGRlciwgYCR7cmVsZWFzZUNoYW5uZWx9YCkpO31cclxuICAgIGdldCBsb2NhbGVGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX2xvY2FsZUZvbGRlciB8fCAodGhpcy5fbG9jYWxlRm9sZGVyID0gcGF0aC5yZXNvbHZlKHRoaXMuYmFzZUZvbGRlciwgYGxvY2FsZXNgKSk7fVxyXG4gICAgZ2V0IEJERmlsZSgpIHtyZXR1cm4gdGhpcy5fQkRGaWxlIHx8ICh0aGlzLl9CREZpbGUgPSBwYXRoLnJlc29sdmUoQ29uZmlnLmRhdGFQYXRoLCBcImRhdGFcIiwgYCR7cmVsZWFzZUNoYW5uZWx9Lmpzb25gKSk7fVxyXG4gICAgLy8gZ2V0IHNldHRpbmdzRmlsZSgpIHtyZXR1cm4gdGhpcy5fc2V0dGluZ3NGaWxlIHx8ICh0aGlzLl9zZXR0aW5nc0ZpbGUgPSBwYXRoLnJlc29sdmUoQ29uZmlnLmRhdGFQYXRoLCBcImJkc2V0dGluZ3MuanNvblwiKSk7fVxyXG4gICAgZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSB7cmV0dXJuIHBhdGgucmVzb2x2ZShDb25maWcuZGF0YVBhdGgsIFwicGx1Z2luc1wiLCBwbHVnaW5OYW1lICsgXCIuY29uZmlnLmpzb25cIik7fVxyXG5cclxuICAgIC8vIGdldFNldHRpbmdHcm91cChrZXkpIHtcclxuICAgIC8vICAgICByZXR1cm4gdGhpcy5kYXRhLnNldHRpbmdzW2tleV0gfHwgbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzZXRTZXR0aW5nR3JvdXAoa2V5LCBkYXRhKSB7XHJcbiAgICAvLyAgICAgdGhpcy5kYXRhLnNldHRpbmdzW2tleV0gPSBkYXRhO1xyXG4gICAgLy8gICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCkpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIF9nZXRGaWxlKGtleSkge1xyXG4gICAgICAgIGlmIChrZXkgPT0gXCJzZXR0aW5nc1wiIHx8IGtleSA9PSBcInBsdWdpbnNcIiB8fCBrZXkgPT0gXCJ0aGVtZXNcIikgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLmRhdGFGb2xkZXIsIGAke2tleX0uanNvbmApO1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5kYXRhRm9sZGVyLCBgbWlzYy5qc29uYCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QkREYXRhKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubWlzY1trZXldIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QkREYXRhKGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGEubWlzY1trZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLnJlc29sdmUodGhpcy5kYXRhRm9sZGVyLCBgbWlzYy5qc29uYCksIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS5taXNjLCBudWxsLCA0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TG9jYWxlKGxvY2FsZSkge1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUodGhpcy5sb2NhbGVGb2xkZXIsIGAke2xvY2FsZX0uanNvbmApO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxpdGllcy50ZXN0SlNPTihmcy5yZWFkRmlsZVN5bmMoZmlsZSkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUxvY2FsZShsb2NhbGUsIHN0cmluZ3MpIHtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGgucmVzb2x2ZSh0aGlzLmxvY2FsZUZvbGRlciwgYCR7bG9jYWxlfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHN0cmluZ3MsIG51bGwsIDQpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFba2V5XSB8fCBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERhdGEoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLnJlc29sdmUodGhpcy5kYXRhRm9sZGVyLCBgJHtrZXl9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDQpKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkQ3VzdG9tQ1NTKCkge1xyXG4gICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5jdXN0b21DU1MpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUN1c3RvbUNTUyhjc3MpIHtcclxuICAgICAgICByZXR1cm4gZnMud3JpdGVGaWxlU3luYyh0aGlzLmN1c3RvbUNTUywgY3NzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkpKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV0gfHwgdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpKTtcclxuICAgIH1cclxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/modules/datastore.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! data */ \"./src/data/data.js\");\n/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utilities */ \"./src/modules/utilities.js\");\n\n\n\nconst fs = __webpack_require__(/*! fs */ \"fs\");\n\nconst path = __webpack_require__(/*! path */ \"path\");\n\nconst releaseChannel = DiscordNative.globals.releaseChannel; // Schema\n// =======================\n// %appdata%\\BetterDiscord\n// -> data\n// -> [releaseChannel]\\ (stable/canary/ptb)\n// -> settings.json\n// -> plugins.json\n// -> themes.json\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (new class DataStore {\n constructor() {\n this.data = {\n misc: {}\n };\n this.pluginData = {};\n this.localeHashes = {};\n }\n\n initialize() {\n if (!fs.existsSync(this.baseFolder)) fs.mkdirSync(this.baseFolder);\n if (!fs.existsSync(this.dataFolder)) fs.mkdirSync(this.dataFolder);\n if (!fs.existsSync(this.localeFolder)) fs.mkdirSync(this.localeFolder);\n if (!fs.existsSync(this.localeCache)) fs.writeFileSync(this.localeCache, JSON.stringify({}));\n if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data.misc, null, 4));\n if (!fs.existsSync(this.customCSS)) fs.writeFileSync(this.customCSS, \"\");\n const dataFiles = fs.readdirSync(this.dataFolder).filter(f => !fs.statSync(path.resolve(this.dataFolder, f)).isDirectory() && f.endsWith(\".json\"));\n\n for (const file of dataFiles) {\n this.data[file.split(\".\")[0]] = require(path.resolve(this.dataFolder, file));\n }\n\n this.localeHashes = JSON.parse(fs.readFileSync(this.localeCache).toString());\n }\n\n get customCSS() {\n return this._customCSS || (this._customCSS = path.resolve(this.dataFolder, \"custom.css\"));\n }\n\n get baseFolder() {\n return this._baseFolder || (this._baseFolder = path.resolve(data__WEBPACK_IMPORTED_MODULE_0__[\"Config\"].dataPath, \"data\"));\n }\n\n get dataFolder() {\n return this._dataFolder || (this._dataFolder = path.resolve(this.baseFolder, `${releaseChannel}`));\n }\n\n get localeFolder() {\n return this._localeFolder || (this._localeFolder = path.resolve(this.baseFolder, `locales`));\n }\n\n get localeCache() {\n return this._localeCache || (this._localeCache = path.resolve(this.localeFolder, `.cache`));\n }\n\n get BDFile() {\n return this._BDFile || (this._BDFile = path.resolve(data__WEBPACK_IMPORTED_MODULE_0__[\"Config\"].dataPath, \"data\", `${releaseChannel}.json`));\n }\n\n getPluginFile(pluginName) {\n return path.resolve(data__WEBPACK_IMPORTED_MODULE_0__[\"Config\"].dataPath, \"plugins\", pluginName + \".config.json\");\n }\n\n _getFile(key) {\n if (key == \"settings\" || key == \"plugins\" || key == \"themes\") return path.resolve(this.dataFolder, `${key}.json`);\n return path.resolve(this.dataFolder, `misc.json`);\n }\n\n getBDData(key) {\n return this.data.misc[key] || \"\";\n }\n\n setBDData(key, value) {\n this.data.misc[key] = value;\n fs.writeFileSync(path.resolve(this.dataFolder, `misc.json`), JSON.stringify(this.data.misc, null, 4));\n }\n\n getLocale(locale) {\n const file = path.resolve(this.localeFolder, `${locale}.json`);\n if (!fs.existsSync(file)) return null;\n return _utilities__WEBPACK_IMPORTED_MODULE_1__[\"default\"].testJSON(fs.readFileSync(file).toString());\n }\n\n saveLocale(locale, strings) {\n fs.writeFileSync(path.resolve(this.localeFolder, `${locale}.json`), JSON.stringify(strings, null, 4));\n }\n\n getLocaleHash(locale) {\n return this.localeHashes[locale] || \"\";\n }\n\n saveLocaleHash(locale, hash) {\n this.localeHashes[locale] = hash;\n fs.writeFileSync(this.localeCache, JSON.stringify(this.localeHashes, null, 4));\n }\n\n getData(key) {\n return this.data[key] || \"\";\n }\n\n setData(key, value) {\n this.data[key] = value;\n fs.writeFileSync(path.resolve(this.dataFolder, `${key}.json`), JSON.stringify(value, null, 4));\n }\n\n loadCustomCSS() {\n return fs.readFileSync(this.customCSS).toString();\n }\n\n saveCustomCSS(css) {\n return fs.writeFileSync(this.customCSS, css);\n }\n\n getPluginData(pluginName, key) {\n if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key] || undefined;\n if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined;\n this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName)));\n return this.pluginData[pluginName][key] || undefined;\n }\n\n setPluginData(pluginName, key, value) {\n if (value === undefined) return;\n if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};\n this.pluginData[pluginName][key] = value;\n fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4));\n }\n\n deletePluginData(pluginName, key) {\n if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};\n delete this.pluginData[pluginName][key];\n fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4));\n }\n\n}());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL21vZHVsZXMvZGF0YXN0b3JlLmpzPzEwNTIiXSwibmFtZXMiOlsiZnMiLCJyZXF1aXJlIiwicGF0aCIsInJlbGVhc2VDaGFubmVsIiwiRGlzY29yZE5hdGl2ZSIsImdsb2JhbHMiLCJEYXRhU3RvcmUiLCJjb25zdHJ1Y3RvciIsImRhdGEiLCJtaXNjIiwicGx1Z2luRGF0YSIsImxvY2FsZUhhc2hlcyIsImluaXRpYWxpemUiLCJleGlzdHNTeW5jIiwiYmFzZUZvbGRlciIsIm1rZGlyU3luYyIsImRhdGFGb2xkZXIiLCJsb2NhbGVGb2xkZXIiLCJsb2NhbGVDYWNoZSIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5IiwiQkRGaWxlIiwiY3VzdG9tQ1NTIiwiZGF0YUZpbGVzIiwicmVhZGRpclN5bmMiLCJmaWx0ZXIiLCJmIiwic3RhdFN5bmMiLCJyZXNvbHZlIiwiaXNEaXJlY3RvcnkiLCJlbmRzV2l0aCIsImZpbGUiLCJzcGxpdCIsIl9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJ0b1N0cmluZyIsIl9jdXN0b21DU1MiLCJfYmFzZUZvbGRlciIsIkNvbmZpZyIsImRhdGFQYXRoIiwiX2RhdGFGb2xkZXIiLCJfbG9jYWxlRm9sZGVyIiwiX2xvY2FsZUNhY2hlIiwiX0JERmlsZSIsImdldFBsdWdpbkZpbGUiLCJwbHVnaW5OYW1lIiwiX2dldEZpbGUiLCJrZXkiLCJnZXRCRERhdGEiLCJzZXRCRERhdGEiLCJ2YWx1ZSIsImdldExvY2FsZSIsImxvY2FsZSIsIlV0aWxpdGllcyIsInRlc3RKU09OIiwic2F2ZUxvY2FsZSIsInN0cmluZ3MiLCJnZXRMb2NhbGVIYXNoIiwic2F2ZUxvY2FsZUhhc2giLCJoYXNoIiwiZ2V0RGF0YSIsInNldERhdGEiLCJsb2FkQ3VzdG9tQ1NTIiwic2F2ZUN1c3RvbUNTUyIsImNzcyIsImdldFBsdWdpbkRhdGEiLCJ1bmRlZmluZWQiLCJz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QUFnQixDQUFDdkIsVUFBRCxFQUFhRSxHQUFiLEVBQWtCO0FBQzlCLFFBQUksS0FBS3ZDLFVBQUwsQ0FBZ0JxQyxVQUFoQixNQUFnQ3FCLFNBQXBDLEVBQStDLEtBQUsxRCxVQUFMLENBQWdCcUMsVUFBaEIsSUFBOEIsRUFBOUI7QUFDL0MsV0FBTyxLQUFLckMsVUFBTCxDQUFnQnFDLFVBQWhCLEVBQTRCRSxHQUE1QixDQUFQO0FBQ0FqRCxNQUFFLENBQUNtQixhQUFILENBQWlCLEtBQUsyQixhQUFMLENBQW1CQyxVQUFuQixDQUFqQixFQUFpRDNCLElBQUksQ0FBQ0MsU0FBTCxDQUFlLEtBQUtYLFVBQUwsQ0FBZ0JxQyxVQUFoQixDQUFmLEVBQTRDLElBQTVDLEVBQWtELENBQWxELENBQWpEO0FBQ0g7O0FBbEc4QixDQUFwQixFQUFmIiwiZmlsZSI6Ii4vc3JjL21vZHVsZXMvZGF0YXN0b3JlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25maWd9IGZyb20gXCJkYXRhXCI7XHJcbmltcG9ydCBVdGlsaXRpZXMgZnJvbSBcIi4vdXRpbGl0aWVzXCI7XHJcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IHJlbGVhc2VDaGFubmVsID0gRGlzY29yZE5hdGl2ZS5nbG9iYWxzLnJlbGVhc2VDaGFubmVsO1xyXG5cclxuLy8gU2NoZW1hXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09XHJcbi8vICVhcHBkYXRhJVxcQmV0dGVyRGlzY29yZFxyXG4vLyAgICAgLT4gZGF0YVxyXG4vLyAgICAgICAgIC0+IFtyZWxlYXNlQ2hhbm5lbF1cXCAoc3RhYmxlL2NhbmFyeS9wdGIpXHJcbi8vICAgICAgICAgICAgIC0+IHNldHRpbmdzLmpzb25cclxuLy8gICAgICAgICAgICAgLT4gcGx1Z2lucy5qc29uXHJcbi8vICAgICAgICAgICAgIC0+IHRoZW1lcy5qc29uXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGF0YVN0b3JlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHttaXNjOiB7fX07XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhID0ge307XHJcbiAgICAgICAgdGhpcy5sb2NhbGVIYXNoZXMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmJhc2VGb2xkZXIpKSBmcy5ta2RpclN5bmModGhpcy5iYXNlRm9sZGVyKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5kYXRhRm9sZGVyKSkgZnMubWtkaXJTeW5jKHRoaXMuZGF0YUZvbGRlcik7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9jYWxlRm9sZGVyKSkgZnMubWtkaXJTeW5jKHRoaXMubG9jYWxlRm9sZGVyKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2NhbGVDYWNoZSkpIGZzLndyaXRlRmlsZVN5bmModGhpcy5sb2NhbGVDYWNoZSwgSlNPTi5zdHJpbmdpZnkoe30pKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEubWlzYywgbnVsbCwgNCkpO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmN1c3RvbUNTUykpIGZzLndyaXRlRmlsZVN5bmModGhpcy5jdXN0b21DU1MsIFwiXCIpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZGF0YUZvbGRlcikuZmlsdGVyKGYgPT4gIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZSh0aGlzLmRhdGFGb2xkZXIsIGYpKS5pc0RpcmVjdG9yeSgpICYmIGYuZW5kc1dpdGgoXCIuanNvblwiKSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGRhdGFGaWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFbZmlsZS5zcGxpdChcIi5cIilbMF1dID0gX19ub25fd2VicGFja19yZXF1aXJlX18ocGF0aC5yZXNvbHZlKHRoaXMuZGF0YUZvbGRlciwgZmlsZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvY2FsZUhhc2hlcyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMubG9jYWxlQ2FjaGUpLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXN0b21DU1MoKSB7cmV0dXJuIHRoaXMuX2N1c3RvbUNTUyB8fCAodGhpcy5fY3VzdG9tQ1NTID0gcGF0aC5yZXNvbHZlKHRoaXMuZGF0YUZvbGRlciwgXCJjdXN0b20uY3NzXCIpKTt9XHJcbiAgICBnZXQgYmFzZUZvbGRlcigpIHtyZXR1cm4gdGhpcy5fYmFzZUZvbGRlciB8fCAodGhpcy5fYmFzZUZvbGRlciA9IHBhdGgucmVzb2x2ZShDb25maWcuZGF0YVBhdGgsIFwiZGF0YVwiKSk7fVxyXG4gICAgZ2V0IGRhdGFGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX2RhdGFGb2xkZXIgfHwgKHRoaXMuX2RhdGFGb2xkZXIgPSBwYXRoLnJlc29sdmUodGhpcy5iYXNlRm9sZGVyLCBgJHtyZWxlYXNlQ2hhbm5lbH1gKSk7fVxyXG4gICAgZ2V0IGxvY2FsZUZvbGRlcigpIHtyZXR1cm4gdGhpcy5fbG9jYWxlRm9sZGVyIHx8ICh0aGlzLl9sb2NhbGVGb2xkZXIgPSBwYXRoLnJlc29sdmUodGhpcy5iYXNlRm9sZGVyLCBgbG9jYWxlc2ApKTt9XHJcbiAgICBnZXQgbG9jYWxlQ2FjaGUoKSB7cmV0dXJuIHRoaXMuX2xvY2FsZUNhY2hlIHx8ICh0aGlzLl9sb2NhbGVDYWNoZSA9IHBhdGgucmVzb2x2ZSh0aGlzLmxvY2FsZUZvbGRlciwgYC5jYWNoZWApKTt9XHJcbiAgICBnZXQgQkRGaWxlKCkge3JldHVybiB0aGlzLl9CREZpbGUgfHwgKHRoaXMuX0JERmlsZSA9IHBhdGgucmVzb2x2ZShDb25maWcuZGF0YVBhdGgsIFwiZGF0YVwiLCBgJHtyZWxlYXNlQ2hhbm5lbH0uanNvbmApKTt9XHJcbiAgICBnZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpIHtyZXR1cm4gcGF0aC5yZXNvbHZlKENvbmZpZy5kYXRhUGF0aCwgXCJwbHVnaW5zXCIsIHBsdWdpbk5hbWUgKyBcIi5jb25maWcuanNvblwiKTt9XHJcblxyXG5cclxuICAgIF9nZXRGaWxlKGtleSkge1xyXG4gICAgICAgIGlmIChrZXkgPT0gXCJzZXR0aW5nc1wiIHx8IGtleSA9PSBcInBsdWdpbnNcIiB8fCBrZXkgPT0gXCJ0aGVtZXNcIikgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLmRhdGFGb2xkZXIsIGAke2tleX0uanNvbmApO1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5kYXRhRm9sZGVyLCBgbWlzYy5qc29uYCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QkREYXRhKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubWlzY1trZXldIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QkREYXRhKGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGEubWlzY1trZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLnJlc29sdmUodGhpcy5kYXRhRm9sZGVyLCBgbWlzYy5qc29uYCksIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS5taXNjLCBudWxsLCA0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TG9jYWxlKGxvY2FsZSkge1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUodGhpcy5sb2NhbGVGb2xkZXIsIGAke2xvY2FsZX0uanNvbmApO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxpdGllcy50ZXN0SlNPTihmcy5yZWFkRmlsZVN5bmMoZmlsZSkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUxvY2FsZShsb2NhbGUsIHN0cmluZ3MpIHtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGgucmVzb2x2ZSh0aGlzLmxvY2FsZUZvbGRlciwgYCR7bG9jYWxlfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHN0cmluZ3MsIG51bGwsIDQpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMb2NhbGVIYXNoKGxvY2FsZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZUhhc2hlc1tsb2NhbGVdIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUxvY2FsZUhhc2gobG9jYWxlLCBoYXNoKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbGVIYXNoZXNbbG9jYWxlXSA9IGhhc2g7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmxvY2FsZUNhY2hlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmxvY2FsZUhhc2hlcywgbnVsbCwgNCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERhdGEoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGF0YShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGgucmVzb2x2ZSh0aGlzLmRhdGFGb2xkZXIsIGAke2tleX0uanNvbmApLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgNCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRDdXN0b21DU1MoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmN1c3RvbUNTUykudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQ3VzdG9tQ1NTKGNzcykge1xyXG4gICAgICAgIHJldHVybiBmcy53cml0ZUZpbGVTeW5jKHRoaXMuY3VzdG9tQ1NTLCBjc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV0gfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XSB8fCB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID09PSB1bmRlZmluZWQpIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IHt9O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICBkZWxldGUgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCkpO1xyXG4gICAgfVxyXG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/modules/datastore.js\n"); /***/ }), @@ -443,7 +443,7 @@ eval("__webpack_require__.r(__webpack_exports__);\nconst EventEmitter = __webpac /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _data_strings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/strings */ \"./src/data/strings.js\");\n/* harmony import */ var _discordmodules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./discordmodules */ \"./src/modules/discordmodules.js\");\n/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utilities */ \"./src/modules/utilities.js\");\n/* harmony import */ var _emitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./emitter */ \"./src/modules/emitter.js\");\n/* harmony import */ var _datastore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./datastore */ \"./src/modules/datastore.js\");\n\n\n\n\n\n\nconst request = __webpack_require__(/*! request */ \"request\");\n\nconst {\n Dispatcher,\n DiscordConstants,\n UserSettingsStore\n} = _discordmodules__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (new class LocaleManager {\n get discordLocale() {\n return UserSettingsStore.locale.split(\"-\")[0];\n }\n\n get defaultLocale() {\n return \"en\";\n }\n\n constructor() {\n this.locale = \"\";\n this.strings = {};\n }\n\n async initialize() {\n await this.setLocale(this.discordLocale);\n Dispatcher.subscribe(DiscordConstants.ActionTypes.USER_SETTINGS_UPDATE, ({\n settings\n }) => {\n const newLocale = settings.locale;\n if (newLocale && newLocale != this.locale) this.setLocale(newLocale.split(\"-\")[0]);\n });\n }\n\n async setLocale(newLocale) {\n let newStrings;\n\n if (newLocale != this.defaultLocale) {\n const savedStrings = _datastore__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLocale(newLocale);\n newStrings = savedStrings || (await this.downloadLocale(newLocale));\n if (!newStrings) return this.setLocale(this.defaultLocale);\n } else {\n newStrings = _data_strings__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n }\n\n this.locale = newLocale;\n _utilities__WEBPACK_IMPORTED_MODULE_2__[\"default\"].extend(this.strings, newStrings);\n _emitter__WEBPACK_IMPORTED_MODULE_3__[\"default\"].emit(\"strings-updated\");\n }\n\n downloadLocale(locale) {\n return new Promise(resolve => {\n const options = {\n url: `https://raw.githubusercontent.com/rauenzi/BetterDiscordApp/development/data/locales/${locale}.json`,\n //`https://rauenzi.github.io/BetterDiscordApp/data/locales/${discordLocale}.json`,\n timeout: 2000,\n json: true\n };\n request.get(options, (err, resp, newStrings) => {\n if (err || resp.statusCode !== 200) return resolve(null);\n _datastore__WEBPACK_IMPORTED_MODULE_4__[\"default\"].saveLocale(locale, newStrings);\n resolve(newStrings);\n });\n });\n }\n\n}());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL21vZHVsZXMvbG9jYWxlbWFuYWdlci5qcz8yMzlkIl0sIm5hbWVzIjpbInJlcXVlc3QiLCJyZXF1aXJlIiwiRGlzcGF0Y2hlciIsIkRpc2NvcmRDb25zdGFudHMiLCJVc2VyU2V0dGluZ3NTdG9yZSIsIkRpc2NvcmRNb2R1bGVzIiwiTG9jYWxlTWFuYWdlciIsImRpc2NvcmRMb2NhbGUiLCJsb2NhbGUiLCJzcGxpdCIsImRlZmF1bHRMb2NhbGUiLCJjb25zdHJ1Y3RvciIsInN0cmluZ3MiLCJpbml0aWFsaXplIiwic2V0TG9jYWxlIiwic3Vic2NyaWJlIiwiQWN0aW9uVHlwZXMiLCJVU0VSX1NFVFRJTkdTX1VQREFURSIsInNldHRpbmdzIiwibmV3TG9jYWxlIiwibmV3U3RyaW5ncyIsInNhdmVkU3RyaW5ncyIsIkRhdGFTdG9yZSIsImdldExvY2FsZSIsImRvd25sb2FkTG9jYWxlIiwiRGVmYXVsdFN0cmluZ3MiLCJVdGlsaXRpZXMiLCJleHRlbmQiLCJFdmVudHMiLCJlbWl0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJvcHRpb25zIiwidXJsIiwidGltZW91dCIsImpzb24iLCJnZXQiLCJlcnIiLCJyZXNwIiwic3RhdHVzQ29kZSIsInNhdmVMb2NhbGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUEsT0FBTyxHQUFHQyxtQkFBTyxDQUFDLHdCQUFELENBQXZCOztBQUVBLE1BQU07QUFBQ0MsWUFBRDtBQUFhQyxrQkFBYjtBQUErQkM7QUFBL0IsSUFBb0RDLHVEQUExRDtBQUVlLG1FQUFJLE1BQU1DLGFBQU4sQ0FBb0I7QUFDdEMsTUFBSUMsYUFBSixHQUFvQjtBQUFDLFdBQU9ILGlCQUFpQixDQUFDSSxNQUFsQixDQUF5QkMsS0FBekIsQ0FBK0IsR0FBL0IsRUFBb0MsQ0FBcEMsQ0FBUDtBQUErQzs7QUFDcEUsTUFBSUMsYUFBSixHQUFvQjtBQUFDLFdBQU8sSUFBUDtBQUFhOztBQUVsQ0MsYUFBVyxHQUFHO0FBQ1AsU0FBS0gsTUFBTCxHQUFjLEVBQWQ7QUFDQSxTQUFLSSxPQUFMLEdBQWUsRUFBZjtBQUNOOztBQUVELFFBQU1DLFVBQU4sR0FBbUI7QUFDWixVQUFNLEtBQUtDLFNBQUwsQ0FBZSxLQUFLUCxhQUFwQixDQUFOO0FBQ0FMLGNBQVUsQ0FBQ2EsU0FBWCxDQUFxQlosZ0JBQWdCLENBQUNhLFdBQWpCLENBQTZCQyxvQkFBbEQsRUFBd0UsQ0FBQztBQUFDQztBQUFELEtBQUQsS0FBZ0I7QUFDcEYsWUFBTUMsU0FBUyxHQUFHRCxRQUFRLENBQUNWLE1BQTNCO0FBQ0EsVUFBSVcsU0FBUyxJQUFJQSxTQUFTLElBQUksS0FBS1gsTUFBbkMsRUFBMkMsS0FBS00sU0FBTCxDQUFlSyxTQUFTLENBQUNWLEtBQVYsQ0FBZ0IsR0FBaEIsRUFBcUIsQ0FBckIsQ0FBZjtBQUM5QyxLQUhEO0FBSU47O0FBRUQsUUFBTUssU0FBTixDQUFnQkssU0FBaEIsRUFBMkI7QUFDcEIsUUFBSUMsVUFBSjs7QUFDQSxRQUFJRCxTQUFTLElBQUksS0FBS1QsYUFBdEIsRUFBcUM7QUFDakMsWUFBTVcsWUFBWSxHQUFHQyxrREFBUyxDQUFDQyxTQUFWLENBQW9CSixTQUFwQixDQUFyQjtBQUNBQyxnQkFBVSxHQUFHQyxZQUFZLEtBQUksTUFBTSxLQUFLRyxjQUFMLENBQW9CTCxTQUFwQixDQUFWLENBQXpCO0FBQ0EsVUFBSSxDQUFDQyxVQUFMLEVBQWlCLE9BQU8sS0FBS04sU0FBTCxDQUFlLEtBQUtKLGFBQXBCLENBQVA7QUFDcEIsS0FKRCxNQUtLO0FBQ0RVLGdCQUFVLEdBQUdLLHFEQUFiO0FBQ0g7O0FBQ1AsU0FBS2pCLE1BQUwsR0FBY1csU0FBZDtBQUNBTyxzREFBUyxDQUFDQyxNQUFWLENBQWlCLEtBQUtmLE9BQXRCLEVBQStCUSxVQUEvQjtBQUNBUSxvREFBTSxDQUFDQyxJQUFQLENBQVksaUJBQVo7QUFDQTs7QUFFREwsZ0JBQWMsQ0FBQ2hCLE1BQUQsRUFBUztBQUN0QixXQUFPLElBQUlzQixPQUFKLENBQVlDLE9BQU8sSUFBSTtBQUM3QixZQUFNQyxPQUFPLEdBQUc7QUFDZkMsV0FBRyxFQUFHLHVGQUFzRnpCLE1BQU8sT0FEcEY7QUFDMkY7QUFDMUcwQixlQUFPLEVBQUUsSUFGTTtBQUdmQyxZQUFJLEVBQUU7QUFIUyxPQUFoQjtBQUtBbkMsYUFBTyxDQUFDb0MsR0FBUixDQUFZSixPQUFaLEVBQXFCLENBQUNLLEdBQUQsRUFBTUMsSUFBTixFQUFZbEIsVUFBWixLQUEyQjtBQUNuQyxZQUFJaUIsR0FBRyxJQUFJQyxJQUFJLENBQUNDLFVBQUwsS0FBb0IsR0FBL0IsRUFBb0MsT0FBT1IsT0FBTyxDQUFDLElBQUQsQ0FBZDtBQUNwQ1QsMERBQVMsQ0FBQ2tCLFVBQVYsQ0FBcUJoQyxNQUFyQixFQUE2QlksVUFBN0I7QUFDWlcsZUFBTyxDQUFDWCxVQUFELENBQVA7QUFDQSxPQUpEO0FBS0EsS0FYTSxDQUFQO0FBWUE7O0FBN0NxQyxDQUF4QixFQUFmIiwiZmlsZSI6Ii4vc3JjL21vZHVsZXMvbG9jYWxlbWFuYWdlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEZWZhdWx0U3RyaW5ncyBmcm9tIFwiLi4vZGF0YS9zdHJpbmdzXCI7XHJcbmltcG9ydCBEaXNjb3JkTW9kdWxlcyBmcm9tIFwiLi9kaXNjb3JkbW9kdWxlc1wiO1xyXG5pbXBvcnQgVXRpbGl0aWVzIGZyb20gXCIuL3V0aWxpdGllc1wiO1xyXG5pbXBvcnQgRXZlbnRzIGZyb20gXCIuL2VtaXR0ZXJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhc3RvcmVcIjtcclxuY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpO1xyXG5cclxuY29uc3Qge0Rpc3BhdGNoZXIsIERpc2NvcmRDb25zdGFudHMsIFVzZXJTZXR0aW5nc1N0b3JlfSA9IERpc2NvcmRNb2R1bGVzO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIExvY2FsZU1hbmFnZXIge1xyXG5cdGdldCBkaXNjb3JkTG9jYWxlKCkge3JldHVybiBVc2VyU2V0dGluZ3NTdG9yZS5sb2NhbGUuc3BsaXQoXCItXCIpWzBdO31cclxuXHRnZXQgZGVmYXVsdExvY2FsZSgpIHtyZXR1cm4gXCJlblwiO31cclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc3RyaW5ncyA9IHt9O1xyXG5cdH1cclxuXHRcclxuXHRhc3luYyBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0TG9jYWxlKHRoaXMuZGlzY29yZExvY2FsZSk7XHJcbiAgICAgICAgRGlzcGF0Y2hlci5zdWJzY3JpYmUoRGlzY29yZENvbnN0YW50cy5BY3Rpb25UeXBlcy5VU0VSX1NFVFRJTkdTX1VQREFURSwgKHtzZXR0aW5nc30pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3TG9jYWxlID0gc2V0dGluZ3MubG9jYWxlO1xyXG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlICYmIG5ld0xvY2FsZSAhPSB0aGlzLmxvY2FsZSkgdGhpcy5zZXRMb2NhbGUobmV3TG9jYWxlLnNwbGl0KFwiLVwiKVswXSk7XHJcbiAgICAgICAgfSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBzZXRMb2NhbGUobmV3TG9jYWxlKSB7XHJcbiAgICAgICAgbGV0IG5ld1N0cmluZ3M7XHJcbiAgICAgICAgaWYgKG5ld0xvY2FsZSAhPSB0aGlzLmRlZmF1bHRMb2NhbGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2F2ZWRTdHJpbmdzID0gRGF0YVN0b3JlLmdldExvY2FsZShuZXdMb2NhbGUpO1xyXG4gICAgICAgICAgICBuZXdTdHJpbmdzID0gc2F2ZWRTdHJpbmdzIHx8IGF3YWl0IHRoaXMuZG93bmxvYWRMb2NhbGUobmV3TG9jYWxlKTtcclxuICAgICAgICAgICAgaWYgKCFuZXdTdHJpbmdzKSByZXR1cm4gdGhpcy5zZXRMb2NhbGUodGhpcy5kZWZhdWx0TG9jYWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG5ld1N0cmluZ3MgPSBEZWZhdWx0U3RyaW5ncztcclxuICAgICAgICB9XHJcblx0XHR0aGlzLmxvY2FsZSA9IG5ld0xvY2FsZTtcclxuXHRcdFV0aWxpdGllcy5leHRlbmQodGhpcy5zdHJpbmdzLCBuZXdTdHJpbmdzKTtcclxuXHRcdEV2ZW50cy5lbWl0KFwic3RyaW5ncy11cGRhdGVkXCIpO1xyXG5cdH1cclxuXHJcblx0ZG93bmxvYWRMb2NhbGUobG9jYWxlKSB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcblx0XHRcdGNvbnN0IG9wdGlvbnMgPSB7XHJcblx0XHRcdFx0dXJsOiBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9kZXZlbG9wbWVudC9kYXRhL2xvY2FsZXMvJHtsb2NhbGV9Lmpzb25gLC8vYGh0dHBzOi8vcmF1ZW56aS5naXRodWIuaW8vQmV0dGVyRGlzY29yZEFwcC9kYXRhL2xvY2FsZXMvJHtkaXNjb3JkTG9jYWxlfS5qc29uYCxcclxuXHRcdFx0XHR0aW1lb3V0OiAyMDAwLFxyXG5cdFx0XHRcdGpzb246IHRydWVcclxuXHRcdFx0fTtcclxuXHRcdFx0cmVxdWVzdC5nZXQob3B0aW9ucywgKGVyciwgcmVzcCwgbmV3U3RyaW5ncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyciB8fCByZXNwLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICBEYXRhU3RvcmUuc2F2ZUxvY2FsZShsb2NhbGUsIG5ld1N0cmluZ3MpO1xyXG5cdFx0XHRcdHJlc29sdmUobmV3U3RyaW5ncyk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/modules/localemanager.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _data_strings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/strings */ \"./src/data/strings.js\");\n/* harmony import */ var _discordmodules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./discordmodules */ \"./src/modules/discordmodules.js\");\n/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utilities */ \"./src/modules/utilities.js\");\n/* harmony import */ var _emitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./emitter */ \"./src/modules/emitter.js\");\n/* harmony import */ var _datastore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./datastore */ \"./src/modules/datastore.js\");\n\n\n\n\n\n\nconst request = __webpack_require__(/*! request */ \"request\");\n\nconst {\n Dispatcher,\n DiscordConstants,\n UserSettingsStore\n} = _discordmodules__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (new class LocaleManager {\n get discordLocale() {\n return UserSettingsStore.locale.split(\"-\")[0];\n }\n\n get defaultLocale() {\n return \"en\";\n }\n\n constructor() {\n this.locale = \"\";\n this.strings = {};\n }\n\n async initialize() {\n await this.setLocale(this.discordLocale);\n Dispatcher.subscribe(DiscordConstants.ActionTypes.USER_SETTINGS_UPDATE, ({\n settings\n }) => {\n const newLocale = settings.locale;\n if (newLocale && newLocale != this.locale) this.setLocale(newLocale.split(\"-\")[0]);\n });\n }\n\n async setLocale(newLocale) {\n let newStrings;\n\n if (newLocale != this.defaultLocale) {\n newStrings = await this.getLocaleStrings(newLocale);\n if (!newStrings) return this.setLocale(this.defaultLocale);\n } else {\n newStrings = _data_strings__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n }\n\n this.locale = newLocale;\n _utilities__WEBPACK_IMPORTED_MODULE_2__[\"default\"].extend(this.strings, newStrings);\n _emitter__WEBPACK_IMPORTED_MODULE_3__[\"default\"].emit(\"strings-updated\");\n }\n\n async getLocaleStrings(locale) {\n const hash = _datastore__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLocaleHash(locale);\n if (!hash) return await this.downloadLocale(locale);\n const invalid = await this.downloadLocale(locale, hash);\n if (!invalid) return _datastore__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getLocale(locale);\n return invalid;\n }\n\n downloadLocale(locale, hash = \"\") {\n return new Promise(resolve => {\n const options = {\n url: _utilities__WEBPACK_IMPORTED_MODULE_2__[\"default\"].repoUrl(`data/locales/${locale}.json`),\n timeout: 2000,\n json: true\n };\n if (hash) options.headers = {\n \"If-None-Match\": hash\n };\n console.log(options.headers);\n request.get(options, (err, resp, newStrings) => {\n if (err || resp.statusCode !== 200) return resolve(null);\n console.log(resp);\n _datastore__WEBPACK_IMPORTED_MODULE_4__[\"default\"].saveLocale(locale, newStrings);\n _datastore__WEBPACK_IMPORTED_MODULE_4__[\"default\"].saveLocaleHash(locale, resp.headers.etag);\n resolve(newStrings);\n });\n });\n }\n\n}());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL21vZHVsZXMvbG9jYWxlbWFuYWdlci5qcz8yMzlkIl0sIm5hbWVzIjpbInJlcXVlc3QiLCJyZXF1aXJlIiwiRGlzcGF0Y2hlciIsIkRpc2NvcmRDb25zdGFudHMiLCJVc2VyU2V0dGluZ3NTdG9yZSIsIkRpc2NvcmRNb2R1bGVzIiwiTG9jYWxlTWFuYWdlciIsImRpc2NvcmRMb2NhbGUiLCJsb2NhbGUiLCJzcGxpdCIsImRlZmF1bHRMb2NhbGUiLCJjb25zdHJ1Y3RvciIsInN0cmluZ3MiLCJpbml0aWFsaXplIiwic2V0TG9jYWxlIiwic3Vic2NyaWJlIiwiQWN0aW9uVHlwZXMiLCJVU0VSX1NFVFRJTkdTX1VQREFURSIsInNldHRpbmdzIiwibmV3TG9jYWxlIiwibmV3U3RyaW5ncyIsImdldExvY2FsZVN0cmluZ3MiLCJEZWZhdWx0U3RyaW5ncyIsIlV0aWxpdGllcyIsImV4dGVuZCIsIkV2ZW50cyIsImVtaXQiLCJoYXNoIiwiRGF0YVN0b3JlIiwiZ2V0TG9jYWxlSGFzaCIsImRvd25sb2FkTG9jYWxlIiwiaW52YWxpZCIsImdldExvY2FsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwib3B0aW9ucyIsInVybCIsInJlcG9VcmwiLCJ0aW1lb3V0IiwianNvbiIsImhlYWRlcnMiLCJjb25zb2xlIiwibG9nIiwiZ2V0IiwiZXJyIiwicmVzcCIsInN0YXR1c0NvZGUiLCJzYXZlTG9jYWxlIiwic2F2ZUxvY2FsZUhhc2giLCJldGFnIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1BLE9BQU8sR0FBR0MsbUJBQU8sQ0FBQyx3QkFBRCxDQUF2Qjs7QUFFQSxNQUFNO0FBQUNDLFlBQUQ7QUFBYUMsa0JBQWI7QUFBK0JDO0FBQS9CLElBQW9EQyx1REFBMUQ7QUFFZSxtRUFBSSxNQUFNQyxhQUFOLENBQW9CO0FBQ3RDLE1BQUlDLGFBQUos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LENBQXFCdkMsTUFBckIsRUFBNkJZLFVBQTdCO0FBQ0FRLDBEQUFTLENBQUNvQixjQUFWLENBQXlCeEMsTUFBekIsRUFBaUNxQyxJQUFJLENBQUNMLE9BQUwsQ0FBYVMsSUFBOUM7QUFDQWYsZUFBTyxDQUFDZCxVQUFELENBQVA7QUFDQSxPQU5EO0FBT0EsS0FmTSxDQUFQO0FBZ0JBOztBQXhEcUMsQ0FBeEIsRUFBZiIsImZpbGUiOiIuL3NyYy9tb2R1bGVzL2xvY2FsZW1hbmFnZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGVmYXVsdFN0cmluZ3MgZnJvbSBcIi4uL2RhdGEvc3RyaW5nc1wiO1xyXG5pbXBvcnQgRGlzY29yZE1vZHVsZXMgZnJvbSBcIi4vZGlzY29yZG1vZHVsZXNcIjtcclxuaW1wb3J0IFV0aWxpdGllcyBmcm9tIFwiLi91dGlsaXRpZXNcIjtcclxuaW1wb3J0IEV2ZW50cyBmcm9tIFwiLi9lbWl0dGVyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YXN0b3JlXCI7XHJcbmNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKFwicmVxdWVzdFwiKTtcclxuXHJcbmNvbnN0IHtEaXNwYXRjaGVyLCBEaXNjb3JkQ29uc3RhbnRzLCBVc2VyU2V0dGluZ3NTdG9yZX0gPSBEaXNjb3JkTW9kdWxlcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBMb2NhbGVNYW5hZ2VyIHtcclxuXHRnZXQgZGlzY29yZExvY2FsZSgpIHtyZXR1cm4gVXNlclNldHRpbmdzU3RvcmUubG9jYWxlLnNwbGl0KFwiLVwiKVswXTt9XHJcblx0Z2V0IGRlZmF1bHRMb2NhbGUoKSB7cmV0dXJuIFwiZW5cIjt9XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMubG9jYWxlID0gXCJcIjtcclxuICAgICAgICB0aGlzLnN0cmluZ3MgPSB7fTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRMb2NhbGUodGhpcy5kaXNjb3JkTG9jYWxlKTtcclxuICAgICAgICBEaXNwYXRjaGVyLnN1YnNjcmliZShEaXNjb3JkQ29uc3RhbnRzLkFjdGlvblR5cGVzLlVTRVJfU0VUVElOR1NfVVBEQVRFLCAoe3NldHRpbmdzfSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdMb2NhbGUgPSBzZXR0aW5ncy5sb2NhbGU7XHJcbiAgICAgICAgICAgIGlmIChuZXdMb2NhbGUgJiYgbmV3TG9jYWxlICE9IHRoaXMubG9jYWxlKSB0aGlzLnNldExvY2FsZShuZXdMb2NhbGUuc3BsaXQoXCItXCIpWzBdKTtcclxuICAgICAgICB9KTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNldExvY2FsZShuZXdMb2NhbGUpIHtcclxuICAgICAgICBsZXQgbmV3U3RyaW5ncztcclxuICAgICAgICBpZiAobmV3TG9jYWxlICE9IHRoaXMuZGVmYXVsdExvY2FsZSkge1xyXG5cdFx0XHRuZXdTdHJpbmdzID0gYXdhaXQgdGhpcy5nZXRMb2NhbGVTdHJpbmdzKG5ld0xvY2FsZSk7XHJcbiAgICAgICAgICAgIGlmICghbmV3U3RyaW5ncykgcmV0dXJuIHRoaXMuc2V0TG9jYWxlKHRoaXMuZGVmYXVsdExvY2FsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdTdHJpbmdzID0gRGVmYXVsdFN0cmluZ3M7XHJcbiAgICAgICAgfVxyXG5cdFx0dGhpcy5sb2NhbGUgPSBuZXdMb2NhbGU7XHJcblx0XHRVdGlsaXRpZXMuZXh0ZW5kKHRoaXMuc3RyaW5ncywgbmV3U3RyaW5ncyk7XHJcblx0XHRFdmVudHMuZW1pdChcInN0cmluZ3MtdXBkYXRlZFwiKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGdldExvY2FsZVN0cmluZ3MobG9jYWxlKSB7XHJcblx0XHRjb25zdCBoYXNoID0gRGF0YVN0b3JlLmdldExvY2FsZUhhc2gobG9jYWxlKTtcclxuXHRcdGlmICghaGFzaCkgcmV0dXJuIGF3YWl0IHRoaXMuZG93bmxvYWRMb2NhbGUobG9jYWxlKTtcclxuXHRcdGNvbnN0IGludmFsaWQgPSBhd2FpdCB0aGlzLmRvd25sb2FkTG9jYWxlKGxvY2FsZSwgaGFzaCk7XHJcblx0XHRpZiAoIWludmFsaWQpIHJldHVybiBEYXRhU3RvcmUuZ2V0TG9jYWxlKGxvY2FsZSk7XHJcblx0XHRyZXR1cm4gaW52YWxpZDtcclxuXHR9XHJcblxyXG5cdGRvd25sb2FkTG9jYWxlKGxvY2FsZSwgaGFzaCA9IFwiXCIpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuXHRcdFx0Y29uc3Qgb3B0aW9ucyA9IHtcclxuXHRcdFx0XHR1cmw6IFV0aWxpdGllcy5yZXBvVXJsKGBkYXRhL2xvY2FsZXMvJHtsb2NhbGV9Lmpzb25gKSxcclxuXHRcdFx0XHR0aW1lb3V0OiAyMDAwLFxyXG5cdFx0XHRcdGpzb246IHRydWVcclxuXHRcdFx0fTtcclxuXHRcdFx0aWYgKGhhc2gpIG9wdGlvbnMuaGVhZGVycyA9IHtcIklmLU5vbmUtTWF0Y2hcIjogaGFzaH07XHJcblx0XHRcdGNvbnNvbGUubG9nKG9wdGlvbnMuaGVhZGVycyk7XHJcblx0XHRcdHJlcXVlc3QuZ2V0KG9wdGlvbnMsIChlcnIsIHJlc3AsIG5ld1N0cmluZ3MpID0+IHtcclxuXHRcdFx0XHRpZiAoZXJyIHx8IHJlc3Auc3RhdHVzQ29kZSAhPT0gMjAwKSByZXR1cm4gcmVzb2x2ZShudWxsKTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhyZXNwKTtcclxuXHRcdFx0XHREYXRhU3RvcmUuc2F2ZUxvY2FsZShsb2NhbGUsIG5ld1N0cmluZ3MpO1xyXG5cdFx0XHRcdERhdGFTdG9yZS5zYXZlTG9jYWxlSGFzaChsb2NhbGUsIHJlc3AuaGVhZGVycy5ldGFnKTtcclxuXHRcdFx0XHRyZXNvbHZlKG5ld1N0cmluZ3MpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/modules/localemanager.js\n"); /***/ }), @@ -563,7 +563,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var data /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Utilities; });\n/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./logger */ \"./src/modules/logger.js\");\n\nclass Utilities {\n /**\r\n * Parses a string of HTML and returns the results. If the second parameter is true,\r\n * the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.\r\n * This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node.\r\n *\r\n * If the second parameter is false, then the return value will be the list of parsed\r\n * nodes and there were multiple top level nodes, otherwise the single node is returned.\r\n * @param {string} html - HTML to be parsed\r\n * @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`\r\n * @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing\r\n */\n static parseHTML(html, fragment = false) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n const node = template.content.cloneNode(true);\n if (fragment) return node;\n return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];\n }\n\n static getTextArea() {\n return $(\".channelTextArea-1LDbYG textarea\");\n }\n\n static insertText(textarea, text) {\n textarea.focus();\n textarea.selectionStart = 0;\n textarea.selectionEnd = textarea.value.length;\n document.execCommand(\"insertText\", false, text);\n }\n\n static escape(s) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n }\n\n static testJSON(data) {\n try {\n return JSON.parse(data);\n } catch (err) {\n return false;\n }\n }\n\n static suppressErrors(method, message) {\n return (...params) => {\n try {\n return method(...params);\n } catch (e) {\n _logger__WEBPACK_IMPORTED_MODULE_0__[\"default\"].stacktrace(\"SuppressedError\", \"Error occurred in \" + message, e);\n }\n };\n }\n\n static monkeyPatch(what, methodName, options) {\n const {\n before,\n after,\n instead,\n once = false,\n silent = false,\n force = false\n } = options;\n const displayName = options.displayName || what.displayName || what.name || what.constructor.displayName || what.constructor.name;\n if (!silent) console.log(\"patch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n\n if (!what[methodName]) {\n if (force) what[methodName] = function () {};else return console.error(methodName, \"does not exist for\", displayName); // eslint-disable-line no-console\n }\n\n const origMethod = what[methodName];\n\n const cancel = () => {\n if (!silent) console.log(\"unpatch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n\n what[methodName] = origMethod;\n };\n\n what[methodName] = function () {\n const data = {\n thisObject: this,\n methodArguments: arguments,\n cancelPatch: cancel,\n originalMethod: origMethod,\n callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)\n };\n\n if (instead) {\n const tempRet = Utilities.suppressErrors(instead, \"`instead` callback of \" + what[methodName].displayName)(data);\n if (tempRet !== undefined) data.returnValue = tempRet;\n } else {\n if (before) Utilities.suppressErrors(before, \"`before` callback of \" + what[methodName].displayName)(data);\n data.callOriginalMethod();\n if (after) Utilities.suppressErrors(after, \"`after` callback of \" + what[methodName].displayName)(data);\n }\n\n if (once) cancel();\n return data.returnValue;\n };\n\n what[methodName].__monkeyPatched = true;\n if (!what[methodName].__originalMethod) what[methodName].__originalMethod = origMethod;\n what[methodName].displayName = \"patched \" + (what[methodName].displayName || methodName);\n return cancel;\n }\n\n static onRemoved(node, callback) {\n const observer = new MutationObserver(mutations => {\n for (let m = 0; m < mutations.length; m++) {\n const mutation = mutations[m];\n const nodes = Array.from(mutation.removedNodes);\n const directMatch = nodes.indexOf(node) > -1;\n const parentMatch = nodes.some(parent => parent.contains(node));\n\n if (directMatch || parentMatch) {\n observer.disconnect();\n callback();\n }\n }\n });\n observer.observe(document.body, {\n subtree: true,\n childList: true\n });\n }\n\n static isEmpty(obj) {\n if (obj == null || obj == undefined || obj == \"\") return true;\n if (typeof obj !== \"object\") return false;\n if (Array.isArray(obj)) return obj.length == 0;\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) return false;\n }\n\n return true;\n }\n /**\r\n * Generates an automatically memoizing version of an object.\r\n * @author Zerebos\r\n * @param {Object} object - object to memoize\r\n * @returns {Proxy} the proxy to the object that memoizes properties\r\n */\n\n\n static memoizeObject(object) {\n const proxy = new Proxy(object, {\n get: function (obj, mod) {\n if (!obj.hasOwnProperty(mod)) return undefined;\n\n if (Object.getOwnPropertyDescriptor(obj, mod).get) {\n const value = obj[mod];\n delete obj[mod];\n obj[mod] = value;\n }\n\n return obj[mod];\n },\n set: function (obj, mod, value) {\n if (obj.hasOwnProperty(mod)) return _logger__WEBPACK_IMPORTED_MODULE_0__[\"default\"].error(\"MemoizedObject\", \"Trying to overwrite existing property\");\n obj[mod] = value;\n return obj[mod];\n }\n });\n Object.defineProperty(proxy, \"hasOwnProperty\", {\n value: function (prop) {\n return this[prop] !== undefined;\n }\n });\n return proxy;\n }\n /**\r\n * Deep extends an object with a set of other objects. Objects later in the list\r\n * of `extenders` have priority, that is to say if one sets a key to be a primitive,\r\n * it will be overwritten with the next one with the same key. If it is an object,\r\n * and the keys match, the object is extended. This happens recursively.\r\n * @param {object} extendee - Object to be extended\r\n * @param {...object} extenders - Objects to extend with\r\n * @returns {object} - A reference to `extendee`\r\n */\n\n\n static extend(extendee, ...extenders) {\n for (let i = 0; i < extenders.length; i++) {\n for (const key in extenders[i]) {\n if (extenders[i].hasOwnProperty(key)) {\n if (typeof extendee[key] === \"object\" && typeof extenders[i][key] === \"object\") this.extend(extendee[key], extenders[i][key]);else if (typeof extenders[i][key] === \"object\") extendee[key] = {}, this.extend(extendee[key], extenders[i][key]);else extendee[key] = extenders[i][key];\n }\n }\n }\n\n return extendee;\n }\n /**\r\n * Format strings with placeholders (`{{placeholder}}`) into full strings.\r\n * Quick example: `PluginUtilities.formatString(\"Hello, {{user}}\", {user: \"Zerebos\"})`\r\n * would return \"Hello, Zerebos\".\r\n * @param {string} string - string to format\r\n * @param {object} values - object literal of placeholders to replacements\r\n * @returns {string} the properly formatted string\r\n */\n\n\n static formatString(string, values) {\n for (const val in values) {\n let replacement = values[val];\n if (Array.isArray(replacement)) replacement = JSON.stringify(replacement);\n if (typeof replacement === \"object\" && replacement !== null) replacement = replacement.toString();\n string = string.replace(new RegExp(`{{${val}}}`, \"g\"), replacement);\n }\n\n return string;\n }\n /**\r\n * Finds a value, subobject, or array from a tree that matches a specific filter.\r\n * @param {object} tree Tree that should be walked\r\n * @param {callable} searchFilter Filter to check against each object and subobject\r\n * @param {object} options Additional options to customize the search\r\n * @param {Array|null} [options.walkable=null] Array of strings to use as keys that are allowed to be walked on. Null value indicates all keys are walkable\r\n * @param {Array} [options.ignore=[]] Array of strings to use as keys to exclude from the search, most helpful when `walkable = null`.\r\n */\n\n\n static findInTree(tree, searchFilter, {\n walkable = null,\n ignore = []\n } = {}) {\n if (typeof searchFilter === \"string\") {\n if (tree.hasOwnProperty(searchFilter)) return tree[searchFilter];\n } else if (searchFilter(tree)) {\n return tree;\n }\n\n if (typeof tree !== \"object\" || tree == null) return undefined;\n let tempReturn = undefined;\n\n if (tree instanceof Array) {\n for (const value of tree) {\n tempReturn = this.findInTree(value, searchFilter, {\n walkable,\n ignore\n });\n if (typeof tempReturn != \"undefined\") return tempReturn;\n }\n } else {\n const toWalk = walkable == null ? Object.keys(tree) : walkable;\n\n for (const key of toWalk) {\n if (!tree.hasOwnProperty(key) || ignore.includes(key)) continue;\n tempReturn = this.findInTree(tree[key], searchFilter, {\n walkable,\n ignore\n });\n if (typeof tempReturn != \"undefined\") return tempReturn;\n }\n }\n\n return tempReturn;\n }\n /**\r\n * Gets a nested property (if it exists) safely. Path should be something like `prop.prop2.prop3`.\r\n * Numbers can be used for arrays as well like `prop.prop2.array.0.id`.\r\n * @param {Object} obj - object to get nested property of\r\n * @param {string} path - representation of the property to obtain\r\n */\n\n\n static getNestedProp(obj, path) {\n return path.split(/\\s?\\.\\s?/).reduce(function (currentObj, prop) {\n return currentObj && currentObj[prop];\n }, obj);\n }\n /**\r\n * Finds a value, subobject, or array from a tree that matches a specific filter. Great for patching render functions.\r\n * @param {object} tree React tree to look through. Can be a rendered object or an internal instance.\r\n * @param {callable} searchFilter Filter function to check subobjects against.\r\n */\n\n\n static findInRenderTree(tree, searchFilter, {\n walkable = [\"props\", \"children\", \"child\", \"sibling\"],\n ignore = []\n } = {}) {\n return this.findInTree(tree, searchFilter, {\n walkable,\n ignore\n });\n }\n /**\r\n * Finds a value, subobject, or array from a tree that matches a specific filter. Great for patching render functions.\r\n * @param {object} tree React tree to look through. Can be a rendered object or an internal instance.\r\n * @param {callable} searchFilter Filter function to check subobjects against.\r\n */\n\n\n static findInReactTree(tree, searchFilter) {\n return this.findInTree(tree, searchFilter, {\n walkable: [\"props\", \"children\", \"return\", \"stateNode\"]\n });\n }\n\n static getReactInstance(node) {\n if (node.__reactInternalInstance$) return node.__reactInternalInstance$;\n return node[Object.keys(node).find(k => k.startsWith(\"__reactInternalInstance\"))] || null;\n }\n /**\r\n * Grabs a value from the react internal instance. Allows you to grab\r\n * long depth values safely without accessing no longer valid properties.\r\n * @param {HTMLElement} node - node to obtain react instance of\r\n * @param {object} options - options for the search\r\n * @param {array} [options.include] - list of items to include from the search\r\n * @param {array} [options.exclude=[\"Popout\", \"Tooltip\", \"Scroller\", \"BackgroundFlash\"]] - list of items to exclude from the search\r\n * @param {callable} [options.filter=_=>_] - filter to check the current instance with (should return a boolean)\r\n * @return {(*|null)} the owner instance or undefined if not found.\r\n */\n\n\n static getOwnerInstance(node, {\n include,\n exclude = [\"Popout\", \"Tooltip\", \"Scroller\", \"BackgroundFlash\"],\n filter = _ => _\n } = {}) {\n if (node === undefined) return undefined;\n const excluding = include === undefined;\n const nameFilter = excluding ? exclude : include;\n\n function getDisplayName(owner) {\n const type = owner.type;\n if (!type) return null;\n return type.displayName || type.name || null;\n }\n\n function classFilter(owner) {\n const name = getDisplayName(owner);\n return name !== null && !!(nameFilter.includes(name) ^ excluding);\n }\n\n let curr = this.getReactInstance(node);\n\n for (curr = curr && curr.return; curr !== null; curr = curr.return) {\n if (curr === null) continue;\n const owner = curr.stateNode;\n if (curr !== null && !(owner instanceof HTMLElement) && classFilter(curr) && filter(owner)) return owner;\n }\n\n return null;\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL21vZHVsZXMvdXRpbGl0aWVzLmpzPzk3NjkiXSwibmFtZXMiOlsiVXRpbGl0aWVzIiwicGFyc2VIVE1MIiwiaHRtbCIsImZyYWdtZW50IiwidGVtcGxhdGUiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJub2RlIiwiY29udGVudCIsImNsb25lTm9kZSIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJnZXRUZXh0QXJlYSIsIiQiLCJpbnNlcnRUZXh0IiwidGV4dGFyZWEiLCJ0ZXh0IiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsInZhbHVlIiwiZXhlY0NvbW1hbmQiLCJlc2NhcGUiLCJzIiwicmVwbGFjZSIsInRlc3RKU09OIiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsImVyciIsInN1cHByZXNzRXJyb3JzIiwibWV0aG9kIiwibWVzc2FnZSIsInBhcmFtcyIsImUiLCJMb2dnZXIiLCJzdGFja3RyYWNlIiwibW9ua2V5UGF0Y2giLCJ3aGF0IiwibWV0aG9kTmFtZSIsIm9wdGlvbnMiLCJiZWZvcmUiLCJhZnRlciIsImluc3RlYWQiLCJvbmNlIiwic2lsZW50IiwiZm9yY2UiLCJkaXNwbGF5TmFtZSIsIm5hbWUiLCJjb25zdHJ1Y3RvciIsImNvbnNvbGUiLCJsb2ciLCJlcnJvciIsIm9yaWdNZXRob2QiLCJjYW5jZWwiLCJ0aGlzT2JqZWN0IiwibWV0aG9kQXJndW1lbnRzIiwiYXJndW1lbnRzIiwiY2FuY2VsUGF0Y2giLCJvcmlnaW5hbE1ldGhvZCIsImNhbGxPcmlnaW5hbE1ldGhvZCIsInJldHVyblZhbHVlIiwiYXBwbHkiLCJ0ZW1wUmV0IiwidW5kZWZpbmVkIiwiX19tb25rZXlQYXRjaGVkIiwiX19vcmlnaW5hbE1ldGhvZCIsIm9uUmVtb3ZlZCIsImNhbGxiYWNrIiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zIiwibSIsIm11dGF0aW9uIiwibm9kZXMiLCJBcnJheSIsImZyb20iLCJyZW1vdmVkTm9kZXMiLCJkaXJlY3RNYXRjaCIsImluZGV4T2YiLCJwYXJlbnRNYXRjaCIsInNvbWUiLCJwYXJlbnQiLCJjb250YWlucyIsImRpc2Nvbm5lY3QiLCJvYnNlcnZlIiwiYm9keSIsInN1YnRyZWUiLCJjaGlsZExpc3QiLCJpc0VtcHR5Iiwib2JqIiwiaXNBcnJheSIsImtleSIsImhhc093blByb3BlcnR5IiwibWVtb2l6ZU9iamVjdCIsIm9iamVjdCIsInByb3h5IiwiUHJveHkiLCJnZXQiLCJtb2QiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJzZXQiLCJkZWZpbmVQcm9wZXJ0eSIsInByb3AiLCJleHRlbmQiLCJleHRlbmRlZSIsImV4dGVuZGVycyIsImkiLCJmb3JtYXRTdHJpbmciLCJzdHJpbmciLCJ2YWx1ZXMiLCJ2YWwiLCJyZXBsYWNlbWVudCIsInN0cmluZ2lmeSIsInRvU3RyaW5nIiwiUmVnRXhwIiwiZmluZEluVHJlZSIsInRyZWUiLCJzZWFyY2hGaWx0ZXIiLCJ3YWxrYWJsZSIsImlnbm9yZSIsInRlbXBSZXR1cm4iLCJ0b1dhbGsiLCJrZXlzIiwiaW5jbHVkZXMiLCJnZXROZXN0ZWRQcm9wIiwicGF0aCIsInNwbGl0IiwicmVkdWNlIiwiY3VycmVudE9iaiIsImZpbmRJblJlbmRlclRyZWUiLCJmaW5kSW5SZWFjdFRyZWUiLCJnZXRSZWFjdEluc3RhbmNlIiwiX19yZWFjdEludGVybmFsSW5zdGFuY2UkIiwiZmluZCIsImsiLCJzdGFydHNXaXRoIiwiZ2V0T3duZXJJbnN0YW5jZSIsImluY2x1ZGUiLCJleGNsdWRlIiwiZmlsdGVyIiwiXyIsImV4Y2x1ZGluZyIsIm5hbWVGaWx0ZXIiLCJnZXREaXNwbGF5TmFtZSIsIm93bmVyIiwidHlwZSIsImNsYXNzRmlsdGVyIiwiY3VyciIsInJldHVybiIsInN0YXRlTm9kZSIsIkhUTUxFbGVtZW50Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtB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Q0E7O0FBQ0QsYUFBU29HLFdBQVQsQ0FBcUJGLEtBQXJCLEVBQTRCO0FBQzNCLFlBQU1sRyxJQUFJLEdBQUdpRyxjQUFjLENBQUNDLEtBQUQsQ0FBM0I7QUFDQSxhQUFRbEcsSUFBSSxLQUFLLElBQVQsSUFBaUIsQ0FBQyxFQUFFZ0csVUFBVSxDQUFDbkIsUUFBWCxDQUFvQjdFLElBQXBCLElBQTRCK0YsU0FBOUIsQ0FBMUI7QUFDQTs7QUFFRCxRQUFJTSxJQUFJLEdBQUcsS0FBS2hCLGdCQUFMLENBQXNCOUgsSUFBdEIsQ0FBWDs7QUFDQSxTQUFLOEksSUFBSSxHQUFHQSxJQUFJLElBQUlBLElBQUksQ0FBQ0MsTUFBekIsRUFBaUNELElBQUksS0FBSyxJQUExQyxFQUFnREEsSUFBSSxHQUFHQSxJQUFJLENBQUNDLE1BQTVELEVBQW9FO0FBQ25FLFVBQUlELElBQUksS0FBSyxJQUFiLEVBQW1CO0FBQ25CLFlBQU1ILEtBQUssR0FBR0csSUFBSSxDQUFDRSxTQUFuQjtBQUNBLFVBQUlGLElBQUksS0FBSyxJQUFULElBQWlCLEVBQUVILEtBQUssWUFBWU0sV0FBbkIsQ0FBakIsSUFBb0RKLFdBQVcsQ0FBQ0MsSUFBRCxDQUEvRCxJQUF5RVIsTUFBTSxDQUFDSyxLQUFELENBQW5GLEVBQTRGLE9BQU9BLEtBQVA7QUFDNUY7O0FBRUQsV0FBTyxJQUFQO0FBQ0E7O0FBcFM2QiIsImZpbGUiOiIuL3NyYy9tb2R1bGVzL3V0aWxpdGllcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcIi4vbG9nZ2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVdGlsaXRpZXMge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIGEgc3RyaW5nIG9mIEhUTUwgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsXHJcbiAgICAgKiB0aGUgcGFyc2VkIEhUTUwgd2lsbCBiZSByZXR1cm5lZCBhcyBhIGRvY3VtZW50IGZyYWdtZW50IHtAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudEZyYWdtZW50fS5cclxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGxpc3Qgb2YgZWxlbWVudHMgYXQgdGhlIHRvcCBsZXZlbCwgdGhleSBjYW4gdGhlbiBiZSBhcHBlbmRlZCBhbGwgYXQgb25jZSB0byBhbm90aGVyIG5vZGUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBsaXN0IG9mIHBhcnNlZFxyXG4gICAgICogbm9kZXMgYW5kIHRoZXJlIHdlcmUgbXVsdGlwbGUgdG9wIGxldmVsIG5vZGVzLCBvdGhlcndpc2UgdGhlIHNpbmdsZSBub2RlIGlzIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBIVE1MIHRvIGJlIHBhcnNlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJhZ21lbnQ9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdGhlIHJldHVybiBzaG91bGQgYmUgdGhlIHJhdyBgRG9jdW1lbnRGcmFnbWVudGBcclxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gVGhlIHJlc3VsdCBvZiBIVE1MIHBhcnNpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcnNlSFRNTChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XHJcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgICAgICBjb25zdCBub2RlID0gdGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgaWYgKGZyYWdtZW50KSByZXR1cm4gbm9kZTtcclxuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBub2RlLmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXNbMF07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldFRleHRBcmVhKCkge1xyXG4gICAgICAgIHJldHVybiAkKFwiLmNoYW5uZWxUZXh0QXJlYS0xTERiWUcgdGV4dGFyZWFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGluc2VydFRleHQodGV4dGFyZWEsIHRleHQpIHtcclxuICAgICAgICB0ZXh0YXJlYS5mb2N1cygpO1xyXG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvblN0YXJ0ID0gMDtcclxuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25FbmQgPSB0ZXh0YXJlYS52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRUZXh0XCIsIGZhbHNlLCB0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXNjYXBlKHMpIHtcclxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGVzdEpTT04oZGF0YSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xyXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7IHJldHVybiBtZXRob2QoLi4ucGFyYW1zKTtcdH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgTG9nZ2VyLnN0YWNrdHJhY2UoXCJTdXBwcmVzc2VkRXJyb3JcIiwgXCJFcnJvciBvY2N1cnJlZCBpbiBcIiArIG1lc3NhZ2UsIGUpOyB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHtiZWZvcmUsIGFmdGVyLCBpbnN0ZWFkLCBvbmNlID0gZmFsc2UsIHNpbGVudCA9IGZhbHNlLCBmb3JjZSA9IGZhbHNlfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBvcHRpb25zLmRpc3BsYXlOYW1lIHx8IHdoYXQuZGlzcGxheU5hbWUgfHwgd2hhdC5uYW1lIHx8IHdoYXQuY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0pIHtcclxuICAgICAgICAgICAgaWYgKGZvcmNlKSB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7fTtcclxuICAgICAgICAgICAgZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcihtZXRob2ROYW1lLCBcImRvZXMgbm90IGV4aXN0IGZvclwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcmlnTWV0aG9kID0gd2hhdFttZXRob2ROYW1lXTtcclxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInVucGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdID0gb3JpZ01ldGhvZDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIHRoaXNPYmplY3Q6IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBtZXRob2RBcmd1bWVudHM6IGFyZ3VtZW50cyxcclxuICAgICAgICAgICAgICAgIGNhbmNlbFBhdGNoOiBjYW5jZWwsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZDogb3JpZ01ldGhvZCxcclxuICAgICAgICAgICAgICAgIGNhbGxPcmlnaW5hbE1ldGhvZDogKCkgPT4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEub3JpZ2luYWxNZXRob2QuYXBwbHkoZGF0YS50aGlzT2JqZWN0LCBkYXRhLm1ldGhvZEFyZ3VtZW50cylcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKGluc3RlYWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBSZXQgPSBVdGlsaXRpZXMuc3VwcHJlc3NFcnJvcnMoaW5zdGVhZCwgXCJgaW5zdGVhZGAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSkgVXRpbGl0aWVzLnN1cHByZXNzRXJyb3JzKGJlZm9yZSwgXCJgYmVmb3JlYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5jYWxsT3JpZ2luYWxNZXRob2QoKTtcclxuICAgICAgICAgICAgICAgIGlmIChhZnRlcikgVXRpbGl0aWVzLnN1cHByZXNzRXJyb3JzKGFmdGVyLCBcImBhZnRlcmAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob25jZSkgY2FuY2VsKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX21vbmtleVBhdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kKSB3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnTWV0aG9kO1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgPSBcInBhdGNoZWQgXCIgKyAod2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSB8fCBtZXRob2ROYW1lKTtcclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdXRhdGlvbnMubGVuZ3RoOyBtKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW21dO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcclxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0VtcHR5KG9iaikge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmxlbmd0aCA9PSAwO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgYW4gYXV0b21hdGljYWxseSBtZW1vaXppbmcgdmVyc2lvbiBvZiBhbiBvYmplY3QuXHJcbiAgICAgKiBAYXV0aG9yIFplcmVib3NcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBvYmplY3QgdG8gbWVtb2l6ZVxyXG4gICAgICogQHJldHVybnMge1Byb3h5fSB0aGUgcHJveHkgdG8gdGhlIG9iamVjdCB0aGF0IG1lbW9pemVzIHByb3BlcnRpZXNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lbW9pemVPYmplY3Qob2JqZWN0KSB7XHJcbiAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkob2JqZWN0LCB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBtb2QpIHtcclxuICAgICAgICAgICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KG1vZCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIG1vZCkuZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpbbW9kXTtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqW21vZF07XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqW21vZF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmpbbW9kXTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihvYmosIG1vZCwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobW9kKSkgcmV0dXJuIExvZ2dlci5lcnJvcihcIk1lbW9pemVkT2JqZWN0XCIsIFwiVHJ5aW5nIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBwcm9wZXJ0eVwiKTtcclxuICAgICAgICAgICAgICAgIG9ialttb2RdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW21vZF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5LCBcImhhc093blByb3BlcnR5XCIsIHt2YWx1ZTogZnVuY3Rpb24ocHJvcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpc1twcm9wXSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH19KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb3h5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVlcCBleHRlbmRzIGFuIG9iamVjdCB3aXRoIGEgc2V0IG9mIG90aGVyIG9iamVjdHMuIE9iamVjdHMgbGF0ZXIgaW4gdGhlIGxpc3RcclxuICAgICAqIG9mIGBleHRlbmRlcnNgIGhhdmUgcHJpb3JpdHksIHRoYXQgaXMgdG8gc2F5IGlmIG9uZSBzZXRzIGEga2V5IHRvIGJlIGEgcHJpbWl0aXZlLFxyXG4gICAgICogaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXh0IG9uZSB3aXRoIHRoZSBzYW1lIGtleS4gSWYgaXQgaXMgYW4gb2JqZWN0LFxyXG4gICAgICogYW5kIHRoZSBrZXlzIG1hdGNoLCB0aGUgb2JqZWN0IGlzIGV4dGVuZGVkLiBUaGlzIGhhcHBlbnMgcmVjdXJzaXZlbHkuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXh0ZW5kZWUgLSBPYmplY3QgdG8gYmUgZXh0ZW5kZWRcclxuICAgICAqIEBwYXJhbSB7Li4ub2JqZWN0fSBleHRlbmRlcnMgLSBPYmplY3RzIHRvIGV4dGVuZCB3aXRoXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEEgcmVmZXJlbmNlIHRvIGBleHRlbmRlZWBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGV4dGVuZChleHRlbmRlZSwgLi4uZXh0ZW5kZXJzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbmRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXh0ZW5kZXJzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kZXJzW2ldLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4dGVuZGVlW2tleV0gPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGV4dGVuZGVyc1tpXVtrZXldID09PSBcIm9iamVjdFwiKSB0aGlzLmV4dGVuZChleHRlbmRlZVtrZXldLCBleHRlbmRlcnNbaV1ba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGV4dGVuZGVyc1tpXVtrZXldID09PSBcIm9iamVjdFwiKSBleHRlbmRlZVtrZXldID0ge30sIHRoaXMuZXh0ZW5kKGV4dGVuZGVlW2tleV0sIGV4dGVuZGVyc1tpXVtrZXldKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGV4dGVuZGVlW2tleV0gPSBleHRlbmRlcnNbaV1ba2V5XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZXh0ZW5kZWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JtYXQgc3RyaW5ncyB3aXRoIHBsYWNlaG9sZGVycyAoYHt7cGxhY2Vob2xkZXJ9fWApIGludG8gZnVsbCBzdHJpbmdzLlxyXG4gICAgICogUXVpY2sgZXhhbXBsZTogYFBsdWdpblV0aWxpdGllcy5mb3JtYXRTdHJpbmcoXCJIZWxsbywge3t1c2VyfX1cIiwge3VzZXI6IFwiWmVyZWJvc1wifSlgXHJcbiAgICAgKiB3b3VsZCByZXR1cm4gXCJIZWxsbywgWmVyZWJvc1wiLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIHN0cmluZyB0byBmb3JtYXRcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgLSBvYmplY3QgbGl0ZXJhbCBvZiBwbGFjZWhvbGRlcnMgdG8gcmVwbGFjZW1lbnRzXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcHJvcGVybHkgZm9ybWF0dGVkIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZm9ybWF0U3RyaW5nKHN0cmluZywgdmFsdWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWwgaW4gdmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHZhbHVlc1t2YWxdO1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlbWVudCkpIHJlcGxhY2VtZW50ID0gSlNPTi5zdHJpbmdpZnkocmVwbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHJlcGxhY2VtZW50KSA9PT0gXCJvYmplY3RcIiAmJiByZXBsYWNlbWVudCAhPT0gbnVsbCkgcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShuZXcgUmVnRXhwKGB7eyR7dmFsfX19YCwgXCJnXCIpLCByZXBsYWNlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyBhIHZhbHVlLCBzdWJvYmplY3QsIG9yIGFycmF5IGZyb20gYSB0cmVlIHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmljIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0cmVlIFRyZWUgdGhhdCBzaG91bGQgYmUgd2Fsa2VkXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBzZWFyY2hGaWx0ZXIgRmlsdGVyIHRvIGNoZWNrIGFnYWluc3QgZWFjaCBvYmplY3QgYW5kIHN1Ym9iamVjdFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIHRvIGN1c3RvbWl6ZSB0aGUgc2VhcmNoXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz58bnVsbH0gW29wdGlvbnMud2Fsa2FibGU9bnVsbF0gQXJyYXkgb2Ygc3RyaW5ncyB0byB1c2UgYXMga2V5cyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHdhbGtlZCBvbi4gTnVsbCB2YWx1ZSBpbmRpY2F0ZXMgYWxsIGtleXMgYXJlIHdhbGthYmxlXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtvcHRpb25zLmlnbm9yZT1bXV0gQXJyYXkgb2Ygc3RyaW5ncyB0byB1c2UgYXMga2V5cyB0byBleGNsdWRlIGZyb20gdGhlIHNlYXJjaCwgbW9zdCBoZWxwZnVsIHdoZW4gYHdhbGthYmxlID0gbnVsbGAuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kSW5UcmVlKHRyZWUsIHNlYXJjaEZpbHRlciwge3dhbGthYmxlID0gbnVsbCwgaWdub3JlID0gW119ID0ge30pIHtcclxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaEZpbHRlciA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBpZiAodHJlZS5oYXNPd25Qcm9wZXJ0eShzZWFyY2hGaWx0ZXIpKSByZXR1cm4gdHJlZVtzZWFyY2hGaWx0ZXJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzZWFyY2hGaWx0ZXIodHJlZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHRyZWUgIT09IFwib2JqZWN0XCIgfHwgdHJlZSA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBsZXQgdGVtcFJldHVybiA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodHJlZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdHJlZSkge1xyXG4gICAgICAgICAgICAgICAgdGVtcFJldHVybiA9IHRoaXMuZmluZEluVHJlZSh2YWx1ZSwgc2VhcmNoRmlsdGVyLCB7d2Fsa2FibGUsIGlnbm9yZX0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wUmV0dXJuICE9IFwidW5kZWZpbmVkXCIpIHJldHVybiB0ZW1wUmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0b1dhbGsgPSB3YWxrYWJsZSA9PSBudWxsID8gT2JqZWN0LmtleXModHJlZSkgOiB3YWxrYWJsZTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdG9XYWxrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRyZWUuaGFzT3duUHJvcGVydHkoa2V5KSB8fCBpZ25vcmUuaW5jbHVkZXMoa2V5KSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB0ZW1wUmV0dXJuID0gdGhpcy5maW5kSW5UcmVlKHRyZWVba2V5XSwgc2VhcmNoRmlsdGVyLCB7d2Fsa2FibGUsIGlnbm9yZX0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wUmV0dXJuICE9IFwidW5kZWZpbmVkXCIpIHJldHVybiB0ZW1wUmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZW1wUmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIG5lc3RlZCBwcm9wZXJ0eSAoaWYgaXQgZXhpc3RzKSBzYWZlbHkuIFBhdGggc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIGBwcm9wLnByb3AyLnByb3AzYC5cclxuICAgICAqIE51bWJlcnMgY2FuIGJlIHVzZWQgZm9yIGFycmF5cyBhcyB3ZWxsIGxpa2UgYHByb3AucHJvcDIuYXJyYXkuMC5pZGAuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gb2JqZWN0IHRvIGdldCBuZXN0ZWQgcHJvcGVydHkgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5IHRvIG9idGFpblxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0TmVzdGVkUHJvcChvYmosIHBhdGgpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgvXFxzP1xcLlxccz8vKS5yZWR1Y2UoZnVuY3Rpb24oY3VycmVudE9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudE9iaiAmJiBjdXJyZW50T2JqW3Byb3BdO1xyXG4gICAgICAgIH0sIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyBhIHZhbHVlLCBzdWJvYmplY3QsIG9yIGFycmF5IGZyb20gYSB0cmVlIHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmljIGZpbHRlci4gR3JlYXQgZm9yIHBhdGNoaW5nIHJlbmRlciBmdW5jdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdHJlZSBSZWFjdCB0cmVlIHRvIGxvb2sgdGhyb3VnaC4gQ2FuIGJlIGEgcmVuZGVyZWQgb2JqZWN0IG9yIGFuIGludGVybmFsIGluc3RhbmNlLlxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gc2VhcmNoRmlsdGVyIEZpbHRlciBmdW5jdGlvbiB0byBjaGVjayBzdWJvYmplY3RzIGFnYWluc3QuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kSW5SZW5kZXJUcmVlKHRyZWUsIHNlYXJjaEZpbHRlciwge3dhbGthYmxlID0gW1wicHJvcHNcIiwgXCJjaGlsZHJlblwiLCBcImNoaWxkXCIsIFwic2libGluZ1wiXSwgaWdub3JlID0gW119ID0ge30pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5UcmVlKHRyZWUsIHNlYXJjaEZpbHRlciwge3dhbGthYmxlLCBpZ25vcmV9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGEgdmFsdWUsIHN1Ym9iamVjdCwgb3IgYXJyYXkgZnJvbSBhIHRyZWUgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWMgZmlsdGVyLiBHcmVhdCBmb3IgcGF0Y2hpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0cmVlIFJlYWN0IHRyZWUgdG8gbG9vayB0aHJvdWdoLiBDYW4gYmUgYSByZW5kZXJlZCBvYmplY3Qgb3IgYW4gaW50ZXJuYWwgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBzZWFyY2hGaWx0ZXIgRmlsdGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHN1Ym9iamVjdHMgYWdhaW5zdC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRJblJlYWN0VHJlZSh0cmVlLCBzZWFyY2hGaWx0ZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5UcmVlKHRyZWUsIHNlYXJjaEZpbHRlciwge3dhbGthYmxlOiBbXCJwcm9wc1wiLCBcImNoaWxkcmVuXCIsIFwicmV0dXJuXCIsIFwic3RhdGVOb2RlXCJdfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldFJlYWN0SW5zdGFuY2Uobm9kZSkge1xyXG4gICAgICAgIGlmIChub2RlLl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCkgcmV0dXJuIG5vZGUuX19yZWFjdEludGVybmFsSW5zdGFuY2UkO1xyXG4gICAgICAgIHJldHVybiBub2RlW09iamVjdC5rZXlzKG5vZGUpLmZpbmQoayA9PiBrLnN0YXJ0c1dpdGgoXCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZVwiKSldIHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogR3JhYnMgYSB2YWx1ZSBmcm9tIHRoZSByZWFjdCBpbnRlcm5hbCBpbnN0YW5jZS4gQWxsb3dzIHlvdSB0byBncmFiXHJcblx0ICogbG9uZyBkZXB0aCB2YWx1ZXMgc2FmZWx5IHdpdGhvdXQgYWNjZXNzaW5nIG5vIGxvbmdlciB2YWxpZCBwcm9wZXJ0aWVzLlxyXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBub2RlIHRvIG9idGFpbiByZWFjdCBpbnN0YW5jZSBvZlxyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyBmb3IgdGhlIHNlYXJjaFxyXG5cdCAqIEBwYXJhbSB7YXJyYXl9IFtvcHRpb25zLmluY2x1ZGVdIC0gbGlzdCBvZiBpdGVtcyB0byBpbmNsdWRlIGZyb20gdGhlIHNlYXJjaFxyXG5cdCAqIEBwYXJhbSB7YXJyYXl9IFtvcHRpb25zLmV4Y2x1ZGU9W1wiUG9wb3V0XCIsIFwiVG9vbHRpcFwiLCBcIlNjcm9sbGVyXCIsIFwiQmFja2dyb3VuZEZsYXNoXCJdXSAtIGxpc3Qgb2YgaXRlbXMgdG8gZXhjbHVkZSBmcm9tIHRoZSBzZWFyY2hcclxuXHQgKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5maWx0ZXI9Xz0+X10gLSBmaWx0ZXIgdG8gY2hlY2sgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugd2l0aCAoc2hvdWxkIHJldHVybiBhIGJvb2xlYW4pXHJcblx0ICogQHJldHVybiB7KCp8bnVsbCl9IHRoZSBvd25lciBpbnN0YW5jZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRPd25lckluc3RhbmNlKG5vZGUsIHtpbmNsdWRlLCBleGNsdWRlID0gW1wiUG9wb3V0XCIsIFwiVG9vbHRpcFwiLCBcIlNjcm9sbGVyXCIsIFwiQmFja2dyb3VuZEZsYXNoXCJdLCBmaWx0ZXIgPSBfID0+IF99ID0ge30pIHtcclxuXHRcdGlmIChub2RlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHRjb25zdCBleGNsdWRpbmcgPSBpbmNsdWRlID09PSB1bmRlZmluZWQ7XHJcblx0XHRjb25zdCBuYW1lRmlsdGVyID0gZXhjbHVkaW5nID8gZXhjbHVkZSA6IGluY2x1ZGU7XHJcblx0XHRmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShvd25lcikge1xyXG5cdFx0XHRjb25zdCB0eXBlID0gb3duZXIudHlwZTtcclxuXHRcdFx0aWYgKCF0eXBlKSByZXR1cm4gbnVsbDtcclxuXHRcdFx0cmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XHJcblx0XHR9XHJcblx0XHRmdW5jdGlvbiBjbGFzc0ZpbHRlcihvd25lcikge1xyXG5cdFx0XHRjb25zdCBuYW1lID0gZ2V0RGlzcGxheU5hbWUob3duZXIpO1xyXG5cdFx0XHRyZXR1cm4gKG5hbWUgIT09IG51bGwgJiYgISEobmFtZUZpbHRlci5pbmNsdWRlcyhuYW1lKSBeIGV4Y2x1ZGluZykpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBjdXJyID0gdGhpcy5nZXRSZWFjdEluc3RhbmNlKG5vZGUpO1xyXG5cdFx0Zm9yIChjdXJyID0gY3VyciAmJiBjdXJyLnJldHVybjsgY3VyciAhPT0gbnVsbDsgY3VyciA9IGN1cnIucmV0dXJuKSB7XHJcblx0XHRcdGlmIChjdXJyID09PSBudWxsKSBjb250aW51ZTtcclxuXHRcdFx0Y29uc3Qgb3duZXIgPSBjdXJyLnN0YXRlTm9kZTtcclxuXHRcdFx0aWYgKGN1cnIgIT09IG51bGwgJiYgIShvd25lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBjbGFzc0ZpbHRlcihjdXJyKSAmJiBmaWx0ZXIob3duZXIpKSByZXR1cm4gb3duZXI7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/modules/utilities.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Utilities; });\n/* harmony import */ var data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! data */ \"./src/data/data.js\");\n/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger */ \"./src/modules/logger.js\");\n\n\nclass Utilities {\n static repoUrl(path) {\n return `https://cdn.staticaly.com/gh/${data__WEBPACK_IMPORTED_MODULE_0__[\"Config\"].repo}/BetterDiscordApp/${data__WEBPACK_IMPORTED_MODULE_0__[\"Config\"].hash}/${path}`;\n }\n /**\r\n * Parses a string of HTML and returns the results. If the second parameter is true,\r\n * the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.\r\n * This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node.\r\n *\r\n * If the second parameter is false, then the return value will be the list of parsed\r\n * nodes and there were multiple top level nodes, otherwise the single node is returned.\r\n * @param {string} html - HTML to be parsed\r\n * @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`\r\n * @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing\r\n */\n\n\n static parseHTML(html, fragment = false) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n const node = template.content.cloneNode(true);\n if (fragment) return node;\n return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];\n }\n\n static getTextArea() {\n return $(\".channelTextArea-1LDbYG textarea\");\n }\n\n static insertText(textarea, text) {\n textarea.focus();\n textarea.selectionStart = 0;\n textarea.selectionEnd = textarea.value.length;\n document.execCommand(\"insertText\", false, text);\n }\n\n static escape(s) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n }\n\n static testJSON(data) {\n try {\n return JSON.parse(data);\n } catch (err) {\n return false;\n }\n }\n\n static suppressErrors(method, message) {\n return (...params) => {\n try {\n return method(...params);\n } catch (e) {\n _logger__WEBPACK_IMPORTED_MODULE_1__[\"default\"].stacktrace(\"SuppressedError\", \"Error occurred in \" + message, e);\n }\n };\n }\n\n static monkeyPatch(what, methodName, options) {\n const {\n before,\n after,\n instead,\n once = false,\n silent = false,\n force = false\n } = options;\n const displayName = options.displayName || what.displayName || what.name || what.constructor.displayName || what.constructor.name;\n if (!silent) console.log(\"patch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n\n if (!what[methodName]) {\n if (force) what[methodName] = function () {};else return console.error(methodName, \"does not exist for\", displayName); // eslint-disable-line no-console\n }\n\n const origMethod = what[methodName];\n\n const cancel = () => {\n if (!silent) console.log(\"unpatch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n\n what[methodName] = origMethod;\n };\n\n what[methodName] = function () {\n const data = {\n thisObject: this,\n methodArguments: arguments,\n cancelPatch: cancel,\n originalMethod: origMethod,\n callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)\n };\n\n if (instead) {\n const tempRet = Utilities.suppressErrors(instead, \"`instead` callback of \" + what[methodName].displayName)(data);\n if (tempRet !== undefined) data.returnValue = tempRet;\n } else {\n if (before) Utilities.suppressErrors(before, \"`before` callback of \" + what[methodName].displayName)(data);\n data.callOriginalMethod();\n if (after) Utilities.suppressErrors(after, \"`after` callback of \" + what[methodName].displayName)(data);\n }\n\n if (once) cancel();\n return data.returnValue;\n };\n\n what[methodName].__monkeyPatched = true;\n if (!what[methodName].__originalMethod) what[methodName].__originalMethod = origMethod;\n what[methodName].displayName = \"patched \" + (what[methodName].displayName || methodName);\n return cancel;\n }\n\n static onRemoved(node, callback) {\n const observer = new MutationObserver(mutations => {\n for (let m = 0; m < mutations.length; m++) {\n const mutation = mutations[m];\n const nodes = Array.from(mutation.removedNodes);\n const directMatch = nodes.indexOf(node) > -1;\n const parentMatch = nodes.some(parent => parent.contains(node));\n\n if (directMatch || parentMatch) {\n observer.disconnect();\n callback();\n }\n }\n });\n observer.observe(document.body, {\n subtree: true,\n childList: true\n });\n }\n\n static isEmpty(obj) {\n if (obj == null || obj == undefined || obj == \"\") return true;\n if (typeof obj !== \"object\") return false;\n if (Array.isArray(obj)) return obj.length == 0;\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) return false;\n }\n\n return true;\n }\n /**\r\n * Generates an automatically memoizing version of an object.\r\n * @author Zerebos\r\n * @param {Object} object - object to memoize\r\n * @returns {Proxy} the proxy to the object that memoizes properties\r\n */\n\n\n static memoizeObject(object) {\n const proxy = new Proxy(object, {\n get: function (obj, mod) {\n if (!obj.hasOwnProperty(mod)) return undefined;\n\n if (Object.getOwnPropertyDescriptor(obj, mod).get) {\n const value = obj[mod];\n delete obj[mod];\n obj[mod] = value;\n }\n\n return obj[mod];\n },\n set: function (obj, mod, value) {\n if (obj.hasOwnProperty(mod)) return _logger__WEBPACK_IMPORTED_MODULE_1__[\"default\"].error(\"MemoizedObject\", \"Trying to overwrite existing property\");\n obj[mod] = value;\n return obj[mod];\n }\n });\n Object.defineProperty(proxy, \"hasOwnProperty\", {\n value: function (prop) {\n return this[prop] !== undefined;\n }\n });\n return proxy;\n }\n /**\r\n * Deep extends an object with a set of other objects. Objects later in the list\r\n * of `extenders` have priority, that is to say if one sets a key to be a primitive,\r\n * it will be overwritten with the next one with the same key. If it is an object,\r\n * and the keys match, the object is extended. This happens recursively.\r\n * @param {object} extendee - Object to be extended\r\n * @param {...object} extenders - Objects to extend with\r\n * @returns {object} - A reference to `extendee`\r\n */\n\n\n static extend(extendee, ...extenders) {\n for (let i = 0; i < extenders.length; i++) {\n for (const key in extenders[i]) {\n if (extenders[i].hasOwnProperty(key)) {\n if (typeof extendee[key] === \"object\" && typeof extenders[i][key] === \"object\") this.extend(extendee[key], extenders[i][key]);else if (typeof extenders[i][key] === \"object\") extendee[key] = {}, this.extend(extendee[key], extenders[i][key]);else extendee[key] = extenders[i][key];\n }\n }\n }\n\n return extendee;\n }\n /**\r\n * Format strings with placeholders (`{{placeholder}}`) into full strings.\r\n * Quick example: `PluginUtilities.formatString(\"Hello, {{user}}\", {user: \"Zerebos\"})`\r\n * would return \"Hello, Zerebos\".\r\n * @param {string} string - string to format\r\n * @param {object} values - object literal of placeholders to replacements\r\n * @returns {string} the properly formatted string\r\n */\n\n\n static formatString(string, values) {\n for (const val in values) {\n let replacement = values[val];\n if (Array.isArray(replacement)) replacement = JSON.stringify(replacement);\n if (typeof replacement === \"object\" && replacement !== null) replacement = replacement.toString();\n string = string.replace(new RegExp(`{{${val}}}`, \"g\"), replacement);\n }\n\n return string;\n }\n /**\r\n * Finds a value, subobject, or array from a tree that matches a specific filter.\r\n * @param {object} tree Tree that should be walked\r\n * @param {callable} searchFilter Filter to check against each object and subobject\r\n * @param {object} options Additional options to customize the search\r\n * @param {Array|null} [options.walkable=null] Array of strings to use as keys that are allowed to be walked on. Null value indicates all keys are walkable\r\n * @param {Array} [options.ignore=[]] Array of strings to use as keys to exclude from the search, most helpful when `walkable = null`.\r\n */\n\n\n static findInTree(tree, searchFilter, {\n walkable = null,\n ignore = []\n } = {}) {\n if (typeof searchFilter === \"string\") {\n if (tree.hasOwnProperty(searchFilter)) return tree[searchFilter];\n } else if (searchFilter(tree)) {\n return tree;\n }\n\n if (typeof tree !== \"object\" || tree == null) return undefined;\n let tempReturn = undefined;\n\n if (tree instanceof Array) {\n for (const value of tree) {\n tempReturn = this.findInTree(value, searchFilter, {\n walkable,\n ignore\n });\n if (typeof tempReturn != \"undefined\") return tempReturn;\n }\n } else {\n const toWalk = walkable == null ? Object.keys(tree) : walkable;\n\n for (const key of toWalk) {\n if (!tree.hasOwnProperty(key) || ignore.includes(key)) continue;\n tempReturn = this.findInTree(tree[key], searchFilter, {\n walkable,\n ignore\n });\n if (typeof tempReturn != \"undefined\") return tempReturn;\n }\n }\n\n return tempReturn;\n }\n /**\r\n * Gets a nested property (if it exists) safely. Path should be something like `prop.prop2.prop3`.\r\n * Numbers can be used for arrays as well like `prop.prop2.array.0.id`.\r\n * @param {Object} obj - object to get nested property of\r\n * @param {string} path - representation of the property to obtain\r\n */\n\n\n static getNestedProp(obj, path) {\n return path.split(/\\s?\\.\\s?/).reduce(function (currentObj, prop) {\n return currentObj && currentObj[prop];\n }, obj);\n }\n /**\r\n * Finds a value, subobject, or array from a tree that matches a specific filter. Great for patching render functions.\r\n * @param {object} tree React tree to look through. Can be a rendered object or an internal instance.\r\n * @param {callable} searchFilter Filter function to check subobjects against.\r\n */\n\n\n static findInRenderTree(tree, searchFilter, {\n walkable = [\"props\", \"children\", \"child\", \"sibling\"],\n ignore = []\n } = {}) {\n return this.findInTree(tree, searchFilter, {\n walkable,\n ignore\n });\n }\n /**\r\n * Finds a value, subobject, or array from a tree that matches a specific filter. Great for patching render functions.\r\n * @param {object} tree React tree to look through. Can be a rendered object or an internal instance.\r\n * @param {callable} searchFilter Filter function to check subobjects against.\r\n */\n\n\n static findInReactTree(tree, searchFilter) {\n return this.findInTree(tree, searchFilter, {\n walkable: [\"props\", \"children\", \"return\", \"stateNode\"]\n });\n }\n\n static getReactInstance(node) {\n if (node.__reactInternalInstance$) return node.__reactInternalInstance$;\n return node[Object.keys(node).find(k => k.startsWith(\"__reactInternalInstance\"))] || null;\n }\n /**\r\n * Grabs a value from the react internal instance. Allows you to grab\r\n * long depth values safely without accessing no longer valid properties.\r\n * @param {HTMLElement} node - node to obtain react instance of\r\n * @param {object} options - options for the search\r\n * @param {array} [options.include] - list of items to include from the search\r\n * @param {array} [options.exclude=[\"Popout\", \"Tooltip\", \"Scroller\", \"BackgroundFlash\"]] - list of items to exclude from the search\r\n * @param {callable} [options.filter=_=>_] - filter to check the current instance with (should return a boolean)\r\n * @return {(*|null)} the owner instance or undefined if not found.\r\n */\n\n\n static getOwnerInstance(node, {\n include,\n exclude = [\"Popout\", \"Tooltip\", \"Scroller\", \"BackgroundFlash\"],\n filter = _ => _\n } = {}) {\n if (node === undefined) return undefined;\n const excluding = include === undefined;\n const nameFilter = excluding ? exclude : include;\n\n function getDisplayName(owner) {\n const type = owner.type;\n if (!type) return null;\n return type.displayName || type.name || null;\n }\n\n function classFilter(owner) {\n const name = getDisplayName(owner);\n return name !== null && !!(nameFilter.includes(name) ^ excluding);\n }\n\n let curr = this.getReactInstance(node);\n\n for (curr = curr && curr.return; curr !== null; curr = curr.return) {\n if (curr === null) continue;\n const owner = curr.stateNode;\n if (curr !== null && !(owner instanceof HTMLElement) && classFilter(curr) && filter(owner)) return owner;\n }\n\n return null;\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL21vZHVsZXMvdXRpbGl0aWVzLmpzPzk3NjkiXSwibmFtZXMiOlsiVXRpbGl0aWVzIiwicmVwb1VybCIsInBhdGgiLCJDb25maWciLCJyZXBvIiwiaGFzaCIsInBhcnNlSFRNTCIsImh0bWwiLCJmcmFnbWVudCIsInRlbXBsYXRlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwibm9kZSIsImNvbnRlbnQiLCJjbG9uZU5vZGUiLCJjaGlsZE5vZGVzIiwibGVuZ3RoIiwiZ2V0VGV4dEFyZWEiLCIkIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwidGV4dCIsImZvY3VzIiwic2VsZWN0aW9uU3RhcnQiLCJzZWxlY3Rpb25FbmQiLCJ2YWx1ZSIsImV4ZWNDb21tYW5kIiwiZXNjYXBlIiwicyIsInJlcGxhY2UiLCJ0ZXN0SlNPTiIsImRhdGEiLCJKU09OIiwicGFyc2UiLCJlcnIiLCJzdXBwcmVzc0Vycm9ycyIsIm1ldGhvZCIsIm1lc3NhZ2UiLCJwYXJhbXMiLCJlIiwiTG9nZ2VyIiwic3RhY2t0cmFjZSIsIm1vbmtleVBhdGNoIiwid2hhdCIsIm1ldGhvZE5hbWUiLCJvcHRpb25zIiwiYmVmb3JlIiwiYWZ0ZXIiLCJpbnN0ZWFkIiwib25jZSIsInNpbGVudCIsImZvcmNlIiwiZGlzcGxheU5hbWUiLCJuYW1lIiwiY29uc3RydWN0b3IiLCJjb25zb2xlIiwibG9nIiwiZXJyb3IiLCJvcmlnTWV0aG9kIiwiY2FuY2VsIiwidGhpc09iamVjdCIsIm1ldGhvZEFyZ3VtZW50cyIsImFyZ3VtZW50cyIsImNhbmNlbFBhdGNoIiwib3JpZ2luYWxNZXRob2QiLCJjYWxsT3JpZ2luYWxNZXRob2QiLCJyZXR1cm5WYWx1ZSIsImFwcGx5IiwidGVtcFJldCIsInVuZGVmaW5lZCIsIl9fbW9ua2V5UGF0Y2hlZCIsIl9fb3JpZ2luYWxNZXRob2QiLCJvblJlbW92ZWQiLCJjYWxsYmFjayIsIm9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm0iLCJtdXRhdGlvbiIsIm5vZGVzIiwiQXJyYXkiLCJmcm9tIiwicmVtb3ZlZE5vZGVzIiwiZGlyZWN0TWF0Y2giLCJpbmRleE9mIiwicGFyZW50TWF0Y2giLCJzb21lIiwicGFyZW50IiwiY29udGFpbnMiLCJkaXNjb25uZWN0Iiwib2JzZXJ2ZSIsImJvZHkiLCJzdWJ0cmVlIiwiY2hpbGRMaXN0IiwiaXNFbXB0eSIsIm9iaiIsImlzQXJyYXkiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsIm1lbW9pemVPYmplY3QiLCJvYmplY3QiLCJwcm94eSIsIlByb3h5IiwiZ2V0IiwibW9kIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwic2V0IiwiZGVmaW5lUHJvcGVydHkiLCJwcm9wIiwiZXh0ZW5kIiwiZXh0ZW5kZWUiLCJleHRlbmRlcnMiLCJpIiwiZm9ybWF0U3RyaW5nIiwic3RyaW5nIiwidmFsdWVzIiwidmFsIiwicmVwbGFjZW1lbnQiLCJzdHJpbmdpZnkiLCJ0b1N0cmluZyIsIlJlZ0V4cCIsImZpbmRJblRyZWUiLCJ0cmVlIiwic2VhcmNoRmlsdGVyIiwid2Fsa2FibGUiLCJpZ25vcmUiLCJ0ZW1wUmV0dXJuIiwidG9XYWxrIiwia2V5cyIsImluY2x1ZGVzIiwiZ2V0TmVzdGVkUHJvcCIsInNwbGl0IiwicmVkdWNlIiwiY3VycmVudE9iaiIsImZpbmRJblJlbmRlclRyZWUiLCJmaW5kSW5SZWFjdFRyZWUiLCJnZXRSZWFjdEluc3RhbmNlIiwiX19yZWFjdEludGVybmFsSW5zdGFuY2UkIiwiZmluZCIsImsiLCJzdGFydHNXaXRoIiwiZ2V0T3duZXJJbnN0YW5jZSIsImluY2x1ZGUiLCJleGNsdWRlIiwiZmlsdGVyIiwiXyIsImV4Y2x1ZGluZyIsIm5hbWVGaWx0ZXIiLCJnZXREaXNwbGF5TmFtZSIsIm93bmVyIiwidHlwZSIsImNsYXNzRmlsdGVyIiwiY3VyciIsInJldHVybiIsInN0YXRlTm9kZSIsIkhUTUxFbGVtZW50Il0s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QUF3QkMsS0FBeEIsRUFBK0I7QUFDOUIsWUFBTUMsSUFBSSxHQUFHRCxLQUFLLENBQUNDLElBQW5CO0FBQ0EsVUFBSSxDQUFDQSxJQUFMLEVBQVcsT0FBTyxJQUFQO0FBQ1gsYUFBT0EsSUFBSSxDQUFDbkcsV0FBTCxJQUFvQm1HLElBQUksQ0FBQ2xHLElBQXpCLElBQWlDLElBQXhDO0FBQ0E7O0FBQ0QsYUFBU21HLFdBQVQsQ0FBcUJGLEtBQXJCLEVBQTRCO0FBQzNCLFlBQU1qRyxJQUFJLEdBQUdnRyxjQUFjLENBQUNDLEtBQUQsQ0FBM0I7QUFDQSxhQUFRakcsSUFBSSxLQUFLLElBQVQsSUFBaUIsQ0FBQyxFQUFFK0YsVUFBVSxDQUFDbEIsUUFBWCxDQUFvQjdFLElBQXBCLElBQTRCOEYsU0FBOUIsQ0FBMUI7QUFDQTs7QUFFRCxRQUFJTSxJQUFJLEdBQUcsS0FBS2hCLGdCQUFMLENBQXNCN0gsSUFBdEIsQ0FBWDs7QUFDQSxTQUFLNkksSUFBSSxHQUFHQSxJQUFJLElBQUlBLElBQUksQ0FBQ0MsTUFBekIsRUFBaUNELElBQUksS0FBSyxJQUExQyxFQUFnREEsSUFBSSxHQUFHQSxJQUFJLENBQUNDLE1BQTVELEVBQW9FO0FBQ25FLFVBQUlELElBQUksS0FBSyxJQUFiLEVBQW1CO0FBQ25CLFlBQU1ILEtBQUssR0FBR0csSUFBSSxDQUFDRSxTQUFuQjtBQUNBLFVBQUlGLElBQUksS0FBSyxJQUFULElBQWlCLEVBQUVILEtBQUssWUFBWU0sV0FBbkIsQ0FBakIsSUFBb0RKLFdBQVcsQ0FBQ0MsSUFBRCxDQUEvRCxJQUF5RVIsTUFBTSxDQUFDSyxLQUFELENBQW5GLEVBQTRGLE9BQU9BLEtBQVA7QUFDNUY7O0FBRUQsV0FBTyxJQUFQO0FBQ0E7O0FBeFM2QiIsImZpbGUiOiIuL3NyYy9tb2R1bGVzL3V0aWxpdGllcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uZmlnfSBmcm9tIFwiZGF0YVwiO1xyXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuL2xvZ2dlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbGl0aWVzIHtcclxuXHJcbiAgICBzdGF0aWMgcmVwb1VybChwYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIGBodHRwczovL2Nkbi5zdGF0aWNhbHkuY29tL2doLyR7Q29uZmlnLnJlcG99L0JldHRlckRpc2NvcmRBcHAvJHtDb25maWcuaGFzaH0vJHtwYXRofWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgb2YgSFRNTCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSxcclxuICAgICAqIHRoZSBwYXJzZWQgSFRNTCB3aWxsIGJlIHJldHVybmVkIGFzIGEgZG9jdW1lbnQgZnJhZ21lbnQge0BzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnR9LlxyXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIGlmIHlvdSBoYXZlIGEgbGlzdCBvZiBlbGVtZW50cyBhdCB0aGUgdG9wIGxldmVsLCB0aGV5IGNhbiB0aGVuIGJlIGFwcGVuZGVkIGFsbCBhdCBvbmNlIHRvIGFub3RoZXIgbm9kZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIGxpc3Qgb2YgcGFyc2VkXHJcbiAgICAgKiBub2RlcyBhbmQgdGhlcmUgd2VyZSBtdWx0aXBsZSB0b3AgbGV2ZWwgbm9kZXMsIG90aGVyd2lzZSB0aGUgc2luZ2xlIG5vZGUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIEhUTUwgdG8gYmUgcGFyc2VkXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcmFnbWVudD1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0aGUgcmV0dXJuIHNob3VsZCBiZSB0aGUgcmF3IGBEb2N1bWVudEZyYWdtZW50YFxyXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBUaGUgcmVzdWx0IG9mIEhUTUwgcGFyc2luZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcclxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKTtcclxuICAgICAgICBpZiAoZnJhZ21lbnQpIHJldHVybiBub2RlO1xyXG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/IG5vZGUuY2hpbGROb2RlcyA6IG5vZGUuY2hpbGROb2Rlc1swXTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0VGV4dEFyZWEoKSB7XHJcbiAgICAgICAgcmV0dXJuICQoXCIuY2hhbm5lbFRleHRBcmVhLTFMRGJZRyB0ZXh0YXJlYVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaW5zZXJ0VGV4dCh0ZXh0YXJlYSwgdGV4dCkge1xyXG4gICAgICAgIHRleHRhcmVhLmZvY3VzKCk7XHJcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQgPSAwO1xyXG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IHRleHRhcmVhLnZhbHVlLmxlbmd0aDtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluc2VydFRleHRcIiwgZmFsc2UsIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlc2NhcGUocykge1xyXG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stL1xcXFxeJCorPy4oKXxbXFxde31dL2csIFwiXFxcXCQmXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0ZXN0SlNPTihkYXRhKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIG1ldGhvZCguLi5wYXJhbXMpO1x0fVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkgeyBMb2dnZXIuc3RhY2t0cmFjZShcIlN1cHByZXNzZWRFcnJvclwiLCBcIkVycm9yIG9jY3VycmVkIGluIFwiICsgbWVzc2FnZSwgZSk7IH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qge2JlZm9yZSwgYWZ0ZXIsIGluc3RlYWQsIG9uY2UgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2UsIGZvcmNlID0gZmFsc2V9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IG9wdGlvbnMuZGlzcGxheU5hbWUgfHwgd2hhdC5kaXNwbGF5TmFtZSB8fCB3aGF0Lm5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwicGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXSkge1xyXG4gICAgICAgICAgICBpZiAoZm9yY2UpIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHt9O1xyXG4gICAgICAgICAgICBlbHNlIHJldHVybiBjb25zb2xlLmVycm9yKG1ldGhvZE5hbWUsIFwiZG9lcyBub3QgZXhpc3QgZm9yXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2QgPSB3aGF0W21ldGhvZE5hbWVdO1xyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwidW5wYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIHdoYXRbbWV0aG9kTmFtZV0gPSBvcmlnTWV0aG9kO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgdGhpc09iamVjdDogdGhpcyxcclxuICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3VtZW50czogYXJndW1lbnRzLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsUGF0Y2g6IGNhbmNlbCxcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kOiBvcmlnTWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgY2FsbE9yaWdpbmFsTWV0aG9kOiAoKSA9PiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5vcmlnaW5hbE1ldGhvZC5hcHBseShkYXRhLnRoaXNPYmplY3QsIGRhdGEubWV0aG9kQXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAoaW5zdGVhZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFJldCA9IFV0aWxpdGllcy5zdXBwcmVzc0Vycm9ycyhpbnN0ZWFkLCBcImBpbnN0ZWFkYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlbXBSZXQgIT09IHVuZGVmaW5lZCkgZGF0YS5yZXR1cm5WYWx1ZSA9IHRlbXBSZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlKSBVdGlsaXRpZXMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNhbGxPcmlnaW5hbE1ldGhvZCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyKSBVdGlsaXRpZXMuc3VwcHJlc3NFcnJvcnMoYWZ0ZXIsIFwiYGFmdGVyYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvbmNlKSBjYW5jZWwoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fbW9ua2V5UGF0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdNZXRob2Q7XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSA9IFwicGF0Y2hlZCBcIiArICh3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lIHx8IG1ldGhvZE5hbWUpO1xyXG4gICAgICAgIHJldHVybiBjYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG11dGF0aW9ucy5sZW5ndGg7IG0rKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbbV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzRW1wdHkob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiA9PSB1bmRlZmluZWQgfHwgb2JqID09IFwiXCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhbiBhdXRvbWF0aWNhbGx5IG1lbW9pemluZyB2ZXJzaW9uIG9mIGFuIG9iamVjdC5cclxuICAgICAqIEBhdXRob3IgWmVyZWJvc1xyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAtIG9iamVjdCB0byBtZW1vaXplXHJcbiAgICAgKiBAcmV0dXJucyB7UHJveHl9IHRoZSBwcm94eSB0byB0aGUgb2JqZWN0IHRoYXQgbWVtb2l6ZXMgcHJvcGVydGllc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWVtb2l6ZU9iamVjdChvYmplY3QpIHtcclxuICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShvYmplY3QsIHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbihvYmosIG1vZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkobW9kKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbW9kKS5nZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialttb2RdO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpbbW9kXTtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbbW9kXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ialttb2RdO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKG9iaiwgbW9kLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShtb2QpKSByZXR1cm4gTG9nZ2VyLmVycm9yKFwiTWVtb2l6ZWRPYmplY3RcIiwgXCJUcnlpbmcgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIHByb3BlcnR5XCIpO1xyXG4gICAgICAgICAgICAgICAgb2JqW21vZF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmpbbW9kXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJveHksIFwiaGFzT3duUHJvcGVydHlcIiwge3ZhbHVlOiBmdW5jdGlvbihwcm9wKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3Byb3BdICE9PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfX0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJveHk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWVwIGV4dGVuZHMgYW4gb2JqZWN0IHdpdGggYSBzZXQgb2Ygb3RoZXIgb2JqZWN0cy4gT2JqZWN0cyBsYXRlciBpbiB0aGUgbGlzdFxyXG4gICAgICogb2YgYGV4dGVuZGVyc2AgaGF2ZSBwcmlvcml0eSwgdGhhdCBpcyB0byBzYXkgaWYgb25lIHNldHMgYSBrZXkgdG8gYmUgYSBwcmltaXRpdmUsXHJcbiAgICAgKiBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5leHQgb25lIHdpdGggdGhlIHNhbWUga2V5LiBJZiBpdCBpcyBhbiBvYmplY3QsXHJcbiAgICAgKiBhbmQgdGhlIGtleXMgbWF0Y2gsIHRoZSBvYmplY3QgaXMgZXh0ZW5kZWQuIFRoaXMgaGFwcGVucyByZWN1cnNpdmVseS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBleHRlbmRlZSAtIE9iamVjdCB0byBiZSBleHRlbmRlZFxyXG4gICAgICogQHBhcmFtIHsuLi5vYmplY3R9IGV4dGVuZGVycyAtIE9iamVjdHMgdG8gZXh0ZW5kIHdpdGhcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQSByZWZlcmVuY2UgdG8gYGV4dGVuZGVlYFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZXh0ZW5kKGV4dGVuZGVlLCAuLi5leHRlbmRlcnMpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBleHRlbmRlcnNbaV0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChleHRlbmRlcnNbaV0uaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0ZW5kZWVba2V5XSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZXh0ZW5kZXJzW2ldW2tleV0gPT09IFwib2JqZWN0XCIpIHRoaXMuZXh0ZW5kKGV4dGVuZGVlW2tleV0sIGV4dGVuZGVyc1tpXVtrZXldKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZXh0ZW5kZXJzW2ldW2tleV0gPT09IFwib2JqZWN0XCIpIGV4dGVuZGVlW2tleV0gPSB7fSwgdGhpcy5leHRlbmQoZXh0ZW5kZWVba2V5XSwgZXh0ZW5kZXJzW2ldW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZXh0ZW5kZWVba2V5XSA9IGV4dGVuZGVyc1tpXVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBleHRlbmRlZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvcm1hdCBzdHJpbmdzIHdpdGggcGxhY2Vob2xkZXJzIChge3twbGFjZWhvbGRlcn19YCkgaW50byBmdWxsIHN0cmluZ3MuXHJcbiAgICAgKiBRdWljayBleGFtcGxlOiBgUGx1Z2luVXRpbGl0aWVzLmZvcm1hdFN0cmluZyhcIkhlbGxvLCB7e3VzZXJ9fVwiLCB7dXNlcjogXCJaZXJlYm9zXCJ9KWBcclxuICAgICAqIHdvdWxkIHJldHVybiBcIkhlbGxvLCBaZXJlYm9zXCIuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gc3RyaW5nIHRvIGZvcm1hdFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyAtIG9iamVjdCBsaXRlcmFsIG9mIHBsYWNlaG9sZGVycyB0byByZXBsYWNlbWVudHNcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBwcm9wZXJseSBmb3JtYXR0ZWQgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmb3JtYXRTdHJpbmcoc3RyaW5nLCB2YWx1ZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHZhbCBpbiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdmFsdWVzW3ZhbF07XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VtZW50KSkgcmVwbGFjZW1lbnQgPSBKU09OLnN0cmluZ2lmeShyZXBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YocmVwbGFjZW1lbnQpID09PSBcIm9iamVjdFwiICYmIHJlcGxhY2VtZW50ICE9PSBudWxsKSByZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKG5ldyBSZWdFeHAoYHt7JHt2YWx9fX1gLCBcImdcIiksIHJlcGxhY2VtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGEgdmFsdWUsIHN1Ym9iamVjdCwgb3IgYXJyYXkgZnJvbSBhIHRyZWUgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWMgZmlsdGVyLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHRyZWUgVHJlZSB0aGF0IHNob3VsZCBiZSB3YWxrZWRcclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IHNlYXJjaEZpbHRlciBGaWx0ZXIgdG8gY2hlY2sgYWdhaW5zdCBlYWNoIG9iamVjdCBhbmQgc3Vib2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgdG8gY3VzdG9taXplIHRoZSBzZWFyY2hcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPnxudWxsfSBbb3B0aW9ucy53YWxrYWJsZT1udWxsXSBBcnJheSBvZiBzdHJpbmdzIHRvIHVzZSBhcyBrZXlzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgd2Fsa2VkIG9uLiBOdWxsIHZhbHVlIGluZGljYXRlcyBhbGwga2V5cyBhcmUgd2Fsa2FibGVcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW29wdGlvbnMuaWdub3JlPVtdXSBBcnJheSBvZiBzdHJpbmdzIHRvIHVzZSBhcyBrZXlzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgc2VhcmNoLCBtb3N0IGhlbHBmdWwgd2hlbiBgd2Fsa2FibGUgPSBudWxsYC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRJblRyZWUodHJlZSwgc2VhcmNoRmlsdGVyLCB7d2Fsa2FibGUgPSBudWxsLCBpZ25vcmUgPSBbXX0gPSB7fSkge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoRmlsdGVyID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGlmICh0cmVlLmhhc093blByb3BlcnR5KHNlYXJjaEZpbHRlcikpIHJldHVybiB0cmVlW3NlYXJjaEZpbHRlcl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNlYXJjaEZpbHRlcih0cmVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJlZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdHJlZSAhPT0gXCJvYmplY3RcIiB8fCB0cmVlID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCB0ZW1wUmV0dXJuID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0cmVlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0cmVlKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wUmV0dXJuID0gdGhpcy5maW5kSW5UcmVlKHZhbHVlLCBzZWFyY2hGaWx0ZXIsIHt3YWxrYWJsZSwgaWdub3JlfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRlbXBSZXR1cm4gIT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRlbXBSZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvV2FsayA9IHdhbGthYmxlID09IG51bGwgPyBPYmplY3Qua2V5cyh0cmVlKSA6IHdhbGthYmxlO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0b1dhbGspIHtcclxuICAgICAgICAgICAgICAgIGlmICghdHJlZS5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8IGlnbm9yZS5pbmNsdWRlcyhrZXkpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIHRlbXBSZXR1cm4gPSB0aGlzLmZpbmRJblRyZWUodHJlZVtrZXldLCBzZWFyY2hGaWx0ZXIsIHt3YWxrYWJsZSwgaWdub3JlfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRlbXBSZXR1cm4gIT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRlbXBSZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRlbXBSZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgbmVzdGVkIHByb3BlcnR5IChpZiBpdCBleGlzdHMpIHNhZmVseS4gUGF0aCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgYHByb3AucHJvcDIucHJvcDNgLlxyXG4gICAgICogTnVtYmVycyBjYW4gYmUgdXNlZCBmb3IgYXJyYXlzIGFzIHdlbGwgbGlrZSBgcHJvcC5wcm9wMi5hcnJheS4wLmlkYC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBvYmplY3QgdG8gZ2V0IG5lc3RlZCBwcm9wZXJ0eSBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvcGVydHkgdG8gb2J0YWluXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXROZXN0ZWRQcm9wKG9iaiwgcGF0aCkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KC9cXHM/XFwuXFxzPy8pLnJlZHVjZShmdW5jdGlvbihjdXJyZW50T2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50T2JqICYmIGN1cnJlbnRPYmpbcHJvcF07XHJcbiAgICAgICAgfSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGEgdmFsdWUsIHN1Ym9iamVjdCwgb3IgYXJyYXkgZnJvbSBhIHRyZWUgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWMgZmlsdGVyLiBHcmVhdCBmb3IgcGF0Y2hpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0cmVlIFJlYWN0IHRyZWUgdG8gbG9vayB0aHJvdWdoLiBDYW4gYmUgYSByZW5kZXJlZCBvYmplY3Qgb3IgYW4gaW50ZXJuYWwgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBzZWFyY2hGaWx0ZXIgRmlsdGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHN1Ym9iamVjdHMgYWdhaW5zdC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRJblJlbmRlclRyZWUodHJlZSwgc2VhcmNoRmlsdGVyLCB7d2Fsa2FibGUgPSBbXCJwcm9wc1wiLCBcImNoaWxkcmVuXCIsIFwiY2hpbGRcIiwgXCJzaWJsaW5nXCJdLCBpZ25vcmUgPSBbXX0gPSB7fSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRJblRyZWUodHJlZSwgc2VhcmNoRmlsdGVyLCB7d2Fsa2FibGUsIGlnbm9yZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYSB2YWx1ZSwgc3Vib2JqZWN0LCBvciBhcnJheSBmcm9tIGEgdHJlZSB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBmaWx0ZXIuIEdyZWF0IGZvciBwYXRjaGluZyByZW5kZXIgZnVuY3Rpb25zLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHRyZWUgUmVhY3QgdHJlZSB0byBsb29rIHRocm91Z2guIENhbiBiZSBhIHJlbmRlcmVkIG9iamVjdCBvciBhbiBpbnRlcm5hbCBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IHNlYXJjaEZpbHRlciBGaWx0ZXIgZnVuY3Rpb24gdG8gY2hlY2sgc3Vib2JqZWN0cyBhZ2FpbnN0LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZmluZEluUmVhY3RUcmVlKHRyZWUsIHNlYXJjaEZpbHRlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRJblRyZWUodHJlZSwgc2VhcmNoRmlsdGVyLCB7d2Fsa2FibGU6IFtcInByb3BzXCIsIFwiY2hpbGRyZW5cIiwgXCJyZXR1cm5cIiwgXCJzdGF0ZU5vZGVcIl19KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0UmVhY3RJbnN0YW5jZShub2RlKSB7XHJcbiAgICAgICAgaWYgKG5vZGUuX19yZWFjdEludGVybmFsSW5zdGFuY2UkKSByZXR1cm4gbm9kZS5fX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQ7XHJcbiAgICAgICAgcmV0dXJuIG5vZGVbT2JqZWN0LmtleXMobm9kZSkuZmluZChrID0+IGsuc3RhcnRzV2l0aChcIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlXCIpKV0gfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBHcmFicyBhIHZhbHVlIGZyb20gdGhlIHJlYWN0IGludGVybmFsIGluc3RhbmNlLiBBbGxvd3MgeW91IHRvIGdyYWJcclxuXHQgKiBsb25nIGRlcHRoIHZhbHVlcyBzYWZlbHkgd2l0aG91dCBhY2Nlc3Npbmcgbm8gbG9uZ2VyIHZhbGlkIHByb3BlcnRpZXMuXHJcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIG5vZGUgdG8gb2J0YWluIHJlYWN0IGluc3RhbmNlIG9mXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIGZvciB0aGUgc2VhcmNoXHJcblx0ICogQHBhcmFtIHthcnJheX0gW29wdGlvbnMuaW5jbHVkZV0gLSBsaXN0IG9mIGl0ZW1zIHRvIGluY2x1ZGUgZnJvbSB0aGUgc2VhcmNoXHJcblx0ICogQHBhcmFtIHthcnJheX0gW29wdGlvbnMuZXhjbHVkZT1bXCJQb3BvdXRcIiwgXCJUb29sdGlwXCIsIFwiU2Nyb2xsZXJcIiwgXCJCYWNrZ3JvdW5kRmxhc2hcIl1dIC0gbGlzdCBvZiBpdGVtcyB0byBleGNsdWRlIGZyb20gdGhlIHNlYXJjaFxyXG5cdCAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLmZpbHRlcj1fPT5fXSAtIGZpbHRlciB0byBjaGVjayB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIChzaG91bGQgcmV0dXJuIGEgYm9vbGVhbilcclxuXHQgKiBAcmV0dXJuIHsoKnxudWxsKX0gdGhlIG93bmVyIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmQuXHJcblx0ICovXHJcblx0c3RhdGljIGdldE93bmVySW5zdGFuY2Uobm9kZSwge2luY2x1ZGUsIGV4Y2x1ZGUgPSBbXCJQb3BvdXRcIiwgXCJUb29sdGlwXCIsIFwiU2Nyb2xsZXJcIiwgXCJCYWNrZ3JvdW5kRmxhc2hcIl0sIGZpbHRlciA9IF8gPT4gX30gPSB7fSkge1xyXG5cdFx0aWYgKG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdGNvbnN0IGV4Y2x1ZGluZyA9IGluY2x1ZGUgPT09IHVuZGVmaW5lZDtcclxuXHRcdGNvbnN0IG5hbWVGaWx0ZXIgPSBleGNsdWRpbmcgPyBleGNsdWRlIDogaW5jbHVkZTtcclxuXHRcdGZ1bmN0aW9uIGdldERpc3BsYXlOYW1lKG93bmVyKSB7XHJcblx0XHRcdGNvbnN0IHR5cGUgPSBvd25lci50eXBlO1xyXG5cdFx0XHRpZiAoIXR5cGUpIHJldHVybiBudWxsO1xyXG5cdFx0XHRyZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcclxuXHRcdH1cclxuXHRcdGZ1bmN0aW9uIGNsYXNzRmlsdGVyKG93bmVyKSB7XHJcblx0XHRcdGNvbnN0IG5hbWUgPSBnZXREaXNwbGF5TmFtZShvd25lcik7XHJcblx0XHRcdHJldHVybiAobmFtZSAhPT0gbnVsbCAmJiAhIShuYW1lRmlsdGVyLmluY2x1ZGVzKG5hbWUpIF4gZXhjbHVkaW5nKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGN1cnIgPSB0aGlzLmdldFJlYWN0SW5zdGFuY2Uobm9kZSk7XHJcblx0XHRmb3IgKGN1cnIgPSBjdXJyICYmIGN1cnIucmV0dXJuOyBjdXJyICE9PSBudWxsOyBjdXJyID0gY3Vyci5yZXR1cm4pIHtcclxuXHRcdFx0aWYgKGN1cnIgPT09IG51bGwpIGNvbnRpbnVlO1xyXG5cdFx0XHRjb25zdCBvd25lciA9IGN1cnIuc3RhdGVOb2RlO1xyXG5cdFx0XHRpZiAoY3VyciAhPT0gbnVsbCAmJiAhKG93bmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpICYmIGNsYXNzRmlsdGVyKGN1cnIpICYmIGZpbHRlcihvd25lcikpIHJldHVybiBvd25lcjtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/modules/utilities.js\n"); /***/ }), @@ -855,6 +855,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var modu /***/ }), +/***/ "./src/ui/settings/addoncard.jsx": +/*!***************************************!*\ + !*** ./src/ui/settings/addoncard.jsx ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return AddonCard; });\n/* harmony import */ var modules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! modules */ \"./src/modules/modules.js\");\n/* harmony import */ var _icons_close__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/close */ \"./src/ui/icons/close.jsx\");\n/* harmony import */ var _icons_reload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icons/reload */ \"./src/ui/icons/reload.jsx\");\n\n\n\nclass AddonCard extends modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].Component {\n constructor(props) {\n super(props);\n this.state = {\n checked: this.props.enabled,\n settingsOpen: false\n };\n this.settingsPanel = \"\";\n this.panelRef = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createRef();\n this.onChange = this.onChange.bind(this);\n this.reload = this.reload.bind(this);\n this.showSettings = this.showSettings.bind(this);\n this.closeSettings = this.closeSettings.bind(this);\n }\n\n reload() {\n if (!this.props.reload) return;\n this.props.addon = this.props.reload(this.props.addon.id);\n this.forceUpdate();\n }\n\n componentDidUpdate() {\n if (!this.state.settingsOpen) return;\n if (this.settingsPanel instanceof Node) this.panelRef.current.appendChild(this.settingsPanel); // if (!SettingsCookie[\"fork-ps-3\"]) return;\n\n const isHidden = (container, element) => {\n const cTop = container.scrollTop;\n const cBottom = cTop + container.clientHeight;\n const eTop = element.offsetTop;\n const eBottom = eTop + element.clientHeight;\n return eTop < cTop || eBottom > cBottom;\n };\n\n const panel = $(this.panelRef.current);\n const container = panel.parents(\".scroller-2FKFPG\");\n if (!isHidden(container[0], panel[0])) return;\n container.animate({\n scrollTop: panel.offset().top - container.offset().top + container.scrollTop() - 30\n }, 300);\n }\n\n getString(value) {\n return typeof value == \"string\" ? value : value.toString();\n }\n\n onChange() {\n this.setState({\n checked: !this.state.checked\n });\n this.props.onChange && this.props.onChange(this.props.addon.id);\n }\n\n showSettings() {\n if (!this.props.hasSettings) return;\n this.setState({\n settingsOpen: true\n });\n }\n\n closeSettings() {\n this.panelRef.current.innerHTML = \"\";\n this.setState({\n settingsOpen: false\n });\n }\n\n buildTitle(name, version, author) {\n const title = modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons.title.split(/({{[A-Za-z]+}})/);\n const nameIndex = title.findIndex(s => s == \"{{name}}\");\n if (nameIndex) title[nameIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-name\"\n }, name);\n const versionIndex = title.findIndex(s => s == \"{{version}}\");\n if (nameIndex) title[versionIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-version\"\n }, version);\n const authorIndex = title.findIndex(s => s == \"{{author}}\");\n if (nameIndex) title[authorIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-author\"\n }, author);\n return title.flat();\n }\n\n get settingsComponent() {\n const addon = this.props.addon;\n const name = this.getString(addon.name);\n\n try {\n this.settingsPanel = this.props.getSettingsPanel();\n } catch (err) {\n modules__WEBPACK_IMPORTED_MODULE_0__[\"Logger\"].stacktrace(\"Addon Settings\", \"Unable to get settings panel for \" + name + \".\", err);\n }\n\n const props = {\n id: `${name}-settings`,\n className: \"addon-settings\",\n ref: this.panelRef\n };\n if (typeof settingsPanel == \"string\") props.dangerouslySetInnerHTML = this.settingsPanel;\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"li\", {\n className: \"settings-open bd-switch-item\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-close\",\n onClick: this.closeSettings\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_icons_close__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null)), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", props, this.settingsPanel instanceof modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].Component ? this.settingsPanel : null));\n }\n\n buildLink(which) {\n const url = this.props.addon[which];\n if (!url) return null;\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"a\", {\n className: \"bd-link bd-link-website\",\n href: url,\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons[which]);\n }\n\n get footer() {\n const links = [\"website\", \"source\"];\n if (!links.some(l => this.props.addon[l]) && !this.props.hasSettings) return null;\n const linkComponents = links.map(this.buildLink.bind(this)).filter(c => c);\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-footer\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-links\"\n }, linkComponents.map((comp, i) => i < linkComponents.length - 1 ? [comp, \" | \"] : [comp]).flat()), this.props.hasSettings && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"button\", {\n onClick: this.showSettings,\n className: \"bd-button bd-button-addon-settings\",\n disabled: !this.state.checked\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons.addonSettings));\n }\n\n render() {\n if (this.state.settingsOpen) return this.settingsComponent;\n const addon = this.props.addon;\n const name = this.getString(addon.name);\n const author = this.getString(addon.author);\n const description = this.getString(addon.description);\n const version = this.getString(addon.version);\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"li\", {\n dataName: name,\n dataVersion: version,\n className: \"settings-closed bd-switch-item\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-header\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-header-title\"\n }, this.buildTitle(name, version, author)), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-controls\"\n }, this.props.showReloadIcon && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_icons_reload__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"bd-reload bd-reload-card\",\n onClick: this.reload\n }), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"label\", {\n className: \"bd-switch-wrapper\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"input\", {\n className: \"bd-switch-checkbox\",\n checked: this.state.checked,\n onChange: this.onChange,\n type: \"checkbox\"\n }), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: this.state.checked ? \"bd-switch checked\" : \"bd-switch\"\n })))), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-description-wrap scroller-wrap fade\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-description scroller\"\n }, description)), this.footer);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL3VpL3NldHRpbmdzL2FkZG9uY2FyZC5qc3g/NjM3MyJdLCJuYW1lcyI6WyJBZGRvbkNhcmQiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJzdGF0ZSIsImNoZWNrZWQiLCJlbmFibGVkIiwic2V0dGluZ3NPcGVuIiwic2V0dGluZ3NQYW5lbCIsInBhbmVsUmVmIiwiY3JlYXRlUmVmIiwib25DaGFuZ2UiLCJiaW5kIiwicmVsb2FkIiwic2hvd1NldHRpbmdzIiwiY2xvc2VTZXR0aW5ncyIsImFkZG9uIiwiaWQiLCJmb3JjZVVwZGF0ZSIsImNvbXBvbmVudERpZFVwZGF0ZSIsIk5vZGUiLCJjdXJyZW50IiwiYXBwZW5kQ2hpbGQiLCJpc0hpZGRlbiIsImNvbnRhaW5lciIsImVsZW1lbnQiLCJjVG9wIiwic2Nyb2xsVG9wIiwiY0JvdHRvbSIsImNsaWVudEhlaWdodCIsImVUb3AiLCJvZmZzZXRUb3AiLCJlQm90dG9tIiwicGFuZWwiLCIkIiwicGFyZW50cyIsImFuaW1hdGUiLCJvZmZzZXQiLCJ0b3AiLCJnZXRTdHJpbmciLCJ2YWx1ZSIsInRvU3RyaW5nIiwic2V0U3RhdGUiLCJoYXNTZXR0aW5ncyIsImlubmVySFRNTCIsImJ1aWxkVGl0bGUiLCJuYW1lIiwidmVyc2lvbiIsImF1dGhvciIsInRpdGxlIiwiU3RyaW5ncyIsIkFkZG9ucyIsInNwbGl0IiwibmFtZUluZGV4IiwiZmluZEluZGV4IiwicyIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJ2ZXJzaW9uSW5kZXgiLCJhdXRob3JJbmRleCIsImZsYXQiLCJzZXR0aW5nc0NvbXBvbmVudCIsImdldFNldHRpbmdzUGFuZWwiLCJlcnIiLCJMb2dnZXIiLCJzdGFja3RyYWNlIiwicmVmIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJidWlsZExpbmsiLCJ3aGljaCIsInVybCIsImZvb3RlciIsImxpbmtzIiwic29tZSIsImwiLCJsaW5rQ29tcG9uZW50cyIsIm1hcCIsImZpbHRlciIsImMiLCJjb21wIiwiaSIsImxlbmd0aCIsImFkZG9uU2V0dGluZ3MiLCJyZW5kZXIiLCJkZXNjcmlwdGlvbiIsInNob3dSZWxvYWRJY29uIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRWUsTUFBTUEsU0FBTixTQUF3QkMsNkNBQUssQ0FBQ0MsU0FBOUIsQ0FBd0M7QUFFbkRDLGFBQVcsQ0FBQ0MsS0FBRCxFQUFRO0FBQ2YsVUFBTUEsS0FBTjtBQUNBLFNBQUtDLEtBQUwsR0FBYTtBQUNUQyxhQUFPLEVBQUUsS0FBS0YsS0FBTCxDQUFXRyxPQURYO0FBRVRDLGtCQUFZLEVBQUU7QUFGTCxLQUFiO0FBS0EsU0FBS0MsYUFBTCxHQUFxQixFQUFyQjtBQUNBLFNBQUtDLFFBQUwsR0FBZ0JULDZDQUFLLENBQUNVLFNBQU4sRUFBaEI7QUFFQSxTQUFLQyxRQUFMLEdBQWdCLEtBQUtBLFFBQUwsQ0FBY0MsSUFBZCxDQUFtQixJQUFuQixDQUFoQjtBQUNBLFNBQUtDLE1BQUwsR0FBYyxLQUFLQSxNQUFMLENBQVlELElBQVosQ0FBaUIsSUFBakIsQ0FBZDtBQUNBLFNBQUtFLFlBQUwsR0FBb0IsS0FBS0EsWUFBTCxDQUFrQkYsSUFBbEIsQ0FBdUIsSUFBdkIsQ0FBcEI7QUFDQSxTQUFLRyxhQUFMLEdBQXFCLEtBQUtBLGFBQUwsQ0FBbUJILElBQW5CLENBQXdCLElBQXhCLENBQXJCO0FBQ0g7O0FBRURDLFFBQU0sR0FBRztBQUNMLFFBQUksQ0FBQyxLQUFLVixLQUFMLENBQVdVLE1BQWhCLEVBQXdCO0FBQ3hCLFNBQUtWLEtBQUwsQ0FBV2EsS0FBWCxHQUFtQixLQUFLYixLQUFMLENBQVdVLE1BQVgsQ0FBa0IsS0FBS1YsS0FBTCxDQUFXYSxLQUFYLENBQWlCQyxFQUFuQyxDQUFuQjtBQUNBLFNBQUtDLFdBQUw7QUFDSDs7QUFFREMsb0JBQWtCLEdBQUc7QUFDakIsUUFBSSxDQUFDLEtBQUtmLEtB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O0FBQWYsT0FDSyxLQUFLN0MsS0FBTCxDQUFXa0YsY0FBWCxJQUE2Qiw0REFBQyxxREFBRDtBQUFZLGVBQVMsRUFBQywwQkFBdEI7QUFBaUQsYUFBTyxFQUFFLEtBQUt4RTtBQUEvRCxNQURsQyxFQUVJO0FBQU8sZUFBUyxFQUFDO0FBQWpCLE9BQ0k7QUFBTyxlQUFTLEVBQUMsb0JBQWpCO0FBQXNDLGFBQU8sRUFBRSxLQUFLVCxLQUFMLENBQVdDLE9BQTFEO0FBQW1FLGNBQVEsRUFBRSxLQUFLTSxRQUFsRjtBQUE0RixVQUFJLEVBQUM7QUFBakcsTUFESixFQUVJO0FBQUssZUFBUyxFQUFFLEtBQUtQLEtBQUwsQ0FBV0MsT0FBWCxHQUFxQixtQkFBckIsR0FBMkM7QUFBM0QsTUFGSixDQUZKLENBRlIsQ0FETCxFQVdLO0FBQUssZUFBUyxFQUFDO0FBQWYsT0FBd0Q7QUFBSyxlQUFTLEVBQUM7QUFBZixPQUEwQytFLFdBQTFDLENBQXhELENBWEwsRUFZTSxLQUFLYixNQVpYLENBQVA7QUFjSDs7QUEvSGtEIiwiZmlsZSI6Ii4vc3JjL3VpL3NldHRpbmdzL2FkZG9uY2FyZC5qc3guanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1JlYWN0LCBMb2dnZXIsIFN0cmluZ3N9IGZyb20gXCJtb2R1bGVzXCI7XHJcbmltcG9ydCBDbG9zZUJ1dHRvbiBmcm9tIFwiLi4vaWNvbnMvY2xvc2VcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4uL2ljb25zL3JlbG9hZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkb25DYXJkIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmVuYWJsZWQsXHJcbiAgICAgICAgICAgIHNldHRpbmdzT3BlbjogZmFsc2VcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmdzUGFuZWwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJlbG9hZCA9IHRoaXMucmVsb2FkLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93U2V0dGluZ3MgPSB0aGlzLnNob3dTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VTZXR0aW5ncyA9IHRoaXMuY2xvc2VTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMucHJvcHMucmVsb2FkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wcm9wcy5hZGRvbiA9IHRoaXMucHJvcHMucmVsb2FkKHRoaXMucHJvcHMuYWRkb24uaWQpO1xyXG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNldHRpbmdzT3BlbikgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzUGFuZWwgaW5zdGFuY2VvZiBOb2RlKSB0aGlzLnBhbmVsUmVmLmN1cnJlbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKCFTZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtM1wiXSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzSGlkZGVuID0gKGNvbnRhaW5lciwgZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgY0JvdHRvbSA9IGNUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgIGNvbnN0IGVCb3R0b20gPSBlVG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgIHJldHVybiAgKGVUb3AgPCBjVG9wIHx8IGVCb3R0b20gPiBjQm90dG9tKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBwYW5lbCA9ICQodGhpcy5wYW5lbFJlZi5jdXJyZW50KTtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBwYW5lbC5wYXJlbnRzKFwiLnNjcm9sbGVyLTJGS0ZQR1wiKTtcclxuICAgICAgICBpZiAoIWlzSGlkZGVuKGNvbnRhaW5lclswXSwgcGFuZWxbMF0pKSByZXR1cm47XHJcbiAgICAgICAgY29udGFpbmVyLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBzY3JvbGxUb3A6IHBhbmVsLm9mZnNldCgpLnRvcCAtIGNvbnRhaW5lci5vZmZzZXQoKS50b3AgKyBjb250YWluZXIuc2Nyb2xsVG9wKCkgLSAzMFxyXG4gICAgICAgIH0sIDMwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO31cclxuXHJcbiAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSk7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSAmJiB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuYWRkb24uaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dTZXR0aW5ncygpIHtcclxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuaGFzU2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nc09wZW46IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYuY3VycmVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZFRpdGxlKG5hbWUsIHZlcnNpb24sIGF1dGhvcikge1xyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gU3RyaW5ncy5BZGRvbnMudGl0bGUuc3BsaXQoLyh7e1tBLVphLXpdK319KS8pO1xyXG4gICAgICAgIGNvbnN0IG5hbWVJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e25hbWV9fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVtuYW1lSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1uYW1lXCJ9LCBuYW1lKTtcclxuICAgICAgICBjb25zdCB2ZXJzaW9uSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3t2ZXJzaW9ufX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbdmVyc2lvbkluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiYmQtdmVyc2lvblwifSwgdmVyc2lvbik7XHJcbiAgICAgICAgY29uc3QgYXV0aG9ySW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3thdXRob3J9fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVthdXRob3JJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLWF1dGhvclwifSwgYXV0aG9yKTtcclxuICAgICAgICByZXR1cm4gdGl0bGUuZmxhdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nc0NvbXBvbmVudCgpIHtcclxuICAgICAgICBjb25zdCBhZGRvbiA9IHRoaXMucHJvcHMuYWRkb247XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0U3RyaW5nKGFkZG9uLm5hbWUpO1xyXG4gICAgICAgIHRyeSB7IHRoaXMuc2V0dGluZ3NQYW5lbCA9IHRoaXMucHJvcHMuZ2V0U2V0dGluZ3NQYW5lbCgpOyB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikgeyBMb2dnZXIuc3RhY2t0cmFjZShcIkFkZG9uIFNldHRpbmdzXCIsIFwiVW5hYmxlIHRvIGdldCBzZXR0aW5ncyBwYW5lbCBmb3IgXCIgKyBuYW1lICsgXCIuXCIsIGVycik7IH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7aWQ6IGAke25hbWV9LXNldHRpbmdzYCwgY2xhc3NOYW1lOiBcImFkZG9uLXNldHRpbmdzXCIsIHJlZjogdGhpcy5wYW5lbFJlZn07XHJcbiAgICAgICAgaWYgKHR5cGVvZihzZXR0aW5nc1BhbmVsKSA9PSBcInN0cmluZ1wiKSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9IHRoaXMuc2V0dGluZ3NQYW5lbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJzZXR0aW5ncy1vcGVuIGJkLXN3aXRjaC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1jbG9zZVwiIG9uQ2xpY2s9e3RoaXMuY2xvc2VTZXR0aW5nc30+PENsb3NlQnV0dG9uIC8+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiB7Li4ucHJvcHN9Pnt0aGlzLnNldHRpbmdzUGFuZWwgaW5zdGFuY2VvZiBSZWFjdC5Db21wb25lbnQgPyB0aGlzLnNldHRpbmdzUGFuZWwgOiBudWxsfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9saT47XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRMaW5rKHdoaWNoKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5wcm9wcy5hZGRvblt3aGljaF07XHJcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiA8YSBjbGFzc05hbWU9XCJiZC1saW5rIGJkLWxpbmstd2Vic2l0ZVwiIGhyZWY9e3VybH0gdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPntTdHJpbmdzLkFkZG9uc1t3aGljaF19PC9hPjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9vdGVyKCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmtzID0gW1wid2Vic2l0ZVwiLCBcInNvdXJjZVwiXTtcclxuICAgICAgICBpZiAoIWxpbmtzLnNvbWUobCA9PiB0aGlzLnByb3BzLmFkZG9uW2xdKSAmJiAhdGhpcy5wcm9wcy5oYXNTZXR0aW5ncykgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgY29uc3QgbGlua0NvbXBvbmVudHMgPSBsaW5rcy5tYXAodGhpcy5idWlsZExpbmsuYmluZCh0aGlzKSkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmQtbGlua3NcIj57bGlua0NvbXBvbmVudHMubWFwKChjb21wLCBpKSA9PiBpIDwgbGlua0NvbXBvbmVudHMubGVuZ3RoIC0gMSA/IFtjb21wLCBcIiB8IFwiXSA6IFtjb21wXSkuZmxhdCgpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5oYXNTZXR0aW5ncyAmJiA8YnV0dG9uIG9uQ2xpY2s9e3RoaXMuc2hvd1NldHRpbmdzfSBjbGFzc05hbWU9XCJiZC1idXR0b24gYmQtYnV0dG9uLWFkZG9uLXNldHRpbmdzXCIgZGlzYWJsZWQ9eyF0aGlzLnN0YXRlLmNoZWNrZWR9PntTdHJpbmdzLkFkZG9ucy5hZGRvblNldHRpbmdzfTwvYnV0dG9uPn1cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2V0dGluZ3NPcGVuKSByZXR1cm4gdGhpcy5zZXR0aW5nc0NvbXBvbmVudDtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkb24gPSB0aGlzLnByb3BzLmFkZG9uO1xyXG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldFN0cmluZyhhZGRvbi5uYW1lKTtcclxuICAgICAgICBjb25zdCBhdXRob3IgPSB0aGlzLmdldFN0cmluZyhhZGRvbi5hdXRob3IpO1xyXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5nZXRTdHJpbmcoYWRkb24uZGVzY3JpcHRpb24pO1xyXG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFN0cmluZyhhZGRvbi52ZXJzaW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDxsaSBkYXRhTmFtZT17bmFtZX0gZGF0YVZlcnNpb249e3ZlcnNpb259IGNsYXNzTmFtZT1cInNldHRpbmdzLWNsb3NlZCBiZC1zd2l0Y2gtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJiZC1oZWFkZXItdGl0bGVcIj57dGhpcy5idWlsZFRpdGxlKG5hbWUsIHZlcnNpb24sIGF1dGhvcil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1jb250cm9sc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnNob3dSZWxvYWRJY29uICYmIDxSZWxvYWRJY29uIGNsYXNzTmFtZT1cImJkLXJlbG9hZCBiZC1yZWxvYWQtY2FyZFwiIG9uQ2xpY2s9e3RoaXMucmVsb2FkfSAvPn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtc3dpdGNoLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImJkLXN3aXRjaC1jaGVja2JveFwiIGNoZWNrZWQ9e3RoaXMuc3RhdGUuY2hlY2tlZH0gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IHR5cGU9XCJjaGVja2JveFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnN0YXRlLmNoZWNrZWQgPyBcImJkLXN3aXRjaCBjaGVja2VkXCIgOiBcImJkLXN3aXRjaFwifSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWRlc2NyaXB0aW9uLXdyYXAgc2Nyb2xsZXItd3JhcCBmYWRlXCI+PGRpdiBjbGFzc05hbWU9XCJiZC1kZXNjcmlwdGlvbiBzY3JvbGxlclwiPntkZXNjcmlwdGlvbn08L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5mb290ZXJ9XHJcbiAgICAgICAgICAgICAgICA8L2xpPjtcclxuICAgIH1cclxufVxyXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/ui/settings/addoncard.jsx\n"); + +/***/ }), + /***/ "./src/ui/settings/addonlist.jsx": /*!***************************************!*\ !*** ./src/ui/settings/addonlist.jsx ***! @@ -863,7 +875,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var modu /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return AddonList; });\n/* harmony import */ var modules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! modules */ \"./src/modules/modules.js\");\n/* harmony import */ var _title__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./title */ \"./src/ui/settings/title.jsx\");\n/* harmony import */ var _plugincard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./plugincard */ \"./src/ui/settings/plugincard.js\");\n/* harmony import */ var _themecard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./themecard */ \"./src/ui/settings/themecard.js\");\n/* harmony import */ var _icons_reload__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/reload */ \"./src/ui/icons/reload.jsx\");\n\n\n\n\n\nclass AddonList extends modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].Component {\n reload() {\n if (this.props.refreshList) this.props.refreshList();\n this.forceUpdate();\n }\n\n render() {\n const {\n title,\n folder,\n addonList,\n addonState,\n onChange,\n reload\n } = this.props;\n const showReloadIcon = !modules__WEBPACK_IMPORTED_MODULE_0__[\"Settings\"].get(\"settings\", \"addons\", \"autoReload\");\n const button = folder ? {\n title: modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons.openFolder.format({\n type: title\n }),\n onClick: () => {\n __webpack_require__(/*! electron */ \"electron\").shell.openItem(folder);\n }\n } : null;\n return [modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_title__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n key: \"title\",\n text: title,\n button: button,\n otherChildren: showReloadIcon && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_icons_reload__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"bd-reload\",\n onClick: this.reload.bind(this)\n })\n }), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"ul\", {\n key: \"addonList\",\n className: \"bd-slist\"\n }, addonList.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())).map(addon => {\n const CardType = addon.type ? _plugincard__WEBPACK_IMPORTED_MODULE_2__[\"default\"] : _themecard__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(CardType, {\n showReloadIcon: showReloadIcon,\n key: addon.id,\n enabled: addonState[addon.id],\n addon: addon,\n onChange: onChange,\n reload: reload\n });\n }))];\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL3VpL3NldHRpbmdzL2FkZG9ubGlzdC5qc3g/NjRkMiJdLCJuYW1lcyI6WyJBZGRvbkxpc3QiLCJSZWFjdCIsIkNvbXBvbmVudCIsInJlbG9hZCIsInByb3BzIiwicmVmcmVzaExpc3QiLCJmb3JjZVVwZGF0ZSIsInJlbmRlciIsInRpdGxlIiwiZm9sZGVyIiwiYWRkb25MaXN0IiwiYWRkb25TdGF0ZSIsIm9uQ2hhbmdlIiwic2hvd1JlbG9hZEljb24iLCJTZXR0aW5ncyIsImdldCIsImJ1dHRvbiIsIlN0cmluZ3MiLCJBZGRvbnMiLCJvcGVuRm9sZGVyIiwiZm9ybWF0IiwidHlwZSIsIm9uQ2xpY2siLCJyZXF1aXJlIiwic2hlbGwiLCJvcGVuSXRlbSIsImJpbmQiLCJzb3J0IiwiYSIsImIiLCJuYW1lIiwidG9Mb3dlckNhc2UiLCJsb2NhbGVDb21wYXJlIiwibWFwIiwiYWRkb24iLCJDYXJkVHlwZSIsIlBsdWdpbkNhcmQiLCJUaGVtZUNhcmQiLCJpZCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRWUsTUFBTUEsU0FBTixTQUF3QkMsNkNBQUssQ0FBQ0MsU0FBOUIsQ0FBd0M7QUFFbkRDLFFBQU0sR0FBRztBQUNMLFFBQUksS0FBS0MsS0FBTCxDQUFXQyxXQUFmLEVBQTRCLEtBQUtELEtBQUwsQ0FBV0MsV0FBWDtBQUM1QixTQUFLQyxXQUFMO0FBQ0g7O0FBRURDLFFBQU0sR0FBRztBQUNMLFVBQU07QUFBQ0MsV0FBRDtBQUFRQyxZQUFSO0FBQWdCQyxlQUFoQjtBQUEyQkMsZ0JBQTNCO0FBQXVDQyxjQUF2QztBQUFpRFQ7QUFBakQsUUFBMkQsS0FBS0MsS0FBdEU7QUFDQSxVQUFNUyxjQUFjLEdBQUcsQ0FBQ0MsZ0RBQVEsQ0FBQ0MsR0FBVCxDQUFhLFVBQWIsRUFBeUIsUUFBekIsRUFBbUMsWUFBbkMsQ0FBeEI7QUFDQSxVQUFNQyxNQUFNLEdBQUdQLE1BQU0sR0FBRztBQUFDRCxXQUFLLEVBQUVTLCtDQUFPLENBQUNDLE1BQVIsQ0FBZUMsVUFBZixDQUEwQkMsTUFBMUIsQ0FBaUM7QUFBQ0MsWUFBSSxFQUFFYjtBQUFQLE9BQWpDLENBQVI7QUFBeURjLGFBQU8sRUFBRSxNQUFNO0FBQUNDLDJCQUFPLENBQUMsMEJBQUQsQ0FBUCxDQUFvQkMsS0FBcEIsQ0FBMEJDLFFBQTFCLENBQW1DaEIsTUFBbkM7QUFBNEM7QUFBckgsS0FBSCxHQUE0SCxJQUFqSjtBQUNBLFdBQU8sQ0FDSCw0REFBQyw4Q0FBRDtBQUFlLFNBQUcsRUFBQyxPQUFuQjtBQUEyQixVQUFJLEVBQUVELEtBQWpDO0FBQXdDLFlBQU0sRUFBRVEsTUFBaEQ7QUFBd0QsbUJBQWEsRUFBRUgsY0FBYyxJQUFJLDREQUFDLHFEQUFEO0FBQVksaUJBQVMsRUFBQyxXQUF0QjtBQUFrQyxlQUFPLEVBQUUsS0FBS1YsTUFBTCxDQUFZdUIsSUFBWixDQUFpQixJQUFqQjtBQUEzQztBQUF6RixNQURHLEVBRUg7QUFBSSxTQUFHLEVBQUMsV0FBUjtBQUFvQixlQUFTLEVBQUU7QUFBL0IsT0FDQ2hCLFNBQVMsQ0FBQ2lCLElBQVYsQ0FBZSxDQUFDQyxDQUFELEVBQUlDLENBQUosS0FBVUQsQ0FBQyxDQUFDRSxJQUFGLENBQU9DLFdBQVAsR0FBcUJDLGFBQXJCLENBQW1DSCxDQUFDLENBQUNDLElBQUYsQ0FBT0MsV0FBUCxFQUFuQyxDQUF6QixFQUFtRkUsR0FBbkYsQ0FBdUZDLEtBQUssSUFBSTtBQUM3RixZQUFNQyxRQUFRLEdBQUdELEtBQUssQ0FBQ2IsSUFBTixHQUFhZSxtREFBYixHQUEwQkMsa0RBQTNDO0FBQ0EsYUFBTyw0REFBQyxRQUFEO0FBQVUsc0JBQWMsRUFBRXhCLGNBQTFCO0FBQTBDLFdBQUcsRUFBRXFCLEtBQUssQ0FBQ0ksRUFBckQ7QUFBeUQsZUFBTyxFQUFFM0IsVUFBVSxDQUFDdUIsS0FBSyxDQUFDSSxFQUFQLENBQTVFO0FBQXdGLGFBQUssRUFBRUosS0FBL0Y7QUFBc0csZ0JBQVEsRUFBRXRCLFFBQWhIO0FBQTBILGNBQU0sRUFBRVQ7QUFBbEksUUFBUDtBQUNILEtBSEEsQ0FERCxDQUZHLENBQVA7QUFTSDs7QUFwQmtEIiwiZmlsZSI6Ii4vc3JjL3VpL3NldHRpbmdzL2FkZG9ubGlzdC5qc3guanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1JlYWN0LCBTZXR0aW5ncywgU3RyaW5nc30gZnJvbSBcIm1vZHVsZXNcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuL3RpdGxlXCI7XHJcbmltcG9ydCBQbHVnaW5DYXJkIGZyb20gXCIuL3BsdWdpbmNhcmRcIjtcclxuaW1wb3J0IFRoZW1lQ2FyZCBmcm9tIFwiLi90aGVtZWNhcmRcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4uL2ljb25zL3JlbG9hZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkb25MaXN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuXHJcbiAgICByZWxvYWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMucmVmcmVzaExpc3QpIHRoaXMucHJvcHMucmVmcmVzaExpc3QoKTtcclxuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHt0aXRsZSwgZm9sZGVyLCBhZGRvbkxpc3QsIGFkZG9uU3RhdGUsIG9uQ2hhbmdlLCByZWxvYWR9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBzaG93UmVsb2FkSWNvbiA9ICFTZXR0aW5ncy5nZXQoXCJzZXR0aW5nc1wiLCBcImFkZG9uc1wiLCBcImF1dG9SZWxvYWRcIik7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gZm9sZGVyID8ge3RpdGxlOiBTdHJpbmdzLkFkZG9ucy5vcGVuRm9sZGVyLmZvcm1hdCh7dHlwZTogdGl0bGV9KSwgb25DbGljazogKCkgPT4ge3JlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShmb2xkZXIpO319IDogbnVsbDtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8U2V0dGluZ3NUaXRsZSBrZXk9XCJ0aXRsZVwiIHRleHQ9e3RpdGxlfSBidXR0b249e2J1dHRvbn0gb3RoZXJDaGlsZHJlbj17c2hvd1JlbG9hZEljb24gJiYgPFJlbG9hZEljb24gY2xhc3NOYW1lPVwiYmQtcmVsb2FkXCIgb25DbGljaz17dGhpcy5yZWxvYWQuYmluZCh0aGlzKX0gLz59IC8+LFxyXG4gICAgICAgICAgICA8dWwga2V5PVwiYWRkb25MaXN0XCIgY2xhc3NOYW1lPXtcImJkLXNsaXN0XCJ9PlxyXG4gICAgICAgICAgICB7YWRkb25MaXN0LnNvcnQoKGEsIGIpID0+IGEubmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5uYW1lLnRvTG93ZXJDYXNlKCkpKS5tYXAoYWRkb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgQ2FyZFR5cGUgPSBhZGRvbi50eXBlID8gUGx1Z2luQ2FyZCA6IFRoZW1lQ2FyZDtcclxuICAgICAgICAgICAgICAgIHJldHVybiA8Q2FyZFR5cGUgc2hvd1JlbG9hZEljb249e3Nob3dSZWxvYWRJY29ufSBrZXk9e2FkZG9uLmlkfSBlbmFibGVkPXthZGRvblN0YXRlW2FkZG9uLmlkXX0gYWRkb249e2FkZG9ufSBvbkNoYW5nZT17b25DaGFuZ2V9IHJlbG9hZD17cmVsb2FkfSAvPjtcclxuICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/settings/addonlist.jsx\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return AddonList; });\n/* harmony import */ var modules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! modules */ \"./src/modules/modules.js\");\n/* harmony import */ var _title__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./title */ \"./src/ui/settings/title.jsx\");\n/* harmony import */ var _icons_reload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icons/reload */ \"./src/ui/icons/reload.jsx\");\n/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addoncard */ \"./src/ui/settings/addoncard.jsx\");\n\n\n\n\nclass AddonList extends modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].Component {\n reload() {\n if (this.props.refreshList) this.props.refreshList();\n this.forceUpdate();\n }\n\n render() {\n const {\n title,\n folder,\n addonList,\n addonState,\n onChange,\n reload\n } = this.props;\n const showReloadIcon = !modules__WEBPACK_IMPORTED_MODULE_0__[\"Settings\"].get(\"settings\", \"addons\", \"autoReload\");\n const button = folder ? {\n title: modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons.openFolder.format({\n type: title\n }),\n onClick: () => {\n __webpack_require__(/*! electron */ \"electron\").shell.openItem(folder);\n }\n } : null;\n return [modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_title__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n key: \"title\",\n text: title,\n button: button,\n otherChildren: showReloadIcon && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_icons_reload__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"bd-reload\",\n onClick: this.reload.bind(this)\n })\n }), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"ul\", {\n key: \"addonList\",\n className: \"bd-slist\"\n }, addonList.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())).map(addon => {\n const hasSettings = addon.type && typeof addon.plugin.getSettingsPanel === \"function\";\n const getSettings = hasSettings && addon.plugin.getSettingsPanel.bind(addon.plugin);\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_addoncard__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n showReloadIcon: showReloadIcon,\n key: addon.id,\n enabled: addonState[addon.id],\n addon: addon,\n onChange: onChange,\n reload: reload,\n hasSettings: hasSettings,\n getSettingsPanel: getSettings\n });\n }))];\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL3VpL3NldHRpbmdzL2FkZG9ubGlzdC5qc3g/NjRkMiJdLCJuYW1lcyI6WyJBZGRvbkxpc3QiLCJSZWFjdCIsIkNvbXBvbmVudCIsInJlbG9hZCIsInByb3BzIiwicmVmcmVzaExpc3QiLCJmb3JjZVVwZGF0ZSIsInJlbmRlciIsInRpdGxlIiwiZm9sZGVyIiwiYWRkb25MaXN0IiwiYWRkb25TdGF0ZSIsIm9uQ2hhbmdlIiwic2hvd1JlbG9hZEljb24iLCJTZXR0aW5ncyIsImdldCIsImJ1dHRvbiIsIlN0cmluZ3MiLCJBZGRvbnMiLCJvcGVuRm9sZGVyIiwiZm9ybWF0IiwidHlwZSIsIm9uQ2xpY2siLCJyZXF1aXJlIiwic2hlbGwiLCJvcGVuSXRlbSIsImJpbmQiLCJzb3J0IiwiYSIsImIiLCJuYW1lIiwidG9Mb3dlckNhc2UiLCJsb2NhbGVDb21wYXJlIiwibWFwIiwiYWRkb24iLCJoYXNTZXR0aW5ncyIsInBsdWdpbiIsImdldFNldHRpbmdzUGFuZWwiLCJnZXRTZXR0aW5ncyIsImlkIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVlLE1BQU1BLFNBQU4sU0FBd0JDLDZDQUFLLENBQUNDLFNBQTlCLENBQXdDO0FBRW5EQyxRQUFNLEdBQUc7QUFDTCxRQUFJLEtBQUtDLEtBQUwsQ0FBV0MsV0FBZixFQUE0QixLQUFLRCxLQUFMLENBQVdDLFdBQVg7QUFDNUIsU0FBS0MsV0FBTDtBQUNIOztBQUVEQyxRQUFNLEdBQUc7QUFDTCxVQUFNO0FBQUNDLFdBQUQ7QUFBUUMsWUFBUjtBQUFnQkMsZUFBaEI7QUFBMkJDLGdCQUEzQjtBQUF1Q0MsY0FBdkM7QUFBaURUO0FBQWpELFFBQTJELEtBQUtDLEtBQXRFO0FBQ0EsVUFBTVMsY0FBYyxHQUFHLENBQUNDLGdEQUFRLENBQUNDLEdBQVQsQ0FBYSxVQUFiLEVBQXlCLFFBQXpCLEVBQW1DLFlBQW5DLENBQXhCO0FBQ0EsVUFBTUMsTUFBTSxHQUFHUCxNQUFNLEdBQUc7QUFBQ0QsV0FBSyxFQUFFUywrQ0FBTyxDQUFDQyxNQUFSLENBQWVDLFVBQWYsQ0FBMEJDLE1BQTFCLENBQWlDO0FBQUNDLFlBQUksRUFBRWI7QUFBUCxPQUFqQyxDQUFSO0FBQXlEYyxhQUFPLEVBQUUsTUFBTTtBQUFDQywyQkFBTyxDQUFDLDBCQUFELENBQVAsQ0FBb0JDLEtBQXBCLENBQTBCQyxRQUExQixDQUFtQ2hCLE1BQW5DO0FBQTRDO0FBQXJILEtBQUgsR0FBNEgsSUFBako7QUFDQSxXQUFPLENBQ0gsNERBQUMsOENBQUQ7QUFBZSxTQUFHLEVBQUMsT0FBbkI7QUFBMkIsVUFBSSxFQUFFRCxLQUFqQztBQUF3QyxZQUFNLEVBQUVRLE1BQWhEO0FBQXdELG1CQUFhLEVBQUVILGNBQWMsSUFBSSw0REFBQyxxREFBRDtBQUFZLGlCQUFTLEVBQUMsV0FBdEI7QUFBa0MsZUFBTyxFQUFFLEtBQUtWLE1BQUwsQ0FBWXVCLElBQVosQ0FBaUIsSUFBakI7QUFBM0M7QUFBekYsTUFERyxFQUVIO0FBQUksU0FBRyxFQUFDLFdBQVI7QUFBb0IsZUFBUyxFQUFFO0FBQS9CLE9BQ0NoQixTQUFTLENBQUNpQixJQUFWLENBQWUsQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKLEtBQVVELENBQUMsQ0FBQ0UsSUFBRixDQUFPQyxXQUFQLEdBQXFCQyxhQUFyQixDQUFtQ0gsQ0FBQyxDQUFDQyxJQUFGLENBQU9DLFdBQVAsRUFBbkMsQ0FBekIsRUFBbUZFLEdBQW5GLENBQXVGQyxLQUFLLElBQUk7QUFDN0YsWUFBTUMsV0FBVyxHQUFHRCxLQUFLLENBQUNiLElBQU4sSUFBYyxPQUFPYSxLQUFLLENBQUNFLE1BQU4sQ0FBYUMsZ0JBQXBCLEtBQTBDLFVBQTVFO0FBQ0EsWUFBTUMsV0FBVyxHQUFHSCxXQUFXLElBQUlELEtBQUssQ0FBQ0UsTUFBTixDQUFhQyxnQkFBYixDQUE4QlgsSUFBOUIsQ0FBbUNRLEtBQUssQ0FBQ0UsTUFBekMsQ0FBbkM7QUFDQSxhQUFPLDREQUFDLGtEQUFEO0FBQVcsc0JBQWMsRUFBRXZCLGNBQTNCO0FBQTJDLFdBQUcsRUFBRXFCLEtBQUssQ0FBQ0ssRUFBdEQ7QUFBMEQsZUFBTyxFQUFFNUIsVUFBVSxDQUFDdUIsS0FBSyxDQUFDSyxFQUFQLENBQTdFO0FBQXlGLGFBQUssRUFBRUwsS0FBaEc7QUFBdUcsZ0JBQVEsRUFBRXRCLFFBQWpIO0FBQTJILGNBQU0sRUFBRVQsTUFBbkk7QUFBMkksbUJBQVcsRUFBRWdDLFdBQXhKO0FBQXFLLHdCQUFnQixFQUFFRztBQUF2TCxRQUFQO0FBQ0gsS0FKQSxDQURELENBRkcsQ0FBUDtBQVVIOztBQXJCa0QiLCJmaWxlIjoiLi9zcmMvdWkvc2V0dGluZ3MvYWRkb25saXN0LmpzeC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhY3QsIFNldHRpbmdzLCBTdHJpbmdzfSBmcm9tIFwibW9kdWxlc1wiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vdGl0bGVcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4uL2ljb25zL3JlbG9hZFwiO1xyXG5pbXBvcnQgQWRkb25DYXJkIGZyb20gXCIuL2FkZG9uY2FyZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkb25MaXN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuXHJcbiAgICByZWxvYWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMucmVmcmVzaExpc3QpIHRoaXMucHJvcHMucmVmcmVzaExpc3QoKTtcclxuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHt0aXRsZSwgZm9sZGVyLCBhZGRvbkxpc3QsIGFkZG9uU3RhdGUsIG9uQ2hhbmdlLCByZWxvYWR9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBzaG93UmVsb2FkSWNvbiA9ICFTZXR0aW5ncy5nZXQoXCJzZXR0aW5nc1wiLCBcImFkZG9uc1wiLCBcImF1dG9SZWxvYWRcIik7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gZm9sZGVyID8ge3RpdGxlOiBTdHJpbmdzLkFkZG9ucy5vcGVuRm9sZGVyLmZvcm1hdCh7dHlwZTogdGl0bGV9KSwgb25DbGljazogKCkgPT4ge3JlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShmb2xkZXIpO319IDogbnVsbDtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8U2V0dGluZ3NUaXRsZSBrZXk9XCJ0aXRsZVwiIHRleHQ9e3RpdGxlfSBidXR0b249e2J1dHRvbn0gb3RoZXJDaGlsZHJlbj17c2hvd1JlbG9hZEljb24gJiYgPFJlbG9hZEljb24gY2xhc3NOYW1lPVwiYmQtcmVsb2FkXCIgb25DbGljaz17dGhpcy5yZWxvYWQuYmluZCh0aGlzKX0gLz59IC8+LFxyXG4gICAgICAgICAgICA8dWwga2V5PVwiYWRkb25MaXN0XCIgY2xhc3NOYW1lPXtcImJkLXNsaXN0XCJ9PlxyXG4gICAgICAgICAgICB7YWRkb25MaXN0LnNvcnQoKGEsIGIpID0+IGEubmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5uYW1lLnRvTG93ZXJDYXNlKCkpKS5tYXAoYWRkb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzU2V0dGluZ3MgPSBhZGRvbi50eXBlICYmIHR5cGVvZihhZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCkgPT09IFwiZnVuY3Rpb25cIjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdldFNldHRpbmdzID0gaGFzU2V0dGluZ3MgJiYgYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwuYmluZChhZGRvbi5wbHVnaW4pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxBZGRvbkNhcmQgc2hvd1JlbG9hZEljb249e3Nob3dSZWxvYWRJY29ufSBrZXk9e2FkZG9uLmlkfSBlbmFibGVkPXthZGRvblN0YXRlW2FkZG9uLmlkXX0gYWRkb249e2FkZG9ufSBvbkNoYW5nZT17b25DaGFuZ2V9IHJlbG9hZD17cmVsb2FkfSBoYXNTZXR0aW5ncz17aGFzU2V0dGluZ3N9IGdldFNldHRpbmdzUGFuZWw9e2dldFNldHRpbmdzfSAvPjtcclxuICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/settings/addonlist.jsx\n"); /***/ }), @@ -903,18 +915,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ }), -/***/ "./src/ui/settings/plugincard.js": -/*!***************************************!*\ - !*** ./src/ui/settings/plugincard.js ***! - \***************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return PluginCard; });\n/* harmony import */ var modules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! modules */ \"./src/modules/modules.js\");\n/* harmony import */ var _icons_close__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/close */ \"./src/ui/icons/close.jsx\");\n/* harmony import */ var _icons_reload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icons/reload */ \"./src/ui/icons/reload.jsx\");\n\n\n\nclass PluginCard extends modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].Component {\n constructor(props) {\n super(props);\n this.onChange = this.onChange.bind(this);\n this.showSettings = this.showSettings.bind(this);\n this.state = {\n checked: this.props.enabled,\n settingsOpen: false\n };\n this.hasSettings = typeof this.props.addon.plugin.getSettingsPanel === \"function\";\n this.settingsPanel = \"\";\n this.panelRef = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createRef();\n this.reload = this.reload.bind(this); // this.onReload = this.onReload.bind(this);\n\n this.closeSettings = this.closeSettings.bind(this);\n }\n\n reload() {\n if (!this.props.reload) return;\n this.props.addon = this.props.reload(this.props.addon.id);\n this.forceUpdate();\n }\n\n componentDidUpdate() {\n if (!this.state.settingsOpen) return;\n if (this.settingsPanel instanceof Node) this.panelRef.current.appendChild(this.settingsPanel); // if (!SettingsCookie[\"fork-ps-3\"]) return;\n\n const isHidden = (container, element) => {\n const cTop = container.scrollTop;\n const cBottom = cTop + container.clientHeight;\n const eTop = element.offsetTop;\n const eBottom = eTop + element.clientHeight;\n return eTop < cTop || eBottom > cBottom;\n };\n\n const panel = $(this.panelRef.current);\n const container = panel.parents(\".scroller-2FKFPG\");\n if (!isHidden(container[0], panel[0])) return;\n container.animate({\n scrollTop: panel.offset().top - container.offset().top + container.scrollTop() - 30\n }, 300);\n }\n\n getString(value) {\n return typeof value == \"string\" ? value : value.toString();\n }\n\n closeSettings() {\n this.panelRef.current.innerHTML = \"\";\n this.setState({\n settingsOpen: false\n });\n }\n\n buildTitle(name, version, author) {\n const title = modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons.title.split(/({{[A-Za-z]+}})/);\n const nameIndex = title.findIndex(s => s == \"{{name}}\");\n if (nameIndex) title[nameIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-name\"\n }, name);\n const versionIndex = title.findIndex(s => s == \"{{version}}\");\n if (nameIndex) title[versionIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-version\"\n }, version);\n const authorIndex = title.findIndex(s => s == \"{{author}}\");\n if (nameIndex) title[authorIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-author\"\n }, author);\n return title.flat();\n }\n\n get settingsComponent() {\n const addon = this.props.addon;\n const name = this.getString(addon.name);\n\n try {\n this.settingsPanel = addon.plugin.getSettingsPanel();\n } catch (err) {\n modules__WEBPACK_IMPORTED_MODULE_0__[\"Logger\"].stacktrace(\"Plugin Settings\", \"Unable to get settings panel for \" + name + \".\", err);\n }\n\n const props = {\n id: `plugin-settings-${name}`,\n className: \"plugin-settings\",\n ref: this.panelRef\n };\n if (typeof settingsPanel == \"string\") props.dangerouslySetInnerHTML = this.settingsPanel;\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"li\", {\n className: \"settings-open bd-switch-item\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-close\",\n onClick: this.closeSettings\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_icons_close__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null)), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", props, this.settingsPanel instanceof modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].Component ? this.settingsPanel : null));\n }\n\n buildLink(which) {\n const url = this.props.addon[which];\n if (!url) return null;\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"a\", {\n className: \"bd-link bd-link-website\",\n href: url,\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons[which]);\n }\n\n get footer() {\n const links = [\"website\", \"source\"];\n if (!links.some(l => this.props.addon[l]) && !this.hasSettings) return null;\n const linkComponents = links.map(this.buildLink.bind(this)).filter(c => c);\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-footer\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-links\"\n }, linkComponents.map((comp, i) => i < linkComponents.length - 1 ? [comp, \" | \"] : [comp]).flat()), this.hasSettings && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"button\", {\n onClick: this.showSettings,\n className: \"bd-button bd-button-plugin-settings\",\n disabled: !this.state.checked\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons.pluginSettings));\n }\n\n render() {\n if (this.state.settingsOpen) return this.settingsComponent;\n const {\n addon\n } = this.props;\n const name = this.getString(addon.name);\n const author = this.getString(addon.author);\n const description = this.getString(addon.description);\n const version = this.getString(addon.version);\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"li\", {\n dataName: name,\n dataVersion: version,\n className: \"settings-closed bd-switch-item\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-header\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-header-title\"\n }, this.buildTitle(name, version, author)), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-controls\"\n }, this.props.showReloadIcon && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_icons_reload__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n className: \"bd-reload bd-reload-card\",\n onClick: this.reload\n }), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"label\", {\n className: \"bd-switch-wrapper bd-flex-child\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"input\", {\n className: \"bd-switch-checkbox\",\n checked: this.state.checked,\n onChange: this.onChange,\n type: \"checkbox\"\n }), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: this.state.checked ? \"bd-switch checked\" : \"bd-switch\"\n })))), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-description-wrap scroller-wrap fade\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-description scroller\"\n }, description)), this.footer);\n }\n\n onChange() {\n this.setState({\n checked: !this.state.checked\n });\n this.props.onChange && this.props.onChange(this.props.addon.id);\n }\n\n showSettings() {\n if (!this.hasSettings) return;\n this.setState({\n settingsOpen: true\n });\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL3VpL3NldHRpbmdzL3BsdWdpbmNhcmQuanM/NzczZCJdLCJuYW1lcyI6WyJQbHVnaW5DYXJkIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwib25DaGFuZ2UiLCJiaW5kIiwic2hvd1NldHRpbmdzIiwic3RhdGUiLCJjaGVja2VkIiwiZW5hYmxlZCIsInNldHRpbmdzT3BlbiIsImhhc1NldHRpbmdzIiwiYWRkb24iLCJwbHVnaW4iLCJnZXRTZXR0aW5nc1BhbmVsIiwic2V0dGluZ3NQYW5lbCIsInBhbmVsUmVmIiwiY3JlYXRlUmVmIiwicmVsb2FkIiwiY2xvc2VTZXR0aW5ncyIsImlkIiwiZm9yY2VVcGRhdGUiLCJjb21wb25lbnREaWRVcGRhdGUiLCJOb2RlIiwiY3VycmVudCIsImFwcGVuZENoaWxkIiwiaXNIaWRkZW4iLCJjb250YWluZXIiLCJlbGVtZW50IiwiY1RvcCIsInNjcm9sbFRvcCIsImNCb3R0b20iLCJjbGllbnRIZWlnaHQiLCJlVG9wIiwib2Zmc2V0VG9wIiwiZUJvdHRvbSIsInBhbmVsIiwiJCIsInBhcmVudHMiLCJhbmltYXRlIiwib2Zmc2V0IiwidG9wIiwiZ2V0U3RyaW5nIiwidmFsdWUiLCJ0b1N0cmluZyIsImlubmVySFRNTCIsInNldFN0YXRlIiwiYnVpbGRUaXRsZSIsIm5hbWUiLCJ2ZXJzaW9uIiwiYXV0aG9yIiwidGl0bGUiLCJTdHJpbmdzIiwiQWRkb25zIiwic3BsaXQiLCJuYW1lSW5kZXgiLCJmaW5kSW5kZXgiLCJzIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInZlcnNpb25JbmRleCIsImF1dGhvckluZGV4IiwiZmxhdCIsInNldHRpbmdzQ29tcG9uZW50IiwiZXJyIiwiTG9nZ2VyIiwic3RhY2t0cmFjZSIsInJlZiIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiYnVpbGRMaW5rIiwid2hpY2giLCJ1cmwiLCJmb290ZXIiLCJsaW5rcyIsInNvbWUiLCJsIiwibGlua0NvbXBvbmVudHMiLCJtYXAiLCJmaWx0ZXIiLCJjIiwiY29tcCIsImkiLCJsZW5ndGgiLCJwbHVnaW5TZXR0aW5ncyIsInJlbmRlciIsImRlc2NyaXB0aW9uIiwic2hvd1JlbG9hZEljb24iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFZSxNQUFNQSxVQUFOLFNBQXlCQyw2Q0FBSyxDQUFDQyxTQUEvQixDQUF5QztBQUVwREMsYUFBVyxDQUFDQyxLQUFELEVBQVE7QUFDZixVQUFNQSxLQUFOO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQixLQUFLQSxRQUFMLENBQWNDLElBQWQsQ0FBbUIsSUFBbkIsQ0FBaEI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLEtBQUtBLFlBQUwsQ0FBa0JELElBQWxCLENBQXVCLElBQXZCLENBQXBCO0FBQ0EsU0FBS0UsS0FBTCxHQUFhO0FBQ1RDLGFBQU8sRUFBRSxLQUFLTCxLQUFMLENBQVdNLE9BRFg7QUFFVEMsa0JBQVksRUFBRTtBQUZMLEtBQWI7QUFJQSxTQUFLQyxXQUFMLEdBQW1CLE9BQU8sS0FBS1IsS0FBTCxDQUFXUyxLQUFYLENBQWlCQyxNQUFqQixDQUF3QkMsZ0JBQS9CLEtBQW9ELFVBQXZFO0FBQ0EsU0FBS0MsYUFBTCxHQUFxQixFQUFyQjtBQUNBLFNBQUtDLFFBQUwsR0FBZ0JoQiw2Q0FBSyxDQUFDaUIsU0FBTixFQUFoQjtBQUVBLFNBQUtDLE1BQUwsR0FBYyxLQUFLQSxNQUFMLENBQVliLElBQVosQ0FBaUIsSUFBakIsQ0FBZCxDQVplLENBYWY7O0FBQ0EsU0FBS2MsYUFBTCxHQUFxQixLQUFLQSxhQUFMLENBQW1CZCxJQUFuQixDQUF3QixJQUF4QixDQUFyQjtBQUNIOztBQUVEYSxRQUFNLEdBQUc7QUFDTCxRQUFJLENBQUMsS0FBS2YsS0FBTCxDQUFXZSxNQUFoQixFQUF3QjtBQUN4QixTQUFLZixLQUFMLENBQVdTLEtBQVgsR0FBbUIsS0FBS1QsS0FBTCxDQUFXZSxNQUFY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S0osUUFBbEY7QUFBNEYsVUFBSSxFQUFDO0FBQWpHLE1BREosRUFFSTtBQUFLLGVBQVMsRUFBRSxLQUFLRyxLQUFMLENBQVdDLE9BQVgsR0FBcUIsbUJBQXJCLEdBQTJDO0FBQTNELE1BRkosQ0FGSixDQUZSLENBREwsRUFXSztBQUFLLGVBQVMsRUFBQztBQUFmLE9BQXdEO0FBQUssZUFBUyxFQUFDO0FBQWYsT0FBMEM2RSxXQUExQyxDQUF4RCxDQVhMLEVBWU0sS0FBS2IsTUFaWCxDQUFQO0FBY0g7O0FBRURwRSxVQUFRLEdBQUc7QUFDUCxTQUFLMEMsUUFBTCxDQUFjO0FBQUN0QyxhQUFPLEVBQUUsQ0FBQyxLQUFLRCxLQUFMLENBQVdDO0FBQXRCLEtBQWQ7QUFDQSxTQUFLTCxLQUFMLENBQVdDLFFBQVgsSUFBdUIsS0FBS0QsS0FBTCxDQUFXQyxRQUFYLENBQW9CLEtBQUtELEtBQUwsQ0FBV1MsS0FBWCxDQUFpQlEsRUFBckMsQ0FBdkI7QUFDSDs7QUFFRGQsY0FBWSxHQUFHO0FBQ1gsUUFBSSxDQUFDLEtBQUtLLFdBQVYsRUFBdUI7QUFDdkIsU0FBS21DLFFBQUwsQ0FBYztBQUFDcEMsa0JBQVksRUFBRTtBQUFmLEtBQWQ7QUFDSDs7QUFoSW1EIiwiZmlsZSI6Ii4vc3JjL3VpL3NldHRpbmdzL3BsdWdpbmNhcmQuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1JlYWN0LCBMb2dnZXIsIFN0cmluZ3N9IGZyb20gXCJtb2R1bGVzXCI7XHJcbmltcG9ydCBDbG9zZUJ1dHRvbiBmcm9tIFwiLi4vaWNvbnMvY2xvc2VcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4uL2ljb25zL3JlbG9hZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQ2FyZCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dTZXR0aW5ncyA9IHRoaXMuc2hvd1NldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5lbmFibGVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nc09wZW46IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdHlwZW9mIHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwgPT09IFwiZnVuY3Rpb25cIjtcclxuICAgICAgICB0aGlzLnNldHRpbmdzUGFuZWwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWxvYWQgPSB0aGlzLnJlbG9hZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vIHRoaXMub25SZWxvYWQgPSB0aGlzLm9uUmVsb2FkLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jbG9zZVNldHRpbmdzID0gdGhpcy5jbG9zZVNldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5yZWxvYWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnByb3BzLmFkZG9uID0gdGhpcy5wcm9wcy5yZWxvYWQodGhpcy5wcm9wcy5hZGRvbi5pZCk7XHJcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuc2V0dGluZ3NPcGVuKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NQYW5lbCBpbnN0YW5jZW9mIE5vZGUpIHRoaXMucGFuZWxSZWYuY3VycmVudC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzUGFuZWwpO1xyXG5cclxuICAgICAgICAvLyBpZiAoIVNldHRpbmdzQ29va2llW1wiZm9yay1wcy0zXCJdKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNIaWRkZW4gPSAoY29udGFpbmVyLCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBjb25zdCBjQm90dG9tID0gY1RvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVUb3AgPSBlbGVtZW50Lm9mZnNldFRvcDtcclxuICAgICAgICAgICAgY29uc3QgZUJvdHRvbSA9IGVUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgcmV0dXJuICAoZVRvcCA8IGNUb3AgfHwgZUJvdHRvbSA+IGNCb3R0b20pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHBhbmVsID0gJCh0aGlzLnBhbmVsUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhbmVsLnBhcmVudHMoXCIuc2Nyb2xsZXItMkZLRlBHXCIpO1xyXG4gICAgICAgIGlmICghaXNIaWRkZW4oY29udGFpbmVyWzBdLCBwYW5lbFswXSkpIHJldHVybjtcclxuICAgICAgICBjb250YWluZXIuYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIHNjcm9sbFRvcDogcGFuZWwub2Zmc2V0KCkudG9wIC0gY29udGFpbmVyLm9mZnNldCgpLnRvcCArIGNvbnRhaW5lci5zY3JvbGxUb3AoKSAtIDMwXHJcbiAgICAgICAgfSwgMzAwKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdHJpbmcodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7fVxyXG5cclxuICAgIGNsb3NlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3NPcGVuOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkVGl0bGUobmFtZSwgdmVyc2lvbiwgYXV0aG9yKSB7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSBTdHJpbmdzLkFkZG9ucy50aXRsZS5zcGxpdCgvKHt7W0EtWmEtel0rfX0pLyk7XHJcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7bmFtZX19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW25hbWVJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLW5hbWVcIn0sIG5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHZlcnNpb25JbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e3ZlcnNpb259fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVt2ZXJzaW9uSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC12ZXJzaW9uXCJ9LCB2ZXJzaW9uKTtcclxuICAgICAgICBjb25zdCBhdXRob3JJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e2F1dGhvcn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW2F1dGhvckluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiYmQtYXV0aG9yXCJ9LCBhdXRob3IpO1xyXG4gICAgICAgIHJldHVybiB0aXRsZS5mbGF0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRTdHJpbmcoYWRkb24ubmFtZSk7XHJcbiAgICAgICAgdHJ5IHsgdGhpcy5zZXR0aW5nc1BhbmVsID0gYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwoKTsgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHsgTG9nZ2VyLnN0YWNrdHJhY2UoXCJQbHVnaW4gU2V0dGluZ3NcIiwgXCJVbmFibGUgdG8gZ2V0IHNldHRpbmdzIHBhbmVsIGZvciBcIiArIG5hbWUgKyBcIi5cIiwgZXJyKTsgfVxyXG5cclxuICAgICAgICBjb25zdCBwcm9wcyA9IHtpZDogYHBsdWdpbi1zZXR0aW5ncy0ke25hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IHRoaXMucGFuZWxSZWZ9O1xyXG4gICAgICAgIGlmICh0eXBlb2Yoc2V0dGluZ3NQYW5lbCkgPT0gXCJzdHJpbmdcIikgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPSB0aGlzLnNldHRpbmdzUGFuZWw7XHJcblxyXG4gICAgICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPVwic2V0dGluZ3Mtb3BlbiBiZC1zd2l0Y2gtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtY2xvc2VcIiBvbkNsaWNrPXt0aGlzLmNsb3NlU2V0dGluZ3N9PjxDbG9zZUJ1dHRvbiAvPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgey4uLnByb3BzfT57dGhpcy5zZXR0aW5nc1BhbmVsIGluc3RhbmNlb2YgUmVhY3QuQ29tcG9uZW50ID8gdGhpcy5zZXR0aW5nc1BhbmVsIDogbnVsbH08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbGk+O1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkTGluayh3aGljaCkge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMucHJvcHMuYWRkb25bd2hpY2hdO1xyXG4gICAgICAgIGlmICghdXJsKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gPGEgY2xhc3NOYW1lPVwiYmQtbGluayBiZC1saW5rLXdlYnNpdGVcIiBocmVmPXt1cmx9IHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj57U3RyaW5ncy5BZGRvbnNbd2hpY2hdfTwvYT47XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZvb3RlcigpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IFtcIndlYnNpdGVcIiwgXCJzb3VyY2VcIl07XHJcbiAgICAgICAgaWYgKCFsaW5rcy5zb21lKGwgPT4gdGhpcy5wcm9wcy5hZGRvbltsXSkgJiYgIXRoaXMuaGFzU2V0dGluZ3MpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGxpbmtDb21wb25lbnRzID0gbGlua3MubWFwKHRoaXMuYnVpbGRMaW5rLmJpbmQodGhpcykpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJkLWxpbmtzXCI+e2xpbmtDb21wb25lbnRzLm1hcCgoY29tcCwgaSkgPT4gaSA8IGxpbmtDb21wb25lbnRzLmxlbmd0aCAtIDEgPyBbY29tcCwgXCIgfCBcIl0gOiBbY29tcF0pLmZsYXQoKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMuaGFzU2V0dGluZ3MgJiYgPGJ1dHRvbiBvbkNsaWNrPXt0aGlzLnNob3dTZXR0aW5nc30gY2xhc3NOYW1lPVwiYmQtYnV0dG9uIGJkLWJ1dHRvbi1wbHVnaW4tc2V0dGluZ3NcIiBkaXNhYmxlZD17IXRoaXMuc3RhdGUuY2hlY2tlZH0+e1N0cmluZ3MuQWRkb25zLnBsdWdpblNldHRpbmdzfTwvYnV0dG9uPn1cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2V0dGluZ3NPcGVuKSByZXR1cm4gdGhpcy5zZXR0aW5nc0NvbXBvbmVudDtcclxuXHJcbiAgICAgICAgY29uc3Qge2FkZG9ufSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0U3RyaW5nKGFkZG9uLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0U3RyaW5nKGFkZG9uLmF1dGhvcik7XHJcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmdldFN0cmluZyhhZGRvbi5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnZlcnNpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gPGxpIGRhdGFOYW1lPXtuYW1lfSBkYXRhVmVyc2lvbj17dmVyc2lvbn0gY2xhc3NOYW1lPVwic2V0dGluZ3MtY2xvc2VkIGJkLXN3aXRjaC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJkLWhlYWRlci10aXRsZVwiPnt0aGlzLmJ1aWxkVGl0bGUobmFtZSwgdmVyc2lvbiwgYXV0aG9yKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWNvbnRyb2xzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMuc2hvd1JlbG9hZEljb24gJiYgPFJlbG9hZEljb24gY2xhc3NOYW1lPVwiYmQtcmVsb2FkIGJkLXJlbG9hZC1jYXJkXCIgb25DbGljaz17dGhpcy5yZWxvYWR9IC8+fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1zd2l0Y2gtd3JhcHBlciBiZC1mbGV4LWNoaWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJiZC1zd2l0Y2gtY2hlY2tib3hcIiBjaGVja2VkPXt0aGlzLnN0YXRlLmNoZWNrZWR9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSB0eXBlPVwiY2hlY2tib3hcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5zdGF0ZS5jaGVja2VkID8gXCJiZC1zd2l0Y2ggY2hlY2tlZFwiIDogXCJiZC1zd2l0Y2hcIn0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1kZXNjcmlwdGlvbi13cmFwIHNjcm9sbGVyLXdyYXAgZmFkZVwiPjxkaXYgY2xhc3NOYW1lPVwiYmQtZGVzY3JpcHRpb24gc2Nyb2xsZXJcIj57ZGVzY3JpcHRpb259PC9kaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMuZm9vdGVyfVxyXG4gICAgICAgICAgICAgICAgPC9saT47XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UgJiYgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmFkZG9uLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3NPcGVuOiB0cnVlfSk7XHJcbiAgICB9XHJcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/ui/settings/plugincard.js\n"); - -/***/ }), - /***/ "./src/ui/settings/switch.jsx": /*!************************************!*\ !*** ./src/ui/settings/switch.jsx ***! @@ -927,18 +927,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ }), -/***/ "./src/ui/settings/themecard.js": -/*!**************************************!*\ - !*** ./src/ui/settings/themecard.js ***! - \**************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ThemeCard; });\n/* harmony import */ var modules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! modules */ \"./src/modules/modules.js\");\n/* harmony import */ var _icons_reload__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/reload */ \"./src/ui/icons/reload.jsx\");\n\n // import Toasts from \"../toasts\";\n\nclass ThemeCard extends modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].Component {\n constructor(props) {\n super(props);\n this.state = {\n checked: this.props.enabled,\n reloads: 0\n };\n this.onChange = this.onChange.bind(this);\n this.reload = this.reload.bind(this);\n }\n\n reload() {\n if (!this.props.reload) return;\n this.props.addon = this.props.reload(this.props.addon.id);\n this.forceUpdate();\n }\n\n buildTitle(name, version, author) {\n const title = modules__WEBPACK_IMPORTED_MODULE_0__[\"Strings\"].Addons.title.split(/({{[A-Za-z]+}})/);\n const nameIndex = title.findIndex(s => s == \"{{name}}\");\n if (nameIndex) title[nameIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-name\"\n }, name);\n const versionIndex = title.findIndex(s => s == \"{{version}}\");\n if (nameIndex) title[versionIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-version\"\n }, version);\n const authorIndex = title.findIndex(s => s == \"{{author}}\");\n if (nameIndex) title[authorIndex] = modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-author\"\n }, author);\n return title.flat();\n }\n\n render() {\n const {\n addon\n } = this.props;\n const name = addon.name;\n const description = addon.description;\n const version = addon.version;\n const author = addon.author;\n const website = addon.website;\n const source = addon.source;\n return modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"li\", {\n \"data-name\": name,\n \"data-version\": version,\n \"className\": \"settings-closed bd-switch-item\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-header\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-header-title\"\n }, this.buildTitle(name, version, author)), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-controls\"\n }, this.props.showReloadIcon && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(_icons_reload__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n className: \"bd-reload bd-reload-card\",\n onClick: this.reload\n }), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"label\", {\n className: \"bd-switch-wrapper bd-flex-child\",\n style: {\n flex: \"0 0 auto\"\n }\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"input\", {\n checked: this.state.checked,\n onChange: this.onChange,\n className: \"bd-switch-checkbox\",\n type: \"checkbox\"\n }), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: this.state.checked ? \"bd-switch checked\" : \"bd-switch\"\n })))), modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-description-wrap scroller-wrap fade\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-description scroller\"\n }, description)), (website || source) && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"div\", {\n className: \"bd-footer\"\n }, modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"span\", {\n className: \"bd-links\"\n }, website && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"a\", {\n className: \"bd-link\",\n href: website,\n target: \"_blank\"\n }, \"Website\"), website && source && \" | \", source && modules__WEBPACK_IMPORTED_MODULE_0__[\"React\"].createElement(\"a\", {\n className: \"bd-link\",\n href: source,\n target: \"_blank\"\n }, \"Source\"))));\n }\n\n onChange() {\n this.setState({\n checked: !this.state.checked\n });\n this.props.onChange && this.props.onChange(this.props.addon.id);\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Db3JlLy4vc3JjL3VpL3NldHRpbmdzL3RoZW1lY2FyZC5qcz9jMDVjIl0sIm5hbWVzIjpbIlRoZW1lQ2FyZCIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsInN0YXRlIiwiY2hlY2tlZCIsImVuYWJsZWQiLCJyZWxvYWRzIiwib25DaGFuZ2UiLCJiaW5kIiwicmVsb2FkIiwiYWRkb24iLCJpZCIsImZvcmNlVXBkYXRlIiwiYnVpbGRUaXRsZSIsIm5hbWUiLCJ2ZXJzaW9uIiwiYXV0aG9yIiwidGl0bGUiLCJTdHJpbmdzIiwiQWRkb25zIiwic3BsaXQiLCJuYW1lSW5kZXgiLCJmaW5kSW5kZXgiLCJzIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInZlcnNpb25JbmRleCIsImF1dGhvckluZGV4IiwiZmxhdCIsInJlbmRlciIsImRlc2NyaXB0aW9uIiwid2Vic2l0ZSIsInNvdXJjZSIsInNob3dSZWxvYWRJY29uIiwiUmVsb2FkSWNvbiIsIm9uQ2xpY2siLCJzdHlsZSIsImZsZXgiLCJ0eXBlIiwiaHJlZiIsInRhcmdldCIsInNldFN0YXRlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0NBRUE7O0FBRWUsTUFBTUEsU0FBTixTQUF3QkMsNkNBQUssQ0FBQ0MsU0FBOUIsQ0FBd0M7QUFFbkRDLGFBQVcsQ0FBQ0MsS0FBRCxFQUFRO0FBQ2YsVUFBTUEsS0FBTjtBQUNBLFNBQUtDLEtBQUwsR0FBYTtBQUNUQyxhQUFPLEVBQUUsS0FBS0YsS0FBTCxDQUFXRyxPQURYO0FBRVRDLGFBQU8sRUFBRTtBQUZBLEtBQWI7QUFJQSxTQUFLQyxRQUFMLEdBQWdCLEtBQUtBLFFBQUwsQ0FBY0MsSUFBZCxDQUFtQixJQUFuQixDQUFoQjtBQUNBLFNBQUtDLE1BQUwsR0FBYyxLQUFLQSxNQUFMLENBQVlELElBQVosQ0FBaUIsSUFBakIsQ0FBZDtBQUNIOztBQUVEQyxRQUFNLEdBQUc7QUFDTCxR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QUFYLElBQXFCLEtBRnpCLEVBR0lBLE1BQU0sSUFBSWpDLDZDQUFLLENBQUN5QixhQUFOLENBQW9CLEdBQXBCLEVBQXlCO0FBQUNDLGVBQVMsRUFBRSxTQUFaO0FBQXVCYyxVQUFJLEVBQUVQLE1BQTdCO0FBQXFDUSxZQUFNLEVBQUU7QUFBN0MsS0FBekIsRUFBaUYsUUFBakYsQ0FIZCxDQURtQixDQWhCcEIsQ0FBUDtBQXdCSDs7QUFFRGpDLFVBQVEsR0FBRztBQUNQLFNBQUtrQyxRQUFMLENBQWM7QUFBQ3JDLGFBQU8sRUFBRSxDQUFDLEtBQUtELEtBQUwsQ0FBV0M7QUFBdEIsS0FBZDtBQUNBLFNBQUtGLEtBQUwsQ0FBV0ssUUFBWCxJQUF1QixLQUFLTCxLQUFMLENBQVdLLFFBQVgsQ0FBb0IsS0FBS0wsS0FBTCxDQUFXUSxLQUFYLENBQWlCQyxFQUFyQyxDQUF2QjtBQUNIOztBQW5Fa0QiLCJmaWxlIjoiLi9zcmMvdWkvc2V0dGluZ3MvdGhlbWVjYXJkLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZWFjdCwgU3RyaW5nc30gZnJvbSBcIm1vZHVsZXNcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4uL2ljb25zL3JlbG9hZFwiO1xyXG4vLyBpbXBvcnQgVG9hc3RzIGZyb20gXCIuLi90b2FzdHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRoZW1lQ2FyZCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5lbmFibGVkLFxyXG4gICAgICAgICAgICByZWxvYWRzOiAwXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVsb2FkID0gdGhpcy5yZWxvYWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICByZWxvYWQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLnJlbG9hZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucHJvcHMuYWRkb24gPSB0aGlzLnByb3BzLnJlbG9hZCh0aGlzLnByb3BzLmFkZG9uLmlkKTtcclxuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRUaXRsZShuYW1lLCB2ZXJzaW9uLCBhdXRob3IpIHtcclxuICAgICAgICBjb25zdCB0aXRsZSA9IFN0cmluZ3MuQWRkb25zLnRpdGxlLnNwbGl0KC8oe3tbQS1aYS16XSt9fSkvKTtcclxuICAgICAgICBjb25zdCBuYW1lSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3tuYW1lfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbbmFtZUluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiYmQtbmFtZVwifSwgbmFtZSk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7dmVyc2lvbn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW3ZlcnNpb25JbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLXZlcnNpb25cIn0sIHZlcnNpb24pO1xyXG4gICAgICAgIGNvbnN0IGF1dGhvckluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7YXV0aG9yfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbYXV0aG9ySW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1hdXRob3JcIn0sIGF1dGhvcik7XHJcbiAgICAgICAgcmV0dXJuIHRpdGxlLmZsYXQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge2FkZG9ufSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IGFkZG9uLm5hbWU7XHJcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBhZGRvbi5kZXNjcmlwdGlvbjtcclxuICAgICAgICBjb25zdCB2ZXJzaW9uID0gYWRkb24udmVyc2lvbjtcclxuICAgICAgICBjb25zdCBhdXRob3IgPSBhZGRvbi5hdXRob3I7XHJcbiAgICAgICAgY29uc3Qgd2Vic2l0ZSA9IGFkZG9uLndlYnNpdGU7XHJcbiAgICAgICAgY29uc3Qgc291cmNlID0gYWRkb24uc291cmNlO1xyXG5cclxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcImRhdGEtbmFtZVwiOiBuYW1lLCBcImRhdGEtdmVyc2lvblwiOiB2ZXJzaW9uLCBcImNsYXNzTmFtZVwiOiBcInNldHRpbmdzLWNsb3NlZCBiZC1zd2l0Y2gtaXRlbVwifSxcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLWhlYWRlci10aXRsZVwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZFRpdGxlKG5hbWUsIHZlcnNpb24sIGF1dGhvcilcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNob3dSZWxvYWRJY29uICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVsb2FkSWNvbiwge2NsYXNzTmFtZTogXCJiZC1yZWxvYWQgYmQtcmVsb2FkLWNhcmRcIiwgb25DbGljazogdGhpcy5yZWxvYWR9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIHtjbGFzc05hbWU6IFwiYmQtc3dpdGNoLXdyYXBwZXIgYmQtZmxleC1jaGlsZFwiLCBzdHlsZToge2ZsZXg6IFwiMCAwIGF1dG9cIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjbGFzc05hbWU6IFwiYmQtc3dpdGNoLWNoZWNrYm94XCIsIHR5cGU6IFwiY2hlY2tib3hcIn0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiB0aGlzLnN0YXRlLmNoZWNrZWQgPyBcImJkLXN3aXRjaCBjaGVja2VkXCIgOiBcImJkLXN3aXRjaFwifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWRlc2NyaXB0aW9uLXdyYXAgc2Nyb2xsZXItd3JhcCBmYWRlXCJ9LFxyXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWRlc2NyaXB0aW9uIHNjcm9sbGVyXCJ9LCBkZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgKHdlYnNpdGUgfHwgc291cmNlKSAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtZm9vdGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1saW5rc1wifSxcclxuICAgICAgICAgICAgICAgICAgICB3ZWJzaXRlICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtjbGFzc05hbWU6IFwiYmQtbGlua1wiLCBocmVmOiB3ZWJzaXRlLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LCBcIldlYnNpdGVcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgd2Vic2l0ZSAmJiBzb3VyY2UgJiYgXCIgfCBcIixcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2UgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge2NsYXNzTmFtZTogXCJiZC1saW5rXCIsIGhyZWY6IHNvdXJjZSwgdGFyZ2V0OiBcIl9ibGFua1wifSwgXCJTb3VyY2VcIilcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UgJiYgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmFkZG9uLmlkKTtcclxuICAgIH1cclxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/settings/themecard.js\n"); - -/***/ }), - /***/ "./src/ui/settings/title.jsx": /*!***********************************!*\ !*** ./src/ui/settings/title.jsx ***! diff --git a/src/builtins/emotes.js b/src/builtins/emotes.js index 9423c7c3..d4e2aee7 100644 --- a/src/builtins/emotes.js +++ b/src/builtins/emotes.js @@ -5,6 +5,7 @@ import {Utilities, WebpackModules, DataStore, DiscordModules, Events, Settings, import BDEmote from "../ui/emote"; import Toasts from "../ui/toasts"; // import EmoteMenu from "./emotemenu"; +const request = require("request"); const Emotes = { TwitchGlobal: {}, @@ -67,11 +68,11 @@ export default new class EmoteModule extends Builtin { async enabled() { Settings.registerCollection("emotes", "Emotes", EmoteConfig, {title: Strings.Emotes.clearEmotes, onClick: () => { this.clearEmoteData(); this.loadEmoteData(EmoteInfo); }}); // Disable emote module for now because it's annoying and slow - // await this.getBlacklist(); - // await this.loadEmoteData(EmoteInfo); + await this.getBlacklist(); + await this.loadEmoteData(EmoteInfo); - // while (!this.MessageContentComponent) await new Promise(resolve => setTimeout(resolve, 100)); - // this.patchMessageContent(); + while (!this.MessageContentComponent) await new Promise(resolve => setTimeout(resolve, 100)); + this.patchMessageContent(); Events.on("emotes-favorite-added", this.addFavorite); Events.on("emotes-favorite-removed", this.removeFavorite); } @@ -234,7 +235,10 @@ export default new class EmoteModule extends Builtin { } downloadEmotes(emoteMeta) { - const request = require("request"); + const repoFile = Utilities.repoUrl(`data/emotes/${emoteMeta.variable.toLowerCase()}.json`); + if (emoteMeta.url && !emoteMeta.backup) emoteMeta.backup = repoFile; + if (!emoteMeta.url) emoteMeta.url = repoFile; + const options = { url: emoteMeta.url, timeout: emoteMeta.timeout ? emoteMeta.timeout : 5000, @@ -244,10 +248,10 @@ export default new class EmoteModule extends Builtin { this.log(`Downloading: ${emoteMeta.variable} (${emoteMeta.url})`); return new Promise((resolve, reject) => { - request(options, (error, response, parsedData) => { + request.get(options, (error, response, parsedData) => { if (error) { this.stacktrace("Could not download " + emoteMeta.variable, error); - if (emoteMeta.backup) { + if (emoteMeta.backup || emoteMeta.url) { emoteMeta.url = emoteMeta.backup; emoteMeta.backup = null; if (emoteMeta.backupParser) emoteMeta.parser = emoteMeta.backupParser; @@ -273,8 +277,9 @@ export default new class EmoteModule extends Builtin { getBlacklist() { return new Promise(resolve => { - $.getJSON(`https://rauenzi.github.io/BetterDiscordApp/data/emotefilter.json`, function (data) { - resolve(blacklist.push(...data.blacklist)); + request.get({url: Utilities.repoUrl(`data/emotes/blacklist.json`), json: true}, (err, resp, data) => { + if (err || resp.statusCode != 200) return resolve(); + resolve(blacklist.push(...data)); }); }); } diff --git a/src/data/emotes/info.js b/src/data/emotes/info.js index baa3c1ca..240adf23 100644 --- a/src/data/emotes/info.js +++ b/src/data/emotes/info.js @@ -1,19 +1,16 @@ export default { TwitchGlobal: { url: "https://twitchemotes.com/api_cache/v3/global.json", - backup: `https://rauenzi.github.io/BetterDiscordApp/data/emotedata_twitch_global.json`, variable: "TwitchGlobal", getEmoteURL: (e) => `https://static-cdn.jtvnw.net/emoticons/v1/${e.id}/1.0`, - getOldData: (url, name) => { return {id: url.match(/\/([0-9]+)\//)[1], code: name, emoticon_set: 0, description: null}; } + getOldData: (url, name) => {return {id: url.match(/\/([0-9]+)\//)[1], code: name, emoticon_set: 0, description: null};} }, TwitchSubscriber: { - url: `https://rauenzi.github.io/BetterDiscordApp/data/emotedata_twitch_subscriber.json`, variable: "TwitchSubscriber", getEmoteURL: (e) => `https://static-cdn.jtvnw.net/emoticons/v1/${e}/1.0`, getOldData: (url) => url.match(/\/([0-9]+)\//)[1] }, FrankerFaceZ: { - url: `https://rauenzi.github.io/BetterDiscordApp/data/emotedata_ffz.json`, variable: "FrankerFaceZ", getEmoteURL: (e) => `https://cdn.frankerfacez.com/emoticon/${e}/1`, getOldData: (url) => url.match(/\/([0-9]+)\//)[1] @@ -33,7 +30,6 @@ export default { getOldData: (url) => url }, BTTV2: { - url: `https://rauenzi.github.io/BetterDiscordApp/data/emotedata_bttv.json`, variable: "BTTV2", oldVariable: "emotesBTTV2", getEmoteURL: (e) => `https://cdn.betterttv.net/emote/${e}/1x`, diff --git a/src/data/strings.js b/src/data/strings.js index de0c15d2..2bebf08c 100644 --- a/src/data/strings.js +++ b/src/data/strings.js @@ -168,7 +168,7 @@ export default { title: "{{name}} v{{version}} by {{author}}", openFolder: "Open {{type}} Folder", reload: "Reload", - pluginSettings: "Settings", + addonSettings: "Settings", website: "Website", source: "Source", server: "Support Server", diff --git a/src/modules/datastore.js b/src/modules/datastore.js index 2a4f4da2..6ad5d558 100644 --- a/src/modules/datastore.js +++ b/src/modules/datastore.js @@ -17,44 +17,31 @@ export default new class DataStore { constructor() { this.data = {misc: {}}; this.pluginData = {}; + this.localeHashes = {}; } initialize() { if (!fs.existsSync(this.baseFolder)) fs.mkdirSync(this.baseFolder); if (!fs.existsSync(this.dataFolder)) fs.mkdirSync(this.dataFolder); if (!fs.existsSync(this.localeFolder)) fs.mkdirSync(this.localeFolder); + if (!fs.existsSync(this.localeCache)) fs.writeFileSync(this.localeCache, JSON.stringify({})); if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data.misc, null, 4)); if (!fs.existsSync(this.customCSS)) fs.writeFileSync(this.customCSS, ""); const dataFiles = fs.readdirSync(this.dataFolder).filter(f => !fs.statSync(path.resolve(this.dataFolder, f)).isDirectory() && f.endsWith(".json")); for (const file of dataFiles) { this.data[file.split(".")[0]] = __non_webpack_require__(path.resolve(this.dataFolder, file)); } - // this.data = __non_webpack_require__(this.BDFile); - // if (data.hasOwnProperty("settings")) this.data = data; - // if (!fs.existsSync(this.settingsFile)) return; - // let settings = __non_webpack_require__(this.settingsFile); - // fs.unlinkSync(this.settingsFile); - // if (settings.hasOwnProperty("settings")) settings = Object.assign({stable: {}, canary: {}, ptb: {}}, {[releaseChannel]: settings}); - // else settings = Object.assign({stable: {}, canary: {}, ptb: {}}, settings); - // this.setBDData("settings", settings); + this.localeHashes = JSON.parse(fs.readFileSync(this.localeCache).toString()); } get customCSS() {return this._customCSS || (this._customCSS = path.resolve(this.dataFolder, "custom.css"));} get baseFolder() {return this._baseFolder || (this._baseFolder = path.resolve(Config.dataPath, "data"));} get dataFolder() {return this._dataFolder || (this._dataFolder = path.resolve(this.baseFolder, `${releaseChannel}`));} get localeFolder() {return this._localeFolder || (this._localeFolder = path.resolve(this.baseFolder, `locales`));} + get localeCache() {return this._localeCache || (this._localeCache = path.resolve(this.localeFolder, `.cache`));} get BDFile() {return this._BDFile || (this._BDFile = path.resolve(Config.dataPath, "data", `${releaseChannel}.json`));} - // get settingsFile() {return this._settingsFile || (this._settingsFile = path.resolve(Config.dataPath, "bdsettings.json"));} getPluginFile(pluginName) {return path.resolve(Config.dataPath, "plugins", pluginName + ".config.json");} - // getSettingGroup(key) { - // return this.data.settings[key] || null; - // } - - // setSettingGroup(key, data) { - // this.data.settings[key] = data; - // fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4)); - // } _getFile(key) { if (key == "settings" || key == "plugins" || key == "themes") return path.resolve(this.dataFolder, `${key}.json`); @@ -80,6 +67,15 @@ export default new class DataStore { fs.writeFileSync(path.resolve(this.localeFolder, `${locale}.json`), JSON.stringify(strings, null, 4)); } + getLocaleHash(locale) { + return this.localeHashes[locale] || ""; + } + + saveLocaleHash(locale, hash) { + this.localeHashes[locale] = hash; + fs.writeFileSync(this.localeCache, JSON.stringify(this.localeHashes, null, 4)); + } + getData(key) { return this.data[key] || ""; } diff --git a/src/modules/localemanager.js b/src/modules/localemanager.js index 44a8bc71..03cd863a 100644 --- a/src/modules/localemanager.js +++ b/src/modules/localemanager.js @@ -15,7 +15,7 @@ export default new class LocaleManager { this.locale = ""; this.strings = {}; } - + async initialize() { await this.setLocale(this.discordLocale); Dispatcher.subscribe(DiscordConstants.ActionTypes.USER_SETTINGS_UPDATE, ({settings}) => { @@ -27,8 +27,7 @@ export default new class LocaleManager { async setLocale(newLocale) { let newStrings; if (newLocale != this.defaultLocale) { - const savedStrings = DataStore.getLocale(newLocale); - newStrings = savedStrings || await this.downloadLocale(newLocale); + newStrings = await this.getLocaleStrings(newLocale); if (!newStrings) return this.setLocale(this.defaultLocale); } else { @@ -39,16 +38,28 @@ export default new class LocaleManager { Events.emit("strings-updated"); } - downloadLocale(locale) { + async getLocaleStrings(locale) { + const hash = DataStore.getLocaleHash(locale); + if (!hash) return await this.downloadLocale(locale); + const invalid = await this.downloadLocale(locale, hash); + if (!invalid) return DataStore.getLocale(locale); + return invalid; + } + + downloadLocale(locale, hash = "") { return new Promise(resolve => { const options = { - url: `https://raw.githubusercontent.com/rauenzi/BetterDiscordApp/development/data/locales/${locale}.json`,//`https://rauenzi.github.io/BetterDiscordApp/data/locales/${discordLocale}.json`, + url: Utilities.repoUrl(`data/locales/${locale}.json`), timeout: 2000, json: true }; + if (hash) options.headers = {"If-None-Match": hash}; + console.log(options.headers); request.get(options, (err, resp, newStrings) => { - if (err || resp.statusCode !== 200) return resolve(null); - DataStore.saveLocale(locale, newStrings); + if (err || resp.statusCode !== 200) return resolve(null); + console.log(resp); + DataStore.saveLocale(locale, newStrings); + DataStore.saveLocaleHash(locale, resp.headers.etag); resolve(newStrings); }); }); diff --git a/src/modules/utilities.js b/src/modules/utilities.js index 684abff4..79123da0 100644 --- a/src/modules/utilities.js +++ b/src/modules/utilities.js @@ -1,7 +1,12 @@ +import {Config} from "data"; import Logger from "./logger"; export default class Utilities { + static repoUrl(path) { + return `https://cdn.staticaly.com/gh/${Config.repo}/BetterDiscordApp/${Config.hash}/${path}`; + } + /** * Parses a string of HTML and returns the results. If the second parameter is true, * the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}. diff --git a/src/ui/settings/addoncard.jsx b/src/ui/settings/addoncard.jsx index fb22f86f..f82ef4b0 100644 --- a/src/ui/settings/addoncard.jsx +++ b/src/ui/settings/addoncard.jsx @@ -2,22 +2,21 @@ import {React, Logger, Strings} from "modules"; import CloseButton from "../icons/close"; import ReloadIcon from "../icons/reload"; -export default class PluginCard extends React.Component { +export default class AddonCard extends React.Component { constructor(props) { super(props); - this.onChange = this.onChange.bind(this); - this.showSettings = this.showSettings.bind(this); this.state = { checked: this.props.enabled, settingsOpen: false }; - this.hasSettings = typeof this.props.addon.plugin.getSettingsPanel === "function"; + this.settingsPanel = ""; this.panelRef = React.createRef(); + this.onChange = this.onChange.bind(this); this.reload = this.reload.bind(this); - // this.onReload = this.onReload.bind(this); + this.showSettings = this.showSettings.bind(this); this.closeSettings = this.closeSettings.bind(this); } @@ -50,6 +49,16 @@ export default class PluginCard extends React.Component { getString(value) {return typeof value == "string" ? value : value.toString();} + onChange() { + this.setState({checked: !this.state.checked}); + this.props.onChange && this.props.onChange(this.props.addon.id); + } + + showSettings() { + if (!this.props.hasSettings) return; + this.setState({settingsOpen: true}); + } + closeSettings() { this.panelRef.current.innerHTML = ""; this.setState({settingsOpen: false}); @@ -69,10 +78,10 @@ export default class PluginCard extends React.Component { get settingsComponent() { const addon = this.props.addon; const name = this.getString(addon.name); - try { this.settingsPanel = addon.plugin.getSettingsPanel(); } - catch (err) { Logger.stacktrace("Plugin Settings", "Unable to get settings panel for " + name + ".", err); } + try { this.settingsPanel = this.props.getSettingsPanel(); } + catch (err) { Logger.stacktrace("Addon Settings", "Unable to get settings panel for " + name + ".", err); } - const props = {id: `plugin-settings-${name}`, className: "plugin-settings", ref: this.panelRef}; + const props = {id: `${name}-settings`, className: "addon-settings", ref: this.panelRef}; if (typeof(settingsPanel) == "string") props.dangerouslySetInnerHTML = this.settingsPanel; return
  • @@ -89,18 +98,18 @@ export default class PluginCard extends React.Component { get footer() { const links = ["website", "source"]; - if (!links.some(l => this.props.addon[l]) && !this.hasSettings) return null; + if (!links.some(l => this.props.addon[l]) && !this.props.hasSettings) return null; const linkComponents = links.map(this.buildLink.bind(this)).filter(c => c); return
    {linkComponents.map((comp, i) => i < linkComponents.length - 1 ? [comp, " | "] : [comp]).flat()} - {this.hasSettings && } + {this.props.hasSettings && }
    ; } render() { if (this.state.settingsOpen) return this.settingsComponent; - const {addon} = this.props; + const addon = this.props.addon; const name = this.getString(addon.name); const author = this.getString(addon.author); const description = this.getString(addon.description); @@ -111,7 +120,7 @@ export default class PluginCard extends React.Component { {this.buildTitle(name, version, author)}
    {this.props.showReloadIcon && } -
  • ; } - - onChange() { - this.setState({checked: !this.state.checked}); - this.props.onChange && this.props.onChange(this.props.addon.id); - } - - showSettings() { - if (!this.hasSettings) return; - this.setState({settingsOpen: true}); - } -} \ No newline at end of file +} diff --git a/src/ui/settings/addonlist.jsx b/src/ui/settings/addonlist.jsx index 29d567cb..b1f79de3 100644 --- a/src/ui/settings/addonlist.jsx +++ b/src/ui/settings/addonlist.jsx @@ -1,9 +1,8 @@ import {React, Settings, Strings} from "modules"; import SettingsTitle from "./title"; -import PluginCard from "./plugincard"; -import ThemeCard from "./themecard"; import ReloadIcon from "../icons/reload"; +import AddonCard from "./addoncard"; export default class AddonList extends React.Component { @@ -20,8 +19,9 @@ export default class AddonList extends React.Component { } />,
      {addonList.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())).map(addon => { - const CardType = addon.type ? PluginCard : ThemeCard; - return ; + const hasSettings = addon.type && typeof(addon.plugin.getSettingsPanel) === "function"; + const getSettings = hasSettings && addon.plugin.getSettingsPanel.bind(addon.plugin); + return ; })}
    ]; diff --git a/src/ui/settings/plugincard.js b/src/ui/settings/plugincard.js deleted file mode 100644 index fb22f86f..00000000 --- a/src/ui/settings/plugincard.js +++ /dev/null @@ -1,134 +0,0 @@ -import {React, Logger, Strings} from "modules"; -import CloseButton from "../icons/close"; -import ReloadIcon from "../icons/reload"; - -export default class PluginCard extends React.Component { - - constructor(props) { - super(props); - this.onChange = this.onChange.bind(this); - this.showSettings = this.showSettings.bind(this); - this.state = { - checked: this.props.enabled, - settingsOpen: false - }; - this.hasSettings = typeof this.props.addon.plugin.getSettingsPanel === "function"; - this.settingsPanel = ""; - this.panelRef = React.createRef(); - - this.reload = this.reload.bind(this); - // this.onReload = this.onReload.bind(this); - this.closeSettings = this.closeSettings.bind(this); - } - - reload() { - if (!this.props.reload) return; - this.props.addon = this.props.reload(this.props.addon.id); - this.forceUpdate(); - } - - componentDidUpdate() { - if (!this.state.settingsOpen) return; - if (this.settingsPanel instanceof Node) this.panelRef.current.appendChild(this.settingsPanel); - - // if (!SettingsCookie["fork-ps-3"]) return; - const isHidden = (container, element) => { - const cTop = container.scrollTop; - const cBottom = cTop + container.clientHeight; - const eTop = element.offsetTop; - const eBottom = eTop + element.clientHeight; - return (eTop < cTop || eBottom > cBottom); - }; - - const panel = $(this.panelRef.current); - const container = panel.parents(".scroller-2FKFPG"); - if (!isHidden(container[0], panel[0])) return; - container.animate({ - scrollTop: panel.offset().top - container.offset().top + container.scrollTop() - 30 - }, 300); - } - - getString(value) {return typeof value == "string" ? value : value.toString();} - - closeSettings() { - this.panelRef.current.innerHTML = ""; - this.setState({settingsOpen: false}); - } - - buildTitle(name, version, author) { - const title = Strings.Addons.title.split(/({{[A-Za-z]+}})/); - const nameIndex = title.findIndex(s => s == "{{name}}"); - if (nameIndex) title[nameIndex] = React.createElement("span", {className: "bd-name"}, name); - const versionIndex = title.findIndex(s => s == "{{version}}"); - if (nameIndex) title[versionIndex] = React.createElement("span", {className: "bd-version"}, version); - const authorIndex = title.findIndex(s => s == "{{author}}"); - if (nameIndex) title[authorIndex] = React.createElement("span", {className: "bd-author"}, author); - return title.flat(); - } - - get settingsComponent() { - const addon = this.props.addon; - const name = this.getString(addon.name); - try { this.settingsPanel = addon.plugin.getSettingsPanel(); } - catch (err) { Logger.stacktrace("Plugin Settings", "Unable to get settings panel for " + name + ".", err); } - - const props = {id: `plugin-settings-${name}`, className: "plugin-settings", ref: this.panelRef}; - if (typeof(settingsPanel) == "string") props.dangerouslySetInnerHTML = this.settingsPanel; - - return
  • -
    -
    {this.settingsPanel instanceof React.Component ? this.settingsPanel : null}
    -
  • ; - } - - buildLink(which) { - const url = this.props.addon[which]; - if (!url) return null; - return {Strings.Addons[which]}; - } - - get footer() { - const links = ["website", "source"]; - if (!links.some(l => this.props.addon[l]) && !this.hasSettings) return null; - const linkComponents = links.map(this.buildLink.bind(this)).filter(c => c); - return
    - {linkComponents.map((comp, i) => i < linkComponents.length - 1 ? [comp, " | "] : [comp]).flat()} - {this.hasSettings && } -
    ; - } - - render() { - if (this.state.settingsOpen) return this.settingsComponent; - - const {addon} = this.props; - const name = this.getString(addon.name); - const author = this.getString(addon.author); - const description = this.getString(addon.description); - const version = this.getString(addon.version); - - return
  • -
    - {this.buildTitle(name, version, author)} -
    - {this.props.showReloadIcon && } -
    -
    {description}
    - {this.footer} -
  • ; - } - - onChange() { - this.setState({checked: !this.state.checked}); - this.props.onChange && this.props.onChange(this.props.addon.id); - } - - showSettings() { - if (!this.hasSettings) return; - this.setState({settingsOpen: true}); - } -} \ No newline at end of file diff --git a/src/ui/settings/themecard.js b/src/ui/settings/themecard.js deleted file mode 100644 index c98f906b..00000000 --- a/src/ui/settings/themecard.js +++ /dev/null @@ -1,73 +0,0 @@ -import {React, Strings} from "modules"; -import ReloadIcon from "../icons/reload"; -// import Toasts from "../toasts"; - -export default class ThemeCard extends React.Component { - - constructor(props) { - super(props); - this.state = { - checked: this.props.enabled, - reloads: 0 - }; - this.onChange = this.onChange.bind(this); - this.reload = this.reload.bind(this); - } - - reload() { - if (!this.props.reload) return; - this.props.addon = this.props.reload(this.props.addon.id); - this.forceUpdate(); - } - - buildTitle(name, version, author) { - const title = Strings.Addons.title.split(/({{[A-Za-z]+}})/); - const nameIndex = title.findIndex(s => s == "{{name}}"); - if (nameIndex) title[nameIndex] = React.createElement("span", {className: "bd-name"}, name); - const versionIndex = title.findIndex(s => s == "{{version}}"); - if (nameIndex) title[versionIndex] = React.createElement("span", {className: "bd-version"}, version); - const authorIndex = title.findIndex(s => s == "{{author}}"); - if (nameIndex) title[authorIndex] = React.createElement("span", {className: "bd-author"}, author); - return title.flat(); - } - - render() { - const {addon} = this.props; - const name = addon.name; - const description = addon.description; - const version = addon.version; - const author = addon.author; - const website = addon.website; - const source = addon.source; - - return React.createElement("li", {"data-name": name, "data-version": version, "className": "settings-closed bd-switch-item"}, - React.createElement("div", {className: "bd-header"}, - React.createElement("span", {className: "bd-header-title"}, - this.buildTitle(name, version, author) - ), - React.createElement("div", {className: "bd-controls"}, - this.props.showReloadIcon && React.createElement(ReloadIcon, {className: "bd-reload bd-reload-card", onClick: this.reload}), - React.createElement("label", {className: "bd-switch-wrapper bd-flex-child", style: {flex: "0 0 auto"}}, - React.createElement("input", {checked: this.state.checked, onChange: this.onChange, className: "bd-switch-checkbox", type: "checkbox"}), - React.createElement("div", {className: this.state.checked ? "bd-switch checked" : "bd-switch"}) - ) - ) - ), - React.createElement("div", {className: "bd-description-wrap scroller-wrap fade"}, - React.createElement("div", {className: "bd-description scroller"}, description) - ), - (website || source) && React.createElement("div", {className: "bd-footer"}, - React.createElement("span", {className: "bd-links"}, - website && React.createElement("a", {className: "bd-link", href: website, target: "_blank"}, "Website"), - website && source && " | ", - source && React.createElement("a", {className: "bd-link", href: source, target: "_blank"}, "Source") - ) - ) - ); - } - - onChange() { - this.setState({checked: !this.state.checked}); - this.props.onChange && this.props.onChange(this.props.addon.id); - } -} \ No newline at end of file