[
  {
    "path": "ShestakUI/Bindings.xml",
    "content": "﻿<Bindings>\n\t<Binding category=\"BINDING_HEADER_CHATKEY\" name=\"RW_MESSAGE\">\n\t\tChatKey_Chat(\"/rw\")\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_CHATKEY\" name=\"RAID_MESSAGE\">\n\t\tChatKey_Chat(\"/ra\")\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_CHATKEY\" name=\"GUILD_MESSAGE\">\n\t\tChatKey_Chat(\"/g\")\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_CHATKEY\" name=\"PARTY_MESSAGE\">\n\t\tChatKey_Chat(\"/p\")\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_CHATKEY\" name=\"IC_MESSAGE\">\n\t\tChatKey_Chat(\"/i\")\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_CHATKEY\" name=\"TARGET_MESSAGE\">\n\t\tChatKey_Chat(\"/tt \")\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_CHATKEY\" name=\"SAY_MESSAGE\">\n\t\tChatKey_Chat(\"/s\")\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_1\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 1) else SetRaidTargetIcon(\"target\", 1) end\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_2\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 2) else SetRaidTargetIcon(\"target\", 2) end\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_3\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 3) else SetRaidTargetIcon(\"target\", 3) end\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_4\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 4) else SetRaidTargetIcon(\"target\", 4) end\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_5\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 5) else SetRaidTargetIcon(\"target\", 5) end\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_6\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 6) else SetRaidTargetIcon(\"target\", 6) end\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_7\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 7) else SetRaidTargetIcon(\"target\", 7) end\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_8\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 8) else SetRaidTargetIcon(\"target\", 8) end\n\t</Binding>\n\t<Binding category=\"BINDING_HEADER_TAR_MARK_HEADER\" name=\"TAR_MARK_0\">\n\t\tif UnitExists(\"mouseover\") then SetRaidTargetIcon(\"mouseover\", 0) else SetRaidTargetIcon(\"target\", 0) end\n\t</Binding>\n\t<Binding category=\"L_MISC_HEADER_QUEST\" name= \"QUEST_BUTTON\">\n\t</Binding>\n</Bindings>"
  },
  {
    "path": "ShestakUI/Config/DataText.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tLiteStats configuration file\n--\tBACKUP THIS FILE BEFORE UPDATING!\n----------------------------------------------------------------------------------------\nlocal cBN = IsAddOnLoaded(\"cargBags_Nivaya\")\nlocal function class(string)\n\treturn format(\"|cff%02x%02x%02x%s|r\", C.media.classborder_color[1] * 255, C.media.classborder_color[2] * 255, C.media.classborder_color[3] * 255, string or \"\")\nend\n\nLPSTAT_FONT = {\n\tfont = C.font.stats_font,\t\t\t\t-- Path to your font\n\tcolor = {1, 1, 1},\t\t\t\t\t\t-- {red, green, blue} or \"CLASS\"\n\tsize = C.font.stats_font_size,\t\t\t-- Point font size\n\talpha = 1,\t\t\t\t\t\t\t\t-- Alpha transparency\n\toutline = 3,\t\t\t\t\t\t\t-- Thin outline. 0 = no outline.\n\tshadow = {alpha = C.font.stats_font_shadow and 1 or 0, x = 1, y = -1},\t-- Font shadow = 1\n}\n\nLTIPICONSIZE = 14\t\t\t\t\t\t\t-- Icon sizes in info tips\n\nLPSTAT_CONFIG = {\n-- Bottomleft block\n\tClock = {\n\t\tenabled = C.stats.clock,\t-- Local time and the 24 hour clock can be enabled in-game via time manager (right-click)\n\t\tAM = class\"A\", PM = class\"P\", colon = class\":\",\t-- These values apply to the displayed clock\n\t\tanchor_frame = \"UIParent\", anchor_to = \"left\", anchor_from = \"bottomleft\",\n\t\tx_off = 20, y_off = 11, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMLEFT\", tip_x = 21, tip_y = 20\n\t},\n\tLatency = {\n\t\tenabled = C.stats.latency,\n\t\tfmt = \"[color]%d|r\"..class\"ms\",\t-- \"77ms\", [color] inserts latency color code\n\t \tanchor_frame = \"Clock\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = C.stats.clock and 3 or 0, y_off = 0, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMLEFT\", tip_x = 21, tip_y = 20\n\t},\n\tFPS = {\n\t\tenabled = C.stats.fps,\n\t\tfmt = \"%d\"..class\"fps\",\t-- \"42fps\"\n\t\tmax_addons = nil,\t-- Holding Alt reveals hidden addons\n\t\tanchor_frame = C.stats.latency and \"Latency\" or \"Clock\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMLEFT\", tip_x = 21, tip_y = 20\n\t},\n\tFriends = {\n\t\tenabled = C.stats.friend,\n\t\tfmt = \"%d/%d\"..class\"f\",\t-- \"3/40F\"\n\t\tmaxfriends = nil,\t-- Set max friends listed, nil means no limit\n\t\tanchor_frame = C.stats.fps and \"FPS\" or C.stats.latency and \"Latency\" or \"Clock\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMLEFT\", tip_x = 21, tip_y = 20\n\t},\n\tGuild = {\n\t\tenabled = C.stats.guild,\n\t\tfmt = \"%d/%d\"..class\"g\",\t-- \"5/114G\"\n\t\tmaxguild = nil,\t-- Set max members listed, nil means no limit. Alt-key reveals hidden members\n\t\tthreshold = 1,\t-- Minimum level displayed (1-90)\n\t\tshow_xp = true,\t-- Show guild experience\n\t\tsorting = \"class\",\t-- Default roster sorting: name, level, class, zone, rank, note\n\t\tanchor_frame = C.stats.friend and \"Friends\" or C.stats.fps and \"FPS\" or C.stats.latency and \"Latency\" or \"Clock\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMLEFT\", tip_x = 21, tip_y = 20\n\t},\n\tDurability = {\n\t\tenabled = C.stats.durability,\n\t\tfmt = \"[color]%d|r%%\"..class\"d\",\t-- \"54%D\", [color] inserts durability color code\n\t\tman = true,\t-- Hide bliz durability man\n\t\tignore_inventory = false,\t-- Ignore inventory gear when auto-repairing\n\t\tgear_icons = false,\t-- Show your gear icons in the tooltip\n\t\tanchor_frame = C.stats.guild and \"Guild\" or C.stats.friend and \"Friends\" or C.stats.fps and \"FPS\" or C.stats.latency and \"Latency\" or \"Clock\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMLEFT\", tip_x = 21, tip_y = 20\n\t},\n\tExperience = {\n\t\tenabled = C.stats.experience,\n\t\t\t-- Experience & Played tags:\n\t\t\t--\tPlayer Level [level]\n\t\t\t--\tCurrent XP [curxp]\t\t\t\tMax XP [totalxp]\t\t\t\tCurrent/Max% [cur%]\n\t\t\t--\tRemaining XP [remainingxp]\t\tRemaining% [remaining%]\n\t\t\t--\tSession Gained [sessiongained]\tSession Rate [sessionrate]\t\tSession Time To Level [sessionttl]\n\t\t\t--\tLevel Rate [levelrate]\t\t\tLevel Time To Level [levelttl]\n\t\t\t--\tRested XP [rest]\t\t\t\tRested/Level% [rest%]\n\t\t\t--\tQuests To Level [questsleft]\tKills To Level [killsleft]\n\t\t\t--\tTotal Played [playedtotal]\t\tLevel Played [playedlevel]\t\tSession Played [playedsession]\n\t\txp_normal_fmt = \"[curxp]([cur%]%)\"..class\"XP\",\t-- XP string used when not rested\n\t\txp_rested_fmt = \"[curxp]([cur%]%)\"..class\"XP \"..\" [restxp]([rest%]%)\"..class\"R\",\t-- XP string used when rested\n\t\tplayed_fmt = class\"Online: \"..\"|r\"..\"[playedsession]\",\t-- Played time format\n\t\tshort = true, thousand = \"k\", million = \"m\", billion = \"b\",\t-- Short numbers (\"4.5m\" \"355.3k\")\n\t\t\t-- Faction tags:\n\t\t\t--\tFaction name [repname]\n\t\t\t--\tStanding Color Code [repcolor]\tStanding Name [standing]\n\t\t\t--\tCurrent Rep [currep]\t\t\tCurrent Rep Percent [rep%]\n\t\t\t--\tRep Left [repleft]\t\t\t\tMax. Rep [maxrep]\n\t\tfaction_fmt = \"[repname]: [repcolor][currep]/[maxrep]|r\",\n\t\tfaction_subs = {\n\t\t--\t[\"An Very Long Rep Name\"] = \"Shortened\",\n\t\t\t[\"The Wyrmrest Accord\"] = \"Wyrmrest\",\n\t\t\t[\"Knights of the Ebon Blade\"] = \"Ebon Blade\",\n\t\t\t[\"Клан Громового Молота\"] = \"Громовой Молот\",\n\t\t\t[\"Защитники Тол Барада\"] = \"Тол Барад\",\n\t\t\t[\"Гидраксианские Повелители Вод\"] = \"Повелители Вод\",\n\t\t},\n\t\tanchor_frame = C.stats.durability and \"Durability\" or C.stats.guild and \"Guild\" or C.stats.friend and \"Friends\" or C.stats.fps and \"FPS\" or C.stats.latency and \"Latency\" or \"Clock\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMLEFT\", tip_x = 21, tip_y = 20\n\t},\n\tTalents = {\n\t\tenabled = C.stats.talents,\n\t\tanchor_frame = C.stats.experience and \"Experience\" or C.stats.durability and \"Durability\" or C.stats.guild and \"Guild\" or C.stats.friend and \"Friends\" or C.stats.fps and \"FPS\" or C.stats.latency and \"Latency\" or \"Clock\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMLEFT\", tip_x = 21, tip_y = 20\n\t},\n-- Bottomright block\n\tCoords = {\n\t\tenabled = C.stats.coords,\n\t\tfmt = \"%.0f,%.0f\",\n\t\tanchor_frame = \"UIParent\", anchor_to = \"right\", anchor_from = \"bottomright\",\n\t\tx_off = -17, y_off = 11\n\t},\n\tLocation = {\n\t\tenabled = C.stats.location,\n\t\tsubzone = true,\t-- Set to false to display the main zone's name instead of the subzone\n\t\ttruncate = 0,\t-- Max number of letters for location text, set to 0 to disable\n\t\tcoord_fmt = \"%.0f,%.0f\",\n\t\tanchor_frame = \"Coords\", anchor_to = \"right\", anchor_from = \"left\",\n\t\tx_off = C.stats.coords and -3 or 0, y_off = 0, tip_frame = \"UIParent\", tip_anchor = \"BOTTOMRIGHT\", tip_x = -21, tip_y = 20\n\t},\n\tDamage = {\n\t\tenabled = C.stats.damage,\n\t\tfmt = class\"%s: \"..\"%d\",\n\t\talt_fmt = class\"%s: \"..\"%s\",\n\t\tanchor_frame = C.bag.enable and \"Location\" or \"Gold\", anchor_to = \"right\", anchor_from = \"left\",\n\t\tx_off = C.stats.coords and -3 or 0, y_off = 0\n\t},\n-- MiniMap block\n\tPing = {\n\t\tenabled = true,\n\t\tfmt = \"|cffff5555*|r %s |cffff5555*|r\",\t-- \"* PlayerName *\"\n\t\thide_self = true,\t-- Hide player's ping\n\t\tanchor_frame = \"Minimap\", anchor_to = \"bottom\", anchor_from = \"bottom\",\n\t\tx_off = 0, y_off = 25,\n\t},\n-- Bags block\n\tGold = {\n\t\tenabled = true,\n\t\tstyle = 1,\t-- Display styles: [1] 55g 21s 11c [2] 8829.4g [3] 823.55.94 [4] with texture\n\t\tanchor_frame = cBN and \"NivayacBniv_Bag\" or C.bag.enable and \"StuffingFrameBags\" or \"Location\",\n\t\tanchor_to = \"right\", anchor_from = cBN and \"bottom\" or C.bag.enable and \"topright\" or \"left\",\n\t\tx_off = cBN and 15 or C.bag.enable and -25 or -3,\n\t\ty_off = cBN and 8 or C.bag.enable and -13 or 0,\n\t\ttip_frame = cBN and \"NivayacBniv_Bag\" or C.bag.enable and \"StuffingFrameBags\" or \"UIParent\",\n\t\ttip_anchor = cBN and \"TOPRIGHT\" or C.bag.enable and \"TOPRIGHT\" or \"BOTTOMRIGHT\",\n\t\ttip_x = cBN and 0 or C.bag.enable and -50 or -21,\n\t\ttip_y = cBN and 85 or C.bag.enable and 0 or 20,\n\t\tstrata = cBN and \"DIALOG\" or \"MEDIUM\"\n\t},\n-- Top block\n\tStats = {\n\t\tenabled = C.toppanel.enable,\n\t\t\t-- Available stat tags:\n\t\t\t--\tPower [power]\t\t\tMP5 [manaregen]\n\t\t\t--\tHaste [haste]%\t\t\tCrit [crit]%\t\t\tMastery [mastery]%\t\t\tVersatility [versatility]%\n\t\t\t--\tArmor [armor]\t\t\tDodge [dodge]%\t\t\tParry [parry]%\t\t\t\tBlock [block]%\n\t\t\t--\tAvoidance [avoidance]% \tLeech [leech]%\t\t\tResilience [resilience]%\n\t\tfmt = class\"Crit: \"..\"[crit]%\"..class\"  Haste: \"..\"[haste]%\"..class\"  Mastery: \"..\"[mastery]%\"..class\"  Vers: \"..\"[versatility]%\",\n\t\tanchor_frame = \"TopPanel\", anchor_to = \"center\", anchor_from = \"center\",\n\t\tx_off = 0, y_off = 6,\n\t},\n\tStat = {\n\t\tenabled = C.toppanel.enable,\n\t\tspec1fmt = class\"Power: \"..\"[power]\",\t-- Spec #1 string\n\t\tspec2fmt = class\"Power: \"..\"[power]\",\t-- Spec #2 string\n\t\tspec3fmt = class\"Power: \"..\"[power]\",\t-- Spec #3 string\n\t\tspec4fmt = class\"Power: \"..\"[power]\",\t-- Spec #4 string\n\t\tspec5fmt = class\"Power: \"..\"[power]\",\t-- Spec #5 string\n\t\tanchor_frame = \"Stats\", anchor_to = \"topleft\", anchor_from = \"bottomleft\",\n\t\tx_off = 30, y_off = -5,\n\t},\n\tBags = {\n\t\tenabled = C.toppanel.enable,\n\t\tfmt = class\"B: \"..\"%d/%d\",\n\t\tanchor_frame = \"Stat\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0,\n\t},\n\tLoot = {\n\t\tenabled = C.toppanel.enable,\n\t\tfmt = class\"L: \"..\"%s\",\n\t\tanchor_frame = \"Bags\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0,\n\t},\n\tNameplates = {\n\t\tenabled = C.toppanel.enable,\n\t\tfmt = class\"N: \"..\"%s\",\n\t\tanchor_frame = \"Loot\", anchor_to = \"left\", anchor_from = \"right\",\n\t\tx_off = 3, y_off = 0,\n\t},\n}\n\n-- Show armor for tanks instead of power\nlocal Armor = class\"Armor: \"..\"[armor]\"\nLPSTAT_PROFILES = {\n\tDEATHKNIGHT = {\n\t\tStat = {spec1fmt = Armor}\t-- Blood\n\t},\n\tDEMONHUNTER = {\n\t\tStat = {spec2fmt = Armor}\t-- Vengeance\n\t},\n\tDRUID = {\n\t\tStat = {spec3fmt = Armor}\t-- Guardian\n\t},\n\tMONK = {\n\t\tStat = {spec1fmt = Armor}\t-- Brewmaster\n\t},\n\tPALADIN = {\n\t\tStat = {spec2fmt = Armor}\t-- Protection\n\t},\n\tWARRIOR = {\n\t\tStat = {spec3fmt = Armor}\t-- Protection\n\t},\n}"
  },
  {
    "path": "ShestakUI/Config/Filters/Announcements.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Misdirection -> http://www.wowhead.com/spell=34477\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nif C.announcements.spells == true then\n\tT.announce_spells = {\n\t\t61999,\t-- Raise Ally\n\t\t20484,\t-- Rebirth\n\t\t391054,\t-- Intercession\n\t\t20707,\t-- Soulstone\n\t\t345130,\t-- Disposable Spectrophasic Reanimator\n\t\t31821,\t-- Aura Mastery\n\t\t633,\t-- Lay on Hands\n\t\t34477,\t-- Misdirection\n\t\t57934,\t-- Tricks of the Trade\n\t\t19801,\t-- Tranquilizing Shot\n\t\t2908,\t-- Soothe\n\t}\n\n\tif #C.announcements.spells_list > 0 then\n\t\tT.announce_spells = C.announcements.spells_list\n\telse\n\t\tif C.options.announcements and C.options.announcements.spells_list then\n\t\t\tC.options.announcements.spells_list = nil\n\t\tend\n\tend\n\tT.AnnounceSpells = {}\n\tfor _, spell in pairs(T.announce_spells) do\n\t\tT.AnnounceSpells[spell] = true\n\tend\nend\n\nif C.announcements.toys == true then\n\tT.AnnounceToys = {\n\t\t[61031] = true,\t\t-- Toy Train Set\n\t\t[49844] = true,\t\t-- Direbrew's Remote\n\t}\nend\n\nif C.announcements.feasts == true then\n\tT.AnnounceFeast = {\n\t\t[382427] = true,\t-- Grand Banquet of the Kalu'a\n\t\t[371521] = true,\t-- Potion Cauldron of Power\n\t\t[371611] = true,\t-- Prepare Potion Cauldron of Ultimate Power\n\t}\n\tT.AnnounceBots = {\n\t\t[22700] = true,\t\t-- Field Repair Bot 74A\n\t\t[44389] = true,\t\t-- Field Repair Bot 110G\n\t\t[54711] = true,\t\t-- Scrapbot\n\t\t[67826] = true,\t\t-- Jeeves\n\t\t[126459] = true,\t-- Blingtron 4000\n\t\t[161414] = true,\t-- Blingtron 5000\n\t\t[298926] = true,\t-- Blingtron 7000\n\t\t[199109] = true,\t-- Auto-Hammer\n\t\t[324029] = true,\t-- Codex of the Still Mind\n\t}\nend\n\nif C.announcements.portals == true then\n\tT.AnnouncePortals = {\n\t\t-- Alliance\n\t\t[10059] = true,\t\t-- Stormwind\n\t\t[11416] = true,\t\t-- Ironforge\n\t\t[11419] = true,\t\t-- Darnassus\n\t\t[32266] = true,\t\t-- Exodar\n\t\t[49360] = true,\t\t-- Theramore\n\t\t[33691] = true,\t\t-- Shattrath\n\t\t[88345] = true,\t\t-- Tol Barad\n\t\t[132620] = true,\t-- Vale of Eternal Blossoms\n\t\t[176246] = true,\t-- Stormshield\n\t\t[281400] = true,\t-- Boralus\n\t\t-- Horde\n\t\t[11417] = true,\t\t-- Orgrimmar\n\t\t[11420] = true,\t\t-- Thunder Bluff\n\t\t[11418] = true,\t\t-- Undercity\n\t\t[32267] = true,\t\t-- Silvermoon\n\t\t[49361] = true,\t\t-- Stonard\n\t\t[35717] = true,\t\t-- Shattrath\n\t\t[88346] = true,\t\t-- Tol Barad\n\t\t[132626] = true,\t-- Vale of Eternal Blossoms\n\t\t[176244] = true,\t-- Warspear\n\t\t[281402] = true,\t-- Dazar'alor\n\t\t-- Alliance/Horde\n\t\t[53142] = true,\t\t-- Dalaran\n\t\t[120146] = true,\t-- Ancient Dalaran\n\t\t[224871] = true,\t-- Dalaran, Broken Isles\n\t\t[344597] = true,\t-- Oribos\n\t\t[395289] = true,\t-- Valdrakken\n\t}\nend\n\n\nif C.announcements.bad_gear == true then\n\tlocal badRings = {\n\t\t[40585] = true,\t\t-- Signet of the Kirin Tor\n\t\t[40586] = true,\t\t-- Band of the Kirin Tor\n\t\t[44934] = true,\t\t-- Loop of the Kirin Tor\n\t\t[44935] = true,\t\t-- Ring of the Kirin Tor\n\t\t[45688] = true,\t\t-- Inscribed Band of the Kirin Tor\n\t\t[45689] = true,\t\t-- Inscribed Loop of the Kirin Tor\n\t\t[45690] = true,\t\t-- Inscribed Ring of the Kirin Tor\n\t\t[45691] = true,\t\t-- Inscribed Signet of the Kirin Tor\n\t\t[48954] = true,\t\t-- Etched Band of the Kirin Tor\n\t\t[48955] = true,\t\t-- Etched Loop of the Kirin Tor\n\t\t[48956] = true,\t\t-- Etched Ring of the Kirin Tor\n\t\t[48957] = true,\t\t-- Etched Signet of the Kirin Tor\n\t\t[51557] = true,\t\t-- Runed Signet of the Kirin Tor\n\t\t[51558] = true,\t\t-- Runed Loop of the Kirin Tor\n\t\t[51559] = true,\t\t-- Runed Ring of the Kirin Tor\n\t\t[51560] = true,\t\t-- Runed Band of the Kirin Tor\n\t\t[95050] = true,\t\t-- Brassiest Knuckle (Horde)\n\t\t[95051] = true,\t\t-- Brassiest Knuckle (Alliance)\n\t\t[118907] = true,\t-- Pit Fighter's Punching Ring (Alliance)\n\t\t[118908] = true,\t-- Pit Fighter's Punching Ring (Horde)\n\t\t[139599] = true,\t-- Empowered Ring of the Kirin Tor (new Dalaran)\n\t\t[142469] = true,\t-- Violet Seal of the Grand Magus\n\t\t[144391] = true,\t-- Pugilist's Powerful Punching Ring (Alliance)\n\t\t[144392] = true,\t-- Pugilist's Powerful Punching Ring (Horde)\n\t\t[166559] = true,\t-- Commander's Signet of Battle\n\t\t[166560] = true,\t-- Captain's Signet of Command\n\t}\n\n\tT.AnnounceBadGear = {\n\t\t-- Head\n\t\t[1] = {\n\t\t\t[88710] = true,\t\t-- Nat's Hat\n\t\t\t[33820] = true,\t\t-- Weather-Beaten Fishing Hat\n\t\t\t[19972] = true,\t\t-- Lucky Fishing Hat\n\t\t},\n\t\t-- Neck\n\t\t[2] = {\n\t\t\t[32757] = true,\t\t-- Blessed Medallion of Karabor\n\t\t},\n\t\t-- Feet\n\t\t[8] = {\n\t\t\t[50287] = true,\t\t-- Boots of the Bay\n\t\t\t[19969] = true,\t\t-- Nat Pagle's Extreme Anglin' Boots\n\t\t},\n\t\t-- Rings\n\t\t[11] = badRings,\n\t\t[12] = badRings,\n\t\t-- Back\n\t\t[15] = {\n\t\t\t[65360] = true,\t\t-- Cloak of Coordination (Alliance)\n\t\t\t[65274] = true,\t\t-- Cloak of Coordination (Horde)\n\t\t},\n\t\t-- Main-Hand\n\t\t[16] = {\n\t\t\t[180136] = true,\t-- The Brokers Angle'r\n\t\t\t[133755] = true,\t-- Underlight Angler\n\t\t\t[44050] = true,\t\t-- Mastercraft Kalu'ak Fishing Pole\n\t\t\t[19970] = true,\t\t-- Arcanite Fishing Pole\n\t\t\t[84660] = true,\t\t-- Pandaren Fishing Pole\n\t\t\t[84661] = true,\t\t-- Dragon Fishing Pole\n\t\t\t[45992] = true,\t\t-- Jeweled Fishing Pole\n\t\t\t[45991] = true,\t\t-- Bone Fishing Pole\n\t\t\t[116826] = true,\t-- Draenic Fishing Pole\n\t\t\t[116825] = true,\t-- Savage Fishing Pole\n\t\t\t[86559] = true,\t\t-- Frying Pan\n\t\t},\n\t\t-- Off-hand\n\t\t[17] = {\n\t\t\t[86558] = true,\t\t-- Rolling Pin\n\t\t},\n\t}\nend"
  },
  {
    "path": "ShestakUI/Config/Filters/ArenaControl.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.show_arena ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Cyclone -> http://www.wowhead.com/spell=33786\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nlocal function SpellName(id)\n\tlocal name = GetSpellInfo(id)\n\tif name then\n\t\treturn name\n\telse\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(id)..\"] no longer exists! Report this to Shestak.|r\")\n\t\treturn \"Empty\"\n\tend\nend\n\nT.ArenaControl = {\n\t-- Crowd Controls\n\t-- Death Knight\n\t[SpellName(91800)] = 5,\t\t-- Gnaw (Ghoul)\n\t[SpellName(91797)] = 5,\t\t-- Monstrous Blow (Mutated Ghoul)\n\t[SpellName(108194)] = 5,\t-- Asphyxiate\n\t-- Demon Hunter\n\t[SpellName(217832)] = 5,\t-- Imprison\n\t[SpellName(211881)] = 5,\t-- Fel Eruption\n\t[SpellName(179057)] = 5,\t-- Chaos Nova\n\t[SpellName(205630)] = 5,\t-- Illidan's Grasp\n\t[SpellName(207685)] = 5,\t-- Sigil of Misery\n\t-- Druid\n\t[SpellName(33786)] = 5,\t\t-- Cyclone\n\t[SpellName(5211)] = 5,\t\t-- Mighty Bash\n\t[SpellName(22570)] = 5,\t\t-- Maim\n\t[SpellName(99)] = 5,\t\t-- Incapacitating Roar\n\t-- Evoker\n\t[SpellName(360806)] = 5,\t-- Sleep Walk\n\t-- Hunter\n\t[SpellName(3355)] = 5,\t\t-- Freezing Trap\n\t[SpellName(24394)] = 5,\t\t-- Intimidation\n\t[SpellName(213691)] = 5,\t-- Scatter Shot\n\t-- Mage\n\t[SpellName(118)] = 5,\t\t-- Polymorph\n\t[SpellName(82691)] = 5,\t\t-- Ring of Frost\n\t[SpellName(31661)] = 5,\t\t-- Dragon's Breath\n\t-- Monk\n\t[SpellName(115078)] = 5,\t-- Paralysis\n\t[SpellName(119381)] = 5,\t-- Leg Sweep\n\t[SpellName(120086)] = 5,\t-- Fists of Fury\n\t[SpellName(198909)] = 5,\t-- Song of Chi-Ji\n\t-- Paladin\n\t[SpellName(853)] = 5,\t\t-- Hammer of Justice\n\t[SpellName(20066)] = 5,\t\t-- Repentance\n\t[SpellName(105421)] = 5,\t-- Blinding Light\n\t-- Priest\n\t[SpellName(605)] = 5,\t\t-- Dominate Mind\n\t[SpellName(8122)] = 5,\t\t-- Psychic Scream\n\t[SpellName(64044)] = 5,\t\t-- Psychic Horror\n\t[SpellName(205369)] = 5,\t-- Mind Bomb\n\t[SpellName(200196)] = 5,\t-- Holy Word: Chastise\n\t[SpellName(87204)] = 5,\t\t-- Sin and Punishment\n\t-- Rogue\n\t[SpellName(6770)] = 5,\t\t-- Sap\n\t[SpellName(2094)] = 5,\t\t-- Blind\n\t[SpellName(408)] = 5,\t\t-- Kidney Shot\n\t[SpellName(1833)] = 5,\t\t-- Cheap Shot\n\t[SpellName(1776)] = 5,\t\t-- Gouge\n\t-- Shaman\n\t[SpellName(51514)] = 5,\t\t-- Hex\n\t[SpellName(118905)] = 5,\t-- Static Charge\n\t[SpellName(118345)] = 5,\t-- Pulverize (Earth Elemental)\n\t[SpellName(305485)] = 5,\t-- Lightning Lasso\n\t-- Warlock\n\t[SpellName(118699)] = 5,\t-- Fear\n\t[SpellName(30283)] = 5,\t\t-- Shadowfury\n\t[SpellName(89766)] = 5,\t\t-- Axe Toss (Felguard)\n\t[SpellName(5484)] = 5,\t\t-- Howl of Terror\n\t[SpellName(6789)] = 5,\t\t-- Mortal Coil\n\t[SpellName(6358)] = 5,\t\t-- Seduction (Succubus)\n\t[SpellName(115268)] = 5,\t-- Mesmerize (Shivarra)\n\t[SpellName(171156)] = 5,\t-- Meteor Strike (Abyssal)\n\t-- Warrior\n\t[SpellName(132169)] = 5,\t-- Storm Bolt\n\t[SpellName(132168)] = 5,\t-- Shockwave\n\t[SpellName(5246)] = 5,\t\t-- Intimidating Shout\n\t[SpellName(199085)] = 5,\t-- Warpath\n\t-- Racial\n\t[SpellName(107079)] = 5,\t-- Quaking Palm (Pandaren)\n\t[SpellName(20549)] = 5,\t\t-- War Stomp (Tauren)\n\t[SpellName(287712)] = 5,\t-- Haymaker (Kul Tiran)\n\n\t-- Silences\n\t[SpellName(47476)] = 4,\t\t-- Strangulate\n\t[SpellName(204490)] = 4,\t-- Sigil of Silence\n\t[SpellName(81261)] = 4,\t\t-- Solar Beam\n\t[SpellName(31935)] = 4,\t\t-- Avenger's Shield\n\t[SpellName(15487)] = 4,\t\t-- Silence\n\t[SpellName(1330)] = 4,\t\t-- Garrote - Silence\n\n\t-- Roots\n\t[SpellName(96294)] = 3,\t\t-- Chains of Ice\n\t[SpellName(339)] = 3,\t\t-- Entangling Roots\n\t[SpellName(102359)] = 3,\t-- Mass Entanglement\n\t[SpellName(45334)] = 3,\t\t-- Immobilized\n\t[SpellName(117526)] = 3,\t-- Binding Shot\n\t[SpellName(212638)] = 3,\t-- Tracker's Net\n\t[SpellName(190925)] = 3,\t-- Harpoon\n\t[SpellName(122)] = 3,\t\t-- Frost Nova\n\t[SpellName(198121)] = 3,\t-- Frostbite\n\t[SpellName(33395)] = 3,\t\t-- Freeze (Water Elemental)\n\t[SpellName(116706)] = 3,\t-- Disable\n\t[SpellName(64695)] = 3,\t\t-- Earthgrab\n\t[SpellName(233582)] = 3,\t-- Entrenched in Flame\n\n\t-- Immunities\n\t[SpellName(186265)] = 2,\t-- Aspect of the Turtle\n\t[SpellName(45438)] = 2,\t\t-- Ice Block\n\t[SpellName(642)] = 2,\t\t-- Divine Shield\n\t[SpellName(46924)] = 2,\t\t-- Bladestorm\n\n\t-- Buffs\n\t[SpellName(1022)] = 1,\t\t-- Blessing of Protection\n\t[SpellName(204018)] = 1,\t-- Blessing of Spellwarding\n\t[SpellName(6940)] = 1,\t\t-- Blessing of Sacrifice\n\t[SpellName(1044)] = 1,\t\t-- Blessing of Freedom\n\t[SpellName(31821)] = 1,\t\t-- Aura Mastery\n\t[SpellName(33206)] = 1,\t\t-- Pain Suppression\n\t[SpellName(8178)] = 1,\t\t-- Grounding Totem\n\n\t-- Defense abilities\n\t[SpellName(48707)] = 1,\t\t-- Anti-Magic Shell\n\t[SpellName(48792)] = 1,\t\t-- Icebound Fortitude\n\t[SpellName(31224)] = 1,\t\t-- Cloak of Shadows\n\t[SpellName(871)] = 1,\t\t-- Shield Wall\n\t[SpellName(118038)] = 1,\t-- Die by the Sword\n}"
  },
  {
    "path": "ShestakUI/Config/Filters/AutoButton.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.misc.quest_auto_button ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete item is to go at www.wowhead.com, search for a item.\n--\tExample: Seaforium Bombs -> http://www.wowhead.com/item=46847\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nT.ABItems = {\n\t-- Daily Quests\n\t[32971] = true,\t\t-- Water Bucket\n\t[38689] = true,\t\t-- Chicken Net\n\t[52507] = true,\t\t-- Stardust No.2\n\t[62829] = true,\t\t-- Magnetized Scrap Collector\n\t[63351] = true,\t\t-- Tahret Dynasty Mallet\n\t[69235] = true,\t\t-- Fang of the Wolf\n\t[69240] = true,\t\t-- Enchanted Salve\n\t[69981] = true,\t\t-- Ironforge Rations\n\t[71978] = true,\t\t-- Darkmoon Bandage\n\t[77475] = true,\t\t-- Stack of Mantras\n\t[78947] = true,\t\t-- Silken Rope\n\t[79885] = true,\t\t-- Barrel of Fireworks\n\t[80127] = true,\t\t-- Shadelight Truffle Spores\n\t[80403] = true,\t\t-- Angler's Fishing Spear\n\t[80599] = true,\t\t-- Goblin Fishing Bomb\n\t[82346] = true,\t\t-- Pot of Fire\n\t[82381] = true,\t\t-- Yak's Milk Flask\n\t[82807] = true,\t\t-- Shado-Pan Dragon Gun\n\t[83134] = true,\t\t-- Bronze Claws\n\t[84762] = true,\t\t-- Highly Explosive Yaungol Oil\n\t[85884] = true,\t\t-- Sonic Emitter\n\t[86532] = true,\t\t-- Bag of Shado-Pan Gas Bombs\n\t[87394] = true,\t\t-- Sonic Disruption Fork\n\t[87841] = true,\t\t-- Korven's Experimental Grenades\n\t[92019] = true,\t\t-- The Bilgewater Molotov\n\t[93180] = true,\t\t-- Re-Configured Remote\n\t[93668] = true,\t\t-- Saur Fetish\n\t[93751] = true,\t\t-- Blessed Torch\n\t[93761] = true,\t\t-- Arcane Emancipator\n\t[93806] = true,\t\t-- Resonance Siphon\n\t-- Seaforium\n\t[46847] = true,\t\t-- Seaforium Bombs\n\t[47030] = true,\t\t-- Huge Seaforium Bombs\n\t-- Other\n\t[45072] = true,\t\t-- Brightly Colored Egg (Noblegarden)\n\t-- Legion\n\t[118330] = true,\t-- Pile of Weapons\n\t[122100] = true,\t-- Soul Gem\n\t[127030] = true,\t-- Granny's Flare Grenades\n\t[127295] = true,\t-- Blazing Torch\n\t[128651] = true,\t-- Critter Hand Cannon\n\t[128772] = true,\t-- Branch of the Runewood\n\t[129161] = true,\t-- Stormforged Horn\n\t[129725] = true,\t-- Smoldering Torch\n\t[131931] = true,\t-- Khadgar's Wand\n\t[133756] = true,\t-- Fresh Mound of Flesh\n\t[133882] = true,\t-- Trap Rune\n\t[133897] = true,\t-- Telemancy Beacon\n\t[133925] = true,\t-- Fel Lash\n\t[133999] = true,\t-- Inert Crystal\n\t[136605] = true,\t-- Solendra's Compassion\n\t[137299] = true,\t-- Nightborne Spellblad\n\t[138146] = true,\t-- Rediant Ley Crystal\n\t[138965] = true,\t-- Wand of Siphoning\n\t[140916] = true,\t-- Satchel of Locklimb Powder\n\t[142509] = true,\t-- Withered Targeting Orb\n\t[128329] = true,\t-- Depleted Leyflame Burner\n\t[130260] = true,\t-- Thaedris' Elixir\n\t[140257] = true,\t-- Advanced Telemancy Beacon\n\t[142401] = true,\t-- Telemancy Orbs\n\t-- BfA\n\t[166905] = true,\t-- Hunting Knife\n\t[168183] = true,\t-- Rare Metal Collector\n\t[168253] = true,\t-- Fathom Hook\n\t[168482] = true,\t-- Plug the Geysers\n\t-- Shadowlands\n\t[177836] = true,\t-- Wingpierce Javelin\n\t[180280] = true,\t-- Soulforged Core\n\t[183045] = true,\t-- Korinna's Allaying Crook\n\t[180170] = true,\t-- Pulsing Animacone\n\t[180876] = true,\t-- Aqueous Material Accumulator\n\t[188697] = true,\t-- Kinematic Micro-Life Recalibrator\n}\n\nT.ABItemsIgnore = {\n\t-- [itemID] = true,\t-- Item name to ignore\n}"
  },
  {
    "path": "ShestakUI/Config/Filters/BadBuffs.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.automation.cancel_bad_buffs ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Mohawked! -> http://www.wowhead.com/spell=58493\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nlocal function SpellName(id)\n\tlocal name = GetSpellInfo(id)\n\tif name then\n\t\treturn name\n\telse\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(id)..\"] no longer exists! Report this to Shestak.|r\")\n\t\treturn \"Empty\"\n\tend\nend\n\nT.BadBuffs = {\n\t[SpellName(58493)] = true,\t-- Mohawked!\n\t[SpellName(44212)] = true,\t-- Jack-o'-Lanterned!\n\t[SpellName(61716)] = true,\t-- Rabbit Costume\n\t[SpellName(172010)] = true,\t-- Abomination Costume\n\t[SpellName(24732)] = true,\t-- Bat Costume\n\t[SpellName(172015)] = true,\t-- Geist Costume\n\t[SpellName(24735)] = true,\t-- Ghost Costume\n\t[SpellName(172008)] = true,\t-- Ghoul Costume\n\t[SpellName(24712)] = true,\t-- Leper Gnome Costume\n\t[SpellName(24710)] = true,\t-- Ninja Costume\n\t[SpellName(24709)] = true,\t-- Pirate Costume\n\t[SpellName(24723)] = true,\t-- Skeleton Costume\n\t[SpellName(172003)] = true,\t-- Slime Costume\n\t[SpellName(172020)] = true,\t-- Spider Costume\n\t[SpellName(24740)] = true,\t-- Wisp Costume\n\t[SpellName(61781)] = true,\t-- Turkey Feathers\n\t[SpellName(61734)] = true,\t-- Noblegarden Bunny\n}"
  },
  {
    "path": "ShestakUI/Config/Filters/ChannelingTicks.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.castbar_ticks ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Tranquility -> http://www.wowhead.com/spell=740\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nlocal function SpellName(id)\n\tlocal name = GetSpellInfo(id)\n\tif name then\n\t\treturn name\n\telse\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(id)..\"] no longer exists! Report this to Shestak.|r\")\n\t\treturn \"Empty\"\n\tend\nend\n\nT.CastBarTicks = {\n\t-- Druid\n\t[SpellName(740)] = 4,\t\t-- Tranquility\n\t-- Evoker\n\t[SpellName(356995)] = 3,\t-- Disintegrate\n\t-- Mage\n\t[SpellName(5143)] = 5,\t\t-- Arcane Missiles\n\t[SpellName(12051)] = 6,\t\t-- Evocation\n\t[SpellName(205021)] = 5,\t-- Ray of Frost\n\t-- Monk\n\t[SpellName(115175)] = 8,\t-- Soothing Mist\n\t[SpellName(117952)] = 4,\t-- Crackling Jade Lightning\n\t-- Priest\n\t[SpellName(15407)] = 6,\t\t-- Mind Flay\n\t[SpellName(48045)] = 6,\t\t-- Mind Sear\n\t[SpellName(47540)] = 3,\t\t-- Penance\n\t[SpellName(64843)] = 4,\t\t-- Divine Hymn\n\t[SpellName(64902)] = 5,\t\t-- Symbol of Hope (Mana Hymn)\n\t-- Warlock\n\t[SpellName(755)] = 5,\t\t-- Health Funnel\n\t[SpellName(198590)] = 5,\t-- Drain Soul\n\t[SpellName(234153)] = 5,\t-- Drain Life\n\t-- Racials\n\t[SpellName(291944)] = 6,\t-- Regeneratin (Zandalari)\n}\n\nlocal f = CreateFrame(\"Frame\")\nf:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nf:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\nf:SetScript(\"OnEvent\", function()\n\tif T.class ~= \"PRIEST\" then\n\t\tf:UnregisterAllEvents()\n\t\treturn\n\tend\n\n\t-- Penance\n\tlocal penanceTicks = IsPlayerSpell(193134) and 4 or 3\n\tT.CastBarTicks[SpellName(47540)] = penanceTicks\nend)\n"
  },
  {
    "path": "ShestakUI/Config/Filters/ChatSpam.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true or C.chat.spam ~= true then return end\n\nT.ChatSpamList = {\n\t\"золото\",\n\t\"з0л0т0\",\n\t\"з0л0то\",\n\t\"золота\",\n\t\"голд\",\n\t\"г0лд\",\n\t\"золотишко\",\n\t\"золатишко\",\n\t\"блестяшки\",\n\t\"блестяшkи\",\n\t\"блестяхи\",\n\t\"монетки\",\n\t\"м0нетки\",\n\t\"монеты\",\n\t\"visа\",\n\t\"mastercard\",\n\t\"webmoney\",\n\t\"вебмани\",\n\t\"qiwi\",\n\t\"qiwі\",\n\t\"яндекс\",\n\t\"skype\",\n\t\"skуpe\",\n\t\"skуpе\",\n\t\"скайп\",\n\t\"скаип\",\n\t\"sкайп\",\n\t\"портал\",\n\t\"анус\",\n\t\"анальное\"\n}\n\nfor word in gmatch(C.chat.spam_list, \"%S+\") do\n\ttinsert(T.ChatSpamList, word)\nend"
  },
  {
    "path": "ShestakUI/Config/Filters/CombatText.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.combattext.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Blizzard -> http://www.wowhead.com/spell=42208\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\n-- General filter outgoing healing\nif C.combattext.healing then\n\tT.healfilter = {}\n\tT.healfilter[143924] = true\t\t-- Leech\n\tT.healfilter[127802] = true\t\t-- Touch of the Grave [Undead]\nend\n\n-- General merge outgoing damage\nif C.combattext.merge_aoe_spam then\n\tT.merge = {}\n\tT.aoespam = {}\n\tT.aoespam[6603] = 3\t\t\t\t-- Auto Attack\n\tT.aoespam[195222] = 4\t\t\t-- Stormlash [Shaman]\n\tT.aoespam[259756] = 6\t\t\t-- Entropic Embrace (Void Elves)\n\tT.aoespam[321519] = 5\t\t\t-- Paralytic Poison (Covenant Night Fae)\n\tT.aoespam[344155] = 1\t\t\t-- Gluttonous Spike (Trinket)\n\tT.aoespam[356320] = 10\t\t\t-- Siphon Essence (Unholy Shard)\n\tT.aoespam[345466] = 3\t\t\t-- Liquefying Ooze (Trinket)\n\tT.aoespam[355759] = 3\t\t\t-- Frozen Heart (Trinket)\n\tT.aoespam[333526] = 3\t\t\t-- Spiked Burrs (Night Fae Soulbind)\n\tT.aoespam[355735] = 3\t\t\t-- Winds of Winter (Frost Shard)\n\tT.aoespam[355804] = 3\t\t\t-- Blood Link (Blood Shard)\n\tT.aoespam[355768] = 3\t\t\t-- Blood Link (Blood Shard)\n\tT.aoespam[355769] = 3\t\t\t-- Blood Link (Blood Shard)\n\tT.aoespam[355829] = 3\t\t\t-- Chaos Bane (Unholy Shard)\n\tT.aoespam[355605] = 3\t\t\t-- Fusion Amplification (Trinket)\n\tT.aoespam[351687] = 3\t\t\t-- Mnemonic Equipment (Maldraxxus)\n\tT.aoespam[353248] = 3\t\t\t-- Effusive Anima Accelerator\n\tT.aoespam[368651] = 3\t\t\t-- Vicious Wound\n\tT.aoespam[336463] = 5\t\t\t-- Shadowcore Oil Blast\n\tT.aoespam[353466] = 4\t\t\t-- Sadistic Glee\n\tT.aoespam[321937] = 4\t\t\t-- Phantom Fire\n\n\t-- GUI list\n\tfor _, spell in pairs(C.combattext.spells_list) do\n\t\tT.aoespam[spell[1]] = spell[2]\n\tend\nend\n\n-- Class config\nif T.class == \"DEATHKNIGHT\" then\n\tif C.combattext.merge_aoe_spam then\n\t\tT.aoespam[91778] = 0\t\t-- Sweeping Claws\n\t\tT.aoespam[207311] = 0\t\t-- Clawing Shadows\n\t\tT.aoespam[115994] = 4\t\t-- Unholy Blight\n\t\tT.aoespam[206931] = 2.5\t\t-- Blooddrinker\n\t\tT.aoespam[279303] = 1\t\t-- Frost Breath\n\t\tT.aoespam[195975] = 1\t\t-- Glacial Advance\n\t\tT.aoespam[195750] = 3\t\t-- Frozen Pulse\n\t\tT.aoespam[207150] = 0.5\t\t-- Avalanche\n\t\tT.aoespam[207230] = 0.5\t\t-- Frostscythe\n\t\tT.aoespam[194311] = 0.5\t\t-- Festering Wound\n\t\tT.aoespam[199373] = 4\t\t-- Claw (Addition Ghouls)\n\t\tT.aoespam[207267] = 0.5\t\t-- Bursting Sores\n\t\tT.aoespam[215969] = 0.5\t\t-- Epidemic\n\t\tT.merge[212739] = 215969\t-- Epidemic\n\t\tT.aoespam[196545] = 3\t\t-- Bonestorm Heal\n\t\tT.aoespam[196528] = 3\t\t-- Bonestorm\n\t\tT.aoespam[219711] = 0\t\t-- Blood Feast\n\t\tT.aoespam[196771] = 3\t\t-- Remorseless Winter\n\t\tT.aoespam[205164] = 0\t\t-- Crystalline Swords\n\t\tT.merge[205165] = 205164\t-- Crystalline Swords Off-Hand\n\t\tT.merge[237680] = 49184\t\t-- Howling Blast\n\t\tT.aoespam[205224] = 0.5\t\t-- Consumption Heal\n\t\tT.aoespam[205223] = 0.5\t\t-- Consumption\n\t\tT.aoespam[191587] = 4\t\t-- Virulent Plague\n\t\tT.aoespam[191685] = 4\t\t-- Virulent Eruption\n\t\tT.aoespam[206930] = 0.5\t\t-- Heart Strike\n\t\tT.aoespam[55095] = 3.5\t\t-- Frost Fever\n\t\tT.aoespam[55078] = 3\t\t-- Blood Plague\n\t\tT.aoespam[50842] = 0\t\t-- Blood Boil\n\t\tT.aoespam[49184] = 0.5\t\t-- Howling Blast\n\t\tT.aoespam[52212] = 3\t\t-- Death and Decay\n\t\tT.aoespam[50401] = 4\t\t-- Razorice\n\t\tT.aoespam[91776] = 3\t\t-- Claw (Ghoul)\n\t\tT.aoespam[222024] = 0\t\t-- Obliterate\n\t\tT.aoespam[222026] = 0\t\t-- Frost Strike\n\t\tT.aoespam[49998] = 0.5\t\t-- Death Strike\n\t\tT.aoespam[156000] = 3\t\t-- Defile\n\t\tT.aoespam[155166] = 3\t\t-- Mark of Sindragosa\n\t\tT.aoespam[55090] = 0\t\t-- Scourge Strike\n\t\tT.aoespam[319236] = 5\t\t-- Unholy Pact\n\t\tT.aoespam[212423] = 6\t\t-- Skulker Shot\n\t\tT.aoespam[311730] = 4\t\t-- Swarming Mist (Covenant Venthyr)\n\t\tT.aoespam[323798] = 6\t\t-- Abomination Limb (Covenant Necrolord)\n\t\tT.merge[66198] = 222024\t\t-- Obliterate Off-Hand\n\t\tT.merge[66196] = 222026\t\t-- Frost Strike Off-Hand\n\t\tT.merge[66188] = 49998\t\t-- Death Strike Off-Hand\n\t\tT.merge[70890] = 55090\t\t-- Scourge Strike (Shadow damage)\n\tend\n\tif C.combattext.healing then\n\t\tT.healfilter[206931] = true\t-- Blooddrinker\n\t\tT.healfilter[55078] = true\t-- Blood Plague\n\t\tT.healfilter[53365] = true\t-- Unholy Strength\n\t\tT.healfilter[119980] = true\t-- Conversion\n\tend\nelseif T.class == \"DEMONHUNTER\" then\n\tif C.combattext.merge_aoe_spam then\n\t\tT.aoespam[258926] = 3.5\t\t-- Fel Barrage\n\t\tT.aoespam[258921] = 0.5\t\t-- Immolation Aura\n\t\tT.aoespam[258922] = 4\t\t-- Immolation Aura Tick\n\t\tT.aoespam[258883] = 4\t\t-- Trail of Ruin\n\t\tT.aoespam[247455] = 1\t\t-- Spirit Bomb\n\t\tT.aoespam[243160] = 0\t\t-- Erupting Souls\n\t\tT.aoespam[189112] = 0\t\t-- Infernal Strike\n\t\tT.aoespam[228478] = 0\t\t-- Soul Cleave\n\t\tT.aoespam[204598] = 7\t\t-- Sigil of Flame\n\t\tT.aoespam[207771] = 7\t\t-- Fiery Brand\n\t\tT.aoespam[207407] = 4\t\t-- Soul Carver\n\t\tT.aoespam[204157] = 1\t\t-- Throw Glaive Vengeance\n\t\tT.aoespam[218677] = 1\t\t-- Spirit Bomb (Damage)\n\t\tT.aoespam[227255] = 4\t\t-- Spirit Bomb (Heal)\n\t\tT.aoespam[212105] = 3\t\t-- Fel Devastation (Damage)\n\t\tT.aoespam[212106] = 3\t\t-- Fel Devastation (Heal)\n\t\tT.aoespam[213011] = 4\t\t-- Charred Warblades (Heal)\n\t\tT.aoespam[225919] = 1\t\t-- Fracture\n\t\tT.merge[225921] = 225919\t-- Fracture Off-Hand\n\t\tT.aoespam[207693] = 6\t\t-- Feast of Souls\n\t\tT.aoespam[217070] = 0.5\t\t-- Rage of the Illidari\n\t\tT.aoespam[202388] = 1\t\t-- Inner Demons\n\t\tT.aoespam[222031] = 1.5\t\t-- Chaos Strike\n\t\tT.merge[199547] = 222031\t-- Chaos Strike Off-Hand\n\t\tT.aoespam[199552] = 2\t\t-- Blade Dance (AOE, Multi)\n\t\tT.merge[200685] = 199552\t-- Blade Dance\n\t\tT.aoespam[201789] = 4\t\t-- Fury of the Illidari\n\t\tT.merge[201628] = 201789\t-- Fury of the Illidari Off-Hand\n\t\tT.aoespam[203796] = 4\t\t-- Demon Blades\n\t\tT.aoespam[192611] = 1\t\t-- Fel Rush\n\t\tT.aoespam[198030] = 3\t\t-- Eye Beam\n\t\tT.aoespam[198813] = 0\t\t-- Vengeful Retreat\n\t\tT.aoespam[200166] = 0\t\t-- Metamorphosis\n\t\tT.aoespam[179057] = 0\t\t-- Chaos Nova\n\t\tT.aoespam[185123] = 1\t\t-- Throw Glaive Havoc\n\t\tT.aoespam[207690] = 10\t\t-- Bloodlet\n\t\tT.aoespam[202446] = 1\t\t-- Anguish\n\t\tT.aoespam[211796] = 4\t\t-- Chaos Blades\n\t\tT.merge[211797] = 211796\t-- Chaos Blades Off-Hand\n\t\tT.aoespam[227518] = 1.5\t\t-- Annihilation\n\t\tT.merge[201428] = 227518\t-- Annihilation Off-Hand\n\t\tT.aoespam[210153] = 2\t\t-- Death Sweep\n\t\tT.merge[210155] = 210153\t-- Death Sweep Off-Hand\n\t\tT.aoespam[236237] = 2\t\t-- Chaos Cleave\n\t\tT.aoespam[203794] = 2\t\t-- Consume Soul\n\t\tT.aoespam[307046] = 0\t\t-- Elysian Decree (Covenant Kyrian)\n\t\tT.aoespam[345335] = 3\t\t-- The Hunt (DoT)\n\t\tT.aoespam[345423] = 6\t\t-- The Hunt (Heal)\n\t\tT.aoespam[342857] = 3\t\t-- Glaive Tempest\n\t\tT.aoespam[346278] = 3\t\t-- Burning Wound (Legendary)\n\t\tT.aoespam[346503] = 3\t\t-- Fel Devastation\n\t\tT.aoespam[317009] = 3\t\t-- Sinful Brand (Venthyr)\n\tend\nelseif T.class == \"DRUID\" then\n\tif C.combattext.merge_aoe_spam then\n\t\t-- Healing spells\n\t\tT.aoespam[207386] = 4\t\t-- Spring Blossoms\n\t\tT.aoespam[102352] = 4\t\t-- Cenarion Ward\n\t\tT.aoespam[200389] = 4\t\t-- Cultivation\n\t\tT.aoespam[227034] = 4\t\t-- Lunar Beam Heal\n\t\tT.aoespam[22842] = 3.5\t\t-- Frenzied Regeneration\n\t\tT.aoespam[774] = 4\t\t\t-- Rejuvenation\n\t\tT.aoespam[48438] = 7\t\t-- Wild Growth\n\t\tT.aoespam[8936] = 4\t\t\t-- Regrowth\n\t\tT.aoespam[33763] = 4\t\t-- Lifebloom\n\t\tT.aoespam[157982] = 3\t\t-- Tranquility\n\t\tT.aoespam[81269] = 4\t\t-- Wild Mushroom\n\t\tT.aoespam[124988] = 3\t\t-- Nature's Vigil\n\t\tT.aoespam[155777] = 4\t\t-- Rejuvenation (Germination)\n\t\t-- Damaging spells\n\t\tT.aoespam[274838] = 2\t\t-- Feral Frenzy\n\t\tT.aoespam[202028] = 0\t\t-- Brutal Slash\n\t\tT.aoespam[211545] = 4\t\t-- Fury of Elune\n\t\tT.merge[279729] = 190984\t-- Solar Wrath\n\t\tT.aoespam[190984] = 0\t\t-- Solar Wrath\n\t\tT.aoespam[194153] = 0\t\t-- Lunar Strike\n\t\tT.aoespam[274283] = 0\t\t-- Full Moon\n\t\tT.aoespam[204069] = 4\t\t-- Lunar Beam\n\t\tT.aoespam[213709] = 5\t\t-- Brambles\n\t\tT.aoespam[213771] = 0\t\t-- Swipe\n\t\tT.aoespam[192090] = 3\t\t-- Thrash DoT\n\t\tT.aoespam[164812] = 3\t\t-- Moonfire\n\t\tT.aoespam[164815] = 3\t\t-- Sunfire\n\t\tT.aoespam[191037] = 3\t\t-- Starfall\n\t\tT.aoespam[61391] = 0\t\t-- Typhoon\n\t\tT.aoespam[155722] = 3\t\t-- Rake\n\t\tT.aoespam[33917] = 0\t\t-- Mangle\n\t\tT.aoespam[106785] = 0\t\t-- Swipe\n\t\tT.aoespam[77758] = 1\t\t-- Thrash (Bear Form)\n\t\tT.aoespam[106830] = 3\t\t-- Thrash (Cat Form)\n\t\tT.aoespam[1079] = 3\t\t\t-- Rip\n\t\tT.aoespam[124991] = 3\t\t-- Nature's Vigil\n\t\tT.aoespam[202347] = 3\t\t-- Stellar Flare\n\t\tT.aoespam[155625] = 3\t\t-- Moonfire (Cat Form)\n\t\tT.aoespam[365640] = 4\t\t-- Fury of Elune\n\tend\n\tif C.combattext.healing then\n\t\tT.healfilter[145109] = true\t-- Ysera's Gift (Self)\n\t\tT.healfilter[145110] = true\t-- Ysera's Gift\n\t\tT.healfilter[202636] = true\t-- Leader of the Pack\n\tend\nelseif T.class == \"HUNTER\" then\n\tif C.combattext.merge_aoe_spam then\n\t\tT.aoespam[217200] = 4\t\t-- Barbed Shot\n\t\tT.aoespam[270329] = 0.5\t\t-- Pheromone Bomb\n\t\tT.aoespam[270332] = 2\t\t-- Pheromone Bomb Tick\n\t\tT.aoespam[260231] = 0.5\t\t-- Violent Reaction (Pheromone Bomb Effect)\n\t\tT.aoespam[271048] = 0.5\t\t-- Volatile Bomb\n\t\tT.aoespam[271049] = 2\t\t-- Volatile Bomb Tick\n\t\tT.aoespam[270338] = 0.5\t\t-- Shrapnel Bomb\n\t\tT.aoespam[270339] = 2\t\t-- Shrapnel Bomb Tick\n\t\tT.aoespam[270343] = 4\t\t-- Internal Bleeding (Shrapnel Bomb Effect)\n\t\tT.aoespam[259396] = 2\t\t-- Chakrams\n\t\tT.merge[259398] = 259396\t-- Flanking Strike\n\t\tT.merge[267666] = 259396\t-- Flanking Strike\n\t\tT.aoespam[259516] = 0.5\t\t-- Flanking Strike\n\t\tT.merge[269752] = 259516\t-- Flanking Strike\n\t\tT.aoespam[265157] = 0.5\t\t-- Wildfire Bomb\n\t\tT.aoespam[269747] = 6\t\t-- Wildfire Bomb Tick\n\t\tT.aoespam[271788] = 3\t\t-- Serpent Sting (Marksmanship Talent)\n\t\tT.aoespam[186387] = 0\t\t-- Bursting Shot\n\t\tT.aoespam[257045] = 3.5\t\t-- Rapid Fire\n\t\tT.aoespam[257620] = 0\t\t-- Multi-Shot (Marksmanship)\n\t\tT.aoespam[2643] = 0\t\t\t-- Multi-Shot (Beast Mastery)\n\t\tT.aoespam[259491] = 3\t\t-- Serpent Sting (Survival)\n\t\tT.aoespam[13812] = 3\t\t-- Explosive Trap\n\t\tT.aoespam[212680] = 1\t\t-- Explosive Shot\n\t\tT.aoespam[118459] = 3\t\t-- Beast Cleave\n\t\tT.aoespam[120361] = 3\t\t-- Barrage\n\t\tT.aoespam[131900] = 3\t\t-- A Murder of Crows\n\t\tT.aoespam[194599] = 3\t\t-- Black Arrow\n\t\tT.aoespam[162543] = 3\t\t-- Poisoned Ammo\n\t\tT.aoespam[162541] = 3\t\t-- Incendiary Ammo\n\t\tT.aoespam[34655] = 3\t\t-- Deadly Poison (Trap)\n\t\tT.aoespam[93433] = 3\t\t-- Burrow Attack (Worm)\n\t\tT.aoespam[92380] = 3\t\t-- Froststorm Breath (Chimaera)\n\t\tT.aoespam[212436] = 0.5\t\t-- Butchery\n\t\tT.aoespam[194859] = 9\t\t-- Dragonsfire Conflagration\n\t\tT.aoespam[194858] = 9\t\t-- Dragonsfire Grenade\n\t\tT.aoespam[162487] = 6\t\t-- Steel Trap\n\t\tT.aoespam[200167] = 1.5\t\t-- Throwing Axes\n\t\tT.aoespam[187708] = 0.5\t\t-- Carve\n\t\tT.aoespam[203413] = 5\t\t-- Fury of the Eagle\n\t\tT.aoespam[203525] = 2\t\t-- Talon Strike\n\t\tT.aoespam[17253] = 6\t\t-- Bite\n\t\tT.aoespam[185855] = 6\t\t-- Lacerate\n\t\tT.aoespam[194279] = 6\t\t-- Caltrops\n\t\tT.aoespam[19434] = 1\t\t-- Trick Shot (Aimed Shot)\n\t\tT.aoespam[191070] = 1\t\t-- Call of the Hunter (Marked Shot)\n\t\tT.aoespam[191043] = 1\t\t-- Legacy of the Windrunners (Aimed Shot)\n\t\tT.aoespam[198670] = 1\t\t-- Piercing Shot\n\t\tT.aoespam[201594] = 4\t\t-- Stampede\n\t\tT.aoespam[260247] = 1\t\t-- Volley\n\t\tT.aoespam[214581] = 2\t\t-- Sidewinders\n\t\tT.aoespam[191413] = 6\t\t-- Bestial Ferocity\n\t\tT.aoespam[16827] = 6\t\t-- Claw\n\t\tT.aoespam[201754] = 1\t\t-- Stomp\n\t\tT.aoespam[63900] = 1\t\t-- Thunderstomp\n\t\tT.aoespam[197465] = 1\t\t-- Surge of the Stormgod\n\t\tT.aoespam[207097] = 4\t\t-- Titan's Thunder\n\t\tT.aoespam[269576] = 6\t\t-- Master Marksman\n\t\tT.aoespam[328837] = 0.5\t\t-- Wild Spirits (Covenant Night Fae)\n\t\tT.aoespam[328757] = 6\t\t-- Wild Spirits (Covenant Night Fae)\n\t\t-- Healing spells\n\t\tT.aoespam[199483] = 9\t\t-- Camouflage\n\t\tT.aoespam[136] = 9\t\t\t-- Mend Pet\n\t\tT.merge[214303] = 136\t\t-- Mend Pet (Hati)\n\t\tT.aoespam[197161] = 8\t\t-- Mimiron's Shell Heal\n\t\tT.aoespam[339400] = 4\t\t-- Rejuvenating Wind (Conduit)\n\tend\n\tif C.combattext.healing then\n\t\tT.healfilter[197205] = true\t-- Spirit Bond\n\tend\nelseif T.class == \"MAGE\" then\n\tif C.combattext.merge_aoe_spam then\n\t\tT.aoespam[217694] = 3.5\t\t-- Living Bomb\n\t\tT.aoespam[244813] = 3.5\t\t-- Living Bomb\n\t\tT.aoespam[44461] = 3.5\t\t-- Living Bomb (AoE)\n\t\tT.aoespam[2120] = 0\t\t\t-- Flamestrike\n\t\tT.aoespam[194432] = 0\t\t-- Aftershocks\n\t\tT.aoespam[12654] = 3\t\t-- Ignite\n\t\tT.aoespam[31661] = 0\t\t-- Dragon's Breath\n\t\tT.aoespam[190357] = 3\t\t-- Blizzard\n\t\tT.aoespam[122] = 0\t\t\t-- Frost Nova\n\t\tT.aoespam[1449] = 0\t\t\t-- Arcane Explosion\n\t\tT.aoespam[240689] = 0\t\t-- Time and Space\n\t\tT.aoespam[120] = 0\t\t\t-- Cone of Cold\n\t\tT.aoespam[114923] = 3\t\t-- Nether Tempest\n\t\tT.aoespam[114954] = 3\t\t-- Nether Tempest (AoE)\n\t\tT.aoespam[7268] = 1.6\t\t-- Arcane Missiles\n\t\tT.aoespam[84721] = 3\t\t-- Frozen Orb\n\t\tT.aoespam[228354] = 1.5\t\t-- Flurry\n\t\tT.aoespam[242851] = 1.5\t\t-- Glacial Eruption\n\t\tT.aoespam[228600] = 1\t\t-- Glacial Spike\n\t\tT.aoespam[257538] = 1\t\t-- Ebonbolt\n\t\tT.aoespam[205021] = 2\t\t-- Ray of Frost\n\t\tT.aoespam[148022] = 3\t\t-- Icicle (Mastery)\n\t\tT.aoespam[31707] = 3\t\t-- Waterbolt (Pet)\n\t\tT.aoespam[228598] = 0.5\t\t-- Ice Lance\n\t\tT.aoespam[157981] = 0\t\t-- Blast Wave\n\t\tT.aoespam[157997] = 1\t\t-- Ice Nova\n\t\tT.aoespam[157980] = 1\t\t-- Supernova\n\t\tT.aoespam[153596] = 3\t\t-- Comet Storm\n\t\tT.aoespam[153640] = 3\t\t-- Arcane Orb\n\t\tT.aoespam[157977] = 0\t\t-- Unstable Magic (Fire)\n\t\tT.aoespam[157978] = 0\t\t-- Unstable Magic (Frost)\n\t\tT.aoespam[157979] = 0\t\t-- Unstable Magic (Arcane)\n\t\tT.aoespam[153564] = 0\t\t-- Meteor\n\t\tT.aoespam[155158] = 4\t\t-- Meteor Burn\n\t\tT.aoespam[257542] = 0.6\t\t-- Phoenix's Flames\n\t\tT.aoespam[205345] = 4\t\t-- Conflagration Flare Up\n\t\tT.aoespam[226757] = 4\t\t-- Conflagration\n\t\tT.aoespam[198928] = 1.2\t\t-- Cinderstorm\n\t\tT.aoespam[194522] = 3\t\t-- Blast Furnace\n\t\tT.aoespam[194316] = 3\t\t-- Cauterizing Blink\n\t\tT.aoespam[235314] = 3\t\t-- Blazing Barrier\n\t\tT.aoespam[205472] = 4\t\t-- Flame Patch\n\t\tT.aoespam[88084] = 3\t\t-- Arcane Blast (Mirror Image)\n\t\tT.aoespam[59638] = 3\t\t-- Frostbolt (Mirror Image)\n\t\tT.aoespam[88082] = 3\t\t-- Fireball (Mirror Image)\n\t\tT.merge[211088] = 211076\t-- Mark of Aluneth\n\t\tT.aoespam[211076] = 3\t\t-- Mark of Aluneth\n\t\tT.merge[210817] = 44425\t\t-- Arcane Rebound\n\t\tT.aoespam[44425] = 1.2\t\t-- Arcane Barrage\n\t\tT.aoespam[277703] = 3\t\t-- Trailing Embers\n\t\tT.aoespam[325130] = 1.9\t\t-- Shifting Power (Covenant Night Fae)\n\tend\nelseif T.class == \"MONK\" then\n\tif C.combattext.merge_aoe_spam then\n\t\t-- Healing spells\n\t\tT.aoespam[119611] = 3\t\t-- Renewing Mist\n\t\tT.aoespam[124682] = 3\t\t-- Enveloping Mist\n\t\tT.aoespam[115175] = 3\t\t-- Soothing Mist\n\t\tT.aoespam[107270] = 3\t\t-- Spinning Crane Kick\n\t\tT.aoespam[132463] = 3\t\t-- Chi Wave\n\t\tT.aoespam[130654] = 3\t\t-- Chi Burst\n\t\tT.aoespam[124081] = 3\t\t-- Zen Pulse\n\t\tT.aoespam[116670] = 0\t\t-- Uplift\n\t\tT.aoespam[178173] = 3\t\t-- Gift of the Ox\n\t\tT.aoespam[191840] = 3\t\t-- Essence Font\n\t\tT.aoespam[162530] = 3\t\t-- Refreshing Jade Wind\n\t\t-- Damaging spells\n\t\tT.aoespam[228649] = 1\t\t-- Blackout Kick (x3)\n\t\tT.aoespam[148187] = 4\t\t-- Rushing Jade Wind\n\t\tT.aoespam[123996] = 4\t\t-- Crackling Tiger Lightning\n\t\tT.aoespam[124280] = 4\t\t-- Touch of Karma\n\t\tT.aoespam[196608] = 4\t\t-- Eye of the Tiger\n\t\tT.aoespam[117952] = 3\t\t-- Crackling Jade Lightning\n\t\tT.aoespam[117418] = 3.5\t\t-- Fists of Fury\n\t\tT.aoespam[121253] = 0\t\t-- Keg Smash\n\t\tT.aoespam[115181] = 0\t\t-- Breath of Fire\n\t\tT.aoespam[123725] = 3\t\t-- Breath of Fire (DoT)\n\t\tT.aoespam[107270] = 3\t\t-- Spinning Crane Kick\n\t\tT.aoespam[123586] = 3\t\t-- Flying Serpent Kick\n\t\tT.aoespam[132467] = 3\t\t-- Chi Wave\n\t\tT.aoespam[148135] = 3\t\t-- Chi Burst\n\t\tT.aoespam[158221] = 1\t\t-- Hurricane Strike\n\tend\n\tif C.combattext.healing then\n\t\tT.healfilter[196608] = true\t-- Eye of the Tiger\n\t\tT.healfilter[216521] = true\t-- Celestial Fortune\n\tend\nelseif T.class == \"PALADIN\" then\n\tif C.combattext.merge_aoe_spam then\n\t\t-- Healing spells\n\t\tT.aoespam[216371] = 4\t\t-- Avenging Crusader\n\t\tT.aoespam[209540] = 8\t\t-- Light of the Titans\n\t\tT.aoespam[53652] = 3\t\t-- Beacon of Light\n\t\tT.aoespam[85222] = 1\t\t-- Light of Dawn\n\t\tT.aoespam[114852] = 0\t\t-- Holy Prism\n\t\tT.aoespam[119952] = 3\t\t-- Arcing Light\n\t\tT.aoespam[183811] = 6\t\t-- Judgment of Light\n\t\tT.aoespam[225311] = 1\t\t-- Light of Dawn\n\t\tT.aoespam[377129] = 3\t\t-- Golden Path\n\t\t-- Damaging spells\n\t\tT.aoespam[53600] = 0.5\t\t-- Shield of the Righteous\n\t\tT.aoespam[184689] = 1\t\t-- Shield of Vengeance\n\t\tT.aoespam[205202] = 1\t\t-- Eye for an Eye\n\t\tT.aoespam[255937] = 1\t\t-- Wake of Ashes\n\t\tT.aoespam[198137] = 5\t\t-- Divine Hammer\n\t\tT.aoespam[81297] = 3\t\t-- Consecration\n\t\tT.aoespam[53385] = 0\t\t-- Divine Storm\n\t\tT.aoespam[88263] = 1\t\t-- Hammer of the Righteous\n\t\tT.merge[53595] = 88263\t\t-- Hammer of the Righteous\n\t\tT.aoespam[31935] = .5\t\t-- Avenger's Shield\n\t\tT.aoespam[114871] = 0\t\t-- Holy Prism\n\t\tT.aoespam[114919] = 3\t\t-- Arcing Light\n\t\tT.aoespam[86704] = 0\t\t-- Ancient Fury\n\t\tT.aoespam[157122] = 3\t\t-- Holy Shield\n\t\tT.aoespam[378286] = 1\t\t-- Tyr's Enforcer\n\t\tT.aoespam[387174] = 1\t\t-- Eye of Tyr\n\t\tT.aoespam[105421] = 1\t\t-- Blinding Light\n\t\tT.aoespam[204301] = 8\t\t-- Blessed Hammer\n\t\tT.aoespam[224239] = 1\t\t-- Divine Storm\n\t\tT.aoespam[20271] = 1\t\t-- Judgment\n\t\tT.aoespam[217020] = 1\t\t-- Zeal\n\t\tT.aoespam[286232] = 1\t\t-- Light's Decree\n\tend\nelseif T.class == \"PRIEST\" then\n\tif C.combattext.merge_aoe_spam then\n\t\t-- Healing spells\n\t\tT.aoespam[314867] = 0\t\t-- Shadow Covenant\n\t\tT.aoespam[270501] = 2.5\t\t-- Contrition\n\t\tT.merge[281469] = 270501\t-- Contrition\n\t\tT.aoespam[194509] = 0.5\t\t-- Power Word: Radiance\n\t\tT.aoespam[204883] = 1\t\t-- Circle of Healing\n\t\tT.aoespam[15290] = 4\t\t-- Vampiric Embrace\n\t\tT.aoespam[47750] = 2.5\t\t-- Penance\n\t\tT.aoespam[281265] = 0\t\t-- Holy Nova\n\t\tT.aoespam[139] = 3\t\t\t-- Renew\n\t\tT.aoespam[596] = 0\t\t\t-- Prayer of Healing\n\t\tT.aoespam[64844] = 3\t\t-- Divine Hymn\n\t\tT.aoespam[77489] = 3\t\t-- Echo of Light\n\t\tT.aoespam[33110] = 3\t\t-- Prayer of Mending\n\t\tT.aoespam[34861] = 3\t\t-- Holy Word: Sanctify\n\t\tT.aoespam[81751] = 3\t\t-- Atonement\n\t\tT.aoespam[120692] = 3\t\t-- Halo\n\t\tT.aoespam[110745] = 3\t\t-- Divine Star\n\t\tT.merge[94472] = 81751\t\t-- Atonement\n\t\t-- Damaging spells\n\t\tT.aoespam[204213] = 4\t\t-- Purge the Wicked\n\t\tT.aoespam[205386] = 0.5\t\t-- Shadow Crash\n\t\tT.aoespam[49821] = 3\t\t-- Mind Sear\n\t\tT.aoespam[263165] = 5\t\t-- Void Torrent\n\t\tT.aoespam[228361] = 1\t\t-- Void Eruption\n\t\tT.merge[228360] = 228361\t-- Void Eruption\n\t\tT.aoespam[193473] = 3\t\t-- Mind Flay (Call to the Void)\n\t\tT.aoespam[186723] = 2.5\t\t-- Penance\n\t\tT.merge[47666] = 186723\t\t-- Penance\n\t\tT.aoespam[132157] = 0\t\t-- Holy Nova\n\t\tT.aoespam[589] = 4\t\t\t-- Shadow Word: Pain\n\t\tT.aoespam[34914] = 4\t\t-- Vampiric Touch\n\t\tT.aoespam[15407] = 3\t\t-- Mind Flay\n\t\tT.aoespam[14914] = 3\t\t-- Holy Fire\n\t\tT.aoespam[120696] = 3\t\t-- Halo\n\t\tT.aoespam[122128] = 3\t\t-- Divine Star\n\t\tT.aoespam[148859] = 3\t\t-- Shadowy Apparition\n\tend\n\tif C.combattext.healing then\n\t\tT.healfilter[34914] = true\t-- Vampiric Touch\n\tend\nelseif T.class == \"ROGUE\" then\n\tif C.combattext.merge_aoe_spam then\n\t\tT.aoespam[121411] = 2.5\t\t-- Crimson Tempest\n\t\tT.aoespam[271881] = 0.5\t\t-- Blade Rush\n\t\tT.aoespam[280720] = 2\t\t-- Secret Technique\n\t\tT.merge[282449] = 280720\t-- Secret Technique\n\t\tT.aoespam[51723] = 1\t\t-- Fan of Knives\n\t\tT.aoespam[2818] = 5\t\t\t-- Deadly Poison\n\t\tT.aoespam[185311] = 3\t\t-- Crimson Vial\n\t\tT.aoespam[192380] = 1\t\t-- Poison Knives\n\t\tT.aoespam[192434] = 5\t\t-- From the Shadows\n\t\tT.aoespam[255546] = 3.5\t\t-- Poison Bomb\n\t\tT.aoespam[121473] = 4\t\t-- Shadow Blade\n\t\tT.merge[121474] = 121473\t-- Shadow Blade Off-Hand\n\t\tT.aoespam[197800] = 1\t\t-- Shadow Nova\n\t\tT.aoespam[197611] = 1\t\t-- Second Shuriken\n\t\tT.aoespam[197835] = 1\t\t-- Shuriken Storm\n\t\tT.aoespam[195452] = 3\t\t-- Nightblade\n\t\tT.aoespam[209783] = 0.5\t\t-- Goremaw's Bite\n\t\tT.merge[209784] = 209783\t-- Goremaw's Bite Off-Hand\n\t\tT.aoespam[192760] = 0.5\t\t-- Kingsbane\n\t\tT.merge[222062] = 192760\t-- Kingsbane Off-Hand\n\t\tT.aoespam[192759] = 5\t\t-- Kingsbane DoT\n\t\tT.aoespam[703] = 5\t\t\t-- Garrote\n\t\tT.aoespam[8680] = 3\t\t\t-- Wound Poison\n\t\tT.aoespam[22482] = 3\t\t-- Blade Flurry\n\t\tT.aoespam[16511] = 3\t\t-- Hemorrhage\n\t\tT.aoespam[5374] = 0\t\t\t-- Mutilate\n\t\tT.aoespam[86392] = 3\t\t-- Main Gauche\n\t\tT.aoespam[57841] = 3\t\t-- Killing Spree\n\t\tT.aoespam[1943] = 5\t\t\t-- Rupture\n\t\tT.aoespam[152150] = 3\t\t-- Death from Above\n\t\tT.aoespam[114014] = 3\t\t-- Shuriken Toss\n\t\tT.aoespam[319175] = 3\t\t-- Black Powder\n\t\tT.aoespam[279043] = 3\t\t-- Shadow Blades\n\t\tT.aoespam[315585] = 3\t\t-- Instant Poison\n\t\tT.aoespam[358126] = 3\t\t-- Banshee's Blight [Edge of Night, Dagger]\n\t\tT.merge[27576] = 5374\t\t-- Mutilate Off-Hand\n\t\tT.merge[113780] = 2818\t\t-- Deadly Poison\n\t\tT.merge[57842] = 57841\t\t-- Killing Spree Off-Hand\n\t\tT.aoespam[324073] = 3\t\t-- Serrated Bone Spike (Necrolord)\n\t\tT.merge[328547] = 324073\t-- Serrated Bone Spike (Necrolord)\n\t\tT.merge[341277] = 324073\t-- Serrated Bone Spike (Necrolord)\n\tend\nelseif T.class == \"SHAMAN\" then\n\tif C.combattext.merge_aoe_spam then\n\t\t-- Healing spells\n\t\tT.aoespam[197997] = 1\t\t-- Wellspring\n\t\tT.aoespam[73921] = 5\t\t-- Healing Rain\n\t\tT.aoespam[52042] = 5\t\t-- Healing Stream Totem\n\t\tT.aoespam[1064] = 3\t\t\t-- Chain Heal\n\t\tT.aoespam[61295] = 6\t\t-- Riptide\n\t\tT.aoespam[98021] = 3\t\t-- Spirit Link\n\t\tT.aoespam[114911] = 3\t\t-- Ancestral Guidance\n\t\tT.aoespam[114942] = 3\t\t-- Healing Tide\n\t\tT.aoespam[114083] = 3\t\t-- Restorative Mists\n\t\tT.aoespam[157503] = 1\t\t-- Cloudburst\n\t\tT.aoespam[209069] = 6\t\t-- Tidal Totem\n\t\tT.aoespam[208899] = 6\t\t-- Queen's Decree\n\t\tT.aoespam[207778] = 1\t\t-- Gift of the Queen\n\t\t-- Damaging spells\n\t\tT.aoespam[273324] = 5\t\t-- Lightning Shield\n\t\tT.aoespam[197214] = 1\t\t-- Sundering\n\t\tT.aoespam[268429] = 4.5\t\t-- Searing Assault\n\t\tT.aoespam[191726] = 4\t\t-- Lightning Blast\n\t\tT.aoespam[205533] = 7\t\t-- Volcanic Inferno\n\t\tT.aoespam[198485] = 3\t\t-- Thunder Bite\n\t\tT.aoespam[198483] = 1\t\t-- Snowstorm\n\t\tT.aoespam[224125] = 4\t\t-- Fiery Jaws\n\t\tT.aoespam[198480] = 1\t\t-- Fire Nova\n\t\tT.aoespam[199116] = 4\t\t-- Doom Vortex\n\t\tT.aoespam[188443] = 1\t\t-- Chain Lightning\n\t\tT.merge[45297] = 188443\t\t-- Chain Lightning Overload\n\t\tT.aoespam[77478] = 3\t\t-- Earhquake\n\t\tT.aoespam[51490] = 0\t\t-- Thunderstorm\n\t\tT.aoespam[8187] = 3\t\t\t-- Magma Totem\n\t\tT.aoespam[188389] = 4\t\t-- Flame Shock\n\t\tT.aoespam[25504] = 3\t\t-- Windfury Attack\n\t\tT.aoespam[10444] = 3\t\t-- Flametongue Attack\n\t\tT.aoespam[3606] = 3\t\t\t-- Searing Bolt\n\t\tT.aoespam[170379] = 3\t\t-- Molten Earth\n\t\tT.aoespam[114074] = 1\t\t-- Lava Beam\n\t\tT.aoespam[32175] = 0\t\t-- Stormstrike\n\t\tT.merge[32176] = 32175\t\t-- Stormstrike Off-Hand\n\t\tT.aoespam[114089] = 3\t\t-- Windlash\n\t\tT.merge[114093] = 114089\t-- Windlash Off-Hand\n\t\tT.aoespam[115357] = 0\t\t-- Windstrike\n\t\tT.merge[115360] = 115357\t-- Windstrike Off-Hand\n\t\tT.aoespam[192231] = 3\t\t-- Liquid Magma\n\t\tT.aoespam[157331] = 3\t\t-- Wind Gust\n\t\tT.aoespam[187874] = 1\t\t-- Crash Lightning\n\t\tT.aoespam[195592] = 1\t\t-- Crash Lightning\n\tend\nelseif T.class == \"WARLOCK\" then\n\tif C.combattext.merge_aoe_spam then\n\t\tT.aoespam[278350] = 4\t\t-- Vile Taint\n\t\tT.aoespam[196278] = 1\t\t-- Implosion\n\t\tT.aoespam[265931] = 5\t\t-- Conflagrate DoT\n\t\tT.aoespam[234153] = 5\t\t-- Drain Life\n\t\tT.aoespam[196657] = 5\t\t-- Shadow Bolt (Dimensional Rift)\n\t\tT.aoespam[187394] = 5\t\t-- Chaos Barrage (Dimensional Rift)\n\t\tT.aoespam[243050] = 5\t\t-- Searing Bolt (Dimensional Rift)\n\t\tT.aoespam[196100] = 1\t\t-- Demonic Power\n\t\tT.aoespam[196448] = 3\t\t-- Channel Demonfire\n\t\tT.aoespam[199581] = 1\t\t-- Soul Flame\n\t\tT.aoespam[29722] = 1\t\t-- Incinirate (Fire and Brimstone)\n\t\tT.aoespam[27243] = 3\t\t-- Seed of Corruption\n\t\tT.aoespam[27285] = 3\t\t-- Seed of Corruption (AoE)\n\t\tT.aoespam[146739] = 3\t\t-- Corruption\n\t\tT.aoespam[316099] = 3\t\t-- Unstable Affliction\n\t\tT.aoespam[348] = 4\t\t\t-- Immolate\n\t\tT.aoespam[980] = 3\t\t\t-- Agony\n\t\tT.aoespam[63106] = 3\t\t-- Siphon Life\n\t\tT.aoespam[205246] = 3\t\t-- Phantom Singularity\n\t\tT.merge[205179] = 205246\t-- Phantom Singularity\n\t\tT.aoespam[80240] = 3\t\t-- Havoc\n\t\tT.aoespam[42223] = 3\t\t-- Rain of Fire\n\t\tT.aoespam[198590] = 3\t\t-- Drain Soul\n\t\tT.aoespam[86040] = 3\t\t-- Hand of Gul'dan\n\t\tT.aoespam[205181] = 3\t\t-- Shadowflame\n\t\tT.aoespam[30213] = 3\t\t-- Legion Strike (Felguard)\n\t\tT.aoespam[89753] = 3\t\t-- Felstorm (Felguard)\n\t\tT.aoespam[20153] = 3\t\t-- Immolation (Infrenal)\n\t\tT.aoespam[22703] = 0\t\t-- Infernal Awakening\n\t\tT.aoespam[171017] = 0\t\t-- Meteor Strike (Infrenal)\n\t\tT.aoespam[104318] = 3\t\t-- Fel Firebolt\n\t\tT.aoespam[3110] = 3\t\t\t-- Firebolt (Imp)\n\t\tT.aoespam[152108] = 1\t\t-- Cataclysm\n\t\tT.aoespam[171018] = 1\t\t-- Meteor Strike\n\t\tT.aoespam[85692] = 3\t\t-- Doom Bolt (Doomguard)\n\t\tT.aoespam[54049] = 3\t\t-- Shadow Bite (Felhunter)\n\t\tT.aoespam[6262] = 3\t\t\t-- Healthstone\n\t\tT.aoespam[3716] = 3\t\t\t-- Torment (Voidwalker)\n\t\tT.merge[157736] = 348\t\t-- Immolate (DoT)\n\t\tT.aoespam[312321] = 4\t\t-- Scouring Tithe (Covenant Kyrian)\n\t\tT.aoespam[325640] = 3\t\t-- Soul Rot (Covenant Night Fae)\n\t\tT.aoespam[327059] = 0.5\t\t-- Decimating Bolt (Covenant Necrolord)\n\t\tT.aoespam[322167] = 2\t\t-- Impending Catastrophe (Covenant Venthyr)\n\t\tT.aoespam[322170] = 3\t\t-- Impending Catastrophe DoT (Covenant Venthyr)\n\tend\n\tif C.combattext.healing then\n\t\tT.healfilter[198590] = true\t-- Drain Soul\n\t\tT.healfilter[205246] = true\t-- Phantom Singularity\n\t\tT.healfilter[205179] = true\t-- Phantom Singularity\n\t\tT.healfilter[63106] = true\t-- Siphon Life\n\t\tT.healfilter[108359] = true\t-- Dark Regeneration\n\tend\nelseif T.class == \"WARRIOR\" then\n\tif C.combattext.merge_aoe_spam then\n\t\tT.aoespam[845] = 0.5\t\t-- Cleave (Arms)\n\t\tT.aoespam[202147] = 5\t\t-- Second Wind (Arms Talent Heal)\n\t\tT.aoespam[260643] = 0.5\t\t-- Skullsplitter (Sweeping Strikes)\n\t\tT.aoespam[167105] = 0.5\t\t-- Colossus Smash (Sweeping Strikes)\n\t\tT.aoespam[260798] = 0.5\t\t-- Execute Arms (Sweeping Strikes)\n\t\tT.aoespam[7384] = 0.5\t\t-- Overpower (Sweeping Strikes)\n\t\tT.aoespam[315961] = 0.5\t\t-- Dreadnaught (Arms Talent)\n\t\tT.aoespam[1464] = 0.5\t\t-- Slam (Sweeping Strikes)\n\t\tT.aoespam[12294] = 0.5\t\t-- Mortal Strike (Sweeping Strikes)\n\t\tT.aoespam[262115] = 3\t\t-- Deep Wounds (Arms Mastery DoT)\n\t\tT.aoespam[262161] = 1\t\t-- Warbreaker (Arms Talent)\n\t\tT.aoespam[199658] = 1.5\t\t-- Whirlwind (Arms)\n\t\tT.merge[199850] = 199658\t-- Whirlwind (Arms)\n\t\tT.aoespam[280772] = 1\t\t-- Siegebreaker (Fury Talent)\n\t\tT.aoespam[218617] = 2\t\t-- Rampage\n\t\tT.merge[184707] = 218617\t-- Rampage 2nd\n\t\tT.merge[184709] = 218617\t-- Rampage 3rd\n\t\tT.merge[201364] = 218617\t-- Rampage 4th\n\t\tT.merge[201363] = 218617\t-- Rampage 5th\n\t\tT.aoespam[199667] = 1.5\t\t-- Whirlwind (Fury)\n\t\tT.merge[44949] = 199667\t\t-- Whirlwind Off-Hand (Fury)\n\t\tT.merge[199851] = 199667\t-- Whirlwind Off-Hand (Fury)\n\t\tT.merge[199852] = 199667\t-- Whirlwind Off-Hand (Fury)\n\t\tT.aoespam[46968] = 0\t\t-- Shockwave\n\t\tT.aoespam[6343] = 0\t\t\t-- Thunder Clap\n\t\tT.aoespam[115767] = 3\t\t-- Deep Wounds\n\t\tT.aoespam[50622] = 3\t\t-- Bladestorm\n\t\tT.aoespam[52174] = 0\t\t-- Heroic Leap\n\t\tT.aoespam[118000] = 0\t\t-- Dragon Roar\n\t\tT.aoespam[96103] = 0.5\t\t-- Raging Blow\n\t\tT.aoespam[6572] = 0\t\t\t-- Revenge\n\t\tT.aoespam[280849] = 0.25\t-- Execute\n\t\tT.aoespam[772] = 3\t\t\t-- Rend\n\t\tT.aoespam[156287] = 3\t\t-- Ravager\n\t\tT.aoespam[23881] = 0\t\t-- Bloodthirst\n\t\tT.merge[85384] = 96103\t\t-- Raging Blow Off-Hand\n\t\tT.merge[95738] = 50622\t\t-- Bladestorm Off-Hand\n\t\tT.merge[163558] = 280849\t-- Execute Off-Hand\n\t\tT.aoespam[317488] = 0.5\t\t-- Condemn (Covenant Venthyr)\n\t\tT.merge[317489] = 317488\t-- Condemn Off-Hand (Fury) (Covenant Venthyr)\n\t\tT.aoespam[307871] = 2\t\t-- Spear of Bastion (Covenant Kyrian)\n\t\tT.aoespam[325886] = 0\t\t-- Ancient Aftershock (Covenant Night Fae)\n\t\tT.aoespam[326062] = 0\t\t-- Ancient Aftershock Second (Covenant Night Fae)\n\tend\n\tif C.combattext.healing then\n\t\tT.healfilter[117313] = true\t-- Bloodthirst Heal\n\tend\nend"
  },
  {
    "path": "ShestakUI/Config/Filters/Cooldowns.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Rebirth -> http://www.wowhead.com/spell=20484\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nif C.raidcooldown.enable == true then\n\tT.raid_spells = {\n\t\t-- Battle resurrection\n\t\t{20484, 600},\t-- Rebirth\n\t\t{61999, 600},\t-- Raise Ally\n\t\t{20707, 600},\t-- Soulstone\n\t\t{391054, 600},\t-- Intercession\n\t\t{345130, 600},\t-- Disposable Spectrophasic Reanimator\n\t\t-- Heroism\n\t\t{32182, 300},\t-- Heroism\n\t\t{2825, 300},\t-- Bloodlust\n\t\t{80353, 300},\t-- Time Warp\n\t\t{390386, 300},\t-- Fury of the Aspects\n\t\t{264667, 300},\t-- Primal Rage {Hunter's pet]\n\t\t-- Healing\n\t\t{633, 600},\t\t-- Lay on Hands\n\t\t{740, 180},\t\t-- Tranquility\n\t\t{115310, 180},\t-- Revival\n\t\t{64843, 180},\t-- Divine Hymn\n\t\t{108280, 180},\t-- Healing Tide Totem\n\t\t{15286, 120},\t-- Vampiric Embrace\n\t\t{108281, 120},\t-- Ancestral Guidance\n\t\t-- Defense\n\t\t{207399, 300},\t-- Ancestral Protection Totem\n\t\t{62618, 180},\t-- Power Word: Barrier\n\t\t{33206, 180},\t-- Pain Suppression\n\t\t{47788, 180},\t-- Guardian Spirit\n\t\t{31821, 180},\t-- Aura Mastery\n\t\t{98008, 180},\t-- Spirit Link Totem\n\t\t{97462, 180},\t-- Rallying Cry\n\t\t{196718, 180},\t-- Darkness\n\t\t{51052, 120},\t-- Anti-Magic Zone\n\t\t{116849, 120},\t-- Life Cocoon\n\t\t{6940, 120},\t-- Blessing of Sacrifice\n\t\t{102342, 90},\t-- Ironbark\n\t\t-- Other\n\t\t{106898, 120},\t-- Stampeding Roar\n\t\t{192077, 120},\t-- Wind Rush Totem\n\t}\n\n\tif #C.raidcooldown.spells_list > 0 then\n\t\t-- Sync spell list with new changes\n\t\tif not C.options.raidcooldown.spells_list_ver or C.options.raidcooldown.spells_list_ver < 3 then\n\t\t\ttinsert(C.raidcooldown.spells_list, {390386, 300})\n\t\t\ttinsert(C.raidcooldown.spells_list, {391054, 600})\n\t\t\tC.options.raidcooldown.spells_list_ver = 3\n\t\tend\n\t\tT.raid_spells = C.raidcooldown.spells_list\n\telse\n\t\tif C.options.raidcooldown and C.options.raidcooldown.spells_list then\n\t\t\tC.options.raidcooldown.spells_list = nil\n\t\tend\n\tend\n\tT.RaidSpells = {}\n\tfor _, spell in pairs(T.raid_spells) do\n\t\tT.RaidSpells[spell[1]] = spell[2]\n\tend\nend\n\nif C.enemycooldown.enable == true then\n\tT.enemy_spells = {\n\t\t-- Interrupts and Silences\n\t\t{57994, 12},\t-- Wind Shear\n\t\t{47528, 15},\t-- Mind Freeze\n\t\t{183752, 15},\t-- Disrupt\n\t\t{106839, 15},\t-- Skull Bash\n\t\t{187707, 15},\t-- Muzzle\n\t\t{116705, 15},\t-- Spear Hand Strike\n\t\t{96231, 15},\t-- Rebuke\n\t\t{1766, 15},\t\t-- Kick\n\t\t{6552, 15},\t\t-- Pummel\n\t\t{147362, 24},\t-- Counter Shot\n\t\t{2139, 24},\t\t-- Counterspell\n\t\t{19647, 24},\t-- Spell Lock\n\t\t{115781, 24},\t-- Optical Blast\n\t\t{351338, 40},\t-- Quell\n\t\t{15487, 45},\t-- Silence\n\t\t{47476, 60},\t-- Strangulate\n\t\t{78675, 60},\t-- Solar Beam\n\t\t-- Crowd Controls\n\t\t{20066, 15},\t-- Repentance\n\t\t{51514, 20},\t-- Hex\n\t\t{187650, 25},\t-- Freezing Trap\n\t\t{115078, 30},\t-- Paralysis\n\t\t{8122, 30},\t\t-- Psychic Scream\n\t\t{107570, 30},\t-- Storm Bolt\n\t\t{5484, 40},\t\t-- Howl of Terror\n\t\t{30283, 45},\t-- Shadowfury\n\t\t{108194, 45},\t-- Asphyxiate\n\t\t{113724, 45},\t-- Ring of Frost\n\t\t{64044, 45},\t-- Psychic Horror\n\t\t{6789, 45},\t\t-- Mortal Coil\n\t\t{119381, 50},\t-- Leg Sweep\n\t\t{853, 60},\t\t-- Hammer of Justice\n\t\t-- Defense abilities\n\t\t{48707, 60},\t-- Anti-Magic Shell\n\t\t{46924, 60},\t-- Bladestorm\n\t\t{49039, 120},\t-- Lichborne\n\t\t{31224, 120},\t-- Cloak of Shadows\n\t\t{47585, 120},\t-- Dispersion\n\t\t{1856, 120},\t-- Vanish\n\t\t{7744, 120},\t-- Will of the Forsaken (Racial)\n\t\t{186265, 180},\t-- Aspect of the Turtle\n\t\t{33206, 180},\t-- Pain Suppression\n\t}\n\n\tif #C.enemycooldown.spells_list > 0 then\n\t\t-- Sync spell list with new changes\n\t\tif not C.options.enemycooldown.spells_list_ver or C.options.enemycooldown.spells_list_ver < 2 then\n\t\t\t--BETA for i, spell in pairs(C.enemycooldown.spells_list) do\n\t\t\t\t-- if spell[1] == 51514 then\n\t\t\t\t\t-- spell[2] = 20\n\t\t\t\t-- elseif spell[1] == 187650 then\n\t\t\t\t\t-- spell[2] = 25\n\t\t\t\t-- elseif spell[1] == 115078 then\n\t\t\t\t\t-- spell[2] = 30\n\t\t\t\t-- elseif spell[1] == 49039 then\n\t\t\t\t\t-- spell[2] = 120\n\t\t\t\t-- elseif spell[1] == 31224 then\n\t\t\t\t\t-- spell[2] = 120\n\t\t\t\t-- elseif spell[1] == 213664 or spell[1] == 19386 then\n\t\t\t\t\t-- tremove(C.enemycooldown.spells_list, i)\n\t\t\t\t-- end\n\t\t\t-- end\n\n\t\t\t-- tinsert(C.enemycooldown.spells_list, {351338, 40})\n\t\t\tC.options.enemycooldown.spells_list_ver = 2\n\t\tend\n\t\tT.enemy_spells = C.enemycooldown.spells_list\n\telse\n\t\tif C.options.enemycooldown and C.options.enemycooldown.spells_list then\n\t\t\tC.options.enemycooldown.spells_list = nil\n\t\tend\n\tend\n\tT.EnemySpells = {}\n\tfor _, spell in pairs(T.enemy_spells) do\n\t\tT.EnemySpells[spell[1]] = spell[2]\n\tend\nend\n\nif C.pulsecooldown.enable == true then\n\tT.pulse_ignored_spells = {\n\t\t--GetSpellInfo(spellID),\t-- Spell name\n\t}\nend"
  },
  {
    "path": "ShestakUI/Config/Filters/Diminishing.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.show_arena ~= true or C.unitframe.plugins_diminishing ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Sap -> http://www.wowhead.com/spell=6770\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nT.DiminishingSpells = {\n\t-- Stuns\n\t[210141] = {\"stun\"},\t\t\t-- Zombie Explosion\n\t[334693] = {\"stun\"},\t\t\t-- Absolute Zero (Breath of Sindragosa)\n\t[108194] = {\"stun\"},\t\t\t-- Asphyxiate (Unholy)\n\t[221562] = {\"stun\"},\t\t\t-- Asphyxiate (Blood)\n\t[91800] = {\"stun\"},\t\t\t\t-- Gnaw (Ghoul)\n\t[91797] = {\"stun\"},\t\t\t\t-- Monstrous Blow (Mutated Ghoul)\n\t[287254] = {\"stun\"},\t\t\t-- Dead of Winter\n\t[179057] = {\"stun\"},\t\t\t-- Chaos Nova\n\t[205630] = {\"stun\"},\t\t\t-- Illidan's Grasp (Primary effect)\n\t[208618] = {\"stun\"},\t\t\t-- Illidan's Grasp (Secondary effect)\n\t[211881] = {\"stun\"},\t\t\t-- Fel Eruption\n\t[22570] = {\"stun\"},\t\t\t\t-- Maim\n\t[163505] = {\"stun\"},\t\t\t-- Rake (Prowl)\n\t[5211] = {\"stun\"},\t\t\t\t-- Mighty Bash\n\t[202244] = {\"stun\"},\t\t\t-- Overrun\n\t[325321] = {\"stun\"},\t\t\t-- Wild Hunt's Charge\n\t[24394] = {\"stun\"},\t\t\t\t-- Intimidation\n\t[119381] = {\"stun\"},\t\t\t-- Leg Sweep\n\t[202346] = {\"stun\"},\t\t\t-- Double Barrel\n\t[853] = {\"stun\"},\t\t\t\t-- Hammer of Justice\n\t[255941] = {\"stun\"},\t\t\t-- Wake of Ashes\n\t[64044] = {\"stun\"},\t\t\t\t-- Psychic Horror\n\t[200200] = {\"stun\"},\t\t\t-- Holy Word: Chastise Censure\n\t[1833] = {\"stun\"},\t\t\t\t-- Cheap Shot\n\t[408] = {\"stun\"},\t\t\t\t-- Kidney Shot\n\t[118905] = {\"stun\"},\t\t\t-- Static Charge (Capacitor Totem)\n\t[118345] = {\"stun\"},\t\t\t-- Pulverize (Primal Earth Elemental)\n\t[305485] = {\"stun\"},\t\t\t-- Lightning Lasso\n\t[30283] = {\"stun\"},\t\t\t\t-- Shadowfury\n\t[89766] = {\"stun\"},\t\t\t\t-- Axe Toss (Felguard)\n\t[171017] = {\"stun\"},\t\t\t-- Meteor Strike (Infernal)\n\t[171018] = {\"stun\"},\t\t\t-- Meteor Strike (Abyssal)\n\t[46968] = {\"stun\"},\t\t\t\t-- Shockwave\n\t[132168] = {\"stun\"},\t\t\t-- Shockwave (Protection)\n\t[132169] = {\"stun\"},\t\t\t-- Storm Bolt\n\t[199085] = {\"stun\"},\t\t\t-- Warpath\n\t[20549] = {\"stun\"},\t\t\t\t-- War Stomp (Tauren)\n\t[255723] = {\"stun\"},\t\t\t-- Bull Rush (Highmountain Tauren)\n\t[287712] = {\"stun\"},\t\t\t-- Haymaker (Kul Tiran)\n\t[332423] = {\"stun\"},\t\t\t-- Sparkling Driftglobe Core\n\n\t-- Roots\n\t[204085] = {\"root\"},\t\t\t-- Deathchill (Chains of Ice)\n\t[233395] = {\"root\"},\t\t\t-- Deathchill (Remorseless Winter)\n\t[339] = {\"root\"},\t\t\t\t-- Entangling Roots\n\t[170855] = {\"root\"},\t\t\t-- Entangling Roots (Nature's Grasp)\n\t[102359] = {\"root\"},\t\t\t-- Mass Entanglement\n\t[117526] = {\"root\"},\t\t\t-- Binding Shot\n\t[162480] = {\"root\"},\t\t\t-- Steel Trap\n\t[212638] = {\"root\"},\t\t\t-- Tracker's Net\n\t[201158] = {\"root\"},\t\t\t-- Super Sticky Tar\n\t[122] = {\"root\"},\t\t\t\t-- Frost Nova\n\t[33395] = {\"root\"},\t\t\t\t-- Freeze\n\t[198121] = {\"root\"},\t\t\t-- Frostbite\n\t[233582] = {\"root\"},\t\t\t-- Entrenched in Flame\n\t[116706] = {\"root\"},\t\t\t-- Disable\n\t[324382] = {\"root\"},\t\t\t-- Clash\n\t[64695] = {\"root\"},\t\t\t\t-- Earthgrab (Totem effect)\n\t[285515] = {\"root\"},\t\t\t-- Surge of Power\n\n\t-- Incapacitates\n\t[217832] = {\"incapacitate\"},\t-- Imprison\n\t[221527] = {\"incapacitate\"},\t-- Imprison (Honor talent)\n\t[2637] = {\"incapacitate\"},\t\t-- Hibernate\n\t[99] = {\"incapacitate\"},\t\t-- Incapacitating Roar\n\t[3355] = {\"incapacitate\"},\t\t-- Freezing Trap\n\t[203337] = {\"incapacitate\"},\t-- Freezing Trap (Honor talent)\n\t[209790] = {\"incapacitate\"},\t-- Freezing Arrow\n\t[213691] = {\"incapacitate\"},\t-- Scatter Shot\n\t[118] = {\"incapacitate\"},\t\t-- Polymorph\n\t[28271] = {\"incapacitate\"},\t\t-- Polymorph (Turtle)\n\t[28272] = {\"incapacitate\"},\t\t-- Polymorph (Pig)\n\t[61025] = {\"incapacitate\"},\t\t-- Polymorph (Snake)\n\t[61305] = {\"incapacitate\"},\t\t-- Polymorph (Black Cat)\n\t[61721] = {\"incapacitate\"},\t\t-- Polymorph (Rabbit)\n\t[61780] = {\"incapacitate\"},\t\t-- Polymorph (Turkey)\n\t[126819] = {\"incapacitate\"},\t-- Polymorph (Porcupine)\n\t[161353] = {\"incapacitate\"},\t-- Polymorph (Polar Bear Cub)\n\t[161354] = {\"incapacitate\"},\t-- Polymorph (Monkey)\n\t[161355] = {\"incapacitate\"},\t-- Polymorph (Penguin)\n\t[161372] = {\"incapacitate\"},\t-- Polymorph (Peacock)\n\t[277787] = {\"incapacitate\"},\t-- Polymorph (Baby Direhorn)\n\t[277792] = {\"incapacitate\"},\t-- Polymorph (Bumblebee)\n\t[82691] = {\"incapacitate\"},\t\t-- Ring of Frost\n\t[115078] = {\"incapacitate\"},\t-- Paralysis\n\t[20066] = {\"incapacitate\"},\t\t-- Repentance\n\t[9484] = {\"incapacitate\"},\t\t-- Shackle Undead\n\t[200196] = {\"incapacitate\"},\t-- Holy Word: Chastise\n\t[1776] = {\"incapacitate\"},\t\t-- Gouge\n\t[6770] = {\"incapacitate\"},\t\t-- Sap\n\t[199743] = {\"incapacitate\"},\t-- Parley\n\t[51514] = {\"incapacitate\"},\t\t-- Hex\n\t[196942] = {\"incapacitate\"},\t-- Hex (Voodoo Totem)\n\t[210873] = {\"incapacitate\"},\t-- Hex (Raptor)\n\t[211004] = {\"incapacitate\"},\t-- Hex (Spider)\n\t[211010] = {\"incapacitate\"},\t-- Hex (Snake)\n\t[211015] = {\"incapacitate\"},\t-- Hex (Cockroach)\n\t[269352] = {\"incapacitate\"},\t-- Hex (Skeletal Hatchling)\n\t[309328] = {\"incapacitate\"},\t-- Hex (Living Honey)\n\t[277778] = {\"incapacitate\"},\t-- Hex (Zandalari Tendonripper)\n\t[277784] = {\"incapacitate\"},\t-- Hex (Wicker Mongrel)\n\t[197214] = {\"incapacitate\"},\t-- Sundering\n\t[6789] = {\"incapacitate\"},\t\t-- Mortal Coil\n\t[107079] = {\"incapacitate\"},\t-- Quaking Palm (Pandaren)\n\n\t-- Disorients\n\t[207167] = {\"disorient\"},\t\t-- Blinding Sleet\n\t[207685] = {\"disorient\"},\t\t-- Sigil of Misery\n\t[33786] = {\"disorient\"},\t\t-- Cyclone\n\t[1513]  = \"disorient\",\t\t\t-- Scare Beast\n\t[31661] = {\"disorient\"},\t\t-- Dragon's Breath\n\t[198909] = {\"disorient\"},\t\t-- Song of Chi-ji\n\t[202274] = {\"disorient\"},\t\t-- Incendiary Brew\n\t[105421] = {\"disorient\"},\t\t-- Blinding Light\n\t[10326] = {\"disorient\"},\t\t-- Turn Evil (For Lichborne?)\n\t[605] = {\"disorient\"},\t\t\t-- Mind Control\n\t[8122] = {\"disorient\"},\t\t\t-- Psychic Scream\n\t[226943] = {\"disorient\"},\t\t-- Mind Bomb\n\t[2094] = {\"disorient\"},\t\t\t-- Blind\n\t[118699] = {\"disorient\"},\t\t-- Fear\n\t[5484] = {\"disorient\"},\t\t\t-- Howl of Terror\n\t[6358] = {\"disorient\"},\t\t\t-- Seduction (Succubus)\n\t[261589] = {\"disorient\"},\t\t-- Seduction (Grimoire of Sacrifice)\n\t[5246] = {\"disorient\"},\t\t\t-- Intimidating Shout\n\t[331866] = {\"disorient\"},\t\t-- Agent of Chaos (Venthyr Covenant)\n\n\t-- Silences\n\t[47476] = {\"silence\"},\t\t\t-- Strangulate\n\t[204490] = {\"silence\"},\t\t\t-- Sigil of Silence\n\t[202933] = {\"silence\"},\t\t\t-- Spider Sting\n\t[217824] = {\"silence\"},\t\t\t-- Shield of Virtue\n\t[199683] = {\"silence\"},\t\t\t-- Last Word\n\t[15487] = {\"silence\"},\t\t\t-- Silence\n\t[1330] = {\"silence\"},\t\t\t-- Garrote\n\t[196364] = {\"silence\"},\t\t\t-- Unstable Affliction Silence Effect\n}\n\nlocal function GetIcon(id)\n\tlocal _, _, icon = GetSpellInfo(id)\n\treturn icon\nend\n\nT.DiminishingIcons = {\n\t[\"stun\"] = GetIcon(408),\n\t[\"root\"] = GetIcon(122),\n\t[\"incapacitate\"] = GetIcon(118),\n\t[\"disorient\"] = GetIcon(8122),\n\t[\"silence\"] = GetIcon(15487),\n}"
  },
  {
    "path": "ShestakUI/Config/Filters/Errors.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.general.error_filter ~= \"WHITELIST\" and C.general.error_filter ~= \"BLACKLIST\" then return end\n\n----------------------------------------------------------------------------------------\n--\tAll errors on http://wowwiki.wikia.com/wiki/WoW_Constants/Errors\n----------------------------------------------------------------------------------------\n\n----------------------------------------------------------------------------------------\n--\tWhite list errors, that will not be hidden\n----------------------------------------------------------------------------------------\nT.white_list = {\n\t[ERR_INV_FULL] = true,\n\t[ERR_QUEST_LOG_FULL] = true,\n\t[ERR_ITEM_MAX_COUNT] = true,\n\t[ERR_NOT_ENOUGH_MONEY] = true,\n\t[SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED] = true,\n\t[ERR_LOOT_MASTER_INV_FULL] = true,\n\t[ERR_LOOT_MASTER_OTHER] = true,\n\t[ERR_LOOT_MASTER_UNIQUE_ITEM] = true,\n}\n\n----------------------------------------------------------------------------------------\n--\tBlack list errors, that will be hidden\n----------------------------------------------------------------------------------------\nT.black_list = {\n\t[SPELL_FAILED_NO_COMBO_POINTS] = true,\n\t[SPELL_FAILED_TARGETS_DEAD] = true,\n\t[SPELL_FAILED_SPELL_IN_PROGRESS] = true,\n\t[SPELL_FAILED_TARGET_AURASTATE] = true,\n\t[SPELL_FAILED_CASTER_AURASTATE] = true,\n\t[SPELL_FAILED_NO_ENDURANCE] = true,\n\t[SPELL_FAILED_BAD_TARGETS] = true,\n\t[SPELL_FAILED_NOT_MOUNTED] = true,\n\t[SPELL_FAILED_NOT_ON_TAXI] = true,\n\t[SPELL_FAILED_NOT_INFRONT] = true,\n\t[SPELL_FAILED_NOT_IN_CONTROL] = true,\n\t[SPELL_FAILED_MOVING] = true,\n\t[SPELL_FAILED_AURA_BOUNCED] = true,\n\t[SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW] = true,\n\t[SPELL_FAILED_AFFECTING_COMBAT] = true,\n\t[ERR_ATTACK_FLEEING] = true,\n\t[ERR_ITEM_COOLDOWN] = true,\n\t[ERR_GENERIC_NO_TARGET] = true,\n\t[ERR_ABILITY_COOLDOWN] = true,\n\t[ERR_NO_ATTACK_TARGET] = true,\n\t[ERR_SPELL_COOLDOWN] = true,\n\t[ERR_OUT_OF_ARCANE_CHARGES] = true,\n\t[ERR_OUT_OF_BALANCE_NEGATIVE] = true,\n\t[ERR_OUT_OF_BALANCE_POSITIVE] = true,\n\t[ERR_OUT_OF_BURNING_EMBERS] = true,\n\t[ERR_OUT_OF_CHI] = true,\n\t[ERR_OUT_OF_DARK_FORCE] = true,\n\t[ERR_OUT_OF_DEMONIC_FURY] = true,\n\t[ERR_OUT_OF_FURY] = true,\n\t[ERR_OUT_OF_PAIN] = true,\n\t[ERR_OUT_OF_SOUL_SHARDS] = true,\n\t[ERR_OUT_OF_LIGHT_FORCE] = true,\n\t[ERR_OUT_OF_SHADOW_ORBS] = true,\n\t[ERR_OUT_OF_HOLY_POWER] = true,\n\t[ERR_OUT_OF_ENERGY] = true,\n\t[ERR_OUT_OF_RAGE] = true,\n\t[ERR_OUT_OF_FOCUS] = true,\n\t[ERR_OUT_OF_RUNES] = true,\n\t[ERR_OUT_OF_RUNIC_POWER] = true,\n\t[ERR_OUT_OF_MANA] = true,\n\t[ERR_OUT_OF_POWER_DISPLAY] = true,\n\t[ERR_OUT_OF_RANGE] = true,\n\t[ERR_BADATTACKPOS] = true,\n\t[ERR_INVALID_ATTACK_TARGET] = true,\n\t[ERR_NOEMOTEWHILERUNNING] = true,\n\t[ERR_NOT_EQUIPPABLE] = true,\n\t[ERR_NOT_IN_COMBAT] = true,\n\t[ERR_MAIL_DATABASE_ERROR] = true,\n\t[OUT_OF_POWER_DISPLAY] = true,\n\t[OUT_OF_ENERGY] = true,\n\t[OUT_OF_FOCUS] = true,\n\t[OUT_OF_MANA] = true,\n\t[OUT_OF_POWER_DISPLAY] = true,\n\t[OUT_OF_RAGE] = true,\n\t[ERR_SPELL_OUT_OF_RANGE] = true,\n\t[ERR_TOO_FAR_TO_INTERACT] = true,\n}"
  },
  {
    "path": "ShestakUI/Config/Filters/FilgerSpells.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.filger.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Renew -> http://www.wowhead.com/spell=139\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nP_BUFF_ICON_Anchor = CreateFrame(\"Frame\", \"P_BUFF_ICON_Anchor\", UIParent)\nP_PROC_ICON_Anchor = CreateFrame(\"Frame\", \"P_PROC_ICON_Anchor\", UIParent)\nSPECIAL_P_BUFF_ICON_Anchor = CreateFrame(\"Frame\", \"SPECIAL_P_BUFF_ICON_Anchor\", UIParent)\nT_DEBUFF_ICON_Anchor = CreateFrame(\"Frame\", \"T_DEBUFF_ICON_Anchor\", UIParent)\nT_BUFF_Anchor = CreateFrame(\"Frame\", \"T_BUFF_Anchor\", UIParent)\nPVE_PVP_DEBUFF_Anchor = CreateFrame(\"Frame\", \"PVE_PVP_DEBUFF_Anchor\", UIParent)\nPVE_PVP_CC_Anchor = CreateFrame(\"Frame\", \"PVE_PVP_CC_Anchor\", UIParent)\nCOOLDOWN_Anchor = CreateFrame(\"Frame\", \"COOLDOWN_Anchor\", UIParent)\nT_DE_BUFF_BAR_Anchor = CreateFrame(\"Frame\", \"T_DE_BUFF_BAR_Anchor\", UIParent)\n\nC[\"filger_spells\"] = {\n\t[\"DEATHKNIGHT\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Empower Rune Weapon\n\t\t\t{spellID = 47568, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Death's Advance\n\t\t\t{spellID = 48265, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Remorseless Winter\n\t\t\t{spellID = 196770, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Hungering Rune Weapon\n\t\t\t{spellID = 207127, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Bone Shield\n\t\t\t{spellID = 195181, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Vampiric Blood\n\t\t\t{spellID = 55233, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Icebound Fortitude\n\t\t\t{spellID = 48792, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Anti-Magic Shell\n\t\t\t{spellID = 48707, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dancing Rune Weapon\n\t\t\t{spellID = 81256, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Lichborne\n\t\t\t{spellID = 287081, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Rune Tap\n\t\t\t{spellID = 194679, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Pillar of Frost\n\t\t\t{spellID = 51271, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Desecrated Ground\n\t\t\t{spellID = 115018, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Unholy Blight\n\t\t\t{spellID = 115989, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Summon Gargoyle\n\t\t\t{spellID = 49206, filter = \"ICD\", trigger = \"NONE\", duration = 30},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Icy Talons\n\t\t\t{spellID = 194879, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Crimson Scourge\n\t\t\t{spellID = 81141, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Freezing Fog\n\t\t\t{spellID = 59052, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Killing Machine\n\t\t\t{spellID = 51124, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Sudden Doom\n\t\t\t{spellID = 81340, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Unholy Strength\n\t\t\t{spellID = 53365, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dark Transformation\n\t\t\t{spellID = 63560, unitID = \"pet\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t-- {\n\t\t\t-- Name = \"T_DEBUFF_ICON\",\n\t\t\t-- Direction = \"RIGHT\",\n\t\t\t-- Mode = \"ICON\",\n\t\t\t-- Interval = C.filger.buffs_space,\n\t\t\t-- Alpha = 1,\n\t\t\t-- IconSize = C.filger.buffs_size,\n\t\t\t-- Position = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t-- },\n\t\t{\n\t\t\tName = \"T_DE/BUFF_BAR\",\n\t\t\tDirection = \"UP\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 186,\n\t\t\tPosition = {\"LEFT\", T_DE_BUFF_BAR_Anchor},\n\n\t\t\t-- Festering Wound\n\t\t\t{spellID = 194310, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Virulent Plague\n\t\t\t{spellID = 191587, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Blood Plague\n\t\t\t{spellID = 55078, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Frost Fever\n\t\t\t{spellID = 55095, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Apocalypse\n\t\t\t{spellID = 220143, filter = \"CD\"},\n\t\t\t-- Sindragosa's Fury\n\t\t\t{spellID = 190778, filter = \"CD\"},\n\t\t\t-- Consumption\n\t\t\t{spellID = 205223, filter = \"CD\"},\n\t\t\t-- Bonestorm\n\t\t\t{spellID = 194844, filter = \"CD\"},\n\t\t\t-- Asphyxiate\n\t\t\t{spellID = 221562, filter = \"CD\"},\n\t\t\t-- Blinding Sleet\n\t\t\t{spellID = 207167, filter = \"CD\"},\n\t\t\t-- Hungering Rune Weapon\n\t\t\t{spellID = 207127, filter = \"CD\"},\n\t\t\t-- Mind Freeze\n\t\t\t{spellID = 47528, filter = \"CD\"},\n\t\t\t-- Strangulate\n\t\t\t{spellID = 47476, filter = \"CD\"},\n\t\t\t-- Gnaw (Ghoul)\n\t\t\t{spellID = 47481, filter = \"CD\"},\n\t\t\t-- Remorseless Winter\n\t\t\t{spellID = 196770, filter = \"CD\"},\n\t\t\t-- Dark Simulacrum\n\t\t\t{spellID = 77606, filter = \"CD\"},\n\t\t\t-- Death Grip\n\t\t\t{spellID = 49576, filter = \"CD\"},\n\t\t\t-- Plague Leech\n\t\t\t{spellID = 123693, filter = \"CD\"},\n\t\t\t-- Death and Decay\n\t\t\t{spellID = 43265, filter = \"CD\"},\n\t\t\t-- Rune Tap\n\t\t\t{spellID = 194679, filter = \"CD\"},\n\t\t\t-- Anti-Magic Shell\n\t\t\t{spellID = 48707, filter = \"CD\"},\n\t\t\t-- Blood Tap\n\t\t\t{spellID = 221699, filter = \"CD\"},\n\t\t\t-- Vampiric Blood\n\t\t\t{spellID = 55233, filter = \"CD\"},\n\t\t\t-- Pillar of Frost\n\t\t\t{spellID = 51271, filter = \"CD\"},\n\t\t\t-- Outbreak\n\t\t\t{spellID = 77575, filter = \"CD\"},\n\t\t\t-- Gorefiend's Grasp\n\t\t\t{spellID = 108199, filter = \"CD\"},\n\t\t\t-- Raise Dead\n\t\t\t{spellID = 46584, filter = \"CD\"},\n\t\t\t-- Dancing Rune Weapon\n\t\t\t{spellID = 49028, filter = \"CD\"},\n\t\t\t-- Unholy Blight\n\t\t\t{spellID = 115989, filter = \"CD\"},\n\t\t\t-- Breath of Sindragosa\n\t\t\t{spellID = 152279, filter = \"CD\"},\n\t\t\t-- Lichborne\n\t\t\t{spellID = 287081, filter = \"CD\"},\n\t\t\t-- Desecrated Ground\n\t\t\t{spellID = 108201, filter = \"CD\"},\n\t\t\t-- Death Pact\n\t\t\t{spellID = 48743, filter = \"CD\"},\n\t\t\t-- Anti-Magic Zone\n\t\t\t{spellID = 51052, filter = \"CD\"},\n\t\t\t-- Icebound Fortitude\n\t\t\t{spellID = 48792, filter = \"CD\"},\n\t\t\t-- Summon Gargoyle\n\t\t\t{spellID = 49206, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"DEMONHUNTER\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Metamorphosis\n\t\t\t{spellID = 187827, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Immolation Aura\n\t\t\t{spellID = 258920, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Demon Spikes\n\t\t\t{spellID = 203720, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Soul Barrier\n\t\t\t{spellID = 263648, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Blur\n\t\t\t{spellID = 212800, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Netherwalk\n\t\t\t{spellID = 196555, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Nether Bond\n\t\t\t{spellID = 207810, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Soul Fragments\n\t\t\t{spellID = 203981, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Momentum\n\t\t\t{spellID = 208628, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Dark Slash\n\t\t\t{spellID = 258860, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Nemesis\n\t\t\t{spellID = 206491, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Sigil of Flame\n\t\t\t{spellID = 204598, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Sigil of Silence\n\t\t\t{spellID = 204490, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Sigil of Misery\n\t\t\t{spellID = 207685, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Sigil of Grasp\n\t\t\t{spellID = 204843, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Fiery Brand\n\t\t\t{spellID = 207744, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Frailty\n\t\t\t{spellID = 224509, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Bloodlet\n\t\t\t{spellID = 207690, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DE/BUFF_BAR\",\n\t\t\tDirection = \"UP\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 186,\n\t\t\tPosition = {\"LEFT\", T_DE_BUFF_BAR_Anchor},\n\n\t\t\t-- Darkness\n\t\t\t{spellID = 209426, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Imprison\n\t\t\t{spellID = 217832, unitID = \"focus\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Consume Magic\n\t\t\t{spellID = 183752, filter = \"CD\"},\n\t\t\t-- Fel Rush\n\t\t\t{spellID = 195072, filter = \"CD\", absID = true},\n\t\t\t-- Infernal Strike\n\t\t\t{spellID = 189110, filter = \"CD\"},\n\t\t\t-- Torment\n\t\t\t{spellID = 185245, filter = \"CD\"},\n\t\t\t-- Demon Spikes\n\t\t\t{spellID = 203720, filter = \"CD\"},\n\t\t\t-- Immolation Aura\n\t\t\t{spellID = 258920, filter = \"CD\"},\n\t\t\t-- Felblade\n\t\t\t{spellID = 213241, filter = \"CD\"},\n\t\t\t-- Throw Glaive\n\t\t\t{spellID = 185123, filter = \"CD\"},\n\t\t\t-- Soul Barrier\n\t\t\t{spellID = 263648, filter = \"CD\"},\n\t\t\t-- Blade Dance\n\t\t\t{spellID = 188499, filter = \"CD\"},\n\t\t\t-- Fel Barrage\n\t\t\t{spellID = 211053, filter = \"CD\"},\n\t\t\t-- Vengeful Retreat\n\t\t\t{spellID = 198793, filter = \"CD\", absID = true},\n\t\t\t-- Sigil of Silence\n\t\t\t{spellID = 202137, filter = \"CD\"},\n\t\t\t-- Sigil of Misery\n\t\t\t{spellID = 207684, filter = \"CD\"},\n\t\t\t-- Spectral Sight\n\t\t\t{spellID = 188501, filter = \"CD\"},\n\t\t\t-- Fiery Brand\n\t\t\t{spellID = 204021, filter = \"CD\"},\n\t\t\t-- Eye Beam\n\t\t\t{spellID = 198013, filter = \"CD\", absID = true},\n\t\t\t-- Chaos Nova\n\t\t\t{spellID = 179057, filter = \"CD\", absID = true},\n\t\t\t-- Sigil of Chains\n\t\t\t{spellID = 202138, filter = \"CD\"},\n\t\t\t-- Fel Eruption\n\t\t\t{spellID = 211881, filter = \"CD\"},\n\t\t\t-- Fel Devastation\n\t\t\t{spellID = 212084, filter = \"CD\"},\n\t\t\t-- Nether Bond\n\t\t\t{spellID = 207810, filter = \"CD\"},\n\t\t\t-- Demonic Infusion\n\t\t\t{spellID = 236189, filter = \"CD\"},\n\t\t\t-- Blur\n\t\t\t{spellID = 198589, filter = \"CD\"},\n\t\t\t-- Netherwalk\n\t\t\t{spellID = 196555, filter = \"CD\"},\n\t\t\t-- Nemesis\n\t\t\t{spellID = 206491, filter = \"CD\"},\n\t\t\t-- Metamorphosis\n\t\t\t{spellID = 187827, filter = \"CD\"},\n\t\t\t-- Darkness\n\t\t\t{spellID = 196718, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"DRUID\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Incarnation: Chosen of Elune\n\t\t\t{spellID = 102560, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Incarnation: King of the Jungle\n\t\t\t{spellID = 102543, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Incarnation: Son of Ursoc\n\t\t\t{spellID = 102558, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Incarnation: Tree of Life\n\t\t\t{spellID = 117679, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Survival Instincts\n\t\t\t{spellID = 61336, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Barkskin\n\t\t\t{spellID = 22812, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Savage Roar\n\t\t\t{spellID = 52610, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Berserk\n\t\t\t{spellID = 106951, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\t\t\t-- Tiger's Fury\n\t\t\t{spellID = 5217, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Celestial Alignment\n\t\t\t{spellID = 194223, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Nature's Vigil\n\t\t\t{spellID = 124974, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Rage of the Sleeper\n\t\t\t{spellID = 200851, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ironfur\n\t\t\t{spellID = 192081, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Nature's Grasp\n\t\t\t{spellID = 170856, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dash\n\t\t\t{spellID = 1850, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Starfall\n\t\t\t{spellID = 191034, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Warrior of Elune\n\t\t\t{spellID = 202425, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Starlord\n\t\t\t{spellID = 279709, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Bloodtalons\n\t\t\t{spellID = 145152, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Clearcasting\n\t\t\t{spellID = 16870, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Soul of the Forest\n\t\t\t{spellID = 114108, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Predatory Swiftness\n\t\t\t{spellID = 69369, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Guardian of Elune\n\t\t\t{spellID = 213680, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Eclipse (Solar)\n\t\t\t{spellID = 48517, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Eclipse (Lunar)\n\t\t\t{spellID = 48518, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Moonfire\n\t\t\t{spellID = 164812, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Sunfire\n\t\t\t{spellID = 164815, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Stellar Flare\n\t\t\t{spellID = 202347, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Ashmane's Frenzy\n\t\t\t{spellID = 210722, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Rake\n\t\t\t{spellID = 155722, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Rip\n\t\t\t{spellID = 1079, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Thrash\n\t\t\t{spellID = 77758, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Immobilized\n\t\t\t{spellID = 45334, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DE/BUFF_BAR\",\n\t\t\tDirection = \"UP\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 186,\n\t\t\tPosition = {\"LEFT\", T_DE_BUFF_BAR_Anchor},\n\n\t\t\t-- Lifebloom\n\t\t\t{spellID = 33763, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Rejuvenation\n\t\t\t{spellID = 774, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Rejuvenation (Germination)\n\t\t\t{spellID = 155777, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Regrowth\n\t\t\t{spellID = 8936, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Wild Growth\n\t\t\t{spellID = 48438, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Cenarion Ward\n\t\t\t{spellID = 102351, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Cyclone\n\t\t\t{spellID = 33786, unitID = \"focus\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Entangling Roots\n\t\t\t{spellID = 339, unitID = \"focus\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Nature's Cure\n\t\t\t{spellID = 88423, filter = \"CD\"},\n\t\t\t-- Remove Corruption\n\t\t\t{spellID = 2782, filter = \"CD\"},\n\t\t\t-- Soothe\n\t\t\t{spellID = 2908, filter = \"CD\"},\n\t\t\t-- Skull Bash\n\t\t\t{spellID = 106839, filter = \"CD\"},\n\t\t\t-- Mangle\n\t\t\t{spellID = 33917, filter = \"CD\"},\n\t\t\t-- Wild Growth\n\t\t\t{spellID = 48438, filter = \"CD\"},\n\t\t\t-- Swiftmend\n\t\t\t{spellID = 18562, filter = \"CD\"},\n\t\t\t-- Growl\n\t\t\t{spellID = 6795, filter = \"CD\"},\n\t\t\t-- Maim\n\t\t\t{spellID = 22570, filter = \"CD\"},\n\t\t\t-- Starsurge\n\t\t\t{spellID = 78674, filter = \"CD\"},\n\t\t\t-- Wild Charge\n\t\t\t{spellID = 102401, filter = \"CD\"},\n\t\t\t-- Force of Nature\n\t\t\t{spellID = 205636, filter = \"CD\"},\n\t\t\t-- Tiger's Fury\n\t\t\t{spellID = 5217, filter = \"CD\"},\n\t\t\t-- Cenarion Ward\n\t\t\t{spellID = 102351, filter = \"CD\"},\n\t\t\t-- Frenzied Regeneration\n\t\t\t{spellID = 22842, filter = \"CD\"},\n\t\t\t-- Incapacitating Roar\n\t\t\t{spellID = 99, filter = \"CD\"},\n\t\t\t-- Bristling Fur\n\t\t\t{spellID = 155835, filter = \"CD\"},\n\t\t\t-- Mass Entanglement\n\t\t\t{spellID = 102359, filter = \"CD\"},\n\t\t\t-- Typhoon\n\t\t\t{spellID = 132469, filter = \"CD\"},\n\t\t\t-- Mighty Bash\n\t\t\t{spellID = 5211, filter = \"CD\"},\n\t\t\t-- Solar Beam\n\t\t\t{spellID = 78675, filter = \"CD\"},\n\t\t\t-- Barkskin\n\t\t\t{spellID = 22812, filter = \"CD\"},\n\t\t\t-- Ironbark\n\t\t\t{spellID = 102342, filter = \"CD\"},\n\t\t\t-- Ursol's Vortex\n\t\t\t{spellID = 102793, filter = \"CD\"},\n\t\t\t-- Nature's Vigil\n\t\t\t{spellID = 124974, filter = \"CD\"},\n\t\t\t-- Flourish\n\t\t\t{spellID = 197721, filter = \"CD\"},\n\t\t\t-- Renewal\n\t\t\t{spellID = 108238, filter = \"CD\"},\n\t\t\t-- Berserk\n\t\t\t{spellID = 106951, filter = \"CD\", absID = true},\n\t\t\t-- Ashmane's Frenzy\n\t\t\t{spellID = 210722, filter = \"CD\"},\n\t\t\t-- Incarnation: Chosen of Elune\n\t\t\t{spellID = 102560, filter = \"CD\"},\n\t\t\t-- Incarnation: King of the Jungle\n\t\t\t{spellID = 102543, filter = \"CD\"},\n\t\t\t-- Incarnation: Son of Ursoc\n\t\t\t{spellID = 102558, filter = \"CD\"},\n\t\t\t-- Incarnation: Tree of Life\n\t\t\t{spellID = 33891, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"EVOKER\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Tip the scales\n\t\t\t{spellID = 370553, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Living Flame Healing\n\t\t\t{spellID = 361509, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Obsidian Scales\n\t\t\t{spellID = 363916, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Time Spiral\n\t\t\t{spellID = 375234, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Renewing Blaze\n\t\t\t{spellID = 374348, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dragonrage\n\t\t\t{spellID = 375087, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Hover\n\t\t\t{spellID = 358267, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Deep Breath\n\t\t\t{spellID = 357210, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Recall\n\t\t\t{spellID = 371807, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Time Dilation\n\t\t\t{spellID = 357170, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Time Stop (PVP Talent)\n\t\t\t{spellID = 378441, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Echo\n\t\t\t{spellID = 364343, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Reversion\n\t\t\t{spellID = 366155, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dream Flight\n\t\t\t{spellID = 363502, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dream Breath\n\t\t\t{spellID = 355941, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Snapfire\n\t\t\t{spellID = 370818, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Essence Burst\n\t\t\t{spellID = 359618, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Leaping Flames\n\t\t\t{spellID = 370901, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Living Flame [Damage]\n\t\t\t{spellID = 361500, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Living Flame [Healing]\n\t\t\t{spellID = 361509, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Fire Breath\n\t\t\t{spellID = 357209, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Disintegrate\n\t\t\t{spellID = 356995, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Echo\n\t\t\t{spellID = 364343, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Reversion\n\t\t\t{spellID = 366155, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dream Flight\n\t\t\t{spellID = 363502, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dream Breath\n\t\t\t{spellID = 355941, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DE/BUFF_BAR\",\n\t\t\tDirection = \"UP\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 186,\n\t\t\tPosition = {\"LEFT\", T_DE_BUFF_BAR_Anchor},\n\n\t\t\t-- Obsidian Scales\n\t\t\t{spellID = 363916, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Renewing Blaze\n\t\t\t{spellID = 374348, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Landslide\n\t\t\t{spellID = 355689, unitID = \"focus\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Sleep Walk\n\t\t\t{spellID = 360806, unitID = \"focus\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Quell\n\t\t\t{spellID = 351338, filter = \"CD\"},\n\t\t\t-- Tip the Scales\n\t\t\t{spellID = 370553, filter = \"CD\"},\n\t\t\t-- Emerald Blossom\n\t\t\t{spellID = 355913, filter = \"CD\"},\n\t\t\t-- Deep Breath\n\t\t\t{spellID = 357210, filter = \"CD\"},\n\t\t\t-- Fire Storm\n\t\t\t{spellID = 368847, filter = \"CD\"},\n\t\t\t-- Time Spiral\n\t\t\t{spellID = 374968, filter = \"CD\"},\n\t\t\t-- Landslide\n\t\t\t{spellID = 358385, filter = \"CD\"},\n\t\t\t-- Oppressing Roar\n\t\t\t{spellID = 372048, filter = \"CD\"},\n\t\t\t-- Obsidian Scales\n\t\t\t{spellID = 363916, filter = \"CD\"},\n\t\t\t-- Eternity Surge\n\t\t\t{spellID = 382411, filter = \"CD\"},\n\t\t\t-- Dragonrage\n\t\t\t{spellID = 375087, filter = \"CD\"},\n\t\t\t-- Cauterizing Flame\n\t\t\t{spellID = 374251, filter = \"CD\"},\n\t\t\t-- Fire Breath\n\t\t\t{spellID = 382266, filter = \"CD\"},\n\t\t\t-- Time Dilation\n\t\t\t{spellID = 357170, filter = \"CD\"},\n\t\t\t-- Time Stop (PvP Talent)\n\t\t\t{spellID = 378441, filter = \"CD\"},\n\t\t\t-- Chrono Loop (PvP Talent)\n\t\t\t{spellID = 383005, filter = \"CD\"},\n\t\t\t-- Emerald Communion\n\t\t\t{spellID = 370960, filter = \"CD\"},\n\t\t\t-- Dream Breath\n\t\t\t{spellID = 355941, filter = \"CD\"},\n\t\t\t-- Spiritbloom\n\t\t\t{spellID = 382731, filter = \"CD\"},\n\t\t\t-- Rewind\n\t\t\t{spellID = 363534, filter = \"CD\"},\n\t\t\t-- Verdant Embrace\n\t\t\t{spellID = 360995, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"HUNTER\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Coordinated Assault\n\t\t\t{spellID = 266779, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Aspect of the Turtle\n\t\t\t{spellID = 186265, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Bestial Wrath\n\t\t\t{spellID = 19574, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Aspect of the Wild\n\t\t\t{spellID = 193530, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Aspect of the Eagle\n\t\t\t{spellID = 186289, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Aspect of the Cheetah\n\t\t\t{spellID = 186257, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dire Beast\n\t\t\t{spellID = 120694, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Camouflage\n\t\t\t{spellID = 199483, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\t\t\t-- Spirit Mend\n\t\t\t{spellID = 90361, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Posthaste\n\t\t\t{spellID = 118922, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Volley\n\t\t\t{spellID = 194386, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Misdirection\n\t\t\t{spellID = 35079, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Survivalist\n\t\t\t{spellID = 164857, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Bombardment\n\t\t\t{spellID = 82921, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Spitting Cobra\n\t\t\t{spellID = 194407, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Trueshot\n\t\t\t{spellID = 288613, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Viper's Venom\n\t\t\t{spellID = 268552, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Trick Shots\n\t\t\t{spellID = 257622, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Lethal Shots\n\t\t\t{spellID = 260395, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Precise Shots\n\t\t\t{spellID = 260242, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Frenzy\n\t\t\t{spellID = 272790, unitID = \"pet\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Steady Focus\n\t\t\t{spellID = 193533, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Lock and Load\n\t\t\t{spellID = 194594, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Mok'Nathal Tactics\n\t\t\t{spellID = 201081, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Mongoose Fury\n\t\t\t{spellID = 190931, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Beast Cleave\n\t\t\t{spellID = 118455, unitID = \"pet\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Mend Pet\n\t\t\t{spellID = 136, unitID = \"pet\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Black Arrow\n\t\t\t{spellID = 194599, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Serpent Sting\n\t\t\t{spellID = 87935, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Lacerate\n\t\t\t{spellID = 185855, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- A Murder of Crows\n\t\t\t{spellID = 131894, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Hunter's Mark\n\t\t\t{spellID = 257284, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Caltrops\n\t\t\t{spellID = 194279, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Warp Time (Warp Stalker)\n\t\t\t{spellID = 35346, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Ankle Crack (Crocolisk)\n\t\t\t{spellID = 50433, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Frost Breath (Chimaera)\n\t\t\t{spellID = 54644, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Concussive Shot\n\t\t\t{spellID = 5116, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Tar Trap\n\t\t\t{spellID = 135299, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Poisoned Ammo\n\t\t\t{spellID = 162543, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Frozen Ammo\n\t\t\t{spellID = 162546, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- True Aim\n\t\t\t{spellID = 199803, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Explosive Trap\n\t\t\t{spellID = 13812, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Steel Trap\n\t\t\t{spellID = 162487, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\", absID = true},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Freezing Trap\n\t\t\t{spellID = 3355, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Concussive Shot\n\t\t\t{spellID = 5116, filter = \"CD\"},\n\t\t\t-- Counter Shot\n\t\t\t{spellID = 147362, filter = \"CD\"},\n\t\t\t-- Kill Command\n\t\t\t{spellID = 34026, filter = \"CD\"},\n\t\t\t-- Sidewinders\n\t\t\t{spellID = 214579, filter = \"CD\"},\n\t\t\t-- Explosive Shot\n\t\t\t{spellID = 212431, filter = \"CD\"},\n\t\t\t-- Chimera Shot\n\t\t\t{spellID = 53209, filter = \"CD\"},\n\t\t\t-- Barrage\n\t\t\t{spellID = 120360, filter = \"CD\"},\n\t\t\t-- Disengage\n\t\t\t{spellID = 781, filter = \"CD\"},\n\t\t\t-- Dire Beast\n\t\t\t{spellID = 120679, filter = \"CD\"},\n\t\t\t-- Fervor\n\t\t\t{spellID = 82726, filter = \"CD\"},\n\t\t\t-- Misdirection\n\t\t\t{spellID = 34477, filter = \"CD\"},\n\t\t\t-- Feign Death\n\t\t\t{spellID = 5384, filter = \"CD\"},\n\t\t\t-- Explosive Trap\n\t\t\t{spellID = 13813, filter = \"CD\"},\n\t\t\t-- Ice Trap\n\t\t\t{spellID = 13809, filter = \"CD\"},\n\t\t\t-- Binding Shot\n\t\t\t{spellID = 117526, filter = \"CD\"},\n\t\t\t-- Master's Call\n\t\t\t{spellID = 53271, filter = \"CD\"},\n\t\t\t-- Intimidation\n\t\t\t{spellID = 19577, filter = \"CD\"},\n\t\t\t-- Bestial Wrath\n\t\t\t{spellID = 19574, filter = \"CD\"},\n\t\t\t-- A Murder of Crows\n\t\t\t{spellID = 131894, filter = \"CD\"},\n\t\t\t-- Exhilaration\n\t\t\t{spellID = 109304, filter = \"CD\"},\n\t\t\t-- Aspect of the Wild\n\t\t\t{spellID = 193530, filter = \"CD\"},\n\t\t\t-- Aspect of the Turtle\n\t\t\t{spellID = 186265, filter = \"CD\"},\n\t\t\t-- Aspect of the Cheetah\n\t\t\t{spellID = 186257, filter = \"CD\"},\n\t\t\t-- Spirit Mend (Pet)\n\t\t\t{spellID = 90361, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"MAGE\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Ice Block\n\t\t\t{spellID = 45438, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Invisibility\n\t\t\t{spellID = 66, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\t\t\t-- Invisibility\n\t\t\t{spellID = 32612, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\t\t\t-- Greater Invisibility\n\t\t\t{spellID = 110960, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\t\t\t-- Icy Veins\n\t\t\t{spellID = 12472, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Arcane Power\n\t\t\t{spellID = 12042, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Combustion\n\t\t\t{spellID = 190319, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Infernal Cascade\n\t\t\t{spellID = 336832, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Blazing Barrier\n\t\t\t{spellID = 235313, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Prismatic Barrier\n\t\t\t{spellID = 235450, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ice Barrier\n\t\t\t{spellID = 11426, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ice Floes\n\t\t\t{spellID = 108839, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Alter Time\n\t\t\t{spellID = 108978, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Temporal Shield\n\t\t\t{spellID = 198111, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Rune of Power\n\t\t\t{spellID = 116011, filter = \"ICD\", trigger = \"NONE\", totem = true},\n\t\t\t-- Mirror Image\n\t\t\t{spellID = 55342, filter = \"ICD\", trigger = \"NONE\", duration = 40},\n\t\t\t-- Icicles\n\t\t\t{spellID = 205473, unitID = \"player\", caster = \"player\", filter = \"BUFF\", talentID = 21634},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Fingers of Frost\n\t\t\t{spellID = 44544, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Brain Freeze\n\t\t\t{spellID = 190446, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Glacial Spike!\n\t\t\t{spellID = 199844, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Heating Up\n\t\t\t{spellID = 48107, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Hot Streak!\n\t\t\t{spellID = 48108, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Pyroclasm\n\t\t\t{spellID = 269651, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Clearcasting\n\t\t\t{spellID = 263725, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Rune of Power\n\t\t\t{spellID = 116014, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Arcane Charge\n\t\t\t{spellID = 36032, unitID = \"player\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Living Bomb\n\t\t\t{spellID = 44457, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Nether Tempest\n\t\t\t{spellID = 114923, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Freeze (Pet)\n\t\t\t{spellID = 33395, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Frostbite\n\t\t\t{spellID = 198121, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Frost Nova\n\t\t\t{spellID = 122, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Cone of Cold\n\t\t\t{spellID = 120, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Winter's Chill\n\t\t\t{spellID = 228358, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Ice Nova\n\t\t\t{spellID = 157997, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Slow\n\t\t\t{spellID = 31589, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Polymorph\n\t\t\t{spellID = 118, unitID = \"focus\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Remove Curse\n\t\t\t{spellID = 475, filter = \"CD\"},\n\t\t\t-- Counterspell\n\t\t\t{spellID = 2139, filter = \"CD\"},\n\t\t\t-- Living Bomb\n\t\t\t{spellID = 44457, filter = \"CD\"},\n\t\t\t-- Blink\n\t\t\t{spellID = 1953, filter = \"CD\"},\n\t\t\t-- Frost Nova\n\t\t\t{spellID = 122, filter = \"CD\"},\n\t\t\t-- Ice Nova\n\t\t\t{spellID = 157997, filter = \"CD\"},\n\t\t\t-- Ring of Frost\n\t\t\t{spellID = 113724, filter = \"CD\"},\n\t\t\t-- Blazing Barrier\n\t\t\t{spellID = 235313, filter = \"CD\"},\n\t\t\t-- Prismatic Barrier\n\t\t\t{spellID = 235450, filter = \"CD\"},\n\t\t\t-- Ice Barrier\n\t\t\t{spellID = 11426, filter = \"CD\"},\n\t\t\t-- Temporal Shield\n\t\t\t{spellID = 198111, filter = \"CD\"},\n\t\t\t-- Fire Blast\n\t\t\t{spellID = 108853, filter = \"CD\"},\n\t\t\t-- Cone of Cold\n\t\t\t{spellID = 120, filter = \"CD\"},\n\t\t\t-- Comet Storm\n\t\t\t{spellID = 153595, filter = \"CD\"},\n\t\t\t-- Ice Floes\n\t\t\t{spellID = 108839, filter = \"CD\"},\n\t\t\t-- Ebonbolt\n\t\t\t{spellID = 214634, filter = \"CD\"},\n\t\t\t-- Phoenix's Flames\n\t\t\t{spellID = 194466, filter = \"CD\"},\n\t\t\t-- Mark of Aluneth\n\t\t\t{spellID = 224968, filter = \"CD\"},\n\t\t\t-- Frozen Orb\n\t\t\t{spellID = 84714, filter = \"CD\"},\n\t\t\t-- Meteor\n\t\t\t{spellID = 153561, filter = \"CD\"},\n\t\t\t-- Dragon's Breath\n\t\t\t{spellID = 31661, filter = \"CD\"},\n\t\t\t-- Arcane Power\n\t\t\t{spellID = 12042, filter = \"CD\"},\n\t\t\t-- Rune of Power\n\t\t\t{spellID = 116011, filter = \"CD\"},\n\t\t\t-- Presence of Mind\n\t\t\t{spellID = 205025, filter = \"CD\"},\n\t\t\t-- Displacement\n\t\t\t{spellID = 195676, filter = \"CD\"},\n\t\t\t-- Charged Up\n\t\t\t{spellID = 205032, filter = \"CD\"},\n\t\t\t-- Supernova\n\t\t\t{spellID = 157980, filter = \"CD\"},\n\t\t\t-- Evocation\n\t\t\t{spellID = 12051, filter = \"CD\"},\n\t\t\t-- Icy Veins\n\t\t\t{spellID = 12472, filter = \"CD\"},\n\t\t\t-- Mirror Image\n\t\t\t{spellID = 55342, filter = \"CD\"},\n\t\t\t-- Combustion\n\t\t\t{spellID = 190319, filter = \"CD\"},\n\t\t\t-- Cold Snap\n\t\t\t{spellID = 235219, filter = \"CD\"},\n\t\t\t-- Ice Block\n\t\t\t{spellID = 45438, filter = \"CD\"},\n\t\t\t-- Invisibility\n\t\t\t{spellID = 66, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"MONK\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Fortifying Brew\n\t\t\t{spellID = 120954, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ironskin Brew\n\t\t\t{spellID = 215479, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Touch of Karma\n\t\t\t{spellID = 125174, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Diffuse Magic\n\t\t\t{spellID = 122783, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dampen Harm\n\t\t\t{spellID = 122278, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Nimble Brew\n\t\t\t{spellID = 213664, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Serenity\n\t\t\t{spellID = 152173, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Storm, Earth, and Fire\n\t\t\t{spellID = 137639, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Mana Tea\n\t\t\t{spellID = 197908, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Thunder Focus Tea\n\t\t\t{spellID = 116680, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Brew-Stache\n\t\t\t{spellID = 214372, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Lifecycles (Vivify)\n\t\t\t{spellID = 197916, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Lifecycles (Enveloping Mist)\n\t\t\t{spellID = 197919, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Fortification\n\t\t\t{spellID = 213341, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Chi Torpedo\n\t\t\t{spellID = 119085, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Rushing Jade Wind\n\t\t\t{spellID = 116847, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Blackout Kick!\n\t\t\t{spellID = 116768, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- The Mists of Sheilun\n\t\t\t{spellID = 199888, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Surge of Mists\n\t\t\t{spellID = 246328, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Teachings of the Monastery\n\t\t\t{spellID = 202090, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Transfer the Power\n\t\t\t{spellID = 195321, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Hit Combo\n\t\t\t{spellID = 196741, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Touch of Death\n\t\t\t{spellID = 115080, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Heavy Stagger\n\t\t\t{spellID = 124273, unitID = \"player\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Keg Smash\n\t\t\t{spellID = 121253, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Breath of Fire\n\t\t\t{spellID = 123725, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Exploding Keg\n\t\t\t{spellID = 214326, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Paralysis\n\t\t\t{spellID = 115078, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Detox\n\t\t\t{spellID = 115450, filter = \"CD\"},\n\t\t\t-- Spear Hand Strike\n\t\t\t{spellID = 116705, filter = \"CD\"},\n\t\t\t-- Paralysis\n\t\t\t{spellID = 115078, filter = \"CD\"},\n\t\t\t-- Expel Harm\n\t\t\t{spellID = 115072, filter = \"CD\"},\n\t\t\t-- Rising Sun Kick\n\t\t\t{spellID = 107428, filter = \"CD\"},\n\t\t\t-- Provoke\n\t\t\t{spellID = 115546, filter = \"CD\"},\n\t\t\t-- Zen Sphere\n\t\t\t{spellID = 124081, filter = \"CD\"},\n\t\t\t-- Chi Wave\n\t\t\t{spellID = 115098, filter = \"CD\"},\n\t\t\t-- Fists of Fury\n\t\t\t{spellID = 113656, filter = \"CD\"},\n\t\t\t-- Chi Burst\n\t\t\t{spellID = 123986, filter = \"CD\"},\n\t\t\t-- Guard\n\t\t\t{spellID = 202162, filter = \"CD\"},\n\t\t\t-- Hurricane Strike\n\t\t\t{spellID = 152175, filter = \"CD\"},\n\t\t\t-- Ring of Peace\n\t\t\t{spellID = 116844, filter = \"CD\"},\n\t\t\t-- Thunder Focus Tea\n\t\t\t{spellID = 116680, filter = \"CD\"},\n\t\t\t-- Dampen Harm\n\t\t\t{spellID = 122278, filter = \"CD\"},\n\t\t\t-- Flying Serpent Kick\n\t\t\t{spellID = 101545, filter = \"CD\"},\n\t\t\t-- Energizing Elixir\n\t\t\t{spellID = 115288, filter = \"CD\"},\n\t\t\t-- Diffuse Magic\n\t\t\t{spellID = 122783, filter = \"CD\"},\n\t\t\t-- Serenity\n\t\t\t{spellID = 152173, filter = \"CD\"},\n\t\t\t-- Touch of Karma\n\t\t\t{spellID = 122470, filter = \"CD\"},\n\t\t\t-- Touch of Death\n\t\t\t{spellID = 115080, filter = \"CD\"},\n\t\t\t-- Nimble Brew\n\t\t\t{spellID = 213664, filter = \"CD\"},\n\t\t\t-- Life Cocoon\n\t\t\t{spellID = 116849, filter = \"CD\"},\n\t\t\t-- Invoke Xuen, the White Tiger\n\t\t\t{spellID = 123904, filter = \"CD\"},\n\t\t\t-- Essence Font\n\t\t\t{spellID = 191837, filter = \"CD\"},\n\t\t\t-- Refreshing Jade Wind\n\t\t\t{spellID = 162530, filter = \"CD\"},\n\t\t\t-- Fortifying Brew\n\t\t\t{spellID = 115203, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"PALADIN\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Inquisition\n\t\t\t{spellID = 84963, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shield of Vengeance\n\t\t\t{spellID = 184662, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Eye for an Eye\n\t\t\t{spellID = 205191, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Crusade\n\t\t\t{spellID = 231895, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Divine Shield\n\t\t\t{spellID = 642, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Guardian of Ancient Kings\n\t\t\t{spellID = 86659, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Holy Avenger\n\t\t\t{spellID = 105809, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Avenging Wrath\n\t\t\t{spellID = 31884, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Seraphim\n\t\t\t{spellID = 152262, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ardent Defender\n\t\t\t{spellID = 31850, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Divine Protection\n\t\t\t{spellID = 498, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Rule of Law\n\t\t\t{spellID = 214202, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shield of the Righteous\n\t\t\t{spellID = 132403, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Speed of Light\n\t\t\t{spellID = 85499, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Divine Purpose\n\t\t\t{spellID = 223819, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Righteous Verdict\n\t\t\t{spellID = 267611, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Blade of Wrath\n\t\t\t{spellID = 281178, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Infusion of Light\n\t\t\t{spellID = 54149, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Grand Crusader\n\t\t\t{spellID = 85416, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- The Fires of Justice\n\t\t\t{spellID = 209785, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Empyrean Power (Azerite Traits)\n\t\t\t{spellID = 286393, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Selfless Healer\n\t\t\t{spellID = 114250, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shining Light\n\t\t\t{spellID = 327510, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Execution Sentence\n\t\t\t{spellID = 343527, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Eye of Tyr\n\t\t\t{spellID = 209202, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Judgment\n\t\t\t{spellID = 197277, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Glimmer of Light\n\t\t\t{spellID = 287280, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Hand of Hindrance\n\t\t\t{spellID = 183218, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Forbearance\n\t\t\t{spellID = 25771, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Repentance\n\t\t\t{spellID = 20066, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Turn Evil\n\t\t\t{spellID = 10326, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Eye of Tyr\n\t\t\t{spellID = 209202, filter = \"CD\"},\n\t\t\t-- Cleanse\n\t\t\t{spellID = 4987, filter = \"CD\"},\n\t\t\t-- Cleanse Toxins\n\t\t\t{spellID = 213644, filter = \"CD\"},\n\t\t\t-- Hand of Reckoning\n\t\t\t{spellID = 62124, filter = \"CD\"},\n\t\t\t-- Rebuke\n\t\t\t{spellID = 96231, filter = \"CD\"},\n\t\t\t-- Hand of Hindrance\n\t\t\t{spellID = 183218, filter = \"CD\"},\n\t\t\t-- Repentance\n\t\t\t{spellID = 20066, filter = \"CD\"},\n\t\t\t-- Hammer of Justice\n\t\t\t{spellID = 853, filter = \"CD\"},\n\t\t\t-- Judgment\n\t\t\t{spellID = 20271, filter = \"CD\"},\n\t\t\t-- Blade of Justice\n\t\t\t{spellID = 184575, filter = \"CD\"},\n\t\t\t-- Hammer of Wrath\n\t\t\t{spellID = 24275, filter = \"CD\"},\n\t\t\t-- Holy Shock\n\t\t\t{spellID = 20473, filter = \"CD\"},\n\t\t\t-- Consecration\n\t\t\t{spellID = 26573, filter = \"CD\"},\n\t\t\t-- Avenger's Shield\n\t\t\t{spellID = 31935, filter = \"CD\"},\n\t\t\t-- Bestow Faith\n\t\t\t{spellID = 223306, filter = \"CD\"},\n\t\t\t-- Light of Dawn\n\t\t\t{spellID = 85222, filter = \"CD\"},\n\t\t\t-- Holy Prism\n\t\t\t{spellID = 114165, filter = \"CD\"},\n\t\t\t-- Blessing of Freedom\n\t\t\t{spellID = 1044, filter = \"CD\"},\n\t\t\t-- Rule of Law\n\t\t\t{spellID = 214202, filter = \"CD\"},\n\t\t\t-- Seraphim\n\t\t\t{spellID = 152262, filter = \"CD\"},\n\t\t\t-- Wake of Ashes\n\t\t\t{spellID = 255937, filter = \"CD\"},\n\t\t\t-- Speed of Light\n\t\t\t{spellID = 85499, filter = \"CD\"},\n\t\t\t-- Divine Protection\n\t\t\t{spellID = 498, filter = \"CD\", absID = true},\n\t\t\t-- Execution Sentence\n\t\t\t{spellID = 343527, filter = \"CD\"},\n\t\t\t-- Light's Hammer\n\t\t\t{spellID = 114158, filter = \"CD\"},\n\t\t\t-- Blinding Light\n\t\t\t{spellID = 115750, filter = \"CD\"},\n\t\t\t-- Holy Avenger\n\t\t\t{spellID = 105809, filter = \"CD\"},\n\t\t\t-- Aura Mastery\n\t\t\t{spellID = 31821, filter = \"CD\"},\n\t\t\t-- Blessing of Sacrifice\n\t\t\t{spellID = 6940, filter = \"CD\"},\n\t\t\t-- Avenging Wrath\n\t\t\t{spellID = 31884, filter = \"CD\"},\n\t\t\t-- Shield of Vengeance\n\t\t\t{spellID = 184662, filter = \"CD\"},\n\t\t\t-- Ardent Defender\n\t\t\t{spellID = 31850, filter = \"CD\", absID = true},\n\t\t\t-- Guardian of Ancient Kings\n\t\t\t{spellID = 86659, filter = \"CD\"},\n\t\t\t-- Blessing of Protection\n\t\t\t{spellID = 1022, filter = \"CD\"},\n\t\t\t-- Divine Shield\n\t\t\t{spellID = 642, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"PRIEST\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Atonement\n\t\t\t{spellID = 194384, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Rapture\n\t\t\t{spellID = 47536, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Desperate Prayer\n\t\t\t{spellID = 19236, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Voidform\n\t\t\t{spellID = 194249, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dispersion\n\t\t\t{spellID = 47585, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Apotheosis\n\t\t\t{spellID = 200183, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Blessing of T'uure\n\t\t\t{spellID = 196644, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Spirit of Redemption\n\t\t\t{spellID = 20711, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Divinity\n\t\t\t{spellID = 197030, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Power of the Naaru\n\t\t\t{spellID = 196490, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Archangel\n\t\t\t{spellID = 197862, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Vampiric Embrace\n\t\t\t{spellID = 15286, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Focused Will\n\t\t\t{spellID = 45242, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Spectral Guise\n\t\t\t{spellID = 112833, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Fade\n\t\t\t{spellID = 586, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Spirit Shell\n\t\t\t{spellID = 109964, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\t\t\t-- Power Word: Shield\n\t\t\t{spellID = 17, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Renew\n\t\t\t{spellID = 139, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Power of the Dark Side\n\t\t\t{spellID = 198069, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Lingering Insanity\n\t\t\t--BETA {spellID = 197937, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shadowy Insight\n\t\t\t{spellID = 124430, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Surge of Light\n\t\t\t{spellID = 114255, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Surge of Darkness\n\t\t\t{spellID = 87160, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Twist of Fate\n\t\t\t{spellID = 123254, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Schism\n\t\t\t{spellID = 214621, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Weakened Soul\n\t\t\t{spellID = 6788, unitID = \"player\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DE/BUFF_BAR\",\n\t\t\tDirection = \"UP\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 186,\n\t\t\tPosition = {\"LEFT\", T_DE_BUFF_BAR_Anchor},\n\n\t\t\t-- Renew\n\t\t\t{spellID = 139, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Prayer of Mending\n\t\t\t{spellID = 41635, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Guardian Spirit\n\t\t\t{spellID = 47788, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Pain Suppression\n\t\t\t{spellID = 33206, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Vampiric Touch\n\t\t\t{spellID = 34914, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Shadow Word: Pain\n\t\t\t{spellID = 589, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Devouring Plague\n\t\t\t{spellID = 335467, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Purge the Wicked\n\t\t\t{spellID = 204197, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Light of T'uure\n\t\t\t{spellID = 208065, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Shackle Undead\n\t\t\t{spellID = 9484, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Psychic Scream\n\t\t\t{spellID = 8122, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Purify\n\t\t\t{spellID = 527, filter = \"CD\"},\n\t\t\t-- Mass Dispel\n\t\t\t{spellID = 32375, filter = \"CD\"},\n\t\t\t-- Penance\n\t\t\t{spellID = 47540, filter = \"CD\"},\n\t\t\t-- Mind Blast\n\t\t\t{spellID = 8092, filter = \"CD\"},\n\t\t\t-- Power Word: Shield\n\t\t\t{spellID = 17, filter = \"CD\"},\n\t\t\t-- Shadow Word: Death\n\t\t\t{spellID = 32379, filter = \"CD\"},\n\t\t\t-- Circle of Healing\n\t\t\t{spellID = 204883, filter = \"CD\"},\n\t\t\t-- Angelic Feather\n\t\t\t{spellID = 121536, filter = \"CD\"},\n\t\t\t-- Prayer of Mending\n\t\t\t{spellID = 33076, filter = \"CD\"},\n\t\t\t-- Divine Star\n\t\t\t{spellID = 110744, filter = \"CD\"},\n\t\t\t-- Archangel\n\t\t\t{spellID = 197862, filter = \"CD\"},\n\t\t\t-- Holy Word: Sanctify\n\t\t\t{spellID = 34861, filter = \"CD\"},\n\t\t\t-- Holy Word: Chastise\n\t\t\t{spellID = 88625, filter = \"CD\"},\n\t\t\t-- Holy Word: Serenity\n\t\t\t{spellID = 2050, filter = \"CD\"},\n\t\t\t-- Spectral Guise\n\t\t\t{spellID = 112833, filter = \"CD\"},\n\t\t\t-- Fade\n\t\t\t{spellID = 586, filter = \"CD\"},\n\t\t\t-- Halo\n\t\t\t{spellID = 120517, filter = \"CD\"},\n\t\t\t-- Psychic Scream\n\t\t\t{spellID = 8122, filter = \"CD\"},\n\t\t\t-- Psychic Horror\n\t\t\t{spellID = 64044, filter = \"CD\"},\n\t\t\t-- Silence\n\t\t\t{spellID = 15487, filter = \"CD\"},\n\t\t\t-- Leap of Faith\n\t\t\t{spellID = 73325, filter = \"CD\"},\n\t\t\t-- Power Infusion\n\t\t\t{spellID = 10060, filter = \"CD\"},\n\t\t\t-- Dispersion\n\t\t\t{spellID = 47585, filter = \"CD\"},\n\t\t\t-- Desperate Prayer\n\t\t\t{spellID = 19236, filter = \"CD\"},\n\t\t\t-- Shining Force\n\t\t\t{spellID = 204263, filter = \"CD\"},\n\t\t\t-- Pain Suppression\n\t\t\t{spellID = 33206, filter = \"CD\"},\n\t\t\t-- Guardian Spirit\n\t\t\t{spellID = 47788, filter = \"CD\"},\n\t\t\t-- Power Word: Barrier\n\t\t\t{spellID = 62618, filter = \"CD\"},\n\t\t\t-- Divine Hymn\n\t\t\t{spellID = 64843, filter = \"CD\"},\n\t\t\t-- Symbol of Hope\n\t\t\t{spellID = 64901, filter = \"CD\"},\n\t\t\t-- Apotheosis\n\t\t\t{spellID = 200183, filter = \"CD\"},\n\t\t\t-- Shadowfiend\n\t\t\t{spellID = 34433, filter = \"CD\"},\n\t\t\t-- Void Eruption\n\t\t\t{spellID = 228260, filter = \"CD\"},\n\t\t\t-- Light of T'uure\n\t\t\t{spellID = 208065, filter = \"CD\"},\n\t\t\t-- Light's Wrath\n\t\t\t{spellID = 207946, filter = \"CD\"},\n\t\t\t-- Vampiric Embrace\n\t\t\t{spellID = 15286, filter = \"CD\"},\n\t\t\t-- Power Word: Solace\n\t\t\t{spellID = 129250, filter = \"CD\"},\n\t\t\t-- Power Word: Radiance\n\t\t\t{spellID = 194509, filter = \"CD\"},\n\t\t\t-- Schism\n\t\t\t{spellID = 214621, filter = \"CD\"},\n\t\t\t-- Rapture\n\t\t\t{spellID = 47536, filter = \"CD\"},\n\t\t\t-- Shadow Covenant\n\t\t\t{spellID = 314867, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"ROGUE\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Slice and Dice\n\t\t\t{spellID = 5171, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Adrenaline Rush\n\t\t\t{spellID = 13750, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Evasion\n\t\t\t{spellID = 5277, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Envenom\n\t\t\t{spellID = 32645, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shadow Dance\n\t\t\t{spellID = 185313, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Symbols of Death\n\t\t\t{spellID = 212283, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shadow Blades\n\t\t\t{spellID = 121471, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Curse of the Dreadblades\n\t\t\t{spellID = 208245, unitID = \"player\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Alacrity\n\t\t\t{spellID = 193539, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Master of Subtlety\n\t\t\t{spellID = 31665, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Cloak of Shadows\n\t\t\t{spellID = 31224, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Vanish\n\t\t\t{spellID = 1856, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Combat Readiness\n\t\t\t{spellID = 74001, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Combat Insight\n\t\t\t{spellID = 74002, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shadow Reflection\n\t\t\t{spellID = 152151, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Cheating Death\n\t\t\t{spellID = 45182, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Blade Flurry\n\t\t\t{spellID = 13877, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Burst of Speed\n\t\t\t{spellID = 108212, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Sprint\n\t\t\t{spellID = 2983, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Feint\n\t\t\t{spellID = 1966, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Subterfuge\n\t\t\t{spellID = 115192, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dreadblades\n\t\t\t{spellID = 343142, unitID = \"player\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Shuriken Combo\n\t\t\t{spellID = 245640, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Jolly Roger\n\t\t\t{spellID = 199603, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Grand Melee\n\t\t\t{spellID = 193358, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- True Bearing\n\t\t\t{spellID = 193359, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Buried Treasure\n\t\t\t{spellID = 199600, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Broadsides\n\t\t\t{spellID = 193356, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shark Infested Waters\n\t\t\t{spellID = 193357, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Opportunity\n\t\t\t{spellID = 195627, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Audacity\n\t\t\t{spellID = 386270, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Rupture\n\t\t\t{spellID = 1943, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Garrote\n\t\t\t{spellID = 703, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Gouge\n\t\t\t{spellID = 1776, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Hemorrhage\n\t\t\t{spellID = 16511, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Find Weakness\n\t\t\t{spellID = 91021, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Vendetta\n\t\t\t{spellID = 79140, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Nightblade\n\t\t\t{spellID = 195452, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Ghostly Strike\n\t\t\t{spellID = 196937, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Deadly Poison\n\t\t\t{spellID = 2818, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Crippling Poison\n\t\t\t{spellID = 3409, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Wound Poison\n\t\t\t{spellID = 8680, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Crimson Tempest\n\t\t\t{spellID = 121411, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Blind\n\t\t\t{spellID = 2094, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Sap\n\t\t\t{spellID = 6770, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Stealth\n\t\t\t{spellID = 1784, filter = \"CD\"},\n\t\t\t-- Kick\n\t\t\t{spellID = 1766, filter = \"CD\"},\n\t\t\t-- Gouge\n\t\t\t{spellID = 1776, filter = \"CD\"},\n\t\t\t-- Kidney Shot\n\t\t\t{spellID = 408, filter = \"CD\"},\n\t\t\t-- Death from Above\n\t\t\t{spellID = 152150, filter = \"CD\"},\n\t\t\t-- Sprint\n\t\t\t{spellID = 2983, filter = \"CD\"},\n\t\t\t-- Shadow Dance\n\t\t\t{spellID = 185313, filter = \"CD\"},\n\t\t\t-- Marked for Death\n\t\t\t{spellID = 137619, filter = \"CD\"},\n\t\t\t-- Killing Spree\n\t\t\t{spellID = 51690, filter = \"CD\"},\n\t\t\t-- Vendetta\n\t\t\t{spellID = 79140, filter = \"CD\"},\n\t\t\t-- Shadow Reflection\n\t\t\t{spellID = 152151, filter = \"CD\"},\n\t\t\t-- Combat Readiness\n\t\t\t{spellID = 74001, filter = \"CD\"},\n\t\t\t-- Vanish\n\t\t\t{spellID = 1856, filter = \"CD\"},\n\t\t\t-- Adrenaline Rush\n\t\t\t{spellID = 13750, filter = \"CD\"},\n\t\t\t-- Between the Eyes\n\t\t\t{spellID = 315341, filter = \"CD\"},\n\t\t\t-- Riposte\n\t\t\t{spellID = 199754, filter = \"CD\"},\n\t\t\t-- Cloak of Shadows\n\t\t\t{spellID = 31224, filter = \"CD\"},\n\t\t\t-- Grappling Hook\n\t\t\t{spellID = 195457, filter = \"CD\"},\n\t\t\t-- Crimson Vial\n\t\t\t{spellID = 185311, filter = \"CD\"},\n\t\t\t-- Garrote\n\t\t\t{spellID = 703, filter = \"CD\"},\n\t\t\t-- Exsanguinate\n\t\t\t{spellID = 200806, filter = \"CD\"},\n\t\t\t-- Shadowstep\n\t\t\t{spellID = 36554, filter = \"CD\"},\n\t\t\t-- Evasion\n\t\t\t{spellID = 5277, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"SHAMAN\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Elemental Mastery\n\t\t\t{spellID = 16166, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ascendance\n\t\t\t{spellID = 114049, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Spiritwalker's Grace\n\t\t\t{spellID = 79206, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Unleash Life\n\t\t\t{spellID = 73685, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Doom Winds\n\t\t\t{spellID = 204945, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Landslide\n\t\t\t{spellID = 202004, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Stone Bulwark\n\t\t\t{spellID = 114893, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ancestral Guidance\n\t\t\t{spellID = 108281, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Astral Shift\n\t\t\t{spellID = 108271, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Fury of Air\n\t\t\t{spellID = 197211, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Windsong\n\t\t\t--BETA {spellID = 201898, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Lava Surge\n\t\t\t{spellID = 77762, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Elemental Blast\n\t\t\t{spellID = 118522, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Tidal Waves\n\t\t\t{spellID = 53390, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Stormlash\n\t\t\t{spellID = 195222, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Stormbringer\n\t\t\t{spellID = 201846, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Crash Lightning\n\t\t\t{spellID = 187878, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Frostbrand\n\t\t\t--BETA {spellID = 196834, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Flametongue\n\t\t\t{spellID = 194084, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Stormstrike\n\t\t\t{spellID = 17364, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Flame Shock\n\t\t\t{spellID = 188389, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Frost Shock\n\t\t\t{spellID = 196840, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Earthgrab\n\t\t\t{spellID = 64695, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Earthen Spike\n\t\t\t--BETA {spellID = 188089, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DE/BUFF_BAR\",\n\t\t\tDirection = \"UP\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 186,\n\t\t\tPosition = {\"LEFT\", T_DE_BUFF_BAR_Anchor},\n\n\t\t\t-- Earth Shield\n\t\t\t{spellID = 204288, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Riptide\n\t\t\t{spellID = 61295, unitID = \"target\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Hex\n\t\t\t{spellID = 51514, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Cleanse Spirit\n\t\t\t{spellID = 51886, filter = \"CD\"},\n\t\t\t-- Wind Shear\n\t\t\t{spellID = 57994, filter = \"CD\"},\n\t\t\t-- Hex\n\t\t\t{spellID = 51514, filter = \"CD\"},\n\t\t\t-- Riptide\n\t\t\t{spellID = 61295, filter = \"CD\"},\n\t\t\t-- Healing Rain\n\t\t\t{spellID = 73920, filter = \"CD\"},\n\t\t\t-- Crash Lightning\n\t\t\t{spellID = 187874, filter = \"CD\"},\n\t\t\t-- Stormstrike\n\t\t\t{spellID = 17364, filter = \"CD\"},\n\t\t\t-- Lava Burst\n\t\t\t{spellID = 51505, filter = \"CD\"},\n\t\t\t-- Elemental Blast\n\t\t\t{spellID = 117014, filter = \"CD\"},\n\t\t\t-- Flametongue\n\t\t\t--BETA {spellID = 193796, filter = \"CD\"},\n\t\t\t-- Feral Lunge\n\t\t\t{spellID = 196884, filter = \"CD\"},\n\t\t\t-- Cloudburst Totem\n\t\t\t{spellID = 157153, filter = \"CD\"},\n\t\t\t-- Earthbind Totem\n\t\t\t{spellID = 2484, filter = \"CD\"},\n\t\t\t-- Thunderstorm\n\t\t\t{spellID = 51490, filter = \"CD\"},\n\t\t\t-- Windsong\n\t\t\t--BETA {spellID = 201898, filter = \"CD\"},\n\t\t\t-- Stone Bulwark Totem\n\t\t\t{spellID = 108270, filter = \"CD\"},\n\t\t\t-- Capacitor Totem\n\t\t\t{spellID = 192058, filter = \"CD\"},\n\t\t\t-- Doom Winds\n\t\t\t{spellID = 204945, filter = \"CD\"},\n\t\t\t-- Astral Shift\n\t\t\t{spellID = 108271, filter = \"CD\"},\n\t\t\t-- Ancestral Guidance\n\t\t\t{spellID = 108281, filter = \"CD\"},\n\t\t\t-- Spiritwalker's Grace\n\t\t\t{spellID = 79206, filter = \"CD\"},\n\t\t\t-- Feral Spirit\n\t\t\t{spellID = 51533, filter = \"CD\"},\n\t\t\t-- Ascendance\n\t\t\t{spellID = 114049, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"WARLOCK\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- Dark Soul: Misery\n\t\t\t{spellID = 113860, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dark Soul: Instability\n\t\t\t{spellID = 113858, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Deadwind Harvester\n\t\t\t{spellID = 216708, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Unending Resolve\n\t\t\t{spellID = 104773, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Soul Harvest\n\t\t\t{spellID = 196098, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Empowered Life Tap\n\t\t\t{spellID = 235156, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Soul Swap\n\t\t\t{spellID = 86211, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Dark Regeneration\n\t\t\t{spellID = 108359, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Burning Rush\n\t\t\t{spellID = 111400, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Sacrificial Pact\n\t\t\t{spellID = 108416, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Healthstone\n\t\t\t{spellID = 6262, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Nether Ward\n\t\t\t{spellID = 212295, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Buffs\n\t\t\t-- Backdraft\n\t\t\t{spellID = 117828, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Grimore of Synergy\n\t\t\t{spellID = 171982, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Enslave Demon\n\t\t\t{spellID = 1098, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DE/BUFF_BAR\",\n\t\t\tDirection = \"UP\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 186,\n\t\t\tPosition = {\"LEFT\", T_DE_BUFF_BAR_Anchor},\n\n\t\t\t-- Havoc\n\t\t\t{spellID = 80240, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Doom\n\t\t\t{spellID = 603, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Agony\n\t\t\t{spellID = 980, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Corruption\n\t\t\t{spellID = 146739, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Seed of Corruption\n\t\t\t{spellID = 27243, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Immolate\n\t\t\t{spellID = 348, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Unstable Affliction\n\t\t\t{spellID = 316099, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Unstable Affliction (PvP Talent)\n\t\t\t{spellID = 342938, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Siphon Life\n\t\t\t{spellID = 63106, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Soul Effigy\n\t\t\t{spellID = 205178, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Phantom Singularity\n\t\t\t{spellID = 205179, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Haunt\n\t\t\t{spellID = 48181, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Shadowflame\n\t\t\t{spellID = 205181, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Eradication\n\t\t\t{spellID = 196414, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_CC\",\n\t\t\tDirection = \"DOWN\",\n\t\t\tIconSide = \"LEFT\",\n\t\t\tMode = \"BAR\",\n\t\t\tInterval = 3,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = 25,\n\t\t\tBarWidth = 189,\n\t\t\tPosition = {\"LEFT\", PVE_PVP_CC_Anchor},\n\n\t\t\t-- Banish\n\t\t\t{spellID = 710, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Fear\n\t\t\t{spellID = 118699, unitID = \"focus\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Devour Magic (Felhunter)\n\t\t\t{spellID = 19505, filter = \"CD\"},\n\t\t\t-- Spell Lock (Felhunter)\n\t\t\t{spellID = 19647, filter = \"CD\"},\n\t\t\t-- Shadowfury\n\t\t\t{spellID = 30283, filter = \"CD\"},\n\t\t\t-- Howl of Terror\n\t\t\t{spellID = 5484, filter = \"CD\"},\n\t\t\t-- Mortal Coil\n\t\t\t{spellID = 6789, filter = \"CD\"},\n\t\t\t-- Demonic Circle\n\t\t\t{spellID = 48018, filter = \"CD\"},\n\t\t\t-- Felstorm\n\t\t\t{spellID = 89751, filter = \"CD\"},\n\t\t\t-- Cataclysm\n\t\t\t{spellID = 152108, filter = \"CD\"},\n\t\t\t-- Soul Harvest\n\t\t\t{spellID = 196098, filter = \"CD\"},\n\t\t\t-- Grimoire of Service\n\t\t\t{spellID = 108501, filter = \"CD\"},\n\t\t\t-- Shadowflame\n\t\t\t{spellID = 205181, filter = \"CD\"},\n\t\t\t-- Summon Darkglare\n\t\t\t{spellID = 205180, filter = \"CD\"},\n\t\t\t-- Deathbolt\n\t\t\t{spellID = 264106, filter = \"CD\"},\n\t\t\t-- Phantom Singularity\n\t\t\t{spellID = 205179, filter = \"CD\"},\n\t\t\t-- Unending Resolve\n\t\t\t{spellID = 104773, filter = \"CD\"},\n\t\t\t-- Dark Pact\n\t\t\t{spellID = 108416, filter = \"CD\"},\n\t\t\t-- Nether Ward (PvP)\n\t\t\t{spellID = 212295, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"WARRIOR\"] = {\n\t\t{\n\t\t\tName = \"P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_BUFF_ICON_Anchor},\n\n\t\t\t-- In For The Kill\n\t\t\t{spellID = 248622, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Deadly Calm\n\t\t\t{spellID = 262228, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Sweeping Strikes\n\t\t\t{spellID = 260708, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ignore Pain\n\t\t\t{spellID = 190456, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shield Wall\n\t\t\t{spellID = 871, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Last Stand\n\t\t\t{spellID = 12975, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Enraged Regeneration\n\t\t\t{spellID = 184364, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shield Block\n\t\t\t{spellID = 2565, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Spell Reflection\n\t\t\t{spellID = 23920, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Ravager\n\t\t\t{spellID = 152277, unitID = \"player\", caster = \"player\", filter = \"BUFF\", spec = 3},\n\t\t\t-- Die by the Sword\n\t\t\t{spellID = 118038, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Berserker Rage\n\t\t\t{spellID = 18499, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Avatar\n\t\t\t{spellID = 107574, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Recklesness\n\t\t\t{spellID = 1719, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"P_PROC_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", P_PROC_ICON_Anchor},\n\n\t\t\t-- Victorious\n\t\t\t{spellID = 32216, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Overpower\n\t\t\t{spellID = 7384, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Frothing Berserker\n\t\t\t{spellID = 215572, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Furious Slash\n\t\t\t{spellID = 202539, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Vengeance: Ignore Pain\n\t\t\t{spellID = 202574, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Sudden Death\n\t\t\t{spellID = 52437, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Meat Cleaver\n\t\t\t{spellID = 85739, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Enrage\n\t\t\t{spellID = 184362, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"T_DEBUFF_ICON\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", T_DEBUFF_ICON_Anchor},\n\n\t\t\t-- Siegebreaker\n\t\t\t{spellID = 280773, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Rend\n\t\t\t{spellID = 772, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Colossus Smash\n\t\t\t{spellID = 167105, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Hamstring\n\t\t\t{spellID = 1715, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Demoralizing Shout\n\t\t\t{spellID = 1160, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"COOLDOWN\",\n\t\t\tDirection = \"RIGHT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.cooldown_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.cooldown_size,\n\t\t\tPosition = {\"TOP\", COOLDOWN_Anchor},\n\n\t\t\t-- Self\n\t\t\t-- Pummel\n\t\t\t{spellID = 6552, filter = \"CD\"},\n\t\t\t-- Shield Slam\n\t\t\t{spellID = 23922, filter = \"CD\"},\n\t\t\t-- Shockwave\n\t\t\t{spellID = 46968, filter = \"CD\"},\n\t\t\t-- Storm Bolt\n\t\t\t{spellID = 107570, filter = \"CD\"},\n\t\t\t-- Thunder Clap\n\t\t\t{spellID = 6343, filter = \"CD\"},\n\t\t\t-- Taunt\n\t\t\t{spellID = 355, filter = \"CD\"},\n\t\t\t-- Colossus Smash\n\t\t\t{spellID = 167105, filter = \"CD\"},\n\t\t\t-- Charge\n\t\t\t{spellID = 100, filter = \"CD\"},\n\t\t\t-- Spell Reflection\n\t\t\t{spellID = 23920, filter = \"CD\"},\n\t\t\t-- Berserker Rage\n\t\t\t{spellID = 18499, filter = \"CD\"},\n\t\t\t-- Heroic Leap\n\t\t\t{spellID = 6544, filter = \"CD\"},\n\t\t\t-- Demoralizing Shout\n\t\t\t{spellID = 1160, filter = \"CD\"},\n\t\t\t-- Enraged Regeneration\n\t\t\t{spellID = 184364, filter = \"CD\"},\n\t\t\t-- Ravager\n\t\t\t{spellID = 152277, filter = \"CD\"},\n\t\t\t-- Intimidating Shout\n\t\t\t{spellID = 5246, filter = \"CD\"},\n\t\t\t-- Last Stand\n\t\t\t{spellID = 12975, filter = \"CD\"},\n\t\t\t-- Rallying Cry\n\t\t\t{spellID = 97462, filter = \"CD\"},\n\t\t\t-- Shield Wall\n\t\t\t{spellID = 871, filter = \"CD\"},\n\t\t\t-- Odyn's Fury\n\t\t\t{spellID = 205545, filter = \"CD\"},\n\t\t\t-- Battle Cry\n\t\t\t{spellID = 1719, filter = \"CD\"},\n\t\t\t-- Avatar\n\t\t\t{spellID = 107574, filter = \"CD\"},\n\t\t\t-- Siegebreaker\n\t\t\t{spellID = 280772, filter = \"CD\"},\n\t\t\t-- Heroic Throw\n\t\t\t{spellID = 57755, filter = \"CD\"},\n\t\t\t-- Dragon Roar\n\t\t\t{spellID = 118000, filter = \"CD\"},\n\t\t\t-- Execute (Fury)\n\t\t\t{spellID = 5308, filter = \"CD\"},\n\t\t},\n\t},\n\t[\"ALL\"] = {\n\t\t{\n\t\t\tName = \"SPECIAL_P_BUFF_ICON\",\n\t\t\tDirection = \"LEFT\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.buffs_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.buffs_size,\n\t\t\tPosition = {\"TOP\", SPECIAL_P_BUFF_ICON_Anchor},\n\n\t\t\t-- Potions: Power\n\t\t\t-- Elemental Potion of Power\n\t\t\t{spellID = 371024, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Elemental Potion of Ultimate Power\n\t\t\t{spellID = 371028, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\n\t\t\t-- Potions: Miscellaneous\n\t\t\t-- Invisible [Potion of the Hushed Zephyr]\n\t\t\t{spellID = 371124, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\n\t\t\t-- Raid Amplifiers\n\t\t\t-- Bloodlust\n\t\t\t{spellID = 2825, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Heroism\n\t\t\t{spellID = 32182, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Primal Rage [Hunter's pet]\n\t\t\t{spellID = 264667, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true},\n\t\t\t-- Time Warp\n\t\t\t{spellID = 80353, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Fury of the Aspects\n\t\t\t{spellID = 390386, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Feral Hide Drums\n\t\t\t{spellID = 381301, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Mallet of Thunderous Skins\n\t\t\t{spellID = 292686, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Power Infusion\n\t\t\t{spellID = 10060, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\n\t\t\t-- Engineering\n\t\t\t-- Goblin Glider [Goblin Glider Kit]\n\t\t\t{spellID = 126389, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true},\n\t\t\t-- Nitro Boosts\n\t\t\t{spellID = 54861, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Parachute\n\t\t\t{spellID = 55001, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Shieldtronic Shield\n\t\t\t{spellID = 173260, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true},\n\n\t\t\t-- Racial\n\t\t\t-- Berserking (Troll)\n\t\t\t{spellID = 26297, unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true},\n\t\t\t-- Blood Fury (Orc)\n\t\t\t{spellID = 20572, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Darkflight (Worgen)\n\t\t\t{spellID = 68992, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Gift of the Naaru (Draenei)\n\t\t\t{spellID = 28880, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Shadowmeld (Night Elf)\n\t\t\t{spellID = 58984, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Stoneform (Dwarf)\n\t\t\t{spellID = 65116, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\t\t\t-- Fireblood (Dark Iron Dwarf)\n\t\t\t{spellID = 265221, unitID = \"player\", caster = \"player\", filter = \"BUFF\"},\n\n\t\t\t-- Zone Buffs\n\t\t\t-- Inactive (Battlegrounds)\n\t\t\t{spellID = 43681, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Speed (Battlegrounds)\n\t\t\t{spellID = 23451, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true},\n\t\t\t-- Strange Feeling (Brawler's Guild)\n\t\t\t{spellID = 134851, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\n\t\t\t-- Damage Reduction\n\t\t\t-- Life Cocoon\n\t\t\t{spellID = 116849, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Guardian Spirit\n\t\t\t{spellID = 47788, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Pain Suppression\n\t\t\t{spellID = 33206, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Ironbark\n\t\t\t{spellID = 102342, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Aura Mastery\n\t\t\t{spellID = 31821, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Protection\n\t\t\t{spellID = 1022, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Sacrifice\n\t\t\t{spellID = 6940, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Spellwarding\n\t\t\t{spellID = 204018, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Vigilance\n\t\t\t{spellID = 114030, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Rallying Cry\n\t\t\t{spellID = 97463, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Darkness\n\t\t\t{spellID = 209426, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\n\t\t\t-- Other\n\t\t\t-- Symbol of Hope\n\t\t\t{spellID = 64901, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Innervate\n\t\t\t{spellID = 29166, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Grounding Totem\n\t\t\t{spellID = 8178, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Mass Spell Reflection\n\t\t\t{spellID = 213915, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Tiger's Lust\n\t\t\t{spellID = 116841, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Body and Soul\n\t\t\t{spellID = 65081, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Angelic Feather\n\t\t\t{spellID = 121557, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Stampeding Roar\n\t\t\t{spellID = 77764, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Freedom\n\t\t\t{spellID = 1044, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Time Spiral\n\t\t\t{spellID = 375226, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Tricks of the Trade\n\t\t\t{spellID = 57934, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Slow Fall\n\t\t\t{spellID = 130, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Levitate\n\t\t\t{spellID = 1706, unitID = \"player\", caster = \"all\", filter = \"BUFF\"},\n\t\t},\n\t\t{\n\t\t\tName = \"PVE/PVP_DEBUFF\",\n\t\t\tDirection = \"UP\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.pvp_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.pvp_size,\n\t\t\tPosition = {\"TOP\", PVE_PVP_DEBUFF_Anchor},\n\n\t\t\t-- Crowd Controls\n\t\t\t-- Death Knight\n\t\t\t-- Asphyxiate\n\t\t\t{spellID = 108194, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Monstrous Blow (Mutated Ghoul)\n\t\t\t{spellID = 91797, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Gnaw (Ghoul)\n\t\t\t{spellID = 91800, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Dead of Winter\n\t\t\t{spellID = 287254, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Blinding Sleet\n\t\t\t{spellID = 207167, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Demon Hunter\n\t\t\t-- Imprison\n\t\t\t{spellID = 217832, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Fel Eruption\n\t\t\t{spellID = 211881, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Chaos Nova\n\t\t\t{spellID = 179057, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Illidan's Grasp\n\t\t\t{spellID = 205630, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Sigil of Misery\n\t\t\t{spellID = 207685, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Druid\n\t\t\t-- Cyclone\n\t\t\t{spellID = 33786, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Incapacitating Roar\n\t\t\t{spellID = 99, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mighty Bash\n\t\t\t{spellID = 5211, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Maim\n\t\t\t{spellID = 22570, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Rake\n\t\t\t{spellID = 163505, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\n\t\t\t-- Evoker\n\t\t\t-- Sleep Walk\n\t\t\t{spellID = 360806, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Hunter\n\t\t\t-- Freezing Trap\n\t\t\t{spellID = 3355, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Intimidation\n\t\t\t{spellID = 24394, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Scatter Shot\n\t\t\t{spellID = 213691, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Mage\n\t\t\t-- Polymorph\n\t\t\t{spellID = 118, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Ring of Frost\n\t\t\t{spellID = 82691, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Dragon's Breath\n\t\t\t{spellID = 31661, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Monk\n\t\t\t-- Paralysis\n\t\t\t{spellID = 115078, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Leg Sweep\n\t\t\t{spellID = 119381, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Fists of Fury\n\t\t\t{spellID = 120086, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Song of Chi-Ji\n\t\t\t{spellID = 198898, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Paladin\n\t\t\t-- Repentance\n\t\t\t{spellID = 20066, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Hammer of Justice\n\t\t\t{spellID = 853, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Blinding Light\n\t\t\t{spellID = 105421, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Priest\n\t\t\t-- Dominate Mind\n\t\t\t{spellID = 605, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Psychic Horror\n\t\t\t{spellID = 64044, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Psychic Scream\n\t\t\t{spellID = 8122, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mind Bomb\n\t\t\t{spellID = 205369, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Sin and Punishment\n\t\t\t{spellID = 87204, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Holy Word: Chastise\n\t\t\t{spellID = 200196, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mindgames\n\t\t\t{spellID = 323673, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Rogue\n\t\t\t-- Sap\n\t\t\t{spellID = 6770, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Blind\n\t\t\t{spellID = 2094, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Cheap Shot\n\t\t\t{spellID = 1833, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Kidney Shot\n\t\t\t{spellID = 408, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Gouge\n\t\t\t{spellID = 1776, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Shaman\n\t\t\t-- Hex\n\t\t\t{spellID = 51514, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Static Charge\n\t\t\t{spellID = 118905, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Pulverize (Earth Elemental)\n\t\t\t{spellID = 118345, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Sundering\n\t\t\t{spellID = 197214, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Lightning Lasso (PvP Talent)\n\t\t\t{spellID = 204437, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Earthfury (PvP Talent)\n\t\t\t{spellID = 204399, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Warlock\n\t\t\t-- Fear\n\t\t\t{spellID = 118699, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Seduction (Succubus)\n\t\t\t{spellID = 6358, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mesmerize (Shivarra)\n\t\t\t{spellID = 115268, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Howl of Terror\n\t\t\t{spellID = 5484, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Axe Toss (Felguard)\n\t\t\t{spellID = 89766, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Shadowfury\n\t\t\t{spellID = 30283, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mortal Coil\n\t\t\t{spellID = 6789, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Meteor Strike (Abyssal)\n\t\t\t{spellID = 171156, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Warrior\n\t\t\t-- Intimidating Shout\n\t\t\t{spellID = 5246, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Storm Bolt\n\t\t\t{spellID = 132169, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Shockwave\n\t\t\t{spellID = 132168, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Warpath (Prot PvP Talent)\n\t\t\t{spellID = 199085, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Covenant\n\t\t\t-- Sulfuric Emission (Necrolord - Emeni Trait)\n\t\t\t{spellID = 324263, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Agent of Chaos (Venthyr - Nadjia Trait)\n\t\t\t{spellID = 331866, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Sparkling Driftglobe Core (Kyrian - Mikanikos Trait)\n\t\t\t{spellID = 332423, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Racial\n\t\t\t-- Quaking Palm (Pandaren)\n\t\t\t{spellID = 107079, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- War Stomp (Tauren)\n\t\t\t{spellID = 20549, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Bull Rush (Highmountain Tauren)\n\t\t\t{spellID = 255654, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Haymaker (Kul Tiran)\n\t\t\t{spellID = 287712, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Silences\n\t\t\t-- Strangulate\n\t\t\t{spellID = 47476, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Sigil of Silence\n\t\t\t{spellID = 204490, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Solar Beam\n\t\t\t{spellID = 78675, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Spider Sting\n\t\t\t{spellID = 202933, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Avenger's Shield\n\t\t\t{spellID = 31935, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Silence\n\t\t\t{spellID = 15487, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Garrote\n\t\t\t{spellID = 1330, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Unstable Affliction\n\t\t\t{spellID = 31117, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\n\t\t\t-- Roots\n\t\t\t-- Landslide\n\t\t\t{spellID = 355689, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Chains of Ice\n\t\t\t{spellID = 45524, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Entangling Roots\n\t\t\t{spellID = 339, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mass Entanglement\n\t\t\t{spellID = 102359, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Immobilized\n\t\t\t{spellID = 45334, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Binding Shot\n\t\t\t{spellID = 117526, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Tracker's Net\n\t\t\t{spellID = 212638, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Harpoon\n\t\t\t{spellID = 190925, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Steel Trap\n\t\t\t{spellID = 162480, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Frostbite\n\t\t\t{spellID = 198121, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Frost Nova\n\t\t\t{spellID = 122, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Ice Nova\n\t\t\t{spellID = 157997, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Freeze (Water Elemental)\n\t\t\t{spellID = 33395, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Disable\n\t\t\t{spellID = 116706, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Earthgrab\n\t\t\t{spellID = 64695, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Entrenched in Flame\n\t\t\t{spellID = 233582, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Slows\n\t\t\t-- Infected Wounds\n\t\t\t{spellID = 58180, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Typhoon\n\t\t\t{spellID = 61391, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Permeating Chill\n\t\t\t{spellID = 370898, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Concussive Shot\n\t\t\t{spellID = 5116, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Frost Breath (Chimaera)\n\t\t\t{spellID = 54644, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Bursting Shot\n\t\t\t{spellID = 186387, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Tar Trap\n\t\t\t{spellID = 135299, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Frozen Ammo\n\t\t\t{spellID = 162546, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Caltrops\n\t\t\t{spellID = 194279, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Pistol Shot\n\t\t\t{spellID = 185763, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Warp Time (Warp Stalker)\n\t\t\t{spellID = 35346, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Ankle Crack (Crocolisk)\n\t\t\t{spellID = 50433, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Blast Wave\n\t\t\t{spellID = 157981, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Cone of Cold\n\t\t\t{spellID = 120, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Flurry\n\t\t\t{spellID = 228671, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Slow\n\t\t\t{spellID = 31589, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Frostbolt\n\t\t\t{spellID = 116, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Flurry\n\t\t\t{spellID = 44614, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mind Flay\n\t\t\t{spellID = 15407, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Hand of Hindrance\n\t\t\t{spellID = 183218, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Deadly Throw\n\t\t\t{spellID = 26679, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Crippling Poison\n\t\t\t{spellID = 3409, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Earthbind\n\t\t\t{spellID = 3600, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Earthquake\n\t\t\t{spellID = 77505, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Frost Shock\n\t\t\t{spellID = 196840, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Thunderstorm\n\t\t\t{spellID = 51490, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Cripple (Doomguard)\n\t\t\t{spellID = 170995, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Conflagrate\n\t\t\t{spellID = 17962, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Hamstring\n\t\t\t{spellID = 1715, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Piercing Howl\n\t\t\t{spellID = 12323, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Debilitate (Terrorguard)\n\t\t\t{spellID = 170996, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Other\n\t\t\t-- Dark Simulacrum\n\t\t\t{spellID = 77606, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Shroud of Purgatory\n\t\t\t{spellID = 116888, unitID = \"player\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Cauterize\n\t\t\t{spellID = 87023, unitID = \"player\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Nemesis\n\t\t\t{spellID = 206491, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Touch of Karma\n\t\t\t{spellID = 125174, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Smoke Bomb\n\t\t\t{spellID = 76577, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Rocket Fuel Leak\n\t\t\t{spellID = 94794, unitID = \"player\", caster = \"player\", filter = \"DEBUFF\"},\n\t\t\t-- Duel\n\t\t\t{spellID = 236273, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Mythic+\n\t\t\t-- Necrotic Wound\n\t\t\t{spellID = 209858, unitID = \"player\", caster = \"all\", filter = \"DEBUFF\", count = 16},\n\t\t},\n\t\t{\n\t\t\tName = \"T_BUFF\",\n\t\t\tDirection = \"UP\",\n\t\t\tMode = \"ICON\",\n\t\t\tInterval = C.filger.pvp_space,\n\t\t\tAlpha = 1,\n\t\t\tIconSize = C.filger.pvp_size,\n\t\t\tPosition = {\"TOP\", T_BUFF_Anchor},\n\n\t\t\t-- Death Knight\n\t\t\t-- Anti-Magic Shell\n\t\t\t{spellID = 48707, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Desecrated Ground\n\t\t\t{spellID = 115018, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Lichborne\n\t\t\t{spellID = 287081, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Icebound Fortitude\n\t\t\t{spellID = 48792, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Pillar of Frost\n\t\t\t{spellID = 51271, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Asphyxiate\n\t\t\t{spellID = 108194, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Gnaw (Ghoul)\n\t\t\t{spellID = 91800, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Monstrous Blow (Mutated Ghoul)\n\t\t\t{spellID = 91797, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Strangulate\n\t\t\t{spellID = 47476, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Demon Hunter\n\t\t\t-- Metamorphosis\n\t\t\t{spellID = 162264, unitID = \"target\", caster = \"all\", filter = \"BUFF\", absID = true},\n\t\t\t-- Spectral Sight\n\t\t\t{spellID = 188501, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Netherwalk\n\t\t\t{spellID = 196555, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Nether Bond\n\t\t\t{spellID = 207810, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Soul Barrier\n\t\t\t{spellID = 263648, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Imprison\n\t\t\t{spellID = 217832, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Fel Eruption\n\t\t\t{spellID = 211881, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Chaos Nova\n\t\t\t{spellID = 179057, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Illidan's Grasp\n\t\t\t{spellID = 205630, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Druid\n\t\t\t-- Survival Instincts\n\t\t\t{spellID = 61336, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Barkskin\n\t\t\t{spellID = 22812, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Ironbark\n\t\t\t{spellID = 102342, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Nature's Grasp\n\t\t\t{spellID = 170856, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Stampeding Roar\n\t\t\t{spellID = 77764, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Incarnation: Tree of Life\n\t\t\t{spellID = 117679, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Berserk\n\t\t\t{spellID = 106951, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Cyclone\n\t\t\t{spellID = 33786, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mighty Bash\n\t\t\t{spellID = 5211, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Rake\n\t\t\t{spellID = 163505, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Maim\n\t\t\t{spellID = 22570, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Incapacitating Roar\n\t\t\t{spellID = 99, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Solar Beam\n\t\t\t{spellID = 78675, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Entangling Roots\n\t\t\t{spellID = 339, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Evoker\n\t\t\t-- Debuffs\n\t\t\t-- Sleep Walk\n\t\t\t{spellID = 360806, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Landslide\n\t\t\t{spellID = 355689, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\n\t\t\t-- Hunter\n\t\t\t-- Aspect of the Turtle\n\t\t\t{spellID = 186265, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Feign Death\n\t\t\t{spellID = 5384, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Posthaste\n\t\t\t{spellID = 118922, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Freezing Trap\n\t\t\t{spellID = 3355, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Intimidation\n\t\t\t{spellID = 24394, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Scatter Shot\n\t\t\t{spellID = 213691, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Binding Shot\n\t\t\t{spellID = 117526, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Steel Trap\n\t\t\t{spellID = 162480, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Roar of Sacrifice\n\t\t\t{spellID = 53480, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Mage\n\t\t\t-- Ice Block\n\t\t\t{spellID = 45438, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Invisibility\n\t\t\t{spellID = 66, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Greater Invisibility\n\t\t\t{spellID = 113862, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Combustion\n\t\t\t{spellID = 190319, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Alter Time\n\t\t\t{spellID = 108978, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Temporal Shield\n\t\t\t{spellID = 198111, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Evocation\n\t\t\t{spellID = 12051, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Cauterize\n\t\t\t{spellID = 87023, unitID = \"target\", caster = \"target\", filter = \"DEBUFF\"},\n\t\t\t-- Polymorph\n\t\t\t{spellID = 118, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Ring of Frost\n\t\t\t{spellID = 82691, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Dragon's Breath\n\t\t\t{spellID = 31661, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Monk\n\t\t\t-- Diffuse Magic\n\t\t\t{spellID = 122783, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Touch of Karma\n\t\t\t{spellID = 125174, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Ring of Peace\n\t\t\t{spellID = 116844, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Dampen Harm\n\t\t\t{spellID = 122278, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Nimble Brew\n\t\t\t{spellID = 213664, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Paralysis\n\t\t\t{spellID = 115078, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Leg Sweep\n\t\t\t{spellID = 119381, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Fists of Fury\n\t\t\t{spellID = 120086, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Song of Chi-Ji\n\t\t\t{spellID = 198898, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Paladin\n\t\t\t-- Divine Shield\n\t\t\t{spellID = 642, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Guardian of Ancient Kings\n\t\t\t{spellID = 86659, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Protection\n\t\t\t{spellID = 1022, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Divine Protection\n\t\t\t{spellID = 498, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Ardent Defender\n\t\t\t{spellID = 31850, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Avenging Wrath\n\t\t\t{spellID = 31884, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Aura Mastery\n\t\t\t{spellID = 31821, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Spellwarding\n\t\t\t{spellID = 204018, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Sacrifice\n\t\t\t{spellID = 6940, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Freedom\n\t\t\t{spellID = 1044, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Blessing of Sanctuary\n\t\t\t{spellID = 210256, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Repentance\n\t\t\t{spellID = 20066, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Hammer of Justice\n\t\t\t{spellID = 853, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Blinding Light\n\t\t\t{spellID = 105421, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Turn Evil\n\t\t\t{spellID = 10326, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Avenger's Shield\n\t\t\t{spellID = 31935, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Priest\n\t\t\t-- Dispersion\n\t\t\t{spellID = 47585, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Pain Suppression\n\t\t\t{spellID = 33206, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Guardian Spirit\n\t\t\t{spellID = 47788, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Spectral Guise\n\t\t\t{spellID = 119030, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Phantasm\n\t\t\t{spellID = 114239, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Greater Fade\n\t\t\t--BETA {spellID = 213602, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Holy Ward\n\t\t\t{spellID = 213610, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Dominate Mind\n\t\t\t{spellID = 605, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Psychic Horror\n\t\t\t{spellID = 64044, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Psychic Scream\n\t\t\t{spellID = 8122, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mind Bomb\n\t\t\t{spellID = 205369, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Silence\n\t\t\t{spellID = 15487, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Rogue\n\t\t\t-- Cloak of Shadows\n\t\t\t{spellID = 31224, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Cheating Death\n\t\t\t{spellID = 45182, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Evasion\n\t\t\t{spellID = 5277, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Combat Insight\n\t\t\t{spellID = 74002, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Shadow Dance\n\t\t\t{spellID = 185313, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Sap\n\t\t\t{spellID = 6770, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Blind\n\t\t\t{spellID = 2094, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Cheap Shot\n\t\t\t{spellID = 1833, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Kidney Shot\n\t\t\t{spellID = 408, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Garrote\n\t\t\t{spellID = 1330, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Smoke Bomb\n\t\t\t{spellID = 76577, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Shaman\n\t\t\t-- Grounding Totem\n\t\t\t{spellID = 8178, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Spiritwalker's Grace\n\t\t\t{spellID = 79206, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Astral Shift\n\t\t\t{spellID = 108271, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Ascendance\n\t\t\t{spellID = 114052, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Ethereal Form\n\t\t\t{spellID = 210918, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Hex\n\t\t\t{spellID = 51514, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Static Charge\n\t\t\t{spellID = 118905, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Pulverize (Earth Elemental)\n\t\t\t{spellID = 118345, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Sundering\n\t\t\t{spellID = 197214, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Lightning Lasso (PvP Talent)\n\t\t\t{spellID = 204437, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Earthfury (PvP Talent)\n\t\t\t{spellID = 204399, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Warlock\n\t\t\t-- Soulstone\n\t\t\t{spellID = 20707, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Unending Resolve\n\t\t\t{spellID = 104773, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Nether Ward\n\t\t\t{spellID = 212295, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Banish\n\t\t\t{spellID = 710, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Axe Toss (Felguard)\n\t\t\t{spellID = 89766, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Fear\n\t\t\t{spellID = 118699, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Seduction (Succubus)\n\t\t\t{spellID = 6358, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mesmerize (Shivarra)\n\t\t\t{spellID = 115268, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Howl of Terror\n\t\t\t{spellID = 5484, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Mortal Coil\n\t\t\t{spellID = 6789, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Shadowfury\n\t\t\t{spellID = 30283, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Meteor Strike (Abyssal)\n\t\t\t{spellID = 171156, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Unstable Affliction\n\t\t\t{spellID = 31117, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\n\t\t\t-- Warrior\n\t\t\t-- Bladestorm\n\t\t\t{spellID = 46924, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Spell Reflection\n\t\t\t{spellID = 23920, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Mass Spell Reflection\n\t\t\t{spellID = 213915, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Shield Wall\n\t\t\t{spellID = 871, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Die by the Sword\n\t\t\t{spellID = 118038, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Last Stand\n\t\t\t{spellID = 12975, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Berserker Rage\n\t\t\t{spellID = 18499, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Enraged Regeneration\n\t\t\t{spellID = 184364, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- War Banner\n\t\t\t{spellID = 236321, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Debuffs\n\t\t\t-- Intimidating Shout\n\t\t\t{spellID = 5246, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Storm Bolt\n\t\t\t{spellID = 132169, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\", absID = true},\n\t\t\t-- Shockwave\n\t\t\t{spellID = 132168, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Racial\n\t\t\t-- Quaking Palm (Pandaren)\n\t\t\t{spellID = 107079, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- War Stomp (Tauren)\n\t\t\t{spellID = 20549, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Haymaker (Kul Tiran)\n\t\t\t{spellID = 287712, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\n\t\t\t-- Player vs. Player\n\t\t\t-- Battlegrounds\n\t\t\t-- Netherstorm Flag\n\t\t\t{spellID = 34976, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Orb of Power\n\t\t\t{spellID = 121175, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Warsong Flag\n\t\t\t{spellID = 23333, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t{spellID = 23335, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Seaforium Bombs\n\t\t\t{spellID = 66271, unitID = \"target\", caster = \"all\", filter = \"DEBUFF\"},\n\t\t\t-- Drinking in Arena\n\t\t\t-- Drink\n\t\t\t{spellID = 80167, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Refreshment [Mage Food]\n\t\t\t{spellID = 167152, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t\t-- Food & Drink\n\t\t\t{spellID = 257427, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\n\t\t\t-- Mythic+\n\t\t\t-- Sanguine Ichor\n\t\t\t{spellID = 226510, unitID = \"target\", caster = \"all\", filter = \"BUFF\"},\n\t\t},\n\t},\n}\n\n-- Common colldowns for all classes\nT.CustomFilgerSpell = T.CustomFilgerSpell or {}\ndo\n\t-- Racial\n\tlocal _, race = UnitRace(\"player\")\n\tif race == \"Human\" then\n\t\t-- Will to Survive\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 59752, filter = \"CD\"}})\n\telseif race == \"Orc\" then\n\t\t-- Blood Fury\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 20572, filter = \"CD\"}})\n\telseif race == \"Dwarf\" then\n\t\t-- Stoneform\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 20594, filter = \"CD\"}})\n\telseif race == \"NightElf\" then\n\t\t-- Shadowmeld\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 58984, filter = \"CD\"}})\n\telseif race == \"Scourge\" then\n\t\t-- Will of the Forsaken\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 7744, filter = \"CD\"}})\n\t\t-- Cannibalize\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 20577, filter = \"CD\"}})\n\telseif race == \"Tauren\" then\n\t\t-- War Stomp\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 20549, filter = \"CD\"}})\n\telseif race == \"Gnome\" then\n\t\t-- Escape Artist\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 20589, filter = \"CD\"}})\n\telseif race == \"Troll\" then\n\t\t-- Berserking\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 26297, filter = \"CD\", absID = true}})\n\telseif race == \"Goblin\" then\n\t\t-- Rocket Jump\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 69070, filter = \"CD\"}})\n\telseif race == \"BloodElf\" then\n\t\t-- Arcane Torrent\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 69179, filter = \"CD\"}})\n\telseif race == \"Draenei\" then\n\t\t-- Gift of the Naaru\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 28880, filter = \"CD\"}})\n\telseif race == \"Worgen\" then\n\t\t-- Darkflight\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 68992, filter = \"CD\"}})\n\telseif race == \"Pandaren\" then\n\t\t-- Quaking Palm\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 107079, filter = \"CD\"}})\n\telseif race == \"DarkIronDwarf\" then\n\t\t-- Fireblood\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 265221, filter = \"CD\"}})\n\telseif race == \"KulTiran\" then\n\t\t-- Haymaker\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 287712, filter = \"CD\"}})\n\telseif race == \"HighmountainTauren\" then\n\t\t-- Bull Rush\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 255654, filter = \"CD\"}})\n\telseif race == \"Vulpera\" then\n\t\t-- Bag of Tricks\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 312411, filter = \"CD\"}})\n\telseif race == \"LightforgedDraenei\" then\n\t\t-- Light's Judgment\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 255647, filter = \"CD\"}})\n\telseif race == \"ZandalariTroll\" then\n\t\t-- Regeneratin'\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 291944, filter = \"CD\"}})\n\telseif race == \"MagharOrc\" then\n\t\t-- Ancestral Call\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 274738, filter = \"CD\"}})\n\telseif race == \"Dracthyr\" then\n\t\t-- Tail Swipe\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 368970, filter = \"CD\"}})\n\t\t-- Wing Buffet\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = 357214, filter = \"CD\"}})\n\tend\n\n\t-- Items\n\t-- Back\n\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {slotID = 15, filter = \"CD\"}})\n\t-- Belt\n\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {slotID = 6, filter = \"CD\"}})\n\t-- Gloves\n\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {slotID = 10, filter = \"CD\"}})\n\t-- Neck\n\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {slotID = 2, filter = \"CD\"}})\n\t-- Rings\n\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {slotID = 11, filter = \"CD\"}})\n\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {slotID = 12, filter = \"CD\"}})\n\t-- Trinkets\n\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {slotID = 13, filter = \"CD\"}})\n\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {slotID = 14, filter = \"CD\"}})\n\n\tlocal isTank = {[\"DEATHKNIGHT\"] = true, [\"DEMONHUNTER\"] = true, [\"DRUID\"] = true, [\"MONK\"] = true, [\"PALADIN\"] = true, [\"WARRIOR\"] = true}\n\tlocal isHealer = {[\"DRUID\"] = true, [\"EVOKER\"] = true, [\"MONK\"] = true, [\"PALADIN\"] = true, [\"PRIEST\"] = true, [\"SHAMAN\"] = true}\n\tlocal strengthClass = {[\"DEATHKNIGHT\"] = true, [\"PALADIN\"] = true, [\"WARRIOR\"] = true}\n\tlocal agilityClass = {[\"DEMONHUNTER\"] = true, [\"DRUID\"] = true, [\"HUNTER\"] = true, [\"MONK\"] = true, [\"ROGUE\"] = true, [\"SHAMAN\"] = true}\n\tlocal intellectClass = {[\"DRUID\"] = true, [\"EVOKER\"] = true, [\"MAGE\"] = true, [\"MONK\"] = true, [\"PALADIN\"] = true, [\"PRIEST\"] = true, [\"SHAMAN\"] = true, [\"WARLOCK\"] = true}\n\n\t-- Trinkets\n\tif strengthClass[T.class] then\n\t\t-- Bound by Fire and Blaze [Blazebinder's Hoof]\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 383926, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\t\t-- Bonemaw's Big Toe\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 397400, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\tend\n\n\tif agilityClass[T.class] then\n\t\t-- Bottle of Spiraling Winds\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 383751, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\t\t-- Windswept Pages\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 126483, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\tend\n\n\tif agilityClass[T.class] or strengthClass[T.class] then\n\t\t-- Scent of Blood [Hunger of the Pack]\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 213888, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\t\t-- Algeth'ar Puzzle\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 383781, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\tend\n\n\tif intellectClass[T.class] then\n\t\t-- Power Theft\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 382126, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\tend\n\n\tif isHealer[T.class] then\n\t\t-- Broodkeeper's Promise\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 377462, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\t\t-- Voidmender's Shadowgem\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 397399, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\tend\n\n\t-- Crumbling Power [Irideus Fragment]\n\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 383941, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\t-- Whispering Incarnate Icon\n\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 377452, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\n\t-- Valarjar's Path [Horn of Valor]\n\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = 215956, unitID = \"player\", caster = \"all\", filter = \"BUFF\", absID = true}})\nend\n"
  },
  {
    "path": "ShestakUI/Config/Filters/Nameplates.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.nameplate.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Polymorph -> http://www.wowhead.com/spell=118\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nlocal function SpellName(id)\n\tlocal name = GetSpellInfo(id)\n\tif name then\n\t\treturn name\n\telse\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(id)..\"] no longer exists! Report this to Shestak.|r\")\n\t\treturn \"Empty\"\n\tend\nend\n\nT.DebuffWhiteList = {\n\t-- Death Knight\n\t[SpellName(108194)] = true,\t-- Asphyxiate\n\t[SpellName(47476)] = true,\t-- Strangulate\n\t[SpellName(55078)] = true,\t-- Blood Plague\n\t[SpellName(55095)] = true,\t-- Frost Fever\n\t-- Druid\n\t[SpellName(33786)] = true,\t-- Cyclone\n\t[SpellName(339)] = true,\t-- Entangling Roots\n\t[SpellName(164812)] = true,\t-- Moonfire\n\t[SpellName(164815)] = true,\t-- Sunfire\n\t[SpellName(58180)] = true,\t-- Infected Wounds\n\t[SpellName(155722)] = true,\t-- Rake\n\t[SpellName(1079)] = true,\t-- Rip\n\t-- Evoker\n\t[SpellName(360806)] = true,\t-- Sleep Walk\n\t-- Hunter\n\t[SpellName(3355)] = true,\t-- Freezing Trap\n\t[SpellName(194279)] = true,\t-- Caltrops\n\t[SpellName(13812)] = true,\t-- Explosive Trap\n\t[SpellName(217200)] = true,\t-- Barbed Shot\n\t-- Mage\n\t[SpellName(118)] = true,\t-- Polymorph\n\t[SpellName(31661)] = true,\t-- Dragon's Breath\n\t[SpellName(122)] = true,\t-- Frost Nova\n\t[SpellName(44457)] = true,\t-- Living Bomb\n\t[SpellName(114923)] = true,\t-- Nether Tempest\n\t[SpellName(120)] = true,\t-- Cone of Cold\n\t-- Monk\n\t[SpellName(115078)] = true,\t-- Paralysis\n\t-- Paladin\n\t[SpellName(20066)] = true,\t-- Repentance\n\t[SpellName(853)] = true,\t-- Hammer of Justice\n\t[SpellName(183218)] = true,\t-- Hand of Hindrance\n\t-- Priest\n\t[SpellName(204213)] = true,\t-- Purge the Wicked\n\t[SpellName(9484)] = true,\t-- Shackle Undead\n\t[SpellName(8122)] = true,\t-- Psychic Scream\n\t[SpellName(64044)] = true,\t-- Psychic Horror\n\t[SpellName(15487)] = true,\t-- Silence\n\t[SpellName(589)] = true,\t-- Shadow Word: Pain\n\t[SpellName(34914)] = true,\t-- Vampiric Touch\n\t-- Rogue\n\t[SpellName(6770)] = true,\t-- Sap\n\t[SpellName(2094)] = true,\t-- Blind\n\t[SpellName(1776)] = true,\t-- Gouge\n\t-- Shaman\n\t[SpellName(51514)] = true,\t-- Hex\n\t[SpellName(3600)] = true,\t-- Earthbind\n\t[SpellName(196840)] = true,\t-- Frost Shock\n\t[SpellName(188389)] = true,\t-- Flame Shock\n\t[SpellName(197209)] = true,\t-- Lightning Rod\n\t-- Warlock\n\t[SpellName(710)] = true,\t-- Banish\n\t[SpellName(6789)] = true,\t-- Mortal Coil\n\t[SpellName(5782)] = true,\t-- Fear\n\t[SpellName(5484)] = true,\t-- Howl of Terror\n\t[SpellName(6358)] = true,\t-- Seduction\n\t[SpellName(30283)] = true,\t-- Shadowfury\n\t[SpellName(603)] = true,\t-- Doom\n\t[SpellName(980)] = true,\t-- Agony\n\t[SpellName(146739)] = true,\t-- Corruption\n\t[SpellName(48181)] = true,\t-- Haunt\n\t[SpellName(348)] = true,\t-- Immolate\n\t[SpellName(30108)] = true,\t-- Unstable Affliction\n\t-- Warrior\n\t[SpellName(5246)] = true,\t-- Intimidating Shout\n\t[SpellName(132168)] = true,\t-- Shockwave\n\t[SpellName(115767)] = true,\t-- Deep Wounds\n\t-- Racial\n\t[SpellName(20549)] = true,\t-- War Stomp (Tauren)\n\t[SpellName(107079)] = true,\t-- Quaking Palm (Pandaren)\n}\n\nfor _, spell in pairs(C.nameplate.debuffs_list) do\n\tT.DebuffWhiteList[SpellName(spell)] = true\nend\n\nT.DebuffBlackList = {\n\t-- [SpellName(spellID)] = true,\t-- Spell Name\n}\n\nT.BuffWhiteList = {\n\t[SpellName(226510)] = true,\t-- Sanguine Ichor\n}\n\nfor _, spell in pairs(C.nameplate.buffs_list) do\n\tT.BuffWhiteList[SpellName(spell)] = true\nend\n\nT.BuffBlackList = {\n\t-- [SpellName(spellID)] = true,\t-- Spell Name\n}\n\nT.PlateBlacklist = {\n\t[\"24207\"] = true,\t-- Army of the Dead\n\t[\"29630\"] = true,\t-- Fanged Pit Viper (Gundrak)\n\t[\"55659\"] = true,\t-- Wild Imp\n\t[\"167966\"] = true,\t-- Experimental Sludge (De Other Side)\n}\n\nT.InterruptCast = { -- Yellow border for interruptible cast\n\t-- Algeth'ar Academy\n\t[396812] = true,\t-- Mystic Blast\n\t[332612] = true,\t-- Healing Touch\n\t[377389] = true,\t-- Call of the Flock\n\t[387843] = true,\t-- Astral Bomb\n\t-- The Azure Vault\n\t[370225] = true,\t-- Shriek\n\t-- The Nokhud Offensive\n\t[386024] = true,\t-- Tempest\n\t[373395] = true,\t-- Bloodcurdling Shout\n\t-- Halls of Valor\n\t[215433] = true,\t-- Holy Radiance\n\t-- Shadowmoon Burial Grounds\n\t[152818] = true,\t-- Shadow Mend\n\t-- Temple of the Jade Serpent\n\t[395859] = true,\t-- Haunting Scream\n}\n\nT.ImportantCast = { -- Red border for non-interruptible cast\n\t-- The Nokhud Offensive\n\t[383823] = true,\t-- Rally the Clan\n\t-- Ruby Life Pools\n\t[372743] = true,\t-- Ice Shield\n\t-- Court of Stars\n\t[210261] = true,\t-- Sound Alarm\n}\n\nlocal color = C.nameplate.mob_color\nlocal color_alt = {0, 0.7, 0.6}\nT.ColorPlate = {\n\t-- Algeth'ar Academy\n\t[\"196548\"] = color,\t\t-- Ancient Branch\n\t-- The Azure Vault\n\t[\"187159\"] = color_alt,\t-- Shrieking Whelp\n\t-- The Nokhud Offensive\n\t[\"194894\"] = color,\t\t-- Primalist Stormspeaker\n\t-- Temple of the Jade Serpent\n\t[\"59555\"] = color,\t\t-- Haunting Sha\n\t[\"59545\"] = color,\t\t-- The Golden Beetle\n\t-- Court of Stars\n\t[\"104251\"] = color_alt,\t-- Duskwatch Sentry\n\t-- PvP\n\t[\"5925\"] = color,\t\t-- Grounding Totem\n}\n\nT.ShortNames = {\n\t-- Академия Алгет'ар\n\t[\"Рассерженная стрекотуха\"] = \"Cтрекотуха\",\n\t[\"Мерзкий плеточник\"] = \"Плеточник\",\n\t[\"Алгет'арский охранник\"] = \"Охранник\",\n\t[\"Алгет'арский рыцарь эха\"] = \"Рыцарь\",\n\t[\"Алгет'арская заклинательница\"] = \"Заклинательница\",\n\t[\"Алгет'арский целитель\"] = \"Целитель\",\n\t-- Наступление клана Нокхуд\n\t[\"Мастер копья из клана Нокхуд\"] = \"Мастер копья\",\n\t[\"Лучница из клана Нокхуд\"] = \"Лучница\",\n\t[\"Боевое копье клана Нокхуд\"] = \"Копье\",\n\t[\"Трубач из клана Нокхуд\"] = \"Трубач\",\n\t[\"Нокхудский копейщик\"] = \"Копейщик\",\n\t[\"Громовой кулак из клана Нокхуд\"] = \"Кулак\",\n\t[\"Псарь из клана Нокхуд\"] = \"Псарь\",\n\t[\"Заступник из клана Нокхуд\"] = \"Заступник\",\n\t-- Квартал Звезд\n\t[\"Караульный из Сумеречной стражи\"] = \"Караульный\",\n\t[\"Часовой из Сумеречной стражи\"] = \"Часовой\",\n\t[\"Бдительный инквизитор\"] = \"Инквизитор\",\n\t[\"Пылающий бес\"] = \"Бес\",\n\t[\"Порабощенная Скверной карательница\"] = \"Карательница\",\n}"
  },
  {
    "path": "ShestakUI/Config/Filters/OpenItems.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.open_items ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete item is to go at www.wowhead.com, search for a item.\n--\tExample: A Sack of Coins -> http://www.wowhead.com/item=5335\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nT.OpenItems = {\n\t[5335] = true,\t\t-- A Sack of Coins\n\t[6307] = true,\t\t-- Message in a Bottle\n\t[6351] = true,\t\t-- Dented Crate\n\t[6352] = true,\t\t-- Waterlogged Crate\n\t[6353] = true,\t\t-- Small Chest\n\t[6356] = true,\t\t-- Battered Chest\n\t[6357] = true,\t\t-- Sealed Crate\n\t[6643] = true,\t\t-- Bloated Smallfish\n\t[6645] = true,\t\t-- Bloated Mud Snapper\n\t[6647] = true,\t\t-- Bloated Catfish\n\t[8366] = true,\t\t-- Bloated Trout\n\t[9276] = true,\t\t-- Pirate's Footlocker\n\t[9363] = true,\t\t-- Sparklematic-Wrapped Box\n\t[10752] = true,\t\t-- Emerald Encrusted Chest\n\t[11024] = true,\t\t-- Evergreen Herb Casing\n\t[11422] = true,\t\t-- Goblin Engineer's Renewal Gift\n\t[11423] = true,\t\t-- Gnome Engineer's Renewal Gift\n\t[11568] = true,\t\t-- Torwa's Pouch\n\t[11617] = true,\t\t-- Eridan's Supplies\n\t[11912] = true,\t\t-- Package of Empty Ooze Containers\n\t[11937] = true,\t\t-- Fat Sack of Coins\n\t[11938] = true,\t\t-- Sack of Gems\n\t[11955] = true,\t\t-- Bag of Empty Ooze Containers\n\t[11966] = true,\t\t-- Small Sack of Coins\n\t[12122] = true,\t\t-- Kum'isha's Junk\n\t[12339] = true,\t\t-- Vaelan's Gift\n\t[13874] = true,\t\t-- Heavy Crate\n\t[13881] = true,\t\t-- Bloated Redgill\n\t[13891] = true,\t\t-- Bloated Salmon\n\t[15876] = true,\t\t-- Nathanos' Chest\n\t[15902] = true,\t\t-- A Crazy Grab Bag\n\t[17685] = true,\t\t-- Smokywood Pastures Sampler\n\t[17726] = true,\t\t-- Smokywood Pastures Special Gift\n\t[17727] = true,\t\t-- Smokywood Pastures Gift Pack\n\t[17962] = true,\t\t-- Blue Sack of Gems\n\t[17963] = true,\t\t-- Green Sack of Gems\n\t[17964] = true,\t\t-- Gray Sack of Gems\n\t[17965] = true,\t\t-- Yellow Sack of Gems\n\t[17969] = true,\t\t-- Red Sack of Gems\n\t[18804] = true,\t\t-- Lord Grayson's Satchel\n\t[19035] = true,\t\t-- Lard's Special Picnic Basket\n\t[19150] = true,\t\t-- Sentinel Basic Care Package\n\t[19151] = true,\t\t-- Sentinel Standard Care Package\n\t[19152] = true,\t\t-- Sentinel Advanced Care Package\n\t[19153] = true,\t\t-- Outrider Advanced Care Package\n\t[19154] = true,\t\t-- Outrider Basic Care Package\n\t[19155] = true,\t\t-- Outrider Standard Care Package\n\t[19422] = true,\t\t-- Darkmoon Faire Fortune\n\t[20228] = true,\t\t-- Defiler's Advanced Care Package\n\t[20229] = true,\t\t-- Defiler's Basic Care Package\n\t[20230] = true,\t\t-- Defiler's Standard Care Package\n\t[20231] = true,\t\t-- Arathor Advanced Care Package\n\t[20233] = true,\t\t-- Arathor Basic Care Package\n\t[20236] = true,\t\t-- Arathor Standard Care Package\n\t[20469] = true,\t\t-- Decoded True Believer Clippings\n\t[20708] = true,\t\t-- Tightly Sealed Trunk\n\t[20766] = true,\t\t-- Slimy Bag\n\t[20767] = true,\t\t-- Scum Covered Bag\n\t[20768] = true,\t\t-- Oozing Bag\n\t[21113] = true,\t\t-- Watertight Trunk\n\t[21150] = true,\t\t-- Iron Bound Trunk\n\t[21156] = true,\t\t-- Scarab Bag\n\t[21164] = true,\t\t-- Bloated Rockscale Cod\n\t[21191] = true,\t\t-- Carefully Wrapped Present\n\t[21216] = true,\t\t-- Smokywood Pastures Extra-Special Gift\n\t[21228] = true,\t\t-- Mithril Bound Trunk\n\t[21270] = true,\t\t-- Gently Shaken Gift\n\t[21271] = true,\t\t-- Gently Shaken Gift\n\t[21310] = true,\t\t-- Gaily Wrapped Present\n\t[21315] = true,\t\t-- Smokywood Satchel\n\t[21327] = true,\t\t-- Ticking Present\n\t[21363] = true,\t\t-- Festive Gift\n\t[21640] = true,\t\t-- Lunar Festival Fireworks Pack\n\t[21746] = true,\t\t-- Lucky Red Envelope\n\t[22746] = true,\t\t-- Buccaneer's Uniform\n\t[23022] = true,\t\t-- Curmudgeon's Payoff\n\t[23846] = true,\t\t-- Nolkai's Box\n\t[24336] = true,\t\t-- Fireproof Satchel\n\t[24402] = true,\t\t-- Package of Identified Plants\n\t[25419] = true,\t\t-- Unmarked Bag of Gems\n\t[25422] = true,\t\t-- Bulging Sack of Gems\n\t[25423] = true,\t\t-- Bag of Premium Gems\n\t[25424] = true,\t\t-- Gem-Stuffed Envelope\n\t[27446] = true,\t\t-- Mr. Pinchy's Gift\n\t[27481] = true,\t\t-- Heavy Supply Crate\n\t[27511] = true,\t\t-- Inscribed Scrollcase\n\t[27513] = true,\t\t-- Curious Crate\n\t[30260] = true,\t\t-- Voren'thal's Package\n\t[30650] = true,\t\t-- Dertrok's Wand Case\n\t[31408] = true,\t\t-- Offering of the Sha'tar\n\t[31522] = true,\t\t-- Primal Mooncloth Supplies\n\t[31800] = true,\t\t-- Outcast's Cache\n\t[31955] = true,\t\t-- Arelion's Knapsack\n\t[32064] = true,\t\t-- Protectorate Treasure Cache\n\t[32462] = true,\t\t-- Morthis' Materials\n\t[32624] = true,\t\t-- Large Iron Metamorphosis Geode\n\t[32625] = true,\t\t-- Small Iron Metamorphosis Geode\n\t[32626] = true,\t\t-- Large Copper Metamorphosis Geode\n\t[32627] = true,\t\t-- Small Copper Metamorphosis Geode\n\t[32628] = true,\t\t-- Large Silver Metamorphosis Geode\n\t[32629] = true,\t\t-- Large Gold Metamorphosis Geode\n\t[32630] = true,\t\t-- Small Gold Metamorphosis Geode\n\t[32631] = true,\t\t-- Small Silver Metamorphosis Geode\n\t[32724] = true,\t\t-- Sludge-Covered Object\n\t[32777] = true,\t\t-- Kronk's Grab Bag\n\t[32835] = true,\t\t-- Ogri'la Care Package\n\t[33045] = true,\t\t-- Renn's Supplies\n\t[33844] = true,\t\t-- Barrel of Fish\n\t[33857] = true,\t\t-- Crate of Meat\n\t[33926] = true,\t\t-- Sealed Scroll Case\n\t[33928] = true,\t\t-- Hollowed Bone Decanter\n\t[34077] = true,\t\t-- Crudely Wrapped Gift\n\t[34119] = true,\t\t-- Black Conrad's Treasure\n\t[34583] = true,\t\t-- Aldor Supplies Package\n\t[34584] = true,\t\t-- Scryer Supplies Package\n\t[34585] = true,\t\t-- Scryer Supplies Package\n\t[34587] = true,\t\t-- Aldor Supplies Package\n\t[34592] = true,\t\t-- Aldor Supplies Package\n\t[34593] = true,\t\t-- Scryer Supplies Package\n\t[34594] = true,\t\t-- Scryer Supplies Package\n\t[34595] = true,\t\t-- Aldor Supplies Package\n\t[34846] = true,\t\t-- Black Sack of Gems\n\t[34863] = true,\t\t-- Bag of Fishing Treasures\n\t[34871] = true,\t\t-- Crafty's Sack\n\t[35232] = true,\t\t-- Shattered Sun Supplies\n\t[35286] = true,\t\t-- Bloated Giant Sunfish\n\t[35313] = true,\t\t-- Bloated Barbed Gill Trout\n\t[35348] = true,\t\t-- Bag of Fishing Treasures\n\t[35512] = true,\t\t-- Pocket Full of Snow\n\t[35792] = true,\t\t-- Mage Hunter Personal Effects\n\t[35945] = true,\t\t-- Brilliant Glass\n\t[37168] = true,\t\t-- Mysterious Tarot\n\t[37586] = true,\t\t-- Handful of Treats\n\t[39418] = true,\t\t-- Ornately Jeweled Box\n\t[39883] = true,\t\t-- Cracked Egg\n\t[41426] = true,\t\t-- Magically Wrapped Gift\n\t[43346] = true,\t\t-- Large Satchel of Spoils\n\t[43347] = true,\t\t-- Satchel of Spoils\n\t[43556] = true,\t\t-- Patroller's Pack\n\t[44113] = true,\t\t-- Small Spice Bag\n\t[44142] = true,\t\t-- Strange Tarot\n\t[44161] = true,\t\t-- Arcane Tarot\n\t[44163] = true,\t\t-- Shadowy Tarot\n\t[44475] = true,\t\t-- Reinforced Crate\n\t[44663] = true,\t\t-- Abandoned Adventurer's Satchel\n\t[44700] = true,\t\t-- Brooding Darkwater Clam\n\t[44718] = true,\t\t-- Ripe Disgusting Jar\n\t[44751] = true,\t\t-- Hyldnir Spoils\n\t[44943] = true,\t\t-- Icy Prism\n\t[44951] = true,\t\t-- Box of Bombs\n\t[45072] = true,\t\t-- Brightly Colored Egg\n\t[45328] = true,\t\t-- Bloated Slippery Eel\n\t[45724] = true,\t\t-- Champion's Purse\n\t[45875] = true,\t\t-- Sack of Ulduar Spoils\n\t[45878] = true,\t\t-- Large Sack of Ulduar Spoils\n\t[46007] = true,\t\t-- Bag of Fishing Treasures\n\t[46809] = true,\t\t-- Bountiful Cookbook\n\t[46810] = true,\t\t-- Bountiful Cookbook\n\t[49294] = true,\t\t-- Ashen Sack of Gems\n\t[49631] = true,\t\t-- Standard Apothecary Serving Kit\n\t[49909] = true,\t\t-- Box of Chocolates\n\t[49926] = true,\t\t-- Brazie's Black Book of Secrets\n\t[50160] = true,\t\t-- Lovely Dress Box\n\t[50161] = true,\t\t-- Dinner Suit Box\n\t[50238] = true,\t\t-- Cracked Un'Goro Coconut\n\t[50301] = true,\t\t-- Landro's Pet Box\n\t[50409] = true,\t\t-- Spark's Fossil Finding Kit\n\t[51316] = true,\t\t-- Unsealed Chest\n\t[51999] = true,\t\t-- Satchel of Helpful Goods\n\t[52000] = true,\t\t-- Satchel of Helpful Goods\n\t[52001] = true,\t\t-- Satchel of Helpful Goods\n\t[52002] = true,\t\t-- Satchel of Helpful Goods\n\t[52003] = true,\t\t-- Satchel of Helpful Goods\n\t[52004] = true,\t\t-- Satchel of Helpful Goods\n\t[52005] = true,\t\t-- Satchel of Helpful Goods\n\t[52274] = true,\t\t-- Earthen Ring Supplies\n\t[52304] = true,\t\t-- Fire Prism\n\t[52344] = true,\t\t-- Earthen Ring Supplies\n\t[52676] = true,\t\t-- Cache of the Ley-Guardian\n\t[54516] = true,\t\t-- Loot-Filled Pumpkin\n\t[54535] = true,\t\t-- Keg-Shaped Treasure Chest\n\t[54536] = true,\t\t-- Satchel of Chilled Goods\n\t[54537] = true,\t\t-- Heart-Shaped Box\n\t[57540] = true,\t\t-- Coldridge Mountaineer's Pouch\n\t[60681] = true,\t\t-- Cannary's Cache\n\t[61387] = true,\t\t-- Hidden Stash\n\t[62062] = true,\t\t-- Bulging Sack of Gold\n\t[64491] = true,\t\t-- Royal Reward\n\t[64657] = true,\t\t-- Canopic Jar\n\t[65513] = true,\t\t-- Crate of Tasty Meat\n\t[66943] = true,\t\t-- Treasures from Grim Batol\n\t[67248] = true,\t\t-- Satchel of Helpful Goods\n\t[67250] = true,\t\t-- Satchel of Helpful Goods\n\t[67414] = true,\t\t-- Bag of Shiny Things\n\t[67495] = true,\t\t-- Strange Bloated Stomach\n\t[67539] = true,\t\t-- Tiny Treasure Chest\n\t[67597] = true,\t\t-- Sealed Crate\n\t[68384] = true,\t\t-- Moonkin Egg\n\t[68598] = true,\t\t-- Very Fat Sack of Coins\n\t[68689] = true,\t\t-- Imported Supplies\n\t[68795] = true,\t\t-- Stendel's Bane\n\t[68813] = true,\t\t-- Satchel of Freshly-Picked Herbs\n\t[69817] = true,\t\t-- Hive Queen's Honeycomb\n\t[69818] = true,\t\t-- Giant Sack\n\t[69822] = true,\t\t-- Master Chef's Groceries\n\t[69823] = true,\t\t-- Gub's Catch\n\t[69886] = true,\t\t-- Bag of Coins\n\t[69903] = true,\t\t-- Satchel of Exotic Mysteries\n\t[69999] = true,\t\t-- Moat Monster Feeding Kit\n\t[70719] = true,\t\t-- Water-Filled Gills\n\t[70931] = true,\t\t-- Scrooge's Payoff\n\t[71631] = true,\t\t-- Zen'Vorka's Cache\n\t[72201] = true,\t\t-- Plump Intestines\n\t[73792] = true,\t\t-- Stolen Present\n\t[77501] = true,\t\t-- Blue Blizzcon Bag\n\t[78897] = true,\t\t-- Pouch o' Tokens\n\t[78898] = true,\t\t-- Sack o' Tokens\n\t[78899] = true,\t\t-- Pouch o' Tokens\n\t[78900] = true,\t\t-- Pouch o' Tokens\n\t[78901] = true,\t\t-- Pouch o' Tokens\n\t[78902] = true,\t\t-- Pouch o' Tokens\n\t[78903] = true,\t\t-- Pouch o' Tokens\n\t[78904] = true,\t\t-- Pouch o' Tokens\n\t[78905] = true,\t\t-- Sack o' Tokens\n\t[78906] = true,\t\t-- Sack o' Tokens\n\t[78907] = true,\t\t-- Sack o' Tokens\n\t[78908] = true,\t\t-- Sack o' Tokens\n\t[78909] = true,\t\t-- Sack o' Tokens\n\t[78910] = true,\t\t-- Sack o' Tokens\n\t[78930] = true,\t\t-- Sealed Crate\n\t[85223] = true,\t\t-- Enigma Seed Pack\n\t[85224] = true,\t\t-- Basic Seed Pack\n\t[85225] = true,\t\t-- Basic Seed Pack\n\t[85226] = true,\t\t-- Basic Seed Pack\n\t[85227] = true,\t\t-- Special Seed Pack\n\t[85271] = true,\t\t-- Secret Stash\n\t[85272] = true,\t\t-- Tree Seed Pack\n\t[85275] = true,\t\t-- Chee Chee's Goodie Bag\n\t[85276] = true,\t\t-- Celebration Gift\n\t[85277] = true,\t\t-- Nicely Packed Lunch\n\t[85497] = true,\t\t-- Chirping Package\n\t[85498] = true,\t\t-- Songbell Seed Pack\n\t[86428] = true,\t\t-- Old Man Thistle's Treasure\n\t[86595] = true,\t\t-- Bag of Helpful Things\n\t[86623] = true,\t\t-- Blingtron 004000 Gift Package\n\t[87217] = true,\t\t-- Small Bag of Goods\n\t[87218] = true,\t\t-- Big Bag of Arms\n\t[87219] = true,\t\t-- Huge Bag of Herbs\n\t[87220] = true,\t\t-- Big Bag of Mysteries\n\t[87221] = true,\t\t-- Big Bag of Jewels\n\t[87222] = true,\t\t-- Big Bag of Linens\n\t[87223] = true,\t\t-- Big Bag of Skins\n\t[87224] = true,\t\t-- Big Bag of Wonders\n\t[87225] = true,\t\t-- Big Bag of Food\n\t[87391] = true,\t\t-- Plundered Treasure\n\t[87533] = true,\t\t-- Crate of Dwarven Archaeology Fragments\n\t[87534] = true,\t\t-- Crate of Draenei Archaeology Fragments\n\t[87535] = true,\t\t-- Crate of Fossil Archaeology Fragments\n\t[87536] = true,\t\t-- Crate of Night Elf Archaeology Fragments\n\t[87537] = true,\t\t-- Crate of Nerubian Archaeology Fragments\n\t[87538] = true,\t\t-- Crate of Orc Archaeology Fragments\n\t[87539] = true,\t\t-- Crate of Tol'vir Archaeology Fragments\n\t[87540] = true,\t\t-- Crate of Troll Archaeology Fragments\n\t[87541] = true,\t\t-- Crate of Vrykul Archaeology Fragments\n\t[87701] = true,\t\t-- Sack of Raw Tiger Steaks\n\t[87702] = true,\t\t-- Sack of Mushan Ribs\n\t[87703] = true,\t\t-- Sack of Raw Turtle Meat\n\t[87704] = true,\t\t-- Sack of Raw Crab Meat\n\t[87705] = true,\t\t-- Sack of Wildfowl Breasts\n\t[87706] = true,\t\t-- Sack of Green Cabbages\n\t[87707] = true,\t\t-- Sack of Juicycrunch Carrots\n\t[87708] = true,\t\t-- Sack of Mogu Pumpkins\n\t[87709] = true,\t\t-- Sack of Scallions\n\t[87710] = true,\t\t-- Sack of Red Blossom Leeks\n\t[87712] = true,\t\t-- Sack of Witchberries\n\t[87713] = true,\t\t-- Sack of Jade Squash\n\t[87714] = true,\t\t-- Sack of Striped Melons\n\t[87715] = true,\t\t-- Sack of Pink Turnips\n\t[87716] = true,\t\t-- Sack of White Turnips\n\t[87721] = true,\t\t-- Sack of Jade Lungfish\n\t[87722] = true,\t\t-- Sack of Giant Mantis Shrimp\n\t[87723] = true,\t\t-- Sack of Emperor Salmon\n\t[87724] = true,\t\t-- Sack of Redbelly Mandarin\n\t[87725] = true,\t\t-- Sack of Tiger Gourami\n\t[87726] = true,\t\t-- Sack of Jewel Danio\n\t[87727] = true,\t\t-- Sack of Reef Octopus\n\t[87728] = true,\t\t-- Sack of Krasarang Paddlefish\n\t[87729] = true,\t\t-- Sack of Golden Carp\n\t[87730] = true,\t\t-- Sack of Crocolisk Belly\n\t[88496] = true,\t\t-- Sealed Crate\n\t[89427] = true,\t\t-- Ancient Mogu Treasure\n\t[89428] = true,\t\t-- Ancient Mogu Treasure\n\t[89607] = true,\t\t-- Crate of Leather\n\t[89608] = true,\t\t-- Crate of Ore\n\t[89609] = true,\t\t-- Crate of Dust\n\t[89610] = true,\t\t-- Pandaria Herbs\n\t[89613] = true,\t\t-- Cache of Treasures\n\t[89810] = true,\t\t-- Bounty of a Sundered Land\n\t[89991] = true,\t\t-- Pandaria Fireworks\n\t[90395] = true,\t\t-- Facets of Research\n\t[90397] = true,\t\t-- Facets of Research\n\t[90398] = true,\t\t-- Facets of Research\n\t[90399] = true,\t\t-- Facets of Research\n\t[90400] = true,\t\t-- Facets of Research\n\t[90401] = true,\t\t-- Facets of Research\n\t[90406] = true,\t\t-- Facets of Research\n\t[90537] = true,\t\t-- Winner's Reward\n\t[90621] = true,\t\t-- Hero's Purse\n\t[90622] = true,\t\t-- Hero's Purse\n\t[90623] = true,\t\t-- Hero's Purse\n\t[90624] = true,\t\t-- Hero's Purse\n\t[90626] = true,\t\t-- Hero's Purse\n\t[90627] = true,\t\t-- Hero's Purse\n\t[90628] = true,\t\t-- Hero's Purse\n\t[90629] = true,\t\t-- Hero's Purse\n\t[90630] = true,\t\t-- Hero's Purse\n\t[90631] = true,\t\t-- Hero's Purse\n\t[90632] = true,\t\t-- Hero's Purse\n\t[90633] = true,\t\t-- Hero's Purse\n\t[90634] = true,\t\t-- Hero's Purse\n\t[90635] = true,\t\t-- Hero's Purse\n\t[90735] = true,\t\t-- Goodies from Nomi\n\t[90818] = true,\t\t-- Misty Satchel of Exotic Mysteries\n\t[90839] = true,\t\t-- Cache of Sha-Touched Gold\n\t[90840] = true,\t\t-- Marauder's Gleaming Sack of Gold\n\t[91086] = true,\t\t-- Darkmoon Pet Supplies\n\t[92718] = true,\t\t-- Brawler's Purse\n\t[92744] = true,\t\t-- Heavy Sack of Gold\n\t[92788] = true,\t\t-- Ride Ticket Book\n\t[92789] = true,\t\t-- Ride Ticket Book\n\t[92790] = true,\t\t-- Ride Ticket Book\n\t[92791] = true,\t\t-- Ride Ticket Book\n\t[92792] = true,\t\t-- Ride Ticket Book\n\t[92793] = true,\t\t-- Ride Ticket Book\n\t[92794] = true,\t\t-- Ride Ticket Book\n\t[92813] = true,\t\t-- Greater Cache of Treasures\n\t[92960] = true,\t\t-- Silkworm Cocoon\n\t[93198] = true,\t\t-- Tome of the Tiger\n\t[93199] = true,\t\t-- Tome of the Crane\n\t[93200] = true,\t\t-- Tome of the Serpent\n\t[93360] = true,\t\t-- Serpent's Cache\n\t[93626] = true,\t\t-- Stolen Present\n\t[93724] = true,\t\t-- Darkmoon Game Prize\n\t[94158] = true,\t\t-- Big Bag of Zandalari Supplies\n\t[94159] = true,\t\t-- Small Bag of Zandalari Supplies\n\t[94219] = true,\t\t-- Arcane Trove\n\t[94220] = true,\t\t-- Sunreaver Bounty\n\t[94296] = true,\t\t-- Cracked Primal Egg\n\t[94553] = true,\t\t-- Notes on Lightning Steel\n\t[94566] = true,\t\t-- Fortuitous Coffer\n\t[95343] = true,\t\t-- Treasures of the Thunder King\n\t[95469] = true,\t\t-- Serpent's Heart\n\t[95601] = true,\t\t-- Shiny Pile of Refuse\n\t[95602] = true,\t\t-- Stormtouched Cache\n\t[95617] = true,\t\t-- Dividends of the Everlasting Spring\n\t[95618] = true,\t\t-- Cache of Mogu Riches\n\t[95619] = true,\t\t-- Amber Encased Treasure Pouch\n\t[97153] = true,\t\t-- Spoils of the Thunder King\n\t[97565] = true,\t\t-- Unclaimed Black Market Container\n\t[97948] = true,\t\t-- Surplus Supplies\n\t[97949] = true,\t\t-- Surplus Supplies\n\t[97950] = true,\t\t-- Surplus Supplies\n\t[97951] = true,\t\t-- Surplus Supplies\n\t[97952] = true,\t\t-- Surplus Supplies\n\t[97953] = true,\t\t-- Surplus Supplies\n\t[97954] = true,\t\t-- Surplus Supplies\n\t[97955] = true,\t\t-- Surplus Supplies\n\t[97956] = true,\t\t-- Surplus Supplies\n\t[97957] = true,\t\t-- Surplus Supplies\n\t[98096] = true,\t\t-- Large Sack of Coins\n\t[98097] = true,\t\t-- Huge Sack of Coins\n\t[98098] = true,\t\t-- Bulging Sack of Coins\n\t[98099] = true,\t\t-- Giant Sack of Coins\n\t[98100] = true,\t\t-- Humongous Sack of Coins\n\t[98101] = true,\t\t-- Enormous Sack of Coins\n\t[98102] = true,\t\t-- Overflowing Sack of Coins\n\t[98103] = true,\t\t-- Gigantic Sack of Coins\n\t[98133] = true,\t\t-- Greater Cache of Treasures\n\t[98560] = true,\t\t-- Arcane Trove\n\t[98562] = true,\t\t-- Sunreaver Bounty\n\t[102137] = true,\t-- Unclaimed Black Market Container\n\t[103624] = true,\t-- Treasures of the Vale\n\t[103632] = true,\t-- Lucky Box of Greatness\n\t[104034] = true,\t-- Purse of Timeless Coins\n\t[104035] = true,\t-- Giant Purse of Timeless Coins\n\t[104112] = true,\t-- Curious Ticking Parcel\n\t[104114] = true,\t-- Curious Ticking Parcel\n\t[104198] = true,\t-- Mantid Artifact Hunter's Kit\n\t[104258] = true,\t-- Glowing Green Ash\n\t[104260] = true,\t-- Satchel of Cosmic Mysteries\n\t[104261] = true,\t-- Glowing Blue Ash\n\t[104263] = true,\t-- Glinting Pile of Stone\n\t[104268] = true,\t-- Pristine Stalker Hide\n\t[104271] = true,\t-- Coalesced Turmoil\n\t[104272] = true,\t-- Celestial Treasure Box\n\t[104273] = true,\t-- Flame-Scarred Cache of Offerings\n\t[104275] = true,\t-- Twisted Treasures of the Vale\n\t[104292] = true,\t-- Partially-Digested Meal\n\t[104296] = true,\t-- Ordon Ceremonial Robes\n\t[105713] = true,\t-- Twisted Treasures of the Vale\n\t[105714] = true,\t-- Coalesced Turmoil\n\t[105751] = true,\t-- Kor'kron Shaman's Treasure\n\t[106130] = true,\t-- Big Bag of Herbs\n\t[107077] = true,\t-- Bag of Transformers\n\t[107270] = true,\t-- Bound Traveler's Scroll\n\t[107271] = true,\t-- Frozen Envelope\n\t[108738] = true,\t-- Giant Draenor Clam\n\t[108740] = true,\t-- Stolen Weapons\n\t[110278] = true,\t-- Engorged Stomach\n\t[110592] = true,\t-- Unclaimed Black Market Container\n\t[110678] = true,\t-- Darkmoon Ticket Fanny Pack\n\t[111598] = true,\t-- Gold Strongbox\n\t[111599] = true,\t-- Silver Strongbox\n\t[111600] = true,\t-- Bronze Strongbox\n\t[112108] = true,\t-- Cracked Egg\n\t[112623] = true,\t-- Pack of Fishing Supplies\n\t[113258] = true,\t-- Blingtron 5000 Gift Package\n\t[114028] = true,\t-- Small Pouch of Coins\n\t[114634] = true,\t-- Icy Satchel of Helpful Goods\n\t[114641] = true,\t-- Icy Satchel of Helpful Goods\n\t[114648] = true,\t-- Scorched Satchel of Helpful Goods\n\t[114655] = true,\t-- Scorched Satchel of Helpful Goods\n\t[114662] = true,\t-- Tranquil Satchel of Helpful Goods\n\t[114669] = true,\t-- Tranquil Satchel of Helpful Goods\n\t[114970] = true,\t-- Small Pouch of Coins\n\t[116062] = true,\t-- Greater Darkmoon Pet Supplies\n\t[116111] = true,\t-- Small Pouch of Coins\n\t[116129] = true,\t-- Dessicated Orc's Coin Pouch\n\t[116202] = true,\t-- Pet Care Package\n\t[116376] = true,\t-- Small Pouch of Coins\n\t[116404] = true,\t-- Pilgrim's Bounty\n\t[116761] = true,\t-- Winter Veil Gift\n\t[116762] = true,\t-- Stolen Present\n\t[116764] = true,\t-- Small Pouch of Coins\n\t[116980] = true,\t-- Invader's Forgotten Treasure\n\t[117386] = true,\t-- Crate of Pandaren Archaeology Fragments\n\t[117387] = true,\t-- Crate of Mogu Archaeology Fragments\n\t[117388] = true,\t-- Crate of Mantid Archaeology Fragments\n\t[117392] = true,\t-- Loot-Filled Pumpkin\n\t[117393] = true,\t-- Keg-Shaped Treasure Chest\n\t[117394] = true,\t-- Satchel of Chilled Goods\n\t[117395] = true,\t-- Stolen Present\n\t[117414] = true,\t-- Stormwind Guard Armor Package\n\t[118065] = true,\t-- Gleaming Ashmaul Strongbox\n\t[118066] = true,\t-- Ashmaul Strongbox\n\t[118093] = true,\t-- Dented Ashmaul Strongbox\n\t[118094] = true,\t-- Dented Ashmaul Strongbox\n\t[118529] = true,\t-- Cache of Highmaul Treasures\n\t[118530] = true,\t-- Cache of Highmaul Treasures\n\t[118531] = true,\t-- Cache of Highmaul Treasures\n\t[118706] = true,\t-- Cracked Goren Egg\n\t[118759] = true,\t-- Alchemy Experiment\n\t[118924] = true,\t-- Cache of Arms\n\t[118925] = true,\t-- Plundered Booty\n\t[118926] = true,\t-- Huge Pile of Skins\n\t[118927] = true,\t-- Maximillian's Laundry\n\t[118928] = true,\t-- Faintly-Sparkling Cache\n\t[118929] = true,\t-- Sack of Mined Ore\n\t[118930] = true,\t-- Bag of Everbloom Herbs\n\t[118931] = true,\t-- Leonid's Bag of Supplies\n\t[119032] = true,\t-- Challenger's Strongbox\n\t[119036] = true,\t-- Box of Storied Treasures\n\t[119037] = true,\t-- Supply of Storied Rarities\n\t[119040] = true,\t-- Cache of Mingled Treasures\n\t[119041] = true,\t-- Strongbox of Mysterious Treasures\n\t[119042] = true,\t-- Crate of Valuable Treasures\n\t[119043] = true,\t-- Trove of Smoldering Treasures\n\t[119188] = true,\t-- Unclaimed Payment\n\t[119189] = true,\t-- Unclaimed Payment\n\t[119190] = true,\t-- Unclaimed Payment\n\t[119191] = true,\t-- Jewelcrafting Payment\n\t[119195] = true,\t-- Jewelcrafting Payment\n\t[119196] = true,\t-- Jewelcrafting Payment\n\t[119197] = true,\t-- Jewelcrafting Payment\n\t[119198] = true,\t-- Jewelcrafting Payment\n\t[119199] = true,\t-- Jewelcrafting Payment\n\t[119200] = true,\t-- Jewelcrafting Payment\n\t[119201] = true,\t-- Jewelcrafting Payment\n\t[119330] = true,\t-- Steel Strongbox\n\t[120142] = true,\t-- Coliseum Champion's Spoils\n\t[120146] = true,\t-- Smuggled Sack of Gold\n\t[120147] = true,\t-- Bloody Gold Purse\n\t[120151] = true,\t-- Gleaming Ashmaul Strongbox\n\t[120170] = true,\t-- Partially-Digested Bag\n\t[120184] = true,\t-- Ashmaul Strongbox\n\t[120312] = true,\t-- Bulging Sack of Coins\n\t[120319] = true,\t-- Invader's Damaged Cache\n\t[120320] = true,\t-- Invader's Abandoned Sack\n\t[120322] = true,\t-- Klinking Stacked Card Deck\n\t[120323] = true,\t-- Bulging Stacked Card Deck\n\t[120324] = true,\t-- Bursting Stacked Card Deck\n\t[120325] = true,\t-- Overflowing Stacked Card Deck\n\t[120334] = true,\t-- Satchel of Cosmic Mysteries\n\t[120353] = true,\t-- Steel Strongbox\n\t[120354] = true,\t-- Gold Strongbox\n\t[120355] = true,\t-- Silver Strongbox\n\t[120356] = true,\t-- Bronze Strongbox\n\t[122163] = true,\t-- Routed Invader's Crate of Spoils\n\t[122191] = true,\t-- Bloody Stack of Invitations\n\t[122242] = true,\t-- Relic Acquisition Compensatory Package\n\t[122478] = true,\t-- Scouting Report: Frostfire Ridge\n\t[122479] = true,\t-- Scouting Report: Shadowmoon Valley\n\t[122480] = true,\t-- Scouting Report: Gorgrond\n\t[122481] = true,\t-- Scouting Report: Talador\n\t[122482] = true,\t-- Scouting Report: Spires of Arak\n\t[122483] = true,\t-- Scouting Report: Nagrand\n\t[122484] = true,\t-- Blackrock Foundry Spoils\n\t[122485] = true,\t-- Blackrock Foundry Spoils\n\t[122486] = true,\t-- Blackrock Foundry Spoils\n\t[122607] = true,\t-- Savage Satchel of Cooperation\n\t[122613] = true,\t-- Stash of Dusty Music Rolls\n\t[122718] = true,\t-- Clinking Present\n\t[123857] = true,\t-- Runic Pouch\n\t[123858] = true,\t-- Follower Retraining Scroll Case\n\t[123975] = true,\t-- Greater Bounty Spoils\n\t[127855] = true,\t-- Iron Fleet Treasure Chest\n\t[132892] = true,\t-- Blingtron 6000 Gift Package\n\t[137560] = true,\t-- Dreamweaver Provisions\n\t[137561] = true,\t-- Highmountain Tribute\n\t[137562] = true,\t-- Valarjar Cache\n\t[137563] = true,\t-- Farondis Lockbox\n\t[137564] = true,\t-- Nightfallen Hoard\n\t[137565] = true,\t-- Warden's Field Kit\n\t[139048] = true,\t-- Small Legion Chest\n\t[139049] = true,\t-- Large Legion Chest\n\t[140591] = true,\t-- Shattered Satchel of Cooperation\n\t[140601] = true,\t-- Sixtrigger Resource Crate\n\t[141350] = true,\t-- Kirin Tor Chest\n\t[160054] = true,\t-- War-Torn Satchel of Cooperation\n\t[163611] = true,\t-- Seafarer's Coin Pouch\n\t[163612] = true,\t-- Wayfinder's Satchel\n\t[163613] = true,\t-- Sack of Plunder\n\t[165714] = true,\t-- Gold Strongbox\n\t[165717] = true,\t-- Steel Strongbox\n\t[165851] = true,\t-- Bag of Anchors\n\t[166295] = true,\t-- Proudmoore Admiralty Supplies\n\t[168740] = true,\t-- Blingtron 7000 Gift Package\n\t[173372] = true,\t-- Cache of the Black Empire\n\t[174958] = true,\t-- Cache of the Fallen Mogu\n\t[174959] = true,\t-- Cache of the Mantid Swarm\n\t[174960] = true,\t-- Cache of the Aqir Swarm\n\t[174961] = true,\t-- Cache of the Amathet\n\t[180647] = true,\t-- Ascended Supplies\n\t[181372] = true,\t-- Tribute of the Ascended\n\t[181475] = true,\t-- Bounty of the Grove Wardens\n\t[181476] = true,\t-- Tribute of the Wild Hunt\n\t[181556] = true,\t-- Tribute of the Court\n\t[181557] = true,\t-- Favor of the Court\n\t[181732] = true,\t-- Tribute of the Ambitious\n\t[181733] = true,\t-- Tribute of the Duty-Bound\n\t[181741] = true,\t-- Tribute of the Paragon\n\t[183701] = true,\t-- Cleansing Rite Materials\n\t[184522] = true,\t-- Veiled Satchel of Cooperation\n\t[184630] = true,\t-- Adventurer's Tailoring Cache\n\t[184631] = true,\t-- Adventurer's Enchanting Cache\n\t[184632] = true,\t-- Champion's Fish Cache\n\t[184633] = true,\t-- Champion's Meat Cache\n\t[184634] = true,\t-- Adventurer's Herbalism Cache\n\t[184635] = true,\t-- Adventurer's Mining Cache\n\t[184636] = true,\t-- Adventurer's Skinning Cache\n\t[184637] = true,\t-- Hero's Meat Cache\n\t[184638] = true,\t-- Hero's Fish Cache\n\t[184639] = true,\t-- Champion's Tailoring Cache\n\t[184640] = true,\t-- Champion's Skinning Cache\n\t[184641] = true,\t-- Champion's Mining Cache\n\t[184642] = true,\t-- Champion's Herbalism Cache\n\t[184643] = true,\t-- Champion's Enchanting Cache\n\t[184644] = true,\t-- Hero's Tailoring Cache\n\t[184645] = true,\t-- Hero's Skinning Cache\n\t[184646] = true,\t-- Hero's Mining Cache\n\t[184647] = true,\t-- Hero's Herbalism Cache\n\t[184648] = true,\t-- Hero's Enchanting Cache\n\t[184843] = true,\t-- Salvaged Supplies\n\t[184868] = true,\t-- Cache of Nathrian Treasures (hc)\n\t[184869] = true,\t-- Cache of Nathrian Treasures\n\t[185972] = true,\t-- Tormentor's Cache\n\t[185990] = true,\t-- Harvester's War Chest\n\t[185992] = true,\t-- War Chest of the Undying Army\n\t[185993] = true,\t-- Ascended War Chest\n\t[185990] = true,\t-- Harvester's War Chest\n\t[185993] = true,\t-- Ascended War Chest\n\t[186196] = true,\t-- Death's Advance War Chest\n\t[186531] = true,\t-- Cache of Sanctum Treasures\n\t[186533] = true,\t-- Cache of SAnctum Treasues (hc)\n\t[186650] = true,\t-- Death's Advance Supplies\n\t[187028] = true,\t-- Supplies of the Archivists' Codex\n\t[187354] = true,\t-- Abandoned Broker Satchel\n\t[187520] = true,\t-- Winter Veil Gift\n\t[187543] = true,\t-- Death's Advance War Chest\n\t[187551] = true,\t-- Small Korthian Supply Chest\n\t[187576] = true,\t-- Korthian Skinning Cache\n\t[187577] = true,\t-- Korthian Meat Cache\n\t[187710] = true,\t-- Anniversary Gift\n\t[187561] = true,\t-- Winter Veil Gift\n\t[187781] = true,\t-- Olea Cache\n\t[192093] = true,\t-- Gently Shaken Gift\n\t[192094] = true,\t-- Winter Veil Gift\n\t[190178] = true,\t-- Pouch of Protogenic Provisions\n\t[190610] = true,\t-- Tribute of the Enlightened Elders\n\t[190655] = true,\t-- Cache of Sepulcher Treasures\n\t[190656] = true,\t-- Cache of Sepulcher Treasures (hc))\n\t[191040] = true,\t-- Cache of Sepulcher Treasures (252+)\n\t[191139] = true,\t-- Tribute of the Enlightened Elders\n\t[191303] = true,\t-- Overflowing Chest of Riches\n\t[191701] = true,\t-- Bag of Explored Souls\n\t[192437] = true,\t-- Cache of Fated Treasures\n\t[192892] = true,\t-- Timewatcher's Patience\n\t[194072] = true,\t-- Sack of Gold\n\t[198868] = true,\t-- Small Valdrakken Accord Supply Pack\n\t[199192] = true,\t-- Dragon Racer's Purse\n\t[200069] = true,\t-- Obsidian Cache\n\t[200070] = true,\t-- Obsidian Strongbox\n\t[200072] = true,\t-- Dragonbane Keep Strongbox\n\t[200073] = true,\t-- Valdrakken Treasures\n\t[200468] = true,\t-- Grand Hunt Spoils\n\t[200513] = true,\t-- Grand Hunt Spoils\n\t[200515] = true,\t-- Grand Hunt Spoils\n\t[201352] = true,\t-- Bag of Leather Reagents\n\t[201353] = true,\t-- Bag of Mail Armor Reagents\n\t[201728] = true,\t-- Vakril's Strongbox\n\t[201754] = true,\t-- Obsidian Forgemaster's Cache\n\t[201817] = true,\t-- Twilight Cache\n\t[202052] = true,\t-- Timewatcher's Patience\n\t[202142] = true,\t-- Dragonbane Keep Strongbox\n\t[202097] = true,\t-- Bulging Box of Skins and Scales\n}"
  },
  {
    "path": "ShestakUI/Config/Filters/RaidAuraWatch.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.raidframe.plugins_aura_watch ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Renew -> http://www.wowhead.com/spell=139\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nT.RaidBuffs = {\n\tDRUID = {\n\t\t{774, \"TOPRIGHT\", {0.8, 0.4, 0.8}},\t\t\t\t\t-- Rejuvenation\n\t\t{48438, \"BOTTOMRIGHT\", {0.8, 0.4, 0}},\t\t\t\t-- Wild Growth\n\t\t{8936, \"BOTTOMLEFT\", {0.2, 0.8, 0.2}},\t\t\t\t-- Regrowth\n\t\t{33763, \"TOPLEFT\", {0.4, 0.8, 0.2}},\t\t\t\t-- Lifebloom\n\t\t{391891, \"TOP\", {0.2, 0.7, 0.2}},\t\t\t\t-- Adaptive Swarm\n\t\t{102351, \"BOTTOM\", {0.2, 0.7, 0.2}},\t\t\t\t-- Cenarion Ward\n\t\t{102342, \"LEFT\", {0.45, 0.3, 0.2}, true},\t\t\t-- Ironbark\n\t\t{155777, \"RIGHT\", {0.4, 0.9, 0.4}},\t\t\t\t-- Rejuvenation (Germination)\n\t},\n\tEVOKER = {\n\t\t{355941, \"TOPRIGHT\", {0.20, 0.58, 0.50}},\t\t\t-- Dream Breath\n\t\t{363502, \"BOTTOMLEFT\", {0.26, 0.73, 0.63}},\t\t\t-- Dream Flight\n\t\t{366155, \"RIGHT\", {0.14, 1.00, 0.88}},\t\t\t\t-- Reversion\n\t\t{364343, \"TOP\", {0.13, 0.87, 0.50}},\t\t\t\t-- Echo\n\t\t{357170, \"BOTTOM\", {0.11, 0.57, 0.71}},\t\t\t\t-- Time Dilation\n\t},\n\tMONK = {\n\t\t{119611, \"TOPRIGHT\", {0.2, 0.7, 0.7}},\t\t\t\t-- Renewing Mist\n\t\t{115175, \"BOTTOMRIGHT\", {0.7, 0.4, 0}},\t\t\t\t-- Soothing Mist\n\t\t{124682, \"BOTTOMLEFT\", {0.4, 0.8, 0.2}},\t\t\t-- Enveloping Mist\n\t\t{191840, \"TOPLEFT\", {0.1, 0.4, 0.9}},\t\t\t\t-- Essence Font\n\t\t{116849, \"LEFT\", {0.81, 0.85, 0.1}, true},\t\t\t-- Life Cocoon\n\t},\n\tPALADIN = {\n\t\t{53563, \"TOPRIGHT\", {0.7, 0.3, 0.7}},\t\t\t\t-- Beacon of Light\n\t\t{156910, \"TOPRIGHT\", {0.7, 0.3, 0.7}},\t\t\t\t-- Beacon of Faith\n\t\t{200025, \"TOPRIGHT\", {0.7, 0.3, 0.7}},\t\t\t\t-- Beacon of Virtue\n\t\t{1022, \"BOTTOMRIGHT\", {0.2, 0.2, 1}, true},\t\t\t-- Blessing of Protection\n\t\t{1044, \"BOTTOMRIGHT\", {0.89, 0.45, 0}, true},\t\t-- Blessing of Freedom\n\t\t{6940, \"BOTTOMRIGHT\", {0.89, 0.1, 0.1}, true},\t\t-- Blessing of Sacrifice\n\t\t{204018, \"BOTTOMRIGHT\", {0.4, 0.6, 0.8}, true},\t\t-- Blessing of Spellwarding\n\t\t{287280, \"BOTTOMLEFT\", {0.9, 0.5, 0.1}},\t\t\t-- Glimmer of Light\n\t\t{223306, \"TOPLEFT\", {0.8, 0.8, 0.1}},\t\t\t\t-- Bestow Faith\n\t},\n\tPRIEST = {\n\t\t{194384, \"TOPRIGHT\", {0.8, 0.4, 0.2}},\t\t\t\t-- Atonement\n\t\t{139, \"TOPRIGHT\", {0.4, 0.7, 0.2}},\t\t\t\t\t-- Renew\n\t\t{41635, \"BOTTOMRIGHT\", {0.2, 0.7, 0.2}},\t\t\t-- Prayer of Mending\n\t\t{6788, \"BOTTOMLEFT\", {1, 0, 0}},\t\t\t\t\t-- Weakened Soul\n\t\t{17, \"TOPLEFT\", {0.81, 0.85, 0.1}},\t\t\t\t\t-- Power Word: Shield\n\t\t{33206, \"LEFT\", {0.89, 0.1, 0.1}, true},\t\t\t-- Pain Suppression\n\t\t{47788, \"LEFT\", {0.86, 0.52, 0}, true},\t\t\t\t-- Guardian Spirit\n\t},\n\tSHAMAN = {\n\t\t{61295, \"TOPRIGHT\", {0.7, 0.3, 0.7}},\t\t\t\t-- Riptide\n\t\t{204288, \"BOTTOMRIGHT\", {0.2, 0.7, 0.2}},\t\t\t-- Earth Shield\n\t},\n\tHUNTER = {\n\t\t{35079, \"TOPRIGHT\", {0.2, 0.2, 1}},\t\t\t\t\t-- Misdirection\n\t},\n\tROGUE = {\n\t\t{57934, \"TOPRIGHT\", {0.89, 0.1, 0.1}},\t\t\t\t-- Tricks of the Trade\n\t},\n\tWARLOCK = {\n\t\t{20707, \"TOPRIGHT\", {0.7, 0.32, 0.75}},\t\t\t\t-- Soulstone\n\t},\n\tALL = {\n\t\t{23333, \"LEFT\", {1, 0, 0}, true},\t\t\t\t\t-- Warsong flag, Horde\n\t\t{23335, \"LEFT\", {0, 0, 1}, true},\t\t\t\t\t-- Warsong flag, Alliance\n\t\t{34976, \"LEFT\", {1, 0, 0}, true},\t\t\t\t\t-- Netherstorm Flag\n\t},\n}\n\nT.RaidBuffsIgnore = {\n\t--[spellID] = true,\t\t\t-- Spell name\n}\n\nlocal function SpellName(id)\n\tlocal name = GetSpellInfo(id)\n\tif name then\n\t\treturn name\n\telse\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(id)..\"] no longer exists! Report this to Shestak.|r\")\n\t\treturn \"Empty\"\n\tend\nend\n\nT.RaidDebuffs = {\n-----------------------------------------------------------------\n-- Vault of the Incarnates\n-----------------------------------------------------------------\n\t-- Eranog\n\t[SpellName(370648)] = 5,\t-- Primal Flow\n\t[SpellName(390715)] = 6,\t-- Primal Rifts\n\t[SpellName(370597)] = 6,\t-- Kill Order\n\t-- Terros\n\t[SpellName(382776)] = 5,\t-- Awakened Earth\n\t[SpellName(386352)] = 3,\t-- Rock Blast\n\t[SpellName(382458)] = 6,\t-- Resonant Aftermath\n\t-- The Primal Council\n\t[SpellName(371624)] = 5,\t-- Conductive Mark\n\t[SpellName(372027)] = 4,\t-- Slashing Blaze\n\t[SpellName(374039)] = 4,\t-- Meteor Axe\n\t-- Sennarth, the Cold Breath\n\t[SpellName(371976)] = 4,\t-- Chilling Blast\n\t[SpellName(372082)] = 5,\t-- Enveloping Webs\n\t[SpellName(374659)] = 4,\t-- Rush\n\t[SpellName(374104)] = 5,\t-- Wrapped in Webs Slow\n\t[SpellName(374503)] = 6,\t-- Wrapped in Webs Stun\n\t[SpellName(373048)] = 3,\t-- Suffocating Webs\n\t-- Dathea, Ascended\n\t[SpellName(391686)] = 5,\t-- Conductive Mark\n\t[SpellName(378277)] = 2,\t-- Elemental Equilbrium\n\t[SpellName(388290)] = 4,\t-- Cyclone\n\t-- Kurog Grimtotem\n\t[SpellName(377780)] = 5,\t-- Skeletal Fractures\n\t[SpellName(372514)] = 5,\t-- Frost Bite\n\t[SpellName(374554)] = 4,\t-- Lava Pool\n\t[SpellName(374023)] = 6,\t-- Searing Carnage\n\t[SpellName(374427)] = 6,\t-- Ground Shatter\n\t[SpellName(390920)] = 5,\t-- Shocking Burst\n\t[SpellName(372458)] = 6,\t-- Below Zero\n\t-- Broodkeeper Diurna\n\t[SpellName(388920)] = 6,\t-- Frozen Shroud\n\t[SpellName(378782)] = 5,\t-- Mortal Wounds\n\t[SpellName(378787)] = 5,\t-- Crushing Stoneclaws\n\t[SpellName(375620)] = 6,\t-- Ionizing Charge\n\t[SpellName(375578)] = 4,\t-- Flame Sentry\n\t-- Raszageth the Storm-Eater\n\t\t-- TODO: DF\n\n-----------------------------------------------------------------\n-- Dungeons\n-----------------------------------------------------------------\n\t-- Mythic+ Affixes\n\t[SpellName(226512)] = 3,\t-- Sanguine\n\t[SpellName(240559)] = 3,\t-- Grievous\n\t[SpellName(240443)] = 3,\t-- Bursting\n\t-- Dragonflight Season 1\n\t[SpellName(396369)] = 6,\t-- Mark of Lightning\n\t[SpellName(396364)] = 6,\t-- Mark of Wind\n\n-----------------------------------------------------------------\n-- Dragonflight (Season 1)\n-----------------------------------------------------------------\n\t-- Court of Stars\n\t[SpellName(207278)] = 3,\t-- Arcane Lockdown\n\t[SpellName(209516)] = 3,\t-- Mana Fang\n\t[SpellName(209512)] = 3,\t-- Disrupting Energy\n\t[SpellName(211473)] = 3,\t-- Shadow Slash\n\t[SpellName(207979)] = 3,\t-- Shockwave\n\t[SpellName(207981)] = 3,\t-- Disintegration Beam\n\t[SpellName(211464)] = 3,\t-- Fel Detonation\n\t[SpellName(208165)] = 3,\t-- Withering Soul\n\t[SpellName(209413)] = 3,\t-- Suppress\n\t[SpellName(209027)] = 3,\t-- Quelling Strike\n\t-- Halls of Valor\n\t[SpellName(197964)] = 3,\t-- Runic Brand\n\t[SpellName(193783)] = 3,\t-- Aegis of Aggramar\n\t[SpellName(196838)] = 3,\t-- Scent of Blood\n\t[SpellName(199674)] = 3,\t-- Wicked Dagger\n\t[SpellName(193260)] = 3,\t-- Static Field\n\t[SpellName(199652)] = 3,\t-- Sever\n\t[SpellName(198944)] = 3,\t-- Breach Armor\n\t[SpellName(215429)] = 3,\t-- Thunderstrike\n\t[SpellName(203963)] = 3,\t-- Eye of the Storm\n\t[SpellName(196497)] = 3,\t-- Ravenous Leap\n\t[SpellName(193660)] = 3,\t-- Felblaze Rush\n\t-- Shadowmoon Burial Grounds\n\t[SpellName(156776)] = 3,\t-- Rending Voidlash\n\t[SpellName(153692)] = 3,\t-- Necrotic Pitch\n\t[SpellName(153524)] = 3,\t-- Plague Spit\n\t[SpellName(154469)] = 3,\t-- Ritual of Bones\n\t[SpellName(162652)] = 3,\t-- Lunar Purity\n\t[SpellName(164907)] = 3,\t-- Void Cleave\n\t[SpellName(152979)] = 3,\t-- Soul Shred\n\t[SpellName(158061)] = 3,\t-- Blessed Waters of Purity\n\t[SpellName(154442)] = 3,\t-- Malevolence\n\t[SpellName(153501)] = 3,\t-- Void Blast\n\t-- Temple of the Jade Serpent\n\t[SpellName(396150)] = 3,\t-- Feeling of Superiority\n\t[SpellName(397878)] = 3,\t-- Tainted Ripple\n\t[SpellName(106113)] = 3,\t-- Touch of Nothingness\n\t[SpellName(397914)] = 3,\t-- Defiling Mist\n\t[SpellName(397904)] = 3,\t-- Setting Sun Kick\n\t[SpellName(397911)] = 3,\t-- Touch of Ruin\n\t[SpellName(395859)] = 3,\t-- Haunting Scream\n\t[SpellName(374037)] = 3,\t-- Overwhelming Rage\n\t[SpellName(396093)] = 3,\t-- Savage Leap\n\t[SpellName(106823)] = 3,\t-- Serpent Strike\n\t[SpellName(396152)] = 3,\t-- Feeling of Inferiority\n\t[SpellName(110125)] = 3,\t-- Shattered Resolve\n\t[SpellName(397797)] = 3,\t-- Corrupted Vortex\n\t-- Ruby Life Pools\n\t[SpellName(392406)] = 3,\t-- Thunderclap\n\t[SpellName(372820)] = 3,\t-- Scorched Earth\n\t[SpellName(384823)] = 3,\t-- Inferno\n\t[SpellName(381862)] = 3,\t-- Infernocore\n\t[SpellName(372860)] = 3,\t-- Searing Wounds\n\t[SpellName(373869)] = 3,\t-- Burning Touch\n\t[SpellName(385536)] = 3,\t-- Flame Dance\n\t[SpellName(381518)] = 3,\t-- Winds of Change\n\t[SpellName(372858)] = 3,\t-- Searing Blows\n\t[SpellName(373589)] = 3,\t-- Primal Chill\n\t[SpellName(373693)] = 3,\t-- Living Bomb\n\t[SpellName(392924)] = 3,\t-- Shock Blast\n\t[SpellName(381515)] = 3,\t-- Stormslam\n\t[SpellName(396411)] = 3,\t-- Primal Overload\n\t[SpellName(384773)] = 3,\t-- Flaming Embers\n\t[SpellName(392451)] = 3,\t-- Flashfire\n\t[SpellName(372697)] = 3,\t-- Jagged Earth\n\t[SpellName(372047)] = 3,\t-- Flurry\n\t[SpellName(372963)] = 3,\t-- Chillstorm\n\t-- The Nokhud Offensive\n\t[SpellName(382628)] = 3,\t-- Surge of Power\n\t[SpellName(386025)] = 3,\t-- Tempest\n\t[SpellName(381692)] = 3,\t-- Swift Stab\n\t[SpellName(387615)] = 3,\t-- Grasp of the Dead\n\t[SpellName(387629)] = 3,\t-- Rotting Wind\n\t[SpellName(386912)] = 3,\t-- Stormsurge Cloud\n\t[SpellName(395669)] = 3,\t-- Aftershock\n\t[SpellName(384134)] = 3,\t-- Pierce\n\t[SpellName(388451)] = 3,\t-- Stormcaller's Fury\n\t[SpellName(395035)] = 3,\t-- Shatter Soul\n\t[SpellName(376899)] = 3,\t-- Crackling Cloud\n\t[SpellName(384492)] = 3,\t-- Hunter's Mark\n\t[SpellName(376730)] = 3,\t-- Stormwinds\n\t[SpellName(376894)] = 3,\t-- Crackling Upheaval\n\t[SpellName(388801)] = 3,\t-- Mortal Strike\n\t[SpellName(376827)] = 3,\t-- Conductive Strike\n\t[SpellName(376864)] = 3,\t-- Static Spear\n\t[SpellName(375937)] = 3,\t-- Rending Strike\n\t[SpellName(376634)] = 3,\t-- Iron Spear\n\t-- The Azure Vault\n\t[SpellName(388777)] = 3,\t-- Oppressive Miasma\n\t[SpellName(386881)] = 3,\t-- Frost Bomb\n\t[SpellName(387150)] = 3,\t-- Frozen Ground\n\t[SpellName(387564)] = 3,\t-- Mystic Vapors\n\t[SpellName(385267)] = 3,\t-- Crackling Vortex\n\t[SpellName(386640)] = 3,\t-- Tear Flesh\n\t[SpellName(374567)] = 3,\t-- Explosive Brand\n\t[SpellName(374523)] = 3,\t-- Arcane Roots\n\t[SpellName(375596)] = 3,\t-- Erratic Growth Channel\n\t[SpellName(375602)] = 3,\t-- Erratic Growth\n\t[SpellName(370764)] = 3,\t-- Piercing Shards\n\t[SpellName(384978)] = 3,\t-- Dragon Strike\n\t[SpellName(375649)] = 3,\t-- Infused Ground\n\t[SpellName(387151)] = 3,\t-- Icy Devastator\n\t[SpellName(377488)] = 3,\t-- Icy Bindings\n\t[SpellName(374789)] = 3,\t-- Infused Strike\n\t[SpellName(371007)] = 3,\t-- Splintering Shards\n\t[SpellName(375591)] = 3,\t-- Sappy Burst\n\t[SpellName(385409)] = 3,\t-- Ouch, ouch, ouch!\n\t[SpellName(386549)] = 3,\t-- Waking Bane\n\t-- Algeth'ar Academy\n\t[SpellName(389033)] = 3,\t-- Lasher Toxin\n\t[SpellName(391977)] = 3,\t-- Oversurge\n\t[SpellName(386201)] = 3,\t-- Corrupted Mana\n\t[SpellName(389011)] = 3,\t-- Overwhelming Power\n\t[SpellName(387932)] = 3,\t-- Astral Whirlwind\n\t[SpellName(396716)] = 3,\t-- Splinterbark\n\t[SpellName(388866)] = 3,\t-- Mana Void\n\t[SpellName(386181)] = 3,\t-- Mana Bomb\n\t[SpellName(388912)] = 3,\t-- Severing Slash\n\t[SpellName(377344)] = 3,\t-- Peck\n\t[SpellName(376997)] = 3,\t-- Savage Peck\n\t[SpellName(388984)] = 3,\t-- Vicious Ambush\n\t[SpellName(388544)] = 3,\t-- Barkbreaker\n\t[SpellName(377008)] = 3,\t-- Deafening Screech\n\n-----------------------------------------------------------------\n-- Dragonflight (Season 2)\n-----------------------------------------------------------------\n\t-- Brackenhide Hollow\n\t-- Halls of Infusion\n\t-- Neltharus\n\t-- Uldaman: Legacy of Tyr\n\n-----------------------------------------------------------------\n-- Other\n-----------------------------------------------------------------\n\t[SpellName(87023)] = 4,\t\t-- Cauterize\n\t[SpellName(94794)] = 4,\t\t-- Rocket Fuel Leak\n\t[SpellName(116888)] = 4,\t-- Shroud of Purgatory\n\t[SpellName(121175)] = 2,\t-- Orb of Power\n}\n\n-----------------------------------------------------------------\n-- PvP\n-----------------------------------------------------------------\nif C.raidframe.plugins_pvp_debuffs == true then\n\tlocal PvPDebuffs = {\n\t\t-- Death Knight\n\t\t[SpellName(108194)] = 4,\t-- Asphyxiate\n\t\t[SpellName(91797)] = 4,\t\t-- Monstrous Blow (Mutated Ghoul)\n\t\t[SpellName(91800)] = 4,\t\t-- Gnaw (Ghoul)\n\t\t[SpellName(287254)] = 4,\t-- Dead of Winter\n\t\t[SpellName(47476)] = 3,\t\t-- Strangulate\n\t\t-- Demon Hunter\n\t\t[SpellName(217832)] = 4,\t-- Imprison\n\t\t[SpellName(211881)] = 4,\t-- Fel Eruption\n\t\t[SpellName(179057)] = 4,\t-- Chaos Nova\n\t\t[SpellName(205630)] = 4,\t-- Illidan's Grasp\n\t\t[SpellName(207685)] = 4,\t-- Sigil of Misery\n\t\t[SpellName(204490)] = 3,\t-- Sigil of Silence\n\t\t-- Druid\n\t\t[SpellName(33786)] = 4,\t\t-- Cyclone\n\t\t[SpellName(5211)] = 4,\t\t-- Mighty Bash\n\t\t[SpellName(22570)] = 4,\t\t-- Maim\n\t\t[SpellName(78675)] = 3,\t\t-- Solar Beam\n\t\t[SpellName(339)] = 2,\t\t-- Entangling Roots\n\t\t-- Evoker\n\t\t[SpellName(360806)] = 4,\t-- Sleep Walk\n\t\t-- Hunter\n\t\t[SpellName(3355)] = 4,\t\t-- Freezing Trap\n\t\t[SpellName(24394)] = 4,\t\t-- Intimidation\n\t\t[SpellName(213691)] = 4,\t-- Scatter Shot\n\t\t[SpellName(117526)] = 2,\t-- Binding Shot\n\t\t-- Mage\n\t\t[SpellName(61305)] = 4,\t\t-- Polymorph\n\t\t[SpellName(82691)] = 4,\t\t-- Ring of Frost\n\t\t[SpellName(31661)] = 4,\t\t-- Dragon's Breath\n\t\t[SpellName(122)] = 2,\t\t-- Frost Nova\n\t\t-- Monk\n\t\t[SpellName(115078)] = 4,\t-- Paralysis\n\t\t[SpellName(119381)] = 4,\t-- Leg Sweep\n\t\t[SpellName(120086)] = 4,\t-- Fists of Fury\n\t\t[SpellName(198898)] = 4,\t-- Song of Chi-Ji\n\t\t-- Paladin\n\t\t[SpellName(20066)] = 4,\t\t-- Repentance\n\t\t[SpellName(853)] = 4,\t\t-- Hammer of Justice\n\t\t[SpellName(105421)] = 4,\t-- Blinding Light\n\t\t-- Priest\n\t\t[SpellName(605)] = 4,\t\t-- Dominate Mind\n\t\t[SpellName(8122)] = 4,\t\t-- Psychic Scream\n\t\t[SpellName(64044)] = 4,\t\t-- Psychic Horror\n\t\t[SpellName(205369)] = 4,\t-- Mind Bomb\n\t\t[SpellName(87204)] = 4,\t\t-- Sin and Punishment\n\t\t[SpellName(200196)] = 4,\t-- Holy Word: Chastise\n\t\t[SpellName(15487)] = 3,\t\t-- Silence\n\t\t-- Rogue\n\t\t[SpellName(6770)] = 4,\t\t-- Sap\n\t\t[SpellName(2094)] = 4,\t\t-- Blind\n\t\t[SpellName(1833)] = 4,\t\t-- Cheap Shot\n\t\t[SpellName(408)] = 4,\t\t-- Kidney Shot\n\t\t[SpellName(1776)] = 4,\t\t-- Gouge\n\t\t[SpellName(1330)] = 3,\t\t-- Garrote - Silence\n\t\t-- Shaman\n\t\t[SpellName(51514)] = 4,\t\t-- Hex\n\t\t[SpellName(118905)] = 4,\t-- Static Charge\n\t\t[SpellName(305485)] = 4,\t-- Lightning Lasso\n\t\t-- Warlock\n\t\t[SpellName(118699)] = 4,\t-- Fear\n\t\t[SpellName(6789)] = 4,\t\t-- Mortal Coil\n\t\t[SpellName(5484)] = 4,\t\t-- Howl of Terror\n\t\t[SpellName(6358)] = 4,\t\t-- Seduction (Succubus)\n\t\t[SpellName(115268)] = 4,\t-- Mesmerize (Shivarra)\n\t\t[SpellName(30283)] = 4,\t\t-- Shadowfury\n\t\t-- Warrior\n\t\t[SpellName(46968)] = 4,\t\t-- Shockwave\n\t\t[SpellName(132169)] = 4,\t-- Storm Bolt\n\t\t[SpellName(194958)] = 4,\t-- Intimidating Shout\n\t}\n\n\ttinsert(T.RaidBuffs[\"ALL\"], {284402, \"RIGHT\", {1, 0, 0}, true})\t-- Vampiric Touch (Don't dispel)\n\ttinsert(T.RaidBuffs[\"ALL\"], {30108, \"RIGHT\", {1, 0, 0}, true})\t-- Unstable Affliction (Don't dispel)\n\n\tfor spell, prio in pairs(PvPDebuffs) do\n\t\tT.RaidDebuffs[spell] = prio\n\tend\nend\n\nT.RaidDebuffsReverse = {\n\t--[spellID] = true,\t\t\t-- Spell name\n}\n\nT.RaidDebuffsIgnore = {\n\t[980] = true,\t\t\t-- Agony\n\t[1943] = true,\t\t\t-- Rupture\n}\n\nfor _, spell in pairs(C.raidframe.plugins_aura_watch_list) do\n\tT.RaidDebuffs[SpellName(spell)] = 3\nend\n"
  },
  {
    "path": "ShestakUI/Config/Filters/Reminders.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tThe best way to add or delete spell is to go at www.wowhead.com, search for a spell.\n--\tExample: Well Fed -> http://www.wowhead.com/spell=104280\n--\tTake the number ID at the end of the URL, and add it to the list\n----------------------------------------------------------------------------------------\nlocal function SpellName(id)\n\tlocal name, _, icon = GetSpellInfo(id)\n\tif name then\n\t\treturn {name, icon}\n\telse\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(id)..\"] no longer exists! Report this to Shestak.|r\")\n\t\treturn {\"Empty\", \"\"}\n\tend\nend\n\nif C.reminder.raid_buffs_enable == true or C.announcements.flask_food == true then\n\tT.ReminderBuffs = {\n\t\tFlask = {\n\t\t\tSpellName(370652),\t-- Phial of Static Empowerment\n\t\t\tSpellName(373257),\t-- Phial of Glacial Fury\n\t\t\tSpellName(374000),\t-- Iced Phial of Corrupting Rage\n\t\t\tSpellName(371036),\t-- Phial of Icy Preservation\n\t\t\tSpellName(371186),\t-- Charged Phial of Alacrity\n\t\t\tSpellName(371339),\t-- Phial of Elemental Chaos\n\t\t\tSpellName(371204),\t-- Phial of Still Air\n\t\t\tSpellName(371354),\t-- Phial of the Eye in the Storm\n\t\t\tSpellName(371386),\t-- Phial of Charged Isolation\n\t\t\tSpellName(371172),\t-- Phial of Tepid Versatility\n\t\t},\n\t\tBattleElixir = {\n\t\t\t-- SpellName(spellID),\t-- Spell name\n\n\t\t},\n\t\tGuardianElixir = {\n\t\t\t-- SpellName(spellID),\t-- Spell name\n\t\t},\n\t\tFood = {\n\t\t\tSpellName(104280),\t-- Well Fed\n\t\t},\n\t\tStamina = {\n\t\t\tSpellName(21562),\t-- Power Word: Fortitude\n\t\t},\n\t\tVers = {\n\t\t\tSpellName(1126),\t-- Mark of the Wild\n\t\t},\n\t\tReduce = {\n\t\t\tSpellName(381748),\t-- Blessing of the Bronze\n\t\t},\n\t\tCustom = {\n\t\t\t-- SpellName(spellID),\t-- Spell name\n\t\t}\n\t}\n\n\t-- Caster buffs\n\tfunction T.ReminderCasterBuffs()\n\t\tSpell4Buff = {\t-- Intellect\n\t\t\tSpellName(1459),\t-- Arcane Intellect\n\t\t}\n\tend\n\n\t-- Physical buffs\n\tfunction T.ReminderPhysicalBuffs()\n\t\tSpell4Buff = {\t-- Attack Power\n\t\t\tSpellName(6673),\t-- Battle Shout\n\t\t}\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--[[------------------------------------------------------------------------------------\n\tSpell Reminder Arguments\n\n\tType of Check:\n\t\tspells - List of spells in a group, if you have anyone of these spells the icon will hide.\n\n\tSpells only Requirements:\n\t\treversecheck - only works if you provide a role or a spec, instead of hiding the frame when you have the buff, it shows the frame when you have the buff\n\t\tnegate_reversecheck - if reversecheck is set you can set a spec to not follow the reverse check\n\n\tRequirements:\n\t\trole - you must be a certain role for it to display (Tank, Melee, Caster)\n\t\tspec - you must be active in a specific spec for it to display (1, 2, 3) note: spec order can be viewed from top to bottom when you open your talent pane\n\t\tlevel - the minimum level you must be (most of the time we don't need to use this because it will register the spell learned event if you don't know the spell, but in some cases it may be useful)\n\n\tAdditional Checks: (Note we always run a check when gaining/losing an aura)\n\t\tcombat - check when entering combat\n\t\tinstance - check when entering a party/raid instance\n\t\tpvp - check when entering a bg/arena\n\n\tFor every group created a new frame is created, it's a lot easier this way.\n]]--------------------------------------------------------------------------------------\nif C.reminder.solo_buffs_enable == true then\n\tT.ReminderSelfBuffs = {\n\t\tDRUID = {\n\t\t\t[1] = {\t-- Mark of the Wild group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(1126),\t-- Mark of the Wild\n\t\t\t\t},\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t},\n\t\t},\n\t\tEVOKER = {\n\t\t\t[1] = {\t-- Blessing of the Bronze\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(381748),\t-- Blessing of the Bronze\n\t\t\t\t},\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t},\n\t\t},\n\t\tMAGE = {\n\t\t\t[1] = {\t-- Intellect group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(1459),\t-- Arcane Intellect\n\t\t\t\t},\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t},\n\t\t},\n\t\tPALADIN = {\n\t\t\t[1] = {\t-- Auras group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(465),\t\t-- Devotion Aura\n\t\t\t\t\tSpellName(183435),\t-- Retribution Aura\n\t\t\t\t\tSpellName(317920),\t-- Concentration Aura\n\t\t\t\t},\n\t\t\t\t[\"instance\"] = true\n\t\t\t},\n\t\t},\n\t\tPRIEST = {\n\t\t\t[1] = {\t-- Stamina group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(21562),\t-- Power Word: Fortitude\n\t\t\t\t},\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true\n\t\t\t},\n\t\t},\n\t\tROGUE = {\n\t\t\t[1] = {\t-- Lethal Poisons group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(2823),\t-- Deadly Poison\n\t\t\t\t\tSpellName(315584),\t-- Instant Poison\n\t\t\t\t\tSpellName(8679),\t-- Wound Poison\n\t\t\t\t\tSpellName(381664),\t-- Amplifying Poison\n\t\t\t\t},\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t},\n\t\t\t[2] = {\t-- Non-Lethal Poisons group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(3408),\t-- Crippling Poison\n\t\t\t\t\tSpellName(5761),\t-- Numbing Poison\n\t\t\t\t\tSpellName(381637),\t-- Atrophic Poison\n\t\t\t\t},\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t},\n\t\t},\n\t\tSHAMAN = {\n\t\t\t[1] = {\t-- Shields group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(52127),\t-- Water Shield\n\t\t\t\t\tSpellName(974),\t\t-- Earth Shield\n\t\t\t\t\tSpellName(192106),\t-- Lightning Shield\n\t\t\t\t},\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t},\n\t\t\t[2] = {\t-- Windfury Weapon group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(33757),\t-- Windfury Weapon\n\t\t\t\t},\n\t\t\t\t[\"mainhand\"] = true,\n\t\t\t\t[\"spec\"] = 2,\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t\t[\"level\"] = 10,\n\t\t\t},\n\t\t\t[3] = {\t-- Flametongue Weapon group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(318038),\t-- Flametongue Weapon\n\t\t\t\t},\n\t\t\t\t[\"offhand\"] = true,\n\t\t\t\t[\"spec\"] = 2,\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t\t[\"level\"] = 10,\n\t\t\t},\n\t\t},\n\t\tWARRIOR = {\n\t\t\t[1] = {\t-- Battle Shout group\n\t\t\t\t[\"spells\"] = {\n\t\t\t\t\tSpellName(6673),\t-- Battle Shout\n\t\t\t\t},\n\t\t\t\t[\"combat\"] = true,\n\t\t\t\t[\"instance\"] = true,\n\t\t\t\t[\"pvp\"] = true,\n\t\t\t},\n\t\t},\n\t}\nend"
  },
  {
    "path": "ShestakUI/Config/Fonts.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tShestakUI fonts configuration file\n--\tBACKUP THIS FILE BEFORE UPDATING!\n----------------------------------------------------------------------------------------\n--\tConfiguration example:\n----------------------------------------------------------------------------------------\n-- C[\"font\"] = {\n--\t\t-- Stats font\n--\t\t[\"stats_font\"] = \"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Fonts\\\\Normal.ttf\",\n--\t\t[\"stats_font_size\"] = 11,\n--\t\t[\"stats_font_style\"] = \"\",\n--\t\t[\"stats_font_shadow\"] = true,\n-- }\n----------------------------------------------------------------------------------------\n\n----------------------------------------------------------------------------------------\n--\tFonts options\n----------------------------------------------------------------------------------------\nC[\"font\"] = {\n\t-- Stats font\n\t[\"stats_font\"] = C.media.pixel_font,\n\t[\"stats_font_size\"] = 8,\n\t[\"stats_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"stats_font_shadow\"] = false,\n\n\t-- Combat text font\n\t[\"combat_text_font\"] = C.media.pixel_font,\n\t[\"combat_text_font_size\"] = 16,\n\t[\"combat_text_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"combat_text_font_shadow\"] = false,\n\n\t-- Chat font\n\t[\"chat_font\"] = C.media.normal_font,\n\t[\"chat_font_style\"] = \"\",\n\t[\"chat_font_shadow\"] = true,\n\n\t-- Chat tabs font\n\t[\"chat_tabs_font\"] = C.media.pixel_font,\n\t[\"chat_tabs_font_size\"] = 8,\n\t[\"chat_tabs_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"chat_tabs_font_shadow\"] = false,\n\n\t-- Action bars font\n\t[\"action_bars_font\"] = C.media.pixel_font,\n\t[\"action_bars_font_size\"] = 8,\n\t[\"action_bars_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"action_bars_font_shadow\"] = false,\n\n\t-- Threat meter font\n\t[\"threat_meter_font\"] = C.media.pixel_font,\n\t[\"threat_meter_font_size\"] = 8,\n\t[\"threat_meter_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"threat_meter_font_shadow\"] = false,\n\n\t-- Raid cooldowns font\n\t[\"raid_cooldowns_font\"] = C.media.pixel_font,\n\t[\"raid_cooldowns_font_size\"] = 8,\n\t[\"raid_cooldowns_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"raid_cooldowns_font_shadow\"] = false,\n\n\t-- Cooldowns timer font\n\t[\"cooldown_timers_font\"] = C.media.pixel_font,\n\t[\"cooldown_timers_font_size\"] = 16,\n\t[\"cooldown_timers_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"cooldown_timers_font_shadow\"] = false,\n\n\t-- Loot font\n\t[\"loot_font\"] = C.media.pixel_font,\n\t[\"loot_font_size\"] = 8,\n\t[\"loot_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"loot_font_shadow\"] = false,\n\n\t-- Nameplates font\n\t[\"nameplates_font\"] = C.media.pixel_font,\n\t[\"nameplates_font_size\"] = 8,\n\t[\"nameplates_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"nameplates_font_shadow\"] = false,\n\n\t-- Unit frames font\n\t[\"unit_frames_font\"] = C.media.pixel_font,\n\t[\"unit_frames_font_size\"] = 8,\n\t[\"unit_frames_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"unit_frames_font_shadow\"] = false,\n\n\t-- Auras font\n\t[\"auras_font\"] = C.media.pixel_font,\n\t[\"auras_font_size\"] = 8,\n\t[\"auras_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"auras_font_shadow\"] = false,\n\n\t-- Filger bar font\n\t[\"filger_font\"] = C.media.pixel_font,\n\t[\"filger_font_size\"] = 8,\n\t[\"filger_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"filger_font_shadow\"] = false,\n\n\t-- Stylization font\n\t[\"stylization_font\"] = C.media.pixel_font,\n\t[\"stylization_font_size\"] = 8,\n\t[\"stylization_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"stylization_font_shadow\"] = false,\n\n\t-- Bags font\n\t[\"bags_font\"] = C.media.pixel_font,\n\t[\"bags_font_size\"] = 8,\n\t[\"bags_font_style\"] = \"MONOCHROMEOUTLINE\",\n\t[\"bags_font_shadow\"] = false,\n\n\t-- Blizzard fonts\n\t[\"tooltip_header_font_size\"] = 13,\n\t[\"tooltip_font_size\"] = 11,\n\t[\"bubble_font_size\"] = 14,\n}\n\n----------------------------------------------------------------------------------------\n--\tPixel font replacement\n----------------------------------------------------------------------------------------\nlocal disablePixel\nif ShestakUIOptionsGlobal then\n\tif ShestakUIOptionsGlobal[T.realm] and ShestakUIOptionsGlobal[T.realm][T.name] and ShestakUIOptionsGlobal[T.realm][\"Current_Profile\"] then\n\t\tlocal i = tostring(ShestakUIOptionsGlobal[T.realm][\"Current_Profile\"][T.name])\n\t\tif ShestakUIOptionsPerChar and ShestakUIOptionsPerChar[i] and ShestakUIOptionsPerChar[i][\"font\"] and ShestakUIOptionsPerChar[i][\"font\"][\"global_font\"] then\n\t\t\tdisablePixel = true\n\t\tend\n\telse\n\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\tif ShestakUIOptions and ShestakUIOptions[i] and ShestakUIOptions[i][\"font\"] and ShestakUIOptions[i][\"font\"][\"global_font\"] then\n\t\t\tdisablePixel = true\n\t\tend\n\tend\nend\n\nif disablePixel then\n\tC[\"media\"].pixel_font = C.media.normal_font\n\tC[\"media\"].pixel_font_size = 11\n\tC[\"media\"].pixel_font_style = \"OUTLINE\"\n\n\tC[\"font\"].stats_font = C.media.normal_font\n\tC[\"font\"].stats_font_size = 12\n\tC[\"font\"].stats_font_style = \"OUTLINE\"\n\tC[\"font\"].stats_font_shadow = false\n\n\tC[\"font\"].combat_text_font = C.media.normal_font\n\tC[\"font\"].combat_text_font_size = 20\n\tC[\"font\"].combat_text_font_style = \"OUTLINE\"\n\tC[\"font\"].combat_text_font_shadow = false\n\n\tC[\"font\"].chat_tabs_font = C.media.normal_font\n\tC[\"font\"].chat_tabs_font_size = 12\n\tC[\"font\"].chat_tabs_font_style = \"OUTLINE\"\n\tC[\"font\"].chat_tabs_font_shadow = false\n\n\tC[\"font\"].action_bars_font = C.media.normal_font\n\tC[\"font\"].action_bars_font_size = 12\n\tC[\"font\"].action_bars_font_style = \"OUTLINE\"\n\tC[\"font\"].action_bars_font_shadow = false\n\n\tC[\"font\"].threat_meter_font = C.media.normal_font\n\tC[\"font\"].threat_meter_font_size = 12\n\tC[\"font\"].threat_meter_font_style = \"OUTLINE\"\n\tC[\"font\"].threat_meter_font_shadow = false\n\n\tC[\"font\"].raid_cooldowns_font = C.media.normal_font\n\tC[\"font\"].raid_cooldowns_font_size = 12\n\tC[\"font\"].raid_cooldowns_font_style = \"OUTLINE\"\n\tC[\"font\"].raid_cooldowns_font_shadow = false\n\n\tC[\"font\"].cooldown_timers_font = C.media.normal_font\n\tC[\"font\"].cooldown_timers_font_size = 16\n\tC[\"font\"].cooldown_timers_font_style = \"OUTLINE\"\n\tC[\"font\"].cooldown_timers_font_shadow = false\n\n\tC[\"font\"].loot_font = C.media.normal_font\n\tC[\"font\"].loot_font_size = 12\n\tC[\"font\"].loot_font_style = \"OUTLINE\"\n\tC[\"font\"].loot_font_shadow = false\n\n\tC[\"font\"].nameplates_font = C.media.normal_font\n\tC[\"font\"].nameplates_font_size = 13\n\tC[\"font\"].nameplates_font_style = \"OUTLINE\"\n\tC[\"font\"].nameplates_font_shadow = false\n\n\tC[\"font\"].unit_frames_font = C.media.normal_font\n\tC[\"font\"].unit_frames_font_size = 13\n\tC[\"font\"].unit_frames_font_style = \"OUTLINE\"\n\tC[\"font\"].unit_frames_font_shadow = false\n\n\tC[\"font\"].auras_font = C.media.normal_font\n\tC[\"font\"].auras_font_size = 12\n\tC[\"font\"].auras_font_style = \"OUTLINE\"\n\tC[\"font\"].auras_font_shadow = false\n\n\tC[\"font\"].filger_font = C.media.normal_font\n\tC[\"font\"].filger_font_size = 12\n\tC[\"font\"].filger_font_style = \"OUTLINE\"\n\tC[\"font\"].filger_font_shadow = false\n\n\tC[\"font\"].stylization_font = C.media.normal_font\n\tC[\"font\"].stylization_font_size = 12\n\tC[\"font\"].stylization_font_style = \"\"\n\tC[\"font\"].stylization_font_shadow = false\n\n\tC[\"font\"].bags_font = C.media.normal_font\n\tC[\"font\"].bags_font_size = 12\n\tC[\"font\"].bags_font_style = \"OUTLINE\"\n\tC[\"font\"].bags_font_shadow = false\nend\n\n----------------------------------------------------------------------------------------\n--\tFont replacement for zhTW, zhCN, and koKR clients\n----------------------------------------------------------------------------------------\nlocal locale_font\nif T.client == \"zhTW\" then\n\tlocale_font = \"Fonts\\\\bLEI00D.ttf\"\nelseif T.client == \"zhCN\" then\n\tlocale_font = \"Fonts\\\\ARKai_T.ttf\"\nelseif T.client == \"koKR\" then\n\tlocale_font = \"Fonts\\\\2002.ttf\"\nend\n\nif locale_font then\n\tC[\"media\"].normal_font = locale_font\n\tC[\"media\"].pixel_font = locale_font\n\tC[\"media\"].pixel_font_style = \"OUTLINE\"\n\tC[\"media\"].pixel_font_size = 11\n\n\tC[\"font\"].stats_font = locale_font\n\tC[\"font\"].stats_font_size = 12\n\tC[\"font\"].stats_font_style = \"OUTLINE\"\n\tC[\"font\"].stats_font_shadow = true\n\n\tC[\"font\"].combat_text_font = locale_font\n\tC[\"font\"].combat_text_font_size = 16\n\tC[\"font\"].combat_text_font_style = \"OUTLINE\"\n\tC[\"font\"].combat_text_font_shadow = true\n\n\tC[\"font\"].chat_font = locale_font\n\tC[\"font\"].chat_font_style = \"OUTLINE\"\n\tC[\"font\"].chat_font_shadow = true\n\n\tC[\"font\"].chat_tabs_font = locale_font\n\tC[\"font\"].chat_tabs_font_size = 12\n\tC[\"font\"].chat_tabs_font_style = \"OUTLINE\"\n\tC[\"font\"].chat_tabs_font_shadow = true\n\n\tC[\"font\"].action_bars_font = locale_font\n\tC[\"font\"].action_bars_font_size = 12\n\tC[\"font\"].action_bars_font_style = \"OUTLINE\"\n\tC[\"font\"].action_bars_font_shadow = true\n\n\tC[\"font\"].threat_meter_font = locale_font\n\tC[\"font\"].threat_meter_font_size = 12\n\tC[\"font\"].threat_meter_font_style = \"OUTLINE\"\n\tC[\"font\"].threat_meter_font_shadow = true\n\n\tC[\"font\"].raid_cooldowns_font = locale_font\n\tC[\"font\"].raid_cooldowns_font_size = 12\n\tC[\"font\"].raid_cooldowns_font_style = \"OUTLINE\"\n\tC[\"font\"].raid_cooldowns_font_shadow = true\n\n\tC[\"font\"].cooldown_timers_font = locale_font\n\tC[\"font\"].cooldown_timers_font_size = 13\n\tC[\"font\"].cooldown_timers_font_style = \"OUTLINE\"\n\tC[\"font\"].cooldown_timers_font_shadow = true\n\n\tC[\"font\"].loot_font = locale_font\n\tC[\"font\"].loot_font_size = 13\n\tC[\"font\"].loot_font_style = \"OUTLINE\"\n\tC[\"font\"].loot_font_shadow = true\n\n\tC[\"font\"].nameplates_font = locale_font\n\tC[\"font\"].nameplates_font_size = 13\n\tC[\"font\"].nameplates_font_style = \"OUTLINE\"\n\tC[\"font\"].nameplates_font_shadow = true\n\n\tC[\"font\"].unit_frames_font = locale_font\n\tC[\"font\"].unit_frames_font_size = 12\n\tC[\"font\"].unit_frames_font_style = \"OUTLINE\"\n\tC[\"font\"].unit_frames_font_shadow = true\n\n\tC[\"font\"].auras_font = locale_font\n\tC[\"font\"].auras_font_size = 11\n\tC[\"font\"].auras_font_style = \"OUTLINE\"\n\tC[\"font\"].auras_font_shadow = true\n\n\tC[\"font\"].filger_font = locale_font\n\tC[\"font\"].filger_font_size = 14\n\tC[\"font\"].filger_font_style = \"OUTLINE\"\n\tC[\"font\"].filger_font_shadow = true\n\n\tC[\"font\"].stylization_font = locale_font\n\tC[\"font\"].stylization_font_size = 12\n\tC[\"font\"].stylization_font_style = \"\"\n\tC[\"font\"].stylization_font_shadow = true\n\n\tC[\"font\"].bags_font = locale_font\n\tC[\"font\"].bags_font_size = 11\n\tC[\"font\"].bags_font_style = \"OUTLINE\"\n\tC[\"font\"].bags_font_shadow = true\n\n\tC[\"font\"].tooltip_header_font_size = 14\n\tC[\"font\"].tooltip_font_size = 12\n\tC[\"font\"].bubble_font_size = 14\nend"
  },
  {
    "path": "ShestakUI/Config/Positions.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tPosition options\n--\tBACKUP THIS FILE BEFORE UPDATING!\n----------------------------------------------------------------------------------------\nC[\"position\"] = {\n\t-- Miscellaneous positions\n\t[\"minimap_buttons\"] = {\"TOPRIGHT\", Minimap, \"TOPLEFT\", -3, 2},\t\t\t\t\t-- Minimap buttons\n\t[\"minimap\"] = {\"BOTTOMRIGHT\", UIParent, \"BOTTOMRIGHT\", -21, 24},\t\t\t\t-- Minimap\n\t[\"map\"] = {\"BOTTOM\", UIParent, \"BOTTOM\", 0, 320},\t\t\t\t\t\t\t\t-- Map\n\t[\"chat\"] = {\"BOTTOMLEFT\", UIParent, \"BOTTOMLEFT\", 24, 23},\t\t\t\t\t\t-- Chat\n\t[\"bag\"] = {\"BOTTOMRIGHT\", Minimap, \"TOPRIGHT\", 2, 5},\t\t\t\t\t\t\t-- Bag\n\t[\"bank\"] = {\"LEFT\", UIParent, \"LEFT\", 23, 150},\t\t\t\t\t\t\t\t\t-- Bank\n\t[\"bn_popup\"] = {\"BOTTOMLEFT\", ChatFrame1, \"TOPLEFT\", -3, 27},\t\t\t\t\t-- Battle.net popup\n\t[\"achievement\"] = {\"TOP\", UIParent, \"TOP\", 0, -21},\t\t\t\t\t\t\t\t-- Achievements frame\n\t[\"tooltip\"] = {\"BOTTOMRIGHT\", Minimap, \"TOPRIGHT\", 2, 5},\t\t\t\t\t\t-- Tooltip\n\t[\"vehicle\"] = {\"BOTTOM\", Minimap, \"TOP\", 0, 27},\t\t\t\t\t\t\t\t-- Vehicle frame\n\t[\"ghost\"] = {\"BOTTOM\", Minimap, \"TOP\", 0, 5},\t\t\t\t\t\t\t\t\t-- Ghost frame\n\t[\"uierror\"] = {\"TOP\", UIParent, \"TOP\", 0, -30},\t\t\t\t\t\t\t\t\t-- Errors frame\n\t[\"quest\"] = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 21, -2},\t\t\t\t\t\t\t-- Quest log\n\t[\"loot\"] = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 245, -220},\t\t\t\t\t\t\t-- Loot\n\t[\"group_loot\"] = {\"BOTTOM\", UIParent, \"BOTTOM\", -238, 500},\t\t\t\t\t\t-- Group roll loot\n\t[\"threat_meter\"] = {\"BOTTOMLEFT\", \"ActionBarAnchor\", \"BOTTOMRIGHT\", 7, 16},\t\t-- Threat meter\n\t[\"raid_cooldown\"] = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 300, -21},\t\t\t\t\t-- Raid cooldowns\n\t[\"enemy_cooldown\"] = {\"BOTTOMLEFT\", \"oUF_Player\", \"TOPRIGHT\", 33, 62},\t\t\t-- Enemy cooldowns\n\t[\"pulse_cooldown\"] = {\"CENTER\", UIParent, \"CENTER\", 0, 0},\t\t\t\t\t\t-- Pulse cooldowns\n\t[\"bg_score\"] = {\"BOTTOMLEFT\", ActionButton12, \"BOTTOMRIGHT\", 10, -2},\t\t\t-- BG stats\n\t[\"player_buffs\"] = {\"TOPRIGHT\", UIParent, \"TOPRIGHT\", -21, -21},\t\t\t\t-- Player buffs\n\t[\"self_buffs\"] = {\"CENTER\", UIParent, \"CENTER\", 0, 190},\t\t\t\t\t\t-- Self buff reminder\n\t[\"raid_buffs\"] = {\"BOTTOMLEFT\", Minimap, \"TOPLEFT\", -2, 5},\t\t\t\t\t\t-- Raid buff reminder\n\t[\"top_panel\"] = {\"TOP\", UIParent, \"TOP\", 0, -21},\t\t\t\t\t\t\t\t-- Top panel\n\t[\"raid_utility\"] = {\"TOP\", UIParent, \"TOP\", -280, 1},\t\t\t\t\t\t\t-- Raid utility\n\t[\"archaeology\"] = {\"BOTTOMRIGHT\", Minimap, \"TOPRIGHT\", 2, 5},\t\t\t\t\t-- Archaeology frame\n\t[\"auto_button\"] = {\"BOTTOMLEFT\", Minimap, \"TOPLEFT\", -2, 27},\t\t\t\t\t-- Auto button\n\t[\"extra_button\"] = {\"BOTTOMRIGHT\", ActionButton1, \"BOTTOMLEFT\", -3, 0},\t\t\t-- Extra action button\n\t[\"zone_button\"] = {\"BOTTOMRIGHT\", ActionButton1, \"BOTTOMLEFT\", -3, 0},\t\t\t-- Zone action button\n\t[\"alt_power_bar\"] = {\"TOP\", UIWidgetTopCenterContainerFrame, \"BOTTOM\", 0, -7},\t-- Alt power bar\n\t[\"talking_head\"] = {\"TOP\", UIParent, \"TOP\", 0, -21},\t\t\t\t\t\t\t-- Talking Head\n\t[\"uiwidget_top\"] = {\"TOP\", UIParent, \"TOP\", 0, -21},\t\t\t\t\t\t\t-- Top Widget\n\t[\"uiwidget_below\"] = {\"TOP\", UIWidgetTopCenterContainerFrame, \"BOTTOM\", 0, -15},-- Below Widget\n\t-- ActionBar positions\n\t[\"bottom_bars\"] = {\"BOTTOM\", UIParent, \"BOTTOM\", 0, 8},\t\t\t\t\t\t\t-- Bottom bars\n\t[\"right_bars\"] = {\"BOTTOMRIGHT\", UIParent, \"BOTTOMRIGHT\", -21, 330},\t\t\t-- Right bars\n\t[\"pet_horizontal\"] = {\"TOPRIGHT\", \"ActionBarAnchor\", \"TOPLEFT\", -7, 102},\t\t-- Horizontal pet bar\n\t[\"stance_bar\"] = {\"TOPRIGHT\", \"ActionBarAnchor\", \"TOPLEFT\", -7, 102},\t\t\t-- Stance bar\n\t[\"vehicle_bar\"] = {\"BOTTOMRIGHT\", ActionButton1, \"BOTTOMLEFT\", -3, 0},\t\t\t-- Vehicle button\n\t[\"micro_menu\"] = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 2, -2},\t\t\t\t\t\t-- Micro menu\n\t-- UnitFrame positions\n\tunitframes = {\n\t\t[\"player\"] = {\"BOTTOMRIGHT\", \"ActionBarAnchor\", \"TOPLEFT\", -9, 175},\t\t-- Player frame\n\t\t[\"target\"] = {\"BOTTOMLEFT\", \"ActionBarAnchor\", \"TOPRIGHT\", 9, 175},\t\t\t-- Target frame\n\t\t[\"target_target\"] = {\"TOPRIGHT\", \"oUF_Target\", \"BOTTOMRIGHT\", 0, -11},\t\t-- ToT frame\n\t\t[\"pet\"] = {\"TOPLEFT\", \"oUF_Player\", \"BOTTOMLEFT\", 0, -11},\t\t\t\t\t-- Pet frame\n\t\t[\"focus\"] = {\"TOPRIGHT\", \"oUF_Player\", \"BOTTOMRIGHT\", 0, -11},\t\t\t\t-- Focus frame\n\t\t[\"focus_target\"] = {\"TOPLEFT\", \"oUF_Target\", \"BOTTOMLEFT\", 0, -11},\t\t\t-- Focus target frame\n\t\t[\"party_heal\"] = {\"TOPLEFT\", \"oUF_Player\", \"BOTTOMRIGHT\", 11, -12},\t\t\t-- Heal layout Party frames\n\t\t[\"raid_heal\"] = {\"TOPLEFT\", \"oUF_Player\", \"BOTTOMRIGHT\", 11, -12},\t\t\t-- Heal layout Raid frames\n\t\t[\"party_dps\"] = {\"BOTTOMLEFT\", UIParent, \"LEFT\", 23, -70},\t\t\t\t\t-- DPS layout Party frames\n\t\t[\"raid_dps\"] = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 23, -23},\t\t\t\t\t-- DPS layout Raid frames\n\t\t[\"arena\"] = {\"BOTTOMRIGHT\", UIParent, \"RIGHT\", -60, -70},\t\t\t\t\t-- Arena frames\n\t\t[\"boss\"] = {\"BOTTOMRIGHT\", UIParent, \"RIGHT\", -23, -70},\t\t\t\t\t-- Boss frames\n\t\t[\"tank\"] = {\"BOTTOMLEFT\", \"ActionBarAnchor\", \"BOTTOMRIGHT\", 10, 18},\t\t-- Tank frames\n\t\t[\"player_portrait\"] = {\"TOPRIGHT\", \"oUF_Player\", \"TOPLEFT\", -12, 27},\t\t-- Player Portrait\n\t\t[\"target_portrait\"] = {\"TOPLEFT\", \"oUF_Target\", \"TOPRIGHT\", 12, 27},\t\t-- Target Portrait\n\t\t[\"player_castbar\"] = {\"BOTTOM\", \"ActionBarAnchor\", \"TOP\", 0, 175},\t\t\t-- Player Castbar\n\t\t[\"target_castbar\"] = {\"BOTTOM\", \"oUF_Player_Castbar\", \"TOP\", 0, 7},\t\t\t-- Target Castbar\n\t\t[\"focus_castbar\"] = {\"CENTER\", UIParent, \"CENTER\", 0, 250},\t\t\t\t\t-- Focus Castbar icon\n\t},\n\t-- Filger positions\n\tfilger = {\n\t\t[\"player_buff_icon\"] = {\"BOTTOMRIGHT\", \"oUF_Player\", \"TOPRIGHT\", 2, 173},\t-- \"P_BUFF_ICON\"\n\t\t[\"player_proc_icon\"] = {\"BOTTOMLEFT\", \"oUF_Target\", \"TOPLEFT\", -2, 173},\t-- \"P_PROC_ICON\"\n\t\t[\"special_proc_icon\"] = {\"BOTTOMRIGHT\", \"oUF_Player\", \"TOPRIGHT\", 2, 213},\t-- \"SPECIAL_P_BUFF_ICON\"\n\t\t[\"target_debuff_icon\"] = {\"BOTTOMLEFT\", \"oUF_Target\", \"TOPLEFT\", -2, 213},\t-- \"T_DEBUFF_ICON\"\n\t\t[\"target_buff_icon\"] = {\"BOTTOMLEFT\", \"oUF_Target\", \"TOPLEFT\", -2, 253},\t-- \"T_BUFF\"\n\t\t[\"pve_debuff\"] = {\"BOTTOMRIGHT\", \"oUF_Player\", \"TOPRIGHT\", 2, 253},\t\t\t-- \"PVE/PVP_DEBUFF\"\n\t\t[\"pve_cc\"] = {\"TOPLEFT\", \"oUF_Player\", \"BOTTOMLEFT\", -2, -44},\t\t\t\t-- \"PVE/PVP_CC\"\n\t\t[\"cooldown\"] = {\"BOTTOMRIGHT\", \"oUF_Player\", \"TOPRIGHT\", 63, 17},\t\t\t-- \"COOLDOWN\"\n\t\t[\"target_bar\"] = {\"BOTTOMLEFT\", \"oUF_Target\", \"BOTTOMRIGHT\", 9, -41},\t\t-- \"T_DE/BUFF_BAR\"\n\t},\n}"
  },
  {
    "path": "ShestakUI/Config/Profiles.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tShestakUI personal configuration file\r\n--\tBACKUP THIS FILE BEFORE UPDATING!\r\n--\tATTENTION: When saving changes to a file encoded file should be in UTF8\r\n----------------------------------------------------------------------------------------\r\n--\tConfiguration example:\r\n----------------------------------------------------------------------------------------\r\n-- if T.name == \"MegaChar\" then\r\n--\t\tC[\"chat\"].width = 100500\r\n--\t\tC[\"tooltip\"].cursor = false\r\n--\t\tC[\"unitframe_class_bar\"].totem = false\r\n--\t\tC[\"position\"].tooltip = {\"BOTTOMRIGHT\", Minimap, \"TOPRIGHT\", 2, 5}\r\n--\t\tC[\"position\"].bottom_bars = {\"BOTTOM\", UIParent, \"BOTTOM\", 2, 8}\r\n--\t\tC[\"position\"].unitframes.tank = {\"BOTTOMLEFT\", UIParent, \"BOTTOM\", 176, 68}\r\n--\t\tT.CustomFilgerSpell = {\r\n--\t\t\t{\"T_DEBUFF_ICON\", {spellID = 115767, unitID = \"target\", caster = \"player\", filter = \"DEBUFF\"}},\r\n--\t\t}\r\n-- end\r\n----------------------------------------------------------------------------------------\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tPer Class Config (overwrite general)\r\n--\tClass need to be UPPERCASE\r\n----------------------------------------------------------------------------------------\r\nif T.class == \"DRUID\" then\r\n\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tPer Character Name Config (overwrite general and class)\r\n--\tName need to be case sensitive\r\n----------------------------------------------------------------------------------------\r\nif T.name == \"CharacterName\" then\r\n\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tPer Max Character Level Config (overwrite general, class and name)\r\n----------------------------------------------------------------------------------------\r\nif T.level ~= MAX_PLAYER_LEVEL then\r\n\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tOz@Pozzo dell'Eternità Config\r\n----------------------------------------------------------------------------------------\r\nif T.name == \"Oz\" and T.realm == \"Pozzo dell'Eternità\" then\r\n\tC[\"position\"].bank = {\"RIGHT\", ChatFrame1, \"BOTTOM\", 349, 371}\r\n\tC[\"position\"].bn_popup = {\"BOTTOMRIGHT\", Minimap, \"TOPRIGHT\", 2, 5}\r\n\tC[\"position\"].vehicle = {\"BOTTOMLEFT\", \"ActionBarAnchor\", \"BOTTOMRIGHT\", 109, 100}\r\n\tC[\"position\"].ghost = {\"TOPLEFT\", \"oUF_Player\", \"TOPLEFT\", -2, 65}\r\n\tC[\"position\"].quest = {\"TOPRIGHT\", UIParent, \"TOPRIGHT\", -238, -111}\r\n\tC[\"position\"].loot = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 21, -532}\r\n\tC[\"position\"].group_loot = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 241, -211}\r\n\tC[\"position\"].threat_meter = {\"BOTTOM\", \"oUF_Target\", \"BOTTOM\", -283, 77}\r\n\tC[\"position\"].raid_cooldown = {\"TOPRIGHT\", UIParent, \"TOPRIGHT\", -21, -115}\r\n\tC[\"position\"].enemy_cooldown = {\"BOTTOMLEFT\", \"oUF_Target\", \"BOTTOMRIGHT\", 9, -62}\r\n\tC[\"position\"].raid_buffs = {\"BOTTOMLEFT\", Minimap, \"TOPLEFT\", -2, 5}\r\n\tC[\"position\"].raid_utility = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 241, -21}\r\n\tC[\"position\"].extra_button = {\"RIGHT\", \"oUF_Player\", \"BOTTOM\", -53, -126}\r\n\tC[\"position\"].stance_bar = {\"RIGHT\", \"oUF_Player\", \"BOTTOM\", 82, -85}\r\n\tC[\"position\"].unitframes.player = {\"TOPLEFT\", \"ActionBarAnchor\", \"BOTTOMRIGHT\", -558, 373}\r\n\tC[\"position\"].unitframes.target = {\"TOPRIGHT\", \"ActionBarAnchor\", \"BOTTOMLEFT\", 558, 373}\r\n\tC[\"position\"].unitframes.tank = {\"BOTTOMLEFT\", \"ActionBarAnchor\", \"BOTTOMRIGHT\", 5, 18}\r\n\tC[\"position\"].unitframes.player_castbar = {\"CENTER\", UIParent, \"CENTER\", 0, 136}\r\n\tC[\"position\"].unitframes.target_castbar = {\"BOTTOM\", \"oUF_Target\", \"BOTTOM\", -272, -4}\r\n\tC[\"position\"].unitframes.raid_heal = {\"TOPLEFT\", \"ActionBarAnchor\", \"BOTTOMRIGHT\", -331, 335}\r\n\tC[\"media\"].border_color = {0.1, 0.1, 0.1, 1}\r\n\tC[\"general\"].welcome_message = false\r\n\tC[\"misc\"].invite_keyword = \"inv\"\r\n\tC[\"misc\"].item_level = true\r\n\tC[\"general\"].move_blizzard = true\r\n\tC[\"announcements\"].flask_food = true\r\n\tC[\"announcements\"].pull_countdown = false\r\n\tC[\"automation\"].release = false\r\n\tC[\"automation\"].decline_duel = false\r\n\tC[\"automation\"].solve_artifact = false\r\n\tC[\"skins\"].blizzard_frames = true\r\n\tC[\"skins\"].minimap_buttons = true\r\n\tC[\"skins\"].dbm = true\r\n\tC[\"skins\"].npcscan = true\r\n\tC[\"skins\"].skada = true\r\n\tC[\"skins\"].my_role_play = true\r\n\tC[\"combattext\"].icons = false\r\n\tC[\"combattext\"].scrollable = true\r\n\tC[\"combattext\"].dk_runes = false\r\n\tC[\"combattext\"].killingblow = true\r\n\tC[\"reminder\"].raid_buffs_size = 16.8\r\n\tC[\"threat\"].width = 125\r\n\tC[\"threat\"].bar_rows = 2\r\n\tC[\"tooltip\"].item_icon = true\r\n\tC[\"tooltip\"].talents = true\r\n\tC[\"tooltip\"].achievements = false\r\n\tC[\"tooltip\"].title = true\r\n\tC[\"tooltip\"].spell_id = true\r\n\tC[\"tooltip\"].average_lvl = true\r\n\tC[\"tooltip\"].raid_icon = true\r\n\tC[\"tooltip\"].who_targetting = true\r\n\tC[\"chat\"].background = true\r\n\tC[\"chat\"].filter = false\r\n\tC[\"chat\"].chat_bar = true\r\n\tC[\"chat\"].chat_bar_mouseover = true\r\n\tC[\"chat\"].tabs_mouseover = true\r\n\tC[\"chat\"].damage_meter_spam = true\r\n\tC[\"minimap\"].size = 116\r\n\tC[\"minimap\"].toggle_menu = false\r\n\tC[\"loot\"].auto_greed = false\r\n\tC[\"nameplate\"].show_castbar_name = true\r\n\tC[\"nameplate\"].class_icons = true\r\n\tC[\"nameplate\"].track_debuffs = true\r\n\tC[\"nameplate\"].healer_icon = true\r\n\tC[\"actionbar\"].hotkey = false\r\n\tC[\"actionbar\"].bottombars = 1\r\n\tC[\"aura\"].focus_debuffs = true\r\n\tC[\"aura\"].fot_debuffs = true\r\n\tC[\"aura\"].pet_debuffs = true\r\n\tC[\"aura\"].tot_debuffs = true\r\n\tC[\"aura\"].cast_by = true\r\n\tC[\"filger\"].show_tooltip = true\r\n\tC[\"unitframe\"].own_color = true\r\n\tC[\"unitframe\"].uf_color = {0.15, 0.15, 0.15}\r\n\tC[\"unitframe\"].enemy_health_color = false\r\n\tC[\"unitframe\"].color_value = true\r\n\tC[\"unitframe\"].bar_color_value = true\r\n\tC[\"unitframe\"].castbar_icon = true\r\n\tC[\"unitframe\"].icons_pvp = true\r\n\tC[\"unitframe\"].plugins_gcd = true\r\n\tC[\"unitframe\"].plugins_reputation_bar = true\r\n\tC[\"unitframe\"].plugins_experience_bar = true\r\n\tC[\"unitframe\"].plugins_smooth_bar = true\r\n\tC[\"unitframe\"].plugins_enemy_spec = true\r\n\tC[\"unitframe\"].plugins_fader = true\r\n\tC[\"unitframe\"].plugins_diminishing = true\r\n\tC[\"raidframe\"].raid_tanks_tt = true\r\n\tC[\"raidframe\"].raid_groups = 8\r\n\tC[\"raidframe\"].icons_role = true\r\n\tC[\"raidframe\"].plugins_aura_watch_timer = true\r\n\tC[\"raidframe\"].plugins_auto_resurrection = true\r\n\tC[\"toppanel\"].enable = false\r\n\tC[\"stats\"].battleground = true\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tSw2rT1 Config\r\n----------------------------------------------------------------------------------------\r\nif Sw2rT1 then\r\n\tC[\"general\"].welcome_message = false\r\n\tC[\"general\"].hide_banner = false\r\n\tC[\"general\"].hide_talking_head = true\r\n\tC[\"misc\"].shift_marking = false\r\n\tC[\"misc\"].raid_tools = false\r\n\tC[\"misc\"].hide_raid_button = true\r\n\tC[\"trade\"].disenchanting = true\r\n\tC[\"announcements\"].pull_countdown = false\r\n\tC[\"automation\"].accept_invite = true\r\n\t--C[\"automation\"].accept_quest = true\r\n\tC[\"automation\"].auto_collapse = true\r\n\tC[\"skins\"].blizzard_frames = true\r\n\tC[\"skins\"].minimap_buttons = true\r\n\tC[\"skins\"].dbm = true\r\n\tC[\"skins\"].details = true\r\n\tC[\"skins\"].weak_auras = true\r\n\tC[\"combattext\"].crit_prefix = \"\"\r\n\tC[\"combattext\"].crit_postfix = \"\"\r\n\tC[\"minimap\"].size = 165\r\n\tC[\"minimap\"].fog_of_war = true\r\n\tC[\"raidcooldown\"].enable = false\r\n\tC[\"threat\"].enable = false\r\n\tC[\"tooltip\"].item_icon = true\r\n\tC[\"tooltip\"].title = true\r\n\tC[\"tooltip\"].raid_icon = true\r\n\tC[\"tooltip\"].average_lvl = true\r\n\tC[\"tooltip\"].item_count = true\r\n\tC[\"tooltip\"].instance_lock = true\r\n\tC[\"chat\"].combatlog = false\r\n\tC[\"chat\"].damage_meter_spam = true\r\n\tC[\"bag\"].ilvl = true\r\n\tC[\"filger\"].enable = false\r\n\tC[\"unitframe\"].enemy_health_color = false\r\n\tC[\"unitframe\"].castbar_latency = false\r\n\tC[\"raidframe\"].raid_groups = 6\r\n\tC[\"raidframe\"].icons_role = true\r\n\tC[\"toppanel\"].enable = false\r\n\tC[\"position\"].quest = {\"TOPRIGHT\", UIParent, \"TOPRIGHT\", -52, -73}\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tWetxius Config\r\n----------------------------------------------------------------------------------------\r\nif IsWetxius then\r\n\tC[\"general\"].welcome_message = false\r\n\tC[\"general\"].vehicle_mouseover = true\r\n\tC[\"skins\"].blizzard_frames = true\r\n\tC[\"skins\"].minimap_buttons = true\r\n\tC[\"skins\"].bigwigs = true\r\n\tC[\"skins\"].details = true\r\n\tC[\"unitframe\"].castbar_icon = true\r\n\tC[\"unitframe\"].plugins_enemy_spec = true\r\n\tC[\"raidframe\"].solo_mode = true\r\n\tC[\"raidframe\"].icons_leader = false\r\n\tC[\"aura\"].show_spiral = true\r\n\tC[\"aura\"].cast_by = true\r\n\tC[\"actionbar\"].toggle_mode = false\r\n\tC[\"actionbar\"].bottombars = 3\r\n\tC[\"tooltip\"].hide_combat = true\r\n\tC[\"tooltip\"].rank = false\r\n\tC[\"tooltip\"].spell_id = true\r\n\tC[\"tooltip\"].unit_role = true\r\n\tC[\"tooltip\"].mount = true\r\n\tC[\"chat\"].background = true\r\n\tC[\"chat\"].spam = true\r\n\tC[\"chat\"].damage_meter_spam = true\r\n\tC[\"chat\"].chat_bar = true\r\n\tC[\"chat\"].chat_bar_mouseover = true\r\n\tC[\"chat\"].combatlog = false\r\n\tC[\"chat\"].loot_icons = true\r\n\t-- C[\"chat\"].history = true\r\n\tC[\"chat\"].role_icons = true\r\n\tC[\"chat\"].custom_time_color = false\r\n\tC[\"nameplate\"].health_value = true\r\n\tC[\"nameplate\"].healer_icon = true\r\n\tC[\"nameplate\"].track_buffs = true\r\n\tC[\"nameplate\"].low_health = true\r\n\tC[\"nameplate\"].quests = true\r\n\tC[\"nameplate\"].cast_color = true\r\n\tC[\"nameplate\"].kick_color = true\r\n\tC[\"nameplate\"].mob_color_enable = true\r\n\tC[\"nameplate\"].extra_color = {1, 0, 0.55}\r\n\tC[\"combattext\"].crit_prefix = \"\"\r\n\tC[\"combattext\"].blizz_head_numbers = true\r\n\tC[\"combattext\"].dk_runes = false\r\n\tC[\"bag\"].ilvl = true\r\n\tC[\"bag\"].new_items = true\r\n\tC[\"minimap\"].toggle_menu = false\r\n\tC[\"minimap\"].fog_of_war = true\r\n\tC[\"filger\"].show_tooltip = true\r\n\tC[\"announcements\"].bad_gear = true\r\n\tC[\"automation\"].accept_invite = true\r\n\tC[\"automation\"].screenshot = true\r\n\tC[\"automation\"].auto_role = true\r\n\tC[\"automation\"].tab_binder = true\r\n\tC[\"automation\"].open_items = true\r\n\tC[\"automation\"].auto_collapse = \"SCENARIO\"\r\n\tC[\"enemycooldown\"].show_inparty = true\r\n\tC[\"enemycooldown\"].class_color = true\r\n\tC[\"pulsecooldown\"].enable = true\r\n\tC[\"pulsecooldown\"].threshold = 6\r\n\tC[\"threat\"].enable = false\r\n\tC[\"toppanel\"].enable = false\r\n\tC[\"stats\"].battleground = true\r\n\tC[\"stats\"].currency_cooking = false\r\n\tC[\"stats\"].currency_professions = false\r\n\tC[\"stats\"].currency_raid = false\r\n\tC[\"stats\"].currency_misc = false\r\n\tC[\"trade\"].disenchanting = true\r\n\tC[\"trade\"].enchantment_scroll = true\r\n\tC[\"misc\"].shift_marking = false\r\n\tC[\"misc\"].quest_auto_button = true\r\n\tC[\"misc\"].click_cast = true\r\n\tC[\"font\"].stats_font = C.media.normal_font\r\n\tC[\"font\"].stats_font_style = \"OUTLINE\"\r\n\tC[\"font\"].stats_font_size = 12\r\n\t-- C[\"position\"].raid_cooldown = {\"TOPLEFT\", UIParent, \"TOPLEFT\", 300, -14}\r\n\tC[\"position\"].bag = {\"BOTTOMRIGHT\", UIParent, \"BOTTOMRIGHT\", -21, 20}\r\n\tC[\"position\"].bank = {\"BOTTOMLEFT\", UIParent, \"BOTTOMLEFT\", 21, 20}\r\n\tC[\"position\"].auto_button = {\"BOTTOMLEFT\", \"oUF_Player\" or ChatFrame1, \"TOPRIGHT\", 33, 83}\r\n\tC[\"position\"].unitframes.arena = {\"BOTTOMRIGHT\", UIParent, \"RIGHT\", -55, -70}\r\n\tC[\"position\"].stance_bar = {\"TOPRIGHT\", \"ActionBarAnchor\", \"TOPLEFT\", -3, 0}\r\n\r\n\tlocal frame = CreateFrame(\"Frame\")\r\n\tframe:RegisterEvent(\"PLAYER_LOGIN\")\r\n\tframe:SetScript(\"OnEvent\", function()\r\n\t\txCT3:SetPoint(\"CENTER\", 0, 305)\r\n\t\txCT3:SetWidth(400)\r\n\t\tC[\"combattext\"].heal_treshold = UnitHealthMax(\"player\")/100\r\n\t\tif PTR_IssueReporter then\r\n\t\t\tPTR_IssueReporter:SetAlpha(0)\r\n\t\t\tPTR_IssueReporter:SetScale(0.001)\r\n\t\tend\r\n\t\tSetCVar(\"lootUnderMouse\", 1)\r\n\tend)\r\n\r\n\tT.CustomFilgerSpell = {\r\n\t\t{\"P_PROC_ICON\", {spellID = 26573, filter = \"ICD\", trigger = \"NONE\", totem = true}}, \t\t-- Consecration\r\n\t}\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tLoad external profile https://github.com/Wetxius/ShestakUI_Profile\r\n----------------------------------------------------------------------------------------\r\nif ShestakUICustomProfile then\r\n\tShestakUICustomProfile()\r\nend\r\n"
  },
  {
    "path": "ShestakUI/Config/Settings.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tShestakUI main configuration file\n--\tBACKUP THIS FILE BEFORE UPDATING!\n----------------------------------------------------------------------------------------\n\n----------------------------------------------------------------------------------------\n--\tMedia options\n----------------------------------------------------------------------------------------\nC[\"media\"] = {\n\t[\"normal_font\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Normal.ttf]],\t\t-- Normal font\n\t[\"blank_font\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Blank.ttf]],\t\t\t-- Blank font\n\t[\"pixel_font\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Pixel.ttf]],\t\t\t-- Pixel font\n\t[\"pixel_font_style\"] = \"MONOCHROMEOUTLINE\",\t\t\t\t\t\t\t\t\t\t-- Pixel font style (\"MONOCHROMEOUTLINE\" or \"OUTLINE\")\n\t[\"pixel_font_size\"] = 8,\t\t\t\t\t\t\t\t\t\t\t\t\t\t-- Pixel font size for those places where it is not specified\n\t[\"blank\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Textures\\White.tga]],\t\t\t-- Texture for borders\n\t[\"texture\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Texture.tga]],\t\t-- Texture for status bars\n\t[\"highlight\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Highlight.tga]],\t-- Texture for debuffs highlight\n\t[\"whisp_sound\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Sounds\\Whisper.ogg]],\t\t-- Sound for whispers\n\t[\"warning_sound\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Sounds\\Warning.ogg]],\t-- Sound for warning\n\t[\"proc_sound\"] = [[Interface\\AddOns\\ShestakUI\\Media\\Sounds\\Proc.ogg]],\t\t\t-- Sound for procs\n\t[\"classborder_color\"] = {T.color.r, T.color.g, T.color.b, 1},\t\t\t\t\t-- Color for class borders\n\t[\"border_color\"] = {0.37, 0.3, 0.3, 1},\t\t-- Color for borders\n\t[\"backdrop_color\"] = {0, 0, 0, 1},\t\t\t-- Color for borders backdrop\n\t[\"backdrop_alpha\"] = 0.7,\t\t\t\t\t-- Alpha for transparent backdrop\n}\n\n----------------------------------------------------------------------------------------\n--\tGeneral options\n----------------------------------------------------------------------------------------\nC[\"general\"] = {\n\t[\"welcome_message\"] = true,\t\t\t\t\t-- Enable welcome message in chat\n\t[\"auto_scale\"] = true,\t\t\t\t\t\t-- Autoscale\n\t[\"uiscale\"] = 0.75,\t\t\t\t\t\t\t-- Your value (between 0.2 and 1) if \"auto_scale\" is disable\n\t-- Blizzard UI\n\t[\"error_filter\"] = \"BLACKLIST\",\t\t\t\t-- Filter Blizzard red errors (BLACKLIST, WHITELIST, COMBAT, NONE)\n\t[\"move_blizzard\"] = false,\t\t\t\t\t-- Move some Blizzard frames\n\t[\"color_picker\"] = false,\t\t\t\t\t-- Improved ColorPicker\n\t[\"vehicle_mouseover\"] = false,\t\t\t\t-- Vehicle frame on mouseover\n\t[\"minimize_mouseover\"] = false,\t\t\t\t-- Mouseover for quest minimize button\n\t[\"hide_banner\"] = false,\t\t\t\t\t-- Hide Boss Banner Loot Frame\n\t[\"hide_talking_head\"] = false,\t\t\t\t-- Hide Talking Head Frame\n\t[\"hide_maw_buffs\"] = false,\t\t\t\t\t-- Hide Maw Buffs frame in instances\n}\n\nif T.screenHeight == 1440 then\n\tC.general.auto_scale = false\n\tC.general.uiscale = 0.64\nend\n\n----------------------------------------------------------------------------------------\n--\tSkins options\n----------------------------------------------------------------------------------------\nC[\"skins\"] = {\n\t[\"blizzard_frames\"] = false,\t\t\t\t-- Blizzard frames skin\n\t[\"bubbles\"] = true,\t\t\t\t\t\t\t-- Skin Blizzard chat bubbles\n\t[\"minimap_buttons\"] = false,\t\t\t\t-- Skin addons icons on minimap\n\t[\"minimap_buttons_mouseover\"] = true,\t\t-- Addons icons on mouseover\n\t-- Addons\n\t[\"ace3\"] = false,\t\t\t\t\t\t\t-- Ace3 options elements skin\n\t[\"atlasloot\"] = false,\t\t\t\t\t\t-- AtlasLoot skin\n\t[\"bigwigs\"] = false,\t\t\t\t\t\t-- BigWigs skin\n\t[\"blood_shield_tracker\"] = false,\t\t\t-- BloodShieldTracker skin\n\t[\"capping\"] = false,\t\t\t\t\t\t-- Capping skin\n\t[\"clique\"] = false,\t\t\t\t\t\t\t-- Clique skin\n\t[\"cool_line\"] = false,\t\t\t\t\t\t-- CoolLine skin\n\t[\"dbm\"] = false,\t\t\t\t\t\t\t-- DBM skin\n\t[\"details\"] = false,\t\t\t\t\t\t-- Details skin\n\t[\"dominos\"] = false,\t\t\t\t\t\t-- Dominos skin\n\t[\"flyout_button\"] = false,\t\t\t\t\t-- FlyoutButtonCustom skin\n\t[\"ls_toasts\"] = false,\t\t\t\t\t\t-- Is: Toasts skin\n\t[\"mage_nuggets\"] = false,\t\t\t\t\t-- MageNuggets skin\n\t[\"my_role_play\"] = false,\t\t\t\t\t-- MyRolePlay skin\n\t[\"npcscan\"] = false,\t\t\t\t\t\t-- NPCScan skin\n\t[\"nug_running\"] = false,\t\t\t\t\t-- NugRunning skin\n\t[\"omen\"] = false,\t\t\t\t\t\t\t-- Omen skin\n\t[\"opie\"] = false,\t\t\t\t\t\t\t-- OPie skin\n\t[\"ovale\"] = false,\t\t\t\t\t\t\t-- OvaleSpellPriority skin\n\t[\"postal\"] = false,\t\t\t\t\t\t\t-- Postal skin\n\t[\"recount\"] = false,\t\t\t\t\t\t-- Recount skin\n\t[\"rematch\"] = false,\t\t\t\t\t\t-- Rematch skin\n\t[\"skada\"] = false,\t\t\t\t\t\t\t-- Skada skin\n\t[\"tiny_dps\"] = false,\t\t\t\t\t\t-- TinyDPS skin\n\t[\"vanaskos\"] = false,\t\t\t\t\t\t-- VanasKoS skin\n\t[\"weak_auras\"] = false,\t\t\t\t\t\t-- WeakAuras skin\n}\n\n----------------------------------------------------------------------------------------\n--\tUnit Frames options\n----------------------------------------------------------------------------------------\nC[\"unitframe\"] = {\n\t-- Main\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable unit frames\n\t[\"own_color\"] = false,\t\t\t\t\t\t-- Set your color for health bars\n\t[\"uf_color\"] = {0.4, 0.4, 0.4},\t\t\t\t-- Color for health bars if [\"own_color\"] = true\n\t[\"uf_color_bg\"] = {0.1, 0.1, 0.1},\t\t\t-- Color for background\n\t[\"enemy_health_color\"] = true,\t\t\t\t-- If enable, enemy target color is red\n\t[\"show_total_value\"] = false,\t\t\t\t-- Display of info text on player and target with XXXX/Total\n\t[\"color_value\"] = false,\t\t\t\t\t-- Health/mana value is colored\n\t[\"bar_color_value\"] = false,\t\t\t\t-- Health bar color by current health remaining\n\t[\"lines\"] = true,\t\t\t\t\t\t\t-- Show Player and Target lines\n\t-- Cast bars\n\t[\"unit_castbar\"] = true,\t\t\t\t\t-- Show castbars\n\t[\"castbar_icon\"] = false,\t\t\t\t\t-- Show castbar icons\n\t[\"castbar_latency\"] = true,\t\t\t\t\t-- Castbar latency\n\t[\"castbar_ticks\"] = false,\t\t\t\t\t-- Castbar ticks\n\t-- Frames\n\t[\"show_pet\"] = true,\t\t\t\t\t\t-- Show pet frame\n\t[\"show_focus\"] = true,\t\t\t\t\t\t-- Show focus frame\n\t[\"show_target_target\"] = true,\t\t\t\t-- Show target target frame\n\t[\"show_boss\"] = true,\t\t\t\t\t\t-- Show boss frames\n\t[\"boss_on_right\"] = true,\t\t\t\t\t-- Boss frames on the right\n\t[\"show_arena\"] = true,\t\t\t\t\t\t-- Show arena frames\n\t[\"arena_on_right\"] = true,\t\t\t\t\t-- Arena frames on the right\n\t-- Icons\n\t[\"icons_pvp\"] = false,\t\t\t\t\t\t-- Mouseover PvP text (not icons) on player and target frames\n\t[\"icons_combat\"] = true,\t\t\t\t\t-- Combat icon\n\t[\"icons_resting\"] = true,\t\t\t\t\t-- Resting icon\n\t-- Portraits\n\t[\"portrait_enable\"] = false,\t\t\t\t-- Enable player/target portraits\n\t[\"portrait_classcolor_border\"] = true,\t\t-- Enable classcolor border\n\t[\"portrait_type\"] = \"3D\",\t\t\t\t\t-- Type of portraits (3D, 2D, ICONS, OVERLAY)\n\t[\"portrait_height\"] = 92,\t\t\t\t\t-- Portrait height\n\t[\"portrait_width\"] = 67,\t\t\t\t\t-- Portrait width\n\t-- Plugins\n\t[\"plugins_gcd\"] = false,\t\t\t\t\t-- Global cooldown spark on player frame\n\t[\"plugins_swing\"] = false,\t\t\t\t\t-- Swing bar\n\t[\"plugins_reputation_bar\"] = false,\t\t\t-- Reputation bar (left from player frame by mouseover, Middle-Click to lock visibility)\n\t[\"plugins_experience_bar\"] = false,\t\t\t-- Experience bar (left from player frame by mouseover, Middle-Click to lock visibility)\n\t[\"plugins_smooth_bar\"] = false,\t\t\t\t-- Smooth bar\n\t[\"plugins_enemy_spec\"] = false,\t\t\t\t-- Enemy specialization in BG and Arena\n\t[\"plugins_combat_feedback\"] = false,\t\t-- Combat text on player/target frame\n\t[\"plugins_fader\"] = false,\t\t\t\t\t-- Fade unit frames\n\t[\"plugins_diminishing\"] = false,\t\t\t-- Diminishing Returns icons on arena frames\n\t[\"plugins_power_prediction\"] = false,\t\t-- Power cost prediction bar on player frame\n\t[\"plugins_absorbs\"] = false,\t\t\t\t-- Absorbs value on player frame\n\t-- Size\n\t[\"player_width\"] = 217,\t\t\t\t\t\t-- Player and Target width\n\t[\"boss_width\"] = 150,\t\t\t\t\t\t-- Boss and Arena width\n\t[\"extra_height_auto\"] = true,\t\t\t\t-- Auto height for health/power depending on font size\n\t[\"extra_health_height\"] = 0,\t\t\t\t-- Additional height for health\n\t[\"extra_power_height\"] = 0,\t\t\t\t\t-- Additional height for power\n\t[\"castbar_width\"] = 258,\t\t\t\t\t-- Player and Target castbar width\n\t[\"castbar_height\"] = 16,\t\t\t\t\t-- Player and Target castbar height\n}\n\n----------------------------------------------------------------------------------------\n--\tUnit Frames Class bar options\n----------------------------------------------------------------------------------------\nC[\"unitframe_class_bar\"] = {\n\t[\"combo\"] = true,\t\t\t\t\t\t\t-- Rogue/Druid Combo bar\n\t[\"combo_always\"] = false,\t\t\t\t\t-- Always show Combo bar for Druid\n\t[\"combo_old\"] = false,\t\t\t\t\t\t-- Show combo point on the target\n\t[\"arcane\"] = true,\t\t\t\t\t\t\t-- Arcane Charge bar\n\t[\"chi\"] = true,\t\t\t\t\t\t\t\t-- Chi bar\n\t[\"essence\"] = true,\t\t\t\t\t\t\t-- Essence bar\n\t[\"stagger\"] = true,\t\t\t\t\t\t\t-- Stagger bar (for Monk Tanks)\n\t[\"holy\"] = true,\t\t\t\t\t\t\t-- Holy Power bar\n\t[\"shard\"] = true,\t\t\t\t\t\t\t-- Shard/Burning bar\n\t[\"rune\"] = true,\t\t\t\t\t\t\t-- Rune bar\n\t[\"totem\"] = true,\t\t\t\t\t\t\t-- Totem bar for Shaman\n\t[\"totem_other\"] = true,\t\t\t\t\t\t-- Totem bar for other classes\n}\n\n----------------------------------------------------------------------------------------\n--\tRaid Frames options\n----------------------------------------------------------------------------------------\nC[\"raidframe\"] = {\n\t-- Main\n\t[\"layout\"] = \"HEAL\",\t\t\t\t\t\t-- Raid layout (HEAL, DPS, AUTO, BLIZZARD)\n\t[\"show_party\"] = true,\t\t\t\t\t\t-- Show party frames\n\t[\"show_raid\"] = true,\t\t\t\t\t\t-- Show raid frames\n\t[\"show_target\"] = true,\t\t\t\t\t\t-- Show target frames\n\t[\"show_pet\"] = true,\t\t\t\t\t\t-- Show pet frames\n\t[\"solo_mode\"] = false,\t\t\t\t\t\t-- Show player frame always\n\t[\"player_in_party\"] = true,\t\t\t\t\t-- Show player frame in party\n\t[\"raid_tanks\"] = true,\t\t\t\t\t\t-- Show raid tanks\n\t[\"raid_tanks_tt\"] = false,\t\t\t\t\t-- Show raid tanks target target\n\t[\"raid_groups\"] = 5,\t\t\t\t\t\t-- Number of groups in raid\n\t[\"auto_position\"] = \"DYNAMIC\",\t\t\t\t-- Auto reposition raid frame (only for Heal layout) (DYNAMIC, STATIC, NONE)\n\t[\"party_vertical\"] = false,\t\t\t\t\t-- Vertical party (only for Heal layout)\n\t[\"raid_groups_vertical\"] = false,\t\t\t-- Vertical raid groups (only for Heal layout)\n\t[\"vertical_health\"] = false,\t\t\t\t-- Vertical orientation of health (only for Heal layout)\n\t[\"by_role\"] = true,\t\t\t\t\t\t\t-- Sorting players in group by role\n\t[\"aggro_border\"] = true,\t\t\t\t\t-- Aggro border\n\t[\"deficit_health\"] = false,\t\t\t\t\t-- Raid deficit health\n\t[\"hide_health_value\"] = false,\t\t\t\t-- Hide raid health value\n\t[\"alpha_health\"] = false,\t\t\t\t\t-- Alpha of healthbars when 100%hp\n\t[\"show_range\"] = true,\t\t\t\t\t\t-- Show range opacity for raidframes\n\t[\"range_alpha\"] = 0.5,\t\t\t\t\t\t-- Alpha of unitframes when unit is out of range\n\t-- Icons\n\t[\"icons_role\"] = false,\t\t\t\t\t\t-- Role icon on frames\n\t[\"icons_raid_mark\"] = true,\t\t\t\t\t-- Raid mark icons on frames\n\t[\"icons_ready_check\"] = true,\t\t\t\t-- Ready check icons on frames\n\t[\"icons_leader\"] = true,\t\t\t\t\t-- Leader icon and assistant icon on frames\n\t[\"icons_sumon\"] = true,\t\t\t\t\t\t-- Sumon icons on frames\n\t[\"icons_phase\"] = true,\t\t\t\t\t\t-- Phase icons on frames\n\t-- Plugins\n\t[\"plugins_aura_watch\"] = true,\t\t\t\t-- Raid debuff icons (from the list)\n\t[\"plugins_aura_watch_timer\"] = false,\t\t-- Timer on raid debuff icons\n\t[\"plugins_debuffhighlight_icon\"] = false,\t-- Show dispellable debuff icon (texture will be shown anyway)\n\t[\"plugins_pvp_debuffs\"] = false,\t\t\t-- Show PvP debuff icons (from the list)\n\t[\"plugins_healcomm\"] = true,\t\t\t\t-- Incoming heal bar on raid frame\n\t[\"plugins_over_absorb\"] = false,\t\t\t-- Show over absorb bar on raid frame\n\t[\"plugins_over_heal_absorb\"] = false,\t\t-- Show over heal absorb on raid frame (from enemy debuffs)\n\t[\"plugins_auto_resurrection\"] = false,\t\t-- Auto cast resurrection on middle-click (doesn't work with Clique)\n\t-- Heal layout size\n\t[\"heal_party_width\"] = 60.2,\t\t\t\t-- Party width\n\t[\"heal_party_height\"] = 26,\t\t\t\t\t-- Party height\n\t[\"heal_party_power_height\"] = 2,\t\t\t-- Party power height\n\t[\"heal_raid_width\"] = 60.2,\t\t\t\t\t-- Raid width\n\t[\"heal_raid_height\"] = 26,\t\t\t\t\t-- Raid height\n\t[\"heal_raid_power_height\"] = 2,\t\t\t\t-- Raid power height\n\t-- DPS layout size\n\t[\"dps_party_width\"] = 140,\t\t\t\t\t-- Party width\n\t[\"dps_party_height\"] = 27,\t\t\t\t\t-- Party height\n\t[\"dps_party_power_height\"] = 5,\t\t\t\t-- Party power height\n\t[\"dps_raid_width\"] = 104,\t\t\t\t\t-- Raid width\n\t[\"dps_raid_height\"] = 17,\t\t\t\t\t-- Raid height\n\t[\"dps_raid_power_height\"] = 1,\t\t\t\t-- Raid power height\n}\n\n----------------------------------------------------------------------------------------\n--\tAuras/Buffs/Debuffs options\n----------------------------------------------------------------------------------------\nC[\"aura\"] = {\n\t[\"player_buff_size\"] = 25,\t\t\t\t\t-- Player buffs size\n\t[\"debuff_size\"] = 25,\t\t\t\t\t\t-- Debuffs size on unitframes\n\t[\"show_spiral\"] = false,\t\t\t\t\t-- Spiral on aura icons\n\t[\"show_timer\"] = true,\t\t\t\t\t\t-- Show cooldown timer on aura icons\n\t[\"player_auras\"] = true,\t\t\t\t\t-- Auras on player frame\n\t[\"target_auras\"] = true,\t\t\t\t\t-- Auras on target frame\n\t[\"focus_debuffs\"] = false,\t\t\t\t\t-- DeBuffs on focus frame\n\t[\"fot_debuffs\"] = false,\t\t\t\t\t-- DeBuffs on focustarget frame\n\t[\"pet_debuffs\"] = false,\t\t\t\t\t-- DeBuffs on pet frame\n\t[\"tot_debuffs\"] = false,\t\t\t\t\t-- DeBuffs on targettarget frame\n\t[\"boss_auras\"] = true,\t\t\t\t\t\t-- Auras on boss frame\n\t[\"boss_debuffs\"] = 0,\t\t\t\t\t\t-- Number of debuffs on the boss frames\n\t[\"boss_buffs\"] = 3,\t\t\t\t\t\t\t-- Number of buffs on the boss frames\n\t[\"player_aura_only\"] = false,\t\t\t\t-- Only your debuff on target frame\n\t[\"debuff_color_type\"] = true,\t\t\t\t-- Color debuff by type\n\t[\"classcolor_border\"] = false,\t\t\t\t-- Enable classcolor border for player buffs\n\t[\"cast_by\"] = false,\t\t\t\t\t\t-- Show who cast a buff/debuff in its tooltip\n}\n\n----------------------------------------------------------------------------------------\n--\tActionBar options\n----------------------------------------------------------------------------------------\nC[\"actionbar\"] = {\n\t-- Main\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable actionbars\n\t[\"hotkey\"] = true,\t\t\t\t\t\t\t-- Show hotkey on buttons\n\t[\"macro\"] = false,\t\t\t\t\t\t\t-- Show macro name on buttons\n\t[\"show_grid\"] = true,\t\t\t\t\t\t-- Show empty action bar buttons\n\t[\"button_size\"] = 25,\t\t\t\t\t\t-- Buttons size\n\t[\"button_space\"] = 3,\t\t\t\t\t\t-- Buttons space\n\t[\"split_bars\"] = false,\t\t\t\t\t\t-- Split the fifth bar on two bars on 6 buttons\n\t[\"classcolor_border\"] = false,\t\t\t\t-- Enable classcolor border\n\t[\"hide_highlight\"] = false,\t\t\t\t\t-- Hide proc highlight\n\t[\"toggle_mode\"] = true,\t\t\t\t\t\t-- Enable toggle mode\n\t-- Bottom bars\n\t[\"bottombars\"] = 2,\t\t\t\t\t\t\t-- Number of action bars on the bottom (1, 2 or 3)\n\t[\"bottombars_mouseover\"] = false,\t\t\t-- Bottom bars on mouseover\n\t-- Right bars\n\t[\"rightbars\"] = 3,\t\t\t\t\t\t\t-- Number of action bars on right (0, 1, 2 or 3)\n\t[\"rightbars_mouseover\"] = true,\t\t\t\t-- Right bars on mouseover\n\t-- Pet bar\n\t[\"petbar_hide\"] = false,\t\t\t\t\t-- Hide pet bar\n\t[\"petbar_horizontal\"] = false,\t\t\t\t-- Enable horizontal pet bar\n\t[\"petbar_mouseover\"] = false,\t\t\t\t-- Pet bar on mouseover (only for horizontal pet bar)\n\t-- Stance bar\n\t[\"stancebar_hide\"] = false,\t\t\t\t\t-- Hide stance bar\n\t[\"stancebar_horizontal\"] = true,\t\t\t-- Enable horizontal stance bar\n\t[\"stancebar_mouseover\"] = true,\t\t\t\t-- Stance bar on mouseover (only for horizontal stance bar)\n\t-- MicroMenu\n\t[\"micromenu\"] = false,\t\t\t\t\t\t-- Enable micro menu\n\t[\"micromenu_mouseover\"] = false,\t\t\t-- Micro menu on mouseover\n\t-- Bars editor\n\t[\"editor\"] = false,\t\t\t\t\t\t\t-- Allow to move and change each panel individually\n\t-- Bar 1\n\t[\"bar1_num\"] = 12,\t\t\t\t\t\t\t-- Number of buttons\n\t[\"bar1_row\"] = 12,\t\t\t\t\t\t\t-- Buttons per row\n\t[\"bar1_size\"] = 25,\t\t\t\t\t\t\t-- Buttons size\n\t[\"bar1_mouseover\"] = false,\t\t\t\t\t-- Bar on mouseover\n\t-- Bar 2\n\t[\"bar2_num\"] = 12,\t\t\t\t\t\t\t-- Number of buttons\n\t[\"bar2_row\"] = 12,\t\t\t\t\t\t\t-- Buttons per row\n\t[\"bar2_size\"] = 25,\t\t\t\t\t\t\t-- Buttons size\n\t[\"bar2_mouseover\"] = false,\t\t\t\t\t-- Bar on mouseover\n\t-- Bar 3\n\t[\"bar3_num\"] = 12,\t\t\t\t\t\t\t-- Number of buttons\n\t[\"bar3_row\"] = 1,\t\t\t\t\t\t\t-- Buttons per row\n\t[\"bar3_size\"] = 25,\t\t\t\t\t\t\t-- Buttons size\n\t[\"bar3_mouseover\"] = false,\t\t\t\t\t-- Bar on mouseover\n\t-- Bar 4\n\t[\"bar4_num\"] = 12,\t\t\t\t\t\t\t-- Number of buttons\n\t[\"bar4_row\"] = 1,\t\t\t\t\t\t\t-- Buttons per row\n\t[\"bar4_size\"] = 25,\t\t\t\t\t\t\t-- Buttons size\n\t[\"bar4_mouseover\"] = false,\t\t\t\t\t-- Bar on mouseover\n\t-- Bar 5\n\t[\"bar5_num\"] = 12,\t\t\t\t\t\t\t-- Number of buttons\n\t[\"bar5_row\"] = 12,\t\t\t\t\t\t\t-- Buttons per row\n\t[\"bar5_size\"] = 25,\t\t\t\t\t\t\t-- Buttons size\n\t[\"bar5_mouseover\"] = false,\t\t\t\t\t-- Bar on mouseover\n\t-- Bar 6\n\t[\"bar6_num\"] = 12,\t\t\t\t\t\t\t-- Number of buttons\n\t[\"bar6_row\"] = 1,\t\t\t\t\t\t\t-- Buttons per row\n\t[\"bar6_size\"] = 25,\t\t\t\t\t\t\t-- Buttons size\n\t[\"bar6_mouseover\"] = false,\t\t\t\t\t-- Bar on mouseover\n\t-- Bar 7\n\t[\"bar7_enable\"] = false,\t\t\t\t\t-- Enable custom bar 7\n\t[\"bar7_num\"] = 12,\t\t\t\t\t\t\t-- Number of buttons\n\t[\"bar7_row\"] = 12,\t\t\t\t\t\t\t-- Buttons per row\n\t[\"bar7_size\"] = 25,\t\t\t\t\t\t\t-- Buttons size\n\t[\"bar7_mouseover\"] = false,\t\t\t\t\t-- Bar on mouseover\n\t-- Bar 8\n\t[\"bar8_enable\"] = false,\t\t\t\t\t-- Enable custom bar 8\n\t[\"bar8_num\"] = 12,\t\t\t\t\t\t\t-- Number of buttons\n\t[\"bar8_row\"] = 12,\t\t\t\t\t\t\t-- Buttons per row\n\t[\"bar8_size\"] = 25,\t\t\t\t\t\t\t-- Buttons size\n\t[\"bar8_mouseover\"] = false,\t\t\t\t\t-- Bar on mouseover\n}\n\n----------------------------------------------------------------------------------------\n--\tTooltip options\n----------------------------------------------------------------------------------------\nC[\"tooltip\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable tooltip\n\t[\"shift_modifer\"] = false,\t\t\t\t\t-- Show tooltip when Shift is pushed\n\t[\"cursor\"] = false,\t\t\t\t\t\t\t-- Tooltip above cursor\n\t[\"item_icon\"] = false,\t\t\t\t\t\t-- Item icon in tooltip\n\t[\"health_value\"] = false,\t\t\t\t\t-- Numeral health value\n\t[\"hidebuttons\"] = false,\t\t\t\t\t-- Hide tooltip for actions bars\n\t[\"hide_combat\"] = false,\t\t\t\t\t-- Hide tooltip in combat\n\t-- Plugins\n\t[\"title\"] = false,\t\t\t\t\t\t\t-- Player title in tooltip\n\t[\"realm\"] = true,\t\t\t\t\t\t\t-- Player realm name in tooltip\n\t[\"rank\"] = true,\t\t\t\t\t\t\t-- Player guild-rank in tooltip\n\t[\"target\"] = true,\t\t\t\t\t\t\t-- Target player in tooltip\n\t[\"talents\"] = false,\t\t\t\t\t\t-- Show specialization\n\t[\"average_lvl\"] = false,\t\t\t\t\t-- Average items level\n\t[\"show_shift\"] = true,\t\t\t\t\t\t-- Show items level and spec when Shift is pushed\n\t[\"raid_icon\"] = false,\t\t\t\t\t\t-- Raid icon\n\t[\"unit_role\"] = false,\t\t\t\t\t\t-- Unit role in tooltip\n\t[\"who_targetting\"] = false,\t\t\t\t\t-- Show who is targetting the unit (in raid or party)\n\t[\"spell_id\"] = false,\t\t\t\t\t\t-- Id number spells (/si to print buff info in chat)\n\t[\"item_count\"] = false,\t\t\t\t\t\t-- Item count in bags and bank\n\t[\"achievements\"] = true,\t\t\t\t\t-- Comparing achievements in tooltip\n\t[\"instance_lock\"] = false,\t\t\t\t\t-- Your instance lock status in tooltip\n\t[\"mount\"] = false,\t\t\t\t\t\t\t-- Show source of mount\n}\n\n----------------------------------------------------------------------------------------\n--\tChat options\n----------------------------------------------------------------------------------------\nC[\"chat\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable chat\n\t[\"width\"] = 350,\t\t\t\t\t\t\t-- Chat width\n\t[\"height\"] = 112,\t\t\t\t\t\t\t-- Chat height\n\t[\"background\"] = false,\t\t\t\t\t\t-- Enable background for chat\n\t[\"background_alpha\"] = 0.7,\t\t\t\t\t-- Background alpha\n\t[\"filter\"] = true,\t\t\t\t\t\t\t-- Removing some systems spam (\"Player1\" won duel \"Player2\")\n\t[\"spam\"] = false,\t\t\t\t\t\t\t-- Removing some players spam (gold/portals/etc)\n\t[\"chat_bar\"] = false,\t\t\t\t\t\t-- Lite Button Bar for switch chat channel\n\t[\"chat_bar_mouseover\"] = false,\t\t\t\t-- Lite Button Bar on mouseover\n\t[\"whisp_sound\"] = true,\t\t\t\t\t\t-- Sound when whisper\n\t[\"combatlog\"] = true,\t\t\t\t\t\t-- Show CombatLog tab\n\t[\"tabs_mouseover\"] = false,\t\t\t\t\t-- Chat tabs on mouseover\n\t[\"sticky\"] = true,\t\t\t\t\t\t\t-- Remember last channel\n\t[\"damage_meter_spam\"] = false,\t\t\t\t-- Merge damage meter spam in one line-link\n\t[\"loot_icons\"] = false,\t\t\t\t\t\t-- Icons for loot\n\t[\"role_icons\"] = false,\t\t\t\t\t\t-- Role Icons\n\t[\"history\"] = false,\t\t\t\t\t\t-- Chat history\n\t[\"hide_combat\"] = false,\t\t\t\t\t-- Hide chat in combat\n\t[\"custom_time_color\"] = true,\t\t\t\t-- Enable custom timestamp coloring\n\t[\"time_color\"] = {1, 1, 0},\t\t\t\t\t-- Timestamp coloring (http://www.december.com/html/spec/colorcodescompact.html)\n}\n\n----------------------------------------------------------------------------------------\n--\tNameplate options\n----------------------------------------------------------------------------------------\nC[\"nameplate\"] = {\n\t[\"enable\"] = true, \t\t\t\t\t\t\t-- Enable nameplate\n\t[\"width\"] = 120,\t\t\t\t\t\t\t-- Nameplate width\n\t[\"height\"] = 9,\t\t\t\t\t\t\t\t-- Nameplate height\n\t[\"ad_width\"] = 0,\t\t\t\t\t\t\t-- Additional width for selected nameplate\n\t[\"ad_height\"] = 0,\t\t\t\t\t\t\t-- Additional height for selected nameplate\n\t[\"alpha\"] = 0.5,\t\t\t\t\t\t\t-- Non-target nameplate alpha\n\t[\"combat\"] = false,\t\t\t\t\t\t\t-- Automatically show nameplate in combat\n\t[\"health_value\"] = false,\t\t\t\t\t-- Numeral health value\n\t[\"show_castbar_name\"] = false,\t\t\t\t-- Show castbar name\n\t[\"class_icons\"] = false,\t\t\t\t\t-- Icons by class in PvP\n\t[\"name_abbrev\"] = false,\t\t\t\t\t-- Display abbreviated names\n\t[\"short_name\"] = false,\t\t\t\t\t\t-- Replace names with short ones\n\t[\"clamp\"] = false,\t\t\t\t\t\t\t-- Clamp nameplates to the top of the screen when outside of view\n\t[\"track_debuffs\"] = false,\t\t\t\t\t-- Show your debuffs (from the list)\n\t[\"track_buffs\"] = false,\t\t\t\t\t-- Show dispellable enemy buffs and buffs from the list\n\t[\"auras_size\"] = 25,\t\t\t\t\t\t-- Auras size\n\t[\"healer_icon\"] = false,\t\t\t\t\t-- Show icon above enemy healers nameplate in battlegrounds\n\t[\"totem_icons\"] = false,\t\t\t\t\t-- Show icon above enemy totems nameplate\n\t[\"target_glow\"] = false,\t\t\t\t\t-- Show glow texture for target\n\t[\"only_name\"] = false,\t\t\t\t\t\t-- Show only name for friendly units\n\t[\"quests\"] = false,\t\t\t\t\t\t\t-- Show quest icon\n\t[\"low_health\"] = false,\t\t\t\t\t\t-- Show red border when low health\n\t[\"low_health_value\"] = 0.2,\t\t\t\t\t-- Value for low health (between 0.1 and 1)\n\t[\"low_health_color\"] = {0.8, 0, 0},\t\t\t-- Color for low health border\n\t[\"cast_color\"] = false,\t\t\t\t\t\t-- Show color border for casting important spells\n\t[\"kick_color\"] = false,\t\t\t\t\t\t-- Change cast color if interrupt on cd\n\t-- Threat\n\t[\"enhance_threat\"] = true,\t\t\t\t\t-- Enable threat feature, automatically changes by your role\n\t[\"good_color\"] = {0.2, 0.8, 0.2},\t\t\t-- Good threat color\n\t[\"near_color\"] = {1, 1, 0},\t\t\t\t\t-- Near threat color\n\t[\"bad_color\"] = {1, 0, 0},\t\t\t\t\t-- Bad threat color\n\t[\"offtank_color\"] = {0, 0.5, 1},\t\t\t-- Offtank threat color\n\t[\"extra_color\"] = {1, 0.3, 0},\t\t\t\t-- Explosive and Spiteful affix color\n\t[\"mob_color_enable\"] = false,\t\t\t\t-- Change color for important mobs in dungeons\n\t[\"mob_color\"] = {0, 0.5, 0.8},\t\t\t\t-- Color for mobs\n}\n\n----------------------------------------------------------------------------------------\n--\tCombat text options\n----------------------------------------------------------------------------------------\nC[\"combattext\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Global enable combat text\n\t[\"blizz_head_numbers\"] = false,\t\t\t\t-- Use blizzard damage/healing output (above mob/player head)\n\t[\"damage_style\"] = true,\t\t\t\t\t-- Change default damage/healing font above mobs/player heads (you need to restart WoW to see changes)\n\t[\"damage\"] = true,\t\t\t\t\t\t\t-- Show outgoing damage\n\t[\"pet_damage\"] = true,\t\t\t\t\t\t-- Show your pet damage\n\t[\"dot_damage\"] = true,\t\t\t\t\t\t-- Show damage from your dots\n\t[\"healing\"] = true,\t\t\t\t\t\t\t-- Show outgoing healing\n\t[\"show_hots\"] = true,\t\t\t\t\t\t-- Show periodic healing effects in healing frame\n\t[\"show_overhealing\"] = true,\t\t\t\t-- Show outgoing overhealing\n\t[\"incoming\"] = true,\t\t\t\t\t\t-- Show incoming damage and healing\n\t[\"damage_color\"] = true,\t\t\t\t\t-- Display damage numbers depending on school of magic\n\t[\"dispel\"] = true,\t\t\t\t\t\t\t-- Tells you about your dispels (works only with [\"damage\"] = true)\n\t[\"interrupt\"] = true,\t\t\t\t\t\t-- Tells you about your interrupts (works only with [\"damage\"] = true)\n\t[\"icons\"] = true,\t\t\t\t\t\t\t-- Show outgoing damage icons\n\t[\"icon_size\"] = 16,\t\t\t\t\t\t\t-- Icon size of spells in outgoing damage frame, also has effect on dmg font size\n\t[\"max_lines\"] = 15,\t\t\t\t\t\t\t-- Max lines to keep in scrollable mode (more lines = more memory)\n\t[\"time_visible\"] = 3,\t\t\t\t\t\t-- Time (seconds) a single message will be visible\n\t[\"short_numbers\"] = true,\t\t\t\t\t-- Use short numbers (\"25.3k\" instead of \"25342\")\n\t[\"merge_aoe_spam\"] = true,\t\t\t\t\t-- Merges multiple aoe damage/heal spam into single message\n\t[\"merge_melee\"] = true,\t\t\t\t\t\t-- Merges multiple auto attack damage spam\n\t[\"merge_all\"] = false,\t\t\t\t\t\t-- Merges all spells\n\t[\"direction\"] = true,\t\t\t\t\t\t-- Change scrolling direction from bottom to top\n\t[\"dk_runes\"] = true,\t\t\t\t\t\t-- Show Death Knight rune recharge\n\t[\"killingblow\"] = false,\t\t\t\t\t-- Tells you about your killingblows\n\t[\"scrollable\"] = false,\t\t\t\t\t\t-- Allows you to scroll frame lines with mousewheel\n\t[\"crit_prefix\"] = \"*\",\t\t\t\t\t\t-- Symbol that will be added before crit\n\t[\"crit_postfix\"] = \"*\",\t\t\t\t\t\t-- Symbol that will be added after crit\n\t[\"treshold\"] = 1,\t\t\t\t\t\t\t-- Minimum damage to show in damage frame\n\t[\"heal_treshold\"] = 1,\t\t\t\t\t\t-- Minimum healing to show in incoming/outgoing healing messages\n}\n\n----------------------------------------------------------------------------------------\n--\tBag options\n----------------------------------------------------------------------------------------\nC[\"bag\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable bags\n\t[\"ilvl\"] = false,\t\t\t\t\t\t\t-- Show item level for weapons and armor\n\t[\"new_items\"] = false,\t\t\t\t\t\t-- Show animation for new items\n\t[\"filter\"] = false,\t\t\t\t\t\t\t-- Always show filter buttons\n\t[\"button_size\"] = 27,\t\t\t\t\t\t-- Buttons size\n\t[\"button_space\"] = 3,\t\t\t\t\t\t-- Buttons space\n\t[\"bank_columns\"] = 17,\t\t\t\t\t\t-- Horizontal number of columns in bank\n\t[\"bag_columns\"] = 10,\t\t\t\t\t\t-- Horizontal number of columns in main bag\n}\n\n----------------------------------------------------------------------------------------\n--\tMinimap options\n----------------------------------------------------------------------------------------\nC[\"minimap\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable minimap\n\t[\"on_top\"] = false,\t\t\t\t\t\t\t-- Move minimap on top right corner\n\t[\"tracking_icon\"] = false,\t\t\t\t\t-- Tracking icon\n\t[\"garrison_icon\"] = false,\t\t\t\t\t-- Covenant icon\n\t[\"size\"] = 130,\t\t\t\t\t\t\t\t-- Minimap size\n\t[\"hide_combat\"] = false,\t\t\t\t\t-- Hide minimap in combat\n\t[\"toggle_menu\"] = true,\t\t\t\t\t\t-- Show toggle menu\n\t-- Other\n\t[\"bg_map_stylization\"] = true,\t\t\t\t-- BG map stylization\n\t[\"fog_of_war\"] = false,\t\t\t\t\t\t-- Remove fog of war on World Map\n}\n\n----------------------------------------------------------------------------------------\n--\tLoot options\n----------------------------------------------------------------------------------------\nC[\"loot\"] = {\n\t[\"lootframe\"] = true,\t\t\t\t\t\t-- Enable loot frame\n\t[\"rolllootframe\"] = true,\t\t\t\t\t-- Enable group roll frame (Blizzard doesn't use roll system anymore)\n\t[\"icon_size\"] = 22,\t\t\t\t\t\t\t-- Icon size\n\t[\"width\"] = 221,\t\t\t\t\t\t\t-- Loot window width\n\t[\"auto_greed\"] = false,\t\t\t\t\t\t-- Push \"greed\" or \"disenchant\" button when green item roll at max level (Blizzard doesn't use roll system anymore)\n\t[\"auto_confirm_de\"] = true,\t\t\t\t\t-- Auto confirm disenchant and take BoP loot\n\t[\"faster_loot\"] = false,\t\t\t\t\t-- Faster auto looting\n}\n\n----------------------------------------------------------------------------------------\n--\tFilger options\n----------------------------------------------------------------------------------------\nC[\"filger\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable Filger\n\t[\"show_tooltip\"] = false,\t\t\t\t\t-- Show tooltip\n\t[\"expiration\"] = false,\t\t\t\t\t\t-- Sort cooldowns by expiration time\n\t-- Elements\n\t[\"show_buff\"] = true,\t\t\t\t\t\t-- Player buffs\n\t[\"show_proc\"] = true,\t\t\t\t\t\t-- Player procs\n\t[\"show_debuff\"] = true,\t\t\t\t\t\t-- Debuffs on target\n\t[\"show_aura_bar\"] = true,\t\t\t\t\t-- Aura bars on target\n\t[\"show_special\"] = true,\t\t\t\t\t-- Special buffs on player\n\t[\"show_pvp_player\"] = true,\t\t\t\t\t-- PvP debuffs on player\n\t[\"show_pvp_target\"] = true,\t\t\t\t\t-- PvP auras on target\n\t[\"show_cd\"] = true,\t\t\t\t\t\t\t-- Cooldowns\n\t-- Icons size\n\t[\"buffs_size\"] = 37,\t\t\t\t\t\t-- Buffs size\n\t[\"buffs_space\"] = 3,\t\t\t\t\t\t-- Buffs space\n\t[\"pvp_size\"] = 60,\t\t\t\t\t\t\t-- PvP auras size\n\t[\"pvp_space\"] = 3,\t\t\t\t\t\t\t-- PvP auras space\n\t[\"cooldown_size\"] = 30,\t\t\t\t\t\t-- Cooldowns size\n\t[\"cooldown_space\"] = 3,\t\t\t\t\t\t-- Cooldowns space\n\t-- Testing\n\t[\"test_mode\"] = false,\t\t\t\t\t\t-- Test icon mode\n\t[\"max_test_icon\"] = 5,\t\t\t\t\t\t-- Number of icons in test mode\n}\n\n----------------------------------------------------------------------------------------\n--\tAnnouncements options\n----------------------------------------------------------------------------------------\nC[\"announcements\"] = {\n\t[\"interrupts\"] = false,\t\t\t\t\t\t-- Announce when you interrupt\n\t[\"spells\"] = false,\t\t\t\t\t\t\t-- Announce when you cast some spell (from the list)\n\t[\"spells_from_all\"] = false,\t\t\t\t-- Check spells cast from all members\n\t[\"feasts\"] = false,\t\t\t\t\t\t\t-- Announce Feasts/Souls/Repair Bots cast\n\t[\"portals\"] = false,\t\t\t\t\t\t-- Announce Portals/Ritual of Summoning cast\n\t[\"toys\"] = false,\t\t\t\t\t\t\t-- Announce some annoying toys\n\t[\"flask_food\"] = false,\t\t\t\t\t\t-- Announce the usage of flasks and food (/ffcheck)\n\t[\"flask_food_raid\"] = false,\t\t\t\t-- Announce to raid channel\n\t[\"flask_food_auto\"] = false,\t\t\t\t-- Auto check when ReadyCheck\n\t[\"drinking\"] = false,\t\t\t\t\t\t-- Announce when arena enemy is drinking\n\t[\"pull_countdown\"] = true,\t\t\t\t\t-- Pull countdown announce (/pc #)\n\t[\"bad_gear\"] = false,\t\t\t\t\t\t-- Check your bad gear in instance (fishing pole, from the list)\n\t[\"safari_hat\"] = true,\t\t\t\t\t\t-- Check Safari Hat when starting Pet Battle\n}\n\n----------------------------------------------------------------------------------------\n--\tAutomation options\n----------------------------------------------------------------------------------------\nC[\"automation\"] = {\n\t[\"release\"] = true,\t\t\t\t\t\t\t-- Auto release the spirit in battlegrounds\n\t[\"screenshot\"] = false,\t\t\t\t\t\t-- Take screenshot when player get achievement\n\t[\"solve_artifact\"] = true,\t\t\t\t\t-- Auto popup for solve artifact\n\t[\"accept_invite\"] = false,\t\t\t\t\t-- Auto accept invite\n\t[\"decline_duel\"] = true,\t\t\t\t\t-- Auto decline duel (/disduel to temporarily disable)\n\t[\"accept_quest\"] = false,\t\t\t\t\t-- Auto accept quests (disabled if hold Shift)\n\t[\"auto_collapse\"] = \"NONE\",\t\t\t\t\t-- Auto collapse Objective Tracker (RAID, RELOAD, SCENARIO, NONE)\n\t[\"skip_cinematic\"] = false,\t\t\t\t\t-- Auto skip cinematics/movies (disabled if hold Ctrl)\n\t[\"auto_role\"] = false,\t\t\t\t\t\t-- Auto set your role\n\t[\"cancel_bad_buffs\"] = false,\t\t\t\t-- Auto cancel annoying holiday buffs (from the list)\n\t[\"tab_binder\"] = false,\t\t\t\t\t\t-- Auto change Tab key to only target enemy players in PvP\n\t[\"logging_combat\"] = false,\t\t\t\t\t-- Auto enables combat log text file in raid instances\n\t[\"buff_on_scroll\"] = false,\t\t\t\t\t-- Cast buff on mouse scroll (from the list)\n\t[\"open_items\"] = false,\t\t\t\t\t\t-- Auto opening of items in bag\n\t[\"resurrection\"] = false,\t\t\t\t\t-- Auto confirm resurrection\n\t[\"summon\"] = false,\t\t\t\t\t\t\t-- Auto confirm summon after 10 sec\n\t[\"whisper_invite\"] = false,\t\t\t\t\t-- Auto invite when whisper keyword\n\t[\"invite_keyword\"] = \"inv +\",\t\t\t\t-- List of keyword (separated by space)\n}\n\n----------------------------------------------------------------------------------------\n--\tBuffs reminder options\n----------------------------------------------------------------------------------------\nC[\"reminder\"] = {\n\t-- Self buffs\n\t[\"solo_buffs_enable\"] = true,\t\t\t\t-- Enable buff reminder\n\t[\"solo_buffs_sound\"] = false,\t\t\t\t-- Enable warning sound notification for buff reminder\n\t[\"solo_buffs_size\"] = 45,\t\t\t\t\t-- Icon size\n\t-- Raid buffs\n\t[\"raid_buffs_enable\"] = true,\t\t\t\t-- Show missing raid buffs\n\t[\"raid_buffs_always\"] = false,\t\t\t\t-- Show frame always (default show only in raid)\n\t[\"raid_buffs_size\"] = 19.2,\t\t\t\t\t-- Icon size\n\t[\"raid_buffs_alpha\"] = 0,\t\t\t\t\t-- Transparent icons when the buff is present\n}\n\n----------------------------------------------------------------------------------------\n--\tRaid cooldowns options\n----------------------------------------------------------------------------------------\nC[\"raidcooldown\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable raid cooldowns\n\t[\"height\"] = 15,\t\t\t\t\t\t\t-- Bars height\n\t[\"width\"] = 186,\t\t\t\t\t\t\t-- Bars width (if show_icon = false, bar width+28)\n\t[\"upwards\"] = false,\t\t\t\t\t\t-- Sort upwards bars\n\t[\"expiration\"] = false,\t\t\t\t\t\t-- Sort by expiration time\n\t[\"show_self\"] = true,\t\t\t\t\t\t-- Show self cooldowns\n\t[\"show_icon\"] = true,\t\t\t\t\t\t-- Show icons\n\t[\"show_inraid\"] = true,\t\t\t\t\t\t-- Show in raid zone\n\t[\"show_inparty\"] = true,\t\t\t\t\t-- Show in party zone\n\t[\"show_inarena\"] = true,\t\t\t\t\t-- Show in arena zone\n}\n\n----------------------------------------------------------------------------------------\n--\tEnemy cooldowns options\n----------------------------------------------------------------------------------------\nC[\"enemycooldown\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable enemy cooldowns\n\t[\"size\"] = 30,\t\t\t\t\t\t\t\t-- Icon size\n\t[\"direction\"] = \"RIGHT\",\t\t\t\t\t-- Icon direction\n\t[\"show_always\"] = false,\t\t\t\t\t-- Show everywhere\n\t[\"show_inpvp\"] = false,\t\t\t\t\t\t-- Show in bg zone\n\t[\"show_inarena\"] = true,\t\t\t\t\t-- Show in arena zone\n\t[\"show_inparty\"] = false,\t\t\t\t\t-- Show in party zone for allies\n\t[\"class_color\"] = false,\t\t\t\t\t-- Enable classcolor border\n}\n\n----------------------------------------------------------------------------------------\n--\tPulse cooldowns options\n----------------------------------------------------------------------------------------\nC[\"pulsecooldown\"] = {\n\t[\"enable\"] = false,\t\t\t\t\t\t\t-- Show cooldowns pulse\n\t[\"size\"] = 75,\t\t\t\t\t\t\t\t-- Icon size\n\t[\"sound\"] = false,\t\t\t\t\t\t\t-- Warning sound notification\n\t[\"anim_scale\"] = 1.5,\t\t\t\t\t\t-- Animation scaling\n\t[\"hold_time\"] = 0,\t\t\t\t\t\t\t-- Max opacity hold time\n\t[\"threshold\"] = 3,\t\t\t\t\t\t\t-- Minimal threshold time\n}\n\n----------------------------------------------------------------------------------------\n--\tThreat options\n----------------------------------------------------------------------------------------\nC[\"threat\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable threat meter\n\t[\"height\"] = 12,\t\t\t\t\t\t\t-- Bars height\n\t[\"width\"] = 217,\t\t\t\t\t\t\t-- Bars width\n\t[\"bar_rows\"] = 7,\t\t\t\t\t\t\t-- Number of bars\n\t[\"hide_solo\"] = false,\t\t\t\t\t\t-- Show only in party/raid\n}\n\n----------------------------------------------------------------------------------------\n--\tTop panel options\n----------------------------------------------------------------------------------------\nC[\"toppanel\"] = {\n\t[\"enable\"] = true,\t\t\t\t\t\t\t-- Enable top panel\n\t[\"mouseover\"] = true,\t\t\t\t\t\t-- Top panel on mouseover\n\t[\"height\"] = 55,\t\t\t\t\t\t\t-- Panel height\n\t[\"width\"] = 250,\t\t\t\t\t\t\t-- Panel width\n}\n\n----------------------------------------------------------------------------------------\n--\tStats options\n----------------------------------------------------------------------------------------\nC[\"stats\"] = {\n\t[\"clock\"] = true,\t\t\t\t\t\t\t-- Clock\n\t[\"latency\"] = true,\t\t\t\t\t\t\t-- Latency\n\t[\"fps\"] = true,\t\t\t\t\t\t\t\t-- FPS\n\t[\"friend\"] = true,\t\t\t\t\t\t\t-- Friends\n\t[\"guild\"] = true,\t\t\t\t\t\t\t-- Guild\n\t[\"durability\"] = true,\t\t\t\t\t\t-- Durability\n\t[\"experience\"] = true,\t\t\t\t\t\t-- Experience\n\t[\"talents\"] = true,\t\t\t\t\t\t\t-- Specialization\n\t[\"location\"] = true,\t\t\t\t\t\t-- Location\n\t[\"coords\"] = true,\t\t\t\t\t\t\t-- Coords\n\t[\"battleground\"] = false,\t\t\t\t\t-- BG Score\n\t[\"damage\"] = false,\t\t\t\t\t\t\t-- Show damage per second\n\t[\"bottom_line\"] = true,\t\t\t\t\t\t-- Bottom classcolor line\n\t-- Currency (displayed in gold stats)\n\t[\"currency_archaeology\"] = false,\t\t\t-- Archaeology Fragments\n\t[\"currency_cooking\"] = true,\t\t\t\t-- Cooking Awards\n\t[\"currency_raid\"] = true,\t\t\t\t\t-- Raid Seals\n\t[\"currency_misc\"] = true,\t\t\t\t\t-- Expansion Currency\n}\n\n----------------------------------------------------------------------------------------\n--\tTrade options\n----------------------------------------------------------------------------------------\nC[\"trade\"] = {\n\t[\"profession_tabs\"] = true,\t\t\t\t\t-- Professions tabs on TradeSkill frames\n\t[\"already_known\"] = true,\t\t\t\t\t-- Colorizes recipes/mounts/pets/toys that is already known\n\t[\"disenchanting\"] = false,\t\t\t\t\t-- Milling, Prospecting and Disenchanting by Alt + click\n\t[\"enchantment_scroll\"] = false,\t\t\t\t-- Enchantment scroll on TradeSkill frame\n\t[\"sum_buyouts\"] = false,\t\t\t\t\t-- Sum up all current auctions\n\t[\"archaeology\"] = false,\t\t\t\t\t-- Archaeology tracker ('/arch' or right mouseover minimap button to show)\n\t[\"merchant_itemlevel\"] = false,\t\t\t\t-- Show item level for weapons and armor in merchant\n}\n\n----------------------------------------------------------------------------------------\n--\tMiscellaneous options\n----------------------------------------------------------------------------------------\nC[\"misc\"] = {\n\t[\"raid_tools\"] = true,\t\t\t\t\t\t-- Raid tools\n\t[\"shift_marking\"] = true,\t\t\t\t\t-- Marks mouseover target when you push Shift (only in group)\n\t[\"afk_spin_camera\"] = false,\t\t\t\t-- Spin camera while afk\n\t[\"quest_auto_button\"] = false,\t\t\t\t-- Quest/item auto button (from the list)\n\t[\"item_level\"] = true,\t\t\t\t\t\t-- Item level on character slot buttons\n\t[\"click_cast\"] = false,\t\t\t\t\t\t-- Simple click2cast spell binder\n\t[\"click_cast_filter\"] = false,\t\t\t\t-- Ignore Player and Target frames for click2cast\n\t[\"chars_currency\"] = false,\t\t\t\t\t-- Tracks your currency tokens across multiple characters\n\t[\"hide_raid_button\"] = false,\t\t\t\t-- Button to hide raid frames in DPS layout (top left mouseover)\n}"
  },
  {
    "path": "ShestakUI/Core/API.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\r\n\r\nlocal backdropr, backdropg, backdropb, backdropa = unpack(C.media.backdrop_color)\r\nlocal borderr, borderg, borderb, bordera = unpack(C.media.border_color)\r\n\r\nlocal Mult = T.mult\r\nif T.screenHeight > 1200 then\r\n\tMult = T.Scale(1)\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tPosition functions\r\n----------------------------------------------------------------------------------------\r\nlocal function SetOutside(obj, anchor, xOffset, yOffset)\r\n\txOffset = xOffset or 2\r\n\tyOffset = yOffset or 2\r\n\tanchor = anchor or obj:GetParent()\r\n\r\n\tif obj:GetPoint() then\r\n\t\tobj:ClearAllPoints()\r\n\tend\r\n\r\n\tobj:SetPoint(\"TOPLEFT\", anchor, \"TOPLEFT\", -xOffset, yOffset)\r\n\tobj:SetPoint(\"BOTTOMRIGHT\", anchor, \"BOTTOMRIGHT\", xOffset, -yOffset)\r\nend\r\n\r\nlocal function SetInside(obj, anchor, xOffset, yOffset)\r\n\txOffset = xOffset or 2\r\n\tyOffset = yOffset or 2\r\n\tanchor = anchor or obj:GetParent()\r\n\r\n\tif obj:GetPoint() then\r\n\t\tobj:ClearAllPoints()\r\n\tend\r\n\r\n\tobj:SetPoint(\"TOPLEFT\", anchor, \"TOPLEFT\", xOffset, -yOffset)\r\n\tobj:SetPoint(\"BOTTOMRIGHT\", anchor, \"BOTTOMRIGHT\", -xOffset, yOffset)\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tTemplate functions\r\n----------------------------------------------------------------------------------------\r\nlocal function CreateOverlay(f)\r\n\tif f.overlay then return end\r\n\r\n\tlocal overlay = f:CreateTexture(\"$parentOverlay\", \"BORDER\")\r\n\toverlay:SetInside()\r\n\toverlay:SetTexture(C.media.blank)\r\n\toverlay:SetVertexColor(0.1, 0.1, 0.1, 1)\r\n\tf.overlay = overlay\r\nend\r\n\r\nlocal function CreateBorder(f, i, o)\r\n\tif i then\r\n\t\tif f.iborder then return end\r\n\t\tlocal border = CreateFrame(\"Frame\", \"$parentInnerBorder\", f, \"BackdropTemplate\")\r\n\t\tborder:SetPoint(\"TOPLEFT\", Mult, -Mult)\r\n\t\tborder:SetPoint(\"BOTTOMRIGHT\", -Mult, Mult)\r\n\t\tborder:SetBackdrop({\r\n\t\t\tedgeFile = C.media.blank, edgeSize = Mult,\r\n\t\t\tinsets = {left = Mult, right = Mult, top = Mult, bottom = Mult}\r\n\t\t})\r\n\t\tborder:SetBackdropBorderColor(unpack(C.media.backdrop_color))\r\n\t\tf.iborder = border\r\n\tend\r\n\r\n\tif o then\r\n\t\tif f.oborder then return end\r\n\t\tlocal border = CreateFrame(\"Frame\", \"$parentOuterBorder\", f, \"BackdropTemplate\")\r\n\t\tborder:SetPoint(\"TOPLEFT\", -Mult, Mult)\r\n\t\tborder:SetPoint(\"BOTTOMRIGHT\", Mult, -Mult)\r\n\t\tborder:SetFrameLevel(f:GetFrameLevel() + 1)\r\n\t\tborder:SetBackdrop({\r\n\t\t\tedgeFile = C.media.blank, edgeSize = Mult,\r\n\t\t\tinsets = {left = Mult, right = Mult, top = Mult, bottom = Mult}\r\n\t\t})\r\n\t\tborder:SetBackdropBorderColor(unpack(C.media.backdrop_color))\r\n\t\tf.oborder = border\r\n\tend\r\nend\r\n\r\nlocal function GetTemplate(t)\r\n\tif t == \"ClassColor\" then\r\n\t\tborderr, borderg, borderb, bordera = unpack(C.media.classborder_color)\r\n\t\tbackdropr, backdropg, backdropb, backdropa = unpack(C.media.backdrop_color)\r\n\telse\r\n\t\tborderr, borderg, borderb, bordera = unpack(C.media.border_color)\r\n\t\tbackdropr, backdropg, backdropb, backdropa = unpack(C.media.backdrop_color)\r\n\tend\r\nend\r\n\r\nlocal function SetTemplate(f, t)\r\n\tMixin(f, BackdropTemplateMixin) -- 9.0 to set backdrop\r\n\tGetTemplate(t)\r\n\r\n\tf:SetBackdrop({\r\n\t\tbgFile = C.media.blank, edgeFile = C.media.blank, edgeSize = Mult,\r\n\t\tinsets = {left = -Mult, right = -Mult, top = -Mult, bottom = -Mult}\r\n\t})\r\n\r\n\tif t == \"Transparent\" then\r\n\t\tbackdropa = C.media.backdrop_alpha\r\n\t\tf:CreateBorder(true, true)\r\n\telseif t == \"Overlay\" then\r\n\t\tbackdropa = 1\r\n\t\tf:CreateOverlay()\r\n\telse\r\n\t\tbackdropa = C.media.backdrop_color[4]\r\n\tend\r\n\r\n\tf:SetBackdropColor(backdropr, backdropg, backdropb, backdropa)\r\n\tf:SetBackdropBorderColor(borderr, borderg, borderb, bordera)\r\nend\r\n\r\nlocal function CreatePanel(f, t, w, h, a1, p, a2, x, y)\r\n\tMixin(f, BackdropTemplateMixin) -- 9.0 to set backdrop\r\n\tGetTemplate(t)\r\n\r\n\tf:SetWidth(w)\r\n\tf:SetHeight(h)\r\n\tf:SetFrameLevel(3)\r\n\tf:SetFrameStrata(\"BACKGROUND\")\r\n\tf:SetPoint(a1, p, a2, x, y)\r\n\tf:SetBackdrop({\r\n\t\tbgFile = C.media.blank, edgeFile = C.media.blank, edgeSize = Mult,\r\n\t\tinsets = {left = -Mult, right = -Mult, top = -Mult, bottom = -Mult}\r\n\t})\r\n\r\n\tif t == \"Transparent\" then\r\n\t\tbackdropa = C.media.backdrop_alpha\r\n\t\tf:CreateBorder(true, true)\r\n\telseif t == \"Overlay\" then\r\n\t\tbackdropa = 1\r\n\t\tf:CreateOverlay()\r\n\telseif t == \"Invisible\" then\r\n\t\tbackdropa = 0\r\n\t\tbordera = 0\r\n\telse\r\n\t\tbackdropa = C.media.backdrop_color[4]\r\n\tend\r\n\r\n\tf:SetBackdropColor(backdropr, backdropg, backdropb, backdropa)\r\n\tf:SetBackdropBorderColor(borderr, borderg, borderb, bordera)\r\nend\r\n\r\nlocal function CreateBackdrop(f, t)\r\n\tlocal f = (f.IsObjectType and f:IsObjectType(\"Texture\") and f:GetParent()) or f\r\n\tif f.backdrop then return end\r\n\tif not t then t = \"Default\" end\r\n\r\n\tlocal b = CreateFrame(\"Frame\", \"$parentBackdrop\", f)\r\n\tb:SetOutside()\r\n\tb:SetTemplate(t)\r\n\r\n\tif f:GetFrameLevel() - 1 >= 0 then\r\n\t\tb:SetFrameLevel(f:GetFrameLevel() - 1)\r\n\telse\r\n\t\tb:SetFrameLevel(0)\r\n\tend\r\n\r\n\tf.backdrop = b\r\nend\r\n\r\nlocal StripTexturesBlizzFrames = {\r\n\t\"Inset\",\r\n\t\"inset\",\r\n\t\"InsetFrame\",\r\n\t\"LeftInset\",\r\n\t\"RightInset\",\r\n\t\"NineSlice\",\r\n\t\"BG\",\r\n\t\"border\",\r\n\t\"Border\",\r\n\t\"BorderFrame\",\r\n\t\"bottomInset\",\r\n\t\"BottomInset\",\r\n\t\"bgLeft\",\r\n\t\"bgRight\",\r\n\t\"FilligreeOverlay\",\r\n\t\"PortraitOverlay\",\r\n\t\"ArtOverlayFrame\",\r\n\t\"Portrait\",\r\n\t\"portrait\",\r\n\t\"ScrollFrameBorder\",\r\n}\r\n\r\nlocal function StripTextures(object, kill)\r\n\tif object.GetNumRegions then\r\n\t\tfor _, region in next, {object:GetRegions()} do\r\n\t\t\tif region and region.IsObjectType and region:IsObjectType(\"Texture\") then\r\n\t\t\t\tif kill then\r\n\t\t\t\t\tregion:Kill()\r\n\t\t\t\telse\r\n\t\t\t\t\tregion:SetTexture(\"\")\r\n\t\t\t\t\tregion:SetAtlas(\"\")\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\r\n\tlocal frameName = object.GetName and object:GetName()\r\n\tfor _, blizzard in pairs(StripTexturesBlizzFrames) do\r\n\t\tlocal blizzFrame = object[blizzard] or frameName and _G[frameName..blizzard]\r\n\t\tif blizzFrame then\r\n\t\t\tblizzFrame:StripTextures(kill)\r\n\t\tend\r\n\tend\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tKill object function\r\n----------------------------------------------------------------------------------------\r\nlocal HiddenFrame = CreateFrame(\"Frame\")\r\nHiddenFrame:Hide()\r\nlocal function Kill(object)\r\n\tif object.UnregisterAllEvents then\r\n\t\tobject:UnregisterAllEvents()\r\n\t\tobject:SetParent(HiddenFrame)\r\n\telse\r\n\t\tobject.Show = T.dummy\r\n\tend\r\n\tobject:Hide()\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tStyle ActionBars/Bags buttons function(by Chiril & Karudon)\r\n----------------------------------------------------------------------------------------\r\nlocal function StyleButton(button, t, size, setBackdrop)\r\n\tif not size then size = 2 end\r\n\tif button.SetHighlightTexture and not button.hover then\r\n\t\tlocal hover = button:CreateTexture()\r\n\t\thover:SetColorTexture(1, 1, 1, 0.3)\r\n\t\tif setBackdrop then\r\n\t\t\thover:SetInside(button.backdrop)\r\n\t\telse\r\n\t\t\thover:SetPoint(\"TOPLEFT\", button, size, -size)\r\n\t\t\thover:SetPoint(\"BOTTOMRIGHT\", button, -size, size)\r\n\t\tend\r\n\t\tbutton.hover = hover\r\n\t\tbutton:SetHighlightTexture(hover)\r\n\tend\r\n\r\n\tif not t and button.SetPushedTexture and not button.pushed then\r\n\t\tlocal pushed = button:CreateTexture()\r\n\t\tpushed:SetColorTexture(0.9, 0.8, 0.1, 0.3)\r\n\t\tif setBackdrop then\r\n\t\t\tpushed:SetInside(button.backdrop)\r\n\t\telse\r\n\t\t\tpushed:SetPoint(\"TOPLEFT\", button, size, -size)\r\n\t\t\tpushed:SetPoint(\"BOTTOMRIGHT\", button, -size, size)\r\n\t\tend\r\n\t\tbutton.pushed = pushed\r\n\t\tbutton:SetPushedTexture(pushed)\r\n\tend\r\n\r\n\tif button.SetCheckedTexture and not button.checked then\r\n\t\tlocal checked = button:CreateTexture()\r\n\t\tchecked:SetColorTexture(0, 1, 0, 0.3)\r\n\t\tif setBackdrop then\r\n\t\t\tchecked:SetInside(button.backdrop)\r\n\t\telse\r\n\t\t\tchecked:SetPoint(\"TOPLEFT\", button, size, -size)\r\n\t\t\tchecked:SetPoint(\"BOTTOMRIGHT\", button, -size, size)\r\n\t\tend\r\n\t\tbutton.checked = checked\r\n\t\tbutton:SetCheckedTexture(checked)\r\n\tend\r\n\r\n\tlocal cooldown = button:GetName() and _G[button:GetName()..\"Cooldown\"]\r\n\tif cooldown then\r\n\t\tcooldown:ClearAllPoints()\r\n\t\tcooldown:SetPoint(\"TOPLEFT\", button, size, -size)\r\n\t\tcooldown:SetPoint(\"BOTTOMRIGHT\", button, -size, size)\r\n\tend\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tStyle buttons function\r\n----------------------------------------------------------------------------------------\r\nT.SetModifiedBackdrop = function(self)\r\n\tif self:IsEnabled() then\r\n\t\tself:SetBackdropBorderColor(unpack(C.media.classborder_color))\r\n\t\tif self.overlay then\r\n\t\t\tself.overlay:SetVertexColor(C.media.classborder_color[1] * 0.3, C.media.classborder_color[2] * 0.3, C.media.classborder_color[3] * 0.3, 1)\r\n\t\tend\r\n\tend\r\nend\r\n\r\nT.SetOriginalBackdrop = function(self)\r\n\tself:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\tif self.overlay then\r\n\t\tself.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\r\n\tend\r\nend\r\n\r\nlocal function SkinButton(f, strip)\r\n\tif strip then f:StripTextures() end\r\n\r\n\tif f.SetNormalTexture then f:SetNormalTexture(0) end\r\n\tif f.SetHighlightTexture then f:SetHighlightTexture(0) end\r\n\tif f.SetPushedTexture then f:SetPushedTexture(0) end\r\n\tif f.SetDisabledTexture then f:SetDisabledTexture(0) end\r\n\r\n\tif f.Left then f.Left:SetAlpha(0) end\r\n\tif f.Right then f.Right:SetAlpha(0) end\r\n\tif f.Middle then f.Middle:SetAlpha(0) end\r\n\tif f.LeftSeparator then f.LeftSeparator:SetAlpha(0) end\r\n\tif f.RightSeparator then f.RightSeparator:SetAlpha(0) end\r\n\tif f.Flash then f.Flash:SetAlpha(0) end\r\n\r\n\tif f.TopLeft then f.TopLeft:Hide() end\r\n\tif f.TopRight then f.TopRight:Hide() end\r\n\tif f.BottomLeft then f.BottomLeft:Hide() end\r\n\tif f.BottomRight then f.BottomRight:Hide() end\r\n\tif f.TopMiddle then f.TopMiddle:Hide() end\r\n\tif f.MiddleLeft then f.MiddleLeft:Hide() end\r\n\tif f.MiddleRight then f.MiddleRight:Hide() end\r\n\tif f.BottomMiddle then f.BottomMiddle:Hide() end\r\n\tif f.MiddleMiddle then f.MiddleMiddle:Hide() end\r\n\r\n\tf:SetTemplate(\"Overlay\")\r\n\tf:HookScript(\"OnEnter\", T.SetModifiedBackdrop)\r\n\tf:HookScript(\"OnLeave\", T.SetOriginalBackdrop)\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tStyle icon function\r\n----------------------------------------------------------------------------------------\r\nlocal function SkinIcon(icon, t, parent)\r\n\tparent = parent or icon:GetParent()\r\n\r\n\tif t then\r\n\t\ticon.b = CreateFrame(\"Frame\", nil, parent)\r\n\t\ticon.b:SetTemplate(\"Default\")\r\n\t\ticon.b:SetOutside(icon)\r\n\telse\r\n\t\tparent:CreateBackdrop(\"Default\")\r\n\t\tparent.backdrop:SetOutside(icon)\r\n\tend\r\n\r\n\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\ticon:SetParent(t and icon.b or parent)\r\nend\r\n\r\nlocal function CropIcon(icon)\r\n\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\ticon:SetInside()\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tFont function\r\n----------------------------------------------------------------------------------------\r\nlocal function FontString(parent, name, fontName, fontHeight, fontStyle)\r\n\tlocal fs = parent:CreateFontString(nil, \"OVERLAY\")\r\n\tfs:SetFont(fontName, fontHeight, fontStyle)\r\n\tfs:SetJustifyH(\"LEFT\")\r\n\r\n\tif not name then\r\n\t\tparent.text = fs\r\n\telse\r\n\t\tparent[name] = fs\r\n\tend\r\n\r\n\treturn fs\r\nend\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tFade in/out functions\r\n----------------------------------------------------------------------------------------\r\nlocal function FadeIn(f)\r\n\tUIFrameFadeIn(f, 0.4, f:GetAlpha(), 1)\r\nend\r\n\r\nlocal function FadeOut(f)\r\n\tUIFrameFadeOut(f, 0.8, f:GetAlpha(), 0)\r\nend\r\n\r\nlocal function addAPI(object)\r\n\tlocal mt = getmetatable(object).__index\r\n\tif not object.SetOutside then mt.SetOutside = SetOutside end\r\n\tif not object.SetInside then mt.SetInside = SetInside end\r\n\tif not object.CreateOverlay then mt.CreateOverlay = CreateOverlay end\r\n\tif not object.CreateBorder then mt.CreateBorder = CreateBorder end\r\n\tif not object.SetTemplate then mt.SetTemplate = SetTemplate end\r\n\tif not object.CreatePanel then mt.CreatePanel = CreatePanel end\r\n\tif not object.CreateBackdrop then mt.CreateBackdrop = CreateBackdrop end\r\n\tif not object.StripTextures then mt.StripTextures = StripTextures end\r\n\tif not object.Kill then mt.Kill = Kill end\r\n\tif not object.StyleButton then mt.StyleButton = StyleButton end\r\n\tif not object.SkinButton then mt.SkinButton = SkinButton end\r\n\tif not object.SkinIcon then mt.SkinIcon = SkinIcon end\r\n\tif not object.CropIcon then mt.CropIcon = CropIcon end\r\n\tif not object.FontString then mt.FontString = FontString end\r\n\tif not object.FadeIn then mt.FadeIn = FadeIn end\r\n\tif not object.FadeOut then mt.FadeOut = FadeOut end\r\nend\r\n\r\nlocal handled = {[\"Frame\"] = true}\r\nlocal object = CreateFrame(\"Frame\")\r\naddAPI(object)\r\naddAPI(object:CreateTexture())\r\naddAPI(object:CreateFontString())\r\n\r\nobject = EnumerateFrames()\r\nwhile object do\r\n\tif not object:IsForbidden() and not handled[object:GetObjectType()] then\r\n\t\taddAPI(object)\r\n\t\thandled[object:GetObjectType()] = true\r\n\tend\r\n\r\n\tobject = EnumerateFrames(object)\r\nend\r\n\r\n-- Hacky fix for issue on 7.1 PTR where scroll frames no longer seem to inherit the methods from the \"Frame\" widget\r\nlocal scrollFrame = CreateFrame(\"ScrollFrame\")\r\naddAPI(scrollFrame)\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tStyle functions\r\n----------------------------------------------------------------------------------------\r\nT.SkinFuncs = {}\r\nT.SkinFuncs[\"ShestakUI\"] = {}\r\n\r\nfunction T.SkinScrollBar(frame, minimal)\r\n\tframe:StripTextures()\r\n\r\n\tlocal frameName = frame.GetName and frame:GetName()\r\n\tlocal UpButton = frame.ScrollUpButton or frame.ScrollUp or frame.UpButton or frame.Back or _G[frameName and frameName..\"ScrollUpButton\"] or frame:GetParent().scrollUp\r\n\tlocal DownButton = frame.ScrollDownButton or frame.ScrollDown or frame.DownButton or frame.Forward or _G[frameName and frameName..\"ScrollDownButton\"] or frame:GetParent().scrollDown\r\n\tlocal ThumbTexture = frame.ThumbTexture or frame.thumbTexture or _G[frameName and frameName..\"ThumbTexture\"]\r\n\tlocal newThumb = frame.Back and frame:GetThumb()\r\n\r\n\tif UpButton and DownButton then\r\n\t\tif not UpButton.icon then\r\n\t\t\tT.SkinNextPrevButton(UpButton, nil, \"Up\")\r\n\t\t\tUpButton:SetSize(UpButton:GetWidth() + 7, UpButton:GetHeight() + 7)\r\n\t\tend\r\n\r\n\t\tif not DownButton.icon then\r\n\t\t\tT.SkinNextPrevButton(DownButton, nil, \"Down\")\r\n\t\t\tDownButton:SetSize(DownButton:GetWidth() + 7, DownButton:GetHeight() + 7)\r\n\t\tend\r\n\r\n\t\tif ThumbTexture then\r\n\t\t\tThumbTexture:SetTexture(nil)\r\n\t\t\tif not frame.thumbbg then\r\n\t\t\t\tframe.thumbbg = CreateFrame(\"Frame\", nil, frame)\r\n\t\t\t\tframe.thumbbg:SetPoint(\"TOPLEFT\", ThumbTexture, \"TOPLEFT\", 0, -3)\r\n\t\t\t\tframe.thumbbg:SetPoint(\"BOTTOMRIGHT\", ThumbTexture, \"BOTTOMRIGHT\", 0, 3)\r\n\t\t\t\tframe.thumbbg:SetTemplate(\"Overlay\")\r\n\r\n\t\t\t\tframe:HookScript(\"OnShow\", function()\r\n\t\t\t\t\tlocal _, maxValue = frame:GetMinMaxValues()\r\n\t\t\t\t\tif maxValue == 0 then\r\n\t\t\t\t\t\tframe:SetAlpha(0)\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tframe:SetAlpha(1)\r\n\t\t\t\t\tend\r\n\t\t\t\tend)\r\n\r\n\t\t\t\tframe:HookScript(\"OnMinMaxChanged\", function()\r\n\t\t\t\t\tlocal _, maxValue = frame:GetMinMaxValues()\r\n\t\t\t\t\tif maxValue == 0 then\r\n\t\t\t\t\t\tframe:SetAlpha(0)\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tframe:SetAlpha(1)\r\n\t\t\t\t\tend\r\n\t\t\t\tend)\r\n\r\n\t\t\t\tframe:HookScript(\"OnDisable\", function()\r\n\t\t\t\t\tframe:SetAlpha(0)\r\n\t\t\t\tend)\r\n\r\n\t\t\t\tframe:HookScript(\"OnEnable\", function()\r\n\t\t\t\t\tframe:SetAlpha(1)\r\n\t\t\t\tend)\r\n\t\t\tend\r\n\t\telseif newThumb then\r\n\t\t\tif frame.Background then\r\n\t\t\t\tframe.Background:Hide()\r\n\t\t\tend\r\n\t\t\tif frame.Track then\r\n\t\t\t\tframe.Track:DisableDrawLayer(\"ARTWORK\")\r\n\t\t\tend\r\n\t\t\tnewThumb:DisableDrawLayer(\"BACKGROUND\")\r\n\t\t\tif not frame.thumbbg then\r\n\t\t\t\tframe.thumbbg = CreateFrame(\"Frame\", nil, frame)\r\n\t\t\t\tframe.thumbbg:SetPoint(\"TOPLEFT\", newThumb, \"TOPLEFT\", 0, -3)\r\n\t\t\t\tframe.thumbbg:SetPoint(\"BOTTOMRIGHT\", newThumb, \"BOTTOMRIGHT\", 0, 3)\r\n\t\t\t\tframe.thumbbg:SetTemplate(\"Overlay\")\r\n\r\n\t\t\t\thooksecurefunc(newThumb, \"Hide\", function(self)\r\n\t\t\t\t\tframe:SetAlpha(0)\r\n\t\t\t\tend)\r\n\r\n\t\t\t\thooksecurefunc(newThumb, \"Show\", function(self)\r\n\t\t\t\t\tframe:SetAlpha(1)\r\n\t\t\t\tend)\r\n\t\t\tend\r\n\r\n\t\t\tif minimal then\r\n\t\t\t\tUpButton:SetSize(17, 15)\r\n\t\t\t\tDownButton:SetSize(17, 15)\r\n\t\t\t\tnewThumb:SetWidth(17)\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\nlocal tabs = {\r\n\t\"LeftDisabled\",\r\n\t\"MiddleDisabled\",\r\n\t\"RightDisabled\",\r\n\t\"Left\",\r\n\t\"Middle\",\r\n\t\"Right\",\r\n}\r\n\r\nfunction T.SkinTab(tab, bg)\r\n\tif not tab then return end\r\n\r\n\tfor _, object in pairs(tabs) do\r\n\t\tlocal tex = tab:GetName() and _G[tab:GetName()..object]\r\n\t\tif tex then\r\n\t\t\ttex:SetTexture(nil)\r\n\t\tend\r\n\tend\r\n\r\n\tif tab.GetHighlightTexture and tab:GetHighlightTexture() then\r\n\t\ttab:GetHighlightTexture():SetTexture(nil)\r\n\telse\r\n\t\ttab:StripTextures()\r\n\tend\r\n\r\n\ttab.backdrop = CreateFrame(\"Frame\", nil, tab)\r\n\ttab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)\r\n\tif bg then\r\n\t\ttab.backdrop:SetTemplate(\"Overlay\")\r\n\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 2, -9)\r\n\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, -2)\r\n\telse\r\n\t\ttab.backdrop:SetTemplate(\"Transparent\")\r\n\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 0, -3)\r\n\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 3)\r\n\tend\r\nend\r\n\r\nfunction T.SkinNextPrevButton(btn, left, scroll)\r\n\tlocal normal, pushed, disabled\r\n\tlocal frameName = btn.GetName and btn:GetName()\r\n\tlocal isPrevButton = frameName and (string.find(frameName, \"Left\") or string.find(frameName, \"Prev\") or string.find(frameName, \"Decrement\") or string.find(frameName, \"Back\")) or left\r\n\tlocal isScrollUpButton = frameName and string.find(frameName, \"ScrollUp\") or scroll == \"Up\"\r\n\tlocal isScrollDownButton = frameName and string.find(frameName, \"ScrollDown\") or scroll == \"Down\"\r\n\r\n\tif btn:GetNormalTexture() then\r\n\t\tnormal = btn:GetNormalTexture():GetTexture()\r\n\tend\r\n\r\n\tif btn:GetPushedTexture() then\r\n\t\tpushed = btn:GetPushedTexture():GetTexture()\r\n\tend\r\n\r\n\tif btn:GetDisabledTexture() then\r\n\t\tdisabled = btn:GetDisabledTexture():GetTexture()\r\n\tend\r\n\r\n\tbtn:StripTextures()\r\n\r\n\tif btn.Texture then\r\n\t\tbtn.Texture:SetAlpha(0)\r\n\r\n\t\tif btn.Overlay then\r\n\t\t\tbtn.Overlay:SetAlpha(0)\r\n\t\tend\r\n\tend\r\n\r\n\tif scroll == \"Up\" or scroll == \"Down\" or scroll == \"Any\" then\r\n\t\tnormal = nil\r\n\t\tpushed = nil\r\n\t\tdisabled = nil\r\n\tend\r\n\r\n\tif not normal then\r\n\t\tif isPrevButton then\r\n\t\t\tnormal = \"Interface\\\\Buttons\\\\UI-SpellbookIcon-PrevPage-Up\"\r\n\t\telseif isScrollUpButton then\r\n\t\t\tnormal = \"Interface\\\\ChatFrame\\\\UI-ChatIcon-ScrollUp-Up\"\r\n\t\telseif isScrollDownButton then\r\n\t\t\tnormal = \"Interface\\\\ChatFrame\\\\UI-ChatIcon-ScrollDown-Up\"\r\n\t\telse\r\n\t\t\tnormal = \"Interface\\\\Buttons\\\\UI-SpellbookIcon-NextPage-Up\"\r\n\t\tend\r\n\tend\r\n\r\n\tif not pushed then\r\n\t\tif isPrevButton then\r\n\t\t\tpushed = \"Interface\\\\Buttons\\\\UI-SpellbookIcon-PrevPage-Down\"\r\n\t\telseif isScrollUpButton then\r\n\t\t\tpushed = \"Interface\\\\ChatFrame\\\\UI-ChatIcon-ScrollUp-Down\"\r\n\t\telseif isScrollDownButton then\r\n\t\t\tpushed = \"Interface\\\\ChatFrame\\\\UI-ChatIcon-ScrollDown-Down\"\r\n\t\telse\r\n\t\t\tpushed = \"Interface\\\\Buttons\\\\UI-SpellbookIcon-NextPage-Down\"\r\n\t\tend\r\n\tend\r\n\r\n\tif not disabled then\r\n\t\tif isPrevButton then\r\n\t\t\tdisabled = \"Interface\\\\Buttons\\\\UI-SpellbookIcon-PrevPage-Disabled\"\r\n\t\telseif isScrollUpButton then\r\n\t\t\tdisabled = \"Interface\\\\ChatFrame\\\\UI-ChatIcon-ScrollUp-Disabled\"\r\n\t\telseif isScrollDownButton then\r\n\t\t\tdisabled = \"Interface\\\\ChatFrame\\\\UI-ChatIcon-ScrollDown-Disabled\"\r\n\t\telse\r\n\t\t\tdisabled = \"Interface\\\\Buttons\\\\UI-SpellbookIcon-NextPage-Disabled\"\r\n\t\tend\r\n\tend\r\n\r\n\tbtn:SetNormalTexture(normal)\r\n\tbtn:SetPushedTexture(pushed)\r\n\tbtn:SetDisabledTexture(disabled)\r\n\r\n\tbtn:SetTemplate(\"Overlay\")\r\n\tbtn:SetSize(btn:GetWidth() - 7, btn:GetHeight() - 7)\r\n\r\n\tif normal and pushed and disabled then\r\n\t\tbtn:GetNormalTexture():SetTexCoord(0.3, 0.29, 0.3, 0.81, 0.65, 0.29, 0.65, 0.81)\r\n\t\tif btn:GetPushedTexture() then\r\n\t\t\tbtn:GetPushedTexture():SetTexCoord(0.3, 0.35, 0.3, 0.81, 0.65, 0.35, 0.65, 0.81)\r\n\t\tend\r\n\t\tif btn:GetDisabledTexture() then\r\n\t\t\tbtn:GetDisabledTexture():SetTexCoord(0.3, 0.29, 0.3, 0.75, 0.65, 0.29, 0.65, 0.75)\r\n\t\tend\r\n\r\n\t\tbtn:GetNormalTexture():ClearAllPoints()\r\n\t\tbtn:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\r\n\t\tbtn:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\r\n\t\tif btn:GetDisabledTexture() then\r\n\t\t\tbtn:GetDisabledTexture():SetAllPoints(btn:GetNormalTexture())\r\n\t\tend\r\n\t\tif btn:GetPushedTexture() then\r\n\t\t\tbtn:GetPushedTexture():SetAllPoints(btn:GetNormalTexture())\r\n\t\tend\r\n\t\tif btn:GetHighlightTexture() then\r\n\t\t\tbtn:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3)\r\n\t\t\tbtn:GetHighlightTexture():SetAllPoints(btn:GetNormalTexture())\r\n\t\tend\r\n\tend\r\nend\r\n\r\nfunction T.SkinRotateButton(btn)\r\n\tbtn:SetTemplate(\"Default\")\r\n\tbtn:SetSize(btn:GetWidth() - 14, btn:GetHeight() - 14)\r\n\r\n\tbtn:GetNormalTexture():SetTexCoord(0.3, 0.29, 0.3, 0.65, 0.69, 0.29, 0.69, 0.65)\r\n\tbtn:GetPushedTexture():SetTexCoord(0.3, 0.29, 0.3, 0.65, 0.69, 0.29, 0.69, 0.65)\r\n\r\n\tbtn:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3)\r\n\r\n\tbtn:GetNormalTexture():ClearAllPoints()\r\n\tbtn:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\r\n\tbtn:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\r\n\tbtn:GetPushedTexture():SetAllPoints(btn:GetNormalTexture())\r\n\tbtn:GetHighlightTexture():SetAllPoints(btn:GetNormalTexture())\r\nend\r\n\r\nfunction T.SkinEditBox(frame, width, height)\r\n\tframe:DisableDrawLayer(\"BACKGROUND\")\r\n\r\n\tframe:CreateBackdrop(\"Overlay\")\r\n\r\n\tlocal frameName = frame.GetName and frame:GetName()\r\n\tif frameName and (frameName:find(\"Gold\") or frameName:find(\"Silver\") or frameName:find(\"Copper\")) then\r\n\t\tif frameName:find(\"Gold\") then\r\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", -3, 1)\r\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, 0)\r\n\t\telse\r\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", -3, 1)\r\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -13, 0)\r\n\t\tend\r\n\tend\r\n\r\n\tif width then frame:SetWidth(width) end\r\n\tif height then frame:SetHeight(height) end\r\nend\r\n\r\nfunction T.SkinDropDownBox(frame, width, pos)\r\n\tlocal frameName = frame.GetName and frame:GetName()\r\n\tlocal button = frame.Button or frameName and (_G[frameName..\"Button\"] or _G[frameName..\"_Button\"])\r\n\tlocal text = frameName and _G[frameName..\"Text\"] or frame.Text\r\n\tif not width then width = 155 end\r\n\r\n\tframe:StripTextures()\r\n\tframe:SetWidth(width)\r\n\r\n\tif text then\r\n\t\ttext:ClearAllPoints()\r\n\t\ttext:SetPoint(\"RIGHT\", button, \"LEFT\", -2, 0)\r\n\tend\r\n\r\n\tbutton:ClearAllPoints()\r\n\tif pos then\r\n\t\tbutton:SetPoint(\"TOPRIGHT\", frame.Right, -20, -21)\r\n\telse\r\n\t\tbutton:SetPoint(\"RIGHT\", frame, \"RIGHT\", -10, 3)\r\n\tend\r\n\tbutton.SetPoint = T.dummy\r\n\tT.SkinNextPrevButton(button, nil, \"Down\")\r\n\r\n\tframe:CreateBackdrop(\"Overlay\")\r\n\tframe:SetFrameLevel(frame:GetFrameLevel() + 2)\r\n\tframe.backdrop:SetPoint(\"TOPLEFT\", 20, -2)\r\n\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMRIGHT\", 2, -2)\r\nend\r\n\r\nfunction T.SkinCheckBox(frame, size)\r\n\tif size then\r\n\t\tframe:SetSize(size, size)\r\n\tend\r\n\tframe:SetNormalTexture(0)\r\n\tframe:SetPushedTexture(0)\r\n\tframe:CreateBackdrop(\"Overlay\")\r\n\tframe:SetFrameLevel(frame:GetFrameLevel() + 2)\r\n\tframe.backdrop:SetPoint(\"TOPLEFT\", 4, -4)\r\n\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -4, 4)\r\n\r\n\tif frame.SetHighlightTexture then\r\n\t\tlocal highligh = frame:CreateTexture()\r\n\t\thighligh:SetColorTexture(1, 1, 1, 0.3)\r\n\t\thighligh:SetPoint(\"TOPLEFT\", frame, 6, -6)\r\n\t\thighligh:SetPoint(\"BOTTOMRIGHT\", frame, -6, 6)\r\n\t\tframe:SetHighlightTexture(highligh)\r\n\tend\r\n\r\n\tif frame.SetCheckedTexture then\r\n\t\tlocal checked = frame:CreateTexture()\r\n\t\tchecked:SetColorTexture(1, 0.82, 0, 0.8)\r\n\t\tchecked:SetPoint(\"TOPLEFT\", frame, 6, -6)\r\n\t\tchecked:SetPoint(\"BOTTOMRIGHT\", frame, -6, 6)\r\n\t\tframe:SetCheckedTexture(checked)\r\n\tend\r\n\r\n\tif frame.SetDisabledCheckedTexture then\r\n\t\tlocal disabled = frame:CreateTexture()\r\n\t\tdisabled:SetColorTexture(0.6, 0.6, 0.6, 0.75)\r\n\t\tdisabled:SetPoint(\"TOPLEFT\", frame, 6, -6)\r\n\t\tdisabled:SetPoint(\"BOTTOMRIGHT\", frame, -6, 6)\r\n\t\tframe:SetDisabledCheckedTexture(disabled)\r\n\tend\r\nend\r\n\r\nfunction T.SkinCheckBoxAtlas(checkbox, size)\r\n\tif size then\r\n\t\tcheckbox:SetSize(size, size)\r\n\tend\r\n\r\n\tcheckbox:CreateBackdrop(\"Overlay\")\r\n\tcheckbox.backdrop:SetInside(nil, 4, 4)\r\n\r\n\tfor _, region in next, { checkbox:GetRegions() } do\r\n\t\tif region:IsObjectType(\"Texture\") then\r\n\t\t\tif region:GetAtlas() == \"checkmark-minimal\" or region:GetTexture() == 130751 then\r\n\t\t\t\tregion:SetTexture(C.media.texture)\r\n\r\n\t\t\t\tlocal checkedTexture = checkbox:GetCheckedTexture()\r\n\t\t\t\tcheckedTexture:SetColorTexture(1, 0.82, 0, 0.8)\r\n\t\t\t\tcheckedTexture:SetInside(checkbox.backdrop)\r\n\t\t\telse\r\n\t\t\t\tregion:SetTexture(\"\")\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\nfunction T.SkinCloseButton(f, point, text, pixel)\r\n\tf:StripTextures()\r\n\tf:SetTemplate(\"Overlay\")\r\n\tf:SetSize(18, 18)\r\n\r\n\tif not text then text = \"x\" end\r\n\tif text == \"-\" and not pixel then\r\n\t\tf.text = f:CreateTexture(nil, \"OVERLAY\")\r\n\t\tf.text:SetSize(7, 1)\r\n\t\tf.text:SetPoint(\"CENTER\")\r\n\t\tf.text:SetTexture(C.media.blank)\r\n\tend\r\n\tif text == \"-\" and pixel then\r\n\t\tf.text = f:CreateTexture(nil, \"OVERLAY\")\r\n\t\tf.text:SetSize(5, 1)\r\n\t\tf.text:SetPoint(\"CENTER\")\r\n\t\tf.text:SetTexture(C.media.blank)\r\n\tend\r\n\tif not f.text then\r\n\t\tif pixel then\r\n\t\t\tf.text = f:FontString(nil, [[Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Pixel.ttf]], 8)\r\n\t\t\tf.text:SetPoint(\"CENTER\", 0, 0)\r\n\t\telse\r\n\t\t\tf.text = f:FontString(nil, C.media.normal_font, 17)\r\n\t\t\tf.text:SetPoint(\"CENTER\", 0, 1)\r\n\t\tend\r\n\t\tf.text:SetText(text)\r\n\tend\r\n\r\n\tif point then\r\n\t\tf:SetPoint(\"TOPRIGHT\", point, \"TOPRIGHT\", -4, -4)\r\n\telse\r\n\t\tf:SetPoint(\"TOPRIGHT\", -4, -4)\r\n\tend\r\n\r\n\tf:HookScript(\"OnEnter\", T.SetModifiedBackdrop)\r\n\tf:HookScript(\"OnLeave\", T.SetOriginalBackdrop)\r\nend\r\n\r\nfunction T.SkinSlider(f)\r\n\tf:StripTextures()\r\n\r\n\tlocal bd = CreateFrame(\"Frame\", nil, f)\r\n\tbd:SetTemplate(\"Overlay\")\r\n\tif f:GetOrientation() == \"VERTICAL\" then\r\n\t\tbd:SetPoint(\"TOPLEFT\", -2, -6)\r\n\t\tbd:SetPoint(\"BOTTOMRIGHT\", 2, 6)\r\n\t\tf:GetThumbTexture():SetRotation(rad(90))\r\n\telse\r\n\t\tbd:SetPoint(\"TOPLEFT\", 14, -2)\r\n\t\tbd:SetPoint(\"BOTTOMRIGHT\", -15, 3)\r\n\tend\r\n\tbd:SetFrameLevel(f:GetFrameLevel() - 1)\r\n\r\n\tf:SetThumbTexture(\"Interface\\\\CastingBar\\\\UI-CastingBar-Spark\")\r\n\tf:GetThumbTexture():SetBlendMode(\"ADD\")\r\nend\r\n\r\nfunction T.SkinSliderStep(frame, minimal)\r\n\tframe:StripTextures()\r\n\r\n\tlocal slider = frame.Slider\r\n\tif not slider then return end\r\n\r\n\tslider:DisableDrawLayer(\"ARTWORK\")\r\n\r\n\tlocal thumb = slider.Thumb\r\n\tif thumb then\r\n\t\tthumb:SetTexture([[Interface\\CastingBar\\UI-CastingBar-Spark]])\r\n\t\tthumb:SetBlendMode(\"ADD\")\r\n\t\tthumb:SetSize(20, 30)\r\n\tend\r\n\r\n\tlocal offset = minimal and 10 or 13\r\n\tslider:CreateBackdrop(\"Overlay\")\r\n\tslider.backdrop:SetPoint(\"TOPLEFT\", 10, -offset)\r\n\tslider.backdrop:SetPoint(\"BOTTOMRIGHT\", -10, offset)\r\n\r\n\tif not slider.barStep then\r\n\t\tlocal step = CreateFrame(\"StatusBar\", nil, slider.backdrop)\r\n\t\tstep:SetStatusBarTexture(C.media.texture)\r\n\t\tstep:SetStatusBarColor(1, 0.82, 0, 1)\r\n\t\tstep:SetPoint(\"TOPLEFT\", slider.backdrop, T.mult * 2, -T.mult * 2)\r\n\t\tstep:SetPoint(\"BOTTOMLEFT\", slider.backdrop, T.mult * 2, T.mult * 2)\r\n\t\tstep:SetPoint(\"RIGHT\", thumb, \"CENTER\")\r\n\r\n\t\tslider.barStep = step\r\n\tend\r\nend\r\n\r\nfunction T.SkinIconSelectionFrame(frame, numIcons, buttonNameTemplate, frameNameOverride)\r\n\tlocal frameName = frameNameOverride or frame:GetName()\r\n\t-- local scrollFrame = frame.ScrollFrame or _G[frameName..\"ScrollFrame\"]\r\n\tlocal editBox = frame.BorderBox.IconSelectorEditBox\r\n\tlocal okayButton = frame.OkayButton or frame.BorderBox.OkayButton or _G[frameName..\"Okay\"]\r\n\tlocal cancelButton = frame.CancelButton or frame.BorderBox.CancelButton or _G[frameName..\"Cancel\"]\r\n\r\n\tframe:StripTextures()\r\n\tframe.BorderBox:StripTextures()\r\n\tframe:CreateBackdrop(\"Transparent\")\r\n\tframe.backdrop:SetPoint(\"TOPLEFT\", 3, 1)\r\n\tframe:SetHeight(frame:GetHeight() + 13)\r\n\r\n\tT.SkinScrollBar(frame.IconSelector.ScrollBar)\r\n\r\n\tokayButton:SkinButton()\r\n\tcancelButton:SkinButton()\r\n\tcancelButton:ClearAllPoints()\r\n\tcancelButton:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -5, 5)\r\n\r\n\teditBox:DisableDrawLayer(\"BACKGROUND\")\r\n\tT.SkinEditBox(editBox)\r\n\r\n\tlocal button = frame.BorderBox.SelectedIconArea and frame.BorderBox.SelectedIconArea.SelectedIconButton\r\n\tif button then\r\n\t\tbutton:DisableDrawLayer(\"BACKGROUND\")\r\n\t\tlocal texture = button.Icon:GetTexture()\r\n\t\tbutton:StripTextures()\r\n\t\tbutton:StyleButton(true)\r\n\t\tbutton:SetTemplate(\"Default\")\r\n\r\n\t\tbutton.Icon:ClearAllPoints()\r\n\t\tbutton.Icon:SetPoint(\"TOPLEFT\", 2, -2)\r\n\t\tbutton.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\r\n\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\tif texture then\r\n\t\t\tbutton.Icon:SetTexture(texture)\r\n\t\tend\r\n\tend\r\n\r\n\tfor _, button in next, {frame.IconSelector.ScrollBox.ScrollTarget:GetChildren()} do\r\n\t\tlocal texture = button.Icon:GetTexture()\r\n\t\tbutton:StripTextures()\r\n\t\tbutton:StyleButton(true)\r\n\t\tbutton:SetTemplate(\"Default\")\r\n\r\n\t\tbutton.Icon:ClearAllPoints()\r\n\t\tbutton.Icon:SetPoint(\"TOPLEFT\", 2, -2)\r\n\t\tbutton.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\r\n\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\tif texture then\r\n\t\t\tbutton.Icon:SetTexture(texture)\r\n\t\tend\r\n\tend\r\nend\r\n\r\nfunction T.SkinMaxMinFrame(frame, point)\r\n\tframe:SetSize(18, 18)\r\n\r\n\tif point then\r\n\t\tframe:SetPoint(\"RIGHT\", point, \"LEFT\", -2, 0)\r\n\tend\r\n\r\n\tfor name, direction in pairs({ [\"MaximizeButton\"] = \"up\", [\"MinimizeButton\"] = \"down\"}) do\r\n\t\tlocal button = frame[name]\r\n\t\tif button then\r\n\t\t\tbutton:StripTextures()\r\n\t\t\tbutton:SetTemplate(\"Overlay\")\r\n\t\t\tbutton:SetPoint(\"CENTER\")\r\n\t\t\tbutton:SetHitRectInsets(1, 1, 1, 1)\r\n\r\n\t\t\tbutton.minus = button:CreateTexture(nil, \"OVERLAY\")\r\n\t\t\tbutton.minus:SetSize(7, 1)\r\n\t\t\tbutton.minus:SetPoint(\"CENTER\")\r\n\t\t\tbutton.minus:SetTexture(C.media.blank)\r\n\r\n\t\t\tif direction == \"up\" then\r\n\t\t\t\tbutton.plus = button:CreateTexture(nil, \"OVERLAY\")\r\n\t\t\t\tbutton.plus:SetSize(1, 7)\r\n\t\t\t\tbutton.plus:SetPoint(\"CENTER\")\r\n\t\t\t\tbutton.plus:SetTexture(C.media.blank)\r\n\t\t\tend\r\n\r\n\t\t\tbutton:HookScript(\"OnEnter\", T.SetModifiedBackdrop)\r\n\t\t\tbutton:HookScript(\"OnLeave\", T.SetOriginalBackdrop)\r\n\t\tend\r\n\tend\r\nend\r\n\r\nfunction T.SkinExpandOrCollapse(f)\r\n\tf:SetHighlightTexture(0)\r\n\tf:SetPushedTexture(0)\r\n\r\n\tlocal bg = CreateFrame(\"Frame\", nil, f)\r\n\tbg:SetSize(13, 13)\r\n\tbg:SetPoint(\"TOPLEFT\", f:GetNormalTexture(), 0, -1)\r\n\tbg:SetTemplate(\"Overlay\")\r\n\tf.bg = bg\r\n\r\n\tbg.minus = bg:CreateTexture(nil, \"OVERLAY\")\r\n\tbg.minus:SetSize(5, 1)\r\n\tbg.minus:SetPoint(\"CENTER\")\r\n\tbg.minus:SetTexture(C.media.blank)\r\n\r\n\tbg.plus = bg:CreateTexture(nil, \"OVERLAY\")\r\n\tbg.plus:SetSize(1, 5)\r\n\tbg.plus:SetPoint(\"CENTER\")\r\n\tbg.plus:SetTexture(C.media.blank)\r\n\tbg.plus:Hide()\r\n\r\n\thooksecurefunc(f, \"SetNormalTexture\", function(self, texture)\r\n\t\tif self.settingTexture then return end\r\n\t\tself.settingTexture = true\r\n\t\tself:SetNormalTexture(0)\r\n\r\n\t\tif texture and texture ~= \"\" then\r\n\t\t\tif texture:find(\"Plus\") then\r\n\t\t\t\tself.bg.plus:Show()\r\n\t\t\telseif texture:find(\"Minus\") then\r\n\t\t\t\tself.bg.plus:Hide()\r\n\t\t\tend\r\n\t\t\tself.bg:Show()\r\n\t\telse\r\n\t\t\tself.bg:Hide()\r\n\t\tend\r\n\t\tself.settingTexture = nil\r\n\tend)\r\n\r\n\tf:HookScript(\"OnEnter\", function(self)\r\n\t\tself.bg:SetBackdropBorderColor(unpack(C.media.classborder_color))\r\n\t\tif self.bg.overlay then\r\n\t\t\tself.bg.overlay:SetVertexColor(C.media.classborder_color[1] * 0.3, C.media.classborder_color[2] * 0.3, C.media.classborder_color[3] * 0.3, 1)\r\n\t\tend\r\n\tend)\r\n\r\n\tf:HookScript(\"OnLeave\", function(self)\r\n\t\tself.bg:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\tif self.bg.overlay then\r\n\t\t\tself.bg.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\r\n\t\tend\r\n\tend)\r\nend\r\n\r\nfunction T.SkinHelpBox(frame)\r\n\tframe:StripTextures()\r\n\tframe:SetTemplate(\"Transparent\")\r\n\tif frame.CloseButton then\r\n\t\tT.SkinCloseButton(frame.CloseButton)\r\n\tend\r\n\tif frame.Arrow then\r\n\t\tframe.Arrow:Hide()\r\n\tend\r\nend\r\n\r\nfunction T.SkinFrame(frame, backdrop, x, y)\r\n\tlocal name = frame and frame.GetName and frame:GetName()\r\n\tlocal portraitFrame = name and _G[name..\"Portrait\"] or frame.Portrait or frame.portrait\r\n\tlocal portraitFrameOverlay = name and _G[name..\"PortraitOverlay\"] or frame.PortraitOverlay\r\n\tlocal artFrameOverlay = name and _G[name..\"ArtOverlayFrame\"] or frame.ArtOverlayFrame\r\n\r\n\tframe:StripTextures()\r\n\tif backdrop then\r\n\t\tframe:CreateBackdrop(\"Transparent\")\r\n\t\tif x and y then\r\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", x, -y)\r\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -x, y)\r\n\t\tend\r\n\telse\r\n\t\tframe:SetTemplate(\"Transparent\")\r\n\tend\r\n\r\n\tif frame.CloseButton then\r\n\t\tT.SkinCloseButton(frame.CloseButton)\r\n\tend\r\n\r\n\tif portraitFrame then portraitFrame:SetAlpha(0) end\r\n\tif portraitFrameOverlay then portraitFrameOverlay:SetAlpha(0) end\r\n\tif artFrameOverlay then artFrameOverlay:SetAlpha(0) end\r\nend\r\n\r\nlocal iconColors = {\r\n\t[\"auctionhouse-itemicon-border-gray\"]\t\t= {r = borderr, g = borderg, b = borderb},\r\n\t[\"auctionhouse-itemicon-border-white\"]\t\t= {r = borderr, g = borderg, b = borderb},\r\n\t[\"auctionhouse-itemicon-border-green\"]\t\t= BAG_ITEM_QUALITY_COLORS[2],\r\n\t[\"auctionhouse-itemicon-border-blue\"]\t\t= BAG_ITEM_QUALITY_COLORS[3],\r\n\t[\"auctionhouse-itemicon-border-purple\"]\t\t= BAG_ITEM_QUALITY_COLORS[4],\r\n\t[\"auctionhouse-itemicon-border-orange\"]\t\t= BAG_ITEM_QUALITY_COLORS[5],\r\n\t[\"auctionhouse-itemicon-border-artifact\"]\t= BAG_ITEM_QUALITY_COLORS[6],\r\n\t[\"auctionhouse-itemicon-border-account\"]\t= BAG_ITEM_QUALITY_COLORS[7]\r\n}\r\n\r\nfunction T.SkinIconBorder(frame, parent)\r\n\tlocal border = parent or frame:GetParent().backdrop\r\n\tframe:SetAlpha(0)\r\n\thooksecurefunc(frame, \"SetVertexColor\", function(self, r, g, b)\r\n\t\tif r ~= BAG_ITEM_QUALITY_COLORS[1].r ~= r and g ~= BAG_ITEM_QUALITY_COLORS[1].g then\r\n\t\t\tborder:SetBackdropBorderColor(r, g, b)\r\n\t\telse\r\n\t\t\tborder:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\tend\r\n\tend)\r\n\r\n\thooksecurefunc(frame, \"SetAtlas\", function(self, atlas)\r\n\t\tlocal color = iconColors[atlas]\r\n\t\tif color then\r\n\t\t\tborder:SetBackdropBorderColor(color.r, color.g, color.b)\r\n\t\telse\r\n\t\t\t-- border:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\tend\r\n\tend)\r\n\r\n\thooksecurefunc(frame, \"Hide\", function(self)\r\n\t\tborder:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\tend)\r\n\r\n\thooksecurefunc(frame, \"SetShown\", function(self, show)\r\n\t\tif not show then\r\n\t\t\tborder:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\tend\r\n\tend)\r\nend\r\n\r\nlocal LoadBlizzardSkin = CreateFrame(\"Frame\")\r\nLoadBlizzardSkin:RegisterEvent(\"ADDON_LOADED\")\r\nLoadBlizzardSkin:SetScript(\"OnEvent\", function(self, _, addon)\r\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") or not C.skins.blizzard_frames then\r\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\r\n\t\treturn\r\n\tend\r\n\r\n\tfor _addon, skinfunc in pairs(T.SkinFuncs) do\r\n\t\tif type(skinfunc) == \"function\" then\r\n\t\t\tif _addon == addon then\r\n\t\t\t\tif skinfunc then\r\n\t\t\t\t\tskinfunc()\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\telseif type(skinfunc) == \"table\" then\r\n\t\t\tif _addon == addon then\r\n\t\t\t\tfor _, skinfunc in pairs(T.SkinFuncs[_addon]) do\r\n\t\t\t\t\tif skinfunc then\r\n\t\t\t\t\t\tskinfunc()\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend)"
  },
  {
    "path": "ShestakUI/Core/CheckVersion.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tCheck outdated UI version\n----------------------------------------------------------------------------------------\nlocal check = function(self, event, prefix, message, _, sender)\n\tif event == \"CHAT_MSG_ADDON\" then\n\t\tif prefix ~= \"ShestakUIVersion\" or sender == T.name then return end\n\t\tif tonumber(message) ~= nil and tonumber(message) > tonumber(T.version) then\n\t\t\tprint(\"|cffff0000\"..L_MISC_UI_OUTDATED..\"|r\")\n\t\t\tself:UnregisterEvent(\"CHAT_MSG_ADDON\")\n\t\tend\n\telse\n\t\tif IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then\n\t\t\tC_ChatInfo.SendAddonMessage(\"ShestakUIVersion\", tonumber(T.version), \"INSTANCE_CHAT\")\n\t\telseif IsInRaid(LE_PARTY_CATEGORY_HOME) then\n\t\t\tC_ChatInfo.SendAddonMessage(\"ShestakUIVersion\", tonumber(T.version), \"RAID\")\n\t\telseif IsInGroup(LE_PARTY_CATEGORY_HOME) then\n\t\t\tC_ChatInfo.SendAddonMessage(\"ShestakUIVersion\", tonumber(T.version), \"PARTY\")\n\t\telseif IsInGuild() then\n\t\t\tC_ChatInfo.SendAddonMessage(\"ShestakUIVersion\", tonumber(T.version), \"GUILD\")\n\t\tend\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:RegisterEvent(\"GROUP_ROSTER_UPDATE\")\nframe:RegisterEvent(\"CHAT_MSG_ADDON\")\nframe:SetScript(\"OnEvent\", check)\nC_ChatInfo.RegisterAddonMessagePrefix(\"ShestakUIVersion\")\n\n----------------------------------------------------------------------------------------\n--\tWhisper UI version\n----------------------------------------------------------------------------------------\nlocal whisp = CreateFrame(\"Frame\")\nwhisp:RegisterEvent(\"CHAT_MSG_WHISPER\")\nwhisp:RegisterEvent(\"CHAT_MSG_BN_WHISPER\")\nwhisp:SetScript(\"OnEvent\", function(_, event, text, name, ...)\n\tif text:lower():match(\"ui_version\") or text:lower():match(\"уи_версия\") then\n\t\tif event == \"CHAT_MSG_WHISPER\" then\n\t\t\tSendChatMessage(\"ShestakUI \"..T.version, \"WHISPER\", nil, name)\n\t\telseif event == \"CHAT_MSG_BN_WHISPER\" then\n\t\t\tBNSendWhisper(select(11, ...), \"ShestakUI \"..T.version)\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Core/Commands.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tSlash commands\n----------------------------------------------------------------------------------------\nSlashCmdList.RELOADUI = function() ReloadUI() end\nSLASH_RELOADUI1 = \"/rl\"\nSLASH_RELOADUI2 = \"/кд\"\nSLASH_RELOADUI3 = \"//\"\nSLASH_RELOADUI4 = \"/.\"\n\nSlashCmdList.RCSLASH = function() DoReadyCheck() end\nSLASH_RCSLASH1 = \"/rc\"\nSLASH_RCSLASH2 = \"/кс\"\n\nSlashCmdList.TICKET = function() ToggleHelpFrame() end\nSLASH_TICKET1 = \"/gm\"\nSLASH_TICKET2 = \"/гм\"\nSLASH_TICKET3 = \"/пь\"\n\nSlashCmdList.JOURNAL = function() ToggleEncounterJournal() end\nSLASH_JOURNAL1 = \"/ej\"\nSLASH_JOURNAL2 = \"/уо\"\n\nSlashCmdList.ROLECHECK = function() InitiateRolePoll() end\nSLASH_ROLECHECK1 = \"/role\"\nSLASH_ROLECHECK2 = \"/кщду\"\n\nSlashCmdList.CLEARCOMBAT = function() CombatLogClearEntries() end\nSLASH_CLEARCOMBAT1 = \"/clc\"\nSLASH_CLEARCOMBAT2 = \"/сдс\"\n\n----------------------------------------------------------------------------------------\n--\tDescription of the slash commands\n----------------------------------------------------------------------------------------\nSlashCmdList.UIHELP = function()\n\tfor _, v in ipairs(L_SLASHCMD_HELP) do print(\"|cffffff00\"..(\"%s\"):format(tostring(v))..\"|r\") end\nend\nSLASH_UIHELP1 = \"/uihelp\"\nSLASH_UIHELP2 = \"/helpui\"\nSLASH_UIHELP3 = \"/гшрудз\"\n\n----------------------------------------------------------------------------------------\n--\tEnable/Disable addons\n----------------------------------------------------------------------------------------\nSlashCmdList.DISABLE_ADDON = function(addon)\n\tlocal _, _, _, _, _, reason = GetAddOnInfo(addon)\n\tif reason ~= \"MISSING\" then\n\t\tDisableAddOn(addon)\n\t\tReloadUI()\n\telse\n\t\tprint(\"|cffffff00\"..L_TOGGLE_ADDON..\"'\"..addon..\"'\"..L_TOGGLE_NOT_FOUND..\"|r\")\n\tend\nend\nSLASH_DISABLE_ADDON1 = \"/dis\"\nSLASH_DISABLE_ADDON2 = \"/disable\"\n\nSlashCmdList.ENABLE_ADDON = function(addon)\n\tlocal _, _, _, _, _, reason = GetAddOnInfo(addon)\n\tif reason ~= \"MISSING\" then\n\t\tEnableAddOn(addon)\n\t\tLoadAddOn(addon)\n\t\tReloadUI()\n\telse\n\t\tprint(\"|cffffff00\"..L_TOGGLE_ADDON..\"'\"..addon..\"'\"..L_TOGGLE_NOT_FOUND..\"|r\")\n\tend\nend\nSLASH_ENABLE_ADDON1 = \"/en\"\nSLASH_ENABLE_ADDON2 = \"/enable\"\n\nSlashCmdList.ONLY_UI = function()\n\tfor i = 1, GetNumAddOns() do\n\t\tlocal name = GetAddOnInfo(i)\n\t\tif name ~= \"ShestakUI\" and name ~= \"ShestakUI_Config\" and name ~= \"!BaudErrorFrame\" and GetAddOnEnableState(T.name, name) == 2 then\n\t\t\tDisableAddOn(name, T.name)\n\t\tend\n\tend\n\tReloadUI()\nend\nSLASH_ONLY_UI1 = \"/onlyui\"\n\n----------------------------------------------------------------------------------------\n--\tDisband party or raid(by Monolit)\n----------------------------------------------------------------------------------------\nlocal function DisbandRaidGroup()\n\tif InCombatLockdown() then return end\n\tif UnitInRaid(\"player\") then\n\t\tSendChatMessage(L_INFO_DISBAND, \"RAID\")\n\t\tfor i = 1, GetNumGroupMembers() do\n\t\t\tlocal name, _, _, _, _, _, _, online = GetRaidRosterInfo(i)\n\t\t\tif online and name ~= T.name then\n\t\t\t\tUninviteUnit(name)\n\t\t\tend\n\t\tend\n\telse\n\t\tSendChatMessage(L_INFO_DISBAND, \"PARTY\")\n\t\tfor i = MAX_PARTY_MEMBERS, 1, -1 do\n\t\t\tif GetNumGroupMembers(i) then\n\t\t\t\tUninviteUnit(UnitName(\"party\"..i))\n\t\t\tend\n\t\tend\n\tend\n\tC_PartyInfo.LeaveParty()\nend\n\nStaticPopupDialogs.DISBAND_RAID = {\n\ttext = L_POPUP_DISBAND_RAID,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = DisbandRaidGroup,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\nSlashCmdList.GROUPDISBAND = function()\n\tStaticPopup_Show(\"DISBAND_RAID\")\nend\nSLASH_GROUPDISBAND1 = \"/rd\"\nSLASH_GROUPDISBAND2 = \"/кв\"\n\n----------------------------------------------------------------------------------------\n--\tConvert party to raid\n----------------------------------------------------------------------------------------\nSlashCmdList.PARTYTORAID = function()\n\tif GetNumGroupMembers() > 0 then\n\t\tif UnitInRaid(\"player\") and (UnitIsGroupLeader(\"player\")) then\n\t\t\tC_PartyInfo.ConvertToParty()\n\t\telseif UnitInParty(\"player\") and (UnitIsGroupLeader(\"player\")) then\n\t\t\tC_PartyInfo.ConvertToRaid()\n\t\tend\n\telse\n\t\tprint(\"|cffffff00\"..ERR_NOT_IN_GROUP..\"|r\")\n\tend\nend\nSLASH_PARTYTORAID1 = \"/toraid\"\nSLASH_PARTYTORAID2 = \"/toparty\"\nSLASH_PARTYTORAID3 = \"/convert\"\nSLASH_PARTYTORAID4 = \"/сщтмуке\"\n\n----------------------------------------------------------------------------------------\n--\tInstance teleport\n----------------------------------------------------------------------------------------\nSlashCmdList.INSTTELEPORT = function()\n\tlocal inInstance = IsInInstance()\n\tif inInstance then\n\t\tLFGTeleport(true)\n\telse\n\t\tLFGTeleport()\n\tend\nend\nSLASH_INSTTELEPORT1 = \"/teleport\"\nSLASH_INSTTELEPORT2 = \"/еудузщке\"\n\n----------------------------------------------------------------------------------------\n--\tSpec switching(by Monolit)\n----------------------------------------------------------------------------------------\nSlashCmdList.SPEC = function(spec)\n\tlocal canUse, failureReason = C_SpecializationInfo.CanPlayerUseTalentSpecUI()()\n\tif canUse then\n\t\tif GetSpecialization() ~= tonumber(spec) then\n\t\t\tSetSpecialization(spec)\n\t\tend\n\telse\n\t\tprint(\"|cffffff00\"..failureReason..\"|r\")\n\tend\nend\nSLASH_SPEC1 = \"/ss\"\nSLASH_SPEC2 = \"/spec\"\nSLASH_SPEC3 = \"/ыы\"\n\n----------------------------------------------------------------------------------------\n--\tGet target NPC name and ID\n----------------------------------------------------------------------------------------\nSlashCmdList.NPCID = function()\n\tlocal name = UnitName(\"target\")\n\tlocal unitGUID = UnitGUID(\"target\")\n\tlocal id = unitGUID and select(6, strsplit('-', unitGUID))\n\tif id then\n\t\tprint(name..\": \"..id)\n\tend\nend\nSLASH_NPCID1 = \"/getid\"\n\n----------------------------------------------------------------------------------------\n--\tDemo mode for DBM\n----------------------------------------------------------------------------------------\nSlashCmdList.DBMTEST = function() if IsAddOnLoaded(\"DBM-Core\") then DBM:DemoMode() end end\nSLASH_DBMTEST1 = \"/dbmtest\"\nSLASH_DBMTEST2 = \"/виьеуые\"\n\n----------------------------------------------------------------------------------------\n--\tCommand to show frame you currently have mouseovered\n----------------------------------------------------------------------------------------\nSlashCmdList.FRAME = function(arg)\n\tif arg ~= \"\" then\n\t\targ = _G[arg]\n\telse\n\t\targ = GetMouseFocus()\n\tend\n\tif arg ~= nil then _G.FRAME = arg end\n\tif arg ~= nil and not arg:IsForbidden() and arg:GetName() ~= nil then\n\t\tlocal point, relativeTo, relativePoint, xOfs, yOfs = arg:GetPoint()\n\t\tprint(\"|cffCC0000--------------------------------------------------------------------|r\")\n\t\tprint(\"Name: |cffFFD100\"..arg:GetName()..\"|r\")\n\t\tif arg:GetParent() and arg:GetParent():GetName() then\n\t\t\tprint(\"Parent: |cffFFD100\"..arg:GetParent():GetName()..\"|r\")\n\t\tend\n\n\t\tprint(\"Width: |cffFFD100\"..format(\"%.2f\", arg:GetWidth())..\"|r\")\n\t\tprint(\"Height: |cffFFD100\"..format(\"%.2f\", arg:GetHeight())..\"|r\")\n\t\tprint(\"Strata: |cffFFD100\"..arg:GetFrameStrata()..\"|r\")\n\t\tprint(\"Level: |cffFFD100\"..arg:GetFrameLevel()..\"|r\")\n\n\t\tif relativeTo and relativeTo:GetName() then\n\t\t\tprint('Point: |cffFFD100 \"'..point..'\", '..relativeTo:GetName()..', \"'..relativePoint..'\"'..\"|r\")\n\t\tend\n\t\tif xOfs then\n\t\t\tprint(\"X: |cffFFD100\"..format(\"%.2f\", xOfs)..\"|r\")\n\t\tend\n\t\tif yOfs then\n\t\t\tprint(\"Y: |cffFFD100\"..format(\"%.2f\", yOfs)..\"|r\")\n\t\tend\n\t\tprint(\"|cffCC0000--------------------------------------------------------------------|r\")\n\telseif arg == nil then\n\t\tprint(\"Invalid frame name\")\n\telse\n\t\tprint(\"Could not find frame info\")\n\tend\nend\nSLASH_FRAME1 = \"/frame\"\nSLASH_FRAME2 = \"/акфьу\"\n\n----------------------------------------------------------------------------------------\n--\tPrint /framestack info in chat\n----------------------------------------------------------------------------------------\nSlashCmdList[\"FRAMELIST\"] = function(msg)\n\tif not FrameStackTooltip then\n\t\tUIParentLoadAddOn(\"Blizzard_DebugTools\")\n\tend\n\n\tlocal isPreviouslyShown = FrameStackTooltip:IsShown()\n\tif not isPreviouslyShown then\n\t\tif msg == tostring(true) then\n\t\t\tFrameStackTooltip_Toggle(true, true, true)\n\t\telse\n\t\t\tFrameStackTooltip_Toggle(false, true, true)\n\t\tend\n\tend\n\n\tprint(\"|cffCC0000--------------------------------------------------------------------|r\")\n\tfor i = 2, FrameStackTooltip:NumLines() do\n\t\tlocal text = _G[\"FrameStackTooltipTextLeft\"..i]:GetText()\n\t\tif text and text ~= \"\" then\n\t\t\tlocal r, g, b = _G[\"FrameStackTooltipTextLeft\"..i]:GetTextColor()\n\t\t\ttext = format(\"|cff%02x%02x%02x%s|r\", r * 255, g * 255, b * 255, text)\n\t\t\tprint(text)\n\t\tend\n\tend\n\tprint(\"|cffCC0000--------------------------------------------------------------------|r\")\n\n\tFrameStackTooltip_Toggle()\n\tSlashCmdList.COPY_CHAT()\nend\nSLASH_FRAMELIST1 = \"/framelist\"\nSLASH_FRAMELIST2 = \"/акфьудшые\"\nSLASH_FRAMELIST3 = \"/fl\"\nSLASH_FRAMELIST4 = \"/ад\"\n\n----------------------------------------------------------------------------------------\n--\tFrame Stack on Cyrillic\n----------------------------------------------------------------------------------------\nSlashCmdList.FSTACK = function()\n\tUIParentLoadAddOn(\"Blizzard_DebugTools\")\n\tFrameStackTooltip_Toggle(false, true, true)\nend\nSLASH_FSTACK1 = \"/аыефсл\"\nSLASH_FSTACK2 = \"/fs\"\nSLASH_FSTACK3 = \"/аы\"\nSLASH_FRAMESTK1 = nil -- fix LFGFilter\n\n----------------------------------------------------------------------------------------\n--\tClear chat\n----------------------------------------------------------------------------------------\nSlashCmdList.CLEAR_CHAT = function()\n\tfor i = 1, NUM_CHAT_WINDOWS do\n\t\t_G[format(\"ChatFrame%d\", i)]:Clear()\n\tend\nend\nSLASH_CLEAR_CHAT1 = \"/clear\"\nSLASH_CLEAR_CHAT2 = \"/сдуфк\"\n\n----------------------------------------------------------------------------------------\n--\tTest Blizzard Alerts\n----------------------------------------------------------------------------------------\nSlashCmdList.TEST_ACHIEVEMENT = function()\n\tPlaySound(SOUNDKIT.LFG_REWARDS)\n\tif not AchievementFrame then\n\t\tAchievementFrame_LoadUI()\n\tend\n\tAchievementAlertSystem:AddAlert(112)\n\tCriteriaAlertSystem:AddAlert(9023, \"Doing great!\")\n\tGuildChallengeAlertSystem:AddAlert(3, 2, 5)\n\tInvasionAlertSystem:AddAlert(678, DUNGEON_FLOOR_THENEXUS1, true, 1, 1)\n\tWorldQuestCompleteAlertSystem:AddAlert(AlertFrameMixin:BuildQuestData(42114))\n\t-- GarrisonFollowerAlertSystem:AddAlert(32, \"Dagg\", 90, 2, true, C_Garrison.GetFollowerInfo(32))\n\t-- GarrisonShipFollowerAlertSystem:AddAlert(592, \"Ship\", \"Transport\", \"GarrBuilding_Barracks_1_H\", 3, 2, 1)\n\tGarrisonBuildingAlertSystem:AddAlert(GARRISON_CACHE)\n\tGarrisonTalentAlertSystem:AddAlert(3, _G.C_Garrison.GetTalentInfo(370))\n\t-- LegendaryItemAlertSystem:AddAlert(\"|cffa335ee|Hitem:158712::::::::60:66::16:4:6534:6513:1533:4786::::|h[Rezan's Gleaming Eye]|h|r\")\n\t-- LootAlertSystem:AddAlert(\"|cffa335ee|Hitem:158712::::::::60:66::16:4:6534:6513:1533:4786::::|h[Rezan's Gleaming Eye]|h|r\", 1, 1, 100, 2, false, false, 0, false, false)\n\t-- LootUpgradeAlertSystem:AddAlert(\"|cffa335ee|Hitem:158712::::::::60:66::16:4:6534:6513:1533:4786::::|h[Rezan's Gleaming Eye]|h|r\", 1, 1, 1, nil, nil, false)\n\tMoneyWonAlertSystem:AddAlert(81500)\n\tEntitlementDeliveredAlertSystem:AddAlert(\"\", \"Interface\\\\Icons\\\\Ability_pvp_gladiatormedallion\", TRINKET0SLOT, 214)\n\tRafRewardDeliveredAlertSystem:AddAlert(\"\", \"Interface\\\\Icons\\\\Ability_pvp_gladiatormedallion\", TRINKET0SLOT, 214)\n\t-- DigsiteCompleteAlertSystem:AddAlert(\"Human\")\n\tNewRecipeLearnedAlertSystem:AddAlert(204)\n\tNewRuneforgePowerAlertSystem:AddAlert(204)\n\tNewCosmeticAlertFrameSystem:AddAlert(204)\n\t-- BonusRollFrame_StartBonusRoll(242969, 'test', 20, 515, 15, 14)\nend\nSLASH_TEST_ACHIEVEMENT1 = \"/tach\"\nSLASH_TEST_ACHIEVEMENT2 = \"/ефср\"\n\n----------------------------------------------------------------------------------------\n--\tTest Blizzard Extra Action Button\n----------------------------------------------------------------------------------------\nSlashCmdList.TEST_EXTRABUTTON = function()\n\tif ExtraActionBarFrame:IsShown() then\n\t\tExtraActionBarFrame:Hide()\n\telse\n\t\tExtraActionBarFrame:Show()\n\t\tExtraActionBarFrame:SetAlpha(1)\n\t\tExtraActionButton1:Show()\n\t\tExtraActionButton1:SetAlpha(1)\n\t\tExtraActionButton1.icon:SetTexture(\"Interface\\\\Icons\\\\spell_deathknight_breathofsindragosa\")\n\t\tExtraActionButton1.icon:Show()\n\t\tExtraActionButton1.icon:SetAlpha(1)\n\t\tExtraActionButton1.Count:SetText(\"2\")\n\tend\nend\nSLASH_TEST_EXTRABUTTON1 = \"/teb\"\nSLASH_TEST_EXTRABUTTON2 = \"/еуи\"\n\n----------------------------------------------------------------------------------------\n--\tGrid on screen\n----------------------------------------------------------------------------------------\nlocal grid\nSlashCmdList.GRIDONSCREEN = function(msg)\n\tif grid then\n\t\tgrid:Hide()\n\t\tgrid = nil\n\telse\n\t\tif msg and msg == \"hide\" then return end\n\t\tgrid = CreateFrame(\"Frame\", nil, UIParent)\n\t\tgrid:SetAllPoints(UIParent)\n\t\tlocal width = GetScreenWidth() / 128\n\t\tlocal height = GetScreenHeight() / 72\n\t\tfor i = 0, 128 do\n\t\t\tlocal texture = grid:CreateTexture(nil, \"BACKGROUND\")\n\t\t\tif i == 64 then\n\t\t\t\ttexture:SetColorTexture(1, 0, 0, 0.8)\n\t\t\telse\n\t\t\t\ttexture:SetColorTexture(0, 0, 0, 0.8)\n\t\t\tend\n\t\t\ttexture:SetPoint(\"TOPLEFT\", grid, \"TOPLEFT\", i * width - 1, 0)\n\t\t\ttexture:SetPoint(\"BOTTOMRIGHT\", grid, \"BOTTOMLEFT\", i * width, 0)\n\t\tend\n\t\tfor i = 0, 72 do\n\t\t\tlocal texture = grid:CreateTexture(nil, \"BACKGROUND\")\n\t\t\tif i == 36 then\n\t\t\t\ttexture:SetColorTexture(1, 0, 0, 0.8)\n\t\t\telse\n\t\t\t\ttexture:SetColorTexture(0, 0, 0, 0.8)\n\t\t\tend\n\t\t\ttexture:SetPoint(\"TOPLEFT\", grid, \"TOPLEFT\", 0, -i * height)\n\t\t\ttexture:SetPoint(\"BOTTOMRIGHT\", grid, \"TOPRIGHT\", 0, -i * height - 1)\n\t\tend\n\tend\nend\nSLASH_GRIDONSCREEN1 = \"/align\"\nSLASH_GRIDONSCREEN2 = \"/фдшпт\""
  },
  {
    "path": "ShestakUI/Core/Constants.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tShestakUI variables\n----------------------------------------------------------------------------------------\nT.dummy = function() return end\nT.name = UnitName(\"player\")\nT.class = select(2, UnitClass(\"player\"))\nT.level = UnitLevel(\"player\")\nT.client = GetLocale()\nT.realm = GetRealmName()\nT.color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[T.class]\nT.version = GetAddOnMetadata(\"ShestakUI\", \"Version\")\nT.screenWidth, T.screenHeight = GetPhysicalScreenSize()\nT.newPatch = select(4, GetBuildInfo()) >= 100005\n\n-- BETA\nGetContainerItemInfo = function(bagIndex, slotIndex)\n\tlocal info = C_Container.GetContainerItemInfo(bagIndex, slotIndex)\n\tif info then\n\t\treturn info.iconFileID, info.stackCount, info.isLocked, info.quality, info.isReadable, info.hasLoot, info.hyperlink, info.isFiltered, info.hasNoValue, info.itemID, info.isBound\n\tend\nend"
  },
  {
    "path": "ShestakUI/Core/Disable.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tPrevent users config errors\n----------------------------------------------------------------------------------------\nif C.actionbar.rightbars > 3 then\n\tC.actionbar.rightbars = 3\nend\n\nif C.actionbar.bottombars > 3 then\n\tC.actionbar.bottombars = 3\nend\n\nif C.actionbar.split_bars == true then\n\tC.actionbar.bottombars = 3\nend\n\nif C.actionbar.bottombars < 1 then\n\tC.actionbar.bottombars = 1\nend\n\nif C.actionbar.editor then\n\tC.actionbar.bottombars_mouseover = false\n\tC.actionbar.rightbars_mouseover = false\n\tC.actionbar.toggle_mode = false\nend\n\n----------------------------------------------------------------------------------------\n--\tAuto-overwrite script config is X addon is found\n----------------------------------------------------------------------------------------\nif IsAddOnLoaded(\"Stuf\") or IsAddOnLoaded(\"PitBull4\") or IsAddOnLoaded(\"ShadowedUnitFrames\") then\n\tC.unitframe.enable = false\nend\n\nif IsAddOnLoaded(\"Grid\") or IsAddOnLoaded(\"Grid2\") or IsAddOnLoaded(\"HealBot\") or IsAddOnLoaded(\"VuhDo\") or IsAddOnLoaded(\"Cell\") or IsAddOnLoaded(\"Aptechka\") then\n\tC.raidframe.show_party = false\n\tC.raidframe.show_raid = false\n\tC.raidframe.auto_position = \"NONE\"\nend\n\nif IsAddOnLoaded(\"TidyPlates\") or IsAddOnLoaded(\"nPlates\") or IsAddOnLoaded(\"Kui_Nameplates\") or IsAddOnLoaded(\"rNamePlates\") or IsAddOnLoaded(\"EKplates\") or IsAddOnLoaded(\"bdNameplates\") or IsAddOnLoaded(\"Plater\") or IsAddOnLoaded(\"Nameplates\") or IsAddOnLoaded(\"NeatPlates\") then\n\tC.nameplate.enable = false\nend\n\nif IsAddOnLoaded(\"Dominos\") or IsAddOnLoaded(\"Bartender4\") or IsAddOnLoaded(\"RazerNaga\") then\n\tC.actionbar.enable = false\n\tC.actionbar.toggle_mode = false\nend\n\nif IsAddOnLoaded(\"Mapster\") then\n\tC.minimap.fog_of_war = false\nend\n\nif IsAddOnLoaded(\"Prat-3.0\") or IsAddOnLoaded(\"Chatter\") or IsAddOnLoaded(\"BasicChatMods\") or IsAddOnLoaded(\"Glass\") then\n\tC.chat.enable = false\nend\n\nif IsAddOnLoaded(\"Quartz\") or IsAddOnLoaded(\"AzCastBar\") then\n\tC.unitframe.unit_castbar = false\n\tC.unitframe.plugins_swing = false\n\tC.unitframe.plugins_gcd = false\nend\n\nif IsAddOnLoaded(\"Afflicted3\") or IsAddOnLoaded(\"InterruptBar\") then\n\tC.enemycooldown.enable = false\nend\n\nif IsAddOnLoaded(\"TipTac\") or IsAddOnLoaded(\"FreebTip\") or IsAddOnLoaded(\"bTooltip\") or IsAddOnLoaded(\"PhanxTooltip\") or IsAddOnLoaded(\"Icetip\") then\n\tC.tooltip.enable = false\nend\n\nif IsAddOnLoaded(\"Gladius\") or IsAddOnLoaded(\"GladiusEx\") then\n\tC.unitframe.show_arena = false\nend\n\nif IsAddOnLoaded(\"Omen\") or IsAddOnLoaded(\"rThreat\") then\n\tC.threat.enable = false\nend\n\nif IsAddOnLoaded(\"DBM-SpellTimers\") then\n\tC.raidcooldown.enable = false\nend\n\nif IsAddOnLoaded(\"TipTacTalents\") then\n\tC.tooltip.talents = false\nend\n\nif IsAddOnLoaded(\"AdiBags\") or IsAddOnLoaded(\"ArkInventory\") or IsAddOnLoaded(\"cargBags_Nivaya\") or IsAddOnLoaded(\"cargBags\") or IsAddOnLoaded(\"Bagnon\") or IsAddOnLoaded(\"Combuctor\") or IsAddOnLoaded(\"TBag\") or IsAddOnLoaded(\"BaudBag\") then\n\tC.bag.enable = false\nend\n\nif IsAddOnLoaded(\"MikScrollingBattleText\") or IsAddOnLoaded(\"Parrot\") or IsAddOnLoaded(\"xCT\") or IsAddOnLoaded(\"sct\") then\n\tC.combattext.enable = false\nend\n\nif IsAddOnLoaded(\"Doom_CooldownPulse\") then\n\tC.pulsecooldown.enable = false\nend\n\nif IsAddOnLoaded(\"GnomishVendorShrinker\") or IsAddOnLoaded(\"AlreadyKnown\") then\n\tC.trade.already_known = false\nend\n\nif IsAddOnLoaded(\"Clique\") or IsAddOnLoaded(\"sBinder\") then\n\tC.misc.click_cast = false\nend\n\nif IsAddOnLoaded(\"RaidSlackCheck\") then\n\tC.announcements.flask_food = false\n\tC.announcements.feasts = false\nend\n\nif IsAddOnLoaded(\"PhoenixStyle\") then\n\tC.announcements.toys = false\nend\n\nif IsAddOnLoaded(\"Overachiever\") then\n\tC.tooltip.achievements = false\nend\n\nif IsAddOnLoaded(\"ChatSounds\") then\n\tC.chat.whisp_sound = false\nend\n\nif IsAddOnLoaded(\"Aurora\") then\n\tC.skins.blizzard_frames = false\nend\n\nif IsAddOnLoaded(\"BigWigs\") or IsAddOnLoaded(\"DBM-Core\") then\n\tC.automation.auto_role = false\nend\n\nif IsAddOnLoaded(\"QuickQuest\") then\n\tC.automation.accept_quest = false\nend"
  },
  {
    "path": "ShestakUI/Core/Functions.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tNumber value function\n----------------------------------------------------------------------------------------\nT.Round = function(number, decimals)\n\tif not decimals then decimals = 0 end\n\tif decimals and decimals > 0 then\n\t\tlocal mult = 10 ^ decimals\n\t\treturn floor(number * mult + 0.5) / mult\n\tend\n\treturn floor(number + 0.5)\nend\n\nT.ShortValue = function(value)\n\tif value >= 1e11 then\n\t\treturn (\"%.0fb\"):format(value / 1e9)\n\telseif value >= 1e10 then\n\t\treturn (\"%.1fb\"):format(value / 1e9):gsub(\"%.?0+([km])$\", \"%1\")\n\telseif value >= 1e9 then\n\t\treturn (\"%.2fb\"):format(value / 1e9):gsub(\"%.?0+([km])$\", \"%1\")\n\telseif value >= 1e8 then\n\t\treturn (\"%.0fm\"):format(value / 1e6)\n\telseif value >= 1e7 then\n\t\treturn (\"%.1fm\"):format(value / 1e6):gsub(\"%.?0+([km])$\", \"%1\")\n\telseif value >= 1e6 then\n\t\treturn (\"%.2fm\"):format(value / 1e6):gsub(\"%.?0+([km])$\", \"%1\")\n\telseif value >= 1e5 then\n\t\treturn (\"%.0fk\"):format(value / 1e3)\n\telseif value >= 1e3 then\n\t\treturn (\"%.1fk\"):format(value / 1e3):gsub(\"%.?0+([km])$\", \"%1\")\n\telse\n\t\treturn value\n\tend\nend\n\nT.RGBToHex = function(r, g, b)\n\tr = tonumber(r) <= 1 and tonumber(r) >= 0 and tonumber(r) or 0\n\tg = tonumber(g) <= tonumber(g) and tonumber(g) >= 0 and tonumber(g) or 0\n\tb = tonumber(b) <= 1 and tonumber(b) >= 0 and tonumber(b) or 0\n\treturn string.format(\"|cff%02x%02x%02x\", r * 255, g * 255, b * 255)\nend\n\n----------------------------------------------------------------------------------------\n--\tChat channel check\n----------------------------------------------------------------------------------------\nT.CheckChat = function(warning)\n\tif IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then\n\t\treturn \"INSTANCE_CHAT\"\n\telseif IsInRaid(LE_PARTY_CATEGORY_HOME) then\n\t\tif warning and (UnitIsGroupLeader(\"player\") or UnitIsGroupAssistant(\"player\") or IsEveryoneAssistant()) then\n\t\t\treturn \"RAID_WARNING\"\n\t\telse\n\t\t\treturn \"RAID\"\n\t\tend\n\telseif IsInGroup(LE_PARTY_CATEGORY_HOME) then\n\t\treturn \"PARTY\"\n\tend\n\treturn \"SAY\"\nend\n\n----------------------------------------------------------------------------------------\n--\tPlayer's role check\n----------------------------------------------------------------------------------------\nlocal isCaster = {\n\tDEATHKNIGHT = {nil, nil, nil},\n\tDEMONHUNTER = {nil, nil},\n\tDRUID = {true},\t\t\t\t\t-- Balance\n\tHUNTER = {nil, nil, nil},\n\tMAGE = {true, true, true},\n\tMONK = {nil, nil, nil},\n\tPALADIN = {nil, nil, nil},\n\tPRIEST = {nil, nil, true},\t\t-- Shadow\n\tROGUE = {nil, nil, nil},\n\tSHAMAN = {true},\t\t\t\t-- Elemental\n\tWARLOCK = {true, true, true},\n\tWARRIOR = {nil, nil, nil},\n\tEVOKER = {true}\n}\n\nlocal function CheckRole()\n\tlocal spec = GetSpecialization()\n\tlocal role = spec and GetSpecializationRole(spec)\n\n\tT.Spec = spec\n\tif role == \"TANK\" then\n\t\tT.Role = \"Tank\"\n\telseif role == \"HEALER\" then\n\t\tT.Role = \"Healer\"\n\telseif role == \"DAMAGER\" then\n\t\tif isCaster[T.class][spec] then\n\t\t\tT.Role = \"Caster\"\n\t\telse\n\t\t\tT.Role = \"Melee\"\n\t\tend\n\tend\nend\nlocal RoleUpdater = CreateFrame(\"Frame\")\nRoleUpdater:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nRoleUpdater:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\nRoleUpdater:SetScript(\"OnEvent\", CheckRole)\n\nT.IsHealerSpec = function()\n\tlocal healer = false\n\tlocal spec = GetSpecialization()\n\n\tif (T.class == \"EVOKER\" and spec == 2) or (T.class == \"DRUID\" and spec == 4) or (T.class == \"MONK\" and spec == 2) or\n\t(T.class == \"PALADIN\" and spec == 1) or (T.class == \"PRIEST\" and spec ~= 3) or (T.class == \"SHAMAN\" and spec == 3) then\n\t\thealer = true\n\tend\n\n\treturn healer\nend\n\n----------------------------------------------------------------------------------------\n--\tPlayer's buff check\n----------------------------------------------------------------------------------------\nT.CheckPlayerBuff = function(spell)\n\tfor i = 1, 40 do\n\t\tlocal name, _, _, _, _, _, unitCaster = UnitBuff(\"player\", i)\n\t\tif not name then break end\n\t\tif name == spell then\n\t\t\treturn i, unitCaster\n\t\tend\n\tend\n\treturn nil\nend\n\n----------------------------------------------------------------------------------------\n--\tPlayer's level check\n----------------------------------------------------------------------------------------\nlocal function CheckLevel(_, _, level)\n\tT.level = level\nend\nlocal LevelUpdater = CreateFrame(\"Frame\")\nLevelUpdater:RegisterEvent(\"PLAYER_LEVEL_UP\")\nLevelUpdater:SetScript(\"OnEvent\", CheckLevel)\n\n----------------------------------------------------------------------------------------\n--\tPet Battle Hider\n----------------------------------------------------------------------------------------\nT_PetBattleFrameHider = CreateFrame(\"Frame\", \"ShestakUI_PetBattleFrameHider\", UIParent, \"SecureHandlerStateTemplate\")\nT_PetBattleFrameHider:SetAllPoints()\nT_PetBattleFrameHider:SetFrameStrata(\"LOW\")\nRegisterStateDriver(T_PetBattleFrameHider, \"visibility\", \"[petbattle] hide; show\")\n\n----------------------------------------------------------------------------------------\n--\tUTF functions\n----------------------------------------------------------------------------------------\nT.UTF = function(string, i, dots)\n\tif not string then return end\n\tlocal bytes = string:len()\n\tif bytes <= i then\n\t\treturn string\n\telse\n\t\tlocal len, pos = 0, 1\n\t\twhile (pos <= bytes) do\n\t\t\tlen = len + 1\n\t\t\tlocal c = string:byte(pos)\n\t\t\tif c > 0 and c <= 127 then\n\t\t\t\tpos = pos + 1\n\t\t\telseif c >= 192 and c <= 223 then\n\t\t\t\tpos = pos + 2\n\t\t\telseif c >= 224 and c <= 239 then\n\t\t\t\tpos = pos + 3\n\t\t\telseif c >= 240 and c <= 247 then\n\t\t\t\tpos = pos + 4\n\t\t\tend\n\t\t\tif len == i then break end\n\t\tend\n\t\tif len == i and pos <= bytes then\n\t\t\treturn string:sub(1, pos - 1)..(dots and \"...\" or \"\")\n\t\telse\n\t\t\treturn string\n\t\tend\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tMove functions\n----------------------------------------------------------------------------------------\nT.CalculateMoverPoints = function(mover)\n\tlocal centerX, centerY = UIParent:GetCenter()\n\tlocal width = UIParent:GetRight()\n\tlocal x, y = mover:GetCenter()\n\n\tlocal point = \"BOTTOM\"\n\tif y >= centerY then\n\t\tpoint = \"TOP\"\n\t\ty = -(UIParent:GetTop() - mover:GetTop())\n\telse\n\t\ty = mover:GetBottom()\n\tend\n\n\tif x >= (width * 2 / 3) then\n\t\tpoint = point..\"RIGHT\"\n\t\tx = mover:GetRight() - width\n\telseif x <= (width / 3) then\n\t\tpoint = point..\"LEFT\"\n\t\tx = mover:GetLeft()\n\telse\n\t\tx = x - centerX\n\tend\n\n\treturn x, y, point\nend\n\nT.IsFramePositionedLeft = function(frame)\n\tlocal x = frame:GetCenter()\n\tlocal screenWidth = GetScreenWidth()\n\tlocal positionedLeft = false\n\n\tif x and x < (screenWidth / 2) then\n\t\tpositionedLeft = true\n\tend\n\n\treturn positionedLeft\nend\n\nT.CurrentProfile = function(reset)\n\tif ShestakUIOptionsGlobal[T.realm][T.name] then\n\t\tif ShestakUIPositionsPerChar == nil then\n\t\t\tShestakUIPositionsPerChar = ShestakUIPositions\n\t\tend\n\t\tif not ShestakUIPositionsPerChar then return {} end\n\t\tlocal i = tostring(ShestakUIOptionsGlobal[T.realm][\"Current_Profile\"][T.name])\n\t\tShestakUIPositionsPerChar[i] = ShestakUIPositionsPerChar[i] or {}\n\t\tif reset then\n\t\t\tShestakUIPositionsPerChar[i] = {}\n\t\telse\n\t\t\treturn ShestakUIPositionsPerChar[i]\n\t\tend\n\telse\n\t\tif not ShestakUIPositions then return {} end\n\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\tShestakUIPositions[i] = ShestakUIPositions[i] or {}\n\t\tif reset then\n\t\t\tShestakUIPositions[i] = {}\n\t\telse\n\t\t\treturn ShestakUIPositions[i]\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Core/GUI.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n-- Spells lists initialization\nC.filger.buff_spells_list = {}\nC.filger.proc_spells_list = {}\nC.filger.debuff_spells_list = {}\nC.filger.aura_bar_spells_list = {}\nC.filger.cd_spells_list = {}\nC.filger.ignore_spells_list = {}\nC.raidframe.plugins_aura_watch_list = {}\nC.announcements.spells_list = {}\nC.raidcooldown.spells_list = {}\nC.raidcooldown.spells_list_ver = 1\nC.enemycooldown.spells_list = {}\nC.enemycooldown.spells_list_ver = 1\nC.nameplate.debuffs_list = {}\nC.nameplate.buffs_list = {}\nC.combattext.spells_list = {}\nC.chat.spam_list = \"\"\nC.font.global_font = false\nC.media.profile = \"-- Insert Your code here\\n\"\nC.general.choose_profile = 1\nC.general.profile_name = \"1\"\nC.options = {}\n\nif not IsAddOnLoaded(\"ShestakUI_Config\") then return end\n\n----------------------------------------------------------------------------------------\n--\tThis Module loads new user settings if ShestakUI_Config is loaded\n----------------------------------------------------------------------------------------\n-- Create the profile boolean\nif not ShestakUIOptionsGlobal then ShestakUIOptionsGlobal = {} end\nif ShestakUIOptionsGlobal[T.realm] == nil then ShestakUIOptionsGlobal[T.realm] = {} end\nif ShestakUIOptionsGlobal[T.realm][T.name] == nil then ShestakUIOptionsGlobal[T.realm][T.name] = false end\nif ShestakUIOptionsGlobal[T.realm][\"Current_Profile\"] == nil then ShestakUIOptionsGlobal[T.realm][\"Current_Profile\"] = {} end\n\n-- Create the main options table\nif ShestakUIOptions == nil then ShestakUIOptions = {} end\n\n-- Determine which settings to use\nlocal profile\nif ShestakUIOptionsGlobal[T.realm][T.name] == true then\n\tif ShestakUIOptionsPerChar == nil then\n\t\tShestakUIOptionsPerChar = ShestakUIOptions\n\t\tShestakUIOptionsGlobal[T.realm][\"Current_Profile\"][T.name] = ShestakUIOptionsGlobal[\"Current_Profile\"] or 1\n\tend\n\n\tif not ShestakUIOptionsPerChar.merged and not ShestakUIOptionsPerChar[\"1\"] then\t-- TODO delete after while\n\t\tlocal backup = ShestakUIOptionsPerChar\n\t\tShestakUIOptionsPerChar = {}\n\t\tShestakUIOptionsPerChar[\"1\"] = backup\n\t\tShestakUIOptionsPerChar.merged = true\n\tend\n\n\tShestakUIOptionsGlobal[T.realm][\"Current_Profile\"][T.name] = ShestakUIOptionsGlobal[T.realm][\"Current_Profile\"][T.name] or 1\n\tlocal i = tostring(ShestakUIOptionsGlobal[T.realm][\"Current_Profile\"][T.name])\n\tShestakUIOptionsPerChar[i] = ShestakUIOptionsPerChar[i] or {}\n\tprofile = ShestakUIOptionsPerChar[i]\nelse\n\tif not ShestakUIOptions.merged and not ShestakUIOptions[\"1\"] then\t-- TODO delete after while\n\t\tlocal backup = ShestakUIOptions\n\t\tShestakUIOptions = {}\n\t\tShestakUIOptions[\"1\"] = backup\n\t\tShestakUIOptions.merged = true\n\tend\n\n\tShestakUIOptionsGlobal[\"Current_Profile\"] = ShestakUIOptionsGlobal[\"Current_Profile\"] or 1\n\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\tShestakUIOptions[i] = ShestakUIOptions[i] or {}\n\tprofile = ShestakUIOptions[i]\nend\n\n-- Apply or remove saved settings as needed\nfor group, options in pairs(profile) do\n\tif C[group] then\n\t\tfor option, value in pairs(options) do\n\t\t\tif C[group][option] == nil or C[group][option] == value then\n\t\t\t\t-- remove saved vars if they do not exist in lua config anymore, or are the same as the lua config\n\t\t\t\tprofile[group][option] = nil\n\t\t\telse\n\t\t\t\tC[group][option] = value\n\t\t\tend\n\t\tend\n\telse\n\t\t-- profile[group] = nil\n\tend\nend\n\n-- Add global options variable\nC.options = profile\n\n-- Load edited profile code\nloadstring(\"local T, C, L = unpack(ShestakUI)\\n\"..C[\"media\"].profile)()"
  },
  {
    "path": "ShestakUI/Core/Init.lua",
    "content": "----------------------------------------------------------------------------------------\n--\tInitiation of ShestakUI\n----------------------------------------------------------------------------------------\n-- Including system\nlocal addon, engine = ...\nengine[1] = {}\t-- T, Functions\nengine[2] = {}\t-- C, Config\nengine[3] = {}\t-- L, Localization\n\nShestakUI = engine\t-- Allow other addons to use Engine\n\n--[[\n\tThis should be at the top of every file inside of the ShestakUI AddOn:\n\tlocal T, C, L, _ = unpack(select(2, ...))\n\n\tThis is how another addon imports the ShestakUI engine:\n\tlocal T, C, L, _ = unpack(ShestakUI)\n]]"
  },
  {
    "path": "ShestakUI/Core/Kill.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tKill all stuff on default UI that we don't need\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function(_, _, addon)\n\tif addon == \"Blizzard_AchievementUI\" then\n\t\tif C.tooltip.enable then\n\t\t\t--BETA hooksecurefunc(\"AchievementFrameCategories_DisplayButton\", function(button) button.showTooltipFunc = nil end)\n\t\tend\n\tend\n\n\tif ClassPowerBar then\n\t\tClassPowerBar.OnEvent = T.dummy -- Fix error with druid on logon\n\tend\n\n\tif C.unitframe.enable and C.raidframe.layout ~= \"BLIZZARD\" then\n\t\t--BETA InterfaceOptionsFrameCategoriesButton10:SetScale(0.00001)\n\t\t-- InterfaceOptionsFrameCategoriesButton10:SetAlpha(0)\n\t\t-- if not InCombatLockdown() then\n\t\t\t-- CompactRaidFrameManager:Kill()\n\t\t\t-- CompactRaidFrameContainer:Kill()\n\t\t-- end\n\t\t-- ShowPartyFrame = T.dummy\n\t\t-- HidePartyFrame = T.dummy\n\t\t-- CompactUnitFrameProfiles_ApplyProfile = T.dummy\n\t\tif CompactRaidFrameManager then\n\t\t\tlocal function HideFrames()\n\t\t\t\tCompactRaidFrameManager:UnregisterAllEvents()\n\t\t\t\tCompactRaidFrameContainer:UnregisterAllEvents()\n\t\t\t\tif not InCombatLockdown() then\n\t\t\t\t\tCompactRaidFrameManager:Hide()\n\t\t\t\t\tlocal shown = CompactRaidFrameManager_GetSetting(\"IsShown\")\n\t\t\t\t\tif shown and shown ~= \"0\" then\n\t\t\t\t\t\tCompactRaidFrameManager_SetSetting(\"IsShown\", \"0\")\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal hiddenFrame = CreateFrame(\"Frame\")\n\t\t\thiddenFrame:Hide()\n\t\t\thooksecurefunc(\"CompactRaidFrameManager_UpdateShown\", HideFrames)\n\t\t\tCompactRaidFrameManager:HookScript(\"OnShow\", HideFrames)\n\t\t\tCompactRaidFrameContainer:HookScript(\"OnShow\", HideFrames)\n\t\t\tHideFrames()\n\t\tend\n\tend\n\n\t--BETA Display_UseUIScale:Kill()\n\t-- Display_UIScaleSlider:Kill()\n\tTutorialFrameAlertButton:Kill()\n\tSetCVarBitfield(\"closedInfoFrames\", LE_FRAME_TUTORIAL_WORLD_MAP_FRAME, true)\n\tSetCVarBitfield(\"closedInfoFrames\", LE_FRAME_TUTORIAL_PET_JOURNAL, true)\n\tSetCVarBitfield(\"closedInfoFrames\", LE_FRAME_TUTORIAL_GARRISON_BUILDING, true)\n\tSetCVarBitfield(\"closedInfoFrames\", LE_FRAME_TUTORIAL_TALENT_CHANGES, true)\n\n\tSetCVar(\"countdownForCooldowns\", 0)\n\t--BETA InterfaceOptionsActionBarsPanelCountdownCooldowns:Hide()\n\n\tif C.chat.enable then\n\t\t--BETA InterfaceOptionsSocialPanelChatStyle:Hide()\n\t\tSetCVar(\"chatStyle\", \"im\")\n\tend\n\n\tif C.unitframe.enable then\n\t\tif T.class == \"DEATHKNIGHT\" and C.unitframe_class_bar.rune ~= true then\n\t\t\tRuneFrame:Kill()\n\t\tend\n\t\t--BETA InterfaceOptionsDisplayPanelDisplayDropDown:Hide()\n\t\t--BETA InterfaceOptionsCombatPanelTargetOfTarget:Hide()\n\t\tSetCVar(\"showPartyBackground\", 0)\n\tend\n\n\tif C.actionbar.enable then\n\t\t--BETA InterfaceOptionsActionBarsPanelBottomLeft:Hide()\n\t\t-- InterfaceOptionsActionBarsPanelBottomRight:Hide()\n\t\t-- InterfaceOptionsActionBarsPanelRight:Hide()\n\t\t-- InterfaceOptionsActionBarsPanelRightTwo:Hide()\n\t\t-- InterfaceOptionsActionBarsPanelAlwaysShowActionBars:Hide()\n\t\t-- InterfaceOptionsActionBarsPanelStackRightBars:Hide()\n\t\t-- if not InCombatLockdown() then\n\t\t\t-- SetCVar(\"multiBarRightVerticalLayout\", 0) -- removed?\n\t\t-- end\n\tend\n\n\tif C.nameplate.enable then\n\t\tSetCVar(\"ShowClassColorInNameplate\", 1)\n\tend\n\n\tif C.minimap.enable then\n\t\t--BETA InterfaceOptionsDisplayPanelRotateMinimap:Hide()\n\t\tSetCVar(\"minimapTrackingShowAll\", 1)\n\tend\n\n\tif C.bag.enable then\n\t\tC_Container.SetSortBagsRightToLeft(true)\n\t\tC_Container.SetInsertItemsLeftToRight(false)\n\tend\n\n\tif C.combattext.enable then\n\t\t--BETA InterfaceOptionsCombatPanelEnableFloatingCombatText:Hide()\n\t\tif C.combattext.incoming then\n\t\t\tSetCVar(\"enableFloatingCombatText\", 1)\n\t\telse\n\t\t\tSetCVar(\"enableFloatingCombatText\", 0)\n\t\tend\n\tend\nend)\n\nlocal function AcknowledgeTips()\n\tif InCombatLockdown() then return end\n\n\tfor frame in _G.HelpTip.framePool:EnumerateActive() do\n\t\tframe:Acknowledge()\n\tend\nend\n\nAcknowledgeTips()\nhooksecurefunc(_G.HelpTip, \"Show\", AcknowledgeTips)\n"
  },
  {
    "path": "ShestakUI/Core/Launch.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tFirst Time Launch and On Login file\n----------------------------------------------------------------------------------------\nlocal function InstallUI()\n\t-- Don't need to set CVar multiple time\n\tSetCVar(\"screenshotQuality\", 8)\n\tSetCVar(\"cameraDistanceMaxZoomFactor\", 2.6)\n\tSetCVar(\"showTutorials\", 0)\n\tSetCVar(\"gameTip\", \"0\")\n\tSetCVar(\"UberTooltips\", 1)\n\tSetCVar(\"chatMouseScroll\", 1)\n\tSetCVar(\"removeChatDelay\", 1)\n\tSetCVar(\"WholeChatWindowClickable\", 0)\n\tSetCVar(\"WhisperMode\", \"inline\")\n\tSetCVar(\"colorblindMode\", 0)\n\tSetCVar(\"lootUnderMouse\", 0)\n\tSetCVar(\"autoLootDefault\", 1)\n\tSetCVar(\"RotateMinimap\", 0)\n\tSetCVar(\"autoQuestProgress\", 1)\n\tSetCVar(\"scriptErrors\", 1)\n\tSetCVar(\"taintLog\", 0)\n\tSetCVar(\"buffDurations\", 1)\n\tSetCVar(\"autoOpenLootHistory\", 0)\n\tSetCVar(\"lossOfControl\", 0)\n\tSetCVar(\"nameplateShowSelf\", 0)\n\n\t-- Setting chat frames\n\tif C.chat.enable == true and not (IsAddOnLoaded(\"Prat-3.0\") or IsAddOnLoaded(\"Chatter\")) then\n\t\tfor i = 1, NUM_CHAT_WINDOWS do\n\t\t\tlocal frame = _G[format(\"ChatFrame%s\", i)]\n\t\t\tlocal chatFrameId = frame:GetID()\n\n\t\t\tframe:SetSize(C.chat.width, C.chat.height)\n\n\t\t\t-- Default width and height of chats\n\t\t\tSetChatWindowSavedDimensions(chatFrameId, T.Scale(C.chat.width), T.Scale(C.chat.height))\n\n\t\t\t-- Move general chat to bottom left\n\t\t\tif i == 1 then\n\t\t\t\tframe:ClearAllPoints()\n\t\t\t\tframe:SetPoint(unpack(C.position.chat))\n\t\t\tend\n\n\t\t\t-- Save new default position and dimension\n\t\t\tFCF_SavePositionAndDimensions(frame)\n\n\t\t\t-- Rename general and combat log tabs\n\t\t\tif i == 1 then FCF_SetWindowName(frame, GENERAL) end\n\t\t\tif i == 2 then FCF_SetWindowName(frame, GUILD_BANK_LOG) end\n\n\t\t\t-- Lock them if unlocked\n\t\t\tif not frame.isLocked then FCF_SetLocked(frame, 1) end\n\t\tend\n\n\t\t-- Enable classcolor automatically on login and on each character without doing /configure each time\n\t\tToggleChatColorNamesByClassGroup(true, \"SAY\")\n\t\tToggleChatColorNamesByClassGroup(true, \"EMOTE\")\n\t\tToggleChatColorNamesByClassGroup(true, \"YELL\")\n\t\tToggleChatColorNamesByClassGroup(true, \"GUILD\")\n\t\tToggleChatColorNamesByClassGroup(true, \"OFFICER\")\n\t\tToggleChatColorNamesByClassGroup(true, \"GUILD_ACHIEVEMENT\")\n\t\tToggleChatColorNamesByClassGroup(true, \"ACHIEVEMENT\")\n\t\tToggleChatColorNamesByClassGroup(true, \"WHISPER\")\n\t\tToggleChatColorNamesByClassGroup(true, \"PARTY\")\n\t\tToggleChatColorNamesByClassGroup(true, \"PARTY_LEADER\")\n\t\tToggleChatColorNamesByClassGroup(true, \"RAID\")\n\t\tToggleChatColorNamesByClassGroup(true, \"RAID_LEADER\")\n\t\tToggleChatColorNamesByClassGroup(true, \"RAID_WARNING\")\n\t\tToggleChatColorNamesByClassGroup(true, \"INSTANCE_CHAT\")\n\t\tToggleChatColorNamesByClassGroup(true, \"INSTANCE_CHAT_LEADER\")\n\t\tToggleChatColorNamesByClassGroup(true, \"CHANNEL1\")\n\t\tToggleChatColorNamesByClassGroup(true, \"CHANNEL2\")\n\t\tToggleChatColorNamesByClassGroup(true, \"CHANNEL3\")\n\t\tToggleChatColorNamesByClassGroup(true, \"CHANNEL4\")\n\t\tToggleChatColorNamesByClassGroup(true, \"CHANNEL5\")\n\tend\n\n\t-- Reset saved variables on char\n\tShestakUISettingsPerChar = {}\n\n\tShestakUISettingsPerChar.Install = true\n\tShestakUISettingsPerChar.FogOfWar = true\n\tShestakUISettingsPerChar.Coords = true\n\tShestakUISettingsPerChar.Archaeology = false\n\tShestakUISettingsPerChar.BarsLocked = false\n\tShestakUISettingsPerChar.SplitBars = true\n\tShestakUISettingsPerChar.RightBars = C.actionbar.rightbars\n\tShestakUISettingsPerChar.BottomBars = C.actionbar.bottombars\n\n\tif C_ClassTrial.IsClassTrialCharacter() and IsWetxius then\n\t\tSlashCmdList.ONLY_UI()\n\tend\n\n\t-- Set to default layout of Blizzard Edit Mode\n\tC_EditMode.SetActiveLayout(1)\n\n\tReloadUI()\nend\n\nlocal function DisableUI()\n\tDisableAddOn(\"ShestakUI\")\n\tReloadUI()\nend\n\n----------------------------------------------------------------------------------------\n--\tPopups\n----------------------------------------------------------------------------------------\nStaticPopupDialogs.INSTALL_UI = {\n\ttext = L_POPUP_INSTALLUI,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = InstallUI,\n\tOnCancel = function() ShestakUISettingsPerChar.Install = false end,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = false,\n\tpreferredIndex = 5,\n}\n\nStaticPopupDialogs.DISABLE_UI = {\n\ttext = L_POPUP_DISABLEUI,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = DisableUI,\n\tshowAlert = true,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\nStaticPopupDialogs.RESET_UI = {\n\ttext = L_POPUP_RESETUI,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = InstallUI,\n\tOnCancel = function() ShestakUISettingsPerChar.Install = true end,\n\tshowAlert = true,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\nStaticPopupDialogs.RESET_STATS = {\n\ttext = L_POPUP_RESETSTATS,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function() ShestakUIStats = {} ReloadUI() end,\n\tshowAlert = true,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\nSLASH_CONFIGURE1 = \"/resetui\"\nSlashCmdList.CONFIGURE = function() StaticPopup_Show(\"RESET_UI\") end\n\nSLASH_RESETSTATS1 = \"/resetstats\"\nSlashCmdList.RESETSTATS = function() StaticPopup_Show(\"RESET_STATS\") end\n\n----------------------------------------------------------------------------------------\n--\tOn logon function\n----------------------------------------------------------------------------------------\nlocal OnLogon = CreateFrame(\"Frame\")\nOnLogon:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nOnLogon:SetScript(\"OnEvent\", function(self)\n\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\n\t-- Create empty CVar if they doesn't exist\n\tif ShestakUISettings == nil then ShestakUISettings = {} end\n\tif ShestakUIPositions == nil then ShestakUIPositions = {} end\n\tif ShestakUISettingsPerChar == nil then ShestakUISettingsPerChar = {} end\n\tif ShestakUISettingsPerChar.FogOfWar == nil then ShestakUISettingsPerChar.FogOfWar = true end\n\tif ShestakUISettingsPerChar.Coords == nil then ShestakUISettingsPerChar.Coords = true end\n\tif ShestakUISettingsPerChar.Archaeology == nil then ShestakUISettingsPerChar.Archaeology = false end\n\tif ShestakUISettingsPerChar.BarsLocked == nil then ShestakUISettingsPerChar.BarsLocked = false end\n\tif ShestakUISettingsPerChar.SplitBars == nil then ShestakUISettingsPerChar.SplitBars = true end\n\tif ShestakUISettingsPerChar.RightBars == nil then ShestakUISettingsPerChar.RightBars = C.actionbar.rightbars end\n\tif ShestakUISettingsPerChar.BottomBars == nil then ShestakUISettingsPerChar.BottomBars = C.actionbar.bottombars end\n\n\tif T.screenWidth < 1024 and GetCVar(\"gxMonitor\") == \"0\" then\n\t\tSetCVar(\"useUiScale\", 0)\n\t\tStaticPopup_Show(\"DISABLE_UI\")\n\telse\n\t\tSetCVar(\"useUiScale\", 1)\n\t\tif C.general.uiscale > 1.28 then C.general.uiscale = 1.28 end\n\n\t\t-- Set our uiScale\n\t\tif tonumber(GetCVar(\"uiScale\")) ~= tonumber(C.general.uiscale) then\n\t\t\tSetCVar(\"uiScale\", C.general.uiscale)\n\t\tend\n\n\t\t-- Hack for 4K and WQHD Resolution\n\t\tif C.general.uiscale < 0.64 then\n\t\t\tUIParent:SetScale(C.general.uiscale)\n\t\tend\n\n\t\t-- Install default if we never ran ShestakUI on this character\n\t\tif not ShestakUISettingsPerChar.Install then\n\t\t\tStaticPopup_Show(\"INSTALL_UI\")\n\t\tend\n\tend\n\n\t-- Welcome message\n\tif C.general.welcome_message == true then\n\t\tprint(\"|cffffff00\"..L_WELCOME_LINE_1..T.version..\" \"..T.client..\", \"..T.name..\".|r\")\n\t\tprint(\"|cffffff00\"..L_WELCOME_LINE_2_1..\" |cffffff00\"..L_WELCOME_LINE_2_2..\"|r\")\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Core/Movers.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tMovement function(by Allez)\n----------------------------------------------------------------------------------------\nT.MoverFrames = {\n\tVehicleButtonAnchor,\n\tExtraButtonAnchor,\n\tZoneButtonAnchor,\n\tActionBarAnchor,\n\tRightActionBarAnchor,\n\tPetActionBarAnchor,\n\tStanceBarAnchor,\n\tMicroAnchor,\n\tVehicleAnchor,\n\tAchievementAnchor,\n\tMinimapAnchor,\n\tTopPanelAnchor,\n\tBuffsAnchor,\n\tRaidCDAnchor,\n\tEnemyCDAnchor,\n\tObjectiveTrackerAnchor,\n\tThreatMeterAnchor,\n\tLootRollAnchor,\n\tRaidBuffsAnchor,\n\tPulseCDAnchor,\n\tAutoButtonAnchor,\n\tTooltipAnchor,\n\tChatBar,\n\tP_BUFF_ICON_Anchor,\n\tP_PROC_ICON_Anchor,\n\tSPECIAL_P_BUFF_ICON_Anchor,\n\tT_DEBUFF_ICON_Anchor,\n\tT_BUFF_Anchor,\n\tPVE_PVP_DEBUFF_Anchor,\n\tPVE_PVP_CC_Anchor,\n\tCOOLDOWN_Anchor,\n\tT_DE_BUFF_BAR_Anchor,\n\tSplitBarLeft,\n\tSplitBarRight,\n\tUIWidgetPowerBarAnchor\n}\n\nif C.actionbar.bar7_enable then\n\ttinsert(T.MoverFrames, Bar7Holder)\nend\n\nif C.actionbar.bar8_enable then\n\ttinsert(T.MoverFrames, Bar8Holder)\nend\n\nif C.actionbar.editor then\n\ttinsert(T.MoverFrames, Bar1Holder)\n\ttinsert(T.MoverFrames, Bar2Holder)\n\ttinsert(T.MoverFrames, Bar3Holder)\n\ttinsert(T.MoverFrames, Bar4Holder)\n\ttinsert(T.MoverFrames, Bar5Holder)\n\ttinsert(T.MoverFrames, Bar6Holder)\n\ttremove(T.MoverFrames, 5)\t-- RightActionBarAnchor\n\ttremove(T.MoverFrames, 4)\t-- ActionBarAnchor\nend\n\nlocal unitFrames = {\n\toUF_Player,\n\toUF_Target,\n\toUF_Pet,\n\toUF_Focus,\n\toUF_FocusTarget,\n\toUF_TargetTarget,\n\toUF_Player_Castbar,\n\toUF_Target_Castbar,\n\toUF_Player_Portrait,\n\toUF_Target_Portrait,\n\tPartyAnchor,\n\tPartyTargetAnchor,\n\tPartyPetAnchor,\n\tRaidTankAnchor,\n\tPartyDPSAnchor,\n\tPartyTargetDPSAnchor,\n\tPartyPetDPSAnchor,\n\tRaidTankDPSAnchor\n}\n\nfor i = 1, 5 do\n\ttinsert(unitFrames,_G[\"oUF_Boss\"..i])\n\ttinsert(unitFrames,_G[\"oUF_Arena\"..i])\n\ttinsert(unitFrames,_G[\"oUF_Arena\"..i..\"Target\"])\nend\n\nfor i = 1, C.raidframe.raid_groups do\n\ttinsert(unitFrames, _G[\"RaidAnchor\"..i])\n\ttinsert(unitFrames, _G[\"RaidDPSAnchor\"..i])\nend\n\nlocal moving = false\nlocal movers = {}\nlocal placed = {\n\t\"Butsu\",\n\t\"UIAltPowerBar\",\n\t\"LootHistoryFrame\",\n\t\"stArchaeologyFrame\",\n\t\"StuffingFrameBags\",\n\t\"StuffingFrameBank\",\n\t\"UIWidgetTopAnchor\",\n\t\"UIWidgetBelowAnchor\"\n}\n\nlocal function MergeOldPositions()\t-- TODO delete after while\n\tif ShestakUIOptionsGlobal[T.realm][T.name] then\n\t\tif not ShestakUIPositionsPerChar then\n\t\t\tShestakUIPositionsPerChar = ShestakUIPositions\n\t\tend\n\t\tif not ShestakUIPositionsPerChar.merged then\n\t\t\tlocal backup = ShestakUIPositions\n\t\t\tShestakUIPositionsPerChar = {}\n\t\t\tShestakUIPositionsPerChar[\"1\"] = backup\n\t\t\tShestakUIPositionsPerChar.merged = true\n\t\t\tShestakUIPositionsPerChar[\"1\"][\"1\"] = nil -- T.CurrentProfile calls early and create empty table so remove this\n\t\tend\n\telse\n\t\tif not ShestakUIPositions.merged then\n\t\t\tlocal backup = ShestakUIPositions\n\t\t\tShestakUIPositions = {}\n\t\t\tShestakUIPositions[\"1\"] = backup\n\t\t\tShestakUIPositions.merged = true\n\t\t\tShestakUIPositions[\"1\"][\"1\"] = nil\n\t\tend\n\tend\nend\n\nlocal SaveDefaultPosition = function(mover)\n\tlocal ap, p, rp, x, y = mover.frame:GetPoint()\n\tlocal positionTable = T.CurrentProfile()\n\tpositionTable.Default = positionTable.Default or {}\n\tif not positionTable.Default[mover.frame:GetName()] then\n\t\tif not p then\n\t\t\tp = UIParent\n\t\tend\n\t\tpositionTable.Default[mover.frame:GetName()] = {ap, p:GetName(), rp, x, y}\n\tend\nend\n\nlocal SetPosition = function(mover)\n\tlocal x, y, ap = T.CalculateMoverPoints(mover)\n\tmover.frame:ClearAllPoints()\n\tmover.frame:SetPoint(ap, \"UIParent\", ap, x, y)\n\tlocal positionTable = T.CurrentProfile()\n\tpositionTable[mover.frame:GetName()] = {ap, \"UIParent\", ap, x, y}\nend\n\n-- Controls\nlocal controls = CreateFrame(\"frame\", nil, UIParent)\ncontrols:SetPoint(\"CENTER\", UIParent)\ncontrols:SetSize(65, 25)\ncontrols:SetFrameStrata(\"TOOLTIP\")\ncontrols:SetFrameLevel(200)\ncontrols:SetClampedToScreen(true)\ncontrols:Hide()\ncontrols:SetScript(\"OnLeave\", function(self)\n\tif MouseIsOver(self) then return end\n\tif not self._frame then\n\t\tself:Hide()\n\telseif not MouseIsOver(self._frame) then\n\t\tself:Hide()\n\tend\n\tcontrols.x:SetText(\"\")\n\tcontrols.y:SetText(\"\")\nend)\n\nlocal function CreateArrow(moveX, moveY, callback)\n\tmoveX = moveX or 0\n\tmoveY = moveY or 0\n\n\tlocal button = CreateFrame(\"button\", nil, controls)\n\tbutton:SetSize(14, 14)\n\tbutton.controls = controls\n\n\tbutton.tex = button:CreateTexture(nil, \"OVERLAY\")\n\tbutton.tex:SetTexture(\"Interface\\\\OPTIONSFRAME\\\\VoiceChat-Play\")\n\n\tbutton.tex:SetPoint(\"CENTER\")\n\tbutton.tex:SetSize(12, 12)\n\tbutton.tex:SetVertexColor(0.6, 0.6, 0.6)\n\n\tbutton:SetScript(\"OnEnter\", function(self)\n\t\tself.tex:SetVertexColor(1, 1, 1)\n\tend)\n\tbutton:SetScript(\"OnLeave\", function(self)\n\t\tself.tex:SetVertexColor(0.6, 0.6, 0.6)\n\tend)\n\n\tcallback = callback or function(self)\n\t\tlocal frame = self.controls._frame\n\t\tif not frame then return end\n\t\tlocal point, relativeTo, relativePoint, xOfs, yOfs = frame.frame:GetPoint()\n\t\tSaveDefaultPosition(frame)\n\t\tif IsControlKeyDown() then\n\t\t\tframe.frame:SetPoint(point, relativeTo, relativePoint, xOfs + (moveX * 20), yOfs + (moveY * 20))\n\t\telseif IsShiftKeyDown() then\n\t\t\tframe.frame:SetPoint(point, relativeTo, relativePoint, xOfs + (moveX * 5), yOfs + (moveY * 5))\n\t\telse\n\t\t\tframe.frame:SetPoint(point, relativeTo, relativePoint, xOfs + (moveX * 1), yOfs + (moveY * 1))\n\t\tend\n\t\tlocal point, relativeTo, relativePoint, xOfs, yOfs = frame.frame:GetPoint()\n\t\tif not relativeTo then\n\t\t\trelativeTo = UIParent\n\t\tend\n\t\tlocal positionTable = T.CurrentProfile()\n\t\tpositionTable[frame.frame:GetName()] = {point, relativeTo:GetName(), relativePoint, xOfs, yOfs}\n\t\tframe:SetAllPoints(frame.frame)\n\t\tcontrols.x:SetText(T.Round(xOfs))\n\t\tcontrols.y:SetText(T.Round(yOfs))\n\tend\n\n\tbutton:SetScript(\"OnClick\", callback)\n\n\tif controls.last then\n\t\tbutton:SetPoint(\"LEFT\", controls.last, \"RIGHT\", 2, 0)\n\telse\n\t\tbutton:SetPoint(\"LEFT\", controls, \"LEFT\", 2, 0)\n\tend\n\n\tcontrols.last = button\n\n\treturn button\nend\n\ncontrols.left = CreateArrow(-1, 0)\ncontrols.left.tex:SetRotation(3.14159)\n\ncontrols.up = CreateArrow(0, 1)\ncontrols.up.tex:SetRotation(1.5708)\n\ncontrols.down = CreateArrow(0, -1)\ncontrols.down.tex:SetRotation(-1.5708)\n\ncontrols.right = CreateArrow(1, 0)\ncontrols.right.tex:SetRotation(0)\n\ncontrols.x = controls:CreateFontString(nil, \"OVERLAY\")\ncontrols.x:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\ncontrols.x:SetPoint(\"RIGHT\", controls, \"LEFT\", -10, 0)\n\ncontrols.y = controls:CreateFontString(nil, \"OVERLAY\")\ncontrols.y:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\ncontrols.y:SetPoint(\"LEFT\", controls, \"RIGHT\", 10, 0)\n\ncontrols.shadow = controls:CreateTexture(nil, \"OVERLAY\")\ncontrols.shadow:SetPoint(\"TOPLEFT\", controls.x, \"TOPLEFT\", -5, 5)\ncontrols.shadow:SetPoint(\"BOTTOMRIGHT\", controls.y, \"BOTTOMRIGHT\", 2, -5)\ncontrols.shadow:SetTexture(C.media.texture)\ncontrols.shadow:SetVertexColor(0.2, 0.2, 0.2, 0.8)\n\nlocal function GetQuadrant(frame)\n\tlocal _, y = frame:GetCenter()\n\tlocal vhalf = (y > UIParent:GetHeight() / 2) and \"TOP\" or \"BOTTOM\"\n\treturn vhalf\nend\n\nlocal function ShowControls(frame)\n\tlocal y = GetQuadrant(frame)\n\tcontrols._frame = frame\n\tcontrols:Show()\n\tcontrols:ClearAllPoints()\n\tif y == \"TOP\" then\n\t\tcontrols:SetPoint(\"TOP\", frame, \"BOTTOM\", 0, 0)\n\telse\n\t\tcontrols:SetPoint(\"BOTTOM\", frame, \"TOP\", 0, 0)\n\tend\n\tlocal _, _, _, xOfs, yOfs = frame.frame:GetPoint()\n\tcontrols.x:SetText(T.Round(xOfs))\n\tcontrols.y:SetText(T.Round(yOfs))\nend\n\nlocal function UpdateCoords(self)\n\tlocal mover = self.child\n\tlocal x, y, ap = T.CalculateMoverPoints(mover)\n\n\tmover.frame:ClearAllPoints()\n\tmover.frame:SetPoint(ap, \"UIParent\", ap, x, y)\n\tcontrols.x:SetText(T.Round(x))\n\tcontrols.y:SetText(T.Round(y))\nend\n\nlocal coordFrame = CreateFrame(\"Frame\")\ncoordFrame:SetScript(\"OnUpdate\", UpdateCoords)\ncoordFrame:Hide()\n\nlocal OnDragStart = function(self)\n\tSaveDefaultPosition(self)\n\tself:StartMoving()\n\n\tcoordFrame.child = self\n\tcoordFrame:Show()\nend\n\nlocal OnDragStop = function(self)\n\tself:StopMovingOrSizing()\n\tSetPosition(self)\n\n\tcoordFrame.child = nil\n\tcoordFrame:Hide()\nend\n\nlocal RestoreDefaults = function(self, button)\n\tif button == \"RightButton\" then\n\t\tlocal positionTable = T.CurrentProfile()\n\t\tlocal data = positionTable.Default and positionTable.Default[self.frame:GetName()]\n\t\tif data then\n\t\t\tself.frame:ClearAllPoints()\n\t\t\tself.frame:SetPoint(unpack(data))\n\t\t\tself:ClearAllPoints()\n\t\t\tself:SetAllPoints(self.frame)\n\t\t\tpositionTable.Default[self.frame:GetName()] = nil\n\t\t\tpositionTable[self.frame:GetName()] = nil\n\t\tend\n\telseif button == \"MiddleButton\" then\n\t\tself:Hide()\n\tend\nend\n\nlocal UpdatePosition = function(moveX, moveY)\n\tmoveX = moveX or 0\n\tmoveY = moveY or 0\n\tlocal frame = controls._frame\n\tif not frame then return end\n\tlocal point, relativeTo, relativePoint, xOfs, yOfs = frame.frame:GetPoint()\n\tSaveDefaultPosition(frame)\n\tframe.frame:SetPoint(point, relativeTo, relativePoint, xOfs + (moveX * 1), yOfs + (moveY * 1))\n\tlocal point, relativeTo, relativePoint, xOfs, yOfs = frame.frame:GetPoint()\n\tif not relativeTo then\n\t\trelativeTo = UIParent\n\tend\n\tlocal positionTable = T.CurrentProfile()\n\tpositionTable[frame.frame:GetName()] = {point, relativeTo:GetName(), relativePoint, xOfs, yOfs}\n\tframe:SetAllPoints(frame.frame)\n\tcontrols.x:SetText(T.Round(xOfs))\n\tcontrols.y:SetText(T.Round(yOfs))\nend\n\nlocal OnMouseWheel = function(self, offset)\n\tif IsShiftKeyDown() then\n\t\tUpdatePosition(0, offset)\n\telseif IsControlKeyDown() then\n\t\tUpdatePosition(offset, 0)\n\tend\nend\n\nlocal chatInfo = CreateFrame(\"Frame\", nil, UIParent)\nchatInfo:SetFrameStrata(\"TOOLTIP\")\nchatInfo:SetPoint(\"TOPLEFT\", ChatFrame1, \"TOPLEFT\", -3, 1)\nchatInfo:SetSize(C.chat.width + 7, C.chat.height + 4)\nchatInfo:SetTemplate(\"Overlay\")\nchatInfo:Hide()\n\nlocal title = chatInfo:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\ntitle:SetPoint(\"TOP\", chatInfo, \"TOP\", 0, -10)\ntitle:SetTextColor(0.40, 0.78, 1)\n\nlocal subTitle1 = chatInfo:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\nsubTitle1:SetPoint(\"TOP\", title, \"TOP\", 0, -20)\nsubTitle1:SetText(L_MOVE_RIGHT_CLICK)\nsubTitle1:SetTextColor(0.75, 0.9, 1)\n\nlocal subTitle2 = chatInfo:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\nsubTitle2:SetPoint(\"TOP\", subTitle1, \"TOP\", 0, -20)\nsubTitle2:SetText(L_MOVE_MIDDLE_CLICK)\nsubTitle2:SetTextColor(0.75, 0.9, 1)\n\nlocal ResetButton = CreateFrame(\"Button\", nil, chatInfo, \"UIPanelButtonTemplate\")\nResetButton:SetSize(100, 23)\nResetButton:SetText(DEFAULT)\nResetButton:SetPoint(\"BOTTOMLEFT\", chatInfo, \"BOTTOMLEFT\", 10, 7)\nResetButton:SetScript(\"OnClick\", function()\n\tStaticPopup_Show(\"MOVEUI_RESET\")\nend)\nResetButton:SkinButton()\n\nlocal CloseButton = CreateFrame(\"Button\", nil, chatInfo, \"UIPanelButtonTemplate\")\nCloseButton:SetPoint(\"TOPRIGHT\", chatInfo, \"BOTTOMRIGHT\", -10, 30)\nCloseButton:SetSize(100, 23)\nCloseButton:SetText(CLOSE)\nCloseButton:SetScript(\"OnClick\", function()\n\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION)\n\tSlashCmdList.MOVING()\nend)\nCloseButton:SkinButton()\n\nlocal index = 200\nlocal CreateMover = function(frame, unit)\n\tlocal mover = CreateFrame(\"Frame\", nil, UIParent)\n\tif unit then\n\t\tmover:CreateBackdrop(\"Transparent\")\n\t\tmover.backdrop:SetBackdropBorderColor(0, 0.6, 0.6)\n\telse\n\t\tmover:SetTemplate(\"Transparent\")\n\t\tmover:SetBackdropBorderColor(0, 0.6, 0.6)\n\tend\n\tmover.backdrop = mover.backdrop or mover\n\tmover:SetAllPoints(frame)\n\tmover:SetFrameStrata(\"TOOLTIP\")\n\tmover:SetFrameLevel(index)\n\tmover:EnableMouse(true)\n\tmover:SetMovable(true)\n\tmover:SetClampedToScreen(true)\n\tmover:RegisterForDrag(\"LeftButton\")\n\tmover:SetScript(\"OnDragStart\", OnDragStart)\n\tmover:SetScript(\"OnDragStop\", OnDragStop)\n\tmover:SetScript(\"OnEnter\", function(self)\n\t\tself.backdrop:SetBackdropColor(0.4, 0.4, 0.4, C.media.backdrop_alpha)\n\t\tself.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\tShowControls(self)\n\t\ttitle:SetText(mover.name:GetText())\n\tend)\n\tmover:SetScript(\"OnLeave\", function(self)\n\t\tself.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha)\n\t\tself.backdrop:SetBackdropBorderColor(0, 0.6, 0.6)\n\t\tif not MouseIsOver(controls) then controls:Hide() end\n\tend)\n\tmover:SetScript(\"OnMouseUp\", RestoreDefaults)\n\tmover:SetScript(\"OnMouseWheel\", OnMouseWheel)\n\tmover.frame = frame\n\n\tmover.name = mover:CreateFontString(nil, \"OVERLAY\")\n\tmover.name:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tmover.name:SetPoint(\"CENTER\")\n\tmover.name:SetTextColor(1, 1, 1)\n\tlocal text = frame:GetName()\n\ttext = text:gsub(\"_Anchor\", \"\")\n\ttext = text:gsub(\"Anchor\", \"\")\n\ttext = text:gsub(\"oUF_\", \"\")\n\tmover.name:SetText(text)\n\tmover.name:SetWidth(frame:GetWidth() - 4)\n\tmovers[frame:GetName()] = mover\n\tindex = index - 2\nend\n\nlocal GetMover = function(frame, unit)\n\tif movers[frame:GetName()] then\n\t\treturn movers[frame:GetName()]\n\telse\n\t\treturn CreateMover(frame, unit)\n\tend\nend\n\nlocal InitMove = function(msg)\n\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\tif msg and (msg == \"reset\" or msg == \"куыуе\") then\n\t\tT.CurrentProfile(true)\n\t\tfor _, v in pairs(placed) do\n\t\t\tif _G[v] then\n\t\t\t\t_G[v]:SetUserPlaced(false)\n\t\t\tend\n\t\tend\n\t\tReloadUI()\n\t\treturn\n\tend\n\tif not moving then\n\t\tfor _, v in pairs(T.MoverFrames) do\n\t\t\tlocal mover = GetMover(v)\n\t\t\tif mover then mover:Show() end\n\t\tend\n\t\tfor _, v in pairs(unitFrames) do\n\t\t\tlocal mover = GetMover(v, true)\n\t\t\tif mover then mover:Show() end\n\t\tend\n\t\tmoving = true\n\t\tSlashCmdList.GRIDONSCREEN()\n\t\tchatInfo:Show()\n\telse\n\t\tfor _, v in pairs(movers) do\n\t\t\tv:Hide()\n\t\tend\n\t\tmoving = false\n\t\tSlashCmdList.GRIDONSCREEN(\"hide\")\n\t\tcontrols:Hide()\n\t\tchatInfo:Hide()\n\tend\nend\n\nlocal RestoreUI = function(self)\n\tif InCombatLockdown() then\n\t\tif not self.shedule then self.shedule = CreateFrame(\"Frame\", nil, self) end\n\t\tself.shedule:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\tself.shedule:SetScript(\"OnEvent\", function(self)\n\t\t\tRestoreUI(self:GetParent())\n\t\t\tself:UnregisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\t\tself:SetScript(\"OnEvent\", nil)\n\t\tend)\n\t\treturn\n\tend\n\tMergeOldPositions()\t-- TODO delete after while\n\tlocal positionTable = T.CurrentProfile()\n\tif positionTable then\n\t\tfor frame_name, point in pairs(positionTable) do\n\t\t\tif _G[frame_name] then\n\t\t\t\t_G[frame_name]:ClearAllPoints()\n\t\t\t\t_G[frame_name]:SetPoint(unpack(point))\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function(self, event)\n\tself:UnregisterEvent(event)\n\tRestoreUI(self)\n\t-- C_EditMode.SetActiveLayout(1) -- BETA Remove after while\nend)\n\nSlashCmdList.MOVING = InitMove\nSLASH_MOVING1 = \"/moveui\"\nSLASH_MOVING2 = \"/ьщмугш\"\nSLASH_MOVING3 = \"/ui\"\nSLASH_MOVING4 = \"/гш\"\n\nStaticPopupDialogs.RESET_UF = {\n\ttext = L_POPUP_RESETUI,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function() if InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") else\n\t\tlocal positionTable = T.CurrentProfile()\n\t\tfor _, frame in pairs(unitFrames) do\n\t\t\tif frame:GetName() then\n\t\t\t\tpositionTable[frame:GetName()] = nil\n\t\t\tend\n\t\tend\n\t\tReloadUI()\n\t\tend\n\tend,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\nSlashCmdList.RESETUF = function() StaticPopup_Show(\"RESET_UF\") end\nSLASH_RESETUF1 = \"/resetuf\"\n\nStaticPopupDialogs.MOVEUI_RESET = {\n\ttext = L_POPUP_RESETUI,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function() if InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") else\n\t\tT.CurrentProfile(true)\n\t\tfor _, v in pairs(placed) do\n\t\t\tif _G[v] then\n\t\t\t\t_G[v]:SetUserPlaced(false)\n\t\t\tend\n\t\tend\n\t\tReloadUI()\n\t\tend\n\tend,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\n-- Replace EditMode with our moving system\nGameMenuButtonEditMode:SetScript(\"OnClick\", function()\n\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION)\n\tSlashCmdList.MOVING()\n\tHideUIPanel(GameMenuFrame)\nend)"
  },
  {
    "path": "ShestakUI/Core/Panels.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tBottom bars anchor\n----------------------------------------------------------------------------------------\nlocal BottomBarAnchor = CreateFrame(\"Frame\", \"ActionBarAnchor\", T_PetBattleFrameHider)\nBottomBarAnchor:CreatePanel(\"Invisible\", 1, 1, unpack(C.position.bottom_bars))\nBottomBarAnchor:SetWidth((C.actionbar.button_size * 12) + (C.actionbar.button_space * 11))\nif C.actionbar.bottombars == 2 then\n\tBottomBarAnchor:SetHeight((C.actionbar.button_size * 2) + C.actionbar.button_space)\nelseif C.actionbar.bottombars == 3 then\n\tif C.actionbar.split_bars == true then\n\t\tBottomBarAnchor:SetHeight((C.actionbar.button_size * 2) + C.actionbar.button_space)\n\telse\n\t\tBottomBarAnchor:SetHeight((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2))\n\tend\nelse\n\tBottomBarAnchor:SetHeight(C.actionbar.button_size)\nend\nBottomBarAnchor:SetFrameStrata(\"LOW\")\n\n----------------------------------------------------------------------------------------\n--\tRight bars anchor\n----------------------------------------------------------------------------------------\nlocal RightBarAnchor = CreateFrame(\"Frame\", \"RightActionBarAnchor\", T_PetBattleFrameHider)\nRightBarAnchor:CreatePanel(\"Invisible\", 1, 1, unpack(C.position.right_bars))\nRightBarAnchor:SetHeight((C.actionbar.button_size * 12) + (C.actionbar.button_space * 11))\nif C.actionbar.rightbars == 1 then\n\tRightBarAnchor:SetWidth(C.actionbar.button_size)\nelseif C.actionbar.rightbars == 2 then\n\tRightBarAnchor:SetWidth((C.actionbar.button_size * 2) + C.actionbar.button_space)\nelseif C.actionbar.rightbars == 3 then\n\tRightBarAnchor:SetWidth((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2))\nelse\n\tRightBarAnchor:Hide()\nend\nRightBarAnchor:SetFrameStrata(\"LOW\")\n\n----------------------------------------------------------------------------------------\n--\tSplit bar anchor\n----------------------------------------------------------------------------------------\nif C.actionbar.split_bars == true then\n\tlocal SplitBarLeft = CreateFrame(\"Frame\", \"SplitBarLeft\", T_PetBattleFrameHider)\n\tSplitBarLeft:CreatePanel(\"Invisible\", (C.actionbar.button_size * 3) + (C.actionbar.button_space * 3), (C.actionbar.button_size * 2) + C.actionbar.button_space, \"BOTTOMRIGHT\", ActionBarAnchor, \"BOTTOMLEFT\", 0, 0)\n\tSplitBarLeft:SetFrameStrata(\"LOW\")\n\n\tlocal SplitBarRight = CreateFrame(\"Frame\", \"SplitBarRight\", T_PetBattleFrameHider)\n\tSplitBarRight:CreatePanel(\"Invisible\", (C.actionbar.button_size * 3) + (C.actionbar.button_space * 3), (C.actionbar.button_size * 2) + C.actionbar.button_space, \"BOTTOMLEFT\", ActionBarAnchor, \"BOTTOMRIGHT\", 0, 0)\n\tSplitBarRight:SetFrameStrata(\"LOW\")\nend\n\n----------------------------------------------------------------------------------------\n--\tPet bar anchor\n----------------------------------------------------------------------------------------\nlocal PetBarAnchor = CreateFrame(\"Frame\", \"PetActionBarAnchor\", T_PetBattleFrameHider)\nif C.actionbar.petbar_horizontal == true then\n\tPetBarAnchor:CreatePanel(\"Invisible\", (C.actionbar.button_size * 10) + (C.actionbar.button_space * 9), C.actionbar.button_size, unpack(C.position.pet_horizontal))\nelseif C.actionbar.rightbars > 0 then\n\tPetBarAnchor:CreatePanel(\"Invisible\", C.actionbar.button_size + C.actionbar.button_space, (C.actionbar.button_size * 10) + (C.actionbar.button_space * 9), \"RIGHT\", RightBarAnchor, \"LEFT\", 0, 0)\nelse\n\tPetBarAnchor:CreatePanel(\"Invisible\", (C.actionbar.button_size + C.actionbar.button_space), (C.actionbar.button_size * 10) + (C.actionbar.button_space * 9), unpack(C.position.right_bars))\nend\nPetBarAnchor:SetFrameStrata(\"LOW\")\nRegisterStateDriver(PetBarAnchor, \"visibility\", \"[pet,novehicleui,nopossessbar,nopetbattle] show; hide\")\n\n----------------------------------------------------------------------------------------\n--\tStance bar anchor\n----------------------------------------------------------------------------------------\nlocal StanceAnchor = CreateFrame(\"Frame\", \"StanceBarAnchor\", T_PetBattleFrameHider)\nStanceAnchor:SetFrameStrata(\"LOW\")\nif C.actionbar.stancebar_horizontal == true then\n\tif C.actionbar.petbar_horizontal == true then\n\t\tStanceAnchor:SetPoint(C.position.stance_bar[1], C.position.stance_bar[2], C.position.stance_bar[3], C.position.stance_bar[4], C.position.stance_bar[5] - (C.actionbar.button_size + C.actionbar.button_space))\n\telse\n\t\tStanceAnchor:SetPoint(unpack(C.position.stance_bar))\n\tend\n\tStanceAnchor:SetWidth((C.actionbar.button_size * 7) + (C.actionbar.button_space * 6))\n\tStanceAnchor:SetHeight(C.actionbar.button_size)\nelse\n\tif C.actionbar.petbar_horizontal == true then\n\t\tStanceAnchor:SetPoint(\"RIGHT\", \"RightActionBarAnchor\", \"LEFT\", 0, (C.actionbar.button_size / 2) + 2)\n\telse\n\t\tStanceAnchor:SetPoint(\"RIGHT\", PetActionBarAnchor:IsShown() and \"PetActionBarAnchor\" or \"RightActionBarAnchor\", \"LEFT\", 0, (C.actionbar.button_size / 2) + 2)\n\t\tPetBarAnchor:HookScript(\"OnShow\", function() if InCombatLockdown() then return end StanceAnchor:SetPoint(\"RIGHT\", \"PetActionBarAnchor\", \"LEFT\", 0, (C.actionbar.button_size / 2) + 2) end)\n\t\tPetBarAnchor:HookScript(\"OnHide\", function() if InCombatLockdown() then return end StanceAnchor:SetPoint(\"RIGHT\", \"RightActionBarAnchor\", \"LEFT\", 0, (C.actionbar.button_size / 2) + 2) end)\n\tend\n\tStanceAnchor:SetWidth(C.actionbar.button_size + C.actionbar.button_space)\n\tStanceAnchor:SetHeight((C.actionbar.button_size * 7) + (C.actionbar.button_space * 6))\nend\n\nStanceAnchor:RegisterEvent(\"PLAYER_LOGIN\")\nStanceAnchor:RegisterUnitEvent(\"PLAYER_SPECIALIZATION_CHANGED\", \"player\")\nStanceAnchor:SetScript(\"OnEvent\", function()\n\tlocal forms = GetNumShapeshiftForms()\n\tif forms > 0 then\n\t\tif C.actionbar.stancebar_horizontal == true then\n\t\t\tStanceAnchor:SetWidth((C.actionbar.button_size * forms) + (C.actionbar.button_space * (forms - 1)))\n\t\telse\n\t\t\tStanceAnchor:SetHeight((C.actionbar.button_size * forms) + (C.actionbar.button_space * (forms - 1)))\n\t\tend\n\tend\n\tif not StanceAnchor.hook then\n\t\tRegisterStateDriver(StanceAnchor, \"visibility\", GetNumShapeshiftForms() == 0 and \"hide\" or \"show\")\n\t\tStanceAnchor.hook = true\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tBottom line\n----------------------------------------------------------------------------------------\nif C.stats.bottom_line then\n\tlocal bottompanel = CreateFrame(\"Frame\", \"BottomPanel\", UIParent)\n\tbottompanel:CreatePanel(\"ClassColor\", 1, 1, \"BOTTOM\", UIParent, \"BOTTOM\", 0, 20)\n\tbottompanel:SetPoint(\"LEFT\", UIParent, \"LEFT\", 21, 0)\n\tbottompanel:SetPoint(\"RIGHT\", UIParent, \"RIGHT\", -21, 0)\nend\n\n----------------------------------------------------------------------------------------\n--\tChat background\n----------------------------------------------------------------------------------------\nif C.chat.background == true then\n\tlocal chatbd = CreateFrame(\"Frame\", \"ChatBackground\", UIParent)\n\tchatbd:CreatePanel(\"Transparent\", C.chat.width + 7, C.chat.height + 4, \"TOPLEFT\", ChatFrame1, \"TOPLEFT\", -3, 1)\n\tchatbd:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\tchatbd:SetBackdropColor(0, 0, 0, C.chat.background_alpha)\n\n\tif C.chat.tabs_mouseover ~= true then\n\t\tlocal chattabs = CreateFrame(\"Frame\", \"ChatTabsPanel\", UIParent)\n\t\tchattabs:CreatePanel(\"Transparent\", chatbd:GetWidth(), 20, \"BOTTOM\", chatbd, \"TOP\", 0, 3)\n\t\tchattabs:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\tchattabs:SetBackdropColor(0, 0, 0, C.chat.background_alpha)\n\tend\nelseif C.stats.bottom_line then\n\tlocal leftpanel = CreateFrame(\"Frame\", \"LeftPanel\", UIParent)\n\tleftpanel:CreatePanel(\"ClassColor\", 1, C.chat.height - 2, \"BOTTOMLEFT\", BottomPanel, \"LEFT\", 0, 0)\nend\n\n----------------------------------------------------------------------------------------\n--\tTop panel\n----------------------------------------------------------------------------------------\nif C.toppanel.enable ~= true then return end\n\nC.toppanel.height = C.toppanel.height + ((C.font.stats_font_size - 8) * 7)\nC.toppanel.width = C.toppanel.width + ((C.font.stats_font_size - 8) * 3)\n\nlocal toppanelanchor = CreateFrame(\"Frame\", \"TopPanelAnchor\", T_PetBattleFrameHider)\ntoppanelanchor:SetPoint(unpack(C.position.top_panel))\ntoppanelanchor:SetSize(C.toppanel.width, C.toppanel.height / 2)\n\nlocal toppanel = CreateFrame(\"Frame\", \"TopPanel\", T_PetBattleFrameHider)\ntoppanel:SetPoint(\"CENTER\", toppanelanchor, \"CENTER\", 0, 0)\ntoppanel:SetSize(C.toppanel.width, C.toppanel.height / 2)\nif C.toppanel.mouseover == true then\n\ttoppanel:SetAlpha(0)\n\ttoppanel:SetScript(\"OnEnter\", function()\n\t\tif InCombatLockdown() then return end\n\t\ttoppanel:SetAlpha(1)\n\tend)\n\ttoppanel:SetScript(\"OnLeave\", function()\n\t\ttoppanel:SetAlpha(0)\n\tend)\nend\n\nlocal r, g, b = unpack(C.media.classborder_color)\ntoppanel.bgl = toppanel:CreateTexture(nil, \"BORDER\")\ntoppanel.bgl:SetPoint(\"RIGHT\", toppanel, \"CENTER\", 0, 0)\ntoppanel.bgl:SetSize(C.toppanel.width / 2, C.toppanel.height / 2)\ntoppanel.bgl:SetTexture(C.media.blank)\ntoppanel.bgl:SetGradient(\"HORIZONTAL\", CreateColor(r, g, b, 0), CreateColor(r, g, b, 0.1))\n\ntoppanel.bgr = toppanel:CreateTexture(nil, \"BORDER\")\ntoppanel.bgr:SetPoint(\"LEFT\", toppanel, \"CENTER\", 0, 0)\ntoppanel.bgr:SetSize(C.toppanel.width / 2, C.toppanel.height / 2)\ntoppanel.bgr:SetTexture(C.media.blank)\ntoppanel.bgr:SetGradient(\"HORIZONTAL\", CreateColor(r, g, b, 0.1), CreateColor(r, g, b, 0))\n\ntoppanel.tbl = toppanel:CreateTexture(nil, \"ARTWORK\")\ntoppanel.tbl:SetPoint(\"RIGHT\", toppanel, \"TOP\", 0, 0)\ntoppanel.tbl:SetSize(C.toppanel.width / 2, 3)\ntoppanel.tbl:SetTexture(C.media.blank)\ntoppanel.tbl:SetGradient(\"HORIZONTAL\", CreateColor(0, 0, 0, 0), CreateColor(0, 0, 0, 1))\n\ntoppanel.tcl = toppanel:CreateTexture(nil, \"OVERLAY\")\ntoppanel.tcl:SetPoint(\"RIGHT\", toppanel, \"TOP\", 0, 0)\ntoppanel.tcl:SetSize(C.toppanel.width / 2, 1)\ntoppanel.tcl:SetTexture(C.media.blank)\ntoppanel.tcl:SetGradient(\"HORIZONTAL\", CreateColor(r, g, b, 0), CreateColor(r, g, b, 1))\n\ntoppanel.tbr = toppanel:CreateTexture(nil, \"ARTWORK\")\ntoppanel.tbr:SetPoint(\"LEFT\", toppanel, \"TOP\", 0, 0)\ntoppanel.tbr:SetSize(C.toppanel.width / 2, 3)\ntoppanel.tbr:SetTexture(C.media.blank)\ntoppanel.tbr:SetGradient(\"HORIZONTAL\", CreateColor(0, 0, 0, 1), CreateColor(0, 0, 0, 0))\n\ntoppanel.tcr = toppanel:CreateTexture(nil, \"OVERLAY\")\ntoppanel.tcr:SetPoint(\"LEFT\", toppanel, \"TOP\", 0, 0)\ntoppanel.tcr:SetSize(C.toppanel.width / 2, 1)\ntoppanel.tcr:SetTexture(C.media.blank)\ntoppanel.tcr:SetGradient(\"HORIZONTAL\", CreateColor(r, g, b, 1), CreateColor(r, g, b, 0))\n\ntoppanel.bbl = toppanel:CreateTexture(nil, \"ARTWORK\")\ntoppanel.bbl:SetPoint(\"RIGHT\", toppanel, \"BOTTOM\", 0, 0)\ntoppanel.bbl:SetSize(C.toppanel.width / 2, 3)\ntoppanel.bbl:SetTexture(C.media.blank)\ntoppanel.bbl:SetGradient(\"HORIZONTAL\", CreateColor(0, 0, 0, 0), CreateColor(0, 0, 0, 1))\n\ntoppanel.bcl = toppanel:CreateTexture(nil, \"OVERLAY\")\ntoppanel.bcl:SetPoint(\"RIGHT\", toppanel, \"BOTTOM\", 0, 0)\ntoppanel.bcl:SetSize(C.toppanel.width / 2, 1)\ntoppanel.bcl:SetTexture(C.media.blank)\ntoppanel.bcl:SetGradient(\"HORIZONTAL\", CreateColor(r, g, b, 0), CreateColor(r, g, b, 1))\n\ntoppanel.bbr = toppanel:CreateTexture(nil, \"ARTWORK\")\ntoppanel.bbr:SetPoint(\"LEFT\", toppanel, \"BOTTOM\", 0, 0)\ntoppanel.bbr:SetSize(C.toppanel.width / 2, 3)\ntoppanel.bbr:SetTexture(C.media.blank)\ntoppanel.bbr:SetGradient(\"HORIZONTAL\", CreateColor(0, 0, 0, 1), CreateColor(0, 0, 0, 0))\n\ntoppanel.bcr = toppanel:CreateTexture(nil, \"OVERLAY\")\ntoppanel.bcr:SetPoint(\"LEFT\", toppanel, \"BOTTOM\", 0, 0)\ntoppanel.bcr:SetSize(C.toppanel.width / 2, 1)\ntoppanel.bcr:SetTexture(C.media.blank)\ntoppanel.bcr:SetGradient(\"HORIZONTAL\", CreateColor(r, g, b, 1), CreateColor(r, g, b, 0))\n"
  },
  {
    "path": "ShestakUI/Core/PixelPerfect.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tPixel perfect script of custom ui Scale\n----------------------------------------------------------------------------------------\nif T.screenWidth <= 1440 then\n\tT.low_resolution = true\nelse\n\tT.low_resolution = false\nend\n\nif C.general.auto_scale == true then\n\tC.general.uiscale = min(2, max(0.20, 768 / T.screenHeight))\n\tif T.screenHeight >= 2400 then\n\t\tC.general.uiscale = C.general.uiscale * 3\n\telseif T.screenHeight >= 1600 then\n\t\tC.general.uiscale = C.general.uiscale * 2\n\tend\n\tC.general.uiscale = tonumber(string.sub(C.general.uiscale, 0, 5)) -- 8.1 Fix scale bug\nend\n\nT.mult = 768 / T.screenHeight / C.general.uiscale\nT.noscalemult = T.mult * C.general.uiscale\n\nT.Scale = function(x)\n\treturn T.mult * math.floor(x / T.mult + 0.5)\nend\n\n----------------------------------------------------------------------------------------\n--\tPixel perfect fonts for high resolution\n----------------------------------------------------------------------------------------\nif T.screenHeight <= 1200 then return end\nC.media.pixel_font_size = C.media.pixel_font_size * T.mult\nC.font.chat_tabs_font_size = C.font.chat_tabs_font_size * T.mult\nC.font.action_bars_font_size = C.font.action_bars_font_size * T.mult\nC.font.threat_meter_font_size = C.font.threat_meter_font_size * T.mult\nC.font.raid_cooldowns_font_size = C.font.raid_cooldowns_font_size * T.mult\nC.font.unit_frames_font_size = C.font.unit_frames_font_size * T.mult\nC.font.auras_font_size = C.font.auras_font_size * T.mult\nC.font.filger_font_size = C.font.filger_font_size * T.mult\nC.font.bags_font_size = C.font.bags_font_size * T.mult\nC.font.loot_font_size = C.font.loot_font_size * T.mult\nC.font.combat_text_font_size = C.font.combat_text_font_size * T.mult\nC.font.stats_font_size = C.font.stats_font_size * T.mult\nC.font.stylization_font_size = C.font.stylization_font_size * T.mult\nC.font.cooldown_timers_font_size = C.font.cooldown_timers_font_size * T.mult"
  },
  {
    "path": "ShestakUI/Core/Temp.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tTemporary stuff\n----------------------------------------------------------------------------------------"
  },
  {
    "path": "ShestakUI/Core/WTF.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tMSBT settings\n----------------------------------------------------------------------------------------\nlocal UploadMSBT = function()\n\tif MSBTProfiles_SavedVars then table.wipe(MSBTProfiles_SavedVars) end\n\tif MSBT_SavedMedia then table.wipe(MSBT_SavedMedia) end\n\tMSBTProfiles_SavedVars = {\n\t\t[\"profiles\"] = {\n\t\t\t[\"Default\"] = {\n\t\t\t\t[\"powerThrottleDuration\"] = 5,\n\t\t\t\t[\"normalOutlineIndex\"] = 2,\n\t\t\t\t[\"partialColoringDisabled\"] = true,\n\t\t\t\t[\"alwaysShowQuestItems\"] = false,\n\t\t\t\t[\"hideFullOverheals\"] = true,\n\t\t\t\t[\"normalFontSize\"] = 16,\n\t\t\t\t[\"scrollAreas\"] = {\n\t\t\t\t\t[\"Incoming\"] = {\n\t\t\t\t\t\t[\"scrollHeight\"] = 250,\n\t\t\t\t\t\t[\"offsetX\"] = -215,\n\t\t\t\t\t\t[\"animationStyle\"] = \"Straight\",\n\t\t\t\t\t\t[\"behavior\"] = \"MSBT_NORMAL\",\n\t\t\t\t\t\t[\"offsetY\"] = 151,\n\t\t\t\t\t\t[\"skillIconsDisabled\"] = true,\n\t\t\t\t\t\t[\"direction\"] = \"Up\",\n\t\t\t\t\t},\n\t\t\t\t\t[\"Outgoing\"] = {\n\t\t\t\t\t\t[\"scrollHeight\"] = 250,\n\t\t\t\t\t\t[\"offsetX\"] = 174,\n\t\t\t\t\t\t[\"animationStyle\"] = \"Straight\",\n\t\t\t\t\t\t[\"behavior\"] = \"MSBT_NORMAL\",\n\t\t\t\t\t\t[\"offsetY\"] = 151,\n\t\t\t\t\t\t[\"skillIconsDisabled\"] = true,\n\t\t\t\t\t\t[\"direction\"] = \"Up\",\n\t\t\t\t\t},\n\t\t\t\t\t[\"Notification\"] = {\n\t\t\t\t\t\t[\"offsetX\"] = -176,\n\t\t\t\t\t\t[\"offsetY\"] = 201,\n\t\t\t\t\t},\n\t\t\t\t\t[\"Static\"] = {\n\t\t\t\t\t\t[\"offsetX\"] = -7,\n\t\t\t\t\t\t[\"offsetY\"] = -33,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[\"soundsDisabled\"] = true,\n\t\t\t\t[\"hideMergeTrailer\"] = true,\n\t\t\t\t[\"triggers\"] = {\n\t\t\t\t\t[\"MSBT_TRIGGER_RIPOSTE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_KILL_SHOT\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_DECIMATION\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_BACKLASH\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_OVERPOWER\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_SWORD_AND_BOARD\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_RAMPAGE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_RIME\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_THE_ART_OF_WAR\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_RUNE_STRIKE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_PREDATORS_SWIFTNESS\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_ECLIPSE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_TASTE_FOR_BLOOD\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_LOW_HEALTH\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_LOCK_AND_LOAD\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_TIDAL_WAVES\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_VIPER_STING\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_NIGHTFALL\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_HOT_STREAK\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_LOW_MANA\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_SUDDEN_DEATH\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_IMPACT\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_OWLKIN_FRENZY\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_BRAIN_FREEZE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_ERADICATION\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_LOW_PET_HEALTH\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_KILLING_MACHINE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_PVP_TRINKET\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_MISSILE_BARRAGE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_VICTORY_RUSH\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_BLOODSURGE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_CLEARCASTING\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_MOLTEN_CORE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_FINGERS_OF_FROST\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_COUNTER_ATTACK\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_HAMMER_OF_WRATH\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_REVENGE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_EXECUTE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_FROSTBITE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"MSBT_TRIGGER_MAELSTROM_WEAPON\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[\"regenAbilitiesDisabled\"] = true,\n\t\t\t\t[\"critFontName\"] = \"ShestakUI\",\n\t\t\t\t[\"hotThrottleDuration\"] = 5,\n\t\t\t\t[\"critOutlineIndex\"] = 2,\n\t\t\t\t[\"animationSpeed\"] = 140,\n\t\t\t\t[\"skillIconsDisabled\"] = true,\n\t\t\t\t[\"dotThrottleDuration\"] = 5,\n\t\t\t\t[\"creationVersion\"] = \"5.4.75\",\n\t\t\t\t[\"critFontSize\"] = 16,\n\t\t\t\t[\"hideSkills\"] = true,\n\t\t\t\t[\"events\"] = {\n\t\t\t\t\t[\"NOTIFICATION_COMBAT_ENTER\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_PC_KILLING_BLOW\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = false,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_MONEY\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_REP_GAIN\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_DEBUFF_FADE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_REP_LOSS\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_BUFF\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_LOOT\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_SOUL_SHARD_CREATED\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = false,\n\t\t\t\t\t},\n\t\t\t\t\t[\"OUTGOING_EVADE\"] = {\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_SKILL_GAIN\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"INCOMING_HEAL_CRIT\"] = {\n\t\t\t\t\t\t[\"fontSize\"] = false,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_POWER_LOSS\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"OUTGOING_HEAL_CRIT\"] = {\n\t\t\t\t\t\t[\"fontSize\"] = false,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_DEBUFF_STACK\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_ITEM_BUFF_FADE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_EXPERIENCE_GAIN\"] = {\n\t\t\t\t\t\t[\"fontSize\"] = false,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_BUFF_FADE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_MONSTER_EMOTE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_COMBAT_LEAVE\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_POWER_GAIN\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_CP_FULL\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_ENEMY_BUFF\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_BUFF_STACK\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_EXTRA_ATTACK\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = false,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_COOLDOWN\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t\t[\"fontSize\"] = 16,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_ITEM_BUFF\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_CP_GAIN\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"PET_OUTGOING_EVADE\"] = {\n\t\t\t\t\t\t[\"fontSize\"] = false,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_HONOR_GAIN\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_DEBUFF\"] = {\n\t\t\t\t\t\t[\"disabled\"] = true,\n\t\t\t\t\t},\n\t\t\t\t\t[\"NOTIFICATION_NPC_KILLING_BLOW\"] = {\n\t\t\t\t\t\t[\"fontSize\"] = false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[\"cooldownThreshold\"] = 60,\n\t\t\t\t[\"hideNames\"] = true,\n\t\t\t\t[\"normalFontName\"] = \"ShestakUI\",\n\t\t\t\t[\"healThreshold\"] = 1000,\n\t\t\t\t[\"qualityExclusions\"] = {\n\t\t\t\t\ttrue, -- [1]\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tMSBT_SavedMedia = {\n\t\t[\"fonts\"] = {\n\t\t\t[\"ShestakUI\"] = \"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Fonts\\\\Pixel.ttf\",\n\t\t},\n\t\t[\"sounds\"] = {\n\t\t},\n\t}\nend\n\n----------------------------------------------------------------------------------------\n--\tSkada settings\n----------------------------------------------------------------------------------------\nlocal UploadSkada = function()\n\tif SkadaDB then table.wipe(SkadaDB) end\n\tSkadaDB = {\n\t\t[\"profiles\"] = {\n\t\t\t[\"Default\"] = {\n\t\t\t\t[\"windows\"] = {\n\t\t\t\t\t{\n\t\t\t\t\t\t[\"barslocked\"] = true,\n\t\t\t\t\t\t[\"barwidth\"] = 217,\n\t\t\t\t\t\t[\"barheight\"] = 12,\n\t\t\t\t\t\t[\"barspacing\"] = 7,\n\t\t\t\t\t\t[\"background\"] = {\n\t\t\t\t\t\t\t[\"color\"] = {\n\t\t\t\t\t\t\t\t[\"a\"] = 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[\"height\"] = 132,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[\"point\"] = \"BOTTOMRIGHT\",\n\t\t\t\t\t\t[\"x\"] = -247,\n\t\t\t\t\t\t[\"y\"] = 1,\n\t\t\t\t\t\t[\"title\"] = {\n\t\t\t\t\t\t\t[\"height\"] = 12,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[\"icon\"] = {\n\t\t\t\t\t[\"hide\"] = true,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\nend\n\nStaticPopupDialogs.SETTINGS_ALL = {\n\ttext = L_POPUP_SETTINGS_ALL,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function()\n\t\tif IsAddOnLoaded(\"DBM-Core\") and C.skins.dbm then T.UploadDBM() end\n\t\tif IsAddOnLoaded(\"BigWigs\") and C.skins.bigwigs then T.UploadBW() end\n\t\tif IsAddOnLoaded(\"MikScrollingBattleText\") then UploadMSBT() end\n\t\tif IsAddOnLoaded(\"Skada\") then UploadSkada() end\n\t\tReloadUI()\n\tend,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\nSlashCmdList.SETTINGS = function(msg)\n\tif msg == \"dbm\" then\n\t\tif IsAddOnLoaded(\"DBM-Core\") then\n\t\t\tif C.skins.dbm == true then\n\t\t\t\tStaticPopup_Show(\"SETTINGS_DBM\")\n\t\t\telse\n\t\t\t\tprint(\"|cffffff00\"..L_INFO_SKIN_DISABLED1..\"DBM\"..L_INFO_SKIN_DISABLED2..\"|r\")\n\t\t\tend\n\t\telse\n\t\t\tprint(\"|cffffff00DBM\"..L_INFO_NOT_INSTALLED..\"|r\")\n\t\tend\n\telseif msg == \"bw\" then\n\t\tif IsAddOnLoaded(\"BigWigs\") then\n\t\t\tif C.skins.bigwigs == true then\n\t\t\t\tStaticPopup_Show(\"SETTINGS_BIGWIGS\")\n\t\t\telse\n\t\t\t\tprint(\"|cffffff00\"..L_INFO_SKIN_DISABLED1..\"BigWigs\"..L_INFO_SKIN_DISABLED2..\"|r\")\n\t\t\tend\n\t\telse\n\t\t\tprint(\"|cffffff00BigWigs\"..L_INFO_NOT_INSTALLED..\"|r\")\n\t\tend\n\telseif msg == \"msbt\" then\n\t\tif IsAddOnLoaded(\"MikScrollingBattleText\") then\n\t\t\tUploadMSBT()\n\t\t\tReloadUI()\n\t\telse\n\t\t\tprint(\"|cffffff00MSBT\"..L_INFO_NOT_INSTALLED..\"|r\")\n\t\tend\n\telseif msg == \"skada\" then\n\t\tif IsAddOnLoaded(\"Skada\") then\n\t\t\tUploadSkada()\n\t\t\tReloadUI()\n\t\telse\n\t\t\tprint(\"|cffffff00Skada\"..L_INFO_NOT_INSTALLED..\"|r\")\n\t\tend\n\telseif msg == \"all\" then\n\t\tStaticPopup_Show(\"SETTINGS_ALL\")\n\telse\n\t\tprint(\"|cffffff00\"..L_INFO_SETTINGS_DBM..\"|r\")\n\t\tprint(\"|cffffff00\"..L_INFO_SETTINGS_BIGWIGS..\"|r\")\n\t\tprint(\"|cffffff00\"..L_INFO_SETTINGS_MSBT..\"|r\")\n\t\tprint(\"|cffffff00\"..L_INFO_SETTINGS_SKADA..\"|r\")\n\t\tprint(\"|cffffff00\"..L_INFO_SETTINGS_ALL..\"|r\")\n\tend\nend\nSLASH_SETTINGS1 = \"/settings\""
  },
  {
    "path": "ShestakUI/Libs/LitePanels/Layout.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tLitePanels configuration file\n--\tBACKUP THIS FILE BEFORE UPDATING!\n----------------------------------------------------------------------------------------\nlpanels:CreateLayout(\"Load For All\", {\n\n-- AFK panel\n{\tname = \"AFK\", anchor_to = \"TOP\", y_off = -210,\n\twidth = 180 + (C.font.stats_font_size - 8), height = 75 + ((C.font.stats_font_size - 8) * 5),\n\ttext = {\n\t\t\t{\tstring = L_PANELS_AFK, anchor_to = \"TOP\", y_off = -10,\n\t\t\t\tshadow = 0, outline = 3, font = C.font.stats_font, size = C.font.stats_font_size,\n\t\t\t},\n\t\t\t{\tstring = function()\n\t\t\t\t\tif afk_timer then\n\t\t\t\t\t\tlocal secs = mod(time() - afk_timer, 60)\n\t\t\t\t\t\tlocal mins = floor((time() - afk_timer) / 60)\n\t\t\t\t\treturn format(\"%s:%02.f\", mins, secs)\n\t\t\t\t\tend\n\t\t\t\tend, update = 0.1,\n\t\t\t\tshadow = 0, outline = 3, font = C.font.stats_font, size = C.font.stats_font_size * 2,\n\t\t\t\tanchor_to = \"CENTER\", color = \"1 0.1 0.1\"\n\t\t\t},\n\t\t\t{\tstring = L_PANELS_AFK_RCLICK, anchor_to = \"BOTTOM\", y_off = 13 + (C.font.stats_font_size - 8),\n\t\t\t\tshadow = 0, outline = 3, font = C.font.stats_font, size = C.font.stats_font_size,\n\t\t\t},\n\t\t\t{\tstring = L_PANELS_AFK_LCLICK, anchor_to = \"BOTTOM\", y_off = 3,\n\t\t\t\tshadow = 0, outline = 3, font = C.font.stats_font, size = C.font.stats_font_size,\n\t\t\t}\n\t\t},\n\t\tOnLoad = function(self)\n\t\t\tself:RegisterEvent(\"PLAYER_FLAGS_CHANGED\")\n\t\t\tself:SetTemplate(\"Transparent\")\n\t\t\tself:Hide()\n\t\t\tself:SetWidth(self.text4:GetWidth() + 20)\n\t\tend,\n\t\tOnEvent = function(self)\n\t\t\tif UnitIsAFK(\"player\") and not afk_timer then\n\t\t\t\tself.text2:SetText(\"0:00\")\n\t\t\t\tafk_timer = time()\n\t\t\t\tself:Show()\n\t\t\telseif not UnitIsAFK(\"player\") then\n\t\t\t\tself:Hide()\n\t\t\t\tafk_timer = nil\n\t\t\tend\n\t\tend,\n\t\tOnClick = function(self, b)\n\t\t\tself:Hide()\n\t\t\tif b == \"LeftButton\" then SendChatMessage(\"\", \"AFK\") end\n\t\tend,\n\t\tOnEnter = function(self) self:SetBackdropBorderColor(unpack(C.media.classborder_color)) end,\n\t\tOnLeave = function(self) self:SetBackdropBorderColor(unpack(C.media.border_color)) end\n\t},\n})\n\nlpanels:ApplyLayout(nil, \"Load For All\")"
  },
  {
    "path": "ShestakUI/Libs/LitePanels/LitePanels.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tBased on LitePanels(by Katae)\n----------------------------------------------------------------------------------------\nlocal lp, hidden, deps = CreateFrame(\"Frame\", \"lp_C\"), {}, {} lp:Hide()\n\nlpanels = {\n\tprofile = {}, temp = {},\n\tcinfo = {\n\t\tn = strlower(UnitName(\"player\")),\n\t\tr = strlower(gsub(GetRealmName(), \" \", \"\")),\n\t\tc = strlower(select(2, UnitClass(\"player\")))\n\t},\n\tdefaults = {\n\t\tparent = \"UIParent\", strata = \"BACKGROUND\",\n\t\tanchor_to = \"BOTTOMLEFT\", anchor_from = \"BOTTOMLEFT\",\n\t\tx_off = 0, y_off = 0, height = 0, width = 0,\n\t\ttext = {\n\t\t\tstring = \"\", font = \"Fonts/FRIZQT__.TTF\", size = 12,\n\t\t\tjustify_h = \"CENTER\", justify_v = \"MIDDLE\",\n\t\t\tanchor_to = \"CENTER\", anchor_from = \"CENTER\",\n\t\t\tx_off = 0, y_off = 0, color = \"1 1 1\", alpha = 1,\n\t\t\tshadow = {color = \"0 0 0\", alpha = 1, y = -1, x = 1},\n\t\t}\n\t},\n\tevents = {\"OnEvent\", \"OnUpdate\", \"OnResize\", \"OnClick\", \"OnDoubleClick\", \"OnMouseUp\", \"OnMouseDown\", \"OnEnter\", \"OnLeave\", \"OnHide\", \"OnShow\"},\n\tdefaultv = {\"anchor_to\", \"x_off\", \"y_off\", \"width\", \"height\", \"strata\"},\n}\n\nlocal gsub = string.gsub\nlocal strmatch = string.match\nlocal type = type\nlocal floor = math.floor\nlocal unpack = unpack\nlocal pairs = pairs\nlocal ipairs = ipairs\nlocal IsAddOnLoaded = IsAddOnLoaded\nlocal hooksecurefunc = hooksecurefunc\n\nlocal r, is = function(n, dec) return floor(n * (10 ^ (dec or 0)) + 0.5) end, function(v, t) return type(v) == t end\nlocal d = lpanels.defaults\n\nlocal class = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[strupper(lpanels.cinfo.c)]\nlocal function setcolor(color)\n\tif color == \"CLASS\" then\n\t\treturn class.r, class.g, class.b\n\telseif is(color, \"string\") then\n\t\treturn strmatch(color, \"([%d%.]+)%s+([%d%.]+)%s+([%d%.]+)\")\n\telse return unpack(color) end\nend\n\n----------------------------------------------------------------------------------------\n-- API: lpanels:CreateLayout(\"Layout Name\", { _layout code_ }\n--\t» arg1 - Layout name. Name can be anything at all.\n--\t» arg2 - Table with your layout code, can also be set as a variable.\nfunction lpanels:CreateLayout(name, layout)\n\tif name and layout then\n\t\tself.profile[name] = layout or {}\n\tend\nend\n\n----------------------------------------------------------------------------------------\n-- API: lpanels:ApplyLayout(\"n:Character r:Realm c:Class\", \"layout1\", \"layout2\")\n--\t» arg1 - Profile string: May be set to any combination of n:ame, r:ealm, c:lass,\n--\t\tseparated by a single space. If nil, applies the specified layouts to all\n--\t\tcharacters. Additionally, a dash may be applied to front of the\n--\t\tcondition (-n:ame -r:ealm -c:lass) to make the layout NOT load on the specified\n--\t\tvalue. The profile string is *not* CASE-sensitive.\n--\t» arg2,... - Layout names created by CreateLayout() to apply to this profile. No set\n--\t\tlimit to how many layouts can be applied per profile.\nfunction lpanels:MatchProf(profile, AND)\n\tlocal apply = false\n\tfor a, str in gmatch(profile, \"(%-?[nrc]):([^%s]+)\") do\n\t\tif strmatch(self.cinfo[strlower(strsub(a, -1, -1))], strlower(str)) then\n\t\t\tif strmatch(a, \"^%-\") then return false else apply = true end\n\t\telseif strmatch(a, \"^%-\") then apply = true elseif AND then return false end\n\tend\n\treturn apply\nend\nfunction lpanels:ApplyLayout(profile, ...)\n\tif not profile or profile == \"\" then profile = \"n:\"..self.cinfo.n end\n\twhile strfind(profile, \"%(.-%)\") do\n\t\tfor prof in gmatch(profile, \"%(([^%(]-)%)\") do\n\t\t\tprofile = gsub(profile, \"%(\"..gsub(prof, \"%-\", \"%%%-\")..\"%)\", self:MatchProf(prof, 1) and \"n:\"..self.cinfo.n or \"n:x\")\n\t\tend\n\tend\n\tif self:MatchProf(profile) then\n\t\tfor _, name in ipairs{...} do\n\t\t\tif self.profile[name] then\n\t\t\t\tfor _, f in ipairs(self.profile[name]) do self.profile[#self.profile + 1] = f end\n\t\t\tend\n\t\t\tself.profile[name] = nil\n\t\tend\n\tend\nend\n\n----------------------------------------------------------------------------------------\n-- Core\nfunction lpanels.RegisterEvent(self, event)\n\tif event == \"PLAYER_LOGIN\" then lpanels.temp.OnEvent(self, \"PLAYER_LOGIN\") end\nend\n\nlocal function Resize(panel, width, height)\n\tif width and height and (strmatch(width, \"%d+%%\") or strmatch(height, \"%d+%%\")) then\n\t\t-- Resize based on the panel's anchor frame or parent if no anchor\n\t\tlocal _, parent = panel:GetPoint()\n\t\tlocal function hook(_, _width, _height)\n\t\t\tif strmatch(width, \"%%\") then panel:SetWidth(_width * strmatch(width,\"(%d+)%%\") * 0.01 + (strmatch(width, \"%%%s([%+%-]%d+)\") or 0)) end\n\t\t\tif strmatch(height, \"%%\") then panel:SetHeight(_height * strmatch(height,\"(%d+)%%\") * 0.01 + (strmatch(height, \"%%.*([%+%-]%d+)\") or 0)) end\n\t\tend\n\t\tparent:HookScript(\"OnSizeChanged\", hook)\n\tend\nend\n\nfunction lpanels:MakePanel(f)\n\t-- Setting a few defaults\n\tfor _, attr in ipairs(self.defaultv) do if not f[attr] then f[attr] = d[attr] end end\n\n\t-- Setting parent/anchor\n\tlocal origparent, origanchor\n\tfor _, frame in pairs{f.parent, f.anchor_frame} do\n\t\tif is(frame, \"string\") and not _G[frame] then\n\t\t\tif not hidden[frame] then hidden[frame] = {} end tinsert(hidden[frame], f.name)\n\t\t\tf.parent, origparent, origanchor, f.anchor_frame = \"lp_C\", f.parent, f.anchor_frame\n\t\tend\n\tend\n\tf.parent = _G[f.parent] or _G[d.parent]\n\n\t-- Create frame; object name will be LP_PanelName or LP_i if anonymous\n\tlocal panel = CreateFrame(\"Frame\", f.name, f.parent)\n\tpanel.bg = panel:CreateTexture(nil, \"BACKGROUND\")\n\n\t-- Inserting some data into frame table\n\tif f.parent == lp_C then panel.parent, panel.anchor_frame, panel.strata, panel.level = origparent, origanchor, f.strata, f.level end\n\tpanel.width, panel.height = f.width, f.height\n\n\t-- Hide dependant frames, will show later for late loading addons\n\tif f.require and not IsAddOnLoaded(f.require) then deps[f.name] = f.require panel:Hide() end\n\n\t-- Set positions\n\tpanel:SetParent(f.parent)\n\tpanel:ClearAllPoints()\n\tif strmatch(f.x_off, \"%%\") then f.x_off = (_G[f.anchor_frame] or f.parent):GetWidth() * strmatch(f.x_off,\"(%d+)%%\") * 0.01 end\n\tif strmatch(f.y_off, \"%%\") then f.y_off = (_G[f.anchor_frame] or f.parent):GetHeight() * strmatch(f.y_off,\"(%d+)%%\") * 0.01 end\n\tpanel:SetPoint(strupper(f.anchor_to), _G[f.anchor_frame] or f.parent, strupper(f.anchor_from or f.anchor_to), f.x_off, f.y_off)\n\tif f.scale then panel:SetScale(f.scale) end\n\n\t-- Height, width\n\tif f.parent ~= lp then Resize(panel, f.width, f.height) end\n\tpanel:SetWidth(strmatch(f.width, \"%%\") and (_G[f.anchor_frame] or f.parent):GetWidth() * strmatch(f.width, \"(%d+)%%\") * 0.01 or f.width)\n\tpanel:SetHeight(strmatch(f.height, \"%%\") and (_G[f.anchor_frame] or f.parent):GetHeight() * strmatch(f.height, \"(%d+)%%\") * 0.01 or f.height)\n\n\t-- Strata, level\n\tpanel:SetFrameStrata(f.strata or d.strata)\n\tif f.level then panel:SetFrameLevel(f.level) end\n\n\t-- Texts\n\tif f.text then\n\t\t-- If f.text contains multiple tables, treat those tables as multiple text objects; name them self.text1, text2, text3, ...\n\t\tf.text = is(f.text[1], \"table\") and f.text or {f.text}\n\t\tfor i, t in ipairs(f.text) do\n\t\t\tif #f.text == 1 then i = \"\" end\n\t\t\tif is(t, \"string\") then t = {string = t} end\n\t\t\tpanel[\"text\"..i] = panel:CreateFontString(nil, \"OVERLAY\")\n\t\t\tlocal text = panel[\"text\"..i]\n\n\t\t\t-- Keep text string and frame height/width the same if nil\n\t\t\tif i == \"\" and (not f.width or not f.height or f.width == 0 or f.height == 0) then\n\t\t\t\tlocal function settext()\n\t\t\t\t\tpanel:SetWidth(text:GetStringWidth())\n\t\t\t\t\tpanel:SetHeight(text:GetStringHeight())\n\t\t\t\tend\n\t\t\t\thooksecurefunc(text, \"SetText\", settext)\n\t\t\tend\n\n\t\t\t-- Texts font\n\t\t\tif t.font and not strmatch(t.font, \"[/\\\\]\") then t.font = C.font.stats_font end\n\t\t\tlocal flags = C.font.stats_font_style\n\t\t\tif t.mono then flags = (flags and flags..\", \" or \"\")..\"MONOCHROME\" end\n\t\t\ttext:SetFont(t.font or d.text.font, t.size or d.text.size, flags)\n\t\t\tif not text:GetFont() then -- handle invalid font error\n\t\t\t\ttext:SetFont(d.text.font, t.size or d.text.size, flags)\n\t\t\t\tprint(\"|cffffffffLite|cff66C6FFPanels |cffff5555Font invalid:\", strmatch(t.font, \"([^/\\\\]+)$\"))\n\t\t\tend\n\n\t\t\t-- Texts string\n\t\t\tif not t.string then t.string = d.text.string end\n\t\t\ttext:SetText(tostring(is(t.string, \"function\") and t.string(text) or t.string))\n\n\t\t\t-- Texts color\n\t\t\tlocal tx_r, tx_g, tx_b = setcolor(t.color or d.text.color)\n\t\t\ttext:SetTextColor(tx_r, tx_g, tx_b, t.alpha or d.text.alpha)\n\n\t\t\t-- Texts shadow\n\t\t\tif (not t.shadow and not t.outline) or (t.shadow and t.shadow ~= 0) then\n\t\t\t\tif not t.shadow then t.shadow = d.text.shadow end\n\t\t\t\tif is(t.shadow, \"number\") then t.shadow = {x = t.shadow, y = -t.shadow, alpha = d.text.shadow.alpha} end\n\t\t\t\tif is(t.shadow, \"table\") then\n\t\t\t\t\tlocal sh_r, sh_g, sh_b = setcolor(t.shadow.color or d.text.shadow.color)\n\t\t\t\t\ttext:SetShadowOffset(t.shadow.x or d.text.shadow.x, t.shadow.y or d.text.shadow.y)\n\t\t\t\t\ttext:SetShadowColor(sh_r, sh_g, sh_b, t.shadow.alpha or d.text.shadow.alpha)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- Texts positioning within panel\n\t\t\ttext:SetJustifyH(t.justify_h or d.text.justify_h)\n\t\t\ttext:SetJustifyV(t.justify_v or d.text.justify_v)\n\t\t\ttext:SetPoint(strupper(t.anchor_to or d.text.anchor_to), panel, strupper(t.anchor_to or t.anchor_from or d.text.anchor_from), t.x_off or d.text.x_off, t.y_off or d.text.y_off)\n\n\t\t\t-- If it exists, hook text function to the frame's OnUpdate script\n\t\t\tif is(t.string, \"function\") and t.update ~= 0 then\n\t\t\t\ttext.elapsed = 0\n\t\t\t\tlocal update, string = t.update or 1, t.string\n\t\t\t\tlocal function OnUpdate(_, u)\n\t\t\t\t\ttext.elapsed = text.elapsed + u\n\t\t\t\t\tif text.elapsed > update then text:SetText(string(text)) text.elapsed = 0 end\n\t\t\t\tend\n\t\t\t\tif not f.OnUpdate then f.OnUpdate = OnUpdate else hooksecurefunc(f, \"OnUpdate\", OnUpdate) end\n\t\t\tend\n\t\tend\n\tend\n\n\t-- OnLoad handler\n\tif f.OnLoad then\n\t\tif f.OnEvent then -- fake PLAYER_LOGIN; it should have already fired\n\t\t\thooksecurefunc(panel, \"RegisterEvent\", self.RegisterEvent)\n\t\t\tself.temp.OnEvent = f.OnEvent\n\t\tend\n\t\tf.OnLoad(panel)\n\tend\n\n\t-- Scripting functions, args passed to layout's function\n\tif f.mouse ~= false and (f.mouse or f.OnClick or f.OnMouseDown or f.OnMouseUp or f.OnDoubleClick or f.OnEnter or f.OnLeave) then panel:EnableMouse(true) end\n\tfor _, action in ipairs(lpanels.events) do\n\t\tlocal func = f[action]\n\t\tif is(func, \"function\") then\n\t\t\tif action == \"OnDoubleClick\" then\n\t\t\t\tpanel.timer, panel.button = 0, nil\n\t\t\t\tlocal function hook(self, button)\n\t\t\t\t\tif self.timer and self.timer < time() then self.startTimer = false end\n\t\t\t\t\tif self.timer == time() and self.button == button and self.startTimer then\n\t\t\t\t\t\tself.startTimer = false\n\t\t\t\t\t\tfunc(self, button)\n\t\t\t\t\telse\n\t\t\t\t\t\tself.startTimer, self.timer, self.button = true, time(), button\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tpanel:HookScript(\"OnMouseUp\", hook)\n\t\t\telse\n\t\t\t\tif action == \"OnUpdate\" then panel.elapsed = 0 end\n\t\t\t\tpanel:HookScript(gsub(gsub(action, \"OnClick\", \"OnMouseUp\"), \"Resize\", \"SizeChanged\"), func)\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction lpanels:Init()\n\tif #self.profile == 0 then return end\n\n\t-- Check if parent/anchor names are the names of other panels, then tag with \"LP_\"\n\tfor i, f in ipairs(self.profile) do for _, p in ipairs(self.profile) do\n\t\tif f.name ~= nil then\n\t\t\tif f.name == p.parent then p.parent = \"LP_\"..p.parent end\n\t\t\tif f.name == p.anchor_frame then p.anchor_frame = \"LP_\"..p.anchor_frame end\n\t\tend\n\tend f.name = f.name and \"LP_\"..f.name or \"LP_\"..i end\n\n\t-- Begin to cycle through user profile and create panels\n\tfor _, f in ipairs(self.profile) do self:MakePanel(f) end\nend\n\nfunction lpanels:Exit()\n\tr, is, class, setcolor = nil\n\tfor k in pairs(self) do self[k] = nil end\n\tself.reset = 1 self.reset = nil\nend\n\nfunction lpanels.OnEvent(_, event)\n\tif event == \"PLAYER_LOGIN\" then\n\t\tlpanels:Init()\n\t\tlpanels = lpanels:Exit()\n\telseif event == \"ADDON_LOADED\" and deps then\n\t\tfor frame, addon in pairs(deps) do\n\t\t\tif IsAddOnLoaded(addon) then _G[frame]:Show() frame = nil end\n\t\tend\n\tend\nend\n\nfunction lpanels.CreateFrame(_, frame)\n\tif not hidden[frame] then return end\n\tfor i, child in ipairs(hidden[frame]) do\n\t\tlocal panel = _G[child]\n\t\tif not panel.anchor_frame or _G[panel.anchor_frame] then\n\t\t\tlocal points = {panel:GetPoint()} points[2] = _G[panel.anchor_frame] or frame\n\t\t\tpanel:SetParent(_G.frame or UIParent)\n\t\t\tpanel:ClearAllPoints()\n\t\t\tpanel:SetPoint(unpack(points))\n\t\t\tResize(panel, panel.width, panel.height)\n\t\t\tpanel:SetFrameStrata(panel.strata)\n\t\t\tif panel.level then panel:SetFrameLevel(panel.level) end\n\t\t\thidden[frame][i] = nil\n\t\tend\n\tend\n\tif #hidden[frame] == 0 then hidden[frame] = nil end\nend\n\nhooksecurefunc(\"CreateFrame\", lpanels.CreateFrame)\n\nlp:RegisterEvent(\"ADDON_LOADED\")\nlp:RegisterEvent(\"PLAYER_LOGIN\")\nlp:SetScript(\"OnEvent\", lpanels.OnEvent)"
  },
  {
    "path": "ShestakUI/Libs/LiteStats/LiteStats.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tBased on LiteStats(by Katae)\n----------------------------------------------------------------------------------------\nlocal P = \"player\"\nlocal realm, char, class, layout = GetRealmName(), UnitName(P), select(2, UnitClass(P)), {}\n\n-- Tooltip text colors\nlocal tthead = {r = 0.40, g = 0.78, b = 1}\t-- Headers\nlocal ttsubh = {r = 0.75, g = 0.90, b = 1}\t-- Subheaders\n\n-- Strata/Level for text objects\nlocal strata, level = \"MEDIUM\", 20\n\n-- Globals\nlocal profiles = LPSTAT_PROFILES\nlocal font = LPSTAT_FONT\nlocal t_icon = LTIPICONSIZE or 20\nlocal IsAltKeyDown = IsAltKeyDown\nlocal UpdateMemUse = UpdateAddOnMemoryUsage\nlocal format = string.format\nlocal strmatch = string.match\nlocal strfind = string.find\nlocal strtrim = strtrim\nlocal unpack = unpack\nlocal pairs = pairs\nlocal ipairs = ipairs\nlocal floor = math.floor\nlocal select = select\nlocal gsub = gsub\n\n-- Config\nlocal modules = LPSTAT_CONFIG\nlocal clock = modules.Clock\nlocal latency = modules.Latency\nlocal fps = modules.FPS\nlocal friends = modules.Friends\nlocal guild = modules.Guild\nlocal durability = modules.Durability\nlocal experience = modules.Experience\nlocal talents = modules.Talents\nlocal location = modules.Location\nlocal damage = modules.Damage\nlocal coords = modules.Coords\nlocal ping = modules.Ping\nlocal gold = modules.Gold\nlocal stats = modules.Stats\nlocal stat = modules.Stat\nlocal bags = modules.Bags\nlocal loot = modules.Loot\nlocal nameplates = modules.Nameplates\n\n-- Events Reg\nlocal function RegEvents(f, l) for _, e in ipairs{strsplit(\" \", l)} do f:RegisterEvent(e) end end\n\n------------------------------------------\n-- Saved Vars Init / Coords\nlocal ls, coordX, coordY, conf, Coords = CreateFrame(\"Frame\"), 0, 0, {}\nRegEvents(ls, \"ADDON_LOADED PLAYER_REGEN_DISABLED PLAYER_REGEN_ENABLED\")\nls:SetScript(\"OnEvent\", function(_, event, addon)\n\tif event == \"ADDON_LOADED\" and addon == \"ShestakUI\" then\n\t\tif not ShestakUIStats then ShestakUIStats = {} end\n\t\tif not ShestakUIStats[realm] then ShestakUIStats[realm] = {} end\n\t\tif not ShestakUIStats[realm][char] then ShestakUIStats[realm][char] = {} end\n\t\tconf = ShestakUIStats[realm][char]\n\n\t\t-- true/false defaults for autosell and autorepair\n\t\tif conf.AutoSell == nil then conf.AutoSell = true end\n\t\tif conf.AutoRepair == nil then conf.AutoRepair = true end\n\t\tif conf.AutoGuildRepair == nil then conf.AutoGuildRepair = true end\n\tend\nend)\n\n-- Config missing?\nif not modules then return end\n\nlocal mapRects, tempVec2D = {}, CreateVector2D(0, 0)\nlocal function GetPlayerMapPos(mapID)\n\ttempVec2D.x, tempVec2D.y = UnitPosition(\"player\")\n\tif not tempVec2D.x then return end\n\n\tlocal mapRect = mapRects[mapID]\n\tif not mapRect then\n\t\tlocal _, pos1 = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(0, 0))\n\t\tlocal _, pos2 = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(1, 1))\n\t\tif not pos1 or not pos2 then return end\n\t\tmapRect = {pos1, pos2}\n\t\tmapRect[2]:Subtract(mapRect[1])\n\t\tmapRects[mapID] = mapRect\n\tend\n\ttempVec2D:Subtract(mapRect[1])\n\n\treturn (tempVec2D.y/mapRect[2].y), (tempVec2D.x/mapRect[2].x)\nend\n\nif modules and ((coords and coords.enabled) or (location and location.enabled)) then\n\tls:SetScript(\"OnUpdate\", function(self, elapsed)\n\t\tself.elapsed = (self.elapsed or 0) + elapsed\n\t\tif self.elapsed >= 0.2 then\n\t\t\tlocal unitMap = C_Map.GetBestMapForUnit(\"player\")\n\n\t\t\tif unitMap then\n\t\t\t\tcoordX, coordY = GetPlayerMapPos(unitMap)\n\t\t\tend\n\n\t\t\tself.elapsed = 0\n\t\tend\n\tend)\n\n\tfunction Coords() return format(coords and coords.fmt or \"%.0f, %.0f\", coordX and coordX * 100 or 0, coordY and coordY * 100 or 0) end\nend\n\n-- Set profile\nif profiles then for _, p in ipairs{class,format(\"%s - %s\", char, realm)} do\n\tif profiles[p] then for k, v in pairs(profiles[p]) do\n\t\tfor _k, _v in pairs(v) do modules[k][_k] = _v end\n\tend end\nend profiles = nil end\n\n\n------------------------------------------\nlocal function comma_value(n) -- credit http://richard.warburton.it\n\tlocal left, num, right = string.match(n,\"^([^%d]*%d)(%d*)(.-)$\")\n\treturn left..(num:reverse():gsub(\"(%d%d%d)\",\"%1,\"):reverse())..right\nend\n\nlocal function formatgold(style, amount)\n\tlocal gold, silver, copper = floor(amount * 0.0001), floor(mod(amount * 0.01, 100)), floor(mod(amount, 100))\n\tif style == 1 then\n\t\treturn (gold > 0 and format(\"%s|cffffd700%s|r \", comma_value(gold), GOLD_AMOUNT_SYMBOL) or \"\")\n\t\t\t.. (silver > 0 and format(\"%s|cffc7c7cf%s|r \", silver, SILVER_AMOUNT_SYMBOL) or \"\")\n\t\t\t.. ((copper > 0 or (gold == 0 and silver == 0)) and format(\"%s|cffeda55f%s|r\", copper, COPPER_AMOUNT_SYMBOL) or \"\")\n\telseif style == 2 or not style then\n\t\treturn format(\"%.1f|cffffd700%s|r\", amount * 0.0001, GOLD_AMOUNT_SYMBOL)\n\telseif style == 3 then\n\t\treturn format(\"|cffffd700%s|r.|cffc7c7cf%s|r.|cffeda55f%s|r\", gold, silver, copper)\n\telseif style == 4 then\n\t\treturn (gold > 0 and format(GOLD_AMOUNT_TEXTURE, gold, 12, 12) or \"\") .. (silver > 0 and format(SILVER_AMOUNT_TEXTURE, silver, 12, 12) or \"\")\n\t\t\t.. ((copper > 0 or (gold == 0 and silver == 0)) and format(COPPER_AMOUNT_TEXTURE, copper, 12, 12) or \"\") .. \" \"\n\telseif style == 5 then\n\t\treturn (gold > 0 and format(\"%s|cffffd700%s|r \", comma_value(gold), GOLD_AMOUNT_SYMBOL) or \"\")\n\t\t\t.. (format(\"%.2d|cffc7c7cf%s|r \", silver, SILVER_AMOUNT_SYMBOL))\n\t\t\t.. (format(\"%.2d|cffeda55f%s|r\", copper, COPPER_AMOUNT_SYMBOL))\n\tend\nend\n\nlocal function zsub(s, ...) local t = {...} for i = 1, #t, 2 do s = gsub(s, t[i], t[i + 1]) end return s end\nlocal function abbr(t, s) return t[s] or zsub(_G[strupper(s)..\"_ONELETTER_ABBR\"], \"%%d\", \"\", \"^%s*\", \"\") end\nlocal function fmttime(sec, t)\n\tlocal t = t or {}\n\tlocal d, h, m, s = ChatFrame_TimeBreakDown(floor(sec))\n\tlocal string = zsub(format(\" %dd %dh %dm \"..((d == 0 and h == 0) and \"%ds\" or \"\"), d, h, m, s), \" 0[dhms]\", \" \", \"%s+\", \" \")\n\tstring = strtrim(gsub(string, \"([dhms])\", {d = abbr(t, \"day\"), h = abbr(t, \"hour\"), m = abbr(t, \"minute\"), s = abbr(t, \"second\")}), \" \")\n\treturn strmatch(string, \"^%s*$\") and \"0\"..abbr(t, \"second\") or string\nend\n\nlocal function gradient(perc)\n\tperc = perc > 1 and 1 or perc < 0 and 0 or perc -- Stay between 0-1\n\tlocal seg, relperc = math.modf(perc*2)\n\tlocal r1, g1, b1, r2, g2, b2 = select(seg * 3 + 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0) -- R -> Y -> G\n\tlocal r, g, b = r1 + (r2 - r1) * relperc, g1 + (g2 - g1) * relperc, b1 + (b2 - b1) * relperc\n\treturn format(\"|cff%02x%02x%02x\", r * 255, g * 255, b * 255), r, g, b\nend\n\nlocal function HideTT(self) GameTooltip:Hide() self.hovered = false end\n\nlocal pxpx = {height = 1, width = 1}\nlocal function Inject(name, stat)\n\tif not name then return end\n\tif not stat then stat = pxpx end\n\n\tlocal m = modules[name]\n\tfor k, v in pairs{ -- retrieving config variables from LPSTAT_CONFIG\n\t\t--name = name, anchor_frame = m.anchor_frame,\n\t\tname = name, parent = m.anchor_frame,\n\t\tanchor_to = m.anchor_to, anchor_from = m.anchor_from,\n\t\tx_off = m.x_off, y_off = m.y_off,\n\t\theight = m.height, width = m.width,\n\t\tstrata = m.strata or strata, level = level\n\t} do if not stat[k] then stat[k] = v end end\n\tif not stat.text then stat.text = {} end\n\n\t-- retrieve font variables and insert them into text table\n\tfor k,v in pairs(font) do\n\t\tif not stat.text[k] then\n\t\t\tstat.text[k] = m[k] or v\n\t\tend\n\tend\n\n\tif stat.OnEnter then if stat.OnLeave then hooksecurefunc(stat, \"OnLeave\", HideTT) else stat.OnLeave = HideTT end end\n\ttinsert(layout, stat)\nend\n\n-- Inject dummy frames for disabled modules\nfor name, conf in pairs(modules) do\n\tif not conf.enabled then Inject(name) end\nend\n\nlocal function AltUpdate(self)\n\tif not self.hovered then return end\n\tif IsAltKeyDown() and not self.altdown then self.altdown = true self:GetScript(\"OnEnter\")(self)\n\telseif not IsAltKeyDown() and self.altdown then self.altdown = false self:GetScript(\"OnEnter\")(self) end\nend\n\nlocal menuFrame = CreateFrame(\"Frame\", \"ContactDropDownMenu\", UIParent, \"UIDropDownMenuTemplate\")\nlocal menuList = {\n\t{text = OPTIONS_MENU, isTitle = true, notCheckable = true},\n\t{text = INVITE, hasArrow = true, notCheckable = true},\n\t{text = CHAT_MSG_WHISPER_INFORM, hasArrow = true, notCheckable = true}\n}\n\nSLASH_LSTATS1, SLASH_LSTATS2, SLASH_LSTATS3 = \"/ls\", \"/lstats\", \"/litestats\"\nlocal function slprint(...)\n\tlocal m, l = \"|cffbcee68\", \"|cffff9912 -|r\"\n\tlocal t = {...} print(m, t[1])\n\tfor i = 2, #t do print(l, t[i]) end\nend\nfunction SlashCmdList.LSTATS()\n\tprint(\"Lite|cff66C6FFStats|r \"..L_STATS_TIPS)\n\tif clock.enabled then\n\t\tslprint(TIMEMANAGER_TITLE, L_STATS_OPEN_CALENDAR, L_STATS_RC_TIME_MANAGER, L_STATS_TOGGLE_TIME)\n\tend\n\tif fps.enabled then\n\t\tslprint(L_STATS_MEMORY, L_STATS_RC_COLLECTS_GARBAGE)\n\tend\n\tif friends.enabled or guild.enabled then\n\t\tslprint(format(\"%s/%s\", FRIENDS, GUILD), L_STATS_VIEW_NOTES, L_STATS_CHANGE_SORTING)\n\tend\n\tif durability.enabled then\n\t\tslprint(DURABILITY, L_STATS_OPEN_CHARACTER, L_STATS_RC_AUTO_REPAIRING1, L_STATS_RC_AUTO_REPAIRING2, L_STATS_EQUIPMENT_CHANGER)\n\tend\n\tif experience.enabled then\n\t\tslprint(format(\"%s/%s/%s\", COMBAT_XP_GAIN, TIME_PLAYED_MSG, FACTION), L_STATS_RC_EXPERIENCE, L_STATS_WATCH_FACTIONS, L_STATS_TOOLTIP_EXPERIENCE, L_STATS_TOOLTIP_TIME_PLAYED)\n\tend\n\tif talents.enabled then\n\t\tslprint(TALENTS, L_STATS_OPEN_TALENT, L_STATS_RC_TALENT)\n\tend\n\tif location.enabled or coords.enabled then\n\t\tslprint(L_STATS_LOCATION, L_STATS_WORLD_MAP, L_STATS_INSERTS_COORDS)\n\tend\n\tif gold.enabled then\n\t\tslprint(strtrim(gsub(MONEY, \"%%d\", \"\")), L_STATS_OPEN_CURRENCY, L_STATS_RC_AUTO_SELLING, L_STATS_NEED_TO_SELL, L_STATS_WATCH_CURRENCY)\n\tend\n\tprint(\"|cffBCEE68\", format(L_STATS_OTHER_OPTIONS, \"|cff66C6FFShestakUI\\\\Config\\\\DataText.lua\")..\"|r\")\nend\n\nCreateFrame(\"Frame\", \"LSMenus\", UIParent, \"UIDropDownMenuTemplate\")\n\n----------------------------------------------------------------------------------------\n--\tClock\n----------------------------------------------------------------------------------------\nif clock.enabled then\n\tlocal CALENDAR_MONTH_NAMES = {\n\t\tMONTH_JANUARY,\n\t\tMONTH_FEBRUARY,\n\t\tMONTH_MARCH,\n\t\tMONTH_APRIL,\n\t\tMONTH_MAY,\n\t\tMONTH_JUNE,\n\t\tMONTH_JULY,\n\t\tMONTH_AUGUST,\n\t\tMONTH_SEPTEMBER,\n\t\tMONTH_OCTOBER,\n\t\tMONTH_NOVEMBER,\n\t\tMONTH_DECEMBER,\n\t}\n\n\tInject(\"Clock\", {\n\t\ttext = {\n\t\t\tstring = function()\n\t\t\t\treturn zsub(GameTime_GetTime(true), \"%s*AM\", clock.AM, \"%s*PM\", clock.PM, \":\", clock.colon)\n\t\t\tend\n\t\t},\n\t\tOnLoad = function(self) RequestRaidInfo() RegEvents(self, \"UPDATE_INSTANCE_INFO\") end,\n\t\tOnEvent = function(self) if self.hovered then self:GetScript(\"OnEnter\")(self) end end,\n\t\tOnEnter = function(self)\n\t\t\tif not self.hovered then RequestRaidInfo() self.hovered = true end\n\t\t\tlocal currentCalendarTime = C_DateAndTime.GetCurrentCalendarTime()\n\t\t\tlocal weekday = CALENDAR_WEEKDAY_NAMES[currentCalendarTime.weekday]\n\t\t\tlocal month = CALENDAR_MONTH_NAMES[currentCalendarTime.month]\n\t\t\tlocal fullDate = format(FULLDATE, weekday, month, currentCalendarTime.monthDay, currentCalendarTime.year, currentCalendarTime.month)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\tGameTooltip:ClearAllPoints()\n\t\t\tGameTooltip:SetPoint(clock.tip_anchor, clock.tip_frame, clock.tip_x, clock.tip_y)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:AddLine(fullDate, tthead.r, tthead.g, tthead.b)\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddDoubleLine(gsub(TIMEMANAGER_TOOLTIP_LOCALTIME, \":\", \"\"), zsub(GameTime_GetLocalTime(true), \"%s*AM\", \"am\", \"%s*PM\", \"pm\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tGameTooltip:AddDoubleLine(gsub(TIMEMANAGER_TOOLTIP_REALMTIME, \":\", \"\"), zsub(GameTime_GetGameTime(true), \"%s*AM\", \"am\", \"%s*PM\", \"pm\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\n\t\t\tlocal titleName\n\t\t\tfor i = 1, GetNumSavedInstances() do\n\t\t\t\tlocal name, _, reset, difficulty, locked, extended, _, isRaid, maxPlayers, _, numEncounters, encounterProgress = GetSavedInstanceInfo(i)\n\t\t\t\tif isRaid and (locked or extended) or maxPlayers == 5 and difficulty == 23 and (locked or extended) then\n\t\t\t\t\tlocal tr, tg, tb, diff\n\t\t\t\t\tif not titleName then\n\t\t\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\t\t\tGameTooltip:AddLine(GROUP_FINDER, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\t\t\t\ttitleName = true\n\t\t\t\t\tend\n\t\t\t\t\tif extended then tr, tg, tb = 0.3, 1, 0.3 else tr, tg, tb = 1, 1, 1 end\n\n\t\t\t\t\tlocal _, _, isHeroic, _, displayHeroic, displayMythic = GetDifficultyInfo(difficulty)\n\t\t\t\t\tif displayMythic then\n\t\t\t\t\t\tdiff = \"M\"\n\t\t\t\t\telseif isHeroic or displayHeroic then\n\t\t\t\t\t\tdiff = \"H\"\n\t\t\t\t\tend\n\n\t\t\t\t\tif (numEncounters and numEncounters > 0) and (encounterProgress and encounterProgress > 0) then\n\t\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"%s |cffaaaaaa[%s%s] (%s/%s)\", name, maxPlayers, diff or \"\", encounterProgress, numEncounters), fmttime(reset), 1, 1, 1, tr, tg, tb)\n\t\t\t\t\telse\n\t\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"%s |cffaaaaaa[%s%s]\", name, maxPlayers, diff or \"\"), fmttime(reset), 1, 1, 1, tr, tg, tb)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal addedLine\n\t\t\tfor i = 1, GetNumSavedWorldBosses() do\n\t\t\t\tlocal name, _, reset = GetSavedWorldBossInfo(i)\n\t\t\t\tif reset then\n\t\t\t\t\tif not addedLine then\n\t\t\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\t\t\tGameTooltip:AddLine(RAID_INFO_WORLD_BOSS, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\t\t\t\taddedLine = true\n\t\t\t\t\tend\n\t\t\t\t\tGameTooltip:AddDoubleLine(name, fmttime(reset), 1, 1, 1, 1, 1, 1)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- In 9.0 seals not available\n\t\t\t-- if T.level == MAX_PLAYER_LEVEL then\n\t\t\t\t-- local c = 0\n\t\t\t\t-- for _, q in ipairs({52834, 52835, 52837, 52838, 52839, 52840}) do\n\t\t\t\t\t-- if C_QuestLog.IsQuestFlaggedCompleted(q) then\n\t\t\t\t\t\t-- c = c + 1\n\t\t\t\t\t-- end\n\t\t\t\t-- end\n\t\t\t\t-- local max = 2\n\t\t\t\t-- local r, g, b = 1, 1, 1\n\t\t\t\t-- if c == 0 then\n\t\t\t\t\t-- r, g, b = 1, 0, 0\n\t\t\t\t-- elseif c == 1 then\n\t\t\t\t\t-- r, g, b = 1, 1, 0\n\t\t\t\t-- end\n\t\t\t\t-- GameTooltip:AddLine(\" \")\n\t\t\t\t-- GameTooltip:AddLine(MISCELLANEOUS, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\t\t-- GameTooltip:AddDoubleLine(L_STATS_SEALS, format(\"%s/%s\", c, max), 1, 1, 1, r, g, b)\n\t\t\t-- end\n\t\t\tGameTooltip:Show()\n\t\tend,\n\t\tOnClick = function(_, b) (b == \"RightButton\" and ToggleTimeManager or ToggleCalendar)() end\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tLatency\n----------------------------------------------------------------------------------------\nif latency.enabled then\n\tInject(\"Latency\", {\n\t\ttext = {\n\t\t\tstring = function()\n\t\t\t\tlocal _, _, latencyHome, latencyWorld = GetNetStats()\n\t\t\t\tlocal lat = math.max(latencyHome, latencyWorld)\n\t\t\t\treturn format(gsub(latency.fmt, \"%[color%]\", (gradient(1 - lat / 750))), lat)\n\t\t\tend\n\t\t},\n\t\tOnEnter = function(self)\n\t\t\tlocal _, _, latencyHome, latencyWorld = GetNetStats()\n\t\t\tlocal latency = format(MAINMENUBAR_LATENCY_LABEL, latencyHome, latencyWorld)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\tGameTooltip:ClearAllPoints()\n\t\t\tGameTooltip:SetPoint(modules.Latency.tip_anchor, modules.Latency.tip_frame, modules.Latency.tip_x, modules.Latency.tip_y)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:AddLine(latency, tthead.r, tthead.g, tthead.b)\n\t\t\tGameTooltip:Show()\n\t\tend,\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tFPS\n----------------------------------------------------------------------------------------\nif fps.enabled then\n\tlocal function sortdesc(a, b) return a[2] > b[2] end\n\tlocal function formatmem(val, dec)\n\t\treturn format(format(\"%%.%df %s\", dec or 1, val > 1024 and \"MB\" or \"KB\"), val / (val > 1024 and 1024 or 1))\n\tend\n\n\tlocal memoryt = {}\n\tlocal function UpdateMemory()\n\t\tlocal totalMemory = 0\n\t\tUpdateMemUse()\n\t\twipe(memoryt)\n\t\tfor i = 1, GetNumAddOns() do\n\t\t\tlocal memory = GetAddOnMemoryUsage(i)\n\t\t\tlocal addon, name = GetAddOnInfo(i)\n\t\t\tif IsAddOnLoaded(i) then tinsert(memoryt, {name or addon, memory}) end\n\t\t\ttotalMemory = totalMemory + memory\n\t\tend\n\t\ttable.sort(memoryt, sortdesc)\n\t\treturn totalMemory\n\tend\n\n\n\tlocal startTime\n\tC_Timer.After(0.25, function()\n\t\tResetCPUUsage()\n\t\tstartTime = GetTime()\n\tend)\n\n\tlocal cput = {}\n\tlocal lastCPU = {}\n\tlocal function UpdateCPU()\n\t\tlocal totalCPU = 0\n\t\tUpdateAddOnCPUUsage()\n\t\twipe(cput)\n\t\tfor i = 1, GetNumAddOns() do\n\t\t\tlocal cpu = GetAddOnCPUUsage(i)\n\t\t\tlocal addon, name = GetAddOnInfo(i)\n\t\t\tlocal cpus = cpu / (GetTime() - startTime)\n\t\t\tlocal cpur = cpu - (lastCPU[i] and lastCPU[i] or cpu)\n\t\t\tlastCPU[i] = cpu\n\n\t\t\tif IsAddOnLoaded(i) then tinsert(cput, {name or addon, cpu, cpus, cpur}) end\n\t\t\ttotalCPU = totalCPU + cpu\n\t\tend\n\t\ttable.sort(cput, sortdesc)\n\t\treturn totalCPU\n\tend\n\n\tlocal isCPU = GetCVar(\"scriptProfile\") == \"1\"\n\tInject(\"FPS\", {\n\t\ttext = {\n\t\t\tstring = function(self)\n\t\t\t\tlocal parent = self:GetParent()\n\t\t\t\tif parent.hovered then self:GetParent():GetScript(\"OnEnter\")(parent) end\n\t\t\t\treturn format(fps.fmt, floor(GetFramerate()))\n\t\t\tend\n\t\t},\n\t\tOnEnter = function(self)\n\t\t\tself.hovered = true\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\tGameTooltip:ClearAllPoints()\n\t\t\tGameTooltip:SetPoint(modules.FPS.tip_anchor, modules.FPS.tip_frame, modules.FPS.tip_x, modules.FPS.tip_y)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tlocal lat, r = select(4, GetNetStats()), 750\n\t\t\tlocal totalMemory = UpdateMemory()\n\t\t\tlocal totalCPU = isCPU and UpdateCPU()\n\t\t\tGameTooltip:AddDoubleLine(\n\t\t\t\tformat(\"|cffffffff%s|r %s, %s%s|r %s\", floor(GetFramerate()), FPS_ABBR, gradient(1 - lat / r), lat, MILLISECONDS_ABBR),\n\t\t\t\tformat(\"%s: |cffffffff%s\", ADDONS, formatmem(totalMemory)), tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b)\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tif fps.max_addons ~= 0 or IsAltKeyDown() then\n\t\t\t\tlocal ctable\n\t\t\t\tif isCPU and not IsControlKeyDown() then\n\t\t\t\t\tctable = cput\n\t\t\t\telse\n\t\t\t\t\tctable = memoryt\n\t\t\t\tend\n\t\t\t\tlocal exmem = 0\n\t\t\t\tfor i, t in ipairs(ctable) do\n\t\t\t\t\tif fps.max_addons and i > fps.max_addons and not IsAltKeyDown() then\n\t\t\t\t\t\texmem = exmem + t[2]\n\t\t\t\t\telse\n\t\t\t\t\t\tlocal color = t[2] <= 102.4 and {0,1} -- 0 - 100\n\t\t\t\t\t\t\tor t[2] <= 512 and {0.5,1} -- 100 - 512\n\t\t\t\t\t\t\tor t[2] <= 1024 and {0.75,1} -- 512 - 1mb\n\t\t\t\t\t\t\tor t[2] <= 2560 and {1,1} -- 1mb - 2.5mb\n\t\t\t\t\t\t\tor t[2] <= 5120 and {1,0.75} -- 2.5mb - 5mb\n\t\t\t\t\t\t\tor t[2] <= 8192 and {1,0.5} -- 5mb - 8mb\n\t\t\t\t\t\t\tor {1,0.1} -- 8mb +\n\t\t\t\t\t\tif isCPU and not IsControlKeyDown() then\n\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(t[1], format(\"%d ms (%.2f) | %.2f\", t[2], t[3], t[4]), 1, 1, 1, color[1], color[2], 0)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(t[1], formatmem(t[2]), 1, 1, 1, color[1], color[2], 0)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif exmem > 0 and not IsAltKeyDown() then\n\t\t\t\t\tlocal more = #memoryt - fps.max_addons\n\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"%d %s (%s)\", more, L_STATS_HIDDEN, ALT_KEY), formatmem(exmem), ttsubh.r, ttsubh.g, ttsubh.b, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\t\tend\n\t\t\t\tGameTooltip:AddDoubleLine(\" \", \"--------------\", 1, 1, 1, 0.5, 0.5, 0.5)\n\t\t\tend\n\t\t\tlocal bandwidth = GetAvailableBandwidth()\n\t\t\tif bandwidth ~= 0 then\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_BANDWIDTH, format(\"%s \"..\"Mbps\", T.Round(bandwidth, 2)), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_DOWNLOAD, format(\"%s%%\", floor(GetDownloadedPercentage() * 100 + 0.5)), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tend\n\t\t\tGameTooltip:AddDoubleLine(L_STATS_MEMORY_USAGE, formatmem(gcinfo() - totalMemory), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tGameTooltip:AddDoubleLine(L_STATS_TOTAL_MEMORY_USAGE, formatmem(collectgarbage\"count\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tif isCPU then\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_TOTAL_CPU_USAGE, format(\"%d ms\", totalCPU), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tend\n\t\t\tGameTooltip:Show()\n\t\tend,\n\t\tOnLeave = function(self) self.hovered = false end,\n\t\tOnClick = function(self, button)\n\t\t\tif button == \"RightButton\" then\n\t\t\t\tUpdateMemUse()\n\t\t\t\tlocal before = gcinfo()\n\t\t\t\tcollectgarbage()\n\t\t\t\tUpdateMemUse()\n\t\t\t\tprint(format(\"|cff66C6FF%s:|r %s\", L_STATS_GARBAGE_COLLECTED, formatmem(before - gcinfo())))\n\t\t\t\tself.timer, self.text.elapsed = nil, 5\n\t\t\t\tself:GetScript(\"OnEnter\")(self)\n\t\t\telseif button == \"LeftButton\" then\n\t\t\t\tif AddonList:IsShown() then\n\t\t\t\t\tAddonList_OnCancel()\n\t\t\t\telse\n\t\t\t\t\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION)\n\t\t\t\t\tShowUIPanel(AddonList)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tFriends\n----------------------------------------------------------------------------------------\nif friends.enabled then\n\tlocal totalBattleNetOnline = 0\n\tlocal BNTable = {}\n\tlocal friendTable = {}\n\tlocal BNTableEnter = {}\n\tlocal function BuildFriendTable(total)\n\t\twipe(friendTable)\n\n\t\tfor i = 1, total do\n\t\t\tlocal info = C_FriendList.GetFriendInfoByIndex(i)\n\t\t\tif info and info.connected then\n\t\t\t\tlocal class = info.className\n\t\t\t\tlocal status = \"\"\n\t\t\t\tif info.dnd then\n\t\t\t\t\tstatus = CHAT_FLAG_DND\n\t\t\t\telseif info.afk then\n\t\t\t\t\tstatus = CHAT_FLAG_AFK\n\t\t\t\tend\n\t\t\t\tfor k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do if class == v then class = k end end\n\t\t\t\tif GetLocale() ~= \"enUS\" then\n\t\t\t\t\tfor k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do if class == v then class = k end end\n\t\t\t\tend\n\t\t\t\tfriendTable[i] = {info.name, info.level, class,  info.area, info.connected, status, info.notes}\n\t\t\tend\n\t\tend\n\n\t\ttable.sort(friendTable, function(a, b)\n\t\t\tif a[1] and b[1] then\n\t\t\t\treturn a[1] < b[1]\n\t\t\tend\n\t\tend)\n\tend\n\tlocal function BuildBNTable(total)\n\t\ttotalBattleNetOnline = 0\n\t\twipe(BNTable)\n\n\t\tfor i = 1, total do\n\t\t\tlocal accountInfo = C_BattleNet.GetFriendAccountInfo(i)\n\t\t\tlocal class = accountInfo.gameAccountInfo.className\n\t\t\tfor k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do if class == v then class = k end end\n\t\t\tif GetLocale() ~= \"enUS\" then\n\t\t\t\tfor k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do if class == v then class = k end end\n\t\t\tend\n\t\t\tBNTable[i] = {accountInfo.bnetAccountID, accountInfo.accountName, accountInfo.battleTag, accountInfo.gameAccountInfo.characterName, accountInfo.gameAccountInfo.gameAccountID, accountInfo.gameAccountInfo.clientProgram, accountInfo.gameAccountInfo.isOnline, accountInfo.isAFK, accountInfo.isDND, accountInfo.note, accountInfo.gameAccountInfo.realmName, accountInfo.gameAccountInfo.factionName, accountInfo.gameAccountInfo.raceName, class, accountInfo.gameAccountInfo.areaName, accountInfo.gameAccountInfo.characterLevel}\n\t\t\tif accountInfo.gameAccountInfo.isOnline then\n\t\t\t\ttotalBattleNetOnline = totalBattleNetOnline + 1\n\t\t\tend\n\t\tend\n\tend\n\tlocal clientTags = {\n\t\t-- [BNET_CLIENT_D3] = \"Diablo 3\",\n\t\t-- [BNET_CLIENT_D2] = \"Diablo 2: Resurrected\",\n\t\t-- [BNET_CLIENT_WTCG] = \"Hearthstone\",\n\t\t-- [BNET_CLIENT_HEROES] = \"Heroes of the Storm\",\n\t\t-- [BNET_CLIENT_OVERWATCH] = \"Overwatch\",\n\t\t-- [BNET_CLIENT_SC] = \"StarCraft\",\n\t\t-- [BNET_CLIENT_SC2] = \"StarCraft 2\",\n\t\t-- [BNET_CLIENT_DESTINY2] = \"Destiny 2\",\n\t\t-- [BNET_CLIENT_WC3] = \"Warcraft 3: Reforged\",\n\t\t-- [BNET_CLIENT_ARCADE] = \"Arcade Collection\",\n\t\t-- [BNET_CLIENT_CRASH4] = \"Crash Bandicoot 4\",\n\t\t-- [BNET_CLIENT_COD] = \"COD: Black Ops 4\",\n\t\t-- [BNET_CLIENT_COD_MW] = \"COD: Modern Warfare\",\n\t\t-- [BNET_CLIENT_COD_MW2] = \"COD: Modern Warfare 2\",\n\t\t-- [BNET_CLIENT_COD_BOCW] = \"COD: Cold War\",\n\t\t-- [\"BSAp\"] = COMMUNITIES_PRESENCE_MOBILE_CHAT\n\t}\n\tInject(\"Friends\", {\n\t\tOnLoad = function(self) RegEvents(self, \"PLAYER_LOGIN PLAYER_ENTERING_WORLD GROUP_ROSTER_UPDATE FRIENDLIST_UPDATE BN_FRIEND_LIST_SIZE_CHANGED BN_FRIEND_ACCOUNT_ONLINE BN_FRIEND_ACCOUNT_OFFLINE BN_FRIEND_INFO_CHANGED BN_FRIEND_ACCOUNT_ONLINE BN_FRIEND_ACCOUNT_OFFLINE BN_FRIEND_INFO_CHANGED\") end,\n\t\tOnEvent = function(self, event)\n\t\t\tif event ~= \"GROUP_ROSTER_UPDATE\" then\n\t\t\t\tlocal numBNetTotal, numBNetOnline = BNGetNumFriends()\n\t\t\t\tlocal numOnline, numTotal = C_FriendList.GetNumOnlineFriends(), C_FriendList.GetNumFriends()\n\t\t\t\tlocal online = numOnline + numBNetOnline\n\t\t\t\tlocal total = numTotal + numBNetTotal\n\t\t\t\tself.text:SetText(format(friends.fmt, online, total))\n\t\t\tend\n\t\t\tif self.hovered then self:GetScript(\"OnEnter\")(self) end\n\t\tend,\n\t\tOnUpdate = AltUpdate,\n\t\tOnClick = function(self, b)\n\t\t\tif b == \"MiddleButton\" then\n\t\t\t\tToggleIgnorePanel()\n\t\t\telseif b == \"LeftButton\" then\n\t\t\t\tToggleFriendsFrame(1)\n\t\t\telseif b == \"RightButton\" then\n\t\t\t\tHideTT(self)\n\n\t\t\t\tlocal BNTotal = BNGetNumFriends()\n\t\t\t\tlocal total = C_FriendList.GetNumFriends()\n\t\t\t\tBuildBNTable(BNTotal)\n\t\t\t\tBuildFriendTable(total)\n\n\t\t\t\tlocal classc, levelc, grouped\n\t\t\t\tlocal menuCountWhispers = 0\n\t\t\t\tlocal menuCountInvites = 0\n\n\t\t\t\tmenuList[2].menuList = {}\n\t\t\t\tmenuList[3].menuList = {}\n\n\t\t\t\tif #friendTable > 0 then\n\t\t\t\t\tfor i = 1, #friendTable do\n\t\t\t\t\t\tif UnitInParty(friendTable[i][1]) or UnitInRaid(friendTable[i][1]) then\n\t\t\t\t\t\t\tgrouped = \" |cffaaaaaa*|r\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tgrouped = \"\"\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tclassc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[friendTable[i][3]], GetQuestDifficultyColor(friendTable[i][2])\n\t\t\t\t\t\tif classc == nil then\n\t\t\t\t\t\t\tclassc = GetQuestDifficultyColor(friendTable[i][2])\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tmenuCountWhispers = menuCountWhispers + 1\n\t\t\t\t\t\tmenuList[3].menuList[menuCountWhispers] = {\n\t\t\t\t\t\t\ttext = format(\"|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r%s\", levelc.r * 255, levelc.g * 255, levelc.b * 255, friendTable[i][2], classc.r * 255, classc.g * 255, classc.b * 255, friendTable[i][1], grouped),\n\t\t\t\t\t\t\targ1 = friendTable[i][1],\n\t\t\t\t\t\t\tnotCheckable = true,\n\t\t\t\t\t\t\tfunc = function(_, arg1)\n\t\t\t\t\t\t\t\tmenuFrame:Hide()\n\t\t\t\t\t\t\t\tSetItemRef(\"player:\"..arg1, (\"|Hplayer:%1$s|h[%1$s]|h\"):format(arg1), \"LeftButton\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif not (UnitInParty(friendTable[i][1]) or UnitInRaid(friendTable[i][1])) then\n\t\t\t\t\t\t\tmenuCountInvites = menuCountInvites + 1\n\t\t\t\t\t\t\tmenuList[2].menuList[menuCountInvites] = {\n\t\t\t\t\t\t\t\ttext = format(\"|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r\", levelc.r * 255, levelc.g * 255, levelc.b * 255, friendTable[i][2], classc.r * 255, classc.g * 255, classc.b * 255, friendTable[i][1]),\n\t\t\t\t\t\t\t\targ1 = friendTable[i][1],\n\t\t\t\t\t\t\t\tnotCheckable = true,\n\t\t\t\t\t\t\t\tfunc = function(_, arg1)\n\t\t\t\t\t\t\t\t\tmenuFrame:Hide()\n\t\t\t\t\t\t\t\t\tC_PartyInfo.InviteUnit(arg1)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tif totalBattleNetOnline > 0 then\n\t\t\t\t\tfor i = 1, #BNTable do\n\t\t\t\t\t\tif BNTable[i][7] then\n\t\t\t\t\t\t\tif UnitInParty(BNTable[i][4]) or UnitInRaid(BNTable[i][4]) then\n\t\t\t\t\t\t\t\tgrouped = \" |cffaaaaaa*|r\"\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tgrouped = \"\"\n\t\t\t\t\t\t\tend\n\n\t\t\t\t\t\t\tmenuCountWhispers = menuCountWhispers + 1\n\t\t\t\t\t\t\tmenuList[3].menuList[menuCountWhispers] = {\n\t\t\t\t\t\t\t\ttext = BNTable[i][2]..grouped,\n\t\t\t\t\t\t\t\targ1 = BNTable[i][2],\n\t\t\t\t\t\t\t\tnotCheckable = true,\n\t\t\t\t\t\t\t\tfunc = function(_, arg1)\n\t\t\t\t\t\t\t\t\tmenuFrame:Hide()\n\t\t\t\t\t\t\t\t\tChatFrame_SendBNetTell(arg1)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif BNTable[i][6] == BNET_CLIENT_WOW and UnitFactionGroup(\"player\") == BNTable[i][12] then\n\t\t\t\t\t\t\t\tif not (UnitInParty(BNTable[i][4]) or UnitInRaid(BNTable[i][4])) then\n\t\t\t\t\t\t\t\t\tclassc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[BNTable[i][14]], GetQuestDifficultyColor(BNTable[i][16])\n\t\t\t\t\t\t\t\t\tif classc == nil then\n\t\t\t\t\t\t\t\t\t\tclassc = GetQuestDifficultyColor(BNTable[i][16])\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\tmenuCountInvites = menuCountInvites + 1\n\t\t\t\t\t\t\t\t\tmenuList[2].menuList[menuCountInvites] = {\n\t\t\t\t\t\t\t\t\t\ttext = format(\"|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r\", levelc.r * 255, levelc.g * 255, levelc.b * 255, BNTable[i][16], classc.r * 255, classc.g * 255, classc.b * 255, BNTable[i][4]),\n\t\t\t\t\t\t\t\t\t\targ1 = BNTable[i][5],\n\t\t\t\t\t\t\t\t\t\tnotCheckable = true,\n\t\t\t\t\t\t\t\t\t\tfunc = function(_, arg1)\n\t\t\t\t\t\t\t\t\t\t\tmenuFrame:Hide()\n\t\t\t\t\t\t\t\t\t\t\tBNInviteFriend(arg1)\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tEasyMenu(menuList, menuFrame, self, 0, 0, \"MENU\")\n\t\t\tend\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tC_FriendList.ShowFriends()\n\t\t\tself.hovered = true\n\t\t\tlocal online, total = C_FriendList.GetNumOnlineFriends(), C_FriendList.GetNumFriends()\n\t\t\tlocal status, classc, levelc, zone_r, zone_g, zone_b, grouped, realm_r, realm_g, realm_b\n\t\t\tlocal BNonline, BNtotal = 0, BNGetNumFriends()\n\t\t\twipe(BNTableEnter)\n\t\t\tif BNtotal > 0 then\n\t\t\t\tfor i = 1, BNtotal do\n\t\t\t\t\tlocal accountInfo = C_BattleNet.GetFriendAccountInfo(i)\n\t\t\t\t\tif accountInfo then\n\t\t\t\t\t\tBNTableEnter[i] = {accountInfo, accountInfo.gameAccountInfo.clientProgram}\n\t\t\t\t\t\tif accountInfo.gameAccountInfo.isOnline then\n\t\t\t\t\t\t\tBNonline = BNonline + 1\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal totalonline = online + BNonline\n\t\t\tlocal totalfriends = total + BNtotal\n\t\t\tif online > 0 or BNonline > 0 then\n\t\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\t\tGameTooltip:ClearAllPoints()\n\t\t\t\tGameTooltip:SetPoint(modules.Friends.tip_anchor, modules.Friends.tip_frame, modules.Friends.tip_x, modules.Friends.tip_y)\n\t\t\t\tGameTooltip:ClearLines()\n\t\t\t\tGameTooltip:AddDoubleLine(FRIENDS_LIST, format(\"%s: %s/%s\", GUILD_ONLINE_LABEL, totalonline, totalfriends), tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b)\n\t\t\t\tif online > 0 then\n\t\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\t\tGameTooltip:AddLine(WOW_FRIEND)\n\t\t\t\t\tfor i = 1, total do\n\t\t\t\t\t\tlocal info = C_FriendList.GetFriendInfoByIndex(i)\n\t\t\t\t\t\tlocal name = info.name\n\t\t\t\t\t\tlocal level = info.level\n\t\t\t\t\t\tlocal class = info.className\n\t\t\t\t\t\tlocal zone = info.area\n\t\t\t\t\t\tlocal connected = info.connected\n\t\t\t\t\t\tlocal status = \"\"\n\t\t\t\t\t\tif info.dnd then\n\t\t\t\t\t\t\tstatus = CHAT_FLAG_DND\n\t\t\t\t\t\telseif info.afk then\n\t\t\t\t\t\t\tstatus = CHAT_FLAG_AFK\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlocal note = info.notes\n\t\t\t\t\t\tif not connected then break end\n\t\t\t\t\t\tif GetRealZoneText() == zone then zone_r, zone_g, zone_b = 0.3, 1.0, 0.3 else zone_r, zone_g, zone_b = 0.65, 0.65, 0.65 end\n\t\t\t\t\t\tfor k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do if class == v then class = k end end\n\t\t\t\t\t\tif GetLocale() ~= \"enUS\" then\n\t\t\t\t\t\t\tfor k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do if class == v then class = k end end\n\t\t\t\t\t\tend\n\t\t\t\t\t\tclassc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class], GetQuestDifficultyColor(level)\n\t\t\t\t\t\tif not classc then\n\t\t\t\t\t\t\tclassc = {r = 1, g = 1, b = 1}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tgrouped = (UnitInParty(name) or UnitInRaid(name)) and (GetRealZoneText() == zone and \" |cff7fff00*|r\" or \" |cffff7f00*|r\") or \"\"\n\t\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"|cff%02x%02x%02x%d|r %s%s%s\", levelc.r * 255, levelc.g * 255, levelc.b * 255, level, name, grouped, \" \"..status), zone, classc.r, classc.g, classc.b, zone_r, zone_g, zone_b)\n\t\t\t\t\t\tif self.altdown and note then GameTooltip:AddLine(\"  \"..note, ttsubh.r, ttsubh.g, ttsubh.b, 1) end\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif BNonline > 0 then\n\t\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\t\tGameTooltip:AddLine(BATTLENET_FRIEND)\n\t\t\t\t\tfor i = 1, #BNTableEnter do\n\t\t\t\t\t\tlocal accountInfo = BNTableEnter[i][1]\n\t\t\t\t\t\tlocal isOnline = accountInfo.gameAccountInfo.isOnline\n\t\t\t\t\t\tlocal client = accountInfo.gameAccountInfo.clientProgram\n\t\t\t\t\t\tif isOnline then\n\t\t\t\t\t\t\tif client == BNET_CLIENT_WOW then\n\t\t\t\t\t\t\t\tif accountInfo.isAFK then\n\t\t\t\t\t\t\t\t\tstatus = \"|cffE7E716\"..L_CHAT_AFK..\"|r\"\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif accountInfo.isDND then\n\t\t\t\t\t\t\t\t\t\tstatus = \"|cffff0000\"..L_CHAT_DND..\"|r\"\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tstatus = \"\"\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\n\t\t\t\t\t\t\t\tlocal characterName = accountInfo.gameAccountInfo.characterName\n\t\t\t\t\t\t\t\tlocal realmName = accountInfo.gameAccountInfo.realmName\n\t\t\t\t\t\t\t\tlocal class = accountInfo.gameAccountInfo.className\n\t\t\t\t\t\t\t\tlocal areaName = accountInfo.gameAccountInfo.areaName\n\t\t\t\t\t\t\t\tlocal level = accountInfo.gameAccountInfo.characterLevel\n\n\t\t\t\t\t\t\t\tfor k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do if class == v then class = k end end\n\t\t\t\t\t\t\t\tif GetLocale() ~= \"enUS\" then\n\t\t\t\t\t\t\t\t\tfor k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do if class == v then class = k end end\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tclassc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class], GetQuestDifficultyColor(level)\n\t\t\t\t\t\t\t\tif not classc then\n\t\t\t\t\t\t\t\t\tclassc = {r = 1, g = 1, b = 1}\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tif UnitInParty(characterName) or UnitInRaid(characterName) then grouped = \" |cffaaaaaa*|r\" else grouped = \"\" end\n\t\t\t\t\t\t\t\tif accountInfo.gameAccountInfo.factionName ~= UnitFactionGroup(\"player\") then\n\t\t\t\t\t\t\t\t\tgrouped = \" |cffff0000*|r\"\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"%s (|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r%s) |cff%02x%02x%02x%s|r\", client, levelc.r * 255, levelc.g * 255, levelc.b * 255, level, classc.r * 255, classc.g * 255, classc.b * 255, characterName, grouped, 255, 0, 0, status), accountInfo.accountName, 238, 238, 238, 238, 238, 238)\n\t\t\t\t\t\t\t\tif self.altdown then\n\t\t\t\t\t\t\t\t\tif GetRealZoneText() == areaName then zone_r, zone_g, zone_b = 0.3, 1.0, 0.3 else zone_r, zone_g, zone_b = 0.65, 0.65, 0.65 end\n\t\t\t\t\t\t\t\t\tif GetRealmName() == realmName then realm_r, realm_g, realm_b = 0.3, 1.0, 0.3 else realm_r, realm_g, realm_b = 0.65, 0.65, 0.65 end\n\t\t\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(\"  \"..areaName, realmName, zone_r, zone_g, zone_b, realm_r, realm_g, realm_b)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif client == \"App\" then\n\t\t\t\t\t\t\t\t\tclient = accountInfo.gameAccountInfo.richPresence\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tclient = clientTags[client] or \"\"\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tif accountInfo.gameAccountInfo.isGameAFK then\n\t\t\t\t\t\t\t\t\tstatus = \"|cffE7E716\"..L_CHAT_AFK..\"|r\"\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif accountInfo.gameAccountInfo.isGameBusy then\n\t\t\t\t\t\t\t\t\t\tstatus = \"|cffff0000\"..L_CHAT_DND..\"|r\"\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tstatus = \"\"\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(\"|cffeeeeee\"..accountInfo.accountName..\"|r\"..\" \"..status, \"|cffeeeeee\"..client..\"|r\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tGameTooltip:Show()\n\t\t\telse\n\t\t\t\tHideTT(self)\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tGuild\n----------------------------------------------------------------------------------------\nif guild.enabled then\n\tlocal CURRENT_GUILD_SORTING\n\tlocal guildTable = {}\n\tlocal function BuildGuildTable()\n\t\twipe(guildTable)\n\t\tfor i = 1, GetNumGuildMembers() do\n\t\t\tlocal name, rank, _, level, _, zone, note, officernote, connected, status, class, _, _, mobile = GetGuildRosterInfo(i)\n\t\t\tif not name then break end\n\t\t\tname = Ambiguate(name, \"none\")\n\t\t\tguildTable[i] = {name, rank, level, zone, note, officernote, connected, status, class, mobile}\n\t\tend\n\t\ttable.sort(guildTable, function(a, b)\n\t\t\tif (a and b) then\n\t\t\t\treturn a[1] < b[1]\n\t\t\tend\n\t\tend)\n\tend\n\tInject(\"Guild\", {\n\t\ttext = {\n\t\t\tstring = function()\n\t\t\t\tif IsInGuild() then\n\t\t\t\t\tlocal total, _, online = GetNumGuildMembers()\n\t\t\t\t\treturn format(guild.fmt, online, total)\n\t\t\t\telse return LOOKINGFORGUILD end\n\t\t\tend, update = 5\n\t\t},\n\t\tOnLoad = function(self)\n\t\t\tC_GuildInfo.GuildRoster()\n\t\t\tSortGuildRoster(guild.sorting == \"note\" and \"rank\" or \"note\")\n\t\t\tSortGuildRoster(guild.sorting)\n\t\t\tCURRENT_GUILD_SORTING = guild.sorting\n\t\t\tself:RegisterEvent(\"GROUP_ROSTER_UPDATE\")\n\t\t\tself:RegisterEvent(\"GUILD_ROSTER_UPDATE\")\n\t\tend,\n\t\tOnEvent = function(self)\n\t\t\tif self.hovered then\n\t\t\t\tself:GetScript(\"OnEnter\")(self)\n\t\t\tend\n\t\t\tif IsInGuild() then\n\t\t\t\tBuildGuildTable()\n\t\t\tend\n\t\tend,\n\t\tOnUpdate = function(self, u)\n\t\t\tif IsInGuild() then\n\t\t\t\tAltUpdate(self)\n\t\t\t\tif not self.gmotd then\n\t\t\t\t\tif self.elapsed > 1 then C_GuildInfo.GuildRoster(); self.elapsed = 0 end\n\t\t\t\t\tif GetGuildRosterMOTD() ~= \"\" then self.gmotd = true; if self.hovered then self:GetScript(\"OnEnter\")(self) end end\n\t\t\t\t\tself.elapsed = self.elapsed + u\n\t\t\t\tend\n\t\t\tend\n\t\tend,\n\t\tOnClick = function(self, b)\n\t\t\tif b == \"LeftButton\" then\n\t\t\t\tToggleGuildFrame()\n\t\t\telseif b == \"MiddleButton\" and IsInGuild() then\n\t\t\t\tlocal s = CURRENT_GUILD_SORTING\n\t\t\t\tif IsShiftKeyDown() and s then\n\t\t\t\t\tSortGuildRoster(s)\n\t\t\t\telseif IsAltKeyDown() then\n\t\t\t\t\tCURRENT_GUILD_SORTING = s == \"rank\" and \"note\" or \"rank\"\n\t\t\t\t\tSortGuildRoster(CURRENT_GUILD_SORTING)\n\t\t\t\telse\n\t\t\t\t\tCURRENT_GUILD_SORTING = s == \"class\" and \"name\" or s == \"name\" and \"level\" or s == \"level\" and \"zone\" or \"class\"\n\t\t\t\t\tSortGuildRoster(CURRENT_GUILD_SORTING)\n\t\t\t\tend\n\t\t\t\tself:GetScript(\"OnEnter\")(self)\n\t\t\telseif b == \"RightButton\" and IsInGuild() then\n\t\t\t\tHideTT(self)\n\n\t\t\t\tlocal grouped\n\t\t\t\tlocal menuCountWhispers = 0\n\t\t\t\tlocal menuCountInvites = 0\n\n\t\t\t\tmenuList[2].menuList = {}\n\t\t\t\tmenuList[3].menuList = {}\n\n\t\t\t\tfor i = 1, #guildTable do\n\t\t\t\t\tif (guildTable[i][7] or guildTable[i][10]) and guildTable[i][1] ~= T.name then\n\t\t\t\t\t\tlocal classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[guildTable[i][9]], GetQuestDifficultyColor(guildTable[i][3])\n\t\t\t\t\t\tif UnitInParty(guildTable[i][1]) or UnitInRaid(guildTable[i][1]) then\n\t\t\t\t\t\t\tgrouped = \"|cffaaaaaa*|r\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tgrouped = \"\"\n\t\t\t\t\t\t\tif not guildTable[i][10] then\n\t\t\t\t\t\t\t\tmenuCountInvites = menuCountInvites + 1\n\t\t\t\t\t\t\t\tmenuList[2].menuList[menuCountInvites] = {\n\t\t\t\t\t\t\t\t\ttext = string.format(\"|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r %s\", levelc.r * 255, levelc.g * 255, levelc.b * 255, guildTable[i][3], classc.r * 255, classc.g * 255, classc.b * 255, Ambiguate(guildTable[i][1], \"all\"), \"\"),\n\t\t\t\t\t\t\t\t\targ1 = guildTable[i][1],\n\t\t\t\t\t\t\t\t\tnotCheckable = true,\n\t\t\t\t\t\t\t\t\tfunc = function(_, arg1)\n\t\t\t\t\t\t\t\t\t\tmenuFrame:Hide()\n\t\t\t\t\t\t\t\t\t\tC_PartyInfo.InviteUnit(arg1)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tmenuCountWhispers = menuCountWhispers + 1\n\t\t\t\t\t\tmenuList[3].menuList[menuCountWhispers] = {\n\t\t\t\t\t\t\ttext = string.format(\"|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r %s\", levelc.r * 255, levelc.g * 255, levelc.b * 255, guildTable[i][3], classc.r * 255, classc.g * 255, classc.b * 255, Ambiguate(guildTable[i][1], \"all\"), grouped),\n\t\t\t\t\t\t\targ1 = guildTable[i][1],\n\t\t\t\t\t\t\tnotCheckable = true,\n\t\t\t\t\t\t\tfunc = function(_, arg1)\n\t\t\t\t\t\t\t\tmenuFrame:Hide()\n\t\t\t\t\t\t\t\tSetItemRef(\"player:\"..arg1, (\"|Hplayer:%1$s|h[%1$s]|h\"):format(arg1), \"LeftButton\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tEasyMenu(menuList, menuFrame, self, 0, 0, \"MENU\")\n\t\t\tend\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tif IsInGuild() then\n\t\t\t\tself.hovered = true\n\t\t\t\tC_GuildInfo.GuildRoster()\n\t\t\t\tlocal name, rank, level, zone, note, officernote, connected, status, class, isMobile, zone_r, zone_g, zone_b, classc, levelc, grouped\n\t\t\t\tlocal total, _, online = GetNumGuildMembers()\n\t\t\t\tlocal gmotd = GetGuildRosterMOTD()\n\n\t\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\t\tGameTooltip:ClearAllPoints()\n\t\t\t\tGameTooltip:SetPoint(modules.Guild.tip_anchor, modules.Guild.tip_frame, modules.Guild.tip_x, modules.Guild.tip_y)\n\t\t\t\tGameTooltip:ClearLines()\n\t\t\t\tGameTooltip:AddDoubleLine(GetGuildInfo(P),format(\"%s: %d/%d\", GUILD_ONLINE_LABEL, online, total), tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b)\n\t\t\t\tif gmotd ~= \"\" then GameTooltip:AddLine(format(\"%s |cffaaaaaa- |cffffffff%s\", GUILD_MOTD, gmotd), ttsubh.r, ttsubh.g, ttsubh.b, 1) end\n\t\t\t\tif guild.maxguild ~= 0 and online >= 1 then\n\t\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\t\tfor i = 1, total do\n\t\t\t\t\t\tif guild.maxguild and i > guild.maxguild then\n\t\t\t\t\t\t\tif online > 2 then GameTooltip:AddLine(format(\"%d %s (%s)\", online - guild.maxguild, L_STATS_HIDDEN, ALT_KEY), ttsubh.r, ttsubh.g, ttsubh.b) end\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\t\tname, rank, _, level, _, zone, note, officernote, connected, status, class, _, _, isMobile = GetGuildRosterInfo(i)\n\t\t\t\t\t\tif (connected or isMobile) and level >= guild.threshold then\n\t\t\t\t\t\t\tname = Ambiguate(name, \"all\")\n\t\t\t\t\t\t\tif GetRealZoneText() == zone then zone_r, zone_g, zone_b = 0.3, 1, 0.3 else zone_r, zone_g, zone_b = 1, 1, 1 end\n\t\t\t\t\t\t\tif isMobile then zone = \"|cffa5a5a5\"..REMOTE_CHAT..\"|r\" end\n\t\t\t\t\t\t\tclassc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class], GetQuestDifficultyColor(level)\n\t\t\t\t\t\t\tgrouped = (UnitInParty(name) or UnitInRaid(name)) and (GetRealZoneText() == zone and \" |cff7fff00*|r\" or \" |cffff7f00*|r\") or \"\"\n\t\t\t\t\t\t\tif self.altdown then\n\t\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"%s%s |cff999999- |cffffffff%s\", grouped, name, rank), zone, classc.r, classc.g, classc.b, zone_r, zone_g, zone_b)\n\t\t\t\t\t\t\t\tif note ~= \"\" then GameTooltip:AddLine(\"   \"..NOTE_COLON..\" \"..note, ttsubh.r, ttsubh.g, ttsubh.b, 1) end\n\t\t\t\t\t\t\t\tif officernote ~= \"\" and EPGP then\n\t\t\t\t\t\t\t\t\tlocal ep, gp = EPGP:GetEPGP(name)\n\t\t\t\t\t\t\t\t\tif ep then\n\t\t\t\t\t\t\t\t\t\tofficernote = \"   EP: \"..ep..\"  GP: \"..gp..\"  PR: \"..string.format(\"%.3f\", ep / gp)\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tofficernote = \"   O.\"..NOTE_COLON..\" \"..officernote\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\telseif officernote ~= \"\" then\n\t\t\t\t\t\t\t\t\tofficernote = \"   O.\"..NOTE_COLON..\" \"..officernote\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tif officernote ~= \"\" then GameTooltip:AddLine(officernote, 0.3, 1, 0.3, 1) end\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif status == 1 then\n\t\t\t\t\t\t\t\t\tstatus = \" |cffE7E716\"..L_CHAT_AFK..\"|r\"\n\t\t\t\t\t\t\t\telseif status == 2 then\n\t\t\t\t\t\t\t\t\tstatus = \" |cffff0000\"..L_CHAT_DND..\"|r\"\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tstatus = \"\"\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"|cff%02x%02x%02x%d|r %s%s%s\", levelc.r * 255, levelc.g * 255, levelc.b * 255, level, name, status, grouped), zone, classc.r, classc.g, classc.b, zone_r, zone_g, zone_b)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\t\tGameTooltip:AddDoubleLine(\" \", format(\"%s %s\", L_STATS_SORTING_BY, CURRENT_GUILD_SORTING), 1, 1, 1, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\t\tend\n\t\t\t\tGameTooltip:Show()\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tDurability\n----------------------------------------------------------------------------------------\nif durability.enabled then\n\tInject(\"Durability\", {\n\t\tOnLoad = function(self)\n\t\t\tif durability.man then DurabilityFrame.Show = DurabilityFrame.Hide end\n\t\t\tRegEvents(self, \"UPDATE_INVENTORY_DURABILITY MERCHANT_SHOW PLAYER_LOGIN\")\n\t\tend,\n\t\tOnEvent = function(self, event)\n\t\t\tif event == \"UPDATE_INVENTORY_DURABILITY\" or event == \"PLAYER_LOGIN\" then\n\t\t\t\tlocal dmin = 100\n\t\t\t\tfor id = 1, 18 do\n\t\t\t\t\tlocal dur, dmax = GetInventoryItemDurability(id)\n\t\t\t\t\tif dur ~= dmax then dmin = floor(min(dmin, dur / dmax * 100)) end\n\t\t\t\tend\n\t\t\t\tself.text:SetText(format(gsub(durability.fmt, \"%[color%]\", (gradient(dmin / 100))), dmin))\n\t\t\telseif event == \"MERCHANT_SHOW\" and not (IsAltKeyDown() or IsShiftKeyDown()) then\n\t\t\t\tif conf.AutoRepair and CanMerchantRepair() then\n\t\t\t\t\tlocal cost, total = GetRepairAllCost(), 0\n\t\t\t\t\tif cost > 0 then\n\t\t\t\t\t\tif conf.AutoGuildRepair and CanGuildBankRepair() then RepairAllItems(1) total = cost end\n\t\t\t\t\t\tif GetRepairAllCost() > 0 then\n\t\t\t\t\t\t\tif not durability.ignore_inventory and GetRepairAllCost() <= GetMoney() then\n\t\t\t\t\t\t\t\ttotal = GetRepairAllCost(); RepairAllItems()\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tfor id = 1, 18 do\n\t\t\t\t\t\t\t\t\tlocal data = C_TooltipInfo.GetInventoryItem(P, id)\n\t\t\t\t\t\t\t\t\tif data then\n\t\t\t\t\t\t\t\t\t\tlocal argVal = data.args and data.args[7]\n\t\t\t\t\t\t\t\t\t\tif argVal and argVal.field == \"repairCost\" then\n\t\t\t\t\t\t\t\t\t\t\tlocal cost = argVal.intVal\n\t\t\t\t\t\t\t\t\t\t\tif cost ~= 0 and cost <= GetMoney() then\n\t\t\t\t\t\t\t\t\t\t\t\tif not InRepairMode() then ShowRepairCursor() end\n\t\t\t\t\t\t\t\t\t\t\t\tPickupInventoryItem(id)\n\t\t\t\t\t\t\t\t\t\t\t\ttotal = total + cost\n\t\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tHideRepairCursor()\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif total > 0 then print(format(\"|cff66C6FF%s |cffFFFFFF%s\", REPAIR_COST, formatgold(1, total))) end\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\tGameTooltip:ClearAllPoints()\n\t\t\tGameTooltip:SetPoint(modules.Durability.tip_anchor, modules.Durability.tip_frame, modules.Durability.tip_x, modules.Durability.tip_y)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tif C.tooltip.average_lvl == true then\n\t\t\t\tlocal avgItemLevel, avgItemLevelEquipped = GetAverageItemLevel()\n\t\t\t\tavgItemLevel = floor(avgItemLevel)\n\t\t\t\tavgItemLevelEquipped = floor(avgItemLevelEquipped)\n\t\t\t\tGameTooltip:AddDoubleLine(DURABILITY, STAT_AVERAGE_ITEM_LEVEL..\": \"..avgItemLevelEquipped..\" / \"..avgItemLevel, tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b)\n\t\t\telse\n\t\t\t\tGameTooltip:AddLine(DURABILITY, tthead.r, tthead.g, tthead.b)\n\t\t\tend\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tlocal nodur, totalcost = true, 0\n\t\t\tfor slot, string in gmatch(\"1HEAD3SHOULDER5CHEST6WAIST7LEGS8FEET9WRIST10HANDS16MAINHAND17SECONDARYHAND\", \"(%d+)([^%d]+)\") do\n\t\t\t\tlocal dur, dmax = GetInventoryItemDurability(slot)\n\t\t\t\tlocal string = _G[string..\"SLOT\"]\n\t\t\t\tif dur ~= dmax then\n\t\t\t\t\tlocal perc = dur ~= 0 and dur/dmax or 0\n\t\t\t\t\tlocal hex = gradient(perc)\n\t\t\t\t\tGameTooltip:AddDoubleLine(durability.gear_icons and format(\"|T%s:\"..t_icon..\":\"..t_icon..\":0:0:64:64:5:59:5:59:%d|t %s\", GetInventoryItemTexture(P, slot), t_icon, string) or string,format(\"|cffaaaaaa%s/%s | %s%s%%\", dur, dmax, hex, floor(perc * 100)), 1, 1, 1)\n\t\t\t\t\tlocal data = C_TooltipInfo.GetInventoryItem(P, slot)\n\t\t\t\t\tif data then\n\t\t\t\t\t\tlocal argVal = data.args and data.args[7]\n\t\t\t\t\t\tif argVal and argVal.field == \"repairCost\" then\n\t\t\t\t\t\t\ttotalcost = totalcost + argVal.intVal\n\t\t\t\t\t\t\tif totalcost > 0 then\n\t\t\t\t\t\t\t\tnodur = false\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif nodur then\n\t\t\t\tGameTooltip:AddLine(\"100%\", 0.1, 1, 0.1)\n\t\t\telse\n\t\t\t\tGameTooltip:AddDoubleLine(\" \", \"--------------\", 1, 1, 1, 0.5, 0.5, 0.5)\n\t\t\t\tGameTooltip:AddDoubleLine(REPAIR_COST, formatgold(1, totalcost), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tend\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddDoubleLine(\" \", L_STATS_AUTO_REPAIR..\": \"..(conf.AutoRepair and \"|cff55ff55\"..L_STATS_ON or \"|cffff5555\"..strupper(OFF)), 1, 1, 1, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\tGameTooltip:AddDoubleLine(\" \", L_STATS_GUILD_REPAIR..\": \"..(conf.AutoGuildRepair and \"|cff55ff55\"..L_STATS_ON or \"|cffff5555\"..strupper(OFF)), 1, 1, 1, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\tGameTooltip:Show()\n\t\tend,\n\t\tOnClick = function(self, button)\n\t\t\tif button == \"RightButton\" then\n\t\t\t\tconf.AutoRepair = not conf.AutoRepair\n\t\t\t\tself:GetScript(\"OnEnter\")(self)\n\t\t\telseif button == \"MiddleButton\" then\n\t\t\t\tconf.AutoGuildRepair = not conf.AutoGuildRepair\n\t\t\t\tself:GetScript(\"OnEnter\")(self)\n\t\t\telseif C_EquipmentSet.GetNumEquipmentSets() > 0 and button == \"LeftButton\" and (IsAltKeyDown() or IsShiftKeyDown()) then\n\t\t\t\tlocal menulist = {{isTitle = true, notCheckable = 1, text = format(gsub(EQUIPMENT_SETS, \":\", \"\"), \"\")}}\n\t\t\t\tif C_EquipmentSet.GetNumEquipmentSets() == 0 then\n\t\t\t\t\ttinsert(menulist, {text = NONE, notCheckable = 1, disabled = true})\n\t\t\t\telse\n\t\t\t\t\tfor _, eSetID in pairs(C_EquipmentSet.GetEquipmentSetIDs()) do\n\t\t\t\t\t\tlocal name, icon, setID = C_EquipmentSet.GetEquipmentSetInfo(eSetID)\n\t\t\t\t\t\tif not icon then icon = 134400 end\n\t\t\t\t\t\ttinsert(menulist, {text = format(\"|T%s:\"..t_icon..\":\"..t_icon..\":0:0:64:64:5:59:5:59:%d|t %s\", icon, t_icon, name), notCheckable = 1, func = function() if InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end EquipmentManager_EquipSet(setID) end})\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tEasyMenu(menulist, LSMenus, \"cursor\", 0, 0, \"MENU\")\n\t\t\telseif button == \"LeftButton\" then\n\t\t\t\tToggleCharacter(\"PaperDollFrame\")\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tExperience/Played/Rep\n----------------------------------------------------------------------------------------\nif experience.enabled then\n\tlocal logintime, playedtotal, playedlevel, playedmsg, gained, lastkill, lastquest = GetTime(), 0, 0, 0, 0\n\tlocal repname, repcolor, standingname, currep, minrep, maxrep\n\tlocal mobxp = gsub(COMBATLOG_XPGAIN_FIRSTPERSON, \"%%[sd]\", \"(.*)\")\n\tlocal questxp = gsub(COMBATLOG_XPGAIN_FIRSTPERSON_UNNAMED, \"%%[sd]\", \"(.*)\")\n\tlocal function short(num, tt)\n\t\tif short or tt then\n\t\t\tnum = tonumber(num)\n\t\t\tif num >= 1e11 then\n\t\t\t\treturn (\"%.0f%s\"):format(num / 1e9, experience.billion or \"b\")\n\t\t\telseif num >= 1e10 then\n\t\t\t\treturn (\"%.1f%s\"):format(num / 1e9, experience.billion or \"b\"):gsub(\"%.?0+([km])$\", \"%1\")\n\t\t\telseif num >= 1e9 then\n\t\t\t\treturn (\"%.2f%s\"):format(num / 1e9, experience.billion or \"b\"):gsub(\"%.?0+([km])$\", \"%1\")\n\t\t\telseif num >= 1e8 then\n\t\t\t\treturn (\"%.0f%s\"):format(num / 1e6, experience.million or \"m\")\n\t\t\telseif num >= 1e7 then\n\t\t\t\treturn (\"%.1f%s\"):format(num / 1e6, experience.million or \"m\"):gsub(\"%.?0+([km])$\", \"%1\")\n\t\t\telseif num >= 1e6 then\n\t\t\t\treturn (\"%.2f%s\"):format(num / 1e6, experience.million or \"m\"):gsub(\"%.?0+([km])$\", \"%1\")\n\t\t\telseif num >= 1e5 then\n\t\t\t\treturn (\"%.0f%s\"):format(num / 1e3, experience.thousand or \"k\")\n\t\t\telseif num >= 1e3 then\n\t\t\t\treturn (\"%.1f%s\"):format(num / 1e3, experience.thousand or \"k\"):gsub(\"%.?0+([km])$\", \"%1\")\n\t\t\tend\n\t\tend\n\t\treturn floor(tonumber(num))\n\tend\n\tlocal function tags(sub,tt)\n\t\tlocal t = experience\n\t\t\t-- exp tags\n\t\treturn sub == \"level\" and UnitLevel(P)\n\t\t\tor sub == \"curxp\" and short(UnitXP(P),tt)\n\t\t\tor sub == \"remainingxp\" and short(UnitXPMax(P) - UnitXP(P), tt)\n\t\t\tor sub == \"totalxp\" and short(UnitXPMax(P), tt)\n\t\t\tor sub == \"cur%\" and floor(UnitXP(P) / UnitXPMax(P) * 100)\n\t\t\tor sub == \"remaining%\" and 100 - floor(UnitXP(P) / UnitXPMax(P) * 100)\n\t\t\tor sub == \"restxp\" and short(GetXPExhaustion() or 0,tt)\n\t\t\tor sub == \"rest%\" and min(150, floor((GetXPExhaustion() or 0) / UnitXPMax(P) * 100))\n\t\t\tor sub == \"sessiongained\" and short(gained,tt)\n\t\t\tor sub == \"sessionrate\" and short(gained / (GetTime() - playedmsg) * 3600, tt)\n\t\t\tor sub == \"levelrate\" and short(UnitXP(P) / (playedlevel + GetTime() - playedmsg) * 3600, tt)\n\t\t\tor sub == \"sessionttl\" and (gained ~= 0 and fmttime((UnitXPMax(P) - UnitXP(P)) / (gained / (GetTime() - playedmsg)), t) or L_STATS_INF)\n\t\t\tor sub == \"levelttl\" and (UnitXP(P) ~= 0 and fmttime((UnitXPMax(P) - UnitXP(P)) / (UnitXP(P) / (playedlevel + GetTime() - playedmsg)), t) or L_STATS_INF)\n\t\t\tor sub == \"questsleft\" and (lastquest and ceil((UnitXPMax(P) - UnitXP(P)) / tonumber(lastquest)) or \"??\")\n\t\t\tor sub == \"killsleft\" and (lastkill and ceil((UnitXPMax(P) - UnitXP(P)) / tonumber(lastkill)) or \"??\")\n\t\t\t-- time played tags\n\t\t\tor sub == \"playedtotal\" and fmttime(playedtotal + GetTime() - playedmsg, t)\n\t\t\tor sub == \"playedlevel\" and fmttime(playedlevel + GetTime() - playedmsg, t)\n\t\t\tor sub == \"playedsession\" and fmttime(GetTime() - logintime,t)\n\t\t\t-- rep tags\n\t\t\tor sub == \"repname\" and (t.faction_subs[repname] or T.UTF(repname, 25, true))\n\t\t\tor sub == \"repcolor\" and \"|cff\"..repcolor\n\t\t\tor sub == \"standing\" and standingname\n\t\t\tor sub == \"currep\" and (currep ~= maxrep and abs(currep - minrep) or currep > 0 and 1 or 0)\n\t\t\tor sub == \"repleft\" and abs(maxrep - currep)\n\t\t\tor sub == \"maxrep\" and (currep ~= maxrep and abs(maxrep - minrep) or maxrep > 0 and 1 or 0)\n\t\t\tor sub == \"rep%\" and (currep ~= 0 and floor(abs(currep - minrep) / abs(maxrep - minrep) * 100) or 0)\n\t\t\tor format(\"[%s]\", sub)\n\tend\n\tInject(\"Experience\", {\n\t\ttext = {\n\t\t\tstring = function(self)\n\t\t\t\tif conf.ExpMode == \"rep\" then\n\t\t\t\t\treturn self:GetText()\n\t\t\t\telseif conf.ExpMode == \"played\" then\n\t\t\t\t\treturn gsub(experience.played_fmt, \"%[([%w%%]-)%]\", tags)\n\t\t\t\telseif conf.ExpMode == \"xp\" then\n\t\t\t\t\treturn gsub(experience[format(\"xp_%s_fmt\", (GetXPExhaustion() or 0) > 0 and \"rested\" or \"normal\")], \"%[([%w%%]-)%]\", tags) or \" \"\n\t\t\t\tend\n\t\t\tend\n\t\t},\n\t\tOnLoad = function(self)\n\t\t\tRegEvents(self, \"TIME_PLAYED_MSG PLAYER_LOGOUT PLAYER_LOGIN UPDATE_FACTION CHAT_MSG_COMBAT_XP_GAIN PLAYER_LEVEL_UP\")\n\t\t\t-- Filter first time played message\n\t\t\tlocal ofunc = ChatFrame_DisplayTimePlayed\n\t\t\tfunction ChatFrame_DisplayTimePlayed() ChatFrame_DisplayTimePlayed = ofunc end\n\t\t\tRequestTimePlayed()\n\t\t\tif not conf.ExpMode or conf.ExpMode == \"xp\" or conf.ExpMode == \"art\" then\n\t\t\t\tconf.ExpMode = UnitLevel(P) ~= MAX_PLAYER_LEVEL and \"xp\" or \"played\"\n\t\t\tend\n\t\tend,\n\t\tOnEvent = function(self, event, ...)\n\t\t\tif event == \"CHAT_MSG_COMBAT_XP_GAIN\" then\n\t\t\t\tlocal msg = ...\n\t\t\t\tif msg:find(mobxp) then\n\t\t\t\t\t_, lastkill = strmatch(msg, mobxp)\n\t\t\t\t\tlastkill = strmatch(lastkill, \"%d+\")\n\t\t\t\t\tgained = gained + lastkill\n\t\t\t\telseif msg:find(questxp) then\n\t\t\t\t\tlastquest = strmatch(msg, questxp)\n\t\t\t\t\tlastquest = strmatch(lastquest, \"%d+\")\n\t\t\t\t\tgained = gained + lastquest\n\t\t\t\tend\n\t\t\telseif event == \"PLAYER_LEVEL_UP\" then\n\t\t\t\tplayedlevel, playedmsg = 0, GetTime()\n\t\t\telseif event == \"TIME_PLAYED_MSG\" then\n\t\t\t\tplayedtotal, playedlevel = ...\n\t\t\t\tplayedmsg = GetTime()\n\t\t\telseif (event == \"UPDATE_FACTION\" or event == \"PLAYER_LOGIN\") and conf.ExpMode == \"rep\" then\n\t\t\t\tlocal standing, factionID, standingText\n\t\t\t\trepname, standing, minrep, maxrep, currep, factionID = GetWatchedFactionInfo()\n\t\t\t\tlocal reputationInfo = C_GossipInfo.GetFriendshipReputation(factionID)\n\t\t\t\tlocal friendshipID = reputationInfo and reputationInfo.friendshipFactionID\n\t\t\t\tif friendshipID and friendshipID > 0 then\n\t\t\t\t\tlocal rankInfo = C_GossipInfo.GetFriendshipReputationRanks(factionID)\n\t\t\t\t\tlocal currentRank = rankInfo and rankInfo.currentLevel\n\t\t\t\t\tlocal maxRank = rankInfo and rankInfo.maxLevel\n\t\t\t\t\tlocal rankText\n\t\t\t\t\tif currentRank and maxRank and currentRank > 0 and maxRank > 0 then\n\t\t\t\t\t\trankText = (' %s / %s'):format(currentRank, maxRank)\n\t\t\t\t\tend\n\t\t\t\t\tlocal repInfo = C_GossipInfo.GetFriendshipReputation(factionID)\n\t\t\t\t\tstandingText = repInfo.reaction..rankText\n\t\t\t\t\tif repInfo.nextThreshold then\n\t\t\t\t\t\tminrep, maxrep, currep = repInfo.reactionThreshold, repInfo.nextThreshold, repInfo.standing\n\t\t\t\t\telse\n\t\t\t\t\t\tminrep, maxrep, currep = 0, 1, 1\n\t\t\t\t\tend\n\t\t\t\t\tstanding = 5\n\t\t\t\telseif C_Reputation.IsMajorFaction(factionID) then\n\t\t\t\t\tlocal majorFactionData = C_MajorFactions.GetMajorFactionData(factionID)\n\t\t\t\t\tminrep, maxrep = 0, majorFactionData.renownLevelThreshold\n\t\t\t\t\tcurrep = C_MajorFactions.HasMaximumRenown(factionID) and majorFactionData.renownLevelThreshold or majorFactionData.renownReputationEarned or 0\n\t\t\t\t\tstanding = 7\n\t\t\t\t\tstandingText = RENOWN_LEVEL_LABEL..majorFactionData.renownLevel\n\t\t\t\telse\n\t\t\t\t\tlocal value, nextThreshold = C_Reputation.GetFactionParagonInfo(factionID)\n\t\t\t\t\tif value then\n\t\t\t\t\t\tcurrep = value % nextThreshold\n\t\t\t\t\t\tminrep = 0\n\t\t\t\t\t\tmaxrep = nextThreshold\n\t\t\t\t\t\tstanding = 8\n\t\t\t\t\t\tstandingText = PARAGON\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif not repname then repname = NONE end\n\t\t\t\tlocal color = {}\n\t\t\t\tif standing == 0 then\n\t\t\t\t\tcolor.r, color.g, color.b = GetItemQualityColor(0)\n\t\t\t\telseif standing == 7 then\n\t\t\t\t\tcolor.r, color.g, color.b = GetItemQualityColor(3)\n\t\t\t\telseif standing == 8 then\n\t\t\t\t\tcolor.r, color.g, color.b = GetItemQualityColor(4)\n\t\t\t\telse\n\t\t\t\t\tcolor = FACTION_BAR_COLORS[standing]\n\t\t\t\tend\n\t\t\t\tstandingname = standingText or _G[format(\"FACTION_STANDING_LABEL%s%s\", standing, UnitSex(P) == 3 and \"_FEMALE\" or \"\")]\n\t\t\t\tif not standingname then standingname = UNKNOWN end\n\t\t\t\trepcolor = format(\"%02x%02x%02x\", min(color.r * 255 + 40, 255), min(color.g * 255 + 40, 255), min(color.b * 255 + 40, 255))\n\t\t\t\tself.text:SetText(gsub(experience.faction_fmt, \"%[([%w%%]-)%]\", tags))\n\t\t\tend\n\t\t\tif event == \"PLAYER_LOGOUT\" or event == \"TIME_PLAYED_MSG\" then\n\t\t\t\tconf.Played = floor(playedtotal + GetTime() - playedmsg)\n\t\t\tend\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tself.hovered = true\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\tGameTooltip:ClearAllPoints()\n\t\t\tGameTooltip:SetPoint(modules.Experience.tip_anchor, modules.Experience.tip_frame, modules.Experience.tip_x, modules.Experience.tip_y)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tif conf.ExpMode == \"played\" then\n\t\t\t\tGameTooltip:AddLine(TIME_PLAYED_MSG, tthead.r, tthead.g, tthead.b)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_PLAYED_SESSION, tags(\"playedsession\", 1), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_PLAYED_LEVEL, tags(\"playedlevel\", 1), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\tGameTooltip:AddLine(L_STATS_ACC_PLAYED, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\t\tlocal total = 0\n\t\t\t\tfor realm, t in pairs(ShestakUIStats) do\n\t\t\t\t\tfor name, conf in pairs(t) do\n\t\t\t\t\t\tif conf.Played then\n\t\t\t\t\t\t\tlocal r, g, b, player = 1, 1, 1\n\t\t\t\t\t\t\tif name == UnitName(P) and realm == GetRealmName() then\n\t\t\t\t\t\t\t\tconf.Played, player, r, g, b = floor(playedtotal + GetTime() - playedmsg), true, 0.5, 1, 0.5\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif conf.Played > 3600 or player then -- 1hr threshold displayed\n\t\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"%s-%s\", name, realm), fmttime(conf.Played), r, g, b, 1, 1, 1)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\ttotal = total + conf.Played\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tGameTooltip:AddDoubleLine(\" \", \"------------------\", 1, 1, 1, 0.5, 0.5, 0.5)\n\t\t\t\tGameTooltip:AddDoubleLine(TOTAL, fmttime(total), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\telseif conf.ExpMode == \"xp\" then\n\t\t\t\tGameTooltip:AddDoubleLine(COMBAT_XP_GAIN, format(LEVEL_GAINED, UnitLevel(P)), tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_CURRENT_XP, format(\"%s/%s (%s%%)\", tags\"curxp\", tags\"totalxp\", tags\"cur%\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_REMAINING_XP, format(\"%s (%s%%)\", tags\"remainingxp\", tags\"remaining%\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tif GetXPExhaustion() and GetXPExhaustion() ~= 0 then\n\t\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_RESTED_XP, format(\"%s (%s%%)\", tags\"restxp\", tags\"rest%\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tend\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_SESSION_XP, format(\"%s/%s (%s)\", tags\"sessionrate\", L_STATS_HR, tags\"sessionttl\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_XP_RATE, format(\"%s/%s (%s)\", tags\"levelrate\", L_STATS_HR, tags\"levelttl\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(format(L_STATS_QUESTS_TO, UnitLevel(P) + 1), format(\"%s:%s %s:%s\", L_STATS_QUEST, tags\"questsleft\", L_STATS_KILLS, tags\"killsleft\"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_PLAYED_SESSION, tags\"playedsession\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_PLAYED_LEVEL, tags\"playedlevel\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_PLAYED_TOTAL, tags\"playedtotal\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\telseif conf.ExpMode == \"rep\" then\n\t\t\t\tif repname == NONE then GameTooltip:Hide() return end\n\t\t\t\tlocal desc, war, watched\n\t\t\t\tfor i = 1, GetNumFactions() do\n\t\t\t\t\t_, desc, _, _, _, _, war, _, _, _, _, watched = GetFactionInfo(i)\n\t\t\t\t\tif watched then break end\n\t\t\t\tend\n\t\t\t\tGameTooltip:AddLine(repname, tthead.r, tthead.g, tthead.b)\n\t\t\t\tGameTooltip:AddLine(desc, ttsubh.r, ttsubh.g, ttsubh.b, 1)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\tGameTooltip:AddDoubleLine(format(\"%s%s\", tags\"repcolor\", tags\"standing\"), war and format(\"|cffff5555%s\", AT_WAR))\n\t\t\t\tif currep ~= maxrep then\n\t\t\t\t\tGameTooltip:AddDoubleLine(format(\"%s%% | %s/%s\", tags\"rep%\", tags\"currep\", tags\"maxrep\"), -tags\"repleft\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 0.33, 0.33)\n\t\t\t\tend\n\t\t\tend\n\t\t\tGameTooltip:Show()\n\t\tend,\n\t\tOnClick = function(self, button)\n\t\t\tif button == \"RightButton\" then\n\t\t\t\tconf.ExpMode = conf.ExpMode == \"xp\" and \"played\"\n\t\t\t\t\tor conf.ExpMode == \"played\" and \"rep\"\n\t\t\t\t\tor (conf.ExpMode == \"rep\" and UnitLevel(P) ~= MAX_PLAYER_LEVEL) and \"xp\"\n\t\t\t\t\tor conf.ExpMode == \"rep\" and \"played\"\n\t\t\t\tif conf.ExpMode == \"rep\" then\n\t\t\t\t\tself:GetScript(\"OnEvent\")(self, \"UPDATE_FACTION\")\n\t\t\t\telse\n\t\t\t\t\tself:GetScript(\"OnUpdate\")(self, 5)\n\t\t\t\tend\n\t\t\t\tself:GetScript(\"OnEnter\")(self)\n\t\t\telseif button == \"LeftButton\" then\n\t\t\t\tif conf.ExpMode == \"rep\" then\n\t\t\t\t\tToggleCharacter(\"ReputationFrame\")\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tTalents\n----------------------------------------------------------------------------------------\nif talents.enabled then\n\tlocal lootSpecName, specName\n\tlocal specList = {\n\t\t{text = SPECIALIZATION, isTitle = true, notCheckable = true},\n\t\t{notCheckable = true},\n\t\t{notCheckable = true},\n\t\t{notCheckable = true},\n\t\t{notCheckable = true}\n\t}\n\tlocal lootList = {\n\t\t{text = SELECT_LOOT_SPECIALIZATION, isTitle = true, notCheckable = true},\n\t\t{notCheckable = true, func = function() SetLootSpecialization(0) end},\n\t\t{notCheckable = true},\n\t\t{notCheckable = true},\n\t\t{notCheckable = true},\n\t\t{notCheckable = true}\n\t}\n\tInject(\"Talents\", {\n\t\tOnLoad = function(self)\n\t\t\tself.text2 = self:CreateFontString(nil, \"OVERLAY\")\n\t\t\tself.text2:SetFont(self.text:GetFont())\n\t\t\tself.text2:SetPoint(\"LEFT\", self.text, \"RIGHT\", 0, -1)\n\n\t\t\tself.text3 = self:CreateFontString(nil, \"OVERLAY\")\n\t\t\tself.text3:SetFont(self.text:GetFont())\n\t\t\tself.text3:SetPoint(\"LEFT\", self.text2, \"RIGHT\", 0, 1)\n\n\t\t\tself.text4 = self:CreateFontString(nil, \"OVERLAY\")\n\t\t\tself.text4:SetFont(self.text:GetFont())\n\t\t\tself.text4:SetPoint(\"LEFT\", self.text3, \"RIGHT\", 0, -1)\n\n\t\t\tself.globalFrame = CreateFrame(\"Frame\", self)\n\t\t\tself.globalFrame:SetPoint(\"TOPLEFT\", self.text)\n\t\t\tself.globalFrame:SetPoint(\"BOTTOMRIGHT\", self.text4)\n\n\t\t\tself.globalFrame:SetScript(\"OnEnter\", function()\n\t\t\t\tself:GetScript(\"OnEnter\")(self)\n\t\t\tend)\n\n\t\t\tself.globalFrame:SetScript(\"OnLeave\", function()\n\t\t\t\tself:GetScript(\"OnLeave\")(self)\n\t\t\tend)\n\n\t\t\tself.globalFrame:SetScript(\"OnMouseUp\", function(_, b)\n\t\t\t\tself:GetScript(\"OnMouseUp\")(self, b)\n\t\t\tend)\n\n\t\t\tRegEvents(self, \"PLAYER_ENTERING_WORLD PLAYER_TALENT_UPDATE PLAYER_LOOT_SPEC_UPDATED\")\n\t\tend,\n\t\tOnEvent = function(self)\n\t\t\tif UnitLevel(P) < 10 then\n\t\t\t\tself.text:SetText(format(\"%s %s\", NO, SPECIALIZATION))\n\t\t\t\treturn\n\t\t\tend\n\n\t\t\tlocal lootSpec = GetLootSpecialization()\n\t\t\tlocal spec = GetSpecialization()\n\n\t\t\tlootSpecName = lootSpec and select(2, GetSpecializationInfoByID(lootSpec)) or NO\n\t\t\tspecName = spec and select(2, GetSpecializationInfo(spec)) or NO\n\n\t\t\tlocal specText = L_STATS_SPEC..\":\"\n\t\t\tlocal specIcon, lootIcon = \"\", \"\"\n\t\t\tlocal lootText = LOOT..\":\"\n\n\t\t\tlocal _, _, _, specTex = GetSpecializationInfo(spec)\n\t\t\tlocal texSize = 14\n\t\t\tif specTex then\n\t\t\t\tspecIcon = format(\"|T%s:\"..texSize..\":\"..texSize..\":0:0:64:64:5:59:5:59|t\", specTex)\n\t\t\tend\n\n\t\t\tif lootSpec == 0 then\n\t\t\t\tspecText = \"|cff55ff55\"..specText..\"|r\"\n\t\t\t\tlootText = \"\"\n\t\t\t\tlootSpecName = \"|cff55ff55\"..specName..\"|r\"\n\t\t\telse\n\t\t\t\tlocal _, _, _, texture = GetSpecializationInfoByID(lootSpec)\n\t\t\t\tif texture then\n\t\t\t\t\tlootIcon = format(\"|T%s:\"..texSize..\":\"..texSize..\":0:0:64:64:5:59:5:59|t\", texture)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tself.text:SetText(specText)\n\t\t\tself.text2:SetText(specIcon..\" \")\n\t\t\tself.text3:SetText(lootText)\n\t\t\tself.text4:SetText(lootIcon)\n\n\t\t\tif self.hovered then self:GetScript(\"OnEnter\")(self) end\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tself.hovered = true\n\t\t\tif UnitLevel(P) >= 10 then\n\t\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\t\tGameTooltip:ClearAllPoints()\n\t\t\t\tGameTooltip:SetPoint(modules.Talents.tip_anchor, modules.Talents.tip_frame, modules.Talents.tip_x, modules.Talents.tip_y)\n\t\t\t\tGameTooltip:ClearLines()\n\t\t\t\tGameTooltip:AddLine(SPECIALIZATION..\" \"..ENCHANT_CONDITION_AND..LOOT, tthead.r, tthead.g, tthead.b)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\tGameTooltip:AddDoubleLine(SPECIALIZATION, specName, ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(LOOT, lootSpecName, ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:Show()\n\t\t\tend\n\t\tend,\n\t\tOnLeave = function(self)\n\t\t\tself.hovered = false\n\t\tend,\n\t\tOnClick = function(self, b)\n\t\t\tif UnitLevel(P) < 10 then\n\t\t\t\tprint(\"|cffffff00\"..format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10)..\"|r\")\n\t\t\t\treturn\n\t\t\tend\n\t\t\tif b == \"LeftButton\" then\n\t\t\t\tif IsShiftKeyDown() then\n\t\t\t\t\tToggleTalentFrame()\n\t\t\t\telse\n\t\t\t\t\tfor index = 1, 4 do\n\t\t\t\t\t\tlocal id, name, _, texture = GetSpecializationInfo(index)\n\t\t\t\t\t\tif id then\n\t\t\t\t\t\t\tif GetSpecializationInfo(GetSpecialization()) == id then\n\t\t\t\t\t\t\t\tname = \"|cff55ff55\"..name..\"|r\"\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tspecList[index + 1].text = format(\"|T%s:\"..t_icon..\":\"..t_icon..\":0:0:64:64:5:59:5:59|t  %s\", texture, name)\n\t\t\t\t\t\t\tspecList[index + 1].func = function() SetSpecialization(index) end\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tspecList[index + 1] = nil\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tEasyMenu(specList, LSMenus, self, 0, 24, \"MENU\")\n\t\t\t\tend\n\t\t\telseif b == \"RightButton\" and GetSpecialization() then\n\t\t\t\tlocal lootSpec = GetLootSpecialization()\n\t\t\t\tlocal _, specName = GetSpecializationInfo(GetSpecialization())\n\t\t\t\tlocal specDefault = format(LOOT_SPECIALIZATION_DEFAULT, specName)\n\t\t\t\tif lootSpec == 0 then\n\t\t\t\t\tspecDefault = \"|cff55ff55\"..format(LOOT_SPECIALIZATION_DEFAULT, specName)..\"|r\"\n\t\t\t\tend\n\t\t\t\tlootList[2].text = specDefault\n\t\t\t\tfor index = 1, 4 do\n\t\t\t\t\tlocal id, name, _, texture = GetSpecializationInfo(index)\n\t\t\t\t\tif id then\n\t\t\t\t\t\tif lootSpec == id then\n\t\t\t\t\t\t\tname = \"|cff55ff55\"..name..\"|r\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlootList[index + 2].text = format(\"|T%s:\"..t_icon..\":\"..t_icon..\":0:0:64:64:5:59:5:59|t  %s\", texture, name)\n\t\t\t\t\t\tlootList[index + 2].func = function() SetLootSpecialization(id) end\n\t\t\t\t\telse\n\t\t\t\t\t\tlootList[index + 2] = nil\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tEasyMenu(lootList, LSMenus, self, 0, 40, \"MENU\")\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tCoordinates\n----------------------------------------------------------------------------------------\nif coords.enabled then\n\tInject(\"Coords\", {\n\t\ttext = {string = Coords},\n\t\tOnClick = function()\n\t\t\tif IsShiftKeyDown() then\n\t\t\t\tChatEdit_ActivateChat(ChatEdit_ChooseBoxForSend())\n\t\t\t\tChatEdit_ChooseBoxForSend():Insert(format(\" (%s: %s)\", GetZoneText(), Coords()))\n\t\t\telse\n\t\t\t\tToggleFrame(WorldMapFrame)\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tLocation\n----------------------------------------------------------------------------------------\nif location.enabled then\n\tInject(\"Location\", {\n\t\tOnLoad = function(self)\n\t\t\tRegEvents(self, \"ZONE_CHANGED ZONE_CHANGED_INDOORS ZONE_CHANGED_NEW_AREA PLAYER_ENTERING_WORLD\")\n\t\t\tself.sanctuary = {SANCTUARY_TERRITORY, {0.41, 0.8, 0.94}}\n\t\t\tself.arena = {FREE_FOR_ALL_TERRITORY, {1, 0.1, 0.1}}\n\t\t\tself.friendly = {FACTION_CONTROLLED_TERRITORY, {0.1, 1, 0.1}}\n\t\t\tself.hostile = {FACTION_CONTROLLED_TERRITORY, {1, 0.1, 0.1}}\n\t\t\tself.contested = {CONTESTED_TERRITORY, {1, 0.7, 0}}\n\t\t\tself.combat = {COMBAT_ZONE, {1, 0.1, 0.1}}\n\t\t\tself.neutral = {\"\", {1, 0.93, 0.76}}\n\t\tend,\n\t\tOnEvent = function(self)\n\t\t\tself.subzone, self.zone, self.pvp = GetSubZoneText(), GetZoneText(), {GetZonePVPInfo()}\n\t\t\tif not self.pvp[1] then self.pvp[1] = \"neutral\" end\n\t\t\tlocal label = (self.subzone ~= \"\" and location.subzone) and self.subzone or self.zone\n\t\t\tlocal r, g, b = unpack(self.pvp[1] and (self[self.pvp[1]][2] or self.other) or self.other)\n\t\t\tself.text:SetText(location.truncate == 0 and label or strtrim(strsub(label, 1, location.truncate)))\n\t\t\tself.text:SetTextColor(r, g, b, font.alpha)\n\t\tend,\n\t\tOnUpdate = function(self, u)\n\t\t\tif self.hovered then\n\t\t\t\tself.elapsed = self.elapsed + u\n\t\t\t\tif self.elapsed > 1 or self.init then\n\t\t\t\t\tGameTooltip:ClearLines()\n\t\t\t\t\tGameTooltip:AddLine(format(\"%s |cffffffff(%s)\", self.zone, Coords()), tthead.r, tthead.g, tthead.b, 1, 1, 1)\n\t\t\t\t\tif self.pvp[1] and not IsInInstance() then\n\t\t\t\t\t\tlocal r, g, b = unpack(self[self.pvp[1]][2])\n\t\t\t\t\t\tif self.subzone and self.subzone ~= self.zone then GameTooltip:AddLine(self.subzone, r, g, b) end\n\t\t\t\t\t\tGameTooltip:AddLine(format(self[self.pvp[1]][1], self.pvp[3] or \"\"), r, g, b)\n\t\t\t\t\tend\n\t\t\t\t\tGameTooltip:Show()\n\t\t\t\t\tself.elapsed, self.init = 0, false\n\t\t\t\tend\n\t\t\tend\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tself.hovered, self.init = true, true\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\tGameTooltip:ClearAllPoints()\n\t\t\tGameTooltip:SetPoint(modules.Location.tip_anchor, modules.Location.tip_frame, modules.Location.tip_x, modules.Location.tip_y)\n\t\tend,\n\t\tOnClick = function(self)\n\t\t\tif IsShiftKeyDown() then\n\t\t\t\tlocal mapID = C_Map.GetBestMapForUnit(\"player\")\n\t\t\t\tif C_Map.CanSetUserWaypointOnMap(mapID) then\n\t\t\t\t\tlocal pos = C_Map.GetPlayerMapPosition(mapID, \"player\")\n\t\t\t\t\tlocal mapPoint = UiMapPoint.CreateFromVector2D(mapID, pos)\n\t\t\t\t\tC_Map.SetUserWaypoint(mapPoint)\n\t\t\t\tend\n\t\t\t\tlocal hyperlink = C_Map.GetUserWaypointHyperlink() or \"\"\n\t\t\t\tChatEdit_ActivateChat(ChatEdit_ChooseBoxForSend())\n\t\t\t\tChatEdit_ChooseBoxForSend():Insert(format(\" (%s: %s) %s\", self.zone, Coords(), hyperlink))\n\t\t\t\tC_Map.ClearUserWaypoint()\n\t\t\telse\n\t\t\t\tToggleFrame(WorldMapFrame)\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tDamage\n----------------------------------------------------------------------------------------\nif damage.enabled then\n\tInject(\"Damage\", {\n\t\ttext = {\n\t\t\tstring = function()\n\t\t\t\tif IsAddOnLoaded(\"Details\") then\n\t\t\t\t\tlocal combat = Details:GetCurrentCombat()\n\t\t\t\t\tlocal player = combat:GetActor(DETAILS_ATTRIBUTE_DAMAGE, T.name)\n\t\t\t\t\tif player then\n\t\t\t\t\t\tlocal damageDone = player.total\n\t\t\t\t\t\tlocal combatTime = combat:GetCombatTime()\n\t\t\t\t\t\tlocal effectiveDPS = damageDone / combatTime\n\n\t\t\t\t\t\treturn format(damage.fmt, DAMAGE, effectiveDPS)\n\t\t\t\t\tend\n\t\t\t\telseif IsAddOnLoaded(\"Numeration\") then\n\t\t\t\t\tlocal text = LibStub:GetLibrary(\"LibDataBroker-1.1\"):GetDataObjectByName(\"Numeration\").text\n\t\t\t\t\tif text and text ~= \"Numeration\" then\n\t\t\t\t\t\treturn format(damage.alt_fmt, DAMAGE, text)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t},\n\t\tOnClick = function(self, button)\n\t\t\tif IsAddOnLoaded(\"Details\") then\n\t\t\t\t_detalhes:ToggleWindows()\n\t\t\telseif IsAddOnLoaded(\"Numeration\") then\n\t\t\t\tNumeration:ToggleVisibility()\n\t\t\tend\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tPing\n----------------------------------------------------------------------------------------\nif ping.enabled then\n\tInject(\"Ping\", {\n\t\tOnLoad = function(self)\n\t\t\tself:RegisterEvent(\"MINIMAP_PING\")\n\t\t\tself.animGroup = self.text:CreateAnimationGroup()\n\t\t\tself.anim = self.animGroup:CreateAnimation(\"Alpha\")\n\t\t\tself.animGroup:SetScript(\"OnFinished\", function() self.text:Hide() end)\n\t\t\tself.anim:SetFromAlpha(1)\n\t\t\tself.anim:SetToAlpha(0)\n\t\t\tself.anim:SetDuration(2.8)\n\t\t\tself.anim:SetStartDelay(5)\n\t\tend,\n\t\tOnEvent = function(self, _, unit)\n\t\t\tif unit == P and ping.hide_self then return end\n\t\t\tlocal class = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[select(2, UnitClass(unit))]\n\t\t\tself.text:SetText(format(ping.fmt, UnitName(unit)))\n\t\t\tif class then\n\t\t\t\tself.text:SetTextColor(class.r, class.g, class.b, 1)\n\t\t\telse\n\t\t\t\tself.text:SetTextColor(1, 1, 1, 1)\n\t\t\tend\n\t\t\tself.animGroup:Stop()\n\t\t\tself.text:Show()\n\t\t\tself.animGroup:Play()\n\t\tend\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tGold\n----------------------------------------------------------------------------------------\nif gold.enabled then\n\tlocal titleName\n\tlocal function Currency(id, weekly, capped)\n\t\tlocal info = C_CurrencyInfo.GetCurrencyInfo(id)\n\t\tlocal name, amount, tex, week, weekmax, maxed, discovered = info.name, info.quantity, info.iconFileID, info.canEarnPerWeek, info.maxWeeklyQuantity, info.maxQuantity, info.discovered\n\t\tif amount == 0 then return end\n\t\tif titleName then\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddLine(titleName, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\ttitleName = nil\n\t\tend\n\t\tif weekly then\n\t\t\tif discovered then GameTooltip:AddDoubleLine(name, format(\"%s |T%s:\"..t_icon..\":\"..t_icon..\":0:0:64:64:5:59:5:59:%d|t\", REFORGE_CURRENT..\": \".. amount..\" - \"..WEEKLY..\": \"..week..\" / \"..weekmax, tex, t_icon), 1, 1, 1, 1, 1, 1) end\n\t\telseif capped then\n\t\t\tif discovered then GameTooltip:AddDoubleLine(name, format(\"%s |T%s:\"..t_icon..\":\"..t_icon..\":0:0:64:64:5:59:5:59:%d|t\", amount..\" / \"..maxed, tex, t_icon), 1, 1, 1, 1, 1, 1) end\n\t\telse\n\t\t\tif discovered then GameTooltip:AddDoubleLine(name, format(\"%s |T%s:\"..t_icon..\":\"..t_icon..\":0:0:64:64:5:59:5:59:%d|t\", amount, tex, t_icon), 1, 1, 1, 1, 1, 1) end\n\t\tend\n\tend\n\tInject(\"Gold\", {\n\t\tOnLoad = function(self)\n\t\t\tself.started = GetMoney()\n\t\t\tRegEvents(self, \"PLAYER_LOGIN PLAYER_MONEY MERCHANT_SHOW\")\n\t\t\tif not ShestakUIStats.JunkIgnore then ShestakUIStats.JunkIgnore = {} end\n\t\tend,\n\t\tOnEvent = function(self, event)\n\t\t\tconf.Gold = GetMoney()\n\t\t\tif event == \"MERCHANT_SHOW\" then\n\t\t\t\tif conf.AutoSell and not (IsAltKeyDown() or IsShiftKeyDown()) then\n\t\t\t\t\t-- local profit = 0\n\t\t\t\t\tlocal numItem = 0\n\t\t\t\t\tfor bag = 0, NUM_BAG_SLOTS do for slot = 0, C_Container.GetContainerNumSlots(bag) do\n\t\t\t\t\t\tlocal link = C_Container.GetContainerItemLink(bag, slot)\n\t\t\t\t\t\tif link then\n\t\t\t\t\t\t\tlocal itemstring, ignore = strmatch(link, \"|Hitem:(%d-):\"), false\n\t\t\t\t\t\t\tfor _, exception in pairs(ShestakUIStats.JunkIgnore) do\n\t\t\t\t\t\t\t\tif exception == itemstring then ignore = true break end\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tlocal _, _, itemRarity, _, _, _, _, _, _, _, itemSellPrice = GetItemInfo(link)\n\t\t\t\t\t\t\t-- local _, itemCount = GetContainerItemInfo(bag, slot)\n\t\t\t\t\t\t\tif itemSellPrice and itemSellPrice > 0 and ((itemRarity == 0 and not ignore) or (ignore and itemRarity ~= 0)) then\n\t\t\t\t\t\t\t\t-- profit = profit + (itemSellPrice * itemCount)\n\t\t\t\t\t\t\t\tnumItem = numItem + 1\n\t\t\t\t\t\t\t\tif numItem < 12 then\n\t\t\t\t\t\t\t\t\tC_Container.UseContainerItem(bag, slot)\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tC_Timer.After(numItem/8, function()\n\t\t\t\t\t\t\t\t\t\tC_Container.UseContainerItem(bag, slot)\n\t\t\t\t\t\t\t\t\tend)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend end\n\t\t\t\t\t-- if profit > 0 then print(format(\"|cff66C6FF%s: |cffFFFFFF%s\", L_STATS_JUNK_PROFIT, formatgold(1, profit))) end\n\t\t\t\tend\n\t\t\t\treturn\n\t\t\tend\n\t\t\tself.text:SetText(formatgold(gold.style, conf.Gold))\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tlocal curgold = GetMoney()\n\t\t\tlocal _, _, archaeology, _, cooking = GetProfessions()\n\t\t\tconf.Gold = curgold\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_NONE\")\n\t\t\tGameTooltip:ClearAllPoints()\n\t\t\tGameTooltip:SetPoint(gold.tip_anchor, gold.tip_frame, gold.tip_x, gold.tip_y)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:AddLine(CURRENCY, tthead.r, tthead.g, tthead.b)\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tif self.started ~= curgold then\n\t\t\t\tlocal gained = curgold > self.started\n\t\t\t\tlocal color = gained and \"|cff55ff55\" or \"|cffff5555\"\n\t\t\t\tGameTooltip:AddDoubleLine(L_STATS_SESSION_GAIN, format(\"%s$|r %s %s$|r\", color, formatgold(1, abs(self.started - curgold)), color), 1, 1, 1, 1, 1, 1)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tend\n\t\t\tGameTooltip:AddLine(L_STATS_SERVER_GOLD, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\tlocal total = 0\n\t\t\tlocal goldTable = {}\n\t\t\tlocal charIndex = 0\n\t\t\twipe(goldTable)\n\t\t\tfor char, conf in pairs(ShestakUIStats[realm]) do\n\t\t\t\tif conf.Gold and conf.Gold > 99 then\n\t\t\t\t\tcharIndex = charIndex + 1\n\t\t\t\t\tgoldTable[charIndex] = {char, formatgold(5, conf.Gold), conf.Gold}\n\t\t\t\tend\n\t\t\tend\n\t\t\ttable.sort(goldTable, function(a, b)\n\t\t\t\tif (a and b) then\n\t\t\t\t\treturn a[3] > b[3]\n\t\t\t\tend\n\t\t\tend)\n\t\t\tfor _, v in ipairs(goldTable) do\n\t\t\t\tGameTooltip:AddDoubleLine(v[1], v[2], 1, 1, 1, 1, 1, 1)\n\t\t\t\ttotal = total + v[3]\n\t\t\tend\n\t\t\tGameTooltip:AddDoubleLine(\" \", \"-----------------\", 1, 1, 1, 0.5, 0.5, 0.5)\n\t\t\tGameTooltip:AddDoubleLine(TOTAL, formatgold(5, total), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tGameTooltip:AddLine(\" \")\n\n\t\t\tlocal currencies = 0\n\t\t\tfor i = 1, C_CurrencyInfo.GetCurrencyListSize() do\n\t\t\t\tlocal info = C_CurrencyInfo.GetCurrencyListInfo(i)\n\t\t\t\tif info and info.isShowInBackpack then\n\t\t\t\t\tif currencies == 0 then GameTooltip:AddLine(TRACKING, ttsubh.r, ttsubh.g, ttsubh.b) end\n\t\t\t\t\tlocal r, g, b\n\t\t\t\t\tif info.quantity > 0 then r, g, b = 1, 1, 1 else r, g, b = 0.5, 0.5, 0.5 end\n\t\t\t\t\tGameTooltip:AddDoubleLine(info.name, format(\"%d |T%s:\"..t_icon..\":\"..t_icon..\":0:0:64:64:5:59:5:59:%d|t\", info.quantity, info.iconFileID, t_icon), r, g, b, r, g, b)\n\t\t\t\t\tcurrencies = currencies + 1\n\t\t\t\tend\n\t\t\tend\n\t\t\tif archaeology and C.stats.currency_archaeology then\n\t\t\t\ttitleName = PROFESSIONS_ARCHAEOLOGY\n\t\t\t\tCurrency(384)\t-- Dwarf Archaeology Fragment\n\t\t\t\tCurrency(385)\t-- Troll\n\t\t\t\tCurrency(393)\t-- Fossil\n\t\t\t\tCurrency(394)\t-- Night Elf\n\t\t\t\tCurrency(397)\t-- Orc\n\t\t\t\tCurrency(398)\t-- Draenei\n\t\t\t\tCurrency(399)\t-- Vrykul\n\t\t\t\tCurrency(400)\t-- Nerubian\n\t\t\t\tCurrency(401)\t-- Tol'vir\n\t\t\t\tCurrency(676)\t-- Pandaren\n\t\t\t\tCurrency(677)\t-- Mogu\n\t\t\t\tCurrency(754)\t-- Mantid\n\t\t\t\tCurrency(821)\t-- Draenor Clans\n\t\t\t\tCurrency(828)\t-- Ogre\n\t\t\t\tCurrency(829)\t-- Arakkoa\n\t\t\t\tCurrency(1172)\t-- Highborne\n\t\t\t\tCurrency(1173)\t-- Highmountain Tauren\n\t\t\t\tCurrency(1174)\t-- Demonic\n\t\t\t\tCurrency(1534)\t-- Zandalari\n\t\t\t\tCurrency(1535)\t-- Drust\n\t\t\tend\n\n\t\t\tif cooking and C.stats.currency_cooking then\n\t\t\t\ttitleName = PROFESSIONS_COOKING\n\t\t\t\tCurrency(81)\t-- Epicurean's Award\n\t\t\t\tCurrency(402)\t-- Ironpaw Token\n\t\t\tend\n\n\t\t\t-- if C.stats.currency_raid and T.level == MAX_PLAYER_LEVEL then\n\t\t\t\t-- titleName = L_STATS_CURRENCY_RAID\n\t\t\t\t-- Currency(1580, false, true)\t-- Seal of Wartorn Fate\n\t\t\t-- end\n\n\t\t\tif C.stats.currency_misc then\n\t\t\t\ttitleName = EXPANSION_NAME9\n\t\t\t\tCurrency(2122)\t-- Storm Sigil\n\t\t\t\tCurrency(2118)\t-- Elemental Overflow\n\t\t\t\tCurrency(2003)\t-- Dragon Isles Supplies\n\t\t\tend\n\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddDoubleLine(\" \", L_STATS_AUTO_SELL..\": \"..(conf.AutoSell and \"|cff55ff55\"..L_STATS_ON or \"|cffff5555\"..strupper(OFF)), 1, 1, 1, ttsubh.r, ttsubh.g, ttsubh.b)\n\t\t\tGameTooltip:Show()\n\t\tend,\n\t\tOnClick = function(self, button)\n\t\t\tif button == \"LeftButton\" then\n\t\t\t\tToggleCharacter(\"TokenFrame\")\n\t\t\telseif button == \"RightButton\" then\n\t\t\t\tconf.AutoSell = not conf.AutoSell\n\t\t\t\tself:GetScript(\"OnEnter\")(self)\n\t\t\tend\n\t\tend\n\t})\n\tSLASH_KJUNK1 = \"/junk\"\n\tfunction SlashCmdList.KJUNK(s)\n\t\tlocal action = strsplit(\" \", s)\n\t\tif action == \"list\" then\n\t\t\tprint(format(\"|cff66C6FF%s:|r %s\", L_STATS_JUNK_ADDITIONS, (#ShestakUIStats.JunkIgnore == 0 and NONE or \"\")))\n\t\t\tfor i, id in pairs(ShestakUIStats.JunkIgnore) do\n\t\t\t\tlocal _, link = GetItemInfo(id)\n\t\t\t\tprint(\"- [\"..i..\"]\", link)\n\t\t\tend\n\t\telseif action == \"clear\" then\n\t\t\tShestakUIStats.JunkIgnore = {}\n\t\t\tprint(\"|cff66C6FF\"..L_STATS_JUNK_CLEARED..\"|r\")\n\t\telseif action == \"add\" or strfind(action, \"^del\") or strfind(action, \"^rem\") then\n\t\t\tlocal _, mouselink = GameTooltip:GetItem()\n\t\t\tfor id in s:gmatch(\"|Hitem:(%d-):\") do\n\t\t\t\tmouselink = nil\n\t\t\t\tlocal _, link = GetItemInfo(id)\n\t\t\t\tif action == \"add\" then\n\t\t\t\t\tif not tContains(ShestakUIStats.JunkIgnore,id) then\n\t\t\t\t\t\ttinsert(ShestakUIStats.JunkIgnore, id)\n\t\t\t\t\t\tprint(format(\"|cff66C6FF%s:|r %s\", L_STATS_JUNK_ADDED, link))\n\t\t\t\t\telse\n\t\t\t\t\t\tprint(format(\"%s |cff66C6FF%s|r\", link, L_STATS_JUNK_ALREADY_ADDITIONS))\n\t\t\t\t\tend\n\t\t\t\telseif strfind(action, \"^del\") or strfind(action, \"^rem\") then\n\t\t\t\t\ttDeleteItem(ShestakUIStats.JunkIgnore, id)\n\t\t\t\t\tprint(format(\"|cff66C6FF%s:|r %s\", L_STATS_JUNK_REMOVED, link))\n\t\t\t\tend\n\t\t\tend\n\t\t\tif mouselink then\n\t\t\t\tfor id in mouselink:gmatch(\"|Hitem:(%d-):\") do\n\t\t\t\t\tif action == \"add\" then\n\t\t\t\t\t\tif not tContains(ShestakUIStats.JunkIgnore,id) then\n\t\t\t\t\t\t\ttinsert(ShestakUIStats.JunkIgnore, id)\n\t\t\t\t\t\t\tprint(format(\"|cff66C6FF%s:|r %s\", L_STATS_JUNK_ADDED, mouselink))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tprint(format(\"%s |cff66C6FF%s|r\", mouselink, L_STATS_JUNK_ALREADY_ADDITIONS))\n\t\t\t\t\t\tend\n\t\t\t\t\telseif strfind(action, \"^del\") or strfind(action, \"^rem\") then\n\t\t\t\t\t\ttDeleteItem(ShestakUIStats.JunkIgnore, id)\n\t\t\t\t\t\tprint(format(\"|cff66C6FF%s:|r %s\", L_STATS_JUNK_REMOVED, mouselink))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tprint(\"Lite|cff66C6FFStats|r: \"..L_STATS_JUNK_LIST)\n\t\t\tprint(format(\"/junk <add||rem(ove)> [%s] - %s\", L_STATS_JUNK_ITEMLINK, L_STATS_JUNK_ADD_ITEM))\n\t\t\tprint(\"/junk list - \"..L_STATS_JUNK_ITEMS_LIST)\n\t\t\tprint(\"/junk clear - \"..L_STATS_JUNK_CLEAR_ADDITIONS)\n\t\tend\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tCharacter Stats\n----------------------------------------------------------------------------------------\nif stats.enabled then\n\tlocal function tags(sub)\n\t\tlocal percent, string = true\n\t\tif sub == \"power\" then\n\t\t\tlocal value, power\n\t\t\tlocal Base, PosBuff, NegBuff = UnitAttackPower(\"player\")\n\t\t\tlocal Effective = Base + PosBuff + NegBuff\n\t\t\tlocal RangedBase, RangedPosBuff, RangedNegBuff = UnitRangedAttackPower(\"player\")\n\t\t\tlocal range = RangedBase + RangedPosBuff + RangedNegBuff\n\t\t\tlocal heal = GetSpellBonusHealing()\n\t\t\tlocal spell = GetSpellBonusDamage(7)\n\t\t\tlocal attack = Effective\n\t\t\tif heal > spell then\n\t\t\t\tpower = heal\n\t\t\telse\n\t\t\t\tpower = spell\n\t\t\tend\n\t\t\tif attack > power and T.class ~= \"HUNTER\" then\n\t\t\t\tvalue = attack\n\t\t\telseif T.class == \"HUNTER\" then\n\t\t\t\tvalue = range\n\t\t\telse\n\t\t\t\tvalue = power\n\t\t\tend\n\t\t\tstring, percent = value\n\t\telseif sub == \"mastery\" then\n\t\t\tstring = GetMasteryEffect()\n\t\telseif sub == \"haste\" then\n\t\t\tstring = GetHaste()\n\t\telseif sub == \"resilience\" then\n\t\t\tstring, percent = GetCombatRating(16)\n\t\telseif sub == \"crit\" then\n\t\t\tstring = GetCritChance()\n\t\telseif sub == \"dodge\" then\n\t\t\tstring = GetDodgeChance()\n\t\telseif sub == \"parry\" then\n\t\t\tstring = GetParryChance()\n\t\telseif sub == \"block\" then\n\t\t\tstring = GetBlockChance()\n\t\telseif sub == \"avoidance\" then\n\t\t\tstring = GetDodgeChance() + GetParryChance()\n\t\telseif sub == \"manaregen\" then\n\t\t\tlocal I5SR = true\n\t\t\tif T.class == \"ROGUE\" or T.class == \"WARRIOR\" or T.class == \"DEATHKNIGHT\" then\n\t\t\t\tstring, percent = \"??\"\n\t\t\telse\n\t\t\t\tlocal base, cast = GetManaRegen()\n\t\t\t\tstring, percent = floor((I5SR and cast or base) * 5)\n\t\t\tend\n\t\telseif sub == \"armor\" then\n\t\t\tlocal _, eff = UnitArmor(P)\n\t\t\tstring, percent = eff\n\t\telseif sub == \"versatility\" then\n\t\t\tstring = GetCombatRatingBonus(CR_VERSATILITY_DAMAGE_DONE) + GetVersatilityBonus(CR_VERSATILITY_DAMAGE_DONE)\n\t\telseif sub == \"leech\" then\n\t\t\tstring = GetLifesteal()\n\t\telseif sub == \"reduceaoe\" then\n\t\t\tstring = GetAvoidance()\n\t\telse\n\t\t\tstring, percent = format(\"[%s]\", sub)\n\t\tend\n\t\tif not percent then return string end\n\t\treturn format(\"%.1f\", string)\n\tend\n\tInject(\"Stats\", {\n\t\tOnLoad = function(self)\n\t\t\tRegEvents(self, \"PLAYER_LOGIN UNIT_STATS UNIT_DAMAGE UNIT_RANGEDDAMAGE PLAYER_DAMAGE_DONE_MODS UNIT_ATTACK_SPEED UNIT_ATTACK_POWER UNIT_RANGED_ATTACK_POWER\")\n\t\tend,\n\t\tOnEvent = function(self) self.fired = true end,\n\t\tOnUpdate = function(self, u)\n\t\t\tself.elapsed = self.elapsed + u\n\t\t\tif self.fired and self.elapsed > 2.5 then\n\t\t\t\tself.text:SetText(gsub(stats.fmt, \"%[(%w-)%]\", tags))\n\t\t\t\tLP_Stat.text:SetText(gsub(stat[format(\"spec%dfmt\", GetSpecialization() and GetSpecialization() or 1)], \"%[(%w-)%]\", tags))\n\t\t\t\tself.elapsed, self.fired = 0, false\n\t\t\t\tif self.hovered then self:GetScript(\"OnEnter\")(self) end\n\t\t\tend\n\t\tend,\n\t\tOnClick = function() ToggleCharacter(\"PaperDollFrame\") end,\n\t\tOnEnter = function(self)\n\t\t\tself.hovered = true\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_BOTTOMLEFT\", -3, 26)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:AddLine(PAPERDOLL_SIDEBAR_STATS, tthead.r, tthead.g, tthead.b)\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tlocal spec = GetSpecialization()\n\t\t\tif spec then\n\t\t\t\tlocal primaryStat = select(6, GetSpecializationInfo(spec, nil, nil, nil, UnitSex(\"player\")))\n\t\t\t\tlocal value = UnitStat(\"player\", primaryStat)\n\t\t\t\tlocal statName = _G[\"SPELL_STAT\"..primaryStat..\"_NAME\"]\n\t\t\t\tGameTooltip:AddDoubleLine(statName, value, ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tend\n\t\t\tlocal leech = tonumber(tags\"leech\")\n\t\t\tif leech > 0 then\n\t\t\t\tGameTooltip:AddDoubleLine(STAT_LIFESTEAL, leech..\"%\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tend\n\t\t\tlocal reduceaoe = tonumber(tags\"reduceaoe\")\n\t\t\tif reduceaoe > 0 then\n\t\t\t\tGameTooltip:AddDoubleLine(STAT_AVOIDANCE, reduceaoe..\"%\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\tend\n\t\t\tif T.Role == \"Tank\" then\n\t\t\t\tGameTooltip:AddDoubleLine(STAT_DODGE, tags\"dodge\"..\"%\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tGameTooltip:AddDoubleLine(STAT_PARRY, tags\"parry\"..\"%\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tlocal block = tonumber(tags\"block\")\n\t\t\t\tif block > 0 then\n\t\t\t\t\tGameTooltip:AddDoubleLine(STAT_BLOCK, block..\"%\", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1)\n\t\t\t\tend\n\t\t\tend\n\t\t\tGameTooltip:Show()\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(1)\n\t\t\tend\n\t\tend,\n\t\tOnLeave = function()\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(0)\n\t\t\tend\n\t\tend,\n\t})\n\n\tInject(\"Stat\", {\n\t\tOnClick = function() ToggleCharacter(\"PaperDollFrame\") end,\n\t\tOnEnter = function() LP_Stats:GetScript(\"OnEnter\")(LP_Stats) end,\n\t\tOnLeave = function()\n\t\t\tLP_Stats.hovered = false\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(0)\n\t\t\tend\n\t\tend,\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tBags\n----------------------------------------------------------------------------------------\nif bags.enabled then\n\tInject(\"Bags\", {\n\t\tOnLoad = function(self) RegEvents(self, \"PLAYER_LOGIN BAG_UPDATE\") end,\n\t\tOnEvent = function(self)\n\t\t\tlocal free, total = 0, 0\n\t\t\tfor i = 0, NUM_BAG_SLOTS do\n\t\t\t\tfree, total = free + C_Container.GetContainerNumFreeSlots(i), total + C_Container.GetContainerNumSlots(i)\n\t\t\tend\n\t\t\tself.text:SetText(format(bags.fmt, free, total))\n\t\tend,\n\t\tOnClick = function() ToggleAllBags() end,\n\t\tOnEnter = function(self)\n\t\t\tlocal free, total = 0, 0\n\t\t\tfor i = 0, NUM_BAG_SLOTS do\n\t\t\t\tfree, total = free + C_Container.GetContainerNumFreeSlots(i), total + C_Container.GetContainerNumSlots(i)\n\t\t\tend\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_BOTTOMLEFT\", -3, 26)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tif GetBindingKey(\"TOGGLEBACKPACK\") then\n\t\t\t\tGameTooltip:AddLine(BACKPACK_TOOLTIP..\" (\"..GetBindingKey(\"TOGGLEBACKPACK\")..\")\", tthead.r, tthead.g, tthead.b)\n\t\t\telse\n\t\t\t\tGameTooltip:AddLine(BACKPACK_TOOLTIP, tthead.r, tthead.g, tthead.b)\n\t\t\tend\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddLine(format(NUM_FREE_SLOTS, free, total), 1, 1, 1)\n\t\t\tGameTooltip:Show()\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(1)\n\t\t\tend\n\t\tend,\n\t\tOnLeave = function()\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(0)\n\t\t\tend\n\t\tend,\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tLoot\n----------------------------------------------------------------------------------------\nif loot.enabled then\n\tInject(\"Loot\", {\n\t\tOnLoad = function(self) RegEvents(self, \"PLAYER_LOGIN CVAR_UPDATE\") end,\n\t\tOnEvent = function(self)\n\t\t\tif GetCVarBool(\"AutoLootDefault\") then\n\t\t\t\tself.text:SetText(format(loot.fmt, \"|cff55ff55\"..L_STATS_ON..\"|r\"))\n\t\t\telse\n\t\t\t\tself.text:SetText(format(loot.fmt, \"|cffff5555\"..strupper(OFF)..\"|r\"))\n\t\t\tend\n\t\tend,\n\t\tOnClick = function(self, button)\n\t\t\tif button == \"RightButton\" or button == \"LeftButton\" then\n\t\t\t\tif GetCVarBool(\"AutoLootDefault\") then\n\t\t\t\t\tSetCVar(\"AutoLootDefault\", 0)\n\t\t\t\t\tself.text:SetText(format(loot.fmt, \"|cffff5555\"..strupper(OFF)..\"|r\"))\n\t\t\t\telse\n\t\t\t\t\tSetCVar(\"AutoLootDefault\", 1)\n\t\t\t\t\tself.text:SetText(format(loot.fmt, \"|cff55ff55\"..L_STATS_ON..\"|r\"))\n\t\t\t\tend\n\t\t\tend\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_BOTTOMLEFT\", -3, 26)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:AddLine(AUTO_LOOT_DEFAULT_TEXT, tthead.r, tthead.g, tthead.b)\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddLine(OPTION_TOOLTIP_AUTO_LOOT_DEFAULT, 1, 1, 1, 1)\n\t\t\tGameTooltip:Show()\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(1)\n\t\t\tend\n\t\tend,\n\t\tOnLeave = function()\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(0)\n\t\t\tend\n\t\tend,\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tNameplates\n----------------------------------------------------------------------------------------\nif nameplates.enabled then\n\tInject(\"Nameplates\", {\n\t\tOnLoad = function(self) RegEvents(self, \"PLAYER_LOGIN CVAR_UPDATE\") end,\n\t\tOnEvent = function(self)\n\t\t\tif GetCVar(\"nameplateMotion\") == \"0\" then\n\t\t\t\tself.text:SetText(format(nameplates.fmt, \"|cff55ff55\"..L_STATS_ON..\"|r\"))\n\t\t\telse\n\t\t\t\tself.text:SetText(format(nameplates.fmt, \"|cffff5555\"..strupper(OFF)..\"|r\"))\n\t\t\tend\n\t\tend,\n\t\tOnClick = function(self, button)\n\t\t\tif button == \"RightButton\" or button == \"LeftButton\" then\n\t\t\t\tif GetCVar(\"nameplateMotion\") == \"0\" then\n\t\t\t\t\tSetCVar(\"nameplateMotion\", \"1\")\n\t\t\t\t\tself.text:SetText(format(nameplates.fmt, \"|cffff5555\"..strupper(OFF)..\"|r\"))\n\t\t\t\telse\n\t\t\t\t\tSetCVar(\"nameplateMotion\", \"0\")\n\t\t\t\t\tself.text:SetText(format(nameplates.fmt, \"|cff55ff55\"..L_STATS_ON..\"|r\"))\n\t\t\t\tend\n\t\t\tend\n\t\tend,\n\t\tOnEnter = function(self)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_BOTTOMLEFT\", -3, 26)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:AddLine(UNIT_NAMEPLATES_ALLOW_OVERLAP, tthead.r, tthead.g, tthead.b)\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddLine(OPTION_TOOLTIP_UNIT_NAMEPLATES_ALLOW_OVERLAP, 1, 1, 1, 1)\n\t\t\tGameTooltip:Show()\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(1)\n\t\t\tend\n\t\tend,\n\t\tOnLeave = function()\n\t\t\tif C.toppanel.enable == true and C.toppanel.mouseover == true then\n\t\t\t\tTopPanel:SetAlpha(0)\n\t\t\tend\n\t\tend,\n\t})\nend\n\n----------------------------------------------------------------------------------------\n--\tApplying modules\n----------------------------------------------------------------------------------------\nlpanels:CreateLayout(\"LiteStats\", layout)\nlpanels:ApplyLayout(nil, \"LiteStats\")\n\nInject = nil"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Displays/Border.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\nlocal Mult = T.mult\nif T.screenHeight > 1200 then\n\tMult = T.Scale(1)\nend\n\nlocal colorTable = setmetatable(\n\t{},\n\t{__index = function(self, val)\n\t\tlocal r, g, b = GetItemQualityColor(val)\n\t\trawset(self, val, {r, g, b})\n\n\t\treturn self[val]\n\tend}\n)\n\nlocal createBorder = function(self, point)\n\tlocal bc = self.oGlowBorder\n\tif not bc then\n\t\tif C.skins.blizzard_frames == true or IsAddOnLoaded(\"Aurora\") then\n\t\t\tif not self:IsObjectType(\"Frame\") then\n\t\t\t\tbc = CreateFrame(\"Frame\", nil, self:GetParent(), \"BackdropTemplate\")\n\t\t\telse\n\t\t\t\tbc = CreateFrame(\"Frame\", nil, self, \"BackdropTemplate\")\n\t\t\tend\n\n\t\t\tbc:SetBackdrop({\n\t\t\t\tedgeFile = C.media.blank,\n\t\t\t\tedgeSize = Mult,\n\t\t\t})\n\n\t\t\tif self.backdrop then\n\t\t\t\tbc:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\t\tbc:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\t\t\telse\n\t\t\t\tbc:SetPoint(\"TOPLEFT\", point or self, 0, 0)\n\t\t\t\tbc:SetPoint(\"BOTTOMRIGHT\", point or self, 0, 0)\n\t\t\tend\n\t\telse\n\t\t\tif not self:IsObjectType(\"Frame\") then\n\t\t\t\tbc = self:GetParent():CreateTexture(nil, \"OVERLAY\")\n\t\t\telse\n\t\t\t\tbc = self:CreateTexture(nil, \"OVERLAY\")\n\t\t\tend\n\n\t\t\tbc:SetTexture(\"Interface\\\\Buttons\\\\UI-ActionButton-Border\")\n\t\t\tbc:SetBlendMode(\"ADD\")\n\t\t\tbc:SetAlpha(0.8)\n\n\t\t\tbc:SetSize(70, 70)\n\n\t\t\tbc:SetPoint(\"CENTER\", point or self)\n\t\tend\n\t\tself.oGlowBorder = bc\n\tend\n\n\treturn bc\nend\n\nlocal borderDisplay = function(frame, color)\n\tif color then\n\t\tlocal bc = createBorder(frame)\n\t\tlocal rgb = colorTable[color]\n\n\t\tif rgb then\n\t\t\tif C.skins.blizzard_frames == true or IsAddOnLoaded(\"Aurora\") then\n\t\t\t\tbc:SetBackdropBorderColor(rgb[1], rgb[2], rgb[3])\n\t\t\t\tif bc.backdrop then\n\t\t\t\t\tbc.backdrop:SetBackdropBorderColor(rgb[1], rgb[2], rgb[3])\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tbc:SetVertexColor(rgb[1], rgb[2], rgb[3])\n\t\t\tend\n\t\t\tbc:Show()\n\t\tend\n\n\t\treturn true\n\telseif frame.oGlowBorder then\n\t\tframe.oGlowBorder:Hide()\n\tend\nend\n\nfunction oGlow:RegisterColor(name, r, g, b)\n\tif rawget(colorTable, name) then\n\t\treturn nil, string.format(\"Color [%s] is already registered.\", name)\n\telse\n\t\trawset(colorTable, name, {r, g, b})\n\tend\n\n\treturn true\nend\n\noGlow:RegisterDisplay(\"Border\", borderDisplay)"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Filters/Quality.lua",
    "content": "local quality = function(...)\n\tlocal quality = -1\n\n\tfor i = 1, select(\"#\", ...) do\n\t\tlocal itemLink = select(i, ...)\n\n\t\tif itemLink then\n\t\t\tlocal _, _, itemQuality = GetItemInfo(itemLink)\n\n\t\t\tif itemQuality then\n\t\t\t\tquality = math.max(quality, itemQuality)\n\t\t\tend\n\t\tend\n\tend\n\n\tif quality > 1 then\n\t\treturn quality\n\tend\nend\n\noGlow:RegisterFilter(\"Quality border\", \"Border\", quality)"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/Bags.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.bag.enable == true then return end\n\nlocal hook\nlocal _E\n\nlocal pipe = function(self)\n\tfor _, button in self:EnumerateValidItems() do\n\t\tlocal bagID = button:GetBagID()\n\t\tlocal slotID = button:GetID()\n\t\tlocal slotLink = C_Container.GetContainerItemLink(bagID, slotID)\n\n\t\toGlow:CallFilters(\"bags\", button, _E and slotLink)\n\tend\nend\n\nlocal update = function(self)\n\tlocal frame = _G[\"ContainerFrame1\"]\n\tlocal i = 2\n\twhile(frame and frame.size) do\n\t\tpipe(frame)\n\t\tframe = _G[\"ContainerFrame\"..i]\n\t\ti = i + 1\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tif not hook then\n\t\tfor i = 1, NUM_CONTAINER_FRAMES do\n\t\t\tlocal frame = _G[\"ContainerFrame\"..i]\n\t\t\thooksecurefunc(frame, \"UpdateItems\", pipe)\n\t\tend\n\t\thooksecurefunc(ContainerFrameCombinedBags, \"UpdateItems\", pipe)\n\n\t\thook = true\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\nend\n\noGlow:RegisterPipe(\"bags\", enable, disable, update, \"Bag containers\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/Bank.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.bag.enable == true then return end\n\nlocal _E\n\nlocal update = function(self)\n\tfor i = 1, NUM_BANKGENERIC_SLOTS or 28 do\n\t\tlocal slotFrame = _G[\"BankFrameItem\"..i]\n\t\tlocal slotLink = C_Container.GetContainerItemLink(-1, i)\n\n\t\tself:CallFilters(\"bank\", slotFrame, _E and slotLink)\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tself:RegisterEvent(\"BANKFRAME_OPENED\", update)\n\tself:RegisterEvent(\"PLAYERBANKSLOTS_CHANGED\", update)\nend\n\nlocal disable = function(self)\n\t_E = nil\n\n\tself:UnregisterEvent(\"BANKFRAME_OPENED\", update)\n\tself:UnregisterEvent(\"PLAYERBANKSLOTS_CHANGED\", update)\nend\n\noGlow:RegisterPipe(\"bank\", enable, disable, update, \"Player bank frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/Char.lua",
    "content": "if IsAddOnLoaded(\"Fizzle\") then return end\n\nlocal _E\nlocal hook\nlocal slots = {\n\t\"Head\", \"Neck\", \"Shoulder\", \"Shirt\", \"Chest\", \"Waist\", \"Legs\", \"Feet\", \"Wrist\", \"Hands\",\n\t\"Finger0\", \"Finger1\", \"Trinket0\", \"Trinket1\", \"Back\", \"MainHand\", \"SecondaryHand\", [19] = \"Tabard\"\n}\n\nlocal update = function(self)\n\tif CharacterFrame:IsShown() then\n\t\tfor key, slotName in pairs(slots) do\n\t\t\tlocal slotFrame = _G[\"Character\"..slotName..\"Slot\"]\n\t\t\tlocal slotLink = GetInventoryItemLink(\"player\", key)\n\n\t\t\toGlow:CallFilters(\"char\", slotFrame, _E and slotLink)\n\t\tend\n\tend\nend\n\nlocal PLAYER_EQUIPMENT_CHANGED = function(self)\n\tupdate(self)\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tself:RegisterEvent(\"PLAYER_EQUIPMENT_CHANGED\", PLAYER_EQUIPMENT_CHANGED)\n\n\tif not hook then\n\t\thook = function(...)\n\t\t\tif _E then return update(...) end\n\t\tend\n\n\t\tCharacterFrame:HookScript(\"OnShow\", hook)\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\n\tself:UnregisterEvent(\"PLAYER_EQUIPMENT_CHANGED\", PLAYER_EQUIPMENT_CHANGED)\nend\n\noGlow:RegisterPipe(\"char\", enable, disable, update, \"Character frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/CharFlyout.lua",
    "content": "local hook\nlocal _E\n\nlocal getID = function(loc)\n\tlocal player, bank, bags, voidStorage, slot, bag = EquipmentManager_UnpackLocation(loc)\n\tif not player and not bank and not bags and not voidStorage then return end\n\n\tif not bags then\n\t\treturn GetInventoryItemLink(\"player\", slot)\n\telse\n\t\treturn C_Container.GetContainerItemLink(bag, slot)\n\tend\nend\n\nlocal pipe = function(self)\n\tlocal location, id = self.location\n\tif location and location < EQUIPMENTFLYOUT_FIRST_SPECIAL_LOCATION then\n\t\tid = getID(location)\n\tend\n\n\treturn oGlow:CallFilters(\"char-flyout\", self, _E and id)\nend\n\nlocal update = function(self)\n\tlocal buttons = EquipmentFlyoutFrame.buttons\n\tfor _, button in next, buttons do\n\t\tpipe(button)\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tif not hook then\n\t\thook = function(...)\n\t\t\tif _E then return pipe(...) end\n\t\tend\n\n\t\thooksecurefunc(\"EquipmentFlyout_DisplayButton\", hook)\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\nend\n\noGlow:RegisterPipe(\"char-flyout\", enable, disable, update, \"Character equipment flyout frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/GBank.lua",
    "content": "local _E\nlocal hook\n\nlocal pipe = function()\n\tlocal tab = GetCurrentGuildBankTab()\n\tfor i = 1, 98 do\n\t\tlocal index = math.fmod(i, 14)\n\t\tif index == 0 then\n\t\t\tindex = 14\n\t\tend\n\t\tlocal column = math.ceil((i - 0.5) / 14)\n\n\t\tlocal slotLink = GetGuildBankItemLink(tab, i)\n\t\tlocal slotFrame = GuildBankFrame.Columns[column].Buttons[index]\n\n\t\toGlow:CallFilters(\"gbank\", slotFrame, _E and slotLink)\n\tend\nend\n\nlocal doHook = function()\n\tif(not hook) then\n\t\thook = function(...)\n\t\t\tif(_E) then return pipe(...) end\n\t\tend\n\n\t\thooksecurefunc(GuildBankFrame, \"Update\", hook)\n\tend\nend\n\nlocal function ADDON_LOADED(self, event, addon)\n\tif(addon == \"Blizzard_GuildBankUI\") then\n\t\tdoHook()\n\t\tself:UnregisterEvent(event, ADDON_LOADED)\n\tend\nend\n\nlocal update = function(self)\n\tif(IsAddOnLoaded(\"Blizzard_GuildBankUI\")) then\n\t\treturn pipe()\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tif(IsAddOnLoaded(\"Blizzard_GuildBankUI\")) then\n\t\tdoHook()\n\telse\n\t\tself:RegisterEvent(\"ADDON_LOADED\", ADDON_LOADED)\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\n\n\tself:UnregisterEvent(\"ADDON_LOADED\", ADDON_LOADED)\nend\n\noGlow:RegisterPipe(\"gbank\", enable, disable, update, \"Guild bank frame\", nil)"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/Inspect.lua",
    "content": "if IsAddOnLoaded(\"Fizzle\") then return end\n\nlocal _E\nlocal slots = {\n\t\"Head\", \"Neck\", \"Shoulder\", \"Shirt\", \"Chest\", \"Waist\", \"Legs\", \"Feet\", \"Wrist\", \"Hands\",\n\t\"Finger0\", \"Finger1\", \"Trinket0\", \"Trinket1\", \"Back\", \"MainHand\", \"SecondaryHand\", [19] = \"Tabard\"\n}\n\nlocal _MISSING = {}\nlocal pollFrame = CreateFrame(\"Frame\")\npollFrame:Hide()\n\nlocal time = 3\npollFrame:SetScript(\"OnUpdate\", function(self, elapsed)\n\ttime = time + elapsed\n\n\tif time >= 3 then\n\t\tlocal unit = InspectFrame.unit\n\t\tif not unit then\n\t\t\tself:Hide()\n\t\t\ttable.wipe(_MISSING)\n\t\tend\n\n\t\tfor i, slotName in next, _MISSING do\n\t\t\tlocal itemLink = GetInventoryItemLink(unit, i)\n\t\t\tif itemLink then\n\t\t\t\toGlow:CallFilters(\"inspect\", _G[\"Inspect\"..slotName..\"Slot\"], _E and itemLink)\n\n\t\t\t\t_MISSING[i] = nil\n\t\t\tend\n\t\tend\n\n\t\tif not next(_MISSING) then\n\t\t\tself:Hide()\n\t\tend\n\tend\nend)\n\nlocal update = function(self)\n\tif not InspectFrame or not InspectFrame:IsShown() then return end\n\n\tlocal unit = InspectFrame.unit\n\tfor i, slotName in next, slots do\n\t\tlocal itemLink = GetInventoryItemLink(unit, i)\n\t\tlocal itemTexture = GetInventoryItemTexture(unit, i)\n\n\t\tif itemTexture and not itemLink then\n\t\t\t_MISSING[i] = slotName\n\t\t\tpollFrame:Show()\n\t\tend\n\n\t\toGlow:CallFilters(\"inspect\", _G[\"Inspect\"..slotName..\"Slot\"], _E and itemLink)\n\tend\nend\n\nlocal UNIT_INVENTORY_CHANGED = function(self, event, unit)\n\tif InspectFrame.unit == unit then\n\t\tupdate(self)\n\tend\nend\n\nlocal function ADDON_LOADED(self, event, addon)\n\tif addon == \"Blizzard_InspectUI\" then\n\t\tself:RegisterEvent(\"PLAYER_TARGET_CHANGED\", update)\n\t\tself:RegisterEvent(\"UNIT_INVENTORY_CHANGED\", UNIT_INVENTORY_CHANGED)\n\t\tself:RegisterEvent(\"INSPECT_READY\", update)\n\n\t\tself:UnregisterEvent(\"ADDON_LOADED\", ADDON_LOADED)\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tif IsAddOnLoaded(\"Blizzard_InspectUI\") then\n\t\tself:RegisterEvent(\"PLAYER_TARGET_CHANGED\", update)\n\t\tself:RegisterEvent(\"UNIT_INVENTORY_CHANGED\", UNIT_INVENTORY_CHANGED)\n\t\tself:RegisterEvent(\"INSPECT_READY\", update)\n\telse\n\t\tself:RegisterEvent(\"ADDON_LOADED\", ADDON_LOADED)\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\n\n\tself:UnregisterEvent(\"ADDON_LOADED\", ADDON_LOADED)\n\tself:UnregisterEvent(\"PLAYER_TARGET_CHANGED\", update)\n\tself:UnregisterEvent(\"UNIT_INVENTORY_CHANGED\", UNIT_INVENTORY_CHANGED)\n\tself:UnregisterEvent(\"INSPECT_READY\", update)\nend\n\noGlow:RegisterPipe(\"inspect\", enable, disable, update, \"Inspect frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/Loot.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.loot.lootframe == true then return end\n\nlocal hook\nlocal _E\n\nlocal update = function(self)\n\tlocal slot = self:GetSlotIndex()\n\tlocal slotFrame = self.Item\n\n\tlocal itemLink\n\tif slot then\n\t\titemLink = GetLootSlotLink(slot)\n\tend\n\n\toGlow:CallFilters(\"loot\", slotFrame, _E and itemLink)\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tif not hook then\n\t\thooksecurefunc(LootFrameElementMixin, \"Init\", update)\n\n\t\thook = true\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\nend\n\noGlow:RegisterPipe(\"loot\", enable, disable, update, \"Loot frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/Mail.lua",
    "content": "local _E\nlocal hook\nlocal stack = {}\n\nlocal send = function(self)\n\tif not SendMailFrame:IsShown() then return end\n\n\tfor i = 1, ATTACHMENTS_MAX_SEND do\n\t\tlocal slotLink = GetSendMailItemLink(i)\n\t\tlocal slotFrame = _G[\"SendMailAttachment\"..i]\n\t\tself:CallFilters(\"mail\", slotFrame, _E and slotLink)\n\tend\nend\n\nlocal inbox = function()\n\tlocal numItems = GetInboxNumItems()\n\tlocal index = ((InboxFrame.pageNum - 1) * INBOXITEMS_TO_DISPLAY) + 1\n\n\tfor i = 1, INBOXITEMS_TO_DISPLAY do\n\t\tlocal slotFrame = _G[\"MailItem\"..i..\"Button\"]\n\t\tif index <= numItems then\n\t\t\tfor j = 1, ATTACHMENTS_MAX_RECEIVE do\n\t\t\t\tlocal attachLink = GetInboxItemLink(index, j)\n\t\t\t\tif attachLink then\n\t\t\t\t\ttable.insert(stack, attachLink)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\toGlow:CallFilters(\"mail\", slotFrame, _E and unpack(stack))\n\t\twipe(stack)\n\n\t\tindex = index + 1\n\tend\nend\n\nlocal letter = function()\n\tif not InboxFrame.openMailID then return end\n\n\tfor i = 1, ATTACHMENTS_MAX_RECEIVE do\n\t\tlocal itemLink = GetInboxItemLink(InboxFrame.openMailID, i)\n\t\tif itemLink then\n\t\t\tlocal slotFrame = _G[\"OpenMailAttachmentButton\"..i]\n\n\t\t\toGlow:CallFilters(\"mail\", slotFrame, _E and itemLink)\n\t\tend\n\tend\nend\n\nlocal update = function(self)\n\tsend(self)\n\tinbox()\n\tletter()\nend\n\nlocal hookLetter = function(...)\n\tif _E then return letter(...) end\nend\n\nlocal hookInbox = function(...)\n\tif _E then return inbox(...) end\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tself:RegisterEvent(\"MAIL_SHOW\", send)\n\tself:RegisterEvent(\"MAIL_SEND_INFO_UPDATE\", send)\n\tself:RegisterEvent(\"MAIL_SEND_SUCCESS\", send)\n\n\tif not hook then\n\t\thooksecurefunc(\"OpenMail_Update\", hookLetter)\n\t\thooksecurefunc(\"InboxFrame_Update\", hookInbox)\n\t\thook = true\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\n\n\tself:UnregisterEvent(\"MAIL_SHOW\", send)\n\tself:UnregisterEvent(\"MAIL_SEND_INFO_UPDATE\", send)\n\tself:UnregisterEvent(\"MAIL_SEND_SUCCESS\", send)\nend\n\noGlow:RegisterPipe(\"mail\", enable, disable, update, \"Mail frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/Merchant.lua",
    "content": "local _E\nlocal hook\n\nlocal update = function()\n\tif MerchantFrame:IsShown() then\n\t\tif MerchantFrame.selectedTab == 1 then\n\t\t\tfor i = 1, MERCHANT_ITEMS_PER_PAGE do\n\t\t\t\tlocal index = (((MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE) + i)\n\t\t\t\tlocal itemLink = GetMerchantItemLink(index)\n\t\t\t\tlocal slotFrame = _G[\"MerchantItem\"..i..\"ItemButton\"]\n\n\t\t\t\toGlow:CallFilters(\"merchant\", slotFrame, _E and itemLink)\n\t\t\tend\n\n\t\t\tlocal buyBackLink = GetBuybackItemLink(GetNumBuybackItems())\n\t\t\toGlow:CallFilters(\"merchant\", MerchantBuyBackItemItemButton, _E and buyBackLink)\n\t\telse\n\t\t\tfor i = 1, BUYBACK_ITEMS_PER_PAGE do\n\t\t\t\tlocal itemLink = GetBuybackItemLink(i)\n\t\t\t\tlocal slotFrame = _G[\"MerchantItem\"..i..\"ItemButton\"]\n\n\t\t\t\toGlow:CallFilters(\"merchant\", slotFrame, _E and itemLink)\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tif not hook then\n\t\thook = function(...)\n\t\t\tif _E then return update(...) end\n\t\tend\n\n\t\thooksecurefunc(\"MerchantFrame_Update\", hook)\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\nend\n\noGlow:RegisterPipe(\"merchant\", enable, disable, update, \"Vendor frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/Trade.lua",
    "content": "local _E\n\nlocal player = function(self, event, index)\n\tlocal slotFrame = _G[\"TradePlayerItem\"..index..\"ItemButton\"]\n\tlocal slotLink = GetTradePlayerItemLink(index)\n\n\tself:CallFilters(\"trade\", slotFrame, _E and slotLink)\nend\n\nlocal target = function(self, event, index)\n\tlocal slotFrame = _G[\"TradeRecipientItem\"..index..\"ItemButton\"]\n\tlocal slotLink = GetTradeTargetItemLink(index)\n\n\tself:CallFilters(\"trade\", slotFrame, _E and slotLink)\nend\n\nlocal update = function(self)\n\tfor i = 1, MAX_TRADE_ITEMS or 8 do\n\t\tplayer(self, nil, i)\n\t\ttarget(self, nil, i)\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tself:RegisterEvent(\"TRADE_UPDATE\", update)\n\tself:RegisterEvent(\"TRADE_SHOW\", update)\n\tself:RegisterEvent(\"TRADE_PLAYER_ITEM_CHANGED\", player)\n\tself:RegisterEvent(\"TRADE_TARGET_ITEM_CHANGED\", target)\nend\n\nlocal disable = function(self)\n\t_E = nil\n\n\tself:UnregisterEvent(\"TRADE_UPDATE\", update)\n\tself:UnregisterEvent(\"TRADE_SHOW\", update)\n\tself:UnregisterEvent(\"TRADE_PLAYER_ITEM_CHANGED\", player)\n\tself:UnregisterEvent(\"TRADE_TARGET_ITEM_CHANGED\", target)\nend\n\noGlow:RegisterPipe(\"trade\", enable, disable, update, \"Trade frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/TradeSkill.lua",
    "content": "local _E\nlocal hook\n\nlocal pipe = function(_, id)\n\tif not id then return end\n\tlocal itemLink = C_TradeSkillUI.GetRecipeItemLink(id)\n\n\tif itemLink then\n\t\toGlow:CallFilters(\"tradeskill\", TradeSkillFrame.DetailsFrame.Contents.ResultIcon, _E and itemLink)\n\tend\n\n\tfor i = 1, C_TradeSkillUI.GetRecipeNumReagents(id) do\n\t\tlocal reagentFrame = TradeSkillFrame.DetailsFrame.Contents.Reagents[i].Icon\n\t\tlocal reagentLink = C_TradeSkillUI.GetRecipeReagentItemLink(id, i)\n\n\t\toGlow:CallFilters(\"tradeskill\", reagentFrame, _E and reagentLink)\n\tend\nend\n\nlocal doHook = function()\n\tif not hook then\n\t\thook = function(...)\n\t\t\tif _E then return pipe(...) end\n\t\tend\n\n\t\thooksecurefunc(TradeSkillFrame.RecipeList, \"SetSelectedRecipeID\", hook)\n\tend\nend\n\nlocal function ADDON_LOADED(self, event, addon)\n\tif addon == \"Blizzard_TradeSkillUI\" then\n\t\tdoHook()\n\t\tself:UnregisterEvent(event, ADDON_LOADED)\n\tend\nend\n\nlocal update = function(self)\n\tlocal id = GetTradeSkillSelectionIndex()\n\tif id and IsAddOnLoaded(\"Blizzard_TradeSkillUI\") then\n\t\treturn pipe(id)\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tif IsAddOnLoaded(\"Blizzard_TradeSkillUI\") then\n\t\tdoHook()\n\telse\n\t\tself:RegisterEvent(\"ADDON_LOADED\", ADDON_LOADED)\n\tend\nend\n\nlocal disable = function(self)\n\t_E = nil\n\n\tself:UnregisterEvent(\"ADDON_LOADED\", ADDON_LOADED)\nend\n\noGlow:RegisterPipe(\"tradeskill\", enable, disable, update, \"Profession frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/Pipes/VoidStorage.lua",
    "content": "local _E\nlocal hooked\n\nlocal updateContents = function(self)\n\tif not IsAddOnLoaded(\"Blizzard_VoidStorageUI\") then return end\n\n\tfor slot = 1, VOID_WITHDRAW_MAX or 80 do\n\t\tlocal slotFrame = _G[\"VoidStorageStorageButton\"..slot]\n\t\tlocal page = VoidStorageFrame.page\n\t\tself:CallFilters(\"voidstore\", slotFrame, _E and (GetVoidItemInfo(page, slot)))\n\tend\n\n\tfor slot = 1, VOID_WITHDRAW_MAX or 9 do\n\t\tlocal slotFrame = _G[\"VoidStorageWithdrawButton\"..slot]\n\t\tself:CallFilters(\"voidstore\", slotFrame, _E and GetVoidTransferWithdrawalInfo(slot))\n\tend\nend\n\nlocal updateDeposit = function(self, event, slot)\n\tif not IsAddOnLoaded(\"Blizzard_VoidStorageUI\") then return end\n\n\tlocal slotFrame = _G[\"VoidStorageDepositButton\"..slot]\n\tself:CallFilters(\"voidstore\", slotFrame, _E and GetVoidTransferDepositInfo(slot))\nend\n\nlocal update = function(self)\n\tif not IsAddOnLoaded(\"Blizzard_VoidStorageUI\") then return end\n\n\tfor slot = 1, VOID_DEPOSIT_MAX or 9 do\n\t\tupdateDeposit(self, nil, slot)\n\tend\n\n\treturn updateContents(self)\nend\n\nlocal function hookCheck(self)\n\tif not (IsAddOnLoaded(\"Blizzard_VoidStorageUI\") and oGlow:IsPipeEnabled\"voidstore\") then return end\n\n\tif not hooked then\n\t\thooksecurefunc(\"VoidStorage_SetPageNumber\", function()\n\t\t\tupdateContents(self)\n\t\tend)\n\t\thooked = true\n\n\t\tself:UnregisterEvent(\"VOID_STORAGE_OPEN\", hookCheck)\n\tend\nend\n\nlocal enable = function(self)\n\t_E = true\n\n\tself:RegisterEvent(\"VOID_STORAGE_CONTENTS_UPDATE\", updateContents)\n\tself:RegisterEvent(\"VOID_STORAGE_DEPOSIT_UPDATE\", updateDeposit)\n\tself:RegisterEvent(\"VOID_STORAGE_UPDATE\", update)\n\tself:RegisterEvent(\"VOID_TRANSFER_DONE\", update)\n\t-- self:RegisterEvent(\"VOID_STORAGE_OPEN\", update)\n\t-- self:RegisterEvent(\"VOID_STORAGE_OPEN\", hookCheck)\nend\n\nlocal disable = function(self)\n\t_E = nil\n\n\tself:UnregisterEvent(\"VOID_STORAGE_CONTENTS_UPDATE\", updateContents)\n\tself:UnregisterEvent(\"VOID_STORAGE_DEPOSIT_UPDATE\", updateDeposit)\n\tself:UnregisterEvent(\"VOID_STORAGE_UPDATE\", update)\n\tself:UnregisterEvent(\"VOID_TRANSFER_DONE\", update)\n\t-- self:UnregisterEvent(\"VOID_STORAGE_OPEN\", update)\n\t-- self:UnregisterEvent(\"VOID_STORAGE_OPEN\", hookCheck)\nend\n\noGlow:RegisterPipe(\"voidstore\", enable, disable, update, \"Void storage frame\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/oGlow.lua",
    "content": "local error = function(...) print(\"|cffff0000Error:|r \"..string.format(...)) end\n\nlocal pipesTable = {}\nlocal filtersTable = {}\nlocal displaysTable = {}\n\nlocal numPipes = 0\nlocal numFilters = 0\n\nlocal activeFilters = {}\n\nlocal event_metatable = {\n\t__call = function(funcs, self, ...)\n\t\tfor _, func in pairs(funcs) do\n\t\t\tfunc(self, ...)\n\t\tend\n\tend,\n}\n\nlocal oGlow = CreateFrame(\"Frame\", \"oGlow\")\n\nfunction oGlow:ADDON_LOADED(event, addon)\n\tif addon == \"ShestakUI\" then\n\t\tfor pipe in next, pipesTable do\n\t\t\tself:EnablePipe(pipe)\n\n\t\t\tfor filter in next, filtersTable do\n\t\t\t\tself:RegisterFilterOnPipe(pipe, filter)\n\t\t\tend\n\t\tend\n\n\t\tself:UnregisterEvent(event, self.ADDON_LOADED)\n\tend\nend\n\n-- Event API\nlocal RegisterEvent = oGlow.RegisterEvent\nfunction oGlow:RegisterEvent(event, func)\n\tif type(func) == \"string\" and type(self[func]) == \"function\" then\n\t\tfunc = self[func]\n\tend\n\n\tlocal curev = self[event]\n\tif curev and func then\n\t\tif type(curev) == \"function\" then\n\t\t\tself[event] = setmetatable({curev, func}, event_metatable)\n\t\telse\n\t\t\tfor _, infunc in next, curev do\n\t\t\t\tif infunc == func then return end\n\t\t\tend\n\n\t\t\ttable.insert(curev, func)\n\t\tend\n\telseif self:IsEventRegistered(event) then\n\t\treturn\n\telse\n\t\tif func then\n\t\t\tself[event] = func\n\t\telseif not self[event] then\n\t\t\treturn error(\"Handler for event [%s] does not exist.\", event)\n\t\tend\n\n\t\tRegisterEvent(self, event)\n\tend\nend\n\nlocal UnregisterEvent = oGlow.UnregisterEvent\nfunction oGlow:UnregisterEvent(event, func)\n\tlocal curev = self[event]\n\tif type(curev) == \"table\" and func then\n\t\tfor k, infunc in next, curev do\n\t\t\tif infunc == func then\n\t\t\t\tcurev[k] = nil\n\n\t\t\t\tif #curev == 0 then\n\t\t\t\t\ttable.remove(curev, k)\n\t\t\t\t\tUnregisterEvent(self, event)\n\t\t\t\tend\n\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\telse\n\t\tself[event] = nil\n\t\tUnregisterEvent(self, event)\n\tend\nend\n\noGlow:SetScript(\"OnEvent\", function(self, event, ...)\n\treturn self[event](self, event, ...)\nend)\n\n-- Pipe API\nfunction oGlow:RegisterPipe(pipe, enable, disable, update, name)\n\tif pipesTable[pipe] then\n\t\treturn nil, string.format(\"Pipe [%s] is already registered.\")\n\telse\n\t\tnumPipes = numPipes + 1\n\n\t\tpipesTable[pipe] = {\n\t\t\tenable = enable;\n\t\t\tdisable = disable;\n\t\t\tname = name;\n\t\t\tupdate = update;\n\t\t}\n\tend\n\n\treturn true\nend\n\ndo\n\tlocal function iter(_, n)\n\t\tlocal n, t = next(pipesTable, n)\n\t\tif t then\n\t\t\treturn n, t.isActive, t.name\n\t\tend\n\tend\n\n\tfunction oGlow.IteratePipes()\n\t\treturn iter, nil, nil\n\tend\nend\n\nfunction oGlow:EnablePipe(pipe)\n\tlocal ref = pipesTable[pipe]\n\tif ref and not ref.isActive then\n\t\tref.enable(self)\n\t\tref.isActive = true\n\n\t\treturn true\n\tend\nend\n\nfunction oGlow:DisablePipe(pipe)\n\tlocal ref = pipesTable[pipe]\n\tif ref and ref.isActive then\n\t\tif ref.disable then ref.disable(self) end\n\t\tref.isActive = nil\n\n\t\treturn true\n\tend\nend\n\nfunction oGlow:IsPipeEnabled(pipe)\n\treturn pipesTable[pipe].isActive\nend\n\nfunction oGlow:UpdatePipe(pipe)\n\tlocal ref = pipesTable[pipe]\n\tif ref and ref.isActive then\n\t\tref.update(self)\n\n\t\treturn true\n\tend\nend\n\nfunction oGlow:GetNumPipes()\n\treturn numPipes\nend\n\n-- Filter API\nfunction oGlow:RegisterFilter(name, type, filter)\n\tif filtersTable[name] then return nil, \"Filter function is already registered.\" end\n\tfiltersTable[name] = {type, filter, name}\n\n\tnumFilters = numFilters + 1\n\n\treturn true\nend\n\ndo\n\tlocal function iter(_, n)\n\t\tlocal n, t = next(filtersTable, n)\n\t\tif t then\n\t\t\treturn n, t[1], t[4]\n\t\tend\n\tend\n\n\tfunction oGlow.IterateFilters()\n\t\treturn iter, nil, nil\n\tend\nend\n\nfunction oGlow:RegisterFilterOnPipe(pipe, filter)\n\tif not pipesTable[pipe] then return nil, \"Pipe does not exist.\" end\n\tif not filtersTable[filter] then return nil, \"Filter does not exist.\" end\n\n\tif not activeFilters[pipe] then\n\t\tlocal filterTable = filtersTable[filter]\n\t\tlocal display = filterTable[1]\n\t\tactiveFilters[pipe] = {}\n\t\tactiveFilters[pipe][display] = {}\n\t\ttable.insert(activeFilters[pipe][display], filterTable)\n\telse\n\t\tlocal filterTable = filtersTable[filter]\n\t\tlocal ref = activeFilters[pipe][filterTable[1]]\n\n\t\tfor _, func in next, ref do\n\t\t\tif func == filter then\n\t\t\t\treturn nil, \"Filter function is already registered.\"\n\t\t\tend\n\t\tend\n\t\ttable.insert(ref, filterTable)\n\tend\n\treturn true\nend\n\n-- Display API\nfunction oGlow:RegisterDisplay(name, display)\n\tdisplaysTable[name] = display\nend\n\n-- General API\nfunction oGlow:CallFilters(pipe, frame, ...)\n\tif not pipesTable[pipe] then return nil, \"Pipe does not exist.\" end\n\n\tlocal ref = activeFilters[pipe]\n\tif ref then\n\t\tfor display, filters in next, ref do\n\t\t\tif not displaysTable[display] then return nil, \"Display does not exist.\" end\n\n\t\t\tfor i = 1, #filters do\n\t\t\t\tlocal func = filters[i][2]\n\n\t\t\t\tif (displaysTable[display](frame, func(...))) then break end\n\t\t\tend\n\t\tend\n\tend\nend\n\noGlow:RegisterEvent(\"ADDON_LOADED\")"
  },
  {
    "path": "ShestakUI/Libs/oGlow/oGlow.xml",
    "content": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\">\n\t<Script file=\"oGlow.lua\" />\n\n\t<Script file=\"Pipes\\Bags.lua\" />\n\t<Script file=\"Pipes\\Char.lua\" />\n\t<Script file=\"Pipes\\Inspect.lua\" />\n\t<Script file=\"Pipes\\Bank.lua\" />\n\t<Script file=\"Pipes\\GBank.lua\" />\n\t<Script file=\"Pipes\\Trade.lua\" />\n\t<Script file=\"Pipes\\TradeSkill.lua\" />\n\t<Script file=\"Pipes\\Merchant.lua\" />\n\t<Script file=\"Pipes\\Mail.lua\" />\n\t<Script file=\"Pipes\\CharFlyout.lua\" />\n\t<Script file=\"Pipes\\VoidStorage.lua\" />\n\t<Script file=\"Pipes\\Loot.lua\" />\n\n\t<Script file=\"Displays\\Border.lua\" />\n\n\t<Script file=\"Filters\\Quality.lua\" />\n</Ui>"
  },
  {
    "path": "ShestakUI/Libs/oUF/Blizzard.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\n-- sourced from FrameXML\\ArenaUI.lua\nlocal MAX_ARENA_ENEMIES = _G.MAX_ARENA_ENEMIES or 5\n\n-- sourced from FrameXML/TargetFrame.lua\nlocal MAX_BOSS_FRAMES = _G.MAX_BOSS_FRAMES or 5\n\nlocal isArenaHooked = false\nlocal isPartyHooked = false\n\nlocal hiddenParent = CreateFrame('Frame', nil, UIParent)\nhiddenParent:SetAllPoints()\nhiddenParent:Hide()\n\nlocal function insecureOnShow(self)\n\tself:Hide()\nend\n\nlocal function handleFrame(baseName, doNotReparent)\n\tlocal frame\n\tif(type(baseName) == 'string') then\n\t\tframe = _G[baseName]\n\telse\n\t\tframe = baseName\n\tend\n\n\tif(frame) then\n\t\tframe:UnregisterAllEvents()\n\t\tframe:Hide()\n\n\t\tif(not doNotReparent) then\n\t\t\tframe:SetParent(hiddenParent)\n\t\tend\n\n\t\tlocal health = frame.healthBar or frame.healthbar or frame.HealthBar\n\t\tif(health) then\n\t\t\thealth:UnregisterAllEvents()\n\t\tend\n\n\t\tlocal power = frame.manabar or frame.ManaBar\n\t\tif(power) then\n\t\t\tpower:UnregisterAllEvents()\n\t\tend\n\n\t\tlocal spell = frame.castBar or frame.spellbar\n\t\tif(spell) then\n\t\t\tspell:UnregisterAllEvents()\n\t\tend\n\n\t\tlocal altpowerbar = frame.powerBarAlt or frame.PowerBarAlt\n\t\tif(altpowerbar) then\n\t\t\taltpowerbar:UnregisterAllEvents()\n\t\tend\n\n\t\tlocal buffFrame = frame.BuffFrame\n\t\tif(buffFrame) then\n\t\t\tbuffFrame:UnregisterAllEvents()\n\t\tend\n\n\t\tlocal petFrame = frame.petFrame or frame.PetFrame\n\t\tif(petFrame) then\n\t\t\tpetFrame:UnregisterAllEvents()\n\t\tend\n\n\t\tlocal totFrame = frame.totFrame\n\t\tif(totFrame) then\n\t\t\ttotFrame:UnregisterAllEvents()\n\t\tend\n\tend\nend\n\nfunction oUF:DisableBlizzard(unit)\n\tif(not unit) then return end\n\n\tif(unit == 'player') then\n\t\thandleFrame(PlayerFrame)\n\n\t\t-- For the damn vehicle support:\n\t\tPlayerFrame:RegisterEvent('PLAYER_ENTERING_WORLD')\n\t\tPlayerFrame:RegisterEvent('UNIT_ENTERING_VEHICLE')\n\t\tPlayerFrame:RegisterEvent('UNIT_ENTERED_VEHICLE')\n\t\tPlayerFrame:RegisterEvent('UNIT_EXITING_VEHICLE')\n\t\tPlayerFrame:RegisterEvent('UNIT_EXITED_VEHICLE')\n\n\t\t-- User placed frames don't animate\n\t\tPlayerFrame:SetUserPlaced(true)\n\t\tPlayerFrame:SetDontSavePosition(true)\n\telseif(unit == 'pet') then\n\t\thandleFrame(PetFrame)\n\telseif(unit == 'target') then\n\t\thandleFrame(TargetFrame)\n\telseif(unit == 'focus') then\n\t\thandleFrame(FocusFrame)\n\telseif(unit:match('boss%d?$')) then\n\t\tlocal id = unit:match('boss(%d)')\n\t\tif(id) then\n\t\t\thandleFrame('Boss' .. id .. 'TargetFrame')\n\t\telse\n\t\t\tfor i = 1, MAX_BOSS_FRAMES do\n\t\t\t\thandleFrame('Boss' .. i .. 'TargetFrame')\n\t\t\tend\n\t\tend\n\telseif(unit:match('party%d?$')) then\n\t\tif(not isPartyHooked) then\n\t\t\tisPartyHooked = true\n\n\t\t\tPartyFrame:UnregisterAllEvents()\n\n\t\t\tfor frame in PartyFrame.PartyMemberFramePool:EnumerateActive() do\n\t\t\t\thandleFrame(frame)\n\t\t\tend\n\t\tend\n\telseif(unit:match('arena%d?$')) then\n\t\tif(not isArenaHooked) then\n\t\t\tisArenaHooked = true\n\n\t\t\t-- this disables ArenaEnemyFramesContainer\n\t\t\tSetCVar('showArenaEnemyFrames', '0')\n\t\t\tSetCVar('showArenaEnemyPets', '0')\n\n\t\t\t-- but still UAE all containers\n\t\t\tArenaEnemyFramesContainer:UnregisterAllEvents()\n\t\t\tArenaEnemyPrepFramesContainer:UnregisterAllEvents()\n\t\t\tArenaEnemyMatchFramesContainer:UnregisterAllEvents()\n\n\t\t\tfor i = 1, MAX_ARENA_ENEMIES do\n\t\t\t\thandleFrame('ArenaEnemyMatchFrame' .. i)\n\t\t\t\thandleFrame('ArenaEnemyPrepFrame' .. i)\n\t\t\tend\n\t\tend\n\telseif(unit:match('nameplate%d+$')) then\n\t\tlocal frame = C_NamePlate.GetNamePlateForUnit(unit)\n\t\tif(frame and frame.UnitFrame) then\n\t\t\tif(not frame.UnitFrame.isHooked) then\n\t\t\t\tframe.UnitFrame:HookScript('OnShow', insecureOnShow)\n\t\t\t\tframe.UnitFrame.isHooked = true\n\t\t\tend\n\n\t\t\thandleFrame(frame.UnitFrame, true)\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Libs/oUF/Colors.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal frame_metatable = Private.frame_metatable\n\nlocal colorMixin = {\n\tSetRGBA = function(self, r, g, b, a)\n\t\tif(r > 1 or g > 1 or b > 1) then\n\t\t\tr, g, b = r / 255, g / 255, b / 255\n\t\tend\n\n\t\tself.r = r\n\t\tself[1] = r\n\t\tself.g = g\n\t\tself[2] = g\n\t\tself.b = b\n\t\tself[3] = b\n\t\tself.a = a\n\n\t\t-- pre-generate the hex color, there's no point to this being generated on the fly\n\t\tself.hex = string.format('ff%02x%02x%02x', self:GetRGBAsBytes())\n\tend,\n\tSetAtlas = function(self, atlas)\n\t\tself.atlas = atlas\n\tend,\n\tGetAtlas = function(self)\n\t\treturn self.atlas\n\tend,\n\tGenerateHexColor = function(self)\n\t\treturn self.hex\n\tend,\n}\n\n--[[ Colors: oUF:CreateColor(r, g, b[, a])\nWrapper for [SharedXML\\Color.lua's ColorMixin](https://wowpedia.fandom.com/wiki/ColorMixin), extended to support indexed colors used in oUF, as\nwell as extra methods for dealing with atlases.\n\nThe rgb values can be either normalized (0-1) or bytes (0-255).\n\n* self - the global oUF object\n* r    - value used as represent the red color (number)\n* g    - value used to represent the green color (number)\n* b    - value used to represent the blue color (number)\n* a    - value used to represent the opacity (number, optional)\n\n## Returns\n\n* color - the ColorMixin-based object\n--]]\nfunction oUF:CreateColor(r, g, b, a)\n\tlocal color = Mixin({}, ColorMixin, colorMixin)\n\tcolor:SetRGBA(r, g, b, a)\n\n\treturn color\nend\n\nlocal colors = {\n\tsmooth = {\n\t\t1, 0, 0,\n\t\t1, 1, 0,\n\t\t0, 1, 0\n\t},\n\thealth = oUF:CreateColor(49, 207, 37),\n\tdisconnected = oUF:CreateColor(0.6, 0.6, 0.6),\n\ttapped = oUF:CreateColor(0.6, 0.6, 0.6),\n\trunes = {\n\t\toUF:CreateColor(247, 65, 57), -- blood\n\t\toUF:CreateColor(148, 203, 247), -- frost\n\t\toUF:CreateColor(173, 235, 66), -- unholy\n\t},\n\tselection = {\n\t\t[ 0] = oUF:CreateColor(255, 0, 0), -- HOSTILE\n\t\t[ 1] = oUF:CreateColor(255, 129, 0), -- UNFRIENDLY\n\t\t[ 2] = oUF:CreateColor(255, 255, 0), -- NEUTRAL\n\t\t[ 3] = oUF:CreateColor(0, 255, 0), -- FRIENDLY\n\t\t[ 4] = oUF:CreateColor(0, 0, 255), -- PLAYER_SIMPLE\n\t\t[ 5] = oUF:CreateColor(96, 96, 255), -- PLAYER_EXTENDED\n\t\t[ 6] = oUF:CreateColor(170, 170, 255), -- PARTY\n\t\t[ 7] = oUF:CreateColor(170, 255, 170), -- PARTY_PVP\n\t\t[ 8] = oUF:CreateColor(83, 201, 255), -- FRIEND\n\t\t[ 9] = oUF:CreateColor(128, 128, 128), -- DEAD\n\t\t-- [10] = {}, -- COMMENTATOR_TEAM_1, unavailable to players\n\t\t-- [11] = {}, -- COMMENTATOR_TEAM_2, unavailable to players\n\t\t[12] = oUF:CreateColor(255, 255, 139), -- SELF, buggy\n\t\t[13] = oUF:CreateColor(0, 153, 0), -- BATTLEGROUND_FRIENDLY_PVP\n\t},\n\tclass = {},\n\tdebuff = {},\n\treaction = {},\n\tpower = {},\n\tthreat = {},\n}\n\n-- We do this because people edit the vars directly, and changing the default\n-- globals makes SPICE FLOW!\nlocal function customClassColors()\n\tif(_G.CUSTOM_CLASS_COLORS) then\n\t\tlocal function updateColors()\n\t\t\tfor classToken, color in next, _G.CUSTOM_CLASS_COLORS do\n\t\t\t\tcolors.class[classToken] = oUF:CreateColor(color.r, color.g, color.b)\n\t\t\tend\n\n\t\t\tfor _, obj in next, oUF.objects do\n\t\t\t\tobj:UpdateAllElements('CUSTOM_CLASS_COLORS')\n\t\t\tend\n\t\tend\n\n\t\tupdateColors()\n\t\t_G.CUSTOM_CLASS_COLORS:RegisterCallback(updateColors)\n\n\t\treturn true\n\tend\nend\n\nif(not customClassColors()) then\n\tfor classToken, color in next, _G.RAID_CLASS_COLORS do\n\t\tcolors.class[classToken] = oUF:CreateColor(color.r, color.g, color.b)\n\tend\n\n\tlocal eventHandler = CreateFrame('Frame')\n\teventHandler:RegisterEvent('ADDON_LOADED')\n\teventHandler:SetScript('OnEvent', function(self)\n\t\tif(customClassColors()) then\n\t\t\tself:UnregisterEvent('ADDON_LOADED')\n\t\t\tself:SetScript('OnEvent', nil)\n\t\tend\n\tend)\nend\n\nfor debuffType, color in next, _G.DebuffTypeColor do\n\tcolors.debuff[debuffType] = oUF:CreateColor(color.r, color.g, color.b)\nend\n\nfor eclass, color in next, _G.FACTION_BAR_COLORS do\n\tcolors.reaction[eclass] = oUF:CreateColor(color.r, color.g, color.b)\nend\n\nfor power, color in next, PowerBarColor do\n\tif (type(power) == 'string') then\n\t\tif(type(select(2, next(color))) == 'table') then\n\t\t\tcolors.power[power] = {}\n\n\t\t\tfor index, color_ in next, color do\n\t\t\t\tcolors.power[power][index] = oUF:CreateColor(color_.r, color_.g, color_.b)\n\t\t\tend\n\t\telse\n\t\t\tcolors.power[power] = oUF:CreateColor(color.r, color.g, color.b)\n\n\t\t\tif(color.atlas) then\n\t\t\t\tcolors.power[power]:SetAtlas(color.atlas)\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- sourced from FrameXML/Constants.lua\ncolors.power[0] = colors.power.MANA\ncolors.power[1] = colors.power.RAGE\ncolors.power[2] = colors.power.FOCUS\ncolors.power[3] = colors.power.ENERGY\ncolors.power[4] = colors.power.COMBO_POINTS\ncolors.power[5] = colors.power.RUNES\ncolors.power[6] = colors.power.RUNIC_POWER\ncolors.power[7] = colors.power.SOUL_SHARDS\ncolors.power[8] = colors.power.LUNAR_POWER\ncolors.power[9] = colors.power.HOLY_POWER\ncolors.power[11] = colors.power.MAELSTROM\ncolors.power[12] = colors.power.CHI\ncolors.power[13] = colors.power.INSANITY\ncolors.power[16] = colors.power.ARCANE_CHARGES\ncolors.power[17] = colors.power.FURY\ncolors.power[18] = colors.power.PAIN\n\n-- there's no official colour for evoker's essence\n-- use the average colour of the essence texture instead\ncolors.power.ESSENCE = oUF:CreateColor(100, 173, 206)\ncolors.power[19] = colors.power.ESSENCE\n\n-- alternate power, sourced from FrameXML/CompactUnitFrame.lua\ncolors.power.ALTERNATE = oUF:CreateColor(0.7, 0.7, 0.6)\ncolors.power[10] = colors.power.ALTERNATE\n\nfor i = 0, 3 do\n\tcolors.threat[i] = oUF:CreateColor(GetThreatStatusColor(i))\nend\n\nlocal function colorsAndPercent(a, b, ...)\n\tif(a <= 0 or b == 0) then\n\t\treturn nil, ...\n\telseif(a >= b) then\n\t\treturn nil, select(-3, ...)\n\tend\n\n\tlocal num = select('#', ...) / 3\n\tlocal segment, relperc = math.modf((a / b) * (num - 1))\n\treturn relperc, select((segment * 3) + 1, ...)\nend\n\n-- http://www.wowwiki.com/ColorGradient\n--[[ Colors: oUF:RGBColorGradient(a, b, ...)\nUsed to convert a percent value (the quotient of `a` and `b`) into a gradient from 2 or more RGB colors. If more than 2\ncolors are passed, the gradient will be between the two colors which perc lies in an evenly divided range. A RGB color\nis a sequence of 3 consecutive RGB percent values (in the range [0-1]). If `a` is negative or `b` is zero then the first\nRGB color (the first 3 RGB values passed to the function) is returned. If `a` is bigger than or equal to `b`, then the\nlast 3 RGB values are returned.\n\n* self - the global oUF object\n* a    - value used as numerator to calculate the percentage (number)\n* b    - value used as denominator to calculate the percentage (number)\n* ...  - a list of RGB percent values. At least 6 values should be passed (number [0-1])\n--]]\nfunction oUF:RGBColorGradient(...)\n\tlocal relperc, r1, g1, b1, r2, g2, b2 = colorsAndPercent(...)\n\tif(relperc) then\n\t\treturn r1 + (r2 - r1) * relperc, g1 + (g2 - g1) * relperc, b1 + (b2 - b1) * relperc\n\telse\n\t\treturn r1, g1, b1\n\tend\nend\n\n-- HCY functions are based on http://www.chilliant.com/rgb2hsv.html\nlocal function getY(r, g, b)\n\treturn 0.299 * r + 0.587 * g + 0.114 * b\nend\n\nlocal function rgbToHCY(r, g, b)\n\tlocal min, max = math.min(r, g, b), math.max(r, g, b)\n\tlocal chroma = max - min\n\tlocal hue\n\tif(chroma > 0) then\n\t\tif(r == max) then\n\t\t\thue = ((g - b) / chroma) % 6\n\t\telseif(g == max) then\n\t\t\thue = (b - r) / chroma + 2\n\t\telseif(b == max) then\n\t\t\thue = (r - g) / chroma + 4\n\t\tend\n\t\thue = hue / 6\n\tend\n\treturn hue, chroma, getY(r, g, b)\nend\n\nlocal function hcyToRGB(hue, chroma, luma)\n\tlocal r, g, b = 0, 0, 0\n\tif(hue and luma > 0) then\n\t\tlocal h2 = hue * 6\n\t\tlocal x = chroma * (1 - math.abs(h2 % 2 - 1))\n\t\tif(h2 < 1) then\n\t\t\tr, g, b = chroma, x, 0\n\t\telseif(h2 < 2) then\n\t\t\tr, g, b = x, chroma, 0\n\t\telseif(h2 < 3) then\n\t\t\tr, g, b = 0, chroma, x\n\t\telseif(h2 < 4) then\n\t\t\tr, g, b = 0, x, chroma\n\t\telseif(h2 < 5) then\n\t\t\tr, g, b = x, 0, chroma\n\t\telse\n\t\t\tr, g, b = chroma, 0, x\n\t\tend\n\n\t\tlocal y = getY(r, g, b)\n\t\tif(luma < y) then\n\t\t\tchroma = chroma * (luma / y)\n\t\telseif(y < 1) then\n\t\t\tchroma = chroma * (1 - luma) / (1 - y)\n\t\tend\n\n\t\tr = (r - y) * chroma + luma\n\t\tg = (g - y) * chroma + luma\n\t\tb = (b - y) * chroma + luma\n\tend\n\treturn r, g, b\nend\n\n--[[ Colors: oUF:HCYColorGradient(a, b, ...)\nUsed to convert a percent value (the quotient of `a` and `b`) into a gradient from 2 or more HCY colors. If more than 2\ncolors are passed, the gradient will be between the two colors which perc lies in an evenly divided range. A HCY color\nis a sequence of 3 consecutive values in the range [0-1]. If `a` is negative or `b` is zero then the first\nHCY color (the first 3 HCY values passed to the function) is returned. If `a` is bigger than or equal to `b`, then the\nlast 3 HCY values are returned.\n\n* self - the global oUF object\n* a    - value used as numerator to calculate the percentage (number)\n* b    - value used as denominator to calculate the percentage (number)\n* ...  - a list of HCY color values. At least 6 values should be passed (number [0-1])\n--]]\nfunction oUF:HCYColorGradient(...)\n\tlocal relperc, r1, g1, b1, r2, g2, b2 = colorsAndPercent(...)\n\tif(not relperc) then\n\t\treturn r1, g1, b1\n\tend\n\n\tlocal h1, c1, y1 = rgbToHCY(r1, g1, b1)\n\tlocal h2, c2, y2 = rgbToHCY(r2, g2, b2)\n\tlocal c = c1 + (c2 - c1) * relperc\n\tlocal y = y1 + (y2 - y1) * relperc\n\n\tif(h1 and h2) then\n\t\tlocal dh = h2 - h1\n\t\tif(dh < -0.5) then\n\t\t\tdh = dh + 1\n\t\telseif(dh > 0.5) then\n\t\t\tdh = dh - 1\n\t\tend\n\n\t\treturn hcyToRGB((h1 + dh * relperc) % 1, c, y)\n\telse\n\t\treturn hcyToRGB(h1 or h2, c, y)\n\tend\n\nend\n\n--[[ Colors: oUF:ColorGradient(a, b, ...) or frame:ColorGradient(a, b, ...)\nUsed as a proxy to call the proper gradient function depending on the user's preference. If `oUF.useHCYColorGradient` is\nset to true, `:HCYColorGradient` will be called, else `:RGBColorGradient`.\n\n* self - the global oUF object or a unit frame\n* a    - value used as numerator to calculate the percentage (number)\n* b    - value used as denominator to calculate the percentage (number)\n* ...  - a list of color values. At least 6 values should be passed (number [0-1])\n--]]\nfunction oUF:ColorGradient(...)\n\treturn (oUF.useHCYColorGradient and oUF.HCYColorGradient or oUF.RGBColorGradient)(self, ...)\nend\n\noUF.colors = colors\noUF.useHCYColorGradient = false\n\nframe_metatable.__index.colors = colors\nframe_metatable.__index.ColorGradient = oUF.ColorGradient\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/CombatEvents.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal argcheck = Private.argcheck\nlocal frame_metatable = Private.frame_metatable\n\nlocal CombatLogGetCurrentEventInfo = _G.CombatLogGetCurrentEventInfo\n\nlocal event_metatable = {\n\t__call = function(funcs, ...)\n\t\tfor self, func in next, funcs do\n\t\t\tif (self:IsVisible()) then\n\t\t\t\tfunc(self, ...)\n\t\t\tend\n\t\tend\n\tend,\n}\n\nlocal self_metatable = {\n\t__call = function(funcs, self, ...)\n\t\tfor _, func in next, funcs do\n\t\t\tfunc(self, ...)\n\t\tend\n\tend\n}\n\nlocal listener = CreateFrame('Frame')\nlistener.activeEvents = 0\n\nlocal function filter(_, event, ...)\n\tif(listener[event]) then\n\t\tlistener[event](event, ...)\n\tend\nend\n\nlistener:SetScript('OnEvent', function(self, event)\n\tfilter(CombatLogGetCurrentEventInfo())\nend)\n\n--[[ CombatEvents: frame:RegisterCombatEvent(event, handler)\nUsed to register a frame for a combat log event and add an event handler.\n\n* self     - frame that will be registered for the given event\n* event    - name of the combat log event to register (string)\n* handler  - function which will be executed when the combat log event fires. Multiple handlers can be added for the\n             same frame and event (function)\n--]]\nfunction frame_metatable.__index:RegisterCombatEvent(event, handler)\n\targcheck(event, 2, 'string')\n\targcheck(handler, 3, 'function')\n\n\tif(not listener[event]) then\n\t\tlistener[event] = setmetatable({}, event_metatable)\n\t\tlistener.activeEvents = listener.activeEvents + 1\n\tend\n\n\tlocal current = listener[event][self]\n\n\tif(current) then\n\t\tfor _, func in next, current do\n\t\t\tif(func == handler) then return end\n\t\tend\n\n\t\ttable.insert(current, handler)\n\telse\n\t\t-- even with a single handler we want to make sure the frame is visible\n\t\tlistener[event][self] = setmetatable({handler}, self_metatable)\n\tend\n\n\tif(listener.activeEvents > 0) then\n\t\tlistener:RegisterEvent('COMBAT_LOG_EVENT_UNFILTERED')\n\tend\nend\n\n--[[ CombatEvents: frame:UnregisterCombatEvent(event, handler)\nUsed to remove a function from the event handler list for a combat log event.\n\n* self    - the frame registered for the event\n* event   - name of the registered combat log event (string)\n* handler - function to be removed from the list of event handlers\n--]]\nfunction frame_metatable.__index:UnregisterCombatEvent(event, handler)\n\targcheck(event, 2, 'string')\n\n\tif(not listener[event]) then return end\n\n\tlocal cleanUp = false\n\tlocal current = listener[event][self]\n\tif(current) then\n\t\tfor i, func in next, current do\n\t\t\tif(func == handler) then\n\t\t\t\tcurrent[i] = nil\n\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\n\t\tif(not next(current)) then\n\t\t\tcleanUp = true\n\t\tend\n\tend\n\n\tif(cleanUp) then\n\t\tlistener[event][self] = nil\n\n\t\tif(not next(listener[event])) then\n\t\t\tlistener[event] = nil\n\t\t\tlistener.activeEvents = listener.activeEvents - 1\n\n\t\t\tif(listener.activeEvents <= 0) then\n\t\t\t\tlistener:UnregisterEvent('COMBAT_LOG_EVENT_UNFILTERED')\n\t\t\tend\n\t\tend\n\tend\nend\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/AlternativePower.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal unitSelectionType = Private.unitSelectionType\n\n-- sourced from FrameXML/UnitPowerBarAlt.lua\nlocal ALTERNATE_POWER_INDEX = Enum.PowerType.Alternate or 10\nlocal ALTERNATE_POWER_NAME = 'ALTERNATE'\n\nlocal function updateTooltip(self)\n\tlocal name, tooltip = GetUnitPowerBarStringsByID(self.__barID)\n\tGameTooltip:SetText(name or '', 1, 1, 1)\n\tGameTooltip:AddLine(tooltip or '', nil, nil, nil, true)\n\tGameTooltip:Show()\nend\n\nlocal function onEnter(self)\n\tif(not self:IsVisible()) then return end\n\n\tGameTooltip_SetDefaultAnchor(GameTooltip, self)\n\tself:UpdateTooltip()\nend\n\nlocal function onLeave()\n\tGameTooltip:Hide()\nend\n\nlocal function UpdateColor(self, event, unit, powerType)\n\tif(self.unit ~= unit or powerType ~= ALTERNATE_POWER_NAME) then return end\n\tlocal element = self.AlternativePower\n\n\tlocal r, g, b, color\n\tif(element.colorThreat and not UnitPlayerControlled(unit) and UnitThreatSituation('player', unit)) then\n\t\tcolor =  self.colors.threat[UnitThreatSituation('player', unit)]\n\telseif(element.colorPower) then\n\t\tcolor = self.colors.power[ALTERNATE_POWER_INDEX]\n\telseif(element.colorClass and UnitIsPlayer(unit))\n\t\tor (element.colorClassNPC and not UnitIsPlayer(unit)) then\n\t\tlocal _, class = UnitClass(unit)\n\t\tcolor = self.colors.class[class]\n\telseif(element.colorSelection and unitSelectionType(unit, element.considerSelectionInCombatHostile)) then\n\t\tcolor = self.colors.selection[unitSelectionType(unit, element.considerSelectionInCombatHostile)]\n\telseif(element.colorReaction and UnitReaction(unit, 'player')) then\n\t\tcolor = self.colors.reaction[UnitReaction(unit, 'player')]\n\telseif(element.colorSmooth) then\n\t\tlocal adjust = 0 - (element.min or 0)\n\t\tr, g, b = self:ColorGradient((element.cur or 1) + adjust, (element.max or 1) + adjust, unpack(element.smoothGradient or self.colors.smooth))\n\tend\n\n\tif(color) then\n\t\tr, g, b = color[1], color[2], color[3]\n\tend\n\n\tif(b) then\n\t\telement:SetStatusBarColor(r, g, b)\n\n\t\tlocal bg = element.bg\n\t\tif(bg) then\n\t\t\tlocal mu = bg.multiplier or 1\n\t\t\tbg:SetVertexColor(r * mu, g * mu, b * mu)\n\t\tend\n\tend\n\n\t--[[ Callback: AlternativePower:PostUpdateColor(unit, r, g, b)\n\tCalled after the element color has been updated.\n\n\t* self - the AlternativePower element\n\t* unit - the unit for which the update has been triggered (string)\n\t* r    - the red component of the used color (number)[0-1]\n\t* g    - the green component of the used color (number)[0-1]\n\t* b    - the blue component of the used color (number)[0-1]\n\t--]]\n\tif(element.PostUpdateColor) then\n\t\telement:PostUpdateColor(unit, r, g, b)\n\tend\nend\n\nlocal function Update(self, event, unit, powerType)\n\tif(self.unit ~= unit or powerType ~= ALTERNATE_POWER_NAME) then return end\n\tlocal element = self.AlternativePower\n\n\t--[[ Callback: AlternativePower:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the AlternativePower element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal cur, max, min\n\tlocal barInfo = element.__barInfo\n\tif(barInfo) then\n\t\tcur = UnitPower(unit, ALTERNATE_POWER_INDEX)\n\t\tmax = UnitPowerMax(unit, ALTERNATE_POWER_INDEX)\n\t\tmin = barInfo.minPower\n\t\telement:SetMinMaxValues(min, max)\n\t\telement:SetValue(cur)\n\tend\n\n\telement.cur = cur\n\telement.min = min\n\telement.max = max\n\n\t--[[ Callback: AlternativePower:PostUpdate(unit, cur, min, max)\n\tCalled after the element has been updated.\n\n\t* self - the AlternativePower element\n\t* unit - the unit for which the update has been triggered (string)\n\t* cur  - the current value of the unit's alternative power (number?)\n\t* min  - the minimum value of the unit's alternative power (number?)\n\t* max  - the maximum value of the unit's alternative power (number?)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit, cur, min, max)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: AlternativePower.Override(self, event, unit, ...)\n\tUsed to completely override the element's update process.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\t(self.AlternativePower.Override or Update) (self, ...);\n\n\t--[[ Override: AlternativePower.UpdateColor(self, event, unit, ...)\n\tUsed to completely override the internal function for updating the widgets' colors.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\t(self.AlternativePower.UpdateColor or UpdateColor) (self, ...)\nend\n\nlocal function Visibility(self, event, unit)\n\tif(unit ~= self.unit) then return end\n\tlocal element = self.AlternativePower\n\n\tlocal barID = UnitPowerBarID(unit)\n\tlocal barInfo = GetUnitPowerBarInfoByID(barID)\n\telement.__barID = barID\n\telement.__barInfo = barInfo\n\tif(barInfo and (barInfo.showOnRaid and (UnitInParty(unit) or UnitInRaid(unit))\n\t\tor not barInfo.hideFromOthers\n\t\tor UnitIsUnit(unit, 'player')))\n\tthen\n\t\tself:RegisterEvent('UNIT_POWER_UPDATE', Path)\n\t\tself:RegisterEvent('UNIT_MAXPOWER', Path)\n\n\t\telement:Show()\n\t\tPath(self, event, unit, ALTERNATE_POWER_NAME)\n\telse\n\t\tself:UnregisterEvent('UNIT_POWER_UPDATE', Path)\n\t\tself:UnregisterEvent('UNIT_MAXPOWER', Path)\n\n\t\telement:Hide()\n\t\tPath(self, event, unit, ALTERNATE_POWER_NAME)\n\tend\nend\n\nlocal function VisibilityPath(self, ...)\n\t--[[ Override: AlternativePower.OverrideVisibility(self, event, unit)\n\tUsed to completely override the element's visibility update process.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t--]]\n\treturn (self.AlternativePower.OverrideVisibility or Visibility) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.AlternativePower\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_POWER_BAR_SHOW', VisibilityPath)\n\t\tself:RegisterEvent('UNIT_POWER_BAR_HIDE', VisibilityPath)\n\n\t\tif(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then\n\t\t\telement:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\tend\n\n\t\tif(element:IsMouseEnabled()) then\n\t\t\tif(not element:GetScript('OnEnter')) then\n\t\t\t\telement:SetScript('OnEnter', onEnter)\n\t\t\tend\n\n\t\t\tif(not element:GetScript('OnLeave')) then\n\t\t\t\telement:SetScript('OnLeave', onLeave)\n\t\t\tend\n\n\t\t\t--[[ Override: AlternativePower:UpdateTooltip()\n\t\t\tCalled when the mouse is over the widget. Used to populate its tooltip.\n\n\t\t\t* self - the AlternativePower element\n\t\t\t--]]\n\t\t\tif(not element.UpdateTooltip) then\n\t\t\t\telement.UpdateTooltip = updateTooltip\n\t\t\tend\n\t\tend\n\n\t\tif(unit == 'player') then\n\t\t\tPlayerPowerBarAlt:UnregisterEvent('UNIT_POWER_BAR_SHOW')\n\t\t\tPlayerPowerBarAlt:UnregisterEvent('UNIT_POWER_BAR_HIDE')\n\t\t\tPlayerPowerBarAlt:UnregisterEvent('PLAYER_ENTERING_WORLD')\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self, unit)\n\tlocal element = self.AlternativePower\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_POWER_BAR_SHOW', VisibilityPath)\n\t\tself:UnregisterEvent('UNIT_POWER_BAR_HIDE', VisibilityPath)\n\n\t\tif(unit == 'player') then\n\t\t\tPlayerPowerBarAlt:RegisterEvent('UNIT_POWER_BAR_SHOW')\n\t\t\tPlayerPowerBarAlt:RegisterEvent('UNIT_POWER_BAR_HIDE')\n\t\t\tPlayerPowerBarAlt:RegisterEvent('PLAYER_ENTERING_WORLD')\n\t\tend\n\tend\nend\n\noUF:AddElement('AlternativePower', VisibilityPath, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/AssistantIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(self, event)\n\tlocal element = self.AssistantIndicator\n\tlocal unit = self.unit\n\n\t--[[ Callback: AssistantIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the AssistantIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal isAssistant = UnitInRaid(unit) and UnitIsGroupAssistant(unit) and not UnitIsGroupLeader(unit)\n\tif(isAssistant) then\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: AssistantIndicator:PostUpdate(isAssistant)\n\tCalled after the element has been updated.\n\n\t* self        - the AssistantIndicator element\n\t* isAssistant - indicates whether the unit is a raid assistant (boolean)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(isAssistant)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: AssistantIndicator.Override(self, event, ...)\n\tUsed to completely override the element's update process.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event (string)\n\t--]]\n\treturn (self.AssistantIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate')\nend\n\nlocal function Enable(self)\n\tlocal element = self.AssistantIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)\n\n\t\tif(element:IsObjectType('Texture') and not element:GetTexture()) then\n\t\t\telement:SetTexture([[Interface\\GroupFrame\\UI-Group-AssistantIcon]])\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.AssistantIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('GROUP_ROSTER_UPDATE', Path)\n\tend\nend\n\noUF:AddElement('AssistantIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/Auras.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function UpdateTooltip(self)\n\tif(GameTooltip:IsForbidden()) then return end\n\n\tif(self.isHarmful) then\n\t\tGameTooltip:SetUnitDebuffByAuraInstanceID(self:GetParent().__owner.unit, self.auraInstanceID)\n\telse\n\t\tGameTooltip:SetUnitBuffByAuraInstanceID(self:GetParent().__owner.unit, self.auraInstanceID)\n\tend\nend\n\nlocal function onEnter(self)\n\tif(GameTooltip:IsForbidden() or not self:IsVisible()) then return end\n\n\t-- Avoid parenting GameTooltip to frames with anchoring restrictions,\n\t-- otherwise it'll inherit said restrictions which will cause issues with\n\t-- its further positioning, clamping, etc\n\tGameTooltip:SetOwner(self, self:GetParent().__restricted and 'ANCHOR_CURSOR' or self:GetParent().tooltipAnchor)\n\tself:UpdateTooltip()\nend\n\nlocal function onLeave()\n\tif(GameTooltip:IsForbidden()) then return end\n\n\tGameTooltip:Hide()\nend\n\nlocal function CreateButton(element, index)\n\tlocal button = CreateFrame('Button', element:GetDebugName() .. 'Button' .. index, element)\n\n\tlocal cd = CreateFrame('Cooldown', '$parentCooldown', button, 'CooldownFrameTemplate')\n\tcd:SetAllPoints()\n\tcd:SetDrawEdge(false) -- ShestakUI\n\tbutton.Cooldown = cd\n\n\tlocal icon = button:CreateTexture(nil, 'BORDER')\n\ticon:SetAllPoints()\n\tbutton.Icon = icon\n\n\tlocal countFrame = CreateFrame('Frame', nil, button)\n\tcountFrame:SetAllPoints(button)\n\tcountFrame:SetFrameLevel(cd:GetFrameLevel() + 1)\n\n\tlocal count = countFrame:CreateFontString(nil, 'OVERLAY', 'NumberFontNormal')\n\tcount:SetPoint('BOTTOMRIGHT', countFrame, 'BOTTOMRIGHT', -1, 0)\n\tbutton.Count = count\n\n\tlocal overlay = button:CreateTexture(nil, 'OVERLAY')\n\toverlay:SetTexture([[Interface\\Buttons\\UI-Debuff-Overlays]])\n\toverlay:SetAllPoints()\n\toverlay:SetTexCoord(0.296875, 0.5703125, 0, 0.515625)\n\tbutton.Overlay = overlay\n\n\tlocal stealable = button:CreateTexture(nil, 'OVERLAY')\n\tstealable:SetTexture([[Interface\\TargetingFrame\\UI-TargetingFrame-Stealable]])\n\tstealable:SetPoint('TOPLEFT', -3, 3)\n\tstealable:SetPoint('BOTTOMRIGHT', 3, -3)\n\tstealable:SetBlendMode('ADD')\n\tbutton.Stealable = stealable\n\n\tbutton.UpdateTooltip = UpdateTooltip\n\tbutton:SetScript('OnEnter', onEnter)\n\tbutton:SetScript('OnLeave', onLeave)\n\n\t--[[ Callback: Auras:PostCreateButton(button)\n\tCalled after a new aura button has been created.\n\n\t* self   - the widget holding the aura buttons\n\t* button - the newly created aura button (Button)\n\t--]]\n\tif(element.PostCreateButton) then element:PostCreateButton(button) end\n\n\treturn button\nend\n\nlocal function SetPosition(element, from, to)\n\tlocal width = element.width or element.size or 16\n\tlocal height = element.height or element.size or 16\n\tlocal sizex = width + (element['spacing-x'] or element.spacing or 0)\n\tlocal sizey = height + (element['spacing-y'] or element.spacing or 0)\n\tlocal anchor = element.initialAnchor or 'BOTTOMLEFT'\n\tlocal growthx = (element['growth-x'] == 'LEFT' and -1) or 1\n\tlocal growthy = (element['growth-y'] == 'DOWN' and -1) or 1\n\tlocal cols = math.floor(element:GetWidth() / sizex + 0.5)\n\n\tfor i = from, to do\n\t\tlocal button = element[i]\n\t\tif(not button) then break end\n\n\t\tlocal col = (i - 1) % cols\n\t\tlocal row = math.floor((i - 1) / cols)\n\n\t\tbutton:ClearAllPoints()\n\t\tbutton:SetPoint(anchor, element, anchor, col * sizex * growthx, row * sizey * growthy)\n\tend\nend\n\nlocal function updateAura(element, unit, data, position)\n\tif(not data.name) then return end\n\n\tlocal button = element[position]\n\tif(not button) then\n\t\t--[[ Override: Auras:CreateButton(position)\n\t\tUsed to create an aura button at a given position.\n\n\t\t* self     - the widget holding the aura buttons\n\t\t* position - the position at which the aura button is to be created (number)\n\n\t\t## Returns\n\n\t\t* button - the button used to represent the aura (Button)\n\t\t--]]\n\t\tbutton = (element.CreateButton or CreateButton) (element, position)\n\n\t\ttable.insert(element, button)\n\t\telement.createdButtons = element.createdButtons + 1\n\tend\n\n\t-- for tooltips\n\tbutton.auraInstanceID = data.auraInstanceID\n\tbutton.isHarmful = data.isHarmful\n\n\tif(button.Cooldown and not element.disableCooldown) then\n\t\tif(data.duration > 0) then\n\t\t\tbutton.Cooldown:SetCooldown(data.expirationTime - data.duration, data.duration, data.timeMod)\n\t\t\tbutton.Cooldown:Show()\n\t\telse\n\t\t\tbutton.Cooldown:Hide()\n\t\tend\n\tend\n\n\tif(button.Overlay) then\n\t\tif((data.isHarmful and element.showDebuffType) or (not data.isHarmful and element.showBuffType) or element.showType) then\n\t\t\tlocal color = element.__owner.colors.debuff[data.dispelName] or element.__owner.colors.debuff.none\n\n\t\t\tbutton.Overlay:SetVertexColor(color[1], color[2], color[3])\n\t\t\tbutton.Overlay:Show()\n\t\telse\n\t\t\tbutton.Overlay:Hide()\n\t\tend\n\tend\n\n\tif(button.Stealable) then\n\t\tif(not data.isHarmful and data.isStealable and element.showStealableBuffs and not UnitIsUnit('player', unit)) then\n\t\t\tbutton.Stealable:Show()\n\t\telse\n\t\t\tbutton.Stealable:Hide()\n\t\tend\n\tend\n\n\tif(button.Icon) then button.Icon:SetTexture(data.icon) end\n\tif(button.Count) then button.Count:SetText(data.applications > 1 and data.applications or '') end\n\n\tlocal width = element.width or element.size or 16\n\tlocal height = element.height or element.size or 16\n\tbutton:SetSize(width, height)\n\tbutton:EnableMouse(not element.disableMouse)\n\tbutton:Show()\n\n\t--[[ Callback: Auras:PostUpdateButton(unit, button, data, position)\n\tCalled after the aura button has been updated.\n\n\t* self     - the widget holding the aura buttons\n\t* button   - the updated aura button (Button)\n\t* unit     - the unit on which the aura is cast (string)\n\t* data     - the [UnitAuraInfo](https://wowpedia.fandom.com/wiki/Struct_UnitAuraInfo) object (table)\n\t* position - the actual position of the aura button (number)\n\t--]]\n\tif(element.PostUpdateButton) then\n\t\telement:PostUpdateButton(button, unit, data, position)\n\tend\nend\n\nlocal function FilterAura(element, unit, data)\n\tif((element.onlyShowPlayer and data.isPlayerAura) or (not element.onlyShowPlayer and data.name)) then\n\t\treturn true\n\tend\nend\n\n-- see AuraUtil.DefaultAuraCompare\nlocal function SortAuras(a, b)\n\tif(a.isPlayerAura ~= b.isPlayerAura) then\n\t\treturn a.isPlayerAura\n\tend\n\n\tif(a.canApplyAura ~= b.canApplyAura) then\n\t\treturn a.canApplyAura\n\tend\n\n\treturn a.auraInstanceID < b.auraInstanceID\nend\n\nlocal function processData(data)\n\tif(not data) then return end\n\n\tdata.isPlayerAura = data.sourceUnit and (UnitIsUnit('player', data.sourceUnit) or UnitIsOwnerOrControllerOfUnit('player', data.sourceUnit))\n\n\treturn data\nend\n\nlocal function UpdateAuras(self, event, unit, updateInfo)\n\tif(self.unit ~= unit) then return end\n\n\tlocal auras = self.Auras\n\tif(auras) then\n\t\t--[[ Callback: Auras:PreUpdate(unit)\n\t\tCalled before the element has been updated.\n\n\t\t* self - the widget holding the aura buttons\n\t\t* unit - the unit for which the update has been triggered (string)\n\t\t--]]\n\t\tif(auras.PreUpdate) then auras:PreUpdate(unit) end\n\n\t\tlocal buffsChanged = false\n\t\tlocal numBuffs = auras.numBuffs or 32\n\t\tlocal buffFilter = auras.buffFilter or auras.filter or 'HELPFUL'\n\t\tif(type(buffFilter) == 'function') then\n\t\t\tbuffFilter = buffFilter(auras, unit)\n\t\tend\n\n\t\tlocal debuffsChanged = false\n\t\tlocal numDebuffs = auras.numDebuffs or 40\n\t\tlocal debuffFilter = auras.debuffFilter or auras.filter or 'HARMFUL'\n\t\tif(type(debuffFilter) == 'function') then\n\t\t\tdebuffFilter = debuffFilter(auras, unit)\n\t\tend\n\n\t\tlocal numTotal = auras.numTotal or numBuffs + numDebuffs\n\n\t\tif(not updateInfo or updateInfo.isFullUpdate) then\n\t\t\tauras.activeBuffs = table.wipe(auras.activeBuffs or {})\n\t\t\tauras.sortedBuffs = table.wipe(auras.sortedBuffs or {})\n\t\t\tnumBuffs = math.min(numBuffs, numTotal)\n\t\t\tbuffsChanged = true\n\n\t\t\tlocal slots = {UnitAuraSlots(unit, buffFilter)}\n\t\t\tif(slots[2]) then -- #1 return is continuationToken, we don't care about it\n\t\t\t\tlocal count = 1\n\n\t\t\t\tfor i = 2, #slots do\n\t\t\t\t\tif count <= numBuffs then\n\t\t\t\t\t\tlocal data = processData(C_UnitAuras.GetAuraDataBySlot(unit, slots[i]))\n\n\t\t\t\t\t\t--[[ Override: Auras:FilterAura(unit, data)\n\t\t\t\t\t\tDefines a custom filter that controls if the aura button should be shown.\n\n\t\t\t\t\t\t* self - the widget holding the aura buttons\n\t\t\t\t\t\t* unit - the unit on which the aura is cast (string)\n\t\t\t\t\t\t* data - [UnitAuraInfo](https://wowpedia.fandom.com/wiki/Struct_UnitAuraInfo) object (table)\n\n\t\t\t\t\t\t## Returns\n\n\t\t\t\t\t\t* show - indicates whether the aura button should be shown (boolean)\n\t\t\t\t\t\t--]]\n\t\t\t\t\t\tif((auras.FilterAura or FilterAura) (auras, unit, data)) then\n\t\t\t\t\t\t\tauras.activeBuffs[data.auraInstanceID] = data\n\n\t\t\t\t\t\t\ttable.insert(auras.sortedBuffs, data)\n\n\t\t\t\t\t\t\tcount = count + 1\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tauras.activeDebuffs = table.wipe(auras.activeDebuffs or {})\n\t\t\tauras.sortedDebuffs = table.wipe(auras.sortedDebuffs or {})\n\t\t\tnumDebuffs = math.min(numDebuffs, numTotal - #auras.sortedBuffs)\n\t\t\tdebuffsChanged = true\n\n\t\t\tslots = {UnitAuraSlots(unit, debuffFilter)}\n\t\t\tif(slots[2]) then -- #1 return is continuationToken, we don't care about it\n\t\t\t\tlocal count = 1\n\n\t\t\t\tfor i = 2, #slots do\n\t\t\t\t\tif(count <= numDebuffs) then\n\t\t\t\t\t\tlocal data = processData(C_UnitAuras.GetAuraDataBySlot(unit, slots[i]))\n\t\t\t\t\t\tif((auras.FilterAura or FilterAura) (auras, unit, data)) then\n\t\t\t\t\t\t\tauras.activeDebuffs[data.auraInstanceID] = data\n\n\t\t\t\t\t\t\ttable.insert(auras.sortedDebuffs, data)\n\n\t\t\t\t\t\t\tcount = count + 1\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif(updateInfo.updatedAuraInstanceIDs) then\n\t\t\t\tfor _, auraInstanceID in next, updateInfo.updatedAuraInstanceIDs do\n\t\t\t\t\tif(auras.activeBuffs[auraInstanceID]) then\n\t\t\t\t\t\tauras.activeBuffs[auraInstanceID] = processData(C_UnitAuras.GetAuraDataByAuraInstanceID(unit, auraInstanceID))\n\t\t\t\t\t\tbuffsChanged = true\n\t\t\t\t\telseif(auras.activeDebuffs[auraInstanceID]) then\n\t\t\t\t\t\tauras.activeDebuffs[auraInstanceID] = processData(C_UnitAuras.GetAuraDataByAuraInstanceID(unit, auraInstanceID))\n\t\t\t\t\t\tdebuffsChanged = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal buffCount = #auras.sortedBuffs\n\t\t\tlocal debuffCount = #auras.sortedDebuffs\n\n\t\t\tif(updateInfo.removedAuraInstanceIDs) then\n\t\t\t\tfor _, auraInstanceID in next, updateInfo.removedAuraInstanceIDs do\n\t\t\t\t\tif(auras.activeBuffs[auraInstanceID]) then\n\t\t\t\t\t\tauras.activeBuffs[auraInstanceID] = nil\n\t\t\t\t\t\tbuffCount = buffCount - 1\n\t\t\t\t\t\tbuffsChanged = true\n\t\t\t\t\telseif(auras.activeDebuffs[auraInstanceID]) then\n\t\t\t\t\t\tauras.activeDebuffs[auraInstanceID] = nil\n\t\t\t\t\t\tdebuffCount = debuffCount - 1\n\t\t\t\t\t\tdebuffsChanged = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tnumBuffs = math.min(numBuffs, numTotal)\n\n\t\t\tif(updateInfo.addedAuras) then\n\t\t\t\tfor _, data in next, updateInfo.addedAuras do\n\t\t\t\t\tif(data.isHelpful and not C_UnitAuras.IsAuraFilteredOutByInstanceID(unit, data.auraInstanceID, buffFilter)) then\n\t\t\t\t\t\t-- only try to add new auras if we have enough room for them\n\t\t\t\t\t\tif(buffCount <= numBuffs) then\n\t\t\t\t\t\t\tdata = processData(data)\n\t\t\t\t\t\t\tif((auras.FilterAura or FilterAura) (auras, unit, data)) then\n\t\t\t\t\t\t\t\tauras.activeBuffs[data.auraInstanceID] = data\n\t\t\t\t\t\t\t\tbuffCount = buffCount + 1\n\t\t\t\t\t\t\t\tbuffsChanged = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\telseif(data.isHarmful and not C_UnitAuras.IsAuraFilteredOutByInstanceID(unit, data.auraInstanceID, debuffFilter)) then\n\t\t\t\t\t\t-- only try to add new auras if we have enough room for them\n\t\t\t\t\t\tif(debuffCount <= math.min(numDebuffs, numTotal - buffCount)) then\n\t\t\t\t\t\t\tdata = processData(data)\n\t\t\t\t\t\t\tif((auras.FilterAura or FilterAura) (auras, unit, data)) then\n\t\t\t\t\t\t\t\tauras.activeDebuffs[data.auraInstanceID] = data\n\t\t\t\t\t\t\t\tdebuffCount = debuffCount + 1\n\t\t\t\t\t\t\t\tdebuffsChanged = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- instead of removing auras one by one, just wipe the tables entirely\n\t\t\t-- and repopulate them, multiple table.remove calls are insanely slow\n\t\t\tif(buffsChanged) then\n\t\t\t\tauras.sortedBuffs = table.wipe(auras.sortedBuffs or {})\n\n\t\t\t\tfor _, data in next, auras.activeBuffs do\n\t\t\t\t\ttable.insert(auras.sortedBuffs, data)\n\t\t\t\tend\n\n\t\t\t\t--[[ Override: Auras:SortBuffs(a, b)\n\t\t\t\tDefines a custom sorting alorithm for ordering the auras.\n\n\t\t\t\tDefaults to [AuraUtil.DefaultAuraCompare](https://github.com/Gethe/wow-ui-source/search?q=DefaultAuraCompare).\n\t\t\t\t--]]\n\t\t\t\t--[[ Override: Auras:SortAuras(a, b)\n\t\t\t\tDefines a custom sorting alorithm for ordering the auras.\n\n\t\t\t\tDefaults to [AuraUtil.DefaultAuraCompare](https://github.com/Gethe/wow-ui-source/search?q=DefaultAuraCompare).\n\n\t\t\t\tOverridden by the more specific SortBuffs and/or SortDebuffs overrides if they are defined.\n\t\t\t\t--]]\n\t\t\t\ttable.sort(auras.sortedBuffs, auras.SortBuffs or auras.SortAuras or SortAuras)\n\t\t\tend\n\n\t\t\tif(debuffsChanged) then\n\t\t\t\tauras.sortedDebuffs = table.wipe(auras.sortedDebuffs or {})\n\n\t\t\t\tfor _, data in next, auras.activeDebuffs do\n\t\t\t\t\ttable.insert(auras.sortedDebuffs, data)\n\t\t\t\tend\n\n\t\t\t\t--[[ Override: Auras:SortDebuffs(a, b)\n\t\t\t\tDefines a custom sorting alorithm for ordering the auras.\n\n\t\t\t\tDefaults to [AuraUtil.DefaultAuraCompare](https://github.com/Gethe/wow-ui-source/search?q=DefaultAuraCompare).\n\t\t\t\t--]]\n\t\t\t\ttable.sort(auras.sortedDebuffs, auras.SortDebuffs or auras.SortAuras or SortAuras)\n\t\t\tend\n\t\tend\n\n\t\tif(not (buffsChanged or debuffsChanged)) then return end\n\n\t\tif(buffsChanged) then\n\t\t\tfor i = 1, #auras.sortedBuffs do\n\t\t\t\tupdateAura(auras, unit, auras.sortedBuffs[i], i)\n\t\t\tend\n\t\tend\n\n\t\tlocal offset = #auras.sortedBuffs\n\n\t\tif(auras.gap and #auras.sortedDebuffs > 0 and #auras.sortedBuffs > 0) then\n\t\t\toffset = offset + 1\n\n\t\t\tlocal button = auras[offset]\n\t\t\tif(not button) then\n\t\t\t\tbutton = (auras.CreateButton or CreateButton) (auras, offset)\n\t\t\t\ttable.insert(auras, button)\n\t\t\t\tauras.createdButtons = auras.createdButtons + 1\n\t\t\tend\n\n\t\t\t-- Prevent the button from displaying anything.\n\t\t\tif(button.Cooldown) then button.Cooldown:Hide() end\n\t\t\tif(button.Icon) then button.Icon:SetTexture() end\n\t\t\tif(button.Overlay) then button.Overlay:Hide() end\n\t\t\tif(button.Stealable) then button.Stealable:Hide() end\n\t\t\tif(button.Count) then button.Count:SetText(\"\") end\n\n\t\t\tbutton:EnableMouse(false)\n\t\t\tbutton:Hide()\t-- ShestakUI\n\n\t\t\t--[[ Callback: Auras:PostUpdateGapButton(unit, gapButton, offset)\n\t\t\tCalled after an invisible aura button has been created. Only used by Auras when the `gap` option is enabled.\n\n\t\t\t* self      - the widget holding the aura buttons\n\t\t\t* unit      - the unit that has the invisible aura button (string)\n\t\t\t* gapButton - the invisible aura button (Button)\n\t\t\t* offset    - the position of the invisible aura button (number)\n\t\t\t--]]\n\t\t\tif(auras.PostUpdateGapButton) then\n\t\t\t\tauras:PostUpdateGapButton(unit, button, offset)\n\t\t\tend\n\t\tend\n\n\t\t-- any changes to buffs will affect debuffs, so just redraw them\n\t\tfor i = 1, #auras.sortedDebuffs do\n\t\t\tupdateAura(auras, unit, auras.sortedDebuffs[i], i + offset)\n\t\tend\n\n\t\tfor i = offset + #auras.sortedDebuffs + 1, #auras do\n\t\t\tauras[i]:Hide()\n\t\tend\n\n\t\tif(auras.createdButtons > auras.anchoredButtons) then\n\t\t\t--[[ Override: Auras:SetPosition(from, to)\n\t\t\tUsed to (re-)anchor the aura buttons.\n\t\t\tCalled when new aura buttons have been created or if :PreSetPosition is defined.\n\n\t\t\t* self - the widget that holds the aura buttons\n\t\t\t* from - the offset of the first aura button to be (re-)anchored (number)\n\t\t\t* to   - the offset of the last aura button to be (re-)anchored (number)\n\t\t\t--]]\n\t\t\t(auras.SetPosition or SetPosition) (auras, auras.anchoredButtons + 1, auras.createdButtons)\n\t\t\tauras.anchoredButtons = auras.createdButtons\n\t\tend\n\n\t\t--[[ Callback: Auras:PostUpdate(unit)\n\t\tCalled after the element has been updated.\n\n\t\t* self - the widget holding the aura buttons\n\t\t* unit - the unit for which the update has been triggered (string)\n\t\t--]]\n\t\tif(auras.PostUpdate) then auras:PostUpdate(unit) end\n\tend\n\n\tlocal buffs = self.Buffs\n\tif(buffs) then\n\t\tif(buffs.PreUpdate) then buffs:PreUpdate(unit) end\n\n\t\tlocal buffsChanged = false\n\t\tlocal numBuffs = buffs.num or 32\n\t\tlocal buffFilter = buffs.filter or 'HELPFUL'\n\t\tif(type(buffFilter) == 'function') then\n\t\t\tbuffFilter = buffFilter(buffs, unit)\n\t\tend\n\n\t\tif(not updateInfo or updateInfo.isFullUpdate) then\n\t\t\tbuffs.active = table.wipe(buffs.active or {})\n\t\t\tbuffs.sorted = table.wipe(buffs.sorted or {})\n\t\t\tbuffsChanged = true\n\n\t\t\tlocal slots = {UnitAuraSlots(unit, buffFilter)}\n\t\t\tif(slots[2]) then -- #1 return is continuationToken, we don't care about it\n\t\t\t\tlocal count = 1\n\n\t\t\t\tfor i = 2, #slots do\n\t\t\t\t\tif count <= numBuffs then\n\t\t\t\t\t\tlocal data = processData(C_UnitAuras.GetAuraDataBySlot(unit, slots[i]))\n\t\t\t\t\t\tif((buffs.FilterAura or FilterAura) (buffs, unit, data)) then\n\t\t\t\t\t\t\tbuffs.active[data.auraInstanceID] = data\n\n\t\t\t\t\t\t\ttable.insert(buffs.sorted, data)\n\n\t\t\t\t\t\t\tcount = count + 1\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif(updateInfo.updatedAuraInstanceIDs) then\n\t\t\t\tfor _, auraInstanceID in next, updateInfo.updatedAuraInstanceIDs do\n\t\t\t\t\tif(buffs.active[auraInstanceID]) then\n\t\t\t\t\t\tbuffs.active[auraInstanceID] = processData(C_UnitAuras.GetAuraDataByAuraInstanceID(unit, auraInstanceID))\n\t\t\t\t\t\tbuffsChanged = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal buffCount = #buffs.sorted\n\n\t\t\tif(updateInfo.removedAuraInstanceIDs) then\n\t\t\t\tfor _, auraInstanceID in next, updateInfo.removedAuraInstanceIDs do\n\t\t\t\t\tif(buffs.active[auraInstanceID]) then\n\t\t\t\t\t\tbuffs.active[auraInstanceID] = nil\n\t\t\t\t\t\tbuffCount = buffCount - 1\n\t\t\t\t\t\tbuffsChanged = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif(updateInfo.addedAuras) then\n\t\t\t\tfor _, data in next, updateInfo.addedAuras do\n\t\t\t\t\tif(data.isHelpful and not C_UnitAuras.IsAuraFilteredOutByInstanceID(unit, data.auraInstanceID, buffFilter)) then\n\t\t\t\t\t\t-- only try to add new buffs if we have enough room for them\n\t\t\t\t\t\tif(buffCount <= numBuffs) then\n\t\t\t\t\t\t\tdata = processData(data)\n\t\t\t\t\t\t\tif((buffs.FilterAura or FilterAura) (buffs, unit, data)) then\n\t\t\t\t\t\t\t\tbuffs.active[data.auraInstanceID] = data\n\t\t\t\t\t\t\t\tbuffCount = buffCount + 1\n\t\t\t\t\t\t\t\tbuffsChanged = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif(buffsChanged) then\n\t\t\t\tbuffs.sorted = table.wipe(buffs.sorted or {})\n\n\t\t\t\tfor _, data in next, buffs.active do\n\t\t\t\t\ttable.insert(buffs.sorted, data)\n\t\t\t\tend\n\n\t\t\t\ttable.sort(buffs.sorted, buffs.SortBuffs or buffs.SortAuras or SortAuras)\n\t\t\tend\n\t\tend\n\n\t\tif(not buffsChanged) then return end\n\n\t\tfor i = 1, #buffs.sorted do\n\t\t\tupdateAura(buffs, unit, buffs.sorted[i], i)\n\t\tend\n\n\t\tfor i = #buffs.sorted + 1, #buffs do\n\t\t\tbuffs[i]:Hide()\n\t\tend\n\n\t\tif(buffs.createdButtons > buffs.anchoredButtons) then\n\t\t\t(buffs.SetPosition or SetPosition) (buffs, buffs.anchoredButtons + 1, buffs.createdButtons)\n\t\t\tbuffs.anchoredButtons = buffs.createdButtons\n\t\tend\n\n\t\tif(buffs.PostUpdate) then buffs:PostUpdate(unit) end\n\tend\n\n\tlocal debuffs = self.Debuffs\n\tif(debuffs) then\n\t\tif(debuffs.PreUpdate) then debuffs:PreUpdate(unit) end\n\n\t\tlocal debuffsChanged = false\n\t\tlocal numDebuffs = debuffs.num or 40\n\t\tlocal debuffFilter = debuffs.filter or 'HARMFUL'\n\t\tif(type(debuffFilter) == 'function') then\n\t\t\tdebuffFilter = debuffFilter(debuffs, unit)\n\t\tend\n\n\t\tif(not updateInfo or updateInfo.isFullUpdate) then\n\t\t\tdebuffs.active = table.wipe(debuffs.active or {})\n\t\t\tdebuffs.sorted = table.wipe(debuffs.sorted or {})\n\t\t\tdebuffsChanged = true\n\n\t\t\tlocal slots = {UnitAuraSlots(unit, debuffFilter)}\n\t\t\tif(slots[2]) then -- #1 return is continuationToken, we don't care about it\n\t\t\t\tlocal count = 1\n\n\t\t\t\tfor i = 2, #slots do\n\t\t\t\t\tif count <= numDebuffs then\n\t\t\t\t\t\tlocal data = processData(C_UnitAuras.GetAuraDataBySlot(unit, slots[i]))\n\t\t\t\t\t\tif((debuffs.FilterAura or FilterAura) (debuffs, unit, data)) then\n\t\t\t\t\t\t\tdebuffs.active[data.auraInstanceID] = data\n\n\t\t\t\t\t\t\ttable.insert(debuffs.sorted, data)\n\n\t\t\t\t\t\t\tcount = count + 1\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif(updateInfo.updatedAuraInstanceIDs) then\n\t\t\t\tfor _, auraInstanceID in next, updateInfo.updatedAuraInstanceIDs do\n\t\t\t\t\tif(debuffs.active[auraInstanceID]) then\n\t\t\t\t\t\tdebuffs.active[auraInstanceID] = processData(C_UnitAuras.GetAuraDataByAuraInstanceID(unit, auraInstanceID))\n\t\t\t\t\t\tdebuffsChanged = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal debuffCount = #debuffs.sorted\n\n\t\t\tif(updateInfo.removedAuraInstanceIDs) then\n\t\t\t\tfor _, auraInstanceID in next, updateInfo.removedAuraInstanceIDs do\n\t\t\t\t\tif(debuffs.active[auraInstanceID]) then\n\t\t\t\t\t\tdebuffs.active[auraInstanceID] = nil\n\t\t\t\t\t\tdebuffCount = debuffCount - 1\n\t\t\t\t\t\tdebuffsChanged = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif(updateInfo.addedAuras) then\n\t\t\t\tfor _, data in next, updateInfo.addedAuras do\n\t\t\t\t\tif(data.isHarmful and not C_UnitAuras.IsAuraFilteredOutByInstanceID(unit, data.auraInstanceID, debuffFilter)) then\n\t\t\t\t\t\t-- only try to add new debuffs if we have enough room for them\n\t\t\t\t\t\tif(debuffCount <= numDebuffs) then\n\t\t\t\t\t\t\tdata = processData(data)\n\t\t\t\t\t\t\tif((debuffs.FilterAura or FilterAura) (debuffs, unit, data)) then\n\t\t\t\t\t\t\t\tdebuffs.active[data.auraInstanceID] = data\n\t\t\t\t\t\t\t\tdebuffCount = debuffCount + 1\n\t\t\t\t\t\t\t\tdebuffsChanged = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif(debuffsChanged) then\n\t\t\t\tdebuffs.sorted = table.wipe(debuffs.sorted or {})\n\n\t\t\t\tfor _, data in next, debuffs.active do\n\t\t\t\t\ttable.insert(debuffs.sorted, data)\n\t\t\t\tend\n\n\t\t\t\ttable.sort(debuffs.sorted, debuffs.SortDebuffs or debuffs.SortAuras or SortAuras)\n\t\t\tend\n\t\tend\n\n\t\tif(not debuffsChanged) then return end\n\n\t\tfor i = 1, #debuffs.sorted do\n\t\t\tupdateAura(debuffs, unit, debuffs.sorted[i], i)\n\t\tend\n\n\t\tfor i = #debuffs.sorted + 1, #debuffs do\n\t\t\tdebuffs[i]:Hide()\n\t\tend\n\n\t\tif(debuffs.createdButtons > debuffs.anchoredButtons) then\n\t\t\t(debuffs.SetPosition or SetPosition) (debuffs, debuffs.anchoredButtons + 1, debuffs.createdButtons)\n\t\t\tdebuffs.anchoredButtons = debuffs.createdButtons\n\t\tend\n\n\t\tif(debuffs.PostUpdate) then debuffs:PostUpdate(unit) end\n\tend\nend\n\nlocal function Update(self, event, unit, updateInfo)\n\tif(self.unit ~= unit) then return end\n\n\tUpdateAuras(self, event, unit, updateInfo)\n\n\t-- Assume no event means someone wants to re-anchor things. This is usually\n\t-- done by UpdateAllElements and :ForceUpdate.\n\tif(event == 'ForceUpdate' or not event) then\n\t\tlocal auras = self.Auras\n\t\tif(auras) then\n\t\t\t(auras.SetPosition or SetPosition) (auras, 1, auras.createdButtons)\n\t\tend\n\n\t\tlocal buffs = self.Buffs\n\t\tif(buffs) then\n\t\t\t(buffs.SetPosition or SetPosition) (buffs, 1, buffs.createdButtons)\n\t\tend\n\n\t\tlocal debuffs = self.Debuffs\n\t\tif(debuffs) then\n\t\t\t(debuffs.SetPosition or SetPosition) (debuffs, 1, debuffs.createdButtons)\n\t\tend\n\tend\nend\n\nlocal function Update(self, event, unit, updateInfo)\n\tif(self.unit ~= unit) then return end\n\n\tUpdateAuras(self, event, unit, updateInfo)\n\n\t-- Assume no event means someone wants to re-anchor things. This is usually\n\t-- done by UpdateAllElements and :ForceUpdate.\n\tif(event == 'ForceUpdate' or not event) then\n\t\tlocal auras = self.Auras\n\t\tif(auras) then\n\t\t\t(auras.SetPosition or SetPosition) (auras, 1, auras.createdButtons)\n\t\tend\n\n\t\tlocal buffs = self.Buffs\n\t\tif(buffs) then\n\t\t\t(buffs.SetPosition or SetPosition) (buffs, 1, buffs.createdButtons)\n\t\tend\n\n\t\tlocal debuffs = self.Debuffs\n\t\tif(debuffs) then\n\t\t\t(debuffs.SetPosition or SetPosition) (debuffs, 1, debuffs.createdButtons)\n\t\tend\n\tend\nend\n\nlocal function ForceUpdate(element)\n\treturn Update(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tif(self.Auras or self.Buffs or self.Debuffs) then\n\t\tself:RegisterEvent('UNIT_AURA', UpdateAuras)\n\n\t\tlocal auras = self.Auras\n\t\tif(auras) then\n\t\t\tauras.__owner = self\n\t\t\t-- check if there's any anchoring restrictions\n\t\t\tauras.__restricted = not pcall(self.GetCenter, self)\n\t\t\tauras.ForceUpdate = ForceUpdate\n\n\t\t\tauras.createdButtons = auras.createdButtons or 0\n\t\t\tauras.anchoredButtons = 0\n\t\t\tauras.tooltipAnchor = auras.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'\n\n\t\t\t-- auras:Show() -- ShestakUI\n\t\tend\n\n\t\tlocal buffs = self.Buffs\n\t\tif(buffs) then\n\t\t\tbuffs.__owner = self\n\t\t\t-- check if there's any anchoring restrictions\n\t\t\tbuffs.__restricted = not pcall(self.GetCenter, self)\n\t\t\tbuffs.ForceUpdate = ForceUpdate\n\n\t\t\tbuffs.createdButtons = buffs.createdButtons or 0\n\t\t\tbuffs.anchoredButtons = 0\n\t\t\tbuffs.tooltipAnchor = buffs.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'\n\n\t\t\t-- buffs:Show() -- ShestakUI\n\t\tend\n\n\t\tlocal debuffs = self.Debuffs\n\t\tif(debuffs) then\n\t\t\tdebuffs.__owner = self\n\t\t\t-- check if there's any anchoring restrictions\n\t\t\tdebuffs.__restricted = not pcall(self.GetCenter, self)\n\t\t\tdebuffs.ForceUpdate = ForceUpdate\n\n\t\t\tdebuffs.createdButtons = debuffs.createdButtons or 0\n\t\t\tdebuffs.anchoredButtons = 0\n\t\t\tdebuffs.tooltipAnchor = debuffs.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'\n\n\t\t\t-- debuffs:Show() -- ShestakUI\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tif(self.Auras or self.Buffs or self.Debuffs) then\n\t\tself:UnregisterEvent('UNIT_AURA', UpdateAuras)\n\n\t\tif(self.Auras) then self.Auras:Hide() end\n\t\tif(self.Buffs) then self.Buffs:Hide() end\n\t\tif(self.Debuffs) then self.Debuffs:Hide() end\n\tend\nend\n\noUF:AddElement('Auras', Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/CastBar.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal FALLBACK_ICON = 136243 -- Interface\\ICONS\\Trade_Engineering\nlocal FAILED = _G.FAILED or 'Failed'\nlocal INTERRUPTED = _G.INTERRUPTED or 'Interrupted'\nlocal CASTBAR_STAGE_DURATION_INVALID = -1 -- defined in FrameXML/CastingBarFrame.lua\n\nlocal function resetAttributes(self)\n\tself.castID = nil\n\tself.casting = nil\n\tself.channeling = nil\n\tself.empowering = nil\n\tself.notInterruptible = nil\n\tself.spellID = nil\n\n\tfor _, pip in next, self.Pips do\n\t\tpip:Hide()\n\t\tif pip.texture then\n\t\t\tpip.texture:Hide()\n\t\t\tpip.gap:Hide()\n\t\tend\n\tend\nend\n\nlocal colorStage = {\n\t[1] = {1, 0, 0},\n\t[2] = {1, 0.4, 0},\n\t[3] = {1, 0.9, 0},\n\t[4] = {0, 1, 0.5},\n}\n\nlocal function CreatePip(element, stage)\n\tlocal frame = CreateFrame(\"Frame\", nil, element)\n\tframe:SetSize(2, element:GetHeight())\n\n\tlocal color = colorStage[stage] or {0, 0, 0}\n\n\tframe.texture = element:CreateTexture(nil, \"BORDER\", nil, -2)\n\tframe.texture:SetTexture(C.media.texture)\n\tframe.texture:SetVertexColor(unpack(color))\n\n\tlocal r, g, b = frame.texture:GetVertexColor()\n\tframe.gap = element:CreateTexture(nil, \"ARTWORK\")\n\tframe.gap:SetAllPoints(frame)\n\tframe.gap:SetTexture(C.media.texture)\n\tframe.gap:SetVertexColor(r * 0.75, g * 0.75, b * 0.75)\n\n\treturn frame\nend\n\nlocal function UpdatePips(element, numStages)\n\tlocal stageTotalDuration = 0\n\tlocal stageMaxValue = element.max * 1000\n\tlocal isHoriz = element:GetOrientation() == 'HORIZONTAL'\n\tlocal elementSize = isHoriz and element:GetWidth() or element:GetHeight()\n\n\tfor stage = 1, numStages do\n\t\tlocal duration\n\t\tif(stage > numStages) then\n\t\t\tduration = GetUnitEmpowerHoldAtMaxTime(element.__owner.unit)\n\t\telse\n\t\t\tduration = GetUnitEmpowerStageDuration(element.__owner.unit, stage - 1)\n\t\tend\n\n\t\tif(duration > CASTBAR_STAGE_DURATION_INVALID) then\n\t\t\tstageTotalDuration = stageTotalDuration + duration\n\n\t\t\tlocal portion = stageTotalDuration / stageMaxValue\n\t\t\tlocal offset = elementSize * portion\n\n\t\t\tlocal pip = element.Pips[stage]\n\t\t\tif(not pip) then\n\t\t\t\t--[[ Override: Castbar:CreatePip(stage)\n\t\t\t\tCreates a \"pip\" for the given stage, used for empowered casts.\n\n\t\t\t\t* self - the Castbar widget\n\n\t\t\t\t## Returns\n\n\t\t\t\t* pip - a frame used to depict an empowered stage boundary, typically with a line texture (frame)\n\t\t\t\t--]]\n\t\t\t\tpip = (element.CreatePip or CreatePip) (element, stage)\n\t\t\t\telement.Pips[stage] = pip\n\t\t\tend\n\n\t\t\tpip:ClearAllPoints()\n\t\t\tpip:Show()\n\n\t\t\tif(isHoriz) then\n\t\t\t\tpip:RotateTextures(0)\n\n\t\t\t\tif(element:GetReverseFill()) then\n\t\t\t\t\tpip:SetPoint('TOP', element, 'TOPRIGHT', -offset, 0)\n\t\t\t\t\tpip:SetPoint('BOTTOM', element, 'BOTTOMRIGHT', -offset, 0)\n\t\t\t\telse\n\t\t\t\t\tpip:SetPoint('TOP', element, 'TOPLEFT', offset, 0)\n\t\t\t\t\tpip:SetPoint('BOTTOM', element, 'BOTTOMLEFT', offset, 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tpip:RotateTextures(1.5708)\n\n\t\t\t\tif(element:GetReverseFill()) then\n\t\t\t\t\tpip:SetPoint('LEFT', element, 'TOPLEFT', 0, -offset)\n\t\t\t\t\tpip:SetPoint('RIGHT', element, 'TOPRIGHT', 0, -offset)\n\t\t\t\telse\n\t\t\t\t\tpip:SetPoint('LEFT', element, 'BOTTOMLEFT', 0, offset)\n\t\t\t\t\tpip:SetPoint('RIGHT', element, 'BOTTOMRIGHT', 0, offset)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\tlocal maxStage = #element.Pips\n\tfor i, pip in next, element.Pips do\n\t\tpip.texture:Show()\n\t\tpip.gap:Show()\n\t\tpip.texture:ClearAllPoints()\n\n\t\tif(element:GetReverseFill()) then\n\t\t\tif i == maxStage then\n\t\t\t\tpip.texture:SetPoint('TOPLEFT', element, 0, 0)\n\t\t\t\tpip.texture:SetPoint('BOTTOMRIGHT', pip, 0, 0)\n\t\t\telse\n\t\t\t\tlocal anchor = element.Pips[i + 1]\n\t\t\t\tpip.texture:SetPoint('TOPLEFT', anchor, 0, 0)\n\t\t\t\tpip.texture:SetPoint('BOTTOMRIGHT', pip, 0, 0)\n\t\t\tend\n\t\telse\n\t\t\tif i == maxStage then\n\t\t\t\tpip.texture:SetPoint('TOPRIGHT', element, 0, 0)\n\t\t\t\tpip.texture:SetPoint('BOTTOMLEFT', pip, 0, 0)\n\t\t\telse\n\t\t\t\tlocal anchor = element.Pips[i + 1]\n\t\t\t\tpip.texture:SetPoint('TOPRIGHT', anchor, 0, 0)\n\t\t\t\tpip.texture:SetPoint('BOTTOMLEFT', pip, 0, 0)\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function CastStart(self, event, unit)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.Castbar\n\n\tlocal numStages, _\n\tlocal name, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible, spellID = UnitCastingInfo(unit)\n\tevent = 'UNIT_SPELLCAST_START'\n\tif(not name) then\n\t\tname, text, texture, startTime, endTime, isTradeSkill, notInterruptible, spellID, _, numStages = UnitChannelInfo(unit)\n\t\tevent = (numStages and numStages > 0) and 'UNIT_SPELLCAST_EMPOWER_START' or 'UNIT_SPELLCAST_CHANNEL_START'\n\tend\n\n\tif(not name or (isTradeSkill and element.hideTradeSkills)) then\n\t\tresetAttributes(element)\n\t\telement:Hide()\n\n\t\treturn\n\tend\n\n\telement.casting = event == 'UNIT_SPELLCAST_START'\n\telement.channeling = event == 'UNIT_SPELLCAST_CHANNEL_START'\n\telement.empowering = event == 'UNIT_SPELLCAST_EMPOWER_START'\n\n\tif(element.empowering) then\n\t\tendTime = endTime + GetUnitEmpowerHoldAtMaxTime(unit)\n\tend\n\n\tendTime = endTime / 1000\n\tstartTime = startTime / 1000\n\n\telement.max = endTime - startTime\n\telement.startTime = startTime\n\telement.delay = 0\n\telement.notInterruptible = notInterruptible\n\telement.holdTime = 0\n\telement.castID = castID\n\telement.spellID = spellID\n\n\tif(element.channeling) then\n\t\telement.duration = endTime - GetTime()\n\telse\n\t\telement.duration = GetTime() - startTime\n\tend\n\n\telement:SetMinMaxValues(0, element.max)\n\telement:SetValue(element.duration)\n\n\tif(element.Icon) then element.Icon:SetTexture(texture or FALLBACK_ICON) end\n\tif(element.Shield) then element.Shield:SetShown(notInterruptible) end\n\tif(element.Spark) then element.Spark:Show() end\n\tif(element.Text) then element.Text:SetText(text) end\n\tif(element.Time) then element.Time:SetText() end\n\n\tlocal safeZone = element.SafeZone\n\tif(safeZone) then\n\t\tlocal isHoriz = element:GetOrientation() == 'HORIZONTAL'\n\n\t\tsafeZone:ClearAllPoints()\n\t\tsafeZone:SetPoint(isHoriz and 'TOP' or 'LEFT')\n\t\tsafeZone:SetPoint(isHoriz and 'BOTTOM' or 'RIGHT')\n\n\t\tif(element.channeling) then\n\t\t\tsafeZone:SetPoint(element:GetReverseFill() and (isHoriz and 'RIGHT' or 'TOP') or (isHoriz and 'LEFT' or 'BOTTOM'))\n\t\telse\n\t\t\tsafeZone:SetPoint(element:GetReverseFill() and (isHoriz and 'LEFT' or 'BOTTOM') or (isHoriz and 'RIGHT' or 'TOP'))\n\t\tend\n\n\t\tlocal ratio = (select(4, GetNetStats()) / 1000) / element.max\n\t\tif(ratio > 1) then\n\t\t\tratio = 1\n\t\tend\n\n\t\tsafeZone[isHoriz and 'SetWidth' or 'SetHeight'](safeZone, element[isHoriz and 'GetWidth' or 'GetHeight'](element) * ratio)\n\tend\n\n\tif(element.empowering) then\n\t\t--[[ Override: Castbar:UpdatePips(numStages)\n\t\tHandles updates for stage separators (pips) in an empowered cast.\n\n\t\t* self      - the Castbar widget\n\t\t* numStages - the number of stages in the current cast (number)\n\t\t--]]\n\t\t(element.UpdatePips or UpdatePips) (element, numStages)\n\tend\n\n\t--[[ Callback: Castbar:PostCastStart(unit)\n\tCalled after the element has been updated upon a spell cast or channel start.\n\n\t* self - the Castbar widget\n\t* unit - the unit for which the update has been triggered (string)\n\t--]]\n\tif(element.PostCastStart) then\n\t\telement:PostCastStart(unit)\n\tend\n\n\telement:Show()\nend\n\nlocal function CastUpdate(self, event, unit, castID, spellID)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.Castbar\n\tif(not element:IsShown() or element.castID ~= castID or element.spellID ~= spellID) then\n\t\treturn\n\tend\n\n\tlocal name, startTime, endTime, _\n\tif(event == 'UNIT_SPELLCAST_DELAYED') then\n\t\tname, _, _, startTime, endTime = UnitCastingInfo(unit)\n\telse\n\t\tname, _, _, startTime, endTime = UnitChannelInfo(unit)\n\tend\n\n\tif(not name) then return end\n\n\tif(element.empowering) then\n\t\tendTime = endTime + GetUnitEmpowerHoldAtMaxTime(unit)\n\tend\n\n\tendTime = endTime / 1000\n\tstartTime = startTime / 1000\n\n\tlocal delta\n\tif(element.channeling) then\n\t\tdelta = element.startTime - startTime\n\n\t\telement.duration = endTime - GetTime()\n\telse\n\t\tdelta = startTime - element.startTime\n\n\t\telement.duration = GetTime() - startTime\n\tend\n\n\tif(delta < 0) then\n\t\tdelta = 0\n\tend\n\n\telement.max = endTime - startTime\n\telement.startTime = startTime\n\telement.delay = element.delay + delta\n\n\telement:SetMinMaxValues(0, element.max)\n\telement:SetValue(element.duration)\n\n\t--[[ Callback: Castbar:PostCastUpdate(unit)\n\tCalled after the element has been updated when a spell cast or channel has been updated.\n\n\t* self - the Castbar widget\n\t* unit - the unit that the update has been triggered (string)\n\t--]]\n\tif(element.PostCastUpdate) then\n\t\treturn element:PostCastUpdate(unit)\n\tend\nend\n\nlocal function CastStop(self, event, unit, castID, spellID)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.Castbar\n\tif(not element:IsShown() or element.castID ~= castID or element.spellID ~= spellID) then\n\t\treturn\n\tend\n\n\tresetAttributes(element)\n\n\t--[[ Callback: Castbar:PostCastStop(unit, spellID)\n\tCalled after the element has been updated when a spell cast or channel has stopped.\n\n\t* self    - the Castbar widget\n\t* unit    - the unit for which the update has been triggered (string)\n\t* spellID - the ID of the spell (number)\n\t--]]\n\tif(element.PostCastStop) then\n\t\treturn element:PostCastStop(unit, spellID)\n\tend\nend\n\nlocal function CastFail(self, event, unit, castID, spellID)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.Castbar\n\tif(not element:IsShown() or element.castID ~= castID or element.spellID ~= spellID) then\n\t\treturn\n\tend\n\n\tif(element.Text) then\n\t\telement.Text:SetText(event == 'UNIT_SPELLCAST_FAILED' and FAILED or INTERRUPTED)\n\tend\n\n\tif(element.Spark) then element.Spark:Hide() end\n\n\telement.holdTime = element.timeToHold or 0\n\n\tresetAttributes(element)\n\telement:SetValue(element.max)\n\n\t--[[ Callback: Castbar:PostCastFail(unit, spellID)\n\tCalled after the element has been updated upon a failed or interrupted spell cast.\n\n\t* self    - the Castbar widget\n\t* unit    - the unit for which the update has been triggered (string)\n\t* spellID - the ID of the spell (number)\n\t--]]\n\tif(element.PostCastFail) then\n\t\treturn element:PostCastFail(unit, spellID)\n\tend\nend\n\nlocal function CastInterruptible(self, event, unit)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.Castbar\n\tif(not element:IsShown()) then return end\n\n\telement.notInterruptible = event == 'UNIT_SPELLCAST_NOT_INTERRUPTIBLE'\n\n\tif(element.Shield) then element.Shield:SetShown(element.notInterruptible) end\n\n\t--[[ Callback: Castbar:PostCastInterruptible(unit)\n\tCalled after the element has been updated when a spell cast has become interruptible or uninterruptible.\n\n\t* self - the Castbar widget\n\t* unit - the unit for which the update has been triggered (string)\n\t--]]\n\tif(element.PostCastInterruptible) then\n\t\treturn element:PostCastInterruptible(unit)\n\tend\nend\n\nlocal function onUpdate(self, elapsed)\n\tif(self.casting or self.channeling or self.empowering) then\n\t\tlocal isCasting = self.casting or self.empowering\n\t\tif(isCasting) then\n\t\t\tself.duration = self.duration + elapsed\n\t\t\tif(self.duration >= self.max) then\n\t\t\t\tlocal spellID = self.spellID\n\n\t\t\t\tresetAttributes(self)\n\t\t\t\tself:Hide()\n\n\t\t\t\tif(self.PostCastStop) then\n\t\t\t\t\tself:PostCastStop(self.__owner.unit, spellID)\n\t\t\t\tend\n\n\t\t\t\treturn\n\t\t\tend\n\t\telse\n\t\t\tself.duration = self.duration - elapsed\n\t\t\tif(self.duration <= 0) then\n\t\t\t\tlocal spellID = self.spellID\n\n\t\t\t\tresetAttributes(self)\n\t\t\t\tself:Hide()\n\n\t\t\t\tif(self.PostCastStop) then\n\t\t\t\t\tself:PostCastStop(self.__owner.unit, spellID)\n\t\t\t\tend\n\n\t\t\t\treturn\n\t\t\tend\n\t\tend\n\n\t\tif(self.Time) then\n\t\t\tif(self.delay ~= 0) then\n\t\t\t\tif(self.CustomDelayText) then\n\t\t\t\t\tself:CustomDelayText(self.duration)\n\t\t\t\telse\n\t\t\t\t\tself.Time:SetFormattedText('%.1f|cffff0000%s%.2f|r', self.duration, isCasting and '+' or '-', self.delay)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif(self.CustomTimeText) then\n\t\t\t\t\tself:CustomTimeText(self.duration)\n\t\t\t\telse\n\t\t\t\t\tself.Time:SetFormattedText('%.1f', self.duration)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tself:SetValue(self.duration)\n\telseif(self.holdTime > 0) then\n\t\tself.holdTime = self.holdTime - elapsed\n\telse\n\t\tresetAttributes(self)\n\t\tself:Hide()\n\tend\nend\n\nlocal function Update(...)\n\tCastStart(...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Update(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.Castbar\n\tif(element and unit and not unit:match('%wtarget$')) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_SPELLCAST_START', CastStart)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_CHANNEL_START', CastStart)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_EMPOWER_START', CastStart)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_STOP', CastStop)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_CHANNEL_STOP', CastStop)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_EMPOWER_STOP', CastStop)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_DELAYED', CastUpdate)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_CHANNEL_UPDATE', CastUpdate)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_EMPOWER_UPDATE', CastUpdate)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_FAILED', CastFail)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_INTERRUPTED', CastFail)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_INTERRUPTIBLE', CastInterruptible)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_NOT_INTERRUPTIBLE', CastInterruptible)\n\n\t\telement.holdTime = 0\n\t\telement.Pips = {}\n\n\t\telement:SetScript('OnUpdate', element.OnUpdate or onUpdate)\n\n\t\tif(self.unit == 'player' and not (self.hasChildren or self.isChild or self.isNamePlate)) then\n\t\t\tPlayerCastingBarFrame:SetUnit(nil)\n\t\t\tPetCastingBarFrame:SetUnit(nil)\n\t\t\tPetCastingBarFrame:UnregisterEvent('UNIT_PET')\n\t\tend\n\n\t\tif(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then\n\t\t\telement:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\tend\n\n\t\tlocal spark = element.Spark\n\t\tif(spark and spark:IsObjectType('Texture') and not spark:GetTexture()) then\n\t\t\tspark:SetTexture([[Interface\\CastingBar\\UI-CastingBar-Spark]])\n\t\tend\n\n\t\tlocal shield = element.Shield\n\t\tif(shield and shield:IsObjectType('Texture') and not shield:GetTexture()) then\n\t\t\tshield:SetTexture([[Interface\\CastingBar\\UI-CastingBar-Small-Shield]])\n\t\tend\n\n\t\tlocal safeZone = element.SafeZone\n\t\tif(safeZone and safeZone:IsObjectType('Texture') and not safeZone:GetTexture()) then\n\t\t\tsafeZone:SetColorTexture(1, 0, 0)\n\t\tend\n\n\t\telement:Hide()\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Castbar\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_START', CastStart)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_CHANNEL_START', CastStart)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_EMPOWER_START', CastStart)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_STOP', CastStop)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_CHANNEL_STOP', CastStop)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_EMPOWER_STOP', CastStop)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_DELAYED', CastUpdate)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_CHANNEL_UPDATE', CastUpdate)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_EMPOWER_UPDATE', CastUpdate)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_FAILED', CastFail)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_INTERRUPTED', CastFail)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_INTERRUPTIBLE', CastInterruptible)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_NOT_INTERRUPTIBLE', CastInterruptible)\n\n\t\telement:SetScript('OnUpdate', nil)\n\n\t\tif(self.unit == 'player' and not (self.hasChildren or self.isChild or self.isNamePlate)) then\n\t\t\tPlayerCastingBarFrame:OnLoad()\n\t\t\tPetCastingBarFrame:PetCastingBar_OnLoad()\n\t\tend\n\tend\nend\n\noUF:AddElement('Castbar', Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/CombatIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(self, event)\n\tlocal element = self.CombatIndicator\n\n\t--[[ Callback: CombatIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the CombatIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal inCombat = UnitAffectingCombat('player')\n\tif(inCombat) then\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: CombatIndicator:PostUpdate(inCombat)\n\tCalled after the element has been updated.\n\n\t* self     - the CombatIndicator element\n\t* inCombat - indicates if the player is affecting combat (boolean)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(inCombat)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: CombatIndicator.Override(self, event)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t--]]\n\treturn (self.CombatIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate')\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.CombatIndicator\n\tif(element and UnitIsUnit(unit, 'player')) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('PLAYER_REGEN_DISABLED', Path, true)\n\t\tself:RegisterEvent('PLAYER_REGEN_ENABLED', Path, true)\n\n\t\tif(element:IsObjectType('Texture') and not element:GetTexture()) then\n\t\t\telement:SetTexture([[Interface\\CharacterFrame\\UI-StateIcon]])\n\t\t\telement:SetTexCoord(.5, 1, 0, .49)\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.CombatIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('PLAYER_REGEN_DISABLED', Path)\n\t\tself:UnregisterEvent('PLAYER_REGEN_ENABLED', Path)\n\tend\nend\n\noUF:AddElement('CombatIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/GroupRoleIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(self, event)\n\tlocal element = self.GroupRoleIndicator\n\n\t--[[ Callback: GroupRoleIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the GroupRoleIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal role = UnitGroupRolesAssigned(self.unit)\n\tif role == 'TANK' then\n\t\telement:SetTexture([[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Tank.tga]])\n\t\telement:Show()\n\telseif role == 'HEALER' then\n\t\telement:SetTexture([[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Healer.tga]])\n\t\telement:Show()\n\telseif role == 'DAMAGER' then\n\t\telement:SetTexture([[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Damager.tga]])\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: GroupRoleIndicator:PostUpdate(role)\n\tCalled after the element has been updated.\n\n\t* self - the GroupRoleIndicator element\n\t* role - the role as returned by [UnitGroupRolesAssigned](http://wowprogramming.com/docs/api/UnitGroupRolesAssigned.html)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(role)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: GroupRoleIndicator.Override(self, event, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.GroupRoleIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate')\nend\n\nlocal function Enable(self)\n\tlocal element = self.GroupRoleIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tif(self.unit == 'player') then\n\t\t\tself:RegisterEvent('PLAYER_ROLES_ASSIGNED', Path, true)\n\t\telse\n\t\t\tself:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.GroupRoleIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('PLAYER_ROLES_ASSIGNED', Path)\n\t\tself:UnregisterEvent('GROUP_ROSTER_UPDATE', Path, true)\n\tend\nend\n\noUF:AddElement('GroupRoleIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/HealPrediction.lua",
    "content": "-- ShestakUI use modified version of HealPrediction. Do not update if you are not sure what you are doing.\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function UpdateFillBar(frame, previousTexture, bar, amount, maxHealth, reverse)\n\tif amount == 0 then\n\t\tbar:Hide()\n\t\treturn previousTexture\n\tend\n\n\tlocal totalWidth, totalHeight = frame.Health:GetSize()\n\tif frame.Health:GetOrientation() == \"VERTICAL\" then\n\t\tif reverse then\n\t\t\tbar:SetPoint(\"TOP\", previousTexture, \"TOP\", 0, 0)\n\t\telse\n\t\t\tbar:SetPoint(\"BOTTOM\", previousTexture, \"TOP\", 0, 0)\n\t\tend\n\n\t\tlocal barSize = (amount / maxHealth) * totalHeight\n\t\tbar:SetHeight(barSize)\n\telse\n\t\tif reverse then\n\t\t\tbar:SetPoint(\"TOPRIGHT\", previousTexture, \"TOPRIGHT\", 0, 0)\n\t\t\tbar:SetPoint(\"BOTTOMRIGHT\", previousTexture, \"BOTTOMRIGHT\", 0, 0)\n\t\telse\n\t\t\tbar:SetPoint(\"TOPLEFT\", previousTexture, \"TOPRIGHT\", 0, 0)\n\t\t\tbar:SetPoint(\"BOTTOMLEFT\", previousTexture, \"BOTTOMRIGHT\", 0, 0)\n\t\tend\n\n\t\tlocal barSize = (amount / maxHealth) * totalWidth\n\t\tbar:SetWidth(barSize)\n\tend\n\tbar:Show()\n\n\treturn bar\nend\n\nlocal function Update(self, event, unit)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.HealthPrediction\n\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tlocal myIncomingHeal = UnitGetIncomingHeals(unit, 'player') or 0\n\tlocal allIncomingHeal = UnitGetIncomingHeals(unit) or 0\n\tlocal absorb = UnitGetTotalAbsorbs(unit) or 0\n\tlocal healAbsorb = UnitGetTotalHealAbsorbs(unit) or 0\n\tlocal health, maxHealth = UnitHealth(unit), UnitHealthMax(unit)\n\tlocal overAbsorb = 0\n\tlocal overHealAbsorb = 0\n\n\tif healAbsorb > allIncomingHeal then\n\t\thealAbsorb = healAbsorb - allIncomingHeal\n\t\tallIncomingHeal = 0\n\t\tmyIncomingHeal = 0\n\t\tabsorb = 0\n\n\t\tif health + healAbsorb > maxHealth then\n\t\t\toverHealAbsorb = min(maxHealth, healAbsorb)\n\t\t\thealAbsorb = maxHealth - health\n\t\t\toverHealAbsorb = overHealAbsorb - healAbsorb\n\t\tend\n\telse\n\t\tallIncomingHeal = allIncomingHeal - healAbsorb\n\t\thealAbsorb = 0\n\n\t\tif health + allIncomingHeal > maxHealth then\n\t\t\tallIncomingHeal = maxHealth - health\n\t\tend\n\n\t\tif(allIncomingHeal < myIncomingHeal) then\n\t\t\tmyIncomingHeal = allIncomingHeal\n\t\t\tallIncomingHeal = 0\n\t\telse\n\t\t\tallIncomingHeal = allIncomingHeal - myIncomingHeal\n\t\tend\n\n\t\tif health + myIncomingHeal + allIncomingHeal + absorb >= maxHealth then\n\t\t\toverAbsorb = min(maxHealth, absorb)\n\t\t\tabsorb = max(0, maxHealth - (health + myIncomingHeal + allIncomingHeal))\n\t\t\toverAbsorb = overAbsorb - absorb\n\t\tend\n\tend\n\n\tlocal previousTexture = self.Health:GetStatusBarTexture()\n\n\tif element.healAbsorbBar then\n\t\tpreviousTexture = UpdateFillBar(self, previousTexture, element.healAbsorbBar, healAbsorb, maxHealth)\n\tend\n\n\tif element.myBar then\n\t\tpreviousTexture = UpdateFillBar(self, previousTexture, element.myBar, myIncomingHeal, maxHealth)\n\tend\n\n\tif element.otherBar then\n\t\tpreviousTexture = UpdateFillBar(self, previousTexture, element.otherBar, allIncomingHeal, maxHealth)\n\tend\n\n\tif element.absorbBar then\n\t\tpreviousTexture = UpdateFillBar(self, previousTexture, element.absorbBar, absorb, maxHealth)\n\tend\n\n\tif element.overAbsorb then\n\t\tpreviousTexture = UpdateFillBar(self, self.Health, element.overAbsorb, overAbsorb, maxHealth, true)\n\tend\n\n\tif element.overHealAbsorb then\n\t\tpreviousTexture = UpdateFillBar(self, self.Health, element.overHealAbsorb, overHealAbsorb, maxHealth, true)\n\tend\n\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit, myIncomingHeal, otherIncomingHeal, absorb, healAbsorb)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: HealthPrediction.Override(self, event, unit)\n\tUsed to completely override the internal update function.\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event\n\t--]]\n\treturn (self.HealthPrediction.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tlocal element = self.HealthPrediction\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_HEALTH', Path)\n\t\tself:RegisterEvent('UNIT_MAXHEALTH', Path)\n\n\t\tif element.myBar or element.otherBar then\n\t\t\tself:RegisterEvent('UNIT_HEAL_PREDICTION', Path)\n\t\tend\n\n\t\tif element.absorbBar then\n\t\t\tself:RegisterEvent('UNIT_ABSORB_AMOUNT_CHANGED', Path)\n\t\tend\n\n\t\tif element.healAbsorbBar then\n\t\t\tself:RegisterEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', Path)\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.HealthPrediction\n\tif(element) then\n\t\tif(element.myBar) then\n\t\t\telement.myBar:Hide()\n\t\tend\n\n\t\tif(element.otherBar) then\n\t\t\telement.otherBar:Hide()\n\t\tend\n\n\t\tif(element.absorbBar) then\n\t\t\telement.absorbBar:Hide()\n\t\tend\n\n\t\tif(element.healAbsorbBar) then\n\t\t\telement.healAbsorbBar:Hide()\n\t\tend\n\n\t\tself:UnregisterEvent('UNIT_HEALTH', Path)\n\t\tself:UnregisterEvent('UNIT_MAXHEALTH', Path)\n\t\tself:UnregisterEvent('UNIT_HEAL_PREDICTION', Path)\n\t\tself:UnregisterEvent('UNIT_ABSORB_AMOUNT_CHANGED', Path)\n\t\tself:UnregisterEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', Path)\n\tend\nend\n\noUF:AddElement('HealthPrediction', Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/Health.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal unitSelectionType = Private.unitSelectionType\n\nlocal function UpdateColor(element, unit, cur, max)\n\tlocal parent = element.__owner\n\n\tlocal r, g, b, t\n\tif(element.colorTapping and not UnitPlayerControlled(unit) and UnitIsTapDenied(unit)) then\n\t\tt = parent.colors.tapped\n\telseif(element.colorDisconnected and element.disconnected) then\n\t\tt = parent.colors.disconnected\n\telseif(element.colorClass and UnitIsPlayer(unit)) or\n\t\t(element.colorClassNPC and not UnitIsPlayer(unit)) or\n\t\t(element.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then\n\t\tlocal _, class = UnitClass(unit)\n\t\tt = parent.colors.class[class]\n\telseif(element.colorSelection and unitSelectionType(unit, element.considerSelectionInCombatHostile)) then\n\t\tt = parent.colors.selection[unitSelectionType(unit, element.considerSelectionInCombatHostile)]\n\telseif(element.colorReaction and UnitReaction(unit, 'player')) then\n\t\tt = parent.colors.reaction[UnitReaction(unit, 'player')]\n\telseif(element.colorSmooth) then\n\t\tr, g, b = parent:ColorGradient(cur, max, unpack(element.smoothGradient or parent.colors.smooth))\n\telseif(element.colorHealth) then\n\t\tt = parent.colors.health\n\tend\n\n\tif(t) then\n\t\tr, g, b = t[1], t[2], t[3]\n\tend\n\n\tif(b) then\n\t\telement:SetStatusBarColor(r, g, b)\n\n\t\tlocal bg = element.bg\n\t\tif(bg) then\n\t\t\tlocal mu = bg.multiplier or 1\n\t\t\tbg:SetVertexColor(r * mu, g * mu, b * mu)\n\t\tend\n\tend\nend\n\nlocal function Update(self, event, unit)\n\tif(not unit or self.unit ~= unit) then return end\n\tlocal element = self.Health\n\n\t--[[ Callback: Health:PreUpdate(unit)\n\tCalled before the element has been updated.\n\n\t* self - the Health element\n\t* unit - the unit for which the update has been triggered (string)\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tlocal cur, max = UnitHealth(unit), UnitHealthMax(unit)\n\tlocal disconnected = not UnitIsConnected(unit)\n\telement:SetMinMaxValues(0, max)\n\n\tif(disconnected) then\n\t\telement:SetValue(max)\n\telse\n\t\telement:SetValue(cur)\n\tend\n\n\telement.disconnected = disconnected\n\n\t--[[ Override: Health:UpdateColor(unit, cur, max)\n\tUsed to completely override the internal function for updating the widgets' colors.\n\n\t* self - the Health element\n\t* unit - the unit for which the update has been triggered (string)\n\t* cur  - the unit's current health value (number)\n\t* max  - the unit's maximum possible health value (number)\n\t--]]\n\telement:UpdateColor(unit, cur, max)\n\n\t--[[ Callback: Health:PostUpdate(unit, cur, max)\n\tCalled after the element has been updated.\n\n\t* self - the Health element\n\t* unit - the unit for which the update has been triggered (string)\n\t* cur  - the unit's current health value (number)\n\t* max  - the unit's maximum possible health value (number)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit, cur, max)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: Health.Override(self, event, unit)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t--]]\n\treturn (self.Health.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.Health\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_HEALTH', Path)\n\t\tself:RegisterEvent('UNIT_MAXHEALTH', Path)\n\t\tself:RegisterEvent('UNIT_CONNECTION', Path)\n\t\tself:RegisterEvent('UNIT_FACTION', Path) -- For tapping\n\t\tself:RegisterEvent('UNIT_FLAGS', Path) -- For selection\n\n\t\t-- Fix disconnected players\n\t\tself:RegisterEvent('PARTY_MEMBER_ENABLE', Path)\n\t\tself:RegisterEvent('PARTY_MEMBER_DISABLE', Path)\n\n\t\tif(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then\n\t\t\telement:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\tend\n\n\t\tif(not element.UpdateColor) then\n\t\t\telement.UpdateColor = UpdateColor\n\t\tend\n\n\t\telement:Show()\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Health\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_HEALTH', Path)\n\t\tself:UnregisterEvent('UNIT_MAXHEALTH', Path)\n\t\tself:UnregisterEvent('UNIT_CONNECTION', Path)\n\t\tself:UnregisterEvent('UNIT_FACTION', Path)\n\t\tself:UnregisterEvent('UNIT_FLAGS', Path)\n\t\tself:UnregisterEvent('PARTY_MEMBER_ENABLE', Path)\n\t\tself:UnregisterEvent('PARTY_MEMBER_DISABLE', Path)\n\tend\nend\n\noUF:AddElement('Health', Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/LeaderIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(self, event)\n\tlocal element = self.LeaderIndicator\n\tlocal unit = self.unit\n\n\t--[[ Callback: LeaderIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the LeaderIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\t-- There are two kinds of group leaders: guides and leaders. Guides are leaders of groups formed via LFD/LFR.\n\t-- There are also two types of groups: home (LE_PARTY_CATEGORY_HOME) and instance (LE_PARTY_CATEGORY_INSTANCE).\n\t-- A unit can be the leader of both, only one, or none. Use UnitIsGroupLeader(unit, LE_PARTY_CATEGORY_HOME) and\n\t-- UnitIsGroupLeader(unit, LE_PARTY_CATEGORY_INSTANCE) for more detailed info.\n\t-- There can be only ONE guide in any given party, but there can be multiple leaders, for instance, if two 2-man\n\t-- premades were put in one group, they'll keep their leader roles which can be seen by other members of their\n\t-- own groups via UnitIsGroupLeader(unit, LE_PARTY_CATEGORY_HOME) or by members of other groups via\n\t-- UnitLeadsAnyGroup(unit). Inside the group formed by the dungeon finder UnitIsGroupLeader(unit) will only return\n\t-- true for the instance leader.\n\tlocal isInLFGInstance = HasLFGRestrictions()\n\tlocal isLeader = UnitIsGroupLeader(unit)\n\tif(isLeader) then\n\t\tif(isInLFGInstance) then\n\t\t\telement:SetTexture([[Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES]])\n\t\t\telement:SetTexCoord(0, 0.296875, 0.015625, 0.3125)\n\t\telse\n\t\t\telement:SetTexture([[Interface\\GroupFrame\\UI-Group-LeaderIcon]])\n\t\t\telement:SetTexCoord(0, 1, 0, 1)\n\t\tend\n\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: LeaderIndicator:PostUpdate(isLeader)\n\tCalled after the element has been updated.\n\n\t* self            - the LeaderIndicator element\n\t* isLeader        - indicates whether the unit is the leader of the group (boolean)\n\t* isInLFGInstance - indicates whether the current party is subject to LFG restrictions (boolean)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(isLeader, isInLFGInstance)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: LeaderIndicator.Override(self, event, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.LeaderIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate')\nend\n\nlocal function Enable(self)\n\tlocal element = self.LeaderIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('PARTY_LEADER_CHANGED', Path, true)\n\t\tself:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.LeaderIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('PARTY_LEADER_CHANGED', Path)\n\t\tself:UnregisterEvent('GROUP_ROSTER_UPDATE', Path)\n\tend\nend\n\noUF:AddElement('LeaderIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/PhaseIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\n--[[ Override: PhaseIndicator:UpdateTooltip()\nUsed to populate the tooltip when the widget is hovered.\n\n* self - the PhaseIndicator widget\n--]]\nlocal function UpdateTooltip(element)\n\tlocal text = PartyUtil.GetPhasedReasonString(element.reason, element.__owner.unit)\n\tif(text) then\n\t\tGameTooltip:SetText(text, nil, nil, nil, nil, true)\n\t\tGameTooltip:Show()\n\tend\nend\n\nlocal function onEnter(element)\n\tif(not element:IsVisible()) then return end\n\n\tif(element.reason) then\n\t\tGameTooltip:SetOwner(element, 'ANCHOR_BOTTOMRIGHT')\n\t\telement:UpdateTooltip()\n\tend\nend\n\nlocal function onLeave()\n\tGameTooltip:Hide()\nend\n\nlocal function Update(self, event, unit)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.PhaseIndicator\n\n\t--[[ Callback: PhaseIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the PhaseIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\t-- BUG: UnitPhaseReason returns wrong data for friendly NPCs in phased scenarios like WM or Chromie Time\n\t-- https://github.com/Stanzilla/WoWUIBugs/issues/49\n\tlocal phaseReason = UnitIsPlayer(unit) and UnitIsConnected(unit) and UnitPhaseReason(unit) or nil\n\tif(phaseReason) then\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\telement.reason = phaseReason\n\n\t--[[ Callback: PhaseIndicator:PostUpdate(isInSamePhase, phaseReason)\n\tCalled after the element has been updated.\n\n\t* self          - the PhaseIndicator element\n\t* isInSamePhase - indicates whether the unit is in the same phase as the player (boolean)\n\t* phaseReason   - the reason why the unit is in a different phase (number?)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(not phaseReason, phaseReason)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: PhaseIndicator.Override(self, event, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.PhaseIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tlocal element = self.PhaseIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_PHASE', Path)\n\n\t\tlocal icon = (element.Icon or element)\n\t\tif(icon:IsObjectType('Texture') and not icon:GetTexture()) then\n\t\t\ticon:SetTexture([[Interface\\TargetingFrame\\UI-PhasingIcon]])\n\t\tend\n\n\t\tif(element.IsMouseEnabled and element:IsMouseEnabled()) then\n\t\t\tif(not element:GetScript('OnEnter')) then\n\t\t\t\telement:SetScript('OnEnter', onEnter)\n\t\t\tend\n\n\t\t\tif(not element:GetScript('OnLeave')) then\n\t\t\t\telement:SetScript('OnLeave', onLeave)\n\t\t\tend\n\n\t\t\telement.UpdateTooltip = element.UpdateTooltip or UpdateTooltip\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.PhaseIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_PHASE', Path)\n\tend\nend\n\noUF:AddElement('PhaseIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/Portraits.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(self, event, unit)\n\tif(not unit or not UnitIsUnit(self.unit, unit)) then return end\n\n\tlocal element = self.Portrait\n\n\t--[[ Callback: Portrait:PreUpdate(unit)\n\tCalled before the element has been updated.\n\n\t* self - the Portrait element\n\t* unit - the unit for which the update has been triggered (string)\n\t--]]\n\tif(element.PreUpdate) then element:PreUpdate(unit) end\n\n\tlocal guid = UnitGUID(unit)\n\tlocal isAvailable = UnitIsConnected(unit) and UnitIsVisible(unit)\n\tif(event ~= 'OnUpdate' or element.guid ~= guid or element.state ~= isAvailable) then\n\t\tif(element:IsObjectType('PlayerModel')) then\n\t\t\tif(not isAvailable) then\n\t\t\t\telement:SetCamDistanceScale(0.25)\n\t\t\t\telement:SetPortraitZoom(0)\n\t\t\t\telement:SetPosition(0, 0, 0.25)\n\t\t\t\telement:ClearModel()\n\t\t\t\telement:SetModel([[Interface\\Buttons\\TalkToMeQuestionMark.m2]])\n\t\t\telse\n\t\t\t\telement:SetCamDistanceScale(1)\n\t\t\t\telement:SetPortraitZoom(1)\n\t\t\t\telement:SetPosition(0, 0, 0)\n\t\t\t\telement:ClearModel()\n\t\t\t\telement:SetUnit(unit)\n\t\t\tend\n\t\telse\n\t\t\tif element.classIcons then\n\t\t\t\tlocal _, class = UnitClass(self.unit)\n\t\t\t\tlocal texcoord = CLASS_ICON_TCOORDS[class]\n\t\t\t\telement.Icon:SetTexCoord(texcoord[1] + 0.015, texcoord[2] - 0.02, texcoord[3] + 0.018, texcoord[4] - 0.02)\n\t\t\telse\n\t\t\t\tSetPortraitTexture(element.Icon, unit)\n\t\t\t\telement.Icon:SetTexCoord(0.15, 0.85, 0.15, 0.85)\n\t\t\tend\n\t\tend\n\n\t\telement.guid = guid\n\t\telement.state = isAvailable\n\tend\n\n\t--[[ Callback: Portrait:PostUpdate(unit)\n\tCalled after the element has been updated.\n\n\t* self - the Portrait element\n\t* unit - the unit for which the update has been triggered (string)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: Portrait.Override(self, event, unit)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t--]]\n\treturn (self.Portrait.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.Portrait\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_MODEL_CHANGED', Path)\n\t\tself:RegisterEvent('UNIT_PORTRAIT_UPDATE', Path)\n\t\tself:RegisterEvent('PORTRAITS_UPDATED', Path, true)\n\t\tself:RegisterEvent('UNIT_CONNECTION', Path)\n\n\t\t-- The quest log uses PARTY_MEMBER_{ENABLE,DISABLE} to handle updating of\n\t\t-- party members overlapping quests. This will probably be enough to handle\n\t\t-- model updating.\n\t\t--\n\t\t-- DISABLE isn't used as it fires when we most likely don't have the\n\t\t-- information we want.\n\t\tif(unit == 'party') then\n\t\t\tself:RegisterEvent('PARTY_MEMBER_ENABLE', Path)\n\t\tend\n\n\t\tif element.classIcons then\n\t\t\telement.Icon:SetTexture(\"Interface\\\\WorldStateFrame\\\\Icons-Classes\")\n\t\tend\n\n\t\telement:Show()\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Portrait\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_MODEL_CHANGED', Path)\n\t\tself:UnregisterEvent('UNIT_PORTRAIT_UPDATE', Path)\n\t\tself:UnregisterEvent('PORTRAITS_UPDATED', Path)\n\t\tself:UnregisterEvent('PARTY_MEMBER_ENABLE', Path)\n\t\tself:UnregisterEvent('UNIT_CONNECTION', Path)\n\tend\nend\n\noUF:AddElement('Portrait', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/Power.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal unitSelectionType = Private.unitSelectionType\n\n-- sourced from FrameXML/UnitPowerBarAlt.lua\nlocal ALTERNATE_POWER_INDEX = Enum.PowerType.Alternate or 10\n\nlocal function GetDisplayPower(element)\n\tlocal unit = element.__owner.unit\n\tlocal barInfo = GetUnitPowerBarInfo(unit)\n\tif(barInfo and barInfo.showOnRaid and (UnitInParty(unit) or UnitInRaid(unit))) then\n\t\treturn ALTERNATE_POWER_INDEX, barInfo.minPower\n\tend\nend\n\nlocal function UpdateColor(element, unit, cur, min, max, displayType)\n\tlocal parent = element.__owner\n\tlocal ptype, ptoken, altR, altG, altB = UnitPowerType(unit)\n\n\tlocal r, g, b, t\n\tif(element.colorTapping and element.tapped) then\n\t\tt = parent.colors.tapped\n\telseif(element.colorDisconnected and element.disconnected) then\n\t\tt = parent.colors.disconnected\n\telseif(displayType == ALTERNATE_POWER_INDEX and element.altPowerColor) then\n\t\tt = element.altPowerColor\n\telseif(element.colorPower) then\n\t\tt = parent.colors.power[ptoken]\n\t\tif(not t) then\n\t\t\tif(element.GetAlternativeColor) then\n\t\t\t\tr, g, b = element:GetAlternativeColor(unit, ptype, ptoken, altR, altG, altB)\n\t\t\telseif(altR) then\n\t\t\t\tr, g, b = altR, altG, altB\n\n\t\t\t\tif(r > 1 or g > 1 or b > 1) then\n\t\t\t\t\t-- BUG: As of 7.0.3, altR, altG, altB may be in 0-1 or 0-255 range.\n\t\t\t\t\tr, g, b = r / 255, g / 255, b / 255\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tt = parent.colors.power[ptype]\n\t\t\tend\n\t\tend\n\telseif(element.colorClass and UnitIsPlayer(unit)) or\n\t\t(element.colorClassNPC and not UnitIsPlayer(unit)) or\n\t\t(element.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then\n\t\tlocal _, class = UnitClass(unit)\n\t\tt = parent.colors.class[class]\n\telseif(element.colorSelection and unitSelectionType(unit, element.considerSelectionInCombatHostile)) then\n\t\tt = parent.colors.selection[unitSelectionType(unit, element.considerSelectionInCombatHostile)]\n\telseif(element.colorReaction and UnitReaction(unit, 'player')) then\n\t\tt = parent.colors.reaction[UnitReaction(unit, 'player')]\n\telseif(element.colorSmooth) then\n\t\tlocal adjust = 0 - (min or 0)\n\t\tr, g, b = parent:ColorGradient(cur + adjust, max + adjust, unpack(element.smoothGradient or parent.colors.smooth))\n\tend\n\n\tif(t) then\n\t\tr, g, b = t[1], t[2], t[3]\n\tend\n\n\tif(b) then\n\t\telement:SetStatusBarColor(r, g, b)\n\n\t\tlocal bg = element.bg\n\t\tif(bg) then\n\t\t\tlocal mu = bg.multiplier or 1\n\t\t\tbg:SetVertexColor(r * mu, g * mu, b * mu)\n\t\tend\n\tend\nend\n\nlocal function Update(self, event, unit)\n\tif(self.unit ~= unit) then return end\n\tlocal element = self.Power\n\n\t--[[ Callback: Power:PreUpdate(unit)\n\tCalled before the element has been updated.\n\n\t* self - the Power element\n\t* unit - the unit for which the update has been triggered (string)\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tlocal displayType, min\n\tif(element.displayAltPower) then\n\t\tdisplayType, min = element:GetDisplayPower()\n\tend\n\n\tlocal cur, max = UnitPower(unit, displayType), UnitPowerMax(unit, displayType)\n\tlocal disconnected = not UnitIsConnected(unit)\n\tlocal tapped = not UnitPlayerControlled(unit) and UnitIsTapDenied(unit)\n\telement:SetMinMaxValues(min or 0, max)\n\n\tif(disconnected) then\n\t\telement:SetValue(max)\n\telse\n\t\telement:SetValue(cur)\n\tend\n\n\telement.disconnected = disconnected\n\telement.tapped = tapped\n\n\t--[[ Override: Power:UpdateColor(unit, cur, min, max, displayType)\n\tUsed to completely override the internal function for updating the widget's colors.\n\n\t* self        - the Power element\n\t* unit        - the unit for which the update has been triggered (string)\n\t* cur         - the unit's current power value (number)\n\t* min         - the unit's minimum possible power value (number)\n\t* max         - the unit's maximum possible power value (number)\n\t* displayType - the alternative power display type if applicable (number?)[Enum.PowerType.Alternate]\n\t--]]\n\telement:UpdateColor(unit, cur, min, max, displayType)\n\n\t--[[ Callback: Power:PostUpdate(unit, cur, min, max)\n\tCalled after the element has been updated.\n\n\t* self       - the Power element\n\t* unit       - the unit for which the update has been triggered (string)\n\t* cur        - the unit's current power value (number)\n\t* min        - the unit's minimum possible power value (number)\n\t* max        - the unit's maximum possible power value (number)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit, cur, min, max)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: Power.Override(self, event, unit, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.Power.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\n--[[ Power:SetFrequentUpdates(state)\nUsed to toggle frequent updates.\n\n* self  - the Power element\n* state - the desired state of frequent updates (boolean)\n--]]\nlocal function SetFrequentUpdates(element, state)\n\tif(element.frequentUpdates ~= state) then\n\t\telement.frequentUpdates = state\n\t\tif(element.frequentUpdates) then\n\t\t\telement.__owner:UnregisterEvent('UNIT_POWER_UPDATE', Path)\n\t\t\telement.__owner:RegisterEvent('UNIT_POWER_FREQUENT', Path)\n\t\telse\n\t\t\telement.__owner:UnregisterEvent('UNIT_POWER_FREQUENT', Path)\n\t\t\telement.__owner:RegisterEvent('UNIT_POWER_UPDATE', Path)\n\t\tend\n\tend\nend\n\nlocal function Enable(self)\n\tlocal element = self.Power\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\t\telement.SetFrequentUpdates = SetFrequentUpdates\n\n\t\tif(element.frequentUpdates) then\n\t\t\tself:RegisterEvent('UNIT_POWER_FREQUENT', Path)\n\t\telse\n\t\t\tself:RegisterEvent('UNIT_POWER_UPDATE', Path)\n\t\tend\n\n\t\tself:RegisterEvent('UNIT_POWER_BAR_SHOW', Path)\n\t\tself:RegisterEvent('UNIT_POWER_BAR_HIDE', Path)\n\t\tself:RegisterEvent('UNIT_DISPLAYPOWER', Path)\n\t\tself:RegisterEvent('UNIT_CONNECTION', Path)\n\t\tself:RegisterEvent('UNIT_MAXPOWER', Path)\n\t\tself:RegisterEvent('UNIT_FACTION', Path) -- For tapping\n\t\tself:RegisterEvent('UNIT_FLAGS', Path) -- For selection\n\n\t\tif(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then\n\t\t\telement:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\tend\n\n\t\tif(not element.UpdateColor) then\n\t\t\telement.UpdateColor = UpdateColor\n\t\tend\n\n\t\tif(not element.GetDisplayPower) then\n\t\t\telement.GetDisplayPower = GetDisplayPower\n\t\tend\n\n\t\telement:Show()\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Power\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_POWER_FREQUENT', Path)\n\t\tself:UnregisterEvent('UNIT_POWER_UPDATE', Path)\n\t\tself:UnregisterEvent('UNIT_POWER_BAR_SHOW', Path)\n\t\tself:UnregisterEvent('UNIT_POWER_BAR_HIDE', Path)\n\t\tself:UnregisterEvent('UNIT_DISPLAYPOWER', Path)\n\t\tself:UnregisterEvent('UNIT_CONNECTION', Path)\n\t\tself:UnregisterEvent('UNIT_MAXPOWER', Path)\n\t\tself:UnregisterEvent('UNIT_FACTION', Path)\n\t\tself:UnregisterEvent('UNIT_FLAGS', Path)\n\tend\nend\n\noUF:AddElement('Power', Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/PowerPrediction.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\n-- sourced from FrameXML/AlternatePowerBar.lua\nlocal ADDITIONAL_POWER_BAR_INDEX = _G.ADDITIONAL_POWER_BAR_INDEX or 0\nlocal ALT_MANA_BAR_PAIR_DISPLAY_INFO = _G.ALT_MANA_BAR_PAIR_DISPLAY_INFO\n\nlocal _, playerClass = UnitClass('player')\n\nlocal function Update(self, event, unit)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.PowerPrediction\n\n\t--[[ Callback: PowerPrediction:PreUpdate(unit)\n\tCalled before the element has been updated.\n\n\t* self - the PowerPrediction element\n\t* unit - the unit for which the update has been triggered (string)\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tlocal _, _, _, startTime, endTime, _, _, _, spellID = UnitCastingInfo(unit)\n\tlocal mainPowerType = UnitPowerType(unit)\n\tlocal hasAltManaBar = ALT_MANA_BAR_PAIR_DISPLAY_INFO[playerClass]\n\t\tand ALT_MANA_BAR_PAIR_DISPLAY_INFO[playerClass][mainPowerType]\n\tlocal mainCost, altCost = 0, 0\n\n\tif(event == 'UNIT_SPELLCAST_START' and startTime ~= endTime) then\n\t\tlocal costTable = GetSpellPowerCost(spellID)\n\t\t-- hasRequiredAura is always false if there's only 1 subtable\n\t\tlocal checkRequiredAura = #costTable > 1\n\n\t\tfor _, costInfo in next, costTable do\n\t\t\tif(not checkRequiredAura or costInfo.hasRequiredAura) then\n\t\t\t\tif(costInfo.type == mainPowerType) then\n\t\t\t\t\tmainCost = costInfo.cost\n\t\t\t\t\telement.mainCost = mainCost\n\n\t\t\t\t\tbreak\n\t\t\t\telseif(costInfo.type == ADDITIONAL_POWER_BAR_INDEX) then\n\t\t\t\t\taltCost = costInfo.cost\n\t\t\t\t\telement.altCost = altCost\n\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif(spellID) then\n\t\t-- if we try to cast a spell while casting another one we need to avoid\n\t\t-- resetting the element\n\t\tmainCost = element.mainCost or 0\n\t\taltCost = element.altCost or 0\n\telse\n\t\telement.mainCost = mainCost\n\t\telement.altCost = altCost\n\tend\n\n\tif(element.mainBar) then\n\t\telement.mainBar:SetMinMaxValues(0, UnitPowerMax(unit, mainPowerType))\n\t\telement.mainBar:SetValue(mainCost)\n\t\telement.mainBar:Show()\n\tend\n\n\tif(element.altBar and hasAltManaBar) then\n\t\telement.altBar:SetMinMaxValues(0, UnitPowerMax(unit, ADDITIONAL_POWER_BAR_INDEX))\n\t\telement.altBar:SetValue(altCost)\n\t\telement.altBar:Show()\n\tend\n\n\t--[[ Callback: PowerPrediction:PostUpdate(unit, mainCost, altCost, hasAltManaBar)\n\tCalled after the element has been updated.\n\n\t* self          - the PowerPrediction element\n\t* unit          - the unit for which the update has been triggered (string)\n\t* mainCost      - the main power type cost of the cast ability (number)\n\t* altCost       - the secondary power type cost of the cast ability (number)\n\t* hasAltManaBar - indicates if the unit has a secondary power bar (boolean)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit, mainCost, altCost, hasAltManaBar)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: PowerPrediction.Override(self, event, unit, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.PowerPrediction.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.PowerPrediction\n\tif(element and UnitIsUnit(unit, 'player')) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_SPELLCAST_START', Path)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_STOP', Path)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_FAILED', Path)\n\t\tself:RegisterEvent('UNIT_SPELLCAST_SUCCEEDED', Path)\n\t\tself:RegisterEvent('UNIT_DISPLAYPOWER', Path)\n\n\t\tif(element.mainBar) then\n\t\t\tif(element.mainBar:IsObjectType('StatusBar') and not element.mainBar:GetStatusBarTexture()) then\n\t\t\t\telement.mainBar:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\t\tend\n\t\tend\n\n\t\tif(element.altBar) then\n\t\t\tif(element.altBar:IsObjectType('StatusBar') and not element.altBar:GetStatusBarTexture()) then\n\t\t\t\telement.altBar:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\t\tend\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.PowerPrediction\n\tif(element) then\n\t\tif(element.mainBar) then\n\t\t\telement.mainBar:Hide()\n\t\tend\n\n\t\tif(element.altBar) then\n\t\t\telement.altBar:Hide()\n\t\tend\n\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_START', Path)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_STOP', Path)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_FAILED', Path)\n\t\tself:UnregisterEvent('UNIT_SPELLCAST_SUCCEEDED', Path)\n\t\tself:UnregisterEvent('UNIT_DISPLAYPOWER', Path)\n\tend\nend\n\noUF:AddElement('PowerPrediction', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/QuestIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(self, event, unit)\n\tif(unit ~= self.unit) then return end\n\n\tlocal element = self.QuestIndicator\n\n\t--[[ Callback: QuestIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the QuestIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal isQuestBoss = UnitIsQuestBoss(unit)\n\tif(isQuestBoss) then\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: QuestIndicator:PostUpdate(isQuestBoss)\n\tCalled after the element has been updated.\n\n\t* self        - the QuestIndicator element\n\t* isQuestBoss - indicates if the element is shown (boolean)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(isQuestBoss)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: QuestIndicator.Override(self, event, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.QuestIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tlocal element = self.QuestIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_CLASSIFICATION_CHANGED', Path)\n\n\t\tif(element:IsObjectType('Texture') and not element:GetTexture()) then\n\t\t\telement:SetTexture([[Interface\\TargetingFrame\\PortraitQuestBadge]])\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.QuestIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_CLASSIFICATION_CHANGED', Path)\n\tend\nend\n\noUF:AddElement('QuestIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/RaidTargetIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal GetRaidTargetIndex = GetRaidTargetIndex\nlocal SetRaidTargetIconTexture = SetRaidTargetIconTexture\n\nlocal function Update(self, event)\n\tlocal element = self.RaidTargetIndicator\n\n\t--[[ Callback: RaidTargetIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the RaidTargetIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal index = GetRaidTargetIndex(self.unit)\n\tif(index) then\n\t\tSetRaidTargetIconTexture(element, index)\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: RaidTargetIndicator:PostUpdate(index)\n\tCalled after the element has been updated.\n\n\t* self  - the RaidTargetIndicator element\n\t* index - the index of the raid target marker (number?)[1-8]\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(index)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: RaidTargetIndicator.Override(self, event)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t--]]\n\treturn (self.RaidTargetIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\tif(not element.__owner.unit) then return end\n\treturn Path(element.__owner, 'ForceUpdate')\nend\n\nlocal function Enable(self)\n\tlocal element = self.RaidTargetIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('RAID_TARGET_UPDATE', Path, true)\n\n\t\tif(element:IsObjectType('Texture') and not element:GetTexture()) then\n\t\t\telement:SetTexture([[Interface\\TargetingFrame\\UI-RaidTargetingIcons]])\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.RaidTargetIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('RAID_TARGET_UPDATE', Path)\n\tend\nend\n\noUF:AddElement('RaidTargetIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/Range.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal _FRAMES = {}\nlocal OnRangeFrame\n\nlocal UnitInRange, UnitIsConnected = UnitInRange, UnitIsConnected\n\nlocal function Update(self, event)\n\tlocal element = self.Range\n\tlocal unit = self.unit\n\n\t--[[ Callback: Range:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the Range element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal inRange, checkedRange\n\tlocal connected = UnitIsConnected(unit)\n\tif(connected) then\n\t\tinRange, checkedRange = UnitInRange(unit)\n\t\tif(checkedRange and not inRange) then\n\t\t\tself:SetAlpha(element.outsideAlpha)\n\t\telse\n\t\t\tself:SetAlpha(element.insideAlpha)\n\t\tend\n\telse\n\t\tself:SetAlpha(element.insideAlpha)\n\tend\n\n\t--[[ Callback: Range:PostUpdate(object, inRange, checkedRange, isConnected)\n\tCalled after the element has been updated.\n\n\t* self         - the Range element\n\t* object       - the parent object\n\t* inRange      - indicates if the unit was within 40 yards of the player (boolean)\n\t* checkedRange - indicates if the range check was actually performed (boolean)\n\t* isConnected  - indicates if the unit is online (boolean)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(self, inRange, checkedRange, connected)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: Range.Override(self, event)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t--]]\n\treturn (self.Range.Override or Update) (self, ...)\nend\n\n-- Internal updating method\nlocal timer = 0\nlocal function OnRangeUpdate(_, elapsed)\n\ttimer = timer + elapsed\n\n\tif(timer >= .20) then\n\t\tfor _, object in next, _FRAMES do\n\t\t\tif(object:IsShown()) then\n\t\t\t\tPath(object, 'OnUpdate')\n\t\t\tend\n\t\tend\n\n\t\ttimer = 0\n\tend\nend\n\nlocal function Enable(self)\n\tlocal element = self.Range\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.insideAlpha = element.insideAlpha or 1\n\t\telement.outsideAlpha = element.outsideAlpha or 0.55\n\n\t\tif(not OnRangeFrame) then\n\t\t\tOnRangeFrame = CreateFrame('Frame')\n\t\t\tOnRangeFrame:SetScript('OnUpdate', OnRangeUpdate)\n\t\tend\n\n\t\ttable.insert(_FRAMES, self)\n\t\tOnRangeFrame:Show()\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Range\n\tif(element) then\n\t\tfor index, frame in next, _FRAMES do\n\t\t\tif(frame == self) then\n\t\t\t\ttable.remove(_FRAMES, index)\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\t\tself:SetAlpha(element.insideAlpha)\n\n\t\tif(#_FRAMES == 0) then\n\t\t\tOnRangeFrame:Hide()\n\t\tend\n\tend\nend\n\noUF:AddElement('Range', nil, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/ReadyCheckIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal unitExists = Private.unitExists\n\nlocal function OnFinished(self)\n\tlocal element = self:GetParent()\n\telement:Hide()\n\n\t--[[ Callback: ReadyCheckIndicator:PostUpdateFadeOut()\n\tCalled after the element has been faded out.\n\n\t* self - the ReadyCheckIndicator element\n\t--]]\n\tif(element.PostUpdateFadeOut) then\n\t\telement:PostUpdateFadeOut()\n\tend\nend\n\nlocal function Update(self, event)\n\tlocal element = self.ReadyCheckIndicator\n\tlocal unit = self.unit\n\n\t--[[ Callback: ReadyCheckIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the ReadyCheckIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal status = GetReadyCheckStatus(unit)\n\tif(unitExists(unit) and status) then\n\t\tif(status == 'ready') then\n\t\t\telement:SetTexture(element.readyTexture)\n\t\telseif(status == 'notready') then\n\t\t\telement:SetTexture(element.notReadyTexture)\n\t\telse\n\t\t\telement:SetTexture(element.waitingTexture)\n\t\tend\n\n\t\telement.status = status\n\t\telement:Show()\n\telseif(event ~= 'READY_CHECK_FINISHED') then\n\t\telement.status = nil\n\t\telement:Hide()\n\tend\n\n\tif(event == 'READY_CHECK_FINISHED') then\n\t\tif(element.status == 'waiting') then\n\t\t\telement:SetTexture(element.notReadyTexture)\n\t\tend\n\n\t\telement.Animation:Play()\n\tend\n\n\t--[[ Callback: ReadyCheckIndicator:PostUpdate(status)\n\tCalled after the element has been updated.\n\n\t* self   - the ReadyCheckIndicator element\n\t* status - the unit's ready check status (string?)['ready', 'notready', 'waiting']\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(status)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: ReadyCheckIndicator.Override(self, event, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.ReadyCheckIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate')\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.ReadyCheckIndicator\n\tunit = unit and unit:match('(%a+)%d*$')\n\tif(element and (unit == 'party' or unit == 'raid')) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\telement.readyTexture = element.readyTexture or _G.READY_CHECK_READY_TEXTURE\n\t\telement.notReadyTexture = element.notReadyTexture or _G.READY_CHECK_NOT_READY_TEXTURE\n\t\telement.waitingTexture = element.waitingTexture or _G.READY_CHECK_WAITING_TEXTURE\n\n\t\tlocal AnimationGroup = element:CreateAnimationGroup()\n\t\tAnimationGroup:HookScript('OnFinished', OnFinished)\n\t\telement.Animation = AnimationGroup\n\n\t\tlocal Animation = AnimationGroup:CreateAnimation('Alpha')\n\t\tAnimation:SetFromAlpha(1)\n\t\tAnimation:SetToAlpha(0)\n\t\tAnimation:SetDuration(element.fadeTime or 1.5)\n\t\tAnimation:SetStartDelay(element.finishedTime or 10)\n\n\t\tself:RegisterEvent('READY_CHECK', Path, true)\n\t\tself:RegisterEvent('READY_CHECK_CONFIRM', Path, true)\n\t\tself:RegisterEvent('READY_CHECK_FINISHED', Path, true)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.ReadyCheckIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('READY_CHECK', Path)\n\t\tself:UnregisterEvent('READY_CHECK_CONFIRM', Path)\n\t\tself:UnregisterEvent('READY_CHECK_FINISHED', Path)\n\tend\nend\n\noUF:AddElement('ReadyCheckIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/RestingIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(self, event)\n\tlocal element = self.RestingIndicator\n\n\t--[[ Callback: RestingIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the RestingIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal isResting = IsResting()\n\tif(isResting) then\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: RestingIndicator:PostUpdate(isResting)\n\tCalled after the element has been updated.\n\n\t* self      - the RestingIndicator element\n\t* isResting - indicates if the player is resting (boolean)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(isResting)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: RestingIndicator.Override(self, event)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t--]]\n\treturn (self.RestingIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate')\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.RestingIndicator\n\tif(element and UnitIsUnit(unit, 'player')) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('PLAYER_UPDATE_RESTING', Path, true)\n\n\t\tif(element:IsObjectType('Texture') and not element:GetTexture()) then\n\t\t\telement:SetTexture([[Interface\\CharacterFrame\\UI-StateIcon]])\n\t\t\telement:SetTexCoord(0, 0.5, 0, 0.421875)\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.RestingIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('PLAYER_UPDATE_RESTING', Path)\n\tend\nend\n\noUF:AddElement('RestingIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/ResurrectIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(self, event, unit)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.ResurrectIndicator\n\n\t--[[ Callback: ResurrectIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the ResurrectIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal incomingResurrect = UnitHasIncomingResurrection(unit)\n\tif(incomingResurrect) then\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: ResurrectIndicator:PostUpdate(incomingResurrect)\n\tCalled after the element has been updated.\n\n\t* self              - the ResurrectIndicator element\n\t* incomingResurrect - indicates if the unit has an incoming resurrection (boolean)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(incomingResurrect)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: ResurrectIndicator.Override(self, event, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.ResurrectIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tlocal element = self.ResurrectIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('INCOMING_RESURRECT_CHANGED', Path)\n\n\t\tif(element:IsObjectType('Texture') and not element:GetTexture()) then\n\t\t\telement:SetTexture([[Interface\\RaidFrame\\Raid-Icon-Rez]])\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.ResurrectIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('INCOMING_RESURRECT_CHANGED', Path)\n\tend\nend\n\noUF:AddElement('ResurrectIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/Runes.lua",
    "content": "if(select(2, UnitClass('player')) ~= 'DEATHKNIGHT') then return end\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal runemap = {1, 2, 3, 4, 5, 6}\nlocal hasSortOrder = false\n\nlocal function onUpdate(self, elapsed)\n\tlocal duration = self.duration + elapsed\n\tself.duration = duration\n\tself:SetValue(duration)\nend\n\nlocal function ascSort(runeAID, runeBID)\n\tlocal runeAStart, _, runeARuneReady = GetRuneCooldown(runeAID)\n\tlocal runeBStart, _, runeBRuneReady = GetRuneCooldown(runeBID)\n\tif(runeARuneReady ~= runeBRuneReady) then\n\t\treturn runeARuneReady\n\telseif(runeAStart ~= runeBStart) then\n\t\treturn runeAStart < runeBStart\n\telse\n\t\treturn runeAID < runeBID\n\tend\nend\n\nlocal function descSort(runeAID, runeBID)\n\tlocal runeAStart, _, runeARuneReady = GetRuneCooldown(runeAID)\n\tlocal runeBStart, _, runeBRuneReady = GetRuneCooldown(runeBID)\n\tif(runeARuneReady ~= runeBRuneReady) then\n\t\treturn runeBRuneReady\n\telseif(runeAStart ~= runeBStart) then\n\t\treturn runeAStart > runeBStart\n\telse\n\t\treturn runeAID > runeBID\n\tend\nend\n\nlocal function UpdateColor(self, event)\n\tlocal element = self.Runes\n\n\tlocal spec = GetSpecialization() or 0\n\n\tlocal color\n\tif(spec > 0 and spec < 4 and element.colorSpec) then\n\t\tcolor = self.colors.runes[spec]\n\telse\n\t\tcolor = self.colors.power.RUNES\n\tend\n\n\tlocal r, g, b = color[1], color[2], color[3]\n\n\tfor index = 1, #element do\n\t\telement[index]:SetStatusBarColor(r, g, b)\n\n\t\tlocal bg = element[index].bg\n\t\tif(bg) then\n\t\t\tlocal mu = bg.multiplier or 1\n\t\t\tbg:SetVertexColor(r * mu, g * mu, b * mu)\n\t\tend\n\tend\n\n\t--[[ Callback: Runes:PostUpdateColor(r, g, b)\n\tCalled after the element color has been updated.\n\n\t* self - the Runes element\n\t* r    - the red component of the used color (number)[0-1]\n\t* g    - the green component of the used color (number)[0-1]\n\t* b    - the blue component of the used color (number)[0-1]\n\t--]]\n\tif(element.PostUpdateColor) then\n\t\telement:PostUpdateColor(r, g, b)\n\tend\nend\n\nlocal function ColorPath(self, ...)\n\t--[[ Override: Runes.UpdateColor(self, event, ...)\n\tUsed to completely override the internal function for updating the widgets' colors.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\t(self.Runes.UpdateColor or UpdateColor) (self, ...)\nend\n\nlocal function Update(self, event)\n\tlocal element = self.Runes\n\n\tif(element.sortOrder == 'asc') then\n\t\ttable.sort(runemap, ascSort)\n\t\thasSortOrder = true\n\telseif(element.sortOrder == 'desc') then\n\t\ttable.sort(runemap, descSort)\n\t\thasSortOrder = true\n\telseif(hasSortOrder) then\n\t\ttable.sort(runemap)\n\t\thasSortOrder = false\n\tend\n\n\tlocal rune, start, duration, runeReady\n\tfor index, runeID in next, runemap do\n\t\trune = element[index]\n\t\tif(not rune) then break end\n\n\t\tif(UnitHasVehicleUI('player')) then\n\t\t\trune:Hide()\n\t\telse\n\t\t\tstart, duration, runeReady = GetRuneCooldown(runeID)\n\t\t\tif(runeReady) then\n\t\t\t\trune:SetMinMaxValues(0, 1)\n\t\t\t\trune:SetValue(1)\n\t\t\t\trune:SetScript('OnUpdate', nil)\n\t\t\telseif(start) then\n\t\t\t\trune.duration = GetTime() - start\n\t\t\t\trune:SetMinMaxValues(0, duration)\n\t\t\t\trune:SetValue(0)\n\t\t\t\trune:SetScript('OnUpdate', onUpdate)\n\t\t\tend\n\n\t\t\trune:Show()\n\t\tend\n\tend\n\n\t--[[ Callback: Runes:PostUpdate(runemap)\n\tCalled after the element has been updated.\n\n\t* self    - the Runes element\n\t* runemap - the ordered list of runes' indices (table)\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(runemap)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: Runes.Override(self, event, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\t(self.Runes.Override or Update) (self, ...)\nend\n\nlocal function AllPath(...)\n\tPath(...)\n\tColorPath(...)\nend\n\nlocal function ForceUpdate(element)\n\tPath(element.__owner, 'ForceUpdate')\n\tColorPath(element.__owner, 'ForceUpdate')\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.Runes\n\tif(element and UnitIsUnit(unit, 'player')) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tfor i = 1, #element do\n\t\t\tlocal rune = element[i]\n\t\t\tif(rune:IsObjectType('StatusBar') and not rune:GetStatusBarTexture()) then\n\t\t\t\trune:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\t\tend\n\t\tend\n\n\t\tself:RegisterEvent('PLAYER_SPECIALIZATION_CHANGED', ColorPath)\n\t\tself:RegisterEvent('RUNE_POWER_UPDATE', Path, true)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Runes\n\tif(element) then\n\t\tfor i = 1, #element do\n\t\t\telement[i]:Hide()\n\t\tend\n\n\t\tself:UnregisterEvent('PLAYER_SPECIALIZATION_CHANGED', ColorPath)\n\t\tself:UnregisterEvent('RUNE_POWER_UPDATE', Path)\n\tend\nend\n\noUF:AddElement('Runes', AllPath, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/Stagger.lua",
    "content": "if(select(2, UnitClass('player')) ~= 'MONK') then return end\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\n-- sourced from FrameXML/Constants.lua\nlocal SPEC_MONK_BREWMASTER = SPEC_MONK_BREWMASTER or 1\n\n-- sourced from FrameXML/MonkStaggerBar.lua\nlocal BREWMASTER_POWER_BAR_NAME = BREWMASTER_POWER_BAR_NAME or 'STAGGER'\n\n-- percentages at which bar should change color\nlocal STAGGER_YELLOW_TRANSITION =  STAGGER_YELLOW_TRANSITION or 0.3\nlocal STAGGER_RED_TRANSITION = STAGGER_RED_TRANSITION or 0.6\n\n-- table indices of bar colors\nlocal STAGGER_GREEN_INDEX = STAGGER_GREEN_INDEX or 1\nlocal STAGGER_YELLOW_INDEX = STAGGER_YELLOW_INDEX or 2\nlocal STAGGER_RED_INDEX = STAGGER_RED_INDEX or 3\n\nlocal function UpdateColor(element, cur, max)\n\tlocal colors = element.__owner.colors.power[BREWMASTER_POWER_BAR_NAME]\n\tlocal perc = cur / max\n\n\tlocal t\n\tif(perc >= STAGGER_RED_TRANSITION) then\n\t\tt = colors and colors[STAGGER_RED_INDEX]\n\telseif(perc > STAGGER_YELLOW_TRANSITION) then\n\t\tt = colors and colors[STAGGER_YELLOW_INDEX]\n\telse\n\t\tt = colors and colors[STAGGER_GREEN_INDEX]\n\tend\n\n\tlocal r, g, b\n\tif(t) then\n\t\tr, g, b = t[1], t[2], t[3]\n\t\tif(b) then\n\t\t\telement:SetStatusBarColor(r, g, b)\n\n\t\t\tlocal bg = element.bg\n\t\t\tif(bg and b) then\n\t\t\t\tlocal mu = bg.multiplier or 1\n\t\t\t\tbg:SetVertexColor(r * mu, g * mu, b * mu)\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function Update(self, event, unit)\n\tif(unit and unit ~= self.unit) then return end\n\n\tlocal element = self.Stagger\n\n\t--[[ Callback: Stagger:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the Stagger element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\t-- Blizzard code has nil checks for UnitStagger return\n\tlocal cur = UnitStagger('player') or 0\n\tlocal max = UnitHealthMax('player')\n\n\telement:SetMinMaxValues(0, max)\n\telement:SetValue(cur)\n\n\t--[[ Override: Stagger:UpdateColor(cur, max)\n\tUsed to completely override the internal function for updating the widget's colors.\n\n\t* self - the Stagger element\n\t* cur  - the amount of staggered damage (number)\n\t* max  - the player's maximum possible health value (number)\n\t--]]\n\telement:UpdateColor(cur, max)\n\n\t--[[ Callback: Stagger:PostUpdate(cur, max)\n\tCalled after the element has been updated.\n\n\t* self - the Stagger element\n\t* cur  - the amount of staggered damage (number)\n\t* max  - the player's maximum possible health value (number)\n\t--]]\n\tif(element.PostUpdate) then\n\t\telement:PostUpdate(cur, max)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: Stagger.Override(self, event, unit)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t--]]\n\treturn (self.Stagger.Override or Update)(self, ...)\nend\n\nlocal function Visibility(self, event, unit)\n\tif(SPEC_MONK_BREWMASTER ~= GetSpecialization() or UnitHasVehiclePlayerFrameUI('player')) then\n\t\tif(self.Stagger:IsShown()) then\n\t\t\tself.Stagger:Hide()\n\t\t\tself:UnregisterEvent('UNIT_AURA', Path)\n\t\tend\n\t\tif SPEC_MONK_WINDWALKER ~= GetSpecialization() then\n\t\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 5) end\t-- ShestakUI\n\t\tend\n\telse\n\t\tif(not self.Stagger:IsShown()) then\n\t\t\tself.Stagger:Show()\n\t\t\tself:RegisterEvent('UNIT_AURA', Path)\n\t\tend\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19) end\t-- ShestakUI\n\n\t\treturn Path(self, event, unit)\n\tend\nend\n\nlocal function VisibilityPath(self, ...)\n\t--[[ Override: Stagger.OverrideVisibility(self, event, unit)\n\tUsed to completely override the internal visibility toggling function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* unit  - the unit accompanying the event (string)\n\t--]]\n\treturn (self.Stagger.OverrideVisibility or Visibility)(self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tlocal element = self.Stagger\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)\n\t\tself:RegisterEvent('PLAYER_TALENT_UPDATE', VisibilityPath, true)\n\n\t\telement.handler = CreateFrame(\"Frame\", nil, element)\t-- ShestakUI\n\t\telement.handler:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\telement.handler:SetScript(\"OnEvent\", function() Visibility(self) end)\n\n\t\tif(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then\n\t\t\telement:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\tend\n\n\t\tif(not element.UpdateColor) then\n\t\t\telement.UpdateColor = UpdateColor\n\t\tend\n\n\t\tMonkStaggerBar:UnregisterEvent('PLAYER_ENTERING_WORLD')\n\t\tMonkStaggerBar:UnregisterEvent('PLAYER_SPECIALIZATION_CHANGED')\n\t\tMonkStaggerBar:UnregisterEvent('UNIT_DISPLAYPOWER')\n\t\tMonkStaggerBar:UnregisterEvent('UNIT_EXITED_VEHICLE')\n\t\tMonkStaggerBar:UnregisterEvent('UPDATE_VEHICLE_ACTIONBAR')\n\n\t\t-- do not change this without taking Visibility into account\n\t\telement:Hide()\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Stagger\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_AURA', Path)\n\t\tself:UnregisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)\n\t\tself:UnregisterEvent('PLAYER_TALENT_UPDATE', VisibilityPath)\n\n\t\tMonkStaggerBar:RegisterEvent('PLAYER_ENTERING_WORLD')\n\t\tMonkStaggerBar:RegisterEvent('PLAYER_SPECIALIZATION_CHANGED')\n\t\tMonkStaggerBar:RegisterEvent('UNIT_DISPLAYPOWER')\n\t\tMonkStaggerBar:RegisterEvent('UNIT_EXITED_VEHICLE')\n\t\tMonkStaggerBar:RegisterEvent('UPDATE_VEHICLE_ACTIONBAR')\n\tend\nend\n\noUF:AddElement('Stagger', VisibilityPath, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/SummonIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\n\n-- sourced from Blizzard_APIDocumentation/IncomingSummonDocumentation.lua\nlocal SUMMON_STATUS_NONE = Enum.SummonStatus.None or 0\nlocal SUMMON_STATUS_PENDING = Enum.SummonStatus.Pending or 1\nlocal SUMMON_STATUS_ACCEPTED = Enum.SummonStatus.Accepted or 2\nlocal SUMMON_STATUS_DECLINED = Enum.SummonStatus.Declined or 3\n\nlocal function Update(self, event, unit)\n\tif(self.unit ~= unit) then return end\n\n\tlocal element = self.SummonIndicator\n\n\t--[[ Callback: SummonIndicator:PreUpdate()\n\tCalled before the element has been updated.\n\n\t* self - the SummonIndicator element\n\t--]]\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate()\n\tend\n\n\tlocal status = C_IncomingSummon.IncomingSummonStatus(unit)\n\tif(status ~= SUMMON_STATUS_NONE) then\n\t\tif(status == SUMMON_STATUS_PENDING) then\n\t\t\telement:SetAtlas('Raid-Icon-SummonPending')\n\t\telseif(status == SUMMON_STATUS_ACCEPTED) then\n\t\t\telement:SetAtlas('Raid-Icon-SummonAccepted')\n\t\telseif(status == SUMMON_STATUS_DECLINED) then\n\t\t\telement:SetAtlas('Raid-Icon-SummonDeclined')\n\t\tend\n\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: SummonIndicator:PostUpdate(status)\n\tCalled after the element has been updated.\n\n\t* self  - the SummonIndicator element\n\t* status - the unit's incoming summon status (number)[0-3]\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(status)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: SummonIndicator.Override(self, event)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.SummonIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tlocal element = self.SummonIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('INCOMING_SUMMON_CHANGED', Path)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.SummonIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('INCOMING_SUMMON_CHANGED', Path)\n\tend\nend\n\noUF:AddElement('SummonIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/Tags.lua",
    "content": "-- Credits: Vika, Cladhaire, Tekkub\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal nierror = Private.nierror\nlocal unitExists = Private.unitExists\nlocal xpcall = Private.xpcall\n\nlocal _PATTERN = '%[..-%]+'\n\nlocal _ENV = {\n\tHex = function(r, g, b)\n\t\tif(type(r) == 'table') then\n\t\t\tif(r.r) then\n\t\t\t\tr, g, b = r.r, r.g, r.b\n\t\t\telse\n\t\t\t\tr, g, b = unpack(r)\n\t\t\tend\n\t\tend\n\t\treturn string.format('|cff%02x%02x%02x', r * 255, g * 255, b * 255)\n\tend,\n}\n_ENV.ColorGradient = function(...)\n\treturn _ENV._FRAME:ColorGradient(...)\nend\n\nlocal _PROXY = setmetatable(_ENV, {__index = _G})\n\nlocal tagStrings = {\n\t['affix'] = [[function(u)\n\t\tlocal c = UnitClassification(u)\n\t\tif(c == 'minus') then\n\t\t\treturn 'Affix'\n\t\tend\n\tend]],\n\n\t['arcanecharges'] = [[function()\n\t\tif(GetSpecialization() == SPEC_MAGE_ARCANE) then\n\t\t\tlocal num = UnitPower('player', Enum.PowerType.ArcaneCharges)\n\t\t\tif(num > 0) then\n\t\t\t\treturn num\n\t\t\tend\n\t\tend\n\tend]],\n\n\t['arenaspec'] = [[function(u)\n\t\tlocal id = u:match('arena(%d)$')\n\t\tif(id) then\n\t\t\tlocal specID = GetArenaOpponentSpec(tonumber(id))\n\t\t\tif(specID and specID > 0) then\n\t\t\t\tlocal _, specName = GetSpecializationInfoByID(specID)\n\t\t\t\treturn specName\n\t\t\tend\n\t\tend\n\tend]],\n\n\t['chi'] = [[function()\n\t\tif(GetSpecialization() == SPEC_MONK_WINDWALKER) then\n\t\t\tlocal num = UnitPower('player', Enum.PowerType.Chi)\n\t\t\tif(num > 0) then\n\t\t\t\treturn num\n\t\t\tend\n\t\tend\n\tend]],\n\n\t['classification'] = [[function(u)\n\t\tlocal c = UnitClassification(u)\n\t\tif(c == 'rare') then\n\t\t\treturn 'Rare'\n\t\telseif(c == 'rareelite') then\n\t\t\treturn 'Rare Elite'\n\t\telseif(c == 'elite') then\n\t\t\treturn 'Elite'\n\t\telseif(c == 'worldboss') then\n\t\t\treturn 'Boss'\n\t\telseif(c == 'minus') then\n\t\t\treturn 'Affix'\n\t\tend\n\tend]],\n\n\t['cpoints'] = [[function(u)\n\t\tlocal cp = UnitPower(u, Enum.PowerType.ComboPoints)\n\n\t\tif(cp > 0) then\n\t\t\treturn cp\n\t\tend\n\tend]],\n\n\t['creature'] = [[function(u)\n\t\treturn UnitCreatureFamily(u) or UnitCreatureType(u)\n\tend]],\n\n\t['curmana'] = [[function(unit)\n\t\treturn UnitPower(unit, Enum.PowerType.Mana)\n\tend]],\n\n\t['dead'] = [[function(u)\n\t\tif(UnitIsDead(u)) then\n\t\t\treturn 'Dead'\n\t\telseif(UnitIsGhost(u)) then\n\t\t\treturn 'Ghost'\n\t\tend\n\tend]],\n\n\t['deficit:name'] = [[function(u)\n\t\tlocal missinghp = _TAGS['missinghp'](u)\n\t\tif(missinghp) then\n\t\t\treturn '-' .. missinghp\n\t\telse\n\t\t\treturn _TAGS['name'](u)\n\t\tend\n\tend]],\n\n\t['difficulty'] = [[function(u)\n\t\tif UnitCanAttack('player', u) then\n\t\t\tlocal l = UnitEffectiveLevel(u)\n\t\t\treturn Hex(GetCreatureDifficultyColor((l > 0) and l or 999))\n\t\tend\n\tend]],\n\n\t['group'] = [[function(unit)\n\t\tlocal name, server = UnitName(unit)\n\t\tif(server and server ~= '') then\n\t\t\tname = string.format('%s-%s', name, server)\n\t\tend\n\n\t\tfor i=1, GetNumGroupMembers() do\n\t\t\tlocal raidName, _, group = GetRaidRosterInfo(i)\n\t\t\tif( raidName == name ) then\n\t\t\t\treturn group\n\t\t\tend\n\t\tend\n\tend]],\n\n\t['holypower'] = [[function()\n\t\tif(GetSpecialization() == SPEC_PALADIN_RETRIBUTION) then\n\t\t\tlocal num = UnitPower('player', Enum.PowerType.HolyPower)\n\t\t\tif(num > 0) then\n\t\t\t\treturn num\n\t\t\tend\n\t\tend\n\tend]],\n\n\t['leader'] = [[function(u)\n\t\tif(UnitIsGroupLeader(u)) then\n\t\t\treturn 'L'\n\t\tend\n\tend]],\n\n\t['leaderlong']  = [[function(u)\n\t\tif(UnitIsGroupLeader(u)) then\n\t\t\treturn 'Leader'\n\t\tend\n\tend]],\n\n\t['level'] = [[function(u)\n\t\tlocal l = UnitEffectiveLevel(u)\n\t\tif(UnitIsWildBattlePet(u) or UnitIsBattlePetCompanion(u)) then\n\t\t\tl = UnitBattlePetLevel(u)\n\t\tend\n\n\t\tif(l > 0) then\n\t\t\treturn l\n\t\telse\n\t\t\treturn '??'\n\t\tend\n\tend]],\n\n\t['maxmana'] = [[function(unit)\n\t\treturn UnitPowerMax(unit, Enum.PowerType.Mana)\n\tend]],\n\n\t['missinghp'] = [[function(u)\n\t\tlocal current = UnitHealthMax(u) - UnitHealth(u)\n\t\tif(current > 0) then\n\t\t\treturn current\n\t\tend\n\tend]],\n\n\t['missingpp'] = [[function(u)\n\t\tlocal current = UnitPowerMax(u) - UnitPower(u)\n\t\tif(current > 0) then\n\t\t\treturn current\n\t\tend\n\tend]],\n\n\t['name'] = [[function(u, r)\n\t\treturn UnitName(r or u)\n\tend]],\n\n\t['offline'] = [[function(u)\n\t\tif(not UnitIsConnected(u)) then\n\t\t\treturn 'Offline'\n\t\tend\n\tend]],\n\n\t['perhp'] = [[function(u)\n\t\tlocal m = UnitHealthMax(u)\n\t\tif(m == 0) then\n\t\t\treturn 0\n\t\telse\n\t\t\treturn math.floor(UnitHealth(u) / m * 100 + .5)\n\t\tend\n\tend]],\n\n\t['perpp'] = [[function(u)\n\t\tlocal m = UnitPowerMax(u)\n\t\tif(m == 0) then\n\t\t\treturn 0\n\t\telse\n\t\t\treturn math.floor(UnitPower(u) / m * 100 + .5)\n\t\tend\n\tend]],\n\n\t['plus'] = [[function(u)\n\t\tlocal c = UnitClassification(u)\n\t\tif(c == 'elite' or c == 'rareelite') then\n\t\t\treturn '+'\n\t\tend\n\tend]],\n\n\t['powercolor'] = [[function(u)\n\t\tlocal pType, pToken, altR, altG, altB = UnitPowerType(u)\n\t\tlocal t = _COLORS.power[pToken]\n\n\t\tif(not t) then\n\t\t\tif(altR) then\n\t\t\t\tif(altR > 1 or altG > 1 or altB > 1) then\n\t\t\t\t\treturn Hex(altR / 255, altG / 255, altB / 255)\n\t\t\t\telse\n\t\t\t\t\treturn Hex(altR, altG, altB)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\treturn Hex(_COLORS.power[pType] or _COLORS.power.MANA)\n\t\t\tend\n\t\tend\n\n\t\treturn Hex(t)\n\tend]],\n\n\t['pvp'] = [[function(u)\n\t\tif(UnitIsPVP(u)) then\n\t\t\treturn 'PvP'\n\t\tend\n\tend]],\n\n\t['raidcolor'] = [[function(u)\n\t\tlocal _, class = UnitClass(u)\n\t\tif(class) then\n\t\t\treturn Hex(_COLORS.class[class])\n\t\telse\n\t\t\tlocal id = u:match('arena(%d)$')\n\t\t\tif(id) then\n\t\t\t\tlocal specID = GetArenaOpponentSpec(tonumber(id))\n\t\t\t\tif(specID and specID > 0) then\n\t\t\t\t\t_, _, _, _, _, class = GetSpecializationInfoByID(specID)\n\t\t\t\t\treturn Hex(_COLORS.class[class])\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend]],\n\n\t['rare'] = [[function(u)\n\t\tlocal c = UnitClassification(u)\n\t\tif(c == 'rare' or c == 'rareelite') then\n\t\t\treturn 'Rare'\n\t\tend\n\tend]],\n\n\t['resting'] = [[function(u)\n\t\tif(u == 'player' and IsResting()) then\n\t\t\treturn 'zzz'\n\t\tend\n\tend]],\n\n\t['runes'] = [[function()\n\t\tlocal amount = 0\n\n\t\tfor i = 1, 6 do\n\t\t\tlocal _, _, ready = GetRuneCooldown(i)\n\t\t\tif(ready) then\n\t\t\t\tamount = amount + 1\n\t\t\tend\n\t\tend\n\n\t\treturn amount\n\tend]],\n\n\t['sex'] = [[function(u)\n\t\tlocal s = UnitSex(u)\n\t\tif(s == 2) then\n\t\t\treturn 'Male'\n\t\telseif(s == 3) then\n\t\t\treturn 'Female'\n\t\tend\n\tend]],\n\n\t['shortclassification'] = [[function(u)\n\t\tlocal c = UnitClassification(u)\n\t\tif(c == 'rare') then\n\t\t\treturn 'R'\n\t\telseif(c == 'rareelite') then\n\t\t\treturn 'R+'\n\t\telseif(c == 'elite') then\n\t\t\treturn '+'\n\t\telseif(c == 'worldboss') then\n\t\t\treturn 'B'\n\t\telseif(c == 'minus') then\n\t\t\treturn '-'\n\t\tend\n\tend]],\n\n\t['smartclass'] = [[function(u)\n\t\tif(UnitIsPlayer(u)) then\n\t\t\treturn _TAGS['class'](u)\n\t\tend\n\n\t\treturn _TAGS['creature'](u)\n\tend]],\n\n\t['smartlevel'] = [[function(u)\n\t\tlocal c = UnitClassification(u)\n\t\tif(c == 'worldboss') then\n\t\t\treturn 'Boss'\n\t\telse\n\t\t\tlocal plus = _TAGS['plus'](u)\n\t\t\tlocal level = _TAGS['level'](u)\n\t\t\tif(plus) then\n\t\t\t\treturn level .. plus\n\t\t\telse\n\t\t\t\treturn level\n\t\t\tend\n\t\tend\n\tend]],\n\n\t['soulshards'] = [[function()\n\t\tlocal num = UnitPower('player', Enum.PowerType.SoulShards)\n\t\tif(num > 0) then\n\t\t\treturn num\n\t\tend\n\tend]],\n\n\t['status'] = [[function(u)\n\t\tif(UnitIsDead(u)) then\n\t\t\treturn 'Dead'\n\t\telseif(UnitIsGhost(u)) then\n\t\t\treturn 'Ghost'\n\t\telseif(not UnitIsConnected(u)) then\n\t\t\treturn 'Offline'\n\t\telse\n\t\t\treturn _TAGS['resting'](u)\n\t\tend\n\tend]],\n\n\t['threat'] = [[function(u)\n\t\tlocal s = UnitThreatSituation(u)\n\t\tif(s == 1) then\n\t\t\treturn '++'\n\t\telseif(s == 2) then\n\t\t\treturn '--'\n\t\telseif(s == 3) then\n\t\t\treturn 'Aggro'\n\t\tend\n\tend]],\n\n\t['threatcolor'] = [[function(u)\n\t\treturn Hex(GetThreatStatusColor(UnitThreatSituation(u)))\n\tend]],\n}\n\nlocal tags = setmetatable(\n\t{\n\t\tcurhp = UnitHealth,\n\t\tcurpp = UnitPower,\n\t\tmaxhp = UnitHealthMax,\n\t\tmaxpp = UnitPowerMax,\n\t\tclass = UnitClass,\n\t\tfaction = UnitFactionGroup,\n\t\trace = UnitRace,\n\t},\n\t{\n\t\t__index = function(self, key)\n\t\t\tlocal tagString = tagStrings[key]\n\t\t\tif(tagString) then\n\t\t\t\tself[key] = tagString\n\t\t\t\ttagStrings[key] = nil\n\t\t\tend\n\n\t\t\treturn rawget(self, key)\n\t\tend,\n\t\t__newindex = function(self, key, val)\n\t\t\tif(type(val) == 'string') then\n\t\t\t\tlocal func, err = loadstring('return ' .. val)\n\t\t\t\tif(func) then\n\t\t\t\t\tval = func()\n\t\t\t\telse\n\t\t\t\t\terror(err, 3)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tassert(type(val) == 'function', 'Tag function must be a function or a string that evaluates to a function.')\n\n\t\t\t-- We don't want to clash with any custom envs\n\t\t\tif(getfenv(val) == _G) then\n\t\t\t\t-- pcall is needed for cases when Blizz functions are passed as\n\t\t\t\t-- strings, for intance, 'UnitPowerMax', an attempt to set a\n\t\t\t\t-- custom env will result in an error\n\t\t\t\tpcall(setfenv, val, _PROXY)\n\t\t\tend\n\n\t\t\trawset(self, key, val)\n\t\tend,\n\t}\n)\n\n_ENV._TAGS = tags\n\nlocal vars = setmetatable({}, {\n\t__newindex = function(self, key, val)\n\t\tif(type(val) == 'string') then\n\t\t\tlocal func = loadstring('return ' .. val)\n\t\t\tif(func) then\n\t\t\t\tval = func() or val\n\t\t\tend\n\t\tend\n\n\t\trawset(self, key, val)\n\tend,\n})\n\n_ENV._VARS = vars\n\nlocal tagEvents = {\n\t['affix']               = 'UNIT_CLASSIFICATION_CHANGED',\n\t['arcanecharges']       = 'UNIT_POWER_UPDATE PLAYER_TALENT_UPDATE',\n\t['arenaspec']           = 'ARENA_PREP_OPPONENT_SPECIALIZATIONS',\n\t['chi']                 = 'UNIT_POWER_UPDATE PLAYER_TALENT_UPDATE',\n\t['classification']      = 'UNIT_CLASSIFICATION_CHANGED',\n\t['cpoints']             = 'UNIT_POWER_FREQUENT PLAYER_TARGET_CHANGED',\n\t['curhp']               = 'UNIT_HEALTH UNIT_MAXHEALTH',\n\t['curmana']             = 'UNIT_POWER_UPDATE UNIT_MAXPOWER',\n\t['curpp']               = 'UNIT_POWER_UPDATE UNIT_MAXPOWER',\n\t['dead']                = 'UNIT_HEALTH',\n\t['deficit:name']        = 'UNIT_HEALTH UNIT_MAXHEALTH UNIT_NAME_UPDATE',\n\t['difficulty']          = 'UNIT_FACTION',\n\t['faction']             = 'NEUTRAL_FACTION_SELECT_RESULT',\n\t['group']               = 'GROUP_ROSTER_UPDATE',\n\t['holypower']           = 'UNIT_POWER_UPDATE PLAYER_TALENT_UPDATE',\n\t['leader']              = 'PARTY_LEADER_CHANGED',\n\t['leaderlong']          = 'PARTY_LEADER_CHANGED',\n\t['level']               = 'UNIT_LEVEL PLAYER_LEVEL_UP',\n\t['maxhp']               = 'UNIT_MAXHEALTH',\n\t['maxmana']             = 'UNIT_POWER_UPDATE UNIT_MAXPOWER',\n\t['maxpp']               = 'UNIT_MAXPOWER',\n\t['missinghp']           = 'UNIT_HEALTH UNIT_MAXHEALTH',\n\t['missingpp']           = 'UNIT_MAXPOWER UNIT_POWER_UPDATE',\n\t['name']                = 'UNIT_NAME_UPDATE',\n\t['offline']             = 'UNIT_HEALTH UNIT_CONNECTION',\n\t['perhp']               = 'UNIT_HEALTH UNIT_MAXHEALTH',\n\t['perpp']               = 'UNIT_MAXPOWER UNIT_POWER_UPDATE',\n\t['plus']                = 'UNIT_CLASSIFICATION_CHANGED',\n\t['powercolor']          = 'UNIT_DISPLAYPOWER',\n\t['pvp']                 = 'UNIT_FACTION',\n\t['rare']                = 'UNIT_CLASSIFICATION_CHANGED',\n\t['resting']             = 'PLAYER_UPDATE_RESTING',\n\t['runes']               = 'RUNE_POWER_UPDATE',\n\t['shortclassification'] = 'UNIT_CLASSIFICATION_CHANGED',\n\t['smartlevel']          = 'UNIT_LEVEL PLAYER_LEVEL_UP UNIT_CLASSIFICATION_CHANGED',\n\t['soulshards']          = 'UNIT_POWER_UPDATE',\n\t['status']              = 'UNIT_HEALTH PLAYER_UPDATE_RESTING UNIT_CONNECTION',\n\t['threat']              = 'UNIT_THREAT_SITUATION_UPDATE',\n\t['threatcolor']         = 'UNIT_THREAT_SITUATION_UPDATE',\n}\n\nlocal unitlessEvents = {\n\tARENA_PREP_OPPONENT_SPECIALIZATIONS = true,\n\tGROUP_ROSTER_UPDATE = true,\n\tNEUTRAL_FACTION_SELECT_RESULT = true,\n\tPARTY_LEADER_CHANGED = true,\n\tPLAYER_LEVEL_UP = true,\n\tPLAYER_TALENT_UPDATE = true,\n\tPLAYER_TARGET_CHANGED = true,\n\tPLAYER_UPDATE_RESTING = true,\n\tRUNE_POWER_UPDATE = true,\n}\n\nlocal events = {}\nlocal eventFrame = CreateFrame('Frame')\neventFrame:SetScript('OnEvent', function(self, event, unit)\n\tlocal strings = events[event]\n\tif(strings) then\n\t\tfor _, fs in next, strings do\n\t\t\tif(fs:IsVisible() and (unitlessEvents[event] or fs.parent.unit == unit or (fs.extraUnits and fs.extraUnits[unit]))) then\n\t\t\t\tfs:UpdateTag()\n\t\t\tend\n\t\tend\n\tend\nend)\n\nlocal onUpdates = {}\nlocal eventlessUnits = {}\n\nlocal function createOnUpdate(timer)\n\tif(not onUpdates[timer]) then\n\t\tlocal total = timer\n\t\tlocal frame = CreateFrame('Frame')\n\t\tlocal strings = eventlessUnits[timer]\n\n\t\tframe:SetScript('OnUpdate', function(self, elapsed)\n\t\t\tif(total >= timer) then\n\t\t\t\tfor _, fs in next, strings do\n\t\t\t\t\tif(fs.parent:IsShown() and unitExists(fs.parent.unit)) then\n\t\t\t\t\t\tfs:UpdateTag()\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\ttotal = 0\n\t\t\tend\n\n\t\t\ttotal = total + elapsed\n\t\tend)\n\n\t\tonUpdates[timer] = frame\n\tend\nend\n\n--[[ Tags: frame:UpdateTags()\nUsed to update all tags on a frame.\n\n* self - the unit frame from which to update the tags\n--]]\nlocal function Update(self)\n\tif(self.__tags) then\n\t\tfor fs in next, self.__tags do\n\t\t\tfs:UpdateTag()\n\t\tend\n\tend\nend\n\nlocal tagPool = {}\nlocal funcPool = {}\nlocal tmp = {}\n\n\n-- full tag syntax: '[prefix$>tag-name<$suffix(a,r,g,s)]'\n-- for a small test case see https://github.com/oUF-wow/oUF/pull/602\nlocal function getBracketData(tag)\n\tlocal prefixEnd, prefixOffset = tag:match('()$>'), 1\n\tif(not prefixEnd) then\n\t\tprefixEnd = 1\n\telse\n\t\tprefixEnd = prefixEnd - 1\n\t\tprefixOffset = 3\n\tend\n\n\tlocal suffixEnd = (tag:match('()%(', prefixOffset + 1) or -1) - 1\n\tlocal suffixStart, suffixOffset = tag:match('<$()', prefixEnd), 1\n\tif(not suffixStart) then\n\t\tsuffixStart = suffixEnd + 1\n\telse\n\t\tsuffixOffset = 3\n\tend\n\n\treturn tag:sub(prefixEnd + prefixOffset, suffixStart - suffixOffset),\n\t\tprefixEnd,\n\t\tsuffixStart,\n\t\tsuffixEnd,\n\t\ttag:match('%((.-)%)', suffixOffset + 1)\nend\n\nlocal function getTagFunc(tagstr)\n\tlocal func = tagPool[tagstr]\n\tif(not func) then\n\t\tlocal format, numTags = tagstr:gsub('%%', '%%%%'):gsub(_PATTERN, '%%s')\n\t\tlocal args = {}\n\t\tlocal idx = 1\n\n\t\tlocal format_ = {}\n\t\tfor i = 1, numTags do\n\t\t\tformat_[i] = '%s'\n\t\tend\n\n\t\tfor bracket in tagstr:gmatch(_PATTERN) do\n\t\t\tlocal tagFunc = funcPool[bracket] or tags[bracket:sub(2, -2)]\n\t\t\tif(not tagFunc) then\n\t\t\t\tlocal tagName, prefixEnd, suffixStart, suffixEnd, customArgs = getBracketData(bracket)\n\t\t\t\tlocal tag = tags[tagName]\n\t\t\t\tif(tag) then\n\t\t\t\t\tif(prefixEnd ~= 1 or suffixStart - suffixEnd ~= 1) then\n\t\t\t\t\t\tlocal prefix = prefixEnd ~= 1 and bracket:sub(2, prefixEnd) or ''\n\t\t\t\t\t\tlocal suffix = suffixStart - suffixEnd ~= 1 and bracket:sub(suffixStart, suffixEnd) or ''\n\n\t\t\t\t\t\ttagFunc = function(unit, realUnit)\n\t\t\t\t\t\t\tlocal str\n\t\t\t\t\t\t\tif(customArgs) then\n\t\t\t\t\t\t\t\tstr = tag(unit, realUnit, string.split(',', customArgs))\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tstr = tag(unit, realUnit)\n\t\t\t\t\t\t\tend\n\n\t\t\t\t\t\t\tif(str and str ~= '') then\n\t\t\t\t\t\t\t\treturn prefix .. str .. suffix\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\ttagFunc = function(unit, realUnit)\n\t\t\t\t\t\t\tlocal str\n\t\t\t\t\t\t\tif(customArgs) then\n\t\t\t\t\t\t\t\tstr = tag(unit, realUnit, string.split(',', customArgs))\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tstr = tag(unit, realUnit)\n\t\t\t\t\t\t\tend\n\n\t\t\t\t\t\t\tif(str and str ~= '') then\n\t\t\t\t\t\t\t\treturn str\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\n\t\t\t\t\tfuncPool[bracket] = tagFunc\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif(tagFunc) then\n\t\t\t\ttable.insert(args, tagFunc)\n\n\t\t\t\tidx = idx + 1\n\t\t\telse\n\t\t\t\tnierror(string.format('Attempted to use invalid tag %s.', bracket))\n\n\t\t\t\tformat_[idx] = bracket\n\t\t\t\tformat = format:format(unpack(format_, 1, numTags))\n\t\t\t\tformat_[idx] = '%s'\n\n\t\t\t\tnumTags = numTags - 1\n\t\t\tend\n\t\tend\n\n\t\tfunc = function(self)\n\t\t\tlocal parent = self.parent\n\t\t\tlocal unit = parent.unit\n\t\t\tlocal realUnit\n\t\t\tif(self.overrideUnit) then\n\t\t\t\trealUnit = parent.realUnit\n\t\t\tend\n\n\t\t\t_ENV._COLORS = parent.colors\n\t\t\t_ENV._FRAME = parent\n\t\t\tfor i, f in next, args do\n\t\t\t\ttmp[i] = f(unit, realUnit) or ''\n\t\t\tend\n\n\t\t\t-- We do 1, numTags because tmp can hold several unneeded variables.\n\t\t\treturn self:SetFormattedText(format, unpack(tmp, 1, numTags))\n\t\tend\n\n\t\ttagPool[tagstr] = func\n\tend\n\n\treturn func\nend\n\nlocal function registerEvent(fontstr, event)\n\tif(not events[event]) then events[event] = {} end\n\n\tlocal isOK = xpcall(eventFrame.RegisterEvent, eventFrame, event)\n\tif(isOK) then\n\t\ttable.insert(events[event], fontstr)\n\tend\nend\n\nlocal function registerEvents(fontstr, tagstr)\n\tfor tag in tagstr:gmatch(_PATTERN) do\n\t\ttag = getBracketData(tag)\n\t\tlocal tagevents = tagEvents[tag]\n\t\tif(tagevents) then\n\t\t\tfor event in tagevents:gmatch('%S+') do\n\t\t\t\tregisterEvent(fontstr, event)\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function unregisterEvents(fontstr)\n\tfor event, data in next, events do\n\t\tlocal index = 1\n\t\tlocal tagfsstr = data[index]\n\t\twhile tagfsstr do\n\t\t\tif(tagfsstr == fontstr) then\n\t\t\t\tif(#data == 1) then\n\t\t\t\t\teventFrame:UnregisterEvent(event)\n\t\t\t\tend\n\n\t\t\t\ttable.remove(data, index)\n\t\t\telse\n\t\t\t\tindex = index + 1\n\t\t\tend\n\n\t\t\ttagfsstr = data[index]\n\t\tend\n\tend\nend\n\nlocal taggedFS = {}\n\n--[[ Tags: frame:Tag(fs, tagstr, ...)\nUsed to register a tag on a unit frame.\n\n* self   - the unit frame on which to register the tag\n* fs     - the font string to display the tag (FontString)\n* tagstr - the tag string (string)\n* ...    - additional optional unitID(s) the tag should update for\n--]]\nlocal function Tag(self, fs, tagstr, ...)\n\tif(not fs or not tagstr) then return end\n\n\tif(not self.__tags) then\n\t\tself.__tags = {}\n\t\ttable.insert(self.__elements, Update)\n\telseif(self.__tags[fs]) then\n\t\t-- We don't need to remove it from the __tags table as Untag handles\n\t\t-- that for us.\n\t\tself:Untag(fs)\n\tend\n\n\tfs.parent = self\n\tfs.UpdateTag = getTagFunc(tagstr)\n\n\tif(self.__eventless or fs.frequentUpdates) then\n\t\tlocal timer\n\t\tif(type(fs.frequentUpdates) == 'number') then\n\t\t\ttimer = fs.frequentUpdates\n\t\telse\n\t\t\ttimer = .5\n\t\tend\n\n\t\tif(not eventlessUnits[timer]) then eventlessUnits[timer] = {} end\n\t\ttable.insert(eventlessUnits[timer], fs)\n\n\t\tcreateOnUpdate(timer)\n\telse\n\t\tregisterEvents(fs, tagstr)\n\n\t\tif(...) then\n\t\t\tif(not fs.extraUnits) then\n\t\t\t\tfs.extraUnits = {}\n\t\t\tend\n\n\t\t\tfor index = 1, select('#', ...) do\n\t\t\t\tfs.extraUnits[select(index, ...)] = true\n\t\t\tend\n\t\tend\n\tend\n\n\ttaggedFS[fs] = tagstr\n\tself.__tags[fs] = true\nend\n\n--[[ Tags: frame:Untag(fs)\nUsed to unregister a tag from a unit frame.\n\n* self - the unit frame from which to unregister the tag\n* fs   - the font string holding the tag (FontString)\n--]]\nlocal function Untag(self, fs)\n\tif(not fs or not self.__tags) then return end\n\n\tunregisterEvents(fs)\n\tfor _, timers in next, eventlessUnits do\n\t\tlocal index = 1\n\t\tlocal fontstr = timers[index]\n\t\twhile fontstr do\n\t\t\tif(fs == fontstr) then\n\t\t\t\ttable.remove(timers, index)\n\t\t\telse\n\t\t\t\tindex = index + 1\n\t\t\tend\n\n\t\t\tfontstr = timers[index]\n\t\tend\n\tend\n\n\tfs.UpdateTag = nil\n\n\ttaggedFS[fs] = nil\n\tself.__tags[fs] = nil\nend\n\nlocal function strip(tag)\n\t-- remove prefix, custom args, and suffix\n\treturn tag:gsub('%[.-$>', '['):gsub('%(.-%)%]', ']'):gsub('<$.-%]', ']')\nend\n\noUF.Tags = {\n\tMethods = tags,\n\tEvents = tagEvents,\n\tSharedEvents = unitlessEvents,\n\tVars = vars,\n\tRefreshMethods = function(self, tag)\n\t\tif(not tag) then return end\n\n\t\t-- If a tag's name contains magic chars, there's a chance that\n\t\t-- string.match will fail to find the match.\n\t\ttag = '%[' .. tag:gsub('[%^%$%(%)%%%.%*%+%-%?]', '%%%1') .. '%]'\n\n\t\tfor func in next, funcPool do\n\t\t\tif(strip(func):match(tag)) then\n\t\t\t\tfuncPool[func] = nil\n\t\t\tend\n\t\tend\n\n\t\tfor tagstr, func in next, tagPool do\n\t\t\tif(strip(tagstr):match(tag)) then\n\t\t\t\ttagPool[tagstr] = nil\n\n\t\t\t\tfor fs in next, taggedFS do\n\t\t\t\t\tif(fs.UpdateTag == func) then\n\t\t\t\t\t\tfs.UpdateTag = getTagFunc(tagstr)\n\n\t\t\t\t\t\tif(fs:IsVisible()) then\n\t\t\t\t\t\t\tfs:UpdateTag()\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend,\n\tRefreshEvents = function(self, tag)\n\t\tif(not tag) then return end\n\n\t\t-- If a tag's name contains magic chars, there's a chance that\n\t\t-- string.match will fail to find the match.\n\t\ttag = '%[' .. tag:gsub('[%^%$%(%)%%%.%*%+%-%?]', '%%%1') .. '%]'\n\t\tfor tagstr in next, tagPool do\n\t\t\tif(strip(tagstr):match(tag)) then\n\t\t\t\tfor fs, ts in next, taggedFS do\n\t\t\t\t\tif(ts == tagstr) then\n\t\t\t\t\t\tunregisterEvents(fs)\n\t\t\t\t\t\tregisterEvents(fs, tagstr)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend,\n}\n\noUF:RegisterMetaFunction('Tag', Tag)\noUF:RegisterMetaFunction('Untag', Untag)\noUF:RegisterMetaFunction('UpdateTags', Update)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Elements/ThreatIndicator.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal unitExists = Private.unitExists\n\nlocal function Update(self, event, unit)\n\tif(unit ~= self.unit) then return end\n\n\tlocal element = self.ThreatIndicator\n\t--[[ Callback: ThreatIndicator:PreUpdate(unit)\n\tCalled before the element has been updated.\n\n\t* self - the ThreatIndicator element\n\t* unit - the unit for which the update has been triggered (string)\n\t--]]\n\tif(element.PreUpdate) then element:PreUpdate(unit) end\n\n\tlocal feedbackUnit = element.feedbackUnit\n\tunit = unit or self.unit\n\n\tlocal status\n\t-- BUG: Non-existent '*target' or '*pet' units cause UnitThreatSituation() errors\n\tif(unitExists(unit)) then\n\t\tif(feedbackUnit and feedbackUnit ~= unit and unitExists(feedbackUnit)) then\n\t\t\tstatus = UnitThreatSituation(feedbackUnit, unit)\n\t\telse\n\t\t\tstatus = UnitThreatSituation(unit)\n\t\tend\n\tend\n\n\tlocal r, g, b\n\tif(status and status > 0) then\n\t\tlocal color = self.colors.threat[status]\n\t\tr, g, b = color[1], color[2], color[3]\n\n\t\tif(element.SetVertexColor) then\n\t\t\telement:SetVertexColor(r, g, b)\n\t\tend\n\n\t\telement:Show()\n\telse\n\t\telement:Hide()\n\tend\n\n\t--[[ Callback: ThreatIndicator:PostUpdate(unit, status, r, g, b)\n\tCalled after the element has been updated.\n\n\t* self   - the ThreatIndicator element\n\t* unit   - the unit for which the update has been triggered (string)\n\t* status - the unit's threat status (see [UnitThreatSituation](http://wowprogramming.com/docs/api/UnitThreatSituation.html))\n\t* r      - the red color component based on the unit's threat status (number?)[0-1]\n\t* g      - the green color component based on the unit's threat status (number?)[0-1]\n\t* b      - the blue color component based on the unit's threat status (number?)[0-1]\n\t--]]\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit, status, r, g, b)\n\tend\nend\n\nlocal function Path(self, ...)\n\t--[[ Override: ThreatIndicator.Override(self, event, ...)\n\tUsed to completely override the internal update function.\n\n\t* self  - the parent object\n\t* event - the event triggering the update (string)\n\t* ...   - the arguments accompanying the event\n\t--]]\n\treturn (self.ThreatIndicator.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tlocal element = self.ThreatIndicator\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent('UNIT_THREAT_SITUATION_UPDATE', Path)\n\t\tself:RegisterEvent('UNIT_THREAT_LIST_UPDATE', Path)\n\n\t\tif(element:IsObjectType('Texture') and not element:GetTexture()) then\n\t\t\telement:SetTexture([[Interface\\RAIDFRAME\\UI-RaidFrame-Threat]])\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.ThreatIndicator\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent('UNIT_THREAT_SITUATION_UPDATE', Path)\n\t\tself:UnregisterEvent('UNIT_THREAT_LIST_UPDATE', Path)\n\tend\nend\n\noUF:AddElement('ThreatIndicator', Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Events.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal argcheck = Private.argcheck\nlocal validateEvent = Private.validateEvent\nlocal validateUnit = Private.validateUnit\nlocal isUnitEvent = Private.isUnitEvent\nlocal frame_metatable = Private.frame_metatable\n\n-- Original event methods\nlocal registerEvent = frame_metatable.__index.RegisterEvent\nlocal registerUnitEvent = frame_metatable.__index.RegisterUnitEvent\nlocal unregisterEvent = frame_metatable.__index.UnregisterEvent\nlocal isEventRegistered = frame_metatable.__index.IsEventRegistered\n\n-- to update unit frames correctly, some events need to be registered for\n-- a specific combination of primary and secondary units\nlocal secondaryUnits = {\n\tUNIT_ENTERED_VEHICLE = {\n\t\tpet = 'player',\n\t},\n\tUNIT_EXITED_VEHICLE = {\n\t\tpet = 'player',\n\t},\n\tUNIT_PET = {\n\t\tpet = 'player',\n\t},\n}\n\nfunction Private.UpdateUnits(frame, unit, realUnit)\n\tif(unit == realUnit) then\n\t\trealUnit = nil\n\tend\n\n\tif(frame.unit ~= unit or frame.realUnit ~= realUnit) then\n\t\t-- don't let invalid units in, otherwise unit events will end up being\n\t\t-- registered as unitless\n\t\tif(frame.unitEvents and validateUnit(unit)) then\n\t\t\tlocal resetRealUnit = false\n\n\t\t\tfor event in next, frame.unitEvents do\n\t\t\t\tif(not realUnit and secondaryUnits[event]) then\n\t\t\t\t\trealUnit = secondaryUnits[event][unit]\n\t\t\t\t\tresetRealUnit = true\n\t\t\t\tend\n\n\t\t\t\tlocal registered, unit1, unit2 = isEventRegistered(frame, event)\n\t\t\t\t-- we don't want to re-register unitless/shared events in case\n\t\t\t\t-- someone added them by hand to the unitEvents table\n\t\t\t\tif(not registered or unit1 and (unit1 ~= unit or unit2 ~= realUnit)) then\n\t\t\t\t\t-- BUG: passing explicit nil units to RegisterUnitEvent\n\t\t\t\t\t-- makes it silently fall back to RegisterEvent, using ''\n\t\t\t\t\t-- instead of explicit nils doesn't cause this behaviour\n\t\t\t\t\tregisterUnitEvent(frame, event, unit, realUnit or '')\n\t\t\t\tend\n\n\t\t\t\tif(resetRealUnit) then\n\t\t\t\t\trealUnit = nil\n\t\t\t\t\tresetRealUnit = false\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tframe.unit = unit\n\t\tframe.realUnit = realUnit\n\t\tframe.id = unit:match('^.-(%d+)')\n\n\t\treturn true\n\tend\nend\n\nlocal function onEvent(self, event, ...)\n\tif(self:IsVisible()) then\n\t\treturn self[event](self, event, ...)\n\tend\nend\n\nlocal event_metatable = {\n\t__call = function(funcs, self, ...)\n\t\tfor _, func in next, funcs do\n\t\t\tfunc(self, ...)\n\t\tend\n\tend,\n}\n\n--[[ Events: frame:RegisterEvent(event, func, unitless)\nUsed to register a frame for a game event and add an event handler. OnUpdate polled frames are prevented from\nregistering events.\n\n* self     - frame that will be registered for the given event.\n* event    - name of the event to register (string)\n* func     - a function that will be executed when the event fires. Multiple functions can be added for the same frame\n             and event (function)\n* unitless - indicates that the event does not fire for a specific unit, so the event arguments won't be\n             matched to the frame unit(s). Obligatory for unitless event (boolean)\n--]]\nfunction frame_metatable.__index:RegisterEvent(event, func, unitless)\n\t-- Block OnUpdate polled frames from registering events except for\n\t-- UNIT_PORTRAIT_UPDATE and UNIT_MODEL_CHANGED which are used for\n\t-- portrait updates.\n\tif(self.__eventless and event ~= 'UNIT_PORTRAIT_UPDATE' and event ~= 'UNIT_MODEL_CHANGED') then return end\n\n\targcheck(event, 2, 'string')\n\targcheck(func, 3, 'function')\n\n\tlocal curev = self[event]\n\tif(curev) then\n\t\tlocal kind = type(curev)\n\t\tif(kind == 'function' and curev ~= func) then\n\t\t\tself[event] = setmetatable({curev, func}, event_metatable)\n\t\telseif(kind == 'table') then\n\t\t\tfor _, infunc in next, curev do\n\t\t\t\tif(infunc == func) then return end\n\t\t\tend\n\n\t\t\ttable.insert(curev, func)\n\t\tend\n\n\t\tif(unitless or self.__eventless) then\n\t\t\t-- re-register the event in case we have mixed registration\n\t\t\tregisterEvent(self, event)\n\n\t\t\tif(self.unitEvents) then\n\t\t\t\tself.unitEvents[event] = nil\n\t\t\tend\n\t\tend\n\telseif(validateEvent(event)) then\n\t\tself[event] = func\n\n\t\tif(not self:GetScript('OnEvent')) then\n\t\t\tself:SetScript('OnEvent', onEvent)\n\t\tend\n\n\t\tif(unitless or self.__eventless) then\n\t\t\tregisterEvent(self, event)\n\t\telse\n\t\t\tself.unitEvents = self.unitEvents or {}\n\t\t\tself.unitEvents[event] = true\n\n\t\t\t-- UpdateUnits will take care of unit event registration for header\n\t\t\t-- units in case we don't have a valid unit yet\n\t\t\tlocal unit1, unit2 = self.unit\n\t\t\tif(unit1 and validateUnit(unit1)) then\n\t\t\t\tif(secondaryUnits[event]) then\n\t\t\t\t\tunit2 = secondaryUnits[event][unit1]\n\t\t\t\tend\n\n\t\t\t\t-- be helpful and throw a custom error when attempting to register\n\t\t\t\t-- an event that is unitless\n\t\t\t\tassert(isUnitEvent(event, unit1), string.format('Event \"%s\" is not an unit event', event))\n\n\t\t\t\tregisterUnitEvent(self, event, unit1, unit2 or '')\n\t\t\tend\n\t\tend\n\tend\nend\n\n--[[ Events: frame:UnregisterEvent(event, func)\nUsed to remove a function from the event handler list for a game event.\n\n* self  - the frame registered for the event\n* event - name of the registered event (string)\n* func  - function to be removed from the list of event handlers. If this is the only handler for the given event, then\n          the frame will be unregistered for the event (function)\n--]]\nfunction frame_metatable.__index:UnregisterEvent(event, func)\n\targcheck(event, 2, 'string')\n\n\tlocal cleanUp = false\n\tlocal curev = self[event]\n\tif(type(curev) == 'table' and func) then\n\t\tfor k, infunc in next, curev do\n\t\t\tif(infunc == func) then\n\t\t\t\tcurev[k] = nil\n\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\n\t\tif(not next(curev)) then\n\t\t\tcleanUp = true\n\t\tend\n\tend\n\n\tif(cleanUp or curev == func) then\n\t\tself[event] = nil\n\t\tif(self.unitEvents) then\n\t\t\tself.unitEvents[event] = nil\n\t\tend\n\n\t\tunregisterEvent(self, event)\n\tend\nend\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Factory.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal argcheck = Private.argcheck\n\nlocal queue = {}\nlocal factory = CreateFrame('Frame')\nfactory:SetScript('OnEvent', function(self, event, ...)\n\treturn self[event](self, event, ...)\nend)\n\nfactory:RegisterEvent('PLAYER_LOGIN')\nfactory.active = true\n\nfunction factory:PLAYER_LOGIN()\n\tif(not self.active) then return end\n\n\tfor _, func in next, queue do\n\t\tfunc(oUF)\n\tend\n\n\t-- Avoid creating dupes.\n\ttable.wipe(queue)\nend\n\n--[[ Factory: oUF:Factory(func)\nUsed to call a function directly if the current character is logged in and the factory is active. Else the function is\nqueued up to be executed at a later time (upon PLAYER_LOGIN by default).\n\n* self - the global oUF object\n* func - function to be executed or delayed (function)\n--]]\nfunction oUF:Factory(func)\n\targcheck(func, 2, 'function')\n\n\t-- Call the function directly if we're active and logged in.\n\tif(IsLoggedIn() and factory.active) then\n\t\treturn func(self)\n\telse\n\t\ttable.insert(queue, func)\n\tend\nend\n\n--[[ Factory: oUF:EnableFactory()\nUsed to enable the factory.\n\n* self - the global oUF object\n--]]\nfunction oUF:EnableFactory()\n\tfactory.active = true\nend\n\n--[[ Factory: oUF:DisableFactory()\nUsed to disable the factory.\n\n* self - the global oUF object\n--]]\nfunction oUF:DisableFactory()\n\tfactory.active = nil\nend\n\n--[[ Factory: oUF:RunFactoryQueue()\nUsed to try to execute queued up functions. The current player must be logged in and the factory must be active for\nthis to succeed.\n\n* self - the global oUF object\n--]]\nfunction oUF:RunFactoryQueue()\n\tfactory:PLAYER_LOGIN()\nend\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Finalize.lua",
    "content": "local _, ns = ...\n\n-- It's named Private for a reason!\nns.oUF.Private = nil\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Init.lua",
    "content": "local _, ns = ...\nns.oUF = {}\nns.oUF.Private = {}\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/ArcaneCharge.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or T.class ~= \"MAGE\" then return end\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal SPELL_POWER_ARCANE_CHARGES = Enum.PowerType.ArcaneCharges or 16\n\nlocal function Update(self, _, unit, powerType)\n\tif(self.unit ~= unit or (powerType and powerType ~= \"ARCANE_CHARGES\")) then return end\n\n\tlocal element = self.ArcaneCharge\n\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tlocal cur = UnitPower(\"player\", SPELL_POWER_ARCANE_CHARGES)\n\tlocal max = UnitPowerMax(\"player\", SPELL_POWER_ARCANE_CHARGES)\n\n\tfor i = 1, max do\n\t\tif(i <= cur) then\n\t\t\telement[i]:SetAlpha(1)\n\t\telse\n\t\t\telement[i]:SetAlpha(0.2)\n\t\tend\n\tend\n\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(cur)\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.ArcaneCharge.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit, \"ARCANE_CHARGES\")\nend\n\nlocal function Visibility(self)\n\tlocal element = self.ArcaneCharge\n\tlocal spec = GetSpecialization()\n\n\tif spec == SPEC_MAGE_ARCANE then\n\t\telement:Show()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19) end\n\telse\n\t\telement:Hide()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 5) end\n\tend\nend\n\nlocal function Enable(self)\n\tlocal element = self.ArcaneCharge\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent(\"UNIT_POWER_UPDATE\", Path)\n\n\t\telement.handler = CreateFrame(\"Frame\", nil, element)\n\t\telement.handler:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\telement.handler:SetScript(\"OnEvent\", function() Visibility(self) end)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.ArcaneCharge\n\tif(element) then\n\t\tself:UnregisterEvent(\"UNIT_POWER_UPDATE\", Path)\n\t\telement.handler:UnregisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tend\nend\n\noUF:AddElement(\"ArcaneCharge\", Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/AuraTracker.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.show_arena ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_AuraTracker(by Thizzelle)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(object, _, unit)\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType ~= \"arena\" then\n\t\tobject.AuraTracker:Hide()\n\t\treturn\n\telse\n\t\tobject.AuraTracker:Show()\n\tend\n\n\tif object.unit ~= unit then return end\n\n\tlocal auraList = T.ArenaControl\n\tlocal priority = 0\n\tlocal auraName, auraIcon, auraExpTime\n\tlocal index = 1\n\n\t-- Buffs\n\twhile true do\n\t\tlocal name, icon, _, _, _, expirationTime = UnitAura(unit, index, \"HELPFUL\")\n\t\tif not name then break end\n\n\t\tif auraList[name] and auraList[name] >= priority then\n\t\t\tpriority = auraList[name]\n\t\t\tauraName = name\n\t\t\tauraIcon = icon\n\t\t\tauraExpTime = expirationTime\n\t\tend\n\n\t\tindex = index + 1\n\tend\n\n\tindex = 1\n\n\t-- Debuffs\n\twhile true do\n\t\tlocal name, icon, _, _, _, expirationTime = UnitAura(unit, index, \"HARMFUL\")\n\t\tif not name then break end\n\n\t\tif auraList[name] and auraList[name] >= priority then\n\t\t\tpriority = auraList[name]\n\t\t\tauraName = name\n\t\t\tauraIcon = icon\n\t\t\tauraExpTime = expirationTime\n\t\tend\n\n\t\tindex = index + 1\n\tend\n\n\tif auraName then -- If an aura is found, display it and set the time left!\n\t\tobject.AuraTracker.icon:SetTexture(auraIcon)\n\t\tobject.AuraTracker.timeleft = auraExpTime - GetTime()\n\t\tif object.AuraTracker.timeleft > 0 then\n\t\t\tobject.AuraTracker.active = true\n\t\tend\n\telseif not auraName then -- No aura found and one is shown? Kill it since it's no longer active!\n\t\tobject.AuraTracker.icon:SetTexture(\"\")\n\t\tobject.AuraTracker.text:SetText(\"\")\n\t\tobject.AuraTracker.active = false\n\tend\nend\n\nlocal function Enable(object)\n\t-- If we're not highlighting this unit return\n\tif not object.AuraTracker then return end\n\n\t-- Make sure aura scanning is active for this object\n\tobject:RegisterEvent(\"UNIT_AURA\", Update)\n\n\treturn true\nend\n\nlocal function Disable(object)\n\tif object.AuraTracker then\n\t\tobject:UnregisterEvent(\"UNIT_AURA\", Update)\n\tend\nend\n\noUF:AddElement(\"AuraTracker\", Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/AuraWatch.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.raidframe.plugins_aura_watch ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_AuraWatch(by Astromech)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal GUIDs = {}\n\nlocal PLAYER_UNITS = {\n\tplayer = true,\n\tvehicle = true,\n\tpet = true,\n}\n\nlocal setupGUID\ndo\n\tlocal cache = setmetatable({}, {__type = \"k\"})\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:SetScript(\"OnEvent\", function()\n\t\tfor k,t in pairs(GUIDs) do\n\t\t\tGUIDs[k] = nil\n\t\t\tfor a in pairs(t) do\n\t\t\t\tt[a] = nil\n\t\t\tend\n\t\t\tcache[t] = true\n\t\tend\n\tend)\n\tframe:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\tframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\n\tfunction setupGUID(guid)\n\t\tlocal t = next(cache)\n\t\tif t then\n\t\t\tcache[t] = nil\n\t\telse\n\t\t\tt = {}\n\t\tend\n\t\tGUIDs[guid] = t\n\tend\nend\n\nlocal function resetIcon(icon, count, duration, remaining)\n\ticon:Show()\n\tif icon.cd then\n\t\tif duration and duration > 0 then\n\t\t\ticon.cd:SetCooldown(remaining - duration, duration)\n\t\t\ticon.cd:Show()\n\t\telse\n\t\t\ticon.cd:Hide()\n\t\tend\n\tend\n\tif icon.count then\n\t\ticon.count:SetText((count > 1 and count or \"\"))\n\tend\n\ticon:SetAlpha(1)\nend\n\nlocal function expireIcon(icon)\n\tif icon.cd then icon.cd:Hide() end\n\tif icon.count then icon.count:SetText() end\n\ticon:SetAlpha(0)\n\ticon:Show()\nend\n\nlocal found = {}\nlocal function Update(frame, _, unit)\n\tif frame.unit ~= unit then return end\n\tlocal watch = frame.AuraWatch\n\tlocal index, icons = 1, watch.watched\n\tlocal _, name, count, duration, remaining, caster, key, icon, spellID\n\tlocal filter = \"HELPFUL\"\n\tlocal guid = UnitGUID(unit)\n\tif not guid then return end\n\tif not GUIDs[guid] then setupGUID(guid) end\n\n\tfor _, icon in pairs(icons) do\n\t\ticon:Hide()\n\tend\n\n\twhile true do\n\t\tname, _, count, _, duration, remaining, caster, _, _, spellID = UnitAura(unit, index, filter)\n\t\tif not name then\n\t\t\tif filter == \"HELPFUL\" then\n\t\t\t\tfilter = \"HARMFUL\"\n\t\t\t\tindex = 1\n\t\t\telse\n\t\t\t\tbreak\n\t\t\tend\n\t\telse\n\t\t\tif watch.strictMatching then\n\t\t\t\tkey = spellID\n\t\t\telse\n\t\t\t\tkey = name\n\t\t\tend\n\t\t\ticon = icons[key]\n\t\t\tif icon and not T.RaidBuffsIgnore[spellID] and (icon.anyUnit or (caster and icon.fromUnits and icon.fromUnits[caster])) then\n\t\t\t\tresetIcon(icon, count, duration, remaining)\n\t\t\t\tGUIDs[guid][key] = true\n\t\t\t\tfound[key] = true\n\t\t\tend\n\t\t\tindex = index + 1\n\t\tend\n\tend\n\n\tfor key in pairs(GUIDs[guid]) do\n\t\tif icons[key] and not found[key] then\n\t\t\texpireIcon(icons[key])\n\t\tend\n\tend\n\n\tfor k in pairs(found) do\n\t\tfound[k] = nil\n\tend\nend\n\nlocal function setupIcons(self)\n\tlocal watch = self.AuraWatch\n\tlocal icons = watch.icons\n\twatch.watched = {}\n\n\tfor _, icon in pairs(icons) do\n\t\tlocal name, _, image = GetSpellInfo(icon.spellID)\n\t\tif name then\n\t\t\ticon.name = name\n\n\t\t\tif not icon.cd and not (watch.hideCooldown or icon.hideCooldown) then\n\t\t\t\tlocal cd = CreateFrame(\"Cooldown\", nil, icon, \"CooldownFrameTemplate\")\n\t\t\t\tcd:SetAllPoints(icon)\n\t\t\t\tcd:SetDrawEdge(false)\n\t\t\t\ticon.cd = cd\n\t\t\tend\n\n\t\t\tif not icon.icon then\n\t\t\t\tlocal tex = icon:CreateTexture(nil, \"BACKGROUND\")\n\t\t\t\ttex:SetAllPoints(icon)\n\t\t\t\ttex:SetTexture(image)\n\t\t\t\ticon.icon = tex\n\t\t\tend\n\n\t\t\tif not icon.count and not (watch.hideCount or icon.hideCount) then\n\t\t\t\tlocal count = icon:CreateFontString(nil, \"OVERLAY\")\n\t\t\t\tcount:SetFontObject(NumberFontNormal)\n\t\t\t\tcount:SetPoint(\"BOTTOMRIGHT\", icon, \"BOTTOMRIGHT\", -1, 0)\n\t\t\t\ticon.count = count\n\t\t\tend\n\n\t\t\tif icon.fromUnits == nil then\n\t\t\t\ticon.fromUnits = watch.fromUnits or PLAYER_UNITS\n\t\t\tend\n\t\t\tif icon.anyUnit == nil then\n\t\t\t\ticon.anyUnit = watch.anyUnit\n\t\t\tend\n\n\t\t\tif watch.strictMatching then\n\t\t\t\twatch.watched[icon.spellID] = icon\n\t\t\telse\n\t\t\t\twatch.watched[name] = icon\n\t\t\tend\n\n\t\t\tif watch.PostCreateIcon then watch:PostCreateIcon(icon, icon.spellID, name, self) end\n\t\telse\n\t\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(icon.spellID)..\"] no longer exists! Report this to Shestak.|r\")\n\t\tend\n\tend\nend\n\nlocal function Enable(self)\n\tif self.AuraWatch then\n\t\tself:RegisterEvent(\"UNIT_AURA\", Update)\n\t\tsetupIcons(self)\n\t\treturn true\n\telse\n\t\treturn false\n\tend\nend\n\nlocal function Disable(self)\n\tif self.AuraWatch then\n\t\tself:UnregisterEvent(\"UNIT_AURA\", Update)\n\t\tfor _, icon in pairs(self.AuraWatch.icons) do\n\t\t\ticon:Hide()\n\t\tend\n\tend\nend\n\noUF:AddElement(\"AuraWatch\", Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/AutoResurrect.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.raidframe.plugins_auto_resurrection ~= true or C.misc.click_cast == true or T.class == \"DEMONHUNTER\" or T.class == \"HUNTER\" or T.class == \"MAGE\" or T.class == \"ROGUE\" or T.class == \"WARRIOR\" then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on FreebAutoRez(by Freebaser)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal classList = {\n\t[\"DEATHKNIGHT\"] = {\n\t\tcombat = GetSpellInfo(61999),\t-- Raise Ally\n\t},\n\t[\"DRUID\"] = {\n\t\tcombat = GetSpellInfo(20484),\t-- Rebirth\n\t\tooc = GetSpellInfo(50769),\t\t-- Revive\n\t},\n\t[\"EVOKER\"] = {\n\t\tooc = GetSpellInfo(361227),\t\t-- Return\n\t},\n\t[\"MONK\"] = {\n\t\tooc = GetSpellInfo(115178),\t\t-- Resuscitate\n\t},\n\t[\"PALADIN\"] = {\n\t\tcombat = GetSpellInfo(391054),\t-- Intercession\n\t\tooc = GetSpellInfo(7328),\t\t-- Redemption\n\t},\n\t[\"PRIEST\"] = {\n\t\tooc = GetSpellInfo(2006),\t\t-- Resurrection\n\t},\n\t[\"SHAMAN\"] = {\n\t\tooc = GetSpellInfo(2008),\t\t-- Ancestral Spirit\n\t},\n\t[\"WARLOCK\"] = {\n\t\tcombat = GetSpellInfo(6203),\t-- Soulstone\n\t\tooc = GetSpellInfo(6203),\t\t-- Soulstone\n\t},\n}\n\nlocal body = \"\"\nlocal function macroBody(class)\n\tlocal combatspell = classList[class].combat\n\tlocal oocspell = classList[class].ooc\n\n\tbody = \"/stopmacro [@mouseover,nodead]\\n\"\n\tif combatspell then\n\t\tbody = body..\"/use [combat,@mouseover,help,dead] \"..combatspell..\"; \"\n\n\t\tif oocspell then\n\t\t\tbody = body..\"[@mouseover,help,dead] \"..oocspell..\"; \"\n\t\tend\n\n\t\tif class == \"WARLOCK\" then\n\t\t\tlocal name = GetSpellInfo(6203)\n\t\t\tbody = body..\"\\n/use \"..name..\"\\n \"\n\t\tend\n\telseif oocspell then\n\t\tbody = body..\"/use [@mouseover,help,dead] \"..oocspell..\"; \"\n\tend\n\n\treturn body\nend\n\nlocal Enable = function(self)\n\tlocal _, class = UnitClass(\"player\")\n\tif not class then return end\n\n\tif classList[class] and not IsAddOnLoaded(\"Clique\") and not InCombatLockdown() then\n\t\tself:SetAttribute(\"*type3\", \"macro\")\n\t\tself:SetAttribute(\"macrotext3\", macroBody(class))\n\t\treturn true\n\tend\nend\n\nlocal Disable = function(self)\n\tself:SetAttribute(\"*type3\", nil)\nend\n\noUF:AddElement(\"AutoResurrect\", nil, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/CombatFeedback.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.plugins_combat_feedback ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_CombatFeedback(by Ammo)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal damage_format = \"-%d\"\nlocal heal_format = \"+%d\"\nlocal maxAlpha = 0.6\nlocal updateFrame\nlocal feedback = {}\nlocal color\nlocal colors = {\n\tSTANDARD\t\t= {1, 1, 1},\n\t-- Damage\n\tIMMUNE\t\t\t= {1, 1, 1},\n\tDAMAGE\t\t\t= {1, 0, 0},\n\tCRUSHING\t\t= {1, 0, 0},\n\tCRITICAL\t\t= {1, 0, 0},\n\tGLANCING\t\t= {1, 0, 0},\n\tABSORB\t\t\t= {1, 1, 1},\n\tBLOCK\t\t\t= {1, 1, 1},\n\tMISS\t\t\t= {1, 1, 1},\n\t-- Heal\n\tHEAL\t\t\t= {0, 1, 0},\n\tCRITHEAL\t\t= {0, 1, 0},\n\t-- Energize\n\tENERGIZE\t\t= {0.41, 0.8, 0.94},\n\tCRITENERGIZE\t= {0.41, 0.8, 0.94},\n}\n\nlocal function createUpdateFrame()\n\tif updateFrame then return end\n\tupdateFrame = CreateFrame(\"Frame\")\n\tupdateFrame:Hide()\n\tupdateFrame:SetScript(\"OnUpdate\", function()\n\t\tif next(feedback) == nil then\n\t\t\tupdateFrame:Hide()\n\t\t\treturn\n\t\tend\n\t\tfor object, startTime in pairs(feedback) do\n\t\t\tlocal maxalpha = object.CombatFeedbackText.maxAlpha\n\t\t\tlocal elapsedTime = GetTime() - startTime\n\t\t\tif elapsedTime < COMBATFEEDBACK_FADEINTIME then\n\t\t\t\tlocal alpha = maxalpha * (elapsedTime / COMBATFEEDBACK_FADEINTIME)\n\t\t\t\tobject.CombatFeedbackText:SetAlpha(alpha)\n\t\t\telseif elapsedTime < (COMBATFEEDBACK_FADEINTIME + COMBATFEEDBACK_HOLDTIME) then\n\t\t\t\tobject.CombatFeedbackText:SetAlpha(maxalpha)\n\t\t\telseif elapsedTime < (COMBATFEEDBACK_FADEINTIME + COMBATFEEDBACK_HOLDTIME + COMBATFEEDBACK_FADEOUTTIME) then\n\t\t\t\tlocal alpha = maxalpha - maxalpha * ((elapsedTime - COMBATFEEDBACK_HOLDTIME - COMBATFEEDBACK_FADEINTIME) / COMBATFEEDBACK_FADEOUTTIME)\n\t\t\t\tobject.CombatFeedbackText:SetAlpha(alpha)\n\t\t\telse\n\t\t\t\tobject.CombatFeedbackText:Hide()\n\t\t\t\tfeedback[object] = nil\n\t\t\tend\n\t\tend\n\tend)\nend\n\nlocal function combat(self, event, unit, eventType, flags, amount)\n\tif unit ~= self.unit then return end\n\tif unit == \"vehicle\" then return end\n\tlocal FeedbackText = self.CombatFeedbackText\n\tlocal fColors = FeedbackText.colors\n\tlocal font, fontHeight, fontFlags = C.font.combat_text_font, C.font.combat_text_font_size, C.font.combat_text_font_style\n\tlocal text, arg\n\tcolor = fColors and fColors.STANDARD or colors.STANDARD\n\tif eventType == \"IMMUNE\" and not FeedbackText.ignoreImmune then\n\t\tcolor = fColors and fColors.IMMUNE or colors.IMMUNE\n\t\tfontHeight = fontHeight\n\t\ttext = CombatFeedbackText[eventType]\n\telseif eventType == \"WOUND\" and not FeedbackText.ignoreDamage then\n\t\tif amount ~= 0 then\n\t\t\tif flags == \"CRITICAL\" then\n\t\t\t\tcolor = fColors and fColors.CRITICAL or colors.CRITICAL\n\t\t\t\tfontHeight = fontHeight\n\t\t\telseif flags == \"CRUSHING\" then\n\t\t\t\tcolor = fColors and fColors.CRUSING or colors.CRUSHING\n\t\t\t\tfontHeight = fontHeight\n\t\t\telseif flags == \"GLANCING\" then\n\t\t\t\tcolor = fColors and fColors.GLANCING or colors.GLANCING\n\t\t\t\tfontHeight = fontHeight\n\t\t\telse\n\t\t\t\tcolor = fColors and fColors.DAMAGE or colors.DAMAGE\n\t\t\tend\n\t\t\ttext = damage_format\n\t\t\targ = amount\n\t\telseif flags == \"ABSORB\" then\n\t\t\tcolor = fColors and fColors.ABSORB or colors.ABSORB\n\t\t\tfontHeight = fontHeight\n\t\t\ttext = CombatFeedbackText[\"ABSORB\"]\n\t\telseif flags == \"BLOCK\" then\n\t\t\tcolor = fColors and fColors.BLOCK or colors.BLOCK\n\t\t\tfontHeight = fontHeight\n\t\t\ttext = CombatFeedbackText[\"BLOCK\"]\n\t\telse\n\t\t\tcolor = fColors and fColors.MISS or colors.MISS\n\t\t\ttext = CombatFeedbackText[\"MISS\"]\n\t\tend\n\telseif eventType == \"BLOCK\" and not FeedbackText.ignoreDamage then\n\t\tcolor = fColors and fColors.BLOCK or colors.BLOCK\n\t\tfontHeight = fontHeight\n\t\ttext = CombatFeedbackText[eventType]\n\telseif eventType == \"HEAL\" and not FeedbackText.ignoreHeal then\n\t\ttext = heal_format\n\t\targ = amount\n\t\tif flags == \"CRITICAL\" then\n\t\t\tcolor = fColors and fColors.CRITHEAL or colors.CRITHEAL\n\t\t\tfontHeight = fontHeight\n\t\telse\n\t\t\tcolor = fColors and fColors.HEAL or colors.HEAL\n\t\tend\n\telseif event == \"ENERGIZE\" and not FeedbackText.ignoreEnergize then\n\t\ttext = amount\n\t\tif flags == \"CRITICAL\" then\n\t\t\tcolor = fColors and fColors.ENERGIZE or colors.ENERGIZE\n\t\t\tfontHeight = fontHeight\n\t\telse\n\t\t\tcolor = fColors and fColors.CRITENERGIZE or colors.CRITENERGIZE\n\t\tend\n\telseif not FeedbackText.ignoreOther then\n\t\ttext = CombatFeedbackText[eventType]\n\tend\n\n\tif text then\n\t\tFeedbackText:SetFont(font, fontHeight, fontFlags)\n\t\tFeedbackText:SetFormattedText(text, arg)\n\t\tFeedbackText:SetTextColor(unpack(color))\n\t\tFeedbackText:SetAlpha(0)\n\t\tFeedbackText:Show()\n\t\tfeedback[self] = GetTime()\n\t\tupdateFrame:Show()\n\tend\nend\n\nlocal function addCombat(object)\n\tif not object.CombatFeedbackText then return end\n\n\tlocal _, fontHeight = object.CombatFeedbackText:GetFont()\n\tobject.CombatFeedbackText.origHeight = fontHeight\n\tobject.CombatFeedbackText.maxAlpha = object.CombatFeedbackText.maxAlpha or maxAlpha\n\tcreateUpdateFrame()\n\tobject:RegisterEvent(\"UNIT_COMBAT\", combat)\nend\n\nfor _, object in ipairs(oUF.objects) do addCombat(object) end\noUF:RegisterInitCallback(addCombat)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/ComboPoints.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true then return end\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal MAX_COMBO_POINTS = MAX_COMBO_POINTS\n\nlocal function Update(self, _, unit, powerType)\n\tif(self.unit ~= unit and (powerType and (powerType ~= \"COMBO_POINTS\"))) then return end\n\n\tlocal element = self.ComboPoints\n\tlocal cur, max\n\n\tif UnitHasVehicleUI(\"player\") then\n\t\tcur = UnitPower(\"vehicle\", 4)\n\t\tmax = UnitPowerMax(\"vehicle\", 4)\n\telse\n\t\tcur = UnitPower(\"player\", 4)\n\t\tmax = UnitPowerMax(\"player\", 4)\n\tend\n\n\tif max == 0 or max > 7 then\n\t\tmax = MAX_COMBO_POINTS\n\tend\n\n\tlocal spacing = select(4, element[5]:GetPoint())\n\tlocal w = element:GetWidth()\n\tlocal s = 0\n\n\tif element.max ~= max then\n\t\tif max == 7 then\n\t\t\telement[7]:Show()\n\t\t\telement[6]:Show()\n\t\telseif max == 6 then\n\t\t\telement[7]:Hide()\n\t\t\telement[6]:Show()\n\t\telse\n\t\t\telement[7]:Hide()\n\t\t\telement[6]:Hide()\n\t\tend\n\n\t\tfor i = 1, max do\n\t\t\tif i ~= max then\n\t\t\t\telement[i]:SetWidth(w / max - spacing)\n\t\t\t\ts = s + (w / max)\n\t\t\telse\n\t\t\t\telement[i]:SetWidth(w - s)\n\t\t\tend\n\t\tend\n\n\t\telement.max = max\n\tend\n\n\tfor i = 1, max do\n\t\tif i <= cur then\n\t\t\telement[i]:SetAlpha(1)\n\t\telse\n\t\t\telement[i]:SetAlpha(0.2)\n\t\tend\n\tend\n\n\tif T.class == \"ROGUE\" then\n\t\tfor i = 2, 5 do\n\t\t\telement[i]:SetStatusBarColor(unpack(element.Colors[i]))\n\t\tend\n\n\t\tlocal chargedPoints = GetUnitChargedPowerPoints(\"player\")\n\t\tif chargedPoints then\n\t\t\tfor _, chargedIndex in next, chargedPoints do\n\t\t\t\telement[chargedIndex]:SetStatusBarColor(unpack(element.Colors[8]))\n\t\t\t\tif element[chargedIndex]:GetAlpha() == 0.2 then\n\t\t\t\t\telement[chargedIndex]:SetAlpha(0.5)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tif C.unitframe_class_bar.combo_old == true or (T.class ~= \"DRUID\" and T.class ~= \"ROGUE\") then\n\t\tif element[1]:GetAlpha() == 1 then\n\t\t\tfor i = 1, max do\n\t\t\t\telement:Show()\n\t\t\t\telement[i]:Show()\n\t\t\tend\n\t\telse\n\t\t\tfor i = 1, max do\n\t\t\t\telement:Hide()\n\t\t\t\telement[i]:Hide()\n\t\t\tend\n\t\tend\n\n\t\tif element[1]:IsShown() then\n\t\t\tif self.Auras then self.Auras:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", -2, 19) end\n\t\telse\n\t\t\tif self.Auras then self.Auras:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", -2, 5) end\n\t\tend\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.ComboPoints.Override or Update) (self, ...)\nend\n\nlocal function Visibility(self)\n\tlocal element = self.ComboPoints\n\tlocal form = GetShapeshiftFormID()\n\n\tif form == CAT_FORM or (UnitHasVehicleUI(\"player\") and UnitPower(\"vehicle\", 4) > 0) then\n\t\telement:Show()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19) end\n\telse\n\t\telement:Hide()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 5) end\n\tend\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit, \"COMBO_POINTS\")\nend\n\nlocal Enable = function(self)\n\tlocal element = self.ComboPoints\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\telement.Colors = {\n\t\t\t[1] = {0.9, 0.1, 0.1},\n\t\t\t[2] = {0.9, 0.1, 0.1},\n\t\t\t[3] = {0.9, 0.9, 0.1},\n\t\t\t[4] = {0.9, 0.9, 0.1},\n\t\t\t[5] = {0.1, 0.9, 0.1},\n\t\t\t[6] = {0.1, 0.9, 0.1},\n\t\t\t[7] = {0.1, 0.9, 0.1},\n\t\t\t[8] = {0.33, 0.73, 1},\t-- Echoing Reprimand\n\t\t}\n\n\t\tself:RegisterEvent(\"UNIT_POWER_UPDATE\", Path, true)\n\t\tself:RegisterEvent(\"UNIT_MAXPOWER\", Path, true)\n\t\tself:RegisterEvent(\"PLAYER_TARGET_CHANGED\", Path, true)\n\n\t\tif T.class == \"DRUID\" and C.unitframe_class_bar.combo_always ~= true and C.unitframe_class_bar.combo_old ~= true then\n\t\t\telement.handler = CreateFrame(\"Frame\", nil, element)\n\t\t\telement.handler:RegisterEvent(\"UPDATE_SHAPESHIFT_FORM\")\n\t\t\telement.handler:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\t\telement.handler:SetScript(\"OnEvent\", function() Visibility(self) end)\n\t\tend\n\n\t\tfor i = 1, 7 do\n\t\t\telement[i]:SetStatusBarColor(unpack(element.Colors[i]))\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal Disable = function(self)\n\tlocal element = self.ComboPoints\n\tif(element) then\n\t\tself:UnregisterEvent(\"UNIT_POWER_UPDATE\", Path)\n\t\tself:UnregisterEvent(\"UNIT_MAXPOWER\", Path)\n\t\tself:UnregisterEvent(\"PLAYER_TARGET_CHANGED\", Path)\n\t\telement.handler:UnregisterEvent(\"UPDATE_SHAPESHIFT_FORM\")\n\t\telement.handler:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tend\nend\n\noUF:AddElement(\"ComboPoints\", Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/CounterBar.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_CounterBar(by p3lim)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal OnUpdate = function(self, elapsed)\n\tself.expiration = self.expiration - elapsed\n\tself:SetValue(self.expiration)\nend\n\nlocal Update = function(self, _, unit)\n\tif self.unit ~= unit then return end\n\n\tlocal counterbar = self.CounterBar\n\tif counterbar.PreUpdate then\n\t\tcounterbar:PreUpdate()\n\tend\n\n\t-- We just use 1 as index for now, since there currently is no more bars in use\n\tlocal max, expiration, barID = UnitPowerBarTimerInfo(unit, 1)\n\tif not barID then\n\t\tcounterbar:Hide()\n\telse\n\t\tcounterbar.expiration = expiration - GetTime()\n\t\tcounterbar:SetMinMaxValues(0, max)\n\t\tcounterbar:Show()\n\tend\n\n\tif counterbar.PostUpdate then\n\t\t-- Not sure what to pass here, since this event only fires on show/hide\n\t\treturn counterbar:PostUpdate()\n\tend\nend\n\nlocal Path = function(self, ...)\n\treturn (self.CounterBar.Override or Update) (self, ...)\nend\n\nlocal ForceUpdate = function(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit)\nend\n\nlocal Enable = function(self, unit)\n\tlocal counterbar = self.CounterBar\n\tif counterbar then\n\t\tcounterbar.__owner = self\n\t\tcounterbar.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent(\"UNIT_POWER_BAR_TIMER_UPDATE\", Path)\n\n\t\tcounterbar:SetScript(\"OnUpdate\", counterbar.OnUpdate or OnUpdate)\n\t\tcounterbar:Hide()\n\n\t\tif unit == \"player\" then\n\t\t\tPlayerBuffTimerManager:UnregisterEvent(\"UNIT_POWER_BAR_TIMER_UPDATE\")\n\t\t\tPlayerBuffTimerManager:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\n\t\t\t-- These events handles all the various alternative power bars,\n\t\t\t-- so unregistering them might not be the optimal solution\n\t\t\tPlayerPowerBarAlt:UnregisterEvent(\"UNIT_POWER_BAR_SHOW\")\n\t\t\tPlayerPowerBarAlt:UnregisterEvent(\"UNIT_POWER_BAR_HIDE\")\n\t\tend\n\n\t\tif counterbar:IsObjectType(\"StatusBar\") and not counterbar:GetStatusBarTexture() then\n\t\t\tcounterbar:SetStatusBarTexture[[Interface\\TargetingFrame\\UI-StatusBar]]\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal Disable = function(self, unit)\n\tlocal counterbar = self.CounterBar\n\tif counterbar then\n\t\tself:UnregisterEvent(\"UNIT_POWER_BAR_TIMER_UPDATE\", Path)\n\n\t\tcounterbar:SetScript(\"OnUpdate\", nil)\n\n\t\tif unit == \"player\" then\n\t\t\tPlayerBuffTimerManager:RegisterEvent(\"UNIT_POWER_BAR_TIMER_UPDATE\")\n\t\t\tPlayerBuffTimerManager:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\tend\n\tend\nend\n\noUF:AddElement(\"CounterBar\", Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/DebuffHighlight.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_DebuffHighlight(by Ammo)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nT.CanDispel = {\n\tDRUID = {Magic = false, Curse = true, Poison = true},\n\tEVOKER = {Magic = false, Curse = true, Poison = true, Disease = true},\n\tMAGE = {Curse = true},\n\tMONK = {Magic = false, Poison = true, Disease = true},\n\tPALADIN = {Magic = false, Poison = true, Disease = true},\n\tPRIEST = {Magic = false, Disease = true},\n\tSHAMAN = {Magic = false, Curse = true}\n}\n\nlocal dispellist = T.CanDispel[T.class] or {}\nlocal origColors = {}\nlocal origBorderColors = {}\n\nlocal function GetDebuffType(unit, filter)\n\tif not UnitCanAssist(\"player\", unit) then return nil end\n\tlocal i = 1\n\twhile true do\n\t\tlocal _, texture, _, debufftype = UnitAura(unit, i, \"HARMFUL\")\n\t\tif not texture then break end\n\t\tif debufftype and not filter or (filter and dispellist[debufftype]) then\n\t\t\treturn debufftype, texture\n\t\tend\n\t\ti = i + 1\n\tend\nend\n\nlocal function CheckSpec()\n\tlocal spec = GetSpecialization()\n\n\tif T.class == \"DRUID\" then\n\t\tif spec == 4 then\n\t\t\tdispellist.Magic = true\n\t\telse\n\t\t\tdispellist.Magic = false\n\t\tend\n\telseif T.class == \"MONK\" then\n\t\tif spec == 2 then\n\t\t\tdispellist.Magic = true\n\t\telse\n\t\t\tdispellist.Magic = false\n\t\tend\n\telseif T.class == \"PALADIN\" then\n\t\tif spec == 1 then\n\t\t\tdispellist.Magic = true\n\t\telse\n\t\t\tdispellist.Magic = false\n\t\tend\n\telseif T.class == \"PRIEST\" then\n\t\tif spec == 3 then\n\t\t\tdispellist.Magic = false\n\t\telse\n\t\t\tdispellist.Magic = true\n\t\tend\n\telseif T.class == \"SHAMAN\" then\n\t\tif spec == 3 then\n\t\t\tdispellist.Magic = true\n\t\telse\n\t\t\tdispellist.Magic = false\n\t\tend\n\tend\nend\n\nlocal function Update(object, _, unit)\n\tif object.unit ~= unit then return end\n\tlocal debuffType, texture = GetDebuffType(unit, object.DebuffHighlightFilter)\n\tif debuffType then\n\t\tlocal color = DebuffTypeColor[debuffType]\n\t\tif object.DebuffHighlightBackdrop or object.DebuffHighlightBackdropBorder then\n\t\t\tif object.DebuffHighlightBackdrop then\n\t\t\t\tobject:SetBackdropColor(color.r, color.g, color.b, object.DebuffHighlightAlpha or 1)\n\t\t\tend\n\t\t\tif object.DebuffHighlightBackdropBorder then\n\t\t\t\tobject:SetBackdropBorderColor(color.r, color.g, color.b, object.DebuffHighlightAlpha or 1)\n\t\t\tend\n\t\telseif object.DebuffHighlightUseTexture then\n\t\t\tobject.DebuffHighlight:SetTexture(texture)\n\t\telse\n\t\t\tobject.DebuffHighlight:SetVertexColor(color.r, color.g, color.b, object.DebuffHighlightAlpha or 0.5)\n\t\tend\n\telse\n\t\tif object.DebuffHighlightBackdrop or object.DebuffHighlightBackdropBorder then\n\t\t\tlocal color\n\t\t\tif object.DebuffHighlightBackdrop then\n\t\t\t\tcolor = origColors[object]\n\t\t\t\tobject:SetBackdropColor(color.r, color.g, color.b, color.a)\n\t\t\tend\n\t\t\tif object.DebuffHighlightBackdropBorder then\n\t\t\t\tcolor = origBorderColors[object]\n\t\t\t\tobject:SetBackdropBorderColor(color.r, color.g, color.b, color.a)\n\t\t\tend\n\t\telseif object.DebuffHighlightUseTexture then\n\t\t\tobject.DebuffHighlight:SetTexture(nil)\n\t\telse\n\t\t\tlocal color = origColors[object]\n\t\t\tobject.DebuffHighlight:SetVertexColor(color.r, color.g, color.b, color.a)\n\t\tend\n\tend\nend\n\nlocal function Enable(object)\n\t-- If we're not highlighting this unit return\n\tif not object.DebuffHighlightBackdrop and not object.DebuffHighlightBackdropBorder and not object.DebuffHighlight then\n\t\treturn\n\tend\n\t-- If we're filtering highlights and we're not of the dispelling type, return\n\tif object.DebuffHighlightFilter and not T.CanDispel[T.class] then\n\t\treturn\n\tend\n\n\t-- Make sure aura scanning is active for this object\n\tobject:RegisterEvent(\"UNIT_AURA\", Update)\n\tobject:RegisterEvent(\"PLAYER_TALENT_UPDATE\", CheckSpec, true)\n\tCheckSpec()\n\n\tif object.DebuffHighlightBackdrop or object.DebuffHighlightBackdropBorder then\n\t\tlocal r, g, b, a = object:GetBackdropColor()\n\t\torigColors[object] = {r = r, g = g, b = b, a = a}\n\t\tr, g, b, a = object:GetBackdropBorderColor()\n\t\torigBorderColors[object] = {r = r, g = g, b = b, a = a}\n\telseif not object.DebuffHighlightUseTexture then\n\t\tlocal r, g, b, a = object.DebuffHighlight:GetVertexColor()\n\t\torigColors[object] = {r = r, g = g, b = b, a = a}\n\tend\n\n\treturn true\nend\n\nlocal function Disable(object)\n\tif object.DebuffHighlightBackdrop or object.DebuffHighlightBackdropBorder or object.DebuffHighlight then\n\t\tobject:UnregisterEvent(\"UNIT_AURA\", Update)\n\t\tobject:UnregisterEvent(\"PLAYER_TALENT_UPDATE\", CheckSpec)\n\tend\nend\n\noUF:AddElement(\"DebuffHighlight\", Update, Enable, Disable)\n\nfor _, frame in ipairs(oUF.objects) do Enable(frame) end"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/EnemySpec.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.plugins_enemy_spec ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_Talents(by Fernir)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function Update(object, _, unit)\n\tif object.unit ~= unit or unit == \"player\" or unit:find(\"pet\") then return end\n\tobject.EnemySpec:SetText(\"\")\n\tif UnitIsFriend(\"player\", unit) or not UnitIsPlayer(unit) then return end\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType == \"pvp\" then\n\t\tfor i = 1, GetNumBattlefieldScores() do\n\t\t\tlocal name, _, _, _, _, _, _, _, _, _, _, _, _, _, _, talentSpec = GetBattlefieldScore(i)\n\t\t\tif GetUnitName(unit, true) == name then\n\t\t\t\tobject.EnemySpec:SetText(talentSpec)\n\t\t\tend\n\t\tend\n\telseif instanceType == \"arena\" then\n\t\tlocal ID = object.unit:match('arena(%d)') or object:GetID() or 0\n\t\tlocal specID = GetArenaOpponentSpec(tonumber(ID))\n\t\tif specID and specID > 0 then\n\t\t\tlocal _, name = GetSpecializationInfoByID(specID)\n\t\t\tobject.EnemySpec:SetText(name)\n\t\tend\n\tend\nend\n\nlocal function Enable(object)\n\tif not object.EnemySpec then return end\n\tobject:RegisterEvent(\"UPDATE_BATTLEFIELD_SCORE\", Update, true)\n\tobject:RegisterEvent(\"ARENA_OPPONENT_UPDATE\", Update, true)\n\treturn true\nend\n\nlocal function Disable(object)\n\tif object.EnemySpec then\n\t\tobject:UnregisterEvent(\"UPDATE_BATTLEFIELD_SCORE\", Update)\n\t\tobject:UnregisterEvent(\"ARENA_OPPONENT_UPDATE\", Update)\n\tend\nend\n\noUF:AddElement(\"EnemySpec\", Update, Enable, Disable)\nfor _, frame in ipairs(oUF.objects) do Enable(frame) end"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/Essence.lua",
    "content": "if(select(2, UnitClass(\"player\")) ~= \"EVOKER\") then return end\n--[[ Written for ViksUI by Vik, but should work as normal plugin for oUF \n## Example\n\n-- Essence Charges (Devastation Evoker)\nlib.addEssence = function(self)\n\tif T.class == \"EVOKER\" then\n\t\t-- Essence bar\n\t\tif C.unitframe_class_bar.essence == true then\n\t\t\tself.Essence = CreateFrame(\"Frame\", self:GetName()..\"_Essence\", self, \"BackdropTemplate\", \"BackdropTemplate\")\n\t\t\tlocal maxEssence = UnitPowerMax(self.unit, Enum.PowerType.Essence)\n\t\t\tself.Essence:CreateBackdrop(\"Default\")\n\t\t\tself.Essence:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 1,7)\n\t\t\tself.Essence:SetHeight(7)\n\t\t\tself.Essence:SetWidth(self:GetWidth()-2)\n\n\t\t\tfor i = 1, 6 do\n\t\t\t\tself.Essence[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_Essence\"..i, self.Essence, \"BackdropTemplate\")\n\t\t\t\tself.Essence[i]:SetSize(213 / 10, 7)\n\t\t\t\tif i == 1 then\n\t\t\t\t\tself.Essence[i]:SetPoint(\"LEFT\", self.Essence)\n\t\t\t\telse\n\t\t\t\t\tself.Essence[i]:SetPoint(\"TOPLEFT\", self.Essence[i-1], \"TOPRIGHT\", 1, 0)\n\t\t\t\tend\n\t\t\t\tself.Essence[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\tself.Essence[i]:SetStatusBarColor(0.4, 0.8, 1)\n\n\t\t\t\tself.Essence[i].bg = self.Essence[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\tself.Essence[i].bg:SetAllPoints()\n\t\t\t\tself.Essence[i].bg:SetTexture(C.media.texture)\n\t\t\t\tself.Essence[i].bg:SetVertexColor(0.4, 0.8, 1, 0.2)\n\t\t\tend\n\t\tend\n\tend\nend\n\n]]--\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal SPELL_POWER_ESSENCE = Enum.PowerType.Essence\n\nlocal function Update(self, _, unit, powerType)\n\tif(self.unit ~= unit or (powerType and powerType ~= \"ESSENCE\")) then return end\n\tlocal maxEssence = UnitPowerMax(self.unit, Enum.PowerType.Essence)\n\tlocal element = self.Essence\n\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tif UnitHasVehicleUI(\"player\") then\n\t\telement:Hide()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 5) end\n\telse\n\t\telement:Show()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19) end\n\tend\n\n\tlocal cur = UnitPower(\"player\", SPELL_POWER_ESSENCE)\n\tlocal max = maxEssence\n\n\tlocal spacing = select(4, element[5]:GetPoint())\n\tlocal w = element:GetWidth()\n\tlocal s = 0\n\n\tif element.max ~= max then\n\t\tif max == 6 then\n\t\t\telement[6]:Show()\n\t\t\telement[5]:Show()\n\t\telse\n\t\t\telement[6]:Hide()\n\t\t\telement[5]:Show()\n\t\tend\n\n\t\tfor i = 1, max do\n\t\t\tif i ~= max then\n\t\t\t\telement[i]:SetWidth(w / max - spacing)\n\t\t\t\ts = s + (w / max)\n\t\t\telse\n\t\t\t\telement[i]:SetWidth(w - s)\n\t\t\tend\n\t\tend\n\n\t\telement.max = max\n\tend\n\t\n\tfor i = 1, max do\n\t\tif(i <= cur) then\n\t\t\telement[i]:SetAlpha(1)\n\t\telse\n\t\t\telement[i]:SetAlpha(0.2)\n\t\tend\n\tend\n\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(cur)\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.Essence.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit, \"ESSENCE\")\nend\n\nlocal function Visibility(self)\n\tlocal element = self.Essence\n\n\tif not UnitHasVehicleUI(\"player\") then\n\t\telement:Show()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19) end\n\tend\n\tself:RegisterEvent(\"UNIT_POWER_UPDATE\", Path)\nend\n\nlocal function Enable(self)\n\tlocal element = self.Essence\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\t\t\n\t\tself:RegisterEvent(\"UNIT_POWER_UPDATE\", Path, true)\n\t\tself:RegisterEvent(\"UNIT_MAXPOWER\", Path, true)\n\t\tself:RegisterEvent(\"PLAYER_TARGET_CHANGED\", Path, true)\n\t\t\n\t\telement.handler = CreateFrame(\"Frame\", nil, element)\n\t\telement.handler:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\telement.handler:SetScript(\"OnEvent\", function() Visibility(self) end)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Essence\n\tif(element) then\n\t\tself:UnregisterEvent(\"UNIT_POWER_UPDATE\", Path)\n\t\tself:UnregisterEvent(\"UNIT_MAXPOWER\", Path)\n\t\tself:UnregisterEvent(\"PLAYER_TARGET_CHANGED\", Path)\n\t\telement.handler:UnregisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tend\nend\n\noUF:AddElement(\"Essence\", Path, Enable, Disable)\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/Experience.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.plugins_experience_bar ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_Experience(by p3lim)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF or oUF\nassert(oUF, 'oUF Experience was unable to locate oUF install')\n\nlocal math_floor = math.floor\n\noUF.colors.experience = {\n\t{0.58, 0, 0.55}, -- Normal\n\t{0, 0.39, 0.88}, -- Rested\n}\n\noUF.colors.honor = {\n\t{1, 0.71, 0}, -- Normal\n}\n\nlocal function IsPlayerMaxLevel()\n\tlocal maxLevel = GetRestrictedAccountData()\n\tif(maxLevel == 0) then\n\t\tmaxLevel = GetMaxLevelForPlayerExpansion()\n\tend\n\n\treturn maxLevel == UnitLevel('player')\nend\n\nlocal function IsPlayerMaxHonorLevel()\n\treturn not C_PvP.GetNextHonorLevelForReward(UnitHonorLevel('player'))\nend\n\nlocal function ShouldShowHonor()\n\treturn IsPlayerMaxLevel() and (IsWatchingHonorAsXP() or C_PvP.IsActiveBattlefield() or IsInActiveWorldPVP())\nend\n\nlocal function GetValues()\n\tlocal isHonor = ShouldShowHonor()\n\tlocal cur = (isHonor and UnitHonor or UnitXP)('player')\n\tlocal max = (isHonor and UnitHonorMax or UnitXPMax)('player')\n\tlocal level = (isHonor and UnitHonorLevel or UnitLevel)('player')\n\tlocal rested = not isHonor and (GetXPExhaustion() or 0) or 0\n\n\tlocal perc = math_floor(cur / max * 100 + 0.5)\n\tlocal restedPerc = math_floor(rested / max * 100 + 0.5)\n\n\treturn cur, max, perc, rested, restedPerc, level, isHonor\nend\n\n-- Changed tooltip for ShestakUI\nlocal function UpdateTooltip()\n\tlocal cur, max, perc, rested, restedPerc, level, isHonor = GetValues()\n\n\tGameTooltip:SetText(isHonor and HONOR_LEVEL_LABEL:format(level) or COMBAT_XP_GAIN..\" \"..format(LEVEL_GAINED, T.level), 0.40, 0.78, 1)\n\tGameTooltip:AddLine(\" \")\n\tGameTooltip:AddLine(format(L_STATS_CURRENT_XP..\": %s / %s (%d%%)\", BreakUpLargeNumbers(cur), BreakUpLargeNumbers(max), perc), 0.75, 0.9, 1)\n\tGameTooltip:AddLine(format(L_STATS_REMAINING_XP..\": %s (%d%%)\", BreakUpLargeNumbers(max - cur), (max - cur) / max * 100 + 0.5), 0.75, 0.9, 1)\n\n\tif(rested > 0) then\n\t\tGameTooltip:AddLine(format('%s: %s (%d%%)', L_STATS_RESTED_XP, BreakUpLargeNumbers(rested), restedPerc), 0.75, 0.9, 1)\n\tend\n\n\tGameTooltip:Show()\nend\n\nlocal function OnEnter(element)\n\telement:SetAlpha(element.inAlpha)\n\tGameTooltip:SetOwner(element, \"ANCHOR_BOTTOM\", 0, -5)\t-- ShestakUI\n\tUpdateTooltip(element)\nend\n\nlocal function OnLeave(element)\n\tGameTooltip:Hide()\n\telement:SetAlpha(element.outAlpha)\nend\n\nlocal function OnMouseUp(element, btn)\n\tif btn == \"MiddleButton\" then\n\t\tif element.outAlpha == 0 then\n\t\t\telement.outAlpha = 1\n\t\t\tShestakUISettings.Experience = true\n\t\telse\n\t\t\telement.outAlpha = 0\n\t\t\tShestakUISettings.Experience = false\n\t\tend\n\tend\nend\n\nlocal function CheckAlpha(element)\n\tif ShestakUISettings and ShestakUISettings.Experience == true then\n\t\telement.outAlpha = 1\n\t\telement:SetAlpha(element.outAlpha or 1)\n\tend\nend\n\nlocal function UpdateColor(element, isHonor, isRested)\n\tlocal colors = element.__owner.colors\n\tif(isHonor) then\n\t\tcolors = colors.honor\n\telse\n\t\tcolors = colors.experience\n\tend\n\n\tlocal r, g, b = unpack(colors[isRested and 2 or 1])\n\telement:SetStatusBarColor(r, g, b)\n\telement.bg:SetVertexColor(r, g, b, 0.2) -- ShestakUI\n\tif(element.SetAnimatedTextureColors) then\n\t\telement:SetAnimatedTextureColors(r, g, b)\n\tend\n\n\tif(element.Rested) then\n\t\telement.Rested:SetStatusBarColor(r, g, b, element.restedAlpha)\n\tend\nend\n\nlocal function Update(self, event, unit)\n\tif(self.unit ~= unit or unit ~= 'player') then return end\n\n\tlocal element = self.Experience\n\tif(element.PreUpdate) then element:PreUpdate(unit) end\n\n\tlocal cur, max, _, rested, _, level, isHonor = GetValues()\n\tif(element.SetAnimatedValues) then\n\t\telement:SetAnimatedValues(cur, 0, max, level)\n\telse\n\t\telement:SetMinMaxValues(0, max)\n\t\telement:SetValue(cur)\n\tend\n\n\tif(element.Rested) then\n\t\telement.Rested:SetMinMaxValues(0, max)\n\t\telement.Rested:SetValue(math.min(cur + rested, max))\n\tend\n\n\t(element.OverrideUpdateColor or UpdateColor)(element, isHonor, rested > 0)\n\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit, cur, max, rested, level, isHonor)\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.Experience.Override or Update) (self, ...)\nend\n\nlocal function ElementEnable(self)\n\tlocal element = self.Experience\n\tself:RegisterEvent('PLAYER_XP_UPDATE', Path, true)\n\tself:RegisterEvent('HONOR_XP_UPDATE', Path, true)\n\tself:RegisterEvent('ZONE_CHANGED', Path, true)\n\tself:RegisterEvent('ZONE_CHANGED_NEW_AREA', Path, true)\n\n\tif(element.Rested) then\n\t\tself:RegisterEvent('UPDATE_EXHAUSTION', Path, true)\n\tend\n\n\telement:Show()\n\telement:SetAlpha(element.outAlpha or 1)\n\n\tPath(self, 'ElementEnable', 'player')\nend\n\nlocal function ElementDisable(self)\n\tself:UnregisterEvent('PLAYER_XP_UPDATE', Path)\n\tself:UnregisterEvent('HONOR_XP_UPDATE', Path)\n\tself:UnregisterEvent('ZONE_CHANGED', Path)\n\tself:UnregisterEvent('ZONE_CHANGED_NEW_AREA', Path)\n\n\tif(self.Experience.Rested) then\n\t\tself:UnregisterEvent('UPDATE_EXHAUSTION', Path)\n\tend\n\n\tself.Experience:Hide()\n\n\tPath(self, 'ElementDisable', 'player')\nend\n\nlocal function Visibility(self, event, unit)\n\tlocal shouldEnable\n\n\tif(not UnitHasVehicleUI('player')) then\n\t\tif(not IsPlayerMaxLevel() and not IsXPUserDisabled()) then\n\t\t\tshouldEnable = true\n\t\telseif(ShouldShowHonor() and not IsPlayerMaxHonorLevel()) then\n\t\t\tshouldEnable = true\n\t\tend\n\tend\n\n\tif(shouldEnable) then\n\t\tElementEnable(self)\n\telse\n\t\tElementDisable(self)\n\tend\nend\n\nlocal function VisibilityPath(self, ...)\n\treturn (self.Experience.OverrideVisibility or Visibility)(self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.Experience\n\tif(element and unit == 'player') then\n\t\telement.__owner = self\n\n\t\telement.ForceUpdate = ForceUpdate\n\t\telement.restedAlpha = element.restedAlpha or 0.15\n\n\t\tself:RegisterEvent('PLAYER_LEVEL_UP', VisibilityPath, true)\n\t\tself:RegisterEvent('HONOR_LEVEL_UPDATE', VisibilityPath, true)\n\t\tself:RegisterEvent('DISABLE_XP_GAIN', VisibilityPath, true)\n\t\tself:RegisterEvent('ENABLE_XP_GAIN', VisibilityPath, true)\n\t\tself:RegisterEvent('UPDATE_EXPANSION_LEVEL', VisibilityPath, true)\n\n\t\thooksecurefunc('SetWatchingHonorAsXP', function()\n\t\t\tif(self:IsElementEnabled('Experience')) then\n\t\t\t\tVisibilityPath(self, 'SetWatchingHonorAsXP', 'player')\n\t\t\tend\n\t\tend)\n\n\t\tlocal child = element.Rested\n\t\tif(child) then\n\t\t\tchild:SetFrameLevel(element:GetFrameLevel() - 1)\n\n\t\t\tif(not child:GetStatusBarTexture()) then\n\t\t\t\tchild:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\t\tend\n\t\tend\n\n\t\tif(not element:GetStatusBarTexture()) then\n\t\t\telement:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\tend\n\n\t\tif(element:IsMouseEnabled()) then\n\t\t\telement.tooltipAnchor = element.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'\n\t\t\telement.inAlpha = element.inAlpha or 1\n\t\t\telement.outAlpha = element.outAlpha or 1\n\n\t\t\tif(not element:GetScript('OnEnter')) then\n\t\t\t\telement:SetScript('OnEnter', OnEnter)\n\t\t\tend\n\n\t\t\tif(not element:GetScript('OnLeave')) then\n\t\t\t\telement:SetScript('OnLeave', OnLeave)\n\t\t\tend\n\n\t\t\tif(not element:GetScript('OnMouseUp')) then\n\t\t\t\telement:SetScript('OnMouseUp', OnMouseUp)\n\t\t\tend\n\n\t\t\telement.handler = CreateFrame(\"Frame\", nil, element)\n\t\t\telement.handler:RegisterEvent(\"PLAYER_LOGIN\")\n\t\t\telement.handler:SetScript(\"OnEvent\", function() CheckAlpha(element) end)\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.Experience\n\tif(element) then\n\t\tself:UnregisterEvent('PLAYER_LEVEL_UP', VisibilityPath)\n\t\tself:UnregisterEvent('HONOR_LEVEL_UPDATE', VisibilityPath)\n\t\tself:UnregisterEvent('DISABLE_XP_GAIN', VisibilityPath)\n\t\tself:UnregisterEvent('ENABLE_XP_GAIN', VisibilityPath)\n\t\tself:UnregisterEvent('UPDATE_EXPANSION_LEVEL', VisibilityPath)\n\n\t\tElementDisable(self)\n\tend\nend\n\noUF:AddElement('Experience', VisibilityPath, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/FactionIcon.lua",
    "content": "local T, C, L = unpack(select(2, ...))\r\nif C.unitframe.enable ~= true or C.unitframe.show_arena ~= true then return end\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tBased on oUF_PVPSpecIcons\r\n----------------------------------------------------------------------------------------\r\nlocal _, ns = ...\r\nlocal oUF = ns.oUF\r\n\r\nlocal Update = function(self, event, unit)\r\n\tif event == \"ARENA_OPPONENT_UPDATE\" and unit ~= self.unit then return end\r\n\tlocal element = self.FactionIcon\r\n\r\n\tlocal _, instanceType = IsInInstance()\r\n\tif instanceType ~= \"pvp\" then\r\n\t\telement:Hide()\r\n\t\treturn\r\n\telse\r\n\t\telement:Show()\r\n\tend\r\n\r\n\tif element.PreUpdate then element:PreUpdate(event) end\r\n\r\n\tif UnitIsEnemy(self.unit, \"player\") and UnitIsPlayer(self.unit) then\r\n\t\telement:Show()\r\n\telse\r\n\t\telement:Hide()\r\n\tend\r\n\r\n\tif element.PostUpdate then element:PostUpdate(event) end\r\nend\r\n\r\nlocal Enable = function(self)\r\n\tlocal element = self.FactionIcon\r\n\tif element then\r\n\t\tself:RegisterEvent(\"ARENA_OPPONENT_UPDATE\", Update, true)\r\n\t\tself:RegisterEvent(\"PLAYER_ENTERING_WORLD\", Update, true)\r\n\r\n\t\tif UnitFactionGroup(\"player\") == \"Horde\" then\r\n\t\t\telement:SetAtlas(\"nameplates-icon-bounty-alliance\")\r\n\t\telse\r\n\t\t\telement:SetAtlas(\"nameplates-icon-bounty-horde\")\r\n\t\tend\r\n\r\n\t\treturn true\r\n\tend\r\nend\r\n\r\nlocal Disable = function(self)\r\n\tlocal element = self.FactionIcon\r\n\tif element then\r\n\t\tself:UnregisterEvent(\"ARENA_OPPONENT_UPDATE\", Update)\r\n\t\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\", Update)\r\n\t\telement:Hide()\r\n\tend\r\nend\r\n\r\noUF:AddElement(\"FactionIcon\", Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/Fader.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.plugins_fader ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_Fader(by Slakah)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal strmatch, gmatch = string.match, string.gmatch\nlocal objects, addon = {}, CreateFrame(\"Frame\")\n\n-- Events\nlocal events = setmetatable({\n\tCombat = \"PLAYER_REGEN_ENABLED:PLAYER_REGEN_DISABLED\",\n\tPlayerTarget = \"PLAYER_TARGET_CHANGED\",\n\tPlayerHostileTarget = \"PLAYER_TARGET_CHANGED\",\n\tUnitTarget = \"UNIT_TARGET\",\n\tUnitHostileTarget = \"UNIT_TARGET\",\n\tResting = \"PLAYER_UPDATE_RESTING\",\n\tFlying = \"UNIT_FLAGS\",\n\tPlayerTaxi = \"UNIT_FLAGS\",\n\tUnitTaxi = \"UNIT_FLAGS\",\n\tPlayerMaxHealth = \"UNIT_HEALTH\",\n\tUnitMaxHealth = \"UNIT_HEALTH\",\n\tPlayerMaxMana = \"UNIT_POWER_UPDATE\",\n\tUnitMaxMana = \"UNIT_POWER_UPDATE\",\n\tStealth = \"UPDATE_STEALTH\",\n\tPlayerNotMaxHealth = \"UNIT_HEALTH\",\n\tPlayerNotMaxMana = \"UNIT_POWER_UPDATE\",\n\tCasting = \"UNIT_SPELLCAST_START:UNIT_SPELLCAST_FAILED:UNIT_SPELLCAST_STOP:UNIT_SPELLCAST_INTERRUPTED:UNIT_SPELLCAST_CHANNEL_START:UNIT_SPELLCAST_CHANNEL_STOP\",\n\tArena = \"ZONE_CHANGED_NEW_AREA\",\n\tInstance = \"PLAYER_ENTERING_WORLD\",\n}, {__index = function(events, k)\n\tlocal cond = strmatch(k, \"not(.+)\")\n\tassert(rawget(events, cond), format(\"Missing event for condition %s\", k))\n\tevents[k] = events[cond]\n\treturn events[cond]\nend})\n\n-- Conditions\nlocal conditions = setmetatable({\n\tPlayerHostileTarget = function() return UnitCanAttack(\"player\", \"target\") end,\n\tUnitHostileTarget = function(_, unit) return unit and UnitCanAttack(unit, unit..\"target\") end,\n\tPlayerTarget = function() return UnitExists(\"target\") end,\n\tUnitTarget = function(_, unit) return unit and UnitExists(unit..\"target\") end,\n\tPlayerTaxi = function() return UnitOnTaxi(\"player\") end,\n\tUnitTaxi = function(_, unit) return unit and UnitOnTaxi(unit) end,\n\tUnitMaxHealth = function(_, unit) return unit and not UnitIsDeadOrGhost(unit) and UnitHealth(unit) == UnitHealthMax(unit) end,\n\tPlayerMaxHealth = function(_, unit) return unit and not UnitIsDeadOrGhost(\"player\") and UnitHealth(\"player\") == UnitHealthMax(\"player\") end,\n\tUnitMaxMana = function(_, unit) return unit and not UnitIsDeadOrGhost(unit) and UnitPower(unit) == UnitPowerMax(unit) end,\n\tPlayerMaxMana = function(_, unit) return unit and not UnitIsDeadOrGhost(\"player\") and UnitPower(\"player\") == UnitPowerMax(\"player\") end,\n\tStealth = IsStealthed,\n\tFlying = IsFlying,\n\tResting = IsResting,\n\tCombat = InCombatLockdown,\n\tPlayerNotMaxHealth = function(_, unit) return unit and UnitHealth(\"player\") ~= UnitHealthMax(\"player\") end,\n\tPlayerNotMaxMana = function(_, unit)\n\t\tlocal _, powerTypeString = UnitPowerType(\"player\")\n\t\tif powerTypeString ~= \"RAGE\" and powerTypeString ~= \"RUNIC_POWER\" then\n\t\t\treturn unit and UnitPower(\"player\") ~= UnitPowerMax(\"player\")\n\t\tend\n\tend,\n\tCasting = function(_, unit) return unit and (UnitCastingInfo(unit) or UnitChannelInfo(unit)) end,\n\tArena = function(_, unit) return unit and GetZonePVPInfo() == \"arena\" end,\n\tInstance = function(_, unit) return unit and IsInInstance() == true end,\n}, {__index = function(t, k)\n\tlocal cond = strmatch(k, \"not(.+)\")\n\tassert(rawget(t, cond), format(\"Missing condition %s\", k))\n\tt[k] = function(...)\n\t\treturn not t[cond](...)\n\tend\n\treturn t[k]\nend})\n\nfunction addon:RegisterCondition(name, func, event)\n\tassert(type(name) == \"string\", format(\"Bad argument #1 to \\\"RegisterCondition\\\" (string expected, got %s)\", type(name)))\n\tassert(type(func) == \"function\", format(\"Bad argument #2 to \\\"RegisterCondition\\\" (function expected, got %s)\", type(func)))\n\tassert(type(event) == \"string\", format(\"Bad argument #3 to \\\"RegisterCondition\\\" (string expected, got %s)\", type(event)))\n\n\tconditions[name] = func\n\tevents[name] = event\nend\n\n-- Update the Alpha or obj\nlocal function UpdateAlpha(obj)\n\tlocal alpha\n\tfor _, tbl in ipairs(obj.Fader) do\n\t\tfor cond, condalpha in pairs(tbl) do\n\t\t\tif conditions[cond](obj, obj.unit) then\n\t\t\t\talpha = not alpha and condalpha or condalpha > alpha and condalpha or alpha\n\t\t\tend\n\t\tend\n\t\tif alpha then\n\t\t\tbreak\n\t\tend\n\tend\n\n\talpha = alpha or obj.NormalAlpha\n\tif obj.Range then\n\t\tobj.inRangeAlpha = alpha\n\t\tobj.outsideRangeAlpha = alpha * obj.outsideRangeAlphaPerc\n\tend\n\n\tobj:SetAlpha(alpha)\n\tobj:SetScript(\"OnEnter\", function(self) self:SetAlpha(1) UnitFrame_OnEnter(obj) end)\n\tobj:SetScript(\"OnLeave\", function(self) self:SetAlpha(alpha) UnitFrame_OnLeave(obj) end)\nend\n\nlocal t = 0\nlocal function OnUpdate(addon, el) -- I do this because it's easier than passing events to conditions\n\tt = t + el\n\tif t > 0.1 then\n\t\tt = 0\n\t\tfor _, v in ipairs(objects) do\n\t\t\tUpdateAlpha(v)\n\t\tend\n\t\taddon:Hide()\n\tend\nend\n\noUF:RegisterInitCallback(\n\tfunction(obj)\n\t\tlocal F = obj.Fader\n\t\tif F then\n\t\t\tfor _, tbl in ipairs(F) do\n\t\t\t\tfor name in pairs(tbl) do\n\t\t\t\t\tfor event in gmatch(events[name], \"[^:]+\") do\n\t\t\t\t\t\taddon:RegisterEvent(event)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tobj.NormalAlpha = obj.NormalAlpha or obj:GetAlpha()\n\t\t\tobj.outsideRangeAlphaPerc = obj.outsideRangeAlphaPerc or obj.outsideRangeAlpha\n\t\t\tUpdateAlpha(obj)\n\t\t\tobjects[#objects + 1] = obj\n\t\tend\n\tend\n)\naddon:SetScript(\"OnEvent\", addon.Show)\naddon:SetScript(\"OnUpdate\", OnUpdate)\n\naddon.Conditions = conditions\naddon.Events = events\noUF.Fader = addon"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/GCD.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.plugins_gcd ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_GCD(by ALZA)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal starttime, duration, usingspell\nlocal GetTime = GetTime\n\nlocal function OnUpdateSpark(self)\n\tself.Spark:ClearAllPoints()\n\tlocal elapsed = GetTime() - starttime\n\tlocal perc = elapsed / duration\n\tif perc > 1 then\n\t\tself:Hide()\n\t\treturn\n\telse\n\t\tself.Spark:SetPoint(\"CENTER\", self, \"LEFT\", self.width * perc, 0)\n\tend\nend\n\nlocal function OnHide(self)\n\tself:SetScript(\"OnUpdate\", nil)\n\tusingspell = nil\nend\n\nlocal function OnShow(self)\n\tself:SetScript(\"OnUpdate\", OnUpdateSpark)\nend\n\nlocal function Update(self)\n\tlocal bar = self.GCD\n\tlocal start, dur = GetSpellCooldown(61304)\n\tif dur and dur > 0 and dur <= 2 then\n\t\tusingspell = 1\n\t\tstarttime = start\n\t\tduration = dur\n\t\tbar:Show()\n\t\treturn\n\telseif usingspell == 1 and dur == 0 then\n\t\tbar:Hide()\n\tend\nend\n\nlocal function Enable(self)\n\tlocal element = self.GCD\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\telement.width = element:GetWidth()\n\t\telement:Hide()\n\n\t\telement.Spark = element:CreateTexture(nil, \"OVERLAY\")\n\t\telement.Spark:SetTexture(C.media.blank)\n\t\telement.Spark:SetVertexColor(unpack(element.Color))\n\t\telement.Spark:SetHeight(element.Height)\n\t\telement.Spark:SetWidth(element.Width)\n\t\telement.Spark:SetBlendMode(\"ADD\")\n\n\t\telement:SetScript(\"OnShow\", OnShow)\n\t\telement:SetScript(\"OnHide\", OnHide)\n\n\t\tself:RegisterEvent(\"ACTIONBAR_UPDATE_COOLDOWN\", Update, true)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.GCD\n\tif(element) then\n\t\telement:Hide()\n\n\t\tself:UnregisterEvent(\"ACTIONBAR_UPDATE_COOLDOWN\", Update)\n\tend\nend\n\n\noUF:AddElement(\"GCD\", Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/HarmonyOrbs.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or T.class ~= \"MONK\" then return end\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal SPELL_POWER_CHI = Enum.PowerType.Chi or 12\n\nlocal function Update(self, _, unit, powerType)\n\tif(self.unit ~= unit and (powerType and (powerType ~= \"CHI\" and powerType ~= \"DARK_FORCE\"))) then return end\n\n\tlocal element = self.HarmonyBar\n\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tlocal cur = UnitPower(\"player\", SPELL_POWER_CHI)\n\tlocal max = UnitPowerMax(\"player\", SPELL_POWER_CHI)\n\tlocal spacing = select(4, element[5]:GetPoint())\n\tlocal barWidth = element:GetWidth()\n\tlocal lastBar = 0\n\n\tif element.max ~= max then\n\t\tif max == 5 then\n\t\t\telement[6]:Hide()\n\t\telse\n\t\t\telement[6]:Show()\n\t\tend\n\n\t\tfor i = 1, max do\n\t\t\tif i ~= max then\n\t\t\t\telement[i]:SetWidth(barWidth / max - spacing)\n\t\t\t\tlastBar = lastBar + (barWidth / max)\n\t\t\telse\n\t\t\t\telement[i]:SetWidth(barWidth - lastBar)\n\t\t\tend\n\t\tend\n\n\t\telement.max = max\n\tend\n\n\tfor i = 1, max do\n\t\tif i <= cur then\n\t\t\telement[i]:SetAlpha(1)\n\t\telse\n\t\t\telement[i]:SetAlpha(0.2)\n\t\tend\n\tend\n\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(cur)\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.HarmonyBar.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit, \"CHI\")\nend\n\nlocal function Visibility(self)\n\tlocal element = self.HarmonyBar\n\tlocal spec = GetSpecialization()\n\n\tif spec == SPEC_MONK_WINDWALKER then\n\t\telement:Show()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19) end\n\telse\n\t\telement:Hide()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 5) end\n\tend\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.HarmonyBar\n\tif element and unit == \"player\" then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent(\"UNIT_POWER_UPDATE\", Path)\n\t\tself:RegisterEvent(\"UNIT_DISPLAYPOWER\", Path)\n\t\tself:RegisterEvent(\"UNIT_MAXPOWER\", Path)\n\n\t\telement.handler = CreateFrame(\"Frame\", nil, element)\n\t\telement.handler:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\telement.handler:SetScript(\"OnEvent\", function() Visibility(self) end)\n\n\t\telement.maxChi = 0\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.HarmonyBar\n\tif(element) then\n\t\tself:UnregisterEvent(\"UNIT_POWER_UPDATE\", Path)\n\t\tself:UnregisterEvent(\"UNIT_DISPLAYPOWER\", Path)\n\t\tself:UnregisterEvent(\"UNIT_MAXPOWER\", Path)\n\t\telement.handler:UnregisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tend\nend\n\noUF:AddElement(\"HarmonyBar\", Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/HolyPower.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or T.class ~= \"PALADIN\" then return end\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal SPELL_POWER_HOLY_POWER = Enum.PowerType.HolyPower or 9\n\nlocal function Update(self, _, unit, powerType)\n\tif(self.unit ~= unit or (powerType and powerType ~= \"HOLY_POWER\")) then return end\n\n\tlocal element = self.HolyPower\n\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tif UnitHasVehicleUI(\"player\") then\n\t\telement:Hide()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 5) end\n\telse\n\t\telement:Show()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19) end\n\tend\n\n\tlocal cur = UnitPower(\"player\", SPELL_POWER_HOLY_POWER)\n\tlocal max = 5 -- Cause we don't use :Factory to spawn frames it return sometimes \"3\"\n\n\tfor i = 1, max do\n\t\tif(i <= cur) then\n\t\t\telement[i]:SetAlpha(1)\n\t\telse\n\t\t\telement[i]:SetAlpha(0.2)\n\t\tend\n\tend\n\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(cur)\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.HolyPower.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit, \"HOLY_POWER\")\nend\n\nlocal function Visibility(self)\n\tlocal element = self.HolyPower\n\n\tif not UnitHasVehicleUI(\"player\") then\n\t\telement:Show()\n\t\tif self.Debuffs then self.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19) end\n\tend\n\tself:RegisterEvent(\"UNIT_POWER_UPDATE\", Path)\nend\n\nlocal function Enable(self)\n\tlocal element = self.HolyPower\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\telement.handler = CreateFrame(\"Frame\", nil, element)\n\t\telement.handler:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\telement.handler:SetScript(\"OnEvent\", function() Visibility(self) end)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.HolyPower\n\tif(element) then\n\t\telement.handler:UnregisterEvent(\"PLAYER_TALENT_UPDATE\")\n\t\telement.handler:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tend\nend\n\noUF:AddElement(\"HolyPower\", Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/QuestIcon.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.nameplate.enable ~= true or C.nameplate.quests ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tShow quest icon on nameplates (based on code from ElvUI)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF or oUF\nassert(oUF, \"oUF not loaded\")\n\nlocal QuestIcon = {\n\tindexByID = {}, --[questID] = questIndex\n\tactiveQuests = {} --[questTitle] = questID\n}\n\nlocal ScanTooltip = CreateFrame(\"GameTooltip\", \"oUF_QuestIconTooltip\", UIParent, \"GameTooltipTemplate\")\nlocal ThreatTooltip = THREAT_TOOLTIP:gsub(\"%%d\", \"%%d-\")\n\nlocal function CheckTextForQuest(text)\n\tlocal x, y = strmatch(text, \"(%d+)/(%d+)\")\n\tif x and y then\n\t\treturn floor(y - x)\n\telseif not strmatch(text, ThreatTooltip) then\n\t\tlocal progress = tonumber(strmatch(text, \"([%d%.]+)%%\"))\n\t\tif progress and progress <= 100 then\n\t\t\treturn ceil(100 - progress), true\n\t\tend\n\tend\nend\n\nlocal function GetQuests(unitID)\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType == \"arena\" or instanceType == \"pvp\" or instanceType == \"raid\" or C_ChallengeMode.IsChallengeModeActive() then return end\n\n\tScanTooltip:SetOwner(_G.UIParent, \"ANCHOR_NONE\")\n\tScanTooltip:SetUnit(unitID)\n\tScanTooltip:Show()\n\n\tlocal QuestList, notMyQuest, activeID\n\tfor i = 3, ScanTooltip:NumLines() do\n\t\tlocal str = _G[\"oUF_QuestIconTooltipTextLeft\" .. i]\n\t\tlocal text = str and str:GetText()\n\t\tif not text or text == \"\" then return end\n\n\t\tif UnitIsPlayer(text) then\n\t\t\tnotMyQuest = text ~= T.name\n\t\telseif text and not notMyQuest then\n\t\t\tlocal count, percent = CheckTextForQuest(text)\n\n\t\t\t-- this line comes from one line up in the tooltip\n\t\t\tlocal activeQuest = QuestIcon.activeQuests[text]\n\t\t\tif activeQuest then activeID = activeQuest end\n\n\t\t\tif count then\n\t\t\t\tlocal type, index, texture, _\n\t\t\t\tif activeID then\n\t\t\t\t\tindex = QuestIcon.indexByID[activeID]\n\t\t\t\t\t_, texture = GetQuestLogSpecialItemInfo(index)\n\t\t\t\t\tfor i = 1, GetNumQuestLeaderBoards(index) or 0 do\n\t\t\t\t\t\tlocal text, objectiveType, finished = GetQuestObjectiveInfo(activeID, i, false)\n\t\t\t\t\t\tif text and not finished and (objectiveType == \"item\" or objectiveType == \"object\") then\n\t\t\t\t\t\t\ttype = \"LOOT_ITEM\"\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tif texture then\n\t\t\t\t\ttype = \"QUEST_ITEM\"\n\t\t\t\tend\n\n\t\t\t\tif not QuestList then QuestList = {} end\n\t\t\t\tQuestList[#QuestList + 1] = {\n\t\t\t\t\tisPercent = percent,\n\t\t\t\t\titemTexture = texture,\n\t\t\t\t\tobjectiveCount = count,\n\t\t\t\t\tquestType = type or \"DEFAULT\",\n\t\t\t\t\t-- below keys are currently unused\n\t\t\t\t\tquestLogIndex = index,\n\t\t\t\t\tquestID = activeID\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\tend\n\n\tScanTooltip:Hide()\n\treturn QuestList\nend\n\nlocal function hideIcons(element)\n\telement:Hide()\n\telement.Item:Hide()\n\telement.Text:SetText(\"\")\nend\n\nlocal function Update(self, event, arg1)\n\tlocal element = self.QuestIcon\n\tif not element then return end\n\n\tlocal unit = (event == \"UNIT_NAME_UPDATE\" and arg1) or self.unit\n\tif unit ~= self.unit then return end\n\n\tif element.PreUpdate then\n\t\telement:PreUpdate()\n\tend\n\n\thideIcons(element)\n\n\tlocal QuestList = GetQuests(unit)\n\tif not QuestList then return end\n\n\tfor i = 1, #QuestList do\n\t\tlocal quest = QuestList[i]\n\t\tlocal objectiveCount = quest.objectiveCount\n\t\tlocal questType = quest.questType\n\t\tlocal isPercent = quest.isPercent\n\n\t\tif isPercent or objectiveCount > 0 then\n\t\t\telement:Show()\n\t\t\tif element.Text and (isPercent or objectiveCount > 0) then\n\t\t\t\telement.Text:SetText(objectiveCount)\n\t\t\t\tif isPercent then\n\t\t\t\t\telement.Text:SetTextColor(0.2, 1, 1)\n\t\t\t\telse\n\t\t\t\t\telement.Text:SetTextColor(1, 0.82, 0)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif questType == \"QUEST_ITEM\" then\n\t\t\t\telement.Item:Show()\n\t\t\t\telement.Item:SetTexture(quest.itemTexture)\n\t\t\telseif questType == \"LOOT_ITEM\" then\n\t\t\t\telement.Item:Show()\n\t\t\t\telement.Item:SetTexture(133639)\n\t\t\tend\n\t\tend\n\tend\n\n\tif element:IsShown() then\n\t\tself.Level:SetAlpha(0)\n\tend\n\n\tif element.PostUpdate then\n\t\treturn element:PostUpdate()\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.QuestIcon.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit)\nend\n\nlocal function Enable(self)\n\tlocal element = self.QuestIcon\n\tif element then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tif element:IsObjectType(\"Texture\") and not element:GetAtlas() then\n\t\t\telement:SetAtlas(\"worldquest-tracker-questmarker\")\n\t\tend\n\n\t\tself:RegisterEvent(\"QUEST_LOG_UPDATE\", Path, true)\n\t\tself:RegisterEvent(\"UNIT_NAME_UPDATE\", Path, true)\n\t\tself:RegisterEvent(\"PLAYER_ENTERING_WORLD\", Path, true)\n\n\t\tSetCVar(\"showQuestTrackingTooltips\", 1)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.QuestIcon\n\tif element then\n\t\telement:Hide()\n\t\thideIcons(element)\n\n\t\tself:UnregisterEvent(\"QUEST_LOG_UPDATE\", Path)\n\t\tself:UnregisterEvent(\"UNIT_NAME_UPDATE\", Path)\n\t\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\", Path)\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"QUEST_ACCEPTED\")\nframe:RegisterEvent(\"QUEST_REMOVED\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function(self, event)\n\twipe(QuestIcon.indexByID)\n\twipe(QuestIcon.activeQuests)\n\n\tfor i = 1, C_QuestLog.GetNumQuestLogEntries() do\n\t\tlocal id = C_QuestLog.GetQuestIDForLogIndex(i)\n\t\tif id and id > 0 then\n\t\t\tQuestIcon.indexByID[id] = i\n\n\t\t\tlocal title = C_QuestLog.GetTitleForLogIndex(i)\n\t\t\tif title then QuestIcon.activeQuests[title] = id end\n\t\tend\n\tend\n\n\tif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tself:UnregisterEvent(event)\n\tend\nend)\n\noUF:AddElement(\"QuestIcon\", Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/RaidDebuffs.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.raidframe.plugins_aura_watch ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_RaidDebuffs(by Yleaf)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal bossDebuffPrio = 9999999\nlocal invalidPrio = -1\nlocal auraFilters = {\n\t[\"HARMFUL\"] = true,\n}\n\nlocal DispellColor = {\n\t[\"Magic\"]\t= {0.2, 0.6, 1},\n\t[\"Curse\"]\t= {0.6, 0, 1},\n\t[\"Disease\"]\t= {0.6, 0.4, 0},\n\t[\"Poison\"]\t= {0, 0.6, 0},\n\t[\"none\"]\t= {unpack(C.media.border_color)},\n}\n\nif C.aura.debuff_color_type == true then\n\tDispellColor.none = {1, 0, 0}\nend\n\nlocal DispellPriority = {\n\t[\"Magic\"]\t= 4,\n\t[\"Curse\"]\t= 3,\n\t[\"Disease\"]\t= 2,\n\t[\"Poison\"]\t= 1,\n}\n\nlocal DispellFilter = T.CanDispel[T.class] or {}\n\nlocal function CheckSpec()\n\tlocal spec = GetSpecialization()\n\n\tif T.class == \"DRUID\" then\n\t\tif spec == 4 then\n\t\t\tDispellFilter.Magic = true\n\t\telse\n\t\t\tDispellFilter.Magic = false\n\t\tend\n\telseif T.class == \"MONK\" then\n\t\tif spec == 2 then\n\t\t\tDispellFilter.Magic = true\n\t\telse\n\t\t\tDispellFilter.Magic = false\n\t\tend\n\telseif T.class == \"PALADIN\" then\n\t\tif spec == 1 then\n\t\t\tDispellFilter.Magic = true\n\t\telse\n\t\t\tDispellFilter.Magic = false\n\t\tend\n\telseif T.class == \"PRIEST\" then\n\t\tif spec == 3 then\n\t\t\tDispellFilter.Magic = false\n\t\telse\n\t\t\tDispellFilter.Magic = true\n\t\tend\n\telseif T.class == \"SHAMAN\" then\n\t\tif spec == 3 then\n\t\t\tDispellFilter.Magic = true\n\t\telse\n\t\t\tDispellFilter.Magic = false\n\t\tend\n\tend\nend\n\nlocal function formatTime(s)\n\tif s > 60 then\n\t\treturn format(\"%dm\", s / 60), s % 60\n\telse\n\t\treturn format(\"%d\", s), s - floor(s)\n\tend\nend\n\nlocal abs = math.abs\nlocal function OnUpdate(self, elapsed)\n\tself.elapsed = (self.elapsed or 0) + elapsed\n\tif self.elapsed >= 0.1 then\n\t\tlocal timeLeft = self.expirationTime - GetTime()\n\t\tif self.reverse then timeLeft = abs((self.expirationTime - GetTime()) - self.duration) end\n\t\tif timeLeft > 0 then\n\t\t\tlocal text = formatTime(timeLeft)\n\t\t\tself.time:SetText(text)\n\t\telse\n\t\t\tself:SetScript(\"OnUpdate\", nil)\n\t\t\tself.time:Hide()\n\t\tend\n\t\tself.elapsed = 0\n\tend\nend\n\nlocal UpdateDebuffFrame = function(rd, icon, count, debuffType, duration, expirationTime, spellId)\n\tif rd.index and rd.type and rd.filter then\n\t\tif rd.icon then\n\t\t\trd.icon:SetTexture(icon)\n\t\t\trd.icon:Show()\n\t\tend\n\n\t\tif rd.count then\n\t\t\tif count and (count > 1) then\n\t\t\t\trd.count:SetText(count)\n\t\t\t\trd.count:Show()\n\t\t\telse\n\t\t\t\trd.count:Hide()\n\t\t\tend\n\t\tend\n\n\t\tif spellId and T.RaidDebuffsReverse[spellId] then\n\t\t\trd.reverse = true\n\t\telse\n\t\t\trd.reverse = nil\n\t\tend\n\n\t\tif rd.time then\n\t\t\trd.duration = duration\n\t\t\tif duration and (duration > 0) then\n\t\t\t\trd.expirationTime = expirationTime\n\t\t\t\trd.nextUpdate = 0\n\t\t\t\trd:SetScript(\"OnUpdate\", OnUpdate)\n\t\t\t\trd.time:Show()\n\t\t\telse\n\t\t\t\trd:SetScript(\"OnUpdate\", nil)\n\t\t\t\trd.time:Hide()\n\t\t\tend\n\t\tend\n\n\t\tif rd.cd then\n\t\t\tif duration and (duration > 0) then\n\t\t\t\trd.cd:SetCooldown(expirationTime - duration, duration)\n\t\t\t\trd.cd:Show()\n\t\t\telse\n\t\t\t\trd.cd:Hide()\n\t\t\tend\n\t\tend\n\n\t\tlocal c = DispellColor[debuffType] or DispellColor.none\n\t\tif C.aura.debuff_color_type == true then\n\t\t\trd:SetBackdropBorderColor(c[1], c[2], c[3])\n\t\tend\n\n\t\tif not rd:IsShown() then\n\t\t\trd:Show()\n\t\tend\n\telse\n\t\tif rd:IsShown() then\n\t\t\trd:Hide()\n\t\tend\n\tend\nend\n\nlocal Update = function(self, _, unit)\n\tif unit ~= self.unit then return end\n\tlocal rd = self.RaidDebuffs\n\trd.priority = invalidPrio\n\tlocal _icon, _count, _debuffType, _duration, _expirationTime, _spellId\n\n\tfor filter in next, (rd.Filters or auraFilters) do\n\t\tlocal i = 0\n\t\twhile(true) do\n\t\t\ti = i + 1\n\t\t\tlocal name, icon, count, debuffType, duration, expirationTime, _, _, _, spellId, _, isBossDebuff = UnitAura(unit, i, filter)\n\t\t\tif not name then break end\n\n\t\t\tif rd.ShowBossDebuff and isBossDebuff then\n\t\t\t\tlocal prio = rd.BossDebuffPriority or bossDebuffPrio\n\t\t\t\tif prio and prio > rd.priority then\n\t\t\t\t\trd.priority = prio\n\t\t\t\t\trd.index = i\n\t\t\t\t\trd.type = \"Boss\"\n\t\t\t\t\trd.filter = filter\n\t\t\t\t\t_icon, _count, _debuffType, _duration, _expirationTime, _spellId = icon, count, debuffType, duration, expirationTime, spellId\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif rd.ShowDispellableDebuff and debuffType then\n\t\t\t\tlocal disPrio = rd.DispellPriority or DispellPriority\n\t\t\t\tlocal disFilter = rd.DispellFilter or DispellFilter\n\t\t\t\tlocal prio\n\n\t\t\t\tif rd.FilterDispellableDebuff and disFilter then\n\t\t\t\t\tprio = disFilter[debuffType] and disPrio[debuffType]\n\t\t\t\telse\n\t\t\t\t\tprio = disPrio[debuffType]\n\t\t\t\tend\n\n\t\t\t\tif prio and prio > rd.priority then\n\t\t\t\t\trd.priority = prio\n\t\t\t\t\trd.index = i\n\t\t\t\t\trd.type = \"Dispel\"\n\t\t\t\t\trd.filter = filter\n\t\t\t\t\t_icon, _count, _debuffType, _duration, _expirationTime, _spellId = icon, count, debuffType, duration, expirationTime, spellId\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal prio = T.RaidDebuffs[rd.MatchBySpellName and name or spellId]\n\t\t\tif not T.RaidDebuffsIgnore[spellId] and prio and (prio > rd.priority) then\n\t\t\t\trd.priority = prio\n\t\t\t\trd.index = i\n\t\t\t\trd.type = \"Custom\"\n\t\t\t\trd.filter = filter\n\t\t\t\t_icon, _count, _debuffType, _duration, _expirationTime, _spellId = icon, count, debuffType, duration, expirationTime, spellId\n\t\t\tend\n\t\tend\n\tend\n\n\tif rd.priority == invalidPrio then\n\t\trd.index = nil\n\t\trd.filter = nil\n\t\trd.type = nil\n\tend\n\n\treturn UpdateDebuffFrame(rd, _icon, _count, _debuffType, _duration, _expirationTime, _spellId)\nend\n\nlocal Path = function(self, ...)\n\treturn (self.RaidDebuffs.Override or Update) (self, ...)\nend\n\nlocal ForceUpdate = function(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit)\nend\n\nlocal Enable = function(self)\n\tlocal rd = self.RaidDebuffs\n\tif rd then\n\t\tself:RegisterEvent(\"UNIT_AURA\", Path)\n\t\trd.ForceUpdate = ForceUpdate\n\t\trd.__owner = self\n\t\treturn true\n\tend\n\tself:RegisterEvent(\"PLAYER_TALENT_UPDATE\", CheckSpec, true)\n\tCheckSpec()\nend\n\nlocal Disable = function(self)\n\tif self.RaidDebuffs then\n\t\tself:UnregisterEvent(\"UNIT_AURA\", Path)\n\t\tself.RaidDebuffs:Hide()\n\t\tself.RaidDebuffs.__owner = nil\n\tend\n\tself:UnregisterEvent(\"PLAYER_TALENT_UPDATE\", CheckSpec)\nend\n\noUF:AddElement(\"RaidDebuffs\", Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/Reputation.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.plugins_reputation_bar ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_Reputation(by p3lim)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF or oUF\nassert(oUF, 'oUF Reputation was unable to locate oUF install')\n\nlocal paragonStrings = {\n\tdeDE = 'Huldigend',\n\tesES = 'Baluarte',\n\tfrFR = 'Parangon',\n\titIT = 'Eccellenza',\n\tptBR = 'Parag\\195\\163o',\n\truRU = '\\208\\152\\208\\180\\208\\181\\208\\176\\208\\187',\n\tkoKR = '\\235\\182\\136\\235\\169\\184\\236\\157\\152 \\235\\143\\153\\235\\167\\185',\n\tzhCN = '\\229\\183\\133\\229\\179\\176',\n}\n\nparagonStrings.esMX = paragonStrings.esES\nparagonStrings.zhTW = paragonStrings.zhCN\n\n_G.PARAGON = paragonStrings[GetLocale()] or 'Paragon'\n\nlocal function GetReputation()\n\tlocal pendingReward, standingText\n\tlocal name, standingID, min, max, cur, factionID = GetWatchedFactionInfo()\n\n\tlocal repInfo = C_GossipInfo.GetFriendshipReputation(factionID)\n\tlocal friendshipID = repInfo and repInfo.friendshipFactionID\n\n\tif C_Reputation.IsFactionParagon(factionID) then\n\t\tlocal value, nextThreshold, _, hasRewardPending = C_Reputation.GetFactionParagonInfo(factionID)\n\t\tif(value) then\n\t\t\tcur = value % nextThreshold\n\t\t\tmin = 0\n\t\t\tmax = nextThreshold\n\t\t\tpendingReward = hasRewardPending\n\t\t\tstandingID = MAX_REPUTATION_REACTION + 1 -- force paragon's color\n\t\t\tstandingText = PARAGON\n\t\tend\n\telseif C_Reputation.IsMajorFaction(factionID) then\n\t\tlocal majorFactionData = C_MajorFactions.GetMajorFactionData(factionID)\n\t\tmin, max = 0, majorFactionData.renownLevelThreshold\n\t\tcur = C_MajorFactions.HasMaximumRenown(factionID) and majorFactionData.renownLevelThreshold or majorFactionData.renownReputationEarned or 0\n\t\tstandingID = MAX_REPUTATION_REACTION + 2\n\t\tstandingText = RENOWN_LEVEL_LABEL..majorFactionData.renownLevel\n\telseif friendshipID and friendshipID > 0 then\n\t\tlocal rankInfo = C_GossipInfo.GetFriendshipReputationRanks(factionID)\n\t\tlocal currentRank = rankInfo and rankInfo.currentLevel\n\t\tlocal maxRank = rankInfo and rankInfo.maxLevel\n\t\tlocal rankText\n\t\tif currentRank and maxRank and currentRank > 0 and maxRank > 0 then\n\t\t\trankText = (' %s / %s'):format(currentRank, maxRank)\n\t\tend\n\t\tstandingText = repInfo.reaction..rankText\n\t\tif repInfo.nextThreshold then\n\t\t\tmin, max, cur = repInfo.reactionThreshold, repInfo.nextThreshold, repInfo.standing\n\t\telse\n\t\t\tmin, max, cur = 0, 1, 1 -- force a full bar when maxed out\n\t\tend\n\t\tstandingID = 5 -- force friends' color\n\tend\n\n\tmax = max - min\n\tcur = cur - min\n\t-- cur and max are both 0 for maxed out factions\n\tif(cur == max) then\n\t\tcur, max = 1, 1\n\tend\n\tstandingText = standingText or GetText('FACTION_STANDING_LABEL' .. standingID, UnitSex('player'))\n\n\treturn cur, max, name, factionID, standingID, standingText, pendingReward\nend\n\noUF.colors.reaction[MAX_REPUTATION_REACTION + 1] = {0.64, 0.2, 0.93}\t-- paragon color\noUF.colors.reaction[MAX_REPUTATION_REACTION + 2] = {0, 0.5, 0.9}\t\t-- major faction color\n\n-- Changed tooltip for ShestakUI\nlocal function UpdateTooltip(element)\n\tlocal cur, max, name, _, standingID, standingText, pendingReward = GetReputation()\n\tlocal rewardAtlas = pendingReward and \"|A:ParagonReputation_Bag:0:0:0:0|a\" or \"\"\n\tlocal color = element.__owner.colors.reaction[standingID]\n\tif not name then element:Hide() return end\n\n\tGameTooltip:SetText(format(\"%s (%s)\", name, standingText), color[1], color[2], color[3])\n\tif(cur ~= max) then\n\t\tGameTooltip:AddLine(format(\"%s / %s (%d%%) %s\", BreakUpLargeNumbers(cur), BreakUpLargeNumbers(max), (cur) / (max) * 100, rewardAtlas), 0.75, 0.9, 1)\n\tend\n\tGameTooltip:Show()\nend\n\nlocal function OnEnter(element)\n\telement:SetAlpha(element.inAlpha)\n\tGameTooltip:SetOwner(element, \"ANCHOR_BOTTOM\", 0, -5)\t-- ShestakUI\n\telement:UpdateTooltip()\nend\n\nlocal function OnLeave(element)\n\tGameTooltip:Hide()\n\telement:SetAlpha(element.outAlpha)\nend\n\nlocal function OnMouseUp(element, btn)\n\tif btn == \"MiddleButton\" then\n\t\tif element.outAlpha == 0 then\n\t\t\telement.outAlpha = 1\n\t\t\tShestakUISettings.Reputation = true\n\t\telse\n\t\t\telement.outAlpha = 0\n\t\t\tShestakUISettings.Reputation = false\n\t\tend\n\telse\n\t\tToggleCharacter(\"ReputationFrame\")\n\tend\nend\n\nlocal function CheckAlpha(element)\n\tif ShestakUISettings and ShestakUISettings.Reputation == true then\n\t\telement.outAlpha = 1\n\t\telement:SetAlpha(element.outAlpha or 1)\n\tend\nend\n\nlocal function Update(self, event, unit)\n\tlocal element = self.Reputation\n\tif(element.PreUpdate) then element:PreUpdate(unit) end\n\n\tlocal cur, max, name, factionID, standingID, standingText, pendingReward = GetReputation()\n\tif(name) then\n\t\telement:SetMinMaxValues(0, max)\n\t\telement:SetValue(cur)\n\n\t\tif(element.colorStanding) then\n\t\t\tlocal colors = self.colors.reaction[standingID]\n\t\t\telement:SetStatusBarColor(colors[1], colors[2], colors[3])\n\t\t\telement.bg:SetVertexColor(colors[1], colors[2], colors[3], 0.2)\t-- ShestakUI\n\t\tend\n\n\t\tif(element.Reward) then\n\t\t\t-- no idea what this function actually does, but Blizzard uses it as well\n\t\t\tC_Reputation.RequestFactionParagonPreloadRewardData(factionID)\n\t\t\telement.Reward:SetShown(pendingReward)\n\t\tend\n\tend\n\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(unit, cur, max, name, factionID, standingID, standingText, pendingReward)\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.Reputation.Override or Update) (self, ...)\nend\n\nlocal function ElementEnable(self)\n\tlocal element = self.Reputation\n\tself:RegisterEvent('UPDATE_FACTION', Path, true)\n\n\telement:Show()\n\telement:SetAlpha(element.outAlpha or 1)\n\n\tPath(self, 'ElementEnable', 'player')\nend\n\nlocal function ElementDisable(self)\n\tself:UnregisterEvent('UPDATE_FACTION', Path)\n\n\tself.Reputation:Hide()\n\n\tPath(self, 'ElementDisable', 'player')\nend\n\nlocal function Visibility(self, event, unit, selectedFactionIndex)\n\tlocal shouldEnable\n\tif(selectedFactionIndex ~= nil) then\n\t\tif(selectedFactionIndex > 0) then\n\t\t\tshouldEnable = true\n\t\tend\n\telseif(not not (GetWatchedFactionInfo())) then\n\t\tshouldEnable = true\n\tend\n\n\tif(shouldEnable) then\n\t\tElementEnable(self)\n\telse\n\t\tElementDisable(self)\n\tend\nend\n\nlocal function VisibilityPath(self, ...)\n\treturn (self.Reputation.OverrideVisibility or Visibility)(self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.Reputation\n\tif(element) then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\thooksecurefunc('SetWatchedFactionIndex', function(selectedFactionIndex)\n\t\t\tif(self:IsElementEnabled('Reputation')) then\n\t\t\t\tVisibilityPath(self, 'SetWatchedFactionIndex', 'player', selectedFactionIndex or 0)\n\t\t\tend\n\t\tend)\n\n\t\tif(not element:GetStatusBarTexture()) then\n\t\t\telement:SetStatusBarTexture([[Interface\\TargetingFrame\\UI-StatusBar]])\n\t\tend\n\n\t\tif(element.Reward and element.Reward:IsObjectType('Texture') and not element.Reward:GetTexture()) then\n\t\t\telement.Reward:SetAtlas('ParagonReputation_Bag')\n\t\tend\n\n\t\tif(element:IsMouseEnabled()) then\n\t\t\telement.UpdateTooltip = element.UpdateTooltip or UpdateTooltip\n\t\t\telement.tooltipAnchor = element.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'\n\t\t\telement.inAlpha = element.inAlpha or 1\n\t\t\telement.outAlpha = element.outAlpha or 1\n\n\t\t\tif(not element:GetScript('OnEnter')) then\n\t\t\t\telement:SetScript('OnEnter', OnEnter)\n\t\t\tend\n\n\t\t\tif(not element:GetScript('OnLeave')) then\n\t\t\t\telement:SetScript('OnLeave', OnLeave)\n\t\t\tend\n\n\t\t\tif(not element:GetScript('OnMouseUp')) then\n\t\t\t\telement:SetScript('OnMouseUp', OnMouseUp)\n\t\t\tend\n\n\t\t\telement.handler = CreateFrame(\"Frame\", nil, element)\n\t\t\telement.handler:RegisterEvent(\"PLAYER_LOGIN\")\n\t\t\telement.handler:SetScript(\"OnEvent\", function() CheckAlpha(element) end)\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tif(self.Reputation) then\n\t\tElementDisable(self)\n\tend\nend\n\noUF:AddElement('Reputation', VisibilityPath, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/Smooth.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.plugins_smooth_bar ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_Smooth(by Xuerian)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal smoothing = {}\nlocal function Smooth(self, value)\n\tif value ~= self:GetValue() or value == 0 then\n\t\tsmoothing[self] = value\n\telse\n\t\tsmoothing[self] = nil\n\tend\nend\n\nlocal function SmoothBar(_, bar)\n\tbar.SetValue_ = bar.SetValue\n\tbar.SetValue = Smooth\nend\n\nlocal function hook(frame)\n\tframe.SmoothBar = SmoothBar\n\tif frame.Health and frame.Health.Smooth then\n\t\tframe:SmoothBar(frame.Health)\n\tend\n\tif frame.Power and frame.Power.Smooth then\n\t\tframe:SmoothBar(frame.Power)\n\tend\nend\n\nfor _, frame in ipairs(oUF.objects) do hook(frame) end\noUF:RegisterInitCallback(hook)\n\nlocal f, min, max = CreateFrame(\"Frame\"), math.min, math.max\nf:SetScript(\"OnUpdate\", function()\n\tlocal rate = GetFramerate()\n\tlocal limit = 30 / rate\n\tfor bar, value in pairs(smoothing) do\n\t\tlocal cur = bar:GetValue()\n\t\tlocal new = cur + min((value - cur) / 3, max(value - cur, limit))\n\t\tif new ~= new then\n\t\t\t-- Mad hax to prevent QNAN.\n\t\t\tnew = value\n\t\tend\n\t\tbar:SetValue_(new)\n\t\tif cur == value or abs(new - value) < 2 then\n\t\t\tbar:SetValue_(value)\n\t\t\tsmoothing[bar] = nil\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/SoulShards.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or T.class ~= \"WARLOCK\" then return end\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal SPELL_POWER_SOUL_SHARDS = Enum.PowerType.SoulShards or 7\n\nlocal function Update(self, _, unit, powerType)\n\tif(self.unit ~= unit or (powerType and powerType ~= \"SOUL_SHARDS\")) then return end\n\n\tlocal element = self.SoulShards\n\n\tif(element.PreUpdate) then\n\t\telement:PreUpdate(unit)\n\tend\n\n\tlocal cur = UnitPower(\"player\", SPELL_POWER_SOUL_SHARDS)\n\tlocal max = UnitPowerMax(\"player\", SPELL_POWER_SOUL_SHARDS)\n\n\tfor i = 1, max do\n\t\tif i <= cur then\n\t\t\telement[i]:SetAlpha(1)\n\t\telse\n\t\t\telement[i]:SetAlpha(0.2)\n\t\tend\n\tend\n\n\tif(element.PostUpdate) then\n\t\treturn element:PostUpdate(cur)\n\tend\nend\n\nlocal function Path(self, ...)\n\treturn (self.SoulShards.Override or Update) (self, ...)\nend\n\nlocal function ForceUpdate(element)\n\treturn Path(element.__owner, \"ForceUpdate\", element.__owner.unit, \"SOUL_SHARDS\")\nend\n\nlocal function Enable(self, unit)\n\tlocal element = self.SoulShards\n\tif(element) and unit == \"player\" then\n\t\telement.__owner = self\n\t\telement.ForceUpdate = ForceUpdate\n\n\t\tself:RegisterEvent(\"UNIT_POWER_UPDATE\", Path)\n\t\tself:RegisterEvent(\"UNIT_DISPLAYPOWER\", Path)\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.SoulShards\n\tif(element) then\n\t\tself:UnregisterEvent(\"UNIT_POWER_UPDATE\", Path)\n\t\tself:UnregisterEvent(\"UNIT_DISPLAYPOWER\", Path)\n\tend\nend\n\noUF:AddElement(\"SoulShards\", Path, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/Swing.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.plugins_swing ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_Swing(by p3lim and Thalyra)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal function OnDurationUpdate(self)\n\tself:SetMinMaxValues(self.min, self.max)\n\n\tlocal swingelapsed = GetTime()\n\tif swingelapsed > self.max then\n\t\tself:Hide()\n\t\tself:SetScript(\"OnUpdate\", nil)\n\telse\n\t\tself:SetValue(self.min + (swingelapsed - self.min))\n\n\t\tif self.Text then\n\t\t\tif self.OverrideText then\n\t\t\t\tself:OverrideText(swingelapsed)\n\t\t\telse\n\t\t\t\tself.Text:SetFormattedText(\"%.1f\", self.max - swingelapsed)\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function Melee(self)\n\tlocal _, event, _, GUID, _, _, _, tarGUID, _, _, _, missType = CombatLogGetCurrentEventInfo()\n\tlocal bar = self.Swing\n\n\tif UnitGUID(self.unit) == tarGUID then\n\t\tif string.find(event, \"MISSED\") then\n\t\t\tif missType == \"PARRY\" and bar.max then\n\t\t\t\tbar.max = bar.min + ((bar.max - bar.min) * 0.6)\n\t\t\t\tbar:SetMinMaxValues(bar.min, bar.max)\n\t\t\tend\n\t\tend\n\telseif UnitGUID(self.unit) == GUID then\n\t\tif not string.find(event, \"SWING\") then return end\n\n\t\tbar.min = GetTime()\n\t\tbar.max = bar.min + UnitAttackSpeed(self.unit)\n\t\tlocal itemId = GetInventoryItemID(\"player\", 17)\n\n\t\tif itemId ~= nil then\n\t\t\tlocal _, _, _, _, _, itemType = GetItemInfo(itemId)\n\t\t\tlocal _, _, _, _, _, weaponType = GetItemInfo(25)\n\t\t\tif itemType ~= weaponType then -- Worn Shortsword, little \"hack\" for language support\n\t\t\t\tbar:Show()\n\t\t\t\tbar:SetMinMaxValues(bar.min, bar.max)\n\t\t\t\tbar:SetScript(\"OnUpdate\", OnDurationUpdate)\n\t\t\telse\n\t\t\t\tbar:Hide()\n\t\t\t\tbar:SetScript(\"OnUpdate\", nil)\n\t\t\tend\n\t\telse\n\t\t\tbar:Show()\n\t\t\tbar:SetMinMaxValues(bar.min, bar.max)\n\t\t\tbar:SetScript(\"OnUpdate\", OnDurationUpdate)\n\t\tend\n\tend\nend\n\nlocal function Ranged(self, _, unit, _, spellID)\n\tif spellID ~= 75 and spellID ~= 5019 then return end\n\n\tlocal bar = self.Swing\n\tbar.min = GetTime()\n\tbar.max = bar.min + UnitRangedDamage(unit)\n\n\tbar:Show()\n\tbar:SetMinMaxValues(bar.min, bar.max)\n\tbar:SetScript(\"OnUpdate\", OnDurationUpdate)\nend\n\nlocal function Ooc(self)\n\tlocal bar = self.Swing\n\tbar:Hide()\nend\n\nlocal function Enable(self, unit)\n\tlocal bar = self.Swing\n\tif bar and unit == \"player\" then\n\n\t\tif not bar.disableRanged then\n\t\t\tself:RegisterEvent(\"UNIT_SPELLCAST_SUCCEEDED\", Ranged)\n\t\tend\n\n\t\tif not bar.disableMelee then\n\t\t\tself:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\", Melee, true)\n\t\tend\n\n\t\tif not bar.disableOoc then\n\t\t\tself:RegisterEvent(\"PLAYER_REGEN_ENABLED\", Ooc, true)\n\t\tend\n\n\t\tbar:Hide()\n\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal bar = self.Swing\n\tif bar then\n\t\tif not bar.disableRanged then\n\t\t\tself:UnregisterEvent(\"UNIT_SPELLCAST_SUCCEEDED\", Ranged)\n\t\tend\n\n\t\tif not bar.disableMelee then\n\t\t\tself:UnregisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\", Melee)\n\t\tend\n\n\t\tif not bar.disableOoc then\n\t\t\tself:UnregisterEvent(\"PLAYER_REGEN_ENABLED\", Ooc)\n\t\tend\n\tend\nend\n\noUF:AddElement(\"Swing\", nil, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/TotemBar.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe_class_bar.totem ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_TotemBar(by Soeters)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\n-- In the order, fire, earth, water, air\nlocal colors = {\n\t[1] = {0.58, 0.23, 0.10},\n\t[2] = {0.23, 0.45, 0.13},\n\t[3] = {0.19, 0.48, 0.60},\n\t[4] = {0.42, 0.18, 0.74},\n}\n\nlocal function onUpdate(self, elapsed)\n\tself.elapsed = (self.elapsed or 0) + elapsed\n\tif self.elapsed < 0.1 then return end\n\tself.elapsed = 0\n\tlocal time = self.finish - GetTime()\n\tself:SetValue(time)\nend\n\nlocal function UpdateSlot(self, slot)\n\tlocal element = self.TotemBar\n\tif not element[slot] then return end\n\n\tlocal totem = element[slot]\n\tlocal haveTotem, _, startTime, duration = GetTotemInfo(slot)\n\n\ttotem:SetStatusBarColor(unpack(element.colors[slot]))\n\n\t-- Multipliers\n\tif totem.bg.multiplier then\n\t\tlocal mu = totem.bg.multiplier\n\t\tlocal r, g, b = totem:GetStatusBarColor()\n\t\tr, g, b = r * mu, g * mu, b * mu\n\t\ttotem.bg:SetVertexColor(r, g, b)\n\tend\n\n\tif haveTotem and duration > 0 then\n\t\ttotem.finish = startTime + duration\n\t\ttotem:SetMinMaxValues(0, duration)\n\t\ttotem:SetValue(duration)\n\t\ttotem:SetScript('OnUpdate', onUpdate)\n\n\t\tif T.class ~= \"SHAMAN\" then\n\t\t\ttotem:Show()\n\t\tend\n\telse\n\t\ttotem:SetValue(0)\n\t\ttotem:SetScript(\"OnUpdate\", nil)\n\t\tif T.class ~= \"SHAMAN\" then\n\t\t\ttotem:Hide()\n\t\tend\n\tend\nend\n\nlocal function Update(self)\n\t-- Update every slot on login, still have issues with it\n\tfor i = 1, MAX_TOTEMS do\n\t\tUpdateSlot(self, i)\n\tend\nend\n\nlocal function Event(self, event, ...)\n\tif event == \"PLAYER_TOTEM_UPDATE\" then\n\t\tUpdateSlot(self, ...)\n\tend\nend\n\nlocal function anchorTotems(element)\n\tfor t in next, _G.TotemFrame.totemPool.activeObjects do\n\t\tlocal i = t.slot\n\t\tt:ClearAllPoints()\n\t\tt:SetParent(element[i])\n\t\tt:SetAllPoints(element[i])\n\t\tt:SetFrameLevel(element[i]:GetFrameLevel() + 1)\n\t\tt:SetFrameStrata(element[i]:GetFrameStrata())\n\t\tt:SetAlpha(0)\n\t\tt.Icon:Hide()\n\tend\nend\n\nlocal function Enable(self)\n\tlocal element = self.TotemBar\n\tif element then\n\t\tself:RegisterEvent(\"PLAYER_TOTEM_UPDATE\", Event, true)\n\t\telement.colors = setmetatable(element.colors or {}, {__index = colors})\n\t\tif element.Destroy then\n\t\t\tanchorTotems(element)\n\t\t\thooksecurefunc(TotemFrame, \"Update\", function()\n\t\t\t\tanchorTotems(element)\n\t\t\tend)\n\t\tend\n\t\treturn true\n\tend\nend\n\nlocal function Disable(self)\n\tlocal element = self.TotemBar\n\tif element then\n\t\tself:UnregisterEvent(\"PLAYER_TOTEM_UPDATE\", Event)\n\t\tTotemFrame:Show()\n\tend\nend\n\noUF:AddElement(\"TotemBar\", Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Modules/Trinkets.lua",
    "content": "local T, C, L = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.show_arena ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oUF_Trinkets(by Allez, editor Tukz)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF or oUF\nassert(oUF, 'oUF not loaded')\n\nlocal Update = function(self, event, ...)\n\tlocal _, instanceType = IsInInstance()\n\n\tif instanceType ~= 'arena' then\n\t\tself.Trinket.Icon:SetTexture(\"Interface\\\\Icons\\\\Ability_pvp_gladiatormedallion\")\n\t\tself.Trinket:Hide()\n\n\t\treturn\n\telse\n\t\tself.Trinket:Show()\n\tend\n\n\tif(self.Trinket.PreUpdate) then self.Trinket:PreUpdate(event, ...) end\n\n\tif event == \"ARENA_COOLDOWNS_UPDATE\" then\n\t\tlocal unit = ...\n\n\t\tif self.unit == unit then\n\t\t\tC_PvP.RequestCrowdControlSpell(unit)\n\n\t\t\tlocal spellID, startTime, duration = C_PvP.GetArenaCrowdControlInfo(unit)\n\n\t\t\tif spellID and startTime ~= 0 and duration ~= 0 then\n\t\t\t\tCooldownFrame_Set(self.Trinket.cooldownFrame, startTime / 1000, duration / 1000, 1)\n\t\t\tend\n\t\tend\n\telseif event == \"ARENA_CROWD_CONTROL_SPELL_UPDATE\" then\n\t\tlocal unit, spellID = ...\n\n\t\tif self.unit == unit then\n\t\t\tlocal _, _, spellTexture = GetSpellInfo(spellID)\n\n\t\t\tself.Trinket.Icon:SetTexture(spellTexture)\n\t\tend\n\telseif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tCooldownFrame_Set(self.Trinket.cooldownFrame, 1, 1, 1)\n\tend\n\n\tif(self.Trinket.PostUpdate) then self.Trinket:PostUpdate(event, ...) end\nend\n\nlocal Enable = function(self)\n\tif self.Trinket then\n\t\tself:RegisterEvent(\"ARENA_COOLDOWNS_UPDATE\", Update, true)\n\t\tself:RegisterEvent(\"ARENA_CROWD_CONTROL_SPELL_UPDATE\", Update, true)\n\t\tself:RegisterEvent(\"PLAYER_ENTERING_WORLD\", Update, true)\n\n\t\tif not self.Trinket.cooldownFrame then\n\t\t\tself.Trinket.cooldownFrame = CreateFrame(\"Cooldown\", nil, self.Trinket, \"CooldownFrameTemplate\")\n\t\t\tself.Trinket.cooldownFrame:SetPoint(\"TOPLEFT\", self.Trinket, 2, -2)\n\t\t\tself.Trinket.cooldownFrame:SetPoint(\"BOTTOMRIGHT\", self.Trinket, -2, 2)\n\t\tend\n\n\t\tif not self.Trinket.Icon then\n\t\t\tself.Trinket.Icon = self.Trinket:CreateTexture(nil, \"BORDER\")\n\t\t\tself.Trinket.Icon:SetPoint(\"TOPLEFT\", self.Trinket, 2, -2)\n\t\t\tself.Trinket.Icon:SetPoint(\"BOTTOMRIGHT\", self.Trinket, -2, 2)\n\t\t\tself.Trinket.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tself.Trinket.Icon:SetTexture(\"Interface\\\\Icons\\\\Ability_pvp_gladiatormedallion\")\n\t\tend\n\n\t\treturn true\n\tend\nend\n\nlocal Disable = function(self)\n\tif self.Trinket then\n\t\tself:UnregisterEvent(\"ARENA_COOLDOWNS_UPDATE\", Update)\n\t\tself:UnregisterEvent(\"ARENA_CROWD_CONTROL_SPELL_UPDATE\", Update)\n\t\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\", Update)\n\t\tself.Trinket:Hide()\n\tend\nend\n\noUF:AddElement('Trinket', Update, Enable, Disable)"
  },
  {
    "path": "ShestakUI/Libs/oUF/Private.lua",
    "content": "local _, ns = ...\nlocal Private = ns.oUF.Private\n\nfunction Private.argcheck(value, num, ...)\n\tassert(type(num) == 'number', \"Bad argument #2 to 'argcheck' (number expected, got \" .. type(num) .. ')')\n\n\tfor i = 1, select('#', ...) do\n\t\tif(type(value) == select(i, ...)) then return end\n\tend\n\n\tlocal types = string.join(', ', ...)\n\tlocal name = debugstack(2,2,0):match(\": in function [`<](.-)['>]\")\n\terror(string.format(\"Bad argument #%d to '%s' (%s expected, got %s)\", num, name, types, type(value)), 3)\nend\n\nfunction Private.print(...)\n\tprint('|cff33ff99oUF:|r', ...)\nend\n\nfunction Private.error(...)\n\tPrivate.print('|cffff0000Error:|r ' .. string.format(...))\nend\n\nfunction Private.nierror(...)\n\treturn geterrorhandler()(...)\nend\n\nfunction Private.unitExists(unit)\n\treturn unit and (UnitExists(unit) or ShowBossFrameWhenUninteractable(unit))\nend\n\nlocal validator = CreateFrame('Frame')\n\nfunction Private.validateUnit(unit)\n\tlocal isOK, _ = pcall(validator.RegisterUnitEvent, validator, 'UNIT_HEALTH', unit)\n\tif(isOK) then\n\t\t_, unit = validator:IsEventRegistered('UNIT_HEALTH')\n\t\tvalidator:UnregisterEvent('UNIT_HEALTH')\n\n\t\treturn not not unit\n\tend\nend\n\nlocal selectionTypes = {\n\t[ 0] = 0,\n\t[ 1] = 1,\n\t[ 2] = 2,\n\t[ 3] = 3,\n\t[ 4] = 4,\n\t[ 5] = 5,\n\t[ 6] = 6,\n\t[ 7] = 7,\n\t[ 8] = 8,\n\t[ 9] = 9,\n\t-- [10] = 10, -- unavailable to players\n\t-- [11] = 11, -- unavailable to players\n\t-- [12] = 12, -- inconsistent due to bugs and its reliance on cvars\n\t[13] = 13,\n}\n\nfunction Private.unitSelectionType(unit, considerHostile)\n\tif(considerHostile and UnitThreatSituation('player', unit)) then\n\t\treturn 0\n\telse\n\t\treturn selectionTypes[UnitSelectionType(unit, true)]\n\tend\nend\n\nfunction Private.xpcall(func, ...)\n\treturn xpcall(func, Private.nierror, ...)\nend\n\nfunction Private.validateEvent(event)\n\tlocal isOK = xpcall(validator.RegisterEvent, Private.nierror, validator, event)\n\tif(isOK) then\n\t\tvalidator:UnregisterEvent(event)\n\tend\n\n\treturn isOK\nend\n\nfunction Private.isUnitEvent(event, unit)\n\tlocal isOK = pcall(validator.RegisterUnitEvent, validator, event, unit)\n\tif(isOK) then\n\t\tvalidator:UnregisterEvent(event)\n\tend\n\n\treturn isOK\nend\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/Units.lua",
    "content": "local _, ns = ...\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal unitExists = Private.unitExists\n\nlocal function updateArenaPreparationElements(self, event, elementName, specID)\n\tlocal element = self[elementName]\n\tif(element and self:IsElementEnabled(elementName)) then\n\t\tif(element.OverrideArenaPreparation) then\n\t\t\t--[[ Override: Health.OverrideArenaPreparation(self, event, specID)\n\t\t\tUsed to completely override the internal update function for arena preparation.\n\n\t\t\t* self   - the parent object\n\t\t\t* event  - the event triggering the update (string)\n\t\t\t* specID - the specialization ID for the opponent (number)\n\t\t\t--]]\n\t\t\t--[[ Override: Power.OverrideArenaPreparation(self, event, specID)\n\t\t\tUsed to completely override the internal update function for arena preparation.\n\n\t\t\t* self   - the parent object\n\t\t\t* event  - the event triggering the update (string)\n\t\t\t* specID - the specialization ID for the opponent (number)\n\t\t\t--]]\n\t\t\telement.OverrideArenaPreparation(self, event, specID)\n\t\t\treturn\n\t\tend\n\n\t\telement:SetMinMaxValues(0, 1)\n\t\telement:SetValue(1)\n\t\tif(element.UpdateColorArenaPreparation) then\n\t\t\t--[[ Override: Health:UpdateColor(specID)\n\t\t\tUsed to completely override the internal function for updating the widget's colors\n\t\t\tduring arena preparation.\n\n\t\t\t* self   - the Health element\n\t\t\t* specID - the specialization ID for the opponent (number)\n\t\t\t--]]\n\t\t\t--[[ Override: Power:UpdateColor(specID)\n\t\t\tUsed to completely override the internal function for updating the widget's colors\n\t\t\tduring arena preparation.\n\n\t\t\t* self   - the Power element\n\t\t\t* specID - the specialization ID for the opponent (number)\n\t\t\t--]]\n\t\t\telement:UpdateColorArenaPreparation(specID)\n\t\telse\n\t\t\t-- this section just replicates the color options available to the Health and Power elements\n\t\t\tlocal r, g, b, color, _\n\t\t\t-- if(element.colorPower and elementName == 'Power') then\n\t\t\t\t-- FIXME: no idea if we can get power type here without the unit\n\t\t\tif(element.colorClass) then\n\t\t\t\tlocal _, _, _, _, _, class = GetSpecializationInfoByID(specID)\n\t\t\t\tcolor = self.colors.class[class]\n\t\t\telseif(element.colorReaction) then\n\t\t\t\tcolor = self.colors.reaction[2]\n\t\t\telseif(element.colorSmooth) then\n\t\t\t\t_, _, _, _, _, _, r, g, b = unpack(element.smoothGradient or self.colors.smooth)\n\t\t\telseif(element.colorHealth and elementName == 'Health') then\n\t\t\t\tcolor = self.colors.health\n\t\t\tend\n\n\t\t\tif(color) then\n\t\t\t\tr, g, b = color[1], color[2], color[3]\n\t\t\tend\n\n\t\t\tif(r or g or b) then\n\t\t\t\telement:SetStatusBarColor(r, g, b)\n\n\t\t\t\tlocal bg = element.bg\n\t\t\t\tif(bg) then\n\t\t\t\t\tlocal mu = bg.multiplier or 1\n\t\t\t\t\tbg:SetVertexColor(r * mu, g * mu, b * mu)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif(element.PostUpdateArenaPreparation) then\n\t\t\t--[[ Callback: Health:PostUpdateArenaPreparation(event, specID)\n\t\t\tCalled after the element has been updated during arena preparation.\n\n\t\t\t* self   - the Health element\n\t\t\t* event  - the event triggering the update (string)\n\t\t\t* specID - the specialization ID for the opponent (number)\n\t\t\t--]]\n\t\t\t--[[ Callback: Power:PostUpdateArenaPreparation(event, specID)\n\t\t\tCalled after the element has been updated during arena preparation.\n\n\t\t\t* self   - the Power element\n\t\t\t* event  - the event triggering the update (string)\n\t\t\t* specID - the specialization ID for the opponent (number)\n\t\t\t--]]\n\t\t\telement:PostUpdateArenaPreparation(event, specID)\n\t\tend\n\tend\nend\n\nlocal function updateArenaPreparation(self, event)\n\tif(not self:GetAttribute('oUF-enableArenaPrep')) then\n\t\treturn\n\tend\n\n\tif(event == 'ARENA_OPPONENT_UPDATE' and not self:IsEnabled()) then\n\t\tself:Enable()\n\t\tself:UpdateAllElements('ArenaPreparation')\n\t\tself:UnregisterEvent(event, updateArenaPreparation)\n\n\t\t-- show elements that don't handle their own visibility\n\t\tif(self:IsElementEnabled('Auras')) then\n\t\t\tif(self.Auras) then self.Auras:Show() end\n\t\t\tif(self.Buffs) then self.Buffs:Show() end\n\t\t\tif(self.Debuffs) then self.Debuffs:Show() end\n\t\tend\n\n\t\tif(self.Portrait and self:IsElementEnabled('Portrait')) then\n\t\t\tself.Portrait:Show()\n\t\tend\n\telseif(event == 'PLAYER_ENTERING_WORLD' and not UnitExists(self.unit)) then\n\t\t-- semi-recursive call for when the player zones into an arena\n\t\tupdateArenaPreparation(self, 'ARENA_PREP_OPPONENT_SPECIALIZATIONS')\n\telseif(event == 'ARENA_PREP_OPPONENT_SPECIALIZATIONS') then\n\t\tif(InCombatLockdown()) then\n\t\t\t-- prevent calling protected functions if entering arena while in combat\n\t\t\tself:RegisterEvent('PLAYER_REGEN_ENABLED', updateArenaPreparation, true)\n\t\t\treturn\n\t\tend\n\n\t\tif(self.PreUpdate) then\n\t\t\tself:PreUpdate(event)\n\t\tend\n\n\t\tlocal id = tonumber(self.id)\n\t\tif(not self:IsEnabled() and GetNumArenaOpponentSpecs() < id) then\n\t\t\t-- hide the object if the opponent leaves\n\t\t\tself:Hide()\n\t\tend\n\n\t\tlocal specID = GetArenaOpponentSpec(id)\n\t\tif(specID) then\n\t\t\tif(self:IsEnabled()) then\n\t\t\t\t-- disable the unit watch so we can forcefully show the object ourselves\n\t\t\t\tself:Disable()\n\t\t\t\tself:RegisterEvent('ARENA_OPPONENT_UPDATE', updateArenaPreparation)\n\t\t\tend\n\n\t\t\t-- update Health and Power (if available) with \"fake\" data\n\t\t\tupdateArenaPreparationElements(self, event, 'Health', specID)\n\t\t\tupdateArenaPreparationElements(self, event, 'Power', specID)\n\n\t\t\t-- hide all other (relevant) elements (they have no effect during arena prep)\n\t\t\tif(self.Auras) then self.Auras:Hide() end\n\t\t\tif(self.Buffs) then self.Buffs:Hide() end\n\t\t\tif(self.Debuffs) then self.Debuffs:Hide() end\n\t\t\tif(self.Castbar) then self.Castbar:Hide() end\n\t\t\tif(self.CombatIndicator) then self.CombatIndicator:Hide() end\n\t\t\tif(self.GroupRoleIndicator) then self.GroupRoleIndicator:Hide() end\n\t\t\tif(self.Portrait) then self.Portrait:Hide() end\n\t\t\tif(self.PvPIndicator) then self.PvPIndicator:Hide() end\n\t\t\tif(self.RaidTargetIndicator) then self.RaidTargetIndicator:Hide() end\n\n\t\t\tself:Show()\n\t\t\tself:UpdateTags()\n\t\tend\n\n\t\tif(self.PostUpdate) then\n\t\t\tself:PostUpdate(event)\n\t\tend\n\telseif(event == 'PLAYER_REGEN_ENABLED') then\n\t\tself:UnregisterEvent(event, updateArenaPreparation)\n\t\tupdateArenaPreparation(self, 'ARENA_PREP_OPPONENT_SPECIALIZATIONS')\n\tend\nend\n\n-- Handles unit specific actions.\nfunction oUF:HandleUnit(object, unit)\n\tunit = object.unit or unit\n\tif(unit == 'target') then\n\t\tobject:RegisterEvent('PLAYER_TARGET_CHANGED', object.UpdateAllElements, true)\n\telseif(unit == 'mouseover') then\n\t\tobject:RegisterEvent('UPDATE_MOUSEOVER_UNIT', object.UpdateAllElements, true)\n\telseif(unit == 'focus') then\n\t\tobject:RegisterEvent('PLAYER_FOCUS_CHANGED', object.UpdateAllElements, true)\n\telseif(unit:match('boss%d?$')) then\n\t\tobject:RegisterEvent('INSTANCE_ENCOUNTER_ENGAGE_UNIT', object.UpdateAllElements, true)\n\t\tobject:RegisterEvent('UNIT_TARGETABLE_CHANGED', object.UpdateAllElements)\n\telseif(unit:match('arena%d?$')) then\n\t\tobject:RegisterEvent('ARENA_OPPONENT_UPDATE', object.UpdateAllElements, true)\n\t\tobject:RegisterEvent('ARENA_PREP_OPPONENT_SPECIALIZATIONS', updateArenaPreparation, true)\n\t\tobject:SetAttribute('oUF-enableArenaPrep', true)\n\t\t-- the event handler only fires for visible frames, so we have to hook it for arena prep\n\t\tobject:HookScript('OnEvent', updateArenaPreparation)\n\tend\nend\n\nlocal eventlessObjects = {}\nlocal onUpdates = {}\n\nlocal function createOnUpdate(timer)\n\tif(not onUpdates[timer]) then\n\t\tlocal frame = CreateFrame('Frame')\n\t\tlocal objects = eventlessObjects[timer]\n\n\t\tframe:SetScript('OnUpdate', function(self, elapsed)\n\t\t\tself.elapsed = (self.elapsed or 0) + elapsed\n\t\t\tif(self.elapsed > timer) then\n\t\t\t\tfor _, object in next, objects do\n\t\t\t\t\tif(object.unit and unitExists(object.unit)) then\n\t\t\t\t\t\tobject:UpdateAllElements('OnUpdate')\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tself.elapsed = 0\n\t\t\tend\n\t\tend)\n\n\t\tonUpdates[timer] = frame\n\tend\nend\n\nfunction oUF:HandleEventlessUnit(object)\n\tobject.__eventless = true\n\n\t-- It's impossible to set onUpdateFrequency before the frame is created, so\n\t-- by default all eventless frames are created with the 0.5s timer.\n\t-- To change it you'll need to call oUF:HandleEventlessUnit(frame) one more\n\t-- time from the layout code after oUF:Spawn(unit) returns the frame.\n\tlocal timer = object.onUpdateFrequency or 0.5\n\n\t-- Remove it, in case it's already registered with any timer\n\tfor _, objects in next, eventlessObjects do\n\t\tfor i, obj in next, objects do\n\t\t\tif(obj == object) then\n\t\t\t\ttable.remove(objects, i)\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\n\n\tif(not eventlessObjects[timer]) then eventlessObjects[timer] = {} end\n\ttable.insert(eventlessObjects[timer], object)\n\n\tcreateOnUpdate(timer)\nend\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/oUF.lua",
    "content": "local parent, ns = ...\nlocal global = GetAddOnMetadata(parent, 'X-oUF')\nlocal _VERSION = '@project-version@'\nif(_VERSION:find('project%-version')) then\n\t_VERSION = 'devel'\nend\n\nlocal oUF = ns.oUF\nlocal Private = oUF.Private\n\nlocal argcheck = Private.argcheck\nlocal error = Private.error\nlocal print = Private.print --luacheck: no unused\nlocal unitExists = Private.unitExists\n\nlocal styles, style = {}\nlocal callback, objects, headers = {}, {}, {}\n\nlocal elements = {}\nlocal activeElements = {}\n\nlocal PetBattleFrameHider = CreateFrame('Frame', (global or parent) .. '_PetBattleFrameHider', UIParent, 'SecureHandlerStateTemplate')\nPetBattleFrameHider:SetAllPoints()\nPetBattleFrameHider:SetFrameStrata('LOW')\nRegisterStateDriver(PetBattleFrameHider, 'visibility', '[petbattle] hide; show')\n\nlocal function updateActiveUnit(self, event)\n\t-- Calculate units to work with\n\tlocal realUnit, modUnit = SecureButton_GetUnit(self), SecureButton_GetModifiedUnit(self)\n\n\t-- _GetUnit() doesn't rewrite playerpet -> pet like _GetModifiedUnit does.\n\tif(realUnit == 'playerpet') then\n\t\trealUnit = 'pet'\n\telseif(realUnit == 'playertarget') then\n\t\trealUnit = 'target'\n\tend\n\n\tif(modUnit == 'pet' and realUnit ~= 'pet') then\n\t\tmodUnit = 'vehicle'\n\tend\n\n\tif(not unitExists(modUnit)) then return end\n\n\t-- Change the active unit and run a full update.\n\tif(Private.UpdateUnits(self, modUnit, realUnit)) then\n\t\tself:UpdateAllElements(event or 'RefreshUnit')\n\n\t\treturn true\n\tend\nend\n\nlocal function evalUnitAndUpdate(self, event)\n\tif(not updateActiveUnit(self, event)) then\n\t\treturn self:UpdateAllElements(event)\n\tend\nend\n\nlocal function iterateChildren(...)\n\tfor i = 1, select('#', ...) do\n\t\tlocal obj = select(i, ...)\n\n\t\tif(type(obj) == 'table' and obj.isChild) then\n\t\t\tupdateActiveUnit(obj, 'iterateChildren')\n\t\tend\n\tend\nend\n\nlocal function onAttributeChanged(self, name, value)\n\tif(name == 'unit' and value) then\n\t\tif(self.hasChildren) then\n\t\t\titerateChildren(self:GetChildren())\n\t\tend\n\n\t\tif(not self:GetAttribute('oUF-onlyProcessChildren')) then\n\t\t\tupdateActiveUnit(self, 'OnAttributeChanged')\n\t\tend\n\tend\nend\n\nlocal frame_metatable = {\n\t__index = CreateFrame('Button')\n}\nPrivate.frame_metatable = frame_metatable\n\nfor k, v in next, {\n\t--[[ frame:EnableElement(name, unit)\n\tUsed to activate an element for the given unit frame.\n\n\t* self - unit frame for which the element should be enabled\n\t* name - name of the element to be enabled (string)\n\t* unit - unit to be passed to the element's Enable function. Defaults to the frame's unit (string?)\n\t--]]\n\tEnableElement = function(self, name, unit)\n\t\targcheck(name, 2, 'string')\n\t\targcheck(unit, 3, 'string', 'nil')\n\n\t\tlocal element = elements[name]\n\t\tif(not element or self:IsElementEnabled(name)) then return end\n\n\t\tif(element.enable(self, unit or self.unit)) then\n\t\t\tactiveElements[self][name] = true\n\n\t\t\tif(element.update) then\n\t\t\t\ttable.insert(self.__elements, element.update)\n\t\t\tend\n\t\tend\n\tend,\n\n\t--[[ frame:DisableElement(name)\n\tUsed to deactivate an element for the given unit frame.\n\n\t* self - unit frame for which the element should be disabled\n\t* name - name of the element to be disabled (string)\n\t--]]\n\tDisableElement = function(self, name)\n\t\targcheck(name, 2, 'string')\n\n\t\tlocal enabled = self:IsElementEnabled(name)\n\t\tif(not enabled) then return end\n\n\t\tlocal update = elements[name].update\n\t\tif(update) then\n\t\t\tfor k, func in next, self.__elements do\n\t\t\t\tif(func == update) then\n\t\t\t\t\ttable.remove(self.__elements, k)\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tactiveElements[self][name] = nil\n\n\t\treturn elements[name].disable(self)\n\tend,\n\n\t--[[ frame:IsElementEnabled(name)\n\tUsed to check if an element is enabled on the given frame.\n\n\t* self - unit frame\n\t* name - name of the element (string)\n\t--]]\n\tIsElementEnabled = function(self, name)\n\t\targcheck(name, 2, 'string')\n\n\t\tlocal element = elements[name]\n\t\tif(not element) then return end\n\n\t\tlocal active = activeElements[self]\n\t\treturn active and active[name]\n\tend,\n\n\t--[[ frame:Enable(asState)\n\tUsed to toggle the visibility of a unit frame based on the existence of its unit. This is a reference to\n\t`RegisterUnitWatch`.\n\n\t* self    - unit frame\n\t* asState - if true, the frame's \"state-unitexists\" attribute will be set to a boolean value denoting whether the\n\t            unit exists; if false, the frame will be shown if its unit exists, and hidden if it does not (boolean)\n\t--]]\n\tEnable = RegisterUnitWatch,\n\t--[[ frame:Disable()\n\tUsed to UnregisterUnitWatch for the given frame and hide it.\n\n\t* self - unit frame\n\t--]]\n\tDisable = function(self)\n\t\tUnregisterUnitWatch(self)\n\t\tself:Hide()\n\tend,\n\t--[[ frame:IsEnabled()\n\tUsed to check if a unit frame is registered with the unit existence monitor. This is a reference to\n\t`UnitWatchRegistered`.\n\n\t* self - unit frame\n\t--]]\n\tIsEnabled = UnitWatchRegistered,\n\t--[[ frame:UpdateAllElements(event)\n\tUsed to update all enabled elements on the given frame.\n\n\t* self  - unit frame\n\t* event - event name to pass to the elements' update functions (string)\n\t--]]\n\tUpdateAllElements = function(self, event)\n\t\tlocal unit = self.unit\n\t\tif(not unitExists(unit)) then return end\n\n\t\tassert(type(event) == 'string', \"Invalid argument 'event' in UpdateAllElements.\")\n\n\t\tif(self.PreUpdate) then\n\t\t\t--[[ Callback: frame:PreUpdate(event)\n\t\t\tFired before the frame is updated.\n\n\t\t\t* self  - the unit frame\n\t\t\t* event - the event triggering the update (string)\n\t\t\t--]]\n\t\t\tself:PreUpdate(event)\n\t\tend\n\n\t\tfor _, func in next, self.__elements do\n\t\t\tfunc(self, event, unit)\n\t\tend\n\n\t\tif(self.PostUpdate) then\n\t\t\t--[[ Callback: frame:PostUpdate(event)\n\t\t\tFired after the frame is updated.\n\n\t\t\t* self  - the unit frame\n\t\t\t* event - the event triggering the update (string)\n\t\t\t--]]\n\t\t\tself:PostUpdate(event)\n\t\tend\n\tend,\n} do\n\tframe_metatable.__index[k] = v\nend\n\nlocal function onShow(self)\n\tevalUnitAndUpdate(self, 'OnShow')\nend\n\nlocal function updatePet(self, event, unit)\n\tlocal petUnit\n\tif(unit == 'target') then\n\t\treturn\n\telseif(unit == 'player') then\n\t\tpetUnit = 'pet'\n\telse\n\t\t-- Convert raid26 -> raidpet26\n\t\tpetUnit = unit:gsub('^(%a+)(%d+)', '%1pet%2')\n\tend\n\n\tif(self.unit ~= petUnit) then return end\n\n\tevalUnitAndUpdate(self, event)\nend\n\nlocal function updateRaid(self, event)\n\tlocal unitGUID = UnitGUID(self.unit)\n\tif(unitGUID and unitGUID ~= self.unitGUID) then\n\t\tself.unitGUID = unitGUID\n\n\t\tself:UpdateAllElements(event)\n\tend\nend\n\n-- boss6-8 exsist in some encounters, but unit event registration seems to be\n-- completely broken for them, so instead we use OnUpdate to update them.\nlocal eventlessUnits = {\n\tboss6 = true,\n\tboss7 = true,\n\tboss8 = true,\n}\n\nlocal function isEventlessUnit(unit)\n\treturn unit and unit:match('%w+target') or eventlessUnits[unit]\nend\n\nlocal function initObject(unit, style, styleFunc, header, ...)\n\tlocal num = select('#', ...)\n\tfor i = 1, num do\n\t\tlocal object = select(i, ...)\n\t\tlocal objectUnit = object:GetAttribute('oUF-guessUnit') or unit\n\t\tlocal suffix = object:GetAttribute('unitsuffix')\n\n\t\t-- Handle the case where someone has modified the unitsuffix attribute in\n\t\t-- oUF-initialConfigFunction.\n\t\tif(suffix and not objectUnit:match(suffix)) then\n\t\t\tobjectUnit = objectUnit .. suffix\n\t\tend\n\n\t\tobject.__elements = {}\n\t\tobject.style = style\n\t\tobject = setmetatable(object, frame_metatable)\n\n\t\t-- Expose the frame through oUF.objects.\n\t\ttable.insert(objects, object)\n\n\t\t-- We have to force update the frames when PEW fires.\n\t\t-- It's also important to evaluate units before running an update\n\t\t-- because sometimes events that are required for unit updates end up\n\t\t-- not firing because of loading screens. For instance, there's a slight\n\t\t-- delay between UNIT_EXITING_VEHICLE and UNIT_EXITED_VEHICLE during\n\t\t-- which a user can go through a loading screen after which the player\n\t\t-- frame will be stuck with the 'vehicle' unit.\n\t\tobject:RegisterEvent('PLAYER_ENTERING_WORLD', evalUnitAndUpdate, true)\n\n\t\tif(not isEventlessUnit(objectUnit)) then\n\t\t\tobject:RegisterEvent('UNIT_ENTERED_VEHICLE', evalUnitAndUpdate)\n\t\t\tobject:RegisterEvent('UNIT_EXITED_VEHICLE', evalUnitAndUpdate)\n\n\t\t\t-- We don't need to register UNIT_PET for the player unit. We register it\n\t\t\t-- mainly because UNIT_EXITED_VEHICLE and UNIT_ENTERED_VEHICLE don't always\n\t\t\t-- have pet information when they fire for party and raid units.\n\t\t\tif(objectUnit ~= 'player') then\n\t\t\t\tobject:RegisterEvent('UNIT_PET', updatePet)\n\t\t\tend\n\t\tend\n\n\t\tif(not header) then\n\t\t\t-- No header means it's a frame created through :Spawn().\n\t\t\tobject:SetAttribute('*type1', 'target')\n\t\t\tobject:SetAttribute('*type2', 'togglemenu')\n\t\t\tobject:SetAttribute('toggleForVehicle', true)\n\n\t\t\tif(isEventlessUnit(objectUnit)) then\n\t\t\t\toUF:HandleEventlessUnit(object)\n\t\t\telse\n\t\t\t\toUF:HandleUnit(object)\n\t\t\tend\n\t\telse\n\t\t\t-- update the frame when its prev unit is replaced with a new one\n\t\t\t-- updateRaid relies on UnitGUID to detect the unit change\n\t\t\tobject:RegisterEvent('GROUP_ROSTER_UPDATE', updateRaid, true)\n\n\t\t\tif(num > 1) then\n\t\t\t\tif(object:GetParent() == header) then\n\t\t\t\t\tobject.hasChildren = true\n\t\t\t\telse\n\t\t\t\t\tobject.isChild = true\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif(suffix == 'target') then\n\t\t\t\toUF:HandleEventlessUnit(object)\n\t\t\tend\n\t\tend\n\n\t\tPrivate.UpdateUnits(object, objectUnit)\n\n\t\tstyleFunc(object, objectUnit, not header)\n\n\t\tobject:HookScript('OnAttributeChanged', onAttributeChanged)\n\n\t\t-- NAME_PLATE_UNIT_ADDED fires after the frame is shown, so there's no\n\t\t-- need to call UAE multiple times\n\t\tif(not object.isNamePlate) then\n\t\t\tobject:SetScript('OnShow', onShow)\n\t\tend\n\n\t\tactiveElements[object] = {}\n\t\tfor element in next, elements do\n\t\t\tobject:EnableElement(element, objectUnit)\n\t\tend\n\n\t\tfor _, func in next, callback do\n\t\t\tfunc(object)\n\t\tend\n\n\t\t-- Make Clique kinda happy\n\t\tif(not object.isNamePlate) then\n\t\t\t_G.ClickCastFrames = _G.ClickCastFrames or {}\n\t\t\t_G.ClickCastFrames[object] = true\n\t\tend\n\tend\nend\n\nlocal function walkObject(object, unit)\n\tlocal parent = object:GetParent()\n\tlocal style = parent.style or style\n\tlocal styleFunc = styles[style]\n\n\tlocal header = parent:GetAttribute('oUF-headerType') and parent\n\n\t-- Check if we should leave the main frame blank.\n\tif(object:GetAttribute('oUF-onlyProcessChildren')) then\n\t\tobject.hasChildren = true\n\t\tobject:HookScript('OnAttributeChanged', onAttributeChanged)\n\t\treturn initObject(unit, style, styleFunc, header, object:GetChildren())\n\tend\n\n\treturn initObject(unit, style, styleFunc, header, object, object:GetChildren())\nend\n\n--[[ oUF:RegisterInitCallback(func)\nUsed to add a function to a table to be executed upon unit frame/header initialization.\n\n* self - the global oUF object\n* func - function to be added\n--]]\nfunction oUF:RegisterInitCallback(func)\n\ttable.insert(callback, func)\nend\n\n--[[ oUF:RegisterMetaFunction(name, func)\nUsed to make a (table of) function(s) available to all unit frames.\n\n* self - the global oUF object\n* name - unique name of the function (string)\n* func - function or a table of functions (function or table)\n--]]\nfunction oUF:RegisterMetaFunction(name, func)\n\targcheck(name, 2, 'string')\n\targcheck(func, 3, 'function', 'table')\n\n\tif(frame_metatable.__index[name]) then\n\t\treturn\n\tend\n\n\tframe_metatable.__index[name] = func\nend\n\n--[[ oUF:RegisterStyle(name, func)\nUsed to register a style with oUF. This will also set the active style if it hasn't been set yet.\n\n* self - the global oUF object\n* name - name of the style\n* func - function(s) defining the style (function or table)\n--]]\nfunction oUF:RegisterStyle(name, func)\n\targcheck(name, 2, 'string')\n\targcheck(func, 3, 'function', 'table')\n\n\tif(styles[name]) then return error('Style [%s] already registered.', name) end\n\tif(not style) then style = name end\n\n\tstyles[name] = func\nend\n\n--[[ oUF:SetActiveStyle(name)\nUsed to set the active style.\n\n* self - the global oUF object\n* name - name of the style (string)\n--]]\nfunction oUF:SetActiveStyle(name)\n\targcheck(name, 2, 'string')\n\tif(not styles[name]) then return error('Style [%s] does not exist.', name) end\n\n\tstyle = name\nend\n\n--[[ oUF:GetActiveStyle()\nUsed to get the active style.\n\n* self - the global oUF object\n--]]\nfunction oUF:GetActiveStyle()\n\treturn style\nend\n\ndo\n\tlocal function iter(_, n)\n\t\t-- don't expose the style functions.\n\t\treturn (next(styles, n))\n\tend\n\n\t--[[ oUF:IterateStyles()\n\tReturns an iterator over all registered styles.\n\n\t* self - the global oUF object\n\t--]]\n\tfunction oUF.IterateStyles()\n\t\treturn iter, nil, nil\n\tend\nend\n\nlocal getCondition\ndo\n\tlocal conditions = {\n\t\traid40 = '[@raid26,exists] show;',\n\t\traid25 = '[@raid11,exists] show;',\n\t\traid10 = '[@raid6,exists] show;',\n\t\traid = '[group:raid] show;',\n\t\tparty = '[group:party,nogroup:raid] show;',\n\t\tsolo = '[@player,exists,nogroup:party] show;',\n\t}\n\n\tfunction getCondition(...)\n\t\tlocal cond = ''\n\n\t\tfor i = 1, select('#', ...) do\n\t\t\tlocal short = select(i, ...)\n\n\t\t\tlocal condition = conditions[short]\n\t\t\tif(condition) then\n\t\t\t\tcond = cond .. condition\n\t\t\tend\n\t\tend\n\n\t\treturn cond .. 'hide'\n\tend\nend\n\nlocal function generateName(unit, ...)\n\tlocal name = 'oUF_' .. style:gsub('^oUF_?', ''):gsub('[^%a%d_]+', '')\n\n\tlocal raid, party, groupFilter, unitsuffix\n\tfor i = 1, select('#', ...), 2 do\n\t\tlocal att, val = select(i, ...)\n\t\tif(att == 'oUF-initialConfigFunction') then\n\t\t\tunitsuffix = val:match('unitsuffix[%p%s]+(%a+)')\n\t\telseif(att == 'showRaid') then\n\t\t\traid = val ~= false and val ~= nil\n\t\telseif(att == 'showParty') then\n\t\t\tparty = val ~= false and val ~= nil\n\t\telseif(att == 'groupFilter') then\n\t\t\tgroupFilter = val\n\t\tend\n\tend\n\n\tlocal append\n\tif(raid) then\n\t\tif(groupFilter) then\n\t\t\tif(type(groupFilter) == 'number' and groupFilter > 0) then\n\t\t\t\tappend = 'Raid' .. groupFilter\n\t\t\telseif(groupFilter:match('MAINTANK')) then\n\t\t\t\tappend = 'MainTank'\n\t\t\telseif(groupFilter:match('MAINASSIST')) then\n\t\t\t\tappend = 'MainAssist'\n\t\t\telse\n\t\t\t\tlocal _, count = groupFilter:gsub(',', '')\n\t\t\t\tif(count == 0) then\n\t\t\t\t\tappend = 'Raid' .. groupFilter\n\t\t\t\telse\n\t\t\t\t\tappend = 'Raid'\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tappend = 'Raid'\n\t\tend\n\telseif(party) then\n\t\tappend = 'Party'\n\telseif(unit) then\n\t\tappend = unit:gsub('^%l', string.upper)\n\tend\n\n\tif(append) then\n\t\tname = name .. append .. (unitsuffix or '')\n\tend\n\n\t-- Change oUF_LilyRaidRaid into oUF_LilyRaid\n\tname = name:gsub('(%u%l+)([%u%l]*)%1', '%1')\n\t-- Change oUF_LilyTargettarget into oUF_LilyTargetTarget\n\tname = name:gsub('t(arget)', 'T%1')\n\tname = name:gsub('p(et)', 'P%1')\n\tname = name:gsub('f(ocus)', 'F%1')\n\n\tlocal base = name\n\tlocal i = 2\n\twhile(_G[name]) do\n\t\tname = base .. i\n\t\ti = i + 1\n\tend\n\n\treturn name\nend\n\ndo\n\tlocal function styleProxy(self, frame)\n\t\treturn walkObject(_G[frame])\n\tend\n\n\t-- There has to be an easier way to do this.\n\tlocal initialConfigFunction = [[\n\t\tlocal header = self:GetParent()\n\t\tlocal frames = table.new()\n\t\ttable.insert(frames, self)\n\t\tself:GetChildList(frames)\n\t\tfor i = 1, #frames do\n\t\t\tlocal frame = frames[i]\n\t\t\tlocal unit\n\t\t\t-- There's no need to do anything on frames with onlyProcessChildren\n\t\t\tif(not frame:GetAttribute('oUF-onlyProcessChildren')) then\n\t\t\t\tRegisterUnitWatch(frame)\n\n\t\t\t\t-- Attempt to guess what the header is set to spawn.\n\t\t\t\tlocal groupFilter = header:GetAttribute('groupFilter')\n\n\t\t\t\tif(type(groupFilter) == 'string' and groupFilter:match('MAIN[AT]')) then\n\t\t\t\t\tlocal role = groupFilter:match('MAIN([AT])')\n\t\t\t\t\tif(role == 'T') then\n\t\t\t\t\t\tunit = 'maintank'\n\t\t\t\t\telse\n\t\t\t\t\t\tunit = 'mainassist'\n\t\t\t\t\tend\n\t\t\t\telseif(header:GetAttribute('showRaid')) then\n\t\t\t\t\tunit = 'raid'\n\t\t\t\telseif(header:GetAttribute('showParty')) then\n\t\t\t\t\tunit = 'party'\n\t\t\t\tend\n\n\t\t\t\tlocal headerType = header:GetAttribute('oUF-headerType')\n\t\t\t\tlocal suffix = frame:GetAttribute('unitsuffix')\n\t\t\t\tif(unit and suffix) then\n\t\t\t\t\tif(headerType == 'pet' and suffix == 'target') then\n\t\t\t\t\t\tunit = unit .. headerType .. suffix\n\t\t\t\t\telse\n\t\t\t\t\t\tunit = unit .. suffix\n\t\t\t\t\tend\n\t\t\t\telseif(unit and headerType == 'pet') then\n\t\t\t\t\tunit = unit .. headerType\n\t\t\t\tend\n\n\t\t\t\tframe:SetAttribute('*type1', 'target')\n\t\t\t\tframe:SetAttribute('*type2', 'togglemenu')\n\t\t\t\tframe:SetAttribute('oUF-guessUnit', unit)\n\t\t\tend\n\n\t\t\tlocal body = header:GetAttribute('oUF-initialConfigFunction')\n\t\t\tif(body) then\n\t\t\t\tframe:Run(body, unit)\n\t\t\tend\n\t\tend\n\n\t\theader:CallMethod('styleFunction', self:GetName())\n\n\t\tlocal clique = header:GetFrameRef('clickcast_header')\n\t\tif(clique) then\n\t\t\tclique:SetAttribute('clickcast_button', self)\n\t\t\tclique:RunAttribute('clickcast_register')\n\t\tend\n\t]]\n\n\t--[[ oUF:SpawnHeader(overrideName, template, visibility, ...)\n\tUsed to create a group header and apply the currently active style to it.\n\n\t* self         - the global oUF object\n\t* overrideName - unique global name to be used for the header. Defaults to an auto-generated name based on the name\n\t                 of the active style and other arguments passed to `:SpawnHeader` (string?)\n\t* template     - name of a template to be used for creating the header. Defaults to `'SecureGroupHeaderTemplate'`\n\t                 (string?)\n\t* visibility   - macro conditional(s) which define when to display the header (string).\n\t* ...          - further argument pairs. Consult [Group Headers](http://wowprogramming.com/docs/secure_template/Group_Headers.html)\n\t                 for possible values.\n\n\tIn addition to the standard group headers, oUF implements some of its own attributes. These can be supplied by the\n\tlayout, but are optional.\n\n\t* oUF-initialConfigFunction - can contain code that will be securely run at the end of the initial secure\n\t                              configuration (string?)\n\t* oUF-onlyProcessChildren   - can be used to force headers to only process children (boolean?)\n\t--]]\n\tfunction oUF:SpawnHeader(overrideName, template, visibility, ...)\n\t\tif(not style) then return error('Unable to create frame. No styles have been registered.') end\n\n\t\ttemplate = (template or 'SecureGroupHeaderTemplate')\n\n\t\tlocal isPetHeader = template:match('PetHeader')\n\t\tlocal name = overrideName or generateName(nil, ...)\n\t\tlocal header = CreateFrame('Frame', name, PetBattleFrameHider, template)\n\n\t\theader:SetAttribute('template', 'SecureUnitButtonTemplate, SecureHandlerStateTemplate, SecureHandlerEnterLeaveTemplate')\n\t\tfor i = 1, select('#', ...), 2 do\n\t\t\tlocal att, val = select(i, ...)\n\t\t\tif(not att) then break end\n\t\t\theader:SetAttribute(att, val)\n\t\tend\n\n\t\theader.style = style\n\t\theader.styleFunction = styleProxy\n\t\theader.visibility = visibility\n\n\t\t-- Expose the header through oUF.headers.\n\t\ttable.insert(headers, header)\n\n\t\t-- We set it here so layouts can't directly override it.\n\t\theader:SetAttribute('initialConfigFunction', initialConfigFunction)\n\t\theader:SetAttribute('_initialAttributeNames', '_onenter,_onleave,refreshUnitChange,_onstate-vehicleui')\n\t\theader:SetAttribute('_initialAttribute-_onenter', [[\n\t\t\tlocal snippet = self:GetAttribute('clickcast_onenter')\n\t\t\tif(snippet) then\n\t\t\t\tself:Run(snippet)\n\t\t\tend\n\t\t]])\n\t\theader:SetAttribute('_initialAttribute-_onleave', [[\n\t\t\tlocal snippet = self:GetAttribute('clickcast_onleave')\n\t\t\tif(snippet) then\n\t\t\t\tself:Run(snippet)\n\t\t\tend\n\t\t]])\n\t\theader:SetAttribute('_initialAttribute-refreshUnitChange', [[\n\t\t\tlocal unit = self:GetAttribute('unit')\n\t\t\tif(unit) then\n\t\t\t\tRegisterStateDriver(self, 'vehicleui', '[@' .. unit .. ',unithasvehicleui]vehicle; novehicle')\n\t\t\telse\n\t\t\t\tUnregisterStateDriver(self, 'vehicleui')\n\t\t\tend\n\t\t]])\n\t\theader:SetAttribute('_initialAttribute-_onstate-vehicleui', [[\n\t\t\tlocal unit = self:GetAttribute('unit')\n\t\t\tif(newstate == 'vehicle' and unit and UnitPlayerOrPetInRaid(unit) and not UnitTargetsVehicleInRaidUI(unit)) then\n\t\t\t\tself:SetAttribute('toggleForVehicle', false)\n\t\t\telse\n\t\t\t\tself:SetAttribute('toggleForVehicle', true)\n\t\t\tend\n\t\t]])\n\t\theader:SetAttribute('oUF-headerType', isPetHeader and 'pet' or 'group')\n\n\t\tif(_G.Clique) then\n\t\t\tSecureHandlerSetFrameRef(header, 'clickcast_header', _G.Clique.header)\n\t\tend\n\n\t\tif(header:GetAttribute('showParty')) then\n\t\t\tself:DisableBlizzard('party')\n\t\tend\n\n\t\tif(visibility) then\n\t\t\tlocal type, list = string.split(' ', visibility, 2)\n\t\t\tif(list and type == 'custom') then\n\t\t\t\tRegisterAttributeDriver(header, 'state-visibility', list)\n\t\t\t\theader.visibility = list\n\t\t\telse\n\t\t\t\tlocal condition = getCondition(string.split(',', visibility))\n\t\t\t\tRegisterAttributeDriver(header, 'state-visibility', condition)\n\t\t\t\theader.visibility = condition\n\t\t\tend\n\t\tend\n\n\t\treturn header\n\tend\nend\n\n--[[ oUF:Spawn(unit, overrideName)\nUsed to create a single unit frame and apply the currently active style to it.\n\n* self         - the global oUF object\n* unit         - the frame's unit (string)\n* overrideName - unique global name to use for the unit frame. Defaults to an auto-generated name based on the unit\n                 (string?)\n\noUF implements some of its own attributes. These can be supplied by the layout, but are optional.\n\n* oUF-enableArenaPrep - can be used to toggle arena prep support. Defaults to true (boolean)\n--]]\nfunction oUF:Spawn(unit, overrideName)\n\targcheck(unit, 2, 'string')\n\tif(not style) then return error('Unable to create frame. No styles have been registered.') end\n\n\tunit = unit:lower()\n\n\tlocal name = overrideName or generateName(unit)\n\tlocal object = CreateFrame('Button', name, PetBattleFrameHider, 'SecureUnitButtonTemplate')\n\tPrivate.UpdateUnits(object, unit)\n\n\tself:DisableBlizzard(unit)\n\twalkObject(object, unit)\n\n\tobject:SetAttribute('unit', unit)\n\tRegisterUnitWatch(object)\n\n\treturn object\nend\n\n--[[ oUF:SpawnNamePlates(prefix, callback, variables)\nUsed to create nameplates and apply the currently active style to them.\n\n* self      - the global oUF object\n* prefix    - prefix for the global name of the nameplate. Defaults to an auto-generated prefix (string?)\n* callback  - function to be called after a nameplate unit or the player's target has changed. The arguments passed to\n              the callback are the updated nameplate, if any, the event that triggered the update, and the new unit\n              (function?)\n* variables - list of console variable-value pairs to be set when the player logs in (table?)\n--]]\nfunction oUF:SpawnNamePlates(namePrefix, nameplateCallback, nameplateCVars)\n\targcheck(nameplateCallback, 3, 'function', 'nil')\n\targcheck(nameplateCVars, 4, 'table', 'nil')\n\tif(not style) then return error('Unable to create frame. No styles have been registered.') end\n\tif(_G.oUF_NamePlateDriver) then return error('oUF nameplate driver has already been initialized.') end\n\n\tlocal style = style\n\tlocal prefix = namePrefix or generateName()\n\n\t-- Because there's no way to prevent nameplate settings updates without tainting UI,\n\t-- and because forbidden nameplates exist, we have to allow default nameplate\n\t-- driver to create, update, and remove Blizz nameplates.\n\t-- Disable only not forbidden nameplates.\n\tNamePlateDriverFrame:HookScript('OnEvent', function(_, event, unit)\n\t\tif(event == 'NAME_PLATE_UNIT_ADDED' and unit) then\n\t\t\tself:DisableBlizzard(unit)\n\t\tend\n\tend)\n\n\tlocal eventHandler = CreateFrame('Frame', 'oUF_NamePlateDriver')\n\teventHandler:RegisterEvent('NAME_PLATE_UNIT_ADDED')\n\teventHandler:RegisterEvent('NAME_PLATE_UNIT_REMOVED')\n\teventHandler:RegisterEvent('PLAYER_TARGET_CHANGED')\n\n\tif(IsLoggedIn()) then\n\t\tif(nameplateCVars) then\n\t\t\tfor cvar, value in next, nameplateCVars do\n\t\t\t\tSetCVar(cvar, value)\n\t\t\tend\n\t\tend\n\telse\n\t\teventHandler:RegisterEvent('PLAYER_LOGIN')\n\tend\n\n\teventHandler:SetScript('OnEvent', function(_, event, unit)\n\t\tif(event == 'PLAYER_LOGIN') then\n\t\t\tif(nameplateCVars) then\n\t\t\t\tfor cvar, value in next, nameplateCVars do\n\t\t\t\t\tSetCVar(cvar, value)\n\t\t\t\tend\n\t\t\tend\n\t\telseif(event == 'PLAYER_TARGET_CHANGED') then\n\t\t\tlocal nameplate = C_NamePlate.GetNamePlateForUnit('target')\n\t\t\tif(nameplateCallback) then\n\t\t\t\tnameplateCallback(nameplate and nameplate.unitFrame, event, 'target')\n\t\t\tend\n\n\t\t\t-- UAE is called after the callback to reduce the number of\n\t\t\t-- ForceUpdate calls layout devs have to do themselves\n\t\t\tif(nameplate) then\n\t\t\t\tnameplate.unitFrame:UpdateAllElements(event)\n\t\t\tend\n\t\telseif(event == 'NAME_PLATE_UNIT_ADDED' and unit) then\n\t\t\tlocal nameplate = C_NamePlate.GetNamePlateForUnit(unit)\n\t\t\tif(not nameplate) then return end\n\n\t\t\tif(not nameplate.unitFrame) then\n\t\t\t\tnameplate.style = style\n\n\t\t\t\tnameplate.unitFrame = CreateFrame('Button', prefix..nameplate:GetName(), nameplate)\n\t\t\t\tnameplate.unitFrame:EnableMouse(false)\n\t\t\t\tnameplate.unitFrame.isNamePlate = true\n\n\t\t\t\tPrivate.UpdateUnits(nameplate.unitFrame, unit)\n\n\t\t\t\twalkObject(nameplate.unitFrame, unit)\n\t\t\telse\n\t\t\t\tPrivate.UpdateUnits(nameplate.unitFrame, unit)\n\t\t\tend\n\n\t\t\tnameplate.unitFrame:SetAttribute('unit', unit)\n\n\t\t\tif(nameplateCallback) then\n\t\t\t\tnameplateCallback(nameplate.unitFrame, event, unit)\n\t\t\tend\n\n\t\t\t-- UAE is called after the callback to reduce the number of\n\t\t\t-- ForceUpdate calls layout devs have to do themselves\n\t\t\tnameplate.unitFrame:UpdateAllElements(event)\n\t\telseif(event == 'NAME_PLATE_UNIT_REMOVED' and unit) then\n\t\t\tlocal nameplate = C_NamePlate.GetNamePlateForUnit(unit)\n\t\t\tif(not nameplate) then return end\n\n\t\t\tnameplate.unitFrame:SetAttribute('unit', nil)\n\n\t\t\tif(nameplateCallback) then\n\t\t\t\tnameplateCallback(nameplate.unitFrame, event, unit)\n\t\t\tend\n\t\tend\n\tend)\nend\n\n--[[ oUF:AddElement(name, update, enable, disable)\nUsed to register an element with oUF.\n\n* self    - the global oUF object\n* name    - unique name of the element (string)\n* update  - used to update the element (function)\n* enable  - used to enable the element for a given unit frame and unit (function)\n* disable - used to disable the element for a given unit frame (function)\n--]]\nfunction oUF:AddElement(name, update, enable, disable)\n\targcheck(name, 2, 'string')\n\targcheck(update, 3, 'function', 'nil')\n\targcheck(enable, 4, 'function')\n\targcheck(disable, 5, 'function')\n\n\tif(elements[name]) then return error('Element [%s] is already registered.', name) end\n\telements[name] = {\n\t\tupdate = update;\n\t\tenable = enable;\n\t\tdisable = disable;\n\t}\nend\n\noUF.version = _VERSION\n--[[ oUF.objects\nArray containing all unit frames created by `oUF:Spawn`.\n--]]\noUF.objects = objects\n--[[ oUF.headers\nArray containing all group headers created by `oUF:SpawnHeader`.\n--]]\noUF.headers = headers\n\nif(global) then\n\tif(parent ~= 'oUF' and global == 'oUF') then\n\t\terror('%s is doing it wrong and setting its global to \"oUF\".', parent)\n\telseif(_G[global]) then\n\t\terror('%s is setting its global to an existing name \"%s\".', parent, global)\n\telse\n\t\t_G[global] = oUF\n\tend\nend\n"
  },
  {
    "path": "ShestakUI/Libs/oUF/oUF.xml",
    "content": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\">\n\t<Script file=\"Init.lua\"/>\n\t<Script file=\"Private.lua\"/>\n\t<Script file=\"oUF.lua\"/>\n\t<Script file=\"Events.lua\"/>\n\t<Script file=\"CombatEvents.lua\"/>\n\t<Script file=\"Factory.lua\"/>\n\t<Script file=\"Blizzard.lua\"/>\n\t<Script file=\"Units.lua\"/>\n\t<Script file=\"Colors.lua\"/>\n\n\t<Script file=\"Elements\\AlternativePower.lua\"/>\n\t<Script file=\"Elements\\AssistantIndicator.lua\"/>\n\t<Script file=\"Elements\\Auras.lua\"/>\n\t<Script file=\"Elements\\CastBar.lua\"/>\n\t<Script file=\"Elements\\CombatIndicator.lua\"/>\n\t<Script file=\"Elements\\GroupRoleIndicator.lua\"/>\n\t<Script file=\"Elements\\HealPrediction.lua\"/>\n\t<Script file=\"Elements\\Health.lua\"/>\n\t<Script file=\"Elements\\LeaderIndicator.lua\"/>\n\t<Script file=\"Elements\\PhaseIndicator.lua\"/>\n\t<Script file=\"Elements\\Portraits.lua\"/>\n\t<Script file=\"Elements\\Power.lua\"/>\n\t<Script file=\"Elements\\PowerPrediction.lua\"/>\n\t<Script file=\"Elements\\QuestIndicator.lua\"/>\n\t<Script file=\"Elements\\RaidTargetIndicator.lua\"/>\n\t<Script file=\"Elements\\Range.lua\"/>\n\t<Script file=\"Elements\\ReadyCheckIndicator.lua\"/>\n\t<Script file=\"Elements\\RestingIndicator.lua\"/>\n\t<Script file=\"Elements\\ResurrectIndicator.lua\"/>\n\t<Script file=\"Elements\\Runes.lua\"/>\n\t<Script file=\"Elements\\Stagger.lua\"/>\n\t<Script file=\"Elements\\SummonIndicator.lua\"/>\n\t<Script file=\"Elements\\Tags.lua\"/>\n\t<Script file=\"Elements\\ThreatIndicator.lua\"/>\n\n\t<Script file=\"Finalize.lua\"/>\n\n\t<Script file=\"Modules\\ArcaneCharge.lua\"/>\n\t<Script file=\"Modules\\AuraTracker.lua\"/>\n\t<Script file=\"Modules\\AuraWatch.lua\"/>\n\t<Script file=\"Modules\\AutoResurrect.lua\"/>\n\t<Script file=\"Modules\\CombatFeedback.lua\"/>\n\t<Script file=\"Modules\\CounterBar.lua\"/>\n\t<Script file=\"Modules\\ComboPoints.lua\"/>\n\t<Script file=\"Modules\\DebuffHighlight.lua\"/>\n\t<Script file=\"Modules\\EnemySpec.lua\"/>\n\t<Script file=\"Modules\\Essence.lua\"/>\n\t<Script file=\"Modules\\Experience.lua\"/>\n\t<Script file=\"Modules\\FactionIcon.lua\"/>\n\t<Script file=\"Modules\\Fader.lua\"/>\n\t<Script file=\"Modules\\GCD.lua\"/>\n\t<Script file=\"Modules\\HarmonyOrbs.lua\"/>\n\t<Script file=\"Modules\\HolyPower.lua\"/>\n\t<Script file=\"Modules\\QuestIcon.lua\"/>\n\t<Script file=\"Modules\\RaidDebuffs.lua\"/>\n\t<Script file=\"Modules\\Reputation.lua\"/>\n\t<Script file=\"Modules\\Smooth.lua\"/>\n\t<Script file=\"Modules\\SoulShards.lua\"/>\n\t<Script file=\"Modules\\Swing.lua\"/>\n\t<Script file=\"Modules\\TotemBar.lua\"/>\n\t<Script file=\"Modules\\Trinkets.lua\"/>\n\n\t<!-- MT/MTT/MTTT Template -->\n\t<Button name=\"oUF_MainTank\" inherits=\"SecureUnitButtonTemplate\" virtual=\"true\">\n\t\t<Frames>\n\t\t\t<Button name=\"$parentTarget\" inherits=\"SecureUnitButtonTemplate\">\n\t\t\t\t<Anchors>\n\t\t\t\t\t<Anchor point=\"LEFT\" relativePoint=\"RIGHT\" relativeTo=\"$parent\">\n\t\t\t\t\t\t<Offset>\n\t\t\t\t\t\t\t<AbsDimension x=\"7\" y=\"0\"/>\n\t\t\t\t\t\t</Offset>\n\t\t\t\t\t</Anchor>\n\t\t\t\t</Anchors>\n\t\t\t\t<Attributes>\n\t\t\t\t\t<Attribute name=\"unitsuffix\" type=\"string\" value=\"target\"/>\n\t\t\t\t\t<Attribute name=\"useparent-unit\" type=\"boolean\" value=\"true\"/>\n\t\t\t\t\t<Attribute name=\"type1\" type=\"string\" value=\"target\"/>\n\t\t\t\t\t<Attribute name=\"initial-unitWatch\" type=\"boolean\" value=\"true\"/>\n\t\t\t\t</Attributes>\n\t\t\t</Button>\n\t\t</Frames>\n\t</Button>\n\t<Button name=\"oUF_MainTankTT\" inherits=\"SecureUnitButtonTemplate\" virtual=\"true\">\n\t\t<Frames>\n\t\t\t<Button name=\"$parentTarget\" inherits=\"SecureUnitButtonTemplate\">\n\t\t\t\t<Anchors>\n\t\t\t\t\t<Anchor point=\"LEFT\" relativePoint=\"RIGHT\" relativeTo=\"$parent\">\n\t\t\t\t\t\t<Offset>\n\t\t\t\t\t\t\t<AbsDimension x=\"7\" y=\"0\"/>\n\t\t\t\t\t\t</Offset>\n\t\t\t\t\t</Anchor>\n\t\t\t\t</Anchors>\n\t\t\t\t<Attributes>\n\t\t\t\t\t<Attribute name=\"unitsuffix\" type=\"string\" value=\"target\"/>\n\t\t\t\t\t<Attribute name=\"useparent-unit\" type=\"boolean\" value=\"true\"/>\n\t\t\t\t\t<Attribute name=\"type1\" type=\"string\" value=\"target\"/>\n\t\t\t\t\t<Attribute name=\"initial-unitWatch\" type=\"boolean\" value=\"true\"/>\n\t\t\t\t</Attributes>\n\t\t\t</Button>\n\t\t\t<Button name=\"$parentTargetTarget\" inherits=\"SecureUnitButtonTemplate\">\n\t\t\t\t<Anchors>\n\t\t\t\t\t<Anchor point=\"LEFT\" relativePoint=\"RIGHT\" relativeTo=\"$parentTarget\">\n\t\t\t\t\t\t<Offset>\n\t\t\t\t\t\t\t<AbsDimension x=\"7\" y=\"0\"/>\n\t\t\t\t\t\t</Offset>\n\t\t\t\t\t</Anchor>\n\t\t\t\t</Anchors>\n\t\t\t\t<Attributes>\n\t\t\t\t\t<Attribute name=\"unitsuffix\" type=\"string\" value=\"targettarget\"/>\n\t\t\t\t\t<Attribute name=\"useparent-unit\" type=\"boolean\" value=\"true\"/>\n\t\t\t\t\t<Attribute name=\"type1\" type=\"string\" value=\"targettarget\"/>\n\t\t\t\t\t<Attribute name=\"initial-unitWatch\" type=\"boolean\" value=\"true\"/>\n\t\t\t\t</Attributes>\n\t\t\t</Button>\n\t\t</Frames>\n\t</Button>\n</Ui>\n"
  },
  {
    "path": "ShestakUI/Licenses/ElvUI",
    "content": "ElvUI License\n\tCopyright 2009-2022 The contents of this addon, excluding third-party resources, are\n\tcopyrighted to their authors with all rights reserved.\n\n\tThis addon is free to use and the authors hereby grants you the following rights:\n\n\t1. \tYou may make modifications to this addon for private use only, you\n\t\tmay not publicize any portion of this addon. The only exception being you may\n\t\tupload to the tukui.org or github website.\n\n\t2. \tDo not modify the name of this addon, including the addon folders.\n\n\t3. \tThis copyright notice shall be included in all copies or substantial\n\t\tportions of the Software.\n\n\tAll rights not explicitly addressed in this license are reserved by\n\tthe copyright holders."
  },
  {
    "path": "ShestakUI/Licenses/ShestakUI",
    "content": "Copyright (c) 2009-2022 Shestak http://shestak.org\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "ShestakUI/Licenses/TukUI",
    "content": "Tukui License\n\tCopyright 2009-2021 http://www.tukui.org\n\n\tThe contents of this addon, excluding third-party resources, are\n\tcopyrighted to their authors with all rights reserved.\n\n\tAuthors of this addon hereby grant you the following rights:\n\n\t1. \tYou may NOT make any modification inside this addon. If you want\n\t\tto create your own edited version, please create it from outside.\n\n\t2. \tDo not modify the name of this addon, including the addon folders.\n\n\t3. \tDo not include this AddOn with any edited version, a user of this AddOn\n\t\tmust always download this addon from tukui.org or through the Tukui Client.\n\n\t4.\tThis copyright notice shall be included in all copies or substantial\n\t\tportions of the Software.\n\n\tEarlier versions were released under terms that did not require permission,\n\tbut due to the actions of certain unscrupulous distributors, I have chosen\n\tto license all versions over v9 under stricter terms.\n\n\tAll rights not explicitly addressed in this license are reserved by\n\tthe copyright holders.\n\n\tYou can write to us at contact@tukui.org for reporting abuse."
  },
  {
    "path": "ShestakUI/Licenses/oUF",
    "content": "Copyright (c) 2006-2022 Trond A Ekseth <troeks@gmail.com>\nCopyright (c) 2016-2022 Val Voronov <i.lightspark@gmail.com>\nCopyright (c) 2016-2022 Adrian L Lange <contact@p3lim.net>\nCopyright (c) 2016-2022 Rainrider <rainrider.wow@gmail.com>\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "ShestakUI/Locales/Chinese.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif T.client ~= \"zhCN\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for zhCN client\n--\tTranslation: Ianchan, Mania, Nanjiqq, Tat2dawn\n----------------------------------------------------------------------------------------\n-- Announce flasks and food\nL_ANNOUNCE_FF_NOFOOD = \"缺少食物: \"\nL_ANNOUNCE_FF_NOFLASK = \"缺少合剂: \"\nL_ANNOUNCE_FF_ALLBUFFED = \"已获得所有增益 !\"\nL_ANNOUNCE_FF_CHECK_BUTTON = \"检查食物和合剂\"\n\n-- Says thanks for some spells\nL_ANNOUNCE_SS_THANKS = \"谢谢你的 \"\nL_ANNOUNCE_SS_RECEIVED = \" 收到来自于 \"\n\n-- Pull countdown announce\nL_ANNOUNCE_PC_GO = \"开始 !\"\nL_ANNOUNCE_PC_MSG = \"准备接怪: %s，倒数 %s..\"\nL_ANNOUNCE_PC_ABORTED = \"取消拉怪 !\"\n\n-- Announce feasts and portals\nL_ANNOUNCE_FP_PRE = \"%s 放置了 %s\"\nL_ANNOUNCE_FP_PUT = \"%s 放置了 %s\"\nL_ANNOUNCE_FP_CAST = \"%s 开启了 %s\"\nL_ANNOUNCE_FP_CLICK = \"%s 正在开启 %s... 请点击 !\"\nL_ANNOUNCE_FP_USE = \"%s 使用了 %s。\"\n\n-- Announce your interrupts\nL_ANNOUNCE_INTERRUPTED = \"已打断\"\n\n-- Tooltip\nL_TOOLTIP_NO_TALENT = \"没有天赋\"\nL_TOOLTIP_LOADING = \"读取中...\"\nL_TOOLTIP_ACH_STATUS = \"你的状态: \"\nL_TOOLTIP_ACH_COMPLETE = \"你的状态: 完成\"\nL_TOOLTIP_ACH_INCOMPLETE = \"你的状态: 未完成\"\nL_TOOLTIP_SPELL_ID = \"法术ID: \"\nL_TOOLTIP_ITEM_ID = \"物品ID: \"\nL_TOOLTIP_WHO_TARGET = \"关注\"\nL_TOOLTIP_ITEM_COUNT = \"物品数量: \"\nL_TOOLTIP_INSPECT_OPEN = \"检查框体已开启\"\n\n-- Misc\nL_MISC_UNDRESS = \"无装备\"\nL_MISC_DRINKING = \" 进食中...\"\nL_MISC_BUY_STACK = \"Alt+右键批量购买\"\nL_MISC_UI_OUTDATED = \"ShestakUI 版本已过期，请至 www.shestak.org 下载最新版。\"\nL_MISC_HEADER_MARK = \"鼠标悬停显示团队图标\"\nL_MISC_BINDER_OPEN = \"鼠标绑定\"\nL_MISC_SCROLL = \"附魔羊皮纸\"\nL_MISC_HEADER_QUEST = \"Auto quest button\" -- Needs review\n\n-- Raid Utility\nL_RAID_UTIL_DISBAND = \"解散团队\"\n\n-- Zone name\nL_ZONE_ANCIENTDALARAN = \"达拉然巨坑\"\n\n-- WatchFrame Wowhead link\nL_WATCH_WOWHEAD_LINK = \"Wowhead链接\"\n\n-- Toggle Menu\nL_TOGGLE_ADDON = \"插件 \"\nL_TOGGLE_ADDONS = \" 插件系列\"\nL_TOGGLE_EXPAND = \"展开 \"\nL_TOGGLE_COLLAPSE = \"折叠 \"\nL_TOGGLE_RCLICK = \"右键 启用/禁用 \"\nL_TOGGLE_LCLICK = \"左键 显示/隐藏窗口 \"\nL_TOGGLE_RELOAD = \" (需要重载插件)\"\nL_TOGGLE_NOT_FOUND = \" 未创建\"\n\n-- UnitFrame\nL_UF_GHOST = \"灵魂\"\nL_UF_DEAD = \"死亡\"\nL_UF_OFFLINE = \"离线\"\nL_UF_MANA = \"低法力值\"\n\n-- Map\nL_MAP_CURSOR = \"指针: \"\nL_MAP_BOUNDS = \"超出范围 !\"\nL_MAP_FOG = \"地图全亮\"\nL_MAP_COORDS = \"坐标\"\n\n-- Minimap\nL_MINIMAP_CALENDAR = \"日历\"\nL_MINIMAP_FARM = \"小地图缩放\"\nL_MINIMAP_TOGGLE = \"动作条自由折叠\"\n\n-- Chat\nL_CHAT_WHISPER = \"From\"\nL_CHAT_BN_WHISPER = \"From\"\nL_CHAT_AFK = \"[AFK]\"\nL_CHAT_DND = \"[DND]\"\nL_CHAT_GM = \"[GM]\"\nL_CHAT_GUILD = \"G\"\nL_CHAT_PARTY = \"P\"\nL_CHAT_PARTY_LEADER = \"PL\"\nL_CHAT_RAID = \"R\"\nL_CHAT_RAID_LEADER = \"RL\"\nL_CHAT_RAID_WARNING = \"RW\"\nL_CHAT_INSTANCE_CHAT = \"I\"\nL_CHAT_INSTANCE_CHAT_LEADER = \"IL\"\nL_CHAT_OFFICER = \"O\"\nL_CHAT_PET_BATTLE = \"PB\"\nL_CHAT_COME_ONLINE = \"|cff298F00上线了|r\"\nL_CHAT_GONE_OFFLINE = \"|cffff0000下线了|r\"\n\n-- Errors frame\nL_ERRORFRAME_L = \"点击查看错误\"\n\n-- Bags\nL_BAG_SHOW_BAGS = \"显示背包\"\nL_BAG_RIGHT_CLICK_SEARCH = \"右键搜寻物品\"\nL_BAG_STACK_MENU = \"堆叠\"\nL_BAG_RIGHT_CLICK_CLOSE = \"右键开启菜单\"\n\n-- Grab mail\nL_MAIL_STOPPED = \"无法拾取，背包已满。\"\nL_MAIL_UNIQUE = \"中止，在背包或银行发现重复的唯一物品。\"\nL_MAIL_COMPLETE = \"完成\"\nL_MAIL_NEED = \"需要信箱\"\nL_MAIL_MESSAGES = \"新邮件\"\n\n-- Loot\nL_LOOT_RANDOM = \"随机拾取\"\nL_LOOT_SELF = \"个人拾取\"\nL_LOOT_FISH = \"钓鱼拾取\"\nL_LOOT_ANNOUNCE = \"向频道通告\"\nL_LOOT_TO_RAID = \"  团队\"\nL_LOOT_TO_PARTY = \"  队伍\"\nL_LOOT_TO_GUILD = \"  公会\"\nL_LOOT_TO_SAY = \"  说\"\n\n-- LitePanels AFK module\nL_PANELS_AFK = \"正处于暂离状态 !\"\nL_PANELS_AFK_RCLICK = \"右键隐藏\"\nL_PANELS_AFK_LCLICK = \"左键脱离暂离状态\"\n\n-- Cooldowns\nL_COOLDOWNS = \"CD: \"\nL_COOLDOWNS_COMBATRESS = \"战复\"\nL_COOLDOWNS_COMBATRESS_REMAINDER = \"战复剩余: \"\nL_COOLDOWNS_NEXTTIME = \"下次: \"\n\n-- Bind key\nL_BIND_SAVED = \"快捷键设置已保存\"\nL_BIND_DISCARD = \"新的快捷键设置已撤消\"\nL_BIND_INSTRUCT = \"将鼠标悬停至任意快捷键进行绑定。按Esc或者右键清除当前快捷键的按键绑定。\"\nL_BIND_CLEARED = \"已清除所有快捷键设置\"\nL_BIND_BINDING = \"绑定\"\nL_BIND_KEY = \"按键\"\nL_BIND_NO_SET = \"没有绑定快捷键\"\n\n-- Info text\nL_INFO_ERRORS = \"目前没有错误\"\nL_INFO_INVITE = \"接受邀请\"\nL_INFO_DUEL = \"拒绝决斗请求\"\nL_INFO_PET_DUEL = \"拒绝宠物对战请求\"\nL_INFO_DISBAND = \"解散队伍...\"\nL_INFO_SETTINGS_DBM = \"键入 /settings dbm 载入 DBM 的设定\"\nL_INFO_SETTINGS_BIGWIGS = \"键入 /settings bw 载入 BigWigs 的设定\"\nL_INFO_SETTINGS_MSBT = \"键入 /settings msbt 载入 MSBT 的设定\"\nL_INFO_SETTINGS_SKADA = \"键入 /settings skada 载入 Skada 的设定\"\nL_INFO_SETTINGS_ALL = \"键入 /settings all 载入所有UI设定\"\nL_INFO_NOT_INSTALLED = \" 没有安装\"\nL_INFO_SKIN_DISABLED1 = \"界面美化启用\"\nL_INFO_SKIN_DISABLED2 = \" 已禁用\"\n\n-- Moving elements\nL_MOVE_RIGHT_CLICK = \"右键重置位置\"\nL_MOVE_MIDDLE_CLICK = \"中键临时隐藏\"\n\n-- Popups\nL_POPUP_INSTALLUI = \"该角色首次使用ShestakUI，你必须重新加载UI来配置。\"\nL_POPUP_RESETUI = \"你确定要重新加载ShestakUI?\"\nL_POPUP_RESETSTATS = \"你确定要重置所有角色游戏时间和金币的统计数据?\"\nL_POPUP_DISBAND_RAID = \"你确定要解散团队?\"\nL_POPUP_DISABLEUI = \"ShestakUI不支持此分辨率，是否停用ShestakUI? (若要尝试其他分辨率请按取消)\"\nL_POPUP_SETTINGS_ALL = \"套用所有插件设置?(DBM/BigWigs/Skada/MSBT)\"\nL_POPUP_SETTINGS_DBM = \"需要改变DBM锚点及样式元素\"\nL_POPUP_SETTINGS_BW = \"需要改变BigWigs锚点及样式元素\"\nL_POPUP_ARMORY = \"英雄榜\"\n\n-- Welcome message\nL_WELCOME_LINE_1 = \"欢迎使用ShestakUI \"\nL_WELCOME_LINE_2_1 = \"键入 /cfg 进行插件设置, 或者访问http://shestak.org\"\nL_WELCOME_LINE_2_2 = \"获取更多信息。\"\n\n-- Combat text\nL_COMBATTEXT_KILLING_BLOW = \"最后一击\"\nL_COMBATTEXT_TEST_DISABLED = \"战斗信息测试模式已禁用\"\nL_COMBATTEXT_TEST_ENABLED = \"战斗信息测试模式已启用\"\nL_COMBATTEXT_TEST_USE_MOVE = \"键入 /xct move 移动/调整战斗信息框架大小\"\nL_COMBATTEXT_TEST_USE_TEST = \"键入 /xct test 启用/禁用战斗信息测试模式\"\nL_COMBATTEXT_TEST_USE_RESET = \"键入 /xct reset 恢复到初始位置\"\nL_COMBATTEXT_POPUP = \"保存战斗信息窗口的位置须重载插件\"\nL_COMBATTEXT_UNSAVED = \"战斗信息窗口位置尚未保存，不要忘记重新载入插件。\"\nL_COMBATTEXT_UNLOCKED = \"战斗信息已解锁\"\n\n-- LiteStats\nL_STATS_AUTO_REPAIR = \"自动修装\"\nL_STATS_GUILD_REPAIR = \"公会银行修装\"\nL_STATS_AUTO_SELL = \"自动出售灰色物品\"\nL_STATS_BANDWIDTH = \"宽带: \"\nL_STATS_DOWNLOAD = \"下载: \"\nL_STATS_CURRENCY_RAID = \"徽记\"\nL_STATS_MEMORY_USAGE = \"插件资源占用: \"\nL_STATS_TOTAL_MEMORY_USAGE = \"总资源占用: \"\nL_STATS_TOTAL_CPU_USAGE = \"总CPU使用率: \"\nL_STATS_GARBAGE_COLLECTED = \"整理内存\"\nL_STATS_HIDDEN = \"隐藏\"\nL_STATS_JUNK_ALREADY_ADDITIONS = \"已加入自动出售名单\"\nL_STATS_JUNK_ITEMLINK = \"物品链接\"\nL_STATS_JUNK_ADDITIONS = \"自动出售名单\"\nL_STATS_JUNK_LIST = \"自动出售常用命令\"\nL_STATS_JUNK_PROFIT = \"自动出售所得金额\"\nL_STATS_JUNK_CLEARED = \"自动出售名单已清除\"\nL_STATS_JUNK_CLEAR_ADDITIONS = \"清除自动出售名单\"\nL_STATS_JUNK_ADDED = \"自动出售 - 已加入\"\nL_STATS_JUNK_ADD_ITEM = \"增加/移除 物品\"\nL_STATS_JUNK_REMOVED = \"自动出售 - 已移除\"\nL_STATS_JUNK_ITEMS_LIST = \"列出自动出售名单\"\nL_STATS_KILLS = \"击杀\"\nL_STATS_XP_RATE = \"当前等级经验百分值\"\nL_STATS_HR = \"小时\"\nL_STATS_INF = \"无限\"\nL_STATS_ON = \"启用\"\nL_STATS_PLAYED_LEVEL = \"当前等级总在线时间\"\nL_STATS_PLAYED_SESSION = \"此次在线时长\"\nL_STATS_ACC_PLAYED = \"帐号启用总时间\"\nL_STATS_PLAYED_TOTAL = \"总在线时长\"\nL_STATS_QUEST = \"任务\"\nL_STATS_QUESTS_TO = \"任务/杀怪得到经验值 %s\"\nL_STATS_CURRENT_XP = \"当前/升级所需经验值\"\nL_STATS_REMAINING_XP = \"升级尚需经验值\"\nL_STATS_RESTED_XP = \"休息奖励经验值\"\nL_STATS_SERVER_GOLD = \"帐号总现金\"\nL_STATS_SESSION_GAIN = \"此次在线时段获得/损失金额\"\nL_STATS_SESSION_XP = \"此次在线时段所得经验值\"\nL_STATS_SORTING_BY = \"排列方式: \"\nL_STATS_SEALS = \"本周已领徽记\"\nL_STATS_SPEC = \"专精\"\nL_STATS_TIPS = \"提示: \"\nL_STATS_OPEN_CALENDAR = \"左键开/关日历\"\nL_STATS_RC_TIME_MANAGER = \"右键开/关计时器\"\nL_STATS_TOGGLE_TIME = \"本地/服务器及24小时制可于计时器中设置\"\nL_STATS_MEMORY = \"内存\"\nL_STATS_RC_COLLECTS_GARBAGE = \"帧数模块上鼠标悬停显示，右键整理内存\"\nL_STATS_VIEW_NOTES = \"按住Alt键检视: 好友的所在地 公会成员的会阶/注记/干部注记\"\nL_STATS_CHANGE_SORTING = \"[公会]右键密语/邀请，中键更改排列方式，Shift+中键反转排序\"\nL_STATS_OPEN_CHARACTER = \"左键开/关角色界面\"\nL_STATS_RC_AUTO_REPAIRING1 = \"右键开/关自动修装\"\nL_STATS_RC_AUTO_REPAIRING2 = \"中键开/关公会修装\"\nL_STATS_EQUIPMENT_CHANGER = \"Shift+左键或Alt+左键开启套装选单\"\nL_STATS_RC_EXPERIENCE = \"右键切换在线时间/神器信息/经验值/声望值\"\nL_STATS_WATCH_FACTIONS = \"左键开/关相关界面\"\nL_STATS_TOOLTIP_EXPERIENCE = \"未达最高等级时将优先显示经验值信息\"\nL_STATS_TOOLTIP_TIME_PLAYED = \"达到最高等级后将优先显示角色在线时间\"\nL_STATS_OPEN_TALENT = \"左键开启专精选单，Shift+左键开启专精界面\"\nL_STATS_RC_TALENT = \"右键开启拾取专精选单\"\nL_STATS_LOCATION = \"位置/座标\"\nL_STATS_WORLD_MAP = \"点击开/关世界地图\"\nL_STATS_INSERTS_COORDS = \"Shift+左键地名/座标/定位标记自动复制到输入框\"\nL_STATS_OPEN_CURRENCY = \"左键开/关货币界面\"\nL_STATS_RC_AUTO_SELLING = \"右键开/关自动出售\"\nL_STATS_NEED_TO_SELL = \"键入 /junk 列出常用命令\"\nL_STATS_WATCH_CURRENCY = \"在货币界面已选定的货币将在金幣提示信息中显示\"\nL_STATS_OTHER_OPTIONS = \"其它选项可以在这里设置: %s\"\n\n-- Slash commands\nL_SLASHCMD_HELP = {\n\t\"可用的命令: \",\n\t\"/rl - 重载界面\",\n\t\"/rc - 就位确认\",\n\t\"/gm - 开启GM界面\",\n\t\"/dis ADDON_NAME - 禁用指定插件\",\n\t\"/en ADDON_NAME - 启用指定插件\",\n\t\"/rd - 解散队伍\",\n\t\"/toraid - 转换为队伍/团队\",\n\t\"/teleport - 传送随机副本\",\n\t\"/ss - 切换天赋\",\n\t\"/tt - 密语当前目标\",\n\t\"/farmmode - 开启/关闭小地图采集模式\",\n\t\"/resetui - 重置一般设置到初始值\",\n\t\"/resetuf - 重置头像框架到初始位置\",\n\t\"/resetconfig - 重置ShestakUI_Config到初始值\",\n\t\"/resetstats - 重置所有角色游戏时间和金币的统计数据\",\n\t\"/settings - 设置指定插件\",\n\t\"/ls - 信息条功能说明\",\n\t\"/xct - 战斗信息选项\",\n\t\"/raidcd - 团队技能冷却测试模式\",\n\t\"/enemycd - 敌对技能冷却测试模式\",\n\t\"/pulsecd - 技能冷却闪烁测试模式\",\n\t\"/threat - 仇恨栏測試模式\",\n\t\"/testuf - 头像框架测试模式\",\n\t\"/moveui - 解锁/锁定 界面中所有可移动的框体，Ctrl+右键选中的框架重置到预设位置\", -- Need review\n\t\"/cfg - 开启ShestakUI设置界面\",\n}\n"
  },
  {
    "path": "ShestakUI/Locales/English.lua",
    "content": "----------------------------------------------------------------------------------------\n--\tLocalization for enUS and enGB client\n----------------------------------------------------------------------------------------\n-- Announce flasks and food\nL_ANNOUNCE_FF_NOFOOD = \"No Food: \"\nL_ANNOUNCE_FF_NOFLASK = \"No Flask: \"\nL_ANNOUNCE_FF_ALLBUFFED = \"All Buffed!\"\nL_ANNOUNCE_FF_CHECK_BUTTON = \"Check food and flask\"\n\n-- Says thanks for some spells\nL_ANNOUNCE_SS_THANKS = \"Thanks for \"\nL_ANNOUNCE_SS_RECEIVED = \" received from \"\n\n-- Pull countdown announce\nL_ANNOUNCE_PC_GO = \"GO!\"\nL_ANNOUNCE_PC_MSG = \"Pulling %s in %s..\"\nL_ANNOUNCE_PC_ABORTED = \"Pull ABORTED!\"\n\n-- Announce feasts and portals\nL_ANNOUNCE_FP_PRE = \"%s has prepared a %s.\"\nL_ANNOUNCE_FP_PUT = \"%s has put down a %s.\"\nL_ANNOUNCE_FP_CAST = \"%s is casting %s.\"\nL_ANNOUNCE_FP_CLICK = \"%s is casting %s. Click!\"\nL_ANNOUNCE_FP_USE = \"%s used a %s.\"\n\n-- Announce your interrupts\nL_ANNOUNCE_INTERRUPTED = INTERRUPTED\n\n-- Tooltip\nL_TOOLTIP_NO_TALENT = \"No Talents\"\nL_TOOLTIP_LOADING = \"Loading...\"\nL_TOOLTIP_ACH_STATUS = \"Your Status:\"\nL_TOOLTIP_ACH_COMPLETE = \"Your Status: Completed on \"\nL_TOOLTIP_ACH_INCOMPLETE = \"Your Status: Incomplete\"\nL_TOOLTIP_SPELL_ID = \"Spell ID:\"\nL_TOOLTIP_ITEM_ID = \"Item ID:\"\nL_TOOLTIP_WHO_TARGET = \"Targeted By\"\nL_TOOLTIP_ITEM_COUNT = \"Item count:\"\nL_TOOLTIP_INSPECT_OPEN = \"Inspect Frame is open\"\n\n-- Misc\nL_MISC_UNDRESS = \"Undress\"\nL_MISC_DRINKING = \" is drinking.\"\nL_MISC_BUY_STACK = \"Alt-Click to buy a stack\"\nL_MISC_UI_OUTDATED = \"Your version of ShestakUI is out of date. You can download the latest version from www.shestak.org\"\nL_MISC_HEADER_MARK = \"Mouseover Raid Icons\"\nL_MISC_BINDER_OPEN = \"Mouse Bindings\"\nL_MISC_SCROLL = \"Scroll\"\nL_MISC_HEADER_QUEST = \"Auto quest button\"\nBINDING_NAME_QUEST_BUTTON = AUCTION_HOUSE_HEADER_ITEM\n\n-- Raid Utility\nL_RAID_UTIL_DISBAND = \"Disband Group\"\n\n-- Zone name\nL_ZONE_ANCIENTDALARAN = \"Dalaran Crater\"\n\n-- WatchFrame Wowhead link\nL_WATCH_WOWHEAD_LINK = \"Wowhead link\"\n\n-- Toggle Menu\nL_TOGGLE_ADDON = \"Addon \"\nL_TOGGLE_ADDONS = \" addons\"\nL_TOGGLE_EXPAND = \"Expand \"\nL_TOGGLE_COLLAPSE = \"Collapse \"\nL_TOGGLE_RCLICK = \"Right click to enable or disable \"\nL_TOGGLE_LCLICK = \"Left click to toggle window \"\nL_TOGGLE_RELOAD = \" (needs UI reload)\"\nL_TOGGLE_NOT_FOUND = \" not found.\"\n\n-- UnitFrame\nL_UF_GHOST = \"Ghost\"\nL_UF_DEAD = \"Dead\"\nL_UF_OFFLINE = \"Offline\"\nL_UF_MANA = \"Low mana\"\n\n-- Map\nL_MAP_CURSOR = \"Cursor: \"\nL_MAP_BOUNDS = \"Out of bounds!\"\nL_MAP_FOG = \"Fog of War\"\nL_MAP_COORDS = \"Coordinates\"\n\n-- Minimap\nL_MINIMAP_CALENDAR = \"Calendar\"\nL_MINIMAP_FARM = \"Minimap size\"\nL_MINIMAP_TOGGLE = \"Toggle action bars\"\n\n-- Chat\nL_CHAT_WHISPER = \"From\"\nL_CHAT_BN_WHISPER = \"From\"\nL_CHAT_AFK = \"[AFK]\"\nL_CHAT_DND = \"[DND]\"\nL_CHAT_GM = \"[GM]\"\nL_CHAT_GUILD = \"G\"\nL_CHAT_PARTY = \"P\"\nL_CHAT_PARTY_LEADER = \"PL\"\nL_CHAT_RAID = \"R\"\nL_CHAT_RAID_LEADER = \"RL\"\nL_CHAT_RAID_WARNING = \"RW\"\nL_CHAT_INSTANCE_CHAT = \"I\"\nL_CHAT_INSTANCE_CHAT_LEADER = \"IL\"\nL_CHAT_OFFICER = \"O\"\nL_CHAT_PET_BATTLE = \"PB\"\nL_CHAT_COME_ONLINE = \"has come |cff298F00online|r.\"\nL_CHAT_GONE_OFFLINE = \"has gone |cffff0000offline|r.\"\n\n-- Errors frame\nL_ERRORFRAME_L = \"Click to view errors.\"\n\n-- Bags\nL_BAG_SHOW_BAGS = \"Show Bags\"\nL_BAG_RIGHT_CLICK_SEARCH = \"Right-click to search\"\nL_BAG_STACK_MENU = \"Stack\"\nL_BAG_RIGHT_CLICK_CLOSE = \"Right-click to open menu\"\n\n-- Grab mail\nL_MAIL_STOPPED = \"Stopped, inventory is full.\"\nL_MAIL_UNIQUE = \"Stopped. Found a duplicate unique item in bag or in bank.\"\nL_MAIL_COMPLETE = \"All done.\"\nL_MAIL_NEED = \"Need a mailbox.\"\nL_MAIL_MESSAGES = \"messages\"\n\n-- Loot\nL_LOOT_RANDOM = \"Random Player\"\nL_LOOT_SELF = \"Self Loot\"\nL_LOOT_FISH = \"Fishing loot\"\nL_LOOT_ANNOUNCE = \"Announce to\"\nL_LOOT_TO_RAID = \"  raid\"\nL_LOOT_TO_PARTY = \"  party\"\nL_LOOT_TO_GUILD = \"  guild\"\nL_LOOT_TO_SAY = \"  say\"\n\n-- LitePanels AFK module\nL_PANELS_AFK = \"You are AFK!\"\nL_PANELS_AFK_RCLICK = \"Right-Click to hide.\"\nL_PANELS_AFK_LCLICK = \"Left-Click to go back.\"\n\n-- Cooldowns\nL_COOLDOWNS = \"CD: \"\nL_COOLDOWNS_COMBATRESS = \"BattleRes\"\nL_COOLDOWNS_COMBATRESS_REMAINDER = \"Battle Resurrection: \"\nL_COOLDOWNS_NEXTTIME = \"Next time: \"\n\n-- Bind key\nL_BIND_SAVED = \"All keybindings have been saved.\"\nL_BIND_DISCARD = \"All newly set keybindings have been discarded.\"\nL_BIND_INSTRUCT = \"Hover your mouse over any actionbutton to bind it. Press the escape key or right click to clear the current actionbutton's keybinding.\"\nL_BIND_CLEARED = \"All keybindings cleared for\"\nL_BIND_BINDING = \"Binding\"\nL_BIND_KEY = \"Key\"\nL_BIND_NO_SET = \"No bindings set\"\n\n-- Info text\nL_INFO_ERRORS = \"No error yet.\"\nL_INFO_INVITE = \"Accepted invite from \"\nL_INFO_DUEL = \"Declined duel request from \"\nL_INFO_PET_DUEL = \"Declined pet duel request from \"\nL_INFO_DISBAND = \"Disbanding group...\"\nL_INFO_SETTINGS_DBM = \"Type /settings dbm, to apply the settings DBM.\"\nL_INFO_SETTINGS_BIGWIGS = \"Type /settings bw, to apply the settings BigWigs.\"\nL_INFO_SETTINGS_MSBT = \"Type /settings msbt, to apply the settings MSBT.\"\nL_INFO_SETTINGS_SKADA = \"Type /settings skada, to apply the settings Skada.\"\nL_INFO_SETTINGS_ALL = \"Type /settings all, to apply the settings for all modifications.\"\nL_INFO_NOT_INSTALLED = \" is not installed.\"\nL_INFO_SKIN_DISABLED1 = \"Stylization for \"\nL_INFO_SKIN_DISABLED2 = \" is disabled.\"\n\n-- Moving elements\nL_MOVE_RIGHT_CLICK = \"Right-click to reset position\"\nL_MOVE_MIDDLE_CLICK = \"Middle-click to temp hide\"\n\n-- Popups\nL_POPUP_INSTALLUI = \"First time on ShestakUI with this Character. You must reload UI to configure it.\"\nL_POPUP_RESETUI = \"Are you sure you want to reset all settings for ShestakUI?\"\nL_POPUP_RESETSTATS = \"Are you sure you want to reset statistics for time spent in game and gold.\"\nL_POPUP_DISBAND_RAID = \"Are you sure you want to disband the group?\"\nL_POPUP_DISABLEUI = \"ShestakUI doesn't work for this resolution, do you want to disable ShestakUI? (Cancel if you want to try another resolution)\"\nL_POPUP_SETTINGS_ALL = \"Apply settings for all modifications? (DBM, BigWigs, Skada and MSBT)\"\nL_POPUP_SETTINGS_DBM = \"Need to change the position of elements DBM.\"\nL_POPUP_SETTINGS_BW = \"Need to change the position of elements BigWigs.\"\nL_POPUP_ARMORY = \"Armory\"\n\n-- Welcome message\nL_WELCOME_LINE_1 = \"Welcome to ShestakUI \"\nL_WELCOME_LINE_2_1 = \"Type /cfg to config interface, or visit http://shestak.org\"\nL_WELCOME_LINE_2_2 = \"for more information.\"\n\n-- Combat text\nL_COMBATTEXT_KILLING_BLOW = \"Killing Blow\"\nL_COMBATTEXT_TEST_DISABLED = \"Combat text test mode disabled.\"\nL_COMBATTEXT_TEST_ENABLED = \"Combat text test mode enabled.\"\nL_COMBATTEXT_TEST_USE_MOVE = \"Type /xct move to move and resize combat text frames.\"\nL_COMBATTEXT_TEST_USE_TEST = \"Type /xct test to toggle combat text testmode.\"\nL_COMBATTEXT_TEST_USE_RESET = \"Type /xct reset to restore default positions.\"\nL_COMBATTEXT_POPUP = \"To save combat text window positions you need to reload your UI.\"\nL_COMBATTEXT_UNSAVED = \"Combat text window positions unsaved, don't forget to reload UI.\"\nL_COMBATTEXT_UNLOCKED = \"Combat text unlocked.\"\n\n-- LiteStats\nL_STATS_AUTO_REPAIR = \"AutoRepair\"\nL_STATS_GUILD_REPAIR = \"Repair from guild bank\"\nL_STATS_AUTO_SELL = \"AutoSell junk\"\nL_STATS_BANDWIDTH = \"Bandwidth:\"\nL_STATS_DOWNLOAD = \"Download:\"\nL_STATS_CURRENCY_RAID = \"Raid Seals\"\nL_STATS_MEMORY_USAGE = \"Blizzard UI Memory Usage:\"\nL_STATS_TOTAL_MEMORY_USAGE = \"Total Memory Usage:\"\nL_STATS_TOTAL_CPU_USAGE = \"Total CPU Usage:\"\nL_STATS_GARBAGE_COLLECTED = \"Garbage collected\"\nL_STATS_HIDDEN = \"Hidden\"\nL_STATS_JUNK_ALREADY_ADDITIONS = \"is already in additions list.\"\nL_STATS_JUNK_ITEMLINK = \"itemlink\"\nL_STATS_JUNK_ADDITIONS = \"Junk additions\"\nL_STATS_JUNK_LIST = \"Junk List\"\nL_STATS_JUNK_PROFIT = \"Junk profit\"\nL_STATS_JUNK_CLEARED = \"Junk list cleared.\"\nL_STATS_JUNK_CLEAR_ADDITIONS = \"Clear additions list.\"\nL_STATS_JUNK_ADDED = \"Added junk additions\"\nL_STATS_JUNK_ADD_ITEM = \"Add/remove items.\"\nL_STATS_JUNK_REMOVED = \"Removed junk additions\"\nL_STATS_JUNK_ITEMS_LIST = \"List for sell items.\"\nL_STATS_KILLS = \"K\"\nL_STATS_XP_RATE = \"Level XP rate\"\nL_STATS_HR = \"hr\"\nL_STATS_INF = \"inf\"\nL_STATS_ON = \"ON\"\nL_STATS_PLAYED_LEVEL = \"Played this level\"\nL_STATS_PLAYED_SESSION = \"Played this session\"\nL_STATS_ACC_PLAYED = \"Account Played\"\nL_STATS_PLAYED_TOTAL = \"Played total\"\nL_STATS_QUEST = \"Q\"\nL_STATS_QUESTS_TO = \"Quests/Kills to %s\"\nL_STATS_CURRENT_XP = \"Current/Max XP\"\nL_STATS_REMAINING_XP = \"Remaining XP\"\nL_STATS_RESTED_XP = \"Rested XP\"\nL_STATS_SERVER_GOLD = \"Server Gold\"\nL_STATS_SESSION_GAIN = \"Session Gain/Loss\"\nL_STATS_SESSION_XP = \"Session XP rate\"\nL_STATS_SORTING_BY = \"Sorting by\"\nL_STATS_SEALS = \"Seals this week\"\nL_STATS_SPEC = \"Spec\"\nL_STATS_TIPS = \"tips:\"\nL_STATS_OPEN_CALENDAR = \"Left-Click opens calendar.\"\nL_STATS_RC_TIME_MANAGER = \"Right-Click opens time manager frame.\"\nL_STATS_TOGGLE_TIME = \"Local/realm & 24hr time can be toggled from the time manager.\"\nL_STATS_MEMORY = \"Memory\"\nL_STATS_RC_COLLECTS_GARBAGE = \"Right-Click collects Lua garbage.\"\nL_STATS_VIEW_NOTES = \"Hold alt key to view ranks, notes and officer notes.\"\nL_STATS_CHANGE_SORTING = \"[Guild] Right-Click to invite and whisper, Middle-Click to change the sorting, Shift-Middle-Click to reverse order.\"\nL_STATS_OPEN_CHARACTER = \"Left-Click opens character tab.\"\nL_STATS_RC_AUTO_REPAIRING1 = \"Right-Click toggles auto repairing.\"\nL_STATS_RC_AUTO_REPAIRING2 = \"Middle-Click toggles guild auto repairing.\"\nL_STATS_EQUIPMENT_CHANGER = \"Shift-Click or Alt-Click for equipment set changer.\"\nL_STATS_RC_EXPERIENCE = \"Right-Click to cycle through experience, time played, and faction watcher.\"\nL_STATS_WATCH_FACTIONS = \"Watch factions from the character faction UI.\"\nL_STATS_TOOLTIP_EXPERIENCE = \"When below max level, a tooltip will be displayed with experience details.\"\nL_STATS_TOOLTIP_TIME_PLAYED = \"When at max level, the tooltip will show time played details for the account.\"\nL_STATS_OPEN_TALENT = \"Left-Click toggles your talent specialization.\"\nL_STATS_RC_TALENT = \"Right-Click toggles your loot specialization.\"\nL_STATS_LOCATION = \"Location/Coords\"\nL_STATS_WORLD_MAP = \"Clicking opens world map.\"\nL_STATS_INSERTS_COORDS = \"Shift-Clicking location or coords module inserts your coords into chat.\"\nL_STATS_OPEN_CURRENCY = \"Left-Click opens currency tab.\"\nL_STATS_RC_AUTO_SELLING = \"Right-Click toggles auto selling.\"\nL_STATS_NEED_TO_SELL = \"Use /junk to configure which items need to sell.\"\nL_STATS_WATCH_CURRENCY = \"Watched currency tab items will reflect onto the tooltip.\"\nL_STATS_OTHER_OPTIONS = \"Other options may be configured in %s\"\n\n-- Slash commands\nL_SLASHCMD_HELP = {\n\t\"Available slash commands:\",\n\t\"/rl - Reload interface.\",\n\t\"/rc - Activates a ready check.\",\n\t\"/gm - Opens GM frame.\",\n\t\"/dis ADDON_NAME - Disable Addon.\",\n\t\"/en ADDON_NAME - Enable Addon.\",\n\t\"/rd - Disband party or raid.\",\n\t\"/toraid - Convert to party or raid.\",\n\t\"/teleport - Teleportation from random dungeon.\",\n\t\"/ss - Switches between talent spec's.\",\n\t\"/tt - Whisper target.\",\n\t\"/farmmode - Increase the size of the minimap.\",\n\t\"/resetui - Resets general settings to default.\",\n\t\"/resetuf - Resets the unit frames to their default position.\",\n\t\"/resetconfig - Resets ShestakUI_Config settings.\",\n\t\"/resetstats - Resets the statistics of gold and time spent.\",\n\t\"/settings - Applies settings to msbt, dbm, skada, bw addons.\",\n\t\"/ls - Help for LiteStats.\",\n\t\"/xct - Manage the combat text.\",\n\t\"/raidcd - Raid cooldown test.\",\n\t\"/enemycd - Enemy cooldown test.\",\n\t\"/pulsecd - Self cooldown pulse test.\",\n\t\"/threat - Threat meter test.\",\n\t\"/testuf - Unit frame test.\",\n\t\"/moveui - Allows the movement of interface elements. Right-Click to reset position\",\n\t\"/cfg - Opens interface settings.\",\n}"
  },
  {
    "path": "ShestakUI/Locales/French.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif T.client ~= \"frFR\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for frFR client\n--\tTranslation: Cranan, Puree, AlbertDuval, Skyzo-be\n----------------------------------------------------------------------------------------\n-- Announce flasks and food\nL_ANNOUNCE_FF_NOFOOD = \"Sans nourriture : \"\nL_ANNOUNCE_FF_NOFLASK = \"Sans flacon : \"\nL_ANNOUNCE_FF_ALLBUFFED = \"Tout le monde possède sa nourriture et son flacon !\"\nL_ANNOUNCE_FF_CHECK_BUTTON = \"Vérifier nourriture et flacon\"\n\n-- Says thanks for some spells\nL_ANNOUNCE_SS_THANKS = \"Merci pour \"\nL_ANNOUNCE_SS_RECEIVED = \" reçu de \"\n\n-- Pull countdown announce\nL_ANNOUNCE_PC_GO = \"Départ !\"\nL_ANNOUNCE_PC_MSG = \"Pull %s dans %s..\"\nL_ANNOUNCE_PC_ABORTED = \"Pull ABANDONNE !\"\n\n-- Announce feasts and portals\nL_ANNOUNCE_FP_PRE = \"%s a préparé un %s.\"\nL_ANNOUNCE_FP_PUT = \"%s a déposé au sol un %s.\"\nL_ANNOUNCE_FP_CAST = \"%s lance le sort %s.\"\nL_ANNOUNCE_FP_CLICK = \"%s invoque %s. Cliquez !\"\nL_ANNOUNCE_FP_USE = \"%s a utilisé : %s.\"\n\n-- Announce your interrupts\nL_ANNOUNCE_INTERRUPTED = INTERRUPTED\n\n-- Tooltip\nL_TOOLTIP_NO_TALENT = \"Aucun talent\"\nL_TOOLTIP_LOADING = \"Chargement...\"\nL_TOOLTIP_ACH_STATUS = \"Votre statut : \"\nL_TOOLTIP_ACH_COMPLETE = \"Votre statut : Terminé\"\nL_TOOLTIP_ACH_INCOMPLETE = \"Votre statut : Non terminé\"\nL_TOOLTIP_SPELL_ID = \"ID du sort :\"\nL_TOOLTIP_ITEM_ID = \"ID de l'objet :\"\nL_TOOLTIP_WHO_TARGET = \"Est la cible de :\"\nL_TOOLTIP_ITEM_COUNT = \"Objet(s) possédé(s) :\"\nL_TOOLTIP_INSPECT_OPEN = \"La fenêtre d'inspection est ouverte\"\n\n-- Misc\nL_MISC_UNDRESS = \"Déshabillé\"\nL_MISC_DRINKING = \" est entrain de boire.\"\nL_MISC_BUY_STACK = \"Alt-Clic pour acheter une pile d'objet\"\nL_MISC_UI_OUTDATED = \"Une version plus récente de ShestakUI est disponible. Vous pouvez la télécharger sur www.shestak.org\"\nL_MISC_HEADER_MARK = \"Icône de raid au survol de la souris\"\nL_MISC_BINDER_OPEN = \"Assignations des boutons de la souris\"\nL_MISC_SCROLL = \"Parchemin\"\nL_MISC_HEADER_QUEST = \"Auto quest button\" -- Needs review\n\n-- Raid Utility\nL_RAID_UTIL_DISBAND = \"Dissoudre le raid\"\n\n-- Zone name\nL_ZONE_ANCIENTDALARAN = \"Cratère de Dalaran\"\n\n-- WatchFrame Wowhead link\nL_WATCH_WOWHEAD_LINK = \"Lien Wowhead\"\n\n-- Toggle Menu\nL_TOGGLE_ADDON = \"Addon \"\nL_TOGGLE_ADDONS = \" addons\"\nL_TOGGLE_EXPAND = \"Permet d'ajouter des barres \"\nL_TOGGLE_COLLAPSE = \"Permet de réduire les barres \"\nL_TOGGLE_RCLICK = \"Faites un clic droit pour activer ou désactiver \"\nL_TOGGLE_LCLICK = \"Clic gauche pour basculer la fenêtre \"\nL_TOGGLE_RELOAD = \" (recharger votre UI)\"\nL_TOGGLE_NOT_FOUND = \" non trouvé.\"\n\n-- UnitFrame\nL_UF_GHOST = \"Fantôme\"\nL_UF_DEAD = \"Mort\"\nL_UF_OFFLINE = \"Hors ligne\"\nL_UF_MANA = \"Mana faible\"\n\n-- Map\nL_MAP_CURSOR = \"Curseur : \"\nL_MAP_BOUNDS = \"En dehors de la carte !\"\nL_MAP_FOG = \"Zone non découverte\"\nL_MAP_COORDS = \"Coordonnées\"\n\n-- Minimap\nL_MINIMAP_CALENDAR = \"Calendrier\"\nL_MINIMAP_FARM = \"Taille de la minimap\"\nL_MINIMAP_TOGGLE = \"Activer/Désactiver le mode d'extension des barres d'action\"\n\n-- Chat\nL_CHAT_WHISPER = \"De\"\nL_CHAT_BN_WHISPER = \"De\"\nL_CHAT_AFK = \"[AFK]\"\nL_CHAT_DND = \"[DND]\"\nL_CHAT_GM = \"[GM]\"\nL_CHAT_GUILD = \"G\"\nL_CHAT_PARTY = \"P\"\nL_CHAT_PARTY_LEADER = \"PL\"\nL_CHAT_RAID = \"R\"\nL_CHAT_RAID_LEADER = \"RL\"\nL_CHAT_RAID_WARNING = \"AR\"\nL_CHAT_INSTANCE_CHAT = \"I\"\nL_CHAT_INSTANCE_CHAT_LEADER = \"IL\"\nL_CHAT_OFFICER = \"O\"\nL_CHAT_PET_BATTLE = \"BP\"\nL_CHAT_COME_ONLINE = \"vient de se |cff298F00connecter|r.\"\nL_CHAT_GONE_OFFLINE = \"vient de se |cffff0000déconnecter|r.\"\n\n-- Errors frame\nL_ERRORFRAME_L = \"Clic gauche pour afficher les erreurs.\"\n\n-- Bags\nL_BAG_SHOW_BAGS = \"Montrer les sacs\"\nL_BAG_RIGHT_CLICK_SEARCH = \"Clic droit pour rechercher\"\nL_BAG_STACK_MENU = \"Empiler\"\nL_BAG_RIGHT_CLICK_CLOSE = \"Clic droit pour ouvrir le menu\"\n\n-- Grab mail\nL_MAIL_STOPPED = \"Inventaire plein.\"\nL_MAIL_UNIQUE = \"Arrêt. Un objet unique a été trouvé dans le sac ou à la banque.\"\nL_MAIL_COMPLETE = \"Terminé.\"\nL_MAIL_NEED = \"Vous avez besoin d'une boîte aux lettres.\"\nL_MAIL_MESSAGES = \"messages\"\n\n-- Loot\nL_LOOT_RANDOM = \"Joueur aléatoire\"\nL_LOOT_SELF = \"Procurez-vous un\"\nL_LOOT_FISH = \"Pêche\"\nL_LOOT_ANNOUNCE = \"Déclarer\"\nL_LOOT_TO_RAID = \"  raid\"\nL_LOOT_TO_PARTY = \"  groupe\"\nL_LOOT_TO_GUILD = \"  corps\"\nL_LOOT_TO_SAY = \"  dire\"\n\n-- LitePanels AFK module\nL_PANELS_AFK = \"Tu es AFK !\"\nL_PANELS_AFK_RCLICK = \"Clic droit pour cacher.\"\nL_PANELS_AFK_LCLICK = \"Clic gauche pour revenir.\"\n\n-- Cooldowns\nL_COOLDOWNS = \"Temps de recharge : \"\nL_COOLDOWNS_COMBATRESS = \"Résurrection en combat\"\nL_COOLDOWNS_COMBATRESS_REMAINDER = \"Résurrection en combat : \"\nL_COOLDOWNS_NEXTTIME = \"Suivant : \"\n\n-- Bind key\nL_BIND_SAVED = \"Vos assignations de touches ont été sauvegardées.\"\nL_BIND_DISCARD = \"Vos nouvelles assignations de touches n'ont pas été sauvegardées.\"\nL_BIND_INSTRUCT = \"Passez votre souris sur la barre d'action pour l'assigner. Appuyez sur la touche échappe ou faites un clic droit pour effacer le bouton d'action en cours.\"\nL_BIND_CLEARED = \"Tous les raccourcis ont été réinitialisés pour\"\nL_BIND_BINDING = \"Raccourcis\"\nL_BIND_KEY = \"Touche\"\nL_BIND_NO_SET = \"Pas encore de raccourcis\"\n\n-- Info text\nL_INFO_ERRORS = \"Pas d'erreur pour le moment.\"\nL_INFO_INVITE = \"Invitation acceptée par \"\nL_INFO_DUEL = \"Duel rejetée par \"\nL_INFO_PET_DUEL = \"Duel de familier décliné par \"\nL_INFO_DISBAND = \"Groupe dissous...\"\nL_INFO_SETTINGS_DBM = \"Taper /settings dbm, pour configurer DBM automatiquement.\"\nL_INFO_SETTINGS_BIGWIGS = \"Taper /settings bw, pour configurer BigWigs automatiquement.\"\nL_INFO_SETTINGS_MSBT = \"Taper /settings msbt, pour configurer msbt automatiquement.\"\nL_INFO_SETTINGS_SKADA = \"Taper /settings skada, pour configurer skada automatiquement.\"\nL_INFO_SETTINGS_ALL = \"Taper /settings all, pour tout configurer automatiquement.\"\nL_INFO_NOT_INSTALLED = \" n'est pas installé.\"\nL_INFO_SKIN_DISABLED1 = \"Personnalisation pour \"\nL_INFO_SKIN_DISABLED2 = \" est désactivé.\"\n\n-- Moving elements\nL_MOVE_RIGHT_CLICK = \"Clique droit de la souris pour réinitialiser la position\"\nL_MOVE_MIDDLE_CLICK = \"Clique du milieu de la souris pour cacher temporairement\"\n\n-- Popups\nL_POPUP_INSTALLUI = \"Première utilisation de ShestakUI avec ce personnage. Vous devez recharger l'interface utilisateur pour le configurer.\"\nL_POPUP_RESETUI = \"Etes-vous sûr de vouloir réinitialiser ShestakUI ?\"\nL_POPUP_RESETSTATS = \"Réinitialiser les statistiques pour le temps passé dans le jeu ?\"\nL_POPUP_DISBAND_RAID = \"Etes-vous sûr de vouloir dissoudre le groupe ?\"\nL_POPUP_DISABLEUI = \"ShestakUI ne fonctionne pas avec cette résolution, voulez-vous désactiver ShestakUI ? (Annuler si vous souhaitez essayer une autre résolution)\"\nL_POPUP_SETTINGS_ALL = \"Voulez-vous appliquer les modifications pour tout ? (DBM, BigWigs, Skada et MSBT)\"\nL_POPUP_SETTINGS_DBM = \"La position des éléments de DBM doit être changée.\"\nL_POPUP_SETTINGS_BW = \"La position des éléments de BigWigs doit être changée.\"\nL_POPUP_ARMORY = \"Armurerie\"\n\n-- Welcome message\nL_WELCOME_LINE_1 = \"Bienvenue sur ShestakUI \"\nL_WELCOME_LINE_2_1 = \"Tapez /cfg pour configurer l'interface, ou visitez http://shestak.org\"\nL_WELCOME_LINE_2_2 = \"pour plus d'informations\"\n\n-- Combat text\nL_COMBATTEXT_KILLING_BLOW = \"Coup Fatal\"\nL_COMBATTEXT_TEST_DISABLED = \"Mode test de la fenêtre des textes de combat désactivé.\"\nL_COMBATTEXT_TEST_ENABLED = \"Mode test de la fenêtre des textes de combat activé.\"\nL_COMBATTEXT_TEST_USE_MOVE = \"Tapez /xct move pour bouger et redimensionner la fenêtre des textes de combat.\"\nL_COMBATTEXT_TEST_USE_TEST = \"Tapez /xct test pour activer le mode test de la fenêtre des textes de combat.\"\nL_COMBATTEXT_TEST_USE_RESET = \"Type /xct reset pour réstaurer les positions par défaut.\"\nL_COMBATTEXT_POPUP = \"Pour sauvegardez vos modifications vous devez recharger l'interface.\"\nL_COMBATTEXT_UNSAVED = \"Position de la fenêtre des textes de combat non saugardez, n'oubliez pas de recharger l'interface.\"\nL_COMBATTEXT_UNLOCKED = \"Fenêtre des textes de combat déverrouillée.\"\n\n-- LiteStats\nL_STATS_AUTO_REPAIR = \"Réparation automatique\"\nL_STATS_GUILD_REPAIR = \"Réparation automatique avec la banque de guilde\"\nL_STATS_AUTO_SELL = \"Vente automatique d'objet\"\nL_STATS_BANDWIDTH = \"Bande passante :\"\nL_STATS_DOWNLOAD = \"Téléchargement :\"\nL_STATS_CURRENCY_RAID = \"Sceaux de raid\"\nL_STATS_MEMORY_USAGE = \"Usage mémoire pour l'interface Blizzard :\"\nL_STATS_TOTAL_MEMORY_USAGE = \"Utilisation mémoire :\"\nL_STATS_TOTAL_CPU_USAGE = \"Utilisation processeur :\"\nL_STATS_GARBAGE_COLLECTED = \"Déchets ramassés\"\nL_STATS_HIDDEN = \"Caché\"\nL_STATS_JUNK_ALREADY_ADDITIONS = \"est déjà dans la liste des objets indésirables.\"\nL_STATS_JUNK_ITEMLINK = \"élément Lien\"\nL_STATS_JUNK_ADDITIONS = \"Ajout à la liste des indésirables\"\nL_STATS_JUNK_LIST = \"Liste de camelote\"\nL_STATS_JUNK_PROFIT = \"Camelote profit\"\nL_STATS_JUNK_CLEARED = \"Liste des indésirables effacée.\"\nL_STATS_JUNK_CLEAR_ADDITIONS = \"Effacer la liste des indésirables.\"\nL_STATS_JUNK_ADDED = \"Ajouté à la liste des objets indésirables\"\nL_STATS_JUNK_ADD_ITEM = \"Ajouter/retirer des objets.\"\nL_STATS_JUNK_REMOVED = \"Retiré de la liste des objets indésirables\"\nL_STATS_JUNK_ITEMS_LIST = \"Liste des objets à vendre.\"\nL_STATS_KILLS = \"Tuer\"\nL_STATS_XP_RATE = \"Niveau/taux de votre XP\"\nL_STATS_HR = \"Par heure\"\nL_STATS_INF = \"infini\"\nL_STATS_ON = \"ON\"\nL_STATS_PLAYED_LEVEL = \"Temps joué à ce niveau\"\nL_STATS_PLAYED_SESSION = \"Temps joué à cette session\"\nL_STATS_ACC_PLAYED = \"Temps joué pour le compte\"\nL_STATS_PLAYED_TOTAL = \"Temps joué total\"\nL_STATS_QUEST = \"Quête\"\nL_STATS_QUESTS_TO = \"Quêtes/Tuer à %s\"\nL_STATS_CURRENT_XP = \"XP courant/max\"\nL_STATS_REMAINING_XP = \"XP restant\"\nL_STATS_RESTED_XP = \"XP reposé\"\nL_STATS_SERVER_GOLD = \"Or possédé sur le serveur\"\nL_STATS_SESSION_GAIN = \"Session Gain/Perte\"\nL_STATS_SESSION_XP = \"XP session taux\"\nL_STATS_SORTING_BY = \"Tri par\"\nL_STATS_SEALS = \"Sceau cette semaine\"\nL_STATS_SPEC = \"Spé\"\nL_STATS_TIPS = \"Conseils :\"\nL_STATS_OPEN_CALENDAR = \"Clic-Gauche ouvre le calendrier.\"\nL_STATS_RC_TIME_MANAGER = \"Clic-Droit pour ouvrir la fenêtre de gestion du temps.\"\nL_STATS_TOGGLE_TIME = \"Local/Royaume & mode 24 heures le temps peut être changé, dans la gestion des fenêtres de temps.\"\nL_STATS_MEMORY = \"Mémoire\"\nL_STATS_RC_COLLECTS_GARBAGE = \"Cliquez-droit sur Lua recueille les déchets.\"\nL_STATS_VIEW_NOTES = \"Maintenez enfoncé la touche Alt pour voir les grades, notes et notes d'officiers.\"\nL_STATS_CHANGE_SORTING = \"[Guild] Clic-Droit pour inviter et chuchoter, Clic-Milieu pour changer le type de tri, Maj-Clic-Centre pour inverser l'ordre.\"\nL_STATS_OPEN_CHARACTER = \"Clic-Gauche ouvre l'onglet caractère.\"\nL_STATS_RC_AUTO_REPAIRING1 = \"Clic-Droit permet de basculer en mode réparation auto.\"\nL_STATS_RC_AUTO_REPAIRING2 = \"Bouton du milieu pour activer la réparation automatique de Guilde.\"\nL_STATS_EQUIPMENT_CHANGER = \"Maj-clic ou alt-clic sur le gestionnaire équipement.\"\nL_STATS_RC_EXPERIENCE = \"Clic-Droit pour faire défiler l'expérience, le temps joué, et la faction à suivre.\"\nL_STATS_WATCH_FACTIONS = \"Superviser les factions de l'onglet de Réputation.\"\nL_STATS_TOOLTIP_EXPERIENCE = \"Quand vous êtes en dessous du niveau maximum, une bulle d'aide affichera les détails concernant votre expérience.\"\nL_STATS_TOOLTIP_TIME_PLAYED = \"Quand vous êtes au niveau maximum, la bulle d'aide affichera les détails du temps de jeu pour ce compte.\"\nL_STATS_OPEN_TALENT = \"Clic-Gauche permet de modifier votre spécialisation.\"\nL_STATS_RC_TALENT = \"Clic-Droit pour modifier la spécialisation utilisée pour le butin.\"\nL_STATS_LOCATION = \"Position/Coords\"\nL_STATS_WORLD_MAP = \"Clic ouvre la carte du monde.\"\nL_STATS_INSERTS_COORDS = \"Maj-clic sur l'emplacement ou coords insère le module de vos coords au chat\"\nL_STATS_OPEN_CURRENCY = \"Clic-Gauche ouvre l'onglet monnaie.\"\nL_STATS_RC_AUTO_SELLING = \"Clic-Droit permet de basculer en mode vente automatique.\"\nL_STATS_NEED_TO_SELL = \"Utiliser /junk pour définir quels objets doivent être vendu.\"\nL_STATS_WATCH_CURRENCY = \"Consulté onglet monnaie articles se reflétera dans l'info bulle.\"\nL_STATS_OTHER_OPTIONS = \"Les autres options peuvent être configurées dans %s\"\n\n-- Slash commands\nL_SLASHCMD_HELP = {\n\t\"Les commandes en ligne disponibles:\",\n\t\"/rl - Recharge l'interface.\",\n\t\"/rc - Lance un appel raid (ready check).\",\n\t\"/gm - Ouvre un ticket MJ.\",\n\t\"/dis ADDON_NAME - Désactive nom_addon.\",\n\t\"/en ADDON_NAME - Active nom_addon.\",\n\t\"/rd - Dissout le groupe ou raid.\",\n\t\"/toraid - Active le mode raid.\",\n\t\"/teleport - Téléportation dans le donjon aléatoire en cours.\",\n\t\"/ss - Bascule d'une spécialisation talent à l'autre.\",\n\t\"/tt - Chuchote à la cible.\",\n\t\"/farmmode - Agrandi la taille de la minimap.\",\n\t\"/resetui - Remet les paramètres généraux à leurs valeurs par défaut.\",\n\t\"/resetuf - Remet les cadres d'unité à leur position par défaut.\",\n\t\"/resetconfig - Remet les paramètres ShestakUI_Config à leurs valeurs par défaut.\",\n\t\"/resetstats - Remet à zéro les statitisques or et temps passé en jeu.\",\n\t\"/settings - Applique les paramètres pour msbt, dbm, skada, ou à tous les addons.\",\n\t\"/ls - Menu d'aide pour LiteStats.\",\n\t\"/xct - Menu d'aide pour le texte de combat.\",\n\t\"/raidcd - Lance un test du temps de recharge Raid.\",\n\t\"/enemycd - Lance un test du temps de recharge Ennemi.\",\n\t\"/pulsecd - Lance un test local de Cooldown pulse.\",\n\t\"/threat - Lance un test des barres de menace.\",\n\t\"/testuf - Lance un test des cadres d'unité.\",\n\t\"/moveui - Permet le déplacement des éléments d’interface. Clic droit pour réinitialiser la position\",\n\t\"/cfg - Ouvre les paramètres de l'interface.\",\n}\n"
  },
  {
    "path": "ShestakUI/Locales/German.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif T.client ~= \"deDE\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for deDE client\n--\tTranslation: Alwa, Baine, Chubidu, F5Hellbound, Sinaris, Vienchen\n----------------------------------------------------------------------------------------\n-- Announce flasks and food\nL_ANNOUNCE_FF_NOFOOD = \"Kein Essen: \"\nL_ANNOUNCE_FF_NOFLASK = \"Kein Fläschchen: \"\nL_ANNOUNCE_FF_ALLBUFFED = \"Alles drin!\"\nL_ANNOUNCE_FF_CHECK_BUTTON = \"Überprüfe Food und Flask\"\n\n-- Says thanks for some spells\nL_ANNOUNCE_SS_THANKS = \"Danke für \"\nL_ANNOUNCE_SS_RECEIVED = \" erhalten von \"\n\n-- Pull countdown announce\nL_ANNOUNCE_PC_GO = \"GO!\"\nL_ANNOUNCE_PC_MSG = \"Pull %s in %s..\"\nL_ANNOUNCE_PC_ABORTED = \"Pull ABGEBROCHEN!\"\n\n-- Announce feasts and portals\nL_ANNOUNCE_FP_PRE = \"%s bereitet ein %s vor.\"\nL_ANNOUNCE_FP_PUT = \"%s stellt ein %s auf.\"\nL_ANNOUNCE_FP_CAST = \"%s zaubert ein %s.\"\nL_ANNOUNCE_FP_CLICK = \"%s zaubert ein %s. Klick!\"\nL_ANNOUNCE_FP_USE = \"%s nahm %s.\"\n\n-- Announce your interrupts\nL_ANNOUNCE_INTERRUPTED = INTERRUPTED\n\n-- Tooltip\nL_TOOLTIP_NO_TALENT = \"Keine Talente\"\nL_TOOLTIP_LOADING = \"Lade...\"\nL_TOOLTIP_ACH_STATUS = \"Dein Fortschritt:\"\nL_TOOLTIP_ACH_COMPLETE = \"Dein Status: Fertig gestellt am \"\nL_TOOLTIP_ACH_INCOMPLETE = \"Dein Status: Noch nicht Ferig\"\nL_TOOLTIP_SPELL_ID = \"Zauber ID:\"\nL_TOOLTIP_ITEM_ID = \"Gegenstands ID:\"\nL_TOOLTIP_WHO_TARGET = \"Anvisiert von\"\nL_TOOLTIP_ITEM_COUNT = \"Gegenstandsanzahl:\"\nL_TOOLTIP_INSPECT_OPEN = \"Betrachtungsfenster offen\"\n\n-- Misc\nL_MISC_UNDRESS = \"Ausziehen\"\nL_MISC_DRINKING = \" trinkt.\"\nL_MISC_BUY_STACK = \"Alt-Klick um einen Stapel zu kaufen\"\nL_MISC_UI_OUTDATED = \"Deine Version von ShestakUI ist veraltet. Du kannst die aktuelle Version von www.shestak.org laden\"\nL_MISC_HEADER_MARK = \"Mausdrüber Raid Icon\"\nL_MISC_BINDER_OPEN = \"Maus gebunden\"\nL_MISC_SCROLL = \"Rolle\"\nL_MISC_HEADER_QUEST = \"Auto quest button\" -- Needs review\n\n-- Raid Utility\nL_RAID_UTIL_DISBAND = \"Gruppe auflösen\"\n\n-- Zone name\nL_ZONE_ANCIENTDALARAN = \"Dalarankrater\"\n\n-- WatchFrame Wowhead link\nL_WATCH_WOWHEAD_LINK = \"Wowhead Link\"\n\n-- Toggle Menu\nL_TOGGLE_ADDON = \"Erweiterung \"\nL_TOGGLE_ADDONS = \" Erweiterungen\"\nL_TOGGLE_EXPAND = \"erweitern \"\nL_TOGGLE_COLLAPSE = \"schließen \"\nL_TOGGLE_RCLICK = \"Rechtsklick zum Aktivieren oder Deaktiveren \"\nL_TOGGLE_LCLICK = \"Links klicken um Fenster aktiv zu halten \"\nL_TOGGLE_RELOAD = \" (benötigt UI neustart)\"\nL_TOGGLE_NOT_FOUND = \" nicht gefunden.\"\n\n-- UnitFrame\nL_UF_GHOST = \"Geist\"\nL_UF_DEAD = \"Tod\"\nL_UF_OFFLINE = \"Offline\"\nL_UF_MANA = \"Niedriges Mana\"\n\n-- Map\nL_MAP_CURSOR = \"Mauszeiger: \"\nL_MAP_BOUNDS = \"Außerhalb der Begrenzung!\"\nL_MAP_FOG = \"Nebel des Krieges\"\nL_MAP_COORDS = \"Koordinaten\"\n\n-- Minimap\nL_MINIMAP_CALENDAR = \"Kalender\"\nL_MINIMAP_FARM = \"Minimap größe\"\nL_MINIMAP_TOGGLE = \"Aktionsleisten umschalten\"\n\n-- Chat\nL_CHAT_WHISPER = \"Von\"\nL_CHAT_BN_WHISPER = \"Von\"\nL_CHAT_AFK = \"[AFK]\"\nL_CHAT_DND = \"[DND]\"\nL_CHAT_GM = \"[GM]\"\nL_CHAT_GUILD = \"G\"\nL_CHAT_PARTY = \"P\"\nL_CHAT_PARTY_LEADER = \"PL\"\nL_CHAT_RAID = \"R\"\nL_CHAT_RAID_LEADER = \"RL\"\nL_CHAT_RAID_WARNING = \"RW\"\nL_CHAT_INSTANCE_CHAT = \"I\"\nL_CHAT_INSTANCE_CHAT_LEADER = \"IL\"\nL_CHAT_OFFICER = \"O\"\nL_CHAT_PET_BATTLE = \"PB\"\nL_CHAT_COME_ONLINE = \"ist jetzt |cff298F00online|r.\"\nL_CHAT_GONE_OFFLINE = \"ist jetzt |cffff0000offline|r.\"\n\n-- Errors frame\nL_ERRORFRAME_L = \"Klick um Fehler anzuzeigen.\"\n\n-- Bags\nL_BAG_SHOW_BAGS = \"Zeige Taschen\"\nL_BAG_RIGHT_CLICK_SEARCH = \"Rechtsklick um zu suchen\"\nL_BAG_STACK_MENU = \"Stapeln\"\nL_BAG_RIGHT_CLICK_CLOSE = \"Rechtsklick öffnet Menü\"\n\n-- Grab mail\nL_MAIL_STOPPED = \"Angehalten, Inventar ist voll.\"\nL_MAIL_UNIQUE = \"Angehalten, dieses einzigartiges Item befindet sich bereits in der Tasche oder auf der Bank.\"\nL_MAIL_COMPLETE = \"Alles Fertig.\"\nL_MAIL_NEED = \"Benötige einen Briefkasten.\"\nL_MAIL_MESSAGES = \"nachrichten\"\n\n-- Loot\nL_LOOT_RANDOM = \"Zufälliger Spieler\"\nL_LOOT_SELF = \"Selbst nehmen\"\nL_LOOT_FISH = \"Angeln\"\nL_LOOT_ANNOUNCE = \"Ansagen\"\nL_LOOT_TO_RAID = \"  schlachtzug\"\nL_LOOT_TO_PARTY = \"  gruppe\"\nL_LOOT_TO_GUILD = \"  gilde\"\nL_LOOT_TO_SAY = \"  sagen\"\n\n-- LitePanels AFK module\nL_PANELS_AFK = \"Du bist AFK!\"\nL_PANELS_AFK_RCLICK = \"Rechts-Klick zum Verstecken.\"\nL_PANELS_AFK_LCLICK = \"Links-Klick um zurück zu gehen.\"\n\n-- Cooldowns\nL_COOLDOWNS = \"Abklingzeit: \"\nL_COOLDOWNS_COMBATRESS = \"Battlerezz\"\nL_COOLDOWNS_COMBATRESS_REMAINDER = \"Battlerezz übrig: \"\nL_COOLDOWNS_NEXTTIME = \"Nächste möglichkeit: \"\n\n-- Bind key\nL_BIND_SAVED = \"Alle Tastenbelegungen wurden gespeichert.\"\nL_BIND_DISCARD = \"Alle grade neu belegten Tastenbelegungen wurden verworfen.\"\nL_BIND_INSTRUCT = \"Bewege deine Maus über einen Aktionsbutton um ihn mit einem Hotkey zu belegen. Drücke Escape oder Rechte Maustaste um die aktuelle Tastenbelegeung des Buttons zu löschen.\"\nL_BIND_CLEARED = \"Alle Tastaturbelegungen gelöscht für\"\nL_BIND_BINDING = \"Belegung\"\nL_BIND_KEY = \"Taste\"\nL_BIND_NO_SET = \"Keine Tastaturbelegung festgelegt\"\n\n-- Info text\nL_INFO_ERRORS = \"Noch keine Fehler.\"\nL_INFO_INVITE = \"Gruppeneinladung akzeptiert von \"\nL_INFO_DUEL = \"Duellanfrage Ignoriert von \"\nL_INFO_PET_DUEL = \"Haustier Duellanfrage Ignoriert von \"\nL_INFO_DISBAND = \"Löse Gruppe auf...\"\nL_INFO_SETTINGS_DBM = \"Gebe /settings dbm ein, um DBM Einstellungen zu laden.\"\nL_INFO_SETTINGS_BIGWIGS = \"Gebe /settings bw ein, um BigWigs Einstellungen zu laden.\"\nL_INFO_SETTINGS_MSBT = \"Gebe /settings msbt ein, um die MSBT Einstellungen zu laden.\"\nL_INFO_SETTINGS_SKADA = \"Gebe /settings skada ein, um die Skada Einstellungen zu laden.\"\nL_INFO_SETTINGS_ALL = \"Gebe /settings all ein, um die Einstellungen für alle unterstützten AddOns zu laden.\"\nL_INFO_NOT_INSTALLED = \" ist nicht installiert.\"\nL_INFO_SKIN_DISABLED1 = \"Stilisierung für \"\nL_INFO_SKIN_DISABLED2 = \" ist ausgeschaltet.\"\n\n-- Moving elements\nL_MOVE_RIGHT_CLICK = \"Right-click to reset position\" -- Needs review\nL_MOVE_MIDDLE_CLICK = \"Middle-click to temp hide\" -- Needs review\n\n-- Popups\nL_POPUP_INSTALLUI = \"Dies ist Ihre erste Benutzung von ShestakUI mit diesem Charakter. Um das Interface zu konfigurieren, wird das UI nun neugeladen.\"\nL_POPUP_RESETUI = \"Sind Sie sich sicher, dass Sie die Einstellungen von ShestakUI zurückgesetzen wollen?\"\nL_POPUP_RESETSTATS = \"Bist du sicher das du die Gold und verbrachte Zeit Statistik zurücksetzen möchtest?\"\nL_POPUP_DISBAND_RAID = \"Bist du dir sicher, dass du die Gruppe auflösen möchtest?\"\nL_POPUP_DISABLEUI = \"ShestakUI funktioniert nicht mit deiner Auflösung, möchtest du ShestakUI ausschalten? (Drücke Abbrechen, falls du eine andere Auflösung testen willst)\"\nL_POPUP_SETTINGS_ALL = \"Einstellungen für alle AddOns übernehmen? (DBM, BigWigs, Skada und MSBT)\"\nL_POPUP_SETTINGS_DBM = \"Die Position der DBM Elemente muss verändert werden.\"\nL_POPUP_SETTINGS_BW = \"Die Position der BigWigs Elemente muss verändert werden.\"\nL_POPUP_ARMORY = \"Waffenkammer\"\n\n-- Welcome message\nL_WELCOME_LINE_1 = \"Willkommen bei ShestakUI \"\nL_WELCOME_LINE_2_1 = \"Gebe /cfg ein um das Interface zu konfigurieren, oder besuche http://shestak.org\"\nL_WELCOME_LINE_2_2 = \"für weitere Informationen.\"\n\n-- Combat text\nL_COMBATTEXT_KILLING_BLOW = \"Todesstoß\"\nL_COMBATTEXT_TEST_DISABLED = \"Kampftext Testmodus deaktiviert.\"\nL_COMBATTEXT_TEST_ENABLED = \"Kampftext Testmodus aktiviert.\"\nL_COMBATTEXT_TEST_USE_MOVE = \"Gib '/xct move' ein um die Kampftext Fenster freizugeben um sie verschieben und verändern zu können.\"\nL_COMBATTEXT_TEST_USE_TEST = \"Gib '/xct' ein um den Kampftext Testmodus zu aktivieren.\"\nL_COMBATTEXT_TEST_USE_RESET = \"Gib /xct reset ein, um die Standardpositionen wiederherzustellen.\"\nL_COMBATTEXT_POPUP = \"Um die Kampftext Fensterpositionen zu sichern muss das Interface neu geladen werden.\"\nL_COMBATTEXT_UNSAVED = \"Kampftext Fensterpositionen nicht gespeichert, vergiss nicht das Interface neu zu laden.\"\nL_COMBATTEXT_UNLOCKED = \"Kampftext freigegeben.\"\n\n-- LiteStats\nL_STATS_AUTO_REPAIR = \"Automatisch reparieren\"\nL_STATS_GUILD_REPAIR = \"Reparieren mithilfe der Gildenbank\"\nL_STATS_AUTO_SELL = \"Junk automatisch verkaufen\"\nL_STATS_BANDWIDTH = \"Bandbreite:\"\nL_STATS_DOWNLOAD = \"Download:\"\nL_STATS_CURRENCY_RAID = \"Schlachtzugs Siegel\"\nL_STATS_MEMORY_USAGE = \"Blizzard UI Speicher Auslastung:\"\nL_STATS_TOTAL_MEMORY_USAGE = \"Gesamte Speicherausnutzung:\"\nL_STATS_TOTAL_CPU_USAGE = \"Gesamte CPU-Auslastung:\"\nL_STATS_GARBAGE_COLLECTED = \"Abfall zusammengefasst\"\nL_STATS_HIDDEN = \"Versteckt\"\nL_STATS_JUNK_ALREADY_ADDITIONS = \"ist bereits in der Ergänzungsliste.\"\nL_STATS_JUNK_ITEMLINK = \"itemlink\"\nL_STATS_JUNK_ADDITIONS = \"Junk-Ergänzungen\"\nL_STATS_JUNK_LIST = \"Junk-Liste\"\nL_STATS_JUNK_PROFIT = \"Junk-Gewinn\"\nL_STATS_JUNK_CLEARED = \"Junk-Liste bereinigt.\"\nL_STATS_JUNK_CLEAR_ADDITIONS = \"Ergänzungsliste leeren.\"\nL_STATS_JUNK_ADDED = \"Hinzufügen von Junk\"\nL_STATS_JUNK_ADD_ITEM = \"Items hinzufügen/entfernen.\"\nL_STATS_JUNK_REMOVED = \"Entfernen von Junk-Zusätzen\"\nL_STATS_JUNK_ITEMS_LIST = \"Liste für Verkaufsartikel.\"\nL_STATS_KILLS = \"G\"\nL_STATS_XP_RATE = \"Level XP-Rate\"\nL_STATS_HR = \"std\"\nL_STATS_INF = \"unend\"\nL_STATS_ON = \"AN\"\nL_STATS_PLAYED_LEVEL = \"Auf diesem Level gespielt\"\nL_STATS_PLAYED_SESSION = \"Diese Sitzung gespielt\"\nL_STATS_ACC_PLAYED = \"Gesamtspielzeit\"\nL_STATS_PLAYED_TOTAL = \"Gesamt gespielt\"\nL_STATS_QUEST = \"Q\"\nL_STATS_QUESTS_TO = \"Quests/Getötet bis %s\"\nL_STATS_CURRENT_XP = \"Aktuell/Max XP\"\nL_STATS_REMAINING_XP = \"Verbleibende XP\"\nL_STATS_RESTED_XP = \"Erholte XP\"\nL_STATS_SERVER_GOLD = \"Server Gold\"\nL_STATS_SESSION_GAIN = \"Sitzung - Gewinn/Verlust\"\nL_STATS_SESSION_XP = \"Sitzung - XP Rate\"\nL_STATS_SORTING_BY = \"Sortieren nach\"\nL_STATS_SEALS = \"Angebot der Woche\"\nL_STATS_SPEC = \"Spec\"\nL_STATS_TIPS = \"Tipps:\"\nL_STATS_OPEN_CALENDAR = \"Links-Klick, zum Öffnen des Kalenders.\"\nL_STATS_RC_TIME_MANAGER = \"Rechts-Klick, um die Einstellungen der Uhr anzuzeigen.\"\nL_STATS_TOGGLE_TIME = \"Lokal/Realm & 24-Stunden-Modus können in den Einstellungen der Uhr gewechselt werden.\"\nL_STATS_MEMORY = \"Speicher\"\nL_STATS_RC_COLLECTS_GARBAGE = \"Rechts-Klick sammelt Lua-Abfall.\"\nL_STATS_VIEW_NOTES = \"Halte die Alt-Taste gedrückt, zum Anzeigen der Ränge, Notizen und Offizier Notizen.\"\nL_STATS_CHANGE_SORTING = \"[Gilde] Rechts-Klick, zum Ändern der Sortierung und Umschalt-Rechts-Klick zum Umkehren der Reihenfolge.\"\nL_STATS_OPEN_CHARACTER = \"Links-Klick, zum Öffnen des Charakterfensters.\"\nL_STATS_RC_AUTO_REPAIRING1 = \"Rechts-Klick, zum Ein- oder Ausschalten des automatischen Reparieren.\"\nL_STATS_RC_AUTO_REPAIRING2 = \"Mittelklick schaltet Gilde AutoReparatur ein und aus.\"\nL_STATS_EQUIPMENT_CHANGER = \"Umschalt-Klick oder Alt-Klick für den Ausrüstungsmanager.\"\nL_STATS_RC_EXPERIENCE = \"Rechts-Klick, zum Wechseln zwischen Erfahrung, gespielte Zeit und Fraktionsüberwachung.\"\nL_STATS_WATCH_FACTIONS = \"Überwache Fraktionen aus dem Ruffenster.\"\nL_STATS_TOOLTIP_EXPERIENCE = \"Wenn unter dem max. Level, wird ein Tooltip mit weiteren Details angezeigt.\"\nL_STATS_TOOLTIP_TIME_PLAYED = \"Wenn das max. Level erreicht ist, wird das Tooltip die gespielte Zeit für den Account anzeigen.\"\nL_STATS_OPEN_TALENT = \"Links-Klick, zum Wechseln Deiner Talentspezialisierung.\"\nL_STATS_RC_TALENT = \"Rechts-Klick ändert die Beute Spezialisierung.\"\nL_STATS_LOCATION = \"Standort/Koordinaten\"\nL_STATS_WORLD_MAP = \"Klicken, zum Öffnen der World-Map.\"\nL_STATS_INSERTS_COORDS = \"Umschalt-Klick auf das Standort/Koordination Modul, zum Einfügen Deiner aktuellen Koordinaten in den Chat.\"\nL_STATS_OPEN_CURRENCY = \"Links-Klick, zum Öffnen des Abzeichen-Fensters.\"\nL_STATS_RC_AUTO_SELLING = \"Rechts-Klick, zum Ein- oder Ausschalten des automatischen Verkaufen.\"\nL_STATS_NEED_TO_SELL = \"Verwende /junk, um zu konfigurieren, welche Artikel verkauft werden sollen.\"\nL_STATS_WATCH_CURRENCY = \"Bereits gesehene Gegenstände aus dem Abzeichen-Fenster werden im Tooltip angezeigt.\"\nL_STATS_OTHER_OPTIONS = \"Weitere Einstellungen können in %s konfiguriert werden\"\n\n-- Slash commands\nL_SLASHCMD_HELP = {\n\t\"Available slash commands:\",\n\t\"/rl - Interface neu laden.\",\n\t\"/rc - Starte Bereitschaftscheck.\",\n\t\"/gm - Öffne das Game Master Fenster.\",\n\t\"/dis ADDON_NAME - Deaktiviere Addon.\",\n\t\"/en ADDON_NAME - Aktiviere Addon.\",\n\t\"/rd - Gruppe oder Schlachtzug auflösen.\",\n\t\"/toraid - In Gruppe oder Schlachtzug umwandeln.\",\n\t\"/teleport - Teleport vom beliebigen Dungeon.\",\n\t\"/ss - Zwischen den Talenten wechseln.\",\n\t\"/tt - Ziehl anflüstern.\",\n\t\"/farmmode - Erhöht die Größe der Minimap.\",\n\t\"/resetui - Zurücksetzen der allgemeinen Einstellungen auf die Standardwerte.\",\n\t\"/resetuf - Zurücksetzen der Einheitenfenster auf die Standardposition.\",\n\t\"/resetconfig - Zurücksetzen der ShestakUI_Config Einstellungen.\",\n\t\"/resetstats - Gold Statistik und gespielte Zeit zurücksetzen.\",\n\t\"/settings - Einstellungen für msbt, dbm, skada, oder alle Addons anwenden.\",\n\t\"/ls - Hilfe für LiteStats.\",\n\t\"/xct - Kampflogtext verwalten.\",\n\t\"/raidcd - Abklingzeiten für Schlachtzüge testen.\",\n\t\"/enemycd - Gegnerische Abklingzeiten testen.\",\n\t\"/pulsecd - Pulsierende Abklingzeiten testen.\",\n\t\"/threat - Bedrohungsmeter testen.\",\n\t\"/testuf - Einheitenfenster testen.\",\n\t\"/moveui - Ermöglicht das Bewegen der Interface Elemente.\", -- Need review\n\t\"/cfg - Interface Einstellungen öffnen.\",\n}\n"
  },
  {
    "path": "ShestakUI/Locales/Italian.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif T.client ~= \"itIT\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for itIT client\n--\tTranslation: Oz\n----------------------------------------------------------------------------------------\n-- Announce flasks and food\nL_ANNOUNCE_FF_NOFOOD = \"Senza beneficio da cibo: \"\nL_ANNOUNCE_FF_NOFLASK = \"Senza beneficio da tonico: \"\nL_ANNOUNCE_FF_ALLBUFFED = \"Tutti i benefici sono attivi!\"\nL_ANNOUNCE_FF_CHECK_BUTTON = \"Controllo cibi e tonici\"\n\n-- Says thanks for some spells\nL_ANNOUNCE_SS_THANKS = \"Grazie per \"\nL_ANNOUNCE_SS_RECEIVED = \" ricevuto/a da \"\n\n-- Pull countdown announce\nL_ANNOUNCE_PC_GO = \"VIA!\"\nL_ANNOUNCE_PC_MSG = \"Avvio incontro %s in %s..\"\nL_ANNOUNCE_PC_ABORTED = \"Avvio incontro ANNULLATO!\"\n\n-- Announce feasts and portals\nL_ANNOUNCE_FP_PRE = \"%s ha preparato un/una %s.\"\nL_ANNOUNCE_FP_PUT = \"%s ha messo già un/una %s.\"\nL_ANNOUNCE_FP_CAST = \"%s sta lanciando %s.\"\nL_ANNOUNCE_FP_CLICK = \"%s sta lanciando %s. Cliccate!\"\nL_ANNOUNCE_FP_USE = \"%s ha utilizzato un/una %s.\"\n\n-- Announce your interrupts\nL_ANNOUNCE_INTERRUPTED = INTERRUPTED\n\n-- Tooltip\nL_TOOLTIP_NO_TALENT = \"Nessun talento\"\nL_TOOLTIP_LOADING = \"Caricamento...\"\nL_TOOLTIP_ACH_STATUS = \"Il tuo status è:\"\nL_TOOLTIP_ACH_COMPLETE = \"Il tuo status è: completato \"\nL_TOOLTIP_ACH_INCOMPLETE = \"Il tuo status è: incompleto\"\nL_TOOLTIP_SPELL_ID = \"ID incantesimo/abilità:\"\nL_TOOLTIP_ITEM_ID = \"ID oggetto:\"\nL_TOOLTIP_WHO_TARGET = \"Bersaglio di\"\nL_TOOLTIP_ITEM_COUNT = \"Conteggio oggetti:\"\nL_TOOLTIP_INSPECT_OPEN = \"Il riquadro 'Ispeziona' è aperto\"\n\n-- Misc\nL_MISC_UNDRESS = \"Senza vestiti\"\nL_MISC_DRINKING = \" sta bevendo.\"\nL_MISC_BUY_STACK = \"Alt + click per comprarne una pila\"\nL_MISC_UI_OUTDATED = \"La tua versione della ShestakUI non è aggiornata: puoi scaricare la nuova versione da www.shestak.org.\"\nL_MISC_HEADER_MARK = \"Marchi d'incursione al passaggio del mouse\"\nL_MISC_BINDER_OPEN = \"Assegnazione pulsanti mouse\"\nL_MISC_SCROLL = \"Pergamena\"\nL_MISC_HEADER_QUEST = \"Auto quest button\" -- Needs review\n\n-- Raid Utility\nL_RAID_UTIL_DISBAND = \"Sciogli il gruppo\"\n\n-- Zone name\nL_ZONE_ANCIENTDALARAN = \"Cratere di Dalaran\"\n\n-- WatchFrame Wowhead link\nL_WATCH_WOWHEAD_LINK = \"Collegamento a Wowhead\"\n\n-- Toggle Menu\nL_TOGGLE_ADDON = \"AddOn \"\nL_TOGGLE_ADDONS = \" AddOns\"\nL_TOGGLE_EXPAND = \"Espandi\"\nL_TOGGLE_COLLAPSE = \"Rimpicciolisci \"\nL_TOGGLE_RCLICK = \"Clicca col destro per attivare o disattivare \"\nL_TOGGLE_LCLICK = \"Clicca col sinistro per mostrare la finestra \"\nL_TOGGLE_RELOAD = \" (bisogna ricaricare l'interfaccia)\"\nL_TOGGLE_NOT_FOUND = \" non trovata.\"\n\n-- UnitFrame\nL_UF_GHOST = \"Spirito\"\nL_UF_DEAD = \"Morto\"\nL_UF_OFFLINE = \"Disconnesso\"\nL_UF_MANA = \"Poco mana\"\n\n-- Map\nL_MAP_CURSOR = \"Cursore: \"\nL_MAP_BOUNDS = \"Fuori i confini!\"\nL_MAP_FOG = \"Nebbia della guerra\"\nL_MAP_COORDS = \"Coordinate\"\n\n-- Minimap\nL_MINIMAP_CALENDAR = \"Calendario\"\nL_MINIMAP_FARM = \"Minimap size\" -- Need review\nL_MINIMAP_TOGGLE = \"Toggle action bars\" -- Need review\n\n-- Chat\nL_CHAT_WHISPER = \"Da\"\nL_CHAT_BN_WHISPER = \"DA\"\nL_CHAT_AFK = \"[Assente]\"\nL_CHAT_DND = \"[Occupato]\"\nL_CHAT_GM = \"[RG]\"\nL_CHAT_GUILD = \"G\"\nL_CHAT_PARTY = \"GR\"\nL_CHAT_PARTY_LEADER = \"CGR\"\nL_CHAT_RAID = \"IN\"\nL_CHAT_RAID_LEADER = \"CIN\"\nL_CHAT_RAID_WARNING = \"AIN\"\nL_CHAT_INSTANCE_CHAT = \"IS\"\nL_CHAT_INSTANCE_CHAT_LEADER = \"CIS\"\nL_CHAT_OFFICER = \"UF\"\nL_CHAT_PET_BATTLE = \"STM\"\nL_CHAT_COME_ONLINE = \"si è |cff298F00connesso/a|r.\"\nL_CHAT_GONE_OFFLINE = \"si è |cffff0000disconnesso/a|r.\"\n\n-- Errors frame\nL_ERRORFRAME_L = \"Clicca per vedere gli errori.\"\n\n-- Bags\nL_BAG_SHOW_BAGS = \"Mostra le sacche\"\nL_BAG_RIGHT_CLICK_SEARCH = \"Clicca col destro per cercare\"\nL_BAG_STACK_MENU = \"Impila oggetti identici\"\nL_BAG_RIGHT_CLICK_CLOSE = \"Clicca col destro per aprire il menu\"\n\n-- Grab mail\nL_MAIL_STOPPED = \"Interrotto, l'inventario è pieno.\"\nL_MAIL_UNIQUE = \"Interrotto. È stato rinvenuto il duplicato di un oggetto unico in una sacca o in banca.\"\nL_MAIL_COMPLETE = \"Completato.\"\nL_MAIL_NEED = \"Hai bisogno della cassetta delle lettere.\"\nL_MAIL_MESSAGES = \"messaggi\"\n\n-- Loot\nL_LOOT_RANDOM = \"Giocatore casuale\"\nL_LOOT_SELF = \"Bottino personale\"\nL_LOOT_FISH = \"Bottino pescato\"\nL_LOOT_ANNOUNCE = \"Annuncia a\"\nL_LOOT_TO_RAID = \"  incursione\"\nL_LOOT_TO_PARTY = \"  gruppo\"\nL_LOOT_TO_GUILD = \"  gilda\"\nL_LOOT_TO_SAY = \"  dice\"\n\n-- LitePanels AFK module\nL_PANELS_AFK = \"Sei assente!\"\nL_PANELS_AFK_RCLICK = \"Click destro = nascondi pannello.\"\nL_PANELS_AFK_LCLICK = \"Click sinistro = non più assente.\"\n\n-- Cooldowns\nL_COOLDOWNS = \"RC: \"\nL_COOLDOWNS_COMBATRESS = \"Resurrezione in Combattimento\"\nL_COOLDOWNS_COMBATRESS_REMAINDER = \"Resurrezione in combattimento: \"\nL_COOLDOWNS_NEXTTIME = \"Tempi di ricarica: \"\n\n-- Bind key\nL_BIND_SAVED = \"Tutte le assegnazioni tasti sono state salvate.\"\nL_BIND_DISCARD = \"Tutte le nuove assegnazioni tasti non sono state salvate.\"\nL_BIND_INSTRUCT = \"Passa il tuo mouse sullo scomparto della barra delle azioni a cui vuoi assegnare un tasto. Premi il pulsante ESC o il tasto destro per cancellare l'attuale assegnazione tasti di quello scomparto.\"\nL_BIND_CLEARED = \"Tutte le assegnazioni tasti sono state cancellate per\"\nL_BIND_BINDING = \"Assegnazione\"\nL_BIND_KEY = \"Tasto\"\nL_BIND_NO_SET = \"Nessuna assegnazione impostata\"\n\n-- Info text\nL_INFO_ERRORS = \"Nessun errore ancora.\"\nL_INFO_INVITE = \"Accettato l'invito di \"\nL_INFO_DUEL = \"Declinata la richiesta di duello di \"\nL_INFO_PET_DUEL = \"Declinata la richiesta di duello tra mascottes di \"\nL_INFO_DISBAND = \"Scioglimento gruppo...\"\nL_INFO_SETTINGS_DBM = \"Digita /settings dbm per applicare le impostazioni predefinite per DBM.\"\nL_INFO_SETTINGS_BIGWIGS = \"Digita /settings bw per applicare le impostazioni predefinite per BigWigs.\"\nL_INFO_SETTINGS_MSBT = \"Digita /settings msbt per applicare le impostazioni predefinite per MSBT.\"\nL_INFO_SETTINGS_SKADA = \"Digita /settings skada per applicare le impostazioni predefinite per Skada.\"\nL_INFO_SETTINGS_ALL = \"Digita /settings all, per applicare le impostazioni predefinite per tutte le AddOns.\"\nL_INFO_NOT_INSTALLED = \" non è installato.\"\nL_INFO_SKIN_DISABLED1 = \"Restyling per \"\nL_INFO_SKIN_DISABLED2 = \" è disabilitato.\"\n\n-- Moving elements\nL_MOVE_RIGHT_CLICK = \"Right-click to reset position\" -- Needs review\nL_MOVE_MIDDLE_CLICK = \"Middle-click to temp hide\" -- Needs review\n\n-- Popups\nL_POPUP_INSTALLUI = \"È la prima volta che utilizzi la ShestakUI con questo personaggio. Devi riavviare l'interfaccia utente per configurarla.\"\nL_POPUP_RESETUI = \"Vuoi davvero ripristinare tutte le impostazioni iniziali della ShestakUI?\"\nL_POPUP_RESETSTATS = \"Vuoi davvero riazzerare tutte le statistiche relative a tempo trascorso in gioco e oro?\"\nL_POPUP_DISBAND_RAID = \"Vuoi davvero sciogliere il gruppo?\"\nL_POPUP_DISABLEUI = \"A questa risoluzione la ShestakUI non funziona correttamente, vuoi disabilitare l'AddOn (clicca 'Cancella' se vuoi provare con un'altra risoluzione)?\"\nL_POPUP_SETTINGS_ALL = \"Applica le impostazioni per tutte le AddOns (DBM, BigWigs, Skada e MSBT)?\"\nL_POPUP_SETTINGS_DBM = \"È necessario cambiare la posizione degli elementi di DBM.\"\nL_POPUP_SETTINGS_BW = \"È necessario cambiare la posizione degli elementi di BigWigs.\"\nL_POPUP_ARMORY = \"Armeria\"\n\n-- Welcome message\nL_WELCOME_LINE_1 = \"Benvenuto/a in ShestakUI \"\nL_WELCOME_LINE_2_1 = \"Digita /cfg per configurare l'interfaccia oppure visita http://shestak.org\"\nL_WELCOME_LINE_2_2 = \"per maggiori informazioni.\"\n\n-- Combat text\nL_COMBATTEXT_KILLING_BLOW = \"Colpo di grazia\"\nL_COMBATTEXT_TEST_DISABLED = \"Modalità 'prova' del testo di combattimento disabilitata.\"\nL_COMBATTEXT_TEST_ENABLED = \"Modalità 'prova' del testo di combattimento abilitata.\"\nL_COMBATTEXT_TEST_USE_MOVE = \"Digita '/xct move' per sbloccare e quindi poter muovere e ridimensionare i riquadri del testo di combattimento.\"\nL_COMBATTEXT_TEST_USE_TEST = \"Digita '/xct test' per attivare la modalità 'prova' per il testo di combattimento.\"\nL_COMBATTEXT_TEST_USE_RESET = \"Digita '/xct reset' to ripristinare le posizioni predefinite.\"\nL_COMBATTEXT_POPUP = \"Per poter salvare la posizione delle finestre del testo di combattimento è necessario riavviare la tua interfaccia utente.\"\nL_COMBATTEXT_UNSAVED = \"La posizione delle finestre del testo di combattimento non è ancora stata salvata: non dimenticare di riavviare l'interfaccia utente.\"\nL_COMBATTEXT_UNLOCKED = \"Testo di combattimento sbloccato.\"\n\n-- LiteStats\nL_STATS_AUTO_REPAIR = \"Riparazione automatica\"\nL_STATS_GUILD_REPAIR = \"Riparazione con i fondi di gilda\"\nL_STATS_AUTO_SELL = \"Vendita automatica delle cianfrusaglie\"\nL_STATS_BANDWIDTH = \"Larghezza banda:\"\nL_STATS_DOWNLOAD = \"Download:\"\nL_STATS_CURRENCY_RAID = \"Sigilli d’incursione\"\nL_STATS_MEMORY_USAGE = \"Utilizzo memoria interfaccia Blizzard:\"\nL_STATS_TOTAL_MEMORY_USAGE = \"Utilizzo totale memoria:\"\nL_STATS_TOTAL_CPU_USAGE = \"Total CPU Usage:\" -- Need review\nL_STATS_GARBAGE_COLLECTED = \"Spazzatura raccolta\"\nL_STATS_HIDDEN = \"Nascosto/a\"\nL_STATS_JUNK_ALREADY_ADDITIONS = \"is already in additions list.\" -- Need review\nL_STATS_JUNK_ITEMLINK = \"Collegamento all'oggetto\"\nL_STATS_JUNK_ADDITIONS = \"Junk additions\" -- Need review\nL_STATS_JUNK_LIST = \"Elenco cianfrusaglie\"\nL_STATS_JUNK_PROFIT = \"Profitto vendita cianfrusaglie\"\nL_STATS_JUNK_CLEARED = \"Junk list cleared.\" -- Need review\nL_STATS_JUNK_CLEAR_ADDITIONS = \"Clear additions list.\" -- Need review\nL_STATS_JUNK_ADDED = \"Added junk additions\" -- Need review\nL_STATS_JUNK_ADD_ITEM = \"Add/remove items.\" -- Need review\nL_STATS_JUNK_REMOVED = \"Removed junk additions\" -- Need review\nL_STATS_JUNK_ITEMS_LIST = \"List for sell items.\" -- Need review\nL_STATS_KILLS = \"U\"\nL_STATS_XP_RATE = \"Andamento PE per il livello\"\nL_STATS_HR = \"o\"\nL_STATS_INF = \"inf\"\nL_STATS_ON = \"Acceso\"\nL_STATS_PLAYED_LEVEL = \"Tempo giocato a questo livello\"\nL_STATS_PLAYED_SESSION = \"Tempo giocato in questa sessione\"\nL_STATS_ACC_PLAYED = \"Account in uso\"\nL_STATS_PLAYED_TOTAL = \"Tempo giocato totale\"\nL_STATS_QUEST = \"M\"\nL_STATS_QUESTS_TO = \"Missioni/uccisioni per %s\"\nL_STATS_CURRENT_XP = \"PE attuali/massimi\"\nL_STATS_REMAINING_XP = \"PE rimanenti\"\nL_STATS_RESTED_XP = \"PE da 'riposato'\"\nL_STATS_SERVER_GOLD = \"Oro totale su questo reame\"\nL_STATS_SESSION_GAIN = \"Guadagno/perdita della sessione\"\nL_STATS_SESSION_XP = \"Andamento PE della sessione\"\nL_STATS_SORTING_BY = \"Suddivisi per\"\nL_STATS_SEALS = \"Sigilli in questa settimana\"\nL_STATS_SPEC = \"Spec\" -- Need review\nL_STATS_TIPS = \"suggerimenti:\"\nL_STATS_OPEN_CALENDAR = \"Clicca col sinistro per aprire il calendario.\"\nL_STATS_RC_TIME_MANAGER = \"Clicca col destro per aprire le impostazionni orologio.\"\nL_STATS_TOGGLE_TIME = \"L'orario 'locale/reame' e quello '24 ore' possono essere attivati con le impostazioni orologio.\"\nL_STATS_MEMORY = \"Memoria\"\nL_STATS_RC_COLLECTS_GARBAGE = \"Clicca col destro per raccogliere la 'spazzatura Lua'.\"\nL_STATS_VIEW_NOTES = \"Tieni premuto il tasto Alt per visualizzare ranghi, note e note degli ufficiali.\"\nL_STATS_CHANGE_SORTING = \"[Gilda] Clicca col destro per invitare e sussurrare, clicca col tasto centrale per cambiare l'ordine, clicca Shift + tasto centrale per invertirlo.\"\nL_STATS_OPEN_CHARACTER = \"Clicca col sinistro per aprire il pannello personaggio.\"\nL_STATS_RC_AUTO_REPAIRING1 = \"Clicca col destro per attivare/disattivare la riparazione automatica.\"\nL_STATS_RC_AUTO_REPAIRING2 = \"Middle-Click toggles Guild AutoRepairing.\" -- Need review\nL_STATS_EQUIPMENT_CHANGER = \"Tieni premuto Shift o Alt è clicca per cambiare il set d'equipaggiamento.\" -- Need review\nL_STATS_RC_EXPERIENCE = \"Clicca col destro per navigare tra esperienza, tempo giocato e il visualizzatore fazione sotto osservazione.\"\nL_STATS_WATCH_FACTIONS = \"Fazioni sotto osservazione dal pannello delle fazioni del personaggio.\"\nL_STATS_TOOLTIP_EXPERIENCE = \"A livelli inferiori a quello massimo, un suggerimento mostrerà dettagli sull'esperienza.\"\nL_STATS_TOOLTIP_TIME_PLAYED = \"A livello massimo, un suggerimento mostrerà i dettagli su quanto tempo hai giocato con questo account.\"\nL_STATS_OPEN_TALENT = \"Clicca col sinistro per cambiare la spec. talenti attiva.\"\nL_STATS_RC_TALENT = \"Right-Click toggles your loot specialization.\" -- Need review\nL_STATS_LOCATION = \"Località/Coordinate\"\nL_STATS_WORLD_MAP = \"Clicca per aprire la mappa del mondo.\"\nL_STATS_INSERTS_COORDS = \"Tieni premuto Shift e clicca sul nome della località o sulle coordinate per inserirli automaticamente in chat.\"\nL_STATS_OPEN_CURRENCY = \"Clicca col sinistro per aprire il pannello Valuta.\"\nL_STATS_RC_AUTO_SELLING = \"Clicca col destro per attivare/disattivare la vendita automatica delle cianfrusaglie\"\nL_STATS_NEED_TO_SELL = \"Use /junk to configure which items need to sell.\" -- Need review\nL_STATS_WATCH_CURRENCY = \"Gli oggetti attualmente osservati nel pannello Valuta saranno inseriti nei suggerimenti.\"\nL_STATS_OTHER_OPTIONS = \"Altre opzioni potranno essere configurate tra %s\"\n\n-- Slash commands\nL_SLASHCMD_HELP = {\n\t\"Comandi slash disponibili:\",\n\t\"/rl - Ricarica l'interfaccia.\",\n\t\"/rc - Avvia un appello.\",\n\t\"/gm - Apri il pannello per interagire con i RG.\",\n\t\"/dis ADDON_NAME - Disabilita AddOn.\",\n\t\"/en ADDON_NAME - Attiva AddOn.\",\n\t\"/rd - Sciogli gruppo o incursione.\",\n\t\"/toraid - Trasforma il gruppo in incursione.\",\n\t\"/teleport - Teletrasporto dalle spedizioni casuali.\",\n\t\"/ss - Passa da una specializzazione dei talenti all'altra\",\n\t\"/tt - Sussurra al bersaglio.\",\n\t\"/farmmode - Incrementa le dimensioni della minimappa.\",\n\t\"/resetui - Ripristina le impostazioni generali iniziali.\",\n\t\"/resetuf - Riporta i riquadri delle unità alla loro posizione originaria.\",\n\t\"/resetconfig - Riporta le impostazioni della ShestakUI_Config a quelle iniziali.\",\n\t\"/resetstats - Riazzera le statistiche su oro e tempo di gioco.\",\n\t\"/settings - Applica le impostazioni a MSBT, DBM, Skada o a tutte le AddOns.\",\n\t\"/ls - Comandi d'aiuto per LiteStats.\",\n\t\"/xct - Gestione testo di combattimento.\",\n\t\"/raidcd - Prova i recuperi d'incursione.\",\n\t\"/enemycd - Prova i recuperi del nemico.\",\n\t\"/pulsecd - Prova i tuoi recuperi con effetto 'pulse'.\",\n\t\"/threat - Prova il Contatore Minaccia.\",\n\t\"/testuf - Prova i riquadri delle unità.\",\n\t\"/moveui - Consenti lo spostamento degli elementi dell'interfaccia.\", -- Need review\n\t\"/cfg - Apri il pannello impostazioni interfaccia.\",\n}"
  },
  {
    "path": "ShestakUI/Locales/Russian.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif T.client ~= \"ruRU\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for ruRU client\n--\tTranslation: Shestak, Wetxius\n----------------------------------------------------------------------------------------\n-- Announce flasks and food\nL_ANNOUNCE_FF_NOFOOD = \"Нет еды: \"\nL_ANNOUNCE_FF_NOFLASK = \"Нет настоя: \"\nL_ANNOUNCE_FF_ALLBUFFED = \"Еда и настой есть у всех. Можно щемить!\"\nL_ANNOUNCE_FF_CHECK_BUTTON = \"Проверка еды и настоя\"\n\n-- Says thanks for some spells\nL_ANNOUNCE_SS_THANKS = \"Спасибо за \"\nL_ANNOUNCE_SS_RECEIVED = \" получено от \"\n\n-- Pull countdown announce\nL_ANNOUNCE_PC_GO = \"ВЫСТУПАЕМ!\"\nL_ANNOUNCE_PC_MSG = \"Атакуем %s через %s..\"\nL_ANNOUNCE_PC_ABORTED = \"Атака ОТМЕНЕНА!\"\n\n-- Announce feasts and portals\nL_ANNOUNCE_FP_PRE = \"%s готовит %s.\"\nL_ANNOUNCE_FP_PUT = \"%s ставит %s.\"\nL_ANNOUNCE_FP_CAST = \"%s создает %s.\"\nL_ANNOUNCE_FP_CLICK = \"%s создает %s. Кликаем!\"\nL_ANNOUNCE_FP_USE = \"%s использует %s.\"\n\n-- Announce your interrupts\nL_ANNOUNCE_INTERRUPTED = INTERRUPTED\n\n-- Tooltip\nL_TOOLTIP_NO_TALENT = \"Нет талантов\"\nL_TOOLTIP_LOADING = \"Загрузка...\"\nL_TOOLTIP_ACH_STATUS = \"Ваш статус:\"\nL_TOOLTIP_ACH_COMPLETE = \"Ваш статус: Получено \"\nL_TOOLTIP_ACH_INCOMPLETE = \"Ваш статус: Не завершено\"\nL_TOOLTIP_SPELL_ID = \"Номер заклинания:\"\nL_TOOLTIP_ITEM_ID = \"Номер предмета:\"\nL_TOOLTIP_WHO_TARGET = \"Выбран целью\"\nL_TOOLTIP_ITEM_COUNT = \"Количество предметов:\"\nL_TOOLTIP_INSPECT_OPEN = \"Открыто окно осмотра\"\n\n-- Misc\nL_MISC_UNDRESS = \"Раздеть\"\nL_MISC_DRINKING = \" пьёт.\"\nL_MISC_BUY_STACK = \"Зажмите Alt и щелкните мышью, чтобы купить связку\"\nL_MISC_UI_OUTDATED = \"Ваша версия ShestakUI устарела. Вы можете скачать последнюю версию с www.shestak.org\"\nL_MISC_HEADER_MARK = \"Метки по наведению курсора\"\nL_MISC_BINDER_OPEN = \"Назначения мыши\"\nL_MISC_SCROLL = \"Свиток\"\nL_MISC_HEADER_QUEST = \"Кнопка для квестоввых предметов\"\n\n-- Raid Utility\nL_RAID_UTIL_DISBAND = \"Распустить группу\"\n\n-- Zone name\nL_ZONE_ANCIENTDALARAN = \"Даларанский кратер\"\n\n-- WatchFrame Wowhead link\nL_WATCH_WOWHEAD_LINK = \"Ссылка на Wowhead\"\n\n-- Toggle Menu\nL_TOGGLE_ADDON = \"Модификация \"\nL_TOGGLE_ADDONS = \" модификации\"\nL_TOGGLE_EXPAND = \"Показать \"\nL_TOGGLE_COLLAPSE = \"Скрыть \"\nL_TOGGLE_RCLICK = \"ПКМ - Включить или выключить \"\nL_TOGGLE_LCLICK = \"ЛКМ - Показать окно \"\nL_TOGGLE_RELOAD = \" (необходимо перезагрузить интерфейс)\"\nL_TOGGLE_NOT_FOUND = \" не найден.\"\n\n-- UnitFrame\nL_UF_GHOST = \"Призрак\"\nL_UF_DEAD = \"Мёртв\"\nL_UF_OFFLINE = \"Не в сети\"\nL_UF_MANA = \"Мало маны\"\n\n-- Map\nL_MAP_CURSOR = \"Курсор: \"\nL_MAP_BOUNDS = \"Вне карты!\"\nL_MAP_FOG = \"Туман войны\"\nL_MAP_COORDS = \"Координаты\"\n\n-- Minimap\nL_MINIMAP_CALENDAR = \"Календарь\"\nL_MINIMAP_FARM = \"Размер миникарты\"\nL_MINIMAP_TOGGLE = \"Переключение панелей команд\"\n\n-- Chat\nL_CHAT_WHISPER = \"От\"\nL_CHAT_BN_WHISPER = \"От\"\nL_CHAT_AFK = \"[AFK]\"\nL_CHAT_DND = \"[DND]\"\nL_CHAT_GM = \"[GM]\"\nL_CHAT_GUILD = \"Г\"\nL_CHAT_PARTY = \"Гр\"\nL_CHAT_PARTY_LEADER = \"Лгр\"\nL_CHAT_RAID = \"Р\"\nL_CHAT_RAID_LEADER = \"ЛР\"\nL_CHAT_RAID_WARNING = \"ОР\"\nL_CHAT_INSTANCE_CHAT = \"П\"\nL_CHAT_INSTANCE_CHAT_LEADER = \"ЛП\"\nL_CHAT_OFFICER = \"О\"\nL_CHAT_PET_BATTLE = \"БП\"\nL_CHAT_COME_ONLINE = \"|cff298F00входит|r в игровой мир.\"\nL_CHAT_GONE_OFFLINE = \"|cffff0000выходит|r из игрового мира.\"\n\n-- Errors frame\nL_ERRORFRAME_L = \"Щелкните, чтобы посмотреть ошибки.\"\n\n-- Bags\nL_BAG_SHOW_BAGS = \"Показать сумки\"\nL_BAG_RIGHT_CLICK_SEARCH = \"ПКМ для поиска\"\nL_BAG_STACK_MENU = \"Сложить\"\nL_BAG_RIGHT_CLICK_CLOSE = \"ПКМ, чтобы открыть меню\"\n\n-- Grab mail\nL_MAIL_STOPPED = \"Сбор почты приостановлен. Нет места в сумках.\"\nL_MAIL_UNIQUE = \"Сбор почты приостановлен. Найден дубликат уникального предмета в сумке или банке.\"\nL_MAIL_COMPLETE = \"Сбор почты окончен.\"\nL_MAIL_NEED = \"Нужен почтовый ящик.\"\nL_MAIL_MESSAGES = \"сообщений\"\n\n-- Loot\nL_LOOT_RANDOM = \"Случайному игроку\"\nL_LOOT_SELF = \"Забрать себе\"\nL_LOOT_FISH = \"Рыбалка\"\nL_LOOT_ANNOUNCE = \"Объявить\"\nL_LOOT_TO_RAID = \"  рейду\"\nL_LOOT_TO_PARTY = \"  группе\"\nL_LOOT_TO_GUILD = \"  гильдии\"\nL_LOOT_TO_SAY = \"  сказав\"\n\n-- LitePanels AFK module\nL_PANELS_AFK = \"Вы отсутствуете!\"\nL_PANELS_AFK_RCLICK = \"Нажмите ПКМ, чтобы скрыть.\"\nL_PANELS_AFK_LCLICK = \"Нажмите ЛКМ, чтобы вернуться.\"\n\n-- Cooldowns\nL_COOLDOWNS = \"Перезарядка: \"\nL_COOLDOWNS_COMBATRESS = \"Возрождение\"\nL_COOLDOWNS_COMBATRESS_REMAINDER = \"Возрождений в бою: \"\nL_COOLDOWNS_NEXTTIME = \"Следующее: \"\n\n-- Bind key\nL_BIND_SAVED = \"Все назначения клавиш сохранены.\"\nL_BIND_DISCARD = \"Все новые назначения клавиш были отменены.\"\nL_BIND_INSTRUCT = \"Наведите указатель мыши на кнопку действия, чтобы назначить клавишу. Нажмите клавишу ESC или правую кнопку мыши, чтобы убрать назначение.\"\nL_BIND_CLEARED = \"Все назначения были отменены для клавиши\"\nL_BIND_BINDING = \"Назначение\"\nL_BIND_KEY = \"Клавиша\"\nL_BIND_NO_SET = \"Не назначено\"\n\n-- Info text\nL_INFO_ERRORS = \"Ошибок не обнаружено.\"\nL_INFO_INVITE = \"Приглашение принято от \"\nL_INFO_DUEL = \"Дуэль отклонена от \"\nL_INFO_PET_DUEL = \"Битва питомцев отклонена от \"\nL_INFO_DISBAND = \"Роспуск группы...\"\nL_INFO_SETTINGS_DBM = \"Введите /settings dbm, чтобы применить настройки DBM.\"\nL_INFO_SETTINGS_BIGWIGS = \"Введите /settings bw, чтобы применить настройки BigWigs.\"\nL_INFO_SETTINGS_MSBT = \"Введите /settings msbt, чтобы применить настройки MSBT.\"\nL_INFO_SETTINGS_SKADA = \"Введите /settings skada, чтобы применить настройки Skada.\"\nL_INFO_SETTINGS_ALL = \"Введите /settings all, чтобы применить настройки для всех модификаций.\"\nL_INFO_NOT_INSTALLED = \" не установлен.\"\nL_INFO_SKIN_DISABLED1 = \"Стилизация для \"\nL_INFO_SKIN_DISABLED2 = \" выключена.\"\n\n-- Moving elements\nL_MOVE_RIGHT_CLICK = \"Правый клик - сбросить позицию\"\nL_MOVE_MIDDLE_CLICK = \"Средний клик - временно скрыть\"\n\n-- Popups\nL_POPUP_INSTALLUI = \"Это первый запуск ShestakUI для этого персонажа. Необходимо перезагрузить интерфейс для его настройки.\"\nL_POPUP_RESETUI = \"Вы уверены, что хотите сбросить настройки ShestakUI?\"\nL_POPUP_RESETSTATS = \"Вы уверены, что хотите сбросить статистику золота и проведенного времени в игре?\"\nL_POPUP_DISBAND_RAID = \"Вы уверены, что хотите распустить группу?\"\nL_POPUP_DISABLEUI = \"ShestakUI не работает на этом разрешении, хотите отключить ShestakUI? (Отмена, если хотите попробовать другое разрешение)\"\nL_POPUP_SETTINGS_ALL = \"Применить настройки для всех модификаций? (DBM, BigWigs, Skada и MSBT)\"\nL_POPUP_SETTINGS_DBM = \"Необходимо изменить позиции элементов DBM.\"\nL_POPUP_SETTINGS_BW = \"Необходимо изменить позиции элементов BigWigs.\"\nL_POPUP_ARMORY = \"Оружейная\"\n\n-- Welcome message\nL_WELCOME_LINE_1 = \"Добро пожаловать в ShestakUI \"\nL_WELCOME_LINE_2_1 = \"Введите /cfg для входа в настройки интерфейса, или посетите страницу http://shestak.org\"\nL_WELCOME_LINE_2_2 = \"для получения дополнительной информации.\"\n\n-- Combat text\nL_COMBATTEXT_KILLING_BLOW = \"Смерт. Удар\"\nL_COMBATTEXT_TEST_DISABLED = \"Тестовый режим текста боя выключен.\"\nL_COMBATTEXT_TEST_ENABLED = \"Тестовый режим текста боя включен.\"\nL_COMBATTEXT_TEST_USE_MOVE = \"Введите /xct move, чтобы передвинуть или изменить размер области текста боя.\"\nL_COMBATTEXT_TEST_USE_TEST = \"Введите /xct test, чтобы включить тестовый режим текста боя.\"\nL_COMBATTEXT_TEST_USE_RESET = \"Введите /xct reset, чтобы вернуть позиции по умолчанию.\"\nL_COMBATTEXT_POPUP = \"Для сохранения позиций текста боя необходимо перезагрузить интерфейс.\"\nL_COMBATTEXT_UNSAVED = \"Позиции текста боя не сохранены, не забудьте перезагрузить интерфейс.\"\nL_COMBATTEXT_UNLOCKED = \"Текст боя разблокирован.\"\n\n-- LiteStats\nL_STATS_AUTO_REPAIR = \"Автопочинка\"\nL_STATS_GUILD_REPAIR = \"Починка из банка гильдии\"\nL_STATS_AUTO_SELL = \"Автопродажа\"\nL_STATS_BANDWIDTH = \"Скорость:\"\nL_STATS_DOWNLOAD = \"Загрузка:\"\nL_STATS_CURRENCY_RAID = \"Печати\"\nL_STATS_MEMORY_USAGE = \"Использование памяти Blizzard:\"\nL_STATS_TOTAL_MEMORY_USAGE = \"Всего использовано памяти:\"\nL_STATS_TOTAL_CPU_USAGE = \"Использование процессора:\"\nL_STATS_GARBAGE_COLLECTED = \"Память очищена\"\nL_STATS_HIDDEN = \"Скрытые\"\nL_STATS_JUNK_ALREADY_ADDITIONS = \"уже в списке автопродажи.\"\nL_STATS_JUNK_ITEMLINK = \"Ссылка на предмет\"\nL_STATS_JUNK_ADDITIONS = \"Предметы для автопродажи\"\nL_STATS_JUNK_LIST = \"Список автопродажи\"\nL_STATS_JUNK_PROFIT = \"Прибыль с продажи\"\nL_STATS_JUNK_CLEARED = \"Cписок автопродажи очищен.\"\nL_STATS_JUNK_CLEAR_ADDITIONS = \"Очистить список.\"\nL_STATS_JUNK_ADDED = \"Добавлено для автопродажи\"\nL_STATS_JUNK_ADD_ITEM = \"Добавить/удалить предмет.\"\nL_STATS_JUNK_REMOVED = \"Удалено из автопродажи\"\nL_STATS_JUNK_ITEMS_LIST = \"Список предметов для автопродажи.\"\nL_STATS_KILLS = \"У\"\nL_STATS_XP_RATE = \"Темп XP на этом уровне\"\nL_STATS_HR = \"ч\"\nL_STATS_INF = \"бесконечно\"\nL_STATS_ON = \"ВКЛ.\"\nL_STATS_PLAYED_LEVEL = \"Время игры на этом уровне\"\nL_STATS_PLAYED_SESSION = \"Время игры на этой сессии\"\nL_STATS_ACC_PLAYED = \"Время игры персонажем\"\nL_STATS_PLAYED_TOTAL = \"Общее время игры\"\nL_STATS_QUEST = \"З\"\nL_STATS_QUESTS_TO = \"Заданий/Убийств до %s\"\nL_STATS_CURRENT_XP = \"Текущий/Макс. опыт\"\nL_STATS_REMAINING_XP = \"Осталось опыта\"\nL_STATS_RESTED_XP = \"Опыт отдыха\"\nL_STATS_SERVER_GOLD = \"Золото на сервере\"\nL_STATS_SESSION_GAIN = \"Получено/Потрачено за сеанс\"\nL_STATS_SESSION_XP = \"Темп XP за этот сеанс\"\nL_STATS_SORTING_BY = \"Сортировка по\"\nL_STATS_SEALS = \"Печатей на этой неделе\"\nL_STATS_SPEC = \"Спек\"\nL_STATS_TIPS = \"cоветы:\"\nL_STATS_OPEN_CALENDAR = \"ЛКМ открывает календарь.\"\nL_STATS_RC_TIME_MANAGER = \"ПКМ открывает часы.\"\nL_STATS_TOGGLE_TIME = \"Местное/Серверное и 24-ч. показ времени изменяются через меню часов.\"\nL_STATS_MEMORY = \"Память\"\nL_STATS_RC_COLLECTS_GARBAGE = \"ПКМ очищает память от lua мусора.\"\nL_STATS_VIEW_NOTES = \"Зажмите Alt для просмотра званий, обычных заметок и офицерских.\"\nL_STATS_CHANGE_SORTING = \"[Гильдия] ПКМ приглашения и шепот, СКМ изменяет сортировку, Shift+СКМ изменяет порядок сортировки.\"\nL_STATS_OPEN_CHARACTER = \"ЛКМ открывает окно персонажа.\"\nL_STATS_RC_AUTO_REPAIRING1 = \"ПКМ переключает автопочинку.\"\nL_STATS_RC_AUTO_REPAIRING2 = \"CКМ переключает автопочинку гильдии.\"\nL_STATS_EQUIPMENT_CHANGER = \"Shift+ЛКМ или Alt+ЛКМ показывает комплекты экипировки.\"\nL_STATS_RC_EXPERIENCE = \"ПКМ переключает показ опыта, время игры, слежение за фракцией.\"\nL_STATS_WATCH_FACTIONS = \"Отслеживание фракции из окна репутации.\"\nL_STATS_TOOLTIP_EXPERIENCE = \"Когда уровень не максимальный, подсказка будет показывать подробности опыта.\"\nL_STATS_TOOLTIP_TIME_PLAYED = \"Когда уровень максимальный, подсказка будет показывать время игры персонажами.\"\nL_STATS_OPEN_TALENT = \"ЛКМ переключает вашу специализацию.\"\nL_STATS_RC_TALENT = \"ПКМ переключает вашу добычу для специализации.\"\nL_STATS_LOCATION = \"Зона/Координаты\"\nL_STATS_WORLD_MAP = \"Нажатие открывает карту.\"\nL_STATS_INSERTS_COORDS = \"Shift+клик по модулю зоны или координат для вставки в чат ваших текущих координат.\"\nL_STATS_OPEN_CURRENCY = \"ЛКМ открывает окно валюты.\"\nL_STATS_RC_AUTO_SELLING = \"ПКМ переключает автопродажу.\"\nL_STATS_NEED_TO_SELL = \"Введите /junk, чтобы настроить какие предметы принудительно продавать.\"\nL_STATS_WATCH_CURRENCY = \"Отслеживаемая валюта отображается в подсказке.\"\nL_STATS_OTHER_OPTIONS = \"Другие настройки вы можете изменить в %s\"\n\n-- Slash commands\nL_SLASHCMD_HELP = {\n\t\"Доступные слэш-команды:\",\n\t\"/rl - Перезагружает интерфейс.\",\n\t\"/rc - Провести проверку готовности группы/рейда.\",\n\t\"/gm - Связаться с ГМ. Помощь по игре.\",\n\t\"/dis ADDON_NAME - Выключение аддона.\",\n\t\"/en ADDON_NAME - Включение аддона.\",\n\t\"/rd - Расформировать группу/рейд.\",\n\t\"/toraid - Конвертация в группу/рейд.\",\n\t\"/teleport - Телепортация из подземелья.\",\n\t\"/ss - Переключение специализации.\",\n\t\"/tt - Шепнуть цели.\",\n\t\"/farmmode - Увеличивает миникарту.\",\n\t\"/resetui - Сброс общих настроек на стандартные.\",\n\t\"/resetuf - Сброс позиций юнит фреймов.\",\n\t\"/resetconfig - Сброс настроек ShestakUI_Config.\",\n\t\"/resetstats - Сброс статистики золота и проведенного времени.\",\n\t\"/settings - Применение настроек для модификаций (msbt, dbm, skada, bw).\",\n\t\"/ls - Помощь для инфо-текстов.\",\n\t\"/xct - Управление текстом боя.\",\n\t\"/raidcd - Тест рейдовых перезарядок.\",\n\t\"/enemycd - Тест вражеских перезарядок.\",\n\t\"/pulsecd - Тест своих перезарядок.\",\n\t\"/threat - Тест списка угрозы.\",\n\t\"/testuf - Тест юнит фреймов.\",\n\t\"/moveui - Перемещение элементов интерфейса. Правый клик для сброса позиции\",\n\t\"/cfg - Открыть настройки интерфейса.\",\n}"
  },
  {
    "path": "ShestakUI/Locales/Spanish.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif T.client ~= \"esES\" and T.client ~= \"esMX\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for esES and esMX client\n--\tTranslation: eXecrate, Seal\n----------------------------------------------------------------------------------------\n-- Announce flasks and food\nL_ANNOUNCE_FF_NOFOOD = \"No Food: \" -- Needs review\nL_ANNOUNCE_FF_NOFLASK = \"No Flask: \" -- Needs review\nL_ANNOUNCE_FF_ALLBUFFED = \"All Buffed!\" -- Needs review\nL_ANNOUNCE_FF_CHECK_BUTTON = \"Check food and flask\" -- Needs review\n\n-- Says thanks for some spells\nL_ANNOUNCE_SS_THANKS = \"Thanks for \" -- Needs review\nL_ANNOUNCE_SS_RECEIVED = \" received from \" -- Needs review\n\n-- Pull countdown announce\nL_ANNOUNCE_PC_GO = \"GO!\" -- Needs review\nL_ANNOUNCE_PC_MSG = \"Pulling %s in %s..\" -- Needs review\nL_ANNOUNCE_PC_ABORTED = \"Pull ABORTED!\" -- Needs review\n\n-- Announce feasts and portals\nL_ANNOUNCE_FP_PRE = \"%s has prepared a %s.\" -- Needs review\nL_ANNOUNCE_FP_PUT = \"%s has put down a %s.\" -- Needs review\nL_ANNOUNCE_FP_CAST = \"%s is casting %s.\" -- Needs review\nL_ANNOUNCE_FP_CLICK = \"%s is casting %s. Click!\" -- Needs review\nL_ANNOUNCE_FP_USE = \"%s used a %s.\" -- Needs review\n\n-- Announce your interrupts\nL_ANNOUNCE_INTERRUPTED = INTERRUPTED\n\n-- Tooltip\nL_TOOLTIP_NO_TALENT = \"No tienes talentos\"\nL_TOOLTIP_LOADING = \"Cargando...\"\nL_TOOLTIP_ACH_STATUS = \"Estado:\"\nL_TOOLTIP_ACH_COMPLETE = \"Estado: Completado \"\nL_TOOLTIP_ACH_INCOMPLETE = \"Estado: Incompleto\"\nL_TOOLTIP_SPELL_ID = \"ID del hechizo:\"\nL_TOOLTIP_ITEM_ID = \"ID del objeto:\"\nL_TOOLTIP_WHO_TARGET = \"Marcado por\"\nL_TOOLTIP_ITEM_COUNT = \"Contador del objeto:\"\nL_TOOLTIP_INSPECT_OPEN = \"Inspect Frame is open\" -- Needs review\n\n-- Misc\nL_MISC_UNDRESS = \"Desvestir\"\nL_MISC_DRINKING = \" esta bebiendo.\"\nL_MISC_BUY_STACK = \"Alt-Click para comprar un lote\"\nL_MISC_UI_OUTDATED = \"Tu versión de ShestakUI no está actualizada. Puedes descargar la última versión de www.shestak.org\"\nL_MISC_HEADER_MARK = \"Mouseover Raid Icons\" -- Needs review\nL_MISC_BINDER_OPEN = \"Mouse Bindings\" -- Needs review\nL_MISC_SCROLL = \"Pergamino\"\nL_MISC_HEADER_QUEST = \"Auto quest button\" -- Needs review\n\n-- Raid Utility\nL_RAID_UTIL_DISBAND = \"Disolver grupo\"\n\n-- Zone name\nL_ZONE_ANCIENTDALARAN = \"Cráter de Dalaran\"\n\n-- WatchFrame Wowhead link\nL_WATCH_WOWHEAD_LINK = \"Link de WoWhead\"\n\n-- Toggle Menu\nL_TOGGLE_ADDON = \"Complemento \"\nL_TOGGLE_ADDONS = \" complementos\"\nL_TOGGLE_EXPAND = \"Expandir \"\nL_TOGGLE_COLLAPSE = \"Colapsar \"\nL_TOGGLE_RCLICK = \"Click derecho para activar o desactivar \"\nL_TOGGLE_LCLICK = \"Click izquierdo para cambiar de ventana \"\nL_TOGGLE_RELOAD = \" (necesita reiniciar la UI)\"\nL_TOGGLE_NOT_FOUND = \" not found.\" -- Needs review\n\n-- UnitFrame\nL_UF_GHOST = \"Fantasma\"\nL_UF_DEAD = \"Muerto\"\nL_UF_OFFLINE = \"Desconectado\"\nL_UF_MANA = \"Mana bajo\"\n\n-- Map\nL_MAP_CURSOR = \"Cursor: \"\nL_MAP_BOUNDS = \"Fuera de los limites!\"\nL_MAP_FOG = \"Fog of War\" -- Needs review\nL_MAP_COORDS = \"Coordinates\" -- Needs review\n\n-- Minimap\nL_MINIMAP_CALENDAR = \"Calendario\"\nL_MINIMAP_FARM = \"Minimap size\" -- Need review\nL_MINIMAP_TOGGLE = \"Toggle action bars\" -- Need review\n\n-- Chat\nL_CHAT_WHISPER = \"De\"\nL_CHAT_BN_WHISPER = \"De\"\nL_CHAT_AFK = \"[AFK]\"\nL_CHAT_DND = \"[NM]\"\nL_CHAT_GM = \"[GM]\"\nL_CHAT_GUILD = \"H\"\nL_CHAT_PARTY = \"G\"\nL_CHAT_PARTY_LEADER = \"LG\"\nL_CHAT_RAID = \"B\"\nL_CHAT_RAID_LEADER = \"LB\"\nL_CHAT_RAID_WARNING = \"AB\"\nL_CHAT_INSTANCE_CHAT = \"I\" -- Needs review\nL_CHAT_INSTANCE_CHAT_LEADER = \"IL\" -- Needs review\nL_CHAT_OFFICER = \"O\"\nL_CHAT_PET_BATTLE = \"PB\" -- Needs review\nL_CHAT_COME_ONLINE = \"se ha |cff298F00conectado|r.\"\nL_CHAT_GONE_OFFLINE = \"se ha |cffff0000desconectado|r.\"\n\n-- Errors frame\nL_ERRORFRAME_L = \"Click para ver errores.\"\n\n-- Bags\nL_BAG_SHOW_BAGS = \"Mostrar Bolsas\"\nL_BAG_RIGHT_CLICK_SEARCH = \"Click derecho para buscar\"\nL_BAG_STACK_MENU = \"Amontonar\"\nL_BAG_RIGHT_CLICK_CLOSE = \"Right-click to open menu\" -- Need review\n\n-- Grab mail\nL_MAIL_STOPPED = \"Sin espacio, inventario lleno.\"\nL_MAIL_UNIQUE = \"Abortado. Se encontró un duplicado del objeto único en las bolsas o en el banco.\"\nL_MAIL_COMPLETE = \"Todo enviado.\"\nL_MAIL_NEED = \"Necesitas un buzón.\"\nL_MAIL_MESSAGES = \"mensajes\"\n\n-- Loot\nL_LOOT_RANDOM = \"Jugador aleatorio\"\nL_LOOT_SELF = \"Despojar automáticamente\"\nL_LOOT_FISH = \"Despojar pescado\"\nL_LOOT_ANNOUNCE = \"Anunciar a\"\nL_LOOT_TO_RAID = \"  banda\"\nL_LOOT_TO_PARTY = \"  grupo\"\nL_LOOT_TO_GUILD = \"  hermandad\"\nL_LOOT_TO_SAY = \"  decir\"\n\n-- LitePanels AFK module\nL_PANELS_AFK = \"Estas ausente!\"\nL_PANELS_AFK_RCLICK = \"Botón derecho para ocultar.\"\nL_PANELS_AFK_LCLICK = \"Botón izquierdo para retroceder.\"\n\n-- Cooldowns\nL_COOLDOWNS = \"TR: \"\nL_COOLDOWNS_COMBATRESS = \"CombatRess\" -- Needs review\nL_COOLDOWNS_COMBATRESS_REMAINDER = \"Combat resurrect: \" -- Needs review\nL_COOLDOWNS_NEXTTIME = \"Next time: \" -- Needs review\n\n-- Bind key\nL_BIND_SAVED = \"La configuración de las teclas ha sido guardada.\"\nL_BIND_DISCARD = \"Se han descartado los cambios en la configuración de las teclas.\"\nL_BIND_INSTRUCT = \"Coloca el cursor encima de cualquier botón para asignar una tecla. Presiona la tecla ESC o el botón derecho del ratón para quitar la asignación actual.\"\nL_BIND_CLEARED = \"Todas las asignaciones de teclas se han limpiado para\"\nL_BIND_BINDING = \"Asignación\"\nL_BIND_KEY = \"Tecla\"\nL_BIND_NO_SET = \"No tiene asignación\"\n\n-- Info text\nL_INFO_ERRORS = \"Ningún error aun.\"\nL_INFO_INVITE = \"Invitación aceptada de \"\nL_INFO_DUEL = \"Duelo rechazado de \"\nL_INFO_PET_DUEL = \"Declined pet duel request from \" -- Needs review\nL_INFO_DISBAND = \"Deshaciendo banda...\"\nL_INFO_SETTINGS_DBM = \"Escribe /settings dbm, para aplicar las preferencias del DBM.\"\nL_INFO_SETTINGS_BIGWIGS = \"Escribe /settings bw, para aplicar las preferencias del BigWigs.\"\nL_INFO_SETTINGS_MSBT = \"Escribe /settings msbt, para aplicar las preferencias del MSBT.\"\nL_INFO_SETTINGS_SKADA = \"Escribe /settings skada, para aplicar las preferencias del Skada.\"\nL_INFO_SETTINGS_ALL = \"Escribe /settings all, para aplicar todas las modificaciones.\"\nL_INFO_NOT_INSTALLED = \" no esta instalado.\"\nL_INFO_SKIN_DISABLED1 = \"Estilizacion para \"\nL_INFO_SKIN_DISABLED2 = \" esta desactivado.\"\n\n-- Moving elements\nL_MOVE_RIGHT_CLICK = \"Right-click to reset position\" -- Needs review\nL_MOVE_MIDDLE_CLICK = \"Middle-click to temp hide\" -- Needs review\n\n-- Popups\nL_POPUP_INSTALLUI = \"Es la primera vez que usas ShestakUI con este personaje. Usted debe volver a cargar la interfaz de usuario para configurarlo.\"\nL_POPUP_RESETUI = \"¿Estás seguro de que desea restablecer ShestakUI?\"\nL_POPUP_RESETSTATS = \"¿Estás seguro de que quieres reiniciar las estadísticas de tiempo empleado en el juego y oro adquirido?\"\nL_POPUP_DISBAND_RAID = \"¿Estás seguro de que quieres disolver el grupo?\"\nL_POPUP_DISABLEUI = \"ShestakUI no funciona con esta resolución, ¿Quieres desactivar ShestakUI? (Pulsa cancelar si quieres probar otra resolución)\"\nL_POPUP_SETTINGS_ALL = \"¿Aplicar modificaciones para todos los addons? (DBM, BigWigs, Skada o MSBT)\"\nL_POPUP_SETTINGS_DBM = \"Necesito cambiar la posición de los elementos del DBM.\"\nL_POPUP_SETTINGS_BW = \"Necesito cambiar la posición de los elementos del BigWigs.\"\nL_POPUP_ARMORY = \"Arsenal\"\n\n-- Welcome message\nL_WELCOME_LINE_1 = \"Bienvenido a ShestakUI \"\nL_WELCOME_LINE_2_1 = \"Escribe /cfg para configurar la interfaz, o visita http://shestak.org\"\nL_WELCOME_LINE_2_2 = \"para más información.\"\n\n-- Combat text\nL_COMBATTEXT_KILLING_BLOW = \"Golpe de gracia\"\nL_COMBATTEXT_TEST_DISABLED = \"Modo Texto de combate deshabilitado.\"\nL_COMBATTEXT_TEST_ENABLED = \"Modo Texto de combate habilitado.\"\nL_COMBATTEXT_TEST_USE_MOVE = \"Escribe /xct move para mover y cambiar el tamaño del marco de texto de combate.\"\nL_COMBATTEXT_TEST_USE_TEST = \"Escribe /xct test para probar el modo Texto de combate.\"\nL_COMBATTEXT_TEST_USE_RESET = \"Type /xct reset to restore default positions.\" -- Need review\nL_COMBATTEXT_POPUP = \"Para guardar la posición de la ventana de texto de combate necesitas recargar tu UI.\"\nL_COMBATTEXT_UNSAVED = \"La posición de la ventana de texto de combate no está guardada, no olvides recargar la UI.\"\nL_COMBATTEXT_UNLOCKED = \"Texto de combate desbloqueado.\"\n\n-- LiteStats\nL_STATS_AUTO_REPAIR = \"Reparación auto.\"\nL_STATS_GUILD_REPAIR = \"Reparar con dinero de la hermandad\"\nL_STATS_AUTO_SELL = \"Auto-vender basura\"\nL_STATS_BANDWIDTH = \"Ancho de banda:\"\nL_STATS_DOWNLOAD = \"Descarga:\"\nL_STATS_CURRENCY_RAID = \"Raid Seals\" -- Need review\nL_STATS_MEMORY_USAGE = \"Blizzard UI Memory Usage:\" -- Needs review\nL_STATS_TOTAL_MEMORY_USAGE = \"Uso total de la memoria:\"\nL_STATS_TOTAL_CPU_USAGE = \"Total CPU Usage:\" -- Need review\nL_STATS_GARBAGE_COLLECTED = \"Basura recogida\"\nL_STATS_HIDDEN = \"Oculto\"\nL_STATS_JUNK_ALREADY_ADDITIONS = \"is already in additions list.\" -- Need review\nL_STATS_JUNK_ITEMLINK = \"enlace del objeto\"\nL_STATS_JUNK_ADDITIONS = \"Junk additions\" -- Need review\nL_STATS_JUNK_LIST = \"Lista de basura\"\nL_STATS_JUNK_PROFIT = \"Ganancia con la basura\"\nL_STATS_JUNK_CLEARED = \"Junk list cleared.\" -- Need review\nL_STATS_JUNK_CLEAR_ADDITIONS = \"Clear additions list.\" -- Need review\nL_STATS_JUNK_ADDED = \"Added junk additions\" -- Need review\nL_STATS_JUNK_ADD_ITEM = \"Add/remove items.\" -- Need review\nL_STATS_JUNK_REMOVED = \"Removed junk additions\" -- Need review\nL_STATS_JUNK_ITEMS_LIST = \"List for sell items.\" -- Need review\nL_STATS_KILLS = \"A\"\nL_STATS_XP_RATE = \"EXP en este nivel\"\nL_STATS_HR = \"hr\"\nL_STATS_INF = \"inf\"\nL_STATS_ON = \"ON\"\nL_STATS_PLAYED_LEVEL = \"Jugado este nivel\"\nL_STATS_PLAYED_SESSION = \"Jugado esta sesión\"\nL_STATS_ACC_PLAYED = \"Jugado\"\nL_STATS_PLAYED_TOTAL = \"Total jugado\"\nL_STATS_QUEST = \"M\"\nL_STATS_QUESTS_TO = \"Misiones/Muertes para %s\"\nL_STATS_CURRENT_XP = \"Actual/Max EXP\"\nL_STATS_REMAINING_XP = \"EXP Restante\"\nL_STATS_RESTED_XP = \"EXP de descanso\"\nL_STATS_SERVER_GOLD = \"Oro del servidor\"\nL_STATS_SESSION_GAIN = \"Sesion ganado/perdido\"\nL_STATS_SESSION_XP = \"EXP en esta sesion\"\nL_STATS_SORTING_BY = \"Ordenado por\"\nL_STATS_SEALS = \"Seals this week\" -- Needs review\nL_STATS_SPEC = \"Spec\" -- Need review\nL_STATS_TIPS = \"consejos:\"\nL_STATS_OPEN_CALENDAR = \"Click-Izquierdo abre el calendario.\"\nL_STATS_RC_TIME_MANAGER = \"Click-Derecho abre el administrador de tiempo.\"\nL_STATS_TOGGLE_TIME = \"Hora Local/Reino y el reloj de 24hr se pueden activar desde el administrador de tiempo.\"\nL_STATS_MEMORY = \"Memoria\"\nL_STATS_RC_COLLECTS_GARBAGE = \"Click-Derecho recolecta basura de Lua.\"\nL_STATS_VIEW_NOTES = \"Manten pulsada la tecla Alt para ver rangos, notas y notas de oficiales.\"\nL_STATS_CHANGE_SORTING = \"[Hermandad] Click-Derecho para cambiar la clasificacion, Shift-Click-Derecho para invertir el orden.\"\nL_STATS_OPEN_CHARACTER = \"Click-Izquierdo abre la pestana de personaje.\"\nL_STATS_RC_AUTO_REPAIRING1 = \"Click-Derecho activa el Auto-Reparar.\"\nL_STATS_RC_AUTO_REPAIRING2 = \"Middle-Click toggles Guild AutoRepairing.\" -- Need review\nL_STATS_EQUIPMENT_CHANGER = \"Shift-Click o Alt-Click para el cambiador de equipamiento.\"\nL_STATS_RC_EXPERIENCE = \"Clic derecho para alternar experiencia, tiempo jugado y facciones.\"\nL_STATS_WATCH_FACTIONS = \"Mirar facciones desde la herramienta de facciones.\"\nL_STATS_TOOLTIP_EXPERIENCE = \"Cuando no estes a nivel max, la descripcion mostrara detalles de la experiencia.\"\nL_STATS_TOOLTIP_TIME_PLAYED = \"Cuando estes a nivel max, la descripcion mostrara detalles del tiempo jugado de la cuenta.\"\nL_STATS_OPEN_TALENT = \"Click-Izquierdo activa tu especializacion de talentos.\"\nL_STATS_RC_TALENT = \"Right-Click toggles your loot specialization.\" -- Need review\nL_STATS_LOCATION = \"Situación/Coordenadas\"\nL_STATS_WORLD_MAP = \"Clickeando abres el Mapa del Mundo.\"\nL_STATS_INSERTS_COORDS = \"Shift-Click en los modulos de localizacion o coordenadas inserta las coords en el chat.\"\nL_STATS_OPEN_CURRENCY = \"Click-Izquierdo abre la pestana de dinero.\"\nL_STATS_RC_AUTO_SELLING = \"Click-Derecho activa el Auto-Vender.\"\nL_STATS_NEED_TO_SELL = \"Use /junk to configure which items need to sell.\" -- Need review\nL_STATS_WATCH_CURRENCY = \"Elementos vistos en la pestana de dinero se reflejaran en la descripcion.\"\nL_STATS_OTHER_OPTIONS = \"Otras opciones se pueden configurar en %s\"\n\n-- Slash commands\nL_SLASHCMD_HELP = {\n\t\"Lista de comandos disponibles:\",\n\t\"/rl - Recargar interfaz.\",\n\t\"/rc - Realizar una comprobación.\",\n\t\"/gm - Abrir marco del MH.\",\n\t\"/dis ADDON_NAME - Desactiva el addon.\",\n\t\"/en ADDON_NAME - Activa el addon.\",\n\t\"/rd - Rompe el grupo o la banda.\",\n\t\"/toraid - Convierte el grupo a bandaConvert to party or raid.\",\n\t\"/teleport - Teleportarse desde una mazmorra aleatoria.\",\n\t\"/ss - Cambia entre especializaciones de talentos.\",\n\t\"/tt - Susurrar objetivo.\",\n\t\"/farmmode - Incrementa el tamaño del minimapa.\",\n\t\"/resetui - Reinicia la configuración general a la por defecto.\",\n\t\"/resetuf - Reinicia los marcos de unidades a su posición por defecto.\",\n\t\"/resetconfig - Reinicia la configuración de ShestakUI_Config.\",\n\t\"/resetstats - Reinicia las estadísticas de oro y tiempo empleado.\",\n\t\"/settings - Aplica la configuración a msbt, dbm, skada, o a todos los addons (con 'all').\",\n\t\"/ls - Ayuda para LiteStats.\",\n\t\"/xct - Gestiona el texto de combate.\",\n\t\"/raidcd - Prueba de los enfriamientos de la banda.\",\n\t\"/enemycd - Prueba de los enfriamientos del enemigo.\",\n\t\"/pulsecd - Prueba de tus propios enfriamientos.\",\n\t\"/threat - Prueba del medidor de amenaza.\",\n\t\"/testuf - Prueba de los marcos de unidades.\",\n\t\"/moveui - Permite mover los elementos de la interfaz.\", -- Need review\n\t\"/cfg - Abre la configuración de la interfaz.\",\n}"
  },
  {
    "path": "ShestakUI/Locales/Taiwan.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif T.client ~= \"zhTW\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for zhTW client\n--\tTranslation: Aelb, Ianchan, Leg883, Mania, Nanjiqq, Spacedragon, Tat2dawn, Tibles\n----------------------------------------------------------------------------------------\n-- Announce flasks and food\nL_ANNOUNCE_FF_NOFOOD = \"缺少食物: \"\nL_ANNOUNCE_FF_NOFLASK = \"缺少精煉: \"\nL_ANNOUNCE_FF_ALLBUFFED = \"已獲得所有增益 !\"\nL_ANNOUNCE_FF_CHECK_BUTTON = \"檢查食物和精煉\"\n\n-- Says thanks for some spells\nL_ANNOUNCE_SS_THANKS = \"謝謝你的 \"\nL_ANNOUNCE_SS_RECEIVED = \" 收到來自于 \"\n\n-- Pull countdown announce\nL_ANNOUNCE_PC_GO = \"開始 !\"\nL_ANNOUNCE_PC_MSG = \"準備接怪: %s，倒數 %s..\"\nL_ANNOUNCE_PC_ABORTED = \"取消拉怪 !\"\n\n-- Announce feasts and portals\nL_ANNOUNCE_FP_PRE = \"%s 放置了 %s\"\nL_ANNOUNCE_FP_PUT = \"%s 放置了 %s\"\nL_ANNOUNCE_FP_CAST = \"%s 開啟了 %s\"\nL_ANNOUNCE_FP_CLICK = \"%s 正在開啟 %s... 請點擊 !\"\nL_ANNOUNCE_FP_USE = \"%s 使用了 %s。\"\n\n-- Announce your interrupts\nL_ANNOUNCE_INTERRUPTED = \"已打斷\"\n\n-- Tooltip\nL_TOOLTIP_NO_TALENT = \"沒有天賦\"\nL_TOOLTIP_LOADING = \"讀取中...\"\nL_TOOLTIP_ACH_STATUS = \"你的狀態: \"\nL_TOOLTIP_ACH_COMPLETE = \"你的狀態: 完成\"\nL_TOOLTIP_ACH_INCOMPLETE = \"你的狀態: 未完成\"\nL_TOOLTIP_SPELL_ID = \"法術ID: \"\nL_TOOLTIP_ITEM_ID = \"物品ID: \"\nL_TOOLTIP_WHO_TARGET = \"關注\"\nL_TOOLTIP_ITEM_COUNT = \"物品數量: \"\nL_TOOLTIP_INSPECT_OPEN = \"檢查框體已開啟\"\n\n-- Misc\nL_MISC_UNDRESS = \"無裝備\"\nL_MISC_DRINKING = \" 進食中...\"\nL_MISC_BUY_STACK = \"Alt+右鍵批量購買\"\nL_MISC_UI_OUTDATED = \"ShestakUI 版本已過期，請至 www.shestak.org 下載最新版。\"\nL_MISC_HEADER_MARK = \"滑鼠懸停顯示團隊圖標\"\nL_MISC_BINDER_OPEN = \"滑鼠綁定\"\nL_MISC_SCROLL = \"附魔皮紙\"\nL_MISC_HEADER_QUEST = \"Auto quest button\" -- Needs review\n\n-- Raid Utility\nL_RAID_UTIL_DISBAND = \"解散團隊\"\n\n-- Zone name\nL_ZONE_ANCIENTDALARAN = \"達拉然陷坑\"\n\n-- WatchFrame Wowhead link\nL_WATCH_WOWHEAD_LINK = \"Wowhead鏈接\"\n\n-- Toggle Menu\nL_TOGGLE_ADDON = \"插件 \"\nL_TOGGLE_ADDONS = \" 插件系列\"\nL_TOGGLE_EXPAND = \"展開 \"\nL_TOGGLE_COLLAPSE = \"折疊 \"\nL_TOGGLE_RCLICK = \"右鍵 啟用/禁用\"\nL_TOGGLE_LCLICK = \"左鍵 顯示/隱藏窗口 \"\nL_TOGGLE_RELOAD = \" (需要重載插件)\"\nL_TOGGLE_NOT_FOUND = \" 未創建\"\n\n-- UnitFrame\nL_UF_GHOST = \"靈魂\"\nL_UF_DEAD = \"死亡\"\nL_UF_OFFLINE = \"離線\"\nL_UF_MANA = \"低法力值\"\n\n-- Map\nL_MAP_CURSOR = \"滑鼠: \"\nL_MAP_BOUNDS = \"超出範圍 !\"\nL_MAP_FOG = \"地圖全亮\"\nL_MAP_COORDS = \"坐標\"\n\n-- Minimap\nL_MINIMAP_CALENDAR = \"日曆\"\nL_MINIMAP_FARM = \"小地圖縮放\"\nL_MINIMAP_TOGGLE = \"快捷列自由折疊\"\n\n-- Chat\nL_CHAT_WHISPER = \"From\"\nL_CHAT_BN_WHISPER = \"From\"\nL_CHAT_AFK = \"[AFK]\"\nL_CHAT_DND = \"[DND]\"\nL_CHAT_GM = \"[GM]\"\nL_CHAT_GUILD = \"G\"\nL_CHAT_PARTY = \"P\"\nL_CHAT_PARTY_LEADER = \"PL\"\nL_CHAT_RAID = \"R\"\nL_CHAT_RAID_LEADER = \"RL\"\nL_CHAT_RAID_WARNING = \"RW\"\nL_CHAT_INSTANCE_CHAT = \"I\"\nL_CHAT_INSTANCE_CHAT_LEADER = \"IL\"\nL_CHAT_OFFICER = \"O\"\nL_CHAT_PET_BATTLE = \"PB\"\nL_CHAT_COME_ONLINE = \"|cff298F00上線了|r\"\nL_CHAT_GONE_OFFLINE = \"|cffff0000下線了|r\"\n\n-- Errors frame\nL_ERRORFRAME_L = \"點擊查看錯誤\"\n\n-- Bags\nL_BAG_SHOW_BAGS = \"顯示背包\"\nL_BAG_RIGHT_CLICK_SEARCH = \"右鍵搜尋物品\"\nL_BAG_STACK_MENU = \"堆疊\"\nL_BAG_RIGHT_CLICK_CLOSE = \"右鍵開啟菜單\"\n\n-- Grab mail\nL_MAIL_STOPPED = \"無法拾取，背包已滿。\"\nL_MAIL_UNIQUE = \"中止，在背包或銀行發現重複的唯一物品。\"\nL_MAIL_COMPLETE = \"完成\"\nL_MAIL_NEED = \"需要信箱\"\nL_MAIL_MESSAGES = \"新郵件\"\n\n-- Loot\nL_LOOT_RANDOM = \"隨機拾取\"\nL_LOOT_SELF = \"個人拾取\"\nL_LOOT_FISH = \"釣魚拾取\"\nL_LOOT_ANNOUNCE = \"向頻道通告\"\nL_LOOT_TO_RAID = \" 團隊\"\nL_LOOT_TO_PARTY = \" 隊伍\"\nL_LOOT_TO_GUILD = \" 公會\"\nL_LOOT_TO_SAY = \" 說\"\n\n-- LitePanels AFK module\nL_PANELS_AFK = \"正處于暫離狀態 !\"\nL_PANELS_AFK_RCLICK = \"右鍵隱藏\"\nL_PANELS_AFK_LCLICK = \"左鍵脫離暫離狀態\"\n\n-- Cooldowns\nL_COOLDOWNS = \"CD: \"\nL_COOLDOWNS_COMBATRESS = \"戰復\"\nL_COOLDOWNS_COMBATRESS_REMAINDER = \"戰復剩餘: \"\nL_COOLDOWNS_NEXTTIME = \"下次: \"\n\n-- Bind key\nL_BIND_SAVED = \"快捷鍵設置已保存\"\nL_BIND_DISCARD = \"新的快捷鍵設置已取消\"\nL_BIND_INSTRUCT = \"將滑鼠懸停至任意快捷鍵進行綁定。按ESC或者右鍵清除當前快捷鍵的按鍵綁定。\"\nL_BIND_CLEARED = \"已清除所有快捷鍵設置\"\nL_BIND_BINDING = \"綁定\"\nL_BIND_KEY = \"按鍵\"\nL_BIND_NO_SET = \"沒有綁定快捷鍵\"\n\n-- Info text\nL_INFO_ERRORS = \"目前沒有錯誤\"\nL_INFO_INVITE = \"接受邀請\"\nL_INFO_DUEL = \"拒絕決鬥請求\"\nL_INFO_PET_DUEL = \"拒絕寵物對戰請求\"\nL_INFO_DISBAND = \"解散隊伍...\"\nL_INFO_SETTINGS_DBM = \"鍵入 /settings dbm 載入 DBM 的設定\"\nL_INFO_SETTINGS_BIGWIGS = \"鍵入 /settings bw 載入 BigWigs 的設定\"\nL_INFO_SETTINGS_MSBT = \"鍵入 /settings msbt 載入 MSBT 的設定\"\nL_INFO_SETTINGS_SKADA = \"鍵入 /settings skada 載入 Skada 的設定\"\nL_INFO_SETTINGS_ALL = \"鍵入 /settings all 載入所有UI設定\"\nL_INFO_NOT_INSTALLED = \" 沒有安裝\"\nL_INFO_SKIN_DISABLED1 = \"界面美化啟用\"\nL_INFO_SKIN_DISABLED2 = \" 已禁用\"\n\n-- Moving elements\nL_MOVE_RIGHT_CLICK = \"右鍵重置位置\"\nL_MOVE_MIDDLE_CLICK = \"中鍵臨時隱藏\"\n\n-- Popups\nL_POPUP_INSTALLUI = \"該角色首次使用ShestakUI，你必須重新加載UI來配置。\"\nL_POPUP_RESETUI = \"你確定要重新加載ShestakUI?\"\nL_POPUP_RESETSTATS = \"你確定要重置所有角色遊戲時間和金幣的統計數據?\"\nL_POPUP_DISBAND_RAID = \"你確定要解散團隊?\"\nL_POPUP_DISABLEUI = \"ShestakUI不支援此解析度，是否停用ShestakUI? (若要嘗試其他解析度請按取消)\"\nL_POPUP_SETTINGS_ALL = \"應用所有的UI設置?(DBM/BigWigs/Skada/MSBT)\"\nL_POPUP_SETTINGS_DBM = \"需要改變DBM描點及風格元素\"\nL_POPUP_SETTINGS_BW = \"需要改變BigWigs描點及風格元素\"\nL_POPUP_ARMORY = \"英雄榜\"\n\n-- Welcome message\nL_WELCOME_LINE_1 = \"歡迎使用ShestakUI \"\nL_WELCOME_LINE_2_1 = \"鍵入 /cfg 進行UI設置, 或者訪問 http://shestak.org\"\nL_WELCOME_LINE_2_2 = \"獲取更多信息。\"\n\n-- Combat text\nL_COMBATTEXT_KILLING_BLOW = \"最後一擊\"\nL_COMBATTEXT_TEST_DISABLED = \"戰鬥信息測試模式已禁用\"\nL_COMBATTEXT_TEST_ENABLED = \"戰鬥信息測試模式已啟用\"\nL_COMBATTEXT_TEST_USE_MOVE = \"鍵入 /xct move 移動/調整戰鬥信息框架大小\"\nL_COMBATTEXT_TEST_USE_TEST = \"鍵入 /xct test 啟用/禁用戰鬥信息測試模式\"\nL_COMBATTEXT_TEST_USE_RESET = \"鍵入 /xct reset 重置到初始位置\"\nL_COMBATTEXT_POPUP = \"保存戰鬥信息窗口的位置須重載插件\"\nL_COMBATTEXT_UNSAVED = \"戰鬥信息窗口位置尚未保存，不要忘記重新載入插件。\"\nL_COMBATTEXT_UNLOCKED = \"戰鬥信息已解鎖\"\n\n-- LiteStats\nL_STATS_AUTO_REPAIR = \"自動修裝\"\nL_STATS_GUILD_REPAIR = \"公會銀行修裝\"\nL_STATS_AUTO_SELL = \"自動販售灰色物品\"\nL_STATS_BANDWIDTH = \"寬頻: \"\nL_STATS_DOWNLOAD = \"下載: \"\nL_STATS_CURRENCY_RAID = \"徽印\"\nL_STATS_MEMORY_USAGE = \"插件資源佔用: \"\nL_STATS_TOTAL_MEMORY_USAGE = \"總資源佔用: \"\nL_STATS_TOTAL_CPU_USAGE = \"總CPU使用率: \"\nL_STATS_GARBAGE_COLLECTED = \"整理記憶體\"\nL_STATS_HIDDEN = \"隱藏\"\nL_STATS_JUNK_ALREADY_ADDITIONS = \"已加入自動販售列表\"\nL_STATS_JUNK_ITEMLINK = \"物品鏈結\"\nL_STATS_JUNK_ADDITIONS = \"自動販售列表\"\nL_STATS_JUNK_LIST = \"自動販售常用命令\"\nL_STATS_JUNK_PROFIT = \"自動販售所得金額\"\nL_STATS_JUNK_CLEARED = \"自動販售列表已清除\"\nL_STATS_JUNK_CLEAR_ADDITIONS = \"清除自動販售列表\"\nL_STATS_JUNK_ADDED = \"自動販售 - 已加入\"\nL_STATS_JUNK_ADD_ITEM = \"增加/移除 物品\"\nL_STATS_JUNK_REMOVED = \"自動販售 - 已移除\"\nL_STATS_JUNK_ITEMS_LIST = \"列出自動販售列表\"\nL_STATS_KILLS = \"擊殺\"\nL_STATS_XP_RATE = \"當前等級經驗值趴數\"\nL_STATS_HR = \"小時\"\nL_STATS_INF = \"無限\"\nL_STATS_ON = \"啟用\"\nL_STATS_PLAYED_LEVEL = \"當前等級總在線時間\"\nL_STATS_PLAYED_SESSION = \"此次在線時長\"\nL_STATS_ACC_PLAYED = \"帳號啟用總時間\"\nL_STATS_PLAYED_TOTAL = \"總在線時長\"\nL_STATS_QUEST = \"任務\"\nL_STATS_QUESTS_TO = \"任務/殺怪得到經驗值 %s\"\nL_STATS_CURRENT_XP = \"目前/升級所需經驗值\"\nL_STATS_REMAINING_XP = \"升級尚需經驗值\"\nL_STATS_RESTED_XP = \"休息獎勵經驗值\"\nL_STATS_SERVER_GOLD = \"帳號總現金\"\nL_STATS_SESSION_GAIN = \"此次在線時段獲得/損失金額\"\nL_STATS_SESSION_XP = \"此次在線時段所得經驗值\"\nL_STATS_SORTING_BY = \"排列方式: \"\nL_STATS_SEALS = \"本週已領徽印\"\nL_STATS_SPEC = \"專精\"\nL_STATS_TIPS = \"提示: \"\nL_STATS_OPEN_CALENDAR = \"左鍵開/關行事曆\"\nL_STATS_RC_TIME_MANAGER = \"右鍵開/關計時器\"\nL_STATS_TOGGLE_TIME = \"當地/伺服器及24小時制可於計時器中設置\"\nL_STATS_MEMORY = \"記憶體\"\nL_STATS_RC_COLLECTS_GARBAGE = \"幀數模塊上滑鼠懸停顯示，右鍵整理記憶體\"\nL_STATS_VIEW_NOTES = \"按住Alt鍵檢視: 好友的所在地 公會成員的階級/註記/幹部註記\"\nL_STATS_CHANGE_SORTING = \"[公會]右鍵密語/邀請，中鍵更改排列方式，Shift+中鍵反轉排序\"\nL_STATS_OPEN_CHARACTER = \"左鍵開/關角色界面\"\nL_STATS_RC_AUTO_REPAIRING1 = \"右鍵開/關自動修裝\"\nL_STATS_RC_AUTO_REPAIRING2 = \"中鍵開/關公會修裝\"\nL_STATS_EQUIPMENT_CHANGER = \"Shift+左鍵或Alt+左鍵開啟套裝選單\"\nL_STATS_RC_EXPERIENCE = \"右鍵切換在線時間/神器信息/經驗值/聲望值\"\nL_STATS_WATCH_FACTIONS = \"左鍵開/關相關界面\"\nL_STATS_TOOLTIP_EXPERIENCE = \"未達最高等級時將優先顯示經驗值訊息\"\nL_STATS_TOOLTIP_TIME_PLAYED = \"達到最高等級後將優先顯示角色在線時間\"\nL_STATS_OPEN_TALENT = \"左鍵開啟專精選單，Shift+左鍵開啟專精界面\"\nL_STATS_RC_TALENT = \"右鍵開啟拾取專精選單\"\nL_STATS_LOCATION = \"位置/座標\"\nL_STATS_WORLD_MAP = \"點擊開/關世界地圖\"\nL_STATS_INSERTS_COORDS = \"Shift+左鍵地名/座標/定位標記自動複製到輸入框\"\nL_STATS_OPEN_CURRENCY = \"左鍵開/關兌換通貨界面\"\nL_STATS_RC_AUTO_SELLING = \"右鍵開/關自動販售\"\nL_STATS_NEED_TO_SELL = \"鍵入 /junk 列出常用命令\"\nL_STATS_WATCH_CURRENCY = \"在兌換通貨界面已選定的通貨將在金幣提示信息中顯示\"\nL_STATS_OTHER_OPTIONS = \"其它選項可以在這裡設置: %s\"\n\n-- Slash commands\nL_SLASHCMD_HELP = {\n\t\"可用的命令: \",\n\t\"/rl - 重載界面\",\n\t\"/rc - 準備確認\",\n\t\"/gm - 開啟GM界面\",\n\t\"/dis ADDON_NAME - 禁用指定插件\",\n\t\"/en ADDON_NAME - 開啟指定插件\",\n\t\"/rd - 解散隊伍\",\n\t\"/toraid - 轉換為隊伍/團隊\",\n\t\"/teleport - 傳出隨機副本\",\n\t\"/ss - 切換天賦\",\n\t\"/tt - 密語當前目標\",\n\t\"/farmmode - 開啟/關閉小地圖採集模式\",\n\t\"/resetui - 重置一般設置到預設值\",\n\t\"/resetuf - 重置頭像框架到預設位置\",\n\t\"/resetconfig - 重置ShestakUI_Config到預設值\",\n\t\"/resetstats - 重置所有角色遊戲時間和金幣的統計數據\",\n\t\"/settings - 設置指定插件\",\n\t\"/ls - 信息條功能說明\",\n\t\"/xct - 戰鬥信息選項\",\n\t\"/raidcd - 團隊技能冷卻測試模式\",\n\t\"/enemycd - 敵對技能冷卻測試模式\",\n\t\"/pulsecd - 技能冷卻閃爍測試模式\",\n\t\"/threat - 仇恨欄測試模式\",\n\t\"/testuf - 頭像框架測試模式\",\n\t\"/moveui - 解鎖/鎖定 界面中所有可移動的框體，Ctrl+右鍵選中的框架重置到預設位置\", -- Need review\n\t\"/cfg - 開啟ShestakUI設置界面\",\n}\n"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bar1.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tActionBar(by Tukz)\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"Bar1Holder\", ActionBarAnchor, \"SecureHandlerStateTemplate\")\nif C.actionbar.editor then\n\tlocal NumRow = ceil(C.actionbar.bar1_num / C.actionbar.bar1_row)\n\tbar:SetWidth((C.actionbar.bar1_size * C.actionbar.bar1_row) + (C.actionbar.button_space * (C.actionbar.bar1_row - 1)))\n\tbar:SetHeight((C.actionbar.bar1_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))\n\tbar:SetPoint(\"BOTTOMLEFT\", ActionBarAnchor, 0, 0)\nelse\n\tbar:SetAllPoints(ActionBarAnchor)\nend\n\nlocal Page = {\n\t[\"DRUID\"] = \"[bonusbar:1,nostealth] 7; [bonusbar:1,stealth] 8; [bonusbar:2] 8; [bonusbar:3] 9; [bonusbar:4] 10;\",\n\t[\"EVOKER\"] = \"[bonusbar:1] 7;\",\n\t[\"ROGUE\"] = \"[bonusbar:1] 7;\",\n\t[\"DEFAULT\"] = \"[possessbar] 16; [shapeshift] 17; [overridebar] 18; [vehicleui] 16; [bar:2] 2; [bar:3] 3; [bar:4] 4; [bar:5] 5; [bar:6] 6; [bonusbar:5] 11;\",\n}\n\nlocal function GetBar()\n\tlocal condition = Page[\"DEFAULT\"]\n\tlocal class = T.class\n\tlocal page = Page[class]\n\tif page then\n\t\tcondition = condition..\" \"..page\n\tend\n\tcondition = condition..\" 1\"\n\treturn condition\nend\n\nbar:RegisterEvent(\"PLAYER_LOGIN\")\nbar:RegisterEvent(\"UPDATE_VEHICLE_ACTIONBAR\")\nbar:RegisterEvent(\"UPDATE_OVERRIDE_ACTIONBAR\")\nbar:RegisterEvent(\"UNIT_ENTERED_VEHICLE\")\nbar:RegisterEvent(\"UNIT_EXITED_VEHICLE\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tif event == \"PLAYER_LOGIN\" then\n\t\tlocal NumPerRows = C.actionbar.bar1_row\n\t\tlocal NextRowButtonAnchor = _G[\"ActionButton1\"]\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"ActionButton\"..i]\n\t\t\tb:SetSize(C.actionbar.button_size, C.actionbar.button_size)\n\t\t\tb:ClearAllPoints()\n\t\t\tif C.actionbar.editor then\n\t\t\t\tif i <= C.actionbar.bar1_num then\n\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\tb:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 0, 0)\n\t\t\t\t\telseif i == NumPerRows + 1 then\n\t\t\t\t\t\tb:SetPoint(\"TOPLEFT\", NextRowButtonAnchor, \"BOTTOMLEFT\", 0, -C.actionbar.button_space)\n\n\t\t\t\t\t\tNumPerRows = NumPerRows + C.actionbar.bar1_row\n\t\t\t\t\t\tNextRowButtonAnchor = _G[\"ActionButton\"..i]\n\t\t\t\t\telse\n\t\t\t\t\t\tb:SetPoint(\"LEFT\", _G[\"ActionButton\"..i-1], \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tb:SetPoint(\"TOP\", UIParent, \"TOP\", 0, 200)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif i == 1 then\n\t\t\t\t\tb:SetPoint(\"BOTTOMLEFT\", Bar1Holder, 0, 0)\n\t\t\t\telse\n\t\t\t\t\tlocal previous = _G[\"ActionButton\"..i-1]\n\t\t\t\t\tb:SetPoint(\"LEFT\", previous, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tself:SetFrameRef(\"ActionButton\"..i, b)\n\t\t\tb:SetParent(Bar1Holder)\n\t\tend\n\n\t\tself:Execute([[\n\t\t\tbuttons = table.new()\n\t\t\tfor i = 1, 12 do\n\t\t\t\ttable.insert(buttons, self:GetFrameRef(\"ActionButton\"..i))\n\t\t\tend\n\t\t]])\n\n\t\tself:SetAttribute(\"_onstate-page\", [[\n\t\t\tfor i, button in ipairs(buttons) do\n\t\t\t\tbutton:SetAttribute(\"actionpage\", tonumber(newstate))\n\t\t\tend\n\t\t]])\n\n\t\tRegisterStateDriver(self, \"page\", GetBar())\n\telseif event == \"UPDATE_VEHICLE_ACTIONBAR\" or event == \"UPDATE_OVERRIDE_ACTIONBAR\" then\n\t\tfor i = 1, NUM_ACTIONBAR_BUTTONS do\n\t\t\tlocal button = _G[\"ActionButton\"..i]\n\t\t\tlocal action = button.action\n\t\t\tlocal icon = button.icon\n\n\t\t\tif action >= 120 then\n\t\t\t\tlocal texture = GetActionTexture(action)\n\n\t\t\t\tif texture then\n\t\t\t\t\ticon:SetTexture(texture)\n\t\t\t\t\ticon:Show()\n\t\t\t\telse\n\t\t\t\t\tif icon:IsShown() then\n\t\t\t\t\t\ticon:Hide()\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif event == \"UNIT_ENTERED_VEHICLE\" then\n\t\tif UnitHasVehicleUI(\"player\") then\n\t\t\tfor i = 1, NUM_ACTIONBAR_BUTTONS do\n\t\t\t\tlocal button = _G[\"ActionButton\"..i]\n\t\t\t\tbutton:GetCheckedTexture():SetAlpha(0)\n\t\t\tend\n\t\tend\n\telseif event == \"UNIT_EXITED_VEHICLE\" then\n\t\tfor i = 1, NUM_ACTIONBAR_BUTTONS do\n\t\t\tlocal button = _G[\"ActionButton\"..i]\n\t\t\tbutton:GetCheckedTexture():SetAlpha(1)\n\t\tend\n\tend\nend)\n\nif C.actionbar.bottombars_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"ActionButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() BottomBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)\n\tend\nend\n\nif C.actionbar.editor and C.actionbar.bar1_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"ActionButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() Bar1MouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then Bar1MouseOver(0) end end)\n\tend\n\n\tbar:SetScript(\"OnEnter\", function() Bar1MouseOver(1) end)\n\tbar:SetScript(\"OnLeave\", function() if not HoverBind.enabled then Bar1MouseOver(0) end end)\nend\n"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bar2.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMultiBarBottomLeft(by Tukz)\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"Bar2Holder\", ActionBarAnchor)\nif C.actionbar.editor then\n\tlocal NumRow = ceil(C.actionbar.bar2_num / C.actionbar.bar2_row)\n\tbar:SetWidth((C.actionbar.bar2_size * C.actionbar.bar2_row) + (C.actionbar.button_space * (C.actionbar.bar2_row - 1)))\n\tbar:SetHeight((C.actionbar.bar2_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))\n\tbar:SetPoint(\"BOTTOMLEFT\", Bar1Holder, \"TOPLEFT\", 0, C.actionbar.button_space)\nelse\n\tbar:SetAllPoints(ActionBarAnchor)\nend\nMultiBarBottomLeft:SetParent(bar)\n\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tSettings.SetValue(\"PROXY_SHOW_ACTIONBAR_2\", true)\n\tlocal NumPerRows = C.actionbar.bar2_row\n\tlocal NextRowButtonAnchor = _G[\"MultiBarBottomLeftButton1\"]\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarBottomLeftButton\"..i]\n\t\tlocal b2 = _G[\"MultiBarBottomLeftButton\"..i-1]\n\t\tb:ClearAllPoints()\n\t\tif C.actionbar.editor then\n\t\t\tif i <= C.actionbar.bar2_num then\n\t\t\t\tif i == 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 0, 0)\n\t\t\t\telseif i == NumPerRows + 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", NextRowButtonAnchor, \"BOTTOMLEFT\", 0, -C.actionbar.button_space)\n\n\t\t\t\t\tNumPerRows = NumPerRows + C.actionbar.bar2_row\n\t\t\t\t\tNextRowButtonAnchor = _G[\"MultiBarBottomLeftButton\"..i]\n\t\t\t\telse\n\t\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tb:SetPoint(\"TOP\", UIParent, \"TOP\", 0, 200)\n\t\t\tend\n\t\telse\n\t\t\tif i == 1 then\n\t\t\t\tb:SetPoint(\"BOTTOM\", ActionButton1, \"TOP\", 0, C.actionbar.button_space)\n\t\t\telse\n\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\tend\n\t\tend\n\tend\nend)\n\n-- Hide bar\nif C.actionbar.bottombars == 1 then\n\tbar:Hide()\nend\n\nif C.actionbar.bottombars_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarBottomLeftButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() BottomBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)\n\tend\nend\n\nif C.actionbar.editor and C.actionbar.bar2_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarBottomLeftButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() Bar2MouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then Bar2MouseOver(0) end end)\n\tend\n\n\tbar:SetScript(\"OnEnter\", function() Bar2MouseOver(1) end)\n\tbar:SetScript(\"OnLeave\", function() if not HoverBind.enabled then Bar2MouseOver(0) end end)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bar3.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMultiBarLeft(by Tukz)\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"Bar3Holder\", RightActionBarAnchor)\nif C.actionbar.editor then\n\tlocal NumRow = ceil(C.actionbar.bar3_num / C.actionbar.bar3_row)\n\tbar:SetWidth((C.actionbar.bar3_size * C.actionbar.bar3_row) + (C.actionbar.button_space * (C.actionbar.bar3_row - 1)))\n\tbar:SetHeight((C.actionbar.bar3_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))\n\tbar:SetPoint(\"TOPRIGHT\", RightActionBarAnchor, \"TOPRIGHT\", -(C.actionbar.bar3_size + C.actionbar.button_space) , 0)\nelse\n\tbar:SetAllPoints(RightActionBarAnchor)\nend\nMultiBarLeft:SetParent(bar)\n\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tSettings.SetValue(\"PROXY_SHOW_ACTIONBAR_3\", true)\n\tlocal NumPerRows = C.actionbar.bar3_row\n\tlocal NextRowButtonAnchor = _G[\"MultiBarLeftButton1\"]\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarLeftButton\"..i]\n\t\tlocal b2 = _G[\"MultiBarLeftButton\"..i-1]\n\t\tb:ClearAllPoints()\n\t\tif C.actionbar.editor then\n\t\t\tif i <= C.actionbar.bar3_num then\n\t\t\t\tif i == 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 0, 0)\n\t\t\t\telseif i == NumPerRows + 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", NextRowButtonAnchor, \"BOTTOMLEFT\", 0, -C.actionbar.button_space)\n\n\t\t\t\t\tNumPerRows = NumPerRows + C.actionbar.bar3_row\n\t\t\t\t\tNextRowButtonAnchor = _G[\"MultiBarLeftButton\"..i]\n\t\t\t\telse\n\t\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tb:SetPoint(\"TOP\", UIParent, \"TOP\", 0, 200)\n\t\t\tend\n\t\telse\n\t\t\tif i == 1 then\n\t\t\t\tif C.actionbar.rightbars == 3 then\n\t\t\t\t\tb:SetPoint(\"TOP\", RightActionBarAnchor, \"TOP\", 0, 0)\n\t\t\t\telse\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", RightActionBarAnchor, \"TOPLEFT\", 0, 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tb:SetPoint(\"TOP\", b2, \"BOTTOM\", 0, -C.actionbar.button_space)\n\t\t\tend\n\t\tend\n\tend\nend)\n\n-- Hide bar\nif C.actionbar.rightbars < 2 then\n\tbar:Hide()\nend\n\n-- Mouseover bar\nif C.actionbar.rightbars_mouseover == true then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarLeftButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() RightBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)\n\tend\nend\n\nif C.actionbar.editor and C.actionbar.bar3_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarLeftButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() Bar3MouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then Bar3MouseOver(0) end end)\n\tend\n\n\tbar:SetScript(\"OnEnter\", function() Bar3MouseOver(1) end)\n\tbar:SetScript(\"OnLeave\", function() if not HoverBind.enabled then Bar3MouseOver(0) end end)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bar4.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMultiBarRight(by Tukz)\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"Bar4Holder\", RightActionBarAnchor)\nif C.actionbar.editor then\n\tlocal NumRow = ceil(C.actionbar.bar4_num / C.actionbar.bar4_row)\n\tbar:SetWidth((C.actionbar.bar4_size * C.actionbar.bar4_row) + (C.actionbar.button_space * (C.actionbar.bar4_row - 1)))\n\tbar:SetHeight((C.actionbar.bar4_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))\n\tbar:SetPoint(\"TOPRIGHT\", RightActionBarAnchor, \"TOPRIGHT\", 0, 0)\nelse\n\tbar:SetAllPoints(RightActionBarAnchor)\nend\nMultiBarRight:SetParent(bar)\n\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tSettings.SetValue(\"PROXY_SHOW_ACTIONBAR_4\", true)\n\tlocal NumPerRows = C.actionbar.bar4_row\n\tlocal NextRowButtonAnchor = _G[\"MultiBarRightButton1\"]\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarRightButton\"..i]\n\t\tlocal b2 = _G[\"MultiBarRightButton\"..i-1]\n\t\tb:ClearAllPoints()\n\t\tif C.actionbar.editor then\n\t\t\tif i <= C.actionbar.bar4_num then\n\t\t\t\tif i == 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 0, 0)\n\t\t\t\telseif i == NumPerRows + 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", NextRowButtonAnchor, \"BOTTOMLEFT\", 0, -C.actionbar.button_space)\n\n\t\t\t\t\tNumPerRows = NumPerRows + C.actionbar.bar4_row\n\t\t\t\t\tNextRowButtonAnchor = _G[\"MultiBarRightButton\"..i]\n\t\t\t\telse\n\t\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tb:SetPoint(\"TOP\", UIParent, \"TOP\", 0, 200)\n\t\t\tend\n\t\telse\n\t\t\tif i == 1 then\n\t\t\t\tb:SetPoint(\"TOPRIGHT\", RightActionBarAnchor, \"TOPRIGHT\", 0, 0)\n\t\t\telse\n\t\t\t\tb:SetPoint(\"TOP\", b2, \"BOTTOM\", 0, -C.actionbar.button_space)\n\t\t\tend\n\t\tend\n\tend\nend)\n\n-- Hide bar\nif C.actionbar.rightbars < 1 then\n\tbar:Hide()\nend\n\n-- Mouseover bar\nif C.actionbar.rightbars_mouseover == true then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarRightButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() RightBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)\n\tend\nend\n\nif C.actionbar.editor and C.actionbar.bar4_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarRightButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() Bar4MouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then Bar4MouseOver(0) end end)\n\tend\n\n\tbar:SetScript(\"OnEnter\", function() Bar4MouseOver(1) end)\n\tbar:SetScript(\"OnLeave\", function() if not HoverBind.enabled then Bar4MouseOver(0) end end)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bar5.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMultiBarBottomRight(by Tukz)\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"Bar5Holder\", T_PetBattleFrameHider)\nif C.actionbar.split_bars == true then\n\tbar:SetAllPoints(SplitBarLeft)\nelse\n\tif C.actionbar.editor then\n\t\tlocal NumRow = ceil(C.actionbar.bar5_num / C.actionbar.bar5_row)\n\t\tbar:SetWidth((C.actionbar.bar5_size * C.actionbar.bar5_row) + (C.actionbar.button_space * (C.actionbar.bar5_row - 1)))\n\t\tbar:SetHeight((C.actionbar.bar5_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))\n\t\tbar:SetPoint(\"BOTTOMLEFT\", Bar2Holder, \"TOPLEFT\", 0, C.actionbar.button_space)\n\telse\n\t\tbar:SetAllPoints(ActionBarAnchor)\n\tend\nend\nMultiBarBottomRight:SetParent(bar)\nbar:SetFrameStrata(\"LOW\")\n\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tSettings.SetValue(\"PROXY_SHOW_ACTIONBAR_5\", true)\n\tlocal NumPerRows = C.actionbar.bar5_row\n\tlocal NextRowButtonAnchor = _G[\"MultiBarBottomRightButton1\"]\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\tlocal b2 = _G[\"MultiBarBottomRightButton\"..i-1]\n\t\tb:ClearAllPoints()\n\t\tif C.actionbar.split_bars == true then\n\t\t\tif i == 1 then\n\t\t\t\tb:SetPoint(\"TOPLEFT\", SplitBarLeft, \"TOPLEFT\", 0, 0)\n\t\t\telseif i == 4 then\n\t\t\t\tb:SetPoint(\"BOTTOMLEFT\", SplitBarLeft, \"BOTTOMLEFT\", 0, 0)\n\t\t\telseif i == 7 then\n\t\t\t\tb:SetPoint(\"TOPLEFT\", SplitBarRight, \"TOPLEFT\", C.actionbar.button_space, 0)\n\t\t\telseif i == 10 then\n\t\t\t\tb:SetPoint(\"BOTTOMLEFT\", SplitBarRight, \"BOTTOMLEFT\", C.actionbar.button_space, 0)\n\t\t\telse\n\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", C.actionbar.button_space, 0)\n\t\t\tend\n\t\telse\n\t\t\tif C.actionbar.editor then\n\t\t\t\tif i <= C.actionbar.bar5_num then\n\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\tb:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 0, 0)\n\t\t\t\t\telseif i == NumPerRows + 1 then\n\t\t\t\t\t\tb:SetPoint(\"TOPLEFT\", NextRowButtonAnchor, \"BOTTOMLEFT\", 0, -C.actionbar.button_space)\n\n\t\t\t\t\t\tNumPerRows = NumPerRows + C.actionbar.bar5_row\n\t\t\t\t\t\tNextRowButtonAnchor = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\t\t\telse\n\t\t\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tb:SetPoint(\"TOP\", UIParent, \"TOP\", 0, 200)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif i == 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", Bar1Holder, 0, 0)\n\t\t\t\telse\n\t\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend)\n\n-- Hide bar\nif C.actionbar.bottombars < 3 then\n\tbar:Hide()\nend\n\n-- Mouseover bar\nif C.actionbar.bottombars_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() BottomBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)\n\tend\nend\n\nif C.actionbar.editor and C.actionbar.bar5_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() Bar5MouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then Bar5MouseOver(0) end end)\n\tend\n\n\tbar:SetScript(\"OnEnter\", function() Bar5MouseOver(1) end)\n\tbar:SetScript(\"OnLeave\", function() if not HoverBind.enabled then Bar5MouseOver(0) end end)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bar6.lua",
    "content": "local T, C, L, _ = unpack(ShestakUI)\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMultiBar5\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"Bar6Holder\", UIParent)\nif C.actionbar.editor then\n\tlocal NumRow = ceil(C.actionbar.bar6_num / C.actionbar.bar6_row)\n\tbar:SetWidth((C.actionbar.bar6_size * C.actionbar.bar6_row) + (C.actionbar.button_space * (C.actionbar.bar6_row - 1)))\n\tbar:SetHeight((C.actionbar.bar6_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))\n\tbar:SetPoint(\"TOPRIGHT\", RightActionBarAnchor, \"TOPRIGHT\", -2 * (C.actionbar.bar6_size + C.actionbar.button_space) , 0)\nelse\n\tbar:SetAllPoints(RightActionBarAnchor)\nend\nMultiBar5:SetParent(bar)\n\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tSettings.SetValue(\"PROXY_SHOW_ACTIONBAR_6\", true)\n\tlocal NumPerRows = C.actionbar.bar6_row\n\tlocal NextRowButtonAnchor = _G[\"MultiBar5Button1\"]\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBar5Button\"..i]\n\t\tlocal b2 = _G[\"MultiBar5Button\"..i-1]\n\t\tb:ClearAllPoints()\n\t\tif C.actionbar.editor then\n\t\t\tif i <= C.actionbar.bar6_num then\n\t\t\t\tif i == 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 0, 0)\n\t\t\t\telseif i == NumPerRows + 1 then\n\t\t\t\t\tb:SetPoint(\"TOPLEFT\", NextRowButtonAnchor, \"BOTTOMLEFT\", 0, -C.actionbar.button_space)\n\n\t\t\t\t\tNumPerRows = NumPerRows + C.actionbar.bar6_row\n\t\t\t\t\tNextRowButtonAnchor = _G[\"MultiBar5Button\"..i]\n\t\t\t\telse\n\t\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tb:SetPoint(\"TOP\", UIParent, \"TOP\", 0, 200)\n\t\t\tend\n\t\telse\n\t\t\tif i == 1 then\n\t\t\t\tb:SetPoint(\"TOPLEFT\", RightActionBarAnchor, \"TOPLEFT\", 0, 0)\n\t\t\telse\n\t\t\t\tb:SetPoint(\"TOP\", b2, \"BOTTOM\", 0, -C.actionbar.button_space)\n\t\t\tend\n\t\tend\n\tend\nend)\n\n-- Hide bar\nif C.actionbar.rightbars < 3 then\n\tbar:Hide()\nend\n\n-- Mouseover bar\nif C.actionbar.rightbars_mouseover == true then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBar5Button\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() RightBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)\n\tend\nend\n\nif C.actionbar.editor and C.actionbar.bar6_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBar5Button\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() Bar6MouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then Bar6MouseOver(0) end end)\n\tend\n\n\tbar:SetScript(\"OnEnter\", function() Bar6MouseOver(1) end)\n\tbar:SetScript(\"OnLeave\", function() if not HoverBind.enabled then Bar6MouseOver(0) end end)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bar7.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMultiBar6\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"Bar7Holder\", UIParent)\nlocal NumRow = ceil(C.actionbar.bar7_num / C.actionbar.bar7_row)\nbar:SetWidth((C.actionbar.bar7_size * C.actionbar.bar7_row) + (C.actionbar.button_space * (C.actionbar.bar7_row - 1)))\nbar:SetHeight((C.actionbar.bar7_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))\nbar:SetPoint(\"BOTTOM\", ActionBarAnchor, \"TOP\", 0, 3)\nMultiBar6:SetParent(bar)\n\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tSettings.SetValue(\"PROXY_SHOW_ACTIONBAR_7\", true)\n\tlocal NumPerRows = C.actionbar.bar7_row\n\tlocal NextRowButtonAnchor = _G[\"MultiBar6Button1\"]\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBar6Button\"..i]\n\t\tlocal b2 = _G[\"MultiBar6Button\"..i-1]\n\t\tb:ClearAllPoints()\n\t\tif i <= C.actionbar.bar7_num then\n\t\t\tif i == 1 then\n\t\t\t\tb:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 0, 0)\n\t\t\telseif i == NumPerRows + 1 then\n\t\t\t\tb:SetPoint(\"TOPLEFT\", NextRowButtonAnchor, \"BOTTOMLEFT\", 0, -C.actionbar.button_space)\n\n\t\t\t\tNumPerRows = NumPerRows + C.actionbar.bar7_row\n\t\t\t\tNextRowButtonAnchor = _G[\"MultiBar6Button\"..i]\n\t\t\telse\n\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\tend\n\t\telse\n\t\t\tb:SetPoint(\"TOP\", UIParent, \"TOP\", 0, 200)\n\t\tend\n\tend\nend)\n\n-- Hide bar\nif not C.actionbar.bar7_enable then\n\tbar:Hide()\nend\n\n-- Mouseover bar\nif C.actionbar.bar7_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBar6Button\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() Bar7MouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then Bar7MouseOver(0) end end)\n\tend\n\n\tbar:SetScript(\"OnEnter\", function() Bar7MouseOver(1) end)\n\tbar:SetScript(\"OnLeave\", function() if not HoverBind.enabled then Bar7MouseOver(0) end end)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bar8.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMultiBar7\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"Bar8Holder\", UIParent)\nlocal NumRow = ceil(C.actionbar.bar8_num / C.actionbar.bar8_row)\nbar:SetWidth((C.actionbar.bar8_size * C.actionbar.bar8_row) + (C.actionbar.button_space * (C.actionbar.bar8_row - 1)))\nbar:SetHeight((C.actionbar.bar8_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))\nbar:SetPoint(\"BOTTOM\", Bar7Holder or ActionBarAnchor, \"TOP\", 0, 3)\nMultiBar7:SetParent(bar)\n\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tSettings.SetValue(\"PROXY_SHOW_ACTIONBAR_8\", true)\n\tlocal NumPerRows = C.actionbar.bar8_row\n\tlocal NextRowButtonAnchor = _G[\"MultiBar7Button1\"]\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBar7Button\"..i]\n\t\tlocal b2 = _G[\"MultiBar7Button\"..i-1]\n\t\tb:ClearAllPoints()\n\t\tif i <= C.actionbar.bar8_num then\n\t\t\tif i == 1 then\n\t\t\t\tb:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 0, 0)\n\t\t\telseif i == NumPerRows + 1 then\n\t\t\t\tb:SetPoint(\"TOPLEFT\", NextRowButtonAnchor, \"BOTTOMLEFT\", 0, -C.actionbar.button_space)\n\n\t\t\t\tNumPerRows = NumPerRows + C.actionbar.bar8_row\n\t\t\t\tNextRowButtonAnchor = _G[\"MultiBar7Button\"..i]\n\t\t\telse\n\t\t\t\tb:SetPoint(\"LEFT\", b2, \"RIGHT\", T.Scale(C.actionbar.button_space), 0)\n\t\t\tend\n\t\telse\n\t\t\tb:SetPoint(\"TOP\", UIParent, \"TOP\", 0, 200)\n\t\tend\n\tend\nend)\n\n-- Hide bar\nif not C.actionbar.bar8_enable then\n\tbar:Hide()\nend\n\n-- Mouseover bar\nif C.actionbar.bar8_mouseover then\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"MultiBar7Button\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() Bar8MouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then Bar8MouseOver(0) end end)\n\tend\n\n\tbar:SetScript(\"OnEnter\", function() Bar8MouseOver(1) end)\n\tbar:SetScript(\"OnLeave\", function() if not HoverBind.enabled then Bar8MouseOver(0) end end)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/BarPet.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPetActionBar(by Tukz)\n----------------------------------------------------------------------------------------\n-- Hide bar\nif C.actionbar.petbar_hide then PetActionBarAnchor:Hide() return end\n\n-- Create bar\nlocal bar = CreateFrame(\"Frame\", \"PetHolder\", UIParent, \"SecureHandlerStateTemplate\")\nbar:SetAllPoints(PetActionBarAnchor)\n\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:RegisterEvent(\"PLAYER_CONTROL_LOST\")\nbar:RegisterEvent(\"PLAYER_CONTROL_GAINED\")\nbar:RegisterEvent(\"PLAYER_FARSIGHT_FOCUS_CHANGED\")\nbar:RegisterEvent(\"PET_BAR_UPDATE\")\nbar:RegisterEvent(\"PET_BAR_UPDATE_USABLE\")\nbar:RegisterEvent(\"PET_BAR_UPDATE_COOLDOWN\")\nbar:RegisterEvent(\"UNIT_PET\")\nbar:RegisterEvent(\"UNIT_FLAGS\")\nbar:RegisterEvent(\"UNIT_AURA\")\nbar:SetScript(\"OnEvent\", function(self, event, arg1)\n\tif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tT.StylePet()\n\t\tPetActionBar_ShowGrid = T.dummy\n\t\tPetActionBar_HideGrid = T.dummy\n\t\tPetActionBar.showgrid = nil\n\t\tfor i = 1, 10 do\n\t\t\tlocal button = _G[\"PetActionButton\"..i]\n\t\t\tbutton:ClearAllPoints()\n\t\t\tbutton:SetParent(self)\n\t\t\tif i == 1 then\n\t\t\t\tif C.actionbar.petbar_horizontal == true then\n\t\t\t\t\tbutton:SetPoint(\"BOTTOMLEFT\", 0, 0)\n\t\t\t\telse\n\t\t\t\t\tbutton:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal previous = _G[\"PetActionButton\"..i-1]\n\t\t\t\tif C.actionbar.petbar_horizontal == true then\n\t\t\t\t\tbutton:SetPoint(\"LEFT\", previous, \"RIGHT\", C.actionbar.button_space, 0)\n\t\t\t\telse\n\t\t\t\t\tbutton:SetPoint(\"TOP\", previous, \"BOTTOM\", 0, -C.actionbar.button_space)\n\t\t\t\tend\n\t\t\tend\n\t\t\tbutton:Show()\n\t\t\tself:SetAttribute(\"addchild\", button)\n\t\tend\n\t\tRegisterStateDriver(self, \"visibility\", \"[pet,novehicleui,nopossessbar,nopetbattle] show; hide\")\n\t\thooksecurefunc(PetActionBar, \"Update\", T.PetBarUpdate)\n\telseif event == \"PET_BAR_UPDATE\" or event == \"PLAYER_CONTROL_LOST\" or event == \"PLAYER_CONTROL_GAINED\" or event == \"PLAYER_FARSIGHT_FOCUS_CHANGED\"\n\tor event == \"UNIT_FLAGS\" or (event == \"UNIT_PET\" and arg1 == \"player\") or (event == \"UNIT_AURA\" and arg1 == \"pet\") then\n\t\tT.PetBarUpdate()\n\telseif event == \"PET_BAR_UPDATE_COOLDOWN\" then\n\t\tPetActionBar:UpdateCooldowns()\n\tend\nend)\n\nhooksecurefunc(PetActionButton10, \"SetPoint\", function(_, _, anchor)\n\tif InCombatLockdown() then return end\n\tif anchor and anchor == PetActionBar then\n\t\tfor i = 1, 10 do\n\t\t\tlocal button = _G[\"PetActionButton\"..i]\n\t\t\tbutton:ClearAllPoints()\n\t\t\tif i == 1 then\n\t\t\t\tif C.actionbar.petbar_horizontal == true then\n\t\t\t\t\tbutton:SetPoint(\"BOTTOMLEFT\", 0, 0)\n\t\t\t\telse\n\t\t\t\t\tbutton:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal previous = _G[\"PetActionButton\"..i-1]\n\t\t\t\tif C.actionbar.petbar_horizontal == true then\n\t\t\t\t\tbutton:SetPoint(\"LEFT\", previous, \"RIGHT\", C.actionbar.button_space, 0)\n\t\t\t\telse\n\t\t\t\t\tbutton:SetPoint(\"TOP\", previous, \"BOTTOM\", 0, -C.actionbar.button_space)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend)\n\n-- Mouseover bar\nif C.actionbar.rightbars_mouseover == true and C.actionbar.petbar_horizontal == false then\n\tPetActionBarAnchor:SetAlpha(0)\n\tPetActionBarAnchor:SetScript(\"OnEnter\", function() if PetHolder:IsShown() then RightBarMouseOver(1) end end)\n\tPetActionBarAnchor:SetScript(\"OnLeave\", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)\n\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\tlocal b = _G[\"PetActionButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() RightBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)\n\tend\nend\nif C.actionbar.petbar_mouseover == true and (C.actionbar.petbar_horizontal == true or C.actionbar.editor) then\n\tPetActionBarAnchor:SetAlpha(0)\n\tPetActionBarAnchor:SetScript(\"OnEnter\", function() PetBarMouseOver(1) end)\n\tPetActionBarAnchor:SetScript(\"OnLeave\", function() if not HoverBind.enabled then PetBarMouseOver(0) end end)\n\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\tlocal b = _G[\"PetActionButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() PetBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then PetBarMouseOver(0) end end)\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/BarStance.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tStanceBar(by Tukz)\n----------------------------------------------------------------------------------------\n-- Hide bar\nif C.actionbar.stancebar_hide then\n\tStanceBar:SetParent(StanceBarAnchor)\n\tStanceBar:UnregisterAllEvents()\n\tfor _, button in pairs(StanceBar.actionButtons) do\n\t\tbutton:UnregisterAllEvents()\n\t\tbutton:SetAttribute(\"statehidden\", true)\n\t\tbutton:Hide()\n\tend\n\tStanceBarAnchor:Hide()\n\treturn\nend\n\n-- Create bar\nlocal bar = CreateFrame(\"Frame\", \"StanceHolder\", UIParent, \"SecureHandlerStateTemplate\")\nbar:SetAllPoints(StanceBarAnchor)\n\nbar:RegisterEvent(\"PLAYER_LOGIN\")\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:RegisterEvent(\"UPDATE_SHAPESHIFT_FORMS\")\nbar:RegisterEvent(\"UPDATE_SHAPESHIFT_USABLE\")\nbar:RegisterEvent(\"UPDATE_SHAPESHIFT_COOLDOWN\")\nbar:RegisterEvent(\"ACTIONBAR_PAGE_CHANGED\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tif event == \"PLAYER_LOGIN\" then\n\t\tfor i = 1, 10 do\n\t\t\tlocal button = _G[\"StanceButton\"..i]\n\t\t\tbutton:ClearAllPoints()\n\t\t\tbutton:SetParent(self)\n\t\t\tif i == 1 then\n\t\t\t\tif C.actionbar.stancebar_horizontal == true then\n\t\t\t\t\tbutton:SetPoint(\"BOTTOMLEFT\", StanceBarAnchor, \"BOTTOMLEFT\", 0, 0)\n\t\t\t\telse\n\t\t\t\t\tbutton:SetPoint(\"TOPLEFT\", StanceBarAnchor, \"TOPLEFT\", 0, 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal previous = _G[\"StanceButton\"..i-1]\n\t\t\t\tif C.actionbar.stancebar_horizontal == true then\n\t\t\t\t\tbutton:SetPoint(\"LEFT\", previous, \"RIGHT\", C.actionbar.button_space, 0)\n\t\t\t\telse\n\t\t\t\t\tbutton:SetPoint(\"TOP\", previous, \"BOTTOM\", 0, -C.actionbar.button_space)\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal icon = GetShapeshiftFormInfo(i)\n\t\t\tif icon then\n\t\t\t\tbutton:Show()\n\t\t\telse\n\t\t\t\tbutton:Hide()\n\t\t\tend\n\t\tend\n\telseif event == \"UPDATE_SHAPESHIFT_FORMS\" then\n\t\tif InCombatLockdown() then return end\n\t\tfor i = 1, 10 do\n\t\t\tlocal button = _G[\"StanceButton\"..i]\n\t\t\tlocal icon = GetShapeshiftFormInfo(i)\n\t\t\tif icon then\n\t\t\t\tbutton:Show()\n\t\t\telse\n\t\t\t\tbutton:Hide()\n\t\t\tend\n\t\tend\n\t\tT.ShiftBarUpdate()\n\telseif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tT.StyleShift()\n\telse\n\t\tT.ShiftBarUpdate()\n\tend\nend)\n\nlocal function reposition()\n\tfor i = 1, 10 do\n\t\tlocal button = _G[\"StanceButton\"..i]\n\t\tbutton:ClearAllPoints()\n\t\tif i == 1 then\n\t\t\tif C.actionbar.stancebar_horizontal == true then\n\t\t\t\tbutton:SetPoint(\"BOTTOMLEFT\", StanceBarAnchor, \"BOTTOMLEFT\", 0, 0)\n\t\t\telse\n\t\t\t\tbutton:SetPoint(\"TOPLEFT\", StanceBarAnchor, \"TOPLEFT\", 0, 0)\n\t\t\tend\n\t\telse\n\t\t\tlocal previous = _G[\"StanceButton\"..i-1]\n\t\t\tif C.actionbar.stancebar_horizontal == true then\n\t\t\t\tbutton:SetPoint(\"LEFT\", previous, \"RIGHT\", C.actionbar.button_space, 0)\n\t\t\telse\n\t\t\t\tbutton:SetPoint(\"TOP\", previous, \"BOTTOM\", 0, -C.actionbar.button_space)\n\t\t\tend\n\t\tend\n\tend\nend\n\nhooksecurefunc(StanceButton1, \"SetPoint\", function(_, _, anchor)\n\tif InCombatLockdown() then return end\n\tif anchor and anchor == StanceBar then\n\t\tlocal forms = GetNumShapeshiftForms()\n\t\tlocal button = _G[\"StanceButton\"..forms]\n\t\tif button and not button.hook then\n\t\t\thooksecurefunc(button, \"SetPoint\", function(_, _, anchor)\n\t\t\t\tif InCombatLockdown() then return end\n\t\t\t\tif anchor and anchor == StanceBar then\n\t\t\t\t\treposition()\n\t\t\t\tend\n\t\t\tend)\n\t\t\tbutton.hook = true\n\t\tend\n\tend\nend)\n\n-- Mouseover bar\nif C.actionbar.rightbars_mouseover == true and C.actionbar.stancebar_horizontal == false then\n\tStanceBarAnchor:SetAlpha(0)\n\tStanceBarAnchor:SetScript(\"OnEnter\", function() if StanceButton1:IsShown() then RightBarMouseOver(1) end end)\n\tStanceBarAnchor:SetScript(\"OnLeave\", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)\n\tfor i = 1, 10 do\n\t\tlocal b = _G[\"StanceButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() RightBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)\n\tend\nend\nif C.actionbar.stancebar_mouseover == true and (C.actionbar.stancebar_horizontal == true or C.actionbar.editor) then\n\tStanceBarAnchor:SetAlpha(0)\n\tStanceBarAnchor:SetScript(\"OnEnter\", function() StanceBarMouseOver(1) end)\n\tStanceBarAnchor:SetScript(\"OnLeave\", function() if not HoverBind.enabled then StanceBarMouseOver(0) end end)\n\tfor i = 1, 10 do\n\t\tlocal b = _G[\"StanceButton\"..i]\n\t\tb:SetAlpha(0)\n\t\tb:HookScript(\"OnEnter\", function() StanceBarMouseOver(1) end)\n\t\tb:HookScript(\"OnLeave\", function() if not HoverBind.enabled then StanceBarMouseOver(0) end end)\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Bindings.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif IsAddOnLoaded(\"ncHoverBind\") then return end\n\n----------------------------------------------------------------------------------------\n--\tBinding buttons(ncHoverBind by Nightcracker)\n----------------------------------------------------------------------------------------\nlocal bind, oneBind, localmacros = CreateFrame(\"Frame\", \"HoverBind\", UIParent), true, 0\n\nSlashCmdList.MOUSEOVERBIND = function()\n\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\tif not bind.loaded then\n\t\tbind:SetFrameStrata(\"DIALOG\")\n\t\tbind:EnableMouse(true)\n\t\tbind:EnableKeyboard(true)\n\t\tbind:EnableMouseWheel(true)\n\t\tbind.texture = bind:CreateTexture()\n\t\tbind.texture:SetPoint(\"TOPLEFT\", bind, 2, -2)\n\t\tbind.texture:SetPoint(\"BOTTOMRIGHT\", bind, -2, 2)\n\t\tbind.texture:SetColorTexture(1, 1, 1, 0.3)\n\t\tbind:Hide()\n\n\t\tlocal elapsed = 0\n\t\tGameTooltip:HookScript(\"OnUpdate\", function(self, e)\n\t\t\telapsed = elapsed + e\n\t\t\tif elapsed < 0.2 then return else elapsed = 0 end\n\t\t\tif not self.comparing and IsModifiedClick(\"COMPAREITEMS\") then\n\t\t\t\tGameTooltip_ShowCompareItem(self)\n\t\t\t\tself.comparing = true\n\t\t\telseif self.comparing and not IsModifiedClick(\"COMPAREITEMS\") then\n\t\t\t\tfor _, frame in pairs(self.shoppingTooltips) do\n\t\t\t\t\tframe:Hide()\n\t\t\t\tend\n\t\t\t\tself.comparing = false\n\t\t\tend\n\t\tend)\n\n\t\thooksecurefunc(GameTooltip, \"Hide\", function(self) for _, tt in pairs(self.shoppingTooltips) do tt:Hide() end end)\n\n\t\tbind:SetScript(\"OnEnter\", function()\n\t\t\tGameTooltip:SetOwner(bind, \"ANCHOR_NONE\")\n\t\t\tGameTooltip:SetPoint(\"BOTTOM\", bind, \"TOP\", 0, 2)\n\t\t\tGameTooltip:AddLine(bind.button.name, 1, 1, 1)\n\n\t\t\tif #bind.button.bindings == 0 then\n\t\t\t\tGameTooltip:AddLine(L_BIND_NO_SET, 0.6, 0.6, 0.6)\n\t\t\telse\n\t\t\t\tGameTooltip:AddDoubleLine(L_BIND_BINDING, L_BIND_KEY, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)\n\t\t\t\tfor i = 1, #bind.button.bindings do\n\t\t\t\t\tGameTooltip:AddDoubleLine(i, bind.button.bindings[i])\n\t\t\t\tend\n\t\t\tend\n\t\t\tGameTooltip:Show()\n\t\tend)\n\n\t\tbind:SetScript(\"OnEvent\", function(self) self:Deactivate(false) end)\n\t\tbind:SetScript(\"OnLeave\", function(self) self:HideFrame() end)\n\t\tbind:SetScript(\"OnKeyDown\", function(self, key) self:Listener(key) end)\n\t\tbind:SetScript(\"OnMouseDown\", function(self, key) self:Listener(key) end)\n\t\tbind:SetScript(\"OnMouseWheel\", function(self, delta) if delta > 0 then self:Listener(\"MOUSEWHEELUP\") else self:Listener(\"MOUSEWHEELDOWN\") end end)\n\n\t\tfunction bind:Update(b, spellmacro)\n\t\t\tif not self.enabled or InCombatLockdown() then return end\n\t\t\tself.button = b\n\t\t\tself.spellmacro = spellmacro\n\n\t\t\tself:ClearAllPoints()\n\t\t\tself:SetAllPoints(b)\n\t\t\tself:Show()\n\n\t\t\tShoppingTooltip1:Hide()\n\n\t\t\tif spellmacro == \"SPELL\" then\n\t\t\t\tself.button.id = SpellBook_GetSpellBookSlot(self.button)\n\t\t\t\tself.button.name = GetSpellBookItemName(self.button.id, SpellBookFrame.bookType)\n\n\t\t\t\tGameTooltip:Show()\n\t\t\t\tGameTooltip:SetScript(\"OnHide\", function(self)\n\t\t\t\t\tself:SetOwner(bind, \"ANCHOR_NONE\")\n\t\t\t\t\tself:SetPoint(\"BOTTOM\", bind, \"TOP\", 0, 1)\n\t\t\t\t\tself:AddLine(bind.button.name, 1, 1, 1)\n\t\t\t\t\tbind.button.bindings = {GetBindingKey(spellmacro..\" \"..bind.button.name)}\n\t\t\t\t\tif #bind.button.bindings == 0 then\n\t\t\t\t\t\tself:AddLine(L_BIND_NO_SET, 0.6, 0.6, 0.6)\n\t\t\t\t\telse\n\t\t\t\t\t\tself:AddDoubleLine(L_BIND_BINDING, L_BIND_KEY, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)\n\t\t\t\t\t\tfor i = 1, #bind.button.bindings do\n\t\t\t\t\t\t\tself:AddDoubleLine(i, bind.button.bindings[i])\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tself:Show()\n\t\t\t\t\tself:SetScript(\"OnHide\", nil)\n\t\t\t\tend)\n\t\t\telseif spellmacro == \"MACRO\" then\n\t\t\t\tself.button.id = self.button.selectionIndex or self.button:GetID()\n\n\t\t\t\tif localmacros == 1 then self.button.id = self.button.id + MAX_ACCOUNT_MACROS end\n\n\t\t\t\tself.button.name = GetMacroInfo(self.button.id)\n\n\t\t\t\tGameTooltip:SetOwner(bind, \"ANCHOR_NONE\")\n\t\t\t\tGameTooltip:SetPoint(\"BOTTOM\", bind, \"TOP\", 0, 1)\n\t\t\t\tGameTooltip:AddLine(bind.button.name, 1, 1, 1)\n\n\t\t\t\tbind.button.bindings = {GetBindingKey(spellmacro..\" \"..bind.button.name)}\n\t\t\t\t\tif #bind.button.bindings == 0 then\n\t\t\t\t\t\tGameTooltip:AddLine(L_BIND_NO_SET, 0.6, 0.6, 0.6)\n\t\t\t\t\telse\n\t\t\t\t\t\tGameTooltip:AddDoubleLine(L_BIND_BINDING, L_BIND_KEY, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)\n\t\t\t\t\t\tfor i = 1, #bind.button.bindings do\n\t\t\t\t\t\t\tGameTooltip:AddDoubleLine(i, bind.button.bindings[i], 1, 1, 1)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tGameTooltip:Show()\n\t\t\telseif spellmacro == \"STANCE\" or spellmacro == \"PET\" then\n\t\t\t\tself.button.id = tonumber(b:GetID())\n\t\t\t\tself.button.name = b:GetName()\n\n\t\t\t\tif not self.button.name then return end\n\n\t\t\t\tif not self.button.id or self.button.id < 1 or self.button.id > (spellmacro == \"STANCE\" and 10 or 12) then\n\t\t\t\t\tself.button.bindstring = \"CLICK \"..self.button.name..\":LeftButton\"\n\t\t\t\telse\n\t\t\t\t\tself.button.bindstring = (spellmacro == \"STANCE\" and \"SHAPESHIFTBUTTON\" or \"BONUSACTIONBUTTON\")..self.button.id\n\t\t\t\tend\n\n\t\t\t\tGameTooltip:Show()\n\t\t\t\tGameTooltip:SetScript(\"OnHide\", function(self)\n\t\t\t\t\tself:SetOwner(bind, \"ANCHOR_NONE\")\n\t\t\t\t\tself:SetPoint(\"BOTTOM\", bind, \"TOP\", 0, 1)\n\t\t\t\t\tself:AddLine(bind.button.name, 1, 1, 1)\n\t\t\t\t\tbind.button.bindings = {GetBindingKey(bind.button.bindstring)}\n\t\t\t\t\tif #bind.button.bindings == 0 then\n\t\t\t\t\t\tself:AddLine(L_BIND_NO_SET, 0.6, 0.6, 0.6)\n\t\t\t\t\telse\n\t\t\t\t\t\tself:AddDoubleLine(L_BIND_BINDING, L_BIND_KEY, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)\n\t\t\t\t\t\tfor i = 1, #bind.button.bindings do\n\t\t\t\t\t\t\tself:AddDoubleLine(i, bind.button.bindings[i])\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tself:Show()\n\t\t\t\t\tself:SetScript(\"OnHide\", nil)\n\t\t\t\tend)\n\t\t\telse\n\t\t\t\tself.button.action = tonumber(b.action)\n\t\t\t\tself.button.name = b:GetName()\n\n\t\t\t\tif not self.button.name then return end\n\n\t\t\t\tif not self.button.action or self.button.action < 1 or self.button.action > 132 then\n\t\t\t\t\tself.button.bindstring = \"CLICK \"..self.button.name..\":LeftButton\"\n\t\t\t\telse\n\t\t\t\t\tlocal modact = 1 + (self.button.action - 1) % 12\n\t\t\t\t\tif self.button.name == \"ExtraActionButton1\" then\n\t\t\t\t\t\tself.button.bindstring = \"EXTRAACTIONBUTTON1\"\n\t\t\t\t\telseif self.button.action < 13 or self.button.action > 72 then\n\t\t\t\t\t\tself.button.bindstring = \"ACTIONBUTTON\"..modact\n\t\t\t\t\telseif self.button.action < 73 and self.button.action > 60 then\n\t\t\t\t\t\tself.button.bindstring = \"MULTIACTIONBAR1BUTTON\"..modact\n\t\t\t\t\telseif self.button.action < 61 and self.button.action > 48 then\n\t\t\t\t\t\tself.button.bindstring = \"MULTIACTIONBAR2BUTTON\"..modact\n\t\t\t\t\telseif self.button.action < 49 and self.button.action > 36 then\n\t\t\t\t\t\tself.button.bindstring = \"MULTIACTIONBAR4BUTTON\"..modact\n\t\t\t\t\telseif self.button.action < 37 and self.button.action > 24 then\n\t\t\t\t\t\tself.button.bindstring = \"MULTIACTIONBAR3BUTTON\"..modact\n\t\t\t\t\telseif self.button.action < 25 and self.button.action > 12 then\n\t\t\t\t\t\tself.button.bindstring = \"CLICK \"..self.button.name..\":LeftButton\"\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tbind.button.bindings = {GetBindingKey(bind.button.bindstring)}\n\t\t\t\tbind:GetScript(\"OnEnter\")()\n\t\t\tend\n\t\tend\n\n\t\tfunction bind:Listener(key)\n\t\t\tif GetBindingKey(key) == \"OPENCHAT\" then\n\t\t\t\tDEFAULT_CHAT_FRAME.editBox:Show()\n\t\t\t\treturn\n\t\t\tend\n\t\t\tif GetBindingByKey(key) == \"SCREENSHOT\" then\n\t\t\t\tRunBinding(\"SCREENSHOT\")\n\t\t\t\treturn\n\t\t\tend\n\t\t\tif #self.button.bindings > 0 and oneBind then\n\t\t\t\tfor i = 1, #self.button.bindings do\n\t\t\t\t\tSetBinding(self.button.bindings[i])\n\t\t\t\tend\n\t\t\t\tself:Update(self.button, self.spellmacro)\n\t\t\t\tif self.spellmacro ~= \"MACRO\" then GameTooltip:Hide() end\n\t\t\tend\n\t\t\tif key == \"ESCAPE\" or key == \"RightButton\" then\n\t\t\t\tfor i = 1, #self.button.bindings do\n\t\t\t\t\tSetBinding(self.button.bindings[i])\n\t\t\t\tend\n\t\t\t\tprint(\"|cffffff00\"..L_BIND_CLEARED..\"|r\"..\" |cff00ff00\"..self.button.name..\"|r|cffffff00.|r\")\n\t\t\t\tself:Update(self.button, self.spellmacro)\n\t\t\t\tif self.spellmacro ~= \"MACRO\" then GameTooltip:Hide() end\n\t\t\t\treturn\n\t\t\tend\n\n\t\t\tif key == \"LSHIFT\" or key == \"RSHIFT\" or key == \"LCTRL\" or key == \"RCTRL\" or key == \"LALT\"\n\t\t\tor key == \"RALT\" or key == \"UNKNOWN\" or key == \"LeftButton\" then return end\n\t\t\tif key == \"MiddleButton\" then key = \"BUTTON3\" end\n\t\t\tif key:find(\"Button%d\") then key = key:upper() end\n\n\t\t\tlocal alt = IsAltKeyDown() and \"ALT-\" or \"\"\n\t\t\tlocal ctrl = IsControlKeyDown() and \"CTRL-\" or \"\"\n\t\t\tlocal shift = IsShiftKeyDown() and \"SHIFT-\" or \"\"\n\n\t\t\tif not self.spellmacro or self.spellmacro == \"PET\" or self.spellmacro == \"STANCE\" then\n\t\t\t\tSetBinding(alt..ctrl..shift..key, self.button.bindstring)\n\t\t\telse\n\t\t\t\tSetBinding(alt..ctrl..shift..key, self.spellmacro..\" \"..self.button.name)\n\t\t\tend\n\t\t\tprint(alt..ctrl..shift..key..\" |cff00ff00bound to |r\"..self.button.name..\".\")\n\t\t\tself:Update(self.button, self.spellmacro)\n\t\t\tif self.spellmacro ~= \"MACRO\" then GameTooltip:Hide() end\n\t\tend\n\n\t\tfunction bind:HideFrame()\n\t\t\tself:ClearAllPoints()\n\t\t\tself:Hide()\n\t\t\tGameTooltip:Hide()\n\t\tend\n\n\t\tfunction bind:Activate()\n\t\t\tself.enabled = true\n\t\t\tself:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\n\t\t\tif C.actionbar.enable then\n\t\t\t\tif C.actionbar.bottombars_mouseover == true then\n\t\t\t\t\tBottomBarMouseOver(1)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.rightbars_mouseover == true then\n\t\t\t\t\tRightBarMouseOver(1)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.stancebar_mouseover == true then\n\t\t\t\t\tStanceBarMouseOver(1)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.petbar_mouseover == true and C.actionbar.petbar_horizontal == true then\n\t\t\t\t\tPetBarMouseOver(1)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.bar7_enable and C.actionbar.bar7_mouseover then\n\t\t\t\t\tBar7MouseOver(1)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.bar8_enable and C.actionbar.bar8_mouseover then\n\t\t\t\t\tBar8MouseOver(1)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tfunction bind:Deactivate(save)\n\t\t\tlocal which = GetCurrentBindingSet()\n\t\t\tif save then\n\t\t\t\tSaveBindings(which)\n\t\t\t\tprint(\"|cffffff00\"..L_BIND_SAVED..\"|r\")\n\t\t\telse\n\t\t\t\tLoadBindings(which)\n\t\t\t\tprint(\"|cffffff00\"..L_BIND_DISCARD..\"|r\")\n\t\t\tend\n\t\t\tself.enabled = false\n\t\t\tself:HideFrame()\n\t\t\tself:UnregisterEvent(\"PLAYER_REGEN_DISABLED\")\n\t\t\tStaticPopup_Hide(\"KEYBIND_MODE\")\n\t\t\tif C.actionbar.enable then\n\t\t\t\tif C.actionbar.bottombars_mouseover == true then\n\t\t\t\t\tBottomBarMouseOver(0)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.rightbars_mouseover == true then\n\t\t\t\t\tRightBarMouseOver(0)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.stancebar_mouseover == true then\n\t\t\t\t\tStanceBarMouseOver(0)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.petbar_mouseover == true and C.actionbar.petbar_horizontal == true then\n\t\t\t\t\tPetBarMouseOver(0)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.bar7_enable and C.actionbar.bar7_mouseover then\n\t\t\t\t\tBar7MouseOver(0)\n\t\t\t\tend\n\t\t\t\tif C.actionbar.bar8_enable and C.actionbar.bar8_mouseover then\n\t\t\t\t\tBar8MouseOver(0)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tStaticPopupDialogs.KEYBIND_MODE = {\n\t\t\ttext = L_BIND_INSTRUCT,\n\t\t\tbutton1 = APPLY,\n\t\t\tbutton2 = CANCEL,\n\t\t\tOnAccept = function() bind:Deactivate(true) ReloadUI() end,\n\t\t\tOnCancel = function() bind:Deactivate(false) end,\n\t\t\ttimeout = 0,\n\t\t\twhileDead = 1,\n\t\t\thideOnEscape = false,\n\t\t\tpreferredIndex = 5,\n\t\t}\n\n\t\t-- Registering\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"ActionButton\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\n\t\t\tb = _G[\"MultiBarBottomLeftButton\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\n\t\t\tb = _G[\"MultiBarLeftButton\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\n\t\t\tb = _G[\"MultiBarRightButton\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\n\t\t\tb = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\n\t\t\tb = _G[\"MultiBar5Button\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\t\tend\n\n\t\tif C.actionbar.bar7_enable then\n\t\t\tfor i = 1, 12 do\n\t\t\t\tlocal b = _G[\"MultiBar6Button\"..i]\n\t\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\t\t\tend\n\t\tend\n\n\t\tif C.actionbar.bar8_enable then\n\t\t\tfor i = 1, 12 do\n\t\t\t\tlocal b = _G[\"MultiBar7Button\"..i]\n\t\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\t\t\tend\n\t\tend\n\n\t\tfor i = 1, 10 do\n\t\t\tlocal b = _G[\"StanceButton\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self, \"STANCE\") end)\n\t\tend\n\n\t\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\t\tlocal b = _G[\"PetActionButton\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self, \"PET\") end)\n\t\tend\n\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"SpellButton\"..i]\n\t\t\tb:HookScript(\"OnEnter\", function(self) bind:Update(self, \"SPELL\") end)\n\t\tend\n\n\t\tExtraActionButton1:HookScript(\"OnEnter\", function(self) bind:Update(self) end)\n\n\t\tlocal function registermacro()\n\t\t\thooksecurefunc(MacroFrame, \"Update\", function(frame)\n\t\t\t\tfor _, button in next, {frame.MacroSelector.ScrollBox.ScrollTarget:GetChildren()} do\n\t\t\t\t\tif button and not button.hook then\n\t\t\t\t\t\tbutton:HookScript(\"OnEnter\", function(self) bind:Update(button, \"MACRO\") end)\n\t\t\t\t\t\tbutton.hook = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend)\n\t\t\tMacroFrameTab1:HookScript(\"OnMouseUp\", function() localmacros = 0 end)\n\t\t\tMacroFrameTab2:HookScript(\"OnMouseUp\", function() localmacros = 1 end)\n\t\tend\n\n\t\tif not IsAddOnLoaded(\"Blizzard_MacroUI\") then\n\t\t\thooksecurefunc(\"LoadAddOn\", function(addon)\n\t\t\t\tif addon == \"Blizzard_MacroUI\" then\n\t\t\t\t\tregistermacro()\n\t\t\t\tend\n\t\t\tend)\n\t\telse\n\t\t\tregistermacro()\n\t\tend\n\t\tbind.loaded = 1\n\tend\n\tif not bind.enabled then\n\t\tbind:Activate()\n\t\tStaticPopup_Show(\"KEYBIND_MODE\")\n\tend\nend\n\nSLASH_MOUSEOVERBIND1 = \"/bindkey\"\nSLASH_MOUSEOVERBIND2 = \"/hoverbind\"\nSLASH_MOUSEOVERBIND3 = \"/bk\"\n\nif not IsAddOnLoaded(\"Bartender4\") and not IsAddOnLoaded(\"Dominos\") then\n\tSLASH_MOUSEOVERBIND4 = \"/kb\"\nend\n\nif not IsAddOnLoaded(\"HealBot\") then\n\tSLASH_MOUSEOVERBIND5 = \"/hb\"\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Cooldowns.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif IsAddOnLoaded(\"OmniCC\") or IsAddOnLoaded(\"ncCooldown\") or IsAddOnLoaded(\"tullaCC\") then return end\n\n----------------------------------------------------------------------------------------\n--\tCooldown count(tullaCC by Tuller)\n----------------------------------------------------------------------------------------\nlocal format = string.format\nlocal floor = math.floor\n\nlocal function GetFormattedTime(s)\n\tlocal day, hour, minute = 86400, 3600, 60\n\tif s >= day then\n\t\treturn format(\"%dd\", floor(s / day + 0.5)), s % day\n\telseif s >= hour then\n\t\treturn format(\"%dh\", floor(s / hour + 0.5)), s % hour\n\telseif s >= minute then\n\t\treturn format(\"%dm\", floor(s / minute + 0.5)), s % minute\n\tend\n\treturn floor(s + 0.5), s - floor(s)\nend\n\nlocal function Timer_Stop(self)\n\tself.enabled = nil\n\tself:Hide()\nend\n\nlocal function Timer_ForceUpdate(self)\n\tself.nextUpdate = 0\n\tself:Show()\nend\n\nlocal function Timer_OnSizeChanged(self, width)\n\tlocal fontScale = T.Round(width) / 40\n\tif fontScale == self.fontScale then\n\t\treturn\n\tend\n\n\tself.fontScale = fontScale\n\tif fontScale < 0.5 then\n\t\tself:Hide()\n\telse\n\t\tself.text:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\t\tself.text:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\n\t\tif self.enabled then\n\t\t\tTimer_ForceUpdate(self)\n\t\tend\n\tend\nend\n\nlocal function Timer_OnUpdate(self, elapsed)\n\tif self.text:IsShown() then\n\t\tif self.nextUpdate > 0 then\n\t\t\tself.nextUpdate = self.nextUpdate - elapsed\n\t\telse\n\t\t\tif (self:GetEffectiveScale() / UIParent:GetEffectiveScale()) < 0.5 then\n\t\t\t\tself.text:SetText(\"\")\n\t\t\t\tself.nextUpdate = 1\n\t\t\telse\n\t\t\t\tlocal remain = self.duration - (GetTime() - self.start)\n\t\t\t\tif floor(remain + 0.5) > 0 then\n\t\t\t\t\tlocal time, nextUpdate = GetFormattedTime(remain)\n\t\t\t\t\tself.text:SetText(time)\n\t\t\t\t\tself.nextUpdate = nextUpdate\n\t\t\t\t\tif floor(remain + 0.5) > 5 then\n\t\t\t\t\t\tself.text:SetTextColor(1, 1, 1)\n\t\t\t\t\telse\n\t\t\t\t\t\tself.text:SetTextColor(1, 0.2, 0.2)\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tTimer_Stop(self)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal Timer_Create\nif IsWetxius then\n\t Timer_Create = function(self)\n\t\tlocal scaler = CreateFrame(\"Frame\", nil, self)\n\t\tscaler:SetAllPoints(self)\n\n\t\tlocal timer = CreateFrame(\"Frame\", nil, scaler)\n\t\ttimer:Hide()\n\t\ttimer:SetAllPoints(scaler)\n\t\ttimer:SetScript(\"OnUpdate\", Timer_OnUpdate)\n\n\t\tlocal text = timer:CreateFontString(nil, \"OVERLAY\")\n\t\ttext:SetPoint(\"LEFT\", -2, 0)\n\t\ttext:SetPoint(\"RIGHT\", 3, 0)\n\n\t\ttext:SetJustifyH(\"CENTER\")\n\t\ttimer.text = text\n\n\t\tTimer_OnSizeChanged(timer, scaler:GetSize())\n\t\tscaler:SetScript(\"OnSizeChanged\", function(_, ...) Timer_OnSizeChanged(timer, ...) end)\n\n\t\tself.timer = timer\n\t\treturn timer\n\tend\nelse\n\tTimer_Create = function(self)\n\t\tlocal scaler = CreateFrame(\"Frame\", nil, self)\n\t\tscaler:SetAllPoints(self)\n\n\t\tlocal timer = CreateFrame(\"Frame\", nil, scaler)\n\t\ttimer:Hide()\n\t\ttimer:SetAllPoints(scaler)\n\t\ttimer:SetScript(\"OnUpdate\", Timer_OnUpdate)\n\n\t\tlocal text = timer:CreateFontString(nil, \"OVERLAY\")\n\t\ttext:SetPoint(\"CENTER\", 1, 0)\n\n\t\ttext:SetJustifyH(\"CENTER\")\n\t\ttimer.text = text\n\n\t\tTimer_OnSizeChanged(timer, scaler:GetSize())\n\t\tscaler:SetScript(\"OnSizeChanged\", function(_, ...) Timer_OnSizeChanged(timer, ...) end)\n\n\t\tself.timer = timer\n\t\treturn timer\n\tend\nend\n\nlocal Cooldown_MT = getmetatable(_G.ActionButton1Cooldown).__index\nlocal hideNumbers = {}\n\nlocal function deactivateDisplay(cooldown)\n\tlocal timer = cooldown.timer\n\tif timer then\n\t\tTimer_Stop(timer)\n\tend\nend\n\nlocal function setHideCooldownNumbers(cooldown, hide)\n\tif hide then\n\t\thideNumbers[cooldown] = true\n\t\tdeactivateDisplay(cooldown)\n\telse\n\t\thideNumbers[cooldown] = nil\n\tend\nend\n\nhooksecurefunc(Cooldown_MT, \"SetCooldown\", function(cooldown, start, duration, modRate)\n\tif cooldown.noCooldownCount or cooldown:IsForbidden() or hideNumbers[cooldown] then return end\n\n\tlocal show = (start and start > 0) and (duration and duration > 2) and (modRate == nil or modRate > 0)\n\n\tif show then\n\t\tlocal parent = cooldown:GetParent()\n\t\tif parent and parent.chargeCooldown == cooldown then return end\n\n\t\tlocal timer = cooldown.timer or Timer_Create(cooldown)\n\t\ttimer.start = start\n\t\ttimer.duration = duration\n\t\ttimer.enabled = true\n\t\ttimer.nextUpdate = 0\n\t\tif timer.fontScale >= 0.5 then timer:Show() end\n\telse\n\t\tdeactivateDisplay(cooldown)\n\tend\nend)\n\nhooksecurefunc(Cooldown_MT, \"Clear\", deactivateDisplay)\n\nhooksecurefunc(Cooldown_MT, \"SetHideCountdownNumbers\", setHideCooldownNumbers)\n\nhooksecurefunc(\"CooldownFrame_SetDisplayAsPercentage\", function(cooldown)\n\tsetHideCooldownNumbers(cooldown, true)\nend)"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Core.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tHide Blizzard ActionBars stuff(by Tukz)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tMainMenuBar:SetScale(0.00001)\n\tMainMenuBar:EnableMouse(false)\n\tOverrideActionBar:SetScale(0.00001)\n\tOverrideActionBar:EnableMouse(false)\n\tPetActionBar:EnableMouse(false)\n\tPetActionBar:UnregisterAllEvents()\n\tStanceBar:EnableMouse(false)\n\tStanceBar:UnregisterAllEvents()\n\tMicroButtonAndBagsBar:SetScale(0.00001)\n\tMicroButtonAndBagsBar:EnableMouse(false)\n\tMicroButtonAndBagsBar:ClearAllPoints()\n\tMicroButtonAndBagsBar:SetPoint(\"BOTTOMRIGHT\", UIParent, \"BOTTOMRIGHT\", 0, -99) -- Prevent scaling for right panels\n\tBagsBar:Hide()\n\tBagsBar:UnregisterAllEvents()\n\n\tif not C.actionbar.micromenu then\n\t\tMicroMenu:Hide()\n\tend\n\n\tMainMenuBar:SetMovable(true)\n\tMainMenuBar:SetUserPlaced(true)\n\tMainMenuBar.ignoreFramePositionManager = true\n\tMainMenuBar:SetAttribute(\"ignoreFramePositionManager\", true)\n\n\tlocal elements = {\n\t\tMainMenuBar, MainMenuBarArtFrame, OverrideActionBar, PossessBarFrame,\n\t\tMultiBarBottomLeft.QuickKeybindGlow, MultiBarLeft.QuickKeybindGlow, MultiBarBottomRight.QuickKeybindGlow, MultiBarRight.QuickKeybindGlow,\n\t\tStatusTrackingBarManager\n\t}\n\n\tif not C_ClassTrial.IsClassTrialCharacter() then\n\t\ttinsert(elements, IconIntroTracker)\n\tend\n\n\tfor _, element in pairs(elements) do\n\t\tif element.UnregisterAllEvents then\n\t\t\telement:UnregisterAllEvents()\n\t\tend\n\n\t\tif element ~= MainMenuBar then\n\t\t\telement:Hide()\n\t\tend\n\t\telement:SetAlpha(0)\n\tend\n\n\tfor i = 1, 6 do\n\t\tlocal b = _G[\"OverrideActionBarButton\"..i]\n\t\tb:UnregisterAllEvents()\n\t\tb:SetAttribute(\"statehidden\", true)\n\t\tb:SetAttribute(\"showgrid\", 1)\n\tend\n\n\thooksecurefunc(\"TalentFrame_LoadUI\", function()\n\t\tPlayerTalentFrame:UnregisterEvent(\"ACTIVE_TALENT_GROUP_CHANGED\")\n\tend)\nend)\n\n----------------------------------------------------------------------------------------\n--\tSet mouseover for bars\n----------------------------------------------------------------------------------------\nfunction RightBarMouseOver(alpha)\n\tRightActionBarAnchor:SetAlpha(alpha)\n\tPetActionBarAnchor:SetAlpha(alpha)\n\tStanceBarAnchor:SetAlpha(alpha)\n\n\tif MultiBarLeft:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBarLeftButton\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBarLeftButton\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\t\tMultiBarLeft:SetAlpha(alpha)\n\tend\n\n\tif MultiBarRight:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBarRightButton\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBarRightButton\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\t\tMultiBarRight:SetAlpha(alpha)\n\tend\n\n\tif C.actionbar.rightbars > 2 then\n\t\tif MultiBar5:IsShown() then\n\t\t\tfor i = 1, 12 do\n\t\t\t\tlocal b = _G[\"MultiBar5Button\"..i]\n\t\t\t\tb:SetAlpha(alpha)\n\t\t\t\tlocal c = _G[\"MultiBar5Button\"..i..\"Cooldown\"]\n\t\t\t\tT.HideSpiral(c, alpha)\n\t\t\tend\n\t\t\tMultiBar5:SetAlpha(alpha)\n\t\tend\n\tend\n\n\tif C.actionbar.petbar_horizontal == false and C.actionbar.petbar_hide == false then\n\t\tif PetHolder:IsShown() then\n\t\t\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\t\t\tlocal b = _G[\"PetActionButton\"..i]\n\t\t\t\tb:SetAlpha(alpha)\n\t\t\t\tlocal c = _G[\"PetActionButton\"..i..\"Cooldown\"]\n\t\t\t\tT.HideSpiral(c, alpha)\n\t\t\tend\n\t\t\tPetHolder:SetAlpha(alpha)\n\t\tend\n\tend\n\n\tif C.actionbar.stancebar_horizontal == false and C.actionbar.stancebar_hide == false then\n\t\tif StanceHolder:IsShown() then\n\t\t\tfor i = 1, 10 do\n\t\t\t\tlocal b = _G[\"StanceButton\"..i]\n\t\t\t\tb:SetAlpha(alpha)\n\t\t\t\tlocal c = _G[\"StanceButton\"..i..\"Cooldown\"]\n\t\t\t\tT.HideSpiral(c, alpha)\n\t\t\tend\n\t\t\tStanceHolder:SetAlpha(alpha)\n\t\tend\n\tend\nend\n\nfunction StanceBarMouseOver(alpha)\n\tfor i = 1, 10 do\n\t\tlocal b = _G[\"StanceButton\"..i]\n\t\tb:SetAlpha(alpha)\n\t\tlocal c = _G[\"StanceButton\"..i..\"Cooldown\"]\n\t\tT.HideSpiral(c, alpha)\n\tend\n\tStanceHolder:SetAlpha(alpha)\nend\n\nfunction PetBarMouseOver(alpha)\n\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\tlocal b = _G[\"PetActionButton\"..i]\n\t\tb:SetAlpha(alpha)\n\t\tlocal c = _G[\"PetActionButton\"..i..\"Cooldown\"]\n\t\tT.HideSpiral(c, alpha)\n\tend\n\tPetHolder:SetAlpha(alpha)\nend\n\nif C.actionbar.rightbars_mouseover == true then\n\tRightActionBarAnchor:SetAlpha(0)\n\tRightActionBarAnchor:SetScript(\"OnEnter\", function() RightBarMouseOver(1) end)\n\tRightActionBarAnchor:SetScript(\"OnLeave\", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)\nend\n\nfunction BottomBarMouseOver(alpha)\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"ActionButton\"..i]\n\t\tb:SetAlpha(alpha)\n\t\tlocal c = _G[\"ActionButton\"..i..\"Cooldown\"]\n\t\tT.HideSpiral(c, alpha)\n\tend\n\n\tif C.actionbar.bottombars > 1 and MultiBarBottomLeft:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBarBottomLeftButton\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBarBottomLeftButton\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\tend\n\n\tif C.actionbar.bottombars > 2 and MultiBarBottomRight:IsShown() then\n\t\tif C.actionbar.toggle_mode == true and ShestakUISettingsPerChar.BottomBars == 1 then\n\t\t\tfor i = 4, 6 do\n\t\t\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\t\tb:SetAlpha(alpha)\n\t\t\t\tlocal c = _G[\"MultiBarBottomRightButton\"..i..\"Cooldown\"]\n\t\t\t\tT.HideSpiral(c, alpha)\n\t\t\tend\n\n\t\t\tfor i = 10, 12 do\n\t\t\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\t\tb:SetAlpha(alpha)\n\t\t\t\tlocal c = _G[\"MultiBarBottomRightButton\"..i..\"Cooldown\"]\n\t\t\t\tT.HideSpiral(c, alpha)\n\t\t\tend\n\t\telse\n\t\t\tfor i = 1, 12 do\n\t\t\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\t\tb:SetAlpha(alpha)\n\t\t\t\tlocal c = _G[\"MultiBarBottomRightButton\"..i..\"Cooldown\"]\n\t\t\t\tT.HideSpiral(c, alpha)\n\t\t\tend\n\t\tend\n\tend\nend\n\nif C.actionbar.bottombars_mouseover then\n\tActionBarAnchor:SetScript(\"OnEnter\", function() BottomBarMouseOver(1) end)\n\tActionBarAnchor:SetScript(\"OnLeave\", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)\n\n\tif C.actionbar.split_bars == true then\n\t\tSplitBarLeft:SetScript(\"OnEnter\", function() BottomBarMouseOver(1) end)\n\t\tSplitBarLeft:SetScript(\"OnLeave\", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)\n\n\t\tSplitBarRight:SetScript(\"OnEnter\", function() BottomBarMouseOver(1) end)\n\t\tSplitBarRight:SetScript(\"OnLeave\", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)\n\tend\nend\n\nfunction Bar1MouseOver(alpha)\n\tfor i = 1, 12 do\n\t\tlocal b = _G[\"ActionButton\"..i]\n\t\tb:SetAlpha(alpha)\n\t\tlocal c = _G[\"ActionButton\"..i..\"Cooldown\"]\n\t\tT.HideSpiral(c, alpha)\n\tend\nend\n\nfunction Bar2MouseOver(alpha)\n\tif MultiBarBottomLeft:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBarBottomLeftButton\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBarBottomLeftButton\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\tend\nend\n\nfunction Bar3MouseOver(alpha)\n\tif MultiBarLeft:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBarLeftButton\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBarLeftButton\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\tend\nend\n\nfunction Bar4MouseOver(alpha)\n\tif MultiBarRight:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBarRightButton\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBarRightButton\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\tend\nend\n\nfunction Bar5MouseOver(alpha)\n\tif MultiBarBottomRight:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBarBottomRightButton\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\tend\nend\n\nfunction Bar6MouseOver(alpha)\n\tif MultiBar5:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBar6Button\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBar6Button\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\tend\nend\n\nfunction Bar7MouseOver(alpha)\n\tif MultiBar6:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBar6Button\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBar6Button\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\tend\nend\n\nfunction Bar8MouseOver(alpha)\n\tif MultiBar7:IsShown() then\n\t\tfor i = 1, 12 do\n\t\t\tlocal b = _G[\"MultiBar7Button\"..i]\n\t\t\tb:SetAlpha(alpha)\n\t\t\tlocal c = _G[\"MultiBar7Button\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, alpha)\n\t\tend\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tFix cooldown spiral alpha (WoD bug)\n----------------------------------------------------------------------------------------\nfunction T.HideSpiral(f, alpha)\n\tf:SetSwipeColor(0, 0, 0, alpha * 0.8)\n\tf:SetDrawBling(alpha == 1)\nend\n\nlocal EventSpiral = CreateFrame(\"Frame\")\nEventSpiral:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nEventSpiral:SetScript(\"OnEvent\", function()\n\tif C.actionbar.rightbars_mouseover == true then\n\t\tRightBarMouseOver(0)\n\tend\n\n\tif C.actionbar.petbar_mouseover == true and C.actionbar.petbar_horizontal == true and C.actionbar.petbar_hide ~= true then\n\t\tPetBarMouseOver(0)\n\tend\n\n\tif C.actionbar.stancebar_mouseover == true and C.actionbar.stancebar_horizontal == true and C.actionbar.stancebar_hide ~= true then\n\t\tStanceBarMouseOver(0)\n\tend\n\n\tif C.actionbar.bottombars_mouseover then\n\t\tBottomBarMouseOver(0)\n\tend\n\n\tif C.actionbar.editor then\n\t\tif C.actionbar.bar1_mouseover then\n\t\t\tBar1MouseOver(0)\n\t\tend\n\n\t\tif C.actionbar.bar2_mouseover then\n\t\t\tBar2MouseOver(0)\n\t\tend\n\n\t\tif C.actionbar.bar3_mouseover then\n\t\t\tBar3MouseOver(0)\n\t\tend\n\n\t\tif C.actionbar.bar4_mouseover then\n\t\t\tBar4MouseOver(0)\n\t\tend\n\n\t\tif C.actionbar.bar5_mouseover then\n\t\t\tBar5MouseOver(0)\n\t\tend\n\n\t\tif C.actionbar.bar6_mouseover then\n\t\t\tBar6MouseOver(0)\n\t\tend\n\tend\n\n\tif C.actionbar.bar7_mouseover then\n\t\tBar7MouseOver(0)\n\tend\n\n\tif C.actionbar.bar8_mouseover then\n\t\tBar8MouseOver(0)\n\tend\n\n\tEventSpiral:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\nend)\n\nif (C.actionbar.rightbars_mouseover == true and C.actionbar.petbar_horizontal == false and C.actionbar.petbar_hide == false) or (C.actionbar.petbar_mouseover == true and C.actionbar.petbar_horizontal == true and C.actionbar.petbar_hide == false) then\n\tlocal EventPetSpiral = CreateFrame(\"Frame\")\n\tEventPetSpiral:RegisterEvent(\"PET_BAR_UPDATE_COOLDOWN\")\n\tEventPetSpiral:SetScript(\"OnEvent\", function()\n\t\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\t\tlocal c = _G[\"PetActionButton\"..i..\"Cooldown\"]\n\t\t\tT.HideSpiral(c, 0)\n\t\tend\n\t\tEventPetSpiral:UnregisterEvent(\"PET_BAR_UPDATE_COOLDOWN\")\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tShow grid function\n----------------------------------------------------------------------------------------\nif not C.actionbar.show_grid then\n\tlocal allButtons = {}\n\tfor i = 1, 12 do\n\t\tlocal button = _G[format(\"ActionButton%d\", i)]\n\t\ttinsert(allButtons, button)\n\n\t\tlocal button = _G[format(\"MultiBarRightButton%d\", i)]\n\t\ttinsert(allButtons, button)\n\n\t\tbutton = _G[format(\"MultiBarBottomRightButton%d\", i)]\n\t\ttinsert(allButtons, button)\n\n\t\tbutton = _G[format(\"MultiBarLeftButton%d\", i)]\n\t\ttinsert(allButtons, button)\n\n\t\tbutton = _G[format(\"MultiBarBottomLeftButton%d\", i)]\n\t\ttinsert(allButtons, button)\n\n\t\tbutton = _G[format(\"MultiBar5Button%d\", i)]\n\t\ttinsert(allButtons, button)\n\n\t\tbutton = _G[format(\"MultiBar6Button%d\", i)]\n\t\ttinsert(allButtons, button)\n\n\t\tbutton = _G[format(\"MultiBar7Button%d\", i)]\n\t\ttinsert(allButtons, button)\n\tend\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"ACTIONBAR_SHOWGRID\")\n\tframe:RegisterEvent(\"ACTIONBAR_HIDEGRID\")\n\tframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tframe:RegisterEvent(\"ACTIONBAR_PAGE_CHANGED\")\n\tframe:RegisterEvent(\"ACTIONBAR_UPDATE_STATE\")\n\tframe:RegisterEvent(\"UPDATE_VEHICLE_ACTIONBAR\")\n\tframe:SetScript(\"OnEvent\", function(self, event)\n\t\tif event == \"ACTIONBAR_SHOWGRID\" then\n\t\t\tfor i = 1, #allButtons do\n\t\t\t\tallButtons[i]:SetAlpha(1)\n\t\t\tend\n\t\telseif event == \"ACTIONBAR_PAGE_CHANGED\" or event == \"ACTIONBAR_UPDATE_STATE\" or event == \"UPDATE_VEHICLE_ACTIONBAR\" then\n\t\t\tC_Timer.After(0.02, function()\n\t\t\t\tfor i = 1, #allButtons do\n\t\t\t\t\tlocal button = allButtons[i]\n\t\t\t\t\tbutton:SetAlpha(1)\n\t\t\t\t\tif not button:HasAction() then\n\t\t\t\t\t\tbutton:SetAlpha(0)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend)\n\t\telse\n\t\t\tC_Timer.After(0.05, function()\n\t\t\t\tfor i = 1, #allButtons do\n\t\t\t\t\tlocal button = allButtons[i]\n\t\t\t\t\tif not button:HasAction() then\n\t\t\t\t\t\tbutton:SetAlpha(0)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tPet/StanceBar style functions\n----------------------------------------------------------------------------------------\nT.ShiftBarUpdate = function()\n\tlocal numForms = GetNumShapeshiftForms()\n\tlocal texture, isActive, isCastable\n\tlocal button, icon, cooldown\n\tlocal start, duration, enable\n\tfor i = 1, 10 do\n\t\tbutton = _G[\"StanceButton\"..i]\n\t\ticon = _G[\"StanceButton\"..i..\"Icon\"]\n\t\tif i <= numForms then\n\t\t\ttexture, isActive, isCastable = GetShapeshiftFormInfo(i)\n\t\t\ticon:SetTexture(texture)\n\n\t\t\tcooldown = _G[\"StanceButton\"..i..\"Cooldown\"]\n\t\t\tif texture then\n\t\t\t\tcooldown:SetAlpha(1)\n\t\t\telse\n\t\t\t\tcooldown:SetAlpha(0)\n\t\t\tend\n\n\t\t\tstart, duration, enable = GetShapeshiftFormCooldown(i)\n\t\t\tCooldownFrame_Set(cooldown, start, duration, enable)\n\n\t\t\tif isActive then\n\t\t\t\tbutton:SetChecked(true)\n\t\t\telse\n\t\t\t\tbutton:SetChecked(false)\n\t\t\tend\n\n\t\t\tif isCastable then\n\t\t\t\ticon:SetVertexColor(1.0, 1.0, 1.0)\n\t\t\telse\n\t\t\t\ticon:SetVertexColor(0.4, 0.4, 0.4)\n\t\t\tend\n\t\tend\n\tend\nend\n\nT.PetBarUpdate = function()\n\tlocal petActionButton, petActionIcon, petAutoCastableTexture, petAutoCastShine\n\tfor i = 1, NUM_PET_ACTION_SLOTS, 1 do\n\t\tlocal buttonName = \"PetActionButton\"..i\n\t\tpetActionButton = _G[buttonName]\n\t\tpetActionIcon = _G[buttonName..\"Icon\"]\n\t\tpetAutoCastableTexture = _G[\"PetActionButton\"..i].AutoCastable or _G[buttonName..\"AutoCastable\"]\n\t\tpetAutoCastShine = _G[buttonName..\"Shine\"]\n\t\tlocal name, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(i)\n\n\t\tif not isToken then\n\t\t\tpetActionIcon:SetTexture(texture)\n\t\t\tpetActionButton.tooltipName = name\n\t\telse\n\t\t\tpetActionIcon:SetTexture(_G[texture])\n\t\t\tpetActionButton.tooltipName = _G[name]\n\t\tend\n\n\t\tpetActionButton.isToken = isToken\n\n\t\tif isActive and name ~= \"PET_ACTION_FOLLOW\" then\n\t\t\tpetActionButton:SetChecked(true)\n\t\t\tif IsPetAttackAction(i) then\n\t\t\t\tpetActionButton:StartFlash()\n\t\t\t\tpetActionButton:GetCheckedTexture():SetAlpha(0.5)\n\t\t\tend\n\t\telse\n\t\t\tpetActionButton:SetChecked(false)\n\t\t\tif IsPetAttackAction(i) then\n\t\t\t\tpetActionButton:StopFlash()\n\t\t\t\tpetActionButton:GetCheckedTexture():SetAlpha(1.0)\n\t\t\tend\n\t\tend\n\n\t\tif autoCastAllowed then\n\t\t\tpetAutoCastableTexture:Show()\n\t\telse\n\t\t\tpetAutoCastableTexture:Hide()\n\t\tend\n\n\t\tif autoCastEnabled then\n\t\t\tAutoCastShine_AutoCastStart(petAutoCastShine)\n\t\telse\n\t\t\tAutoCastShine_AutoCastStop(petAutoCastShine)\n\t\tend\n\n\t\tif name then\n\t\t\tif not C.actionbar.show_grid then\n\t\t\t\tpetActionButton:SetAlpha(1)\n\t\t\tend\n\t\telse\n\t\t\tif not C.actionbar.show_grid then\n\t\t\t\tpetActionButton:SetAlpha(0)\n\t\t\tend\n\t\tend\n\n\t\tif texture then\n\t\t\tif GetPetActionSlotUsable(i) then\n\t\t\t\tSetDesaturation(petActionIcon, nil)\n\t\t\telse\n\t\t\t\tSetDesaturation(petActionIcon, 1)\n\t\t\tend\n\t\t\tpetActionIcon:Show()\n\t\telse\n\t\t\tpetActionIcon:Hide()\n\t\tend\n\n\t\tif not PetHasActionBar() and texture and name ~= \"PET_ACTION_FOLLOW\" then\n\t\t\tpetActionButton:StopFlash()\n\t\t\tSetDesaturation(petActionIcon, 1)\n\t\t\tpetActionButton:SetChecked(false)\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/ExtraBar.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n------------------------------------------------------------------------------------------\n--\tMake ExtraActionBarFrame movable (use macro /click ExtraActionButton1)\n------------------------------------------------------------------------------------------\nlocal anchor = CreateFrame(\"Frame\", \"ExtraButtonAnchor\", UIParent)\nif C.actionbar.split_bars then\n\tanchor:SetPoint(C.position.extra_button[1], SplitBarLeft, C.position.extra_button[3], C.position.extra_button[4], C.position.extra_button[5])\nelse\n\tanchor:SetPoint(unpack(C.position.extra_button))\nend\nlocal size = C.actionbar.button_size * 2 + C.actionbar.button_space\nanchor:SetSize(size, size)\nanchor:SetFrameStrata(\"LOW\")\nRegisterStateDriver(anchor, \"visibility\", \"[petbattle] hide; show\")\n\nExtraActionBarFrame:SetParent(anchor)\nExtraActionBarFrame:ClearAllPoints()\nExtraActionBarFrame:SetAllPoints()\n\n-- Prevent reanchor\nExtraAbilityContainer.ignoreFramePositionManager = true\nhooksecurefunc(ExtraActionBarFrame, \"SetParent\", function(self, parent)\n\tif parent == ExtraAbilityContainer then\n\t\tself:SetParent(anchor)\n\tend\nend)\n\n-- Zone Ability button\nlocal zoneAnchor = CreateFrame(\"Frame\", \"ZoneButtonAnchor\", UIParent)\nif C.actionbar.split_bars then\n\tzoneAnchor:SetPoint(C.position.zone_button[1], SplitBarLeft, C.position.zone_button[3], C.position.zone_button[4], C.position.zone_button[5])\nelse\n\tzoneAnchor:SetPoint(unpack(C.position.zone_button))\nend\nzoneAnchor:SetSize(size * 2, size)\nzoneAnchor:SetFrameStrata(\"LOW\")\nRegisterStateDriver(zoneAnchor, \"visibility\", \"[petbattle] hide; show\")\n\nZoneAbilityFrame:SetParent(zoneAnchor)\nZoneAbilityFrame:ClearAllPoints()\nZoneAbilityFrame:SetAllPoints()\nZoneAbilityFrame.ignoreInLayout = true\nZoneAbilityFrame.SpellButtonContainer:SetPoint(\"TOPRIGHT\", zoneAnchor)\nZoneAbilityFrame.SpellButtonContainer.spacing = 3\nhooksecurefunc(ZoneAbilityFrame, \"SetParent\", function(self, parent)\n\tif parent == ExtraAbilityContainer then\n\t\tself:SetParent(zoneAnchor)\n\tend\nend)\n\nC_Timer.After(0.1, function()\n\tZoneAbilityFrame.SpellButtonContainer:SetSize(size, size)\nend)\n\nhooksecurefunc(\"ExtraActionBar_Update\", function()\n\tlocal positionTable = T.CurrentProfile()\n\tif positionTable[\"ZoneButtonAnchor\"] then return end\n\tif HasExtraActionBar() then\n\t\tzoneAnchor:SetPoint(\"BOTTOMRIGHT\", anchor, \"BOTTOMLEFT\", -3, 0)\n\telse\n\t\tif C.actionbar.split_bars then\n\t\t\tzoneAnchor:SetPoint(C.position.zone_button[1], SplitBarLeft, C.position.zone_button[3], C.position.zone_button[4], C.position.zone_button[5])\n\t\telse\n\t\t\tzoneAnchor:SetPoint(unpack(C.position.zone_button))\n\t\tend\n\tend\nend)\n\n------------------------------------------------------------------------------------------\n--\tSkin ExtraActionBarFrame(by Zork)\n------------------------------------------------------------------------------------------\nlocal button = ExtraActionButton1\nlocal texture = button.style\nlocal disableTexture = function(style, texture)\n\tif texture then\n\t\tstyle:SetTexture(nil)\n\tend\nend\nbutton.style:SetTexture(nil)\nhooksecurefunc(texture, \"SetTexture\", disableTexture)\n\nbutton:SetSize(size, size)\n\nbutton.Count:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\nbutton.Count:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\nbutton.Count:SetPoint(\"BOTTOMRIGHT\", 0, 1)\nbutton.Count:SetJustifyH(\"RIGHT\")\n\nbutton:SetAttribute(\"showgrid\", 1)\n\n------------------------------------------------------------------------------------------\n--\tSkin ZoneAbilityFrame\n------------------------------------------------------------------------------------------\nlocal function SkinZoneAbilities()\n\tfor button in ZoneAbilityFrame.SpellButtonContainer:EnumerateActive() do\n\t\tif not button.IsSkinned then\n\t\t\tbutton.NormalTexture:SetAlpha(0)\n\t\t\tbutton:StyleButton()\n\t\t\tbutton:SetSize(size, size)\n\t\t\tbutton:SetTemplate(\"Transparent\")\n\t\t\tif C.actionbar.classcolor_border == true then\n\t\t\t\tbutton:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\t\tend\n\n\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tbutton.Icon:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\t\tbutton.Icon:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\t\t\tbutton.Icon:SetDrawLayer(\"BACKGROUND\", 7)\n\n\t\t\tbutton.Count:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\t\t\tbutton.Count:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\n\t\t\tbutton.Count:SetPoint(\"BOTTOMRIGHT\", 0, 1)\n\t\t\tbutton.Count:SetJustifyH(\"RIGHT\")\n\n\t\t\tbutton.Cooldown:SetAllPoints(button.Icon)\n\n\t\t\tbutton.IsSkinned = true\n\t\tend\n\tend\nend\n\nhooksecurefunc(ZoneAbilityFrame, \"UpdateDisplayedZoneAbilities\", SkinZoneAbilities)\nZoneAbilityFrame.Style:SetAlpha(0)\n\n------------------------------------------------------------------------------------------\n--\tSkin ExtraQuestButton\n------------------------------------------------------------------------------------------\nif IsAddOnLoaded(\"ExtraQuestButton\") then\n\tlocal button = ExtraQuestButton\n\tExtraQuestButtonArtwork:Hide()\n\tbutton:StyleButton()\n\tExtraQuestButtonNormalTexture:SetAlpha(0)\n\tExtraQuestButtonIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tExtraQuestButtonIcon:SetPoint(\"TOPLEFT\", button, 2, -2)\n\tExtraQuestButtonIcon:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\tExtraQuestButtonIcon:SetDrawLayer(\"BACKGROUND\", 7)\n\tExtraQuestButtonCooldown:SetDrawEdge(false)\n\tbutton:SetTemplate(\"Transparent\")\n\tif C.actionbar.classcolor_border == true then\n\t\tbutton:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/MicroMenu.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true or C.actionbar.micromenu ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMicro menu(by Elv22)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\", \"MicroAnchor\", T_PetBattleFrameHider)\nframe:SetPoint(unpack(C.position.micro_menu))\nframe:SetSize(250, 25)\n\nif C.actionbar.micromenu_mouseover then\n\tframe:SetAlpha(0)\n\tframe:SetScript(\"OnEnter\", function() frame:SetAlpha(1) end)\n\tframe:SetScript(\"OnLeave\", function() frame:SetAlpha(0) end)\nend\n\nlocal MICRO_BUTTONS = {\n\t\"CharacterMicroButton\",\n\t\"SpellbookMicroButton\",\n\t\"TalentMicroButton\",\n\t\"AchievementMicroButton\",\n\t\"QuestLogMicroButton\",\n\t\"GuildMicroButton\",\n\t\"LFDMicroButton\",\n\t\"EJMicroButton\",\n\t\"CollectionsMicroButton\",\n\t\"StoreMicroButton\",\n\t\"MainMenuMicroButton\",\n\t\"HelpMicroButton\",\n}\n\nlocal colors = {\n\t[1]\t= {0.35, 0.65, 1},\n\t[2]\t= {1, 0.58, 0.65},\n\t[3]\t= {0.21, 1, 0.95},\n\t[4]\t= {1, 0.62, 0.1},\n\t[5]\t= {0.96, 1, 0},\n\t[6]\t= {0, 1, 0.1},\n\t[7]\t= {0.7, 0.7, 1},\n\t[8]\t= {1, 1, 1},\n\t[9]\t= {1, 0.7, 0.58},\n\t[10] = {1, 0.83, 0.50},\n\t[11] = {1, 0.4, 0.4},\n\t[12] = {1, 1, 1},\n}\n\nfor i, button in pairs(MICRO_BUTTONS) do\n\tlocal bu = _G[button]\n\tlocal normal = bu:GetNormalTexture()\n\tlocal pushed = bu:GetPushedTexture()\n\tlocal disabled = bu:GetDisabledTexture()\n\tbu:SetSize(22, 29)\n\n\tlocal point = bu:GetPoint()\n\tif point then\n\t\tbu:ClearAllPoints()\n\t\tif i == 1 then\n\t\t\tbu:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -1, 2)\n\t\telse\n\t\t\tbu:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", ((i - 1) * 23) - 1, 2)\n\t\tend\n\tend\n\n\tbu:SetParent(frame)\n\tbu.SetParent = T.dummy\n\n\tbu:SetHighlightTexture(0)\n\tbu.SetHighlightTexture = T.dummy\n\n\tlocal f = CreateFrame(\"Frame\", nil, bu)\n\tf:SetFrameLevel(1)\n\tf:SetFrameStrata(\"BACKGROUND\")\n\tf:SetPoint(\"BOTTOMLEFT\", bu, \"BOTTOMLEFT\", 1, 2)\n\tf:SetPoint(\"TOPRIGHT\", bu, \"TOPRIGHT\", -1, -2)\n\tf:SetTemplate(\"Default\")\n\tbu.frame = f\n\n\tlocal flash = bu.FlashBorder\n\tif flash then\n\t\tflash:SetInside(f)\n\t\tflash:SetTexture(C.media.blank)\n\t\tflash:SetVertexColor(0.6, 0.6, 0.6)\n\tend\n\tif bu.FlashContent then bu.FlashContent:SetTexture(nil) end\n\n\tlocal highlight = bu:GetHighlightTexture()\n\tif highlight then\n\t\thighlight:SetAlpha(0)\n\tend\n\n\tnormal:SetTexCoord(0.1, 0.85, 0.12, 0.78)\n\tnormal:ClearAllPoints()\n\tnormal:SetPoint(\"TOPLEFT\", f, \"TOPLEFT\", 2, -2)\n\tnormal:SetPoint(\"BOTTOMRIGHT\", f, \"BOTTOMRIGHT\", -2, 2)\n\tnormal:SetVertexColor(unpack(colors[i]))\n\n\tpushed:SetTexCoord(0.1, 0.85, 0.12, 0.78)\n\tpushed:ClearAllPoints()\n\tpushed:SetPoint(\"TOPLEFT\", f, \"TOPLEFT\", 2, -2)\n\tpushed:SetPoint(\"BOTTOMRIGHT\", f, \"BOTTOMRIGHT\", -2, 2)\n\n\tif disabled then\n\t\tdisabled:SetTexCoord(0.1, 0.85, 0.12, 0.78)\n\t\tdisabled:ClearAllPoints()\n\t\tdisabled:SetPoint(\"TOPLEFT\", f, \"TOPLEFT\", 2, -2)\n\t\tdisabled:SetPoint(\"BOTTOMRIGHT\", f, \"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tbu:HookScript(\"OnEnter\", function(self)\n\t\tself.frame:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\tif C.actionbar.micromenu_mouseover then\n\t\t\tframe:SetAlpha(1)\n\t\tend\n\tend)\n\tbu:HookScript(\"OnLeave\", function(self)\n\t\tself.frame:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tif C.actionbar.micromenu_mouseover then\n\t\t\tframe:SetAlpha(0)\n\t\tend\n\tend)\nend\n\n-- Fix textures for buttons\nMainMenuMicroButton.MainMenuBarPerformanceBar:SetTexture(C.media.texture)\nMainMenuMicroButton.MainMenuBarPerformanceBar:SetSize(16, 2)\nMainMenuMicroButton.MainMenuBarPerformanceBar:SetPoint(\"BOTTOM\", MainMenuMicroButton, \"BOTTOM\", 0, 4)"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Range.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tOut of range check(tullaRange by Tuller)\n----------------------------------------------------------------------------------------\nlocal AddonName = ...\n\n-- the addon event handler\nlocal Addon = CreateFrame('Frame', AddonName, _G.InterfaceOptionsFrame)\n\n-- how quickly attack actions flash\nlocal ATTACK_BUTTON_FLASH_TIME = _G.ATTACK_BUTTON_FLASH_TIME\n\n-- the name of the database\nlocal DB_KEY = 'TULLARANGE_COLORS'\n\n-- how frequently we want to update colors, in seconds\nlocal UPDATE_DELAY = 0.2\n\nlocal ActionHasRange = _G.ActionHasRange\nlocal After = _G.C_Timer.After\nlocal GetTime = _G.GetTime\nlocal IsActionInRange = _G.IsActionInRange\nlocal IsUsableAction = _G.IsUsableAction\nlocal GetPetActionInfo = _G.GetPetActionInfo\nlocal GetPetActionSlotUsable = _G.GetPetActionSlotUsable\nlocal GetActionInfo = _G.GetActionInfo\nlocal GetMacroInfo = _G.GetMacroInfo\nlocal GetMacroSpell = _G.GetMacroSpell\nlocal GetSpellPowerCost = _G.GetSpellPowerCost\nlocal UnitPower = _G.UnitPower\n\n--------------------------------------------------------------------------------\n-- Event Handlers\n--------------------------------------------------------------------------------\n\n-- addon intially loaded\nfunction Addon:OnLoad()\n\t-- a table for the action buttons we want to periodically check the range of\n\tself.watchedActions = {}\n\n\t-- a table for the action buttons we want to periodically check the ranges of\n\tself.watchedPetActions = {}\n\n\t-- a table for all of the known action button states\n\tself.buttonStates = {}\n\n\t-- setup script handlers\n\tself:SetScript('OnShow', self.OnShow)\n\tself:SetScript('OnEvent', self.OnEvent)\n\n\t-- register any events we need to watch\n\tself:RegisterEvent('ADDON_LOADED')\n\tself:RegisterEvent('PLAYER_LOGIN')\n\tself:RegisterEvent('PLAYER_LOGOUT')\n\n\t-- drop this method, as we won't need it again\n\tself.OnLoad = nil\nend\n\n-- addon shown (which in this case means that InterfaceOptionsFrame was shown)\n-- load the config addon and get rid of this method\nfunction Addon:OnShow()\n\tLoadAddOn(AddonName .. '_Config')\n\n\t-- drop this method, as we won't need it again\n\tself:SetScript('OnShow', nil)\n\tself.OnShow = nil\nend\n\nfunction Addon:OnEvent(event, ...)\n\tlocal func = self[event]\n\n\tif func then\n\t\tfunc(self, event, ...)\n\tend\nend\n\n-- when the addon finishes loading...\nfunction Addon:ADDON_LOADED(event, addonName)\n\tif addonName ~= AddonName then\n\t\treturn\n\tend\n\n\t-- setup our saved settings stuff\n\tself:SetupDatabase()\n\n\t-- get rid of the handler, as we don't need it anymore\n\tself:UnregisterEvent(event)\n\tself[event] = nil\nend\n\n-- when the player first logs in...\nfunction Addon:PLAYER_LOGIN(event)\n\tlocal function button_StartFlash(button)\n\t\tif button:IsVisible() then\n\t\t\tself:StartButtonFlashing(button)\n\t\tend\n\tend\n\n\tlocal function actionButton_OnShowHide(button)\n\t\tself:UpdateActionButtonWatched(button)\n\t\tself:UpdateButtonFlashing(button)\n\tend\n\n\tlocal function actionButton_Update(button)\n\t\tself:UpdateActionButtonWatched(button)\n\tend\n\n\tlocal function actionButton_UpdateUsable(button)\n\t\tself:UpdateActionButtonState(button, true)\n\tend\n\n\t-- register existing action buttons\n\t-- the method varies between classic and shadowlands, as action buttons in\n\t-- shadowlands use ActionBarActionButtonMixin\n\tlocal ActionBarActionButtonMixin = _G.ActionBarActionButtonMixin\n\tif ActionBarActionButtonMixin then\n\t\tlocal function actionButton_OnLoad(button)\n\t\t\tbutton:SetScript(\"OnUpdate\", nil)\n\t\t\tbutton:HookScript('OnShow', actionButton_OnShowHide)\n\t\t\tbutton:HookScript('OnHide', actionButton_OnShowHide)\n\n\t\t\t-- Update is called whenever an action button changes, so we\n\t\t\t-- check here to we if we need to pay attention to the button anymore\n\t\t\thooksecurefunc(button, 'Update', actionButton_Update)\n\n\t\t\t-- UpdateUsable is called when the button normally changes\n\t\t\t-- color when unusuable, so we need to reapply our custom coloring\n\t\t\thooksecurefunc(button, 'UpdateUsable', actionButton_UpdateUsable)\n\n\t\t\tif self:EnableFlashAnimations() then\n\t\t\t\thooksecurefunc(button, 'StartFlash', button_StartFlash)\n\t\t\tend\n\n\t\t\tself:UpdateActionButtonWatched(button)\n\t\tend\n\n\t\t-- hook any existing frames that are derived from ActionBarActionButtonMixin\n\t\tlocal mixin_OnLoad = ActionBarActionButtonMixin.OnLoad\n\t\tlocal EnumerateFrames = _G.EnumerateFrames\n\t\tlocal f = EnumerateFrames()\n\n\t\twhile f do\n\t\t\tif f.OnLoad == mixin_OnLoad then\n\t\t\t\tactionButton_OnLoad(f)\n\t\t\tend\n\n\t\t\tf = EnumerateFrames(f)\n\t\tend\n\n\t\t-- grab later ones, too\n\t\thooksecurefunc(ActionBarActionButtonMixin, \"OnLoad\", actionButton_OnLoad)\n\telse\n\t\tlocal function actionButton_OnUpdate(button)\n\t\t\tbutton:SetScript('OnUpdate', nil)\n\t\t\tbutton:HookScript('OnShow', actionButton_OnShowHide)\n\t\t\tbutton:HookScript('OnHide', actionButton_OnShowHide)\n\n\t\t\tself:UpdateActionButtonWatched(button)\n\t\tend\n\n\t\t-- hook any action button events we need to take care of\n\t\t-- register events on update initially, and wipe out their individual on\n\t\t-- update handlers. This is why tullaRange has a negative performance\n\t\t-- impact\n\t\thooksecurefunc('ActionButton_OnUpdate', actionButton_OnUpdate)\n\n\t\t-- ActionButton_UpdateUsable is called when the button normally changes\n\t\t-- color when unusuable, so we need to reapply our custom coloring at this\n\t\t-- point\n\t\thooksecurefunc('ActionButton_UpdateUsable', actionButton_UpdateUsable)\n\n\t\t-- ActionButton_Update is called whenever an action button changes, so we\n\t\t-- check here to we if we need to pay attention to the button anymore or not\n\t\thooksecurefunc('ActionButton_Update', actionButton_Update)\n\n\t\t-- setup flash animations\n\t\tif self:EnableFlashAnimations() then\n\t\t\thooksecurefunc('ActionButton_StartFlash', button_StartFlash)\n\t\tend\n\tend\n\n\t-- register pet actions, if we want to\n\tif self:EnablePetActions() then\n\t\t-- register all pet action slots\n\t\tself.petActions = {}\n\n\t\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\t\ttinsert(self.petActions, _G['PetActionButton' .. i])\n\t\tend\n\n\t\tlocal function petButton_OnShowHide(button)\n\t\t\tself:UpdatePetActionButtonWatched(button)\n\t\t\tself:UpdateButtonFlashing(button)\n\t\tend\n\n\t\tlocal function petButton_OnUpdate(button)\n\t\t\tbutton:SetScript('OnUpdate', nil)\n\t\t\tbutton:HookScript('OnShow', petButton_OnShowHide)\n\t\t\tbutton:HookScript('OnHide', petButton_OnShowHide)\n\t\t\tself:UpdatePetActionButtonWatched(button)\n\t\tend\n\n\t\tlocal function petActionBar_Update(bar)\n\t\t\t-- the UI does not actually use the self arg here\n\t\t\t-- and sometimes calls the method without it\n\t\t\tbar = bar or _G.PetActionBarFrame\n\n\t\t\t-- reset the timer on update, so that we don't trigger the bar's\n\t\t\t-- own range updater code\n\t\t\tbar.rangeTimer = nil\n\n\t\t\t-- if we have a bar, update all the actions\n\t\t\tif PetHasActionBar() then\n\t\t\t\tfor _, button in pairs(self.petActions) do\n\t\t\t\t\t-- clear our current styling\n\t\t\t\t\tself.buttonStates[button] = nil\n\t\t\t\t\tself:UpdatePetActionButtonWatched(button)\n\t\t\t\tend\n\t\t\t\t-- if we don't, wipe any actions we currently are showing\n\t\t\telse\n\t\t\t\twipe(self.watchedPetActions)\n\t\t\tend\n\t\tend\n\n\t\t-- hook any pet button events we need to take care of\n\t\t-- register events on update initially, and wipe out their individual on\n\t\t-- update handlers.\n\n\t\tlocal PetActionBar = _G.PetActionBar\n\t\tif type(PetActionBar.Update) == \"function\" then\n\t\t\thooksecurefunc(PetActionBar, 'Update', petActionBar_Update)\n\t\tend\n\n\t\tlocal buttons = PetActionBar.actionButtons\n\t\tif type(buttons) == \"table\" then\n\t\t\tfor _, button in pairs(PetActionBar.actionButtons) do\n\t\t\t\thooksecurefunc(button, 'OnUpdate', petButton_OnUpdate)\n\t\t\t\thooksecurefunc(button, 'StartFlash', button_StartFlash)\n\t\t\tend\n\t\tend\n\tend\n\n\t-- get rid of the handler, as we don't need it anymore\n\tself:UnregisterEvent(event)\n\tself[event] = nil\nend\n\nfunction Addon:PLAYER_LOGOUT()\n\tself:CleanupDatabase()\nend\n\n--------------------------------------------------------------------------------\n-- Update API\n--------------------------------------------------------------------------------\n\nlocal function handleUpdate()\n\tif Addon:UpdateButtonStates() then\n\t\tAddon.updating = GetTime()\n\t\tAfter(UPDATE_DELAY, handleUpdate)\n\telse\n\t\tAddon.updating = nil\n\tend\nend\n\nfunction Addon:RequestUpdate()\n\tif self.updating ~= nil then\n\t\treturn\n\tend\n\n\tself.updating = GetTime()\n\tAfter(UPDATE_DELAY, handleUpdate)\nend\n\nfunction Addon:SetButtonState(button, state, force)\n\tif self.buttonStates[button] == state and not force then\n\t\treturn\n\tend\n\n\tself.buttonStates[button] = state\n\n\tlocal r, g, b, a = self:GetColor(state)\n\n\tbutton.icon:SetVertexColor(r, g, b, a)\nend\n\nfunction Addon:UpdateButtonStates(force)\n\tlocal updatedButtons = false\n\n\tif next(self.watchedActions) then\n\t\tfor button in pairs(self.watchedActions) do\n\t\t\tself:UpdateActionButtonState(button, force)\n\t\tend\n\n\t\tupdatedButtons = true\n\tend\n\n\tif next(self.watchedPetActions) then\n\t\tfor button in pairs(self.watchedPetActions) do\n\t\t\tself:UpdatePetActionButtonState(button, force)\n\t\tend\n\n\t\tupdatedButtons = true\n\tend\n\n\treturn updatedButtons\nend\n\nfunction Addon:GetActionButtonState(button)\n\tlocal action = button.action\n\tlocal actionType, actionTypeId = GetActionInfo(action)\n\n\tif not actionType then\n\t\treturn 'normal'\n\tend\n\n\t-- for macros with names that start with a #, we prioritize the OOM check\n\t-- using a spell cost strategy over other ones to better clarify if the\n\t-- macro is actually usable or not\n\tif actionType == 'macro' then\n\t\tlocal name = GetMacroInfo(actionTypeId)\n\n\t\tif name and name:sub(1, 1) == '#' then\n\t\t\tlocal spellId = GetMacroSpell(actionTypeId)\n\n\t\t\t-- only run the check for spell macros\n\t\t\tif spellId then\n\t\t\t\tlocal costs = GetSpellPowerCost(spellId)\n\n\t\t\t\tfor _, cost in ipairs(costs) do\n\t\t\t\t\tif UnitPower('player', cost.type) < cost.minCost then\n\t\t\t\t\t\treturn 'oom'\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tif IsActionInRange(action) == false then\n\t\t\t\t\treturn 'oor'\n\t\t\t\tend\n\n\t\t\t\treturn 'normal'\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal isUsable, notEnoughMana = IsUsableAction(action)\n\tif not isUsable then\n\t\tif notEnoughMana then\n\t\t\treturn 'oom'\n\t\tend\n\t\treturn 'unusable'\n\tend\n\n\t-- we do == false here because IsActionInRange can return one of true\n\t-- (has range, in range), false (has range, out of range), and nil (does\n\t-- not have range) and we explicitly want to know about (has range, oor)\n\tif IsActionInRange(action) == false then\n\t\treturn 'oor'\n\tend\n\n\treturn 'normal'\nend\n\nfunction Addon:UpdateActionButtonState(button, force)\n\tself:SetButtonState(button, self:GetActionButtonState(button), force)\nend\n\nfunction Addon:UpdateActionButtonWatched(button)\n\tlocal action = button.action\n\n\tif action and button:IsVisible() and ActionHasRange(action) then\n\t\tself.watchedActions[button] = true\n\telse\n\t\tself.watchedActions[button] = nil\n\tend\n\n\tself:RequestUpdate()\nend\n\n-- pet action button specific stuff\nfunction Addon:GetPetActionButtonState(button)\n\tlocal slot = button:GetID() or 0\n\tlocal _, _, _, _, _, _, _, checksRange, inRange = GetPetActionInfo(slot)\n\tlocal isUsable, notEnoughMana = GetPetActionSlotUsable(slot)\n\n\t-- usable (ignoring target information)\n\tif isUsable then\n\t\t-- but out of range\n\t\tif checksRange and not inRange then\n\t\t\treturn 'oor'\n\t\telse\n\t\t\treturn 'normal'\n\t\tend\n\telseif notEnoughMana then\n\t\treturn 'oom'\n\telse\n\t\treturn 'unusable'\n\tend\nend\n\nfunction Addon:UpdatePetActionButtonState(button, force)\n\tself:SetButtonState(button, self:GetPetActionButtonState(button), force)\nend\n\nfunction Addon:UpdatePetActionButtonWatched(button)\n\tlocal slot = button:GetID() or 0\n\tlocal _, _, _, _, _, _, _, checksRange = GetPetActionInfo(slot)\n\n\tif button:IsVisible() and checksRange then\n\t\tself.watchedPetActions[button] = true\n\telse\n\t\tself.watchedPetActions[button] = nil\n\tend\n\n\tself:RequestUpdate()\nend\n\n--------------------------------------------------------------------------------\n-- Flashing replacement\n--------------------------------------------------------------------------------\n\nlocal function alpha_OnFinished(self)\n\tlocal owner = self.owner\n\n\tif owner.flashing ~= 1 then\n\t\tAddon:StopButtonFlashing(owner)\n\tend\nend\n\nfunction Addon:StartButtonFlashing(button)\n\tlocal animation = self.flashAnimations and self.flashAnimations[button]\n\n\tif not animation then\n\t\tanimation = button.Flash:CreateAnimationGroup()\n\t\tanimation:SetLooping('BOUNCE')\n\n\t\tlocal alpha = animation:CreateAnimation('ALPHA')\n\n\t\talpha:SetDuration(self:GetFlashDuration())\n\t\talpha:SetFromAlpha(0)\n\t\talpha:SetToAlpha(1)\n\t\talpha:SetScript('OnFinished', alpha_OnFinished)\n\n\t\talpha.owner = button\n\n\t\tif self.flashAnimations then\n\t\t\tself.flashAnimations[button] = animation\n\t\telse\n\t\t\tself.flashAnimations = {[button] = animation}\n\t\tend\n\tend\n\n\tbutton.Flash:Show()\n\tanimation:Play()\nend\n\nfunction Addon:StopButtonFlashing(button)\n\tlocal animation = self.flashAnimations and self.flashAnimations[button]\n\n\tif animation then\n\t\tanimation:Stop()\n\t\tbutton.Flash:Hide()\n\tend\nend\n\nfunction Addon:UpdateButtonFlashing(button)\n\tif button.flashing == 1 and button:IsVisible() then\n\t\tself:StartButtonFlashing(button)\n\telse\n\t\tself:StopButtonFlashing(button)\n\tend\nend\n\n--------------------------------------------------------------------------------\n-- Saved settings setup stuff\n--------------------------------------------------------------------------------\n\nlocal function removeDefaults(tbl, defaults)\n\tfor k, v in pairs(defaults) do\n\t\tif type(tbl[k]) == 'table' and type(v) == 'table' then\n\t\t\tremoveDefaults(tbl[k], v)\n\t\t\tif next(tbl[k]) == nil then\n\t\t\t\ttbl[k] = nil\n\t\t\tend\n\t\telseif tbl[k] == v then\n\t\t\ttbl[k] = nil\n\t\tend\n\tend\n\n\treturn tbl\nend\n\nlocal function copyDefaults(tbl, defaults)\n\tfor k, v in pairs(defaults) do\n\t\tif type(v) == 'table' then\n\t\t\ttbl[k] = copyDefaults(tbl[k] or {}, v)\n\t\telseif tbl[k] == nil then\n\t\t\ttbl[k] = v\n\t\tend\n\tend\n\n\treturn tbl\nend\n\nfunction Addon:SetupDatabase()\n\tlocal sets = _G[DB_KEY]\n\n\tif not sets then\n\t\tsets = {}\n\t\t_G[DB_KEY] = sets\n\tend\n\n\tself.sets = copyDefaults(sets, self:GetDatabaseDefaults())\nend\n\nfunction Addon:CleanupDatabase()\n\tlocal sets = self.sets\n\n\tif sets then\n\t\tremoveDefaults(sets, self:GetDatabaseDefaults())\n\tend\nend\n\nfunction Addon:GetDatabaseDefaults()\n\treturn {\n\t\t-- enable range coloring on pet actions\n\t\tpetActions = true,\n\n\t\t-- enable flash animations,\n\t\tflashAnimations = true,\n\t\tflashDuration = ATTACK_BUTTON_FLASH_TIME * 1.5,\n\n\t\t-- default color (r, g, b, a)\n\t\tnormal = {1, 1, 1, 1},\n\t\t-- out of range\n\t\toor = {1, 0.3, 0.1, 1},\n\t\t-- out of mana\n\t\toom = {0.1, 0.3, 1, 1},\n\t\t-- unusable action\n\t\tunusable = {0.4, 0.4, 0.4, 1}\n\t}\nend\n\nfunction Addon:ResetDatabase()\n\t_G[DB_KEY] = nil\n\n\tself:SetupDatabase()\n\tself:UpdateButtonStates(true)\nend\n\n--------------------------------------------------------------------------------\n-- Configuration API\n--------------------------------------------------------------------------------\n\nfunction Addon:GetColor(state)\n\tlocal color = self.sets[state]\n\n\treturn color[1], color[2], color[3], color[4]\nend\n\nfunction Addon:SetColor(state, r, g, b, a)\n\tlocal color = self.sets[state]\n\n\tcolor[1] = r\n\tcolor[2] = g\n\tcolor[3] = b\n\tcolor[4] = a or 1\n\n\tself:UpdateButtonStates(true)\nend\n\n-- gets or sets enabling action button flashing\nfunction Addon:EnableFlashAnimations()\n\treturn self.sets.flashAnimations\nend\n\nfunction Addon:SetEnableFlashAnimations(enable)\n\tself.sets.flashAnimations = enable\nend\n\n-- sets the flash animation speed\nfunction Addon:GetFlashDuration()\n\treturn self.sets.flashDuration\nend\n\nfunction Addon:SetFlashDuration(duration)\n\tself.sets.flashDuration = tonumber(duration)\nend\n\n-- gets or sets enabling out of range  coloring on pet actions\nfunction Addon:EnablePetActions()\n\treturn self.sets.petActions\nend\n\nfunction Addon:SetEnablePetActions(enable)\n\tself.sets.petActions = enable\nend\n\n-- load the addon\nAddon:OnLoad()"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Style.lua",
    "content": "﻿local T, C, L, _ = unpack(ShestakUI)\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tStyle ActionBars buttons(by Tukz)\n----------------------------------------------------------------------------------------\nlocal function StyleNormalButton(button, size)\n\tif not button.isSkinned then\n\t\tlocal name = button:GetName()\n\t\tlocal icon = _G[name..\"Icon\"]\n\t\tlocal count = _G[name..\"Count\"]\n\t\tlocal flash = _G[name..\"Flash\"]\n\t\tlocal hotkey = _G[name..\"HotKey\"]\n\t\tlocal border = button.Border or _G[name..'Border']\n\t\tlocal btname = _G[name..\"Name\"]\n\t\tlocal normal = _G[name..\"NormalTexture\"]\n\t\tlocal float = _G[name..\"FloatingBG\"]\n\t\tlocal highlight = button.SpellHighlightTexture\n\t\tlocal isExtraAction = name:match(\"ExtraAction\")\n\t\tlocal isFlyout = name:match(\"Flyout\")\n\t\tlocal flyoutBorder = _G[name..\"FlyoutBorder\"]\n\t\tlocal flyoutBorderShadow = _G[name..\"FlyoutBorderShadow\"]\n\t\tlocal autocast = button.AutoCastable\n\t\tlocal shine = _G[name..\"Shine\"]\n\t\tlocal spellAlert = button.SpellActivationAlert\n\n\t\tlocal normal = button.NormalTexture or _G[name..'NormalTexture']\n\t\tlocal normal2 = button:GetNormalTexture()\n\n\t\tif button.IconMask then\n\t\t\tbutton.IconMask:Hide()\n\t\tend\n\n\t\tif button.SlotArt then\n\t\t\tbutton.SlotArt:SetAlpha(0)\n\t\tend\n\n\t\tif button.RightDivider then\n\t\t\tbutton.RightDivider:Kill()\n\t\tend\n\n\t\tif button.SlotBackground then\n\t\t\tbutton.SlotBackground:SetAlpha(0)\n\t\tend\n\n\t\tif button.NewActionTexture then\n\t\t\tbutton.NewActionTexture:SetAlpha(0)\n\t\tend\n\n\t\tif normal then\n\t\t\tnormal:SetTexture()\n\t\t\tnormal:Hide()\n\t\t\tnormal:SetAlpha(0)\n\t\tend\n\n\t\tif normal2 then\n\t\t\tnormal2:SetTexture()\n\t\t\tnormal2:Hide()\n\t\t\tnormal2:SetAlpha(0)\n\t\tend\n\n\t\tflash:SetTexture(\"\")\n\t\tbutton:SetNormalTexture(0)\n\n\t\tif float then\n\t\t\tfloat:SetTexture(\"\")\n\t\tend\n\n\t\tif border then\n\t\t\tborder:SetTexture(\"\")\n\t\tend\n\n\t\tif not isExtraAction then\n\t\t\tcount:ClearAllPoints()\n\t\t\tcount:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\t\tcount:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\tcount:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\t\tcount:SetHeight(C.font.action_bars_font_size)\n\t\tend\n\n\t\tif btname then\n\t\t\tif C.actionbar.macro == true then\n\t\t\t\tbtname:ClearAllPoints()\n\t\t\t\tbtname:SetPoint(\"BOTTOM\", 0, 1)\n\t\t\t\tbtname:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\t\tbtname:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\t\t\tbtname:SetWidth(C.actionbar.button_size - 1)\n\t\t\t\tbtname:SetHeight(C.font.action_bars_font_size)\n\t\t\telse\n\t\t\t\tbtname:Kill()\n\t\t\tend\n\t\tend\n\n\t\tif C.actionbar.hotkey == true then\n\t\t\thotkey:ClearAllPoints()\n\t\t\thotkey:SetPoint(\"TOPRIGHT\", 0, -1)\n\t\t\thotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\thotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\t\thotkey:SetWidth(C.actionbar.button_size - 1)\n\t\t\thotkey:SetHeight(C.font.action_bars_font_size)\n\t\telse\n\t\t\thotkey:Kill()\n\t\tend\n\n\t\tif not isFlyout and not isExtraAction then\n\t\t\tbutton:SetSize(size or C.actionbar.button_size, size or C.actionbar.button_size)\n\n\t\t\t-- Dragonflight - Hide profession quality icons\n\t\t\tif button.ProfessionQualityOverlayFrame then\n\t\t\t\tbutton.ProfessionQualityOverlayFrame:SetAlpha(0)\n\t\t\tend\n\t\t\thooksecurefunc(button, \"UpdateProfessionQuality\", function(self)\n\t\t\t\tif self.ProfessionQualityOverlayFrame then\n\t\t\t\t\tself.ProfessionQualityOverlayFrame:SetAlpha(0)\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\t\tbutton:SetTemplate(\"Transparent\")\n\t\tif C.actionbar.classcolor_border == true then\n\t\t\tbutton:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\tend\n\n\t\ticon:CropIcon()\n\t\ticon:SetDrawLayer(\"BACKGROUND\", 7)\n\n\t\tif normal then\n\t\t\tnormal:ClearAllPoints()\n\t\t\tnormal:SetPoint(\"TOPLEFT\")\n\t\t\tnormal:SetPoint(\"BOTTOMRIGHT\")\n\t\tend\n\n\t\tif highlight then\n\t\t\thighlight:ClearAllPoints()\n\t\t\thighlight:SetPoint(\"TOPLEFT\", -4, 4)\n\t\t\thighlight:SetPoint(\"BOTTOMRIGHT\", 4, -4)\n\t\tend\n\n\t\tbutton.oborder:SetFrameLevel(button:GetFrameLevel())\n\t\tbutton.iborder:SetFrameLevel(button:GetFrameLevel())\n\n\t\tif button.QuickKeybindHighlightTexture then\n\t\t\tbutton.QuickKeybindHighlightTexture:SetScale(0.0001)\n\t\tend\n\n\t\tif flyoutBorder then\n\t\t\tflyoutBorder:SetTexture(\"\")\n\t\tend\n\t\tif flyoutBorderShadow then\n\t\t\tflyoutBorderShadow:SetTexture(\"\")\n\t\tend\n\n\t\tif autocast then\n\t\t\tautocast:SetSize((C.actionbar.button_size * 2) - 10, (C.actionbar.button_size * 2) - 10)\n\t\t\tautocast:ClearAllPoints()\n\t\t\tautocast:SetPoint(\"CENTER\", button, 0, 0)\n\t\tend\n\n\t\tif shine then\n\t\t\tshine:SetSize(C.actionbar.button_size, C.actionbar.button_size)\n\t\tend\n\n\t\tif spellAlert then\n\t\t\tspellAlert:SetSize((size or C.actionbar.button_size) * 1.4, (size or C.actionbar.button_size) * 1.4)\n\t\t\tActionButton_HideOverlayGlow(button)\n\t\tend\n\n\t\tbutton:StyleButton()\n\n\t\tbutton.isSkinned = true\n\tend\nend\n\nlocal function StyleSmallButton(normal, button, icon, name, pet)\n\tif not button.isSkinned then\n\t\tlocal flash = _G[name..\"Flash\"]\n\t\tlocal hotkey = _G[name..\"HotKey\"]\n\t\tlocal normal = _G[name..\"NormalTexture\"]\n\n\t\tbutton:SetNormalTexture(0)\n\n\t\tif normal then\n\t\t\tnormal:SetAlpha(0)\n\t\tend\n\n\t\tif button.IconMask then\n\t\t\tbutton.IconMask:Hide()\n\t\tend\n\n\t\thooksecurefunc(button, \"SetNormalTexture\", function(self, texture)\n\t\t\tif texture and texture ~= \"\" then\n\t\t\t\tself:SetNormalTexture(0)\n\t\t\tend\n\t\tend)\n\n\t\tflash:SetColorTexture(0.8, 0.8, 0.8, 0.5)\n\t\tflash:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\tflash:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\n\t\tif C.actionbar.hotkey == true then\n\t\t\thotkey:ClearAllPoints()\n\t\t\thotkey:SetPoint(\"TOPRIGHT\", 0, 0)\n\t\t\thotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\thotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\t\thotkey:SetWidth(C.actionbar.button_size - 1)\n\t\telse\n\t\t\thotkey:Kill()\n\t\tend\n\n\t\tbutton:SetSize(C.actionbar.button_size, C.actionbar.button_size)\n\t\tbutton:SetTemplate(\"Transparent\")\n\t\tif C.actionbar.classcolor_border == true then\n\t\t\tbutton:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\tend\n\n\t\ticon:CropIcon()\n\t\ticon:SetDrawLayer(\"BACKGROUND\", 7)\n\n\t\tif pet then\n\t\t\tlocal autocast = button.AutoCastable\n\t\t\tautocast:SetSize((C.actionbar.button_size * 2) - 10, (C.actionbar.button_size * 2) - 10)\n\t\t\tautocast:ClearAllPoints()\n\t\t\tautocast:SetPoint(\"CENTER\", button, 0, 0)\n\n\t\t\tlocal shine = _G[name..\"Shine\"]\n\t\t\tshine:SetSize(C.actionbar.button_size, C.actionbar.button_size)\n\n\t\t\tlocal cooldown = _G[name..\"Cooldown\"]\n\t\t\tcooldown:SetSize(C.actionbar.button_size - 2, C.actionbar.button_size - 2)\n\t\tend\n\n\t\tif normal then\n\t\t\tnormal:ClearAllPoints()\n\t\t\tnormal:SetPoint(\"TOPLEFT\")\n\t\t\tnormal:SetPoint(\"BOTTOMRIGHT\")\n\t\tend\n\n\t\tif button.QuickKeybindHighlightTexture then\n\t\t\tbutton.QuickKeybindHighlightTexture:SetScale(0.0001)\n\t\tend\n\n\t\tbutton:StyleButton()\n\n\t\tbutton.isSkinned = true\n\tend\nend\n\nfunction T.StyleShift()\n\tfor i = 1, 10 do\n\t\tlocal name = \"StanceButton\"..i\n\t\tlocal button = _G[name]\n\t\tlocal icon = _G[name..\"Icon\"]\n\t\tlocal normal = _G[name..\"NormalTexture\"]\n\t\tStyleSmallButton(normal, button, icon, name)\n\tend\nend\n\nfunction T.StylePet()\n\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\tlocal name = \"PetActionButton\"..i\n\t\tlocal button = _G[name]\n\t\tlocal icon = _G[name..\"Icon\"]\n\t\tlocal normal = _G[name..\"NormalTexture2\"]\n\t\tStyleSmallButton(normal, button, icon, name, true)\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function(self, event)\n\tfor i = 1, 12 do\n\t\tStyleNormalButton(_G[\"ActionButton\"..i], C.actionbar.editor and C.actionbar.bar1_size)\n\t\tStyleNormalButton(_G[\"MultiBarBottomLeftButton\"..i], C.actionbar.editor and C.actionbar.bar2_size)\n\t\tStyleNormalButton(_G[\"MultiBarLeftButton\"..i], C.actionbar.editor and C.actionbar.bar3_size)\n\t\tStyleNormalButton(_G[\"MultiBarRightButton\"..i], C.actionbar.editor and C.actionbar.bar4_size)\n\t\tStyleNormalButton(_G[\"MultiBarBottomRightButton\"..i], C.actionbar.editor and C.actionbar.bar5_size)\n\t\tStyleNormalButton(_G[\"MultiBar5Button\"..i], C.actionbar.editor and C.actionbar.bar6_size)\n\t\tStyleNormalButton(_G[\"MultiBar6Button\"..i], C.actionbar.bar7_size)\n\t\tStyleNormalButton(_G[\"MultiBar7Button\"..i], C.actionbar.bar8_size)\n\tend\n\n\tStyleNormalButton(ExtraActionButton1)\nend)\n\nlocal function SetupFlyoutButton(button, self)\n\tif button:GetHeight() ~= C.actionbar.button_size and not InCombatLockdown() then\n\t\tbutton:SetSize(C.actionbar.button_size, C.actionbar.button_size)\n\tend\n\n\tif not button.IsSkinned then\n\t\tStyleNormalButton(button)\n\n\t\tif C.actionbar.rightbars_mouseover == true then\n\t\t\tSpellFlyout:HookScript(\"OnEnter\", function() RightBarMouseOver(1) end)\n\t\t\tSpellFlyout:HookScript(\"OnLeave\", function() RightBarMouseOver(0) end)\n\t\t\tbutton:HookScript(\"OnEnter\", function() RightBarMouseOver(1) end)\n\t\t\tbutton:HookScript(\"OnLeave\", function() RightBarMouseOver(0) end)\n\t\tend\n\n\t\tif C.actionbar.bottombars_mouseover == true then\n\t\t\tSpellFlyout:HookScript(\"OnEnter\", function() BottomBarMouseOver(1) end)\n\t\t\tSpellFlyout:HookScript(\"OnLeave\", function() BottomBarMouseOver(0) end)\n\t\t\tbutton:HookScript(\"OnEnter\", function() BottomBarMouseOver(1) end)\n\t\t\tbutton:HookScript(\"OnLeave\", function() BottomBarMouseOver(0) end)\n\t\tend\n\t\tbutton.IsSkinned = true\n\tend\nend\n\nlocal function StyleFlyoutButton(self)\n\tlocal button, i = _G[\"SpellFlyoutButton1\"], 1\n\twhile button do\n\t\tSetupFlyoutButton(button, self)\n\n\t\ti = i + 1\n\t\tbutton = _G[\"SpellFlyoutButton\"..i]\n\tend\nend\n\nSpellFlyout:HookScript(\"OnShow\", StyleFlyoutButton)\nSpellFlyout.Background:Hide()\n\nif C.actionbar.hotkey == true then\n\tlocal gsub = string.gsub\n\tlocal function UpdateHotkey(self, pass)\n\t\tlocal hotkey = _G[self:GetName()..\"HotKey\"]\n\t\tlocal text = hotkey:GetText()\n\t\tif not text then return end\n\n\t\ttext = gsub(text, \"(s%-)\", \"S\")\n\t\ttext = gsub(text, \"(a%-)\", \"A\")\n\t\ttext = gsub(text, \"(а%-)\", \"A\") -- fix ruRU\n\t\ttext = gsub(text, \"(c%-)\", \"C\")\n\t\ttext = gsub(text, \"(Mouse Button )\", \"M\")\n\t\ttext = gsub(text, \"(Кнопка мыши )\", \"M\")\n\t\ttext = gsub(text, KEY_BUTTON3, \"M3\")\n\t\ttext = gsub(text, KEY_PAGEUP, \"PU\")\n\t\ttext = gsub(text, KEY_PAGEDOWN, \"PD\")\n\t\ttext = gsub(text, KEY_SPACE, \"SpB\")\n\t\ttext = gsub(text, KEY_INSERT, \"Ins\")\n\t\ttext = gsub(text, KEY_HOME, \"Hm\")\n\t\ttext = gsub(text, KEY_DELETE, \"Del\")\n\t\ttext = gsub(text, KEY_NUMPADDECIMAL, \"Nu.\")\n\t\ttext = gsub(text, KEY_NUMPADDIVIDE, \"Nu/\")\n\t\ttext = gsub(text, KEY_NUMPADMINUS, \"Nu-\")\n\t\ttext = gsub(text, KEY_NUMPADMULTIPLY, \"Nu*\")\n\t\ttext = gsub(text, KEY_NUMPADPLUS, \"Nu+\")\n\t\ttext = gsub(text, KEY_NUMLOCK, \"NuL\")\n\t\ttext = gsub(text, KEY_MOUSEWHEELDOWN, \"MWD\")\n\t\ttext = gsub(text, KEY_MOUSEWHEELUP, \"MWU\")\n\n\t\tif not pass then\n\t\t\thotkey:ClearAllPoints()\n\t\t\thotkey:SetPoint(\"TOPRIGHT\", 0, -1)\n\t\t\thotkey:SetWidth(self:GetWidth() - 1)\n\t\t\thotkey:SetHeight(C.font.action_bars_font_size)\n\t\tend\n\n\t\tif hotkey:GetText() == _G[\"RANGE_INDICATOR\"] then\n\t\t\thotkey:SetText(\"\")\n\t\telse\n\t\t\thotkey:SetText(text)\n\t\tend\n\tend\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"UPDATE_BINDINGS\")\n\tframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tframe:SetScript(\"OnEvent\", function()\n\t\tfor i = 1, 12 do\n\t\t\tUpdateHotkey(_G[\"ActionButton\"..i])\n\t\t\tUpdateHotkey(_G[\"MultiBarBottomLeftButton\"..i])\n\t\t\tUpdateHotkey(_G[\"MultiBarBottomRightButton\"..i])\n\t\t\tUpdateHotkey(_G[\"MultiBarLeftButton\"..i])\n\t\t\tUpdateHotkey(_G[\"MultiBarRightButton\"..i])\n\t\t\tUpdateHotkey(_G[\"MultiBar5Button\"..i])\n\t\t\tUpdateHotkey(_G[\"MultiBar6Button\"..i])\n\t\t\tUpdateHotkey(_G[\"MultiBar7Button\"..i])\n\t\tend\n\t\tfor i = 1, 10 do\n\t\t\tUpdateHotkey(_G[\"StanceButton\"..i], true)\n\t\t\tUpdateHotkey(_G[\"PetActionButton\"..i], true)\n\t\tend\n\t\tUpdateHotkey(ExtraActionButton1, true)\n\tend)\nend\n\nif C.actionbar.hide_highlight == true then\n\tlocal function HideHighlightButton(self)\n\t\tif self.overlay then\n\t\t\tself.overlay:Hide()\n\t\t\tActionButton_HideOverlayGlow(self)\n\t\tend\n\tend\n\n\thooksecurefunc(\"ActionButton_ShowOverlayGlow\", HideHighlightButton)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/Toggle.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true or C.actionbar.toggle_mode ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tToggle ActionBars\n----------------------------------------------------------------------------------------\nlocal ToggleBar = CreateFrame(\"Frame\", \"ToggleActionbar\", UIParent)\n\nlocal ToggleBarText = function(i, text, plus, neg)\n\tif plus then\n\t\tToggleBar[i].Text:SetText(text)\n\t\tToggleBar[i].Text:SetTextColor(0.3, 0.3, 0.9)\n\telseif neg then\n\t\tToggleBar[i].Text:SetText(text)\n\t\tToggleBar[i].Text:SetTextColor(0.9, 0.3, 0.3)\n\tend\nend\n\nlocal MainBars = function()\n\tif C.actionbar.split_bars ~= true then\n\t\tif ShestakUISettingsPerChar.BottomBars == 1 then\n\t\t\tActionBarAnchor:SetHeight(C.actionbar.button_size)\n\t\t\tToggleBarText(1, \"+ + +\", true)\n\t\t\tBar2Holder:Hide()\n\t\t\tBar5Holder:Hide()\n\t\telseif ShestakUISettingsPerChar.BottomBars == 2 then\n\t\t\tActionBarAnchor:SetHeight(C.actionbar.button_size * 2 + C.actionbar.button_space)\n\t\t\tToggleBarText(1, \"+ + +\", true)\n\t\t\tBar2Holder:Show()\n\t\t\tBar5Holder:Hide()\n\t\telseif ShestakUISettingsPerChar.BottomBars == 3 then\n\t\t\tActionBarAnchor:SetHeight((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2))\n\t\t\tToggleBarText(1, \"- - -\", false, true)\n\t\t\tBar2Holder:Show()\n\t\t\tBar5Holder:Show()\n\t\tend\n\telseif C.actionbar.split_bars == true then\n\t\tif ShestakUISettingsPerChar.BottomBars == 1 then\n\t\t\tActionBarAnchor:SetHeight(C.actionbar.button_size)\n\t\t\tToggleBarText(1, \"+ + +\", true)\n\t\t\tBar2Holder:Hide()\n\t\t\tToggleBar[3]:SetHeight(C.actionbar.button_size)\n\t\t\tToggleBar[4]:SetHeight(C.actionbar.button_size)\n\t\t\tfor i = 1, 3 do\n\t\t\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\t\tb:SetAlpha(0)\n\t\t\t\tb:SetScale(0.000001)\n\t\t\tend\n\t\t\tfor i = 7, 9 do\n\t\t\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\t\tb:SetAlpha(0)\n\t\t\t\tb:SetScale(0.000001)\n\t\t\tend\n\t\telseif ShestakUISettingsPerChar.BottomBars == 2 then\n\t\t\tActionBarAnchor:SetHeight(C.actionbar.button_size * 2 + C.actionbar.button_space)\n\t\t\tToggleBarText(1, \"- - -\", false, true)\n\t\t\tBar2Holder:Show()\n\t\t\tToggleBar[3]:SetHeight(C.actionbar.button_size * 2 + C.actionbar.button_space)\n\t\t\tToggleBar[4]:SetHeight(C.actionbar.button_size * 2 + C.actionbar.button_space)\n\t\t\tfor i = 1, 3 do\n\t\t\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\t\tif not C.actionbar.bottombars_mouseover then\n\t\t\t\t\tb:SetAlpha(1)\n\t\t\t\tend\n\t\t\t\tb:SetScale(1)\n\t\t\tend\n\t\t\tfor i = 7, 9 do\n\t\t\t\tlocal b = _G[\"MultiBarBottomRightButton\"..i]\n\t\t\t\tif not C.actionbar.bottombars_mouseover then\n\t\t\t\t\tb:SetAlpha(1)\n\t\t\t\tend\n\t\t\t\tb:SetScale(1)\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal RightBars = function()\n\tif C.actionbar.rightbars > 2 then\n\t\tif ShestakUISettingsPerChar.RightBars == 1 then\n\t\t\tRightActionBarAnchor:SetWidth(C.actionbar.button_size)\n\t\t\tif not C.actionbar.petbar_horizontal == true then\n\t\t\t\tPetActionBarAnchor:ClearAllPoints()\n\t\t\t\tPetActionBarAnchor:SetPoint(\"RIGHT\", RightActionBarAnchor, \"LEFT\", 0, 0)\n\t\t\tend\n\t\t\tToggleBar[2]:SetWidth(C.actionbar.button_size)\n\t\t\tToggleBarText(2, \"> > >\", false, true)\n\t\t\tBar3Holder:Hide()\n\t\t\tBar4Holder:Hide()\n\t\telseif ShestakUISettingsPerChar.RightBars == 2 then\n\t\t\tRightActionBarAnchor:SetWidth(C.actionbar.button_size * 2 + C.actionbar.button_space)\n\t\t\tif not C.actionbar.petbar_horizontal == true then\n\t\t\t\tPetActionBarAnchor:ClearAllPoints()\n\t\t\t\tPetActionBarAnchor:SetPoint(\"RIGHT\", RightActionBarAnchor, \"LEFT\", 0, 0)\n\t\t\tend\n\t\t\tToggleBar[2]:SetWidth(C.actionbar.button_size * 2 + C.actionbar.button_space)\n\t\t\tToggleBarText(2, \"> > >\", false, true)\n\t\t\tBar3Holder:Hide()\n\t\t\tBar4Holder:Show()\n\t\telseif ShestakUISettingsPerChar.RightBars == 3 then\n\t\t\tRightActionBarAnchor:SetWidth((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2))\n\t\t\tif not C.actionbar.petbar_horizontal == true then\n\t\t\t\tPetActionBarAnchor:ClearAllPoints()\n\t\t\t\tPetActionBarAnchor:SetPoint(\"RIGHT\", RightActionBarAnchor, \"LEFT\", 0, 0)\n\t\t\tend\n\t\t\tToggleBar[2]:SetWidth((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2))\n\t\t\tToggleBarText(2, \"> > >\", false, true)\n\t\t\tRightActionBarAnchor:Show()\n\t\t\tBar3Holder:Show()\n\t\t\tBar4Holder:Show()\n\t\t\tBar6Holder:Show()\n\t\telseif ShestakUISettingsPerChar.RightBars == 0 then\n\t\t\tif not C.actionbar.petbar_horizontal == true then\n\t\t\t\tPetActionBarAnchor:ClearAllPoints()\n\t\t\t\tPetActionBarAnchor:SetPoint(\"BOTTOMRIGHT\", ToggleBar[2], \"TOPRIGHT\", 3, 3)\n\t\t\tend\n\t\t\tToggleBar[2]:SetWidth(C.actionbar.button_size)\n\t\t\tToggleBarText(2, \"< < <\", true)\n\t\t\tRightActionBarAnchor:Hide()\n\t\t\tBar3Holder:Hide()\n\t\t\tBar4Holder:Hide()\n\t\t\tBar6Holder:Hide()\n\t\tend\n\telseif C.actionbar.rightbars < 3 then\n\t\tif ShestakUISettingsPerChar.RightBars == 1 then\n\t\t\tRightActionBarAnchor:SetWidth(C.actionbar.button_size)\n\t\t\tif not C.actionbar.petbar_horizontal == true then\n\t\t\t\tPetActionBarAnchor:ClearAllPoints()\n\t\t\t\tPetActionBarAnchor:SetPoint(\"RIGHT\", RightActionBarAnchor, \"LEFT\", 0, 0)\n\t\t\tend\n\t\t\tToggleBar[2]:SetWidth(C.actionbar.button_size)\n\t\t\tToggleBarText(2, \"> > >\", false, true)\n\t\t\tBar3Holder:Show()\n\t\t\tBar4Holder:Hide()\n\t\telseif ShestakUISettingsPerChar.RightBars == 2 then\n\t\t\tRightActionBarAnchor:SetWidth(C.actionbar.button_size * 2 + C.actionbar.button_space)\n\t\t\tif not C.actionbar.petbar_horizontal == true then\n\t\t\t\tPetActionBarAnchor:ClearAllPoints()\n\t\t\t\tPetActionBarAnchor:SetPoint(\"RIGHT\", RightActionBarAnchor, \"LEFT\", 0, 0)\n\t\t\tend\n\t\t\tToggleBar[2]:SetWidth(C.actionbar.button_size * 2 + C.actionbar.button_space)\n\t\t\tToggleBarText(2, \"> > >\", false, true)\n\t\t\tRightActionBarAnchor:Show()\n\t\t\tBar3Holder:Show()\n\t\t\tBar4Holder:Show()\n\t\telseif ShestakUISettingsPerChar.RightBars == 0 then\n\t\t\tif not C.actionbar.petbar_horizontal == true then\n\t\t\t\tPetActionBarAnchor:ClearAllPoints()\n\t\t\t\tPetActionBarAnchor:SetPoint(\"BOTTOMRIGHT\", UIParent, \"BOTTOMRIGHT\", -18, 320)\n\t\t\tend\n\t\t\tToggleBar[2]:SetWidth(C.actionbar.button_size)\n\t\t\tToggleBarText(2, \"< < <\", true)\n\t\t\tRightActionBarAnchor:Hide()\n\t\t\tBar3Holder:Hide()\n\t\t\tBar4Holder:Hide()\n\t\t\tBar6Holder:Hide()\n\t\tend\n\tend\nend\n\nlocal SplitBars = function()\n\tif C.actionbar.split_bars == true then\n\t\tif ShestakUISettingsPerChar.SplitBars == true then\n\t\t\tToggleBar[3]:ClearAllPoints()\n\t\t\tToggleBar[3]:SetPoint(\"BOTTOMLEFT\", SplitBarRight, \"BOTTOMRIGHT\", C.actionbar.button_space, 0)\n\t\t\tToggleBar[4]:ClearAllPoints()\n\t\t\tToggleBar[4]:SetPoint(\"BOTTOMRIGHT\", SplitBarLeft, \"BOTTOMLEFT\", -C.actionbar.button_space, 0)\n\t\t\tVehicleButtonAnchor:ClearAllPoints()\n\t\t\tVehicleButtonAnchor:SetPoint(\"BOTTOMRIGHT\", SplitBarLeft, \"BOTTOMLEFT\", -C.actionbar.button_space, 0)\n\t\t\tif ShestakUISettingsPerChar.BottomBars == 2 then\n\t\t\t\tToggleBarText(3, \"<\\n<\\n<\", false, true)\n\t\t\t\tToggleBarText(4, \">\\n>\\n>\", false, true)\n\t\t\telse\n\t\t\t\tToggleBarText(3, \"<\\n<\", false, true)\n\t\t\t\tToggleBarText(4, \">\\n>\", false, true)\n\t\t\tend\n\t\t\tBar5Holder:Show()\n\t\t\tSplitBarLeft:Show()\n\t\t\tSplitBarRight:Show()\n\t\telseif ShestakUISettingsPerChar.SplitBars == false then\n\t\t\tToggleBar[3]:ClearAllPoints()\n\t\t\tToggleBar[3]:SetPoint(\"BOTTOMLEFT\", ActionBarAnchor, \"BOTTOMRIGHT\", C.actionbar.button_space, 0)\n\t\t\tToggleBar[4]:ClearAllPoints()\n\t\t\tToggleBar[4]:SetPoint(\"BOTTOMRIGHT\", ActionBarAnchor, \"BOTTOMLEFT\", -C.actionbar.button_space, 0)\n\t\t\tVehicleButtonAnchor:ClearAllPoints()\n\t\t\tVehicleButtonAnchor:SetPoint(\"BOTTOMRIGHT\", ActionBarAnchor, \"BOTTOMLEFT\", -C.actionbar.button_space, 0)\n\t\t\tif ShestakUISettingsPerChar.BottomBars == 2 then\n\t\t\t\tToggleBarText(3, \">\\n>\\n>\", true)\n\t\t\t\tToggleBarText(4, \"<\\n<\\n<\", true)\n\t\t\telse\n\t\t\t\tToggleBarText(3, \">\\n>\", true)\n\t\t\t\tToggleBarText(4, \"<\\n<\", true)\n\t\t\tend\n\t\t\tBar5Holder:Hide()\n\t\t\tSplitBarLeft:Hide()\n\t\t\tSplitBarRight:Hide()\n\t\tend\n\tend\nend\n\nlocal LockCheck = function(i)\n\tif ShestakUISettingsPerChar.BarsLocked == true then\n\t\tToggleBar[i].Text:SetText(\"U\")\n\t\tToggleBar[i].Text:SetTextColor(0.3, 0.3, 0.9)\n\telseif ShestakUISettingsPerChar.BarsLocked == false then\n\t\tToggleBar[i].Text:SetText(\"L\")\n\t\tToggleBar[i].Text:SetTextColor(0.9, 0.3, 0.3)\n\telse\n\t\tToggleBar[i].Text:SetText(\"L\")\n\t\tToggleBar[i].Text:SetTextColor(0.9, 0.3, 0.3)\n\tend\nend\n\nfor i = 1, 5 do\n\tToggleBar[i] = CreateFrame(\"Frame\", \"ToggleBar\"..i, ToggleBar)\n\tToggleBar[i]:EnableMouse(true)\n\tToggleBar[i]:SetAlpha(0)\n\n\tToggleBar[i].Text = ToggleBar[i]:CreateFontString(nil, \"OVERLAY\")\n\tToggleBar[i].Text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tToggleBar[i].Text:SetPoint(\"CENTER\", 2, 0)\n\n\tif i == 1 then\n\t\tToggleBar[i]:CreatePanel(\"Transparent\", ActionBarAnchor:GetWidth(), C.actionbar.button_size / 1.5, \"BOTTOM\", ActionBarAnchor, \"TOP\", 0, C.actionbar.button_space)\n\t\tToggleBarText(i, \"- - -\", false, true)\n\n\t\tToggleBar[i]:SetScript(\"OnMouseDown\", function()\n\t\t\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\t\t\tShestakUISettingsPerChar.BottomBars = ShestakUISettingsPerChar.BottomBars + 1\n\n\t\t\tif C.actionbar.split_bars ~= true then\n\t\t\t\tif ShestakUISettingsPerChar.BottomBars > 3 then\n\t\t\t\t\tShestakUISettingsPerChar.BottomBars = 1\n\t\t\t\telseif ShestakUISettingsPerChar.BottomBars > 2 then\n\t\t\t\t\tShestakUISettingsPerChar.BottomBars = 3\n\t\t\t\telseif ShestakUISettingsPerChar.BottomBars < 1 then\n\t\t\t\t\tShestakUISettingsPerChar.BottomBars = 3\n\t\t\t\tend\n\t\t\telseif C.actionbar.split_bars == true then\n\t\t\t\tif ShestakUISettingsPerChar.BottomBars > 2 then\n\t\t\t\t\tShestakUISettingsPerChar.BottomBars = 1\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tMainBars()\n\t\tend)\n\t\tToggleBar[i]:SetScript(\"OnEvent\", MainBars)\n\telseif i == 2 then\n\t\tToggleBar[i]:CreatePanel(\"Transparent\", RightActionBarAnchor:GetWidth(), C.actionbar.button_size / 1.5, \"TOPRIGHT\", RightActionBarAnchor, \"BOTTOMRIGHT\", 0, -C.actionbar.button_space)\n\t\tToggleBar[i]:SetFrameStrata(\"LOW\")\n\t\tToggleBarText(i, \"> > >\", false, true)\n\n\t\tToggleBar[i]:SetScript(\"OnMouseDown\", function()\n\t\t\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\t\t\tShestakUISettingsPerChar.RightBars = ShestakUISettingsPerChar.RightBars - 1\n\n\t\t\tif C.actionbar.rightbars > 2 then\n\t\t\t\tif ShestakUISettingsPerChar.RightBars > 3 then\n\t\t\t\t\tShestakUISettingsPerChar.RightBars = 2\n\t\t\t\telseif ShestakUISettingsPerChar.RightBars > 2 then\n\t\t\t\t\tShestakUISettingsPerChar.RightBars = 1\n\t\t\t\telseif ShestakUISettingsPerChar.RightBars < 0 then\n\t\t\t\t\tShestakUISettingsPerChar.RightBars = 3\n\t\t\t\tend\n\t\t\telseif C.actionbar.rightbars < 3 then\n\t\t\t\tif ShestakUISettingsPerChar.RightBars > 2 then\n\t\t\t\t\tShestakUISettingsPerChar.RightBars = 1\n\t\t\t\telseif ShestakUISettingsPerChar.RightBars < 0 then\n\t\t\t\t\tShestakUISettingsPerChar.RightBars = 2\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tRightBars()\n\t\tend)\n\t\tToggleBar[i]:SetScript(\"OnEvent\", RightBars)\n\telseif i == 3 then\n\t\tif C.actionbar.split_bars == true then\n\t\t\tToggleBar[i]:CreatePanel(\"Transparent\", C.actionbar.button_size / 1.5, ActionBarAnchor:GetHeight(), \"BOTTOMLEFT\", SplitBarRight, \"BOTTOMRIGHT\", C.actionbar.button_space, 0)\n\t\t\tToggleBarText(i, \"<\\n<\", false, true)\n\t\t\tToggleBar[i]:SetFrameLevel(SplitBarRight:GetFrameLevel() + 1)\n\t\tend\n\telseif i == 4 then\n\t\tif C.actionbar.split_bars == true then\n\t\t\tToggleBar[i]:CreatePanel(\"Transparent\", C.actionbar.button_size / 1.5, ActionBarAnchor:GetHeight(), \"BOTTOMRIGHT\", SplitBarLeft, \"BOTTOMLEFT\", -C.actionbar.button_space, 0)\n\t\t\tToggleBarText(i, \">\\n>\", false, true)\n\t\t\tToggleBar[i]:SetFrameLevel(SplitBarLeft:GetFrameLevel() + 1)\n\t\tend\n\telseif i == 5 then\n\t\tToggleBar[i]:CreatePanel(\"Transparent\", 19, 19, \"TOPLEFT\", Minimap, \"TOPRIGHT\", 3, 2)\n\t\tToggleBar[i]:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\tToggleBar[i].Text:SetPoint(\"CENTER\", 1, 0)\n\n\t\tToggleBar[i]:SetScript(\"OnMouseDown\", function()\n\t\t\tif InCombatLockdown() then return end\n\n\t\t\tif ShestakUISettingsPerChar.BarsLocked == true then\n\t\t\t\tShestakUISettingsPerChar.BarsLocked = false\n\t\t\telseif ShestakUISettingsPerChar.BarsLocked == false then\n\t\t\t\tShestakUISettingsPerChar.BarsLocked = true\n\t\t\tend\n\n\t\t\tLockCheck(i)\n\t\t\tToggleBar[i]:GetScript(\"OnEnter\")(ToggleBar[i])\n\t\tend)\n\t\tToggleBar[i]:SetScript(\"OnEvent\", function() LockCheck(i) end)\n\tend\n\n\tif i == 3 or i == 4 then\n\t\tToggleBar[i]:SetScript(\"OnMouseDown\", function()\n\t\t\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\n\t\t\tif ShestakUISettingsPerChar.SplitBars == false then\n\t\t\t\tShestakUISettingsPerChar.SplitBars = true\n\t\t\telseif ShestakUISettingsPerChar.SplitBars == true then\n\t\t\t\tShestakUISettingsPerChar.SplitBars = false\n\t\t\tend\n\t\t\tSplitBars()\n\t\tend)\n\t\tToggleBar[i]:SetScript(\"OnEvent\", SplitBars)\n\tend\n\n\tToggleBar[i]:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tToggleBar[i]:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\n\tToggleBar[i]:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\n\tToggleBar[i]:SetScript(\"OnEnter\", function()\n\t\tif InCombatLockdown() then return end\n\t\tif i == 2 then\n\t\t\tif C.actionbar.rightbars_mouseover == true then\n\t\t\t\tToggleBar[i]:SetAlpha(1)\n\t\t\t\tRightBarMouseOver(1)\n\t\t\telse\n\t\t\t\tToggleBar[i]:FadeIn()\n\t\t\tend\n\t\telseif i == 3 or i == 4 then\n\t\t\tif C.actionbar.bottombars_mouseover then\n\t\t\t\tToggleBar[i]:SetAlpha(1)\n\t\t\t\tBottomBarMouseOver(1)\n\t\t\telse\n\t\t\t\tToggleBar[3]:FadeIn()\n\t\t\t\tToggleBar[4]:FadeIn()\n\t\t\tend\n\t\t\tVehicleButtonAnchor:ClearAllPoints()\n\t\t\tVehicleButtonAnchor:SetPoint(\"BOTTOMRIGHT\", ToggleBar[4], \"BOTTOMLEFT\", -C.actionbar.button_space, 0)\n\t\telse\n\t\t\tif i == 1 and C.actionbar.bottombars_mouseover then\n\t\t\t\tBottomBarMouseOver(1)\n\t\t\t\tToggleBar[i]:SetAlpha(1)\n\t\t\t\treturn\n\t\t\tend\n\t\t\tToggleBar[i]:FadeIn()\n\t\tend\n\t\tif i == 5 then\n\t\t\tGameTooltip:SetOwner(ToggleBar[i], \"ANCHOR_LEFT\")\n\t\t\tGameTooltip:AddLine(L_MINIMAP_TOGGLE, 0.40, 0.78, 1)\n\t\t\tGameTooltip:AddDoubleLine(\" \", TALENT_TREE_LOCKED..\": \"..(ShestakUISettingsPerChar.BarsLocked and \"|cff55ff55\"..L_STATS_ON or \"|cffff5555\"..strupper(OFF)), 1, 1, 1, 0.75, 0.90, 1)\n\t\t\tGameTooltip:Show()\n\t\tend\n\tend)\n\n\tToggleBar[i]:SetScript(\"OnLeave\", function()\n\t\tif i == 2 then\n\t\t\tif C.actionbar.rightbars_mouseover == true then\n\t\t\t\tToggleBar[i]:SetAlpha(0)\n\t\t\t\tRightBarMouseOver(0)\n\t\t\telse\n\t\t\t\tToggleBar[i]:FadeOut()\n\t\t\tend\n\t\telseif i == 3 or i == 4 then\n\t\t\tif InCombatLockdown() then return end\n\t\t\tif C.actionbar.bottombars_mouseover then\n\t\t\t\tToggleBar[i]:SetAlpha(0)\n\t\t\t\tBottomBarMouseOver(0)\n\t\t\telse\n\t\t\t\tToggleBar[3]:FadeOut()\n\t\t\t\tToggleBar[4]:FadeOut()\n\t\t\tend\n\t\t\tVehicleButtonAnchor:ClearAllPoints()\n\t\t\tif ShestakUISettingsPerChar.SplitBars == true then\n\t\t\t\tVehicleButtonAnchor:SetPoint(\"BOTTOMRIGHT\", SplitBarLeft, \"BOTTOMLEFT\", -C.actionbar.button_space, 0)\n\t\t\telse\n\t\t\t\tVehicleButtonAnchor:SetPoint(\"BOTTOMRIGHT\", ActionBarAnchor, \"BOTTOMLEFT\", -C.actionbar.button_space, 0)\n\t\t\tend\n\t\telse\n\t\t\tif i == 1 and C.actionbar.bottombars_mouseover then\n\t\t\t\tBottomBarMouseOver(0)\n\t\t\t\tToggleBar[i]:SetAlpha(0)\n\t\t\t\treturn\n\t\t\tend\n\t\t\tToggleBar[i]:FadeOut()\n\t\tend\n\t\tif i == 5 then\n\t\t\tGameTooltip:Hide()\n\t\tend\n\tend)\n\n\tToggleBar[i]:SetScript(\"OnUpdate\", function()\n\t\tif InCombatLockdown() then return end\n\t\tif ShestakUISettingsPerChar.BarsLocked == true then\n\t\t\tfor i = 1, 4 do\n\t\t\t\tToggleBar[i]:EnableMouse(false)\n\t\t\tend\n\t\telseif ShestakUISettingsPerChar.BarsLocked == false then\n\t\t\tfor i = 1, 4 do\n\t\t\t\tToggleBar[i]:EnableMouse(true)\n\t\t\tend\n\t\tend\n\tend)\nend"
  },
  {
    "path": "ShestakUI/Modules/ActionBars/VehicleExit.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tVehicle exit button(by Tukz)\n----------------------------------------------------------------------------------------\nlocal anchor = CreateFrame(\"Frame\", \"VehicleButtonAnchor\", UIParent)\nif C.actionbar.split_bars then\n\tanchor:SetPoint(C.position.vehicle_bar[1], SplitBarLeft, C.position.vehicle_bar[3], C.position.vehicle_bar[4], C.position.vehicle_bar[5])\nelse\n\tanchor:SetPoint(unpack(C.position.vehicle_bar))\nend\nanchor:SetSize(C.actionbar.button_size, C.actionbar.button_size)\n\nlocal vehicle = CreateFrame(\"Button\", \"VehicleButton\", UIParent)\nvehicle:SetSize(C.actionbar.button_size, C.actionbar.button_size)\nvehicle:SetPoint(\"BOTTOMLEFT\", anchor, \"BOTTOMLEFT\")\nvehicle:SetNormalTexture(\"Interface\\\\Vehicles\\\\UI-Vehicles-Button-Exit-Up\")\nvehicle:GetNormalTexture():SetTexCoord(0.2, 0.8, 0.2, 0.8)\nvehicle:GetNormalTexture():ClearAllPoints()\nvehicle:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\nvehicle:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\nvehicle:SetTemplate(\"Default\")\nvehicle:StyleButton(true)\nvehicle:RegisterForClicks(\"AnyUp\")\nvehicle:SetFrameLevel(6)\nvehicle:SetFrameStrata(\"HIGH\")\nvehicle:Hide()\n\nhooksecurefunc(MainMenuBarVehicleLeaveButton, \"Update\", function()\n\tif CanExitVehicle() then\n\t\tif UnitOnTaxi(\"player\") then\n\t\t\tvehicle:SetScript(\"OnClick\", function(self)\n\t\t\t\tTaxiRequestEarlyLanding()\n\t\t\t\tself:LockHighlight()\n\t\t\tend)\n\t\telse\n\t\t\tvehicle:SetScript(\"OnClick\", function()\n\t\t\t\tVehicleExit()\n\t\t\tend)\n\t\tend\n\t\tvehicle:Show()\n\telse\n\t\tvehicle:UnlockHighlight()\n\t\tvehicle:Hide()\n\tend\nend)\n\nhooksecurefunc(PossessActionBar, \"UpdateState\", function()\n\tfor i = 1, NUM_POSSESS_SLOTS do\n\t\tlocal _, _, enabled = GetPossessInfo(i)\n\t\tif enabled then\n\t\t\tvehicle:SetScript(\"OnClick\", function()\n\t\t\t\tCancelPetPossess()\n\t\t\tend)\n\t\t\tvehicle:Show()\n\t\telse\n\t\t\tvehicle:Hide()\n\t\tend\n\tend\nend)\n\n-- Set tooltip\nvehicle:SetScript(\"OnEnter\", function(self)\n\tif UnitOnTaxi(\"player\") then\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_RIGHT\")\n\t\tGameTooltip:SetText(TAXI_CANCEL, 1, 1, 1)\n\t\tGameTooltip:AddLine(TAXI_CANCEL_DESCRIPTION, 1, 0.8, 0, true)\n\t\tGameTooltip:Show()\n\telseif IsPossessBarVisible() then\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_RIGHT\")\n\t\tGameTooltip_SetTitle(GameTooltip, CANCEL)\n\telse\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_RIGHT\")\n\t\tGameTooltip_SetTitle(GameTooltip, LEAVE_VEHICLE)\n\tend\nend)\nvehicle:SetScript(\"OnLeave\", function() GameTooltip:Hide() end)"
  },
  {
    "path": "ShestakUI/Modules/Announcements/BadGear.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.announcements.bad_gear ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCheck bad gear in instance\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ZONE_CHANGED_NEW_AREA\")\nframe:SetScript(\"OnEvent\", function(_, event)\n\tif event ~= \"ZONE_CHANGED_NEW_AREA\" or not IsInInstance() then return end\n\tfor i = 1, 17 do\n\t\tif T.AnnounceBadGear[i] then\n\t\t\tlocal id = GetInventoryItemID(\"player\", i) or 0\n\t\t\tif T.AnnounceBadGear[i][id] then\n\t\t\t\tlocal _, itemLink = GetItemInfo(id)\n\t\t\t\tPlaySound(SOUNDKIT.RAID_WARNING, \"Master\")\n\t\t\t\tRaidNotice_AddMessage(RaidWarningFrame, format(\"%s %s\", CURRENTLY_EQUIPPED, itemLink..\"!\"), ChatTypeInfo[\"RAID_WARNING\"])\n\t\t\t\tprint(format(\"|cffff3300%s %s\", CURRENTLY_EQUIPPED, itemLink..\"|cffff3300!|r\"))\n\t\t\tend\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Announcements/Drinking.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.announcements.drinking ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAnnounce enemy drinking in arena(by Duffed)\n----------------------------------------------------------------------------------------\nlocal drinkSpell = {\n\t[GetSpellInfo(118358)] = true,\t-- Drink\n\t[GetSpellInfo(167152)] = true,\t-- Refreshment\n\t[GetSpellInfo(167268)] = true,\t-- Ba'ruun's Bountiful Bloom\n}\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"UNIT_SPELLCAST_SUCCEEDED\")\nframe:SetScript(\"OnEvent\", function(_, event, ...)\n\tif not (event == \"UNIT_SPELLCAST_SUCCEEDED\" and GetZonePVPInfo() == \"arena\") then return end\n\n\tlocal unit, _, spellID = ...\n\tif UnitIsEnemy(\"player\", unit) and drinkSpell[GetSpellInfo(spellID)] then\n\t\tSendChatMessage(UnitClass(unit)..\" \"..UnitName(unit)..L_MISC_DRINKING, T.CheckChat(true))\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Announcements/FeastsAndPortals.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.announcements.feasts ~= true and C.announcements.portals ~= true and C.announcements.toys ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAnnounce Feasts/Souls/Repair Bots/Portals/Ritual of Summoning\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsInGroup() or InCombatLockdown() then return end\n\tlocal _, subEvent, _, _, srcName, _, _, _, destName, _, _, spellID = CombatLogGetCurrentEventInfo()\n\tif not subEvent or not spellID or not srcName then return end\n\tif not UnitInRaid(srcName) and not UnitInParty(srcName) then return end\n\n\tlocal srcName = srcName:gsub(\"%-[^|]+\", \"\")\n\tif subEvent == \"SPELL_CAST_SUCCESS\" then\n\t\t-- Feasts and Cauldron\n\t\tif C.announcements.feasts and T.AnnounceFeast[spellID] then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_PRE, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\t-- Refreshment Table\n\t\telseif C.announcements.feasts and spellID == 43987 then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_PRE, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\t-- Ritual of Summoning\n\t\telseif C.announcements.portals and spellID == 698 then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_CLICK, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\t-- Piccolo of the Flaming Fire\n\t\telseif C.announcements.toys and spellID == 182346 then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_USE, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\tend\n\telseif subEvent == \"SPELL_SUMMON\" then\n\t\t-- Repair Bots and Codex\n\t\tif C.announcements.feasts and T.AnnounceBots[spellID] then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_PUT, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\tend\n\telseif subEvent == \"SPELL_CREATE\" then\n\t\t-- Healthstone and MOLL-E\n\t\tif C.announcements.feasts and (spellID == 29893 or spellID == 54710) then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_PUT, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\t-- Toys\n\t\telseif C.announcements.toys and T.AnnounceToys[spellID] then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_PUT, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\t-- Portals\n\t\telseif C.announcements.portals and T.AnnouncePortals[spellID] then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_CAST, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\tend\n\telseif subEvent == \"SPELL_AURA_APPLIED\" then\n\t\t-- Turkey Feathers and Party G.R.E.N.A.D.E.\n\t\tif C.announcements.toys and (spellID == 61781 or ((spellID == 51508 or spellID == 51510) and destName == T.name)) then\n\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_USE, srcName, GetSpellLink(spellID)), T.CheckChat(true))\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Announcements/FlaskAndFood.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.announcements.flask_food ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tChecks the usage of flasks and food of your party/raid members(ffCheck by Silverwind)\n----------------------------------------------------------------------------------------\nlocal noFood, noFlask, unitBuffs = {}, {}, {}\nlocal foods = T.ReminderBuffs[\"Food\"]\nlocal flasks = T.ReminderBuffs[\"Flask\"]\n\nlocal function scan(unit)\n\ttable.wipe(unitBuffs)\n\tlocal i = 1\n\twhile true do\n\t\tlocal name = UnitAura(unit, i, \"HELPFUL\")\n\t\tif not name then return end\n\t\tunitBuffs[name] = true\n\t\ti = i + 1\n\tend\nend\n\nlocal function checkFood()\n\tfor i = 1, #foods do\n\t\tlocal name = unpack(foods[i])\n\t\tif unitBuffs[name] then\n\t\t\treturn true\n\t\tend\n\tend\nend\n\nlocal function checkFlask()\n\tfor i = 1, #flasks do\n\t\tlocal name = unpack(flasks[i])\n\t\tif unitBuffs[name] then\n\t\t\treturn true\n\t\tend\n\tend\nend\n\nlocal function checkUnit(unit)\n\tlocal name = UnitName(unit)\n\tscan(unit)\n\tif not checkFood() then\n\t\tnoFood[#noFood + 1] = name\n\tend\n\tif not checkFlask() then\n\t\tnoFlask[#noFlask + 1] = name\n\tend\nend\n\nlocal function print(text)\n\t_G.print(\"|cffffff00\"..text..\"|r\")\nend\n\n-- The Main function to run a check\nlocal function run()\n\tlocal checkType\n\tlocal output\n\n\ttable.wipe(noFood)\n\ttable.wipe(noFlask)\n\n\tif UnitInRaid(\"player\") then\n\t\tcheckType = \"raid\"\n\telse\n\t\tcheckType = \"party\"\n\t\tcheckUnit(\"player\")\n\tend\n\n\tfor i = 1, GetNumGroupMembers() do\n\t\tif checkType == \"raid\" then\n\t\t\tlocal online = select(8, GetRaidRosterInfo(i))\n\t\t\tif online then\n\t\t\t\tlocal unit = checkType..i\n\t\t\t\tcheckUnit(unit)\n\t\t\tend\n\t\telse\n\t\t\tlocal unit = checkType..i\n\t\t\tif UnitIsConnected(unit) then\n\t\t\t\tcheckUnit(unit)\n\t\t\tend\n\t\tend\n\tend\n\n\tif #noFlask > 0 then\n\t\ttable.sort(noFlask)\n\t\toutput = L_ANNOUNCE_FF_NOFLASK..table.concat(noFlask, \", \")\n\t\tif C.announcements.flask_food_raid then\n\t\t\tSendChatMessage(output, T.CheckChat())\n\t\telse\n\t\t\tprint(output)\n\t\tend\n\tend\n\n\tif #noFood > 0 then\n\t\ttable.sort(noFood)\n\t\toutput = L_ANNOUNCE_FF_NOFOOD..table.concat(noFood, \", \")\n\t\tif C.announcements.flask_food_raid then\n\t\t\tSendChatMessage(output, T.CheckChat())\n\t\telse\n\t\t\tprint(output)\n\t\tend\n\tend\n\n\tif #noFood == 0 and #noFlask == 0 then\n\t\tif C.announcements.flask_food_raid then\n\t\t\tSendChatMessage(L_ANNOUNCE_FF_ALLBUFFED, T.CheckChat())\n\t\telse\n\t\t\tprint(L_ANNOUNCE_FF_ALLBUFFED)\n\t\tend\n\tend\nend\n\n-- Event Handler\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"READY_CHECK\")\nframe:SetScript(\"OnEvent\", function()\n\tif C.announcements.flask_food_auto then\n\t\trun()\n\tend\nend)\n\n-- Slash command\nSlashCmdList.FFCHECK = run\nSLASH_FFCHECK1 = \"/ffcheck\"\nSLASH_FFCHECK2 = \"/аасрусл\"\n\n-- Check button\nif C.misc.raid_tools == true then\n\tRaidUtilityPanel:SetHeight(168)\n\n\tlocal button = CreateFrame(\"Button\", \"FoodFlaskCheckButton\", RaidUtilityPanel, \"UIPanelButtonTemplate\")\n\tbutton:SetWidth(RaidUtilityRoleButton:GetWidth())\n\tbutton:SetHeight(18)\n\tbutton:SetPoint(\"TOP\", RaidUtilityRaidControlButton, \"BOTTOM\", 0, -5)\n\tif IsAddOnLoaded(\"Aurora\") then\n\t\tlocal F = unpack(Aurora)\n\t\tF.Reskin(button)\n\telse\n\t\tbutton:SkinButton()\n\tend\n\tbutton:EnableMouse(true)\n\tbutton:SetScript(\"OnMouseUp\", function() run() end)\n\n\tlocal t = button:CreateFontString(nil, \"OVERLAY\")\n\tt:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tt:SetPoint(\"CENTER\")\n\tt:SetJustifyH(\"CENTER\")\n\tt:SetText(L_ANNOUNCE_FF_CHECK_BUTTON)\nend"
  },
  {
    "path": "ShestakUI/Modules/Announcements/Interrupts.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.announcements.interrupts ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAnnounce your interrupts(by Elv22)\n----------------------------------------------------------------------------------------\nlocal RaidIconMaskToIndex = {\n\t[COMBATLOG_OBJECT_RAIDTARGET1] = 1,\n\t[COMBATLOG_OBJECT_RAIDTARGET2] = 2,\n\t[COMBATLOG_OBJECT_RAIDTARGET3] = 3,\n\t[COMBATLOG_OBJECT_RAIDTARGET4] = 4,\n\t[COMBATLOG_OBJECT_RAIDTARGET5] = 5,\n\t[COMBATLOG_OBJECT_RAIDTARGET6] = 6,\n\t[COMBATLOG_OBJECT_RAIDTARGET7] = 7,\n\t[COMBATLOG_OBJECT_RAIDTARGET8] = 8,\n}\n\nlocal function GetRaidIcon(unitFlags)\n\tlocal raidTarget = bit.band(unitFlags, COMBATLOG_OBJECT_RAIDTARGET_MASK)\n\tif raidTarget == 0 then\n\t\treturn \"\"\n\tend\n\n\treturn \"{rt\"..RaidIconMaskToIndex[raidTarget]..\"}\"\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsInGroup() then return end\n\tlocal _, event, _, sourceGUID, _, _, _, _, destName, _, destRaidFlags, _, _, _, spellID = CombatLogGetCurrentEventInfo()\n\tif not (event == \"SPELL_INTERRUPT\" and sourceGUID == UnitGUID(\"player\")) then return end\n\n\tlocal destIcon = \"\"\n\tif destName then\n\t\tdestIcon = GetRaidIcon(destRaidFlags)\n\tend\n\n\tSendChatMessage(L_ANNOUNCE_INTERRUPTED..\" \"..destIcon..destName..\": \"..GetSpellLink(spellID), T.CheckChat())\nend)"
  },
  {
    "path": "ShestakUI/Modules/Announcements/PullCountdown.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.announcements.pull_countdown ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPull Countdown(by Dridzt)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\", \"PullCountdown\")\nlocal timerframe = CreateFrame(\"Frame\")\nlocal firstdone, delay, target\nlocal interval = 1.5\nlocal lastupdate = 0\n\nlocal function reset()\n\ttimerframe:SetScript(\"OnUpdate\", nil)\n\tfirstdone, delay, target = nil, nil, nil\n\tlastupdate = 0\nend\n\nlocal function pull(_, elapsed)\n\tlocal tname = UnitName(\"target\")\n\tif tname then\n\t\ttarget = tname\n\telse\n\t\ttarget = \"\"\n\tend\n\tif not firstdone then\n\t\tSendChatMessage(string.format(L_ANNOUNCE_PC_MSG, target, tostring(delay)), T.CheckChat(true))\n\t\tfirstdone = true\n\t\tdelay = delay - 1\n\tend\n\tlastupdate = lastupdate + elapsed\n\tif lastupdate >= interval then\n\t\tlastupdate = 0\n\t\tif delay > 0 then\n\t\t\tSendChatMessage(tostring(delay)..\"..\", T.CheckChat(true))\n\t\t\tdelay = delay - 1\n\t\telse\n\t\t\tSendChatMessage(L_ANNOUNCE_PC_GO, T.CheckChat(true))\n\t\t\treset()\n\t\tend\n\tend\nend\n\nfunction frame.Pull(timer)\n\tdelay = timer or 3\n\tif timerframe:GetScript(\"OnUpdate\") then\n\t\treset()\n\t\tSendChatMessage(L_ANNOUNCE_PC_ABORTED, T.CheckChat(true))\n\telse\n\t\ttimerframe:SetScript(\"OnUpdate\", pull)\n\tend\nend\n\nSlashCmdList.PULLCOUNTDOWN = function(msg)\n\tif not IsInGroup() then return end\n\tif tonumber(msg) ~= nil then\n\t\tframe.Pull(msg)\n\telse\n\t\tframe.Pull()\n\tend\nend\nSLASH_PULLCOUNTDOWN1 = \"/pc\"\nSLASH_PULLCOUNTDOWN2 = \"/зс\""
  },
  {
    "path": "ShestakUI/Modules/Announcements/SafariHat.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\r\nif C.announcements.safari_hat ~= true then return end\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tCheck Safari Hat\r\n----------------------------------------------------------------------------------------\r\nlocal frame = CreateFrame(\"Frame\")\r\nframe:RegisterEvent(\"ADDON_LOADED\")\r\nframe:SetScript(\"OnEvent\", function(_, _, addon)\r\n\tif addon == \"Blizzard_Collections\" then\r\n\t\tif not PlayerHasToy(92738) then return end\r\n\t\tlocal button = CreateFrame(\"Button\", \"PetJournalSafariButton\", PetJournal, \"SecureActionButtonTemplate, ActionButtonTemplate\")\r\n\t\tbutton:RegisterForClicks(\"LeftButtonUp\", \"LeftButtonDown\")\r\n\t\tbutton:SetSize(36, 36)\r\n\t\tbutton:SetAttribute(\"type\", \"toy\")\r\n\t\tbutton:SetAttribute(\"toy\", 92738)\r\n\t\tif C.skins.blizzard_frames == true then\r\n\t\t\tbutton:SetPoint(\"TOPLEFT\", PetJournal, \"TOPRIGHT\", 1, 0)\r\n\t\t\tbutton:SetTemplate(\"Default\")\r\n\t\t\tbutton:StyleButton()\r\n\t\t\tbutton:SetNormalTexture(0)\r\n\t\t\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\tbutton.icon:ClearAllPoints()\r\n\t\t\tbutton.icon:SetPoint(\"TOPLEFT\", 2, -2)\r\n\t\t\tbutton.icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\r\n\t\t\tbutton.icon:SetDrawLayer(\"OVERLAY\")\r\n\t\telse\r\n\t\t\tbutton:SetPoint(\"TOPLEFT\", PetJournal, \"TOPRIGHT\", 3, -24)\r\n\t\tend\r\n\r\n\t\tbutton.icon:SetTexture(774766)\r\n\r\n\t\tbutton:SetScript(\"OnEnter\", function(self)\r\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_BOTTOMRIGHT\")\r\n\t\t\tGameTooltip:SetToyByItemID(92738)\r\n\t\tend)\r\n\r\n\t\tbutton:SetScript(\"OnLeave\", function()\r\n\t\t\tGameTooltip:Hide()\r\n\t\tend)\r\n\tend\r\nend)\r\n\r\nlocal announceFrame = CreateFrame(\"Frame\")\r\nannounceFrame:RegisterEvent(\"PET_BATTLE_OPENING_DONE\")\r\nannounceFrame:RegisterEvent(\"PET_BATTLE_OVER\")\r\nannounceFrame:SetScript(\"OnEvent\", function(_, event)\r\n\tif event == \"PET_BATTLE_OPENING_DONE\" then\r\n\t\tlocal name = GetSpellInfo(158486)\r\n\t\tif PlayerHasToy(92738) and not T.CheckPlayerBuff(name) then\r\n\t\t\tlocal maxlevel = true\r\n\t\t\tfor i = 1, 3 do\r\n\t\t\t\tlocal level = C_PetBattles.GetLevel(1, i)\r\n\t\t\t\tif level and level < 25 then\r\n\t\t\t\t\tmaxlevel = false\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\t\tif maxlevel then return end\r\n\t\t\tPlaySound(SOUNDKIT.RAID_WARNING, \"master\")\r\n\t\t\tRaidNotice_AddMessage(RaidWarningFrame, RESISTANCE_NONE..\" \"..GetSpellLink(158486)..\"!\", ChatTypeInfo[\"RAID_WARNING\"])\r\n\t\t\tprint(\"|cffff3300\"..RESISTANCE_NONE..\" \"..GetSpellLink(158486)..\"|cffff3300!|r\")\r\n\t\tend\r\n\tend\r\nend)"
  },
  {
    "path": "ShestakUI/Modules/Announcements/Spells.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.announcements.spells ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAnnounce some spells\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\nframe:SetScript(\"OnEvent\", function()\n\tlocal _, event, _, sourceGUID, sourceName, _, _, _, destName, _, _, spellID = CombatLogGetCurrentEventInfo()\n\tlocal _, _, difficultyID = GetInstanceInfo()\n\tif difficultyID == 0 or event ~= \"SPELL_CAST_SUCCESS\" then return end\n\n\tif sourceName then sourceName = sourceName:gsub(\"%-[^|]+\", \"\") end\n\tif destName then destName = destName:gsub(\"%-[^|]+\", \"\") end\n\tif C.announcements.spells_from_all == true and not (sourceGUID == UnitGUID(\"player\") and sourceName == T.name) then\n\t\tif not sourceName then return end\n\n\t\tif T.AnnounceSpells[spellID] then\n\t\t\tif destName == nil then\n\t\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_USE, sourceName, GetSpellLink(spellID)), T.CheckChat())\n\t\t\telse\n\t\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_USE, sourceName, GetSpellLink(spellID)..\" -> \"..destName), T.CheckChat())\n\t\t\tend\n\t\tend\n\telse\n\t\tif not (sourceGUID == UnitGUID(\"player\") and sourceName == T.name) then return end\n\n\t\tif T.AnnounceSpells[spellID] then\n\t\t\tif destName == nil then\n\t\t\t\tSendChatMessage(string.format(L_ANNOUNCE_FP_USE, sourceName, GetSpellLink(spellID)), T.CheckChat())\n\t\t\telse\n\t\t\t\tSendChatMessage(GetSpellLink(spellID)..\" -> \"..destName, T.CheckChat())\n\t\t\tend\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Auras/AuraSource.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.aura.cast_by ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTells you who cast a buff or debuff in its tooltip(prButler by Renstrom)\n----------------------------------------------------------------------------------------\nlocal function addAuraSource(self, func, unit, index, filter, instanceID)\n\tlocal srcUnit\n\tif instanceID then\n\t\tlocal aura = C_UnitAuras.GetAuraDataByAuraInstanceID(unit, index)\n\t\tsrcUnit = aura and aura.sourceUnit\n\telse\n\t\tsrcUnit = select(7, func(unit, index, filter))\n\tend\n\tif srcUnit then\n\t\tlocal src = GetUnitName(srcUnit, true)\n\t\tif srcUnit == \"pet\" or srcUnit == \"vehicle\" then\n\t\t\tsrc = format(\"%s (|cff%02x%02x%02x%s|r)\", src, T.color.r * 255, T.color.g * 255, T.color.b * 255, GetUnitName(\"player\", true))\n\t\telse\n\t\t\tlocal partypet = srcUnit:match(\"^partypet(%d+)$\")\n\t\t\tlocal raidpet = srcUnit:match(\"^raidpet(%d+)$\")\n\t\t\tif partypet then\n\t\t\t\tsrc = format(\"%s (%s)\", src, GetUnitName(\"party\"..partypet, true))\n\t\t\telseif raidpet then\n\t\t\t\tsrc = format(\"%s (%s)\", src, GetUnitName(\"raid\"..raidpet, true))\n\t\t\tend\n\t\tend\n\t\tif UnitIsPlayer(srcUnit) then\n\t\t\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[select(2, UnitClass(srcUnit))]\n\t\t\tif color then\n\t\t\t\tsrc = format(\"|cff%02x%02x%02x%s|r\", color.r * 255, color.g * 255, color.b * 255, src)\n\t\t\tend\n\t\telse\n\t\t\tlocal color = T.oUF_colors.reaction[UnitReaction(srcUnit, \"player\")]\n\t\t\tif color then\n\t\t\t\tsrc = format(\"|cff%02x%02x%02x%s|r\", color[1] * 255, color[2] * 255, color[3] * 255, src)\n\t\t\tend\n\t\tend\n\t\tself:AddLine(DONE_BY..\" \"..src)\n\t\tself:Show()\n\tend\nend\n\nlocal funcs = {\n\tSetUnitAura = UnitAura,\n\tSetUnitBuff = UnitBuff,\n\tSetUnitDebuff = UnitDebuff,\n\tSetUnitBuffByAuraInstanceID = UnitBuff,\n\tSetUnitDebuffByAuraInstanceID = UnitDebuff,\n}\n\nfor k, v in pairs(funcs) do\n\tif k == \"SetUnitBuffByAuraInstanceID\" or k == \"SetUnitBuffByAuraInstanceID\" then\n\t\thooksecurefunc(GameTooltip, k, function(self, unit, index, filter)\n\t\t\taddAuraSource(self, v, unit, index, filter, true)\n\t\tend)\n\telse\n\t\thooksecurefunc(GameTooltip, k, function(self, unit, index, filter)\n\t\t\taddAuraSource(self, v, unit, index, filter)\n\t\tend)\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Auras/BuffFrame.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.aura.player_auras ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tStyle player buff(by Tukz)\n----------------------------------------------------------------------------------------\nlocal rowbuffs = 16\n\nlocal GetFormattedTime = function(s)\n\tif s >= 86400 then\n\t\treturn format(\"%dd\", floor(s / 86400 + 0.5))\n\telseif s >= 3600 then\n\t\treturn format(\"%dh\", floor(s / 3600 + 0.5))\n\telseif s >= 60 then\n\t\treturn format(\"%dm\", floor(s / 60 + 0.5))\n\tend\n\treturn floor(s + 0.5)\nend\n\nlocal BuffsAnchor = CreateFrame(\"Frame\", \"BuffsAnchor\", UIParent)\nBuffsAnchor:SetPoint(unpack(C.position.player_buffs))\nBuffsAnchor:SetSize((15 * C.aura.player_buff_size) + 42, (C.aura.player_buff_size * 2) + 3)\n\nlocal function UpdateDuration(aura, timeLeft)\n\tlocal duration = aura.Duration\n\tif timeLeft and C.aura.show_timer == true then\n\t\tduration:SetVertexColor(1, 1, 1)\n\t\tduration:SetFormattedText(GetFormattedTime(timeLeft))\n\telse\n\t\tduration:Hide()\n\tend\nend\n\nhooksecurefunc(BuffFrame.AuraContainer, \"UpdateGridLayout\", function(self, auras)\n\tlocal previousBuff, aboveBuff\n\tfor index, aura in ipairs(auras) do\n\t\taura:SetSize(C.aura.player_buff_size, C.aura.player_buff_size)\n\t\taura:SetTemplate(\"Default\")\n\n\t\taura.TempEnchantBorder:SetAlpha(0)\n\t\thooksecurefunc(aura.TempEnchantBorder, \"Show\", function(self)\n\t\t\taura:SetBackdropBorderColor(0.6, 0.1, 0.6)\n\t\tend)\n\n\t\thooksecurefunc(aura.TempEnchantBorder, \"Hide\", function(self)\n\t\t\tif C.aura.classcolor_border == true then\n\t\t\t\taura:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\t\telse\n\t\t\t\taura:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend\n\t\tend)\n\n\t\taura:ClearAllPoints()\n\t\tif (index > 1) and (mod(index, rowbuffs) == 1) then\n\t\t\taura:SetPoint(\"TOP\", aboveBuff, \"BOTTOM\", 0, -3)\n\t\t\taboveBuff = aura\n\t\telseif index == 1 then\n\t\t\taura:SetPoint(\"TOPRIGHT\", BuffsAnchor, \"TOPRIGHT\", 0, 0)\n\t\t\taboveBuff = aura\n\t\telse\n\t\t\taura:SetPoint(\"RIGHT\", previousBuff, \"LEFT\", -3, 0)\n\t\tend\n\n\t\tpreviousBuff = aura\n\n\t\taura.Icon:CropIcon()\n\t\taura.Icon:SetDrawLayer(\"BORDER\")\n\n\t\tlocal duration = aura.Duration\n\t\tduration:ClearAllPoints()\n\t\tduration:SetPoint(\"CENTER\", 2, 1)\n\t\tduration:SetDrawLayer(\"ARTWORK\")\n\t\tduration:SetFont(C.font.auras_font, C.font.auras_font_size, C.font.auras_font_style)\n\t\tduration:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)\n\n\t\tif not aura.hook then\n\t\t\thooksecurefunc(aura, \"UpdateDuration\", function(aura, timeLeft)\n\t\t\t\tUpdateDuration(aura, timeLeft)\n\t\t\tend)\n\t\t\taura.hook = true\n\t\tend\n\n\t\tif aura.Count then -- need to check exist to prevent error in EditMode\n\t\t\taura.Count:ClearAllPoints()\n\t\t\taura.Count:SetPoint(\"BOTTOMRIGHT\", 2, 0)\n\t\t\taura.Count:SetDrawLayer(\"ARTWORK\")\n\t\t\taura.Count:SetFont(C.font.auras_font, C.font.auras_font_size, C.font.auras_font_style)\n\t\t\taura.Count:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)\n\t\tend\n\tend\nend)\n\n-- Hide collapse button\nBuffFrame.CollapseAndExpandButton:Kill()\n\n-- Hide debuffs\nDebuffFrame.AuraContainer:Hide()"
  },
  {
    "path": "ShestakUI/Modules/Auras/Filger.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.filger.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tLightweight buff/debuff tracking (Filger by Nils Ruesch, editors Affli/SinaC/Ildyria)\n----------------------------------------------------------------------------------------\nP_BUFF_ICON_Anchor:SetPoint(unpack(C.position.filger.player_buff_icon))\nP_BUFF_ICON_Anchor:SetSize(C.filger.buffs_size, C.filger.buffs_size)\n\nP_PROC_ICON_Anchor:SetPoint(unpack(C.position.filger.player_proc_icon))\nP_PROC_ICON_Anchor:SetSize(C.filger.buffs_size, C.filger.buffs_size)\n\nSPECIAL_P_BUFF_ICON_Anchor:SetPoint(unpack(C.position.filger.special_proc_icon))\nSPECIAL_P_BUFF_ICON_Anchor:SetSize(C.filger.buffs_size, C.filger.buffs_size)\n\nT_DEBUFF_ICON_Anchor:SetPoint(unpack(C.position.filger.target_debuff_icon))\nT_DEBUFF_ICON_Anchor:SetSize(C.filger.buffs_size, C.filger.buffs_size)\n\nT_BUFF_Anchor:SetPoint(unpack(C.position.filger.target_buff_icon))\nT_BUFF_Anchor:SetSize(C.filger.pvp_size, C.filger.pvp_size)\n\nPVE_PVP_DEBUFF_Anchor:SetPoint(unpack(C.position.filger.pve_debuff))\nPVE_PVP_DEBUFF_Anchor:SetSize(C.filger.pvp_size, C.filger.pvp_size)\n\nPVE_PVP_CC_Anchor:SetPoint(unpack(C.position.filger.pve_cc))\nPVE_PVP_CC_Anchor:SetSize(221, 25)\n\nCOOLDOWN_Anchor:SetPoint(C.position.filger.cooldown[1], C.position.filger.cooldown[2], C.position.filger.cooldown[3], C.position.filger.cooldown[4], C.unitframe.plugins_swing and C.position.filger.cooldown[5] + 12 or C.position.filger.cooldown[5])\nCOOLDOWN_Anchor:SetSize(C.filger.cooldown_size, C.filger.cooldown_size)\n\nT_DE_BUFF_BAR_Anchor:SetPoint(C.position.filger.target_bar[1], C.unitframe.portrait_enable and \"oUF_Target_Portrait\" or C.position.filger.target_bar[2], C.position.filger.target_bar[3], C.unitframe.portrait_enable and C.position.filger.target_bar[4] - 3 or C.position.filger.target_bar[4], C.unitframe.portrait_enable and C.position.filger.target_bar[5] + 38 or C.position.filger.target_bar[5])\nT_DE_BUFF_BAR_Anchor:SetSize(218, 25)\n\nSpellActivationOverlayFrame:SetFrameStrata(\"BACKGROUND\")\n\nlocal Filger = {}\nlocal MyUnits = {player = true, vehicle = true, pet = true}\nlocal SpellGroups = {}\n\nfunction Filger:TooltipOnEnter()\n\tif self.spellID > 20 then\n\t\tlocal str = \"spell:%s\"\n\t\tGameTooltip:ClearLines()\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_TOPRIGHT\", 0, 3)\n\t\tGameTooltip:SetHyperlink(format(str, self.spellID))\n\t\tGameTooltip:Show()\n\tend\nend\n\nfunction Filger:TooltipOnLeave()\n\tGameTooltip:Hide()\nend\n\nfunction Filger:UpdateCD()\n\tlocal time = self.value.start + self.value.duration - GetTime()\n\n\tif self:GetParent().Mode == \"BAR\" then\n\t\tself.statusbar:SetValue(time)\n\t\tif time <= 60 then\n\t\t\tself.time:SetFormattedText(\"%.1f\", time)\n\t\telse\n\t\t\tself.time:SetFormattedText(\"%d:%.2d\", time / 60, time % 60)\n\t\tend\n\telse\n\t\tif time < 0 then\n\t\t\tlocal frame = self:GetParent()\n\t\t\tframe.actives[self.value.spid] = nil\n\t\t\tself:SetScript(\"OnUpdate\", nil)\n\t\t\tFilger.DisplayActives(frame)\n\t\tend\n\tend\nend\n\nfunction Filger:DisplayActives()\n\tif not self.actives then return end\n\tif not self.bars then self.bars = {} end\n\tlocal id = self.Id\n\tlocal index = 1\n\tlocal previous = nil\n\tlocal temp = {}\n\n\tfor _, value in pairs(self.actives) do\n\t\tlocal bar = self.bars[index]\n\t\tif not bar then\n\t\t\tbar = CreateFrame(\"Frame\", \"FilgerAnchor\"..id..\"Frame\"..index, self)\n\t\t\tbar:SetScale(1)\n\t\t\tbar:SetTemplate(\"Default\")\n\n\t\t\tif index == 1 then\n\t\t\t\tbar:SetPoint(unpack(self.Position))\n\t\t\telse\n\t\t\t\tif self.Direction == \"UP\" then\n\t\t\t\t\tbar:SetPoint(\"BOTTOM\", previous, \"TOP\", 0, self.Interval)\n\t\t\t\telseif self.Direction == \"RIGHT\" then\n\t\t\t\t\tbar:SetPoint(\"LEFT\", previous, \"RIGHT\", self.Mode == \"ICON\" and self.Interval or (self.BarWidth + self.Interval + 7), 0)\n\t\t\t\telseif self.Direction == \"LEFT\" then\n\t\t\t\t\tbar:SetPoint(\"RIGHT\", previous, \"LEFT\", self.Mode == \"ICON\" and -self.Interval or -(self.BarWidth + self.Interval + 7), 0)\n\t\t\t\telse\n\t\t\t\t\tbar:SetPoint(\"TOP\", previous, \"BOTTOM\", 0, -self.Interval)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif bar.icon then\n\t\t\t\tbar.icon = _G[bar.icon:GetName()]\n\t\t\telse\n\t\t\t\tbar.icon = bar:CreateTexture(\"$parentIcon\", \"BORDER\")\n\t\t\t\tbar.icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tbar.icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tbar.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tend\n\n\t\t\tif self.Mode == \"ICON\" then\n\t\t\t\tif bar.cooldown then\n\t\t\t\t\tbar.cooldown = _G[bar.cooldown:GetName()]\n\t\t\t\telse\n\t\t\t\t\tbar.cooldown = CreateFrame(\"Cooldown\", \"$parentCD\", bar, \"CooldownFrameTemplate\")\n\t\t\t\t\tbar.cooldown:SetAllPoints(bar.icon)\n\t\t\t\t\tbar.cooldown:SetReverse(true)\n\t\t\t\t\tbar.cooldown:SetDrawEdge(false)\n\t\t\t\t\tbar.cooldown:SetFrameLevel(3)\n\t\t\t\tend\n\n\t\t\t\tif bar.count then\n\t\t\t\t\tbar.count = _G[bar.count:GetName()]\n\t\t\t\telse\n\t\t\t\t\tbar.count = bar:CreateFontString(\"$parentCount\", \"OVERLAY\")\n\t\t\t\t\tbar.count:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\t\t\t\t\tbar.count:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\n\t\t\t\t\tbar.count:SetPoint(\"BOTTOMRIGHT\", 1, -2)\n\t\t\t\t\tbar.count:SetJustifyH(\"RIGHT\")\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif bar.statusbar then\n\t\t\t\t\tbar.statusbar = _G[bar.statusbar:GetName()]\n\t\t\t\telse\n\t\t\t\t\tbar.statusbar = CreateFrame(\"StatusBar\", \"$parentStatusBar\", bar)\n\t\t\t\t\tbar.statusbar:SetWidth(self.BarWidth)\n\t\t\t\t\tbar.statusbar:SetHeight(self.IconSize - 10)\n\t\t\t\t\tbar.statusbar:SetStatusBarTexture(C.media.texture)\n\t\t\t\t\tbar.statusbar:SetStatusBarColor(T.color.r, T.color.g, T.color.b, 1)\n\t\t\t\t\tif self.IconSide == \"LEFT\" then\n\t\t\t\t\t\tbar.statusbar:SetPoint(\"BOTTOMLEFT\", bar, \"BOTTOMRIGHT\", 5, 2)\n\t\t\t\t\telseif self.IconSide == \"RIGHT\" then\n\t\t\t\t\t\tbar.statusbar:SetPoint(\"BOTTOMRIGHT\", bar, \"BOTTOMLEFT\", -5, 2)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tbar.statusbar:SetMinMaxValues(0, 1)\n\t\t\t\tbar.statusbar:SetValue(0)\n\n\t\t\t\tif bar.bg then\n\t\t\t\t\tbar.bg = _G[bar.bg:GetName()]\n\t\t\t\telse\n\t\t\t\t\tbar.bg = CreateFrame(\"Frame\", \"$parentBG\", bar.statusbar)\n\t\t\t\t\tbar.bg:SetPoint(\"TOPLEFT\", -2, 2)\n\t\t\t\t\tbar.bg:SetPoint(\"BOTTOMRIGHT\", 2, -2)\n\t\t\t\t\tbar.bg:SetFrameStrata(\"BACKGROUND\")\n\t\t\t\t\tbar.bg:SetTemplate(\"Default\")\n\t\t\t\tend\n\n\t\t\t\tif bar.background then\n\t\t\t\t\tbar.background = _G[bar.background:GetName()]\n\t\t\t\telse\n\t\t\t\t\tbar.background = bar.statusbar:CreateTexture(nil, \"BACKGROUND\")\n\t\t\t\t\tbar.background:SetAllPoints()\n\t\t\t\t\tbar.background:SetTexture(C.media.texture)\n\t\t\t\t\tbar.background:SetVertexColor(T.color.r, T.color.g, T.color.b, 0.2)\n\t\t\t\tend\n\n\t\t\t\tif bar.time then\n\t\t\t\t\tbar.time = _G[bar.time:GetName()]\n\t\t\t\telse\n\t\t\t\t\tbar.time = bar.statusbar:CreateFontString(\"$parentTime\", \"OVERLAY\")\n\t\t\t\t\tbar.time:SetFont(C.font.filger_font, C.font.filger_font_size, C.font.filger_font_style)\n\t\t\t\t\tbar.time:SetShadowOffset(C.font.filger_font_shadow and 1 or 0, C.font.filger_font_shadow and -1 or 0)\n\t\t\t\t\tbar.time:SetPoint(\"RIGHT\", bar.statusbar, 0, 0)\n\t\t\t\t\tbar.time:SetJustifyH(\"RIGHT\")\n\t\t\t\tend\n\n\t\t\t\tif bar.count then\n\t\t\t\t\tbar.count = _G[bar.count:GetName()]\n\t\t\t\telse\n\t\t\t\t\tbar.count = bar:CreateFontString(\"$parentCount\", \"OVERLAY\")\n\t\t\t\t\tbar.count:SetFont(C.font.filger_font, C.font.filger_font_size, C.font.filger_font_style)\n\t\t\t\t\tbar.count:SetShadowOffset(C.font.filger_font_shadow and 1 or 0, C.font.filger_font_shadow and -1 or 0)\n\t\t\t\t\tbar.count:SetPoint(\"BOTTOMRIGHT\", 1, 0)\n\t\t\t\t\tbar.count:SetJustifyH(\"RIGHT\")\n\t\t\t\tend\n\n\t\t\t\tif bar.spellname then\n\t\t\t\t\tbar.spellname = _G[bar.spellname:GetName()]\n\t\t\t\telse\n\t\t\t\t\tbar.spellname = bar.statusbar:CreateFontString(\"$parentSpellName\", \"OVERLAY\")\n\t\t\t\t\tbar.spellname:SetFont(C.font.filger_font, C.font.filger_font_size, C.font.filger_font_style)\n\t\t\t\t\tbar.spellname:SetShadowOffset(C.font.filger_font_shadow and 1 or 0, C.font.filger_font_shadow and -1 or 0)\n\t\t\t\t\tbar.spellname:SetPoint(\"LEFT\", bar.statusbar, 2, 0)\n\t\t\t\t\tbar.spellname:SetPoint(\"RIGHT\", bar.time, \"LEFT\")\n\t\t\t\t\tbar.spellname:SetJustifyH(\"LEFT\")\n\t\t\t\tend\n\t\t\tend\n\t\t\tbar.spellID = 0\n\t\t\tself.bars[index] = bar\n\t\tend\n\t\tprevious = bar\n\t\tindex = index + 1\n\t\ttable.insert(temp, value)\n\tend\n\n\tlocal function sortTable(a, b)\n\t\tif C.filger.expiration == true and a.data.filter == \"CD\" then\n\t\t\treturn a.start + a.duration < b.start + b.duration\n\t\telse\n\t\t\treturn a.sort < b.sort\n\t\tend\n\tend\n\ttable.sort(temp, sortTable)\n\n\tlocal limit = (C.actionbar.button_size * 12)/self.IconSize\n\n\tindex = 1\n\tfor activeIndex, value in pairs(temp) do\n\t\tif activeIndex >= limit then\n\t\t\tbreak\n\t\tend\n\t\tlocal bar = self.bars[index]\n\t\tbar.spellName = GetSpellInfo(value.spid)\n\t\tif self.Mode == \"BAR\" then\n\t\t\tbar.spellname:SetText(bar.spellName)\n\t\tend\n\t\tbar.icon:SetTexture(value.icon)\n\t\tif value.count and value.count > 1 then\n\t\t\tbar.count:SetText(value.count)\n\t\t\tbar.count:Show()\n\t\telse\n\t\t\tbar.count:Hide()\n\t\tend\n\t\tif value.duration and value.duration > 0 then\n\t\t\tif self.Mode == \"ICON\" then\n\t\t\t\tif value.start + value.duration - GetTime() > 0.3 then\n\t\t\t\t\tbar.cooldown:SetCooldown(value.start + 0.1, value.duration)\n\t\t\t\tend\n\t\t\t\tif value.data.filter == \"CD\" or value.data.filter == \"ICD\" then\n\t\t\t\t\tbar.value = value\n\t\t\t\t\tbar:SetScript(\"OnUpdate\", Filger.UpdateCD)\n\t\t\t\telse\n\t\t\t\t\tbar:SetScript(\"OnUpdate\", nil)\n\t\t\t\tend\n\t\t\t\tbar.cooldown:Show()\n\t\t\telse\n\t\t\t\tbar.statusbar:SetMinMaxValues(0, value.duration)\n\t\t\t\tbar.value = value\n\t\t\t\tbar:SetScript(\"OnUpdate\", Filger.UpdateCD)\n\t\t\tend\n\t\telse\n\t\t\tif self.Mode == \"ICON\" then\n\t\t\t\tbar.cooldown:Hide()\n\t\t\telse\n\t\t\t\tbar.statusbar:SetMinMaxValues(0, 1)\n\t\t\t\tbar.statusbar:SetValue(1)\n\t\t\t\tbar.time:SetText(\"\")\n\t\t\tend\n\t\t\tbar:SetScript(\"OnUpdate\", nil)\n\t\tend\n\t\tbar.spellID = value.spid\n\t\tif C.filger.show_tooltip then\n\t\t\tbar:EnableMouse(true)\n\t\t\tbar:SetScript(\"OnEnter\", Filger.TooltipOnEnter)\n\t\t\tbar:SetScript(\"OnLeave\", Filger.TooltipOnLeave)\n\t\tend\n\t\tbar:SetWidth(self.IconSize or C.filger.buffs_size)\n\t\tbar:SetHeight(self.IconSize or C.filger.buffs_size)\n\t\tbar:SetAlpha(value.data.opacity or 1)\n\t\tbar:Show()\n\t\tindex = index + 1\n\tend\n\n\tfor i = index, #self.bars, 1 do\n\t\tlocal bar = self.bars[i]\n\t\tbar:Hide()\n\tend\nend\n\nlocal function FindAuras(self, unit)\n\tfor spid in pairs(self.actives) do\n\t\tif self.actives[spid].data.filter ~= \"CD\" and self.actives[spid].data.filter ~= \"ICD\" and self.actives[spid].data.unitID == unit then\n\t\t\tself.actives[spid] = nil\n\t\tend\n\tend\n\n\tfor i = 1, 2 do\n\t\tlocal filter = (i == 1 and \"HELPFUL\" or \"HARMFUL\")\n\t\tlocal index = 1\n\t\twhile true do\n\t\t\tlocal name, icon, count, _, duration, expirationTime, caster, _, _, spid = UnitAura(unit, index, filter)\n\t\t\tif not name then break end\n\n\t\t\tlocal data = SpellGroups[self.Id].spells[name] or SpellGroups[self.Id].spells[spid]\n\t\t\tif data and (data.caster ~= 1 and (caster == data.caster or data.caster == \"all\") or MyUnits[caster]) and (not data.unitID or data.unitID == unit) and (not data.absID or spid == data.spellID) then\n\t\t\t\tlocal isTalent = data.talentID and select(10, GetTalentInfoByID(data.talentID))\n\t\t\t\tif ((data.filter == \"BUFF\" and filter == \"HELPFUL\") or (data.filter == \"DEBUFF\" and filter == \"HARMFUL\")) and (not data.spec or data.spec == T.Spec) and (not data.talentID or isTalent) then\n\t\t\t\t\tif not data.count or count >= data.count then\n\t\t\t\t\t\tself.actives[spid] = {data = data, name = name, icon = icon, count = count, start = expirationTime - duration, duration = duration, spid = spid, sort = data.sort}\n\t\t\t\t\tend\n\t\t\t\telseif data.filter == \"ICD\" and (data.trigger == \"BUFF\" or data.trigger == \"DEBUFF\") and (not data.spec or data.spec == T.Spec) and (not data.talentID or isTalent) then\n\t\t\t\t\tif data.slotID then\n\t\t\t\t\t\tlocal slotLink = GetInventoryItemLink(\"player\", data.slotID)\n\t\t\t\t\t\t_, _, _, _, _, _, _, _, _, icon = GetItemInfo(slotLink)\n\t\t\t\t\tend\n\t\t\t\t\tself.actives[spid] = {data = data, name = name, icon = icon, count = count, start = expirationTime - duration, duration = data.duration, spid = spid, sort = data.sort}\n\t\t\t\tend\n\t\t\tend\n\t\t\tindex = index + 1\n\t\tend\n\tend\n\tFilger.DisplayActives(self)\nend\n\nfunction Filger:OnEvent(event, unit, _, castID)\n\tif event == \"UNIT_AURA\" and (unit == \"player\" or unit == \"target\" or unit == \"pet\" or unit == \"focus\") then\n\t\tFindAuras(self, unit)\n\telseif event == \"UNIT_SPELLCAST_SUCCEEDED\" and unit == \"player\" then\n\t\tlocal name, _, icon = GetSpellInfo(castID)\n\t\tlocal data = SpellGroups[self.Id].spells[name]\n\t\tif data and data.filter == \"ICD\" and data.trigger == \"NONE\" and (not data.spec or data.spec == T.Spec) then\n\t\t\tlocal start, duration = GetTime(), data.duration\n\t\t\tif data.totem then\n\t\t\t\tlocal haveTotem, _, startTime, durationTime = GetTotemInfo(1)\n\t\t\t\tif haveTotem then\n\t\t\t\t\tstart, duration = startTime, durationTime\n\t\t\t\tend\n\t\t\tend\n\t\t\tself.actives[data.spellID] = {data = data, name = name, icon = icon, count = nil, start = start, duration = duration, spid = data.spellID, sort = data.sort}\n\t\t\tFilger.DisplayActives(self)\n\t\tend\n\telseif event == \"PLAYER_TARGET_CHANGED\" then\n\t\tFindAuras(self, \"target\")\n\telseif event == \"PLAYER_FOCUS_CHANGED\" then\n\t\tFindAuras(self, \"focus\")\n\telseif event == \"PLAYER_ENTERING_WORLD\" or event == \"SPELL_UPDATE_COOLDOWN\" then\n\t\tif event == \"PLAYER_ENTERING_WORLD\" then\n\t\t\tlocal _, instanceType = IsInInstance()\n\t\t\tif instanceType == \"raid\" or instanceType == \"pvp\" then\n\t\t\t\tif self:IsEventRegistered(\"UNIT_AURA\") then\n\t\t\t\t\tself:UnregisterEvent(\"UNIT_AURA\")\n\t\t\t\t\tself:SetScript(\"OnUpdate\", function(timer, elapsed)\n\t\t\t\t\t\ttimer.elapsed = (timer.elapsed or 0) + elapsed\n\t\t\t\t\t\tif timer.elapsed < 0.1 then return end\n\t\t\t\t\t\ttimer.elapsed = 0\n\t\t\t\t\t\tfor spid in pairs(self.actives) do\n\t\t\t\t\t\t\tif self.actives[spid].data.filter ~= \"CD\" and self.actives[spid].data.filter ~= \"ICD\" then\n\t\t\t\t\t\t\t\tself.actives[spid] = nil\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tFindAuras(self, \"player\")\n\t\t\t\t\t\tif UnitExists(\"target\") then\n\t\t\t\t\t\t\tFindAuras(self, \"target\")\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif UnitExists(\"pet\") then\n\t\t\t\t\t\t\tFindAuras(self, \"pet\")\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif UnitExists(\"focus\") then\n\t\t\t\t\t\t\tFindAuras(self, \"focus\")\n\t\t\t\t\t\tend\n\t\t\t\t\tend)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif self:GetScript(\"OnUpdate\") then\n\t\t\t\t\tself:SetScript(\"OnUpdate\", nil)\n\t\t\t\t\tself:RegisterEvent(\"UNIT_AURA\")\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tfor spid in pairs(self.actives) do\n\t\t\t\tif self.actives[spid].data.filter ~= \"CD\" and self.actives[spid].data.filter ~= \"ICD\" then\n\t\t\t\t\tself.actives[spid] = nil\n\t\t\t\tend\n\t\t\tend\n\t\t\tFindAuras(self, \"player\")\n\t\t\tif UnitExists(\"pet\") then\n\t\t\t\tFindAuras(self, \"pet\")\n\t\t\tend\n\t\telseif event == \"SPELL_UPDATE_COOLDOWN\" then\n\t\t\tfor spid in pairs(self.actives) do\n\t\t\t\tif self.actives[spid].data.filter == \"CD\" then\n\t\t\t\t\tself.actives[spid] = nil\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tfor i = 1, #C[\"filger_spells\"][T.class][self.Id], 1 do\n\t\t\tlocal data = C[\"filger_spells\"][T.class][self.Id][i]\n\n\t\t\tif data.filter == \"CD\" and (not data.spec or data.spec == T.Spec) then\n\t\t\t\tlocal name, icon, start, duration, spid\n\t\t\t\tif data.spellID then\n\t\t\t\t\tname, _, icon = GetSpellInfo(data.spellID)\n\t\t\t\t\tif name then\n\t\t\t\t\t\tif data.absID then\n\t\t\t\t\t\t\tstart, duration = GetSpellCooldown(data.spellID)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tstart, duration = GetSpellCooldown(name)\n\t\t\t\t\t\tend\n\t\t\t\t\t\tspid = data.spellID\n\t\t\t\t\tend\n\t\t\t\telseif data.slotID then\n\t\t\t\t\tspid = data.slotID\n\t\t\t\t\tlocal slotLink = GetInventoryItemLink(\"player\", data.slotID)\n\t\t\t\t\tif slotLink then\n\t\t\t\t\t\tname, _, _, _, _, _, _, _, _, icon = GetItemInfo(slotLink)\n\t\t\t\t\t\tstart, duration = GetInventoryItemCooldown(\"player\", data.slotID)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif name and (duration or 0) > 1.5 and duration < 900 then\n\t\t\t\t\tif not (T.class == \"DEATHKNIGHT\" and data.filter == \"CD\" and duration < 10) then -- Filter rune cd\n\t\t\t\t\t\tself.actives[spid] = {data = data, name = name, icon = icon, count = nil, start = start, duration = duration, spid = spid, sort = data.sort}\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tFilger.DisplayActives(self)\n\tend\nend\n\nif C[\"filger_spells\"] and C[\"filger_spells\"][\"ALL\"] then\n\tif not C[\"filger_spells\"][T.class] then\n\t\tC[\"filger_spells\"][T.class] = {}\n\tend\n\n\tfor i = 1, #C[\"filger_spells\"][\"ALL\"], 1 do\n\t\tlocal merge = false\n\t\tlocal spellListAll = C[\"filger_spells\"][\"ALL\"][i]\n\t\tlocal spellListClass = nil\n\t\tfor j = 1, #C[\"filger_spells\"][T.class], 1 do\n\t\t\tspellListClass = C[\"filger_spells\"][T.class][j]\n\t\t\tlocal mergeAll = spellListAll.Merge or false\n\t\t\tlocal mergeClass = spellListClass.Merge or false\n\t\t\tif spellListClass.Name == spellListAll.Name and (mergeAll or mergeClass) then\n\t\t\t\tmerge = true\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\t\tif not merge or not spellListClass then\n\t\t\ttable.insert(C[\"filger_spells\"][T.class], C[\"filger_spells\"][\"ALL\"][i])\n\t\telse\n\t\t\tfor j = 1, #spellListAll, 1 do\n\t\t\t\ttable.insert(spellListClass, spellListAll[j])\n\t\t\tend\n\t\tend\n\tend\nend\n\nfor _, spell in pairs(C.filger.buff_spells_list) do\n\tif spell[2] == T.class then\n\t\ttinsert(T.CustomFilgerSpell, {\"P_BUFF_ICON\", {spellID = spell[1], unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true}})\n\tend\nend\n\nfor _, spell in pairs(C.filger.proc_spells_list) do\n\tif spell[2] == T.class then\n\t\ttinsert(T.CustomFilgerSpell, {\"P_PROC_ICON\", {spellID = spell[1], unitID = \"player\", caster = \"player\", filter = \"BUFF\", absID = true}})\n\tend\nend\n\nfor _, spell in pairs(C.filger.debuff_spells_list) do\n\tif spell[2] == T.class then\n\t\ttinsert(T.CustomFilgerSpell, {\"T_DEBUFF_ICON\", {spellID = spell[1], unitID = \"target\", caster = \"player\", filter = \"DEBUFF\", absID = true}})\n\tend\nend\n\nfor _, spell in pairs(C.filger.aura_bar_spells_list) do\n\tif spell[2] == T.class then\n\t\ttinsert(T.CustomFilgerSpell, {\"T_DE/BUFF_BAR\", {spellID = spell[1], unitID = \"target\", caster = \"player\", filter = \"DEBUFF\", absID = true}})\n\tend\nend\n\nfor _, spell in pairs(C.filger.cd_spells_list) do\n\tif spell[2] == T.class then\n\t\ttinsert(T.CustomFilgerSpell, {\"COOLDOWN\", {spellID = spell[1], filter = \"CD\", absID = true}})\n\tend\nend\n\nlocal ignoreTable = {}\nfor _, spell in pairs(C.filger.ignore_spells_list) do\n\tif spell[2] == T.class then\n\t\tignoreTable[GetSpellInfo(spell[1])] = true\n\tend\nend\n\nif C[\"filger_spells\"] and C[\"filger_spells\"][T.class] then\n\tfor class in pairs(C[\"filger_spells\"]) do\n\t\tif class ~= T.class then\n\t\t\tC[\"filger_spells\"][class] = nil\n\t\tend\n\tend\n\n\tlocal idx = {}\n\tfor i = 1, #C[\"filger_spells\"][T.class], 1 do\n\t\tlocal jdx = {}\n\t\tlocal data = C[\"filger_spells\"][T.class][i]\n\t\tlocal group = {spells = {}}\n\n\t\tfor _, import in pairs(T.CustomFilgerSpell) do\n\t\t\tif data.Name == import[1] then\n\t\t\t\ttinsert(data, import[2])\n\t\t\tend\n\t\tend\n\n\t\tfor j = 1, #data, 1 do\n\t\t\tlocal name\n\t\t\tif data[j].spellID then\n\t\t\t\tname = GetSpellInfo(data[j].spellID)\n\t\t\telse\n\t\t\t\tlocal slotLink = GetInventoryItemLink(\"player\", data[j].slotID)\n\t\t\t\tif slotLink then\n\t\t\t\t\tname = GetItemInfo(slotLink)\n\t\t\t\tend\n\t\t\tend\n\t\t\tif name and not ignoreTable[name] or data[j].slotID then\n\t\t\t\tlocal id = data[j].absID and data[j].spellID or GetSpellInfo(data[j].spellID) or data[j].slotID\n\t\t\t\tdata[j].sort = j\n\t\t\t\tgroup.spells[id] = data[j]\n\t\t\tend\n\t\t\tif not name and not data[j].slotID then\n\t\t\t\tprint(\"|cffff0000WARNING: spell/slot ID [\"..(data[j].spellID or data[j].slotID or \"UNKNOWN\")..\"] no longer exists! Report this to Shestak.|r\")\n\t\t\t\ttable.insert(jdx, j)\n\t\t\tend\n\t\t\tif ignoreTable[name] then\n\t\t\t\ttable.insert(jdx, j)\n\t\t\tend\n\t\tend\n\n\t\tfor _, v in ipairs(jdx) do\n\t\t\ttable.remove(data, v)\n\t\tend\n\n\t\tgroup.data = data\n\t\ttable.insert(SpellGroups, i, group)\n\n\t\tif #data == 0 then\n\t\t\tprint(\"|cffff0000WARNING: section [\"..data.Name..\"] is empty! Report this to Shestak.|r\")\n\t\t\ttable.insert(idx, i)\n\t\tend\n\tend\n\n\tfor _, v in ipairs(idx) do\n\t\ttable.remove(C[\"filger_spells\"][T.class], v)\n\tend\n\n\tlocal isEnabled = {\n\t\t[\"P_BUFF_ICON\"] = C.filger.show_buff,\n\t\t[\"P_PROC_ICON\"] = C.filger.show_proc,\n\t\t[\"T_DEBUFF_ICON\"] = C.filger.show_debuff,\n\t\t[\"T_DE/BUFF_BAR\"] = C.filger.show_aura_bar,\n\t\t[\"PVE/PVP_CC\"] = C.filger.show_aura_bar,\n\t\t[\"SPECIAL_P_BUFF_ICON\"] = C.filger.show_special,\n\t\t[\"PVE/PVP_DEBUFF\"] = C.filger.show_pvp_player,\n\t\t[\"T_BUFF\"] = C.filger.show_pvp_target,\n\t\t[\"COOLDOWN\"] = C.filger.show_cd,\n\t}\n\n\tfor i = 1, #SpellGroups, 1 do\n\t\tlocal data = SpellGroups[i].data\n\t\tif isEnabled[data.Name] then\n\t\t\tlocal frame = CreateFrame(\"Frame\", \"FilgerFrame\"..i..\"_\"..data.Name, T_PetBattleFrameHider)\n\t\t\tframe.Id = i\n\t\t\tframe.Name = data.Name\n\t\t\tframe.Direction = data.Direction or \"DOWN\"\n\t\t\tframe.IconSide = data.IconSide or \"LEFT\"\n\t\t\tframe.Mode = data.Mode or \"ICON\"\n\t\t\tframe.Interval = data.Interval or 3\n\t\t\tframe:SetAlpha(data.Alpha or 1)\n\t\t\tframe.IconSize = data.IconSize or C.filger.buffs_size\n\t\t\tframe.BarWidth = data.BarWidth or 186\n\t\t\tframe.Position = data.Position or \"CENTER\"\n\t\t\tframe:SetPoint(unpack(data.Position))\n\t\t\tframe.actives = {}\n\n\t\t\tif C.filger.test_mode then\n\t\t\t\tframe.actives = {}\n\t\t\t\tfor j = 1, math.min(C.filger.max_test_icon, #C[\"filger_spells\"][T.class][i]), 1 do\n\t\t\t\t\tlocal data = C[\"filger_spells\"][T.class][i][j]\n\t\t\t\t\tlocal name, icon\n\t\t\t\t\tif data.spellID then\n\t\t\t\t\t\tname, _, icon = GetSpellInfo(data.spellID)\n\t\t\t\t\telseif data.slotID then\n\t\t\t\t\t\tlocal slotLink = GetInventoryItemLink(\"player\", data.slotID)\n\t\t\t\t\t\tif slotLink then\n\t\t\t\t\t\t\tname, _, _, _, _, _, _, _, _, icon = GetItemInfo(slotLink)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tframe.actives[j] = {data = data, name = name, icon = icon, count = 9, start = 0, duration = 0, spid = data.spellID or data.slotID, sort = data.sort}\n\t\t\t\tend\n\t\t\t\tFilger.DisplayActives(frame)\n\t\t\telse\n\t\t\t\tfor j = 1, #C[\"filger_spells\"][T.class][i], 1 do\n\t\t\t\t\tlocal data = C[\"filger_spells\"][T.class][i][j]\n\t\t\t\t\tif data.filter == \"BUFF\" or data.filter == \"DEBUFF\" or (data.filter == \"ICD\" and (data.trigger == \"BUFF\" or data.trigger == \"DEBUFF\")) then\n\t\t\t\t\t\tframe:RegisterEvent(\"UNIT_AURA\")\n\t\t\t\t\telseif data.filter == \"CD\" then\n\t\t\t\t\t\tframe:RegisterEvent(\"SPELL_UPDATE_COOLDOWN\")\n\t\t\t\t\telseif data.trigger == \"NONE\" then\n\t\t\t\t\t\tframe:RegisterEvent(\"UNIT_SPELLCAST_SUCCEEDED\")\n\t\t\t\t\tend\n\t\t\t\t\tif data.unitID == \"target\" then\n\t\t\t\t\t\tframe:RegisterEvent(\"PLAYER_TARGET_CHANGED\")\n\t\t\t\t\telseif data.unitID == \"focus\" then\n\t\t\t\t\t\tframe:RegisterEvent(\"PLAYER_FOCUS_CHANGED\")\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\t\t\tframe:SetScript(\"OnEvent\", Filger.OnEvent)\n\t\t\tend\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Auras/RaidBuffsReminder.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.reminder.raid_buffs_enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tRaid buffs on player(by Elv22)\n----------------------------------------------------------------------------------------\nlocal flaskbuffs = T.ReminderBuffs[\"Flask\"]\nlocal battleelixirbuffs = T.ReminderBuffs[\"BattleElixir\"]\nlocal guardianelixirbuffs = T.ReminderBuffs[\"GuardianElixir\"]\nlocal foodbuffs = T.ReminderBuffs[\"Food\"]\nlocal staminabuffs = T.ReminderBuffs[\"Stamina\"]\nlocal versbuffs = T.ReminderBuffs[\"Vers\"]\nlocal reducebuffs = T.ReminderBuffs[\"Reduce\"]\nlocal custombuffs = T.ReminderBuffs[\"Custom\"]\nlocal visible, flask, battleelixir, guardianelixir, food, stamina, vers, spell4, reduce, custom, weapon\nlocal playerBuff = {}\nlocal icons = {}\nlocal UpdatePositions\n\nlocal function CheckElixir()\n\tif #battleelixirbuffs > 0 then\n\t\tfor i = 1, #battleelixirbuffs do\n\t\t\tlocal name, icon = unpack(battleelixirbuffs[i])\n\t\t\tif playerBuff[name] then\n\t\t\t\tFlaskFrame.t:SetTexture(icon)\n\t\t\t\tbattleelixir = true\n\t\t\t\tbreak\n\t\t\telse\n\t\t\t\tbattleelixir = false\n\t\t\tend\n\t\tend\n\tend\n\n\tif #guardianelixirbuffs > 0 then\n\t\tfor i = 1, #guardianelixirbuffs do\n\t\t\tlocal name, icon = unpack(guardianelixirbuffs[i])\n\t\t\tif playerBuff[name] then\n\t\t\t\tguardianelixir = true\n\t\t\t\tif not battleelixir then\n\t\t\t\t\tFlaskFrame.t:SetTexture(icon)\n\t\t\t\tend\n\t\t\t\tbreak\n\t\t\telse\n\t\t\t\tguardianelixir = false\n\t\t\tend\n\t\tend\n\tend\n\n\tif guardianelixir == true and battleelixir == true then\n\t\tFlaskFrame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\tflask = true\n\t\treturn\n\telse\n\t\tFlaskFrame:SetAlpha(1)\n\t\tflask = false\n\tend\nend\n\nlocal function CheckWeaponBuff()\n\tlocal weaponBuff = false\n\tlocal weaponOffBuff = false\n\tlocal hasMainHandEnchant, _, _, _, hasOffHandEnchant = GetWeaponEnchantInfo()\n\tif hasMainHandEnchant then\n\t\tweaponBuff = true\n\tend\n\tlocal OffhandHasWeapon = C_PaperDollInfo.OffhandHasWeapon()\n\tif not OffhandHasWeapon or OffhandHasWeapon and hasOffHandEnchant then\n\t\tweaponOffBuff = true\n\tend\n\n\tif weaponBuff == true and weaponOffBuff == true then\n\t\tWeaponFrame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\tweapon = true\n\t\treturn\n\telse\n\t\tWeaponFrame:SetAlpha(1)\n\t\tweapon = false\n\tend\nend\n\nlocal function OnAuraChange(_, event, arg1)\n\tif (event == \"UNIT_AURA\" or event == \"UNIT_INVENTORY_CHANGED\") and arg1 ~= \"player\" then return end\n\n\twipe(playerBuff)\n\tlocal i = 1\n\twhile true do\n\t\tlocal name = UnitBuff(\"player\", i)\n\t\tif not name then break end\n\t\tplayerBuff[name] = true\n\t\ti = i + 1\n\tend\n\n\t-- If We're a caster we may want to see different buffs\n\tif T.Role == \"Caster\" or T.Role == \"Healer\" then\n\t\tT.ReminderCasterBuffs()\n\telse\n\t\tT.ReminderPhysicalBuffs()\n\tend\n\n\t-- Start checking buffs to see if we can find a match from the list\n\tfor i = 1, #flaskbuffs do\n\t\tlocal name, icon = unpack(flaskbuffs[i])\n\t\tif i == 1 then\n\t\t\tFlaskFrame.t:SetTexture(icon)\n\t\tend\n\t\tif playerBuff[name] then\n\t\t\tFlaskFrame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\t\tflask = true\n\t\t\tbreak\n\t\telse\n\t\t\tCheckElixir()\n\t\tend\n\tend\n\n\tfor i = 1, #foodbuffs do\n\t\tlocal name, icon = unpack(foodbuffs[i])\n\t\tif i == 1 then\n\t\t\tFoodFrame.t:SetTexture(icon)\n\t\tend\n\t\tif playerBuff[name] then\n\t\t\tFoodFrame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\t\tfood = true\n\t\t\tbreak\n\t\telse\n\t\t\tFoodFrame:SetAlpha(1)\n\t\t\tfood = false\n\t\tend\n\tend\n\n\tdo\n\t\tWeaponFrame.t:SetTexture(135250)\n\t\tCheckWeaponBuff()\n\tend\n\n\tfor i = 1, #staminabuffs do\n\t\tlocal name, icon = unpack(staminabuffs[i])\n\t\tif i == 1 then\n\t\t\tStaminaFrame.t:SetTexture(icon)\n\t\tend\n\t\tif playerBuff[name] then\n\t\t\tStaminaFrame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\t\tstamina = true\n\t\t\tbreak\n\t\telse\n\t\t\tStaminaFrame:SetAlpha(1)\n\t\t\tstamina = false\n\t\tend\n\tend\n\n\tfor i = 1, #versbuffs do\n\t\tlocal name, icon = unpack(versbuffs[i])\n\t\tif i == 1 then\n\t\t\tVersFrame.t:SetTexture(icon)\n\t\tend\n\t\tif playerBuff[name] then\n\t\t\tVersFrame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\t\tvers = true\n\t\t\tbreak\n\t\telse\n\t\t\tVersFrame:SetAlpha(1)\n\t\t\tvers = false\n\t\tend\n\tend\n\n\tfor i = 1, #Spell4Buff do\n\t\tlocal name, icon = unpack(Spell4Buff[i])\n\t\tif i == 1 then\n\t\t\tSpell4Frame.t:SetTexture(icon)\n\t\tend\n\t\tif playerBuff[name] then\n\t\t\tSpell4Frame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\t\tspell4 = true\n\t\t\tbreak\n\t\telse\n\t\t\tSpell4Frame:SetAlpha(1)\n\t\t\tspell4 = false\n\t\tend\n\tend\n\n\tfor i = 1, #reducebuffs do\n\t\tlocal name, icon = unpack(reducebuffs[i])\n\t\tif i == 1 then\n\t\t\tReduceFrame.t:SetTexture(icon)\n\t\tend\n\t\tif playerBuff[name] then\n\t\t\tReduceFrame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\t\treduce = true\n\t\t\tbreak\n\t\telse\n\t\t\tReduceFrame:SetAlpha(1)\n\t\t\treduce = false\n\t\tend\n\tend\n\n\tif #custombuffs > 0 then\n\t\tfor i = 1, #custombuffs do\n\t\t\tlocal name, icon = unpack(custombuffs[i])\n\t\t\tif i == 1 then\n\t\t\t\tCustomFrame.t:SetTexture(icon)\n\t\t\tend\n\t\t\tif playerBuff[name] then\n\t\t\t\tCustomFrame:SetAlpha(C.reminder.raid_buffs_alpha)\n\t\t\t\tcustom = true\n\t\t\t\tbreak\n\t\t\telse\n\t\t\t\tCustomFrame:SetAlpha(1)\n\t\t\t\tcustom = false\n\t\t\tend\n\t\tend\n\telse\n\t\tCustomFrame:Hide()\n\t\tcustom = true\n\tend\n\n\tUpdatePositions()\n\tlocal _, instanceType = IsInInstance()\n\tif (not IsInGroup() or instanceType ~= \"raid\") and C.reminder.raid_buffs_always == false then\n\t\tRaidBuffReminder:SetAlpha(0)\n\t\tvisible = false\n\telseif flask == true and food == true and stamina == true and spell4 == true and custom == true and weapon == true and vers == true and reduce == true then\n\t\tif not visible then\n\t\t\tRaidBuffReminder:SetAlpha(0)\n\t\t\tvisible = false\n\t\tend\n\t\tif visible then\n\t\t\tUIFrameFadeOut(RaidBuffReminder, 0.5)\n\t\t\tvisible = false\n\t\tend\n\telse\n\t\tif not visible then\n\t\t\tUIFrameFadeIn(RaidBuffReminder, 0.5)\n\t\t\tvisible = true\n\t\tend\n\tend\nend\n\n-- Create Anchor\nlocal RaidBuffsAnchor = CreateFrame(\"Frame\", \"RaidBuffsAnchor\", UIParent)\nRaidBuffsAnchor:SetWidth((C.reminder.raid_buffs_size * 6) + 15)\nRaidBuffsAnchor:SetHeight(C.reminder.raid_buffs_size)\nRaidBuffsAnchor:SetPoint(unpack(C.position.raid_buffs))\n\n-- Create Main bar\nlocal raidbuff_reminder = CreateFrame(\"Frame\", \"RaidBuffReminder\", UIParent)\nraidbuff_reminder:CreatePanel(\"Invisible\", (C.reminder.raid_buffs_size * 6) + 15, C.reminder.raid_buffs_size + 4, \"TOPLEFT\", RaidBuffsAnchor, \"TOPLEFT\", 0, 4)\nraidbuff_reminder:RegisterEvent(\"UNIT_AURA\")\nraidbuff_reminder:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nraidbuff_reminder:RegisterEvent(\"ACTIVE_TALENT_GROUP_CHANGED\")\nraidbuff_reminder:RegisterEvent(\"ZONE_CHANGED_NEW_AREA\")\nraidbuff_reminder:RegisterEvent(\"UNIT_INVENTORY_CHANGED\")\nraidbuff_reminder:SetScript(\"OnEvent\", OnAuraChange)\n\nlocal line = math.ceil(C.minimap.size / (C.reminder.raid_buffs_size + 2))\n\nlocal buffButtons = {\n\t\"FlaskFrame\",\n\t\"FoodFrame\",\n\t\"WeaponFrame\",\n\t\"StaminaFrame\",\n\t\"VersFrame\",\n\t\"Spell4Frame\",\n\t\"ReduceFrame\",\n\t\"CustomFrame\",\n}\n\nfor i = 1, #buffButtons do\n\tlocal name = buffButtons[i]\n\tlocal button = CreateFrame(\"Frame\", name, RaidBuffReminder)\n\tif i == 1 then\n\t\tbutton:CreatePanel(\"Default\", C.reminder.raid_buffs_size, C.reminder.raid_buffs_size, \"BOTTOMLEFT\", RaidBuffReminder, \"BOTTOMLEFT\", 0, 0)\n\telseif i == line then\n\t\tbutton:CreatePanel(\"Default\", C.reminder.raid_buffs_size, C.reminder.raid_buffs_size, \"BOTTOM\", buffButtons[1], \"TOP\", 0, 3)\n\telse\n\t\tbutton:CreatePanel(\"Default\", C.reminder.raid_buffs_size, C.reminder.raid_buffs_size, \"LEFT\", buffButtons[i-1], \"RIGHT\", 3, 0)\n\tend\n\tbutton:SetFrameLevel(RaidBuffReminder:GetFrameLevel() + 2)\n\n\tbutton.t = button:CreateTexture(name..\".t\", \"OVERLAY\")\n\tbutton.t:CropIcon()\n\ttinsert(icons, button)\nend\n\nfunction UpdatePositions()\n\tlocal line = math.ceil(C.minimap.size / (C.reminder.raid_buffs_size + 2))\n\tlocal first\n\tfor i = 1, #icons do\n\t\tlocal buff = icons[i]\n\t\tbuff:ClearAllPoints()\n\t\tif buff:GetAlpha() == C.reminder.raid_buffs_alpha then\n\t\t\tline = line + 1\n\t\telse\n\t\t\tif not first then\n\t\t\t\tbuff:SetPoint(\"BOTTOMLEFT\", RaidBuffReminder, \"BOTTOMLEFT\", 0, 0)\n\t\t\t\tfirst = true\n\t\t\telse\n\t\t\t\tbuff:SetPoint(\"LEFT\", previousBuff, \"RIGHT\", 3, 0)\n\t\t\tend\n\t\t\tpreviousBuff = buff\n\t\t\tif i >= line then\n\t\t\t\tbuff:SetAlpha(0)\n\t\t\telse\n\t\t\t\tbuff:SetAlpha(1)\n\t\t\tend\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Auras/SelfBuffsReminder.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.reminder.solo_buffs_enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSelf buffs on player(by Tukz and Elv22)\n----------------------------------------------------------------------------------------\nlocal tab = T.ReminderSelfBuffs[T.class]\nif not tab then return end\nlocal playerBuff = {}\n\nlocal function OnEvent(self, event, arg1)\n\tlocal group = tab[self.id]\n\tif not group.spells then return end\n\tif not GetSpecialization() then return end\n\tif (event == \"UNIT_AURA\" or event == \"UNIT_INVENTORY_CHANGED\") and arg1 ~= \"player\" then return end\n\tif group.level and T.level < group.level then return end\n\n\tself:Hide()\n\n\tfor i = 1, #group.spells do\n\t\tlocal name, icon = unpack(group.spells[i])\n\t\tlocal usable, nomana = IsUsableSpell(name)\n\t\tif usable or nomana or group.level then\n\t\t\tself.icon:SetTexture(icon)\n\t\t\tbreak\n\t\telse\n\t\t\tself.icon:SetTexture(nil)\n\t\tend\n\tend\n\n\tif event == \"PLAYER_LOGIN\" then\n\t\tif not self.icon:GetTexture() then\n\t\t\tself:UnregisterAllEvents()\n\t\t\tself:RegisterEvent(\"LEARNED_SPELL_IN_TAB\")\n\t\tend\n\t\treturn\n\tend\n\n\tif event == \"LEARNED_SPELL_IN_TAB\" and self.icon:GetTexture() then\n\t\tself:UnregisterAllEvents()\n\t\tself:RegisterEvent(\"UNIT_AURA\")\n\t\tself:RegisterEvent(\"UNIT_ENTERED_VEHICLE\")\n\t\tself:RegisterEvent(\"UNIT_EXITED_VEHICLE\")\n\n\t\tif group.combat then\n\t\t\tself:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\t\tself:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\n\t\tend\n\n\t\tif group.instance or group.pvp then\n\t\t\tself:RegisterEvent(\"ZONE_CHANGED_NEW_AREA\")\n\t\tend\n\tend\n\n\tif group.mainhand or group.offhand then\n\t\tself:RegisterEvent(\"UNIT_INVENTORY_CHANGED\")\n\tend\n\n\tlocal role = group.role\n\tlocal spec = group.spec\n\tlocal reversecheck = group.reversecheck\n\tlocal canplaysound = false\n\tlocal rolepass = true\n\tlocal specpass = true\n\tlocal _, instanceType, difficultyID = GetInstanceInfo()\n\n\tif role and role ~= T.Role then\n\t\trolepass = false\n\tend\n\n\tif spec and spec ~= T.Spec then\n\t\tspecpass = false\n\tend\n\n\t-- Prevent user error\n\tif reversecheck ~= nil and (role == nil and spec == nil) then reversecheck = nil end\n\n\t-- Check event to play sound\n\tif (event == \"ZONE_CHANGED_NEW_AREA\" or event == \"PLAYER_REGEN_DISABLED\") and C.reminder.solo_buffs_sound == true then canplaysound = true end\n\n\tif ((group.combat and UnitAffectingCombat(\"player\")) or (group.instance and difficultyID ~= 0 and not C_Garrison.IsOnGarrisonMap()) or (group.pvp and (instanceType == \"arena\" or instanceType == \"pvp\"))) and\n\tspecpass == true and rolepass == true and not UnitInVehicle(\"player\") then\n\t\tif group.mainhand then\n\t\t\tlocal hasMainHandEnchant = GetWeaponEnchantInfo()\n\t\t\tif not hasMainHandEnchant then\n\t\t\t\tself:Show()\n\t\t\t\tif canplaysound == true then PlaySoundFile(C.media.warning_sound, \"Master\") end\n\t\t\tend\n\t\t\treturn\n\t\telseif group.offhand then\n\t\t\tlocal _, _, _, _, hasOffHandEnchant = GetWeaponEnchantInfo()\n\t\t\tif not hasOffHandEnchant and C_PaperDollInfo.OffhandHasWeapon() then\n\t\t\t\tself:Show()\n\t\t\t\tif canplaysound == true then PlaySoundFile(C.media.warning_sound, \"Master\") end\n\t\t\tend\n\t\t\treturn\n\t\tend\n\n\t\twipe(playerBuff)\n\t\tlocal i = 1\n\t\twhile true do\n\t\t\tlocal name = UnitBuff(\"player\", i)\n\t\t\tif not name then break end\n\t\t\tplayerBuff[name] = true\n\t\t\ti = i + 1\n\t\tend\n\t\tif reversecheck then\n\t\t\tif group.negate_reversecheck and group.negate_reversecheck == T.Spec then self:Hide() return end\n\t\t\tfor i = 1, #group.spells do\n\t\t\t\tlocal name = group.spells[i][1]\n\t\t\t\tif name and playerBuff[name] then\n\t\t\t\t\tself:Show()\n\t\t\t\t\tif canplaysound == true then PlaySoundFile(C.media.warning_sound, \"Master\") end\n\t\t\t\t\treturn\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tfor i = 1, #group.spells do\n\t\t\t\tlocal name = group.spells[i][1]\n\t\t\t\tif name and playerBuff[name] then\n\t\t\t\t\tself:Hide()\n\t\t\t\t\treturn\n\t\t\t\tend\n\t\t\tend\n\t\t\tself:Show()\n\t\t\tif canplaysound == true then PlaySoundFile(C.media.warning_sound, \"Master\") end\n\t\tend\n\tend\nend\n\nfor i = 1, #tab do\n\tlocal frame = CreateFrame(\"Frame\", \"ReminderFrame\"..i, UIParent)\n\tframe:CreatePanel(\"Default\", C.reminder.solo_buffs_size, C.reminder.solo_buffs_size, unpack(C.position.self_buffs))\n\tframe:SetFrameLevel(6)\n\tframe.id = i\n\n\tframe.icon = frame:CreateTexture(nil, \"OVERLAY\")\n\tframe.icon:CropIcon()\n\tframe.icon:SetSize(C.reminder.solo_buffs_size, C.reminder.solo_buffs_size)\n\n\tframe:Hide()\n\n\tframe:RegisterEvent(\"UNIT_AURA\")\n\tframe:RegisterEvent(\"PLAYER_LOGIN\")\n\tframe:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\tframe:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\n\tframe:RegisterEvent(\"ZONE_CHANGED_NEW_AREA\")\n\tframe:RegisterEvent(\"UNIT_ENTERED_VEHICLE\")\n\tframe:RegisterEvent(\"UNIT_EXITED_VEHICLE\")\n\tframe:SetScript(\"OnEvent\", OnEvent)\n\tframe:SetScript(\"OnUpdate\", function(self)\n\t\tif not self.icon:GetTexture() then\n\t\t\tself:Hide()\n\t\tend\n\tend)\n\tframe:SetScript(\"OnShow\", function(self)\n\t\tif not self.icon:GetTexture() then\n\t\t\tself:Hide()\n\t\tend\n\tend)\nend"
  },
  {
    "path": "ShestakUI/Modules/Automation/AutoInvite.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tAccept invites from guild members or friend list(by ALZA)\n----------------------------------------------------------------------------------------\nif C.automation.accept_invite == true then\n\tlocal function CheckFriend(inviterGUID)\n\t\tif C_BattleNet.GetAccountInfoByGUID(inviterGUID) or C_FriendList.IsFriend(inviterGUID) or IsGuildMember(inviterGUID) then\n\t\t\treturn true\n\t\tend\n\tend\n\n\tlocal ai = CreateFrame(\"Frame\")\n\tai:RegisterEvent(\"PARTY_INVITE_REQUEST\")\n\tai:SetScript(\"OnEvent\", function(_, _, name, _, _, _, _, _, inviterGUID)\n\t\tif QueueStatusButton:IsShown() or GetNumGroupMembers() > 0 then return end\n\t\tif CheckFriend(inviterGUID) then\n\t\t\tRaidNotice_AddMessage(RaidWarningFrame, L_INFO_INVITE..name, {r = 0.41, g = 0.8, b = 0.94}, 3)\n\t\t\tprint(format(\"|cffffff00\"..L_INFO_INVITE..name..\".|r\"))\n\t\t\tAcceptGroup()\n\t\t\tfor i = 1, STATICPOPUP_NUMDIALOGS do\n\t\t\t\tlocal frame = _G[\"StaticPopup\"..i]\n\t\t\t\tif frame:IsVisible() and frame.which == \"PARTY_INVITE\" then\n\t\t\t\t\tframe.inviteAccepted = 1\n\t\t\t\t\tStaticPopup_Hide(\"PARTY_INVITE\")\n\t\t\t\t\treturn\n\t\t\t\telseif frame:IsVisible() and frame.which == \"PARTY_INVITE_XREALM\" then\n\t\t\t\t\tframe.inviteAccepted = 1\n\t\t\t\t\tStaticPopup_Hide(\"PARTY_INVITE_XREALM\")\n\t\t\t\t\treturn\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tAuto invite by whisper(by Tukz)\n----------------------------------------------------------------------------------------\nif T.client == \"ruRU\" then\n\tC.automation.invite_keyword = \"инв inv +\"\nend\n\nlocal list_keyword = {}\nfor word in gmatch(C.automation.invite_keyword, \"%S+\") do\n\tlist_keyword[word] = true\nend\n\nlocal autoinvite = CreateFrame(\"Frame\")\nautoinvite:RegisterEvent(\"CHAT_MSG_WHISPER\")\nautoinvite:RegisterEvent(\"CHAT_MSG_BN_WHISPER\")\nautoinvite:SetScript(\"OnEvent\", function(_, event, arg1, arg2, ...)\n\tif not C.automation.whisper_invite then return end\n\tif ((not UnitExists(\"party1\") or UnitIsGroupLeader(\"player\") or UnitIsGroupAssistant(\"player\"))) and not QueueStatusButton:IsShown() then\n\t\tfor word in pairs(list_keyword) do\n\t\t\tif arg1:lower():match(word) then\n\t\t\t\tif event == \"CHAT_MSG_WHISPER\" then\n\t\t\t\t\tC_PartyInfo.InviteUnit(arg2)\n\t\t\t\telseif event == \"CHAT_MSG_BN_WHISPER\" then\n\t\t\t\t\tlocal bnetIDAccount = select(11, ...)\n\t\t\t\t\tlocal accountInfo = C_BattleNet.GetAccountInfoByID(bnetIDAccount)\n\t\t\t\t\tBNInviteFriend(accountInfo.gameAccountInfo.gameAccountID)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Automation/AutoOpens.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.open_items ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto opening of items in bag (kAutoOpen by Kellett)\n----------------------------------------------------------------------------------------\nlocal frame, atBank, atMail, atMerchant = CreateFrame(\"Frame\")\nframe:SetScript(\"OnEvent\", function(self, event, ...) self[event](...) end)\n\nfunction frame:Register(event, func)\n\tself:RegisterEvent(event)\n\tself[event] = function(...)\n\t\tfunc(...)\n\tend\nend\n\nframe:Register(\"BANKFRAME_OPENED\", function()\n\tatBank = true\nend)\n\nframe:Register(\"BANKFRAME_CLOSED\", function()\n\tatBank = false\nend)\n\nframe:Register(\"PLAYER_INTERACTION_MANAGER_FRAME_SHOW\", function(...)\n\tlocal type = ...\n\tif type == 10 then\t-- Guild bank\n\t\tatBank = true\n\tend\nend)\n\nframe:Register(\"PLAYER_INTERACTION_MANAGER_FRAME_HIDE\", function(...)\n\tlocal type = ...\n\tif type == 10 then\t-- Guild bank\n\t\tatBank = false\n\tend\nend)\n\nframe:Register(\"MAIL_SHOW\", function()\n\tatMail = true\nend)\n\nframe:Register(\"MAIL_CLOSED\", function()\n\tatMail = false\nend)\n\nframe:Register(\"MERCHANT_SHOW\", function()\n\tatMerchant = true\nend)\n\nframe:Register(\"MERCHANT_CLOSED\", function()\n\tatMerchant = false\nend)\n\nframe:Register(\"BAG_UPDATE_DELAYED\", function()\n\tif atBank or atMail or atMerchant then return end\n\tfor bag = 0, 4 do\n\t\tfor slot = 0, C_Container.GetContainerNumSlots(bag) do\n\t\t\tlocal _, _, locked, _, _, lootable, _, _, _, id = GetContainerItemInfo(bag, slot)\n\t\t\tif lootable and not locked and id and T.OpenItems[id] then\n\t\t\t\tprint(\"|cffff0000\"..OPENING..\": \"..C_Container.GetContainerItemLink(bag, slot)..\".|r\")\n\t\t\t\tC_Container.UseContainerItem(bag, slot)\n\t\t\t\treturn\n\t\t\tend\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Automation/AutoRelease.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.release ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto release the spirit in battlegrounds\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_DEAD\")\nframe:SetScript(\"OnEvent\", function()\n\tlocal inBattlefield = false\n\tfor i = 1, GetMaxBattlefieldID() do\n\t\tlocal status = GetBattlefieldStatus(i)\n\t\tif status == \"active\" then inBattlefield = true end\n\tend\n\tif C_DeathInfo.GetSelfResurrectOptions() and #C_DeathInfo.GetSelfResurrectOptions() > 0 then return end\n\tlocal areaID = C_Map.GetBestMapForUnit(\"player\") or 0\n\tif areaID == 123 or areaID == 244 or areaID == 588 or areaID == 622 or areaID == 624 or inBattlefield == true then\n\t\tRepopMe()\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Automation/BuffOnScroll.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.automation.buff_on_scroll ~= true or T.level ~= MAX_PLAYER_LEVEL then return end\n\n----------------------------------------------------------------------------------------\n--\tCast buff on mouse scroll(by Gsuz)\n----------------------------------------------------------------------------------------\nlocal function SpellName(id)\n\tlocal name = GetSpellInfo(id)\n\tif name then\n\t\treturn name\n\telse\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(id)..\"] no longer exists! Report this to Shestak.|r\")\n\t\treturn \"Empty\"\n\tend\nend\n\nlocal spells = {\n\tDRUID = {\n\t\t[SpellName(1126)] = true,\t-- Mark of the Wild\n\t},\n\tEVOKER = {\n\t\t[SpellName(364342)] = true,\t-- Blessing of the Bronze\n\t},\n\tMAGE = {\n\t\t[SpellName(1459)] = true,\t-- Arcane Intellect\n\t},\n\tPRIEST = {\n\t\t[SpellName(21562)] = true,\t-- Power Word: Fortitude\n\t},\n\tWARRIOR = {\n\t\t[SpellName(6673)] = true,\t-- Battle Shout\n\t},\n}\n\nlocal specSpells = spells[T.class]\nlocal frame = CreateFrame(\"Frame\")\n-- Function for waiting through the global cooldown\nlocal GcTimer, CheckBuffs = 0\nlocal function WaitForGC(_, elapsed)\n\tGcTimer = GcTimer + elapsed\n\tif GcTimer >= 1.5 then\n\t\tCheckBuffs()\n\t\tframe:SetScript(\"OnUpdate\", nil)\n\t\tGcTimer = 0\n\tend\nend\n\n-- Create Secure Action Button for better control\nlocal btn = CreateFrame(\"Button\", \"AutoBuffButton\", UIParent, \"SecureActionButtonTemplate\")\nbtn:SetAttribute(\"type\", \"action\")\nbtn:SetAttribute(\"action\", 1)\nbtn:SetAttribute(\"type\", \"spell\")\nbtn:SetAttribute(\"unit\", \"player\")\n\n-- Main function for changing keybinding to mousewheel when a buff is needed\nfunction CheckBuffs()\n\tif IsFlying() or IsMounted() or UnitIsDeadOrGhost(\"Player\") or InCombatLockdown() then return end\n\tClearOverrideBindings(btn)\n\tbtn:SetAttribute(\"spell\", nil)\n\tif specSpells then\n\t\tfor name in pairs(specSpells) do\n\t\t\tif name and not T.CheckPlayerBuff(name) then\n\t\t\t\tif GetSpellCooldown(name) == 0 then\n\t\t\t\t\tbtn:SetAttribute(\"spell\", name)\n\t\t\t\t\tSetOverrideBindingClick(btn, true, \"MOUSEWHEELUP\", \"AutoBuffButton\")\n\t\t\t\t\tSetOverrideBindingClick(btn, true, \"MOUSEWHEELDOWN\", \"AutoBuffButton\")\n\t\t\t\telse\n\t\t\t\t\tlocal _, duration = GetSpellCooldown(name)\n\t\t\t\t\tif duration == nil or duration > 1.5 then return end\n\t\t\t\t\tframe:SetScript(\"OnUpdate\", WaitForGC)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- Events that will trigger the Main Function\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:RegisterEvent(\"UNIT_AURA\")\nframe:RegisterEvent(\"SPELL_UPDATE_USABLE\")\nframe:RegisterEvent(\"SPELL_UPDATE_COOLDOWN\")\nframe:RegisterEvent(\"PLAYER_LEAVE_COMBAT\")\nframe:RegisterEvent(\"READY_CHECK\")\nframe:RegisterEvent(\"ACTIVE_TALENT_GROUP_CHANGED\")\nframe:SetScript(\"OnEvent\", CheckBuffs)"
  },
  {
    "path": "ShestakUI/Modules/Automation/CancelBadBuffs.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.cancel_bad_buffs ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto cancel various buffs(by Unknown)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"UNIT_AURA\")\nframe:SetScript(\"OnEvent\", function(_, event, unit)\n\tif event == \"UNIT_AURA\" and unit == \"player\" and not InCombatLockdown() then\n\t\tlocal i = 1\n\t\twhile true do\n\t\t\tlocal name = UnitBuff(unit, i)\n\t\t\tif not name then return end\n\t\t\tif T.BadBuffs[name] then\n\t\t\t\tCancelSpellByName(name)\n\t\t\t\tprint(\"|cffffff00\"..ACTION_SPELL_AURA_REMOVED..\" [\"..name..\"].|r\")\n\t\t\tend\n\t\t\ti = i + 1\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Automation/DeclineDuel.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.decline_duel ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto decline duel\n----------------------------------------------------------------------------------------\nlocal disable = false\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"DUEL_REQUESTED\")\nframe:RegisterEvent(\"PET_BATTLE_PVP_DUEL_REQUESTED\")\nframe:SetScript(\"OnEvent\", function(_, event, name)\n\tif disable == true then return end\n\tif event == \"DUEL_REQUESTED\" then\n\t\tCancelDuel()\n\t\tRaidNotice_AddMessage(RaidWarningFrame, L_INFO_DUEL..name, {r = 0.41, g = 0.8, b = 0.94}, 3)\n\t\tprint(format(\"|cffffff00\"..L_INFO_DUEL..name..\".\"))\n\t\tStaticPopup_Hide(\"DUEL_REQUESTED\")\n\telseif event == \"PET_BATTLE_PVP_DUEL_REQUESTED\" then\n\t\tC_PetBattles.CancelPVPDuel()\n\t\tRaidNotice_AddMessage(RaidWarningFrame, L_INFO_PET_DUEL..name, {r = 0.41, g = 0.8, b = 0.94}, 3)\n\t\tprint(format(\"|cffffff00\"..L_INFO_PET_DUEL..name..\".\"))\n\t\tStaticPopup_Hide(\"PET_BATTLE_PVP_DUEL_REQUESTED\")\n\tend\nend)\n\nSlashCmdList.DISABLEDECLINE = function()\n\tif not disable then\n\t\tdisable = true\n\telse\n\t\tdisable = false\n\tend\nend\n\nSLASH_DISABLEDECLINE1 = \"/disduel\"\nSLASH_DISABLEDECLINE2 = \"/вшывгуд\""
  },
  {
    "path": "ShestakUI/Modules/Automation/LoggingCombat.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.logging_combat ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto enables combat log text file in raid instances(EasyLogger by Sildor)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function()\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType == \"raid\" and IsInRaid(LE_PARTY_CATEGORY_HOME) then\n\t\tif not LoggingCombat() then\n\t\t\tLoggingCombat(1)\n\t\t\tprint(\"|cffffff00\"..COMBATLOGENABLED..\"|r\")\n\t\tend\n\telse\n\t\tif LoggingCombat() then\n\t\t\tLoggingCombat(0)\n\t\t\tprint(\"|cffffff00\"..COMBATLOGDISABLED..\"|r\")\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Automation/Resurrection.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.automation.resurrection ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto confirm resurrection\n----------------------------------------------------------------------------------------\nlocal AutoResurrect = CreateFrame(\"Frame\")\nAutoResurrect:RegisterEvent(\"RESURRECT_REQUEST\")\nAutoResurrect:SetScript(\"OnEvent\", function(_, event, name)\n\tif event == \"RESURRECT_REQUEST\" then\n\t\tif not UnitAffectingCombat(name) then\n\t\t\tAcceptResurrect()\n\t\t\tStaticPopup_Hide(\"RESURRECT_NO_TIMER\")\n\n\t\t\tC_Timer.After(2, function()\n\t\t\t\tDoEmote(\"thank\", name)\n\t\t\tend)\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Automation/Screenshots.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.automation.screenshot ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTake screenshots of defined events (Sinaris)\n----------------------------------------------------------------------------------------\nlocal function OnEvent()\n\tC_Timer.After(1, function() Screenshot() end)\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ACHIEVEMENT_EARNED\")\nframe:SetScript(\"OnEvent\", OnEvent)"
  },
  {
    "path": "ShestakUI/Modules/Automation/SetRole.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.automation.auto_role ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAutomatically sets your role(Auto role setter by iSpawnAtHome)\n----------------------------------------------------------------------------------------\nlocal prev = 0\nlocal function SetRole()\n\tif T.level >= 10 and not InCombatLockdown() and IsInGroup() and not IsPartyLFG() then\n\t\tlocal spec = GetSpecialization()\n\t\tif spec then\n\t\t\tlocal role = GetSpecializationRole(spec)\n\t\t\tif UnitGroupRolesAssigned(\"player\") ~= role then\n\t\t\t\tlocal t = GetTime()\n\t\t\t\tif t - prev > 2 then\n\t\t\t\t\tprev = t\n\t\t\t\t\tUnitSetRole(\"player\", role)\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tUnitSetRole(\"player\", \"No Role\")\n\t\tend\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\nframe:RegisterEvent(\"GROUP_ROSTER_UPDATE\")\nframe:SetScript(\"OnEvent\", SetRole)\n\nRolePollPopup:UnregisterEvent(\"ROLE_POLL_BEGIN\")"
  },
  {
    "path": "ShestakUI/Modules/Automation/SkipCinematic.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.skip_cinematic ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSkip cinematics/movies(CinematicSkip by Pigmonkey)\n----------------------------------------------------------------------------------------\n-- Cancel cinematics after they start\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"CINEMATIC_START\")\nframe:SetScript(\"OnEvent\", function(_, event)\n\tif event == \"CINEMATIC_START\" then\n\t\tif not IsControlKeyDown() then\n\t\t\tCinematicFrame_CancelCinematic()\n\t\tend\n\tend\nend)\n\n-- Hook movies and stop them before they get called\nlocal PlayMovie_hook = MovieFrame_PlayMovie\nMovieFrame_PlayMovie = function(...)\n\tif IsControlKeyDown() then\n\t\tPlayMovie_hook(...)\n\telse\n\t\tGameMovieFinished()\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Automation/SolveArtifact.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.solve_artifact ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto popup for solve artifact(module from Inomena by p3lim)\n----------------------------------------------------------------------------------------\nStaticPopupDialogs.ARCHAEOLOGY_SOLVE = {\n\ttext = \"%s\",\n\tbutton1 = SOLVE,\n\tbutton2 = CANCEL,\n\tOnAccept = SolveArtifact,\n\ttimeout = 0,\n\tpreferredIndex = 5,\n}\n\nlocal fragment = {\n\t[\"1535\"] = 1,\t-- Drust\n\t[\"1534\"] = 2,\t-- Zandalari\n\t[\"1174\"] = 3,\t-- Demonic\n\t[\"1173\"] = 4,\t-- Highmountain\n\t[\"1172\"] = 5,\t-- Highborne\n\t[\"828\"] = 6,\t-- Ogre\n\t[\"821\"] = 7,\t-- Draenor Clans\n\t[\"829\"] = 8,\t-- Arakkoa\n\t[\"677\"] = 9,\t-- Mogu\n\t[\"676\"] = 10,\t-- Pandaren\n\t[\"754\"] = 11,\t-- Mantid\n\t[\"399\"] = 12,\t-- Vrykul\n\t[\"385\"] = 13,\t-- Troll\n\t[\"401\"] = 14,\t-- Tol'vir\n\t[\"397\"] = 15,\t-- Orc\n\t[\"400\"] = 16,\t-- Nerubian\n\t[\"394\"] = 17,\t-- Night Elf\n\t[\"393\"] = 18,\t-- Fossil\n\t[\"398\"] = 19,\t-- Draenei\n\t[\"384\"] = 20,\t-- Dwarf\n}\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"CHAT_MSG_CURRENCY\")\nframe:SetScript(\"OnEvent\", function(_, _, msg)\n\tlocal _, _, currencyID = string.find(msg, \"currency:(%d+)\");\n\tif not currencyID then return end\n\n\tlocal race = fragment[currencyID]\n\tif race then\n\t\tSetSelectedArtifact(race)\n\n\t\tlocal race, _, stone = GetArchaeologyRaceInfo(race)\n\t\tlocal artifact, _, rare, _, _, stones = GetSelectedArtifactInfo()\n\t\tif not artifact then return end\n\n\t\tfor index = 1, math.min(stones, GetItemCount(stone)) do\n\t\t\tif not ItemAddedToArtifact(index) then\n\t\t\t\tSocketItemToArtifact()\n\t\t\tend\n\t\tend\n\n\t\tlocal fragments, stones, total = GetArtifactProgress()\n\t\tif fragments + stones >= total then\n\t\t\tlocal color\n\t\t\tif rare and rare > 0 then\n\t\t\t\tcolor = \"|cff0070dd\"\n\t\t\telse\n\t\t\t\tcolor = \"|cff9d9d9d\"\n\t\t\tend\n\n\t\t\tStaticPopup_Show(\"ARCHAEOLOGY_SOLVE\", string.format(\"%s %s: %s[%s]|r?\", SOLVE, race, color, artifact))\n\t\tend\n\tend\nend)\n"
  },
  {
    "path": "ShestakUI/Modules/Automation/Summon.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.automation.summon ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto confirm summon\n----------------------------------------------------------------------------------------\nlocal disable = false\nlocal AutoSummon = CreateFrame(\"Frame\")\nAutoSummon:RegisterEvent(\"CONFIRM_SUMMON\")\nAutoSummon:SetScript(\"OnEvent\", function(_, event)\n\tif event == \"CONFIRM_SUMMON\" then\n\t\tif not UnitAffectingCombat(\"player\") and PlayerCanTeleport() then\n\t\t\tStaticPopup_Show(\"CANCEL_SUMMON\")\n\t\t\tC_Timer.After(10, function()\n\t\t\t\tif disable then return end\n\t\t\t\tif not UnitAffectingCombat(\"player\") and PlayerCanTeleport() then\n\t\t\t\t\tC_SummonInfo.ConfirmSummon()\n\t\t\t\t\tStaticPopup_Hide(\"CONFIRM_SUMMON\")\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\tend\nend)\n\nStaticPopupDialogs[\"CANCEL_SUMMON\"] = {\n\ttext = LFG_LIST_AUTO_ACCEPT..\" \".. string.lower(SUMMONS),\n\tbutton1 = CANCEL,\n\tOnAccept = function()\n\t\tdisable = true\n\tend,\n\ttimeout = 12,\n}"
  },
  {
    "path": "ShestakUI/Modules/Automation/TabBinder.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.tab_binder ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto change Tab key to only target enemy players(RE/TabBinder by Veev/AcidWeb)\n----------------------------------------------------------------------------------------\nlocal TabBinder = CreateFrame(\"Frame\")\nTabBinder:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nTabBinder:RegisterEvent(\"ZONE_CHANGED_NEW_AREA\")\nTabBinder:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\nTabBinder:RegisterEvent(\"DUEL_REQUESTED\")\nTabBinder:RegisterEvent(\"DUEL_FINISHED\")\nTabBinder:RegisterEvent(\"CHAT_MSG_SYSTEM\")\n\nlocal RTB_Fail, RTB_DefaultKey, LastTargetKey, TargetKey, CurrentBind, Success = false, true\n\nTabBinder:SetScript(\"OnEvent\", function(_, event, ...)\n\tif event == \"CHAT_MSG_SYSTEM\" then\n\t\tlocal RTBChatMessage = ...\n\t\tif RTBChatMessage == ERR_DUEL_REQUESTED then\n\t\t\tevent = \"DUEL_REQUESTED\"\n\t\tend\n\telseif event == \"ZONE_CHANGED_NEW_AREA\" or event == \"PLAYER_ENTERING_WORLD\" or (event == \"PLAYER_REGEN_ENABLED\" and RTB_Fail) or event == \"DUEL_REQUESTED\" or event == \"DUEL_FINISHED\" then\n\t\tlocal BindSet = GetCurrentBindingSet()\n\t\tif BindSet ~= 1 and BindSet ~= 2 then\n\t\t\treturn\n\t\tend\n\n\t\tif InCombatLockdown() then\n\t\t\tRTB_Fail = true\n\t\t\treturn\n\t\tend\n\n\t\tlocal PVPType = GetZonePVPInfo()\n\t\tlocal _, ZoneType = IsInInstance()\n\n\t\tTargetKey = GetBindingKey(\"TARGETNEARESTENEMYPLAYER\")\n\t\tif TargetKey == nil then\n\t\t\tTargetKey = GetBindingKey(\"TARGETNEARESTENEMY\")\n\t\tend\n\t\tif TargetKey == nil and RTB_DefaultKey then\n\t\t\tTargetKey = \"TAB\"\n\t\tend\n\n\t\tLastTargetKey = GetBindingKey(\"TARGETPREVIOUSENEMYPLAYER\")\n\t\tif LastTargetKey == nil then\n\t\t\tLastTargetKey = GetBindingKey(\"TARGETPREVIOUSENEMY\")\n\t\tend\n\t\tif LastTargetKey == nil and RTB_DefaultKey then\n\t\t\tLastTargetKey = \"SHIFT-TAB\"\n\t\tend\n\n\t\tif TargetKey then\n\t\t\tCurrentBind = GetBindingAction(TargetKey)\n\t\tend\n\n\t\tif ZoneType == \"arena\" or ZoneType == \"pvp\" or PVPType == \"combat\" or event == \"DUEL_REQUESTED\" then\n\t\t\tif CurrentBind ~= \"TARGETNEARESTENEMYPLAYER\" then\n\t\t\t\tif TargetKey == nil then\n\t\t\t\t\tSuccess = true\n\t\t\t\telse\n\t\t\t\t\tSuccess = SetBinding(TargetKey, \"TARGETNEARESTENEMYPLAYER\")\n\t\t\t\tend\n\t\t\t\tif LastTargetKey then\n\t\t\t\t\tSetBinding(LastTargetKey, \"TARGETPREVIOUSENEMYPLAYER\")\n\t\t\t\tend\n\t\t\t\tif Success then\n\t\t\t\t\tSaveBindings(BindSet)\n\t\t\t\t\tRTB_Fail = false\n\t\t\t\telse\n\t\t\t\t\tRTB_Fail = true\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif CurrentBind ~= \"TARGETNEARESTENEMY\" then\n\t\t\t\tif TargetKey == nil then\n\t\t\t\t\tSuccess = true\n\t\t\t\telse\n\t\t\t\t\tSuccess = SetBinding(TargetKey, \"TARGETNEARESTENEMY\")\n\t\t\t\tend\n\t\t\t\tif LastTargetKey then\n\t\t\t\t\tSetBinding(LastTargetKey, \"TARGETPREVIOUSENEMY\")\n\t\t\t\tend\n\t\t\t\tif Success then\n\t\t\t\t\tSaveBindings(BindSet)\n\t\t\t\t\tRTB_Fail = false\n\t\t\t\telse\n\t\t\t\t\tRTB_Fail = true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/AlertFrames.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif IsAddOnLoaded(\"MoveAnything\") then return end\n\n----------------------------------------------------------------------------------------\n--\tAlertFrameMove(by Gethe)\n----------------------------------------------------------------------------------------\nlocal AchievementAnchor = CreateFrame(\"Frame\", \"AchievementAnchor\", UIParent)\nAchievementAnchor:SetWidth(230)\nAchievementAnchor:SetHeight(50)\nAchievementAnchor:SetPoint(unpack(C.position.achievement))\n\nlocal alertBlacklist = {\n\tGroupLootContainer = C.loot.rolllootframe,\n\tTalkingHeadFrame = true\n}\n\nlocal POSITION, ANCHOR_POINT, YOFFSET, FIRST_YOFFSET = \"BOTTOM\", \"TOP\", -9\n\nlocal function CheckGrow()\n\tlocal point = AchievementAnchor:GetPoint()\n\n\tif string.find(point, \"TOP\") or point == \"CENTER\" or point == \"LEFT\" or point == \"RIGHT\" then\n\t\tPOSITION = \"TOP\"\n\t\tANCHOR_POINT = \"BOTTOM\"\n\t\tYOFFSET = 9\n\t\tFIRST_YOFFSET = YOFFSET - 2\n\telse\n\t\tPOSITION = \"BOTTOM\"\n\t\tANCHOR_POINT = \"TOP\"\n\t\tYOFFSET = -9\n\t\tFIRST_YOFFSET = YOFFSET + 2\n\tend\nend\n\nlocal ReplaceAnchors do\n\tlocal function QueueAdjustAnchors(self, relativeAlert)\n\t\tCheckGrow()\n\n\t\tfor alertFrame in self.alertFramePool:EnumerateActive() do\n\t\t\talertFrame:ClearAllPoints()\n\t\t\talertFrame:SetPoint(POSITION, relativeAlert, ANCHOR_POINT, 0, YOFFSET)\n\t\t\trelativeAlert = alertFrame\n\t\tend\n\n\t\t-- if C.loot.rolllootframe then\n\t\t\t-- GroupLootContainer:ClearAllPoints()\n\t\t\t-- GroupLootContainer:SetPoint(POSITION, relativeAlert, ANCHOR_POINT, 0, YOFFSET)\n\t\t-- else\n\t\t\t-- GroupLootContainer:ClearAllPoints()\n\t\t\t-- GroupLootContainer:SetPoint(POSITION, AchievementAnchor, POSITION, 2, FIRST_YOFFSET)\n\t\t-- end\n\n\t\treturn relativeAlert\n\tend\n\n\tlocal function SimpleAdjustAnchors(self, relativeAlert)\n\t\tCheckGrow()\n\n\t\tif self.alertFrame:IsShown() then\n\t\t\tself.alertFrame:ClearAllPoints()\n\t\t\tself.alertFrame:SetPoint(POSITION, relativeAlert, ANCHOR_POINT, 0, YOFFSET)\n\t\t\treturn self.alertFrame\n\t\tend\n\t\treturn relativeAlert\n\tend\n\n\tlocal function AnchorAdjustAnchors(self, relativeAlert)\n\t\tif self.anchorFrame:IsShown() then\n\t\t\treturn self.anchorFrame\n\t\tend\n\t\treturn relativeAlert\n\tend\n\n\tfunction ReplaceAnchors(alertFrameSubSystem)\n\t\tif alertFrameSubSystem.alertFramePool then\n\t\t\tif alertBlacklist[alertFrameSubSystem.alertFramePool.frameTemplate] then\n\t\t\t\treturn alertFrameSubSystem.alertFramePool.frameTemplate, true\n\t\t\telse\n\t\t\t\talertFrameSubSystem.AdjustAnchors = QueueAdjustAnchors\n\t\t\tend\n\t\telseif alertFrameSubSystem.alertFrame then\n\t\t\tlocal frame = alertFrameSubSystem.alertFrame\n\t\t\tif alertBlacklist[frame:GetName()] then\n\t\t\t\treturn frame:GetName(), true\n\t\t\telse\n\t\t\t\talertFrameSubSystem.AdjustAnchors = SimpleAdjustAnchors\n\t\t\tend\n\t\telseif alertFrameSubSystem.anchorFrame then\n\t\t\tlocal frame = alertFrameSubSystem.anchorFrame\n\t\t\tif alertBlacklist[frame:GetName()] then\n\t\t\t\treturn frame:GetName(), true\n\t\t\telse\n\t\t\t\talertFrameSubSystem.AdjustAnchors = AnchorAdjustAnchors\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function SetUpAlert()\n\thooksecurefunc(AlertFrame, \"UpdateAnchors\", function(self)\n\t\tCheckGrow()\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(POSITION, AchievementAnchor, POSITION, 2, FIRST_YOFFSET)\n\tend)\n\n\thooksecurefunc(AlertFrame, \"AddAlertFrameSubSystem\", function(_, alertFrameSubSystem)\n\t\tlocal _, isBlacklisted = ReplaceAnchors(alertFrameSubSystem)\n\t\tif isBlacklisted then\n\t\t\tfor i, alertSubSystem in ipairs(AlertFrame.alertFrameSubSystems) do\n\t\t\t\tif alertFrameSubSystem == alertSubSystem then\n\t\t\t\t\treturn table.remove(AlertFrame.alertFrameSubSystems, i)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal remove = {}\n\tfor i, alertFrameSubSystem in ipairs(AlertFrame.alertFrameSubSystems) do\n\t\tlocal name, isBlacklisted = ReplaceAnchors(alertFrameSubSystem)\n\t\tif isBlacklisted then\n\t\t\tremove[i] = name\n\t\tend\n\tend\n\n\tfor i in next, remove do\n\t\ttable.remove(AlertFrame.alertFrameSubSystems, i)\n\tend\nend\n\nSetUpAlert()"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/AltPowerBar.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tSkin AltPowerBar(by Tukz)\n----------------------------------------------------------------------------------------\n-- Get rid of old AltPowerBar\nPlayerPowerBarAlt:UnregisterEvent(\"UNIT_POWER_BAR_SHOW\")\nPlayerPowerBarAlt:UnregisterEvent(\"UNIT_POWER_BAR_HIDE\")\nPlayerPowerBarAlt:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\n-- AltPowerBar\nlocal bar = CreateFrame(\"Frame\", \"UIAltPowerBar\", UIParent)\nbar:SetSize(221, 25)\nbar:SetTemplate(\"Default\")\n\n-- Make moveable\nbar:EnableMouse(true)\nbar:SetMovable(true)\nbar:SetFrameStrata(\"HIGH\")\nbar:SetScript(\"OnMouseDown\", function(_, button)\n\tif IsAltKeyDown() or IsShiftKeyDown() then\n\t\tbar:ClearAllPoints()\n\t\tbar:StartMoving()\n\telseif IsControlKeyDown() and button == \"RightButton\" then\n\t\tbar:ClearAllPoints()\n\t\tbar:SetPoint(unpack(C.position.alt_power_bar))\n\t\tbar:SetUserPlaced(false)\n\tend\nend)\nbar:SetScript(\"OnMouseUp\", function()\n\tbar:StopMovingOrSizing()\nend)\n\n-- Event handling\nbar:RegisterEvent(\"UNIT_POWER_UPDATE\")\nbar:RegisterEvent(\"UNIT_POWER_BAR_SHOW\")\nbar:RegisterEvent(\"UNIT_POWER_BAR_HIDE\")\nbar:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nbar:SetScript(\"OnEvent\", function(self, event)\n\tif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tif not bar:IsUserPlaced() then\n\t\t\tbar:ClearAllPoints()\n\t\t\tbar:SetPoint(unpack(C.position.alt_power_bar))\n\t\tend\n\tend\n\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tif GetUnitPowerBarInfo(\"player\") then\n\t\tself:Show()\n\telse\n\t\tself:Hide()\n\tend\nend)\n\n-- Tooltip\nbar:SetScript(\"OnEnter\", function(self)\n\tlocal name, tooltip = GetUnitPowerBarStrings(\"player\")\n\n\tGameTooltip:SetOwner(self, \"ANCHOR_BOTTOM\", 0, -5)\n\tGameTooltip:AddLine(name, 1, 1, 1)\n\tGameTooltip:AddLine(tooltip, nil, nil, nil, true)\n\n\tGameTooltip:Show()\nend)\nbar:SetScript(\"OnLeave\", GameTooltip_Hide)\n\n-- StatusBar\nlocal status = CreateFrame(\"StatusBar\", \"UIAltPowerBarStatus\", bar)\nstatus:SetFrameLevel(bar:GetFrameLevel() + 1)\nstatus:SetStatusBarTexture(C.media.texture)\nstatus:SetMinMaxValues(0, 100)\nstatus:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 2, -2)\nstatus:SetPoint(\"BOTTOMRIGHT\", bar, \"BOTTOMRIGHT\", -2, 2)\n\nstatus.bg = status:CreateTexture(nil, \"BACKGROUND\")\nstatus.bg:SetAllPoints(status)\nstatus.bg:SetTexture(C.media.texture)\n\nstatus.text = status:CreateFontString(nil, \"OVERLAY\")\nstatus.text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\nstatus.text:SetPoint(\"CENTER\", bar, \"CENTER\", 0, 0)\n\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\n-- Update Function\nlocal update = 1\nstatus:SetScript(\"OnUpdate\", function(self, elapsed)\n\tif not bar:IsShown() then return end\n\tupdate = update + elapsed\n\n\tif update >= 1 then\n\t\tlocal cur = UnitPower(\"player\", ALTERNATE_POWER_INDEX)\n\t\tlocal max = UnitPowerMax(\"player\", ALTERNATE_POWER_INDEX)\n\t\tlocal texture, r, g, b = GetUnitPowerBarTextureInfo(\"player\", 2, 0)\n\t\tif not texture or (r == 1 and g == 1 and b == 1) then\n\t\t\tr, g, b = oUF:ColorGradient(cur, max, 0.8, 0.2, 0.1, 1, 0.8, 0.1, 0.33, 0.59, 0.33)\n\t\tend\n\t\tself:SetMinMaxValues(0, max)\n\t\tself:SetValue(cur)\n\t\tself.text:SetText(cur..\"/\"..max)\n\t\tself:SetStatusBarColor(r, g, b)\n\t\tself.bg:SetVertexColor(r, g, b, 0.25)\n\t\tupdate = 0\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/Bags.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.bag.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on Stuffing(by Hungtar, editor Tukz)\n----------------------------------------------------------------------------------------\nlocal BAGS_BACKPACK = {0, 1, 2, 3, 4, 5}\nlocal BAGS_BANK = {-1, 6, 7, 8, 9, 10, 11, 12}\nlocal ST_NORMAL = 1\nlocal ST_FISHBAG = 2\nlocal ST_SPECIAL = 3\nlocal bag_bars = 0\nlocal unusable\n\n-- Unfit-1.0 Library\nif T.class == \"DEATHKNIGHT\" then\n\tunusable = { -- weapon, armor, dual-wield\n\t\t{Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Staff, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Dagger, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},\n\t\t{Enum.ItemArmorSubclass.Shield}\n\t}\nelseif T.class == \"DEMONHUNTER\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace1H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Staff, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},\n\t\t{Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield}\n\t}\nelseif T.class == \"DRUID\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Axe1H, Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Sword1H, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},\n\t\t{Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},\n\t\ttrue\n\t}\nelseif T.class == \"EVOKER\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},\n\t\t{Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},\n\t\ttrue\n\t}\nelseif T.class == \"HUNTER\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Mace1H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Wand},\n\t\t{Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield}\n\t}\nelseif T.class == \"MAGE\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Axe1H, Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace1H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow},\n\t\t{Enum.ItemArmorSubclass.Leather, Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},\n\t\ttrue\n\t}\nelseif T.class == \"MONK\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Dagger, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},\n\t\t{Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield}\n\t}\nelseif T.class == \"PALADIN\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Staff, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Dagger, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},\n\t\t{},\n\t\ttrue\n\t}\nelseif T.class == \"PRIEST\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Axe1H, Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword1H, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow},\n\t\t{Enum.ItemArmorSubclass.Leather, Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},\n\t\ttrue\n\t}\nelseif T.class == \"ROGUE\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Staff, Enum.ItemWeaponSubclass.Wand},\n\t\t{Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield}\n\t}\nelseif T.class == \"SHAMAN\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword1H, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},\n\t\t{Enum.ItemArmorSubclass.Plate}\n\t}\nelseif T.class == \"WARLOCK\" then\n\tunusable = {\n\t\t{Enum.ItemWeaponSubclass.Axe1H, Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace1H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow},\n\t\t{Enum.ItemArmorSubclass.Leather, Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},\n\t\ttrue\n\t}\nelseif T.class == \"WARRIOR\" then\n\tunusable = {{Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Wand}, {}}\nelse\n\tunusable = {{}, {}}\nend\n\nlocal _unusable = {}\n\nfor i, class in ipairs({Enum.ItemClass.Weapon, Enum.ItemClass.Armor}) do\n\tlocal list = {}\n\tfor _, subclass in ipairs(unusable[i]) do\n\t\tlist[subclass] = true\n\tend\n\n\t_unusable[class] = list\nend\n\nlocal function IsClassUnusable(class, subclass, slot)\n\tif class and subclass and _unusable[class] then\n\t\treturn slot ~= \"\" and _unusable[class][subclass] or slot == \"INVTYPE_WEAPONOFFHAND\" and unusable[3]\n\tend\nend\n\nlocal function IsItemUnusable(...)\n\tif ... then\n\t\tlocal slot, _,_, class, subclass = select(9, GetItemInfo(...))\n\t\treturn IsClassUnusable(class, subclass, slot)\n\tend\nend\n\nStuffing = CreateFrame(\"Frame\", nil, UIParent)\nStuffing:RegisterEvent(\"ADDON_LOADED\")\nStuffing:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nStuffing:SetScript(\"OnEvent\", function(this, event, ...)\n\tif IsAddOnLoaded(\"AdiBags\") or IsAddOnLoaded(\"ArkInventory\") or IsAddOnLoaded(\"cargBags_Nivaya\") or IsAddOnLoaded(\"cargBags\") or IsAddOnLoaded(\"Bagnon\") or IsAddOnLoaded(\"Combuctor\") or IsAddOnLoaded(\"TBag\") or IsAddOnLoaded(\"BaudBag\") then return end\n\tStuffing[event](this, ...)\nend)\n\n-- Drop down menu stuff from Postal\nlocal Stuffing_DDMenu = CreateFrame(\"Frame\", \"StuffingDropDownMenu\")\nStuffing_DDMenu.displayMode = \"MENU\"\nStuffing_DDMenu.info = {}\nStuffing_DDMenu.HideMenu = function()\n\tif UIDROPDOWNMENU_OPEN_MENU == Stuffing_DDMenu then\n\t\tCloseDropDownMenus()\n\tend\nend\n\nlocal function Stuffing_OnShow()\n\tStuffing:PLAYERBANKSLOTS_CHANGED(29)\n\n\tfor i = 0, #BAGS_BACKPACK - 1 do\n\t\tStuffing:BAG_UPDATE(i)\n\tend\n\n\tStuffing:Layout()\n\tStuffing:SearchReset()\n\tPlaySound(SOUNDKIT.IG_BACKPACK_OPEN)\nend\n\nlocal function StuffingBank_OnHide()\n\tif _G[\"StuffingFrameReagent\"] and _G[\"StuffingFrameReagent\"]:IsShown() then return end\n\tCloseBankFrame()\n\tif Stuffing.frame:IsShown() then\n\t\tStuffing.frame:Hide()\n\tend\n\tPlaySound(SOUNDKIT.IG_BACKPACK_CLOSE)\nend\n\nlocal function Stuffing_OnHide()\n\tif _G[\"StuffingFrameReagent\"] and _G[\"StuffingFrameReagent\"]:IsShown() then\n\t\tCloseBankFrame()\n\tend\n\tif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then\n\t\tStuffing.bankFrame:Hide()\n\tend\n\tPlaySound(SOUNDKIT.IG_BACKPACK_CLOSE)\nend\n\nlocal function Stuffing_Open()\n\tif not Stuffing.frame:IsShown() then\n\t\tStuffing.frame:Show()\n\tend\nend\n\nlocal function Stuffing_Close()\n\tC_Timer.After(0.01, function() -- fix showing GameMenu when pressing ESC\n\t\tif Stuffing.frame:IsShown() then\n\t\t\tStuffing.frame:Hide()\n\t\tend\n\tend)\nend\n\nlocal function Stuffing_Toggle()\n\tif Stuffing.frame:IsShown() then\n\t\tStuffing.frame:Hide()\n\telse\n\t\tStuffing.frame:Show()\n\tend\nend\n\n-- Bag slot stuff\nlocal trashButton = {}\nlocal trashBag = {}\n\nlocal ItemDB = {}\nlocal function _getRealItemLevel(link, bag, slot)\n\tif ItemDB[link] then return ItemDB[link] end\n\n\tlocal realItemLevel = C_Item.GetCurrentItemLevel(ItemLocation:CreateFromBagAndSlot(bag, slot))\n\n\tItemDB[link] = tonumber(realItemLevel)\n\treturn realItemLevel\nend\n\nfunction Stuffing:SlotUpdate(b)\n\tlocal texture, count, locked, quality = GetContainerItemInfo(b.bag, b.slot)\n\ttexture = texture or 0\n\tlocal clink = C_Container.GetContainerItemLink(b.bag, b.slot)\n\tlocal questData = C_Container.GetContainerItemQuestInfo(b.bag, b.slot)\n\tlocal isQuestItem, questId, isActiveQuest = questData.isQuestItem, questData.questID, questData.isActive\n\tlocal itemIsUpgrade\n\n\t-- Set all slot color to default ShestakUI on update\n\tif not b.frame.lock then\n\t\tb.frame:SetBackdropBorderColor(unpack(C.media.border_color))\n\tend\n\n\tif b.cooldown and StuffingFrameBags and StuffingFrameBags:IsShown() then\n\t\tlocal start, duration, enable = C_Container.GetContainerItemCooldown(b.bag, b.slot)\n\t\tCooldownFrame_Set(b.cooldown, start, duration, enable)\n\tend\n\n\tif C.bag.ilvl == true then\n\t\tb.frame.text:SetText(\"\")\n\tend\n\n\tb.frame.Azerite:Hide()\n\tb.frame.Conduit:Hide()\n\tb.frame.Conduit2:Hide()\n\tb.frame.profQuality:Hide()\n\n\tb.frame:UpdateItemContextMatching() -- Update Scrap items\n\n\tif b.frame.UpgradeIcon then\n\t\tb.frame.UpgradeIcon:SetPoint(\"TOPLEFT\", C.bag.button_size/2.7, -C.bag.button_size/2.7)\n\t\tb.frame.UpgradeIcon:SetSize(C.bag.button_size/1.7, C.bag.button_size/1.7)\n\t\t-- Use Pawn's (third-party addon) function if present; else fallback to Blizzard's.\n\t\t-- 10.0.2 Build 46658 No longer have IsContainerItemAnUpgrade\n\t\titemIsUpgrade = PawnIsContainerItemAnUpgrade and PawnIsContainerItemAnUpgrade(b.frame:GetParent():GetID(), b.frame:GetID())\n\t\tb.frame.UpgradeIcon:SetShown(itemIsUpgrade or false)\n\tend\n\n\tif IsAddOnLoaded(\"CanIMogIt\") then\n\t\tCIMI_AddToFrame(b.frame, ContainerFrameItemButton_CIMIUpdateIcon)\n\t\tContainerFrameItemButton_CIMIUpdateIcon(b.frame.CanIMogItOverlay)\n\tend\n\n\tif clink then\n\t\tb.name, _, _, b.itemlevel, b.level, _, _, _, _, _, _, b.itemClassID, b.itemSubClassID = GetItemInfo(clink)\n\t\tif not b.name then\t-- Keystone bug\n\t\t\tb.name = clink:match(\"%[(.-)%]\") or \"\"\n\t\tend\n\n\t\tif C.bag.ilvl == true and b.itemlevel and quality > 1 and (b.itemClassID == 2 or b.itemClassID == 4 or (b.itemClassID == 3 and b.itemSubClassID == 11)) then\n\t\t\tb.itemlevel = _getRealItemLevel(clink, b.bag, b.slot) or b.itemlevel\n\t\t\tb.frame.text:SetText(b.itemlevel)\n\t\tend\n\n\t\tif C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItemByID(clink) then\n\t\t\tb.frame.Azerite:SetAtlas(\"AzeriteIconFrame\")\n\t\t\tb.frame.Azerite:Show()\n\t\telseif C_Soulbinds.IsItemConduitByItemInfo(clink) then\n\t\t\tb.frame.Conduit:SetAtlas(\"ConduitIconFrame\")\n\t\t\tb.frame.Conduit:Show()\n\t\t\tlocal color = BAG_ITEM_QUALITY_COLORS[quality]\n\t\t\tif color then\n\t\t\t\tb.frame.Conduit:SetVertexColor(color.r, color.g, color.b)\n\t\t\tend\n\t\t\tb.frame.Conduit2:SetAtlas(\"ConduitIconFrame-Corners\")\n\t\t\tb.frame.Conduit2:Show()\n\t\tend\n\n\t\tlocal profQual = C_TradeSkillUI.GetItemReagentQualityByItemInfo(clink) or C_TradeSkillUI.GetItemCraftedQualityByItemInfo(clink)\n\t\tif profQual then\n\t\t\tlocal atlas = (\"Professions-Icon-Quality-Tier%d-Inv\"):format(profQual)\n\t\t\tb.frame.profQuality:SetAtlas(atlas, TextureKitConstants.UseAtlasSize)\n\t\t\tb.frame.profQuality:Show()\n\t\tend\n\n\t\tif (IsItemUnusable(clink) or b.level and b.level > T.level) and not locked then\n\t\t\t_G[b.frame:GetName()..\"IconTexture\"]:SetVertexColor(1, 0.1, 0.1)\n\t\telse\n\t\t\t_G[b.frame:GetName()..\"IconTexture\"]:SetVertexColor(1, 1, 1)\n\t\tend\n\n\t\t-- Color slot according to item quality\n\t\tif not b.frame.lock and quality and quality > 1 and not (isQuestItem or questId) then\n\t\t\tlocal R, G, B = GetItemQualityColor(quality)\n\t\t\tif b.frame then\n\t\t\t\tb.frame:SetBackdropBorderColor(R, G, B)\n\t\t\tend\n\t\telseif questId and not isActiveQuest then\n\t\t\tb.frame:SetBackdropBorderColor(1, 0.3, 0.3)\n\t\telseif questId or isQuestItem then\n\t\t\tb.frame:SetBackdropBorderColor(1, 1, 0)\n\t\tend\n\telse\n\t\tb.name, b.level = nil, nil\n\tend\n\n\tSetItemButtonTexture(b.frame, texture)\n\tSetItemButtonCount(b.frame, count)\n\tSetItemButtonDesaturated(b.frame, locked)\n\n\tif C.bag.new_items then\n\t\tlocal IsNewItem = C_NewItems.IsNewItem(b.bag, b.slot)\n\t\tif IsNewItem then\n\t\t\tif not b.frame.Animation then\n\t\t\t\tb.frame.Animation = b.frame:CreateAnimationGroup()\n\t\t\t\tb.frame.Animation:SetLooping(\"BOUNCE\")\n\n\t\t\t\tb.frame.Animation.FadeOut = b.frame.Animation:CreateAnimation(\"Alpha\")\n\t\t\t\tb.frame.Animation.FadeOut:SetFromAlpha(1)\n\t\t\t\tb.frame.Animation.FadeOut:SetToAlpha(0.6)\n\t\t\t\tb.frame.Animation.FadeOut:SetDuration(0.4)\n\t\t\t\tb.frame.Animation.FadeOut:SetSmoothing(\"IN_OUT\")\n\t\t\t\tb.frame:HookScript(\"OnEnter\", function(self)\n\t\t\t\t\tlocal IsNewItem = C_NewItems.IsNewItem(b.bag, b.slot)\n\n\t\t\t\t\tif not IsNewItem and b.frame.Animation:IsPlaying() then\n\t\t\t\t\t\tb.frame.Animation:Stop()\n\t\t\t\t\tend\n\t\t\t\tend)\n\t\t\tend\n\n\t\t\tif not b.frame.Animation:IsPlaying() then\n\t\t\t\tb.frame.Animation:Play()\n\t\t\tend\n\t\tend\n\tend\n\n\tb.frame:Show()\nend\n\nfunction Stuffing:BagSlotUpdate(bag)\n\tif not self.buttons then\n\t\treturn\n\tend\n\n\tfor _, v in ipairs(self.buttons) do\n\t\tif v.bag == bag then\n\t\t\tself:SlotUpdate(v)\n\t\tend\n\tend\nend\n\nfunction Stuffing:UpdateCooldowns(b)\n\tif b.cooldown and StuffingFrameBags and StuffingFrameBags:IsShown() then\n\t\tlocal start, duration, enable = C_Container.GetContainerItemCooldown(b.bag, b.slot)\n\t\tCooldownFrame_Set(b.cooldown, start, duration, enable)\n\tend\nend\n\nfunction Stuffing:CreateReagentContainer()\n\tReagentBankFrame:StripTextures()\n\n\tlocal Reagent = CreateFrame(\"Frame\", \"StuffingFrameReagent\", UIParent)\n\tlocal SwitchBankButton = CreateFrame(\"Button\", nil, Reagent)\n\tlocal NumRows, LastRowButton, NumButtons, LastButton = 0, ReagentBankFrameItem1, 1, ReagentBankFrameItem1\n\tlocal Deposit = ReagentBankFrame.DespositButton\n\n\tReagent:SetWidth(((C.bag.button_size + C.bag.button_space) * C.bag.bank_columns) + 17)\n\tReagent:SetPoint(\"TOPLEFT\", _G[\"StuffingFrameBank\"], \"TOPLEFT\", 0, 0)\n\tReagent:SetTemplate(\"Transparent\")\n\tReagent:SetFrameStrata(_G[\"StuffingFrameBank\"]:GetFrameStrata())\n\tReagent:SetFrameLevel(_G[\"StuffingFrameBank\"]:GetFrameLevel() + 5)\n\tReagent:EnableMouse(true)\n\tReagent:SetMovable(true)\n\tReagent:SetClampedToScreen(true)\n\tReagent:SetClampRectInsets(0, 0, 0, -20)\n\tReagent:SetScript(\"OnMouseDown\", function(self, button)\n\t\tif IsShiftKeyDown() and button == \"LeftButton\" then\n\t\t\tself:StartMoving()\n\t\tend\n\tend)\n\tReagent:SetScript(\"OnMouseUp\", Reagent.StopMovingOrSizing)\n\n\tSwitchBankButton:SetSize(80, 20)\n\tSwitchBankButton:SkinButton()\n\tSwitchBankButton:SetPoint(\"TOPLEFT\", 10, -4)\n\tSwitchBankButton:FontString(\"text\", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)\n\tSwitchBankButton.text:SetPoint(\"CENTER\")\n\tSwitchBankButton.text:SetText(BANK)\n\tSwitchBankButton:SetScript(\"OnClick\", function()\n\t\tReagent:Hide()\n\t\t_G[\"StuffingFrameBank\"]:Show()\n\t\tBankFrame_ShowPanel(BANK_PANELS[1].name)\n\t\tPlaySound(SOUNDKIT.IG_BACKPACK_OPEN)\n\tend)\n\n\tDeposit:SetParent(Reagent)\n\tDeposit:ClearAllPoints()\n\tDeposit:SetSize(170, 20)\n\tDeposit:SetPoint(\"TOPLEFT\", SwitchBankButton, \"TOPRIGHT\", 3, 0)\n\tDeposit:SkinButton()\n\tDeposit:FontString(\"text\", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)\n\tDeposit.text:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)\n\tDeposit.text:SetTextColor(1, 1, 1)\n\tDeposit.text:SetText(REAGENTBANK_DEPOSIT)\n\tDeposit:SetFontString(Deposit.text)\n\n\t-- Close button\n\tlocal Close = CreateFrame(\"Button\", \"StuffingCloseButtonReagent\", Reagent, \"UIPanelCloseButton\")\n\tT.SkinCloseButton(Close, nil, nil, true)\n\tClose:SetSize(15, 15)\n\tClose:RegisterForClicks(\"AnyUp\")\n\tClose:SetScript(\"OnClick\", function(self, btn)\n\t\tif btn == \"RightButton\" then\n\t\t\tif Stuffing_DDMenu.initialize ~= Stuffing.Menu then\n\t\t\t\tCloseDropDownMenus()\n\t\t\t\tStuffing_DDMenu.initialize = Stuffing.Menu\n\t\t\tend\n\t\t\tToggleDropDownMenu(nil, nil, Stuffing_DDMenu, self:GetName(), 0, 0)\n\t\t\treturn\n\t\telse\n\t\t\tReagent:Hide()\n\t\t\tStuffingBank_OnHide()\n\t\tend\n\tend)\n\n\tlocal tooltip_hide = function()\n\t\tGameTooltip:Hide()\n\tend\n\n\tlocal tooltip_show = function(self)\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_LEFT\", 19, 7)\n\t\tGameTooltip:ClearLines()\n\t\tGameTooltip:SetText(L_BAG_RIGHT_CLICK_CLOSE)\n\tend\n\n\tClose:HookScript(\"OnEnter\", tooltip_show)\n\tClose:HookScript(\"OnLeave\", tooltip_hide)\n\n\tfor i = 1, 98 do\n\t\tlocal button = _G[\"ReagentBankFrameItem\"..i]\n\t\tlocal icon = _G[button:GetName()..\"IconTexture\"]\n\t\tlocal count = _G[button:GetName()..\"Count\"]\n\n\t\tReagentBankFrame:SetParent(Reagent)\n\t\tReagentBankFrame:ClearAllPoints()\n\t\tReagentBankFrame:SetAllPoints()\n\n\t\tbutton:StyleButton()\n\t\tbutton:SetTemplate(\"Default\")\n\t\tbutton:SetNormalTexture(0)\n\t\tbutton.IconBorder:SetAlpha(0)\n\n\t\tbutton:ClearAllPoints()\n\t\tbutton:SetSize(C.bag.button_size, C.bag.button_size)\n\n\t\tlocal _, _, _, quality = GetContainerItemInfo(-3, i)\n\t\tlocal clink = C_Container.GetContainerItemLink(-3, i)\n\t\tif clink then\n\t\t\tif quality and quality > 1 then\n\t\t\t\tlocal r, g, b = GetItemQualityColor(quality)\n\t\t\t\tbutton:SetBackdropBorderColor(r, g, b)\n\t\t\tend\n\t\tend\n\n\t\tif i == 1 then\n\t\t\tbutton:SetPoint(\"TOPLEFT\", Reagent, \"TOPLEFT\", 10, -27)\n\t\t\tLastRowButton = button\n\t\t\tLastButton = button\n\t\telseif NumButtons == C.bag.bank_columns then\n\t\t\tbutton:SetPoint(\"TOPRIGHT\", LastRowButton, \"TOPRIGHT\", 0, -(C.bag.button_space + C.bag.button_size))\n\t\t\tbutton:SetPoint(\"BOTTOMLEFT\", LastRowButton, \"BOTTOMLEFT\", 0, -(C.bag.button_space + C.bag.button_size))\n\t\t\tLastRowButton = button\n\t\t\tNumRows = NumRows + 1\n\t\t\tNumButtons = 1\n\t\telse\n\t\t\tbutton:SetPoint(\"TOPRIGHT\", LastButton, \"TOPRIGHT\", (C.bag.button_space + C.bag.button_size), 0)\n\t\t\tbutton:SetPoint(\"BOTTOMLEFT\", LastButton, \"BOTTOMLEFT\", (C.bag.button_space + C.bag.button_size), 0)\n\t\t\tNumButtons = NumButtons + 1\n\t\tend\n\n\t\ticon:CropIcon()\n\n\t\tcount:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)\n\t\tcount:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)\n\t\tcount:SetPoint(\"BOTTOMRIGHT\", 1, 1)\n\n\t\tLastButton = button\n\tend\n\tReagent:SetHeight(((C.bag.button_size + C.bag.button_space) * (NumRows + 1) + 40) - C.bag.button_space)\n\n\tMoneyFrame_Update(ReagentBankFrame.UnlockInfo.CostMoneyFrame, GetReagentBankCost())\n\tReagentBankFrameUnlockInfo:StripTextures()\n\tReagentBankFrameUnlockInfo:SetAllPoints(Reagent)\n\tReagentBankFrameUnlockInfo:SetTemplate(\"Overlay\")\n\tReagentBankFrameUnlockInfo:SetFrameStrata(\"FULLSCREEN\")\n\tReagentBankFrameUnlockInfoPurchaseButton:SkinButton()\nend\n\nfunction Stuffing:BagFrameSlotNew(p, slot)\n\tfor _, v in ipairs(self.bagframe_buttons) do\n\t\tif v.slot == slot then\n\t\t\treturn v, false\n\t\tend\n\tend\n\n\tlocal ret = {}\n\n\tif slot > 5 then\n\t\tret.slot = slot\n\t\tslot = slot - 5\n\t\tret.frame = CreateFrame(\"ItemButton\", \"StuffingBBag\"..slot..\"Slot\", p, \"BankItemButtonBagTemplate\")\n\t\tMixin(ret.frame, BackdropTemplateMixin)\n\t\tret.frame:StripTextures()\n\t\tret.frame:SetID(slot)\n\t\thooksecurefunc(ret.frame.IconBorder, \"SetVertexColor\", function(self, r, g, b)\n\t\t\tif r ~= 0.65882 and g ~= 0.65882 and b ~= 0.65882 then\n\t\t\t\tself:GetParent():SetBackdropBorderColor(r, g, b)\n\t\t\tend\n\t\t\tself:SetTexture(\"\")\n\t\tend)\n\n\t\thooksecurefunc(ret.frame.IconBorder, \"Hide\", function(self)\n\t\t\tself:GetParent():SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend)\n\n\t\ttable.insert(self.bagframe_buttons, ret)\n\n\t\tBankFrameItemButton_Update(ret.frame)\n\n\t\tif not ret.frame.tooltipText then\n\t\t\tret.frame.tooltipText = \"\"\n\t\tend\n\n\t\tret.frame.ID = ret.frame:GetInventorySlot()\n\t\tlocal quality = GetInventoryItemQuality(\"player\", ret.frame.ID)\n\t\tif quality then\n\t\t\tret.frame.quality = quality\n\t\tend\n\n\t\tif slot > GetNumBankSlots() then\n\t\t\tSetItemButtonTextureVertexColor(ret.frame, 1.0, 0.1, 0.1)\n\t\telse\n\t\t\tSetItemButtonTextureVertexColor(ret.frame, 1.0, 1.0, 1.0)\n\t\tend\n\telse\n\t\tret.frame = CreateFrame(\"ItemButton\", \"StuffingFBag\"..(slot + 1)..\"Slot\", p, \"\")\n\t\tMixin(ret.frame, BackdropTemplateMixin)\n\n\t\tret.frame.ID = C_Container.ContainerIDToInventoryID(slot + 1)\n\t\tlocal bag_tex = GetInventoryItemTexture(\"player\", ret.frame.ID)\n\t\t_G[ret.frame:GetName()..\"IconTexture\"]:SetTexture(bag_tex)\n\t\tret.frame:SetID(ret.frame.ID)\n\n\t\tret.frame:RegisterForDrag(\"LeftButton\")\n\t\tret.frame:SetScript(\"OnDragStart\", function(self)\n\t\t\tPickupBagFromSlot(self:GetID())\n\t\tend)\n\t\tret.frame:SetScript(\"OnReceiveDrag\", function(self)\n\t\t\tPutItemInBag(self:GetID())\n\t\tend)\n\n\t\tlocal tooltip_hide = function()\n\t\t\tGameTooltip:Hide()\n\t\tend\n\n\t\tlocal tooltip_show = function(self)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_LEFT\", 19, 7)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tif GetInventoryItemLink(\"player\", ret.frame.ID) then\n\t\t\t\tGameTooltip:SetInventoryItem(\"player\", self:GetID())\n\t\t\telse\n\t\t\t\tlocal text = ret.slot == 4 and EQUIP_CONTAINER_REAGENT or EQUIP_CONTAINER\n\t\t\t\tGameTooltip:AddLine(text)\n\t\t\t\tGameTooltip:Show()\n\t\t\tend\n\t\tend\n\n\t\tret.frame:HookScript(\"OnEnter\", tooltip_show)\n\t\tret.frame:HookScript(\"OnLeave\", tooltip_hide)\n\n\t\tlocal quality = GetInventoryItemQuality(\"player\", ret.frame.ID)\n\t\tif quality then\n\t\t\tret.frame.quality = quality\n\t\t-- else\n\t\t\t-- C_Timer.After(1, function() -- TODO: Test it if quality not returned after first open\n\t\t\t\t-- ret.frame.quality = GetInventoryItemQuality(\"player\", ret.frame.ID)\n\t\t\t-- end)\n\t\tend\n\n\t\tret.slot = slot\n\t\ttable.insert(self.bagframe_buttons, ret)\n\tend\n\n\tret.frame:StyleButton()\n\tret.frame:SetTemplate(\"Default\")\n\tret.frame:SetNormalTexture((0))\n\n\tret.icon = _G[ret.frame:GetName()..\"IconTexture\"]\n\tret.icon:CropIcon()\n\n\t-- C_Timer.After(2, function()\n\tif ret.frame.quality and ret.frame.quality > 1 then\n\t\tlocal r, g, b = GetItemQualityColor(ret.frame.quality)\n\t\tret.frame:SetBackdropBorderColor(r, g, b)\n\tend\n\t-- end)\n\n\treturn ret\nend\n\nfunction Stuffing:SlotNew(bag, slot)\n\tfor _, v in ipairs(self.buttons) do\n\t\tif v.bag == bag and v.slot == slot then\n\t\t\tv.lock = false\n\t\t\treturn v, false\n\t\tend\n\tend\n\n\tlocal tpl = \"ContainerFrameItemButtonTemplate\"\n\n\tif bag == -1 then\n\t\ttpl = \"BankItemButtonGenericTemplate\"\n\tend\n\n\tlocal ret = {}\n\n\tif #trashButton > 0 then\n\t\tlocal f = -1\n\t\tfor i, v in ipairs(trashButton) do\n\t\t\tlocal b, s = v:GetName():match(\"(%d+)_(%d+)\")\n\n\t\t\tb = tonumber(b)\n\t\t\ts = tonumber(s)\n\n\t\t\tif b == bag and s == slot then\n\t\t\t\tf = i\n\t\t\t\tbreak\n\t\t\telse\n\t\t\t\tv:Hide()\n\t\t\tend\n\t\tend\n\n\t\tif f ~= -1 then\n\t\t\tret.frame = trashButton[f]\n\t\t\ttable.remove(trashButton, f)\n\t\t\tret.frame:Show()\n\t\tend\n\tend\n\n\tif not ret.frame then\n\t\tret.frame = CreateFrame(\"ItemButton\", \"StuffingBag\"..bag..\"_\"..slot, self.bags[bag], tpl)\n\t\tret.frame:StyleButton()\n\t\tret.frame:SetTemplate(\"Default\")\n\t\tret.frame:SetNormalTexture(0)\n\t\tret.frame:SetFrameStrata(\"HIGH\")\n\n\t\tret.icon = _G[ret.frame:GetName()..\"IconTexture\"]\n\t\tret.icon:CropIcon()\n\n\t\tret.count = _G[ret.frame:GetName()..\"Count\"]\n\t\tret.count:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)\n\t\tret.count:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)\n\t\tret.count:SetPoint(\"BOTTOMRIGHT\", 1, 1)\n\n\t\tif C.bag.ilvl == true then\n\t\t\tret.frame.text = ret.frame:CreateFontString(nil, \"ARTWORK\")\n\t\t\tret.frame.text:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)\n\t\t\tret.frame.text:SetPoint(\"TOPLEFT\", 1, -1)\n\t\t\tret.frame.text:SetTextColor(1, 1, 0)\n\t\tend\n\n\t\tret.frame.Azerite = ret.frame:CreateTexture(nil, \"ARTWORK\")\n\t\tret.frame.Azerite:SetAtlas(\"AzeriteIconFrame\")\n\t\tret.frame.Azerite:SetPoint(\"TOPLEFT\", ret.frame, 1, -1)\n\t\tret.frame.Azerite:SetPoint(\"BOTTOMRIGHT\", ret.frame, -1, 1)\n\t\tret.frame.Azerite:Hide()\n\n\t\tret.frame.Conduit = ret.frame:CreateTexture(nil, \"ARTWORK\")\n\t\tret.frame.Conduit:SetAtlas(\"ConduitIconFrame\")\n\t\tret.frame.Conduit:SetPoint(\"TOPLEFT\", ret.frame, 2, -2)\n\t\tret.frame.Conduit:SetPoint(\"BOTTOMRIGHT\", ret.frame, -2, 2)\n\t\tret.frame.Conduit:Hide()\n\n\t\tret.frame.Conduit2 = ret.frame:CreateTexture(nil, \"ARTWORK\")\n\t\tret.frame.Conduit2:SetAtlas(\"ConduitIconFrame-Corners\")\n\t\tret.frame.Conduit2:SetPoint(\"TOPLEFT\", ret.frame, 2, -2)\n\t\tret.frame.Conduit2:SetPoint(\"BOTTOMRIGHT\", ret.frame, -2, 2)\n\t\tret.frame.Conduit2:Hide()\n\n\t\tret.frame.profQuality = ret.frame:CreateTexture(nil, \"ARTWORK\")\n\t\tret.frame.profQuality:SetPoint(\"TOPLEFT\", ret.frame, 0, 0)\n\t\tret.frame.profQuality:Hide()\n\n\t\tlocal Battlepay = _G[ret.frame:GetName()].BattlepayItemTexture\n\t\tif Battlepay then\n\t\t\tBattlepay:SetAlpha(0)\n\t\tend\n\tend\n\n\tret.bag = bag\n\tret.slot = slot\n\tret.frame:SetID(slot)\n\n\tret.cooldown = _G[ret.frame:GetName()..\"Cooldown\"]\n\tret.cooldown:Show()\n\n\tself:SlotUpdate(ret)\n\n\treturn ret, true\nend\n\n-- From OneBag\nlocal BAGTYPE_PROFESSION = 0x0008 + 0x0010 + 0x0020 + 0x0040 + 0x0080 + 0x0200 + 0x0400 + 0x10000\nlocal BAGTYPE_FISHING = 32768\n\nfunction Stuffing:BagType(bag)\n\tlocal bagType = select(2, C_Container.GetContainerNumFreeSlots(bag))\n\n\tif bagType and bit.band(bagType, BAGTYPE_FISHING) > 0 then\n\t\treturn ST_FISHBAG\n\telseif bagType and bit.band(bagType, BAGTYPE_PROFESSION) > 0 then\n\t\treturn ST_SPECIAL\n\tend\n\n\treturn ST_NORMAL\nend\n\nfunction Stuffing:BagNew(bag, f)\n\tfor _, v in pairs(self.bags) do\n\t\tif v:GetID() == bag then\n\t\t\tv.bagType = self:BagType(bag)\n\t\t\treturn v\n\t\tend\n\tend\n\n\tlocal ret\n\n\tif #trashBag > 0 then\n\t\tlocal f = -1\n\t\tfor i, v in pairs(trashBag) do\n\t\t\tif v:GetID() == bag then\n\t\t\t\tf = i\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\n\t\tif f ~= -1 then\n\t\t\tret = trashBag[f]\n\t\t\ttable.remove(trashBag, f)\n\t\t\tret:Show()\n\t\t\tret.bagType = self:BagType(bag)\n\t\t\treturn ret\n\t\tend\n\tend\n\n\tret = CreateFrame(\"Frame\", \"StuffingBag\"..bag, f)\n\tret.bagType = self:BagType(bag)\n\n\tret:SetID(bag)\n\treturn ret\nend\n\nlocal bind = {\n\t[0] = \"\",\n\t[1] = \"bop bound\"..ITEM_BIND_ON_PICKUP,\n\t[2] = \"boe\"..ITEM_BIND_ON_EQUIP,\n\t[3] = ITEM_BIND_ON_USE,\n\t[4] = ITEM_BIND_QUEST\n}\n\nlocal bindAccount = {\n\t[ITEM_ACCOUNTBOUND] = true,\n\t[ITEM_BIND_TO_ACCOUNT] = true,\n\t[ITEM_BNETACCOUNTBOUND] = true,\n}\n\nfunction Stuffing:SearchUpdate(str)\n\tstr = string.lower(str)\n\n\tfor _, b in ipairs(self.buttons) do\n\t\tif b.frame and not b.name then\n\t\t\tif str == \"\" then\n\t\t\t\tb.frame.searchOverlay:Hide()\n\t\t\telse\n\t\t\t\tb.frame.searchOverlay:Show()\n\t\t\tend\n\t\tend\n\t\tif b.name then\n\t\t\tlocal ilink = C_Container.GetContainerItemLink(b.bag, b.slot)\n\t\t\tif ilink then\n\t\t\t\tlocal _, setName = C_Container.GetContainerItemEquipmentSetInfo(b.bag, b.slot)\n\t\t\t\tsetName = setName or \"\"\n\t\t\t\tlocal _, _, _, _, minLevel, class, subclass, _, equipSlot, _, _, _, _, bindType = GetItemInfo(ilink)\n\t\t\t\tclass = class or \"\"\n\t\t\t\tsubclass = subclass or \"\"\n\t\t\t\tequipSlot = equipSlot or \"\"\n\t\t\t\tbindType = bind[bindType] or \"\"\n\t\t\t\tminLevel = minLevel or 1\n\t\t\t\tlocal isBoA = false\n\t\t\t\tif str and str == \"boa\" then\n\t\t\t\t\tlocal data = C_TooltipInfo.GetBagItem(b.bag, b.slot)\n\t\t\t\t\tif data then\n\t\t\t\t\t\tfor j = 2, 5 do\n\t\t\t\t\t\t\tlocal lineData = data.lines[j]\n\t\t\t\t\t\t\tif not lineData then break end\n\t\t\t\t\t\t\tlocal argVal = lineData.args\n\t\t\t\t\t\t\tif argVal then\n\t\t\t\t\t\t\t\tlocal lineText = argVal[2] and argVal[2].stringVal\n\t\t\t\t\t\t\t\tlocal bindOn = lineText and bindAccount[lineText]\n\t\t\t\t\t\t\t\tif bindOn then\n\t\t\t\t\t\t\t\t\tisBoA = true\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tif not isBoA and not string.find(string.lower(b.name), str) and not string.find(string.lower(setName), str) and not string.find(string.lower(class), str) and not string.find(string.lower(subclass), str) and not string.find(string.lower(equipSlot), str) and not string.find(string.lower(bindType), str) then\n\t\t\t\t\tif IsItemUnusable(b.name) or minLevel > T.level then\n\t\t\t\t\t\t_G[b.frame:GetName()..\"IconTexture\"]:SetVertexColor(0.5, 0.5, 0.5)\n\t\t\t\t\tend\n\t\t\t\t\tSetItemButtonDesaturated(b.frame, true)\n\t\t\t\t\tb.frame.searchOverlay:Show()\n\t\t\t\telse\n\t\t\t\t\tif IsItemUnusable(b.name) or minLevel > T.level then\n\t\t\t\t\t\t_G[b.frame:GetName()..\"IconTexture\"]:SetVertexColor(1, 0.1, 0.1)\n\t\t\t\t\tend\n\t\t\t\t\tSetItemButtonDesaturated(b.frame, false)\n\t\t\t\t\tb.frame.searchOverlay:Hide()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tif ReagentBankFrameItem1 then\n\t\tfor slotID = 1, 98 do\n\t\t\tlocal _, _, _, _, _, _, ilink = GetContainerItemInfo(-3, slotID)\n\t\t\tlocal button = _G[\"ReagentBankFrameItem\"..slotID]\n\t\t\tif ilink then\n\t\t\t\tlocal name, _, _, _, minLevel, class, subclass = GetItemInfo(ilink)\n\t\t\t\tclass = class or \"\"\n\t\t\t\tsubclass = subclass or \"\"\n\t\t\t\tminLevel = minLevel or 1\n\t\t\t\tif not string.find(string.lower(name), str) and not string.find(string.lower(class), str) and not string.find(string.lower(subclass), str) then\n\t\t\t\t\tif IsItemUnusable(name) or minLevel > T.level then\n\t\t\t\t\t\t_G[button:GetName()..\"IconTexture\"]:SetVertexColor(0.5, 0.5, 0.5)\n\t\t\t\t\tend\n\t\t\t\t\tSetItemButtonDesaturated(button, true)\n\t\t\t\t\tbutton.searchOverlay:Show()\n\t\t\t\telse\n\t\t\t\t\tif IsItemUnusable(name) or minLevel > T.level then\n\t\t\t\t\t\t_G[button:GetName()..\"IconTexture\"]:SetVertexColor(1, 0.1, 0.1)\n\t\t\t\t\tend\n\t\t\t\t\tSetItemButtonDesaturated(button, false)\n\t\t\t\t\tbutton.searchOverlay:Hide()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction Stuffing:SearchReset()\n\tfor _, b in ipairs(self.buttons) do\n\t\tif IsItemUnusable(b.name) or (b.level and b.level > T.level) then\n\t\t\t_G[b.frame:GetName()..\"IconTexture\"]:SetVertexColor(1, 0.1, 0.1)\n\t\tend\n\t\tb.frame.searchOverlay:Hide()\n\t\tSetItemButtonDesaturated(b.frame, false)\n\tend\n\n\tself.frame.editbox:SetText(\"\")\n\tself.frame.editbox:Hide()\n\tself.frame.editbox:ClearFocus()\n\tself.frame.detail:Show()\nend\n\nlocal function DragFunction(self, mode)\n\tfor index = 1, select(\"#\", self:GetChildren()) do\n\t\tlocal frame = select(index, self:GetChildren())\n\t\tif frame:GetName() and frame:GetName():match(\"StuffingBag\") then\n\t\t\tif mode then\n\t\t\t\tframe:Hide()\n\t\t\telse\n\t\t\t\tframe:Show()\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction Stuffing:CreateBagFrame(w)\n\tlocal n = \"StuffingFrame\"..w\n\tlocal f = CreateFrame(\"Frame\", n, UIParent)\n\tf:EnableMouse(true)\n\tf:SetMovable(true)\n\tf:SetFrameStrata(\"MEDIUM\")\n\tf:SetFrameLevel(10)\n\tf:RegisterForDrag(\"LeftButton\")\n\tf:SetScript(\"OnDragStart\", function(self)\n\t\tif IsAltKeyDown() or IsShiftKeyDown() then\n\t\t\tself:StartMoving()\n\t\t\tDragFunction(self, true)\n\t\t\tf.moved = true\n\t\tend\n\tend)\n\n\tf:SetScript(\"OnDragStop\", function(self)\n\t\tif f.moved then\t-- prevent false register without modifier key\n\t\t\tself:StopMovingOrSizing()\n\t\t\tDragFunction(self, false)\n\t\t\tlocal ap, p, rp, x, y = f:GetPoint()\n\t\t\tif not p then p = UIParent end\n\t\t\tlocal positionTable = T.CurrentProfile()\n\t\t\tpositionTable[f:GetName()] = {ap, p:GetName(), rp, x, y}\n\t\t\tf.moved = nil\n\t\tend\n\tend)\n\n\tf:SetScript(\"OnMouseDown\", function(_, button)\n\t\tif IsControlKeyDown() and button == \"RightButton\" then\n\t\t\tf:ClearAllPoints()\n\t\t\tif w == \"Bank\" then\n\t\t\t\tf:SetPoint(unpack(C.position.bank))\n\t\t\telse\n\t\t\t\tf:SetPoint(unpack(C.position.bag))\n\t\t\tend\n\t\t\tf:SetUserPlaced(false)\n\t\t\tlocal positionTable = T.CurrentProfile()\n\t\t\tpositionTable[f:GetName()] = nil\n\t\tend\n\tend)\n\n\tlocal positionTable = T.CurrentProfile()\n\tif positionTable[f:GetName()] then\n\t\tf:SetPoint(unpack(positionTable[f:GetName()]))\n\telse\n\t\tif w == \"Bank\" then\n\t\t\tf:SetPoint(unpack(C.position.bank))\n\t\telse\n\t\t\tf:SetPoint(unpack(C.position.bag))\n\t\tend\n\tend\n\n\tif w == \"Bank\" then\n\t\t-- Reagent button\n\t\tf.b_reagent = CreateFrame(\"Button\", \"StuffingReagentButton\"..w, f)\n\t\tf.b_reagent:SetSize(105, 20)\n\t\tf.b_reagent:SetPoint(\"TOPLEFT\", 10, -4)\n\t\tf.b_reagent:RegisterForClicks(\"AnyUp\")\n\t\tf.b_reagent:SkinButton()\n\t\tf.b_reagent:SetScript(\"OnClick\", function()\n\t\t\tBankFrame_ShowPanel(BANK_PANELS[2].name)\n\t\t\tPlaySound(SOUNDKIT.IG_BACKPACK_OPEN)\n\t\t\tif not ReagentBankFrame.isMade then\n\t\t\t\tself:CreateReagentContainer()\n\t\t\t\tReagentBankFrame.isMade = true\n\t\t\telse\n\t\t\t\t_G[\"StuffingFrameReagent\"]:Show()\n\t\t\tend\n\t\t\t_G[\"StuffingFrameBank\"]:Hide()\n\t\tend)\n\t\tf.b_reagent:FontString(\"text\", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)\n\t\tf.b_reagent.text:SetPoint(\"CENTER\")\n\t\tf.b_reagent.text:SetText(REAGENT_BANK)\n\t\tf.b_reagent:SetFontString(f.b_reagent.text)\n\n\t\t-- Buy button\n\t\tf.b_purchase = CreateFrame(\"Button\", \"StuffingPurchaseButton\"..w, f)\n\t\tf.b_purchase:SetSize(80, 20)\n\t\tf.b_purchase:SetPoint(\"TOPLEFT\", f.b_reagent, \"TOPRIGHT\", 3, 0)\n\t\tf.b_purchase:RegisterForClicks(\"AnyUp\")\n\t\tf.b_purchase:SkinButton()\n\t\tf.b_purchase:SetScript(\"OnClick\", function() StaticPopup_Show(\"BUY_BANK_SLOT\") end)\n\t\tf.b_purchase:FontString(\"text\", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)\n\t\tf.b_purchase.text:SetPoint(\"CENTER\")\n\t\tf.b_purchase.text:SetText(BANKSLOTPURCHASE)\n\t\tf.b_purchase:SetFontString(f.b_purchase.text)\n\t\tlocal _, full = GetNumBankSlots()\n\t\tif full then\n\t\t\tf.b_purchase:Hide()\n\t\telse\n\t\t\tf.b_purchase:Show()\n\t\tend\n\tend\n\n\t-- Close button\n\tf.b_close = CreateFrame(\"Button\", \"StuffingCloseButton\"..w, f, \"UIPanelCloseButton\")\n\tT.SkinCloseButton(f.b_close, nil, nil, true)\n\tf.b_close:SetSize(15, 15)\n\tf.b_close:RegisterForClicks(\"AnyUp\")\n\tf.b_close:SetScript(\"OnClick\", function(self, btn)\n\t\tif btn == \"RightButton\" then\n\t\t\tif Stuffing_DDMenu.initialize ~= Stuffing.Menu then\n\t\t\t\tCloseDropDownMenus()\n\t\t\t\tStuffing_DDMenu.initialize = Stuffing.Menu\n\t\t\tend\n\t\t\tToggleDropDownMenu(nil, nil, Stuffing_DDMenu, self:GetName(), 0, 0)\n\t\t\treturn\n\t\telseif btn == \"LeftButton\" and IsShiftKeyDown() then\n\t\t\tif InCombatLockdown() then\n\t\t\t\tprint(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return\n\t\t\tend\n\t\t\tStuffing:SetBagsForSorting(\"d\")\n\t\t\tStuffing:Restack()\n\t\t\treturn\n\t\tend\n\t\tself:GetParent():Hide()\n\tend)\n\n\tlocal tooltip_hide = function()\n\t\tGameTooltip:Hide()\n\tend\n\n\tlocal tooltip_show = function(self)\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_LEFT\", 19, 7)\n\t\tGameTooltip:ClearLines()\n\t\tGameTooltip:SetText(L_BAG_RIGHT_CLICK_CLOSE)\n\tend\n\n\tf.b_close:HookScript(\"OnEnter\", tooltip_show)\n\tf.b_close:HookScript(\"OnLeave\", tooltip_hide)\n\n\t-- Create the bags frame\n\tlocal fb = CreateFrame(\"Frame\", n..\"BagsFrame\", f)\n\tfb:SetPoint(\"BOTTOMLEFT\", f, \"TOPLEFT\", 0, 3)\n\tfb:SetFrameStrata(\"MEDIUM\")\n\tf.bags_frame = fb\n\n\treturn f\nend\n\nfunction Stuffing:InitBank()\n\tif self.bankFrame then\n\t\treturn\n\tend\n\n\tlocal f = self:CreateBagFrame(\"Bank\")\n\tf:SetScript(\"OnHide\", StuffingBank_OnHide)\n\tself.bankFrame = f\nend\n\nfunction Stuffing:InitBags()\n\tif self.frame then return end\n\n\tself.buttons = {}\n\tself.bags = {}\n\tself.bagframe_buttons = {}\n\tself.bags_num = {}\n\n\tlocal f = self:CreateBagFrame(\"Bags\")\n\tf:SetScript(\"OnShow\", Stuffing_OnShow)\n\tf:SetScript(\"OnHide\", Stuffing_OnHide)\n\n\t-- Search editbox (tekKonfigAboutPanel.lua)\n\tlocal editbox = CreateFrame(\"EditBox\", nil, f)\n\teditbox:Hide()\n\teditbox:SetAutoFocus(false)\n\teditbox:SetHeight(32)\n\teditbox:CreateBackdrop(\"Overlay\")\n\teditbox.backdrop:SetPoint(\"TOPLEFT\", -2, 1)\n\teditbox.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -1)\n\n\tlocal fullReset = function(self)\n\t\tStuffing:SearchReset()\n\tend\n\n\tlocal clearFocus = function(self)\n\t\tself:HighlightText(0, 0)\n\t\tself:ClearFocus()\n\tend\n\n\tlocal gainFocus = function(self)\n\t\tself:HighlightText()\n\tend\n\n\tlocal updateSearch = function(self, t)\n\t\tif t == true then\n\t\t\tStuffing:SearchUpdate(self:GetText())\n\t\tend\n\tend\n\n\teditbox:SetScript(\"OnEscapePressed\", fullReset)\n\teditbox:SetScript(\"OnEnterPressed\", clearFocus)\n\teditbox:SetScript(\"OnEditFocusLost\", clearFocus)\n\teditbox:SetScript(\"OnEditFocusGained\", gainFocus)\n\teditbox:SetScript(\"OnTextChanged\", updateSearch)\n\t-- editbox:SetText(SEARCH)\n\n\tlocal detail = f:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlightLarge\")\n\tdetail:SetPoint(\"TOPLEFT\", f, 12, -8)\n\tdetail:SetPoint(\"RIGHT\", f, -150, -8)\n\tdetail:SetHeight(13)\n\tdetail:SetShadowColor(0, 0, 0, 0)\n\tdetail:SetJustifyH(\"LEFT\")\n\tdetail:SetText(\"|cff9999ff\"..SEARCH..\"|r\")\n\teditbox:SetAllPoints(detail)\n\n\tlocal buttons = {}\n\tlocal filterTable = {\n\t\t[1] = {3566860, GetItemClassInfo(0)},\t-- Consumable\n\t\t[2] = {135280, GetItemClassInfo(2)},\t-- Weapon\n\t\t[3] = {132341, GetItemClassInfo(4)},\t-- Armor\n\t\t[4] = {132281, GetItemClassInfo(7)},\t-- Tradeskill\n\t\t[5] = {236667, ITEM_BIND_QUEST},\t\t-- Quest\n\t\t[6] = {133784, ITEM_BIND_ON_EQUIP},\t\t-- BoE\n\t}\n\tfor i = 1, #filterTable do\n\t\tlocal button = CreateFrame(\"Button\", \"BagsFilterButton\"..i, C.bag.filter and f or editbox)\n\t\tbutton:SetSize(25, 25)\n\t\tbutton:SetTemplate(\"Overlay\")\n\t\tbutton:EnableMouse(true)\n\t\tbutton:RegisterForClicks(\"AnyUp\")\n\t\tif i == 1 then\n\t\t\tbutton:SetPoint(\"TOPRIGHT\", f, \"TOPLEFT\", -1, 0)\n\t\telse\n\t\t\tbutton:SetPoint(\"TOP\", buttons[i-1], \"BOTTOM\", 0, -1)\n\t\tend\n\t\tbuttons[i] = button\n\t\tlocal icon, text = unpack(filterTable[i])\n\t\tbutton.Icon = button:CreateTexture(nil, \"OVERLAY\")\n\t\tbutton.Icon:SetTexture(icon)\n\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton.Icon:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\tbutton.Icon:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\t\tbutton:SetScript(\"OnClick\", function(self)\n\t\t\tif editbox:GetText() == text then\n\t\t\t\tStuffing:SearchReset()\n\t\t\telse\n\t\t\t\tdetail:Hide()\n\t\t\t\teditbox:Show()\n\t\t\t\teditbox:SetText(text)\n\t\t\t\tStuffing:SearchUpdate(text)\n\t\t\tend\n\t\tend)\n\n\t\tlocal tooltip_hide = function()\n\t\t\tGameTooltip:Hide()\n\t\tend\n\n\t\tlocal tooltip_show = function(self)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_TOPRIGHT\", -5, 5)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:SetText(text)\n\t\tend\n\n\t\tbutton:SetScript(\"OnEnter\", tooltip_show)\n\t\tbutton:SetScript(\"OnLeave\", tooltip_hide)\n\tend\n\n\tlocal button = CreateFrame(\"Button\", nil, f)\n\tbutton:EnableMouse(true)\n\tbutton:RegisterForClicks(\"LeftButtonUp\", \"RightButtonUp\")\n\tbutton:SetAllPoints(detail)\n\tbutton.ttText = L_BAG_RIGHT_CLICK_SEARCH\n\tbutton:SetScript(\"OnClick\", function(self, btn)\n\t\tif btn == \"RightButton\" then\n\t\t\tself:GetParent().detail:Hide()\n\t\t\tself:GetParent().editbox:Show()\n\t\t\tself:GetParent().editbox:HighlightText()\n\t\t\tself:GetParent().editbox:SetFocus()\n\t\telse\n\t\t\tif self:GetParent().editbox:IsShown() then\n\t\t\t\tStuffing:SearchReset()\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal tooltip_hide = function()\n\t\tGameTooltip:Hide()\n\tend\n\n\tlocal tooltip_show = function(self)\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_TOPLEFT\", -12, 11)\n\t\tGameTooltip:ClearLines()\n\t\tGameTooltip:SetText(self.ttText)\n\tend\n\n\tbutton:SetScript(\"OnEnter\", tooltip_show)\n\tbutton:SetScript(\"OnLeave\", tooltip_hide)\n\n\tf.editbox = editbox\n\tf.detail = detail\n\tf.button = button\n\tself.frame = f\n\tf:Hide()\nend\n\nfunction Stuffing:Layout(isBank)\n\tlocal slots = 0\n\tlocal rows = 0\n\tlocal off = 20\n\tlocal cols, f, bs\n\n\tif isBank then\n\t\tbs = BAGS_BANK\n\t\tcols = C.bag.bank_columns\n\t\tf = self.bankFrame\n\t\tf:SetAlpha(1)\n\telse\n\t\tbs = BAGS_BACKPACK\n\t\tcols = C.bag.bag_columns\n\t\tf = self.frame\n\n\t\tf.editbox:SetFont(C.media.normal_font, C.font.bags_font_size + 3, \"\")\n\t\tf.detail:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)\n\t\tf.detail:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)\n\tend\n\n\tf:SetClampedToScreen(1)\n\tf:SetTemplate(\"Transparent\")\n\n\t-- Bag frame stuff\n\tlocal fb = f.bags_frame\n\tif bag_bars == 1 then\n\t\tfb:SetClampedToScreen(1)\n\t\tfb:SetTemplate(\"Transparent\")\n\n\t\tlocal bsize = C.bag.button_size\n\n\t\tlocal w = 2 * 10\n\t\tw = w + ((#bs - 1) * bsize)\n\t\tw = w + ((#bs - 2) * 4)\n\n\t\tfb:SetHeight(2 * 10 + bsize)\n\t\tfb:SetWidth(w)\n\t\tfb:Show()\n\telse\n\t\tfb:Hide()\n\tend\n\n\tlocal idx = 0\n\tfor _, v in ipairs(bs) do\n\t\tif (not isBank and v <= 4) or (isBank and v ~= -1) then\n\t\t\tlocal bsize = C.bag.button_size\n\t\t\tlocal b = self:BagFrameSlotNew(fb, v)\n\t\t\tlocal xoff = 10\n\n\t\t\txoff = xoff + (idx * bsize)\n\t\t\txoff = xoff + (idx * 4)\n\n\t\t\tb.frame:ClearAllPoints()\n\t\t\tb.frame:SetPoint(\"LEFT\", fb, \"LEFT\", xoff, 0)\n\t\t\tb.frame:SetSize(bsize, bsize)\n\n\t\t\tlocal btns = self.buttons\n\t\t\tb.frame:HookScript(\"OnEnter\", function()\n\t\t\t\tlocal bag\n\t\t\t\tif isBank then bag = v else bag = v + 1 end\n\n\t\t\t\tfor _, val in ipairs(btns) do\n\t\t\t\t\tif val.bag == bag then\n\t\t\t\t\t\tval.frame.searchOverlay:Hide()\n\t\t\t\t\telse\n\t\t\t\t\t\tval.frame.searchOverlay:Show()\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tb.frame:HookScript(\"OnLeave\", function()\n\t\t\t\tfor _, btn in ipairs(btns) do\n\t\t\t\t\tbtn.frame.searchOverlay:Hide()\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tb.frame:SetScript(\"OnClick\", nil)\n\n\t\t\tidx = idx + 1\n\t\tend\n\tend\n\n\tfor _, i in ipairs(bs) do\n\t\tlocal x = C_Container.GetContainerNumSlots(i)\n\t\tif x > 0 then\n\t\t\tif not self.bags[i] then\n\t\t\t\tself.bags[i] = self:BagNew(i, f)\n\t\t\tend\n\n\t\t\tslots = slots + C_Container.GetContainerNumSlots(i)\n\t\tend\n\t\tself.bags_num[i] = x\n\tend\n\n\trows = floor(slots / cols)\n\tif (slots % cols) ~= 0 then\n\t\trows = rows + 1\n\tend\n\n\tf:SetWidth(cols * C.bag.button_size + (cols - 1) * C.bag.button_space + 10 * 2)\n\tf:SetHeight(rows * C.bag.button_size + (rows - 1) * C.bag.button_space + off + 10 * 2)\n\n\tlocal idx = 0\n\tfor _, i in ipairs(bs) do\n\t\tlocal bag_cnt = C_Container.GetContainerNumSlots(i)\n\t\tlocal specialType = select(2, C_Container.GetContainerNumFreeSlots(i))\n\t\tif bag_cnt > 0 then\n\t\t\tself.bags[i] = self:BagNew(i, f)\n\t\t\tlocal bagType = self.bags[i].bagType\n\n\t\t\tself.bags[i]:Show()\n\t\t\tfor j = 1, bag_cnt do\n\t\t\t\tlocal b, isnew = self:SlotNew(i, j)\n\t\t\t\tlocal xoff\n\t\t\t\tlocal yoff\n\t\t\t\tlocal x = (idx % cols)\n\t\t\t\tlocal y = floor(idx / cols)\n\n\t\t\t\tif isnew then\n\t\t\t\t\ttable.insert(self.buttons, idx + 1, b)\n\t\t\t\tend\n\n\t\t\t\txoff = 10 + (x * C.bag.button_size) + (x * C.bag.button_space)\n\t\t\t\tyoff = off + 10 + (y * C.bag.button_size) + ((y - 1) * C.bag.button_space)\n\t\t\t\tyoff = yoff * -1\n\n\t\t\t\tb.frame:ClearAllPoints()\n\t\t\t\tb.frame:SetPoint(\"TOPLEFT\", f, \"TOPLEFT\", xoff, yoff)\n\t\t\t\tb.frame:SetSize(C.bag.button_size, C.bag.button_size)\n\t\t\t\tb.frame.lock = false\n\t\t\t\tb.frame:SetAlpha(1)\n\n\t\t\t\tif bagType == ST_FISHBAG then\n\t\t\t\t\tb.frame:SetBackdropBorderColor(1, 0, 0)\t-- Tackle\n\t\t\t\t\tb.frame.lock = true\n\t\t\t\telseif bagType == ST_SPECIAL then\n\t\t\t\t\tif specialType == 0x0008 then\t\t\t-- Leatherworking\n\t\t\t\t\t\tb.frame:SetBackdropBorderColor(0.8, 0.7, 0.3)\n\t\t\t\t\telseif specialType == 0x0010 then\t\t-- Inscription\n\t\t\t\t\t\tb.frame:SetBackdropBorderColor(0.3, 0.3, 0.8)\n\t\t\t\t\telseif specialType == 0x0020 then\t\t-- Herbs\n\t\t\t\t\t\tb.frame:SetBackdropBorderColor(0.3, 0.7, 0.3)\n\t\t\t\t\telseif specialType == 0x0040 then\t\t-- Enchanting\n\t\t\t\t\t\tb.frame:SetBackdropBorderColor(0.6, 0, 0.6)\n\t\t\t\t\telseif specialType == 0x0080 then\t\t-- Engineering\n\t\t\t\t\t\tb.frame:SetBackdropBorderColor(0.9, 0.4, 0.1)\n\t\t\t\t\telseif specialType == 0x0200 then\t\t-- Gems\n\t\t\t\t\t\tb.frame:SetBackdropBorderColor(0, 0.7, 0.8)\n\t\t\t\t\telseif specialType == 0x0400 then\t\t-- Mining\n\t\t\t\t\t\tb.frame:SetBackdropBorderColor(0.4, 0.3, 0.1)\n\t\t\t\t\telseif specialType == 0x10000 then\t\t-- Cooking\n\t\t\t\t\t\tb.frame:SetBackdropBorderColor(0.9, 0, 0.1)\n\t\t\t\t\tend\n\t\t\t\t\tb.frame.lock = true\n\t\t\t\telseif i == 5 then \t\t-- Reagent\n\t\t\t\t\tb.frame:SetBackdropBorderColor(0.5, 0.25, 0.1)\n\t\t\t\t\tb.frame.lock = true\n\t\t\t\tend\n\n\t\t\t\tidx = idx + 1\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction Stuffing:SetBagsForSorting(c)\n\tStuffing_Open()\n\n\tself.sortBags = {}\n\n\tlocal cmd = ((c == nil or c == \"\") and {\"d\"} or {strsplit(\"/\", c)})\n\n\tfor _, s in ipairs(cmd) do\n\t\tif s == \"c\" then\n\t\t\tself.sortBags = {}\n\t\telseif s == \"d\" then\n\t\t\tif not self.bankFrame or not self.bankFrame:IsShown() then\n\t\t\t\tfor _, i in ipairs(BAGS_BACKPACK) do\n\t\t\t\t\tif self.bags[i] and self.bags[i].bagType == ST_NORMAL then\n\t\t\t\t\t\ttable.insert(self.sortBags, i)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif not _G[\"StuffingFrameReagent\"] or not _G[\"StuffingFrameReagent\"]:IsShown() then\n\t\t\t\tfor _, i in ipairs(BAGS_BANK) do\n\t\t\t\t\tif self.bags[i] and self.bags[i].bagType == ST_NORMAL then\n\t\t\t\t\t\ttable.insert(self.sortBags, i)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telseif s == \"p\" then\n\t\t\tif not self.bankFrame or not self.bankFrame:IsShown() then\n\t\t\t\tfor _, i in ipairs(BAGS_BACKPACK) do\n\t\t\t\t\tif self.bags[i] and self.bags[i].bagType == ST_SPECIAL then\n\t\t\t\t\t\ttable.insert(self.sortBags, i)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tfor _, i in ipairs(BAGS_BANK) do\n\t\t\t\t\tif self.bags[i] and self.bags[i].bagType == ST_SPECIAL then\n\t\t\t\t\t\ttable.insert(self.sortBags, i)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\ttable.insert(self.sortBags, tonumber(s))\n\t\tend\n\tend\nend\n\nfunction Stuffing:ADDON_LOADED(addon)\n\tif addon ~= \"ShestakUI\" then return nil end\n\n\tself:RegisterEvent(\"BAG_UPDATE\")\n\tself:RegisterEvent(\"ITEM_LOCK_CHANGED\")\n\tself:RegisterEvent(\"BANKFRAME_OPENED\")\n\tself:RegisterEvent(\"BANKFRAME_CLOSED\")\n\tself:RegisterEvent(\"PLAYER_INTERACTION_MANAGER_FRAME_SHOW\")\n\tself:RegisterEvent(\"PLAYER_INTERACTION_MANAGER_FRAME_HIDE\")\n\tself:RegisterEvent(\"PLAYERBANKSLOTS_CHANGED\")\n\tself:RegisterEvent(\"PLAYERBANKBAGSLOTS_CHANGED\")\n\tself:RegisterEvent(\"PLAYERREAGENTBANKSLOTS_CHANGED\")\n\tself:RegisterEvent(\"BAG_CLOSED\")\n\tself:RegisterEvent(\"BAG_UPDATE_COOLDOWN\")\n\tself:RegisterEvent(\"BAG_CONTAINER_UPDATE\")\n\tself:RegisterEvent(\"BAG_UPDATE_DELAYED\")\n\n\tself:InitBags()\n\n\ttinsert(UISpecialFrames, \"StuffingFrameBags\")\n\ttinsert(UISpecialFrames, \"StuffingFrameReagent\")\n\n\tToggleBackpack = Stuffing_Toggle\n\tToggleBag = Stuffing_Toggle\n\tToggleAllBags = Stuffing_Toggle\n\tOpenAllBags = Stuffing_Open\n\tOpenBackpack = Stuffing_Open\n\tCloseAllBags = Stuffing_Close\n\tCloseBackpack = Stuffing_Close\n\n\tOpenAllBagsMatchingContext = function()\n\t\tlocal count = 0\n\t\tfor i = 0, NUM_BAG_FRAMES do\n\t\t\tif ItemButtonUtil.GetItemContextMatchResultForContainer(i) == ItemButtonUtil.ItemContextMatchResult.Match then\n\t\t\t\tStuffing_Open()\n\t\t\t\tcount = count + 1\n\t\t\tend\n\t\tend\n\t\treturn count\n\tend\n\n\tBankFrame:UnregisterAllEvents()\n\tBankFrame:SetScale(0.00001)\n\tBankFrame:SetAlpha(0)\n\tBankFrame:SetPoint(\"TOPLEFT\")\nend\n\nfunction Stuffing:PLAYER_ENTERING_WORLD()\n\tStuffing:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tToggleBackpack()\n\tToggleBackpack()\nend\n\nfunction Stuffing:PLAYERBANKSLOTS_CHANGED(id)\n\tif self.bankFrame and self.bankFrame:IsShown() then\n\t\tself:BagSlotUpdate(-1)\n\tend\nend\n\nfunction Stuffing:PLAYERREAGENTBANKSLOTS_CHANGED(id)\n\tlocal button = _G[\"ReagentBankFrameItem\"..id]\n\tif not button then return end\n\tlocal clink = C_Container.GetContainerItemLink(-3, id)\n\tbutton:SetBackdropBorderColor(unpack(C.media.border_color))\n\n\tif clink then\n\t\tlocal _, _, _, quality = GetContainerItemInfo(-3, id)\n\t\tif quality and quality > 1 then\n\t\t\tlocal r, g, b = GetItemQualityColor(quality)\n\t\t\tbutton:SetBackdropBorderColor(r, g, b)\n\t\tend\n\tend\nend\n\nfunction Stuffing:BAG_UPDATE(id)\n\tself:BagSlotUpdate(id)\nend\n\nfunction Stuffing:BAG_UPDATE_DELAYED()\n\tfor _, i in ipairs(BAGS_BACKPACK) do\n\t\tlocal numSlots = C_Container.GetContainerNumSlots(i)\n\t\tif self.bags_num[i] and self.bags_num[i] ~= numSlots then\n\t\t\tself:Layout()\n\t\t\treturn\n\t\tend\n\tend\nend\n\nfunction Stuffing:ITEM_LOCK_CHANGED(bag, slot)\n\tif slot == nil then return end\n\tfor _, v in ipairs(self.buttons) do\n\t\tif v.bag == bag and v.slot == slot then\n\t\t\tself:SlotUpdate(v)\n\t\t\tbreak\n\t\tend\n\tend\nend\n\nfunction Stuffing:BANKFRAME_OPENED()\n\tif not self.bankFrame then\n\t\tself:InitBank()\n\tend\n\n\tself:Layout(true)\n\tfor _, x in ipairs(BAGS_BANK) do\n\t\tself:BagSlotUpdate(x)\n\tend\n\n\tself.bankFrame:Show()\n\tStuffing_Open()\n\n\tfor _, v in ipairs(self.bagframe_buttons) do\n\t\tif v.frame and v.frame.GetInventorySlot then\n\t\t\tv.frame:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tBankFrameItemButton_Update(v.frame)\n\n\t\t\tif not v.frame.tooltipText then\n\t\t\t\tv.frame.tooltipText = \"\"\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction Stuffing:BANKFRAME_CLOSED()\n\tif StuffingFrameReagent then\n\t\tStuffingFrameReagent:Hide()\n\tend\n\tif self.bankFrame then\n\t\tself.bankFrame:Hide()\n\tend\nend\n\nfunction Stuffing:PLAYER_INTERACTION_MANAGER_FRAME_SHOW(...)\n\tlocal type = ...\n\tif type == 10 then\t-- Guild bank\n\t\tStuffing_Open()\n\telseif type == 40 then\t-- ScrappingMachine\n\t\tfor i = 0, #BAGS_BACKPACK - 1 do\n\t\t\tStuffing:BAG_UPDATE(i)\n\t\tend\n\tend\nend\n\nfunction Stuffing:PLAYER_INTERACTION_MANAGER_FRAME_HIDE(...)\n\tlocal type = ...\n\tif type == 10 then\t-- Guild bank\n\t\tStuffing_Close()\n\tend\nend\n\nfunction Stuffing:BAG_CLOSED(id)\n\tlocal b = self.bags[id]\n\tif b then\n\t\ttable.remove(self.bags, id)\n\t\tb:Hide()\n\t\ttable.insert(trashBag, #trashBag + 1, b)\n\t\tself.bags_num[id] = -1\n\tend\n\n\twhile true do\n\t\tlocal changed = false\n\n\t\tfor i, v in ipairs(self.buttons) do\n\t\t\tif v.bag == id then\n\t\t\t\tv.frame:Hide()\n\t\t\t\tv.frame.lock = false\n\n\t\t\t\ttable.insert(trashButton, #trashButton + 1, v.frame)\n\t\t\t\ttable.remove(self.buttons, i)\n\n\t\t\t\tv = nil\n\t\t\t\tchanged = true\n\t\t\tend\n\t\tend\n\n\t\tif not changed then\n\t\t\tbreak\n\t\tend\n\tend\n\tif id > 5 then\n\t\tStuffing_Close() -- prevent graphical bug with empty slots\n\tend\nend\n\nfunction Stuffing:BAG_UPDATE_COOLDOWN()\n\tfor _, v in pairs(self.buttons) do\n\t\tself:UpdateCooldowns(v)\n\tend\nend\n\nfunction Stuffing:BAG_CONTAINER_UPDATE()\n\tfor _, v in ipairs(self.bagframe_buttons) do\n\t\tif v.frame and v.slot < 5 then -- exclude bank\n\t\t\tv.frame.ID = C_Container.ContainerIDToInventoryID(v.slot + 1)\n\n\t\t\tlocal slotLink = GetInventoryItemLink(\"player\", v.frame.ID)\n\t\t\tv.frame:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tif slotLink then\n\t\t\t\tlocal _, _, quality = GetItemInfo(slotLink)\n\t\t\t\tif quality and quality > 1 then\n\t\t\t\t\tlocal r, g, b = GetItemQualityColor(quality)\n\t\t\t\t\tv.frame:SetBackdropBorderColor(r, g, b)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal bag_tex = GetInventoryItemTexture(\"player\", v.frame.ID)\n\t\t\t_G[v.frame:GetName()..\"IconTexture\"]:SetTexture(bag_tex)\n\t\tend\n\tend\nend\n\nlocal function InBags(x)\n\tif not Stuffing.bags[x] then\n\t\treturn false\n\tend\n\n\tfor _, v in ipairs(Stuffing.sortBags) do\n\t\tif x == v then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn false\nend\n\nlocal BS_bagGroups\nlocal BS_itemSwapGrid\n\nlocal function BS_clearData()\n\tBS_itemSwapGrid = {}\n\tBS_bagGroups = {}\nend\n\nfunction Stuffing:SortOnUpdate(elapsed)\n\tself.elapsed = (self.elapsed or 0) + elapsed\n\n\tif self.elapsed < 0.05 then\n\t\treturn\n\tend\n\n\tself.elapsed = 0\n\n\tlocal changed = false\n\tlocal blocked = false\n\n\tfor bagIndex in pairs(BS_itemSwapGrid) do\n\t\tfor slotIndex in pairs(BS_itemSwapGrid[bagIndex]) do\n\t\t\tlocal destinationBag = BS_itemSwapGrid[bagIndex][slotIndex].destinationBag\n\t\t\tlocal destinationSlot = BS_itemSwapGrid[bagIndex][slotIndex].destinationSlot\n\n\t\t\tlocal _, _, locked1 = GetContainerItemInfo(bagIndex, slotIndex)\n\t\t\tlocal _, _, locked2 = GetContainerItemInfo(destinationBag, destinationSlot)\n\n\t\t\tif locked1 or locked2 then\n\t\t\t\tblocked = true\n\t\t\telseif bagIndex ~= destinationBag or slotIndex ~= destinationSlot then\n\t\t\t\tC_Container.PickupContainerItem(bagIndex, slotIndex)\n\t\t\t\tC_Container.PickupContainerItem(destinationBag, destinationSlot)\n\n\t\t\t\tlocal tempItem = BS_itemSwapGrid[destinationBag][destinationSlot]\n\t\t\t\tBS_itemSwapGrid[destinationBag][destinationSlot] = BS_itemSwapGrid[bagIndex][slotIndex]\n\t\t\t\tBS_itemSwapGrid[bagIndex][slotIndex] = tempItem\n\n\t\t\t\tchanged = true\n\t\t\t\treturn\n\t\t\tend\n\t\tend\n\tend\n\n\tif not changed and not blocked then\n\t\tself:SetScript(\"OnUpdate\", nil)\n\t\tBS_clearData()\n\tend\nend\n\nfunction Stuffing:SortBags()\n\tBS_clearData()\n\n\tlocal bagList\n\tif _G[\"StuffingFrameReagent\"] and _G[\"StuffingFrameReagent\"]:IsShown() then\n\t\tbagList = {-3}\n\telseif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then\n\t\tbagList = {12, 11, 10, 9, 8, 7, 6, -1}\n\telse\n\t\tbagList = {4, 3, 2, 1, 0}\n\tend\n\n\tfor _, slotNum in pairs(bagList) do\n\t\tif C_Container.GetContainerNumSlots(slotNum) > 0 then\n\t\t\tBS_itemSwapGrid[slotNum] = {}\n\t\t\tlocal family = select(2, C_Container.GetContainerNumFreeSlots(slotNum))\n\t\t\tif family then\n\t\t\t\tif family == 0 then family = \"Default\" end\n\t\t\t\tif not BS_bagGroups[family] then\n\t\t\t\t\tBS_bagGroups[family] = {}\n\t\t\t\t\tBS_bagGroups[family].bagSlotNumbers = {}\n\t\t\t\tend\n\t\t\t\ttable.insert(BS_bagGroups[family].bagSlotNumbers, slotNum)\n\t\t\tend\n\t\tend\n\tend\n\n\tfor _, group in pairs(BS_bagGroups) do\n\t\tgroup.itemList = {}\n\t\tfor _, bagSlot in pairs(group.bagSlotNumbers) do\n\t\t\tfor itemSlot = 1, C_Container.GetContainerNumSlots(bagSlot) do\n\t\t\t\tlocal itemLink = C_Container.GetContainerItemLink(bagSlot, itemSlot)\n\t\t\t\tif itemLink ~= nil then\n\t\t\t\t\tlocal newItem = {}\n\n\t\t\t\t\tlocal n, _, q, iL, rL, c1, c2, _, Sl, _, _, classID = GetItemInfo(itemLink)\n\t\t\t\t\tlocal p = 1\n\t\t\t\t\t-- Hearthstone\n\t\t\t\t\tif n == GetItemInfo(6948) or n == GetItemInfo(110560) or n == GetItemInfo(140192) then\n\t\t\t\t\t\tp = 99\n\t\t\t\t\telseif n == GetItemInfo(141605) then -- Flight Master's Whistle\n\t\t\t\t\t\tp = 98\n\t\t\t\t\telseif n == GetItemInfo(128353) then -- Admiral's Compass\n\t\t\t\t\t\tp = 97\n\t\t\t\t\tend\n\t\t\t\t\t-- Fix for battle pets\n\t\t\t\t\tif not n then\n\t\t\t\t\t\tn = itemLink\n\t\t\t\t\t\tq = select(4, GetContainerItemInfo(bagSlot, itemSlot))\n\t\t\t\t\t\tiL = 1\n\t\t\t\t\t\trL = 1\n\t\t\t\t\t\tc1 = \"Pet\"\n\t\t\t\t\t\tc2 = \"Pet\"\n\t\t\t\t\t\tSl = \"\"\n\t\t\t\t\tend\n\n\t\t\t\t\t-- Keystone\n\t\t\t\t\tlocal ks = strmatch(itemLink, \"keystone:(%d+)\")\n\t\t\t\t\tif ks then\n\t\t\t\t\t\tp = 10\n\t\t\t\t\tend\n\n\t\t\t\t\tif classID == 0 then\t-- Consumable\n\t\t\t\t\t\tp = 9\n\t\t\t\t\telseif classID == 2 or classID == 4 then\t-- Weapon and Armor\n\t\t\t\t\t\tp = 8\n\t\t\t\t\tend\n\n\t\t\t\t\tnewItem.sort = p..q..c1..c2..rL..n..iL..Sl\n\n\t\t\t\t\ttinsert(group.itemList, newItem)\n\n\t\t\t\t\tBS_itemSwapGrid[bagSlot][itemSlot] = newItem\n\t\t\t\t\tnewItem.startBag = bagSlot\n\t\t\t\t\tnewItem.startSlot = itemSlot\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\ttable.sort(group.itemList, function(a, b)\n\t\t\treturn a.sort > b.sort\n\t\tend)\n\n\t\tfor index, item in pairs(group.itemList) do\n\t\t\tlocal gridSlot = index\n\t\t\tfor _, bagSlotNumber in pairs(group.bagSlotNumbers) do\n\t\t\t\tif gridSlot <= C_Container.GetContainerNumSlots(bagSlotNumber) then\n\t\t\t\t\tBS_itemSwapGrid[item.startBag][item.startSlot].destinationBag = bagSlotNumber\n\t\t\t\t\tBS_itemSwapGrid[item.startBag][item.startSlot].destinationSlot = C_Container.GetContainerNumSlots(bagSlotNumber) - gridSlot + 1\n\t\t\t\t\tbreak\n\t\t\t\telse\n\t\t\t\t\tgridSlot = gridSlot - C_Container.GetContainerNumSlots(bagSlotNumber)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tself:SetScript(\"OnUpdate\", Stuffing.SortOnUpdate)\nend\n\nfunction Stuffing:RestackOnUpdate(e)\n\tif not self.elapsed then\n\t\tself.elapsed = 0\n\tend\n\n\tself.elapsed = self.elapsed + e\n\n\tif self.elapsed < 0.1 then return end\n\n\tself.elapsed = 0\n\tself:Restack()\nend\n\nfunction Stuffing:Restack()\n\tlocal st = {}\n\tlocal sr = {}\n\tlocal did_restack = false\n\n\tStuffing_Open()\n\n\tif _G[\"StuffingFrameReagent\"] and _G[\"StuffingFrameReagent\"]:IsShown() then\n\t\tfor slotID = 1, 98 do\n\t\t\tlocal _, cnt, _, _, _, _, clink = GetContainerItemInfo(-3, slotID)\n\t\t\tif clink then\n\t\t\t\tlocal n, _, _, _, _, _, _, s = GetItemInfo(clink)\n\n\t\t\t\tif n and cnt ~= s then\n\t\t\t\t\tif not sr[clink] then\n\t\t\t\t\t\tsr[clink] = {{item = slotID, size = cnt, max = s}}\n\t\t\t\t\telse\n\t\t\t\t\t\ttable.insert(sr[clink], {item = slotID, size = cnt, max = s})\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tfor _, v in pairs(sr) do\n\t\t\tif #v > 1 then\n\t\t\t\tfor j = 2, #v, 2 do\n\t\t\t\t\tlocal a, b = v[j - 1], v[j]\n\t\t\t\t\tlocal _, _, l1 = GetContainerItemInfo(-3, a.item)\n\t\t\t\t\tlocal _, _, l2 = GetContainerItemInfo(-3, b.item)\n\n\t\t\t\t\tif l1 or l2 then\n\t\t\t\t\t\tdid_restack = true\n\t\t\t\t\telse\n\t\t\t\t\t\tC_Container.PickupContainerItem(-3, a.item)\n\t\t\t\t\t\tC_Container.PickupContainerItem(-3, b.item)\n\t\t\t\t\t\tdid_restack = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telse\n\t\tfor _, v in pairs(self.buttons) do\n\t\t\tif InBags(v.bag) then\n\t\t\t\tlocal _, cnt, _, _, _, _, clink = GetContainerItemInfo(v.bag, v.slot)\n\t\t\t\tif clink then\n\t\t\t\t\tlocal n, _, _, _, _, _, _, s = GetItemInfo(clink)\n\n\t\t\t\t\tif n and cnt ~= s then\n\t\t\t\t\t\tif not st[clink] then\n\t\t\t\t\t\t\tst[clink] = {{item = v, size = cnt, max = s}}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttable.insert(st[clink], {item = v, size = cnt, max = s})\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tfor _, v in pairs(st) do\n\t\t\tif #v > 1 then\n\t\t\t\tfor j = 2, #v, 2 do\n\t\t\t\t\tlocal a, b = v[j - 1], v[j]\n\t\t\t\t\tlocal _, _, l1 = GetContainerItemInfo(a.item.bag, a.item.slot)\n\t\t\t\t\tlocal _, _, l2 = GetContainerItemInfo(b.item.bag, b.item.slot)\n\n\t\t\t\t\tif l1 or l2 then\n\t\t\t\t\t\tdid_restack = true\n\t\t\t\t\telse\n\t\t\t\t\t\tC_Container.PickupContainerItem(a.item.bag, a.item.slot)\n\t\t\t\t\t\tC_Container.PickupContainerItem(b.item.bag, b.item.slot)\n\t\t\t\t\t\tdid_restack = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tif did_restack then\n\t\tself:SetScript(\"OnUpdate\", Stuffing.RestackOnUpdate)\n\telse\n\t\tself:SetScript(\"OnUpdate\", nil)\n\tend\nend\n\nfunction Stuffing:PLAYERBANKBAGSLOTS_CHANGED()\n\tif not StuffingPurchaseButtonBank then return end\n\tlocal numSlots, full = GetNumBankSlots()\n\tif full then\n\t\tStuffingPurchaseButtonBank:Hide()\n\telse\n\t\tStuffingPurchaseButtonBank:Show()\n\tend\n\n\tlocal button\n\tfor i = 1, NUM_BANKBAGSLOTS, 1 do\n\t\tbutton = _G[\"StuffingBBag\"..i..\"Slot\"]\n\t\tif button then\n\t\t\tif i <= numSlots then\n\t\t\t\tSetItemButtonTextureVertexColor(button, 1.0, 1.0, 1.0)\n\t\t\telse\n\t\t\t\tSetItemButtonTextureVertexColor(button, 1.0, 0.1, 0.1)\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction Stuffing.Menu(self, level)\n\tif not level then return end\n\n\tlocal info = self.info\n\n\twipe(info)\n\n\tif level ~= 1 then return end\n\n\twipe(info)\n\tinfo.text = BAG_FILTER_CLEANUP..\" Blizzard\"\n\tinfo.notCheckable = 1\n\tinfo.func = function()\n\t\tif _G[\"StuffingFrameReagent\"] and _G[\"StuffingFrameReagent\"]:IsShown() then\n\t\t\tC_Container.SortReagentBankBags()\n\t\telseif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then\n\t\t\tC_Container.SortBankBags()\n\t\telse\n\t\t\tC_Container.SortBags()\n\t\tend\n\tend\n\tUIDropDownMenu_AddButton(info, level)\n\n\twipe(info)\n\tinfo.text = BAG_FILTER_CLEANUP\n\tinfo.notCheckable = 1\n\tinfo.func = function()\n\t\tif InCombatLockdown() then\n\t\t\tprint(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return\n\t\tend\n\t\tStuffing:SortBags()\n\tend\n\tUIDropDownMenu_AddButton(info, level)\n\n\twipe(info)\n\tinfo.text = L_BAG_STACK_MENU\n\tinfo.notCheckable = 1\n\tinfo.func = function()\n\t\tif InCombatLockdown() then\n\t\t\tprint(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return\n\t\tend\n\t\tStuffing:SetBagsForSorting(\"d\")\n\t\tStuffing:Restack()\n\tend\n\tUIDropDownMenu_AddButton(info, level)\n\n\twipe(info)\n\tinfo.text = L_BAG_SHOW_BAGS\n\tinfo.checked = function()\n\t\treturn bag_bars == 1\n\tend\n\n\tinfo.func = function()\n\t\tif bag_bars == 1 then\n\t\t\tbag_bars = 0\n\t\telse\n\t\t\tbag_bars = 1\n\t\tend\n\t\tStuffing:Layout()\n\t\tif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then\n\t\t\tStuffing:Layout(true)\n\t\tend\n\tend\n\tUIDropDownMenu_AddButton(info, level)\n\n\twipe(info)\n\tinfo.disabled = nil\n\tinfo.notCheckable = 1\n\tinfo.text = CLOSE\n\tinfo.func = self.HideMenu\n\tinfo.tooltipTitle = CLOSE\n\tUIDropDownMenu_AddButton(info, level)\nend\n\nStaticPopupDialogs.BUY_BANK_SLOT = {\n\ttext = CONFIRM_BUY_BANK_SLOT,\n\tbutton1 = YES,\n\tbutton2 = NO,\n\tOnAccept = PurchaseSlot,\n\tOnShow = function(self)\n\t\tMoneyFrame_Update(self.moneyFrame, GetBankSlotCost())\n\tend,\n\thasMoneyFrame = 1,\n\ttimeout = 0,\n\thideOnEscape = 1,\n}\n\n-- Kill Blizzard functions\nLootWonAlertFrame_OnClick = T.dummy\nLootUpgradeFrame_OnClick = T.dummy\nLegendaryItemAlertFrame_OnClick = T.dummy\n"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/ClassColorNames.lua",
    "content": "﻿if IsAddOnLoaded(\"yClassColor\") then return end\n\n----------------------------------------------------------------------------------------\n--\tClass color guild/friends/etc list(yClassColor by Yleaf)\n----------------------------------------------------------------------------------------\nlocal GUILD_INDEX_MAX = 12\nlocal SMOOTH = {1, 0, 0, 1, 1, 0, 0, 1, 0}\nlocal BC = {}\nfor k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do\n\tBC[v] = k\nend\nfor k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do\n\tBC[v] = k\nend\nlocal RAID_CLASS_COLORS = CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS\nlocal WHITE_HEX = \"|cffffffff\"\n\nlocal function Hex(r, g, b)\n\tif type(r) == \"table\" then\n\t\tif (r.r) then r, g, b = r.r, r.g, r.b else r, g, b = unpack(r) end\n\tend\n\n\tif not r or not g or not b then\n\t\tr, g, b = 1, 1, 1\n\tend\n\n\treturn format(\"|cff%02x%02x%02x\", r * 255, g * 255, b * 255)\nend\n\nlocal function ColorGradient(perc, ...)\n\tif perc >= 1 then\n\t\tlocal r, g, b = select(select(\"#\", ...) - 2, ...)\n\t\treturn r, g, b\n\telseif perc <= 0 then\n\t\tlocal r, g, b = ...\n\t\treturn r, g, b\n\tend\n\n\tlocal num = select(\"#\", ...) / 3\n\n\tlocal segment, relperc = math.modf(perc * (num - 1))\n\tlocal r1, g1, b1, r2, g2, b2 = select((segment * 3) + 1, ...)\n\n\treturn r1 + (r2 - r1) * relperc, g1 + (g2 - g1) * relperc, b1 + (b2 - b1) * relperc\nend\n\nlocal guildRankColor = setmetatable({}, {\n\t__index = function(t, i)\n\t\tif i then\n\t\t\tlocal c = Hex(ColorGradient(i / GUILD_INDEX_MAX, unpack(SMOOTH)))\n\t\t\tif c then\n\t\t\t\tt[i] = c\n\t\t\t\treturn c\n\t\t\telse\n\t\t\t\tt[i] = t[0]\n\t\t\tend\n\t\tend\n\tend\n})\nguildRankColor[0] = WHITE_HEX\n\nlocal diffColor = setmetatable({}, {\n\t__index = function(t, i)\n\t\tlocal c = i and GetQuestDifficultyColor(i)\n\t\tt[i] = c and Hex(c) or t[0]\n\t\treturn t[i]\n\tend\n})\ndiffColor[0] = WHITE_HEX\n\nlocal classColor = setmetatable({}, {\n\t__index = function(t, i)\n\t\tlocal c = i and RAID_CLASS_COLORS[BC[i] or i]\n\t\tif c then\n\t\t\tt[i] = Hex(c)\n\t\t\treturn t[i]\n\t\telse\n\t\t\treturn WHITE_HEX\n\t\tend\n\tend\n})\n\nlocal WHITE = {1, 1, 1}\nlocal classColorRaw = setmetatable({}, {\n\t__index = function(t, i)\n\t\tlocal c = i and RAID_CLASS_COLORS[BC[i] or i]\n\t\tif not c then return WHITE end\n\t\tt[i] = c\n\t\treturn c\n\tend\n})\n\nif CUSTOM_CLASS_COLORS then\n\tCUSTOM_CLASS_COLORS:RegisterCallback(function()\n\t\twipe(classColorRaw)\n\t\twipe(classColor)\n\tend)\nend\n\n-- WhoList\nlocal function whoFrame(self)\n\tlocal playerZone = GetRealZoneText()\n\tlocal playerGuild = GetGuildInfo(\"player\")\n\tlocal playerRace = UnitRace(\"player\")\n\n\t for i = 1, self.ScrollTarget:GetNumChildren() do\n\t\tlocal button = select(i, self.ScrollTarget:GetChildren())\n\n\t\tlocal nameText = button.Name\n\t\tlocal levelText = button.Level\n\t\tlocal variableText = button.Variable\n\n\t\tlocal info = C_FriendList.GetWhoInfo(button.index)\n\t\tif info then\n\t\t\tlocal guild, level, race, zone, class = info.fullGuildName, info.level, info.raceStr, info.area, info.filename\n\t\t\tif zone == playerZone then\n\t\t\t\tzone = \"|cff00ff00\"..zone\n\t\t\tend\n\t\t\tif guild == playerGuild then\n\t\t\t\tguild = \"|cff00ff00\"..guild\n\t\t\tend\n\t\t\tif race == playerRace then\n\t\t\t\trace = \"|cff00ff00\"..race\n\t\t\tend\n\n\t\t\tlocal columnTable = {zone, guild, race}\n\n\t\t\tlocal c = classColorRaw[class]\n\t\t\tnameText:SetTextColor(c.r, c.g, c.b)\n\t\t\tlevelText:SetText(diffColor[level]..level)\n\t\t\tvariableText:SetText(columnTable[UIDropDownMenu_GetSelectedID(_G.WhoFrameDropDown)])\n\t\tend\n\tend\nend\n\nhooksecurefunc(_G.WhoFrame.ScrollBox, \"Update\", whoFrame)\n\n-- LFRBrowseList\nhooksecurefunc(\"LFRBrowseFrameListButton_SetData\", function(button, index)\n\tlocal name, level, _, className, _, _, _, class = SearchLFGGetResults(index)\n\n\tif index and class and name and level then\n\t\tbutton.name:SetText(classColor[class]..name)\n\t\tbutton.class:SetText(classColor[class]..className)\n\t\tbutton.level:SetText(diffColor[level]..level)\n\t\tbutton.level:SetWidth(30)\n\tend\nend)\n\n-- PVPMatchResults\nhooksecurefunc(PVPCellNameMixin, \"Populate\", function(self, rowData)\n\tlocal name = rowData.name\n\tlocal className = rowData.className or \"\"\n\tlocal n, r = strsplit(\"-\", name, 2)\n\tn = classColor[className]..n..\"|r\"\n\n\tif name == UnitName(\"player\") then\n\t\tn = \">>> \"..n..\" <<<\"\n\tend\n\n\tif r then\n\t\tlocal color\n\t\tlocal faction = rowData.faction\n\t\tlocal inArena = IsActiveBattlefieldArena()\n\t\tif inArena then\n\t\t\tif faction == 1 then\n\t\t\t\tcolor = \"|cffffd100\"\n\t\t\telse\n\t\t\t\tcolor = \"|cff19ff19\"\n\t\t\tend\n\t\telse\n\t\t\tif faction == 1 then\n\t\t\t\tcolor = \"|cff00adf0\"\n\t\t\telse\n\t\t\t\tcolor = \"|cffff1919\"\n\t\t\tend\n\t\tend\n\t\tr = color..r..\"|r\"\n\t\tn = n..\"|cffffffff - |r\"..r\n\tend\n\n\tlocal text = self.text\n\ttext:SetText(n)\nend)\n\nlocal _VIEW\n\nlocal function viewChanged(view)\n\t_VIEW = view\nend\n\n-- GuildList\nlocal function update()\n\t_VIEW = _VIEW or GetCVar(\"guildRosterView\")\n\tlocal playerArea = GetRealZoneText()\n\tlocal buttons = GuildRosterContainer.buttons\n\n\tfor _, button in ipairs(buttons) do\n\t\tif button:IsShown() and button.online and button.guildIndex then\n\t\t\tif _VIEW == \"tradeskill\" then\n\t\t\t\tlocal _, _, _, headerName, _, _, _, playerName, _, _, _, zone, _, classFileName, isMobile = GetGuildTradeSkillInfo(button.guildIndex)\n\t\t\t\tif not headerName and playerName then\n\t\t\t\t\tlocal c = classColorRaw[classFileName]\n\t\t\t\t\tbutton.string1:SetTextColor(c.r, c.g, c.b)\n\t\t\t\t\tif not isMobile and zone == playerArea then\n\t\t\t\t\t\tbutton.string2:SetText(\"|cff00ff00\"..zone)\n\t\t\t\t\telseif isMobile then\n\t\t\t\t\t\tbutton.string2:SetText(\"|cffa5a5a5\"..REMOTE_CHAT)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal name, rank, rankIndex, level, _, zone, _, _, _, isAway, classFileName, _, _, isMobile = GetGuildRosterInfo(button.guildIndex)\n\t\t\t\tname = string.gsub(name, \"-.*\", \"\")\n\t\t\t\tlocal displayedName = classColor[classFileName]..name\n\t\t\t\tif isMobile then\n\t\t\t\t\tif isAway == 1 then\n\t\t\t\t\t\tdisplayedName = \"|TInterface\\\\ChatFrame\\\\UI-ChatIcon-ArmoryChat-AwayMobile:14:14:0:0:16:16:0:16:0:16|t\"..displayedName..\" |cffE7E716\"..L_CHAT_AFK..\"|r\"\n\t\t\t\t\telseif isAway == 2 then\n\t\t\t\t\t\tdisplayedName = \"|TInterface\\\\ChatFrame\\\\UI-ChatIcon-ArmoryChat-BusyMobile:14:14:0:0:16:16:0:16:0:16|t\"..displayedName..\" |cffff0000\"..L_CHAT_DND..\"|r\"\n\t\t\t\t\telse\n\t\t\t\t\t\tdisplayedName = ChatFrame_GetMobileEmbeddedTexture(0.3, 1, 0.3)..displayedName\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif isAway == 1 then\n\t\t\t\t\t\tdisplayedName = displayedName..\" |cffE7E716\"..L_CHAT_AFK..\"|r\"\n\t\t\t\t\telseif isAway == 2 then\n\t\t\t\t\t\tdisplayedName = displayedName..\" |cffff0000\"..L_CHAT_DND..\"|r\"\n\t\t\t\t\telse\n\t\t\t\t\t\tdisplayedName = displayedName\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif _VIEW == \"playerStatus\" then\n\t\t\t\t\tbutton.string1:SetText(diffColor[level]..level)\n\t\t\t\t\tbutton.string2:SetText(displayedName)\n\t\t\t\t\tif not isMobile and zone == playerArea then\n\t\t\t\t\t\tbutton.string3:SetText(\"|cff4cff4c\"..zone)\n\t\t\t\t\telseif isMobile then\n\t\t\t\t\t\tbutton.string3:SetText(\"|cffa5a5a5\"..REMOTE_CHAT)\n\t\t\t\t\tend\n\t\t\t\telseif _VIEW == \"guildStatus\" then\n\t\t\t\t\tbutton.string1:SetText(displayedName)\n\t\t\t\t\tif rankIndex and rank then\n\t\t\t\t\t\tbutton.string2:SetText(guildRankColor[rankIndex]..rank)\n\t\t\t\t\tend\n\t\t\t\telseif _VIEW == \"achievement\" then\n\t\t\t\t\tbutton.string1:SetText(diffColor[level]..level)\n\t\t\t\t\tif classFileName and name then\n\t\t\t\t\t\tbutton.string2:SetText(displayedName)\n\t\t\t\t\tend\n\t\t\t\telseif _VIEW == \"reputation\" then\n\t\t\t\t\tbutton.string1:SetText(diffColor[level]..level)\n\t\t\t\t\tbutton.string2:SetText(displayedName)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal loaded = false\nhooksecurefunc(\"GuildFrame_LoadUI\", function()\n\tif loaded then\n\t\treturn\n\telse\n\t\tloaded = true\n\t\thooksecurefunc(\"GuildRoster_SetView\", viewChanged)\n\t\thooksecurefunc(\"GuildRoster_Update\", update)\n\t\thooksecurefunc(GuildRosterContainer, \"update\", update)\n\tend\nend)\n\n-- CommunitiesFrame\nlocal function RefreshList(self)\n\tlocal playerArea = GetRealZoneText()\n\tlocal memberInfo = self:GetMemberInfo()\n\tif memberInfo then\n\t\tif memberInfo.presence == Enum.ClubMemberPresence.Offline then return end\n\t\tif memberInfo.zone and memberInfo.zone == playerArea then\n\t\t\tself.Zone:SetText(\"|cff4cff4c\"..memberInfo.zone)\n\t\tend\n\n\t\tif memberInfo.level then\n\t\t\tself.Level:SetText(diffColor[memberInfo.level]..memberInfo.level)\n\t\tend\n\n\t\tif memberInfo.guildRankOrder and memberInfo.guildRank then\n\t\t\tself.Rank:SetText(guildRankColor[memberInfo.guildRankOrder]..memberInfo.guildRank)\n\t\tend\n\tend\nend\n\nlocal loaded = false\nhooksecurefunc(\"Communities_LoadUI\", function()\n\tif loaded then\n\t\treturn\n\telse\n\t\tloaded = true\n\t\thooksecurefunc(CommunitiesMemberListEntryMixin, \"RefreshExpandedColumns\", RefreshList)\n\tend\nend)\n\n-- FriendsList\nlocal FRIENDS_LEVEL_TEMPLATE = FRIENDS_LEVEL_TEMPLATE:gsub(\"%%d\", \"%%s\")\nFRIENDS_LEVEL_TEMPLATE = FRIENDS_LEVEL_TEMPLATE:gsub(\"%$d\", \"%$s\")\nlocal function friendsFrame(self)\n\tlocal playerArea = GetRealZoneText()\n\n\tfor i = 1, self.ScrollTarget:GetNumChildren() do\n\t\tlocal nameText, infoText\n\t\tlocal button = select(i, self.ScrollTarget:GetChildren())\n\t\tif button:IsShown() then\n\t\t\tif button.buttonType == FRIENDS_BUTTON_TYPE_WOW then\n\t\t\t\tlocal info = C_FriendList.GetFriendInfoByIndex(button.id)\n\t\t\t\tif info.connected then\n\t\t\t\t\tnameText = classColor[info.className]..info.name..\"|r, \"..format(FRIENDS_LEVEL_TEMPLATE, diffColor[info.level]..info.level..\"|r\", info.className)\n\t\t\t\t\tif info.area == playerArea then\n\t\t\t\t\t\tinfoText = format(\"|cff00ff00%s|r\", info.area)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif button.buttonType == FRIENDS_BUTTON_TYPE_BNET then\n\t\t\t\tlocal accountInfo = C_BattleNet.GetFriendAccountInfo(button.id)\n\t\t\t\tif accountInfo.gameAccountInfo.isOnline and accountInfo.gameAccountInfo.clientProgram == BNET_CLIENT_WOW then\n\t\t\t\t\tlocal accountName = accountInfo.accountName\n\t\t\t\t\tlocal characterName = accountInfo.gameAccountInfo.characterName\n\t\t\t\t\tlocal class = accountInfo.gameAccountInfo.className\n\t\t\t\t\tlocal areaName = accountInfo.gameAccountInfo.areaName\n\t\t\t\t\tif accountName and characterName and class then\n\t\t\t\t\t\tnameText = format(BATTLENET_NAME_FORMAT, accountName, \"\")..\" \"..FRIENDS_WOW_NAME_COLOR_CODE..\"(\"..classColor[class]..classColor[class]..characterName..FRIENDS_WOW_NAME_COLOR_CODE..\")\"\n\t\t\t\t\t\tif areaName == playerArea then\n\t\t\t\t\t\t\tinfoText = format(\"|cff00ff00%s|r\", areaName)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif nameText then\n\t\t\tbutton.name:SetText(nameText)\n\t\tend\n\t\tif infoText then\n\t\t\tbutton.info:SetText(infoText)\n\t\tend\n\tend\nend\n\nhooksecurefunc(FriendsListFrame.ScrollBox, \"Update\", friendsFrame)"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/ColorPicker.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.general.color_picker ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tImproved ColorPicker(ColorPickerPlus by Jaslm)\n----------------------------------------------------------------------------------------\nlocal colorBuffer = {}\nlocal editingText\n\nlocal function UpdateAlphaText()\n\tlocal a = OpacitySliderFrame:GetValue()\n\ta = (1 - a) * 100\n\ta = math.floor(a + 0.05)\n\tColorPPBoxA:SetText(string.format(\"%d\", a))\nend\n\nlocal function UpdateAlpha(tbox)\n\tlocal a = tbox:GetNumber()\n\tif a > 100 then\n\t\ta = 100\n\t\tColorPPBoxA:SetText(string.format(\"%d\", a))\n\tend\n\ta = 1 - (a / 100)\n\teditingText = true\n\tOpacitySliderFrame:SetValue(a)\n\teditingText = nil\nend\n\nlocal function UpdateColorTexts(r, g, b)\n\tif not r then r, g, b = ColorPickerFrame:GetColorRGB() end\n\tr = math.floor (r * 255 + 0.5)\n\tg = math.floor (g * 255 + 0.5)\n\tb = math.floor (b * 255 + 0.5)\n\tColorPPBoxR:SetText(string.format(\"%d\", r))\n\tColorPPBoxG:SetText(string.format(\"%d\", g))\n\tColorPPBoxB:SetText(string.format(\"%d\", b))\n\tColorPPBoxH:SetText(string.format(\"%.2x\", r)..string.format(\"%.2x\", g)..string.format(\"%.2x\", b))\nend\n\nlocal function UpdateColor(tbox)\n\tlocal r, g, b = ColorPickerFrame:GetColorRGB()\n\tlocal id = tbox:GetID()\n\n\tif id == 1 then\n\t\tr = string.format(\"%d\", tbox:GetNumber())\n\t\tif not r then r = 0 end\n\t\tr = r / 255\n\telseif id == 2 then\n\t\tg = string.format(\"%d\", tbox:GetNumber())\n\t\tif not g then g = 0 end\n\t\tg = g / 255\n\telseif id == 3 then\n\t\tb = string.format(\"%d\", tbox:GetNumber())\n\t\tif not b then b = 0 end\n\t\tb = b / 255\n\telseif id == 4 then\n\t\t-- hex values\n\t\tif tbox:GetNumLetters() == 6 then\n\t\t\tlocal rgb = tbox:GetText()\n\t\t\tr, g, b = tonumber(\"0x\"..strsub(rgb, 0, 2)), tonumber(\"0x\"..strsub(rgb, 3, 4)), tonumber(\"0x\"..strsub(rgb, 5, 6))\n\t\t\tif not r then r = 0 else r = r / 255 end\n\t\t\tif not g then g = 0 else g = g / 255 end\n\t\t\tif not b then b = 0 else b = b / 255 end\n\t\telse\n\t\t\treturn\n\t\tend\n\tend\n\n\t-- This takes care of updating the hex entry when changing rgb fields and vice versa\n\tUpdateColorTexts(r, g, b)\n\n\teditingText = true\n\tColorPickerFrame:SetColorRGB(r, g, b)\n\tColorSwatch:SetColorTexture(r, g, b)\n\teditingText = nil\nend\n\nlocal load = CreateFrame(\"Frame\")\nload:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nload:SetScript(\"OnEvent\", function(self)\n\tself:UnregisterAllEvents()\n\n\tif IsAddOnLoaded(\"ColorPickerPlus\") then return end\n\n\tColorPickerFrame:HookScript(\"OnShow\", function()\n\t\t-- Get color that will be replaced\n\t\tlocal r, g, b = ColorPickerFrame:GetColorRGB()\n\t\tColorPPOldColorSwatch:SetColorTexture(r, g, b)\n\n\t\t-- Show/hide the alpha box\n\t\tif ColorPickerFrame.hasOpacity then\n\t\t\tColorPPBoxA:Show()\n\t\t\tColorPPBoxLabelA:Show()\n\t\t\tColorPPBoxH:SetScript(\"OnTabPressed\", function() ColorPPBoxA:SetFocus() end)\n\t\t\tUpdateAlphaText()\n\t\telse\n\t\t\tColorPPBoxA:Hide()\n\t\t\tColorPPBoxLabelA:Hide()\n\t\t\tColorPPBoxH:SetScript(\"OnTabPressed\", function() ColorPPBoxR:SetFocus() end)\n\t\tend\n\tend)\n\n\tColorPickerFrame:HookScript(\"OnColorSelect\", function(_, r, g, b)\n\t\tColorSwatch:SetColorTexture(r, g, b)\n\t\tif not editingText then\n\t\t\tUpdateColorTexts(r, g, b)\n\t\tend\n\tend)\n\n\tOpacitySliderFrame:HookScript(\"OnValueChanged\", function()\n\t\tif not editingText then\n\t\t\tUpdateAlphaText()\n\t\tend\n\tend)\n\n\t-- Make the Color Picker dialog a bit taller, to make room for edit boxes\n\tColorPickerFrame:SetHeight(ColorPickerFrame:GetHeight() + 40)\n\n\t-- Move the Color Swatch\n\tColorSwatch:ClearAllPoints()\n\tColorSwatch:SetPoint(\"TOPLEFT\", ColorPickerFrame, \"TOPLEFT\", 230, -45)\n\n\t-- Add Color Swatch for original color\n\tlocal t = ColorPickerFrame:CreateTexture(\"ColorPPOldColorSwatch\")\n\tlocal w, h = ColorSwatch:GetSize()\n\tt:SetSize(w * 0.75, h * 0.75)\n\tt:SetColorTexture(0, 0, 0)\n\n\t-- OldColorSwatch to appear beneath ColorSwatch\n\tt:SetDrawLayer(\"BORDER\")\n\tt:SetPoint(\"BOTTOMLEFT\", \"ColorSwatch\", \"TOPRIGHT\", -(w / 2), -(h / 3))\n\n\t-- Add Color Swatch for the copied color\n\tt = ColorPickerFrame:CreateTexture(\"ColorPPCopyColorSwatch\")\n\tt:SetSize(w, h)\n\tt:SetColorTexture(0, 0, 0)\n\tt:Hide()\n\n\t-- Add copy button to the ColorPickerFrame\n\tlocal b = CreateFrame(\"Button\", \"ColorPPCopy\", ColorPickerFrame, \"UIPanelButtonTemplate\")\n\tb:SkinButton()\n\tb:SetText(CALENDAR_COPY_EVENT)\n\tb:SetWidth(85)\n\tb:SetHeight(22)\n\tb:SetPoint(\"TOPLEFT\", \"ColorSwatch\", \"BOTTOMLEFT\", -15, -5)\n\n\t-- Copy color into buffer on button click\n\tb:SetScript(\"OnClick\", function()\n\t\t-- Copy current dialog colors into buffer\n\t\tcolorBuffer.r, colorBuffer.g, colorBuffer.b = ColorPickerFrame:GetColorRGB()\n\n\t\t-- Enable Paste button and display copied color into swatch\n\t\tColorPPPaste:Enable()\n\t\tColorPPCopyColorSwatch:SetColorTexture(colorBuffer.r, colorBuffer.g, colorBuffer.b)\n\t\tColorPPCopyColorSwatch:Show()\n\n\t\tif ColorPickerFrame.hasOpacity then\n\t\t\tcolorBuffer.a = OpacitySliderFrame:GetValue()\n\t\telse\n\t\t\tcolorBuffer.a = nil\n\t\tend\n\tend)\n\n\t-- Paste button\n\tb = CreateFrame(\"Button\", \"ColorPPPaste\", ColorPickerFrame, \"UIPanelButtonTemplate\")\n\tb:SetText(CALENDAR_PASTE_EVENT)\n\tb:SkinButton()\n\tb:SetWidth(85)\n\tb:SetHeight(22)\n\tb:SetPoint(\"TOPLEFT\", \"ColorPPCopy\", \"BOTTOMLEFT\", 0, -7)\n\tb:Disable()\n\n\t-- Paste color on button click, updating frame components\n\tb:SetScript(\"OnClick\", function()\n\t\tColorPickerFrame:SetColorRGB(colorBuffer.r, colorBuffer.g, colorBuffer.b)\n\t\tColorSwatch:SetColorTexture(colorBuffer.r, colorBuffer.g, colorBuffer.b)\n\t\tif ColorPickerFrame.hasOpacity then\n\t\t\tif colorBuffer.a then -- Color copied had an alpha value\n\t\t\t\tOpacitySliderFrame:SetValue(colorBuffer.a)\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- ClassColor button\n\tb = CreateFrame(\"Button\", \"ColorPPClass\", ColorPickerFrame, \"UIPanelButtonTemplate\")\n\tb:SkinButton()\n\tb:SetText(CLASS)\n\tb:SetWidth(b:GetWidth() + 10)\n\tb:SetHeight(22)\n\tb:SetPoint(\"TOPRIGHT\", \"ColorPPPaste\", \"BOTTOMRIGHT\", 0, -7)\n\n\tb:SetScript(\"OnClick\", function()\n\t\tColorPickerFrame:SetColorRGB(T.color.r, T.color.g, T.color.b)\n\t\tColorSwatch:SetColorTexture(T.color.r, T.color.g, T.color.b)\n\t\tif ColorPickerFrame.hasOpacity then\n\t\t\tOpacitySliderFrame:SetValue(0)\n\t\tend\n\tend)\n\n\t-- Locate Color Swatch for copy color\n\tColorPPCopyColorSwatch:SetPoint(\"LEFT\", \"ColorSwatch\", \"LEFT\")\n\tColorPPCopyColorSwatch:SetPoint(\"TOP\", \"ColorPPPaste\", \"BOTTOM\", 0, -5)\n\n\t-- Move the Opacity Slider Frame to align with bottom of Copy ColorSwatch\n\tOpacitySliderFrame:ClearAllPoints()\n\tOpacitySliderFrame:SetPoint(\"BOTTOM\", \"ColorPPCopyColorSwatch\", \"BOTTOM\", 0, 23)\n\tOpacitySliderFrame:SetPoint(\"RIGHT\", \"ColorPickerFrame\", \"RIGHT\", -35, 18)\n\n\t-- Set up edit box frames and interior label and text areas\n\tlocal boxes = {\"R\", \"G\", \"B\", \"H\", \"A\"}\n\tfor i = 1, table.getn(boxes) do\n\t\tlocal rgb = boxes[i]\n\t\tlocal box = CreateFrame(\"EditBox\", \"ColorPPBox\"..rgb, ColorPickerFrame, \"InputBoxTemplate\")\n\t\tT.SkinEditBox(box)\n\t\tbox:SetID(i)\n\t\tbox:SetFrameStrata(\"DIALOG\")\n\t\tbox:SetAutoFocus(false)\n\t\tbox:SetTextInsets(0, 7, 1, 0)\n\t\tbox:SetJustifyH(\"RIGHT\")\n\t\tbox:SetHeight(14)\n\n\t\tif i == 4 then\n\t\t\t-- Hex entry box\n\t\t\tbox:SetMaxLetters(6)\n\t\t\tbox:SetWidth(60)\n\t\t\tbox:SetNumeric(false)\n\t\telse\n\t\t\tbox:SetMaxLetters(3)\n\t\t\tbox:SetWidth(40)\n\t\t\tbox:SetNumeric(true)\n\t\tend\n\t\tbox:SetPoint(\"TOP\", \"ColorPickerWheel\", \"BOTTOM\", 0, -15)\n\n\t\t-- Label\n\t\tlocal label = box:CreateFontString(\"ColorPPBoxLabel\"..rgb, \"ARTWORK\", \"GameFontNormalSmall\")\n\t\tlabel:SetTextColor(1, 1, 1)\n\t\tlabel:SetPoint(\"RIGHT\", \"ColorPPBox\"..rgb, \"LEFT\", -5, 0)\n\t\tif i == 4 then\n\t\t\tlabel:SetText(\"#\")\n\t\telse\n\t\t\tlabel:SetText(rgb)\n\t\tend\n\n\t\t-- Set up scripts to handle event appropriately\n\t\tif i == 5 then\n\t\t\tbox:SetScript(\"OnEscapePressed\", function(self) self:ClearFocus() UpdateAlphaText() end)\n\t\t\tbox:SetScript(\"OnEnterPressed\", function(self) self:ClearFocus() UpdateAlphaText() end)\n\t\t\tbox:SetScript(\"OnTextChanged\", function(self) UpdateAlpha(self) end)\n\t\telse\n\t\t\tbox:SetScript(\"OnEscapePressed\", function(self) self:ClearFocus() UpdateColorTexts() end)\n\t\t\tbox:SetScript(\"OnEnterPressed\", function(self) self:ClearFocus() UpdateColorTexts() end)\n\t\t\tbox:SetScript(\"OnTextChanged\", function(self) UpdateColor(self) end)\n\t\tend\n\n\t\tbox:SetScript(\"OnEditFocusGained\", function(self) self:SetCursorPosition(0) self:HighlightText() end)\n\t\tbox:SetScript(\"OnEditFocusLost\", function(self) self:HighlightText(0, 0) end)\n\t\tbox:SetScript(\"OnTextSet\", function(self) self:ClearFocus() end)\n\t\tbox:Show()\n\tend\n\n\t-- Finish up with placement\n\tColorPPBoxR:SetPoint(\"BOTTOMLEFT\", \"ColorPickerOkayButton\", \"TOPLEFT\", 13, 24)\n\tColorPPBoxG:SetPoint(\"LEFT\", \"ColorPPBoxR\", \"RIGHT\", 18, 0)\n\tColorPPBoxB:SetPoint(\"LEFT\", \"ColorPPBoxG\", \"RIGHT\", 18, 0)\n\tColorPPBoxH:SetPoint(\"LEFT\", \"ColorPPBoxB\", \"RIGHT\", 18, 0)\n\tColorPPBoxA:SetPoint(\"LEFT\", \"ColorPPBoxH\", \"RIGHT\", 18, 0)\n\n\t-- Define the order of tab cursor movement\n\tColorPPBoxR:SetScript(\"OnTabPressed\", function() ColorPPBoxG:SetFocus() end)\n\tColorPPBoxG:SetScript(\"OnTabPressed\", function() ColorPPBoxB:SetFocus() end)\n\tColorPPBoxB:SetScript(\"OnTabPressed\", function() ColorPPBoxH:SetFocus() end)\n\tColorPPBoxA:SetScript(\"OnTabPressed\", function() ColorPPBoxR:SetFocus() end)\n\n\t-- Make the color picker movable\n\tlocal mover = CreateFrame(\"Frame\", nil, ColorPickerFrame)\n\tmover:SetPoint(\"TOPLEFT\", ColorPickerFrame, \"TOPLEFT\", 0, 0)\n\tmover:SetPoint(\"BOTTOMRIGHT\", ColorPickerFrame, \"TOPRIGHT\", 0, -15)\n\tmover:EnableMouse(true)\n\tmover:SetScript(\"OnMouseDown\", function() ColorPickerFrame:StartMoving() end)\n\tmover:SetScript(\"OnMouseUp\", function() ColorPickerFrame:StopMovingOrSizing() end)\n\tColorPickerFrame:EnableKeyboard(false)\nend)"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/CombatText.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.combattext.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCombat Text(xCT by Affli)\n----------------------------------------------------------------------------------------\n-- Justify messages in frames\nlocal ct = {\n\t[\"justify_1\"] = \"LEFT\",\t\t\t-- Incoming damage justify\n\t[\"justify_2\"] = \"RIGHT\",\t\t-- Incoming healing justify\n\t[\"justify_3\"] = \"CENTER\",\t\t-- Various messages justify\n\t[\"justify_4\"] = \"RIGHT\",\t\t-- Outgoing damage/healing justify\n}\n\n-- Do not edit below unless you know what you are doing\nlocal numf\nif C.combattext.damage or C.combattext.healing then\n\tnumf = 4\nelse\n\tnumf = 3\nend\n\n-- Detect vehicle\nlocal function SetUnit()\n\tif UnitHasVehicleUI(\"player\") then\n\t\tct.unit = \"vehicle\"\n\telse\n\t\tct.unit = \"player\"\n\tend\n\tCombatTextSetActiveUnit(ct.unit)\nend\n\n-- Limit lines\nlocal function LimitLines()\n\tfor i = 1, #ct.frames do\n\t\tlocal f = ct.frames[i]\n\t\tif i == 4 and C.combattext.icons then\n\t\t\tf:SetMaxLines(math.floor(f:GetHeight() / (C.combattext.icon_size * 1.5)))\n\t\telse\n\t\t\tf:SetMaxLines(math.floor(f:GetHeight() / C.font.combat_text_font_size - 1))\n\t\tend\n\tend\nend\n\n-- Scrollable frames\nlocal function SetScroll()\n\tfor i = 1, #ct.frames do\n\t\tct.frames[i]:EnableMouseWheel(true)\n\t\tct.frames[i]:SetScript(\"OnMouseWheel\", function(self, delta)\n\t\t\tif delta > 0 then\n\t\t\t\tself:ScrollUp()\n\t\t\telseif delta < 0 then\n\t\t\t\tself:ScrollDown()\n\t\t\tend\n\t\tend)\n\tend\nend\n\n-- Partial resists styler\nlocal part = \"-%s [%s %s]\"\nlocal r, g, b, lowMana, lowHealth\n\n-- Function, handles everything\nlocal function OnEvent(_, event, subevent, powerType)\n\tif event == \"COMBAT_TEXT_UPDATE\" then\n\t\tlocal arg2, arg3 = GetCurrentCombatTextEventInfo()\n\t\tif not CVarCallbackRegistry:GetCVarValueBool(\"enableFloatingCombatText\") then\n\t\t\treturn\n\t\telse\n\t\t\tif subevent == \"DAMAGE\" then\n\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\tend\n\t\t\t\txCT1:AddMessage(\"-\"..arg2, 0.75, 0.1, 0.1)\n\t\t\telseif subevent == \"DAMAGE_CRIT\" then\n\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\tend\n\t\t\t\txCT1:AddMessage(\"|cffFF0000\"..C.combattext.crit_prefix..\"|r\"..\"-\"..arg2..\"|cffFF0000\"..C.combattext.crit_postfix..\"|r\", 1, 0.1, 0.1)\n\t\t\telseif subevent == \"SPELL_DAMAGE\" then\n\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\tend\n\t\t\t\txCT1:AddMessage(\"-\"..arg2, 0.75, 0.3, 0.85)\n\t\t\telseif subevent == \"SPELL_DAMAGE_CRIT\" then\n\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\tend\n\t\t\t\txCT1:AddMessage(\"|cffFF0000\"..C.combattext.crit_prefix..\"|r\"..\"-\"..arg2..\"|cffFF0000\"..C.combattext.crit_postfix..\"|r\", 1, 0.3, 0.5)\n\t\t\telseif subevent == \"HEAL\" then\n\t\t\t\tif arg3 >= C.combattext.heal_treshold then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif arg2 then\n\t\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextFriendlyHealers\") then\n\t\t\t\t\t\t\txCT2:AddMessage(arg2..\" +\"..arg3, 0.1, 0.75, 0.1)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\txCT2:AddMessage(\"+\"..arg3, 0.1, 0.75, 0.1)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif subevent == \"HEAL_CRIT\" then\n\t\t\t\tif arg3 >= C.combattext.heal_treshold then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif arg2 then\n\t\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextFriendlyHealers\") then\n\t\t\t\t\t\t\txCT2:AddMessage(arg2..\" +\"..arg3, 0.1, 1, 0.1)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\txCT2:AddMessage(\"+\"..arg3, 0.1, 1, 0.1)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif subevent == \"PERIODIC_HEAL\" then\n\t\t\t\tif arg3 >= C.combattext.heal_treshold then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\txCT2:AddMessage(\"+\"..arg3, 0.1, 0.5, 0.1)\n\t\t\t\tend\n\t\t\telseif subevent == \"ABSORB_ADDED\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextCombatHealingAbsorbSelf\") then\n\t\t\t\tif arg3 >= C.combattext.heal_treshold then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif arg2 then\n\t\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextFriendlyHealers\") then\n\t\t\t\t\t\t\txCT2:AddMessage(arg2..\" +\"..arg3, 0.6, 0.65, 0.1)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\txCT2:AddMessage(\"+\"..arg3, 0.6, 0.65, 0.1)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif subevent == \"SPELL_CAST\" then\n\t\t\t\txCT3:AddMessage(arg2, 1, 0.82, 0)\n\t\t\telseif subevent == \"MISS\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(MISS, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"DODGE\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(DODGE, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"PARRY\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(PARRY, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"EVADE\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(EVADE, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"IMMUNE\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(IMMUNE, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"DEFLECT\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(DEFLECT, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"REFLECT\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(REFLECT, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_MISS\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(MISS, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_DODGE\"and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(DODGE, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_PARRY\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(PARRY, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_EVADE\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(EVADE, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_IMMUNE\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(IMMUNE, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_DEFLECT\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(DEFLECT, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_REFLECT\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDodgeParryMiss\") then\n\t\t\t\txCT1:AddMessage(REFLECT, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"RESIST\" then\n\t\t\t\tif arg3 then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\t\txCT1:AddMessage(part:format(arg2, RESIST, arg3), 0.75, 0.5, 0.5)\n\t\t\t\t\telse\n\t\t\t\t\t\txCT1:AddMessage(\"-\"..arg2, 0.75, 0.1, 0.1)\n\t\t\t\t\tend\n\t\t\t\telseif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\txCT1:AddMessage(RESIST, 0.5, 0.5, 0.5)\n\t\t\t\tend\n\t\t\telseif subevent == \"BLOCK\" then\n\t\t\t\tif arg3 then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\t\txCT1:AddMessage(part:format(arg2, BLOCK, arg3), 0.75, 0.5, 0.5)\n\t\t\t\t\telse\n\t\t\t\t\t\txCT1:AddMessage(\"-\"..arg2, 0.75, 0.1, 0.1)\n\t\t\t\t\tend\n\t\t\t\telseif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\txCT1:AddMessage(BLOCK, 0.5, 0.5, 0.5)\n\t\t\t\tend\n\t\t\telseif subevent == \"ABSORB\" then\n\t\t\t\tif arg3 then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\t\txCT1:AddMessage(part:format(arg2, ABSORB, arg3), 0.75, 0.5, 0.5)\n\t\t\t\t\telse\n\t\t\t\t\t\txCT1:AddMessage(\"-\"..arg2, 0.75, 0.1, 0.1)\n\t\t\t\t\tend\n\t\t\t\telseif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\txCT1:AddMessage(ABSORB, 0.5, 0.5, 0.5)\n\t\t\t\tend\n\t\t\telseif subevent == \"SPELL_RESIST\" then\n\t\t\t\tif arg3 then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\t\txCT1:AddMessage(part:format(arg2, RESIST, arg3), 0.5, 0.3, 0.5)\n\t\t\t\t\telse\n\t\t\t\t\t\txCT1:AddMessage(\"-\"..arg2, 0.75, 0.3, 0.85)\n\t\t\t\t\tend\n\t\t\t\telseif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\txCT1:AddMessage(RESIST, 0.5, 0.5, 0.5)\n\t\t\t\tend\n\t\t\telseif subevent == \"SPELL_BLOCK\" then\n\t\t\t\tif arg3 then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\t\txCT1:AddMessage(part:format(arg2, BLOCK, arg3), 0.5, 0.3, 0.5)\n\t\t\t\t\telse\n\t\t\t\t\t\txCT1:AddMessage(\"-\"..arg2, 0.75, 0.3, 0.85)\n\t\t\t\t\tend\n\t\t\t\telseif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\txCT1:AddMessage(BLOCK, 0.5, 0.5, 0.5)\n\t\t\t\tend\n\t\t\telseif subevent == \"SPELL_ABSORB\" then\n\t\t\t\tif arg3 then\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\targ2 = T.ShortValue(arg2)\n\t\t\t\t\t\targ3 = T.ShortValue(arg3)\n\t\t\t\t\tend\n\t\t\t\t\tif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\t\txCT1:AddMessage(part:format(arg2, ABSORB, arg3), 0.5, 0.3, 0.5)\n\t\t\t\t\telse\n\t\t\t\t\t\txCT1:AddMessage(\"-\"..arg2, 0.75, 0.3, 0.85)\n\t\t\t\t\tend\n\t\t\t\telseif CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextDamageReduction\") then\n\t\t\t\t\txCT1:AddMessage(ABSORB, 0.5, 0.5, 0.5)\n\t\t\t\tend\n\t\t\telseif (subevent == \"ENERGIZE\" or subevent == \"PERIODIC_ENERGIZE\") and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextEnergyGains\") then\n\t\t\t\tif tonumber(arg2) > 0 then\n\t\t\t\t\tif arg3 then\n\t\t\t\t\t\tif arg3 == \"MANA\" or arg3 == \"RAGE\" or arg3 == \"FOCUS\" or arg3 == \"ENERGY\" or arg3 == \"RUNIC_POWER\" or arg3 == \"DEMONIC_FURY\" then\n\t\t\t\t\t\t\txCT3:AddMessage(\"+\"..arg2..\" \".._G[arg3], PowerBarColor[arg3].r, PowerBarColor[arg3].g, PowerBarColor[arg3].b)\n\t\t\t\t\t\telseif arg3 == \"HOLY_POWER\" or arg3 == \"SOUL_SHARDS\" or arg3 == \"CHI\" or arg3 == \"ARCANE_CHARGES\" then\n\t\t\t\t\t\t\tlocal numPower = UnitPower(\"player\", GetPowerEnumFromEnergizeString(arg3))\n\t\t\t\t\t\t\txCT3:AddMessage(\"<\"..numPower..\" \".._G[arg3]..\">\", PowerBarColor[arg3].r, PowerBarColor[arg3].g, PowerBarColor[arg3].b)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif subevent == \"SPELL_AURA_START\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextAuras\") then\n\t\t\t\txCT3:AddMessage(\"+\"..arg2, 1, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_AURA_END\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextAuras\") then\n\t\t\t\txCT3:AddMessage(\"-\"..arg2, 0.5, 0.5, 0.5)\n\t\t\telseif subevent == \"SPELL_AURA_START_HARMFUL\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextAuras\") then\n\t\t\t\txCT3:AddMessage(\"+\"..arg2, 1, 0.1, 0.1)\n\t\t\telseif subevent == \"SPELL_AURA_END_HARMFUL\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextAuras\") then\n\t\t\t\txCT3:AddMessage(\"-\"..arg2, 0.1, 1, 0.1)\n\t\t\telseif subevent == \"HONOR_GAINED\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextHonorGains\") then\n\t\t\t\targ2 = tonumber(arg2)\n\t\t\t\tif arg2 and abs(arg2) > 1 then\n\t\t\t\t\targ2 = floor(arg2)\n\t\t\t\t\tif arg2 > 0 then\n\t\t\t\t\t\txCT3:AddMessage(HONOR..\" +\"..arg2, 0.1, 0.1, 1)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif subevent == \"FACTION\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextRepChanges\") then\n\t\t\t\txCT3:AddMessage(arg2..\" +\"..arg3, 0.1, 0.1, 1)\n\t\t\telseif subevent == \"SPELL_ACTIVE\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextReactives\") then\n\t\t\t\txCT3:AddMessage(arg2, 1, 0.82, 0)\n\t\t\tend\n\t\tend\n\telseif event == \"UNIT_HEALTH\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextLowManaHealth\") then\n\t\tif subevent == ct.unit then\n\t\t\tif UnitHealth(ct.unit) / UnitHealthMax(ct.unit) <= COMBAT_TEXT_LOW_HEALTH_THRESHOLD then\n\t\t\t\tif not lowHealth then\n\t\t\t\t\txCT3:AddMessage(HEALTH_LOW, 1, 0.1, 0.1)\n\t\t\t\t\tlowHealth = true\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlowHealth = nil\n\t\t\tend\n\t\tend\n\telseif event == \"UNIT_MANA\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextLowManaHealth\") then\n\t\tif subevent == ct.unit then\n\t\t\tlocal _, powerToken = UnitPowerType(ct.unit)\n\t\t\tif powerToken == \"MANA\" and (UnitPower(ct.unit) / UnitPowerMax(ct.unit)) <= COMBAT_TEXT_LOW_MANA_THRESHOLD then\n\t\t\t\tif not lowMana then\n\t\t\t\t\txCT3:AddMessage(MANA_LOW, 1, 0.1, 0.1)\n\t\t\t\t\tlowMana = true\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlowMana = nil\n\t\t\tend\n\t\tend\n\telseif event == \"PLAYER_REGEN_ENABLED\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextCombatState\") then\n\t\t\txCT3:AddMessage(\"-\"..LEAVING_COMBAT, 0.1, 1, 0.1)\n\telseif event == \"PLAYER_REGEN_DISABLED\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextCombatState\") then\n\t\t\txCT3:AddMessage(\"+\"..ENTERING_COMBAT, 1, 0.1, 0.1)\n\telseif event == \"UNIT_POWER_UPDATE\" and CVarCallbackRegistry:GetCVarValueBool(\"floatingCombatTextEnergyGains\") then\n\t\tif subevent == ct.unit then\n\t\t\tif powerType and powerType ~= 'COMBO_POINTS' then return end\n\t\t\tlocal cp = UnitPower(ct.unit, 4)\n\t\t\tif cp > 0 then\n\t\t\t\tr, g, b = 1, 0.82, 0\n\t\t\t\tif cp == MAX_COMBO_POINTS then\n\t\t\t\t\tr, g, b = 0, 0.82, 1\n\t\t\t\tend\n\t\t\t\txCT3:AddMessage(format(COMBAT_TEXT_COMBO_POINTS, cp), r, g, b)\n\t\t\tend\n\t\tend\n\telseif event == \"RUNE_POWER_UPDATE\" then\n\t\tlocal arg1 = subevent\n\t\tif GetRuneCooldown(arg1) ~= 0 then return end\n\t\txCT3:AddMessage(\"+\"..COMBAT_TEXT_RUNE_DEATH, 0.75, 0, 0)\n\telseif event == \"UNIT_ENTERED_VEHICLE\" or event == \"UNIT_EXITING_VEHICLE\" then\n\t\tlocal arg1 = subevent\n\t\tif arg1 == \"player\" then\n\t\t\tSetUnit()\n\t\tend\n\telseif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tSetUnit()\n\t\tif C.combattext.scrollable then\n\t\t\tSetScroll()\n\t\telse\n\t\t\tLimitLines()\n\t\tend\n\t\tif C.combattext.damage or C.combattext.healing then\n\t\t\tct.pguid = UnitGUID(\"player\")\n\t\tend\n\tend\nend\n\n-- Change damage font\nif C.combattext.damage_style then\n\tDAMAGE_TEXT_FONT = C.font.combat_text_font\nend\n\n-- Hide blizzard combat text\nif C.combattext.blizz_head_numbers ~= true then\n\tSetCVar(\"floatingCombatTextCombatHealing\", 0)\n\tSetCVar(\"floatingCombatTextCombatDamage\", 0)\nelse\n\tSetCVar(\"floatingCombatTextCombatHealing\", 1)\n\tSetCVar(\"floatingCombatTextCombatDamage\", 1)\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGOUT\")\nframe:SetScript(\"OnEvent\", function(_, event)\n\tif event == \"PLAYER_LOGOUT\" then\n\t\tSetCVar(\"floatingCombatTextCombatHealing\", 1)\n\t\tSetCVar(\"floatingCombatTextCombatDamage\", 1)\n\tend\nend)\n\n-- Frames\nct.locked = true\nct.frames = {}\nfor i = 1, numf do\n\tlocal f = CreateFrame(\"ScrollingMessageFrame\", \"xCT\"..i, UIParent)\n\tf:SetFont(C.font.combat_text_font, C.font.combat_text_font_size, C.font.combat_text_font_style)\n\tf:SetShadowColor(0, 0, 0, C.font.combat_text_font_shadow and 1 or 0)\n\tf:SetShadowOffset(C.font.combat_text_font_shadow and 1 or 0, C.font.combat_text_font_shadow and -1 or 0)\n\tf:SetTimeVisible(C.combattext.time_visible)\n\tf:SetMaxLines(C.combattext.max_lines)\n\tf:SetSpacing(1)\n\tf:SetWidth(128)\n\tf:SetHeight(112)\n\tf:SetPoint(\"CENTER\", 0, 0)\n\tf:SetMovable(true)\n\tf:SetResizable(true)\n\tf:SetResizeBounds(128, 128, 768, 768)\n\tf:SetClampedToScreen(true)\n\tf:SetClampRectInsets(0, 0, C.font.combat_text_font_size, 0)\n\tf:SetInsertMode(C.combattext.direction and 2 or 1)\n\tif i == 1 then\n\t\tf:SetJustifyH(ct.justify_1)\n\t\tif C.unitframe.enable == true and _G.oUF_Player then\n\t\t\tf:SetPoint(\"BOTTOMLEFT\", \"oUF_Player\", \"TOPLEFT\", -3, 60)\n\t\telse\n\t\t\tf:SetPoint(\"CENTER\", -192, -32)\n\t\tend\n\telseif i == 2 then\n\t\tf:SetJustifyH(ct.justify_2)\n\t\tif C.unitframe.enable == true and _G.oUF_Player then\n\t\t\tf:SetPoint(\"BOTTOMRIGHT\", \"oUF_Player\", \"TOPRIGHT\", 5, 60)\n\t\telse\n\t\t\tf:SetPoint(\"CENTER\", 192, -32)\n\t\tend\n\telseif i == 3 then\n\t\tf:SetJustifyH(ct.justify_3)\n\t\tf:SetWidth(256)\n\t\tf:SetPoint(\"CENTER\", 0, 205)\n\telse\n\t\tf:SetJustifyH(ct.justify_4)\n\t\tf:SetWidth(200)\n\t\tif C.combattext.icons then\n\t\t\tf:SetHeight(150)\n\t\tend\n\t\tif C.unitframe.enable == true and _G.oUF_Target then\n\t\t\tf:SetPoint(\"BOTTOMRIGHT\", \"oUF_Target\", \"TOPRIGHT\", 2, 278)\n\t\telse\n\t\t\tf:SetPoint(\"CENTER\", 330, 205)\n\t\tend\n\t\tlocal a, _, c = f:GetFont()\n\t\tif C.font.combat_text_font_size == \"auto\" then\n\t\t\tif C.combattext.icons then\n\t\t\t\tf:SetFont(a, C.combattext.icon_size / 2, c)\n\t\t\tend\n\t\telseif type(C.font.combat_text_font_size) == \"number\" then\n\t\t\tf:SetFont(a, C.font.combat_text_font_size, c)\n\t\tend\n\tend\n\tct.frames[i] = f\nend\n\n-- Register events\nlocal xCT = CreateFrame(\"Frame\")\nxCT:RegisterEvent(\"COMBAT_TEXT_UPDATE\")\nxCT:RegisterEvent(\"UNIT_HEALTH\")\nxCT:RegisterEvent(\"UNIT_MANA\")\nxCT:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\nxCT:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\nxCT:RegisterEvent(\"UNIT_POWER_UPDATE\")\nif C.combattext.dk_runes and T.class == \"DEATHKNIGHT\" then\n\txCT:RegisterEvent(\"RUNE_POWER_UPDATE\")\nend\nxCT:RegisterEvent(\"UNIT_ENTERED_VEHICLE\")\nxCT:RegisterEvent(\"UNIT_EXITING_VEHICLE\")\nxCT:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nxCT:SetScript(\"OnEvent\", OnEvent)\n\n-- Turn off Blizzard CT\nCombatText:UnregisterAllEvents()\nCombatText:SetScript(\"OnLoad\", nil)\nCombatText:SetScript(\"OnEvent\", nil)\nCombatText:SetScript(\"OnUpdate\", nil)\n\n-- Steal external messages sent by other addons using CombatText_AddMessage\nhooksecurefunc(\"CombatText_AddMessage\", function(message, _, r, g, b)\n\tlocal lastEntry = COMBAT_TEXT_TO_ANIMATE[#COMBAT_TEXT_TO_ANIMATE]\n\tCombatText_RemoveMessage(lastEntry)\n\txCT3:AddMessage(message, r, g, b)\nend)\n\n-- Color printer\nlocal pr = function(msg)\n\tprint(tostring(msg))\nend\n\n-- Configmode and testmode\nlocal StartConfigmode = function()\n\tif not InCombatLockdown()then\n\t\tfor i = 1, #ct.frames do\n\t\t\tlocal f = ct.frames[i]\n\t\t\tf:SetTemplate(\"Transparent\")\n\t\t\tf:SetBackdropBorderColor(1, 0, 0, 1)\n\n\t\t\tf.fs = f:CreateFontString(nil, \"OVERLAY\")\n\t\t\tf.fs:SetFont(C.font.combat_text_font, C.font.combat_text_font_size, C.font.combat_text_font_style)\n\t\t\tf.fs:SetPoint(\"BOTTOM\", f, \"TOP\", 0, 0)\n\t\t\tif i == 1 then\n\t\t\t\tf.fs:SetText(DAMAGE)\n\t\t\t\tf.fs:SetTextColor(1, 0.1, 0.1, 0.9)\n\t\t\telseif i == 2 then\n\t\t\t\tf.fs:SetText(SHOW_COMBAT_HEALING)\n\t\t\t\tf.fs:SetTextColor(0.1, 1, 0.1, 0.9)\n\t\t\telseif i == 3 then\n\t\t\t\tf.fs:SetText(COMBAT_TEXT_LABEL)\n\t\t\t\tf.fs:SetTextColor(0.1, 0.1, 1, 0.9)\n\t\t\telse\n\t\t\t\tf.fs:SetText(SCORE_DAMAGE_DONE..\" / \"..SCORE_HEALING_DONE)\n\t\t\t\tf.fs:SetTextColor(1, 1, 0, 0.9)\n\t\t\tend\n\n\t\t\tf.t = f:CreateTexture(nil, \"ARTWORK\")\n\t\t\tf.t:SetPoint(\"TOPLEFT\", f, \"TOPLEFT\", 1, -1)\n\t\t\tf.t:SetPoint(\"TOPRIGHT\", f, \"TOPRIGHT\", -1, -19)\n\t\t\tf.t:SetHeight(20)\n\t\t\tf.t:SetColorTexture(0.5, 0.5, 0.5)\n\t\t\tf.t:SetAlpha(0.3)\n\n\t\t\tf.d = f:CreateTexture(nil, \"ARTWORK\")\n\t\t\tf.d:SetHeight(16)\n\t\t\tf.d:SetWidth(16)\n\t\t\tf.d:SetPoint(\"BOTTOMRIGHT\", f, \"BOTTOMRIGHT\", -1, 1)\n\t\t\tf.d:SetColorTexture(0.5, 0.5, 0.5)\n\t\t\tf.d:SetAlpha(0.3)\n\n\t\t\tif not f.tr then\n\t\t\t\tf.tr = CreateFrame(\"Frame\", nil, f)\n\t\t\t\tf.tr:SetScript(\"OnDragStart\", function(self)\n\t\t\t\t\tself:GetParent():StartMoving()\n\t\t\t\tend)\n\t\t\t\tf.tr:SetScript(\"OnDragStop\", function(self)\n\t\t\t\t\tself:GetParent():StopMovingOrSizing()\n\t\t\t\tend)\n\t\t\t\tf.tr:EnableMouse(true)\n\t\t\t\tf.tr:RegisterForDrag(\"LeftButton\")\n\t\t\t\tf.tr:SetPoint(\"TOPLEFT\", f, \"TOPLEFT\", 0, 0)\n\t\t\t\tf.tr:SetPoint(\"TOPRIGHT\", f, \"TOPRIGHT\", 0, 0)\n\t\t\t\tf.tr:SetHeight(20)\n\t\t\tend\n\n\t\t\tf:EnableMouse(true)\n\t\t\tf:RegisterForDrag(\"LeftButton\")\n\t\t\tf:SetScript(\"OnDragStart\", f.StartSizing)\n\t\t\tif not C.combattext.scrollable then\n\t\t\t\tif i == 4 and C.combattext.icons then\n\t\t\t\t\tf:SetScript(\"OnSizeChanged\", function(self)\n\t\t\t\t\t\tself:SetMaxLines(math.floor(self:GetHeight() / (C.combattext.icon_size * 1.5)))\n\t\t\t\t\t\tself:Clear()\n\t\t\t\t\tend)\n\t\t\t\telse\n\t\t\t\t\tf:SetScript(\"OnSizeChanged\", function(self)\n\t\t\t\t\t\tself:SetMaxLines(math.floor(self:GetHeight() / C.font.combat_text_font_size - 1))\n\t\t\t\t\t\tself:Clear()\n\t\t\t\t\tend)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tf:SetScript(\"OnDragStop\", f.StopMovingOrSizing)\n\t\t\tct.locked = false\n\t\tend\n\t\tpr(\"|cffffff00\"..L_COMBATTEXT_UNLOCKED..\"|r\")\n\telse\n\t\tpr(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\")\n\tend\nend\n\nlocal function EndConfigmode()\n\tfor i = 1, #ct.frames do\n\t\tlocal f = ct.frames[i]\n\t\tf:SetBackdrop(nil)\n\t\tf.iborder:Hide()\n\t\tf.oborder:Hide()\n\t\tf.fs:Hide()\n\t\tf.fs = nil\n\t\tf.t:Hide()\n\t\tf.t = nil\n\t\tf.d:Hide()\n\t\tf.d = nil\n\t\tf.tr = nil\n\t\tf:EnableMouse(false)\n\t\tf:SetScript(\"OnDragStart\", nil)\n\t\tf:SetScript(\"OnDragStop\", nil)\n\tend\n\tct.locked = true\n\tpr(\"|cffffff00\"..L_COMBATTEXT_UNSAVED..\"|r\")\nend\n\nlocal function StartTestMode()\n\t-- Init random number generator\n\tlocal random = math.random\n\trandom(time()); random(); random(time())\n\n\tlocal TimeSinceLastUpdate = 0\n\tlocal UpdateInterval\n\tif C.combattext.damage_color then\n\t\tct.dmindex = {}\n\t\tct.dmindex[1] = 1\n\t\tct.dmindex[2] = 2\n\t\tct.dmindex[3] = 4\n\t\tct.dmindex[4] = 8\n\t\tct.dmindex[5] = 16\n\t\tct.dmindex[6] = 32\n\t\tct.dmindex[7] = 64\n\tend\n\n\tfor i = 1, #ct.frames do\n\t\tct.frames[i]:SetScript(\"OnUpdate\", function(_, elapsed)\n\t\t\tUpdateInterval = random(65, 1000) / 250\n\t\t\tTimeSinceLastUpdate = TimeSinceLastUpdate + elapsed\n\t\t\tif TimeSinceLastUpdate > UpdateInterval then\n\t\t\t\tif i == 1 then\n\t\t\t\t\tct.frames[i]:AddMessage(\"-\"..random(100000), 1, random(255) / 255, random(255) / 255)\n\t\t\t\telseif i == 2 then\n\t\t\t\t\tct.frames[i]:AddMessage(\"+\"..random(50000), 0.1, random(128, 255) / 255, 0.1)\n\t\t\t\telseif i == 3 then\n\t\t\t\t\tct.frames[i]:AddMessage(COMBAT_TEXT_LABEL, random(255) / 255, random(255) / 255, random(255) / 255)\n\t\t\t\telseif i == 4 then\n\t\t\t\t\tlocal msg\n\t\t\t\t\tlocal icon\n\t\t\t\t\tlocal color = {}\n\t\t\t\t\tmsg = random(40000)\n\t\t\t\t\tif C.combattext.icons then\n\t\t\t\t\t\t_, _, icon = GetSpellInfo(msg)\n\t\t\t\t\t\tif not icon then\n\t\t\t\t\t\t\ticon = GetSpellTexture(6603)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif icon then\n\t\t\t\t\t\tmsg = msg..\" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\t\tif C.combattext.damage_color then\n\t\t\t\t\t\t\tcolor = ct.dmgcolor[ct.dmindex[random(#ct.dmindex)]]\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcolor = {1, 1, 0}\n\t\t\t\t\t\tend\n\t\t\t\t\telseif C.combattext.damage_color and not C.combattext.icons then\n\t\t\t\t\t\tcolor = ct.dmgcolor[ct.dmindex[random(#ct.dmindex)]]\n\t\t\t\t\telseif not C.combattext.damage_color then\n\t\t\t\t\t\tcolor = {1, 1, random(0, 1)}\n\t\t\t\t\tend\n\t\t\t\t\tct.frames[i]:AddMessage(msg, unpack(color))\n\t\t\t\tend\n\t\t\t\tTimeSinceLastUpdate = 0\n\t\t\tend\n\t\tend)\n\t\tct.testmode = true\n\tend\nend\n\nlocal function EndTestMode()\n\tfor i = 1, #ct.frames do\n\t\tct.frames[i]:SetScript(\"OnUpdate\", nil)\n\t\tct.frames[i]:Clear()\n\tend\n\tif C.combattext.damage_color then\n\t\tct.dmindex = nil\n\tend\n\tct.testmode = false\nend\n\n-- Popup dialog\nStaticPopupDialogs.XCT_LOCK = {\n\ttext = L_COMBATTEXT_POPUP,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function() if not InCombatLockdown() then ReloadUI() else EndConfigmode() end end,\n\tOnCancel = EndConfigmode,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tshowAlert = true,\n\tpreferredIndex = 5,\n}\n\nlocal placed = {\n\t\"xCT1\",\n\t\"xCT2\",\n\t\"xCT3\",\n\t\"xCT4\"\n}\n\n-- Slash commands\nSlashCmdList.XCT = function(input)\n\tinput = string.lower(input)\n\tif input == \"move\" then\n\t\tif ct.locked then\n\t\t\tStartConfigmode()\n\t\t\tif not ct.testmode then\n\t\t\t\tStartTestMode()\n\t\t\tend\n\t\telse\n\t\t\tStaticPopup_Show(\"XCT_LOCK\")\n\t\t\tif ct.testmode then\n\t\t\t\tEndTestMode()\n\t\t\tend\n\t\tend\n\telseif input == \"test\" then\n\t\tif ct.testmode then\n\t\t\tEndTestMode()\n\t\t\tpr(\"|cffffff00\"..L_COMBATTEXT_TEST_DISABLED..\"|r\")\n\t\telse\n\t\t\tStartTestMode()\n\t\t\tpr(\"|cffffff00\"..L_COMBATTEXT_TEST_ENABLED..\"|r\")\n\t\tend\n\telseif input == \"reset\" then\n\t\tfor _, v in pairs(placed) do\n\t\t\tif _G[v] then\n\t\t\t\t_G[v]:SetUserPlaced(false)\n\t\t\tend\n\t\tend\n\t\tReloadUI()\n\telse\n\t\tpr(\"|cffffff00\"..L_COMBATTEXT_TEST_USE_MOVE..\"|r\")\n\t\tpr(\"|cffffff00\"..L_COMBATTEXT_TEST_USE_TEST..\"|r\")\n\t\tpr(\"|cffffff00\"..L_COMBATTEXT_TEST_USE_RESET..\"|r\")\n\tend\nend\nSLASH_XCT1 = \"/xct\"\nSLASH_XCT2 = \"/чсе\"\n\n-- Spam merger\nlocal SQ\nif C.combattext.merge_aoe_spam then\n\tif C.combattext.damage or C.combattext.healing then\n\t\tlocal pairs = pairs\n\t\tSQ = {}\n\t\tfor k in pairs(T.aoespam) do\n\t\t\tSQ[k] = {queue = 0, msg = \"\", color = {}, count = 0, utime = 0, locked = false}\n\t\tend\n\t\tct.SpamQueue = function(spellId, add)\n\t\t\tlocal amount\n\t\t\tlocal spam = SQ[spellId][\"queue\"]\n\t\t\tif spam and type(spam) == \"number\" then\n\t\t\t\tamount = spam + add\n\t\t\telse\n\t\t\t\tamount = add\n\t\t\tend\n\t\t\treturn amount\n\t\tend\n\t\tlocal tslu = 0\n\t\tlocal xCTspam = CreateFrame(\"Frame\")\n\t\txCTspam:SetScript(\"OnUpdate\", function(_, elapsed)\n\t\t\tlocal count\n\t\t\ttslu = tslu + elapsed\n\t\t\tif tslu > 0.5 then\n\t\t\t\ttslu = 0\n\t\t\t\tlocal utime = time()\n\t\t\t\tfor k in pairs(SQ) do\n\t\t\t\t\tif not SQ[k][\"locked\"] and SQ[k][\"queue\"] > 0 and SQ[k][\"utime\"] <= utime then\n\t\t\t\t\t\tif SQ[k][\"count\"] > 1 then\n\t\t\t\t\t\t\tcount = \" |cffFFFFFF x \"..SQ[k][\"count\"]..\"|r\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcount = \"\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\t\tSQ[k][\"queue\"] = T.ShortValue(SQ[k][\"queue\"])\n\t\t\t\t\t\tend\n\t\t\t\t\t\txCT4:AddMessage(SQ[k][\"queue\"]..count..SQ[k][\"msg\"], unpack(SQ[k][\"color\"]))\n\t\t\t\t\t\tSQ[k][\"queue\"] = 0\n\t\t\t\t\t\tSQ[k][\"count\"] = 0\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\tend\nend\n\nlocal unpack, select, time = unpack, select, time\nlocal gflags = bit.bor(COMBATLOG_OBJECT_AFFILIATION_MINE,\n\tCOMBATLOG_OBJECT_REACTION_FRIENDLY,\n\tCOMBATLOG_OBJECT_CONTROL_PLAYER,\n\tCOMBATLOG_OBJECT_TYPE_GUARDIAN\n)\n\n-- Damage\nif C.combattext.damage then\n\tlocal xCTd = CreateFrame(\"Frame\")\n\tif C.combattext.damage_color then\n\t\tct.dmgcolor = {}\n\t\tct.dmgcolor[1] = {1, 1, 0}\t\t-- Physical\n\t\tct.dmgcolor[2] = {1, 0.9, 0.5}\t-- Holy\n\t\tct.dmgcolor[4] = {1, 0.5, 0}\t-- Fire\n\t\tct.dmgcolor[8] = {0.3, 1, 0.3}\t-- Nature\n\t\tct.dmgcolor[16] = {0.5, 1, 1}\t-- Frost\n\t\tct.dmgcolor[32] = {0.5, 0.5, 1}\t-- Shadow\n\t\tct.dmgcolor[64] = {1, 0.5, 1}\t-- Arcane\n\tend\n\tif C.combattext.icons then\n\t\tct.blank = \"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Textures\\\\Blank.tga\"\n\tend\n\tlocal misstypes = {ABSORB = ABSORB, BLOCK = BLOCK, DEFLECT = DEFLECT, DODGE = DODGE, EVADE = EVADE, IMMUNE = IMMUNE, MISS = MISS, MISFIRE = MISS, PARRY = PARRY, REFLECT = REFLECT, RESIST = RESIST}\n\tlocal dmg = function()\n\t\tlocal msg, icon\n\t\tlocal _, eventType, _, sourceGUID, _, sourceFlags, _, destGUID = CombatLogGetCurrentEventInfo()\n\t\tif (sourceGUID == ct.pguid and destGUID ~= ct.pguid) or (sourceGUID == UnitGUID(\"pet\") and C.combattext.pet_damage) or (sourceFlags == gflags) then\n\t\t\tif eventType == \"SWING_DAMAGE\" then\n\t\t\t\tlocal amount, _, _, _, _, _, critical = select(12, CombatLogGetCurrentEventInfo())\n\t\t\t\tif amount >= C.combattext.treshold then\n\t\t\t\t\tlocal rawamount = amount\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\tamount = T.ShortValue(amount)\n\t\t\t\t\tend\n\t\t\t\t\tif critical then\n\t\t\t\t\t\tamount = \"|cffFF0000\"..C.combattext.crit_prefix..\"|r\"..amount..\"|cffFF0000\"..C.combattext.crit_postfix..\"|r\"\n\t\t\t\t\tend\n\t\t\t\t\tif C.combattext.icons then\n\t\t\t\t\t\tif (sourceGUID == UnitGUID(\"pet\")) or (sourceFlags == gflags) then\n\t\t\t\t\t\t\ticon = PET_ATTACK_TEXTURE\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ticon = GetSpellTexture(6603)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif icon then\n\t\t\t\t\t\tmsg = \" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\telseif C.combattext.icons then\n\t\t\t\t\t\tmsg = \" \\124T\"..ct.blank..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg = \"\"\n\t\t\t\t\tend\n\t\t\t\t\tlocal color = {1, 1, 1}\n\t\t\t\t\tif C.combattext.merge_aoe_spam and C.combattext.merge_melee then\n\t\t\t\t\t\tlocal spellId = 6603\n\t\t\t\t\t\tSQ[spellId][\"locked\"] = true\n\t\t\t\t\t\tSQ[spellId][\"queue\"] = ct.SpamQueue(spellId, rawamount)\n\t\t\t\t\t\tSQ[spellId][\"msg\"] = msg\n\t\t\t\t\t\tSQ[spellId][\"color\"] = color\n\t\t\t\t\t\tSQ[spellId][\"count\"] = SQ[spellId][\"count\"] + 1\n\t\t\t\t\t\tif SQ[spellId][\"count\"] == 1 then\n\t\t\t\t\t\t\tSQ[spellId][\"utime\"] = time() + T.aoespam[spellId]\n\t\t\t\t\t\tend\n\t\t\t\t\t\tSQ[spellId][\"locked\"] = false\n\t\t\t\t\t\treturn\n\t\t\t\t\tend\n\t\t\t\t\txCT4:AddMessage(amount..\"\"..msg, unpack(color))\n\t\t\t\tend\n\t\t\telseif eventType == \"RANGE_DAMAGE\" then\n\t\t\t\tlocal spellId, _, _, amount, _, _, _, _, _, critical = select(12, CombatLogGetCurrentEventInfo())\n\t\t\t\tif amount >= C.combattext.treshold then\n\t\t\t\t\tlocal rawamount = amount\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\tamount = T.ShortValue(amount)\n\t\t\t\t\tend\n\t\t\t\t\tif critical then\n\t\t\t\t\t\tamount = \"|cffFF0000\"..C.combattext.crit_prefix..\"|r\"..amount..\"|cffFF0000\"..C.combattext.crit_postfix..\"|r\"\n\t\t\t\t\tend\n\t\t\t\t\tif C.combattext.icons then\n\t\t\t\t\t\ticon = GetSpellTexture(spellId)\n\t\t\t\t\tend\n\t\t\t\t\tif icon then\n\t\t\t\t\t\tmsg = \" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\telseif C.combattext.icons then\n\t\t\t\t\t\tmsg = \" \\124T\"..ct.blank..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg = \"\"\n\t\t\t\t\tend\n\t\t\t\t\tif C.combattext.merge_aoe_spam then\n\t\t\t\t\t\tspellId = T.merge[spellId] or spellId\n\t\t\t\t\t\tif T.aoespam[spellId] then\n\t\t\t\t\t\t\tSQ[spellId][\"locked\"] = true\n\t\t\t\t\t\t\tSQ[spellId][\"queue\"] = ct.SpamQueue(spellId, rawamount)\n\t\t\t\t\t\t\tSQ[spellId][\"msg\"] = msg\n\t\t\t\t\t\t\tSQ[spellId][\"count\"] = SQ[spellId][\"count\"] + 1\n\t\t\t\t\t\t\tif SQ[spellId][\"count\"] == 1 then\n\t\t\t\t\t\t\t\tSQ[spellId][\"utime\"] = time() + T.aoespam[spellId]\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tSQ[spellId][\"locked\"] = false\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\txCT4:AddMessage(amount..\"\"..msg)\n\t\t\t\tend\n\t\t\telseif eventType == \"SPELL_DAMAGE\" or (eventType == \"SPELL_PERIODIC_DAMAGE\" and C.combattext.dot_damage) then\n\t\t\t\tlocal spellId, _, spellSchool, amount, _, _, _, _, _, critical = select(12, CombatLogGetCurrentEventInfo())\n\t\t\t\tif amount >= C.combattext.treshold then\n\t\t\t\t\tlocal color = {}\n\t\t\t\t\tlocal rawamount = amount\n\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\tamount = T.ShortValue(amount)\n\t\t\t\t\tend\n\t\t\t\t\tif critical then\n\t\t\t\t\t\tamount = \"|cffFF0000\"..C.combattext.crit_prefix..\"|r\"..amount..\"|cffFF0000\"..C.combattext.crit_postfix..\"|r\"\n\t\t\t\t\tend\n\t\t\t\t\tif C.combattext.icons then\n\t\t\t\t\t\ticon = GetSpellTexture(spellId)\n\t\t\t\t\tend\n\t\t\t\t\tif C.combattext.damage_color then\n\t\t\t\t\t\tif ct.dmgcolor[spellSchool] then\n\t\t\t\t\t\t\tcolor = ct.dmgcolor[spellSchool]\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcolor = ct.dmgcolor[1]\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tcolor = {1, 1, 0}\n\t\t\t\t\tend\n\t\t\t\t\tif icon then\n\t\t\t\t\t\tmsg = \" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\telseif C.combattext.icons then\n\t\t\t\t\t\tmsg = \" \\124T\"..ct.blank..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg = \"\"\n\t\t\t\t\tend\n\t\t\t\t\tif C.combattext.merge_aoe_spam then\n\t\t\t\t\t\tspellId = T.merge[spellId] or spellId\n\t\t\t\t\t\tif bit.band(sourceFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) ~= COMBATLOG_OBJECT_AFFILIATION_MINE then\n\t\t\t\t\t\t\tspellId = 6603\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif (sourceGUID == UnitGUID(\"pet\") or sourceFlags == gflags or C.combattext.merge_all) and not T.aoespam[spellId] then\n\t\t\t\t\t\t\tT.aoespam[spellId] = 3\n\t\t\t\t\t\t\tSQ[spellId] = {queue = 0, msg = \"\", color = {}, count = 0, utime = 0, locked = false}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif T.aoespam[spellId] then\n\t\t\t\t\t\t\tSQ[spellId][\"locked\"] = true\n\t\t\t\t\t\t\tSQ[spellId][\"queue\"] = ct.SpamQueue(spellId, rawamount)\n\t\t\t\t\t\t\tSQ[spellId][\"msg\"] = msg\n\t\t\t\t\t\t\tSQ[spellId][\"color\"] = color\n\t\t\t\t\t\t\tSQ[spellId][\"count\"] = SQ[spellId][\"count\"] + 1\n\t\t\t\t\t\t\tif SQ[spellId][\"count\"] == 1 then\n\t\t\t\t\t\t\t\tSQ[spellId][\"utime\"] = time() + T.aoespam[spellId]\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tSQ[spellId][\"locked\"] = false\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\txCT4:AddMessage(amount..\"\"..msg, unpack(color))\n\t\t\t\tend\n\t\t\telseif eventType == \"SWING_MISSED\" then\n\t\t\t\tlocal missType = select(12, CombatLogGetCurrentEventInfo())\n\t\t\t\tif C.combattext.icons then\n\t\t\t\t\tif sourceGUID == UnitGUID(\"pet\") or sourceFlags == gflags then\n\t\t\t\t\t\ticon = PET_ATTACK_TEXTURE\n\t\t\t\t\telse\n\t\t\t\t\t\ticon = GetSpellTexture(6603)\n\t\t\t\t\tend\n\t\t\t\t\tmissType = misstypes[missType]..\" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\telse\n\t\t\t\t\tmissType = misstypes[missType]\n\t\t\t\tend\n\t\t\t\txCT4:AddMessage(missType)\n\t\t\telseif eventType == \"SPELL_MISSED\" or eventType == \"RANGE_MISSED\" then\n\t\t\t\tlocal spellId, _, _, missType = select(12, CombatLogGetCurrentEventInfo())\n\t\t\t\tif missType == \"IMMUNE\" and spellId == 204242 then return end -- Consecration slow\n\t\t\t\tif C.combattext.icons then\n\t\t\t\t\ticon = GetSpellTexture(spellId)\n\t\t\t\t\tmissType = misstypes[missType]..\" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\telse\n\t\t\t\t\tmissType = misstypes[missType]\n\t\t\t\tend\n\t\t\t\txCT4:AddMessage(missType)\n\t\t\telseif eventType == \"SPELL_DISPEL\" and C.combattext.dispel then\n\t\t\t\tlocal id, effect, _, etype = select(15, CombatLogGetCurrentEventInfo())\n\t\t\t\tlocal color\n\t\t\t\tif C.combattext.icons then\n\t\t\t\t\ticon = GetSpellTexture(id)\n\t\t\t\tend\n\t\t\t\tif icon then\n\t\t\t\t\tmsg = \" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\telseif C.combattext.icons then\n\t\t\t\t\tmsg = \" \\124T\"..ct.blank..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\telse\n\t\t\t\t\tmsg = \"\"\n\t\t\t\tend\n\t\t\t\tif etype == \"BUFF\" then\n\t\t\t\t\tcolor = {0, 1, 0.5}\n\t\t\t\telse\n\t\t\t\t\tcolor = {1, 0, 0.5}\n\t\t\t\tend\n\t\t\t\txCT3:AddMessage(ACTION_SPELL_DISPEL..\": \"..effect..msg, unpack(color))\n\t\t\telseif eventType == \"SPELL_STOLEN\" and C.combattext.dispel then\n\t\t\t\tlocal id, effect = select(15, CombatLogGetCurrentEventInfo())\n\t\t\t\tlocal color = {1, 0.5, 0}\n\t\t\t\tif C.combattext.icons then\n\t\t\t\t\ticon = GetSpellTexture(id)\n\t\t\t\tend\n\t\t\t\tif icon then\n\t\t\t\t\tmsg = \" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\telseif C.combattext.icons then\n\t\t\t\t\tmsg = \" \\124T\"..ct.blank..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\telse\n\t\t\t\t\tmsg = \"\"\n\t\t\t\tend\n\t\t\t\txCT3:AddMessage(ACTION_SPELL_STOLEN..\": \"..effect..msg, unpack(color))\n\t\t\telseif eventType == \"SPELL_INTERRUPT\" and C.combattext.interrupt then\n\t\t\t\tlocal id, effect = select(15, CombatLogGetCurrentEventInfo())\n\t\t\t\tlocal color = {1, 0.5, 0}\n\t\t\t\tif C.combattext.icons then\n\t\t\t\t\ticon = GetSpellTexture(id)\n\t\t\t\tend\n\t\t\t\tif icon then\n\t\t\t\t\tmsg = \" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\telseif C.combattext.icons then\n\t\t\t\t\tmsg = \" \\124T\"..ct.blank..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\telse\n\t\t\t\t\tmsg = \"\"\n\t\t\t\tend\n\t\t\t\txCT3:AddMessage(ACTION_SPELL_INTERRUPT..\": \"..effect..msg, unpack(color))\n\t\t\telseif eventType == \"PARTY_KILL\" and C.combattext.killingblow then\n\t\t\t\tlocal destGUID, tname = select(8, CombatLogGetCurrentEventInfo())\n\t\t\t\tlocal classIndex = select(2, GetPlayerInfoByGUID(destGUID))\n\t\t\t\tlocal color = classIndex and RAID_CLASS_COLORS[classIndex] or {r = 0.2, g = 1, b = 0.2}\n\t\t\t\txCT3:AddMessage(\"|cff33FF33\"..ACTION_PARTY_KILL..\": |r\"..tname, color.r, color.g, color.b)\n\t\t\tend\n\t\tend\n\tend\n\n\txCTd:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\n\txCTd:SetScript(\"OnEvent\", dmg)\nend\n\n-- Healing\nif C.combattext.healing then\n\tlocal xCTh = CreateFrame(\"Frame\")\n\tif C.combattext.icons then\n\t\tct.blank = \"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Textures\\\\Blank.tga\"\n\tend\n\tlocal heal = function()\n\t\tlocal msg, icon\n\t\tlocal _, eventType, _, sourceGUID, _, sourceFlags = CombatLogGetCurrentEventInfo()\n\t\tif sourceGUID == ct.pguid or sourceFlags == gflags then\n\t\t\tif eventType == \"SPELL_HEAL\" or (eventType == \"SPELL_PERIODIC_HEAL\" and C.combattext.show_hots) then\n\t\t\t\tif C.combattext.healing then\n\t\t\t\t\tlocal spellId, _, _, amount, overhealing, _, critical = select(12, CombatLogGetCurrentEventInfo())\n\t\t\t\t\tif T.healfilter[spellId] then\n\t\t\t\t\t\treturn\n\t\t\t\t\tend\n\t\t\t\t\tif amount >= C.combattext.heal_treshold then\n\t\t\t\t\t\tlocal color = {}\n\t\t\t\t\t\tlocal rawamount = amount\n\t\t\t\t\t\tif C.combattext.show_overhealing and abs(overhealing) > 0 then\n\t\t\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\t\t\tamount = T.ShortValue(math.floor(amount-overhealing))..\" [\"..T.ShortValue(floor(overhealing))..\"]\"\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tamount = math.floor(amount-overhealing)..\" [\"..floor(overhealing)..\"]\"\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif C.combattext.short_numbers == true then\n\t\t\t\t\t\t\t\tamount = T.ShortValue(amount)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif critical then\n\t\t\t\t\t\t\tamount = \"|cffFF0000\"..C.combattext.crit_prefix..\"|r\"..amount..\"|cffFF0000\"..C.combattext.crit_postfix..\"|r\"\n\t\t\t\t\t\t\tcolor = {0.1, 1, 0.1}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcolor = {0.1, 0.65, 0.1}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif C.combattext.icons then\n\t\t\t\t\t\t\ticon = GetSpellTexture(spellId)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tmsg = \"\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif icon then\n\t\t\t\t\t\t\tmsg = \" \\124T\"..icon..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\t\telseif C.combattext.icons then\n\t\t\t\t\t\t\tmsg = \" \\124T\"..ct.blank..\":\"..C.combattext.icon_size..\":\"..C.combattext.icon_size..\":0:0:64:64:5:59:5:59\\124t\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif C.combattext.merge_aoe_spam then\n\t\t\t\t\t\t\tspellId = T.merge[spellId] or spellId\n\t\t\t\t\t\t\tif T.aoespam[spellId] then\n\t\t\t\t\t\t\t\tSQ[spellId][\"locked\"] = true\n\t\t\t\t\t\t\t\tSQ[spellId][\"queue\"] = ct.SpamQueue(spellId, rawamount)\n\t\t\t\t\t\t\t\tSQ[spellId][\"msg\"] = msg\n\t\t\t\t\t\t\t\tSQ[spellId][\"color\"] = color\n\t\t\t\t\t\t\t\tSQ[spellId][\"count\"] = SQ[spellId][\"count\"] + 1\n\t\t\t\t\t\t\t\tif SQ[spellId][\"count\"] == 1 then\n\t\t\t\t\t\t\t\t\tSQ[spellId][\"utime\"] = time() + T.aoespam[spellId]\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tSQ[spellId][\"locked\"] = false\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\txCT4:AddMessage(amount..\"\"..msg, unpack(color))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\txCTh:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\n\txCTh:SetScript(\"OnEvent\", heal)\nend\n\n-- Check outdated spells\nif C.combattext.merge_aoe_spam then\n\tfor spell in pairs(T.aoespam) do\n\t\tlocal name = GetSpellInfo(spell)\n\t\tif not name then\n\t\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(spell)..\"] no longer exists! Report this to Shestak.|r\")\n\t\tend\n\tend\n\n\tfor spell in pairs(T.merge) do\n\t\tlocal name = GetSpellInfo(spell)\n\t\tif not name then\n\t\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(spell)..\"] no longer exists! Report this to Shestak.|r\")\n\t\tend\n\tend\nend\n\nif C.combattext.healing then\n\tfor spell in pairs(T.healfilter) do\n\t\tlocal name = GetSpellInfo(spell)\n\t\tif not name then\n\t\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(spell)..\"] no longer exists! Report this to Shestak.|r\")\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/Durability.lua",
    "content": "----------------------------------------------------------------------------------------\n--\tDurability value on slot buttons in CharacterFrame(tekability by Tekkub)\n----------------------------------------------------------------------------------------\nlocal SLOTIDS = {}\nfor _, slot in pairs({\"Head\", \"Shoulder\", \"Chest\", \"Waist\", \"Legs\", \"Feet\", \"Wrist\", \"Hands\", \"MainHand\", \"SecondaryHand\"}) do\n\tSLOTIDS[slot] = GetInventorySlotInfo(slot..\"Slot\")\nend\nlocal frame = CreateFrame(\"Frame\", nil, CharacterFrame)\n\nlocal function RYGColorGradient(perc)\n\tlocal relperc = perc * 2 % 1\n\tif perc <= 0 then\n\t\treturn 1, 0, 0\n\telseif perc < 0.5 then\n\t\treturn 1, relperc, 0\n\telseif perc == 0.5 then\n\t\treturn 1, 1, 0\n\telseif perc < 1.0 then\n\t\treturn 1 - relperc, 1, 0\n\telse\n\t\treturn 0, 1, 0\n\tend\nend\n\nlocal fontstrings = setmetatable({}, {\n\t__index = function(t, i)\n\t\tlocal gslot = _G[\"Character\"..i..\"Slot\"]\n\t\tlocal fstr = gslot:CreateFontString(nil, \"OVERLAY\", \"SystemFont_Outline_Small\")\n\t\tfstr:SetPoint(\"BOTTOM\", gslot, \"BOTTOM\", 0, 1)\n\t\tt[i] = fstr\n\t\treturn fstr\n\tend,\n})\n\nfunction frame:OnEvent()\n\tlocal min = 1\n\tfor slot, id in pairs(SLOTIDS) do\n\t\tlocal v1, v2 = GetInventoryItemDurability(id)\n\n\t\tif v1 and v2 and v2 ~= 0 then\n\t\t\tmin = math.min(v1 / v2, min)\n\t\t\tlocal str = fontstrings[slot]\n\t\t\tstr:SetTextColor(RYGColorGradient(v1 / v2))\n\t\t\tif v1 < v2 then\n\t\t\t\tstr:SetText(string.format(\"%d%%\", v1 / v2 * 100))\n\t\t\telse\n\t\t\t\tstr:SetText(nil)\n\t\t\tend\n\t\telse\n\t\t\tlocal str = rawget(fontstrings, slot)\n\t\t\tif str then str:SetText(nil) end\n\t\tend\n\tend\nend\n\nframe:SetScript(\"OnEvent\", frame.OnEvent)\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:RegisterEvent(\"UPDATE_INVENTORY_DURABILITY\")"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/Errors.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tClear UIErrorsFrame(module from Kousei by Haste)\r\n----------------------------------------------------------------------------------------\r\nif C.general.error_filter == \"WHITELIST\" or C.general.error_filter == \"BLACKLIST\" then\r\n\tlocal frame = CreateFrame(\"Frame\")\r\n\tframe:RegisterEvent(\"UI_ERROR_MESSAGE\")\r\n\tframe:SetScript(\"OnEvent\", function(_, _, messageType, text)\r\n\t\tif C.general.error_filter == \"WHITELIST\" then\r\n\t\t\tif T.white_list[text] then\r\n\t\t\t\tUIErrorsFrame:TryDisplayMessage(messageType, text, RED_FONT_COLOR:GetRGB())\r\n\t\t\telse\r\n\t\t\t\tL_INFO_ERRORS = text\r\n\t\t\tend\r\n\t\telseif C.general.error_filter == \"BLACKLIST\" then\r\n\t\t\tif T.black_list[text] then\r\n\t\t\t\tL_INFO_ERRORS = text\r\n\t\t\telse\r\n\t\t\t\tUIErrorsFrame:TryDisplayMessage(messageType, text, RED_FONT_COLOR:GetRGB())\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\tUIErrorsFrame:UnregisterEvent(\"UI_ERROR_MESSAGE\")\r\nend\r\n\r\nSlashCmdList.ERROR = function()\r\n\tUIErrorsFrame:AddMessage(L_INFO_ERRORS, 1, 0, 0)\r\nend\r\nSLASH_ERROR1 = \"/error\"\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tClear all UIErrors frame in combat\r\n----------------------------------------------------------------------------------------\r\nif C.general.error_filter == \"COMBAT\" then\r\n\tlocal frame = CreateFrame(\"Frame\")\r\n\tframe:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\r\n\tframe:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\r\n\tframe:SetScript(\"OnEvent\", function(_, event)\r\n\t\tif event == \"PLAYER_REGEN_DISABLED\" then\r\n\t\t\tUIErrorsFrame:UnregisterEvent(\"UI_ERROR_MESSAGE\")\r\n\t\telse\r\n\t\t\tUIErrorsFrame:RegisterEvent(\"UI_ERROR_MESSAGE\")\r\n\t\tend\r\n\tend)\r\nend"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/Fixes.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tFix blank tooltip\n----------------------------------------------------------------------------------------\nlocal bug = nil\nlocal FixTooltip = CreateFrame(\"Frame\")\nFixTooltip:RegisterEvent(\"UPDATE_BONUS_ACTIONBAR\")\nFixTooltip:RegisterEvent(\"ACTIONBAR_PAGE_CHANGED\")\nFixTooltip:SetScript(\"OnEvent\", function()\n\tif GameTooltip:IsShown() then\n\t\tbug = true\n\tend\nend)\n\nlocal FixTooltipBags = CreateFrame(\"Frame\")\nFixTooltipBags:RegisterEvent(\"BAG_UPDATE_DELAYED\")\nFixTooltipBags:SetScript(\"OnEvent\", function()\n\tif StuffingFrameBags and StuffingFrameBags:IsShown() then\n\t\tif GameTooltip:IsShown() then\n\t\t\tbug = true\n\t\tend\n\tend\nend)\n\nGameTooltip:HookScript(\"OnTooltipCleared\", function(self)\n\tif self:IsForbidden() then return end\n\tif bug and self:NumLines() == 0 then\n\t\tself:Hide()\n\t\tbug = false\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tFix RemoveTalent() taint\n----------------------------------------------------------------------------------------\nFCF_StartAlertFlash = T.dummy\n\n----------------------------------------------------------------------------------------\n--\tFix DeclensionFrame strata\n----------------------------------------------------------------------------------------\nif T.client == \"ruRU\" then\n\t_G[\"DeclensionFrame\"]:SetFrameStrata(\"HIGH\")\nend\n\n----------------------------------------------------------------------------------------\n--\tFix SearchLFGLeave() taint\n----------------------------------------------------------------------------------------\nlocal TaintFix = CreateFrame(\"Frame\")\nTaintFix:SetScript(\"OnUpdate\", function()\n\tif LFRBrowseFrame.timeToClear then\n\t\tLFRBrowseFrame.timeToClear = nil\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tFix Keybind taint\n----------------------------------------------------------------------------------------\n_G.SettingsPanel.TransitionBackOpeningPanel = _G.HideUIPanel\n\n----------------------------------------------------------------------------------------\n--\tAllow to show ProfessionsFrame and AuctionHouseFrame together\n----------------------------------------------------------------------------------------\nfunction GetMaxUIPanelsWidth()\n\tif UIParent:GetRight() < 1925 and UIParent:GetRight() > 1915 then\n\t\treturn UIParent:GetRight() - UIParent:GetAttribute(\"RIGHT_OFFSET_BUFFER\") + 110\n\telse\n\t\treturn UIParent:GetRight() - UIParent:GetAttribute(\"RIGHT_OFFSET_BUFFER\")\n\tend\nend\n\n------------------------------------------------------------------------\n-- !!NoTaint2, first-aid addon for Dragon Flight action bars taint.\n-- Code by warbaby 2022-11 http://abyui.top https://github.com/aby-ui\n-------------------------------------------------------------------------\nif IsAddOnLoaded(\"!!NoTaint2\") then return end\nif not NoTaint2_Proc_ResetActionButtonAction then\n    NoTaint2_Proc_ResetActionButtonAction = 1\n\n    -- use /run ActionButton2.action = 2 ActionButton2:UpdateAction() to test\n\n    function NoTaint2_ResetActionButtonAction(self)\n        local ok, tainted_by = issecurevariable(self, \"action\")\n        if not ok and not InCombatLockdown() then\n            self.action=nil\n            self:SetAttribute(\"_aby\", \"action\")\n            -- if self:IsVisible() then NoTaint2_ShowWarning(tainted_by) end\n        end\n    end\n\n    for _, v in ipairs(ActionBarButtonEventsFrame.frames) do\n        hooksecurefunc(v, \"UpdateAction\", NoTaint2_ResetActionButtonAction)\n    end\n\n    local f1 = CreateFrame(\"Frame\")\n    f1:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n    f1:SetScript(\"OnEvent\", function(self, event, ...)\n        for _, v in ipairs(ActionBarButtonEventsFrame.frames) do\n            NoTaint2_ResetActionButtonAction(v)\n        end\n    end)\nend\n\nif not NoTaint2_CleanStaticPopups then\n    --code since !NoTaint, test: /run StaticPopup_Show('PARTY_INVITE',\"a\") /dump issecurevariable(StaticPopup1, \"which\")\n    function NoTaint2_CleanStaticPopups()\n        for index = 1, STATICPOPUP_NUMDIALOGS, 1 do\n            local frame = _G[\"StaticPopup\"..index];\n            if not issecurevariable(frame, \"which\") then\n                if frame:IsShown() then\n                    local info = StaticPopupDialogs[frame.which];\n                    if info and not issecurevariable(info, \"OnCancel\") then\n                        info.OnCancel()\n                    end\n                    frame:Hide()\n                end\n                frame.which = nil\n            end\n        end\n    end\n\n    function NoTaint2_CleanDropDownList()\n        local frameToShow = LFDQueueFrameTypeDropDown\n        local parent = frameToShow:GetParent()\n        frameToShow:SetParent(nil) --to show\n        --RequestLFDPlayerLockInfo() --to trigger LFG_LOCK_INFO_RECEIVED\n        frameToShow:SetParent(parent)\n    end\n\n    local global_obj_name = {\n        UIDROPDOWNMENU_MAXBUTTONS = 1,\n        UIDROPDOWNMENU_MAXLEVELS = 1,\n        UIDROPDOWNMENU_OPEN_MENU = 1,\n        UIDROPDOWNMENU_INIT_MENU = 1,\n        OBJECTIVE_TRACKER_UPDATE_REASON = 1,\n    }\n\n    function NoTaint2_CleanGlobal(self)\n        for k, _ in pairs(global_obj_name) do\n            if not issecurevariable(k) then\n                --print(\"clean\", k, issecurevariable(k))\n                _G[k] = nil\n            end\n        end\n        --ObjectiveTrackerFrame.lastMapID = nil\n    end\n\n    hooksecurefunc(EditModeManagerFrame, \"ClearActiveChangesFlags\", function(self)\n        for _, systemFrame in ipairs(self.registeredSystemFrames) do\n            systemFrame:SetHasActiveChanges(nil);\n        end\n        self:SetHasActiveChanges(nil);\n    end)\n\n    -- not sure if this is of any use. PetFrame and ActionBar call it.\n    hooksecurefunc(EditModeManagerFrame, \"HideSystemSelections\", function(self)\n        if self.editModeActive == false then\n            self.editModeActive = nil\n        end\n    end)\n\n    hooksecurefunc(EditModeManagerFrame, \"IsEditModeLocked\", function()\n        NoTaint2_CleanGlobal()\n    end)\n\n    local function cleanAll()\n        NoTaint2_CleanDropDownList()\n        NoTaint2_CleanStaticPopups()\n        NoTaint2_CleanGlobal()\n    end\n\n    local Origin_IsShown = EditModeManagerFrame.IsShown\n    hooksecurefunc(EditModeManagerFrame, \"IsShown\", function(self)\n        if Origin_IsShown(self) then return end\n        local stack = debugstack(4)\n        --call from UIParent.lua if ( not frame or frame:IsShown() ) then\n        --different when hooked\n        if stack:find('[string \"=[C]\"]: in function `ShowUIPanel\\'\\n', 1, true) then\n            cleanAll()\n        end\n    end)\n\n    -- In case the stack check is failed, assure the game menu entrance.\n    -- Running cleanAll() multi times has no side effects.\n    GameMenuButtonEditMode:HookScript(\"PreClick\", cleanAll)\nend\n\nif not NoTaint2_Proc_StopEnterWorldLayout then\n    NoTaint2_Proc_StopEnterWorldLayout = 1\n    local f2 = CreateFrame(\"Frame\")\n    f2:RegisterEvent(\"PLAYER_LEAVING_WORLD\")\n    f2:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n    f2:SetScript(\"OnEvent\", function(self, event, ...)\n        if event == \"PLAYER_ENTERING_WORLD\" then\n            local login, reload = ...\n            if not login and not reload then\n                NoTaint2_CleanDropDownList()\n                NoTaint2_CleanStaticPopups()\n                NoTaint2_CleanGlobal()\n            end\n            EditModeManagerFrame:RegisterEvent(\"EDIT_MODE_LAYOUTS_UPDATED\")\n        elseif event == \"PLAYER_LEAVING_WORLD\" then\n            EditModeManagerFrame:UnregisterEvent(\"EDIT_MODE_LAYOUTS_UPDATED\")\n        end\n    end)\nend\n\nif not NoTaint2_Proc_CleanActionButtonFlyout then\n    NoTaint2_Proc_CleanActionButtonFlyout = 1\n    --[[------------------------------------------------------------\n    this is totally magic, thanks god ObjectiveTrackerFrame is after the ActionBars\n    ---------------------------------------------------------------]]\n    local barsToUpdate = { MainMenuBar, MultiBarBottomLeft, MultiBarBottomRight, StanceBar, PetActionBar, PossessActionBar, MultiBarRight, MultiBarLeft, MultiBar5, MultiBar6, MultiBar7 }\n    for _, bar in ipairs(barsToUpdate) do\n        hooksecurefunc(bar, \"UpdateSpellFlyoutDirection\", function(self)\n            if not issecurevariable(self, \"flyoutDirection\") then\n                self.flyoutDirection = nil\n            end\n            if not issecurevariable(self, \"snappedToFrame\") then\n                self.snappedToFrame = nil\n            end\n        end)\n    end\n\n    hooksecurefunc(\"SetClampedTextureRotation\", function(texture)\n        local parent = texture and texture:GetParent()\n        if parent and parent.FlyoutArrowPushed and parent.FlyoutArrowHighlight then\n            if not issecurevariable(texture, \"rotationDegrees\") then\n                texture.rotationDegrees = nil\n            end\n        end\n    end)\nend"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/Fonts.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tBased on tekticles(by Tekkub)\n----------------------------------------------------------------------------------------\nlocal SetFont = function(obj, font, size, style, r, g, b, sr, sg, sb, sox, soy)\n\tif not obj then return end\n\tobj:SetFont(font, size, style or \"\")\n\tif sr and sg and sb then obj:SetShadowColor(sr, sg, sb) end\n\tif sox and soy then obj:SetShadowOffset(sox, soy) end\n\tif r and g and b then obj:SetTextColor(r, g, b) end\nend\n\nlocal frame = CreateFrame(\"Frame\", nil, UIParent)\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function(_, _, addon)\n\tif addon ~= \"ShestakUI\" or addon == \"tekticles\" then return end\n\n\tlocal NORMAL = C.media.normal_font\n\t-- local BLANK = C.media.blank_font\n\n\tUIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT = 12\n\tCHAT_FONT_HEIGHTS = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}\n\n\tUNIT_NAME_FONT = NORMAL\n\tSTANDARD_TEXT_FONT = NORMAL\n\n\t-- Base fonts\n\tSetFont(AchievementFont_Small, NORMAL, 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(InvoiceFont_Med, NORMAL, 13, nil, 0.15, 0.09, 0.04)\n\tSetFont(InvoiceFont_Small, NORMAL, 11, nil, 0.15, 0.09, 0.04)\n\tSetFont(MailFont_Large, NORMAL, 15, nil, 0, 0, 0, 0, 0, 0, C.skins.blizzard_frames and 1, C.skins.blizzard_frames and -1)\n\tSetFont(NumberFont_Outline_Huge, NORMAL, 30, \"THICKOUTLINE\", 30)\n\tSetFont(NumberFont_Outline_Large, NORMAL, 17, \"OUTLINE\")\n\tSetFont(NumberFont_Outline_Med, NORMAL, 15, \"OUTLINE\")\n\tSetFont(NumberFont_Shadow_Med, NORMAL, 14)\n\tSetFont(NumberFont_Shadow_Small, NORMAL, 13, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(NumberFont_Normal_Med, NORMAL, 13)\n\tSetFont(NumberFont_Small, NORMAL, 10)\n\tSetFont(QuestFont_Large, NORMAL, 16)\n\tSetFont(QuestFont_Shadow_Huge, NORMAL, 19, nil, nil, nil, nil, 0.54, 0.4, 0.1)\n\tSetFont(QuestFont_Shadow_Small, NORMAL, 15)\n\tSetFont(QuestFont_Super_Huge, NORMAL, 20, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(QuestFont_Huge, NORMAL, 17, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(QuestFont_Enormous, NORMAL, 30, nil, 1, 0.82, 0)\n\tSetFont(ReputationDetailFont, NORMAL, 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(SpellFont_Small, NORMAL, 11)\n\tSetFont(SystemFont_InverseShadow_Small, NORMAL, 11)\n\tSetFont(SystemFont_Large, NORMAL, 17)\n\tSetFont(SystemFont_Huge1, NORMAL, 20)\n\tSetFont(SystemFont_Huge2, NORMAL, 24)\n\tSetFont(SystemFont_Med1, NORMAL, 13)\n\tSetFont(SystemFont_Med2, NORMAL, 14, nil, 0.15, 0.09, 0.04)\n\tSetFont(SystemFont_Med3, NORMAL, 15)\n\tSetFont(SystemFont_Outline, NORMAL, 13, \"OUTLINE\")\n\tSetFont(SystemFont_OutlineThick_Huge2, NORMAL, 22, \"THICKOUTLINE\")\n\tSetFont(SystemFont_OutlineThick_Huge4, NORMAL, 27, \"THICKOUTLINE\")\n\tSetFont(SystemFont_OutlineThick_WTF, NORMAL, 31, \"THICKOUTLINE\", nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(SystemFont_Huge1_Outline, NORMAL, 19, \"OUTLINE\")\n\tSetFont(SystemFont_Outline_Small, NORMAL, 12, \"OUTLINE\")\n\tSetFont(SystemFont_Shadow_Huge1, NORMAL, 20)\n\tSetFont(SystemFont_Shadow_Huge3, NORMAL, 25)\n\tSetFont(SystemFont_Shadow_Large, NORMAL, 17)\n\tSetFont(SystemFont_Shadow_Large2, NORMAL, 17)\n\tSetFont(SystemFont_Shadow_Med1, NORMAL, 13)\n\tSetFont(SystemFont_Shadow_Med2, NORMAL, 13)\n\tSetFont(SystemFont_Shadow_Med3, NORMAL, 15)\n\tSetFont(SystemFont22_Shadow_Outline, NORMAL, 22, \"OUTLINE\")\n\tSetFont(SystemFont_Shadow_Small, NORMAL, 11)\n\tSetFont(SystemFont_Shadow_Small2, NORMAL, 11)\n\tSetFont(SystemFont_Small, NORMAL, 12)\n\tSetFont(SystemFont_Small2, NORMAL, 12)\n\tSetFont(SystemFont_Tiny, NORMAL, 11)\n\tSetFont(GameTooltipHeader, NORMAL, C.font.tooltip_header_font_size, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(Tooltip_Med, NORMAL, C.font.tooltip_font_size, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(Tooltip_Small, NORMAL, GetLocale() == \"zhTW\" and 12 or 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(FriendsFont_Small, NORMAL, 11)\n\tSetFont(FriendsFont_Normal, NORMAL, 12)\n\tSetFont(FriendsFont_Large, NORMAL, 15)\n\tSetFont(FriendsFont_UserText, NORMAL, 11)\n\tSetFont(CoreAbilityFont, NORMAL, 32, nil, 1, 0.82, 0, 0, 0, 0, 1, -1)\n\tSetFont(ChatBubbleFont, NORMAL, C.font.bubble_font_size)\n\tSetFont(Game13FontShadow, NORMAL, 14)\n\tSetFont(Game32Font_Shadow2, NORMAL, 32)\n\tSetFont(Game15Font_o1, NORMAL, 15)\n\tSetFont(Fancy14Font, NORMAL, 14)\n\tSetFont(Game18Font, NORMAL, 18)\n\tSetFont(Game16Font, NORMAL, 16)\n\tSetFont(Game12Font, NORMAL, 12)\n\tSetFont(Game13Font, NORMAL, 13)\n\tSetFont(Fancy16Font, NORMAL, 16)\n\tSetFont(FriendsFont_11, NORMAL, 11)\n\tSetFont(PriceFont, NORMAL, 13)\n\tSetFont(Number11Font, NORMAL, 10)\n\tSetFont(Number12Font, NORMAL, 11)\n\tSetFont(Number12FontOutline, NORMAL, 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(Number13Font, NORMAL, 12)\n\tSetFont(Number15Font, NORMAL, 14)\n\tSetFont(Game11Font_o1, NORMAL, 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(Game12Font_o1, NORMAL, 12, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(Game13Font_o1, NORMAL, 13, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\n\t-- Derived fonts\n\tSetFont(BossEmoteNormalHuge, NORMAL, 27, \"THICKOUTLINE\")\n\tSetFont(ErrorFont, NORMAL, 16)\n\tSetFont(QuestFontNormalSmall, NORMAL, 13, nil, nil, nil, nil, 0.54, 0.4, 0.1)\n\tSetFont(WorldMapTextFont, NORMAL, 32, \"OUTLINE\")\n\tSetFont(SubZoneTextFont, NORMAL, 30, \"OUTLINE\")\n\tSetFont(WhiteNormalNumberFont, NORMAL, 11)\n\tSetFont(ZoneTextString, NORMAL, 32, \"OUTLINE\")\n\tSetFont(SubZoneTextString, NORMAL, 25, \"OUTLINE\")\n\tSetFont(PVPInfoTextString, NORMAL, 22, \"THINOUTLINE\")\n\tSetFont(PVPArenaTextString, NORMAL, 22, \"THINOUTLINE\")\n\tSetFont(QuestMapRewardsFont, NORMAL, 12, nil, nil, nil, nil, 0, 0, 0, 1, -1)\n\tSetFont(NumberFontNormalSmall, NORMAL, 11, \"OUTLINE\")\nend)\n\n-- Registering fonts in LibSharedMedia\nlocal LSM = LibStub and LibStub:GetLibrary(\"LibSharedMedia-3.0\", true)\nlocal LOCALE_MASK = 0\nif GetLocale() == \"koKR\" then\n\tLOCALE_MASK = 1\nelseif GetLocale() == \"ruRU\" then\n\tLOCALE_MASK = 2\nelseif GetLocale() == \"zhCN\" then\n\tLOCALE_MASK = 4\nelseif GetLocale() == \"zhTW\" then\n\tLOCALE_MASK = 8\nelse\n\tLOCALE_MASK = 128\nend\n\nif LSM then\n\tLSM:Register(LSM.MediaType.FONT, \"Calibri\", [[Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Normal.ttf]], LOCALE_MASK)\n\tLSM:Register(LSM.MediaType.FONT, \"Hooge\", [[Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Pixel.ttf]], LOCALE_MASK)\n\tLSM:Register(LSM.MediaType.STATUSBAR, \"Smooth!\", [[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Texture.tga]])\nend"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/LibShowUIPanel.lua",
    "content": "-- LibShowUIPanel-1.0.lua\n-- @Author : Dencer (tdaddon@163.com)\n-- @Link   : https://dengsir.github.io\n-- @Date   : 6/15/2021, 11:20:01 PM\n--\nlocal MAJOR, MINOR = 'LibShowUIPanel-1.0', 6\n\nlocal Lib, oldminor = LibStub and LibStub:NewLibrary(MAJOR, MINOR)\nif not Lib then\n\treturn\nend\n\nlocal ShowUIPanel = ShowUIPanel\nlocal HideUIPanel = HideUIPanel\n\nlocal InCombatLockdown = InCombatLockdown\n\nLib.Delegate = Lib.Delegate or (function()\n\tlocal frame = EnumerateFrames()\n\twhile frame do\n\t\tif frame.SetUIPanel and issecurevariable(frame, 'SetUIPanel') then\n\t\t\treturn frame\n\t\tend\n\t\tframe = EnumerateFrames(frame)\n\tend\nend)()\n\nlocal Delegate = Lib.Delegate\n\nlocal function GetUIPanelWindowInfo(frame, name)\n\tif not frame:GetAttribute('UIPanelLayout-defined') then\n\t\tlocal info = UIPanelWindows[frame:GetName()]\n\t\tif not info then\n\t\t\treturn\n\t\tend\n\t\tframe:SetAttribute('UIPanelLayout-defined', true)\n\t\tfor k, v in pairs(info) do\n\t\t\tframe:SetAttribute('UIPanelLayout-' .. k, v)\n\t\tend\n\tend\n\treturn frame:GetAttribute('UIPanelLayout-' .. name)\nend\n\nlocal function ShowPanel(frame, force)\n\tif not frame or frame:IsShown() then\n\t\treturn\n\tend\n\n\tif not GetUIPanelWindowInfo(frame, 'area') then\n\t\tframe:Show()\n\t\treturn\n\tend\n\n\tDelegate:SetAttribute('panel-force', force)\n\tDelegate:SetAttribute('panel-frame', frame)\n\tDelegate:SetAttribute('panel-show', true)\nend\n\nlocal function HidePanel(frame, skipSetPoint)\n\tif not frame or not frame:IsShown() then\n\t\treturn\n\tend\n\n\tif not GetUIPanelWindowInfo(frame, 'area') then\n\t\tframe:Hide()\n\t\treturn\n\tend\n\n\tDelegate:SetAttribute('panel-frame', frame)\n\tDelegate:SetAttribute('panel-skipSetPoint', skipSetPoint)\n\tDelegate:SetAttribute('panel-hide', true)\nend\n\nfunction Lib.Show(frame, force)\n\tif not InCombatLockdown() then\n\t\treturn ShowUIPanel(frame, force)\n\telse\n\t\treturn ShowPanel(frame, force)\n\tend\nend\n\nfunction Lib.Hide(frame, skipSetPoint)\n\tif not InCombatLockdown() then\n\t\treturn HideUIPanel(frame, skipSetPoint)\n\telse\n\t\treturn HidePanel(frame, skipSetPoint)\n\tend\nend\n\nfunction Lib.Toggle(frame)\n\tif frame:IsShown() then\n\t\tLib.Hide(frame)\n\telse\n\t\tLib.Show(frame)\n\tend\nend\n\nif not oldminor or oldminor < 6 then\n\t-- 可长期持有的API\n\tfunction Lib.ShowUIPanel(frame, force)\n\t\treturn Lib.Show(frame, force)\n\tend\n\n\tfunction Lib.HideUIPanel(frame, skipSetPoint)\n\t\treturn Lib.Hide(frame, skipSetPoint)\n\tend\n\n\tfunction Lib.ToggleFrame(frame)\n\t\treturn Lib.Toggle(frame)\n\tend\nend\n\n---- hooks\n\nif not Lib.OnCallShowUIPanel then\n\thooksecurefunc('ShowUIPanel', function(...)\n\t\treturn Lib.OnCallShowUIPanel(...)\n\tend)\nend\n\nif not Lib.OnCallHideUIPanel then\n\thooksecurefunc('HideUIPanel', function(...)\n\t\treturn Lib.OnCallHideUIPanel(...)\n\tend)\nend\n\nfunction Lib.OnCallShowUIPanel(frame, force)\n\tif not frame or frame:IsShown() or not InCombatLockdown() then\n\t\treturn\n\tend\n\treturn ShowPanel(frame, force)\nend\n\nfunction Lib.OnCallHideUIPanel(frame, skipSetPoint)\n\tif not frame or not frame:IsShown() or not InCombatLockdown() then\n\t\treturn\n\tend\n\treturn HidePanel(frame, skipSetPoint)\nend\n"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/Mail.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif IsAddOnLoaded(\"OpenAll\") or IsAddOnLoaded(\"Postal\") or IsAddOnLoaded(\"TradeSkillMaster_Mailing\") then return end\n\n----------------------------------------------------------------------------------------\n--\tGrab mail in 1 button(OpenAll by Kemayo)\n----------------------------------------------------------------------------------------\nlocal deletedelay, t = 0.5, 0\nlocal takingOnlyCash = false\nlocal button, button2, waitForMail, openAll, openAllCash, openMail, lastopened, stopOpening, onEvent, needsToWait, copper_to_pretty_money, total_cash\nlocal baseInboxFrame_OnClick\n-- local profit = 0\n\nfunction openAll()\n\tif GetInboxNumItems() == 0 then return end\n\tbutton:SetScript(\"OnClick\", nil)\n\tbutton2:SetScript(\"OnClick\", nil)\n\tbaseInboxFrame_OnClick = InboxFrame_OnClick\n\tInboxFrame_OnClick = function() end\n\tbutton:RegisterEvent(\"UI_ERROR_MESSAGE\")\n\topenMail(GetInboxNumItems())\nend\n\nfunction openAllCash()\n\ttakingOnlyCash = true\n\topenAll()\nend\n\nfunction openMail(index)\n\tif not InboxFrame:IsVisible() then return stopOpening(L_MAIL_NEED) end\n\tif index == 0 then MinimapCluster.IndicatorFrame.MailFrame:Hide() return stopOpening(L_MAIL_COMPLETE) end\n\tlocal _, _, _, _, money, COD, _, numItems = GetInboxHeaderInfo(index)\n\tif money > 0 then\n\t\tTakeInboxMoney(index)\n\t\tneedsToWait = true\n\t\tif total_cash then total_cash = total_cash - money end\n\t\t-- profit = profit + money\n\telseif (not takingOnlyCash) and (numItems and numItems > 0) and COD <= 0 then\n\t\tTakeInboxItem(index)\n\t\tneedsToWait = true\n\tend\n\tlocal items = GetInboxNumItems()\n\tif (numItems and numItems > 0) or (items > 1 and index <= items) then\n\t\tlastopened = index\n\t\tt = 0\n\t\tbutton:SetScript(\"OnUpdate\", waitForMail)\n\telse\n\t\tstopOpening(L_MAIL_COMPLETE)\n\t\tMinimapCluster.IndicatorFrame.MailFrame:Hide()\n\tend\nend\n\nfunction waitForMail(_, elapsed)\n\tt = t + elapsed\n\tif (not needsToWait) or (t > deletedelay) then\n\t\tneedsToWait = false\n\t\tbutton:SetScript(\"OnUpdate\", nil)\n\t\tlocal _, _, _, _, money, COD, _, numItems = GetInboxHeaderInfo(lastopened)\n\t\tif money > 0 or ((not takingOnlyCash) and COD <= 0 and numItems and (numItems > 0)) then\n\t\t\topenMail(lastopened)\n\t\telse\n\t\t\topenMail(lastopened - 1)\n\t\tend\n\tend\nend\n\nfunction copper_to_pretty_money(c)\n\tif c > 10000 then\n\t\treturn (\"%d|cffffd700\"..GOLD_AMOUNT_SYMBOL..\"|r %d|cffc7c7cf\"..SILVER_AMOUNT_SYMBOL..\"|r %d|cffeda55f\"..COPPER_AMOUNT_SYMBOL..\"|r\"):format(c / 10000, (c / 100) % 100, c % 100)\n\telseif c > 100 then\n\t\treturn (\"%d|cffc7c7cf\"..SILVER_AMOUNT_SYMBOL..\"|r %d|cffeda55f\"..COPPER_AMOUNT_SYMBOL..\"|r\"):format((c / 100) % 100, c % 100)\n\telse\n\t\treturn (\"%d|cffeda55f\"..COPPER_AMOUNT_SYMBOL..\"|r\"):format(c % 100)\n\tend\nend\n\nfunction stopOpening(msg)\n\tbutton:SetScript(\"OnUpdate\", nil)\n\tbutton:SetScript(\"OnClick\", openAll)\n\tbutton2:SetScript(\"OnClick\", openAllCash)\n\tif baseInboxFrame_OnClick then\n\t\tInboxFrame_OnClick = baseInboxFrame_OnClick\n\tend\n\tbutton:UnregisterEvent(\"UI_ERROR_MESSAGE\")\n\ttakingOnlyCash = false\n\ttotal_cash = nil\n\tif msg then print(\"|cffffff00\"..msg..\"|r\") end\n\t-- if profit > 0 then print(format(\"|cff66C6FF%s |cffFFFFFF%s\", AMOUNT_RECEIVED_COLON, copper_to_pretty_money(profit))) profit = 0 end\nend\n\nfunction onEvent(_, event, _, text)\n\tif event == \"UI_ERROR_MESSAGE\" then\n\t\tif text == ERR_INV_FULL then\n\t\t\tstopOpening(L_MAIL_STOPPED)\n\t\telseif text == ERR_ITEM_MAX_COUNT then\n\t\t\tstopOpening(L_MAIL_UNIQUE)\n\t\tend\n\tend\nend\n\nlocal function makeButton(id, text, w, h, x, y)\n\tlocal button = CreateFrame(\"Button\", id, InboxFrame, \"UIPanelButtonTemplate\")\n\tbutton:SetWidth(w)\n\tbutton:SetHeight(h)\n\tbutton:SetPoint(\"CENTER\", InboxFrame, \"TOP\", x, y)\n\tbutton:SetText(text)\n\treturn button\nend\n\nbutton = makeButton(\"OpenAllButton\", ALL, 70, 25, -65, -398)\nbutton:SetScript(\"OnClick\", openAll)\nbutton:SetScript(\"OnEvent\", onEvent)\nbutton:SetScript(\"OnEnter\", function()\n\tGameTooltip:SetOwner(button, \"ANCHOR_RIGHT\")\n\tGameTooltip:AddLine(string.format(\"%d \"..L_MAIL_MESSAGES, GetInboxNumItems()), 1, 1, 1)\n\tGameTooltip:Show()\nend)\nbutton:SetScript(\"OnLeave\", function() GameTooltip:Hide() end)\n\nbutton2 = makeButton(\"OpenAllButton2\", MONEY, 70, 25, 18, -398)\nbutton2:SetScript(\"OnClick\", openAllCash)\nbutton2:SetScript(\"OnEnter\", function()\n\tif not total_cash then\n\t\ttotal_cash = 0\n\t\tfor index = 0, GetInboxNumItems() do\n\t\t\tlocal _, _, _, _, money = GetInboxHeaderInfo(index)\n\t\t\ttotal_cash = total_cash + money\n\t\tend\n\tend\n\tGameTooltip:SetOwner(button, \"ANCHOR_RIGHT\")\n\tGameTooltip:AddLine(copper_to_pretty_money(total_cash), 1, 1, 1)\n\tGameTooltip:Show()\nend)\nbutton2:SetScript(\"OnLeave\", function() GameTooltip:Hide() end)\n\nif C.skins.blizzard_frames == true then\n\tOpenAllButton:SkinButton()\n\tOpenAllButton2:SkinButton()\nend\n\nOpenAllMail:Hide() -- 7.2 new button"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/MirrorBars.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.unit_castbar ~= true or C.unitframe.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on oMirrorBars(by Haste)\n----------------------------------------------------------------------------------------\nlocal position = {\n\t[\"BREATH\"] = \"TOP#UIParent#TOP#0#-96\";\n\t[\"EXHAUSTION\"] = \"TOP#UIParent#TOP#0#-116\";\n\t[\"FEIGNDEATH\"] = \"TOP#UIParent#TOP#0#-142\";\n}\n\nlocal colors = {\n\tEXHAUSTION = {1, 0.9, 0};\n\tBREATH = {0.31, 0.45, 0.63};\n\tDEATH = {1, 0.7, 0};\n\tFEIGNDEATH = {1, 0.7, 0};\n}\n\nlocal Spawn, PauseAll\ndo\n\tlocal barPool = {}\n\n\tlocal loadPosition = function(self)\n\t\tlocal pos = position[self.type]\n\t\tlocal p1, frame, p2, x, y = strsplit(\"#\", pos)\n\n\t\treturn self:SetPoint(p1, frame, p2, x, y)\n\tend\n\n\tlocal OnUpdate = function(self)\n\t\tif self.paused then return end\n\n\t\tself:SetValue(GetMirrorTimerProgress(self.type) / 1e3)\n\tend\n\n\tlocal Start = function(self, value, maxvalue, _, paused, text)\n\t\tif paused > 0 then\n\t\t\tself.paused = 1\n\t\telseif self.paused then\n\t\t\tself.paused = nil\n\t\tend\n\n\t\tself.text:SetText(text)\n\n\t\tself:SetMinMaxValues(0, maxvalue / 1e3)\n\t\tself:SetValue(value / 1e3)\n\n\t\tif not self:IsShown() then self:Show() end\n\tend\n\n\tfunction Spawn(type)\n\t\tif barPool[type] then return barPool[type] end\n\t\tlocal frame = CreateFrame(\"StatusBar\", nil, UIParent)\n\n\t\tframe:SetScript(\"OnUpdate\", OnUpdate)\n\n\t\tlocal r, g, b = unpack(colors[type])\n\n\t\tlocal bg = frame:CreateTexture(nil, \"BACKGROUND\")\n\t\tbg:SetAllPoints(frame)\n\t\tbg:SetTexture(C.media.texture)\n\t\tbg:SetVertexColor(r * 0.3, g * 0.3, b * 0.3)\n\n\t\tlocal border = CreateFrame(\"Frame\", nil, frame)\n\t\tborder:SetPoint(\"TOPLEFT\", frame, -2, 2)\n\t\tborder:SetPoint(\"BOTTOMRIGHT\", frame, 2, -2)\n\t\tborder:SetTemplate(\"Default\")\n\t\tborder:SetFrameLevel(0)\n\n\t\tlocal text = frame:CreateFontString(nil, \"OVERLAY\")\n\t\ttext:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\ttext:SetJustifyH(\"CENTER\")\n\t\ttext:SetShadowOffset(0, 0)\n\t\ttext:SetTextColor(1, 1, 1)\n\n\t\ttext:SetPoint(\"LEFT\", frame)\n\t\ttext:SetPoint(\"RIGHT\", frame)\n\t\ttext:SetPoint(\"TOP\", frame, 0, 1)\n\t\ttext:SetPoint(\"BOTTOM\", frame)\n\n\t\tframe:SetSize(281, 16)\n\n\t\tframe:SetStatusBarTexture(C.media.texture)\n\t\tframe:SetStatusBarColor(r, g, b)\n\n\t\tframe.type = type\n\t\tframe.text = text\n\n\t\tframe.Start = Start\n\t\tframe.Stop = Stop\n\n\t\tloadPosition(frame)\n\n\t\tbarPool[type] = frame\n\t\treturn frame\n\tend\n\n\tfunction PauseAll(val)\n\t\tfor _, bar in next, barPool do\n\t\t\tbar.paused = val\n\t\tend\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:SetScript(\"OnEvent\", function(self, event, ...)\n\treturn self[event](self, ...)\nend)\n\nfunction frame:ADDON_LOADED(addon)\n\tif addon == \"ShestakUI\" then\n\t\tUIParent:UnregisterEvent(\"MIRROR_TIMER_START\")\n\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\t\tself.ADDON_LOADED = nil\n\tend\nend\nframe:RegisterEvent(\"ADDON_LOADED\")\n\nfunction frame:PLAYER_ENTERING_WORLD()\n\tfor i = 1, MIRRORTIMER_NUMTIMERS do\n\t\tlocal type, value, maxvalue, scale, paused, text = GetMirrorTimerInfo(i)\n\t\tif type ~= \"UNKNOWN\" then\n\t\t\tSpawn(type):Start(value, maxvalue, scale, paused, text)\n\t\tend\n\tend\nend\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\nfunction frame:MIRROR_TIMER_START(type, value, maxvalue, scale, paused, text)\n\treturn Spawn(type):Start(value, maxvalue, scale, paused, text)\nend\nframe:RegisterEvent(\"MIRROR_TIMER_START\")\n\nfunction frame:MIRROR_TIMER_STOP(type)\n\treturn Spawn(type):Hide()\nend\nframe:RegisterEvent(\"MIRROR_TIMER_STOP\")\n\nfunction frame:MIRROR_TIMER_PAUSE(duration)\n\treturn PauseAll((duration > 0 and duration) or nil)\nend\nframe:RegisterEvent(\"MIRROR_TIMER_PAUSE\")"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/MoveBlizzFrames.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.general.move_blizzard ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMove some Blizzard frames\n----------------------------------------------------------------------------------------\nlocal frames = {\n\t\"CharacterFrame\", \"SpellBookFrame\", \"TaxiFrame\", \"QuestFrame\", \"PVEFrame\", \"AddonList\",\n\t\"QuestLogPopupDetailFrame\", \"MerchantFrame\", \"TradeFrame\", \"MailFrame\", \"LootFrame\",\n\t\"FriendsFrame\", \"CinematicFrame\", \"TabardFrame\", \"PetStableFrame\", \"BankFrame\",\n\t\"PetitionFrame\", \"HelpFrame\", \"GossipFrame\", \"DressUpFrame\", \"GuildRegistrarFrame\",\n\t\"ChatConfigFrame\", \"RaidBrowserFrame\", \"InterfaceOptionsFrame\", \"WorldMapFrame\",\n\t\"GameMenuFrame\", \"VideoOptionsFrame\", \"GuildInviteFrame\", \"ItemTextFrame\",\n\t\"OpenMailFrame\", \"StackSplitFrame\", \"TutorialFrame\", \"StaticPopup1\",\n\t\"StaticPopup2\", \"ScrollOfResurrectionSelectionFrame\", \"ProfessionsFrame\"\n}\n\nfor _, v in pairs(frames) do\n\tif _G[v] then\n\t\t_G[v]:EnableMouse(true)\n\t\t_G[v]:SetMovable(true)\n\t\t_G[v]:SetClampedToScreen(true)\n\t\t_G[v]:RegisterForDrag(\"LeftButton\")\n\t\t_G[v]:SetScript(\"OnDragStart\", function(self) self:StartMoving() end)\n\t\t_G[v]:SetScript(\"OnDragStop\", function(self) self:StopMovingOrSizing() end)\n\tend\nend\n\nlocal AddOnFrames = {\n\t[\"Blizzard_AchievementUI\"] = {\"AchievementFrame\"},\n\t[\"Blizzard_ArchaeologyUI\"] = {\"ArchaeologyFrame\"},\n\t[\"Blizzard_ArtifactUI\"] = {\"ArtifactRelicForgeFrame\"},\n\t[\"Blizzard_AuctionHouseUI\"] = {\"AuctionHouseFrame\"},\n\t[\"Blizzard_BarberShopUI\"] = {\"BarberShopFrame\"},\n\t[\"Blizzard_BindingUI\"] = {\"KeyBindingFrame\"},\n\t[\"Blizzard_BlackMarketUI\"] = {\"BlackMarketFrame\"},\n\t[\"Blizzard_Calendar\"] = {\"CalendarCreateEventFrame\", \"CalendarFrame\", \"CalendarViewEventFrame\", \"CalendarViewHolidayFrame\"},\n\t[\"Blizzard_ChallengesUI\"] = {\"ChallengesLeaderboardFrame\"},\n\t[\"Blizzard_Collections\"] = {\"CollectionsJournal\", \"WardrobeFrame\"},\n\t[\"Blizzard_Communities\"] = {\"CommunitiesFrame\"},\n\t[\"Blizzard_EncounterJournal\"] = {\"EncounterJournal\"},\n\t[\"Blizzard_GMChatUI\"] = {\"GMChatStatusFrame\"},\n\t[\"Blizzard_GMSurveyUI\"] = {\"GMSurveyFrame\"},\n\t[\"Blizzard_GarrisonUI\"] = {\"GarrisonLandingPage\", \"GarrisonMissionFrame\", \"GarrisonCapacitiveDisplayFrame\", \"GarrisonBuildingFrame\", \"GarrisonRecruiterFrame\", \"GarrisonRecruitSelectFrame\", \"GarrisonShipyardFrame\"},\n\t[\"Blizzard_GuildBankUI\"] = {\"GuildBankFrame\"},\n\t[\"Blizzard_GuildControlUI\"] = {\"GuildControlUI\"},\n\t[\"Blizzard_InspectUI\"] = {\"InspectFrame\"},\n\t[\"Blizzard_ItemAlterationUI\"] = {\"TransmogrifyFrame\"},\n\t[\"Blizzard_ItemSocketingUI\"] = {\"ItemSocketingFrame\"},\n\t[\"Blizzard_ItemUpgradeUI\"] = {\"ItemUpgradeFrame\"},\n\t[\"Blizzard_LookingForGuildUI\"] = {\"LookingForGuildFrame\"},\n\t[\"Blizzard_MacroUI\"] = {\"MacroFrame\"},\n\t[\"Blizzard_OrderHallUI\"] = {\"OrderHallMissionFrame\"},\n\t[\"Blizzard_QuestChoice\"] = {\"QuestChoiceFrame\"},\n\t[\"Blizzard_ReforgingUI\"] = {\"ReforgingFrame\"},\n\t[\"Blizzard_TalentUI\"] = {\"PlayerTalentFrame\"},\n\t[\"Blizzard_TalkingHeadUI\"] = {\"TalkingHeadFrame\"},\n\t-- [\"Blizzard_TradeSkillUI\"] = {\"TradeSkillFrame\"},\n\t[\"Blizzard_TrainerUI\"] = {\"ClassTrainerFrame\"},\n\t[\"Blizzard_VoidStorageUI\"] = {\"VoidStorageFrame\"}\n}\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function(_, _, addon)\n\t-- Fix move\n\tif addon == \"Blizzard_Collections\" then\n\t\tlocal checkbox = _G.WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox\n\t\tcheckbox.Label:ClearAllPoints()\n\t\tcheckbox.Label:SetPoint(\"LEFT\", checkbox, \"RIGHT\", 2, 1)\n\t\tcheckbox.Label:SetPoint(\"RIGHT\", checkbox, \"RIGHT\", 160, 1)\n\telseif addon == \"Blizzard_EncounterJournal\" then\n\t\tlocal replacement = function(rewardFrame)\n\t\t\tif rewardFrame.data then\n\t\t\t\t_G.EncounterJournalTooltip:ClearAllPoints()\n\t\t\tend\n\t\t\tAdventureJournal_Reward_OnEnter(rewardFrame)\n\t\tend\n\t\t_G.EncounterJournal.suggestFrame.Suggestion1.reward:HookScript(\"OnEnter\", replacement)\n\t\t_G.EncounterJournal.suggestFrame.Suggestion2.reward:HookScript(\"OnEnter\", replacement)\n\t\t_G.EncounterJournal.suggestFrame.Suggestion3.reward:HookScript(\"OnEnter\", replacement)\n\telseif addon == \"Blizzard_Communities\" then\n\t\tlocal dialog = _G.CommunitiesFrame.NotificationSettingsDialog\n\t\tif dialog then\n\t\t\tdialog:ClearAllPoints()\n\t\t\tdialog:SetAllPoints()\n\t\tend\n\tend\n\tif AddOnFrames[addon] then\n\t\tfor _, v in pairs(AddOnFrames[addon]) do\n\t\t\tif _G[v] then\n\t\t\t\t_G[v]:EnableMouse(true)\n\t\t\t\t_G[v]:SetMovable(true)\n\t\t\t\t_G[v]:SetClampedToScreen(true)\n\t\t\t\t_G[v]:RegisterForDrag(\"LeftButton\")\n\t\t\t\t_G[v]:SetScript(\"OnDragStart\", function(self) self:StartMoving() end)\n\t\t\t\t_G[v]:SetScript(\"OnDragStop\", function(self) self:StopMovingOrSizing() end)\n\t\t\tend\n\t\tend\n\tend\nend)\n"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/PetBattle.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tPet Battles UI\n----------------------------------------------------------------------------------------\nlocal bar = CreateFrame(\"Frame\", \"PetBattleBarHolder\", UIParent, \"SecureHandlerStateTemplate\")\nbar:SetSize(((C.actionbar.button_size * 1.5) * 6) + (C.actionbar.button_space * 5), C.actionbar.button_size * 1.5)\nbar:EnableMouse(true)\nbar:SetFrameStrata(\"LOW\")\nbar:SetPoint(unpack(C.position.bottom_bars))\nRegisterStateDriver(bar, \"visibility\", \"[petbattle] show; hide\")\n\nlocal f = PetBattleFrame\nlocal bf = f.BottomFrame\nlocal units = {\n\tf.ActiveAlly,\n\tf.ActiveEnemy\n}\n\n-- General\nf:StripTextures()\n\n-- Pets unitframes\nfor i, unit in pairs(units) do\n\tunit.Border:SetAlpha(0)\n\tunit.Border2:SetAlpha(0)\n\tunit.healthBarWidth = 300\n\n\tunit.IconBackdrop = CreateFrame(\"Frame\", nil, unit)\n\tunit.IconBackdrop:SetFrameLevel(unit:GetFrameLevel() - 1)\n\tunit.IconBackdrop:SetPoint(\"TOPLEFT\", unit.Icon, -2, 2)\n\tunit.IconBackdrop:SetPoint(\"BOTTOMRIGHT\", unit.Icon, 2, -2)\n\tunit.IconBackdrop:SetTemplate(\"Default\")\n\n\tunit.HealthBarBG:Kill()\n\tunit.HealthBarFrame:Kill()\n\tunit.HealthBarBackdrop = CreateFrame(\"Frame\", nil, unit)\n\tunit.HealthBarBackdrop:SetFrameLevel(unit:GetFrameLevel() - 1)\n\tunit.HealthBarBackdrop:SetTemplate(\"Transparent\")\n\tunit.HealthBarBackdrop:SetWidth(unit.healthBarWidth + 4)\n\tunit.ActualHealthBar:SetTexture(C.media.texture)\n\n\tunit.ActualHealthBar:ClearAllPoints()\n\tunit.Name:ClearAllPoints()\n\n\tunit.PetTypeFrame = CreateFrame(\"Frame\", nil, unit)\n\tunit.PetTypeFrame:SetSize(23, 23)\n\n\tunit.SpeedIcon:SetAlpha(0)\n\tunit.SpeedUnderlay:SetAlpha(0)\n\n\tunit.FirstAttack = unit:CreateTexture(nil, \"ARTWORK\")\n\tunit.FirstAttack:SetSize(20, 20)\n\tunit.FirstAttack:SetTexture(\"Interface\\\\PetBattles\\\\PetBattle-StatIcons\")\n\tunit.FirstAttack:Hide()\n\n\tif i == 1 then\n\t\tunit.HealthBarBackdrop:SetPoint(\"TOPLEFT\", unit.ActualHealthBar, \"TOPLEFT\", -2, 2)\n\t\tunit.HealthBarBackdrop:SetPoint(\"BOTTOMLEFT\", unit.ActualHealthBar, \"BOTTOMLEFT\", -2, -2)\n\t\tf.Ally2.iconPoint = unit.IconBackdrop\n\t\tf.Ally3.iconPoint = unit.IconBackdrop\n\n\t\tunit.ActualHealthBar:SetPoint(\"BOTTOMLEFT\", unit.Icon, \"BOTTOMRIGHT\", 10, 0)\n\t\tunit.Name:SetPoint(\"BOTTOMLEFT\", unit.ActualHealthBar, \"TOPLEFT\", 0, 10)\n\n\t\tunit.PetTypeFrame:SetPoint(\"BOTTOMRIGHT\", unit.HealthBarBackdrop, \"TOPRIGHT\", 0, 7)\n\n\t\tunit.FirstAttack:SetPoint(\"LEFT\", unit.HealthBarBackdrop, \"RIGHT\", 5, 0)\n\t\tunit.FirstAttack:SetTexCoord(unit.SpeedIcon:GetTexCoord())\n\t\tunit.FirstAttack:SetVertexColor(0.1, 0.1, 0.1, 1)\n\n\t\tunit.Level:SetPoint(\"BOTTOMLEFT\", unit.Icon, \"BOTTOMLEFT\", 2, 0)\n\telse\n\t\tunit.HealthBarBackdrop:SetPoint(\"TOPRIGHT\", unit.ActualHealthBar, \"TOPRIGHT\", 2, 2)\n\t\tunit.HealthBarBackdrop:SetPoint(\"BOTTOMRIGHT\", unit.ActualHealthBar, \"BOTTOMRIGHT\", 2, -2)\n\t\tf.Enemy2.iconPoint = unit.IconBackdrop\n\t\tf.Enemy3.iconPoint = unit.IconBackdrop\n\n\t\tunit.ActualHealthBar:SetPoint(\"BOTTOMRIGHT\", unit.Icon, \"BOTTOMLEFT\", -10, 0)\n\t\tunit.Name:SetPoint(\"BOTTOMRIGHT\", unit.ActualHealthBar, \"TOPRIGHT\", 0, 10)\n\n\t\tunit.PetTypeFrame:SetPoint(\"BOTTOMLEFT\", unit.HealthBarBackdrop, \"TOPLEFT\", 0, 7)\n\n\t\tunit.FirstAttack:SetPoint(\"RIGHT\", unit.HealthBarBackdrop, \"LEFT\", -5, 0)\n\t\tunit.FirstAttack:SetTexCoord(0.5, 0, 0.5, 1)\n\t\tunit.FirstAttack:SetVertexColor(0.1, 0.1, 0.1, 1)\n\n\t\tunit.Level:SetPoint(\"BOTTOMRIGHT\", unit.Icon, \"BOTTOMRIGHT\", -2, 0)\n\tend\n\n\tunit.PetType:ClearAllPoints()\n\tunit.PetType:SetAllPoints(unit.PetTypeFrame)\n\tunit.PetType:SetAlpha(1)\n\tunit.PetType.ActiveStatus:Kill()\n\n\tunit.HealthText:ClearAllPoints()\n\tunit.HealthText:SetPoint(\"CENTER\", unit.HealthBarBackdrop, \"CENTER\")\n\n\tunit.LevelUnderlay:SetAlpha(0)\n\tunit.Level:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\tunit.Level:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\n\tunit.Level:SetTextColor(1, 1, 1)\n\n\tunit.BorderFlash:Kill()\nend\n\n-- Pets speed indicator update\nhooksecurefunc(\"PetBattleFrame_UpdateSpeedIndicators\", function()\n\tif not f.ActiveAlly.SpeedIcon:IsShown() and not f.ActiveEnemy.SpeedIcon:IsShown() then\n\t\tf.ActiveAlly.FirstAttack:Hide()\n\t\tf.ActiveEnemy.FirstAttack:Hide()\n\t\treturn\n\tend\n\n\tfor _, unit in pairs(units) do\n\t\tunit.FirstAttack:Show()\n\t\tif unit.SpeedIcon:IsShown() then\n\t\t\tunit.FirstAttack:SetVertexColor(0, 1, 0, 1)\n\t\telse\n\t\t\tunit.FirstAttack:SetVertexColor(0.8, 0, 0.3, 1)\n\t\tend\n\tend\nend)\n\n-- Pets unitframes aura skins\nhooksecurefunc(\"PetBattleAuraHolder_Update\", function(self)\n\tif not self.petOwner or not self.petIndex then return end\n\n\tlocal nextFrame = 1\n\tfor i = 1, C_PetBattles.GetNumAuras(self.petOwner, self.petIndex) do\n\t\tlocal _, _, turnsRemaining, isBuff = C_PetBattles.GetAuraInfo(self.petOwner, self.petIndex, i)\n\t\tif (isBuff and self.displayBuffs) or (not isBuff and self.displayDebuffs) then\n\t\t\tlocal frame = self.frames[nextFrame]\n\n\t\t\tframe:SetWidth(frame:GetHeight())\n\n\t\t\t-- Always hide the border\n\t\t\tframe.DebuffBorder:Hide()\n\n\t\t\tif not frame.isSkinned then\n\t\t\t\tframe:CreateBackdrop(\"Default\")\n\t\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, 2, -2)\n\t\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, -2, 2)\n\n\t\t\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tframe.Icon:SetPoint(\"TOPLEFT\", frame.backdrop, 2, -2)\n\t\t\t\tframe.Icon:SetPoint(\"BOTTOMRIGHT\", frame.backdrop, -2, 2)\n\t\t\tend\n\n\t\t\tif isBuff then\n\t\t\t\tframe.backdrop:SetBackdropBorderColor(0, 1, 0)\n\t\t\telse\n\t\t\t\tframe.backdrop:SetBackdropBorderColor(1, 0, 0)\n\t\t\tend\n\n\t\t\tif turnsRemaining > 0 then\n\t\t\t\tframe.Duration:SetText(turnsRemaining)\n\t\t\tend\n\n\t\t\tframe.Duration:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\t\t\tframe.Duration:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\n\t\t\tframe.Duration:ClearAllPoints()\n\t\t\tframe.Duration:SetPoint(\"CENTER\", frame.Icon, \"CENTER\", 1, -2)\n\n\t\t\tnextFrame = nextFrame + 1\n\t\tend\n\tend\nend)\n\n-- Reposition \"vs\" text\nf.TopVersusText:ClearAllPoints()\nf.TopVersusText:SetPoint(\"TOP\", f, \"TOP\", 0, -46)\n\n-- Pets #2 and #3\nlocal extraUnits = {\n\tf.Ally2,\n\tf.Ally3,\n\tf.Enemy2,\n\tf.Enemy3\n}\n\nfor _, unit in pairs(extraUnits) do\n\tunit.BorderAlive:SetAlpha(0)\n\tunit.HealthBarBG:SetAlpha(0)\n\tunit.HealthDivider:SetAlpha(0)\n\tunit:SetSize(40, 40)\n\tunit:CreateBackdrop(\"Default\")\n\tunit:ClearAllPoints()\n\n\tunit.healthBarWidth = 40\n\tunit.ActualHealthBar:ClearAllPoints()\n\tunit.ActualHealthBar:SetPoint(\"TOPLEFT\", unit.backdrop, \"BOTTOMLEFT\", 2, -3)\n\n\tunit.HealthBarBackdrop = CreateFrame(\"Frame\", nil, unit)\n\tunit.HealthBarBackdrop:SetFrameLevel(unit:GetFrameLevel() - 1)\n\tunit.HealthBarBackdrop:SetTemplate(\"Default\")\n\tunit.HealthBarBackdrop:SetWidth(unit.healthBarWidth + 4)\n\tunit.HealthBarBackdrop:SetPoint(\"TOPLEFT\", unit.ActualHealthBar, \"TOPLEFT\", -2, 2)\n\tunit.HealthBarBackdrop:SetPoint(\"BOTTOMLEFT\", unit.ActualHealthBar, \"BOTTOMLEFT\", -2, -1)\nend\n\nf.Ally2:SetPoint(\"TOPRIGHT\", f.Ally2.iconPoint, \"TOPLEFT\", -6, -2)\nf.Ally3:SetPoint(\"TOPRIGHT\", f.Ally2, \"TOPLEFT\", -8, 0)\nf.Enemy2:SetPoint(\"TOPLEFT\", f.Enemy2.iconPoint, \"TOPRIGHT\", 6, -2)\nf.Enemy3:SetPoint(\"TOPLEFT\", f.Enemy2, \"TOPRIGHT\", 8, 0)\n\n-- Weather\nhooksecurefunc(\"PetBattleWeatherFrame_Update\", function(self)\n\tlocal weather = C_PetBattles.GetAuraInfo(Enum.BattlePetOwner.Weather, PET_BATTLE_PAD_INDEX, 1)\n\tif weather then\n\t\tself.Icon:Hide()\n\t\tself.Name:Hide()\n\t\tself.DurationShadow:Hide()\n\t\tself.Label:Hide()\n\t\tself.Duration:SetPoint(\"CENTER\", self, 0, 8)\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(\"TOP\", UIParent, 0, -15)\n\t\tself:SetFrameStrata(\"MEDIUM\")\n\t\tif not self.ChildFrame then\n\t\t\tself.ChildFrame = CreateFrame(\"Frame\", nil, self)\n\t\t\tself.ChildFrame:SetAllPoints(self)\n\t\t\tself.ChildFrame:SetFrameStrata(\"LOW\")\n\t\tend\n\t\tself.BackgroundArt:SetParent(self.ChildFrame)\n\tend\nend)\n\nbf:StripTextures()\nbf.TurnTimer:StripTextures()\nbf.TurnTimer.SkipButton:SetParent(bar)\nbf.TurnTimer.SkipButton:SkinButton()\nbf.TurnTimer.SkipButton:SetWidth(bar:GetWidth())\nbf.TurnTimer.SkipButton:SetHeight(21)\nbf.TurnTimer.SkipButton:ClearAllPoints()\nbf.TurnTimer.SkipButton:SetPoint(\"BOTTOM\", bar, \"TOP\", 0, 3)\nbf.TurnTimer.SkipButton.ClearAllPoints = T.dummy\nbf.TurnTimer.SkipButton.SetPoint = T.dummy\n\nbf.xpBar:SetParent(bar)\nbf.xpBar:SetWidth(bar:GetWidth() - 4)\nbf.xpBar:StripTextures()\nbf.xpBar:CreateBackdrop(\"Overlay\")\nbf.xpBar:SetStatusBarTexture(C.media.texture)\nbf.xpBar:ClearAllPoints()\nbf.xpBar:SetPoint(\"BOTTOM\", bf.TurnTimer.SkipButton, \"TOP\", 0, 5)\n\nbf.TurnTimer:SetParent(bar)\nbf.TurnTimer:SetSize(bf.TurnTimer.SkipButton:GetWidth(), bf.TurnTimer.SkipButton:GetHeight())\nbf.TurnTimer:ClearAllPoints()\nbf.TurnTimer:SetPoint(\"BOTTOM\", bf.xpBar, \"TOP\", 0, 5)\nbf.TurnTimer.TimerText:SetPoint(\"CENTER\")\n\nbf.MicroButtonFrame:StripTextures()\nbf.MicroButtonFrame:Hide()\nbf.Delimiter:StripTextures()\nbf.FlowFrame:Kill()\n\n-- Pets selection skin\nfor i = 1, 3 do\n\tlocal unit = bf.PetSelectionFrame[\"Pet\"..i]\n\n\tunit.HealthBarBG:SetAlpha(0)\n\tunit.HealthDivider:SetAlpha(0)\n\tunit.ActualHealthBar:SetAlpha(0)\n\tunit.SelectedTexture:SetAlpha(0)\n\tunit.MouseoverHighlight:SetAlpha(0)\n\tunit.Framing:SetAlpha(0)\n\tunit.Icon:SetAlpha(0)\n\tunit.Name:SetAlpha(0)\n\tunit.DeadOverlay:SetAlpha(0)\n\tunit.Level:SetAlpha(0)\n\tunit.HealthText:SetAlpha(0)\nend\n\n-- Move default position of pets selection\nhooksecurefunc(\"PetBattlePetSelectionFrame_Show\", function()\n\tbf.PetSelectionFrame:ClearAllPoints()\n\tbf.PetSelectionFrame:SetPoint(\"BOTTOM\", bf.xpBar, \"TOP\", 0, 8)\nend)\n\n-- Function to skin pet action buttons\nlocal function SkinPetButton(self)\n\tself:SetNormalTexture(0)\n\n\tself:CreateBackdrop(\"Transparent\")\n\tself.backdrop:SetAllPoints()\n\tif C.actionbar.classcolor_border == true then\n\t\tself.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\tend\n\n\tself.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tself.Icon:SetPoint(\"TOPLEFT\", self, 2, -2)\n\tself.Icon:SetPoint(\"BOTTOMRIGHT\", self, -2, 2)\n\n\tself.checked = true\n\tself:StyleButton()\n\tself.SelectedHighlight:SetTexture(\"\")\n\n\tself.CooldownShadow:SetAllPoints()\n\tself.CooldownFlash:SetAllPoints()\n\n\tif C.actionbar.hotkey == true then\n\t\tself.HotKey:SetPoint(\"TOPRIGHT\", 0, 0)\n\t\tself.HotKey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\tself.HotKey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\tself.HotKey:SetWidth((C.actionbar.button_size * 1.5) - 1)\n\telse\n\t\tself.HotKey:Kill()\n\tend\nend\n\n-- Setup pet action bar\nhooksecurefunc(\"PetBattleFrame_UpdateActionBarLayout\", function()\n\tfor i = 1, NUM_BATTLE_PET_ABILITIES do\n\t\tlocal b = bf.abilityButtons[i]\n\n\t\tSkinPetButton(b)\n\t\tb:SetParent(bar)\n\t\tb:SetSize(C.actionbar.button_size * 1.5, C.actionbar.button_size * 1.5)\n\t\tb:ClearAllPoints()\n\t\tif i == 1 then\n\t\t\tb:SetPoint(\"BOTTOMLEFT\", 0, 0)\n\t\telse\n\t\t\tlocal previous = bf.abilityButtons[i-1]\n\t\t\tb:SetPoint(\"LEFT\", previous, \"RIGHT\", C.actionbar.button_space, 0)\n\t\tend\n\tend\n\n\tbf.SwitchPetButton:SetParent(bar)\n\tbf.SwitchPetButton:SetSize(C.actionbar.button_size * 1.5, C.actionbar.button_size * 1.5)\n\tbf.SwitchPetButton:ClearAllPoints()\n\tbf.SwitchPetButton:SetPoint(\"LEFT\", bf.abilityButtons[3], \"RIGHT\", C.actionbar.button_space, 0)\n\n\tbf.SwitchPetButton:SetScript(\"OnClick\", function()\n\t\tPetBattlePetSelectionFrame_Show(bf.PetSelectionFrame)\n\tend)\n\n\tbf.CatchButton:SetParent(bar)\n\tbf.CatchButton:SetSize(C.actionbar.button_size * 1.5, C.actionbar.button_size * 1.5)\n\tbf.CatchButton:ClearAllPoints()\n\tbf.CatchButton:SetPoint(\"LEFT\", bf.SwitchPetButton, \"RIGHT\", C.actionbar.button_space, 0)\n\n\tbf.ForfeitButton:SetParent(bar)\n\tbf.ForfeitButton:ClearAllPoints()\n\tbf.ForfeitButton:SetSize(C.actionbar.button_size * 1.5, C.actionbar.button_size * 1.5)\n\tbf.ForfeitButton:SetPoint(\"LEFT\", bf.CatchButton, \"RIGHT\", C.actionbar.button_space, 0)\n\n\tSkinPetButton(bf.SwitchPetButton)\n\tSkinPetButton(bf.CatchButton)\n\tSkinPetButton(bf.ForfeitButton)\nend)\n\n-- Tooltips skinning\nlocal tooltips = {BattlePetTooltip, PetBattlePrimaryAbilityTooltip, PetBattlePrimaryUnitTooltip, FloatingPetBattleAbilityTooltip, FloatingBattlePetTooltip}\n\nfor _, tt in pairs(tooltips) do\n\ttt:SetTemplate(\"Transparent\")\n\ttt.NineSlice:SetAlpha(0)\n\n\tif tt.CloseButton then\n\t\tT.SkinCloseButton(tt.CloseButton)\n\tend\n\n\tif tt.Delimiter1 then\n\t\ttt.Delimiter1:SetTexture(nil)\n\t\ttt.Delimiter2:SetTexture(nil)\n\telseif tt.Delimiter then\n\t\ttt.Delimiter:SetTexture(nil)\n\tend\nend\n\ntable.insert(UISpecialFrames, \"FloatingBattlePetTooltip\")\n\n-- Tooltip position\nhooksecurefunc(\"PetBattleAbilityButton_OnEnter\", function()\n\tPetBattleAbilityTooltip_Show(unpack(C.position.tooltip))\n\tPetBattlePrimaryAbilityTooltip:SetFrameLevel(5)\nend)\n\n----------------------------------------------------------------------------------------\n--\tColoring borders/names by pets quality(PetBattleQualityGlow by Tia Lynn)\n----------------------------------------------------------------------------------------\nhooksecurefunc(\"PetBattleUnitFrame_UpdateDisplay\", function(self)\n\tself.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t-- There must be a petOwner and a petIndex\n\tif not self.petOwner or not self.petIndex then return end\n\n\t-- Check if this is the Tooltip\n\tlocal isTooltip = false\n\tif self:GetName() == \"PetBattlePrimaryUnitTooltip\" then isTooltip = true end\n\n\t-- Set the color for the Glow\n\tlocal nQuality = C_PetBattles.GetBreedQuality(self.petOwner, self.petIndex) - 1\n\tlocal r, g, b, hex = GetItemQualityColor(nQuality)\n\tif nQuality >= 2 and not isTooltip and self.IconBackdrop then\n\t\tself.IconBackdrop:SetBackdropBorderColor(r, g, b)\n\telseif self.IconBackdrop then\n\t\tself.IconBackdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\tend\n\n\t-- Color the Name with the Quality color\n\tif self.Name then\n\t\tlocal sPetName = C_PetBattles.GetName(self.petOwner, self.petIndex)\n\t\tif sPetName then\n\t\t\tself.Name:SetText(\"|c\"..hex..sPetName..\"|r\")\n\t\tend\n\tend\n\n\t-- Color the non-active Health Bars with the Quality color\n\tif self.ActualHealthBar and not isTooltip then\n\t\tself.ActualHealthBar:SetVertexColor(r, g, b)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/TaintLess.xml",
    "content": "<Ui><Script><![CDATA[--[[\n\nTaintLess [22-11-27]\nhttps://www.townlong-yak.com/addons/taintless\n\nAll rights reserved.\n\nPermission is hereby granted to distribute unmodified copies of this file.\n]]\n\nlocal function purgeKey(t, k)\n\tlocal logLevel, c = GetCVar(\"taintLog\"), -42\n\tif (tonumber(logLevel) or 0) > 1 then\n\t\tif CVarCallbackRegistry then\n\t\t\tCVarCallbackRegistry:UnregisterEvent(\"CVAR_UPDATE\")\n\t\tend\n\t\tSetCVar(\"taintLog\", \"1\")\n\telse\n\t\tlogLevel = nil\n\tend\n\tt[k] = nil\n\trepeat\n\t\tif t[c] == nil then\n\t\t\tt[c] = nil\n\t\tend\n\t\tc = c - 1\n\tuntil issecurevariable(t, k)\n\tif logLevel then\n\t\tSetCVar(\"taintLog\", logLevel)\n\t\tif CVarCallbackRegistry then\n\t\t\tCVarCallbackRegistry:RegisterEvent(\"CVAR_UPDATE\")\n\t\tend\n\tend\nend\n\n-- https://www.townlong-yak.com/addons/taintless/fixes/RefreshOverread\nif (tonumber(UIDD_REFRESH_OVERREAD_PATCH_VERSION) or 0) < 3 then\n\tUIDD_REFRESH_OVERREAD_PATCH_VERSION = 3\n\thooksecurefunc(\"UIDropDownMenu_InitializeHelper\", function()\n\t\tfor i=1, UIDD_REFRESH_OVERREAD_PATCH_VERSION == 3 and UIDROPDOWNMENU_MAXLEVELS or 0 do\n\t\t\tfor j=1+_G[\"DropDownList\" .. i].numButtons, UIDROPDOWNMENU_MAXBUTTONS do\n\t\t\t\tlocal b, _ = _G[\"DropDownList\" .. i .. \"Button\" .. j]\n\t\t\t\t_ = issecurevariable(b, \"checked\")      or purgeKey(b, \"checked\")\n\t\t\t\t_ = issecurevariable(b, \"notCheckable\") or purgeKey(b, \"notCheckable\")\n\t\t\tend\n\t\tend\n\tend)\nend\n\n-- https://www.townlong-yak.com/addons/taintless/fixes/DisplayModeTaint\nif (tonumber(UIDROPDOWNMENU_OPEN_PATCH_VERSION) or 0) < 1 then\n\tUIDROPDOWNMENU_OPEN_PATCH_VERSION = 1\n\thooksecurefunc(\"UIDropDownMenu_InitializeHelper\", function(frame)\n\t\tif UIDROPDOWNMENU_OPEN_PATCH_VERSION == 1\n\t\t   and UIDROPDOWNMENU_OPEN_MENU and UIDROPDOWNMENU_OPEN_MENU ~= frame\n\t\t   and not issecurevariable(UIDROPDOWNMENU_OPEN_MENU, \"displayMode\") then\n\t\t\tpurgeKey(_G, \"UIDROPDOWNMENU_OPEN_MENU\")\n\t\tend\n\tend)\nend\n\n-- https://www.townlong-yak.com/addons/taintless/fixes/IOFrameSelection\nif (tonumber(IOFRAME_SELECTION_PATCH_VERSION) or 0) < 3 then\n\tIOFRAME_SELECTION_PATCH_VERSION = 3\n\tif InterfaceOptionsFrame then\n\t\tInterfaceOptionsFrame:HookScript(\"OnHide\", function()\n\t\t\tif IOFRAME_SELECTION_PATCH_VERSION == 3 then\n\t\t\t\tInterfaceOptionsFrameCategories.selection = nil\n\t\t\tend\n\t\tend)\n\tend\nend\n\n-- https://www.townlong-yak.com/addons/taintless/fixes/EditModeOpenDrop\nif EditModeManagerFrame and FriendsFrameStatusDropDown and (tonumber(EDITMAN_OPENDROP_PATCH_VERSION) or 0) < 1 then\n\tEDITMAN_OPENDROP_PATCH_VERSION = 1\n\thooksecurefunc(EditModeManagerFrame, \"GetAttribute\", function(_, attr)\n\t\tif attr ~= \"UIPanelLayout-checkFit\" or EDITMAN_OPENDROP_PATCH_VERSION ~= 1\n\t\t   or (issecurevariable(DropDownList1, \"maxWidth\") and issecurevariable(\"UIDROPDOWNMENU_MENU_LEVEL\")) then\n\t\telseif InCombatLockdown() and FriendsFrameStatusDropDown:IsProtected() then\n\t\telseif FriendsFrameStatusDropDown:IsVisible() then\n\t\t\tFriendsFrameStatusDropDown:Hide()\n\t\t\tFriendsFrameStatusDropDown:Show()\n\t\telse\n\t\t\tlocal op = FriendsFrameStatusDropDown:GetParent()\n\t\t\tFriendsFrameStatusDropDown:SetParent(nil)\n\t\t\tif not FriendsFrameStatusDropDown:IsShown() then\n\t\t\t\tFriendsFrameStatusDropDown:Show()\n\t\t\t\tFriendsFrameStatusDropDown:Hide()\n\t\t\tend\n\t\t\tFriendsFrameStatusDropDown:SetParent(op)\n\t\tend\n\tend)\nend\n\n-- https://www.townlong-yak.com/addons/taintless/fixes/ObjectiveTrackerUpdate\nif ObjectiveTrackerFrame and (tonumber(OBJTRACK_DELAYUPDATE_PATCH_VERSION) or 0) < 1 then\n\tOBJTRACK_DELAYUPDATE_PATCH_VERSION = 1\n\tlocal counter, didDelayUpdate, delayFrameCount = (CreateFrame(\"Frame\", nil, ObjectiveTrackerFrame))\n\tcounter:Hide()\n\tcounter:SetScript(\"OnUpdate\", function()\n\t\tif OBJTRACK_DELAYUPDATE_PATCH_VERSION == 1 then\n\t\t\tdelayFrameCount = delayFrameCount + 1\n\t\telse\n\t\t\tcounter:Hide()\n\t\tend\n\tend)\n\thooksecurefunc(\"ObjectiveTracker_Update\", function()\n\t\tif OBJTRACK_DELAYUPDATE_PATCH_VERSION == 1 and didDelayUpdate then\n\t\t\tdidDelayUpdate = nil\n\t\t\tpurgeKey(ObjectiveTrackerFrame, \"isUpdating\")\n\t\tend\n\tend)\n\thooksecurefunc(ObjectiveTrackerFrame.HeaderMenu.Title, \"ClearAllPoints\", function()\n\t\tif OBJTRACK_DELAYUPDATE_PATCH_VERSION == 1 and not ObjectiveTrackerFrame.isUpdating then\n\t\t\tif issecurevariable(ObjectiveTrackerFrame, \"isOnLeftSideOfScreen\") then\n\t\t\t\tif delayFrameCount then\n\t\t\t\t\tdelayFrameCount = nil\n\t\t\t\t\tcounter:Hide()\n\t\t\t\tend\n\t\t\telseif (delayFrameCount or 0) < 4 then\n\t\t\t\tObjectiveTrackerFrame.isUpdating, didDelayUpdate, delayFrameCount = 86, 1, delayFrameCount or 0\n\t\t\t\tcounter:Show()\n\t\t\telse\n\t\t\t\tcounter:Hide()\n\t\t\tend\n\t\tend\n\tend)\nend\n]]></Script></Ui>"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/TalkingHead.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n------------------------------------------------------------------------------------------\n--\tSet custom position for TalkingHeadFrame\n------------------------------------------------------------------------------------------\nlocal Load = CreateFrame(\"Frame\")\nLoad:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nLoad:SetScript(\"OnEvent\", function()\n\tTalkingHeadFrame.ignoreFramePositionManager = true\n\tTalkingHeadFrame:ClearAllPoints()\n\tTalkingHeadFrame:SetPoint(unpack(C.position.talking_head))\n\tLoad:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\nend)\n\nhooksecurefunc(TalkingHeadFrame, \"SetPoint\", function(self, _, _, _, x)\n\tif x ~= C.position.talking_head[4] then\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(unpack(C.position.talking_head))\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tHide TalkingHeadFrame\n----------------------------------------------------------------------------------------\nif C.general.hide_talking_head == true then\n\thooksecurefunc(TalkingHeadFrame, \"PlayCurrent\", function()\n\t\tTalkingHeadFrame:Hide()\n\tend)\nend"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/TimerTracker.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tSkin TimerTracker(by Tukz)\n----------------------------------------------------------------------------------------\nlocal function SkinIt(bar)\n\tfor i = 1, bar:GetNumRegions() do\n\t\tlocal region = select(i, bar:GetRegions())\n\t\tif region:GetObjectType() == \"Texture\" then\n\t\t\tregion:SetTexture(nil)\n\t\telseif region:GetObjectType() == \"FontString\" then\n\t\t\tregion:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\t\tregion:SetShadowOffset(0, 0)\n\t\tend\n\tend\n\n\tbar:CreateBackdrop(\"Default\")\n\tbar:SetStatusBarTexture(C.media.texture)\n\tbar:SetStatusBarColor(0.7, 0, 0)\n\n\tbar.bg = bar:CreateTexture(nil, \"BACKGROUND\")\n\tbar.bg:SetAllPoints(bar)\n\tbar.bg:SetTexture(C.media.texture)\n\tbar.bg:SetVertexColor(0.7, 0, 0, 0.3)\nend\n\nlocal function SkinBlizzTimer()\n\tfor _, b in pairs(TimerTracker.timerList) do\n\t\tif b[\"bar\"] and not b[\"bar\"].skinned then\n\t\t\tSkinIt(b[\"bar\"])\n\t\t\tb[\"bar\"].skinned = true\n\t\tend\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"START_TIMER\")\nframe:SetScript(\"OnEvent\", SkinBlizzTimer)"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/UIWidget.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tUIWidget position\n----------------------------------------------------------------------------------------\nlocal top, below, power, maw = _G[\"UIWidgetTopCenterContainerFrame\"], _G[\"UIWidgetBelowMinimapContainerFrame\"], _G[\"UIWidgetPowerBarContainerFrame\"], _G[\"MawBuffsBelowMinimapFrame\"]\n\n-- Top Widget\nlocal topAnchor = CreateFrame(\"Frame\", \"UIWidgetTopAnchor\", UIParent)\ntopAnchor:SetSize(200, 30)\ntopAnchor:SetPoint(unpack(C.position.uiwidget_top))\n\ntop:ClearAllPoints()\ntop:SetPoint(\"TOP\", topAnchor)\n\n-- Below Widget\nlocal belowAnchor = CreateFrame(\"Frame\", \"UIWidgetBelowAnchor\", UIParent)\nbelowAnchor:SetSize(150, 30)\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function(self, event)\n\tif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tif not belowAnchor:IsUserPlaced() then\n\t\t\tbelowAnchor:ClearAllPoints()\n\t\t\tbelowAnchor:SetPoint(unpack(C.position.uiwidget_below))\n\t\tend\n\t\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tend\nend)\n\nhooksecurefunc(below, \"SetPoint\", function(self, _, anchor)\n\tif anchor and anchor ~= belowAnchor then\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(\"TOP\", belowAnchor)\n\tend\nend)\n\n-- Power Bar Widget\nlocal powerAnchor = CreateFrame(\"Frame\", \"UIWidgetPowerBarAnchor\", UIParent)\npowerAnchor:SetSize(210, 30)\npowerAnchor:SetPoint(unpack(C.position.uiwidget_below))\n\nhooksecurefunc(power, \"SetPoint\", function(self, _, anchor)\n\tif anchor and anchor ~= powerAnchor then\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(\"TOP\", powerAnchor)\n\tend\nend)\n\n-- Maw Buff Widget\nlocal mawAnchor = CreateFrame(\"Frame\", \"UIWidgetMawAnchor\", UIParent)\nmawAnchor:SetSize(210, 30)\nmawAnchor:SetPoint(\"TOPRIGHT\", BuffsAnchor, \"BOTTOMRIGHT\", 0, -3)\n\nhooksecurefunc(maw, \"SetPoint\", function(self, _, anchor)\n\tif anchor and anchor ~= mawAnchor then\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(\"TOPRIGHT\", mawAnchor)\n\tend\nend)\n\n-- Mover for all widgets\nfor _, frame in pairs({top, below, maw}) do\n\tlocal anchor = frame == top and topAnchor or frame == below and belowAnchor or mawAnchor\n\tanchor:SetMovable(true)\n\tanchor:SetClampedToScreen(true)\n\tframe:SetClampedToScreen(true)\n\tframe:SetScript(\"OnMouseDown\", function(_, button)\n\t\tif IsAltKeyDown() or IsShiftKeyDown() then\n\t\t\tanchor:ClearAllPoints()\n\t\t\tanchor:StartMoving()\n\t\telseif IsControlKeyDown() and button == \"RightButton\" then\n\t\t\tanchor:ClearAllPoints()\n\t\t\tif frame == top then\n\t\t\t\tanchor:SetPoint(unpack(C.position.uiwidget_top))\n\t\t\telseif frame == below then\n\t\t\t\tanchor:SetPoint(unpack(C.position.uiwidget_below))\n\t\t\telse\n\t\t\t\tanchor:SetPoint(\"TOPRIGHT\", BuffsAnchor, \"BOTTOMRIGHT\", 0, -3)\n\t\t\tend\n\t\t\tanchor:SetUserPlaced(false)\n\t\tend\n\tend)\n\tframe:SetScript(\"OnMouseUp\", function()\n\t\tanchor:StopMovingOrSizing()\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tUIWidget skin\n----------------------------------------------------------------------------------------\nlocal atlasColors = {\n\t[\"UI-Frame-Bar-Fill-Blue\"] = {0.2, 0.6, 1},\n\t[\"UI-Frame-Bar-Fill-Red\"] = {0.9, 0.2, 0.2},\n\t[\"UI-Frame-Bar-Fill-Yellow\"] = {1, 0.6, 0},\n\t[\"objectivewidget-bar-fill-left\"] = {0.2, 0.6, 1},\n\t[\"objectivewidget-bar-fill-right\"] = {0.9, 0.2, 0.2}\n}\n\nlocal function SkinStatusBar(widget)\n\tlocal bar = widget.Bar\n\n\tif widget:IsForbidden() then\n\t\tif bar and bar.tooltip then\n\t\t\tbar.tooltip = nil\n\t\tend\n\t\treturn\n\tend\n\n\tlocal atlas = bar:GetStatusBarTexture()\n\tif atlasColors[atlas] then\n\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\tbar:SetStatusBarColor(unpack(atlasColors[atlas]))\n\tend\n\n\tif widget:GetParent() == power then\n\t\t-- Don't skin Cosmic Energy bar\n\t\tif widget.widgetID == 3463 then\n\t\t\tbar.styled = true\n\t\tend\n\tend\n\n\tif not bar.styled then\n\t\tbar.BGLeft:SetAlpha(0)\n\t\tbar.BGRight:SetAlpha(0)\n\t\tbar.BGCenter:SetAlpha(0)\n\t\tbar.BorderLeft:SetAlpha(0)\n\t\tbar.BorderRight:SetAlpha(0)\n\t\tbar.BorderCenter:SetAlpha(0)\n\t\tbar.Spark:SetAlpha(0)\n\t\tlocal parent = widget:GetParent():GetParent()\n\t\tif parent.castBar or parent.UnitFrame then -- nameplate\n\t\t\tMixin(bar, BackdropTemplateMixin)\n\t\t\tbar:SetBackdrop({\n\t\t\t\tbgFile = C.media.blank,\n\t\t\t\tinsets = {left = 0, right = 0, top = 0, bottom = 0}\n\t\t\t})\n\t\t\tbar:SetBackdropColor(0.1, 0.1, 0.1, 1)\n\t\telse\n\t\t\tbar:CreateBackdrop(\"Overlay\")\n\t\tend\n\t\tbar.styled = true\n\tend\nend\n\nlocal function SkinDoubleStatusBar(widget)\n\tfor _, bar in pairs({widget.LeftBar, widget.RightBar}) do\n\t\tlocal atlas = bar:GetStatusBarTexture()\n\t\tif atlasColors[atlas] then\n\t\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\t\tbar:SetStatusBarColor(unpack(atlasColors[atlas]))\n\t\tend\n\t\tif not bar.styled then\n\t\t\tbar.BG:SetAlpha(0)\n\t\t\tbar.BorderLeft:SetAlpha(0)\n\t\t\tbar.BorderRight:SetAlpha(0)\n\t\t\tbar.BorderCenter:SetAlpha(0)\n\t\t\tbar.Spark:SetAlpha(0)\n\t\t\tbar.SparkGlow:SetAlpha(0)\n\t\t\tbar:CreateBackdrop(\"Overlay\")\n\t\t\tbar.styled = true\n\t\tend\n\tend\nend\n\nlocal function SkinCaptureBar(widget)\n\twidget.LeftLine:SetAlpha(0)\n\twidget.RightLine:SetAlpha(0)\n\twidget.BarBackground:SetAlpha(0)\n\twidget.Glow1:SetAlpha(0)\n\twidget.Glow2:SetAlpha(0)\n\twidget.Glow3:SetAlpha(0)\n\n\twidget.LeftBar:SetTexture(C.media.texture)\n\twidget.NeutralBar:SetTexture(C.media.texture)\n\twidget.RightBar:SetTexture(C.media.texture)\n\n\twidget.LeftBar:SetVertexColor(0.2, 0.6, 1)\n\twidget.NeutralBar:SetVertexColor(0.8, 0.8, 0.8)\n\twidget.RightBar:SetVertexColor(0.9, 0.2, 0.2)\n\n\tif not widget.backdrop then\n\t\twidget:CreateBackdrop(\"Default\")\n\t\twidget.backdrop:SetPoint(\"TOPLEFT\", widget.LeftBar, -2, 2)\n\t\twidget.backdrop:SetPoint(\"BOTTOMRIGHT\", widget.RightBar, 2, -2)\n\tend\nend\n\nlocal VigorBar = CreateFrame(\"Frame\", \"VigorBar\", UIParent)\nVigorBar:CreateBackdrop(\"Default\")\nVigorBar:SetPoint(\"TOP\", powerAnchor, \"TOP\", 0, -2)\nVigorBar:SetSize(250, 12)\nVigorBar:Hide()\n\nfor i = 1, 6 do\n\tVigorBar[i] = CreateFrame(\"StatusBar\", \"Vigor\"..i, VigorBar)\n\tVigorBar[i]:SetSize((250 - 5) / 6, 12)\n\n\tif i == 1 then\n\t\tVigorBar[i]:SetPoint(\"TOPLEFT\", VigorBar, \"TOPLEFT\", 0, 0)\n\telse\n\t\tVigorBar[i]:SetPoint(\"TOPLEFT\", VigorBar[i-1], \"TOPRIGHT\", 1, 0)\n\tend\n\tVigorBar[i]:SetStatusBarTexture(C.media.texture)\n\tVigorBar[i]:SetMinMaxValues(0, 100)\n\tVigorBar[i]:SetStatusBarColor(0.2, 0.58, 0.8)\n\n\tVigorBar[i].bg = VigorBar[i]:CreateTexture(nil, \"BORDER\")\n\tVigorBar[i].bg:SetAllPoints()\n\tVigorBar[i].bg:SetTexture(C.media.texture)\n\tVigorBar[i].bg:SetVertexColor(0.2, 0.58, 0.8, 0.2)\n\n\tVigorBar[i]:SetValue(0)\nend\n\nlocal function SkinVigorBar(widget)\n\tlocal widgetInfo = C_UIWidgetManager.GetFillUpFramesWidgetVisualizationInfo(4460)\n\tif not widgetInfo then return end\n\tVigorBar:Show()\n\tlocal total = widgetInfo.numTotalFrames\n\tfor i = 1, total do\n\t\tlocal value = 0\n\n\t\tif widgetInfo.numFullFrames >= i then\n\t\t\tvalue = widgetInfo.fillMax\n\t\telseif widgetInfo.numFullFrames + 1 == i then\n\t\t\tvalue = widgetInfo.fillValue\n\t\telse\n\t\t\tvalue = widgetInfo.fillMin\n\t\tend\n\t\tVigorBar[i]:SetValue(value)\n\tend\n\n\tif total < 6 and IsPlayerSpell(377922) then total = 6 end -- sometimes it return 5\n\n\tif total < 6 then\n\t\tfor i = total + 1, 6 do\n\t\t\tVigorBar[i]:Hide()\n\t\t\tVigorBar[i]:SetValue(0)\n\t\tend\n\n\t\tlocal spacing = select(4, VigorBar[6]:GetPoint())\n\t\tlocal w = VigorBar:GetWidth()\n\t\tlocal s = 0\n\n\t\tfor i = 1, total do\n\t\t\tVigorBar[i]:Show()\n\t\t\tif i ~= total then\n\t\t\t\tVigorBar[i]:SetWidth(w / total - spacing)\n\t\t\t\ts = s + (w / total)\n\t\t\telse\n\t\t\t\tVigorBar[i]:SetWidth(w - s)\n\t\t\tend\n\t\tend\n\tend\n\n\twidget:SetAlpha(0)\n\n\tif not widget.hook then\n\t\thooksecurefunc(widget, \"Hide\", function(self)\n\t\t\tVigorBar:Hide()\n\t\tend)\n\t\twidget.hook = true\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"UPDATE_UI_WIDGET\")\nframe:RegisterEvent(\"UPDATE_ALL_UI_WIDGETS\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function()\n\tfor _, widget in pairs(UIWidgetTopCenterContainerFrame.widgetFrames) do\n\t\tif widget.widgetType == _G.Enum.UIWidgetVisualizationType.StatusBar then\n\t\t\tSkinStatusBar(widget)\n\t\telseif widget.widgetType == _G.Enum.UIWidgetVisualizationType.DoubleStatusBar then\n\t\t\tSkinDoubleStatusBar(widget)\n\t\tend\n\tend\n\n\tfor _, widget in pairs(UIWidgetBelowMinimapContainerFrame.widgetFrames) do\n\t\tif widget.widgetType == Enum.UIWidgetVisualizationType.CaptureBar then\n\t\t\tSkinCaptureBar(widget)\n\t\tend\n\tend\n\n\tfor _, widget in pairs(UIWidgetPowerBarContainerFrame.widgetFrames) do\n\t\tif widget.widgetID == 4460 then\n\t\t\tSkinVigorBar(widget)\n\t\tend\n\tend\nend)\n\nhooksecurefunc(UIWidgetTemplateScenarioHeaderCurrenciesAndBackgroundMixin, \"Setup\", function(widgetInfo)\n\twidgetInfo.Frame:SetAlpha(0)\n\tfor frame in widgetInfo.currencyPool:EnumerateActive() do\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\nend)\n\nhooksecurefunc(UIWidgetTemplateStatusBarMixin, \"Setup\", function(widget)\n\tSkinStatusBar(widget)\nend)\n\n-- Maw Buffs skin\nmaw:SetSize(210, 40)\nmaw.Container:SkinButton()\nmaw.Container:SetSize(200, 30)\n\nmaw.Container.List:StripTextures()\nmaw.Container.List:SetTemplate(\"Overlay\")\nmaw.Container.List:ClearAllPoints()\nmaw.Container.List:SetPoint(\"TOPRIGHT\", maw.Container, \"TOPLEFT\", -15, 0)\n\nmaw.Container.List:HookScript(\"OnShow\", function(self)\n\tself.button:SetPushedTexture(0)\n\tself.button:SetHighlightTexture(0)\n\tself.button:SetWidth(200)\n\tself.button:SetButtonState(\"NORMAL\")\n\tself.button:SetPushedTextOffset(0, 0)\n\tself.button:SetButtonState(\"PUSHED\", true)\nend)\n\nmaw.Container.List:HookScript(\"OnHide\", function(self)\n\tself.button:SetPushedTexture(0)\n\tself.button:SetHighlightTexture(0)\n\tself.button:SetWidth(200)\nend)\n\n-- Hide Maw Buffs\nif C.general.hide_maw_buffs then\n\tmaw:SetAlpha(0)\n\tmaw:SetScale(0.001)\nend"
  },
  {
    "path": "ShestakUI/Modules/Blizzard/Vehicle.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tMove vehicle indicator\n----------------------------------------------------------------------------------------\nlocal VehicleAnchor = CreateFrame(\"Frame\", \"VehicleAnchor\", UIParent)\nVehicleAnchor:SetPoint(unpack(C.position.vehicle))\nVehicleAnchor:SetSize(130, 130)\n\nhooksecurefunc(VehicleSeatIndicator, \"SetPoint\", function(_, _, parent)\n\tif parent == \"MinimapCluster\" or parent == _G[\"MinimapCluster\"] then\n\t\tVehicleSeatIndicator:ClearAllPoints()\n\t\tVehicleSeatIndicator:SetPoint(\"BOTTOM\", VehicleAnchor, \"BOTTOM\", 0, 24)\n\t\tVehicleSeatIndicator:SetFrameStrata(\"LOW\")\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tVehicle indicator on mouseover\n----------------------------------------------------------------------------------------\nif C.general.vehicle_mouseover == true then\n\tlocal function VehicleSeatMouseover(vehicleID)\n\t\tif VehicleSeatIndicator:IsShown() then\n\t\t\tVehicleSeatIndicator:SetAlpha(0)\n\t\t\tVehicleSeatIndicator:HookScript(\"OnEnter\", function() VehicleSeatIndicator:SetAlpha(1) end)\n\t\t\tVehicleSeatIndicator:HookScript(\"OnLeave\", function() VehicleSeatIndicator:SetAlpha(0) end)\n\n\t\t\tlocal _, numSeat = GetVehicleUIIndicator(vehicleID)\n\t\t\tfor i = 1, numSeat do\n\t\t\t\tlocal b = _G[\"VehicleSeatIndicatorButton\"..i]\n\t\t\t\tb:HookScript(\"OnEnter\", function() VehicleSeatIndicator:SetAlpha(1) end)\n\t\t\t\tb:HookScript(\"OnLeave\", function() VehicleSeatIndicator:SetAlpha(0) end)\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(\"VehicleSeatIndicator_SetUpVehicle\", VehicleSeatMouseover)\nend"
  },
  {
    "path": "ShestakUI/Modules/Chat/ChatBars.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true or C.chat.chat_bar ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tChatBar(FavChatBar by Favorit)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\", \"ChatBar\", UIParent)\nframe:CreatePanel(\"Invisible\", 16, C.chat.background and C.chat.height + 4 or C.chat.height - 1, \"BOTTOMLEFT\", UIParent, \"BOTTOMLEFT\", 2, C.chat.background and 24 or 20)\nif C.chat.chat_bar_mouseover == true then\n\tframe:SetAlpha(0)\n\tframe:SetScript(\"OnEnter\", function()\n\t\tframe:FadeIn()\n\tend)\n\tframe:SetScript(\"OnLeave\", function()\n\t\tframe:FadeOut()\n\tend)\nend\n\nlocal function CreateButton(b, l, r, m)\n\tb:SetWidth(16)\n\tb:SetHeight(16)\n\tb:SetTemplate(\"Default\")\n\n\tb:RegisterForClicks(\"AnyUp\")\n\tb:SetScript(\"OnClick\", function(_, b)\n\t\tif b == \"LeftButton\" then\n\t\t\tChatFrame_OpenChat(l, SELECTED_DOCK_FRAME)\n\t\telseif b == \"RightButton\" then\n\t\t\tChatFrame_OpenChat(r, SELECTED_DOCK_FRAME)\n\t\telseif m and b == \"MiddleButton\" then\n\t\t\tChatFrame_OpenChat(m, SELECTED_DOCK_FRAME)\n\t\tend\n\tend)\n\n\tif C.chat.chat_bar_mouseover == true then\n\t\tb:SetScript(\"OnEnter\", function()\n\t\t\tframe:FadeIn()\n\t\tend)\n\t\tb:SetScript(\"OnLeave\", function()\n\t\t\tframe:FadeOut()\n\t\tend)\n\tend\n\n\tb.t = b:CreateTexture(nil, \"ARTWORK\")\n\tb.t:SetTexture(C.media.blank)\n\tb.t:SetPoint(\"TOPLEFT\", b, \"TOPLEFT\", 2, -2)\n\tb.t:SetPoint(\"BOTTOMRIGHT\", b, \"BOTTOMRIGHT\", -2, 2)\nend\n\nlocal b1 = CreateFrame(\"Button\", \"$parentButton1\", frame)\nCreateButton(b1, \"/s\", \"/w \", \"/y\")\nb1:SetPoint(\"TOP\", frame, \"TOP\", 0, 0)\nb1:SetBackdropBorderColor(0.7, 0.33, 0.82, 1)\nb1.t:SetVertexColor(0.8, 0.8, 0.8, 1)\n\nlocal b2 = CreateFrame(\"Button\", \"$parentButton2\", frame)\nCreateButton(b2, \"/g\", \"/o\")\nb2:SetPoint(\"TOP\", b1, \"BOTTOM\", 0, C.chat.background and -4 or -3)\nb2:SetBackdropBorderColor(0, 0.54, 0, 1)\nb2.t:SetVertexColor(0, 0.8, 0, 1)\n\nlocal b3 = CreateFrame(\"Button\", \"$parentButton3\", frame)\nCreateButton(b3, \"/p\", \"/i\")\nb3:SetPoint(\"TOP\", b2, \"BOTTOM\", 0, C.chat.background and -4 or -3)\nb3:SetBackdropBorderColor(0.8, 0.4, 0.1, 1)\nb3.t:SetVertexColor(0.11, 0.5, 0.7, 1)\n\nlocal b4 = CreateFrame(\"Button\", \"$parentButton4\", frame)\nCreateButton(b4, \"/ra\", \"/rw\")\nb4:SetPoint(\"TOP\", b3, \"BOTTOM\", 0, C.chat.background and -4 or -3)\nb4:SetBackdropBorderColor(0.96, 0.2, 0.2, 1)\nb4.t:SetVertexColor(1, 0.3, 0, 1)\n\nlocal b5 = CreateFrame(\"Button\", \"$parentButton5\", frame)\nCreateButton(b5, \"/1\", \"/2\")\nb5:SetPoint(\"TOP\", b4, \"BOTTOM\", 0, C.chat.background and -4 or -3)\nb5:SetBackdropBorderColor(0.7, 0.7, 0, 1)\nb5.t:SetVertexColor(0.93, 0.8, 0.8, 1)\n\nlocal b6 = CreateFrame(\"Button\", \"$parentButton6\", frame)\nCreateButton(b6, \"/3\", \"/4\")\nb6:SetPoint(\"TOP\", b5, \"BOTTOM\", 0, C.chat.background and -4 or -3)\nb6:SetBackdropBorderColor(0.5, 1, 0.83, 1)\nb6.t:SetVertexColor(1, 0.75, 0.75, 1)"
  },
  {
    "path": "ShestakUI/Modules/Chat/ChatBind.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tBinding keys for chat channels\n----------------------------------------------------------------------------------------\nBINDING_HEADER_CHATKEY = CHAT_CHANNELS\nBINDING_NAME_GUILD_MESSAGE = GUILD\nBINDING_NAME_PARTY_MESSAGE = PARTY\nBINDING_NAME_RAID_MESSAGE = RAID\nBINDING_NAME_RW_MESSAGE = RAID_WARNING\nBINDING_NAME_IC_MESSAGE = INSTANCE_CHAT\nBINDING_NAME_SAY_MESSAGE = SAY\nBINDING_NAME_TARGET_MESSAGE = TARGET\n\nfunction ChatKey_Chat(arg)\n\tChatFrame_OpenChat(arg)\nend"
  },
  {
    "path": "ShestakUI/Modules/Chat/ChatFrames.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tStyle chat frame(by Tukz and p3lim)\n----------------------------------------------------------------------------------------\nlocal origs = {}\n\nlocal function Strip(info, name)\n\treturn string.format(\"|Hplayer:%s|h[%s]|h\", info, name:gsub(\"%-[^|]+\", \"\"))\nend\n\n-- Function to rename channel and other stuff\nlocal AddMessage = function(self, text, ...)\n\tif type(text) == \"string\" then\n\t\ttext = text:gsub(\"|h%[(%d+)%. .-%]|h\", \"|h[%1]|h\")\n\t\ttext = text:gsub(\"|Hplayer:(.-)|h%[(.-)%]|h\", Strip)\n\tend\n\treturn origs[self](self, text, ...)\nend\n\n-- Global strings\n_G.CHAT_INSTANCE_CHAT_GET = \"|Hchannel:INSTANCE_CHAT|h[\"..L_CHAT_INSTANCE_CHAT..\"]|h %s:\\32\"\n_G.CHAT_INSTANCE_CHAT_LEADER_GET = \"|Hchannel:INSTANCE_CHAT|h[\"..L_CHAT_INSTANCE_CHAT_LEADER..\"]|h %s:\\32\"\n_G.CHAT_BN_WHISPER_GET = L_CHAT_BN_WHISPER..\" %s:\\32\"\n_G.CHAT_GUILD_GET = \"|Hchannel:GUILD|h[\"..L_CHAT_GUILD..\"]|h %s:\\32\"\n_G.CHAT_OFFICER_GET = \"|Hchannel:OFFICER|h[\"..L_CHAT_OFFICER..\"]|h %s:\\32\"\n_G.CHAT_PARTY_GET = \"|Hchannel:PARTY|h[\"..L_CHAT_PARTY..\"]|h %s:\\32\"\n_G.CHAT_PARTY_LEADER_GET = \"|Hchannel:PARTY|h[\"..L_CHAT_PARTY_LEADER..\"]|h %s:\\32\"\n_G.CHAT_PARTY_GUIDE_GET = CHAT_PARTY_LEADER_GET\n_G.CHAT_RAID_GET = \"|Hchannel:RAID|h[\"..L_CHAT_RAID..\"]|h %s:\\32\"\n_G.CHAT_RAID_LEADER_GET = \"|Hchannel:RAID|h[\"..L_CHAT_RAID_LEADER..\"]|h %s:\\32\"\n_G.CHAT_RAID_WARNING_GET = \"[\"..L_CHAT_RAID_WARNING..\"] %s:\\32\"\n_G.CHAT_PET_BATTLE_COMBAT_LOG_GET = \"|Hchannel:PET_BATTLE_COMBAT_LOG|h[\"..L_CHAT_PET_BATTLE..\"]|h:\\32\"\n_G.CHAT_PET_BATTLE_INFO_GET = \"|Hchannel:PET_BATTLE_INFO|h[\"..L_CHAT_PET_BATTLE..\"]|h:\\32\"\n_G.CHAT_SAY_GET = \"%s:\\32\"\n_G.CHAT_WHISPER_GET = L_CHAT_WHISPER..\" %s:\\32\"\n_G.CHAT_YELL_GET = \"%s:\\32\"\n_G.CHAT_FLAG_AFK = \"|cffE7E716\"..L_CHAT_AFK..\"|r \"\n_G.CHAT_FLAG_DND = \"|cffFF0000\"..L_CHAT_DND..\"|r \"\n_G.CHAT_FLAG_GM = \"|cff4154F5\"..L_CHAT_GM..\"|r \"\n_G.ERR_FRIEND_ONLINE_SS = \"|Hplayer:%s|h[%s]|h \"..L_CHAT_COME_ONLINE\n_G.ERR_FRIEND_OFFLINE_S = \"[%s] \"..L_CHAT_GONE_OFFLINE\n\n-- Hide chat bubble menu button\nChatFrameMenuButton:Kill()\n\n-- Kill channel and voice buttons\nChatFrameChannelButton:Kill()\nChatFrameToggleVoiceDeafenButton:Kill()\nChatFrameToggleVoiceMuteButton:Kill()\n\n-- Set chat style\nlocal function SetChatStyle(frame)\n\tlocal id = frame:GetID()\n\tlocal chat = frame:GetName()\n\n\t_G[chat]:SetFrameLevel(5)\n\n\t-- Removes crap from the bottom of the chatbox so it can go to the bottom of the screen\n\t_G[chat]:SetClampedToScreen(false)\n\n\t-- Stop the chat chat from fading out\n\t_G[chat]:SetFading(false)\n\n\t-- Move the chat edit box\n\t_G[chat..\"EditBox\"]:ClearAllPoints()\n\t_G[chat..\"EditBox\"]:SetPoint(\"BOTTOMLEFT\", ChatFrame1, \"TOPLEFT\", -10, 23)\n\t_G[chat..\"EditBox\"]:SetPoint(\"BOTTOMRIGHT\", ChatFrame1, \"TOPRIGHT\", 11, 23)\n\n\t-- Hide textures\n\tfor j = 1, #CHAT_FRAME_TEXTURES do\n\t\t_G[chat..CHAT_FRAME_TEXTURES[j]]:SetTexture(nil)\n\tend\n\n\t-- Removes Default ChatFrame Tabs texture\n\t_G[format(\"ChatFrame%sTab\", id)].Left:Kill()\n\t_G[format(\"ChatFrame%sTab\", id)].Middle:Kill()\n\t_G[format(\"ChatFrame%sTab\", id)].Right:Kill()\n\n\t_G[format(\"ChatFrame%sTab\", id)].ActiveLeft:Kill()\n\t_G[format(\"ChatFrame%sTab\", id)].ActiveMiddle:Kill()\n\t_G[format(\"ChatFrame%sTab\", id)].ActiveRight:Kill()\n\n\t_G[format(\"ChatFrame%sTab\", id)].HighlightLeft:Kill()\n\t_G[format(\"ChatFrame%sTab\", id)].HighlightMiddle:Kill()\n\t_G[format(\"ChatFrame%sTab\", id)].HighlightRight:Kill()\n\n\t-- Killing off the new chat tab selected feature\n\t_G[format(\"ChatFrame%sButtonFrameMinimizeButton\", id)]:Kill()\n\t_G[format(\"ChatFrame%sButtonFrame\", id)]:Kill()\n\n\t-- Kills off the retarded new circle around the editbox\n\t_G[format(\"ChatFrame%sEditBoxLeft\", id)]:Kill()\n\t_G[format(\"ChatFrame%sEditBoxMid\", id)]:Kill()\n\t_G[format(\"ChatFrame%sEditBoxRight\", id)]:Kill()\n\n\t_G[format(\"ChatFrame%sTabGlow\", id)]:Kill()\n\n\t-- Kill scroll bar\n\tframe.ScrollBar:Kill()\n\tframe.ScrollToBottomButton:Kill()\n\n\t-- Kill off editbox artwork\n\tlocal a, b, c = select(6, _G[chat..\"EditBox\"]:GetRegions())\n\ta:Kill() b:Kill() c:Kill()\n\n\t-- Kill bubble tex/glow\n\tif _G[chat..\"Tab\"].conversationIcon then _G[chat..\"Tab\"].conversationIcon:Kill() end\n\n\t-- Disable alt key usage\n\t_G[chat..\"EditBox\"]:SetAltArrowKeyMode(false)\n\n\t-- Hide editbox on login\n\t_G[chat..\"EditBox\"]:Hide()\n\n\t-- Script to hide editbox instead of fading editbox to 0.35 alpha via IM Style\n\t_G[chat..\"EditBox\"]:HookScript(\"OnEditFocusGained\", function(self) self:Show() end)\n\t_G[chat..\"EditBox\"]:HookScript(\"OnEditFocusLost\", function(self) if self:GetText() == \"\" then self:Hide() end end)\n\n\t-- Hide edit box every time we click on a tab\n\t_G[chat..\"Tab\"]:HookScript(\"OnClick\", function() _G[chat..\"EditBox\"]:Hide() end)\n\n\t-- Create our own texture for edit box\n\tif C.chat.background == true and C.chat.tabs_mouseover ~= true then\n\t\tlocal EditBoxBackground = CreateFrame(\"Frame\", \"ChatEditBoxBackground\", _G[chat..\"EditBox\"])\n\t\tEditBoxBackground:CreatePanel(\"Transparent\", 1, 1, \"LEFT\", _G[chat..\"EditBox\"], \"LEFT\", 0, 0)\n\t\tEditBoxBackground:ClearAllPoints()\n\t\tEditBoxBackground:SetPoint(\"TOPLEFT\", _G[chat..\"EditBox\"], \"TOPLEFT\", 7, -5)\n\t\tEditBoxBackground:SetPoint(\"BOTTOMRIGHT\", _G[chat..\"EditBox\"], \"BOTTOMRIGHT\", -7, 4)\n\t\tEditBoxBackground:SetFrameStrata(\"LOW\")\n\t\tEditBoxBackground:SetFrameLevel(1)\n\n\t\tlocal function colorize(r, g, b)\n\t\t\tEditBoxBackground:SetBackdropBorderColor(r, g, b)\n\t\tend\n\n\t\t-- Update border color according where we talk\n\t\thooksecurefunc(\"ChatEdit_UpdateHeader\", function()\n\t\t\tlocal chatType = _G[chat..\"EditBox\"]:GetAttribute(\"chatType\")\n\t\t\tif not chatType then return end\n\n\t\t\tlocal chanTarget = _G[chat..\"EditBox\"]:GetAttribute(\"channelTarget\")\n\t\t\tlocal chanName = chanTarget and GetChannelName(chanTarget)\n\t\t\tif chanName and chatType == \"CHANNEL\" then\n\t\t\t\tif chanName == 0 then\n\t\t\t\t\tcolorize(unpack(C.media.border_color))\n\t\t\t\telse\n\t\t\t\t\tcolorize(ChatTypeInfo[chatType..chanName].r, ChatTypeInfo[chatType..chanName].g, ChatTypeInfo[chatType..chanName].b)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tcolorize(ChatTypeInfo[chatType].r, ChatTypeInfo[chatType].g, ChatTypeInfo[chatType].b)\n\t\t\tend\n\t\tend)\n\tend\n\n\t-- Rename combat log tab\n\tif _G[chat] == _G[\"ChatFrame2\"] then\n\t\tCombatLogQuickButtonFrame_Custom:StripTextures()\n\t\tCombatLogQuickButtonFrame_Custom:CreateBackdrop(\"Transparent\")\n\t\tCombatLogQuickButtonFrame_Custom.backdrop:SetPoint(\"TOPLEFT\", 1, -4)\n\t\tCombatLogQuickButtonFrame_Custom.backdrop:SetPoint(\"BOTTOMRIGHT\", -22, 0)\n\t\tT.SkinCloseButton(CombatLogQuickButtonFrame_CustomAdditionalFilterButton, CombatLogQuickButtonFrame_Custom.backdrop, \" \", true)\n\t\tCombatLogQuickButtonFrame_CustomAdditionalFilterButton:SetSize(12, 12)\n\t\tCombatLogQuickButtonFrame_CustomAdditionalFilterButton:SetHitRectInsets (0, 0, 0, 0)\n\t\tCombatLogQuickButtonFrame_CustomProgressBar:ClearAllPoints()\n\t\tCombatLogQuickButtonFrame_CustomProgressBar:SetPoint(\"TOPLEFT\", CombatLogQuickButtonFrame_Custom.backdrop, 2, -2)\n\t\tCombatLogQuickButtonFrame_CustomProgressBar:SetPoint(\"BOTTOMRIGHT\", CombatLogQuickButtonFrame_Custom.backdrop, -2, 2)\n\t\tCombatLogQuickButtonFrame_CustomProgressBar:SetStatusBarTexture(C.media.texture)\n\t\tCombatLogQuickButtonFrameButton1:SetPoint(\"BOTTOM\", 0, 0)\n\tend\n\n\tif _G[chat] ~= _G[\"ChatFrame2\"] then\n\t\torigs[_G[chat]] = _G[chat].AddMessage\n\t\t_G[chat].AddMessage = AddMessage\n\t\t-- Custom timestamps color\n\t\tlocal color = C.chat.custom_time_color and T.RGBToHex(unpack(C.chat.time_color)) or \"\"\n\t\t_G.TIMESTAMP_FORMAT_HHMM = color..\"[%I:%M]|r \"\n\t\t_G.TIMESTAMP_FORMAT_HHMMSS = color..\"[%I:%M:%S]|r \"\n\t\t_G.TIMESTAMP_FORMAT_HHMMSS_24HR = color..\"[%H:%M:%S]|r \"\n\t\t_G.TIMESTAMP_FORMAT_HHMMSS_AMPM = color..\"[%I:%M:%S %p]|r \"\n\t\t_G.TIMESTAMP_FORMAT_HHMM_24HR = color..\"[%H:%M]|r \"\n\t\t_G.TIMESTAMP_FORMAT_HHMM_AMPM = color..\"[%I:%M %p]|r \"\n\tend\n\n\tframe.skinned = true\nend\n\n-- Setup chatframes 1 to 10 on login\nlocal function SetupChat()\n\tfor i = 1, NUM_CHAT_WINDOWS do\n\t\tlocal frame = _G[format(\"ChatFrame%s\", i)]\n\t\tSetChatStyle(frame)\n\tend\n\n\t-- Remember last channel\n\tlocal var\n\tif C.chat.sticky == true then\n\t\tvar = 1\n\telse\n\t\tvar = 0\n\tend\n\tChatTypeInfo.SAY.sticky = var\n\tChatTypeInfo.PARTY.sticky = var\n\tChatTypeInfo.PARTY_LEADER.sticky = var\n\tChatTypeInfo.GUILD.sticky = var\n\tChatTypeInfo.OFFICER.sticky = var\n\tChatTypeInfo.RAID.sticky = var\n\tChatTypeInfo.RAID_WARNING.sticky = var\n\tChatTypeInfo.INSTANCE_CHAT.sticky = var\n\tChatTypeInfo.INSTANCE_CHAT_LEADER.sticky = var\n\tChatTypeInfo.WHISPER.sticky = var\n\tChatTypeInfo.BN_WHISPER.sticky = var\n\tChatTypeInfo.CHANNEL.sticky = var\nend\n\nlocal function SetupChatPosAndFont()\n\tfor i = 1, NUM_CHAT_WINDOWS do\n\t\tlocal chat = _G[format(\"ChatFrame%s\", i)]\n\t\tlocal id = chat:GetID()\n\t\tlocal _, fontSize = FCF_GetChatWindowInfo(id)\n\n\t\t-- Min. size for chat font\n\t\tif fontSize < 11 then\n\t\t\tFCF_SetChatWindowFontSize(nil, chat, 11)\n\t\telse\n\t\t\tFCF_SetChatWindowFontSize(nil, chat, fontSize)\n\t\tend\n\n\t\t-- Font and font style for chat\n\t\tchat:SetFont(C.font.chat_font, fontSize, C.font.chat_font_style)\n\t\tchat:SetShadowOffset(C.font.chat_font_shadow and 1 or 0, C.font.chat_font_shadow and -1 or 0)\n\n\t\t-- Force chat position\n\t\tif i == 1 then\n\t\t\tchat:ClearAllPoints()\n\t\t\tchat:SetSize(C.chat.width, C.chat.height)\n\t\t\tif C.chat.background == true then\n\t\t\t\tchat:SetPoint(C.position.chat[1], C.position.chat[2], C.position.chat[3], C.position.chat[4], C.position.chat[5] + 4)\n\t\t\telse\n\t\t\t\tchat:SetPoint(C.position.chat[1], C.position.chat[2], C.position.chat[3], C.position.chat[4], C.position.chat[5])\n\t\t\tend\n\t\t\tFCF_SavePositionAndDimensions(chat)\n\t\telseif i == 2 then\n\t\t\tif C.chat.combatlog ~= true then\n\t\t\t\tFCF_DockFrame(chat)\n\t\t\t\tChatFrame2Tab:EnableMouse(false)\n\t\t\t\tChatFrame2Tab.Text:Hide()\n\t\t\t\tChatFrame2Tab:SetWidth(0.001)\n\t\t\t\tChatFrame2Tab.SetWidth = T.dummy\n\t\t\t\tFCF_DockUpdate()\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Reposition Quick Join Toast and battle.net popup\n\tQuickJoinToastButton:ClearAllPoints()\n\tQuickJoinToastButton:SetPoint(\"TOPLEFT\", 0, 90)\n\tQuickJoinToastButton.ClearAllPoints = T.dummy\n\tQuickJoinToastButton.SetPoint = T.dummy\n\n\tQuickJoinToastButton.Toast:ClearAllPoints()\n\tQuickJoinToastButton.Toast:SetPoint(unpack(C.position.bn_popup))\n\tQuickJoinToastButton.Toast.Background:SetTexture(\"\")\n\tQuickJoinToastButton.Toast:CreateBackdrop(\"Transparent\")\n\tQuickJoinToastButton.Toast.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tQuickJoinToastButton.Toast.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\tQuickJoinToastButton.Toast.backdrop:Hide()\n\tQuickJoinToastButton.Toast:SetWidth(C.chat.width + 7)\n\tQuickJoinToastButton.Toast.Text:SetWidth(C.chat.width - 20)\n\n\thooksecurefunc(QuickJoinToastButton, \"ShowToast\", function() QuickJoinToastButton.Toast.backdrop:Show() end)\n\thooksecurefunc(QuickJoinToastButton, \"HideToast\", function() QuickJoinToastButton.Toast.backdrop:Hide() end)\n\n\thooksecurefunc(BNToastFrame, \"SetPoint\", function(self, _, anchor)\n\t\tif anchor == QuickJoinToastButton then\n\t\t\tself:SetPoint(unpack(C.position.bn_popup))\n\t\tend\n\tend)\n\n\t-- /run BNToastFrame:AddToast(BN_TOAST_TYPE_ONLINE, 1)\n\thooksecurefunc(BNToastFrame, \"ShowToast\", function(self)\n\t\tif not self.IsSkinned then\n\t\t\tT.SkinCloseButton(self.CloseButton, nil, \"x\")\n\t\t\tself.CloseButton:SetSize(16, 16)\n\t\t\tself.IsSkinned = true\n\t\tend\n\tend)\nend\n\nfor i = 3, NUM_CHAT_WINDOWS do\n\tlocal tab = _G[format(\"ChatFrame%sTab\", i)]\n\thooksecurefunc(tab, \"SetPoint\", function(self, point, anchor, attachTo, x, y)\n\t\tif anchor == GeneralDockManagerScrollFrameChild and y == -1 then\n\t\t\tself:ClearAllPoints()\n\t\t\tself:SetPoint(point, anchor, attachTo, x, -2)\n\t\tend\n\tend)\nend\n\nGeneralDockManagerOverflowButton:SetPoint(\"BOTTOMRIGHT\", ChatFrame1, \"TOPRIGHT\", 0, 5)\nhooksecurefunc(GeneralDockManagerScrollFrame, \"SetPoint\", function(self, point, anchor, attachTo, x, y)\n\tif anchor == GeneralDockManagerOverflowButton and x == 0 and y == 0 then\n\t\tself:SetPoint(point, anchor, attachTo, 0, -4)\n\tend\nend)\n\nlocal UIChat = CreateFrame(\"Frame\")\nUIChat:RegisterEvent(\"ADDON_LOADED\")\nUIChat:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nUIChat:SetScript(\"OnEvent\", function(self, event, addon)\n\tif event == \"ADDON_LOADED\" then\n\t\tif addon == \"Blizzard_CombatLog\" then\n\t\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\t\t\tSetupChat(self)\n\t\tend\n\telseif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\tSetupChatPosAndFont(self)\n\tend\nend)\n\n-- Setup temp chat (BN, WHISPER) when needed\nlocal function SetupTempChat()\n\tlocal frame = FCF_GetCurrentChatFrame()\n\tif frame.skinned then return end\n\tSetChatStyle(frame)\nend\nhooksecurefunc(\"FCF_OpenTemporaryWindow\", SetupTempChat)\n\n-- Disable pet battle tab\nlocal old = FCFManager_GetNumDedicatedFrames\nfunction FCFManager_GetNumDedicatedFrames(...)\n\treturn select(1, ...) ~= \"PET_BATTLE_COMBAT_LOG\" and old(...) or 1\nend\n\n-- Remove player's realm name\nlocal function RemoveRealmName(_, _, msg, author, ...)\n\tlocal realm = string.gsub(T.realm, \" \", \"\")\n\tif msg:find(\"-\" .. realm) then\n\t\treturn false, gsub(msg, \"%-\"..realm, \"\"), author, ...\n\tend\nend\nChatFrame_AddMessageEventFilter(\"CHAT_MSG_SYSTEM\", RemoveRealmName)\n\n----------------------------------------------------------------------------------------\n--\tSave slash command typo\n----------------------------------------------------------------------------------------\nlocal function TypoHistory_Posthook_AddMessage(chat, text)\n\tif text and strfind(text, HELP_TEXT_SIMPLE) then\n\t\tChatEdit_AddHistory(chat.editBox)\n\tend\nend\n\nfor i = 1, NUM_CHAT_WINDOWS do\n\tif i ~= 2 then\n\t\thooksecurefunc(_G[\"ChatFrame\"..i], \"AddMessage\", TypoHistory_Posthook_AddMessage)\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tLoot icons\n----------------------------------------------------------------------------------------\nif C.chat.loot_icons == true then\n\tlocal function AddLootIcons(_, _, message, ...)\n\t\tlocal function Icon(link)\n\t\t\tlocal texture = GetItemIcon(link)\n\t\t\treturn \"\\124T\"..texture..\":12:12:0:0:64:64:5:59:5:59\\124t\"..link\n\t\tend\n\t\tmessage = message:gsub(\"(\\124c%x+\\124Hitem:.-\\124h\\124r)\", Icon)\n\t\treturn false, message, ...\n\tend\n\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_LOOT\", AddLootIcons)\nend\n\n----------------------------------------------------------------------------------------\n--\tSwith channels by Tab\n----------------------------------------------------------------------------------------\nlocal cycles = {\n\t{chatType = \"SAY\", use = function() return 1 end},\n\t{chatType = \"PARTY\", use = function() return not IsInRaid() and IsInGroup(LE_PARTY_CATEGORY_HOME) end},\n\t{chatType = \"RAID\", use = function() return IsInRaid(LE_PARTY_CATEGORY_HOME) end},\n\t{chatType = \"INSTANCE_CHAT\", use = function() return IsPartyLFG() end},\n\t{chatType = \"GUILD\", use = function() return IsInGuild() end},\n\t{chatType = \"SAY\", use = function() return 1 end},\n}\n\nlocal function UpdateTabChannelSwitch(self)\n\tif strsub(tostring(self:GetText()), 1, 1) == \"/\" then return end\n\tlocal currChatType = self:GetAttribute(\"chatType\")\n\tfor i, curr in ipairs(cycles) do\n\t\tif curr.chatType == currChatType then\n\t\t\tlocal h, r, step = i + 1, #cycles, 1\n\t\t\tif IsShiftKeyDown() then h, r, step = i - 1, 1, -1 end\n\t\t\tfor j = h, r, step do\n\t\t\t\tif cycles[j]:use(self, currChatType) then\n\t\t\t\t\tself:SetAttribute(\"chatType\", cycles[j].chatType)\n\t\t\t\t\tChatEdit_UpdateHeader(self)\n\t\t\t\t\treturn\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\nhooksecurefunc(\"ChatEdit_CustomTabPressed\", UpdateTabChannelSwitch)\n\n----------------------------------------------------------------------------------------\n--\tRole icons\n----------------------------------------------------------------------------------------\nif C.chat.role_icons == true then\n\tlocal chats = {\n\t\tCHAT_MSG_SAY = 1, CHAT_MSG_YELL = 1,\n\t\tCHAT_MSG_WHISPER = 1, CHAT_MSG_WHISPER_INFORM = 1,\n\t\tCHAT_MSG_PARTY = 1, CHAT_MSG_PARTY_LEADER = 1,\n\t\tCHAT_MSG_INSTANCE_CHAT = 1, CHAT_MSG_INSTANCE_CHAT_LEADER = 1,\n\t\tCHAT_MSG_RAID = 1, CHAT_MSG_RAID_LEADER = 1, CHAT_MSG_RAID_WARNING = 1,\n\t}\n\n\tlocal role_tex = {\n\t\tTANK = \"\\124T\"..[[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Tank.tga]]..\":12:12:0:0:64:64:5:59:5:59\\124t\",\n\t\tHEALER\t= \"\\124T\"..[[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Healer.tga]]..\":12:12:0:0:64:64:5:59:5:59\\124t\",\n\t\tDAMAGER = \"\\124T\"..[[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Damager.tga]]..\":12:12:0:0:64:64:5:59:5:59\\124t\",\n\t}\n\n\tlocal GetColoredName_orig = _G.GetColoredName\n\tlocal function GetColoredName_hook(event, arg1, arg2, ...)\n\t\tlocal ret = GetColoredName_orig(event, arg1, arg2, ...)\n\t\tif chats[event] then\n\t\t\tlocal role = UnitGroupRolesAssigned(arg2)\n\t\t\tif role == \"NONE\" and arg2:match(\" *- *\"..GetRealmName()..\"$\") then\n\t\t\t\trole = UnitGroupRolesAssigned(arg2:gsub(\" *-[^-]+$\",\"\"))\n\t\t\tend\n\t\t\tif role and role ~= \"NONE\" then\n\t\t\t\tret = role_tex[role]..\"\"..ret\n\t\t\tend\n\t\tend\n\t\treturn ret\n\tend\n\t_G.GetColoredName = GetColoredName_hook\nend\n\n----------------------------------------------------------------------------------------\n--\tPrevent reposition ChatFrame\n----------------------------------------------------------------------------------------\nhooksecurefunc(ChatFrame1, \"SetPoint\", function(self, _, _, _, x)\n\tif x ~= C.position.chat[4] then\n\t\tself:ClearAllPoints()\n\t\tself:SetSize(C.chat.width, C.chat.height)\n\t\tif C.chat.background == true then\n\t\t\tself:SetPoint(C.position.chat[1], C.position.chat[2], C.position.chat[3], C.position.chat[4], C.position.chat[5] + 4)\n\t\telse\n\t\t\tself:SetPoint(C.position.chat[1], C.position.chat[2], C.position.chat[3], C.position.chat[4], C.position.chat[5])\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Chat/ChatTabs.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on Fane(by Haste)\n----------------------------------------------------------------------------------------\nif C.chat.tabs_mouseover == true then\n\tCHAT_FRAME_TAB_SELECTED_NOMOUSE_ALPHA = 0\n\tCHAT_FRAME_TAB_NORMAL_NOMOUSE_ALPHA = 0\n\tCHAT_FRAME_TAB_ALERTING_NOMOUSE_ALPHA = 1\n\tCHAT_FRAME_TAB_SELECTED_MOUSEOVER_ALPHA = 1\n\tCHAT_FRAME_TAB_NORMAL_MOUSEOVER_ALPHA = 1\n\tCHAT_FRAME_TAB_ALERTING_MOUSEOVER_ALPHA = 1\nend\n\nlocal Fane = CreateFrame(\"Frame\")\n\nlocal updateFS = function(self, _, ...)\n\tlocal fstring = self:GetFontString()\n\n\tfstring:SetFont(C.font.chat_tabs_font, C.font.chat_tabs_font_size, C.font.chat_tabs_font_style)\n\tfstring:SetShadowOffset(C.font.chat_tabs_font_shadow and 1 or 0, C.font.chat_tabs_font_shadow and -1 or 0)\n\n\tif (...) then\n\t\tfstring:SetTextColor(...)\n\tend\nend\n\nlocal OnEnter = function(self)\n\tlocal emphasis = _G[\"ChatFrame\"..self:GetID()..\"TabFlash\"]:IsShown()\n\tupdateFS(self, emphasis, unpack(C.media.classborder_color))\nend\n\nlocal OnLeave = function(self)\n\tlocal r, g, b\n\tlocal id = self:GetID()\n\tlocal emphasis = _G[\"ChatFrame\"..id..\"TabFlash\"]:IsShown()\n\n\tif _G[\"ChatFrame\"..id] == SELECTED_CHAT_FRAME then\n\t\tr, g, b = unpack(C.media.classborder_color)\n\telseif emphasis then\n\t\tr, g, b = 1, 0, 0\n\telse\n\t\tr, g, b = 1, 1, 1\n\tend\n\n\tupdateFS(self, emphasis, r, g, b)\nend\n\nlocal ChatFrame2_SetAlpha = function(_, alpha)\n\tif CombatLogQuickButtonFrame_Custom then\n\t\tCombatLogQuickButtonFrame_Custom:SetAlpha(alpha)\n\tend\nend\n\nlocal ChatFrame2_GetAlpha = function()\n\tif CombatLogQuickButtonFrame_Custom then\n\t\treturn CombatLogQuickButtonFrame_Custom:GetAlpha()\n\tend\nend\n\nlocal faneifyTab = function(frame, selected)\n\tlocal i = frame:GetID()\n\n\tif frame:GetParent() == _G.ChatConfigFrameChatTabManager then\n\t\tif selected then\n\t\t\tframe.Text:SetTextColor(1, 1, 1)\n\t\tend\n\n\t\tframe:SetAlpha(1)\n\telse\n\t\tif not frame.Fane then\n\t\t\tframe:HookScript(\"OnEnter\", OnEnter)\n\t\t\tframe:HookScript(\"OnLeave\", OnLeave)\n\t\t\tif C.chat.tabs_mouseover ~= true then\n\t\t\t\tframe:SetAlpha(1)\n\n\t\t\t\tif i ~= 2 then\n\t\t\t\t\t-- Might not be the best solution, but we avoid hooking into the UIFrameFade\n\t\t\t\t\t-- system this way.\n\t\t\t\t\tframe.SetAlpha = UIFrameFadeRemoveFrame\n\t\t\t\telse\n\t\t\t\t\tframe.SetAlpha = ChatFrame2_SetAlpha\n\t\t\t\t\tframe.GetAlpha = ChatFrame2_GetAlpha\n\n\t\t\t\t\t-- We do this here as people might be using AddonLoader together with Fane\n\t\t\t\t\tif CombatLogQuickButtonFrame_Custom then\n\t\t\t\t\t\tCombatLogQuickButtonFrame_Custom:SetAlpha(0.4)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tframe.Fane = true\n\t\tend\n\n\t\t-- We can't trust sel\n\t\tif i == SELECTED_CHAT_FRAME:GetID() then\n\t\t\tupdateFS(frame, nil, unpack(C.media.classborder_color))\n\t\telse\n\t\t\tupdateFS(frame, nil, 1, 1, 1)\n\t\tend\n\tend\nend\n\nhooksecurefunc(\"FCF_StartAlertFlash\", function(frame)\n\tlocal tab = _G[\"ChatFrame\"..frame:GetID()..\"Tab\"]\n\tupdateFS(tab, true, 1, 0, 0)\nend)\n\nhooksecurefunc(\"FCFTab_UpdateColors\", faneifyTab)\n\nfor i = 1, NUM_CHAT_WINDOWS do\n\tfaneifyTab(_G[\"ChatFrame\"..i..\"Tab\"])\nend\n\nfunction Fane:ADDON_LOADED(event, addon)\n\tif addon == \"Blizzard_CombatLog\" then\n\t\tself:UnregisterEvent(event)\n\t\tself[event] = nil\n\n\t\treturn CombatLogQuickButtonFrame_Custom:SetAlpha(0.4)\n\tend\nend\nFane:RegisterEvent(\"ADDON_LOADED\")"
  },
  {
    "path": "ShestakUI/Modules/Chat/CopyChat.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCopy Chat\n----------------------------------------------------------------------------------------\nlocal frame = nil\nlocal editBox = nil\nlocal font = nil\nlocal isf = nil\nlocal sizes = {\n\t\":14:14\",\n\t\":15:15\",\n\t\":16:16\",\n\t\":12:20\",\n\t\":14\"\n}\n\nlocal function CreatCopyFrame()\n\tframe = CreateFrame(\"Frame\", \"CopyFrame\", UIParent)\n\tframe:SetTemplate(\"Transparent\")\n\tframe:SetWidth(540)\n\tframe:SetHeight(300)\n\tframe:SetPoint(\"CENTER\", UIParent, \"CENTER\", 0, 100)\n\tframe:SetFrameStrata(\"DIALOG\")\n\ttinsert(UISpecialFrames, \"CopyFrame\")\n\tframe:Hide()\n\tframe:EnableMouse(true)\n\n\teditBox = CreateFrame(\"EditBox\", \"CopyBox\", frame)\n\teditBox:SetMultiLine(true)\n\teditBox:SetMaxLetters(99999)\n\teditBox:SetAutoFocus(false)\n\teditBox:SetFontObject(ChatFontNormal)\n\teditBox:SetWidth(500)\n\teditBox:SetHeight(300)\n\teditBox:SetScript(\"OnEscapePressed\", function() frame:Hide() end)\n\n\teditBox:SetScript(\"OnTextSet\", function(self)\n\t\tlocal text = self:GetText()\n\n\t\tfor _, size in pairs(sizes) do\n\t\t\tif string.find(text, size) and not string.find(text, size..\"]\") then\n\t\t\t\tself:SetText(string.gsub(text, size, \":12:12\"))\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal scrollArea = CreateFrame(\"ScrollFrame\", \"CopyScroll\", frame, \"UIPanelScrollFrameTemplate\")\n\tscrollArea:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 8, -30)\n\tscrollArea:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -27, 8)\n\tscrollArea:SetScrollChild(editBox)\n\tT.SkinScrollBar(CopyScrollScrollBar)\n\n\tlocal close = CreateFrame(\"Button\", \"CopyCloseButton\", frame, \"UIPanelCloseButton\")\n\tT.SkinCloseButton(close)\n\n\tfont = frame:CreateFontString(nil, nil, \"GameFontNormal\")\n\tfont:Hide()\n\n\tisf = true\nend\n\nlocal canChangeMessage = function(arg1, id)\n\tif id and arg1 == \"\" then return id end\nend\n\nlocal function MessageIsProtected(message)\n\treturn message and (message ~= gsub(message, \"(:?|?)|K(.-)|k\", canChangeMessage))\nend\n\nlocal function Copy(cf)\n\tif not isf then CreatCopyFrame() end\n\tlocal text = \"\"\n\tfor i = 1, cf:GetNumMessages() do\n\t\tlocal line = cf:GetMessageInfo(i)\n\t\tif line and not MessageIsProtected(line) then\n\t\t\tfont:SetFormattedText(\"%s \\n\", line)\n\t\t\tlocal cleanLine = font:GetText() or \"\"\n\t\t\ttext = text..cleanLine\n\t\tend\n\tend\n\ttext = text:gsub(\"|T[^\\\\]+\\\\[^\\\\]+\\\\[Uu][Ii]%-[Rr][Aa][Ii][Dd][Tt][Aa][Rr][Gg][Ee][Tt][Ii][Nn][Gg][Ii][Cc][Oo][Nn]_(%d)[^|]+|t\", \"{rt%1}\")\n\ttext = text:gsub(\"|T13700([1-8])[^|]+|t\", \"{rt%1}\")\n\ttext = text:gsub(\"|T[^|]+|t\", \"\")\n\ttext = text:gsub(\"|A[^|]+|a\", \"\")\n\tif frame:IsShown() then frame:Hide() return end\n\tframe:Show()\n\teditBox:SetText(text)\n\n\teditBox:SetScript(\"OnTextChanged\", function(_, userInput)\n\t\tif userInput then return end\n\t\tlocal _, max = CopyScrollScrollBar:GetMinMaxValues()\n\t\tfor _ = 1, max do\n\t\t\tScrollFrameTemplate_OnMouseWheel(CopyScroll, -1)\n\t\tend\n\tend)\nend\n\nfor i = 1, NUM_CHAT_WINDOWS do\n\tlocal cf = _G[format(\"ChatFrame%d\", i)]\n\tlocal button = CreateFrame(\"Button\", format(\"ButtonCF%d\", i), cf)\n\tbutton:SetPoint(\"BOTTOMRIGHT\", 0, 1)\n\tbutton:SetSize(20, 20)\n\tbutton:SetAlpha(0)\n\tbutton:SetTemplate(\"Transparent\")\n\tbutton:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\n\tlocal icon = button:CreateTexture(nil, \"BORDER\")\n\ticon:SetPoint(\"CENTER\")\n\ticon:SetTexture(\"Interface\\\\BUTTONS\\\\UI-GuildButton-PublicNote-Up\")\n\ticon:SetSize(16, 16)\n\n\tbutton:SetScript(\"OnMouseUp\", function(_, btn)\n\t\tif btn == \"RightButton\" then\n\t\t\tToggleFrame(ChatMenu)\n\t\telseif btn == \"MiddleButton\" then\n\t\t\tRandomRoll(1, 100)\n\t\telse\n\t\t\tCopy(cf)\n\t\tend\n\tend)\n\tbutton:SetScript(\"OnEnter\", function() button:FadeIn() end)\n\tbutton:SetScript(\"OnLeave\", function() button:FadeOut() end)\nend\n\nSlashCmdList.COPY_CHAT = function()\n\tCopy(_G[\"ChatFrame1\"])\nend"
  },
  {
    "path": "ShestakUI/Modules/Chat/CopyUrl.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCopy url from chat(module from Gibberish by p3lim)\n----------------------------------------------------------------------------------------\nlocal patterns = {\n\t\"(https://%S+%.%S+)\",\n\t\"(http://%S+%.%S+)\",\n\t\"(www%.%S+%.%S+)\",\n\t\"(%d+%.%d+%.%d+%.%d+:?%d*/?%S*)\"\n}\n\nfor _, event in next, {\n\t\"CHAT_MSG_SAY\",\n\t\"CHAT_MSG_YELL\",\n\t\"CHAT_MSG_WHISPER\",\n\t\"CHAT_MSG_WHISPER_INFORM\",\n\t\"CHAT_MSG_GUILD\",\n\t\"CHAT_MSG_OFFICER\",\n\t\"CHAT_MSG_PARTY\",\n\t\"CHAT_MSG_PARTY_LEADER\",\n\t\"CHAT_MSG_RAID\",\n\t\"CHAT_MSG_RAID_LEADER\",\n\t\"CHAT_MSG_RAID_WARNING\",\n\t\"CHAT_MSG_INSTANCE_CHAT\",\n\t\"CHAT_MSG_INSTANCE_CHAT_LEADER\",\n\t\"CHAT_MSG_BN_WHISPER\",\n\t\"CHAT_MSG_BN_WHISPER_INFORM\",\n\t\"CHAT_MSG_CHANNEL\",\n\t\"CHAT_MSG_SYSTEM\"\n} do\n\tChatFrame_AddMessageEventFilter(event, function(_, event, str, ...)\n\t\tfor _, pattern in pairs(patterns) do\n\t\t\tlocal result, match = string.gsub(str, pattern, \"|cff00FF00|Hurl:%1|h[%1]|h|r\")\n\t\t\tif match > 0 then\n\t\t\t\treturn false, result, ...\n\t\t\tend\n\t\tend\n\tend)\nend\n\nlocal SetHyperlink = _G.ItemRefTooltip.SetHyperlink\nfunction _G.ItemRefTooltip:SetHyperlink(link, ...)\n\tif link and (strsub(link, 1, 3) == \"url\") then\n\t\tlocal editbox = ChatEdit_ChooseBoxForSend()\n\t\tChatEdit_ActivateChat(editbox)\n\t\teditbox:Insert(string.sub(link, 5))\n\t\teditbox:HighlightText()\n\t\treturn\n\tend\n\n\tSetHyperlink(self, link, ...)\nend"
  },
  {
    "path": "ShestakUI/Modules/Chat/FadeCombat.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true or C.chat.hide_combat ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tHide Chat in Combat (by Urtgard)\n----------------------------------------------------------------------------------------\nlocal hcic = CreateFrame(\"Frame\")\nlocal MouseoverFrames = {}\n-- Events\nlocal event = CreateFrame(\"Frame\")\nevent:SetScript(\"OnEvent\", function(self, event, ...)\n\tself[event](self, ...)\nend)\n\n-- Register events\nevent:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\nevent:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\nevent:RegisterEvent(\"PLAYER_LOGIN\")\nevent:RegisterEvent(\"PET_BATTLE_CLOSE\")\nevent:RegisterEvent(\"PET_BATTLE_OPENING_START\")\n-- Handle events\nfunction event:PLAYER_REGEN_ENABLED()\n\thcic:CombatEnd()\nend\nfunction event:PLAYER_REGEN_DISABLED()\n\thcic:CombatStart()\nend\nfunction event:PLAYER_LOGIN()\n\thcic:Init()\nend\nfunction event:PET_BATTLE_CLOSE()\n\thcic:CombatEnd()\nend\nfunction event:PET_BATTLE_OPENING_START()\n\thcic:CombatStart()\nend\n\n--\nfunction hcic:Init()\n\tfor i = 1, NUM_CHAT_WINDOWS do\n\t\tlocal f = _G[\"ChatFrame\"..i]\n\t\tif f:IsShown() then\n\t\t\tlocal chatMouseover = CreateFrame(\"Frame\", \"HCIC\"..i, UIParent)\n\n\t\t\tchatMouseover:SetPoint(\"TOPLEFT\", \"ChatFrame\"..i, \"TOPLEFT\", -25, 30)\n\t\t\tchatMouseover:SetPoint(\"BOTTOMRIGHT\", \"ChatFrame\"..i, \"BOTTOMRIGHT\", 2, -2)\n\n\t\t\tchatMouseover.FadeOut = function(self)\n\t\t\t\thcic:FadeOut(self)\n\t\t\tend\n\t\t\tchatMouseover.FadeIn = function(self)\n\t\t\t\thcic:FadeIn(self)\n\t\t\tend\n\n\t\t\tchatMouseover:SetScript(\"OnEnter\", function(self)\n\t\t\t\tif InCombatLockdown() or C_PetBattles.IsInBattle() then\n\t\t\t\t\tself:FadeIn(self)\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tchatMouseover:SetScript(\"OnLeave\", function(self)\n\t\t\t\t\thcic:ChatOnLeave(self)\n\t\t\tend)\n\n\t\t\tchatMouseover.Frames = {_G[\"ChatFrame\"..i], _G[\"ChatFrame\"..i..\"Tab\"], _G[\"ChatFrame\"..i..\"ButtonFrame\"]}\n\t\t\tif i == 1 then\n\t\t\t\ttinsert(chatMouseover.Frames, GeneralDockManager)\n\t\t\t\ttinsert(chatMouseover.Frames, GeneralDockManagerScrollFrame)\n\n\t\t\t\tif C.chat.background == true then\n\t\t\t\t\ttinsert(chatMouseover.Frames, ChatBackground)\n\t\t\t\t\ttinsert(chatMouseover.Frames, ChatTabsPanel)\n\t\t\t\telseif C.stats.bottom_line then\n\t\t\t\t\ttinsert(chatMouseover.Frames, LeftPanel)\n\t\t\t\tend\n\n\t\t\t\tif C.chat.chat_bar and C.chat.chat_bar_mouseover ~= true then\n\t\t\t\t\ttinsert(chatMouseover.Frames, ChatBar)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tchatMouseover:SetFrameStrata(\"BACKGROUND\")\n\t\t\ttinsert(MouseoverFrames, _G[\"HCIC\"..i])\n\t\tend\n\tend\nend\n\n--\nfunction hcic:CombatStart()\n\tfor _, f in pairs(MouseoverFrames) do\n\t\tf:FadeOut()\n\tend\nend\n\n--\nfunction hcic:CombatEnd()\n\tfor _, f in pairs(MouseoverFrames) do\n\t\tf:FadeIn()\n\tend\nend\n\n-- Fade\nfunction hcic:FadeOut(self)\n\thcic:fade(self, 1)\nend\nfunction hcic:FadeIn(self)\n\thcic:fade(self, 0)\nend\nfunction hcic:fade(self, mode)\n\tfor _, frame in pairs(self.Frames) do\n\t\tlocal alpha = frame:GetAlpha()\n\t\tif mode == 0 then\n\t\t\tframe.Show = Show\n\t\t\tframe:Show()\n\t\t\tUIFrameFadeIn(frame, 0.4 * (1 - alpha), alpha, 1)\n\t\telse\n\t\t\tUIFrameFadeOut(frame, 0.8 * alpha, alpha, 0)\n\t\t\tframe.Show = T.dummy\n\t\t\tframe.fadeInfo.finishedArg1 = frame\n\t\t\tframe.fadeInfo.finishedFunc = frame.Hide\n\t\tend\n\tend\nend\n\nlocal function checkAgain(self)\n\tC_Timer.After(1, function()\n\t\tlocal f = GetMouseFocus()\n\t\tlocal name = GetMouseFocus():GetName()\n\t\tif f and name and not name:match(\"HCIC\") then\n\t\t\thcic:ChatOnLeave(self)\n\t\tend\n\tend)\nend\n\nfunction hcic:ChatOnLeave(self)\n\tif InCombatLockdown() or C_PetBattles.IsInBattle() then\n\t\tlocal f = GetMouseFocus()\n\t\tif f then\n\t\t\tif f.messageInfo then\n\t\t\t\treturn nil\n\t\t\tend\n\t\t\tif hcic:IsInArray(self.Frames, f) then\n\t\t\t\tcheckAgain(self) return nil\n\t\t\tend\n\t\t\tif f:GetParent() then\n\t\t\t\tf = f:GetParent()\n\t\t\t\tif hcic:IsInArray(self.Frames, f) then\n\t\t\t\t\tcheckAgain(self) return nil\n\t\t\t\tend\n\t\t\t\tif f:GetParent() then\n\t\t\t\t\tf = f:GetParent()\n\t\t\t\t\tif hcic:IsInArray(self.Frames, f) then\n\t\t\t\t\t\tcheckAgain(self) return nil\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tself:FadeOut(self)\n\tend\nend\n\nfunction hcic:IsInArray(array, s)\n\tfor _, v in pairs(array) do\n\t\tif v == s then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn false\nend\n\nhooksecurefunc(\"FCF_Tab_OnClick\", function(self)\n\tlocal chatFrame = _G[\"ChatFrame\"..self:GetID()]\n\tif chatFrame.isDocked then\n\t\tHCIC1.Frames[1] = chatFrame\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Chat/Filters.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSystems spam filter\n----------------------------------------------------------------------------------------\nif C.chat.filter == true then\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_MONSTER_SAY\", function() if IsResting() then return true end end)\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_MONSTER_YELL\", function() if IsResting() then return true end end)\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_CHANNEL_JOIN\", function() return true end)\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_CHANNEL_LEAVE\", function() return true end)\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_CHANNEL_NOTICE\", function() return true end)\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_AFK\", function() return true end)\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_DND\", function() return true end)\n\tDUEL_WINNER_KNOCKOUT = \"\"\n\tDUEL_WINNER_RETREAT = \"\"\n\tDRUNK_MESSAGE_ITEM_OTHER1 = \"\"\n\tDRUNK_MESSAGE_ITEM_OTHER2 = \"\"\n\tDRUNK_MESSAGE_ITEM_OTHER3 = \"\"\n\tDRUNK_MESSAGE_ITEM_OTHER4 = \"\"\n\tDRUNK_MESSAGE_OTHER1 = \"\"\n\tDRUNK_MESSAGE_OTHER2 = \"\"\n\tDRUNK_MESSAGE_OTHER3 = \"\"\n\tDRUNK_MESSAGE_OTHER4 = \"\"\n\tDRUNK_MESSAGE_ITEM_SELF1 = \"\"\n\tDRUNK_MESSAGE_ITEM_SELF2 = \"\"\n\tDRUNK_MESSAGE_ITEM_SELF3 = \"\"\n\tDRUNK_MESSAGE_ITEM_SELF4 = \"\"\n\tDRUNK_MESSAGE_SELF1 = \"\"\n\tDRUNK_MESSAGE_SELF2 = \"\"\n\tDRUNK_MESSAGE_SELF3 = \"\"\n\tDRUNK_MESSAGE_SELF4 = \"\"\n\tERR_PET_LEARN_ABILITY_S = \"\"\n\tERR_PET_LEARN_SPELL_S = \"\"\n\tERR_PET_SPELL_UNLEARNED_S = \"\"\n\tERR_LEARN_ABILITY_S = \"\"\n\tERR_LEARN_SPELL_S = \"\"\n\tERR_LEARN_PASSIVE_S = \"\"\n\tERR_SPELL_UNLEARNED_S = \"\"\n\n\t-- Prevent empty line\n\tlocal function systemFilter(_, _, text)\n\t\tif text and text == \"\" then\n\t\t\treturn true\n\t\tend\n\tend\n\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_SYSTEM\", systemFilter)\nend\n\n----------------------------------------------------------------------------------------\n--\tPlayers spam filter(by Evl, Elv22 and Affli)\n----------------------------------------------------------------------------------------\nif C.chat.spam == true then\n\t-- Repeat spam filter\n\tlocal function repeatMessageFilter(self, _, text, sender)\n\t\tsender = Ambiguate(sender, \"guild\")\n\t\tif sender == T.name or UnitIsInMyGuild(sender) then return end\n\t\tif not self.repeatMessages or self.repeatCount > 20 then\n\t\t\tself.repeatCount = 0\n\t\t\tself.repeatMessages = {}\n\t\tend\n\t\tlocal lastMessage = self.repeatMessages[sender]\n\t\tif lastMessage == text then\n\t\t\treturn true\n\t\tend\n\t\tself.repeatMessages[sender] = text\n\t\tself.repeatCount = self.repeatCount + 1\n\tend\n\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_CHANNEL\", repeatMessageFilter)\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_YELL\", repeatMessageFilter)\n\n\t-- Gold/portals spam filter\n\tlocal SpamList = T.ChatSpamList\n\tlocal function tradeFilter(_, _, text, sender)\n\t\tsender = Ambiguate(sender, \"guild\")\n\t\tif sender == T.name or UnitIsInMyGuild(sender) then return end\n\t\tfor _, value in pairs(SpamList) do\n\t\t\tif text:lower():match(value) then\n\t\t\t\treturn true\n\t\t\tend\n\t\tend\n\tend\n\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_CHANNEL\", tradeFilter)\n\tChatFrame_AddMessageEventFilter(\"CHAT_MSG_YELL\", tradeFilter)\nend"
  },
  {
    "path": "ShestakUI/Modules/Chat/History.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true or C.chat.history ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tChat history (TrueChatFrameHistory by Kanegasi)\n----------------------------------------------------------------------------------------\nlocal a, t = ...\nlocal f = CreateFrame(\"frame\", a)\nlocal DB, CF, cfid, hook = {}, {}, {}, {}\nShestakUIChatHistory = ShestakUIChatHistory or {}\n\nlocal function prnt(frame, message)\n\tif frame.historyBuffer:PushFront({message = message, r = 1, g = 1, b = 1, extraData = {[1] = \"temp\", n = 1}, timestamp = GetTime()}) then\n\t\tif frame:GetScrollOffset() ~= 0 then\n\t\t\tframe:ScrollUp()\n\t\tend\n\t\tframe:MarkDisplayDirty()\n\tend\nend\n\n -- CircularBuffer bug (feature?) due to modulus usage (CircularBuffer.lua:38,46,123), causing elements to be added at the back when buffer is full, screwing up saved data\nfunction t.pushfront(frame)\n\tif frame == COMBATLOG then return end -- ensure Combat Log is ignored\n\tif not hook[frame] then\n\t\thook[frame] = true -- hook only once, hook doesn't go away when temporary frames are closed (11+)\n\t\thooksecurefunc(frame.historyBuffer, \"PushFront\", function(frame)\n\t\t\twhile #frame.elements > frame.maxElements - 5 do -- minimum of 2 less than max is needed, 5 to provide some buffer\n\t\t\t\ttable.remove(frame.elements, 1)\n\t\t\tend\n\t\t\tframe.headIndex = #frame.elements\n\t\tend)\n\tend\nend\n\n -- element fading timestamp comes from GetTime() (ScrollingMessageFrame.lua:583), causing restored elements to effectively not fade if you restart your computer\nfunction t.timestamps(frame)\n\tlocal nameorid, timestamp = CF[frame] > NUM_CHAT_WINDOWS and frame.name or CF[frame], GetTime()\n\tif DB[nameorid] then\n\t\tfor element = #DB[nameorid], 1, -1 do\n\t\t\tDB[nameorid][element].timestamp = timestamp\n\t\tend\n\tend\nend\n\nfunction t.ADDON_LOADED(addon)\n\tif addon == a then\n\t\tDB = ShestakUIChatHistory\n\t\tfor frame, elements in next, DB do\n\t\t\tfor element = #elements, 1, -1 do\n\t\t\t\tif elements[element].extraData then\n\t\t\t\t\tfor _, v in next, elements[element].extraData do\n\t\t\t\t\t\tif v == \"temp\" then table.remove(DB[frame], element) break end -- remove TCFH's entries\n\t\t\t\t\t\t -- note to authors: passing \"temp\" in _any_ arg beyond the r,g,b args of AddMessage\n\t\t\t\t\t\t -- will allow your message to also be removed upon chat restoration, if you so desire\n\t\t\t\t\t\t -- examples: frame:AddMessage(\"message\",r,g,b,\"temp\")\n\t\t\t\t\t\t -- frame:AddMessage(\"message\",r,g,b,chatTypeID,accessID,lineID,\"temp\")\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\thooksecurefunc(\"FCF_SetWindowName\", function(frame)\n\t\t\tlocal id = frame:GetID()\n\t\t\tCF[frame] = id -- main ChatFrame pointers\n\t\t\tcfid[id] = frame -- access by id, used for /tcfh and ordered iteration of t.missed\n\t\tend)\n\t\thooksecurefunc(\"FCFManager_RegisterDedicatedFrame\", function(frame)\n\t\t\tif CF[frame] > NUM_CHAT_WINDOWS then\n\t\t\t\tt.pushfront(frame)\n\t\t\t\tif DB[frame.name] then\n\t\t\t\t\tt.timestamps(frame)\n\t\t\t\t\tframe.historyBuffer:ReplaceElements(DB[frame.name])\n\t\t\t\tend\n\t\t\tend\n\t\tend) -- restore any history for Pet Combat Log and whispers\n\t\thooksecurefunc(\"FCFManager_UnregisterDedicatedFrame\", function(frame)\n\t\t\tif CF[frame] > NUM_CHAT_WINDOWS then\n\t\t\t\tDB[frame.name] = frame.historyBuffer.elements\n\t\t\tend\n\t\tend) -- save any history for Pet Combat Log and whispers\n\tend\n\tf:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tf:RegisterEvent(\"PLAYER_ENTERING_WORLD\") -- attempt to ensure TCFH is last to load\n\tlocal frames = {GetFramesRegisteredForEvent(\"PLAYER_LEAVING_WORLD\")}\n\twhile frames[1] ~= f do\n\t\tframes[1]:UnregisterEvent(\"PLAYER_LEAVING_WORLD\")\n\t\tframes[1]:RegisterEvent(\"PLAYER_LEAVING_WORLD\")\n\t\ttable.remove(frames, 1)\n\tend -- attempt to ensure TCFH is first to trigger upon UI unload\nend\n\nfunction t.PLAYER_ENTERING_WORLD()\n\tif t.pew then return end\n\n\tfor id = #cfid, 1, -1 do\n\t\tif cfid[id] ~= COMBATLOG then\n\t\t\tt.pushfront(cfid[id])\n\t\t\tt.timestamps(cfid[id])\n\t\t\tif id <= NUM_CHAT_WINDOWS and DB[id] and #DB[id] > 0 then\n\t\t\t\tcfid[id].historyBuffer:ReplaceElements(DB[id])\n\t\t\tend -- restore any history for ChatFrame1-10 (excluding Combat Log)\n\t\t\tprnt(cfid[id], \"|cffBCEE68--- \"..HISTORY..\" ---|r\")\n\t\tend\n\tend\n\tt.pew = true\nend\n\nfunction t.PLAYER_LEAVING_WORLD()\n\tfor frame, id in next, CF do\n\t\tif frame ~= COMBATLOG then\n\t\t\tDB[id > NUM_CHAT_WINDOWS and frame.name or id] = frame.historyBuffer.elements\n\t\tend\n\tend -- save any history for all ChatFrames (excluding Combat Log)\nend\n\nf:RegisterEvent(\"ADDON_LOADED\")\nf:RegisterEvent(\"PLAYER_LEAVING_WORLD\")\nf:SetScript(\"OnEvent\", function(_, event,...)t[event](...)end)"
  },
  {
    "path": "ShestakUI/Modules/Chat/Invite.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAlt Click to Invite player\n----------------------------------------------------------------------------------------\nhooksecurefunc(\"SetItemRef\", function(link) -- Secure hook to avoid taint\n\tif IsAltKeyDown() then\n\t\tlocal ChatFrameEditBox = ChatEdit_ChooseBoxForSend()\n\t\tlocal player = link:match(\"^player:([^:]+)\")\n\t\tlocal bplayer = link:match(\"^BNplayer:([^:]+)\")\n\t\tif player then\n\t\t\tC_PartyInfo.InviteUnit(player)\n\t\telseif bplayer then\n\t\t\tlocal _, value = strmatch(link, \"(%a+):(.+)\")\n\t\t\tlocal _, bnID = strmatch(value, \"([^:]*):([^:]*):\")\n\t\t\tif not bnID then return end\n\t\t\tlocal accountInfo = C_BattleNet.GetAccountInfoByID(bnID)\n\t\t\tif accountInfo.gameAccountInfo.clientProgram == BNET_CLIENT_WOW and CanCooperateWithGameAccount(accountInfo) then\n\t\t\t\tBNInviteFriend(accountInfo.gameAccountInfo.gameAccountID)\n\t\t\tend\n\t\tend\n\t\tChatEdit_OnEscapePressed(ChatFrameEditBox) -- Secure hook opens whisper, so closing it.\n\tend\nend)\n"
  },
  {
    "path": "ShestakUI/Modules/Chat/MouseScroll.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tChat Scroll Module\n----------------------------------------------------------------------------------------\nlocal ScrollLines = 1\nfunction FloatingChatFrame_OnMouseScroll(self, delta)\n\tif delta < 0 then\n\t\tif IsShiftKeyDown() then\n\t\t\tself:ScrollToBottom()\n\t\telse\n\t\t\tfor i = 1, ScrollLines do\n\t\t\t\tself:ScrollDown()\n\t\t\tend\n\t\tend\n\telseif delta > 0 then\n\t\tif IsShiftKeyDown() then\n\t\t\tself:ScrollToTop()\n\t\telse\n\t\t\tfor i = 1, ScrollLines do\n\t\t\t\tself:ScrollUp()\n\t\t\tend\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Chat/RealLinks.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tColors links in Battle.net whispers(RealLinks by p3lim)\n----------------------------------------------------------------------------------------\nlocal queuedMessages = {}\nlocal function GetLinkColor(data)\n\tlocal type, arg1, arg2, arg3 = string.split(\":\", data)\n\tif type == \"item\" then\n\t\tlocal _, _, quality = GetItemInfo(arg1)\n\t\tif quality then\n\t\t\tlocal _, _, _, color = GetItemQualityColor(quality)\n\t\t\treturn \"|c\"..color\n\t\telse\n\t\t\treturn nil, true\n\t\tend\n\telseif type == \"quest\" then\n\t\tif arg2 then\n\t\t\treturn ConvertRGBtoColorString(GetQuestDifficultyColor(arg2))\n\t\telse\n\t\t\treturn \"|cffffd100\"\n\t\tend\n\telseif type == \"currency\" then\n\t\tlocal link = GetCurrencyLink(arg1)\n\t\tif link then\n\t\t\treturn gsub(link, 0, 10)\n\t\telse\n\t\t\treturn \"|cffffffff\"\n\t\tend\n\telseif type == \"battlepet\" then\n\t\tif arg3 ~= -1 then\n\t\t\tlocal _, _, _, color = GetItemQualityColor(arg3)\n\t\t\treturn \"|c\"..color\n\t\telse\n\t\t\treturn \"|cffffd200\"\n\t\tend\n\telseif type == \"garrfollower\" then\n\t\tlocal _, _, _, color = GetItemQualityColor(arg2)\n\t\treturn \"|c\"..color\n\telseif type == \"spell\" then\n\t\treturn \"|cff71d5ff\"\n\telseif type == \"achievement\" or type == \"garrmission\" then\n\t\treturn \"|cffffff00\"\n\telseif type == \"trade\" or type == \"enchant\" then\n\t\treturn \"|cffffd000\"\n\telseif type == \"instancelock\" then\n\t\treturn \"|cffff8000\"\n\telseif type == \"glyph\" or type == \"journal\" then\n\t\treturn \"|cff66bbff\"\n\telseif type == \"talent\" or type == \"battlePetAbil\" or type == \"garrfollowerability\" then\n\t\treturn \"|cff4e96f7\"\n\telseif type == \"levelup\" then\n\t\treturn \"|cffff4e00\"\n\telse\n\t\treturn \"|cffffff00\"\n\tend\nend\n\nlocal function MessageFilter(self, event, message, ...)\n\tfor link, data in gmatch(message, \"(|H(.-)|h.-|h)\") do\n\t\tlocal color, queue = GetLinkColor(data)\n\t\tif queue then\n\t\t\ttable.insert(queuedMessages, {self, event, message, ...})\n\t\t\treturn true\n\t\telseif color then\n\t\t\tlocal matchLink = \"|H\"..data..\"|h.-|h\"\n\t\t\tmessage = gsub(message, matchLink, color..link..\"|r\", 1)\n\t\tend\n\tend\n\n\treturn false, message, ...\nend\n\nlocal Handler = CreateFrame(\"Frame\")\nHandler:RegisterEvent(\"GET_ITEM_INFO_RECEIVED\")\nHandler:SetScript(\"OnEvent\", function()\n\tif #queuedMessages > 0 then\n\t\tfor index, data in next, queuedMessages do\n\t\t\tChatFrame_MessageEventHandler(unpack(data))\n\t\t\tqueuedMessages[index] = nil\n\t\tend\n\tend\nend)\n\nChatFrame_AddMessageEventFilter(\"CHAT_MSG_BN_WHISPER\", MessageFilter)\nChatFrame_AddMessageEventFilter(\"CHAT_MSG_BN_WHISPER_INFORM\", MessageFilter)"
  },
  {
    "path": "ShestakUI/Modules/Chat/Sounds.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true or C.chat.whisp_sound ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPlay sound files system(by Tukz)\n----------------------------------------------------------------------------------------\nlocal SoundSys = CreateFrame(\"Frame\")\nSoundSys:RegisterEvent(\"CHAT_MSG_WHISPER\")\nSoundSys:RegisterEvent(\"CHAT_MSG_BN_WHISPER\")\nSoundSys:HookScript(\"OnEvent\", function(_, event)\n\tif event == \"CHAT_MSG_WHISPER\" or event == \"CHAT_MSG_BN_WHISPER\" then\n\t\tPlaySoundFile(C.media.whisp_sound, \"Master\")\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Chat/SpamageMeters.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true or C.chat.damage_meter_spam ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMerge damage meter spam(SpamageMeters by Wrug and Cybey)\n----------------------------------------------------------------------------------------\nlocal firstLines = {\n\t\"^Details!: (.*)$\",\t\t\t\t\t\t\t\t\t\t-- Details!\n\t\"^Recount - (.*)$\", \t\t\t\t\t\t\t\t\t-- Recount\n\t\"^Skada: (.*) for (.*):$\",\t\t\t\t\t\t\t\t-- Skada enUS\n\t\"^Skada: (.*) für (.*):$\",\t\t\t\t\t\t\t\t-- Skada deDE\n\t\"^Skada: (.*) pour (.*):$\",\t\t\t\t\t\t\t\t-- Skada frFR\n\t\"^Отчёт Skada: (.*), с (.*):$\",\t\t\t\t\t\t\t-- Skada ruRU\n\t\"^Skada: (.*) por (.*):$\",\t\t\t\t\t\t\t\t-- Skada esES/ptBR\n\t\"^Skada: (.*) per (.*):$\",\t\t\t\t\t\t\t\t-- Skada itIT\n\t\"^(.*) 의 Skada 보고 (.*):$\",\t\t\t\t\t\t\t\t-- Skada koKR\n\t\"^Skada报告(.*)的(.*):$\",\t\t\t\t\t\t\t\t-- Skada zhCN\n\t\"^Skada:(.*)來自(.*):$\",\t\t\t\t\t\t\t\t-- Skada zhTW\n\t\"^Numeration: (.*) - (.*)$\",\t\t\t\t\t\t\t-- Numeration\n\t\"^(.*) Done for (.*)$\",\t\t\t\t\t\t\t\t\t-- TinyDPS enUS\n\t\"^(.*) für (.*)$\",\t\t\t\t\t\t\t\t\t\t-- TinyDPS deDE\n\t\"데미지량 -(.*)$\",\t\t\t\t\t\t\t\t\t\t\t-- TinyDPS koKR\n\t\"힐량 -(.*)$\",\t\t\t\t\t\t\t\t\t\t\t-- TinyDPS koKR\n\t\"Урон:(.*)$\",\t\t\t\t\t\t\t\t\t\t\t-- TinyDPS ruRU\n\t\"Исцеление:(.*)$\"\t\t\t\t\t\t\t\t\t\t-- TinyDPS ruRU\n}\n\nlocal nextLines = {\n\t\"^(%d+)\\. (.*)$\",\t\t\t\t\t\t\t\t\t\t-- Recount, Details! and Skada\n\t\"^(.*)   (.*)$\",\t\t\t\t\t\t\t\t\t\t-- Additional Skada\n\t\"^[+-]%d+.%d\",\t\t\t\t\t\t\t\t\t\t\t-- Numeration deathlog details\n\t\"^(%d+). (.*):(.*)(%d+)(.*)(%d+)%%(.*)%((%d+)%)$\"\t\t-- TinyDPS\n}\n\nlocal meters = {}\n\nlocal events = {\n\t\"CHAT_MSG_CHANNEL\",\n\t\"CHAT_MSG_GUILD\",\n\t\"CHAT_MSG_OFFICER\",\n\t\"CHAT_MSG_PARTY\",\n\t\"CHAT_MSG_PARTY_LEADER\",\n\t\"CHAT_MSG_RAID\",\n\t\"CHAT_MSG_RAID_LEADER\",\n\t\"CHAT_MSG_INSTANCE_CHAT\",\n\t\"CHAT_MSG_INSTANCE_CHAT_LEADER\",\n\t\"CHAT_MSG_SAY\",\n\t\"CHAT_MSG_WHISPER\",\n\t\"CHAT_MSG_WHISPER_INFORM\",\n\t\"CHAT_MSG_YELL\"\n}\n\nlocal function FilterLine(event, source, message)\n\tfor i = 1, #nextLines do\n\t\tlocal v = nextLines[i]\n\t\tif message:match(v) then\n\t\t\tlocal curTime = time()\n\t\t\tfor i = 1, #meters do\n\t\t\t\tlocal j = meters[i]\n\t\t\t\tlocal elapsed = curTime - j.time\n\t\t\t\tif j.source == source and j.event == event and elapsed < 5 then\n\t\t\t\t\tlocal toInsert = true\n\n\t\t\t\t\tfor i = 1, #j.data do\n\t\t\t\t\t\tif j.data[i] == message then\n\t\t\t\t\t\t\ttoInsert = false\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\n\t\t\t\t\tif toInsert then\n\t\t\t\t\t\ttable.insert(j.data, message)\n\t\t\t\t\tend\n\t\t\t\t\treturn true, false, nil\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tfor i = 1, #firstLines do\n\t\tlocal v = firstLines[i]\n\t\tlocal newID = 0\n\t\tif message:match(v) then\n\t\t\tlocal curTime = time()\n\n\t\t\tfor i = 1, #meters do\n\t\t\t\tlocal j = meters[i]\n\t\t\t\tlocal elapsed = curTime - j.time\n\t\t\t\tif j.source == source and j.event == event and elapsed < 1 then\n\t\t\t\t\tnewID = i\n\t\t\t\t\treturn true, true, string.format(\"|Hspam:%1$d|h|cFFFFFF00[%2$s]|r|h\", newID or 0, message or \"nil\")\n\t\t\t\tend\n\t\t\tend\n\n\t\t\ttable.insert(meters, {source = source, event = event, time = curTime, data = {}, title = message})\n\n\t\t\tfor i = 1, #meters do\n\t\t\t\tlocal j = meters[i]\n\t\t\t\tif j.source == source and j.event == event and j.time == curTime then\n\t\t\t\t\tnewID = i\n\t\t\t\tend\n\t\t\tend\n\n\t\t\treturn true, true, string.format(\"|Hspam:%1$d|h|cFFFFFF00[%2$s]|r|h\", newID or 0, message or \"nil\")\n\t\tend\n\tend\n\treturn false, false, nil\nend\n\nlocal SetHyperlink = _G.ItemRefTooltip.SetHyperlink\nfunction _G.ItemRefTooltip:SetHyperlink(link, ...)\n\tif link and (strsub(link, 1, 4) == \"spam\") then\n\t\tlocal _, id = strsplit(\":\", link)\n\t\tlocal meterID = tonumber(id)\n\t\tItemRefTooltip:ClearLines()\n\t\tItemRefTooltip:AddLine(meters[meterID].title)\n\t\tItemRefTooltip:AddLine(string.format(BY_SOURCE..\": %s\", meters[meterID].source))\n\t\tfor _, v in ipairs(meters[meterID].data) do\n\t\t\tlocal left, right = v:match(\"^(.*)  (.*)$\")\n\t\t\tif left and right then\n\t\t\t\tItemRefTooltip:AddDoubleLine(left, right, 1, 1, 1, 1, 1, 1)\n\t\t\telse\n\t\t\t\tItemRefTooltip:AddLine(v, 1, 1, 1)\n\t\t\tend\n\t\tend\n\t\tItemRefTooltip:Show()\n\t\treturn\n\tend\n\n\tSetHyperlink(self, link, ...)\nend\n\nlocal function ParseChatEvent(_, event, message, sender, ...)\n\tlocal isRecount, isFirstLine, newMessage = FilterLine(event, sender, message)\n\tif isRecount then\n\t\tif isFirstLine then\n\t\t\treturn false, newMessage, sender, ...\n\t\telse\n\t\t\treturn true\n\t\tend\n\tend\nend\n\nfor _, event in pairs(events) do\n\tChatFrame_AddMessageEventFilter(event, ParseChatEvent)\nend"
  },
  {
    "path": "ShestakUI/Modules/Chat/TellTarget.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTell Target\n----------------------------------------------------------------------------------------\nfor i = 1, NUM_CHAT_WINDOWS do\n\tlocal editbox = _G[\"ChatFrame\"..i..\"EditBox\"]\n\teditbox:HookScript(\"OnTextChanged\", function(self)\n\t\tlocal text = self:GetText()\n\t\tif text:len() < 7 then\n\t\t\tif text:sub(1, 4) == \"/tt \" or text:sub(1, 6) == \"/ее \" then\n\t\t\t\tif UnitCanAssist(\"player\", \"target\") then\n\t\t\t\t\tChatFrame_SendTell((GetUnitName(\"target\", true)), ChatFrame1)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\nend\n\n-- Slash command\nSlashCmdList.TELLTARGET = function(msg)\n\tlocal name = GetUnitName(\"target\", true)\n\tif name then\n\t\tSendChatMessage(msg, \"WHISPER\", nil, name)\n\tend\nend\nSLASH_TELLTARGET1 = \"/tt\"\nSLASH_TELLTARGET2 = \"/ее\""
  },
  {
    "path": "ShestakUI/Modules/Cooldowns/DiminishingCD.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true or C.unitframe.show_arena ~= true or C.unitframe.plugins_diminishing ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on Tukui_DrTracker(by Ildyria)\n----------------------------------------------------------------------------------------\nlocal frameposition\nif C.unitframe.arena_on_right == true then\n\tframeposition = {\"TOPRIGHT\", \"TOPLEFT\", -39, 2, \"RIGHT\", \"LEFT\", -3, 0}\nelse\n\tframeposition = {\"TOPLEFT\", \"TOPRIGHT\", 39, 2, \"LEFT\", \"RIGHT\", 3, 0}\nend\nlocal framelist = {\n\t--[FRAME NAME] = {UNITID, SIZE, ANCHOR, ANCHORFRAME, X, Y, \"ANCHORNEXT\", \"ANCHORPREVIOUS\", nextx, nexty},\n\t--[\"oUF_Player\"] = {\"player\", 31, \"TOPRIGHT\", \"TOPLEFT\", -5, 2, \"RIGHT\", \"LEFT\", -3, 0},\n\t[\"oUF_Arena1\"] = {\"arena1\", 31, unpack(frameposition)},\n\t[\"oUF_Arena2\"] = {\"arena2\", 31, unpack(frameposition)},\n\t[\"oUF_Arena3\"] = {\"arena3\", 31, unpack(frameposition)},\n\t[\"oUF_Arena4\"] = {\"arena4\", 31, unpack(frameposition)},\n\t[\"oUF_Arena5\"] = {\"arena5\", 31, unpack(frameposition)},\n}\n\nfunction UpdateDRTracker(self)\n\tlocal time = self.start + 18 - GetTime()\n\n\tif time < 0 then\n\t\tlocal frame = self:GetParent()\n\t\tframe.actives[self.cat] = nil\n\t\tself:SetScript(\"OnUpdate\", nil)\n\t\tDisplayDrActives(frame)\n\tend\nend\n\nfunction DisplayDrActives(self, test)\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType ~= \"arena\" and not test then return end\n\n\tif not self.actives then return end\n\tif not self.auras then self.auras = {} end\n\tlocal index\n\tlocal previous = nil\n\tindex = 1\n\n\tfor _, _ in pairs(self.actives) do\n\t\tlocal aura = self.auras[index]\n\t\tif not aura then\n\t\t\taura = CreateFrame(\"Frame\", \"DrFrame\"..self.target..index, self)\n\t\t\taura:SetTemplate(\"Default\")\n\t\t\taura:SetSize(self.size, self.size)\n\t\t\tif index == 1 then\n\t\t\t\taura:SetPoint(self.anchor, self:GetParent().Health, self.anchorframe, self.x, self.y)\n\t\t\telse\n\t\t\t\taura:SetPoint(self.nextanchor, previous, self.nextanchorframe, self.nextx, self.nexty)\n\t\t\tend\n\n\t\t\taura.icon = aura:CreateTexture(\"$parentIcon\", \"ARTWORK\")\n\t\t\taura.icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\taura.icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\taura.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\taura.cooldown = CreateFrame(\"Cooldown\", \"$parentCD\", aura, \"CooldownFrameTemplate\")\n\t\t\taura.cooldown:SetAllPoints(aura.icon)\n\t\t\taura.cooldown:SetReverse(true)\n\n\t\t\taura.count = aura:CreateFontString(\"$parentCount\", \"OVERLAY\")\n\t\t\taura.count:SetFont(C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)\n\t\t\taura.count:SetPoint(\"BOTTOMRIGHT\", -1, 1)\n\t\t\taura.count:SetJustifyH(\"CENTER\")\n\t\t\taura.cat = \"cat\"\n\t\t\taura.start = 0\n\n\t\t\tself.auras[index] = aura\n\t\tend\n\n\t\tprevious = aura\n\t\tindex = index + 1\n\tend\n\n\tindex = 1\n\tfor cat, value in pairs(self.actives) do\n\t\tlocal aura = self.auras[index]\n\t\taura.icon:SetTexture(value.icon)\n\t\taura.count:SetText(value.dr)\n\t\taura.count:Hide()\n\t\tif value.dr == 1 then\n\t\t\taura:SetBackdropBorderColor(0, 1, 0, 1)\n\t\telseif value.dr == 2 then\n\t\t\taura:SetBackdropBorderColor(1, 0.5, 0, 1)\n\t\telse\n\t\t\taura:SetBackdropBorderColor(1, 0, 0, 1)\n\t\tend\n\t\tCooldownFrame_Set(aura.cooldown, value.start, 18, 1)\n\t\taura.start = value.start\n\t\taura.cat = cat\n\t\taura:SetScript(\"OnUpdate\", UpdateDRTracker)\n\t\taura.cooldown:Show()\n\n\t\taura:Show()\n\t\tindex = index + 1\n\tend\n\n\tfor i = index, #self.auras, 1 do\n\t\tlocal aura = self.auras[i]\n\t\taura:SetScript(\"OnUpdate\", nil)\n\t\taura:Hide()\n\tend\nend\n\nlocal spell = T.DiminishingSpells\nlocal icon = T.DiminishingIcons\nlocal eventRegistered = {\n\t[\"SPELL_AURA_APPLIED\"] = true,\n\t[\"SPELL_AURA_REFRESH\"] = true,\n\t[\"SPELL_AURA_REMOVED\"] = true\n}\n\nlocal function CombatLogCheck(self)\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType ~= \"arena\" then return end\n\tlocal _, eventType, _, _, _, _, _, destGUID, _, _, _, spellID, _, _, auraType = CombatLogGetCurrentEventInfo()\n\tif not eventRegistered[eventType] then return end\n\tif destGUID ~= UnitGUID(self.target) then return end\n\n\tlocal needupdate = false\n\tif eventType == \"SPELL_AURA_APPLIED\" then\n\t\tif auraType == \"DEBUFF\" and spell[spellID] then\n\t\t\tif not self.actives then self.actives = {} end\n\t\t\tfor _, cat in pairs(spell[spellID]) do\n\t\t\t\tif self.actives[cat] then\n\t\t\t\t\tif self.actives[cat].start + 18 < GetTime() then\n\t\t\t\t\t\tself.actives[cat].start = GetTime()\n\t\t\t\t\t\tself.actives[cat].dr = 1\n\t\t\t\t\t\tself.actives[cat].icon = icon[cat]\n\t\t\t\t\telse\n\t\t\t\t\t\tself.actives[cat].start = GetTime()\n\t\t\t\t\t\tself.actives[cat].dr = 2 * self.actives[cat].dr\n\t\t\t\t\t\tself.actives[cat].icon = icon[cat]\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tself.actives[cat] = {}\n\t\t\t\t\tself.actives[cat].start = GetTime()\n\t\t\t\t\tself.actives[cat].dr = 1\n\t\t\t\t\tself.actives[cat].icon = icon[cat]\n\t\t\t\tend\n\t\t\tend\n\t\t\tneedupdate = true\n\t\tend\n\telseif eventType == \"SPELL_AURA_REFRESH\" then\n\t\tif auraType == \"DEBUFF\" and spell[spellID] then\n\t\t\tif not self.actives then self.actives = {} end\n\t\t\tfor _, cat in pairs(spell[spellID]) do\n\t\t\t\tif not self.actives[cat] then\n\t\t\t\t\tself.actives[cat] = {}\n\t\t\t\t\tself.actives[cat].dr = 1\n\t\t\t\tend\n\t\t\t\tself.actives[cat].start = GetTime()\n\t\t\t\tself.actives[cat].dr = 2 * self.actives[cat].dr\n\t\t\t\tself.actives[cat].icon = icon[cat]\n\t\t\tend\n\t\t\tneedupdate = true\n\t\tend\n\telseif eventType == \"SPELL_AURA_REMOVED\" then\n\t\tif auraType == \"DEBUFF\" and spell[spellID] then\n\t\t\tif not self.actives then self.actives = {} end\n\t\t\tfor _, cat in pairs(spell[spellID]) do\n\t\t\t\tif self.actives[cat] then\n\t\t\t\t\tif self.actives[cat].start + 18 < GetTime() then\n\t\t\t\t\t\tself.actives[cat].start = GetTime()\n\t\t\t\t\t\tself.actives[cat].dr = 1\n\t\t\t\t\t\tself.actives[cat].icon = icon[cat]\n\t\t\t\t\telse\n\t\t\t\t\t\tself.actives[cat].start = GetTime()\n\t\t\t\t\t\tself.actives[cat].dr = self.actives[cat].dr\n\t\t\t\t\t\tself.actives[cat].icon = icon[cat]\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tself.actives[cat] = {}\n\t\t\t\t\tself.actives[cat].start = GetTime()\n\t\t\t\t\tself.actives[cat].dr = 1\n\t\t\t\t\tself.actives[cat].icon = icon[cat]\n\t\t\t\tend\n\t\t\tend\n\t\t\tneedupdate = true\n\t\tend\n\tend\n\n\tif needupdate then DisplayDrActives(self) end\nend\n\nfor frame, target in pairs(framelist) do\n\tlocal self = _G[frame]\n\tlocal DrTracker = CreateFrame(\"Frame\", nil, self)\n\tDrTracker:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\n\tDrTracker:SetScript(\"OnEvent\", CombatLogCheck)\n\tDrTracker.target = target[1]\n\tDrTracker.size = target[2]\n\tDrTracker.anchor = target[3]\n\tDrTracker.anchorframe = target[4]\n\tDrTracker.x = target[5]\n\tDrTracker.y = target[6]\n\tDrTracker.nextanchor = target[7]\n\tDrTracker.nextanchorframe = target[8]\n\tDrTracker.nextx = target[9]\n\tDrTracker.nexty = target[10]\n\tself.DrTracker = DrTracker\nend\n\nfor spell in pairs(T.DiminishingSpells) do\n\tlocal name = GetSpellInfo(spell)\n\tif not name then\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(spell)..\"] no longer exists! Report this to Shestak.|r\")\n\tend\nend\n\nlocal function tdr()\n\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\n\tlocal testlist = {\"stun\", \"root\", \"silence\"}\n\n\tfor frame in pairs(framelist) do\n\t\tlocal self = _G[frame].DrTracker\n\t\tif not self.actives then self.actives = {} end\n\t\tlocal dr = 1\n\t\tfor _, cat in pairs(testlist) do\n\t\t\tif not self.actives[cat] then self.actives[cat] = {} end\n\t\t\tself.actives[cat].dr = dr\n\t\t\tself.actives[cat].start = GetTime()\n\t\t\tself.actives[cat].icon = icon[cat]\n\t\t\tdr = dr * 2\n\t\tend\n\t\tDisplayDrActives(self, true)\n\tend\nend\n\nSlashCmdList.DIMINISHINGCD = tdr\nSLASH_DIMINISHINGCD1 = \"/tdr\"\nSLASH_DIMINISHINGCD2 = \"/евк\""
  },
  {
    "path": "ShestakUI/Modules/Cooldowns/EnemyCD.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.enemycooldown.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tEnemy cooldowns(alEnemyCD by Allez)\n----------------------------------------------------------------------------------------\nlocal show = {\n\tnone = C.enemycooldown.show_always,\n\tpvp = C.enemycooldown.show_inpvp,\n\tarena = C.enemycooldown.show_inarena,\n}\nlocal direction = C.enemycooldown.direction\nlocal icons = {}\nlocal band = bit.band\nlocal pos = C.position.enemy_cooldown\nlocal limit = (C.actionbar.button_size * 12)/C.enemycooldown.size\nlocal space = C.filger.cooldown_space\n\nlocal EnemyCDAnchor = CreateFrame(\"Frame\", \"EnemyCDAnchor\", UIParent)\nif C.unitframe.enable ~= true then\n\tEnemyCDAnchor:SetPoint(\"CENTER\", UIParent, \"CENTER\", 0, 0)\nelse\n\tif C.unitframe.plugins_swing == true then\n\t\tEnemyCDAnchor:SetPoint(unpack(C.position.enemy_cooldown))\n\telse\n\t\tEnemyCDAnchor:SetPoint(pos[1], pos[2], pos[3], pos[4], pos[5] - 12)\n\tend\nend\nif direction == \"UP\" or direction == \"DOWN\" then\n\tEnemyCDAnchor:SetSize(C.enemycooldown.size, (C.enemycooldown.size * 5) + 12)\nelse\n\tEnemyCDAnchor:SetSize((C.enemycooldown.size * 5) + 12, C.enemycooldown.size)\nend\n\nlocal OnEnter = function(self)\n\tif IsShiftKeyDown() then\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_RIGHT\")\n\t\tGameTooltip:SetSpellByID(self.sID)\n\t\tGameTooltip:SetClampedToScreen(true)\n\t\tGameTooltip:AddLine(\" \")\n\t\tGameTooltip:AddLine(DONE_BY..\" \"..self.name)\n\t\tGameTooltip:Show()\n\tend\nend\n\nlocal function sortByExpiration(a, b)\n\treturn a.endTime < b.endTime\nend\n\nlocal UpdatePositions = function()\n\tfor i = 1, #icons do\n\t\ticons[i]:ClearAllPoints()\n\t\tif i == 1 then\n\t\t\ticons[i]:SetPoint(\"BOTTOMLEFT\", EnemyCDAnchor, \"BOTTOMLEFT\", 0, 0)\n\t\telseif i < limit then\n\t\t\tif direction == \"UP\" then\n\t\t\t\ticons[i]:SetPoint(\"BOTTOM\", icons[i-1], \"TOP\", 0, space)\n\t\t\telseif direction == \"DOWN\" then\n\t\t\t\ticons[i]:SetPoint(\"TOP\", icons[i-1], \"BOTTOM\", 0, -space)\n\t\t\telseif direction == \"LEFT\" then\n\t\t\t\ticons[i]:SetPoint(\"RIGHT\", icons[i-1], \"LEFT\", -space, 0)\n\t\t\telse\n\t\t\t\ticons[i]:SetPoint(\"LEFT\", icons[i-1], \"RIGHT\", space, 0)\n\t\t\tend\n\t\tend\n\t\tif i < limit then\n\t\t\ticons[i]:SetAlpha(1)\n\t\telse\n\t\t\ticons[i]:SetAlpha(0)\n\t\tend\n\t\ticons[i].id = i\n\tend\nend\n\nlocal StopTimer = function(icon)\n\ticon:SetScript(\"OnUpdate\", nil)\n\ticon:Hide()\n\ttremove(icons, icon.id)\n\tUpdatePositions()\nend\n\nlocal IconUpdate = function(self)\n\tif (self.endTime < GetTime()) then\n\t\tStopTimer(self)\n\tend\nend\n\nlocal CreateIcon = function()\n\tlocal icon = CreateFrame(\"Frame\", nil, UIParent)\n\ticon:SetSize(C.enemycooldown.size, C.enemycooldown.size)\n\ticon:SetTemplate(\"Default\")\n\ticon.Cooldown = CreateFrame(\"Cooldown\", nil, icon, \"CooldownFrameTemplate\")\n\ticon.Cooldown:SetPoint(\"TOPLEFT\", 2, -2)\n\ticon.Cooldown:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\ticon.Cooldown:SetReverse(true)\n\ticon.Texture = icon:CreateTexture(nil, \"BORDER\")\n\ticon.Texture:SetPoint(\"TOPLEFT\", 2, -2)\n\ticon.Texture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\treturn icon\nend\n\nlocal StartTimer = function(sGUID, sID, sName)\n\tlocal _, _, texture = GetSpellInfo(sID)\n\tlocal icon = CreateIcon()\n\ticon.Texture:SetTexture(texture)\n\ticon.Texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\ticon.endTime = GetTime() + T.EnemySpells[sID]\n\tlocal _, class, _, _, _, name = GetPlayerInfoByGUID(sGUID)\n\n\t-- false check for pet\n\tif not class then\n\t\tclass = select(2, UnitClass(sName))\n\t\tname = sName\n\tend\n\n\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]\n\tif color then\n\t\tname = format(\"|cff%02x%02x%02x%s|r\", color.r * 255, color.g * 255, color.b * 255, name)\n\t\tif C.enemycooldown.class_color then\n\t\t\ticon:SetBackdropBorderColor(color.r, color.g, color.b)\n\t\tend\n\tend\n\tfor _, v in pairs(icons) do\n\t\tif v.name == name and v.sID == sID then\n\t\t\tStopTimer(v)\n\t\tend\n\tend\n\ticon.name = name\n\ticon.sID = sID\n\ticon:Show()\n\ticon:SetScript(\"OnUpdate\", IconUpdate)\n\ticon:SetScript(\"OnEnter\", OnEnter)\n\ticon:SetScript(\"OnLeave\", GameTooltip_Hide)\n\tCooldownFrame_Set(icon.Cooldown, GetTime(), T.EnemySpells[sID], 1)\n\ttinsert(icons, icon)\n\ttable.sort(icons, sortByExpiration)\n\tUpdatePositions()\nend\n\nlocal OnEvent = function(_, event)\n\tif event == \"COMBAT_LOG_EVENT_UNFILTERED\" then\n\t\tlocal _, eventType, _, sourceGUID, sourceName, sourceFlags, _, _, _, _, _, spellID = CombatLogGetCurrentEventInfo()\n\n\t\tif eventType == \"SPELL_CAST_SUCCESS\" and sourceName ~= T.name then\n\t\t\tlocal _, instanceType = IsInInstance()\n\t\t\tif show[instanceType] then\n\t\t\t\tif band(sourceFlags, COMBATLOG_OBJECT_REACTION_HOSTILE) ~= 0 then\n\t\t\t\t\tif T.EnemySpells[spellID] then\n\t\t\t\t\t\tStartTimer(sourceGUID, spellID, sourceName)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif instanceType == \"party\" and C.enemycooldown.show_inparty then\n\t\t\t\tif band(sourceFlags, COMBATLOG_OBJECT_AFFILIATION_PARTY) ~= 0 then\n\t\t\t\t\tif T.EnemySpells[spellID] then\n\t\t\t\t\t\tStartTimer(sourceGUID, spellID, sourceName)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif event == \"ZONE_CHANGED_NEW_AREA\" then\n\t\tfor _, v in pairs(icons) do\n\t\t\tv.endTime = 0\n\t\tend\n\tend\nend\n\nfor spell in pairs(T.EnemySpells) do\n\tlocal name = GetSpellInfo(spell)\n\tif not name then\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(spell)..\"] no longer exists! Report this to Shestak.|r\")\n\tend\nend\n\nlocal addon = CreateFrame(\"Frame\")\naddon:SetScript(\"OnEvent\", OnEvent)\naddon:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\naddon:RegisterEvent(\"ZONE_CHANGED_NEW_AREA\")\n\nSlashCmdList.EnemyCD = function()\n\tStartTimer(UnitGUID(T.name), 47528)\n\tStartTimer(UnitGUID(T.name), 19647)\n\tStartTimer(UnitGUID(T.name), 47476)\n\tStartTimer(UnitGUID(T.name), 51514)\nend\nSLASH_EnemyCD1 = \"/enemycd\"\nSLASH_EnemyCD2 = \"/утуьнсв\"\n"
  },
  {
    "path": "ShestakUI/Modules/Cooldowns/PulseCD.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.pulsecooldown.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on Doom Cooldown Pulse(by Woffle of Dark Iron, editor Affli)\n----------------------------------------------------------------------------------------\nlocal GetTime = GetTime\nlocal fadeInTime, fadeOutTime, maxAlpha, elapsed, runtimer = 0.5, 0.7, 1, 0, 0\nlocal animScale, iconSize, holdTime, threshold = C.pulsecooldown.anim_scale, C.pulsecooldown.size, C.pulsecooldown.hold_time, C.pulsecooldown.threshold\nlocal cooldowns, animating, watching = {}, {}, {}\n\nlocal anchor = CreateFrame(\"Frame\", \"PulseCDAnchor\", UIParent)\nanchor:SetSize(C.pulsecooldown.size, C.pulsecooldown.size)\nanchor:SetPoint(unpack(C.position.pulse_cooldown))\n\nlocal frame = CreateFrame(\"Frame\", \"PulseCDFrame\", anchor, \"BackdropTemplate\")\nframe:SetScript(\"OnEvent\", function(self, event, ...) self[event](self, ...) end)\nframe:SetBackdrop({\n\tbgFile = C.media.blank, edgeFile = C.media.blank, edgeSize = T.noscalemult,\n\tinsets = {left = -T.noscalemult, right = -T.noscalemult, top = -T.noscalemult, bottom = -T.noscalemult}\n})\nframe:SetBackdropBorderColor(unpack(C.media.border_color))\nframe:SetBackdropColor(unpack(C.media.backdrop_color))\nframe:SetPoint(\"CENTER\", anchor, \"CENTER\")\n\nlocal icon = frame:CreateTexture(nil, \"ARTWORK\")\nicon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\nicon:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", T.noscalemult * 2, -T.noscalemult * 2)\nicon:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -T.noscalemult * 2, T.noscalemult * 2)\n\n-- Utility Functions\nlocal function tcount(tab)\n\tlocal n = 0\n\tfor _ in pairs(tab) do\n\t\tn = n + 1\n\tend\n\treturn n\nend\n\nlocal function memoize(f)\n    local cache = nil\n\n    local memoized = {}\n\n    local function get()\n        if (cache == nil) then\n            cache = f()\n        end\n\n        return cache\n    end\n\n    memoized.resetCache = function()\n        cache = nil\n    end\n\n    setmetatable(memoized, {__call = get})\n\n    return memoized\nend\n\nlocal function GetPetActionIndexByName(name)\n\tfor i = 1, NUM_PET_ACTION_SLOTS, 1 do\n\t\tif GetPetActionInfo(i) == name then\n\t\t\treturn i\n\t\tend\n\tend\n\treturn nil\nend\n\n-- Cooldown/Animation\nlocal function OnUpdate(_, update)\n\telapsed = elapsed + update\n\tif elapsed > 0.05 then\n\t\tfor i, v in pairs(watching) do\n\t\t\tif GetTime() >= v[1] + 0.5 then\n\t\t\t\tlocal getCooldownDetails\n\t\t\t\tif v[2] == \"spell\" then\n\t\t\t\t\tgetCooldownDetails = memoize(function()\n                        local start, duration, enabled = GetSpellCooldown(v[3])\n                        return {\n                            name = GetSpellInfo(v[3]),\n                            texture = GetSpellTexture(v[3]),\n                            start = start,\n                            duration = duration,\n                            enabled = enabled\n                        }\n                    end)\n\t\t\t\telseif v[2] == \"item\" then\n\t\t\t\t\tgetCooldownDetails = memoize(function()\n                        local start, duration, enabled = GetItemCooldown(i)\n                        return {\n                            name = GetItemInfo(i),\n                            texture = v[3],\n                            start = start,\n                            duration = duration,\n                            enabled = enabled\n                        }\n                    end)\n\t\t\t\telseif v[2] == \"pet\" then\n\t\t\t\t\tgetCooldownDetails = memoize(function()\n                        local name, texture = GetPetActionInfo(v[3])\n                        local start, duration, enabled = GetPetActionCooldown(v[3])\n                        return {\n                            name = name,\n                            texture = texture,\n                            isPet = true,\n                            start = start,\n                            duration = duration,\n                            enabled = enabled\n                        }\n                    end)\n\t\t\t\tend\n\t\t\t\tlocal cooldown = getCooldownDetails()\n\t\t\t\tif T.pulse_ignored_spells[cooldown.name] then\n\t\t\t\t\twatching[i] = nil\n\t\t\t\telse\n\t\t\t\t\tif cooldown.enabled ~= 0 then\n                        if cooldown.duration and cooldown.duration > threshold and cooldown.texture then\n                            cooldowns[i] = getCooldownDetails\n                        end\n                    end\n                    if not (cooldown.enabled == 0 and v[2] == \"spell\") then\n                        watching[i] = nil\n                    end\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tfor i, getCooldownDetails in pairs(cooldowns) do\n            local cooldown = getCooldownDetails()\n            local remaining = cooldown.duration - (GetTime() - cooldown.start)\n            if remaining <= 0 then\n                tinsert(animating, {cooldown.texture, cooldown.isPet, cooldown.name})\n                cooldowns[i] = nil\n            end\n        end\n\n\t\telapsed = 0\n\t\tif #animating == 0 and tcount(watching) == 0 and tcount(cooldowns) == 0 then\n\t\t\tframe:SetScript(\"OnUpdate\", nil)\n\t\t\treturn\n\t\tend\n\tend\n\n\tif #animating > 0 then\n\t\truntimer = runtimer + update\n\t\tif runtimer > (fadeInTime + holdTime + fadeOutTime) then\n\t\t\ttremove(animating, 1)\n\t\t\truntimer = 0\n\t\t\ticon:SetTexture(nil)\n\t\t\tframe:SetBackdropBorderColor(0, 0, 0, 0)\n\t\t\tframe:SetBackdropColor(0, 0, 0, 0)\n\t\telse\n\t\t\tif not icon:GetTexture() then\n\t\t\t\ticon:SetTexture(animating[1][1])\n\t\t\t\tif C.pulsecooldown.sound == true then\n\t\t\t\t\tPlaySoundFile(C.media.proc_sound, \"Master\")\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal alpha = maxAlpha\n\t\t\tif runtimer < fadeInTime then\n\t\t\t\talpha = maxAlpha * (runtimer / fadeInTime)\n\t\t\telseif runtimer >= fadeInTime + holdTime then\n\t\t\t\talpha = maxAlpha - (maxAlpha * ((runtimer - holdTime - fadeInTime) / fadeOutTime))\n\t\t\tend\n\t\t\tframe:SetAlpha(alpha)\n\t\t\tlocal scale = iconSize + (iconSize * ((animScale - 1) * (runtimer / (fadeInTime + holdTime + fadeOutTime))))\n\t\t\tframe:SetWidth(scale)\n\t\t\tframe:SetHeight(scale)\n\t\t\tframe:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tframe:SetBackdropColor(unpack(C.media.backdrop_color))\n\t\tend\n\tend\nend\n\n-- Event Handlers\nfunction frame:ADDON_LOADED()\n\tfor _, v in pairs(T.pulse_ignored_spells) do\n\t\tT.pulse_ignored_spells[v] = true\n\tend\n\tself:UnregisterEvent(\"ADDON_LOADED\")\nend\nframe:RegisterEvent(\"ADDON_LOADED\")\n\nfunction frame:SPELL_UPDATE_COOLDOWN()\n    for _, getCooldownDetails in pairs(cooldowns) do\n        getCooldownDetails.resetCache()\n    end\nend\nframe:RegisterEvent(\"SPELL_UPDATE_COOLDOWN\")\n\nfunction frame:UNIT_SPELLCAST_SUCCEEDED(unit, _, spellID)\n\tif unit == \"player\" then\n\t\tlocal texture = GetSpellTexture(spellID)\n\t\tlocal t1 = GetInventoryItemTexture(\"player\", 13)\n\t\tlocal t2 = GetInventoryItemTexture(\"player\", 14)\n\t\tif texture == t1 or texture == t2 then return end -- Fix wrong buff cd for trinket\n\t\twatching[spellID] = {GetTime(), \"spell\", spellID}\n\t\tself:SetScript(\"OnUpdate\", OnUpdate)\n\tend\nend\nframe:RegisterEvent(\"UNIT_SPELLCAST_SUCCEEDED\")\n\nfunction frame:COMBAT_LOG_EVENT_UNFILTERED()\n\tlocal _, eventType, _, _, _, sourceFlags, _, _, _, _, _, spellID = CombatLogGetCurrentEventInfo()\n\tif eventType == \"SPELL_CAST_SUCCESS\" then\n\t\tif (bit.band(sourceFlags, COMBATLOG_OBJECT_TYPE_PET) == COMBATLOG_OBJECT_TYPE_PET and bit.band(sourceFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE) then\n\t\t\tlocal name = GetSpellInfo(spellID)\n\t\t\tlocal index = GetPetActionIndexByName(name)\n\t\t\tif index and not select(7, GetPetActionInfo(index)) then\n\t\t\t\twatching[spellID] = {GetTime(), \"pet\", index}\n\t\t\telseif not index and spellID then\n\t\t\t\twatching[spellID] = {GetTime(), \"spell\", spellID}\n\t\t\telse\n\t\t\t\treturn\n\t\t\tend\n\t\t\tself:SetScript(\"OnUpdate\", OnUpdate)\n\t\tend\n\tend\nend\nframe:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\n\nfunction frame:PLAYER_ENTERING_WORLD()\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType == \"arena\" then\n\t\tself:SetScript(\"OnUpdate\", nil)\n\t\twipe(cooldowns)\n\t\twipe(watching)\n\tend\nend\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\nhooksecurefunc(\"UseAction\", function(slot)\n\tlocal actionType, itemID = GetActionInfo(slot)\n\tif actionType == \"item\" then\n\t\tlocal texture = GetActionTexture(slot)\n\t\twatching[itemID] = {GetTime(), \"item\", texture}\n\tend\nend)\n\nhooksecurefunc(\"UseInventoryItem\", function(slot)\n\tlocal itemID = GetInventoryItemID(\"player\", slot)\n\tif itemID then\n\t\tlocal texture = GetInventoryItemTexture(\"player\", slot)\n\t\twatching[itemID] = {GetTime(), \"item\", texture}\n\tend\nend)\n\nSlashCmdList.PulseCD = function()\n\ttinsert(animating, {GetSpellTexture(87214)})\n\tif C.pulsecooldown.sound == true then\n\t\tPlaySoundFile(C.media.proc_sound, \"Master\")\n\tend\n\tframe:SetScript(\"OnUpdate\", OnUpdate)\nend\nSLASH_PulseCD1 = \"/pulsecd\"\nSLASH_PulseCD2 = \"/згдыусв\""
  },
  {
    "path": "ShestakUI/Modules/Cooldowns/RaidCD.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.raidcooldown.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tRaid cooldowns(alRaidCD by Allez, msylgj0@NGACN)\n----------------------------------------------------------------------------------------\nlocal show = {\n\traid = C.raidcooldown.show_inraid,\n\tparty = C.raidcooldown.show_inparty,\n\tarena = C.raidcooldown.show_inarena,\n}\n\nlocal filter = COMBATLOG_OBJECT_AFFILIATION_RAID + COMBATLOG_OBJECT_AFFILIATION_PARTY + COMBATLOG_OBJECT_AFFILIATION_MINE\nlocal band = bit.band\nlocal sformat = string.format\nlocal floor = math.floor\nlocal currentNumResses = 0\nlocal charges = nil\nlocal inBossCombat = nil\nlocal Ressesbars = {}\nlocal bars = {}\n\nlocal RaidCDAnchor = CreateFrame(\"Frame\", \"RaidCDAnchor\", UIParent)\nRaidCDAnchor:SetPoint(unpack(C.position.raid_cooldown))\nif C.raidcooldown.show_icon == true then\n\tRaidCDAnchor:SetSize(C.raidcooldown.width + 32, C.raidcooldown.height + 10)\nelse\n\tRaidCDAnchor:SetSize(C.raidcooldown.width + 32, C.raidcooldown.height + 4)\nend\n\nlocal FormatTime = function(time)\n\tif time >= 60 then\n\t\treturn sformat(\"%.2d:%.2d\", floor(time / 60), time % 60)\n\telse\n\t\treturn sformat(\"%.2d\", time)\n\tend\nend\n\nlocal function sortByExpiration(a, b)\n\treturn a.endTime > b.endTime\nend\n\nlocal CreateFS = function(frame)\n\tlocal fstring = frame:CreateFontString(nil, \"OVERLAY\")\n\tfstring:SetFont(C.font.raid_cooldowns_font, C.font.raid_cooldowns_font_size, C.font.raid_cooldowns_font_style)\n\tfstring:SetShadowOffset(C.font.raid_cooldowns_font_shadow and 1 or 0, C.font.raid_cooldowns_font_shadow and -1 or 0)\n\treturn fstring\nend\n\nlocal UpdatePositions = function()\n\tif charges and Ressesbars[1] then\n\t\tRessesbars[1]:SetPoint(\"TOPRIGHT\", RaidCDAnchor, \"TOPRIGHT\", -2, C.raidcooldown.show_icon and -8 or -2)\n\t\tRessesbars[1].id = 1\n\t\tfor i = 1, #bars do\n\t\t\tbars[i]:ClearAllPoints()\n\t\t\tif i == 1 then\n\t\t\t\tif C.raidcooldown.upwards == true then\n\t\t\t\t\tbars[i]:SetPoint(\"BOTTOMRIGHT\", Ressesbars[1], \"TOPRIGHT\", 0, 13)\n\t\t\t\telse\n\t\t\t\t\tbars[i]:SetPoint(\"TOPRIGHT\", Ressesbars[1], \"BOTTOMRIGHT\", 0, -13)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif C.raidcooldown.upwards == true then\n\t\t\t\t\tbars[i]:SetPoint(\"BOTTOMRIGHT\", bars[i-1], \"TOPRIGHT\", 0, 13)\n\t\t\t\telse\n\t\t\t\t\tbars[i]:SetPoint(\"TOPRIGHT\", bars[i-1], \"BOTTOMRIGHT\", 0, -13)\n\t\t\t\tend\n\t\t\tend\n\t\t\tbars[i].id = i\n\t\tend\n\telse\n\t\tfor i = 1, #bars do\n\t\t\tbars[i]:ClearAllPoints()\n\t\t\tif i == 1 then\n\t\t\t\tbars[i]:SetPoint(\"TOPRIGHT\", RaidCDAnchor, \"TOPRIGHT\", -2, C.raidcooldown.show_icon and -8 or -2)\n\t\t\telse\n\t\t\t\tif C.raidcooldown.upwards == true then\n\t\t\t\t\tbars[i]:SetPoint(\"BOTTOMRIGHT\", bars[i-1], \"TOPRIGHT\", 0, 13)\n\t\t\t\telse\n\t\t\t\t\tbars[i]:SetPoint(\"TOPRIGHT\", bars[i-1], \"BOTTOMRIGHT\", 0, -13)\n\t\t\t\tend\n\t\t\tend\n\t\t\tbars[i].id = i\n\t\tend\n\tend\nend\n\nlocal StopTimer = function(bar)\n\tbar:SetScript(\"OnUpdate\", nil)\n\tbar:Hide()\n\tif bar.isResses then\n\t\ttremove(Ressesbars, bar.id)\n\telse\n\t\ttremove(bars, bar.id)\n\tend\n\tUpdatePositions()\nend\n\nlocal UpdateCharges = function(bar)\n\tlocal curCharges, maxCharges, start, duration = GetSpellCharges(20484)\n\tif curCharges == maxCharges then\n\t\tbar.startTime = 0\n\t\tbar.endTime = GetTime()\n\telse\n\t\tbar.startTime = start\n\t\tbar.endTime = start + duration\n\tend\n\tif curCharges ~= currentNumResses then\n\t\tcurrentNumResses = curCharges\n\t\tbar.left:SetText(bar.name..\" : \"..currentNumResses)\n\tend\nend\n\nlocal BarUpdate = function(self)\n\tlocal curTime = GetTime()\n\tif self.endTime < curTime then\n\t\tif self.isResses then\n\t\t\tUpdateCharges(self)\n\t\telse\n\t\t\tStopTimer(self)\n\t\t\treturn\n\t\tend\n\tend\n\tself:SetValue(100 - (curTime - self.startTime) / (self.endTime - self.startTime) * 100)\n\tself.right:SetText(FormatTime(self.endTime - curTime))\nend\n\nlocal OnEnter = function(self)\n\tGameTooltip:SetOwner(self, \"ANCHOR_RIGHT\")\n\tGameTooltip:SetSpellByID(self.spellId)\n\tGameTooltip:AddLine(\" \")\n\tGameTooltip:AddDoubleLine(self.left:GetText(), self.right:GetText())\n\tGameTooltip:SetClampedToScreen(true)\n\tGameTooltip:Show()\nend\n\nlocal OnLeave = function()\n\tGameTooltip:Hide()\nend\n\nlocal OnMouseDown = function(self, button)\n\tif button == \"LeftButton\" then\n\t\tif self.isResses then\n\t\t\tSendChatMessage(sformat(L_COOLDOWNS_COMBATRESS_REMAINDER..\"%d, \"..L_COOLDOWNS_NEXTTIME..\"%s.\", currentNumResses, self.right:GetText()), T.CheckChat())\n\t\telse\n\t\t\tSendChatMessage(sformat(L_COOLDOWNS..\"%s - %s: %s\", self.name, GetSpellLink(self.spellId), self.right:GetText()), T.CheckChat())\n\t\tend\n\telseif button == \"RightButton\" then\n\t\tStopTimer(self)\n\tend\nend\n\nlocal barWidth = C.raidcooldown.width + (C.raidcooldown.show_icon and 0 or 28)\nlocal CreateBar = function()\n\tlocal bar = CreateFrame(\"Statusbar\", nil, UIParent)\n\tbar:SetFrameStrata(\"MEDIUM\")\n\tbar:SetSize(barWidth, C.raidcooldown.height)\n\tbar:SetStatusBarTexture(C.media.texture)\n\tbar:SetMinMaxValues(0, 100)\n\tbar:CreateBackdrop(\"Default\")\n\n\tbar.bg = bar:CreateTexture(nil, \"BACKGROUND\")\n\tbar.bg:SetAllPoints(bar)\n\tbar.bg:SetTexture(C.media.texture)\n\n\tbar.left = CreateFS(bar)\n\tbar.left:SetPoint(\"LEFT\", 2, 0)\n\tbar.left:SetJustifyH(\"LEFT\")\n\tbar.left:SetSize(barWidth - 30 - ((C.font.raid_cooldowns_font_size - 8) * 2), C.font.raid_cooldowns_font_size)\n\n\tbar.right = CreateFS(bar)\n\tbar.right:SetPoint(\"RIGHT\", 1, 0)\n\tbar.right:SetJustifyH(\"RIGHT\")\n\n\tif C.raidcooldown.show_icon == true then\n\t\tbar.icon = CreateFrame(\"Button\", nil, bar)\n\t\tbar.icon:SetWidth(bar:GetHeight() + 6)\n\t\tbar.icon:SetHeight(bar.icon:GetWidth())\n\t\tbar.icon:SetPoint(\"BOTTOMRIGHT\", bar, \"BOTTOMLEFT\", -7, 0)\n\t\tbar.icon:CreateBackdrop(\"Default\")\n\tend\n\treturn bar\nend\n\nlocal StartTimer = function(name, spellId)\n\tlocal spell, _, icon = GetSpellInfo(spellId)\n\tif charges and spellId == 20484 then\n\t\tfor _, v in pairs(Ressesbars) do\n\t\t\tUpdateCharges(v)\n\t\t\treturn\n\t\tend\n\tend\n\tfor _, v in pairs(bars) do\n\t\tif v.name == name and v.spell == spell then\n\t\t\tStopTimer(v)\n\t\tend\n\tend\n\tlocal bar = CreateBar()\n\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[select(2, UnitClass(name))]\n\tif charges and spellId == 20484 then\n\t\tlocal curCharges, _, start, duration = GetSpellCharges(20484)\n\t\tcurrentNumResses = curCharges\n\t\tbar.startTime = start\n\t\tbar.endTime = start + duration\n\t\tbar.left:SetText(name..\" : \"..curCharges)\n\t\tbar.right:SetText(FormatTime(duration))\n\t\tbar.isResses = true\n\t\tbar.name = name\n\t\tbar.spell = spell\n\t\tbar.spellId = spellId\n\t\tif C.raidcooldown.show_icon == true then\n\t\t\tbar.icon:SetNormalTexture(icon)\n\t\t\tbar.icon:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tend\n\t\tbar:Show()\n\t\tif color then\n\t\t\tbar:SetStatusBarColor(color.r, color.g, color.b)\n\t\t\tbar.bg:SetVertexColor(color.r, color.g, color.b, 0.2)\n\t\telse\n\t\t\tif curCharges and curCharges > 0 then\n\t\t\t\tbar:SetStatusBarColor(0.3, 0.7, 0.3)\n\t\t\t\tbar.bg:SetVertexColor(0.3, 0.7, 0.3, 0.2)\n\t\t\telse\n\t\t\t\tbar:SetStatusBarColor(0.8, 0.3, 0.3)\n\t\t\t\tbar.bg:SetVertexColor(0.8, 0.3, 0.3, 0.2)\n\t\t\tend\n\t\tend\n\n\t\tbar:SetScript(\"OnUpdate\", BarUpdate)\n\t\tbar:EnableMouse(true)\n\t\tbar:SetScript(\"OnEnter\", OnEnter)\n\t\tbar:SetScript(\"OnLeave\", OnLeave)\n\t\tbar:SetScript(\"OnMouseDown\", OnMouseDown)\n\t\ttinsert(Ressesbars, bar)\n\t\tif C.raidcooldown.expiration == true then\n\t\t\ttable.sort(Ressesbars, sortByExpiration)\n\t\tend\n\telse\n\t\tbar.startTime = GetTime()\n\t\tbar.endTime = GetTime() + T.RaidSpells[spellId]\n\t\tbar.left:SetText(format(\"%s - %s\", name:gsub(\"%-[^|]+\", \"\"), spell))\n\t\tbar.right:SetText(FormatTime(T.RaidSpells[spellId]))\n\t\tbar.isResses = false\n\t\tbar.name = name\n\t\tbar.spell = spell\n\t\tbar.spellId = spellId\n\t\tif C.raidcooldown.show_icon == true then\n\t\t\tbar.icon:SetNormalTexture(icon)\n\t\t\tbar.icon:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tend\n\t\tbar:Show()\n\t\tif spellId == 264667 then color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[\"HUNTER\"] end -- Change color for Hunter's pet\n\t\tif color then\n\t\t\tbar:SetStatusBarColor(color.r, color.g, color.b)\n\t\t\tbar.bg:SetVertexColor(color.r, color.g, color.b, 0.2)\n\t\telse\n\t\t\tbar:SetStatusBarColor(0.3, 0.7, 0.3)\n\t\t\tbar.bg:SetVertexColor(0.3, 0.7, 0.3, 0.2)\n\t\tend\n\n\t\tbar:SetScript(\"OnUpdate\", BarUpdate)\n\t\tbar:EnableMouse(true)\n\t\tbar:SetScript(\"OnEnter\", OnEnter)\n\t\tbar:SetScript(\"OnLeave\", OnLeave)\n\t\tbar:SetScript(\"OnMouseDown\", OnMouseDown)\n\t\ttinsert(bars, bar)\n\t\tif C.raidcooldown.expiration == true then\n\t\t\ttable.sort(bars, sortByExpiration)\n\t\tend\n\tend\n\tUpdatePositions()\nend\n\nlocal OnEvent = function(self, event)\n\tif event == \"PLAYER_ENTERING_WORLD\" or event == \"ZONE_CHANGED_NEW_AREA\" then\n\t\tif (select(2, IsInInstance()) == \"raid\" or select(2, IsInInstance()) == \"party\") and IsInGroup() then\n\t\t\tself:RegisterEvent(\"SPELL_UPDATE_CHARGES\")\n\t\telse\n\t\t\tself:UnregisterEvent(\"SPELL_UPDATE_CHARGES\")\n\t\t\tcharges = nil\n\t\t\tinBossCombat = nil\n\t\t\tcurrentNumResses = 0\n\t\t\tRessesbars = {}\n\t\tend\n\tend\n\tif event == \"SPELL_UPDATE_CHARGES\" then\n\t\tcharges = GetSpellCharges(20484)\n\t\tif charges then\n\t\t\tif not inBossCombat then\n\t\t\t\tinBossCombat = true\n\t\t\tend\n\t\t\tStartTimer(L_COOLDOWNS_COMBATRESS, 20484)\n\t\telseif not charges and inBossCombat then\n\t\t\tinBossCombat = nil\n\t\t\tcurrentNumResses = 0\n\t\t\tfor _, v in pairs(Ressesbars) do\n\t\t\t\tStopTimer(v)\n\t\t\tend\n\t\tend\n\tend\n\tif event == \"COMBAT_LOG_EVENT_UNFILTERED\" then\n\t\tlocal _, eventType, _, _, sourceName, sourceFlags, _, _, _, _, _, spellId = CombatLogGetCurrentEventInfo()\n\t\tif band(sourceFlags, filter) == 0 then return end\n\t\tif eventType == \"SPELL_RESURRECT\" or eventType == \"SPELL_CAST_SUCCESS\" or eventType == \"SPELL_AURA_APPLIED\" then\n\t\t\tif sourceName then\n\t\t\t\tsourceName = sourceName:gsub(\"-.+\", \"\")\n\t\t\telse\n\t\t\t\treturn\n\t\t\tend\n\t\t\tif T.RaidSpells[spellId] and show[select(2, IsInInstance())] and IsInGroup() then\n\t\t\t\tif (sourceName == T.name and C.raidcooldown.show_self == true) or sourceName ~= T.name then\n\t\t\t\t\tStartTimer(sourceName, spellId)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif event == \"ZONE_CHANGED_NEW_AREA\" and select(2, IsInInstance()) == \"arena\" or not IsInGroup() then\n\t\tfor _, v in pairs(Ressesbars) do\n\t\t\tStopTimer(v)\n\t\tend\n\t\tfor _, v in pairs(bars) do\n\t\t\tv.endTime = 0\n\t\tend\n\telseif event == \"ENCOUNTER_END\" and select(2, IsInInstance()) == \"raid\" then\n\t\tfor _, v in pairs(bars) do\n\t\t\tv.endTime = 0\n\t\tend\n\tend\nend\n\nfor spell in pairs(T.RaidSpells) do\n\tlocal name = GetSpellInfo(spell)\n\tif not name then\n\t\tprint(\"|cffff0000WARNING: spell ID [\"..tostring(spell)..\"] no longer exists! Report this to Shestak.|r\")\n\tend\nend\n\nlocal f = CreateFrame(\"Frame\")\nf:SetScript(\"OnEvent\", OnEvent)\nf:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nf:RegisterEvent(\"COMBAT_LOG_EVENT_UNFILTERED\")\nf:RegisterEvent(\"ZONE_CHANGED_NEW_AREA\")\nf:RegisterEvent(\"ENCOUNTER_END\")\n\nSlashCmdList.RaidCD = function()\n\tStartTimer(UnitName(\"player\"), 20484)\t-- Rebirth\n\tStartTimer(UnitName(\"player\"), 20707)\t-- Soulstone\n\tStartTimer(UnitName(\"player\"), 108280)\t-- Healing Tide Totem\nend\nSLASH_RaidCD1 = \"/raidcd\"\nSLASH_RaidCD2 = \"/кфшвсв\""
  },
  {
    "path": "ShestakUI/Modules/Loot/AutoConfirm.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.loot.auto_confirm_de ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tDisenchant confirmation(tekKrush by Tekkub)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"CONFIRM_DISENCHANT_ROLL\")\nframe:RegisterEvent(\"CONFIRM_LOOT_ROLL\")\nframe:RegisterEvent(\"LOOT_BIND_CONFIRM\")\nframe:SetScript(\"OnEvent\", function()\n\tfor i = 1, STATICPOPUP_NUMDIALOGS do\n\t\tlocal frame = _G[\"StaticPopup\"..i]\n\t\tif (frame.which == \"CONFIRM_LOOT_ROLL\" or frame.which == \"LOOT_BIND\") and frame:IsVisible() then\n\t\t\tStaticPopup_OnClick(frame, 1)\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Loot/AutoGreed.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.loot.auto_greed ~= true or T.level ~= MAX_PLAYER_LEVEL then return end\n\n----------------------------------------------------------------------------------------\n--\tAuto greed/disenchant on green items(by Tekkub)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"START_LOOT_ROLL\")\nframe:SetScript(\"OnEvent\", function(_, _, id)\n\tlocal _, _, _, quality, BoP, _, _, canDisenchant = GetLootRollItemInfo(id)\n\tif id and quality == 2 and not BoP then\n\t\tlocal link = GetLootRollItemLink(id)\n\t\tlocal _, _, _, ilevel = GetItemInfo(link)\n\t\tif canDisenchant and ilevel > 270 then\n\t\t\tRollOnLoot(id, 3)\n\t\telse\n\t\t\tRollOnLoot(id, 2)\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Loot/FasterLoot.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.loot.faster_loot ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tFaster auto looting\n----------------------------------------------------------------------------------------\nlocal tDelay = 0\nlocal LOOT_DELAY = 0.3\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"LOOT_READY\")\nframe:SetScript(\"OnEvent\", function ()\n\tif GetCVarBool(\"autoLootDefault\") ~= IsModifiedClick(\"AUTOLOOTTOGGLE\") then\n\t\tif (GetTime() - tDelay) >= LOOT_DELAY then\n\t\t\tfor i = GetNumLootItems(), 1, -1 do\n\t\t\t\tLootSlot(i)\n\t\t\tend\n\t\t\ttDelay = GetTime()\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Loot/GroupLoot.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.loot.rolllootframe ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on teksLoot(by Tekkub)\n----------------------------------------------------------------------------------------\nlocal pos = \"TOP\"\nlocal frames = {}\nlocal cancelled_rolls = {}\nlocal rolltypes = {\"need\", \"greed\", \"disenchant\", [0] = \"pass\"}\n\nlocal LootRollAnchor = CreateFrame(\"Frame\", \"LootRollAnchor\", UIParent)\nLootRollAnchor:SetSize(313, 26)\n\nlocal function ClickRoll(frame)\n\tRollOnLoot(frame.parent.rollID, frame.rolltype)\nend\n\nlocal function HideTip() GameTooltip:Hide() end\nlocal function HideTip2() GameTooltip:Hide() ResetCursor() end\n\nlocal function SetTip(frame)\n\tGameTooltip:SetOwner(frame, \"ANCHOR_TOPLEFT\")\n\tGameTooltip:SetText(frame.tiptext)\n\tif not frame:IsEnabled() then\n\t\tGameTooltip:AddLine(frame.errtext, 1, 0.2, 0.2, 1)\n\tend\n\tfor name, roll in pairs(frame.parent.rolls) do if roll == rolltypes[frame.rolltype] then GameTooltip:AddLine(name, 1, 1, 1) end end\n\tGameTooltip:Show()\nend\n\nlocal function SetItemTip(frame)\n\tif not frame.link then return end\n\tGameTooltip:SetOwner(frame, \"ANCHOR_TOPLEFT\")\n\tGameTooltip:SetHyperlink(frame.link)\n\tif IsShiftKeyDown() then GameTooltip_ShowCompareItem() end\n\tif IsModifiedClick(\"DRESSUP\") then ShowInspectCursor() else ResetCursor() end\nend\n\nlocal function ItemOnUpdate(frame)\n\tif GameTooltip:IsOwned(frame) then\n\t\tif IsShiftKeyDown() then\n\t\t\tGameTooltip_ShowCompareItem()\n\t\telse\n\t\t\tShoppingTooltip1:Hide()\n\t\t\tShoppingTooltip2:Hide()\n\t\tend\n\n\t\tif IsControlKeyDown() then\n\t\t\tShowInspectCursor()\n\t\telse\n\t\t\tResetCursor()\n\t\tend\n\tend\nend\n\nlocal function LootClick(frame)\n\tif IsControlKeyDown() then\n\t\tDressUpItemLink(frame.link)\n\telseif IsShiftKeyDown() then\n\t\tlocal _, item = GetItemInfo(frame.link)\n\t\tif ChatEdit_GetActiveWindow() then\n\t\t\tChatEdit_InsertLink(item)\n\t\telse\n\t\t\tChatFrame_OpenChat(item)\n\t\tend\n\tend\nend\n\nlocal function OnEvent(frame, _, rollID)\n\tcancelled_rolls[rollID] = true\n\tif frame.rollID ~= rollID then return end\n\n\tframe.rollID = nil\n\tframe.time = nil\n\tframe:Hide()\nend\n\nlocal function StatusUpdate(frame)\n\tif not frame.parent.rollID then return end\n\tlocal t = GetLootRollTimeLeft(frame.parent.rollID)\n\tframe:SetValue(t)\nend\n\nlocal function CreateRollButton(parent, ntex, ptex, htex, rolltype, tiptext, ...)\n\tlocal f = CreateFrame(\"Button\", nil, parent)\n\tf:SetPoint(...)\n\tf:SetSize(28, 28)\n\tf:SetNormalTexture(ntex)\n\tif ptex then f:SetPushedTexture(ptex) end\n\tf:SetHighlightTexture(htex)\n\tf.rolltype = rolltype\n\tf.parent = parent\n\tf.tiptext = tiptext\n\tf:SetScript(\"OnEnter\", SetTip)\n\tf:SetScript(\"OnLeave\", HideTip)\n\tf:SetScript(\"OnClick\", ClickRoll)\n\tf:SetMotionScriptsWhileDisabled(true)\n\tlocal txt = f:CreateFontString(nil, nil)\n\ttxt:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)\n\ttxt:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)\n\ttxt:SetPoint(\"CENTER\", 0, rolltype == 2 and 1 or rolltype == 0 and -1.2 or 0)\n\treturn f, txt\nend\n\nlocal function CreateRollFrame()\n\tlocal frame = CreateFrame(\"Frame\", nil, UIParent)\n\tframe:CreateBackdrop(\"Default\")\n\tframe:SetSize(280, 22)\n\tframe:SetFrameStrata(\"MEDIUM\")\n\tframe:SetFrameLevel(10)\n\tframe:SetScript(\"OnEvent\", OnEvent)\n\tframe:RegisterEvent(\"CANCEL_LOOT_ROLL\")\n\tframe:Hide()\n\n\tlocal button = CreateFrame(\"Button\", nil, frame)\n\tbutton:SetPoint(\"LEFT\", -29, 0)\n\tbutton:SetSize(22, 22)\n\tbutton:CreateBackdrop(\"Default\")\n\tbutton:SetScript(\"OnEnter\", SetItemTip)\n\tbutton:SetScript(\"OnLeave\", HideTip2)\n\tbutton:SetScript(\"OnUpdate\", ItemOnUpdate)\n\tbutton:SetScript(\"OnClick\", LootClick)\n\tframe.button = button\n\n\tbutton.icon = button:CreateTexture(nil, \"OVERLAY\")\n\tbutton.icon:SetAllPoints()\n\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\tlocal status = CreateFrame(\"StatusBar\", nil, frame)\n\tstatus:SetSize(326, 20)\n\tstatus:SetPoint(\"TOPLEFT\", 0, 0)\n\tstatus:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\tstatus:SetScript(\"OnUpdate\", StatusUpdate)\n\tstatus:SetFrameLevel(status:GetFrameLevel() - 1)\n\tstatus:SetStatusBarTexture(C.media.texture)\n\tstatus:SetStatusBarColor(0.8, 0.8, 0.8, 0.9)\n\tstatus.parent = frame\n\tframe.status = status\n\n\tstatus.bg = status:CreateTexture(nil, \"BACKGROUND\")\n\tstatus.bg:SetAlpha(0.1)\n\tstatus.bg:SetAllPoints()\n\tstatus.bg:SetDrawLayer(\"BACKGROUND\", 2)\n\n\tlocal need, needtext = CreateRollButton(frame, \"Interface\\\\Buttons\\\\UI-GroupLoot-Dice-Up\", \"Interface\\\\Buttons\\\\UI-GroupLoot-Dice-Highlight\", \"Interface\\\\Buttons\\\\UI-GroupLoot-Dice-Down\", 1, NEED, \"LEFT\", frame.button, \"RIGHT\", 5, -1)\n\tlocal greed, greedtext = CreateRollButton(frame, \"Interface\\\\Buttons\\\\UI-GroupLoot-Coin-Up\", \"Interface\\\\Buttons\\\\UI-GroupLoot-Coin-Highlight\", \"Interface\\\\Buttons\\\\UI-GroupLoot-Coin-Down\", 2, GREED, \"LEFT\", need, \"RIGHT\", 0, -1)\n\tlocal de, detext = CreateRollButton(frame, \"Interface\\\\Buttons\\\\UI-GroupLoot-DE-Up\", \"Interface\\\\Buttons\\\\UI-GroupLoot-DE-Highlight\", \"Interface\\\\Buttons\\\\UI-GroupLoot-DE-Down\", 3, ROLL_DISENCHANT, \"LEFT\", greed, \"RIGHT\", 0, -1)\n\tlocal pass, passtext = CreateRollButton(frame, \"Interface\\\\Buttons\\\\UI-GroupLoot-Pass-Up\", nil, \"Interface\\\\Buttons\\\\UI-GroupLoot-Pass-Down\", 0, PASS, \"LEFT\", de or greed, \"RIGHT\", 0, 2.2)\n\tframe.needbutt, frame.greedbutt, frame.disenchantbutt = need, greed, de\n\tframe.need, frame.greed, frame.pass, frame.disenchant = needtext, greedtext, passtext, detext\n\n\tlocal bind = frame:CreateFontString()\n\tbind:SetPoint(\"LEFT\", pass, \"RIGHT\", 3, 1)\n\tbind:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)\n\tbind:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)\n\tframe.fsbind = bind\n\n\tlocal loot = frame:CreateFontString(nil, \"ARTWORK\")\n\tloot:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)\n\tloot:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)\n\tloot:SetPoint(\"LEFT\", bind, \"RIGHT\", 0, 0)\n\tloot:SetPoint(\"RIGHT\", frame, \"RIGHT\", -5, 0)\n\tloot:SetSize(200, 10)\n\tloot:SetJustifyH(\"LEFT\")\n\tframe.fsloot = loot\n\n\tframe.rolls = {}\n\n\treturn frame\nend\n\nlocal function GetFrame()\n\tfor _, f in ipairs(frames) do\n\t\tif not f.rollID then return f end\n\tend\n\n\tlocal f = CreateRollFrame()\n\tif pos == \"TOP\" then\n\t\tf:SetPoint(\"TOPRIGHT\", next(frames) and frames[#frames] or LootRollAnchor, \"BOTTOMRIGHT\", next(frames) and 0 or -2, next(frames) and -7 or -5)\n\telse\n\t\tf:SetPoint(\"BOTTOMRIGHT\", next(frames) and frames[#frames] or LootRollAnchor, \"TOPRIGHT\", next(frames) and 0 or -2, next(frames) and 7 or 5)\n\tend\n\ttable.insert(frames, f)\n\treturn f\nend\n\nlocal function FindFrame(rollID)\n\tfor _, f in ipairs(frames) do\n\t\tif f.rollID == rollID then return f end\n\tend\nend\n\nlocal typemap = {[0] = \"pass\", \"need\", \"greed\", \"disenchant\"}\nlocal function UpdateRoll(i, rolltype)\n\tlocal num = 0\n\tlocal rollID, _, numPlayers, isDone = C_LootHistory.GetItem(i)\n\n\tif isDone or not numPlayers then return end\n\n\tlocal f = FindFrame(rollID)\n\tif not f then return end\n\n\tfor j = 1, numPlayers do\n\t\tlocal name, _, thisrolltype = C_LootHistory.GetPlayerInfo(i, j)\n\t\tf.rolls[name] = typemap[thisrolltype]\n\t\tif rolltype == thisrolltype then num = num + 1 end\n\tend\n\n\tf[typemap[rolltype]]:SetText(num)\nend\n\nlocal function START_LOOT_ROLL(rollID, time)\n\tif cancelled_rolls[rollID] then return end\n\n\tlocal f = GetFrame()\n\tf.rollID = rollID\n\tf.time = time\n\tfor i in pairs(f.rolls) do f.rolls[i] = nil end\n\tf.need:SetText(0)\n\tf.greed:SetText(0)\n\tf.pass:SetText(0)\n\tf.disenchant:SetText(0)\n\n\tlocal texture, name, _, quality, bop, canNeed, canGreed, canDisenchant, reasonNeed, reasonGreed, reasonDisenchant, deSkillRequired = GetLootRollItemInfo(rollID)\n\tf.button.icon:SetTexture(texture)\n\tf.button.link = GetLootRollItemLink(rollID)\n\n\tif C.loot.auto_greed and T.level == MAX_PLAYER_LEVEL and quality == 2 and not bop then return end\n\n\tif canNeed then\n\t\tf.needbutt:Enable()\n\t\tf.needbutt:SetAlpha(1)\n\t\tSetDesaturation(f.needbutt:GetNormalTexture(), false)\n\telse\n\t\tf.needbutt:Disable()\n\t\tf.needbutt:SetAlpha(0.2)\n\t\tSetDesaturation(f.needbutt:GetNormalTexture(), true)\n\t\tf.needbutt.errtext = _G[\"LOOT_ROLL_INELIGIBLE_REASON\"..reasonNeed]\n\tend\n\n\tif canGreed then\n\t\tf.greedbutt:Enable()\n\t\tf.greedbutt:SetAlpha(1)\n\t\tSetDesaturation(f.greedbutt:GetNormalTexture(), false)\n\telse\n\t\tf.greedbutt:Disable()\n\t\tf.greedbutt:SetAlpha(0.2)\n\t\tSetDesaturation(f.greedbutt:GetNormalTexture(), true)\n\t\tf.greedbutt.errtext = _G[\"LOOT_ROLL_INELIGIBLE_REASON\"..reasonGreed]\n\tend\n\n\tif canDisenchant then\n\t\tf.disenchantbutt:Enable()\n\t\tf.disenchantbutt:SetAlpha(1)\n\t\tSetDesaturation(f.disenchantbutt:GetNormalTexture(), false)\n\telse\n\t\tf.disenchantbutt:Disable()\n\t\tf.disenchantbutt:SetAlpha(0.2)\n\t\tSetDesaturation(f.disenchantbutt:GetNormalTexture(), true)\n\t\tf.disenchantbutt.errtext = format(_G[\"LOOT_ROLL_INELIGIBLE_REASON\"..reasonDisenchant], deSkillRequired)\n\tend\n\n\tf.fsbind:SetText(bop and \"BoP\" or \"BoE\")\n\tf.fsbind:SetVertexColor(bop and 1 or 0.3, bop and 0.3 or 1, bop and 0.1 or 0.3)\n\n\tlocal color = ITEM_QUALITY_COLORS[quality]\n\tf.fsloot:SetText(name)\n\tf.fsloot:SetVertexColor(color.r, color.g, color.b)\n\n\tf.status:SetStatusBarColor(color.r, color.g, color.b, 0.7)\n\tf.status.bg:SetColorTexture(color.r, color.g, color.b)\n\n\tf.backdrop:SetBackdropBorderColor(color.r, color.g, color.b, 0.7)\n\tf.button.backdrop:SetBackdropBorderColor(color.r, color.g, color.b, 0.7)\n\n\tf.status:SetMinMaxValues(0, time)\n\tf.status:SetValue(time)\n\n\t--BETA f:SetPoint(\"CENTER\", WorldFrame, \"CENTER\")\n\tf:Show()\nend\n\nlocal function LOOT_HISTORY_ROLL_CHANGED(rollindex, playerindex)\n\tlocal _, _, rolltype = C_LootHistory.GetPlayerInfo(rollindex, playerindex)\n\tUpdateRoll(rollindex, rolltype)\nend\n\nLootRollAnchor:RegisterEvent(\"ADDON_LOADED\")\nLootRollAnchor:SetScript(\"OnEvent\", function(_, _, addon)\n\tif addon ~= \"ShestakUI\" then return end\n\n\tLootRollAnchor:UnregisterEvent(\"ADDON_LOADED\")\n\tLootRollAnchor:RegisterEvent(\"START_LOOT_ROLL\")\n\tLootRollAnchor:RegisterEvent(\"LOOT_HISTORY_ROLL_CHANGED\")\n\n\tUIParent:UnregisterEvent(\"START_LOOT_ROLL\")\n\tUIParent:UnregisterEvent(\"CANCEL_LOOT_ROLL\")\n\n\tLootRollAnchor:SetScript(\"OnEvent\", function(_, event, ...)\n\t\tif event == \"LOOT_HISTORY_ROLL_CHANGED\" then\n\t\t\treturn LOOT_HISTORY_ROLL_CHANGED(...)\n\t\telse\n\t\t\treturn START_LOOT_ROLL(...)\n\t\tend\n\tend)\n\n\tLootRollAnchor:SetPoint(unpack(C.position.group_loot))\nend)\n\nSlashCmdList.TESTROLL = function()\n\tlocal f = GetFrame()\n\tlocal items = {32837, 34196, 33820, 84004}\n\tif f:IsShown() then\n\t\tf:Hide()\n\telse\n\t\tlocal item = items[math.random(1, #items)]\n\t\tlocal _, _, quality, _, _, _, _, _, _, texture = GetItemInfo(item)\n\t\tlocal r, g, b = GetItemQualityColor(quality or 1)\n\n\t\tf.button.icon:SetTexture(texture)\n\t\tf.button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\tf.fsloot:SetText(GetItemInfo(item))\n\t\tf.fsloot:SetVertexColor(r, g, b)\n\n\t\tf.status:SetMinMaxValues(0, 100)\n\t\tf.status:SetValue(math.random(50, 90))\n\t\tf.status:SetStatusBarColor(r, g, b, 0.7)\n\t\tf.status.bg:SetColorTexture(r, g, b)\n\n\t\tf.backdrop:SetBackdropBorderColor(r, g, b, 0.7)\n\t\tf.button.backdrop:SetBackdropBorderColor(r, g, b, 0.7)\n\n\t\tf.need:SetText(0)\n\t\tf.greed:SetText(0)\n\t\tf.pass:SetText(0)\n\t\tf.disenchant:SetText(0)\n\n\t\tf.button.link = \"item:\"..item..\":0:0:0:0:0:0:0\"\n\t\tf:Show()\n\tend\nend\nSLASH_TESTROLL1 = \"/testroll\"\nSLASH_TESTROLL2 = \"/еуыекщдд\""
  },
  {
    "path": "ShestakUI/Modules/Loot/Loot.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.loot.lootframe ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tLoot frame(Butsu by Haste)\n----------------------------------------------------------------------------------------\nlocal _, _NS = ...\nlocal Butsu = CreateFrame(\"Button\", \"Butsu\")\nlocal lb = CreateFrame(\"Button\", \"ButsuAdv\", Butsu, \"UIPanelScrollDownButtonTemplate\")\nlocal LDD = CreateFrame(\"Frame\", \"ButsuLDD\", Butsu, \"UIDropDownMenuTemplate\")\nButsu:Hide()\n\nButsu:SetScript(\"OnEvent\", function(self, event, ...)\n\tself[event](self, event, ...)\nend)\n\nfunction Butsu:LOOT_OPENED(_, ...)\n\tself:Show()\n\tlb:Show()\n\n\tlocal autoLoot = ...\n\tif not self:IsShown() then\n\t\tCloseLoot(not autoLoot)\n\tend\n\n\tif IsFishingLoot() then\n\t\tself.title:SetText(L_LOOT_FISH)\n\telseif not UnitIsFriend(\"player\", \"target\") and UnitIsDead(\"target\") then\n\t\tself.title:SetText(UnitName(\"target\"))\n\telse\n\t\tself.title:SetText(LOOT)\n\tend\n\n\t-- Blizzard uses strings here\n\tif GetCVar(\"lootUnderMouse\") == \"1\" then\n\t\tlocal x, y = GetCursorPosition()\n\t\tx = x / self:GetEffectiveScale()\n\t\ty = y / self:GetEffectiveScale()\n\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(\"TOPLEFT\", nil, \"BOTTOMLEFT\", x - 40, y + 20)\n\t\tself:GetCenter()\n\t\tself:Raise()\n\tend\n\n\tlocal m = 0\n\tlocal items = GetNumLootItems()\n\tif items > 0 then\n\t\tfor i = 1, items do\n\t\t\tlocal slot = _NS.slots[i] or _NS.CreateSlot(i)\n\t\t\tlocal texture, item, quantity, currencyID, quality, _, isQuestItem, questId, isActive = GetLootSlotInfo(i)\n\n\t\t\tif currencyID then\n\t\t\t\titem, texture, quantity, quality = CurrencyContainerUtil.GetCurrencyContainerInfo(currencyID, quantity, item, texture, quality)\n\t\t\tend\n\n\t\t\tif texture then\n\t\t\t\tlocal color = ITEM_QUALITY_COLORS[quality]\n\t\t\t\tlocal r, g, b = color.r, color.g, color.b\n\n\t\t\t\tif GetLootSlotType(i) == LOOT_SLOT_MONEY then\n\t\t\t\t\titem = item:gsub(\"\\n\", \", \")\n\t\t\t\tend\n\n\t\t\t\tif quantity and quantity > 1 then\n\t\t\t\t\tslot.count:SetText(quantity)\n\t\t\t\t\tslot.count:Show()\n\t\t\t\telse\n\t\t\t\t\tslot.count:Hide()\n\t\t\t\tend\n\n\t\t\t\tif questId and not isActive then\n\t\t\t\t\tslot.quest:Show()\n\t\t\t\telse\n\t\t\t\t\tslot.quest:Hide()\n\t\t\t\tend\n\n\t\t\t\tif color or questId or isQuestItem then\n\t\t\t\t\tif questId or isQuestItem then\n\t\t\t\t\t\tr, g, b = 1, 1, 0.2\n\t\t\t\t\tend\n\n\t\t\t\t\tslot.iconFrame:SetBackdropBorderColor(r, g, b)\n\t\t\t\t\tslot.backdrop:SetBackdropBorderColor(r, g, b)\n\t\t\t\t\tslot.drop:SetVertexColor(r, g, b)\n\t\t\t\tend\n\t\t\t\tslot.drop:Show()\n\n\t\t\t\tslot.isQuestItem = isQuestItem\n\t\t\t\tslot.quality = quality\n\n\t\t\t\tslot.name:SetText(item)\n\t\t\t\tif color then\n\t\t\t\t\tslot.name:SetTextColor(r, g, b)\n\t\t\t\tend\n\t\t\t\tslot.icon:SetTexture(texture)\n\n\t\t\t\tif quality then\n\t\t\t\t\tm = math.max(m, quality)\n\t\t\t\tend\n\n\t\t\t\tslot:Enable()\n\t\t\t\tslot:Show()\n\t\t\tend\n\t\tend\n\telse\n\t\tlocal slot = _NS.slots[1] or _NS.CreateSlot(1)\n\t\tlocal color = ITEM_QUALITY_COLORS[0]\n\n\t\tslot.name:SetText(EMPTY)\n\t\tslot.name:SetTextColor(color.r, color.g, color.b)\n\t\tslot.icon:SetTexture(\"Interface\\\\Icons\\\\INV_Misc_Herb_AncientLichen\")\n\n\t\tslot.count:Hide()\n\t\tslot.drop:Hide()\n\t\tslot:Disable()\n\t\tslot:Show()\n\tend\n\tself:AnchorSlots()\n\n\tlocal color = ITEM_QUALITY_COLORS[m]\n\tself:SetBackdropBorderColor(color.r, color.g, color.b, 0.8)\n\n\tself:SetWidth(C.loot.width)\n\tself.title:SetWidth(C.loot.width - 45)\n\tself.title:SetHeight(C.font.loot_font_size)\nend\nButsu:RegisterEvent(\"LOOT_OPENED\")\n\nfunction Butsu:LOOT_SLOT_CLEARED(_, slot)\n\tif not self:IsShown() then return end\n\n\tif _NS.slots[slot] then\n\t\t_NS.slots[slot]:Hide()\n\tend\n\tself:AnchorSlots()\nend\nButsu:RegisterEvent(\"LOOT_SLOT_CLEARED\")\n\nfunction Butsu:LOOT_CLOSED()\n\tStaticPopup_Hide(\"LOOT_BIND\")\n\tself:Hide()\n\tlb:Hide()\n\n\tfor _, v in pairs(_NS.slots) do\n\t\tv:Hide()\n\tend\nend\nButsu:RegisterEvent(\"LOOT_CLOSED\")\n\nfunction Butsu:OPEN_MASTER_LOOT_LIST()\n\tToggleDropDownMenu(nil, nil, GroupLootDropDown, LootFrame.selectedLootButton, 0, 0)\nend\nButsu:RegisterEvent(\"OPEN_MASTER_LOOT_LIST\")\n\nfunction Butsu:UPDATE_MASTER_LOOT_LIST()\n\tUIDropDownMenu_Refresh(GroupLootDropDown)\nend\nButsu:RegisterEvent(\"UPDATE_MASTER_LOOT_LIST\")\n\ndo\n\tlocal title = Butsu:CreateFontString(nil, \"OVERLAY\")\n\ttitle:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)\n\ttitle:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)\n\ttitle:SetJustifyH(\"LEFT\")\n\ttitle:SetPoint(\"TOPLEFT\", Butsu, \"TOPLEFT\", 8, -7)\n\tButsu.title = title\nend\n\nButsu:SetScript(\"OnMouseDown\", function(self, button)\n\tif IsAltKeyDown() or IsShiftKeyDown() then\n\t\tself:StartMoving()\n\telseif IsControlKeyDown() and button == \"RightButton\" then\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(unpack(C.position.loot))\n\t\tself:SetUserPlaced(false)\n\tend\nend)\n\nButsu:SetScript(\"OnMouseUp\", function(self)\n\tself:StopMovingOrSizing()\nend)\n\nButsu:SetScript(\"OnHide\", function()\n\tStaticPopup_Hide(\"CONFIRM_LOOT_DISTRIBUTION\")\n\tCloseLoot()\nend)\n\nButsu:SetMovable(true)\nButsu:RegisterForClicks(\"AnyUp\")\nButsu:SetParent(UIParent)\nButsu:SetPoint(unpack(C.position.loot))\nButsu:SetTemplate(\"Transparent\")\nButsu:SetClampedToScreen(true)\nButsu:SetFrameStrata(\"DIALOG\")\nButsu:SetToplevel(true)\nButsu:SetFrameLevel(10)\n\nlocal close = CreateFrame(\"Button\", \"LootCloseButton\", Butsu, \"UIPanelCloseButton\")\nT.SkinCloseButton(close, nil, nil, true)\nclose:SetSize(15, 15)\nclose:SetScript(\"OnClick\", function() CloseLoot() end)\n\n----------------------------------------------------------------------------------------\n--\tAnnounce loot(lcLoot by RustamIrzaev)\n----------------------------------------------------------------------------------------\nlocal function Announce(chn)\n\tlocal nums = GetNumLootItems()\n\tif nums == 0 or (nums == 1 and GetLootSlotType(1) == LOOT_SLOT_MONEY) then return end\n\tif UnitIsPlayer(\"target\") or not UnitExists(\"target\") then\n\t\tSendChatMessage(\">> \"..LOOT..\":\", chn)\n\telse\n\t\tSendChatMessage(\">> \"..LOOT..\" - '\"..UnitName(\"target\")..\"':\", chn)\n\tend\n\tfor i = 1, GetNumLootItems() do\n\t\tif LootSlotHasItem(i) then\n\t\t\tlocal link = GetLootSlotLink(i)\n\t\t\tlocal messlink = \"- %s\"\n\t\t\tif GetLootSlotType(i) ~= LOOT_SLOT_MONEY then\n\t\t\t\tSendChatMessage(format(messlink, link), chn)\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function LDD_OnClick(self)\n\tlocal val = self.value\n\tAnnounce(val)\nend\n\nlocal function LDD_Initialize()\n\tlocal info = {}\n\n\tinfo.text = L_LOOT_ANNOUNCE\n\tinfo.notCheckable = true\n\tinfo.isTitle = true\n\tUIDropDownMenu_AddButton(info)\n\n\tinfo = {}\n\tinfo.text = L_LOOT_TO_RAID\n\tinfo.value = \"raid\"\n\tinfo.notCheckable = 1\n\tinfo.func = LDD_OnClick\n\tUIDropDownMenu_AddButton(info)\n\n\tinfo = {}\n\tinfo.text = L_LOOT_TO_GUILD\n\tinfo.value = \"guild\"\n\tinfo.notCheckable = 1\n\tinfo.func = LDD_OnClick\n\tUIDropDownMenu_AddButton(info)\n\n\tinfo = {}\n\tinfo.text = L_LOOT_TO_PARTY\n\tinfo.value = \"party\"\n\tinfo.notCheckable = 1\n\tinfo.func = LDD_OnClick\n\tUIDropDownMenu_AddButton(info)\n\n\tinfo = {}\n\tinfo.text = L_LOOT_TO_SAY\n\tinfo.value = \"say\"\n\tinfo.notCheckable = 1\n\tinfo.func = LDD_OnClick\n\tUIDropDownMenu_AddButton(info)\n\n\tinfo = nil\nend\n\nT.SkinCloseButton(lb, LootCloseButton, \"-\", true)\nlb:SetSize(15, 15)\nlb:ClearAllPoints()\nlb:SetPoint(\"BOTTOMRIGHT\", Butsu, \"TOPRIGHT\", -22, -19)\nlb:SetFrameStrata(\"DIALOG\")\nlb:RegisterForClicks(\"RightButtonUp\", \"LeftButtonUp\")\nlb:SetScript(\"OnClick\", function(_, button)\n\tif button == \"RightButton\" then\n\t\tToggleDropDownMenu(nil, nil, LDD, lb, 0, 0)\n\telse\n\t\tAnnounce(T.CheckChat())\n\tend\nend)\nlb:Hide()\nUIDropDownMenu_Initialize(LDD, LDD_Initialize, \"MENU\")\n\ndo\n\tlocal slots = {}\n\t_NS.slots = slots\n\n\tlocal OnEnter = function(self)\n\t\tlocal slot = self:GetID()\n\t\tif LootSlotHasItem(slot) then\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_RIGHT\")\n\t\t\tGameTooltip:SetLootItem(slot)\n\t\t\tCursorUpdate(self)\n\t\tend\n\n\t\tself.drop:Show()\n\t\tif self.isQuestItem then\n\t\t\tself.drop:SetVertexColor(0.8, 0.8, 0.2)\n\t\telse\n\t\t\tself.drop:SetVertexColor(1, 1, 0)\n\t\tend\n\tend\n\n\tlocal OnLeave = function(self)\n\t\tlocal color = ITEM_QUALITY_COLORS[self.quality]\n\t\tif self.isQuestItem then\n\t\t\tself.drop:SetVertexColor(1, 1, 0.2)\n\t\telseif color then\n\t\t\tself.drop:SetVertexColor(color.r, color.g, color.b)\n\t\tend\n\n\t\tGameTooltip:Hide()\n\t\tResetCursor()\n\tend\n\n\tlocal OnClick = function(self)\n\t\tif IsModifiedClick() then\n\t\t\tHandleModifiedItemClick(GetLootSlotLink(self:GetID()))\n\t\telse\n\t\t\tStaticPopup_Hide(\"CONFIRM_LOOT_DISTRIBUTION\")\n\n\t\t\tLootFrame.selectedLootButton = self\n\t\t\tLootFrame.selectedSlot = self:GetID()\n\t\t\tLootFrame.selectedQuality = self.quality\n\t\t\tLootFrame.selectedItemName = self.name:GetText()\n\n\t\t\tLootSlot(self:GetID())\n\t\tend\n\tend\n\n\tlocal OnUpdate = function(self)\n\t\tif GameTooltip:IsOwned(self) then\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_RIGHT\")\n\t\t\tGameTooltip:SetLootItem(self:GetID())\n\t\t\tCursorOnUpdate(self)\n\t\tend\n\tend\n\n\tfunction _NS.CreateSlot(id)\n\t\tlocal frame = CreateFrame(\"Button\", \"ButsuSlot\"..id, Butsu)\n\t\tframe:SetHeight(math.max(C.font.loot_font_size, C.loot.icon_size))\n\t\tframe:SetID(id)\n\n\t\tframe:RegisterForClicks(\"LeftButtonUp\", \"RightButtonUp\")\n\n\t\tframe:SetScript(\"OnEnter\", OnEnter)\n\t\tframe:SetScript(\"OnLeave\", OnLeave)\n\t\tframe:SetScript(\"OnClick\", OnClick)\n\t\tframe:SetScript(\"OnUpdate\", OnUpdate)\n\n\t\tlocal iconFrame = CreateFrame(\"Frame\", nil, frame)\n\t\ticonFrame:SetSize(C.loot.icon_size, C.loot.icon_size)\n\t\ticonFrame:SetTemplate(\"Default\")\n\t\ticonFrame:SetPoint(\"LEFT\", frame)\n\t\tframe.iconFrame = iconFrame\n\n\t\tlocal icon = iconFrame:CreateTexture(nil, \"ARTWORK\")\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tframe.icon = icon\n\n\t\tlocal quest = iconFrame:CreateTexture(nil, \"OVERLAY\")\n\t\tquest:SetTexture(\"Interface\\\\Minimap\\\\ObjectIcons\")\n\t\tquest:SetTexCoord(1/8, 2/8, 1/8, 2/8)\n\t\tquest:SetSize(C.loot.icon_size * 0.8, C.loot.icon_size * 0.8)\n\t\tquest:SetPoint(\"BOTTOMLEFT\", -C.loot.icon_size * 0.15, 0)\n\t\tframe.quest = quest\n\n\t\tlocal count = iconFrame:CreateFontString(nil, \"OVERLAY\")\n\t\tcount:SetJustifyH(\"RIGHT\")\n\t\tcount:SetPoint(\"BOTTOMRIGHT\", iconFrame, \"BOTTOMRIGHT\", 1, 1)\n\t\tcount:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)\n\t\tcount:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)\n\t\tcount:SetText(1)\n\t\tframe.count = count\n\n\t\tlocal name = frame:CreateFontString(nil, \"OVERLAY\")\n\t\tname:SetJustifyH(\"LEFT\")\n\t\tname:SetPoint(\"LEFT\", icon, \"RIGHT\", 10, 0)\n\t\tname:SetNonSpaceWrap(true)\n\t\tname:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)\n\t\tname:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)\n\t\tname:SetWidth(C.loot.width - C.loot.icon_size - 25)\n\t\tname:SetHeight(C.font.loot_font_size)\n\t\tframe.name = name\n\n\t\tlocal drop = frame:CreateTexture(nil, \"ARTWORK\")\n\t\tdrop:SetTexture(C.media.blank)\n\t\tdrop:SetPoint(\"TOPLEFT\", C.loot.icon_size + 5, -2)\n\t\tdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tdrop:SetAlpha(0.5)\n\t\tframe.drop = drop\n\n\t\tframe:CreateBackdrop(\"Default\")\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", C.loot.icon_size + 3, 0)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\")\n\n\t\tslots[id] = frame\n\t\treturn frame\n\tend\n\n\tfunction Butsu:AnchorSlots()\n\t\tlocal frameSize = math.max(C.loot.icon_size, C.loot.icon_size)\n\t\tlocal shownSlots = 0\n\n\t\tlocal prevShown\n\t\tfor i = 1, #slots do\n\t\t\tlocal frame = slots[i]\n\t\t\tif frame:IsShown() then\n\t\t\t\tframe:ClearAllPoints()\n\t\t\t\tframe:SetPoint(\"LEFT\", 8, 0)\n\t\t\t\tframe:SetPoint(\"RIGHT\", -8, 0)\n\t\t\t\tif not prevShown then\n\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", self, 8, -25)\n\t\t\t\telse\n\t\t\t\t\tframe:SetPoint(\"TOP\", prevShown, \"BOTTOM\", 0, -3)\n\t\t\t\tend\n\n\t\t\t\tframe:SetHeight(frameSize)\n\t\t\t\tshownSlots = shownSlots + 1\n\t\t\t\tprevShown = frame\n\t\t\tend\n\t\tend\n\n\t\tself:SetHeight((shownSlots * (frameSize + 3)) + 30)\n\tend\nend\n\n-- Kill the default loot frame\nLootFrame:UnregisterAllEvents()\n\n-- Escape the dungeon\ntable.insert(UISpecialFrames, \"Butsu\")"
  },
  {
    "path": "ShestakUI/Modules/Loot/MasterLoot.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.loot.lootframe ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMasterLoot by Ammo\n----------------------------------------------------------------------------------------\nlocal hexColors = {}\nfor k, v in pairs(RAID_CLASS_COLORS) do\n\thexColors[k] = \"|c\"..v.colorStr\nend\nhexColors[\"UNKNOWN\"] = string.format(\"|cff%02x%02x%02x\", 0.6 * 255, 0.6 * 255, 0.6 * 255)\n\nif CUSTOM_CLASS_COLORS then\n\tlocal function update()\n\t\tfor k, v in pairs(CUSTOM_CLASS_COLORS) do\n\t\t\thexColors[k] = \"|c\"..v.colorStr\n\t\tend\n\tend\n\tCUSTOM_CLASS_COLORS:RegisterCallback(update)\n\tupdate()\nend\n\nlocal classesInRaid = {}\nlocal players, player_indices = {}, {}\nlocal randoms = {}\nlocal wipe = table.wipe\n\nlocal function MasterLoot_RequestRoll(frame)\n\tDoMasterLootRoll(frame.value)\nend\n\nlocal function MasterLoot_GiveLoot(frame)\n\tMasterLooterFrame.slot = LootFrame.selectedSlot\n\tMasterLooterFrame.candidateId = frame.value\n\tif LootFrame.selectedQuality >= MASTER_LOOT_THREHOLD then\n\t\tStaticPopup_Show(\"CONFIRM_LOOT_DISTRIBUTION\", ITEM_QUALITY_COLORS[LootFrame.selectedQuality].hex..LootFrame.selectedItemName..FONT_COLOR_CODE_CLOSE, frame:GetText() or UNKNOWN, \"LootWindow\")\n\telse\n\t\tGiveMasterLoot(LootFrame.selectedSlot, frame.value)\n\tend\n\tCloseDropDownMenus()\nend\n\nlocal function init()\n\tlocal candidate, lclass, className\n\tlocal slot = LootFrame.selectedSlot or 0\n\tlocal info = UIDropDownMenu_CreateInfo()\n\n\tif UIDROPDOWNMENU_MENU_LEVEL == 2 then\n\t\t-- Raid class menu\n\t\twipe(players)\n\t\twipe(player_indices)\n\t\tlocal this_class = UIDROPDOWNMENU_MENU_VALUE\n\t\tfor i = 1, MAX_RAID_MEMBERS do\n\t\t\tcandidate, lclass, className = GetMasterLootCandidate(slot, i)\n\t\t\tif candidate and this_class == className then\n\t\t\t\ttable.insert(players, candidate)\n\t\t\t\tplayer_indices[candidate] = i\n\t\t\tend\n\t\tend\n\t\tif #players > 0 then\n\t\t\ttable.sort(players)\n\t\t\tfor _, cand in ipairs(players) do\n\t\t\t\t-- Add candidate button\n\t\t\t\tinfo.text = cand\n\t\t\t\tinfo.colorCode = hexColors[this_class] or hexColors[\"UNKNOWN\"]\n\t\t\t\tinfo.textHeight = 12\n\t\t\t\tinfo.value = player_indices[cand]\n\t\t\t\tinfo.notCheckable = 1\n\t\t\t\tinfo.disabled = nil\n\t\t\t\tinfo.func = MasterLoot_GiveLoot\n\t\t\t\tUIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL)\n\t\t\tend\n\t\tend\n\t\treturn\n\tend\n\n\tinfo.isTitle = 1\n\tinfo.text = GIVE_LOOT\n\tinfo.textHeight = 12\n\tinfo.notCheckable = 1\n\tinfo.disabled = nil\n\tinfo.notClickable = nil\n\tUIDropDownMenu_AddButton(info)\n\n\tif IsInRaid() then\n\t\t-- In a raid\n\t\twipe(classesInRaid)\n\t\tfor i = 1, MAX_RAID_MEMBERS do\n\t\t\tcandidate, lclass, className = GetMasterLootCandidate(slot, i)\n\t\t\tif candidate then\n\t\t\t\tclassesInRaid[className] = lclass\n\t\t\tend\n\t\tend\n\n\t\tfor _, class in ipairs(CLASS_SORT_ORDER) do\n\t\t\tlocal cname = classesInRaid[class]\n\t\t\tif cname then\n\t\t\t\tinfo.isTitle = nil\n\t\t\t\tinfo.text = cname\n\t\t\t\tinfo.colorCode = hexColors[class] or hexColors[\"UNKNOWN\"]\n\t\t\t\tinfo.textHeight = 12\n\t\t\t\tinfo.hasArrow = 1\n\t\t\t\tinfo.notCheckable = 1\n\t\t\t\tinfo.value = class\n\t\t\t\tinfo.func = nil\n\t\t\t\tinfo.disabled = nil\n\t\t\t\tUIDropDownMenu_AddButton(info)\n\t\t\tend\n\t\tend\n\telse\n\t\t-- In a party\n\t\tfor i = 1, MAX_PARTY_MEMBERS + 1, 1 do\n\t\t\tcandidate, lclass, className = GetMasterLootCandidate(slot, i)\n\t\t\tif candidate then\n\t\t\t\t-- Add candidate button\n\t\t\t\tinfo.text = candidate\n\t\t\t\tinfo.colorCode = hexColors[className] or hexColors[\"UNKNOWN\"]\n\t\t\t\tinfo.textHeight = 12\n\t\t\t\tinfo.value = i\n\t\t\t\tinfo.notCheckable = 1\n\t\t\t\tinfo.hasArrow = nil\n\t\t\t\tinfo.isTitle = nil\n\t\t\t\tinfo.disabled = nil\n\t\t\t\tinfo.func = MasterLoot_GiveLoot\n\t\t\t\tUIDropDownMenu_AddButton(info)\n\t\t\tend\n\t\tend\n\tend\n\n\tinfo.colorCode = \"|cffffffff\"\n\tinfo.isTitle = nil\n\tinfo.textHeight = 12\n\tinfo.value = slot\n\tinfo.notCheckable = 1\n\tinfo.hasArrow = nil\n\tinfo.text = REQUEST_ROLL\n\tinfo.func = MasterLoot_RequestRoll\n\tinfo.icon = \"Interface\\\\Buttons\\\\UI-GroupLoot-Dice-Up\"\n\tUIDropDownMenu_AddButton(info)\n\n\twipe(randoms)\n\tfor i = 1, MAX_RAID_MEMBERS do\n\t\tcandidate, lclass, className = GetMasterLootCandidate(slot, i)\n\t\tif candidate then\n\t\t\ttable.insert(randoms, i)\n\t\tend\n\tend\n\tif #randoms > 0 then\n\t\tinfo.colorCode = \"|cffffffff\"\n\t\tinfo.isTitle = nil\n\t\tinfo.textHeight = 12\n\t\tinfo.value = randoms[math.random(1, #randoms)]\n\t\tinfo.notCheckable = 1\n\t\tinfo.text = L_LOOT_RANDOM\n\t\tinfo.func = MasterLoot_GiveLoot\n\t\tinfo.icon = \"Interface\\\\Buttons\\\\UI-GroupLoot-Coin-Up\"\n\t\tUIDropDownMenu_AddButton(info)\n\tend\n\tfor i = 1, MAX_RAID_MEMBERS do\n\t\tcandidate, lclass, className = GetMasterLootCandidate(slot, i)\n\t\tif candidate and candidate == T.name then\n\t\t\tinfo.colorCode = hexColors[className] or hexColors[\"UNKNOWN\"]\n\t\t\tinfo.isTitle = nil\n\t\t\tinfo.textHeight = 12\n\t\t\tinfo.value = i\n\t\t\tinfo.notCheckable = 1\n\t\t\tinfo.text = L_LOOT_SELF\n\t\t\tinfo.func = MasterLoot_GiveLoot\n\t\t\tinfo.icon = \"Interface\\\\GossipFrame\\\\VendorGossipIcon\"\n\t\t\tUIDropDownMenu_AddButton(info)\n\t\tend\n\tend\nend\n\nUIDropDownMenu_Initialize(GroupLootDropDown, init, \"MENU\")"
  },
  {
    "path": "ShestakUI/Modules/Maps/BattlefieldMap.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.minimap.bg_map_stylization ~= true or IsAddOnLoaded(\"Capping\") or IsAddOnLoaded(\"Aurora\") or IsAddOnLoaded(\"EnhanceBattlefieldMinimap\") then return end\n\n----------------------------------------------------------------------------------------\n--\tBattlefieldMap style\n----------------------------------------------------------------------------------------\nlocal tinymap = CreateFrame(\"Frame\", \"UIZoneMap\", UIParent)\ntinymap:Hide()\n\ntinymap:RegisterEvent(\"ADDON_LOADED\")\ntinymap:SetScript(\"OnEvent\", function(_, _, addon)\n\tif addon ~= \"Blizzard_BattlefieldMap\" then return end\n\n\tBattlefieldMapFrame:SetSize(223, 150)\n\tBattlefieldMapFrame:CreateBackdrop(\"ClassColor\")\n\tBattlefieldMapFrame.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha)\n\tBattlefieldMapFrame.backdrop:SetPoint(\"TOPLEFT\", -2, 4)\n\tBattlefieldMapFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 1)\n\n\tBattlefieldMapFrame.BorderFrame:DisableDrawLayer(\"BORDER\")\n\tBattlefieldMapFrame.BorderFrame:DisableDrawLayer(\"ARTWORK\")\n\n\tBattlefieldMapFrame.BorderFrame.CloseButton:Hide()\n\tBattlefieldMapFrame.BorderFrame.CloseButtonBorder:Hide()\n\n\tBattlefieldMapTab:SetParent(tinymap)\n\n\tBattlefieldMapFrame.ScrollContainer:HookScript(\"OnMouseUp\", function(_, btn)\n\t\tif btn == \"LeftButton\" then\n\t\t\tBattlefieldMapTab:StopMovingOrSizing()\n\t\t\tif OpacityFrame:IsShown() then OpacityFrame:Hide() end\n\t\telseif btn == \"RightButton\" then\n\t\t\tlocal function InitializeOptionsDropDown(BattlefieldMapFrame)\n\t\t\t\tBattlefieldMapFrame:GetParent():InitializeOptionsDropDown()\n\t\t\tend\n\t\t\tUIDropDownMenu_Initialize(BattlefieldMapTab.OptionsDropDown, InitializeOptionsDropDown, \"MENU\")\n\t\t\tToggleDropDownMenu(nil, nil, BattlefieldMapTab.OptionsDropDown, \"cursor\", 0, -4)\n\t\t\tif OpacityFrame:IsShown() then OpacityFrame:Hide() end\n\t\tend\n\tend)\n\n\tBattlefieldMapFrame.ScrollContainer:HookScript(\"OnMouseDown\", function(_, btn)\n\t\tif btn == \"LeftButton\" then\n\t\t\tif BattlefieldMapOptions and BattlefieldMapOptions.locked then\n\t\t\t\treturn\n\t\t\telse\n\t\t\t\tBattlefieldMapTab:StartMoving()\n\t\t\tend\n\t\tend\n\tend)\nend)"
  },
  {
    "path": "ShestakUI/Modules/Maps/ButtonCollect.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.minimap.enable ~= true or C.skins.minimap_buttons ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCollect minimap buttons in one line\n----------------------------------------------------------------------------------------\nlocal BlackList = {\n\t[\"QueueStatusButton\"] = true,\n\t[\"MiniMapTracking\"] = true,\n\t[\"MiniMapMailFrame\"] = true,\n\t[\"HelpOpenTicketButton\"] = true,\n\t[\"GameTimeFrame\"] = true,\n}\n\nlocal buttons = {}\nlocal collectFrame = CreateFrame(\"Frame\", \"ButtonCollectFrame\", UIParent)\nlocal line = math.ceil(C.minimap.size / 20.8)\n\nlocal texList = {\n\t[\"136430\"] = true,\t-- Interface\\\\Minimap\\\\MiniMap-TrackingBorder\n\t[\"136467\"] = true,\t-- Interface\\\\Minimap\\\\UI-Minimap-Background\n}\n\nlocal function SkinButton(f)\n\tf:SetPushedTexture(0)\n\tf:SetHighlightTexture(0)\n\tf:SetDisabledTexture(0)\n\tf:SetSize(20.8, 20.8)\n\n\tfor i = 1, f:GetNumRegions() do\n\t\tlocal region = select(i, f:GetRegions())\n\t\tif region:IsVisible() and region:GetObjectType() == \"Texture\" then\n\t\t\tlocal tex = tostring(region:GetTexture())\n\n\t\t\tif tex and (texList[tex] or tex:find(\"Border\") or tex:find(\"Background\") or tex:find(\"AlphaMask\")) then\n\t\t\t\tregion:SetTexture(nil)\n\t\t\telse\n\t\t\t\tregion:ClearAllPoints()\n\t\t\t\tregion:SetPoint(\"TOPLEFT\", f, \"TOPLEFT\", 2, -2)\n\t\t\t\tregion:SetPoint(\"BOTTOMRIGHT\", f, \"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tregion:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tregion:SetDrawLayer(\"ARTWORK\")\n\t\t\t\tif f:GetName() == \"PS_MinimapButton\" then\n\t\t\t\t\tregion.SetPoint = T.dummy\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tf:SetTemplate(\"ClassColor\")\nend\n\nlocal function PositionAndStyle()\n\tcollectFrame:SetSize(20.8, 20.8)\n\tcollectFrame:SetPoint(unpack(C.position.minimap_buttons))\n\tfor i = 1, #buttons do\n\t\tlocal f = buttons[i]\n\t\tf:ClearAllPoints()\n\t\tif i == 1 then\n\t\t\tf:SetPoint(\"TOP\", collectFrame, \"TOP\", 0, 0)\n\t\telseif i == line then\n\t\t\tf:SetPoint(\"TOPRIGHT\", buttons[1], \"TOPLEFT\", -1, 0)\n\t\telse\n\t\t\tf:SetPoint(\"TOP\", buttons[i-1], \"BOTTOM\", 0, -1)\n\t\tend\n\t\tf.ClearAllPoints = T.dummy\n\t\tf.SetPoint = T.dummy\n\t\tif C.skins.minimap_buttons_mouseover then\n\t\t\tf:SetAlpha(0)\n\t\t\tf:HookScript(\"OnEnter\", function()\n\t\t\t\tf:FadeIn()\n\t\t\tend)\n\t\t\tf:HookScript(\"OnLeave\", function()\n\t\t\t\tf:FadeOut()\n\t\t\tend)\n\t\tend\n\t\tSkinButton(f)\n\tend\nend\n\nlocal collect = CreateFrame(\"Frame\")\ncollect:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\ncollect:SetScript(\"OnEvent\", function()\n\tfor _, child in ipairs({Minimap:GetChildren()}) do\n\t\tif not BlackList[child:GetName()] then\n\t\t\tif child:GetObjectType() == \"Button\" and child:GetNumRegions() >= 3 and child:IsShown() then\n\t\t\t\tchild:SetParent(collectFrame)\n\t\t\t\ttinsert(buttons, child)\n\t\t\tend\n\t\tend\n\tend\n\tif #buttons == 0 then\n\t\tcollectFrame:Hide()\n\tend\n\tPositionAndStyle()\n\n\tif WIM3MinimapButton and WIM3MinimapButton:GetParent() == UIParent then\n\t\tSkinButton(WIM3MinimapButton)\n\t\tWIM3MinimapButton.backGround:Hide()\n\tend\n\tcollect:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\nend)"
  },
  {
    "path": "ShestakUI/Modules/Maps/FogOfWar.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.minimap.fog_of_war ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tFog of war on World Map(Leatrix_Maps by Leatrix)\n----------------------------------------------------------------------------------------\nlocal zones = {\n\t[2] = {[\"162:157:399:440\"] = \"440583\", [\"192:184:457:406\"] = \"271426\", [\"208:157:438:0\"] = \"271427\", [\"210:200:462:298\"] = \"271440\", [\"220:218:295:48\"] = \"271439\", [\"224:227:431:157\"] = \"271421\", [\"236:196:415:60\"] = \"271428\", [\"244:222:282:174\"] = \"440584\", [\"248:158:302:264\"] = \"271422\", [\"254:258:304:312\"] = \"271443, 440585\", [\"259:165:309:0\"] = \"271435, 271442, 271435, 271442\", [\"330:255:429:413\"] = \"271437, 440582\",},\n\t[8] = {[\"172:205:248:321\"] = \"272176\", [\"174:185:449:340\"] = \"272180\", [\"186:185:514:43\"] = \"272169\", [\"186:216:448:101\"] = \"272177\", [\"187:165:435:224\"] = \"272185\", [\"190:172:331:0\"] = \"272172\", [\"201:167:333:202\"] = \"272178\", [\"208:300:530:138\"] = \"272186, 457475\", [\"218:192:226:220\"] = \"272181\", [\"222:202:400:0\"] = \"272179\", [\"237:184:201:0\"] = \"457473\", [\"260:243:527:291\"] = \"272170, 457474\", [\"302:223:319:273\"] = \"272173, 457470\", [\"373:259:208:62\"] = \"272187, 272171, 457476, 457477\", [\"446:264:286:401\"] = \"272168, 272165, 457471, 457472\",},\n\t[11] = {[\"207:332:555:129\"] = \"270569, 438215\", [\"219:175:547:379\"] = \"270585\", [\"233:193:362:275\"] = \"270559\", [\"239:231:481:254\"] = \"270574\", [\"241:195:290:104\"] = \"270554\", [\"243:217:448:127\"] = \"270584\", [\"257:249:403:6\"] = \"270564, 438223\", [\"261:216:258:6\"] = \"438216, 438217\", [\"278:209:511:7\"] = \"270553, 438214\", [\"283:270:116:57\"] = \"270572, 438218, 438219, 438220\", [\"315:212:556:456\"] = \"270573, 438222\", [\"336:289:344:379\"] = \"270565, 438224, 438225, 438226\", [\"377:325:152:318\"] = \"438227, 438228, 438229, 438230\", [\"446:256:100:208\"] = \"270560, 438221\",},\n\t[15] = {[\"183:238:506:126\"] = \"270360\", [\"196:270:293:145\"] = \"270352, 438180\", [\"210:227:404:144\"] = \"270350\", [\"212:305:0:144\"] = \"438173, 438174\", [\"215:188:332:273\"] = \"438169\", [\"220:287:85:24\"] = \"270347, 438168\", [\"227:268:132:105\"] = \"270351, 438179\", [\"228:227:201:312\"] = \"270346\", [\"237:252:261:416\"] = \"270348\", [\"249:278:171:123\"] = \"270349, 438167\", [\"252:258:327:367\"] = \"270342, 438166\", [\"260:220:476:359\"] = \"270353, 438184\", [\"270:271:581:118\"] = \"270336, 438176, 438177, 438178\", [\"273:268:77:400\"] = \"270361, 438170, 438171, 438172\", [\"284:306:21:269\"] = \"270358, 438181, 438182, 438183\", [\"306:248:430:249\"] = \"270343, 438175\",},\n\t[16] = {[\"209:196:411:116\"] = \"270532\", [\"214:285:144:99\"] = \"270525, 270521\", [\"236:260:504:19\"] = \"270530, 442231\", [\"252:353:0:66\"] = \"270529, 442225, 270529, 442225\", [\"266:210:336:0\"] = \"442238, 442239\", [\"274:448:407:220\"] = \"270540, 270527, 442226, 442227\", [\"285:223:230:68\"] = \"270543, 442224\", [\"328:313:175:178\"] = \"442232, 442233, 442234, 442235\", [\"339:347:0:281\"] = \"270520, 442228, 442229, 442230\", [\"342:353:230:315\"] = \"270522, 270550, 270528, 270536\", [\"469:613:533:55\"] = \"270534, 270551, 270546, 270535, 442236, 442237\",},\n\t[18] = {[\"168:170:375:102\"] = \"391431\", [\"195:199:436:0\"] = \"438233\", [\"199:191:333:474\"] = \"438238\", [\"218:183:459:97\"] = \"391430\", [\"233:266:386:374\"] = \"438236, 438237\", [\"235:188:327:182\"] = \"391434\", [\"238:195:225:110\"] = \"391425\", [\"240:270:578:91\"] = \"438234, 438235\", [\"268:354:533:268\"] = \"438243, 438244, 438245, 438246\", [\"272:206:258:0\"] = \"391435, 438231\", [\"295:205:530:6\"] = \"391432, 438232\", [\"308:226:144:175\"] = \"391429, 391428\", [\"348:357:132:311\"] = \"438247, 438248, 438249, 438250\", [\"370:298:368:179\"] = \"438239, 438240, 438241, 438242\",},\n\t[19] = {[\"161:234:692:99\"] = \"272996\", [\"175:210:686:232\"] = \"273000\", [\"179:169:389:255\"] = \"440917\", [\"190:214:477:129\"] = \"273020\", [\"199:182:480:252\"] = \"273015\", [\"210:292:573:122\"] = \"273009, 273002\", [\"212:177:418:317\"] = \"273016\", [\"225:281:347:325\"] = \"273003, 440921\", [\"242:179:594:324\"] = \"273006\", [\"250:279:752:150\"] = \"272999, 440935\", [\"262:262:740:47\"] = \"440926, 440927, 440928, 440929\", [\"285:260:324:90\"] = \"273019, 440914, 440915, 440916\", [\"286:225:201:192\"] = \"273017, 440930\", [\"293:338:709:330\"] = \"440931, 440932, 440933, 440934\", [\"390:267:423:359\"] = \"440922, 440923, 440924, 440925\", [\"431:407:9:207\"] = \"273001, 440918, 440919, 440920\",},\n\t[22] = {[\"152:189:433:327\"] = \"440742\", [\"162:172:461:77\"] = \"440744\", [\"174:199:323:68\"] = \"440735\", [\"176:152:471:156\"] = \"440741\", [\"179:165:337:337\"] = \"272613\", [\"186:238:369:0\"] = \"440734\", [\"217:198:483:212\"] = \"272598\", [\"218:200:341:157\"] = \"272620\", [\"227:172:236:0\"] = \"272610\", [\"251:167:312:249\"] = \"272616\", [\"255:180:349:429\"] = \"440740\", [\"281:345:147:0\"] = \"440736, 440737, 440738, 440739\", [\"283:243:509:250\"] = \"272614, 440725\", [\"318:263:505:405\"] = \"272599, 440726, 440727, 440728\", [\"352:302:581:15\"] = \"272600, 440729, 440730, 440731\", [\"361:175:445:0\"] = \"440732, 440733\", [\"409:162:318:506\"] = \"272609, 440743\",},\n\t[23] = {[\"169:195:472:332\"] = \"273102\", [\"185:230:551:151\"] = \"273121\", [\"194:208:601:390\"] = \"273107\", [\"241:212:229:228\"] = \"273113\", [\"241:252:495:213\"] = \"273094\", [\"290:133:286:211\"] = \"441018, 441019\", [\"311:436:533:0\"] = \"273122, 273103, 441023, 441024\", [\"316:316:48:235\"] = \"273120, 441020, 441021, 441022\", [\"325:192:300:232\"] = \"441015, 441016\", [\"359:182:231:123\"] = \"273114, 441017\", [\"368:220:261:448\"] = \"273108, 273101\", [\"432:271:235:0\"] = \"273095, 273111, 273100, 273090\", [\"464:325:96:343\"] = \"441011, 441012, 441013, 441014\", [\"492:314:510:354\"] = \"273119, 273092, 273112, 273093\",},\n\t[24] = {[\"177:266:595:263\"] = \"271543, 271530\", [\"181:176:541:184\"] = \"271542\", [\"182:320:383:348\"] = \"442692, 442693\", [\"186:213:493:289\"] = \"271544\", [\"196:220:687:271\"] = \"271533\", [\"202:191:258:351\"] = \"271548\", [\"202:202:133:335\"] = \"271551\", [\"214:254:651:414\"] = \"271553\", [\"228:273:774:102\"] = \"442674, 442675\", [\"238:231:382:151\"] = \"271523\", [\"243:162:391:271\"] = \"442677\", [\"248:206:211:462\"] = \"271514\", [\"250:192:401:69\"] = \"271521\", [\"258:320:0:10\"] = \"271522, 442685, 442686, 442687\", [\"262:526:0:100\"] = \"271538, 271513, 442695, 442696, 442697, 442698\", [\"264:373:738:295\"] = \"442680, 442681, 442682, 442683\", [\"265:232:570:61\"] = \"271520, 442678\", [\"266:241:462:427\"] = \"271532, 442676\", [\"274:216:183:211\"] = \"271536, 442688\", [\"277:175:351:0\"] = \"271535, 442679\", [\"280:211:56:457\"] = \"271512, 442694\", [\"286:176:528:0\"] = \"271554, 442699\", [\"297:299:650:55\"] = \"271537, 442689, 442690, 442691\", [\"310:178:118:0\"] = \"271529, 442684\", [\"328:253:144:40\"] = \"271518, 271527\",},\n\t[26] = {[\"105:148:390:255\"] = \"450678\", [\"116:129:344:254\"] = \"450649\", [\"134:124:463:101\"] = \"450634\", [\"135:160:426:224\"] = \"450633\", [\"144:139:200:505\"] = \"450668\", [\"147:160:425:279\"] = \"450639\", [\"148:120:413:55\"] = \"450670\", [\"148:146:484:166\"] = \"450671\", [\"155:147:451:140\"] = \"450648\", [\"158:169:321:42\"] = \"450666\", [\"165:203:494:226\"] = \"450677\", [\"171:136:359:191\"] = \"450650\", [\"180:182:287:399\"] = \"450628\", [\"189:181:347:85\"] = \"450669\", [\"204:244:502:373\"] = \"450667\", [\"212:160:441:0\"] = \"450679\", [\"229:219:383:352\"] = \"450674\", [\"250:167:194:216\"] = \"450665\", [\"258:113:341:0\"] = \"450637, 450638\", [\"269:258:542:410\"] = \"450640, 450641, 450642, 450643\", [\"275:193:505:44\"] = \"450675, 450676\", [\"302:175:191:302\"] = \"450651, 450652, 450651, 450652\", [\"312:254:59:310\"] = \"450672, 450673\", [\"316:238:102:137\"] = \"450635, 450636\", [\"437:451:565:217\"] = \"450644, 450645, 450646, 450647\", [\"447:263:555:68\"] = \"450629, 450630, 450631, 450632\",},\n\t[27] = {[\"176:235:490:195\"] = \"271933\", [\"191:278:133:105\"] = \"271927, 440600\", [\"199:199:390:252\"] = \"271929\", [\"199:212:286:269\"] = \"271934\", [\"208:204:367:159\"] = \"271910\", [\"225:196:357:343\"] = \"271922\", [\"226:225:152:284\"] = \"440603\", [\"238:267:0:236\"] = \"271917, 440597\", [\"240:196:220:379\"] = \"271937\", [\"241:211:220:181\"] = \"271928\", [\"244:401:677:267\"] = \"271938, 271916\", [\"281:261:565:208\"] = \"271915, 271921, 440601, 440602\", [\"287:289:487:334\"] = \"271912, 271920, 440598, 440599\", [\"303:311:475:5\"] = \"271908, 271935, 271936, 271909\",},\n\t[28] = {[\"171:234:397:132\"] = \"445524, 445524\", [\"174:249:579:306\"] = \"271401\", [\"184:188:449:220\"] = \"271417\", [\"198:251:663:288\"] = \"271408\", [\"211:160:374:287\"] = \"271400\", [\"218:234:760:268\"] = \"271409\", [\"225:276:360:340\"] = \"271406, 438340\", [\"226:335:469:256\"] = \"438345, 438346\", [\"236:358:263:0\"] = \"271392, 442671\", [\"237:366:765:43\"] = \"442672, 442673\", [\"249:183:595:225\"] = \"271389\", [\"308:335:630:0\"] = \"438354, 438355, 438356, 438357\", [\"376:347:398:0\"] = \"271410, 271396, 438352, 438353\", [\"398:302:100:366\"] = \"438341, 438342, 438343, 438344\", [\"409:318:0:27\"] = \"438348, 438349, 438350, 438351\", [\"437:249:50:227\"] = \"271398, 438347\",},\n\t[33] = {[\"304:244:243:424\"] = \"450682, 450683\", [\"365:393:0:75\"] = \"254509, 254510, 254511, 254512\", [\"375:307:0:361\"] = \"254503, 254504, 450680, 450681\", [\"392:355:588:0\"] = \"254505, 254506, 254507, 254508\", [\"429:301:255:38\"] = \"450692, 450693, 450694, 450695\", [\"441:266:531:241\"] = \"450684, 450685, 450686, 450687\", [\"481:360:232:171\"] = \"254529, 254530, 254531, 254532\", [\"571:308:413:360\"] = \"254527, 254528, 450688, 450689, 450690, 450691\",},\n\t[37] = {[\"182:360:0:0\"] = \"270938, 455906\", [\"274:263:568:151\"] = \"270927, 455911, 455912, 455913\", [\"274:413:253:255\"] = \"270933, 270943, 270921, 270928, 270933, 270943, 270921, 270928\", [\"281:388:79:0\"] = \"270919, 270911, 455907, 455908\", [\"298:410:419:258\"] = \"270920, 270914, 270908, 270929\", [\"320:385:235:0\"] = \"270912, 270909, 455909, 455910\", [\"324:354:421:0\"] = \"270922, 270934, 270923, 270937\", [\"350:341:646:7\"] = \"270944, 270910, 270935, 270945\", [\"362:431:0:237\"] = \"270941, 270925, 270926, 270917\", [\"383:413:615:255\"] = \"270906, 270918, 270936, 270942\",},\n\t[41] = {[\"220:207:417:327\"] = \"271560\", [\"230:206:396:430\"] = \"271582\", [\"269:248:240:420\"] = \"271576, 438414\", [\"269:313:116:355\"] = \"438426, 438427, 438428, 438429\", [\"270:241:529:287\"] = \"271573, 438425\", [\"276:231:247:294\"] = \"271567, 438415\", [\"285:194:708:442\"] = \"271557, 271583\", [\"287:216:532:424\"] = \"271559, 438412\", [\"294:243:703:292\"] = \"271578, 438413\", [\"295:296:355:138\"] = \"271572, 438416, 438417, 438418\", [\"340:272:552:186\"] = \"271584, 271565, 438419, 438420\", [\"512:422:0:0\"] = \"438421, 438422, 438423, 438424\",},\n\t[46] = {[\"350:449:433:208\"] = \"271092, 271085, 271086, 271089\", [\"513:358:92:310\"] = \"271095, 271079, 440578, 440579, 440580, 440581\", [\"617:522:83:0\"] = \"271075, 271076, 271080, 271081, 440573, 440574, 440575, 440576, 440577\",},\n\t[52] = {[\"189:307:0:152\"] = \"271453, 271454\", [\"205:157:96:292\"] = \"438381\", [\"219:182:661:122\"] = \"271466\", [\"233:248:401:396\"] = \"271449\", [\"268:282:228:355\"] = \"271448, 271456, 438391, 438392\", [\"279:399:497:112\"] = \"271470, 271477, 438379, 438380\", [\"291:244:627:344\"] = \"438385, 438386\", [\"291:263:539:368\"] = \"271455, 438382, 438383, 438384\", [\"299:296:32:348\"] = \"271444, 271483, 438377, 438378\", [\"320:388:314:101\"] = \"438387, 438388, 438389, 438390\", [\"323:309:91:132\"] = \"271473, 271463, 271467, 271464\", [\"329:314:640:128\"] = \"271471, 271461, 271450, 271451\", [\"931:235:71:26\"] = \"271481, 271460, 271474, 271468\",},\n\t[53] = {[\"225:252:221:0\"] = \"252884\", [\"273:230:245:324\"] = \"252862, 252863\", [\"273:294:177:345\"] = \"252886, 252887, 440640, 440641\", [\"294:249:549:52\"] = \"252880, 252881\", [\"310:345:0:311\"] = \"252899, 440647, 440648, 440649\", [\"319:289:16:0\"] = \"252882, 252883, 440638, 440639\", [\"330:474:340:81\"] = \"252894, 252895, 252896, 252897\", [\"333:200:339:0\"] = \"440642, 440643\", [\"349:292:570:209\"] = \"252890, 252891, 252892, 252893\", [\"397:291:481:296\"] = \"252866, 252867, 440636, 440637\", [\"455:295:0:146\"] = \"252898, 440644, 440645, 440646\",},\n\t[54] = {[\"189:193:445:286\"] = \"440660\", [\"228:247:350:139\"] = \"272334\", [\"228:420:480:0\"] = \"440672, 440673\", [\"306:324:688:283\"] = \"440668, 440669, 440670, 440671\", [\"316:182:525:302\"] = \"272347, 272371\", [\"323:406:0:256\"] = \"272364, 272348, 272358, 272359\", [\"357:246:214:0\"] = \"272357, 272342\", [\"392:352:148:316\"] = \"272344, 272354, 272350, 272339\", [\"410:256:0:110\"] = \"272351, 272340\", [\"413:292:37:0\"] = \"272362, 272356, 440664, 440665\", [\"427:291:451:377\"] = \"272369, 272363, 440666, 440667\", [\"428:463:574:0\"] = \"272372, 440661, 440662, 440663\", [\"464:250:81:214\"] = \"272335, 272343\",},\n\t[55] = {[\"139:150:354:184\"] = \"440798\", [\"157:173:387:246\"] = \"440805\", [\"159:137:267:168\"] = \"440793\", [\"167:179:298:228\"] = \"440797\", [\"190:176:566:164\"] = \"440795\", [\"227:190:306:63\"] = \"440807\", [\"228:265:158:0\"] = \"440810, 440811\", [\"230:170:398:375\"] = \"440796\", [\"234:206:543:253\"] = \"440806\", [\"236:224:140:208\"] = \"440812\", [\"239:205:397:243\"] = \"440794\", [\"240:228:413:95\"] = \"440800\", [\"244:238:499:0\"] = \"440799\", [\"302:166:306:0\"] = \"440808, 440809\", [\"324:263:9:22\"] = \"440819, 440820, 440821, 440822\", [\"350:259:488:364\"] = \"440801, 440802, 440803, 440804\", [\"376:560:626:0\"] = \"440813, 440814, 440815, 440816, 440817, 440818\",},\n\t[56] = {[\"229:418:703:80\"] = \"272739, 272746\", [\"238:343:194:236\"] = \"272747, 272763\", [\"257:229:575:238\"] = \"272772, 272760\", [\"262:193:600:0\"] = \"442700, 442701\", [\"266:284:161:79\"] = \"272736, 442717, 442718, 442719\", [\"268:285:0:80\"] = \"272759, 272750, 442713, 442714\", [\"268:316:7:242\"] = \"442702, 442703, 442704, 442705\", [\"292:360:331:24\"] = \"272768, 272770, 442720, 442721\", [\"330:342:478:0\"] = \"442706, 442707, 442708, 442709\", [\"347:303:540:360\"] = \"272740, 272773, 442715, 442716\", [\"357:308:297:258\"] = \"272742, 272751, 272752, 272764\", [\"402:668:600:0\"] = \"272756, 272737, 272769, 442710, 442711, 442712\",},\n\t[57] = {[\"184:217:294:168\"] = \"441034\", [\"193:273:531:200\"] = \"273125, 441031\", [\"196:229:311:0\"] = \"441026\", [\"197:213:394:0\"] = \"273145\", [\"201:195:203:376\"] = \"273142\", [\"202:179:474:0\"] = \"273143\", [\"202:224:348:118\"] = \"273126\", [\"211:167:221:477\"] = \"273141\", [\"229:265:404:226\"] = \"273137, 441027\", [\"232:213:308:325\"] = \"273130\", [\"235:306:199:79\"] = \"273149, 441025\", [\"244:237:451:81\"] = \"273146\", [\"292:273:303:395\"] = \"273124, 441028, 441029, 441030\", [\"317:261:480:378\"] = \"273131, 273134, 441032, 441033\", [\"346:222:167:263\"] = \"273129, 273133\",},\n\t[61] = {[\"185:224:372:76\"] = \"273173\", [\"236:256:359:201\"] = \"273159\", [\"250:269:460:102\"] = \"441042, 441043\", [\"250:282:218:0\"] = \"441048, 441049\", [\"256:245:599:123\"] = \"273181\", [\"257:185:356:7\"] = \"273164, 441041\", [\"258:207:371:335\"] = \"273174, 441054\", [\"276:243:121:63\"] = \"273178, 273167\", [\"298:215:346:419\"] = \"441039, 441040\", [\"298:447:185:195\"] = \"273155, 441055, 441056, 441057\", [\"300:316:532:352\"] = \"441050, 441051, 441052, 441053\", [\"301:232:37:240\"] = \"273163, 441035\", [\"321:248:31:102\"] = \"273171, 441036\", [\"325:363:0:297\"] = \"273156, 441044, 441045, 441046\", [\"329:228:506:34\"] = \"441037, 441038\", [\"369:235:506:232\"] = \"273177, 441047\",},\n\t[62] = {[\"140:210:345:243\"] = \"272807\", [\"144:226:432:109\"] = \"440837\", [\"165:249:382:83\"] = \"272822\", [\"175:235:374:221\"] = \"272826\", [\"178:186:466:237\"] = \"440833\", [\"187:196:544:217\"] = \"272815\", [\"194:244:276:90\"] = \"272830\", [\"198:181:347:355\"] = \"272814\", [\"241:217:481:104\"] = \"272811\", [\"289:202:422:310\"] = \"272810, 440834\", [\"298:337:149:181\"] = \"272806, 272812, 440831, 440832\", [\"317:220:329:448\"] = \"440835, 440836\",},\n\t[67] = {[\"200:263:517:28\"] = \"271043, 438260\", [\"203:194:280:182\"] = \"438259\", [\"244:201:207:467\"] = \"438258\", [\"245:147:565:0\"] = \"438262\", [\"250:241:596:16\"] = \"438261\", [\"277:281:391:54\"] = \"438254, 438255, 438256, 438257\", [\"303:185:277:483\"] = \"271044, 438263\", [\"314:193:280:378\"] = \"438264, 438265\", [\"326:145:294:330\"] = \"271045, 438251\", [\"328:250:305:118\"] = \"438266, 438267\", [\"330:192:300:239\"] = \"438252, 438253\", [\"453:340:0:0\"] = \"2175173, 2175174, 2175175, 2175176\",},\n\t[68] = {[\"166:211:836:148\"] = \"270387\", [\"184:232:112:148\"] = \"270380\", [\"203:310:377:121\"] = \"437337, 437338\", [\"221:257:595:253\"] = \"270401, 437321\", [\"231:223:771:265\"] = \"270390\", [\"231:256:481:221\"] = \"270402\", [\"235:236:696:154\"] = \"270388\", [\"236:271:210:331\"] = \"270398, 437328\", [\"244:251:143:0\"] = \"437322\", [\"246:361:188:0\"] = \"437319, 437320\", [\"251:271:255:164\"] = \"270386, 437312\", [\"262:390:0:0\"] = \"270376, 437333, 437334, 437335\", [\"277:333:714:317\"] = \"270405, 437316, 437317, 437318\", [\"287:276:529:385\"] = \"270375, 437313, 437314, 437315\", [\"306:283:40:275\"] = \"437329, 437330, 437331, 437332\", [\"314:241:255:78\"] = \"270389, 437336\", [\"325:239:473:97\"] = \"270400, 437327\", [\"347:308:338:335\"] = \"437323, 437324, 437325, 437326\",},\n\t[69] = {[\"234:203:527:465\"] = \"442249\", [\"246:256:756:412\"] = \"442250\", [\"246:380:0:134\"] = \"272968, 442244\", [\"272:232:136:0\"] = \"272963, 442255\", [\"280:325:0:0\"] = \"442268, 442269, 442270, 442271\", [\"317:252:169:116\"] = \"272962, 442240\", [\"358:418:125:241\"] = \"442264, 442265, 442266, 442267\", [\"361:314:298:0\"] = \"442245, 442246, 442247, 442248\", [\"374:339:347:329\"] = \"442260, 442261, 442262, 442263\", [\"411:411:591:257\"] = \"442256, 442257, 442258, 442259\", [\"431:410:571:49\"] = \"442251, 442252, 442253, 442254\", [\"436:271:276:186\"] = \"272954, 442241, 442242, 442243\",},\n\t[70] = {[\"164:258:479:401\"] = \"440778, 440779\", [\"176:189:516:289\"] = \"440780\", [\"183:196:588:341\"] = \"440771\", [\"194:156:532:512\"] = \"272628\", [\"210:189:252:121\"] = \"440773\", [\"211:131:618:537\"] = \"272650\", [\"221:235:367:411\"] = \"440772\", [\"222:222:353:285\"] = \"272646\", [\"241:192:366:95\"] = \"440768\", [\"244:247:417:143\"] = \"272624\", [\"265:206:654:369\"] = \"440776, 440777\", [\"267:352:468:263\"] = \"272648, 272634, 272635, 272623\", [\"277:274:199:368\"] = \"272633, 272647, 440774, 440775\", [\"290:297:220:189\"] = \"440764, 440765, 440766, 440767\", [\"305:244:265:0\"] = \"272632, 272641\", [\"322:220:602:448\"] = \"440769, 440770\", [\"374:287:533:179\"] = \"272630, 272649, 272642, 272636\",},\n\t[71] = {[\"161:141:210:0\"] = \"438321\", [\"212:186:275:376\"] = \"438337\", [\"220:205:440:49\"] = \"271111\", [\"222:299:142:369\"] = \"271125, 438327\", [\"231:257:573:0\"] = \"271114, 438320\", [\"250:215:360:273\"] = \"271127\", [\"274:145:399:0\"] = \"271126, 438336\", [\"274:196:207:472\"] = \"271122, 438317\", [\"289:244:613:170\"] = \"438318, 438319\", [\"292:266:637:402\"] = \"271105, 438324, 438325, 438326\", [\"309:349:589:319\"] = \"438328, 438329, 438330, 438331\", [\"312:285:415:156\"] = \"438313, 438314, 438315, 438316\", [\"317:293:655:0\"] = \"271104, 271124, 438322, 438323\", [\"321:275:170:196\"] = \"271106, 271129, 438338, 438339\", [\"326:311:381:357\"] = \"271108, 271112, 271113, 271109\", [\"338:342:208:24\"] = \"438332, 438333, 438334, 438335\",},\n\t[74] = {[\"159:218:607:170\"] = \"440592\", [\"172:198:568:287\"] = \"440586\", [\"174:220:671:181\"] = \"271675\", [\"191:179:457:281\"] = \"440591\", [\"192:157:663:116\"] = \"271696\", [\"194:304:375:343\"] = \"271700, 271682\", [\"206:237:467:354\"] = \"271699\", [\"207:209:756:191\"] = \"271680\", [\"208:204:186:229\"] = \"440593\", [\"217:192:362:237\"] = \"440590\", [\"232:206:652:298\"] = \"440596\", [\"265:284:485:101\"] = \"271687, 440587, 440588, 440589\", [\"350:334:271:0\"] = \"271705, 271686, 440594, 440595\",},\n\t[75] = {[\"206:200:656:21\"] = \"271494\", [\"270:353:428:0\"] = \"271507, 271504, 438410, 438411\", [\"279:301:358:169\"] = \"438397, 438398, 438399, 438400\", [\"305:247:542:223\"] = \"271500, 438407\", [\"317:230:137:188\"] = \"438405, 438406\", [\"344:183:199:0\"] = \"438393, 438394\", [\"384:249:133:59\"] = \"438395, 438396\", [\"433:351:109:313\"] = \"438401, 438402, 438403, 438404\", [\"436:299:359:369\"] = \"271503, 271509, 438408, 438409\",},\n\t[76] = {[\"173:163:380:341\"] = \"272798\", [\"178:243:615:201\"] = \"440825\", [\"179:190:258:211\"] = \"272792\", [\"189:180:412:92\"] = \"272774\", [\"195:163:413:211\"] = \"272800\", [\"213:173:507:238\"] = \"272789\", [\"214:149:293:99\"] = \"272776\", [\"221:293:185:280\"] = \"272781, 440827\", [\"224:216:431:452\"] = \"272801\", [\"225:187:448:364\"] = \"272805\", [\"231:177:305:257\"] = \"272782\", [\"232:211:301:349\"] = \"272784\", [\"254:341:479:9\"] = \"440823, 440824\", [\"255:194:297:148\"] = \"272799\", [\"269:190:255:431\"] = \"440828, 440829\", [\"274:186:437:289\"] = \"272795, 440826\", [\"315:190:184:0\"] = \"272788, 440830\",},\n\t[81] = {[\"184:213:353:396\"] = \"438209\", [\"206:329:316:168\"] = \"270412, 438210\", [\"207:232:407:403\"] = \"438208\", [\"210:232:245:377\"] = \"270409\", [\"218:237:228:229\"] = \"270414\", [\"219:193:575:121\"] = \"438207\", [\"243:262:343:3\"] = \"438197, 438198\", [\"250:230:70:222\"] = \"438199\", [\"256:224:113:141\"] = \"438185\", [\"260:267:204:53\"] = \"438193, 438194, 438195, 438196\", [\"295:267:476:401\"] = \"270410, 438204, 438205, 438206\", [\"306:337:684:22\"] = \"270434, 438211, 438212, 438213\", [\"321:247:477:0\"] = \"270432, 438192\", [\"352:274:22:344\"] = \"438200, 438201, 438202, 438203\", [\"587:381:395:127\"] = \"438186, 438187, 438188, 438189, 438190, 438191\",},\n\t[82] = {[\"173:163:410:505\"] = \"271658\", [\"187:176:476:484\"] = \"271657\", [\"209:226:531:57\"] = \"271653\", [\"229:210:288:458\"] = \"271663\", [\"261:273:406:55\"] = \"271673, 438433, 438434, 438435\", [\"263:199:303:9\"] = \"271652, 438436\", [\"268:214:278:359\"] = \"271664, 438438\", [\"274:212:394:382\"] = \"271659, 438431\", [\"307:161:471:0\"] = \"271660, 438432\", [\"319:176:234:317\"] = \"271669, 438437\", [\"343:250:243:107\"] = \"271665, 438439\", [\"345:192:220:231\"] = \"271666, 438430\",},\n\t[83] = {[\"186:185:328:179\"] = \"440938\", [\"197:222:706:201\"] = \"273051\", [\"204:170:462:330\"] = \"440937\", [\"224:191:557:0\"] = \"440936\", [\"263:412:573:256\"] = \"273072, 273039, 273037, 273063\", [\"309:277:145:226\"] = \"273043, 273075, 273069, 273061\", [\"316:293:162:357\"] = \"273046, 273053, 273071, 273047\", [\"321:288:356:192\"] = \"273042, 273065, 273050, 273036\", [\"332:332:157:0\"] = \"440943, 440944, 440945, 440946\", [\"337:321:565:39\"] = \"440939, 440940, 440941, 440942\", [\"381:274:335:384\"] = \"273059, 273066, 273073, 273054\", [\"432:294:305:0\"] = \"273052, 273062, 273057, 273058\",},\n\t[85] = {[\"271:296:209:91\"] = \"440652, 440653, 440654, 440655\", [\"275:346:542:210\"] = \"440656, 440657, 440658, 440659\", [\"346:244:370:135\"] = \"440650, 440651\", [\"431:319:219:273\"] = \"252844, 252845, 252846, 252847\",},\n\t[86] = {[\"292:260:427:143\"] = \"440714, 440715, 440716, 440717\", [\"309:243:550:181\"] = \"272580, 272544\", [\"315:285:614:0\"] = \"440721, 440722, 440723, 440724\", [\"329:246:126:0\"] = \"272581, 272562\", [\"405:267:345:4\"] = \"272565, 272566, 272577, 272546\", [\"434:231:100:151\"] = \"272573, 272545\", [\"489:358:380:310\"] = \"272567, 272547, 272555, 272548\", [\"542:367:0:206\"] = \"272559, 272543, 272574, 272575, 440718, 440719\", [\"580:213:0:455\"] = \"272564, 272553, 440720\",},\n\t[88] = {[\"194:229:482:195\"] = \"273191\", [\"221:209:588:181\"] = \"273200\", [\"249:217:581:314\"] = \"273206\", [\"254:150:556:439\"] = \"273199\", [\"257:238:399:340\"] = \"273185, 445588\", [\"271:258:372:268\"] = \"273192, 445585, 445586, 445587\", [\"317:183:424:474\"] = \"273198, 445584\", [\"332:268:304:0\"] = \"273184, 445581, 445582, 445583\", [\"333:255:500:17\"] = \"273203, 445592\", [\"362:252:92:302\"] = \"273187, 445593\", [\"367:340:229:33\"] = \"273207, 445589, 445590, 445591\", [\"376:289:93:118\"] = \"273202, 445578, 445579, 445580\",},\n\t[99] = {[\"128:193:554:475\"] = \"271603\", [\"128:197:584:471\"] = \"271598\", [\"128:248:511:420\"] = \"271592\", [\"128:253:183:415\"] = \"271625\", [\"128:256:292:319\"] = \"271633\", [\"128:256:580:399\"] = \"271630\", [\"256:128:231:404\"] = \"271627\", [\"256:128:243:469\"] = \"271635\", [\"256:128:255:507\"] = \"271596\", [\"256:128:524:359\"] = \"271591\", [\"256:128:539:305\"] = \"271628\", [\"256:172:378:496\"] = \"271614\", [\"256:174:464:494\"] = \"271615\", [\"256:256:215:298\"] = \"271601\", [\"256:256:307:136\"] = \"271608\", [\"256:256:324:384\"] = \"271599\", [\"256:256:361:298\"] = \"271637\", [\"256:256:386:386\"] = \"271612\", [\"256:256:460:373\"] = \"271588\", [\"256:256:474:314\"] = \"271610\", [\"256:256:605:253\"] = \"271604\", [\"256:256:669:228\"] = \"271586\", [\"256:353:648:315\"] = \"271587, 271590\", [\"512:512:195:5\"] = \"271619, 271602, 271589, 271638\", [\"512:512:440:87\"] = \"271632, 271600, 271617, 271618\",},\n\t[100] = {[\"256:256:184:238\"] = \"271744\", [\"256:256:210:126\"] = \"271716\", [\"256:256:40:287\"] = \"271752\", [\"256:256:585:0\"] = \"271761\", [\"256:262:364:406\"] = \"271711, 271717\", [\"256:449:340:219\"] = \"271740, 271730\", [\"256:512:365:2\"] = \"271762, 271751\", [\"256:512:448:150\"] = \"271741, 271723\", [\"256:512:60:117\"] = \"271754, 271733\", [\"404:436:598:232\"] = \"271742, 271728, 271758, 271706\", [\"427:256:575:0\"] = \"271735, 271736\", [\"429:256:573:136\"] = \"271715, 271745\", [\"512:256:326:0\"] = \"271729, 271707\", [\"512:256:460:0\"] = \"271731, 271719\", [\"512:293:95:375\"] = \"271721, 271725, 271714, 271737\", [\"512:431:466:237\"] = \"271712, 271757, 271713, 271734\", [\"512:512:44:0\"] = \"271726, 271756, 271727, 271710\",},\n\t[102] = {[\"128:256:462:349\"] = \"270497\", [\"256:128:356:0\"] = \"270493\", [\"256:222:23:446\"] = \"270498\", [\"256:247:220:421\"] = \"270482\", [\"256:256:174:363\"] = \"270492\", [\"256:256:176:303\"] = \"270463\", [\"256:256:281:305\"] = \"270509\", [\"256:256:291:3\"] = \"270510\", [\"256:256:352:378\"] = \"270481\", [\"256:256:365:49\"] = \"270488\", [\"256:256:383:249\"] = \"270513\", [\"256:256:449:183\"] = \"270508\", [\"256:256:488:24\"] = \"270474\", [\"256:256:507:350\"] = \"270512\", [\"256:256:515:279\"] = \"270476\", [\"475:512:527:104\"] = \"270511, 270483, 270489, 270484\", [\"512:512:74:85\"] = \"270475, 270515, 270495, 270505\",},\n\t[105] = {[\"256:256:182:412\"] = \"271830\", [\"256:256:206:110\"] = \"271835\", [\"256:256:34:142\"] = \"271836\", [\"256:256:467:154\"] = \"271852\", [\"256:256:469:298\"] = \"271848\", [\"256:256:705:368\"] = \"271843\", [\"256:260:308:408\"] = \"271838, 271861\", [\"256:378:25:290\"] = \"271850, 271864\", [\"256:458:338:210\"] = \"271855, 271833\", [\"256:512:326:45\"] = \"271840, 271849\", [\"256:512:579:128\"] = \"271866, 271821\", [\"256:512:737:156\"] = \"271854, 271825\", [\"422:238:580:430\"] = \"271826, 271822\", [\"512:255:261:413\"] = \"271856, 271820\", [\"512:256:477:6\"] = \"271867, 271842\", [\"512:342:183:326\"] = \"271862, 271844, 271823, 271831\", [\"512:512:38:152\"] = \"271851, 271841, 271865, 271853\", [\"512:512:478:25\"] = \"271863, 271857, 271845, 271839\",},\n\t[107] = {[\"256:128:124:0\"] = \"273241\", [\"256:207:720:461\"] = \"273266\", [\"256:256:175:232\"] = \"273267\", [\"256:256:31:339\"] = \"273262\", [\"256:256:342:249\"] = \"273233\", [\"256:256:512:303\"] = \"273271\", [\"256:256:596:412\"] = \"273280\", [\"256:256:81:152\"] = \"273222\", [\"256:256:88:50\"] = \"273235\", [\"256:343:141:325\"] = \"273224, 273225\", [\"256:512:219:51\"] = \"273268, 273226\", [\"256:512:329:25\"] = \"273223, 273272\", [\"256:512:462:90\"] = \"273253, 273242\", [\"256:512:569:112\"] = \"273249, 273238\", [\"286:512:716:128\"] = \"273243, 273273, 273250, 273251\", [\"308:256:694:321\"] = \"273276, 273246\", [\"512:256:20:202\"] = \"273248, 273279\", [\"512:336:314:332\"] = \"273221, 273269, 273236, 273277\",},\n\t[109] = {[\"256:256:143:256\"] = \"272431\", [\"256:256:520:93\"] = \"272421\", [\"256:256:554:308\"] = \"272461\", [\"256:512:290:129\"] = \"272451, 272471\", [\"396:512:606:126\"] = \"272429, 272470, 272446, 272450\", [\"492:223:510:445\"] = \"272442, 272443\", [\"512:358:343:310\"] = \"272454, 272426, 272439, 272455\", [\"512:410:469:258\"] = \"272448, 272449, 272469, 272452\", [\"512:439:168:229\"] = \"272430, 272460, 272434, 272435\", [\"512:512:104:155\"] = \"272436, 272440, 272441, 272427\", [\"512:512:116:35\"] = \"272428, 272424, 272433, 272445\", [\"512:512:348:8\"] = \"272467, 272465, 272422, 272453\", [\"512:512:394:90\"] = \"272459, 272438, 272463, 272447\",},\n\t[110] = {[\"256:128:563:151\"] = \"270643\", [\"256:240:271:428\"] = \"270622\", [\"256:254:446:414\"] = \"270642\", [\"256:256:254:176\"] = \"270663\", [\"256:256:286:28\"] = \"270625\", [\"256:256:412:95\"] = \"270631\", [\"256:256:422:0\"] = \"270665\", [\"256:256:439:210\"] = \"270649\", [\"256:256:527:81\"] = \"270611\", [\"256:256:585:0\"] = \"270651\", [\"256:256:623:147\"] = \"270666\", [\"256:256:629:406\"] = \"270667\", [\"256:256:658:297\"] = \"270655\", [\"256:256:673:71\"] = \"270626\", [\"256:256:733:109\"] = \"270609\", [\"256:297:342:371\"] = \"270669, 270657\", [\"256:318:289:350\"] = \"270638, 270630\", [\"256:336:533:332\"] = \"270612, 270658\", [\"256:396:405:272\"] = \"270664, 270659\", [\"256:410:554:258\"] = \"270629, 270606\", [\"256:419:512:249\"] = \"270644, 270610\", [\"256:462:166:206\"] = \"270652, 270653\", [\"256:507:314:161\"] = \"270619, 270620\", [\"256:512:479:98\"] = \"270616, 270617\", [\"416:256:586:147\"] = \"270628, 270605\", [\"512:252:144:416\"] = \"270662, 270632\", [\"512:256:214:55\"] = \"270621, 270633\",},\n\t[111] = {[\"128:128:180:216\"] = \"270671\", [\"239:256:763:256\"] = \"270710\", [\"256:185:309:483\"] = \"270718\", [\"256:198:503:470\"] = \"270687\", [\"256:256:205:39\"] = \"270701\", [\"256:256:221:136\"] = \"270676\", [\"256:256:232:242\"] = \"270703\", [\"256:256:250:404\"] = \"270739\", [\"256:256:293:285\"] = \"270728\", [\"256:256:297:136\"] = \"270733\", [\"256:256:302:27\"] = \"270727\", [\"256:256:367:209\"] = \"270679\", [\"256:256:414:406\"] = \"270700\", [\"256:256:437:258\"] = \"270698\", [\"256:256:451:29\"] = \"270734\", [\"256:256:481:117\"] = \"270720\", [\"256:256:546:410\"] = \"270699\", [\"256:256:555:87\"] = \"270741\", [\"256:256:556:216\"] = \"270740\", [\"256:256:598:338\"] = \"270677\", [\"256:256:613:82\"] = \"270709\", [\"256:256:637:0\"] = \"270714\", [\"256:256:657:78\"] = \"270712\", [\"256:256:729:54\"] = \"270682\", [\"256:512:44:62\"] = \"270690, 270729\", [\"485:141:517:527\"] = \"270711, 270723\", [\"512:242:177:426\"] = \"270674, 270731\", [\"512:430:43:238\"] = \"270692, 270673, 270702, 270672\",},\n\t[112] = {[\"256:241:558:427\"] = \"272204\", [\"256:256:157:32\"] = \"272235\", [\"256:256:162:154\"] = \"272198\", [\"256:256:219:199\"] = \"272231\", [\"256:256:277:54\"] = \"272242\", [\"256:256:335:193\"] = \"272213\", [\"256:256:351:52\"] = \"272237\", [\"256:256:387:390\"] = \"272220\", [\"256:256:391:258\"] = \"272230\", [\"256:256:431:143\"] = \"272188\", [\"256:256:504:53\"] = \"272208\", [\"256:256:532:363\"] = \"272236\", [\"256:256:533:267\"] = \"272206\", [\"256:256:598:79\"] = \"272232\", [\"256:256:666:233\"] = \"272244\", [\"256:334:660:334\"] = \"272196, 272197\", [\"256:512:10:107\"] = \"272199, 272200\", [\"512:334:168:334\"] = \"272205, 272229, 272190, 272238\", [\"512:420:36:248\"] = \"272224, 272233, 272191, 272212\",},\n\t[113] = {[\"128:256:316:268\"] = \"272840\", [\"256:208:321:460\"] = \"272889\", [\"256:234:247:434\"] = \"272843\", [\"256:256:116:4\"] = \"272878\", [\"256:256:222:362\"] = \"272846\", [\"256:256:245:289\"] = \"272881\", [\"256:256:310:345\"] = \"272887\", [\"256:256:314:0\"] = \"272837\", [\"256:256:377:272\"] = \"272836\", [\"256:256:397:165\"] = \"272839\", [\"256:256:417:327\"] = \"272873\", [\"256:256:478:19\"] = \"272880\", [\"256:256:480:277\"] = \"272866\", [\"256:256:505:154\"] = \"272886\", [\"256:256:521:275\"] = \"272835\", [\"256:367:103:301\"] = \"272844, 272847\", [\"256:512:455:34\"] = \"272879, 272834\", [\"385:512:617:149\"] = \"272860, 272855, 272850, 272856\", [\"512:256:143:171\"] = \"272851, 272867\", [\"512:320:449:348\"] = \"272876, 272888, 272857, 272877\", [\"512:512:104:4\"] = \"272861, 272831, 272883, 272838\",},\n\t[114] = {[\"256:128:241:388\"] = \"272255\", [\"256:145:490:523\"] = \"272274\", [\"256:179:357:489\"] = \"272288\", [\"256:213:239:455\"] = \"272292\", [\"256:217:454:451\"] = \"272253\", [\"256:256:132:294\"] = \"272262\", [\"256:256:171:155\"] = \"272247\", [\"256:256:229:38\"] = \"272263\", [\"256:256:237:22\"] = \"272273\", [\"256:256:253:301\"] = \"272283\", [\"256:256:298:134\"] = \"272285\", [\"256:256:328:397\"] = \"272280\", [\"256:256:356:261\"] = \"272249\", [\"256:256:396:10\"] = \"272269\", [\"256:256:411:20\"] = \"272248\", [\"256:256:465:336\"] = \"272260\", [\"256:256:481:208\"] = \"272264\", [\"256:256:513:138\"] = \"272282\", [\"256:256:644:173\"] = \"272287\", [\"256:387:147:281\"] = \"272279, 272265\", [\"409:384:593:284\"] = \"272267, 272254, 272268, 272284\", [\"512:256:354:49\"] = \"272296, 272294\",},\n\t[119] = {[\"186:276:272:237\"] = \"270870, 270743\", [\"203:209:662:11\"] = \"270848\", [\"244:214:325:140\"] = \"270785\", [\"244:319:397:66\"] = \"270900, 270819\", [\"259:302:457:264\"] = \"270903, 270781, 270794, 270855\", [\"260:278:329:237\"] = \"270851, 270871, 270795, 270769\", [\"267:378:153:238\"] = \"270822, 270894, 270835, 270784\", [\"289:279:707:181\"] = \"270765, 270824, 270887, 270801\", [\"290:292:712:15\"] = \"270826, 270865, 270759, 270763\", [\"375:342:480:0\"] = \"270869, 270890, 270764, 270762\", [\"382:258:293:383\"] = \"270761, 270879, 270880, 270787\", [\"385:316:509:214\"] = \"270898, 270840, 270899, 270812\", [\"396:203:314:0\"] = \"270806, 270810\", [\"460:381:50:0\"] = \"270821, 270758, 270797, 270775\",},\n\t[120] = {[\"188:211:374:208\"] = \"271192\", [\"196:218:543:362\"] = \"271358\", [\"213:219:403:0\"] = \"271232\", [\"214:261:614:358\"] = \"271313, 271133\", [\"226:212:661:264\"] = \"271378\", [\"229:259:487:0\"] = \"271146, 271257\", [\"229:299:42:187\"] = \"271267, 271201\", [\"235:337:134:165\"] = \"271254, 271233\", [\"235:354:569:7\"] = \"271149, 271222\", [\"236:218:258:203\"] = \"271170\", [\"258:225:433:118\"] = \"271239, 271157\", [\"299:278:703:7\"] = \"271351, 271270, 271175, 271330\", [\"301:286:698:332\"] = \"271280, 271346, 271164, 271387\", [\"304:203:256:104\"] = \"271352, 271244\", [\"306:242:210:0\"] = \"271187, 271231\", [\"311:272:691:160\"] = \"271333, 271199, 271364, 271162\", [\"317:353:453:219\"] = \"271205, 271248, 271252, 271236\", [\"356:300:217:313\"] = \"271322, 271298, 271290, 271337\",},\n\t[121] = {[\"249:235:232:129\"] = \"271764\", [\"274:207:18:461\"] = \"271794, 271778\", [\"278:290:217:244\"] = \"271801, 271773, 271779, 271806\", [\"283:247:176:421\"] = \"271789, 271812\", [\"294:227:358:187\"] = \"271785, 271817\", [\"324:265:548:137\"] = \"271790, 271765, 271766, 271767\", [\"328:260:331:32\"] = \"271809, 271771, 271772, 271776\", [\"329:246:509:0\"] = \"271769, 271770\", [\"332:294:17:307\"] = \"271768, 271783, 271795, 271810\", [\"351:284:607:41\"] = \"271791, 271807, 271774, 271796\", [\"356:224:7:207\"] = \"271781, 271784\", [\"382:285:0:46\"] = \"271792, 271775, 271813, 271797\", [\"455:400:547:257\"] = \"271798, 271780, 271814, 271799\", [\"475:362:312:294\"] = \"271803, 271788, 271816, 271805\",},\n\t[122] = {[\"174:173:576:170\"] = \"271946\", [\"177:191:342:351\"] = \"271992\", [\"178:208:595:240\"] = \"271945\", [\"181:178:490:161\"] = \"271993\", [\"187:263:397:208\"] = \"271980, 271994\", [\"193:201:668:223\"] = \"271950\", [\"213:256:283:203\"] = \"271976\", [\"222:168:222:100\"] = \"271959\", [\"223:209:354:0\"] = \"271957\", [\"223:338:664:25\"] = \"271956, 271974\", [\"232:216:585:336\"] = \"271941\", [\"238:232:343:108\"] = \"271984\", [\"242:189:225:0\"] = \"271954\", [\"244:305:621:327\"] = \"271969, 271989\", [\"248:382:477:216\"] = \"271985, 271968\", [\"251:192:490:0\"] = \"271970\", [\"263:265:99:37\"] = \"271940, 271975, 271953, 271991\", [\"266:210:420:57\"] = \"271952, 271967\", [\"284:308:415:360\"] = \"271997, 271998, 271963, 271964\", [\"298:306:572:0\"] = \"271977, 271978, 271979, 271958\", [\"333:265:99:278\"] = \"271962, 271987, 271983, 271988\", [\"347:220:90:180\"] = \"271986, 271960\", [\"350:258:168:410\"] = \"271965, 271966, 271972, 271973\",},\n\t[123] = {[\"204:268:0:167\"] = \"254677, 254678\", [\"219:283:218:291\"] = \"254688, 254689\", [\"223:207:444:276\"] = \"254695\", [\"223:399:321:15\"] = \"254690, 254691\", [\"227:210:327:305\"] = \"254687\", [\"238:240:217:50\"] = \"254692\", [\"245:239:690:267\"] = \"254679\", [\"248:243:538:181\"] = \"254684\", [\"269:217:715:390\"] = \"254693, 254694\", [\"283:231:558:329\"] = \"254685, 254686\", [\"300:343:626:31\"] = \"254680, 254681, 254682, 254683\", [\"308:202:392:466\"] = \"254659, 254660\", [\"308:212:342:392\"] = \"254657, 254658\", [\"314:224:616:30\"] = \"294026, 294027\", [\"373:375:355:37\"] = \"254653, 254654, 254655, 254656\", [\"393:474:22:122\"] = \"254673, 254674, 254675, 254676\",},\n\t[124] = {[\"207:235:427:244\"] = \"272524\", [\"233:286:705:236\"] = \"272529, 272506\", [\"239:313:265:355\"] = \"272530, 272516\", [\"249:248:172:135\"] = \"272507\", [\"268:288:138:58\"] = \"272517, 272534, 272496, 272502\", [\"293:229:396:51\"] = \"272500, 272501\", [\"294:327:308:34\"] = \"272523, 272487, 272539, 272532\", [\"312:369:501:134\"] = \"272494, 272495, 272504, 272533\", [\"322:265:596:92\"] = \"272521, 272515, 272522, 272499\", [\"329:293:76:375\"] = \"272509, 272491, 272520, 272484\", [\"455:316:82:186\"] = \"272535, 272518, 272490, 272519\", [\"468:329:359:339\"] = \"272498, 272531, 272510, 272541\",},\n\t[125] = {[\"169:164:239:301\"] = \"272922\", [\"180:239:214:144\"] = \"272933\", [\"182:270:570:113\"] = \"272927, 272910\", [\"184:191:395:470\"] = \"272909\", [\"205:232:162:143\"] = \"272920\", [\"210:179:316:296\"] = \"272945\", [\"221:200:108:206\"] = \"272906\", [\"228:158:98:318\"] = \"272924\", [\"244:220:134:429\"] = \"272919\", [\"251:200:242:468\"] = \"272921\", [\"305:298:339:370\"] = \"272904, 272925, 272926, 272952\", [\"306:484:627:179\"] = \"272934, 272923, 272908, 272930\", [\"309:383:481:285\"] = \"272939, 272953, 272905, 272935\", [\"322:195:109:375\"] = \"272948, 272950\", [\"363:341:292:122\"] = \"272912, 272913, 272914, 272946\", [\"369:265:218:0\"] = \"272943, 272944, 272931, 272917\",},\n\t[126] = {[\"218:291:174:191\"] = \"273324, 273292\", [\"237:248:288:168\"] = \"273329\", [\"247:304:431:127\"] = \"273322, 273320\", [\"249:258:479:241\"] = \"273304, 273305\", [\"261:288:607:251\"] = \"273309, 273286, 273310, 273328\", [\"265:257:533:345\"] = \"273296, 273300, 273285, 273287\", [\"266:254:289:287\"] = \"273330, 273291\", [\"272:268:0:247\"] = \"273318, 273298, 273336, 273303\", [\"286:265:326:358\"] = \"273311, 273297, 273331, 273317\", [\"302:231:380:437\"] = \"273323, 273289\", [\"307:256:7:412\"] = \"273326, 273333\", [\"311:317:575:88\"] = \"273325, 273307, 273308, 273319\", [\"321:305:181:363\"] = \"273312, 273332, 273282, 273302\", [\"336:297:629:0\"] = \"273295, 273301, 273321, 273288\",},\n\t[127] = {[\"512:416:252:252\"] = \"272721, 272732, 272715, 272722\", [\"512:512:251:4\"] = \"272716, 272728, 272723, 272733\",},\n\t[132] = {[\"252:260:0:91\"] = \"270966, 271005\", [\"264:303:0:176\"] = \"270987, 270962, 270973, 270997\", [\"288:222:0:0\"] = \"253268, 271000\", [\"416:424:0:244\"] = \"270970, 270961, 270971, 270996\", [\"446:369:536:40\"] = \"253267, 270960, 270995, 270989\", [\"502:477:500:105\"] = \"253269, 270985, 253270, 270986\", [\"544:668:129:0\"] = \"253264, 271003, 270968, 270965, 253265, 253266, 271002, 271004, 270984\", [\"558:285:444:383\"] = \"253271, 253272, 270974, 270975, 271001, 270980\",},\n\t[179] = {[\"142:133:377:359\"] = \"440843\", [\"156:142:433:11\"] = \"440842\", [\"159:230:264:144\"] = \"440863\", [\"168:205:416:368\"] = \"440853\", [\"172:175:189:408\"] = \"440859\", [\"173:180:351:21\"] = \"440840\", [\"177:172:129:348\"] = \"440838\", [\"190:186:416:131\"] = \"440860\", [\"210:258:492:161\"] = \"440851, 440852\", [\"212:193:279:68\"] = \"440862\", [\"212:216:440:452\"] = \"440854\", [\"221:211:508:345\"] = \"440850\", [\"222:190:244:458\"] = \"440841\", [\"231:216:213:325\"] = \"440861\", [\"248:209:462:43\"] = \"440839\", [\"305:288:323:185\"] = \"440855, 440856, 440857, 440858\", [\"350:517:581:21\"] = \"440844, 440845, 440846, 440847, 440848, 440849\",},\n\t[184] = {[\"177:219:293:449\"] = \"438477\", [\"194:236:167:352\"] = \"438476\", [\"210:166:261:427\"] = \"438440\", [\"222:268:393:386\"] = \"438482, 438483\", [\"244:241:141:202\"] = \"438475\", [\"267:314:387:0\"] = \"438484, 438485, 438486, 438487\", [\"280:224:504:394\"] = \"438498, 438499\", [\"280:342:298:95\"] = \"438478, 438479, 438480, 438481\", [\"281:351:639:43\"] = \"438443, 438444, 438445, 438446\", [\"282:263:483:210\"] = \"438447, 438448, 438449, 438450\", [\"282:298:482:14\"] = \"438488, 438489, 438490, 438491\", [\"286:178:272:333\"] = \"438441, 438442\", [\"321:203:516:465\"] = \"438492, 438493\", [\"328:336:160:0\"] = \"438500, 438501, 438502, 438503\", [\"350:345:652:290\"] = \"438494, 438495, 438496, 438497\",},\n\t[199] = {[\"1002:664:0:4\"] = \"466830, 466834, 466835, 466836, 466837, 466838, 466839, 466840, 466841, 466831, 466832, 466833\",},\n\t[203] = {[\"270:173:303:197\"] = \"438644, 438645\", [\"270:300:320:5\"] = \"438632, 438633, 438634, 438635, 438632, 438633, 438634, 438635, 438632, 438633, 438634, 438635\", [\"272:334:622:320\"] = \"438646, 438647, 438648, 438649\", [\"277:232:139:436\"] = \"438668, 438669\", [\"282:418:6:78\"] = \"438636, 438637, 438638, 438639\", [\"291:321:116:17\"] = \"438670, 438671, 438672, 438673\", [\"320:471:682:128\"] = \"438640, 438641, 438642, 438643\", [\"365:264:411:216\"] = \"438678, 438679, 438680, 438681\", [\"419:290:318:378\"] = \"438682, 438683, 438684, 438685\", [\"441:319:52:253\"] = \"438674, 438675, 438676, 438677\", [\"537:323:392:0\"] = \"438662, 438663, 438664, 438665, 438666, 438667\",},\n\t[204] = {[\"214:140:273:528\"] = \"440758\", [\"216:172:423:251\"] = \"440749\", [\"218:178:300:64\"] = \"440753\", [\"242:195:269:436\"] = \"440750\", [\"254:214:267:196\"] = \"440763\", [\"269:211:398:457\"] = \"440745, 440746\", [\"280:279:548:147\"] = \"440754, 440755, 440756, 440757\", [\"285:171:244:286\"] = \"440759, 440760\", [\"315:170:201:0\"] = \"440751, 440752\", [\"355:226:289:117\"] = \"440761, 440762\", [\"384:248:274:307\"] = \"440747, 440748\",},\n\t[206] = {[\"220:189:528:228\"] = \"440974\", [\"227:207:399:280\"] = \"440977\", [\"278:315:210:35\"] = \"440984, 440985, 440986, 440987\", [\"291:206:380:43\"] = \"440982, 440983\", [\"311:217:451:325\"] = \"440975, 440976\", [\"316:267:456:401\"] = \"440978, 440979, 440980, 440981\", [\"340:225:365:162\"] = \"440988, 440989\",},\n\t[209] = {[\"225:250:415:183\"] = \"440973\", [\"267:374:266:280\"] = \"440955, 440956, 440957, 440958\", [\"298:251:315:110\"] = \"440963, 440964\", [\"306:293:162:210\"] = \"440969, 440970, 440971, 440972\", [\"363:262:275:32\"] = \"440959, 440960, 440961, 440962\", [\"370:385:412:283\"] = \"440965, 440966, 440967, 440968\", [\"371:394:50:263\"] = \"440947, 440948, 440949, 440950\", [\"491:470:497:0\"] = \"440951, 440952, 440953, 440954\",},\n\t[210] = {[\"197:223:554:175\"] = \"440998\", [\"272:180:270:222\"] = \"440992, 440993\", [\"286:269:460:261\"] = \"440994, 440995, 440996, 440997\", [\"335:223:407:445\"] = \"440990, 440991\", [\"339:278:400:0\"] = \"441003, 441004, 441005, 441006\", [\"349:361:217:268\"] = \"440999, 441000, 441001, 441002\", [\"480:319:150:32\"] = \"441007, 441008, 441009, 441010\",},\n\t[212] = {[\"237:198:297:384\"] = \"438312\", [\"274:156:434:0\"] = \"438306, 438307\", [\"292:285:458:383\"] = \"438294, 438295, 438296, 438297\", [\"355:345:287:177\"] = \"438298, 438299, 438300, 438301\", [\"370:285:0:146\"] = \"438280, 438281, 438282, 438283\", [\"371:354:0:314\"] = \"438290, 438291, 438292, 438293\", [\"378:359:20:0\"] = \"438276, 438277, 438278, 438279\", [\"411:248:570:420\"] = \"438310, 438311\", [\"430:230:141:438\"] = \"438308, 438309\", [\"454:343:549:297\"] = \"438272, 438273, 438274, 438275\", [\"462:400:540:12\"] = \"438268, 438269, 438270, 438271\", [\"467:273:85:0\"] = \"438302, 438303, 438304, 438305\", [\"516:287:448:0\"] = \"438284, 438285, 438286, 438287, 438288, 438289\",},\n\t[215] = {[\"155:221:468:119\"] = \"438752\", [\"184:176:533:181\"] = \"438751\", [\"225:255:289:341\"] = \"438740\", [\"236:276:340:392\"] = \"438754, 438755\", [\"238:260:345:0\"] = \"438743, 438744\", [\"240:264:471:404\"] = \"438747, 438748\", [\"244:209:452:0\"] = \"438753\", [\"246:221:292:213\"] = \"438750\", [\"253:242:408:248\"] = \"438749\", [\"271:204:528:73\"] = \"438741, 438742\", [\"356:221:208:116\"] = \"438745, 438746\",},\n\t[216] = {[\"177:219:293:449\"] = \"438541\", [\"194:236:167:352\"] = \"438540\", [\"210:166:261:427\"] = \"438504\", [\"222:268:393:386\"] = \"438546, 438547\", [\"244:241:141:202\"] = \"438539\", [\"250:298:482:14\"] = \"438552, 438553\", [\"267:314:387:0\"] = \"438548, 438549, 438550, 438551\", [\"280:224:504:394\"] = \"438562, 438563\", [\"280:342:298:95\"] = \"438542, 438543, 438544, 438545\", [\"281:351:639:43\"] = \"438507, 438508, 438509, 438510\", [\"282:263:483:210\"] = \"438523, 438524, 438525, 438526\", [\"286:178:272:333\"] = \"438505, 438506\", [\"321:203:516:465\"] = \"438556, 438557\", [\"328:336:160:0\"] = \"438564, 438565, 438566, 438567\", [\"350:345:652:290\"] = \"438558, 438559, 438560, 438561\",},\n\t[220] = {[\"177:219:293:449\"] = \"438605\", [\"194:236:167:352\"] = \"438604\", [\"210:166:261:427\"] = \"438568\", [\"222:268:393:386\"] = \"438610, 438611\", [\"244:241:141:202\"] = \"438603\", [\"267:314:387:0\"] = \"438612, 438613, 438614, 438615\", [\"280:224:504:394\"] = \"438626, 438627\", [\"280:342:298:95\"] = \"438606, 438607, 438608, 438609\", [\"281:351:639:43\"] = \"438571, 438572, 438573, 438574\", [\"282:263:483:210\"] = \"438587, 438588, 438589, 438590\", [\"282:298:482:14\"] = \"438616, 438617, 438618, 438619\", [\"286:178:272:333\"] = \"438569, 438570\", [\"321:203:516:465\"] = \"438620, 438621\", [\"328:336:160:0\"] = \"438628, 438629, 438630, 438631\", [\"350:345:652:290\"] = \"438622, 438623, 438624, 438625\",},\n\t[225] = {[\"142:133:377:359\"] = \"457676\", [\"156:142:433:11\"] = \"457675\", [\"159:230:264:144\"] = \"457696\", [\"168:205:416:368\"] = \"457686\", [\"172:175:189:408\"] = \"457692\", [\"173:180:351:21\"] = \"457673\", [\"177:172:129:348\"] = \"457671\", [\"190:186:416:131\"] = \"457693\", [\"210:258:492:161\"] = \"457684, 457685\", [\"212:193:279:68\"] = \"457695\", [\"212:216:440:452\"] = \"457687\", [\"221:211:508:345\"] = \"457683\", [\"222:190:244:458\"] = \"457674\", [\"231:216:213:325\"] = \"457694\", [\"248:209:462:43\"] = \"457672\", [\"305:288:323:185\"] = \"457688, 457689, 457690, 457691\", [\"350:517:581:21\"] = \"457677, 457678, 457679, 457680, 457681, 457682\",},\n\t[226] = {[\"142:133:377:359\"] = \"440869\", [\"156:142:433:11\"] = \"440868\", [\"159:230:264:144\"] = \"440913\", [\"168:205:416:368\"] = \"440879\", [\"172:175:189:408\"] = \"440885\", [\"173:180:351:21\"] = \"440866\", [\"177:172:129:348\"] = \"440864\", [\"190:186:416:131\"] = \"440886\", [\"210:258:492:161\"] = \"440877, 440878\", [\"212:193:279:68\"] = \"440912\", [\"212:216:440:452\"] = \"440880\", [\"221:211:508:345\"] = \"440876\", [\"222:190:244:458\"] = \"440867\", [\"231:216:213:325\"] = \"440911\", [\"248:209:462:43\"] = \"440865\", [\"305:288:323:185\"] = \"440881, 440882, 440883, 440884\", [\"350:517:581:21\"] = \"440870, 440871, 440872, 440873, 440874, 440875\",},\n\t[227] = {[\"270:173:303:197\"] = \"438698, 438699\", [\"270:300:320:5\"] = \"438686, 438687, 438688, 438689, 438686, 438687, 438688, 438689, 438686, 438687, 438688, 438689\", [\"272:334:622:320\"] = \"438700, 438701, 438702, 438703\", [\"277:232:139:436\"] = \"438722, 438723\", [\"282:418:6:78\"] = \"438690, 438691, 438692, 438693\", [\"291:321:116:17\"] = \"438724, 438725, 438726, 438727\", [\"320:471:682:128\"] = \"438694, 438695, 438696, 438697\", [\"365:264:411:216\"] = \"438732, 438733, 438734, 438735\", [\"419:290:318:378\"] = \"438736, 438737, 438738, 438739\", [\"441:319:52:253\"] = \"438728, 438729, 438730, 438731, 438728, 438729, 438730, 438731\", [\"537:323:392:0\"] = \"438716, 438717, 438718, 438719, 438720, 438721\",},\n\t[228] = {[\"1002:668:0:0\"] = \"464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055, 464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055, 464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055, 464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055, 464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055\",},\n\t[252] = {[\"143:141:344:89\"] = \"458560\", [\"165:199:327:356\"] = \"458579\", [\"174:190:291:89\"] = \"458554\", [\"175:180:269:179\"] = \"458572\", [\"177:159:302:306\"] = \"458587\", [\"182:195:370:447\"] = \"458548\", [\"191:198:205:232\"] = \"458589\", [\"194:170:543:220\"] = \"458555\", [\"197:218:395:367\"] = \"458552\", [\"198:201:622:169\"] = \"458570\", [\"199:212:312:192\"] = \"458574\", [\"203:208:387:268\"] = \"458547\", [\"206:182:296:0\"] = \"458569\", [\"211:210:498:121\"] = \"458571\", [\"214:190:358:0\"] = \"458588\", [\"215:157:416:205\"] = \"458546\", [\"215:181:499:265\"] = \"458553\", [\"220:227:697:403\"] = \"458558\", [\"226:232:654:0\"] = \"458573\", [\"230:276:83:223\"] = \"458556, 458557\", [\"238:229:374:93\"] = \"458580\", [\"239:232:482:330\"] = \"458559\", [\"251:207:631:245\"] = \"458551\", [\"260:202:610:345\"] = \"458581, 458582\", [\"283:206:76:120\"] = \"458549, 458550\", [\"308:267:482:0\"] = \"458561, 458562, 458563, 458564\", [\"324:264:71:16\"] = \"458583, 458584, 458585, 458586\", [\"342:288:436:380\"] = \"458565, 458566, 458567, 458568\", [\"361:354:151:314\"] = \"458575, 458576, 458577, 458578\",},\n\t[260] = {[\"150:159:545:193\"] = \"458658\", [\"151:144:479:215\"] = \"458668\", [\"160:193:406:174\"] = \"458641\", [\"161:236:647:15\"] = \"458663\", [\"164:185:471:277\"] = \"458634\", [\"196:170:551:121\"] = \"458646\", [\"202:169:341:402\"] = \"458635\", [\"203:215:542:0\"] = \"458638\", [\"203:249:217:289\"] = \"458653\", [\"206:204:657:349\"] = \"458664\", [\"209:254:407:384\"] = \"458643\", [\"213:195:656:473\"] = \"458665\", [\"228:227:411:67\"] = \"458650\", [\"233:321:527:291\"] = \"458639, 458640\", [\"237:194:583:162\"] = \"458642\", [\"237:316:752:170\"] = \"458661, 458662\", [\"249:243:264:136\"] = \"458649\", [\"269:203:340:282\"] = \"458647, 458648\", [\"269:242:599:184\"] = \"458636, 458637\", [\"270:229:229:433\"] = \"458666, 458667\", [\"278:173:365:0\"] = \"458651, 458652\", [\"296:209:132:127\"] = \"458659, 458660\", [\"312:289:28:221\"] = \"458654, 458655, 458656, 458657\", [\"400:224:110:0\"] = \"458644, 458645\",},\n\t[289] = {[\"150:159:545:193\"] = \"458693\", [\"151:144:479:215\"] = \"458715\", [\"160:193:406:174\"] = \"458676\", [\"161:236:647:15\"] = \"458698\", [\"164:185:471:277\"] = \"458669\", [\"196:170:551:121\"] = \"458681\", [\"202:169:341:402\"] = \"458670\", [\"203:215:542:0\"] = \"458673\", [\"203:249:217:289\"] = \"458688\", [\"206:204:657:349\"] = \"458699\", [\"209:254:407:384\"] = \"458678\", [\"213:195:656:473\"] = \"458700\", [\"228:227:411:67\"] = \"458685\", [\"233:321:527:291\"] = \"458674, 458675\", [\"237:194:583:162\"] = \"458677\", [\"237:316:752:170\"] = \"458696, 458697\", [\"249:243:264:136\"] = \"458684\", [\"269:203:340:282\"] = \"458682, 458683\", [\"269:242:599:184\"] = \"458671, 458672\", [\"270:229:229:433\"] = \"458701, 458702\", [\"278:173:365:0\"] = \"458686, 458687\", [\"296:209:132:127\"] = \"458694, 458695\", [\"312:289:28:221\"] = \"458689, 458690, 458691, 458692\", [\"400:224:110:0\"] = \"458679, 458680\",},\n\t[338] = {[\"143:141:344:89\"] = \"458604\", [\"165:199:327:356\"] = \"458623, 458623\", [\"174:190:291:89\"] = \"458598\", [\"175:180:269:179\"] = \"458616\", [\"177:159:302:306\"] = \"458631\", [\"182:195:370:447\"] = \"458592\", [\"191:198:205:232\"] = \"458633\", [\"194:170:543:220\"] = \"458599\", [\"197:218:395:367\"] = \"458596\", [\"198:201:622:169\"] = \"458614\", [\"199:212:312:192\"] = \"458618\", [\"203:208:387:268\"] = \"458591\", [\"206:182:296:0\"] = \"458613\", [\"211:210:498:121\"] = \"458615\", [\"214:190:358:0\"] = \"458632\", [\"215:157:416:205\"] = \"458590\", [\"215:181:499:265\"] = \"458597\", [\"220:227:697:403\"] = \"458602\", [\"226:232:654:0\"] = \"458617\", [\"230:276:83:223\"] = \"458600, 458601\", [\"238:229:374:93\"] = \"458624\", [\"239:232:482:330\"] = \"458603\", [\"251:207:631:245\"] = \"458595\", [\"260:202:610:345\"] = \"458625, 458626\", [\"283:206:76:120\"] = \"458593, 458594\", [\"308:267:482:0\"] = \"458605, 458606, 458607, 458608\", [\"324:264:71:16\"] = \"458627, 458628, 458629, 458630\", [\"342:288:436:380\"] = \"458609, 458610, 458611, 458612\", [\"361:354:151:314\"] = \"458619, 458620, 458621, 458622\",},\n\t[339] = {[\"887:668:115:0\"] = \"462974, 462978, 462979, 462980, 462981, 462982, 462983, 462984, 462985, 462975, 462976, 462977\",},\n\t[383] = {[\"179:180:428:416\"] = \"614290\", [\"191:216:388:299\"] = \"614289\", [\"196:158:316:0\"] = \"614288\", [\"196:166:181:75\"] = \"614284\", [\"202:204:430:21\"] = \"614278\", [\"210:158:202:0\"] = \"614297\", [\"218:148:474:520\"] = \"614277\", [\"219:186:346:482\"] = \"614294\", [\"219:205:189:151\"] = \"614287\", [\"219:256:290:330\"] = \"614286\", [\"227:198:300:56\"] = \"614275\", [\"234:210:325:178\"] = \"614276\", [\"236:142:400:146\"] = \"614285\", [\"242:210:481:215\"] = \"614293\", [\"251:348:539:43\"] = \"614295, 614296\", [\"253:229:182:214\"] = \"614283\", [\"264:211:468:295\"] = \"614291, 614292\", [\"278:310:525:358\"] = \"614279, 614280, 614281, 614282\",},\n\t[388] = {[\"175:291:170:130\"] = \"615423, 615424\", [\"199:304:224:74\"] = \"615411, 615412\", [\"206:245:438:177\"] = \"615408\", [\"208:292:438:41\"] = \"615404, 615405\", [\"209:308:0:343\"] = \"615402, 615403\", [\"213:246:513:58\"] = \"615418\", [\"230:217:561:161\"] = \"615413\", [\"249:342:104:326\"] = \"615414, 615415\", [\"254:259:530:253\"] = \"615421, 615422\", [\"257:288:227:380\"] = \"615425, 615426, 615427, 615428\", [\"260:251:5:239\"] = \"615409, 615410\", [\"273:246:12:105\"] = \"615416, 615417\", [\"277:245:582:301\"] = \"615419, 615420\", [\"286:392:253:75\"] = \"615429, 615430, 615431, 615432\", [\"303:323:699:114\"] = \"615437, 615438, 615439, 615440\", [\"314:212:334:325\"] = \"615406, 615407\", [\"380:317:622:0\"] = \"615433, 615434, 615435, 615436\", [\"510:264:215:404\"] = \"615398, 615399, 615400, 615401\",},\n\t[390] = {[\"220:188:297:324\"] = \"538846\", [\"234:286:134:9\"] = \"538829, 571508\", [\"261:315:203:36\"] = \"538836, 538837, 538838, 538839\", [\"313:321:183:198\"] = \"538847, 538848, 538849, 538850\", [\"346:263:124:405\"] = \"538851, 538852, 538853, 538854\", [\"372:475:545:12\"] = \"538874, 538875, 538876, 538877\", [\"385:373:504:295\"] = \"538870, 538871, 538872, 538873\", [\"607:461:395:182\"] = \"538855, 538856, 538857, 538858, 538859, 538860\", [\"610:374:392:294\"] = \"538830, 538831, 538832, 538833, 538834, 538835\", [\"651:262:351:406\"] = \"538840, 538841, 538842, 538843, 538844, 538845\", [\"677:668:325:0\"] = \"538861, 538862, 538863, 538864, 538865, 538866, 538867, 538868, 538869\", [\"989:466:13:202\"] = \"538890, 538891, 538892, 538893, 538894, 538895, 538896, 538897\",},\n\t[391] = {[\"224:172:322:496\"] = \"614341\", [\"224:241:453:191\"] = \"614367\", [\"229:262:603:313\"] = \"614351, 614352\", [\"240:198:607:470\"] = \"614340\", [\"250:260:587:170\"] = \"614361, 614362\", [\"252:257:233:360\"] = \"614346, 614347\", [\"253:208:462:411\"] = \"614348\", [\"259:233:602:4\"] = \"614344, 614345\", [\"261:162:449:506\"] = \"614342, 614343\", [\"287:277:333:63\"] = \"614353, 614354, 614355, 614356\", [\"298:219:502:64\"] = \"614368, 614369\", [\"310:276:398:310\"] = \"614363, 614364, 614365, 614366\", [\"313:208:228:264\"] = \"614349, 614350\", [\"385:385:88:92\"] = \"614357, 614358, 614359, 614360\",},\n\t[400] = {[\"213:170:413:385\"] = \"614385\", [\"238:296:560:185\"] = \"614379, 614380\", [\"247:221:417:447\"] = \"614374\", [\"255:269:420:209\"] = \"614372, 614373\", [\"261:235:306:433\"] = \"614388, 614389\", [\"271:205:545:369\"] = \"614394, 614395\", [\"282:306:692:362\"] = \"614381, 614382, 614383, 614384\", [\"294:283:92:192\"] = \"614390, 614391, 614392, 614393\", [\"296:359:213:241\"] = \"614375, 614376, 614377, 614378\", [\"300:246:125:0\"] = \"614386, 614387\", [\"353:200:546:468\"] = \"614370, 614371\",},\n\t[402] = {[\"242:254:328:16\"] = \"614447\", [\"267:281:278:170\"] = \"614466, 614467, 614468, 614469\", [\"267:308:349:316\"] = \"614458, 614459, 614460, 614461\", [\"272:522:444:97\"] = \"614452, 614453, 614454, 614455, 614456, 614457\", [\"298:262:482:10\"] = \"614462, 614463, 614464, 614465\", [\"310:305:200:363\"] = \"614435, 614436, 614437, 614438\", [\"337:349:87:3\"] = \"614431, 614432, 614433, 614434\", [\"350:429:0:234\"] = \"614443, 614444, 614445, 614446\", [\"361:333:4:107\"] = \"614470, 614471, 614472, 614473\", [\"373:385:629:22\"] = \"614439, 614440, 614441, 614442\", [\"446:359:556:267\"] = \"614448, 614449, 614450, 614451\",},\n\t[430] = {[\"188:412:397:59\"] = \"614501, 614502\", [\"190:282:513:3\"] = \"614482, 614483\", [\"204:383:444:44\"] = \"614495, 614496\", [\"211:395:125:88\"] = \"614497, 614498\", [\"212:265:317:63\"] = \"614493, 614494\", [\"214:393:218:77\"] = \"614484, 614485\", [\"217:279:589:27\"] = \"614490, 614491\", [\"219:259:300:215\"] = \"614499, 614500\", [\"246:240:343:373\"] = \"614492\", [\"252:313:23:267\"] = \"614507, 614508, 614507, 614508\", [\"257:300:0:79\"] = \"614503, 614504, 614505, 614506\", [\"258:170:330:498\"] = \"614509, 614510\", [\"265:194:545:205\"] = \"614478, 614479\", [\"272:250:176:376\"] = \"614480, 614481\", [\"286:268:701:19\"] = \"614486, 614487, 614488, 614489\", [\"306:204:612:0\"] = \"614511, 614512\",},\n\t[434] = {[\"209:234:593:92\"] = \"642686\", [\"209:318:341:125\"] = \"642670, 642671\", [\"218:186:236:32\"] = \"642683\", [\"236:206:458:110\"] = \"642680\", [\"250:218:351:0\"] = \"642665\", [\"262:293:191:122\"] = \"642674, 642675, 642676, 642677\", [\"268:241:450:406\"] = \"642684, 642685\", [\"290:283:162:385\"] = \"642687, 642688, 642689, 642690\", [\"322:211:437:313\"] = \"642672, 642673\", [\"323:194:441:224\"] = \"642678, 642679\", [\"325:190:485:0\"] = \"642681, 642682\", [\"325:270:214:311\"] = \"642666, 642667, 642668, 642669\",},\n\t[435] = {[\"164:191:565:289\"] = \"651259\", [\"213:257:565:126\"] = \"651260, 651261\", [\"362:222:414:96\"] = \"651257, 651258\", [\"385:146:206:173\"] = \"651255, 651256\",},\n\t[445] = {[\"290:191:412:477\"] = \"615054, 615055, 615054, 615055\", [\"294:220:433:0\"] = \"614718, 614719\", [\"479:493:371:175\"] = \"614714, 614715, 614716, 614717\",},\n\t[498] = {[\"206:200:656:21\"] = \"656197\", [\"270:353:428:0\"] = \"656230, 656231, 656232, 656233\", [\"279:301:358:169\"] = \"656202, 656203, 656204, 656205\", [\"305:247:542:223\"] = \"656224, 656225\", [\"317:230:137:188\"] = \"656222, 656223\", [\"344:183:199:0\"] = \"656198, 656199\", [\"384:249:133:59\"] = \"656200, 656201\", [\"433:351:109:313\"] = \"656218, 656219, 656220, 656221\", [\"436:299:359:369\"] = \"656226, 656227, 656228, 656229\",},\n\t[499] = {[\"188:412:397:59\"] = \"660517, 660518\", [\"190:282:513:3\"] = \"660486, 660487\", [\"204:383:444:44\"] = \"660511, 660512\", [\"211:395:125:88\"] = \"660513, 660514\", [\"212:265:317:63\"] = \"660509, 660510\", [\"214:393:218:77\"] = \"660488, 660489\", [\"217:279:589:27\"] = \"660506, 660507\", [\"219:259:300:215\"] = \"660515, 660516\", [\"246:240:343:373\"] = \"660508\", [\"257:300:0:79\"] = \"660519, 660520, 660521, 660522\", [\"258:170:330:498\"] = \"660527, 660528\", [\"272:250:176:376\"] = \"660484, 660485\", [\"275:329:0:267\"] = \"660523, 660524, 660525, 660526, 660523, 660524, 660525, 660526\", [\"295:293:701:19\"] = \"660490, 660491, 660492, 660493\", [\"306:204:612:0\"] = \"660529, 660530\", [\"347:199:545:200\"] = \"660482, 660483\",},\n\t[521] = {[\"278:325:183:95\"] = \"800842, 800843, 800844, 800845, 800842, 800843, 800844, 800845\", [\"446:429:396:9\"] = \"800846, 800847, 800848, 800849, 800846, 800847, 800848, 800849, 800850, 800851, 800852, 800853, 800850, 800851, 800852, 800853, 800854, 800855, 800856, 800857, 800854, 800855, 800856, 800857, 800858, 800859, 800860, 800861, 800858, 800859, 800860, 800861\", [\"490:290:256:378\"] = \"800841, 804116, 804117, 804118, 800841, 804116, 804117, 804118\",},\n\t[533] = {[\"278:325:183:95\"] = \"803902, 803903, 803904, 803905, 803902, 803903, 803904, 803905\", [\"446:429:396:9\"] = \"803910, 803911, 803912, 803913, 803914, 803915, 803916, 803917, 803906, 803907, 803908, 803909, 803918, 803919, 803920, 803921, 803918, 803919, 803920, 803921, 803914, 803915, 803916, 803917, 803910, 803911, 803912, 803913, 803906, 803907, 803908, 803909\", [\"490:290:256:378\"] = \"803901, 839100, 839101, 839102, 803901, 839100, 839101, 839102\",},\n\t[542] = {[\"178:203:597:210\"] = \"1003336\", [\"199:335:641:304\"] = \"1003346, 1003347\", [\"213:278:609:33\"] = \"1003352, 1003353\", [\"217:239:483:33\"] = \"1003341\", [\"251:191:306:281\"] = \"1003354\", [\"255:191:284:91\"] = \"1003333\", [\"256:210:290:192\"] = \"1003355\", [\"258:217:311:4\"] = \"1003327, 1003328\", [\"266:293:439:137\"] = \"1003356, 1003357, 1003358, 1003359\", [\"267:257:336:327\"] = \"1003342, 1003343, 1003344, 1003345, 1027472, 1027473, 1027474, 1027475, 1027472, 1027473, 1027474, 1027475, 1126503, 1126504, 1126505, 1126506\", [\"273:349:729:319\"] = \"1003329, 1003330, 1003331, 1003332\", [\"274:214:121:0\"] = \"1003334, 1003335\", [\"282:341:505:323\"] = \"1003337, 1003338, 1003339, 1003340\", [\"317:233:72:292\"] = \"1003360, 1003361\", [\"329:294:673:156\"] = \"1003348, 1003349, 1003350, 1003351\", [\"356:303:38:117\"] = \"1003323, 1003324, 1003325, 1003326\",},\n\t[551] = {[\"174:208:81:367\"] = \"1126684\", [\"189:294:303:62\"] = \"1126693, 1126694\", [\"209:245:0:264\"] = \"1126692\", [\"223:183:392:187\"] = \"1126689\", [\"238:229:501:171\"] = \"1126706\", [\"246:218:296:383\"] = \"1126703\", [\"248:314:170:354\"] = \"1126704, 1126705\", [\"270:208:465:313\"] = \"1126701, 1126702\", [\"274:251:118:194\"] = \"1126707, 1126708\", [\"327:241:254:262\"] = \"1126690, 1126691\", [\"333:437:637:136\"] = \"1126680, 1126681, 1126682, 1126683\", [\"338:254:54:94\"] = \"1126699, 1126700\", [\"343:264:429:392\"] = \"1126685, 1126686, 1126687, 1126688\", [\"365:276:392:23\"] = \"1126695, 1126696, 1126697, 1126698\",},\n\t[552] = {[\"225:224:472:148\"] = \"1036473\", [\"252:280:546:228\"] = \"1036441, 1036442\", [\"278:270:165:364\"] = \"1036451, 1036452, 1036453, 1036454\", [\"279:267:427:0\"] = \"1036457, 1036458, 1036459, 1036460\", [\"287:277:713:35\"] = \"1036474, 1036475, 1036476, 1036477\", [\"292:235:567:42\"] = \"1036445, 1036446\", [\"307:229:150:264\"] = \"1036443, 1036444\", [\"308:276:685:298\"] = \"1036461, 1036462, 1036463, 1036464\", [\"309:262:338:356\"] = \"1036437, 1036438, 1036439, 1036440\", [\"326:212:352:271\"] = \"1036471, 1036472\", [\"389:234:597:178\"] = \"1036435, 1036436\", [\"398:149:571:0\"] = \"1036455, 1036456\", [\"406:367:173:22\"] = \"1036465, 1036466, 1036467, 1036468\", [\"423:290:548:378\"] = \"1036447, 1036448, 1036449, 1036450\", [\"497:157:207:511\"] = \"1036469, 1036470\",},\n\t[556] = {[\"173:160:309:460\"] = \"1037676\", [\"202:201:383:411\"] = \"1037683\", [\"223:279:194:0\"] = \"1037663, 1037664, 1037674, 1037675, 1037674, 1037675, 1126508, 1126509\", [\"229:240:319:5\"] = \"1037665\", [\"260:309:26:0\"] = \"1037666, 1037667, 1037668, 1037669\", [\"282:201:468:467\"] = \"1037655, 1037656\", [\"282:225:259:315\"] = \"1037677, 1037678\", [\"288:261:453:306\"] = \"1037679, 1037680, 1037681, 1037682\", [\"291:266:426:0\"] = \"1037657, 1037658, 1037659, 1037660\", [\"309:264:140:160\"] = \"1037651, 1037652, 1037653, 1037654\", [\"346:252:270:158\"] = \"1037661, 1037662\", [\"393:318:537:150\"] = \"1037670, 1037671, 1037672, 1037673\",},\n\t[559] = {[\"169:178:374:276\"] = \"1037704\", [\"182:244:649:155\"] = \"1037688\", [\"188:190:444:255\"] = \"1037686\", [\"190:187:282:261\"] = \"1037689\", [\"196:284:429:84\"] = \"1037702, 1037703\", [\"197:179:310:328\"] = \"1037705\", [\"198:232:521:268\"] = \"1037707\", [\"209:154:334:210\"] = \"1037684\", [\"217:224:533:382\"] = \"1037687\", [\"226:193:465:475\"] = \"1037708\", [\"229:213:197:198\"] = \"1037709\", [\"229:246:410:350\"] = \"1037685\", [\"238:295:520:127\"] = \"1037698, 1037699\", [\"252:230:281:83\"] = \"1037706\", [\"314:304:102:0\"] = \"1037694, 1037695, 1037696, 1037697\", [\"371:174:289:0\"] = \"1037700, 1037701\", [\"382:274:459:0\"] = \"1037690, 1037691, 1037692, 1037693\",},\n\t[560] = {[\"166:161:383:371\"] = \"1036374\", [\"208:142:275:416\"] = \"1036391\", [\"209:225:411:250\"] = \"1036382\", [\"210:193:525:260\"] = \"1036375\", [\"211:221:455:74\"] = \"1036378\", [\"217:178:259:335\"] = \"1036390\", [\"217:180:454:183\"] = \"1036379\", [\"250:232:312:77\"] = \"1036392\", [\"253:198:444:323\"] = \"1036389\", [\"262:221:451:372\"] = \"1036393, 1036394\", [\"279:241:258:213\"] = \"1036380, 1036381\", [\"285:323:547:73\"] = \"1036383, 1036384, 1036385, 1036386\", [\"297:181:281:444\"] = \"1036376, 1036377\", [\"315:180:350:0\"] = \"1036387, 1036388\", [\"324:161:283:507\"] = \"1036372, 1036373\",},\n\t[567] = {[\"234:191:239:259\"] = \"1036395\", [\"236:242:283:354\"] = \"1036410\", [\"236:372:766:118\"] = \"1036404, 1036405\", [\"249:288:753:380\"] = \"1036413, 1036414\", [\"250:287:746:25\"] = \"1036415, 1036416\", [\"256:301:600:367\"] = \"1036402, 1036403\", [\"262:266:366:323\"] = \"1036417, 1036418, 1036419, 1036420\", [\"263:287:430:0\"] = \"1036421, 1036422, 1036423, 1036424\", [\"274:254:312:98\"] = \"1036429, 1036430\", [\"286:274:588:0\"] = \"1036398, 1036399, 1036400, 1036401\", [\"296:272:461:353\"] = \"1036431, 1036432, 1036433, 1036434\", [\"305:227:256:12\"] = \"1036396, 1036397\", [\"316:221:382:187\"] = \"1036411, 1036412\", [\"354:315:523:159\"] = \"1036425, 1036426, 1036427, 1036428\", [\"471:437:0:0\"] = \"1036406, 1036407, 1036408, 1036409\",},\n\t[594] = {[\"143:137:328:251\"] = \"1027314\",},\n\t[628] = {[\"168:170:375:102\"] = \"1085238\", [\"195:199:436:0\"] = \"1085237\", [\"199:191:333:474\"] = \"1085244\", [\"218:183:459:97\"] = \"1085239\", [\"233:266:386:374\"] = \"1085242, 1085243\", [\"235:188:327:182\"] = \"1085234\", [\"238:195:225:110\"] = \"1085231\", [\"240:270:578:91\"] = \"1085240, 1085241\", [\"268:354:533:268\"] = \"1085249, 1085250, 1085251, 1085252\", [\"272:206:258:0\"] = \"1085232, 1085233\", [\"295:205:530:6\"] = \"1085235, 1085236\", [\"308:226:144:175\"] = \"1085257, 1085258\", [\"348:357:132:311\"] = \"1085253, 1085254, 1085255, 1085256\", [\"370:298:368:179\"] = \"1085245, 1085246, 1085247, 1085248\",},\n\t[653] = {[\"181:243:481:340\"] = \"1414545\", [\"206:266:396:244\"] = \"1414541, 1414542\", [\"220:288:523:233\"] = \"1414543, 1414544\", [\"239:303:594:0\"] = \"1414528, 1414529\", [\"247:184:450:95\"] = \"1414530\", [\"272:192:441:173\"] = \"1414539, 1414540\", [\"288:195:477:0\"] = \"1414546, 1414547\", [\"315:185:257:0\"] = \"1414537, 1414538\", [\"321:267:281:401\"] = \"1414531, 1414532, 1414533, 1414534\", [\"330:265:166:202\"] = \"1414524, 1414525, 1414526, 1414527\", [\"351:245:219:69\"] = \"1414535, 1414536\",},\n\t[657] = {[\"132:145:689:266\"] = \"1414600\", [\"135:162:623:81\"] = \"1414615\", [\"150:180:741:313\"] = \"1414613\", [\"173:163:648:339\"] = \"1414601\", [\"177:169:506:345\"] = \"1414618\", [\"180:160:510:118\"] = \"1414619\", [\"186:158:522:288\"] = \"1414623\", [\"194:214:592:226\"] = \"1414616\", [\"199:185:361:210\"] = \"1414596\", [\"200:174:612:187\"] = \"1414604\", [\"205:199:479:183\"] = \"1414622\", [\"215:247:457:412\"] = \"1414599\", [\"241:194:345:95\"] = \"1414614\", [\"252:280:585:372\"] = \"1414602, 1414603\", [\"289:172:689:0\"] = \"1414617, 1417748\", [\"291:208:316:282\"] = \"1414620, 1414621\", [\"297:210:154:129\"] = \"1414597, 1414598\", [\"386:314:56:185\"] = \"1414624, 1414625, 1414626, 1414627\", [\"509:251:17:0\"] = \"1414611, 1414612\", [\"631:315:0:353\"] = \"1414605, 1414606, 1414607, 1414608, 1414609, 1414610\",},\n\t[664] = {[\"171:150:457:351\"] = \"1414675\", [\"177:156:467:413\"] = \"1414676\", [\"216:219:459:240\"] = \"1414689\", [\"218:168:342:416\"] = \"1414690\", [\"239:301:136:274\"] = \"1414673, 1414674\", [\"241:240:587:250\"] = \"1414665\", [\"250:253:262:175\"] = \"1414666\", [\"254:281:549:380\"] = \"1414681, 1414682\", [\"274:344:610:18\"] = \"1414677, 1414678, 1414679, 1414680\", [\"294:364:283:0\"] = \"1414669, 1414670, 1414671, 1414672\", [\"311:244:259:275\"] = \"1414667, 1414668\", [\"326:360:419:0\"] = \"1414683, 1414684, 1414685, 1414686\", [\"341:188:324:480\"] = \"1414687, 1414688\",},\n\t[669] = {[\"182:245:220:260\"] = \"1597370\", [\"276:213:350:13\"] = \"1597172, 1597166\", [\"308:244:632:169\"] = \"1414556, 1414557\", [\"312:301:500:0\"] = \"1414560, 1414561, 1414562, 1414563\", [\"332:276:596:100\"] = \"1597182, 1597179, 1597167, 1597186\", [\"338:270:389:180\"] = \"1597181, 1597168, 1597171, 1597187\", [\"338:322:254:84\"] = \"1597169, 1597369, 1597185, 1597180\", [\"387:314:312:302\"] = \"1597371, 1597184, 1597183, 1597170\",},\n\t[674] = {[\"110:98:445:190\"] = \"1467065\", [\"172:204:249:236\"] = \"1414595\", [\"186:213:391:408\"] = \"1414568\", [\"207:302:469:45\"] = \"1414580, 1414581\", [\"214:308:314:360\"] = \"1414578, 1414579\", [\"217:148:323:249\"] = \"1414577\", [\"244:199:332:302\"] = \"1414594\", [\"256:326:172:31\"] = \"1414566, 1414567\", [\"283:170:331:0\"] = \"1414582, 1414583\", [\"288:258:452:410\"] = \"1414569, 1414570, 1414571, 1414572\", [\"297:250:307:75\"] = \"1414564, 1414565\", [\"311:229:357:179\"] = \"1414584, 1414585\", [\"341:328:494:236\"] = \"1414586, 1414587, 1414588, 1414589\", [\"344:295:0:244\"] = \"1414573, 1414574, 1414575, 1414576\", [\"445:326:0:342\"] = \"1414590, 1414591, 1414592, 1414593\",},\n\t[700] = {[\"376:364:0:212\"] = \"1445120, 1445121, 1445122, 1445123\",},\n\t[704] = {[\"221:224:264:226\"] = \"1414656\", [\"222:311:132:179\"] = \"1414628, 1414629\", [\"248:317:23:136\"] = \"1414634, 1414635\", [\"289:363:183:305\"] = \"1414636, 1414637, 1414638, 1414639\", [\"327:381:492:0\"] = \"1414630, 1414631, 1414632, 1414633\", [\"355:291:344:285\"] = \"1414640, 1414641, 1414642, 1414643\", [\"387:372:327:0\"] = \"1414661, 1414662, 1414663, 1414664\", [\"419:538:583:0\"] = \"1414644, 1414645, 1414646, 1414647, 1414648, 1414649\", [\"428:316:201:0\"] = \"1414652, 1414653, 1414654, 1414655\", [\"470:337:390:331\"] = \"1414657, 1414658, 1414659, 1414660\", [\"480:245:58:0\"] = \"1414650, 1414651\",},\n\t[738] = {[\"116:118:271:238\"] = \"1346187\", [\"262:188:269:233\"] = \"1346188, 1346189\",},\n\t[815] = {[\"848:668:39:0\"] = \"1417775, 1417779, 1417780, 1417781, 1417782, 1417783, 1417784, 1417785, 1417786, 1417776, 1417777, 1417778\",},\n\t[855] = {[\"296:336:371:178\"] = \"1710644, 1710645, 1710646, 1710647\", [\"307:304:428:364\"] = \"1710648, 1710649, 1710650, 1710651\", [\"445:379:557:289\"] = \"1710660, 1710661, 1710662, 1710663\", [\"498:530:37:138\"] = \"1710664, 1710665, 1710666, 1710667, 1710668, 1710669\", [\"835:422:167:0\"] = \"1710652, 1710653, 1710654, 1710655, 1710656, 1710657, 1710658, 1710659\",},\n\t[887] = {[\"1130:672:1357:0\"] = \"2034223, 2034230, 2034231, 2034232, 2034233, 2034234, 2034235, 2034236, 2034237, 2034224, 2034225, 2034226, 2034227, 2034228, 2034229\", [\"1243:1287:1046:1273\"] = \"2034370, 2034381, 2034392, 2034394, 2034395, 2034396, 2034397, 2034398, 2034399, 2034371, 2034372, 2034373, 2034374, 2034375, 2034376, 2034377, 2034378, 2034379, 2034380, 2034382, 2034383, 2034384, 2034385, 2034386, 2034387, 2034388, 2034389, 2034390, 2034391, 2034393\", [\"1650:1565:321:378\"] = \"2034162, 2034173, 2034184, 2034195, 2034206, 2034207, 2034208, 2034209, 2034210, 2034163, 2034164, 2034165, 2034166, 2034167, 2034168, 2034169, 2034170, 2034171, 2034172, 2034174, 2034175, 2034176, 2034177, 2034178, 2034179, 2034180, 2034181, 2034182, 2034183, 2034185, 2034186, 2034187, 2034188, 2034189, 2034190, 2034191, 2034192, 2034193, 2034194, 2034196, 2034197, 2034198, 2034199, 2034200, 2034201, 2034202, 2034203, 2034204, 2034205\", [\"699:1207:1815:260\"] = \"2034238, 2034245, 2034246, 2034247, 2034248, 2034249, 2034250, 2034251, 2034252, 2034239, 2034240, 2034241, 2034242, 2034243, 2034244\", [\"726:617:2631:1023\"] = \"2034361, 2034362, 2034363, 2034364, 2034365, 2034366, 2034367, 2034368, 2034369\", [\"769:967:2107:327\"] = \"2034321, 2034329, 2034330, 2034331, 2034332, 2034333, 2034334, 2034335, 2034336, 2034322, 2034323, 2034324, 2034325, 2034326, 2034327, 2034328\", [\"793:668:2685:633\"] = \"2034211, 2034215, 2034216, 2034217, 2034218, 2034219, 2034220, 2034221, 2034222, 2034212, 2034213, 2034214\", [\"888:1512:1312:82\"] = \"2034269, 2034280, 2034286, 2034287, 2034288, 2034289, 2034290, 2034291, 2034292, 2034270, 2034271, 2034272, 2034273, 2034274, 2034275, 2034276, 2034277, 2034278, 2034279, 2034281, 2034282, 2034283, 2034284, 2034285\", [\"934:830:2325:1270\"] = \"2034253, 2034261, 2034262, 2034263, 2034264, 2034265, 2034266, 2034267, 2034268, 2034254, 2034255, 2034256, 2034257, 2034258, 2034259, 2034260\", [\"943:1559:2144:0\"] = \"2034293, 2034304, 2034314, 2034315, 2034316, 2034317, 2034318, 2034319, 2034320, 2034294, 2034295, 2034296, 2034297, 2034298, 2034299, 2034300, 2034301, 2034302, 2034303, 2034305, 2034306, 2034307, 2034308, 2034309, 2034310, 2034311, 2034312, 2034313\", [\"979:912:2409:0\"] = \"2034400, 2034408, 2034409, 2034410, 2034411, 2034412, 2034413, 2034414, 2034415, 2034401, 2034402, 2034403, 2034404, 2034405, 2034406, 2034407\", [\"999:1344:1825:1216\"] = \"2034337, 2034348, 2034354, 2034355, 2034356, 2034357, 2034358, 2034359, 2034360, 2034338, 2034339, 2034340, 2034341, 2034342, 2034343, 2034344, 2034345, 2034346, 2034347, 2034349, 2034350, 2034351, 2034352, 2034353\",},\n\t[888] = {[\"1065:1103:2309:210\"] = \"2023868, 2023879, 2023886, 2023887, 2023888, 2023889, 2023890, 2023891, 2023892, 2023869, 2023870, 2023871, 2023872, 2023873, 2023874, 2023875, 2023876, 2023877, 2023878, 2023880, 2023881, 2023882, 2023883, 2023884, 2023885\", [\"1098:996:2349:871\"] = \"2023693, 2023704, 2023706, 2023707, 2023708, 2023709, 2023710, 2023711, 2023712, 2023694, 2023695, 2023696, 2023697, 2023698, 2023699, 2023700, 2023701, 2023702, 2023703, 2023705\", [\"1157:967:484:1539\"] = \"2023923, 2023934, 2023936, 2023937, 2023938, 2023939, 2023940, 2023941, 2023942, 2023924, 2023925, 2023926, 2023927, 2023928, 2023929, 2023930, 2023931, 2023932, 2023933, 2023935\", [\"1225:1249:620:565\"] = \"2024017, 2024028, 2024035, 2024036, 2024037, 2024038, 2024039, 2024040, 2024041, 2024018, 2024019, 2024020, 2024021, 2024022, 2024023, 2024024, 2024025, 2024026, 2024027, 2024029, 2024030, 2024031, 2024032, 2024033, 2024034\", [\"1289:809:1072:1676\"] = \"2023943, 2023954, 2023960, 2023961, 2023962, 2023963, 2023964, 2023965, 2023966, 2023944, 2023945, 2023946, 2023947, 2023948, 2023949, 2023950, 2023951, 2023952, 2023953, 2023955, 2023956, 2023957, 2023958, 2023959\", [\"1349:1029:1682:0\"] = \"2023967, 2023978, 2023989, 2023991, 2023992, 2023993, 2023994, 2023995, 2023996, 2023968, 2023969, 2023970, 2023971, 2023972, 2023973, 2023974, 2023975, 2023976, 2023977, 2023979, 2023980, 2023981, 2023982, 2023983, 2023984, 2023985, 2023986, 2023987, 2023988, 2023990\", [\"1534:1119:1097:281\"] = \"2023893, 2023904, 2023915, 2023917, 2023918, 2023919, 2023920, 2023921, 2023922, 2023894, 2023895, 2023896, 2023897, 2023898, 2023899, 2023900, 2023901, 2023902, 2023903, 2023905, 2023906, 2023907, 2023908, 2023909, 2023910, 2023911, 2023912, 2023913, 2023914, 2023916\", [\"534:709:1298:1561\"] = \"2024042, 2024043, 2024044, 2024045, 2024046, 2024047, 2024048, 2024049, 2024050\", [\"800:991:1511:1043\"] = \"2023713, 2023721, 2023722, 2023723, 2023724, 2023725, 2023726, 2023727, 2023728, 2023714, 2023715, 2023716, 2023717, 2023718, 2023719, 2023720\", [\"841:1075:1807:1043\"] = \"2023997, 2024008, 2024010, 2024011, 2024012, 2024013, 2024014, 2024015, 2024016, 2023998, 2023999, 2024000, 2024001, 2024002, 2024003, 2024004, 2024005, 2024006, 2024007, 2024009\",},\n\t[889] = {[\"1086:703:576:902\"] = \"2033989, 2033996, 2033997, 2033998, 2033999, 2034000, 2034001, 2034002, 2034003, 2033990, 2033991, 2033992, 2033993, 2033994, 2033995\", [\"1139:822:1569:1281\"] = \"2033845, 2033856, 2033858, 2033859, 2033860, 2033861, 2033862, 2033863, 2033864, 2033846, 2033847, 2033848, 2033849, 2033850, 2033851, 2033852, 2033853, 2033854, 2033855, 2033857\", [\"1223:843:1733:0\"] = \"2034004, 2034015, 2034017, 2034018, 2034019, 2034020, 2034021, 2034022, 2034023, 2034005, 2034006, 2034007, 2034008, 2034009, 2034010, 2034011, 2034012, 2034013, 2034014, 2034016\", [\"1287:876:1469:1684\"] = \"2033821, 2033832, 2033838, 2033839, 2033840, 2033841, 2033842, 2033843, 2033844, 2033822, 2033823, 2033824, 2033825, 2033826, 2033827, 2033828, 2033829, 2033830, 2033831, 2033833, 2033834, 2033835, 2033836, 2033837\", [\"666:856:1180:1255\"] = \"2033961, 2033965, 2033966, 2033967, 2033968, 2033969, 2033970, 2033971, 2033972, 2033962, 2033963, 2033964\", [\"769:816:739:1332\"] = \"2033973, 2033981, 2033982, 2033983, 2033984, 2033985, 2033986, 2033987, 2033988, 2033974, 2033975, 2033976, 2033977, 2033978, 2033979, 2033980\", [\"794:542:1362:2018\"] = \"2033949, 2033953, 2033954, 2033955, 2033956, 2033957, 2033958, 2033959, 2033960, 2033950, 2033951, 2033952\", [\"849:672:1316:895\"] = \"2033865, 2033869, 2033870, 2033871, 2033872, 2033873, 2033874, 2033875, 2033876, 2033866, 2033867, 2033868\", [\"881:897:1006:341\"] = \"2033917, 2033925, 2033926, 2033927, 2033928, 2033929, 2033930, 2033931, 2033932, 2033918, 2033919, 2033920, 2033921, 2033922, 2033923, 2033924\", [\"913:727:2063:517\"] = \"2033877, 2033881, 2033882, 2033883, 2033884, 2033885, 2033886, 2033887, 2033888, 2033878, 2033879, 2033880\", [\"915:966:1579:220\"] = \"2033933, 2033941, 2033942, 2033943, 2033944, 2033945, 2033946, 2033947, 2033948, 2033934, 2033935, 2033936, 2033937, 2033938, 2033939, 2033940\", [\"926:688:807:1801\"] = \"2033905, 2033909, 2033910, 2033911, 2033912, 2033913, 2033914, 2033915, 2033916, 2033906, 2033907, 2033908\", [\"969:835:1880:859\"] = \"2033889, 2033897, 2033898, 2033899, 2033900, 2033901, 2033902, 2033903, 2033904, 2033890, 2033891, 2033892, 2033893, 2033894, 2033895, 2033896\",},\n\t[907] = {[\"265:310:278:284\"] = \"1710620, 1710621, 1710622, 1710623\", [\"284:264:410:375\"] = \"1710634, 1710635, 1710636, 1710637\", [\"313:353:498:111\"] = \"1710616, 1710617, 1710618, 1710619\", [\"463:519:265:54\"] = \"1710624, 1710625, 1710626, 1710627, 1710628, 1710629\", [\"498:461:0:0\"] = \"1710630, 1710631, 1710632, 1710633\", [\"701:323:0:0\"] = \"1710638, 1710639, 1710640, 1710641, 1710642, 1710643\",},\n\t[910] = {[\"467:430:535:238\"] = \"1710612, 1710613, 1710614, 1710615\", [\"626:385:293:0\"] = \"1710597, 1710598, 1710599, 1710600, 1710601, 1710602\", [\"660:668:0:0\"] = \"1710603, 1710604, 1710605, 1710606, 1710607, 1710608, 1710609, 1710610, 1710611\",},\n\t[920] = {[\"1047:821:2314:1739\"] = \"2033525, 2033536, 2033538, 2033539, 2033540, 2033541, 2033542, 2033543, 2033544, 2033526, 2033527, 2033528, 2033529, 2033530, 2033531, 2033532, 2033533, 2033534, 2033535, 2033537\", [\"1242:944:2451:1035\"] = \"2033605, 2033616, 2033618, 2033619, 2033620, 2033621, 2033622, 2033623, 2033624, 2033606, 2033607, 2033608, 2033609, 2033610, 2033611, 2033612, 2033613, 2033614, 2033615, 2033617\", [\"1306:678:802:0\"] = \"2033803, 2033813, 2033814, 2033815, 2033816, 2033817, 2033818, 2033819, 2033820, 2033804, 2033805, 2033806, 2033807, 2033808, 2033809, 2033810, 2033811, 2033812\", [\"1432:1009:2117:332\"] = \"2033473, 2033484, 2033490, 2033491, 2033492, 2033493, 2033494, 2033495, 2033496, 2033474, 2033475, 2033476, 2033477, 2033478, 2033479, 2033480, 2033481, 2033482, 2033483, 2033485, 2033486, 2033487, 2033488, 2033489\", [\"1777:900:1806:0\"] = \"2033497, 2033508, 2033518, 2033519, 2033520, 2033521, 2033522, 2033523, 2033524, 2033498, 2033499, 2033500, 2033501, 2033502, 2033503, 2033504, 2033505, 2033506, 2033507, 2033509, 2033510, 2033511, 2033512, 2033513, 2033514, 2033515, 2033516, 2033517\", [\"828:899:766:100\"] = \"2033569, 2033577, 2033578, 2033579, 2033580, 2033581, 2033582, 2033583, 2033584, 2033570, 2033571, 2033572, 2033573, 2033574, 2033575, 2033576\", [\"859:788:1108:451\"] = \"2033457, 2033465, 2033466, 2033467, 2033468, 2033469, 2033470, 2033471, 2033472, 2033458, 2033459, 2033460, 2033461, 2033462, 2033463, 2033464\", [\"891:1057:2852:1503\"] = \"2033625, 2033636, 2033638, 2033639, 2033640, 2033641, 2033642, 2033643, 2033644, 2033626, 2033627, 2033628, 2033629, 2033630, 2033631, 2033632, 2033633, 2033634, 2033635, 2033637\", [\"908:1284:1538:176\"] = \"2033545, 2033556, 2033562, 2033563, 2033564, 2033565, 2033566, 2033567, 2033568, 2033546, 2033547, 2033548, 2033549, 2033550, 2033551, 2033552, 2033553, 2033554, 2033555, 2033557, 2033558, 2033559, 2033560, 2033561\", [\"953:1223:1772:1199\"] = \"2033783, 2033794, 2033796, 2033797, 2033798, 2033799, 2033800, 2033801, 2033802, 2033784, 2033785, 2033786, 2033787, 2033788, 2033789, 2033790, 2033791, 2033792, 2033793, 2033795\", [\"978:1171:2054:995\"] = \"2033585, 2033596, 2033598, 2033599, 2033600, 2033601, 2033602, 2033603, 2033604, 2033586, 2033587, 2033588, 2033589, 2033590, 2033591, 2033592, 2033593, 2033594, 2033595, 2033597\",},\n\t[921] = {[\"1079:1204:1261:0\"] = \"2038112, 2038123, 2038130, 2038131, 2038132, 2038133, 2038134, 2038135, 2038136, 2038113, 2038114, 2038115, 2038116, 2038117, 2038118, 2038119, 2038120, 2038121, 2038122, 2038124, 2038125, 2038126, 2038127, 2038128, 2038129\", [\"1090:1169:1847:1025\"] = \"2038087, 2038098, 2038105, 2038106, 2038107, 2038108, 2038109, 2038110, 2038111, 2038088, 2038089, 2038090, 2038091, 2038092, 2038093, 2038094, 2038095, 2038096, 2038097, 2038099, 2038100, 2038101, 2038102, 2038103, 2038104\", [\"1125:880:1812:760\"] = \"2037819, 2037830, 2037832, 2037833, 2037834, 2037835, 2037836, 2037837, 2037838, 2037820, 2037821, 2037822, 2037823, 2037824, 2037825, 2037826, 2037827, 2037828, 2037829, 2037831\", [\"1139:1154:377:939\"] = \"2037884, 2037895, 2037902, 2037903, 2037904, 2037905, 2037906, 2037907, 2037908, 2037885, 2037886, 2037887, 2037888, 2037889, 2037890, 2037891, 2037892, 2037893, 2037894, 2037896, 2037897, 2037898, 2037899, 2037900, 2037901\", [\"1154:1059:1839:0\"] = \"2037839, 2037850, 2037857, 2037858, 2037859, 2037860, 2037861, 2037862, 2037863, 2037840, 2037841, 2037842, 2037843, 2037844, 2037845, 2037846, 2037847, 2037848, 2037849, 2037851, 2037852, 2037853, 2037854, 2037855, 2037856\", [\"1188:1421:933:863\"] = \"2037789, 2037800, 2037811, 2037813, 2037814, 2037815, 2037816, 2037817, 2037818, 2037790, 2037791, 2037792, 2037793, 2037794, 2037795, 2037796, 2037797, 2037798, 2037799, 2037801, 2037802, 2037803, 2037804, 2037805, 2037806, 2037807, 2037808, 2037809, 2037810, 2037812\", [\"1239:839:388:570\"] = \"2037864, 2037875, 2037877, 2037878, 2037879, 2037880, 2037881, 2037882, 2037883, 2037865, 2037866, 2037867, 2037868, 2037869, 2037870, 2037871, 2037872, 2037873, 2037874, 2037876\", [\"1373:1010:0:0\"] = \"2038137, 2038148, 2038154, 2038155, 2038156, 2038157, 2038158, 2038159, 2038160, 2038138, 2038139, 2038140, 2038141, 2038142, 2038143, 2038144, 2038145, 2038146, 2038147, 2038149, 2038150, 2038151, 2038152, 2038153\", [\"1424:1026:438:0\"] = \"2038197, 2038208, 2038219, 2038221, 2038222, 2038223, 2038224, 2038225, 2038226, 2038198, 2038199, 2038200, 2038201, 2038202, 2038203, 2038204, 2038205, 2038206, 2038207, 2038209, 2038210, 2038211, 2038212, 2038213, 2038214, 2038215, 2038216, 2038217, 2038218, 2038220\", [\"1521:1323:1212:1237\"] = \"2038161, 2038172, 2038183, 2038191, 2038192, 2038193, 2038194, 2038195, 2038196, 2038162, 2038163, 2038164, 2038165, 2038166, 2038167, 2038168, 2038169, 2038170, 2038171, 2038173, 2038174, 2038175, 2038176, 2038177, 2038178, 2038179, 2038180, 2038181, 2038182, 2038184, 2038185, 2038186, 2038187, 2038188, 2038189, 2038190\", [\"770:1181:2386:1049\"] = \"2038067, 2038078, 2038080, 2038081, 2038082, 2038083, 2038084, 2038085, 2038086, 2038068, 2038069, 2038070, 2038071, 2038072, 2038073, 2038074, 2038075, 2038076, 2038077, 2038079\", [\"948:1081:1644:361\"] = \"2038047, 2038058, 2038060, 2038061, 2038062, 2038063, 2038064, 2038065, 2038066, 2038048, 2038049, 2038050, 2038051, 2038052, 2038053, 2038054, 2038055, 2038056, 2038057, 2038059\",},\n\t[967] = {[\"1030:1134:1288:1426\"] = \"2033070, 2033081, 2033088, 2033089, 2033090, 2033091, 2033092, 2033093, 2033094, 2033071, 2033072, 2033073, 2033074, 2033075, 2033076, 2033077, 2033078, 2033079, 2033080, 2033082, 2033083, 2033084, 2033085, 2033086, 2033087\", [\"1052:1466:1918:0\"] = \"2033199, 2033210, 2033221, 2033223, 2033224, 2033225, 2033226, 2033227, 2033228, 2033200, 2033201, 2033202, 2033203, 2033204, 2033205, 2033206, 2033207, 2033208, 2033209, 2033211, 2033212, 2033213, 2033214, 2033215, 2033216, 2033217, 2033218, 2033219, 2033220, 2033222\", [\"1167:1224:1750:1336\"] = \"2033045, 2033056, 2033063, 2033064, 2033065, 2033066, 2033067, 2033068, 2033069, 2033046, 2033047, 2033048, 2033049, 2033050, 2033051, 2033052, 2033053, 2033054, 2033055, 2033057, 2033058, 2033059, 2033060, 2033061, 2033062\", [\"1325:1981:2515:0\"] = \"2033229, 2033240, 2033251, 2033262, 2033272, 2033273, 2033274, 2033275, 2033276, 2033230, 2033231, 2033232, 2033233, 2033234, 2033235, 2033236, 2033237, 2033238, 2033239, 2033241, 2033242, 2033243, 2033244, 2033245, 2033246, 2033247, 2033248, 2033249, 2033250, 2033252, 2033253, 2033254, 2033255, 2033256, 2033257, 2033258, 2033259, 2033260, 2033261, 2033263, 2033264, 2033265, 2033266, 2033267, 2033268, 2033269, 2033270, 2033271\", [\"1403:711:1153:1056\"] = \"2033161, 2033171, 2033172, 2033173, 2033174, 2033175, 2033176, 2033177, 2033178, 2033162, 2033163, 2033164, 2033165, 2033166, 2033167, 2033168, 2033169, 2033170\", [\"1628:1457:0:1103\"] = \"2033415, 2033426, 2033437, 2033448, 2033452, 2033453, 2033454, 2033455, 2033456, 2033416, 2033417, 2033418, 2033419, 2033420, 2033421, 2033422, 2033423, 2033424, 2033425, 2033427, 2033428, 2033429, 2033430, 2033431, 2033432, 2033433, 2033434, 2033435, 2033436, 2033438, 2033439, 2033440, 2033441, 2033442, 2033443, 2033444, 2033445, 2033446, 2033447, 2033449, 2033450, 2033451\", [\"1659:1491:2181:1069\"] = \"2033095, 2033106, 2033117, 2033128, 2033132, 2033133, 2033134, 2033135, 2033136, 2033096, 2033097, 2033098, 2033099, 2033100, 2033101, 2033102, 2033103, 2033104, 2033105, 2033107, 2033108, 2033109, 2033110, 2033111, 2033112, 2033113, 2033114, 2033115, 2033116, 2033118, 2033119, 2033120, 2033121, 2033122, 2033123, 2033124, 2033125, 2033126, 2033127, 2033129, 2033130, 2033131\", [\"859:1050:840:475\"] = \"2033179, 2033190, 2033192, 2033193, 2033194, 2033195, 2033196, 2033197, 2033198, 2033180, 2033181, 2033182, 2033183, 2033184, 2033185, 2033186, 2033187, 2033188, 2033189, 2033191\", [\"929:1380:1365:0\"] = \"2033137, 2033148, 2033154, 2033155, 2033156, 2033157, 2033158, 2033159, 2033160, 2033138, 2033139, 2033140, 2033141, 2033142, 2033143, 2033144, 2033145, 2033146, 2033147, 2033149, 2033150, 2033151, 2033152, 2033153\",},\n\t[968] = {[\"107:98:648:258\"] = \"1998395, 2018419\", [\"135:91:457:278\"] = \"2018445, 2018420\", [\"78:78:352:227\"] = \"1998396, 2018422\",},\n\t[1176] = {[\"105:88:425:38\"] = \"2481586\",},\n\t[1184] = {[\"1002:668:0:0\"] = \"2481373, 2481377, 2481378, 2481379, 2481380, 2481381, 2481382, 2481383, 2481384, 2481374, 2481375, 2481376\",},\n\t[1186] = {[\"1224:1131:935:1429\"] = \"3020691, 3020702, 3020709, 3020710, 3020711, 3020712, 3020713, 3020714, 3020715, 3020692, 3020693, 3020694, 3020695, 3020696, 3020697, 3020698, 3020699, 3020700, 3020701, 3020703, 3020704, 3020705, 3020706, 3020707, 3020708\", [\"1411:710:895:1151\"] = \"3020640, 3020650, 3020651, 3020652, 3020653, 3020654, 3020655, 3020656, 3020657, 3020641, 3020642, 3020643, 3020644, 3020645, 3020646, 3020647, 3020648, 3020649\", [\"510:520:1653:708\"] = \"3020618, 3020619, 3020620, 3020621, 3020622, 3020623\", [\"527:528:1987:49\"] = \"3020682, 3020683, 3020684, 3020685, 3020686, 3020687, 3020688, 3020689, 3020690\", [\"558:602:1297:693\"] = \"3020732, 3020733, 3020734, 3020735, 3020736, 3020737, 3020738, 3020739, 3020740\", [\"583:800:2321:57\"] = \"3020574, 3020578, 3020579, 3020580, 3020581, 3020582, 3020583, 3020584, 3020585, 3020575, 3020576, 3020577\", [\"648:650:1876:340\"] = \"3020549, 3020550, 3020551, 3020552, 3020553, 3020554, 3020555, 3020556, 3020557\", [\"703:905:2213:691\"] = \"3020658, 3020662, 3020663, 3020664, 3020665, 3020666, 3020667, 3020668, 3020669, 3020659, 3020660, 3020661\", [\"737:461:1570:1432\"] = \"3020676, 3020677, 3020678, 3020679, 3020680, 3020681\", [\"738:490:1007:1200\"] = \"3020670, 3020671, 3020672, 3020673, 3020674, 3020675\", [\"770:835:1110:118\"] = \"3020716, 3020724, 3020725, 3020726, 3020727, 3020728, 3020729, 3020730, 3020731, 3020717, 3020718, 3020719, 3020720, 3020721, 3020722, 3020723\", [\"783:597:2574:909\"] = \"3020598, 3020602, 3020603, 3020604, 3020605, 3020606, 3020607, 3020608, 3020609, 3020599, 3020600, 3020601\", [\"790:517:1360:1027\"] = \"3020586, 3020590, 3020591, 3020592, 3020593, 3020594, 3020595, 3020596, 3020597, 3020587, 3020588, 3020589\", [\"795:866:1863:804\"] = \"3020558, 3020566, 3020567, 3020568, 3020569, 3020570, 3020571, 3020572, 3020573, 3020559, 3020560, 3020561, 3020562, 3020563, 3020564, 3020565\", [\"815:1065:729:315\"] = \"3020529, 3020540, 3020542, 3020543, 3020544, 3020545, 3020546, 3020547, 3020548, 3020530, 3020531, 3020532, 3020533, 3020534, 3020535, 3020536, 3020537, 3020538, 3020539, 3020541\", [\"850:835:1469:50\"] = \"3020624, 3020632, 3020633, 3020634, 3020635, 3020636, 3020637, 3020638, 3020639, 3020625, 3020626, 3020627, 3020628, 3020629, 3020630, 3020631\", [\"979:480:2502:692\"] = \"3020610, 3020611, 3020612, 3020613, 3020614, 3020615, 3020616, 3020617\", [\"990:564:2490:365\"] = \"3020741, 3020745, 3020746, 3020747, 3020748, 3020749, 3020750, 3020751, 3020752, 3020742, 3020743, 3020744\",},\n\t[1276] = {[\"1009:1191:1910:557\"] = \"3022276, 3022287, 3022289, 3022290, 3022291, 3022292, 3022293, 3022294, 3022295, 3022277, 3022278, 3022279, 3022280, 3022281, 3022282, 3022283, 3022284, 3022285, 3022286, 3022288\", [\"1014:1022:2513:406\"] = \"3022368, 3022376, 3022377, 3022378, 3022379, 3022380, 3022381, 3022382, 3022383, 3022369, 3022370, 3022371, 3022372, 3022373, 3022374, 3022375\", [\"1049:1055:2791:121\"] = \"3022412, 3022423, 3022430, 3022431, 3022432, 3022433, 3022434, 3022435, 3022436, 3022413, 3022414, 3022415, 3022416, 3022417, 3022418, 3022419, 3022420, 3022421, 3022422, 3022424, 3022425, 3022426, 3022427, 3022428, 3022429\", [\"1169:1264:1154:496\"] = \"3022251, 3022262, 3022269, 3022270, 3022271, 3022272, 3022273, 3022274, 3022275, 3022252, 3022253, 3022254, 3022255, 3022256, 3022257, 3022258, 3022259, 3022260, 3022261, 3022263, 3022264, 3022265, 3022266, 3022267, 3022268\", [\"1366:1426:2172:1134\"] = \"3022332, 3022343, 3022354, 3022362, 3022363, 3022364, 3022365, 3022366, 3022367, 3022333, 3022334, 3022335, 3022336, 3022337, 3022338, 3022339, 3022340, 3022341, 3022342, 3022344, 3022345, 3022346, 3022347, 3022348, 3022349, 3022350, 3022351, 3022352, 3022353, 3022355, 3022356, 3022357, 3022358, 3022359, 3022360, 3022361\", [\"1424:1511:46:978\"] = \"3022437, 3022448, 3022459, 3022467, 3022468, 3022469, 3022470, 3022471, 3022472, 3022438, 3022439, 3022440, 3022441, 3022442, 3022443, 3022444, 3022445, 3022446, 3022447, 3022449, 3022450, 3022451, 3022452, 3022453, 3022454, 3022455, 3022456, 3022457, 3022458, 3022460, 3022461, 3022462, 3022463, 3022464, 3022465, 3022466\", [\"1479:1338:1125:1222\"] = \"3022296, 3022307, 3022318, 3022326, 3022327, 3022328, 3022329, 3022330, 3022331, 3022297, 3022298, 3022299, 3022300, 3022301, 3022302, 3022303, 3022304, 3022305, 3022306, 3022308, 3022309, 3022310, 3022311, 3022312, 3022313, 3022314, 3022315, 3022316, 3022317, 3022319, 3022320, 3022321, 3022322, 3022323, 3022324, 3022325\", [\"1723:945:1315:40\"] = \"3022384, 3022395, 3022405, 3022406, 3022407, 3022408, 3022409, 3022410, 3022411, 3022385, 3022386, 3022387, 3022388, 3022389, 3022390, 3022391, 3022392, 3022393, 3022394, 3022396, 3022397, 3022398, 3022399, 3022400, 3022401, 3022402, 3022403, 3022404\",},\n\t[1306] = {\n\t\t[\"1019:737:2290:474\"] = \"3730584, 3730588, 3730589, 3730590, 3730591, 3730592, 3730593, 3730594, 3730595, 3730585, 3730586, 3730587\",\n\t\t[\"1030:1129:1200:1407\"] = \"3730837, 3730848, 3730855, 3730856, 3730857, 3730858, 3730859, 3730860, 3730861, 3730838, 3730839, 3730840, 3730841, 3730842, 3730843, 3730844, 3730845, 3730846, 3730847, 3730849, 3730850, 3730851, 3730852, 3730853, 3730854\",\n\t\t[\"1087:878:869:1682\"] = \"3730730, 3730741, 3730743, 3730744, 3730745, 3730746, 3730747, 3730748, 3730749, 3730731, 3730732, 3730733, 3730734, 3730735, 3730736, 3730737, 3730738, 3730739, 3730740, 3730742\",\n\t\t[\"1192:963:485:0\"] = \"3730707, 3730718, 3730720, 3730721, 3730725, 3730726, 3730727, 3730728, 3730729, 3730708, 3730709, 3730710, 3730711, 3730712, 3730713, 3730714, 3730715, 3730716, 3730717, 3730719\",\n\t\t[\"1207:1465:433:596\"] = \"3730807, 3730818, 3730829, 3730831, 3730832, 3730833, 3730834, 3730835, 3730836, 3730808, 3730809, 3730810, 3730811, 3730812, 3730813, 3730814, 3730815, 3730816, 3730817, 3730819, 3730820, 3730821, 3730822, 3730823, 3730824, 3730825, 3730826, 3730827, 3730828, 3730830\",\n\t\t[\"1339:746:1974:919\"] = \"3730750, 3730760, 3730761, 3730762, 3730763, 3730764, 3730765, 3730766, 3730767, 3730751, 3730752, 3730753, 3730754, 3730755, 3730756, 3730757, 3730758, 3730759\",\n\t\t[\"586:1091:1306:555\"] = \"3730641, 3730648, 3730649, 3730650, 3730651, 3730652, 3730653, 3730657, 3730669, 3730642, 3730643, 3730644, 3730645, 3730646, 3730647\",\n\t\t[\"685:688:1527:300\"] = \"3730685, 3730688, 3730690, 3730694, 3730695, 3730698, 3730701, 3730704, 3730706, 3730768, 3730769, 3730770, 3730771, 3730772, 3730773, 3730774, 3730775, 3730776\",\n\t\t[\"711:1183:1987:1377\"] = \"3730628, 3730633, 3730634, 3730635, 3730636, 3730637, 3730638, 3730639, 3730640, 3730629, 3730630, 3730631, 3730722, 3730723, 3730632\",\n\t\t[\"718:847:2597:1316\"] = \"3730596, 3730600, 3730601, 3730602, 3730603, 3730604, 3730605, 3730606, 3730607, 3730597, 3730598, 3730599\",\n\t\t[\"720:578:1487:1982\"] = \"3730777, 3730778, 3730779, 3730780, 3730781, 3730782, 3730783, 3730784, 3730785\",\n\t\t[\"835:1040:2324:1520\"] = \"3730786, 3730797, 3730799, 3730800, 3730801, 3730802, 3730803, 3730804, 3730805, 3730787, 3730788, 3730789, 3730790, 3730791, 3730792, 3730793, 3730794, 3730795, 3730796, 3730798\",\n\t\t[\"885:1060:1647:484\"] = \"3730608, 3730619, 3730621, 3730622, 3730623, 3730624, 3730625, 3730626, 3730627, 3730609, 3730610, 3730611, 3730612, 3730613, 3730614, 3730615, 3730616, 3730617, 3730618, 3730620\",\n\t},\n\t[1321] = {\n\t\t[\"1115:704:881:993\"] = \"3192874, 3192881, 3192882, 3192883, 3192884, 3192885, 3192886, 3192887, 3192888, 3192875, 3192876, 3192877, 3192878, 3192879, 3192880\",\n\t\t[\"1357:856:495:250\"] = \"3192889, 3192900, 3192906, 3192907, 3192908, 3192909, 3192910, 3192911, 3192912, 3192890, 3192891, 3192892, 3192893, 3192894, 3192895, 3192896, 3192897, 3192898, 3192899, 3192901, 3192902, 3192903, 3192904, 3192905\",\n\t\t[\"591:503:1566:1551\"] = \"3192856, 3192857, 3192858, 3192859, 3192860, 3192861\",\n\t\t[\"746:528:1793:1220\"] = \"3192941, 3192942, 3192943, 3192944, 3192945, 3192946, 3192947, 3192948, 3192949\",\n\t\t[\"783:542:1167:1387\"] = \"3192986, 3192990, 3192991, 3192992, 3192993, 3192994, 3192995, 3192996, 3192997, 3192987, 3192988, 3192989\",\n\t\t[\"804:564:1626:1949\"] = \"3192862, 3192866, 3192867, 3192868, 3192869, 3192870, 3192871, 3192872, 3192873, 3192863, 3192864, 3192865\",\n\t\t[\"826:494:2004:1590\"] = \"3192962, 3192963, 3192964, 3192965, 3192966, 3192967, 3192968, 3192969\",\n\t\t[\"839:558:1068:1768\"] = \"3192998, 3193002, 3193003, 3193004, 3193005, 3193006, 3193007, 3193008, 3193009, 3192999, 3193000, 3193001\",\n\t\t[\"881:911:2110:588\"] = \"3192970, 3192978, 3192979, 3192980, 3192981, 3192982, 3192983, 3192984, 3192985, 3192971, 3192972, 3192973, 3192974, 3192975, 3192976, 3192977\",\n\t\t[\"892:763:1975:155\"] = \"3192913, 3192917, 3192918, 3192919, 3192920, 3192921, 3192922, 3192923, 3192924, 3192914, 3192915, 3192916\",\n\t\t[\"984:847:1400:48\"] = \"3192925, 3192933, 3192934, 3192935, 3192936, 3192937, 3192938, 3192939, 3192940, 3192926, 3192927, 3192928, 3192929, 3192930, 3192931, 3192932\",\n\t\t[\"985:652:1475:706\"] = \"3192950, 3192954, 3192955, 3192956, 3192957, 3192958, 3192959, 3192960, 3192961, 3192951, 3192952, 3192953\",\n\t},\n\t[1323] = {\n\t\t[\"1149:703:284:1085\"] = \"3745117, 3745124, 3745125, 3745126, 3745127, 3745128, 3745129, 3745130, 3745131, 3745118, 3745119, 3745120, 3745121, 3745122, 3745123\",\n\t\t[\"1194:998:2438:785\"] = \"3745289, 3745300, 3745302, 3745303, 3745304, 3745305, 3745306, 3745307, 3745308, 3745290, 3745291, 3745292, 3745293, 3745294, 3745295, 3745296, 3745297, 3745298, 3745299, 3745301\",\n\t\t[\"1231:1391:261:65\"] = \"3745353, 3745364, 3745375, 3745377, 3745378, 3745379, 3745380, 3745381, 3745382, 3745354, 3745355, 3745356, 3745357, 3745358, 3745359, 3745360, 3745361, 3745362, 3745363, 3745365, 3745366, 3745367, 3745368, 3745369, 3745370, 3745371, 3745372, 3745373, 3745374, 3745376\",\n\t\t[\"1363:1137:2232:13\"] = \"3745189, 3745200, 3745211, 3745213, 3745214, 3745215, 3745216, 3745217, 3745218, 3745190, 3745191, 3745192, 3745193, 3745194, 3745195, 3745196, 3745197, 3745198, 3745199, 3745201, 3745202, 3745203, 3745204, 3745205, 3745206, 3745207, 3745208, 3745209, 3745210, 3745212\",\n\t\t[\"1508:1209:330:1351\"] = \"3745219, 3745230, 3745241, 3745243, 3745244, 3745245, 3745246, 3745247, 3745248, 3745220, 3745221, 3745222, 3745223, 3745224, 3745225, 3745226, 3745227, 3745228, 3745229, 3745231, 3745232, 3745233, 3745234, 3745235, 3745236, 3745237, 3745238, 3745239, 3745240, 3745242\",\n\t\t[\"1925:1136:1582:1424\"] = \"3745249, 3745260, 3745271, 3745282, 3745284, 3745285, 3745286, 3745287, 3745288, 3745250, 3745251, 3745252, 3745253, 3745254, 3745255, 3745256, 3745257, 3745258, 3745259, 3745261, 3745262, 3745263, 3745264, 3745265, 3745266, 3745267, 3745268, 3745269, 3745270, 3745272, 3745273, 3745274, 3745275, 3745276, 3745277, 3745278, 3745279, 3745280, 3745281, 3745283\",\n\t\t[\"673:788:1171:836\"] = \"3745341, 3745345, 3745346, 3745347, 3745348, 3745349, 3745350, 3745351, 3745352, 3745342, 3745343, 3745344\",\n\t\t[\"694:666:1815:517\"] = \"3745132, 3745133, 3745134, 3745135, 3745136, 3745137, 3745138, 3745139, 3745140\",\n\t\t[\"719:802:2028:894\"] = \"3745141, 3745145, 3745146, 3745147, 3745148, 3745149, 3745150, 3745151, 3745152, 3745142, 3745143, 3745144\",\n\t\t[\"730:730:1566:862\"] = \"3745383, 3745384, 3745385, 3745386, 3745387, 3745388, 3745389, 3745390, 3745391\",\n\t\t[\"757:985:1551:1342\"] = \"3745309, 3745313, 3745314, 3745315, 3745316, 3745317, 3745318, 3745319, 3745320, 3745310, 3745311, 3745312\",\n\t\t[\"858:1178:1202:0\"] = \"3745321, 3745332, 3745334, 3745335, 3745336, 3745337, 3745338, 3745339, 3745340, 3745322, 3745323, 3745324, 3745325, 3745326, 3745327, 3745328, 3745329, 3745330, 3745331, 3745333\",\n\t\t[\"932:919:1692:0\"] = \"3745173, 3745181, 3745182, 3745183, 3745184, 3745185, 3745186, 3745187, 3745188, 3745174, 3745175, 3745176, 3745177, 3745178, 3745179, 3745180\",\n\t\t[\"951:1071:631:46\"] = \"3745153, 3745164, 3745166, 3745167, 3745168, 3745169, 3745170, 3745171, 3745172, 3745154, 3745155, 3745156, 3745157, 3745158, 3745159, 3745160, 3745161, 3745162, 3745163, 3745165\",\n\t},\n\t[1329] = {\n\t\t[\"1009:835:1442:1262\"] = \"3745832, 3745840, 3745841, 3745842, 3745843, 3745844, 3745845, 3745846, 3745847, 3745833, 3745834, 3745835, 3745836, 3745837, 3745838, 3745839\",\n\t\t[\"1053:934:49:918\"] = \"3745893, 3745904, 3745906, 3745907, 3745908, 3745909, 3745910, 3745911, 3745912, 3745894, 3745895, 3745896, 3745897, 3745898, 3745899, 3745900, 3745901, 3745902, 3745903, 3745905\",\n\t\t[\"1078:824:772:598\"] = \"3746082, 3746093, 3746095, 3746096, 3746097, 3746098, 3746099, 3746100, 3746101, 3746083, 3746084, 3746085, 3746086, 3746087, 3746088, 3746089, 3746090, 3746091, 3746092, 3746094\",\n\t\t[\"1186:821:1100:696\"] = \"3745873, 3745884, 3745886, 3745887, 3745888, 3745889, 3745890, 3745891, 3745892, 3745874, 3745875, 3745876, 3745877, 3745878, 3745879, 3745880, 3745881, 3745882, 3745883, 3745885\",\n\t\t[\"1232:1236:0:342\"] = \"3745848, 3745859, 3745866, 3745867, 3745868, 3745869, 3745870, 3745871, 3745872, 3745849, 3745850, 3745851, 3745852, 3745853, 3745854, 3745855, 3745856, 3745857, 3745858, 3745860, 3745861, 3745862, 3745863, 3745864, 3745865\",\n\t\t[\"1395:932:183:0\"] = \"3746024, 3746035, 3746041, 3746042, 3746043, 3746044, 3746045, 3746046, 3746047, 3746025, 3746026, 3746027, 3746028, 3746029, 3746030, 3746031, 3746032, 3746033, 3746034, 3746036, 3746037, 3746038, 3746039, 3746040\",\n\t\t[\"1408:988:1856:1572\"] = \"3746048, 3746059, 3746065, 3746066, 3746067, 3746068, 3746069, 3746070, 3746071, 3746049, 3746050, 3746051, 3746052, 3746053, 3746054, 3746055, 3746056, 3746057, 3746058, 3746060, 3746061, 3746062, 3746063, 3746064\",\n\t\t[\"1488:1946:1797:0\"] = \"3745913, 3745924, 3745935, 3745948, 3745959, 3745960, 3745961, 3745962, 3745963, 3745914, 3745915, 3745916, 3745917, 3745918, 3745919, 3745920, 3745921, 3745922, 3745923, 3745925, 3745926, 3745927, 3745928, 3745929, 3745930, 3745931, 3745932, 3745933, 3745934, 3745936, 3745937, 3745938, 3745939, 3745940, 3745942, 3745943, 3745944, 3745946, 3745947, 3745949, 3745950, 3745951, 3745953, 3745954, 3745955, 3745956, 3745957, 3745958\",\n\t\t[\"1504:929:1171:0\"] = \"3745964, 3745975, 3745981, 3745982, 3745983, 3745984, 3745985, 3745986, 3745987, 3745965, 3745966, 3745967, 3745968, 3745969, 3745970, 3745971, 3745972, 3745973, 3745974, 3745976, 3745977, 3745978, 3745979, 3745980\",\n\t\t[\"928:1359:808:1201\"] = \"3746000, 3746011, 3746017, 3746018, 3746019, 3746020, 3746021, 3746022, 3746023, 3746001, 3746002, 3746003, 3746004, 3746005, 3746006, 3746007, 3746008, 3746009, 3746010, 3746012, 3746013, 3746014, 3746015, 3746016\",\n\t\t[\"928:729:1404:1831\"] = \"3745988, 3745992, 3745993, 3745994, 3745995, 3745996, 3745997, 3745998, 3745999, 3745989, 3745990, 3745991\",\n\t\t[\"954:1076:262:1423\"] = \"3745812, 3745823, 3745825, 3745826, 3745827, 3745828, 3745829, 3745830, 3745831, 3745813, 3745814, 3745815, 3745816, 3745817, 3745818, 3745819, 3745820, 3745821, 3745822, 3745824\",\n\t},\n\t[1338] = {\n\t\t[\"1179:1340:379:811\"] = \"3604311, 3604322, 3604333, 3604335, 3604336, 3604337, 3604338, 3604339, 3604340, 3604312, 3604313, 3604314, 3604315, 3604316, 3604317, 3604318, 3604319, 3604320, 3604321, 3604323, 3604324, 3604325, 3604326, 3604327, 3604328, 3604329, 3604330, 3604331, 3604332, 3604334\",\n\t\t[\"563:685:2107:638\"] = \"3604377, 3604378, 3604379, 3604380, 3604381, 3604382, 3604383, 3604384, 3604385\",\n\t\t[\"669:747:1993:885\"] = \"3604302, 3604303, 3604304, 3604305, 3604306, 3604307, 3604308, 3604309, 3604310\",\n\t\t[\"686:742:1487:945\"] = \"3604293, 3604294, 3604295, 3604296, 3604297, 3604298, 3604299, 3604300, 3604301\",\n\t\t[\"688:1139:1679:54\"] = \"3604262, 3604269, 3604270, 3604271, 3604272, 3604273, 3604274, 3604275, 3604276, 3604263, 3604264, 3604265, 3604266, 3604267, 3604268\",\n\t\t[\"770:603:1736:1234\"] = \"3604341, 3604345, 3604346, 3604347, 3604348, 3604349, 3604350, 3604351, 3604352, 3604342, 3604343, 3604344\",\n\t\t[\"798:896:1701:1607\"] = \"3604277, 3604285, 3604286, 3604287, 3604288, 3604289, 3604290, 3604291, 3604292, 3604278, 3604279, 3604280, 3604281, 3604282, 3604283, 3604284\",\n\t\t[\"803:645:2211:168\"] = \"3604353, 3604357, 3604358, 3604359, 3604360, 3604361, 3604362, 3604363, 3604364, 3604354, 3604355, 3604356\",\n\t\t[\"845:1048:1190:1242\"] = \"3604226, 3604237, 3604239, 3604240, 3604241, 3604242, 3604243, 3604244, 3604245, 3604227, 3604228, 3604229, 3604230, 3604231, 3604232, 3604233, 3604234, 3604235, 3604236, 3604238\",\n\t\t[\"847:783:1036:316\"] = \"3604198, 3604206, 3604207, 3604208, 3604209, 3604210, 3604211, 3604212, 3604213, 3604199, 3604200, 3604201, 3604202, 3604203, 3604204, 3604205\",\n\t\t[\"864:650:946:723\"] = \"3604365, 3604369, 3604370, 3604371, 3604372, 3604373, 3604374, 3604375, 3604376, 3604366, 3604367, 3604368\",\n\t\t[\"886:821:2339:1049\"] = \"3604246, 3604254, 3604255, 3604256, 3604257, 3604258, 3604259, 3604260, 3604261, 3604247, 3604248, 3604249, 3604250, 3604251, 3604252, 3604253\",\n\t\t[\"904:714:2338:474\"] = \"3604214, 3604218, 3604219, 3604220, 3604221, 3604222, 3604223, 3604224, 3604225, 3604215, 3604216, 3604217\",\n\t},\n\t[1342] = {\n\t\t[\"438:658:0:0\"] = \"3155826, 3155827, 3155828, 3155829, 3155830, 3155831\",\n\t\t[\"604:636:11:0\"] = \"3155832, 3155833, 3155834, 3155835, 3155836, 3155837, 3155838, 3155839, 3155840\",\n\t\t[\"613:558:315:31\"] = \"3155841, 3155842, 3155843, 3155844, 3155845, 3155846, 3155847, 3155848, 3155849\",\n\t},\n\t[1343] = {\n\t\t[\"448:651:328:7\"] = \"3165092, 3165093, 3165094, 3165095, 3165096, 3165097\",\n\t\t[\"504:602:448:0\"] = \"3165098, 3165099, 3165100, 3165101, 3165102, 3165103\",\n\t\t[\"575:570:61:0\"] = \"3165083, 3165084, 3165085, 3165086, 3165087, 3165088, 3165089, 3165090, 3165091\",\n\t},\n\t[1375] = {\n\t\t[\"1022:918:1693:66\"] = \"3767907, 3767922, 3767924, 3767926, 3767928, 3767930, 3767932, 3767934, 3767936, 3767909, 3767911, 3767913, 3767915, 3767916, 3767918, 3767920\",\n\t\t[\"1064:818:1982:1742\"] = \"3768002, 3768023, 3768027, 3768029, 3768031, 3768033, 3768035, 3768036, 3768038, 3768004, 3768006, 3768008, 3768010, 3768012, 3768014, 3768016, 3768017, 3768019, 3768021, 3768025\",\n\t\t[\"1539:723:577:1835\"] = \"3767961, 3767983, 3767989, 3767991, 3767993, 3767995, 3767997, 3767998, 3768000, 3767963, 3767965, 3767967, 3767970, 3767971, 3767973, 3767975, 3767977, 3767979, 3767981, 3767985, 3767987\",\n\t\t[\"1875:1551:1167:485\"] = \"3768040, 3768062, 3768083, 3768105, 3768126, 3768141, 3768143, 3768145, 3768147, 3768042, 3768044, 3768046, 3768048, 3768050, 3768052, 3768054, 3768056, 3768058, 3768060, 3768064, 3768066, 3768068, 3768070, 3768072, 3768074, 3768076, 3768077, 3768079, 3768081, 3768085, 3768087, 3768089, 3768091, 3768093, 3768095, 3768097, 3768099, 3768101, 3768103, 3768107, 3768109, 3768111, 3768113, 3768115, 3768117, 3768119, 3768121, 3768123, 3768124, 3768128, 3768130, 3768132, 3768134, 3768136, 3768138, 3768139\",\n\t\t[\"636:1035:1207:9\"] = \"3767878, 3767891, 3767893, 3767895, 3767897, 3767899, 3767901, 3767903, 3767905, 3767879, 3767881, 3767883, 3767885, 3767887, 3767889\",\n\t\t[\"665:937:594:1017\"] = \"3767938, 3767945, 3767947, 3767949, 3767951, 3767953, 3767955, 3767957, 3767959, 3767940, 3767942, 3767943\",\n\t\t[\"699:1107:677:56\"] = \"3767848, 3767862, 3767864, 3767866, 3767868, 3767870, 3767872, 3767874, 3767876, 3767850, 3767852, 3767854, 3767856, 3767858, 3767860\",\n\t},\n\t[1376] = {\n\t\t[\"1033:709:1363:1189\"] = \"3770207, 3770214, 3770215, 3770216, 3770217, 3770218, 3770219, 3770220, 3770221, 3770208, 3770209, 3770210, 3770211, 3770212, 3770213\",\n\t\t[\"1046:464:1356:892\"] = \"3770146, 3770148, 3770149, 3770150, 3770151, 3770152, 3770153, 3770154, 3770155, 3770147\",\n\t\t[\"1392:979:1382:1562\"] = \"3770228, 3770239, 3770245, 3770246, 3770247, 3770248, 3770249, 3770250, 3770251, 3770229, 3770230, 3770231, 3770232, 3770233, 3770234, 3770235, 3770236, 3770237, 3770238, 3770240, 3770241, 3770242, 3770243, 3770244\",\n\t\t[\"476:725:2283:1231\"] = \"3770222, 3770223, 3770224, 3770225, 3770226, 3770227\",\n\t\t[\"537:1134:2214:233\"] = \"3770172, 3770179, 3770180, 3770181, 3770182, 3770183, 3770184, 3770185, 3770186, 3770173, 3770174, 3770175, 3770176, 3770177, 3770178\",\n\t\t[\"718:769:961:26\"] = \"3770043, 3770114, 3770116, 3770118, 3770120, 3770122, 3770124, 3770126, 3770128, 3770045, 3770047, 3770049\",\n\t\t[\"846:1103:642:1186\"] = \"3770187, 3770198, 3770200, 3770201, 3770202, 3770203, 3770204, 3770205, 3770206, 3770188, 3770189, 3770190, 3770191, 3770192, 3770193, 3770194, 3770195, 3770196, 3770197, 3770199\",\n\t\t[\"943:977:1383:26\"] = \"3770156, 3770164, 3770165, 3770166, 3770167, 3770168, 3770169, 3770170, 3770171, 3770157, 3770158, 3770159, 3770160, 3770161, 3770162, 3770163\",\n\t\t[\"996:680:723:659\"] = \"3770129, 3770136, 3770137, 3770138, 3770139, 3770140, 3770141, 3770144, 3770145, 3770132, 3770134, 3770135\",\n\t},\n\t[1377] = {\n\t\t[\"1028:1024:1472:1536\"] = \"3771119, 3771133, 3771135, 3771136, 3771137, 3771138, 3771139, 3771140, 3771141, 3771120, 3771121, 3771122, 3771126, 3771127, 3771128, 3771129, 3771130, 3771131, 3771132, 3771134\",\n\t\t[\"1080:487:1809:585\"] = \"3771091, 3771093, 3771094, 3771095, 3771096, 3771097, 3771098, 3771099, 3771100, 3771092\",\n\t\t[\"1434:734:1483:920\"] = \"3771101, 3771111, 3771112, 3771113, 3771114, 3771115, 3771116, 3771117, 3771118, 3771102, 3771103, 3771104, 3771105, 3771106, 3771107, 3771108, 3771109, 3771110\",\n\t\t[\"535:705:1779:0\"] = \"3771050, 3771051, 3771052, 3771053, 3771054, 3771055, 3771056, 3771057, 3771058\",\n\t\t[\"940:647:970:158\"] = \"3771059, 3771063, 3771064, 3771065, 3771066, 3771067, 3771068, 3771069, 3771070, 3771060, 3771061, 3771062\",\n\t\t[\"983:1029:960:617\"] = \"3771071, 3771082, 3771084, 3771085, 3771086, 3771087, 3771088, 3771089, 3771090, 3771072, 3771073, 3771074, 3771075, 3771076, 3771077, 3771078, 3771079, 3771080, 3771081, 3771083\",\n\t},\n\t[1378] = {\n\t\t[\"1058:629:2050:189\"] = \"3771407, 3771414, 3771415, 3771416, 3771417, 3771418, 3771419, 3771420, 3771421, 3771408, 3771409, 3771410, 3771411, 3771412, 3771413\",\n\t\t[\"1134:804:1039:30\"] = \"3771422, 3771433, 3771435, 3771436, 3771437, 3771438, 3771439, 3771440, 3771441, 3771423, 3771424, 3771425, 3771426, 3771427, 3771428, 3771429, 3771430, 3771431, 3771432, 3771434\",\n\t\t[\"1456:869:1004:1691\"] = \"3771466, 3771477, 3771483, 3771484, 3771485, 3771486, 3771487, 3771488, 3771489, 3771467, 3771468, 3771469, 3771470, 3771471, 3771472, 3771473, 3771474, 3771475, 3771476, 3771478, 3771479, 3771480, 3771481, 3771482\",\n\t\t[\"571:1007:2339:1553\"] = \"3771526, 3771530, 3771531, 3771532, 3771533, 3771534, 3771535, 3771536, 3771537, 3771527, 3771528, 3771529\",\n\t\t[\"830:1232:1660:728\"] = \"3771490, 3771501, 3771503, 3771504, 3771505, 3771506, 3771507, 3771508, 3771509, 3771491, 3771492, 3771493, 3771494, 3771495, 3771496, 3771497, 3771498, 3771499, 3771500, 3771502\",\n\t\t[\"889:972:2008:697\"] = \"3771510, 3771518, 3771519, 3771520, 3771521, 3771522, 3771523, 3771524, 3771525, 3771511, 3771512, 3771513, 3771514, 3771515, 3771516, 3771517\",\n\t\t[\"988:1315:788:648\"] = \"3771442, 3771453, 3771459, 3771460, 3771461, 3771462, 3771463, 3771464, 3771465, 3771443, 3771444, 3771445, 3771446, 3771447, 3771448, 3771449, 3771450, 3771451, 3771452, 3771454, 3771455, 3771456, 3771457, 3771458\",\n\t},\n\t[1379] = {\n\t\t[\"1173:780:815:1389\"] = \"3771635, 3771646, 3771648, 3771649, 3771650, 3771651, 3771652, 3771653, 3771654, 3771636, 3771637, 3771638, 3771639, 3771640, 3771641, 3771642, 3771643, 3771644, 3771645, 3771647\",\n\t\t[\"1369:1087:832:428\"] = \"3771589, 3771600, 3771611, 3771613, 3771614, 3771615, 3771616, 3771617, 3771618, 3771590, 3771591, 3771592, 3771593, 3771594, 3771595, 3771596, 3771597, 3771598, 3771599, 3771601, 3771602, 3771603, 3771604, 3771605, 3771606, 3771607, 3771608, 3771609, 3771610, 3771612\",\n\t\t[\"1795:555:798:1995\"] = \"3771655, 3771666, 3771672, 3771673, 3771674, 3771675, 3771676, 3771677, 3771678, 3771656, 3771657, 3771658, 3771659, 3771660, 3771661, 3771662, 3771663, 3771664, 3771665, 3771667, 3771668, 3771669, 3771670, 3771671\",\n\t\t[\"508:1023:834:38\"] = \"3771554, 3771555, 3771556, 3771557, 3771558, 3771559, 3771560, 3771561\",\n\t\t[\"589:1233:2053:6\"] = \"3771574, 3771581, 3771582, 3771583, 3771584, 3771585, 3771586, 3771587, 3771588, 3771575, 3771576, 3771577, 3771578, 3771579, 3771580\",\n\t\t[\"957:536:1215:16\"] = \"3771562, 3771566, 3771567, 3771568, 3771569, 3771570, 3771571, 3771572, 3771573, 3771563, 3771564, 3771565\",\n\t\t[\"983:970:1869:1134\"] = \"3771619, 3771627, 3771628, 3771629, 3771630, 3771631, 3771632, 3771633, 3771634, 3771620, 3771621, 3771622, 3771623, 3771624, 3771625, 3771626\",\n\t},\n\t[1381] = {\n\t\t[\"1005:1040:1728:1510\"] = \"3772384, 3772395, 3772397, 3772398, 3772399, 3772400, 3772401, 3772402, 3772403, 3772385, 3772386, 3772387, 3772388, 3772389, 3772390, 3772391, 3772392, 3772393, 3772394, 3772396\",\n\t\t[\"1016:785:814:1775\"] = \"3772359, 3772367, 3772368, 3772369, 3772370, 3772371, 3772372, 3772373, 3772374, 3772360, 3772361, 3772362, 3772363, 3772364, 3772365, 3772366\",\n\t\t[\"1158:1228:1936:397\"] = \"3772273, 3772284, 3772291, 3772292, 3772293, 3772294, 3772295, 3772296, 3772297, 3772274, 3772275, 3772276, 3772277, 3772278, 3772279, 3772280, 3772281, 3772282, 3772283, 3772285, 3772286, 3772287, 3772288, 3772289, 3772290\",\n\t\t[\"444:1283:1913:873\"] = \"3772307, 3772311, 3772312, 3772313, 3772314, 3772315, 3772316, 3772317, 3772318, 3772308, 3772309, 3772310\",\n\t\t[\"696:779:1766:0\"] = \"3772261, 3772265, 3772266, 3772267, 3772268, 3772269, 3772270, 3772271, 3772272, 3772262, 3772263, 3772264\",\n\t\t[\"742:686:1275:1523\"] = \"3772375, 3772376, 3772377, 3772378, 3772379, 3772380, 3772381, 3772382, 3772383\",\n\t\t[\"746:747:2499:1054\"] = \"3772298, 3772299, 3772300, 3772301, 3772302, 3772303, 3772304, 3772305, 3772306\",\n\t\t[\"840:553:553:1330\"] = \"3772347, 3772351, 3772352, 3772353, 3772354, 3772355, 3772356, 3772357, 3772358, 3772348, 3772349, 3772350\",\n\t\t[\"863:770:1284:902\"] = \"3772319, 3772327, 3772328, 3772329, 3772330, 3772331, 3772332, 3772333, 3772334, 3772320, 3772321, 3772322, 3772323, 3772324, 3772325, 3772326\",\n\t\t[\"976:734:656:695\"] = \"3772335, 3772339, 3772340, 3772341, 3772342, 3772343, 3772344, 3772345, 3772346, 3772336, 3772337, 3772338\",\n\t},\n\t[1382] = {\n\t\t[\"1050:870:890:47\"] = \"3772457, 3772468, 3772470, 3772471, 3772472, 3772473, 3772474, 3772475, 3772476, 3772458, 3772459, 3772460, 3772461, 3772462, 3772463, 3772464, 3772465, 3772466, 3772467, 3772469\",\n\t\t[\"1084:1084:2444:436\"] = \"3772404, 3772415, 3772422, 3772423, 3772424, 3772425, 3772426, 3772427, 3772428, 3772405, 3772406, 3772407, 3772408, 3772409, 3772410, 3772411, 3772412, 3772413, 3772414, 3772416, 3772417, 3772418, 3772419, 3772420, 3772421\",\n\t\t[\"1165:810:963:1719\"] = \"3772507, 3772518, 3772520, 3772521, 3772522, 3772523, 3772524, 3772525, 3772526, 3772508, 3772509, 3772510, 3772511, 3772512, 3772513, 3772514, 3772515, 3772516, 3772517, 3772519\",\n\t\t[\"1447:1179:653:680\"] = \"3772477, 3772488, 3772499, 3772501, 3772502, 3772503, 3772504, 3772505, 3772506, 3772478, 3772479, 3772480, 3772481, 3772482, 3772483, 3772484, 3772485, 3772486, 3772487, 3772489, 3772490, 3772491, 3772492, 3772493, 3772494, 3772495, 3772496, 3772497, 3772498, 3772500\",\n\t\t[\"848:1116:237:1426\"] = \"3772527, 3772538, 3772540, 3772541, 3772542, 3772543, 3772544, 3772545, 3772546, 3772528, 3772529, 3772530, 3772531, 3772532, 3772533, 3772534, 3772535, 3772536, 3772537, 3772539\",\n\t\t[\"959:1721:1631:40\"] = \"3772429, 3772440, 3772450, 3772451, 3772452, 3772453, 3772454, 3772455, 3772456, 3772430, 3772431, 3772432, 3772433, 3772434, 3772435, 3772436, 3772437, 3772438, 3772439, 3772441, 3772442, 3772443, 3772444, 3772445, 3772446, 3772447, 3772448, 3772449\",\n\t},\n\t[1383] = {\n\t\t[\"565:1404:1748:591\"] = \"3774161, 3774171, 3774172, 3774173, 3774174, 3774175, 3774176, 3774177, 3774178, 3774162, 3774163, 3774164, 3774165, 3774166, 3774167, 3774168, 3774169, 3774170\",\n\t\t[\"677:1389:1198:595\"] = \"3774179, 3774189, 3774190, 3774191, 3774192, 3774193, 3774194, 3774195, 3774196, 3774180, 3774181, 3774182, 3774183, 3774184, 3774185, 3774186, 3774187, 3774188\",\n\t\t[\"792:1469:1817:173\"] = \"3774217, 3774228, 3774234, 3774235, 3774236, 3774237, 3774238, 3774239, 3774240, 3774218, 3774219, 3774220, 3774221, 3774222, 3774223, 3774224, 3774225, 3774226, 3774227, 3774229, 3774230, 3774231, 3774232, 3774233\",\n\t\t[\"802:1035:1336:1500\"] = \"3774197, 3774208, 3774210, 3774211, 3774212, 3774213, 3774214, 3774215, 3774216, 3774198, 3774199, 3774200, 3774201, 3774202, 3774203, 3774204, 3774205, 3774206, 3774207, 3774209\",\n\t},\n\t[1386] = {\n\t\t[\"1114:879:1161:1076\"] = \"3774335, 3774346, 3774348, 3774349, 3774350, 3774351, 3774352, 3774353, 3774354, 3774336, 3774337, 3774338, 3774339, 3774340, 3774341, 3774342, 3774343, 3774344, 3774345, 3774347\",\n\t\t[\"1290:756:833:1754\"] = \"3774367, 3774377, 3774378, 3774379, 3774380, 3774381, 3774382, 3774383, 3774384, 3774368, 3774369, 3774370, 3774371, 3774372, 3774373, 3774374, 3774375, 3774376\",\n\t\t[\"519:902:1306:384\"] = \"3774323, 3774327, 3774328, 3774329, 3774330, 3774331, 3774332, 3774333, 3774334, 3774324, 3774325, 3774326\",\n\t\t[\"688:1013:786:529\"] = \"3774311, 3774315, 3774316, 3774317, 3774318, 3774319, 3774320, 3774321, 3774322, 3774312, 3774313, 3774314\",\n\t\t[\"835:1344:1710:388\"] = \"3774287, 3774298, 3774304, 3774305, 3774306, 3774307, 3774308, 3774309, 3774310, 3774288, 3774289, 3774290, 3774291, 3774292, 3774293, 3774294, 3774295, 3774296, 3774297, 3774299, 3774300, 3774301, 3774302, 3774303\",\n\t\t[\"931:654:858:1427\"] = \"3774355, 3774359, 3774360, 3774361, 3774362, 3774363, 3774364, 3774365, 3774366, 3774356, 3774357, 3774358\",\n\t\t[\"999:1527:1955:22\"] = \"3774263, 3774274, 3774280, 3774281, 3774282, 3774283, 3774284, 3774285, 3774286, 3774264, 3774265, 3774266, 3774267, 3774268, 3774269, 3774270, 3774271, 3774272, 3774273, 3774275, 3774276, 3774277, 3774278, 3774279\",\n\t},\n\t[1389] = {\n\t\t[\"1044:733:1741:1635\"] = \"3776647, 3776654, 3776655, 3776656, 3776657, 3776658, 3776659, 3776660, 3776661, 3776648, 3776649, 3776650, 3776651, 3776652, 3776653\",\n\t\t[\"1370:940:1943:26\"] = \"3776574, 3776585, 3776591, 3776592, 3776593, 3776594, 3776595, 3776596, 3776597, 3776575, 3776576, 3776577, 3776578, 3776579, 3776580, 3776581, 3776582, 3776583, 3776584, 3776586, 3776587, 3776588, 3776589, 3776590\",\n\t\t[\"1439:1606:483:810\"] = \"3776662, 3776673, 3776684, 3776695, 3776699, 3776700, 3776701, 3776702, 3776703, 3776663, 3776664, 3776665, 3776666, 3776667, 3776668, 3776669, 3776670, 3776671, 3776672, 3776674, 3776675, 3776676, 3776677, 3776678, 3776679, 3776680, 3776681, 3776682, 3776683, 3776685, 3776686, 3776687, 3776688, 3776689, 3776690, 3776691, 3776692, 3776693, 3776694, 3776696, 3776697, 3776698\",\n\t\t[\"1873:1221:1807:812\"] = \"3776598, 3776609, 3776620, 3776631, 3776633, 3776634, 3776635, 3776636, 3776637, 3776599, 3776600, 3776601, 3776602, 3776603, 3776604, 3776605, 3776606, 3776607, 3776608, 3776610, 3776611, 3776612, 3776613, 3776614, 3776615, 3776616, 3776617, 3776618, 3776619, 3776621, 3776622, 3776623, 3776624, 3776625, 3776626, 3776627, 3776628, 3776629, 3776630, 3776632\",\n\t\t[\"603:579:1819:1159\"] = \"3776638, 3776639, 3776640, 3776641, 3776642, 3776643, 3776644, 3776645, 3776646\",\n\t\t[\"842:1244:400:1273\"] = \"3776704, 3776715, 3776717, 3776718, 3776719, 3776720, 3776721, 3776722, 3776723, 3776705, 3776706, 3776707, 3776708, 3776709, 3776710, 3776711, 3776712, 3776713, 3776714, 3776716\",\n\t},\n\t[1393] = {\n\t\t[\"1048:440:1238:1099\"] = \"3776981, 3776983, 3776984, 3776985, 3776986, 3776987, 3776988, 3776989, 3776990, 3776982\",\n\t\t[\"1131:960:1605:57\"] = \"3776941, 3776952, 3776954, 3776955, 3776956, 3776957, 3776958, 3776959, 3776960, 3776942, 3776943, 3776944, 3776945, 3776946, 3776947, 3776948, 3776949, 3776950, 3776951, 3776953\",\n\t\t[\"839:1123:1484:1437\"] = \"3776991, 3777002, 3777004, 3777005, 3777006, 3777007, 3777008, 3777009, 3777010, 3776992, 3776993, 3776994, 3776995, 3776996, 3776997, 3776998, 3776999, 3777000, 3777001, 3777003\",\n\t\t[\"861:668:1943:914\"] = \"3776969, 3776973, 3776974, 3776975, 3776976, 3776977, 3776978, 3776979, 3776980, 3776970, 3776971, 3776972\",\n\t\t[\"951:400:1250:800\"] = \"3776961, 3776962, 3776963, 3776964, 3776965, 3776966, 3776967, 3776968\",\n\t},\n\t[1439] = {\n\t\t[\"294:330:2036:1272\"] = \"3719472, 3719473, 3719474, 3719475\",\n\t\t[\"298:270:1381:453\"] = \"3719397, 3719398, 3719399, 3719400\",\n\t\t[\"303:279:1657:1012\"] = \"3719437, 3719438, 3719439, 3719440\",\n\t\t[\"337:359:2229:426\"] = \"3719413, 3719414, 3719415, 3719416\",\n\t\t[\"337:394:1378:674\"] = \"3719421, 3719422, 3719423, 3719424\",\n\t\t[\"339:534:2224:1619\"] = \"3719507, 3719508, 3719509, 3719510, 3719511, 3719512\",\n\t\t[\"344:389:2232:676\"] = \"3719425, 3719426, 3719427, 3719428\",\n\t\t[\"371:388:1394:1244\"] = \"3719464, 3719465, 3719466, 3719467\",\n\t\t[\"375:378:1102:400\"] = \"3719393, 3719394, 3719395, 3719396\",\n\t\t[\"377:402:1385:1520\"] = \"3719480, 3719481, 3719482, 3719483\",\n\t\t[\"383:389:1099:679\"] = \"3719417, 3719418, 3719419, 3719420\",\n\t\t[\"383:404:1104:1519\"] = \"3719476, 3719477, 3719478, 3719479\",\n\t\t[\"384:335:1379:957\"] = \"3719433, 3719434, 3719435, 3719436\",\n\t\t[\"387:328:1113:167\"] = \"3719386, 3719387, 3719388, 3719389\",\n\t\t[\"387:763:2225:960\"] = \"3719454, 3719455, 3719456, 3719457, 3719458, 3719459\",\n\t\t[\"457:334:989:1295\"] = \"3719460, 3719461, 3719462, 3719463\",\n\t\t[\"474:430:1855:933\"] = \"3719441, 3719442, 3719443, 3719451\",\n\t\t[\"487:419:1656:1228\"] = \"3719468, 3719469, 3719470, 3719471\",\n\t\t[\"502:321:975:961\"] = \"3719429, 3719430, 3719431, 3719432\",\n\t\t[\"572:338:1101:1815\"] = \"3719484, 3719485, 3719486, 3719487, 3719488, 3719489\",\n\t\t[\"749:786:1582:204\"] = \"3719401, 3719405, 3719406, 3719407, 3719408, 3719409, 3719410, 3719411, 3719412, 3719402, 3719403, 3719404\",\n\t\t[\"763:854:1568:1575\"] = \"3719490, 3719494, 3719500, 3719501, 3719502, 3719503, 3719504, 3719505, 3719506, 3719491, 3719492, 3719493\",\n\t},\n\t[1453] = {\n\t\t[\"252:240:273:411\"] = \"3754203\",\n\t},\n\t[1464] = {\n\t\t[\"1520:1017:1483:1230\"] = \"3765000, 3765011, 3765017, 3765018, 3765019, 3765020, 3765021, 3765022, 3765023, 3765001, 3765002, 3765003, 3765004, 3765005, 3765006, 3765007, 3765008, 3765009, 3765010, 3765012, 3765013, 3765014, 3765015, 3765016\",\n\t\t[\"2447:1356:600:85\"] = \"3764928, 3764939, 3764950, 3764961, 3764972, 3764983, 3764985, 3764986, 3764987, 3764929, 3764930, 3764931, 3764932, 3764933, 3764934, 3764935, 3764936, 3764937, 3764938, 3764940, 3764941, 3764942, 3764943, 3764944, 3764945, 3764946, 3764947, 3764948, 3764949, 3764951, 3764952, 3764953, 3764954, 3764955, 3764956, 3764957, 3764958, 3764959, 3764960, 3764962, 3764963, 3764964, 3764965, 3764966, 3764967, 3764968, 3764969, 3764970, 3764971, 3764973, 3764974, 3764975, 3764976, 3764977, 3764978, 3764979, 3764980, 3764981, 3764982, 3764984\",\n\t\t[\"651:949:2373:1518\"] = \"3765024, 3765028, 3765029, 3765030, 3765031, 3765032, 3765033, 3765034, 3765035, 3765025, 3765026, 3765027\",\n\t\t[\"792:729:1413:1021\"] = \"3764988, 3764992, 3764993, 3764994, 3764995, 3764996, 3764997, 3764998, 3764999, 3764989, 3764990, 3764991\",\n\t},\n\t[1465] = {\n\t\t[\"1038:725:1140:184\"] = \"3765210, 3765224, 3765226, 3765228, 3765230, 3765236, 3765238, 3765240, 3765242, 3765213, 3765215, 3765217, 3765218, 3765220, 3765222\",\n\t\t[\"1134:710:1143:1198\"] = \"3765274, 3765288, 3765290, 3765292, 3765294, 3765296, 3765298, 3765300, 3765302, 3765276, 3765278, 3765280, 3765282, 3765284, 3765286\",\n\t\t[\"1135:615:1120:749\"] = \"3765244, 3765258, 3765260, 3765262, 3765264, 3765266, 3765268, 3765270, 3765272, 3765246, 3765248, 3765250, 3765252, 3765254, 3765256\",\n\t\t[\"823:808:1474:1747\"] = \"3765304, 3765320, 3765322, 3765324, 3765326, 3765328, 3765330, 3765332, 3765334, 3765306, 3765308, 3765310, 3765312, 3765314, 3765316, 3765318\",\n\t},\n\t[1474] = {\n\t\t[\"1079:1464:756:212\"] = \"3779767, 3779778, 3779789, 3779791, 3779792, 3779793, 3779794, 3779795, 3779796, 3779768, 3779769, 3779770, 3779771, 3779772, 3779773, 3779774, 3779775, 3779776, 3779777, 3779779, 3779780, 3779781, 3779782, 3779783, 3779784, 3779785, 3779786, 3779787, 3779788, 3779790\",\n\t\t[\"1094:978:1710:1545\"] = \"3779817, 3779828, 3779830, 3779831, 3779832, 3779833, 3779834, 3779835, 3779836, 3779818, 3779819, 3779820, 3779821, 3779822, 3779823, 3779824, 3779825, 3779826, 3779827, 3779829\",\n\t\t[\"1106:973:727:1534\"] = \"3779797, 3779808, 3779810, 3779811, 3779812, 3779813, 3779814, 3779815, 3779816, 3779798, 3779799, 3779800, 3779801, 3779802, 3779803, 3779804, 3779805, 3779806, 3779807, 3779809\",\n\t\t[\"1401:1434:1715:208\"] = \"3779837, 3779848, 3779859, 3779867, 3779868, 3779869, 3779870, 3779871, 3779872, 3779838, 3779839, 3779840, 3779841, 3779842, 3779843, 3779844, 3779845, 3779846, 3779847, 3779849, 3779850, 3779851, 3779852, 3779853, 3779854, 3779855, 3779856, 3779857, 3779858, 3779860, 3779861, 3779862, 3779863, 3779864, 3779865, 3779866\",\n\t},\n\t[1475] = {\n\t\t[\"1562:2440:61:90\"] = \"3780023, 3780063, 3780074, 3780106, 3780117, 3780135, 3780146, 3780148, 3780149, 3780032, 3780033, 3780034, 3780035, 3780036, 3780037, 3780038, 3780042, 3780043, 3780054, 3780064, 3780065, 3780066, 3780067, 3780068, 3780069, 3780070, 3780071, 3780072, 3780073, 3780075, 3780076, 3780077, 3780078, 3780079, 3780080, 3780081, 3780082, 3780087, 3780105, 3780107, 3780108, 3780109, 3780110, 3780111, 3780112, 3780113, 3780114, 3780115, 3780116, 3780118, 3780119, 3780120, 3780121, 3780122, 3780123, 3780124, 3780125, 3780126, 3780134, 3780136, 3780137, 3780138, 3780139, 3780140, 3780141, 3780142, 3780143, 3780144, 3780145, 3780147\",\n\t\t[\"1660:2374:2076:111\"] = \"3780180, 3780191, 3780202, 3780213, 3780224, 3780238, 3780249, 3780251, 3780252, 3780181, 3780182, 3780183, 3780184, 3780185, 3780186, 3780187, 3780188, 3780189, 3780190, 3780192, 3780193, 3780194, 3780195, 3780196, 3780197, 3780198, 3780199, 3780200, 3780201, 3780203, 3780204, 3780205, 3780206, 3780207, 3780208, 3780209, 3780210, 3780211, 3780212, 3780214, 3780215, 3780216, 3780217, 3780218, 3780219, 3780220, 3780221, 3780222, 3780223, 3780225, 3780229, 3780230, 3780231, 3780232, 3780233, 3780234, 3780235, 3780236, 3780237, 3780239, 3780240, 3780241, 3780242, 3780243, 3780244, 3780245, 3780246, 3780247, 3780248, 3780250\",\n\t\t[\"725:2425:1478:102\"] = \"3780150, 3780161, 3780172, 3780174, 3780175, 3780176, 3780177, 3780178, 3780179, 3780151, 3780152, 3780153, 3780154, 3780155, 3780156, 3780157, 3780158, 3780159, 3780160, 3780162, 3780163, 3780164, 3780165, 3780166, 3780167, 3780168, 3780169, 3780170, 3780171, 3780173\",\n\t},\n\t[1477] = {\n\t\t[\"1208:1747:499:289\"] = \"3788374, 3788385, 3788396, 3788403, 3788404, 3788405, 3788406, 3788407, 3788408, 3788375, 3788376, 3788377, 3788378, 3788379, 3788380, 3788381, 3788382, 3788383, 3788384, 3788386, 3788387, 3788388, 3788389, 3788390, 3788391, 3788392, 3788393, 3788394, 3788395, 3788397, 3788398, 3788399, 3788400, 3788401, 3788402\",\n\t\t[\"1442:1755:2130:293\"] = \"3788427, 3788438, 3788449, 3788460, 3788464, 3788465, 3788466, 3788467, 3788468, 3788428, 3788429, 3788430, 3788431, 3788432, 3788433, 3788434, 3788435, 3788436, 3788437, 3788439, 3788440, 3788441, 3788442, 3788443, 3788444, 3788445, 3788446, 3788447, 3788448, 3788450, 3788451, 3788452, 3788453, 3788454, 3788455, 3788456, 3788457, 3788458, 3788459, 3788461, 3788462, 3788463\",\n\t\t[\"647:1310:1594:934\"] = \"3788409, 3788419, 3788420, 3788421, 3788422, 3788423, 3788424, 3788425, 3788426, 3788410, 3788411, 3788412, 3788413, 3788414, 3788415, 3788416, 3788417, 3788418\",\n\t\t[\"669:597:1587:449\"] = \"3788469, 3788470, 3788471, 3788472, 3788473, 3788474, 3788475, 3788476, 3788477\",\n\t},\n\t[1478] = {\n\t\t[\"1117:1052:2055:1290\"] = \"3788748, 3788760, 3788767, 3788768, 3788769, 3788770, 3788771, 3788772, 3788773, 3788749, 3788751, 3788752, 3788753, 3788754, 3788755, 3788756, 3788757, 3788758, 3788759, 3788761, 3788762, 3788763, 3788764, 3788765, 3788766\",\n\t\t[\"1290:1210:892:1302\"] = \"3788717, 3788728, 3788740, 3788742, 3788743, 3788744, 3788745, 3788746, 3788747, 3788718, 3788719, 3788720, 3788721, 3788722, 3788723, 3788724, 3788725, 3788726, 3788727, 3788729, 3788730, 3788731, 3788732, 3788733, 3788734, 3788735, 3788737, 3788738, 3788739, 3788741\",\n\t\t[\"1592:1281:415:134\"] = \"3788675, 3788686, 3788697, 3788708, 3788712, 3788713, 3788714, 3788715, 3788716, 3788676, 3788677, 3788678, 3788679, 3788680, 3788681, 3788682, 3788683, 3788684, 3788685, 3788687, 3788688, 3788689, 3788690, 3788691, 3788692, 3788693, 3788694, 3788695, 3788696, 3788698, 3788699, 3788700, 3788701, 3788702, 3788703, 3788704, 3788705, 3788706, 3788707, 3788709, 3788710, 3788711\",\n\t\t[\"1811:1114:1912:287\"] = \"3788774, 3788785, 3788796, 3788807, 3788809, 3788810, 3788811, 3788812, 3788813, 3788775, 3788776, 3788777, 3788778, 3788779, 3788780, 3788781, 3788782, 3788783, 3788784, 3788786, 3788787, 3788788, 3788789, 3788790, 3788791, 3788792, 3788793, 3788794, 3788795, 3788797, 3788798, 3788799, 3788800, 3788801, 3788802, 3788803, 3788804, 3788805, 3788806, 3788808\",\n\t},\n\t[1479] = {\n\t\t[\"1384:1253:1106:1279\"] = \"3789143, 3789154, 3789165, 3789167, 3789168, 3789169, 3789170, 3789171, 3789172, 3789144, 3789145, 3789146, 3789147, 3789148, 3789149, 3789150, 3789151, 3789152, 3789153, 3789155, 3789156, 3789157, 3789158, 3789159, 3789160, 3789161, 3789162, 3789163, 3789164, 3789166\",\n\t\t[\"854:1010:2003:375\"] = \"3789127, 3789135, 3789136, 3789137, 3789138, 3789139, 3789140, 3789141, 3789142, 3789128, 3789129, 3789130, 3789131, 3789132, 3789133, 3789134\",\n\t\t[\"876:1317:739:152\"] = \"3789079, 3789090, 3789096, 3789097, 3789098, 3789099, 3789100, 3789101, 3789102, 3789080, 3789081, 3789082, 3789083, 3789084, 3789085, 3789086, 3789087, 3789088, 3789089, 3789091, 3789092, 3789093, 3789094, 3789095\",\n\t\t[\"902:1372:1496:0\"] = \"3789103, 3789114, 3789120, 3789121, 3789122, 3789123, 3789124, 3789125, 3789126, 3789104, 3789105, 3789106, 3789107, 3789108, 3789109, 3789110, 3789111, 3789112, 3789113, 3789115, 3789116, 3789117, 3789118, 3789119\",\n\t},\n\t[1482] = {\n\t\t[\"1060:1166:2122:1027\"] = \"3790858, 3790879, 3790892, 3790894, 3790896, 3790897, 3790899, 3790901, 3790903, 3790860, 3790862, 3790864, 3790866, 3790867, 3790869, 3790871, 3790873, 3790875, 3790877, 3790881, 3790882, 3790884, 3790886, 3790888, 3790890\",\n\t\t[\"1166:1131:2059:0\"] = \"3790950, 3790971, 3790984, 3790986, 3790988, 3790990, 3790992, 3790994, 3790996, 3790952, 3790954, 3790956, 3790958, 3790960, 3790962, 3790963, 3790965, 3790967, 3790969, 3790973, 3790975, 3790977, 3790979, 3790980, 3790982\",\n\t\t[\"775:2043:744:116\"] = \"3790754, 3790775, 3790800, 3790808, 3790810, 3790812, 3790814, 3790816, 3790818, 3790756, 3790758, 3790760, 3790762, 3790764, 3790766, 3790768, 3790769, 3790771, 3790773, 3790777, 3790779, 3790781, 3790783, 3790785, 3790787, 3790788, 3790790, 3790792, 3790798, 3790802, 3790804, 3790806\",\n\t\t[\"906:1314:1610:453\"] = \"3790905, 3790926, 3790937, 3790939, 3790941, 3790943, 3790945, 3790946, 3790948, 3790907, 3790908, 3790910, 3790912, 3790914, 3790916, 3790918, 3790920, 3790922, 3790924, 3790928, 3790930, 3790931, 3790933, 3790935\",\n\t\t[\"977:1180:1266:1179\"] = \"3790819, 3790840, 3790844, 3790846, 3790848, 3790850, 3790852, 3790854, 3790856, 3790821, 3790823, 3790825, 3790827, 3790829, 3790831, 3790833, 3790835, 3790837, 3790838, 3790842\",\n\t},\n\t[1484] = {\n\t\t[\"1108:919:1745:1408\"] = \"3791457, 3791468, 3791470, 3791471, 3791472, 3791473, 3791474, 3791475, 3791476, 3791458, 3791459, 3791460, 3791461, 3791462, 3791463, 3791464, 3791465, 3791466, 3791467, 3791469\",\n\t\t[\"1132:1401:719:1038\"] = \"3791427, 3791438, 3791449, 3791451, 3791452, 3791453, 3791454, 3791455, 3791456, 3791428, 3791429, 3791430, 3791431, 3791432, 3791433, 3791434, 3791435, 3791436, 3791437, 3791439, 3791440, 3791441, 3791442, 3791443, 3791444, 3791445, 3791446, 3791447, 3791448, 3791450\",\n\t\t[\"1338:1490:1727:18\"] = \"3791477, 3791488, 3791499, 3791507, 3791508, 3791509, 3791510, 3791511, 3791512, 3791478, 3791479, 3791480, 3791481, 3791482, 3791483, 3791484, 3791485, 3791486, 3791487, 3791489, 3791490, 3791491, 3791492, 3791493, 3791494, 3791495, 3791496, 3791497, 3791498, 3791500, 3791501, 3791502, 3791503, 3791504, 3791505, 3791506\",\n\t},\n\t[1485] = {\n\t\t[\"1807:872:1286:951\"] = \"3791702, 3791713, 3791724, 3791728, 3791729, 3791730, 3791731, 3791732, 3791733, 3791703, 3791704, 3791705, 3791706, 3791707, 3791708, 3791709, 3791710, 3791711, 3791712, 3791714, 3791715, 3791716, 3791717, 3791718, 3791719, 3791720, 3791721, 3791722, 3791723, 3791725, 3791726, 3791727\",\n\t\t[\"938:1010:1680:49\"] = \"3791686, 3791694, 3791695, 3791696, 3791697, 3791698, 3791699, 3791700, 3791701, 3791687, 3791688, 3791689, 3791690, 3791691, 3791692, 3791693\",\n\t\t[\"945:1059:828:56\"] = \"3791666, 3791677, 3791679, 3791680, 3791681, 3791682, 3791683, 3791684, 3791685, 3791667, 3791668, 3791669, 3791670, 3791671, 3791672, 3791673, 3791674, 3791675, 3791676, 3791678\",\n\t\t[\"971:827:1559:1717\"] = \"3791734, 3791742, 3791743, 3791744, 3791745, 3791746, 3791747, 3791748, 3791749, 3791735, 3791736, 3791737, 3791738, 3791739, 3791740, 3791741\",\n\t},\n\t[1492] = {\n\t\t[\"1226:1196:1303:1301\"] = \"3795577, 3795588, 3795595, 3795596, 3795597, 3795598, 3795599, 3795600, 3795601, 3795578, 3795579, 3795580, 3795581, 3795582, 3795583, 3795584, 3795585, 3795586, 3795587, 3795589, 3795590, 3795591, 3795592, 3795593, 3795594\",\n\t\t[\"3006:1749:408:22\"] = \"3795602, 3795613, 3795624, 3795635, 3795646, 3795657, 3795668, 3795679, 3795685, 3795603, 3795604, 3795605, 3795606, 3795607, 3795608, 3795609, 3795610, 3795611, 3795612, 3795614, 3795615, 3795616, 3795617, 3795618, 3795619, 3795620, 3795621, 3795622, 3795623, 3795625, 3795626, 3795627, 3795628, 3795629, 3795630, 3795631, 3795632, 3795633, 3795634, 3795636, 3795637, 3795638, 3795639, 3795640, 3795641, 3795642, 3795643, 3795644, 3795645, 3795647, 3795648, 3795649, 3795650, 3795651, 3795652, 3795653, 3795654, 3795655, 3795656, 3795658, 3795659, 3795660, 3795661, 3795662, 3795663, 3795664, 3795665, 3795666, 3795667, 3795669, 3795670, 3795671, 3795672, 3795673, 3795674, 3795675, 3795676, 3795677, 3795678, 3795680, 3795681, 3795682, 3795683, 3795684\",\n\t},\n\t[1502] = {\n\t\t[\"1005:825:2011:180\"] = \"3801103, 3801118, 3801120, 3801122, 3801124, 3801126, 3801128, 3801130, 3801132, 3801105, 3801107, 3801109, 3801111, 3801113, 3801115, 3801116\",\n\t\t[\"1014:1487:501:486\"] = \"3800970, 3800993, 3801005, 3801007, 3801008, 3801010, 3801012, 3801014, 3801016, 3800973, 3800975, 3800977, 3800979, 3800981, 3800983, 3800985, 3800987, 3800989, 3800991, 3800995, 3800997, 3800999, 3801001, 3801003\",\n\t\t[\"1323:670:2000:885\"] = \"3801134, 3801154, 3801156, 3801158, 3801160, 3801162, 3801164, 3801166, 3801168, 3801136, 3801138, 3801140, 3801142, 3801144, 3801146, 3801148, 3801150, 3801152\",\n\t\t[\"810:682:1319:877\"] = \"3801018, 3801026, 3801028, 3801030, 3801032, 3801034, 3801036, 3801038, 3801040, 3801020, 3801022, 3801024\",\n\t\t[\"877:812:1227:184\"] = \"3801072, 3801088, 3801090, 3801091, 3801093, 3801095, 3801097, 3801099, 3801101, 3801074, 3801076, 3801078, 3801080, 3801082, 3801084, 3801086\",\n\t\t[\"964:948:1144:1431\"] = \"3801042, 3801057, 3801059, 3801061, 3801063, 3801065, 3801067, 3801069, 3801071, 3801044, 3801046, 3801048, 3801050, 3801052, 3801053, 3801055\",\n\t\t[\"979:954:2013:1428\"] = \"3801170, 3801185, 3801187, 3801189, 3801191, 3801193, 3801195, 3801197, 3801199, 3801172, 3801174, 3801176, 3801178, 3801179, 3801181, 3801183\",\n\t},\n\t[1503] = {\n\t\t[\"1007:1460:467:612\"] = \"3802618, 3802629, 3802635, 3802636, 3802637, 3802638, 3802639, 3802640, 3802641, 3802619, 3802620, 3802621, 3802622, 3802623, 3802624, 3802625, 3802626, 3802627, 3802628, 3802630, 3802631, 3802632, 3802633, 3802634\",\n\t\t[\"1586:1924:1920:448\"] = \"3802674, 3802685, 3802696, 3802707, 3802718, 3802726, 3802727, 3802728, 3802729, 3802675, 3802676, 3802677, 3802678, 3802679, 3802680, 3802681, 3802682, 3802683, 3802684, 3802686, 3802687, 3802688, 3802689, 3802690, 3802691, 3802692, 3802693, 3802694, 3802695, 3802697, 3802698, 3802699, 3802700, 3802701, 3802702, 3802703, 3802704, 3802705, 3802706, 3802708, 3802709, 3802710, 3802711, 3802712, 3802713, 3802714, 3802715, 3802716, 3802717, 3802719, 3802720, 3802721, 3802722, 3802723, 3802724, 3802725\",\n\t\t[\"833:1871:1274:228\"] = \"3802642, 3802653, 3802664, 3802668, 3802669, 3802670, 3802671, 3802672, 3802673, 3802643, 3802644, 3802645, 3802646, 3802647, 3802648, 3802649, 3802650, 3802651, 3802652, 3802654, 3802655, 3802656, 3802657, 3802658, 3802659, 3802660, 3802661, 3802662, 3802663, 3802665, 3802666, 3802667\",\n\t},\n\t[1510] = {\n\t\t[\"1480:978:1247:1460\"] = \"3804855, 3804866, 3804872, 3804873, 3804874, 3804875, 3804876, 3804877, 3804878, 3804856, 3804857, 3804858, 3804859, 3804860, 3804861, 3804862, 3804863, 3804864, 3804865, 3804867, 3804868, 3804869, 3804870, 3804871\",\n\t\t[\"1664:1327:1104:231\"] = \"3804879, 3804890, 3804901, 3804912, 3804916, 3804917, 3804918, 3804919, 3804920, 3804880, 3804881, 3804882, 3804883, 3804884, 3804885, 3804886, 3804887, 3804888, 3804889, 3804891, 3804892, 3804893, 3804894, 3804895, 3804896, 3804897, 3804898, 3804899, 3804900, 3804902, 3804903, 3804904, 3804905, 3804906, 3804907, 3804908, 3804909, 3804910, 3804911, 3804913, 3804914, 3804915\",\n\t},\n\t[1512] = {\n\t\t[\"1297:1026:1998:1191\"] = \"3805283, 3805294, 3805305, 3805307, 3805308, 3805309, 3805310, 3805311, 3805312, 3805284, 3805285, 3805286, 3805287, 3805288, 3805289, 3805290, 3805291, 3805292, 3805293, 3805295, 3805296, 3805297, 3805298, 3805299, 3805300, 3805301, 3805302, 3805303, 3805304, 3805306\",\n\t\t[\"1415:1037:251:1197\"] = \"3805235, 3805246, 3805257, 3805259, 3805260, 3805261, 3805262, 3805263, 3805264, 3805236, 3805237, 3805238, 3805239, 3805240, 3805241, 3805242, 3805243, 3805244, 3805245, 3805247, 3805248, 3805249, 3805250, 3805251, 3805252, 3805253, 3805254, 3805255, 3805256, 3805258\",\n\t\t[\"2454:1432:750:12\"] = \"3805313, 3805324, 3805335, 3805346, 3805357, 3805368, 3805370, 3805371, 3805372, 3805314, 3805315, 3805316, 3805317, 3805318, 3805319, 3805320, 3805321, 3805322, 3805323, 3805325, 3805326, 3805327, 3805328, 3805329, 3805330, 3805331, 3805332, 3805333, 3805334, 3805336, 3805337, 3805338, 3805339, 3805340, 3805341, 3805342, 3805343, 3805344, 3805345, 3805347, 3805348, 3805349, 3805350, 3805351, 3805352, 3805353, 3805354, 3805355, 3805356, 3805358, 3805359, 3805360, 3805361, 3805362, 3805363, 3805364, 3805365, 3805366, 3805367, 3805369\",\n\t\t[\"623:1489:1521:906\"] = \"3805265, 3805275, 3805276, 3805277, 3805278, 3805279, 3805280, 3805281, 3805282, 3805266, 3805267, 3805268, 3805269, 3805270, 3805271, 3805272, 3805273, 3805274\",\n\t},\n\t[1513] = {\n\t\t[\"754:5050:1547:231\"] = \"3805692, 3805703, 3805712, 3805713, 3805714, 3805715, 3805716, 3805717, 3805718, 3805693, 3805694, 3805695, 3805696, 3805697, 3805698, 3805699, 3805700, 3805701, 3805702, 3805704, 3805705, 3805706, 3805707, 3805708, 3805709, 3805710, 3805711, 0\",\n\t\t[\"765:1894:959:406\"] = \"3805668, 3805679, 3805685, 3805686, 3805687, 3805688, 3805689, 3805690, 3805691, 3805669, 3805670, 3805671, 3805672, 3805673, 3805674, 3805675, 3805676, 3805677, 3805678, 3805680, 3805681, 3805682, 3805683, 3805684\",\n\t\t[\"786:1887:2142:396\"] = \"3805719, 3805730, 3805742, 3805747, 3805748, 3805749, 3805750, 3805751, 3805752, 3805720, 3805721, 3805722, 3805723, 3805724, 3805725, 3805726, 3805727, 3805728, 3805729, 3805731, 3805732, 3805733, 3805734, 3805735, 3805737, 3805738, 3805739, 3805740, 3805741, 3805743, 3805745, 3805746\",\n\t},\n\t[1514] = {\n\t\t[\"1156:465:602:1062\"] = \"3806122, 3806124, 3806125, 3806126, 3806127, 3806128, 3806129, 3806130, 3806131, 3806123\",\n\t\t[\"1225:708:489:510\"] = \"3806107, 3806114, 3806115, 3806116, 3806117, 3806118, 3806119, 3806120, 3806121, 3806108, 3806109, 3806110, 3806111, 3806112, 3806113\",\n\t\t[\"1259:509:2156:653\"] = \"3806150, 3806152, 3806153, 3806154, 3806155, 3806156, 3806157, 3806158, 3806159, 3806151\",\n\t\t[\"1266:941:2151:1041\"] = \"3806160, 3806171, 3806173, 3806174, 3806175, 3806176, 3806177, 3806178, 3806179, 3806161, 3806162, 3806163, 3806164, 3806165, 3806166, 3806167, 3806168, 3806169, 3806170, 3806172\",\n\t\t[\"727:1420:1579:396\"] = \"3806132, 3806142, 3806143, 3806144, 3806145, 3806146, 3806147, 3806148, 3806149, 3806133, 3806134, 3806135, 3806136, 3806137, 3806138, 3806139, 3806140, 3806141\",\n\t},\n\t[1515] = {\n\t\t[\"1350:1420:1160:120\"] = \"3811387, 3811398, 3811409, 3811417, 3811418, 3811419, 3811420, 3811421, 3811422, 3811388, 3811389, 3811390, 3811391, 3811392, 3811393, 3811394, 3811395, 3811396, 3811397, 3811399, 3811400, 3811401, 3811402, 3811403, 3811404, 3811405, 3811406, 3811407, 3811408, 3811410, 3811411, 3811412, 3811413, 3811414, 3811415, 3811416\",\n\t\t[\"1381:1602:1849:696\"] = \"3811423, 3811434, 3811445, 3811456, 3811460, 3811461, 3811462, 3811463, 3811464, 3811424, 3811425, 3811426, 3811427, 3811428, 3811429, 3811430, 3811431, 3811432, 3811433, 3811435, 3811436, 3811437, 3811438, 3811439, 3811440, 3811441, 3811442, 3811443, 3811444, 3811446, 3811447, 3811448, 3811449, 3811450, 3811451, 3811452, 3811453, 3811454, 3811455, 3811457, 3811458, 3811459\",\n\t\t[\"994:1285:724:555\"] = \"3811363, 3811374, 3811380, 3811381, 3811382, 3811383, 3811384, 3811385, 3811386, 3811364, 3811365, 3811366, 3811367, 3811368, 3811369, 3811370, 3811371, 3811372, 3811373, 3811375, 3811376, 3811377, 3811378, 3811379\",\n\t},\n\t[1517] = {\n\t\t[\"1353:1415:537:717\"] = \"3806880, 3806891, 3806902, 3806910, 3806911, 3806912, 3806913, 3806914, 3806915, 3806881, 3806882, 3806883, 3806884, 3806885, 3806886, 3806887, 3806888, 3806889, 3806890, 3806892, 3806893, 3806894, 3806895, 3806896, 3806897, 3806898, 3806899, 3806900, 3806901, 3806903, 3806904, 3806905, 3806906, 3806907, 3806908, 3806909\",\n\t\t[\"618:2391:1775:87\"] = \"3806916, 3806927, 3806945, 3806947, 3806948, 3806949, 3806950, 3806951, 3806952, 3806917, 3806918, 3806919, 3806920, 3806921, 3806922, 3806923, 3806924, 3806925, 3806926, 3806928, 3806929, 3806930, 3806931, 3806932, 3806933, 3806934, 3806935, 3806936, 3806937, 3806946\",\n\t\t[\"949:1036:2246:872\"] = \"3806953, 3806964, 3806966, 3806967, 3806968, 3806969, 3806970, 3806971, 3806972, 3806954, 3806955, 3806956, 3806957, 3806958, 3806959, 3806960, 3806961, 3806962, 3806963, 3806965\",\n\t},\n\t[1519] = {\n\t\t[\"1388:1297:292:102\"] = \"3808677, 3808688, 3808699, 3808707, 3808708, 3808709, 3808710, 3808711, 3808712, 3808678, 3808679, 3808680, 3808681, 3808682, 3808683, 3808684, 3808685, 3808686, 3808687, 3808689, 3808690, 3808691, 3808692, 3808693, 3808694, 3808695, 3808696, 3808697, 3808698, 3808700, 3808701, 3808702, 3808703, 3808704, 3808705, 3808706\",\n\t\t[\"1408:1211:288:1305\"] = \"3808721, 3808732, 3808743, 3808745, 3808746, 3808747, 3808748, 3808749, 3808750, 3808722, 3808723, 3808724, 3808725, 3808726, 3808727, 3808728, 3808729, 3808730, 3808731, 3808733, 3808734, 3808735, 3808736, 3808737, 3808738, 3808739, 3808740, 3808741, 3808742, 3808744\",\n\t\t[\"1417:1229:2032:1306\"] = \"3808790, 3808801, 3808812, 3808814, 3808815, 3808816, 3808817, 3808818, 3808819, 3808791, 3808792, 3808793, 3808794, 3808795, 3808796, 3808797, 3808798, 3808799, 3808800, 3808802, 3808803, 3808804, 3808805, 3808806, 3808807, 3808808, 3808809, 3808810, 3808811, 3808813\",\n\t\t[\"1432:1315:2024:85\"] = \"3808828, 3808839, 3808850, 3808858, 3808859, 3808860, 3808861, 3808862, 3808863, 3808829, 3808830, 3808831, 3808832, 3808833, 3808834, 3808835, 3808836, 3808837, 3808838, 3808840, 3808841, 3808842, 3808843, 3808844, 3808845, 3808846, 3808847, 3808848, 3808849, 3808851, 3808852, 3808853, 3808854, 3808855, 3808856, 3808857\",\n\t\t[\"559:1052:1589:1508\"] = \"3808775, 3808782, 3808783, 3808784, 3808785, 3808786, 3808787, 3808788, 3808789, 3808776, 3808777, 3808778, 3808779, 3808780, 3808781\",\n\t\t[\"571:539:1574:1080\"] = \"3808766, 3808767, 3808768, 3808769, 3808770, 3808771, 3808772, 3808773, 3808774\",\n\t\t[\"673:1186:1515:0\"] = \"3808751, 3808758, 3808759, 3808760, 3808761, 3808762, 3808763, 3808764, 3808765, 3808752, 3808753, 3808754, 3808755, 3808756, 3808757\",\n\t\t[\"954:507:2005:1105\"] = \"3808820, 3808821, 3808822, 3808823, 3808824, 3808825, 3808826, 3808827\",\n\t\t[\"970:475:741:1119\"] = \"3808713, 3808714, 3808715, 3808716, 3808717, 3808718, 3808719, 3808720\",\n\t},\n\t[1525] = {\n\t\t[\"1058:629:2050:189\"] = \"3816506, 3816513, 3816514, 3816515, 3816516, 3816517, 3816518, 3816519, 3816520, 3816507, 3816508, 3816509, 3816510, 3816511, 3816512\",\n\t\t[\"1134:804:1039:30\"] = \"3816521, 3816532, 3816534, 3816535, 3816536, 3816537, 3816538, 3816539, 3816540, 3816522, 3816523, 3816524, 3816525, 3816526, 3816527, 3816528, 3816529, 3816530, 3816531, 3816533\",\n\t\t[\"1456:869:1004:1691\"] = \"3816565, 3816576, 3816582, 3816583, 3816584, 3816585, 3816586, 3816587, 3816588, 3816566, 3816567, 3816568, 3816569, 3816570, 3816571, 3816572, 3816573, 3816574, 3816575, 3816577, 3816578, 3816579, 3816580, 3816581\",\n\t\t[\"571:1007:2339:1553\"] = \"3816626, 3816630, 3816631, 3816632, 3816633, 3816634, 3816635, 3816636, 3816637, 3816627, 3816628, 3816629\",\n\t\t[\"830:1232:1660:728\"] = \"3816589, 3816600, 3816602, 3816603, 3816604, 3816605, 3816606, 3816607, 3816609, 3816590, 3816591, 3816592, 3816593, 3816594, 3816595, 3816596, 3816597, 3816598, 3816599, 3816601\",\n\t\t[\"889:972:2008:697\"] = \"3816610, 3816618, 3816619, 3816620, 3816621, 3816622, 3816623, 3816624, 3816625, 3816611, 3816612, 3816613, 3816614, 3816615, 3816616, 3816617\",\n\t\t[\"988:1315:788:648\"] = \"3816541, 3816552, 3816558, 3816559, 3816560, 3816561, 3816562, 3816563, 3816564, 3816542, 3816543, 3816544, 3816545, 3816546, 3816547, 3816548, 3816549, 3816550, 3816551, 3816553, 3816554, 3816555, 3816556, 3816557\",\n\t},\n\t[1526] = {\n\t\t[\"1173:780:815:1389\"] = \"3816869, 3816880, 3816882, 3816883, 3816884, 3816885, 3816886, 3816887, 3816888, 3816870, 3816871, 3816872, 3816873, 3816874, 3816875, 3816876, 3816877, 3816878, 3816879, 3816881\",\n\t\t[\"1369:1087:832:428\"] = \"3816823, 3816834, 3816845, 3816847, 3816848, 3816849, 3816850, 3816851, 3816852, 3816824, 3816825, 3816826, 3816827, 3816828, 3816829, 3816830, 3816831, 3816832, 3816833, 3816835, 3816836, 3816837, 3816838, 3816839, 3816840, 3816841, 3816842, 3816843, 3816844, 3816846\",\n\t\t[\"1795:555:798:1995\"] = \"3816889, 3816900, 3816906, 3816907, 3816908, 3816909, 3816910, 3816911, 3816912, 3816890, 3816891, 3816892, 3816893, 3816894, 3816895, 3816896, 3816897, 3816898, 3816899, 3816901, 3816902, 3816903, 3816904, 3816905\",\n\t\t[\"508:1023:834:38\"] = \"3816788, 3816789, 3816790, 3816791, 3816792, 3816793, 3816794, 3816795\",\n\t\t[\"589:1233:2053:6\"] = \"3816808, 3816815, 3816816, 3816817, 3816818, 3816819, 3816820, 3816821, 3816822, 3816809, 3816810, 3816811, 3816812, 3816813, 3816814\",\n\t\t[\"957:536:1215:16\"] = \"3816796, 3816800, 3816801, 3816802, 3816803, 3816804, 3816805, 3816806, 3816807, 3816797, 3816798, 3816799\",\n\t\t[\"983:970:1869:1134\"] = \"3816853, 3816861, 3816862, 3816863, 3816864, 3816865, 3816866, 3816867, 3816868, 3816854, 3816855, 3816856, 3816857, 3816858, 3816859, 3816860\",\n\t},\n\t[1528] = {\n\t\t[\"1005:1040:1728:1510\"] = \"3817339, 3817350, 3817352, 3817353, 3817354, 3817355, 3817357, 3817358, 3817359, 3817340, 3817341, 3817342, 3817343, 3817344, 3817345, 3817346, 3817347, 3817348, 3817349, 3817351\",\n\t\t[\"1016:785:814:1775\"] = \"3817314, 3817322, 3817323, 3817324, 3817325, 3817326, 3817327, 3817328, 0, 3817315, 3817316, 3817317, 3817318, 3817319, 3817320, 3817321\",\n\t\t[\"1158:1228:1936:397\"] = \"3817228, 3817239, 3817246, 3817247, 3817248, 3817249, 3817250, 3817251, 3817252, 3817229, 3817230, 3817231, 3817232, 3817233, 3817234, 3817235, 3817236, 3817237, 3817238, 3817240, 3817241, 3817242, 3817243, 3817244, 3817245\",\n\t\t[\"444:1283:1913:873\"] = \"3817262, 3817266, 3817267, 3817268, 3817269, 3817270, 3817271, 3817272, 3817273, 3817263, 3817264, 3817265\",\n\t\t[\"696:779:1766:0\"] = \"3817216, 3817220, 3817221, 3817222, 3817223, 3817224, 3817225, 3817226, 3817227, 3817217, 3817218, 3817219\",\n\t\t[\"742:686:1275:1523\"] = \"3817330, 3817331, 3817332, 3817333, 3817334, 3817335, 3817336, 3817337, 3817338\",\n\t\t[\"746:747:2499:1054\"] = \"3817253, 3817254, 3817255, 3817256, 3817257, 3817258, 3817259, 3817260, 3817261\",\n\t\t[\"840:553:553:1330\"] = \"3817302, 3817306, 3817307, 3817308, 3817309, 3817310, 3817311, 3817312, 3817313, 3817303, 3817304, 3817305\",\n\t\t[\"863:770:1284:902\"] = \"3817274, 3817282, 3817283, 3817284, 3817285, 3817286, 3817287, 3817288, 3817289, 3817275, 3817276, 3817277, 3817278, 3817279, 3817280, 3817281\",\n\t\t[\"976:734:656:695\"] = \"3817290, 3817294, 3817295, 3817296, 3817297, 3817298, 3817299, 3817300, 3817301, 3817291, 3817292, 3817293\",\n\t},\n\t[1530] = {\n\t\t[\"1050:870:890:47\"] = \"3817566, 3817577, 3817579, 3817580, 3817581, 3817582, 3817583, 3817584, 3817585, 3817567, 3817568, 3817569, 3817570, 3817571, 3817572, 3817573, 3817574, 3817575, 3817576, 3817578\",\n\t\t[\"1084:1084:2444:436\"] = \"3817510, 3817521, 3817529, 3817530, 3817531, 3817533, 3817535, 3817536, 3817537, 3817511, 3817512, 3817513, 3817514, 3817515, 3817516, 3817517, 3817518, 3817519, 3817520, 3817522, 3817524, 3817525, 3817526, 3817527, 3817528\",\n\t\t[\"1165:810:963:1719\"] = \"3817616, 3817627, 3817629, 3817630, 3817631, 3817632, 3817633, 3817634, 3817635, 3817617, 3817618, 3817619, 3817620, 3817621, 3817622, 3817623, 3817624, 3817625, 3817626, 3817628\",\n\t\t[\"1447:1179:653:680\"] = \"3817586, 3817597, 3817608, 3817610, 3817611, 3817612, 3817613, 3817614, 3817615, 3817587, 3817588, 3817589, 3817590, 3817591, 3817592, 3817593, 3817594, 3817595, 3817596, 3817598, 3817599, 3817600, 3817601, 3817602, 3817603, 3817604, 3817605, 3817606, 3817607, 3817609\",\n\t\t[\"848:1116:237:1426\"] = \"3817636, 3817647, 3817649, 3817650, 3817651, 3817652, 3817653, 3817654, 3817655, 3817637, 3817638, 3817639, 3817640, 3817641, 3817642, 3817643, 3817644, 3817645, 3817646, 3817648\",\n\t\t[\"959:1721:1631:40\"] = \"3817538, 3817549, 3817559, 3817560, 3817561, 3817562, 3817563, 3817564, 3817565, 3817539, 3817540, 3817541, 3817542, 3817543, 3817544, 3817545, 3817546, 3817547, 3817548, 3817550, 3817551, 3817552, 3817553, 3817554, 3817555, 3817556, 3817557, 3817558\",\n\t},\n\t[1532] = {\n\t\t[\"1048:440:1238:1099\"] = \"3819469, 3819471, 3819472, 3819473, 3819474, 3819475, 3819476, 3819477, 3819478, 3819470\",\n\t\t[\"1131:960:1605:57\"] = \"3819426, 3819440, 3819442, 3819443, 3819444, 3819445, 3819446, 3819447, 3819448, 3819427, 3819428, 3819429, 3819430, 3819431, 3819434, 3819436, 3819437, 3819438, 3819439, 3819441\",\n\t\t[\"839:1123:1484:1437\"] = \"3819479, 3819490, 3819492, 3819493, 3819494, 3819495, 3819496, 3819497, 3819498, 3819480, 3819481, 3819482, 3819483, 3819484, 3819485, 3819486, 3819487, 3819488, 3819489, 3819491\",\n\t\t[\"861:668:1943:914\"] = \"3819457, 3819461, 3819462, 3819463, 3819464, 3819465, 3819466, 3819467, 3819468, 3819458, 3819459, 3819460\",\n\t\t[\"951:400:1250:800\"] = \"3819449, 3819450, 3819451, 3819452, 3819453, 3819454, 3819455, 3819456\",\n\t},\n\t[1533] = {\n\t\t[\"565:1404:1748:591\"] = \"3817806, 3817816, 3817817, 3817818, 3817819, 3817820, 3817821, 3817822, 3817823, 3817807, 3817808, 3817809, 3817810, 3817811, 3817812, 3817813, 3817814, 3817815\",\n\t\t[\"677:1389:1198:595\"] = \"3817824, 3817834, 3817835, 3817836, 3817837, 3817838, 3817839, 3817840, 3817841, 3817825, 3817826, 3817827, 3817828, 3817829, 3817830, 3817831, 3817832, 3817833\",\n\t\t[\"792:1469:1817:173\"] = \"3817862, 3817873, 3817879, 3817880, 3817881, 3817882, 3817883, 3817884, 3817885, 3817863, 3817864, 3817865, 3817866, 3817867, 3817868, 3817869, 3817870, 3817871, 3817872, 3817874, 3817875, 3817876, 3817877, 3817878\",\n\t\t[\"802:1035:1336:1500\"] = \"3817842, 3817853, 3817855, 3817856, 3817857, 3817858, 3817859, 3817860, 3817861, 3817843, 3817844, 3817845, 3817846, 3817847, 3817848, 3817849, 3817850, 3817851, 3817852, 3817854\",\n\t},\n\t[1535] = {\n\t\t[\"1114:879:1161:1076\"] = \"3818458, 3818469, 3818471, 3818472, 3818473, 3818474, 3818475, 3818476, 3818477, 3818459, 3818460, 3818461, 3818462, 3818463, 3818464, 3818465, 3818466, 3818467, 3818468, 3818470\",\n\t\t[\"1290:756:833:1754\"] = \"3818490, 3818500, 3818501, 3818502, 3818503, 3818504, 3818505, 3818506, 3818507, 3818491, 3818492, 3818493, 3818494, 3818495, 3818496, 3818497, 3818498, 3818499\",\n\t\t[\"519:902:1306:384\"] = \"3818446, 3818450, 3818451, 3818452, 3818453, 3818454, 3818455, 3818456, 3818457, 3818447, 3818448, 3818449\",\n\t\t[\"688:1013:786:529\"] = \"3818434, 3818438, 3818439, 3818440, 3818441, 3818442, 3818443, 3818444, 3818445, 3818435, 3818436, 3818437\",\n\t\t[\"835:1344:1710:388\"] = \"3818410, 3818421, 3818427, 3818428, 3818429, 3818430, 3818431, 3818432, 3818433, 3818411, 3818412, 3818413, 3818414, 3818415, 3818416, 3818417, 3818418, 3818419, 3818420, 3818422, 3818423, 3818424, 3818425, 3818426\",\n\t\t[\"931:654:858:1427\"] = \"3818478, 3818482, 3818483, 3818484, 3818485, 3818486, 3818487, 3818488, 3818489, 3818479, 3818480, 3818481\",\n\t\t[\"999:1527:1955:22\"] = \"3818386, 3818397, 3818403, 3818404, 3818405, 3818406, 3818407, 3818408, 3818409, 3818387, 3818388, 3818389, 3818390, 3818391, 3818392, 3818393, 3818394, 3818395, 3818396, 3818398, 3818399, 3818400, 3818401, 3818402\",\n\t},\n\t[1539] = {\n\t\t[\"1520:1017:1483:1230\"] = \"3815339, 3815350, 3815356, 3815357, 3815358, 3815359, 3815360, 3815361, 3815362, 3815340, 3815341, 3815342, 3815343, 3815344, 3815345, 3815346, 3815347, 3815348, 3815349, 3815351, 3815352, 3815353, 3815354, 3815355\",\n\t\t[\"2447:1356:600:85\"] = \"3815255, 3815270, 3815281, 3815296, 3815307, 3815322, 3815324, 3815325, 3815326, 3815256, 3815261, 3815262, 3815263, 3815264, 3815265, 3815266, 3815267, 3815268, 3815269, 3815271, 3815272, 3815273, 3815274, 3815275, 3815276, 3815277, 3815278, 3815279, 3815280, 3815282, 3815283, 3815284, 3815285, 3815286, 3815287, 3815292, 3815293, 3815294, 3815295, 3815297, 3815298, 3815299, 3815300, 3815301, 3815302, 3815303, 3815304, 3815305, 3815306, 3815308, 3815309, 3815310, 3815311, 3815312, 3815313, 3815314, 3815315, 3815320, 3815321, 3815323\",\n\t\t[\"651:949:2373:1518\"] = \"3815363, 3815367, 3815368, 3815369, 3815370, 3815371, 3815372, 3815373, 3815374, 3815364, 3815365, 3815366\",\n\t\t[\"792:729:1413:1021\"] = \"3815327, 3815331, 3815332, 3815333, 3815334, 3815335, 3815336, 3815337, 3815338, 3815328, 3815329, 3815330\",\n\t},\n\t[1540] = {\n\t\t[\"1038:725:1140:184\"] = \"3815529, 3815536, 3815537, 3815538, 3815539, 3815540, 3815541, 3815542, 3815543, 3815530, 3815531, 3815532, 3815533, 3815534, 3815535\",\n\t\t[\"1134:710:1143:1198\"] = \"3815559, 3815566, 3815567, 3815568, 3815569, 3815570, 3815571, 3815572, 3815577, 3815560, 3815561, 3815562, 3815563, 3815564, 3815565\",\n\t\t[\"1135:615:1120:749\"] = \"3815544, 3815551, 3815552, 3815553, 3815554, 3815555, 3815556, 3815557, 3815558, 3815545, 3815546, 3815547, 3815548, 3815549, 3815550\",\n\t\t[\"823:808:1474:1747\"] = \"3815578, 3815586, 3815587, 3815588, 3815589, 3815590, 3815591, 3815592, 3815593, 3815579, 3815580, 3815581, 3815582, 3815583, 3815584, 3815585\",\n\t},\n\t[1549] = {\n\t\t[\"1079:1464:756:212\"] = \"3821078, 3821089, 3821100, 3821102, 3821103, 3821104, 3821105, 3821106, 3821107, 3821079, 3821080, 3821081, 3821082, 3821083, 3821084, 3821085, 3821086, 3821087, 3821088, 3821090, 3821091, 3821092, 3821093, 3821094, 3821095, 3821096, 3821097, 3821098, 3821099, 3821101\",\n\t\t[\"1094:978:1710:1545\"] = \"3821128, 3821139, 3821141, 3821142, 3821143, 3821144, 3821145, 3821146, 3821147, 3821129, 3821130, 3821131, 3821132, 3821133, 3821134, 3821135, 3821136, 3821137, 3821138, 3821140\",\n\t\t[\"1106:973:727:1534\"] = \"3821108, 3821119, 3821121, 3821122, 3821123, 3821124, 3821125, 3821126, 3821127, 3821109, 3821110, 3821111, 3821112, 3821113, 3821114, 3821115, 3821116, 3821117, 3821118, 3821120\",\n\t\t[\"1401:1434:1715:208\"] = \"3821148, 3821159, 3821170, 3821178, 3821179, 3821180, 3821181, 3821182, 3821183, 3821149, 3821150, 3821151, 3821152, 3821153, 3821154, 3821155, 3821156, 3821157, 3821158, 3821160, 3821161, 3821162, 3821163, 3821164, 3821165, 3821166, 3821167, 3821168, 3821169, 3821171, 3821172, 3821173, 3821174, 3821175, 3821176, 3821177\",\n\t},\n\t[1550] = {\n\t\t[\"1562:2440:61:90\"] = \"3821334, 3821345, 3821356, 3821367, 3821378, 3821389, 3821400, 3821402, 3821403, 3821335, 3821336, 3821337, 3821338, 3821339, 3821340, 3821341, 3821342, 3821343, 3821344, 3821346, 3821347, 3821348, 3821349, 3821350, 3821351, 3821352, 3821353, 3821354, 3821355, 3821357, 3821358, 3821359, 3821360, 3821361, 3821362, 3821363, 3821364, 3821365, 3821366, 3821368, 3821369, 3821370, 3821371, 3821372, 3821373, 3821374, 3821375, 3821376, 3821377, 3821379, 3821380, 3821381, 3821382, 3821383, 3821384, 3821385, 3821386, 3821387, 3821388, 3821390, 3821391, 3821392, 3821393, 3821394, 3821395, 3821396, 3821397, 3821398, 3821399, 3821401\",\n\t\t[\"1660:2374:2076:111\"] = \"3821434, 3821451, 3821463, 3821475, 3821486, 3821498, 3821509, 3821511, 3821512, 3821435, 3821438, 3821440, 3821441, 3821442, 3821445, 3821447, 3821448, 3821449, 3821450, 3821452, 3821453, 3821454, 3821455, 3821456, 3821457, 3821459, 3821460, 3821461, 3821462, 3821464, 3821465, 3821466, 3821467, 3821468, 3821470, 3821471, 3821472, 3821473, 3821474, 3821476, 3821477, 3821478, 3821479, 3821480, 3821481, 3821482, 3821483, 3821484, 3821485, 3821487, 3821489, 3821490, 3821491, 3821492, 3821493, 3821494, 3821495, 3821496, 3821497, 3821499, 3821500, 3821501, 3821502, 3821503, 3821504, 3821505, 3821506, 3821507, 3821508, 3821510\",\n\t\t[\"725:2425:1478:102\"] = \"3821404, 3821415, 3821426, 3821428, 3821429, 3821430, 3821431, 3821432, 3821433, 3821405, 3821406, 3821407, 3821408, 3821409, 3821410, 3821411, 3821412, 3821413, 3821414, 3821416, 3821417, 3821418, 3821419, 3821420, 3821421, 3821422, 3821423, 3821424, 3821425, 3821427\",\n\t},\n\t[1552] = {\n\t\t[\"1117:1052:2055:1290\"] = \"3822531, 3822552, 3822565, 3822567, 3822568, 3822570, 3822572, 3822574, 3822576, 3822533, 3822535, 3822537, 3822539, 3822541, 3822542, 3822544, 3822546, 3822548, 3822550, 3822554, 3822556, 3822558, 3822559, 3822561, 3822563\",\n\t\t[\"1290:1210:892:1302\"] = \"3822453, 3822482, 3822509, 3822513, 3822516, 3822519, 3822522, 3822525, 3822528, 3822456, 3822459, 3822461, 3822463, 3822466, 3822469, 3822472, 3822475, 3822478, 3822480, 3822485, 3822487, 3822489, 3822492, 3822494, 3822496, 3822498, 3822500, 3822503, 3822506, 3822512\",\n\t\t[\"1592:1281:415:134\"] = \"3822348, 3822374, 3822402, 3822431, 3822441, 3822443, 3822445, 3822448, 3822451, 3822350, 3822352, 3822354, 3822357, 3822359, 3822362, 3822363, 3822366, 3822369, 3822371, 3822377, 3822379, 3822382, 3822385, 3822387, 3822390, 3822392, 3822395, 3822397, 3822399, 3822404, 3822407, 3822409, 3822412, 3822415, 3822418, 3822421, 3822424, 3822426, 3822428, 3822434, 3822437, 3822440\",\n\t\t[\"1811:1114:1912:287\"] = \"3822578, 3822598, 3822618, 3822638, 3822642, 3822643, 3822645, 3822647, 3822649, 3822579, 3822581, 3822583, 3822585, 3822587, 3822589, 3822591, 3822592, 3822594, 3822596, 3822600, 3822602, 3822603, 3822605, 3822607, 3822609, 3822611, 3822613, 3822614, 3822616, 3822620, 3822622, 3822623, 3822625, 3822627, 3822629, 3822631, 3822633, 3822634, 3822636, 3822640\",\n\t},\n\t[1554] = {\n\t\t[\"1060:1166:2122:1027\"] = \"3824052, 3824072, 3824084, 3824086, 3824088, 3824089, 3824091, 3824093, 3824095, 3824054, 3824056, 3824058, 3824059, 3824061, 3824063, 3824065, 3824066, 3824068, 3824070, 3824074, 3824075, 3824077, 3824079, 3824081, 3824082\",\n\t\t[\"1166:1131:2059:0\"] = \"3824139, 3824159, 3824171, 3824173, 3824174, 3824176, 3824178, 3824180, 3824181, 3824141, 3824143, 3824144, 3824146, 3824148, 3824150, 3824152, 3824153, 3824155, 3824157, 3824160, 3824162, 3824164, 3824166, 3824168, 3824169\",\n\t\t[\"775:2043:744:116\"] = \"3823960, 3823980, 3823999, 3824006, 3824008, 3824010, 3824011, 3824013, 3824015, 3823962, 3823964, 3823966, 3823967, 3823969, 3823971, 3823973, 3823974, 3823976, 3823978, 3823981, 3823983, 3823985, 3823987, 3823988, 3823990, 3823992, 3823994, 3823995, 3823997, 3824001, 3824002, 3824004\",\n\t\t[\"906:1314:1610:453\"] = \"3824096, 3824116, 3824127, 3824128, 3824130, 3824132, 3824134, 3824135, 3824137, 3824098, 3824100, 3824102, 3824103, 3824105, 3824107, 3824109, 3824110, 3824112, 3824114, 3824118, 3824119, 3824121, 3824123, 3824125\",\n\t\t[\"977:1180:1266:1179\"] = \"3824017, 3824036, 3824040, 3824042, 3824043, 3824045, 3824047, 3824049, 3824050, 3824018, 3824020, 3824022, 3824024, 3824025, 3824027, 3824029, 3824031, 3824033, 3824034, 3824038\",\n\t},\n\t[1555] = {\n\t\t[\"1350:1420:1160:120\"] = \"3824750, 3824770, 3824790, 3824804, 3824806, 3824808, 3824809, 3824811, 3824813, 3824752, 3824754, 3824756, 3824757, 3824759, 3824761, 3824763, 3824764, 3824766, 3824768, 3824772, 3824774, 3824776, 3824777, 3824779, 3824781, 3824783, 3824785, 3824786, 3824788, 3824792, 3824794, 3824795, 3824797, 3824799, 3824801, 3824802\",\n\t\t[\"1381:1602:1849:696\"] = \"3824815, 3824834, 3824854, 3824873, 3824880, 3824882, 3824884, 3824885, 3824887, 3824816, 3824818, 3824820, 3824822, 3824824, 3824825, 3824827, 3824829, 3824831, 3824832, 3824836, 3824838, 3824840, 3824841, 3824843, 3824845, 3824847, 3824848, 3824850, 3824852, 3824855, 3824857, 3824859, 3824861, 3824862, 3824864, 3824866, 3824868, 3824869, 3824871, 3824875, 3824877, 3824878\",\n\t\t[\"994:1285:724:555\"] = \"3824707, 3824727, 3824737, 3824739, 3824741, 3824743, 3824745, 3824746, 3824748, 3824709, 3824710, 3824712, 3824714, 3824716, 3824718, 3824720, 3824721, 3824723, 3824725, 3824729, 3824730, 3824732, 3824734, 3824736\",\n\t},\n\t[1556] = {\n\t\t[\"1108:919:1745:1408\"] = \"3825207, 3825227, 3825230, 3825232, 3825234, 3825236, 3825237, 3825239, 3825241, 3825209, 3825210, 3825212, 3825214, 3825216, 3825218, 3825220, 3825221, 3825223, 3825225, 3825228\",\n\t\t[\"1132:1401:719:1038\"] = \"3825153, 3825173, 3825192, 3825196, 3825198, 3825200, 3825201, 3825203, 3825205, 3825155, 3825157, 3825158, 3825160, 3825162, 3825164, 3825166, 3825167, 3825169, 3825171, 3825175, 3825176, 3825178, 3825180, 3825182, 3825184, 3825185, 3825187, 3825189, 3825191, 3825194\",\n\t\t[\"1338:1490:1727:18\"] = \"3825243, 3825263, 3825282, 3825296, 3825298, 3825300, 3825302, 3825304, 3825306, 3825245, 3825246, 3825248, 3825250, 3825252, 3825254, 3825255, 3825257, 3825259, 3825261, 3825264, 3825266, 3825268, 3825270, 3825271, 3825273, 3825275, 3825277, 3825279, 3825280, 3825284, 3825286, 3825288, 3825289, 3825291, 3825293, 3825295\",\n\t},\n\t[1557] = {\n\t\t[\"1807:872:1286:951\"] = \"3825564, 3825579, 3825594, 3825600, 3825601, 3825603, 3825604, 3825605, 3825606, 3825566, 3825567, 3825568, 3825570, 3825571, 3825573, 3825574, 3825575, 3825576, 3825578, 3825580, 3825582, 3825583, 3825585, 3825586, 3825587, 3825589, 3825590, 3825592, 3825593, 3825596, 3825597, 3825599\",\n\t\t[\"938:1010:1680:49\"] = \"3825544, 3825553, 3825554, 3825556, 3825557, 3825559, 3825560, 3825561, 3825563, 3825545, 3825546, 3825547, 3825548, 3825549, 3825550, 3825552\",\n\t\t[\"945:1059:828:56\"] = \"3825524, 3825535, 3825537, 3825538, 3825539, 3825540, 3825541, 3825542, 3825543, 3825525, 3825526, 3825527, 3825528, 3825529, 3825530, 3825531, 3825532, 3825533, 3825534, 3825536\",\n\t\t[\"971:827:1559:1717\"] = \"3825607, 3825618, 3825619, 3825621, 3825622, 3825624, 3825625, 3825626, 3825627, 3825609, 3825610, 3825612, 3825613, 3825614, 3825615, 3825617\",\n\t},\n\t[1571] = {\n\t\t[\"1005:825:2011:180\"] = \"3828534, 3828542, 3828543, 3828544, 3828545, 3828546, 3828547, 3828548, 3828549, 3828535, 3828536, 3828537, 3828538, 3828539, 3828540, 3828541\",\n\t\t[\"1014:1487:501:486\"] = \"3828466, 3828477, 3828483, 3828484, 3828485, 3828486, 3828487, 3828488, 3828489, 3828467, 3828468, 3828469, 3828470, 3828471, 3828472, 3828473, 3828474, 3828475, 3828476, 3828478, 3828479, 3828480, 3828481, 3828482\",\n\t\t[\"1323:670:2000:885\"] = \"3828550, 3828560, 3828561, 3828562, 3828563, 3828564, 3828565, 3828566, 3828567, 3828551, 3828552, 3828553, 3828554, 3828555, 3828556, 3828557, 3828558, 3828559\",\n\t\t[\"810:682:1319:877\"] = \"3828490, 3828494, 3828495, 3828496, 3828497, 3828498, 3828499, 3828500, 3828501, 3828491, 3828492, 3828493\",\n\t\t[\"877:812:1227:184\"] = \"3828518, 3828526, 3828527, 3828528, 3828529, 3828530, 3828531, 3828532, 3828533, 3828519, 3828520, 3828521, 3828522, 3828523, 3828524, 3828525\",\n\t\t[\"964:948:1144:1431\"] = \"3828502, 3828510, 3828511, 3828512, 3828513, 3828514, 3828515, 3828516, 3828517, 3828503, 3828504, 3828505, 3828506, 3828507, 3828508, 3828509\",\n\t\t[\"979:954:2013:1428\"] = \"3828568, 3828576, 3828577, 3828578, 3828579, 3828580, 3828581, 3828582, 3828583, 3828569, 3828570, 3828571, 3828572, 3828573, 3828574, 3828575\",\n\t},\n\t[1572] = {\n\t\t[\"1007:1460:467:612\"] = \"3828734, 3828745, 3828751, 3828752, 3828753, 3828754, 3828755, 3828756, 3828757, 3828735, 3828736, 3828737, 3828738, 3828739, 3828740, 3828741, 3828742, 3828743, 3828744, 3828746, 3828747, 3828748, 3828749, 3828750\",\n\t\t[\"1586:1924:1920:448\"] = \"3828790, 3828801, 3828812, 3828823, 3828834, 3828842, 3828843, 3828844, 3828845, 3828791, 3828792, 3828793, 3828794, 3828795, 3828796, 3828797, 3828798, 3828799, 3828800, 3828802, 3828803, 3828804, 3828805, 3828806, 3828807, 3828808, 3828809, 3828810, 3828811, 3828813, 3828814, 3828815, 3828816, 3828817, 3828818, 3828819, 3828820, 3828821, 3828822, 3828824, 3828825, 3828826, 3828827, 3828828, 3828829, 3828830, 3828831, 3828832, 3828833, 3828835, 3828836, 3828837, 3828838, 3828839, 3828840, 3828841\",\n\t\t[\"833:1871:1274:228\"] = \"3828758, 3828769, 3828780, 3828784, 3828785, 3828786, 3828787, 3828788, 3828789, 3828759, 3828760, 3828761, 3828762, 3828763, 3828764, 3828765, 3828766, 3828767, 3828768, 3828770, 3828771, 3828772, 3828773, 3828774, 3828775, 3828776, 3828777, 3828778, 3828779, 3828781, 3828782, 3828783\",\n\t},\n\t[1578] = {\n\t\t[\"1297:1026:1998:1191\"] = \"3830310, 3830321, 3830332, 3830334, 3830335, 3830336, 3830337, 3830338, 3830339, 3830311, 3830312, 3830313, 3830314, 3830315, 3830316, 3830317, 3830318, 3830319, 3830320, 3830322, 3830323, 3830324, 3830325, 3830326, 3830327, 3830328, 3830329, 3830330, 3830331, 3830333\",\n\t\t[\"1415:1037:251:1197\"] = \"3830262, 3830273, 3830284, 3830286, 3830287, 3830288, 3830289, 3830290, 3830291, 3830263, 3830264, 3830265, 3830266, 3830267, 3830268, 3830269, 3830270, 3830271, 3830272, 3830274, 3830275, 3830276, 3830277, 3830278, 3830279, 3830280, 3830281, 3830282, 3830283, 3830285\",\n\t\t[\"2454:1432:750:12\"] = \"3830340, 3830351, 3830362, 3830373, 3830384, 3830395, 3830397, 3830398, 3830399, 3830341, 3830342, 3830343, 3830344, 3830345, 3830346, 3830347, 3830348, 3830349, 3830350, 3830352, 3830353, 3830354, 3830355, 3830356, 3830357, 3830358, 3830359, 3830360, 3830361, 3830363, 3830364, 3830365, 3830366, 3830367, 3830368, 3830369, 3830370, 3830371, 3830372, 3830374, 3830375, 3830376, 3830377, 3830378, 3830379, 3830380, 3830381, 3830382, 3830383, 3830385, 3830386, 3830387, 3830388, 3830389, 3830390, 3830391, 3830392, 3830393, 3830394, 3830396\",\n\t\t[\"623:1489:1521:906\"] = \"3830292, 3830302, 3830303, 3830304, 3830305, 3830306, 3830307, 3830308, 3830309, 3830293, 3830294, 3830295, 3830296, 3830297, 3830298, 3830299, 3830300, 3830301\",\n\t},\n\t[1579] = {\n\t\t[\"754:5050:1547:231\"] = \"3830574, 3830585, 3830594, 3830595, 3830596, 3830597, 3830598, 3830599, 3830600, 3830575, 3830576, 3830577, 3830578, 3830579, 3830580, 3830581, 3830582, 3830583, 3830584, 3830586, 3830587, 3830588, 3830589, 3830590, 3830591, 3830592, 3830593, 0\",\n\t\t[\"765:1894:959:406\"] = \"3830550, 3830561, 3830567, 3830568, 3830569, 3830570, 3830571, 3830572, 3830573, 3830551, 3830552, 3830553, 3830554, 3830555, 3830556, 3830557, 3830558, 3830559, 3830560, 3830562, 3830563, 3830564, 3830565, 3830566\",\n\t\t[\"786:1887:2142:396\"] = \"3830601, 3830612, 3830623, 3830627, 3830628, 3830629, 3830630, 3830631, 3830632, 3830602, 3830603, 3830604, 3830605, 3830606, 3830607, 3830608, 3830609, 3830610, 3830611, 3830613, 3830614, 3830615, 3830616, 3830617, 3830618, 3830619, 3830620, 3830621, 3830622, 3830624, 3830625, 3830626\",\n\t},\n\t[1580] = {\n\t\t[\"1156:465:602:1062\"] = \"3830798, 3830800, 3830801, 3830802, 3830803, 3830804, 3830805, 3830806, 3830807, 3830799\",\n\t\t[\"1225:708:489:510\"] = \"3830783, 3830790, 3830791, 3830792, 3830793, 3830794, 3830795, 3830796, 3830797, 3830784, 3830785, 3830786, 3830787, 3830788, 3830789\",\n\t\t[\"1259:509:2156:653\"] = \"3830826, 3830828, 3830829, 3830830, 3830831, 3830832, 3830833, 3830834, 3830835, 3830827\",\n\t\t[\"1266:941:2151:1041\"] = \"3830836, 3830847, 3830849, 3830850, 3830851, 3830852, 3830853, 3830854, 3830855, 3830837, 3830838, 3830839, 3830840, 3830841, 3830842, 3830843, 3830844, 3830845, 3830846, 3830848\",\n\t\t[\"727:1420:1579:396\"] = \"3830808, 3830818, 3830819, 3830820, 3830821, 3830822, 3830823, 3830824, 3830825, 3830809, 3830810, 3830811, 3830812, 3830813, 3830814, 3830815, 3830816, 3830817\",\n\t},\n\t[1582] = {\n\t\t[\"1353:1415:537:717\"] = \"3831310, 3831321, 3831332, 3831340, 3831341, 3831342, 3831343, 3831344, 3831345, 3831311, 3831312, 3831313, 3831314, 3831315, 3831316, 3831317, 3831318, 3831319, 3831320, 3831322, 3831323, 3831324, 3831325, 3831326, 3831327, 3831328, 3831329, 3831330, 3831331, 3831333, 3831334, 3831335, 3831336, 3831337, 3831338, 3831339\",\n\t\t[\"618:2391:1775:87\"] = \"3831346, 3831357, 3831368, 3831370, 3831371, 3831372, 3831373, 3831374, 3831375, 3831347, 3831348, 3831349, 3831350, 3831351, 3831352, 3831353, 3831354, 3831355, 3831356, 3831358, 3831359, 3831360, 3831361, 3831362, 3831363, 3831364, 3831365, 3831366, 3831367, 3831369\",\n\t\t[\"949:1036:2246:872\"] = \"3831376, 3831387, 3831389, 3831390, 3831391, 3831392, 3831393, 3831394, 3831395, 3831377, 3831378, 3831379, 3831380, 3831381, 3831382, 3831383, 3831384, 3831385, 3831386, 3831388\",\n\t},\n\t[1585] = {\n\t\t[\"1028:1024:1472:1536\"] = \"3816328, 3816339, 3816341, 3816342, 3816343, 3816344, 3816345, 3816349, 3816355, 3816329, 3816330, 3816331, 3816332, 3816333, 3816334, 3816335, 3816336, 3816337, 3816338, 3816340\",\n\t\t[\"1080:487:1809:585\"] = \"3816300, 3816302, 3816303, 3816304, 3816305, 3816306, 3816307, 3816308, 3816309, 3816301\",\n\t\t[\"1434:734:1483:920\"] = \"3816310, 3816320, 3816321, 3816322, 3816323, 3816324, 3816325, 3816326, 3816327, 3816311, 3816312, 3816313, 3816314, 3816315, 3816316, 3816317, 3816318, 3816319\",\n\t\t[\"535:705:1779:0\"] = \"3816259, 3816260, 3816261, 3816262, 3816263, 3816264, 3816265, 3816266, 3816267\",\n\t\t[\"940:647:970:158\"] = \"3816268, 3816272, 3816273, 3816274, 3816275, 3816276, 3816277, 3816278, 3816279, 3816269, 3816270, 3816271\",\n\t\t[\"983:1029:960:617\"] = \"3816280, 3816291, 3816293, 3816294, 3816295, 3816296, 3816297, 3816298, 3816299, 3816281, 3816282, 3816283, 3816284, 3816285, 3816286, 3816287, 3816288, 3816289, 3816290, 3816292\",\n\t},\n\t[1586] = {\n\t\t[\"1044:733:1741:1635\"] = \"3819049, 3819056, 3819057, 3819058, 3819059, 3819060, 3819061, 3819062, 3819063, 3819050, 3819051, 3819052, 3819053, 3819054, 3819055\",\n\t\t[\"1370:940:1943:26\"] = \"3818973, 3818984, 3818990, 3818991, 3818992, 3818993, 3818994, 3818995, 3818996, 3818974, 3818975, 3818976, 3818977, 3818978, 3818979, 3818980, 3818981, 3818982, 3818983, 3818985, 3818986, 3818987, 3818988, 3818989\",\n\t\t[\"1439:1606:483:810\"] = \"3819064, 3819075, 3819086, 3819097, 3819101, 3819102, 3819103, 3819104, 3819105, 3819065, 3819066, 3819067, 3819068, 3819069, 3819070, 3819071, 3819072, 3819073, 3819074, 3819076, 3819077, 3819078, 3819079, 3819080, 3819081, 3819082, 3819083, 3819084, 3819085, 3819087, 3819088, 3819089, 3819090, 3819091, 3819092, 3819093, 3819094, 3819095, 3819096, 3819098, 3819099, 3819100\",\n\t\t[\"1873:1221:1807:812\"] = \"3818998, 3819011, 3819022, 3819033, 3819035, 3819036, 3819037, 3819038, 3819039, 3819001, 3819002, 3819003, 3819004, 3819005, 3819006, 3819007, 3819008, 3819009, 3819010, 3819012, 3819013, 3819014, 3819015, 3819016, 3819017, 3819018, 3819019, 3819020, 3819021, 3819023, 3819024, 3819025, 3819026, 3819027, 3819028, 3819029, 3819030, 3819031, 3819032, 3819034\",\n\t\t[\"603:579:1819:1159\"] = \"3819040, 3819041, 3819042, 3819043, 3819044, 3819045, 3819046, 3819047, 3819048\",\n\t\t[\"842:1244:400:1273\"] = \"3819106, 3819117, 3819119, 3819120, 3819121, 3819122, 3819123, 3819124, 3819125, 3819107, 3819108, 3819109, 3819110, 3819111, 3819112, 3819113, 3819114, 3819115, 3819116, 3819118\",\n\t},\n\t[1587] = {\n\t\t[\"1208:1747:499:289\"] = \"3821845, 3821865, 3821885, 3821900, 3821902, 3821904, 3821905, 3821907, 3821909, 3821847, 3821849, 3821851, 3821852, 3821854, 3821856, 3821858, 3821860, 3821862, 3821863, 3821867, 3821869, 3821871, 3821873, 3821874, 3821876, 3821878, 3821880, 3821882, 3821883, 3821889, 3821891, 3821893, 3821895, 3821896, 3821898\",\n\t\t[\"1442:1755:2130:293\"] = \"3821944, 3821964, 3821984, 3822004, 3822011, 3822013, 3822015, 3822017, 3822019, 3821946, 3821947, 3821949, 3821951, 3821953, 3821955, 3821957, 3821958, 3821960, 3821962, 3821966, 3821967, 3821969, 3821971, 3821973, 3821975, 3821976, 3821978, 3821980, 3821982, 3821986, 3821988, 3821989, 3821991, 3821993, 3821995, 3821997, 3821999, 3822001, 3822002, 3822006, 3822008, 3822010\",\n\t\t[\"647:1310:1594:934\"] = \"3821911, 3821929, 3821931, 3821933, 3821935, 3821936, 3821938, 3821940, 3821942, 3821913, 3821914, 3821916, 3821918, 3821920, 3821922, 3821924, 3821925, 3821927\",\n\t\t[\"669:597:1587:449\"] = \"3822021, 3822022, 3822024, 3822026, 3822028, 3822030, 3822032, 3822034, 3822035\",\n\t},\n\t[1590] = {\n\t\t[\"1388:1297:292:102\"] = \"3814600, 3814611, 3814622, 3814630, 3814631, 3814632, 3814633, 3814634, 3814635, 3814601, 3814602, 3814603, 3814604, 3814605, 3814606, 3814607, 3814608, 3814609, 3814610, 3814612, 3814613, 3814614, 3814615, 3814616, 3814617, 3814618, 3814619, 3814620, 3814621, 3814623, 3814624, 3814625, 3814626, 3814627, 3814628, 3814629\",\n\t\t[\"1408:1211:288:1305\"] = \"3814644, 3814655, 3814666, 3814668, 3814669, 3814670, 3814671, 3814672, 3814673, 3814645, 3814646, 3814647, 3814648, 3814649, 3814650, 3814651, 3814652, 3814653, 3814654, 3814656, 3814657, 3814658, 3814659, 3814660, 3814661, 3814662, 3814663, 3814664, 3814665, 3814667\",\n\t\t[\"1417:1229:2032:1306\"] = \"3814713, 3814724, 3814735, 3814737, 3814738, 3814739, 3814740, 3814741, 3814742, 3814714, 3814715, 3814716, 3814717, 3814718, 3814719, 3814720, 3814721, 3814722, 3814723, 3814725, 3814726, 3814727, 3814728, 3814729, 3814730, 3814731, 3814732, 3814733, 3814734, 3814736\",\n\t\t[\"1432:1315:2024:85\"] = \"3814751, 3814762, 3814773, 3814781, 3814782, 3814783, 3814784, 3814785, 3814786, 3814752, 3814753, 3814754, 3814755, 3814756, 3814757, 3814758, 3814759, 3814760, 3814761, 3814763, 3814764, 3814765, 3814766, 3814767, 3814768, 3814769, 3814770, 3814771, 3814772, 3814774, 3814775, 3814776, 3814777, 3814778, 3814779, 3814780\",\n\t\t[\"559:1052:1589:1508\"] = \"3814698, 3814705, 3814706, 3814707, 3814708, 3814709, 3814710, 3814711, 3814712, 3814699, 3814700, 3814701, 3814702, 3814703, 3814704\",\n\t\t[\"571:539:1574:1080\"] = \"3814689, 3814690, 3814691, 3814692, 3814693, 3814694, 3814695, 3814696, 3814697\",\n\t\t[\"673:1186:1515:0\"] = \"3814674, 3814681, 3814682, 3814683, 3814684, 3814685, 3814686, 3814687, 3814688, 3814675, 3814676, 3814677, 3814678, 3814679, 3814680\",\n\t\t[\"954:507:2005:1105\"] = \"3814743, 3814744, 3814745, 3814746, 3814747, 3814748, 3814749, 3814750\",\n\t\t[\"970:475:741:1119\"] = \"3814636, 3814637, 3814638, 3814639, 3814640, 3814641, 3814642, 3814643\",\n\t},\n\t[1591] = {\n\t\t[\"1384:1253:1106:1279\"] = \"3823023, 3823042, 3823064, 3823068, 3823071, 3823074, 3823077, 3823078, 3823081, 3823025, 3823026, 3823028, 3823030, 3823032, 3823033, 3823035, 3823037, 3823039, 3823040, 3823044, 3823046, 3823048, 3823049, 3823051, 3823053, 3823055, 3823056, 3823059, 3823061, 3823066\",\n\t\t[\"854:1010:2003:375\"] = \"3822995, 3823009, 3823011, 3823012, 3823014, 3823016, 3823017, 3823019, 3823021, 3822997, 3822998, 3823000, 3823002, 3823004, 3823005, 3823007\",\n\t\t[\"876:1317:739:152\"] = \"3822911, 3822930, 3822941, 3822943, 3822944, 3822946, 3822948, 3822950, 3822951, 3822913, 3822915, 3822916, 3822918, 3822920, 3822922, 3822923, 3822925, 3822927, 3822929, 3822932, 3822934, 3822936, 3822937, 3822939\",\n\t\t[\"902:1372:1496:0\"] = \"3822953, 3822972, 3822983, 3822984, 3822986, 3822988, 3822990, 3822991, 3822993, 3822955, 3822957, 3822958, 3822960, 3822962, 3822964, 3822965, 3822967, 3822969, 3822971, 3822974, 3822976, 3822978, 3822979, 3822981\",\n\t},\n\t[1592] = {\n\t\t[\"1226:1196:1303:1301\"] = \"3826854, 3826865, 3826873, 3826874, 3826875, 3826876, 3826877, 3826878, 3826879, 3826855, 3826856, 3826857, 3826858, 3826859, 3826860, 3826861, 3826862, 3826863, 3826864, 3826866, 3826945, 3826947, 3826870, 3826871, 3826872\",\n\t\t[\"3006:1749:408:22\"] = \"3826880, 3826891, 3826901, 3826912, 3826923, 3826934, 3826946, 3826958, 3826964, 3826881, 3826882, 3826883, 3826884, 3826885, 3826886, 3826887, 3826888, 3826889, 3826890, 3826892, 3826893, 3826894, 3826976, 3826895, 3826896, 3826897, 3826898, 3826899, 3826900, 3826902, 3826903, 3826904, 3826905, 3826906, 3826907, 3826908, 3826909, 3826910, 3826911, 3826913, 3826914, 3826915, 3826916, 3826917, 3826918, 3826919, 3826920, 3826921, 3826922, 3826924, 3826925, 3826926, 3826927, 3826928, 3826929, 3826930, 3826931, 3826932, 3826933, 3826935, 3826936, 3826937, 3826938, 3826939, 3826940, 3826941, 3826942, 3826943, 3826944, 3826948, 3826949, 3826950, 3826951, 3826952, 3826953, 3826954, 3826955, 3826956, 3826957, 3826959, 3826960, 3826961, 3826962, 3826963\",\n\t},\n\t[1600] = {\n\t\t[\"1022:918:1693:66\"] = \"3815964, 3815972, 3815973, 3815974, 3815975, 3815976, 3815977, 3815978, 3815979, 3815965, 3815966, 3815967, 3815968, 3815969, 3815970, 3815971\",\n\t\t[\"1064:818:1982:1742\"] = \"3816013, 3816024, 3816026, 3816027, 3816028, 3816029, 3816030, 3816031, 3816032, 3816014, 3816015, 3816016, 3816017, 3816018, 3816019, 3816020, 3816021, 3816022, 3816023, 3816025\",\n\t\t[\"1539:723:577:1835\"] = \"3815992, 3816003, 3816006, 3816007, 3816008, 3816009, 3816010, 3816011, 3816012, 3815993, 3815994, 3815995, 3815996, 3815997, 3815998, 3815999, 3816000, 3816001, 3816002, 3816004, 3816005\",\n\t\t[\"1875:1551:1167:485\"] = \"3816033, 3816044, 3816055, 3816066, 3816077, 3816085, 3816086, 3816091, 3816092, 3816034, 3816035, 3816036, 3816037, 3816038, 3816039, 3816040, 3816041, 3816042, 3816043, 3816045, 3816046, 3816047, 3816048, 3816049, 3816050, 3816051, 3816052, 3816053, 3816054, 3816056, 3816057, 3816058, 3816059, 3816060, 3816061, 3816062, 3816063, 3816064, 3816065, 3816067, 3816068, 3816069, 3816070, 3816071, 3816072, 3816073, 3816074, 3816075, 3816076, 3816078, 3816079, 3816080, 3816081, 3816082, 3816083, 3816084\",\n\t\t[\"636:1035:1207:9\"] = \"3815949, 3815956, 3815957, 3815958, 3815959, 3815960, 3815961, 3815962, 3815963, 3815950, 3815951, 3815952, 3815953, 3815954, 3815955\",\n\t\t[\"665:937:594:1017\"] = \"3815980, 3815984, 3815985, 3815986, 3815987, 3815988, 3815989, 3815990, 3815991, 3815981, 3815982, 3815983\",\n\t\t[\"699:1107:677:56\"] = \"3815926, 3815933, 3815934, 3815935, 3815936, 3815945, 3815946, 3815947, 3815948, 3815927, 3815928, 3815929, 3815930, 3815931, 3815932\",\n\t},\n\t[1601] = {\n\t\t[\"1480:978:1247:1460\"] = \"3829896, 3829907, 3829913, 3829914, 3829915, 3829916, 3829917, 3829918, 3829919, 3829897, 3829898, 3829899, 3829900, 3829901, 3829902, 3829903, 3829904, 3829905, 3829906, 3829908, 3829909, 3829910, 3829911, 3829912\",\n\t\t[\"1664:1327:1104:231\"] = \"3829920, 3829931, 3829942, 3829953, 3829957, 3829958, 3829959, 3829960, 3829961, 3829921, 3829922, 3829923, 3829924, 3829925, 3829926, 3829927, 3829928, 3829929, 3829930, 3829932, 3829933, 3829934, 3829935, 3829936, 3829937, 3829938, 3829939, 3829940, 3829941, 3829943, 3829944, 3829945, 3829946, 3829947, 3829948, 3829949, 3829950, 3829951, 3829952, 3829954, 3829955, 3829956\",\n\t},\n\t[1693] = {\n\t\t[\"1078:824:772:598\"] = \"4178966, 4178967, 4178968, 4178969, 4178970, 4178971, 4178972, 4178973, 4178974, 4178975, 4178976, 4178977, 4178978, 4178979, 4178980, 4178981, 4178982, 4178983, 4178984, 4178985\",\n\t\t[\"954:1076:262:1423\"] = \"4178902, 4178903, 4178904, 4178905, 4178906, 4178907, 4178908, 4178909, 4178910, 4178911, 4178912, 4178913, 4178914, 4178915, 4178916, 4178917, 4178918, 4178919, 4178920, 4178921\",\n\t\t[\"1053:934:49:918\"] = \"4178986, 4178987, 4178988, 4178989, 4178990, 4178991, 4178992, 4178993, 4178994, 4178995, 4178996, 4178997, 4178998, 4178999, 4179000, 4179001, 4179002, 4179003, 4179004, 4179005\",\n\t\t[\"1488:1946:1797:0\"] = \"4178854, 4178855, 4178856, 4178857, 4178858, 4178859, 4178860, 4178861, 4178862, 4178863, 4178864, 4178865, 4178866, 4178867, 4178868, 4178869, 4178870, 4178871, 4178872, 4178873, 4178874, 4178875, 4178876, 4178877, 4178878, 4178879, 4178880, 4178881, 4178882, 4178883, 4178884, 4178885, 4178886, 4178887, 4178888, 4178889, 4178890, 4178891, 4178892, 4178893, 4178894, 4178895, 4178896, 4178897, 4178898, 4178899, 4178900, 4178901\",\n\t\t[\"1504:929:1171:0\"] = \"4179055, 4179056, 4179057, 4179058, 4179059, 4179060, 4179061, 4179062, 4179063, 4179064, 4179065, 4179066, 4179067, 4179068, 4179069, 4179070, 4179071, 4179072, 4179073, 4179074, 4179075, 4179076, 4179077, 4179078\",\n\t\t[\"928:729:1404:1831\"] = \"4178826, 4178827, 4178828, 4178829, 4178830, 4178831, 4178832, 4178833, 4178834, 4178835, 4178836, 4178837\",\n\t\t[\"928:1359:808:1201\"] = \"4178922, 4178923, 4178924, 4178925, 4178926, 4178927, 4178928, 4178929, 4178930, 4178931, 4178932, 4178933, 4178934, 4178935, 4178936, 4178937, 4178938, 4178939, 4178940, 4178941, 4178942, 4178943, 4178944, 4178945\",\n\t\t[\"1232:1236:0:342\"] = \"4179006, 4179007, 4179008, 4179009, 4179010, 4179011, 4179012, 4179013, 4179014, 4179015, 4179016, 4179017, 4179018, 4179019, 4179020, 4179021, 4179022, 4179023, 4179024, 4179025, 4179026, 4179027, 4179028, 4179029, 4179030\",\n\t\t[\"1408:988:1856:1572\"] = \"4178802, 4178803, 4178804, 4178805, 4178806, 4178807, 4178808, 4178809, 4178810, 4178811, 4178812, 4178813, 4178814, 4178815, 4178816, 4178817, 4178818, 4178819, 4178820, 4178821, 4178822, 4178823, 4178824, 4178825\",\n\t\t[\"1009:835:1442:1262\"] = \"4178838, 4178839, 4178840, 4178841, 4178842, 4178843, 4178844, 4178845, 4178846, 4178847, 4178848, 4178849, 4178850, 4178851, 4178852, 4178853\",\n\t\t[\"1395:932:183:0\"] = \"4179031, 4179032, 4179033, 4179034, 4179035, 4179036, 4179037, 4179038, 4179039, 4179040, 4179041, 4179042, 4179043, 4179044, 4179045, 4179046, 4179047, 4179048, 4179049, 4179050, 4179051, 4179052, 4179053, 4179054\",\n\t\t[\"1186:821:1100:696\"] = \"4178946, 4178947, 4178948, 4178949, 4178950, 4178951, 4178952, 4178953, 4178954, 4178955, 4178956, 4178957, 4178958, 4178959, 4178960, 4178961, 4178962, 4178963, 4178964, 4178965\",\n\t},\n\t[1648] = {\n\t\t[\"929:817:597:1053\"] = \"4075090, 4075098, 4075099, 4075100, 4075101, 4075102, 4075103, 4075104, 4075105, 4075091, 4075092, 4075093, 4075094, 4075095, 4075096, 4075097\",\n\t\t[\"1871:1010:1231:1429\"] = \"4075058, 4075069, 4075080, 4075084, 4075085, 4075086, 4075087, 4075088, 4075089, 4075059, 4075060, 4075061, 4075062, 4075063, 4075064, 4075065, 4075066, 4075067, 4075068, 4075070, 4075071, 4075072, 4075073, 4075074, 4075075, 4075076, 4075077, 4075078, 4075079, 4075081, 4075082, 4075083\",\n\t\t[\"1412:792:1474:891\"] = \"4075034, 4075045, 4075051, 4075052, 4075053, 4075054, 4075055, 4075056, 4075057, 4075035, 4075036, 4075037, 4075038, 4075039, 4075040, 4075041, 4075042, 4075043, 4075044, 4075046, 4075047, 4075048, 4075049, 4075050\",\n\t\t[\"1264:715:1841:645\"] = \"4075019, 4075026, 4075027, 4075028, 4075029, 4075030, 4075031, 4075032, 4075033, 4075020, 4075021, 4075022, 4075023, 4075024, 4075025\",\n\t\t[\"834:696:1500:0\"] = \"4075007, 4075011, 4075012, 4075013, 4075014, 4075015, 4075016, 4075017, 4075018, 4075008, 4075009, 4075010\",\n\t\t[\"1362:1088:945:0\"] = \"4074977, 4074988, 4074999, 4075001, 4075002, 4075003, 4075004, 4075005, 4075006, 4074978, 4074979, 4074980, 4074981, 4074982, 4074983, 4074984, 4074985, 4074986, 4074987, 4074989, 4074990, 4074991, 4074992, 4074993, 4074994, 4074995, 4074996, 4074997, 4074998, 4075000\",\n\t\t[\"844:875:2113:0\"] = \"4074961, 4074969, 4074970, 4074971, 4074972, 4074973, 4074974, 4074975, 4074976, 4074962, 4074963, 4074964, 4074965, 4074966, 4074967, 4074968\",\n\t\t[\"1612:1268:153:0\"] = \"4074926, 4074937, 4074948, 4074955, 4074956, 4074957, 4074958, 4074959, 4074960, 4074927, 4074928, 4074929, 4074930, 4074931, 4074932, 4074933, 4074934, 4074935, 4074936, 4074938, 4074939, 4074940, 4074941, 4074942, 4074943, 4074944, 4074945, 4074946, 4074947, 4074949, 4074950, 4074951, 4074952, 4074953, 4074954\",\n\t\t[\"766:637:958:997\"] = \"4074917, 4074918, 4074919, 4074920, 4074921, 4074922, 4074923, 4074924, 4074925\",\n\t},\n\n\t--[[ Zereth Mortis ]] \t\t[1650] = {\n\t\t[\"1008:726:1736:1363\"] = \"4261324, 4261328, 4261329, 4261330, 4261331, 4261332, 4261333, 4261334, 4261335, 4261325, 4261326, 4261327\", [\"1072:1207:269:730\"] = \"4261352, 4261363, 4261370, 4261371, 4261372, 4261373, 4261374, 4261375, 4261376, 4261353, 4261354, 4261355, 4261356, 4261357, 4261358, 4261359, 4261360, 4261361, 4261362, 4261364, 4261365, 4261366, 4261367, 4261368, 4261369\", [\"1117:1012:777:1548\"] = \"4261386, 4261397, 4261399, 4261400, 4261401, 4261402, 4261403, 4261404, 4261405, 4261387, 4261388, 4261389, 4261390, 4261391, 4261392, 4261393, 4261394, 4261395, 4261396, 4261398\", [\"1289:1364:364:57\"] = \"4261530, 4261544, 4261555, 4261563, 4261564, 4261565, 4261566, 4261567, 4261568, 4261531, 4261532, 4261533, 4261534, 4261535, 4261536, 4261538, 4261539, 4261541, 4261543, 4261545, 4261546, 4261547, 4261548, 4261549, 4261550, 4261551, 4261552, 4261553, 4261554, 4261556, 4261557, 4261558, 4261559, 4261560, 4261561, 4261562\", [\"1362:1236:2240:35\"] = \"4261488, 4261499, 4261510, 4261512, 4261513, 4261514, 4261515, 4261516, 4261517, 4261489, 4261490, 4261491, 4261492, 4261493, 4261494, 4261495, 4261496, 4261497, 4261498, 4261500, 4261501, 4261502, 4261503, 4261504, 4261505, 4261506, 4261507, 4261508, 4261509, 4261511\", [\"1709:1426:2072:665\"] = \"4261437, 4261448, 4261459, 4261470, 4261474, 4261475, 4261476, 4261477, 4261478, 4261438, 4261439, 4261440, 4261441, 4261442, 4261443, 4261444, 4261445, 4261446, 4261447, 4261449, 4261450, 4261451, 4261452, 4261453, 4261454, 4261455, 4261456, 4261457, 4261458, 4261460, 4261461, 4261462, 4261463, 4261464, 4261465, 4261466, 4261467, 4261468, 4261469, 4261471, 4261472, 4261473\", [\"516:516:2005:872\"] = \"4261479, 4261480, 4261481, 4261482, 4261483, 4261484, 4261485, 4261486, 4261487\", [\"563:715:1641:431\"] = \"4261569, 4261570, 4261571, 4261572, 4261573, 4261574, 4261575, 4261576, 4261577\", [\"579:479:1058:1264\"] = \"4261406, 4261407, 4261408, 4261409, 4261410, 4261411\", [\"582:590:1912:112\"] = \"4261336, 4261337, 4261338, 4261339, 4261340, 4261341, 4261349, 4261350, 4261351\", [\"629:554:900:1499\"] = \"4261412, 4261413, 4261414, 4261415, 4261416, 4261417, 4261418, 4261419, 4261420\", [\"649:666:1162:535\"] = \"4261283, 4261284, 4261285, 4261286, 4261287, 4261288, 4261289, 4261290, 4261291\", [\"736:755:1466:991\"] = \"4261377, 4261378, 4261379, 4261380, 4261381, 4261382, 4261383, 4261384, 4261385\", [\"823:628:1497:1932\"] = \"4261292, 4261296, 4261297, 4261298, 4261299, 4261300, 4261301, 4261302, 4261303, 4261293, 4261294, 4261295\", [\"880:1087:1924:140\"] = \"4261304, 4261315, 4261317, 4261318, 4261319, 4261320, 4261321, 4261322, 4261323, 4261305, 4261306, 4261307, 4261308, 4261309, 4261310, 4261311, 4261312, 4261313, 4261314, 4261316\", [\"928:910:1198:0\"] = \"4261421, 4261429, 4261430, 4261431, 4261432, 4261433, 4261434, 4261435, 4261436, 4261422, 4261423, 4261424, 4261425, 4261426, 4261427, 4261428\", [\"986:700:1841:1640\"] = \"4261518, 4261522, 4261523, 4261524, 4261525, 4261526, 4261527, 4261528, 4261529, 4261519, 4261520, 4261521\",\n\t},\n\n\t[1672] = { -- 1967\n\t\t[\"782:1388:1758:1018\"] = \"4083061,4083072,4083078,4083079,4083080,4083081,4083082,4083083,4083084,4083062,4083063,4083064,4083065,4083066,4083067,4083068,4083069,4083070,4083071,4083073,4083074,4083075,4083076,4083077\",\n\t\t[\"1041:518:833:1006\"] = \"4083046,4083053,4083054,4083055,4083056,4083057,4083058,4083059,4083060,4083047,4083048,4083049,4083050,4083051,4083052\",\n\t\t[\"1347:1265:577:1295\"] = \"4083085,4083096,4083107,4083109,4083110,4083111,4083112,4083113,4083114,4083086,4083087,4083088,4083089,4083090,4083091,4083092,4083093,4083094,4083095,4083097,4083098,4083099,4083100,4083101,4083102,4083103,4083104,4083105,4083106,4083108\",\n\t\t[\"1864:1120:866:78\"] = \"4083006,4083017,4083028,4083039,4083041,4083042,4083043,4083044,4083045,4083007,4083008,4083009,4083010,4083011,4083012,4083013,4083014,4083015,4083016,4083018,4083019,4083020,4083021,4083022,4083023,4083024,4083025,4083026,4083027,4083029,4083030,4083031,4083032,4083033,4083034,4083035,4083036,4083037,4083038,4083040\",\n\t},\n\n\t[1673] = { -- 1968\n\t\t[\"592:913:2376:750\"] = \"4083330,4083334,4083335,4083336,4083337,4083338,4083339,4083340,4083341,4083331,4083332,4083333\",\n\t\t[\"992:991:1851:1559\"] = \"4083314,4083322,4083323,4083324,4083325,4083326,4083327,4083328,4083329,4083315,4083316,4083317,4083318,4083319,4083320,4083321\",\n\t\t[\"993:743:1479:1227\"] = \"4083302,4083306,4083307,4083308,4083309,4083310,4083311,4083312,4083313,4083303,4083304,4083305\",\n\t\t[\"1021:484:1491:842\"] = \"4083342,4083343,4083344,4083345,4083346,4083347,4083348,4083349\",\n\t\t[\"1281:939:1254:3\"] = \"4083350,4083361,4083367,4083368,4083369,4083370,4083371,4083372,4083373,4083351,4083352,4083353,4083354,4083355,4083356,4083357,4083358,4083359,4083360,4083362,4083363,4083364,4083365,4083366\",\n\t\t[\"1356:1298:261:776\"] = \"4083265,4083276,4083287,4083296,4083297,4083298,4083299,4083300,4083301,4083266,4083267,4083268,4083269,4083270,4083271,4083272,4083273,4083274,4083275,4083277,4083278,4083279,4083280,4083281,4083282,4083283,4083284,4083285,4083286,4083288,4083289,4083290,4083291,4083293,4083294,4083295\",\n\t},\n\n\t[1674] = { -- 1969\n\t\t[\"334:968:1636:375\"] = \"4083620,4083621,4083629,4083633,4083634,4083635,4083636,4083637\",\n\t\t[\"652:445:1954:1282\"] = \"4083594,4083595,4083596,4083597,4083598,4083599\",\n\t\t[\"771:1152:1876:218\"] = \"4083600,4083611,4083613,4083614,4083615,4083616,4083617,4083618,4083619,4083601,4083602,4083603,4083604,4083605,4083606,4083607,4083608,4083609,4083610,4083612\",\n\t\t[\"889:1071:845:275\"] = \"4083638,4083649,4083651,4083652,4083653,4083654,4083655,4083656,4083657,4083639,4083640,4083641,4083642,4083643,4083644,4083645,4083646,4083647,4083648,4083650\",\n\t\t[\"973:722:1949:1633\"] = \"4083544,4083548,4083549,4083550,4083551,4083552,4083553,4083554,4083555,4083545,4083546,4083547\",\n\t\t[\"998:475:1052:1247\"] = \"4083576,4083577,4083585,4083588,4083590,4083591,4083592,4083593\",\n\t\t[\"1151:833:894:1627\"] = \"4083556,4083567,4083569,4083570,4083571,4083572,4083573,4083574,4083575,4083557,4083558,4083559,4083560,4083561,4083562,4083563,4083564,4083565,4083566,4083568\",\n\t},\n\n\t[1677] = { -- 1979\n\t\t[\"475:526:777:875\"] = \"4084124,4084125,4084126,4084127,4084128,4084129\",\n\t\t[\"489:857:855:218\"] = \"4084167,4084168,4084169,4084170,4084171,4084172,4084173,4084174\",\n\t\t[\"804:658:1060:824\"] = \"4084155,4084159,4084160,4084161,4084162,4084163,4084164,4084165,4084166,4084156,4084157,4084158\",\n\t\t[\"872:1021:297:954\"] = \"4084108,4084116,4084117,4084118,4084119,4084120,4084121,4084122,4084123,4084109,4084110,4084111,4084112,4084113,4084114,4084115\",\n\t\t[\"936:780:1248:167\"] = \"4084175,4084183,4084184,4084185,4084186,4084187,4084188,4084189,4084190,4084176,4084177,4084178,4084179,4084180,4084181,4084182\",\n\t\t[\"1057:723:1287:1612\"] = \"4084130,4084137,4084138,4084139,4084140,4084141,4084142,4084143,4084144,4084131,4084132,4084133,4084134,4084135,4084136\",\n\t\t[\"1084:336:1058:1399\"] = \"4084145,4084147,4084148,4084149,4084150,4084151,4084152,4084153,4084154,4084146\",\n\t\t[\"1980:1234:1772:697\"] = \"4084191,4084202,4084213,4084224,4084226,4084227,4084228,4084229,4084230,4084192,4084193,4084194,4084195,4084196,4084197,4084198,4084199,4084200,4084201,4084203,4084204,4084205,4084206,4084207,4084208,4084209,4084210,4084211,4084212,4084214,4084215,4084216,4084217,4084218,4084219,4084220,4084221,4084222,4084223,4084225\",\n\t},\n----------------------------------------------------------------------\n-- Dragonflight\n----------------------------------------------------------------------\n\t--[[Ohn'ahran Plains]] [1705] = {[\"1023:1309:505:531\"] = \"4697336, 4697347, 4697353, 4697354, 4697355, 4697356, 4697357, 4697358, 4697359, 4697337, 4697338, 4697339, 4697340, 4697341, 4697342, 4697343, 4697344, 4697345, 4697346, 4697348, 4697349, 4697350, 4697351, 4697352\", [\"1184:961:1511:1419\"] = \"4697514, 4697525, 4697527, 4697528, 4697529, 4697530, 4697531, 4697532, 4697533, 4697515, 4697516, 4697517, 4697518, 4697519, 4697520, 4697521, 4697522, 4697523, 4697524, 4697526\", [\"1270:973:2432:752\"] = \"4697422, 4697433, 4697435, 4697436, 4697437, 4697438, 4697439, 4697440, 4697441, 4697423, 4697424, 4697425, 4697426, 4697427, 4697428, 4697429, 4697430, 4697431, 4697432, 4697434\", [\"1285:1226:2343:1317\"] = \"4697360, 4697371, 4697382, 4697384, 4697385, 4697386, 4697387, 4697388, 4697389, 4697361, 4697362, 4697363, 4697364, 4697365, 4697366, 4697367, 4697368, 4697369, 4697370, 4697372, 4697373, 4697374, 4697375, 4697376, 4697377, 4697378, 4697379, 4697380, 4697381, 4697383\", [\"1337:1164:2464:112\"] = \"4697442, 4697453, 4697464, 4697466, 4697467, 4697468, 4697469, 4697470, 4697471, 4697443, 4697444, 4697445, 4697446, 4697447, 4697448, 4697449, 4697450, 4697451, 4697452, 4697454, 4697455, 4697456, 4697457, 4697458, 4697459, 4697460, 4697461, 4697462, 4697463, 4697465\", [\"1341:1228:512:1211\"] = \"4697472, 4697483, 4697494, 4697496, 4697497, 4697498, 4697499, 4697500, 4697501, 4697473, 4697474, 4697475, 4697476, 4697477, 4697478, 4697479, 4697480, 4697481, 4697482, 4697484, 4697485, 4697486, 4697487, 4697488, 4697489, 4697490, 4697491, 4697492, 4697493, 4697495\", [\"1444:1292:1338:404\"] = \"4697284, 4697295, 4697306, 4697314, 4697315, 4697316, 4697317, 4697318, 4697319, 4697285, 4697286, 4697287, 4697288, 4697289, 4697290, 4697291, 4697292, 4697293, 4697294, 4697296, 4697297, 4697298, 4697299, 4697300, 4697301, 4697302, 4697303, 4697304, 4697305, 4697307, 4697308, 4697309, 4697310, 4697311, 4697312, 4697313\", [\"746:767:315:920\"] = \"4697275, 4697276, 4697277, 4697278, 4697279, 4697280, 4697281, 4697282, 4697283\", [\"919:694:2733:113\"] = \"4697502, 4697506, 4697507, 4697508, 4697509, 4697510, 4697511, 4697512, 4697513, 4697503, 4697504, 4697505\", [\"942:774:1838:527\"] = \"4697390, 4697398, 4697399, 4697400, 4697401, 4697402, 4697403, 4697404, 4697405, 4697391, 4697392, 4697393, 4697394, 4697395, 4697396, 4697397\", [\"982:989:790:460\"] = \"4697406, 4697414, 4697415, 4697416, 4697417, 4697418, 4697419, 4697420, 4697421, 4697407, 4697408, 4697409, 4697410, 4697411, 4697412, 4697413\", [\"983:813:1877:50\"] = \"4697320, 4697328, 4697329, 4697330, 4697331, 4697332, 4697333, 4697334, 4697335, 4697321, 4697322, 4697323, 4697324, 4697325, 4697326, 4697327\",},\n\t--[[The Waking Shores]] [1706] = {[\"1029:899:1574:35\"] = \"4699848, 4699859, 4699861, 4699862, 4699863, 4699864, 4699865, 4699866, 4699867, 4699849, 4699850, 4699851, 4699852, 4699853, 4699854, 4699855, 4699856, 4699857, 4699858, 4699860\", [\"1035:699:283:1861\"] = \"4699777, 4699784, 4699785, 4699786, 4699787, 4699788, 4699789, 4699790, 4699791, 4699778, 4699779, 4699780, 4699781, 4699782, 4699783\", [\"1057:1289:1372:467\"] = \"4699928, 4699939, 4699950, 4699952, 4699953, 4699954, 4699955, 4699956, 4699957, 4699929, 4699930, 4699931, 4699932, 4699933, 4699934, 4699935, 4699936, 4699937, 4699938, 4699940, 4699941, 4699942, 4699943, 4699944, 4699945, 4699946, 4699947, 4699948, 4699949, 4699951\", [\"1067:771:1004:1789\"] = \"4699812, 4699823, 4699825, 4699826, 4699827, 4699828, 4699829, 4699830, 4699831, 4699813, 4699814, 4699815, 4699816, 4699817, 4699818, 4699819, 4699820, 4699821, 4699822, 4699824\", [\"1120:913:1848:1260\"] = \"4699958, 4699969, 4699971, 4699972, 4699973, 4699974, 4699975, 4699976, 4699977, 4699959, 4699960, 4699961, 4699962, 4699963, 4699964, 4699965, 4699966, 4699967, 4699968, 4699970\", [\"1163:1037:2181:0\"] = \"4699978, 4699989, 4699996, 4699997, 4699998, 4699999, 4700000, 4700001, 4700002, 4699979, 4699980, 4699981, 4699982, 4699983, 4699984, 4699985, 4699986, 4699987, 4699988, 4699990, 4699991, 4699992, 4699993, 4699994, 4699995\", [\"1191:928:2473:311\"] = \"4700015, 4700026, 4700028, 4700029, 4700030, 4700031, 4700032, 4700033, 4700034, 4700016, 4700017, 4700018, 4700019, 4700020, 4700021, 4700022, 4700023, 4700024, 4700025, 4700027\", [\"1278:851:2136:824\"] = \"4699792, 4699803, 4699805, 4699806, 4699807, 4699808, 4699809, 4699810, 4699811, 4699793, 4699794, 4699795, 4699796, 4699797, 4699798, 4699799, 4699800, 4699801, 4699802, 4699804\", [\"1331:1177:240:712\"] = \"4699898, 4699909, 4699920, 4699922, 4699923, 4699924, 4699925, 4699926, 4699927, 4699899, 4699900, 4699901, 4699902, 4699903, 4699904, 4699905, 4699906, 4699907, 4699908, 4699910, 4699911, 4699912, 4699913, 4699914, 4699915, 4699916, 4699917, 4699918, 4699919, 4699921\", [\"1505:1257:521:919\"] = \"4699868, 4699879, 4699890, 4699892, 4699893, 4699894, 4699895, 4699896, 4699897, 4699869, 4699870, 4699871, 4699872, 4699873, 4699874, 4699875, 4699876, 4699877, 4699878, 4699880, 4699881, 4699882, 4699883, 4699884, 4699885, 4699886, 4699887, 4699888, 4699889, 4699891\", [\"692:784:2536:1124\"] = \"4700003, 4700007, 4700008, 4700009, 4700010, 4700011, 4700012, 4700013, 4700014, 4700004, 4700005, 4700006\", [\"820:970:1743:1590\"] = \"4699832, 4699840, 4699841, 4699842, 4699843, 4699844, 4699845, 4699846, 4699847, 4699833, 4699834, 4699835, 4699836, 4699837, 4699838, 4699839\",},\n\t--[[The Azure Span]] [1707] = {[\"1032:1233:660:324\"] = \"4698024, 4698036, 4698043, 4698044, 4698045, 4698046, 4698047, 4698048, 4698049, 4698026, 4698027, 4698028, 4698029, 4698030, 4698031, 4698032, 4698033, 4698034, 4698035, 4698037, 4698038, 4698039, 4698040, 4698041, 4698042\", [\"1080:945:1683:478\"] = \"4698430, 4698500, 4698504, 4698505, 4698512, 4698518, 4698524, 4698531, 4698538, 4698437, 4698444, 4698451, 4698458, 4698463, 4698470, 4698476, 4698483, 4698489, 4698494, 4698503\", [\"1109:909:10:462\"] = \"4698050, 4698061, 4698063, 4698064, 4698065, 4698066, 4698067, 4698068, 4698069, 4698051, 4698052, 4698053, 4698054, 4698055, 4698056, 4698057, 4698058, 4698059, 4698060, 4698062\", [\"1129:954:706:1160\"] = \"4697999, 4698012, 4698015, 4698016, 4698018, 4698019, 4698020, 4698021, 4698022, 4698000, 4698001, 4698002, 4698003, 4698005, 4698007, 4698008, 4698009, 4698010, 4698011, 4698014\", [\"1205:689:1883:57\"] = \"4698734, 4698746, 4698753, 4698760, 4698767, 4698773, 4698779, 4698786, 4698793, 4698735, 4698736, 4698737, 4698738, 4698739, 4698740\", [\"1291:1459:2446:60\"] = \"4698885, 4698947, 4698958, 4698966, 4698967, 4698968, 4698969, 4698970, 4698971, 4698891, 4698898, 4698905, 4698912, 4698918, 4698924, 4698930, 4698936, 4698943, 4698946, 4698948, 4698949, 4698950, 4698951, 4698952, 4698953, 4698954, 4698955, 4698956, 4698957, 4698959, 4698960, 4698961, 4698962, 4698963, 4698964, 4698965\", [\"1294:1096:1843:946\"] = \"4698070, 4698106, 4698180, 4698193, 4698199, 4698207, 4698213, 4698220, 4698226, 4698071, 4698072, 4698073, 4698074, 4698075, 4698077, 4698082, 4698088, 4698094, 4698100, 4698114, 4698120, 4698127, 4698133, 4698140, 4698146, 4698153, 4698160, 4698167, 4698173, 4698186\", [\"870:818:0:839\"] = \"4698331, 4698377, 4698383, 4698390, 4698397, 4698403, 4698410, 4698417, 4698424, 4698336, 4698343, 4698349, 4698355, 4698361, 4698365, 4698371\", [\"901:742:208:115\"] = \"4698800, 4698829, 4698836, 4698843, 4698850, 4698857, 4698864, 4698871, 4698878, 4698808, 4698815, 4698822\", [\"908:825:1357:162\"] = \"4698233, 4698281, 4698287, 4698292, 4698298, 4698304, 4698311, 4698317, 4698323, 4698239, 4698246, 4698252, 4698258, 4698265, 4698271, 4698276\", [\"980:1732:1211:350\"] = \"4697970, 4697981, 4697992, 4697993, 4697994, 4697995, 4697996, 4697997, 4697998, 4697971, 4697972, 4697973, 4697974, 4697975, 4697976, 4697977, 4697978, 4697979, 4697980, 4697982, 4697983, 4697984, 4697986, 4697987, 4697988, 4697989, 4697990, 4697991\",},\n\t--[[Thaldraszus]] [1708] = {[\"1036:798:1951:0\"] = \"4696663, 4696674, 4696676, 4696677, 4696678, 4696679, 4696680, 4696681, 4696682, 4696664, 4696665, 4696666, 4696667, 4696668, 4696669, 4696670, 4696671, 4696672, 4696673, 4696675\", [\"1140:924:937:1631\"] = \"4696543, 4696554, 4696556, 4696557, 4696558, 4696559, 4696560, 4696561, 4696562, 4696544, 4696545, 4696546, 4696547, 4696548, 4696549, 4696550, 4696551, 4696552, 4696553, 4696555\", [\"1180:977:835:952\"] = \"4696608, 4696619, 4696621, 4696622, 4696623, 4696624, 4696625, 4696626, 4696627, 4696609, 4696610, 4696611, 4696612, 4696613, 4696614, 4696615, 4696616, 4696617, 4696618, 4696620\", [\"1205:1762:2424:798\"] = \"4696628, 4696639, 4696650, 4696657, 4696658, 4696659, 4696660, 4696661, 4696662, 4696629, 4696630, 4696631, 4696632, 4696633, 4696634, 4696635, 4696636, 4696637, 4696638, 4696640, 4696641, 4696642, 4696643, 4696644, 4696645, 4696646, 4696647, 4696648, 4696649, 4696651, 4696652, 4696653, 4696654, 4696655, 4696656\", [\"1416:947:1525:508\"] = \"4696503, 4696514, 4696520, 4696521, 4696522, 4696523, 4696524, 4696525, 4696526, 4696504, 4696505, 4696506, 4696507, 4696508, 4696509, 4696510, 4696511, 4696512, 4696513, 4696515, 4696516, 4696517, 4696518, 4696519\", [\"1433:919:1611:1641\"] = \"4696563, 4696574, 4696580, 4696581, 4696582, 4696583, 4696584, 4696585, 4696586, 4696564, 4696565, 4696566, 4696567, 4696568, 4696569, 4696570, 4696571, 4696572, 4696573, 4696575, 4696576, 4696577, 4696578, 4696579\", [\"787:839:1935:1048\"] = \"4696592, 4696600, 4696601, 4696602, 4696603, 4696604, 4696605, 4696606, 4696607, 4696593, 4696594, 4696595, 4696596, 4696597, 4696598, 4696599\", [\"913:812:1467:1239\"] = \"4696527, 4696535, 4696536, 4696537, 4696538, 4696539, 4696540, 4696541, 4696542, 4696528, 4696529, 4696530, 4696531, 4696532, 4696533, 4696534\",},\n\t--[[The Forbidden Reach]] [1709] = {[\"1571:2560:2269:0\"] = \"4697750, 4697761, 4697772, 4697783, 4697794, 4697805, 4697816, 4697818, 4697819, 4697751, 4697752, 4697753, 4697754, 4697755, 4697756, 4697757, 4697758, 4697759, 4697760, 4697762, 4697763, 4697764, 4697765, 4697766, 4697767, 4697768, 4697769, 4697770, 4697771, 4697773, 4697774, 4697775, 4697776, 4697777, 4697778, 4697779, 4697780, 4697781, 4697782, 4697784, 4697785, 4697786, 4697787, 4697788, 4697789, 4697790, 4697791, 4697792, 4697793, 4697795, 4697796, 4697797, 4697798, 4697799, 4697800, 4697801, 4697802, 4697803, 4697804, 4697806, 4697807, 4697808, 4697809, 4697810, 4697811, 4697812, 4697813, 4697814, 4697815, 4697817\", [\"1807:2560:0:0\"] = \"4697534, 4697545, 4697556, 4697567, 4697578, 4697589, 4697600, 4697611, 4697613, 4697535, 4697536, 4697537, 4697538, 4697539, 4697540, 4697541, 4697542, 4697543, 4697544, 4697546, 4697547, 4697548, 4697549, 4697550, 4697551, 4697552, 4697553, 4697554, 4697555, 4697557, 4697558, 4697559, 4697560, 4697561, 4697562, 4697563, 4697564, 4697565, 4697566, 4697568, 4697569, 4697570, 4697571, 4697572, 4697573, 4697574, 4697575, 4697576, 4697577, 4697579, 4697580, 4697581, 4697582, 4697583, 4697584, 4697585, 4697586, 4697587, 4697588, 4697590, 4697591, 4697592, 4697593, 4697594, 4697595, 4697596, 4697597, 4697598, 4697599, 4697601, 4697602, 4697603, 4697604, 4697605, 4697606, 4697607, 4697608, 4697609, 4697610, 4697612\", [\"1949:1295:1230:0\"] = \"4697614, 4697625, 4697636, 4697647, 4697657, 4697658, 4697659, 4697660, 4697661, 4697615, 4697616, 4697617, 4697618, 4697619, 4697620, 4697621, 4697622, 4697623, 4697624, 4697626, 4697627, 4697628, 4697629, 4697630, 4697631, 4697632, 4697633, 4697634, 4697635, 4697637, 4697638, 4697639, 4697640, 4697641, 4697642, 4697643, 4697644, 4697645, 4697646, 4697648, 4697649, 4697650, 4697651, 4697652, 4697653, 4697654, 4697655, 4697656\", [\"2648:1970:319:590\"] = \"4697662, 4697673, 4697684, 4697695, 4697706, 4697717, 4697728, 4697739, 4697749, 4697663, 4697664, 4697665, 4697666, 4697667, 4697668, 4697669, 4697670, 4697671, 4697672, 4697674, 4697675, 4697676, 4697677, 4697678, 4697679, 4697680, 4697681, 4697682, 4697683, 4697685, 4697686, 4697687, 4697688, 4697689, 4697690, 4697691, 4697692, 4697693, 4697694, 4697696, 4697697, 4697698, 4697699, 4697700, 4697701, 4697702, 4697703, 4697704, 4697705, 4697707, 4697708, 4697709, 4697710, 4697711, 4697712, 4697713, 4697714, 4697715, 4697716, 4697718, 4697719, 4697720, 4697721, 4697722, 4697723, 4697724, 4697725, 4697726, 4697727, 4697729, 4697730, 4697731, 4697732, 4697733, 4697734, 4697735, 4697736, 4697737, 4697738, 4697740, 4697741, 4697742, 4697743, 4697744, 4697745, 4697746, 4697747, 4697748\",},\n\n}\n\n-- Create table to store revealed overlays\nT.overlayTextures = {}\n\n-- Function to refresh overlays (Blizzard_SharedMapDataProviders\\MapExplorationDataProvider)\nlocal function RefMap(self, fullUpdate)\n\tT.overlayTextures = {}\n\tlocal mapID = WorldMapFrame.mapID; if not mapID then return end\n\tlocal artID = C_Map.GetMapArtID(mapID); if not artID or not zones[artID] then return end\n\tlocal LeaMapsZone = zones[artID]\n\n\t-- Store already explored tiles in a table so they can be ignored\n\tlocal TileExists = {}\n\tlocal exploredMapTextures = C_MapExplorationInfo.GetExploredMapTextures(mapID)\n\tif exploredMapTextures then\n\t\tfor _, exploredTextureInfo in ipairs(exploredMapTextures) do\n\t\t\tlocal key = exploredTextureInfo.textureWidth .. \":\" .. exploredTextureInfo.textureHeight .. \":\" .. exploredTextureInfo.offsetX .. \":\" .. exploredTextureInfo.offsetY\n\t\t\tTileExists[key] = true\n\t\tend\n\tend\n\n\t-- Get the sizes\n\tself.layerIndex = self:GetMap():GetCanvasContainer():GetCurrentLayerIndex()\n\tlocal layers = C_Map.GetMapArtLayers(mapID)\n\tlocal layerInfo = layers and layers[self.layerIndex]\n\tif not layerInfo then return end\n\tlocal TILE_SIZE_WIDTH = layerInfo.tileWidth\n\tlocal TILE_SIZE_HEIGHT = layerInfo.tileHeight\n\n\t-- Show textures if they are in database and have not been explored\n\tfor key, files in pairs(LeaMapsZone) do\n\t\tif not TileExists[key] then\n\t\t\tlocal width, height, offsetX, offsetY = strsplit(\":\", key)\n\t\t\tlocal fileDataIDs = { strsplit(\",\", files) }\n\t\t\tlocal numTexturesWide = ceil(width/TILE_SIZE_WIDTH)\n\t\t\tlocal numTexturesTall = ceil(height/TILE_SIZE_HEIGHT)\n\t\t\tlocal texturePixelWidth, textureFileWidth, texturePixelHeight, textureFileHeight\n\t\t\tfor j = 1, numTexturesTall do\n\t\t\t\tif ( j < numTexturesTall ) then\n\t\t\t\t\ttexturePixelHeight = TILE_SIZE_HEIGHT\n\t\t\t\t\ttextureFileHeight = TILE_SIZE_HEIGHT\n\t\t\t\telse\n\t\t\t\t\ttexturePixelHeight = mod(height, TILE_SIZE_HEIGHT)\n\t\t\t\t\tif ( texturePixelHeight == 0 ) then\n\t\t\t\t\t\ttexturePixelHeight = TILE_SIZE_HEIGHT\n\t\t\t\t\tend\n\t\t\t\t\ttextureFileHeight = 16\n\t\t\t\t\twhile(textureFileHeight < texturePixelHeight) do\n\t\t\t\t\t\ttextureFileHeight = textureFileHeight * 2\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tfor k = 1, numTexturesWide do\n\t\t\t\t\tlocal texture = self.overlayTexturePool:Acquire()\n\t\t\t\t\tif ( k < numTexturesWide ) then\n\t\t\t\t\t\ttexturePixelWidth = TILE_SIZE_WIDTH\n\t\t\t\t\t\ttextureFileWidth = TILE_SIZE_WIDTH\n\t\t\t\t\telse\n\t\t\t\t\t\ttexturePixelWidth = mod(width, TILE_SIZE_WIDTH)\n\t\t\t\t\t\tif ( texturePixelWidth == 0 ) then\n\t\t\t\t\t\t\ttexturePixelWidth = TILE_SIZE_WIDTH\n\t\t\t\t\t\tend\n\t\t\t\t\t\ttextureFileWidth = 16\n\t\t\t\t\t\twhile(textureFileWidth < texturePixelWidth) do\n\t\t\t\t\t\t\ttextureFileWidth = textureFileWidth * 2\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\ttexture:SetSize(texturePixelWidth, texturePixelHeight)\n\t\t\t\t\ttexture:SetTexCoord(0, texturePixelWidth/textureFileWidth, 0, texturePixelHeight/textureFileHeight)\n\t\t\t\t\ttexture:SetPoint(\"TOPLEFT\", offsetX + (TILE_SIZE_WIDTH * (k-1)), -(offsetY + (TILE_SIZE_HEIGHT * (j - 1))))\n\t\t\t\t\ttexture:SetTexture(tonumber(fileDataIDs[((j - 1) * numTexturesWide) + k]), nil, nil, \"TRILINEAR\")\n\t\t\t\t\ttexture:SetDrawLayer(\"ARTWORK\", -1)\n\t\t\t\t\tif ShestakUISettingsPerChar.FogOfWar == true then\n\t\t\t\t\t\ttexture:Show()\n\t\t\t\t\telse\n\t\t\t\t\t\ttexture:Hide()\n\t\t\t\t\tend\n\t\t\t\t\ttinsert(T.overlayTextures, texture)\n\t\t\t\t\tif fullUpdate then\n\t\t\t\t\t\tself.textureLoadGroup:AddTexture(texture)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- Show overlays on startup\nfor pin in WorldMapFrame:EnumeratePinsByTemplate(\"MapExplorationPinTemplate\") do\n\thooksecurefunc(pin, \"RefreshOverlays\", RefMap)\nend"
  },
  {
    "path": "ShestakUI/Modules/Maps/MiniMap.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.minimap.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMinimap border\n----------------------------------------------------------------------------------------\nlocal MinimapAnchor = CreateFrame(\"Frame\", \"MinimapAnchor\", UIParent)\nMinimapAnchor:CreatePanel(\"ClassColor\", C.minimap.size, C.minimap.size, unpack(C.position.minimap))\n\n-- Disable Minimap Cluster\nMinimapCluster:EnableMouse(false)\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function(self, event)\n\tself:UnregisterEvent(event)\n\t-- Parent Minimap into our frame\n\tMinimap:SetParent(MinimapAnchor)\n\tMinimap:ClearAllPoints()\n\tMinimap:SetPoint(\"TOPLEFT\", MinimapAnchor, \"TOPLEFT\", 2, -2)\n\tMinimap:SetPoint(\"BOTTOMRIGHT\", MinimapAnchor, \"BOTTOMRIGHT\", -2, 2)\n\tMinimap:SetSize(MinimapAnchor:GetWidth(), MinimapAnchor:GetWidth())\n\n\tMinimapBackdrop:ClearAllPoints()\n\tMinimapBackdrop:SetPoint(\"TOPLEFT\", MinimapAnchor, \"TOPLEFT\", 2, -2)\n\tMinimapBackdrop:SetPoint(\"BOTTOMRIGHT\", MinimapAnchor, \"BOTTOMRIGHT\", -2, 2)\n\tMinimapBackdrop:SetSize(MinimapAnchor:GetWidth(), MinimapAnchor:GetWidth())\n\n\t-- Instance Difficulty icon\n\tMinimapCluster.InstanceDifficulty:SetParent(Minimap)\n\tMinimapCluster.InstanceDifficulty:ClearAllPoints()\n\tMinimapCluster.InstanceDifficulty:SetPoint(\"TOPRIGHT\", Minimap, \"TOPRIGHT\", 1, 3)\n\tMinimapCluster.InstanceDifficulty.Instance.Border:Hide()\n\tMinimapCluster.InstanceDifficulty.Instance.Background:SetSize(28, 28)\n\tMinimapCluster.InstanceDifficulty.Instance.Background:SetVertexColor(0.6, 0.3, 0)\n\n\t-- Guild Instance Difficulty icon\n\tMinimapCluster.InstanceDifficulty.Guild.Border:Hide()\n\tMinimapCluster.InstanceDifficulty.Guild.Background:SetSize(28, 28)\n\tMinimapCluster.InstanceDifficulty.Guild.Background:ClearAllPoints()\n\tMinimapCluster.InstanceDifficulty.Guild.Background:SetPoint(\"TOPRIGHT\", Minimap, \"TOPRIGHT\", -1, 0)\n\n\t-- Challenge Mode icon\n\tMinimapCluster.InstanceDifficulty.ChallengeMode.Border:Hide()\n\tMinimapCluster.InstanceDifficulty.ChallengeMode.Background:SetSize(28, 28)\n\tMinimapCluster.InstanceDifficulty.ChallengeMode.Background:SetVertexColor(0.8, 0.8, 0)\n\tMinimapCluster.InstanceDifficulty.ChallengeMode.Background:ClearAllPoints()\n\tMinimapCluster.InstanceDifficulty.ChallengeMode.Background:SetPoint(\"TOPRIGHT\", Minimap, \"TOPRIGHT\", -1, 0)\n\n\t-- Move QueueStatus icon\n\tQueueStatusFrame:SetClampedToScreen(true)\n\tQueueStatusFrame:SetFrameStrata(\"TOOLTIP\")\n\tQueueStatusButton:ClearAllPoints()\n\tQueueStatusButton:SetPoint(\"TOP\", Minimap, \"TOP\", 1, -1)\n\tQueueStatusButton:SetParent(Minimap)\n\tQueueStatusButton:SetScale(0.5)\n\n\t-- Invites icon\n\tlocal InviteTexture = GameTimeCalendarInvitesTexture\n\tInviteTexture:ClearAllPoints()\n\tInviteTexture:SetParent(Minimap)\n\tInviteTexture:SetPoint(\"TOPRIGHT\", Minimap, \"TOPRIGHT\", -1, -4)\n\tGameTimeFrame:Hide()\n\n\t-- Create button to show invite tooltip and allow open calendar\n\tlocal button = CreateFrame(\"Button\", nil, Minimap)\n\tbutton:SetAllPoints(InviteTexture)\n\tif not GameTimeCalendarInvitesTexture:IsShown() then\n\t\tbutton:Hide()\n\tend\n\n\tbutton:SetScript(\"OnEnter\", function()\n\t\tif InCombatLockdown() then return end\n\t\tif InviteTexture:IsShown() then\n\t\t\tGameTooltip:SetOwner(button, \"ANCHOR_LEFT\")\n\t\t\tGameTooltip:AddLine(GAMETIME_TOOLTIP_CALENDAR_INVITES)\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddLine(GAMETIME_TOOLTIP_TOGGLE_CALENDAR)\n\t\t\tGameTooltip:Show()\n\t\tend\n\tend)\n\n\tbutton:SetScript(\"OnLeave\", function()\n\t\tGameTooltip:Hide()\n\tend)\n\n\tbutton:SetScript(\"OnClick\", function()\n\t\tif InCombatLockdown() then return end\n\t\tif InviteTexture:IsShown() then\n\t\t\tToggleCalendar()\n\t\tend\n\tend)\n\n\thooksecurefunc(InviteTexture, \"Show\", function()\n\t\tbutton:Show()\n\tend)\n\n\thooksecurefunc(InviteTexture, \"Hide\", function()\n\t\tbutton:Hide()\n\tend)\n\n\t-- Move Mail icon\n\tlocal MailFrame = T.newPatch and MinimapCluster.IndicatorFrame.MailFrame or MinimapCluster.MailFrame\n\tif T.newPatch then\n\t\thooksecurefunc(MailFrame, \"SetPoint\", function(self, _, anchor)\n\t\t\tif anchor ~= Minimap then\n\t\t\t\tself:ClearAllPoints()\n\t\t\t\tself:SetPoint(\"BOTTOMRIGHT\", Minimap, \"BOTTOMRIGHT\", 4, -1)\n\t\t\tend\n\t\tend)\n\telse\n\t\tMailFrame:ClearAllPoints()\n\t\tMailFrame:SetPoint(\"BOTTOMRIGHT\", Minimap, \"BOTTOMRIGHT\", 4, -1)\n\tend\n\tMiniMapMailIcon:SetTexture(\"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Textures\\\\Mail.tga\")\n\tMiniMapMailIcon:SetSize(16, 16)\nend)\n\n-- Adjusting for patch 9.0.1 Minimap.xml\nMinimap:SetFrameStrata(\"LOW\")\nMinimap:SetFrameLevel(2)\n\n-- Hide Border\nMinimapCompassTexture:Hide()\nMinimapCluster.BorderTop:StripTextures()\n\n-- Hide Zoom Buttons\nMinimap.ZoomIn:Kill()\nMinimap.ZoomOut:Kill()\n\n-- Hide Blob Ring\nMinimap:SetArchBlobRingScalar(0)\nMinimap:SetQuestBlobRingScalar(0)\n\n-- Hide Zone Frame\nMinimapCluster.ZoneTextButton:Hide()\n\n-- Garrison icon\nif C.minimap.garrison_icon == true then\n\tExpansionLandingPageMinimapButton:SetScale(0.6)\n\tExpansionLandingPageMinimapButton:ClearAllPoints()\n\tExpansionLandingPageMinimapButton:SetPoint(\"TOPLEFT\", Minimap, \"TOPLEFT\", -3, 1)\n\thooksecurefunc(ExpansionLandingPageMinimapButton, \"UpdateIconForGarrison\", function()\n\t\tExpansionLandingPageMinimapButton:ClearAllPoints()\n\t\tExpansionLandingPageMinimapButton:SetPoint(\"TOPLEFT\", Minimap, \"TOPLEFT\", -3, 1)\n\tend)\nelse\n\tExpansionLandingPageMinimapButton:SetScale(0.0001)\n\tExpansionLandingPageMinimapButton:SetAlpha(0)\nend\n\n-- Feedback icon\nif FeedbackUIButton then\n\tFeedbackUIButton:ClearAllPoints()\n\tFeedbackUIButton:SetPoint(\"BOTTOM\", Minimap, \"BOTTOM\", 0, 0)\n\tFeedbackUIButton:SetScale(0.8)\nend\n\n-- Streaming icon\nif StreamingIcon then\n\tStreamingIcon:ClearAllPoints()\n\tStreamingIcon:SetPoint(\"BOTTOM\", Minimap, \"BOTTOM\", 0, -10)\n\tStreamingIcon:SetScale(0.8)\n\tStreamingIcon:SetFrameStrata(\"BACKGROUND\")\nend\n\n-- GhostFrame\nGhostFrame:StripTextures()\nGhostFrame:SetTemplate(\"Overlay\")\nGhostFrame:StyleButton()\nGhostFrame:ClearAllPoints()\nGhostFrame:SetPoint(unpack(C.position.ghost))\nGhostFrameContentsFrameIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\nGhostFrameContentsFrameIcon:SetSize(32, 32)\nGhostFrameContentsFrame:SetFrameLevel(GhostFrameContentsFrame:GetFrameLevel() + 2)\nGhostFrameContentsFrame:CreateBackdrop(\"Overlay\")\nGhostFrameContentsFrame.backdrop:SetPoint(\"TOPLEFT\", GhostFrameContentsFrameIcon, -2, 2)\nGhostFrameContentsFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", GhostFrameContentsFrameIcon, 2, -2)\n\n-- Enable mouse scrolling\nMinimap:EnableMouseWheel(true)\nMinimap:SetScript(\"OnMouseWheel\", function(_, d)\n\tif d > 0 then\n\t\t_G.Minimap.ZoomIn:Click()\n\telseif d < 0 then\n\t\t_G.Minimap.ZoomOut:Click()\n\tend\nend)\n\n-- Hide Game Time\nMinimapAnchor:RegisterEvent(\"PLAYER_LOGIN\")\nMinimapAnchor:RegisterEvent(\"ADDON_LOADED\")\nMinimapAnchor:SetScript(\"OnEvent\", function(_, _, addon)\n\tif addon == \"Blizzard_TimeManager\" then\n\t\tTimeManagerClockButton:Kill()\n\telseif addon == \"Blizzard_HybridMinimap\" then\n\t\tHybridMinimap:SetFrameStrata(\"BACKGROUND\")\n\t\tHybridMinimap:SetFrameLevel(100)\n\t\tHybridMinimap.MapCanvas:SetUseMaskTexture(false)\n\t\tHybridMinimap.CircleMask:SetTexture(\"Interface\\\\BUTTONS\\\\WHITE8X8\")\n\t\tHybridMinimap.MapCanvas:SetUseMaskTexture(true)\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tRight click menu\n----------------------------------------------------------------------------------------\nlocal menuFrame = CreateFrame(\"Frame\", \"MinimapRightClickMenu\", UIParent, \"UIDropDownMenuTemplate\")\nlocal guildText = IsInGuild() and ACHIEVEMENTS_GUILD_TAB or LOOKINGFORGUILD\nlocal journalText = T.client == \"ruRU\" and ENCOUNTER_JOURNAL or ADVENTURE_JOURNAL\nlocal micromenu = {\n\t{text = CHARACTER_BUTTON, notCheckable = 1, func = function()\n\t\tToggleCharacter(\"PaperDollFrame\")\n\tend},\n\t{text = SPELLBOOK_ABILITIES_BUTTON, notCheckable = 1, func = function()\n\t\tif InCombatLockdown() then\n\t\t\tprint(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return\n\t\tend\n\t\tToggleFrame(SpellBookFrame)\n\tend},\n\t{text = TALENTS_BUTTON, notCheckable = 1, func = function()\n\t\tif T.level >= 10 then\n\t\t\tToggleTalentFrame()\n\t\telse\n\t\t\tif C.general.error_filter ~= \"WHITELIST\" then\n\t\t\t\tUIErrorsFrame:AddMessage(format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10), 1, 0.1, 0.1)\n\t\t\telse\n\t\t\t\tprint(\"|cffffff00\"..format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10)..\"|r\")\n\t\t\tend\n\t\tend\n\tend},\n\t{text = ACHIEVEMENT_BUTTON, notCheckable = 1, func = function()\n\t\tToggleAchievementFrame()\n\tend},\n\t{text = QUESTLOG_BUTTON, notCheckable = 1, func = function()\n\t\tToggleQuestLog()\n\tend},\n\t{text = guildText, notCheckable = 1, func = function()\n\t\tToggleGuildFrame()\n\tend},\n\t{text = SOCIAL_BUTTON, notCheckable = 1, func = function()\n\t\tToggleFriendsFrame()\n\tend},\n\t{text = CHAT_CHANNELS, notCheckable = 1, func = function()\n\t\tToggleChannelFrame()\n\tend},\n\t{text = PLAYER_V_PLAYER, notCheckable = 1, func = function()\n\t\tif T.level >= 10 then\n\t\t\tTogglePVPUI()\n\t\telse\n\t\t\tif C.general.error_filter ~= \"WHITELIST\" then\n\t\t\t\tUIErrorsFrame:AddMessage(format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10), 1, 0.1, 0.1)\n\t\t\telse\n\t\t\t\tprint(\"|cffffff00\"..format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10)..\"|r\")\n\t\t\tend\n\t\tend\n\tend},\n\t{text = GROUP_FINDER, notCheckable = 1, func = function()\n\t\tif T.level >= 10 then\n\t\t\tPVEFrame_ToggleFrame(\"GroupFinderFrame\", nil)\n\t\telse\n\t\t\tif C.general.error_filter ~= \"WHITELIST\" then\n\t\t\t\tUIErrorsFrame:AddMessage(format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10), 1, 0.1, 0.1)\n\t\t\telse\n\t\t\t\tprint(\"|cffffff00\"..format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10)..\"|r\")\n\t\t\tend\n\t\tend\n\tend},\n\t{text = journalText, notCheckable = 1, func = function()\n\t\tif C_AdventureJournal.CanBeShown() then\n\t\t\tToggleEncounterJournal()\n\t\telse\n\t\t\tif C.general.error_filter ~= \"WHITELIST\" then\n\t\t\t\tUIErrorsFrame:AddMessage(FEATURE_NOT_YET_AVAILABLE, 1, 0.1, 0.1)\n\t\t\telse\n\t\t\t\tprint(\"|cffffff00\"..FEATURE_NOT_YET_AVAILABLE..\"|r\")\n\t\t\tend\n\t\tend\n\tend},\n\t{text = COLLECTIONS, notCheckable = 1, func = function()\n\t\tif InCombatLockdown() then\n\t\t\tprint(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return\n\t\tend\n\t\tToggleCollectionsJournal()\n\tend},\n\t{text = HELP_BUTTON, notCheckable = 1, func = function()\n\t\tToggleHelpFrame()\n\tend},\n\t{text = L_MINIMAP_CALENDAR, notCheckable = 1, func = function()\n\t\tToggleCalendar()\n\tend},\n\t{text = BATTLEFIELD_MINIMAP, notCheckable = 1, func = function()\n\t\tToggleBattlefieldMap()\n\tend},\n}\n\nif not IsTrialAccount() and not C_StorePublic.IsDisabledByParentalControls() then\n\ttinsert(micromenu, {text = BLIZZARD_STORE, notCheckable = 1, func = function() StoreMicroButton:Click() end})\nend\n\nif T.level == MAX_PLAYER_LEVEL then\n\ttinsert(micromenu, {text = RATED_PVP_WEEKLY_VAULT, notCheckable = 1, func = function()\n\t\tif not WeeklyRewardsFrame then\n\t\t\tWeeklyRewards_LoadUI()\n\t\tend\n\t\tToggleFrame(WeeklyRewardsFrame)\n\tend})\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"GARRISON_SHOW_LANDING_PAGE\")\nframe:SetScript(\"OnEvent\", function()\n\tlocal textTitle\n\tif ExpansionLandingPageMinimapButton.garrisonMode then\n\t\tlocal garrisonType = C_Garrison.GetLandingPageGarrisonType()\n\t\tif garrisonType == Enum.GarrisonType.Type_6_0 then\n\t\t\ttextTitle = GARRISON_LANDING_PAGE_TITLE\n\t\telseif garrisonType == Enum.GarrisonType.Type_7_0 then\n\t\t\ttextTitle = ORDER_HALL_LANDING_PAGE_TITLE\n\t\telseif garrisonType == Enum.GarrisonType.Type_8_0 then\n\t\t\ttextTitle = GARRISON_TYPE_8_0_LANDING_PAGE_TITLE\n\t\telseif garrisonType == Enum.GarrisonType.Type_9_0 then\n\t\t\ttextTitle = GARRISON_TYPE_9_0_LANDING_PAGE_TITLE\n\t\tend\n\n\t\tif textTitle then\n\t\t\ttinsert(micromenu, {text = textTitle, notCheckable = 1, func = function() GarrisonLandingPage_Toggle() end})\n\t\tend\n\telse\n\t\ttextTitle = DRAGONFLIGHT_LANDING_PAGE_TITLE\n\t\ttinsert(micromenu, {text = textTitle, notCheckable = 1, func = function() ToggleExpansionLandingPage() end})\n\tend\n\tframe:UnregisterAllEvents()\nend)\n\nMinimap:SetScript(\"OnMouseUp\", function(self, button)\n\tlocal position = MinimapAnchor:GetPoint()\n\tif button == \"RightButton\" then\n\t\tif position:match(\"LEFT\") then\n\t\t\tEasyMenu(micromenu, menuFrame, \"cursor\", 0, 0, \"MENU\")\n\t\telse\n\t\t\tEasyMenu(micromenu, menuFrame, \"cursor\", -160, 0, \"MENU\")\n\t\tend\n\telseif button == \"MiddleButton\" then\n\t\tif position:match(\"LEFT\") then\n\t\t\tToggleDropDownMenu(1, nil, MinimapCluster.Tracking.DropDown, \"cursor\", 0, 0, \"MENU\", 2)\n\t\telse\n\t\t\tToggleDropDownMenu(1, nil, MinimapCluster.Tracking.DropDown, \"cursor\", -160, 0, \"MENU\", 2)\n\t\tend\n\telseif button == \"LeftButton\" then\n\t\tMinimap.OnClick(self)\n\tend\nend)\n\n-- Set Square Map Mask\nMinimap:SetMaskTexture(C.media.blank)\nMinimap:SetArchBlobRingAlpha(0)\nMinimap:SetQuestBlobRingAlpha(0)\n\n-- For others mods with a minimap button, set minimap buttons position in square mode\nfunction GetMinimapShape() return \"SQUARE\" end\n\n----------------------------------------------------------------------------------------\n--\tHide minimap in combat\n----------------------------------------------------------------------------------------\nif C.minimap.hide_combat == true then\n\tMinimapAnchor:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\tMinimapAnchor:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\n\tMinimapAnchor:HookScript(\"OnEvent\", function(self, event)\n\t\tif event == \"PLAYER_REGEN_ENABLED\" then\n\t\t\tself:Show()\n\t\telseif event == \"PLAYER_REGEN_DISABLED\" then\n\t\t\tif not T.FarmMode then\n\t\t\t\tself:Hide()\n\t\t\tend\n\t\tend\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tTracking icon\n----------------------------------------------------------------------------------------\nif C.minimap.tracking_icon then\n\tMinimapCluster.Tracking.Background:Hide()\n\tMinimapCluster.Tracking:ClearAllPoints()\n\tMinimapCluster.Tracking:SetPoint(\"BOTTOMLEFT\", MinimapAnchor, \"BOTTOMLEFT\", 5, 6)\n\tMinimapCluster.Tracking.Button:SetHighlightTexture(0)\n\tMinimapCluster.Tracking.Button:SetSize(16, 16)\n\n\tMinimapCluster.Tracking:CreateBackdrop(\"ClassColor\")\n\tMinimapCluster.Tracking.backdrop:SetPoint(\"TOPLEFT\", MinimapCluster.Tracking.Button, -2, 2)\n\tMinimapCluster.Tracking.backdrop:SetPoint(\"BOTTOMRIGHT\", MinimapCluster.Tracking.Button, 2, -2)\nelse\n\tMinimapCluster.Tracking:Hide()\nend\n\n----------------------------------------------------------------------------------------\n--\tMove minimap on top\n----------------------------------------------------------------------------------------\nif C.minimap.on_top then\n\tMinimapAnchor:ClearAllPoints()\n\tMinimapAnchor:SetPoint(\"TOPRIGHT\", UIParent, \"TOPRIGHT\", -21, -21)\n\tBuffsAnchor:ClearAllPoints()\n\tBuffsAnchor:SetPoint(\"TOPRIGHT\", MinimapAnchor, \"TOPLEFT\", -25, 0)\n\n\tLPSTAT_CONFIG.Location.tip_frame = MinimapAnchor\n\tLPSTAT_CONFIG.Location.tip_anchor = \"BOTTOMRIGHT\"\n\tLPSTAT_CONFIG.Location.tip_x = 0\n\tLPSTAT_CONFIG.Location.tip_y = -50\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tframe:SetScript(\"OnEvent\", function()\n\t\tframe:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\t\tlocal positionTable = T.CurrentProfile()\n\t\tif LP_Coords then\n\t\t\tLP_Coords:ClearAllPoints()\n\t\t\tLP_Coords:SetPoint(\"BOTTOMRIGHT\", MinimapAnchor, \"TOPRIGHT\", 0, 5)\n\t\tend\n\t\tif TeleportMenu then\n\t\t\tTeleportMenu:ClearAllPoints()\n\t\t\tTeleportMenu:SetPoint(\"TOPLEFT\", MinimapAnchor, \"BOTTOMLEFT\", 0, -13)\n\t\tend\n\t\tif RaidBuffsAnchor and not positionTable[RaidBuffsAnchor:GetName()] then\n\t\t\tRaidBuffsAnchor:ClearAllPoints()\n\t\t\tRaidBuffsAnchor:SetPoint(\"TOPLEFT\", MinimapAnchor, \"BOTTOMLEFT\", 0, -3)\n\t\tend\n\t\tif not positionTable[VehicleAnchor:GetName()] then\n\t\t\tVehicleAnchor:ClearAllPoints()\n\t\t\tVehicleAnchor:SetPoint(\"TOP\", Minimap, \"BOTTOM\", 0, -27)\n\t\tend\n\t\tif TooltipAnchor and not positionTable[TooltipAnchor:GetName()] then\n\t\t\tTooltipAnchor:ClearAllPoints()\n\t\t\tTooltipAnchor:SetPoint(\"BOTTOMRIGHT\", UIParent, \"BOTTOMRIGHT\", -21, 20)\n\t\tend\n\n\t\tGhostFrame:ClearAllPoints()\n\t\tGhostFrame:SetPoint(\"TOP\", Minimap, \"BOTTOM\", 0, -5)\n\n\t\tif stArchaeologyFrame then\n\t\t\tstArchaeologyFrame:ClearAllPoints()\n\t\t\tstArchaeologyFrame:SetPoint(\"TOPRIGHT\", Minimap, \"BOTTOMRIGHT\", 2, -5)\n\t\tend\n\n\t\tif AutoButtonAnchor and not positionTable[AutoButtonAnchor:GetName()] then\n\t\t\tAutoButtonAnchor:ClearAllPoints()\n\t\t\tAutoButtonAnchor:SetPoint(\"TOPLEFT\", Minimap, \"BOTTOMLEFT\", -2, -27)\n\t\tend\n\n\t\tif AutoButtonAnchor and not positionTable[AutoButtonAnchor:GetName()] then\n\t\t\tAutoButtonAnchor:ClearAllPoints()\n\t\t\tAutoButtonAnchor:SetPoint(\"TOPLEFT\", Minimap, \"BOTTOMLEFT\", -2, -27)\n\t\tend\n\n\t\tif StuffingFrameBags and not positionTable[StuffingFrameBags:GetName()] then\n\t\t\tStuffingFrameBags:ClearAllPoints()\n\t\t\tStuffingFrameBags:SetPoint(\"BOTTOMRIGHT\", UIParent, \"BOTTOMRIGHT\", -21, 20)\n\t\tend\n\n\t\tif TTMenuBackground then\n\t\t\tTTMenuBackground:ClearAllPoints()\n\t\t\tTTMenuBackground:SetPoint(\"TOPRIGHT\", Minimap, \"BOTTOMRIGHT\", 2, -5)\n\n\t\t\tTTOpenMenuBackground:ClearAllPoints()\n\t\t\tTTOpenMenuBackground:SetPoint(\"TOP\", Minimap, \"BOTTOM\", 0, -5)\n\n\t\t\tTTMenuAddOnBackground:ClearAllPoints()\n\t\t\tTTMenuAddOnBackground:SetPoint(\"TOP\", TTMenuBackground, \"TOP\", 0, 0)\n\t\tend\n\tend)\nend"
  },
  {
    "path": "ShestakUI/Modules/Maps/MiniMapButtons.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.minimap.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tFarm mode for minimap(by Elv22)\n----------------------------------------------------------------------------------------\nT.FarmMode = false\nSlashCmdList.FARMMODE = function()\n\tif T.FarmMode == false then\n\t\tMinimapAnchor:SetSize(C.minimap.size * 1.65, C.minimap.size * 1.65)\n\t\tMinimap:SetSize(MinimapAnchor:GetWidth(), MinimapAnchor:GetWidth())\n\t\tT.FarmMode = true\n\telse\n\t\tMinimapAnchor:SetSize(C.minimap.size, C.minimap.size)\n\t\tMinimap:SetSize(MinimapAnchor:GetWidth(), MinimapAnchor:GetWidth())\n\t\tT.FarmMode = false\n\tend\nend\nSLASH_FARMMODE1 = \"/farmmode\"\nSLASH_FARMMODE2 = \"/афкььщву\"\nSLASH_FARMMODE3 = \"/fm\"\nSLASH_FARMMODE4 = \"/аь\"\n\n----------------------------------------------------------------------------------------\n--\tFarm mode mouseover button(by m2jest1c)\n----------------------------------------------------------------------------------------\nlocal farm = CreateFrame(\"Button\", \"FarmMode\", UIParent)\nfarm:SetTemplate(\"ClassColor\")\nif C.actionbar.toggle_mode == true then\n\tfarm:SetPoint(\"TOPLEFT\", Minimap, \"TOPRIGHT\", 3, -18)\nelse\n\tfarm:SetPoint(\"TOPLEFT\", Minimap, \"TOPRIGHT\", 3, 2)\nend\nfarm:SetSize(19, 19)\nfarm:SetAlpha(0)\n\nfarm.t = farm:CreateTexture(nil, \"OVERLAY\")\nfarm.t:SetTexture(\"Interface\\\\Icons\\\\inv_misc_map_01\")\nfarm.t:SetTexCoord(0.1, 0.9, 0.1, 0.9)\nfarm.t:SetPoint(\"TOPLEFT\", farm, 2, -2)\nfarm.t:SetPoint(\"BOTTOMRIGHT\", farm, -2, 2)\n\nfarm:SetScript(\"OnClick\", function()\n\tSlashCmdList.FARMMODE()\nend)\n\nfarm:SetScript(\"OnEnter\", function()\n\tfarm:FadeIn()\n\tGameTooltip:SetOwner(farm, \"ANCHOR_LEFT\")\n\tGameTooltip:AddLine(L_MINIMAP_FARM, 0.40, 0.78, 1)\n\tGameTooltip:Show()\nend)\n\nfarm:SetScript(\"OnLeave\", function()\n\tfarm:FadeOut()\n\tGameTooltip:Hide()\nend)"
  },
  {
    "path": "ShestakUI/Modules/Maps/ToggleMenu.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.minimap.enable ~= true or C.minimap.toggle_menu ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tToggle menu(by Hydra, Foof, Gorlasch and HyPeRnIcS)\n----------------------------------------------------------------------------------------\n-- Override prefix method to collapse addons\nC[\"toggleprefix\"] = {\n\t[\"DBM\"]\t\t\t= \"DBM-Core\",\n\t[\"ShestakUI\"]\t= \"ShestakUI\",\n\t[\"Auc-\"]\t\t= \"Auc-Advanced\",\n\t[\"!Swatter\"]\t= \"Auc-Advanced\",\n\t[\"BeanCounter\"]\t= \"Auc-Advanced\",\n\t[\"Enchantrix\"]\t= \"Auc-Advanced\",\n\t[\"Informant\"]\t= \"Auc-Advanced\",\n\t[\"SlideBar\"]\t= \"Auc-Advanced\",\n\t[\"Stubby\"]\t\t= \"Auc-Advanced\",\n}\n\n-- Define buttons in main menu and corresponding functions\nC[\"togglemainmenu\"] = {\n\t{\n\t\t[\"text\"] = CLOSE,\n\t\t[\"function\"] = function()\n\t\t\tToggleMenu_Toggle()\n\t\tend\n\t},\n\t{\n\t\t[\"text\"] = ADDONS,\n\t\t[\"function\"] = function()\n\t\t\tToggleFrame(TTMenuAddOnBackground)\n\t\t\tToggleFrame(TTMenuBackground)\n\t\tend\n\t},\n\t{\n\t\t[\"text\"] = HELP_LABEL,\n\t\t[\"function\"] = function()\n\t\t\tSlashCmdList.UIHELP()\n\t\tend\n\t},\n\t{\n\t\t[\"text\"] = RELOADUI,\n\t\t[\"function\"] = function()\n\t\t\tReloadUI()\n\t\tend\n\t},\n\t{\n\t\t[\"text\"] = \"Move UI\",\n\t\t[\"function\"] = function()\n\t\t\tSlashCmdList.MOVING()\n\t\tend\n\t},\n\t{\n\t\t[\"text\"] = \"Test UI\",\n\t\t[\"function\"] = function()\n\t\t\tif C.raidcooldown.enable == true then\n\t\t\t\tSlashCmdList.RaidCD()\n\t\t\tend\n\t\t\tif C.enemycooldown.enable == true then\n\t\t\t\tSlashCmdList.EnemyCD()\n\t\t\tend\n\t\t\tif C.pulsecooldown.enable == true then\n\t\t\t\tSlashCmdList.PulseCD()\n\t\t\tend\n\t\t\tif C.unitframe.enable == true then\n\t\t\t\tSlashCmdList.TEST_UF()\n\t\t\tend\n\t\t\tif C.loot.rolllootframe == true then\n\t\t\t\tSlashCmdList.TESTROLL()\n\t\t\tend\n\t\t\tif C.threat.enable == true then\n\t\t\t\tSlashCmdList.alThreat()\n\t\t\tend\n\t\t\tSlashCmdList.DBMTEST()\n\t\t\tSlashCmdList.TEST_EXTRABUTTON()\n\t\t\tSlashCmdList.TEST_ACHIEVEMENT()\n\t\t\t--SlashCmdList.GRIDONSCREEN()\n\t\tend\n\t},\n}\n\n-- Definde toggle functions\nC[\"toggleaddons\"] = {\n\t-- Damage Meters\n\t[\"alDamageMeter\"] = function()\n\t\tToggleFrame(alDamageMeterFrame)\n\tend,\n\t[\"Recount\"] = function()\n\t\tToggleFrame(Recount.MainWindow)\n\t\tRecount.RefreshMainWindow()\n\tend,\n\t[\"Skada\"] = function()\n\t\tSkada:ToggleWindow()\n\tend,\n\t[\"TinyDPS\"] = function()\n\t\tToggleFrame(tdpsFrame)\n\tend,\n\t-- Threat Meters\n\t[\"Omen\"] = function()\n\t\tToggleFrame(Omen.Anchor)\n\tend,\n\t-- Boss Addons\n\t[\"BigWigs\"] = function()\n\t\tSlashCmdList.BigWigs()\n\tend,\n\t[\"DBM-Core\"] = function()\n\t\tDBM:LoadGUI()\n\tend,\n\t[\"PhoenixStyle\"] = function()\n\t\tPS_MinimapButton:Click()\n\tend,\n\t[\"RaidAchievement\"] = function()\n\t\tRA_MinimapButton:Click()\n\tend,\n\t-- Other Addons\n\t[\"Archy\"] = function()\n\t\tToggleFrame(ArchyDigSiteFrame)\n\t\tToggleFrame(ArchyArtifactFrame)\n\tend,\n\t[\"AtlasLoot\"] = function()\n\t\tToggleFrame(AtlasLootDefaultFrame)\n\tend,\n\t[\"GatherMate2\"] = function()\n\t\tGatherMate2.db.profile[\"showMinimap\"] = not GatherMate2.db.profile[\"showMinimap\"]\n\t\tGatherMate2.db.profile[\"showWorldMap\"] = not GatherMate2.db.profile[\"showWorldMap\"]\n\t\tGatherMate2:GetModule(\"Config\"):UpdateConfig()\n\tend,\n\t[\"ShestakUI_Config\"] = function()\n\t\tSlashCmdList.CONFIG()\n\tend,\n\t[\"ACP\"] = function()\n\t\tToggleFrame(ACP_AddonList)\n\tend,\n\t[\"epgp\"] = function()\n\t\tEPGP:ToggleUI()\n\tend,\n\t[\"WIM\"] = function()\n\t\tWIM.ShowAllWindows()\n\tend,\n\t[\"!BaudErrorFrame\"] = function()\n\t\tSlashCmdList.BaudErrorFrame()\n\tend,\n}\n\n-- Button size\nlocal function buttonwidth(num)\n\treturn num * (C.minimap.size - 6)\nend\nlocal function buttonheight(num)\n\treturn num * 20\nend\nlocal function buttonspacing(num)\n\treturn num * 3\nend\nlocal function borderwidth(num)\n\treturn buttonwidth(num) + buttonspacing(num + 1)\nend\nlocal function borderheight(num)\n\treturn buttonheight(num) + buttonspacing(num + 1)\nend\nlocal defaultframelevel = 0\n\nlocal function updateTextures(button, checkable)\n\tif checkable then\n\t\tlocal texture = button:CreateTexture()\n\t\ttexture:SetColorTexture(1, 1, 1, 0.3)\n\t\ttexture:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\ttexture:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\t\tbutton:SetCheckedTexture(texture)\n\tend\n\tbutton:HookScript(\"OnEnter\", T.SetModifiedBackdrop)\n\tbutton:HookScript(\"OnLeave\", T.SetOriginalBackdrop)\nend\n\nlocal MenuBG = CreateFrame(\"Frame\", \"TTMenuBackground\", UIParent)\nMenuBG:CreatePanel(\"Transparent\", borderwidth(1), 1, \"BOTTOMRIGHT\", Minimap, \"TOPRIGHT\", 2, 3)\nMenuBG:SetFrameLevel(defaultframelevel)\nMenuBG:SetFrameStrata(\"MEDIUM\")\nMenuBG:EnableMouse(true)\nMenuBG:Hide()\n\nlocal AddonBG = CreateFrame(\"Frame\", \"TTMenuAddOnBackground\", UIParent)\nAddonBG:CreatePanel(\"Transparent\", borderwidth(1), 1, \"BOTTOMRIGHT\", MenuBG, \"BOTTOMRIGHT\", 0, 0)\nAddonBG:SetFrameLevel(defaultframelevel)\nAddonBG:SetFrameStrata(\"MEDIUM\")\nAddonBG:EnableMouse(true)\nAddonBG:Hide()\n\ntinsert(UISpecialFrames, \"TTMenuBackground\")\ntinsert(UISpecialFrames, \"TTMenuAddOnBackground\")\n\nfunction ToggleMenu_Toggle()\n\tif TTMenuAddOnBackground:IsShown() or TTMenuBackground:IsShown() then\n\t\tTTMenuAddOnBackground:Hide()\n\t\tTTMenuBackground:Hide()\n\telse\n\t\tTTMenuAddOnBackground:Show()\n\t\tTTOpenMenuBackground:FadeOut()\n\tend\nend\n\n-- Add slash command\nSLASH_UITOGGLEMENU1 = \"/ttm\"\nSlashCmdList.UITOGGLEMENU = ToggleMenu_Toggle\n\nlocal Text\nlocal mainmenusize\nlocal lastMainMenuEntryID\nlocal totalmainmenusize\nlocal function addMainMenuButtons(menuItems, menuName, menuBackground)\n\tlastMainMenuEntryID = 0\n\tmainmenusize = 0\n\n\tlocal function InsertButton(items, i, hide)\n\t\tif hide then\n\t\t\titems[i]:Hide()\n\t\telse\n\t\t\tlastMainMenuEntryID = i\n\t\t\tmainmenusize = mainmenusize + 1\n\t\tend\n\tend\n\n\tfor index, value in ipairs(C.togglemainmenu) do\n\t\tif value.text then\n\t\t\tmenuItems[index] = CreateFrame(\"Button\", menuName..index, menuBackground)\n\t\t\tmenuItems[index]:CreatePanel(\"Overlay\", buttonwidth(1), buttonheight(1), \"BOTTOM\", menuBackground, \"BOTTOM\", 0, buttonspacing(1))\n\t\t\tmenuItems[index]:SetFrameLevel(defaultframelevel + 1)\n\t\t\tmenuItems[index]:SetFrameStrata(\"MEDIUM\")\n\t\t\tif mainmenusize == 0 then\n\t\t\t\tmenuItems[index]:SetPoint(\"BOTTOMRIGHT\", menuBackground, \"BOTTOMRIGHT\", buttonspacing(-1), buttonspacing(-1))\n\t\t\telse\n\t\t\t\tmenuItems[index]:SetPoint(\"BOTTOM\", menuItems[lastMainMenuEntryID], \"TOP\", 0, buttonspacing(1))\n\t\t\tend\n\t\t\tmenuItems[index]:EnableMouse(true)\n\t\t\tmenuItems[index]:RegisterForClicks(\"AnyUp\")\n\t\t\tmenuItems[index]:SetScript(\"OnClick\", function() value[\"function\"]() end)\n\n\t\t\tText = menuItems[index]:CreateFontString(nil, \"OVERLAY\")\n\t\t\tText:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\t\tText:SetPoint(\"CENTER\", menuItems[index], 0, 0)\n\t\t\tText:SetText(value.text)\n\t\t\tText:SetWidth(buttonwidth(1) - buttonspacing(1))\n\t\t\tText:SetHeight(C.media.pixel_font_size)\n\n\t\t\tlocal hideItem = (value.text == ADDONS)\n\t\t\tInsertButton(menuItems, index, hideItem)\n\t\t\tupdateTextures(menuItems[index])\n\t\t\ttotalmainmenusize = index\n\t\tend\n\tend\nend\n\n-- Main buttons\nlocal menu = {}\naddMainMenuButtons(menu, \"Menu\", MenuBG)\nMenuBG:SetHeight(borderheight(mainmenusize))\n\nlocal addonmenuitems = {}\naddMainMenuButtons(addonmenuitems, \"AddonMenu\", AddonBG)\n\nlocal OpenMenuBG = CreateFrame(\"Button\", \"TTOpenMenuBackground\", UIParent)\nOpenMenuBG:CreatePanel(\"Overlay\", borderwidth(1), buttonheight(1) / 1.3, \"BOTTOM\", MenuBG, \"BOTTOM\", 0, 0)\nOpenMenuBG:EnableMouse(true)\nOpenMenuBG:RegisterForClicks(\"AnyUp\")\nOpenMenuBG:SetFrameLevel(defaultframelevel)\nOpenMenuBG:SetFrameStrata(\"MEDIUM\")\nOpenMenuBG:SetScript(\"OnMouseUp\", function()\n\tToggleMenu_Toggle()\n\tif (T.class == \"MAGE\" and T.level >= 11) and _G[\"TeleportMenu\"]:IsShown() then\n\t\t_G[\"TeleportMenu\"]:Hide()\n\tend\nend)\nOpenMenuBG:HookScript(\"OnEnter\", function(self)\n\tif (T.class == \"MAGE\" and T.level >= 11) and _G[\"TeleportMenu\"]:IsShown() then\n\telse\n\t\tself:FadeIn()\n\tend\nend)\nOpenMenuBG:HookScript(\"OnLeave\", function(self) self:FadeOut() end)\n\nText = OpenMenuBG:CreateFontString(nil, \"OVERLAY\")\nText:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\nText:SetPoint(\"CENTER\", OpenMenuBG, 0, 0)\nText:SetText(\"+ + +\")\nText:SetTextColor(0.3, 0.3, 0.9)\nTTOpenMenuBackground:FadeOut()\n\nlocal expandbutton = CreateFrame(\"Button\", \"AddonMenuExpandButton\", AddonBG)\nexpandbutton:CreatePanel(\"Overlay\", buttonwidth(1), buttonheight(1) / 2, \"TOP\", AddonBG, \"TOP\", 0, buttonspacing(-1))\nexpandbutton:EnableMouse(true)\nexpandbutton:RegisterForClicks(\"AnyUp\")\nexpandbutton:SetFrameLevel(defaultframelevel + 1)\nexpandbutton:SetFrameStrata(\"MEDIUM\")\nupdateTextures(expandbutton)\n\nText = expandbutton:CreateFontString(nil, \"OVERLAY\")\nText:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\nText:SetPoint(\"CENTER\", expandbutton, 0, 0)\nText:SetText(\"+ + +\")\nText:SetTextColor(0.3, 0.3, 0.9)\nexpandbutton.txt = Text\n\nlocal addonInfo\nlocal lastMainAddon = \"XYZNonExistantDummyAddon\"\nlocal menusize\nlocal lastMainAddonID = 0\nif not addonInfo then\n\taddonInfo = {{}}\n\tfor i = 1, GetNumAddOns() do\n\t\tlocal name, _, _, enabled = GetAddOnInfo(i)\n\t\tif name and enabled then\n\t\t\taddonInfo[i] = {[\"enabled\"] = true, [\"is_main\"] = false, collapsed = true, [\"parent\"] = i}\n\t\telse\n\t\t\taddonInfo[i] = {[\"enabled\"] = false, [\"is_main\"] = false, collapsed = true, [\"parent\"] = i}\n\t\tend\n\t\t-- Check special addon list first\n\t\tlocal addonFound = false\n\t\tfor key, value in pairs(C[\"toggleprefix\"]) do\n\t\t\tif strsub(name, 0, strlen(key)) == key then\n\t\t\t\taddonFound = true\n\t\t\t\tif name == value then\n\t\t\t\t\tlastMainAddon = name\n\t\t\t\t\tlastMainAddonID = i\n\t\t\t\t\taddonInfo[i].is_main = true\n\t\t\t\telse\n\t\t\t\t\taddonInfo[i].parent = lastMainAddonID\n\t\t\t\t\tfor j = 1, GetNumAddOns() do\n\t\t\t\t\t\tlocal name_j = GetAddOnInfo(j)\n\t\t\t\t\t\tif name_j == value then\n\t\t\t\t\t\t\taddonInfo[i].parent = j\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- Collapse addons with common prefix\n\t\tif not addonFound then\n\t\t\tif strsub(name, 0, strlen(lastMainAddon)) == lastMainAddon then\n\t\t\t\taddonInfo[lastMainAddonID].is_main = true\n\t\t\t\taddonInfo[i].parent = lastMainAddonID\n\t\t\telse\n\t\t\t\tlastMainAddon = name\n\t\t\t\tlastMainAddonID = i\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function addonEnableToggle(_, i)\n\tlocal was_enabled = addonInfo[i].enabled\n\tfor j = 1, GetNumAddOns() do\n\t\tif (addonInfo[j].parent == i and addonInfo[i].collapsed) or (i == j and not addonInfo[addonInfo[i].parent].collapsed) then\n\t\t\tif was_enabled then\n\t\t\t\tDisableAddOn(j)\n\t\t\telse\n\t\t\t\tEnableAddOn(j)\n\t\t\tend\n\t\t\taddonInfo[j].enabled = not was_enabled\n\t\tend\n\tend\nend\n\nlocal function addonFrameToggle(_, i)\n\tlocal name = GetAddOnInfo(i)\n\tif C.toggleaddons[name] then\n\t\tif IsAddOnLoaded(i) then\n\t\t\tC.toggleaddons[name]()\n\t\tend\n\tend\nend\n\nlocal addonToggleOnly = true\n\nlocal function refreshAddOnMenu()\n\tmenusize = mainmenusize\n\tfor i = 1, GetNumAddOns() do\n\t\tlocal name = GetAddOnInfo(i)\n\t\tif addonInfo[i].is_main or (addonInfo[i].parent == i) or not addonInfo[addonInfo[i].parent].collapsed then\n\t\t\tif not addonToggleOnly or (C.toggleaddons[name] and IsAddOnLoaded(i)) then\n\t\t\t\tmenusize = menusize + 1\n\t\t\tend\n\t\tend\n\tend\n\tlocal menuwidth = ceil(menusize / 25)\n\tlocal menuheight = ceil(menusize / menuwidth)\n\n\tlocal lastMenuEntryID = lastMainMenuEntryID\n\tmenusize = mainmenusize\n\tfor i = 1, GetNumAddOns() do\n\t\tlocal j = totalmainmenusize + i\n\t\tlocal name = GetAddOnInfo(i)\n\t\taddonmenuitems[j]:Hide()\n\t\tif addonInfo[i].is_main or addonInfo[i].parent == i or not addonInfo[addonInfo[i].parent].collapsed then\n\t\t\tif (not addonToggleOnly or (C.toggleaddons[name] and IsAddOnLoaded(i))) then\n\t\t\t\taddonmenuitems[j]:ClearAllPoints()\n\t\t\t\tif menusize % menuheight == 0 then\n\t\t\t\t\taddonmenuitems[j]:SetPoint(\"BOTTOMRIGHT\", addonmenuitems[lastMenuEntryID], \"BOTTOMLEFT\", buttonspacing(-1), (buttonheight(-menuheight + 1) + buttonspacing(-menuheight + 1)))\n\t\t\t\telse\n\t\t\t\t\taddonmenuitems[j]:SetPoint(\"BOTTOM\", addonmenuitems[lastMenuEntryID], \"TOP\", 0, buttonspacing(1))\n\t\t\t\tend\n\t\t\t\taddonmenuitems[j]:Show()\n\t\t\t\tlastMenuEntryID = j\n\t\t\t\tmenusize = menusize + 1\n\t\t\tend\n\t\tend\n\t\tif addonInfo[i].is_main then\n\t\t\tif addonToggleOnly then\n\t\t\t\taddonmenuitems[j].expandbtn:Hide()\n\t\t\telse\n\t\t\t\taddonmenuitems[j].expandbtn:Show()\n\t\t\tend\n\t\tend\n\tend\n\tAddonBG:SetHeight(borderheight(menuheight + 1) - buttonheight(1) / 2)\n\tAddonBG:SetWidth(borderwidth(menuwidth))\n\texpandbutton:SetWidth(buttonwidth(menuwidth) + buttonspacing(menuwidth - 1))\nend\n\nexpandbutton:SetScript(\"OnMouseUp\", function(self)\n\taddonToggleOnly = not addonToggleOnly\n\tif addonToggleOnly then\n\t\tself.txt:SetText(\"+ + +\")\n\t\tself.txt:SetTextColor(0.3, 0.3, 0.9)\n\telse\n\t\tself.txt:SetText(\"- - -\")\n\t\tself.txt:SetTextColor(0.9, 0.3, 0.3)\n\tend\n\trefreshAddOnMenu()\nend)\n\nfor i = 1, GetNumAddOns() do\n\tlocal j = totalmainmenusize + i\n\tlocal name = GetAddOnInfo(i)\n\taddonmenuitems[j] = CreateFrame(\"CheckButton\", \"AddonMenu\"..j, AddonBG)\n\taddonmenuitems[j]:CreatePanel(\"Overlay\", buttonwidth(1), buttonheight(1), \"BOTTOM\", AddonBG, \"BOTTOM\", 0, buttonspacing(1))\n\taddonmenuitems[j]:EnableMouse(true)\n\taddonmenuitems[j]:RegisterForClicks(\"AnyUp\")\n\taddonmenuitems[j]:SetFrameLevel(defaultframelevel + 1)\n\taddonmenuitems[j]:SetFrameStrata(\"MEDIUM\")\n\tupdateTextures(addonmenuitems[j], true)\n\n\taddonmenuitems[j]:SetChecked(not addonInfo[i].enabled)\n\taddonmenuitems[j]:SetScript(\"OnMouseUp\", function(self, btn)\n\t\tif btn == \"RightButton\" then\n\t\t\taddonEnableToggle(self, i)\n\t\telse\n\t\t\taddonFrameToggle(self, i)\n\t\t\tself:SetChecked(not self:GetChecked())\n\t\tend\n\tend)\n\taddonmenuitems[j]:HookScript(\"OnEnter\", function(self)\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_LEFT\")\n\t\tGameTooltip:AddLine(L_TOGGLE_ADDON..name)\n\t\tGameTooltip:AddLine(\"|cffffffff\"..L_TOGGLE_RCLICK..name..\"\\n\"..L_TOGGLE_RELOAD)\n\t\tif C.toggleaddons[name] then\n\t\t\tif IsAddOnLoaded(i) then\n\t\t\t\tGameTooltip:AddLine(\"|cffffffff\"..L_TOGGLE_LCLICK..name)\n\t\t\tend\n\t\tend\n\t\tGameTooltip:Show()\n\tend)\n\taddonmenuitems[j]:HookScript(\"OnLeave\", function()\n\t\tGameTooltip:Hide()\n\tend)\n\tText = addonmenuitems[j]:CreateFontString(nil, \"OVERLAY\")\n\tText:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tText:SetPoint(\"CENTER\", addonmenuitems[j], 1, 0)\n\tText:SetText(select(2, GetAddOnInfo(i)))\n\tText:SetWidth(buttonwidth(1) - buttonspacing(1))\n\tText:SetHeight(C.media.pixel_font_size)\n\tif addonInfo[i].is_main then\n\t\tlocal expandAddonButton = CreateFrame(\"Button\", \"AddonMenuExpand\"..j, addonmenuitems[j])\n\t\texpandAddonButton:CreatePanel(\"Overlay\", buttonheight(1) - 4, buttonheight(1) - 4, \"TOPLEFT\", addonmenuitems[j], \"TOPLEFT\", 2, -2)\n\t\texpandAddonButton:SetFrameLevel(defaultframelevel + 2)\n\t\texpandAddonButton:SetFrameStrata(\"MEDIUM\")\n\t\texpandAddonButton:EnableMouse(true)\n\t\texpandAddonButton:RegisterForClicks(\"AnyUp\")\n\t\tupdateTextures(expandAddonButton)\n\n\t\texpandAddonButton:HookScript(\"OnEnter\", function(self)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_LEFT\")\n\t\t\tif addonInfo[i].collapsed then\n\t\t\t\tGameTooltip:AddLine(L_TOGGLE_EXPAND..name..L_TOGGLE_ADDONS)\n\t\t\telse\n\t\t\t\tGameTooltip:AddLine(L_TOGGLE_COLLAPSE..name..L_TOGGLE_ADDONS)\n\t\t\tend\n\t\t\tGameTooltip:Show()\n\t\tend)\n\t\texpandAddonButton:HookScript(\"OnLeave\", function()\n\t\t\tGameTooltip:Hide()\n\t\tend)\n\n\t\tText = expandAddonButton:CreateFontString(nil, \"OVERLAY\")\n\t\tText:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\tText:SetPoint(\"CENTER\", expandAddonButton, 2, 0)\n\t\tText:SetText(\"+\")\n\t\tText:SetTextColor(0.3, 0.3, 0.9)\n\t\texpandAddonButton.txt = Text\n\t\texpandAddonButton:SetScript(\"OnMouseUp\", function(self)\n\t\t\taddonInfo[i].collapsed = not addonInfo[i].collapsed\n\t\t\tif addonInfo[i].collapsed then\n\t\t\t\tself.txt:SetText(\"+\")\n\t\t\t\tself.txt:SetTextColor(0.3, 0.3, 0.9)\n\t\t\telse\n\t\t\t\tself.txt:SetText(\"-\")\n\t\t\t\tself.txt:SetTextColor(0.9, 0.3, 0.3)\n\t\t\tend\n\t\t\trefreshAddOnMenu()\n\t\tend)\n\t\taddonmenuitems[j].expandbtn = expandAddonButton\n\tend\n\taddonmenuitems[j]:Hide()\nend\n\nrefreshAddOnMenu()\n\n----------------------------------------------------------------------------------------\n--\tReposition if minimap on top\n----------------------------------------------------------------------------------------\nif C.minimap.on_top then\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tframe:SetScript(\"OnEvent\", function()\n\t\tlocal _, y = Minimap:GetCenter()\n\t\tlocal vhalf = (y > UIParent:GetHeight() / 2) and \"TOP\" or \"BOTTOM\"\n\t\tif vhalf == \"TOP\" then\n\t\t\tMenuBG:ClearAllPoints()\n\t\t\tMenuBG:SetPoint(\"TOPRIGHT\", Minimap, \"BOTTOMRIGHT\", 2, -3)\n\n\t\t\tAddonBG:ClearAllPoints()\n\t\t\tAddonBG:SetPoint(\"TOPRIGHT\", MenuBG, \"TOPRIGHT\", 0, 0)\n\n\t\t\tOpenMenuBG:ClearAllPoints()\n\t\t\tOpenMenuBG:SetPoint(\"TOP\", MenuBG, \"TOP\", 0, 0)\n\t\tend\n\tend)\nend"
  },
  {
    "path": "ShestakUI/Modules/Maps/WorldMap.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tFont replacement\n----------------------------------------------------------------------------------------\nMapQuestInfoRewardsFrame.XPFrame.Name:SetFont(C.media.normal_font, 13, \"\")\n\n----------------------------------------------------------------------------------------\n--\tChange position\n----------------------------------------------------------------------------------------\nhooksecurefunc(WorldMapFrame, \"SynchronizeDisplayState\", function()\n\tif CharacterFrame:IsShown() or SpellBookFrame:IsShown() or (PlayerTalentFrame and PlayerTalentFrame:IsShown()) or (ChannelFrame and ChannelFrame:IsShown()) or PVEFrame:IsShown() or (MacroFrame and MacroFrame:IsShown()) or (GarrisonLandingPage and GarrisonLandingPage:IsShown()) then return end\n\tif not WorldMapFrame:IsMaximized() then\n\t\tWorldMapFrame:ClearAllPoints()\n\t\tWorldMapFrame:SetPoint(unpack(C.position.map))\n\tend\nend)\nWorldMapFrame:SetClampedToScreen(true)\n\n----------------------------------------------------------------------------------------\n--\tCount of quests\n----------------------------------------------------------------------------------------\nlocal maxQuest = 35\nlocal numQuest = CreateFrame(\"Frame\", nil, QuestMapFrame)\nnumQuest.text = numQuest:CreateFontString(nil, \"ARTWORK\", \"GameFontNormal\")\nnumQuest.text:SetPoint(\"TOP\", QuestMapFrame, \"TOP\", 0, -21)\nnumQuest.text:SetJustifyH(\"LEFT\")\nnumQuest.text:SetText(select(2, C_QuestLog.GetNumQuestLogEntries())..\"/\"..maxQuest)\n\n----------------------------------------------------------------------------------------\n--\tCreating coordinate\n----------------------------------------------------------------------------------------\nlocal coords = CreateFrame(\"Frame\", \"CoordsFrame\", WorldMapFrame)\ncoords:SetFrameLevel(WorldMapFrame.BorderFrame:GetFrameLevel() + 2)\ncoords:SetFrameStrata(WorldMapFrame.BorderFrame:GetFrameStrata())\n\ncoords.PlayerText = coords:CreateFontString(nil, \"ARTWORK\", \"GameFontNormal\")\ncoords.PlayerText:SetPoint(\"BOTTOMLEFT\", WorldMapFrame.ScrollContainer, \"BOTTOM\", -40, 20)\ncoords.PlayerText:SetJustifyH(\"LEFT\")\ncoords.PlayerText:SetText(UnitName(\"player\")..\": 0,0\")\n\ncoords.MouseText = coords:CreateFontString(nil, \"ARTWORK\", \"GameFontNormal\")\ncoords.MouseText:SetJustifyH(\"LEFT\")\ncoords.MouseText:SetPoint(\"BOTTOMLEFT\", coords.PlayerText, \"TOPLEFT\", 0, 5)\ncoords.MouseText:SetText(L_MAP_CURSOR..\": 0,0\")\n\nlocal mapRects, tempVec2D = {}, CreateVector2D(0, 0)\nlocal function GetPlayerMapPos(mapID)\n\ttempVec2D.x, tempVec2D.y = UnitPosition(\"player\")\n\tif not tempVec2D.x then return end\n\n\tlocal mapRect = mapRects[mapID]\n\tif not mapRect then\n\t\tlocal _, pos1 = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(0, 0))\n\t\tlocal _, pos2 = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(1, 1))\n\t\tif not pos1 or not pos2 then return end\n\t\tmapRect = {pos1, pos2}\n\t\tmapRect[2]:Subtract(mapRect[1])\n\t\tmapRects[mapID] = mapRect\n\tend\n\ttempVec2D:Subtract(mapRect[1])\n\n\treturn (tempVec2D.y/mapRect[2].y), (tempVec2D.x/mapRect[2].x)\nend\n\nlocal int = 0\nWorldMapFrame:HookScript(\"OnUpdate\", function()\n\tint = int + 1\n\tif int >= 3 then\n\t\tlocal unitMap = C_Map.GetBestMapForUnit(\"player\")\n\t\tlocal x, y = 0, 0\n\n\t\tif unitMap then\n\t\t\tx, y = GetPlayerMapPos(unitMap)\n\t\tend\n\n\t\tif x and y and x >= 0 and y >= 0 then\n\t\t\tcoords.PlayerText:SetFormattedText(\"%s: %.0f,%.0f\", T.name, x * 100, y * 100)\n\t\telse\n\t\t\tcoords.PlayerText:SetText(UnitName(\"player\")..\": \"..\"|cffff0000\"..L_MAP_BOUNDS..\"|r\")\n\t\tend\n\n\t\tif WorldMapFrame.ScrollContainer:IsMouseOver() then\n\t\t\tlocal mouseX, mouseY = WorldMapFrame.ScrollContainer:GetNormalizedCursorPosition()\n\t\t\tif mouseX and mouseY and mouseX >= 0 and mouseY >= 0 then\n\t\t\t\tcoords.MouseText:SetFormattedText(\"%s %.0f,%.0f\", L_MAP_CURSOR, mouseX * 100, mouseY * 100)\n\t\t\telse\n\t\t\t\tcoords.MouseText:SetText(L_MAP_CURSOR..\"|cffff0000\"..L_MAP_BOUNDS..\"|r\")\n\t\t\tend\n\t\telse\n\t\t\tcoords.MouseText:SetText(L_MAP_CURSOR..\"|cffff0000\"..L_MAP_BOUNDS..\"|r\")\n\t\tend\n\n\t\tnumQuest.text:SetText(select(2, C_QuestLog.GetNumQuestLogEntries())..\"/\"..maxQuest)\n\n\t\tint = 0\n\tend\nend)\n\ncoords:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\ncoords:SetScript(\"OnEvent\", function(self, event)\n\tself:UnregisterEvent(event)\n\tif ShestakUISettingsPerChar and ShestakUISettingsPerChar.Coords ~= true then\n\t\tcoords:SetAlpha(0)\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tAdded options to map tracking button\n----------------------------------------------------------------------------------------\nhooksecurefunc(WorldMapFrame.overlayFrames[2], \"InitializeDropDown\", function(self)\n\tUIDropDownMenu_AddSeparator()\n\tlocal info = UIDropDownMenu_CreateInfo()\n\n\tinfo.isTitle = true\n\tinfo.notCheckable = true\n\tinfo.text = \"ShestakUI\"\n\n\tUIDropDownMenu_AddButton(info)\n\tinfo.text = nil\n\n\tinfo.isTitle = nil\n\tinfo.disabled = nil\n\tinfo.notCheckable = nil\n\tinfo.isNotRadio = true\n\tinfo.keepShownOnClick = true\n\n\tinfo.text = L_MAP_COORDS\n\tinfo.checked = function()\n\t\treturn ShestakUISettingsPerChar.Coords == true\n\tend\n\n\tinfo.func = function()\n\t\tif ShestakUISettingsPerChar.Coords == true then\n\t\t\tShestakUISettingsPerChar.Coords = false\n\t\t\tcoords:SetAlpha(0)\n\t\telse\n\t\t\tShestakUISettingsPerChar.Coords = true\n\t\t\tcoords:SetAlpha(1)\n\t\tend\n\tend\n\tUIDropDownMenu_AddButton(info)\n\n\tif C.minimap.fog_of_war == true then\n\t\tinfo.text = L_MAP_FOG\n\t\tinfo.checked = function()\n\t\t\treturn ShestakUISettingsPerChar.FogOfWar == true\n\t\tend\n\n\t\tinfo.func = function()\n\t\t\tif ShestakUISettingsPerChar.FogOfWar == true then\n\t\t\t\tShestakUISettingsPerChar.FogOfWar = false\n\t\t\t\tfor i = 1, #T.overlayTextures do\n\t\t\t\t\tT.overlayTextures[i]:Hide()\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tShestakUISettingsPerChar.FogOfWar = true\n\t\t\t\tfor i = 1, #T.overlayTextures do\n\t\t\t\t\tT.overlayTextures[i]:Show()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tUIDropDownMenu_AddButton(info)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Misc/BattlefieldScore.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.stats.battleground ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBGScore(by Elv22, edited by Tukz)\n----------------------------------------------------------------------------------------\nlocal classcolor = (\"|cff%.2x%.2x%.2x\"):format(C.media.classborder_color[1] * 255, C.media.classborder_color[2] * 255, C.media.classborder_color[3] * 255)\n\nlocal BGFrame = CreateFrame(\"Frame\", \"InfoBattleGround\", UIParent)\nBGFrame:CreatePanel(\"Invisible\", 300, C.font.stats_font_size, unpack(C.position.bg_score))\nBGFrame:EnableMouse(true)\nBGFrame:SetScript(\"OnEnter\", function(self)\n\tlocal columns = C_PvP.GetMatchPVPStatColumns()\n\n\tfor i = 1, GetNumBattlefieldScores() do\n\t\tlocal name, _, honorableKills, deaths, _, _, _, _, _, damageDone, healingDone = GetBattlefieldScore(i)\n\t\tif name and name == T.name then\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_TOPLEFT\", 0, T.Scale(4))\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:SetPoint(\"BOTTOM\", self, \"TOP\", 0, 1)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tGameTooltip:AddDoubleLine(STATISTICS, classcolor..name..\"|r\")\n\t\t\tGameTooltip:AddLine(\" \")\n\t\t\tGameTooltip:AddDoubleLine(HONORABLE_KILLS..\":\", honorableKills, 1, 1, 1)\n\t\t\tGameTooltip:AddDoubleLine(DEATHS..\":\", deaths, 1, 1, 1)\n\t\t\tGameTooltip:AddDoubleLine(DAMAGE..\":\", T.ShortValue(damageDone), 1, 1, 1)\n\t\t\tGameTooltip:AddDoubleLine(SHOW_COMBAT_HEALING..\":\", T.ShortValue(healingDone), 1, 1, 1)\n\n\t\t\t-- Add extra statistics depending on what BG you are\n\t\t\tif columns then\n\t\t\t\tfor j, stat in ipairs(columns) do\n\t\t\t\t\tlocal name = stat.name\n\t\t\t\t\tif name and strlen(name) > 0 then\n\t\t\t\t\t\tGameTooltip:AddDoubleLine(name, GetBattlefieldStatData(i, j), 1, 1, 1)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\tGameTooltip:Show()\nend)\n\nBGFrame:SetScript(\"OnLeave\", function() GameTooltip:Hide() end)\nBGFrame:SetScript(\"OnMouseUp\", function(_, button)\n\tif QueueStatusButton:IsShown() then\n\t\tif button == \"RightButton\" then\n\t\t\tToggleBattlefieldMap()\n\t\telse\n\t\t\tTogglePVPScoreboardOrResults()\n\t\tend\n\tend\nend)\n\nlocal Stat = CreateFrame(\"Frame\")\nStat:EnableMouse(true)\n\nlocal Text1 = InfoBattleGround:CreateFontString(nil, \"OVERLAY\")\nText1:SetFont(C.font.stats_font, C.font.stats_font_size, C.font.stats_font_style)\nText1:SetShadowOffset(C.font.stats_font_shadow and 1 or 0, C.font.stats_font_shadow and -1 or 0)\nText1:SetPoint(\"LEFT\", 5, 0)\nText1:SetHeight(C.font.stats_font_size)\n\nlocal Text2 = InfoBattleGround:CreateFontString(nil, \"OVERLAY\")\nText2:SetFont(C.font.stats_font, C.font.stats_font_size, C.font.stats_font_style)\nText2:SetShadowOffset(C.font.stats_font_shadow and 1 or 0, C.font.stats_font_shadow and -1 or 0)\nText2:SetPoint(\"LEFT\", Text1, \"RIGHT\", 5, 0)\nText2:SetHeight(C.font.stats_font_size)\n\nlocal Text3 = InfoBattleGround:CreateFontString(nil, \"OVERLAY\")\nText3:SetFont(C.font.stats_font, C.font.stats_font_size, C.font.stats_font_style)\nText3:SetShadowOffset(C.font.stats_font_shadow and 1 or 0, C.font.stats_font_shadow and -1 or 0)\nText3:SetPoint(\"LEFT\", Text2, \"RIGHT\", 5, 0)\nText3:SetHeight(C.font.stats_font_size)\n\nlocal int = 2\nlocal function Update(_, t)\n\tint = int - t\n\tif int < 0 then\n\t\tlocal dmgtxt\n\t\tRequestBattlefieldScoreData()\n\t\tfor i = 1, GetNumBattlefieldScores() do\n\t\t\tlocal name, killingBlows, _, _, honorGained, _, _, _, _, damageDone, healingDone = GetBattlefieldScore(i)\n\t\t\tif name and name == T.name then\n\t\t\t\tif healingDone > damageDone then\n\t\t\t\t\tdmgtxt = (classcolor..SHOW_COMBAT_HEALING..\" :|r \"..T.ShortValue(healingDone))\n\t\t\t\telse\n\t\t\t\t\tdmgtxt = (classcolor..DAMAGE..\" :|r \"..T.ShortValue(damageDone))\n\t\t\t\tend\n\t\t\t\tText1:SetText(dmgtxt)\n\t\t\t\tText2:SetText(classcolor..COMBAT_HONOR_GAIN..\" :|r \"..format(\"%d\", honorGained))\n\t\t\t\tText3:SetText(classcolor..KILLING_BLOWS..\" :|r \"..killingBlows)\n\t\t\tend\n\t\tend\n\t\tint = 2\n\tend\nend\n\n-- Hide text when not in an bg\nlocal function OnEvent(_, event)\n\tif event == \"PLAYER_ENTERING_WORLD\" then\n\t\tlocal _, instanceType = IsInInstance()\n\t\tif instanceType == \"pvp\" then\n\t\t\tBGFrame:Show()\n\t\telse\n\t\t\tText1:SetText(\"\")\n\t\t\tText2:SetText(\"\")\n\t\t\tText3:SetText(\"\")\n\t\t\tBGFrame:Hide()\n\t\tend\n\tend\nend\n\nStat:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nStat:SetScript(\"OnEvent\", OnEvent)\nStat:SetScript(\"OnUpdate\", Update)\nUpdate(Stat, 2)"
  },
  {
    "path": "ShestakUI/Modules/Misc/CharsCurrency.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.misc.chars_currency ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTracks your currency tokens across multiple characters(Exonumist by Phanx)\n----------------------------------------------------------------------------------------\nlocal realmDB, charDB\nlocal faction = UnitFactionGroup(\"player\")\nlocal playerList = {}\nlocal classColor = {}\nlocal nameToID = {}\nlocal collapsed = {}\n\nlocal function UpdateData()\n\tif TokenFrame:IsVisible() then\n\t\treturn\n\tend\n\tlocal i, limit = 1, C_CurrencyInfo.GetCurrencyListSize()\n\twhile i <= limit do\n\t\tlocal info = C_CurrencyInfo.GetCurrencyListInfo(i)\n\t\tlocal name, isHeader, isExpanded, count = info.name, info.isHeader, info.isHeaderExpanded, info.quantity\n\t\tif isHeader then\n\t\t\tif not isExpanded then\n\t\t\t\tcollapsed[name] = true\n\t\t\t\tC_CurrencyInfo.ExpandCurrencyList(i, 1)\n\t\t\t\tlimit = C_CurrencyInfo.GetCurrencyListSize()\n\t\t\tend\n\t\telse\n\t\t\tlocal link = C_CurrencyInfo.GetCurrencyListLink(i)\n\t\t\tlocal id = tonumber(strmatch(link, \"currency:(%d+)\"))\n\t\t\tnameToID[name] = id\n\t\t\tif count > 0 then\n\t\t\t\tcharDB[id] = count\n\t\t\telse\n\t\t\t\tcharDB[id] = nil\n\t\t\tend\n\t\tend\n\t\ti = i + 1\n\tend\n\twhile i > 0 do\n\t\tlocal info = C_CurrencyInfo.GetCurrencyListInfo(i)\n\t\tif info then\n\t\t\tlocal name, isHeader, isExpanded = info.name, info.isHeader, info.isHeaderExpanded\n\t\t\tif isHeader and isExpanded and collapsed[name] then\n\t\t\t\tC_CurrencyInfo.ExpandCurrencyList(i, 0)\n\t\t\tend\n\t\tend\n\t\ti = i - 1\n\tend\n\twipe(collapsed)\nend\nhooksecurefunc(BackpackTokenFrame, \"Update\", UpdateData)\nhooksecurefunc(\"TokenFrame_Update\", UpdateData)\n\nlocal function AddTooltipInfo(tooltip, currency, includePlayer)\n\tlocal spaced\n\tfor i = (includePlayer and 1 or 2), #playerList do\n\t\tlocal name = playerList[i]\n\t\tlocal n = realmDB[name][currency]\n\t\tif n then\n\t\t\tif not spaced then\n\t\t\t\ttooltip:AddLine(\" \")\n\t\t\t\tspaced = true\n\t\t\tend\n\t\t\tlocal r, g, b\n\t\t\tlocal class = realmDB[name].class\n\t\t\tif class then\n\t\t\t\tr, g, b = unpack(classColor[class])\n\t\t\telse\n\t\t\t\tr, g, b = 1, 1, 1\n\t\t\tend\n\t\t\ttooltip:AddLine(name..\": \"..n, r, g, b)\n\t\tend\n\tend\n\tif spaced then\n\t\ttooltip:Show()\n\tend\nend\n\nhooksecurefunc(GameTooltip, \"SetCurrencyByID\", function(tooltip, id)\n\tAddTooltipInfo(tooltip, id, not MerchantMoneyInset:IsMouseOver())\nend)\n\nhooksecurefunc(GameTooltip, \"SetCurrencyToken\", function(_, i)\n\tlocal info = C_CurrencyInfo.GetCurrencyListInfo(i)\n\tif info.name then\n\t\tAddTooltipInfo(GameTooltip, nameToID[info.name], not TokenFrame:IsMouseOver())\n\tend\nend)\n\nhooksecurefunc(GameTooltip, \"SetHyperlink\", function(tooltip, link)\n\tlocal id = strmatch(link, \"currency:(%d+)\")\n\tif id then\n\t\tAddTooltipInfo(tooltip, tonumber(id), true)\n\tend\nend)\n\nhooksecurefunc(ItemRefTooltip, \"SetHyperlink\", function(tooltip, link)\n\tlocal id = strmatch(link, \"currency:(%d+)\")\n\tif id then\n\t\tAddTooltipInfo(tooltip, tonumber(id), true)\n\tend\nend)\n\nhooksecurefunc(GameTooltip, \"SetMerchantCostItem\", function(tooltip, item, currency)\n\tlocal _, _, _, name = GetMerchantItemCostItem(item, currency)\n\tif name then\n\t\tAddTooltipInfo(tooltip, nameToID[name], true)\n\tend\nend)\n\nhooksecurefunc(GameTooltip, \"SetLFGDungeonReward\", function(tooltip, dungeonID, rewardIndex)\n\tlocal name = GetLFGDungeonRewardInfo(dungeonID, rewardIndex)\n\tif name then\n\t\tAddTooltipInfo(tooltip, nameToID[name], true)\n\tend\nend)\n\nhooksecurefunc(GameTooltip, \"SetLFGDungeonShortageReward\", function(tooltip, dungeonID, shortageIndex, rewardIndex)\n\tlocal name = GetLFGDungeonShortageRewardInfo(dungeonID, shortageIndex, rewardIndex)\n\tif name then\n\t\tAddTooltipInfo(tooltip, nameToID[name], true)\n\tend\nend)\n\nhooksecurefunc(GameTooltip, \"SetQuestCurrency\", function(tooltip, type, id)\n\tlocal name = GetQuestCurrencyInfo(type, id)\n\tif name then\n\t\tAddTooltipInfo(tooltip, nameToID[name], true)\n\tend\nend)\n\nhooksecurefunc(GameTooltip, \"SetQuestLogCurrency\", function(tooltip, type, id)\n\tlocal name = GetQuestCurrencyInfo(type, id)\n\tif name then\n\t\tAddTooltipInfo(tooltip, nameToID[name], true)\n\tend\nend)\n\nif xMerchantFrame then\n\tlocal function xMerchantTooltip(self)\n\t\tif self.pointType == \"Beta\" then\n\t\t\tlocal id = nameToID[self.itemLink]\n\t\t\tif id then\n\t\t\t\tself.UpdateTooltip = nil\n\t\t\t\treturn GameTooltip:SetCurrencyByID(id)\n\t\t\tend\n\t\tend\n\t\tself.UpdateTooltip = self.origUpdateTooltip\n\tend\n\n\tfor i = 1, 10 do\n\t\tfor j = 1, MAX_ITEM_COST do\n\t\t\tlocal item = _G[\"xMerchantFrame\"..i..\"Item\"..j]\n\t\t\titem:HookScript(\"OnEnter\", xMerchantTooltip)\n\t\t\titem.origUpdateTooltip = item.UpdateTooltip\n\t\tend\n\tend\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function(self, event, addon)\n\tif event == \"ADDON_LOADED\" then\n\t\tif addon ~= \"ShestakUI\" then return end\n\n\t\tif faction ~= \"Alliance\" and faction ~= \"Horde\" then return end\n\n\t\tShestakUICurrency = ShestakUICurrency or {}\n\t\tShestakUICurrency[T.realm] = ShestakUICurrency[T.realm] or {}\n\t\tShestakUICurrency[T.realm][faction] = ShestakUICurrency[T.realm][faction] or {}\n\t\tShestakUICurrency[T.realm][faction][T.name] = ShestakUICurrency[T.realm][faction][T.name] or {}\n\n\t\trealmDB = ShestakUICurrency[T.realm][faction]\n\t\tif not realmDB then return end\n\n\t\tcharDB = realmDB[T.name]\n\n\t\tlocal now = time()\n\t\tcharDB.class = select(2, UnitClass(\"player\"))\n\t\tcharDB.lastSeen = now\n\n\t\tlocal cutoff = now - (60 * 60 * 24 * 30)\n\t\tfor name, data in pairs(realmDB) do\n\t\t\tif data.lastSeen and data.lastSeen < cutoff then\n\t\t\t\trealmDB[name] = nil\n\t\t\telseif name ~= T.name then\n\t\t\t\ttinsert(playerList, name)\n\t\t\tend\n\t\tend\n\t\tsort(playerList)\n\t\ttinsert(playerList, 1, T.name)\n\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\n\t\tif IsLoggedIn() then\n\t\t\tself:GetScript(\"OnEvent\")(self, \"PLAYER_LOGIN\")\n\t\telse\n\t\t\tself:RegisterEvent(\"PLAYER_LOGIN\")\n\t\tend\n\telseif event == \"PLAYER_LOGIN\" then\n\t\tfor k, v in pairs(CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS) do\n\t\t\tclassColor[k] = {v.r, v.g, v.b}\n\t\tend\n\t\tif CUSTOM_CLASS_COLORS then\n\t\t\tCUSTOM_CLASS_COLORS:RegisterCallback(function()\n\t\t\t\tfor k, v in pairs(CUSTOM_CLASS_COLORS) do\n\t\t\t\t\tclassColor[k][1] = v.r\n\t\t\t\t\tclassColor[k][2] = v.g\n\t\t\t\t\tclassColor[k][3] = v.b\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\t\tself:UnregisterEvent(\"PLAYER_LOGIN\")\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Misc/ClickCast.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.misc.click_cast ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSimple click2cast spell binder(sBinder by Fernir)\n----------------------------------------------------------------------------------------\nlocal SpellBinder = CreateFrame(\"Frame\", \"SpellBinder\", SpellBookFrame, \"ButtonFrameTemplate\")\nSpellBinder:SetPoint(\"TOPLEFT\", SpellBookFrame, \"TOPRIGHT\", 100, -1)\nSpellBinder:SetSize(300, 400)\nSpellBinder:Hide()\n\nSpellBinderPortrait:SetAlpha(0)\n\nSpellBinder.title = _G[\"SpellBinderTitle\"] or SpellBinder:CreateFontString(\"SpellBinderTitle\", \"OVERLAY\", \"GameFontNormal\")\nSpellBinder.title:SetPoint(\"TOP\", _G[\"SpellBinder\"], \"TOP\", 0, -5)\nSpellBinder.title:SetText(L_MISC_BINDER_OPEN)\n\nSpellBinder.sbOpen = false\nSpellBinder.spellbuttons = {}\n\nlocal DB\nClickCastFrames = _G.ClickCastFrames or {}\nfor _, v in pairs({\n\t\"PlayerFrame\", \"PetFrame\",\n\t-- Party members\n\t\"PartyMemberFrame1\", \"PartyMemberFrame2\", \"PartyMemberFrame3\", \"PartyMemberFrame4\", \"PartyMemberFrame5\",\n\t-- Party pets\n\t\"PartyMemberFrame1PetFrame\", \"PartyMemberFrame2PetFrame\", \"PartyMemberFrame3PetFrame\", \"PartyMemberFrame4PetFrame\", \"PartyMemberFrame5PetFrame\",\n\t-- Compact party member frame\n\t\"CompactPartyFrameMemberSelf\", \"CompactPartyFrameMemberSelfBuff1\", \"CompactPartyFrameMemberSelfBuff2\", \"CompactPartyFrameMemberSelfBuff3\", \"CompactPartyFrameMemberSelfDebuff1\", \"CompactPartyFrameMemberSelfDebuff2\", \"CompactPartyFrameMemberSelfDebuff3\",\n\t\"CompactPartyFrameMember1Buff1\", \"CompactPartyFrameMember1Buff2\", \"CompactPartyFrameMember1Buff3\", \"CompactPartyFrameMember1Debuff1\", \"CompactPartyFrameMember1Debuff2\", \"CompactPartyFrameMember1Debuff3\",\n\t\"CompactPartyFrameMember2Buff1\", \"CompactPartyFrameMember2Buff2\", \"CompactPartyFrameMember2Buff3\", \"CompactPartyFrameMember2Debuff1\", \"CompactPartyFrameMember2Debuff2\", \"CompactPartyFrameMember2Debuff3\",\n\t\"CompactPartyFrameMember3Buff1\", \"CompactPartyFrameMember3Buff2\", \"CompactPartyFrameMember3Buff3\", \"CompactPartyFrameMember3Debuff1\", \"CompactPartyFrameMember3Debuff2\", \"CompactPartyFrameMember3Debuff3\",\n\t\"CompactPartyFrameMember4Buff1\", \"CompactPartyFrameMember4Buff2\", \"CompactPartyFrameMember4Buff3\", \"CompactPartyFrameMember4Debuff1\", \"CompactPartyFrameMember4Debuff2\", \"CompactPartyFrameMember4Debuff3\",\n\t\"CompactPartyFrameMember5Buff1\", \"CompactPartyFrameMember5Buff2\", \"CompactPartyFrameMember5Buff3\", \"CompactPartyFrameMember5Debuff1\", \"CompactPartyFrameMember5Debuff2\", \"CompactPartyFrameMember5Debuff3\",\n\t-- Target and focus frames\n\t\"TargetFrame\", \"TargetFrameToT\",\n\t\"FocusFrame\", \"FocusFrameToT\",\n\t-- Boss and arena frames\n\t\"Boss1TargetFrame\", \"Boss2TargetFrame\", \"Boss3TargetFrame\", \"Boss4TargetFrame\",\n\t\"ArenaEnemyFrame1\", \"ArenaEnemyFrame2\", \"ArenaEnemyFrame3\", \"ArenaEnemyFrame4\", \"ArenaEnemyFrame5\",\n}) do\n\tif _G[v] then ClickCastFrames[_G[v]] = true end\nend\n\nhooksecurefunc(\"CreateFrame\", function(_, name, _, template)\n\tif template and template:find(\"SecureUnitButtonTemplate\") then\n\t\tClickCastFrames[_G[name]] = true\n\tend\nend)\n\nhooksecurefunc(\"CompactUnitFrame_SetUpFrame\", function(frame)\n\tif frame.IsForbidden and frame:IsForbidden() then\n\t\treturn\n\tend\n\tClickCastFrames[frame] = true\nend)\n\nlocal ScrollSpells = CreateFrame(\"ScrollFrame\", \"SpellBinderScrollFrameSpellList\", _G[\"SpellBinderInset\"], \"UIPanelScrollFrameTemplate\")\nScrollSpells:SetPoint(\"TOPLEFT\", _G[\"SpellBinderInset\"], \"TOPLEFT\", 0, -5)\nScrollSpells:SetPoint(\"BOTTOMRIGHT\", _G[\"SpellBinderInset\"], \"BOTTOMRIGHT\", -30, 5)\nScrollSpells.child = CreateFrame(\"Frame\", \"SpellBinderScrollFrameSpellListChild\", ScrollSpells)\nScrollSpells.child:SetSize(270, 300)\nScrollSpells:SetScrollChild(ScrollSpells.child)\n\nSpellBinder.makeSpellsList = function(_, delete)\n\tlocal oldb\n\tlocal scroll = ScrollSpells.child\n\n\tif delete then\n\t\tlocal i = 1\n\t\twhile _G[\"SpellBinder\"..i..\"_cbs\"] do\n\t\t\t_G[\"SpellBinder\"..i..\"_fs\"]:SetText(\"\")\n\t\t\t_G[\"SpellBinder\"..i..\"_texture\"]:SetTexture(nil)\n\t\t\t_G[\"SpellBinder\"..i..\"_cbs\"].checked = false\n\t\t\t_G[\"SpellBinder\"..i..\"_cbs\"]:ClearAllPoints()\n\t\t\t_G[\"SpellBinder\"..i..\"_cbs\"]:Hide()\n\t\t\ti = i + 1\n\t\tend\n\tend\n\n\tfor i, spell in ipairs(DB.spells) do\n\t\tlocal v = spell.spell\n\t\tif v then\n\t\t\tlocal bf = _G[\"SpellBinder\"..i..\"_cbs\"] or CreateFrame(\"Button\", \"SpellBinder\"..i..\"_cbs\", scroll, \"BackdropTemplate\")\n\t\t\tspell.checked = spell.checked or false\n\n\t\t\tif i == 1 then\n\t\t\t\tbf:SetPoint(\"TOPLEFT\", scroll, \"TOPLEFT\", 10, -10)\n\t\t\t\tbf:SetPoint(\"BOTTOMRIGHT\", scroll, \"TOPRIGHT\", -10, -34)\n\t\t\telse\n\t\t\t\tbf:SetPoint(\"TOPLEFT\", oldb, \"BOTTOMLEFT\", 0, -2)\n\t\t\t\tbf:SetPoint(\"BOTTOMRIGHT\", oldb, \"BOTTOMRIGHT\", 0, -26)\n\t\t\tend\n\n\t\t\tbf:EnableMouse(true)\n\n\t\t\tbf.tex = bf.tex or bf:CreateTexture(\"SpellBinder\"..i..\"_texture\", \"OVERLAY\")\n\t\t\tbf.tex:SetSize(22, 22)\n\t\t\tbf.tex:SetPoint(\"LEFT\")\n\t\t\tbf.tex:SetTexture(spell.texture)\n\t\t\tif IsAddOnLoaded(\"Aurora\") or C.skins.blizzard_frames == true then\n\t\t\t\tbf.tex:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tend\n\n\t\t\tbf.delete = bf.delete or CreateFrame(\"Button\", \"SpellBinder\"..i..\"_delete\", bf)\n\t\t\tbf.delete:SetSize(16, 16)\n\t\t\tbf.delete:SetPoint(\"RIGHT\")\n\t\t\tbf.delete:SetNormalTexture(\"Interface\\\\BUTTONS\\\\UI-GroupLoot-Pass-Up\")\n\t\t\tbf.delete:GetNormalTexture():SetVertexColor(0.8, 0, 0)\n\t\t\tbf.delete:SetPushedTexture(\"Interface\\\\BUTTONS\\\\UI-GroupLoot-Pass-Up\")\n\t\t\tbf.delete:SetHighlightTexture(\"Interface\\\\BUTTONS\\\\UI-GroupLoot-Pass-Up\")\n\t\t\tbf.delete:SetScript(\"OnClick\", function()\n\t\t\t\tfor j, k in ipairs(DB.spells) do\n\t\t\t\t\tif k ~= spell then\n\t\t\t\t\t\tk.checked = false\n\t\t\t\t\t\t_G[\"SpellBinder\"..j..\"_cbs\"]:SetBackdropColor(0, 0, 0, 0)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tspell.checked = not spell.checked\n\t\t\t\tSpellBinder.DeleteSpell()\n\t\t\tend)\n\n\t\t\tbf:SetScript(\"OnEnter\", function(self) bf.delete:GetNormalTexture():SetVertexColor(1, 0, 0) self:SetBackdrop({bgFile = \"Interface\\\\Buttons\\\\WHITE8x8\"}) self:SetBackdropColor(0.2, 0.2, 0.2, 0.7) end)\n\t\t\tbf:SetScript(\"OnLeave\", function(self) bf.delete:GetNormalTexture():SetVertexColor(0.8, 0, 0) self:SetBackdrop(nil) end)\n\n\t\t\tbf.fs = bf.fs or bf:CreateFontString(\"SpellBinder\"..i..\"_fs\", \"OVERLAY\", \"GameFontNormal\")\n\t\t\tbf.fs:SetText(spell.modifier..spell.origbutton)\n\t\t\tbf.fs:SetPoint(\"RIGHT\", bf.delete, \"LEFT\", -4, 0)\n\n\t\t\tif GetSpellInfo(v) then\n\t\t\t\tbf:SetAlpha(1)\n\t\t\t\tfor frame in pairs(ClickCastFrames) do\n\t\t\t\t\tlocal f\n\t\t\t\t\tif frame and type(frame) == \"table\" then f = frame:GetName() end\n\t\t\t\t\tif f and SpellBinder.frames[frame] then\n\t\t\t\t\t\tif _G[f]:CanChangeAttribute() or _G[f]:CanChangeProtectedState() then\n\t\t\t\t\t\t\tif _G[f]:GetAttribute(spell.modifier..\"type\"..spell.button) ~= \"menu\" then\n\t\t\t\t\t\t\t\t_G[f]:RegisterForClicks(\"AnyDown\")\n\n\t\t\t\t\t\t\t\tif spell.button:find(\"harmbutton\") then\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..spell.button, spell.spell)\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"type-\"..spell.spell, \"spell\")\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"spell-\"..spell.spell, spell.spell)\n\n\t\t\t\t\t\t\t\t\tDB.keys[spell.modifier..spell.button] = spell.spell\n\t\t\t\t\t\t\t\t\tDB.keys[spell.modifier..\"type-\"..spell.spell] = \"spell\"\n\t\t\t\t\t\t\t\t\tDB.keys[spell.modifier..\"spell-\"..spell.spell] = spell.spell\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"type\"..spell.button, \"spell\")\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"spell\"..spell.button, spell.spell)\n\n\t\t\t\t\t\t\t\t\tDB.keys[spell.modifier..\"type\"..spell.button] = \"spell\"\n\t\t\t\t\t\t\t\t\tDB.keys[spell.modifier..\"spell\"..spell.button] = spell.spell\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tbf:SetAlpha(0.3)\n\t\t\tend\n\n\t\t\tbf:Show()\n\t\t\toldb = bf\n\t\tend\n\tend\nend\n\nSpellBinder.makeFramesList = function()\n\tfor frame in pairs(ClickCastFrames) do\n\t\tlocal v\n\t\tif frame and type(frame) == \"table\" then v = frame:GetName() end\n\t\tif C.misc.click_cast_filter ~= true then\n\t\t\tif v then SpellBinder.frames[frame] = SpellBinder.frames[frame] or true end\n\t\telse\n\t\t\tif v ~= \"oUF_Target\" and v ~= \"oUF_Player\" then SpellBinder.frames[frame] = SpellBinder.frames[frame] or true end\n\t\tend\n\tend\nend\n\nSpellBinder.ToggleButtons = function()\n\tfor i = 1, SPELLS_PER_PAGE do\n\t\tSpellBinder.spellbuttons[i]:Hide()\n\t\tif SpellBinder.sbOpen and SpellBookFrame.bookType ~= BOOKTYPE_PROFESSION then\n\t\t\tlocal slot = SpellBook_GetSpellBookSlot(SpellBinder.spellbuttons[i]:GetParent())\n\t\t\tif slot then\n\t\t\t\tlocal spellname = GetSpellBookItemName(slot, SpellBookFrame.bookType)\n\t\t\t\tif spellname then\n\t\t\t\t\tSpellBinder.spellbuttons[i]:Show()\n\t\t\t\t\tAutoCastShine_AutoCastStart(SpellBinder.spellbuttons[i])\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\tSpellBinder:makeFramesList()\n\tSpellBinder:makeSpellsList(true)\n\tif SpellBinder:IsVisible() then SpellBinder.OpenButton:SetChecked(true) else SpellBinder.OpenButton:SetChecked(false) end\nend\n\nhooksecurefunc(\"SpellBookFrame_Update\", function() if SpellBinder.sbOpen then SpellBinder:ToggleButtons() end end)\n\nSpellBinder.OpenButton = CreateFrame(\"CheckButton\", \"SpellBinderOpenButton\", _G[\"SpellBookSkillLineTab1\"], \"SpellBookSkillLineTabTemplate\")\nSpellBinder.OpenButton:SetNormalTexture(\"Interface\\\\ICONS\\\\Achievement_Guild_Doctorisin\")\n\nSpellBinder.OpenButton:SetScript(\"OnShow\", function(self)\n\tif SpellBinder:IsVisible() then self:SetChecked(true) end\n\tlocal num = GetNumSpellTabs()\n\tlocal lastTab = _G[\"SpellBookSkillLineTab\"..num]\n\n\tself:ClearAllPoints()\n\tself:SetPoint(\"TOPLEFT\", lastTab, \"BOTTOMLEFT\", 0, -17)\n\n\tself:SetScript(\"OnEnter\", function(self) GameTooltip:ClearLines() GameTooltip:SetOwner(self, \"ANCHOR_RIGHT\") GameTooltip:AddLine(L_MISC_BINDER_OPEN) GameTooltip:Show() end)\n\tself:SetScript(\"OnLeave\", function() GameTooltip:Hide() end)\nend)\n\nSpellBinder.OpenButton:SetScript(\"OnClick\", function()\n\tif InCombatLockdown() then SpellBinder:Hide() return end\n\tif SpellBinder:IsVisible() then\n\t\tSpellBinder:Hide()\n\t\tSpellBinder.sbOpen = false\n\telse\n\t\tSpellBinder:Show()\n\t\tSpellBinder.sbOpen = true\n\tend\n\tSpellBinder:ToggleButtons()\nend)\nSpellBinder.OpenButton:Show()\n\n_G[\"SpellBinderCloseButton\"]:SetScript(\"OnClick\", function()\n\tSpellBinder:Hide()\n\tSpellBinder.sbOpen = false\n\tSpellBinder:ToggleButtons()\nend)\n\nhooksecurefunc(SpellBookFrame, \"Hide\", function()\n\tSpellBinder:Hide()\n\tSpellBinder.sbOpen = false\n\tSpellBinder:ToggleButtons()\nend)\n\nSpellBinder.DeleteSpell = function()\n\tfor i, spell in ipairs(DB.spells) do\n\t\tif spell.checked then\n\t\t\tfor frame in pairs(ClickCastFrames) do\n\t\t\t\tlocal f\n\t\t\t\tif frame and type(frame) == \"table\" then f = frame:GetName() end\n\t\t\t\tif f then\n\t\t\t\t\tif _G[f]:CanChangeAttribute() or _G[f]:CanChangeProtectedState() then\n\t\t\t\t\t\tif _G[f]:GetAttribute(spell.modifier..\"type\"..spell.button) ~= \"menu\" then\n\t\t\t\t\t\t\tif spell.button:find(\"harmbutton\") then\n\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..spell.button, nil)\n\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"type-\"..spell.spell, nil)\n\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"spell-\"..spell.spell, nil)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"type\"..spell.button, nil)\n\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"spell\"..spell.button, nil)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\ttremove(DB.spells, i)\n\t\tend\n\tend\n\tSpellBinder:makeSpellsList(true)\nend\n\nlocal addSpell = function(self, button)\n\tif SpellBinder.sbOpen then\n\t\tlocal slot = SpellBook_GetSpellBookSlot(self:GetParent())\n\t\tlocal spellname = GetSpellBookItemName(slot, SpellBookFrame.bookType)\n\t\tlocal texture = GetSpellBookItemTexture(slot, SpellBookFrame.bookType)\n\n\t\tif spellname ~= 0 and ((SpellBookFrame.bookType == BOOKTYPE_PET) or (SpellBookFrame.selectedSkillLine > 1)) then\n\t\t\tlocal originalbutton = button\n\t\t\tlocal modifier = \"\"\n\n\t\t\tif IsShiftKeyDown() then modifier = \"Shift-\"..modifier end\n\t\t\tif IsControlKeyDown() then modifier = \"Ctrl-\"..modifier end\n\t\t\tif IsAltKeyDown() then modifier = \"Alt-\"..modifier end\n\n\t\t\tif IsHarmfulSpell(slot, SpellBookFrame.bookType) then\n\t\t\t\tbutton = format(\"%s%d\", \"harmbutton\", SecureButton_GetButtonSuffix(button))\n\t\t\t\toriginalbutton = \"|cffff2222(harm)|r \"..originalbutton\n\t\t\telse\n\t\t\t\tbutton = SecureButton_GetButtonSuffix(button)\n\t\t\tend\n\n\t\t\tfor _, v in pairs(DB.spells) do if v.spell == spellname then return end end\n\n\t\t\ttinsert(DB.spells, {[\"id\"] = slot, [\"modifier\"] = modifier, [\"button\"] = button, [\"spell\"] = spellname, [\"texture\"] = texture, [\"origbutton\"] = originalbutton,})\n\t\t\tSpellBinder:makeSpellsList(false)\n\t\tend\n\tend\nend\n\nSpellBinder.UpdateAll = function()\n\tif InCombatLockdown() then\n\t\tSpellBinder:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\treturn\n\tend\n\tSpellBinder:makeFramesList()\n\tSpellBinder:makeSpellsList(true)\nend\n\nSpellBinder:RegisterEvent(\"PLAYER_LOGIN\")\nSpellBinder:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nSpellBinder:RegisterEvent(\"GROUP_ROSTER_UPDATE\")\nSpellBinder:RegisterEvent(\"ZONE_CHANGED\")\nSpellBinder:RegisterEvent(\"ZONE_CHANGED_NEW_AREA\")\nSpellBinder:RegisterEvent(\"PLAYER_TALENT_UPDATE\")\nSpellBinder:SetScript(\"OnEvent\", function(self, event)\n\tif event == \"PLAYER_LOGIN\" then\n\t\tShestakUIBindings = _G.ShestakUIBindings or {}\n\t\tShestakUIBindings[UnitName(\"player\")] = _G.ShestakUIBindings[UnitName(\"player\")] or {}\n\t\tDB = ShestakUIBindings[UnitName(\"player\")]\n\t\tDB.spells = DB.spells or {}\n\t\tDB.keys = DB.keys or {}\n\t\tSpellBinder.frames = SpellBinder.frames or {}\n\t\tSpellBinder:makeFramesList()\n\t\tSpellBinder:makeSpellsList(true)\n\n\t\tfor i = 1, SPELLS_PER_PAGE do\n\t\t\tlocal parent = _G[\"SpellButton\"..i]\n\t\t\tlocal button = CreateFrame(\"Button\", \"SpellBinderFakeButton\"..i, parent, \"AutoCastShineTemplate\")\n\t\t\tbutton:SetID(parent:GetID())\n\t\t\tbutton:RegisterForClicks(\"AnyDown\")\n\t\t\tbutton:SetAllPoints(parent)\n\t\t\tbutton:SetScript(\"OnClick\", addSpell)\n\n\t\t\tbutton:Hide()\n\t\t\tSpellBinder.spellbuttons[i] = button\n\t\tend\n\n\t\tself:UnregisterEvent(\"PLAYER_LOGIN\")\n\telseif event == \"PLAYER_ENTERING_WORLD\" or event == \"GROUP_ROSTER_UPDATE\" or event == \"ZONE_CHANGED\" or event == \"ZONE_CHANGED_NEW_AREA\" then\n\t\tC_Timer.After(0.5, function() SpellBinder.UpdateAll() end)\n\telseif event == \"PLAYER_REGEN_ENABLED\" then\n\t\tSpellBinder.UpdateAll()\n\t\tself:UnregisterEvent(\"PLAYER_REGEN_ENABLED\")\n\telseif event == \"PLAYER_TALENT_UPDATE\" then\n\t\tif DB then\n\t\t\tfor _, spell in ipairs(DB.spells) do\n\t\t\t\tfor frame in pairs(ClickCastFrames) do\n\t\t\t\t\tlocal f\n\t\t\t\t\tif frame and type(frame) == \"table\" then f = frame:GetName() end\n\t\t\t\t\tif f then\n\t\t\t\t\t\tif _G[f]:CanChangeAttribute() or _G[f]:CanChangeProtectedState() then\n\t\t\t\t\t\t\tif _G[f]:GetAttribute(spell.modifier..\"type\"..spell.button) ~= \"menu\" then\n\t\t\t\t\t\t\t\tif spell.button:find(\"harmbutton\") then\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..spell.button, nil)\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"type-\"..spell.spell, nil)\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"spell-\"..spell.spell, nil)\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"type\"..spell.button, nil)\n\t\t\t\t\t\t\t\t\t_G[f]:SetAttribute(spell.modifier..\"spell\"..spell.button, nil)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tSpellBinder:makeSpellsList(true)\n\t\tend\n\tend\nend)\n\nif IsAddOnLoaded(\"Aurora\") then\n\tlocal F, C = unpack(Aurora)\n\tSpellBinder:StripTextures()\n\tSpellBinderInset:StripTextures()\n\n\tSpellBinder.OpenButton:StripTextures()\n\tSpellBinder.OpenButton:SetNormalTexture(\"Interface\\\\ICONS\\\\Achievement_Guild_Doctorisin\")\n\tSpellBinder.OpenButton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\tSpellBinder.OpenButton:SetCheckedTexture(C.media.checked)\n\tSpellBinder.OpenButton:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3)\n\tSpellBinder.OpenButton:GetHighlightTexture():SetAllPoints(SpellBinder.OpenButton:GetNormalTexture())\n\n\tF.CreateBG(SpellBinder.OpenButton)\n\tF.CreateBD(SpellBinder)\n\tF.ReskinClose(SpellBinderCloseButton)\n\tF.ReskinScroll(SpellBinderScrollFrameSpellListScrollBar)\nelseif C.skins.blizzard_frames == true then\n\tSpellBinder:StripTextures()\n\tSpellBinder:CreateBackdrop(\"Transparent\")\n\tSpellBinder.backdrop:SetPoint(\"TOPLEFT\", -18, 0)\n\tSpellBinder.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 9)\n\n\tSpellBinder.OpenButton:StripTextures()\n\tSpellBinder.OpenButton:SetNormalTexture(\"Interface\\\\ICONS\\\\Achievement_Guild_Doctorisin\")\n\tSpellBinder.OpenButton:GetNormalTexture():ClearAllPoints()\n\tSpellBinder.OpenButton:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\tSpellBinder.OpenButton:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tSpellBinder.OpenButton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\tSpellBinder.OpenButton:CreateBackdrop(\"Default\")\n\tSpellBinder.OpenButton.backdrop:SetAllPoints()\n\tSpellBinder.OpenButton:StyleButton(true)\n\n\tSpellBinderScrollFrameSpellList:StripTextures()\n\tSpellBinderScrollFrameSpellList:CreateBackdrop(\"Overlay\")\n\tSpellBinderScrollFrameSpellList.backdrop:SetPoint(\"TOPLEFT\", 2, 3)\n\tSpellBinderScrollFrameSpellList.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -3)\n\tT.SkinCloseButton(SpellBinderCloseButton)\n\n\tSpellBinderScrollFrameSpellListScrollBar:SetPoint(\"TOPLEFT\", SpellBinderScrollFrameSpellList, \"TOPRIGHT\", 6, -13)\n\tSpellBinderScrollFrameSpellListScrollBar:SetPoint(\"BOTTOMLEFT\", SpellBinderScrollFrameSpellList, \"BOTTOMRIGHT\", 6, 13)\n\tT.SkinScrollBar(SpellBinderScrollFrameSpellListScrollBar)\nend"
  },
  {
    "path": "ShestakUI/Modules/Misc/LFGQueueTimer.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif IsAddOnLoaded(\"DBM-Core\") or IsAddOnLoaded(\"BigWigs\") then return end\n\n----------------------------------------------------------------------------------------\n--\tQueue timer on LFGDungeonReadyDialog\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\", nil, LFGDungeonReadyDialog)\nif C.skins.blizzard_frames == true then\n\tframe:SetPoint(\"BOTTOM\", LFGDungeonReadyDialog, \"BOTTOM\", 0, 8)\n\tframe:CreateBackdrop(\"Overlay\")\n\tframe:SetSize(240, 10)\nelse\n\tframe:SetPoint(\"TOP\", LFGDungeonReadyDialog, \"BOTTOM\", 0, -10)\n\tframe:SetSize(280, 10)\n\tframe.t = frame:CreateTexture(nil, \"OVERLAY\")\n\tframe.t:SetTexture(\"Interface\\\\CastingBar\\\\UI-CastingBar-Border\")\n\tframe.t:SetSize(375, 64)\n\tframe.t:SetPoint(\"TOP\", 0, 28)\nend\n\nframe.bar = CreateFrame(\"StatusBar\", nil, frame)\nframe.bar:SetStatusBarTexture(C.media.texture)\nframe.bar:SetAllPoints()\nframe.bar:SetFrameLevel(LFGDungeonReadyDialog:GetFrameLevel() + 1)\nframe.bar:SetStatusBarColor(1, 0.7, 0)\n\nLFGDungeonReadyDialog.nextUpdate = 0\n\nlocal function UpdateBar()\n\tlocal obj = LFGDungeonReadyDialog\n\tlocal oldTime = GetTime()\n\tlocal flag = 0\n\tlocal duration = 40\n\tlocal interval = 0.1\n\tobj:SetScript(\"OnUpdate\", function(_, elapsed)\n\t\tobj.nextUpdate = obj.nextUpdate + elapsed\n\t\tif obj.nextUpdate > interval then\n\t\t\tlocal newTime = GetTime()\n\t\t\tif (newTime - oldTime) < duration then\n\t\t\t\tlocal width = frame:GetWidth() * (newTime - oldTime) / duration\n\t\t\t\tframe.bar:SetPoint(\"BOTTOMRIGHT\", frame, 0 - width, 0)\n\t\t\t\tflag = flag + 1\n\t\t\t\tif flag >= 10 then\n\t\t\t\t\tflag = 0\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tobj:SetScript(\"OnUpdate\", nil)\n\t\t\tend\n\t\t\tobj.nextUpdate = 0\n\t\tend\n\tend)\nend\n\nframe:RegisterEvent(\"LFG_PROPOSAL_SHOW\")\nframe:SetScript(\"OnEvent\", function()\n\tif LFGDungeonReadyDialog:IsShown() then\n\t\tUpdateBar()\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Misc/MagePortals.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif T.class ~= \"MAGE\" or T.level < 11 then return end\n\n----------------------------------------------------------------------------------------\n--\tMage portals menu(by Foof and Tohveli)\n----------------------------------------------------------------------------------------\nlocal spells = (UnitFactionGroup(\"player\") == \"Horde\") and {\n\t[1] = {3567,11417},\t\t\t-- Orgrimmar\n\t[2] = {3563,11418},\t\t\t-- Undercity\n\t[3] = {3566,11420},\t\t\t-- Thunder Bluff\n\t[4] = {32272,32267},\t\t-- Silvermoon\n\t[5] = {49358,49361},\t\t-- Stonard\n\t[6] = {35715,35717},\t\t-- Shattrath\n\t[7] = {53140,53142},\t\t-- Dalaran\n\t[8] = {88344,88346},\t\t-- Tol Barad\n\t[9] = {120145,120146},\t\t-- Ancient Dalaran\n\t[10] = {132627,132626},\t\t-- Vale of Eternal Blossoms\n\t[11] = {176242,176244},\t\t-- Warspear\n\t[12] = {193759, 193759}, \t-- Hall of the Guardian (OrderHall)\n\t[13] = {224869, 224871}, \t-- Dalaran, Broken Isles\n\t[14] = {281404, 281402}, \t-- Dazar'alor\n\t[15] = {344587, 344597}, \t-- Oribos\n\t[15] = {395277, 395289}, \t-- Valdrakken\n} or { -- Alliance\n\t[1] = {3561,10059},\t\t\t-- Stormwind\n\t[2] = {3562,11416},\t\t\t-- Ironforge\n\t[3] = {3565,11419},\t\t\t-- Darnassus\n\t[4] = {32271,32266},\t\t-- Exodar\n\t[5] = {49359,49360},\t\t-- Theramore\n\t[6] = {33690,33691},\t\t-- Shattrath\n\t[7] = {53140,53142},\t\t-- Dalaran\n\t[8] = {88342,88345},\t\t-- Tol Barad\n\t[9] = {120145,120146},\t\t-- Ancient Dalaran\n\t[10] = {132621,132620},\t\t-- Vale of Eternal Blossoms\n\t[11] = {176248,176246},\t\t-- Stormshield\n\t[12] = {193759, 193759}, \t-- Hall of the Guardian (OrderHall)\n\t[13] = {224869, 224871}, \t-- Dalaran, Broken Isles\n\t[14] = {281403, 281400}, \t-- Boralus\n\t[15] = {344587, 344597}, \t-- Oribos\n\t[16] = {395277, 395289}, \t-- Valdrakken\n}\n\nlocal frame = CreateFrame(\"Frame\", \"TeleportMenu\", UIParent)\nframe:CreatePanel(\"Invisible\", C.minimap.size, (#spells) * 20 + 4, \"BOTTOMLEFT\", Minimap, \"TOPLEFT\", -2, 3)\nframe:SetFrameStrata(\"MEDIUM\")\nframe:EnableMouse(true)\nframe:RegisterEvent(\"UNIT_SPELLCAST_START\")\nframe:SetScript(\"OnEvent\", function(self)\n\tif self:IsShown() then\n\t\tself:Hide()\n\tend\nend)\nframe:Hide()\ntinsert(UISpecialFrames, \"TeleportMenu\")\n\nfor i, spell in pairs(spells) do\n\tlocal teleport = GetSpellInfo(spell[1])\n\n\tlocal b = CreateFrame(\"Button\", nil, frame, \"SecureActionButtonTemplate\")\n\tb:CreatePanel(\"Transparent\", C.minimap.size, 20, \"BOTTOMLEFT\", frame, \"BOTTOMLEFT\", 0, ((i - 1) * 21))\n\tb:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\tb:SetFrameStrata(\"HIGH\")\n\n\tlocal l = b:CreateFontString(\"TeleportMenuName\"..i, \"OVERLAY\")\n\tl:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tif i == 5 and UnitFactionGroup(\"player\") == \"Horde\" then\n\t\tl:SetText(C_Map.GetAreaInfo(75))\n\telseif i == 9 then\n\t\tl:SetText(L_ZONE_ANCIENTDALARAN)\n\telse\n\t\tl:SetText(string.sub(teleport, (string.find(teleport, \":\") and string.find(teleport, \":\") + 1) or 0))\n\tend\n\n\tl:SetPoint(\"LEFT\", b, \"LEFT\", 2, 0)\n\tl:SetPoint(\"RIGHT\", b, \"RIGHT\", -2, 0)\n\tl:SetWordWrap(false)\n\n\tb:SetFontString(l)\n\n\tb:RegisterForClicks(\"AnyUp\", \"AnyDown\")\n\tb:SetAttribute(\"type1\", \"spell\")\n\tb:SetAttribute(\"spell1\", teleport)\n\tb:SetAttribute(\"type2\", \"spell\")\n\tb:SetAttribute(\"spell2\", GetSpellInfo(spell[2]))\nend\n\nlocal learnSpell = CreateFrame(\"Frame\")\nlearnSpell:RegisterEvent(\"PLAYER_LOGIN\")\nlearnSpell:RegisterEvent(\"LEARNED_SPELL_IN_TAB\")\nlearnSpell:SetScript(\"OnEvent\", function()\n\tfor i, spell in pairs(spells) do\n\t\tif not IsSpellKnown(spell[1]) then\n\t\t\t_G[\"TeleportMenuName\"..i]:SetTextColor(0.4, 0.4, 0.4)\n\t\telse\n\t\t\t_G[\"TeleportMenuName\"..i]:SetTextColor(1, 1, 1)\n\t\tend\n\tend\nend)\n\nlocal button = CreateFrame(\"Button\", nil, UIParent)\nbutton:SetTemplate(\"ClassColor\")\nbutton:SetPoint(\"TOPLEFT\", Minimap, \"TOPLEFT\")\nbutton:SetSize(20, 20)\nbutton:SetAlpha(0)\n\nbutton.t = button:CreateTexture(nil, \"OVERLAY\")\nbutton.t:SetTexture(\"Interface\\\\Icons\\\\Spell_Arcane_TeleportStormwind\")\nbutton.t:SetTexCoord(0.1, 0.9, 0.1, 0.9)\nbutton.t:SetPoint(\"TOPLEFT\", button, 2, -2)\nbutton.t:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\nbutton:SetScript(\"OnClick\", function()\n\tif not InCombatLockdown() then\n\t\tif _G[\"TeleportMenu\"]:IsShown() then\n\t\t\t_G[\"TeleportMenu\"]:Hide()\n\t\telse\n\t\t\t_G[\"TeleportMenu\"]:Show()\n\t\tend\n\t\tif C.minimap.toggle_menu and _G[\"TTMenuAddOnBackground\"]:IsShown() then\n\t\t\t_G[\"TTMenuAddOnBackground\"]:Hide()\n\t\tend\n\t\tif C.minimap.toggle_menu and _G[\"TTMenuBackground\"]:IsShown() then\n\t\t\t_G[\"TTMenuBackground\"]:Hide()\n\t\tend\n\tend\nend)\n\nbutton:SetScript(\"OnEnter\", function()\n\tif InCombatLockdown() then return end\n\tbutton:FadeIn()\nend)\n\nbutton:SetScript(\"OnLeave\", function()\n\tbutton:FadeOut()\nend)\n"
  },
  {
    "path": "ShestakUI/Modules/Misc/Marking.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tBinding keys for mouseover marking\n----------------------------------------------------------------------------------------\nBINDING_HEADER_TAR_MARK_HEADER = L_MISC_HEADER_MARK\nBINDING_NAME_TAR_MARK_1 = BINDING_NAME_RAIDTARGET1\nBINDING_NAME_TAR_MARK_2 = BINDING_NAME_RAIDTARGET2\nBINDING_NAME_TAR_MARK_3 = BINDING_NAME_RAIDTARGET3\nBINDING_NAME_TAR_MARK_4 = BINDING_NAME_RAIDTARGET4\nBINDING_NAME_TAR_MARK_5 = BINDING_NAME_RAIDTARGET5\nBINDING_NAME_TAR_MARK_6 = BINDING_NAME_RAIDTARGET6\nBINDING_NAME_TAR_MARK_7 = BINDING_NAME_RAIDTARGET7\nBINDING_NAME_TAR_MARK_8 = BINDING_NAME_RAIDTARGET8\nBINDING_NAME_TAR_MARK_0 = BINDING_NAME_RAIDTARGETNONE\n\n----------------------------------------------------------------------------------------\n--\tMob marking(by ALZA)\n----------------------------------------------------------------------------------------\nif C.misc.shift_marking ~= true then return end\nlocal menuFrame = CreateFrame(\"Frame\", \"MarkingFrame\", UIParent, \"UIDropDownMenuTemplate\")\nlocal menuIcon = \"Interface\\\\TargetingFrame\\\\UI-RaidTargetingIcons\"\nlocal menuList = {\n\t{text = RAID_TARGET_NONE, notCheckable = 1, icon = \"Interface\\\\Buttons\\\\UI-GroupLoot-Pass-Up\",\n\t\tfunc = function() SetRaidTarget(\"target\", 0) end},\n\t{text = RAID_TARGET_8, notCheckable = 1, icon = menuIcon, tCoordLeft = 0.75, tCoordRight = 1, tCoordTop = 0.25, tCoordBottom = 0.5,\n\t\tfunc = function() SetRaidTarget(\"target\", 8) end},\n\t{text = \"|cffff0000\"..RAID_TARGET_7..\"|r\", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.5, tCoordRight = 0.75, tCoordTop = 0.25, tCoordBottom = 0.5,\n\t\tfunc = function() SetRaidTarget(\"target\", 7) end},\n\t{text = \"|cff00ffff\"..RAID_TARGET_6..\"|r\", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.25, tCoordRight = 0.5, tCoordTop = 0.25, tCoordBottom = 0.5,\n\t\tfunc = function() SetRaidTarget(\"target\", 6) end},\n\t{text = \"|cffC7C7C7\"..RAID_TARGET_5..\"|r\", notCheckable = 1, icon = menuIcon, tCoordLeft = 0, tCoordRight = 0.25, tCoordTop = 0.25, tCoordBottom = 0.5,\n\t\tfunc = function() SetRaidTarget(\"target\", 5) end},\n\t{text = \"|cff00ff00\"..RAID_TARGET_4..\"|r\", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.75, tCoordRight = 1, tCoordTop = 0, tCoordBottom = 0.25,\n\t\tfunc = function() SetRaidTarget(\"target\", 4) end},\n\t{text = \"|cff912CEE\"..RAID_TARGET_3..\"|r\", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.5, tCoordRight = 0.75, tCoordTop = 0, tCoordBottom = 0.25,\n\t\tfunc = function() SetRaidTarget(\"target\", 3) end},\n\t{text = \"|cffFF8000\"..RAID_TARGET_2..\"|r\", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.25, tCoordRight = 0.5, tCoordTop = 0, tCoordBottom = 0.25,\n\t\tfunc = function() SetRaidTarget(\"target\", 2) end},\n\t{text = \"|cffffff00\"..RAID_TARGET_1..\"|r\", notCheckable = 1, icon = menuIcon, tCoordLeft = 0, tCoordRight = 0.25, tCoordTop = 0, tCoordBottom = 0.25,\n\t\tfunc = function() SetRaidTarget(\"target\", 1) end},\n}\n\nWorldFrame:HookScript(\"OnMouseDown\", function(_, button)\n\tif button == \"LeftButton\" and IsShiftKeyDown() and UnitExists(\"mouseover\") then\n\t\tif (GetNumGroupMembers() > 0 and not UnitInRaid(\"player\")) or UnitIsGroupLeader(\"player\") or UnitIsGroupAssistant(\"player\") then\n\t\t\tEasyMenu(menuList, menuFrame, \"cursor\", 0, 0, \"MENU\")\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Misc/Misc.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tForce readycheck warning\n----------------------------------------------------------------------------------------\nlocal ShowReadyCheckHook = function(_, initiator)\n\tif initiator ~= \"player\" then\n\t\tPlaySound(SOUNDKIT.READY_CHECK, \"Master\")\n\tend\nend\nhooksecurefunc(\"ShowReadyCheck\", ShowReadyCheckHook)\n\n----------------------------------------------------------------------------------------\n--\tForce other warning\n----------------------------------------------------------------------------------------\nlocal ForceWarning = CreateFrame(\"Frame\")\nForceWarning:RegisterEvent(\"UPDATE_BATTLEFIELD_STATUS\")\nForceWarning:RegisterEvent(\"PET_BATTLE_QUEUE_PROPOSE_MATCH\")\nForceWarning:RegisterEvent(\"LFG_PROPOSAL_SHOW\")\nForceWarning:RegisterEvent(\"RESURRECT_REQUEST\")\nForceWarning:SetScript(\"OnEvent\", function(_, event)\n\tif event == \"UPDATE_BATTLEFIELD_STATUS\" then\n\t\tfor i = 1, GetMaxBattlefieldID() do\n\t\t\tlocal status = GetBattlefieldStatus(i)\n\t\t\tif status == \"confirm\" then\n\t\t\t\tPlaySound(SOUNDKIT.PVP_THROUGH_QUEUE, \"Master\")\n\t\t\t\tbreak\n\t\t\tend\n\t\t\ti = i + 1\n\t\tend\n\telseif event == \"PET_BATTLE_QUEUE_PROPOSE_MATCH\" then\n\t\tPlaySound(SOUNDKIT.PVP_THROUGH_QUEUE, \"Master\")\n\telseif event == \"LFG_PROPOSAL_SHOW\" then\n\t\tPlaySound(SOUNDKIT.READY_CHECK, \"Master\")\n\telseif event == \"RESURRECT_REQUEST\" then\n\t\tPlaySound(37, \"Master\")\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tMisclicks for some popups\n----------------------------------------------------------------------------------------\nStaticPopupDialogs.RESURRECT.hideOnEscape = nil\nStaticPopupDialogs.AREA_SPIRIT_HEAL.hideOnEscape = nil\nStaticPopupDialogs.PARTY_INVITE.hideOnEscape = nil\nStaticPopupDialogs.CONFIRM_SUMMON.hideOnEscape = nil\nStaticPopupDialogs.ADDON_ACTION_FORBIDDEN.button1 = nil\nStaticPopupDialogs.TOO_MANY_LUA_ERRORS.button1 = nil\nPetBattleQueueReadyFrame.hideOnEscape = nil\nPVPReadyDialog.leaveButton:Hide()\nPVPReadyDialog.enterButton:ClearAllPoints()\nPVPReadyDialog.enterButton:SetPoint(\"BOTTOM\", PVPReadyDialog, \"BOTTOM\", 0, 25)\n\n----------------------------------------------------------------------------------------\n--\tSpin camera while afk(by Telroth and Eclipse)\n----------------------------------------------------------------------------------------\nif C.misc.afk_spin_camera == true then\n\tlocal spinning\n\tlocal function SpinStart()\n\t\tspinning = true\n\t\tMoveViewRightStart(0.1)\n\t\tUIParent:Hide()\n\tend\n\n\tlocal function SpinStop()\n\t\tif not spinning then return end\n\t\tspinning = nil\n\t\tMoveViewRightStop()\n\t\tif InCombatLockdown() then return end\n\t\tUIParent:Show()\n\tend\n\n\tlocal SpinCam = CreateFrame(\"Frame\")\n\tSpinCam:RegisterEvent(\"PLAYER_LEAVING_WORLD\")\n\tSpinCam:RegisterEvent(\"PLAYER_FLAGS_CHANGED\")\n\tSpinCam:SetScript(\"OnEvent\", function(_, event)\n\t\tif event == \"PLAYER_LEAVING_WORLD\" then\n\t\t\tSpinStop()\n\t\telse\n\t\t\tif UnitIsAFK(\"player\") and not InCombatLockdown() then\n\t\t\t\tSpinStart()\n\t\t\telse\n\t\t\t\tSpinStop()\n\t\t\tend\n\t\tend\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tAuto select current event boss from LFD tool(EventBossAutoSelect by Nathanyel)\n----------------------------------------------------------------------------------------\nlocal firstLFD\nLFDParentFrame:HookScript(\"OnShow\", function()\n\tif not firstLFD then\n\t\tfirstLFD = 1\n\t\tfor i = 1, GetNumRandomDungeons() do\n\t\t\tlocal id = GetLFGRandomDungeonInfo(i)\n\t\t\tlocal isHoliday = select(15, GetLFGDungeonInfo(id))\n\t\t\tif isHoliday and not GetLFGDungeonRewards(id) then\n\t\t\t\tLFDQueueFrame_SetType(id)\n\t\t\tend\n\t\tend\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tUndress button in dress-up frame(by Nefarion)\n----------------------------------------------------------------------------------------\nlocal strip = CreateFrame(\"Button\", \"DressUpFrameUndressButton\", DressUpFrame, \"UIPanelButtonTemplate\")\nstrip:SetText(L_MISC_UNDRESS)\nstrip:SetWidth(strip:GetTextWidth() + 40)\nstrip:SetPoint(\"RIGHT\", DressUpFrameResetButton, \"LEFT\", -2, 0)\nstrip:RegisterForClicks(\"AnyUp\")\nstrip:SetScript(\"OnClick\", function(_, button)\n\tlocal actor = DressUpFrame.ModelScene:GetPlayerActor()\n\tif not actor then return end\n\tif button == \"RightButton\" then\n\t\tactor:UndressSlot(19)\n\telse\n\t\tactor:Undress()\n\tend\n\tPlaySound(SOUNDKIT.GS_TITLE_OPTION_OK)\nend)\n\n----------------------------------------------------------------------------------------\n--\tBoss Banner Hider\n----------------------------------------------------------------------------------------\nif C.general.hide_banner == true then\n\tBossBanner.PlayBanner = function() end\nend\n\n----------------------------------------------------------------------------------------\n--\tHide button for oUF_RaidDPS\n----------------------------------------------------------------------------------------\nif C.misc.hide_raid_button == true then\n\tlocal show = false\n\tSlashCmdList.HideRaidMODE = function()\n\t\tif show == false then\n\t\t\tif oUF_RaidDPS1 then\n\t\t\t\tfor i = 1, C.raidframe.raid_groups do\n\t\t\t\t\t_G[\"oUF_RaidDPS\"..i]:SetAlpha(0)\n\t\t\t\tend\n\t\t\t\tif oUF_MainTank then\n\t\t\t\t\toUF_MainTank:SetAlpha(0)\n\t\t\t\tend\n\t\t\tend\n\t\t\tshow = true\n\t\telse\n\t\t\tif oUF_RaidDPS1 then\n\t\t\t\tfor i = 1, C.raidframe.raid_groups do\n\t\t\t\t\t_G[\"oUF_RaidDPS\"..i]:SetAlpha(1)\n\t\t\t\tend\n\t\t\t\tif oUF_MainTank then\n\t\t\t\t\toUF_MainTank:SetAlpha(1)\n\t\t\t\tend\n\t\t\tend\n\t\t\tshow = false\n\t\tend\n\n\tend\n\tSLASH_HIDERAIDMODE1 = \"/hideraid\"\n\n\tlocal HideRaid = CreateFrame(\"Button\", \"HideRaidMode\", UIParent)\n\tHideRaid:SetTemplate(\"ClassColor\")\n\tHideRaid:SetPoint(\"TOPLEFT\", UIParent, \"TOPLEFT\", 0, 0)\n\tHideRaid:SetSize(19, 19)\n\tHideRaid:SetAlpha(0)\n\tHideRaid:Hide()\n\n\tHideRaid.t = HideRaid:CreateTexture(nil, \"OVERLAY\")\n\tHideRaid.t:SetTexture(\"Interface\\\\Icons\\\\inv_misc_spyglass_03\")\n\tHideRaid.t:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tHideRaid.t:SetPoint(\"TOPLEFT\", HideRaid, 2, -2)\n\tHideRaid.t:SetPoint(\"BOTTOMRIGHT\", HideRaid, -2, 2)\n\n\tHideRaid:SetScript(\"OnClick\", function()\n\t\tif oUF_RaidDPS1 and oUF_RaidDPS1:IsShown() then\n\t\t\tSlashCmdList.HideRaidMODE()\n\t\tend\n\tend)\n\n\tHideRaid:SetScript(\"OnEnter\", function()\n\t\tif oUF_RaidDPS1 and oUF_RaidDPS1:IsShown() then\n\t\t\tHideRaid:FadeIn()\n\t\tend\n\tend)\n\n\tHideRaid:SetScript(\"OnLeave\", function()\n\t\tHideRaid:FadeOut()\n\tend)\n\n\tHideRaid:RegisterEvent(\"PLAYER_LOGIN\")\n\tHideRaid:SetScript(\"OnEvent\", function(self)\n\t\tif C.unitframe.enable == true and C.raidframe.layout == \"DPS\" then\n\t\t\tself:Show()\n\t\tend\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tEasy delete good items\n----------------------------------------------------------------------------------------\nlocal deleteDialog = StaticPopupDialogs[\"DELETE_GOOD_ITEM\"]\nif deleteDialog.OnShow then\n\thooksecurefunc(deleteDialog, \"OnShow\", function(s) s.editBox:SetText(DELETE_ITEM_CONFIRM_STRING) s.editBox:SetAutoFocus(false) s.editBox:ClearFocus() end)\nend\n\n----------------------------------------------------------------------------------------\n--\tChange UIErrorsFrame strata\n----------------------------------------------------------------------------------------\nUIErrorsFrame:SetFrameLevel(0)\n\n----------------------------------------------------------------------------------------\n--\tIncrease speed for AddonList scroll\n----------------------------------------------------------------------------------------\nAddonList.ScrollBox.wheelPanScalar = 6\nAddonList.ScrollBar.wheelPanScalar = 6"
  },
  {
    "path": "ShestakUI/Modules/Misc/Mounts.lua",
    "content": "----------------------------------------------------------------------------------------\n--\tUniversal Mount macro(by Monolit)\n--\t/cancelform [noform:4]\n--\t/run Mountz(\"your_ground_mount\",\"your_flying_mount\",\"your_underwater_mount\")\n----------------------------------------------------------------------------------------\nfunction Mountz(groundmount, flyingmount, underwatermount)\n\tif not underwatermount then underwatermount = groundmount end\n\tlocal flyablex, swimablex, vjswim, InVj, nofly\n\tlocal num = C_MountJournal.GetNumMounts()\n\tif not num or IsMounted() then\n\t\tDismount()\n\t\treturn\n\tend\n\tif CanExitVehicle() then\n\t\tVehicleExit()\n\t\treturn\n\tend\n\tif IsUsableSpell(59569) ~= true then\n\t\tnofly = true\n\tend\n\tif not nofly and IsFlyableArea() then\n\t\tflyablex = true\n\tend\n\tfor i = 1, 40 do\n\t\tlocal sid = select(10, UnitBuff(\"player\", i))\n\t\tif sid == 73701 or sid == 76377 then\n\t\t\tInVj = true\n\t\tend\n\tend\n\tif InVj and IsSwimming() then\n\t\tvjswim = true\n\tend\n\tif IsSwimming() and not flyablex and not vjswim then\n\t\tswimablex = true\n\tend\n\tif IsControlKeyDown() then\n\t\tif IsSwimming() and not vjswim then\n\t\t\tswimablex = not swimablex\n\t\telseif not vjswim then\n\t\t\tflyablex = not flyablex\n\t\telse\n\t\t\tvjswim = not vjswim\n\t\tend\n\tend\n\tlocal mountID = C_MountJournal.GetMountIDs()\n\tfor _, mountID in pairs(mountID) do\n\t\tlocal creatureName, spellID = C_MountJournal.GetMountInfoByID(mountID)\n\t\tif flyingmount and creatureName == flyingmount and flyablex and not swimablex then\n\t\t\tC_MountJournal.SummonByID(mountID)\n\t\t\treturn\n\t\telseif groundmount and creatureName == groundmount and not flyablex and not swimablex and not vjswim then\n\t\t\tC_MountJournal.SummonByID(mountID)\n\t\t\treturn\n\t\telseif underwatermount and creatureName == underwatermount and swimablex then\n\t\t\tC_MountJournal.SummonByID(mountID)\n\t\t\treturn\n\t\telseif spellID == 75207 and vjswim then\n\t\t\tC_MountJournal.SummonByID(mountID)\n\t\t\treturn\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Misc/PvPQueueTimer.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif IsAddOnLoaded(\"DBM-Core\") then return end\n\n----------------------------------------------------------------------------------------\n--\tQueue timer on PVPReadyDialog\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\", nil, PVPReadyDialog)\nif C.skins.blizzard_frames == true then\n\tframe:SetPoint(\"BOTTOM\", PVPReadyDialog, \"BOTTOM\", 0, 8)\n\tframe:CreateBackdrop(\"Overlay\")\n\tframe:SetSize(240, 10)\nelse\n\tframe:SetPoint(\"TOP\", PVPReadyDialog, \"BOTTOM\", 0, -10)\n\tframe:SetSize(280, 10)\n\tframe.t = frame:CreateTexture(nil, \"OVERLAY\")\n\tframe.t:SetTexture(\"Interface\\\\CastingBar\\\\UI-CastingBar-Border\")\n\tframe.t:SetSize(375, 64)\n\tframe.t:SetPoint(\"TOP\", 0, 28)\nend\n\nframe.bar = CreateFrame(\"StatusBar\", nil, frame)\nframe.bar:SetStatusBarTexture(C.media.texture)\nframe.bar:SetAllPoints()\nframe.bar:SetFrameLevel(PVPReadyDialog:GetFrameLevel() + 1)\nframe.bar:SetStatusBarColor(1, 0.7, 0)\n\nPVPReadyDialog.nextUpdate = 0\n\nlocal function UpdateBar()\n\tlocal obj = PVPReadyDialog\n\tlocal oldTime = GetTime()\n\tlocal flag = 0\n\tlocal duration = 90\n\tlocal interval = 0.1\n\tobj:SetScript(\"OnUpdate\", function(_, elapsed)\n\t\tobj.nextUpdate = obj.nextUpdate + elapsed\n\t\tif obj.nextUpdate > interval then\n\t\t\tlocal newTime = GetTime()\n\t\t\tif (newTime - oldTime) < duration then\n\t\t\t\tlocal width = frame:GetWidth() * (newTime - oldTime) / duration\n\t\t\t\tframe.bar:SetPoint(\"BOTTOMRIGHT\", frame, 0 - width, 0)\n\t\t\t\tflag = flag + 1\n\t\t\t\tif flag >= 10 then\n\t\t\t\t\tflag = 0\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tobj:SetScript(\"OnUpdate\", nil)\n\t\t\tend\n\t\t\tobj.nextUpdate = 0\n\t\tend\n\tend)\nend\n\nframe:RegisterEvent(\"UPDATE_BATTLEFIELD_STATUS\")\nframe:SetScript(\"OnEvent\", function()\n\tif PVPReadyDialog:IsShown() then\n\t\tUpdateBar()\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Misc/RaidUtility.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.misc.raid_tools ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tRaid Utility(by Elv22)\n----------------------------------------------------------------------------------------\n-- Create main frame\nlocal RaidUtilityPanel = CreateFrame(\"Frame\", \"RaidUtilityPanel\", T_PetBattleFrameHider)\nRaidUtilityPanel:CreatePanel(\"Transparent\", 170, 145, unpack(C.position.raid_utility))\nif GetCVarBool(\"watchFrameWidth\") then\n\tRaidUtilityPanel:SetPoint(C.position.raid_utility[1], C.position.raid_utility[2], C.position.raid_utility[3], C.position.raid_utility[4] + 100, C.position.raid_utility[5])\nend\nRaidUtilityPanel.toggled = false\n\n-- Check if We are Raid Leader or Raid Officer\nlocal function CheckRaidStatus()\n\tlocal _, instanceType = IsInInstance()\n\tif ((GetNumGroupMembers() > 0 and UnitIsGroupLeader(\"player\") and not UnitInRaid(\"player\")) or UnitIsGroupLeader(\"player\") or UnitIsGroupAssistant(\"player\")) and (instanceType ~= \"pvp\" or instanceType ~= \"arena\") then\n\t\treturn true\n\telse\n\t\treturn false\n\tend\nend\n\n-- Function to create buttons in this module\nlocal function CreateButton(name, parent, template, width, height, point, relativeto, point2, xOfs, yOfs, text)\n\tlocal b = CreateFrame(\"Button\", name, parent, template)\n\tb:SetWidth(width)\n\tb:SetHeight(height)\n\tb:SetPoint(point, relativeto, point2, xOfs, yOfs)\n\tb:EnableMouse(true)\n\tif text then\n\t\tb.t = b:CreateFontString(nil, \"OVERLAY\")\n\t\tb.t:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\tb.t:SetPoint(\"CENTER\")\n\t\tb.t:SetJustifyH(\"CENTER\")\n\t\tb.t:SetText(text)\n\t\tb.t:SetWidth(width - 2)\n\t\tb.t:SetHeight(C.media.pixel_font_size)\n\tend\nend\n\n-- Show button\nCreateButton(\"RaidUtilityShowButton\", T_PetBattleFrameHider, \"UIPanelButtonTemplate, SecureHandlerClickTemplate\", RaidUtilityPanel:GetWidth() / 1.5, 18, \"TOP\", RaidUtilityPanel, \"TOP\", 0, 0, RAID_CONTROL)\nRaidUtilityShowButton:SetFrameRef(\"RaidUtilityPanel\", RaidUtilityPanel)\nRaidUtilityShowButton:SetAttribute(\"_onclick\", [=[self:Hide(); self:GetFrameRef(\"RaidUtilityPanel\"):Show();]=])\nRaidUtilityShowButton:SetScript(\"OnMouseUp\", function(_, button)\n\tif button == \"RightButton\" then\n\t\tif CheckRaidStatus() then\n\t\t\tDoReadyCheck()\n\t\tend\n\telseif button == \"MiddleButton\" then\n\t\tif CheckRaidStatus() then\n\t\t\tInitiateRolePoll()\n\t\tend\n\telseif button == \"LeftButton\" then\n\t\tRaidUtilityPanel.toggled = true\n\tend\nend)\n\n-- Close button\nCreateButton(\"RaidUtilityCloseButton\", RaidUtilityPanel, \"UIPanelButtonTemplate, SecureHandlerClickTemplate\", RaidUtilityPanel:GetWidth() / 1.5, 18, \"TOP\", RaidUtilityPanel, \"BOTTOM\", 0, -1, CLOSE)\nRaidUtilityCloseButton:SetFrameRef(\"RaidUtilityShowButton\", RaidUtilityShowButton)\nRaidUtilityCloseButton:SetAttribute(\"_onclick\", [=[self:GetParent():Hide(); self:GetFrameRef(\"RaidUtilityShowButton\"):Show();]=])\nRaidUtilityCloseButton:SetScript(\"OnMouseUp\", function() RaidUtilityPanel.toggled = false end)\n\n-- Disband Group button\nCreateButton(\"RaidUtilityDisbandButton\", RaidUtilityPanel, \"UIPanelButtonTemplate\", RaidUtilityPanel:GetWidth() * 0.8, 18, \"TOP\", RaidUtilityPanel, \"TOP\", 0, -5, L_RAID_UTIL_DISBAND)\nRaidUtilityDisbandButton:SetScript(\"OnMouseUp\", function() StaticPopup_Show(\"DISBAND_RAID\") end)\n\n-- Convert Group button\nCreateButton(\"RaidUtilityConvertButton\", RaidUtilityPanel, \"UIPanelButtonTemplate\", RaidUtilityPanel:GetWidth() * 0.8, 18, \"TOP\", RaidUtilityDisbandButton, \"BOTTOM\", 0, -5, UnitInRaid(\"player\") and CONVERT_TO_PARTY or CONVERT_TO_RAID)\nRaidUtilityConvertButton:SetScript(\"OnMouseUp\", function()\n\tif UnitInRaid(\"player\") then\n\t\tC_PartyInfo.ConvertToParty()\n\t\tRaidUtilityConvertButton.t:SetText(CONVERT_TO_RAID)\n\telseif UnitInParty(\"player\") then\n\t\tC_PartyInfo.ConvertToRaid()\n\t\tRaidUtilityConvertButton.t:SetText(CONVERT_TO_PARTY)\n\tend\nend)\n\n-- Role Check button\nCreateButton(\"RaidUtilityRoleButton\", RaidUtilityPanel, \"UIPanelButtonTemplate\", RaidUtilityPanel:GetWidth() * 0.8, 18, \"TOP\", RaidUtilityConvertButton, \"BOTTOM\", 0, -5, ROLE_POLL)\nRaidUtilityRoleButton:SetScript(\"OnMouseUp\", function() InitiateRolePoll() end)\n\n-- MainTank button\nCreateButton(\"RaidUtilityMainTankButton\", RaidUtilityPanel, \"UIPanelButtonTemplate, SecureActionButtonTemplate\", (RaidUtilityDisbandButton:GetWidth() / 2) - 2, 18, \"TOPLEFT\", RaidUtilityRoleButton, \"BOTTOMLEFT\", 0, -5, TANK)\nRaidUtilityMainTankButton:SetAttribute(\"type\", \"maintank\")\nRaidUtilityMainTankButton:SetAttribute(\"unit\", \"target\")\nRaidUtilityMainTankButton:SetAttribute(\"action\", \"toggle\")\n\n-- MainAssist button\nCreateButton(\"RaidUtilityMainAssistButton\", RaidUtilityPanel, \"UIPanelButtonTemplate, SecureActionButtonTemplate\", (RaidUtilityDisbandButton:GetWidth() / 2) - 2, 18, \"TOPRIGHT\", RaidUtilityRoleButton, \"BOTTOMRIGHT\", 0, -5, MAINASSIST)\nRaidUtilityMainAssistButton:SetAttribute(\"type\", \"mainassist\")\nRaidUtilityMainAssistButton:SetAttribute(\"unit\", \"target\")\nRaidUtilityMainAssistButton:SetAttribute(\"action\", \"toggle\")\n\n-- Ready Check button\nCreateButton(\"RaidUtilityReadyCheckButton\", RaidUtilityPanel, \"UIPanelButtonTemplate\", RaidUtilityRoleButton:GetWidth() * 0.75, 18, \"TOPLEFT\", RaidUtilityMainTankButton, \"BOTTOMLEFT\", 0, -5, READY_CHECK)\nRaidUtilityReadyCheckButton:SetScript(\"OnMouseUp\", function() DoReadyCheck() end)\n\n-- World Marker button\nCompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:ClearAllPoints()\nCompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:SetPoint(\"TOPRIGHT\", RaidUtilityMainAssistButton, \"BOTTOMRIGHT\", 0, -5)\nCompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:SetParent(RaidUtilityPanel)\nCompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:SetHeight(18)\nCompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:SetWidth(RaidUtilityRoleButton:GetWidth() * 0.22)\nCompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:StripTextures(true)\n\nlocal MarkTexture = CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:CreateTexture(nil, \"OVERLAY\")\nMarkTexture:SetTexture(\"Interface\\\\RaidFrame\\\\Raid-WorldPing\")\nMarkTexture:SetPoint(\"CENTER\", 0, -1)\n\n-- Raid Control Panel\nCreateButton(\"RaidUtilityRaidControlButton\", RaidUtilityPanel, \"UIPanelButtonTemplate\", RaidUtilityRoleButton:GetWidth(), 18, \"TOPLEFT\", RaidUtilityReadyCheckButton, \"BOTTOMLEFT\", 0, -5, RAID_CONTROL)\nRaidUtilityRaidControlButton:SetScript(\"OnMouseUp\", function()\n\tToggleFriendsFrame(4)\nend)\n\nlocal function ToggleRaidUtil(self, event)\n\tif InCombatLockdown() then\n\t\tself:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\treturn\n\tend\n\n\tif CheckRaidStatus() then\n\t\tif RaidUtilityPanel.toggled == true then\n\t\t\tRaidUtilityShowButton:Hide()\n\t\t\tRaidUtilityPanel:Show()\n\t\telse\n\t\t\tRaidUtilityShowButton:Show()\n\t\t\tRaidUtilityPanel:Hide()\n\t\tend\n\telse\n\t\tRaidUtilityShowButton:Hide()\n\t\tRaidUtilityPanel:Hide()\n\tend\n\n\tif event == \"PLAYER_REGEN_ENABLED\" then\n\t\tself:UnregisterEvent(\"PLAYER_REGEN_ENABLED\")\n\tend\nend\n\n-- Automatically show/hide the frame if we have Raid Leader or Raid Officer\nlocal LeadershipCheck = CreateFrame(\"Frame\")\nLeadershipCheck:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nLeadershipCheck:RegisterEvent(\"GROUP_ROSTER_UPDATE\")\nLeadershipCheck:SetScript(\"OnEvent\", ToggleRaidUtil)\n\n-- Support Aurora\nif IsAddOnLoaded(\"Aurora\") then\n\tlocal F = unpack(Aurora)\n\tRaidUtilityPanel:SetBackdropColor(0, 0, 0, 0)\n\tRaidUtilityPanel:SetBackdropBorderColor(0, 0, 0, 0)\n\tRaidUtilityPanelInnerBorder:SetBackdropBorderColor(0, 0, 0, 0)\n\tRaidUtilityPanelOuterBorder:SetBackdropBorderColor(0, 0, 0, 0)\n\tF.CreateBD(RaidUtilityPanel)\nend"
  },
  {
    "path": "ShestakUI/Modules/Misc/SlotItemLevel.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.misc.item_level ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tItem level on slot buttons in Character/InspectFrame(iLevel by Sanex)\n----------------------------------------------------------------------------------------\nlocal minItemLevel = 375 -- For missing enchant and gems checking\nlocal _G = getfenv(0)\nlocal equiped = {} -- Table to store equiped items\n\nlocal f = CreateFrame(\"Frame\", nil, _G.PaperDollFrame) -- iLvel number frame\nlocal g -- iLvel number for Inspect frame\nf:RegisterEvent(\"ADDON_LOADED\")\nf:RegisterEvent(\"PLAYER_LOGIN\")\n\nlocal fontObject = CreateFont(\"iLvLFont\")\nfontObject:SetFontObject(\"SystemFont_Outline_Small\")\n\n-- Tooltip and scanning by Phanx @ http://www.wowinterface.com/forums/showthread.php?p=271406\nlocal itemLevelString = \"^\"..gsub(ITEM_LEVEL, \"%%d\", \"\")\nlocal function _getRealItemLevel(slotId, unit)\n\tlocal data = C_TooltipInfo.GetInventoryItem(unit, slotId)\n\tif not data then return nil end -- With this we don't get ilvl for offhand if we equip 2h weapon\n\tlocal realItemLevel\n\n\tfor i = 2, #data.lines do\n\t\tlocal lineData = data.lines[i]\n\t\tlocal argVal = lineData and lineData.args\n\t\tif argVal then\n\t\t\tlocal text = argVal[2] and argVal[2].stringVal\n\t\t\tlocal found = text and strfind(text, itemLevelString)\n\t\t\tif found then\n\t\t\t\tlocal level = strmatch(text, \"(%d+)%)?$\")\n\t\t\t\tif level and (tonumber(level) > 0) then\n\t\t\t\t\trealItemLevel = level\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\treturn realItemLevel\nend\n\n-- local function checkSpecID(unit)\n\t-- local i = 0\n\t-- local specID\n\t-- if unit == \"player\" then\n\t\t-- specID = GetSpecializationInfo(GetSpecialization())\n\t-- else\n\t\t-- specID = GetInspectSpecialization(\"target\")\n\t-- end\n\n\t-- if specID then\n\t\t-- if specID == 250 or specID == 251 or specID == 252 or specID == 66 or specID == 70 or specID == 71 or specID == 72 or specID == 73 then\n\t\t\t-- i = INVSLOT_HAND\n\t\t-- elseif specID == 577 or specID == 581 or specID == 103 or specID == 104 or specID == 253 or specID == 254 or specID == 255\n\t\t\t-- or specID == 268 or specID == 269 or specID == 259 or specID == 260 or specID == 261 or specID == 263 then\n\t\t\t-- i = INVSLOT_FEET\n\t\t-- else\n\t\t\t-- i = INVSLOT_WRIST\n\t\t-- end\n\t-- end\n\t-- return i\n-- end\n\nlocal function _updateItems(unit, frame)\n\t-- local itemSlot = checkSpecID(unit)\n\tfor i = 1, 17 do -- Only check changed player items or items without ilvl text, skip the shirt (4) and always update Inspects\n\t\tlocal itemLink = GetInventoryItemLink(unit, i)\n\t\tif i ~= 4 and ((frame == f and (equiped[i] ~= itemLink or frame[i]:GetText() == nil or itemLink == nil and frame[i]:GetText() ~= \"\")) or frame == g) then\n\t\t\tif frame == f then\n\t\t\t\tequiped[i] = itemLink\n\t\t\tend\n\n\t\t\tlocal realItemLevel = _getRealItemLevel(i, unit)\n\t\t\trealItemLevel = realItemLevel or \"\"\n\t\t\tif realItemLevel and tonumber(realItemLevel) == 1 then\n\t\t\t\trealItemLevel = \"\"\n\t\t\tend\n\n\t\t\tlocal color = \"|cffFFFF00\"\n\n\t\t\t-- Check missing enchants and gems\n\t\t\tif itemLink and (realItemLevel ~= \"\" and tonumber(realItemLevel) > minItemLevel) then\n\t\t\t\tlocal _, _, enchant, gem1, gem2, gem3 = strsplit(\":\", itemLink)\n\t\t\t\tif i == INVSLOT_BACK or i == INVSLOT_CHEST or i == INVSLOT_MAINHAND or i == INVSLOT_FINGER1 or i == INVSLOT_FINGER2 or i == INVSLOT_WRIST or i == INVSLOT_FEET or i == INVSLOT_LEGS then\n\t\t\t\t\tif enchant and enchant == \"\" then\n\t\t\t\t\t\tcolor = \"|cffFF0000\"\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tlocal info = GetItemStats(itemLink)\n\t\t\t\tlocal numSocket = info[\"EMPTY_SOCKET_PRISMATIC\"] or 0\n\t\t\t\tlocal numGem = 0\n\n\t\t\t\tif gem1 and gem1 ~= \"\" then\n\t\t\t\t\tnumGem = numGem + 1\n\t\t\t\tend\n\t\t\t\tif gem2 and gem2 ~= \"\" then\n\t\t\t\t\tnumGem = numGem + 1\n\t\t\t\tend\n\t\t\t\tif gem3 and gem3 ~= \"\" then\n\t\t\t\t\tnumGem = numGem + 1\n\t\t\t\tend\n\t\t\t\tif numGem < numSocket then\n\t\t\t\t\tcolor = \"|cffFF00CC\"\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tframe[i]:SetText(color..realItemLevel)\n\t\tend\n\tend\nend\n\nlocal function _createStrings()\n\tlocal function _stringFactory(parent)\n\t\tlocal s = f:CreateFontString(nil, \"OVERLAY\", \"iLvLFont\")\n\t\ts:SetPoint(\"TOP\", parent, \"TOP\", 0, -2)\n\n\t\treturn s\n\tend\n\n\tf:SetFrameLevel(_G.CharacterHeadSlot:GetFrameLevel())\n\n\tf[1] = _stringFactory(_G.CharacterHeadSlot)\n\tf[2] = _stringFactory(_G.CharacterNeckSlot)\n\tf[3] = _stringFactory(_G.CharacterShoulderSlot)\n\tf[15] = _stringFactory(_G.CharacterBackSlot)\n\tf[5] = _stringFactory(_G.CharacterChestSlot)\n\tf[9] = _stringFactory(_G.CharacterWristSlot)\n\n\tf[10] = _stringFactory(_G.CharacterHandsSlot)\n\tf[6] = _stringFactory(_G.CharacterWaistSlot)\n\tf[7] = _stringFactory(_G.CharacterLegsSlot)\n\tf[8] = _stringFactory(_G.CharacterFeetSlot)\n\tf[11] = _stringFactory(_G.CharacterFinger0Slot)\n\tf[12] = _stringFactory(_G.CharacterFinger1Slot)\n\tf[13] = _stringFactory(_G.CharacterTrinket0Slot)\n\tf[14] = _stringFactory(_G.CharacterTrinket1Slot)\n\n\tf[16] = _stringFactory(_G.CharacterMainHandSlot)\n\tf[17] = _stringFactory(_G.CharacterSecondaryHandSlot)\n\n\tf:Hide()\nend\n\nlocal function _createGStrings()\n\tlocal function _stringFactory(parent)\n\t\tlocal s = g:CreateFontString(nil, \"OVERLAY\", \"iLvLFont\")\n\t\ts:SetPoint(\"TOP\", parent, \"TOP\", 0, -2)\n\n\t\treturn s\n\tend\n\n\tg:SetFrameLevel(_G.InspectHeadSlot:GetFrameLevel())\n\n\tg[1] = _stringFactory(_G.InspectHeadSlot)\n\tg[2] = _stringFactory(_G.InspectNeckSlot)\n\tg[3] = _stringFactory(_G.InspectShoulderSlot)\n\tg[15] = _stringFactory(_G.InspectBackSlot)\n\tg[5] = _stringFactory(_G.InspectChestSlot)\n\tg[9] = _stringFactory(_G.InspectWristSlot)\n\n\tg[10] = _stringFactory(_G.InspectHandsSlot)\n\tg[6] = _stringFactory(_G.InspectWaistSlot)\n\tg[7] = _stringFactory(_G.InspectLegsSlot)\n\tg[8] = _stringFactory(_G.InspectFeetSlot)\n\tg[11] = _stringFactory(_G.InspectFinger0Slot)\n\tg[12] = _stringFactory(_G.InspectFinger1Slot)\n\tg[13] = _stringFactory(_G.InspectTrinket0Slot)\n\tg[14] = _stringFactory(_G.InspectTrinket1Slot)\n\n\tg[16] = _stringFactory(_G.InspectMainHandSlot)\n\tg[17] = _stringFactory(_G.InspectSecondaryHandSlot)\n\n\tg:Hide()\nend\n\nlocal function OnEvent(self, event, ...)\n\tif event == \"ADDON_LOADED\" and (...) == \"Blizzard_InspectUI\" then\n\t\tself:UnregisterEvent(event)\n\n\t\tif not InspectFrameiLvL and not C.tooltip.average_lvl then\n\t\t\tlocal text = InspectModelFrame:CreateFontString(\"InspectFrameiLvL\", \"OVERLAY\", \"SystemFont_Outline_Small\")\n\t\t\ttext:SetPoint(\"BOTTOM\", 5, 20)\n\t\t\ttext:Hide()\n\t\t\tInspectPaperDollFrame:HookScript(\"OnShow\", function()\n\t\t\t\tlocal avgilvl = C_PaperDollInfo.GetInspectItemLevel(\"target\")\n\t\t\t\tif avgilvl and tonumber(avgilvl) > 0 then\n\t\t\t\t\ttext:SetText(\"|cFFFFFF00\"..avgilvl)\n\t\t\t\t\ttext:Show()\n\t\t\t\tend\n\t\t\tend)\n\t\t\tInspectPaperDollFrame:HookScript(\"OnHide\", function()\n\t\t\t\ttext:Hide()\n\t\t\tend)\n\t\tend\n\n\t\tg = CreateFrame(\"Frame\", nil, _G.InspectPaperDollFrame) -- iLevel number frame for Inspect\n\t\t_createGStrings()\n\t\t_createGStrings = nil\n\n\t\t_G.InspectPaperDollFrame:HookScript(\"OnShow\", function()\n\t\t\tg:SetFrameLevel(_G.InspectHeadSlot:GetFrameLevel())\n\t\t\tf:RegisterEvent(\"INSPECT_READY\")\n\t\t\tf:RegisterEvent(\"UNIT_INVENTORY_CHANGED\")\n\t\t\t_updateItems(\"target\", g)\n\t\t\tg:Show()\n\t\tend)\n\n\t\t_G.InspectPaperDollFrame:HookScript(\"OnHide\", function()\n\t\t\tf:UnregisterEvent(\"INSPECT_READY\")\n\t\t\tf:UnregisterEvent(\"UNIT_INVENTORY_CHANGED\")\n\t\t\tg:Hide()\n\t\tend)\n\telseif event == \"PLAYER_LOGIN\" then\n\t\tself:UnregisterEvent(event)\n\n\t\t_createStrings()\n\t\t_createStrings = nil\n\n\t\t_G.PaperDollFrame:HookScript(\"OnShow\", function()\n\t\t\tf:RegisterEvent(\"PLAYER_EQUIPMENT_CHANGED\")\n\t\t\tf:RegisterEvent(\"ARTIFACT_UPDATE\")\n\t\t\tf:RegisterEvent(\"SOCKET_INFO_UPDATE\")\n\t\t\tf:RegisterEvent(\"COMBAT_RATING_UPDATE\")\n\t\t\t_updateItems(\"player\", f)\n\t\t\tf:Show()\n\t\tend)\n\n\t\t_G.PaperDollFrame:HookScript(\"OnHide\", function()\n\t\t\tf:UnregisterEvent(\"PLAYER_EQUIPMENT_CHANGED\")\n\t\t\tf:UnregisterEvent(\"ARTIFACT_UPDATE\")\n\t\t\tf:UnregisterEvent(\"SOCKET_INFO_UPDATE\")\n\t\t\tf:UnregisterEvent(\"COMBAT_RATING_UPDATE\")\n\t\t\tf:Hide()\n\t\tend)\n\telseif event == \"PLAYER_EQUIPMENT_CHANGED\" or event == \"ARTIFACT_UPDATE\" or event == \"SOCKET_INFO_UPDATE\" or event == \"COMBAT_RATING_UPDATE\" then\n\t\tif (...) == 16 then\n\t\t\tequiped[16] = nil\n\t\t\tequiped[17] = nil\n\t\tend\n\t\t_updateItems(\"player\", f)\n\telseif event == \"INSPECT_READY\" or event == \"UNIT_INVENTORY_CHANGED\" then\n\t\t_updateItems(\"target\", g)\n\tend\nend\nf:SetScript(\"OnEvent\", OnEvent)\n\n----------------------------------------------------------------------------------------\n--\tItem level on flyout buttons (by Merathilis)\n----------------------------------------------------------------------------------------\nlocal ItemDB = {}\n\nlocal function _getRealItemLevel(link, bag, slot)\n\tif ItemDB[link] then return ItemDB[link] end\n\n\tlocal realItemLevel\n\tif bag and type(bag) == \"string\" then\n\t\trealItemLevel = C_Item.GetCurrentItemLevel(ItemLocation:CreateFromEquipmentSlot(slot))\n\telse\n\t\trealItemLevel = C_Item.GetCurrentItemLevel(ItemLocation:CreateFromBagAndSlot(bag, slot))\n\tend\n\n\tItemDB[link] = tonumber(realItemLevel)\n\treturn realItemLevel\nend\n\nlocal function SetupFlyoutLevel(button, bag, slot)\n\tif not button.iLvl then\n\t\tbutton.iLvl = button:CreateFontString(nil, \"OVERLAY\", \"iLvLFont\")\n\t\tbutton.iLvl:SetPoint(\"TOP\", 0, -2)\n\tend\n\n\tlocal link, level\n\tif bag then\n\t\tlink = C_Container.GetContainerItemLink(bag, slot)\n\t\tlevel = _getRealItemLevel(link, bag, slot)\n\telse\n\t\tlink = GetInventoryItemLink(\"player\", slot)\n\t\tlevel = _getRealItemLevel(link, \"player\", slot)\n\tend\n\n\tif level then\n\t\tbutton.iLvl:SetText(\"|cFFFFFF00\"..level)\n\tend\nend\n\nhooksecurefunc(\"EquipmentFlyout_DisplayButton\", function(button)\n\tlocal location = button.location\n\n\tif not location or location >= EQUIPMENTFLYOUT_FIRST_SPECIAL_LOCATION then\n\t\tif button.iLvl then button.iLvl:SetText(\"\") end\n\t\treturn\n\tend\n\n\tlocal _, _, bags, voidStorage, slot, bag = EquipmentManager_UnpackLocation(location)\n\tif voidStorage then return end\n\n\tif bags then\n\t\tSetupFlyoutLevel(button, bag, slot)\n\telse\n\t\tSetupFlyoutLevel(button, nil, slot)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Misc/Threat.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.threat.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on alThreatMeter(by Allez)\n----------------------------------------------------------------------------------------\nlocal spacing = 7\n\nlocal ThreatMeterAnchor = CreateFrame(\"Frame\", \"ThreatMeterAnchor\", UIParent)\nThreatMeterAnchor:SetSize(C.threat.width + 4, (C.threat.height * C.threat.bar_rows) + (spacing * (C.threat.bar_rows - 1)) + 4)\nif C.actionbar.split_bars then\n\tThreatMeterAnchor:SetPoint(C.position.threat_meter[1], SplitBarRight, C.position.threat_meter[3], C.position.threat_meter[4], C.position.threat_meter[5])\nelse\n\tThreatMeterAnchor:SetPoint(unpack(C.position.threat_meter))\nend\n\nlocal bar, tList, barList = {}, {}, {}\nlocal targeted = false\n\nRAID_CLASS_COLORS[\"PET\"] = {r = 0, g = 0.7, b = 0, colorStr = \"ff00b200\"}\n\nlocal CreateFS = function(frame)\n\tlocal fstring = frame:CreateFontString(nil, \"OVERLAY\")\n\tfstring:SetFont(C.font.threat_meter_font, C.font.threat_meter_font_size, C.font.threat_meter_font_style)\n\tfstring:SetShadowOffset(C.font.threat_meter_font_shadow and 1 or 0, C.font.threat_meter_font_shadow and -1 or 0)\n\treturn fstring\nend\n\nlocal AddUnit = function(unit)\n\tlocal threatpct, _, threatval = select(3, UnitDetailedThreatSituation(unit, \"target\"))\n\tif threatval and threatval < 0 then\n\t\tthreatval = threatval + 410065408\n\tend\n\tlocal guid = UnitGUID(unit)\n\tif not tList[guid] then\n\t\ttinsert(barList, guid)\n\t\ttList[guid] = {\n\t\t\tname = UnitName(unit),\n\t\t\tclass = UnitIsPlayer(unit) and select(2, UnitClass(unit)) or \"PET\",\n\t\t}\n\tend\n\ttList[guid].pct = threatpct or 0\n\ttList[guid].val = threatval or 0\nend\n\nlocal CheckUnit = function(unit)\n\tif UnitExists(unit) and UnitIsVisible(unit) then\n\t\tAddUnit(unit)\n\t\tif UnitExists(unit..\"pet\") then\n\t\t\tAddUnit(unit..\"pet\")\n\t\tend\n\tend\nend\n\nlocal CreateBar = function()\n\tlocal bar = CreateFrame(\"Statusbar\", nil, UIParent)\n\tbar:SetSize(C.threat.width, C.threat.height)\n\tbar:SetStatusBarTexture(C.media.texture)\n\tbar:SetMinMaxValues(0, 100)\n\tbar:CreateBackdrop(\"Default\")\n\n\tbar.bg = bar:CreateTexture(nil, \"BACKGROUND\")\n\tbar.bg:SetAllPoints(bar)\n\tbar.bg:SetTexture(C.media.texture)\n\n\tbar.left = CreateFS(bar)\n\tbar.left:SetPoint(\"LEFT\", 2, 0)\n\tbar.left:SetJustifyH(\"LEFT\")\n\n\tbar.right = CreateFS(bar)\n\tbar.right:SetPoint(\"RIGHT\", 1, 0)\n\tbar.right:SetJustifyH(\"RIGHT\")\n\n\tbar:Hide()\n\treturn bar\nend\n\nlocal SortMethod = function(a, b)\n\treturn tList[b].pct < tList[a].pct\nend\n\nlocal UpdateBars = function()\n\tfor _, v in pairs(bar) do\n\t\tv:Hide()\n\tend\n\ttable.sort(barList, SortMethod)\n\tfor i = 1, #barList do\n\t\tlocal cur = tList[barList[i]]\n\t\tlocal max = tList[barList[1]]\n\t\tif i > C.threat.bar_rows or not cur or cur.pct == 0 then break end\n\t\tif not bar[i] then\n\t\t\tbar[i] = CreateBar()\n\t\t\tif i == 1 then\n\t\t\t\tbar[i]:SetPoint(\"TOP\", ThreatMeterAnchor, \"TOP\", 0, -2)\n\t\t\telse\n\t\t\t\tbar[i]:SetPoint(\"TOPLEFT\", bar[i-1], \"BOTTOMLEFT\", 0, -spacing)\n\t\t\tend\n\t\tend\n\t\tbar[i]:SetValue(100 * cur.pct / max.pct)\n\t\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[cur.class]\n\t\tbar[i]:SetStatusBarColor(color.r, color.g, color.b)\n\t\tbar[i].bg:SetVertexColor(color.r, color.g, color.b, 0.2)\n\t\tbar[i].left:SetText(cur.name)\n\t\tbar[i].right:SetText(string.format(\"%s [%d%%]\", T.ShortValue(cur.val), cur.pct))\n\t\tbar[i]:Show()\n\tend\nend\n\nlocal UpdateThreat = function()\n\tif targeted then\n\t\tif GetNumGroupMembers() > 0 then\n\t\t\tlocal unit = IsInRaid() and \"raid\" or \"party\"\n\t\t\tfor i = 1, GetNumGroupMembers(), 1 do\n\t\t\t\tCheckUnit(unit..i)\n\t\t\tend\n\t\tend\n\t\tCheckUnit(\"targettarget\")\n\t\tCheckUnit(\"player\")\n\tend\n\tUpdateBars()\nend\n\nlocal OnEvent = function(_, event)\n\tif event == \"PLAYER_TARGET_CHANGED\" or event == \"UNIT_THREAT_LIST_UPDATE\" then\n\t\tif C.threat.hide_solo == true and GetNumGroupMembers() == 0 then\n\t\t\ttargeted = false\n\t\telse\n\t\t\tif UnitExists(\"target\") and not UnitIsDead(\"target\") and not UnitIsPlayer(\"target\") and UnitCanAttack(\"player\", \"target\") then\n\t\t\t\ttargeted = true\n\t\t\telse\n\t\t\t\ttargeted = false\n\t\t\tend\n\t\tend\n\tend\n\tif event == \"PLAYER_TARGET_CHANGED\" or event == \"PLAYER_REGEN_ENABLED\" then\n\t\twipe(tList)\n\t\twipe(barList)\n\tend\n\tUpdateThreat()\nend\n\nlocal addon = CreateFrame(\"Frame\")\naddon:SetScript(\"OnEvent\", OnEvent)\naddon:RegisterEvent(\"PLAYER_TARGET_CHANGED\")\naddon:RegisterEvent(\"UNIT_THREAT_LIST_UPDATE\")\naddon:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\nSlashCmdList.alThreat = function()\n\tfor i = 1, C.threat.bar_rows do\n\t\ttList[i] = {\n\t\t\tname = UnitName(\"player\"),\n\t\t\tclass = select(2, UnitClass(\"player\")),\n\t\t\tpct = i / C.threat.bar_rows * 100,\n\t\t\tval = i * 10000,\n\t\t}\n\t\ttinsert(barList, i)\n\tend\n\tUpdateBars()\n\twipe(tList)\n\twipe(barList)\nend\nSLASH_alThreat1 = \"/threat\"\nSLASH_alThreat2 = \"/еркуфе\""
  },
  {
    "path": "ShestakUI/Modules/Quests/AutoAccept.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.automation.accept_quest ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tQuest automation(QuickQuest by p3lim)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal QuickQuestDB = {\n\tgeneral = {\n\t\tshare = false,\n\t\tskipgossip = true,\n\t\tskipgossipwhen = 1,\n\t\tpaydarkmoonfaire = true,\n\t\tpausekey = 'SHIFT',\n\t\tpausekeyreverse = false,\n\t},\n\tblocklist = {\n\t\titems = {\n\t\t\t-- Inscription weapons\n\t\t\t[79343] = true, -- Inscribed Tiger Staff\n\t\t\t[79340] = true, -- Inscribed Crane Staff\n\t\t\t[79341] = true, -- Inscribed Serpent Staff\n\n\t\t\t-- Darkmoon Faire artifacts\n\t\t\t[71635] = true, -- Imbued Crystal\n\t\t\t[71636] = true, -- Monstrous Egg\n\t\t\t[71637] = true, -- Mysterious Grimoire\n\t\t\t[71638] = true, -- Ornate Weapon\n\t\t\t[71715] = true, -- A Treatise on Strategy\n\t\t\t[71951] = true, -- Banner of the Fallen\n\t\t\t[71952] = true, -- Captured Insignia\n\t\t\t[71953] = true, -- Fallen Adventurer's Journal\n\t\t\t[71716] = true, -- Soothsayer's Runes\n\n\t\t\t-- Tiller Gifts\n\t\t\t[79264] = true, -- Ruby Shard\n\t\t\t[79265] = true, -- Blue Feather\n\t\t\t[79266] = true, -- Jade Cat\n\t\t\t[79267] = true, -- Lovely Apple\n\t\t\t[79268] = true, -- Marsh Lily\n\n\t\t\t-- Garrison scouting missives\n\t\t\t[122424] = true, -- Scouting Missive: Broken Precipice\n\t\t\t[122423] = true, -- Scouting Missive: Broken Precipice\n\t\t\t[122418] = true, -- Scouting Missive: Darktide Roost\n\t\t\t[122417] = true, -- Scouting Missive: Darktide Roost\n\t\t\t[122400] = true, -- Scouting Missive: Everbloom Wilds\n\t\t\t[122404] = true, -- Scouting Missive: Everbloom Wilds\n\t\t\t[122420] = true, -- Scouting Missive: Gorian Proving Grounds\n\t\t\t[122419] = true, -- Scouting Missive: Gorian Proving Grounds\n\t\t\t[122402] = true, -- Scouting Missive: Iron Siegeworks\n\t\t\t[122406] = true, -- Scouting Missive: Iron Siegeworks\n\t\t\t[122413] = true, -- Scouting Missive: Lost Veil Anzu\n\t\t\t[122414] = true, -- Scouting Missive: Lost Veil Anzu\n\t\t\t[122403] = true, -- Scouting Missive: Magnarok\n\t\t\t[122399] = true, -- Scouting Missive: Magnarok\n\t\t\t[122421] = true, -- Scouting Missive: Mok'gol Watchpost\n\t\t\t[122422] = true, -- Scouting Missive: Mok'gol Watchpost\n\t\t\t[122411] = true, -- Scouting Missive: Pillars of Fate\n\t\t\t[122409] = true, -- Scouting Missive: Pillars of Fate\n\t\t\t[122412] = true, -- Scouting Missive: Shattrath Harbor\n\t\t\t[122410] = true, -- Scouting Missive: Shattrath Harbor\n\t\t\t[122408] = true, -- Scouting Missive: Skettis\n\t\t\t[122407] = true, -- Scouting Missive: Skettis\n\t\t\t[122416] = true, -- Scouting Missive: Socrethar's Rise\n\t\t\t[122415] = true, -- Scouting Missive: Socrethar's Rise\n\t\t\t[122405] = true, -- Scouting Missive: Stonefury Cliffs\n\t\t\t[122401] = true, -- Scouting Missive: Stonefury Cliffs\n\n\t\t\t-- Misc\n\t\t\t[88604] = true, -- Nat's Fishing Journal\n\t\t},\n\t\tnpcs = {\n\t\t\t-- misc\n\t\t\t[103792] = true, -- Griftah (his quests are scams)\n\t\t\t[143925] = true, -- Dark Iron Mole Machine (Dark Iron Dwarf racial)\n\n\t\t\t-- Bodyguards\n\t\t\t[86945] = true, -- Aeda Brightdawn (Horde)\n\t\t\t[86933] = true, -- Vivianne (Horde)\n\t\t\t[86927] = true, -- Delvar Ironfist (Alliance)\n\t\t\t[86934] = true, -- Defender Illona (Alliance)\n\t\t\t[86682] = true, -- Tormmok\n\t\t\t[86964] = true, -- Leorajh\n\t\t\t[86946] = true, -- Talonpriest Ishaal\n\n\t\t\t-- Sassy Imps\n\t\t\t[95139] = true,\n\t\t\t[95141] = true,\n\t\t\t[95142] = true,\n\t\t\t[95143] = true,\n\t\t\t[95144] = true,\n\t\t\t[95145] = true,\n\t\t\t[95146] = true,\n\t\t\t[95200] = true,\n\t\t\t[95201] = true,\n\t\t},\n\t\tquests = {\n\t\t\t-- 6.0 coins\n\t\t\t[36054] = true, -- Sealing Fate: Gold\n\t\t\t[37454] = true, -- Sealing Fate: Piles of Gold\n\t\t\t[37455] = true, -- Sealing Fate: Immense Fortune of Gold\n\t\t\t[36055] = true, -- Sealing Fate: Apexis Crystals\n\t\t\t[37452] = true, -- Sealing Fate: Heap of Apexis Crystals\n\t\t\t[37453] = true, -- Sealing Fate: Mountain of Apexis Crystals\n\t\t\t[36056] = true, -- Sealing Fate: Garrison Resources\n\t\t\t[37456] = true, -- Sealing Fate: Stockpiled Garrison Resources\n\t\t\t[37457] = true, -- Sealing Fate: Tremendous Garrison Resources\n\t\t\t[36057] = true, -- Sealing Fate: Honor\n\n\t\t\t-- 7.0 coins\n\t\t\t[43892] = true, -- Sealing Fate: Order Resources\n\t\t\t[43893] = true, -- Sealing Fate: Stashed Order Resources\n\t\t\t[43894] = true, -- Sealing Fate: Extraneous Order Resources\n\t\t\t[43895] = true, -- Sealing Fate: Gold\n\t\t\t[43896] = true, -- Sealing Fate: Piles of Gold\n\t\t\t[43897] = true, -- Sealing Fate: Immense Fortune of Gold\n\t\t\t[47851] = true, -- Sealing Fate: Marks of Honor\n\t\t\t[47864] = true, -- Sealing Fate: Additional Marks of Honor\n\t\t\t[47865] = true, -- Sealing Fate: Piles of Marks of Honor\n\n\t\t\t-- 8.0 coins\n\t\t\t[52834] = true, -- Seal of Wartorn Fate: Gold\n\t\t\t[52838] = true, -- Seal of Wartorn Fate: Piles of Gold\n\t\t\t[52835] = true, -- Seal of Wartorn Fate: Marks of Honor\n\t\t\t[52839] = true, -- Seal of Wartorn Fate: Additional Marks of Honor\n\t\t\t[52837] = true, -- Seal of Wartorn Fate: War Resources\n\t\t\t[52840] = true, -- Seal of Wartorn Fate: Stashed War Resources\n\n\t\t\t-- 7.0 valuable resources\n\t\t\t[48910] = true, -- Supplying Krokuun\n\t\t\t[48634] = true, -- Further Supplying Krokuun\n\t\t\t[48911] = true, -- Void Inoculation\n\t\t\t[48635] = true, -- More Void Inoculation\n\t\t\t[48799] = true, -- Fuel for a Doomed World\n\n\t\t\t-- 8.0 emissaries\n\t\t\t[54451] = true, -- Baubles from the Seekers\n\t\t\t[53982] = true, -- Supplies From The Unshackled\n\t\t\t[54453] = true, -- Supplies from Magni\n\t\t\t[54454] = true, -- Supplies from 7th Legion\n\t\t\t[54455] = true, -- Supplies from Honorbound\n\t\t\t[54456] = true, -- Supplies from Order of Embers\n\t\t\t[54457] = true, -- Supplies from Storm Wake\n\t\t\t[54458] = true, -- Supplies from Proudmoore Admiralty\n\t\t\t[54460] = true, -- Supplies from Talanji's Expedition\n\t\t\t[54461] = true, -- Supplies from Voldunai Supplies\n\t\t\t[54462] = true, -- Supplies from Zandalari Empire\n\t\t\t[55348] = true, -- Supplies from the Rustbolt Resistance\n\t\t\t[55976] = true, -- Supplies From the Waveblade Ankoan\n\n\t\t\t-- 9.0 valuable resources\n\t\t\t[64541] = true, -- The Cost of Death (Ve'nari)\n\n\t\t\t-- 10.0 valuable resources\n\t\t\t[70183] = true, -- Specialized Secrets: Alchemy (Khadin)\n\t\t\t[70184] = true, -- Specialized Secrets: Blacksmithing (Khadin)\n\t\t\t[70186] = true, -- Specialized Secrets: Enchanting (Khadin)\n\t\t\t[70187] = true, -- Specialized Secrets: Engineering (Khadin)\n\t\t\t[70190] = true, -- Specialized Secrets: Herbalism (Khadin)\n\t\t\t[70188] = true, -- Specialized Secrets: Inscription (Khadin)\n\t\t\t[70189] = true, -- Specialized Secrets: Jewelcrafting (Khadin)\n\t\t\t[70191] = true, -- Specialized Secrets: Leatherworking (Khadin)\n\t\t\t[70192] = true, -- Specialized Secrets: Mining (Khadin)\n\t\t\t[70193] = true, -- Specialized Secrets: Skinning (Khadin)\n\t\t\t[70194] = true, -- Specialized Secrets: Tailoring (Khadin)\n\t\t},\n\t},\n}\n\nlocal EventHandler = CreateFrame('Frame')\nEventHandler.events = {}\nEventHandler:SetScript('OnEvent', function(self, event, ...)\n\tself:Trigger(event, ...)\nend)\n\nfunction EventHandler:Register(event, func)\n\tlocal registered = not not self.events[event]\n\tif not registered then\n\t\tself.events[event] = {}\n\tend\n\n\tfor _, f in next, self.events[event] do\n\t\tif f == func then\n\t\t\t-- avoid the same function being registered multiple times for the same event\n\t\t\treturn\n\t\tend\n\tend\n\n\ttable.insert(self.events[event], func)\n\n\tif not registered then\n\t\tself:RegisterEvent(event)\n\tend\nend\n\nfunction EventHandler:Unregister(event, func)\n\tlocal funcs = self.events[event]\n\tif funcs then\n\t\tfor i, f in next, funcs do\n\t\t\tif f == func then\n\t\t\t\tfuncs[i] = nil\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\n\n\tif funcs and #funcs == 0 then\n\t\tself:UnregisterEvent(event)\n\tend\nend\n\nfunction EventHandler:Trigger(event, ...)\n\tlocal funcs = self.events[event]\n\tif funcs then\n\t\tfor _, func in next, funcs do\n\t\t\tif type(func) == 'string' then\n\t\t\t\tself:Trigger(func, ...)\n\t\t\telse\n\t\t\t\tif func(...) then\n\t\t\t\t\tself:Unregister(event, func)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nns.EventHandler = EventHandler\n\nlocal NPC_ID_PATTERN = '%w+%-.-%-.-%-.-%-.-%-(.-)%-'\nfunction ns.GetNPCID(unit)\n\tlocal npcGUID = UnitGUID(unit or 'npc')\n\tif npcGUID then\n\t\treturn tonumber(npcGUID:match(NPC_ID_PATTERN))\n\tend\nend\n\nfunction ns.ShouldAcceptTrivialQuests()\n\tfor index = 1, GetNumTrackingTypes() do\n\t\tlocal name, _, isActive = GetTrackingInfo(index)\n\t\tif name == MINIMAP_TRACKING_TRIVIAL_QUESTS then\n\t\t\treturn isActive\n\t\tend\n\tend\nend\n\nfunction ns.tLength(t)\n\tlocal count = 0\n\tfor _ in next, t do\n\t\tcount = count + 1\n\tend\n\treturn count\nend\n\nlocal EventHandler = ns.EventHandler\nlocal paused\n\nlocal DARKMOON_ISLE_MAP_ID = 407\nlocal DARKMOON_FAIRE_TELEPORT_NPC_ID = 57850 -- Teleportologist Fozlebub\n\nlocal ignoredQuests = {}\nlocal cashRewards = {\n\t[45724] = 1e5, -- Champion's Purse, 10 gold\n\t[64491] = 2e6, -- Royal Reward, 200 gold\n\n\t-- items from the Sixtrigger brothers quest chain in Stormheim\n\t[138127] = 15, -- Mysterious Coin, 15 copper\n\t[138129] = 11, -- Swatch of Priceless Silk, 11 copper\n\t[138131] = 24, -- Magical Sprouting Beans, 24 copper\n\t[138123] = 15, -- Shiny Gold Nugget, 15 copper\n\t[138125] = 16, -- Crystal Clear Gemstone, 16 copper\n\t[138133] = 27, -- Elixir of Endless Wonder, 27 copper\n}\nlocal darkmoonNPCs = {\n\t-- Darkmoon Faire teleporation NPCs\n\t[57850] = true, -- Teleportologist Fozlebub\n\t[55382] = true, -- Darkmoon Faire Mystic Mage (Horde)\n\t[54334] = true, -- Darkmoon Faire Mystic Mage (Alliance)\n}\nlocal rogueNPCs = {\n\t-- Rogue class hall doors\n\t[97004] = true, -- \"Red\" Jack Findle\n\t[96782] = true, -- Lucian Trias\n\t[93188] = true, -- Mongar\n}\n\nlocal function IsQuestIgnored(questID)\n\tif ignoredQuests[questID] then\n\t\treturn true\n\tend\n\n\tlocal questTitle = tonumber(questID) and C_QuestLog.GetTitleForQuestID(questID) or ''\n\tfor key in next, QuickQuestDB.blocklist.quests do\n\t\tif key == questID or questTitle:lower():find(tostring(key):lower()) then\n\t\t\treturn true\n\t\tend\n\tend\n\n\treturn false\nend\n\nEventHandler:Register('GOSSIP_CONFIRM', function(index)\n\t-- triggered when a gossip confirm prompt is displayed\n\tif paused then\n\t\treturn\n\tend\n\n\tif QuickQuestDB.general.paydarkmoonfaire and darkmoonNPCs[ns.GetNPCID()] then\n\t\tC_GossipInfo.SelectOption(index, '', true)\n\n\t\t-- this is considered an intrusive action, as we're modifying the UI\n\t\tStaticPopup_Hide('GOSSIP_CONFIRM')\n\tend\nend)\n\nEventHandler:Register('GOSSIP_SHOW', function()\n\t-- triggered when the player interacts with an NPC that presents dialogue\n\tif paused then\n\t\treturn\n\tend\n\n\tlocal npcID = ns.GetNPCID()\n\tif QuickQuestDB.blocklist.npcs[npcID] then\n\t\treturn\n\tend\n\n\tif C_Map.GetBestMapForUnit('player') == DARKMOON_ISLE_MAP_ID then\n\t\t-- we want to auto-accept the dialogues from Darkmoon Faire NPCs\n\t\tfor index, info in next, C_GossipInfo.GetOptions() do\n\t\t\tif info.name:find('FF008E8') then\n\t\t\t\t-- See if there is something else than the color we can easily match with\n\t\t\t\tC_GossipInfo.SelectOption(index)\n\t\t\t\treturn\n\t\t\tend\n\t\tend\n\tend\n\n\tif C_GossipInfo.GetNumActiveQuests() > 0 or C_GossipInfo.GetNumAvailableQuests() > 0 then\n\t\t-- bail if there is more than just dialogue\n\t\treturn\n\tend\n\n\tif rogueNPCs[npcID] then\n\t\t-- automatically open doors to the rogue class hall in Dalaran\n\t\tC_GossipInfo.SelectOption(1)\n\t\treturn\n\tend\n\n\tif QuickQuestDB.general.paydarkmoonfaire and npcID == DARKMOON_FAIRE_TELEPORT_NPC_ID then\n\t\tC_GossipInfo.SelectOption(1)\n\t\treturn\n\tend\n\n\tif #C_GossipInfo.GetOptions() == 1 and QuickQuestDB.general.skipgossip then\n\t\t-- automatically skip single dialogue under certain conditions\n\t\tlocal _, instanceType = GetInstanceInfo()\n\t\tif instanceType == 'raid' and QuickQuestDB.general.skipgossipwhen > 0 then\n\t\t\tif GetNumGroupMembers() == 0 or QuickQuestDB.general.skipgossipwhen == 2 then\n\t\t\t\t-- select dialogue if alone or when configured to \"Always\" while in a raid\n\t\t\t\tC_GossipInfo.SelectOption(1)\n\t\t\t\treturn\n\t\t\tend\n\t\telseif instanceType ~= 'raid' then\n\t\t\t-- always select single dialogue while outside a raid\n\t\t\tC_GossipInfo.SelectOption(1)\n\t\t\treturn\n\t\tend\n\tend\nend)\n\nEventHandler:Register('GOSSIP_SHOW', function()\n\t-- triggered when the player interacts with an NPC that presents dialogue\n\tif paused then\n\t\treturn\n\tend\n\n\tif QuickQuestDB.blocklist.npcs[ns.GetNPCID()] then\n\t\treturn\n\tend\n\n\t-- turn in all completed quests\n\tfor index, info in next, C_GossipInfo.GetActiveQuests() do\n\t\tif not IsQuestIgnored(info.questID) then\n\t\t\tif info.isComplete and not C_QuestLog.IsWorldQuest(info.questID) then\n\t\t\t\tC_GossipInfo.SelectActiveQuest(index)\n\t\t\tend\n\t\tend\n\tend\n\n\t-- accept all available quests\n\tfor index, info in next, C_GossipInfo.GetAvailableQuests() do\n\t\tif not IsQuestIgnored(info.questID) then\n\t\t\tif not info.isTrivial or ns.ShouldAcceptTrivialQuests() then\n\t\t\t\tC_GossipInfo.SelectAvailableQuest(index)\n\t\t\tend\n\t\tend\n\tend\nend)\n\nEventHandler:Register('QUEST_GREETING', function()\n\t-- triggered when the player interacts with an NPC that hands in/out quests\n\tif paused then\n\t\treturn\n\tend\n\n\tif QuickQuestDB.blocklist.npcs[ns.GetNPCID()] then\n\t\treturn\n\tend\n\n\t-- turn in all completed quests\n\tfor index = 1, GetNumActiveQuests() do\n\t\tif not IsQuestIgnored(GetActiveQuestID(index)) then\n\t\t\tlocal _, isComplete = GetActiveTitle(index)\n\t\t\tif isComplete and not C_QuestLog.IsWorldQuest(GetActiveQuestID(index)) then\n\t\t\t\tSelectActiveQuest(index)\n\t\t\tend\n\t\tend\n\tend\n\n\t-- accept all available quests\n\tfor index = 1, GetNumAvailableQuests() do\n\t\tlocal isTrivial, _, _, _, questID = GetAvailableQuestInfo(index)\n\t\tif not IsQuestIgnored(questID) then\n\t\t\tif not isTrivial or ns.ShouldAcceptTrivialQuests() then\n\t\t\t\tSelectAvailableQuest(index)\n\t\t\tend\n\t\tend\n\tend\nend)\n\nEventHandler:Register('QUEST_DETAIL', function(questItemID)\n\t-- triggered when the information about an available quest is available\n\tif paused then\n\t\treturn\n\tend\n\n\tif QuestIsFromAreaTrigger() then\n\t\t-- this type of quest is automatically accepted, but the dialogue is presented in a way that\n\t\t-- the player seems to have a choice to decline it, which they don't, so just accept it\n\t\tAcceptQuest()\n\telseif QuestGetAutoAccept() then\n\t\t-- this type of quest is automatically accepted, but the dialogue persists\n\t\tAcknowledgeAutoAcceptQuest()\n\telseif not C_QuestLog.IsQuestTrivial(GetQuestID()) or ns.ShouldAcceptTrivialQuests() then\n\t\tif IsQuestIgnored(GetQuestID()) then\n\t\t\tCloseQuest()\n\t\telse\n\t\t\tAcceptQuest()\n\t\tend\n\tend\nend)\n\nEventHandler:Register('QUEST_PROGRESS', function()\n\t-- triggered when an active quest is selected during turn-in\n\tif paused then\n\t\treturn\n\tend\n\n\tif QuickQuestDB.blocklist.npcs[ns.GetNPCID()] then\n\t\treturn\n\tend\n\n\tif not IsQuestCompletable() then\n\t\treturn\n\tend\n\n\t-- iterate through the items part of the quest\n\tfor index = 1, GetNumQuestItems() do\n\t\tlocal itemLink = GetQuestItemLink('required', index)\n\t\tif itemLink then\n\t\t\t-- check to see if the item is blocked\n\t\t\tlocal questItemID = GetItemInfoFromHyperlink(itemLink)\n\t\t\tfor itemID in next, QuickQuestDB.blocklist.items do\n\t\t\t\tif itemID == questItemID then\n\t\t\t\t\t-- item is blocked, prevent this quest from opening again and close it\n\t\t\t\t\tignoredQuests[GetQuestID()] = true\n\t\t\t\t\tCloseQuest()\n\t\t\t\t\treturn\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\t-- item is not cached yet, trigger the item and wait for the cache to populate\n\t\t\tEventHandler:Register('QUEST_ITEM_UPDATE', 'QUEST_PROGRESS')\n\t\t\tGetQuestItemInfo('required', index)\n\t\t\treturn\n\t\tend\n\tend\n\n\tCompleteQuest()\n\tEventHandler:Unregister('QUEST_ITEM_UPDATE', 'QUEST_PROGRESS')\nend)\n\nEventHandler:Register('QUEST_COMPLETE', function()\n\t-- triggered when an active quest is ready to be completed\n\tif paused then\n\t\treturn\n\tend\n\n\tif GetNumQuestChoices() <= 1 then\n\t\t-- complete the quest by accepting the first item\n\t\tGetQuestReward(1)\n\tend\nend)\n\nEventHandler:Register('QUEST_COMPLETE', function()\n\t-- triggered when an active quest is ready to be completed\n\tlocal numItemRewards = GetNumQuestChoices()\n\tif numItemRewards <= 1 then\n\t\t-- no point iterating over a single item or none at all\n\t\treturn\n\tend\n\n\tlocal highestItemValue, highestItemValueIndex = 0\n\n\t-- iterate through the item rewards and automatically select the one worth the most\n\tfor index = 1, numItemRewards do\n\t\tlocal itemLink = GetQuestItemLink('choice', index)\n\t\tif itemLink then\n\t\t\t-- check the value on the item and compare it to the others\n\t\t\tlocal _, _, _, _, _, _, _, _, _, _, itemValue = GetItemInfo(itemLink)\n\t\t\tlocal itemID = GetItemInfoFromHyperlink(itemLink)\n\n\t\t\t-- some items are containers that contains currencies of worth\n\t\t\titemValue = cashRewards[itemID] or itemValue\n\n\t\t\t-- compare the values\n\t\t\tif itemValue > highestItemValue then\n\t\t\t\thighestItemValue = itemValue\n\t\t\t\thighestItemValueIndex = index\n\t\t\tend\n\t\telse\n\t\t\t-- item is not cached yet, trigger the item and wait for the cache to populate\n\t\t\tEventHandler:Register('QUEST_ITEM_UPDATE', 'QUEST_COMPLETE')\n\t\t\tGetQuestItemInfo('choice', index)\n\t\t\treturn\n\t\tend\n\tend\n\n\tif highestItemValueIndex then\n\t\t-- this is considered an intrusive action, as we're modifying the UI\n\t\tQuestInfoItem_OnClick(QuestInfoRewardsFrame.RewardButtons[highestItemValueIndex])\n\tend\n\n\tEventHandler:Unregister('QUEST_ITEM_UPDATE', 'QUEST_COMPLETE')\nend)\n\nEventHandler:Register('QUEST_WATCH_LIST_CHANGED', function()\n\t-- triggered when the player's quest log has been altered\n\tif paused then\n\t\treturn\n\tend\n\n\t-- check for quest popups whenever the quest log is updated, which also happens on login, and\n\t-- when the player loots an item that starts a quest\n\tif GetNumAutoQuestPopUps() > 0 then\n\t\tif UnitIsDeadOrGhost('player') then\n\t\t\t-- can't accept quests while we're dead\n\t\t\tEventHandler:Register('PLAYER_REGEN_ENABLED', 'QUEST_WATCH_LIST_CHANGED')\n\t\t\treturn\n\t\tend\n\n\t\tEventHandler:Unregister('PLAYER_REGEN_ENABLED', 'QUEST_WATCH_LIST_CHANGED')\n\n\t\t-- this is considered an intrusive action, as we're modifying the UI\n\t\tlocal questID, questType = GetAutoQuestPopUp(1)\n\t\tif questType == 'OFFER' then\n\t\t\tShowQuestOffer(questID)\n\t\telse\n\t\t\tShowQuestComplete(questID)\n\t\tend\n\n\t\t-- remove the popup once accepted/completed, the game logic doesn't handle this,\n\t\t-- but this calls FrameXML API which might cause taints, we'll see\n\t\tAutoQuestPopupTracker_RemovePopUp(questID)\n\tend\nend)\n\nEventHandler:Register('QUEST_ACCEPT_CONFIRM', function()\n\t-- triggered when a quest is shared in the party, but requires confirmation (like escorts)\n\tif paused then\n\t\treturn\n\tend\n\n\tAcceptQuest()\nend)\n\nEventHandler:Register('QUEST_ACCEPTED', function(questID)\n\t-- triggered when a quest has been accepted by the player\n\tif QuickQuestDB.general.share then\n\t\tlocal questLogIndex = C_QuestLog.GetLogIndexForQuestID(questID)\n\t\tif questLogIndex then\n\t\t\tQuestLogPushQuest(questLogIndex)\n\t\tend\n\tend\nend)\n\nEventHandler:Register('MODIFIER_STATE_CHANGED', function(key, state)\n\t-- triggered when the player clicks any modifier keys on the keyboard\n\tif string.sub(key, 2) == QuickQuestDB.general.pausekey then\n\t\t-- change the paused state\n\t\tif QuickQuestDB.general.pausekeyreverse then\n\t\t\tpaused = state ~= 1\n\t\telse\n\t\t\tpaused = state == 1\n\t\tend\n\tend\nend)\n\nEventHandler:Register('PLAYER_LOGIN', function()\n\t-- triggered when the game has completed the login process\n\tif QuickQuestDB.general.pausekeyreverse then\n\t\t-- default to a paused state\n\t\tpaused = true\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Quests/AutoButton.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.misc.quest_auto_button ~= true or IsAddOnLoaded(\"ExtraQuestButton\") then return end\n\n----------------------------------------------------------------------------------------\n--\tAutoButton for used items(by Elv22) (use macro /click AutoButton)\n----------------------------------------------------------------------------------------\nlocal function AutoButtonHide()\n\tAutoButton:SetAlpha(0)\n\tif not InCombatLockdown() then\n\t\tAutoButton:EnableMouse(false)\n\telse\n\t\tAutoButton:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\tAutoButton:SetScript(\"OnEvent\", function(_, event)\n\t\t\tif event == \"PLAYER_REGEN_ENABLED\" then\n\t\t\t\tAutoButton:EnableMouse(false)\n\t\t\t\tAutoButton:UnregisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\t\tend\n\t\tend)\n\tend\nend\n\nlocal function AutoButtonShow(item)\n\tAutoButton:SetAlpha(1)\n\tif not InCombatLockdown() then\n\t\tAutoButton:EnableMouse(true)\n\t\tif item then\n\t\t\tAutoButton:SetAttribute(\"item\", item)\n\t\tend\n\telse\n\t\tAutoButton:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\tAutoButton:SetScript(\"OnEvent\", function(_, event)\n\t\t\tif event == \"PLAYER_REGEN_ENABLED\" then\n\t\t\t\tAutoButton:EnableMouse(true)\n\t\t\t\tif item then\n\t\t\t\t\tAutoButton:SetAttribute(\"item\", item)\n\t\t\t\tend\n\t\t\t\tAutoButton:UnregisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\t\tend\n\t\tend)\n\tend\nend\n\n-- Create anchor\nlocal AutoButtonAnchor = CreateFrame(\"Frame\", \"AutoButtonAnchor\", UIParent)\nAutoButtonAnchor:SetPoint(unpack(C.position.auto_button))\nAutoButtonAnchor:SetSize(40, 40)\n\n-- Create button\nlocal AutoButton = CreateFrame(\"Button\", \"AutoButton\", UIParent, \"SecureActionButtonTemplate\")\nAutoButton:SetSize(40, 40)\nAutoButton:SetPoint(\"CENTER\", AutoButtonAnchor, \"CENTER\", 0, 0)\nAutoButton:SetTemplate(\"Default\")\nAutoButton:StyleButton(true)\nAutoButton:RegisterForClicks(\"AnyUp\", \"AnyDown\")\nAutoButton:SetAttribute(\"type1\", \"item\")\nAutoButton:SetAttribute(\"type2\", \"item\")\nAutoButton:SetAttribute(\"type3\", \"macro\")\nAutoButtonHide()\n\n-- Texture for our button\nAutoButton.t = AutoButton:CreateTexture(nil, \"BORDER\")\nAutoButton.t:SetPoint(\"TOPLEFT\", 2, -2)\nAutoButton.t:SetPoint(\"BOTTOMRIGHT\", -2, 2)\nAutoButton.t:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n-- Count text for our button\nAutoButton.c = AutoButton:CreateFontString(nil, \"OVERLAY\")\nAutoButton.c:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\nAutoButton.c:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\nAutoButton.c:SetPoint(\"BOTTOMRIGHT\", 1, -2)\n\n-- Hotkey text for our button\nAutoButton.k = AutoButton:CreateFontString(nil, \"OVERLAY\")\nAutoButton.k:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\nAutoButton.k:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\nAutoButton.k:SetTextColor(0.7, 0.7, 0.7)\nAutoButton.k:SetPoint(\"TOPRIGHT\", 0, -2)\nAutoButton.k:SetJustifyH(\"RIGHT\")\nAutoButton.k:SetWidth(AutoButton:GetWidth() - 1)\nAutoButton.k:SetWordWrap(false)\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"UPDATE_BINDINGS\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function()\n\tlocal bind = GetBindingKey(\"QUEST_BUTTON\")\n\tif bind then\n\t\tSetOverrideBinding(AutoButton, false, bind, \"CLICK AutoButton:LeftButton\")\n\n\t\tbind = gsub(bind, \"(ALT%-)\", \"A\")\n\t\tbind = gsub(bind, \"(CTRL%-)\", \"C\")\n\t\tbind = gsub(bind, \"(SHIFT%-)\", \"S\")\n\t\tbind = gsub(bind, \"(Mouse Button )\", \"M\")\n\t\tbind = gsub(bind, \"(Кнопка мыши )\", \"M\")\n\t\tbind = gsub(bind, KEY_BUTTON3, \"M3\")\n\t\tbind = gsub(bind, KEY_PAGEUP, \"PU\")\n\t\tbind = gsub(bind, KEY_PAGEDOWN, \"PD\")\n\t\tbind = gsub(bind, KEY_SPACE, \"SpB\")\n\t\tbind = gsub(bind, KEY_INSERT, \"Ins\")\n\t\tbind = gsub(bind, KEY_HOME, \"Hm\")\n\t\tbind = gsub(bind, KEY_DELETE, \"Del\")\n\t\tbind = gsub(bind, KEY_NUMPADDECIMAL, \"Nu.\")\n\t\tbind = gsub(bind, KEY_NUMPADDIVIDE, \"Nu/\")\n\t\tbind = gsub(bind, KEY_NUMPADMINUS, \"Nu-\")\n\t\tbind = gsub(bind, KEY_NUMPADMULTIPLY, \"Nu*\")\n\t\tbind = gsub(bind, KEY_NUMPADPLUS, \"Nu+\")\n\t\tbind = gsub(bind, KEY_NUMLOCK, \"NuL\")\n\t\tbind = gsub(bind, KEY_MOUSEWHEELDOWN, \"MWD\")\n\t\tbind = gsub(bind, KEY_MOUSEWHEELUP, \"MWU\")\n\tend\n\tAutoButton.k:SetText(bind or \"\")\nend)\n\n-- Cooldown\nAutoButton.cd = CreateFrame(\"Cooldown\", nil, AutoButton, \"CooldownFrameTemplate\")\nAutoButton.cd:SetAllPoints(AutoButton.t)\nAutoButton.cd:SetFrameLevel(1)\n\nlocal function startScanningBags()\n\tAutoButtonHide()\n\t-- Scan bags for Item matchs\n\tfor b = 0, NUM_BAG_SLOTS do\n\t\tfor s = 1, C_Container.GetContainerNumSlots(b) do\n\t\t\tlocal itemID = C_Container.GetContainerItemID(b, s)\n\t\t\titemID = tonumber(itemID)\n\t\t\tif T.ABItems[itemID] and not T.ABItemsIgnore[itemID] then\n\t\t\t\tlocal itemName = GetItemInfo(itemID)\n\t\t\t\tlocal count = GetItemCount(itemID)\n\t\t\t\tlocal itemIcon = GetItemIcon(itemID)\n\n\t\t\t\t-- Set our texture to the item found in bags\n\t\t\t\tAutoButton.t:SetTexture(itemIcon)\n\n\t\t\t\t-- Get the count if there is one\n\t\t\t\tif count and count > 1 then\n\t\t\t\t\tAutoButton.c:SetText(count)\n\t\t\t\telse\n\t\t\t\t\tAutoButton.c:SetText(\"\")\n\t\t\t\tend\n\n\t\t\t\tAutoButton:SetScript(\"OnUpdate\", function()\n\t\t\t\t\tlocal cd_start, cd_finish, cd_enable = C_Container.GetContainerItemCooldown(b, s)\n\t\t\t\t\tCooldownFrame_Set(AutoButton.cd, cd_start, cd_finish, cd_enable)\n\t\t\t\tend)\n\n\t\t\t\tAutoButton:SetScript(\"OnEnter\", function(self)\n\t\t\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_LEFT\")\n\t\t\t\t\tGameTooltip:SetHyperlink(format(\"item:%s\", itemID))\n\t\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\t\tGameTooltip:AddLine(L_MOVE_MIDDLE_CLICK, 0.75, 0.9, 1)\n\t\t\t\t\tGameTooltip:Show()\n\t\t\t\tend)\n\n\t\t\t\tAutoButton:SetScript(\"OnLeave\", GameTooltip_Hide)\n\t\t\t\tAutoButton.id = itemID\n\n\t\t\t\tAutoButtonShow(itemName)\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- Add all items from quest to our table\nhooksecurefunc(\"QuestObjectiveItem_Initialize\", function(_, questLogIndex)\n\tlocal link = GetQuestLogSpecialItemInfo(questLogIndex)\n\tif link then\n\t\tlocal _, itemID = strsplit(\":\", link)\n\t\titemID = tonumber(itemID)\n\t\tT.ABItems[itemID] = true\n\t\tstartScanningBags()\n\tend\nend)\n\nlocal Scanner = CreateFrame(\"Frame\")\nScanner:RegisterEvent(\"BAG_UPDATE\")\nScanner:RegisterEvent(\"UNIT_INVENTORY_CHANGED\")\nScanner:SetScript(\"OnEvent\", function()\n\tstartScanningBags()\nend)\n\n-- Temp hide quest item by middle-click\nT.startScanningBags = startScanningBags\n\nlocal macro = \"/run local T = unpack(ShestakUI) T.ABItemsIgnore[AutoButton.id] = true T.startScanningBags() C_Timer.After(0.05, function() AutoButton:SetButtonState('NORMAL') end)\"\nAutoButton:SetAttribute(\"macrotext3\", macro)"
  },
  {
    "path": "ShestakUI/Modules/Quests/ObjectiveTracker.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tMove ObjectiveTrackerFrame and hide background\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\", \"ObjectiveTrackerAnchor\", UIParent)\nframe:SetPoint(unpack(C.position.quest))\nframe:SetSize(224, 150)\n\nObjectiveTrackerFrame:ClearAllPoints()\nObjectiveTrackerFrame:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 20, 0)\nObjectiveTrackerFrame:SetHeight(T.screenHeight / 1.6)\n\nObjectiveTrackerFrame.IsUserPlaced = function() return true end\n\nhooksecurefunc(ObjectiveTrackerFrame, \"SetPoint\", function(_, _, parent)\n\tif parent ~= frame then\n\t\tObjectiveTrackerFrame:ClearAllPoints()\n\t\tObjectiveTrackerFrame:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 20, -20)\n\tend\nend)\n\nlocal headers = {\n\tSCENARIO_CONTENT_TRACKER_MODULE,\n\tBONUS_OBJECTIVE_TRACKER_MODULE,\n\tUI_WIDGET_TRACKER_MODULE,\n\tCAMPAIGN_QUEST_TRACKER_MODULE,\n\tQUEST_TRACKER_MODULE,\n\tACHIEVEMENT_TRACKER_MODULE,\n\tWORLD_QUEST_TRACKER_MODULE,\n\tPROFESSION_RECIPE_TRACKER_MODULE\n}\nif T.newPatch then\n\ttinsert(headers, MONTHLY_ACTIVITIES_TRACKER_MODULE)\nend\n\nfor i = 1, #headers do\n\tlocal header = headers[i].Header\n\tif header then\n\t\theader.Background:Hide()\n\tend\nend\n\nObjectiveTrackerFrame.HeaderMenu.Title:SetAlpha(0)\n\n----------------------------------------------------------------------------------------\n--\tSkin ObjectiveTrackerFrame item buttons\n----------------------------------------------------------------------------------------\nlocal function HotkeyShow(self)\n\tlocal item = self:GetParent()\n\tif item.rangeOverlay then item.rangeOverlay:Show() end\nend\n\nlocal function HotkeyHide(self)\n\tlocal item = self:GetParent()\n\tif item.rangeOverlay then item.rangeOverlay:Hide() end\nend\n\nlocal function HotkeyColor(self, r)\n\tlocal item = self:GetParent()\n\tif item.rangeOverlay then\n\t\tif r == 1 then\n\t\t\titem.rangeOverlay:Show()\n\t\telse\n\t\t\titem.rangeOverlay:Hide()\n\t\tend\n\tend\nend\n\nhooksecurefunc(\"QuestObjectiveSetupBlockButton_Item\", function(block)\n\tlocal item = block and block.itemButton\n\n\tif item and not item.skinned then\n\t\titem:SetSize(25, 25)\n\t\titem:SetTemplate(\"Default\")\n\t\titem:StyleButton()\n\n\t\titem:SetNormalTexture(0)\n\n\t\titem.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\titem.icon:SetPoint(\"TOPLEFT\", item, 2, -2)\n\t\titem.icon:SetPoint(\"BOTTOMRIGHT\", item, -2, 2)\n\n\t\titem.Cooldown:SetAllPoints(item.icon)\n\n\t\titem.Count:ClearAllPoints()\n\t\titem.Count:SetPoint(\"TOPLEFT\", 1, -1)\n\t\titem.Count:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\titem.Count:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\n\t\tlocal rangeOverlay = item:CreateTexture(nil, \"OVERLAY\")\n\t\trangeOverlay:SetTexture(C.media.texture)\n\t\trangeOverlay:SetInside()\n\t\trangeOverlay:SetVertexColor(1, 0.3, 0.1, 0.6)\n\t\titem.rangeOverlay = rangeOverlay\n\n\t\thooksecurefunc(item.HotKey, \"Show\", HotkeyShow)\n\t\thooksecurefunc(item.HotKey, \"Hide\", HotkeyHide)\n\t\thooksecurefunc(item.HotKey, \"SetVertexColor\", HotkeyColor)\n\t\tHotkeyColor(item.HotKey, item.HotKey:GetTextColor())\n\t\titem.HotKey:SetAlpha(0)\n\n\t\titem.skinned = true\n\tend\nend)\n\nhooksecurefunc(\"QuestObjectiveSetupBlockButton_FindGroup\", function(block)\n\tif block.groupFinderButton and not block.groupFinderButton.styled then\n\t\tlocal icon = block.groupFinderButton\n\t\ticon:SetSize(26, 26)\n\t\ticon:SetNormalTexture(0)\n\t\ticon:SetHighlightTexture(0)\n\t\ticon:SetPushedTexture(0)\n\t\ticon.b = CreateFrame(\"Frame\", nil, icon)\n\t\ticon.b:SetTemplate(\"Overlay\")\n\t\ticon.b:SetPoint(\"TOPLEFT\", icon, \"TOPLEFT\", 2, -3)\n\t\ticon.b:SetPoint(\"BOTTOMRIGHT\", icon, \"BOTTOMRIGHT\", -4, 3)\n\t\ticon.b:SetFrameLevel(1)\n\n\t\ticon:HookScript(\"OnEnter\", function(self)\n\t\t\tif self:IsEnabled() then\n\t\t\t\tself.b:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\t\t\tif self.b.overlay then\n\t\t\t\t\tself.b.overlay:SetVertexColor(C.media.classborder_color[1] * 0.3, C.media.classborder_color[2] * 0.3, C.media.classborder_color[3] * 0.3, 1)\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\n\t\ticon:HookScript(\"OnLeave\", function(self)\n\t\t\tself.b:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tif self.b.overlay then\n\t\t\t\tself.b.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\n\t\t\tend\n\t\tend)\n\n\t\thooksecurefunc(icon, \"Show\", function(self)\n\t\t\tself.b:SetFrameLevel(1)\n\t\tend)\n\n\t\ticon.styled = true\n\tend\nend)\n\n-- WorldQuestsList button skin\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"WorldQuestsList\") then return end\n\n\tlocal orig = _G.WorldQuestList.ObjectiveTracker_Update_hook\n\tlocal function orig_hook(...)\n\t\torig(...)\n\t\tfor _, b in pairs(WorldQuestList.LFG_objectiveTrackerButtons) do\n\t\t\tif b and not b.skinned then\n\t\t\t\tb:SetSize(20, 20)\n\t\t\t\tb.texture:SetAtlas(\"socialqueuing-icon-eye\")\n\t\t\t\tb.texture:SetSize(12, 12)\n\t\t\t\tb:SetHighlightTexture(0)\n\n\t\t\t\tlocal point, anchor, point2, x, y = b:GetPoint()\n\t\t\t\tif x == -18 then\n\t\t\t\t\tb:SetPoint(point, anchor, point2, -13, y)\n\t\t\t\tend\n\n\t\t\t\tb.b = CreateFrame(\"Frame\", nil, b)\n\t\t\t\tb.b:SetTemplate(\"Overlay\")\n\t\t\t\tb.b:SetPoint(\"TOPLEFT\", b, \"TOPLEFT\", 0, 0)\n\t\t\t\tb.b:SetPoint(\"BOTTOMRIGHT\", b, \"BOTTOMRIGHT\", 0, 0)\n\t\t\t\tb.b:SetFrameLevel(1)\n\t\t\t\tb.skinned = true\n\t\t\tend\n\t\tend\n\tend\n\t_G.WorldQuestList.ObjectiveTracker_Update_hook = orig_hook\nend)\n\n----------------------------------------------------------------------------------------\n--\tDifficulty color for ObjectiveTrackerFrame lines\n----------------------------------------------------------------------------------------\nhooksecurefunc(QUEST_TRACKER_MODULE, \"Update\", function()\n\tfor i = 1, C_QuestLog.GetNumQuestWatches() do\n\t\tlocal questID = C_QuestLog.GetQuestIDForQuestWatchIndex(i)\n\t\tif not questID then\n\t\t\tbreak\n\t\tend\n\t\tlocal col = GetDifficultyColor(C_PlayerInfo.GetContentDifficultyQuestForPlayer(questID))\n\t\tlocal block = QUEST_TRACKER_MODULE:GetExistingBlock(questID)\n\t\tif block then\n\t\t\tblock.HeaderText:SetTextColor(col.r, col.g, col.b)\n\t\t\tblock.HeaderText.col = col\n\t\tend\n\tend\nend)\n\nhooksecurefunc(DEFAULT_OBJECTIVE_TRACKER_MODULE, \"AddObjective\", function(_, block)\n\tif block.module == ACHIEVEMENT_TRACKER_MODULE then\n\t\tblock.HeaderText:SetTextColor(0.75, 0.61, 0)\n\t\tblock.HeaderText.col = nil\n\tend\nend)\n\nhooksecurefunc(\"ObjectiveTrackerBlockHeader_OnLeave\", function(self)\n\tlocal block = self:GetParent()\n\tif block.HeaderText.col then\n\t\tblock.HeaderText:SetTextColor(block.HeaderText.col.r, block.HeaderText.col.g, block.HeaderText.col.b)\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tSkin ObjectiveTrackerFrame.HeaderMenu.MinimizeButton\n----------------------------------------------------------------------------------------\nif C.skins.blizzard_frames == true then\n\tlocal button = ObjectiveTrackerFrame.HeaderMenu.MinimizeButton\n\tbutton:SetSize(17, 17)\n\tbutton:StripTextures()\n\tbutton:SetTemplate(\"Overlay\")\n\n\tbutton.minus = button:CreateTexture(nil, \"OVERLAY\")\n\tbutton.minus:SetSize(7, 1)\n\tbutton.minus:SetPoint(\"CENTER\")\n\tbutton.minus:SetTexture(C.media.blank)\n\n\tbutton.plus = button:CreateTexture(nil, \"OVERLAY\")\n\tbutton.plus:SetSize(1, 7)\n\tbutton.plus:SetPoint(\"CENTER\")\n\tbutton.plus:SetTexture(C.media.blank)\n\n\tbutton:HookScript(\"OnEnter\", T.SetModifiedBackdrop)\n\tbutton:HookScript(\"OnLeave\", T.SetOriginalBackdrop)\n\n\tbutton.plus:Hide()\n\thooksecurefunc(\"ObjectiveTracker_Collapse\", function()\n\t\tbutton.plus:Show()\n\t\tbutton:SetNormalTexture(0)\n\t\tbutton:SetPushedTexture(0)\n\t\tif C.general.minimize_mouseover then\n\t\t\tbutton:SetAlpha(0)\n\t\t\tbutton:HookScript(\"OnEnter\", function() button:SetAlpha(1) end)\n\t\t\tbutton:HookScript(\"OnLeave\", function() button:SetAlpha(0) end)\n\t\tend\n\tend)\n\n\thooksecurefunc(\"ObjectiveTracker_Expand\", function()\n\t\tbutton.plus:Hide()\n\t\tbutton:SetNormalTexture(0)\n\t\tbutton:SetPushedTexture(0)\n\t\tif C.general.minimize_mouseover then\n\t\t\tbutton:SetAlpha(1)\n\t\t\tbutton:HookScript(\"OnEnter\", function() button:SetAlpha(1) end)\n\t\t\tbutton:HookScript(\"OnLeave\", function() button:SetAlpha(1) end)\n\t\tend\n\tend)\n\n\tlocal function SkinSmallMinimizeButton(button)\n\t\tbutton:SetSize(15, 15)\n\t\tbutton:StripTextures()\n\t\tbutton:SetTemplate(\"Overlay\")\n\n\t\tbutton.minus = button:CreateTexture(nil, \"OVERLAY\")\n\t\tbutton.minus:SetSize(5, 1)\n\t\tbutton.minus:SetPoint(\"CENTER\")\n\t\tbutton.minus:SetTexture(C.media.blank)\n\n\t\tbutton.plus = button:CreateTexture(nil, \"OVERLAY\")\n\t\tbutton.plus:SetSize(1, 5)\n\t\tbutton.plus:SetPoint(\"CENTER\")\n\t\tbutton.plus:SetTexture(C.media.blank)\n\n\t\tbutton:HookScript(\"OnEnter\", T.SetModifiedBackdrop)\n\t\tbutton:HookScript(\"OnLeave\", T.SetOriginalBackdrop)\n\n\t\tbutton.plus:Hide()\n\n\t\thooksecurefunc(button, \"SetCollapsed\", function(self, collapsed)\n\t\t\tif collapsed then\n\t\t\t\tbutton.plus:Show()\n\t\t\telse\n\t\t\t\tbutton.plus:Hide()\n\t\t\tend\n\t\t\tbutton:SetNormalTexture(0)\n\t\t\tbutton:SetPushedTexture(0)\n\t\tend)\n\tend\n\n\tfor i = 1, #headers do\n\t\tlocal button = headers[i].Header.MinimizeButton\n\t\tif button then\n\t\t\tSkinSmallMinimizeButton(button)\n\t\tend\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tAuto collapse Objective Tracker\n----------------------------------------------------------------------------------------\nif C.automation.auto_collapse ~= \"NONE\" then\n\tlocal collapse = CreateFrame(\"Frame\")\n\tcollapse:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tcollapse:SetScript(\"OnEvent\", function()\n\t\tif C.automation.auto_collapse == \"RAID\" then\n\t\t\tif IsInInstance() then\n\t\t\t\tObjectiveTracker_Collapse()\n\t\t\telseif ObjectiveTrackerFrame.collapsed and not InCombatLockdown() then\n\t\t\t\tObjectiveTracker_Expand()\n\t\t\tend\n\t\telseif C.automation.auto_collapse == \"SCENARIO\" then\n\t\t\tlocal inInstance, instanceType = IsInInstance()\n\t\t\tif inInstance then\n\t\t\t\tif instanceType == \"party\" or instanceType == \"scenario\" then\n\t\t\t\t\tC_Timer.After(0.1, function() -- for some reason it got error after reload in instance\n\t\t\t\t\t\tfor i = 3, #headers do\n\t\t\t\t\t\t\tlocal button = headers[i].Header.MinimizeButton\n\t\t\t\t\t\t\tif button and not headers[i].collapsed then\n\t\t\t\t\t\t\t\tbutton:Click()\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend)\n\t\t\t\telse\n\t\t\t\t\tObjectiveTracker_Collapse()\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif not InCombatLockdown() then\n\t\t\t\t\tfor i = 3, #headers do\n\t\t\t\t\t\tlocal button = headers[i].Header.MinimizeButton\n\t\t\t\t\t\tif button and headers[i].collapsed then\n\t\t\t\t\t\t\tbutton:Click()\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif ObjectiveTrackerFrame.collapsed then\n\t\t\t\t\t\tObjectiveTracker_Expand()\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telseif C.automation.auto_collapse == \"RELOAD\" then\n\t\t\tObjectiveTracker_Collapse()\n\t\tend\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tSkin simple quest objective progress bar\n----------------------------------------------------------------------------------------\nlocal function SkinBar(_, _, line)\n\tlocal progressBar = line.ProgressBar\n\tlocal bar = progressBar.Bar\n\tlocal label = bar.Label\n\n\tif not progressBar.styled then\n\t\tif bar.BorderLeft then bar.BorderLeft:SetAlpha(0) end\n\t\tif bar.BorderRight then bar.BorderRight:SetAlpha(0) end\n\t\tif bar.BorderMid then bar.BorderMid:SetAlpha(0) end\n\t\tbar:SetSize(200, 16)\n\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\tbar:CreateBackdrop(\"Transparent\")\n\n\t\tlabel:ClearAllPoints()\n\t\tlabel:SetPoint(\"CENTER\", 0, -1)\n\t\tlabel:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\tlabel:SetDrawLayer(\"OVERLAY\")\n\n\t\tprogressBar.styled = true\n\tend\nend\n\nhooksecurefunc(QUEST_TRACKER_MODULE, \"AddProgressBar\", SkinBar)\nhooksecurefunc(CAMPAIGN_QUEST_TRACKER_MODULE, \"AddProgressBar\", SkinBar)\nhooksecurefunc(SCENARIO_TRACKER_MODULE, \"AddProgressBar\", SkinBar)\n\n----------------------------------------------------------------------------------------\n--\tSkin quest objective progress bar with icon\n----------------------------------------------------------------------------------------\nlocal function SkinBarIcon(_, _, line)\n\tlocal progressBar = line.ProgressBar\n\tlocal bar = progressBar.Bar\n\tlocal label = bar.Label\n\tlocal icon = bar.Icon\n\n\tif not progressBar.styled then\n\t\tbar.BarFrame:Hide()\n\t\tbar.BarGlow:Kill()\n\t\tbar.Sheen:Hide()\n\t\tbar.IconBG:Kill()\n\t\tbar:SetSize(200, 16)\n\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\tbar:CreateBackdrop(\"Transparent\")\n\n\t\tlabel:ClearAllPoints()\n\t\tlabel:SetPoint(\"CENTER\", 0, -1)\n\t\tlabel:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\n\t\ticon:SetPoint(\"RIGHT\", 26, 0)\n\t\ticon:SetSize(20, 20)\n\t\ticon:SetMask(\"\")\n\n\t\tlocal border = CreateFrame(\"Frame\", \"$parentBorder\", bar)\n\t\tborder:SetAllPoints(icon)\n\t\tborder:SetTemplate(\"Transparent\")\n\t\tborder:SetBackdropColor(0, 0, 0, 0)\n\t\tbar.newIconBg = border\n\n\t\thooksecurefunc(bar.AnimIn, \"Play\", function()\n\t\t\tbar.AnimIn:Stop()\n\t\tend)\n\n\t\tBonusObjectiveTrackerProgressBar_PlayFlareAnim = T.dummy\n\t\tprogressBar.styled = true\n\tend\n\n\tbar.newIconBg:SetShown(icon:IsShown())\nend\n\nhooksecurefunc(BONUS_OBJECTIVE_TRACKER_MODULE, \"AddProgressBar\", SkinBarIcon)\nhooksecurefunc(WORLD_QUEST_TRACKER_MODULE, \"AddProgressBar\", SkinBarIcon)\n\n----------------------------------------------------------------------------------------\n--\tSkin Timer bar\n----------------------------------------------------------------------------------------\nlocal function SkinTimer(_, _, line)\n\tlocal timerBar = line.TimerBar\n\tlocal bar = timerBar.Bar\n\n\tif not timerBar.styled then\n\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\tbar:SetTemplate(\"Transparent\")\n\t\tbar:SetBackdropColor(0, 0, 0, 0)\n\t\tbar:DisableDrawLayer(\"ARTWORK\")\n\t\ttimerBar.styled = true\n\tend\nend\n\nhooksecurefunc(QUEST_TRACKER_MODULE, \"AddTimerBar\", SkinTimer)\nhooksecurefunc(SCENARIO_TRACKER_MODULE, \"AddTimerBar\", SkinTimer)\nhooksecurefunc(BONUS_OBJECTIVE_TRACKER_MODULE, \"AddTimerBar\", SkinTimer)\nhooksecurefunc(ACHIEVEMENT_TRACKER_MODULE, \"AddTimerBar\", SkinTimer)\n\n----------------------------------------------------------------------------------------\n--\tSet tooltip depending on position\n----------------------------------------------------------------------------------------\nhooksecurefunc(\"BonusObjectiveTracker_ShowRewardsTooltip\", function(block)\n\tif T.IsFramePositionedLeft(ObjectiveTrackerFrame) then\n\t\tGameTooltip:ClearAllPoints()\n\t\tGameTooltip:SetPoint(\"TOPLEFT\", block, \"TOPRIGHT\", 0, 0)\n\tend\nend)\n\nScenarioStageBlock:HookScript(\"OnEnter\", function(self)\n\tif T.IsFramePositionedLeft(ObjectiveTrackerFrame) then\n\t\tGameTooltip:ClearAllPoints()\n\t\tGameTooltip:SetPoint(\"TOPLEFT\", self, \"TOPRIGHT\", 50, -3)\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tKill reward animation when finished dungeon or bonus objectives\n----------------------------------------------------------------------------------------\nObjectiveTrackerScenarioRewardsFrame.Show = T.dummy\n\nhooksecurefunc(\"BonusObjectiveTracker_AnimateReward\", function()\n\tObjectiveTrackerBonusRewardsFrame:ClearAllPoints()\n\tObjectiveTrackerBonusRewardsFrame:SetPoint(\"BOTTOM\", UIParent, \"TOP\", 0, 90)\nend)\n\n----------------------------------------------------------------------------------------\n--\tSkin ScenarioStageBlock\n----------------------------------------------------------------------------------------\nlocal StageBlock = _G[\"ScenarioStageBlock\"]\nStageBlock:CreateBackdrop(\"Overlay\")\nStageBlock.backdrop:SetPoint(\"TOPLEFT\", ScenarioStageBlock.NormalBG, 3, -3)\nStageBlock.backdrop:SetPoint(\"BOTTOMRIGHT\", ScenarioStageBlock.NormalBG, -6, 5)\n\nStageBlock.NormalBG:SetAlpha(0)\nStageBlock.FinalBG:SetAlpha(0)\nStageBlock.GlowTexture:SetTexture(\"\")\n\n----------------------------------------------------------------------------------------\n--\tSkin ScenarioStageBlock\n----------------------------------------------------------------------------------------\nlocal ChallengeBlock = _G[\"ScenarioChallengeModeBlock\"]\nChallengeBlock:CreateBackdrop(\"Overlay\")\nChallengeBlock.backdrop:SetPoint(\"TOPLEFT\", ChallengeBlock, 3, -3)\nChallengeBlock.backdrop:SetPoint(\"BOTTOMRIGHT\", ChallengeBlock, -6, 3)\nChallengeBlock.backdrop.overlay:SetVertexColor(0.12, 0.12, 0.12, 1)\n\nlocal bg = select(3, ChallengeBlock:GetRegions())\nbg:SetAlpha(0)\n\nChallengeBlock.TimerBGBack:SetAlpha(0)\nChallengeBlock.TimerBG:SetAlpha(0)\n\nChallengeBlock.StatusBar:SetStatusBarTexture(C.media.texture)\nChallengeBlock.StatusBar:CreateBackdrop(\"Overlay\")\nChallengeBlock.StatusBar.backdrop:SetFrameLevel(ChallengeBlock.backdrop:GetFrameLevel() + 1)\nChallengeBlock.StatusBar:SetStatusBarColor(0, 0.6, 1)\nChallengeBlock.StatusBar:SetFrameLevel(ChallengeBlock.StatusBar:GetFrameLevel() + 3)\n\n----------------------------------------------------------------------------------------\n--\tSkin MawBuffsBlock\n----------------------------------------------------------------------------------------\nTopScenarioWidgetContainerBlock.WidgetContainer:ClearAllPoints()\nTopScenarioWidgetContainerBlock.WidgetContainer:SetPoint(\"TOP\", ScenarioStageBlock.backdrop, \"BOTTOM\", 0, -3)\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function()\n\tC_Timer.After(0.1, function()\n\t\tlocal list = ScenarioBlocksFrame.MawBuffsBlock.Container.List\n\t\tif list then\n\t\t\tlist:ClearAllPoints()\n\t\t\tif T.IsFramePositionedLeft(ObjectiveTrackerFrame) then\n\t\t\t\tlist:SetPoint(\"TOPLEFT\", ScenarioBlocksFrame.MawBuffsBlock.Container, \"TOPRIGHT\", 15, 0)\n\t\t\telse\n\t\t\t\tlist:SetPoint(\"TOPRIGHT\", ScenarioBlocksFrame.MawBuffsBlock.Container, \"TOPLEFT\", -15, 0)\n\t\t\tend\n\t\tend\n\t\tObjectiveTracker_Update()\t-- Fixed position of MinimizeButton if frame on right side\n\n\t\t-- TODO check\n\t\t-- BottomScenarioWidgetContainerBlock.WidgetContainer:ClearAllPoints()\n\t\t-- BottomScenarioWidgetContainerBlock.WidgetContainer:SetPoint(\"TOPLEFT\", ScenarioStageBlock.backdrop, \"TOPRIGHT\", 10, 0)\n\tend)\nend)\n\nlocal Maw = ScenarioBlocksFrame.MawBuffsBlock.Container\nMaw:SkinButton()\nMaw:ClearAllPoints()\nMaw:SetPoint(\"TOPLEFT\", ScenarioStageBlock.backdrop, \"BOTTOMLEFT\", 0, -35)\nMaw.List.button:SetSize(234, 30)\nMaw.List:StripTextures()\nMaw.List:SetTemplate(\"Overlay\")\n\nMaw.List:HookScript(\"OnShow\", function(self)\n\tself.button:SetPushedTexture(0)\n\tself.button:SetHighlightTexture(0)\n\tself.button:SetWidth(234)\n\tself.button:SetButtonState(\"NORMAL\")\n\tself.button:SetPushedTextOffset(0, 0)\n\tself.button:SetButtonState(\"PUSHED\", true)\nend)\n\nMaw.List:HookScript(\"OnHide\", function(self)\n\tself.button:SetPushedTexture(0)\n\tself.button:SetHighlightTexture(0)\n\tself.button:SetWidth(234)\nend)\n\n----------------------------------------------------------------------------------------\n--\tCtrl+Click to abandon a quest or Alt+Click to share a quest(by Suicidal Katt)\n----------------------------------------------------------------------------------------\nhooksecurefunc(\"QuestMapLogTitleButton_OnClick\", function(self)\n\tif IsControlKeyDown() then\n\t\tCloseDropDownMenus()\n\t\tQuestMapQuestOptions_AbandonQuest(self.questID)\n\telseif IsAltKeyDown() and C_QuestLog.IsPushableQuest(self.questID) then\n\t\tCloseDropDownMenus()\n\t\tQuestMapQuestOptions_ShareQuest(self.questID)\n\tend\nend)\n\nhooksecurefunc(QUEST_TRACKER_MODULE, \"OnBlockHeaderClick\", function(_, block)\n\tif IsControlKeyDown() then\n\t\tCloseDropDownMenus()\n\t\tQuestMapQuestOptions_AbandonQuest(block.id)\n\telseif IsAltKeyDown() and C_QuestLog.IsPushableQuest(block.id) then\n\t\tCloseDropDownMenus()\n\t\tQuestMapQuestOptions_ShareQuest(block.id)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Quests/WowheadLink.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tAdd quest/achievement wowhead link\n----------------------------------------------------------------------------------------\nlocal linkQuest, linkAchievement\nif T.client == \"ruRU\" then\n\tlinkQuest = \"http://ru.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://ru.wowhead.com/achievement=%d\"\nelseif T.client == \"frFR\" then\n\tlinkQuest = \"http://fr.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://fr.wowhead.com/achievement=%d\"\nelseif T.client == \"deDE\" then\n\tlinkQuest = \"http://de.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://de.wowhead.com/achievement=%d\"\nelseif T.client == \"esES\" or T.client == \"esMX\" then\n\tlinkQuest = \"http://es.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://es.wowhead.com/achievement=%d\"\nelseif T.client == \"ptBR\" or T.client == \"ptPT\" then\n\tlinkQuest = \"http://pt.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://pt.wowhead.com/achievement=%d\"\nelseif T.client == \"itIT\" then\n\tlinkQuest = \"http://it.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://it.wowhead.com/achievement=%d\"\nelseif T.client == \"koKR\" then\n\tlinkQuest = \"http://ko.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://ko.wowhead.com/achievement=%d\"\nelseif T.client == \"zhTW\" or T.client == \"zhCN\" then\n\tlinkQuest = \"http://cn.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://cn.wowhead.com/achievement=%d\"\nelse\n\tlinkQuest = \"http://www.wowhead.com/quest=%d\"\n\tlinkAchievement = \"http://www.wowhead.com/achievement=%d\"\nend\n\nlocal selfText\nStaticPopupDialogs.WATCHFRAME_URL = {\n\ttext = L_WATCH_WOWHEAD_LINK,\n\tbutton1 = OKAY,\n\ttimeout = 0,\n\twhileDead = true,\n\thasEditBox = true,\n\teditBoxWidth = 350,\n\tOnShow = function(self, text)\n\t\tself.editBox:SetMaxLetters(0)\n\t\tself.editBox:SetText(text)\n\t\tself.editBox:HighlightText()\n\t\tselfText = text\n\tend,\n\tEditBoxOnEnterPressed = function(self) self:GetParent():Hide() end,\n\tEditBoxOnEscapePressed = function(self) self:GetParent():Hide() end,\n\tEditBoxOnTextChanged = function(self)\n\t\tif self:GetText():len() < 1 then\n\t\t\tself:GetParent():Hide()\n\t\telse\n\t\t\tself:SetText(selfText)\n\t\t\tself:HighlightText()\n\t\tend\n\tend,\n\tpreferredIndex = 5,\n}\n\nhooksecurefunc(\"QuestObjectiveTracker_OnOpenDropDown\", function(self)\n\tlocal id = self.activeFrame.id\n\tlocal info = UIDropDownMenu_CreateInfo()\n\tinfo.text = L_WATCH_WOWHEAD_LINK\n\tinfo.func = function()\n\t\tlocal text = linkQuest:format(id)\n\t\tStaticPopup_Show(\"WATCHFRAME_URL\", _, _, text)\n\tend\n\tinfo.notCheckable = true\n\tUIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL)\nend)\n\nhooksecurefunc(\"BonusObjectiveTracker_OnOpenDropDown\", function(self)\n\tlocal id = self.activeFrame.TrackedQuest.questID\n\tlocal info = UIDropDownMenu_CreateInfo()\n\tinfo.text = L_WATCH_WOWHEAD_LINK\n\tinfo.func = function()\n\t\tlocal text = linkQuest:format(id)\n\t\tStaticPopup_Show(\"WATCHFRAME_URL\", _, _, text)\n\tend\n\tinfo.notCheckable = true\n\tUIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL)\nend)\n\nhooksecurefunc(\"AchievementObjectiveTracker_OnOpenDropDown\", function(self)\n\tlocal id = self.activeFrame.id\n\tlocal info = UIDropDownMenu_CreateInfo()\n\tinfo.text = L_WATCH_WOWHEAD_LINK\n\tinfo.func = function()\n\t\tlocal text = linkAchievement:format(id)\n\t\tStaticPopup_Show(\"WATCHFRAME_URL\", _, _, text)\n\tend\n\tinfo.notCheckable = true\n\tUIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL)\nend)\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function(_, _, addon)\n\tif addon == \"Blizzard_AchievementUI\" then\n\t\thooksecurefunc(AchievementTemplateMixin, \"OnClick\", function(self)\n\t\t\tlocal elementData = self:GetElementData()\n\t\t\tif elementData and elementData.id and IsControlKeyDown() then\n\t\t\t\tlocal text = linkAchievement:format(elementData.id)\n\t\t\t\tStaticPopup_Show(\"WATCHFRAME_URL\", _, _, text)\n\t\t\tend\n\t\tend)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Ace3.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true or C.skins.ace3 ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAce3 options skin\n----------------------------------------------------------------------------------------\nlocal AceGUI = LibStub and LibStub(\"AceGUI-3.0\", true)\nif not AceGUI then return end\n\nlocal oldRegisterAsWidget = AceGUI.RegisterAsWidget\n\nAceGUI.RegisterAsWidget = function(self, widget)\n\tlocal TYPE = widget.type\n\tif TYPE == \"CheckBox\" then\n\t\twidget.highlight:Kill()\n\n\t\tif not widget.skinnedCheckBG then\n\t\t\twidget.skinnedCheckBG = CreateFrame(\"Frame\", nil, widget.frame)\n\t\t\twidget.skinnedCheckBG:SetTemplate(\"Overlay\")\n\t\t\twidget.skinnedCheckBG:SetPoint(\"TOPLEFT\", widget.checkbg, \"TOPLEFT\", 4, -4)\n\t\t\twidget.skinnedCheckBG:SetPoint(\"BOTTOMRIGHT\", widget.checkbg, \"BOTTOMRIGHT\", -4, 4)\n\t\tend\n\n\t\tif widget.skinnedCheckBG.oborder then\n\t\t\twidget.check:SetParent(widget.skinnedCheckBG.oborder)\n\t\telse\n\t\t\twidget.check:SetParent(widget.skinnedCheckBG)\n\t\tend\n\telseif TYPE == \"Dropdown\" then\n\t\tlocal frame = widget.dropdown\n\t\tlocal button = widget.button\n\t\tlocal text = widget.text\n\t\tframe:StripTextures()\n\n\t\tbutton:ClearAllPoints()\n\t\tbutton:SetPoint(\"RIGHT\", frame, \"RIGHT\", -20, 0)\n\n\t\tT.SkinNextPrevButton(button)\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Overlay\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 20, -2)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.backdrop:SetClipsChildren(true)\n\t\tend\n\t\tbutton:SetParent(frame.backdrop)\n\t\ttext:SetParent(frame.backdrop)\n\t\tbutton:HookScript(\"OnClick\", function(this)\n\t\t\tlocal self = this.obj\n\t\t\tself.pullout.frame:SetTemplate(\"Transparent\")\n\t\tend)\n\telseif TYPE == \"LSM30_Font\" or TYPE == \"LSM30_Sound\" or TYPE == \"LSM30_Border\" or TYPE == \"LSM30_Background\" or TYPE == \"LSM30_Statusbar\" then\n\t\tlocal frame = widget.frame\n\t\tlocal button = frame.dropButton\n\t\tlocal text = frame.text\n\t\tframe:StripTextures()\n\n\t\tT.SkinNextPrevButton(button)\n\t\tframe.text:ClearAllPoints()\n\t\tframe.text:SetPoint(\"RIGHT\", button, \"LEFT\", -2, 0)\n\n\t\tbutton:ClearAllPoints()\n\t\tbutton:SetPoint(\"RIGHT\", frame, \"RIGHT\", -10, -6)\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Overlay\")\n\t\t\tif TYPE == \"LSM30_Font\" then\n\t\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 20, -17)\n\t\t\telseif TYPE == \"LSM30_Sound\" then\n\t\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 20, -17)\n\t\t\t\twidget.soundbutton:SetParent(frame.backdrop)\n\t\t\t\twidget.soundbutton:ClearAllPoints()\n\t\t\t\twidget.soundbutton:SetPoint(\"LEFT\", frame.backdrop, \"LEFT\", 2, 0)\n\t\t\telseif TYPE == \"LSM30_Statusbar\" then\n\t\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 20, -17)\n\t\t\t\twidget.bar:ClearAllPoints()\n\t\t\t\twidget.bar:SetPoint(\"TOPLEFT\", frame.backdrop, \"TOPLEFT\", 2, -2)\n\t\t\t\twidget.bar:SetPoint(\"BOTTOMRIGHT\", frame.backdrop, \"BOTTOMRIGHT\", -2, 2)\n\t\t\t\twidget.bar:SetParent(frame.backdrop)\n\t\t\telseif TYPE == \"LSM30_Border\" or TYPE == \"LSM30_Background\" then\n\t\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 42, -16)\n\t\t\tend\n\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMRIGHT\", 2, -2)\n\t\tend\n\t\tbutton:SetParent(frame.backdrop)\n\t\ttext:SetParent(frame.backdrop)\n\t\tbutton:HookScript(\"OnClick\", function(this)\n\t\t\tlocal self = this.obj\n\t\t\tif self.dropdown then\n\t\t\t\tself.dropdown:SetTemplate(\"Transparent\")\n\t\t\tend\n\t\tend)\n\telseif TYPE == \"EditBox\" then\n\t\tlocal frame = widget.editbox\n\t\tlocal button = widget.button\n\t\tframe.Left:Kill()\n\t\tframe.Middle:Kill()\n\t\tframe.Right:Kill()\n\t\tframe:SetHeight(17)\n\t\tframe:CreateBackdrop(\"Overlay\")\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", -2, 0)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 0)\n\t\tframe.backdrop:SetParent(widget.frame)\n\t\tframe:SetParent(frame.backdrop)\n\t\tbutton:SkinButton()\n\telseif TYPE == \"Button\" then\n\t\tlocal frame = widget.frame\n\t\tframe:StripTextures(true)\n\t\tframe:CreateBackdrop(\"Overlay\")\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 1)\n\t\twidget.text:SetParent(frame.backdrop)\n\t\tframe:HookScript(\"OnEnter\", function()\n\t\t\tframe.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\t\tif frame.backdrop.overlay then\n\t\t\t\tframe.backdrop.overlay:SetVertexColor(C.media.classborder_color[1], C.media.classborder_color[2], C.media.classborder_color[3], 0.3)\n\t\t\tend\n\t\tend)\n\t\tframe:HookScript(\"OnLeave\", function()\n\t\t\tframe.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tif frame.backdrop.overlay then\n\t\t\t\tframe.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\n\t\t\tend\n\t\tend)\n\telseif TYPE == \"Slider\" then\n\t\tlocal frame = widget.slider\n\t\tlocal editbox = widget.editbox\n\t\tlocal lowtext = widget.lowtext\n\t\tlocal hightext = widget.hightext\n\t\tlocal HEIGHT = 12\n\n\t\tframe:StripTextures()\n\t\tframe:SetTemplate(\"Overlay\")\n\t\tframe:SetHeight(HEIGHT)\n\t\tframe:SetThumbTexture(C.media.blank)\n\t\tframe:GetThumbTexture():SetVertexColor(unpack(C.media.border_color))\n\t\tframe:GetThumbTexture():SetSize(HEIGHT - 2, HEIGHT - 4)\n\n\t\teditbox:SetTemplate(\"Overlay\")\n\t\teditbox:SetHeight(15)\n\t\teditbox:SetPoint(\"TOP\", frame, \"BOTTOM\", 0, -1)\n\n\t\tlowtext:SetPoint(\"TOPLEFT\", frame, \"BOTTOMLEFT\", 2, -2)\n\t\thightext:SetPoint(\"TOPRIGHT\", frame, \"BOTTOMRIGHT\", -2, -2)\n\telseif TYPE == \"Keybinding\" then\n\t\tlocal button = widget.button\n\t\tlocal msgframe = widget.msgframe\n\n\t\tbutton:SkinButton()\n\n\t\tmsgframe:StripTextures()\n\t\tmsgframe:SetTemplate(\"Transparent\")\n\t\tmsgframe.msg:ClearAllPoints()\n\t\tmsgframe.msg:SetPoint(\"CENTER\")\n\n\telseif TYPE == \"ColorPicker\" then\n\t\tlocal frame = widget.frame\n\t\tlocal colorSwatch = widget.colorSwatch\n\n\t\tframe:CreateBackdrop()\n\t\tif frame.backdrop then\n\t\t\tframe.backdrop:SetSize(25, 20)\n\t\t\tframe.backdrop:ClearAllPoints()\n\t\t\tframe.backdrop:SetPoint(\"LEFT\", frame, \"LEFT\", 4, 0)\n\t\tend\n\n\t\tcolorSwatch:SetTexture(C.media.blank)\n\t\tcolorSwatch:ClearAllPoints()\n\t\tcolorSwatch:SetParent(frame.backdrop)\n\t\tcolorSwatch:SetInside(frame.backdrop)\n\n\t\tif colorSwatch.background then\n\t\t\tcolorSwatch.background:SetColorTexture(0, 0, 0, 0)\n\t\tend\n\n\t\tif colorSwatch.checkers then\n\t\t\tcolorSwatch.checkers:ClearAllPoints()\n\t\t\tcolorSwatch.checkers:SetParent(frame.backdrop)\n\t\t\tcolorSwatch.checkers:SetInside(frame.backdrop)\n\t\tend\n\telseif TYPE == \"Icon\" then\n\t\twidget.frame:StripTextures()\n\telseif TYPE == \"Dropdown-Pullout\" then\n\t\tlocal pullout = widget\n\t\tpullout.frame:SetTemplate(\"Transparent\")\n\tend\n\treturn oldRegisterAsWidget(self, widget)\nend\n\nlocal oldRegisterAsContainer = AceGUI.RegisterAsContainer\n\nAceGUI.RegisterAsContainer = function(self, widget)\n\tlocal TYPE = widget.type\n\tif TYPE == \"ScrollFrame\" then\n\t\tlocal frame = widget.scrollbar\n\t\tT.SkinScrollBar(frame)\n\telseif TYPE == \"InlineGroup\" or TYPE == \"TreeGroup\" or TYPE == \"TabGroup\" or TYPE == \"Frame\" or TYPE == \"DropdownGroup\" or TYPE == \"Window\" then\n\t\tlocal frame = widget.content:GetParent()\n\t\tif TYPE == \"Frame\" then\n\t\t\tframe:StripTextures()\n\t\t\tfor i = 1, frame:GetNumChildren() do\n\t\t\t\tlocal child = select(i, frame:GetChildren())\n\t\t\t\tif child:IsObjectType(\"Button\") and child:GetText() then\n\t\t\t\t\tchild:SkinButton()\n\t\t\t\telse\n\t\t\t\t\tchild:StripTextures()\n\t\t\t\tend\n\t\t\tend\n\t\telseif TYPE == \"Window\" then\n\t\t\tframe:StripTextures()\n\t\t\tT.SkinCloseButton(frame.obj.closebutton)\n\t\tend\n\n\t\tif TYPE == \"Frame\" then\n\t\t\tframe:SetTemplate(\"Transparent\")\n\t\telse\n\t\t\tframe:SetTemplate(\"Overlay\")\n\t\tend\n\n\t\tif widget.treeframe then\n\t\t\twidget.treeframe:SetTemplate(\"Overlay\")\n\t\t\tframe:SetPoint(\"TOPLEFT\", widget.treeframe, \"TOPRIGHT\", 1, 0)\n\t\tend\n\n\t\tif TYPE == \"TabGroup\" then\n\t\t\tlocal oldCreateTab = widget.CreateTab\n\t\t\twidget.CreateTab = function(self, id)\n\t\t\t\tlocal tab = oldCreateTab(self, id)\n\t\t\t\ttab:StripTextures()\n\t\t\t\ttab.backdrop = CreateFrame(\"Frame\", nil, tab)\n\t\t\t\ttab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)\n\t\t\t\ttab.backdrop:SetTemplate(\"Overlay\")\n\t\t\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 10, -3)\n\t\t\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", -10, 3)\n\t\t\t\ttab.text:SetPoint(\"LEFT\", 14, 0)\n\t\t\t\treturn tab\n\t\t\tend\n\t\tend\n\n\t\tif widget.scrollbar then\n\t\t\tT.SkinScrollBar(widget.scrollbar)\n\t\tend\n\tend\n\n\treturn oldRegisterAsContainer(self, widget)\nend"
  },
  {
    "path": "ShestakUI/Modules/Skins/AtlasLoot.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.atlasloot ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAtlasLoot skin(by Max41479)\n----------------------------------------------------------------------------------------\nlocal function SkinDropDown(Frame)\n\t_G[Frame]:StripTextures()\n\t_G[Frame]:SetTemplate(\"Transparent\", \"Shadow\")\n\tT.SkinNextPrevButton(_G[Frame..'-button'])\n\tlocal a, b, c, d = _G[Frame..'-button']:GetPoint()\n\t_G[Frame..'-button']:SetPoint(a, b, c, d - 4, 0)\n\t_G[Frame]:HookScript('OnUpdate', function()\n\t\tfor i = 1, 3 do\n\t\t\tlocal CatFrame = _G['AtlasLoot-DropDown-CatFrame'..i]\n\t\t\tif CatFrame and not CatFrame.IsSkinned then\n\t\t\t\tlocal r, g, b = CatFrame:GetBackdropColor()\n\t\t\t\tCatFrame:StripTextures()\n\t\t\t\tCatFrame:SetTemplate(\"Transparent\", \"Shadow\")\n\t\t\t\tCatFrame:SetBackdropColor(r, g, b)\n\t\t\t\tCatFrame:HookScript('OnShow', function(self)\n\t\t\t\t\tlocal a, f, c, d, e = self:GetPoint()\n\t\t\t\t\tself:SetPoint(a, f, c, d, e - 3)\n\t\t\t\tend)\n\t\t\t\tCatFrame:GetScript('OnShow')(CatFrame)\n\t\t\t\tCatFrame.IsSkinned = true\n\t\t\tend\n\t\t\tlocal DropdownTitle = _G[Frame..'-title']\n\t\t\tDropdownTitle:ClearAllPoints()\n\t\t\tDropdownTitle:SetPoint(\"BOTTOMLEFT\", _G[Frame], \"TOPLEFT\", 0, 3)\n\t\tend\n\tend)\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function(self)\n\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") then return end\n\tif not IsAddOnLoaded(\"AtlasLoot\") then return end\n\n\tlocal AtlasLootFrame = _G[\"AtlasLoot_GUI-Frame\"]\n\tlocal AtlasLootItemFrame = _G[\"AtlasLoot_GUI-ItemFrame\"]\n\tAtlasLootFrame:SetScript(\"OnUpdate\", AL_OnShow)\n\tAtlasLootItemFrame:CreateBackdrop(\"Transparent\", \"Shadow\")\n\tAtlasLootItemFrame.clasFilterButton:CreateBackdrop(\"Default\")\n\n\tlocal StripAllTextures = {\n\t\tAtlasLootFrame,\n\t\tAtlasLootFrame.titleFrame,\n\t\tAtlasLootItemFrame.itemsButton,\n\t\tAtlasLootItemFrame.modelButton,\n\t\t_G[\"AtlasLoot-Select-1\"],\n\t\t_G[\"AtlasLoot-Select-2\"],\n\t\t_G[\"AtlasLoot-Select-3\"],\n\t}\n\n\tlocal SetTemplate = {\n\t\tAtlasLootFrame,\n\t\t_G[\"AtlasLoot-Select-1\"],\n\t\t_G[\"AtlasLoot-Select-2\"],\n\t\t_G[\"AtlasLoot-Select-3\"],\n\t}\n\n\tlocal buttons = {\n\t\tAtlasLootItemFrame.itemsButton,\n\t\tAtlasLootItemFrame.modelButton,\n\t}\n\n\tfor _, object in pairs(StripAllTextures) do\n\t\tobject:StripTextures()\n\tend\n\n\tfor k, object in pairs(SetTemplate) do\n\t\tif k < 4 then\n\t\t\tobject:SetTemplate(\"Transparent\", \"Shadow\")\n\t\telse\n\t\t\tobject:SetTemplate(\"Transparent\")\n\t\tend\n\tend\n\n\tfor _, button in pairs(buttons) do\n\t\tbutton:SkinButton()\n\tend\n\n\tSkinDropDown('AtlasLoot-DropDown-1')\n\tSkinDropDown('AtlasLoot-DropDown-2')\n\tT.SkinCloseButton(AtlasLootFrame.CloseButton)\n\tT.SkinNextPrevButton(AtlasLootItemFrame.nextPageButton)\n\tT.SkinNextPrevButton(AtlasLootItemFrame.prevPageButton)\n\tAtlasLootItemFrame.prevPageButton:ClearAllPoints()\n\tAtlasLootItemFrame.prevPageButton:SetPoint(\"BOTTOMLEFT\", AtlasLootItemFrame, \"BOTTOMLEFT\", 3, 3)\n\tAtlasLootItemFrame.nextPageButton:ClearAllPoints()\n\tAtlasLootItemFrame.nextPageButton:SetPoint(\"BOTTOMRIGHT\", AtlasLootItemFrame, \"BOTTOMRIGHT\", -3, 3)\nend)\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Aurora.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tSkin some ShestakUI frames if loaded Aurora\n----------------------------------------------------------------------------------------\nlocal AuroraSkin = CreateFrame(\"Frame\")\nAuroraSkin:RegisterEvent(\"PLAYER_LOGIN\")\nAuroraSkin:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"Aurora\") then return end\n\tlocal F = unpack(Aurora)\n\n\tlocal buttons = {\n\t\t\"GameMenuButtonSettingsUI\",\n\t\t\"BaudErrorFrameClearButton\",\n\t\t\"BaudErrorFrameCloseButton\",\n\t\t\"RaidUtilityConvertButton\",\n\t\t\"RaidUtilityMainTankButton\",\n\t\t\"RaidUtilityMainAssistButton\",\n\t\t\"RaidUtilityRoleButton\",\n\t\t\"RaidUtilityReadyCheckButton\",\n\t\t\"RaidUtilityShowButton\",\n\t\t\"RaidUtilityCloseButton\",\n\t\t\"RaidUtilityDisbandButton\",\n\t\t\"RaidUtilityRaidControlButton\",\n\t\t\"CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton\"\n\t}\n\n\tfor i = 1, getn(buttons) do\n\t\tlocal button = _G[buttons[i]]\n\t\tif button then\n\t\t\tF.Reskin(button)\n\t\tend\n\tend\n\n\tlocal frames = {\n\t\t\"BaudErrorFrame\"\n\t}\n\n\tfor i = 1, getn(frames) do\n\t\tlocal frame = _G[frames[i]]\n\t\tif frame then\n\t\t\tF.CreateBD(frame)\n\t\tend\n\tend\n\n\tlocal bd = {\n\t\t\"BaudErrorFrameListScrollBox\",\n\t\t\"BaudErrorFrameDetailScrollBox\"\n\t}\n\n\tfor i = 1, getn(bd) do\n\t\tlocal frame = _G[bd[i]]\n\t\tif frame then\n\t\t\tF.CreateBD(frame)\n\t\tend\n\tend\n\n\tif IsAddOnLoaded(\"!BaudErrorFrame\") then\n\t\tF.ReskinScroll(_G[\"BaudErrorFrameListScrollBoxScrollBarScrollBar\"])\n\t\tF.ReskinScroll(_G[\"BaudErrorFrameDetailScrollFrameScrollBar\"])\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/BigWigs.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.bigwigs ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBigWigs skin(by Affli)\n----------------------------------------------------------------------------------------\n-- Init some tables to store backgrounds\nlocal freebg = {}\n\n-- Styling functions\nlocal createbg = function()\n\tlocal bg = CreateFrame(\"Frame\")\n\tbg:SetTemplate(\"Default\")\n\treturn bg\nend\n\nlocal function freestyle(bar)\n\t-- Reparent and hide bar background\n\tlocal bg = bar:Get(\"bigwigs:shestakui:bg\")\n\tif bg then\n\t\tbg:ClearAllPoints()\n\t\tbg:SetParent(UIParent)\n\t\tbg:Hide()\n\t\tfreebg[#freebg + 1] = bg\n\tend\n\n\t-- Reparent and hide icon background\n\tlocal ibg = bar:Get(\"bigwigs:shestakui:ibg\")\n\tif ibg then\n\t\tibg:ClearAllPoints()\n\t\tibg:SetParent(UIParent)\n\t\tibg:Hide()\n\t\tfreebg[#freebg + 1] = ibg\n\tend\n\n\t-- Replace dummies with original method functions\n\tbar.candyBarBar.SetPoint = bar.candyBarBar.OldSetPoint\n\tbar.candyBarIconFrame.SetWidth = bar.candyBarIconFrame.OldSetWidth\n\tbar.SetScale = bar.OldSetScale\n\n\t-- Reset Positions\n\t-- Icon\n\tbar.candyBarIconFrame:ClearAllPoints()\n\tbar.candyBarIconFrame:SetPoint(\"TOPLEFT\")\n\tbar.candyBarIconFrame:SetPoint(\"BOTTOMLEFT\")\n\tbar.candyBarIconFrame:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t-- Status Bar\n\tbar.candyBarBar:ClearAllPoints()\n\tbar.candyBarBar:SetPoint(\"TOPRIGHT\")\n\tbar.candyBarBar:SetPoint(\"BOTTOMRIGHT\")\n\n\t-- BG\n\tbar.candyBarBackground:SetAllPoints()\n\n\t-- Duration\n\tbar.candyBarDuration:ClearAllPoints()\n\tbar.candyBarDuration:SetPoint(\"RIGHT\", bar.candyBarBar, \"RIGHT\", -2, 0)\n\n\t-- Name\n\tbar.candyBarLabel:ClearAllPoints()\n\tbar.candyBarLabel:SetPoint(\"LEFT\", bar.candyBarBar, \"LEFT\", 2, 0)\n\tbar.candyBarLabel:SetPoint(\"RIGHT\", bar.candyBarBar, \"RIGHT\", -2, 0)\nend\n\nlocal applystyle = function(bar)\n\t-- General bar settings\n\tbar:SetHeight(15)\n\tbar:SetScale(1)\n\tbar.OldSetScale = bar.SetScale\n\n\t-- Set currect scale if bars attached to nameplates\n\tif not bar.hook then\n\t\thooksecurefunc(bar, \"SetParent\", function()\n\t\t\tbar:SetScale(T.noscalemult)\n\t\tend)\n\t\tbar.hook = true\n\tend\n\n\t-- Create or reparent and use bar background\n\tlocal bg = nil\n\tif #freebg > 0 then\n\t\tbg = table.remove(freebg)\n\telse\n\t\tbg = createbg()\n\tend\n\tbg:SetParent(bar)\n\tbg:ClearAllPoints()\n\tbg:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", -2, 2)\n\tbg:SetPoint(\"BOTTOMRIGHT\", bar, \"BOTTOMRIGHT\", 2, -2)\n\tbg:SetFrameStrata(\"BACKGROUND\")\n\tbg:Show()\n\tbar:Set(\"bigwigs:shestakui:bg\", bg)\n\n\t-- Create or reparent and use icon background\n\tlocal ibg = nil\n\tif bar.candyBarIconFrame:GetTexture() then\n\t\tif #freebg > 0 then\n\t\t\tibg = table.remove(freebg)\n\t\telse\n\t\t\tibg = createbg()\n\t\tend\n\t\tibg:SetParent(bar)\n\t\tibg:ClearAllPoints()\n\t\tibg:SetPoint(\"TOPLEFT\", bar.candyBarIconFrame, \"TOPLEFT\", -2, 2)\n\t\tibg:SetPoint(\"BOTTOMRIGHT\", bar.candyBarIconFrame, \"BOTTOMRIGHT\", 2, -2)\n\t\tibg:SetFrameStrata(\"BACKGROUND\")\n\t\tibg:Show()\n\t\tbar:Set(\"bigwigs:shestakui:ibg\", ibg)\n\tend\n\n\t-- Setup timer and bar name fonts and positions\n\tbar.candyBarLabel:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\tbar.candyBarLabel:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tbar.candyBarLabel:SetJustifyH(\"LEFT\")\n\tbar.candyBarLabel:ClearAllPoints()\n\tbar.candyBarLabel:SetPoint(\"TOPLEFT\", bar, \"TOPLEFT\", 2, 0)\n\tbar.candyBarLabel:SetPoint(\"BOTTOMRIGHT\", bar, \"BOTTOMRIGHT\", -14, 0)\n\n\tbar.candyBarDuration:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\tbar.candyBarDuration:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tbar.candyBarDuration:SetJustifyH(\"RIGHT\")\n\tbar.candyBarDuration:ClearAllPoints()\n\tbar.candyBarDuration:SetPoint(\"RIGHT\", bar, \"RIGHT\", 1, 0)\n\n\t-- Setup bar positions and look\n\tbar.candyBarBar:ClearAllPoints()\n\tbar.candyBarBar:SetAllPoints(bar)\n\tbar.candyBarBar.OldSetPoint = bar.candyBarBar.SetPoint\n\tbar.candyBarBar.SetPoint = T.dummy\n\tbar.candyBarBar:SetStatusBarTexture(C.media.texture)\n\tif not bar:Get(\"bigwigs:emphasized\") then\n\t\tbar.candyBarBar:SetStatusBarColor(T.color.r, T.color.g, T.color.b, 1)\n\tend\n\tbar.candyBarBackground:SetTexture(C.media.texture)\n\n\t-- Setup icon positions and other things\n\tbar.candyBarIconFrame:ClearAllPoints()\n\tbar.candyBarIconFrame:SetPoint(\"BOTTOMLEFT\", bar, \"BOTTOMLEFT\", -28, 0)\n\tbar.candyBarIconFrame:SetSize(21, 21)\n\tbar.candyBarIconFrame.OldSetWidth = bar.candyBarIconFrame.SetWidth\n\tbar.candyBarIconFrame.SetWidth = T.dummy\n\tbar.candyBarIconFrame:SetTexCoord(0.1, 0.9, 0.1, 0.9)\nend\n\nlocal function registerStyle(myProfile)\n\tif not BigWigs then return end\n\tBigWigsAPI:RegisterBarStyle(\"ShestakUI\", {\n\t\tapiVersion = 1,\n\t\tversion = 1,\n\t\tGetSpacing = function() return T.Scale(13) end,\n\t\tApplyStyle = applystyle,\n\t\tBarStopped = freestyle,\n\t\tGetStyleName = function() return \"ShestakUI\" end,\n\t})\n\n\tif BigWigsLoader and myProfile and myProfile.barStyle == \"ShestakUI\" then\n\t\tBigWigsLoader.RegisterMessage(\"BigWigs_Plugins\", \"BigWigs_FrameCreated\", function()\n\t\t\tBigWigsProximityAnchor:SetTemplate(\"Transparent\")\n\t\t\tBigWigsInfoBox:SetTemplate(\"Transparent\")\n\t\tend)\n\n\t\tBigWigsLoader.RegisterMessage(\"BigWigs_Plugins\", \"BigWigs_BarEmphasized\", function(_, _, bar)\n\t\t\tlocal module = bar:Get(\"bigwigs:module\")\n\t\t\tlocal key = bar:Get(\"bigwigs:option\")\n\t\t\tlocal colors = BigWigs:GetPlugin(\"Colors\")\n\t\t\tbar.candyBarBar:SetStatusBarColor(colors:GetColor(\"barEmphasized\", module, key))\n\t\tend)\n\tend\nend\n\nlocal f = CreateFrame(\"Frame\")\nf:RegisterEvent(\"ADDON_LOADED\")\nf:SetScript(\"OnEvent\", function(_, event, addon)\n\tif event == \"ADDON_LOADED\" then\n\t\tif addon == \"BigWigs_Plugins\" then\n\t\t\tlocal myProfile\n\t\t\tif BigWigs3DB then\n\t\t\t\tif BigWigs3DB.profileKeys and BigWigs3DB.namespaces and BigWigs3DB.namespaces.BigWigs_Plugins_Bars and BigWigs3DB.namespaces.BigWigs_Plugins_Bars.profiles then\n\t\t\t\t\tmyProfile = BigWigs3DB.namespaces.BigWigs_Plugins_Bars.profiles[BigWigs3DB.profileKeys[UnitName(\"player\")..\" - \"..GetRealmName()]]\n\t\t\t\tend\n\t\t\t\tif not myProfile or myProfile.InstalledBars ~= C.actionbar.bottombars then\n\t\t\t\t\tStaticPopup_Show(\"SETTINGS_BIGWIGS\")\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tregisterStyle(myProfile)\n\t\t\tf:UnregisterEvent(\"ADDON_LOADED\")\n\t\telseif addon == \"ShestakUI\" then\n\t\t\tif BigWigsLoader then\n\t\t\t\tBigWigsLoader.RegisterMessage(addon, \"BigWigs_FrameCreated\", function(_, frame, name)\n\t\t\t\t\tif name == \"AltPower\" then\n\t\t\t\t\t\tframe:SetTemplate(\"Transparent\")\n\t\t\t\t\tend\n\t\t\t\t\tif name == \"QueueTimer\" and C.skins.blizzard_frames then\n\t\t\t\t\t\tframe:SetSize(240, 15)\n\t\t\t\t\t\tframe:StripTextures()\n\t\t\t\t\t\tframe:SetStatusBarTexture(C.media.texture)\n\t\t\t\t\t\tframe:CreateBackdrop(\"Overlay\")\n\t\t\t\t\tend\n\t\t\t\tend)\n\t\t\tend\n\t\tend\n\tend\nend)\n\nfunction T.UploadBW()\n\tif not BigWigs then return end\n\tlocal bars = BigWigs:GetPlugin(\"Bars\", true)\n\tif bars then\n\t\tbars.db.profile.barStyle = \"ShestakUI\"\n\t\tbars.db.profile.fontName = C.font.stylization_font\n\t\tbars.db.profile.BigWigsAnchor_width = 185\n\t\tbars.db.profile.BigWigsAnchor_x = 188 / UIParent:GetEffectiveScale()\n\t\tbars.db.profile.BigWigsEmphasizeAnchor_width = 184\n\t\tbars.db.profile.BigWigsEmphasizeAnchor_x = 620\n\t\tbars.db.profile.emphasizeGrowup = true\n\t\tbars.db.profile.InstalledBars = C.actionbar.bottombars\n\t\tif C.actionbar.bottombars == 1 then\n\t\t\tbars.db.profile.BigWigsAnchor_y = 185 * UIParent:GetEffectiveScale()\n\t\t\tbars.db.profile.BigWigsEmphasizeAnchor_y = 344 * UIParent:GetEffectiveScale()\n\t\telseif C.actionbar.bottombars == 2 then\n\t\t\tbars.db.profile.BigWigsAnchor_y = 213 * UIParent:GetEffectiveScale()\n\t\t\tbars.db.profile.BigWigsEmphasizeAnchor_y = 372 * UIParent:GetEffectiveScale()\n\t\telseif C.actionbar.bottombars == 3 then\n\t\t\tbars.db.profile.BigWigsAnchor_y = 241 * UIParent:GetEffectiveScale()\n\t\t\tbars.db.profile.BigWigsEmphasizeAnchor_y = 400 * UIParent:GetEffectiveScale()\n\t\tend\n\tend\n\tlocal mess = BigWigs:GetPlugin(\"Messages\")\n\tif mess then\n\t\tmess.db.profile.fontName = \"Calibri\"\n\t\tmess.db.profile.fontSize = 20\n\t\tmess.db.profile.emphFontName = \"Calibri\"\n\t\tmess.db.profile.BWMessageAnchor_x = 615\n\t\tmess.db.profile.BWMessageAnchor_y = 440\n\t\tmess.db.profile.BWEmphasizeMessageAnchor_x = 618\n\t\tmess.db.profile.BWEmphasizeMessageAnchor_y = 495\n\t\tmess.db.profile.BWEmphasizeCountdownMessageAnchor_x = 665\n\t\tmess.db.profile.BWEmphasizeCountdownMessageAnchor_y = 477\n\tend\n\tlocal prox = BigWigs:GetPlugin(\"Proximity\")\n\tif prox then\n\t\tprox.db.profile.fontName = \"Calibri\"\n\t\tprox.db.profile.objects.ability = false\n\tend\n\tBigWigs:GetPlugin(\"AltPower\").db.profile.fontName = \"Calibri\"\n\tBigWigsIconDB.hide = true\n\tif InCombatLockdown() then\n\t\tprint(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\")\n\t\tprint(\"|cffffff00Reload your UI to apply skin.|r\")\n\telse\n\t\tReloadUI()\n\tend\nend\n\nStaticPopupDialogs.SETTINGS_BIGWIGS = {\n\ttext = L_POPUP_SETTINGS_BW,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function() T.UploadBW() end,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\nSlashCmdList.BWTEST = function(msg)\n\tif msg == \"apply\" then\n\t\tSlashCmdList[\"BigWigs\"]()\n\t\tHideUIPanel(InterfaceOptionsFrame)\n\t\tStaticPopup_Show(\"SETTINGS_BIGWIGS\")\n\telseif msg == \"test\" then\n\t\tSlashCmdList[\"BigWigs\"]()\n\t\tBigWigs:GetPlugin(\"Proximity\").Test(BigWigs:GetPlugin(\"Proximity\"))\n\t\tHideUIPanel(InterfaceOptionsFrame)\n\t\tBigWigs:Test()\n\t\tBigWigs:Test()\n\t\tBigWigs:Test()\n\t\tBigWigs:Test()\n\t\tBigWigs:Test()\n\telse\n\t\tprint(\"|cffffff00Type /bwtest apply to apply BigWigs settings.|r\")\n\t\tprint(\"|cffffff00Type /bwtest test to launch BigWigs testmode.|r\")\n\tend\nend\nSLASH_BWTEST1 = \"/bwtest\"\nSLASH_BWTEST2 = \"/ицеуые\""
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Achievement.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAchievementUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frames = {\n\t\t\"AchievementFrame\",\n\t\t\"AchievementFrameCategories\",\n\t\t\"AchievementFrameSummary\",\n\t\t\"AchievementFrameSummaryCategoriesHeader\",\n\t\t\"AchievementFrameSummaryAchievementsHeader\",\n\t\t\"AchievementFrameStatsBG\",\n\t\t\"AchievementFrameAchievements\",\n\t\t\"AchievementFrameComparison\",\n\t\t\"AchievementFrameComparisonHeader\",\n\t}\n\n\tfor _, frame in pairs(frames) do\n\t\t_G[frame]:StripTextures(true)\n\tend\n\n\tAchievementFrame.Header:StripTextures(true)\n\n\tselect(3, _G.AchievementFrameAchievements:GetChildren()):Hide()\n\t_G.AchievementFrameSummary:GetChildren():Hide()\n\n\tAchievementFrame:CreateBackdrop(\"Transparent\")\n\tAchievementFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 7)\n\tAchievementFrame.backdrop:SetPoint(\"BOTTOMRIGHT\")\n\tAchievementFrame.Header.Title:ClearAllPoints()\n\tAchievementFrame.Header.Title:SetPoint(\"TOPLEFT\", AchievementFrame.backdrop, \"TOPLEFT\", -22, -8)\n\tAchievementFrame.Header.Points:ClearAllPoints()\n\tAchievementFrame.Header.Points:SetPoint(\"LEFT\", AchievementFrame.Header.Title, \"RIGHT\", -2, 0)\n\n\t-- Backdrops\n\tAchievementFrameCategories:CreateBackdrop(\"Overlay\")\n\tAchievementFrameCategories.backdrop:SetPoint(\"TOPLEFT\", 0, 4)\n\tAchievementFrameCategories.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, -3)\n\tAchievementFrameSummary:CreateBackdrop(\"Overlay\")\n\tAchievementFrameSummary.backdrop:SetPoint(\"TOPLEFT\", -3, 0)\n\tAchievementFrameSummary.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, -3)\n\tAchievementFrameStats:CreateBackdrop(\"Overlay\")\n\tAchievementFrameStats.backdrop:SetPoint(\"TOPLEFT\", 2, 0)\n\tAchievementFrameStats.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, -3)\n\tAchievementFrameComparison.StatContainer:CreateBackdrop(\"Overlay\")\n\tAchievementFrameComparison.StatContainer.backdrop:SetPoint(\"TOPLEFT\", 2, 0)\n\tAchievementFrameComparison.StatContainer.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, -3)\n\n\tT.SkinCloseButton(AchievementFrameCloseButton, AchievementFrame.backdrop)\n\tT.SkinDropDownBox(AchievementFrameFilterDropDown)\n\tAchievementFrameFilterDropDown:ClearAllPoints()\n\tAchievementFrameFilterDropDown:SetPoint(\"TOPLEFT\", AchievementFrameAchievements, \"TOPLEFT\", -19, 24)\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"ADDON_LOADED\")\n\tframe:SetScript(\"OnEvent\", function()\n\t\tif not IsAddOnLoaded(\"Overachiever\") then return end\n\t\tAchievementFrameFilterDropDownButton:SetWidth(17)\n\t\tAchievementFrameFilterDropDown:ClearAllPoints()\n\t\tAchievementFrameFilterDropDown:SetPoint(\"TOPLEFT\", AchievementFrameAchievements, \"TOPLEFT\", -19, 24)\n\tend)\n\n\tT.SkinEditBox(AchievementFrame.SearchBox)\n\tAchievementFrame.SearchBox:SetHeight(15)\n\tAchievementFrame.SearchBox:ClearAllPoints()\n\tAchievementFrame.SearchBox:SetPoint(\"TOPRIGHT\", AchievementFrame, \"TOPRIGHT\", -51, 0)\n\n\tAchievementFrame.SearchPreviewContainer:StripTextures()\n\tAchievementFrame.SearchPreviewContainer:CreateBackdrop(\"Transparent\")\n\tAchievementFrame.SearchPreviewContainer.backdrop:SetPoint(\"TOPLEFT\", -2, 2)\n\tAchievementFrame.SearchPreviewContainer.backdrop:SetPoint(\"BOTTOMRIGHT\", AchievementFrame.SearchPreviewContainer.ShowAllSearchResults, 2, -2)\n\n\tAchievementFrame.SearchResults:StripTextures()\n\tAchievementFrame.SearchResults:SetTemplate(\"Transparent\")\n\tT.SkinCloseButton(AchievementFrame.SearchResults.CloseButton)\n\n\t-- ScrollBars\n\tT.SkinScrollBar(AchievementFrameCategories.ScrollBar)\n\tT.SkinScrollBar(AchievementFrameAchievements.ScrollBar)\n\tT.SkinScrollBar(AchievementFrameStats.ScrollBar)\n\tT.SkinScrollBar(AchievementFrameComparison.AchievementContainer.ScrollBar)\n\tT.SkinScrollBar(AchievementFrameComparison.StatContainer.ScrollBar)\n\tT.SkinScrollBar(AchievementFrame.SearchResults.ScrollBar)\n\n\tAchievementFrameCategories.ScrollBar:SetPoint(\"TOPLEFT\", AchievementFrameCategories, \"TOPRIGHT\", -1, 3)\n\tAchievementFrameCategories.ScrollBar:SetPoint(\"BOTTOMLEFT\", AchievementFrameCategories, \"BOTTOMRIGHT\", -1, -7)\n\n\t-- Tabs\n\tfor i = 1, 3 do\n\t\tlocal tab = _G[\"AchievementFrameTab\"..i]\n\t\tif tab then\n\t\t\tT.SkinTab(tab)\n\t\t\ttab:SetFrameLevel(tab:GetFrameLevel() + 2)\n\t\tend\n\tend\n\n\tlocal function SkinStatusBar(bar, comparison)\n\t\tbar:StripTextures()\n\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\tbar:SetStatusBarColor(0, 0.7, 0.1)\n\t\tbar:CreateBackdrop(\"Overlay\")\n\n\t\tif comparison then\n\t\t\tlocal title = bar.Title\n\t\t\tlocal text = bar.Text\n\n\t\t\tif title then\n\t\t\t\ttitle:SetPoint(\"LEFT\", 4, 0)\n\t\t\tend\n\n\t\t\tif text then\n\t\t\t\ttext:SetPoint(\"CENTER\")\n\t\t\tend\n\t\telse\n\t\t\tlocal title = _G[bar:GetName()..\"Title\"]\n\t\t\tlocal label = _G[bar:GetName()..\"Label\"]\n\t\t\tlocal text = _G[bar:GetName()..\"Text\"]\n\n\t\t\tif title then\n\t\t\t\ttitle:SetPoint(\"LEFT\", 4, 0)\n\t\t\tend\n\n\t\t\tif label then\n\t\t\t\tlabel:SetPoint(\"LEFT\", 4, 0)\n\t\t\tend\n\n\t\t\tif text then\n\t\t\t\ttext:SetPoint(\"RIGHT\", -4, 0)\n\t\t\tend\n\t\tend\n\tend\n\n\tSkinStatusBar(AchievementFrameSummaryCategoriesStatusBar)\n\tSkinStatusBar(AchievementFrameComparison.Summary.Player.StatusBar, true)\n\tSkinStatusBar(AchievementFrameComparison.Summary.Friend.StatusBar, true)\n\tAchievementFrameComparisonHeader:SetPoint(\"BOTTOMRIGHT\", AchievementFrameComparison, \"TOPRIGHT\", 39, 26)\n\tAchievementFrameComparisonHeader:CreateBackdrop(\"Transparent\")\n\tAchievementFrameComparisonHeader.backdrop:SetPoint(\"TOPLEFT\", 20, -20)\n\tAchievementFrameComparisonHeader.backdrop:SetPoint(\"BOTTOMRIGHT\", -17, 1)\n\n\tfor i = 1, 12 do\n\t\tlocal frame = _G[\"AchievementFrameSummaryCategoriesCategory\"..i]\n\t\tlocal button = _G[\"AchievementFrameSummaryCategoriesCategory\"..i..\"Button\"]\n\t\tlocal highlight = _G[\"AchievementFrameSummaryCategoriesCategory\"..i..\"ButtonHighlight\"]\n\n\t\tSkinStatusBar(frame)\n\t\tbutton:StripTextures()\n\t\thighlight:StripTextures()\n\n\t\tframe.Label:SetPoint(\"LEFT\", frame, \"LEFT\", 4, 0)\n\n\t\t_G[highlight:GetName()..\"Middle\"]:SetColorTexture(1, 1, 1, 0.3)\n\t\t_G[highlight:GetName()..\"Middle\"]:SetAllPoints(frame)\n\tend\n\n\thooksecurefunc(_G.AchievementFrameCategories.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, { frame.ScrollTarget:GetChildren() } do\n\t\t\tlocal button = child.Button\n\t\t\tif button and not button.IsSkinned then\n\t\t\t\tbutton:StripTextures()\n\t\t\t\tbutton.Background:Hide()\n\t\t\t\tbutton:StyleButton()\n\n\t\t\t\tbutton.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(_G.AchievementFrameAchievements.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, { frame.ScrollTarget:GetChildren() } do\n\t\t\tif not child.isSkinned then\n\t\t\t\tchild:StripTextures(true)\n\t\t\t\tchild.Background:SetAlpha(0)\n\t\t\t\tchild.Highlight:SetAlpha(0)\n\t\t\t\tchild.Icon.frame:Hide()\n\t\t\t\tchild.Description:SetTextColor(0.6, 0.6, 0.6)\n\t\t\t\tchild.Description.SetTextColor = T.dummy\n\t\t\t\tchild.Description:SetShadowOffset(1, -1)\n\t\t\t\tchild.Description.SetShadowOffset = T.dummy\n\n\t\t\t\tchild:CreateBackdrop(\"Overlay\")\n\t\t\t\tchild.backdrop:SetPoint(\"TOPLEFT\", 1, -1)\n\t\t\t\tchild.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\t\t\tchild.Icon.texture:SkinIcon()\n\n\t\t\t\tT.SkinCheckBox(child.Tracked)\n\t\t\t\tchild.Tracked:SetSize(20, 20)\n\t\t\t\tchild.Check:SetAlpha(0)\n\t\t\t\tchild.Tracked:ClearAllPoints()\n\t\t\t\tchild.Tracked:SetPoint(\"BOTTOMLEFT\", child, \"BOTTOMLEFT\", 7, 2)\n\t\t\t\tchild.Tracked.ClearAllPoints = T.dummy\n\t\t\t\tchild.Tracked.SetPoint = T.dummy\n\n\t\t\t\thooksecurefunc(child, \"UpdatePlusMinusTexture\", function (button)\n\t\t\t\t\tif button.DateCompleted:IsShown() then\n\t\t\t\t\t\tif button.accountWide then\n\t\t\t\t\t\t\tbutton.Label:SetTextColor(0.1, 0.6, 0.8)\n\t\t\t\t\t\t\tbutton.backdrop:SetBackdropBorderColor(ACHIEVEMENT_BLUE_BORDER_COLOR:GetRGB())\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tbutton.Label:SetTextColor(1, 0.82, 0)\n\t\t\t\t\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\t\t\tend\n\t\t\t\t\telseif button.accountWide then\n\t\t\t\t\t\tbutton.Label:SetTextColor(0.6, 0.6, 0.6)\n\t\t\t\t\t\tbutton.backdrop:SetBackdropBorderColor(ACHIEVEMENT_BLUE_BORDER_COLOR:GetRGB())\n\t\t\t\t\telse\n\t\t\t\t\t\tbutton.Label:SetTextColor(0.6, 0.6, 0.6)\n\t\t\t\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\t\tend\n\t\t\t\tend)\n\t\t\t\thooksecurefunc(child, \"DisplayObjectives\", function (frame)\n\t\t\t\t\tlocal objectives = frame:GetObjectiveFrame()\n\t\t\t\t\tif objectives and objectives.progressBars then\n\t\t\t\t\t\tfor _, bar in next, objectives.progressBars do\n\t\t\t\t\t\t\tif not bar.isSkinned then\n\t\t\t\t\t\t\t\tbar:StripTextures()\n\t\t\t\t\t\t\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\t\t\t\t\t\t\tbar:SetStatusBarColor(0, 0.7, 0.1)\n\t\t\t\t\t\t\t\tbar:CreateBackdrop(\"Overlay\")\n\t\t\t\t\t\t\t\tbar.isSkinned = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend)\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tAchievementFrame:HookScript(\"OnShow\", function()\n\t\tfor i = 3, 8 do\n\t\t\tlocal tab = _G[\"AchievementFrameTab\"..i]\n\t\t\tif tab and not tab.isSkinned then\n\t\t\t\tT.SkinTab(tab)\n\t\t\t\ttab.isSkinned = true\n\t\t\tend\n\t\tend\n\t\tAchievementFrameTab1:SetPoint(\"TOPLEFT\", AchievementFrame, \"BOTTOMLEFT\", 17, 2)\n\tend)\n\n\thooksecurefunc(\"AchievementFrameSummary_UpdateAchievements\", function()\n\t\tfor i = 1, ACHIEVEMENTUI_MAX_SUMMARY_ACHIEVEMENTS do\n\t\t\tlocal frame = _G[\"AchievementFrameSummaryAchievement\"..i]\n\t\t\tframe:StripTextures()\n\t\t\tframe.Highlight:SetAlpha(0)\n\n\t\t\tframe.Description:SetTextColor(0.6, 0.6, 0.6)\n\t\t\tframe.Description:SetShadowOffset(1, -1)\n\n\t\t\tif not frame.backdrop then\n\t\t\t\tframe:CreateBackdrop(\"Overlay\")\n\t\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\t\tframe.TitleBar:Hide()\n\t\t\t\tframe.Glow:Hide()\n\t\t\t\tframe.Icon.frame:Hide()\n\n\t\t\t\tframe.Icon:SetTemplate(\"Default\")\n\t\t\t\tframe.Icon:SetHeight(frame.Icon:GetHeight() - 14)\n\t\t\t\tframe.Icon:SetWidth(frame.Icon:GetWidth() - 14)\n\t\t\t\tframe.Icon:ClearAllPoints()\n\t\t\t\tframe.Icon:SetPoint(\"LEFT\", 6, 0)\n\t\t\t\tframe.Icon.texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tframe.Icon.texture:ClearAllPoints()\n\t\t\t\tframe.Icon.texture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tframe.Icon.texture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\tend\n\n\t\t\tif frame.accountWide then\n\t\t\t\tframe.backdrop:SetBackdropBorderColor(ACHIEVEMENT_BLUE_BORDER_COLOR:GetRGB())\n\t\t\telse\n\t\t\t\tframe.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(\"AchievementObjectives_DisplayCriteria\", function(objectivesFrame, id)\n\t\tlocal numCriteria = GetAchievementNumCriteria(id)\n\t\tlocal textStrings, metas = 0, 0\n\t\tfor i = 1, numCriteria do\n\t\t\tlocal _, criteriaType, completed, _, _, _, _, assetID = GetAchievementCriteriaInfo(id, i)\n\t\t\tif assetID and criteriaType == _G.CRITERIA_TYPE_ACHIEVEMENT then\n\t\t\t\tmetas = metas + 1\n\t\t\t\tcriteria, object = objectivesFrame:GetMeta(metas), \"Label\"\n\t\t\telseif criteriaType ~= 1 then\n\t\t\t\ttextStrings = textStrings + 1\n\t\t\t\tcriteria, object = objectivesFrame:GetCriteria(textStrings), \"Name\"\n\t\t\tend\n\n\t\t\tlocal text = criteria and criteria[object]\n\t\t\tif text then\n\t\t\t\tlocal r, g, b, x, y\n\t\t\t\tif completed then\n\t\t\t\t\tif objectivesFrame.completed then\n\t\t\t\t\t\tr, g, b, x, y = 1, 1, 1, 0, 0\n\t\t\t\t\telse\n\t\t\t\t\t\tr, g, b, x, y = 0, 1, 0, 1, -1\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tr, g, b, x, y = .6, .6, .6, 1, -1\n\t\t\t\tend\n\n\t\t\t\ttext:SetTextColor(r, g, b)\n\t\t\t\ttext:SetShadowOffset(x, y)\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Comparison\n\tlocal Comparison = _G.AchievementFrameComparison\n\tComparison:StripTextures()\n\tselect(5, Comparison:GetChildren()):Hide()\n\tComparison.Summary.Player:StripTextures()\n\tComparison.Summary.Friend:StripTextures()\n\n\tlocal function HandleCompareCategory(button)\n\t\tbutton:StripTextures()\n\t\tbutton.Background:Hide()\n\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\tbutton.backdrop:SetInside(button, 2, 2)\n\n\t\tbutton.TitleBar:Hide()\n\t\tbutton.Glow:Hide()\n\t\tbutton.Icon.frame:Hide()\n\n\t\tbutton.Icon:SetTemplate(\"Default\")\n\t\tbutton.Icon:SetHeight(button.Icon:GetHeight() - 14)\n\t\tbutton.Icon:SetWidth(button.Icon:GetWidth() - 14)\n\t\tbutton.Icon:ClearAllPoints()\n\t\tbutton.Icon:SetPoint(\"LEFT\", 6, 0)\n\t\tbutton.Icon.texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton.Icon.texture:ClearAllPoints()\n\t\tbutton.Icon.texture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tbutton.Icon.texture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\thooksecurefunc(Comparison.AchievementContainer.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, { frame.ScrollTarget:GetChildren() } do\n\t\t\tif not child.isSkinned then\n\t\t\t\tHandleCompareCategory(child.Player)\n\t\t\t\tchild.Player.Description:SetTextColor(0.6, 0.6, 0.6)\n\t\t\t\tchild.Player.Description.SetTextColor = T.dummy\n\t\t\t\tHandleCompareCategory(child.Friend)\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(Comparison.StatContainer.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, { frame.ScrollTarget:GetChildren() } do\n\t\t\tif not child.isSkinned then\n\t\t\t\tchild:StyleButton()\n\t\t\t\tchild.Background:SetColorTexture(1, 1, 1, 0.15)\n\n\t\t\t\tchild.Left:Kill()\n\t\t\t\tchild.Middle:Kill()\n\t\t\t\tchild.Right:Kill()\n\n\t\t\t\tchild.Left2:Kill()\n\t\t\t\tchild.Middle2:Kill()\n\t\t\t\tchild.Right2:Kill()\n\n\t\t\t\tchild.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Stats\n\tselect(4, _G.AchievementFrameStats:GetChildren()):Hide()\n\thooksecurefunc(_G.AchievementFrameStats.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, { frame.ScrollTarget:GetChildren() } do\n\t\t\tif not child.IsSkinned then\n\t\t\t\tchild:StyleButton()\n\t\t\t\tchild.Background:SetColorTexture(1, 1, 1, 0.2)\n\n\t\t\t\tchild.Left:Kill()\n\t\t\t\tchild.Middle:Kill()\n\t\t\t\tchild.Right:Kill()\n\n\t\t\t\tchild.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_AchievementUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/AddonList.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAddonList skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal buttons = {\n\t\t\"AddonListEnableAllButton\",\n\t\t\"AddonListDisableAllButton\",\n\t\t\"AddonListCancelButton\",\n\t\t\"AddonListOkayButton\"\n\t}\n\n\tfor _, button in pairs(buttons) do\n\t\t_G[button]:SkinButton()\n\tend\n\n\tAddonList:StripTextures()\n\tAddonList:SetTemplate(\"Transparent\")\n\tAddonList:SetHeight(AddonList:GetHeight() + 3)\n\n\tAddonListInset:StripTextures()\n\tAddonListInset:SetTemplate(\"Overlay\")\n\tAddonListInset:SetPoint(\"BOTTOMRIGHT\", -6, 29)\n\n\tlocal function forceSaturation(self, _, force)\n\t\tif force then return end\n\t\tself:SetVertexColor(0.6, 0.6, 0.6)\n\t\tself:SetDesaturated(true, true)\n\tend\n\n\thooksecurefunc(AddonList.ScrollBox, \"Update\", function(self)\n\t\tfor i = 1, self.ScrollTarget:GetNumChildren() do\n\t\t\tlocal child = select(i, self.ScrollTarget:GetChildren())\n\t\t\tif not child.styled then\n\t\t\t\tT.SkinCheckBox(child.Enabled)\n\t\t\t\tchild.LoadAddonButton:SkinButton()\n\t\t\t\thooksecurefunc(child.Enabled:GetCheckedTexture(), \"SetDesaturated\", forceSaturation)\n\n\t\t\t\tchild.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tT.SkinScrollBar(AddonList.ScrollBar)\n\tT.SkinCloseButton(AddonListCloseButton)\n\tT.SkinDropDownBox(AddonCharacterDropDown)\n\tT.SkinCheckBox(AddonListForceLoad)\n\tAddonListForceLoad:SetSize(25, 25)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/AdventureMap.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAdventure Map skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tAdventureMapQuestChoiceDialog:StripTextures()\n\tAdventureMapQuestChoiceDialog:CreateBackdrop(\"Transparent\")\n\tAdventureMapQuestChoiceDialog.backdrop:SetFrameStrata(\"LOW\")\n\n\tlocal function SkinRewards()\n\t\tfor reward in pairs(AdventureMapQuestChoiceDialog.rewardPool.activeObjects) do\n\t\t\tif not reward.isSkinned then\n\t\t\t\treward.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\treward.ItemNameBG:Hide()\n\t\t\t\treward:CreateBackdrop(\"Default\")\n\t\t\t\treward.backdrop:ClearAllPoints()\n\t\t\t\treward.backdrop:SetPoint(\"TOPLEFT\", reward.Icon, -2, 2)\n\t\t\t\treward.backdrop:SetPoint(\"BOTTOMRIGHT\", reward.Icon, 2, -2)\n\t\t\t\treward.isSkinned = true\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(AdventureMapQuestChoiceDialog, \"RefreshRewards\", SkinRewards)\n\n\tAdventureMapQuestChoiceDialog.Details.Child.TitleHeader:SetTextColor(1, 1, 0)\n\tAdventureMapQuestChoiceDialog.Details.Child.DescriptionText:SetTextColor(1, 1, 1)\n\tAdventureMapQuestChoiceDialog.Details.Child.ObjectivesHeader:SetTextColor(1, 1, 0)\n\tAdventureMapQuestChoiceDialog.Details.Child.ObjectivesText:SetTextColor(1, 1, 1)\n\n\tAdventureMapQuestChoiceDialog.AcceptButton:SkinButton()\n\tAdventureMapQuestChoiceDialog.DeclineButton:SkinButton()\n\n\tT.SkinScrollBar(AdventureMapQuestChoiceDialog.Details.ScrollBar)\n\tT.SkinCloseButton(AdventureMapQuestChoiceDialog.CloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_AdventureMap\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/AlertFrames.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAlertFrames skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal function forceAlpha(self, alpha, isForced)\n\t\tif alpha ~= 1 and isForced ~= true then\n\t\t\tself:SetAlpha(1, true)\n\t\tend\n\tend\n\n\tlocal function SkinAchievementAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -1, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -2, 6)\n\t\tend\n\n\t\t-- Background\n\t\tframe.Background:SetTexture(nil)\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe.GuildBanner:Kill()\n\t\tframe.GuildBorder:Kill()\n\n\t\t-- Text\n\t\tframe.Unlocked:SetTextColor(1, 1, 1)\n\t\tframe.Name:SetTextColor(1, 0.8, 0)\n\n\t\t-- Icon\n\t\tframe.Icon.Texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon.Overlay:Kill()\n\t\tframe.Icon.Texture:ClearAllPoints()\n\t\tframe.Icon.Texture:SetPoint(\"LEFT\", frame, 8, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.Texture.b then\n\t\t\tframe.Icon.Texture.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.Texture.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.Texture.b:SetPoint(\"TOPLEFT\", frame.Icon.Texture, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.Texture.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon.Texture, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon.Texture:SetParent(frame.Icon.Texture.b)\n\t\tend\n\tend\n\thooksecurefunc(AchievementAlertSystem, \"setUpFunction\", SkinAchievementAlert)\n\n\tlocal function SkinCriteriaAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -9, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 5, 6)\n\t\tend\n\n\t\tframe.Unlocked:SetTextColor(1, 1, 1)\n\t\tframe.Name:SetTextColor(1, 0.8, 0)\n\t\tframe.Background:Kill()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe.Icon.Bling:Kill()\n\t\tframe.Icon.Overlay:Kill()\n\n\t\t-- Icon\n\t\tframe.Icon.Texture:SetSize(27, 27)\n\t\tframe.Icon.Texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon.Texture:ClearAllPoints()\n\t\tframe.Icon.Texture:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.Texture.b then\n\t\t\tframe.Icon.Texture.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.Texture.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.Texture.b:SetPoint(\"TOPLEFT\", frame.Icon.Texture, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.Texture.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon.Texture, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon.Texture:SetParent(frame.Icon.Texture.b)\n\t\tend\n\tend\n\thooksecurefunc(CriteriaAlertSystem, \"setUpFunction\", SkinCriteriaAlert)\n\n\tlocal function SkinDungeonCompletionAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 31, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -35, 6)\n\t\tend\n\n\t\tif frame.glowFrame then\n\t\t\tframe.glowFrame:Kill()\n\n\t\t\tif frame.glowFrame.glow then\n\t\t\t\tframe.glowFrame.glow:Kill()\n\t\t\tend\n\t\tend\n\n\t\tif frame.shine then frame.shine:Kill() end\n\t\tif frame.raidArt then frame.raidArt:Kill() end\n\t\tif frame.heroicIcon then frame.heroicIcon:Kill() end\n\t\tif frame.dungeonArt then frame.dungeonArt:Kill() end\n\t\tif frame.dungeonArt1 then frame.dungeonArt1:Kill() end\n\t\tif frame.dungeonArt2 then frame.dungeonArt2:Kill() end\n\t\tif frame.dungeonArt3 then frame.dungeonArt3:Kill() end\n\t\tif frame.dungeonArt4 then frame.dungeonArt4:Kill() end\n\n\t\t-- Icon\n\t\tframe.dungeonTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.dungeonTexture:SetDrawLayer(\"OVERLAY\")\n\t\tframe.dungeonTexture:ClearAllPoints()\n\t\tframe.dungeonTexture:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.dungeonTexture.b then\n\t\t\tframe.dungeonTexture.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.dungeonTexture.b:SetTemplate(\"Default\")\n\t\t\tframe.dungeonTexture.b:SetPoint(\"TOPLEFT\", frame.dungeonTexture, \"TOPLEFT\", -2, 2)\n\t\t\tframe.dungeonTexture.b:SetPoint(\"BOTTOMRIGHT\", frame.dungeonTexture, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.dungeonTexture:SetParent(frame.dungeonTexture.b)\n\t\tend\n\tend\n\thooksecurefunc(DungeonCompletionAlertSystem, \"setUpFunction\", SkinDungeonCompletionAlert)\n\n\tlocal function SkinGuildChallengeAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -2, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -2, 6)\n\t\tend\n\n\t\t-- Background\n\t\tlocal region = select(2, frame:GetRegions())\n\t\tif region:GetObjectType() == \"Texture\" then\n\t\t\tif region:GetTexture() == 516664 then\n\t\t\t\tregion:Kill()\n\t\t\tend\n\t\tend\n\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe.EmblemBorder:Kill()\n\n\t\t-- Icon border\n\t\tframe.EmblemBackground:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\t\tframe.EmblemIcon:SetPoint(\"CENTER\", frame.EmblemBackground, 0, 0)\n\t\tframe.EmblemBackground:SetDrawLayer(\"ARTWORK\", 1)\n\t\tframe.EmblemIcon:SetDrawLayer(\"ARTWORK\", 2)\n\n\t\t-- Icon border\n\t\tif not frame.EmblemBackground.b then\n\t\t\tframe.EmblemBackground.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.EmblemBackground.b:SetTemplate(\"Default\")\n\t\t\tframe.EmblemBackground.b:SetPoint(\"TOPLEFT\", frame.EmblemBackground, \"TOPLEFT\", -2, 2)\n\t\t\tframe.EmblemBackground.b:SetPoint(\"BOTTOMRIGHT\", frame.EmblemBackground, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.EmblemBackground:SetParent(frame.EmblemBackground.b)\n\t\t\tframe.EmblemIcon:SetParent(frame.EmblemBackground.b)\n\t\tend\n\tend\n\thooksecurefunc(GuildChallengeAlertSystem, \"setUpFunction\", SkinGuildChallengeAlert)\n\n\tlocal function SkinInvasionAlert(frame)\n\t\tif not frame.isSkinned then\n\t\t\tframe:SetAlpha(1)\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 4, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -7, 6)\n\n\t\t\tlocal region, icon = frame:GetRegions()\n\t\t\tif region and region:GetObjectType() == \"Texture\" then\n\t\t\t\tif region:GetAtlas() == \"legioninvasion-Toast-Frame\" then\n\t\t\t\t\tregion:Kill()\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- Icon border\n\t\t\tif icon and icon:GetObjectType() == \"Texture\" then\n\t\t\t\tif icon:GetTexture() == 236293 then\n\t\t\t\t\ticon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\t\t\ticon.b:SetTemplate(\"Default\")\n\t\t\t\t\ticon.b:SetPoint(\"TOPLEFT\", icon, \"TOPLEFT\", -2, 2)\n\t\t\t\t\ticon.b:SetPoint(\"BOTTOMRIGHT\", icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\t\t\ticon:SetParent(icon.b)\n\t\t\t\t\ticon:SetDrawLayer(\"OVERLAY\")\n\t\t\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\ticon:ClearAllPoints()\n\t\t\t\t\ticon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tframe.isSkinned = true\n\t\tend\n\tend\n\thooksecurefunc(InvasionAlertSystem, \"setUpFunction\", SkinInvasionAlert)\n\n\tlocal function SkinScenarioAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 4, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -7, 6)\n\t\tend\n\n\t\t-- Background\n\t\tfor i = 1, frame:GetNumRegions() do\n\t\t\tlocal region = select(i, frame:GetRegions())\n\t\t\tif region:GetObjectType() == \"Texture\" then\n\t\t\t\tif region:GetAtlas() == \"Toast-IconBG\" or region:GetAtlas() == \"Toast-Frame\" then\n\t\t\t\t\tregion:Kill()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tframe.shine:Kill()\n\t\tframe.glowFrame:Kill()\n\t\tframe.glowFrame.glow:Kill()\n\n\t\t-- Icon\n\t\tframe.dungeonTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.dungeonTexture:ClearAllPoints()\n\t\tframe.dungeonTexture:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\t\tframe.dungeonTexture:SetDrawLayer(\"OVERLAY\")\n\n\t\t-- Icon border\n\t\tif not frame.dungeonTexture.b then\n\t\t\tframe.dungeonTexture.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.dungeonTexture.b:SetTemplate(\"Default\")\n\t\t\tframe.dungeonTexture.b:SetPoint(\"TOPLEFT\", frame.dungeonTexture, \"TOPLEFT\", -2, 2)\n\t\t\tframe.dungeonTexture.b:SetPoint(\"BOTTOMRIGHT\", frame.dungeonTexture, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.dungeonTexture:SetParent(frame.dungeonTexture.b)\n\t\tend\n\tend\n\thooksecurefunc(ScenarioAlertSystem, \"setUpFunction\", SkinScenarioAlert)\n\n\tlocal function SkinWorldQuestCompleteAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 18, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -22, 6)\n\t\tend\n\n\t\t-- Background\n\t\tframe.ToastBackground:Kill()\n\t\tframe.shine:Kill()\n\n\t\t-- Icon\n\t\tframe.QuestTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.QuestTexture:SetDrawLayer(\"ARTWORK\")\n\t\tframe.QuestTexture:SetPoint(\"LEFT\", frame.backdrop, 8, 0)\n\n\t\t-- Icon border\n\t\tif not frame.QuestTexture.b then\n\t\t\tframe.QuestTexture.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.QuestTexture.b:SetTemplate(\"Default\")\n\t\t\tframe.QuestTexture.b:SetPoint(\"TOPLEFT\", frame.QuestTexture, \"TOPLEFT\", -2, 2)\n\t\t\tframe.QuestTexture.b:SetPoint(\"BOTTOMRIGHT\", frame.QuestTexture, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.QuestTexture:SetParent(frame.QuestTexture.b)\n\t\tend\n\tend\n\thooksecurefunc(WorldQuestCompleteAlertSystem, \"setUpFunction\", SkinWorldQuestCompleteAlert)\n\n\tlocal function SkinGarrisonFollowerAlert(frame, _, _, _, quality)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 7, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -10, 6)\n\t\tend\n\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe.FollowerBG:SetAlpha(0)\n\t\tframe.DieIcon:SetAlpha(0)\n\t\tframe.PortraitFrame:ClearAllPoints()\n\t\tframe.PortraitFrame:SetPoint(\"LEFT\", 12, -4)\n\n\t\tframe.PortraitFrame.PortraitRing:Hide()\n\t\tframe.PortraitFrame.PortraitRingQuality:SetTexture()\n\t\tframe.PortraitFrame.LevelBorder:SetAlpha(0)\n\t\tframe.PortraitFrame.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)\n\n\t\tlocal level = frame.PortraitFrame.Level\n\t\tlevel:ClearAllPoints()\n\t\tlevel:SetPoint(\"BOTTOM\", frame.PortraitFrame, 0, 11)\n\t\tlevel:SetFontObject(\"SystemFont_Outline_Small\")\n\t\tlevel:SetShadowOffset(0, 0)\n\n\t\tif not frame.squareBG then\n\t\t\tframe.squareBG = CreateFrame(\"Frame\", nil, frame.PortraitFrame)\n\t\t\tframe.squareBG:SetFrameLevel(frame.PortraitFrame:GetFrameLevel()-1)\n\t\t\tframe.squareBG:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tframe.squareBG:SetPoint(\"BOTTOMRIGHT\", -2, 10)\n\t\t\tframe.squareBG:SetTemplate(\"Default\")\n\t\tend\n\n\t\tlocal cover = frame.PortraitFrame.PortraitRingCover\n\t\tif cover then\n\t\t\tcover:SetColorTexture(0, 0, 0)\n\t\t\tcover:SetAllPoints(frame.squareBG)\n\t\tend\n\n\t\tlocal color = ITEM_QUALITY_COLORS[quality]\n\t\tif color and quality > 1 then\n\t\t\tframe.Name:SetTextColor(color.r, color.g, color.b)\n\t\tend\n\n\t\t-- Background\n\t\tfor i = 1, frame:GetNumRegions() do\n\t\t\tlocal region = select(i, frame:GetRegions())\n\t\t\tif region:GetObjectType() == \"Texture\" then\n\t\t\t\tif region:GetAtlas() == \"Garr_MissionToast\" then\n\t\t\t\t\tregion:Kill()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(GarrisonFollowerAlertSystem, \"setUpFunction\", SkinGarrisonFollowerAlert)\n\n\tlocal function SkinGarrisonShipFollowerAlert(frame)\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 7, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -10, 6)\n\t\tend\n\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe.FollowerBG:SetAlpha(0)\n\t\tframe.DieIcon:SetAlpha(0)\n\t\tframe.Background:Kill()\n\tend\n\thooksecurefunc(GarrisonShipFollowerAlertSystem, \"setUpFunction\", SkinGarrisonShipFollowerAlert)\n\n\tlocal function SkinGarrisonTalentAlert(frame)\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 21, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -25, 6)\n\t\tend\n\n\t\tframe:GetRegions():Hide()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\n\t\t-- Icon\n\t\tframe.Icon:SetSize(50, 50)\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:SetDrawLayer(\"ARTWORK\")\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(GarrisonTalentAlertSystem, \"setUpFunction\", SkinGarrisonTalentAlert)\n\n\tlocal function SkinGarrisonBuildingAlert(frame)\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 7, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -10, 6)\n\t\tend\n\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe:GetRegions():Hide()\n\n\t\t-- Icon\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:SetDrawLayer(\"ARTWORK\")\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(GarrisonBuildingAlertSystem, \"setUpFunction\", SkinGarrisonBuildingAlert)\n\n\tlocal function SkinGarrisonMissionAlert(frame)\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 7, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -10, 6)\n\t\tend\n\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe.IconBG:Hide()\n\t\tframe.Background:Kill()\n\n\t\t-- Icon\n\t\tframe.MissionType:SetSize(45, 45)\n\t\tframe.MissionType:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.MissionType:SetDrawLayer(\"ARTWORK\")\n\t\tframe.MissionType:ClearAllPoints()\n\t\tframe.MissionType:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.MissionType.b then\n\t\t\tframe.MissionType.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.MissionType.b:SetTemplate(\"Default\")\n\t\t\tframe.MissionType.b:SetPoint(\"TOPLEFT\", frame.MissionType, \"TOPLEFT\", -2, 2)\n\t\t\tframe.MissionType.b:SetPoint(\"BOTTOMRIGHT\", frame.MissionType, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.MissionType:SetParent(frame.MissionType.b)\n\t\tend\n\n\t\tframe.EncounterIcon:SetSize(45, 45)\n\t\tframe.EncounterIcon:SetOutside(frame.MissionType.b)\n\t\tframe.EncounterIcon.CircleMask:Hide()\n\t\tframe.EncounterIcon.PortraitBorder:Hide()\n\t\tframe.EncounterIcon.RareOverlay:Hide()\n\t\tframe.EncounterIcon.EliteOverlay:Hide()\n\t\tframe.EncounterIcon.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)\n\tend\n\thooksecurefunc(GarrisonMissionAlertSystem, \"setUpFunction\", SkinGarrisonMissionAlert)\n\n\tlocal function SkinGarrisonShipMissionAlert(frame)\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 7, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -10, 6)\n\t\tend\n\n\t\tframe.Background:Kill()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\n\t\t-- Icon\n\t\tframe.MissionType:SetSize(45, 45)\n\t\tframe.MissionType:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.MissionType:SetDrawLayer(\"ARTWORK\")\n\t\tframe.MissionType:ClearAllPoints()\n\t\tframe.MissionType:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.MissionType.b then\n\t\t\tframe.MissionType.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.MissionType.b:SetTemplate(\"Default\")\n\t\t\tframe.MissionType.b:SetPoint(\"TOPLEFT\", frame.MissionType, \"TOPLEFT\", -2, 2)\n\t\t\tframe.MissionType.b:SetPoint(\"BOTTOMRIGHT\", frame.MissionType, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.MissionType:SetParent(frame.MissionType.b)\n\t\tend\n\tend\n\thooksecurefunc(GarrisonShipMissionAlertSystem, \"setUpFunction\", SkinGarrisonShipMissionAlert)\n\n\tlocal function SkinGarrisonRandomMissionAlert(frame)\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 7, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -10, 6)\n\t\tend\n\n\t\tframe.Background:Kill()\n\t\tframe.Blank:Kill()\n\t\tframe.IconBG:Kill()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\n\t\t-- Icon\n\t\tframe.MissionType:SetSize(45, 45)\n\t\tframe.MissionType:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.MissionType:SetDrawLayer(\"ARTWORK\")\n\t\tframe.MissionType:ClearAllPoints()\n\t\tframe.MissionType:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.MissionType.b then\n\t\t\tframe.MissionType.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.MissionType.b:SetTemplate(\"Default\")\n\t\t\tframe.MissionType.b:SetPoint(\"TOPLEFT\", frame.MissionType, \"TOPLEFT\", -2, 2)\n\t\t\tframe.MissionType.b:SetPoint(\"BOTTOMRIGHT\", frame.MissionType, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.MissionType:SetParent(frame.MissionType.b)\n\t\tend\n\tend\n\thooksecurefunc(GarrisonRandomMissionAlertSystem, \"setUpFunction\", SkinGarrisonRandomMissionAlert)\n\n\tlocal function SkinLegendaryItemAlert(frame)\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 14, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -18, 6)\n\t\tend\n\n\t\tframe.Background:Kill()\n\t\tframe.Background2:Kill()\n\t\tframe.Background3:Kill()\n\t\tframe.Ring1:Kill()\n\t\tframe.Particles3:Kill()\n\t\tframe.Particles2:Kill()\n\t\tframe.Particles1:Kill()\n\t\tframe.Starglow:Kill()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\n\t\t-- Icon\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:SetDrawLayer(\"ARTWORK\")\n\t\tframe.Icon:ClearAllPoints()\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(LegendaryItemAlertSystem, \"setUpFunction\", SkinLegendaryItemAlert)\n\n\tlocal function SkinLootWonAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 1, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -5, 6)\n\t\tend\n\n\t\tframe.Background:Kill()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe.BGAtlas:Kill()\n\t\tframe.PvPBackground:Kill()\n\t\tframe.RatedPvPBackground:Kill()\n\n\t\tlocal lootItem = frame.lootItem\n\t\tlootItem.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tlootItem.Icon:SetDrawLayer(\"BORDER\")\n\t\tlootItem.Icon:ClearAllPoints()\n\t\tlootItem.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\t\tlootItem.IconBorder:Kill()\n\t\tlootItem.SpecRing:SetTexture(\"\")\n\n\t\t-- Icon border\n\t\tif not lootItem.Icon.b then\n\t\t\tlootItem.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tlootItem.Icon.b:SetTemplate(\"Default\")\n\t\t\tlootItem.Icon.b:SetPoint(\"TOPLEFT\", lootItem.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tlootItem.Icon.b:SetPoint(\"BOTTOMRIGHT\", lootItem.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tlootItem.Icon:SetParent(lootItem.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(LootAlertSystem, \"setUpFunction\", SkinLootWonAlert)\n\n\tlocal function SkinLootUpgradeAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 1, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -5, 6)\n\t\tend\n\n\t\tframe.Background:Kill()\n\t\tframe.BaseQualityBorder:Kill()\n\t\tframe.UpgradeQualityBorder:Kill()\n\t\tframe.BorderGlow:Kill()\n\t\tframe.Sheen:Kill()\n\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:SetDrawLayer(\"BORDER\", 5)\n\t\tframe.Icon:ClearAllPoints()\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetFrameLevel(1)\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(LootUpgradeAlertSystem, \"setUpFunction\", SkinLootUpgradeAlert)\n\n\tlocal function SkinMoneyWonAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -13, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 9, 6)\n\t\tend\n\n\t\tframe.Background:Kill()\n\t\tframe.IconBorder:Kill()\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\tframe.Label:ClearAllPoints()\n\t\tframe.Label:SetPoint(\"CENTER\", frame.backdrop, 0, 10)\n\n\t\tframe.Amount:ClearAllPoints()\n\t\tframe.Amount:SetPoint(\"CENTER\", frame.backdrop, 0, -10)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(MoneyWonAlertSystem, \"setUpFunction\", SkinMoneyWonAlert)\n\n\tlocal function SkinHonorAwardedAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -12, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 9, 6)\n\t\tend\n\n\t\tframe.Background:Kill()\n\t\tframe.IconBorder:Kill()\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\tframe.Label:ClearAllPoints()\n\t\tframe.Label:SetPoint(\"CENTER\", frame.backdrop, 0, 10)\n\n\t\tframe.Amount:ClearAllPoints()\n\t\tframe.Amount:SetPoint(\"CENTER\", frame.backdrop, 0, -10)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(HonorAwardedAlertSystem, \"setUpFunction\", SkinHonorAwardedAlert)\n\n\tlocal function SkinEntitlementDeliveredAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 10, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -14, 6)\n\t\tend\n\n\t\t-- Background\n\t\tframe.Background:Kill()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\n\t\t-- Icon\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:ClearAllPoints()\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(EntitlementDeliveredAlertSystem, \"setUpFunction\", SkinEntitlementDeliveredAlert)\n\n\tlocal function SkinRafRewardDeliveredAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 10, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -14, 6)\n\t\tend\n\n\t\t-- Background\n\t\tframe.StandardBackground:Kill()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\n\t\t-- Icon\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:ClearAllPoints()\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\n\thooksecurefunc(RafRewardDeliveredAlertSystem, \"setUpFunction\", SkinRafRewardDeliveredAlert)\n\n\tlocal function SkinDigsiteCompleteAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -17, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 13, 6)\n\t\tend\n\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe:GetRegions():Hide()\n\t\tframe.DigsiteTypeTexture:SetPoint(\"LEFT\", -10, -14)\n\tend\n\n\thooksecurefunc(DigsiteCompleteAlertSystem, \"setUpFunction\", SkinDigsiteCompleteAlert)\n\n\tlocal function SkinNewRecipeLearnedAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 19, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -23, 6)\n\t\tend\n\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\t\tframe:GetRegions():Hide()\n\n\t\tframe.Icon:SetMask(\"\")\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:SetDrawLayer(\"BORDER\", 5)\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\t\tframe.Icon:SetSize(50, 50)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(NewRecipeLearnedAlertSystem, \"setUpFunction\", SkinNewRecipeLearnedAlert)\n\n\tlocal function SkinNewPetMountAlert(frame)\n\t\tframe:SetAlpha(1)\n\t\tif not frame.hooked then\n\t\t\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\t\t\tframe.hooked = true\n\t\tend\n\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 1, -6)\n\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -5, 6)\n\t\tend\n\n\t\tframe.Background:Kill()\n\t\tframe.IconBorder:Kill()\n\t\tframe.glow:Kill()\n\t\tframe.shine:Kill()\n\n\t\tframe.Icon:SetMask(\"\")\n\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.Icon:SetDrawLayer(\"BORDER\", 5)\n\t\tframe.Icon:SetPoint(\"LEFT\", frame.backdrop, 9, 0)\n\n\t\t-- Icon border\n\t\tif not frame.Icon.b then\n\t\t\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.Icon.b:SetTemplate(\"Default\")\n\t\t\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tframe.Icon:SetParent(frame.Icon.b)\n\t\tend\n\tend\n\thooksecurefunc(NewPetAlertSystem, \"setUpFunction\", SkinNewPetMountAlert)\n\thooksecurefunc(NewMountAlertSystem, \"setUpFunction\", SkinNewPetMountAlert)\n\thooksecurefunc(NewToyAlertSystem, \"setUpFunction\", SkinNewPetMountAlert)\n\thooksecurefunc(NewRuneforgePowerAlertSystem, \"setUpFunction\", SkinNewPetMountAlert)\n\thooksecurefunc(NewCosmeticAlertFrameSystem, \"setUpFunction\", SkinNewPetMountAlert)\n\n\thooksecurefunc(\"StandardRewardAlertFrame_AdjustRewardAnchors\", function(frame)\n\t\tif frame.RewardFrames then\n\t\t\tfor _, button in next, frame.RewardFrames do\n\t\t\t\tif not button.isSkinned then\n\t\t\t\t\tlocal icon, ring = button:GetRegions()\n\t\t\t\t\ticon:SetSize(18, 18)\n\t\t\t\t\ticon:SkinIcon(true)\n\t\t\t\t\tring:Hide()\n\t\t\t\t\tbutton.isSkinned = true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Bonus Roll Money\n\tlocal frame = BonusRollMoneyWonFrame\n\tframe:SetAlpha(1)\n\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\tframe.Background:Kill()\n\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tframe.IconBorder:Kill()\n\t-- Icon border\n\tframe.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\tframe.Icon.b:SetTemplate(\"Default\")\n\tframe.Icon.b:SetPoint(\"TOPLEFT\", frame.Icon, \"TOPLEFT\", -2, 2)\n\tframe.Icon.b:SetPoint(\"BOTTOMRIGHT\", frame.Icon, \"BOTTOMRIGHT\", 2, -2)\n\tframe.Icon:SetParent(frame.Icon.b)\n\t-- Create Backdrop\n\tframe:CreateBackdrop(\"Transparent\")\n\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -9, 6)\n\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 5, -6)\n\n\t-- Bonus Roll Loot\n\tframe = BonusRollLootWonFrame\n\tframe:SetAlpha(1)\n\thooksecurefunc(frame, \"SetAlpha\", forceAlpha)\n\tframe.Background:Kill()\n\tframe.glow:Kill()\n\tframe.shine:Kill()\n\n\tlocal lootItem = frame.lootItem\n\tlootItem.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tlootItem.IconBorder:SetAlpha(0)\n\t-- Icon border\n\tlootItem.Icon.b = CreateFrame(\"Frame\", nil, frame)\n\tlootItem.Icon.b:SetTemplate(\"Default\")\n\tlootItem.Icon.b:SetFrameLevel(1)\n\tlootItem.Icon.b:SetPoint(\"TOPLEFT\", lootItem.Icon, \"TOPLEFT\", -2, 2)\n\tlootItem.Icon.b:SetPoint(\"BOTTOMRIGHT\", lootItem.Icon, \"BOTTOMRIGHT\", 2, -2)\n\tlootItem.Icon:SetParent(lootItem.Icon.b)\n\t-- Create Backdrop\n\tframe:CreateBackdrop(\"Transparent\")\n\tframe.backdrop:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -9, 6)\n\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 5, -6)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/AlliedRaces.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAlliedRacesUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tAlliedRacesFrame:StripTextures()\n\tAlliedRacesFrame:SetTemplate(\"Transparent\")\n\n\tAlliedRacesFramePortrait:SetAlpha(0)\n\n\tAlliedRacesFrame.ModelFrame:StripTextures()\n\tAlliedRacesFrame.ModelFrame:CreateBackdrop(\"Transparent\")\n\tAlliedRacesFrame.ModelFrame.backdrop:SetFrameLevel(1)\n\tAlliedRacesFrame.ModelFrame.backdrop:SetPoint(\"TOPLEFT\", -2, 2)\n\tAlliedRacesFrame.ModelFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -2)\n\n\tAlliedRacesFrame.ModelFrame:SetSize(313, 575)\n\tAlliedRacesFrame.ModelFrame:SetPoint(\"LEFT\", 10, -6)\n\n\tlocal scrollFrame = AlliedRacesFrame.RaceInfoFrame.ScrollFrame\n\tscrollFrame.ScrollBar.Border:Hide()\n\tscrollFrame.ScrollBar.ScrollUpBorder:Hide()\n\tscrollFrame.ScrollBar.ScrollDownBorder:Hide()\n\tscrollFrame.ScrollBar.Track:Hide()\n\n\tAlliedRacesFrame.RaceInfoFrame.AlliedRacesRaceName:SetTextColor(1, .8, 0)\n\tscrollFrame.Child.RaceDescriptionText:SetTextColor(1, 1, 1)\n\tscrollFrame.Child.RacialTraitsLabel:SetTextColor(1, .8, 0)\n\n\tscrollFrame.Child.ObjectivesFrame:StripTextures()\n\tscrollFrame.Child.ObjectivesFrame:CreateBackdrop(\"Overlay\")\n\n\tAlliedRacesFrame:HookScript(\"OnShow\", function(self)\n\t\tfor button in self.abilityPool:EnumerateActive() do\n\t\t\tselect(3, button:GetRegions()):Hide()\n\t\t\tbutton.Icon:SkinIcon()\n\t\t\tbutton.Text:SetTextColor(1, 1, 1)\n\t\tend\n\tend)\n\n\tT.SkinScrollBar(scrollFrame.ScrollBar)\n\tT.SkinCloseButton(AlliedRacesFrameCloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_AlliedRacesUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/AnimaDiversion.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAnima Diversion skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = AnimaDiversionFrame\n\tT.SkinCloseButton(frame.CloseButton)\n\n\tframe:StripTextures()\n\tframe:CreateBackdrop(\"Transparent\")\n\n\tframe.AnimaDiversionCurrencyFrame.Background:SetAlpha(0)\n\tframe.ReinforceInfoFrame.AnimaNodeReinforceButton:SkinButton()\n\n\thooksecurefunc(AnimaDiversionFrame, \"SetupCurrencyFrame\", function()\n\t\tlocal cur = AnimaDiversionFrame.AnimaDiversionCurrencyFrame.CurrencyFrame.Quantity\n\n\t\tlocal text = cur and cur:GetText()\n\t\tif not text or text == '' then return end\n\t\tlocal new, count = gsub(text, \"|T([^:]-):[%d+:]+|t\", \"|T%1:14:14:0:0:64:64:5:59:5:59|t\")\n\t\tif count > 0 then cur:SetFormattedText(\"%s\", new) end\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_AnimaDiversionUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Archeology.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tArchaeologyUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tArchaeologyFrame:StripTextures(true)\n\tArchaeologyFrame:SetTemplate(\"Transparent\")\n\tArchaeologyFramePortrait:SetAlpha(0)\n\n\tArchaeologyFrameArtifactPageSolveFrameSolveButton:SkinButton(true)\n\tArchaeologyFrameArtifactPageBackButton:SkinButton(true)\n\tT.SkinDropDownBox(ArchaeologyFrameRaceFilter)\n\n\tArchaeologyFrameRankBar:StripTextures()\n\tArchaeologyFrameRankBar:SetStatusBarTexture(C.media.texture)\n\tArchaeologyFrameRankBar:CreateBackdrop(\"Overlay\")\n\n\tArchaeologyFrameArtifactPageSolveFrameStatusBar:StripTextures()\n\tArchaeologyFrameArtifactPageSolveFrameStatusBar:SetStatusBarTexture(C.media.texture)\n\tArchaeologyFrameArtifactPageSolveFrameStatusBar:SetStatusBarColor(0.7, 0.2, 0)\n\tArchaeologyFrameArtifactPageSolveFrameStatusBar:CreateBackdrop(\"Overlay\")\n\n\tfor i = 1, ARCHAEOLOGY_MAX_COMPLETED_SHOWN do\n\t\tlocal artifact = _G[\"ArchaeologyFrameCompletedPageArtifact\"..i]\n\n\t\tif artifact then\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Border\"]:Kill()\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Bg\"]:Kill()\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"]:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"].backdrop = CreateFrame(\"Frame\", nil, artifact)\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"].backdrop:SetTemplate(\"Default\")\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"].backdrop:SetPoint(\"TOPLEFT\", _G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"], \"TOPLEFT\", -2, 2)\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"].backdrop:SetPoint(\"BOTTOMRIGHT\", _G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"], \"BOTTOMRIGHT\", 2, -2)\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"].backdrop:SetFrameLevel(artifact:GetFrameLevel() - 2)\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"Icon\"]:SetDrawLayer(\"OVERLAY\")\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"ArtifactName\"]:SetTextColor(1, 0.8, 0)\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"ArtifactName\"]:SetShadowOffset(1, -1)\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"ArtifactSubText\"]:SetTextColor(0.6, 0.6, 0.6)\n\t\t\t_G[\"ArchaeologyFrameCompletedPageArtifact\"..i..\"ArtifactSubText\"]:SetShadowOffset(1, -1)\n\t\tend\n\tend\n\n\tfor i = 1, ARCHAEOLOGY_MAX_RACES do\n\t\tlocal frame = _G[\"ArchaeologyFrameSummaryPageRace\"..i]\n\n\t\tif frame then\n\t\t\tframe.raceName:SetTextColor(1, 1, 1)\n\t\t\tframe.raceName:SetShadowOffset(1, -1)\n\t\tend\n\tend\n\n\tfor i = 1, ArchaeologyFrameCompletedPage:GetNumRegions() do\n\t\tlocal region = select(i, ArchaeologyFrameCompletedPage:GetRegions())\n\t\tif region:GetObjectType() == \"FontString\" then\n\t\t\tregion:SetTextColor(1, 0.8, 0)\n\t\t\tregion:SetShadowColor(0, 0, 0)\n\t\t\tregion:SetShadowOffset(1, -1)\n\t\tend\n\tend\n\n\tfor i = 1, ArchaeologyFrameSummaryPage:GetNumRegions() do\n\t\tlocal region = select(i, ArchaeologyFrameSummaryPage:GetRegions())\n\t\tif region:GetObjectType() == \"FontString\" then\n\t\t\tregion:SetTextColor(1, 0.8, 0)\n\t\t\tregion:SetShadowColor(0, 0, 0)\n\t\t\tregion:SetShadowOffset(1, -1)\n\t\tend\n\tend\n\n\tArchaeologyFrameCompletedPage.infoText:SetTextColor(1, 1, 1)\n\tArchaeologyFrameHelpPageTitle:SetTextColor(1, 0.8, 0)\n\tArchaeologyFrameHelpPageTitle:SetShadowColor(0, 0, 0)\n\tArchaeologyFrameHelpPageTitle:SetShadowOffset(1, -1)\n\tArchaeologyFrameHelpPageDigTitle:SetTextColor(1, 0.8, 0)\n\tArchaeologyFrameHelpPageDigTitle:SetShadowColor(0, 0, 0)\n\tArchaeologyFrameHelpPageDigTitle:SetShadowOffset(1, -1)\n\tArchaeologyFrameHelpPageHelpScrollHelpText:SetTextColor(1, 1, 1)\n\n\tArchaeologyFrameArtifactPageHistoryTitle:SetTextColor(1, 0.8, 0)\n\n\tArchaeologyFrameArtifactPageIcon:SkinIcon(true)\n\n\tArchaeologyFrameArtifactPageHistoryScrollChildText:SetTextColor(1, 1, 1)\n\tT.SkinCloseButton(ArchaeologyFrameCloseButton)\n\tT.SkinNextPrevButton(ArchaeologyFrameCompletedPageNextPageButton, nil, \"Any\")\n\tT.SkinNextPrevButton(ArchaeologyFrameCompletedPagePrevPageButton, nil, \"Any\")\n\tT.SkinNextPrevButton(ArchaeologyFrameSummaryPageNextPageButton, nil, \"Any\")\n\tT.SkinNextPrevButton(ArchaeologyFrameSummaryPagePrevPageButton, nil, \"Any\")\n\n\tT.SkinScrollBar(ArchaeologyFrameArtifactPageHistoryScrollScrollBar)\n\n\tArchaeologyFrameInfoButton:SetPoint(\"TOPLEFT\", ArchaeologyFrame, 4, -4)\n\n\t-- Archaeology progress bar (by Haleth)\n\tlocal frame = ArcheologyDigsiteProgressBar\n\tlocal bar = frame.FillBar\n\n\tframe.Shadow:Hide()\n\tframe.BarBackground:Hide()\n\tframe.BarBorderAndOverlay:Hide()\n\n\tframe.BarTitle:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tframe.BarTitle:SetPoint(\"CENTER\", 0, 13)\n\n\tbar:SetWidth(150)\n\tframe.Flash:SetWidth(172)\n\n\tbar:SetStatusBarTexture(C.media.texture)\n\tbar:SetStatusBarColor(unpack(C.media.classborder_color))\n\n\tbar:CreateBackdrop(\"Overlay\")\nend\n\nT.SkinFuncs[\"Blizzard_ArchaeologyUI\"] = LoadSkin\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Artifact.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tArtifactUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tArtifactFrame:StripTextures()\n\tArtifactFrame:CreateBackdrop(\"Transparent\")\n\tArtifactFrame.BorderFrame:StripTextures()\n\n\tfor i = 1, 2 do\n\t\tT.SkinTab(_G[\"ArtifactFrameTab\" .. i])\n\tend\n\tArtifactFrameTab1:ClearAllPoints()\n\tArtifactFrameTab1:SetPoint(\"TOPLEFT\", ArtifactFrame, \"BOTTOMLEFT\", 0, -2)\n\n\tArtifactFrame.ForgeBadgeFrame.ItemIcon:Hide()\n\tArtifactFrame.ForgeBadgeFrame.ForgeLevelBackground:ClearAllPoints()\n\tArtifactFrame.ForgeBadgeFrame.ForgeLevelBackground:SetPoint(\"TOPLEFT\", ArtifactFrame)\n\n\tT.SkinCloseButton(ArtifactFrame.CloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_ArtifactUI\"] = LoadSkin\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Auction.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAuctionUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tAuctionHouseFrame:StripTextures()\n\tAuctionHouseFrame:SetTemplate(\"Transparent\")\n\tAuctionHouseFramePortrait:SetAlpha(0)\n\n\tAuctionHouseFrame.MoneyFrameBorder:StripTextures()\n\tAuctionHouseFrame.MoneyFrameInset:StripTextures()\n\n\tT.SkinCloseButton(AuctionHouseFrameCloseButton)\n\n\tAuctionHouseFrame.SearchBar.FavoritesSearchButton:SetSize(22, 22)\n\tT.SkinEditBox(AuctionHouseFrame.SearchBar.SearchBox, nil, 18)\n\tT.SkinCloseButton(AuctionHouseFrame.SearchBar.FilterButton.ClearFiltersButton)\n\tAuctionHouseFrame.SearchBar.FilterButton.ClearFiltersButton:SetPoint(\"TOPRIGHT\", 3, 6)\n\n\tlocal function SkinEditBoxes(Frame)\n\t\tT.SkinEditBox(Frame.MinLevel)\n\t\tT.SkinEditBox(Frame.MaxLevel)\n\t\tFrame.MinLevel.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, 0)\n\t\tFrame.MaxLevel.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, 0)\n\tend\n\n\tSkinEditBoxes(AuctionHouseFrame.SearchBar.FilterButton.LevelRangeFrame)\n\n\tlocal buttons = {\n\t\tAuctionHouseFrame.SearchBar.SearchButton,\n\t\tAuctionHouseFrame.SearchBar.FilterButton,\n\t\tAuctionHouseFrame.SearchBar.FavoritesSearchButton,\n\t\tAuctionHouseFrame.ItemSellFrame.QuantityInput.MaxButton,\n\t\tAuctionHouseFrame.ItemSellFrame.PostButton,\n\t\tAuctionHouseFrame.CommoditiesSellFrame.PostButton,\n\t\tAuctionHouseFrame.CommoditiesSellFrame.QuantityInput.MaxButton,\n\t\tAuctionHouseFrameAuctionsFrame.CancelAuctionButton,\n\t\tAuctionHouseFrameAuctionsFrame.BidFrame.BidButton,\n\t\tAuctionHouseFrameAuctionsFrame.BuyoutFrame.BuyoutButton,\n\t\tAuctionHouseFrame.ItemBuyFrame.BackButton,\n\t\tAuctionHouseFrame.ItemBuyFrame.BidFrame.BidButton,\n\t\tAuctionHouseFrame.ItemBuyFrame.BuyoutFrame.BuyoutButton,\n\t\tAuctionHouseFrame.BuyDialog.BuyNowButton,\n\t\tAuctionHouseFrame.BuyDialog.CancelButton,\n\t\tAuctionHouseFrame.WoWTokenResults.Buyout,\n\t\tAuctionHouseFrame.WoWTokenResults.GameTimeTutorial.RightDisplay.StoreButton\n\t}\n\n\tfor i = 1, #buttons do\n\t\tbuttons[i]:SkinButton()\n\tend\n\n\tlocal scrollbars = {\n\t\tAuctionHouseFrame.CategoriesList.ScrollBar,\n\t\tAuctionHouseFrame.CommoditiesBuyFrame.ItemList.ScrollBar,\n\t\tAuctionHouseFrameAuctionsFrame.SummaryList.ScrollBar,\n\t\tAuctionHouseFrame.WoWTokenResults.DummyScrollBar\n\t}\n\n\tfor i = 1, #scrollbars do\n\t\tT.SkinScrollBar(scrollbars[i])\n\tend\n\n\tlocal tabs = {\n\t\tAuctionHouseFrameBuyTab,\n\t\tAuctionHouseFrameSellTab,\n\t\tAuctionHouseFrameAuctionsTab\n\t}\n\n\tfor _, tab in pairs(tabs) do\n\t\tif tab then\n\t\t\tT.SkinTab(tab)\n\t\tend\n\tend\n\n\tAuctionHouseFrame:HookScript(\"OnShow\", function()\n\t\tif AuctionFrameTab4 and not AuctionFrameTab4.styled then\n\t\t\tT.SkinTab(AuctionFrameTab4)\n\t\t\tAuctionFrameTab4.styled = true\n\t\tend\n\tend)\n\n\tT.SkinTab(AuctionHouseFrameAuctionsFrameAuctionsTab, true)\n\tT.SkinTab(AuctionHouseFrameAuctionsFrameBidsTab, true)\n\n\tAuctionHouseFrameBuyTab:ClearAllPoints()\n\tAuctionHouseFrameBuyTab:SetPoint(\"BOTTOMLEFT\", AuctionHouseFrame, \"BOTTOMLEFT\", 0, -32)\n\n\tAuctionHouseFrame.CategoriesList:StripTextures()\n\n\thooksecurefunc(\"AuctionHouseFilterButton_SetUp\", function(button, info)\n\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", button.SelectedTexture, \"TOPLEFT\", 1, -1)\n\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", button.SelectedTexture, \"BOTTOMRIGHT\", -1, 1)\n\n\t\tbutton.NormalTexture:SetAlpha(0)\n\t\tbutton.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.2)\n\t\tbutton.HighlightTexture:SetColorTexture(1, 1, 1, 0.2)\n\tend)\n\n\tlocal function SkinListIcon(frame)\n\t\tif not frame.tableBuilder then return end\n\n\t\tfor i = 1, 22 do\n\t\t\tlocal row = frame.tableBuilder.rows[i]\n\t\t\tif row then\n\t\t\t\tfor j = 1, 4 do\n\t\t\t\t\tlocal cell = row.cells and row.cells[j]\n\t\t\t\t\tif cell and cell.Icon then\n\t\t\t\t\t\tif not cell.IsSkinned then\n\t\t\t\t\t\t\tcell.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\t\t\tif cell.IconBorder then cell.IconBorder:SetAlpha(0) end\n\n\t\t\t\t\t\t\tcell.IsSkinned = true\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal function SkinHeaders(frame)\n\t\tlocal maxHeaders = frame.HeaderContainer:GetNumChildren()\n\t\tfor i = 1, maxHeaders do\n\t\t\tlocal header = select(i, frame.HeaderContainer:GetChildren())\n\t\t\tif header and not header.IsSkinned then\n\t\t\t\theader:DisableDrawLayer(\"BACKGROUND\")\n\t\t\t\theader:GetHighlightTexture():Hide()\n\t\t\t\theader:CreateBackdrop(\"Overlay\")\n\t\t\t\theader.backdrop:SetPoint(\"TOPLEFT\", 2, 0)\n\t\t\t\theader.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\n\t\t\t\theader.IsSkinned = true\n\t\t\tend\n\t\tend\n\n\t\tSkinListIcon(frame)\n\tend\n\n\thooksecurefunc(AuctionHouseFrameAuctionsFrame.SummaryList.ScrollBox, \"Update\", function(frame)\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not button.styled then\n\t\t\t\tif button.Icon then\n\t\t\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\t if button.IconBorder then\n\t\t\t\t\t\tbutton.IconBorder:SetAlpha(0)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tbutton.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal function SkinAuctionFrame(frame, scroll)\n\t\tframe:StripTextures()\n\t\tframe.RefreshFrame.RefreshButton:SkinButton()\n\t\tframe.RefreshFrame.RefreshButton:SetSize(24, 24)\n\t\tT.SkinScrollBar(frame.ScrollBar)\n\t\tif scroll then\n\t\t\tframe.ScrollBar:SetPoint(\"BOTTOMLEFT\", frame, \"BOTTOMRIGHT\", 4, 15)\n\t\tend\n\t\thooksecurefunc(frame, \"RefreshScrollFrame\", SkinHeaders)\n\tend\n\n\tSkinAuctionFrame(AuctionHouseFrame.BrowseResultsFrame.ItemList)\n\tSkinAuctionFrame(AuctionHouseFrame.ItemBuyFrame.ItemList, true)\n\tSkinAuctionFrame(AuctionHouseFrame.ItemSellList)\n\tSkinAuctionFrame(AuctionHouseFrame.CommoditiesSellList)\n\tSkinAuctionFrame(AuctionHouseFrameAuctionsFrame.ItemList)\n\tSkinAuctionFrame(AuctionHouseFrameAuctionsFrame.AllAuctionsList, true)\n\tSkinAuctionFrame(AuctionHouseFrameAuctionsFrame.BidsList, true)\n\tSkinAuctionFrame(AuctionHouseFrameAuctionsFrame.CommoditiesList, true)\n\n\tlocal function SkinItemIcon(frame, nostrip)\n\t\tif not nostrip then frame:StripTextures() end\n\t\tif frame.IconMask then frame.IconMask:Hide() end\n\t\tif frame.CircleMask then frame.CircleMask:Hide() end\n\t\tif frame.IconBorder then frame.IconBorder:SetAlpha(0) end\n\t\tframe.Icon:SkinIcon()\n\tend\n\n\tAuctionHouseFrame.ItemBuyFrame.ItemDisplay:StripTextures()\n\tSkinItemIcon(AuctionHouseFrame.ItemBuyFrame.ItemDisplay.ItemButton)\n\tT.SkinEditBox(AuctionHouseFrameGold)\n\tT.SkinEditBox(AuctionHouseFrameSilver)\n\n\tlocal buyFrame = AuctionHouseFrame.CommoditiesBuyFrame\n\tbuyFrame.BackButton:SkinButton()\n\tbuyFrame.BuyDisplay.BuyButton:SkinButton()\n\tbuyFrame.ItemList.RefreshFrame.RefreshButton:SkinButton()\n\tbuyFrame.ItemList.RefreshFrame.RefreshButton:SetSize(24, 24)\n\n\tbuyFrame.BuyDisplay:StripTextures()\n\tbuyFrame.ItemList:StripTextures()\n\n\tbuyFrame.BuyDisplay.QuantityInput.InputBox:DisableDrawLayer(\"BACKGROUND\")\n\tbuyFrame.BuyDisplay.QuantityInput.InputBox:CreateBackdrop(\"Overlay\")\n\tbuyFrame.BuyDisplay.QuantityInput.InputBox.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\tbuyFrame.BuyDisplay.QuantityInput.InputBox.backdrop:SetPoint(\"BOTTOMRIGHT\", -20, 6)\n\n\tlocal itemDisplay = buyFrame.BuyDisplay.ItemDisplay\n\titemDisplay:StripTextures()\n\titemDisplay.ItemButton.Icon:SkinIcon()\n\titemDisplay.ItemButton.CircleMask:Hide()\n\titemDisplay.ItemButton.IconBorder:SetAlpha(0)\n\n\tlocal function SkinMoneyBox(frame)\n\t\tframe:DisableDrawLayer(\"BACKGROUND\")\n\t\tframe:CreateBackdrop(\"Overlay\")\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 6, -2)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -22, 6)\n\tend\n\n\tfor _, frame in pairs({AuctionHouseFrame.ItemSellFrame, AuctionHouseFrame.CommoditiesSellFrame}) do\n\t\tframe:StripTextures()\n\t\tframe.ItemDisplay:StripTextures()\n\n\t\tSkinItemIcon(frame.ItemDisplay.ItemButton)\n\n\t\tSkinMoneyBox(frame.PriceInput.MoneyInputFrame.GoldBox)\n\t\tSkinMoneyBox(frame.PriceInput.MoneyInputFrame.SilverBox)\n\t\tSkinMoneyBox(frame.QuantityInput.InputBox)\n\t\tif frame.SecondaryPriceInput then\n\t\t\tSkinMoneyBox(frame.SecondaryPriceInput.MoneyInputFrame.GoldBox)\n\t\t\tSkinMoneyBox(frame.SecondaryPriceInput.MoneyInputFrame.SilverBox)\n\t\tend\n\n\t\tT.SkinDropDownBox(frame.DurationDropDown.DropDown)\n\t\tframe.DurationDropDown.DropDown.backdrop:SetPoint(\"TOPLEFT\", 20, -1)\n\tend\n\n\tT.SkinCheckBox(AuctionHouseFrame.ItemSellFrame.BuyoutModeCheckButton, 25)\n\n\tAuctionHouseFrameAuctionsFrame.SummaryList:StripTextures()\n\tAuctionHouseFrameAuctionsFrame.ItemDisplay:StripTextures()\n\n\tSkinItemIcon(AuctionHouseFrameAuctionsFrame.ItemDisplay.ItemButton)\n\n\tT.SkinEditBox(AuctionHouseFrameAuctionsFrameGold)\n\tT.SkinEditBox(AuctionHouseFrameAuctionsFrameSilver)\n\n\tAuctionHouseFrame.BuyDialog:StripTextures()\n\tAuctionHouseFrame.BuyDialog:SetTemplate(\"Transparent\")\n\n\t-- WoW Token\n\tAuctionHouseFrame.WoWTokenResults:StripTextures()\n\tAuctionHouseFrame.WoWTokenResults.TokenDisplay:StripTextures()\n\tSkinItemIcon(AuctionHouseFrame.WoWTokenResults.TokenDisplay.ItemButton, true)\n\n\tlocal TokenTutorial = AuctionHouseFrame.WoWTokenResults.GameTimeTutorial\n\tTokenTutorial.NineSlice:Hide()\n\tTokenTutorial:CreateBackdrop(\"Transparent\")\n\tT.SkinCloseButton(TokenTutorial.CloseButton)\n\tTokenTutorial.Bg:SetAlpha(0)\n\n\t-- Auctionator skin (from AddOnSkins)\n\tif IsAddOnLoaded(\"Auctionator\") then\n\t\tC_Timer.After(0.05, function()\n\t\t\tlocal list = _G.AuctionatorShoppingFrame\n\t\t\tif not list then return end\n\n\t\t\tlocal config = _G.AuctionatorConfigFrame\n\t\t\tlocal selling = _G.AuctionatorSellingFrame\n\t\t\tlocal cancelling = _G.AuctionatorCancellingFrame\n\n\t\t\tT.SkinTab(AuctionatorTabs_Shopping)\n\t\t\tT.SkinTab(AuctionatorTabs_Selling)\n\t\t\tT.SkinTab(AuctionatorTabs_Cancelling)\n\t\t\tT.SkinTab(AuctionatorTabs_Auctionator)\n\n\t\t\tlocal frames = {\n\t\t\t\tlist.ScrollListRecents,\n\t\t\t\tlist.ScrollListShoppingList,\n\t\t\t\tlist.ShoppingResultsInset,\n\t\t\t\tselling.CurrentItemInset,\n\t\t\t\tselling.HistoricalPriceInset,\n\t\t\t\tselling.BagInset,\n\t\t\t\tselling.BagListing.ScrollFrame,\n\t\t\t\tcancelling.HistoricalPriceInset,\n\t\t\t\tAuctionatorConfigFrame\n\t\t\t}\n\n\t\t\tfor i = 1, #frames do\n\t\t\t\tif frames[i] then\n\t\t\t\t\tframes[i]:StripTextures()\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal buttons = {\n\t\t\t\tlist.AddItem,\n\t\t\t\tlist.ManualSearch,\n\t\t\t\tlist.SortItems,\n\t\t\t\tlist.Export,\n\t\t\t\tlist.Import,\n\t\t\t\tlist.ExportCSV,\n\t\t\t\tlist.OneItemSearch.SearchButton,\n\t\t\t\tlist.OneItemSearch.ExtendedButton,\n\t\t\t\tselling.SaleItemFrame.MaxButton,\n\t\t\t\tselling.SaleItemFrame.PostButton,\n\t\t\t\tconfig.OptionsButton,\n\t\t\t\tconfig.ScanButton\n\t\t\t}\n\n\t\t\tfor i = 1, #buttons do\n\t\t\t\tif buttons[i] then\n\t\t\t\t\tbuttons[i]:SkinButton()\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlist.ManualSearch:SetPoint(\"TOPRIGHT\", list.ScrollListShoppingList, \"BOTTOMRIGHT\", -7, -4)\n\n\t\t\tlocal scrollbars = {\n\t\t\t\tlist.ScrollListShoppingList.ScrollBar,\n\t\t\t\tlist.ScrollListRecents.ScrollBar,\n\t\t\t\tlist.ResultsListing.ScrollArea.ScrollBar,\n\t\t\t\tselling.CurrentPricesListing.ScrollArea.ScrollBar,\n\t\t\t\tselling.HistoricalPriceListing.ScrollArea.ScrollBar,\n\t\t\t\tselling.BagListing.ScrollBar,\n\t\t\t\tselling.ResultsListing.ScrollArea.ScrollBar,\n\t\t\t\tcancelling.ResultsListing.ScrollArea.ScrollBar\n\t\t\t}\n\n\t\t\tfor i = 1, #scrollbars do\n\t\t\t\tT.SkinScrollBar(scrollbars[i])\n\t\t\tend\n\n\t\t\tlocal editboxes = {\n\t\t\t\tselling.SaleItemFrame.Price.MoneyInput.GoldBox,\n\t\t\t\tselling.SaleItemFrame.Price.MoneyInput.SilverBox,\n\t\t\t\tselling.SaleItemFrame.Price.MoneyInput.CopperBox\n\t\t\t}\n\n\t\t\tfor i = 1, #editboxes do\n\t\t\t\teditboxes[i]:DisableDrawLayer(\"BACKGROUND\")\n\t\t\t\teditboxes[i]:CreateBackdrop(\"Overlay\")\n\t\t\t\teditboxes[i].backdrop:SetPoint(\"TOPLEFT\", 6, -2)\n\t\t\t\teditboxes[i].backdrop:SetPoint(\"BOTTOMRIGHT\", -22, 6)\n\t\t\tend\n\n\t\t\tlocal editboxes = {\n\t\t\t\tlist.OneItemSearch.SearchBox,\n\t\t\t\tselling.SaleItemFrame.Quantity.InputBox,\n\t\t\t\tconfig.DiscordLink.InputBox,\n\t\t\t\tconfig.BugReportLink.InputBox,\n\t\t\t\tcancelling.SearchFilter\n\t\t\t}\n\n\t\t\tfor i = 1, #editboxes do\n\t\t\t\tT.SkinEditBox(editboxes[i])\n\t\t\tend\n\t\t\tselling.SaleItemFrame.Quantity.InputBox.backdrop:SetPoint(\"TOPLEFT\", 2, 4)\n\t\t\tselling.SaleItemFrame.Quantity.InputBox.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\tlocal function SkinHeaders(frame)\n\t\t\t\tlocal maxHeaders = frame:GetNumChildren()\n\t\t\t\tfor i = 1, maxHeaders do\n\t\t\t\t\tlocal header = select(i, frame:GetChildren())\n\t\t\t\t\tif header and not header.IsSkinned then\n\t\t\t\t\t\theader:DisableDrawLayer(\"BACKGROUND\")\n\t\t\t\t\t\theader:GetHighlightTexture():Hide()\n\t\t\t\t\t\theader:CreateBackdrop(\"Overlay\")\n\t\t\t\t\t\theader.backdrop:SetPoint(\"TOPLEFT\", 2, 0)\n\t\t\t\t\t\theader.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\n\t\t\t\t\t\theader.IsSkinned = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal headers = {\n\t\t\t\tlist.ResultsListing.HeaderContainer,\n\t\t\t\tcancelling.ResultsListing.HeaderContainer,\n\t\t\t\tselling.CurrentPricesListing.HeaderContainer,\n\t\t\t\tselling.HistoricalPriceListing.HeaderContainer,\n\t\t\t\tselling.ResultsListing.HeaderContainer\n\t\t\t}\n\n\t\t\tfor i = 1, #headers do\n\t\t\t\tSkinHeaders(headers[i])\n\t\t\tend\n\n\t\t\tT.SkinDropDownBox(list.ListDropdown, 230)\n\t\t\tlist.OneItemSearch.SearchButton:SetPoint(\"TOPLEFT\", list.OneItemSearch.SearchBox, \"TOPRIGHT\", 5, 1)\n\n\t\t\tlocal tabs = {\n\t\t\t\tlist.RecentsTabsContainer.ListTab,\n\t\t\t\tlist.RecentsTabsContainer.RecentsTab,\n\t\t\t\tselling.PricesTabsContainer.CurrentPricesTab,\n\t\t\t\tselling.PricesTabsContainer.PriceHistoryTab,\n\t\t\t\tselling.PricesTabsContainer.YourHistoryTab,\n\t\t\t}\n\n\t\t\tfor i = 1, #tabs do\n\t\t\t\tlocal tab = tabs[i]\n\t\t\t\ttab:DisableDrawLayer(\"BACKGROUND\")\n\t\t\t\ttab:StripTextures()\n\t\t\t\ttab.backdrop = CreateFrame(\"Frame\", nil, tab)\n\t\t\t\ttab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)\n\t\t\t\ttab.backdrop:SetTemplate(\"Overlay\")\n\t\t\t\tif i > 2 then\n\t\t\t\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 8, -3)\n\t\t\t\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", -8, 3)\n\t\t\t\telse\n\t\t\t\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 5, -7)\n\t\t\t\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", -5, -3)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tAuctionatorSellingFrame.AuctionatorSaleItem.Icon.Icon:SkinIcon(true)\n\t\t\tAuctionatorSellingFrame.AuctionatorSaleItem.Icon.EmptySlot:Hide()\n\n\t\t\tfor _, duration in ipairs(selling.AuctionatorSaleItem.Duration.radioButtons) do\n\t\t\t\tif duration.RadioButton then\n\t\t\t\t\tT.SkinCheckBox(duration.RadioButton)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tfor _, child in ipairs({cancelling:GetChildren()}) do\n\t\t\t\tif child.StartScanButton then\n\t\t\t\t\tchild.StartScanButton:SkinButton()\n\t\t\t\t\tchild.CancelNextButton:SkinButton()\n\t\t\t\t\tchild.StartScanButton:SetPoint(\"TOPRIGHT\", child.CancelNextButton, \"TOPLEFT\", -2, 0)\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\t\tlocal frame = CreateFrame(\"Frame\")\n\t\tframe:RegisterEvent(\"TRADE_SKILL_SHOW\")\n\t\tframe:SetScript(\"OnEvent\", function(_, event)\n\t\t\tAuctionatorCraftingInfoProfessionsFrame.SearchButton:SkinButton()\n\t\tend)\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_AuctionHouseUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Azerite.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAzeriteUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tAzeriteEmpoweredItemUI:StripTextures()\n\tAzeriteEmpoweredItemUI:SetTemplate(\"Transparent\")\n\n\tAzeriteEmpoweredItemUI.BorderFrame:StripTextures()\n\n\tAzeriteEmpoweredItemUIPortrait:Hide()\n\tAzeriteEmpoweredItemUI.ClipFrame.BackgroundFrame.Bg:Hide()\n\n\tT.SkinCloseButton(AzeriteEmpoweredItemUICloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_AzeriteUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/AzeriteEssence.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAzeriteEssenceUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tAzeriteEssenceUI:StripTextures()\n\tAzeriteEssenceUI:SetTemplate(\"Transparent\")\n\n\tAzeriteEssenceUIPortrait:SetAlpha(0)\n\n\tAzeriteEssenceUI.PowerLevelBadgeFrame:ClearAllPoints()\n\tAzeriteEssenceUI.PowerLevelBadgeFrame:SetPoint(\"TOPLEFT\")\n\tAzeriteEssenceUI.PowerLevelBadgeFrame.Ring:Hide()\n\tAzeriteEssenceUI.PowerLevelBadgeFrame.BackgroundBlack:Hide()\n\n\tfor _, button in pairs(AzeriteEssenceUI.EssenceList.buttons) do\n\t\tbutton:DisableDrawLayer(\"ARTWORK\")\n\t\tbutton:StyleButton(nil, 3)\n\n\t\tbutton.Icon:SkinIcon()\n\t\tbutton.Icon:SetSize(27, 27)\n\t\tbutton.Icon:SetPoint(\"LEFT\", button, \"LEFT\", 6, 0)\n\n\t\tbutton.bg = CreateFrame(\"Frame\", nil, button)\n\t\tbutton.bg:CreateBackdrop(\"Overlay\")\n\t\tbutton.bg:SetFrameLevel(button:GetFrameLevel() - 1)\n\t\tbutton.bg:SetPoint(\"TOPLEFT\", 3, -3)\n\t\tbutton.bg:SetPoint(\"BOTTOMRIGHT\", -3, 3)\n\tend\n\n\tlocal HeaderButton = AzeriteEssenceUI.EssenceList.HeaderButton\n\tHeaderButton.Middle:Hide()\n\tHeaderButton.Left:Hide()\n\tHeaderButton.Right:Hide()\n\n\tT.SkinScrollBar(AzeriteEssenceUI.EssenceList.ScrollBar)\n\tT.SkinCloseButton(AzeriteEssenceUICloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_AzeriteEssenceUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/AzeriteRespec.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAzeriteRespecUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tAzeriteRespecFrame:StripTextures()\n\tAzeriteRespecFrame:SetTemplate(\"Transparent\")\n\n\tlocal ItemSlots = AzeriteRespecFrame.ItemSlot\n\tItemSlots:StripTextures()\n\tItemSlots.Icon:SkinIcon()\n\n\thooksecurefunc(ItemSlots.GlowOverlay, \"Show\", function() ItemSlots.backdrop:SetBackdropBorderColor(0.64, 0.2, 0.93) end)\n\thooksecurefunc(ItemSlots.GlowOverlay, \"Hide\", function() ItemSlots.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end)\n\n\tAzeriteRespecFrame.ButtonFrame.MoneyFrameEdge:StripTextures()\n\tAzeriteRespecFrameMoneyFrame:SetPoint(\"BOTTOMRIGHT\", -155, 9)\n\n\tAzeriteRespecFrame.ButtonFrame:StripTextures()\n\tAzeriteRespecFrame.ButtonFrame.AzeriteRespecButton:SkinButton()\n\tAzeriteRespecFrame.ButtonFrame.AzeriteRespecButton:SetPoint(\"BOTTOMRIGHT\", -4, 5)\n\tT.SkinCloseButton(AzeriteRespecFrameCloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_AzeriteRespecUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/BarberShop.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBarbershopUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal buttons = {\n\t\tBarberShopFrame.AcceptButton,\n\t\tBarberShopFrame.CancelButton,\n\t\tBarberShopFrame.ResetButton\n\t}\n\n\tfor i = 1, #buttons do\n\t\tlocal button = buttons[i]\n\t\tbutton:SkinButton(true)\n\t\tbutton:SetScale(UIParent:GetScale())\n\tend\n\n\tlocal smallButtons = {\n\t\tCharCustomizeFrame.SmallButtons.ResetCameraButton,\n\t\tCharCustomizeFrame.SmallButtons.ZoomOutButton,\n\t\tCharCustomizeFrame.SmallButtons.ZoomInButton,\n\t\tCharCustomizeFrame.SmallButtons.RotateLeftButton,\n\t\tCharCustomizeFrame.SmallButtons.RotateRightButton,\n\t}\n\n\tfor i = 1, #smallButtons do\n\t\tlocal button = smallButtons[i]\n\t\tbutton:SetNormalTexture(0)\n\t\tbutton:SetPushedTexture(0)\n\t\tbutton:SetHighlightTexture(0)\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_BarbershopUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Binding.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBinding skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = ClickBindingFrame\n\tT.SkinFrame(frame)\n\n\tframe.TutorialButton.Ring:Hide()\n\tframe.TutorialButton:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -12, 12)\n\n\tT.SkinScrollBar(ClickBindingFrame.ScrollBar)\n\tT.SkinCheckBox(frame.EnableMouseoverCastCheckbox)\n\tT.SkinDropDownBox(frame.MouseoverCastKeyDropDown)\n\n\tClickBindingFrame.MacrosPortrait:SetPoint(\"TOPRIGHT\", -40, -60)\n\n\tlocal function updateNewGlow(self)\n\t\tif self.NewOutline:IsShown() then\n\t\t\tself.backdrop:SetBackdropBorderColor(0, 0.8, 0)\n\t\telse\n\t\t\tself.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\tend\n\n\tlocal function HandleScrollChild(self)\n\t\tfor i = 1, self.ScrollTarget:GetNumChildren() do\n\t\t\tlocal button = select(i, self.ScrollTarget:GetChildren())\n\t\t\tlocal icon = button and button.Icon\n\t\t\tif icon and not icon.IsSkinned then\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", -4, 0)\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 0)\n\n\t\t\t\ticon:SkinIcon(true)\n\t\t\t\ticon:SetSize(32, 32)\n\t\t\t\ticon:ClearAllPoints()\n\t\t\t\ticon:SetPoint(\"TOPLEFT\", button, \"TOPLEFT\", 3, -7)\n\n\t\t\t\tbutton.Background:Hide()\n\n\t\t\t\tbutton.DeleteButton:SkinButton()\n\t\t\t\tbutton.DeleteButton:SetSize(20, 20)\n\t\t\t\tbutton.FrameHighlight:SetInside(button.backdrop)\n\t\t\t\tbutton.FrameHighlight:SetColorTexture(1, 1, 1, 0.3)\n\n\t\t\t\tbutton.NewOutline:SetTexture(\"\")\n\t\t\t\thooksecurefunc(button, \"Init\", updateNewGlow)\n\n\t\t\t\ticon.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend\n\n\thooksecurefunc(frame.ScrollBox, \"Update\", HandleScrollChild)\n\n\tframe.ScrollBar:StripTextures()\n\tframe.ScrollBar.Background:Hide()\n\tframe.ScrollBoxBackground:Hide()\n\n\tlocal buttons = {\n\t\t\"ResetButton\",\n\t\t\"AddBindingButton\",\n\t\t\"SaveButton\"\n\t}\n\n\tfor _, v in pairs(buttons) do\n\t\tframe[v]:SkinButton(true)\n\tend\n\n\tlocal tutorial = frame.TutorialFrame\n\ttutorial.NineSlice:StripTextures()\n\ttutorial:CreateBackdrop(\"Transparent\")\n\ttutorial.backdrop:SetInside()\nend\n\nT.SkinFuncs[\"Blizzard_ClickBindingUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/BlackMarket.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBlackMarket skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tBlackMarketFrame:StripTextures()\n\tBlackMarketFrame:SetTemplate(\"Transparent\")\n\n\tBlackMarketFrame.Inset:CreateBackdrop(\"Overlay\")\n\tBlackMarketFrame.Inset.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tBlackMarketFrame.Inset.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, 4)\n\n\tT.SkinScrollBar(BlackMarketFrame.ScrollBar)\n\tBlackMarketFrame.MoneyFrameBorder:StripTextures()\n\tT.SkinEditBox(BlackMarketBidPriceGold, nil, 18)\n\n\tBlackMarketFrame.BidButton:SkinButton()\n\tBlackMarketFrame.BidButton:SetHeight(20)\n\tBlackMarketFrame.BidButton:SetPoint(\"BOTTOMRIGHT\", -255, 4)\n\tBlackMarketBidPrice:SetPoint(\"BOTTOMRIGHT\", BlackMarketFrame.BidButton, \"BOTTOMLEFT\", 0, -2)\n\n\tBlackMarketFrame.HotDeal:StripTextures()\n\tBlackMarketFrame.HotDeal:CreateBackdrop(\"Overlay\")\n\tBlackMarketFrame.HotDeal.Item.IconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tBlackMarketFrame.HotDeal.Item.IconBorder:SetAlpha(0)\n\tBlackMarketFrame.HotDeal.Item:CreateBackdrop(\"Default\")\n\tBlackMarketFrame.HotDeal.Item:StyleButton()\n\tBlackMarketFrame.HotDeal.Item.hover:SetAllPoints()\n\tBlackMarketFrame.HotDeal.Item.pushed:SetAllPoints()\n\n\tT.SkinCloseButton(BlackMarketFrame.CloseButton)\n\n\tlocal tabs = {\"ColumnName\", \"ColumnLevel\", \"ColumnType\", \"ColumnDuration\", \"ColumnHighBidder\", \"ColumnCurrentBid\"}\n\tfor _, tab in pairs(tabs) do\n\t\tlocal tab = BlackMarketFrame[tab]\n\n\t\ttab:StripTextures()\n\tend\n\n\thooksecurefunc(BlackMarketItemMixin, \"Init\", function (button, elementData)\n\t\tif not button.skinned then\n\t\t\tbutton:StripTextures()\n\n\t\t\tbutton.Item:StripTextures()\n\t\t\tbutton.Item:StyleButton()\n\t\t\tbutton.Item:SetTemplate(\"Default\")\n\n\t\t\tbutton.Item.IconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tbutton.Item.IconTexture:ClearAllPoints()\n\t\t\tbutton.Item.IconTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tbutton.Item.IconTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\tbutton.Item.IconBorder:SetAlpha(0)\n\n\t\t\tbutton:SetHighlightTexture(C.media.texture)\n\t\t\tbutton:GetHighlightTexture():SetVertexColor(0.243, 0.570, 1, 0.2)\n\n\t\t\tbutton.skinned = true\n\t\tend\n\n\t\tlocal name, texture = C_BlackMarket.GetItemInfoByIndex(elementData.index)\n\t\tif name then\n\t\t\tbutton.Item.IconTexture:SetTexture(texture)\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_BlackMarketUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/BonusRoll.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBonusRoll skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\t-- /run BonusRollFrame_StartBonusRoll(242969,\"test\",40,515,79,14)\n\tBonusRollFrame:StripTextures()\n\tBonusRollFrame:CreateBackdrop(\"Transparent\")\n\tBonusRollFrame.backdrop:SetFrameLevel(0)\n\tBonusRollFrame.backdrop:SetPoint(\"TOPLEFT\", BonusRollFrame, \"TOPLEFT\", -9, 6)\n\tBonusRollFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", BonusRollFrame, \"BOTTOMRIGHT\", 5, -6)\n\n\tBonusRollFrame.PromptFrame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tBonusRollFrame.PromptFrame.Icon:SetSize(50, 50)\n\tBonusRollFrame.PromptFrame.Icon:ClearAllPoints()\n\tBonusRollFrame.PromptFrame.Icon:SetPoint(\"LEFT\", BonusRollFrame, 0, 6)\n\n\tBonusRollFrame.PromptFrame.IconBackdrop = CreateFrame(\"Frame\", nil, BonusRollFrame.PromptFrame)\n\tBonusRollFrame.PromptFrame.IconBackdrop:SetTemplate(\"Default\")\n\tBonusRollFrame.PromptFrame.IconBackdrop:SetFrameLevel(BonusRollFrame.PromptFrame.IconBackdrop:GetFrameLevel() - 1)\n\tBonusRollFrame.PromptFrame.IconBackdrop:SetPoint(\"TOPLEFT\", BonusRollFrame.PromptFrame.Icon, -2, 2)\n\tBonusRollFrame.PromptFrame.IconBackdrop:SetPoint(\"BOTTOMRIGHT\", BonusRollFrame.PromptFrame.Icon, 2, -2)\n\n\tBonusRollFrame.PromptFrame.Timer:CreateBackdrop(\"Default\")\n\tBonusRollFrame.PromptFrame.Timer:SetStatusBarTexture(C.media.texture)\n\tBonusRollFrame.PromptFrame.Timer:SetPoint(\"BOTTOMLEFT\", BonusRollFrame.PromptFrame, \"BOTTOMLEFT\", 0, 1)\n\n\tBonusRollFrame.SpecRing:SetTexture(\"\")\n\tBonusRollFrame.SpecIcon:SetPoint(\"TOPLEFT\", BonusRollFrame, \"TOPLEFT\", 0, -3)\n\tBonusRollFrame.SpecIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t-- BonusRollFrame.SpecIcon:SetTexture(\"Interface\\\\Icons\\\\spell_nature_brilliance\")\n\n\tBonusRollFrame.SpecIcon.b = CreateFrame(\"Frame\", nil, BonusRollFrame)\n\tBonusRollFrame.SpecIcon.b:SetFrameLevel(6)\n\tBonusRollFrame.SpecIcon.b:SetTemplate(\"Default\")\n\tBonusRollFrame.SpecIcon.b:SetPoint(\"TOPLEFT\", BonusRollFrame.SpecIcon, \"TOPLEFT\", -2, 2)\n\tBonusRollFrame.SpecIcon.b:SetPoint(\"BOTTOMRIGHT\", BonusRollFrame.SpecIcon, \"BOTTOMRIGHT\", 2, -2)\n\tBonusRollFrame.SpecIcon:SetParent(BonusRollFrame.SpecIcon.b)\n\n\thooksecurefunc(BonusRollFrame.SpecIcon, \"Hide\", function(specIcon)\n\t\tif specIcon.b and specIcon.b:IsShown() then\n\t\t\tspecIcon.b:Hide()\n\t\tend\n\tend)\n\n\thooksecurefunc(BonusRollFrame.SpecIcon, \"Show\", function(specIcon)\n\t\tif specIcon.b and not specIcon.b:IsShown() and specIcon:GetTexture() ~= nil then\n\t\t\tspecIcon.b:Show()\n\t\tend\n\tend)\n\n\t-- Skin currency icons\n\thooksecurefunc(\"BonusRollFrame_StartBonusRoll\", function()\n\t\tlocal ccf, pfifc = BonusRollFrame.CurrentCountFrame.Text, BonusRollFrame.PromptFrame.InfoFrame.Cost\n\t\tlocal text1, text2 = ccf and ccf:GetText(), pfifc and pfifc:GetText()\n\t\tif text1 and text1:find(\"|t\") then ccf:SetText(text1:gsub(\"|T(.-):.-|t\", \"|T%1:16:16:0:0:64:64:5:59:5:59|t\")) end\n\t\tif text2 and text2:find(\"|t\") then pfifc:SetText(text2:gsub(\"|T(.-):.-|t\", \"|T%1:16:16:0:0:64:64:5:59:5:59|t\")) end\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Bubbles.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.bubbles ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tChatBubbles skin\n----------------------------------------------------------------------------------------\nlocal function styleBubble(bubble)\n\tif bubble:IsForbidden() then return end\n\n\tlocal frame = bubble:GetChildren(1)\n\tframe:DisableDrawLayer(\"BORDER\")\n\tframe.Tail:Hide()\n\n\tframe:CreateBackdrop(\"Transparent\")\n\tframe.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tframe.backdrop:SetScale(UIParent:GetScale())\n\n\tbubble:SetClampedToScreen(false)\n\tbubble:SetFrameStrata(\"BACKGROUND\")\n\tbubble.styled = true\nend\n\nlocal function onUpdate(self, elapsed)\n\tself.elapsed = (self.elapsed or 0) + elapsed\n\tif self.elapsed < 0.1 then return end\n\tself.elapsed = 0\n\n\tfor _, bubble in pairs(C_ChatBubbles.GetAllChatBubbles()) do\n\t\tif not bubble.styled then\n\t\t\tstyleBubble(bubble)\n\t\tend\n\tend\nend\n\nlocal f = CreateFrame(\"Frame\")\nf:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nf:SetScript(\"OnEvent\", function()\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType == \"party\" or instanceType == \"raid\" then\n\t\tf:SetScript(\"OnUpdate\", nil)\n\telse\n\t\tf:SetScript(\"OnUpdate\", onUpdate)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Calendar.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCalendar skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frames = {\n\t\tCalendarFrame,\n\t\tCalendarCreateEventFrame,\n\t\tCalendarCreateEventFrame.Header,\n\t\tCalendarCreateEventInviteList,\n\t\tCalendarCreateEventDescriptionContainer,\n\t\tCalendarCreateEventInviteListSection,\n\t\tCalendarTexturePickerFrame,\n\t\tCalendarTexturePickerFrame.Header,\n\t\tCalendarMassInviteFrame,\n\t\tCalendarMassInviteFrame.Header,\n\t\tCalendarViewRaidFrame,\n\t\tCalendarViewRaidFrame.Header,\n\t\tCalendarViewHolidayFrame.Header,\n\t\tCalendarViewEventFrame,\n\t\tCalendarViewEventFrame.Header,\n\t\tCalendarViewEventDescriptionContainer,\n\t\tCalendarViewEventInviteList,\n\t\tCalendarViewEventInviteListSection,\n\t\tCalendarEventPickerFrame,\n\t\tCalendarEventPickerFrame.Header\n\t}\n\n\tfor _, frame in pairs(frames) do\n\t\tframe:StripTextures()\n\tend\n\n\tCalendarFrame:CreateBackdrop(\"Transparent\")\n\tCalendarFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tCalendarFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, -5)\n\n\tT.SkinCloseButton(CalendarCloseButton)\n\n\tT.SkinNextPrevButton(CalendarPrevMonthButton)\n\tT.SkinNextPrevButton(CalendarNextMonthButton)\n\n\t-- Dropdown button\n\tdo\n\t\tlocal frame = CalendarFilterFrame\n\t\tlocal button = CalendarFilterButton\n\n\t\tframe:StripTextures()\n\t\tframe:SetWidth(155)\n\n\t\t_G[frame:GetName()..\"Text\"]:ClearAllPoints()\n\t\t_G[frame:GetName()..\"Text\"]:SetPoint(\"RIGHT\", button, \"LEFT\", -2, 0)\n\n\t\tbutton:ClearAllPoints()\n\t\tbutton:SetPoint(\"RIGHT\", frame, \"RIGHT\", -10, 3)\n\t\tbutton.SetPoint = T.dummy\n\n\t\tT.SkinNextPrevButton(button)\n\n\t\tframe:CreateBackdrop(\"Default\")\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 20, 2)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMRIGHT\", 2, -2)\n\tend\n\n\t-- Backdrop\n\tlocal bg = CreateFrame(\"Frame\", \"CalendarFrameBackdrop\", CalendarFrame)\n\tbg:SetTemplate(\"Default\")\n\tbg:SetPoint(\"TOPLEFT\", 10, -72)\n\tbg:SetPoint(\"BOTTOMRIGHT\", -8, 3)\n\n\tCalendarContextMenu.NineSlice:SetTemplate(\"Transparent\")\n\tCalendarInviteStatusContextMenu.NineSlice:SetTemplate(\"Transparent\")\n\n\t-- Boost frame levels\n\tfor i = 1, 42 do\n\t\t_G[\"CalendarDayButton\"..i]:SetFrameLevel(_G[\"CalendarDayButton\"..i]:GetFrameLevel() + 1)\n\tend\n\n\t-- CreateEventFrame\n\tCalendarCreateEventFrame:SetTemplate(\"Transparent\")\n\tCalendarCreateEventFrame:SetPoint(\"TOPLEFT\", CalendarFrame, \"TOPRIGHT\", 3, 0)\n\n\tCalendarCreateEventCreateButton:SkinButton(true)\n\tCalendarCreateEventMassInviteButton:SkinButton(true)\n\tCalendarCreateEventInviteButton:SkinButton(true)\n\tCalendarCreateEventInviteButton:SetPoint(\"TOPLEFT\", CalendarCreateEventInviteEdit, \"TOPRIGHT\", 4, 2)\n\tCalendarCreateEventInviteEdit:SetPoint(\"TOPLEFT\", CalendarCreateEventInviteList, \"BOTTOMLEFT\", 2, -3)\n\n\tCalendarCreateEventInviteList:SetTemplate(\"Overlay\")\n\n\tT.SkinEditBox(CalendarCreateEventInviteEdit, CalendarCreateEventInviteEdit:GetWidth() - 2, CalendarCreateEventInviteEdit:GetHeight() - 2)\n\tT.SkinEditBox(CalendarCreateEventTitleEdit)\n\tCalendarCreateEventTitleEdit.backdrop:SetPoint(\"TOPLEFT\", -3, 1)\n\tCalendarCreateEventTitleEdit.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, -1)\n\tT.SkinDropDownBox(CalendarCreateEventTypeDropDown, 120)\n\n\tCalendarCreateEventDescriptionContainer:SetTemplate(\"Overlay\")\n\n\tT.SkinCloseButton(CalendarCreateEventCloseButton)\n\n\tT.SkinCheckBox(CalendarCreateEventLockEventCheck)\n\n\tT.SkinDropDownBox(CalendarCreateEventHourDropDown, 68)\n\tT.SkinDropDownBox(CalendarCreateEventMinuteDropDown, 68)\n\tT.SkinDropDownBox(CalendarCreateEventAMPMDropDown, 68)\n\tT.SkinDropDownBox(CalendarCreateEventDifficultyOptionDropDown)\n\tCalendarCreateEventIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tCalendarCreateEventIcon.SetTexCoord = T.dummy\n\n\tCalendarClassButtonContainer:HookScript(\"OnShow\", function()\n\t\tfor i, class in ipairs(CLASS_SORT_ORDER) do\n\t\t\tlocal button = _G[\"CalendarClassButton\"..i]\n\t\t\tbutton:StripTextures()\n\t\t\tbutton:CreateBackdrop(\"Default\")\n\n\t\t\tlocal tcoords = CLASS_ICON_TCOORDS[class]\n\t\t\tlocal buttonIcon = button:GetNormalTexture()\n\t\t\tbuttonIcon:SetTexture(\"Interface\\\\Glues\\\\CharacterCreate\\\\UI-CharacterCreate-Classes\")\n\t\t\tbuttonIcon:SetTexCoord(tcoords[1] + 0.015, tcoords[2] - 0.02, tcoords[3] + 0.018, tcoords[4] - 0.02)\n\t\tend\n\n\t\tCalendarClassButton1:SetPoint(\"TOPLEFT\", CalendarClassButtonContainer, \"TOPLEFT\", 5, 0)\n\n\t\tCalendarClassTotalsButton:StripTextures()\n\t\tCalendarClassTotalsButton:CreateBackdrop(\"Default\")\n\tend)\n\n\t-- Texture Picker Frame\n\tCalendarTexturePickerFrame:SetTemplate(\"Transparent\")\n\n\tT.SkinScrollBar(CalendarTexturePickerFrame.ScrollBar)\n\tCalendarTexturePickerAcceptButton:SkinButton(true)\n\tCalendarTexturePickerCancelButton:SkinButton(true)\n\tCalendarCreateEventRaidInviteButton:SkinButton(true)\n\n\t-- Mass Invite Frame\n\tCalendarMassInviteFrame:CreateBackdrop(\"Overlay\")\n\tT.SkinDropDownBox(CalendarMassInviteCommunityDropDown, 190)\n\tT.SkinDropDownBox(CalendarMassInviteRankMenu)\n\tT.SkinEditBox(CalendarMassInviteMinLevelEdit)\n\tT.SkinEditBox(CalendarMassInviteMaxLevelEdit)\n\tCalendarMassInviteAcceptButton:SkinButton()\n\tT.SkinCloseButton(CalendarMassInviteCloseButton)\n\tT.SkinDropDownBox(CalendarCreateEventCommunityDropDown, 240)\n\n\t-- Raid View\n\tCalendarViewRaidFrame:SetTemplate(\"Transparent\")\n\tCalendarViewRaidFrame:SetPoint(\"TOPLEFT\", CalendarFrame, \"TOPRIGHT\", 3, 0)\n\tT.SkinCloseButton(CalendarViewRaidCloseButton)\n\n\t-- Holiday View\n\tCalendarViewHolidayFrame:StripTextures(true)\n\tCalendarViewHolidayFrame:SetTemplate(\"Transparent\")\n\tCalendarViewHolidayFrame:SetPoint(\"TOPLEFT\", CalendarFrame, \"TOPRIGHT\", 3, 0)\n\tT.SkinCloseButton(CalendarViewHolidayCloseButton)\n\n\t-- Event View\n\tCalendarViewEventFrame:SetTemplate(\"Transparent\")\n\tCalendarViewEventFrame:SetPoint(\"TOPLEFT\", CalendarFrame, \"TOPRIGHT\", 3, 0)\n\tCalendarViewEventDescriptionContainer:SetTemplate(\"Overlay\")\n\tCalendarViewEventInviteList:SetTemplate(\"Overlay\")\n\tT.SkinCloseButton(CalendarViewEventCloseButton)\n\n\tCalendarEventPickerFrame:SetTemplate(\"Transparent\")\n\tCalendarEventPickerCloseButton:SkinButton(true)\n\n\tlocal buttons = {\n\t\t\"CalendarViewEventAcceptButton\",\n\t\t\"CalendarViewEventTentativeButton\",\n\t\t\"CalendarViewEventRemoveButton\",\n\t\t\"CalendarViewEventDeclineButton\"\n\t}\n\n\tfor _, button in pairs(buttons) do\n\t\t_G[button]:SkinButton()\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_Calendar\"] = LoadSkin\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Channels.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tChannels skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tChannelFrame:StripTextures()\n\tChannelFrame:CreateBackdrop(\"Transparent\")\n\n\tChannelFrame.NewButton:SkinButton()\n\tChannelFrame.SettingsButton:SkinButton()\n\n\tT.SkinScrollBar(ChannelFrame.ChannelRoster.ScrollBar)\n\tT.SkinScrollBar(ChannelFrame.ChannelList.ScrollBar)\n\n\tT.SkinCloseButton(ChannelFrameCloseButton)\n\n\tCreateChannelPopup:StripTextures()\n\tCreateChannelPopup:CreateBackdrop(\"Transparent\")\n\n\tCreateChannelPopup.OKButton:SkinButton()\n\tCreateChannelPopup.CancelButton:SkinButton()\n\n\tCreateChannelPopup.OKButton:SetPoint(\"BOTTOMLEFT\", 5, 5)\n\tCreateChannelPopup.CancelButton:ClearAllPoints()\n\tCreateChannelPopup.CancelButton:SetPoint(\"BOTTOMRIGHT\", -5, 5)\n\n\tCreateChannelPopup.Name.Label:SetDrawLayer(\"OVERLAY\")\n\tCreateChannelPopup.Password.Label:SetDrawLayer(\"OVERLAY\")\n\tT.SkinEditBox(CreateChannelPopup.Name)\n\tT.SkinEditBox(CreateChannelPopup.Password)\n\n\tT.SkinCloseButton(CreateChannelPopup.CloseButton)\n\n\tVoiceChatPromptActivateChannel:StripTextures()\n\tVoiceChatPromptActivateChannel:CreateBackdrop(\"Transparent\")\n\tVoiceChatPromptActivateChannel.AcceptButton:SkinButton()\n\tT.SkinCloseButton(VoiceChatPromptActivateChannel.CloseButton)\n\n\thooksecurefunc(ChannelButtonHeaderMixin, \"Update\", function(self)\n\t\tif not self.skin then\n\t\t\tself:SkinButton()\n\t\t\tself.skin = true\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Character.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCharacter skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tT.SkinCloseButton(CharacterFrameCloseButton)\n\n\t-- Azerite Items\n\tlocal function UpdateAzeriteItem(self)\n\t\tif not self.styled then\n\t\t\tself.AzeriteTexture:SetAlpha(0)\n\t\t\tself.RankFrame.Texture:SetTexture(\"\")\n\t\t\tself.RankFrame.Label:SetFontObject(\"SystemFont_Outline_Small\")\n\t\t\tself.RankFrame.Label:SetShadowOffset(0, 0)\n\t\t\tself.RankFrame.Label:SetPoint(\"CENTER\", self.RankFrame.Texture, 0, 2)\n\n\t\t\tself.styled = true\n\t\tend\n\t\tself:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3)\n\t\tself:GetHighlightTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\t\tself:GetHighlightTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tlocal function UpdateAzeriteEmpoweredItem(self)\n\t\tself.AzeriteTexture:SetAtlas(\"AzeriteIconFrame\")\n\t\tself.AzeriteTexture:SetTexCoord(0.05, 0.95, 0.05, 0.95)\n\t\tself.AzeriteTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tself.AzeriteTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tself.AzeriteTexture:SetDrawLayer(\"BORDER\", 1)\n\tend\n\n\tlocal slots = {\n\t\t\"HeadSlot\",\n\t\t\"NeckSlot\",\n\t\t\"ShoulderSlot\",\n\t\t\"BackSlot\",\n\t\t\"ChestSlot\",\n\t\t\"ShirtSlot\",\n\t\t\"TabardSlot\",\n\t\t\"WristSlot\",\n\t\t\"HandsSlot\",\n\t\t\"WaistSlot\",\n\t\t\"LegsSlot\",\n\t\t\"FeetSlot\",\n\t\t\"Finger0Slot\",\n\t\t\"Finger1Slot\",\n\t\t\"Trinket0Slot\",\n\t\t\"Trinket1Slot\",\n\t\t\"MainHandSlot\",\n\t\t\"SecondaryHandSlot\"\n\t}\n\n\tselect(16, CharacterMainHandSlot:GetRegions()):Hide()\n\tselect(16, CharacterSecondaryHandSlot:GetRegions()):Hide()\n\n\tfor _, i in pairs(slots) do\n\t\t_G[\"Character\"..i..\"Frame\"]:Hide()\n\t\tlocal icon = _G[\"Character\"..i..\"IconTexture\"]\n\t\tlocal slot = _G[\"Character\"..i]\n\t\tlocal border = _G[\"Character\"..i].IconBorder\n\n\t\tborder:SetAlpha(0)\n\t\tslot:StyleButton()\n\t\tslot:SetNormalTexture(0)\n\t\tslot.SetHighlightTexture = T.dummy\n\t\tslot:GetHighlightTexture().SetAllPoints = T.dummy\n\t\tslot:SetFrameLevel(slot:GetFrameLevel() + 2)\n\t\tslot:SetTemplate(\"Default\")\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\tif slot.popoutButton:GetPoint() == \"TOP\" then\n\t\t\tslot.popoutButton:SetPoint(\"TOP\", slot, \"BOTTOM\", 0, 2)\n\t\telse\n\t\t\tslot.popoutButton:SetPoint(\"LEFT\", slot, \"RIGHT\", -2, 0)\n\t\tend\n\n\t\thooksecurefunc(slot, \"DisplayAsAzeriteItem\", UpdateAzeriteItem)\n\t\thooksecurefunc(slot, \"DisplayAsAzeriteEmpoweredItem\", UpdateAzeriteEmpoweredItem)\n\tend\n\n\t-- Strip Textures\n\tlocal charframe = {\n\t\tCharacterFrame,\n\t\tCharacterModelScene,\n\t\tCharacterFrameInset,\n\t\tCharacterStatsPane,\n\t\tCharacterFrameInsetRight,\n\t\tPaperDollSidebarTabs,\n\t\t-- PaperDollEquipmentManagerPane\n\t}\n\n\tfor i = 1, #charframe do\n\t\tlocal button = charframe[i]\n\t\tbutton:StripTextures()\n\tend\n\n\tEquipmentFlyoutFrameHighlight:Kill()\n\tEquipmentFlyoutFrame.NavigationFrame:StripTextures()\n\tEquipmentFlyoutFrame.NavigationFrame.BottomBackground:Hide()\n\tEquipmentFlyoutFrame.NavigationFrame:SetTemplate(\"Transparent\")\n\tEquipmentFlyoutFrame.NavigationFrame:SetPoint(\"TOPLEFT\", EquipmentFlyoutFrameButtons, \"BOTTOMLEFT\", 3, -1)\n\tEquipmentFlyoutFrame.NavigationFrame:SetPoint(\"TOPRIGHT\", EquipmentFlyoutFrameButtons, \"BOTTOMRIGHT\", 0, -1)\n\tT.SkinNextPrevButton(EquipmentFlyoutFrame.NavigationFrame.PrevButton)\n\tT.SkinNextPrevButton(EquipmentFlyoutFrame.NavigationFrame.NextButton)\n\n\tlocal function SkinItemFlyouts()\n\t\tEquipmentFlyoutFrameButtons:StripTextures()\n\n\t\tfor i = 1, 23 do\n\t\t\tlocal button = _G[\"EquipmentFlyoutFrameButton\"..i]\n\t\t\tlocal icon = _G[\"EquipmentFlyoutFrameButton\"..i..\"IconTexture\"]\n\t\t\tif button then\n\t\t\t\tbutton:StyleButton()\n\t\t\t\tbutton.IconBorder:Hide()\n\n\t\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tbutton:GetNormalTexture():SetTexture(nil)\n\n\t\t\t\ticon:ClearAllPoints()\n\t\t\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tbutton:SetFrameStrata(\"DIALOG\")\n\t\t\t\tif not button.backdrop then\n\t\t\t\t\tbutton:CreateBackdrop(\"Default\")\n\t\t\t\t\tbutton.backdrop:SetAllPoints()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Swap item flyout frame (shown when holding alt over a slot)\n\tEquipmentFlyoutFrame:HookScript(\"OnShow\", SkinItemFlyouts)\n\thooksecurefunc(\"EquipmentFlyout_Show\", SkinItemFlyouts)\n\n\t-- Icon in upper right corner of character frame\n\tCharacterFrame:SetTemplate(\"Transparent\")\n\tCharacterFramePortrait:Kill()\n\tCharacterModelFrameBackgroundOverlay:SetColorTexture(0, 0, 0)\n\tCharacterModelScene:CreateBackdrop(\"Default\")\n\tCharacterModelScene.backdrop:SetPoint(\"TOPLEFT\", -3, 4)\n\tCharacterModelScene.backdrop:SetPoint(\"BOTTOMRIGHT\", 4, 0)\n\n\t-- Unit Background Texture\n\tCharacterModelFrameBackgroundTopLeft:SetPoint(\"TOPLEFT\", CharacterModelScene.backdrop, \"TOPLEFT\", 2, -2)\n\tCharacterModelFrameBackgroundTopRight:SetPoint(\"TOPRIGHT\", CharacterModelScene.backdrop, \"TOPRIGHT\", -2, -2)\n\tCharacterModelFrameBackgroundBotLeft:SetPoint(\"BOTTOMLEFT\", CharacterModelScene.backdrop, \"BOTTOMLEFT\", 2, -50)\n\tCharacterModelFrameBackgroundBotRight:SetPoint(\"BOTTOMRIGHT\", CharacterModelScene.backdrop, \"BOTTOMRIGHT\", -2, -50)\n\n\tlocal scrollbars = {\n\t\tPaperDollFrame.TitleManagerPane.ScrollBar,\n\t\tPaperDollFrame.EquipmentManagerPane.ScrollBar,\n\t\tReputationFrame.ScrollBar,\n\t\tTokenFrame.ScrollBar\n\t}\n\n\tfor i = 1, #scrollbars do\n\t\tT.SkinScrollBar(scrollbars[i])\n\tend\n\n\tlocal function SkinStatsPane(frame)\n\t\tframe:StripTextures()\n\n\t\tlocal bg = frame.Background\n\t\tbg:SetTexture(C.media.blank)\n\t\tbg:ClearAllPoints()\n\t\tbg:SetPoint(\"CENTER\", 0, -15)\n\t\tbg:SetSize(165, 1)\n\t\tbg:SetVertexColor(unpack(C.media.border_color))\n\n\t\tlocal border = CreateFrame(\"Frame\", \"$parentOuterBorder\", frame, \"BackdropTemplate\")\n\t\tborder:SetPoint(\"TOPLEFT\", bg, \"TOPLEFT\", -T.mult, T.mult)\n\t\tborder:SetPoint(\"BOTTOMRIGHT\", bg, \"BOTTOMRIGHT\", T.mult, -T.mult)\n\t\tborder:SetFrameLevel(frame:GetFrameLevel() + 1)\n\t\tborder:SetBackdrop({\n\t\t\tedgeFile = C.media.blank, edgeSize = T.mult,\n\t\t\tinsets = {left = T.mult, right = T.mult, top = T.mult, bottom = T.mult}\n\t\t})\n\t\tborder:SetBackdropBorderColor(unpack(C.media.backdrop_color))\n\tend\n\n\tCharacterStatsPane.ItemLevelFrame.Value:SetFont(C.media.normal_font, 18, \"\")\n\tCharacterStatsPane.ItemLevelFrame.Value:SetShadowOffset(1, -1)\n\tCharacterStatsPane.ItemLevelFrame.Background:Hide()\n\n\tSkinStatsPane(CharacterStatsPane.ItemLevelCategory)\n\tSkinStatsPane(CharacterStatsPane.AttributesCategory)\n\tSkinStatsPane(CharacterStatsPane.EnhancementsCategory)\n\n\t-- Titles\n\thooksecurefunc(_G.PaperDollFrame.TitleManagerPane.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not child.isSkinned then\n\t\t\t\tchild:DisableDrawLayer(\"BACKGROUND\")\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Equipement Manager\n\tPaperDollFrameEquipSet:SkinButton()\n\tPaperDollFrameSaveSet:SkinButton()\n\tPaperDollFrameEquipSet:SetWidth(PaperDollFrameEquipSet:GetWidth() - 8)\n\tPaperDollFrameSaveSet:SetWidth(PaperDollFrameSaveSet:GetWidth() - 8)\n\tPaperDollFrameEquipSet:SetPoint(\"TOPLEFT\", PaperDollFrame.EquipmentManagerPane, \"TOPLEFT\", 8, 0)\n\tPaperDollFrameSaveSet:SetPoint(\"LEFT\", PaperDollFrameEquipSet, \"RIGHT\", 4, 0)\n\thooksecurefunc(_G.PaperDollFrame.EquipmentManagerPane.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif child.icon and not child.isSkinned then\n\n\t\t\t\tchild.BgTop:SetTexture(nil)\n\t\t\t\tchild.BgBottom:SetTexture(nil)\n\t\t\t\tchild.BgMiddle:SetTexture(nil)\n\n\t\t\t\tchild.Check:SetTexture(nil)\n\t\t\t\tchild.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\t\tif not child.backdrop then\n\t\t\t\t\tchild:CreateBackdrop(\"Default\")\n\t\t\t\tend\n\n\t\t\t\tchild.backdrop:SetPoint(\"TOPLEFT\", child.icon, \"TOPLEFT\", -2, 2)\n\t\t\t\tchild.backdrop:SetPoint(\"BOTTOMRIGHT\", child.icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\t\tchild.icon:SetParent(child.backdrop)\n\n\t\t\t\t-- Making all icons the same size and position because otherwise BlizzardUI tries to attach itself to itself when it refreshes\n\t\t\t\tchild.icon:SetPoint(\"LEFT\", child, \"LEFT\", 4, 0)\n\t\t\t\tchild.icon.SetPoint = T.dummy\n\t\t\t\tchild.icon:SetSize(36, 36)\n\t\t\t\tchild.icon.SetSize = T.dummy\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tGearManagerPopupFrame:HookScript(\"OnShow\", function(frame)\n\t\tif not frame.isSkinned then\n\t\t\tT.SkinIconSelectionFrame(frame)\n\t\tend\n\tend)\n\n\t-- Handle Tabs at bottom of character frame\n\tfor i = 1, 4 do\n\t\tT.SkinTab(_G[\"CharacterFrameTab\"..i])\n\tend\n\n\t-- Buttons used to toggle between equipment manager, titles, and character stats\n\tlocal function FixSidebarTabCoords()\n\t\tfor i = 1, #PAPERDOLL_SIDEBARS do\n\t\t\tlocal tab = _G[\"PaperDollSidebarTab\"..i]\n\t\t\tif tab then\n\t\t\t\ttab.Highlight:SetColorTexture(1, 1, 1, 0.3)\n\t\t\t\ttab.Highlight:SetPoint(\"TOPLEFT\", 3, -4)\n\t\t\t\ttab.Highlight:SetPoint(\"BOTTOMRIGHT\", -1, 0)\n\t\t\t\ttab.Hider:SetColorTexture(0.4, 0.4, 0.4, 0.4)\n\t\t\t\ttab.Hider:SetPoint(\"TOPLEFT\", 3, -4)\n\t\t\t\ttab.Hider:SetPoint(\"BOTTOMRIGHT\", -1, 0)\n\t\t\t\ttab.TabBg:Kill()\n\n\t\t\t\tif i == 1 then\n\t\t\t\t\tfor i = 1, tab:GetNumRegions() do\n\t\t\t\t\t\tlocal region = select(i, tab:GetRegions())\n\t\t\t\t\t\tregion:SetTexCoord(0.16, 0.86, 0.16, 0.86)\n\t\t\t\t\t\tregion.SetTexCoord = T.dummy\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\ttab:CreateBackdrop(\"Default\")\n\t\t\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 1, -2)\n\t\t\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, -2)\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(\"PaperDollFrame_UpdateSidebarTabs\", FixSidebarTabCoords)\n\n\t-- Reputation\n\thooksecurefunc(_G.ReputationFrame.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, { frame.ScrollTarget:GetChildren() } do\n\t\t\tlocal container = child.Container\n\t\t\tif container and not container.IsSkinned then\n\t\t\t\tcontainer:StripTextures()\n\n\t\t\t\tif container.ExpandOrCollapseButton then\n\t\t\t\t\tT.SkinExpandOrCollapse(container.ExpandOrCollapseButton)\n\t\t\t\tend\n\n\t\t\t\tif container.ReputationBar then\n\t\t\t\t\tcontainer.ReputationBar:StripTextures()\n\t\t\t\t\tcontainer.ReputationBar:SetStatusBarTexture(C.media.texture)\n\t\t\t\t\tif not container.ReputationBar.backdrop then\n\t\t\t\t\t\tcontainer.ReputationBar:CreateBackdrop(\"Overlay\")\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tcontainer.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tReputationDetailFrame:StripTextures()\n\tReputationDetailFrame:SetTemplate(\"Transparent\")\n\tReputationDetailFrame:SetPoint(\"TOPLEFT\", ReputationFrame, \"TOPRIGHT\", 3, 0)\n\tT.SkinCloseButton(ReputationDetailCloseButton)\n\tT.SkinCheckBox(ReputationDetailMainScreenCheckBox)\n\tT.SkinCheckBox(ReputationDetailInactiveCheckBox)\n\tT.SkinCheckBox(ReputationDetailAtWarCheckBox)\n\tReputationDetailViewRenownButton:SkinButton()\n\n\t-- Currency\n\tTokenFramePopup:StripTextures()\n\tTokenFramePopup:SetTemplate(\"Transparent\")\n\tTokenFramePopup:SetPoint(\"TOPLEFT\", TokenFrame, \"TOPRIGHT\", 3, 0)\n\tif TokenFramePopup.CloseButton then\n\t\tT.SkinCloseButton(TokenFramePopup.CloseButton)\n\tend\n\tT.SkinCheckBox(TokenFramePopup.InactiveCheckBox)\n\tT.SkinCheckBox(TokenFramePopup.BackpackCheckBox)\n\n\thooksecurefunc(_G.TokenFrame.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif child.Highlight and not child.styled then\n\t\t\t\tchild.CategoryLeft:SetAlpha(0)\n\t\t\t\tchild.CategoryRight:SetAlpha(0)\n\t\t\t\tchild.CategoryMiddle:SetAlpha(0)\n\t\t\t\tchild.Highlight:Kill()\n\n\t\t\t\tchild.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\t\tchild.styled = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/ChatConfig.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tChatConfig skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tChatConfigFrame:StripTextures()\n\tChatConfigFrame:SetTemplate(\"Transparent\")\n\n\tChatConfigFrame.Header:StripTextures()\n\tChatConfigFrame.Header:ClearAllPoints()\n\tChatConfigFrame.Header:SetPoint(\"TOP\", ChatConfigFrame, 0, 7)\n\n\tlocal frames = {\n\t\t\"ChatConfigCategoryFrame\",\n\t\t\"ChatConfigBackgroundFrame\",\n\t\t\"ChatConfigChatSettingsClassColorLegend\",\n\t\t\"ChatConfigChatSettingsLeft\",\n\t\t\"ChatConfigChannelSettingsLeft\",\n\t\t\"ChatConfigChannelSettingsClassColorLegend\",\n\t\t\"ChatConfigOtherSettingsCombat\",\n\t\t\"ChatConfigOtherSettingsSystem\",\n\t\t\"ChatConfigOtherSettingsCreature\",\n\t\t\"ChatConfigOtherSettingsPVP\",\n\t\t\"ChatConfigCombatSettingsFilters\",\n\t\t\"CombatConfigMessageSourcesDoneBy\",\n\t\t\"CombatConfigMessageSourcesDoneTo\",\n\t\t\"CombatConfigColorsUnitColors\",\n\t\t\"CombatConfigColorsHighlighting\",\n\t\t\"ChatConfigTextToSpeechChannelSettingsLeft\"\n\t}\n\n\tfor i = 1, getn(frames) do\n\t\tlocal frame = _G[frames[i]]\n\t\tif frame then\n\t\t\tframe:StripTextures()\n\t\t\tframe:SetTemplate(\"Overlay\")\n\t\tend\n\tend\n\n\tlocal colorize = {\n\t\t\"CombatConfigColorsColorizeUnitName\",\n\t\t\"CombatConfigColorsColorizeSpellNames\",\n\t\t\"CombatConfigColorsColorizeDamageNumber\",\n\t\t\"CombatConfigColorsColorizeDamageSchool\",\n\t\t\"CombatConfigColorsColorizeEntireLine\"\n\t}\n\n\tfor i = 1, getn(colorize) do\n\t\tlocal frame = _G[colorize[i]]\n\t\tif frame then\n\t\t\tlocal bg = CreateFrame(\"Frame\", nil, frame)\n\t\t\tbg:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\tbg:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\t\tbg:SetTemplate(\"Overlay\")\n\t\tend\n\tend\n\n\tlocal buttons = {\n\t\t\"ChatConfigFrameDefaultButton\",\n\t\t\"ChatConfigFrameOkayButton\",\n\t\t\"ChatConfigFrameCancelButton\",\n\t\t\"ChatConfigFrameRedockButton\",\n\t\t\"ChatConfigCombatSettingsFiltersCopyFilterButton\",\n\t\t\"ChatConfigCombatSettingsFiltersAddFilterButton\",\n\t\t\"ChatConfigCombatSettingsFiltersDeleteButton\",\n\t\t\"CombatConfigSettingsSaveButton\",\n\t\t\"CombatLogDefaultButton\"\n\t}\n\n\tfor i = 1, getn(buttons) do\n\t\tlocal button = _G[buttons[i]]\n\t\tif button then\n\t\t\tbutton:SkinButton()\n\t\t\tbutton:ClearAllPoints()\n\t\tend\n\tend\n\n\tlocal checkboxes = {\n\t\t\"CombatConfigColorsHighlightingLine\",\n\t\t\"CombatConfigColorsHighlightingAbility\",\n\t\t\"CombatConfigColorsHighlightingDamage\",\n\t\t\"CombatConfigColorsHighlightingSchool\",\n\t\t\"CombatConfigColorsColorizeUnitNameCheck\",\n\t\t\"CombatConfigColorsColorizeSpellNamesCheck\",\n\t\t\"CombatConfigColorsColorizeSpellNamesSchoolColoring\",\n\t\t\"CombatConfigColorsColorizeDamageNumberCheck\",\n\t\t\"CombatConfigColorsColorizeDamageNumberSchoolColoring\",\n\t\t\"CombatConfigColorsColorizeDamageSchoolCheck\",\n\t\t\"CombatConfigColorsColorizeEntireLineCheck\",\n\t\t\"CombatConfigFormattingShowTimeStamp\",\n\t\t\"CombatConfigFormattingShowBraces\",\n\t\t\"CombatConfigFormattingUnitNames\",\n\t\t\"CombatConfigFormattingSpellNames\",\n\t\t\"CombatConfigFormattingItemNames\",\n\t\t\"CombatConfigFormattingFullText\",\n\t\t\"CombatConfigSettingsShowQuickButton\",\n\t\t\"CombatConfigSettingsSolo\",\n\t\t\"CombatConfigSettingsParty\",\n\t\t\"CombatConfigSettingsRaid\",\n\t\t\"CombatConfigColorsColorizeEntireLineBySource\",\n\t\t\"CombatConfigColorsColorizeEntireLineByTarget\"\n\t}\n\n\tfor i = 1, getn(checkboxes) do\n\t\tT.SkinCheckBox(_G[checkboxes[i]])\n\tend\n\n\tlocal ReskinColourSwatch = function(f)\n\t\tif f.InnerBorder then\n\t\t\tf.InnerBorder:SetAlpha(0)\n\t\t\tf.SwatchBg:SetAlpha(0)\n\t\tend\n\t\tf:CreateBackdrop(\"Overlay\")\n\t\tf:SetFrameLevel(f:GetFrameLevel() + 2)\n\t\tf.backdrop:SetOutside(f.Color, 2, 2)\n\tend\n\n\thooksecurefunc(\"ChatConfig_CreateCheckboxes\", function(frame, checkBoxTable, checkBoxTemplate)\n\t\tif frame.styled then return end\n\n\t\tlocal checkBoxNameString = frame:GetName()..\"CheckBox\"\n\n\t\tif checkBoxTemplate == \"ChatConfigCheckBoxTemplate\" or checkBoxTemplate == \"ChatConfigCheckBoxSmallTemplate\" then\n\t\t\tfor index in ipairs(checkBoxTable) do\n\t\t\t\tlocal checkBoxName = checkBoxNameString..index\n\t\t\t\tlocal checkbox = _G[checkBoxName]\n\n\t\t\t\tlocal bg = CreateFrame(\"Frame\", nil, checkbox)\n\t\t\t\tbg:SetPoint(\"TOPLEFT\", 2, -1)\n\t\t\t\tbg:SetPoint(\"BOTTOMRIGHT\", -2, 1)\n\t\t\t\tbg:SetTemplate(\"Overlay\")\n\n\t\t\t\tT.SkinCheckBox(_G[checkBoxName..\"Check\"])\n\t\t\tend\n\t\telseif checkBoxTemplate == \"ChatConfigCheckBoxWithSwatchTemplate\" or checkBoxTemplate == \"ChatConfigWideCheckBoxWithSwatchTemplate\" or checkBoxTemplate == \"MovableChatConfigWideCheckBoxWithSwatchTemplate\" then\n\t\t\tfor index in ipairs(checkBoxTable) do\n\t\t\t\tlocal checkBoxName = checkBoxNameString..index\n\t\t\t\tlocal checkbox = _G[checkBoxName]\n\n\t\t\t\tcheckbox:StripTextures()\n\t\t\t\tlocal bg = CreateFrame(\"Frame\", nil, checkbox)\n\t\t\t\tbg:SetPoint(\"TOPLEFT\", 2, -1)\n\t\t\t\tbg:SetPoint(\"BOTTOMRIGHT\", -2, 1)\n\t\t\t\tbg:CreateBackdrop(\"Overlay\")\n\t\t\t\tbg.backdrop:SetAllPoints(bg)\n\n\t\t\t\tReskinColourSwatch(_G[checkBoxName..\"ColorSwatch\"])\n\n\t\t\t\tT.SkinCheckBox(_G[checkBoxName..\"Check\"])\n\t\t\tend\n\t\tend\n\n\t\tframe.styled = true\n\tend)\n\n\thooksecurefunc(\"ChatConfig_CreateColorSwatches\", function(frame, swatchTable)\n\t\tif frame.styled then return end\n\n\t\tlocal nameString = frame:GetName()..\"Swatch\"\n\n\t\tfor index in ipairs(swatchTable) do\n\t\t\tlocal swatchName = nameString..index\n\t\t\tlocal swatch = _G[swatchName]\n\n\t\t\t-- swatch:SetBackdrop(nil)\n\n\t\t\tlocal bg = CreateFrame(\"Frame\", nil, swatch)\n\t\t\tbg:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\tbg:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\t\t\tbg:SetFrameLevel(swatch:GetFrameLevel() - 1)\n\t\t\tbg:CreateBorder(true)\n\t\t\tbg.iborder:SetBackdropBorderColor(unpack(C.media.border_color))\n\n\t\t\tlocal bg2 = CreateFrame(\"Frame\", nil, bg)\n\t\t\tbg2:SetPoint(\"TOPLEFT\", 1, -1)\n\t\t\tbg2:SetPoint(\"BOTTOMRIGHT\", -1, 1)\n\t\t\tbg2:CreateBorder(true, true)\n\n\t\t\tReskinColourSwatch(_G[swatchName..\"ColorSwatch\"])\n\t\tend\n\n\t\tframe.styled = true\n\tend)\n\n\tChatConfigBackgroundFrame:SetScript(\"OnShow\", function()\n\t\tReskinColourSwatch(CombatConfigColorsColorizeSpellNamesColorSwatch)\n\t\tReskinColourSwatch(CombatConfigColorsColorizeDamageNumberColorSwatch)\n\n\t\tfor i = 1, 4 do\n\t\t\tfor j = 1, 4 do\n\t\t\t\tif _G[\"CombatConfigMessageTypesLeftCheckBox\"..i] and _G[\"CombatConfigMessageTypesLeftCheckBox\"..i..\"_\"..j] then\n\t\t\t\t\tT.SkinCheckBox(_G[\"CombatConfigMessageTypesLeftCheckBox\"..i])\n\t\t\t\t\tT.SkinCheckBox(_G[\"CombatConfigMessageTypesLeftCheckBox\"..i..\"_\"..j])\n\t\t\t\tend\n\t\t\tend\n\t\t\tfor j = 1, 10 do\n\t\t\t\tif _G[\"CombatConfigMessageTypesRightCheckBox\"..i] and _G[\"CombatConfigMessageTypesRightCheckBox\"..i..\"_\"..j] then\n\t\t\t\t\tT.SkinCheckBox(_G[\"CombatConfigMessageTypesRightCheckBox\"..i])\n\t\t\t\t\tT.SkinCheckBox(_G[\"CombatConfigMessageTypesRightCheckBox\"..i..\"_\"..j])\n\t\t\t\tend\n\t\t\tend\n\t\t\tT.SkinCheckBox(_G[\"CombatConfigMessageTypesMiscCheckBox\"..i])\n\t\tend\n\tend)\n\n\tfor i = 1, #COMBAT_CONFIG_TABS do\n\t\tlocal tab = _G[\"CombatConfigTab\"..i]\n\t\tif tab then\n\t\t\ttab:StripTextures()\n\t\t\tT.SkinTab(tab, true)\n\t\t\ttab:SetHeight(tab:GetHeight() - 3)\n\t\t\ttab:ClearAllPoints()\n\t\t\tif i == 1 then\n\t\t\t\ttab:SetPoint(\"BOTTOMLEFT\", _G[\"ChatConfigBackgroundFrame\"], \"TOPLEFT\", -2, 1)\n\t\t\telse\n\t\t\t\ttab:SetPoint(\"LEFT\", _G[\"CombatConfigTab\"..i-1], \"RIGHT\", 1, 0)\n\t\t\tend\n\t\t\tlocal text = tab.Text\n\t\t\tif text then\n\t\t\t\ttext:SetWidth(text:GetWidth() + 10)\n\t\t\tend\n\t\tend\n\tend\n\tT.SkinScrollBar(ChatConfigCombatSettingsFilters.ScrollBar)\n\n\tT.SkinEditBox(_G[\"CombatConfigSettingsNameEditBox\"], nil, _G[\"CombatConfigSettingsNameEditBox\"]:GetHeight() - 2)\n\tT.SkinNextPrevButton(_G[\"ChatConfigMoveFilterUpButton\"], nil, \"Up\")\n\tT.SkinNextPrevButton(_G[\"ChatConfigMoveFilterDownButton\"], nil, \"Down\")\n\t_G[\"ChatConfigFrameDefaultButton\"]:SetWidth(125)\n\t_G[\"CombatLogDefaultButton\"]:SetWidth(125)\n\n\t_G[\"ChatConfigMoveFilterUpButton\"]:SetPoint(\"TOPLEFT\", _G[\"ChatConfigCombatSettingsFilters\"], \"BOTTOMLEFT\", 0, -1)\n\t_G[\"ChatConfigMoveFilterDownButton\"]:SetPoint(\"TOPLEFT\", _G[\"ChatConfigMoveFilterUpButton\"], \"TOPRIGHT\", 1, 0)\n\t_G[\"ChatConfigFrameDefaultButton\"]:SetPoint(\"TOP\", _G[\"ChatConfigCategoryFrame\"], \"BOTTOM\", 0, -4)\n\tChatConfigFrameRedockButton:SetPoint(\"LEFT\", ChatConfigFrameDefaultButton, \"RIGHT\", 3, 0)\n\t_G[\"ChatConfigFrameOkayButton\"]:SetPoint(\"TOPRIGHT\", _G[\"ChatConfigBackgroundFrame\"], \"BOTTOMRIGHT\", 0, -4)\n\t_G[\"CombatLogDefaultButton\"]:SetPoint(\"TOPLEFT\", _G[\"ChatConfigCategoryFrame\"], \"BOTTOMLEFT\", 0, -4)\n\t_G[\"CombatConfigSettingsSaveButton\"]:SetPoint(\"TOPLEFT\", _G[\"CombatConfigSettingsNameEditBox\"], \"TOPRIGHT\", 5, 2)\n\t_G[\"ChatConfigCombatSettingsFiltersDeleteButton\"]:SetPoint(\"TOPRIGHT\", _G[\"ChatConfigCombatSettingsFilters\"], \"BOTTOMRIGHT\", 0, -1)\n\t_G[\"ChatConfigCombatSettingsFiltersCopyFilterButton\"]:SetPoint(\"RIGHT\", _G[\"ChatConfigCombatSettingsFiltersDeleteButton\"], \"LEFT\", -3, 0)\n\t_G[\"ChatConfigCombatSettingsFiltersAddFilterButton\"]:SetPoint(\"RIGHT\", _G[\"ChatConfigCombatSettingsFiltersCopyFilterButton\"], \"LEFT\", -3, 0)\n\n\tChatConfigFrame.ToggleChatButton:SkinButton()\n\tChatConfigFrame.ToggleChatButton:ClearAllPoints()\n\tChatConfigFrame.ToggleChatButton:SetPoint(\"LEFT\", _G[\"ChatConfigFrameRedockButton\"], \"RIGHT\", 3, 0)\n\n\tT.SkinCheckBox(TextToSpeechCharacterSpecificButton, 25)\n\n\thooksecurefunc(ChatConfigFrameChatTabManager, \"UpdateWidth\", function(self)\n\t\tfor tab in self.tabPool:EnumerateActive() do\n\t\t\tif not tab.IsSkinned then\n\t\t\t\ttab:StripTextures()\n\n\t\t\t\ttab.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- TextToSpeech\n\tlocal checkBoxes = {\n\t\tTextToSpeechFramePanelContainer.PlaySoundSeparatingChatLinesCheckButton,\n\t\tTextToSpeechFramePanelContainer.AddCharacterNameToSpeechCheckButton,\n\t\tTextToSpeechFramePanelContainer.PlayActivitySoundWhenNotFocusedCheckButton,\n\t\tTextToSpeechFramePanelContainer.NarrateMyMessagesCheckButton,\n\t\tTextToSpeechFramePanelContainer.UseAlternateVoiceForSystemMessagesCheckButton\n\t}\n\n\tfor i = 1, #checkBoxes do\n\t\tT.SkinCheckBox(checkBoxes[i])\n\tend\n\n\tTextToSpeechDefaultButton:SkinButton()\n\tTextToSpeechFramePlaySampleButton:SkinButton()\n\tTextToSpeechFramePlaySampleAlternateButton:SkinButton()\n\n\tT.SkinDropDownBox(TextToSpeechFrameTtsVoiceDropdown)\n\tT.SkinDropDownBox(TextToSpeechFrameTtsVoiceAlternateDropdown)\n\n\tT.SkinSlider(TextToSpeechFrameAdjustRateSlider)\n\tT.SkinSlider(TextToSpeechFrameAdjustVolumeSlider)\n\n\thooksecurefunc(\"TextToSpeechFrame_UpdateMessageCheckboxes\", function(frame)\n\t\tlocal checkBoxTable = frame.checkBoxTable\n\t\tif checkBoxTable then\n\t\t\tlocal checkBoxNameString = frame:GetName()..\"CheckBox\"\n\t\t\tlocal checkBoxName, checkBox\n\t\t\tfor index in ipairs(checkBoxTable) do\n\t\t\t\tcheckBoxName = checkBoxNameString..index\n\t\t\t\tcheckBox = _G[checkBoxName]\n\t\t\t\tif checkBox and not checkBox.styled then\n\t\t\t\t\tT.SkinCheckBox(checkBox)\n\t\t\t\t\tcheckBox.styled = true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/ChromieTime.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tChromie Time skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = ChromieTimeFrame\n\tT.SkinCloseButton(frame.CloseButton)\n\n\tframe:StripTextures()\n\tframe:SetTemplate(\"Transparent\")\n\tframe.Background:Hide()\n\n\tframe.SelectButton:SkinButton()\n\n\tlocal Title = frame.Title\n\tTitle:DisableDrawLayer(\"BACKGROUND\")\n\n\tlocal InfoFrame = frame.CurrentlySelectedExpansionInfoFrame\n\tInfoFrame:DisableDrawLayer(\"BACKGROUND\")\n\tInfoFrame:CreateBackdrop(\"Overlay\")\n\tInfoFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -10)\n\tInfoFrame.Name:SetTextColor(1, .8, 0)\n\tInfoFrame.Description:SetTextColor(1, 1, 1)\n\n\tInfoFrame.PortraitBorder:SetAlpha(0)\n\tInfoFrame.Portrait:SetTexCoord(0.01022494887526, 0.98977505112474, 0.01968503937008, 0.98031496062992)\n\n\tInfoFrame.ArtBackdrop = CreateFrame(\"Frame\", nil, InfoFrame)\n\tInfoFrame.ArtBackdrop:SetFrameLevel(InfoFrame:GetFrameLevel() - 1)\n\tInfoFrame.ArtBackdrop:SetPoint(\"TOPLEFT\", InfoFrame.Portrait, -2, 2)\n\tInfoFrame.ArtBackdrop:SetPoint(\"BOTTOMRIGHT\", InfoFrame.Portrait, 2, -2)\n\tInfoFrame.ArtBackdrop:SetTemplate(\"Default\")\n\n\thooksecurefunc(ChromieTimeExpansionButtonMixin, \"SetupButton\", function(self)\n\t\tif not self.ArtBackdrop then\n\t\t\tself.ArtBackdrop = CreateFrame(\"Frame\", nil, self)\n\t\t\tself.ArtBackdrop:SetFrameLevel(self:GetFrameLevel() - 1)\n\t\t\tself.ArtBackdrop:SetPoint(\"TOPLEFT\", self.Background, -2, 2)\n\t\t\tself.ArtBackdrop:SetPoint(\"BOTTOMRIGHT\", self.Background, 2, -2)\n\t\t\tself.ArtBackdrop:SetTemplate(\"Default\")\n\t\t\tself.Background:SetTexCoord(0.01602564102564, 0.97109826589595, 0.02890173410405, 0.97109826589595)\n\t\t\tself:SetNormalTexture(0)\n\t\t\tif self.SetHighlightTexture then\n\t\t\t\tlocal highlight = self:CreateTexture()\n\t\t\t\thighlight:SetColorTexture(1, 1, 1, 0.3)\n\t\t\t\thighlight:SetPoint(\"TOPLEFT\", self.Background, 0, 0)\n\t\t\t\thighlight:SetPoint(\"BOTTOMRIGHT\", self.Background, 0, 0)\n\t\t\t\tself:SetHighlightTexture(highlight)\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(ChromieTimeExpansionButtonMixin, \"OnClick\", function(self)\n\t\tself:SetNormalTexture(0)\n\t\tself.ArtBackdrop:SetBackdropBorderColor(1, 1, 0)\n\tend)\n\n\thooksecurefunc(ChromieTimeExpansionButtonMixin, \"ClearSelection\", function(self)\n\t\tself:SetNormalTexture(0)\n\t\tself.ArtBackdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_ChromieTimeUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Collections.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tCollections skin\n----------------------------------------------------------------------------------------\nlocal LoadTootlipSkin = CreateFrame(\"Frame\")\nLoadTootlipSkin:RegisterEvent(\"ADDON_LOADED\")\nLoadTootlipSkin:SetScript(\"OnEvent\", function(self, _, addon)\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") or not C.tooltip.enable then\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\t\treturn\n\tend\n\tif addon == \"Blizzard_Collections\" then\n\t\tlocal tt = PetJournalPrimaryAbilityTooltip\n\t\ttt.NineSlice:SetTemplate(\"Transparent\")\n\tend\nend)\n\nif C.skins.blizzard_frames ~= true then return end\nlocal function LoadSkin()\n\tCollectionsJournal:StripTextures()\n\tCollectionsJournal:SetTemplate(\"Transparent\")\n\tCollectionsJournalPortrait:SetAlpha(0)\n\n\tfor i = 1, 5 do\n\t\tT.SkinTab(_G[\"CollectionsJournalTab\"..i])\n\tend\n\n\tlocal buttons = {\n\t\tMountJournalMountButton,\n\t\tPetJournalSummonButton,\n\t\tPetJournalFindBattle,\n\t\tPetJournalFilterButton,\n\t\tMountJournalFilterButton,\n\t\tHeirloomsJournal.FilterButton,\n\t\tToyBoxFilterButton,\n\t\tWardrobeCollectionFrame.FilterButton\n\t}\n\n\tfor i = 1, #buttons do\n\t\tbuttons[i]:SkinButton()\n\tend\n\n\tfor i = 1, 3 do\n\t\tT.SkinTab(_G[\"PetJournalParentTab\"..i])\n\tend\n\n\tT.SkinCloseButton(CollectionsJournalCloseButton)\n\n\tlocal function StyleItemButton(frame)\n\t\tframe:CreateBackdrop(\"Default\")\n\t\tframe.backdrop:SetAllPoints()\n\t\tframe:StyleButton()\n\t\t_G[frame:GetName()..\"Border\"]:Hide()\n\t\tframe.texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.texture:ClearAllPoints()\n\t\tframe.texture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tframe.texture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\t-- MountJournal\n\tMountJournal.LeftInset:StripTextures()\n\tMountJournal.RightInset:StripTextures()\n\tMountJournal.MountDisplay:StripTextures()\n\tMountJournal.MountDisplay.ShadowOverlay:StripTextures()\n\tMountJournal.MountCount:StripTextures()\n\n\tMountJournal.MountDisplay:SetPoint(\"BOTTOMRIGHT\", MountJournal.RightInset, \"BOTTOMRIGHT\", -3, 6)\n\tMountJournal.MountDisplay:CreateBackdrop(\"Overlay\")\n\tMountJournal.MountDisplay.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\tMountJournal.MountDisplay.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, -2)\n\n\tT.SkinEditBox(MountJournalSearchBox, nil, 18)\n\tT.SkinScrollBar(MountJournal.ScrollBar)\n\tT.SkinRotateButton(MountJournal.MountDisplay.ModelScene.RotateLeftButton)\n\tT.SkinRotateButton(MountJournal.MountDisplay.ModelScene.RotateRightButton)\n\n\tMountJournal.ScrollBar:SetPoint(\"TOPLEFT\", MountJournal.ScrollBox, \"TOPRIGHT\", 1, 35)\n\tMountJournal.ScrollBar:SetPoint(\"BOTTOMLEFT\", MountJournal.ScrollBox, \"BOTTOMRIGHT\", 1, 0)\n\n\tMountJournalFilterButton:SetPoint(\"TOPLEFT\", MountJournalSearchBox, \"TOPRIGHT\", 5, 2)\n\tT.SkinCloseButton(_G.MountJournalFilterButton.ResetButton)\n\t_G.MountJournalFilterButton.ResetButton:ClearAllPoints()\n\t_G.MountJournalFilterButton.ResetButton:SetPoint(\"CENTER\", _G.MountJournalFilterButton, \"TOPRIGHT\", 0, 0)\n\n\t-- New Mount Equip. 8.2\n\tMountJournal.BottomLeftInset:StripTextures()\n\tMountJournal.BottomLeftInset:CreateBackdrop(\"Overlay\")\n\tMountJournal.BottomLeftInset.backdrop:SetPoint(\"TOPLEFT\", 0, 2)\n\tMountJournal.BottomLeftInset:SetPoint(\"BOTTOMLEFT\", 0, 32)\n\tMountJournal.BottomLeftInset.SlotButton:StripTextures()\n\tMountJournal.BottomLeftInset.SlotButton.ItemIcon:SkinIcon()\n\n\tT.SkinCheckBox(MountJournal.MountDisplay.ModelScene.TogglePlayer, 26)\n\n\thooksecurefunc(MountJournal.ScrollBox, \"Update\", function(frame)\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not button.isSkinned then\n\t\t\t\tbutton:GetRegions():Hide()\n\t\t\t\tbutton.selectedTexture:SetTexture(nil)\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tbutton:StyleButton(nil, 4)\n\n\t\t\t\tbutton.DragButton:CreateBackdrop(\"Default\")\n\t\t\t\tbutton.DragButton.backdrop:SetPoint(\"TOPLEFT\", -1, 1)\n\t\t\t\tbutton.DragButton.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, -1)\n\t\t\t\tbutton.DragButton:StyleButton(nil, 1)\n\t\t\t\tbutton.DragButton.ActiveTexture:SetColorTexture(0, 1, 0, 0.3)\n\t\t\t\tbutton.DragButton.ActiveTexture:SetPoint(\"TOPLEFT\", 1, -1)\n\t\t\t\tbutton.DragButton.ActiveTexture:SetPoint(\"BOTTOMRIGHT\", -1, 1)\n\n\t\t\t\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tbutton.icon:ClearAllPoints()\n\n\t\t\t\tif i == 1 then\n\t\t\t\t\tbutton.icon:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMLEFT\", -3, 3)\n\t\t\t\telse\n\t\t\t\t\tbutton.icon:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMLEFT\", -3, 4)\n\t\t\t\tend\n\n\t\t\t\tbutton.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal function ColorSelectedMount(button)\n\t\tif button and button.backdrop then\n\t\t\tif button.selectedTexture:IsShown() then\n\t\t\t\tbutton.name:SetTextColor(1, 1, 0)\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(1, 1, 0)\n\t\t\t\tbutton.DragButton.backdrop:SetBackdropBorderColor(1, 1, 0)\n\t\t\telse\n\t\t\t\tbutton.name:SetTextColor(1, 1, 1)\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\tbutton.DragButton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(\"MountJournal_InitMountButton\", ColorSelectedMount)\n\n\tStyleItemButton(MountJournalSummonRandomFavoriteButton)\n\n\tdo\n\t\tlocal button = MountJournal.MountDisplay.InfoButton\n\t\tlocal icon = MountJournal.MountDisplay.InfoButton.Icon\n\t\tbutton:CreateBackdrop(\"Default\")\n\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", icon, -2, 2)\n\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", icon, 2, -2)\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\n\n\t-- PetJournal\n\tPetJournal.LeftInset:StripTextures()\n\tPetJournal.RightInset:StripTextures()\n\tPetJournal.PetCardInset:StripTextures()\n\tPetJournal.loadoutBorder:StripTextures()\n\tPetJournalPetCardBG:Hide()\n\tPetJournalAchievementStatus:DisableDrawLayer(\"BACKGROUND\")\n\n\tPetJournalTutorialButton.Ring:Hide()\n\tPetJournalTutorialButton:SetPoint(\"TOPLEFT\", PetJournal, \"TOPLEFT\", -5, 10)\n\n\tPetJournal.PetCount:StripTextures()\n\tT.SkinEditBox(PetJournalSearchBox, nil, 18)\n\n\tPetJournalFilterButton:SetPoint(\"TOPLEFT\", PetJournalSearchBox, \"TOPRIGHT\", 5, 2)\n\tT.SkinCloseButton(_G.PetJournalFilterButton.ResetButton)\n\t_G.PetJournalFilterButton.ResetButton:ClearAllPoints()\n\t_G.PetJournalFilterButton.ResetButton:SetPoint(\"CENTER\", _G.PetJournalFilterButton, \"TOPRIGHT\", 0, 0)\n\n\tPetJournalLoadoutBorderSlotHeaderText:SetParent(PetJournal)\n\tPetJournalLoadoutBorderSlotHeaderText:SetPoint(\"CENTER\", PetJournalLoadoutBorderTop, \"TOP\", 0, 4)\n\n\tPetJournal.ScrollBar:SetPoint(\"TOPLEFT\", PetJournal.ScrollBox, \"TOPRIGHT\", 1, 35)\n\tPetJournal.ScrollBar:SetPoint(\"BOTTOMLEFT\", PetJournal.ScrollBox, \"BOTTOMRIGHT\", 1, -2)\n\tT.SkinScrollBar(PetJournal.ScrollBar)\n\n\thooksecurefunc(PetJournal.ScrollBox, \"Update\", function(frame)\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tlocal name = button.name\n\n\t\t\tif not button.isSkinned then\n\t\t\t\tbutton:GetRegions():Hide()\n\t\t\t\tbutton.selectedTexture:SetTexture(nil)\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tbutton:StyleButton(nil, 4)\n\n\t\t\t\tbutton.dragButton:CreateBackdrop(\"Default\")\n\t\t\t\tbutton.dragButton.backdrop:SetPoint(\"TOPLEFT\", -1, 1)\n\t\t\t\tbutton.dragButton.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, -1)\n\t\t\t\tbutton.dragButton:StyleButton(nil, 1)\n\t\t\t\tbutton.dragButton.ActiveTexture:SetColorTexture(0, 1, 0, 0.3)\n\t\t\t\tbutton.dragButton.ActiveTexture:SetPoint(\"TOPLEFT\", 1, -1)\n\t\t\t\tbutton.dragButton.ActiveTexture:SetPoint(\"BOTTOMRIGHT\", -1, 1)\n\t\t\t\tbutton.dragButton.favorite:SetParent(button.dragButton.backdrop)\n\t\t\t\tbutton.dragButton.levelBG:SetAlpha(0)\n\n\t\t\t\tbutton.petTypeIcon:SetParent(button.backdrop)\n\t\t\t\tbutton.petTypeIcon:SetDrawLayer(\"OVERLAY\")\n\t\t\t\tbutton.isDead:SetParent(button.dragButton.backdrop)\n\n\t\t\t\tname:SetParent(button.backdrop)\n\n\t\t\t\tbutton.dragButton.level:SetParent(button.dragButton.backdrop)\n\t\t\t\tbutton.dragButton.level:SetFontObject(\"SystemFont_Outline_Small\")\n\t\t\t\tbutton.dragButton.level:SetDrawLayer(\"OVERLAY\")\n\n\t\t\t\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tbutton.icon:SetDrawLayer(\"ARTWORK\")\n\t\t\t\tbutton.icon:SetParent(button.dragButton.backdrop)\n\t\t\t\tbutton.icon:ClearAllPoints()\n\t\t\t\tbutton.icon:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMLEFT\", -3, 4)\n\n\t\t\t\tbutton.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal function ColorSelectedPet(button, elementData)\n\t\tif not button or not button.backdrop then return end\n\t\tlocal index = elementData.index\n\t\tlocal petID, _, isOwned = C_PetJournal.GetPetInfoByIndex(index)\n\n\t\tif petID and isOwned then\n\t\t\tlocal _, _, _, _, rarity = C_PetJournal.GetPetStats(petID)\n\n\t\t\tif rarity then\n\t\t\t\tlocal color = ITEM_QUALITY_COLORS[rarity-1]\n\t\t\t\tbutton.name:SetTextColor(color.r, color.g, color.b)\n\t\t\t\tbutton.dragButton.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)\n\t\t\telse\n\t\t\t\tbutton.name:SetTextColor(1, 1, 1)\n\t\t\t\tbutton.dragButton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend\n\t\telse\n\t\t\tbutton.name:SetTextColor(0.5, 0.5, 0.5)\n\t\tend\n\n\t\tif button.selectedTexture:IsShown() then\n\t\t\tbutton.backdrop:SetBackdropBorderColor(1, 1, 0)\n\t\t\tbutton.dragButton.backdrop:SetBackdropBorderColor(1, 1, 0)\n\t\telse\n\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tbutton.dragButton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\tend\n\n\thooksecurefunc(\"PetJournal_InitPetButton\", ColorSelectedPet)\n\n\tStyleItemButton(PetJournalHealPetButton)\n\tStyleItemButton(PetJournalSummonRandomFavoritePetButton)\n\n\tfor i = 1, 3 do\n\t\tlocal button = _G[\"PetJournalLoadoutPet\"..i]\n\n\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", -2, 0)\n\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 5, 0)\n\n\t\tbutton.dragButton:CreateBackdrop(\"Default\")\n\t\tbutton.dragButton.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\t\tbutton.dragButton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\t\tbutton.dragButton:StyleButton()\n\n\t\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton.icon:SetSize(36, 36)\n\n\t\tbutton.level:SetParent(button.dragButton.backdrop)\n\t\tbutton.level:SetFontObject(\"SystemFont_Outline_Small\")\n\t\tbutton.level:ClearAllPoints()\n\t\tbutton.level:SetPoint(\"BOTTOMRIGHT\", -2, 3)\n\n\t\thooksecurefunc(button.qualityBorder, \"SetVertexColor\", function(_, r, g, b)\n\t\t\tbutton.name:SetTextColor(r, g, b)\n\t\tend)\n\n\t\tfor j = 1, 3 do\n\t\t\tlocal spell = button[\"spell\"..j]\n\n\t\t\tspell:StyleButton()\n\t\t\tspell:SetTemplate(\"Default\")\n\n\t\t\tspell.BlackCover:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tspell.BlackCover:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\tspell.FlyoutArrow:SetTexture(\"Interface\\\\Buttons\\\\ActionBarFlyoutButton\")\n\n\t\t\tspell.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tspell.icon:ClearAllPoints()\n\t\t\tspell.icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tspell.icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\t_G[\"PetJournalLoadoutPet\"..i..\"Spell\"..j..\"Background\"]:SetTexture(nil)\n\t\t\t_G[\"PetJournalLoadoutPet\"..i..\"Spell\"..j..\"Selected\"]:SetTexture(nil)\n\t\tend\n\n\t\tbutton.iconBorder:SetAlpha(0)\n\t\tbutton.qualityBorder:SetTexture(\"\")\n\t\tbutton.levelBG:SetAlpha(0)\n\t\tbutton.helpFrame:StripTextures()\n\n\t\t _G[\"PetJournalLoadoutPet\"..i..\"BG\"]:Hide()\n\n\t\tbutton.petTypeIcon:ClearAllPoints()\n\t\tbutton.petTypeIcon:SetPoint(\"BOTTOMLEFT\", button.backdrop, 2, 2)\n\n\t\tbutton.healthFrame.healthBar:StripTextures()\n\t\tbutton.healthFrame.healthBar:CreateBackdrop(\"Overlay\")\n\t\tbutton.healthFrame.healthBar:SetStatusBarTexture(C.media.texture)\n\n\t\tbutton.xpBar:StripTextures()\n\t\tbutton.xpBar:CreateBackdrop(\"Overlay\")\n\t\tbutton.xpBar:SetStatusBarTexture(C.media.texture)\n\t\tbutton.xpBar:SetFrameLevel(button.xpBar:GetFrameLevel() + 2)\n\tend\n\n\tPetJournal.SpellSelect.BgEnd:Hide()\n\tPetJournal.SpellSelect.BgTiled:Hide()\n\n\tfor i = 1, 2 do\n\t\tlocal button = _G[\"PetJournalSpellSelectSpell\"..i]\n\t\tlocal icon = _G[\"PetJournalSpellSelectSpell\"..i..\"Icon\"]\n\n\t\tbutton:StyleButton()\n\t\tbutton:SetTemplate(\"Default\")\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\ticon:SetDrawLayer(\"OVERLAY\")\n\n\t\tbutton.BlackCover:SetDrawLayer(\"OVERLAY\", 1)\n\tend\n\n\tfor i = 1, 6 do\n\t\tlocal button = _G[\"PetJournalPetCardSpell\"..i]\n\n\t\tbutton:StyleButton()\n\t\tbutton:SetTemplate(\"Default\")\n\n\t\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton.icon:ClearAllPoints()\n\t\tbutton.icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tbutton.icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tPetJournalPetCard.AbilitiesBG1:SetAlpha(0)\n\tPetJournalPetCard.AbilitiesBG2:SetAlpha(0)\n\tPetJournalPetCard.AbilitiesBG3:SetAlpha(0)\n\n\tPetJournalPetCard:CreateBackdrop(\"Overlay\")\n\tPetJournalPetCard.backdrop:SetPoint(\"TOPLEFT\", 0, -2)\n\tPetJournalPetCard.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, -2)\n\n\tPetJournalPetCardPetInfo:SetPoint(\"TOPLEFT\", PetJournalPetCard.backdrop, 2, -2)\n\tPetJournalPetCardPetInfo:CreateBackdrop(\"Default\")\n\tPetJournalPetCardPetInfo.backdrop:SetPoint(\"TOPLEFT\", PetJournalPetCardPetInfoIcon, -2, 2)\n\tPetJournalPetCardPetInfo.backdrop:SetPoint(\"BOTTOMRIGHT\", PetJournalPetCardPetInfoIcon, 2, -2)\n\n\tPetJournalPetCardPetInfoIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\tPetJournalPetCardPetInfoLevelBubble:SetTexture(nil)\n\tPetJournalPetCardPetInfoLevel:SetFontObject(\"SystemFont_Outline_Small\")\n\n\tPetJournalPetCardPetInfoQualityBorder:SetTexture(nil)\n\n\tPetJournalPetCardHealthFrame.healthBar:StripTextures()\n\tPetJournalPetCardHealthFrame.healthBar:CreateBackdrop(\"Overlay\")\n\tPetJournalPetCardHealthFrame.healthBar:SetStatusBarTexture(C.media.texture)\n\n\tPetJournalPetCardXPBar:StripTextures()\n\tPetJournalPetCardXPBar:CreateBackdrop(\"Overlay\")\n\tPetJournalPetCardXPBar:SetStatusBarTexture(C.media.texture)\n\tPetJournalPetCardXPBar:SetPoint(\"BOTTOM\", PetJournalPetCard.backdrop, \"BOTTOM\", 0, 6)\n\tPetJournalPetCardXPBar:SetFrameLevel(PetJournalPetCardXPBar:GetFrameLevel() + 2)\n\n\thooksecurefunc(PetJournalPetCardPetInfo.qualityBorder, \"SetVertexColor\", function(_, r, g, b)\n\t\tPetJournalPetCardPetInfo.name:SetTextColor(r, g, b)\n\tend)\n\n\t-- ToyBox\n\tToyBox.iconsFrame:StripTextures()\n\tT.SkinEditBox(ToyBox.searchBox, nil, 18)\n\tT.SkinNextPrevButton(ToyBox.PagingFrame.PrevPageButton)\n\tT.SkinNextPrevButton(ToyBox.PagingFrame.NextPageButton)\n\tToyBox.progressBar:StripTextures()\n\tToyBox.progressBar:CreateBackdrop(\"Overlay\")\n\tToyBox.progressBar:SetStatusBarTexture(C.media.texture)\n\tToyBox.progressBar:SetFrameLevel(ToyBox.progressBar:GetFrameLevel() + 2)\n\n\tToyBoxFilterButton:SetPoint(\"TOPLEFT\", ToyBox.searchBox, \"TOPRIGHT\", 5, 2)\n\tT.SkinCloseButton(_G.ToyBoxFilterButton.ResetButton)\n\t_G.ToyBoxFilterButton.ResetButton:ClearAllPoints()\n\t_G.ToyBoxFilterButton.ResetButton:SetPoint(\"CENTER\", _G.ToyBoxFilterButton, \"TOPRIGHT\", 0, 0)\n\n\tfor i = 1, 18 do\n\t\tToyBox.iconsFrame[\"spellButton\"..i].slotFrameCollected:SetTexture(\"\")\n\t\tToyBox.iconsFrame[\"spellButton\"..i].slotFrameUncollected:SetTexture(\"\")\n\t\tlocal button = ToyBox.iconsFrame[\"spellButton\"..i]\n\t\tlocal icon = ToyBox.iconsFrame[\"spellButton\"..i].iconTexture\n\t\tlocal uicon = ToyBox.iconsFrame[\"spellButton\"..i].iconTextureUncollected\n\n\t\tbutton:StyleButton(nil, 0)\n\t\tbutton:CreateBackdrop(\"Default\")\n\t\tbutton.cooldown:SetAllPoints(icon)\n\n\t\ticon:SetPoint(\"TOPLEFT\")\n\t\ticon:SetPoint(\"BOTTOMRIGHT\")\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\tuicon:SetPoint(\"TOPLEFT\")\n\t\tuicon:SetPoint(\"BOTTOMRIGHT\")\n\t\tuicon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\n\n\t-- Heirlooms\n\tHeirloomsJournal.iconsFrame:StripTextures()\n\tT.SkinEditBox(HeirloomsJournal.SearchBox, nil, 18)\n\tT.SkinNextPrevButton(HeirloomsJournal.PagingFrame.PrevPageButton)\n\tT.SkinNextPrevButton(HeirloomsJournal.PagingFrame.NextPageButton)\n\tHeirloomsJournal.progressBar:StripTextures()\n\tHeirloomsJournal.progressBar:CreateBackdrop(\"Overlay\")\n\tHeirloomsJournal.progressBar:SetStatusBarTexture(C.media.texture)\n\tHeirloomsJournal.progressBar:SetFrameLevel(HeirloomsJournal.progressBar:GetFrameLevel() + 2)\n\tT.SkinDropDownBox(HeirloomsJournalClassDropDown, 170)\n\n\tHeirloomsJournal.FilterButton:SetPoint(\"TOPLEFT\", HeirloomsJournal.SearchBox, \"TOPRIGHT\", 5, 2)\n\tT.SkinCloseButton(_G.HeirloomsJournal.FilterButton.ResetButton)\n\t_G.HeirloomsJournal.FilterButton.ResetButton:ClearAllPoints()\n\t_G.HeirloomsJournal.FilterButton.ResetButton:SetPoint(\"CENTER\", _G.HeirloomsJournal.FilterButton, \"TOPRIGHT\", 0, 0)\n\n\thooksecurefunc(HeirloomsJournal, \"LayoutCurrentPage\", function(self)\n\t\tfor i = 1, #self.heirloomHeaderFrames do\n\t\t\tlocal header = self.heirloomHeaderFrames[i]\n\t\t\tif not header.styled then\n\t\t\t\theader.text:SetTextColor(0.9, 0.8, 0.5)\n\t\t\t\theader.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(HeirloomsJournal, \"UpdateButton\", function(_, button)\n\t\tif not button.styled then\n\t\t\tbutton:StyleButton(nil, 0)\n\t\t\tbutton:CreateBackdrop(\"Default\")\n\n\t\t\thooksecurefunc(button.level, \"SetFontObject\", function(self, font)\n\t\t\t\tif font ~= \"SystemFont_Outline_Small\" then\n\t\t\t\t\tself:SetFontObject(\"SystemFont_Outline_Small\")\n\t\t\t\t\tself:SetTextColor(1, 1, 1)\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tbutton.levelBackground:SetAlpha(0)\n\n\t\t\tbutton.slotFrameCollected:SetTexture(\"\")\n\t\t\tbutton.slotFrameUncollected:SetTexture(\"\")\n\n\t\t\tbutton.iconTexture:SetPoint(\"TOPLEFT\")\n\t\t\tbutton.iconTexture:SetPoint(\"BOTTOMRIGHT\")\n\t\t\tbutton.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\tbutton.iconTextureUncollected:SetPoint(\"TOPLEFT\")\n\t\t\tbutton.iconTextureUncollected:SetPoint(\"BOTTOMRIGHT\")\n\t\t\tbutton.iconTextureUncollected:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\tbutton.styled = true\n\t\tend\n\n\t\tif C_Heirloom.PlayerHasHeirloom(button.itemID) then\n\t\t\tbutton.name:SetTextColor(0.9, 0.8, 0.5)\n\t\telse\n\t\t\tbutton.name:SetTextColor(0.6, 0.6, 0.6)\n\t\tend\n\tend)\n\n\t-- Wardrobe\n\tWardrobeFrame:StripTextures()\n\tWardrobeFrame:SetTemplate(\"Transparent\")\n\tT.SkinCloseButton(WardrobeFrameCloseButton)\n\tT.SkinDropDownBox(WardrobeOutfitDropDown)\n\tWardrobeOutfitDropDown:SetSize(221, 34)\n\tWardrobeOutfitDropDown.SaveButton:SkinButton()\n\tWardrobeOutfitDropDown.SaveButton:SetPoint(\"TOPLEFT\", WardrobeOutfitDropDown, \"TOPRIGHT\", -2, -2)\n\tWardrobeTransmogFrame:StripTextures()\n\tWardrobeTransmogFrame.Inset:StripTextures()\n\tWardrobeTransmogFrame.SpecButton:SkinButton()\n\tWardrobeTransmogFrame.ApplyButton:SkinButton()\n\tWardrobeTransmogFrame.SpecButton:SetPoint(\"RIGHT\", WardrobeTransmogFrame.ApplyButton, \"LEFT\", -2, 0)\n\tWardrobeTransmogFrame.ModelScene.ClearAllPendingButton:SkinButton()\n\tT.SkinCheckBox(WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox)\n\n\tWardrobeCollectionFrame.FilterButton:SetPoint(\"TOPLEFT\", WardrobeCollectionFrameSearchBox, \"TOPRIGHT\", 5, 2)\n\tT.SkinCloseButton(WardrobeCollectionFrame.FilterButton.ResetButton)\n\tWardrobeCollectionFrame.FilterButton.ResetButton:ClearAllPoints()\n\tWardrobeCollectionFrame.FilterButton.ResetButton:SetPoint(\"CENTER\", WardrobeCollectionFrame.FilterButton, \"TOPRIGHT\", 0, 0)\n\tWardrobeCollectionFrame.FilterButton:SetWidth(90)\n\n\tfor i = 1, #WardrobeTransmogFrame.SlotButtons do\n\t\tlocal slot = WardrobeTransmogFrame.SlotButtons[i]\n\t\tlocal icon = slot.Icon\n\t\tlocal border = slot.Border\n\n\t\tif slot then\n\t\t\tborder:Kill()\n\n\t\t\tslot:StyleButton()\n\t\t\tslot:SetFrameLevel(slot:GetFrameLevel() + 2)\n\t\t\tslot:CreateBackdrop(\"Default\")\n\t\t\tslot.backdrop:SetAllPoints()\n\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ticon:ClearAllPoints()\n\t\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tend\n\tend\n\n\tWardrobeCollectionFrame.ItemsCollectionFrame:StripTextures()\n\tWardrobeCollectionFrame.SetsTransmogFrame:StripTextures()\n\tWardrobeCollectionFrame.progressBar:StripTextures()\n\tWardrobeCollectionFrame.progressBar:CreateBackdrop(\"Overlay\")\n\tWardrobeCollectionFrame.progressBar:SetStatusBarTexture(C.media.texture)\n\tWardrobeCollectionFrame.progressBar:SetFrameLevel(WardrobeCollectionFrame.progressBar:GetFrameLevel() + 2)\n\tT.SkinEditBox(WardrobeCollectionFrameSearchBox, nil, 18)\n\tWardrobeCollectionFrameSearchBox:SetFrameLevel(WardrobeCollectionFrameSearchBox:GetFrameLevel() + 2)\n\tT.SkinDropDownBox(WardrobeCollectionFrameWeaponDropDown, 170)\n\tT.SkinNextPrevButton(WardrobeCollectionFrame.ItemsCollectionFrame.PagingFrame.PrevPageButton)\n\tT.SkinNextPrevButton(WardrobeCollectionFrame.ItemsCollectionFrame.PagingFrame.NextPageButton)\n\tT.SkinNextPrevButton(WardrobeCollectionFrame.SetsTransmogFrame.PagingFrame.PrevPageButton)\n\tT.SkinNextPrevButton(WardrobeCollectionFrame.SetsTransmogFrame.PagingFrame.NextPageButton)\n\n\tWardrobeCollectionFrame.SetsCollectionFrame.LeftInset:StripTextures()\n\tWardrobeCollectionFrame.SetsCollectionFrame.RightInset:StripTextures()\n\tWardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame:StripTextures()\n\tWardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame:CreateBackdrop(\"Overlay\")\n\tWardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame.backdrop:SetPoint(\"TOPLEFT\", 4, -4)\n\tWardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, 4)\n\tWardrobeSetsCollectionVariantSetsButton:SkinButton()\n\tT.SkinScrollBar(WardrobeCollectionFrame.SetsCollectionFrame.ListContainer.ScrollBar)\n\tWardrobeCollectionFrame.SetsCollectionFrame.ListContainer.ScrollBar:SetPoint(\"TOPLEFT\", WardrobeCollectionFrame.SetsCollectionFrame.ListContainer, \"TOPRIGHT\", 2, 33)\n\tWardrobeCollectionFrame.SetsCollectionFrame.ListContainer.ScrollBar:SetPoint(\"BOTTOMLEFT\", WardrobeCollectionFrame.SetsCollectionFrame.ListContainer, \"BOTTOMRIGHT\", 2, -4)\n\n\tlocal function SetItemQuality(_, itemFrame)\n\t\tif (itemFrame.backdrop) then\n\t\t\tlocal _, _, quality = GetItemInfo(itemFrame.itemID);\n\t\t\tlocal alpha = 1\n\t\t\tif (not itemFrame.collected) then\n\t\t\t\talpha = 0.4\n\t\t\tend\n\n\t\t\tif (not quality or quality < 2) then -- Not collected or item is white or grey\n\t\t\t\titemFrame.backdrop:SetBackdropBorderColor(0, 0, 0)\n\t\t\telse\n\t\t\t\titemFrame.backdrop:SetBackdropBorderColor(ITEM_QUALITY_COLORS[quality].r, ITEM_QUALITY_COLORS[quality].g, ITEM_QUALITY_COLORS[quality].b, alpha)\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(WardrobeCollectionFrame.SetsCollectionFrame, \"SetItemFrameQuality\", SetItemQuality)\n\n\n\tfor i = 1, 2 do\n\t\tT.SkinTab(_G[\"WardrobeCollectionFrameTab\"..i], true)\n\tend\n\n\thooksecurefunc(WardrobeCollectionFrame.SetsCollectionFrame.ListContainer.ScrollBox, \"Update\", function(frame)\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not button.isSkinned then\n\t\t\t\tbutton:GetRegions():Hide()\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tbutton:StyleButton(nil, 4)\n\n\t\t\t\tbutton.HighlightTexture:SetTexture(nil)\n\t\t\t\tbutton.SelectedTexture:SetTexture(nil)\n\n\t\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\t\tbutton.border = CreateFrame(\"Frame\", nil, button)\n\t\t\t\tbutton.border:CreateBackdrop(\"Default\")\n\t\t\t\tbutton.border.backdrop:SetPoint(\"TOPLEFT\", button.Icon, -2, 2)\n\t\t\t\tbutton.border.backdrop:SetPoint(\"BOTTOMRIGHT\", button.Icon, 2, -2)\n\n\t\t\t\tbutton.ProgressBar:SetPoint(\"TOPLEFT\", button.backdrop, \"BOTTOMLEFT\", 2, 4)\n\n\t\t\t\tbutton.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal function ColorSelectedSet(button)\n\t\tif not button or not button.backdrop then return end\n\t\tif button.SelectedTexture:IsShown() then\n\t\t\tbutton.backdrop:SetBackdropBorderColor(1, 1, 0)\n\t\t\tbutton.border.backdrop:SetBackdropBorderColor(1, 1, 0)\n\t\telse\n\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tbutton.border.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\tend\n\thooksecurefunc(WardrobeSetsScrollFrameButtonMixin, \"SetSelected\", ColorSelectedSet)\n\n\thooksecurefunc(WardrobeCollectionFrame.SetsCollectionFrame, \"DisplaySet\", function()\n\t\tfor _, child in ipairs({WardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame:GetChildren()}) do\n\t\t\tif child.Icon and not child.isSkinned then\n\t\t\t\tchild.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\t\tchild:CreateBackdrop(\"Default\")\n\t\t\t\tchild.backdrop:SetPoint(\"TOPLEFT\", child.Icon, -2, 2)\n\t\t\t\tchild.backdrop:SetPoint(\"BOTTOMRIGHT\", child.Icon, 2, -2)\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tfor i = 1, #WardrobeCollectionFrame.ItemsCollectionFrame.Models do\n\t\tlocal model = WardrobeCollectionFrame.ItemsCollectionFrame.Models[i]\n\t\tmodel.Border:SetAlpha(0)\n\t\tlocal bg = CreateFrame(\"Frame\", nil, model)\n\t\tbg:CreateBackdrop(\"Overlay\")\n\t\tbg.backdrop:SetOutside(model, 3, 3)\n\n\t\thooksecurefunc(model.Border, 'SetAtlas', function(_, texture)\n\t\t\tlocal color\n\t\t\tif texture == \"transmog-wardrobe-border-uncollected\" then\n\t\t\t\tcolor = {0.3, 0.3, 1}\n\t\t\telseif texture == \"transmog-wardrobe-border-unusable\" then\n\t\t\t\tcolor = {0.8, 0, 0}\n\t\t\telse\n\t\t\t\tcolor = C.media.border_color\n\t\t\tend\n\t\t\tbg.backdrop:SetBackdropBorderColor(unpack(color))\n\t\tend)\n\tend\n\n\tfor i = 1, #WardrobeCollectionFrame.SetsTransmogFrame.Models do\n\t\tlocal model = WardrobeCollectionFrame.SetsTransmogFrame.Models[i]\n\t\tmodel.Border:SetAlpha(0)\n\t\tlocal bg = CreateFrame(\"Frame\", nil, model)\n\t\tbg:CreateBackdrop(\"Overlay\")\n\t\tbg.backdrop:SetOutside(model, 3, 3)\n\tend\n\n\tlocal function SkinSetItemButtons(self)\n\t\tfor itemFrame in self.DetailsFrame.itemFramesPool:EnumerateActive() do\n\t\t\titemFrame.IconBorder:SetAlpha(0)\n\t\t\tSetItemQuality(self, itemFrame)\n\t\tend\n\tend\n\thooksecurefunc(WardrobeCollectionFrame.SetsCollectionFrame, \"DisplaySet\", SkinSetItemButtons)\n\n\t-- Help box\n\tlocal HelpBox = {\n\t\tToyBox.favoriteHelpBox,\n\t\tWardrobeCollectionFrame.ItemsCollectionFrame.HelpBox,\n\t\tWardrobeCollectionFrame.SetsTabHelpBox,\n\t\tWardrobeTransmogFrame.SpecHelpBox,\n\t\tWardrobeTransmogFrame.OutfitHelpBox\n\t}\n\n\tfor i = 1, #HelpBox do\n\t\tlocal frame = HelpBox[i]\n\t\tT.SkinHelpBox(frame)\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_Collections\"] = LoadSkin\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Communities.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCommunities skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tCommunitiesFrameCommunitiesList.ScrollBar:GetChildren():Hide()\n\tCommunitiesFrame.MemberList.ScrollBar:GetChildren():Hide()\n\tCommunitiesFrameGuildDetailsFrameNews.ScrollBar:GetChildren():Hide()\n\tCommunitiesFrame.ApplicantList.ScrollBar:GetChildren():Hide()\n\n\tlocal scrollbars = {\n\t\tClubFinderCommunityAndGuildFinderFrame.CommunityCards.ScrollBar,\n\t\tClubFinderCommunityAndGuildFinderFrame.PendingCommunityCards.ScrollBar,\n\t\tCommunitiesAvatarPickerDialog.ScrollBar,\n\t\tCommunitiesFrame.Chat.MessageFrame.ScrollBar,\n\t\tCommunitiesFrame.GuildBenefitsFrame.Rewards.ScrollBar,\n\t\tCommunitiesFrame.MemberList.ScrollBar,\n\t\tCommunitiesFrame.NotificationSettingsDialog.ScrollFrame.ScrollBar,\n\t\tCommunitiesFrame.RecruitmentDialog.RecruitmentMessageFrame.RecruitmentMessageInput.ScrollBar,\n\t\tCommunitiesFrameCommunitiesList.ScrollBar,\n\t\tCommunitiesFrameGuildDetailsFrameInfoScrollBar,\n\t\tCommunitiesFrameGuildDetailsFrameNews.ScrollBar,\n\t\tCommunitiesFrameGuildDetailsFrameNews.ScrollBar,\n\t\tCommunitiesGuildLogFrameScrollBar,\n\t\tCommunitiesGuildTextEditFrameScrollBar,\n\t\tCommunitiesFrame.ApplicantList.ScrollBar\n\t}\n\n\tfor i = 1, #scrollbars do\n\t\tT.SkinScrollBar(scrollbars[i])\n\tend\n\n\tlocal closeButton = {\n\t\tCommunitiesGuildNewsFiltersFrame.CloseButton,\n\t\tCommunitiesGuildLogFrameCloseButton,\n\t\tCommunitiesFrameCloseButton,\n\t\tCommunitiesFrame.GuildMemberDetailFrame.CloseButton,\n\t\tCommunitiesGuildTextEditFrameCloseButton\n\t}\n\n\tfor i = 1, #closeButton do\n\t\tT.SkinCloseButton(closeButton[i])\n\tend\n\n\t-- General Communities Frame\n\tCommunitiesFrame:StripTextures()\n\tCommunitiesFrame:CreateBackdrop(\"Transparent\")\n\tCommunitiesFrame.NineSlice:Hide()\n\tCommunitiesFrame.PortraitOverlay:Kill()\n\tCommunitiesFrameCommunitiesList:StripTextures()\n\n\tT.SkinMaxMinFrame(CommunitiesFrame.MaximizeMinimizeFrame, CommunitiesFrameCloseButton)\n\n\tCommunitiesFrame.InviteButton:SkinButton()\n\n\tCommunitiesFrame.Chat.InsetFrame.NineSlice:Hide()\n\tCommunitiesFrame.Chat.InsetFrame:SetTemplate(\"Overlay\")\n\tCommunitiesFrame.ChatTab:SetPoint(\"TOPLEFT\", CommunitiesFrame, \"TOPRIGHT\", 5, -36)\n\n\thooksecurefunc(CommunitiesFrame.Chat.MessageFrame.ScrollBar, \"SetPoint\", function(self, point, anchor, attachTo, x, y)\n\t\tif anchor == CommunitiesFrame.Chat.MessageFrame and x == 10 and y == -11 then\n\t\t\tself:SetPoint(point, anchor, attachTo, 11, -7)\n\t\telseif anchor == CommunitiesFrame.Chat.MessageFrame and x == 10 and y == -17 then\n\t\t\tself:SetPoint(point, anchor, attachTo, 11, -14)\n\t\tend\n\tend)\n\n\t-- CommunitiesFrame.MemberList.ScrollBar:SetPoint(\"BOTTOMLEFT\", CommunitiesFrame.MemberList, \"BOTTOMRIGHT\", 0, 14)\n\tCommunitiesFrame.MemberList:SetPoint(\"BOTTOMRIGHT\", CommunitiesFrame, \"BOTTOMRIGHT\", -26, 31)\n\n\thooksecurefunc(CommunitiesFrame.ChatEditBox, \"SetPoint\", function(self, point, anchor, attachTo, x, y)\n\t\tif point == \"BOTTOMLEFT\" and x == 10 and y == 0 then\n\t\t\tself:SetPoint(point, anchor, attachTo, 12, 5)\n\t\telseif point == \"BOTTOMRIGHT\" and x == -12 and y == 0 then\n\t\t\tself:SetPoint(point, anchor, attachTo, -10, 5)\n\t\tend\n\tend)\n\n\tCommunitiesFrameCommunitiesList.ScrollBar:SetPoint(\"TOPLEFT\", CommunitiesFrameCommunitiesList, \"TOPRIGHT\", -3, 0)\n\tCommunitiesFrameCommunitiesList.ScrollBar:SetPoint(\"BOTTOMLEFT\", CommunitiesFrameCommunitiesList, \"BOTTOMRIGHT\", -3, -2)\n\n\tT.SkinEditBox(CommunitiesFrame.ChatEditBox, nil, 18)\n\n\tT.SkinDropDownBox(CommunitiesFrame.StreamDropDownMenu, nil, true)\n\tT.SkinDropDownBox(CommunitiesFrame.CommunitiesListDropDownMenu)\n\n\tCommunitiesFrame.AddToChatButton:SkinButton()\n\tCommunitiesFrame.CommunitiesControlFrame.CommunitiesSettingsButton:SkinButton()\n\n\thooksecurefunc(CommunitiesListEntryMixin, \"Init\", function(self, elementData)\n\t\tlocal clubInfo = elementData.clubInfo\n\t\tif clubInfo then\n\t\t\tself:SetSize(166, 65)\n\t\t\tself.Background:Hide()\n\t\t\tself:SetFrameLevel(self:GetFrameLevel() + 5)\n\n\t\t\tself.Icon:RemoveMaskTexture(self.CircleMask)\n\t\t\tself.Icon:SetDrawLayer(\"OVERLAY\", 1)\n\t\t\tself.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tself.IconRing:Hide()\n\n\t\t\tif not self.bg then\n\t\t\t\tself.bg = CreateFrame(\"Frame\", nil, self)\n\t\t\t\tself.bg:CreateBackdrop(\"Overlay\")\n\t\t\t\tself.bg:SetFrameLevel(self:GetFrameLevel() - 2)\n\t\t\t\tself.bg:SetPoint(\"TOPLEFT\", 4, -3)\n\t\t\t\tself.bg:SetPoint(\"BOTTOMRIGHT\", -4, 3)\n\t\t\tend\n\n\t\t\tlocal isGuild = clubInfo.clubType == Enum.ClubType.Guild\n\t\t\tif isGuild then\n\t\t\t\tself.Selection:SetInside(self.bg, 0, 0)\n\t\t\t\tself.Selection:SetColorTexture(0, 1, 0, 0.2)\n\t\t\telse\n\t\t\t\tself.Selection:SetInside(self.bg, 0, 0)\n\t\t\t\tself.Selection:SetColorTexture(FRIENDS_BNET_BACKGROUND_COLOR.r, FRIENDS_BNET_BACKGROUND_COLOR.g, FRIENDS_BNET_BACKGROUND_COLOR.b, 0.2)\n\t\t\tend\n\n\t\t\tlocal highlight = self:GetHighlightTexture()\n\t\t\thighlight:SetInside(self.bg, 0, 0)\n\t\t\thighlight:SetColorTexture(1, 1, 1, 0.3)\n\t\tend\n\tend)\n\n\tlocal function SkinCommunitiesButton(self, colorSection)\n\t\tself:SetSize(166, 65)\n\t\tself.Background:Hide()\n\t\tself:SetFrameLevel(self:GetFrameLevel() + 5)\n\t\tself.CircleMask:Hide()\n\n\t\tself.Icon:SetDrawLayer(\"OVERLAY\", 1)\n\t\tself.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tself.IconRing:Hide()\n\n\t\tif not self.bg then\n\t\t\tself.bg = CreateFrame(\"Frame\", nil, self)\n\t\t\tself.bg:CreateBackdrop(\"Overlay\")\n\t\t\tself.bg:SetFrameLevel(self:GetFrameLevel() - 2)\n\t\t\tself.bg:SetPoint(\"TOPLEFT\", 4, -3)\n\t\t\tself.bg:SetPoint(\"BOTTOMRIGHT\", -4, 3)\n\t\tend\n\n\t\tif colorSection then\n\t\t\tself.Selection:SetInside(self.bg, 0, 0)\n\t\t\tif colorSection == 1 then\n\t\t\t\tself.Selection:SetColorTexture(GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, 0.2)\n\t\t\telse\n\t\t\t\tself.Selection:SetColorTexture(BATTLENET_FONT_COLOR.r, BATTLENET_FONT_COLOR.g, BATTLENET_FONT_COLOR.b, 0.2)\n\t\t\tend\n\t\tend\n\n\t\tlocal highlight = self:GetHighlightTexture()\n\t\thighlight:SetColorTexture(1, 1, 1, 0.3)\n\t\thighlight:SetInside(self.bg, 0, 0)\n\tend\n\n\thooksecurefunc(CommunitiesListEntryMixin, \"SetGuildFinder\", function(self)\n\t\tSkinCommunitiesButton(self, 1)\n\tend)\n\n\thooksecurefunc(CommunitiesListEntryMixin, \"SetFindCommunity\", function(self)\n\t\tSkinCommunitiesButton(self, 2)\n\tend)\n\n\thooksecurefunc(CommunitiesListEntryMixin, \"SetAddCommunity\", function(self)\n\t\tSkinCommunitiesButton(self)\n\tend)\n\n\t-- ClubFinderInvitationFrame\n\tCommunitiesFrame.ClubFinderInvitationFrame.InsetFrame:StripTextures()\n\tCommunitiesFrame.ClubFinderInvitationFrame:SetTemplate(\"Overlay\")\n\tCommunitiesFrame.ClubFinderInvitationFrame.AcceptButton:SkinButton()\n\tCommunitiesFrame.ClubFinderInvitationFrame.DeclineButton:SkinButton()\n\tCommunitiesFrame.ClubFinderInvitationFrame.ApplyButton:SkinButton()\n\n\tCommunitiesFrame.ClubFinderInvitationFrame.WarningDialog:StripTextures()\n\tCommunitiesFrame.ClubFinderInvitationFrame.WarningDialog:SetTemplate(\"Transparent\")\n\tCommunitiesFrame.ClubFinderInvitationFrame.WarningDialog.Accept:SkinButton()\n\tCommunitiesFrame.ClubFinderInvitationFrame.WarningDialog.Cancel:SkinButton()\n\n\t-- InvitationFrame\n\tCommunitiesFrame.InvitationFrame.InsetFrame:StripTextures()\n\tCommunitiesFrame.InvitationFrame:SetTemplate(\"Overlay\")\n\tCommunitiesFrame.InvitationFrame.AcceptButton:SkinButton()\n\tCommunitiesFrame.InvitationFrame.DeclineButton:SkinButton()\n\n\t-- GuildFinderFrame\n\tCommunitiesFrame.GuildFinderFrame:StripTextures()\n\tClubFinderCommunityAndGuildFinderFrame:StripTextures()\n\tClubFinderGuildFinderFrame.OptionsList.Search:SkinButton()\n\tClubFinderCommunityAndGuildFinderFrame.OptionsList.Search:SkinButton()\n\n\tT.SkinDropDownBox(ClubFinderGuildFinderFrame.OptionsList.ClubFilterDropdown)\n\tT.SkinDropDownBox(ClubFinderGuildFinderFrame.OptionsList.ClubSizeDropdown)\n\n\tT.SkinDropDownBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.ClubFilterDropdown)\n\tT.SkinDropDownBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.SortByDropdown)\n\n\tClubFinderGuildFinderFrame.OptionsList.Search:ClearAllPoints()\n\tClubFinderGuildFinderFrame.OptionsList.Search:SetPoint(\"TOP\", ClubFinderGuildFinderFrame.OptionsList.SearchBox, \"BOTTOM\", 0, -3)\n\tT.SkinEditBox(ClubFinderGuildFinderFrame.OptionsList.SearchBox, 146, 18)\n\n\tClubFinderGuildFinderFrame.ClubFinderSearchTab:SetPoint(\"TOPLEFT\", CommunitiesFrame, \"TOPRIGHT\", 5, -30)\n\tClubFinderCommunityAndGuildFinderFrame.ClubFinderSearchTab:SetPoint(\"TOPLEFT\", CommunitiesFrame, \"TOPRIGHT\", 5, -30)\n\n\tT.SkinCheckBox(ClubFinderGuildFinderFrame.OptionsList.TankRoleFrame.CheckBox)\n\tT.SkinCheckBox(ClubFinderGuildFinderFrame.OptionsList.HealerRoleFrame.CheckBox)\n\tT.SkinCheckBox(ClubFinderGuildFinderFrame.OptionsList.DpsRoleFrame.CheckBox)\n\n\tT.SkinCheckBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.TankRoleFrame.CheckBox)\n\tT.SkinCheckBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.HealerRoleFrame.CheckBox)\n\tT.SkinCheckBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.DpsRoleFrame.CheckBox)\n\n\tClubFinderCommunityAndGuildFinderFrame.OptionsList.Search:ClearAllPoints()\n\tClubFinderCommunityAndGuildFinderFrame.OptionsList.Search:SetPoint(\"TOP\", ClubFinderCommunityAndGuildFinderFrame.OptionsList.SearchBox, \"BOTTOM\", 0, -3)\n\tT.SkinEditBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.SearchBox, 146, 18)\n\n\tT.SkinNextPrevButton(ClubFinderGuildFinderFrame.GuildCards.PreviousPage)\n\tT.SkinNextPrevButton(ClubFinderGuildFinderFrame.GuildCards.NextPage)\n\tT.SkinNextPrevButton(ClubFinderGuildFinderFrame.PendingGuildCards.PreviousPage)\n\tT.SkinNextPrevButton(ClubFinderGuildFinderFrame.PendingGuildCards.NextPage)\n\n\tlocal function SkinCommunityCards(frame)\n\t\tif not frame then return end\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not button.isSkinned then\n\t\t\t\tbutton.CircleMask:Hide()\n\t\t\t\tbutton.LogoBorder:Hide()\n\n\t\t\t\tbutton:StripTextures()\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\t\t\t\tbutton:StyleButton()\n\t\t\t\tbutton.CommunityLogo:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\t\tbutton.isSkinned = true\n\t\t\tend\n\t\tend\n\tend\n\n\thooksecurefunc(ClubFinderCommunityAndGuildFinderFrame.CommunityCards.ScrollBox, \"Update\", SkinCommunityCards)\n\thooksecurefunc(ClubFinderCommunityAndGuildFinderFrame.PendingCommunityCards.ScrollBox, \"Update\", SkinCommunityCards)\n\n\tlocal function SkinCard(card)\n\t\tif not card.isSkinned then\n\t\t\tcard.CardBackground:Hide()\n\t\t\tcard.bg = CreateFrame(\"Frame\", nil, card)\n\t\t\tcard.bg:CreateBackdrop(\"Overlay\")\n\t\t\tcard.bg:SetFrameLevel(card:GetFrameLevel() - 2)\n\t\t\tcard.bg:SetPoint(\"TOPLEFT\", 2, 3)\n\t\t\tcard.bg:SetPoint(\"BOTTOMRIGHT\", -2, 3)\n\t\t\tcard.RequestJoin:SkinButton()\n\t\t\tcard.isSkinned = true\n\t\tend\n\tend\n\n\tfor _, card in pairs(ClubFinderGuildFinderFrame.GuildCards.Cards) do\n\t\tSkinCard(card)\n\tend\n\n\tfor _, card in pairs(ClubFinderGuildFinderFrame.PendingGuildCards.Cards) do\n\t\tSkinCard(card)\n\tend\n\n\tfor _, t in ipairs({ClubFinderGuildFinderFrame.RequestToJoinFrame, ClubFinderCommunityAndGuildFinderFrame.RequestToJoinFrame}) do\n\t\tt:StripTextures()\n\t\tt:CreateBackdrop(\"Transparent\")\n\n\t\thooksecurefunc(t, \"Initialize\", function(self)\n\t\t\tfor button in self.SpecsPool:EnumerateActive() do\n\t\t\t\tif button.CheckBox then\n\t\t\t\t\tT.SkinCheckBox(button.CheckBox)\n\t\t\t\t\tbutton.CheckBox:SetSize(26, 26)\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\n\t\tt.MessageFrame:StripTextures(true)\n\t\tt.MessageFrame.MessageScroll:StripTextures(true)\n\n\t\tt.MessageFrame.MessageScroll:CreateBackdrop(\"Overlay\")\n\t\tt.MessageFrame.MessageScroll.backdrop:SetPoint(\"TOPLEFT\", -4, 5)\n\t\tt.MessageFrame.MessageScroll.backdrop:SetPoint(\"BOTTOMRIGHT\", 6, -6)\n\n\t\tt.Apply:SkinButton()\n\t\tt.Cancel:SkinButton()\n\tend\n\n\t-- Notification Settings\n\tlocal NotificationSettings = CommunitiesFrame.NotificationSettingsDialog\n\tNotificationSettings:StripTextures()\n\tNotificationSettings.Selector:StripTextures()\n\tNotificationSettings:SetTemplate(\"Transparent\")\n\n\tT.SkinDropDownBox(CommunitiesFrame.NotificationSettingsDialog.CommunitiesListDropDownMenu, 190)\n\tCommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.QuickJoinButton:SetSize(25, 25)\n\tT.SkinCheckBox(CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.QuickJoinButton)\n\tCommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.AllButton:SkinButton()\n\tCommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.NoneButton:SkinButton()\n\tCommunitiesFrame.NotificationSettingsDialog.Selector.OkayButton:SkinButton()\n\tCommunitiesFrame.NotificationSettingsDialog.Selector.CancelButton:SkinButton()\n\n\thooksecurefunc(CommunitiesNotificationSettingsStreamEntryMixin, \"SetFilter\", function(self)\n\t\tself.ShowNotificationsButton:SetSize(18, 18)\n\t\tself.HideNotificationsButton:SetSize(18, 18)\n\t\tT.SkinCheckBox(self.ShowNotificationsButton)\n\t\tT.SkinCheckBox(self.HideNotificationsButton)\n\tend)\n\n\tlocal EditStreamDialog = CommunitiesFrame.EditStreamDialog\n\tEditStreamDialog:StripTextures()\n\tEditStreamDialog:SetTemplate(\"Transparent\")\n\n\tEditStreamDialog.NameEdit:SetPoint(\"TOPLEFT\", EditStreamDialog.NameLabel, \"BOTTOMLEFT\", 6, -5)\n\tEditStreamDialog.NameEdit:SetPoint(\"RIGHT\", EditStreamDialog, \"RIGHT\", -34, 0)\n\n\tT.SkinEditBox(EditStreamDialog.NameEdit, nil, 18)\n\tT.SkinEditBox(EditStreamDialog.Description)\n\tT.SkinCheckBox(EditStreamDialog.TypeCheckBox)\n\n\tEditStreamDialog.Accept:SkinButton()\n\tEditStreamDialog.Delete:SkinButton()\n\tEditStreamDialog.Cancel:SkinButton()\n\n\t-- Communities Settings\n\tlocal Settings = CommunitiesSettingsDialog\n\tSettings.BG:Hide()\n\tSettings:SetTemplate(\"Transparent\")\n\n\tSettings.IconPreview:RemoveMaskTexture(Settings.CircleMask)\n\tSettings.IconPreviewRing:Hide()\n\tSettings.IconPreview:SkinIcon(true)\n\n\tT.SkinEditBox(Settings.NameEdit)\n\tT.SkinEditBox(Settings.ShortNameEdit)\n\tT.SkinEditBox(Settings.Description)\n\tT.SkinEditBox(Settings.MessageOfTheDay)\n\n\tSettings.ChangeAvatarButton:SkinButton()\n\tSettings.Accept:SkinButton()\n\tSettings.Delete:SkinButton()\n\tSettings.Cancel:SkinButton()\n\n\tT.SkinDropDownBox(ClubFinderLanguageDropdown)\n\n\t-- Avatar Picker\n\tlocal Avatar = CommunitiesAvatarPickerDialog\n\tAvatar:StripTextures()\n\tAvatar.Selector:StripTextures()\n\tAvatar:SetTemplate(\"Transparent\")\n\n\tAvatar.Selector.OkayButton:SkinButton()\n\tAvatar.Selector.CancelButton:SkinButton()\n\n\t-- Tab\n\tlocal function SkinTab(tab)\n\t\ttab:GetRegions():Hide()\n\n\t\ttab:CreateBackdrop(\"Default\")\n\t\ttab.backdrop:SetAllPoints()\n\t\ttab:StyleButton()\n\t\ttab.Icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ttab.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\ttab.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\n\n\tSkinTab(CommunitiesFrame.ChatTab)\n\tSkinTab(CommunitiesFrame.RosterTab)\n\tSkinTab(CommunitiesFrame.GuildBenefitsTab)\n\tSkinTab(CommunitiesFrame.GuildInfoTab)\n\tSkinTab(ClubFinderGuildFinderFrame.ClubFinderSearchTab)\n\tSkinTab(ClubFinderGuildFinderFrame.ClubFinderPendingTab)\n\tSkinTab(ClubFinderCommunityAndGuildFinderFrame.ClubFinderSearchTab)\n\tSkinTab(ClubFinderCommunityAndGuildFinderFrame.ClubFinderPendingTab)\n\n\t-- Member List\n\tCommunitiesFrame.MemberList:StripTextures()\n\tCommunitiesFrame.MemberList.ColumnDisplay:StripTextures()\n\tCommunitiesFrame.MemberList.ShowOfflineButton:SetSize(25, 25)\n\tCommunitiesFrame.MemberList.ShowOfflineButton:SetPoint(\"BOTTOMLEFT\", CommunitiesFrame.MemberList, \"TOPLEFT\", -3, 26)\n\tCommunitiesFrame.CommunitiesControlFrame.GuildRecruitmentButton:SkinButton()\n\tCommunitiesFrame.CommunitiesControlFrame.GuildControlButton:SkinButton()\n\tT.SkinCheckBox(CommunitiesFrame.MemberList.ShowOfflineButton)\n\tT.SkinDropDownBox(CommunitiesFrame.GuildMemberListDropDownMenu)\n\n\thooksecurefunc(CommunitiesFrame.MemberList, \"RefreshListDisplay\", function(self)\n\t\tfor i = 1, self.ColumnDisplay:GetNumChildren() do\n\t\t\tlocal child = select(i, self.ColumnDisplay:GetChildren())\n\t\t\tif not child.IsSkinned then\n\t\t\t\tchild:StripTextures()\n\t\t\t\tchild:CreateBackdrop(\"Overlay\")\n\t\t\t\tchild.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tchild.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\t\tchild.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(CommunitiesMemberListEntryMixin, \"RefreshExpandedColumns\", function(self)\n\t\tlocal memberInfo = self:GetMemberInfo()\n\t\tif memberInfo and memberInfo.classID then\n\t\t\tlocal classInfo = C_CreatureInfo.GetClassInfo(memberInfo.classID)\n\t\t\tif classInfo then\n\t\t\t\tlocal texcoord = CLASS_ICON_TCOORDS[classInfo.classFile]\n\t\t\t\tself.Class:SetTexCoord(texcoord[1] + 0.015, texcoord[2] - 0.02, texcoord[3] + 0.018, texcoord[4] - 0.02)\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(CommunitiesMemberListEntryMixin, \"SetProfessionHeader\", function(self)\n\t\tlocal header = self.ProfessionHeader\n\t\tif header.styled then return end\n\t\tfor i = 1, 3 do\n\t\t\tselect(i, header:GetRegions()):Hide()\n\t\tend\n\t\theader:CreateBackdrop(\"Overlay\")\n\t\theader.backdrop:SetPoint(\"TOPLEFT\", 1, -1)\n\t\theader.backdrop:SetPoint(\"BOTTOMRIGHT\", -1, 1)\n\t\theader.styled = true\n\tend)\n\n\tlocal ApplicantList = CommunitiesFrame.ApplicantList\n\tApplicantList:StripTextures()\n\tApplicantList.ColumnDisplay:StripTextures()\n\n\thooksecurefunc(ApplicantList, \"BuildList\", function(list)\n\t\tlocal columnDisplay = list.ColumnDisplay\n\t\tfor _, child in next, {columnDisplay:GetChildren()} do\n\t\t\tif not child.IsSkinned then\n\t\t\t\tchild:StripTextures()\n\t\t\t\tchild:CreateBackdrop(\"Overlay\")\n\t\t\t\tchild.backdrop:SetPoint(\"TOPLEFT\", 4, -2)\n\t\t\t\tchild.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\n\t\t\t\tchild.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(ApplicantList.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not child.isSkinned then\n\t\t\t\tchild.InviteButton:SetSize(66, 18)\n\t\t\t\tchild.CancelInvitationButton:SetSize(20, 18)\n\t\t\t\tchild.InviteButton:SkinButton()\n\t\t\t\tchild.CancelInvitationButton:SkinButton()\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Member Detail Frame\n\tCommunitiesFrame.GuildMemberDetailFrame:StripTextures()\n\tCommunitiesFrame.GuildMemberDetailFrame:SetTemplate(\"Transparent\")\n\tCommunitiesFrame.GuildMemberDetailFrame:ClearAllPoints()\n\tCommunitiesFrame.GuildMemberDetailFrame:SetPoint(\"TOPLEFT\", CommunitiesFrame, \"TOPRIGHT\", 5, 2)\n\tCommunitiesFrame.GuildMemberDetailFrame.NoteBackground:SetTemplate(\"Overlay\")\n\tCommunitiesFrame.GuildMemberDetailFrame.OfficerNoteBackground:SetTemplate(\"Overlay\")\n\tT.SkinDropDownBox(CommunitiesFrame.GuildMemberDetailFrame.RankDropdown, 160)\n\tCommunitiesFrame.GuildMemberDetailFrame.RemoveButton:SkinButton()\n\tCommunitiesFrame.GuildMemberDetailFrame.GroupInviteButton:SkinButton()\n\tCommunitiesFrame.GuildMemberDetailFrame.RemoveButton:ClearAllPoints()\n\tCommunitiesFrame.GuildMemberDetailFrame.RemoveButton:SetPoint(\"BOTTOMLEFT\", CommunitiesFrame.GuildMemberDetailFrame, \"BOTTOMLEFT\", 9, 4)\n\n\t-- Guild Perk\n\tCommunitiesFrame.GuildBenefitsFrame:StripTextures()\n\tCommunitiesFrame.GuildBenefitsFrame.Perks:StripTextures()\n\tCommunitiesFrame.GuildBenefitsFrame.Perks:CreateBackdrop(\"Overlay\")\n\tCommunitiesFrame.GuildBenefitsFrame.Perks.backdrop:SetPoint(\"TOPLEFT\", 4, -2)\n\tCommunitiesFrame.GuildBenefitsFrame.Perks.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, -2)\n\n\tlocal GuildFactionBar = CommunitiesFrame.GuildBenefitsFrame.FactionFrame.Bar\n\tGuildFactionBar:StripTextures()\n\tGuildFactionBar.Progress:SetTexture(C.media.texture)\n\tGuildFactionBar:CreateBackdrop(\"Overlay\")\n\tGuildFactionBar.backdrop:SetPoint(\"TOPLEFT\", GuildFactionBar.Progress, \"TOPLEFT\", -2, 2)\n\tGuildFactionBar.backdrop:SetPoint(\"BOTTOMRIGHT\", GuildFactionBar, \"BOTTOMRIGHT\", 0, 0)\n\n\thooksecurefunc(CommunitiesFrame.GuildBenefitsFrame.Perks.ScrollBox, \"Update\", function(frame)\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not button.styled then\n\t\t\t\tbutton:StripTextures()\n\n\t\t\t\tif button.Icon then\n\t\t\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\tbutton.Icon:ClearAllPoints()\n\t\t\t\t\tbutton.Icon:SetPoint(\"TOPLEFT\", 2, -3)\n\t\t\t\t\tbutton:CreateBackdrop(\"Default\")\n\t\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", button.Icon, \"TOPLEFT\", -2, 2)\n\t\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", button.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\t\t\tbutton.Icon:SetParent(button.backdrop)\n\t\t\t\tend\n\t\t\t\tbutton.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tCommunitiesFrame.GuildBenefitsFrame.Rewards:StripTextures()\n\tCommunitiesFrame.GuildBenefitsFrame.Rewards:CreateBackdrop(\"Overlay\")\n\tCommunitiesFrame.GuildBenefitsFrame.Rewards.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\tCommunitiesFrame.GuildBenefitsFrame.Rewards.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, -2)\n\n\thooksecurefunc(CommunitiesFrame.GuildBenefitsFrame.Rewards.ScrollBox, \"Update\", function(frame)\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not button.styled then\n\t\t\t\tbutton:StripTextures()\n\n\t\t\t\tif button.Icon then\n\t\t\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\tbutton.Icon:ClearAllPoints()\n\t\t\t\t\tbutton.Icon:SetPoint(\"TOPLEFT\", 2, -3)\n\t\t\t\t\tbutton:CreateBackdrop(\"Default\")\n\t\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", button.Icon, \"TOPLEFT\", -2, 2)\n\t\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", button.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\t\t\tbutton.Icon:SetParent(button.backdrop)\n\t\t\t\t\tbutton.Lock:SetTexture(\"Interface\\\\GuildFrame\\\\GuildFrame\")\n\t\t\t\t\tbutton.Lock:SetParent(button.backdrop)\n\t\t\t\tend\n\t\t\t\tbutton.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Guild Info\n\tCommunitiesFrameGuildDetailsFrame:StripTextures()\n\tCommunitiesFrameGuildDetailsFrameInfo:StripTextures()\n\tCommunitiesFrameGuildDetailsFrameNews:StripTextures()\n\n\thooksecurefunc(CommunitiesFrameGuildDetailsFrameNews.ScrollBar, \"SetPoint\", function(self, point, anchor, attachTo, x, y)\n\t\tif anchor == CommunitiesFrameGuildDetailsFrameNewsContainer and x == 1 and y == 5 then\n\t\t\tself:SetPoint(point, anchor, attachTo, x, 8)\n\t\tend\n\tend)\n\n\thooksecurefunc(\"GuildNewsButton_SetNews\", function(button, news_id)\n\t\tlocal newsInfo = C_GuildInfo.GetGuildNewsInfo(news_id)\n\t\tif newsInfo then\n\t\t\tif button.header:IsShown() then\n\t\t\t\tbutton.header:SetAlpha(0)\n\t\t\tend\n\t\tend\n\tend)\n\n\tCommunitiesFrameGuildDetailsFrameNews.SetFiltersButton:GetRegions():SetFont(C.media.normal_font, 10, \"\")\n\n\tlocal backdrop1 = CreateFrame(\"Frame\", nil, CommunitiesFrameGuildDetailsFrameInfo)\n\tbackdrop1:SetTemplate(\"Overlay\")\n\tbackdrop1:SetFrameLevel(CommunitiesFrameGuildDetailsFrameInfo:GetFrameLevel() - 1)\n\tbackdrop1:SetPoint(\"TOPLEFT\", CommunitiesFrameGuildDetailsFrameInfo, \"TOPLEFT\", 2, -22)\n\tbackdrop1:SetPoint(\"BOTTOMRIGHT\", CommunitiesFrameGuildDetailsFrameInfo, \"BOTTOMRIGHT\", 0, 200)\n\n\tlocal backdrop2 = CreateFrame(\"Frame\", nil, CommunitiesFrameGuildDetailsFrameInfo)\n\tbackdrop2:SetTemplate(\"Overlay\")\n\tbackdrop2:SetFrameLevel(CommunitiesFrameGuildDetailsFrameInfo:GetFrameLevel() - 1)\n\tbackdrop2:SetPoint(\"TOPLEFT\", CommunitiesFrameGuildDetailsFrameInfo, \"TOPLEFT\", 2, -158)\n\tbackdrop2:SetPoint(\"BOTTOMRIGHT\", CommunitiesFrameGuildDetailsFrameInfo, \"BOTTOMRIGHT\", -8, 123)\n\n\tlocal backdrop3 = CreateFrame(\"Frame\", nil, CommunitiesFrameGuildDetailsFrameInfo)\n\tbackdrop3:SetTemplate(\"Overlay\")\n\tbackdrop3:SetFrameLevel(CommunitiesFrameGuildDetailsFrameInfo:GetFrameLevel() - 1)\n\tbackdrop3:SetPoint(\"TOPLEFT\", CommunitiesFrameGuildDetailsFrameInfo, \"TOPLEFT\", 2, -236)\n\tbackdrop3:SetPoint(\"BOTTOMRIGHT\", CommunitiesFrameGuildDetailsFrameInfo, \"BOTTOMRIGHT\", -8, -1)\n\n\tlocal backdrop4 = CreateFrame(\"Frame\", nil, CommunitiesFrameGuildDetailsFrameInfo)\n\tbackdrop4:SetTemplate(\"Overlay\")\n\tbackdrop4:SetFrameLevel(CommunitiesFrameGuildDetailsFrameInfo:GetFrameLevel() - 1)\n\tbackdrop4:SetPoint(\"TOPLEFT\", CommunitiesFrameGuildDetailsFrameInfo, \"TOPLEFT\", 591, -22)\n\tbackdrop4:SetPoint(\"BOTTOMRIGHT\", CommunitiesFrameGuildDetailsFrameInfo, \"BOTTOMRIGHT\", 20, -1)\n\n\tCommunitiesFrameGuildDetailsFrameInfoMOTDScrollFrameScrollBar:SetPoint(\"TOPLEFT\", CommunitiesFrameGuildDetailsFrameInfoMOTDScrollFrame, \"TOPRIGHT\", 0, -12)\n\tCommunitiesFrameGuildDetailsFrameInfoMOTDScrollFrameScrollBar:SetPoint(\"BOTTOMLEFT\", CommunitiesFrameGuildDetailsFrameInfoMOTDScrollFrame, \"BOTTOMRIGHT\", 0, 12)\n\n\tCommunitiesFrameGuildDetailsFrameInfoScrollBar:SetPoint(\"TOPLEFT\", CommunitiesFrameGuildDetailsFrameInfo.DetailsFrame, \"TOPRIGHT\", 0, -12)\n\tCommunitiesFrameGuildDetailsFrameInfoScrollBar:SetPoint(\"BOTTOMLEFT\", CommunitiesFrameGuildDetailsFrameInfo.DetailsFrame, \"BOTTOMRIGHT\", 0, 13)\n\n\t-- Guild Message EditBox\n\tCommunitiesGuildTextEditFrame:StripTextures()\n\tCommunitiesGuildTextEditFrame:SetTemplate(\"Transparent\")\n\tCommunitiesGuildTextEditFrame.Container:SetTemplate(\"Overlay\")\n\tCommunitiesGuildTextEditFrameAcceptButton:SkinButton()\n\tselect(4, CommunitiesGuildTextEditFrame:GetChildren()):SkinButton()\n\n\t-- Guild Log\n\tCommunitiesGuildLogFrame:StripTextures()\n\tCommunitiesGuildLogFrame.Container:StripTextures()\n\tCommunitiesGuildLogFrame.Container:SetTemplate(\"Overlay\")\n\tCommunitiesGuildLogFrame:SetTemplate(\"Transparent\")\n\tselect(3, CommunitiesGuildLogFrame:GetChildren()):SkinButton()\n\tCommunitiesFrame.GuildLogButton:SkinButton()\n\tCommunitiesFrame.GuildLogButton:SetPoint(\"BOTTOMLEFT\", CommunitiesFrame, \"BOTTOMLEFT\", 196, 5)\n\n\t-- Filters Frame\n\tCommunitiesGuildNewsFiltersFrame:StripTextures()\n\tCommunitiesGuildNewsFiltersFrame:SetTemplate(\"Transparent\")\n\n\tfor i = 1, #CommunitiesGuildNewsFiltersFrame.GuildNewsFilterButtons do\n\t\tlocal checkbox = CommunitiesGuildNewsFiltersFrame.GuildNewsFilterButtons[i]\n\t\tT.SkinCheckBox(checkbox)\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_Communities\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Container.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBank/Container skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tif C.bag.enable == true or (IsAddOnLoaded(\"AdiBags\") or IsAddOnLoaded(\"ArkInventory\") or IsAddOnLoaded(\"cargBags_Nivaya\") or IsAddOnLoaded(\"cargBags\") or IsAddOnLoaded(\"Bagnon\") or IsAddOnLoaded(\"Combuctor\") or IsAddOnLoaded(\"TBag\") or IsAddOnLoaded(\"BaudBag\")) then return end\n\n\t-- Container Frame\n\tBagItemSearchBox:StripTextures(true)\n\tBagItemSearchBox:CreateBackdrop(\"Overlay\")\n\tBagItemSearchBox.backdrop:SetPoint(\"TOPLEFT\", 13, 0)\n\tBagItemSearchBox.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\tBagItemSearchBox:ClearAllPoints()\n\tBagItemSearchBox:SetPoint(\"TOPRIGHT\", BagItemAutoSortButton, \"TOPLEFT\", -3, 0)\n\tBagItemSearchBox.ClearAllPoints = T.dummy\n\tBagItemSearchBox.SetPoint = T.dummy\n\n\tBagItemAutoSortButton:SetSize(18, 18)\n\tBagItemAutoSortButton:StyleButton()\n\tBagItemAutoSortButton:SetTemplate(\"Default\")\n\tBagItemAutoSortButton:GetNormalTexture():SetTexture(\"Interface\\\\Icons\\\\inv_pet_broom\")\n\tBagItemAutoSortButton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tBagItemAutoSortButton:GetNormalTexture():ClearAllPoints()\n\tBagItemAutoSortButton:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\tBagItemAutoSortButton:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tContainerFrameCombinedBags:StripTextures(true)\n\tContainerFrameCombinedBags:CreateBackdrop(\"Transparent\")\n\tContainerFrameCombinedBags.Bg:Hide()\n\tT.SkinCloseButton(ContainerFrameCombinedBags.CloseButton)\n\n\t-- ContainerFrameCombinedBags:ClearAllPoints()\n\t-- ContainerFrameCombinedBags:SetPoint(unpack(C.position.bag))\n\t-- ContainerFrameCombinedBags.SetPoint = T.dummy\n\n\tContainerFrameCombinedBags.MoneyFrame.Border:Hide()\n\tContainerFrame1MoneyFrame.Border:Hide()\n\n\tContainerFrameCombinedBagsPortrait:SetAlpha(0)\n\tContainerFrameCombinedBagsPortraitButton.Highlight:SetAlpha(0)\n\tContainerFrameCombinedBagsPortraitButtonTexture = ContainerFrameCombinedBagsPortraitButton:CreateTexture(nil, \"OVERLAY\")\n\tContainerFrameCombinedBagsPortraitButtonTexture:SetSize(30, 30)\n\tContainerFrameCombinedBagsPortraitButtonTexture:SetPoint(\"CENTER\", 2, 1)\n\tContainerFrameCombinedBagsPortraitButtonTexture:SetTexture(\"Interface\\\\Icons\\\\inv_misc_bag_08\")\n\tContainerFrameCombinedBagsPortraitButtonTexture:SkinIcon()\n\n\tlocal function updateQuestItems(self)\n\t\tfor _, button in self:EnumerateValidItems() do\n\t\t\tif button.IconQuestTexture:IsShown() then\n\t\t\t\tif button.IconQuestTexture:GetTexture() == 368362 then\n\t\t\t\t\tbutton:SetBackdropBorderColor(1, 0.3, 0.3)\n\t\t\t\telse\n\t\t\t\t\tbutton:SetBackdropBorderColor(1, 1, 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tbutton:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend\n\t\tend\n\tend\n\n\tfor i = 1, NUM_CONTAINER_FRAMES do\n\t\tlocal frame = _G[\"ContainerFrame\"..i]\n\t\tlocal close = _G[\"ContainerFrame\"..i].CloseButton\n\n\t\tframe:StripTextures(true)\n\t\tframe:CreateBackdrop(\"Transparent\")\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 4, -2)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\tframe.Bg:Hide()\n\n\t\tframe.TitleContainer:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 40, -1)\n\n\t\tlocal portrait = _G[\"ContainerFrame\"..i..\"Portrait\"]\n\t\tportrait:SetSize(28, 28)\n\t\tportrait:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 10, -8)\n\t\tportrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)\n\t\tif frame.PortraitContainer.CircleMask then frame.PortraitContainer.CircleMask:Hide() end\n\n\t\tframe.b = CreateFrame(\"Frame\", nil, frame)\n\t\tframe.b:SetTemplate(\"Default\")\n\t\tframe.b:SetOutside(portrait)\n\n\t\tT.SkinCloseButton(close, frame.backdrop)\n\n\t\tfor j = 1, 36 do\n\t\t\tlocal item = _G[\"ContainerFrame\"..i..\"Item\"..j]\n\t\t\tlocal icon = _G[\"ContainerFrame\"..i..\"Item\"..j..\"IconTexture\"]\n\t\t\tlocal quest = _G[\"ContainerFrame\"..i..\"Item\"..j..\"IconQuestTexture\"]\n\t\t\tlocal border = _G[\"ContainerFrame\"..i..\"Item\"..j].IconBorder\n\n\t\t\tborder:SetAlpha(0)\n\n\t\t\titem:SetNormalTexture(0)\n\t\t\titem:StyleButton()\n\t\t\titem:SetTemplate(\"Default\")\n\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ticon:ClearAllPoints()\n\t\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\tquest:SetAlpha(0)\n\t\tend\n\n\t\t-- Color QuestItem\n\t\thooksecurefunc(frame, \"UpdateItems\", function(self)\n\t\t\tupdateQuestItems(self)\n\t\tend)\n\tend\n\n\tBackpackTokenFrame:StripTextures(true)\n\thooksecurefunc(_G.BackpackTokenFrame, \"Update\", function (container)\n\t\tfor _, token in next, container.Tokens do\n\t\t\tif not token.Icon.styled then\n\t\t\t\ttoken.Icon:SkinIcon()\n\t\t\t\ttoken.Count:ClearAllPoints()\n\t\t\t\ttoken.Count:SetPoint(\"RIGHT\", token.Icon, \"LEFT\", -5, 0)\n\t\t\t\ttoken.Icon.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Bank Frame\n\tBankFrame:StripTextures(true)\n\tBankFrame:CreateBackdrop(\"Transparent\")\n\tBankFrame.backdrop:SetAllPoints()\n\tBankFramePortrait:SetAlpha(0)\n\n\tBankItemSearchBox:StripTextures(true)\n\tBankItemSearchBox:CreateBackdrop(\"Overlay\")\n\tBankItemSearchBox.backdrop:SetPoint(\"TOPLEFT\", 13, 0)\n\tBankItemSearchBox.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\n\tBankItemAutoSortButton:StyleButton()\n\tBankItemAutoSortButton:SetTemplate(\"Default\")\n\tBankItemAutoSortButton:SetSize(20, 20)\n\tBankItemAutoSortButton:SetPoint(\"TOPLEFT\", BankItemSearchBox, \"TOPRIGHT\", 3, 0)\n\tBankItemAutoSortButton:GetNormalTexture():SetTexture(\"Interface\\\\Icons\\\\inv_pet_broom\")\n\tBankItemAutoSortButton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tBankItemAutoSortButton:GetNormalTexture():ClearAllPoints()\n\tBankItemAutoSortButton:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\tBankItemAutoSortButton:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tBankFrameMoneyFrameInset:StripTextures()\n\tBankFrameMoneyFrameBorder:StripTextures()\n\n\tBankFramePurchaseButton:SkinButton()\n\tT.SkinCloseButton(BankFrameCloseButton, BankFrame.backdrop)\n\n\tBankSlotsFrame:StripTextures()\n\n\tfor i = 1, 28 do\n\t\tlocal item = _G[\"BankFrameItem\"..i]\n\t\tlocal icon = _G[\"BankFrameItem\"..i..\"IconTexture\"]\n\t\tlocal quest = _G[\"BankFrameItem\"..i].IconQuestTexture\n\t\tlocal border = _G[\"BankFrameItem\"..i].IconBorder\n\n\t\tborder:SetAlpha(0)\n\n\t\titem:SetNormalTexture(0)\n\t\titem:StyleButton()\n\t\titem:SetTemplate(\"Default\")\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\tif quest then\n\t\t\tquest:SetAlpha(0)\n\t\tend\n\tend\n\n\tfor i = 1, 7 do\n\t\tlocal bag = BankSlotsFrame[\"Bag\"..i]\n\t\tlocal icon = bag.icon\n\n\t\tbag.IconBorder:SetAlpha(0)\n\n\t\tbag:StripTextures()\n\t\tbag:StyleButton()\n\t\tbag:SetTemplate(\"Default\")\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\t-- Tabs\n\tfor i = 1, 2 do\n\t\tT.SkinTab(_G[\"BankFrameTab\"..i])\n\tend\n\n\t-- ReagentBank\n\tReagentBankFrame:StripTextures()\n\tReagentBankFrame:DisableDrawLayer(\"BACKGROUND\")\n\tReagentBankFrame:DisableDrawLayer(\"ARTWORK\")\n\n\tReagentBankFrameUnlockInfo:StripTextures()\n\tReagentBankFrameUnlockInfo:CreateBackdrop(\"Overlay\")\n\tReagentBankFrameUnlockInfo.backdrop:SetPoint(\"TOPLEFT\", 4, -2)\n\tReagentBankFrameUnlockInfo.backdrop:SetPoint(\"BOTTOMRIGHT\", -4, 2)\n\tReagentBankFrameUnlockInfo.backdrop:SetFrameLevel(ReagentBankFrameUnlockInfo.backdrop:GetFrameLevel() + 1)\n\n\tReagentBankFrameUnlockInfoPurchaseButton:SkinButton()\n\tReagentBankFrameUnlockInfoPurchaseButton:SetFrameLevel(ReagentBankFrameUnlockInfo:GetFrameLevel() + 3)\n\tReagentBankFrame.DespositButton:SkinButton()\n\n\tReagentBankFrame:HookScript(\"OnShow\", function()\n\t\tfor i = 1, 98 do\n\t\t\tlocal item = _G[\"ReagentBankFrameItem\"..i]\n\t\t\tlocal icon = _G[\"ReagentBankFrameItem\"..i].icon\n\t\t\tlocal border = _G[\"ReagentBankFrameItem\"..i].IconBorder\n\n\t\t\tborder:SetAlpha(0)\n\n\t\t\titem:SetNormalTexture(0)\n\t\t\titem:StyleButton()\n\t\t\titem:SetTemplate(\"Default\")\n\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ticon:ClearAllPoints()\n\t\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tend\n\tend)\n\n\t-- Color QuestItem\n\thooksecurefunc(ContainerFrameCombinedBags, \"UpdateItems\", function(self)\n\t\tupdateQuestItems(self)\n\tend)\n\n\thooksecurefunc(\"BankFrameItemButton_Update\", function(frame)\n\t\tif not frame.isBag and frame.IconQuestTexture:IsShown() then\n\t\t\tif frame.IconQuestTexture:GetTexture() == 368362 then\n\t\t\t\tframe:SetBackdropBorderColor(1, 0.3, 0.3)\n\t\t\telse\n\t\t\t\tframe:SetBackdropBorderColor(1, 1, 0)\n\t\t\tend\n\t\telse\n\t\t\tif frame.SetBackdropBorderColor then -- ReagentBank\n\t\t\t\tframe:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Frame Anchors\n\thooksecurefunc(\"UpdateContainerFrameAnchors\", function()\n\t\tlocal frame, xOffset, yOffset, screenHeight, freeScreenHeight, leftMostPoint, column\n\t\tlocal screenWidth = GetScreenWidth()\n\t\tlocal containerScale = 1\n\t\tlocal leftLimit = 0\n\n\t\tif BankFrame:IsShown() then\n\t\t\tleftLimit = BankFrame:GetRight() - 25\n\t\tend\n\n\t\twhile containerScale > 0.75 do\n\t\t\tscreenHeight = GetScreenHeight() / containerScale\n\t\t\txOffset = CONTAINER_OFFSET_X / containerScale\n\t\t\tyOffset = CONTAINER_OFFSET_Y / containerScale\n\t\t\tfreeScreenHeight = screenHeight - yOffset\n\t\t\tleftMostPoint = screenWidth - xOffset\n\t\t\tcolumn = 1\n\t\t\tlocal frameHeight\n\t\t\t-- for _, frameName in ipairs(ContainerFrame1.bags) do\n\t\t\t\t-- frameHeight = _G[frameName]:GetHeight()\n\t\t\t\t-- if freeScreenHeight < frameHeight then\n\t\t\t\t\t-- column = column + 1\n\t\t\t\t\t-- leftMostPoint = screenWidth - (column * 192 * containerScale) - xOffset\n\t\t\t\t\t-- freeScreenHeight = screenHeight - yOffset\n\t\t\t\t-- end\n\t\t\t\t-- freeScreenHeight = freeScreenHeight - frameHeight - 3\n\t\t\t-- end\n\t\t\tif leftMostPoint < leftLimit then\n\t\t\t\tcontainerScale = containerScale - 0.01\n\t\t\telse\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\n\t\tif containerScale < 0.75 then\n\t\t\tcontainerScale = 0.75\n\t\tend\n\n\t\tscreenHeight = GetScreenHeight() / containerScale\n\t\txOffset = CONTAINER_OFFSET_X / containerScale\n\t\tyOffset = CONTAINER_OFFSET_Y / containerScale\n\t\tfreeScreenHeight = screenHeight - yOffset\n\t\tcolumn = 0\n\n\t\t-- local bagsPerColumn = 0\n\t\t-- for index, frameName in ipairs(ContainerFrame1.bags) do\n\t\t\t-- frame = _G[frameName]\n\t\t\t-- frame:SetScale(1)\n\t\t\t-- if index == 1 then\n\t\t\t\t-- frame:SetPoint(\"BOTTOMRIGHT\", UIParent, \"BOTTOMRIGHT\", -21, 22)\n\t\t\t\t-- bagsPerColumn = bagsPerColumn + 1\n\t\t\t-- elseif freeScreenHeight < frame:GetHeight() then\n\t\t\t\t-- column = column + 1\n\t\t\t\t-- freeScreenHeight = screenHeight - yOffset\n\t\t\t\t-- if column > 1 then\n\t\t\t\t\t-- frame:SetPoint(\"BOTTOMRIGHT\", ContainerFrame1.bags[(index - bagsPerColumn) - 1], \"BOTTOMLEFT\", 0, 0)\n\t\t\t\t-- else\n\t\t\t\t\t-- frame:SetPoint(\"BOTTOMRIGHT\", ContainerFrame1.bags[index - bagsPerColumn], \"BOTTOMLEFT\", 0, 0)\n\t\t\t\t-- end\n\t\t\t\t-- bagsPerColumn = 0\n\t\t\t-- else\n\t\t\t\t-- frame:SetPoint(\"BOTTOMRIGHT\", ContainerFrame1.bags[index - 1], \"TOPRIGHT\", 0, 0)\n\t\t\t\t-- bagsPerColumn = bagsPerColumn + 1\n\t\t\t-- end\n\t\t\t-- freeScreenHeight = freeScreenHeight - frame:GetHeight() - 3\n\t\t-- end\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Contribution.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tContribution skin\n----------------------------------------------------------------------------------------\nlocal LoadTootlipSkin = CreateFrame(\"Frame\")\nLoadTootlipSkin:RegisterEvent(\"ADDON_LOADED\")\nLoadTootlipSkin:SetScript(\"OnEvent\", function(self, _, addon)\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") or not C.tooltip.enable then\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\t\treturn\n\tend\n\n\tif addon == \"Blizzard_Contribution\" then\n\t\tContributionBuffTooltip:StripTextures()\n\t\tContributionBuffTooltip:SetTemplate(\"Transparent\")\n\t\tContributionBuffTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tContributionBuffTooltip:CreateBackdrop(\"Default\")\n\t\tContributionBuffTooltip.backdrop:SetFrameLevel(ContributionBuffTooltip:GetFrameLevel())\n\t\tContributionBuffTooltip.backdrop:SetPoint(\"TOPLEFT\", ContributionBuffTooltip.Icon, \"TOPLEFT\", -2, 2)\n\t\tContributionBuffTooltip.backdrop:SetPoint(\"BOTTOMRIGHT\", ContributionBuffTooltip.Icon, \"BOTTOMRIGHT\", 2, -2)\n\tend\nend)\n\nif C.skins.blizzard_frames ~= true then return end\nlocal function LoadSkin()\n\tT.SkinCloseButton(ContributionCollectionFrame.CloseButton)\n\tContributionCollectionFrame.CloseButton:SetPoint(\"TOPRIGHT\", ContributionCollectionFrame, \"TOPRIGHT\", -17, -23)\n\tContributionCollectionFrame.CloseButton.text:SetPoint(\"CENTER\", -T.mult, T.mult)\n\n\thooksecurefunc(ContributionMixin, \"SetupContributeButton\", function(self)\n\t\tif not self.isSkinned then\n\t\t\tself.ContributeButton:SkinButton()\n\t\t\tself.isSkinned = true\n\t\tend\n\n\t\tlocal statusBar = self.Status\n\t\tif statusBar and not statusBar.backdrop then\n\t\t\tstatusBar:StripTextures()\n\t\t\tstatusBar:CreateBackdrop(\"Default\")\n\t\t\tstatusBar.Text:SetFont(C.media.normal_font, 12, \"OUTLINE\")\n\t\tend\n\tend)\n\n\thooksecurefunc(ContributionRewardMixin, \"Setup\", function(self)\n\t\tif not self.backdrop then\n\t\t\tself.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tself.Icon:SetDrawLayer(\"OVERLAY\")\n\t\t\tself:SetFrameLevel(5)\n\t\t\tself:CreateBackdrop(\"Default\")\n\t\t\tself.backdrop:SetPoint(\"TOPLEFT\", self.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tself.backdrop:SetPoint(\"BOTTOMRIGHT\", self.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_Contribution\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/CovenantPreview.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCovenant Preview skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = CovenantPreviewFrame\n\n\tframe.InfoPanel.Name:SetTextColor(1, 1, 1)\n\tframe.InfoPanel.Location:SetTextColor(1, 1, 1)\n\tframe.InfoPanel.Description:SetTextColor(1, 1, 1)\n\tframe.InfoPanel.AbilitiesFrame.AbilitiesLabel:SetTextColor(1, .8, 0)\n\tframe.InfoPanel.SoulbindsFrame.SoulbindsLabel:SetTextColor(1, .8, 0)\n\tframe.InfoPanel.CovenantFeatureFrame.Label:SetTextColor(1, .8, 0)\n\n\thooksecurefunc(frame, \"TryShow\", function(covenantInfo)\n\t\tif covenantInfo and not frame.IsSkinned then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\n\t\t\tframe.ModelSceneContainer.ModelSceneBorder:SetAlpha(0)\n\t\t\tframe.InfoPanel:CreateBackdrop(\"Overlay\")\n\t\t\tframe.InfoPanel.backdrop:SetPoint(\"TOPLEFT\", 0, 1)\n\t\t\tframe.InfoPanel.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, -1)\n\n\t\t\tframe.ModelSceneContainer:CreateBackdrop(\"Default\")\n\n\t\t\tframe.Title:DisableDrawLayer(\"BACKGROUND\")\n\t\t\tframe.Title.Text:SetTextColor(1, 0.8, 0)\n\t\t\tframe.Background:SetAlpha(0)\n\t\t\tframe.BorderFrame:SetAlpha(0)\n\t\t\tframe.InfoPanel.Parchment:SetAlpha(0)\n\n\t\t\tframe.CloseButton.Border:Kill()\n\t\t\tT.SkinCloseButton(frame.CloseButton)\n\t\t\tframe.SelectButton:SkinButton()\n\n\t\t\tframe.IsSkinned = true\n\t\tend\n\t\tframe.CloseButton:SetPoint(\"TOPRIGHT\", -4, -4)\n\tend)\n\n\tframe.ModelSceneContainer.Background:SetTexCoord(0.00970873786408, 0.97109826589595, 0.0092807424594, 0.97109826589595)\n\n\tT.SkinCheckBox(TransmogAndMountDressupFrame.ShowMountCheckButton)\nend\n\nT.SkinFuncs[\"Blizzard_CovenantPreviewUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/CovenantRenown.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCovenant Renown skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = CovenantRenownFrame\n\tframe:CreateBackdrop(\"Transparent\")\n\tT.SkinCloseButton(frame.CloseButton)\n\n\thooksecurefunc(frame, \"SetUpCovenantData\", function(self)\n\t\tself.CloseButton.Border:Hide()\n\t\tself:StripTextures()\n\tend)\n\n\thooksecurefunc(frame, \"SetRewards\", function(self)\n\t\tfor reward in self.rewardsPool:EnumerateActive() do\n\t\t\tif not reward.backdrop then\n\t\t\t\treward:CreateBackdrop(\"Overlay\")\n\t\t\t\treward.backdrop:SetPoint(\"TOPLEFT\", reward, 2, -15)\n\t\t\t\treward.backdrop:SetPoint(\"BOTTOMRIGHT\", reward, -2, 15)\n\n\t\t\t\treward.Toast:SetAlpha(0)\n\t\t\t\treward.Highlight:SetAlpha(0)\n\t\t\t\treward.CircleMask:Hide()\n\t\t\t\treward.IconBorder:SetAlpha(0)\n\n\t\t\t\treward.b = CreateFrame(\"Frame\", nil, reward)\n\t\t\t\treward.b:SetTemplate(\"Default\")\n\t\t\t\treward.b:SetPoint(\"TOPLEFT\", reward.Icon, \"TOPLEFT\", -2, 2)\n\t\t\t\treward.b:SetPoint(\"BOTTOMRIGHT\", reward.Icon, \"BOTTOMRIGHT\", 2, -2)\n\t\t\t\treward.Icon:SetParent(reward.b)\n\t\t\t\treward.Icon:SetTexCoord(0.15, 0.85, 0.15, 0.85)\n\t\t\t\treward.Check:SetParent(reward.b)\n\t\t\tend\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_CovenantRenown\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/CovenantSanctum.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCovenant Sanctum skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = CovenantSanctumFrame\n\n\tframe.UpgradesTab.DepositButton:SkinButton()\n\tframe.LevelFrame.Background:SetAlpha(0)\n\n\tframe.UpgradesTab:CreateBackdrop(\"Overlay\")\n\tframe.UpgradesTab.backdrop:SetPoint(\"TOPLEFT\", frame.UpgradesTab.Background, -2, 2)\n\tframe.UpgradesTab.backdrop:SetPoint(\"BOTTOMRIGHT\", frame.UpgradesTab.Background, 2, -2)\n\n\tlocal talentsList = frame.UpgradesTab.TalentsList\n\ttalentsList:CreateBackdrop(\"Overlay\")\n\ttalentsList.backdrop:SetPoint(\"TOPLEFT\", 6, 2)\n\ttalentsList.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -2)\n\ttalentsList.UpgradeButton:SkinButton()\n\ttalentsList.Divider:SetAlpha(0)\n\ttalentsList.BackgroundTile:SetAlpha(0)\n\ttalentsList.IntroBox.Background:Hide()\n\n\tlocal function HandleIconString(self, text)\n\t\tif not text then text = self:GetText() end\n\t\tif not text or text == '' then return end\n\n\t\tlocal new, count = gsub(text, '|T([^:]-):[%d+:]+|t', '|T%1:14:14:0:0:64:64:5:59:5:59|t')\n\t\tif count > 0 then self:SetFormattedText('%s', new) end\n\tend\n\n\tfor frame in frame.UpgradesTab.CurrencyDisplayGroup.currencyFramePool:EnumerateActive() do\n\t\tif not frame.IsSkinned then\n\t\t\tHandleIconString(frame.Text)\n\t\t\thooksecurefunc(frame.Text, \"SetText\", HandleIconString)\n\n\t\t\tframe.IsSkinned = true\n\t\tend\n\tend\n\n\thooksecurefunc(talentsList, \"Refresh\", function(self)\n\t\tfor frame in self.talentPool:EnumerateActive() do\n\t\t\tif not frame.backdrop then\n\t\t\t\tframe.Border:SetAlpha(0)\n\t\t\t\tframe.IconBorder:SetAlpha(0)\n\t\t\t\tframe.TierBorder:SetAlpha(0)\n\t\t\t\tframe.Background:SetAlpha(0)\n\n\t\t\t\tframe:CreateBackdrop(\"Overlay\")\n\t\t\t\tframe.backdrop:SetInside()\n\t\t\t\tframe.backdrop.overlay:SetVertexColor(0.15, 0.15, 0.15, 1)\n\n\t\t\t\tframe.Icon:SetPoint(\"TOPLEFT\", 10, -10)\n\t\t\t\tframe.Icon:SetSize(35, 35)\n\t\t\t\tframe.Icon:SkinIcon(true)\n\n\t\t\t\tframe.Highlight:SetColorTexture(1, 1, 1, 0.3)\n\t\t\t\tframe.Highlight:SetInside(frame.backdrop)\n\n\t\t\t\tHandleIconString(frame.InfoText)\n\t\t\t\thooksecurefunc(frame.InfoText, \"SetText\", HandleIconString)\n\t\t\tend\n\t\tend\n\tend)\n\n\tframe:HookScript(\"OnShow\", function()\n\t\tif not frame.backdrop then\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\tframe.NineSlice:SetAlpha(0)\n\n\t\t\tframe.CloseButton.Border:SetAlpha(0)\n\t\t\tT.SkinCloseButton(frame.CloseButton)\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_CovenantSanctum\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/DeathRecap.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tDeathRecap skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tDeathRecapFrame:StripTextures()\n\tDeathRecapFrame:SetTemplate(\"Transparent\")\n\tDeathRecapFrame.CloseButton:SkinButton(true)\n\tT.SkinCloseButton(DeathRecapFrame.CloseXButton)\n\n\tfor i = 1, NUM_DEATH_RECAP_EVENTS do\n\t\tlocal recap = DeathRecapFrame[\"Recap\"..i].SpellInfo\n\t\trecap.IconBorder:Hide()\n\t\trecap.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\trecap:CreateBackdrop(\"Default\")\n\t\trecap.backdrop:SetPoint(\"TOPLEFT\", recap.Icon, \"TOPLEFT\", -2, 2)\n\t\trecap.backdrop:SetPoint(\"BOTTOMRIGHT\", recap.Icon, \"BOTTOMRIGHT\", 2, -2)\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_DeathRecap\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/DebugTools.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tDebugTools skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tFrameStackTooltip:HookScript(\"OnShow\", function(self)\n\t\tself.NineSlice:SetTemplate(\"Transparent\")\n\tend)\n\n\tlocal function SkinTableAttributeDisplay(frame)\n\t\tif frame.isSkinned then return end\n\t\tT.SkinFrame(frame)\n\t\tframe.ScrollFrameArt.NineSlice:SetTemplate(\"Overlay\")\n\n\t\tT.SkinNextPrevButton(frame.OpenParentButton, nil, \"Up\")\n\t\tT.SkinNextPrevButton(frame.NavigateBackwardButton, true, \"Any\")\n\t\tT.SkinNextPrevButton(frame.NavigateForwardButton, nil, \"Any\")\n\t\tT.SkinNextPrevButton(frame.DuplicateButton, nil, \"Down\")\n\n\t\tT.SkinCheckBox(frame.VisibilityButton, 26)\n\t\tT.SkinCheckBox(frame.HighlightButton, 26)\n\t\tT.SkinCheckBox(frame.DynamicUpdateButton, 26)\n\n\t\tframe.OpenParentButton:ClearAllPoints()\n\t\tframe.OpenParentButton:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 4, -4)\n\t\tframe.OpenParentButton:SetSize(17, 17)\n\t\tframe.NavigateBackwardButton:ClearAllPoints()\n\t\tframe.NavigateBackwardButton:SetPoint(\"LEFT\", frame.OpenParentButton, \"RIGHT\", 3, 0)\n\t\tframe.NavigateForwardButton:ClearAllPoints()\n\t\tframe.NavigateForwardButton:SetPoint(\"LEFT\", frame.NavigateBackwardButton, \"RIGHT\", 3, 0)\n\t\tframe.DuplicateButton:ClearAllPoints()\n\t\tframe.DuplicateButton:SetPoint(\"LEFT\", frame.NavigateForwardButton, \"RIGHT\", 3, 0)\n\t\tframe.DuplicateButton:SetSize(17, 17)\n\n\t\tT.SkinEditBox(frame.FilterBox)\n\t\tT.SkinScrollBar(frame.LinesScrollFrame.ScrollBar)\n\n\t\tframe.isSkinned = true\n\tend\n\n\tSkinTableAttributeDisplay(TableAttributeDisplay)\n\thooksecurefunc(TableInspectorMixin, \"InspectTable\", SkinTableAttributeDisplay)\nend\n\nT.SkinFuncs[\"Blizzard_DebugTools\"] = LoadSkin\n\nlocal function LoadSecondarySkin()\n\tScriptErrorsFrame:SetParent(UIParent)\n\tScriptErrorsFrame:SetSize(400, 280)\n\tScriptErrorsFrame:StripTextures()\n\tScriptErrorsFrame:SetTemplate(\"Transparent\")\n\tScriptErrorsFrame.Reload:SkinButton()\n\tScriptErrorsFrame.Close:SkinButton()\n\n\tT.SkinNextPrevButton(ScriptErrorsFrame.PreviousError, true)\n\tT.SkinNextPrevButton(ScriptErrorsFrame.NextError)\n\tT.SkinScrollBar(ScriptErrorsFrameScrollBar)\n\tT.SkinCloseButton(ScriptErrorsFrameClose)\n\n\tScriptErrorsFrame.ScrollFrame:CreateBackdrop(\"Overlay\")\n\tScriptErrorsFrame.ScrollFrame:SetSize(ScriptErrorsFrame:GetWidth() - 45, ScriptErrorsFrame:GetHeight() - 72)\n\tScriptErrorsFrame.ScrollFrame.Text:SetFont(C.media.normal_font, 12, \"\")\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSecondarySkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/DressUp.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tDressUp skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tDressUpFrame:StripTextures()\n\tDressUpFrame:SetTemplate(\"Transparent\")\n\tDressUpFramePortrait:Hide()\n\tDressUpFrameInset:Hide()\n\n\tDressUpFrame.ModelScene:CreateBackdrop(\"Default\")\n\tDressUpFrame.ModelScene.backdrop:SetPoint(\"TOPLEFT\", -3, 4)\n\tDressUpFrame.ModelScene.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 1)\n\tDressUpFrame.ModelBackground:SetDrawLayer(\"BACKGROUND\", 3)\n\n\tT.SkinMaxMinFrame(DressUpFrame.MaximizeMinimizeFrame, DressUpFrameCloseButton)\n\n\tDressUpFrameCancelButton:SkinButton()\n\tDressUpFrameResetButton:SkinButton()\n\tDressUpFrameResetButton:SetPoint(\"RIGHT\", DressUpFrameCancelButton, \"LEFT\", -2, 0)\n\tDressUpFrameUndressButton:SkinButton()\n\n\tlocal button = DressUpFrame.ToggleOutfitDetailsButton\n\tbutton:SetNormalTexture(134331)\n\tbutton:SetPushedTexture(134331)\n\tbutton:StyleButton(true)\n\tbutton:SetTemplate(\"Default\")\n\tbutton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tbutton:GetNormalTexture():SetInside()\n\tbutton:GetPushedTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tbutton:GetPushedTexture():SetInside()\n\n\tDressUpFrame.OutfitDetailsPanel:StripTextures()\n\tDressUpFrame.OutfitDetailsPanel:CreateBackdrop(\"Transparent\")\n\tDressUpFrame.OutfitDetailsPanel.backdrop:SetPoint(\"TOPLEFT\", 11, 0)\n\tDressUpFrame.OutfitDetailsPanel.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\n\thooksecurefunc(DressUpFrame.OutfitDetailsPanel, \"Refresh\", function(self)\n\t\tif self.slotPool then\n\t\t\tfor slot in self.slotPool:EnumerateActive() do\n\t\t\t\tif not slot.skinned then\n\t\t\t\t\tslot.Icon:SkinIcon()\n\t\t\t\t\tslot.IconBorder:SetAlpha(0)\n\t\t\t\t\tslot.skinned = true\n\t\t\t\tend\n\t\t\t\tlocal point, relativeTo, relativePoint, xOfs, yOfs = slot:GetPoint()\n\t\t\t\tif yOfs == 0 then\n\t\t\t\t\tslot:SetPoint(point, relativeTo, relativePoint, xOfs, yOfs - 3)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\n\tDressUpFrame.LinkButton:SkinButton()\n\tDressUpFrame.LinkButton:SetPoint(\"BOTTOMLEFT\", 4, 4)\n\n\tT.SkinDropDownBox(DressUpFrameOutfitDropDown)\n\tDressUpFrameOutfitDropDown:SetSize(195, 34)\n\tDressUpFrameOutfitDropDown.SaveButton:SkinButton()\n\tDressUpFrameOutfitDropDown.SaveButton:ClearAllPoints()\n\tDressUpFrameOutfitDropDown.SaveButton:SetPoint(\"RIGHT\", DressUpFrameOutfitDropDown, 86, 4)\n\n\tT.SkinCloseButton(DressUpFrameCloseButton, DressUpFrame.backdrop)\n\n\tSideDressUpFrame:StripTextures()\n\tSideDressUpFrame:SetTemplate(\"Transparent\")\n\tSideDressUpFrame.ResetButton:SkinButton()\n\tSideDressUpFrame.BGTopLeft:SetPoint(\"TOPLEFT\", 2, -2)\n\tSideDressUpFrame.BGTopLeft:SetSize(183, 292)\n\tSideDressUpFrame.BGBottomLeft:SetSize(183, 93)\n\tT.SkinCloseButton(SideDressUpFrameCloseButton, SideDressUpFrame)\n\n\tWardrobeOutfitFrame:StripTextures(true)\n\tWardrobeOutfitFrame:CreateBackdrop(\"Transparent\")\n\tWardrobeOutfitFrame.backdrop:SetPoint(\"TOPLEFT\", WardrobeOutfitFrame, \"TOPLEFT\", 6, -6)\n\tWardrobeOutfitFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", WardrobeOutfitFrame, \"BOTTOMRIGHT\", -6, 6)\n\n\tWardrobeOutfitEditFrame:StripTextures(true)\n\tWardrobeOutfitEditFrame:SetTemplate(\"Transparent\")\n\tWardrobeOutfitEditFrame.AcceptButton:SkinButton()\n\tWardrobeOutfitEditFrame.CancelButton:SkinButton()\n\tWardrobeOutfitEditFrame.DeleteButton:SkinButton()\n\tT.SkinEditBox(WardrobeOutfitEditFrame.EditBox, 250, 25)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/EditorManager.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tEdit Mode Manager skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = _G.EditModeManagerFrame\n\tT.SkinFrame(frame)\n\n\tframe.Tutorial:Kill()\n\n\tframe.RevertAllChangesButton:SkinButton()\n\tframe.SaveChangesButton:SkinButton()\n\tT.SkinDropDownBox(frame.LayoutDropdown.DropDownMenu, 240)\n\n\tT.SkinCheckBox(frame.ShowGridCheckButton.Button, 30)\n\tT.SkinCheckBox(frame.EnableSnapCheckButton.Button, 30)\n\n\tT.SkinSliderStep(frame.GridSpacingSlider.Slider, true)\n\n\tfor _, frame in next, {frame.AccountSettings.Settings:GetChildren()} do\n\t\tif frame.Button then\n\t\t\tT.SkinCheckBox(frame.Button, 30)\n\t\tend\n\tend\n\n\tlocal function HandleDialogs()\n\t\tlocal dialog = _G.EditModeSystemSettingsDialog\n\t\tfor _, button in next, {dialog.Buttons:GetChildren()} do\n\t\t\tif button.Controller and not button.isSkinned then\n\t\t\t\tbutton:SkinButton()\n\t\t\tend\n\t\tend\n\n\t\tfor _, frame in next, {dialog.Settings:GetChildren()} do\n\t\t\tlocal dd = frame.Dropdown\n\t\t\tif dd and (dd.DropDownMenu and not dd.isSkinned) then\n\t\t\t\tT.SkinDropDownBox(dd.DropDownMenu, 240)\n\t\t\t\tdd.isSkinned = true\n\t\t\tend\n\n\t\t\tlocal checkbox = frame.Button\n\t\t\tif checkbox and not checkbox.backdrop then\n\t\t\t\tT.SkinCheckBoxAtlas(checkbox)\n\t\t\tend\n\n\t\t\tlocal slider = frame.Slider\n\t\t\tif slider and not slider.isSkinned then\n\t\t\t\tT.SkinSliderStep(slider, true)\n\t\t\t\tslider.isSkinned = true\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Layout Creator\n\tlocal layout = _G.EditModeNewLayoutDialog\n\tlayout:StripTextures()\n\tlayout:CreateBackdrop(\"Transparent\")\n\tlayout.AcceptButton:SkinButton()\n\tlayout.CancelButton:SkinButton()\n\tT.SkinEditBox(layout.LayoutNameEditBox)\n\tT.SkinCheckBoxAtlas(layout.CharacterSpecificLayoutCheckButton.Button, 26)\n\n\t-- Layout Unsaved\n\tlocal unsaved = _G.EditModeUnsavedChangesDialog\n\tunsaved:StripTextures()\n\tunsaved:CreateBackdrop(\"Transparent\")\n\tunsaved.CancelButton:SkinButton()\n\tunsaved.ProceedButton:SkinButton()\n\tunsaved.SaveAndProceedButton:SkinButton()\n\n\t-- Layout Importer\n\tlocal import = _G.EditModeImportLayoutDialog\n\timport:StripTextures()\n\timport:CreateBackdrop(\"Transparent\")\n\timport.AcceptButton:SkinButton()\n\timport.CancelButton:SkinButton()\n\tT.SkinCheckBoxAtlas(import.CharacterSpecificLayoutCheckButton.Button, 26)\n\n\tlocal importBox = import.ImportBox\n\tT.SkinEditBox(importBox)\n\n\tlocal importBackdrop = importBox.backdrop\n\timportBackdrop:ClearAllPoints()\n\timportBackdrop:SetPoint(\"TOPLEFT\", importBox, -4, 4)\n\timportBackdrop:SetPoint(\"BOTTOMRIGHT\", importBox, 0, -4)\n\n\tlocal scrollbar = importBox.ScrollBar\n\tT.SkinScrollBar(scrollbar)\n\tscrollbar:ClearAllPoints()\n\tscrollbar:SetPoint(\"TOPLEFT\", importBox, \"TOPRIGHT\", 4, 4)\n\tscrollbar:SetPoint(\"BOTTOMLEFT\", importBox, \"BOTTOMRIGHT\", 0, -4)\n\n\tlocal editbox = import.LayoutNameEditBox\n\tT.SkinEditBox(editbox)\n\n\tlocal editbackdrop = editbox.backdrop\n\teditbackdrop:ClearAllPoints()\n\teditbackdrop:SetPoint(\"TOPLEFT\", editbox, -2, -4)\n\teditbackdrop:SetPoint(\"BOTTOMRIGHT\", editbox, 2, 4)\n\n\t-- Dialog (Mover Settings)\n\tlocal dialog = _G.EditModeSystemSettingsDialog\n\tdialog:StripTextures()\n\tdialog:CreateBackdrop(\"Transparent\")\n\tT.SkinCloseButton(dialog.CloseButton)\n\n\thooksecurefunc(dialog.Buttons, \"AddLayoutChildren\", HandleDialogs)\n\tHandleDialogs()\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/EncounterJournal.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tEncounterJournal skin\n----------------------------------------------------------------------------------------\nlocal LoadTootlipSkin = CreateFrame(\"Frame\")\nLoadTootlipSkin:RegisterEvent(\"ADDON_LOADED\")\nLoadTootlipSkin:SetScript(\"OnEvent\", function(self, _, addon)\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") or not C.tooltip.enable then\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\t\treturn\n\tend\n\n\tif addon == \"Blizzard_EncounterJournal\" then\n\t\tlocal tooltip = EncounterJournalTooltip\n\t\tlocal item1 = tooltip.Item1\n\t\tlocal item2 = tooltip.Item2\n\t\ttooltip.NineSlice:SetTemplate(\"Transparent\")\n\n\t\tlocal b = CreateFrame(\"Frame\", \"$parentBackdrop\", item1)\n\t\tb:SetPoint(\"TOPLEFT\", item1.icon, -2, 2)\n\t\tb:SetPoint(\"BOTTOMRIGHT\", item1.icon, 2, -2)\n\t\tb:SetFrameLevel(1)\n\t\tb:SetTemplate(\"Default\")\n\n\t\tlocal c = CreateFrame(\"Frame\", \"$parentBackdrop\", item2)\n\t\tc:SetPoint(\"TOPLEFT\", item2.icon, -2, 2)\n\t\tc:SetPoint(\"BOTTOMRIGHT\", item2.icon, 2, -2)\n\t\tc:SetFrameLevel(1)\n\t\tc:SetTemplate(\"Default\")\n\n\t\titem1.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\titem2.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\titem1.IconBorder:SetAlpha(0)\n\t\titem2.IconBorder:SetAlpha(0)\n\tend\nend)\n\nif C.skins.blizzard_frames ~= true then return end\nlocal function LoadSkin()\n\tEncounterJournal:StripTextures(true)\n\tEncounterJournal.inset:StripTextures(true)\n\tEncounterJournal:CreateBackdrop(\"Transparent\")\n\tEncounterJournal.backdrop:SetPoint(\"TOPLEFT\", -3, 0)\n\tEncounterJournal.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, -2)\n\tEncounterJournalPortrait:SetAlpha(0)\n\n\tEncounterJournalNavBar:StripTextures(true)\n\tEncounterJournalNavBar.overlay:StripTextures(true)\n\n\tEncounterJournalNavBar:CreateBackdrop(\"Transparent\")\n\tEncounterJournalNavBar.backdrop:SetPoint(\"TOPLEFT\", -3, 1)\n\tEncounterJournalNavBar.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, -1)\n\tEncounterJournalNavBarHomeButton:SkinButton(true)\n\tEncounterJournalEncounterFrameInfoFilterToggle:SkinButton(true)\n\tEncounterJournalEncounterFrameInfoSlotFilterToggle:SkinButton(true)\n\tEncounterJournalEncounterFrameInfoClassFilterClearFrame:GetRegions():SetAlpha(0)\n\tEncounterJournalEncounterFrameInfoDifficulty:SkinButton(true)\n\tEncounterJournalEncounterFrameInfoDifficulty:SetWidth(95)\n\tEncounterJournalEncounterFrameInfoDifficulty:SetPoint(\"TOPRIGHT\", EncounterJournalEncounterFrameInfo, \"TOPRIGHT\", -7, -13)\n\t-- EncounterJournalEncounterFrameInfoLootScrollFrameFilterToggle:SetPoint(\"TOPLEFT\", EncounterJournalEncounterFrameInfo, \"TOPRIGHT\", -349, -13)\n\thooksecurefunc(EncounterJournalEncounterFrameInfoResetButton, \"SetPoint\", function(self, _, _, _, x)\n\t\tif x == -10 then\n\t\t\tself:SetPoint(\"RIGHT\", EncounterJournalEncounterFrameInfoDifficulty, \"LEFT\", -5, 0)\n\t\tend\n\tend)\n\n\tlocal mainTabs = {\n\t\tEncounterJournalSuggestTab,\n\t\tEncounterJournalDungeonTab,\n\t\tEncounterJournalRaidTab,\n\t\tEncounterJournalLootJournalTab\n\t}\n\n\tif T.newPatch then\n\t\ttinsert(mainTabs, 1, EncounterJournalMonthlyActivitiesTab)\n\tend\n\n\tfor _, tab in pairs(mainTabs) do\n\t\tT.SkinTab(tab)\n\tend\n\n\tmainTabs[1]:SetPoint(\"TOPLEFT\", EncounterJournal, \"BOTTOMLEFT\", 11, 0)\n\n\tT.SkinEditBox(EncounterJournalSearchBox)\n\tT.SkinCloseButton(EncounterJournalCloseButton)\n\tT.SkinDropDownBox(EncounterJournalInstanceSelectTierDropDown)\n\n\tif T.newPatch then\n\t\tEncounterJournalInstanceSelectBG:SetAlpha(0)\n\tend\n\n\tEncounterJournalInstanceSelect.bg:Kill()\n\tEncounterJournalEncounterFrameInfoBG:Kill()\n\tEncounterJournal.encounter.info.leftShadow:Kill()\n\tEncounterJournal.encounter.info.rightShadow:Kill()\n\tEncounterJournal.encounter.info.model.dungeonBG:Kill()\n\tEncounterJournalEncounterFrameInfoModelFrameShadow:Kill()\n\tEncounterJournal.encounter.info.instanceButton:ClearAllPoints()\n\tEncounterJournal.encounter.info.instanceButton:SetPoint(\"TOPLEFT\", EncounterJournal.encounter.info, \"TOPLEFT\", 0, 15)\n\tEncounterJournal.encounter.info.instanceTitle:ClearAllPoints()\n\tEncounterJournal.encounter.info.instanceTitle:SetPoint(\"BOTTOM\", EncounterJournal.encounter.info.bossesScroll, \"TOP\", 10, 15)\n\tEncounterJournal.encounter.info.detailsScroll.child.description:SetTextColor(1, 1, 1)\n\tEncounterJournal.encounter.info.overviewScroll.child.loreDescription:SetTextColor(1, 1, 1)\n\tEncounterJournalEncounterFrameInfoOverviewScrollFrameScrollChildHeader:SetAlpha(0)\n\tEncounterJournalEncounterFrameInfoOverviewScrollFrameScrollChildTitle:SetFont(C.media.normal_font, 16, \"\")\n\tEncounterJournalEncounterFrameInfoOverviewScrollFrameScrollChildTitle:SetTextColor(1, 1, 1)\n\tEncounterJournalEncounterFrameInfoOverviewScrollFrameScrollChild.overviewDescription.Text:SetTextColor(\"P\", 1, 1, 1)\n\tEncounterJournal.encounter.info.reset:StripTextures()\n\tEncounterJournal.encounter.info.reset:SkinButton()\n\tEncounterJournalEncounterFrameInfoResetButtonTexture:SetTexture(\"Interface\\\\EncounterJournal\\\\UI-EncounterJournalTextures\")\n\tEncounterJournalEncounterFrameInfoResetButtonTexture:SetTexCoord(0.90625000, 0.94726563, 0.00097656, 0.02050781)\n\n\tlocal tabs = {\n\t\tEncounterJournalEncounterFrameInfoOverviewTab,\n\t\tEncounterJournalEncounterFrameInfoLootTab,\n\t\tEncounterJournalEncounterFrameInfoBossTab,\n\t\tEncounterJournalEncounterFrameInfoModelTab\n\t}\n\tfor _, tab in pairs(tabs) do\n\t\ttab:CreateBackdrop(\"Overlay\")\n\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 3, -3)\n\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\ttab:SetNormalTexture(0)\n\t\ttab:SetPushedTexture(0)\n\t\ttab:SetDisabledTexture(0)\n\t\ttab:SetHighlightTexture(0)\n\tend\n\n\tEncounterJournalEncounterFrameInfoOverviewTab:SetPoint(\"TOPLEFT\", EncounterJournalEncounterFrameInfo, \"TOPRIGHT\", 8, -40)\n\tEncounterJournalEncounterFrameInfoOverviewTab.SetPoint = T.dummy\n\n\tT.SkinScrollBar(EncounterJournalInstanceSelect.ScrollBar)\n\tT.SkinScrollBar(EncounterJournalEncounterFrameInfo.LootContainer.ScrollBar)\n\tT.SkinScrollBar(EncounterJournalEncounterFrameInstanceFrame.LoreScrollBar)\n\tT.SkinScrollBar(EncounterJournalEncounterFrameInfoDetailsScrollFrameScrollBar)\n\tT.SkinScrollBar(EncounterJournalEncounterFrameInfo.BossesScrollBar)\n\tT.SkinScrollBar(EncounterJournalEncounterFrameInfoOverviewScrollFrameScrollBar)\n\n\tfor i = 1, AJ_MAX_NUM_SUGGESTIONS do\n\t\tlocal suggestion = EncounterJournal.suggestFrame[\"Suggestion\"..i]\n\t\tsuggestion.bg:Hide()\n\t\tsuggestion.centerDisplay.title.text:SetTextColor(1, 1, 1)\n\t\tsuggestion.centerDisplay.description.text:SetTextColor(1, 1, 1)\n\t\tsuggestion.reward.iconRing:Hide()\n\t\tsuggestion.reward.iconRingHighlight:SetTexture(\"\")\n\n\t\tsuggestion.icon.b = CreateFrame(\"Frame\", nil, suggestion)\n\t\tsuggestion.icon.b:SetTemplate(\"Default\")\n\t\tsuggestion.icon.b:SetPoint(\"TOPLEFT\", suggestion.icon, \"TOPLEFT\", -2, 2)\n\t\tsuggestion.icon.b:SetPoint(\"BOTTOMRIGHT\", suggestion.icon, \"BOTTOMRIGHT\", 2, -2)\n\t\tsuggestion.icon.b:SetFrameLevel(1)\n\n\t\tsuggestion.reward:CreateBackdrop(\"Default\")\n\t\tsuggestion.reward.backdrop:SetFrameLevel(suggestion.reward:GetFrameLevel())\n\t\tsuggestion.reward.backdrop:SetPoint(\"TOPLEFT\", suggestion.reward.icon, -2, 2)\n\t\tsuggestion.reward.backdrop:SetPoint(\"BOTTOMRIGHT\", suggestion.reward.icon, 2, -2)\n\t\tsuggestion:CreateBackdrop(\"Overlay\")\n\t\tsuggestion.backdrop:SetFrameLevel(0)\n\n\t\tif i == 1 then\n\t\t\tsuggestion.icon:SetPoint(\"TOPLEFT\", 135, -15)\n\t\t\tsuggestion.button:SkinButton()\n\t\t\tsuggestion.reward.text:SetTextColor(1, 1, 1)\n\t\t\tsuggestion.backdrop:SetPoint(\"TOPLEFT\", -2, -2)\n\t\t\tT.SkinNextPrevButton(suggestion.prevButton)\n\t\t\tT.SkinNextPrevButton(suggestion.nextButton)\n\t\telse\n\t\t\tsuggestion.icon:SetPoint(\"TOPLEFT\", 10, -10)\n\t\t\tsuggestion.centerDisplay:SetPoint(\"TOPLEFT\", 85, -10)\n\t\t\tsuggestion.centerDisplay.button:SkinButton()\n\t\tend\n\tend\n\n\tEncounterJournalEncounterFrameInstanceFrame.titleBG:SetAlpha(0)\n\tEncounterJournalEncounterFrameInstanceFrameBG:SetTexCoord(0.69, 0.06, 0.58, 0.09)\n\tEncounterJournalEncounterFrameInstanceFrameBG:SetRotation(rad(180))\n\tEncounterJournalEncounterFrameInstanceFrame:CreateBackdrop(\"Default\")\n\tEncounterJournalEncounterFrameInstanceFrame.backdrop:SetOutside(EncounterJournalEncounterFrameInstanceFrameBG)\n\tEncounterJournalEncounterFrameInstanceFrameBG:SetSize(325, 240)\n\tEncounterJournalEncounterFrameInstanceFrameBG:ClearAllPoints()\n\tEncounterJournalEncounterFrameInstanceFrameBG:SetPoint(\"TOP\", EncounterJournalEncounterFrameInstanceFrame, \"TOP\", 0, -45)\n\tEncounterJournalEncounterFrameInstanceFrameMapButton:ClearAllPoints()\n\tEncounterJournalEncounterFrameInstanceFrameMapButton:SetPoint(\"BOTTOMLEFT\", EncounterJournalEncounterFrameInstanceFrameBG, \"BOTTOMLEFT\", 5, 5)\n\tEncounterJournalEncounterFrameInstanceFrame.LoreScrollingFont:SetHeight(EncounterJournalEncounterFrameInstanceFrame.LoreScrollingFont:GetHeight() + 25)\n\n\tfor _, child in next, { _G.EncounterJournalEncounterFrameInstanceFrame.LoreScrollingFont.ScrollBox.ScrollTarget:GetChildren() } do\n\t\tif child.FontString then\n\t\t\tchild.FontString:SetTextColor(1, 1, 1)\n\t\tend\n\tend\n\n\thooksecurefunc(_G.EncounterJournal.instanceSelect.ScrollBox, \"Update\", function(frame)\n\t\tfor _, b in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not b.isSkinned then\n\t\t\t\tb:SkinButton()\n\t\t\t\tif b.bgImage then\n\t\t\t\t\tb.bgImage:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\t\tb.bgImage:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\t\tb.bgImage:SetTexCoord(0.08, 0.6, 0.08, 0.6)\n\t\t\t\t\tb.bgImage:SetDrawLayer(\"ARTWORK\")\n\t\t\t\tend\n\n\t\t\t\tb.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(_G.EncounterJournal.encounter.info.BossesScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not child.isSkinned then\n\t\t\t\tchild:SkinButton()\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(_G.EncounterJournal.encounter.info.LootContainer.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not child.isSkinned then\n\t\t\t\tif child.bossTexture then child.bossTexture:SetAlpha(0) end\n\t\t\t\tif child.bosslessTexture then child.bosslessTexture:SetAlpha(0) end\n\n\t\t\t\tif child.boss then\n\t\t\t\t\tchild.boss:ClearAllPoints()\n\t\t\t\t\tchild.boss:SetPoint(\"BOTTOMLEFT\", 4, 4)\n\t\t\t\t\tchild.boss:SetTextColor(1, 1, 1)\n\t\t\t\tend\n\n\t\t\t\tif child.slot then\n\t\t\t\t\tchild.slot:ClearAllPoints()\n\t\t\t\t\tchild.slot:SetPoint(\"BOTTOMLEFT\", child.icon, \"BOTTOMRIGHT\", 7, -2)\n\t\t\t\t\tchild.slot:SetTextColor(1, 1, 1)\n\t\t\t\tend\n\n\t\t\t\tif child.armorType then\n\t\t\t\t\tchild.armorType:ClearAllPoints()\n\t\t\t\t\tchild.armorType:SetPoint(\"BOTTOMRIGHT\", child.name, \"TOPLEFT\", 264, -25)\n\t\t\t\t\tchild.armorType:SetTextColor(1, 1, 1)\n\t\t\t\tend\n\n\t\t\t\tif child.icon then\n\t\t\t\t\tchild.icon:SetSize(30, 30)\n\t\t\t\t\tchild.icon:SetPoint(\"TOPLEFT\", T.mult*6, -(T.mult*10))\n\t\t\t\t\tchild.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\tchild.icon:SetDrawLayer(\"ARTWORK\")\n\n\t\t\t\t\tif not child.IconBackdrop then\n\t\t\t\t\t\tchild.IconBackdrop = CreateFrame(\"Frame\", nil, child)\n\t\t\t\t\t\tchild.IconBackdrop:SetFrameLevel(child:GetFrameLevel())\n\t\t\t\t\t\tchild.IconBackdrop:SetPoint(\"TOPLEFT\", child.icon, -2, 2)\n\t\t\t\t\t\tchild.IconBackdrop:SetPoint(\"BOTTOMRIGHT\", child.icon, 2, -2)\n\t\t\t\t\t\tchild.IconBackdrop:SetTemplate(\"Default\")\n\n\t\t\t\t\t\thooksecurefunc(child.IconBorder, \"SetVertexColor\", function(self, r, g, b)\n\t\t\t\t\t\t\tself:GetParent().IconBackdrop:SetBackdropBorderColor(r, g, b)\n\t\t\t\t\t\t\tself:SetTexture(\"\")\n\t\t\t\t\t\tend)\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tif not child.backdrop and not child.TipButton then\n\t\t\t\t\tchild:CreateBackdrop(\"Overlay\")\n\t\t\t\t\tchild.backdrop:SetPoint(\"TOPLEFT\", 0, -4)\n\t\t\t\t\tchild.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\t\t\t\tend\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal function SkinOverviewInfo(self, _, index)\n\t\tlocal header = self.overviews[index]\n\t\tif not header.isSkinned then\n\n\t\t\theader.descriptionBG:SetAlpha(0)\n\t\t\theader.descriptionBGBottom:SetAlpha(0)\n\t\t\tfor i = 4, 18 do\n\t\t\t\tselect(i, header.button:GetRegions()):SetTexture(\"\")\n\t\t\tend\n\n\t\t\theader.button:SkinButton()\n\t\t\theader.button.title:SetTextColor(1, 1, 0)\n\t\t\theader.button.title.SetTextColor = T.dummy\n\t\t\theader.button.expandedIcon:SetTextColor(1, 1, 1)\n\t\t\theader.button.expandedIcon.SetTextColor = T.dummy\n\n\t\t\theader.isSkinned = true\n\t\tend\n\tend\n\thooksecurefunc(\"EncounterJournal_SetUpOverview\", SkinOverviewInfo)\n\n\tlocal function SkinOverviewInfoBullets(object)\n\t\tlocal parent = object:GetParent()\n\n\t\tif parent.Bullets then\n\t\t\tfor _, bullet in pairs(parent.Bullets) do\n\t\t\t\tif not bullet.styled then\n\t\t\t\t\tbullet.Text:SetTextColor(\"P\", 1, 1, 1)\n\t\t\t\t\tbullet.styled = true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(\"EncounterJournal_SetBullets\", SkinOverviewInfoBullets)\n\n\tlocal function SkinAbilitiesInfo()\n\t\tlocal index = 1\n\t\tlocal header = _G[\"EncounterJournalInfoHeader\"..index]\n\t\twhile header do\n\t\t\tif not header.isSkinned then\n\t\t\t\theader.flashAnim.Play = T.dummy\n\n\t\t\t\theader.descriptionBG:SetAlpha(0)\n\t\t\t\theader.descriptionBGBottom:SetAlpha(0)\n\t\t\t\tfor i = 4, 18 do\n\t\t\t\t\tselect(i, header.button:GetRegions()):SetTexture(\"\")\n\t\t\t\tend\n\n\t\t\t\theader.description:SetTextColor(1, 1, 1)\n\t\t\t\theader.button.title:SetTextColor(1, 1, 0)\n\t\t\t\theader.button.title.SetTextColor = T.dummy\n\t\t\t\theader.button.expandedIcon:SetTextColor(1, 1, 1)\n\t\t\t\theader.button.expandedIcon.SetTextColor = T.dummy\n\t\t\t\theader.button:SkinButton(true)\n\t\t\t\theader.button.bg = CreateFrame(\"Frame\", nil, header.button)\n\t\t\t\theader.button.bg:SetTemplate(\"Default\")\n\t\t\t\theader.button.bg:SetFrameLevel(header.button.bg:GetFrameLevel() - 1)\n\t\t\t\theader.button.abilityIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tif header.button.abilityIcon:IsShown() then\n\t\t\t\t\theader.button.bg:Show()\n\t\t\t\telse\n\t\t\t\t\theader.button.bg:Hide()\n\t\t\t\tend\n\t\t\t\theader.isSkinned = true\n\t\t\tend\n\n\t\t\tif header.button.abilityIcon:IsShown() then\n\t\t\t\theader.button.bg:Show()\n\t\t\telse\n\t\t\t\theader.button.bg:Hide()\n\t\t\tend\n\n\t\t\tindex = index + 1\n\t\t\theader = _G[\"EncounterJournalInfoHeader\"..index]\n\t\tend\n\tend\n\thooksecurefunc(\"EncounterJournal_ToggleHeaders\", SkinAbilitiesInfo)\n\n\thooksecurefunc(\"EJSuggestFrame_RefreshDisplay\", function()\n\t\tlocal self = EncounterJournal.suggestFrame\n\n\t\tif #self.suggestions > 0 then\n\t\t\tlocal suggestion = self.Suggestion1\n\t\t\tlocal data = self.suggestions[1]\n\n\t\t\tsuggestion.iconRing:Hide()\n\n\t\t\tif data.iconPath then\n\t\t\t\tsuggestion.icon:SetMask(\"\")\n\t\t\t\tsuggestion.icon:SetTexture(data.iconPath)\n\t\t\t\tsuggestion.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tend\n\t\tend\n\n\t\tif #self.suggestions > 1 then\n\t\t\tfor i = 2, #self.suggestions do\n\t\t\t\tlocal suggestion = self[\"Suggestion\"..i]\n\t\t\t\tif not suggestion then break end\n\n\t\t\t\tlocal data = self.suggestions[i]\n\n\t\t\t\tsuggestion.iconRing:Hide()\n\n\t\t\t\tif data.iconPath then\n\t\t\t\t\tsuggestion.icon:SetMask(\"\")\n\t\t\t\t\tsuggestion.icon:SetTexture(data.iconPath)\n\t\t\t\t\tsuggestion.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(\"EJSuggestFrame_UpdateRewards\", function(suggestion)\n\t\tlocal rewardData = suggestion.reward.data\n\t\tif rewardData then\n\t\t\tlocal texture = rewardData.itemIcon or rewardData.currencyIcon or [[Interface\\Icons\\achievement_guildperk_mobilebanking]]\n\t\t\tsuggestion.reward.icon:SetMask(\"\")\n\t\t\tsuggestion.reward.icon:SetTexture(texture)\n\t\t\tsuggestion.reward.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tend\n\tend)\n\n\tlocal LootJournal = EncounterJournal.LootJournal\n\tLootJournal:DisableDrawLayer(\"BACKGROUND\")\n\tLootJournal.ClassDropDownButton:SkinButton(true)\n\tLootJournal.RuneforgePowerFilterDropDownButton:SkinButton(true)\n\n\tEncounterJournal.LootJournalItems:DisableDrawLayer(\"BACKGROUND\")\n\tT.SkinDropDownBox(EncounterJournalLootJournalViewDropDown)\n\n\tlocal itemSetsFrame = EncounterJournal.LootJournalItems.ItemSetsFrame\n\titemSetsFrame.ClassButton:SkinButton(true)\n\tT.SkinScrollBar(itemSetsFrame.scrollBar)\n\n\thooksecurefunc(itemSetsFrame, \"ConfigureItemButton\", function(_, button)\n\t\tif not button.styled then\n\t\t\tbutton.Border:SetAlpha(0)\n\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", button.Border, 5, -5)\n\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", button.Border, -4, 3)\n\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tbutton.styled = true\n\t\tend\n\n\t\tlocal quality = select(3, GetItemInfo(button.itemID))\n\t\tlocal color = ITEM_QUALITY_COLORS[quality or 1]\n\t\tbutton.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)\n\tend)\n\n\tlocal button = itemSetsFrame.buttons\n\tfor i = 1, #button do\n\t\tlocal button = button[i]\n\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 2, 2)\n\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\t\tbutton.Background:Hide()\n\t\tbutton.ItemLevel:SetTextColor(1, 1, 1)\n\tend\n\n\tT.SkinScrollBar(EncounterJournal.LootJournal.ScrollBar)\n\n\thooksecurefunc(_G.EncounterJournal.LootJournal.ScrollBox, \"Update\", function(frame)\n\t\tfor _, btn in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not btn.isSkinned then\n\t\t\t\tbtn.Background:SetAlpha(0)\n\t\t\t\tbtn.BackgroundOverlay:SetAlpha(0)\n\t\t\t\tbtn.CircleMask:Hide()\n\t\t\t\tbtn.Icon:SetSize(50, 50)\n\t\t\t\tbtn.Icon:SkinIcon(true)\n\n\t\t\t\tbtn:CreateBackdrop(\"Overlay\")\n\t\t\t\tbtn.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tbtn.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 2)\n\n\t\t\t\tbtn.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_EncounterJournal\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/EventTrace.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tEventTrace skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = EventTrace\n\tT.SkinCloseButton(frame.CloseButton)\n\n\tframe:StripTextures()\n\tframe:SetTemplate(\"Transparent\")\n\n\tEventTrace.SubtitleBar.OptionsDropDown:SkinButton()\n\tT.SkinEditBox(EventTrace.Log.Bar.SearchBox, nil, 16)\n\n\tEventTrace.Log.Events.ScrollBar.Background:Hide()\n\n\tEventTraceTooltip:HookScript(\"OnShow\", function(self)\n\t\tself.NineSlice:SetTemplate(\"Transparent\")\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_EventTrace\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/ExpansionLandingPage.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tExpansion Landing Page skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin(self)\n\tlocal frame = _G.ExpansionLandingPage\n\n\tlocal panel\n\tif frame.Overlay then\n\t\tfor i = 1, frame.Overlay:GetNumChildren() do\n\t\t\tlocal child = select(i, frame.Overlay:GetChildren())\n\t\t\tif child.DragonridingPanel then\n\t\t\t\tpanel = child\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\n\n\tif not panel then return end\n\n\tpanel.NineSlice:SetAlpha(0)\n\tpanel.Background:SetAlpha(0)\n\tpanel:SetTemplate(\"Transparent\")\n\n\tif panel.DragonridingPanel then\n\t\tpanel.DragonridingPanel.SkillsButton:SkinButton()\n\tend\n\n\tif panel.CloseButton then\n\t\tT.SkinCloseButton(panel.CloseButton)\n\tend\n\n\tself:UnregisterEvent(\"ADDON_LOADED\")\nend\n\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function(self, _, addon)\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") then\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\t\treturn\n\tend\n\tif ExpansionLandingPage then\n\t\tLoadSkin(self)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/FlightMap.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tFlight Map skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tFlightMapFrame:CreateBackdrop(\"Transparent\")\n\tFlightMapFrame.BorderFrame:StripTextures()\n\tFlightMapFramePortrait:Kill()\n\n\tFlightMapFrame.ScrollContainer:ClearAllPoints()\n\tFlightMapFrame.ScrollContainer:SetPoint(\"TOPLEFT\")\n\tFlightMapFrame.ScrollContainer:SetPoint(\"BOTTOMRIGHT\")\n\n\tT.SkinCloseButton(FlightMapFrameCloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_FlightMap\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Friends.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tFriends skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal StripAllTextures = {\n\t\tFriendsFrame,\n\t\tFriendsListFrame,\n\t\tFriendsTabHeader,\n\t\tWhoFrameColumnHeader1,\n\t\tWhoFrameColumnHeader2,\n\t\tWhoFrameColumnHeader3,\n\t\tWhoFrameColumnHeader4,\n\t\tAddFriendFrame,\n\t\tFriendsFriendsFrame,\n\t\tIgnoreListFrame,\n\t\tFriendsFrameInset,\n\t\tWhoFrameListInset,\n\t\tWhoFrameEditBoxInset,\n\t\tLFRQueueFrameListInset,\n\t\tLFRQueueFrameRoleInset,\n\t\tLFRQueueFrameCommentInset,\n\t\tFriendsFrameBattlenetFrame,\n\t\tBattleTagInviteFrame,\n\t\tQuickJoinRoleSelectionFrame,\n\t\tFriendsFrameBattlenetFrame.BroadcastFrame,\n\t\tFriendsFrameBattlenetFrame.UnavailableInfoFrame,\n\t\tRecruitAFriendFrame.RecruitList.Header,\n\t\tRecruitAFriendFrame.RecruitList.ScrollFrameInset,\n\t\tRecruitAFriendFrame.RewardClaiming,\n\t\tRecruitAFriendRecruitmentFrame,\n\t\tRecruitAFriendRewardsFrame\n\t}\n\n\tfor i = 1, #StripAllTextures do\n\t\tStripAllTextures[i]:StripTextures()\n\tend\n\n\tlocal KillTextures = {\n\t\tFriendsFrameIcon\n\t}\n\n\tfor i = 1, #KillTextures do\n\t\tKillTextures[i]:Kill()\n\tend\n\n\tlocal buttons = {\n\t\tFriendsFrameAddFriendButton,\n\t\tFriendsFrameSendMessageButton,\n\t\tWhoFrameWhoButton,\n\t\tWhoFrameAddFriendButton,\n\t\tWhoFrameGroupInviteButton,\n\t\tFriendsFrameIgnorePlayerButton,\n\t\tFriendsFrameUnsquelchButton,\n\t\tAddFriendEntryFrameAcceptButton,\n\t\tAddFriendEntryFrameCancelButton,\n\t\tAddFriendInfoFrameContinueButton,\n\t\tQuickJoinFrame.JoinQueueButton,\n\t\tQuickJoinRoleSelectionFrame.AcceptButton,\n\t\tQuickJoinRoleSelectionFrame.CancelButton,\n\t\t-- FriendsListFrameScrollFrame.PendingInvitesHeaderButton,\n\t\tFriendsFrameBattlenetFrame.BroadcastFrame.CancelButton,\n\t\tFriendsFrameBattlenetFrame.BroadcastFrame.UpdateButton,\n\t\tRecruitAFriendFrame.RewardClaiming.ClaimOrViewRewardButton,\n\t\tRecruitAFriendFrame.RecruitmentButton,\n\t\tRecruitAFriendFrame.SplashFrame.OKButton,\n\t\tRecruitAFriendRecruitmentFrame.GenerateOrCopyLinkButton,\n\t}\n\n\tfor i = 1, #buttons do\n\t\tbuttons[i]:SkinButton()\n\tend\n\n\tlocal scrollbars = {\n\t\tFriendsListFrame.ScrollBar,\n\t\tIgnoreListFrame.ScrollBar,\n\t\tWhoFrame.ScrollBar,\n\t\tQuickJoinFrame.ScrollBar,\n\t\tRecruitAFriendFrame.RecruitList.ScrollBar,\n\t}\n\n\tfor i = 1, #scrollbars do\n\t\tT.SkinScrollBar(scrollbars[i])\n\tend\n\n\t-- Reposition buttons\n\tWhoFrameWhoButton:SetPoint(\"RIGHT\", WhoFrameAddFriendButton, \"LEFT\", -3, 0)\n\tWhoFrameAddFriendButton:SetPoint(\"RIGHT\", WhoFrameGroupInviteButton, \"LEFT\", -3, 0)\n\tWhoFrameGroupInviteButton:SetPoint(\"BOTTOMRIGHT\", WhoFrame, \"BOTTOMRIGHT\", -4, 4)\n\tFriendsFrameAddFriendButton:SetPoint(\"BOTTOMLEFT\", FriendsFrame, \"BOTTOMLEFT\", 4, 4)\n\tFriendsFrameSendMessageButton:SetPoint(\"BOTTOMRIGHT\", FriendsFrame, \"BOTTOMRIGHT\", -4, 4)\n\tFriendsFrameIgnorePlayerButton:SetPoint(\"BOTTOMLEFT\", FriendsFrame, \"BOTTOMLEFT\", 4, 4)\n\tFriendsFrameUnsquelchButton:SetPoint(\"BOTTOMRIGHT\", FriendsFrame, \"BOTTOMRIGHT\", -4, 4)\n\n\t-- Resize Buttons\n\tWhoFrameWhoButton:SetSize(WhoFrameWhoButton:GetWidth() + 7, WhoFrameWhoButton:GetHeight())\n\tWhoFrameAddFriendButton:SetSize(WhoFrameAddFriendButton:GetWidth() - 4, WhoFrameAddFriendButton:GetHeight())\n\tWhoFrameGroupInviteButton:SetSize(WhoFrameGroupInviteButton:GetWidth() - 4, WhoFrameGroupInviteButton:GetHeight())\n\tT.SkinEditBox(WhoFrameEditBox, WhoFrameEditBox:GetWidth() + 30, WhoFrameEditBox:GetHeight() - 15)\n\tWhoFrameEditBox:SetPoint(\"BOTTOM\", WhoFrame, \"BOTTOM\", 0, 31)\n\n\tT.SkinEditBox(AddFriendNameEditBox)\n\tAddFriendNameEditBox:SetHeight(AddFriendNameEditBox:GetHeight() - 5)\n\tAddFriendFrame:SetTemplate(\"Transparent\")\n\tFriendsFriendsFrame:SetTemplate(\"Transparent\")\n\n\t-- Recruit a Friend\n\tlocal SplashFrame = RecruitAFriendFrame.SplashFrame\n\tSplashFrame:CreateBackdrop(\"Overlay\")\n\tSplashFrame.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\tSplashFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", -1, -1)\n\n\tSplashFrame.Picture.b = CreateFrame(\"Frame\", nil, SplashFrame)\n\tSplashFrame.Picture.b:SetTemplate(\"Default\")\n\tSplashFrame.Picture.b:SetPoint(\"TOPLEFT\", SplashFrame.Picture, \"TOPLEFT\", -2, 2)\n\tSplashFrame.Picture.b:SetPoint(\"BOTTOMRIGHT\", SplashFrame.Picture, \"BOTTOMRIGHT\", 2, -2)\n\tSplashFrame.Picture:SetParent(SplashFrame.Picture.b)\n\n\tRecruitAFriendFrame.SplashFrame.Description:SetTextColor(1, 1, 1)\n\n\tSplashFrame.Background:Hide()\n\tSplashFrame.PictureFrame:Hide()\n\n\tSplashFrame.Bracket_TopLeft:Hide()\n\tSplashFrame.Bracket_TopRight:Hide()\n\tSplashFrame.Bracket_BottomRight:Hide()\n\tSplashFrame.Bracket_BottomLeft:Hide()\n\tSplashFrame.PictureFrame_Bracket_TopLeft:Hide()\n\tSplashFrame.PictureFrame_Bracket_TopRight:Hide()\n\tSplashFrame.PictureFrame_Bracket_BottomRight:Hide()\n\tSplashFrame.PictureFrame_Bracket_BottomLeft:Hide()\n\n\tRecruitAFriendRewardsFrame:SetTemplate(\"Transparent\")\n\tT.SkinCloseButton(RecruitAFriendRewardsFrame.CloseButton)\n\n\tfor object in pairs(RecruitAFriendRewardsFrame.rewardPool.activeObjects) do\n\t\tobject.Button.Icon:SkinIcon()\n\t\tobject.Button.IconBorder:SetAlpha(0)\n\t\tobject.Button:StyleButton(true, 0)\n\tend\n\n\tRecruitAFriendFrame.RewardClaiming.NextRewardButton.Icon:SkinIcon()\n\tRecruitAFriendFrame.RewardClaiming.NextRewardButton.CircleMask:Hide()\n\tRecruitAFriendFrame.RewardClaiming.NextRewardButton.IconBorder:SetAlpha(0)\n\n\tRecruitAFriendRecruitmentFrame:SetTemplate(\"Transparent\")\n\tT.SkinCloseButton(RecruitAFriendRecruitmentFrame.CloseButton)\n\tT.SkinEditBox(RecruitAFriendRecruitmentFrame.EditBox, nil, 18)\n\tRecruitAFriendRecruitmentFrame.EditBox:SetPoint(\"RIGHT\", RecruitAFriendRecruitmentFrame.GenerateOrCopyLinkButton, \"LEFT\", -10, 0)\n\n\t-- Quick Join Frame\n\tQuickJoinRoleSelectionFrame:SetTemplate(\"Transparent\")\n\tT.SkinCloseButton(QuickJoinRoleSelectionFrame.CloseButton)\n\tT.SkinCheckBox(QuickJoinRoleSelectionFrame.RoleButtonTank.CheckButton)\n\tT.SkinCheckBox(QuickJoinRoleSelectionFrame.RoleButtonHealer.CheckButton)\n\tT.SkinCheckBox(QuickJoinRoleSelectionFrame.RoleButtonDPS.CheckButton)\n\n\t-- Pending invites\n\thooksecurefunc(\"FriendsFrame_UpdateFriendInviteButton\", function(button)\n\t\tif not button.IsSkinned then\n\t\t\tbutton.AcceptButton:SkinButton()\n\t\t\tbutton.DeclineButton:SkinButton()\n\n\t\t\tbutton.IsSkinned = true\n\t\tend\n\tend)\n\n\t-- Who Frame\n\tWhoFrame.ScrollBar:SetPoint(\"TOPLEFT\", WhoFrame.ScrollBox, \"TOPRIGHT\", 2, 1)\n\tWhoFrame.ScrollBar:SetPoint(\"BOTTOMLEFT\", WhoFrame.ScrollBox, \"BOTTOMRIGHT\", 5, -16)\n\n\t-- BNet Frame\n\tFriendsFrameBattlenetFrame.BroadcastButton:SetAlpha(0)\n\tFriendsFrameBattlenetFrame.BroadcastButton:ClearAllPoints()\n\tFriendsFrameBattlenetFrame.BroadcastButton:SetAllPoints(FriendsFrameBattlenetFrame)\n\n\tFriendsFrameBattlenetFrame.BroadcastFrame:CreateBackdrop(\"Transparent\")\n\tFriendsFrameBattlenetFrame.BroadcastFrame.backdrop:SetPoint(\"TOPLEFT\", 1, 1)\n\tFriendsFrameBattlenetFrame.BroadcastFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 1, 1)\n\n\tT.SkinEditBox(FriendsFrameBattlenetFrame.BroadcastFrame.EditBox, nil, 24)\n\n\tFriendsFrameBattlenetFrame.UnavailableInfoFrame:CreateBackdrop(\"Transparent\")\n\tFriendsFrameBattlenetFrame.UnavailableInfoFrame.backdrop:SetPoint(\"TOPLEFT\", 4, -4)\n\tFriendsFrameBattlenetFrame.UnavailableInfoFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", -4, 4)\n\n\tBattleTagInviteFrame:SetTemplate(\"Transparent\")\n\tfor i = 1, BattleTagInviteFrame:GetNumChildren() do\n\t\tlocal child = select(i, BattleTagInviteFrame:GetChildren())\n\t\tif child:GetObjectType() == \"Button\" then\n\t\t\tchild:SkinButton()\n\t\tend\n\tend\n\n\tFriendsFrame:SetTemplate(\"Transparent\")\n\tFriendsFrameStatusDropDown:SetPoint(\"TOPLEFT\", 1, -27)\n\n\tlocal function ReskinFriendButton(button)\n\t\tif button.styled then return end\n\t\tlocal icon = button.gameIcon\n\n\t\ticon.b = CreateFrame(\"Frame\", nil, button)\n\t\ticon.b:SetTemplate(\"Default\")\n\t\ticon.b:SetPoint(\"TOPLEFT\", icon, \"TOPLEFT\", -2, 2)\n\t\ticon.b:SetPoint(\"BOTTOMRIGHT\", icon, \"BOTTOMRIGHT\", 2, -2)\n\n\t\ticon:SetParent(icon.b)\n\t\ticon:SetSize(22, 22)\n\t\ticon:SetTexCoord(.17, .83, .17, .83)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"RIGHT\", button, \"RIGHT\", -27, 0)\n\t\ticon.SetPoint = T.dummy\n\n\t\tbutton.travelPassButton:SetSize(20, 30)\n\t\tbutton.travelPassButton:SkinButton()\n\t\tbutton.travelPassButton.NormalTexture:SetAlpha(0)\n\t\tbutton.travelPassButton.PushedTexture:SetAlpha(0)\n\t\tbutton.travelPassButton.DisabledTexture:SetAlpha(0)\n\t\tbutton.travelPassButton:SetPoint(\"TOPRIGHT\", -1, -2)\n\n\t\tbutton.inv = button.travelPassButton:CreateTexture(nil, \"OVERLAY\", nil, 7)\n\t\tbutton.inv:SetTexture([[Interface\\FriendsFrame\\PlusManz-PlusManz]])\n\t\tbutton.inv:SetPoint(\"TOPRIGHT\", 1, -4)\n\t\tbutton.inv:SetSize(22, 22)\n\n\t\tbutton.background:Hide()\n\t\tbutton.styled = true\n\tend\n\n\thooksecurefunc(\"FriendsFrame_UpdateFriendButton\", function(button)\n\t\tif button.gameIcon then\n\t\t\tReskinFriendButton(button)\n\t\tend\n\n\t\tif button.buttonType == FRIENDS_BUTTON_TYPE_BNET and button.travelPassButton then\n\t\t\tlocal isEnabled = button.travelPassButton:IsEnabled()\n\t\t\tbutton.travelPassButton:SetAlpha(isEnabled and 1 or 0.4)\n\t\tend\n\n\t\tif button.gameIcon.b then\n\t\t\tbutton.gameIcon.b:SetShown(button.gameIcon:IsShown())\n\t\tend\n\tend)\n\n\tT.SkinCloseButton(FriendsFrameCloseButton)\n\tT.SkinDropDownBox(WhoFrameDropDown, 150)\n\tT.SkinDropDownBox(FriendsFrameStatusDropDown, 70)\n\tT.SkinDropDownBox(FriendsFriendsFrameDropDown)\n\n\t-- Bottom Tabs\n\tfor i = 1, 4 do\n\t\tT.SkinTab(_G[\"FriendsFrameTab\"..i])\n\tend\n\n\tfor i = 1, 3 do\n\t\tT.SkinTab(_G[\"FriendsTabHeaderTab\"..i], true)\n\tend\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Garrison.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\r\n\r\n----------------------------------------------------------------------------------------\r\n--\tGarrison, OrderHall and BFA Mission skin\r\n----------------------------------------------------------------------------------------\r\nlocal LoadTootlipSkin = CreateFrame(\"Frame\")\r\nLoadTootlipSkin:RegisterEvent(\"ADDON_LOADED\")\r\nLoadTootlipSkin:SetScript(\"OnEvent\", function(self, _, addon)\r\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") or not C.tooltip.enable then\r\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\r\n\t\treturn\r\n\tend\r\n\r\n\tif addon == \"ShestakUI\" then\r\n\t\tlocal Tooltips = {\r\n\t\t\tFloatingGarrisonFollowerTooltip,\r\n\t\t\tFloatingGarrisonFollowerAbilityTooltip,\r\n\t\t\tFloatingGarrisonMissionTooltip,\r\n\t\t\tFloatingGarrisonShipyardFollowerTooltip,\r\n\t\t\tGarrisonFollowerTooltip,\r\n\t\t\tGarrisonFollowerAbilityTooltip,\r\n\t\t\tGarrisonShipyardFollowerTooltip,\r\n\t\t\tGarrisonFollowerMissionAbilityWithoutCountersTooltip,\r\n\t\t\tGarrisonFollowerAbilityWithoutCountersTooltip\r\n\t\t}\r\n\r\n\t\tfor _, tt in pairs(Tooltips) do\r\n\t\t\ttt.NineSlice:SetAlpha(0)\r\n\t\t\ttt:SetTemplate(\"Transparent\")\r\n\t\tend\r\n\t\tT.SkinCloseButton(FloatingGarrisonFollowerTooltip.CloseButton)\r\n\t\tT.SkinCloseButton(FloatingGarrisonFollowerAbilityTooltip.CloseButton)\r\n\t\tT.SkinCloseButton(FloatingGarrisonMissionTooltip.CloseButton)\r\n\t\tT.SkinCloseButton(FloatingGarrisonShipyardFollowerTooltip.CloseButton)\r\n\r\n\t\tGarrisonFollowerMissionAbilityWithoutCountersTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\tGarrisonFollowerAbilityWithoutCountersTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\tend\r\n\r\n\tif addon == \"Blizzard_GarrisonUI\" then\r\n\t\tGarrisonBuildingFrame.BuildingLevelTooltip:StripTextures()\r\n\t\tGarrisonBuildingFrame.BuildingLevelTooltip:SetTemplate(\"Transparent\")\r\n\r\n\t\tGarrisonShipyardMapMissionTooltip:StripTextures()\r\n\t\tGarrisonShipyardMapMissionTooltip:SetTemplate(\"Transparent\")\r\n\t\tGarrisonShipyardMapMissionTooltip.ItemTooltip.IconBorder:SetAlpha(0)\r\n\t\tGarrisonShipyardMapMissionTooltip.ItemTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\r\n\t\tGarrisonMissionMechanicFollowerCounterTooltip:HookScript(\"OnShow\", function(self)\r\n\t\t\tself:SetTemplate(\"Transparent\")\r\n\t\tend)\r\n\t\tGarrisonMissionMechanicTooltip:HookScript(\"OnShow\", function(self)\r\n\t\t\tself:SetTemplate(\"Transparent\")\r\n\t\tend)\r\n\r\n\t\tGarrisonLandingPage.FollowerTab.AbilitiesFrame.FlavorText:SetFontObject(SystemFont_Shadow_Med3)\r\n\tend\r\nend)\r\n\r\nif C.skins.blizzard_frames ~= true then return end\r\n\r\nlocal function LoadSkin()\r\n\t-- Garrison Building frame\r\n\tGarrisonBuildingFrame:StripTextures()\r\n\tGarrisonBuildingFrame:SetTemplate(\"Transparent\")\r\n\tT.SkinCloseButton(GarrisonBuildingFrame.CloseButton)\r\n\tGarrisonBuildingFrame.GarrCorners:Hide()\r\n\r\n\tfor _, button in pairs({GarrisonBuildingFrame.TownHallBox.UpgradeButton, GarrisonBuildingFrame.InfoBox.UpgradeButton}) do\r\n\t\tbutton:StripTextures(true)\r\n\t\tbutton:SkinButton()\r\n\tend\r\n\r\n\t-- Confirmation popup\r\n\tlocal Confirmation = GarrisonBuildingFrame.Confirmation\r\n\tConfirmation:StripTextures()\r\n\tConfirmation:SetTemplate(\"Transparent\")\r\n\r\n\tConfirmation.CancelButton:SkinButton()\r\n\tConfirmation.BuildButton:SkinButton()\r\n\tConfirmation.UpgradeButton:SkinButton()\r\n\tConfirmation.UpgradeGarrisonButton:SkinButton()\r\n\tConfirmation.ReplaceButton:SkinButton()\r\n\tConfirmation.SwitchButton:SkinButton()\r\n\r\n\t-- Mission UI\r\n\tGarrisonMissionFrame:StripTextures()\r\n\tGarrisonMissionFrame.GarrCorners:StripTextures()\r\n\tGarrisonMissionFrame.TitleText:Show()\r\n\tGarrisonMissionFrame:SetTemplate(\"Transparent\")\r\n\tT.SkinCloseButton(GarrisonMissionFrame.CloseButton)\r\n\tGarrisonMissionFrameTab1:SetPoint(\"BOTTOMLEFT\", GarrisonMissionFrame, \"BOTTOMLEFT\", 11, -40)\r\n\tT.SkinTab(GarrisonMissionFrameTab1)\r\n\tT.SkinTab(GarrisonMissionFrameTab2)\r\n\r\n\t-- Mission list\r\n\tlocal MissionTab = GarrisonMissionFrame.MissionTab\r\n\tlocal MissionList = MissionTab.MissionList\r\n\tlocal MissionPage = GarrisonMissionFrame.MissionTab.MissionPage\r\n\tMissionList:DisableDrawLayer(\"BORDER\")\r\n\tT.SkinScrollBar(GarrisonMissionFrameMissions.ScrollBar)\r\n\tT.SkinCloseButton(MissionPage.CloseButton)\r\n\tMissionPage.CloseButton:SetFrameLevel(MissionPage:GetFrameLevel() + 2)\r\n\tMissionList.CompleteDialog.BorderFrame.ViewButton:SkinButton()\r\n\tGarrisonMissionFrame.MissionComplete.NextMissionButton:SkinButton()\r\n\r\n\tlocal function SkinTab(tab)\r\n\t\ttab:StripTextures()\r\n\t\ttab:StyleButton()\r\n\t\ttab:CreateBackdrop(\"Overlay\")\r\n\t\ttab.backdrop:SetAllPoints()\r\n\t\ttab:SetHeight(tab:GetHeight() - 10)\r\n\tend\r\n\r\n\tSkinTab(GarrisonMissionFrameMissionsTab1)\r\n\tSkinTab(GarrisonMissionFrameMissionsTab2)\r\n\tGarrisonMissionFrameMissionsTab1:SetPoint(\"BOTTOMLEFT\", GarrisonMissionFrameMissions, \"TOPLEFT\", 18, 0)\r\n\tGarrisonMissionFrameMissionsTab1.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\tGarrisonMissionFrameMissionsTab1.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1)\r\n\r\n\thooksecurefunc(\"GarrisonMissonListTab_SetSelected\", function(tab, isSelected)\r\n\t\tif isSelected then\r\n\t\t\ttab.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\t\t\ttab.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1)\r\n\t\telse\r\n\t\t\ttab.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\t\ttab.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\r\n\t\tend\r\n\tend)\r\n\r\n\thooksecurefunc(GarrisonMissionFrame.MissionTab.MissionList.ScrollBox, \"Update\", function(frame)\r\n\t\tfor i = 1, frame.ScrollTarget:GetNumChildren() do\r\n\t\t\tlocal button = select(i, frame.ScrollTarget:GetChildren())\r\n\t\t\tif not button.backdrop then\r\n\t\t\t\tbutton:StripTextures()\r\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\r\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\r\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\r\n\t\t\t\tbutton:StyleButton(nil, 2)\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\tGarrisonMissionFrameFollowers:StripTextures()\r\n\tGarrisonMissionFrameFollowers:SetTemplate(\"Transparent\")\r\n\tT.SkinEditBox(GarrisonMissionFrameFollowers.SearchBox)\r\n\tGarrisonMissionFrameFollowers.SearchBox:SetPoint(\"TOPLEFT\", 2, 25)\r\n\tGarrisonMissionFrameFollowers.SearchBox:SetSize(301, 20)\r\n\tT.SkinScrollBar(GarrisonMissionFrameFollowers.ScrollBar)\r\n\tGarrisonMissionFrameFollowers.MaterialFrame:GetRegions():Hide()\r\n\tGarrisonMissionFrameMissions.MaterialFrame:GetRegions():Hide()\r\n\r\n\tGarrisonMissionFrameFollowers.ScrollBar:SetPoint(\"TOPLEFT\", GarrisonMissionFrameFollowers.ScrollBox, \"TOPRIGHT\", -6, 3)\r\n\tGarrisonMissionFrameFollowers.ScrollBar:SetPoint(\"BOTTOMLEFT\", GarrisonMissionFrameFollowers.ScrollBox, \"BOTTOMRIGHT\", -3, -1)\r\n\r\n\tGarrisonMissionFrame.FollowerTab:StripTextures()\r\n\tGarrisonMissionFrame.FollowerTab:SetTemplate(\"Overlay\")\r\n\r\n\tfor _, item in pairs({GarrisonMissionFrame.FollowerTab.ItemWeapon, GarrisonMissionFrame.FollowerTab.ItemArmor}) do\r\n\t\titem.Border:Hide()\r\n\t\titem.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\titem:CreateBackdrop(\"Default\")\r\n\t\titem.backdrop:SetPoint(\"TOPLEFT\", item.Icon, \"TOPLEFT\", -2, 2)\r\n\t\titem.backdrop:SetPoint(\"BOTTOMRIGHT\", item.Icon, \"BOTTOMRIGHT\", 2, -2)\r\n\t\titem.backdrop:SetFrameLevel(item:GetFrameLevel())\r\n\tend\r\n\r\n\tMissionPage.StartMissionButton:SkinButton()\r\n\r\n\tlocal function HandleGarrisonPortrait(portrait)\r\n\t\tif not portrait.Portrait then return end\r\n\r\n\t\tlocal size = portrait.Portrait:GetSize() + 2\r\n\t\tportrait:SetSize(size, size)\r\n\r\n\t\tif not portrait.backdrop then\r\n\t\t\tportrait:CreateBackdrop(\"Default\")\r\n\t\t\tportrait.backdrop:SetPoint(\"TOPLEFT\", portrait, \"TOPLEFT\", -1, 1)\r\n\t\t\tportrait.backdrop:SetPoint(\"BOTTOMRIGHT\", portrait, \"BOTTOMRIGHT\", 1, -1)\r\n\t\t\tportrait.backdrop:SetFrameLevel(portrait:GetFrameLevel())\r\n\t\tend\r\n\r\n\t\tportrait.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)\r\n\t\tportrait.Portrait:ClearAllPoints()\r\n\t\tportrait.Portrait:SetInside(portrait.backdrop)\r\n\r\n\t\tif portrait.PortraitRing then\r\n\t\t\tportrait.PortraitRing:Hide()\r\n\t\t\tportrait.PortraitRingQuality:SetTexture(\"\")\r\n\t\t\tportrait.PortraitRingCover:SetTexture(\"\")\r\n\t\tend\r\n\r\n\t\tif portrait.PuckBorder then portrait.PuckBorder:SetAlpha(0) end\r\n\t\tif portrait.TroopStackBorder2 then portrait.TroopStackBorder2:SetAlpha(0) end\r\n\r\n\t\tlocal level = portrait.Level or portrait.LevelText\r\n\t\tif level then\r\n\t\t\tlevel:ClearAllPoints()\r\n\t\t\tlevel:SetPoint(\"BOTTOM\", 0, 1)\r\n\t\t\tlevel:SetFontObject(\"SystemFont_Outline_Small\")\r\n\t\t\tif portrait.LevelCircle then portrait.LevelCircle:Hide() end\r\n\t\t\tif portrait.LevelBorder then portrait.LevelBorder:SetScale(0.0001) end\r\n\t\tend\r\n\r\n\t\tif portrait.HealthBar then\r\n\t\t\tportrait.HealthBar.Border:Hide()\r\n\r\n\t\t\tlocal roleIcon = portrait.HealthBar.RoleIcon\r\n\t\t\troleIcon:ClearAllPoints()\r\n\t\t\troleIcon:SetPoint(\"TOPRIGHT\", portrait.backdrop, \"TOPRIGHT\", 4, 4)\r\n\r\n\t\t\tlocal background = portrait.HealthBar.Background\r\n\t\t\tbackground:SetAlpha(0)\r\n\t\t\tbackground:ClearAllPoints()\r\n\t\t\tbackground:SetPoint(\"TOPLEFT\", portrait.backdrop, \"BOTTOMLEFT\", 0, -3)\r\n\t\t\tbackground:SetPoint(\"BOTTOMRIGHT\", portrait.backdrop, \"BOTTOMRIGHT\", -0, -6)\r\n\t\t\tportrait.HealthBar.Health:SetTexture(C.media.texture)\r\n\r\n\t\t\tportrait.CircleMask:Hide()\r\n\t\tend\r\n\tend\r\n\r\n\tHandleGarrisonPortrait(GarrisonMissionFrame.FollowerTab.PortraitFrame)\r\n\r\n\thooksecurefunc(\"GarrisonFollowerList_InitButton\", function(frame, elementData)\r\n\t\tlocal follower = frame.Follower\r\n\t\tif follower and not follower.backdrop then\r\n\t\t\tfollower:CreateBackdrop(\"Overlay\")\r\n\t\t\tfollower.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\r\n\t\t\tfollower.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\r\n\t\t\tfollower:StyleButton()\r\n\r\n\t\t\tfollower.BG:Hide()\r\n\t\t\tfollower.Selection:SetTexture(\"\")\r\n\t\t\tfollower.AbilitiesBG:SetTexture(\"\")\r\n\t\t\tfollower.BusyFrame:SetAllPoints()\r\n\t\t\tfollower.Name:SetWordWrap(false)\r\n\r\n\t\t\tif follower.PortraitFrame then\r\n\t\t\t\tHandleGarrisonPortrait(follower.PortraitFrame)\r\n\t\t\t\tfollower.PortraitFrame:ClearAllPoints()\r\n\t\t\t\tfollower.PortraitFrame:SetPoint(\"TOPLEFT\", 6, -5)\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\tlocal counters = follower.Counters\r\n\t\tif counters then\r\n\t\t\tfor _, counter in next, counters do\r\n\t\t\t\tif counter and not counter.styled then\r\n\t\t\t\t\t-- counter:SetTemplate(\"Default\") -- FIXME looks ugly, not pixelperfect\r\n\r\n\t\t\t\t\tif counter.Border then\r\n\t\t\t\t\t\tcounter.Border:SetTexture(\"\")\r\n\t\t\t\t\tend\r\n\r\n\t\t\t\t\tif counter.Icon then\r\n\t\t\t\t\t\tcounter.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\t\t\tcounter.Icon:SetInside()\r\n\t\t\t\t\tend\r\n\t\t\t\t\tcounter.styled = true\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\tif follower then\r\n\t\t\tif follower.Selection and follower.backdrop then\r\n\t\t\t\tif follower.Selection:IsShown() then\r\n\t\t\t\t\tfollower.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\t\t\t\t\tfollower.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1)\r\n\t\t\t\t\tfollower.PortraitFrame.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\t\t\t\telse\r\n\t\t\t\t\tfollower.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\t\t\t\tfollower.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\r\n\t\t\t\t\tfollower.PortraitFrame.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\t\t\tend\r\n\t\t\tend\r\n\r\n\t\t\tlocal color = ITEM_QUALITY_COLORS[follower.PortraitFrame.quality]\r\n\t\t\tif color then\r\n\t\t\t\tfollower.Name:SetTextColor(color.r, color.g, color.b)\r\n\t\t\telse\r\n\t\t\t\tfollower.Name:SetTextColor(1, 1, 1)\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\thooksecurefunc(\"GarrisonFollowerButton_AddAbility\", function(self, index)\r\n\t\tlocal ability = self.Abilities[index]\r\n\t\tif not ability.skinned then\r\n\t\t\tability.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\tability.skinned = true\r\n\t\tend\r\n\tend)\r\n\r\n\t-- Set border color according to rarity of item\r\n\thooksecurefunc(\"GarrisonMissionButton_SetRewards\", function(self)\r\n\t\tlocal firstRegion, r, g, b\r\n\t\tlocal index = 0\r\n\t\tfor _, reward in pairs(self.Rewards) do\r\n\t\t\tfirstRegion = reward.GetRegions and reward:GetRegions()\r\n\t\t\tif firstRegion then firstRegion:Hide() end\r\n\r\n\t\t\treward:ClearAllPoints()\r\n\t\t\tif IsAddOnLoaded(\"GarrisonMissionManager\") then\r\n\t\t\t\treward:SetPoint(\"TOPRIGHT\", -T.mult * 65 + (index * -65), -T.mult)\r\n\t\t\telse\r\n\t\t\t\treward:SetPoint(\"TOPRIGHT\", -T.mult + (index * -65), -T.mult)\r\n\t\t\tend\r\n\r\n\t\t\tif reward.IconBorder then\r\n\t\t\t\treward.IconBorder:SetTexture(nil)\r\n\t\t\tend\r\n\r\n\t\t\tif reward.IconBorder and reward.IconBorder:IsShown() then\r\n\t\t\t\tr, g, b = reward.IconBorder:GetVertexColor()\r\n\t\t\telse\r\n\t\t\t\tr, g, b = unpack(C.media.border_color)\r\n\t\t\tend\r\n\r\n\t\t\tif (r > 0.64 and r < 0.67) or (r > 0.99 and g > 0.99 and b > 0.99) then\r\n\t\t\t\tr, g, b = unpack(C.media.border_color)\r\n\t\t\tend\r\n\r\n\t\t\tif not reward.backdrop then\r\n\t\t\t\treward.Icon:SkinIcon()\r\n\t\t\t\treward.backdrop:SetFrameLevel(reward:GetFrameLevel())\r\n\t\t\tend\r\n\t\t\treward.backdrop:SetBackdropBorderColor(r, g, b)\r\n\t\t\tindex = index + 1\r\n\t\tend\r\n\tend)\r\n\r\n\thooksecurefunc(\"GarrisonMissionPage_SetReward\", function(frame)\r\n\t\tframe.BG:Hide()\r\n\t\tframe.IconBorder:SetTexture(\"\")\r\n\t\tif not frame.backdrop then\r\n\t\t\tframe.Icon:SkinIcon()\r\n\t\t\tframe.backdrop:SetFrameLevel(frame:GetFrameLevel())\r\n\t\tend\r\n\t\tframe.Icon:SetDrawLayer(\"BORDER\", 0)\r\n\r\n\t\tlocal r, g, b\r\n\t\tif frame.IconBorder and frame.IconBorder:IsShown() then\r\n\t\t\tr, g, b = frame.IconBorder:GetVertexColor()\r\n\t\t\tif (r > 0.64 and r < 0.67) or (r > 0.99 and g > 0.99 and b > 0.99) then\r\n\t\t\t\tr, g, b = unpack(C.media.border_color)\r\n\t\t\tend\r\n\t\telse\r\n\t\t\tr, g, b = unpack(C.media.border_color)\r\n\t\tend\r\n\t\tframe.backdrop:SetBackdropBorderColor(r, g, b)\r\n\tend)\r\n\r\n\t-- Landing page\r\n\tGarrisonLandingPage:StripTextures()\r\n\tGarrisonLandingPage:CreateBackdrop(\"Transparent\")\r\n\tT.SkinCloseButton(GarrisonLandingPage.CloseButton)\r\n\tGarrisonLandingPageTab1:SetPoint(\"TOPLEFT\", GarrisonLandingPage, \"BOTTOMLEFT\", 70, -2)\r\n\r\n\tfor i = 1, 3 do\r\n\t\tT.SkinTab(_G[\"GarrisonLandingPageTab\"..i])\r\n\t\t_G[\"GarrisonLandingPageTab\"..i]:SetHeight(32)\r\n\t\t_G[\"GarrisonLandingPageTab\"..i].Text:ClearAllPoints()\r\n\t\t_G[\"GarrisonLandingPageTab\"..i].Text:SetPoint(\"CENTER\")\r\n\tend\r\n\r\n\tT.SkinScrollBar(GarrisonLandingPageReportList.ScrollBar)\r\n\r\n\tGarrisonLandingPage.FollowerList:StripTextures()\r\n\tGarrisonLandingPage.FollowerList.SearchBox:SetPoint(\"TOPLEFT\", -1, 33)\r\n\tT.SkinEditBox(GarrisonLandingPage.FollowerList.SearchBox)\r\n\tT.SkinScrollBar(GarrisonLandingPageFollowerList.ScrollBar)\r\n\r\n\tGarrisonLandingPage.FollowerTab:CreateBackdrop(\"Overlay\")\r\n\tGarrisonLandingPage.FollowerTab.backdrop:SetPoint(\"TOPLEFT\", 13, 0)\r\n\tGarrisonLandingPage.FollowerTab.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 3)\r\n\r\n\tHandleGarrisonPortrait(GarrisonLandingPage.FollowerTab.PortraitFrame)\r\n\r\n\tGarrisonLandingPageShipFollowerList:StripTextures()\r\n\tGarrisonLandingPageShipFollowerList:SetTemplate(\"Transparent\")\r\n\r\n\tGarrisonLandingPageShipFollowerList.SearchBox:SetPoint(\"TOPLEFT\", 2, 25)\r\n\tT.SkinEditBox(GarrisonLandingPageShipFollowerList.SearchBox)\r\n\tT.SkinScrollBar(GarrisonLandingPageShipFollowerList.ScrollBar)\r\n\r\n\tGarrisonLandingPage.Report.InProgress:ClearAllPoints()\r\n\tGarrisonLandingPage.Report.InProgress:SetPoint(\"BOTTOMLEFT\", GarrisonLandingPageReportList, \"TOPLEFT\", 5, 2)\r\n\tGarrisonLandingPage.Report.Available:ClearAllPoints()\r\n\tGarrisonLandingPage.Report.Available:SetPoint(\"LEFT\", GarrisonLandingPage.Report.InProgress, \"RIGHT\", 4, 0)\r\n\r\n\tfor _, tab in pairs({GarrisonLandingPage.Report.InProgress, GarrisonLandingPage.Report.Available}) do\r\n\t\ttab:CreateBackdrop(\"Overlay\")\r\n\t\ttab.backdrop:SetAllPoints()\r\n\t\ttab:StyleButton()\r\n\r\n\t\ttab.Text:ClearAllPoints()\r\n\t\ttab.Text:SetPoint(\"CENTER\")\r\n\t\ttab.Text:SetFont(C.media.normal_font, 15, \"\")\r\n\tend\r\n\r\n\thooksecurefunc(\"GarrisonLandingPageReport_SetTab\", function(self)\r\n\t\tlocal unselectedTab = GarrisonLandingPage.Report.unselectedTab\r\n\t\tunselectedTab:SetHeight(36)\r\n\r\n\t\tself:SetWidth(198)\r\n\t\tunselectedTab:SetWidth(198)\r\n\r\n\t\tunselectedTab:SetNormalTexture(0)\r\n\t\tunselectedTab.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\tunselectedTab.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\r\n\r\n\t\tself:SetNormalTexture(0)\r\n\t\tself.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\t\tself.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1)\r\n\tend)\r\n\r\n\thooksecurefunc(GarrisonLandingPage.Report.List.ScrollBox, \"Update\", function(frame)\r\n\t\tfor i = 1, frame.ScrollTarget:GetNumChildren() do\r\n\t\t\tlocal button = select(i, frame.ScrollTarget:GetChildren())\r\n\t\t\tif not button.styled then\r\n\t\t\t\tlocal i = 1\r\n\t\t\t\tfor _, reward in pairs(button.Rewards) do\r\n\t\t\t\t\treward:GetRegions():Hide()\r\n\t\t\t\t\tif i == 1 then\r\n\t\t\t\t\t\treward:ClearAllPoints()\r\n\t\t\t\t\t\treward:SetPoint(\"TOPRIGHT\", -35, -5)\r\n\t\t\t\t\tend\r\n\t\t\t\t\treward.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\r\n\t\t\t\t\treward:CreateBackdrop(\"Default\")\r\n\t\t\t\t\treward.backdrop:SetPoint(\"TOPLEFT\", reward.Icon, \"TOPLEFT\", -2, 2)\r\n\t\t\t\t\treward.backdrop:SetPoint(\"BOTTOMRIGHT\", reward.Icon, \"BOTTOMRIGHT\", 2, -2)\r\n\t\t\t\t\treward.backdrop:SetFrameLevel(reward:GetFrameLevel())\r\n\r\n\t\t\t\t\treward.Quantity:SetParent(reward.backdrop)\r\n\t\t\t\t\treward.IconBorder:SetAlpha(0)\r\n\t\t\t\t\thooksecurefunc(reward.IconBorder, \"SetVertexColor\", function(self, r, g, b)\r\n\t\t\t\t\t\tif r ~= BAG_ITEM_QUALITY_COLORS[1].r ~= r and g ~= BAG_ITEM_QUALITY_COLORS[1].g then\r\n\t\t\t\t\t\t\tself:GetParent().backdrop:SetBackdropBorderColor(r, g, b)\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tself:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend)\r\n\t\t\t\t\ti = i + 1\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\t\tbutton.styled = true\r\n\t\tend\r\n\tend)\r\n\r\n\tlocal xpBar = {\r\n\t\tGarrisonLandingPage.FollowerTab.XPBar,\r\n\t\tGarrisonLandingPage.ShipFollowerTab.XPBar,\r\n\t\tGarrisonMissionFrame.FollowerTab.XPBar,\r\n\t\tGarrisonShipyardFrame.FollowerTab.XPBar,\r\n\t\tOrderHallMissionFrame.FollowerTab.XPBar,\r\n\t\tBFAMissionFrame.FollowerTab.XPBar\r\n\t}\r\n\r\n\tfor i = 1, #xpBar do\r\n\t\tlocal xpBar = xpBar[i]\r\n\t\txpBar:StripTextures()\r\n\t\txpBar:CreateBackdrop(\"Default\")\r\n\t\txpBar.backdrop:SetFrameLevel(xpBar.backdrop:GetFrameLevel() + 1)\r\n\t\txpBar:SetStatusBarTexture(C.media.texture)\r\n\r\n\t\tif xpBar:GetParent().PortraitFrame then\r\n\t\t\txpBar:ClearAllPoints()\r\n\t\t\txpBar:SetPoint(\"BOTTOMLEFT\", xpBar:GetParent().PortraitFrame, \"BOTTOMRIGHT\", 8, -15)\r\n\t\tend\r\n\r\n\t\tif xpBar.Label then\r\n\t\t\txpBar.Label:SetFontObject(SystemFont_Outline_Small)\r\n\t\tend\r\n\tend\r\n\r\n\tlocal function onShowFollower(followerList)\r\n\t\tlocal followerTab = followerList and followerList.followerTab\r\n\t\tlocal abilityFrame = followerTab.AbilitiesFrame\r\n\t\tif not abilityFrame then return end\r\n\r\n\t\t-- Ability buttons\r\n\t\tlocal abilities = abilityFrame.Abilities\r\n\t\tif abilities then\r\n\t\t\tfor i = 1, #abilities do\r\n\t\t\t\tlocal IconButton = abilities[i].IconButton\r\n\t\t\t\tif IconButton and not IconButton.backdrop then\r\n\t\t\t\t\tIconButton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\t\tIconButton.Icon:SetDrawLayer(\"BACKGROUND\", 1)\r\n\t\t\t\t\tIconButton:CreateBackdrop(\"Default\")\r\n\t\t\t\t\tIconButton.Border:SetTexture(nil)\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\t-- CombatAllySpell buttons\r\n\t\tlocal combatAllySpell = abilityFrame.CombatAllySpell\r\n\t\tif combatAllySpell then\r\n\t\t\tfor i = 1, #combatAllySpell do\r\n\t\t\t\tlocal button = combatAllySpell[i]\r\n\t\t\t\tif button and not button.backdrop then\r\n\t\t\t\t\tbutton.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\t\tbutton:CreateBackdrop(\"Default\")\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\t-- Equipment\r\n\t\tlocal equipment = abilityFrame.Equipment\r\n\t\tif equipment then\r\n\t\t\tfor i = 1, #equipment do\r\n\t\t\t\tlocal button = equipment[i]\r\n\t\t\t\tif button then\r\n\t\t\t\t\tbutton.Border:SetTexture(nil)\r\n\t\t\t\t\tbutton.BG:SetTexture(nil)\r\n\t\t\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\t\tbutton:SetScale(1)\r\n\t\t\t\t\tif not button.backdrop then\r\n\t\t\t\t\t\tbutton:CreateBackdrop(\"Default\")\r\n\t\t\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", button.Icon, \"TOPLEFT\", -2, 2)\r\n\t\t\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", button.Icon, \"BOTTOMRIGHT\", 2, -2)\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\t-- AutoSpell buttons\r\n\t\tfor autoSpell in followerTab.autoSpellPool:EnumerateActive() do\r\n\t\t\tif not autoSpell.backdrop then\r\n\t\t\t\tautoSpell.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\tautoSpell:CreateBackdrop(\"Default\")\r\n\t\t\t\tautoSpell.SpellBorder:SetTexture(\"\")\r\n\t\t\t\tautoSpell.IconMask:Hide()\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\r\n\thooksecurefunc(GarrisonMissionFrame.FollowerList, \"ShowFollower\", onShowFollower)\r\n\thooksecurefunc(GarrisonLandingPageFollowerList, \"ShowFollower\", onShowFollower)\r\n\thooksecurefunc(GarrisonShipyardFrameFollowers, \"ShowFollower\", onShowFollower)\r\n\r\n\t-- ShipYard\r\n\tGarrisonShipyardFrame:StripTextures(true)\r\n\tGarrisonShipyardFrame:CreateBackdrop(\"Transparent\")\r\n\tGarrisonShipyardFrame.BorderFrame.GarrCorners:StripTextures()\r\n\tGarrisonShipyardFrame.BorderFrame:StripTextures(true)\r\n\tGarrisonShipyardFrame.BorderFrame.TitleText:SetPoint(\"TOP\", -6, -1)\r\n\tT.SkinCloseButton(GarrisonShipyardFrame.BorderFrame.CloseButton2)\r\n\tT.SkinTab(GarrisonShipyardFrameTab1)\r\n\tT.SkinTab(GarrisonShipyardFrameTab2)\r\n\r\n\t-- ShipYard: Naval Map\r\n\tlocal MissionTab = GarrisonShipyardFrame.MissionTab\r\n\tlocal MissionList = MissionTab.MissionList\r\n\r\n\t-- ShipYard: Mission\r\n\tlocal MissionPage = MissionTab.MissionPage\r\n\tT.SkinCloseButton(MissionPage.CloseButton)\r\n\tMissionPage.CloseButton:SetFrameLevel(MissionPage.CloseButton:GetFrameLevel() + 2)\r\n\tMissionList.CompleteDialog.BorderFrame:StripTextures()\r\n\tMissionList.CompleteDialog.BorderFrame:SetTemplate(\"Transparent\")\r\n\tMissionList.CompleteDialog.BorderFrame.ViewButton:SkinButton()\r\n\tMissionList.CompleteDialog:SetAllPoints(MissionList.MapTexture)\r\n\tGarrisonShipyardFrame.MissionComplete.NextMissionButton:SkinButton()\r\n\tGarrisonShipyardFrame.MissionCompleteBackground:SetAllPoints(MissionList.MapTexture)\r\n\tMissionPage.StartMissionButton:SkinButton()\r\n\tMissionList.MapTexture:ClearAllPoints()\r\n\tMissionList.MapTexture:SetPoint(\"TOPLEFT\")\r\n\tMissionList.MapTexture:SetPoint(\"BOTTOMRIGHT\")\r\n\r\n\tT.SkinEditBox(GarrisonShipyardFrameFollowers.SearchBox)\r\n\tGarrisonShipyardFrameFollowers.SearchBox:SetPoint(\"TOPLEFT\", 2, 25)\r\n\tGarrisonShipyardFrameFollowers.SearchBox:SetSize(301, 20)\r\n\tGarrisonShipyardFrameFollowers:StripTextures()\r\n\tGarrisonShipyardFrameFollowers:SetTemplate(\"Transparent\")\r\n\tGarrisonShipyardFrameFollowers.MaterialFrame:GetRegions():Hide()\r\n\tGarrisonShipyardFrame.FollowerTab:StripTextures()\r\n\tGarrisonShipyardFrame.FollowerTab:SetTemplate(\"Overlay\")\r\n\tT.SkinScrollBar(GarrisonShipyardFrameFollowers.ScrollBar)\r\n\r\n\thooksecurefunc(\"GarrisonShipyardFollowerList_InitButton\", function(button, elementData)\r\n\t\tif button and not button.backdrop then\r\n\t\t\tbutton:CreateBackdrop(\"Overlay\")\r\n\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", -1, 1)\r\n\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, -1)\r\n\t\t\tbutton:StyleButton(nil, 1)\r\n\t\t\tbutton.BG:Hide()\r\n\t\t\tbutton.Selection:SetTexture(\"\")\r\n\t\t\tbutton.Portrait:SetPoint(\"TOPLEFT\", 2, 0)\r\n\t\t\tbutton.AbilitiesBG:SetTexture(C.media.blank)\r\n\t\t\tbutton.AbilitiesBG:SetColorTexture(0.1, 0.1, 0.1, 1)\r\n\t\tend\r\n\r\n\t\tif button.Selection and button.backdrop then\r\n\t\t\tif button.Selection:IsShown() then\r\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\t\t\t\tbutton.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1)\r\n\t\t\telse\r\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\t\t\tbutton.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\tlocal function skinFollowerTraitsAndEquipment(obj)\r\n\t\tlocal btn\r\n\t\tfor i = 1, #obj.Traits do\r\n\t\t\tbtn = obj.Traits[i]\r\n\t\t\tif not btn.backdrop then\r\n\t\t\t\tbtn.Border:SetTexture(nil)\r\n\t\t\t\tbtn.Portrait:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\tbtn:CreateBackdrop(\"Default\")\r\n\t\t\t\tbtn.backdrop:SetPoint(\"TOPLEFT\", btn.Portrait, \"TOPLEFT\", -2, 2)\r\n\t\t\t\tbtn.backdrop:SetPoint(\"BOTTOMRIGHT\", btn.Portrait, \"BOTTOMRIGHT\", 2, -2)\r\n\t\t\t\tbtn.backdrop:SetFrameLevel(2)\r\n\t\t\tend\r\n\t\tend\r\n\t\tfor i = 1, #obj.EquipmentFrame.Equipment do\r\n\t\t\tbtn = obj.EquipmentFrame.Equipment[i]\r\n\t\t\tif not btn.backdrop then\r\n\t\t\t\tbtn:DisableDrawLayer(\"BACKGROUND\")\r\n\t\t\t\tbtn.Border:SetTexture(nil)\r\n\t\t\t\tbtn.Counter.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\tbtn.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\tbtn:CreateBackdrop(\"Default\")\r\n\t\t\t\tbtn.backdrop:SetPoint(\"TOPLEFT\", btn.Icon, \"TOPLEFT\", -2, 2)\r\n\t\t\t\tbtn.backdrop:SetPoint(\"BOTTOMRIGHT\", btn.Icon, \"BOTTOMRIGHT\", 2, -2)\r\n\r\n\t\t\t\tbtn.Counter.Border:SetAlpha(0)\r\n\t\t\t\tbtn.Counter.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\t\t\t\tbtn.Counter:CreateBackdrop(\"Default\")\r\n\t\t\t\tbtn.Counter.backdrop:SetPoint(\"TOPLEFT\", btn.Counter.Icon, \"TOPLEFT\", -2, 2)\r\n\t\t\t\tbtn.Counter.backdrop:SetPoint(\"BOTTOMRIGHT\", btn.Counter.Icon, \"BOTTOMRIGHT\", 2, -2)\r\n\t\t\tend\r\n\t\tend\r\n\t\tbtn = nil\r\n\tend\r\n\tskinFollowerTraitsAndEquipment(GarrisonLandingPage.ShipFollowerTab)\r\n\tskinFollowerTraitsAndEquipment(GarrisonShipyardFrame.FollowerTab)\r\n\r\n\t-- Recruiter frame\r\n\tGarrisonRecruiterFrame:StripTextures(true)\r\n\tGarrisonRecruiterFrame:SetTemplate(\"Transparent\")\r\n\tT.SkinCloseButton(GarrisonRecruiterFrame.CloseButton)\r\n\tGarrisonRecruiterFrame.UnavailableFrame:GetChildren():SkinButton()\r\n\tGarrisonRecruiterFrame.Pick.ChooseRecruits:SkinButton()\r\n\tT.SkinDropDownBox(GarrisonRecruiterFrame.Pick.ThreatDropDown)\r\n\tT.SkinCheckBox(GarrisonRecruiterFrame.Pick.Radio1)\r\n\tT.SkinCheckBox(GarrisonRecruiterFrame.Pick.Radio2)\r\n\r\n\t-- Recruiter select frame\r\n\tGarrisonRecruitSelectFrame:StripTextures()\r\n\tGarrisonRecruitSelectFrame:SetTemplate(\"Transparent\")\r\n\tGarrisonRecruitSelectFrame.GarrCorners:StripTextures()\r\n\tT.SkinCloseButton(GarrisonRecruitSelectFrame.CloseButton)\r\n\r\n\tGarrisonRecruitSelectFrame.FollowerList:StripTextures()\r\n\tGarrisonRecruitSelectFrame.FollowerList:SetTemplate(\"Transparent\")\r\n\tT.SkinScrollBar(GarrisonRecruitSelectFrame.FollowerList.ScrollBar)\r\n\tT.SkinEditBox(GarrisonRecruitSelectFrame.FollowerList.SearchBox)\r\n\tGarrisonRecruitSelectFrame.FollowerList.SearchBox:SetPoint(\"TOPLEFT\", 2, 25)\r\n\tGarrisonRecruitSelectFrame.FollowerList.SearchBox:SetSize(301, 20)\r\n\tGarrisonRecruitSelectFrame.FollowerSelection:StripTextures()\r\n\tGarrisonRecruitSelectFrame.FollowerSelection:SetTemplate(\"Overlay\")\r\n\r\n\tGarrisonRecruitSelectFrame.FollowerList.ScrollBar:SetPoint(\"TOPLEFT\", GarrisonRecruitSelectFrame.FollowerList.ScrollBox, \"TOPRIGHT\", -6, 3)\r\n\tGarrisonRecruitSelectFrame.FollowerList.ScrollBar:SetPoint(\"BOTTOMLEFT\", GarrisonRecruitSelectFrame.FollowerList.ScrollBox, \"BOTTOMRIGHT\", -3, -1)\r\n\r\n\tfor i = 1, 3 do\r\n\t\tlocal recruit = GarrisonRecruitSelectFrame.FollowerSelection[\"Recruit\"..i]\r\n\t\trecruit.HireRecruits:SkinButton()\r\n\t\tHandleGarrisonPortrait(recruit.PortraitFrame)\r\n\tend\r\n\r\n\thooksecurefunc(GarrisonRecruitSelectFrame.FollowerList.ScrollBox, \"Update\", function(frame)\r\n\t\tfor i = 1, frame.ScrollTarget:GetNumChildren() do\r\n\t\t\tlocal button = select(i, frame.ScrollTarget:GetChildren())\r\n\t\t\tlocal follower = button.Follower\r\n\t\t\tif follower and not follower.backdrop then\r\n\t\t\t\tfollower:CreateBackdrop(\"Overlay\")\r\n\t\t\t\tfollower.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\r\n\t\t\t\tfollower.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\r\n\t\t\t\tfollower:StyleButton()\r\n\r\n\t\t\t\tfollower.BG:Hide()\r\n\t\t\t\tfollower.Selection:SetTexture(\"\")\r\n\t\t\t\tfollower.AbilitiesBG:SetTexture(\"\")\r\n\t\t\t\tfollower.BusyFrame:SetAllPoints()\r\n\t\t\t\tfollower.Name:SetWordWrap(false)\r\n\r\n\t\t\t\tif follower.PortraitFrame then\r\n\t\t\t\t\tHandleGarrisonPortrait(follower.PortraitFrame)\r\n\t\t\t\t\tfollower.PortraitFrame:ClearAllPoints()\r\n\t\t\t\t\tfollower.PortraitFrame:SetPoint(\"TOPLEFT\", 6, -5)\r\n\t\t\t\tend\r\n\t\t\tend\r\n\r\n\t\t\tif follower then\r\n\t\t\t\tif follower.Selection and follower.backdrop then\r\n\t\t\t\t\tif follower.Selection:IsShown() then\r\n\t\t\t\t\t\tfollower.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\t\t\t\t\t\tfollower.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1)\r\n\t\t\t\t\t\tfollower.PortraitFrame.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tfollower.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\t\t\t\t\tfollower.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\r\n\t\t\t\t\t\tfollower.PortraitFrame.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\r\n\t\t\t\tlocal color = ITEM_QUALITY_COLORS[follower.PortraitFrame.quality]\r\n\t\t\t\tif color then\r\n\t\t\t\t\tfollower.Name:SetTextColor(color.r, color.g, color.b)\r\n\t\t\t\telse\r\n\t\t\t\t\tfollower.Name:SetTextColor(1, 1, 1)\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\thooksecurefunc(GarrisonRecruitSelectFrame, \"Show\", function(self)\r\n\t\tC_Timer.After(0.01, function() -- fixed color name after open\r\n\t\t\tGarrisonRecruitSelectFrame.FollowerList.ScrollBox:Update()\r\n\t\tend)\r\n\tend)\r\n\r\n\thooksecurefunc(\"GarrisonRecruitSelectFrame_UpdateRecruits\", function(waiting)\r\n\t\tif waiting then return end\r\n\r\n\t\tfor i = 1, 3 do\r\n\t\t\tlocal frame = GarrisonRecruitSelectFrame.FollowerSelection[\"Recruit\"..i]\r\n\t\t\tif frame:IsShown() then\r\n\t\t\t\tlocal traits = frame.Traits.Entries\r\n\t\t\t\tif traits then\r\n\t\t\t\t\tfor index = 1, #traits do\r\n\t\t\t\t\t\tlocal trait = traits[index]\r\n\t\t\t\t\t\tif not trait.bg then\r\n\t\t\t\t\t\t\ttrait.Icon:SkinIcon()\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\t\tlocal abilities = frame.Abilities.Entries\r\n\t\t\t\tif abilities then\r\n\t\t\t\t\tfor index = 1, #abilities do\r\n\t\t\t\t\t\tlocal ability = abilities[index]\r\n\t\t\t\t\t\tif not ability.bg then\r\n\t\t\t\t\t\t\tability.Icon:SkinIcon()\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\t-- Capacitive display frame\r\n\tGarrisonCapacitiveDisplayFrame:StripTextures(true)\r\n\tGarrisonCapacitiveDisplayFrame:SetTemplate(\"Transparent\")\r\n\tGarrisonCapacitiveDisplayFrame:SetFrameLevel(5)\r\n\tGarrisonCapacitiveDisplayFramePortrait:SetAlpha(0)\r\n\r\n\tT.SkinNextPrevButton(GarrisonCapacitiveDisplayFrame.DecrementButton, true)\r\n\tGarrisonCapacitiveDisplayFrame.DecrementButton:SetSize(22, 22)\r\n\tT.SkinNextPrevButton(GarrisonCapacitiveDisplayFrame.IncrementButton)\r\n\tGarrisonCapacitiveDisplayFrame.IncrementButton:SetSize(22, 22)\r\n\tGarrisonCapacitiveDisplayFrame.Count:StripTextures()\r\n\tT.SkinEditBox(GarrisonCapacitiveDisplayFrame.Count)\r\n\tGarrisonCapacitiveDisplayFrame.Count:SetHeight(18)\r\n\tT.SkinCloseButton(GarrisonCapacitiveDisplayFrameCloseButton)\r\n\tGarrisonCapacitiveDisplayFrame.StartWorkOrderButton:SkinButton()\r\n\tGarrisonCapacitiveDisplayFrame.CreateAllWorkOrdersButton:SkinButton()\r\n\tlocal CapacitiveDisplay = GarrisonCapacitiveDisplayFrame.CapacitiveDisplay\r\n\tCapacitiveDisplay.IconBG:SetTexture()\r\n\tCapacitiveDisplay.ShipmentIconFrame.Icon:SkinIcon()\r\n\r\n\tlocal CapacitiveFollower = CapacitiveDisplay.ShipmentIconFrame.Follower\r\n\tCapacitiveFollower.Portrait:SetAllPoints()\r\n\tCapacitiveFollower.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)\r\n\tCapacitiveFollower.PortraitRing:Kill()\r\n\tCapacitiveFollower.PortraitRingQuality:Kill()\r\n\tCapacitiveFollower:SetPoint(\"TOPLEFT\", -2, 2)\r\n\tCapacitiveFollower:SetPoint(\"BOTTOMRIGHT\", 2, -2)\r\n\tCapacitiveFollower.Portrait.IconBackdrop = CreateFrame(\"Frame\", nil, CapacitiveFollower)\r\n\tCapacitiveFollower.Portrait.IconBackdrop:SetFrameLevel(CapacitiveFollower:GetFrameLevel() - 1)\r\n\tCapacitiveFollower.Portrait.IconBackdrop:SetPoint(\"TOPLEFT\", CapacitiveFollower.Portrait, -2, 2)\r\n\tCapacitiveFollower.Portrait.IconBackdrop:SetPoint(\"BOTTOMRIGHT\", CapacitiveFollower.Portrait, 2, -2)\r\n\tCapacitiveFollower.Portrait.IconBackdrop:SetTemplate(\"Default\")\r\n\r\n\thooksecurefunc(CapacitiveFollower.PortraitRingQuality, \"SetVertexColor\", function(self, r, g, b)\r\n\t\tif r ~= 1 and g ~= 1 and b ~= 1 then\r\n\t\t\tCapacitiveFollower.Portrait.IconBackdrop:SetBackdropBorderColor(r, g, b)\r\n\t\tend\r\n\t\tself:SetTexture(\"\")\r\n\tend)\r\n\r\n\thooksecurefunc(\"GarrisonCapacitiveDisplayFrame_Update\", function(self)\r\n\t\tfor _, reagent in ipairs(self.CapacitiveDisplay.Reagents) do\r\n\t\t\treagent.NameFrame:SetAlpha(0)\r\n\t\t\tif not reagent.backdrop then\r\n\t\t\t\treagent.Icon:SkinIcon()\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\t----------------------------------------------------------------------------------------\r\n\t--\tMasterPlan AddOn skin\r\n\t----------------------------------------------------------------------------------------\r\n\tdo\r\n\t\tlocal function skinMasterPlan()\r\n\t\t\tT.SkinTab(GarrisonLandingPageTab4)\r\n\t\t\tT.SkinTab(GarrisonMissionFrameTab3)\r\n\t\t\tT.SkinTab(GarrisonMissionFrameTab4)\r\n\t\t\tT.SkinTab(GarrisonShipyardFrameTab3)\r\n\t\t\tlocal MissionPage = GarrisonMissionFrame.MissionTab.MissionPage\r\n\t\t\tT.SkinCloseButton(MissionPage.MinimizeButton, nil, \"-\")\r\n\t\t\tMissionPage.MinimizeButton:SetPoint(\"TOPRIGHT\", GarrisonMissionFrame.MissionTab.MissionPage.CloseButton, \"TOPLEFT\", -3, 0)\r\n\t\t\tMissionPage.MinimizeButton:SetFrameLevel(MissionPage:GetFrameLevel() + 2)\r\n\t\t\tGarrisonMissionFrame.MissionTab.MissionPage.CloseButton:SetSize(18, 18)\r\n\t\t\tGarrisonMissionFrame.MissionTab.MissionPage.CloseButton:SetPoint(\"TOPRIGHT\", -4, -4)\r\n\r\n\t\t\tlocal MissionPage = GarrisonShipyardFrame.MissionTab.MissionPage\r\n\t\t\tT.SkinCloseButton(MissionPage.MinimizeButton, nil, \"-\")\r\n\t\t\tMissionPage.MinimizeButton:SetPoint(\"TOPRIGHT\", GarrisonShipyardFrame.MissionTab.MissionPage.CloseButton, \"TOPLEFT\", -3, 0)\r\n\t\t\tMissionPage.MinimizeButton:SetFrameLevel(MissionPage:GetFrameLevel() + 2)\r\n\t\t\tGarrisonShipyardFrame.MissionTab.MissionPage.CloseButton:SetSize(18, 18)\r\n\t\t\tGarrisonShipyardFrame.MissionTab.MissionPage.CloseButton:SetPoint(\"TOPRIGHT\", -4, -4)\r\n\r\n\t\t\tMPCompleteAll:SkinButton()\r\n\t\t\tMPPokeTentativeParties:SkinButton()\r\n\t\t\tGarrisonMissionFrameFollowers.SearchBox:SetSize(270, 20)\r\n\t\tend\r\n\r\n\t\tif IsAddOnLoaded(\"MasterPlan\") then\r\n\t\t\tskinMasterPlan()\r\n\t\telse\r\n\t\t\tlocal f = CreateFrame(\"Frame\")\r\n\t\t\tf:RegisterEvent(\"ADDON_LOADED\")\r\n\t\t\tf:SetScript(\"OnEvent\", function(self, _, addon)\r\n\t\t\t\tif addon == \"MasterPlan\" then\r\n\t\t\t\t\tskinMasterPlan()\r\n\t\t\t\t\tself:UnregisterEvent(\"ADDON_LOADED\")\r\n\t\t\t\tend\r\n\t\t\tend)\r\n\t\tend\r\n\tend\r\n\r\n\t----------------------------------------------------------------------------------------\r\n\t--\tOrder Hall skin\r\n\t----------------------------------------------------------------------------------------\r\n\tOrderHallMissionFrame:StripTextures()\r\n\tOrderHallMissionFrame:CreateBackdrop(\"Transparent\")\r\n\tOrderHallMissionFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\r\n\tOrderHallMissionFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\r\n\tOrderHallMissionFrame.GarrCorners:StripTextures()\r\n\tOrderHallMissionFrame.ClassHallIcon:Kill()\r\n\tT.SkinCloseButton(OrderHallMissionFrame.CloseButton)\r\n\r\n\tfor i = 1, 3 do\r\n\t\tT.SkinTab(_G[\"OrderHallMissionFrameTab\"..i])\r\n\tend\r\n\r\n\tOrderHallMissionFrameMissions.CompleteDialog.BorderFrame:StripTextures()\r\n\tOrderHallMissionFrameMissions.CompleteDialog.BorderFrame:SetTemplate(\"Overlay\")\r\n\tOrderHallMissionFrameMissions.CompleteDialog.BorderFrame.Stage:StripTextures()\r\n\r\n\tOrderHallMissionFrame.MissionComplete:StripTextures()\r\n\tOrderHallMissionFrame.MissionComplete:CreateBackdrop(\"Overlay\")\r\n\tOrderHallMissionFrame.MissionComplete.backdrop:SetPoint(\"TOPLEFT\", 3, 2)\r\n\tOrderHallMissionFrame.MissionComplete.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, -12)\r\n\r\n\tOrderHallMissionFrame.MissionComplete.Stage.MissionInfo:StripTextures()\r\n\tOrderHallMissionFrame.MissionComplete.Stage.MissionInfo:CreateOverlay()\r\n\tOrderHallMissionFrame.MissionComplete.Stage.MissionInfo.overlay:SetPoint(\"TOPLEFT\", 5, 0)\r\n\tOrderHallMissionFrame.MissionComplete.Stage.MissionInfo.overlay:SetPoint(\"BOTTOMRIGHT\", -5, 210)\r\n\tOrderHallMissionFrame.MissionComplete.Stage.MissionInfo.overlay:SetVertexColor(0, 0, 0, 0.7)\r\n\r\n\tOrderHallMissionFrameMissions:StripTextures()\r\n\tT.SkinScrollBar(OrderHallMissionFrameMissions.ScrollBar)\r\n\r\n\tOrderHallMissionFrameMissions.CombatAllyUI:StripTextures()\r\n\tOrderHallMissionFrameMissions.CombatAllyUI:CreateBackdrop(\"Overlay\")\r\n\tOrderHallMissionFrameMissions.CombatAllyUI.backdrop:SetPoint(\"TOPLEFT\", 18, -2)\r\n\tOrderHallMissionFrameMissions.CombatAllyUI.backdrop:SetPoint(\"BOTTOMRIGHT\", -4, 2)\r\n\tOrderHallMissionFrameMissions.CombatAllyUI.InProgress.Unassign:SkinButton()\r\n\tOrderHallMissionFrameMissions.CombatAllyUI.InProgress.CombatAllySpell.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\tOrderHallMissionFrameMissions.CombatAllyUI.InProgress.CombatAllySpell:CreateBackdrop(\"Default\")\r\n\tHandleGarrisonPortrait(OrderHallMissionFrameMissions.CombatAllyUI.InProgress.PortraitFrame)\r\n\tOrderHallMissionFrameMissions.CombatAllyUI.InProgress.CombatAllySpell:SetPoint(\"BOTTOMLEFT\", OrderHallMissionFrameMissions.CombatAllyUI.InProgress.PortraitFrame.backdrop, \"BOTTOMRIGHT\", 12, -20)\r\n\thooksecurefunc(OrderHallMissionFrameMissions.CombatAllyUI.InProgress.PortraitFrame.PortraitRingQuality, \"SetVertexColor\", function(self, r, g, b)\r\n\t\tif r ~= 1 and g ~= 1 and b ~= 1 then\r\n\t\t\tOrderHallMissionFrameMissions.CombatAllyUI.InProgress.PortraitFrame.backdrop:SetBackdropBorderColor(r, g, b)\r\n\t\tend\r\n\t\tself:SetTexture(\"\")\r\n\tend)\r\n\r\n\tOrderHallMissionFrameMissions.MaterialFrame:StripTextures()\r\n\tOrderHallMissionFrame.MissionTab:StripTextures()\r\n\tOrderHallMissionFrame.MissionTab.ZoneSupportMissionPage:StripTextures()\r\n\tOrderHallMissionFrame.MissionTab.ZoneSupportMissionPage:SetTemplate(\"Overlay\")\r\n\tOrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CombatAllySpell:SetPoint(\"TOP\", OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CombatAllyDescriptionLabel, \"BOTTOM\", 0, -5)\r\n\tOrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CombatAllySpell.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\tOrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CombatAllySpell:CreateBackdrop(\"Default\")\r\n\tT.SkinCloseButton(OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CloseButton)\r\n\tOrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.StartMissionButton:SkinButton()\r\n\r\n\tSkinTab(OrderHallMissionFrameMissionsTab1)\r\n\tSkinTab(OrderHallMissionFrameMissionsTab2)\r\n\tOrderHallMissionFrameMissionsTab1:SetPoint(\"BOTTOMLEFT\", OrderHallMissionFrameMissions, \"TOPLEFT\", 18, 0)\r\n\tOrderHallMissionFrameMissionsTab1.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\tOrderHallMissionFrameMissionsTab1.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1)\r\n\r\n\r\n\thooksecurefunc(OrderHallMissionFrame.MissionTab.MissionList.ScrollBox, \"Update\", function(frame)\r\n\t\tfor i = 1, frame.ScrollTarget:GetNumChildren() do\r\n\t\t\tlocal button = select(i, frame.ScrollTarget:GetChildren())\r\n\t\t\tif not button.backdrop then\r\n\t\t\t\tbutton:StripTextures()\r\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\r\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\r\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\r\n\t\t\t\tbutton:StyleButton(nil, 2)\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\t-- Followers\r\n\tlocal Follower = OrderHallMissionFrameFollowers\r\n\tFollower:StripTextures()\r\n\tT.SkinEditBox(Follower.SearchBox)\r\n\tFollower.SearchBox:SetPoint(\"TOPLEFT\", 2, 25)\r\n\tFollower.SearchBox:SetSize(301, 20)\r\n\tT.SkinScrollBar(OrderHallMissionFrameFollowers.ScrollBar )\r\n\tFollower.MaterialFrame:StripTextures()\r\n\tT.SkinCloseButton(OrderHallMissionFrame.MissionTab.MissionPage.CloseButton)\r\n\tOrderHallMissionFrame.MissionTab.MissionPage.StartMissionButton:SkinButton()\r\n\r\n\tlocal FollowerTab = OrderHallMissionFrame.FollowerTab\r\n\tFollowerTab:StripTextures()\r\n\tFollowerTab:CreateBackdrop(\"Overlay\")\r\n\tFollowerTab.backdrop:SetPoint(\"TOPLEFT\", -2, 0)\r\n\tFollowerTab.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -2)\r\n\tFollowerTab.ModelCluster:StripTextures()\r\n\tFollowerTab.Class:SetSize(50, 43)\r\n\r\n\tHandleGarrisonPortrait(FollowerTab.PortraitFrame)\r\n\r\n\thooksecurefunc(OrderHallMissionFrame.FollowerList, \"ShowFollower\", onShowFollower)\r\n\r\n\t-- Missions\r\n\tOrderHallMissionFrameMissions.CompleteDialog.BorderFrame.ViewButton:SkinButton()\r\n\tOrderHallMissionFrame.MissionComplete.NextMissionButton:SkinButton()\r\n\r\n\t----------------------------------------------------------------------------------------\r\n\t--\tBFA Mission skin\r\n\t----------------------------------------------------------------------------------------\r\n\tBFAMissionFrame:StripTextures()\r\n\tBFAMissionFrame:CreateBackdrop(\"Transparent\")\r\n\tBFAMissionFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\r\n\tBFAMissionFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\r\n\tBFAMissionFrame.OverlayElements:Hide()\r\n\tBFAMissionFrame.TitleScroll:Hide()\r\n\r\n\tBFAMissionFrameMissions.CompleteDialog.BorderFrame:StripTextures()\r\n\tBFAMissionFrameMissions.CompleteDialog.BorderFrame:SetTemplate(\"Transparent\")\r\n\tBFAMissionFrameMissions.CompleteDialog.BorderFrame.ViewButton:SkinButton()\r\n\r\n\tBFAMissionFrameMissions.CompleteDialog.BorderFrame.Stage:StripTextures()\r\n\r\n\tBFAMissionFrame.MissionComplete.NextMissionButton:SkinButton()\r\n\r\n\tfor i = 1, 3 do\r\n\t\tT.SkinTab(_G[\"BFAMissionFrameTab\"..i])\r\n\tend\r\n\r\n\tT.SkinCloseButton(BFAMissionFrame.CloseButton)\r\n\r\n\tSkinTab(BFAMissionFrameMissionsTab1)\r\n\tSkinTab(BFAMissionFrameMissionsTab2)\r\n\tBFAMissionFrameMissionsTab1.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\r\n\tBFAMissionFrameMissionsTab1.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1)\r\n\tBFAMissionFrameMissionsTab1:SetPoint(\"BOTTOMLEFT\", BFAMissionFrameMissions, \"TOPLEFT\", 18, 0)\r\n\r\n\tBFAMissionFrameMissions:StripTextures()\r\n\tT.SkinScrollBar(BFAMissionFrameMissions.ScrollBar)\r\n\r\n\tBFAMissionFrameMissions.MaterialFrame:GetRegions():Hide()\r\n\tBFAMissionFrameMissions.MaterialFrame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\r\n\thooksecurefunc(BFAMissionFrame.MissionTab.MissionList.ScrollBox, \"Update\", function(frame)\r\n\t\tfor i = 1, frame.ScrollTarget:GetNumChildren() do\r\n\t\t\tlocal button = select(i, frame.ScrollTarget:GetChildren())\r\n\t\t\tif not button.backdrop then\r\n\t\t\t\tbutton:StripTextures()\r\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\r\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\r\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\r\n\t\t\t\tbutton:StyleButton(nil, 2)\r\n\t\t\t\tbutton.LocBG:SetHeight(75)\r\n\t\t\t\tbutton.LocBG:SetPoint(\"RIGHT\", 0, -1)\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\t-- Followers\r\n\tlocal Follower = BFAMissionFrameFollowers\r\n\tFollower:StripTextures()\r\n\tT.SkinEditBox(Follower.SearchBox)\r\n\tFollower.SearchBox:SetPoint(\"TOPLEFT\", 2, 25)\r\n\tFollower.SearchBox:SetSize(301, 20)\r\n\tT.SkinScrollBar(BFAMissionFrameFollowers.ScrollBar)\r\n\tFollower.MaterialFrame:StripTextures()\r\n\tT.SkinCloseButton(BFAMissionFrame.MissionTab.MissionPage.CloseButton)\r\n\tBFAMissionFrame.MissionTab.MissionPage.StartMissionButton:SkinButton()\r\n\r\n\tlocal FollowerTab = BFAMissionFrame.FollowerTab\r\n\tFollowerTab:StripTextures()\r\n\tFollowerTab.ModelCluster:StripTextures()\r\n\tFollowerTab:CreateBackdrop(\"Overlay\")\r\n\tFollowerTab.backdrop:SetPoint(\"TOPLEFT\", -2, 0)\r\n\tFollowerTab.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -2)\r\n\tFollowerTab.Class:SetSize(50, 43)\r\n\r\n\tHandleGarrisonPortrait(FollowerTab.PortraitFrame)\r\n\r\n\thooksecurefunc(BFAMissionFrame.FollowerList, \"ShowFollower\", onShowFollower)\r\n\r\n\t-- Map\r\n\tBFAMissionFrame.MapTab.ScrollContainer:ClearAllPoints()\r\n\tBFAMissionFrame.MapTab.ScrollContainer:SetPoint(\"TOPLEFT\")\r\n\tBFAMissionFrame.MapTab.ScrollContainer:SetPoint(\"BOTTOMRIGHT\")\r\n\r\n\t----------------------------------------------------------------------------------------\r\n\t--\tShadowlands Mission skin\r\n\t----------------------------------------------------------------------------------------\r\n\tCovenantMissionFrame:CreateBackdrop(\"Transparent\")\r\n\tCovenantMissionFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\r\n\tCovenantMissionFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\r\n\tCovenantMissionFrame.BackgroundTile:SetAlpha(0)\r\n\r\n\tCovenantMissionFrame.TopRightCorner:SetAlpha(0)\r\n\tCovenantMissionFrame.TopBorder:SetAlpha(0)\r\n\tCovenantMissionFrame.TopLeftCorner:SetAlpha(0)\r\n\r\n\tCovenantMissionFrame.MissionTab:StripTextures()\r\n\tCovenantMissionFrame:DisableDrawLayer(\"BORDER\")\r\n\tCovenantMissionFrame:DisableDrawLayer(\"BACKGROUND\")\r\n\r\n\tCovenantMissionFrame:HookScript(\"OnShow\", function(self)\r\n\t\tT.SkinCloseButton(CovenantMissionFrame.CloseButton)\r\n\t\tCovenantMissionFrame.FollowerTab:StripTextures()\r\n\tend)\r\n\r\n\thooksecurefunc(CovenantMissionFrame, \"SetupTabs\", function(self)\r\n\t\tself.MapTab:SetShown(not self.Tab2:IsShown())\r\n\tend)\r\n\r\n\tlocal material = CovenantMissionFrameMissions.MaterialFrame\r\n\tmaterial.BG:SetAlpha(0)\r\n\tmaterial.LeftFiligree:Hide()\r\n\tmaterial.RightFiligree:Hide()\r\n\tmaterial.Icon:SkinIcon()\r\n\tCovenantMissionFrameMissions.RaisedFrameEdges:StripTextures()\r\n\tCovenantMissionFrameMissions:DisableDrawLayer(\"BORDER\")\r\n\tT.SkinScrollBar(CovenantMissionFrameMissions.ScrollBar)\r\n\r\n\tCovenantMissionFrameMissions.ScrollBar.Back:SetSize(17, 15)\r\n\tCovenantMissionFrameMissions.ScrollBar.Track.Thumb:SetWidth(17)\r\n\tCovenantMissionFrameMissions.ScrollBar.Forward:SetSize(17, 15)\r\n\tCovenantMissionFrameMissions.ScrollBar:SetPoint(\"TOPLEFT\", CovenantMissionFrameMissions.ScrollBox, \"TOPRIGHT\", 7, -11)\r\n\tCovenantMissionFrameMissions.ScrollBar:SetPoint(\"BOTTOMLEFT\", CovenantMissionFrameMissions.ScrollBox, \"BOTTOMRIGHT\", 7, 2)\r\n\r\n\thooksecurefunc(CovenantMissionFrame.MissionTab.MissionList.ScrollBox, \"Update\", function(frame)\r\n\t\tfor i = 1, frame.ScrollTarget:GetNumChildren() do\r\n\t\t\tlocal button = select(i, frame.ScrollTarget:GetChildren())\r\n\t\t\tif not button.backdrop then\r\n\t\t\t\tbutton.ButtonBG:Hide()\r\n\t\t\t\tbutton.Highlight:Hide()\r\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\r\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 0, -3)\r\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 3)\r\n\t\t\t\tbutton:StyleButton(nil, 0)\r\n\t\t\t\tbutton.Overlay.Overlay:SetAllPoints(button.backdrop)\r\n\t\t\tend\r\n\t\tend\r\n\tend)\r\n\r\n\tfor i = 1, 2 do\r\n\t\tT.SkinTab(_G[\"CovenantMissionFrameTab\"..i])\r\n\tend\r\n\r\n\t-- Followers\r\n\tlocal Follower = CovenantMissionFrameFollowers\r\n\tFollower:StripTextures()\r\n\tFollower.MaterialFrame:StripTextures()\r\n\tFollower.HealAllButton:SkinButton()\r\n\tFollower.ElevatedFrame:Hide()\r\n\r\n\thooksecurefunc(Follower, \"ShowFollower\", onShowFollower)\r\n\r\n\tT.SkinScrollBar(CovenantMissionFrameFollowers.ScrollBar)\r\n\tCovenantMissionFrameFollowers.ScrollBar.Back:SetSize(17, 15)\r\n\tCovenantMissionFrameFollowers.ScrollBar.Track.Thumb:SetWidth(17)\r\n\tCovenantMissionFrameFollowers.ScrollBar.Forward:SetSize(17, 15)\r\n\tCovenantMissionFrameFollowers.ScrollBar:SetPoint(\"TOPLEFT\", CovenantMissionFrameFollowers.ScrollBox, \"TOPRIGHT\", 7, -11)\r\n\tCovenantMissionFrameFollowers.ScrollBar:SetPoint(\"BOTTOMLEFT\", CovenantMissionFrameFollowers.ScrollBox, \"BOTTOMRIGHT\", 7, 0)\r\n\r\n\tlocal FollowerTab = CovenantMissionFrame.FollowerTab\r\n\tFollowerTab:CreateBackdrop(\"Overlay\")\r\n\tFollowerTab.backdrop:SetPoint(\"TOPLEFT\", -2, 0)\r\n\tFollowerTab.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 20)\r\n\tFollowerTab.RaisedFrameEdges:Hide()\r\n\r\n\tFollowerTab.HealFollowerFrame.ButtonFrame:Hide()\r\n\tHealFollowerButtonTemplate:SkinButton()\r\n\r\n\tFollowerTab.HealFollowerFrame.CostFrame.CostLabel:SetFont(C.media.normal_font, 14, \"\")\r\n\tFollowerTab.HealFollowerFrame.CostFrame.CostIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\r\n\t-- Mission\r\n\tT.SkinCloseButton(CovenantMissionFrame.MissionTab.MissionPage.CloseButton)\r\n\tCovenantMissionFrame.MissionTab.MissionPage.StartMissionButton:SkinButton()\r\n\r\n\tCovenantMissionFrame.MissionComplete.CompleteFrame.ContinueButton:SkinButton()\r\n\tCovenantMissionFrame.MissionComplete.CompleteFrame.SpeedButton:SkinButton()\r\n\tCovenantMissionFrame.MissionComplete.RewardsScreen.FinalRewardsPanel.ContinueButton:SkinButton()\r\n\r\n\tHandleGarrisonPortrait(GarrisonLandingPage.FollowerTab.CovenantFollowerPortraitFrame)\r\n\r\n\tCovenantMissionFrame.MissionTab.MissionPage.CostFrame.CostLabel:SetFont(C.media.normal_font, 14, \"\")\r\n\tCovenantMissionFrame.MissionTab.MissionPage.CostFrame.CostIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\r\n\r\n\t----------------------------------------------------------------------------------------\r\n\t--\tKayrCovenantMissions AddOn skin\r\n\t----------------------------------------------------------------------------------------\r\n\tif IsAddOnLoaded(\"KayrCovenantMissions\") then\r\n\t\thooksecurefunc(CovenantMissionFrame, \"SetupTabs\", function()\r\n\t\t\tif KayrCovenantMissionsAdvice then\r\n\t\t\t\tKayrCovenantMissionsAdvice:StripTextures()\r\n\t\t\t\tKayrCovenantMissionsAdvice:CreateBackdrop(\"Transparent\")\r\n\t\t\t\tKayrCovenantMissionsAdvice.backdrop:SetPoint(\"TOPLEFT\", 2, -4)\r\n\t\t\t\tKayrCovenantMissionsAdvice.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 4)\r\n\t\t\tend\r\n\t\tend)\r\n\tend\r\nend\r\n\r\nT.SkinFuncs[\"Blizzard_GarrisonUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/GenericTrait.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tGeneric Trait skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = _G.GenericTraitFrame\n\tT.SkinFrame(frame)\n\n\tlocal function ReplaceIconString(frame, text)\n\t\tif not text then text = frame:GetText() end\n\t\tif not text or text == \"\" then return end\n\n\t\tlocal newText, count = gsub(text, \"|T(%d+):24:24[^|]*|t\", \" |T%1:16:16:0:0:64:64:5:59:5:59|t\")\n\t\tif count > 0 then frame:SetFormattedText(\"%s\", newText) end\n\tend\n\n\tReplaceIconString(frame.Currency.UnspentPointsCount)\n\thooksecurefunc(frame.Currency.UnspentPointsCount, \"SetText\", ReplaceIconString)\nend\n\nT.SkinFuncs[\"Blizzard_GenericTraitUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Gossip.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tGossip skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal StripAllTextures = {\n\t\tGossipFrame,\n\t\tGossipFrame.GreetingPanel\n\t}\n\n\tfor i = 1, #StripAllTextures do\n\t\tlocal button = StripAllTextures[i]\n\t\tbutton:StripTextures()\n\tend\n\n\tlocal KillTextures = {\n\t\t\"GossipFramePortrait\"\n\t}\n\n\tfor _, texture in pairs(KillTextures) do\n\t\t_G[texture]:Kill()\n\tend\n\n\tlocal buttons = {\n\t\tGossipFrame.GreetingPanel.GoodbyeButton\n\t}\n\n\tfor i = 1, #buttons do\n\t\tbuttons[i]:SkinButton(true)\n\tend\n\n\tlocal function ReplaceGossipFormat(button, textFormat, text)\n\t\tlocal newFormat, count = gsub(textFormat, \"000000\", \"ffffff\")\n\t\tif count > 0 then\n\t\t\tbutton:SetFormattedText(newFormat, text)\n\t\tend\n\tend\n\n\tlocal ReplacedGossipColor = {\n\t\t[\"000000\"] = \"ffffff\",\n\t\t[\"414141\"] = \"7b8489\",\n\t}\n\n\tlocal function ReplaceGossipText(button, text)\n\t\tif text and text ~= \"\" then\n\t\t\tlocal newText, count = gsub(text, \":32:32:0:0\", \":32:32:0:0:64:64:5:59:5:59\")\n\t\t\tif count > 0 then\n\t\t\t\ttext = newText\n\t\t\t\tbutton:SetFormattedText(\"%s\", text)\n\t\t\tend\n\n\t\t\tlocal colorStr, rawText = strmatch(text, \"|c[fF][fF](%x%x%x%x%x%x)(.-)|r\")\n\t\t\tcolorStr = ReplacedGossipColor[colorStr]\n\t\t\tif colorStr and rawText then\n\t\t\t\tbutton:SetFormattedText(\"|cff%s%s|r\", colorStr, rawText)\n\t\t\tend\n\t\tend\n\tend\n\n\t_G.QuestFont:SetTextColor(1, 1, 1)\n\t_G.QuestFont:SetShadowOffset(1, -1)\n\n\tGossipFrame:CreateBackdrop(\"Transparent\")\n\tGossipFrame.backdrop:SetAllPoints()\n\tGossipFrame:DisableDrawLayer(\"BACKGROUND\")\n\n\tT.SkinCloseButton(GossipFrameCloseButton, GossipFrame.backdrop)\n\n\tT.SkinScrollBar(GossipFrame.GreetingPanel.ScrollBar)\n\n\tGossipFrame.FriendshipStatusBar:StripTextures()\n\tGossipFrame.FriendshipStatusBar:SetStatusBarTexture(C.media.texture)\n\tGossipFrame.FriendshipStatusBar:CreateBackdrop(\"Overlay\")\n\tGossipFrame.FriendshipStatusBar.icon:SetPoint(\"TOPLEFT\", -30, 7)\n\n\t-- Extreme hackage, blizzard makes button text on quest frame use hex color codes for some reason\n\thooksecurefunc(GossipFrame.GreetingPanel.ScrollBox, \"Update\", function(frame)\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not button.IsSkinned then\n\t\t\t\tlocal buttonText = select(3, button:GetRegions())\n\t\t\t\tif buttonText and buttonText:IsObjectType(\"FontString\") then\n\t\t\t\t\tReplaceGossipText(button, button:GetText())\n\t\t\t\t\thooksecurefunc(button, \"SetText\", ReplaceGossipText)\n\t\t\t\t\thooksecurefunc(button, \"SetFormattedText\", ReplaceGossipFormat)\n\t\t\t\tend\n\n\t\t\t\tbutton.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Guide.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tNew Player Experience Guide skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = GuideFrame\n\tT.SkinCloseButton(frame.CloseButton)\n\n\tframe:StripTextures()\n\tframe:CreateBackdrop(\"Transparent\")\n\n\tframe.Title:SetTextColor(1, 1, 1)\n\tframe.ScrollFrame.Child.Text:SetTextColor(1, 1, 1)\n\n\tframe.ScrollFrame.Child.ObjectivesFrame:StripTextures()\n\tframe.ScrollFrame.Child.ObjectivesFrame:CreateBackdrop(\"Overlay\")\n\n\tT.SkinScrollBar(GuideFrame.ScrollFrame.ScrollBar)\n\tframe.ScrollFrame.ConfirmationButton:SkinButton()\nend\n\nT.SkinFuncs[\"Blizzard_NewPlayerExperienceGuide\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/GuildBank.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tGuildBankUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tGuildBankFrame:StripTextures()\n\tGuildBankFrame:SetTemplate(\"Transparent\")\n\tGuildBankFrame.Emblem:StripTextures(true)\n\tGuildBankFrame.MoneyFrameBG:StripTextures()\n\n\tfor i = 1, GuildBankFrame:GetNumChildren() do\n\t\tlocal child = select(i, GuildBankFrame:GetChildren())\n\t\tif child.GetPushedTexture and child:GetPushedTexture() and not child:GetName() then\n\t\t\tT.SkinCloseButton(child)\n\t\tend\n\tend\n\n\tGuildBankFrame.DepositButton:SkinButton(true)\n\tGuildBankFrame.WithdrawButton:SkinButton(true)\n\tGuildBankInfoSaveButton:SkinButton(true)\n\tGuildBankFrame.BuyInfo.PurchaseButton:SkinButton(true)\n\n\tGuildBankFrame.WithdrawButton:SetPoint(\"RIGHT\", GuildBankFrame.DepositButton, \"LEFT\", -2, 0)\n\n\tGuildBankInfoScrollFrame:StripTextures()\n\tGuildBankInfoScrollFrame:SetPoint(\"TOPLEFT\", _G.GuildBankInfo, \"TOPLEFT\", -7, 12)\n\tGuildBankInfoScrollFrame:SetWidth(_G.GuildBankInfoScrollFrame:GetWidth() - 8)\n\tT.SkinScrollBar(GuildBankInfoScrollFrameScrollBar)\n\tT.SkinScrollBar(GuildBankTransactionsScrollFrameScrollBar)\n\tGuildBankInfoScrollFrame:SetHeight(GuildBankInfoScrollFrame:GetHeight() - 5)\n\tGuildBankTransactionsScrollFrame:SetHeight(GuildBankTransactionsScrollFrame:GetHeight() - 5)\n\n\tGuildBankFrame.inset = CreateFrame(\"Frame\", nil, GuildBankFrame)\n\tGuildBankFrame.inset:SetTemplate(\"Overlay\")\n\tGuildBankFrame.inset:SetPoint(\"TOPLEFT\", 21, -58)\n\tGuildBankFrame.inset:SetPoint(\"BOTTOMRIGHT\", -17, 61)\n\n\tGuildItemSearchBox:StripTextures(true)\n\tGuildItemSearchBox:CreateBackdrop(\"Overlay\")\n\tGuildItemSearchBox.backdrop:SetPoint(\"TOPLEFT\", 13, 0)\n\tGuildItemSearchBox.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\n\tfor i = 1, 7 do\n\t\tlocal column = _G.GuildBankFrame[\"Column\"..i]\n\t\tcolumn:StripTextures()\n\n\t\tfor j = 1, 14 do\n\t\t\tlocal button = column[\"Button\"..j]\n\t\t\tlocal icon = button.icon\n\n\t\t\tbutton.IconBorder:SetAlpha(0)\n\t\t\tbutton:SetNormalTexture(0)\n\t\t\tbutton:StyleButton()\n\t\t\tbutton:SetTemplate(\"Default\")\n\n\t\t\ticon:ClearAllPoints()\n\t\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tend\n\tend\n\n\tfor i = 1, 8 do\n\t\tlocal tab = _G[\"GuildBankTab\"..i]\n\t\tlocal button = tab.Button\n\t\tlocal texture = button.IconTexture\n\t\ttab:StripTextures(true)\n\n\t\tbutton:StripTextures()\n\t\tbutton:StyleButton()\n\t\tbutton:SetTemplate(\"Default\")\n\n\t\t-- Reposition tabs\n\t\tbutton:ClearAllPoints()\n\t\tif i == 1 then\n\t\t\tbutton:SetPoint(\"TOPLEFT\", GuildBankFrame, \"TOPRIGHT\", 1, 0)\n\t\telse\n\t\t\tbutton:SetPoint(\"TOP\", _G[\"GuildBankTab\"..i-1].Button, \"BOTTOM\", 0, -20)\n\t\tend\n\n\t\ttexture:ClearAllPoints()\n\t\ttexture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ttexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\ttexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\n\n\tfor i = 1, 4 do\n\t\tT.SkinTab(_G[\"GuildBankFrameTab\"..i])\n\tend\n\n\t-- Reposition tabs\n\tGuildBankFrameTab1:ClearAllPoints()\n\tGuildBankFrameTab1:SetPoint(\"TOPLEFT\", GuildBankFrame, \"BOTTOMLEFT\", 0, 2)\n\n\t-- Popup\n\tGuildBankPopupFrame:HookScript(\"OnShow\", function(frame)\n\t\tif not frame.isSkinned then\n\t\t\tT.SkinIconSelectionFrame(frame, nil, nil, \"GuildBankPopup\")\n\t\t\tframe.isSkinned = true\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_GuildBankUI\"] = LoadSkin\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/GuildControl.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tGuildControlUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tGuildControlUI:StripTextures()\n\tGuildControlUIHbar:StripTextures()\n\tGuildControlUI:SetTemplate(\"Transparent\")\n\tGuildControlUI:ClearAllPoints()\n\tGuildControlUI:SetPoint(\"TOPLEFT\", GuildFrame, \"TOPRIGHT\", 3, 0)\n\tGuildControlUI:SetFrameLevel(GuildControlUI:GetFrameLevel() + 2)\n\n\tlocal function SkinGuildRanks()\n\t\tfor i = 1, GuildControlGetNumRanks() do\n\t\t\tlocal rankFrame = _G[\"GuildControlUIRankOrderFrameRank\"..i]\n\t\t\tif rankFrame then\n\t\t\t\trankFrame.downButton:SkinButton()\n\t\t\t\trankFrame.upButton:SkinButton()\n\t\t\t\trankFrame.deleteButton:SkinButton()\n\n\t\t\t\tif not rankFrame.nameBox.backdrop then\n\t\t\t\t\tT.SkinEditBox(rankFrame.nameBox)\n\t\t\t\tend\n\n\t\t\t\trankFrame.nameBox.backdrop:SetPoint(\"TOPLEFT\", -2, -4)\n\t\t\t\trankFrame.nameBox.backdrop:SetPoint(\"BOTTOMRIGHT\", -4, 4)\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(\"GuildControlUI_RankOrder_Update\", SkinGuildRanks)\n\n\tT.SkinDropDownBox(GuildControlUINavigationDropDown)\n\tT.SkinDropDownBox(GuildControlUIRankSettingsFrameRankDropDown, 180)\n\tGuildControlUINavigationDropDownButton:SetWidth(20)\n\tGuildControlUIRankSettingsFrameRankDropDownButton:SetWidth(20)\n\n\tfor i = 1, NUM_RANK_FLAGS do\n\t\tif _G[\"GuildControlUIRankSettingsFrameCheckbox\"..i] then\n\t\t\tT.SkinCheckBox(_G[\"GuildControlUIRankSettingsFrameCheckbox\"..i])\n\t\tend\n\tend\n\n\tGuildControlUIRankOrderFrameNewButton:SkinButton()\n\n\tT.SkinEditBox(GuildControlUIRankSettingsFrameGoldBox)\n\tGuildControlUIRankSettingsFrameGoldBox.backdrop:SetPoint(\"TOPLEFT\", -2, -4)\n\tGuildControlUIRankSettingsFrameGoldBox.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 4)\n\tGuildControlUIRankSettingsFrameGoldBox:StripTextures()\n\n\tGuildControlUIRankBankFrameInset:StripTextures()\n\tGuildControlUIRankBankFrameInsetScrollFrame:StripTextures()\n\n\thooksecurefunc(\"GuildControlUI_BankTabPermissions_Update\", function()\n\t\tlocal numTabs = GetNumGuildBankTabs()\n\t\tif numTabs < MAX_BUY_GUILDBANK_TABS then\n\t\t\tnumTabs = numTabs + 1\n\t\tend\n\t\tfor i = 1, numTabs do\n\t\t\tlocal tab = _G[\"GuildControlBankTab\"..i..\"Owned\"]\n\t\t\tlocal purchase = _G[\"GuildControlBankTab\"..i..\"BuyPurchaseButton\"]\n\t\t\tlocal icon = tab.tabIcon\n\t\t\tlocal editbox = tab.editBox\n\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\tT.SkinCheckBox(_G[\"GuildControlBankTab\"..i..\"OwnedViewCheck\"])\n\t\t\tT.SkinCheckBox(_G[\"GuildControlBankTab\"..i..\"OwnedDepositCheck\"])\n\t\t\tT.SkinCheckBox(_G[\"GuildControlBankTab\"..i..\"OwnedUpdateInfoCheck\"])\n\t\t\tT.SkinEditBox(editbox)\n\n\t\t\tif purchase:GetNumRegions() < 9 then\n\t\t\t\tpurchase:SkinButton()\n\t\t\tend\n\t\tend\n\tend)\n\n\tT.SkinDropDownBox(GuildControlUIRankBankFrameRankDropDown, 180)\n\tGuildControlUIRankBankFrameRankDropDownButton:SetWidth(20)\n\n\tT.SkinCloseButton(GuildControlUICloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_GuildControlUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/GuildRegistrar.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tGuildRegistrar skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tGuildRegistrarFrame:StripTextures(true)\n\tGuildRegistrarFrame:CreateBackdrop(\"Transparent\")\n\tGuildRegistrarFrame.backdrop:SetAllPoints()\n\tGuildRegistrarGreetingFrame:StripTextures()\n\tGuildRegistrarFrameInset:StripTextures()\n\tGuildRegistrarFramePortrait:SetAlpha(0)\n\n\tGuildRegistrarFramePurchaseButton:SkinButton()\n\tGuildRegistrarFrameCancelButton:SkinButton()\n\tGuildRegistrarFrameGoodbyeButton:SkinButton()\n\tGuildRegistrarFramePurchaseButton:ClearAllPoints()\n\tGuildRegistrarFramePurchaseButton:SetPoint(\"BOTTOMLEFT\", GuildRegistrarFrame.backdrop, \"BOTTOMLEFT\", 4, 4)\n\tGuildRegistrarFrameCancelButton:ClearAllPoints()\n\tGuildRegistrarFrameCancelButton:SetPoint(\"BOTTOMRIGHT\", GuildRegistrarFrame.backdrop, \"BOTTOMRIGHT\", -4, 4)\n\tGuildRegistrarFrameGoodbyeButton:ClearAllPoints()\n\tGuildRegistrarFrameGoodbyeButton:SetPoint(\"BOTTOMRIGHT\", GuildRegistrarFrame.backdrop, \"BOTTOMRIGHT\", -4, 4)\n\n\tT.SkinCloseButton(GuildRegistrarFrameCloseButton, GuildRegistrarFrame.backdrop)\n\n\tGuildRegistrarFrameEditBox:StripTextures(true)\n\tT.SkinEditBox(GuildRegistrarFrameEditBox, nil, GuildRegistrarFrameEditBox:GetHeight() - 15)\n\n\tfor i = 1, 2 do\n\t\t_G[\"GuildRegistrarButton\"..i]:GetFontString():SetTextColor(1, 1, 1)\n\tend\n\n\tGuildRegistrarPurchaseText:SetTextColor(1, 1, 1)\n\tAvailableServicesText:SetTextColor(1, 0.8, 0)\n\tAvailableServicesText:SetShadowColor(0, 0, 0)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Help.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tHelp skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = _G.HelpFrame\n\tframe:StripTextures()\n\tframe:CreateBackdrop('Transparent')\n\tT.SkinCloseButton(HelpFrame.CloseButton, frame.backdrop)\n\n\tlocal browser = _G.HelpBrowser\n\tbrowser.BrowserInset:StripTextures()\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Inspect.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tInspectUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tInspectFrame:StripTextures(true)\n\tInspectFrameInset:StripTextures(true)\n\tInspectFrame:CreateBackdrop(\"Transparent\")\n\tInspectFrame.backdrop:SetAllPoints()\n\tT.SkinCloseButton(InspectFrameCloseButton)\n\tInspectPaperDollFrame.ViewButton:SkinButton()\n\tInspectFramePortrait:SetAlpha(0)\n\n\tfor i = 1, 4 do\n\t\tT.SkinTab(_G[\"InspectFrameTab\"..i])\n\tend\n\n\tInspectModelFrame:StripTextures()\n\tInspectModelFrame:CreateBackdrop(\"Default\")\n\tInspectModelFrame.backdrop:SetPoint(\"TOPLEFT\", -3, 4)\n\tInspectModelFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 4, 0)\n\tInspectModelFrame.BackgroundOverlay:SetColorTexture(0, 0, 0)\n\n\t-- Unit Background Texture\n\tInspectModelFrameBackgroundTopLeft:SetPoint(\"TOPLEFT\", InspectModelFrame.backdrop, \"TOPLEFT\", 2, -2)\n\tInspectModelFrameBackgroundTopRight:SetPoint(\"TOPRIGHT\", InspectModelFrame.backdrop, \"TOPRIGHT\", -2, -2)\n\tInspectModelFrameBackgroundBotLeft:SetPoint(\"BOTTOMLEFT\", InspectModelFrame.backdrop, \"BOTTOMLEFT\", 2, -50)\n\tInspectModelFrameBackgroundBotRight:SetPoint(\"BOTTOMRIGHT\", InspectModelFrame.backdrop, \"BOTTOMRIGHT\", -2, -50)\n\n\tlocal slots = {\n\t\t\"HeadSlot\",\n\t\t\"NeckSlot\",\n\t\t\"ShoulderSlot\",\n\t\t\"BackSlot\",\n\t\t\"ChestSlot\",\n\t\t\"ShirtSlot\",\n\t\t\"TabardSlot\",\n\t\t\"WristSlot\",\n\t\t\"HandsSlot\",\n\t\t\"WaistSlot\",\n\t\t\"LegsSlot\",\n\t\t\"FeetSlot\",\n\t\t\"Finger0Slot\",\n\t\t\"Finger1Slot\",\n\t\t\"Trinket0Slot\",\n\t\t\"Trinket1Slot\",\n\t\t\"MainHandSlot\",\n\t\t\"SecondaryHandSlot\"\n\t}\n\n\tfor _, slot in pairs(slots) do\n\t\tlocal icon = _G[\"Inspect\"..slot..\"IconTexture\"]\n\t\tlocal slot = _G[\"Inspect\"..slot]\n\n\t\tslot:StripTextures()\n\t\tslot:StyleButton()\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\tslot:SetFrameLevel(slot:GetFrameLevel() + 2)\n\t\tslot:CreateBackdrop(\"Default\")\n\t\tslot.backdrop:SetAllPoints()\n\n\t\thooksecurefunc(slot.IconBorder, \"SetVertexColor\", function(self)\n\t\t\tself:SetTexture(\"\")\n\t\tend)\n\tend\n\n\t-- Presige texture\n\tlocal portrait = InspectPVPFrame:CreateTexture(nil, \"OVERLAY\")\n\tportrait:SetSize(55, 55)\n\tportrait:SetPoint(\"CENTER\", InspectPVPFrame.PortraitBackground, \"CENTER\", 0, 0)\n\tInspectPVPFrame.SmallWreath:ClearAllPoints()\n\tInspectPVPFrame.SmallWreath:SetPoint(\"TOPLEFT\", 3, -25)\n\n\t-- PvP Talents\n\tfor i = 1, 3 do\n\t\tlocal slot = InspectPVPFrame[\"TalentSlot\"..i]\n\t\tlocal icon = slot.Texture\n\t\tslot:StripTextures()\n\t\ticon:SkinIcon()\n\t\ticon:SetTexCoord(.15, .85, .15, .85)\n\t\tslot.Border:Hide()\n\tend\n\n\tInspectPVPFrame.BG:Kill()\n\n\tInspectPaperDollItemsFrame.InspectTalents:SkinButton()\n\n\tSpecializationRing:Hide()\n\tSpecializationSpecIcon:SkinIcon()\n\tSpecializationSpecIcon:SetTexCoord(.15, .85, .15, .85)\n\tSpecializationSpecName:SetFont(C.media.normal_font, 20, \"\")\n\tInspectTalentFrame:DisableDrawLayer(\"BACKGROUND\")\n\tInspectTalentFrame:DisableDrawLayer(\"BORDER\")\n\n\tInspectGuildFrameBG:Kill()\nend\n\nT.SkinFuncs[\"Blizzard_InspectUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Islands.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tIslands skin\n----------------------------------------------------------------------------------------\nlocal LoadTootlipSkin = CreateFrame(\"Frame\")\nLoadTootlipSkin:RegisterEvent(\"ADDON_LOADED\")\nLoadTootlipSkin:SetScript(\"OnEvent\", function(self, _, addon)\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") or not C.tooltip.enable then\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\t\treturn\n\tend\n\n\tif addon == \"Blizzard_IslandsQueueUI\" then\n\t\tlocal tt = IslandsQueueFrame.WeeklyQuest.QuestReward.Tooltip\n\t\ttt:SetTemplate(\"Transparent\")\n\t\ttt.ItemTooltip.Icon:SkinIcon()\n\t\ttt.ItemTooltip.IconBorder:SetAlpha(0)\n\tend\nend)\n\nif C.skins.blizzard_frames ~= true then return end\n\nlocal function LoadSkin()\n\tIslandsQueueFrame:StripTextures()\n\tIslandsQueueFrame:SetTemplate(\"Transparent\")\n\n\tIslandsQueueFrame.ArtOverlayFrame:SetAlpha(0)\n\tIslandsQueueFrame.TitleBanner.Banner:SetAlpha(0)\n\n\tIslandsQueueFrame.HelpButton.Ring:Hide()\n\tIslandsQueueFrame.HelpButton:SetPoint(\"TOPLEFT\", IslandsQueueFrame, \"TOPLEFT\", -12, 12)\n\n\tIslandsQueueFrame.DifficultySelectorFrame.Background:Hide()\n\tIslandsQueueFrame.DifficultySelectorFrame:SetPoint(\"BOTTOM\", 0, -15)\n\tIslandsQueueFrame.DifficultySelectorFrame.QueueButton:SkinButton()\n\n\tT.SkinCloseButton(IslandsQueueFrameCloseButton)\n\n\t-- StatusBar\n\tIslandsQueueFrame.WeeklyQuest.OverlayFrame:StripTextures()\n\tIslandsQueueFrame.WeeklyQuest.StatusBar:CreateBackdrop(\"Overlay\")\n\n\tlocal reward = IslandsQueueFrame.WeeklyQuest.QuestReward\n\treward:ClearAllPoints()\n\treward:SetPoint(\"LEFT\", IslandsQueueFrame.WeeklyQuest.StatusBar, \"RIGHT\", -3, 0)\n\treward.CircleMask:Hide()\n\treward:StripTextures()\n\treward.Icon:SkinIcon()\n\treward.Icon:SetSize(19, 19)\n\n\t-- TutorialFrame\n\tIslandsQueueFrame.TutorialFrame:StripTextures()\n\tIslandsQueueFrame.TutorialFrame:SetTemplate(\"Transparent\")\n\tIslandsQueueFrame.TutorialFrame:SetPoint(\"TOPLEFT\", 300, -150)\n\tIslandsQueueFrame.TutorialFrame:SetPoint(\"BOTTOMRIGHT\", -300, 170)\n\tIslandsQueueFrame.TutorialFrame.TutorialText:SetTextColor(1, 1, 1)\n\n\tlocal TutorialIcon = IslandsQueueFrame.TutorialFrame:CreateTexture(nil, \"BORDER\")\n\tTutorialIcon:SetTexture([[Interface\\Icons\\INV_Glowing Azerite Spire]])\n\tTutorialIcon:SetSize(64, 64)\n\tTutorialIcon:SetPoint(\"TOP\", IslandsQueueFrame.TutorialFrame, \"TOP\", 0, -10)\n\tTutorialIcon:SkinIcon(true)\n\tIslandsQueueFrame.TutorialFrame.Leave:SkinButton()\n\tT.SkinCloseButton(IslandsQueueFrame.TutorialFrame.CloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_IslandsQueueUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/ItemInteraction.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tItemInteractionUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tItemInteractionFrame:StripTextures()\n\tItemInteractionFrame:CreateBackdrop(\"Transparent\")\n\n\tItemInteractionFramePortrait:Hide()\n\n\tItemInteractionFrame.ButtonFrame:StripTextures()\n\tItemInteractionFrame.ButtonFrame.MoneyFrameEdge:StripTextures()\n\n\tlocal ItemSlot = ItemInteractionFrame.ItemSlot\n\tItemSlot:StripTextures()\n\n\tItemSlot:SetSize(58, 58)\n\tItemSlot:ClearAllPoints()\n\tItemSlot:SetPoint(\"TOPLEFT\", 143, -97)\n\n\tItemSlot.Icon:ClearAllPoints()\n\tItemSlot.Icon:SetPoint(\"TOPLEFT\", 1, -1)\n\tItemSlot.Icon:SetPoint(\"BOTTOMRIGHT\", -1, 1)\n\tItemSlot.Icon:SkinIcon()\n\n\tItemSlot.GlowOverlay:SetAlpha(0)\n\n\tItemInteractionFrame.ButtonFrame.Currency.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\tItemInteractionFrame.ButtonFrame.ActionButton:SkinButton()\n\tT.SkinCloseButton(ItemInteractionFrameCloseButton)\nend\n\nT.SkinFuncs[\"Blizzard_ItemInteractionUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/ItemSocketing.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tItemSocketingUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tItemSocketingFrame:StripTextures()\n\tItemSocketingFrame:CreateBackdrop(\"Transparent\")\n\tItemSocketingFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tItemSocketingFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\tItemSocketingFrameInset:StripTextures()\n\tItemSocketingScrollFrame:StripTextures()\n\tItemSocketingScrollFrame:CreateBackdrop(\"Overlay\")\n\tT.SkinScrollBar(ItemSocketingScrollFrameScrollBar)\n\tItemSocketingDescription:DisableDrawLayer(\"BORDER\")\n\tItemSocketingDescription:DisableDrawLayer(\"BACKGROUND\")\n\n\tfor i = 1, MAX_NUM_SOCKETS do\n\t\tlocal button = _G[\"ItemSocketingSocket\"..i]\n\t\tlocal button_bracket = _G[\"ItemSocketingSocket\"..i..\"BracketFrame\"]\n\t\tlocal button_bg = _G[\"ItemSocketingSocket\"..i..\"Background\"]\n\t\tlocal button_icon = _G[\"ItemSocketingSocket\"..i..\"IconTexture\"]\n\n\t\tbutton:StripTextures()\n\t\tbutton:StyleButton()\n\t\tbutton:SetTemplate(\"Overlay\")\n\t\tbutton_bracket:Kill()\n\t\tbutton_bg:Kill()\n\n\t\tbutton_icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton_icon:ClearAllPoints()\n\t\tbutton_icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tbutton_icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tlocal GEM_TYPE_INFO = {\n\t\tYellow = {r = 0.97, g = 0.82, b = 0.29},\n\t\tRed = {r = 1, g = 0.47, b = 0.47},\n\t\tBlue = {r = 0.47, g = 0.67, b = 1},\n\t\tPunchcardRed = {r = 1, g = 0.47, b = 0.47},\n\t\tPunchcardYellow = {r = 0.97, g = 0.82, b = 0.29},\n\t\tPunchcardBlue = {r = 0.47, g = 0.67, b = 1}\n\t}\n\n\thooksecurefunc(\"ItemSocketingFrame_Update\", function()\n\t\tfor i, socket in ipairs(_G.ItemSocketingFrame.Sockets) do\n\t\t\tlocal gemColor = GetSocketTypes(i)\n\t\t\tlocal color = GEM_TYPE_INFO[gemColor]\n\t\t\tif color then\n\t\t\t\tsocket:SetBackdropBorderColor(color.r, color.g, color.b)\n\t\t\t\tsocket.overlay:SetVertexColor(color.r, color.g, color.b, 0.35)\n\t\t\telse\n\t\t\t\tsocket:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\tsocket.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\n\t\t\tend\n\t\tend\n\tend)\n\n\tItemSocketingFramePortrait:Kill()\n\tItemSocketingSocketButton:ClearAllPoints()\n\tItemSocketingSocketButton:SetPoint(\"BOTTOMRIGHT\", ItemSocketingFrame.backdrop, \"BOTTOMRIGHT\", -5, 5)\n\tItemSocketingSocketButton:SkinButton()\n\tT.SkinCloseButton(ItemSocketingFrameCloseButton, ItemSocketingFrame.backdrop)\nend\n\nT.SkinFuncs[\"Blizzard_ItemSocketingUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/ItemText.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tItemText skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tItemTextFrame:StripTextures(true)\n\tItemTextFrameInset:StripTextures()\n\tItemTextScrollFrame:StripTextures()\n\tItemTextFrame:CreateBackdrop(\"Transparent\")\n\tItemTextFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tItemTextFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\tT.SkinCloseButton(ItemTextFrameCloseButton, ItemTextFrame.backdrop)\n\tT.SkinNextPrevButton(ItemTextPrevPageButton)\n\tT.SkinNextPrevButton(ItemTextNextPageButton)\n\tT.SkinScrollBar(ItemTextScrollFrameScrollBar)\n\tItemTextPageText:SetTextColor(\"P\", 1, 1, 1)\n\tItemTextPageText.SetTextColor = T.dummy\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/ItemUpgrade.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tItemUpgrade skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = ItemUpgradeFrame\n\tT.SkinCloseButton(frame.CloseButton)\n\n\tframe:StripTextures()\n\tframe:SetTemplate(\"Transparent\")\n\tItemUpgradeFramePortrait:SetAlpha(0)\n\n\tframe.UpgradeItemButton:StripTextures()\n\tframe.UpgradeItemButton:SetTemplate(\"Default\")\n\tframe.UpgradeItemButton:StyleButton()\n\tframe.UpgradeItemButton:GetNormalTexture():SetInside()\n\tframe.UpgradeItemButton.IconBorder:SetAlpha(0)\n\tframe.UpgradeItemButton.icon:SetInside()\n\tframe.UpgradeItemButton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\tT.SkinDropDownBox(frame.ItemInfo.Dropdown)\n\n\tframe.UpgradeButton:SkinButton(true)\n\n\tframe.UpgradeCostFrame.BGTex:Hide()\n\n\tItemUpgradeFrameLeftItemPreviewFrame.NineSlice:SetTemplate(\"Overlay\")\n\tItemUpgradeFrameRightItemPreviewFrame.NineSlice:SetTemplate(\"Overlay\")\n\n\tItemUpgradeFramePlayerCurrenciesBorder:StripTextures()\n\n\tlocal function reskinCurrencyIcon(self)\n\t\tfor frame in self.iconPool:EnumerateActive() do\n\t\t\tif not frame.Icon.styled then\n\t\t\t\tframe.Icon:SkinIcon(true)\n\t\t\t\tframe.Icon.styled = true\n\t\t\tend\n\t\tend\n\tend\n\n\thooksecurefunc(frame.UpgradeCostFrame, \"GetIconFrame\", reskinCurrencyIcon)\n\thooksecurefunc(frame.PlayerCurrencies, \"GetIconFrame\", reskinCurrencyIcon)\nend\n\nT.SkinFuncs[\"Blizzard_ItemUpgradeUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/LoadFrames.xml",
    "content": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\">\n\t<Script file=\"Others.lua\"/>\n\t<Script file=\"Achievement.lua\"/>\n\t<Script file=\"AddonList.lua\"/>\n\t<Script file=\"AdventureMap.lua\"/>\n\t<Script file=\"AlertFrames.lua\"/>\n\t<Script file=\"AlliedRaces.lua\"/>\n\t<Script file=\"AnimaDiversion.lua\"/>\n\t<Script file=\"Archeology.lua\"/>\n\t<Script file=\"Artifact.lua\"/>\n\t<Script file=\"Auction.lua\"/>\n\t<Script file=\"Azerite.lua\"/>\n\t<Script file=\"AzeriteEssence.lua\"/>\n\t<Script file=\"AzeriteRespec.lua\"/>\n\t<Script file=\"BarberShop.lua\"/>\n\t<Script file=\"Binding.lua\"/>\n\t<Script file=\"BlackMarket.lua\"/>\n\t<Script file=\"BonusRoll.lua\"/>\n\t<Script file=\"Bubbles.lua\"/>\n\t<Script file=\"Calendar.lua\"/>\n\t<Script file=\"Channels.lua\"/>\n\t<Script file=\"Character.lua\"/>\n\t<Script file=\"ChatConfig.lua\"/>\n\t<Script file=\"ChromieTime.lua\"/>\n\t<Script file=\"Collections.lua\"/>\n\t<Script file=\"Communities.lua\"/>\n\t<Script file=\"Container.lua\"/>\n\t<Script file=\"Contribution.lua\"/>\n\t<Script file=\"CovenantPreview.lua\"/>\n\t<Script file=\"CovenantRenown.lua\"/>\n\t<Script file=\"CovenantSanctum.lua\"/>\n\t<Script file=\"DebugTools.lua\"/>\n\t<Script file=\"DeathRecap.lua\"/>\n\t<Script file=\"DressUp.lua\"/>\n\t<Script file=\"EditorManager.lua\"/>\n\t<Script file=\"EncounterJournal.lua\"/>\n\t<Script file=\"EventTrace.lua\"/>\n\t<Script file=\"ExpansionLandingPage.lua\"/>\n\t<Script file=\"FlightMap.lua\"/>\n\t<Script file=\"Friends.lua\"/>\n\t<Script file=\"Garrison.lua\"/>\n\t<Script file=\"GenericTrait.lua\"/>\n\t<Script file=\"Gossip.lua\"/>\n\t<Script file=\"Guide.lua\"/>\n\t<Script file=\"GuildBank.lua\"/>\n\t<Script file=\"GuildControl.lua\"/>\n\t<Script file=\"GuildRegistrar.lua\"/>\n\t<Script file=\"Help.lua\"/>\n\t<Script file=\"Inspect.lua\"/>\n\t<Script file=\"Islands.lua\"/>\n\t<Script file=\"ItemInteraction.lua\"/>\n\t<Script file=\"ItemSocketing.lua\"/>\n\t<Script file=\"ItemText.lua\"/>\n\t<Script file=\"ItemUpgrade.lua\"/>\n\t<Script file=\"Loot.lua\"/>\n\t<Script file=\"LossOfControl.lua\"/>\n\t<Script file=\"Macro.lua\"/>\n\t<Script file=\"Mail.lua\"/>\n\t<Script file=\"MajorFaction.lua\"/>\n\t<Script file=\"Merchant.lua\"/>\n\t<Script file=\"Options.lua\"/>\n\t<Script file=\"OrderHall.lua\"/>\n\t<Script file=\"PartyPoseUI.lua\"/>\n\t<Script file=\"Petition.lua\"/>\n\t<Script file=\"PetStable.lua\"/>\n\t<Script file=\"PlayerChoice.lua\"/>\n\t<Script file=\"Professions.lua\"/>\n\t<Script file=\"ProfessionsOrders.lua\"/>\n\t<Script file=\"PvE.lua\"/>\n\t<Script file=\"PvP.lua\"/>\n\t<Script file=\"PvPMatch.lua\"/>\n\t<Script file=\"Quest.lua\"/>\n\t<Script file=\"QuickKeybind.lua\"/>\n\t<Script file=\"Raid.lua\"/>\n\t<Script file=\"RaidInfo.lua\"/>\n\t<Script file=\"Runeforge.lua\"/>\n\t<Script file=\"Scrapping.lua\"/>\n\t<Script file=\"Soulbinds.lua\"/>\n\t<Script file=\"SpellBook.lua\"/>\n\t<Script file=\"Subscription.lua\"/>\n\t<Script file=\"Tabard.lua\"/>\n\t<Script file=\"Talent.lua\"/>\n\t<Script file=\"TalkingHead.lua\"/>\n\t<Script file=\"Taxi.lua\"/>\n\t<Script file=\"TimeManager.lua\"/>\n\t<Script file=\"TorghastLevelPicker.lua\"/>\n\t<Script file=\"Trade.lua\"/>\n\t<Script file=\"Trainer.lua\"/>\n\t<Script file=\"Tutorial.lua\"/>\n\t<Script file=\"VoidStorage.lua\"/>\n\t<Script file=\"WeeklyRewards.lua\"/>\n\t<Script file=\"WorldMap.lua\"/>\n</Ui>"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Loot.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tLoot skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\t-- Loot History frame\n\tLootHistoryFrame:StripTextures()\n\tLootHistoryFrame:SetTemplate(\"Transparent\")\n\n\tT.SkinCloseButton(LootHistoryFrame.CloseButton)\n\tT.SkinCloseButton(LootHistoryFrame.ResizeButton, nil, \" \")\n\n\tLootHistoryFrameScrollFrame:GetRegions():Hide()\n\tT.SkinScrollBar(LootHistoryFrameScrollFrameScrollBar)\n\n\tLootHistoryFrame.ResizeButton:SetTemplate(\"Default\")\n\tLootHistoryFrame.ResizeButton:SetWidth(LootHistoryFrame:GetWidth())\n\tLootHistoryFrame.ResizeButton:ClearAllPoints()\n\tLootHistoryFrame.ResizeButton:SetPoint(\"TOP\", LootHistoryFrame, \"BOTTOM\", 0, -1)\n\n\tlocal function UpdateLoots(self)\n\t\tlocal numItems = C_LootHistory.GetNumItems()\n\t\tfor i = 1, numItems do\n\t\t\tlocal frame = self.itemFrames[i]\n\n\t\t\tif not frame.isSkinned then\n\t\t\t\tlocal Icon = frame.Icon:GetTexture()\n\n\t\t\t\tframe:StripTextures()\n\n\t\t\t\tframe:CreateBackdrop(\"Default\")\n\t\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame.Icon, -2, 2)\n\t\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame.Icon, 2, -2)\n\n\t\t\t\tframe.Icon:SetTexture(Icon)\n\t\t\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tframe.Icon:SetParent(frame.backdrop)\n\n\t\t\t\tframe.isSkinned = true\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(\"LootHistoryFrame_FullUpdate\", UpdateLoots)\n\tLootHistoryFrame:HookScript(\"OnShow\", UpdateLoots)\n\n\t-- Master Looter frame\n\tMasterLooterFrame:StripTextures()\n\tMasterLooterFrame:SetTemplate(\"Transparent\")\n\n\thooksecurefunc(\"MasterLooterFrame_Show\", function()\n\t\tlocal button = MasterLooterFrame.Item\n\t\tif button then\n\t\t\tlocal icon = button.Icon\n\t\t\tlocal texture = icon:GetTexture()\n\t\t\tlocal color = ITEM_QUALITY_COLORS[LootFrame.selectedQuality]\n\n\t\t\tbutton:StripTextures()\n\n\t\t\ticon:SetTexture(texture)\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\tbutton:CreateBackdrop(\"Default\")\n\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", icon, -2, 2)\n\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", icon, 2, -2)\n\t\t\tbutton.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)\n\t\tend\n\n\t\tfor i = 1, MasterLooterFrame:GetNumChildren() do\n\t\t\tlocal child = select(i, MasterLooterFrame:GetChildren())\n\t\t\tif child and not child.isSkinned and not child:GetName() then\n\t\t\t\tif child:GetObjectType() == \"Button\" then\n\t\t\t\t\tif child:GetPushedTexture() then\n\t\t\t\t\t\tT.SkinCloseButton(child)\n\t\t\t\t\telse\n\t\t\t\t\t\tchild:StripTextures()\n\t\t\t\t\t\tchild:SkinButton()\n\t\t\t\t\tend\n\t\t\t\t\tchild.isSkinned = true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Loot frame\n\tif C.loot.lootframe == true or (IsAddOnLoaded(\"AdiBags\") or IsAddOnLoaded(\"ArkInventory\") or IsAddOnLoaded(\"cargBags_Nivaya\") or IsAddOnLoaded(\"cargBags\") or IsAddOnLoaded(\"Bagnon\") or IsAddOnLoaded(\"Combuctor\") or IsAddOnLoaded(\"TBag\") or IsAddOnLoaded(\"BaudBag\")) then return end\n\n\tLootFrame:StripTextures(true)\n\tLootFrame:SetTemplate(\"Transparent\")\n\tT.SkinCloseButton(LootFrame.ClosePanelButton)\n\n\thooksecurefunc(LootFrameElementMixin, \"Init\", function(button)\n\t\tlocal item = button.Item\n\t\tif item and not item.styled then\n\t\t\titem:StyleButton()\n\t\t\titem:SetNormalTexture(0)\n\t\t\titem:SetTemplate(\"Default\")\n\n\t\t\titem.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\titem.icon:ClearAllPoints()\n\t\t\titem.icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\titem.icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\n\t\t\tbutton.HighlightNameFrame:SetAlpha(0)\n\t\t\tbutton.PushedNameFrame:SetAlpha(0)\n\t\t\titem.IconBorder:SetAlpha(0)\n\t\t\tbutton.NameFrame:Hide()\n\n\t\t\titem.styled = true\n\t\tend\n\n\t\tbutton.IconQuestTexture:SetAlpha(0)\n\t\tbutton.BorderFrame:SetAlpha(0)\n\t\tif button.QualityStripe then\n\t\t\tbutton.QualityStripe:SetAlpha(0)\n\t\tend\n\t\tif button.IconQuestTexture:IsShown() then\n\t\t\titem:SetBackdropBorderColor(1, 1, 0)\n\t\telse\n\t\t\titem:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/LossOfControl.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tLossOfControl skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal IconBackdrop = CreateFrame(\"Frame\", nil, LossOfControlFrame)\n\tIconBackdrop:SetTemplate(\"Default\")\n\tIconBackdrop:ClearAllPoints()\n\tIconBackdrop:SetPoint(\"TOPLEFT\", LossOfControlFrame.Icon, -2, 2)\n\tIconBackdrop:SetPoint(\"BOTTOMRIGHT\", LossOfControlFrame.Icon, 2, -2)\n\tIconBackdrop:SetFrameLevel(LossOfControlFrame:GetFrameLevel() - 1)\n\n\tLossOfControlFrame:StripTextures()\n\tLossOfControlFrame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tLossOfControlFrame.AbilityName:ClearAllPoints()\n\n\thooksecurefunc(\"LossOfControlFrame_SetUpDisplay\", function(self)\n\t\tself.Icon:ClearAllPoints()\n\t\tself.Icon:SetPoint(\"CENTER\", self, \"CENTER\", 0, 0)\n\n\t\tself.AbilityName:ClearAllPoints()\n\t\tself.AbilityName:SetPoint(\"BOTTOM\", self, 0, -28)\n\t\tself.AbilityName.scrollTime = nil\n\n\t\tself.TimeLeft.NumberText:ClearAllPoints()\n\t\tself.TimeLeft.NumberText:SetPoint(\"BOTTOM\", self, 4, -58)\n\t\tself.TimeLeft.NumberText.scrollTime = nil\n\n\t\tself.TimeLeft.SecondsText:ClearAllPoints()\n\t\tself.TimeLeft.SecondsText:SetPoint(\"BOTTOM\", self, 0, -80)\n\t\tself.TimeLeft.SecondsText.scrollTime = nil\n\n\t\tif self.Anim:IsPlaying() then\n\t\t\tself.Anim:Stop()\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Macro.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMacroUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal buttons = {\n\t\t\"MacroEditButton\",\n\t\t\"MacroDeleteButton\",\n\t\t\"MacroNewButton\",\n\t\t\"MacroExitButton\",\n\t\t\"MacroFrameTab1\",\n\t\t\"MacroFrameTab2\",\n\t\t\"MacroSaveButton\",\n\t\t\"MacroCancelButton\"\n\t}\n\n\tfor i = 1, #buttons do\n\t\t_G[buttons[i]]:SkinButton(true)\n\tend\n\n\thooksecurefunc(MacroFrame, \"UpdateButtons\", function()\n\t\tfor i = 1, 3 do -- Prevent disappear our scripts\n\t\t\t_G[buttons[i]]:HookScript(\"OnEnter\", T.SetModifiedBackdrop)\n\t\t\t_G[buttons[i]]:HookScript(\"OnLeave\", T.SetOriginalBackdrop)\n\t\tend\n\tend)\n\n\tfor i = 1, 2 do\n\t\tlocal tab = _G[format(\"MacroFrameTab%s\", i)]\n\t\ttab:SetHeight(22)\n\tend\n\tMacroFrameTab1:SetPoint(\"TOPLEFT\", MacroFrame, \"TOPLEFT\", 10, -39)\n\tMacroFrameTab2:SetPoint(\"LEFT\", MacroFrameTab1, \"RIGHT\", 4, 0)\n\tMacroFrameTab1.Text:SetAllPoints(MacroFrameTab1)\n\tMacroFrameTab2.Text:SetAllPoints(MacroFrameTab2)\n\n\t-- General\n\tMacroFrame:StripTextures()\n\tMacroFrame:CreateBackdrop(\"Transparent\")\n\tMacroFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tMacroFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\tMacroFrameInset:StripTextures()\n\n\tMacroFrameTextBackground:StripTextures()\n\tMacroFrameTextBackground:CreateBackdrop(\"Overlay\")\n\tMacroFrameTextBackground.backdrop:SetPoint(\"TOPLEFT\", 4, -3)\n\tMacroFrameTextBackground.backdrop:SetPoint(\"BOTTOMRIGHT\", -23, 0)\n\n\tT.SkinCloseButton(MacroFrameCloseButton, MacroFrame.backdrop)\n\n\t-- Reposition buttons\n\tMacroEditButton:ClearAllPoints()\n\tMacroEditButton:SetPoint(\"BOTTOMLEFT\", MacroFrameSelectedMacroButton, \"BOTTOMRIGHT\", 10, 0)\n\tMacroDeleteButton:ClearAllPoints()\n\tMacroDeleteButton:SetPoint(\"BOTTOMLEFT\", MacroFrame.backdrop, \"BOTTOMLEFT\", 9, 4)\n\tMacroNewButton:ClearAllPoints()\n\tMacroNewButton:SetPoint(\"RIGHT\", MacroExitButton, \"LEFT\", -3, 0)\n\n\t-- Regular scroll bar\n\tT.SkinScrollBar(MacroFrame.MacroSelector.ScrollBar)\n\tT.SkinScrollBar(MacroFrameScrollFrameScrollBar)\n\n\t-- Big icon\n\tMacroFrameSelectedMacroButton:StripTextures()\n\tMacroFrameSelectedMacroButton:StyleButton(true)\n\tMacroFrameSelectedMacroButton:GetNormalTexture():SetTexture(nil)\n\tMacroFrameSelectedMacroButton:SetTemplate(\"Default\")\n\tMacroFrameSelectedMacroButton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tMacroFrameSelectedMacroButton.Icon:ClearAllPoints()\n\tMacroFrameSelectedMacroButton.Icon:SetPoint(\"TOPLEFT\", 2, -2)\n\tMacroFrameSelectedMacroButton.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t-- Moving text\n\tMacroFrameCharLimitText:ClearAllPoints()\n\tMacroFrameCharLimitText:SetPoint(\"BOTTOM\", MacroFrameTextBackground, 0, -12)\n\n\t-- Skin all buttons\n\thooksecurefunc(MacroFrame.MacroSelector.ScrollBox, \"Update\", function()\n\t\tfor _, button in next, {MacroFrame.MacroSelector.ScrollBox.ScrollTarget:GetChildren()} do\n\t\t\tif button.Icon and not button.isSkinned then\n\t\t\t\tbutton:StripTextures()\n\t\t\t\tbutton:StyleButton(true)\n\t\t\t\tbutton:SetTemplate(\"Default\")\n\t\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tbutton.Icon:ClearAllPoints()\n\t\t\t\tbutton.Icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tbutton.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tbutton.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Icon selection frame\n\tMacroPopupFrame:HookScript(\"OnShow\", function(frame)\n\t\tif not frame.isSkinned then\n\t\t\tT.SkinIconSelectionFrame(frame, nil, nil, \"MacroPopup\")\n\t\t\tframe.isSkinned = true\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_MacroUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Mail.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMail skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tMailFrame:StripTextures()\n\tMailFrame:CreateBackdrop(\"Transparent\")\n\tMailFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tMailFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\n\tInboxFrame:StripTextures()\n\tMailFrameInset:StripTextures()\n\tSendMailMoneyInset:StripTextures()\n\tSendMailMoneyBg:StripTextures()\n\tMailFramePortrait:SetAlpha(0)\n\n\tfor i = 1, INBOXITEMS_TO_DISPLAY do\n\t\tlocal bg = _G[\"MailItem\"..i]\n\n\t\tbg:StripTextures()\n\t\tbg:CreateBackdrop(\"Overlay\")\n\t\tbg.backdrop:SetPoint(\"TOPLEFT\", 2, 1)\n\t\tbg.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\tlocal b = _G[\"MailItem\"..i..\"Button\"]\n\t\tb:StripTextures()\n\t\tb:SetTemplate(\"Default\")\n\t\tb:StyleButton()\n\n\t\tlocal t = _G[\"MailItem\"..i..\"ButtonIcon\"]\n\t\tt:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tt:ClearAllPoints()\n\t\tt:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tt:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t_G[\"MailItem\"..i..\"ButtonIconBorder\"]:SetAlpha(0)\n\tend\n\n\tT.SkinCloseButton(MailFrameCloseButton, MailFrame.backdrop)\n\tT.SkinNextPrevButton(InboxPrevPageButton)\n\tT.SkinNextPrevButton(InboxNextPageButton)\n\n\tT.SkinTab(MailFrameTab1)\n\tT.SkinTab(MailFrameTab2)\n\n\t-- Send mail\n\tSendMailFrame:StripTextures()\n\n\tSendMailScrollFrame:StripTextures(true)\n\tSendMailScrollFrame:CreateBackdrop(\"Overlay\")\n\tSendMailScrollFrame.backdrop:SetPoint(\"TOPLEFT\", 12, 0)\n\tSendMailScrollFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 0)\n\n\tT.SkinScrollBar(SendMailScrollFrameScrollBar)\n\n\tselect(3, SendMailNameEditBox:GetRegions()):SetDrawLayer(\"OVERLAY\")\n\tselect(3, SendMailSubjectEditBox:GetRegions()):SetDrawLayer(\"OVERLAY\")\n\n\tT.SkinEditBox(SendMailNameEditBox)\n\tT.SkinEditBox(SendMailSubjectEditBox)\n\tT.SkinEditBox(SendMailMoneyGold)\n\tT.SkinEditBox(SendMailMoneySilver)\n\tT.SkinEditBox(SendMailMoneyCopper)\n\n\tSendMailNameEditBox.backdrop:SetPoint(\"TOPLEFT\", -3, -2)\n\tSendMailNameEditBox.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 3)\n\tSendMailSubjectEditBox.backdrop:SetPoint(\"TOPLEFT\", -3, 0)\n\tSendMailSubjectEditBox.backdrop:SetPoint(\"BOTTOMRIGHT\", -4, 0)\n\n\tSendMailNameEditBox:ClearAllPoints()\n\tSendMailNameEditBox:SetPoint('TOPLEFT', SendMailFrame, 'TOPLEFT', 90, -30)\n\tSendMailNameEditBox.SetPoint = T.dummy\n\n\tlocal function MailFrameSkin()\n\t\tfor i = 1, ATTACHMENTS_MAX_SEND do\n\t\t\tlocal b = _G[\"SendMailAttachment\"..i]\n\n\t\t\tif not b.skinned then\n\t\t\t\tb:StripTextures()\n\t\t\t\tb:SetTemplate(\"Default\")\n\t\t\t\tb:StyleButton()\n\t\t\t\tb.IconBorder:SetAlpha(0)\n\t\t\t\tb.skinned = true\n\t\t\tend\n\n\t\t\tlocal t = b:GetNormalTexture()\n\n\t\t\tif t then\n\t\t\t\tt:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tt:ClearAllPoints()\n\t\t\t\tt:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tt:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(\"SendMailFrame_Update\", MailFrameSkin)\n\n\tSendMailMailButton:SkinButton()\n\tSendMailCancelButton:SkinButton()\n\n\tSendMailSendMoneyButton:SetSize(18, 18)\n\tSendMailCODButton:SetSize(18, 18)\n\tT.SkinCheckBox(SendMailSendMoneyButton)\n\tT.SkinCheckBox(SendMailCODButton)\n\n\t-- Open mail (cod)\n\tOpenMailFrame:StripTextures(true)\n\tOpenMailFrame:CreateBackdrop(\"Transparent\")\n\tOpenMailFrame.backdrop:SetPoint(\"TOPLEFT\", -5, 0)\n\tOpenMailFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\tOpenMailFrameInset:StripTextures()\n\n\tT.SkinCloseButton(OpenMailFrameCloseButton, OpenMailFrame.backdrop)\n\tOpenMailReportSpamButton:SkinButton()\n\tOpenMailReplyButton:SkinButton()\n\tOpenMailDeleteButton:SkinButton()\n\tOpenMailCancelButton:SkinButton()\n\n\tOpenMailScrollFrame:StripTextures(true)\n\tOpenMailScrollFrame:CreateBackdrop(\"Overlay\")\n\tOpenMailScrollFrame.backdrop:SetPoint(\"TOPLEFT\", 5, 5)\n\tOpenMailScrollFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, -5)\n\n\tT.SkinScrollBar(OpenMailScrollFrameScrollBar)\n\n\tSendMailBodyEditBox:SetTextColor(1, 1, 1)\n\tMailTextFontNormal:SetTextColor(1, 1, 1)\n\tInvoiceTextFontNormal:SetTextColor(1, 1, 1)\n\tOpenMailArithmeticLine:Kill()\n\n\tOpenMailLetterButton:StripTextures()\n\tOpenMailLetterButton:SetTemplate(\"Default\")\n\tOpenMailLetterButton:StyleButton()\n\tOpenMailLetterButtonIconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tOpenMailLetterButtonIconTexture:ClearAllPoints()\n\tOpenMailLetterButtonIconTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tOpenMailLetterButtonIconTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tOpenMailMoneyButton:StripTextures()\n\tOpenMailMoneyButton:SetTemplate(\"Default\")\n\tOpenMailMoneyButton:StyleButton()\n\tOpenMailMoneyButtonIconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tOpenMailMoneyButtonIconTexture:ClearAllPoints()\n\tOpenMailMoneyButtonIconTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tOpenMailMoneyButtonIconTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tfor i = 1, ATTACHMENTS_MAX_RECEIVE do\n\t\tlocal b = _G[\"OpenMailAttachmentButton\"..i]\n\t\tlocal t = _G[\"OpenMailAttachmentButton\"..i..\"IconTexture\"]\n\n\t\tb:StripTextures()\n\t\tb:SetTemplate(\"Default\")\n\t\tb:StyleButton()\n\t\tb.IconBorder:SetAlpha(0)\n\n\t\tif t then\n\t\t\tt:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tt:ClearAllPoints()\n\t\t\tt:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tt:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tend\n\tend\n\n\tOpenMailReplyButton:SetPoint(\"RIGHT\", OpenMailDeleteButton, \"LEFT\", -2, 0)\n\tOpenMailDeleteButton:SetPoint(\"RIGHT\", OpenMailCancelButton, \"LEFT\", -2, 0)\n\tSendMailMailButton:SetPoint(\"RIGHT\", SendMailCancelButton, \"LEFT\", -2, 0)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/MajorFaction.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMajor Factions skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = _G.MajorFactionRenownFrame\n\n\tT.SkinFrame(frame)\n\tframe.Background:SetAlpha(0)\nend\n\nT.SkinFuncs[\"Blizzard_MajorFactions\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Merchant.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMerchant skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\t-- Main frames\n\tMerchantFrame:StripTextures(true)\n\tMerchantFrame:CreateBackdrop(\"Transparent\")\n\tMerchantFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tMerchantFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 0)\n\n\tMerchantFrameInset:StripTextures()\n\tMerchantMoneyBg:StripTextures()\n\tMerchantMoneyInset:StripTextures()\n\tMerchantExtraCurrencyBg:StripTextures()\n\tMerchantExtraCurrencyInset:StripTextures()\n\tMerchantFramePortrait:SetAlpha(0)\n\n\t-- Skin tabs\n\tfor i = 1, 2 do\n\t\tT.SkinTab(_G[\"MerchantFrameTab\"..i])\n\tend\n\n\t-- Icons/merchant slots\n\tfor i = 1, BUYBACK_ITEMS_PER_PAGE do\n\t\tlocal b = _G[\"MerchantItem\"..i..\"ItemButton\"]\n\t\tlocal t = _G[\"MerchantItem\"..i..\"ItemButtonIconTexture\"]\n\t\tlocal item_bar = _G[\"MerchantItem\"..i]\n\t\tlocal c = _G[\"MerchantItem\"..i..\"AltCurrencyFrameItem1\"]\n\n\t\titem_bar:StripTextures(true)\n\t\titem_bar:CreateBackdrop(\"Overlay\")\n\n\t\tb:StripTextures()\n\t\tb:StyleButton()\n\t\tb:SetTemplate(\"Default\")\n\t\tb:SetPoint(\"TOPLEFT\", item_bar, \"TOPLEFT\", 4, -4)\n\n\t\tb.IconBorder:SetAlpha(0)\n\n\t\tt:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tt:ClearAllPoints()\n\t\tt:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tt:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\thooksecurefunc(_G[\"MerchantItem\"..i..\"AltCurrencyFrame\"], \"SetPoint\", function(self, _, _, _, x)\n\t\t\tif x == -14 then\n\t\t\t\tc:SetPoint(\"LEFT\", self, \"LEFT\", 15, 0)\n\t\t\telseif x == 0 then\n\t\t\t\tc:SetPoint(\"LEFT\", self, \"LEFT\", 14, 5)\n\t\t\tend\n\t\tend)\n\n\t\tfor j = 1, 3 do\n\t\t\tlocal c = _G[\"MerchantItem\"..i..\"AltCurrencyFrameItem\"..j]\n\t\t\tlocal ct = _G[\"MerchantItem\"..i..\"AltCurrencyFrameItem\"..j..\"Texture\"]\n\t\t\tc:CreateBackdrop(\"Default\")\n\t\t\tc.backdrop:SetPoint(\"TOPLEFT\", ct, \"TOPLEFT\", -2, 2)\n\t\t\tc.backdrop:SetPoint(\"BOTTOMRIGHT\", ct, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tct:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tend\n\n\t\t_G[\"MerchantItem\"..i..\"MoneyFrame\"]:ClearAllPoints()\n\t\t_G[\"MerchantItem\"..i..\"MoneyFrame\"]:SetPoint(\"BOTTOMLEFT\", b, \"BOTTOMRIGHT\", 3, 0)\n\tend\n\n\t-- Buyback item frame + icon\n\tMerchantBuyBackItem:StripTextures(true)\n\tMerchantBuyBackItem:CreateBackdrop(\"Overlay\")\n\tMerchantBuyBackItem.backdrop:SetPoint(\"TOPLEFT\", -2, 6)\n\tMerchantBuyBackItem.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -5)\n\tMerchantBuyBackItemItemButton:SetPoint(\"TOPLEFT\", MerchantBuyBackItem, \"TOPLEFT\", 4, 0)\n\n\tMerchantBuyBackItemItemButton:StripTextures()\n\tMerchantBuyBackItemItemButton:StyleButton()\n\tMerchantBuyBackItemItemButton:SetTemplate(\"Default\")\n\tMerchantBuyBackItemItemButtonIconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tMerchantBuyBackItemItemButtonIconTexture:ClearAllPoints()\n\tMerchantBuyBackItemItemButtonIconTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tMerchantBuyBackItemItemButtonIconTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tMerchantBuyBackItemItemButton.IconBorder:SetAlpha(0)\n\n\tMerchantRepairItemButton:StyleButton()\n\tMerchantRepairItemButton:SetTemplate(\"Default\")\n\tMerchantRepairItemButton:GetRegions():SetTexCoord(0.04, 0.24, 0.06, 0.5)\n\tMerchantRepairItemButton:GetRegions():ClearAllPoints()\n\tMerchantRepairItemButton:GetRegions():SetPoint(\"TOPLEFT\", 2, -2)\n\tMerchantRepairItemButton:GetRegions():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tMerchantGuildBankRepairButton:StyleButton()\n\tMerchantGuildBankRepairButton:SetTemplate(\"Default\")\n\tMerchantGuildBankRepairButtonIcon:SetTexCoord(0.61, 0.82, 0.1, 0.52)\n\tMerchantGuildBankRepairButtonIcon:ClearAllPoints()\n\tMerchantGuildBankRepairButtonIcon:SetPoint(\"TOPLEFT\", 2, -2)\n\tMerchantGuildBankRepairButtonIcon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tMerchantRepairAllButton:StyleButton()\n\tMerchantRepairAllButton:SetTemplate(\"Default\")\n\tMerchantRepairAllIcon:SetTexCoord(0.34, 0.1, 0.34, 0.535, 0.535, 0.1, 0.535, 0.535)\n\tMerchantRepairAllIcon:ClearAllPoints()\n\tMerchantRepairAllIcon:SetPoint(\"TOPLEFT\", 2, -2)\n\tMerchantRepairAllIcon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t-- Misc frames\n\tT.SkinCloseButton(MerchantFrameCloseButton, MerchantFrame.backdrop)\n\tT.SkinNextPrevButton(MerchantNextPageButton)\n\tT.SkinNextPrevButton(MerchantPrevPageButton)\n\tT.SkinDropDownBox(MerchantFrameLootFilter)\n\n\t-- Reposition tabs\n\tMerchantFrameTab1:ClearAllPoints()\n\tMerchantFrameTab1:SetPoint(\"TOPLEFT\", MerchantFrame.backdrop, \"BOTTOMLEFT\", 0, 2)\n\n\thooksecurefunc(\"MerchantFrame_UpdateCurrencies\", function()\n\t\tfor i = 1, MAX_MERCHANT_CURRENCIES do\n\t\t\tlocal b = _G[\"MerchantToken\"..i]\n\n\t\t\tif b and not b.reskinned then\n\t\t\t\tlocal t = _G[\"MerchantToken\"..i].Icon\n\t\t\t\tlocal c = _G[\"MerchantToken\"..i].Count\n\t\t\t\tt:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tc:SetPoint(\"RIGHT\", t, \"LEFT\", -3, 0)\n\n\t\t\t\tb:CreateBackdrop(\"Default\")\n\t\t\t\tb.backdrop:SetPoint(\"TOPLEFT\", t, \"TOPLEFT\", -2, 2)\n\t\t\t\tb.backdrop:SetPoint(\"BOTTOMRIGHT\", t, \"BOTTOMRIGHT\", 2, -2)\n\n\t\t\t\tb.reskinned = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Options.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tOptions skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = SettingsPanel\n\tframe:StripTextures()\n\tframe:SetTemplate(\"Transparent\")\n\tframe.Bg:Hide()\n\n\tlocal tabs = {\n\t\tframe.GameTab,\n\t\tframe.AddOnsTab\n\t}\n\n\tfor i = 1, #tabs do\n\t\tlocal tab = tabs[i]\n\t\ttab:SkinButton(true)\n\t\ttab:SetHeight(25)\n\tend\n\n\tSettingsPanel.GameTab:SetPoint(\"TOPLEFT\", 17, -40)\n\n\tT.SkinCloseButton(frame.ClosePanelButton)\n\n\tT.SkinEditBox(frame.SearchBox, nil, 20)\n\tframe.ApplyButton:SkinButton()\n\tframe.CloseButton:SkinButton()\n\tframe.Container.SettingsList.Header.DefaultsButton:SkinButton()\n\n\tT.SkinScrollBar(SettingsPanel.Container.SettingsList.ScrollBar)\n\tSettingsPanel.Container.SettingsList.ScrollBar.Back:SetSize(17, 15)\n\tSettingsPanel.Container.SettingsList.ScrollBar.Track.Thumb:SetWidth(17)\n\tSettingsPanel.Container.SettingsList.ScrollBar.Forward:SetSize(17, 15)\n\n\tSettingsPanel.CategoryList:CreateBackdrop(\"Overlay\")\n\tSettingsPanel.Container.SettingsList:CreateBackdrop(\"Overlay\")\n\tSettingsPanel.Container.SettingsList.backdrop:SetPoint(\"BOTTOMRIGHT\", 6, -3)\n\n\thooksecurefunc(SettingsPanel.CategoryList.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not child.isSkinned then\n\t\t\t\tif child.Background then\n\t\t\t\t\tchild.Background:SetAlpha(0)\n\t\t\t\tend\n\n\t\t\t\tlocal toggle = child.Toggle\n\t\t\t\tif toggle then\n\t\t\t\t\ttoggle:GetPushedTexture():SetAlpha(0)\n\t\t\t\tend\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal function UpdateKeybindButtons(self)\n\t\tif not self.bindingsPool then return end\n\t\tfor panel in self.bindingsPool:EnumerateActive() do\n\t\t\tif not panel.isSkinned then\n\t\t\t\tpanel.Button1:SkinButton()\n\t\t\t\tpanel.Button2:SkinButton()\n\t\t\t\tpanel.Button2:SetPoint(\"LEFT\", panel.Button1, \"RIGHT\", 2, 0)\n\t\t\t\tif panel.CustomButton then\n\t\t\t\t\tpanel.CustomButton:SkinButton()\n\t\t\t\tend\n\t\t\t\tlocal selected = panel.Button1.SelectedHighlight\n\t\t\t\tselected:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tselected:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tselected:SetColorTexture(1, 0.82, 0, 0.3)\n\n\t\t\t\tselected = panel.Button2.SelectedHighlight\n\t\t\t\tselected:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tselected:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tselected:SetColorTexture(1, 0.82, 0, 0.3)\n\t\t\t\tpanel.isSkinned = true\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal function UpdateHeaderExpand(self, expanded)\n\t\tself.collapseTex:SetAtlas(expanded and \"Soulbinds_Collection_CategoryHeader_Collapse\" or \"Soulbinds_Collection_CategoryHeader_Expand\", true)\n\n\t\tUpdateKeybindButtons(self)\n\tend\n\n\thooksecurefunc(SettingsPanel.Container.SettingsList.ScrollBox, \"Update\", function(frame)\n\t\tfor _, child in next, { frame.ScrollTarget:GetChildren() } do\n\t\t\tif not child.isSkinned then\n\t\t\t\tif child.CheckBox then\n\t\t\t\t\tT.SkinCheckBoxAtlas(child.CheckBox)\n\t\t\t\tend\n\n\t\t\t\tif child.Button then\n\t\t\t\t\tif child.Button:GetWidth() < 250 then\n\t\t\t\t\t\tchild.Button:SkinButton()\n\t\t\t\t\telse\n\t\t\t\t\t\tchild.Button:StripTextures()\n\t\t\t\t\t\tchild.Button.Right:SetAlpha(0)\n\t\t\t\t\t\tchild.Button:CreateBackdrop(\"Overlay\")\n\t\t\t\t\t\tchild.Button.backdrop:SetPoint(\"TOPLEFT\", 2, -1)\n\t\t\t\t\t\tchild.Button.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 3)\n\t\t\t\t\t\tchild.Button.backdrop.overlay:SetVertexColor(0.08, 0.08, 0.08, 1)\n\n\t\t\t\t\t\tchild.Button.hl = child.Button:CreateTexture(nil, \"HIGHLIGHT\")\n\t\t\t\t\t\tchild.Button.hl:SetColorTexture(1, 1, 1, 0.3)\n\t\t\t\t\t\tchild.Button.hl:SetInside(child.Button.backdrop)\n\t\t\t\t\t\tchild.Button.hl:SetBlendMode(\"ADD\")\n\n\t\t\t\t\t\tchild.collapseTex = child.Button.backdrop:CreateTexture(nil, \"OVERLAY\")\n\t\t\t\t\t\tchild.collapseTex:SetPoint(\"RIGHT\", -10, 0)\n\n\t\t\t\t\t\tUpdateHeaderExpand(child, false)\n\t\t\t\t\t\thooksecurefunc(child, \"EvaluateVisibility\", UpdateHeaderExpand)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif child.ToggleTest then\n\t\t\t\t\tchild.ToggleTest:SkinButton()\n\t\t\t\t\tchild.VUMeter:StripTextures()\n\t\t\t\t\tchild.VUMeter.NineSlice:Hide()\n\t\t\t\t\tchild.VUMeter:CreateBackdrop(\"Overlay\")\n\t\t\t\t\tchild.VUMeter.backdrop:SetInside(4, 4)\n\t\t\t\t\tchild.VUMeter.Status:SetStatusBarTexture(C.media.texture)\n\t\t\t\tend\n\t\t\t\tif child.PushToTalkKeybindButton then\n\t\t\t\t\tchild.PushToTalkKeybindButton:SkinButton()\n\t\t\t\tend\n\t\t\t\tif child.SliderWithSteppers then\n\t\t\t\t\tT.SkinSliderStep(child.SliderWithSteppers)\n\t\t\t\tend\n\t\t\t\tif child.Button1 and child.Button2 then\n\t\t\t\t\tchild.Button1:SkinButton()\n\t\t\t\t\tchild.Button2:SkinButton()\n\t\t\t\tend\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/OrderHall.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tOrderHallUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tOrderHallCommandBar:StripTextures()\n\tOrderHallCommandBar:SetTemplate(\"Transparent\")\n\tOrderHallCommandBar:ClearAllPoints()\n\tOrderHallCommandBar:SetPoint(\"TOP\", UIParent, 0, -1)\n\tOrderHallCommandBar.ClassIcon:SetTexture(\"Interface\\\\TargetingFrame\\\\UI-Classes-Circles\")\n\tOrderHallCommandBar.ClassIcon:SetSize(46, 20)\n\tOrderHallCommandBar.CurrencyIcon:SetAtlas(\"legionmission-icon-currency\", false)\n\tOrderHallCommandBar.AreaName:ClearAllPoints()\n\tOrderHallCommandBar.AreaName:SetPoint(\"LEFT\", OrderHallCommandBar.CurrencyIcon, \"RIGHT\", 25, 0)\n\tOrderHallCommandBar.AreaName:SetVertexColor(unpack(C.media.classborder_color))\n\tOrderHallCommandBar.WorldMapButton:Kill()\n\tOrderHallTalentFramePortrait:SetAlpha(0)\n\n\thooksecurefunc(OrderHallCommandBar, \"RefreshCategories\", function(self)\n\t\tlocal index = 0\n\t\tC_Timer.After(0.5, function()\n\t\t\tfor _, child in ipairs({self:GetChildren()}) do\n\t\t\t\tif child.Icon and child.Count and child.TroopPortraitCover then\n\t\t\t\t\tindex = index + 1\n\t\t\t\t\tchild.TroopPortraitCover:Hide()\n\t\t\t\t\tchild.Icon:SetSize(38, 21)\n\t\t\t\tend\n\t\t\tend\n\t\t\tself:SetWidth(270 + index * 112)\n\t\tend)\n\tend)\n\n\t-- TalentFrame skin from ElvUI\n\tlocal function colorBorder(child, backdrop, atlas)\n\t\tif child.AlphaIconOverlay:IsShown() then -- isBeingResearched or (talentAvailability and not selected)\n\t\t\tlocal alpha = child.AlphaIconOverlay:GetAlpha()\n\t\t\tif alpha <= 0.5 then -- talentAvailability\n\t\t\t\tbackdrop:SetBackdropBorderColor(0.5, 0.5, 0.5) -- [border = grey, shadow x2]\n\t\t\t\tchild.darkOverlay:SetColorTexture(0, 0, 0, 0.50)\n\t\t\t\tchild.darkOverlay:Show()\n\t\t\telseif alpha <= 0.7 then -- isBeingResearched\n\t\t\t\tbackdrop:SetBackdropBorderColor(0, 1, 1) -- [border = teal, shadow x1]\n\t\t\t\tchild.darkOverlay:SetColorTexture(0, 0, 0, 0.25)\n\t\t\t\tchild.darkOverlay:Show()\n\t\t\tend\n\t\telseif atlas:find(\"green\") then\n\t\t\tbackdrop:SetBackdropBorderColor(0, 1, 0) -- [border = green, no shadow]\n\t\t\tchild.darkOverlay:Hide()\n\t\telseif atlas:find(\"yellow\") then\n\t\t\tbackdrop:SetBackdropBorderColor(unpack(C.media.border_color)) -- [border = yellow, no shadow]\n\t\t\tchild.darkOverlay:Hide()\n\t\telse\n\t\t\tbackdrop:SetBackdropBorderColor(0.2, 0.2, 0.2) -- [border = dark grey, shadow x3]\n\t\t\tchild.darkOverlay:SetColorTexture(0, 0, 0, 0.75)\n\t\t\tchild.darkOverlay:Show()\n\t\tend\n\tend\n\n\tOrderHallTalentFrame:StripTextures()\n\tOrderHallTalentFrame:SetTemplate(\"Transparent\")\n\tOrderHallTalentFrame.NineSlice:Hide()\n\tOrderHallTalentFrame.OverlayElements:Hide()\n\tT.SkinCloseButton(OrderHallTalentFrameCloseButton)\n\n\thooksecurefunc(OrderHallTalentFrame, \"SetUseThemedTextures\", function(self)\n\t\tself.Background:ClearAllPoints()\n\t\tself.Background:SetPoint(\"TOPLEFT\")\n\t\tself.Background:SetPoint(\"BOTTOMRIGHT\")\n\t\tself.Background:SetDrawLayer(\"BACKGROUND\", 2)\n\tend)\n\n\tOrderHallTalentFrame:HookScript(\"OnShow\", function(self)\n\t\tif self.CloseButton.Border then\n\t\t\tself.CloseButton.Border:SetAlpha(0)\n\t\tend\n\t\tif self.portrait then\n\t\t\tself.portrait:SetAlpha(0)\n\t\tend\n\t\tif self.skinned then return end\n\t\tself.Currency.Icon:SkinIcon()\n\t\tself.BackButton:SkinButton()\n\n\t\tfor i = 1, self:GetNumChildren() do\n\t\t\tlocal child = select(i, self:GetChildren())\n\t\t\tif child and child.Icon and child.DoneGlow and not child.backdrop then\n\t\t\t\tchild:StyleButton()\n\t\t\t\tchild:CreateBackdrop()\n\t\t\t\tchild.Border:SetAlpha(0)\n\t\t\t\tchild.Highlight:SetAlpha(0)\n\t\t\t\tchild.AlphaIconOverlay:SetTexture(nil)\n\t\t\t\tchild.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tchild.Icon:SetInside(child.backdrop)\n\t\t\t\tchild.hover:SetInside(child.backdrop)\n\t\t\t\tchild.pushed:SetInside(child.backdrop)\n\t\t\t\tchild.backdrop:SetFrameLevel(child.backdrop:GetFrameLevel() + 1)\n\n\t\t\t\tchild.darkOverlay = child:CreateTexture()\n\t\t\t\tchild.darkOverlay:SetAllPoints(child.Icon)\n\t\t\t\tchild.darkOverlay:SetDrawLayer('OVERLAY')\n\t\t\t\tchild.darkOverlay:Hide()\n\n\t\t\t\tcolorBorder(child, child.backdrop, child.Border:GetAtlas())\n\n\t\t\t\tchild.TalentDoneAnim:HookScript(\"OnFinished\", function()\n\t\t\t\t\tchild.Border:SetAlpha(0) -- clear the yellow glow border again, after it finishes the animation\n\t\t\t\tend)\n\t\t\tend\n\t\tend\n\n\t\tself.choiceTexturePool:ReleaseAll()\n\t\thooksecurefunc(self, \"RefreshAllData\", function(frame)\n\t\t\tframe.choiceTexturePool:ReleaseAll()\n\t\t\tfor i = 1, frame:GetNumChildren() do\n\t\t\t\tlocal child = select(i, frame:GetChildren())\n\t\t\t\tif child and child.Icon and child.Border and child.backdrop then\n\t\t\t\t\tcolorBorder(child, child.backdrop, child.Border:GetAtlas())\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\n\t\tself.skinned = true\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_OrderHallUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Others.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tReskin Blizzard windows(by Tukz and Co)\n----------------------------------------------------------------------------------------\nlocal SkinBlizzUI = CreateFrame(\"Frame\")\nSkinBlizzUI:RegisterEvent(\"ADDON_LOADED\")\nSkinBlizzUI:SetScript(\"OnEvent\", function(_, _, addon)\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") then return end\n\n\t-- Stuff not in Blizzard load-on-demand\n\tif addon == \"ShestakUI\" then\n\t\t-- Skin checkButtons\n\t\tlocal checkButtons = {\n\t\t\t\"LFDRoleCheckPopupRoleButtonTank\",\n\t\t\t\"LFDRoleCheckPopupRoleButtonDPS\",\n\t\t\t\"LFDRoleCheckPopupRoleButtonHealer\"\n\t\t}\n\n\t\tfor _, object in pairs(checkButtons) do\n\t\t\tT.SkinCheckBox(_G[object].checkButton)\n\t\tend\n\n\t\t-- Blizzard Frame reskin\n\t\tlocal bgskins = {\n\t\t\t\"GameMenuFrame\",\n\t\t\t\"BNToastFrame\",\n\t\t\t\"TicketStatusFrameButton\",\n\t\t\t\"ReadyCheckFrame\",\n\t\t\t\"ColorPickerFrame\",\n\t\t\t\"LFDRoleCheckPopup\",\n\t\t\t\"LFDReadyCheckPopup\",\n\t\t\t\"GuildInviteFrame\",\n\t\t\t\"RolePollPopup\",\n\t\t\t\"BaudErrorFrame\",\n\t\t\t\"OpacityFrame\",\n\t\t\t\"GeneralDockManagerOverflowButtonList\",\n\t\t\t\"QueueStatusFrame\",\n\t\t\t\"BasicScriptErrors\"\n\t\t}\n\n\t\tQueueStatusFrame:StripTextures()\n\t\tGameMenuFrame:StripTextures()\n\t\tLFDRoleCheckPopup:StripTextures()\n\t\tRolePollPopup:StripTextures()\n\t\tOpacityFrame:StripTextures()\n\t\tColorPickerFrame.Border:Hide()\n\t\tAutoCompleteBox.NineSlice:SetTemplate(\"Transparent\")\n\n\t\tfor i = 1, getn(bgskins) do\n\t\t\tlocal frame = _G[bgskins[i]]\n\t\t\tif frame then\n\t\t\t\tframe:SetTemplate(\"Transparent\")\n\t\t\tend\n\t\tend\n\n\t\tlocal insetskins = {\n\t\t\t\"BaudErrorFrameListScrollBox\",\n\t\t\t\"BaudErrorFrameDetailScrollBox\"\n\t\t}\n\n\t\tfor i = 1, getn(insetskins) do\n\t\t\tlocal frame = _G[insetskins[i]]\n\t\t\tif frame then\n\t\t\t\tframe:SetTemplate(\"Overlay\")\n\t\t\tend\n\t\tend\n\n\t\t-- Reskin popups\n\t\tfor i = 1, 4 do\n\t\t\tfor j = 1, 4 do\n\t\t\t\t_G[\"StaticPopup\"..i..\"Button\"..j]:SkinButton()\n\t\t\tend\n\t\t\t_G[\"StaticPopup\"..i]:StripTextures()\n\t\t\t_G[\"StaticPopup\"..i].Border:StripTextures()\n\t\t\t_G[\"StaticPopup\"..i]:CreateBackdrop(\"Transparent\")\n\t\t\t_G[\"StaticPopup\"..i].backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t_G[\"StaticPopup\"..i].backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\tT.SkinEditBox(_G[\"StaticPopup\"..i..\"EditBox\"])\n\t\t\tT.SkinEditBox(_G[\"StaticPopup\"..i..\"MoneyInputFrameGold\"])\n\t\t\tT.SkinEditBox(_G[\"StaticPopup\"..i..\"MoneyInputFrameSilver\"])\n\t\t\tT.SkinEditBox(_G[\"StaticPopup\"..i..\"MoneyInputFrameCopper\"])\n\t\t\t_G[\"StaticPopup\"..i..\"EditBox\"].backdrop:SetPoint(\"TOPLEFT\", -3, -6)\n\t\t\t_G[\"StaticPopup\"..i..\"EditBox\"].backdrop:SetPoint(\"BOTTOMRIGHT\", -3, 6)\n\t\t\t_G[\"StaticPopup\"..i..\"MoneyInputFrameGold\"].backdrop:SetPoint(\"TOPLEFT\", -3, 0)\n\t\t\t_G[\"StaticPopup\"..i..\"MoneyInputFrameSilver\"].backdrop:SetPoint(\"TOPLEFT\", -3, 0)\n\t\t\t_G[\"StaticPopup\"..i..\"MoneyInputFrameCopper\"].backdrop:SetPoint(\"TOPLEFT\", -3, 0)\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrameNameFrame\"]:Kill()\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrame\"]:GetNormalTexture():Kill()\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrame\"]:SetTemplate(\"Default\")\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrame\"]:StyleButton()\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrame\"].IconBorder:SetAlpha(0)\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrameIconTexture\"]:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrameIconTexture\"]:ClearAllPoints()\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrameIconTexture\"]:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t_G[\"StaticPopup\"..i..\"ItemFrameIconTexture\"]:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t_G[\"StaticPopup\"..i..\"CloseButton\"]:SetNormalTexture(0)\n\t\t\t_G[\"StaticPopup\"..i..\"CloseButton\"].SetNormalTexture = T.dummy\n\t\t\t_G[\"StaticPopup\"..i..\"CloseButton\"]:SetPushedTexture(0)\n\t\t\t_G[\"StaticPopup\"..i..\"CloseButton\"].SetPushedTexture = T.dummy\n\t\t\tT.SkinCloseButton(_G[\"StaticPopup\"..i..\"CloseButton\"])\n\t\tend\n\t\t_G[\"StaticPopup1ExtraButton\"]:SkinButton()\n\n\t\tT.SkinCloseButton(_G[\"RolePollPopupCloseButton\"])\n\n\t\t-- Cinematic popup\n\t\t_G[\"CinematicFrameCloseDialog\"]:SetScale(C.general.uiscale)\n\t\t_G[\"CinematicFrameCloseDialog\"]:StripTextures()\n\t\t_G[\"CinematicFrameCloseDialog\"]:SetTemplate(\"Transparent\")\n\t\t_G[\"CinematicFrameCloseDialogConfirmButton\"]:SkinButton()\n\t\t_G[\"CinematicFrameCloseDialogResumeButton\"]:SkinButton()\n\t\t_G[\"CinematicFrameCloseDialogResumeButton\"]:SetPoint(\"LEFT\", _G[\"CinematicFrameCloseDialogConfirmButton\"], \"RIGHT\", 15, 0)\n\n\t\t-- Movie popup /run MovieFrame_PlayMovie(MovieFrame, 18)\n\t\tMovieFrame.CloseDialog:SetScale(C.general.uiscale)\n\t\tMovieFrame.CloseDialog:StripTextures()\n\t\tMovieFrame.CloseDialog:SetTemplate(\"Transparent\")\n\t\tMovieFrame.CloseDialog.ConfirmButton:SkinButton()\n\t\tMovieFrame.CloseDialog.ResumeButton:SkinButton()\n\t\tMovieFrame.CloseDialog.ResumeButton:SetPoint(\"LEFT\", MovieFrame.CloseDialog.ConfirmButton, \"RIGHT\", 15, 0)\n\n\t\t-- PetBattle popup\n\t\t_G[\"PetBattleQueueReadyFrame\"]:SetTemplate(\"Transparent\")\n\t\t_G[\"PetBattleQueueReadyFrame\"].AcceptButton:SkinButton()\n\t\t_G[\"PetBattleQueueReadyFrame\"].DeclineButton:SkinButton()\n\n\t\t-- Reskin Dropdown menu\n\t\tlocal dropdowns = {\"DropDownList\", \"L_DropDownList\", \"Lib_DropDownList\"}\n\t\thooksecurefunc(\"UIDropDownMenu_InitializeHelper\", function()\n\t\t\tfor _, name in next, dropdowns do\n\t\t\t\tfor i = 1, UIDROPDOWNMENU_MAXLEVELS do\n\t\t\t\t\tlocal backdrop = _G[name..i..\"Backdrop\"]\n\t\t\t\t\tif backdrop then\n\t\t\t\t\t\tbackdrop:SetTemplate(\"Transparent\")\n\t\t\t\t\t\tlocal menu = _G[name..i..\"MenuBackdrop\"].NineSlice or _G[name..i..\"MenuBackdrop\"]\n\t\t\t\t\t\tif menu then\n\t\t\t\t\t\t\tmenu:SetTemplate(\"Transparent\")\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif backdrop.Bg then\n\t\t\t\t\t\t\tbackdrop.Bg:SetAlpha(0)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\n\t\thooksecurefunc(\"ToggleDropDownMenu\", function(level)\n\t\t\tif not level then\n\t\t\t\tlevel = 1\n\t\t\tend\n\n\t\t\tfor i = 1, _G.UIDROPDOWNMENU_MAXBUTTONS do\n\t\t\t\tlocal button = _G[\"DropDownList\"..level..\"Button\"..i]\n\t\t\t\tlocal check = _G[\"DropDownList\"..level..\"Button\"..i..\"Check\"]\n\t\t\t\tlocal uncheck = _G[\"DropDownList\"..level..\"Button\"..i..\"UnCheck\"]\n\n\t\t\t\tif not button.backdrop then\n\t\t\t\t\tbutton:CreateBackdrop(\"Transparent\")\n\t\t\t\t\tbutton.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], 0.3)\n\t\t\t\tend\n\n\t\t\t\tbutton.backdrop:Hide()\n\n\t\t\t\tlocal texture = check:GetTexture()\n\t\t\t\tif not button.notCheckable and texture == 375502 then\n\t\t\t\t\tuncheck:SetTexture()\n\t\t\t\t\tlocal _, co = check:GetTexCoord()\n\t\t\t\t\tif co == 0 then\n\t\t\t\t\t\tcheck:SetTexture([[Interface\\Buttons\\UI-CheckBox-Check]])\n\t\t\t\t\t\tcheck:SetVertexColor(1, 0.9, 0, 1)\n\t\t\t\t\t\tcheck:SetSize(18, 18)\n\t\t\t\t\t\tcheck:SetDesaturated(true)\n\t\t\t\t\t\tbutton.backdrop:SetInside(check, 4, 4)\n\t\t\t\t\telse\n\t\t\t\t\t\tcheck:SetTexture(C.media.blank)\n\t\t\t\t\t\tcheck:SetVertexColor(1, 0.82, 0, 0.8)\n\t\t\t\t\t\tcheck:SetSize(6, 6)\n\t\t\t\t\t\tcheck:SetDesaturated(false)\n\t\t\t\t\t\tbutton.backdrop:SetOutside(check)\n\t\t\t\t\tend\n\n\t\t\t\t\tbutton.backdrop:Show()\n\t\t\t\t\tcheck:SetTexCoord(0, 1, 0, 1)\n\t\t\t\telse\n\t\t\t\t\tcheck:SetSize(16, 16)\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\n\t\tif RaiderIO_CustomDropDownListMenuBackdrop then\n\t\t\tRaiderIO_CustomDropDownListMenuBackdrop:StripTextures()\n\t\tend\n\n\t\t-- Reskin menu\n\t\tlocal ChatMenus = {\n\t\t\t\"ChatMenu\",\n\t\t\t\"EmoteMenu\",\n\t\t\t\"LanguageMenu\",\n\t\t\t\"VoiceMacroMenu\"\n\t\t}\n\n\t\tfor i = 1, getn(ChatMenus) do\n\t\t\tif _G[ChatMenus[i]] == _G[\"ChatMenu\"] then\n\t\t\t\t_G[ChatMenus[i]]:HookScript(\"OnShow\", function(self)\n\t\t\t\t\tself:SetTemplate(\"Transparent\")\n\t\t\t\t\tself:ClearAllPoints()\n\t\t\t\t\tself:SetPoint(\"BOTTOMRIGHT\", ChatFrame1, \"BOTTOMRIGHT\", 0, 30)\n\t\t\t\tend)\n\t\t\telse\n\t\t\t\t_G[ChatMenus[i]]:HookScript(\"OnShow\", function(self)\n\t\t\t\t\tself:SetTemplate(\"Transparent\")\n\t\t\t\tend)\n\t\t\tend\n\t\tend\n\n\t\t-- Hide header textures and move text/buttons\n\t\tlocal BlizzardHeader = {\n\t\t\tGameMenuFrame,\n\t\t\tColorPickerFrame\n\t\t}\n\n\t\tfor _, frame in pairs(BlizzardHeader) do\n\t\t\tlocal title = frame.Header\n\t\t\tif title then\n\t\t\t\ttitle:StripTextures()\n\t\t\t\ttitle:ClearAllPoints()\n\t\t\t\ttitle:SetPoint(\"TOP\", frame, 0, 7)\n\t\t\tend\n\t\tend\n\n\t\t-- Reskin buttons\n\t\tlocal BlizzardButtons = {\n\t\t\t\"GameMenuButtonOptions\",\n\t\t\t\"GameMenuButtonHelp\",\n\t\t\t\"GameMenuButtonStore\",\n\t\t\t\"GameMenuButtonSettings\",\n\t\t\t\"GameMenuButtonEditMode\",\n\t\t\t\"GameMenuButtonKeybindings\",\n\t\t\t\"GameMenuButtonMacros\",\n\t\t\t\"GameMenuButtonRatings\",\n\t\t\t\"GameMenuButtonAddOns\",\n\t\t\t\"GameMenuButtonAddons\",\n\t\t\t\"GameMenuButtonLogout\",\n\t\t\t\"GameMenuButtonQuit\",\n\t\t\t\"GameMenuButtonContinue\",\n\t\t\t\"GameMenuButtonMacOptions\",\n\t\t\t\"GameMenuButtonOptionHouse\",\n\t\t\t\"GameMenuButtonSettingsUI\",\n\t\t\t\"GameMenuButtonWhatsNew\",\n\t\t\t\"ReadyCheckFrameYesButton\",\n\t\t\t\"ReadyCheckFrameNoButton\",\n\t\t\t\"ColorPickerOkayButton\",\n\t\t\t\"ColorPickerCancelButton\",\n\t\t\t\"BaudErrorFrameClearButton\",\n\t\t\t\"BaudErrorFrameCloseButton\",\n\t\t\t\"GuildInviteFrameJoinButton\",\n\t\t\t\"GuildInviteFrameDeclineButton\",\n\t\t\t\"RolePollPopupAcceptButton\",\n\t\t\t\"LFDRoleCheckPopupDeclineButton\",\n\t\t\t\"LFDRoleCheckPopupAcceptButton\",\n\t\t\t\"LFDReadyCheckPopupAcceptButton\",\n\t\t\t\"RaidUtilityConvertButton\",\n\t\t\t\"RaidUtilityMainTankButton\",\n\t\t\t\"RaidUtilityMainAssistButton\",\n\t\t\t\"RaidUtilityRoleButton\",\n\t\t\t\"RaidUtilityReadyCheckButton\",\n\t\t\t\"RaidUtilityShowButton\",\n\t\t\t\"RaidUtilityCloseButton\",\n\t\t\t\"RaidUtilityDisbandButton\",\n\t\t\t\"RaidUtilityRaidControlButton\",\n\t\t\t\"BasicScriptErrorsButton\"\n\t\t}\n\n\t\tif C.misc.raid_tools == true then\n\t\t\ttinsert(BlizzardButtons, \"CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton\")\n\t\tend\n\n\t\tfor i = 1, getn(BlizzardButtons) do\n\t\t\tlocal buttons = _G[BlizzardButtons[i]]\n\t\t\tif buttons then\n\t\t\t\tbuttons:SkinButton()\n\t\t\tend\n\t\tend\n\t\tLFDReadyCheckPopup.YesButton:SkinButton(true)\n\t\tLFDReadyCheckPopup.NoButton:SkinButton(true)\n\n\t\t-- Reskin scrollbars\n\t\tlocal scrollbars = {\n\t\t\t\"BaudErrorFrameListScrollBoxScrollBarScrollBar\",\n\t\t\t\"BaudErrorFrameDetailScrollFrameScrollBar\"\n\t\t}\n\n\t\tfor _, scrollbar in pairs(scrollbars) do\n\t\t\tlocal bars = _G[scrollbar]\n\t\t\tif bars then\n\t\t\t\tT.SkinScrollBar(bars)\n\t\t\tend\n\t\tend\n\n\t\t-- Button position or text\n\t\t_G[\"ColorPickerOkayButton\"]:ClearAllPoints()\n\t\t_G[\"ColorPickerOkayButton\"]:SetPoint(\"BOTTOMLEFT\", _G[\"ColorPickerFrame\"], \"BOTTOMLEFT\", 6, 6)\n\t\t_G[\"ColorPickerCancelButton\"]:ClearAllPoints()\n\t\t_G[\"ColorPickerCancelButton\"]:SetPoint(\"BOTTOMRIGHT\", _G[\"ColorPickerFrame\"], \"BOTTOMRIGHT\", -6, 6)\n\t\t_G[\"ReadyCheckFrameYesButton\"]:SetParent(_G[\"ReadyCheckFrame\"])\n\t\t_G[\"ReadyCheckFrameYesButton\"]:ClearAllPoints()\n\t\t_G[\"ReadyCheckFrameNoButton\"]:SetParent(_G[\"ReadyCheckFrame\"])\n\t\t_G[\"ReadyCheckFrameNoButton\"]:ClearAllPoints()\n\t\t_G[\"ReadyCheckFrameYesButton\"]:SetPoint(\"RIGHT\", _G[\"ReadyCheckFrame\"], \"CENTER\", 0, -22)\n\t\t_G[\"ReadyCheckFrameNoButton\"]:SetPoint(\"LEFT\", _G[\"ReadyCheckFrameYesButton\"], \"RIGHT\", 6, 0)\n\t\t_G[\"ReadyCheckFrameText\"]:SetParent(_G[\"ReadyCheckFrame\"])\n\t\t_G[\"ReadyCheckFrameText\"]:ClearAllPoints()\n\t\t_G[\"ReadyCheckFrameText\"]:SetPoint(\"TOP\", 0, -12)\n\n\t\t-- Others\n\t\tfor i = 1, 10 do\n\t\t\tselect(i, GuildInviteFrame:GetRegions()):Hide()\n\t\tend\n\t\t_G[\"GeneralDockManagerOverflowButtonList\"]:SetFrameStrata(\"HIGH\")\n\t\t_G[\"ReadyCheckListenerFrame\"]:SetAlpha(0)\n\t\t_G[\"ReadyCheckFrame\"]:HookScript(\"OnShow\", function(self) if UnitIsUnit(\"player\", self.initiator) then self:Hide() end end)\n\n\t\t-- StackSplit\n\t\tStackSplitFrame:SetFrameStrata(\"TOOLTIP\")\n\t\tStackSplitFrame:StripTextures()\n\t\tStackSplitFrame:CreateBackdrop(\"Transparent\")\n\t\tStackSplitFrame.backdrop:SetPoint(\"TOPLEFT\", 5, -5)\n\t\tStackSplitFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", -5, 10)\n\t\tStackSplitFrame.OkayButton:SkinButton()\n\t\tStackSplitFrame.CancelButton:SkinButton()\n\n\t\tif C.skins.blizzard_frames == true then\n\t\t\t-- Social Browser frame\n\t\t\tSocialBrowserFrame:StripTextures()\n\t\t\tSocialBrowserFrame:SetTemplate(\"Transparent\")\n\t\t\tT.SkinCloseButton(SocialBrowserFrame.CloseButton)\n\t\t\tSocialBrowserFrame.CloseButton:SetSize(16, 16)\n\n\t\t\t-- What's new frame\n\t\t\tSplashFrame:CreateBackdrop(\"Transparent\")\n\t\t\tSplashFrame.BottomCloseButton:SkinButton()\n\t\t\tT.SkinCloseButton(SplashFrame.TopCloseButton)\n\n\t\t\t-- NavBar Buttons (Used in EncounterJournal and HelpFrame)\n\t\t\tlocal function SkinNavBarButtons(self)\n\t\t\t\tif self:GetParent():GetName() == \"WorldMapFrame\" then return end\n\t\t\t\tlocal navButton = self.navList[#self.navList]\n\t\t\t\tif navButton and not navButton.isSkinned then\n\t\t\t\t\tnavButton:SkinButton(true)\n\t\t\t\t\tif navButton.MenuArrowButton then\n\t\t\t\t\t\tnavButton.MenuArrowButton:SetNormalTexture(0)\n\t\t\t\t\t\tnavButton.MenuArrowButton:SetPushedTexture(0)\n\t\t\t\t\t\tnavButton.MenuArrowButton:SetHighlightTexture(0)\n\t\t\t\t\tend\n\t\t\t\t\tnavButton.xoffset = 1\n\t\t\t\t\tnavButton.isSkinned = true\n\t\t\t\tend\n\t\t\tend\n\t\t\thooksecurefunc(\"NavBar_AddButton\", SkinNavBarButtons)\n\n\t\t\tlocal function SetHomeButtonOffsetX(self)\n\t\t\t\tif self:GetParent():GetName() == \"WorldMapFrame\" then return end\n\t\t\t\tif self.homeButton then\n\t\t\t\t\tself.homeButton.xoffset = 1\n\t\t\t\tend\n\t\t\tend\n\t\t\thooksecurefunc(\"NavBar_Initialize\", SetHomeButtonOffsetX)\n\n\t\t\tif T.client == \"ruRU\" then\n\t\t\t\t_G[\"DeclensionFrame\"]:SetTemplate(\"Transparent\")\n\t\t\t\t_G[\"DeclensionFrameCancelButton\"]:SkinButton()\n\t\t\t\t_G[\"DeclensionFrameOkayButton\"]:SkinButton()\n\t\t\t\tT.SkinNextPrevButton(_G[\"DeclensionFrameSetNext\"])\n\t\t\t\tT.SkinNextPrevButton(_G[\"DeclensionFrameSetPrev\"])\n\t\t\t\tfor i = 1, 5 do\n\t\t\t\t\t_G[\"DeclensionFrameDeclension\"..i..\"Edit\"]:StripTextures(true)\n\t\t\t\t\t_G[\"DeclensionFrameDeclension\"..i..\"Edit\"]:SetTemplate(\"Overlay\")\n\t\t\t\t\t_G[\"DeclensionFrameDeclension\"..i..\"Edit\"]:SetTextInsets(3, 0, 0, 0)\n\t\t\t\tend\n\t\t\tend\n\t\t\tif C.skins.clique ~= true and IsAddOnLoaded(\"Clique\") then\n\t\t\t\tCliqueSpellTab:GetRegions():SetSize(0.1, 0.1)\n\t\t\t\tCliqueSpellTab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tCliqueSpellTab:GetNormalTexture():ClearAllPoints()\n\t\t\t\tCliqueSpellTab:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tCliqueSpellTab:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\tCliqueSpellTab:CreateBackdrop(\"Default\")\n\t\t\t\tCliqueSpellTab.backdrop:SetAllPoints()\n\t\t\t\tCliqueSpellTab:StyleButton()\n\t\t\tend\n\n\t\t\tlocal function SkinIconArray(baseName, numIcons)\n\t\t\t\tfor i = 1, numIcons do\n\t\t\t\t\tlocal button = _G[baseName..i]\n\t\t\t\t\tlocal texture = _G[baseName..i..\"Icon\"]\n\n\t\t\t\t\tbutton:StripTextures()\n\t\t\t\t\tbutton:StyleButton(true)\n\t\t\t\t\tbutton:SetTemplate(\"Default\")\n\n\t\t\t\t\ttexture:ClearAllPoints()\n\t\t\t\t\ttexture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\t\ttexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\t\ttexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- This is used to create icons for the GuildBankPopupFrame, MacroPopupFrame, and GearManagerDialogPopup\n\t\t\thooksecurefunc(\"BuildIconArray\", function(_, baseName, _, rowSize, numRows)\n\t\t\t\tlocal numIcons = rowSize * numRows\n\t\t\t\tSkinIconArray(baseName, numIcons)\n\t\t\tend)\n\n\t\t\thooksecurefunc(HelpTipTemplateMixin, \"ApplyText\", function(self)\n\t\t\t\tT.SkinHelpBox(self)\n\t\t\tend)\n\t\tend\n\tend\n\n\tif addon == \"Blizzard_GuildUI\" and T.client == \"ruRU\" then\n\t\t_G[\"GuildFrameTab1\"]:ClearAllPoints()\n\t\t_G[\"GuildFrameTab1\"]:SetPoint(\"TOPLEFT\", _G[\"GuildFrame\"], \"BOTTOMLEFT\", -4, 2)\n\tend\nend)\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/PartyPoseUI.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPartyPoseUI skin\n----------------------------------------------------------------------------------------\nlocal function SkinPartyPoseFrame(frame)\n\tframe:StripTextures()\n\tframe:CreateBackdrop(\"Transparent\")\n\tframe.backdrop:SetPoint(\"TOPLEFT\", -2, UnitFactionGroup(\"player\") == \"Horde\" and 11 or 15)\n\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -3)\n\tframe.Border:Hide()\n\n\tframe.ModelScene:StripTextures()\n\tframe.ModelScene:CreateBackdrop(\"Transparent\")\n\n\tlocal rewardFrame = frame.RewardAnimations.RewardFrame\n\trewardFrame.NameFrame:SetAlpha(0)\n\trewardFrame.IconBorder:SetAlpha(0)\n\trewardFrame.Icon:SetPoint(\"TOPLEFT\", -15, -2)\n\trewardFrame.Icon:SkinIcon()\n\n\tframe.LeaveButton:SkinButton()\nend\n\nlocal function LoadSkin()\n\tSkinPartyPoseFrame(IslandsPartyPoseFrame)\nend\n\nT.SkinFuncs[\"Blizzard_IslandsPartyPoseUI\"] = LoadSkin\n\nlocal function LoadSecondarySkin()\n\tSkinPartyPoseFrame(WarfrontsPartyPoseFrame)\nend\n\nT.SkinFuncs[\"Blizzard_WarfrontsPartyPoseUI\"] = LoadSecondarySkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/PetStable.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPetStable skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = PetStableFrame\n\tT.SkinFrame(frame)\n\n\tPetStableFrameInset:SetTemplate(\"Overlay\")\n\n\tT.SkinRotateButton(PetStableModelRotateLeftButton)\n\tT.SkinRotateButton(PetStableModelRotateRightButton)\n\tPetStableModelRotateRightButton:ClearAllPoints()\n\tPetStableModelRotateRightButton:SetPoint(\"LEFT\", PetStableModelRotateLeftButton, \"RIGHT\", 3, 0)\n\n\tT.SkinNextPrevButton(PetStablePrevPageButton, nil, \"Any\")\n\tT.SkinNextPrevButton(PetStableNextPageButton, nil, \"Any\")\n\n\tfor i = 1, NUM_PET_ACTIVE_SLOTS do\n\t\tlocal button = _G[\"PetStableActivePet\"..i]\n\t\tlocal icon = _G[\"PetStableActivePet\"..i..\"IconTexture\"]\n\n\t\tbutton:StripTextures()\n\t\tbutton:StyleButton()\n\t\tbutton:SetTemplate(\"Default\")\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tfor i = 1, NUM_PET_STABLE_SLOTS do\n\t\tlocal button = _G[\"PetStableStabledPet\"..i]\n\t\tlocal icon = _G[\"PetStableStabledPet\"..i..\"IconTexture\"]\n\n\t\tbutton:StripTextures()\n\t\tbutton:StyleButton()\n\t\tbutton:SetTemplate(\"Default\")\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tPetStableSelectedPetIcon:SkinIcon()\n\n\tPetStableDiet:StripTextures()\n\tPetStableDiet:SetSize(20, 20)\n\tPetStableDiet:SetPoint(\"TOPRIGHT\", -9, -2)\n\n\tPetStableDietTexture:SetTexture(\"Interface\\\\Icons\\\\ability_hunter_beasttraining\")\n\tPetStableDietTexture:SkinIcon()\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Petition.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPetition skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tPetitionFrame:StripTextures(true)\n\tPetitionFrameInset:StripTextures()\n\tPetitionFrame:CreateBackdrop(\"Transparent\")\n\tPetitionFrame.backdrop:SetAllPoints()\n\tPetitionFramePortrait:SetAlpha(0)\n\n\tPetitionFrameSignButton:SkinButton()\n\tPetitionFrameRequestButton:SkinButton()\n\tPetitionFrameRenameButton:SkinButton()\n\tPetitionFrameCancelButton:SkinButton()\n\tT.SkinCloseButton(PetitionFrameCloseButton, PetitionFrame.backdrop)\n\n\tPetitionFrameCharterTitle:SetTextColor(1, 0.8, 0)\n\tPetitionFrameCharterTitle:SetShadowColor(0, 0, 0)\n\tPetitionFrameCharterName:SetTextColor(1, 1, 1)\n\tPetitionFrameMasterTitle:SetTextColor(1, 0.8, 0)\n\tPetitionFrameMasterTitle:SetShadowColor(0, 0, 0)\n\tPetitionFrameMasterName:SetTextColor(1, 1, 1)\n\tPetitionFrameMemberTitle:SetTextColor(1, 0.8, 0)\n\tPetitionFrameMemberTitle:SetShadowColor(0, 0, 0)\n\n\tfor i = 1, 9 do\n\t\t_G[\"PetitionFrameMemberName\"..i]:SetTextColor(1, 1, 1)\n\tend\n\n\tPetitionFrameInstructions:SetTextColor(1, 1, 1)\n\n\tPetitionFrameRenameButton:SetPoint(\"LEFT\", PetitionFrameRequestButton, \"RIGHT\", 3, 0)\n\tPetitionFrameRenameButton:SetPoint(\"RIGHT\", PetitionFrameCancelButton, \"LEFT\", -3, 0)\n\tPetitionFrameCancelButton:SetPoint(\"BOTTOMRIGHT\", PetitionFrame, \"BOTTOMRIGHT\", -5, 4)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/PlayerChoice.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPlayer Choice skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = _G.PlayerChoiceFrame\n\n\thooksecurefunc(frame, \"SetupOptions\", function(self)\n\t\tif not frame.IsSkinned then\n\t\t\tframe.BlackBackground:SetAlpha(0)\n\t\t\tframe.Background:SetAlpha(0)\n\t\t\tframe.NineSlice:SetAlpha(0)\n\t\t\tframe.Header.Texture:SetAlpha(0)\n\n\t\t\tframe:CreateBackdrop(\"Transparent\")\n\n\t\t\tframe.Title:DisableDrawLayer(\"BACKGROUND\")\n\t\t\tframe.Title.Text:SetTextColor(1, .8, 0)\n\n\t\t\tT.SkinCloseButton(frame.CloseButton)\n\n\t\t\thooksecurefunc(frame.CloseButton, \"SetPoint\", function(self, point, anchor, attachTo, x)\n\t\t\t\tif x ~= -4 then\n\t\t\t\t\tself:SetPoint(point, anchor, attachTo, -4, -4)\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tframe.IsSkinned = true\n\t\tend\n\n\t\tif frame.CloseButton.Border then\n\t\t\tframe.CloseButton.Border:SetAlpha(0)\n\t\tend\n\n\t\tlocal IsAnima = frame.uiTextureKit and frame.uiTextureKit == \"jailerstower\"\n\t\tframe.backdrop:SetShown(not IsAnima)\n\n\t\tfor option in self.optionPools:EnumerateActiveByTemplate(self.optionFrameTemplate) do\n\t\t\tlocal hasArtwork = option.ArtworkBorder and option.ArtworkBorder:IsShown()\n\t\t\toption:CreateBackdrop(\"Overlay\")\n\t\t\toption.backdrop:SetPoint(\"TOPLEFT\", -2, 20)\n\t\t\toption.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -8)\n\t\t\toption.backdrop:SetShown(not IsAnima and hasArtwork)\n\n\t\t\tif option.Header.Ribbon then option.Header.Ribbon:SetAlpha(0) end\n\t\t\tif option.Header.Contents then option.Header.Contents.Text:SetTextColor(1, .8, 0) end\n\t\t\toption.OptionText:SetTextColor(1, 1, 1)\n\n\t\t\toption.Background:SetShown(not hasArtwork)\n\t\t\tif IsAnima then\n\t\t\t\toption.Background:Show()\n\t\t\tend\n\n\t\t\tif option.ArtworkBorder then\n\t\t\t\toption.ArtworkBorder:SetAlpha(0)\n\t\t\t\tif not option.ArtBackdrop then\n\t\t\t\t\toption.ArtBackdrop = CreateFrame(\"Frame\", nil, option)\n\t\t\t\t\toption.ArtBackdrop:SetFrameLevel(option:GetFrameLevel())\n\t\t\t\t\toption.ArtBackdrop:SetPoint(\"TOPLEFT\", option.Artwork, -2, 2)\n\t\t\t\t\toption.ArtBackdrop:SetPoint(\"BOTTOMRIGHT\", option.Artwork, 2, -2)\n\t\t\t\t\toption.ArtBackdrop:SetTemplate(\"Default\")\n\t\t\t\tend\n\t\t\t\toption.ArtBackdrop:SetShown(not IsAnima and hasArtwork)\n\t\t\t\tif PlayerChoiceFrame:IsLegacy() then -- Garrison\n\t\t\t\t\toption.ArtBackdrop:Hide()\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal buttonsContainer = option.OptionButtonsContainer\n\t\t\tif buttonsContainer and buttonsContainer.buttonPool then\n\t\t\t\tfor button in buttonsContainer.buttonPool:EnumerateActive() do\n\t\t\t\t\tif not button.isSkinned then\n\t\t\t\t\t\tif IsAnima then\n\t\t\t\t\t\t\tbutton:StripTextures(true)\n\t\t\t\t\t\tend\n\t\t\t\t\t\t-- if i == 1 or (hasArtwork and i == 2) then\n\t\t\t\t\t\t\tbutton:SkinButton()\n\t\t\t\t\t\t-- end\n\t\t\t\t\t\tbutton.isSkinned = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal rewardframe = option.Rewards\n\t\t\tif rewardframe then\n\t\t\t\tfor reward in rewardframe.rewardsPool:EnumerateActive() do\n\t\t\t\t\tif not reward.backdrop and reward.Icon then\n\t\t\t\t\t\treward.Icon:SkinIcon()\n\t\t\t\t\tend\n\t\t\t\t\tif reward.Name then reward.Name:SetTextColor(1, 1, 1) end\n\t\t\t\t\tif reward.IconBorder then reward.IconBorder:SetTexture(\"\") end\n\t\t\t\t\tlocal r, g, b\n\t\t\t\t\tif reward.IconBorder and reward.IconBorder:IsShown() then\n\t\t\t\t\t\tr, g, b = reward.IconBorder:GetVertexColor()\n\t\t\t\t\t\tif (r > 0.64 and r < 0.67) or (r > 0.99 and g > 0.99 and b > 0.99) then\n\t\t\t\t\t\t\tr, g, b = unpack(C.media.border_color)\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tr, g, b = unpack(C.media.border_color)\n\t\t\t\t\tend\n\t\t\t\t\tif reward.backdrop then reward.backdrop:SetBackdropBorderColor(r, g, b) end\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal widgetFrames = option.WidgetContainer.widgetFrames\n\t\t\tif widgetFrames then\n\t\t\t\tfor _, widgetFrame in next, widgetFrames do\n\t\t\t\t\tif widgetFrame.widgetType == _G.Enum.UIWidgetVisualizationType.TextWithState then\n\t\t\t\t\t\twidgetFrame.Text:SetTextColor(1, 1, 1)\n\t\t\t\t\telseif widgetFrame.widgetType == _G.Enum.UIWidgetVisualizationType.SpellDisplay then\n\t\t\t\t\t\tlocal _, g = widgetFrame.Spell.Text:GetTextColor()\n\t\t\t\t\t\tif g < 0.2 then\n\t\t\t\t\t\t\twidgetFrame.Spell.Text:SetTextColor(1, 1, 1)\n\t\t\t\t\t\tend\n\t\t\t\t\t\twidgetFrame.Spell.Border:Hide()\n\t\t\t\t\t\twidgetFrame.Spell.IconMask:Hide()\n\t\t\t\t\t\tif not widgetFrame.Spell.backdrop then\n\t\t\t\t\t\t\twidgetFrame.Spell.Icon:SkinIcon()\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif widgetFrame.Spell.Icon:GetWidth() < 25 then\n\t\t\t\t\t\t\twidgetFrame.Spell.Icon:SetSize(20, 20)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_PlayerChoice\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Professions.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tProfessions skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = ProfessionsFrame\n\tT.SkinFrame(frame)\n\n\tProfessionsFrame.CraftingPage.TutorialButton.Ring:Hide()\n\tProfessionsFrame.CraftingPage.TutorialButton:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -5, 10)\n\n\tT.SkinEditBox(frame.CraftingPage.RecipeList.SearchBox, nil, 16)\n\tframe.CraftingPage.RecipeList.FilterButton:SkinButton()\n\tframe.CraftingPage.RecipeList.FilterButton:SetPoint(\"TOPRIGHT\", ProfessionsFrame.CraftingPage.RecipeList, \"TOPRIGHT\", -8, -6)\n\tT.SkinCloseButton(ProfessionsFrame.CraftingPage.RecipeList.FilterButton.ResetButton)\n\tProfessionsFrame.CraftingPage.RecipeList.FilterButton.ResetButton:ClearAllPoints()\n\tProfessionsFrame.CraftingPage.RecipeList.FilterButton.ResetButton:SetPoint(\"CENTER\", ProfessionsFrame.CraftingPage.RecipeList.FilterButton, \"TOPRIGHT\", 0, 0)\n\n\tlocal RankBar = frame.CraftingPage.RankBar\n\tRankBar.Border:Hide()\n\tRankBar.Background:Hide()\n\tRankBar:CreateBackdrop(\"Overlay\")\n\tRankBar.backdrop:SetOutside(RankBar.Fill)\n\n\tlocal LinkButton = frame.CraftingPage.LinkButton\n\tLinkButton:GetNormalTexture():SetTexCoord(0.25, 0.7, 0.37, 0.75)\n\tLinkButton:GetPushedTexture():SetTexCoord(0.25, 0.7, 0.45, 0.8)\n\tLinkButton:GetHighlightTexture():Kill()\n\tLinkButton:CreateBackdrop(\"Overlay\")\n\tLinkButton:SetSize(17, 14)\n\tLinkButton:SetPoint(\"LEFT\", ProfessionsFrame.CraftingPage.RankBar, \"RIGHT\", 1, -3)\n\n\tfor _, name in pairs({\"Prof0ToolSlot\", \"Prof0Gear0Slot\", \"Prof0Gear1Slot\", \"Prof1ToolSlot\", \"Prof1Gear0Slot\", \"Prof1Gear1Slot\", \"CookingToolSlot\", \"CookingGear0Slot\", \"FishingToolSlot\", \"FishingGear0Slot\", \"FishingGear1Slot\"}) do\n\t\tlocal button = frame.CraftingPage[name]\n\t\tif button then\n\t\t\tbutton:StripTextures()\n\t\t\tbutton.icon:SkinIcon()\n\t\t\tT.SkinIconBorder(button.IconBorder, button.icon:GetParent().backdrop)\n\t\t\tbutton:SetNormalTexture(0)\n\t\t\tbutton:SetPushedTexture(0)\n\t\tend\n\tend\n\n\tlocal RecipeList = frame.CraftingPage.RecipeList\n\tRecipeList:StripTextures()\n\tRecipeList.BackgroundNineSlice:Hide()\n\tT.SkinScrollBar(RecipeList.ScrollBar, true)\n\n\tlocal SchematicForm = frame.CraftingPage.SchematicForm\n\tSchematicForm:StripTextures()\n\tSchematicForm:CreateBackdrop(\"Overlay\")\n\tSchematicForm.backdrop:SetInside()\n\tSchematicForm.Background:SetInside(SchematicForm, 4, 4)\n\n\tT.SkinCheckBox(SchematicForm.TrackRecipeCheckBox, 24)\n\tT.SkinCheckBox(SchematicForm.AllocateBestQualityCheckBox, 24)\n\n\tlocal function skinDetails(frame)\n\t\tframe:SetFrameLevel(frame:GetFrameLevel() + 1)\n\t\tframe:StripTextures()\n\t\tframe.backdrop = CreateFrame(\"Frame\", nil, frame)\n\t\tframe.backdrop:SetFrameLevel(frame:GetFrameLevel() - 1)\n\t\tframe.backdrop:SetTemplate(\"Overlay\")\n\t\tframe.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha)\n\t\tframe.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 0.5)\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", -2, -15)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 15)\n\tend\n\n\tskinDetails(SchematicForm.Details)\n\n\tlocal OutputIcon = SchematicForm.OutputIcon\n\tif OutputIcon then\n\t\tOutputIcon.Icon:SkinIcon()\n\t\tT.SkinIconBorder(OutputIcon.IconBorder, OutputIcon.Icon:GetParent().backdrop)\n\t\tOutputIcon:GetHighlightTexture():Hide()\n\t\tOutputIcon.CircleMask:Hide()\n\t\tif OutputIcon.CountShadow then OutputIcon.CountShadow:SetAlpha(0) end\n\tend\n\n\tlocal qualityDialog = SchematicForm.QualityDialog\n\tqualityDialog:StripTextures()\n\tqualityDialog:SetTemplate(\"Transparent\")\n\tT.SkinCloseButton(qualityDialog.ClosePanelButton)\n\tqualityDialog.AcceptButton:SkinButton()\n\tqualityDialog.CancelButton:SkinButton()\n\n\tlocal function ReskinQualityContainer(container)\n\t\tlocal button = container.Button\n\t\tbutton:StripTextures()\n\t\tbutton:SetNormalTexture(0)\n\t\tbutton:SetPushedTexture(0)\n\t\tbutton:GetHighlightTexture():Hide()\n\t\tbutton.Icon:SkinIcon()\n\t\tT.SkinIconBorder(button.IconBorder, button.Icon:GetParent().backdrop)\n\n\t\tlocal box = container.EditBox\n\t\tbox:DisableDrawLayer(\"BACKGROUND\")\n\t\tT.SkinEditBox(box, nil, 18)\n\t\tT.SkinNextPrevButton(box.DecrementButton, true)\n\t\tT.SkinNextPrevButton(box.IncrementButton)\n\t\tbox.DecrementButton:SetSize(22, 22)\n\t\tbox.IncrementButton:SetSize(22, 22)\n\t\tbox.IncrementButton:SetPoint(\"LEFT\", box, \"RIGHT\", 6, 0)\n\tend\n\n\tReskinQualityContainer(qualityDialog.Container1)\n\tReskinQualityContainer(qualityDialog.Container2)\n\tReskinQualityContainer(qualityDialog.Container3)\n\n\tlocal function skinReagentIcon(button)\n\t\tif button and not button.styled then\n\t\t\tbutton.Icon:SkinIcon()\n\t\t\tbutton:SetNormalTexture(0)\n\t\t\tbutton:SetPushedTexture(0)\n\t\t\tbutton:GetHighlightTexture():Hide()\n\t\t\tT.SkinIconBorder(button.IconBorder, button.Icon:GetParent().backdrop)\n\t\t\tif button.SlotBackground then\n\t\t\t\tbutton.SlotBackground:Hide()\n\t\t\tend\n\t\t\tbutton.styled = true\n\t\tend\n\tend\n\n\thooksecurefunc(SchematicForm, \"Init\", function(frame)\n\t\tfor slot in frame.reagentSlotPool:EnumerateActive() do\n\t\t\tskinReagentIcon(slot.Button)\n\t\tend\n\n\t\tlocal slot = SchematicForm.salvageSlot\n\t\tif slot then\n\t\t\tskinReagentIcon(slot.Button)\n\t\tend\n\n\t\tlocal slot = SchematicForm.enchantSlot\n\t\tif slot then\n\t\t\tskinReagentIcon(slot.Button)\n\t\tend\n\tend)\n\n\thooksecurefunc(\"OpenProfessionsItemFlyout\", function(_, parent)\n\t\tfor i = 1, parent:GetNumChildren() do\n\t\t\tlocal frame = select(i, parent:GetChildren())\n\t\t\tif frame.HideUnownedCheckBox and not frame.backdrop then\n\t\t\t\tframe:StripTextures()\n\t\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\t\tframe.backdrop:SetFrameLevel(2)\n\t\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 5, 2)\n\t\t\t\tT.SkinCheckBox(frame.HideUnownedCheckBox, 24)\n\t\t\t\thooksecurefunc(frame.ScrollBox, \"Update\", function(self)\n\t\t\t\t\tfor i = 1, self.ScrollTarget:GetNumChildren() do\n\t\t\t\t\t\tlocal button = select(i, self.ScrollTarget:GetChildren())\n\t\t\t\t\t\tif button.IconBorder and not button.styled then\n\t\t\t\t\t\t\tbutton:SetTemplate(\"Transparent\")\n\t\t\t\t\t\t\tbutton.icon:CropIcon()\n\t\t\t\t\t\t\tbutton:SetNormalTexture(0)\n\t\t\t\t\t\t\tbutton:SetPushedTexture(0)\n\t\t\t\t\t\t\tbutton:GetHighlightTexture():Hide()\n\t\t\t\t\t\t\tT.SkinIconBorder(button.IconBorder, button)\n\n\t\t\t\t\t\t\tbutton.styled = true\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend)\n\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend)\n\n\tframe.CraftingPage.CreateAllButton:SkinButton()\n\tframe.CraftingPage.CreateButton:SkinButton()\n\tT.SkinEditBox(ProfessionsFrame.CraftingPage.CreateMultipleInputBox, nil, 18)\n\tT.SkinNextPrevButton(ProfessionsFrame.CraftingPage.CreateMultipleInputBox.DecrementButton, true)\n\tT.SkinNextPrevButton(ProfessionsFrame.CraftingPage.CreateMultipleInputBox.IncrementButton)\n\tProfessionsFrame.CraftingPage.CreateMultipleInputBox.IncrementButton:SetPoint(\"LEFT\", ProfessionsFrame.CraftingPage.CreateMultipleInputBox, \"RIGHT\", 5, 0)\n\tProfessionsFrame.CraftingPage.CreateMultipleInputBox.IncrementButton:SetSize(22, 22)\n\tProfessionsFrame.CraftingPage.CreateMultipleInputBox.DecrementButton:SetSize(22, 22)\n\n\tfor _, tab in next, {frame.TabSystem:GetChildren()} do\n\t\tT.SkinTab(tab)\n\tend\n\n\tlocal function HandleOutputButtons(frame)\n\t\tfor _, child in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not child.isSkinned then\n\t\t\t\tlocal itemContainer = child.ItemContainer\n\t\t\t\tif itemContainer then\n\t\t\t\t\tlocal item = itemContainer.Item\n\t\t\t\t\titem:SetNormalTexture(0)\n\t\t\t\t\titem:SetPushedTexture(0)\n\t\t\t\t\titem:SetHighlightTexture(0)\n\n\t\t\t\t\tlocal icon = item:GetRegions()\n\t\t\t\t\ticon:SkinIcon()\n\t\t\t\t\titem.IconBorder:Kill()\n\n\t\t\t\t\titemContainer.CritFrame:SetAlpha(0)\n\t\t\t\t\titemContainer.BorderFrame:Hide()\n\t\t\t\t\titemContainer.HighlightNameFrame:SetAlpha(0)\n\t\t\t\t\titemContainer.PushedNameFrame:SetAlpha(0)\n\t\t\t\t\titemContainer.NameFrame:Hide()\n\t\t\t\tend\n\n\t\t\t\tlocal bonus = child.CreationBonus\n\t\t\t\tif bonus then\n\t\t\t\t\tlocal item = bonus.Item\n\t\t\t\t\titem:StripTextures()\n\t\t\t\t\tlocal icon = item:GetRegions()\n\t\t\t\t\ticon:SkinIcon()\n\t\t\t\tend\n\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\n\t\t\tlocal itemContainer = child.ItemContainer\n\t\t\tif itemContainer then\n\t\t\t\titemContainer.Item.IconBorder:Hide()\n\t\t\t\titemContainer.Item.IconBorder:SetAlpha(0)\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal function ReskinOutputLog(frame)\n\t\tframe:StripTextures()\n\t\tframe:SetTemplate(\"Transparent\")\n\n\t\tT.SkinCloseButton(frame.ClosePanelButton)\n\t\tT.SkinScrollBar(frame.ScrollBar, true)\n\n\t\thooksecurefunc(frame.ScrollBox, \"Update\", HandleOutputButtons)\n\tend\n\n\tReskinOutputLog(frame.CraftingPage.CraftingOutputLog)\n\n\t-- Guild\n\tframe.CraftingPage.ViewGuildCraftersButton:SkinButton()\n\tlocal GuildFrame = frame.CraftingPage.GuildFrame\n\tGuildFrame:StripTextures()\n\tGuildFrame:CreateBackdrop(\"Transparent\")\n\tGuildFrame.Container:StripTextures()\n\tGuildFrame.Container:CreateBackdrop(\"Overlay\")\n\n\t-- Spec page\n\tlocal specPage = frame.SpecPage\n\tspecPage.UnlockTabButton:SkinButton()\n\tspecPage.ApplyButton:SkinButton()\n\tspecPage.TreeView:StripTextures()\n\tspecPage.TreeView.Background:Hide()\n\tspecPage.PanelFooter:StripTextures()\n\n\thooksecurefunc(specPage, \"UpdateTabs\", function(self)\n\t\tfor tab in self.tabsPool:EnumerateActive() do\n\t\t\tif not tab.styled then\n\t\t\t\ttab.styled = true\n\t\t\t\ttab:DisableDrawLayer(\"BACKGROUND\")\n\t\t\t\ttab:StripTextures()\n\t\t\t\ttab.backdrop = CreateFrame(\"Frame\", nil, tab)\n\t\t\t\ttab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)\n\t\t\t\ttab.backdrop:SetTemplate(\"Overlay\")\n\t\t\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 6, -2)\n\t\t\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", -6, 2)\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal DetailedView = specPage.DetailedView\n\tDetailedView:StripTextures()\n\tDetailedView.UnlockPathButton:SkinButton()\n\tDetailedView.SpendPointsButton:SkinButton()\n\tDetailedView.UnspentPoints.Icon:SkinIcon()\n\n\t-- Order page\n\tlocal Orders = ProfessionsFrame.OrdersPage\n\n\tlocal tabs = {\n\t\tOrders.BrowseFrame.PublicOrdersButton,\n\t\tOrders.BrowseFrame.GuildOrdersButton,\n\t\tOrders.BrowseFrame.PersonalOrdersButton\n\t}\n\n\tfor i = 1, #tabs do\n\t\tlocal tab = tabs[i]\n\t\ttab:DisableDrawLayer(\"BACKGROUND\")\n\t\ttab:StripTextures()\n\t\ttab.backdrop = CreateFrame(\"Frame\", nil, tab)\n\t\ttab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)\n\t\ttab.backdrop:SetTemplate(\"Overlay\")\n\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 6, -2)\n\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", -6, 2)\n\tend\n\n\tlocal BrowseFrame = Orders.BrowseFrame\n\tBrowseFrame.OrdersRemainingDisplay:StripTextures()\n\tBrowseFrame.OrdersRemainingDisplay:CreateBackdrop(\"Overlay\")\n\tBrowseFrame.FavoritesSearchButton:SkinButton()\n\tBrowseFrame.FavoritesSearchButton:SetSize(22, 22)\n\tBrowseFrame.FavoritesSearchButton:SetPoint(\"BOTTOMLEFT\", Orders.BrowseFrame.RecipeList, \"TOPLEFT\", 11, 0)\n\tBrowseFrame.SearchButton:SkinButton()\n\tBrowseFrame.SearchButton:SetPoint(\"LEFT\", BrowseFrame.FavoritesSearchButton, \"RIGHT\", 3, 0)\n\n\tlocal BrowseList = Orders.BrowseFrame.RecipeList\n\tBrowseList:StripTextures()\n\tT.SkinScrollBar(BrowseList.ScrollBar, true)\n\tT.SkinEditBox(BrowseList.SearchBox, nil, 16)\n\tT.SkinCloseButton(BrowseList.FilterButton.ResetButton)\n\tBrowseList.FilterButton.ResetButton:ClearAllPoints()\n\tBrowseList.FilterButton.ResetButton:SetPoint(\"CENTER\", BrowseList.FilterButton, \"TOPRIGHT\", 0, 0)\n\tBrowseList.FilterButton:SkinButton()\n\tBrowseList.FilterButton:SetPoint(\"TOPRIGHT\", BrowseList, \"TOPRIGHT\", -8, -6)\n\tBrowseList.BackgroundNineSlice:Hide()\n\n\tlocal OrderList = Orders.BrowseFrame.OrderList\n\tOrderList:StripTextures()\n\tT.SkinScrollBar(OrderList.ScrollBar, true)\n\n\thooksecurefunc(Orders, \"SetupTable\", function()\n\t\tlocal maxHeaders = OrderList.HeaderContainer:GetNumChildren()\n\t\tfor i = 1, maxHeaders do\n\t\t\tlocal header = select(i, OrderList.HeaderContainer:GetChildren())\n\t\t\tif not header.styled then\n\t\t\t\theader:DisableDrawLayer(\"BACKGROUND\")\n\t\t\t\theader:GetHighlightTexture():Hide()\n\t\t\t\theader:CreateBackdrop(\"Overlay\")\n\t\t\t\theader.backdrop:SetPoint(\"TOPLEFT\", 2, 0)\n\t\t\t\theader.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\n\t\t\t\theader.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\tOrders:SetupTable() -- init header\n\n\tlocal OrderView = Orders.OrderView\n\tlocal OrderRankBar = OrderView.RankBar\n\tOrderRankBar.Border:Hide()\n\tOrderRankBar.Background:Hide()\n\tOrderRankBar:CreateBackdrop(\"Overlay\")\n\tOrderRankBar.backdrop:SetOutside(OrderRankBar.Fill)\n\n\tReskinOutputLog(OrderView.CraftingOutputLog)\n\n\tOrderView.CreateButton:SkinButton()\n\tOrderView.StartRecraftButton:SkinButton()\n\tOrderView.CompleteOrderButton:SkinButton()\n\n\tlocal OrderInfo = OrderView.OrderInfo\n\tOrderInfo:StripTextures()\n\tOrderInfo.BackButton:SkinButton()\n\tOrderInfo.IgnoreButton:SkinButton()\n\tOrderInfo.StartOrderButton:SkinButton()\n\tOrderInfo.DeclineOrderButton:SkinButton()\n\tOrderInfo.ReleaseOrderButton:SkinButton()\n\n\tlocal NoteBox = OrderInfo.NoteBox\n\tNoteBox:StripTextures()\n\tNoteBox:CreateBackdrop(\"Overlay\")\n\tNoteBox.Background:Hide()\n\n\tlocal OrderDetails = OrderView.OrderDetails\n\tOrderDetails:StripTextures()\n\tOrderDetails:CreateBackdrop(\"Transparent\")\n\tOrderDetails.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\tOrderDetails.Background:ClearAllPoints()\n\tOrderDetails.Background:SetInside(OrderDetails.backdrop)\n\n\tlocal OrderSchematicForm = OrderDetails.SchematicForm\n\tT.SkinCheckBox(OrderSchematicForm.AllocateBestQualityCheckBox)\n\tskinDetails(OrderSchematicForm.Details)\n\n\thooksecurefunc(OrderSchematicForm, \"Init\", function(frame)\n\t\tfor slot in frame.reagentSlotPool:EnumerateActive() do\n\t\t\tskinReagentIcon(slot.Button)\n\t\tend\n\n\t\tlocal slot = OrderSchematicForm.salvageSlot\n\t\tif slot then\n\t\t\tskinReagentIcon(slot.Button)\n\t\tend\n\tend)\n\n\tlocal OutputIcon = OrderSchematicForm.OutputIcon\n\tif OutputIcon then\n\t\tOutputIcon.Icon:SkinIcon()\n\t\tT.SkinIconBorder(OutputIcon.IconBorder, OutputIcon.Icon:GetParent().backdrop)\n\t\tOutputIcon:GetHighlightTexture():Hide()\n\t\tOutputIcon.CircleMask:Hide()\n\t\tif OutputIcon.CountShadow then OutputIcon.CountShadow:SetAlpha(0) end\n\tend\n\n\tlocal FulfillmentForm = OrderDetails.FulfillmentForm\n\tlocal NoteBox = FulfillmentForm.NoteEditBox\n\tNoteBox:StripTextures()\n\tNoteBox:CreateBackdrop(\"Overlay\")\n\n\tlocal OutputIcon = OrderDetails.FulfillmentForm.ItemIcon\n\tif OutputIcon then\n\t\tOutputIcon.Icon:SkinIcon()\n\t\tT.SkinIconBorder(OutputIcon.IconBorder, OutputIcon.Icon:GetParent().backdrop)\n\t\tOutputIcon:GetHighlightTexture():Hide()\n\t\tOutputIcon.CircleMask:Hide()\n\t\tif OutputIcon.CountShadow then OutputIcon.CountShadow:SetAlpha(0) end\n\tend\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/ProfessionsOrders.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tProfessionsOrders skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = ProfessionsCustomerOrdersFrame\n\tT.SkinFrame(frame)\n\n\tframe.MoneyFrameBorder:StripTextures()\n\tframe.MoneyFrameInset:StripTextures()\n\n\tlocal buttons = {\n\t\tframe.BrowseOrders.SearchBar.SearchButton,\n\t\tframe.BrowseOrders.SearchBar.FilterButton,\n\t\tframe.BrowseOrders.SearchBar.FavoritesSearchButton,\n\t\tframe.Form.BackButton,\n\t\tframe.Form.PaymentContainer.ListOrderButton,\n\t\tframe.Form.CurrentListings.CloseButton,\n\t\tframe.Form.PaymentContainer.CancelOrderButton\n\t}\n\n\tfor i = 1, #buttons do\n\t\tbuttons[i]:SkinButton()\n\tend\n\n\tlocal scrollbars = {\n\t\tframe.BrowseOrders.RecipeList.ScrollBar,\n\t\tframe.BrowseOrders.CategoryList.ScrollBar,\n\t\tframe.MyOrdersPage.OrderList.ScrollBar,\n\t\tframe.Form.CurrentListings.OrderList.ScrollBar\n\t}\n\n\tfor i = 1, #scrollbars do\n\t\tT.SkinScrollBar(scrollbars[i], true)\n\tend\n\n\tlocal tabs = {\n\t\tProfessionsCustomerOrdersFrameBrowseTab,\n\t\tProfessionsCustomerOrdersFrameOrdersTab,\n\t}\n\n\tfor _, tab in pairs(tabs) do\n\t\tif tab then\n\t\t\tT.SkinTab(tab)\n\t\tend\n\tend\n\n\tProfessionsCustomerOrdersFrameBrowseTab:ClearAllPoints()\n\tProfessionsCustomerOrdersFrameBrowseTab:SetPoint(\"BOTTOMLEFT\", frame, \"BOTTOMLEFT\", 0, -32)\n\n\tlocal orders = frame.BrowseOrders\n\torders.SearchBar.FavoritesSearchButton:SetSize(22, 22)\n\tT.SkinEditBox(orders.SearchBar.SearchBox, nil, 18)\n\tT.SkinCloseButton(orders.SearchBar.FilterButton.ClearFiltersButton)\n\torders.SearchBar.FilterButton.ClearFiltersButton:SetPoint(\"TOPRIGHT\", 3, 6)\n\n\torders.CategoryList:StripTextures()\n\n\torders.CategoryList.ScrollBar:SetPoint(\"TOPLEFT\", orders.CategoryList.ScrollBox, \"TOPRIGHT\", 6, -1)\n\torders.CategoryList.ScrollBar:SetPoint(\"BOTTOMLEFT\", orders.CategoryList.ScrollBox, \"BOTTOMRIGHT\", 7, 2)\n\n\tlocal function skinCategoryButton(button)\n\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", button.SelectedTexture, \"TOPLEFT\", 1, -1)\n\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", button.SelectedTexture, \"BOTTOMRIGHT\", -1, 1)\n\n\t\tbutton.NormalTexture:SetAlpha(0)\n\t\tbutton.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.2)\n\t\tbutton.HighlightTexture:SetColorTexture(1, 1, 1, 0.2)\n\tend\n\n\thooksecurefunc(orders.CategoryList.ScrollBox, \"Update\", function(self)\n\t\tfor i = 1, self.ScrollTarget:GetNumChildren() do\n\t\t\tlocal child = select(i, self.ScrollTarget:GetChildren())\n\t\t\tif child.Text and not child.styled then\n\t\t\t\tif not child.SpacerLine:IsShown() then\n\t\t\t\t\tskinCategoryButton(child)\n\t\t\t\t\thooksecurefunc(child, \"Init\", skinCategoryButton)\n\t\t\t\tend\n\n\t\t\t\tchild.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal function SkinListIcon(frame)\n\t\tif not frame.tableBuilder then return end\n\n\t\tfor i = 1, 22 do\n\t\t\tlocal row = frame.tableBuilder.rows[i]\n\t\t\tif row then\n\t\t\t\tfor j = 1, 4 do\n\t\t\t\t\tlocal cell = row.cells and row.cells[j]\n\t\t\t\t\tif cell and cell.Icon then\n\t\t\t\t\t\tif not cell.IsSkinned then\n\t\t\t\t\t\t\tcell.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\t\t\tif cell.IconBorder then cell.IconBorder:SetAlpha(0) end\n\n\t\t\t\t\t\t\tcell.IsSkinned = true\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal function SkinHeaders(frame)\n\t\tlocal maxHeaders = frame.HeaderContainer:GetNumChildren()\n\t\tfor i = 1, maxHeaders do\n\t\t\tlocal header = select(i, frame.HeaderContainer:GetChildren())\n\t\t\tif header and not header.IsSkinned then\n\t\t\t\theader:DisableDrawLayer(\"BACKGROUND\")\n\t\t\t\theader:GetHighlightTexture():Hide()\n\t\t\t\theader:CreateBackdrop(\"Overlay\")\n\t\t\t\theader.backdrop:SetPoint(\"TOPLEFT\", 2, 0)\n\t\t\t\theader.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\n\t\t\t\theader.IsSkinned = true\n\t\t\tend\n\t\tend\n\n\t\tSkinListIcon(frame)\n\tend\n\n\tframe.BrowseOrders.RecipeList:StripTextures()\n\n\thooksecurefunc(frame.BrowseOrders, \"SetupTable\", function()\n\t\tSkinHeaders(frame.BrowseOrders.RecipeList)\n\tend)\n\thooksecurefunc(frame.BrowseOrders, \"StartSearch\", SkinListIcon)\n\n\tlocal form = frame.Form\n\tform.RecipeHeader:Hide()\n\tform.RecipeHeader:CreateBackdrop(\"Overlay\")\n\tform.RecipeHeader:GetParent().backdrop:SetAllPoints(form.RecipeHeader)\n\tform.LeftPanelBackground:StripTextures()\n\tform.RightPanelBackground:StripTextures()\n\n\tT.SkinCheckBox(form.TrackRecipeCheckBox.Checkbox, 20)\n\tif form.AllocateBestQualityCheckBox then\n\t\tT.SkinCheckBox(form.AllocateBestQualityCheckBox)\n\tend\n\tT.SkinDropDownBox(form.OrderRecipientDropDown)\n\n\tform.OrderRecipientDropDown:SetPoint(\"TOPRIGHT\", form, \"TOPRIGHT\", -3, -10)\n\n\tT.SkinEditBox(form.OrderRecipientTarget)\n\tform.OrderRecipientTarget.backdrop:SetPoint(\"TOPLEFT\", -3, -2)\n\tform.OrderRecipientTarget.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tT.SkinDropDownBox(form.MinimumQuality.DropDown)\n\n\tlocal OutputIcon = form.OutputIcon\n\tOutputIcon.Icon:SkinIcon()\n\tT.SkinIconBorder(OutputIcon.IconBorder, OutputIcon.Icon:GetParent().backdrop)\n\tOutputIcon:GetHighlightTexture():Hide()\n\tOutputIcon.CircleMask:Hide()\n\n\tlocal qualityDialog = form.QualityDialog\n\tqualityDialog:StripTextures()\n\tqualityDialog:SetTemplate(\"Transparent\")\n\tT.SkinCloseButton(qualityDialog.ClosePanelButton)\n\tqualityDialog.AcceptButton:SkinButton()\n\tqualityDialog.CancelButton:SkinButton()\n\n\tlocal function ReskinQualityContainer(container)\n\t\tlocal button = container.Button\n\t\tbutton:StripTextures()\n\t\tbutton:SetNormalTexture(0)\n\t\tbutton:SetPushedTexture(0)\n\t\tbutton:GetHighlightTexture():Hide()\n\t\tbutton.Icon:SkinIcon()\n\t\tT.SkinIconBorder(button.IconBorder, button.Icon:GetParent().backdrop)\n\n\t\tlocal box = container.EditBox\n\t\tbox:DisableDrawLayer(\"BACKGROUND\")\n\t\tT.SkinEditBox(box, nil, 18)\n\t\tT.SkinNextPrevButton(box.DecrementButton, true)\n\t\tT.SkinNextPrevButton(box.IncrementButton)\n\t\tbox.DecrementButton:SetSize(22, 22)\n\t\tbox.IncrementButton:SetSize(22, 22)\n\t\tbox.IncrementButton:SetPoint(\"LEFT\", box, \"RIGHT\", 6, 0)\n\tend\n\n\tReskinQualityContainer(qualityDialog.Container1)\n\tReskinQualityContainer(qualityDialog.Container2)\n\tReskinQualityContainer(qualityDialog.Container3)\n\n\thooksecurefunc(form, \"Init\", function(self)\n\t\tfor slot in self.reagentSlotPool:EnumerateActive() do\n\t\t\tlocal button = slot.Button\n\t\t\tif button and not button.styled then\n\t\t\t\tbutton.Icon:SkinIcon()\n\t\t\t\tbutton:SetNormalTexture(0)\n\t\t\t\tbutton:SetPushedTexture(0)\n\t\t\t\tbutton:GetHighlightTexture():Hide()\n\t\t\t\tT.SkinIconBorder(button.IconBorder, button.Icon:GetParent().backdrop)\n\n\t\t\t\tbutton.HighlightTexture:SetColorTexture(1, 0.8, 0, 0.4)\n\t\t\t\tbutton.HighlightTexture:SetAllPoints(button)\n\n\t\t\t\tif button.SlotBackground then\n\t\t\t\t\tbutton.SlotBackground:Hide()\n\t\t\t\tend\n\n\t\t\t\tT.SkinCheckBox(slot.Checkbox)\n\t\t\t\tbutton.styled = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal payment = form.PaymentContainer\n\tpayment.NoteEditBox:StripTextures()\n\tpayment.NoteEditBox:CreateBackdrop(\"Overlay\")\n\tpayment.NoteEditBox.backdrop:SetPoint(\"TOPLEFT\", 15, 5)\n\tpayment.NoteEditBox.backdrop:SetPoint(\"BOTTOMRIGHT\", -18, 0)\n\n\tlocal function SkinMoneyBox(frame)\n\t\tframe:DisableDrawLayer(\"BACKGROUND\")\n\t\tframe:CreateBackdrop(\"Overlay\")\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 6, -2)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -4, 6)\n\tend\n\n\tSkinMoneyBox(payment.TipMoneyInputFrame.GoldBox)\n\tSkinMoneyBox(payment.TipMoneyInputFrame.SilverBox)\n\n\tlocal viewButton = payment.ViewListingsButton\n\tviewButton:SetAlpha(0)\n\tlocal buttonFrame = CreateFrame(\"Frame\", nil, payment)\n\tbuttonFrame:SetInside(viewButton)\n\tlocal tex = buttonFrame:CreateTexture(nil, \"ARTWORK\")\n\ttex:SetAllPoints()\n\ttex:SetTexture(\"Interface\\\\CURSOR\\\\Crosshair\\\\Repair\")\n\n\tT.SkinDropDownBox(payment.DurationDropDown)\n\n\tlocal currentListings = frame.Form.CurrentListings\n\tcurrentListings:StripTextures()\n\tcurrentListings:SetTemplate(\"Transparent\")\n\tSkinHeaders(currentListings.OrderList)\n\tcurrentListings.OrderList:StripTextures()\n\tcurrentListings:ClearAllPoints()\n\tcurrentListings:SetPoint(\"LEFT\", frame, \"RIGHT\", 5, 0)\n\n\tlocal myOrders = frame.MyOrdersPage\n\tmyOrders.OrderList:StripTextures()\n\tmyOrders.RefreshButton:SkinButton()\n\tmyOrders.RefreshButton:SetSize(24, 24)\n\tSkinHeaders(myOrders.OrderList)\nend\n\nT.SkinFuncs[\"Blizzard_ProfessionsCustomerOrders\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/PvE.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPvE skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal StripAllTextures = {\n\t\tPVEFrame,\n\t\tPVEFrameLeftInset,\n\t\tLFDParentFrame,\n\t\tLFDParentFrameInset,\n\t\tRaidFinderFrame,\n\t\tRaidFinderQueueFrame,\n\t\tRaidFinderFrameBottomInset,\n\t\tRaidFinderFrameRoleInset,\n\t\tLFGDungeonReadyDialog,\n\t\tLFGDungeonReadyStatus,\n\t\tLFDQueueFrameCooldownFrame,\n\t\tRaidFinderQueueFrameCooldownFrame,\n\t\tRaidFinderQueueFramePartyBackfill,\n\t\tLFDQueueFramePartyBackfill,\n\t\tLFDQueueFrame,\n\t\tLFGListApplicationDialog\n\t}\n\n\tfor i = 1, #StripAllTextures do\n\t\tStripAllTextures[i]:StripTextures()\n\tend\n\n\tlocal KillTextures = {\n\t\tLFDQueueFrameBackground,\n\t\tPVEFramePortrait,\n\t\tLFGDungeonReadyDialogBackground,\n\t\tRaidFinderQueueFrameBackground,\n\t\tLFGDungeonReadyDialogBottomArt,\n\t\tLFGDungeonReadyDialogFiligree,\n\t\tRaidFinderQueueFrameScrollFrameScrollBackground,\n\t\tRaidFinderQueueFrameScrollFrameScrollBackgroundTopLeft,\n\t\tRaidFinderQueueFrameScrollFrameScrollBackgroundBottomRight,\n\t\tPVEFrame.shadows,\n\t\tLFGListFrame.EntryCreation.ActivityFinder.Background\n\t}\n\n\tfor i = 1, #KillTextures do\n\t\tKillTextures[i]:Kill()\n\tend\n\n\tlocal buttons = {\n\t\tLFDQueueFrameFindGroupButton,\n\t\tRaidFinderFrameFindRaidButton,\n\t\tLFGDungeonReadyDialogLeaveQueueButton,\n\t\tLFGDungeonReadyDialogEnterDungeonButton,\n\t\tRaidFinderQueueFramePartyBackfillBackfillButton,\n\t\tRaidFinderQueueFramePartyBackfillNoBackfillButton,\n\t\tLFDQueueFramePartyBackfillBackfillButton,\n\t\tLFDQueueFramePartyBackfillNoBackfillButton,\n\t\tLFGInvitePopupAcceptButton,\n\t\tLFGInvitePopupDeclineButton,\n\t\tLFGListApplicationDialog.SignUpButton,\n\t\tLFGListApplicationDialog.CancelButton\n\t}\n\n\tfor i = 1, #buttons do\n\t\tbuttons[i]:SkinButton()\n\tend\n\n\tlocal checkButtons = {\n\t\tLFDQueueFrameRoleButtonTank,\n\t\tLFDQueueFrameRoleButtonHealer,\n\t\tLFDQueueFrameRoleButtonDPS,\n\t\tLFDQueueFrameRoleButtonLeader,\n\t\tRaidFinderQueueFrameRoleButtonTank,\n\t\tRaidFinderQueueFrameRoleButtonHealer,\n\t\tRaidFinderQueueFrameRoleButtonDPS,\n\t\tRaidFinderQueueFrameRoleButtonLeader,\n\t\tLFGListApplicationDialog.TankButton,\n\t\tLFGListApplicationDialog.HealerButton,\n\t\tLFGListApplicationDialog.DamagerButton,\n\t\tLFGInvitePopupRoleButtonTank,\n\t\tLFGInvitePopupRoleButtonHealer,\n\t\tLFGInvitePopupRoleButtonDPS,\n\t\tRolePollPopupRoleButtonTank,\n\t\tRolePollPopupRoleButtonHealer,\n\t\tRolePollPopupRoleButtonDPS\n\t}\n\n\tfor _, roleButton in pairs(checkButtons) do\n\t\tT.SkinCheckBox(roleButton.checkButton or roleButton.CheckButton)\n\tend\n\n\thooksecurefunc(\"SetCheckButtonIsRadio\", function(button)\n\t\tT.SkinCheckBox(button)\n\tend)\n\n\tlocal scrollbars = {\n\t\t-- LFGListApplicationViewerScrollFrameScrollBar,\n\t\tLFDQueueFrameSpecific.ScrollBar,\n\t\tLFDQueueFrameRandomScrollFrameScrollBar,\n\t\tRaidFinderQueueFrameScrollFrameScrollBar,\n\t\t-- LFGListEntryCreationSearchScrollFrameScrollBar,\n\t}\n\n\tfor i = 1, #scrollbars do\n\t\tT.SkinScrollBar(scrollbars[i])\n\tend\n\n\t-- Set texture to hide circle\n\t_G.GroupFinderFrame.groupButton1.icon:SetTexture(\"Interface\\\\Icons\\\\INV_Helmet_08\")\n\t_G.GroupFinderFrame.groupButton2.icon:SetTexture(\"Interface\\\\LFGFrame\\\\UI-LFR-PORTRAIT\")\n\t_G.GroupFinderFrame.groupButton3.icon:SetTexture(\"Interface\\\\Icons\\\\Achievement_General_StayClassy\")\n\n\tfor i = 1, 3 do\n\t\tlocal button = GroupFinderFrame[\"groupButton\"..i]\n\n\t\tbutton.ring:Hide()\n\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\tbutton.backdrop:SetAllPoints()\n\t\tbutton:StyleButton()\n\n\t\tbutton.bg:SetTexture(\"\")\n\n\t\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton.icon:SetPoint(\"LEFT\", button, \"LEFT\", 10, 0)\n\t\tbutton.icon:SetDrawLayer(\"OVERLAY\")\n\t\tbutton.icon:SetSize(40, 40)\n\n\t\tbutton.border = CreateFrame(\"Frame\", nil, button)\n\t\tbutton.border:CreateBackdrop(\"Default\")\n\t\tbutton.border.backdrop:SetPoint(\"TOPLEFT\", button.icon, -2, 2)\n\t\tbutton.border.backdrop:SetPoint(\"BOTTOMRIGHT\", button.icon, 2, -2)\n\tend\n\n\thooksecurefunc(\"GroupFinderFrame_SelectGroupButton\", function(index)\n\t\tlocal self = GroupFinderFrame\n\t\tfor i = 1, 3 do\n\t\t\tlocal button = self[\"groupButton\"..i]\n\t\t\tif i == index then\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\n\t\t\t\tbutton.backdrop.overlay:SetVertexColor(1, 0.82, 0, 0.3)\n\t\t\t\tbutton.border.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\n\t\t\telse\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\tbutton.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\n\t\t\t\tbutton.border.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(\"LFGRewardsFrame_SetItemButton\", function(parentFrame, _, index)\n\t\tlocal parentName = parentFrame:GetName()\n\t\tlocal item = _G[parentName..\"Item\"..index]\n\n\t\tif item and not item.isSkinned then\n\t\t\titem.border = CreateFrame(\"Frame\", nil, item)\n\t\t\titem.border:CreateBackdrop(\"Default\")\n\t\t\titem.border.backdrop:SetPoint(\"TOPLEFT\", item.Icon, \"TOPLEFT\", -2, 2)\n\t\t\titem.border.backdrop:SetPoint(\"BOTTOMRIGHT\", item.Icon, \"BOTTOMRIGHT\", 2, -2)\n\n\t\t\titem.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\titem.Icon:SetDrawLayer(\"OVERLAY\")\n\t\t\titem.Icon:SetParent(item.border)\n\n\t\t\thooksecurefunc(item.IconBorder, \"SetVertexColor\", function(self, r, g, b)\n\t\t\t\tif r ~= 0.65882 and g ~= 0.65882 and b ~= 0.65882 then\n\t\t\t\t\tself:GetParent().border.backdrop:SetBackdropBorderColor(r, g, b)\n\t\t\t\tend\n\t\t\t\tself:SetTexture(\"\")\n\t\t\tend)\n\n\t\t\thooksecurefunc(item.IconBorder, \"Hide\", function(self)\n\t\t\t\tself:GetParent().border.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend)\n\n\t\t\titem.Count:SetDrawLayer(\"OVERLAY\")\n\t\t\titem.Count:SetParent(item.border)\n\n\t\t\titem.NameFrame:Hide()\n\n\t\t\titem.shortageBorder:SetTexture(nil)\n\n\t\t\titem.roleIcon1:SetParent(item.border)\n\t\t\titem.roleIcon2:SetParent(item.border)\n\n\t\t\titem.isSkinned = true\n\t\tend\n\tend)\n\n\tlocal function SkinMoney(button)\n\t\t_G[button].border = CreateFrame(\"Frame\", nil, _G[button])\n\t\t_G[button].border:CreateBackdrop(\"Default\")\n\t\t_G[button].border.backdrop:SetPoint(\"TOPLEFT\", _G[button..\"IconTexture\"], \"TOPLEFT\", -2, 2)\n\t\t_G[button].border.backdrop:SetPoint(\"BOTTOMRIGHT\", _G[button..\"IconTexture\"], \"BOTTOMRIGHT\", 2, -2)\n\n\t\t_G[button..\"IconTexture\"]:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t_G[button..\"IconTexture\"]:SetDrawLayer(\"OVERLAY\")\n\t\t_G[button..\"IconTexture\"]:SetParent(_G[button].border)\n\n\t\t_G[button..\"NameFrame\"]:Hide()\n\n\t\t_G[button..\"Count\"]:SetDrawLayer(\"OVERLAY\")\n\t\t_G[button..\"Count\"]:SetParent(_G[button].border)\n\tend\n\tSkinMoney(\"LFDQueueFrameRandomScrollFrameChildFrameMoneyReward\")\n\tSkinMoney(\"RaidFinderQueueFrameScrollFrameChildFrameMoneyReward\")\n\n\thooksecurefunc(\"LFGDungeonListButton_SetDungeon\", function(button)\n\t\tif not button.expandOrCollapseButton.isSkinned then\n\t\t\tT.SkinCheckBox(button.enableButton)\n\t\t\tbutton.enableButton:SetFrameLevel(button.enableButton:GetFrameLevel() - 2)\n\t\t\tbutton.enableButton.SetCheckedTexture = T.dummy -- Blizzard changes checked texture, prevent it\n\t\t\tT.SkinExpandOrCollapse(button.expandOrCollapseButton)\n\t\t\tbutton.expandOrCollapseButton.isSkinned = true\n\t\tend\n\tend)\n\n\tfor i = 1, 3 do\n\t\tT.SkinTab(_G[\"PVEFrameTab\"..i])\n\tend\n\n\tLFGListApplicationDialog:SetTemplate(\"Transparent\")\n\tPVEFrame:CreateBackdrop(\"Transparent\")\n\tPVEFrame.backdrop:SetAllPoints()\n\n\tLFDQueueFrameNoLFDWhileLFR:CreateBackdrop(\"Overlay\")\n\tLFDQueueFrameNoLFDWhileLFR.backdrop:SetPoint(\"TOPLEFT\", 2, 5)\n\tLFDQueueFrameNoLFDWhileLFR.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 6)\n\n\tLFDQueueFrameCooldownFrame:CreateBackdrop(\"Overlay\")\n\tLFDQueueFrameCooldownFrame.backdrop:SetPoint(\"TOPLEFT\", 2, 4)\n\tLFDQueueFrameCooldownFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 6)\n\n\tLFDQueueFramePartyBackfill:CreateBackdrop(\"Overlay\")\n\tLFDQueueFramePartyBackfill.backdrop:SetPoint(\"TOPLEFT\", 2, 4)\n\tLFDQueueFramePartyBackfill.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 6)\n\n\tRaidFinderQueueFrameCooldownFrame:CreateBackdrop(\"Overlay\")\n\tRaidFinderQueueFrameCooldownFrame.backdrop:SetPoint(\"TOPLEFT\", 2, 6)\n\tRaidFinderQueueFrameCooldownFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 8)\n\n\tRaidFinderQueueFramePartyBackfill:CreateBackdrop(\"Overlay\")\n\tRaidFinderQueueFramePartyBackfill.backdrop:SetPoint(\"TOPLEFT\", 2, 6)\n\tRaidFinderQueueFramePartyBackfill.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 8)\n\n\tT.SkinDropDownBox(LFDQueueFrameTypeDropDown, 300)\n\tLFDQueueFrameTypeDropDown.backdrop:SetParent(LFDQueueFrame) -- fixed SetFrameLevel raise to 10000\n\tLFDQueueFrameTypeDropDown:SetPoint(\"RIGHT\", -10, 0)\n\n\tT.SkinDropDownBox(RaidFinderQueueFrameSelectionDropDown, 300)\n\tRaidFinderQueueFrameSelectionDropDown:SetPoint(\"RIGHT\", -10, 0)\n\n\tLFGListFrame.SearchPanel.ResultsInset:StripTextures()\n\tLFGListFrame.NothingAvailable:StripTextures()\n\tLFGListFrame.CategorySelection:StripTextures()\n\n\tLFGListFrame.CategorySelection.FindGroupButton:SkinButton()\n\tLFGListFrame.CategorySelection.StartGroupButton:SkinButton()\n\tLFGListFrame.SearchPanel.BackToGroupButton:SkinButton()\n\tLFGListFrame.SearchPanel.BackButton:SkinButton()\n\tLFGListFrame.SearchPanel.SignUpButton:SkinButton()\n\tLFGListFrame.SearchPanel.ScrollBox.StartGroupButton:SkinButton()\n\tLFGListFrame.SearchPanel.RefreshButton:SkinButton()\n\tLFGListFrame.SearchPanel.RefreshButton:SetSize(24, 24)\n\tLFGListFrame.SearchPanel.RefreshButton.Icon:SetPoint(\"CENTER\")\n\tLFGListFrame.SearchPanel.FilterButton:SkinButton()\n\tLFGListFrame.SearchPanel.FilterButton:SetPoint(\"LEFT\", LFGListFrame.SearchPanel.SearchBox, \"RIGHT\", 5, 0)\n\tT.SkinScrollBar(LFGListFrame.SearchPanel.ScrollBar)\n\n\thooksecurefunc(\"LFGListApplicationViewer_UpdateApplicant\", function(button)\n\t\tif not button.DeclineButton.isSkinned then\n\t\t\tbutton.DeclineButton:SkinButton()\n\t\t\tbutton.DeclineButton.isSkinned = true\n\t\tend\n\t\tif not button.InviteButtonSmall.isSkinned then\n\t\t\tbutton.InviteButtonSmall:SkinButton()\n\t\t\tbutton.InviteButtonSmall.isSkinned = true\n\t\tend\n\tend)\n\n\thooksecurefunc(\"LFGListSearchEntry_Update\", function(button)\n\t\tif button and not button.isSkinned then\n\t\t\tbutton.CancelButton:SkinButton()\n\t\t\tbutton.isSkinned = true\n\t\tend\n\tend)\n\n\thooksecurefunc(\"LFGListSearchPanel_UpdateAutoComplete\", function(self)\n\t\tfor i = 1, LFGListFrame.SearchPanel.AutoCompleteFrame:GetNumChildren() do\n\t\t\tlocal child = select(i, LFGListFrame.SearchPanel.AutoCompleteFrame:GetChildren())\n\t\t\tif child and not child.isSkinned and child:GetObjectType() == \"Button\" then\n\t\t\t\tchild:SkinButton()\n\t\t\t\tchild.isSkinned = true\n\t\t\tend\n\t\tend\n\n\t\tlocal text = self.SearchBox:GetText()\n\t\tlocal matchingActivities = C_LFGList.GetAvailableActivities(self.categoryID, nil, self.filters, text)\n\t\tlocal numResults = math.min(#matchingActivities, MAX_LFG_LIST_SEARCH_AUTOCOMPLETE_ENTRIES)\n\n\t\tfor i = 2, numResults do\n\t\t\tlocal button = self.AutoCompleteFrame.Results[i]\n\t\t\tif button and not button.moved then\n\t\t\t\tbutton:SetPoint(\"TOPLEFT\", self.AutoCompleteFrame.Results[i-1], \"BOTTOMLEFT\", 0, -2)\n\t\t\t\tbutton:SetPoint(\"TOPRIGHT\", self.AutoCompleteFrame.Results[i-1], \"BOTTOMRIGHT\", 0, -2)\n\t\t\t\tbutton.moved = true\n\t\t\tend\n\t\tend\n\t\tself.AutoCompleteFrame:SetHeight(numResults * (self.AutoCompleteFrame.Results[1]:GetHeight() + 3.5) + 8)\n\tend)\n\n\tLFGListFrame.SearchPanel.AutoCompleteFrame:StripTextures()\n\tLFGListFrame.SearchPanel.AutoCompleteFrame:CreateBackdrop(\"Transparent\")\n\tLFGListFrame.SearchPanel.AutoCompleteFrame.backdrop:SetPoint(\"TOPLEFT\", LFGListFrame.SearchPanel.AutoCompleteFrame, \"TOPLEFT\", 0, 3)\n\tLFGListFrame.SearchPanel.AutoCompleteFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", LFGListFrame.SearchPanel.AutoCompleteFrame, \"BOTTOMRIGHT\", 6, 3)\n\n\tLFGListFrame.SearchPanel.AutoCompleteFrame:SetPoint(\"TOPLEFT\", LFGListFrame.SearchPanel.SearchBox, \"BOTTOMLEFT\", -2, -8)\n\tLFGListFrame.SearchPanel.AutoCompleteFrame:SetPoint(\"TOPRIGHT\", LFGListFrame.SearchPanel.SearchBox, \"BOTTOMRIGHT\", -4, -8)\n\n\tT.SkinEditBox(LFGListFrame.SearchPanel.SearchBox)\n\n\tT.SkinCloseButton(PVEFrameCloseButton)\n\tT.SkinCloseButton(LFGDungeonReadyStatusCloseButton, nil, \"-\")\n\tT.SkinCloseButton(LFGDungeonReadyDialogCloseButton, LFGDungeonReadyDialog, \"-\")\n\n\tLFDQueueFrameRandomScrollFrameScrollBackground:SetTexture(nil)\n\tLFDQueueFrameRandomScrollFrameScrollBackgroundTopLeft:SetTexture(nil)\n\tLFDQueueFrameRandomScrollFrameScrollBackgroundBottomRight:SetTexture(nil)\n\n\tLFGInvitePopup:StripTextures()\n\tLFGInvitePopup:SetTemplate(\"Transparent\")\n\tLFGDungeonReadyPopup:SetTemplate(\"Transparent\")\n\tLFGDungeonReadyDialog.SetBackdrop = T.dummy\n\tLFGDungeonReadyDialog.Border:Hide()\n\tLFGDungeonReadyStatus.Border:Hide()\n\n\thooksecurefunc(\"LFGDungeonReadyDialog_UpdateRewards\", function()\n\t\tfor i = 1, LFD_MAX_REWARDS do\n\t\t\tlocal reward = LFGDungeonReadyDialogRewardsFrame.Rewards[i]\n\t\t\tif not reward.isSkinned then\n\t\t\t\treward.texture:SetSize(18, 18)\n\t\t\t\treward.texture:SkinIcon(true)\n\t\t\t\treward:DisableDrawLayer(\"OVERLAY\")\n\t\t\t\treward.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tLFGListFrame.CategorySelection.CategoryButtons[1]:SetNormalFontObject(GameFontNormal)\n\thooksecurefunc(\"LFGListCategorySelection_AddButton\", function(self, index)\n\t\tlocal button = self.CategoryButtons[index]\n\t\tif button and not button.styled then\n\t\t\tbutton.Cover:Hide()\n\t\t\tbutton:SetTemplate(\"Overlay\")\n\t\t\tbutton:StyleButton()\n\t\t\tbutton.Icon:SetDrawLayer(\"ARTWORK\")\n\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tbutton.Icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tbutton.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\tbutton.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.3)\n\t\t\tbutton.SelectedTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tbutton.SelectedTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\t\tbutton.Label:SetFontObject(_G.GameFontNormal)\n\t\t\tbutton.styled = true\n\t\tend\n\tend)\n\n\tLFGListFrame.EntryCreation:StripTextures()\n\tLFGListFrame.EntryCreation.Description:StripTextures()\n\tLFGListApplicationDialogDescription:StripTextures()\n\tLFGListInviteDialog:StripTextures()\n\tLFGListInviteDialog:SetTemplate(\"Transparent\")\n\tLFGListInviteDialog.AcknowledgeButton:SkinButton()\n\tLFGListInviteDialog.AcceptButton:SkinButton()\n\tLFGListInviteDialog.DeclineButton:SkinButton()\n\n\tT.SkinEditBox(LFGListApplicationDialogDescription)\n\tT.SkinEditBox(LFGListFrame.EntryCreation.Name, nil, 17)\n\tT.SkinEditBox(LFGListFrame.EntryCreation.ItemLevel.EditBox, nil, 17)\n\tT.SkinEditBox(LFGListFrame.EntryCreation.VoiceChat.EditBox, nil, 17)\n\tT.SkinEditBox(LFGListFrame.EntryCreation.Description)\n\tT.SkinDropDownBox(LFGListFrame.EntryCreation.GroupDropDown)\n\tT.SkinDropDownBox(LFGListFrame.EntryCreation.ActivityDropDown)\n\tT.SkinCheckBox(LFGListFrame.EntryCreation.VoiceChat.CheckButton)\n\tT.SkinCheckBox(LFGListFrame.EntryCreation.ItemLevel.CheckButton)\n\tT.SkinCheckBox(LFGListFrame.EntryCreation.PrivateGroup.CheckButton)\n\tT.SkinCheckBox(LFGListFrame.EntryCreation.CrossFactionGroup.CheckButton)\n\tLFGListFrame.EntryCreation.ListGroupButton:SkinButton()\n\tLFGListFrame.EntryCreation.CancelButton:SkinButton()\n\n\tT.SkinDropDownBox(LFGListEntryCreationPlayStyleDropdown)\n\tT.SkinCheckBox(LFGListFrame.EntryCreation.MythicPlusRating.CheckButton)\n\tT.SkinEditBox(LFGListFrame.EntryCreation.MythicPlusRating.EditBox, nil, 17)\n\n\tT.SkinCheckBox(LFGListFrame.EntryCreation.PvpItemLevel.CheckButton)\n\tT.SkinEditBox(LFGListFrame.EntryCreation.PvpItemLevel.EditBox, nil, 17)\n\n\tT.SkinCheckBox(LFGListFrame.EntryCreation.PVPRating.CheckButton)\n\tT.SkinEditBox(LFGListFrame.EntryCreation.PVPRating.EditBox, nil, 17)\n\n\tLFGListFrame.EntryCreation.ActivityFinder.Dialog:StripTextures()\n\tLFGListFrame.EntryCreation.ActivityFinder.Dialog:SetTemplate(\"Transparent\")\n\tLFGListFrame.EntryCreation.ActivityFinder.Dialog.BorderFrame:StripTextures()\n\tLFGListFrame.EntryCreation.ActivityFinder.Dialog.BorderFrame:SetTemplate(\"Transparent\")\n\tT.SkinEditBox(LFGListFrame.EntryCreation.ActivityFinder.Dialog.EntryBox, 276, 17)\n\tLFGListFrame.EntryCreation.ActivityFinder.Dialog.SelectButton:SkinButton()\n\tLFGListFrame.EntryCreation.ActivityFinder.Dialog.CancelButton:SkinButton()\n\n\t-- ApplicationViewer (Custom Groups)\n\tT.SkinCheckBox(LFGListFrame.ApplicationViewer.AutoAcceptButton)\n\tLFGListFrame.ApplicationViewer.Inset:StripTextures()\n\tLFGListFrame.ApplicationViewer.Inset:SetTemplate(\"Transparent\")\n\n\tLFGListFrame.ApplicationViewer.NameColumnHeader:SkinButton(true)\n\tLFGListFrame.ApplicationViewer.NameColumnHeader:ClearAllPoints()\n\tLFGListFrame.ApplicationViewer.NameColumnHeader:SetPoint(\"BOTTOMLEFT\", LFGListFrame.ApplicationViewer.Inset, \"TOPLEFT\", 0, 1)\n\tLFGListFrame.ApplicationViewer.NameColumnHeader.Label:SetFont(C.media.normal_font, 10, \"\")\n\n\tLFGListFrame.ApplicationViewer.RoleColumnHeader:SkinButton(true)\n\tLFGListFrame.ApplicationViewer.RoleColumnHeader:ClearAllPoints()\n\tLFGListFrame.ApplicationViewer.RoleColumnHeader:SetPoint(\"LEFT\", LFGListFrame.ApplicationViewer.NameColumnHeader, \"RIGHT\", 1, 0)\n\tLFGListFrame.ApplicationViewer.RoleColumnHeader.Label:SetFont(C.media.normal_font, 10, \"\")\n\n\tLFGListFrame.ApplicationViewer.ItemLevelColumnHeader:SkinButton(true)\n\tLFGListFrame.ApplicationViewer.ItemLevelColumnHeader:ClearAllPoints()\n\tLFGListFrame.ApplicationViewer.ItemLevelColumnHeader:SetPoint(\"LEFT\", LFGListFrame.ApplicationViewer.RoleColumnHeader, \"RIGHT\", 1, 0)\n\tLFGListFrame.ApplicationViewer.ItemLevelColumnHeader.Label:SetFont(C.media.normal_font, 10, \"\")\n\n\tLFGListFrame.ApplicationViewer.RatingColumnHeader:SkinButton(true)\n\tLFGListFrame.ApplicationViewer.RatingColumnHeader:ClearAllPoints()\n\tLFGListFrame.ApplicationViewer.RatingColumnHeader:SetPoint(\"LEFT\", LFGListFrame.ApplicationViewer.ItemLevelColumnHeader, \"RIGHT\", 1, 0)\n\tLFGListFrame.ApplicationViewer.RatingColumnHeader.Label:SetFont(C.media.normal_font, 10, \"\")\n\n\tLFGListFrame.ApplicationViewer.RefreshButton:SkinButton()\n\tLFGListFrame.ApplicationViewer.RefreshButton:SetSize(24,24)\n\tLFGListFrame.ApplicationViewer.RefreshButton:ClearAllPoints()\n\tLFGListFrame.ApplicationViewer.RefreshButton:SetPoint(\"BOTTOMRIGHT\", LFGListFrame.ApplicationViewer.Inset, \"TOPRIGHT\", 16, 4)\n\n\tLFGListFrame.ApplicationViewer.BrowseGroupsButton:SkinButton(true)\n\tLFGListFrame.ApplicationViewer.BrowseGroupsButton:ClearAllPoints()\n\tLFGListFrame.ApplicationViewer.BrowseGroupsButton:SetPoint(\"BOTTOMLEFT\", -1, 2)\n\n\tLFGListFrame.ApplicationViewer.RemoveEntryButton:SkinButton(true)\n\tLFGListFrame.ApplicationViewer.RemoveEntryButton:SetWidth(80)\n\n\tLFGListFrame.ApplicationViewer.EditButton:SkinButton(true)\n\tLFGListFrame.ApplicationViewer.EditButton:ClearAllPoints()\n\tLFGListFrame.ApplicationViewer.EditButton:SetPoint(\"BOTTOMRIGHT\", -6, 2)\n\tLFGListFrame.ApplicationViewer.EditButton:SetWidth(80)\n\n\tLFGListFrame.ApplicationViewer.ScrollBar:ClearAllPoints()\n\tLFGListFrame.ApplicationViewer.ScrollBar:SetPoint(\"TOPLEFT\", LFGListFrame.ApplicationViewer.Inset, \"TOPRIGHT\", 0, -14)\n\tLFGListFrame.ApplicationViewer.ScrollBar:SetPoint(\"BOTTOMLEFT\", LFGListFrame.ApplicationViewer.Inset, \"BOTTOMRIGHT\", 0, 14)\n\tT.SkinScrollBar(LFGListFrame.ApplicationViewer.ScrollBar)\n\n\tLFGListFrame.ApplicationViewer.InfoBackground:SkinIcon()\n\tLFGListFrame.ApplicationViewer.InfoBackground:SetPoint(\"TOPLEFT\", 1, -27)\n\tLFGListFrame.ApplicationViewer.InfoBackground:SetSize(324, 90)\n\n\tif IsAddOnLoaded(\"PremadeGroupsFilter\") then\n\t\tPremadeGroupsFilterDialog:StripTextures()\n\t\tPremadeGroupsFilterDialog:CreateBackdrop(\"Transparent\")\n\t\tPremadeGroupsFilterDialog.backdrop:SetPoint(\"TOPLEFT\", 3, 0)\n\t\tPremadeGroupsFilterDialog.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, -1)\n\t\tPremadeGroupsFilterDialog.ResetButton:SkinButton()\n\t\tPremadeGroupsFilterDialog.RefreshButton:SkinButton()\n\t\tT.SkinCloseButton(PremadeGroupsFilterDialog.CloseButton)\n\n\t\tT.SkinCloseButton(PremadeGroupsFilterDialog.MaxMinButtonFrame.MinimizeButton, nil, \"-\")\n\t\tPremadeGroupsFilterDialog.MaxMinButtonFrame.MinimizeButton:SetHitRectInsets(0, 0, 0, 0)\n\t\tPremadeGroupsFilterDialog.MaxMinButtonFrame.MinimizeButton:ClearAllPoints()\n\t\tPremadeGroupsFilterDialog.MaxMinButtonFrame.MinimizeButton:SetPoint(\"TOPRIGHT\", PremadeGroupsFilterDialog.CloseButton, \"TOPLEFT\", -3, 0)\n\t\tT.SkinCloseButton(PremadeGroupsFilterDialog.MaxMinButtonFrame.MaximizeButton, nil, \"+\")\n\t\tPremadeGroupsFilterDialog.MaxMinButtonFrame.MaximizeButton:SetHitRectInsets(0, 0, 0, 0)\n\t\tPremadeGroupsFilterDialog.MaxMinButtonFrame.MaximizeButton:ClearAllPoints()\n\t\tPremadeGroupsFilterDialog.MaxMinButtonFrame.MaximizeButton:SetPoint(\"TOPRIGHT\", PremadeGroupsFilterDialog.CloseButton, \"TOPLEFT\", -3, 0)\n\n\t\tT.SkinDropDownBox(PremadeGroupsFilterDialog.Difficulty.DropDown)\n\t\tT.SkinEditBox(PremadeGroupsFilterDialog.Expression)\n\t\tPremadeGroupsFilterDialog.Difficulty.DropDown:SetPoint(\"TOPRIGHT\", PremadeGroupsFilterDialog.Difficulty, \"TOPRIGHT\", 5, 1)\n\n\t\tlocal checkButtons = {\n\t\t\tPremadeGroupsFilterDialog.Difficulty.Act,\n\t\t\tPremadeGroupsFilterDialog.MPRating.Act,\n\t\t\tPremadeGroupsFilterDialog.PVPRating.Act,\n\t\t\tPremadeGroupsFilterDialog.Defeated.Act,\n\t\t\tPremadeGroupsFilterDialog.Members.Act,\n\t\t\tPremadeGroupsFilterDialog.Tanks.Act,\n\t\t\tPremadeGroupsFilterDialog.Heals.Act,\n\t\t\tPremadeGroupsFilterDialog.Dps.Act\n\t\t}\n\n\t\tfor _, button in pairs(checkButtons) do\n\t\t\tbutton:SetSize(27, 27)\n\t\t\tT.SkinCheckBox(button)\n\t\tend\n\n\t\tlocal editBoxes = {\n\t\t\tPremadeGroupsFilterDialog.MPRating.Min,\n\t\t\tPremadeGroupsFilterDialog.MPRating.Max,\n\t\t\tPremadeGroupsFilterDialog.Defeated.Min,\n\t\t\tPremadeGroupsFilterDialog.Defeated.Max,\n\t\t\tPremadeGroupsFilterDialog.PVPRating.Min,\n\t\t\tPremadeGroupsFilterDialog.PVPRating.Max,\n\t\t\tPremadeGroupsFilterDialog.Members.Min,\n\t\t\tPremadeGroupsFilterDialog.Members.Max,\n\t\t\tPremadeGroupsFilterDialog.Tanks.Min,\n\t\t\tPremadeGroupsFilterDialog.Tanks.Max,\n\t\t\tPremadeGroupsFilterDialog.Heals.Min,\n\t\t\tPremadeGroupsFilterDialog.Heals.Max,\n\t\t\tPremadeGroupsFilterDialog.Dps.Min,\n\t\t\tPremadeGroupsFilterDialog.Dps.Max\n\t\t}\n\n\t\tfor _, box in pairs(editBoxes) do\n\t\t\tT.SkinEditBox(box, nil, 17)\n\t\tend\n\n\t\tlocal button = UsePFGButton or UsePGFButton\n\t\tif button then\n\t\t\tT.SkinCheckBox(button)\n\t\tend\n\tend\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)\n\nlocal function LoadSecondarySkin()\n\tChallengesFrameInset:StripTextures()\n\tChallengesFrame:DisableDrawLayer(\"BACKGROUND\")\n\tChallengesFrame.WeeklyInfo.Child:DisableDrawLayer(\"BACKGROUND\")\n\n\thooksecurefunc(ChallengesFrame, \"Update\", function(self)\n\t\tfor _, frame in ipairs(self.DungeonIcons) do\n\t\t\tif not frame.backdrop then\n\t\t\t\tframe:CreateBackdrop(\"Transparent\")\n\t\t\t\tframe.backdrop:SetAllPoints()\n\t\t\t\tframe.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tframe.Icon:SetInside()\n\t\t\t\tframe.HighestLevel:SetFont(C.media.normal_font, 18, \"OUTLINE\")\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal function HandleAffixIcons(self)\n\t\tfor _, frame in ipairs(self.Affixes) do\n\t\t\tframe.Border:SetTexture(nil)\n\t\t\tframe.Portrait:SetTexture(nil)\n\n\t\t\tif frame.info then\n\t\t\t\tframe.Portrait:SetTexture(CHALLENGE_MODE_EXTRA_AFFIX_INFO[frame.info.key].texture)\n\t\t\telseif frame.affixID then\n\t\t\t\tlocal _, _, filedataid = C_ChallengeMode.GetAffixInfo(frame.affixID)\n\t\t\t\tframe.Portrait:SetTexture(filedataid)\n\t\t\tend\n\t\t\tframe.Portrait:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tif not frame.backdrop then\n\t\t\t\tframe:CreateBackdrop(\"Default\")\n\t\t\t\tframe.backdrop:SetPoint(\"TOPLEFT\", frame.Portrait, \"TOPLEFT\", -2, 2)\n\t\t\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", frame.Portrait, \"BOTTOMRIGHT\", 2, -2)\n\t\t\tend\n\t\tend\n\tend\n\n\thooksecurefunc(ChallengesFrame.WeeklyInfo, \"SetUp\", function(self)\n\t\tlocal affixes = C_MythicPlus.GetCurrentAffixes()\n\t\tif affixes then\n\t\t\tHandleAffixIcons(self.Child)\n\t\tend\n\tend)\n\n\thooksecurefunc(ChallengesKeystoneFrame, \"Reset\", function(self)\n\t\tself:GetRegions():SetAlpha(0)\n\t\tself.InstructionBackground:SetAlpha(0)\n\tend)\n\n\thooksecurefunc(ChallengesKeystoneFrame, \"OnKeystoneSlotted\", HandleAffixIcons)\n\n\tT.SkinCloseButton(ChallengesKeystoneFrame.CloseButton)\n\tChallengesKeystoneFrame.StartButton:SkinButton(true)\n\n\tChallengesKeystoneFrame:DisableDrawLayer(\"BACKGROUND\")\n\tChallengesKeystoneFrame:CreateBackdrop(\"Transparent\")\n\n\tlocal NoticeFrame = ChallengesFrame.SeasonChangeNoticeFrame\n\tNoticeFrame:StripTextures()\n\tNoticeFrame:CreateBackdrop(\"Overlay\")\n\tNoticeFrame:SetFrameLevel(5)\n\tNoticeFrame.NewSeason:SetTextColor(1, 0.8, 0)\n\tNoticeFrame.NewSeason:SetShadowOffset(1, -1)\n\tNoticeFrame.SeasonDescription:SetTextColor(1, 1, 1)\n\tNoticeFrame.SeasonDescription:SetShadowOffset(1, -1)\n\tNoticeFrame.SeasonDescription2:SetTextColor(1, 1, 1)\n\tNoticeFrame.SeasonDescription2:SetShadowOffset(1, -1)\n\tNoticeFrame.SeasonDescription2:SetWidth(400)\n\tNoticeFrame.SeasonDescription3:SetTextColor(1, 0.8, 0)\n\tNoticeFrame.SeasonDescription3:SetShadowOffset(1, -1)\n\n\tNoticeFrame.Affix:StripTextures()\n\tNoticeFrame.Affix.Portrait:SkinIcon()\n\n\tNoticeFrame.Leave:SkinButton()\nend\n\nT.SkinFuncs[\"Blizzard_ChallengesUI\"] = LoadSecondarySkin\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/PvP.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tPvP skin\n----------------------------------------------------------------------------------------\nlocal LoadTootlipSkin = CreateFrame(\"Frame\")\nLoadTootlipSkin:RegisterEvent(\"ADDON_LOADED\")\nLoadTootlipSkin:SetScript(\"OnEvent\", function(self, _, addon)\n\tif IsAddOnLoaded(\"Skinner\") or IsAddOnLoaded(\"Aurora\") or not C.tooltip.enable then\n\t\tself:UnregisterEvent(\"ADDON_LOADED\")\n\t\treturn\n\tend\n\n\tif addon == \"Blizzard_PVPUI\" then\n\t\tConquestTooltip:SetTemplate(\"Transparent\")\n\tend\nend)\n\nif C.skins.blizzard_frames ~= true then return end\nlocal function LoadSkin()\n\t-- Set texture to hide circle\n\tPVPQueueFrame.CategoryButton1.Icon:SetTexture(\"Interface\\\\Icons\\\\achievement_bg_winwsg\")\n\tPVPQueueFrame.CategoryButton2.Icon:SetTexture(\"Interface\\\\Icons\\\\achievement_bg_killxenemies_generalsroom\")\n\tPVPQueueFrame.CategoryButton3.Icon:SetTexture(\"Interface\\\\Icons\\\\Achievement_General_StayClassy\")\n\n\tfor i = 1, 3 do\n\t\tlocal button = _G[\"PVPQueueFrameCategoryButton\"..i]\n\t\tbutton.Ring:Kill()\n\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\tbutton.backdrop:SetAllPoints()\n\t\tbutton:StyleButton()\n\t\tbutton.Background:Kill()\n\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton.Icon:SetPoint(\"LEFT\", button, \"LEFT\", 10, 0)\n\t\tbutton.Icon:SetDrawLayer(\"OVERLAY\")\n\t\tbutton.Icon:SetSize(40, 40)\n\t\tbutton.border = CreateFrame(\"Frame\", nil, button)\n\t\tbutton.border:CreateBackdrop(\"Default\")\n\t\tbutton.border.backdrop:SetPoint(\"TOPLEFT\", button.Icon, -2, 2)\n\t\tbutton.border.backdrop:SetPoint(\"BOTTOMRIGHT\", button.Icon, 2, -2)\n\tend\n\n\thooksecurefunc(\"PVPQueueFrame_SelectButton\", function(index)\n\t\tlocal self = PVPQueueFrame\n\t\tfor i = 1, 3 do\n\t\t\tlocal button = self[\"CategoryButton\"..i]\n\t\t\tif i == index then\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\n\t\t\t\tbutton.backdrop.overlay:SetVertexColor(1, 0.82, 0, 0.3)\n\t\t\t\tbutton.border.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)\n\t\t\telse\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\tbutton.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\n\t\t\t\tbutton.border.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- HonorFrame\n\tHonorFrame.Inset:StripTextures()\n\tHonorFrame.BonusFrame:StripTextures()\n\tHonorFrame.BonusFrame.ShadowOverlay:StripTextures()\n\n\tT.SkinDropDownBox(HonorFrameTypeDropDown, 165)\n\tHonorFrameTypeDropDown:SetPoint(\"BOTTOMRIGHT\", HonorFrame.Inset, \"TOPRIGHT\", -6, -1)\n\tT.SkinScrollBar(HonorFrame.SpecificScrollBar)\n\t--HonorFrame.SpecificScrollBar:SetPoint(\"TOPLEFT\", HonorFrameSpecificFrame, \"TOPRIGHT\", 0, -15)\n\t--HonorFrame.SpecificScrollBar:SetPoint(\"BOTTOMLEFT\", HonorFrameSpecificFrame, \"BOTTOMRIGHT\", 0, 15)\n\tHonorFrameQueueButton:SkinButton(true)\n\n\tPVPQueueFrame.HonorInset:StripTextures()\n\tPVPQueueFrame.HonorInset.RatedPanel.Label:SetWidth(160)\n\n\tlocal RewardFrameSeason = PVPQueueFrame.HonorInset.RatedPanel.SeasonRewardFrame\n\tRewardFrameSeason.Ring:Hide()\n\tRewardFrameSeason.CircleMask:Hide()\n\tRewardFrameSeason.Icon:SkinIcon()\n\n\tfor _, i in pairs({\"RandomBGButton\", \"RandomEpicBGButton\", \"Arena1Button\", \"BrawlButton\", \"BrawlButton2\"}) do\n\t\tlocal button = HonorFrame.BonusFrame[i]\n\t\tbutton:StripTextures()\n\t\tbutton:SetTemplate(\"Overlay\")\n\t\tbutton:StyleButton()\n\t\tbutton.SelectedTexture:SetDrawLayer(\"ARTWORK\")\n\t\tbutton.SelectedTexture:ClearAllPoints()\n\t\tbutton.SelectedTexture:SetAllPoints()\n\t\tbutton.SelectedTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tbutton.SelectedTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tbutton.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.3)\n\n\t\tlocal reward = button.Reward\n\t\treward:StripTextures()\n\t\treward:SetTemplate(\"Default\")\n\t\treward:SetSize(40, 40)\n\t\treward:SetPoint(\"RIGHT\", button, \"RIGHT\", -8, 0)\n\t\treward.CircleMask:Hide()\n\n\t\treward.Icon:SetAllPoints()\n\t\treward.Icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\treward.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\treward.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\treward.EnlistmentBonus:StripTextures()\n\t\treward.EnlistmentBonus:SetTemplate(\"Default\")\n\t\treward.EnlistmentBonus:SetSize(20, 20)\n\t\treward.EnlistmentBonus:SetPoint(\"TOPRIGHT\", 2, 2)\n\n\t\tlocal EnlistmentBonusIcon = reward.EnlistmentBonus:CreateTexture()\n\t\tEnlistmentBonusIcon:SetPoint(\"TOPLEFT\", reward.EnlistmentBonus, \"TOPLEFT\", 2, -2)\n\t\tEnlistmentBonusIcon:SetPoint(\"BOTTOMRIGHT\", reward.EnlistmentBonus, \"BOTTOMRIGHT\", -2, 2)\n\t\tEnlistmentBonusIcon:SetTexture(\"Interface\\\\Icons\\\\achievement_guildperk_honorablemention_rank2\")\n\t\tEnlistmentBonusIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\n\n\thooksecurefunc(\"PVPUIFrame_ConfigureRewardFrame\", function(rewardFrame, _, _, itemRewards, currencyRewards)\n\t\tlocal rewardTexture, rewardQuaility, _ = nil, 1\n\n\t\tif currencyRewards then\n\t\t\tfor _, reward in ipairs(currencyRewards) do\n\t\t\t\tlocal info = C_CurrencyInfo.GetCurrencyInfo(reward.id)\n\t\t\t\tif info and info.quality == ITEMQUALITY_ARTIFACT then\n\t\t\t\t\t_, rewardTexture, _, rewardQuaility = CurrencyContainerUtil_GetCurrencyContainerInfo(reward.id, reward.quantity, info.name, info.iconFileID, info.quality)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif not rewardTexture and itemRewards then\n\t\t\tlocal reward = itemRewards[1]\n\t\t\tif reward then\n\t\t\t\t_, _, rewardQuaility, _, _, _, _, _, _, rewardTexture = GetItemInfo(reward.id)\n\t\t\tend\n\t\tend\n\n\t\tif rewardTexture then\n\t\t\tlocal r, g, b = GetItemQualityColor(rewardQuaility)\n\t\t\trewardFrame.Icon:SetTexture(rewardTexture)\n\t\t\t--rewardFrame.Icon.backdrop:SetBackdropBorderColor(r, g, b)\n\t\tend\n\tend)\n\n\thooksecurefunc(HonorFrame.SpecificScrollBox, \"Update\", function (self)\n\t\tfor i = 1, self.ScrollTarget:GetNumChildren() do\n\t\t\tlocal button = select(i, self.ScrollTarget:GetChildren())\n\t\t\tif not button.IsSkinned then\n\t\t\t\tbutton:SetSize(368, 38)\n\t\t\t\tbutton:StripTextures()\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\t\t\tbutton:StyleButton(nil, nil, true)\n\t\t\t\tbutton.SelectedTexture:SetDrawLayer(\"ARTWORK\")\n\t\t\t\tbutton.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.3)\n\t\t\t\tbutton.SelectedTexture:SetInside(button.backdrop)\n\t\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tbutton.Icon:SetPoint(\"TOPLEFT\", 5, -3)\n\t\t\t\tbutton.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal checkButtons = {\n\t\tHonorFrame.TankIcon,\n\t\tHonorFrame.HealerIcon,\n\t\tHonorFrame.DPSIcon,\n\t\tConquestFrame.TankIcon,\n\t\tConquestFrame.HealerIcon,\n\t\tConquestFrame.DPSIcon\n\t}\n\n\tfor i = 1, #checkButtons do\n\t\tlocal button = checkButtons[i].checkButton\n\t\tbutton:SetSize(22, 22)\n\t\tT.SkinCheckBox(button)\n\tend\n\n\tfor _, bar in pairs({HonorFrame.ConquestBar, ConquestFrame.ConquestBar}) do\n\t\tbar:StripTextures()\n\t\tbar:CreateBackdrop(\"Overlay\")\n\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\tbar:SetFrameLevel(bar:GetFrameLevel() + 2)\n\n\t\tbar.Reward:ClearAllPoints()\n\t\tbar.Reward:SetPoint(\"LEFT\", bar, \"RIGHT\", -1, 0)\n\n\t\tbar.Reward.Ring:Hide()\n\t\tbar.Reward.CircleMask:Hide()\n\n\t\tbar.Reward:StripTextures()\n\t\tbar.Reward.Icon:SkinIcon()\n\t\tbar.Reward.Icon:SetSize(20, 20)\n\n\t\tlocal faction = UnitFactionGroup(\"player\") == \"Horde\" and [[Interface\\Icons\\UI_Horde_HonorboundMedal]] or [[Interface\\Icons\\UI_Alliance_7LegionMedal]]\n\t\thooksecurefunc(bar.Reward, \"SetTexture\", function(self, texture)\n\t\t\tif not texture then\n\t\t\t\tself.Icon:SetTexture(faction)\n\t\t\tend\n\t\tend)\n\t\tbar:SetStatusBarColor(unpack(UnitFactionGroup(\"player\") == \"Horde\" and {0.8, 0.2, 0.2} or {0.2, 0.2, 0.8}))\n\tend\n\n\t-- ConquestFrame\n\tConquestFrame:StripTextures()\n\tConquestFrame.Inset:StripTextures()\n\tConquestFrame.ShadowOverlay:StripTextures()\n\n\tfor _, button in pairs({ConquestFrame.RatedSoloShuffle, ConquestFrame.Arena2v2, ConquestFrame.Arena3v3, ConquestFrame.RatedBG}) do\n\t\tbutton:StripTextures()\n\t\tbutton:SetTemplate(\"Overlay\")\n\t\tbutton:StyleButton()\n\t\tbutton.SelectedTexture:SetDrawLayer(\"ARTWORK\")\n\t\tbutton.SelectedTexture:ClearAllPoints()\n\t\tbutton.SelectedTexture:SetAllPoints()\n\t\tbutton.SelectedTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tbutton.SelectedTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tbutton.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.3)\n\n\t\tbutton.Reward:StripTextures()\n\t\tbutton.Reward:SetTemplate(\"Default\")\n\t\tbutton.Reward:SetSize(40, 40)\n\t\tbutton.Reward:SetPoint(\"RIGHT\", button, \"RIGHT\", -7, -1)\n\t\tbutton.Reward.CircleMask:Hide()\n\n\t\tbutton.Reward.Icon:SetAllPoints()\n\t\tbutton.Reward.Icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tbutton.Reward.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tbutton.Reward.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\n\n\tConquestFrame.Arena3v3:SetPoint(\"TOP\", ConquestFrame.Arena2v2, \"BOTTOM\", 0, -3)\n\n\tConquestJoinButton:SkinButton(true)\n\n\tlocal NewSeasonPopup = PVPQueueFrame.NewSeasonPopup\n\tNewSeasonPopup:StripTextures()\n\tNewSeasonPopup:CreateBackdrop(\"Overlay\")\n\tNewSeasonPopup.backdrop:SetPoint(\"TOPLEFT\", 10, -10)\n\tNewSeasonPopup.backdrop:SetPoint(\"BOTTOMRIGHT\", -10, 10)\n\tNewSeasonPopup:SetFrameLevel(5)\n\tNewSeasonPopup.NewSeason:SetTextColor(1, 0.8, 0)\n\tNewSeasonPopup.NewSeason:SetShadowOffset(1, -1)\n\tNewSeasonPopup.SeasonDescriptionHeader:SetTextColor(1, 1, 1)\n\tNewSeasonPopup.SeasonDescriptionHeader:SetShadowOffset(1, -1)\n\tNewSeasonPopup:HookScript(\"OnShow\", function(self)\n\t\tfor _, text in pairs(self.SeasonDescriptions) do\n\t\t\ttext:SetTextColor(1, 1, 1)\n\t\t\ttext:SetShadowOffset(1, -1)\n\t\tend\n\tend)\n\tNewSeasonPopup.SeasonRewardText:SetTextColor(1, 0.8, 0)\n\tNewSeasonPopup.SeasonRewardText:SetShadowOffset(1, -1)\n\n\tlocal RewardFrame = NewSeasonPopup.SeasonRewardFrame\n\tRewardFrame.Ring:Hide()\n\tRewardFrame.CircleMask:Hide()\n\tRewardFrame.Icon:SkinIcon()\n\n\tNewSeasonPopup.Leave:SkinButton()\nend\n\nT.SkinFuncs[\"Blizzard_PVPUI\"] = LoadSkin\n\nlocal function LoadSecondarySkin()\n\t-- PvP Ready Dialog\n\tPVPReadyDialog:StripTextures()\n\tPVPReadyDialog:SetTemplate(\"Transparent\")\n\tPVPReadyDialogBackground:SetAlpha(0)\n\tPVPReadyDialogEnterBattleButton:SkinButton()\n\tPVPReadyDialogLeaveQueueButton:SkinButton()\n\tT.SkinCloseButton(PVPReadyDialogCloseButton, PVPReadyDialog, \"-\")\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSecondarySkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/PvPMatch.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPVPMatch skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\t-- Macro to show the PVPMatchScoreboard: /run PVPMatchScoreboard:Show()\n\tlocal PVPMatchScoreboard = _G.PVPMatchScoreboard\n\tPVPMatchScoreboard:StripTextures()\n\tPVPMatchScoreboard:DisableDrawLayer(\"BORDER\")\n\tPVPMatchScoreboard:CreateBackdrop(\"Transparent\")\n\n\tPVPMatchScoreboard.Content:StripTextures()\n\n\tT.SkinScrollBar(PVPMatchScoreboard.Content.ScrollBar)\n\tT.SkinCloseButton(PVPMatchScoreboard.CloseButton)\n\n\tfor i = 1, 3 do\n\t\tT.SkinTab(_G.PVPMatchScoreboard.Content.TabContainer.TabGroup[\"Tab\"..i])\n\tend\n\n\t-- Macro to show the PVPMatchResults: /run PVPMatchResults:Show()\n\tlocal PVPMatchResults = _G.PVPMatchResults\n\tPVPMatchResults:StripTextures()\n\tPVPMatchResults:DisableDrawLayer(\"BORDER\")\n\tPVPMatchResults:CreateBackdrop(\"Transparent\")\n\n\tPVPMatchResults.content:StripTextures()\n\tPVPMatchResults.content.tabContainer:StripTextures()\n\n\tT.SkinScrollBar(PVPMatchResults.content.scrollBar)\n\tT.SkinCloseButton(PVPMatchResults.CloseButton)\n\tPVPMatchResults.buttonContainer.leaveButton:SkinButton()\n\tPVPMatchResults.buttonContainer.requeueButton:SkinButton()\n\n\tfor i = 1, 3 do\n\t\tT.SkinTab(_G.PVPMatchResults.content.tabContainer.tabGroup[\"tab\"..i])\n\tend\n\n\tlocal honor = PVPMatchResults.content.earningsContainer.progressContainer.honor.button\n\thonor.CircleMask:Hide()\n\thonor.Ring:Hide()\n\thonor.Icon:SkinIcon()\n\tPVPMatchResults.content.earningsContainer.progressContainer.honor:SetScale(1)\n\n\tlocal conquest = PVPMatchResults.content.earningsContainer.progressContainer.conquest.button\n\tconquest.CircleMask:Hide()\n\tconquest.Ring:Hide()\n\tconquest.Icon:SkinIcon()\n\tPVPMatchResults.content.earningsContainer.progressContainer.conquest:SetScale(1)\n\n\thooksecurefunc(PVPMatchResults, \"AddItemReward\", function()\n\t\tfor itemFrame in PVPMatchResults.itemPool:EnumerateActive() do\n\t\t\titemFrame.IconBorder:Hide()\n\t\t\titemFrame.IconBorderDropShadow:SetAlpha(0)\n\t\t\titemFrame:SetScale(1)\n\t\t\tif not itemFrame.backdrop then\n\t\t\t\titemFrame.Icon:SkinIcon()\n\t\t\tend\n\t\t\tlocal atlas = itemFrame.IconBorder:GetAtlas()\n\t\t\tlocal r, g, b = unpack(C.media.border_color)\n\t\t\tif atlas:find(\"green\") then\n\t\t\t\tr, g, b = GetItemQualityColor(2)\n\t\t\telseif atlas:find(\"blue\") then\n\t\t\t\tr, g, b = GetItemQualityColor(3)\n\t\t\telseif atlas:find(\"purple\") then\n\t\t\t\tr, g, b = GetItemQualityColor(4)\n\t\t\tend\n\t\t\titemFrame.backdrop:SetBackdropBorderColor(r, g, b)\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Quest.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tQuest skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tQuestFrame:StripTextures(true)\n\tQuestFrameInset:StripTextures(true)\n\tQuestFrameDetailPanel:StripTextures(true)\n\tQuestDetailScrollFrame:StripTextures(true)\n\tQuestDetailScrollChildFrame:StripTextures(true)\n\tQuestRewardScrollFrame:StripTextures(true)\n\tQuestRewardScrollChildFrame:StripTextures(true)\n\tQuestProgressScrollFrame:StripTextures(true)\n\tQuestGreetingScrollFrame:StripTextures(true)\n\tQuestFrameProgressPanel:StripTextures(true)\n\tQuestFrameRewardPanel:StripTextures(true)\n\tQuestFramePortrait:SetAlpha(0)\n\n\tQuestFrameProgressPanelMaterialTopLeft:SetAlpha(0)\n\tQuestFrameProgressPanelMaterialTopRight:SetAlpha(0)\n\tQuestFrameProgressPanelMaterialBotLeft:SetAlpha(0)\n\tQuestFrameProgressPanelMaterialBotRight:SetAlpha(0)\n\n\tQuestFrame:CreateBackdrop(\"Transparent\")\n\tQuestFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tQuestFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\n\tQuestFrameAcceptButton:SkinButton(true)\n\tQuestFrameDeclineButton:SkinButton(true)\n\tQuestFrameCompleteButton:SkinButton(true)\n\tQuestFrameGoodbyeButton:SkinButton(true)\n\tQuestFrameCompleteQuestButton:SkinButton(true)\n\n\tT.SkinCloseButton(QuestFrameCloseButton, QuestFrame.backdrop)\n\tT.SkinScrollBar(QuestDetailScrollFrameScrollBar)\n\tT.SkinScrollBar(QuestProgressScrollFrameScrollBar)\n\tT.SkinScrollBar(QuestRewardScrollFrameScrollBar)\n\tT.SkinScrollBar(QuestGreetingScrollFrameScrollBar)\n\tT.SkinScrollBar(QuestNPCModelTextScrollFrameScrollBar)\n\n\tfor i = 1, 6 do\n\t\tlocal button = _G[\"QuestProgressItem\"..i]\n\t\tlocal texture = _G[\"QuestProgressItem\"..i..\"IconTexture\"]\n\n\t\tif button.NameFrame then button.NameFrame:Hide() end\n\t\tbutton.Name:SetFont(C.media.normal_font, 12, \"\")\n\n\t\tbutton:CreateBackdrop(\"Default\")\n\t\tbutton.backdrop:ClearAllPoints()\n\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", texture, -2, 2)\n\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", texture, 2, -2)\n\n\t\ttexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\n\n\thooksecurefunc(\"QuestFrameProgressItems_Update\", function()\n\t\tQuestProgressTitleText:SetTextColor(1, 0.8, 0)\n\t\tQuestProgressTitleText:SetShadowColor(0, 0, 0)\n\t\tQuestProgressText:SetTextColor(1, 1, 1)\n\t\tQuestProgressRequiredItemsText:SetTextColor(1, 0.8, 0)\n\t\tQuestProgressRequiredItemsText:SetShadowColor(0, 0, 0)\n\t\tQuestProgressRequiredMoneyText:SetTextColor(1, 0.8, 0)\n\tend)\n\n\t-- QuestGreeting\n\tlocal function UpdateGreetingPanel()\n\t\tQuestFrameGreetingPanel:StripTextures()\n\t\tQuestFrameGreetingGoodbyeButton:SkinButton()\n\t\tGreetingText:SetTextColor(1, 1, 1)\n\t\tCurrentQuestsText:SetTextColor(1, 0.8, 0)\n\t\tAvailableQuestsText:SetTextColor(1, 0.8, 0)\n\t\tQuestGreetingFrameHorizontalBreak:Kill()\n\n\t\tfor button in QuestFrameGreetingPanel.titleButtonPool:EnumerateActive() do\n\t\t\tlocal text = button:GetFontString():GetText()\n\t\t\tif text and strfind(text, \"|cff000000\") then\n\t\t\t\tbutton:GetFontString():SetText(gsub(text, \"|cff000000\", \"|cffFFFF00\"))\n\t\t\tend\n\t\tend\n\tend\n\n\tQuestFrameGreetingPanel:HookScript(\"OnShow\", UpdateGreetingPanel)\n\thooksecurefunc(\"QuestFrameGreetingPanel_OnShow\", UpdateGreetingPanel)\n\n\t-- QuestLog\n\tQuestLogPopupDetailFrameInset:StripTextures()\n\tQuestLogPopupDetailFrame:StripTextures()\n\tQuestLogPopupDetailFrame:CreateBackdrop(\"Transparent\")\n\tQuestLogPopupDetailFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tQuestLogPopupDetailFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\n\tT.SkinCloseButton(QuestLogPopupDetailFrameCloseButton, QuestLogPopupDetailFrame.backdrop)\n\n\tQuestLogPopupDetailFrameScrollFrame:StripTextures()\n\tQuestLogPopupDetailFrameScrollFrame:SetPoint(\"TOPLEFT\", 13, -65)\n\tT.SkinScrollBar(QuestLogPopupDetailFrameScrollFrameScrollBar)\n\n\tQuestLogPopupDetailFrame.ShowMapButton:SkinButton(true)\n\tQuestLogPopupDetailFrame.ShowMapButton.Text:ClearAllPoints()\n\tQuestLogPopupDetailFrame.ShowMapButton.Text:SetPoint(\"CENTER\", T.mult, 0)\n\tQuestLogPopupDetailFrame.ShowMapButton:SetSize(QuestLogPopupDetailFrame.ShowMapButton:GetWidth() - 30, QuestLogPopupDetailFrame.ShowMapButton:GetHeight() - 5)\n\n\tQuestLogPopupDetailFrame.AbandonButton:SkinButton()\n\tQuestLogPopupDetailFrame.TrackButton:SkinButton()\n\tQuestLogPopupDetailFrame.ShareButton:SkinButton()\n\tQuestLogPopupDetailFrame.ShareButton:ClearAllPoints()\n\tQuestLogPopupDetailFrame.ShareButton:SetPoint(\"LEFT\", QuestLogPopupDetailFrame.AbandonButton, \"RIGHT\", 3, 0)\n\tQuestLogPopupDetailFrame.ShareButton:SetPoint(\"RIGHT\", QuestLogPopupDetailFrame.TrackButton, \"LEFT\", -3, 0)\n\tQuestLogPopupDetailFrame.TrackButton:SetWidth(110)\n\tQuestLogPopupDetailFrame.TrackButton:SetPoint(\"BOTTOMRIGHT\", -4, 5)\n\n\tlocal function QuestObjectiveText()\n\t\tif not QuestInfoFrame.questLog then return end\n\t\tlocal numVisibleObjectives = 0\n\t\tlocal waypointText = C_QuestLog.GetNextWaypointText(C_QuestLog.GetSelectedQuest())\n\t\tif waypointText then\n\t\t\tnumVisibleObjectives = numVisibleObjectives + 1\n\t\t\tQuestInfoObjectivesFrame.Objectives[numVisibleObjectives]:SetTextColor(0.5, 0.5, 0.5)\n\t\tend\n\n\t\tfor i = 1, GetNumQuestLeaderBoards() do\n\t\t\tlocal _, type, finished = GetQuestLogLeaderBoard(i)\n\t\t\tif type ~= \"spell\" and type ~= \"log\" and numVisibleObjectives < MAX_OBJECTIVES then\n\t\t\t\tnumVisibleObjectives = numVisibleObjectives + 1\n\t\t\t\tif finished then\n\t\t\t\t\tQuestInfoObjectivesFrame.Objectives[numVisibleObjectives]:SetTextColor(1, 1, 1)\n\t\t\t\telse\n\t\t\t\t\tQuestInfoObjectivesFrame.Objectives[numVisibleObjectives]:SetTextColor(0.5, 0.5, 0.5)\n\t\t\t\tend\n\t\t\t\tQuestInfoObjectivesFrame.Objectives[numVisibleObjectives]:SetShadowOffset(1, -1)\n\t\t\tend\n\t\tend\n\tend\n\thooksecurefunc(\"QuestMapFrame_ShowQuestDetails\", QuestObjectiveText)\n\n\t-- Rewards\n\tlocal function SkinReward(button, mapReward)\n\t\tif button.NameFrame then button.NameFrame:Hide() end\n\t\tif button.CircleBackground then button.CircleBackground:Hide() end\n\t\tif button.CircleBackgroundGlow then button.CircleBackgroundGlow:Hide() end\n\t\tif button.ValueText then button.ValueText:SetPoint(\"BOTTOMRIGHT\", button.Icon, 0, 0) end\n\t\tif button.IconBorder then button.IconBorder:SetAlpha(0) end\n\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton:CreateBackdrop(\"Default\")\n\t\tbutton.backdrop:ClearAllPoints()\n\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", button.Icon, -2, 2)\n\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", button.Icon, 2, -2)\n\t\tif mapReward then\n\t\t\tbutton.Icon:SetSize(26, 26)\n\t\tend\n\tend\n\n\tlocal function SkinRewardSpell(button)\n\t\tlocal name = button:GetName()\n\t\tlocal icon = button.Icon\n\n\t\t_G[name..\"NameFrame\"]:Hide()\n\t\t_G[name..\"SpellBorder\"]:Hide()\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\tbutton:CreateBackdrop(\"Default\")\n\t\tbutton.backdrop:ClearAllPoints()\n\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", icon, -2, 2)\n\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", icon, 2, -2)\n\tend\n\n\tSkinRewardSpell(QuestInfoSpellObjectiveFrame)\n\n\tfor _, name in next, {\"HonorFrame\", \"MoneyFrame\", \"SkillPointFrame\", \"XPFrame\", \"ArtifactXPFrame\", \"TitleFrame\", \"WarModeBonusFrame\"} do\n\t\tSkinReward(MapQuestInfoRewardsFrame[name], true)\n\tend\n\n\tfor _, name in next, {\"HonorFrame\", \"SkillPointFrame\", \"ArtifactXPFrame\", \"WarModeBonusFrame\"} do\n\t\tSkinReward(QuestInfoRewardsFrame[name])\n\tend\n\n\thooksecurefunc(\"QuestInfo_GetRewardButton\", function(rewardsFrame, index)\n\t\tlocal button = rewardsFrame.RewardButtons[index]\n\t\tif not button.backdrop then\n\t\t\tSkinReward(button, rewardsFrame == MapQuestInfoRewardsFrame)\n\n\t\t\thooksecurefunc(button.IconBorder, \"SetVertexColor\", function(self, r, g, b)\n\t\t\t\tif r ~= BAG_ITEM_QUALITY_COLORS[1].r ~= r and g ~= BAG_ITEM_QUALITY_COLORS[1].g then\n\t\t\t\t\tself:GetParent().backdrop:SetBackdropBorderColor(r, g, b)\n\t\t\t\telse\n\t\t\t\t\tself:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\tend\n\t\t\t\tself:SetTexture(\"\")\n\t\t\tend)\n\n\t\t\thooksecurefunc(button.IconBorder, \"Hide\", function(self)\n\t\t\t\tself:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tend)\n\t\tend\n\tend)\n\n\t-- QuestInfo\n\tQuestInfoPlayerTitleFrame.FrameLeft:SetTexture()\n\tQuestInfoPlayerTitleFrame.FrameCenter:SetTexture()\n\tQuestInfoPlayerTitleFrame.FrameRight:SetTexture()\n\tQuestInfoPlayerTitleFrame.Icon:SkinIcon()\n\n\thooksecurefunc(\"QuestInfo_Display\", function(template, parentFrame)\n\t\t-- Headers\n\t\tQuestInfoTitleHeader:SetTextColor(1, 0.8, 0)\n\t\tQuestInfoTitleHeader:SetShadowColor(0, 0, 0)\n\t\tQuestInfoDescriptionHeader:SetTextColor(1, 0.8, 0)\n\t\tQuestInfoDescriptionHeader:SetShadowColor(0, 0, 0)\n\t\tQuestInfoObjectivesHeader:SetTextColor(1, 0.8, 0)\n\t\tQuestInfoObjectivesHeader:SetShadowColor(0, 0, 0)\n\t\tQuestInfoRewardsFrame.Header:SetTextColor(1, 0.8, 0)\n\t\tQuestInfoRewardsFrame.Header:SetShadowColor(0, 0, 0)\n\n\t\t-- Other text\n\t\tQuestInfoDescriptionText:SetTextColor(1, 1, 1)\n\t\tQuestInfoDescriptionText:SetShadowOffset(1, -1)\n\t\tQuestInfoObjectivesText:SetTextColor(1, 1, 1)\n\t\tQuestInfoObjectivesText:SetShadowOffset(1, -1)\n\t\tQuestInfoGroupSize:SetTextColor(1, 1, 1)\n\t\tQuestInfoGroupSize:SetShadowOffset(1, -1)\n\t\tQuestInfoRewardText:SetTextColor(1, 1, 1)\n\t\tQuestInfoRewardText:SetShadowOffset(1, -1)\n\t\tQuestInfoSpellObjectiveLearnLabel:SetTextColor(1, 1, 1)\n\t\tQuestInfoSpellObjectiveLearnLabel:SetShadowOffset(1, -1)\n\t\tQuestInfoQuestType:SetTextColor(1, 1, 1)\n\t\tQuestInfoQuestType:SetShadowOffset(1, -1)\n\n\t\t-- Reward frame text\n\t\tQuestInfoRewardsFrame.ItemChooseText:SetTextColor(1, 1, 1)\n\t\tQuestInfoRewardsFrame.ItemChooseText:SetShadowOffset(1, -1)\n\t\tQuestInfoRewardsFrame.ItemReceiveText:SetTextColor(1, 1, 1)\n\t\tQuestInfoRewardsFrame.ItemReceiveText:SetShadowOffset(1, -1)\n\t\tQuestInfoRewardsFrame.XPFrame.ReceiveText:SetTextColor(1, 1, 1)\n\t\tQuestInfoRewardsFrame.XPFrame.ReceiveText:SetShadowOffset(1, -1)\n\t\tQuestInfoRewardsFrame.PlayerTitleText:SetTextColor(1, 1, 1)\n\t\tQuestInfoRewardsFrame.PlayerTitleText:SetShadowOffset(1, -1)\n\n\t\tQuestObjectiveText()\n\n\t\tif template.canHaveSealMaterial then\n\t\t\tlocal questFrame = parentFrame:GetParent():GetParent()\n\t\t\tquestFrame.SealMaterialBG:Hide()\n\t\t\tlocal text = QuestInfoSealFrame.Text:GetText()\n\t\t\tif text and text:find(\"|cff042c54\") then\n\t\t\t\tQuestInfoSealFrame.Text:SetText(string.gsub(text, \"|cff042c54\", \"|cff1C86EE\"))\n\t\t\tend\n\t\tend\n\n\t\tlocal rewardsFrame = QuestInfoFrame.rewardsFrame\n\t\tlocal isQuestLog = QuestInfoFrame.questLog ~= nil\n\t\tlocal isMapQuest = rewardsFrame == MapQuestInfoRewardsFrame\n\n\t\tlocal numSpellRewards = isQuestLog and GetNumQuestLogRewardSpells() or GetNumRewardSpells()\n\t\tif numSpellRewards > 0 then\n\t\t\t-- Spell Headers\n\t\t\tfor spellHeader in rewardsFrame.spellHeaderPool:EnumerateActive() do\n\t\t\t\tspellHeader:SetVertexColor(1, 1, 1)\n\t\t\tend\n\t\t\t-- Follower Rewards\n\t\t\tfor followerReward in rewardsFrame.followerRewardPool:EnumerateActive() do\n\t\t\t\tif not followerReward.isSkinned then\n\t\t\t\t\tfollowerReward:CreateBackdrop(\"Overlay\")\n\t\t\t\t\tfollowerReward.backdrop:SetAllPoints(followerReward.BG)\n\t\t\t\t\tfollowerReward.backdrop:SetPoint(\"TOPLEFT\", 45, -5)\n\t\t\t\t\tfollowerReward.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 5)\n\t\t\t\t\tfollowerReward.BG:Hide()\n\t\t\t\t\tfollowerReward.isSkinned = true\n\n\t\t\t\t\tfollowerReward.PortraitFrame:SetWidth(followerReward.PortraitFrame:GetHeight())\n\t\t\t\t\tfollowerReward.PortraitFrame:ClearAllPoints()\n\t\t\t\t\tfollowerReward.PortraitFrame:SetPoint(\"RIGHT\", followerReward.backdrop, \"LEFT\", -2, 0)\n\n\t\t\t\t\tfollowerReward.PortraitFrame.PortraitRing:Hide()\n\t\t\t\t\tfollowerReward.PortraitFrame.PortraitRingQuality:SetTexture()\n\t\t\t\t\tfollowerReward.PortraitFrame.LevelBorder:SetAlpha(0)\n\t\t\t\t\tfollowerReward.PortraitFrame.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)\n\n\t\t\t\t\tlocal level = followerReward.PortraitFrame.Level\n\t\t\t\t\tlevel:ClearAllPoints()\n\t\t\t\t\tlevel:SetPoint(\"BOTTOM\", followerReward.PortraitFrame, 0, 5)\n\t\t\t\t\tlevel:SetFontObject(\"SystemFont_Outline_Small\")\n\t\t\t\t\tlevel:SetShadowOffset(0, 0)\n\n\t\t\t\t\tlocal squareBG = CreateFrame(\"Frame\", nil, followerReward.PortraitFrame)\n\t\t\t\t\tsquareBG:SetFrameLevel(followerReward.PortraitFrame:GetFrameLevel()-1)\n\t\t\t\t\tsquareBG:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\t\tsquareBG:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\t\tsquareBG:SetTemplate(\"Default\")\n\t\t\t\t\tfollowerReward.PortraitFrame.squareBG = squareBG\n\n\t\t\t\t\tfollowerReward.PortraitFrame.Portrait:SetPoint(\"TOPLEFT\", squareBG, 2, -2)\n\t\t\t\t\tfollowerReward.PortraitFrame.Portrait:SetPoint(\"BOTTOMRIGHT\", squareBG, -2, 2)\n\n\t\t\t\t\t-- AdventuresFollowerPortraitFrame\n\t\t\t\t\tlocal portrait = followerReward.AdventuresFollowerPortraitFrame\n\t\t\t\t\tportrait:SetWidth(portrait:GetHeight() - 2)\n\t\t\t\t\tportrait:ClearAllPoints()\n\t\t\t\t\tportrait:SetPoint(\"RIGHT\", followerReward.backdrop, \"LEFT\", -2, 0)\n\n\t\t\t\t\tportrait.CircleMask:Hide()\n\t\t\t\t\tportrait.PuckBorder:Hide()\n\t\t\t\t\tportrait.LevelDisplayFrame.LevelCircle:SetAlpha(0)\n\n\t\t\t\t\tlocal level = portrait.LevelDisplayFrame.LevelText\n\t\t\t\t\tlevel:ClearAllPoints()\n\t\t\t\t\tlevel:SetPoint(\"BOTTOM\", portrait, 0, 5)\n\t\t\t\t\tlevel:SetFontObject(\"SystemFont_Outline_Small\")\n\t\t\t\t\tlevel:SetShadowOffset(0, 0)\n\n\t\t\t\t\tif not portrait.backdrop then\n\t\t\t\t\t\tportrait:CreateBackdrop(\"Default\")\n\t\t\t\t\t\tportrait.backdrop:SetPoint(\"TOPLEFT\", portrait, \"TOPLEFT\", -1, 1)\n\t\t\t\t\t\tportrait.backdrop:SetPoint(\"BOTTOMRIGHT\", portrait, \"BOTTOMRIGHT\", 1, -1)\n\t\t\t\t\t\tportrait.backdrop:SetFrameLevel(portrait:GetFrameLevel())\n\t\t\t\t\tend\n\n\t\t\t\t\tportrait.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)\n\t\t\t\t\tportrait.Portrait:ClearAllPoints()\n\t\t\t\t\tportrait.Portrait:SetInside(portrait.backdrop, 3, 3)\n\n\t\t\t\t\tlocal point, relativeTo, relativePoint, _, yOfs = followerReward:GetPoint()\n\t\t\t\t\tfollowerReward:SetPoint(point, relativeTo, relativePoint, 8, yOfs)\n\t\t\t\tend\n\t\t\t\tlocal r, g, b = followerReward.PortraitFrame.PortraitRingQuality:GetVertexColor()\n\t\t\t\tif r > 0.99 and r < 1 then\n\t\t\t\t\tr, g, b = unpack(C.media.border_color)\n\t\t\t\tend\n\t\t\t\tfollowerReward.PortraitFrame.squareBG:SetBackdropBorderColor(r, g, b)\n\t\t\tend\n\t\t\t-- Spell Rewards\n\t\t\tfor spellReward in rewardsFrame.spellRewardPool:EnumerateActive() do\n\t\t\t\tif not spellReward.isSkinned then\n\t\t\t\t\tSkinReward(spellReward)\n\t\t\t\t\tif not isMapQuest then\n\t\t\t\t\t\tlocal border = select(3, spellReward:GetRegions())\n\t\t\t\t\t\tborder:Hide()\n\n\t\t\t\t\t\tspellReward.Icon:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\t\t\t\tspellReward:SetHitRectInsets(0, 0, 0, 0)\n\t\t\t\t\t\tspellReward:SetSize(147, 41)\n\t\t\t\t\tend\n\t\t\t\t\tspellReward.isSkinned = true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\t-- Reputation Rewards\n\t\tfor repReward in rewardsFrame.reputationRewardPool:EnumerateActive() do\n\t\t\tif not repReward.isSkinned then\n\t\t\t\tSkinReward(repReward, isMapQuest)\n\t\t\t\trepReward.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(QuestInfoRequiredMoneyText, \"SetTextColor\", function(self, r)\n\t\tif r == 0 then\n\t\t\tself:SetTextColor(1, 0.8, 0)\n\t\telseif r == 0.2 then\n\t\t\tself:SetTextColor(0.6, 0.6, 0.6)\n\t\tend\n\tend)\n\n\tQuestInfoItemHighlight:StripTextures()\n\tQuestInfoItemHighlight:SetTemplate(\"Default\")\n\tQuestInfoItemHighlight:SetBackdropBorderColor(1, 1, 0)\n\tQuestInfoItemHighlight:SetBackdropColor(1, 1, 1, 0.2)\n\n\thooksecurefunc(\"QuestInfoItem_OnClick\", function(self)\n\t\tif self.type == \"choice\" then\n\t\t\tQuestInfoItemHighlight:ClearAllPoints()\n\t\t\tQuestInfoItemHighlight:SetPoint(\"TOPLEFT\", self.Icon, \"TOPLEFT\", -2, 2)\n\t\t\tQuestInfoItemHighlight:SetPoint(\"BOTTOMRIGHT\", self.Icon, \"BOTTOMRIGHT\", 2, -2)\n\n\t\t\tlocal parent = self:GetParent()\n\t\t\tfor i = 1, #parent.RewardButtons do\n\t\t\t\tlocal questItem = QuestInfoRewardsFrame.RewardButtons[i]\n\t\t\t\tif questItem ~= self then\n\t\t\t\t\tquestItem.Name:SetTextColor(1, 1, 1)\n\t\t\t\telse\n\t\t\t\t\tself.Name:SetTextColor(1, 1, 0)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(\"QuestInfo_Display\", function()\n\t\tfor i = 1, #QuestInfoRewardsFrame.RewardButtons do\n\t\t\tlocal questItem = QuestInfoRewardsFrame.RewardButtons[i]\n\t\t\tif not questItem:IsShown() then break end\n\n\t\t\tlocal point, relativeTo, relativePoint, _, y = questItem:GetPoint()\n\t\t\tif point and relativeTo and relativePoint then\n\t\t\t\tif i == 1 then\n\t\t\t\t\tquestItem:SetPoint(point, relativeTo, relativePoint, 0, y)\n\t\t\t\telseif relativePoint == \"BOTTOMLEFT\" then\n\t\t\t\t\tquestItem:SetPoint(point, relativeTo, relativePoint, 0, -5)\n\t\t\t\telse\n\t\t\t\t\tquestItem:SetPoint(point, relativeTo, relativePoint, 5, 0)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tquestItem.Name:SetTextColor(1, 1, 1)\n\t\tend\n\tend)\n\n\t-- NPC Model\n\tQuestModelScene:StripTextures()\n\tQuestModelScene:CreateBackdrop(\"Overlay\")\n\tQuestModelScene.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha)\n\tQuestNPCModelNameTooltipFrame:CreateBackdrop(\"Overlay\")\n\tQuestNPCModelNameTooltipFrame.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha)\n\tQuestNPCModelNameTooltipFrame.backdrop:SetPoint(\"TOPLEFT\", QuestModelScene.backdrop, \"BOTTOMLEFT\", 0, -3)\n\tQuestNPCModelNameTooltipFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", QuestNPCModelTextFrame, \"BOTTOMRIGHT\", 2, -1)\n\tQuestNPCModelNameText:SetPoint(\"TOPLEFT\", QuestNPCModelNameplate, 15, -20)\n\tQuestNPCModelNameText:SetPoint(\"BOTTOMRIGHT\", QuestNPCModelNameplate, -15, 7)\n\tQuestNPCModelTextFrame:SetHeight(85)\n\tQuestNPCModelTextFrame:StripTextures()\n\thooksecurefunc(\"QuestFrame_ShowQuestPortrait\", function(parentFrame, _, _, _, _, _, x, y)\n\t\tif parentFrame == QuestLogPopupDetailFrame or parentFrame == QuestFrame then\n\t\t\tx = x + 8\n\t\t\ty = y + 40\n\n\t\t\tQuestModelScene.backdrop.overlay:Hide()\n\t\t\tQuestNPCModelNameTooltipFrame.backdrop.overlay:Hide()\n\t\telse\n\t\t\tQuestModelScene.backdrop.overlay:Show()\n\t\t\tQuestNPCModelNameTooltipFrame.backdrop.overlay:Show()\n\t\tend\n\t\tQuestModelScene:ClearAllPoints()\n\t\tQuestModelScene:SetPoint(\"TOPLEFT\", parentFrame, \"TOPRIGHT\", x, y)\n\tend)\n\n\t-- Expand amd Collapse buttons\n\tlocal function SkinExpandOrCollapse(f)\n\t\tlocal bg = CreateFrame(\"Frame\", nil, f)\n\t\tbg:SetSize(13, 13)\n\t\tbg:SetPoint(\"TOPLEFT\", f:GetNormalTexture(), 0, -1)\n\t\tbg:SetTemplate(\"Overlay\")\n\t\tf.bg = bg\n\n\t\tbg.minus = bg:CreateTexture(nil, \"OVERLAY\")\n\t\tbg.minus:SetSize(5, 1)\n\t\tbg.minus:SetPoint(\"CENTER\")\n\t\tbg.minus:SetTexture(C.media.blank)\n\n\t\tbg.plus = bg:CreateTexture(nil, \"OVERLAY\")\n\t\tbg.plus:SetSize(1, 5)\n\t\tbg.plus:SetPoint(\"CENTER\")\n\t\tbg.plus:SetTexture(C.media.blank)\n\t\tbg.plus:Hide()\n\n\t\thooksecurefunc(f, \"SetNormalAtlas\", function(self, texture)\n\t\t\tif self.settingTexture then return end\n\t\t\tself.settingTexture = true\n\t\t\tself:SetNormalTexture(0)\n\n\t\t\tif texture and texture ~= \"\" then\n\t\t\t\tif texture:find(\"Closed\") then\n\t\t\t\t\tself.bg.plus:Show()\n\t\t\t\telseif texture:find(\"Open\") then\n\t\t\t\t\tself.bg.plus:Hide()\n\t\t\t\tend\n\t\t\t\tself.bg:Show()\n\t\t\telse\n\t\t\t\tself.bg:Hide()\n\t\t\tend\n\t\t\tself.settingTexture = nil\n\t\tend)\n\n\t\thooksecurefunc(f, \"SetPushedAtlas\", function(self)\n\t\t\tif self.settingTexture then return end\n\t\t\tself.settingTexture = true\n\t\t\tself:SetPushedTexture(0)\n\n\t\t\tself.settingTexture = nil\n\t\tend)\n\n\t\thooksecurefunc(f, \"SetHighlightTexture\", function(self, texture)\n\t\t\tif texture == \"Interface\\\\Buttons\\\\UI-PlusButton-Hilight\" then\n\t\t\t\tself:SetHighlightTexture(0)\n\t\t\tend\n\t\tend)\n\n\t\tf:HookScript(\"OnEnter\", function(self)\n\t\t\tself.bg:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\t\tif self.bg.overlay then\n\t\t\t\tself.bg.overlay:SetVertexColor(C.media.classborder_color[1] * 0.3, C.media.classborder_color[2] * 0.3, C.media.classborder_color[3] * 0.3, 1)\n\t\t\tend\n\t\tend)\n\n\t\tf:HookScript(\"OnLeave\", function(self)\n\t\t\tself.bg:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\tif self.bg.overlay then\n\t\t\t\tself.bg.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\n\t\t\tend\n\t\tend)\n\tend\n\n\t-- Campaign\n\tlocal campaignColor = {\n\t\tBastion = {0.45, 0.4, 0.4, 1},\n\t\tMaldraxxus = {0.1, 0.3, 0.15, 1},\n\t\tArdenweald = {0.15, 0.25, 0.35, 1},\n\t\tRevendreth = {0.25, 0.1, 0.1, 1},\n\t\tKyrian = {0.45, 0.4, 0.4, 1},\n\t\tNecrolord = {0.1, 0.3, 0.15, 1},\n\t\tFey = {0.15, 0.25, 0.35, 1},\n\t\tVenthyr = {0.25, 0.1, 0.1, 1},\n\t\tShadowlands = {0.15, 0.2, 0.4, 1}\n\t}\n\n\thooksecurefunc(\"QuestLogQuests_Update\", function()\n\t\tfor i = 1, QuestMapFrame.QuestsFrame.Contents:GetNumChildren() do\n\t\t\tlocal child = select(i, QuestMapFrame.QuestsFrame.Contents:GetChildren())\n\t\t\tif child and child.ButtonText and not child.Text then\n\t\t\t\tif not child.isSkinned then\n\t\t\t\t\tSkinExpandOrCollapse(child)\n\t\t\t\t\tchild.isSkinned = true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tfor campaignHeader in QuestScrollFrame.campaignHeaderFramePool:EnumerateActive() do\n\t\t\tlocal campaign = campaignHeader:GetCampaign()\n\t\t\tif campaign then\n\t\t\t\tif not campaignHeader.backdrop then\n\t\t\t\t\tcampaignHeader:CreateBackdrop(\"Overlay\")\n\t\t\t\t\tcampaignHeader.backdrop:SetPoint(\"TOPLEFT\", campaignHeader.Background, 6, -2)\n\t\t\t\t\tcampaignHeader.backdrop:SetPoint(\"BOTTOMRIGHT\", campaignHeader.Background, -6, 10)\n\n\t\t\t\t\tcampaignHeader.SelectedHighlight:SetAlpha(0)\n\t\t\t\t\tcampaignHeader.HighlightTexture:SetAlpha(0)\n\t\t\t\t\tcampaignHeader.Background:SetAlpha(0)\n\t\t\t\t\tcampaignHeader.TopFiligree:Hide()\n\t\t\t\t\tSkinExpandOrCollapse(campaignHeader.CollapseButton)\n\t\t\t\tend\n\t\t\t\tif campaignHeader.backdrop then\n\t\t\t\t\tif campaignColor[campaign.uiTextureKit] then\n\t\t\t\t\t\tcampaignHeader.backdrop.overlay:SetVertexColor(unpack(campaignColor[campaign.uiTextureKit]))\n\t\t\t\t\telse\n\t\t\t\t\t\tcampaignHeader.backdrop.overlay:SetVertexColor(1, 1, 1, 0.2)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tfor callingHeader in QuestScrollFrame.covenantCallingsHeaderFramePool:EnumerateActive() do\n\t\t\tif not callingHeader.backdrop then\n\t\t\t\tcallingHeader:CreateBackdrop(\"Overlay\")\n\t\t\t\tcallingHeader.backdrop:SetPoint(\"TOPLEFT\", callingHeader.Background, 7, -2)\n\t\t\t\tcallingHeader.backdrop:SetPoint(\"BOTTOMRIGHT\", callingHeader.Background, -5, 10)\n\t\t\t\tcallingHeader.backdrop.overlay:SetVertexColor(1, 1, 1, 0.2)\n\n\t\t\t\tcallingHeader.Background:SetAlpha(0)\n\t\t\t\tcallingHeader.HighlightBackground:SetAlpha(0)\n\t\t\t\tcallingHeader.SelectedTexture:SetAlpha(0)\n\t\t\t\tcallingHeader.Divider:SetAlpha(0)\n\t\t\tend\n\t\tend\n\t\tfor header in QuestScrollFrame.campaignHeaderMinimalFramePool:EnumerateActive() do\n\t\t\tif not header.CollapseButton.styled then\n\t\t\t\tSkinExpandOrCollapse(header.CollapseButton)\n\t\t\t\theader.CollapseButton.styled = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/QuickKeybind.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tQuickKeybind skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = _G.QuickKeybindFrame\n\tT.SkinFrame(frame)\n\n\tframe.Header:StripTextures()\n\n\tT.SkinCheckBox(frame.UseCharacterBindingsButton, 26)\n\tframe.OkayButton:SkinButton()\n\tframe.DefaultsButton:SkinButton()\n\tframe.CancelButton:SkinButton()\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Raid.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tRaidUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal StripAllTextures = {\n\t\t\"RaidGroup1\",\n\t\t\"RaidGroup2\",\n\t\t\"RaidGroup3\",\n\t\t\"RaidGroup4\",\n\t\t\"RaidGroup5\",\n\t\t\"RaidGroup6\",\n\t\t\"RaidGroup7\",\n\t\t\"RaidGroup8\"\n\t}\n\n\tfor _, object in pairs(StripAllTextures) do\n\t\t_G[object]:StripTextures()\n\tend\n\n\tfor i = 1, MAX_RAID_GROUPS * 5 do\n\t\t_G[\"RaidGroupButton\"..i]:SkinButton(true)\n\tend\n\n\tfor i = 1, 8 do\n\t\tfor j = 1, 5 do\n\t\t\t_G[\"RaidGroup\"..i..\"Slot\"..j]:StripTextures()\n\t\t\t_G[\"RaidGroup\"..i..\"Slot\"..j]:SetTemplate(\"Transparent\")\n\t\tend\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_RaidUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/RaidInfo.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tRaidInfo skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal StripAllTextures = {\n\t\tRaidInfoScrollFrame,\n\t\tRaidInfoFrame,\n\t\tRaidInfoInstanceLabel,\n\t\tRaidInfoIDLabel,\n\t\tRaidInfoFrame.Header\n\t}\n\n\tlocal KillTextures = {\n\t\tRaidInfoScrollFrameScrollBarBG,\n\t\tRaidInfoScrollFrameScrollBarTop,\n\t\tRaidInfoScrollFrameScrollBarBottom,\n\t\tRaidInfoScrollFrameScrollBarMiddle\n\t}\n\n\tlocal buttons = {\n\t\tRaidFrameConvertToRaidButton,\n\t\tRaidFrameRaidInfoButton,\n\t\tRaidInfoExtendButton,\n\t\tRaidInfoCancelButton\n\t}\n\n\tfor _, object in pairs(StripAllTextures) do\n\t\tobject:StripTextures()\n\tend\n\n\tfor _, texture in pairs(KillTextures) do\n\t\ttexture:Kill()\n\tend\n\n\tfor i = 1, #buttons do\n\t\tlocal button = buttons[i]\n\t\tif button then\n\t\t\tbutton:SkinButton()\n\t\tend\n\tend\n\n\tRaidInfoFrame:CreateBackdrop(\"Transparent\")\n\tRaidInfoFrame.backdrop:SetPoint(\"TOPLEFT\", RaidInfoFrame, \"TOPLEFT\")\n\tRaidInfoFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", RaidInfoFrame, \"BOTTOMRIGHT\")\n\tRaidInfoFrame:SetPoint(\"TOPLEFT\", FriendsFrame, \"TOPRIGHT\", 3, 0)\n\tT.SkinCloseButton(RaidInfoCloseButton, RaidInfoFrame)\n\tT.SkinCheckBox(RaidFrameAllAssistCheckButton)\n\tT.SkinScrollBar(RaidInfoFrame.ScrollBar)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Runeforge.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tRuneforge skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = RuneforgeFrame\n\tT.SkinCloseButton(frame.CloseButton)\n\tframe.CloseButton:SetPoint(\"TOPRIGHT\", -50, 0)\n\n\tframe.CreateFrame.CraftItemButton:SkinButton()\n\n\tlocal powerFrame = frame.CraftingFrame.PowerFrame\n\tpowerFrame:StripTextures()\n\tpowerFrame:CreateBackdrop(\"Overlay\")\n\n\tlocal pageControl = powerFrame.PageControl\n\tT.SkinNextPrevButton(pageControl.BackwardButton)\n\tT.SkinNextPrevButton(pageControl.ForwardButton)\n\n\thooksecurefunc(powerFrame.PowerList, \"RefreshListDisplay\", function(list)\n\t\tif not list.elements then return end\n\n\t\tfor i = 1, list:GetNumElementFrames() do\n\t\t\tlocal button = list.elements[i]\n\t\t\tif button and not button.IsSkinned then\n\t\t\t\tbutton.Border:SetAlpha(0)\n\t\t\t\tbutton.CircleMask:Hide()\n\t\t\t\tbutton.Icon:SkinIcon()\n\n\t\t\t\tbutton.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_RuneforgeUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Scrapping.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tScrappingMachine skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = ScrappingMachineFrame\n\tT.SkinFrame(frame)\n\n\tframe.ScrapButton:SkinButton()\n\n\tlocal ItemSlots = frame.ItemSlots\n\tItemSlots:StripTextures()\n\n\tfor button in pairs(ItemSlots.scrapButtons.activeObjects) do\n\t\tif not button.styled then\n\t\t\tbutton:SetHighlightTexture(0)\n\t\t\tbutton.Icon:SkinIcon()\n\t\t\tbutton.IconBorder:SetAlpha(0)\n\t\t\thooksecurefunc(button.IconBorder, \"SetVertexColor\", function(_, r, g, b) button.backdrop:SetBackdropBorderColor(r, g, b) end)\n\t\t\thooksecurefunc(button.IconBorder, \"Hide\", function() button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end)\n\n\t\t\tbutton.styled = true\n\t\tend\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_ScrappingMachineUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Soulbinds.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSoulbinds skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = SoulbindViewer\n\tT.SkinCloseButton(frame.CloseButton)\n\n\tframe:StripTextures()\n\tframe:CreateBackdrop(\"Transparent\")\n\tframe.Background:Hide()\n\n\tframe.CommitConduitsButton:SkinButton()\n\tframe.ActivateSoulbindButton:SkinButton()\n\n\tlocal function SkinConduitList(frame)\n\t\tlocal header = frame.CategoryButton.Container\n\t\tif not header.backdrop then\n\t\t\theader:DisableDrawLayer(\"BACKGROUND\")\n\t\t\theader:CreateBackdrop(\"Overlay\")\n\t\t\theader.backdrop:SetPoint(\"TOPLEFT\", 2, 0)\n\t\t\theader.backdrop:SetPoint(\"BOTTOMRIGHT\", 15, 0)\n\t\tend\n\n\t\tfor button in frame.pool:EnumerateActive() do\n\t\t\tif not button.styled then\n\t\t\t\tfor _, element in ipairs(button.Hovers) do\n\t\t\t\t\tlocal _, sublevel = element:GetDrawLayer()\n\t\t\t\t\tif sublevel == 4 then -- Highlight texture\n\t\t\t\t\t\telement:SetColorTexture(1, 1, 1, 0.3)\n\t\t\t\t\t\telement:SetPoint(\"TOPLEFT\", button, \"TOPLEFT\", 11, 0)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tbutton.PendingBackground:SetColorTexture(0.9, 0.8, 0.1, 0.3)\n\t\t\t\tbutton.PendingBackground:SetPoint(\"TOPLEFT\", button, \"TOPLEFT\", 11, 0)\n\n\t\t\t\tbutton.styled = true\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal numChildrenStyled = 0\n\thooksecurefunc(SoulbindViewer.ConduitList.ScrollBox, \"Update\", function(self)\n\t\tlocal numChildren = self.ScrollTarget:GetNumChildren()\n\t\tif numChildren > numChildrenStyled then\n\t\t\tfor i = 1, numChildren do\n\t\t\t\tlocal list = select(i, self.ScrollTarget:GetChildren())\n\t\t\t\tif list and not list.hooked then\n\t\t\t\t\thooksecurefunc(list, \"Layout\", SkinConduitList)\n\t\t\t\t\tlist.hooked = true\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tnumChildrenStyled = numChildren\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_Soulbinds\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/SpellBook.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSpellBook skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal StripAllTextures = {\n\t\t\"SpellBookFrame\",\n\t\t\"SpellBookFrameInset\",\n\t\t\"SpellBookSpellIconsFrame\",\n\t\t\"SpellBookSideTabsFrame\",\n\t\t\"SpellBookPageNavigationFrame\"\n\t}\n\n\tlocal KillTextures = {\n\t\t\"SpellBookPage1\",\n\t\t\"SpellBookPage2\"\n\t}\n\n\tfor _, object in pairs(StripAllTextures) do\n\t\t_G[object]:StripTextures()\n\tend\n\n\tfor _, texture in pairs(KillTextures) do\n\t\t_G[texture]:Kill()\n\tend\n\n\tlocal pagebackdrop = CreateFrame(\"Frame\", nil, SpellBookPage1:GetParent())\n\tpagebackdrop:SetTemplate(\"Overlay\")\n\tpagebackdrop:SetPoint(\"TOPLEFT\", SpellBookFrame, \"TOPLEFT\", 50, -50)\n\tpagebackdrop:SetPoint(\"BOTTOMRIGHT\", SpellBookFrame, \"BOTTOMRIGHT\", -26, 23)\n\n\tT.SkinNextPrevButton(SpellBookPrevPageButton)\n\tT.SkinNextPrevButton(SpellBookNextPageButton)\n\tSpellBookNextPageButton:SetPoint(\"BOTTOMRIGHT\", pagebackdrop, \"BOTTOMRIGHT\", -15, 10)\n\tSpellBookPrevPageButton:SetPoint(\"BOTTOMRIGHT\", SpellBookNextPageButton, \"BOTTOMLEFT\", -6, 0)\n\n\tSpellBookFramePortrait:SetAlpha(0)\n\tSpellBookFrameTutorialButton.Ring:Hide()\n\tSpellBookFrameTutorialButton:SetPoint(\"TOPLEFT\", SpellBookFrame, \"TOPLEFT\", -5, 10)\n\n\t-- Skin SpellButtons\n\tlocal function SpellButtons()\n\t\tif _G.SpellBookFrame.bookType == BOOKTYPE_PROFESSION then return end\n\n\t\tfor i = 1, _G.SPELLS_PER_PAGE do\n\t\t\tlocal button = _G[\"SpellButton\"..i]\n\n\t\t\tbutton.SpellSubName:SetTextColor(0.6, 0.6, 0.6)\n\t\t\tbutton.RequiredLevelString:SetTextColor(0.6, 0.6, 0.6)\n\n\t\t\tlocal r = button.SpellName:GetTextColor()\n\t\t\tif r < 0.8 then\n\t\t\t\tbutton.SpellName:SetTextColor(0.6, 0.6, 0.6)\n\t\t\telseif r ~= 1 then\n\t\t\t\tbutton.SpellName:SetTextColor(1, 1, 1)\n\t\t\tend\n\t\tend\n\tend\n\n\tfor i = 1, SPELLS_PER_PAGE do\n\t\tlocal button = _G[\"SpellButton\"..i]\n\t\tlocal icon = _G[\"SpellButton\"..i..\"IconTexture\"]\n\t\tlocal highlight = _G[\"SpellButton\"..i..\"Highlight\"]\n\n\t\t_G[\"SpellButton\"..i..\"SlotFrame\"]:SetAlpha(0)\n\n\t\tbutton.EmptySlot:SetAlpha(0)\n\t\tbutton.TextBackground:Hide()\n\t\tbutton.TextBackground2:Hide()\n\t\tbutton.UnlearnedFrame:SetAlpha(0)\n\t\tbutton:SetCheckedTexture(0)\n\t\tbutton:SetPushedTexture(0)\n\n\t\tif highlight then\n\t\t\thighlight:ClearAllPoints()\n\t\t\thighlight:SetAllPoints(icon)\n\n\t\t\thooksecurefunc(highlight, \"SetTexture\", function(button, texture)\n\t\t\t\tif texture == [[Interface\\Buttons\\ButtonHilight-Square]] then\n\t\t\t\t\tbutton:SetColorTexture(1, 1, 1, 0.3)\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\n\t\tif icon then\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ticon:ClearAllPoints()\n\t\t\ticon:SetAllPoints()\n\n\t\t\tif not button.backdrop then\n\t\t\t\tbutton:SetFrameLevel(button:GetFrameLevel() + 1)\n\t\t\t\tbutton:CreateBackdrop(\"Default\")\n\t\t\tend\n\t\tend\n\n\t\thooksecurefunc(button, \"UpdateButton\", SpellButtons)\n\tend\n\n\tSpellBookPageText:SetTextColor(0.6, 0.6, 0.6)\n\n\t-- Skill Line Tabs\n\tfor i = 1, MAX_SKILLLINE_TABS do\n\t\tlocal tab = _G[\"SpellBookSkillLineTab\"..i]\n\t\t_G[\"SpellBookSkillLineTab\"..i..\"Flash\"]:Kill()\n\t\tif tab then\n\t\t\ttab:StripTextures()\n\t\t\ttab:GetNormalTexture():ClearAllPoints()\n\t\t\ttab:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\ttab:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\ttab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\ttab:SetTemplate(\"Default\")\n\t\t\ttab:StyleButton(true)\n\n\t\t\tlocal point, relatedTo, point2 = tab:GetPoint()\n\t\t\ttab:SetPoint(point, relatedTo, point2, 16, -1)\n\t\tend\n\tend\n\n\thooksecurefunc(\"SpellBookFrame_UpdateSkillLineTabs\", function()\n\t\tfor i = 1, MAX_SKILLLINE_TABS do\n\t\t\tlocal tab = _G[\"SpellBookSkillLineTab\"..i]\n\t\t\tif tab:GetNormalTexture() then\n\t\t\t\ttab:GetNormalTexture():ClearAllPoints()\n\t\t\t\ttab:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\ttab:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\t\ttab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tend\n\t\tend\n\tend)\n\n\tSpellBookFrame:CreateBackdrop(\"Transparent\")\n\tSpellBookFrame.backdrop:SetPoint(\"TOPLEFT\", 5, -1)\n\tSpellBookFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 15, -1)\n\n\tT.SkinCloseButton(SpellBookFrameCloseButton, SpellBookFrame.backdrop)\n\n\t-- Profession Tab\n\tlocal professionbuttons = {\n\t\t\"PrimaryProfession1SpellButtonTop\",\n\t\t\"PrimaryProfession1SpellButtonBottom\",\n\t\t\"PrimaryProfession2SpellButtonTop\",\n\t\t\"PrimaryProfession2SpellButtonBottom\",\n\t\t\"SecondaryProfession1SpellButtonLeft\",\n\t\t\"SecondaryProfession1SpellButtonRight\",\n\t\t\"SecondaryProfession2SpellButtonLeft\",\n\t\t\"SecondaryProfession2SpellButtonRight\",\n\t\t\"SecondaryProfession3SpellButtonLeft\",\n\t\t\"SecondaryProfession3SpellButtonRight\"\n\t}\n\n\tlocal professionheaders = {\n\t\t\"PrimaryProfession1\",\n\t\t\"PrimaryProfession2\",\n\t\t\"SecondaryProfession1\",\n\t\t\"SecondaryProfession2\",\n\t\t\"SecondaryProfession3\"\n\t}\n\n\tfor _, header in pairs(professionheaders) do\n\t\t_G[header..\"Missing\"]:SetTextColor(1, 0.8, 0)\n\t\t_G[header..\"Missing\"]:SetShadowColor(0, 0, 0)\n\t\t_G[header..\"Missing\"]:SetShadowOffset(1, -1)\n\t\t_G[header].missingText:SetTextColor(0.6, 0.6, 0.6)\n\tend\n\n\tfor _, button in pairs(professionbuttons) do\n\t\tlocal icon = _G[button..\"IconTexture\"]\n\t\tlocal rank = _G[button..\"SubSpellName\"]\n\t\tlocal button = _G[button]\n\t\tbutton:StripTextures()\n\n\t\tif rank then\n\t\t\trank:SetTextColor(1, 1, 1)\n\t\tend\n\n\t\tbutton:GetCheckedTexture():SetColorTexture(0, 1, 0, 0.3)\n\t\tbutton:GetCheckedTexture():SetPoint(\"TOPLEFT\", button, 4, -4)\n\t\tbutton:GetCheckedTexture():SetPoint(\"BOTTOMRIGHT\", button, -4, 4)\n\n\t\tbutton.cooldown:SetPoint(\"TOPLEFT\", button, 4, -4)\n\t\tbutton.cooldown:SetPoint(\"BOTTOMRIGHT\", button, -4, 4)\n\n\t\tif icon then\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ticon:ClearAllPoints()\n\t\t\ticon:SetPoint(\"TOPLEFT\", 4, -4)\n\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", -4, 4)\n\n\t\t\tif not button.backdrop then\n\t\t\t\tbutton:SetFrameLevel(button:GetFrameLevel() + 2)\n\t\t\t\tbutton:CreateBackdrop(\"Default\")\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\tend\n\t\tend\n\tend\n\n\thooksecurefunc(\"UpdateProfessionButton\", function()\n\t\tfor _, button in pairs(professionbuttons) do\n\t\t\tlocal button = _G[button]\n\t\t\tbutton:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3)\n\t\t\tbutton:GetHighlightTexture():SetPoint(\"TOPLEFT\", button, 4, -4)\n\t\t\tbutton:GetHighlightTexture():SetPoint(\"BOTTOMRIGHT\", button, -4, 4)\n\t\tend\n\tend)\n\n\tlocal professionstatusbars = {\n\t\t\"PrimaryProfession1StatusBar\",\n\t\t\"PrimaryProfession2StatusBar\",\n\t\t\"SecondaryProfession1StatusBar\",\n\t\t\"SecondaryProfession2StatusBar\",\n\t\t\"SecondaryProfession3StatusBar\"\n\t}\n\n\tfor _, statusbar in pairs(professionstatusbars) do\n\t\tlocal statusbar = _G[statusbar]\n\t\tstatusbar:StripTextures()\n\t\tstatusbar:SetStatusBarTexture(C.media.texture)\n\t\tstatusbar:SetStatusBarColor(0, 0.8, 0)\n\t\tstatusbar:CreateBackdrop(\"Overlay\")\n\n\t\tstatusbar.rankText:ClearAllPoints()\n\t\tstatusbar.rankText:SetPoint(\"CENTER\")\n\tend\n\n\t-- Bottom Tabs\n\tfor i = 1, 5 do\n\t\tT.SkinTab(_G[\"SpellBookFrameTabButton\"..i])\n\tend\n\t_G[\"SpellBookFrameTabButton1\"]:ClearAllPoints()\n\t_G[\"SpellBookFrameTabButton1\"]:SetPoint(\"TOPLEFT\", _G[\"SpellBookFrame\"], \"BOTTOMLEFT\", 5, 1)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Subscription.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSubscriptionInterstitialUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = SubscriptionInterstitialFrame\n\tT.SkinCloseButton(frame.CloseButton)\n\n\tframe:StripTextures()\n\tframe:SetTemplate(\"Transparent\")\n\tframe.ShadowOverlay:Hide()\n\n\tframe.ClosePanelButton:SkinButton()\n\n\tif IsWetxius then\n\t\tSubscriptionInterstitialFrame:Kill()\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_SubscriptionInterstitialUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Tabard.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTabard skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tTabardFrame:StripTextures()\n\tTabardFrame:CreateBackdrop(\"Transparent\")\n\tTabardFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tTabardFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\n\tTabardFrameInset:StripTextures()\n\tTabardFramePortrait:Kill()\n\n\tTabardModel:CreateBackdrop(\"Overlay\")\n\tTabardModel.backdrop:SetPoint(\"TOPLEFT\", 2, 0)\n\tTabardModel.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -4)\n\n\tT.SkinCloseButton(TabardFrameCloseButton, TabardFrame.backdrop)\n\n\tTabardFrameCancelButton:SkinButton()\n\tTabardFrameAcceptButton:SkinButton()\n\tTabardFrameAcceptButton:ClearAllPoints()\n\tTabardFrameAcceptButton:SetPoint(\"RIGHT\", TabardFrameCancelButton, \"LEFT\", -3, 0)\n\n\tT.SkinRotateButton(TabardCharacterModelRotateLeftButton)\n\tT.SkinRotateButton(TabardCharacterModelRotateRightButton)\n\tTabardCharacterModelRotateLeftButton:ClearAllPoints()\n\tTabardCharacterModelRotateLeftButton:SetPoint(\"BOTTOMLEFT\", TabardModel.backdrop, \"BOTTOMLEFT\", 4, 4)\n\tTabardCharacterModelRotateRightButton:ClearAllPoints()\n\tTabardCharacterModelRotateRightButton:SetPoint(\"LEFT\", TabardCharacterModelRotateLeftButton, \"RIGHT\", 3, 0)\n\n\tTabardFrameMoneyBg:StripTextures()\n\tTabardFrameMoneyInset:StripTextures()\n\tTabardFrameCostFrame:StripTextures()\n\tTabardFrameCustomizationFrame:StripTextures()\n\n\tfor i = 1, 5 do\n\t\tlocal custom = \"TabardFrameCustomization\"..i\n\t\t_G[custom]:StripTextures()\n\t\tT.SkinNextPrevButton(_G[custom..\"LeftButton\"])\n\t\tT.SkinNextPrevButton(_G[custom..\"RightButton\"])\n\n\t\tif i > 1 then\n\t\t\t_G[custom]:ClearAllPoints()\n\t\t\t_G[custom]:SetPoint(\"TOP\", _G[\"TabardFrameCustomization\"..i-1], \"BOTTOM\", 0, -6)\n\t\telse\n\t\t\tlocal point, anchor, point2, x, y = _G[custom]:GetPoint()\n\t\t\t_G[custom]:SetPoint(point, anchor, point2, x, y + 4)\n\t\tend\n\tend\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Talent.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTalentUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = ClassTalentFrame\n\tT.SkinFrame(frame)\n\n\tClassTalentFrame.TalentsTab.BlackBG:SetAlpha(0)\n\tClassTalentFrame.TalentsTab.BottomBar:SetAlpha(0)\n\n\tClassTalentFrame.TalentsTab.ApplyButton:SkinButton(true)\n\n\tT.SkinDropDownBox(ClassTalentFrame.TalentsTab.LoadoutDropDown.DropDownControl.DropDownMenu, 190)\n\n\tT.SkinEditBox(ClassTalentFrame.TalentsTab.SearchBox)\n\tClassTalentFrame.TalentsTab.SearchBox.backdrop:SetPoint(\"TOPLEFT\", -4, -4)\n\tClassTalentFrame.TalentsTab.SearchBox.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 5)\n\tClassTalentFrame.TalentsTab.SearchPreviewContainer:StripTextures()\n\tClassTalentFrame.TalentsTab.SearchPreviewContainer:CreateBackdrop(\"Transparent\")\n\n\tif T.newPatch then\n\t\tClassTalentFrame.TalentsTab.InspectCopyButton:SkinButton()\n\tend\n\n\tfor _, tab in next, {ClassTalentFrame.TabSystem:GetChildren()} do\n\t\tT.SkinTab(tab)\n\tend\n\n\t-- Profiles\n\tlocal function SkinTalentFrameDialog(dialog)\n\t\tif not dialog then return end\n\n\t\tdialog:StripTextures()\n\t\tdialog:CreateBackdrop(\"Transparent\")\n\n\t\tif dialog.AcceptButton then dialog.AcceptButton:SkinButton() end\n\t\tif dialog.CancelButton then dialog.CancelButton:SkinButton() end\n\t\tif dialog.DeleteButton then dialog.DeleteButton:SkinButton() end\n\n\t\tT.SkinEditBox(dialog.NameControl.EditBox)\n\t\tdialog.NameControl.EditBox.backdrop:SetPoint(\"TOPLEFT\", -5, -10)\n\t\tdialog.NameControl.EditBox.backdrop:SetPoint(\"BOTTOMRIGHT\", 5, 10)\n\tend\n\n\tlocal ImportDialog = _G.ClassTalentLoadoutImportDialog\n\tif ImportDialog then\n\t\tSkinTalentFrameDialog(ImportDialog)\n\t\tImportDialog.ImportControl.InputContainer:StripTextures()\n\t\tImportDialog.ImportControl.InputContainer:CreateBackdrop(\"Transparent\")\n\tend\n\n\tlocal CreateDialog = _G.ClassTalentLoadoutCreateDialog\n\tif CreateDialog then\n\t\tSkinTalentFrameDialog(CreateDialog)\n\tend\n\n\tlocal EditDialog = _G.ClassTalentLoadoutEditDialog\n\tif EditDialog then\n\t\tSkinTalentFrameDialog(EditDialog)\n\n\t\tlocal editbox = EditDialog.LoadoutName\n\t\tif editbox then\n\t\t\tT.SkinEditBox(editbox)\n\t\t\teditbox.backdrop:SetPoint(\"TOPLEFT\", -5, -5)\n\t\t\teditbox.backdrop:SetPoint(\"BOTTOMRIGHT\", 5, 5)\n\t\tend\n\n\t\tlocal check = EditDialog.UsesSharedActionBars\n\t\tif check then\n\t\t\tT.SkinCheckBox(check.CheckButton)\n\t\tend\n\tend\n\n\t-- Spec tab\n\tClassTalentFrame.SpecTab:CreateBackdrop(\"Overlay\")\n\tClassTalentFrame.SpecTab.backdrop:SetPoint(\"TOPLEFT\", 4, -4)\n\tClassTalentFrame.SpecTab.backdrop:SetPoint(\"BOTTOMRIGHT\", -4, 4)\n\tClassTalentFrame.SpecTab.Background:SetAlpha(0)\n\tClassTalentFrame.SpecTab.BlackBG:SetAlpha(0)\n\thooksecurefunc(ClassTalentFrame.SpecTab, \"UpdateSpecFrame\", function(frame)\n\t\tfor specContentFrame in frame.SpecContentFramePool:EnumerateActive() do\n\t\t\tif not specContentFrame.isSkinned then\n\t\t\t\tspecContentFrame.ActivateButton:SkinButton()\n\n\t\t\t\tif specContentFrame.SpellButtonPool then\n\t\t\t\t\tfor button in specContentFrame.SpellButtonPool:EnumerateActive() do\n\t\t\t\t\t\tif button.Ring then\n\t\t\t\t\t\t\tbutton.Ring:Hide()\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif button.spellID then\n\t\t\t\t\t\t\tlocal texture = GetSpellTexture(button.spellID)\n\t\t\t\t\t\t\tif texture then\n\t\t\t\t\t\t\t\tbutton.Icon:SetTexture(texture)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tbutton.Icon:SkinIcon()\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tspecContentFrame.isSkinned = true\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- PvP\n\tClassTalentFrame.TalentsTab.PvPTalentList:StripTextures()\n\tClassTalentFrame.TalentsTab.PvPTalentList:CreateBackdrop(\"Overlay\")\n\tClassTalentFrame.TalentsTab.PvPTalentList.backdrop:SetFrameStrata(ClassTalentFrame.TalentsTab.PvPTalentList:GetFrameStrata())\n\tClassTalentFrame.TalentsTab.PvPTalentList.backdrop:SetFrameLevel(2000)\nend\n\nT.SkinFuncs[\"Blizzard_ClassTalentUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/TalkingHead.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTalkingHeadUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tTalkingHeadFrame:StripTextures()\n\tTalkingHeadFrame:CreateBackdrop(\"Transparent\")\n\tTalkingHeadFrame.backdrop:SetPoint(\"TOPLEFT\", 13, -13)\n\tTalkingHeadFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", -35, 11)\n\n\tTalkingHeadFrame.BackgroundFrame.TextBackground:SetAtlas(nil)\n\tTalkingHeadFrame.PortraitFrame.Portrait:SetAtlas(nil)\n\tTalkingHeadFrame.MainFrame.Model.PortraitBg:SetAtlas(nil)\n\tTalkingHeadFrame.BackgroundFrame.TextBackground.SetAtlas = T.dummy\n\tTalkingHeadFrame.PortraitFrame.Portrait.SetAtlas = T.dummy\n\tTalkingHeadFrame.MainFrame.Model.PortraitBg.SetAtlas = T.dummy\n\n\tTalkingHeadFrame.MainFrame.Model:CreateBackdrop(\"Default\")\n\tTalkingHeadFrame.MainFrame.Model.backdrop:SetPoint(\"TOPLEFT\", -2, 2)\n\tTalkingHeadFrame.MainFrame.Model.backdrop:SetPoint(\"BOTTOMRIGHT\", 3, -3)\n\n\tT.SkinCloseButton(TalkingHeadFrame.MainFrame.CloseButton)\n\tTalkingHeadFrame.MainFrame.CloseButton:SetPoint(\"TOPRIGHT\", -39, -17)\n\n\thooksecurefunc(TalkingHeadFrame.TextFrame.Text, \"SetTextColor\", function(self, r)\n\t\tif r == 0 then\n\t\t\tself:SetTextColor(1, 1, 1)\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Taxi.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTaxi skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tTaxiFrame:StripTextures()\n\tTaxiFrame.TitleText:SetPoint(\"TOP\", TaxiFrame, \"TOP\", -4, -25)\n\tTaxiRouteMap:CreateBackdrop(\"Default\")\n\tT.SkinCloseButton(TaxiFrame.CloseButton)\n\tTaxiFrame.CloseButton:SetPoint(\"TOPRIGHT\", -9, -26)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/TimeManager.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTimeManager skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tTimeManagerFrame:StripTextures()\n\tTimeManagerFrame:CreateBackdrop(\"Transparent\")\n\tTimeManagerFrame.backdrop:SetPoint(\"TOPLEFT\", -3, 0)\n\tTimeManagerFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, 3)\n\tTimeManagerFrameInset:StripTextures()\n\n\tT.SkinCloseButton(TimeManagerFrameCloseButton, TimeManagerFrame.backdrop)\n\n\tT.SkinDropDownBox(TimeManagerAlarmHourDropDown, 79)\n\tT.SkinDropDownBox(TimeManagerAlarmMinuteDropDown, 79)\n\tT.SkinDropDownBox(TimeManagerAlarmAMPMDropDown, 70)\n\n\tT.SkinEditBox(TimeManagerAlarmMessageEditBox, nil, TimeManagerAlarmMessageEditBox:GetHeight() - 5)\n\n\tT.SkinCheckBox(TimeManagerAlarmEnabledButton)\n\tT.SkinCheckBox(TimeManagerMilitaryTimeCheck)\n\tT.SkinCheckBox(TimeManagerLocalTimeCheck)\n\n\tTimeManagerStopwatchFrame:StripTextures()\n\tTimeManagerStopwatchCheck:StyleButton(true)\n\tTimeManagerStopwatchCheck:SetTemplate(\"Default\")\n\tTimeManagerStopwatchCheck:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tTimeManagerStopwatchCheck:GetNormalTexture():ClearAllPoints()\n\tTimeManagerStopwatchCheck:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\tTimeManagerStopwatchCheck:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tStopwatchFrame:StripTextures()\n\tStopwatchFrame:CreateBackdrop(\"Transparent\")\n\tStopwatchFrame.backdrop:SetPoint(\"TOPLEFT\", 2, -15)\n\tStopwatchFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tStopwatchTabFrame:StripTextures()\n\n\tT.SkinCloseButton(StopwatchCloseButton)\n\tT.SkinNextPrevButton(StopwatchPlayPauseButton)\n\tT.SkinNextPrevButton(StopwatchResetButton)\n\tStopwatchPlayPauseButton:SetPoint(\"RIGHT\", StopwatchResetButton, \"LEFT\", -4, 0)\n\tStopwatchResetButton:SetPoint(\"BOTTOMRIGHT\", StopwatchFrame, \"BOTTOMRIGHT\", -7, 7)\n\tStopwatchCloseButton:ClearAllPoints()\n\tStopwatchCloseButton:SetPoint(\"BOTTOMRIGHT\", StopwatchFrame.backdrop, \"TOPRIGHT\", 0, 3)\nend\n\nT.SkinFuncs[\"Blizzard_TimeManager\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/TorghastLevelPicker.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTorghast Level Picker skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal frame = TorghastLevelPickerFrame\n\tT.SkinCloseButton(frame.CloseButton)\n\tframe.CloseButton:SetPoint(\"TOPRIGHT\", -50, -50)\n\n\tT.SkinNextPrevButton(frame.Pager.PreviousPage)\n\tT.SkinNextPrevButton(frame.Pager.NextPage)\n\n\tframe.OpenPortalButton:SkinButton()\n\n\thooksecurefunc(TorghastLevelPickerFrame, \"ScrollAndSelectHighestAvailableLayer\", function(self)\n\t\tfor layer in self.gossipOptionsPool:EnumerateActive() do\n\t\t\tif not layer.styled then\n\t\t\t\tlayer.SelectedBorder:SetAtlas(\"charactercreate-ring-select\")\n\t\t\t\tlayer.SelectedBorder:SetSize(120, 120)\n\t\t\t\tlayer.SelectedBorder:SetPoint(\"CENTER\", 0, 0)\n\t\t\t\tlayer.styled = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_TorghastLevelPicker\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Trade.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTrade skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tTradeFrame:StripTextures(true)\n\tTradeFrameInset:StripTextures()\n\tTradePlayerItemsInset:StripTextures()\n\tTradeRecipientItemsInset:StripTextures()\n\tTradePlayerEnchantInset:StripTextures()\n\tTradeRecipientEnchantInset:StripTextures()\n\tTradePlayerInputMoneyInset:StripTextures()\n\tTradeRecipientMoneyInset:StripTextures()\n\tTradeRecipientMoneyBg:StripTextures()\n\tTradeFramePortrait:SetAlpha(0)\n\n\tTradeFrame.RecipientOverlay.portrait:SetAlpha(0)\n\tTradeFrame.RecipientOverlay.portraitFrame:SetAlpha(0)\n\n\tTradeFrame:CreateBackdrop(\"Transparent\")\n\tTradeFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\tTradeFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\tTradeFrameTradeButton:SkinButton(true)\n\tTradeFrameCancelButton:SkinButton(true)\n\tT.SkinCloseButton(TradeFrameCloseButton, TradeFrame.backdrop)\n\n\tT.SkinEditBox(TradePlayerInputMoneyFrameGold)\n\tT.SkinEditBox(TradePlayerInputMoneyFrameSilver)\n\tT.SkinEditBox(TradePlayerInputMoneyFrameCopper)\n\n\tfor i = 1, MAX_TRADE_ITEMS do\n\t\tlocal player = _G[\"TradePlayerItem\"..i]\n\t\tlocal recipient = _G[\"TradeRecipientItem\"..i]\n\t\tlocal player_button = _G[\"TradePlayerItem\"..i..\"ItemButton\"]\n\t\tlocal recipient_button = _G[\"TradeRecipientItem\"..i..\"ItemButton\"]\n\t\tlocal player_button_icon = _G[\"TradePlayerItem\"..i..\"ItemButtonIconTexture\"]\n\t\tlocal recipient_button_icon = _G[\"TradeRecipientItem\"..i..\"ItemButtonIconTexture\"]\n\t\tlocal player_button_count = _G[\"TradePlayerItem\"..i..\"ItemButtonCount\"]\n\t\tlocal recipient_button_count = _G[\"TradeRecipientItem\"..i..\"ItemButtonCount\"]\n\n\t\tif player_button and recipient_button then\n\t\t\tplayer:StripTextures()\n\t\t\trecipient:StripTextures()\n\t\t\tplayer_button:StripTextures()\n\t\t\trecipient_button:StripTextures()\n\n\t\t\tplayer_button.IconBorder:SetAlpha(0)\n\t\t\trecipient_button.IconBorder:SetAlpha(0)\n\n\t\t\tplayer_button_icon:ClearAllPoints()\n\t\t\tplayer_button_icon:SetPoint(\"TOPLEFT\", player_button, \"TOPLEFT\", 2, -2)\n\t\t\tplayer_button_icon:SetPoint(\"BOTTOMRIGHT\", player_button, \"BOTTOMRIGHT\", -2, 2)\n\t\t\tplayer_button_icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tplayer_button_icon:SetDrawLayer(\"OVERLAY\")\n\n\t\t\tplayer_button_count:SetDrawLayer(\"OVERLAY\")\n\n\t\t\tplayer_button:SetTemplate(\"Overlay\")\n\t\t\tplayer_button:StyleButton()\n\n\t\t\tplayer_button.bg = CreateFrame(\"Frame\", nil, player_button)\n\t\t\tplayer_button.bg:SetTemplate(\"Overlay\")\n\t\t\tplayer_button.bg:SetPoint(\"TOPLEFT\", player_button, \"TOPRIGHT\", 4, 0)\n\t\t\tplayer_button.bg:SetPoint(\"BOTTOMRIGHT\", _G[\"TradePlayerItem\"..i..\"NameFrame\"], \"BOTTOMRIGHT\", 0, 14)\n\t\t\tplayer_button.bg:SetFrameLevel(player_button:GetFrameLevel() - 4)\n\n\t\t\trecipient_button_icon:ClearAllPoints()\n\t\t\trecipient_button_icon:SetPoint(\"TOPLEFT\", recipient_button, \"TOPLEFT\", 2, -2)\n\t\t\trecipient_button_icon:SetPoint(\"BOTTOMRIGHT\", recipient_button, \"BOTTOMRIGHT\", -2, 2)\n\t\t\trecipient_button_icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\trecipient_button_icon:SetDrawLayer(\"OVERLAY\")\n\n\t\t\trecipient_button_count:SetDrawLayer(\"OVERLAY\")\n\n\t\t\trecipient_button:SetTemplate(\"Overlay\")\n\t\t\trecipient_button:StyleButton()\n\n\t\t\trecipient_button.bg = CreateFrame(\"Frame\", nil, recipient_button)\n\t\t\trecipient_button.bg:SetTemplate(\"Overlay\")\n\t\t\trecipient_button.bg:SetPoint(\"TOPLEFT\", recipient_button, \"TOPRIGHT\", 4, 0)\n\t\t\trecipient_button.bg:SetPoint(\"BOTTOMRIGHT\", _G[\"TradeRecipientItem\"..i..\"NameFrame\"], \"BOTTOMRIGHT\", 0, 14)\n\t\t\trecipient_button.bg:SetFrameLevel(recipient_button:GetFrameLevel() - 4)\n\t\tend\n\tend\n\n\tTradeHighlightPlayerTop:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightPlayerBottom:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightPlayerMiddle:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightPlayer:SetFrameStrata(\"HIGH\")\n\tTradeHighlightPlayer:SetPoint(\"TOPLEFT\", TradeFrame, \"TOPLEFT\", 11, -86)\n\n\tTradeHighlightPlayerEnchantTop:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightPlayerEnchantBottom:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightPlayerEnchantMiddle:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightPlayerEnchant:SetFrameStrata(\"HIGH\")\n\n\tTradeHighlightRecipientTop:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightRecipientBottom:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightRecipientMiddle:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightRecipient:SetFrameStrata(\"HIGH\")\n\tTradeHighlightRecipient:SetPoint(\"TOPLEFT\", TradeFrame, \"TOPLEFT\", 179, -86)\n\n\tTradeHighlightRecipientEnchantTop:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightRecipientEnchantBottom:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightRecipientEnchantMiddle:SetColorTexture(0, 1, 0, 0.2)\n\tTradeHighlightRecipientEnchant:SetFrameStrata(\"HIGH\")\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Trainer.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTrainerUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal StripAllTextures = {\n\t\t\"ClassTrainerFrame\",\n\t\t\"ClassTrainerFrameSkillStepButton\",\n\t\t\"ClassTrainerFrameBottomInset\"\n\t}\n\n\tlocal buttons = {\n\t\t\"ClassTrainerTrainButton\"\n\t}\n\n\tlocal KillTextures = {\n\t\t\"ClassTrainerFramePortrait\",\n\t}\n\n\tfor _, object in pairs(StripAllTextures) do\n\t\t_G[object]:StripTextures()\n\tend\n\n\tfor _, texture in pairs(KillTextures) do\n\t\t_G[texture]:Kill()\n\tend\n\n\tfor i = 1, #buttons do\n\t\t_G[buttons[i]]:SkinButton(true)\n\tend\n\n\tClassTrainerFrame:CreateBackdrop(\"Transparent\")\n\tClassTrainerFrame.backdrop:SetPoint(\"TOPLEFT\", ClassTrainerFrame, \"TOPLEFT\")\n\tClassTrainerFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", ClassTrainerFrame, \"BOTTOMRIGHT\")\n\n\tT.SkinDropDownBox(ClassTrainerFrameFilterDropDown)\n\tClassTrainerFrameFilterDropDown:ClearAllPoints()\n\tClassTrainerFrameFilterDropDown:SetPoint(\"TOPRIGHT\", ClassTrainerFrame.backdrop, \"TOPRIGHT\", 4, -30)\n\n\tT.SkinCloseButton(ClassTrainerFrameCloseButton, ClassTrainerFrame)\n\n\tT.SkinScrollBar(ClassTrainerFrame.ScrollBar)\n\tClassTrainerFrame.ScrollBar:SetPoint(\"TOPLEFT\", ClassTrainerFrame.ScrollBox, \"TOPRIGHT\", 0, 3)\n\tClassTrainerFrame.ScrollBar:SetPoint(\"BOTTOMLEFT\", ClassTrainerFrame.ScrollBox, \"BOTTOMRIGHT\", 0, -4)\n\n\tClassTrainerStatusBar:StripTextures()\n\tClassTrainerStatusBar:SetStatusBarTexture(C.media.texture)\n\tClassTrainerStatusBar:CreateBackdrop(\"Overlay\")\n\tClassTrainerStatusBar:SetHeight(17)\n\tClassTrainerStatusBar:ClearAllPoints()\n\tClassTrainerStatusBar:SetPoint(\"RIGHT\", ClassTrainerFrameFilterDropDown, \"LEFT\", 10, 3)\n\tClassTrainerStatusBar.rankText:ClearAllPoints()\n\tClassTrainerStatusBar.rankText:SetPoint(\"CENTER\", ClassTrainerStatusBar, \"CENTER\")\n\n\tlocal stepButton = ClassTrainerFrameSkillStepButton\n\tstepButton:ClearAllPoints()\n\tstepButton:SetPoint(\"TOPRIGHT\", ClassTrainerFrameFilterDropDown, \"BOTTOMRIGHT\", -16, 0)\n\tstepButton:CreateBackdrop(\"Overlay\")\n\tstepButton.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -3)\n\tstepButton:StyleButton(nil, nil, true)\n\tstepButton.icon:SkinIcon(true)\n\tstepButton.icon:SetPoint(\"LEFT\", stepButton, \"LEFT\", 6, -1)\n\tstepButton.icon:SetSize(33, 33)\n\tstepButton.selectedTex:ClearAllPoints()\n\tstepButton.selectedTex:SetInside(stepButton.backdrop)\n\tstepButton.selectedTex:SetColorTexture(1, 0.82, 0, 0.3)\n\n\thooksecurefunc(ClassTrainerFrame.ScrollBox, \"Update\", function(frame)\n\t\tfor _, button in next, {frame.ScrollTarget:GetChildren()} do\n\t\t\tif not button.IsSkinned then\n\t\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\t\tbutton.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\t\t\t\tbutton.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\t\t\tbutton:StyleButton(nil, nil, true)\n\t\t\t\tbutton.icon:SkinIcon(true)\n\t\t\t\tbutton.icon:SetPoint(\"LEFT\", button, \"LEFT\", 6, 1)\n\t\t\t\tbutton.icon:SetSize(33, 33)\n\t\t\t\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tbutton:SetNormalTexture(0)\n\t\t\t\tbutton.disabledBG:SetTexture()\n\t\t\t\tbutton.selectedTex:ClearAllPoints()\n\t\t\t\tbutton.selectedTex:SetInside(button.backdrop)\n\t\t\t\tbutton.selectedTex:SetColorTexture(1, 0.82, 0, 0.3)\n\n\t\t\t\tbutton.IsSkinned = true\n\t\t\tend\n\t\tend\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_TrainerUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/Tutorial.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTutorial skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tTutorialFrame:StripTextures()\n\tTutorialFrame:CreateBackdrop(\"Transparent\")\n\tTutorialFrame.backdrop:SetPoint(\"TOPLEFT\", 6, 0)\n\tTutorialFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, -6)\n\tT.SkinNextPrevButton(TutorialFrameNextButton)\n\tT.SkinNextPrevButton(TutorialFramePrevButton)\n\tTutorialFrameOkayButton:SkinButton()\n\tTutorialFrameOkayButton:ClearAllPoints()\n\tTutorialFrameOkayButton:SetPoint(\"LEFT\", TutorialFrameNextButton, \"RIGHT\", 10, 0)\n\tT.SkinCloseButton(TutorialFrameCloseButton, TutorialFrame.backdrop)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/VoidStorage.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tVoidStorageUI skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tlocal StripAllTextures = {\n\t\t\"VoidStorageBorderFrame\",\n\t\t\"VoidStorageDepositFrame\",\n\t\t\"VoidStorageWithdrawFrame\",\n\t\t\"VoidStorageCostFrame\",\n\t\t\"VoidStorageStorageFrame\",\n\t\t\"VoidStoragePurchaseFrame\",\n\t\t\"VoidItemSearchBox\"\n\t}\n\n\tfor _, object in pairs(StripAllTextures) do\n\t\t_G[object]:StripTextures()\n\tend\n\n\tVoidStorageFrame:SetTemplate(\"Transparent\")\n\tVoidStoragePurchaseFrame:SetTemplate(\"Overlay\")\n\tVoidStoragePurchaseFrame:SetFrameLevel(VoidStorageFrame:GetFrameLevel() + 2)\n\tVoidStorageFrameMarbleBg:Kill()\n\tVoidStorageFrameLines:Kill()\n\tselect(2, VoidStorageFrame:GetRegions()):Kill()\n\n\tVoidStoragePurchaseButton:SkinButton()\n\tVoidStorageTransferButton:SkinButton()\n\n\tT.SkinCloseButton(VoidStorageBorderFrame.CloseButton)\n\tVoidItemSearchBox:CreateBackdrop(\"Overlay\")\n\tVoidItemSearchBox.backdrop:SetPoint(\"TOPLEFT\", 10, -1)\n\tVoidItemSearchBox.backdrop:SetPoint(\"BOTTOMRIGHT\", 4, 1)\n\n\tVoidStorageFrame:HookScript(\"OnShow\", function()\n\t\tSideDressUpFrame:ClearAllPoints()\n\t\tSideDressUpFrame:SetPoint(\"TOPLEFT\", VoidStorageFrame, \"TOPRIGHT\", 3, 0)\n\tend)\n\n\tfor i = 1, 9 do\n\t\tlocal button_d = _G[\"VoidStorageDepositButton\"..i]\n\t\tlocal button_w = _G[\"VoidStorageWithdrawButton\"..i]\n\t\tlocal icon_d = _G[\"VoidStorageDepositButton\"..i..\"IconTexture\"]\n\t\tlocal icon_w = _G[\"VoidStorageWithdrawButton\"..i..\"IconTexture\"]\n\n\t\t_G[\"VoidStorageDepositButton\"..i..\"Bg\"]:Hide()\n\t\t_G[\"VoidStorageWithdrawButton\"..i..\"Bg\"]:Hide()\n\n\t\tbutton_d:StyleButton()\n\t\tbutton_d:SetTemplate(\"Default\")\n\t\tbutton_d.IconBorder:Kill()\n\n\t\tbutton_w:StyleButton()\n\t\tbutton_w:SetTemplate(\"Default\")\n\t\tbutton_w.IconBorder:Kill()\n\n\t\ticon_d:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon_d:ClearAllPoints()\n\t\ticon_d:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon_d:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\ticon_w:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon_w:ClearAllPoints()\n\t\ticon_w:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon_w:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tfor i = 1, 80 do\n\t\tlocal button = _G[\"VoidStorageStorageButton\"..i]\n\t\tlocal icon = _G[\"VoidStorageStorageButton\"..i..\"IconTexture\"]\n\n\t\t_G[\"VoidStorageStorageButton\"..i..\"Bg\"]:Hide()\n\n\t\tbutton:StyleButton()\n\t\tbutton:SetTemplate(\"Default\")\n\t\tbutton.IconBorder:Kill()\n\n\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\ticon:ClearAllPoints()\n\t\ticon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\ticon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tfor i = 1, 2 do\n\t\tlocal tab = VoidStorageFrame[\"Page\"..i]\n\n\t\ttab:GetRegions():Hide()\n\t\ttab:GetNormalTexture():ClearAllPoints()\n\t\ttab:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\t\ttab:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\ttab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\ttab:CreateBackdrop(\"Default\")\n\t\ttab.backdrop:SetAllPoints()\n\n\t\ttab:StyleButton(true)\n\n\t\tif i == 1 then\n\t\t\ttab:SetPoint(\"TOPLEFT\", VoidStorageFrame, \"TOPRIGHT\", 1, 0)\n\t\tend\n\tend\nend\n\nT.SkinFuncs[\"Blizzard_VoidStorageUI\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/WeeklyRewards.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tWeekly Rewards skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\thooksecurefunc(WeeklyRewardsFrame, \"SetupTextures\", function()\n\t\tlocal frame = WeeklyRewardsFrame\n\t\tframe:StripTextures()\n\n\t\tframe.HeaderFrame:StripTextures()\n\n\t\tlocal headers = {\n\t\t\tframe.RaidFrame,\n\t\t\tframe.MythicFrame,\n\t\t\tframe.PVPFrame\n\t\t}\n\n\t\tfor i = 1, #headers do\n\t\t\tlocal header = headers[i]\n\t\t\theader.Border:Hide()\n\t\tend\n\tend)\n\n\n\tlocal frame = WeeklyRewardsFrame\n\tT.SkinCloseButton(frame.CloseButton)\n\n\t-- frame:StripTextures()\n\tframe:CreateBackdrop(\"Transparent\")\n\n\t-- frame.HeaderFrame:StripTextures()\n\tframe.SelectRewardButton:StripTextures()\n\tframe.SelectRewardButton:SkinButton()\n\n\tlocal headers = {\n\t\tframe.RaidFrame,\n\t\tframe.MythicFrame,\n\t\tframe.PVPFrame\n\t}\n\n\tfor i = 1, #headers do\n\t\tlocal header = headers[i]\n\t\t-- header.Border:Hide()\n\t\theader:CreateBackdrop(\"Default\")\n\t\theader.backdrop:SetOutside(header.Background)\n\t\theader.Background:SetTexCoord(0.01602564102564, 0.97109826589595, 0.02890173410405, 0.97109826589595)\n\tend\n\n\tfor _, activity in pairs(frame.Activities) do\n\t\tif activity.Border then\n\t\t\tactivity.Border:SetAlpha(0)\n\t\t\tactivity.SelectedTexture:SetAlpha(0)\n\t\t\tactivity.UnselectedFrame:SetAlpha(0)\n\t\t\tactivity:CreateBackdrop(\"Default\")\n\t\t\tactivity.backdrop:SetOutside(activity.Background)\n\t\t\thooksecurefunc(activity, \"SetSelectionState\", function(self)\n\t\t\t\tif self.SelectedTexture:IsShown() then\n\t\t\t\t\tself.backdrop:SetBackdropBorderColor(1, 1, 0)\n\t\t\t\telse\n\t\t\t\t\tself.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\thooksecurefunc(activity.ItemFrame, \"SetDisplayedItem\", function(item)\n\t\t\t\tif not item.IsSkinned then\n\t\t\t\t\titem:DisableDrawLayer(\"BORDER\")\n\t\t\t\t\titem.Icon:SkinIcon()\n\t\t\t\t\titem.Name:SetTextColor(0.639, 0.207, 0.933)\n\t\t\t\t\titem.IsSkinned = true\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\tend\n\n\thooksecurefunc(frame, \"SelectReward\", function(self)\n\t\tlocal frame = self.confirmSelectionFrame\n\t\tif frame and not frame.styled then\n\t\t\tWeeklyRewardsFrameIconTexture:SkinIcon()\n\t\t\tWeeklyRewardsFrameNameFrame:SetAlpha(0)\n\t\t\tframe.ItemFrame.IconBorder:SetAlpha(0)\n\t\t\tframe.styled = true\n\n\t\t\tlocal alsoItems = frame.AlsoItemsFrame\n\t\t\tif alsoItems and alsoItems.pool then\n\t\t\t\tfor items in alsoItems.pool:EnumerateActive() do\n\t\t\t\t\tif not items.styled then\n\t\t\t\t\t\titems.IconBorder:SetAlpha(0)\n\t\t\t\t\t\titems.Icon:SkinIcon()\n\t\t\t\t\t\titems.styled = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\n\tlocal rewardText = frame.ConcessionFrame.RewardsFrame.Text\n\thooksecurefunc(rewardText, \"SetText\", function(self, text)\n\t\tif not text then text = self:GetText() end\n\t\tif not text or text == \"\" then return end\n\n\t\tlocal newText, count = gsub(text, \"24:24:0:%-2\", \"14:14:0:0:64:64:5:59:5:59\")\n\t\tif count > 0 then self:SetFormattedText(\"%s\", newText) end\n\tend)\nend\n\nT.SkinFuncs[\"Blizzard_WeeklyRewards\"] = LoadSkin"
  },
  {
    "path": "ShestakUI/Modules/Skins/Blizzard/WorldMap.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tWorldMap skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tif IsAddOnLoaded(\"Mapster\") then return end\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"VARIABLES_LOADED\")\n\tframe:SetScript(\"OnEvent\", function()\n\t\tSetCVar(\"miniWorldMap\", 1)\n\tend)\n\n\tWorldMapFrame:StripTextures()\n\tWorldMapFramePortrait:SetAlpha(0)\n\tWorldMapFrame:CreateBackdrop(\"Default\")\n\tWorldMapFrame.backdrop:ClearAllPoints()\n\tWorldMapFrame.backdrop:SetPoint(\"TOPLEFT\", 1, -66)\n\tWorldMapFrame.backdrop:SetSize(700, 468)\n\tWorldMapFrame.Header = CreateFrame(\"Frame\", nil, WorldMapFrame)\n\tWorldMapFrame.Header:SetSize(WorldMapFrame.backdrop:GetWidth(), 23)\n\tWorldMapFrame.Header:SetPoint(\"BOTTOMLEFT\", WorldMapFrame.backdrop, \"TOPLEFT\", 0, 2)\n\tWorldMapFrame.Header:SetTemplate(\"Overlay\")\n\n\tWorldMapFrame.BorderFrame:StripTextures()\n\tWorldMapFrame.BorderFrame.NineSlice:Hide()\n\tWorldMapFrame.BorderFrame.Tutorial:Kill()\n\n\tQuestMapFrame:StripTextures()\n\tQuestMapFrame:CreateBackdrop(\"Overlay\")\n\tQuestMapFrame.backdrop:ClearAllPoints()\n\tQuestMapFrame.backdrop:SetPoint(\"LEFT\", WorldMapFrame.backdrop, \"RIGHT\", 2, 0)\n\tQuestMapFrame.backdrop:SetSize(284, 468)\n\n\tQuestScrollFrame:ClearAllPoints()\n\tQuestScrollFrame:SetPoint(\"TOP\", WorldMapFrame.backdrop, \"TOP\", 0, -3)\n\tQuestScrollFrame:SetPoint(\"LEFT\", WorldMapFrame.backdrop, \"RIGHT\", 4, 0)\n\tQuestScrollFrame.DetailFrame:StripTextures()\n\tQuestScrollFrame.DetailFrame.BottomDetail:Hide()\n\tQuestScrollFrame.Contents.Separator.Divider:Hide()\n\tQuestScrollFrame:SetSize(259, 463)\n\n\tlocal CampaignOverview = QuestMapFrame.CampaignOverview\n\tCampaignOverview:StripTextures()\n\tCampaignOverview.ScrollFrame:StripTextures()\n\tT.SkinScrollBar(QuestMapFrameScrollBar)\n\tCampaignOverview:CreateBackdrop(\"Overlay\")\n\tCampaignOverview.backdrop:SetPoint(\"TOPLEFT\", CampaignOverview.Header, \"TOPLEFT\",  8, -2)\n\tCampaignOverview.backdrop:SetPoint(\"BOTTOMRIGHT\", CampaignOverview.Header, \"BOTTOMRIGHT\", -4, 10)\n\tCampaignOverview.backdrop.overlay:SetVertexColor(1, 1, 1, 0.2)\n\tCampaignOverview.Header.Background:SetAlpha(0)\n\tCampaignOverview.Header.TopFiligree:Hide()\n\n\tdo\n\t\tlocal frame = QuestScrollFrame.Contents.StoryHeader\n\t\tframe:CreateBackdrop(\"Overlay\")\n\t\tframe.backdrop:SetPoint(\"TOPLEFT\", 6, -9)\n\t\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", -6, 11)\n\t\tframe.HighlightTexture:Hide()\n\t\tframe.Background:SetAlpha(0)\n\t\tframe.backdrop.overlay:SetVertexColor(1, 1, 1, 0.2)\n\tend\n\n\tQuestScrollFrame.ScrollBar:SetPoint(\"TOPLEFT\", QuestScrollFrame, \"TOPRIGHT\", 4, -16)\n\tQuestScrollFrame.ScrollBar:SetPoint(\"BOTTOMLEFT\", QuestScrollFrame, \"BOTTOMRIGHT\", 4, 15)\n\tT.SkinScrollBar(QuestScrollFrame.ScrollBar)\n\n\tlocal QuestScrollFrameTopBorder = CreateFrame(\"Frame\", \"$parentBorder\", QuestScrollFrame)\n\tQuestScrollFrameTopBorder:CreateBackdrop(\"Overlay\")\n\tQuestScrollFrameTopBorder.backdrop:ClearAllPoints()\n\tQuestScrollFrameTopBorder.backdrop:SetSize(284, 23)\n\tQuestScrollFrameTopBorder.backdrop:SetPoint(\"LEFT\", WorldMapFrame.Header, \"RIGHT\", 2, 0)\n\n\tlocal QuestScrollFrameTopBorder = CreateFrame(\"Frame\", \"$parentBorder\", QuestMapFrame.CampaignOverview)\n\tQuestScrollFrameTopBorder:CreateBackdrop(\"Overlay\")\n\tQuestScrollFrameTopBorder.backdrop:ClearAllPoints()\n\tQuestScrollFrameTopBorder.backdrop:SetSize(284, 23)\n\tQuestScrollFrameTopBorder.backdrop:SetPoint(\"LEFT\", WorldMapFrame.Header, \"RIGHT\", 2, 0)\n\n\tQuestMapDetailsScrollFrame:SetPoint(\"TOPLEFT\", 1, 0)\n\tQuestMapDetailsScrollFrame.ScrollBar:SetPoint(\"TOPLEFT\", QuestMapDetailsScrollFrame, \"TOPRIGHT\", 0, -18)\n\tT.SkinScrollBar(QuestMapDetailsScrollFrame.ScrollBar)\n\n\tQuestMapFrame.Background:SetAlpha(0)\n\n\tQuestMapFrame.DetailsFrame:StripTextures()\n\tQuestMapFrame.DetailsFrame.RewardsFrame:StripTextures()\n\tQuestMapFrame.DetailsFrame.Bg:Hide()\n\n\tQuestMapFrame.DetailsFrame.BackButton:SkinButton()\n\tQuestMapFrame.DetailsFrame.BackButton:ClearAllPoints()\n\tQuestMapFrame.DetailsFrame.BackButton:SetPoint(\"LEFT\", WorldMapFrame.Header, \"RIGHT\", 2, 0)\n\tQuestMapFrame.DetailsFrame.BackButton:SetSize(284, 23)\n\n\tlocal AbandonButton = QuestMapFrame.DetailsFrame.AbandonButton\n\tAbandonButton:SkinButton()\n\tAbandonButton:ClearAllPoints()\n\tAbandonButton:SetPoint(\"BOTTOMLEFT\", QuestMapFrame.backdrop, \"BOTTOMLEFT\", 4, 4)\n\n\tlocal TrackButton = QuestMapFrame.DetailsFrame.TrackButton\n\tTrackButton:SkinButton()\n\tTrackButton:SetSize(90, 22)\n\tTrackButton:ClearAllPoints()\n\tTrackButton:SetPoint(\"BOTTOMRIGHT\", QuestMapFrame.backdrop, \"BOTTOMRIGHT\", -4, 4)\n\n\tlocal ShareButton = QuestMapFrame.DetailsFrame.ShareButton\n\tShareButton:SkinButton(true)\n\tShareButton:ClearAllPoints()\n\tShareButton:SetPoint(\"LEFT\", AbandonButton, \"RIGHT\", 3, 0)\n\tShareButton:SetPoint(\"RIGHT\", TrackButton, \"LEFT\", -3, 0)\n\n\tQuestMapFrame.DetailsFrame.CompleteQuestFrame:StripTextures()\n\tQuestMapFrame.DetailsFrame.CompleteQuestFrame.CompleteButton:SkinButton(true)\n\tQuestMapFrame.DetailsFrame.CompleteQuestFrame.CompleteButton:SetPoint(\"TOP\", 0, 4)\n\n\t-- Quests Buttons\n\tfor i = 1, 2 do\n\t\tlocal button = i == 1 and WorldMapFrame.SidePanelToggle.CloseButton or WorldMapFrame.SidePanelToggle.OpenButton\n\t\tlocal texture = i == 1 and \"Interface\\\\Buttons\\\\UI-SpellbookIcon-PrevPage-Up\" or \"Interface\\\\Buttons\\\\UI-SpellbookIcon-NextPage-Up\"\n\n\t\tbutton:ClearAllPoints()\n\t\tbutton:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tbutton:SetSize(20, 20)\n\t\tbutton:StripTextures()\n\t\tbutton:SetTemplate(\"Default\")\n\t\tbutton:StyleButton()\n\n\t\tbutton.icon = button:CreateTexture(nil, \"BORDER\")\n\t\tbutton.icon:SetTexture(texture)\n\t\tbutton.icon:SetTexCoord(0.3, 0.29, 0.3, 0.79, 0.65, 0.29, 0.65, 0.79)\n\t\tbutton.icon:ClearAllPoints()\n\t\tbutton.icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tbutton.icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tend\n\n\tWorldMapFrame.NavBar:Hide()\n\tWorldMapFrame.BorderFrame.TitleContainer.TitleText:ClearAllPoints()\n\tWorldMapFrame.BorderFrame.TitleContainer.TitleText:SetPoint(\"CENTER\", WorldMapFrame.Header)\n\n\tT.SkinCloseButton(WorldMapFrameCloseButton)\n\tWorldMapFrameCloseButton:ClearAllPoints()\n\tWorldMapFrameCloseButton:SetPoint(\"RIGHT\", WorldMapFrame.Header, \"RIGHT\", -4, 0)\n\tWorldMapFrameCloseButton:SetSize(15, 15)\n\n\tWorldMapFrame.BorderFrame.MaximizeMinimizeFrame.MaximizeButton:Kill()\n\tWorldMapFrame.BorderFrame.MaximizeMinimizeFrame.MinimizeButton:Kill()\n\n\t-- Floor Dropdown\n\tlocal function WorldMapFloorNavigationDropDown(frame)\n\t\tT.SkinDropDownBox(frame)\n\t\tframe:SetPoint(\"TOPLEFT\", -15, -67)\n\tend\n\n\t-- Tracking Button\n\tlocal function WorldMapTrackingOptionsButton(button)\n\t\tlocal shadow = button:GetRegions()\n\t\tshadow:Hide()\n\n\t\tbutton.Background:Hide()\n\t\tbutton.IconOverlay:SetAlpha(0)\n\t\tbutton.Border:Hide()\n\n\t\tlocal tex = button:GetHighlightTexture()\n\t\ttex:SetTexture([[Interface\\Minimap\\Tracking\\None]], \"ADD\")\n\t\ttex:SetAllPoints(button.Icon)\n\tend\n\n\t-- Tracking Pin\n\tlocal function WorldMapTrackingPinButton(button)\n\t\tlocal shadow = button:GetRegions()\n\t\tshadow:Hide()\n\n\t\tbutton.Background:Hide()\n\t\tbutton.IconOverlay:SetAlpha(0)\n\t\tbutton.Border:Hide()\n\n\t\tlocal tex = button:GetHighlightTexture()\n\t\ttex:SetAtlas(\"Waypoint-MapPin-Untracked\")\n\t\ttex:SetAllPoints(button.Icon)\n\tend\n\n\tlocal function HandyNotesButton(button)\n\t\tlocal shadow = button:GetRegions()\n\t\tshadow:Hide()\n\n\t\tbutton.Background:Hide()\n\t\tbutton.IconOverlay:SetAlpha(0)\n\t\tbutton.Border:Hide()\n\n\t\tlocal tex = button:GetHighlightTexture()\n\t\ttex:SetAtlas(button.Icon:GetTexture())\n\t\ttex:SetAllPoints(button.Icon)\n\tend\n\n\t-- Elements\n\tWorldMapFloorNavigationDropDown(WorldMapFrame.overlayFrames[1])\n\tWorldMapTrackingOptionsButton(WorldMapFrame.overlayFrames[2])\n\tWorldMapTrackingPinButton(WorldMapFrame.overlayFrames[3])\n\n\tfor i = 1, 10 do\n\t\tlocal button = _G[\"Krowi_WorldMapButtons\"..i]\n\t\tif button then\n\t\t\tHandyNotesButton(button)\n\t\tend\n\tend\n\n\tfor i = 3, #WorldMapFrame.overlayFrames do\n\t\tlocal frame = WorldMapFrame.overlayFrames[i]\n\t\tif frame.BountyDropdownButton then\n\t\t\tT.SkinNextPrevButton(frame.BountyDropdownButton)\n\t\t\tbreak\n\t\tend\n\tend\n\n\t-- QuestSessionManagement skin (based on skin from Aurora)\n\tQuestMapFrame.QuestSessionManagement:StripTextures()\n\n\tlocal ExecuteSessionCommand = QuestMapFrame.QuestSessionManagement.ExecuteSessionCommand\n\tExecuteSessionCommand:SetTemplate(\"Default\")\n\tExecuteSessionCommand:StyleButton()\n\n\tlocal icon = ExecuteSessionCommand:CreateTexture(nil, \"ARTWORK\")\n\ticon:SetPoint(\"TOPLEFT\", 0, 0)\n\ticon:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\tExecuteSessionCommand.normalIcon = icon\n\n\tlocal sessionCommandToButtonAtlas = { -- Skin from Aurora\n\t\t[_G.Enum.QuestSessionCommand.Start] = \"QuestSharing-DialogIcon\",\n\t\t[_G.Enum.QuestSessionCommand.Stop] = \"QuestSharing-Stop-DialogIcon\"\n\t}\n\n\thooksecurefunc(QuestMapFrame.QuestSessionManagement, \"UpdateExecuteCommandAtlases\", function(self, command)\n\t\tself.ExecuteSessionCommand:SetNormalTexture(0)\n\t\tself.ExecuteSessionCommand:SetPushedTexture(0)\n\t\tself.ExecuteSessionCommand:SetDisabledTexture(0)\n\n\t\tlocal atlas = sessionCommandToButtonAtlas[command]\n\t\tif atlas then\n\t\t\tself.ExecuteSessionCommand.normalIcon:SetAtlas(atlas)\n\t\tend\n\tend)\n\n\thooksecurefunc(QuestSessionManager, \"NotifyDialogShow\", function(_, dialog)\n\t\tif not dialog.isSkinned then\n\t\t\tdialog:StripTextures()\n\t\t\tdialog:SetTemplate(\"Transparent\")\n\t\t\tdialog.ButtonContainer.Confirm:SkinButton()\n\t\t\tdialog.ButtonContainer.Decline:SkinButton()\n\t\t\tif dialog.MinimizeButton then\n\t\t\t\tT.SkinCloseButton(dialog.MinimizeButton, nil, \"-\")\n\t\t\tend\n\t\t\tdialog.isSkinned = true\n\t\tend\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/BloodShieldTracker.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blood_shield_tracker ~= true or T.class ~= \"DEATHKNIGHT\" then return end\n\n----------------------------------------------------------------------------------------\n--\tBloodShieldTracker skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"BloodShieldTracker\") then return end\n\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"AMSBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"AMSBar\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PWSBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PWSBar\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"ShieldBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"ShieldBar\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"HealthBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"HealthBar\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"IllumBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"IllumBar\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"EstimateBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"EstimateBar\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PurgatoryBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PurgatoryBar\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"TotalAbsorbsBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"TotalAbsorbsBar\"] = {} end\n\tif not BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"BloodChargeBar\"] then BloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"BloodChargeBar\"] = {} end\n\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"AMSBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"AMSBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"AMSBar\"][\"scale\"] = 1\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PWSBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PWSBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PWSBar\"][\"scale\"] = 1\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"ShieldBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"ShieldBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"ShieldBar\"][\"scale\"] = 1\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"HealthBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"HealthBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"HealthBar\"][\"scale\"] = 1\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"IllumBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"IllumBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"IllumBar\"][\"scale\"] = 1\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"EstimateBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"EstimateBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"EstimateBar\"][\"scale\"] = 1\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PurgatoryBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PurgatoryBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"PurgatoryBar\"][\"scale\"] = 1\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"TotalAbsorbsBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"TotalAbsorbsBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"TotalAbsorbsBar\"][\"scale\"] = 1\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"BloodChargeBar\"][\"border\"] = false\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"BloodChargeBar\"][\"texture\"] = \"Smooth!\"\n\tBloodShieldTrackerDB[\"profiles\"][\"Default\"][\"bars\"][\"BloodChargeBar\"][\"scale\"] = 1\n\n\tlocal bars = {\n\t\t\"BloodShieldTracker_AMSBar\",\n\t\t\"BloodShieldTracker_PWSBar\",\n\t\t\"BloodShieldTracker_EstimateBar\",\n\t\t\"BloodShieldTracker_ShieldBar\",\n\t\t\"BloodShieldTracker_TotalAbsorbsBar\",\n\t\t\"BloodShieldTracker_IllumBar\",\n\t\t\"BloodShieldTracker_HealthBar\",\n\t\t\"BloodShieldTracker_PurgatoryBar\",\n\t\t\"BloodShieldTracker_BloodChargeBar\"\n\t}\n\n\tfor i = 1, getn(bars) do\n\t\tlocal bar = _G[bars[i]]\n\t\tif bar then\n\t\t\tbar:CreateBackdrop(\"Default\")\n\n\t\t\tbar.value:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\tbar.value:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\n\t\t\tif bar.stacks then\n\t\t\t\tbar.stacks:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\tbar.stacks:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\t\tend\n\n\t\t\tif bar.time then\n\t\t\t\tbar.time:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\tbar.time:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\t\tend\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Capping.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.capping ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCapping skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"Capping\") then return end\n\n\tlocal db = CappingFrame.db.profile\n\tdb.barTexture = \"Smooth!\"\n\tdb.spacing = 7\n\tdb.font = \"Hooge\"\n\tdb.fontSize = C.font.stylization_font_size\n\n\tCappingFrame:HookScript('OnUpdate', function(self)\n\t\tfor bar in pairs(self.bars) do\n\t\t\tif not bar.backdrop then\n\t\t\t\tbar:CreateBackdrop(\"Default\")\n\t\t\tend\n\t\tend\n\tend)\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Clique.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.blizzard_frames ~= true or C.skins.clique ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tClique skin\n----------------------------------------------------------------------------------------\nlocal function LoadSkin()\n\tif not IsAddOnLoaded(\"Clique\") then return end\n\tCliqueConfig:StripTextures()\n\tCliqueConfig:SetTemplate(\"Transparent\")\n\tCliqueConfigPortrait:SetAlpha(0)\n\n\tCliqueConfigPage1Column1:StripTextures()\n\tCliqueConfigPage1Column2:StripTextures()\n\tCliqueConfigInset:StripTextures()\n\tCliqueConfigPage1_VSlider:StripTextures()\n\n\tCliqueClickGrabber:StripTextures()\n\tCliqueClickGrabber:CreateBackdrop(\"Overlay\")\n\tCliqueClickGrabber.backdrop:SetPoint(\"TOPLEFT\", -1, 0)\n\tCliqueClickGrabber.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, 3)\n\n\tCliqueDialog:StripTextures()\n\tCliqueDialog:SetTemplate(\"Transparent\")\n\n\tT.SkinCloseButton(CliqueConfigCloseButton)\n\tif CliqueDialog.CloseButton then T.SkinCloseButton(CliqueDialog.CloseButton) end\n\tif CliqueDialogCloseButton then T.SkinCloseButton(CliqueDialogCloseButton) end\n\n\tCliqueConfigPage1ButtonOptions:SkinButton(true)\n\tCliqueConfigPage1ButtonOther:SkinButton(true)\n\tCliqueConfigPage1ButtonSpell:SkinButton(true)\n\tCliqueConfigPage2ButtonBinding:SkinButton()\n\tCliqueConfigPage2ButtonSave:SkinButton(true)\n\tCliqueConfigPage2ButtonCancel:SkinButton(true)\n\tCliqueDialogButtonBinding:SkinButton()\n\tCliqueDialogButtonAccept:SkinButton()\n\n\tif T.client == \"ruRU\" then\n\t\tCliqueConfigPage1ButtonSpell:SetWidth(130)\n\t\tCliqueConfigPage1ButtonSpellText:SetWidth(CliqueConfigPage1ButtonSpell:GetWidth())\n\t\tCliqueConfigPage1ButtonSpellText:SetHeight(CliqueConfigPage1ButtonSpell:GetHeight())\n\t\tCliqueConfigPage1ButtonOther:SetWidth(110)\n\tend\n\n\tCliqueSpellTab:GetRegions():SetSize(0.1, 0.1)\n\tCliqueSpellTab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tCliqueSpellTab:GetNormalTexture():ClearAllPoints()\n\tCliqueSpellTab:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\tCliqueSpellTab:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tCliqueSpellTab:CreateBackdrop(\"Default\")\n\tCliqueSpellTab.backdrop:SetAllPoints()\n\tCliqueSpellTab:StyleButton()\n\n\tCliqueConfigPage1:SetScript(\"OnShow\", function()\n\t\tfor i = 1, 12 do\n\t\t\tif _G[\"CliqueRow\"..i] then\n\t\t\t\t_G[\"CliqueRow\"..i..\"Icon\"]:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t_G[\"CliqueRow\"..i..\"Bind\"]:ClearAllPoints()\n\t\t\t\tif _G[\"CliqueRow\"..i] == CliqueRow1 then\n\t\t\t\t\t_G[\"CliqueRow\"..i..\"Bind\"]:SetPoint(\"RIGHT\", _G[\"CliqueRow\"..i], 8, 0)\n\t\t\t\telse\n\t\t\t\t\t_G[\"CliqueRow\"..i..\"Bind\"]:SetPoint(\"RIGHT\", _G[\"CliqueRow\"..i], -8, 0)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tCliqueRow1:ClearAllPoints()\n\t\tCliqueRow1:SetPoint(\"TOPLEFT\", 5, -(CliqueConfigPage1Column1:GetHeight() + 3))\n\tend)\nend\n\ntinsert(T.SkinFuncs[\"ShestakUI\"], LoadSkin)"
  },
  {
    "path": "ShestakUI/Modules/Skins/CoolLine.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.cool_line ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tCoolLine skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"CoolLine\") then return end\n\n\tCoolLineDB.border = \"None\"\n\tCoolLineDB.bgcolor.a = 0\n\tCoolLineDB.inactivealpha = 1\n\tCoolLineDB.activealpha = 1\n\tCoolLineDB.font = \"Hooge\"\n\tCoolLineDB.fontsize = C.font.stylization_font_size\n\tCoolLineDB.w = (C.actionbar.button_size * 12) + (C.actionbar.button_space * 11) - 4\n\tCoolLineDB.h = C.actionbar.button_size - 4\n\n\tlocal CoolLineBar = CreateFrame(\"Frame\", \"CoolLineBar\", CoolLine)\n\tCoolLineBar:SetPoint(\"TOPLEFT\", CoolLine, \"TOPLEFT\", -2, 2)\n\tCoolLineBar:SetPoint(\"BOTTOMRIGHT\", CoolLine, \"BOTTOMRIGHT\", 2, -2)\n\tCoolLineBar:SetTemplate(\"Transparent\")\n\tCoolLineBar:SetFrameStrata(\"BACKGROUND\")\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/DBM.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.dbm ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tDBM skin(by Affli)\n----------------------------------------------------------------------------------------\nlocal backdrop = {\n\tbgFile = C.media.blank,\n\tinsets = {left = 0, right = 0, top = 0, bottom = 0},\n}\n\nlocal DBMSkin = CreateFrame(\"Frame\")\nDBMSkin:RegisterEvent(\"PLAYER_LOGIN\")\nDBMSkin:RegisterEvent(\"ADDON_LOADED\")\nDBMSkin:SetScript(\"OnEvent\", function()\n\tif IsAddOnLoaded(\"DBM-Core\") then\n\t\tlocal function SkinBars(self)\n\t\t\tfor bar in self:GetBarIterator() do\n\t\t\t\tif not bar.injected then\n\t\t\t\t\tbar.ApplyStyle = function()\n\t\t\t\t\t\tlocal frame = bar.frame\n\t\t\t\t\t\tlocal tbar = _G[frame:GetName()..\"Bar\"]\n\t\t\t\t\t\tlocal spark = _G[frame:GetName()..\"BarSpark\"]\n\t\t\t\t\t\tlocal icon1 = _G[frame:GetName()..\"BarIcon1\"]\n\t\t\t\t\t\tlocal icon2 = _G[frame:GetName()..\"BarIcon2\"]\n\t\t\t\t\t\tlocal name = _G[frame:GetName()..\"BarName\"]\n\t\t\t\t\t\tlocal timer = _G[frame:GetName()..\"BarTimer\"]\n\n\t\t\t\t\t\tif icon1.overlay then\n\t\t\t\t\t\t\ticon1.overlay = _G[icon1.overlay:GetName()]\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ticon1.overlay = CreateFrame(\"Frame\", \"$parentIcon1Overlay\", tbar)\n\t\t\t\t\t\t\ticon1.overlay:SetWidth(25)\n\t\t\t\t\t\t\ticon1.overlay:SetHeight(25)\n\t\t\t\t\t\t\ticon1.overlay:SetFrameStrata(\"BACKGROUND\")\n\t\t\t\t\t\t\ticon1.overlay:SetPoint(\"BOTTOMRIGHT\", tbar, \"BOTTOMLEFT\", -5, -2)\n\t\t\t\t\t\t\ticon1.overlay:SetTemplate(\"Transparent\")\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif icon2.overlay then\n\t\t\t\t\t\t\ticon2.overlay = _G[icon2.overlay:GetName()]\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ticon2.overlay = CreateFrame(\"Frame\", \"$parentIcon2Overlay\", tbar)\n\t\t\t\t\t\t\ticon2.overlay:SetWidth(25)\n\t\t\t\t\t\t\ticon2.overlay:SetHeight(25)\n\t\t\t\t\t\t\ticon2.overlay:SetFrameStrata(\"BACKGROUND\")\n\t\t\t\t\t\t\ticon2.overlay:SetPoint(\"BOTTOMLEFT\", tbar, \"BOTTOMRIGHT\", 5, -2)\n\t\t\t\t\t\t\ticon2.overlay:SetTemplate(\"Transparent\")\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tMixin(tbar, BackdropTemplateMixin)\n\t\t\t\t\t\tif bar.color then\n\t\t\t\t\t\t\ttbar:SetStatusBarColor(bar.color.r, bar.color.g, bar.color.b)\n\t\t\t\t\t\t\ttbar:SetBackdrop(backdrop)\n\t\t\t\t\t\t\ttbar:SetBackdropColor(bar.color.r, bar.color.g, bar.color.b, 0.15)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttbar:SetStatusBarColor(DBT.Options.StartColorR, DBT.Options.StartColorG, DBT.Options.StartColorB)\n\t\t\t\t\t\t\ttbar:SetBackdrop(backdrop)\n\t\t\t\t\t\t\ttbar:SetBackdropColor(DBT.Options.StartColorR, DBT.Options.StartColorG, DBT.Options.StartColorB, 0.15)\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif bar.enlarged then\n\t\t\t\t\t\t\tframe:SetWidth(DBT.Options.HugeWidth)\n\t\t\t\t\t\t\ttbar:SetWidth(DBT.Options.HugeWidth)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tframe:SetWidth(DBT.Options.Width)\n\t\t\t\t\t\t\ttbar:SetWidth(DBT.Options.Width)\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif not frame.styled then\n\t\t\t\t\t\t\tframe:SetScale(1)\n\t\t\t\t\t\t\tframe:SetHeight(19)\n\t\t\t\t\t\t\tframe:SetTemplate(\"Default\")\n\t\t\t\t\t\t\tframe.styled = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif not spark.killed then\n\t\t\t\t\t\t\tspark:SetAlpha(0)\n\t\t\t\t\t\t\tspark:SetTexture(nil)\n\t\t\t\t\t\t\tspark.killed = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif not icon1.styled then\n\t\t\t\t\t\t\ticon1:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\t\t\ticon1:ClearAllPoints()\n\t\t\t\t\t\t\ticon1:SetPoint(\"TOPLEFT\", icon1.overlay, 2, -2)\n\t\t\t\t\t\t\ticon1:SetPoint(\"BOTTOMRIGHT\", icon1.overlay, -2, 2)\n\t\t\t\t\t\t\ticon1.styled = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif not icon2.styled then\n\t\t\t\t\t\t\ticon2:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\t\t\t\ticon2:ClearAllPoints()\n\t\t\t\t\t\t\ticon2:SetPoint(\"TOPLEFT\", icon2.overlay, 2, -2)\n\t\t\t\t\t\t\ticon2:SetPoint(\"BOTTOMRIGHT\", icon2.overlay, -2, 2)\n\t\t\t\t\t\t\ticon2.styled = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif not tbar.styled then\n\t\t\t\t\t\t\ttbar:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 2, -2)\n\t\t\t\t\t\t\ttbar:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -2, 2)\n\t\t\t\t\t\t\ttbar.styled = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif not name.styled then\n\t\t\t\t\t\t\tname:ClearAllPoints()\n\t\t\t\t\t\t\tname:SetPoint(\"LEFT\", frame, \"LEFT\", 4, 0)\n\t\t\t\t\t\t\tname:SetWidth(165)\n\t\t\t\t\t\t\tname:SetHeight(8)\n\t\t\t\t\t\t\tname:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\t\t\t\tname:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\t\t\t\t\t\tname:SetJustifyH(\"LEFT\")\n\t\t\t\t\t\t\tname.SetFont = T.dummy\n\t\t\t\t\t\t\tname.styled = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif not timer.styled then\n\t\t\t\t\t\t\ttimer:ClearAllPoints()\n\t\t\t\t\t\t\ttimer:SetPoint(\"RIGHT\", frame, \"RIGHT\", -1, 0)\n\t\t\t\t\t\t\ttimer:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\t\t\t\ttimer:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\t\t\t\t\t\ttimer:SetJustifyH(\"RIGHT\")\n\t\t\t\t\t\t\ttimer.SetFont = T.dummy\n\t\t\t\t\t\t\ttimer.styled = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif DBT.Options.IconLeft then icon1:Show() icon1.overlay:Show() else icon1:Hide() icon1.overlay:Hide() end\n\t\t\t\t\t\tif DBT.Options.IconRight then icon2:Show() icon2.overlay:Show() else icon2:Hide() icon2.overlay:Hide() end\n\t\t\t\t\t\ttbar:SetAlpha(1)\n\t\t\t\t\t\tframe:SetAlpha(1)\n\t\t\t\t\t\tframe:Show()\n\t\t\t\t\t\tbar:Update(0)\n\t\t\t\t\t\tbar.injected = true\n\t\t\t\t\tend\n\t\t\t\t\tbar:ApplyStyle()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif DBM then\n\t\t\thooksecurefunc(DBT, \"CreateBar\", SkinBars)\n\n\t\t\thooksecurefunc(DBM.RangeCheck, \"Show\", function()\n\t\t\t\tif DBMRangeCheck then\n\t\t\t\t\tDBMRangeCheck:SetTemplate(\"Transparent\")\n\t\t\t\tend\n\t\t\t\tif DBMRangeCheckRadar then\n\t\t\t\t\tDBMRangeCheckRadar:SetTemplate(\"Transparent\")\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\thooksecurefunc(DBM.InfoFrame, \"Show\", function()\n\t\t\t\tif DBMInfoFrame then\n\t\t\t\t\tDBMInfoFrame:SetTemplate(\"Transparent\")\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\t\tlocal replace = string.gsub\n\t\tlocal old = RaidNotice_AddMessage\n\t\tRaidNotice_AddMessage = function(noticeFrame, textString, colorInfo)\n\t\t\tif textString:find(\" |T\") then\n\t\t\t\ttextString = replace(textString, \"(:12:12)\", \":13:13:0:0:64:64:5:59:5:59\")\n\t\t\tend\n\t\t\treturn old(noticeFrame, textString, colorInfo)\n\t\tend\n\tend\n\tif IsAddOnLoaded(\"DBM-GUI\") then\n\t\ttinsert(UISpecialFrames, \"DBM_GUI_OptionsFrame\")\n\t\t_G[\"DBM_GUI_OptionsFrame\"]:SetTemplate(\"Transparent\")\n\t\t_G[\"DBM_GUI_OptionsFramePanelContainer\"]:SetTemplate(\"Overlay\")\n\n\t\t_G[\"DBM_GUI_OptionsFrameTab1\"]:ClearAllPoints()\n\t\t_G[\"DBM_GUI_OptionsFrameTab1\"]:SetPoint(\"TOPLEFT\", _G[\"DBM_GUI_OptionsFrameList\"], \"TOPLEFT\", 10, 27)\n\t\t_G[\"DBM_GUI_OptionsFrameTab2\"]:ClearAllPoints()\n\t\t_G[\"DBM_GUI_OptionsFrameTab2\"]:SetPoint(\"TOPLEFT\", _G[\"DBM_GUI_OptionsFrameTab1\"], \"TOPRIGHT\", 6, 0)\n\n\t\t_G[\"DBM_GUI_OptionsFrameList\"]:HookScript(\"OnShow\", function(self) self:SetTemplate(\"Overlay\") end)\n\t\t_G[\"DBM_GUI_OptionsFrameDBMOptions\"]:HookScript(\"OnShow\", function(self) self:SetTemplate(\"Overlay\") end)\n\t\t_G[\"DBM_GUI_OptionsFrameHeader\"]:SetTexture(\"\")\n\t\t_G[\"DBM_GUI_OptionsFrameHeader\"]:ClearAllPoints()\n\t\t_G[\"DBM_GUI_OptionsFrameHeader\"]:SetPoint(\"TOP\", DBM_GUI_OptionsFrame, 0, 7)\n\n\t\tlocal dbmbskins = {\n\t\t\t\"DBM_GUI_OptionsFrameWebsiteButton\",\n\t\t\t\"DBM_GUI_OptionsFrameOkay\",\n\t\t\t\"DBM_GUI_OptionsFrameTab1\",\n\t\t\t\"DBM_GUI_OptionsFrameTab2\"\n\t\t}\n\n\t\tfor i = 1, getn(dbmbskins) do\n\t\t\tlocal buttons = _G[dbmbskins[i]]\n\t\t\tif buttons and not buttons.overlay then\n\t\t\t\tbuttons:SkinButton(true)\n\t\t\tend\n\t\tend\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tDBM settings(by ALZA and help from Affli)\n----------------------------------------------------------------------------------------\nfunction T.UploadDBM()\n\tif IsAddOnLoaded(\"DBM-Core\") then\n\t\tDBM_UseDualProfile = false\n\t\tDBM_AllSavedOptions[\"Default\"].Enabled = true\n\t\tDBM_AllSavedOptions[\"Default\"].ShowMinimapButton = C.skins.minimap_buttons and true or false\n\t\tDBM_AllSavedOptions[\"Default\"].WarningIconLeft = false\n\t\tDBM_AllSavedOptions[\"Default\"].WarningIconRight = false\n\t\tDBM_AllSavedOptions[\"Default\"].WarningColors = {\n\t\t\t{[\"b\"] = T.color.b, [\"g\"] = T.color.g, [\"r\"] = T.color.r,},\n\t\t\t{[\"b\"] = T.color.b, [\"g\"] = T.color.g, [\"r\"] = T.color.r,},\n\t\t\t{[\"b\"] = T.color.b, [\"g\"] = T.color.g, [\"r\"] = T.color.r,},\n\t\t\t{[\"b\"] = T.color.b, [\"g\"] = T.color.g, [\"r\"] = T.color.r,},\n\t\t}\n\t\tDBM_AllSavedOptions[\"Default\"].RangeFrameX = 244\n\t\tDBM_AllSavedOptions[\"Default\"].RangeFramePoint = \"LEFT\"\n\t\tDBM_AllSavedOptions[\"Default\"].ShowSpecialWarnings = true\n\t\tDBM_AllSavedOptions[\"Default\"].SpecialWarningFont = C.media.normal_font\n\t\tDBM_AllSavedOptions[\"Default\"].SpecialWarningFontSize = 50\n\t\tDBM_AllSavedOptions[\"Default\"].SpecialWarningX = 0\n\t\tDBM_AllSavedOptions[\"Default\"].SpecialWarningY = 75\n\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].StartColorR = T.color.r\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].StartColorG = T.color.g\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].StartColorB = T.color.b\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].EndColorR = T.color.r\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].EndColorG = T.color.g\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].EndColorB = T.color.b\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].Scale = 1\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeScale = 1\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].BarXOffset = 0\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].BarYOffset = 7\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].Font = C.font.stylization_font\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].FontSize = C.font.stylization_font_size\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].Width = 189\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].TimerX = 143\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].TimerPoint = \"BOTTOMLEFT\"\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].FillUpBars = true\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].IconLeft = true\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].ExpandUpwards = true\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].Texture = C.media.texture\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].IconRight = false\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeBarXOffset = 0\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeBarsEnabled = false\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeWidth = 189\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeTimerX = 7\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeTimerPoint = \"CENTER\"\n\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeBarYOffset = 7\n\n\t\tif C.actionbar.bottombars == 1 then\n\t\t\tDBM_AllSavedOptions[\"Default\"].RangeFrameY = 101\n\t\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].TimerY = 139\n\t\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeTimerY = -136\n\t\telseif C.actionbar.bottombars == 2 then\n\t\t\tDBM_AllSavedOptions[\"Default\"].RangeFrameY = 129\n\t\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].TimerY = 167\n\t\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeTimerY = -108\n\t\telseif C.actionbar.bottombars == 3 then\n\t\t\tDBM_AllSavedOptions[\"Default\"].RangeFrameY = 157\n\t\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].TimerY = 195\n\t\t\tDBT_AllPersistentOptions[\"Default\"][\"DBM\"].HugeTimerY = -80\n\t\tend\n\t\tDBM_AllSavedOptions[\"Default\"].InstalledBars = C.actionbar.bottombars\n\tend\nend\n\nStaticPopupDialogs.SETTINGS_DBM = {\n\ttext = L_POPUP_SETTINGS_DBM,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function() T.UploadDBM() ReloadUI() end,\n\ttimeout = 0,\n\twhileDead = 1,\n\thideOnEscape = true,\n\tpreferredIndex = 5,\n}\n\n----------------------------------------------------------------------------------------\n--\tOn logon function\n----------------------------------------------------------------------------------------\nlocal OnLogon = CreateFrame(\"Frame\")\nOnLogon:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nOnLogon:SetScript(\"OnEvent\", function(self)\n\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\n\tif IsAddOnLoaded(\"DBM-Core\") then\n\t\tif DBM_AllSavedOptions[\"Default\"].InstalledBars ~= C.actionbar.bottombars then\n\t\t\tStaticPopup_Show(\"SETTINGS_DBM\")\n\t\tend\n\tend\nend)\n"
  },
  {
    "path": "ShestakUI/Modules/Skins/Details.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.details ~= true or not IsAddOnLoaded(\"Details\") then return end\n\n----------------------------------------------------------------------------------------\n--\tDetails skin\n----------------------------------------------------------------------------------------\nhooksecurefunc(_detalhes.gump, \"CreateNewLine\", function(_, instancia, index)\n\tlocal bar = _G[\"DetailsBarra_\"..instancia.meu_id..\"_\"..index]\n\tlocal icon = _G[\"DetailsBarra_IconFrame_\"..instancia.meu_id..\"_\"..index]\n\n\tif bar and not bar.backdrop then\n\t\tbar:CreateBackdrop(\"Defalt\")\n\t\tbar.backdrop:SetPoint(\"TOPLEFT\", icon, -2, 2)\n\n\t\tbar.bg = bar:CreateTexture(nil, \"BORDER\")\n\t\tbar.bg:SetAllPoints(bar)\n\t\tbar.bg:SetTexture(C.media.texture)\n\t\tbar.bg:SetVertexColor(.6, .6, .6, 0.25)\n\tend\n\n\tlocal frame = _G[\"DetailsUpFrameInstance\"..instancia.meu_id]\n\tif not frame.b then\n\t\tframe.b = CreateFrame(\"Frame\", nil, frame:GetParent())\n\t\tframe.b:SetTemplate(\"Overlay\")\n\t\tframe.b:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -23, 2)\n\t\tframe.b:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 34, 4)\n\t\tframe.b:SetFrameLevel(frame:GetFrameLevel() - 1)\n\tend\nend)\n\nhooksecurefunc(_detalhes, \"SetFontOutline\", function(_, fontString)\n\tlocal fonte, size = fontString:GetFont()\n\tif fonte == \"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Fonts\\\\Pixel.ttf\" then\n\t\tfontString:SetFont(fonte, size, \"MONOCHROMEOUTLINE\")\n\t\tif fontString:GetShadowColor() then\n\t\t\tfontString:SetShadowColor(0, 0, 0, 0)\n\t\tend\n\tend\nend)\n\nlocal skinTable = {\n\tfile = [[Interface\\AddOns\\Details\\images\\skins\\classic_skin_v1.blp]],\n\tauthor = \"Shestak\",\n\tversion = \"1.0\",\n\tsite = \"unknown\",\n\tdesc = \"ShestakUI style skin.\",\n\n\t--micro frames\n\tmicro_frames = {\n\t\tcolor = {1, 1, 1, 1},\n\t\tfont = \"Hooge\",\n\t\tsize = 8,\n\t\ttextymod = 1,\n\t},\n\n\tcan_change_alpha_head = true,\n\ticon_anchor_main = {-1, -5},\n\ticon_anchor_plugins = {-7, -13},\n\ticon_plugins_size = {19, 18},\n\n\t--anchors:\n\ticon_point_anchor = {-37, 0},\n\tleft_corner_anchor = {-107, 0},\n\tright_corner_anchor = {96, 0},\n\n\ticon_point_anchor_bottom = {-37, 12},\n\tleft_corner_anchor_bottom = {-107, 0},\n\tright_corner_anchor_bottom = {96, 0},\n\n\ticon_on_top = true,\n\ticon_ignore_alpha = true,\n\ticon_titletext_position = {3, 3},\n\n\t--overwrites\n\tinstance_cprops = {\n\t\t[\"show_statusbar\"] = false,\n\t\t[\"menu_icons_size\"] = 0.850000023841858,\n\t\t[\"color\"] = {\n\t\t\t0, -- [1]\n\t\t\t0, -- [2]\n\t\t\t0, -- [3]\n\t\t\t0, -- [4]\n\t\t},\n\t\t[\"menu_anchor\"] = {\n\t\t\t16, -- [1]\n\t\t\t6, -- [2]\n\t\t\t[\"side\"] = 2,\n\t\t},\n\t\t[\"bg_r\"] = 1,\n\t\t[\"hide_out_of_combat\"] = false,\n\t\t[\"following\"] = {\n\t\t\t[\"bar_color\"] = {\n\t\t\t\t1, -- [1]\n\t\t\t\t1, -- [2]\n\t\t\t\t1, -- [3]\n\t\t\t},\n\t\t\t[\"enabled\"] = false,\n\t\t\t[\"text_color\"] = {\n\t\t\t\t1, -- [1]\n\t\t\t\t1, -- [2]\n\t\t\t\t1, -- [3]\n\t\t\t},\n\t\t},\n\t\t[\"color_buttons\"] = {\n\t\t\t1, -- [1]\n\t\t\t1, -- [2]\n\t\t\t1, -- [3]\n\t\t\t1, -- [4]\n\t\t},\n\t\t[\"skin_custom\"] = \"\",\n\t\t[\"menu_anchor_down\"] = {\n\t\t\t16, -- [1]\n\t\t\t-3, -- [2]\n\t\t},\n\t\t[\"micro_displays_locked\"] = true,\n\t\t[\"row_show_animation\"] = {\n\t\t\t[\"anim\"] = \"Fade\",\n\t\t\t[\"options\"] = {\n\t\t\t},\n\t\t},\n\t\t[\"tooltip\"] = {\n\t\t\t[\"n_abilities\"] = 3,\n\t\t\t[\"n_enemies\"] = 3,\n\t\t},\n\t\t[\"total_bar\"] = {\n\t\t\t[\"enabled\"] = false,\n\t\t\t[\"only_in_group\"] = true,\n\t\t\t[\"icon\"] = \"Interface\\\\ICONS\\\\INV_Sigil_Thorim\",\n\t\t\t[\"color\"] = {\n\t\t\t\t1, -- [1]\n\t\t\t\t1, -- [2]\n\t\t\t\t1, -- [3]\n\t\t\t},\n\t\t},\n\t\t[\"show_sidebars\"] = false,\n\t\t[\"instance_button_anchor\"] = {\n\t\t\t-27, -- [1]\n\t\t\t1, -- [2]\n\t\t},\n\t\t[\"row_info\"] = {\n\t\t\t[\"spec_file\"] = \"Interface\\\\AddOns\\\\Details\\\\images\\\\spec_icons_normal\",\n\t\t\t[\"textL_outline\"] = true,\n\t\t\t[\"textR_outline\"] = true,\n\t\t\t[\"textL_outline_small\"] = false,\n\t\t\t[\"textR_outline_small\"] = false,\n\t\t\t[\"texture_highlight\"] = \"Interface\\\\FriendsFrame\\\\UI-FriendsList-Highlight\",\n\t\t\t[\"textR_show_data\"] = {\n\t\t\t\ttrue, -- [1]\n\t\t\t\ttrue, -- [2]\n\t\t\t\ttrue, -- [3]\n\t\t\t},\n\t\t\t[\"textL_enable_custom_text\"] = false,\n\t\t\t[\"fixed_text_color\"] = {\n\t\t\t\t1, -- [1]\n\t\t\t\t1, -- [2]\n\t\t\t\t1, -- [3]\n\t\t\t},\n\t\t\t[\"space\"] = {\n\t\t\t\t[\"right\"] = 0,\n\t\t\t\t[\"left\"] = 0,\n\t\t\t\t[\"between\"] = 7,\n\t\t\t},\n\t\t\t[\"texture_background_class_color\"] = false,\n\t\t\t[\"start_after_icon\"] = true,\n\t\t\t[\"font_face_file\"] = \"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Fonts\\\\Pixel.ttf\",\n\t\t\t[\"backdrop\"] = {\n\t\t\t\t[\"enabled\"] = false,\n\t\t\t\t[\"size\"] = 12,\n\t\t\t\t[\"color\"] = {\n\t\t\t\t\t1, -- [1]\n\t\t\t\t\t1, -- [2]\n\t\t\t\t\t1, -- [3]\n\t\t\t\t\t1, -- [4]\n\t\t\t\t},\n\t\t\t\t[\"texture\"] = \"Details BarBorder 2\",\n\t\t\t},\n\t\t\t[\"font_size\"] = 8,\n\t\t\t[\"height\"] = 14,\n\t\t\t[\"texture_file\"] = \"AddOns\\\\ShestakUI\\\\Media\\\\Textures\\\\Texture.tga\",\n\t\t\t[\"icon_file\"] = \"Interface\\\\AddOns\\\\Details\\\\images\\\\classes_small\",\n\t\t\t[\"textR_bracket\"] = \"(\",\n\t\t\t[\"textR_enable_custom_text\"] = false,\n\t\t\t[\"fixed_texture_color\"] = {\n\t\t\t\t0, -- [1]\n\t\t\t\t0, -- [2]\n\t\t\t\t0, -- [3]\n\t\t\t},\n\t\t\t[\"textL_show_number\"] = true,\n\t\t\t[\"textL_custom_text\"] = \"{data1}. {data3}{data2}\",\n\t\t\t[\"textR_custom_text\"] = \"{data1} ({data2}, {data3}%)\",\n\t\t\t[\"fixed_texture_background_color\"] = {\n\t\t\t\t0, -- [1]\n\t\t\t\t0, -- [2]\n\t\t\t\t0, -- [3]\n\t\t\t\t0, -- [4]\n\t\t\t},\n\t\t\t[\"models\"] = {\n\t\t\t\t[\"upper_model\"] = \"Spells\\\\AcidBreath_SuperGreen.M2\",\n\t\t\t\t[\"lower_model\"] = \"World\\\\EXPANSION02\\\\DOODADS\\\\Coldarra\\\\COLDARRALOCUS.m2\",\n\t\t\t\t[\"upper_alpha\"] = 0.5,\n\t\t\t\t[\"lower_enabled\"] = false,\n\t\t\t\t[\"lower_alpha\"] = 0.1,\n\t\t\t\t[\"upper_enabled\"] = false,\n\t\t\t},\n\t\t\t[\"textR_class_colors\"] = false,\n\t\t\t[\"texture_custom\"] = \"AddOns\\\\ShestakUI\\\\Media\\\\Textures\\\\Texture.tga\",\n\t\t\t[\"texture\"] = \"Smooth!\",\n\t\t\t[\"textL_class_colors\"] = false,\n\t\t\t[\"alpha\"] = 1,\n\t\t\t[\"no_icon\"] = false,\n\t\t\t[\"texture_background\"] = \"Smooth!\",\n\t\t\t[\"texture_background_file\"] = \"AddOns\\\\ShestakUI\\\\Media\\\\Textures\\\\Texture.tga\",\n\t\t\t[\"font_face\"] = \"Hooge\",\n\t\t\t[\"font_shadow\"] = \"OUTLINE\",\n\t\t\t[\"texture_class_colors\"] = true,\n\t\t\t[\"percent_type\"] = 1,\n\t\t\t[\"fast_ps_update\"] = false,\n\t\t\t[\"textR_separator\"] = \",\",\n\t\t\t[\"use_spec_icons\"] = true,\n\t\t},\n\t\t[\"plugins_grow_direction\"] = 1,\n\t\t[\"menu_alpha\"] = {\n\t\t\t[\"enabled\"] = false,\n\t\t\t[\"onleave\"] = 1,\n\t\t\t[\"ignorebars\"] = false,\n\t\t\t[\"iconstoo\"] = true,\n\t\t\t[\"onenter\"] = 1,\n\t\t},\n\t\t[\"micro_displays_side\"] = 2,\n\t\t[\"grab_on_top\"] = false,\n\t\t[\"strata\"] = \"LOW\",\n\t\t[\"bars_grow_direction\"] = 1,\n\t\t[\"bg_alpha\"] = 0,\n\t\t[\"ignore_mass_showhide\"] = false,\n\t\t[\"hide_in_combat_alpha\"] = 0,\n\t\t[\"menu_icons\"] = {\n\t\t\ttrue, -- [1]\n\t\t\ttrue, -- [2]\n\t\t\ttrue, -- [3]\n\t\t\ttrue, -- [4]\n\t\t\ttrue, -- [5]\n\t\t\tfalse, -- [6]\n\t\t\t[\"space\"] = -2,\n\t\t\t[\"shadow\"] = false,\n\t\t},\n\t\t[\"auto_hide_menu\"] = {\n\t\t\t[\"left\"] = false,\n\t\t\t[\"right\"] = false,\n\t\t},\n\t\t[\"statusbar_info\"] = {\n\t\t\t[\"alpha\"] = 0,\n\t\t\t[\"overlay\"] = {\n\t\t\t\t0.333333333333333, -- [1]\n\t\t\t\t0.333333333333333, -- [2]\n\t\t\t\t0.333333333333333, -- [3]\n\t\t\t},\n\t\t},\n\t\t[\"window_scale\"] = 1,\n\t\t[\"libwindow\"] = {\n\t\t\t[\"y\"] = 90.9987335205078,\n\t\t\t[\"x\"] = -80.0020751953125,\n\t\t\t[\"point\"] = \"BOTTOMRIGHT\",\n\t\t},\n\t\t[\"backdrop_texture\"] = \"Details Ground\",\n\t\t[\"hide_icon\"] = true,\n\t\t[\"bg_b\"] = 0.0941176470588235,\n\t\t[\"toolbar_side\"] = 1,\n\t\t[\"bg_g\"] = 0.0941176470588235,\n\t\t[\"desaturated_menu\"] = false,\n\t\t[\"wallpaper\"] = {\n\t\t\t[\"enabled\"] = false,\n\t\t\t[\"texcoord\"] = {\n\t\t\t\t0, -- [1]\n\t\t\t\t1, -- [2]\n\t\t\t\t0, -- [3]\n\t\t\t\t0.7, -- [4]\n\t\t\t},\n\t\t\t[\"overlay\"] = {\n\t\t\t\t1, -- [1]\n\t\t\t\t1, -- [2]\n\t\t\t\t1, -- [3]\n\t\t\t\t1, -- [4]\n\t\t\t},\n\t\t\t[\"anchor\"] = \"all\",\n\t\t\t[\"height\"] = 114.042518615723,\n\t\t\t[\"alpha\"] = 0.5,\n\t\t\t[\"width\"] = 283.000183105469,\n\t\t},\n\t\t[\"stretch_button_side\"] = 1,\n\t\t[\"attribute_text\"] = {\n\t\t\t[\"enabled\"] = true,\n\t\t\t[\"shadow\"] = true,\n\t\t\t[\"side\"] = 1,\n\t\t\t[\"text_size\"] = 8,\n\t\t\t[\"custom_text\"] = \"{name}\",\n\t\t\t[\"text_face\"] = \"Hooge\",\n\t\t\t[\"anchor\"] = {\n\t\t\t\t-19, -- [1]\n\t\t\t\t9, -- [2]\n\t\t\t},\n\t\t\t[\"text_color\"] = {\n\t\t\t\t1, -- [1]\n\t\t\t\t1, -- [2]\n\t\t\t\t1, -- [3]\n\t\t\t\t1, -- [4]\n\t\t\t},\n\t\t\t[\"enable_custom_text\"] = false,\n\t\t\t[\"show_timer\"] = {\n\t\t\t\ttrue, -- [1]\n\t\t\t\ttrue, -- [2]\n\t\t\t\ttrue, -- [3]\n\t\t\t},\n\t\t},\n\t\t[\"bars_sort_direction\"] = 1,\n\t},\n}\n\n_detalhes.skins[\"Minimalistic v2\"] = skinTable\n\nlocal lower_instance = _detalhes:GetLowerInstanceNumber()\nif lower_instance then\n\tfor i = lower_instance, #_detalhes.tabela_instancias do\n\t\tlocal instance = Details:GetInstance(i)\n\t\tif instance and instance.rows_fit_in_window then\n\t\t\tfor j = 1, instance.rows_fit_in_window do\n\t\t\t\tlocal bar = _G[\"DetailsBarra_Statusbar_\"..i..\"_\"..j]\n\t\t\t\tlocal icon = _G[\"DetailsBarra_IconFrame_\"..i..\"_\"..j]\n\t\t\t\tif bar and not bar.backdrop then\n\t\t\t\t\tbar:CreateBackdrop(\"Defalt\")\n\t\t\t\t\tbar.backdrop:SetPoint(\"TOPLEFT\", icon, -2, 2)\n\n\t\t\t\t\tbar.bg = bar:CreateTexture(nil, \"BORDER\")\n\t\t\t\t\tbar.bg:SetAllPoints(bar)\n\t\t\t\t\tbar.bg:SetTexture(C.media.texture)\n\t\t\t\t\tbar.bg:SetVertexColor(.6, .6, .6, 0.25)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal frame = _G[\"DetailsUpFrameInstance\"..i]\n\t\t\tframe.b = CreateFrame(\"Frame\", nil, frame:GetParent())\n\t\t\tframe.b:SetTemplate(\"Overlay\")\n\t\t\tframe.b:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", -23, 2)\n\t\t\tframe.b:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", 34, 4)\n\t\t\tframe.b:SetFrameLevel(frame:GetFrameLevel() - 1)\n\n\t\t\tinstance:ChangeSkin(\"Minimalistic v2\")\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Skins/Dominos.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.dominos ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tDominos skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"Dominos\") then return end\n\n\tlocal function StyleNormalButton(self)\n\t\tlocal name = self:GetName()\n\t\tif name:match(\"ExtraActionButton\") then return end\n\t\tlocal button = self\n\t\tlocal icon = _G[name..\"Icon\"]\n\t\tlocal count = _G[name..\"Count\"]\n\t\tlocal flash = _G[name..\"Flash\"]\n\t\tlocal hotkey = _G[name..\"HotKey\"]\n\t\tlocal border = _G[name..\"Border\"]\n\t\tlocal btname = _G[name..\"Name\"]\n\t\tlocal normal = _G[name..\"NormalTexture\"]\n\n\t\tflash:SetTexture(\"\")\n\t\tbutton:SetNormalTexture(0)\n\n\t\tif border then\n\t\t\tborder:Hide()\n\t\t\tborder = T.dummy\n\t\tend\n\n\t\tif count then\n\t\t\tcount:ClearAllPoints()\n\t\t\tcount:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\t\tcount:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\tcount:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\tend\n\n\t\tif btname then\n\t\t\tbtname:ClearAllPoints()\n\t\t\tbtname:SetPoint(\"BOTTOM\", 0, 0)\n\t\t\tbtname:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\tbtname:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\tend\n\n\t\tif hotkey then\n\t\t\thotkey:ClearAllPoints()\n\t\t\thotkey:SetPoint(\"TOPRIGHT\", 0, 0)\n\t\t\thotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\thotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\t\thotkey:SetWidth(button:GetWidth() - 1)\n\t\tend\n\n\t\tif not button.isSkinned then\n\t\t\tbutton:CreateBackdrop(\"Transparent\")\n\t\t\tbutton.backdrop:SetAllPoints()\n\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ticon:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\n\t\t\tbutton.isSkinned = true\n\t\tend\n\n\t\tif normal then\n\t\t\tnormal:ClearAllPoints()\n\t\t\tnormal:SetPoint(\"TOPLEFT\")\n\t\t\tnormal:SetPoint(\"BOTTOMRIGHT\")\n\t\tend\n\tend\n\n\tlocal function StyleSmallButton(button, icon, name, hotkey, pet)\n\t\tif not button then return end\n\t\tlocal flash = _G[name..\"Flash\"]\n\t\tbutton:StyleButton()\n\t\tbutton:SetNormalTexture(0)\n\n\t\thooksecurefunc(button, \"SetNormalTexture\", function(self, texture)\n\t\t\tif texture and texture ~= \"\" then\n\t\t\t\tself:SetNormalTexture(0)\n\t\t\tend\n\t\tend)\n\n\t\tif flash then\n\t\t\tflash:SetColorTexture(0.8, 0.8, 0.8, 0.5)\n\t\t\tflash:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\t\tflash:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\t\tend\n\n\t\tif hotkey then\n\t\t\thotkey:ClearAllPoints()\n\t\t\thotkey:SetPoint(\"TOPRIGHT\", 0, 0)\n\t\t\thotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\thotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\t\thotkey:SetWidth(button:GetWidth() - 1)\n\t\tend\n\n\t\tif not button.isSkinned then\n\t\t\tbutton:CreateBackdrop(\"Transparent\")\n\t\t\tbutton.backdrop:SetAllPoints()\n\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ticon:ClearAllPoints()\n\t\t\ticon:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\n\t\t\tif pet then\n\t\t\t\tlocal autocast = button.AutoCastable\n\t\t\t\tautocast:SetSize((button:GetWidth() * 2) - 10, (button:GetWidth() * 2) - 10)\n\t\t\t\tautocast:ClearAllPoints()\n\t\t\t\tautocast:SetPoint(\"CENTER\", button, 0, 0)\n\n\t\t\t\tlocal shine = _G[name..\"Shine\"]\n\t\t\t\tshine:SetSize(button:GetWidth(), button:GetWidth())\n\n\t\t\t\tlocal cooldown = _G[name..\"Cooldown\"]\n\t\t\t\tcooldown:SetSize(button:GetWidth() - 2, button:GetWidth() - 2)\n\t\t\tend\n\n\t\t\tbutton.isSkinned = true\n\t\tend\n\tend\n\n\tdo\n\t\tfor i = 1, 168 do\n\t\t\tif _G[\"DominosActionButton\"..i] then\n\t\t\t\t_G[\"DominosActionButton\"..i]:StyleButton()\n\t\t\t\tStyleNormalButton(_G[\"DominosActionButton\"..i])\n\t\t\tend\n\t\tend\n\n\t\tfor i = 1, 12 do\n\t\t\t_G[\"ActionButton\"..i]:StyleButton()\n\t\t\t_G[\"MultiBarBottomLeftButton\"..i]:StyleButton()\n\t\t\t_G[\"MultiBarBottomRightButton\"..i]:StyleButton()\n\t\t\t_G[\"MultiBarLeftButton\"..i]:StyleButton()\n\t\t\t_G[\"MultiBarRightButton\"..i]:StyleButton()\n\t\t\tStyleNormalButton(_G[\"ActionButton\"..i])\n\t\t\tStyleNormalButton(_G[\"MultiBarBottomLeftButton\"..i])\n\t\t\tStyleNormalButton(_G[\"MultiBarBottomRightButton\"..i])\n\t\t\tStyleNormalButton(_G[\"MultiBarLeftButton\"..i])\n\t\t\tStyleNormalButton(_G[\"MultiBarRightButton\"..i])\n\t\tend\n\n\t\tfor i = 1, 10 do\n\t\t\tlocal name = \"DominosStanceButton\"..i\n\t\t\tlocal button = _G[name]\n\t\t\tlocal icon = _G[name..\"Icon\"]\n\t\t\tlocal hotkey = _G[name..\"HotKey\"]\n\t\t\tStyleSmallButton(button, icon, name, hotkey)\n\t\tend\n\n\t\tfor i = 1, NUM_PET_ACTION_SLOTS do\n\t\t\tlocal name = \"DominosPetActionButton\"..i\n\t\t\tlocal button = _G[name]\n\t\t\tlocal icon = _G[name..\"Icon\"]\n\t\t\tlocal hotkey = _G[name..\"HotKey\"]\n\t\t\tStyleSmallButton(button, icon, name, hotkey, true)\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/FlyoutButtonCustom.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.actionbar.enable ~= true or C.skins.flyout_button ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tFlyoutButtonCustom skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"FlyoutButtonCustom\") then return end\n\n\tFlyoutButtonCustom_Settings.Highlight = false\n\tFlyoutButtonCustom_Settings.ShowBorders = false\n\tFlyoutButtonCustom_Settings.ButtonsScale = 1\n\tFBC_BUTTON_PLACE_SIZE = C.actionbar.button_size\n\tFBC_BUTTON_PLACE_OFFSET = C.actionbar.button_space\n\tFBC_FRAME_OFFSET = C.actionbar.button_space - 7\n\n\tlocal function CreateBorder(self)\n\t\tlocal name = self:GetName()\n\t\tlocal button = self\n\t\tlocal icon = _G[name..\"Icon\"]\n\t\tlocal border = _G[name..\"Border\"]\n\t\tlocal count = _G[name..\"Count\"]\n\t\tlocal btname = _G[name..\"Name\"]\n\t\tlocal hotkey = _G[name..\"HotKey\"]\n\t\tlocal normal = _G[name..\"NormalTexture\"]\n\n\t\tbutton:StyleButton()\n\t\tbutton:SetNormalTexture(0)\n\n\t\tif border then\n\t\t\tborder:Hide()\n\t\t\tborder = T.dummy\n\t\tend\n\n\t\tcount:ClearAllPoints()\n\t\tcount:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\tcount:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\tcount:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\n\t\tif btname then\n\t\t\tif C.actionbar.macro == true then\n\t\t\t\tbtname:ClearAllPoints()\n\t\t\t\tbtname:SetPoint(\"BOTTOM\", 0, 0)\n\t\t\t\tbtname:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\t\tbtname:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\t\t\t--btname:SetWidth(C.actionbar.button_size - 1)\n\t\t\telse\n\t\t\t\tbtname:Kill()\n\t\t\tend\n\t\tend\n\n\t\tif C.actionbar.hotkey == true then\n\t\t\thotkey:ClearAllPoints()\n\t\t\thotkey:SetPoint(\"TOPRIGHT\", 0, 0)\n\t\t\thotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)\n\t\t\thotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)\n\t\t\thotkey:SetWidth(C.actionbar.button_size - 1)\n\t\t\thotkey.ClearAllPoints = T.dummy\n\t\t\thotkey.SetPoint = T.dummy\n\t\telse\n\t\t\thotkey:Kill()\n\t\tend\n\n\t\tif not button.isSkinned then\n\t\t\tif self:GetHeight() ~= C.actionbar.button_size and not InCombatLockdown() then\n\t\t\t\tself:SetSize(C.actionbar.button_size, C.actionbar.button_size)\n\t\t\tend\n\n\t\t\tbutton:CreateBackdrop(\"Transparent\")\n\t\t\tbutton.backdrop:SetAllPoints()\n\t\t\tif C.actionbar.classcolor_border == true then\n\t\t\t\tbutton.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\t\tend\n\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ticon:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\t\ticon:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\n\t\t\tbutton.isSkinned = true\n\t\tend\n\n\t\tif normal then\n\t\t\tnormal:ClearAllPoints()\n\t\t\tnormal:SetPoint(\"TOPLEFT\")\n\t\t\tnormal:SetPoint(\"BOTTOMRIGHT\")\n\t\tend\n\tend\n\n\thooksecurefunc(FlyoutListButton, \"UpdateButton\", CreateBorder)\n\thooksecurefunc(FlyoutListButton, \"OnReceiveDrag\", CreateBorder)\n\thooksecurefunc(FlyoutListButton, \"UpdateTexture\", CreateBorder)\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/MageNuggets.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.mage_nuggets ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMageNuggets skin /run ShowConfigFrames()\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"MageNuggets\") then return end\n\n\tMageNuggets.cooldownSize = 3\n\n\tlocal sparks = {\n\t\t\"MageNugMBProcFrame_ProcBarSpark\",\n\t\t\"MageNugFoFProcFrame_ProcBarSpark\",\n\t\t\"MageNugImpactProcFrame_ProcBarSpark\",\n\t\t\"MageNugBFProcFrame_ProcBarSpark\",\n\t\t\"MageNugProcFrame_ProcBarSpark\",\n\t\t\"MageNugLB1_Frame_BarSpark\",\n\t\t\"MageNugLB2_Frame_BarSpark\",\n\t\t\"MageNugLB3_Frame_BarSpark\",\n\t}\n\n\tfor i = 1, getn(sparks) do\n\t\tlocal spark = _G[sparks[i]]\n\t\tif spark then\n\t\t\tspark:SetTexture(nil)\n\t\tend\n\tend\n\n\tlocal icons = {\n\t\t\"MNPyromaniac_FrameTexture\",\n\t\t\"MageNugMI_FrameTexture1\",\n\t\t\"MageNugCauterize_FrameTexture1\",\n\t\t\"MageNugMBProcFrameTexture\",\n\t\t\"MageNugPolyFrameTexture\",\n\t\t\"MageNugFoFProcFrameTexture\",\n\t\t\"MageNugImpactProcFrameTexture\",\n\t\t\"MageNugBFProcFrameTexture\",\n\t\t\"MageNugProcFrameTexture\",\n\t\t\"MageNugClearcast_FrameTexture\",\n\t\t\"MageNugAB_FrameTexture\",\n\t\t\"MageNugIgnite_FrameTexture\",\n\t\t\"MageNugLB_FrameTextureIcon\",\n\t\t\"MageNugMoonkin_Frame_Texture\",\n\t\t\"MNmoonFire_FrameTexture\",\n\t\t\"MNinsectSwarm_FrameTexture\",\n\t\t\"MNstarSurge_FrameTexture\",\n\t\t\"MageNugCD1_Frame_Texture\",\n\t\t\"MageNugCD2_Frame_Texture\",\n\t\t\"MageNugCD3_Frame_Texture\",\n\t\t\"MageNugCD4_Frame_Texture\",\n\t\t\"MageNugCD5_Frame_Texture\",\n\t\t\"MageNugCD6_Frame_Texture\"\n\t}\n\n\tfor i = 1, getn(icons) do\n\t\tlocal icon = _G[icons[i]]\n\t\tif icon then\n\t\t\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tend\n\tend\n\n\tlocal checkboxes = {\n\t\t\"MageNugOptionsFrame_CheckButton2\",\n\t\t\"MageNugOptionsFrame_CheckButton3\",\n\t\t\"MageNugOptionsFrame_CheckButton6\",\n\t\t\"MageNugOptionsFrame_CheckButton7\",\n\t\t\"MageNugOptionsFrame_CheckButton8\",\n\t\t\"MageNugOptionsFrame_CheckButton9\",\n\t\t\"MageNugOptionsFrame_CheckButton11\",\n\t\t\"MageNugOptionsFrame_CheckButton13\",\n\t\t\"MageNugOptionsFrame_CheckButton14\",\n\t\t\"MageNugOptionsFrame_CheckButtonCC\",\n\t\t\"MageNugOptionsFrame_CheckButtonMG\",\n\t\t\"MageNugOptionsFrame_CheckButtonMGcombat\",\n\t\t\"MageNugOptionsFrame_IgniteCheckButton\",\n\t\t\"MageNugOptionsFrame_ABcastCheckButton\",\n\t\t\"CauterizeCheckButton\",\n\t\t\"MageNugStatMonOptionFrame_CheckButton0\",\n\t\t\"MageNugStatMonOptionFrame_CheckButton1\",\n\t\t\"MageNugStatMonOptionFrame_CheckButton2\",\n\t\t\"MageNugMsgOptionFrame_CheckButton\",\n\t\t\"MageNugMsgOptionFrame_CheckButton2\",\n\t\t\"MageNugMsgOptionFrame_CheckButton3\",\n\t\t\"MageNugMsgOptionFrame_CheckButton4\",\n\t\t\"MageNugMsgOptionFrame_CheckButton5\",\n\t\t\"MageNugMsgOptionFrame_CheckButton6\",\n\t\t\"MageNugMoonkinOptionFrame_CheckButton\",\n\t\t\"MageNugMoonkinOptionFrame_CheckButton0\",\n\t\t\"MageNugMoonkinOptionFrame_CheckButton1\",\n\t\t\"MageNugMoonkinOptionFrame_CheckButton2\",\n\t\t\"MageNugMoonkinOptionFrame_CheckButton3\",\n\t\t\"MageNugMoonkinOptionFrame_CheckButtonMin\",\n\t\t\"MageNugMoonkinOptionFrame_CheckButtonAnchor\",\n\t\t\"MageNugMoonkinOptionFrame_ProcCheckButton\",\n\t\t\"MageNugMoonkinOptionFrame_CastCheckButton\",\n\t\t\"MageNugPriestOptionFrame_CheckButton0\",\n\t\t\"MageNugPriestOptionFrame_CheckButton2\",\n\t\t\"MageNugPriestOptionFrame_CheckButton3\",\n\t\t\"MageNugSoundOptionFrame_MICheckButton\",\n\t\t\"MageNugSoundOptionFrame_ProcCheckButton\",\n\t\t\"MageNugSoundOptionFrame_PolyCheckButton\",\n\t\t\"MageNugSoundOptionFrame_HotStreakCheckButton\",\n\t\t\"MageNugSoundOptionFrame_ImpactCheckButton\",\n\t\t\"MageNugSoundOptionFrame_FoFCheckButton\",\n\t\t\"MageNugSoundOptionFrame_BrainFreezeCheckButton\",\n\t\t\"MageNugSoundOptionFrame_CauterizeCheckButton\",\n\t\t\"MageNugSoundOptionFrame_TimeWarpCheckButton\",\n\t\t\"MageNugSoundOptionFrame_ABCheckButton\",\n\t\t\"MageNugOption2Frame_MinimapCheckButton\",\n\t\t\"MageNugOption2Frame_CameraCheckButton\",\n\t\t\"MageNugOption2Frame_ConsoleTextCheckButton\",\n\t\t\"MageNugOption2Frame_LockFramesCheckButton\",\n\t\t\"MageNugOption2Frame_CheckButtonTT\",\n\t\t\"MageNugOption2Frame_ClickThruCheckButton\",\n\t\t\"MageNugOption2Frame_SimpleUICheckButton\",\n\t\t\"MageNugCooldownFrame_apButton\",\n\t\t\"MageNugCooldownFrame_cdButton\",\n\t\t\"MageNugCooldownFrame_bwButton\",\n\t\t\"MageNugCooldownFrame_cbButton\",\n\t\t\"MageNugCooldownFrame_csButton\",\n\t\t\"MageNugCooldownFrame_dfButton\",\n\t\t\"MageNugCooldownFrame_dbButton\",\n\t\t\"MageNugCooldownFrame_mwButton\",\n\t\t\"MageNugCooldownFrame_frzButton\",\n\t\t\"MageNugCooldownFrame_msButton\",\n\t\t\"MageNugCooldownFrame_ibrButton\",\n\t\t\"MageNugCooldownFrame_starfallButton\",\n\t\t\"MageNugCooldownFrame_evoButton\",\n\t\t\"MageNugCooldownFrame_treantButton\",\n\t\t\"MageNugCooldownFrame_ivButton\",\n\t\t\"MageNugCooldownFrame_blinkButton\",\n\t\t\"MageNugCooldownFrame_miButton\"\n\t}\n\n\tfor i = 1, getn(checkboxes) do\n\t\tlocal checkbox = _G[checkboxes[i]]\n\t\tif checkbox then\n\t\t\tT.SkinCheckBox(checkbox)\n\t\tend\n\tend\n\n\tlocal sliders = {\n\t\t\"MageNugOptionsFrame_Slider1\",\n\t\t\"MageNugOptionsFrame_Slider2\",\n\t\t\"MageNugOptionsFrame_Slider3\",\n\t\t\"MageNugOptionsFrame_Slider4\",\n\t\t\"MageNugOptionsFrame_Slider5\",\n\t\t\"MageNugStatMonOptionFrame_SPSizeSlider\",\n\t\t\"MageNugStatMonOptionFrame_BorderSlider\",\n\t\t\"MageNugStatMonOptionFrame_TransparencySlider\",\n\t\t\"MageNugMoonkinOptionFrame_Slider\",\n\t\t\"MageNugMoonkinOptionFrame_Slider1\",\n\t\t\"MageNugCooldownFrame_Slider1\"\n\t}\n\n\tfor i = 1, getn(sliders) do\n\t\tlocal slider = _G[sliders[i]]\n\t\tif slider then\n\t\t\tT.SkinSlider(slider)\n\t\t\tslider:SetFrameLevel(slider:GetFrameLevel() + 2)\n\t\tend\n\tend\n\n\tlocal editboxs = {\n\t\t\"SlowFallMsgEditBox\",\n\t\t\"SlowFallMsgEditBox2\",\n\t\t\"SlowFallMsgEditBox3\",\n\t\t\"FocMagNotifyEditBox\",\n\t\t\"FocMagNotifyEditBox2\",\n\t\t\"FocMagNotifyEditBox3\",\n\t\t\"FocMagThankEditBox\",\n\t\t\"FocMagThankEditBox2\",\n\t\t\"InnervThankEditBox\",\n\t\t\"InnervThankEditBox2\",\n\t\t\"PowerInfusionEditBox\",\n\t\t\"DarkIntentEditBox\",\n\t\t\"MageNugMoonkinOptionFrame_SoundEditBox\",\n\t\t\"MageNugMoonkinOptionFrame_InnervateEditBox\",\n\t\t\"MageNugPriestOptionFrame_EditBox1\",\n\t\t\"MageNugPriestOptionFrame_EditBox2\",\n\t\t\"MageNugPriestOptionFrame_EditBox3\",\n\t\t\"MageNugSoundOptionFrame_MISoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_ProcSoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_PolySoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_HotStreakSoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_ImpactSoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_FoFSoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_BrainFreezeSoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_CauterizeSoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_ABSoundEditBox\",\n\t\t\"MageNugSoundOptionFrame_TimeWarpSoundEditBox\"\n\t}\n\n\tfor i = 1, getn(editboxs) do\n\t\tlocal editbox = _G[editboxs[i]]\n\t\tif editbox then\n\t\t\tT.SkinEditBox(editbox, nil, 14)\n\t\tend\n\tend\n\n\tlocal backdrops = {\n\t\t\"MNPyromaniac_Frame\",\n\t\t\"MageNugMBProcFrame\",\n\t\t\"MageNugPolyFrame\",\n\t\t\"MageNugFoFProcFrame\",\n\t\t\"MageNugImpactProcFrame\",\n\t\t\"MageNugBFProcFrame\",\n\t\t\"MageNugProcFrame\",\n\t\t\"MageNugCauterizeFrame\",\n\t\t\"MNabCast_Frame\",\n\t\t\"MageNugLB1_Frame\",\n\t\t\"MageNugLB2_Frame\",\n\t\t\"MageNugLB3_Frame\",\n\t\t\"MageNugSSProcFrame\"\n\t}\n\n\tfor i = 1, getn(backdrops) do\n\t\tlocal backdrop = _G[backdrops[i]]\n\t\tif backdrop then\n\t\t\tbackdrop:SetBackdrop(nil)\n\t\tend\n\tend\n\n\tlocal texts = {\n\t\t\"MageNugMI_Frame_MIText\",\n\t\t\"MageNugMI_Frame_MIText1\",\n\t\t\"MageNugCauterize_Frame_Text\",\n\t\t\"MageNugCauterize_Frame_Text1\",\n\t\t\"MageNugMBProcFrameText\",\n\t\t\"MageNugMBProcFrameText2\",\n\t\t\"MageNugPolyFrameText\",\n\t\t\"MageNugPolyFrameTimerText\",\n\t\t\"MageNugFoFProcFrameCountText\",\n\t\t\"MageNugFoFProcFrameText\",\n\t\t\"MageNugFoFProcFrameText2\",\n\t\t\"MageNugImpactProcFrameText\",\n\t\t\"MageNugImpactProcFrameText2\",\n\t\t\"MageNugBFProcFrameText\",\n\t\t\"MageNugBFProcFrameText2\",\n\t\t\"MageNugProcFrameText\",\n\t\t\"MageNugProcFrameText2\",\n\t\t\"MageNugClearcast_FrameText\",\n\t\t\"MageNugClearcast_FrameText2\",\n\t\t\"MageNugAB_FrameText\",\n\t\t\"MageNugAB_FrameText1\",\n\t\t\"MageNugAB_FrameText2\",\n\t\t\"MNabCast_FrameText\",\n\t\t\"MageNugIgnite_FrameText2\",\n\t\t\"MageNugLB1_Frame_Text\",\n\t\t\"MageNugLB1_Frame_Text2\",\n\t\t\"MageNugLB2_Frame_Text\",\n\t\t\"MageNugLB2_Frame_Text2\",\n\t\t\"MageNugLB3_Frame_Text\",\n\t\t\"MageNugLB3_Frame_Text2\",\n\t\t\"MageNugSP_FrameText\",\n\t\t\"MNSpellSteal_FrameTitleText\",\n\t\t\"MNSpellSteal_FrameBuffText\",\n\t\t\"MNSpellStealFocus_FrameTitleText\",\n\t\t\"MNSpellStealFocus_FrameBuffText\",\n\t\t\"MageNugMoonkin_Frame_Text\",\n\t\t\"MNmoonFire_FrameText\",\n\t\t\"MNinsectSwarm_FrameText\",\n\t\t\"MNstarSurge_FrameText\",\n\t\t\"MageNugCD_Frame_Text\",\n\t\t\"MageNugCD1_Frame_Text\",\n\t\t\"MageNugCD2_Frame_Text\",\n\t\t\"MageNugCD3_Frame_Text\",\n\t\t\"MageNugCD4_Frame_Text\",\n\t\t\"MageNugCD5_Frame_Text\",\n\t\t\"MageNugCD6_Frame_Text\",\n\t\t\"MageNugCD1_Frame_Text2\",\n\t\t\"MageNugCD2_Frame_Text2\",\n\t\t\"MageNugCD3_Frame_Text2\",\n\t\t\"MageNugCD4_Frame_Text2\",\n\t\t\"MageNugCD5_Frame_Text2\",\n\t\t\"MageNugCD6_Frame_Text2\",\n\t}\n\n\tfor i = 1, getn(texts) do\n\t\tlocal text = _G[texts[i]]\n\t\tif text then\n\t\t\ttext:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\ttext:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\tend\n\tend\n\n\tlocal bars = {\n\t\t\"MageNugCauterize_Frame_Bar\",\n\t\t\"MageNugMBProcFrame_ProcBar\",\n\t\t\"MageNugPolyFrame_Bar\",\n\t\t\"MageNugFoFProcFrame_ProcBar\",\n\t\t\"MageNugImpactProcFrame_ProcBar\",\n\t\t\"MageNugBFProcFrame_ProcBar\",\n\t\t\"MageNugProcFrame_ProcBar\",\n\t\t\"MageNugClearcast_Frame_Bar\",\n\t\t\"MageNugAB_Frame_ABBar\",\n\t\t\"MageNugIgnite_Frame_Bar\",\n\t\t\"MageNugLB1_Frame_Bar\",\n\t\t\"MageNugLB2_Frame_Bar\",\n\t\t\"MageNugLB3_Frame_Bar\",\n\t\t\"MageNugMoonkin_Frame_Bar\",\n\t\t\"MageNugMI_Frame_MiBar\",\n\t\t\"MageNugCD1_Frame_Bar\",\n\t\t\"MageNugCD2_Frame_Bar\",\n\t\t\"MageNugCD3_Frame_Bar\",\n\t\t\"MageNugCD4_Frame_Bar\",\n\t\t\"MageNugCD5_Frame_Bar\",\n\t\t\"MageNugCD6_Frame_Bar\",\n\t}\n\n\tfor i = 1, getn(bars) do\n\t\tlocal bar = _G[bars[i]]\n\t\tif bar then\n\t\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\tend\n\tend\n\n\t-- MageNugMI_Frame\n\tMageNugMI_FrameTexture1:SetSize(21, 21)\n\n\tMageNugMI_Frame:CreateBackdrop(\"Default\")\n\tMageNugMI_Frame.backdrop:SetPoint(\"TOPLEFT\", MageNugMI_FrameTexture1, -2, 2)\n\tMageNugMI_Frame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugMI_FrameTexture1, 2, -2)\n\n\tMageNugMI_Frame_MiBar:SetWidth(186)\n\tMageNugMI_Frame_MiBar:SetHeight(15)\n\tMageNugMI_Frame_MiBar:CreateBackdrop(\"Default\")\n\tMageNugMI_Frame_MiBar:ClearAllPoints()\n\tMageNugMI_Frame_MiBar:SetPoint(\"BOTTOMLEFT\", MageNugMI_FrameTexture1, \"BOTTOMRIGHT\", 7, 0)\n\n\tMageNugMI_Frame_MIText:ClearAllPoints()\n\tMageNugMI_Frame_MIText:SetPoint(\"LEFT\", MageNugMI_Frame_MiBar, \"LEFT\", 2, 0)\n\n\tMageNugMI_Frame_MIText1:ClearAllPoints()\n\tMageNugMI_Frame_MIText1:SetPoint(\"RIGHT\", MageNugMI_Frame_MiBar, \"RIGHT\", 0, 0)\n\n\t-- MageNugCauterize_Frame\n\tMageNugCauterize_FrameTexture1:SetSize(21, 21)\n\n\tMageNugCauterize_Frame:CreateBackdrop(\"Default\")\n\tMageNugCauterize_Frame.backdrop:SetPoint(\"TOPLEFT\", MageNugCauterize_FrameTexture1, -2, 2)\n\tMageNugCauterize_Frame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugCauterize_FrameTexture1, 2, -2)\n\n\tMageNugCauterize_Frame_Bar:SetWidth(186)\n\tMageNugCauterize_Frame_Bar:SetHeight(15)\n\tMageNugCauterize_Frame_Bar:CreateBackdrop(\"Default\")\n\tMageNugCauterize_Frame_Bar:ClearAllPoints()\n\tMageNugCauterize_Frame_Bar:SetPoint(\"BOTTOMLEFT\", MageNugCauterize_FrameTexture1, \"BOTTOMRIGHT\", 7, 0)\n\n\tMageNugCauterize_Frame_Text:ClearAllPoints()\n\tMageNugCauterize_Frame_Text:SetPoint(\"LEFT\", MageNugCauterize_Frame_Bar, \"LEFT\", 2, 0)\n\n\tMageNugCauterize_Frame_Text1:ClearAllPoints()\n\tMageNugCauterize_Frame_Text1:SetPoint(\"RIGHT\", MageNugCauterize_Frame_Bar, \"RIGHT\", 0, 0)\n\n\t-- MageNugMBProcFrame\n\tMageNugMBProcFrameTextureBorder:Hide()\n\n\tMageNugMBProcFrame:CreateBackdrop(\"Default\")\n\tMageNugMBProcFrame.backdrop:SetPoint(\"TOPLEFT\", MageNugMBProcFrameTexture, -2, 2)\n\tMageNugMBProcFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugMBProcFrameTexture, 2, -2)\n\n\tMageNugMBProcFrame_ProcBar:SetFrameStrata(\"BACKGROUND\")\n\tMageNugMBProcFrame_ProcBar:SetWidth(186)\n\tMageNugMBProcFrame_ProcBar:SetHeight(15)\n\tMageNugMBProcFrame_ProcBar:CreateBackdrop(\"Default\")\n\tMageNugMBProcFrame_ProcBar:ClearAllPoints()\n\tMageNugMBProcFrame_ProcBar:SetPoint(\"BOTTOMLEFT\", MageNugMBProcFrameTexture, \"BOTTOMRIGHT\", 7, 0)\n\n\tMageNugMBProcFrameText:ClearAllPoints()\n\tMageNugMBProcFrameText:SetPoint(\"LEFT\", MageNugMBProcFrame_ProcBar, \"LEFT\", 2, 0)\n\n\tMageNugMBProcFrameText2:ClearAllPoints()\n\tMageNugMBProcFrameText2:SetPoint(\"RIGHT\", MageNugMBProcFrame_ProcBar, \"RIGHT\", 0, 0)\n\n\t-- MageNugPolyFrame\n\tMageNugPolyFrameTextureBorder:Hide()\n\n\tMageNugPolyFrame:CreateBackdrop(\"Default\")\n\tMageNugPolyFrame.backdrop:SetPoint(\"TOPLEFT\", MageNugPolyFrameTexture, -2, 2)\n\tMageNugPolyFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugPolyFrameTexture, 2, -2)\n\n\tMageNugPolyFrame_Bar:SetFrameStrata(\"BACKGROUND\")\n\tMageNugPolyFrame_Bar:SetWidth(186)\n\tMageNugPolyFrame_Bar:SetHeight(15)\n\tMageNugPolyFrame_Bar:CreateBackdrop(\"Default\")\n\tMageNugPolyFrame_Bar:ClearAllPoints()\n\tMageNugPolyFrame_Bar:SetPoint(\"BOTTOMLEFT\", MageNugPolyFrameTexture, \"BOTTOMRIGHT\", 7, 0)\n\n\tMageNugPolyFrameText:ClearAllPoints()\n\tMageNugPolyFrameText:SetPoint(\"LEFT\", MageNugPolyFrame_Bar, \"LEFT\", 2, 0)\n\n\tMageNugPolyFrameTimerText:ClearAllPoints()\n\tMageNugPolyFrameTimerText:SetPoint(\"RIGHT\", MageNugPolyFrame_Bar, \"RIGHT\", 0, 0)\n\n\t-- MageNugFoFProcFrame\n\tMageNugFoFProcFrameTextureBorder:Hide()\n\n\tMageNugFoFProcFrame:CreateBackdrop(\"Default\")\n\tMageNugFoFProcFrame.backdrop:SetPoint(\"TOPLEFT\", MageNugFoFProcFrameTexture, -2, 2)\n\tMageNugFoFProcFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugFoFProcFrameTexture, 2, -2)\n\n\tMageNugFoFProcFrame_ProcBar:SetFrameStrata(\"BACKGROUND\")\n\tMageNugFoFProcFrame_ProcBar:SetWidth(186)\n\tMageNugFoFProcFrame_ProcBar:SetHeight(15)\n\tMageNugFoFProcFrame_ProcBar:CreateBackdrop(\"Default\")\n\tMageNugFoFProcFrame_ProcBar:ClearAllPoints()\n\tMageNugFoFProcFrame_ProcBar:SetPoint(\"BOTTOMLEFT\", MageNugFoFProcFrameTexture, \"BOTTOMRIGHT\", 7, 0)\n\n\tMageNugFoFProcFrameCountText:ClearAllPoints()\n\tMageNugFoFProcFrameCountText:SetPoint(\"BOTTOMRIGHT\", MageNugFoFProcFrameTexture, \"BOTTOMRIGHT\", -2, 2)\n\n\tMageNugFoFProcFrameText:ClearAllPoints()\n\tMageNugFoFProcFrameText:SetPoint(\"LEFT\", MageNugFoFProcFrame_ProcBar, \"LEFT\", 2, 0)\n\n\tMageNugFoFProcFrameText2:ClearAllPoints()\n\tMageNugFoFProcFrameText2:SetPoint(\"RIGHT\", MageNugFoFProcFrame_ProcBar, \"RIGHT\", 0, 0)\n\n\t-- MageNugImpactProcFrame\n\tMageNugImpactProcFrameTexture:SetSize(21, 21)\n\n\tMageNugImpactProcFrame:CreateBackdrop(\"Default\")\n\tMageNugImpactProcFrame.backdrop:SetPoint(\"TOPLEFT\", MageNugImpactProcFrameTexture, -2, 2)\n\tMageNugImpactProcFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugImpactProcFrameTexture, 2, -2)\n\n\tMageNugImpactProcFrame_ProcBar:SetFrameStrata(\"BACKGROUND\")\n\tMageNugImpactProcFrame_ProcBar:SetWidth(186)\n\tMageNugImpactProcFrame_ProcBar:SetHeight(15)\n\tMageNugImpactProcFrame_ProcBar:CreateBackdrop(\"Default\")\n\tMageNugImpactProcFrame_ProcBar:ClearAllPoints()\n\tMageNugImpactProcFrame_ProcBar:SetPoint(\"BOTTOMLEFT\", MageNugImpactProcFrameTexture, \"BOTTOMRIGHT\", 7, 0)\n\n\tMageNugImpactProcFrameText:ClearAllPoints()\n\tMageNugImpactProcFrameText:SetPoint(\"LEFT\", MageNugImpactProcFrame_ProcBar, \"LEFT\", 2, 0)\n\n\tMageNugImpactProcFrameText2:ClearAllPoints()\n\tMageNugImpactProcFrameText2:SetPoint(\"RIGHT\", MageNugImpactProcFrame_ProcBar, \"RIGHT\", 0, 0)\n\n\t-- MageNugBFProcFrame\n\tMageNugBFProcFrameTextureBorder:Hide()\n\n\tMageNugBFProcFrame:CreateBackdrop(\"Default\")\n\tMageNugBFProcFrame.backdrop:SetPoint(\"TOPLEFT\", MageNugBFProcFrameTexture, -2, 2)\n\tMageNugBFProcFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugBFProcFrameTexture, 2, -2)\n\n\tMageNugBFProcFrame_ProcBar:SetFrameStrata(\"BACKGROUND\")\n\tMageNugBFProcFrame_ProcBar:SetWidth(186)\n\tMageNugBFProcFrame_ProcBar:SetHeight(15)\n\tMageNugBFProcFrame_ProcBar:CreateBackdrop(\"Default\")\n\tMageNugBFProcFrame_ProcBar:ClearAllPoints()\n\tMageNugBFProcFrame_ProcBar:SetPoint(\"BOTTOMLEFT\", MageNugBFProcFrameTexture, \"BOTTOMRIGHT\", 7, 0)\n\n\tMageNugBFProcFrameText:ClearAllPoints()\n\tMageNugBFProcFrameText:SetPoint(\"LEFT\", MageNugBFProcFrame_ProcBar, \"LEFT\", 2, 0)\n\n\tMageNugBFProcFrameText2:ClearAllPoints()\n\tMageNugBFProcFrameText2:SetPoint(\"RIGHT\", MageNugBFProcFrame_ProcBar, \"RIGHT\", 0, 0)\n\n\t-- MageNugProcFrame\n\tMageNugProcFrameTextureBorder:Hide()\n\n\tMageNugProcFrame:CreateBackdrop(\"Default\")\n\tMageNugProcFrame.backdrop:SetPoint(\"TOPLEFT\", MageNugProcFrameTexture, -2, 2)\n\tMageNugProcFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugProcFrameTexture, 2, -2)\n\n\tMageNugProcFrame_ProcBar:SetFrameStrata(\"BACKGROUND\")\n\tMageNugProcFrame_ProcBar:SetWidth(186)\n\tMageNugProcFrame_ProcBar:SetHeight(15)\n\tMageNugProcFrame_ProcBar:CreateBackdrop(\"Default\")\n\tMageNugProcFrame_ProcBar:ClearAllPoints()\n\tMageNugProcFrame_ProcBar:SetPoint(\"BOTTOMLEFT\", MageNugProcFrameTexture, \"BOTTOMRIGHT\", 7, 0)\n\n\tMageNugProcFrameText:ClearAllPoints()\n\tMageNugProcFrameText:SetPoint(\"LEFT\", MageNugProcFrame_ProcBar, \"LEFT\", 2, 0)\n\n\tMageNugProcFrameText2:ClearAllPoints()\n\tMageNugProcFrameText2:SetPoint(\"RIGHT\", MageNugProcFrame_ProcBar, \"RIGHT\", 0, 0)\n\n\t-- MageNugCauterizeFrame\n\tMageNugCauterizeFrame:CreateBackdrop(\"Transparent\")\n\tMageNugCauterizeFrame.backdrop:SetPoint(\"TOPLEFT\", MageNugCauterizeFrame, -2, -3)\n\tMageNugCauterizeFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugCauterizeFrame, 2, 3)\n\n\tfor i = 1, MageNugCauterizeFrame:GetNumRegions() do\n\t\tlocal region = select(i, MageNugCauterizeFrame:GetRegions())\n\t\tif region:GetObjectType() == \"Texture\" then\n\t\t\tregion:SetSize(30, 30)\n\t\t\tregion:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tend\n\t\tif region:GetObjectType() == \"FontString\" then\n\t\t\tregion:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\tregion:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\tend\n\tend\n\n\t-- MageNugClearcast_Frame\n\tMageNugClearcast_Frame:SetTemplate(\"Default\")\n\n\tMageNugClearcast_FrameTexture:SetDrawLayer(\"ARTWORK\")\n\tMageNugClearcast_FrameTexture:ClearAllPoints()\n\tMageNugClearcast_FrameTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tMageNugClearcast_FrameTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t-- MageNugAB_Frame\n\tMageNugAB_Frame:SetTemplate(\"Default\")\n\n\tMageNugAB_FrameTexture:SetDrawLayer(\"ARTWORK\")\n\tMageNugAB_FrameTexture:ClearAllPoints()\n\tMageNugAB_FrameTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tMageNugAB_FrameTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t-- MageNugIgnite_Frame\n\tMageNugIgnite_Frame:SetTemplate(\"Default\")\n\n\tMageNugIgnite_FrameTexture:SetDrawLayer(\"ARTWORK\")\n\tMageNugIgnite_FrameTexture:ClearAllPoints()\n\tMageNugIgnite_FrameTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tMageNugIgnite_FrameTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tMageNugIgnite_FrameText:SetFont(C.font.stylization_font, C.font.stylization_font_size * 2, C.font.stylization_font_style)\n\tMageNugIgnite_FrameText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tMageNugIgnite_FrameText:ClearAllPoints()\n\tMageNugIgnite_FrameText:SetPoint(\"CENTER\", MageNugIgnite_Frame, \"CENTER\", 0, 0)\n\n\t-- MageNugLB_Frame\n\tMageNugLB_Frame:SetTemplate(\"Default\")\n\tMageNugLB_Frame:SetSize(21, 21)\n\n\tMageNugLB_FrameTexture:SetTexture()\n\tMageNugLB_FrameTextureBorder:SetTexture()\n\tMageNugLB_FrameTextureTitle:SetTexture()\n\n\tMageNugLB_Frame_Text:SetFont(C.font.stylization_font, C.font.stylization_font_size * 2, C.font.stylization_font_style)\n\tMageNugLB_Frame_Text:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tMageNugLB_Frame_Text:ClearAllPoints()\n\tMageNugLB_Frame_Text:SetPoint(\"CENTER\", MageNugLB_Frame, \"CENTER\", 0, 0)\n\n\t-- MageNugLB1_Frame\n\tMageNugLB1_Frame:SetFrameStrata(\"BACKGROUND\")\n\tMageNugLB1_Frame:CreateBackdrop(\"Default\")\n\tMageNugLB1_Frame.backdrop:SetPoint(\"TOPLEFT\", MageNugLB1_Frame, -2, 0)\n\tMageNugLB1_Frame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugLB1_Frame, 2, -1)\n\tMageNugLB1_Frame:ClearAllPoints()\n\tMageNugLB1_Frame:SetPoint(\"BOTTOMLEFT\", MageNugLB_Frame, \"BOTTOMRIGHT\", 5, 1)\n\n\tMageNugLB1_Frame_Text:SetParent(MageNugLB1_Frame_Bar)\n\tMageNugLB1_Frame_Text:ClearAllPoints()\n\tMageNugLB1_Frame_Text:SetPoint(\"RIGHT\", MageNugLB1_Frame, \"RIGHT\", 0, 0)\n\n\tMageNugLB1_Frame_Text2:SetParent(MageNugLB1_Frame_Bar)\n\tMageNugLB1_Frame_Text2:ClearAllPoints()\n\tMageNugLB1_Frame_Text2:SetPoint(\"LEFT\", MageNugLB1_Frame, \"LEFT\", 2, 0)\n\n\t-- MageNugLB2_Frame\n\tMageNugLB2_Frame:SetFrameStrata(\"BACKGROUND\")\n\tMageNugLB2_Frame:CreateBackdrop(\"Default\")\n\tMageNugLB2_Frame.backdrop:SetPoint(\"TOPLEFT\", MageNugLB2_Frame, -2, 0)\n\tMageNugLB2_Frame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugLB2_Frame, 2, -1)\n\tMageNugLB2_Frame:ClearAllPoints()\n\tMageNugLB2_Frame:SetPoint(\"BOTTOM\", MageNugLB1_Frame, \"TOP\", 0, 6)\n\n\tMageNugLB2_Frame_Text:SetParent(MageNugLB2_Frame_Bar)\n\tMageNugLB2_Frame_Text:ClearAllPoints()\n\tMageNugLB2_Frame_Text:SetPoint(\"RIGHT\", MageNugLB2_Frame, \"RIGHT\", 0, 0)\n\n\tMageNugLB2_Frame_Text2:SetParent(MageNugLB2_Frame_Bar)\n\tMageNugLB2_Frame_Text2:ClearAllPoints()\n\tMageNugLB2_Frame_Text2:SetPoint(\"LEFT\", MageNugLB2_Frame, \"LEFT\", 2, 0)\n\n\t-- MageNugLB3_Frame\n\tMageNugLB3_Frame:SetFrameStrata(\"BACKGROUND\")\n\tMageNugLB3_Frame:CreateBackdrop(\"Default\")\n\tMageNugLB3_Frame.backdrop:SetPoint(\"TOPLEFT\", MageNugLB3_Frame, -2, 0)\n\tMageNugLB3_Frame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugLB3_Frame, 2, -1)\n\tMageNugLB3_Frame:ClearAllPoints()\n\tMageNugLB3_Frame:SetPoint(\"BOTTOM\", MageNugLB2_Frame, \"TOP\", 0, 6)\n\n\tMageNugLB3_Frame_Text:SetParent(MageNugLB3_Frame_Bar)\n\tMageNugLB3_Frame_Text:ClearAllPoints()\n\tMageNugLB3_Frame_Text:SetPoint(\"RIGHT\", MageNugLB3_Frame, \"RIGHT\", 0, 0)\n\n\tMageNugLB3_Frame_Text2:SetParent(MageNugLB3_Frame_Bar)\n\tMageNugLB3_Frame_Text2:ClearAllPoints()\n\tMageNugLB3_Frame_Text2:SetPoint(\"LEFT\", MageNugLB3_Frame, \"LEFT\", 2, 0)\n\n\t-- MageNugSP_Frame\n\tMageNugSP_Frame:SetTemplate(\"Transparent\")\n\n\t-- MNSpellSteal_Frame\n\tMNSpellSteal_Frame:SetTemplate(\"Transparent\")\n\n\t-- MNSpellStealFocus_Frame\n\tMNSpellStealFocus_Frame:SetTemplate(\"Transparent\")\n\n\t-- MageNugMoonkin_Frame\n\tMageNugMoonkin_Frame:CreateBackdrop(\"Default\")\n\tMageNugMoonkin_Frame.backdrop:SetPoint(\"TOPLEFT\", MageNugMoonkin_Frame_Texture, -2, 2)\n\tMageNugMoonkin_Frame.backdrop:SetPoint(\"BOTTOMRIGHT\", MageNugMoonkin_Frame_Texture, 2, -2)\n\n\tMageNugMoonkin_Frame_Bar:CreateBackdrop(\"Default\")\n\tMageNugMoonkin_Frame_Bar:ClearAllPoints()\n\tMageNugMoonkin_Frame_Bar:SetPoint(\"BOTTOMLEFT\", MageNugMoonkin_Frame_Texture, \"BOTTOMRIGHT\", 7, 0)\n\tMageNugMoonkin_Frame_Bar:SetSize(80, 15)\n\n\t-- MNmoonFire_Frame\n\tMNmoonFire_Frame:SetTemplate(\"Default\")\n\tMNmoonFire_Frame:ClearAllPoints()\n\tMNmoonFire_Frame:SetPoint(\"BOTTOMLEFT\", MageNugMoonkin_Frame_Bar, \"TOPLEFT\", -2, 5)\n\n\tMNmoonFire_FrameTexture:ClearAllPoints()\n\tMNmoonFire_FrameTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tMNmoonFire_FrameTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tMNmoonFire_FrameText:ClearAllPoints()\n\tMNmoonFire_FrameText:SetPoint(\"CENTER\", MNmoonFire_Frame, 0, 0)\n\n\t-- MNinsectSwarm_Frame\n\tMNinsectSwarm_Frame:SetTemplate(\"Default\")\n\tMNinsectSwarm_Frame:ClearAllPoints()\n\tMNinsectSwarm_Frame:SetPoint(\"LEFT\", MNmoonFire_Frame, \"RIGHT\", 3, 0)\n\n\tMNinsectSwarm_FrameTexture:ClearAllPoints()\n\tMNinsectSwarm_FrameTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tMNinsectSwarm_FrameTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tMNinsectSwarm_FrameText:ClearAllPoints()\n\tMNinsectSwarm_FrameText:SetPoint(\"CENTER\", MNinsectSwarm_Frame, 0, 0)\n\n\t-- MNstarSurge_Frame\n\tMNstarSurge_Frame:SetTemplate(\"Default\")\n\tMNstarSurge_Frame:ClearAllPoints()\n\tMNstarSurge_Frame:SetPoint(\"LEFT\", MNinsectSwarm_Frame, \"RIGHT\", 3, 0)\n\n\tMNstarSurge_FrameTexture:ClearAllPoints()\n\tMNstarSurge_FrameTexture:SetPoint(\"TOPLEFT\", 2, -2)\n\tMNstarSurge_FrameTexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\tMNstarSurge_FrameText:ClearAllPoints()\n\tMNstarSurge_FrameText:SetPoint(\"CENTER\", MNstarSurge_Frame, 0, 0)\n\n\t-- MageNugCD_Frame\n\tfor i = 1, 6 do\n\t\tlocal cooldown = _G[\"MageNugCD\"..i..\"_Frame\"]\n\t\tlocal text1 = _G[\"MageNugCD\"..i..\"_Frame_Text\"]\n\t\tlocal text2 = _G[\"MageNugCD\"..i..\"_Frame_Text2\"]\n\t\tif cooldown then\n\t\t\tcooldown:CreateBackdrop(\"Default\")\n\t\t\tcooldown.backdrop:SetFrameStrata(\"BACKGROUND\")\n\t\t\tcooldown.backdrop:SetPoint(\"TOPLEFT\", cooldown, -2, 2)\n\t\t\tcooldown.backdrop:SetPoint(\"BOTTOMRIGHT\", cooldown, 14, -2)\n\t\tend\n\t\tif text1 then\n\t\t\ttext1:ClearAllPoints()\n\t\t\ttext1:SetPoint(\"LEFT\", cooldown, \"LEFT\", 15, 0)\n\t\tend\n\t\tif text2 then\n\t\t\ttext2:ClearAllPoints()\n\t\t\ttext2:SetPoint(\"RIGHT\", cooldown, \"RIGHT\", 14, 0)\n\t\tend\n\t\tif i == 1 then\n\t\t\tcooldown:SetPoint(\"TOP\", MageNugCD_Frame, \"TOP\", 0, -11)\n\t\telse\n\t\t\tcooldown:SetPoint(\"TOP\", _G[\"MageNugCD\"..(i-1)..\"_Frame\"], \"BOTTOM\", 0, -7)\n\t\tend\n\tend\n\n\t-- MageNugAlliFrame\n\tMageNugAlliFrame:SetTemplate(\"Transparent\")\n\n\tMageNugAlliFrameClose:SkinButton()\n\tMageNugAlliFrameShowOptions:SkinButton()\n\n\tMageNugAlliFrameText:SetFont(C.media.normal_font, 13, \"\")\n\tMageNugAlliFrameText2:SetFont(C.media.normal_font, 13, \"\")\n\tMageNugHordeFrameText:SetFont(C.media.normal_font, 13, \"\")\n\tMageNugHordeFrameText2:SetFont(C.media.normal_font, 13, \"\")\n\n\tlocal portals = {\n\t\t\"MageNugAlliFramePortDal\",\n\t\t\"MageNugAlliFramePortShat\",\n\t\t\"MageNugAlliFramePortOrg\",\n\t\t\"MageNugAlliFramePortUC\",\n\t\t\"MageNugAlliFramePortTB\",\n\t\t\"MageNugAlliFramePortSMC\",\n\t\t\"MageNugAlliFramePortStonard\",\n\t\t\"MageNugAlliFramePortTol\",\n\t\t\"MageNugAlliFramePortIF\",\n\t\t\"MageNugAlliFramePortSW\",\n\t\t\"MageNugAlliFramePortDarn\",\n\t\t\"MageNugAlliFramePortExo\",\n\t\t\"MageNugAlliFramePortTheramore\",\n\t\t\"MageNugAlliFrameTeleDal\",\n\t\t\"MageNugAlliFrameTeleShat\",\n\t\t\"MageNugAlliFrameTeleOrg\",\n\t\t\"MageNugAlliFrameTeleUC\",\n\t\t\"MageNugAlliFrameTeleTB\",\n\t\t\"MageNugAlliFrameTeleSMC\",\n\t\t\"MageNugAlliFrameTeleStonard\",\n\t\t\"MageNugAlliFrameTeleTol\",\n\t\t\"MageNugAlliFrameTeleIF\",\n\t\t\"MageNugAlliFrameTeleSW\",\n\t\t\"MageNugAlliFrameTeleDarn\",\n\t\t\"MageNugAlliFrameTeleExo\",\n\t\t\"MageNugAlliFrameTeleTheramore\",\n\t\t\"MageNugAlliFrameHearth\"\n\t}\n\n\tfor i = 1, getn(portals) do\n\t\tlocal portal = _G[portals[i]]\n\t\tlocal texture = _G[portals[i]..\"TelDalTexture\"]\n\t\tif portal then\n\t\t\tportal:SetTemplate(\"Default\")\n\t\t\tportal:StyleButton()\n\t\tend\n\t\tif texture then\n\t\t\ttexture:SetDrawLayer(\"ARTWORK\")\n\t\t\ttexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ttexture:ClearAllPoints()\n\t\t\ttexture:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\ttexture:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\tend\n\tend\n\n\t-- Options\n\tMageNugStatMonOptionFrameBlackBackdropButton:SkinButton()\n\tMageNugMoonkinOptionFrame_Button:SkinButton()\n\tMageNugOption2FrameButton1:SkinButton()\n\tMageNugOption2FrameButton2:SkinButton()\n\tMageNugOption2FrameButton3:SkinButton()\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/MyRolePlay.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.my_role_play ~= true or not IsAddOnLoaded(\"MyRolePlay\") then return end\n\n----------------------------------------------------------------------------------------\n--\tMyRolePlay skin\n----------------------------------------------------------------------------------------\nhooksecurefunc(mrp, \"AddMRPTab\", function()\n\tT.SkinTab(CharacterFrameTab5)\n\tCharacterFrameTab5:SetText(\"MyRolePlay\")\nend)\n\nhooksecurefunc(mrp, \"CreateOptionsPanel\", function()\n\tT.SkinCheckBox(MyRolePlayOptionsPanel_Enable)\n\tT.SkinCheckBox(MyRolePlayOptionsPanel_MRPButton)\n\tT.SkinCheckBox(MyRolePlayOptionsPanel_RPChatName)\n\tT.SkinCheckBox(MyRolePlayOptionsPanel_Biog)\n\tT.SkinCheckBox(MyRolePlayOptionsPanel_FormAC)\n\tT.SkinCheckBox(MyRolePlayOptionsPanel_EquipAC)\n\n\tT.SkinDropDownBox(MyRolePlayOptionsPanel_TTStyle)\n\tT.SkinDropDownBox(MyRolePlayOptionsPanel_HeightUnit)\n\tT.SkinDropDownBox(MyRolePlayOptionsPanel_WeightUnit)\nend)\n\nlocal function reskinHeader(_, field)\n\tfor i = 1, field:GetNumChildren() do\n\t\tlocal f = select(i, field:GetChildren())\n\t\tif not f.reskinned then\n\t\t\tf.h:SetBackdrop({bgFile = \"Interface\\\\ChatFrame\\\\ChatFrameBackground\"})\n\t\t\tf.h:SetBackdropColor(0.5, 0.5, 0.5, 0.1)\n\t\t\tf.h.SetBackdrop = T.dummy\n\n\t\t\tf.h.fs:SetPoint(\"TOPLEFT\", f.h, \"TOPLEFT\", 0, 0)\n\n\t\t\tif f.sep then\n\t\t\t\tf.sep:SetAlpha(0)\n\t\t\tend\n\n\t\t\tf.reskinned = true\n\t\tend\n\tend\nend\n\nhooksecurefunc(mrp, \"CreateCFpfield\", reskinHeader)\nhooksecurefunc(mrp, \"CreateBFpfield\", reskinHeader)\n\nhooksecurefunc(mrp, \"CreateBrowseFrame\", function()\n\tMyRolePlayBrowseFrameInset:StripTextures()\n\tMyRolePlayBrowseFrame:StripTextures()\n\tMyRolePlayBrowseFrame:SetTemplate(\"Transparent\")\n\n\tT.SkinTab(MyRolePlayBrowseFrameTab1)\n\tT.SkinTab(MyRolePlayBrowseFrameTab2)\n\n\tT.SkinCloseButton(MyRolePlayBrowseFrameCloseButton)\nend)\n\nhooksecurefunc(mrp, \"CreateEditFrames\", function()\n\tMyRolePlayMultiEditFrame:DisableDrawLayer(\"BORDER\")\n\tMyRolePlayMultiEditFrameBg:Hide()\n\tMyRolePlayMultiEditFrameScrollFrameTop:Hide()\n\tMyRolePlayMultiEditFrameScrollFrameBottom:Hide()\n\n\tMyRolePlayMultiEditFrameOK:SkinButton()\n\tMyRolePlayMultiEditFrameCancel:SkinButton()\n\tMyRolePlayMultiEditFrameInherit:SkinButton()\n\tMyRolePlayComboEditFrameOK:SkinButton()\n\tMyRolePlayComboEditFrameCancel:SkinButton()\n\tMyRolePlayComboEditFrameInherit:SkinButton()\n\tMyRolePlayCharacterFrame_NewProfileButton:SkinButton()\n\tMyRolePlayCharacterFrame_RenProfileButton:SkinButton()\n\tMyRolePlayCharacterFrame_DelProfileButton:SkinButton()\n\tMyRolePlayEditFrameOK:SkinButton()\n\tMyRolePlayEditFrameCancel:SkinButton()\n\tMyRolePlayEditFrameInherit:SkinButton()\n\n\tMyRolePlayEditFrame.editbox:StripTextures()\n\tMyRolePlayEditFrame.editbox:CreateBackdrop(\"Overlay\")\n\tMyRolePlayEditFrame.editbox.backdrop:SetPoint(\"TOPLEFT\", 7, -8)\n\tMyRolePlayEditFrame.editbox.backdrop:SetPoint(\"BOTTOMRIGHT\", -7, 8)\n\n\tMyRolePlayCharacterFrame.ver:SetText(\"\")\n\n\tMyRolePlayCharacterFrame_ProfileComboBox:SetPoint(\"TOP\", CharacterFrameInset, \"TOP\", 0, 22)\n\tMyRolePlayCharacterFrame_ProfileComboBox.text:SetPoint(\"LEFT\", MyRolePlayCharacterFrame_ProfileComboBox, \"LEFT\", 27, 3)\n\n\tT.SkinDropDownBox(MyRolePlayCharacterFrame_ProfileComboBox)\n\tT.SkinDropDownBox(MyRolePlayComboEditFrameComboBox)\n\n\tMyRolePlayCharacterFrame_RenProfileButton:SetSize(21, 21)\n\tMyRolePlayCharacterFrame_DelProfileButton:SetSize(21, 21)\n\tMyRolePlayCharacterFrame_NewProfileButton:SetSize(21, 21)\n\tMyRolePlayCharacterFrame_NewProfileButton:ClearAllPoints()\n\tMyRolePlayCharacterFrame_NewProfileButton:SetPoint(\"LEFT\", MyRolePlayCharacterFrame_ProfileComboBox.backdrop, \"RIGHT\", 1, 0)\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/NPCScan.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.npcscan ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tNPCScan skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"_NPCScan\") then return end\n\t_NPCScanButton:StripTextures()\n\t_NPCScanButton:SetTemplate(\"Transparent\")\n\t_NPCScanButton:SetScale(1)\n\n\t_NPCScanTest:SkinButton()\n\n\tlocal checkboxes = {\n\t\t\"_NPCScanConfigCacheWarningsCheckbox\",\n\t\t\"_NPCScanConfigPrintTimeCheckbox\",\n\t\t\"_NPCScanConfigUnmuteCheckbox\",\n\t\t\"_NPCScanSearchAchievementAddFoundCheckbox\"\n\t}\n\n\tfor i = 1, getn(checkboxes) do\n\t\tlocal checkbox = _G[checkboxes[i]]\n\t\tif checkbox then\n\t\t\tT.SkinCheckBox(checkbox)\n\t\tend\n\tend\n\n\tfor i = 1, _NPCScanButton:GetNumChildren() do\n\t\tlocal close = select(i, _NPCScanButton:GetChildren())\n\t\tif close.GetPushedTexture and close:GetPushedTexture() and not close:GetName() then\n\t\t\tclose:StripTextures()\n\t\t\tclose:SetPoint(\"TOPRIGHT\", 4, 4)\n\t\t\tclose:SetScale(1)\n\n\t\t\tclose:CreateBackdrop(\"Overlay\")\n\t\t\tclose.backdrop:SetPoint(\"TOPLEFT\", 8, -8)\n\t\t\tclose.backdrop:SetPoint(\"BOTTOMRIGHT\", -8, 8)\n\n\t\t\tclose.text = close:FontString(nil, C.media.normal_font, 17)\n\t\t\tclose.text:SetPoint(\"CENTER\", 0, 1)\n\t\t\tclose.text:SetText(\"x\")\n\n\t\t\tclose:HookScript(\"OnEnter\", function()\n\t\t\t\tclose.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color))\n\t\t\t\tif close.backdrop.overlay then\n\t\t\t\t\tclose.backdrop.overlay:SetVertexColor(C.media.classborder_color[1], C.media.classborder_color[2], C.media.classborder_color[3], 0.3)\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tclose:HookScript(\"OnLeave\", function()\n\t\t\t\tclose.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\tif close.backdrop.overlay then\n\t\t\t\t\tclose.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\n\t\tlocal text = select(4, _NPCScanButton:GetRegions())\n\t\ttext:SetTextColor(1, 1, 0)\n\t\ttext:SetShadowOffset(1, -1)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/NugRunning.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.nug_running ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tNugRunning skin(by MrRuben5)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"NugRunning\") then return end\n\n\tlocal NugRunning = NugRunning\n\tlocal TimerBar = NugRunning and NugRunning.TimerBar\n\n\t-- Creates timerbar\n\tlocal _ConstructTimerBar = NugRunning.ConstructTimerBar\n\tfunction NugRunning.ConstructTimerBar(w, h)\n\t\tlocal f = _ConstructTimerBar(w, h)\n\n\t\tf:SetBackdrop(nil)\n\n\t\tlocal ic = f.icon:GetParent()\n\t\tic:CreateBackdrop(\"Default\")\n\n\t\tf.bar:CreateBackdrop(\"Default\")\n\n\t\tf.bar:SetStatusBarTexture(C.media.texture)\n\t\tf.bar:GetStatusBarTexture():SetDrawLayer(\"ARTWORK\")\n\t\tf.bar.bg:SetTexture(C.media.texture)\n\t\tf.bar.bg:SetAlpha(0.3)\n\n\t\tf.timeText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tf.timeText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\tf.spellText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tf.spellText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\tf.stacktext:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tf.stacktext:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\n\t\tTimerBar.Resize(f, w, h)\n\n\t\treturn f\n\tend\n\n\t-- Resizes timerbar\n\tlocal _Resize = TimerBar.VScale\n\tfunction TimerBar.Resize(f, w, h)\n\t\t_Resize(f, w, h)\n\n\t\tlocal ic = f.icon:GetParent()\n\t\tic:ClearAllPoints()\n\t\tic:SetPoint(\"TOPLEFT\", f, 1, -1)\n\t\tic:SetPoint(\"BOTTOMLEFT\", f, 1, 0)\n\n\t\tf.bar:ClearAllPoints()\n\t\tf.bar:SetPoint(\"TOPRIGHT\", f, -1, -1)\n\t\tf.bar:SetPoint(\"BOTTOMRIGHT\", f, -1, 0)\n\t\tf.bar:SetPoint(\"LEFT\", ic, \"RIGHT\", 5, 0)\n\n\t\tf.timeText:SetJustifyH(\"RIGHT\")\n\t\tf.timeText:ClearAllPoints()\n\t\tf.timeText:SetPoint(\"RIGHT\", 1, 0)\n\n\t\tf.spellText:SetJustifyH(\"LEFT\")\n\t\tf.spellText:ClearAllPoints()\n\t\tf.spellText:SetPoint(\"LEFT\", 2, 0)\n\t\tf.spellText:SetWidth(f.bar:GetWidth() - 10)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/OPie.lua",
    "content": "local T, C = unpack(ShestakUI)\nif C.skins.opie ~= true or not IsAddOnLoaded(\"OPie\") then return end\n\n----------------------------------------------------------------------------------------\n--\tOPie skin (OPie Masque)\n----------------------------------------------------------------------------------------\nlocal SPECIAL_COLOR_ALPHA = 0\n-- 0 = invisible, 1 = fully visible, lower it if your skin is ugly\n\nlocal buttons = {}\nlocal prototype = {}\nlocal STATE_USABLE, STATE_NOMANA, STATE_NORANGE, STATE_UNUSABLE = 0, 1, 2, 3\n\nfunction prototype:SetIcon(texture)\n\tself.Icon:SetTexture(texture)\nend\n\nfunction prototype:SetIconTexCoord(a, b, c, d, e, f, g, h)\n\tif not a or not b or not c or not d then return end -- Broker plugins???\n\tself.Icon:SetTexCoord(a, b, c, d, e, f, g, h)\nend\n\nfunction prototype:SetIconVertexColor(r, g, b)\n\tif r == 0.5 and g == 0.5 and b == 0.5 then return end -- don't darken icons on cooldown\n\tself.icon_r, self.icon_g, self.icon_b = r, g, b\n\tif self.ustate == STATE_USABLE then\n\t\tself.Icon:SetVertexColor(r, g, b)\n\tend\nend\n\nfunction prototype:SetUsable(usable, _, cd, nomana, norange)\n\tlocal state = usable and STATE_USABLE or (norange and STATE_NORANGE or (nomana and STATE_NOMANA or STATE_UNUSABLE))\n\tif state == self.ustate then return end\n\tself.ustate = state\n\tif state == STATE_NORANGE then\n\t\tself.Icon:SetVertexColor(0.8, 0.1, 0.1)\n\telseif state == STATE_NOMANA then\n\t\tself.Icon:SetVertexColor(0.5, 0.5, 1)\n\telseif state == STATE_UNUSABLE and not cd then -- don't black it out while on cooldown\n\t\tself.Icon:SetVertexColor(0.4, 0.4, 0.4)\n\telse\n\t\tself.Icon:SetVertexColor(self.icon_r or 1, self.icon_g or 1, self.icon_b or 1)\n\tend\nend\n\nfunction prototype:SetDominantColor(r, g, b)\n\tself.Border:SetShown(2.85 > (r + g + b)) -- don't override skin color if it's white\n\tself.Border:SetVertexColor(r, g, b)\n\tself.Border:SetAlpha(SPECIAL_COLOR_ALPHA)\nend\n\nfunction prototype:SetOverlayIcon(texture, w, h, ...)\n\tif not texture then\n\t\tself.OverlayIcon:Hide()\n\telse\n\t\tself.OverlayIcon:SetTexture(texture)\n\t\tself.OverlayIcon:SetSize(w, h)\n\t\tif ... then\n\t\t\tself.OverlayIcon:SetTexCoord(...)\n\t\tend\n\t\tself.OverlayIcon:Show()\n\tend\nend\n\nfunction prototype:SetCount(count)\n\tself.Count:SetText(count or \"\")\nend\n\nfunction prototype:SetOverlayIconVertexColor(...)\n\tself.overIcon:SetVertexColor(...)\nend\n\nlocal displaySubs = {\n\t[\"ALT%-\"]      = \"a\",\n\t[\"CTRL%-\"]     = \"c\",\n\t[\"SHIFT%-\"]    = \"s\", -- fr, it: \"m\"\n\t[\"BUTTON\"]     = \"m\", -- fr: souris, it: mouse\n\t[\"MOUSEWHEEL\"] = \"w\", -- fr: molette, it: rotellina\n\t[\"NUMPAD\"]     = \"n\",\n\t[\"PLUS\"]       = \"+\",\n\t[\"MINUS\"]      = \"-\",\n\t[\"MULTIPLY\"]   = \"*\",\n\t[\"DIVIDE\"]     = \"/\",\n\t[\"DECIMAL\"]    = \".\",\n}\nfunction prototype:SetBinding(text)\n\tif not text then\n\t\treturn self.HotKey:SetText(\"\")\n\tend\n\tfor k, v in pairs(displaySubs) do\n\t\ttext = gsub(text, k, v)\n\tend\n\tself.HotKey:SetText(text)\nend\n\nfunction prototype:SetCooldown(remain, duration, usable)\n\tif duration and remain and duration > 0 and remain > 0 then\n\t\tlocal start = GetTime() + remain - duration\n\t\tif usable then\n\t\t\t-- show recharge time\n\t\t\tself.Cooldown:SetDrawEdge(true)\n\t\t\tself.Cooldown:SetDrawSwipe(false)\n\t\telse\n\t\t\t-- show cooldown time\n\t\t\tself.Cooldown:SetDrawEdge(false)\n\t\t\tself.Cooldown:SetDrawSwipe(true)\n\t\t\tself.Cooldown:SetSwipeColor(0, 0, 0, 0.8)\n\t\tend\n\t\tself.Cooldown:SetCooldown(start, duration)\n\t\tself.Cooldown:Show()\n\telse\n\t\tself.Cooldown:Hide()\n\tend\nend\n\nfunction prototype:SetCooldownFormattedText(pattern, ...)\n\t-- do nothing\nend\n\nfunction prototype:SetCooldownTextShown()\n\t-- do nothing\nend\n\nfunction prototype:SetHighlighted(highlight)\n\tself[highlight and \"LockHighlight\" or \"UnlockHighlight\"](self)\nend\n\nfunction prototype:SetActive(active)\n\tself:SetChecked(active)\nend\n\nfunction prototype:SetOuterGlow(shown)\n\tfor i = 1, #self.GlowTextures do\n\t\tself.GlowTextures[i]:SetShown(shown)\n\tend\nend\n\nfunction prototype:SetEquipState(inBags, isEquipped)\n\tif isEquipped then\n\t\tself.Flash:SetVertexColor(0.1, 0.9, 0.15)\n\t\tself.Flash:Show()\n\telseif inBags then\n\t\tself.Flash:SetVertexColor(1, 0.9, 0.2)\n\t\tself.Flash:Show()\n\telse\n\t\tself.Flash:Hide()\n\tend\nend\n\nlocal id = 0\n\nlocal function CreateIndicator(name, parent, size, ghost)\n\tid = id + 1\n\tname = name or \"OPieSliceButton\"..id\n\tparent = parent or UIParent\n\tsize = size or 36\n\n\tlocal button = CreateFrame(\"CheckButton\", name, parent, \"ActionButtonTemplate\")\n\tbutton:SetSize(size, size)\n\tbutton:EnableMouse(false)\n\n\tbutton.Border        = _G[name .. \"Border\"] -- highlight\n\tbutton.Cooldown      = _G[name .. \"Cooldown\"]\n\tbutton.Count         = _G[name .. \"Count\"]\n\tbutton.Flash         = _G[name .. \"Flash\"] -- inner glow / checked\n\tbutton.HotKey        = _G[name .. \"HotKey\"]\n\tbutton.Icon          = _G[name .. \"Icon\"]\n\tbutton.NormalTexture = _G[name .. \"NormalTexture\"] -- border\n\n\t-- Overlay icon (???)\n\tbutton.OverlayIcon = button:CreateTexture(nil, \"ARTWORK\", nil, 1)\n\tbutton.OverlayIcon:SetPoint(\"BOTTOMLEFT\", button, \"BOTTOMLEFT\", 4, 4)\n\n\t-- Outer glow (doesn't seem to do anything?)\n\tbutton.GlowTextures = {}\n\n\tfor k, v in pairs(prototype) do\n\t\tbutton[k] = v\n\tend\n\n\t-- ViksUI Skin\n\n\tif not button.isSkinned then\n\t\tbutton.NormalTexture:SetTexture(0)\n\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\tbutton:StyleButton(nil, 4)\n\t\tbutton.backdrop:SetAllPoints()\n\n\t\tbutton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tbutton.icon:SetDrawLayer(\"ARTWORK\")\n\t\tbutton.icon:SetParent(button.backdrop)\n\t\tbutton.icon:ClearAllPoints()\n\t\tbutton.icon:SetSize(size, size)\n\t\tbutton.icon:SetPoint(\"CENTER\",0,0)\n\n\t\tbutton.Cooldown:SetSize(size, size)\n\t\tbutton.Cooldown:ClearAllPoints()\n\t\tbutton.Cooldown:SetPoint(\"CENTER\",0,0)\n\n\t\tbutton.Flash:SetSize(size, size)\n\t\tbutton.Flash:ClearAllPoints()\n\t\tbutton.Flash:SetPoint(\"CENTER\",0,0)\n\n\t\tbutton.hover:SetSize(size, size)\n\t\tbutton.hover:ClearAllPoints()\n\t\tbutton.hover:SetPoint(\"CENTER\",0,0)\n\n\t\tbutton.checked:SetSize(size, size)\n\t\tbutton.checked:ClearAllPoints()\n\t\tbutton.checked:SetPoint(\"CENTER\",0,0)\n\t\tbutton.isSkinned = true\n\tend\n\ttinsert(buttons, button)\n\treturn button\nend\n\nOPie.UI:RegisterIndicatorConstructor(\"OpieMasque\", {CreateIndicator=CreateIndicator, name=\"OpieMasque\", apiLevel=1})"
  },
  {
    "path": "ShestakUI/Modules/Skins/Omen.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.omen ~= true or not IsAddOnLoaded(\"Omen\") then return end\n\n----------------------------------------------------------------------------------------\n--\tOmen skin\n----------------------------------------------------------------------------------------\nlocal Omen = LibStub(\"AceAddon-3.0\"):GetAddon(\"Omen\")\n\n-- Skin Bar Texture\nOmen.UpdateBarTextureSettings_ = Omen.UpdateBarTextureSettings\nOmen.UpdateBarTextureSettings = function(self)\n\tfor _, v in ipairs(self.Bars) do\n\t\tv.texture:SetTexture(C.media.texture)\n\t\tv:CreateBackdrop(\"Transparent\")\n\tend\nend\n\n-- Skin Bar fonts\nOmen.UpdateBarLabelSettings_ = Omen.UpdateBarLabelSettings\nOmen.UpdateBarLabelSettings = function(self)\n\tself:UpdateBarLabelSettings_()\n\tfor _, v in ipairs(self.Bars) do\n\t\tv.Text1:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tv.Text1:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\tv.Text2:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tv.Text2:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\tv.Text3:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tv.Text3:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tend\nend\n\n-- Skin Title Bar\nOmen.UpdateTitleBar_ = Omen.UpdateTitleBar\nOmen.UpdateTitleBar = function(self)\n\tOmen.db.profile.Scale = 1\n\tOmen.db.profile.Background.EdgeSize = 1\n\tOmen.db.profile.Background.BarInset = 2\n\tOmen.db.profile.TitleBar.UseSameBG = true\n\tself:UpdateTitleBar_()\n\tself.TitleText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\tself.TitleText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tself.BarList:SetPoint(\"TOPLEFT\", self.Title, \"BOTTOMLEFT\", 0, -3)\nend\n\n-- Skin Title/Bars backgrounds\nOmen.UpdateBackdrop_ = Omen.UpdateBackdrop\nOmen.UpdateBackdrop = function(self)\n\tOmen.db.profile.Scale = 1\n\tOmen.db.profile.Background.EdgeSize = 1\n\tOmen.db.profile.Background.BarInset = 2\n\tself:UpdateBackdrop_()\n\tself.Title:SetTemplate(\"Transparent\")\n\tself.BarList:SetPoint(\"TOPLEFT\", self.Title, \"BOTTOMLEFT\", 0, -3)\nend\n\n-- Hook bar creation to apply settings\nlocal omen_mt = getmetatable(Omen.Bars)\nlocal oldidx = omen_mt.__index\nomen_mt.__index = function(self, barID)\n\tlocal bar = oldidx(self, barID)\n\tOmen:UpdateBarTextureSettings()\n\tOmen:UpdateBarLabelSettings()\n\treturn bar\nend\n\n-- Option Overrides\nOmen.db.profile.NumBars = 7\nif C.skins.minimap_buttons == true then\n\tOmen.db.profile.MinimapIcon.hide = false\nelse\n\tOmen.db.profile.MinimapIcon.hide = true\nend\nOmen.db.profile.Autocollapse = true\nOmen.db.profile.Bar.Spacing = 7\nOmen.db.profile.Bar.Height = 12\nOmen.db.profile.Bar.Texture = \"Smooth!\"\nOmen.db.profile.Bar.FontSize = 8\nOmen.db.profile.Bar.Font = \"Hooge\"\nOmen.db.profile.Bar.ShowHeadings = false\nOmen.db.profile.TitleBar.ShowTitleBar = false\nOmen.db.profile.TitleBar.FontSize = 8\nOmen.db.profile.TitleBar.Font = \"Hooge\"\nOmen.db.profile.Background.Texture = \"Smooth!\"\nOmen.db.profile.Bar.FontSize = 8\nOmen.db.profile.Bar.ShowHeadings = false\nOmen.db.profile.Shown = true\nOmen.db.profile.Locked = true\n\n-- Force updates\nOmen:UpdateBarTextureSettings()\nOmen:UpdateBarLabelSettings()\nOmen:UpdateTitleBar()\nOmen:UpdateBackdrop()\nOmen:ReAnchorBars()\nOmen:ResizeBars()"
  },
  {
    "path": "ShestakUI/Modules/Skins/Ovale.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.ovale ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tOvaleSpellPriority skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"Ovale\") then return end\n\n\tif not OvaleDB then OvaleDB = {} end\n\tif not OvaleDB[\"profiles\"] then OvaleDB[\"profiles\"] = {} end\n\tif not OvaleDB[\"profiles\"][T.name..\" - \"..T.realm] then OvaleDB[\"profiles\"][T.name..\" - \"..T.realm] = {} end\n\tif not OvaleDB[\"profiles\"][T.name..\" - \"..T.realm][\"apparence\"] then OvaleDB[\"profiles\"][T.name..\" - \"..T.realm][\"apparence\"] = {} end\n\n\tOvaleDB[\"profiles\"][T.name..\" - \"..T.realm][\"apparence\"][\"iconScale\"] = 1\n\tOvaleDB[\"profiles\"][T.name..\" - \"..T.realm][\"apparence\"][\"smallIconScale\"] = 1\n\tOvaleDB[\"profiles\"][T.name..\" - \"..T.realm][\"apparence\"][\"secondIconScale\"] = 1\n\tOvaleDB[\"profiles\"][T.name..\" - \"..T.realm][\"apparence\"][\"margin\"] = 3\n\n\tfor i = 1, 10 do\n\t\tfor j = 1, 2 do\n\t\t\tlocal button = _G[\"Icon\"..i..\"n\"..j]\n\n\t\t\tif button and not button.isSkinned then\n\t\t\t\tbutton.cd.noCooldownCount = true\n\t\t\t\tbutton:StyleButton()\n\t\t\t\tbutton:SetNormalTexture(0)\n\t\t\t\tbutton:CreateBackdrop(\"Transparent\")\n\t\t\t\tbutton.backdrop:SetAllPoints()\n\n\t\t\t\tbutton.icone:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tbutton.icone:SetPoint(\"TOPLEFT\", button, 2, -2)\n\t\t\t\tbutton.icone:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\n\t\t\t\tbutton.remains:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\tbutton.remains:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\n\t\t\t\tbutton.shortcut:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\tbutton.shortcut:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\n\t\t\t\tbutton.focusText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\tbutton.focusText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\n\t\t\t\tbutton.isSkinned = true\n\t\t\tend\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Postal.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.postal ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tPostal skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"Postal\") then return end\n\tT.SkinRotateButton(Postal_ModuleMenuButton)\n\tPostal_ModuleMenuButton:ClearAllPoints()\n\tPostal_ModuleMenuButton:SetWidth(18)\n\tPostal_ModuleMenuButton:SetHeight(18)\n\tPostal_ModuleMenuButton:SetPoint(\"TOPRIGHT\", MailFrameCloseButton, \"TOPLEFT\", -2, 0)\n\n\tT.SkinRotateButton(Postal_OpenAllMenuButton)\n\tPostal_OpenAllMenuButton:ClearAllPoints()\n\tPostal_OpenAllMenuButton:SetWidth(18)\n\tPostal_OpenAllMenuButton:SetHeight(18)\n\tPostal_OpenAllMenuButton:SetPoint(\"TOPLEFT\", PostalOpenAllButton, \"TOPRIGHT\", 2, -4)\n\n\tT.SkinRotateButton(Postal_BlackBookButton)\n\tPostal_BlackBookButton:ClearAllPoints()\n\tPostal_BlackBookButton:SetWidth(16)\n\tPostal_BlackBookButton:SetHeight(20)\n\tPostal_BlackBookButton:SetPoint(\"TOPLEFT\", SendMailNameEditBox, \"TOPRIGHT\", 0, -2)\n\n\tPostalSelectOpenButton:SkinButton()\n\tPostalSelectReturnButton:SkinButton()\n\tPostalOpenAllButton:SkinButton()\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/Recount.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.recount ~= true or not IsAddOnLoaded(\"Recount\") then return end\n\n----------------------------------------------------------------------------------------\n--\tRecount skin\n----------------------------------------------------------------------------------------\nlocal Recount = _G.Recount\n\nlocal function SkinFrame(frame)\n\tframe.bgMain = CreateFrame(\"Frame\", nil, frame)\n\tif frame ~= Recount.MainWindow then\n\t\tframe.bgMain:SetTemplate(\"Transparent\")\n\t\tT.SkinCloseButton(frame.CloseButton)\n\t\tframe.CloseButton:SetPoint(\"TOPRIGHT\", frame, \"TOPRIGHT\", -4, -11)\n\tend\n\tif frame == Recount.MainWindow then\n\t\tframe.Title:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 3, -15)\n\t\tframe.Title:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tframe.Title:SetShadowColor(0, 0, 0, C.font.stylization_font_shadow and 1 or 0)\n\t\tframe.CloseButton:SetPoint(\"TOPRIGHT\", frame, \"TOPRIGHT\", 3, -9)\n\tend\n\tframe.bgMain:SetPoint(\"BOTTOMLEFT\", frame, \"BOTTOMLEFT\")\n\tframe.bgMain:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\")\n\tframe.bgMain:SetPoint(\"TOP\", frame, \"TOP\", 0, -7)\n\tframe.bgMain:SetFrameLevel(frame:GetFrameLevel())\n\tframe:SetBackdrop(nil)\nend\n\nlocal function SkinButton(frame, text)\n\tif frame.SetNormalTexture then frame:SetNormalTexture(0) end\n\tif frame.SetHighlightTexture then frame:SetHighlightTexture(0) end\n\tif frame.SetPushedTexture then frame:SetPushedTexture(0) end\n\n\tif not frame.text then\n\t\tframe:FontString(\"text\", C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tframe.text:SetPoint(\"CENTER\")\n\t\tframe.text:SetText(text)\n\tend\n\n\tframe:HookScript(\"OnEnter\", function(self) self.text:SetTextColor(unpack(C.media.classborder_color)) end)\n\tframe:HookScript(\"OnLeave\", function(self) self.text:SetTextColor(1, 1, 1) end)\nend\n\n-- Override bar textures\nRecount.UpdateBarTextures = function()\n\tfor _, v in pairs(Recount.MainWindow.Rows) do\n\t\tv.StatusBar:SetStatusBarTexture(C.media.texture)\n\t\tv.StatusBar:GetStatusBarTexture():SetHorizTile(false)\n\t\tv.StatusBar:GetStatusBarTexture():SetVertTile(false)\n\n\t\tv.background = v.StatusBar:CreateTexture(\"$parentBackground\", \"BACKGROUND\")\n\t\tv.background:SetAllPoints(v.StatusBar)\n\t\tv.background:SetTexture(C.media.texture)\n\t\tv.background:SetVertexColor(0.15, 0.15, 0.15, 0.75)\n\n\t\tv.overlay = CreateFrame(\"Frame\", nil, v.StatusBar)\n\t\tv.overlay:SetTemplate(\"Default\")\n\t\tv.overlay:SetFrameStrata(\"BACKGROUND\")\n\t\tv.overlay:SetPoint(\"TOPLEFT\", -2, 2)\n\t\tv.overlay:SetPoint(\"BOTTOMRIGHT\", 2, -2)\n\n\t\tv.LeftText:ClearAllPoints()\n\t\tv.LeftText:SetPoint(\"LEFT\", v.StatusBar, \"LEFT\", 2, 0)\n\t\tv.LeftText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tv.LeftText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\n\t\tv.RightText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\tv.RightText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tend\nend\nRecount.SetBarTextures = Recount.UpdateBarTextures\n\n-- Fix bar textures as they're created\nRecount.SetupBar_ = Recount.SetupBar\nRecount.SetupBar = function(self, bar)\n\tself:SetupBar_(bar)\n\tbar.StatusBar:SetStatusBarTexture(C.media.texture)\nend\n\n-- Skin frames when they're created\nRecount.CreateFrame_ = Recount.CreateFrame\nRecount.CreateFrame = function(self, Name, Title, Height, Width, ShowFunc, HideFunc)\n\tlocal frame = self:CreateFrame_(Name, Title, Height, Width, ShowFunc, HideFunc)\n\tSkinFrame(frame)\n\treturn frame\nend\n\n-- Skin some others frame, not available outside Recount\nRecount.AddWindow_ = Recount.AddWindow\nRecount.AddWindow = function(_, frame)\n\tRecount:AddWindow_(frame)\n\n\tif frame.YesButton then\n\t\tframe:SetTemplate(\"Transparent\")\n\t\tframe.YesButton:SkinButton()\n\t\tframe.NoButton:SkinButton()\n\tend\n\n\tif frame.ReportButton then\n\t\tframe.ReportButton:SkinButton()\n\tend\nend\n\n-- Skin existing frames\nif Recount.MainWindow then SkinFrame(Recount.MainWindow) end\nif Recount.ConfigWindow then SkinFrame(Recount.ConfigWindow) end\nif Recount.GraphWindow then SkinFrame(Recount.GraphWindow) end\nif Recount.DetailWindow then SkinFrame(Recount.DetailWindow) end\nif Recount.ResetFrame then SkinFrame(Recount.ResetFrame) end\nif _G[\"Recount_Realtime_!RAID_DAMAGE\"] then SkinFrame(_G[\"Recount_Realtime_!RAID_DAMAGE\"].Window) end\nif _G[\"Recount_Realtime_!RAID_HEALING\"] then SkinFrame(_G[\"Recount_Realtime_!RAID_HEALING\"].Window) end\nif _G[\"Recount_Realtime_!RAID_HEALINGTAKEN\"] then SkinFrame(_G[\"Recount_Realtime_!RAID_HEALINGTAKEN\"].Window) end\nif _G[\"Recount_Realtime_!RAID_DAMAGETAKEN\"] then SkinFrame(_G[\"Recount_Realtime_!RAID_DAMAGETAKEN\"].Window) end\nif _G[\"Recount_Realtime_Bandwidth Available_AVAILABLE_BANDWIDTH\"] then SkinFrame(_G[\"Recount_Realtime_Bandwidth Available_AVAILABLE_BANDWIDTH\"].Window) end\nif _G[\"Recount_Realtime_FPS_FPS\"] then SkinFrame(_G[\"Recount_Realtime_FPS_FPS\"].Window) end\nif _G[\"Recount_Realtime_Latency_LAG\"] then SkinFrame(_G[\"Recount_Realtime_Latency_LAG\"].Window) end\nif _G[\"Recount_Realtime_Downstream Traffic_DOWN_TRAFFIC\"] then SkinFrame(_G[\"Recount_Realtime_Downstream Traffic_DOWN_TRAFFIC\"].Window) end\nif _G[\"Recount_Realtime_Upstream Traffic_UP_TRAFFIC\"] then SkinFrame(_G[\"Recount_Realtime_Upstream Traffic_UP_TRAFFIC\"].Window) end\n\n-- Update Textures\nRecount:UpdateBarTextures()\nRecount.MainWindow.ConfigButton:HookScript(\"OnClick\", function() Recount:UpdateBarTextures() end)\n\n-- Reskin Dropdown\nRecount.MainWindow.FileButton:HookScript(\"OnClick\", function() if LibDropdownFrame0 then LibDropdownFrame0:SetTemplate(\"Transparent\") end end)\n\n-- Reskin Buttons\nSkinButton(Recount.MainWindow.CloseButton, \"X\")\nSkinButton(Recount.MainWindow.RightButton, \">\")\nSkinButton(Recount.MainWindow.LeftButton, \"<\")\nSkinButton(Recount.MainWindow.ResetButton, \"R\")\nSkinButton(Recount.MainWindow.FileButton, \"F\")\nSkinButton(Recount.MainWindow.ConfigButton, \"C\")\nSkinButton(Recount.MainWindow.ReportButton, \"S\")\n\n-- Force some default profile options\nif not RecountDB then RecountDB = {} end\nif not RecountDB[\"profiles\"] then RecountDB[\"profiles\"] = {} end\nif not RecountDB[\"profiles\"][T.name..\" - \"..GetRealmName()] then RecountDB[\"profiles\"][T.name..\" - \"..T.realm] = {} end\nif not RecountDB[\"profiles\"][T.name..\" - \"..GetRealmName()][\"MainWindow\"] then RecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"] = {} end\n\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"Locked\"] = true\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"Scaling\"] = 1\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"RowHeight\"] = 12\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"RowSpacing\"] = 7\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"ShowScrollbar\"] = false\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"HideTotalBar\"] = true\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"Position\"][\"x\"] = 284\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"Position\"][\"y\"] = -281\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"Position\"][\"w\"] = 221\n--RecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"Position\"][\"h\"] = 158\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindow\"][\"BarText\"][\"NumFormat\"] = 3\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindowWidth\"] = 221\n--RecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"MainWindowHeight\"] = 158\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"ClampToScreen\"] = true\nRecountDB[\"profiles\"][T.name..\" - \"..T.realm][\"Font\"] = \"Calibri\""
  },
  {
    "path": "ShestakUI/Modules/Skins/Rematch.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.rematch ~= true or not IsAddOnLoaded(\"Rematch\") then return end\n\n----------------------------------------------------------------------------------------\n--\tRematch skin\n----------------------------------------------------------------------------------------\nlocal _,skin = ...\nSkin = skin\n\nlocal rematch = Rematch\nlocal roster = rematch.Roster\n\nskin.panels = {\n\n\tFrame = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tself:SetTemplate(\"Transparent\")\n\t\tself.TitleBar:StripTextures()\n\t\tT.SkinCloseButton(RematchFrame.CloseButton)\n\t\tself.TitleBar.LockButton:Kill()\n\t\tfor _,tab in ipairs(self.PanelTabs.Tabs) do\n\t\t\tskin:HandlePanelTab(tab)\n\t\tend\n\t\thooksecurefunc(Rematch.Frame,\"Update\",function()\n\t\t\tlocal titlebar = Rematch.Frame.TitleBar\n\t\t\ttitlebar.SinglePanelButton:SetShown(not RematchSettings.Minimized)\n\t\tend)\n\t\tT.SkinCloseButton(RematchFrame.TitleBar.MinimizeButton, nil, \"+\")\n\t\tRematchFrame.TitleBar.MinimizeButton:SetSize(18,18)\n\t\tRematchFrame.TitleBar.MinimizeButton:SetPoint(\"TOPRIGHT\", RematchFrame.CloseButton, \"TOPLEFT\", -3, 0)\n\t\tT.SkinNextPrevButton(RematchFrame.TitleBar.SinglePanelButton, nil)\n\tend,\n\n\tJournal = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tself:SetTemplate(\"Transparent\")\n\t\tfor _,tab in ipairs(self.PanelTabs.Tabs) do\n\t\t\tskin:HandlePanelTab(tab)\n\t\tend\n\t\tRematchJournalPortrait:Hide()\n\t\tT.SkinCloseButton(self.CloseButton)\n\t\tlocal handled\n\t\tself:HookScript(\"OnEvent\",function()\n\t\t\tif not handled and UseRematchButton then\n\t\t\t\tT.SkinCheckBox(UseRematchButton)\n\t\t\t\thandled = true\n\t\t\tend\n\t\tend)\n\t\t-- added in Rematch 4.3.4\n\t\tif self.OtherAddonJournalStuff then\n\t\t\thooksecurefunc(self,\"OtherAddonJournalStuff\",function()\n\t\t\t\tif self.CollectMeButton then\n\t\t\t\t\tself.CollectMeButton:SkinButton()\n\t\t\t\t\tself.CollectMeButton:SetHeight(20)\n\t\t\t\t\tself.CollectMeButton:SetPoint(\"RIGHT\",Rematch.BottomPanel.SaveButton,\"LEFT\",-2,0)\n\t\t\t\tend\n\t\t\t\tif self.PetTrackerJournalButton then\n\t\t\t\t\tT.SkinCheckBox(self.PetTrackerJournalButton)\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\tend,\n\n\tBottomPanel = function(self)\n\t\tfor _,button in ipairs({\"SummonButton\",\"SaveButton\",\"SaveAsButton\",\"FindBattleButton\"}) do\n\t\t\tself[button]:SkinButton()\n\t\t\tself[button]:SetHeight(20)\n\t\tend\n\t\tT.SkinCheckBox(self.UseDefault)\n\tend,\n\n\tToolbar = function(self)\n\t\tfor _,button in ipairs(self.Buttons) do\n\t\t\tbutton.IconBorder:SetTexture(nil)\n\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\tbutton:StyleButton(nil, 4)\n\n\t\t\tbutton:SetSize(26, 26)\n\t\t\tbutton:CreateBackdrop(\"Default\")\n\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tbutton.Icon:SetDrawLayer(\"ARTWORK\")\n\t\t\tbutton.Icon:SetParent(button.backdrop)\n\n\t\t\tbutton.hover:SetSize(26, 26)\n\t\t\tbutton.hover:ClearAllPoints()\n\t\t\tbutton.hover:SetPoint(\"CENTER\",0,0)\n\n\t\t\tbutton.pushed:SetSize(26, 26)\n\t\t\tbutton.pushed:ClearAllPoints()\n\t\t\tbutton.pushed:SetPoint(\"CENTER\",0,0)\n\n\t\t\tbutton.Cooldown:SetSize(26, 26)\n\t\t\tbutton.Cooldown:ClearAllPoints()\n\t\t\tbutton.Cooldown:SetPoint(\"CENTER\",0,0)\n\t\tend\n\t\tself.PetCount:StripTextures()\n\tend,\n\n\tPetCard = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tself:SetTemplate(\"Transparent\")\n\t\tT.SkinCloseButton(self.CloseButton)\n\t\tT.SkinCloseButton(self.PinButton,nil,\"\")\n\t\tself.Title.TitleBG:SetDrawLayer(\"BACKGROUND\",2)\n\t\tlocal r,g,b = 0.05, 0.05, 0.05\n\t\tMixin(self.Front, BackdropTemplateMixin)\n\t\tself.Front:SetBackdrop({edgeFile=\"Interface\\\\ChatFrame\\\\ChatFrameBackground\",edgeSize=4})\n\t\tself.Front:SetBackdropBorderColor(r,g,b)\n\t\tMixin(self.Back, BackdropTemplateMixin)\n\t\tself.Back:SetBackdrop({})\n\t\tself.Back:SetBackdrop({edgeFile=\"Interface\\\\ChatFrame\\\\ChatFrameBackground\",edgeSize=4})\n\t\tself.Back:SetBackdropBorderColor(r,g,b)\n\t\t-- also reskinning ability card here\n\t\tlocal abilityCard = RematchAbilityCard\n\t\tMixin(abilityCard, BackdropTemplateMixin)\n\t\tabilityCard:SetBackdrop({edgeFile=\"Interface\\\\ChatFrame\\\\ChatFrameBackground\",edgeSize=4})\n\t\tabilityCard:SetBackdropBorderColor(r,g,b)\n\t\t-- change all the horizontal divider lines to solid black lines\n\t\tfor _, frame in ipairs({\n\t\t\tself.Front.Bottom,\n\t\t\tself.Front.Middle,\n\t\t\tself.Back.Source,\n\t\t\tself.Back.Bottom,\n\t\t\tself.Back.Middle,\n\t\t\tabilityCard,\n\t\t\tabilityCard.Hints,\n\t\t}) do\n\t\t\tfor _, region in ipairs({ frame:GetRegions() }) do\n\t\t\t\tlocal anchorPoint, relativeTo = region:GetPoint()\n\t\t\t\tif\n\t\t\t\t\tregion:GetObjectType() == \"Texture\"\n\t\t\t\t\tand region:GetDrawLayer() == \"ARTWORK\"\n\t\t\t\t\tand anchorPoint == \"LEFT\"\n\t\t\t\t\tand relativeTo == frame\n\t\t\t\tthen\n\t\t\t\t\tregion:SetTexture(r, g, b)\n\t\t\t\t\tregion:SetHeight(4)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend,\n\n\tLoadoutPanel = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tMixin(self.Target, BackdropTemplateMixin)\n\t\tself.Target:StripTextures()\n\t\tself.Target:SetTemplate(\"Transparent\")\n\t  for i=1,3 do\n\t\tMixin(self.Loadouts[i], BackdropTemplateMixin)\n\t    self.Loadouts[i]:StripTextures()\n\t    self.Loadouts[i]:SetTemplate(\"Default\")\n\t  end\n\t\tself.Target.TargetButton:SkinButton()\n\t\tself.Target.LoadSaveButton:SkinButton()\n\t\tfor i=1,3 do\n\t\t  for j=1,3 do\n\t\t    self.Loadouts[i].Abilities[j]:SkinButton()\n\t\t    self.Loadouts[i].Abilities[j].IconBorder:Hide()\n\t\t  end\n\t\tend\n\t\tself.Flyout:SetTemplate(\"Transparent\")\n\t\tfor i=1,2 do\n\t\t\tself.Flyout.Abilities[i]:SkinButton()\n\t\t\tself.Flyout.Abilities[i].IconBorder:Hide()\n\t\tend\n\tend,\n\n\tLoadedTeamPanel = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tself:SetTemplate(\"Transparent\")\n\t\tMixin(self.Footnotes, BackdropTemplateMixin)\n\t\tself.Footnotes:StripTextures()\n\t\tself.Footnotes:SetTemplate(\"Transparent\")\n\t\tT.SkinCloseButton(self.Footnotes.Close)\n\t\tT.SkinCloseButton(self.Footnotes.Maximize,nil,\"-\")\n\tend,\n\n\tPetPanel = function(self)\n\t\tskin:HandleAutoScrollFrame(self.List)\n\t\t-- top\n\t\tMixin(self.Top, BackdropTemplateMixin)\n\t\tself.Top:StripTextures()\n\t\tMixin(self.Top.TypeBar, BackdropTemplateMixin)\n\t\tself.Top.TypeBar:StripTextures()\n\t\tself.Top.Filter:SkinButton()\n\t\tself.Top.Toggle:SkinButton()\n\t\tT.SkinEditBox(self.Top.SearchBox)\n\t\tMixin(self.Top.SearchBox, BackdropTemplateMixin)\n\t\tself.Top.SearchBox:SetBackdrop({})\n\t\tself.Top.SearchBox.NineSlice:Hide()\n\t\tfor _,region in ipairs({self.Top.SearchBox:GetRegions()}) do\n\t\t\tif region:GetDrawLayer()==\"BACKGROUND\" then\n\t\t\t\tregion:Hide()\n\t\t\tend\n\t\tend\n\t\tself.Top.SearchBox:SetHeight(20)\n\t\tself.Top.SearchBox:SetPoint(\"LEFT\",self.Top.Toggle,\"RIGHT\",4,0)\n\t\tself.Top.SearchBox:SetPoint(\"RIGHT\",self.Top.Filter,\"LEFT\",-4,0)\n\t\tMixin(self.Results, BackdropTemplateMixin)\n\t\tself.Results:StripTextures()\n\t\tself.Results:SetTemplate(\"Transparent\")\n\t\t-- typebar requires a bit of extra work\n\t\tself.Top.TypeBar:SetPoint(\"BOTTOM\",0,-2)\n\t\tfor _,button in ipairs(self.Top.TypeBar.Tabs) do\n\t\t\tbutton:SkinButton()\n\t\t\tbutton:SetWidth(button:GetWidth() - 7)\n\t\tend\n\t\tfor _,button in ipairs(self.Top.TypeBar.Tabs) do\n\t\t  button.Selected:ClearAllPoints()\n\t\t  button.Selected:SetPoint(\"TOPLEFT\", 0, -2)\n\t\t  button.Selected:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\t  for _,texture in ipairs({\"LeftSelected\",\"RightSelected\",\"MidSelected\"}) do\n\t\t        button.Selected[texture]:SetColorTexture(1, 1, 1, 0.25)\n\t\t        button.Selected[texture]:SetHeight(20)\n\t\t  end\n\t\t\tfor _,region in ipairs({button.Selected:GetRegions()}) do\n\t\t\t\tif region:GetDrawLayer()==\"ARTWORK\" then\n\t\t\t\t\tregion:Hide()\n\t\t\t\tend\n\t\t\tend\n\t\t\tfor _,region in ipairs({button:GetRegions()}) do\n\t\t\t\tif region:GetDrawLayer()==\"HIGHLIGHT\" then\n\t\t\t\t\tregion:Hide()\n\t\t\t\tend\n\t\t\tend\n\t\t\tbutton.HasStuff:SetPoint(\"TOPLEFT\",3,-18)\n\t\t\tbutton.HasStuff:SetAlpha(1)\n\t\tend\n\t\tfor _,button in ipairs(self.Top.TypeBar.Buttons) do\n\t\t\tbutton.IconBorder:SetTexture(nil)\n\t\t\tbutton:CreateBackdrop(\"Overlay\")\n\t\t\tbutton:StyleButton(nil, 4)\n\t\t\tbutton:SetSize(20, 20)\n\t\t\tbutton:CreateBackdrop(\"Default\")\n\n\t\t\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tbutton.Icon:SetDrawLayer(\"ARTWORK\")\n\t\t\tbutton.Icon:SetParent(button.backdrop)\n\n\t\t\tbutton.hover:SetSize(20, 20)\n\t\t\tbutton.hover:ClearAllPoints()\n\t\t\tbutton.hover:SetPoint(\"CENTER\",0,0)\n\n\t\t\tbutton.checked:SetSize(20, 20)\n\t\t\tbutton.checked:ClearAllPoints()\n\t\t\tbutton.checked:SetPoint(\"CENTER\",0,0)\n\t\tend\n\tend,\n\n\tLoadoutPanel = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tMixin(self.Target, BackdropTemplateMixin)\n\t\tself.Target:StripTextures()\n\t\tself.Target:SetTemplate(\"Transparent\")\n\n\t\tself.Target.Pet1:SkinButton()\n\t\tself.Target.Pet1.IconBorder:SetAlpha(0)\n\t\tself.Target.Pet2:SkinButton()\n\t\tself.Target.Pet2.IconBorder:SetAlpha(0)\n\t\tself.Target.Pet3:SkinButton()\n\t\tself.Target.Pet3.IconBorder:SetAlpha(0)\n\t\tself.Target.Model:CreateBackdrop(\"Transparent\")\n\t\tself.Target.Model.backdrop:SetPoint(\"TOPLEFT\", 0, 0)\n\t\tself.Target.Model.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 0)\n\t\tself.Target.ModelBorder:SetAlpha(0)\n\n\t\tfor i = 1, 3 do\n\t\t\tMixin(self.Loadouts[i], BackdropTemplateMixin)\n\t\t\tself.Loadouts[i]:StripTextures()\n\t\t\tself.Loadouts[i]:CreateBackdrop(\"Overlay\")\n\t\t\tself.Loadouts[i].backdrop:SetPoint(\"TOPLEFT\")\n\t\t\tself.Loadouts[i].backdrop:SetPoint(\"BOTTOMRIGHT\")\n\n\t\t\tself.Loadouts[i].Pet.Pet.IconBorder:SetAlpha(0)\n\t\t\tself.Loadouts[i].Pet.Pet:StyleButton(nil, 4)\n\t\t\tself.Loadouts[i].Pet.Pet:SetSize(40, 40)\n\t\t\tself.Loadouts[i].Pet.Pet:CreateBackdrop(\"Default\")\n\n\t\t\tself.Loadouts[i].Pet.Pet.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tself.Loadouts[i].Pet.Pet.Icon:SetDrawLayer(\"ARTWORK\")\n\t\t\tself.Loadouts[i].Pet.Pet.Icon:SetParent(self.Loadouts[i].Pet.Pet.backdrop)\n\n\t\t\tself.Loadouts[i].Pet.Pet.hover:SetSize(40, 40)\n\t\t\tself.Loadouts[i].Pet.Pet.hover:ClearAllPoints()\n\t\t\tself.Loadouts[i].Pet.Pet.hover:SetPoint(\"CENTER\",0,0)\n\t\t\tself.Loadouts[i].Pet.Pet.Level.BG:SetAlpha(0)\n\n\t\t\tself.Loadouts[i].HP:StripTextures()\n\t\t\tself.Loadouts[i].HP:CreateBackdrop(\"Overlay\")\n\t\t\tself.Loadouts[i].HP:SetStatusBarTexture(C.media.texture)\n\n\t\t\tself.Loadouts[i].XP:StripTextures()\n\t\t\tself.Loadouts[i].XP:CreateBackdrop(\"Overlay\")\n\t\t\tself.Loadouts[i].XP:SetStatusBarTexture(C.media.texture)\n\t\t\tself.Loadouts[i].XP:SetFrameLevel(self.Loadouts[i].XP:GetFrameLevel() + 2)\n\t\tend\n\t\tself.Target.TargetButton:SkinButton()\n\t\tself.Target.LoadSaveButton:SkinButton()\n\t\tfor i = 1, 3 do\n\t\t\tfor j = 1, 3 do\n\t\t\t\tself.Loadouts[i].Abilities[j].IconBorder:Hide()\n\t\t\t\tself.Loadouts[i].Abilities[j].IconBorder:SetTexture(nil)\n\t\t\t\tself.Loadouts[i].Abilities[j]:StyleButton(nil, 4)\n\t\t\t\tself.Loadouts[i].Abilities[j]:SetSize(30, 30)\n\t\t\t\tself.Loadouts[i].Abilities[j]:CreateBackdrop(\"Default\")\n\n\t\t\t\tself.Loadouts[i].Abilities[j].Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\t\tself.Loadouts[i].Abilities[j].Icon:SetDrawLayer(\"ARTWORK\")\n\t\t\t\tself.Loadouts[i].Abilities[j].Icon:SetParent(self.Loadouts[i].Abilities[j].backdrop)\n\n\t\t\t\tself.Loadouts[i].Abilities[j].hover:SetSize(30, 30)\n\t\t\t\tself.Loadouts[i].Abilities[j].hover:ClearAllPoints()\n\t\t\t\tself.Loadouts[i].Abilities[j].hover:SetPoint(\"CENTER\",0,0)\n\n\t\t\t\tself.Loadouts[i].Abilities[j].checked:SetSize(30, 30)\n\t\t\t\tself.Loadouts[i].Abilities[j].checked:ClearAllPoints()\n\t\t\t\tself.Loadouts[i].Abilities[j].checked:SetPoint(\"CENTER\",0,0)\n\t\t\tend\n\t\tend\n\t\tself.Flyout:SetTemplate(\"Transparent\")\n\t\tfor i = 1, 2 do\n\t\t\tself.Flyout.Abilities[i].IconBorder:Hide()\n\n\t\t\tself.Flyout.Abilities[i]:StyleButton()\n\t\t\tself.Flyout.Abilities[i]:SetTemplate(\"Default\")\n\n\t\t\tself.Flyout.Abilities[i].Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\tself.Flyout.Abilities[i].Icon:ClearAllPoints()\n\t\t\tself.Flyout.Abilities[i].Icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tself.Flyout.Abilities[i].Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\tself.Flyout.Abilities[i].Icon:SetDrawLayer(\"OVERLAY\")\n\t\tend\n\tend,\n\n\tLoadedTeamPanel = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tself:SetTemplate(\"Transparent\")\n\t\tMixin(self.Footnotes, BackdropTemplateMixin)\n\t\tself.Footnotes:StripTextures()\n\t\tself.Footnotes:SetTemplate(\"Transparent\")\n\t\tT.SkinCloseButton(self.Footnotes.Close)\n\t\tT.SkinCloseButton(self.Footnotes.Maximize,nil,\"-\")\n\tend,\n\n\tTeamPanel = function(self)\n\t\tskin:HandleAutoScrollFrame(self.List)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tMixin(self.Top, BackdropTemplateMixin)\n\t\tself.Top:StripTextures()\n\t\tself.Top.Teams:SkinButton()\n\t\tT.SkinEditBox(self.Top.SearchBox)\n\t\tMixin(self.Top.SearchBox, BackdropTemplateMixin)\n\t\tself.Top.SearchBox:SetBackdrop({})\n\t\tself.Top.SearchBox.NineSlice:Hide()\n\t\tfor _,region in ipairs({self.Top.SearchBox:GetRegions()}) do\n\t\t\tif region:GetDrawLayer()==\"BACKGROUND\" then\n\t\t\t\tregion:Hide()\n\t\t\tend\n\t\tend\n\t\tself.Top.SearchBox:SetHeight(22)\n\t\tself.Top.SearchBox:SetPoint(\"RIGHT\",self.Top.Teams,\"LEFT\",-4,0)\n\tend,\n\n\tMiniPanel = function(self)\n\t\tMixin(self.Background, BackdropTemplateMixin)\n\t\tself.Background:StripTextures()\n\t\tself.Background:SetTemplate(\"Transparent\")\n\t\tMixin(self.Target, BackdropTemplateMixin)\n\t\tself.Target:StripTextures()\n\t\tself.Target:SetTemplate(\"Transparent\")\n\t\tself.Target.LoadButton:SkinButton()\n\t\tfor i = 1, 3 do\n\t\t\tfor j = 1, 3 do\n\t\t\t\tself.Pets[i].Abilities[j]:SkinButton()\n\t\t\t\tself.Pets[i].Abilities[j].IconBorder:Hide()\n\t\t\tend\n\t\tend\n\t\tself.Flyout:SetTemplate(\"Transparent\")\n\t\tfor i = 1, 2 do\n\t\t\tself.Flyout.Abilities[i]:SkinButton()\n\t\t\tself.Flyout.Abilities[i].IconBorder:Hide()\n\t\tend\n\tend,\n\n\tMiniQueue = function(self)\n\t\tskin:HandleAutoScrollFrame(self.List)\n\t\tMixin(self.Top, BackdropTemplateMixin)\n\t\tself.Top:StripTextures()\n\t\tself.Top:SetTemplate(\"Transparent\")\n\t\tself.Top.QueueButton:SkinButton()\n\t\tMixin(self.Status, BackdropTemplateMixin)\n\t\tself.Status:StripTextures()\n\t\tself.Status:SetTemplate(\"Transparent\")\n\tend,\n\n\tQueuePanel = function(self)\n\t\tskin:HandleAutoScrollFrame(self.List)\n\t\tMixin(self.Top, BackdropTemplateMixin)\n\t\tself.List:StripTextures()\n\t\tself.List:SetTemplate(\"Transparent\")\n\t\tT.SkinScrollBar(self.List.ScrollFrame.ScrollBar)\n\t\tself.Top:StripTextures()\n\t\tself.Top.QueueButton:SkinButton()\n\t\tMixin(self.Status, BackdropTemplateMixin)\n\t\tself.Status:StripTextures()\n\t\tself.Status:SetTemplate(\"Transparent\")\n\tend,\n\n\tOptionPanel = function(self)\n\t\tskin:HandleAutoScrollFrame(self.List)\n\tend,\n\n\tTeamTabs = function(self)\n\t\thooksecurefunc(self,\"Update\",function(self)\n\t\t\tif RematchSettings.TeamTabsToLeft and RematchSettings.AlwaysTeamTabs and self:GetParent()==Rematch.Frame then\n\t\t\t\tlocal anchorPoint,relativeTo,relativePoint,x,y = self:GetPoint()\n\t\t\t\tself:SetPoint(anchorPoint,relativeTo,relativePoint,x+5,y)\n\t\t\tend\n\t\t\tfor _,button in ipairs(self.Tabs) do\n\t\t\t  button:SkinButton()\n\t\t\t  button:SetSize(40,40)\n\t\t\t  button.Icon:SetPoint(\"CENTER\")\n\t\t\tend\n\t\t\tself.UpButton:SkinButton()\n\t\t\tself.UpButton:SetSize(40,40)\n\t\t\tself.UpButton.Icon:SetPoint(\"CENTER\")\n\t\t\tself.DownButton:SkinButton()\n\t\t\tself.DownButton:SetSize(40,40)\n\t\t\tself.DownButton.Icon:SetPoint(\"CENTER\")\n\t\tend)\n\tend,\n\n\tDialog = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tself:SetTemplate(\"Default\")\n\t\tT.SkinCloseButton(self.CloseButton)\n\t\tself.Accept:SkinButton()\n\t\tself.Cancel:SkinButton()\n\t\tself.Other:SkinButton()\n\t\tMixin(self.Prompt, BackdropTemplateMixin)\n\t\tself.Prompt:StripTextures()\n\t\tself.Prompt:SetTemplate(\"Transparent\")\n\t\t--T.SkinEditBox(self.EditBox)\n\t\t--self.EditBox:SetBackdrop({})\n\t\tMixin(self.TabPicker, BackdropTemplateMixin)\n\t\tself.TabPicker:SkinButton()\n\t\tself.TabPicker.Icon:SetDrawLayer(\"ARTWORK\")\n\t\tMixin(self.TeamTabIconPicker, BackdropTemplateMixin)\n\t\tself.TeamTabIconPicker:StripTextures()\n\t\tself.TeamTabIconPicker:SetTemplate(\"Transparent\")\n\t\tT.SkinScrollBar(self.TeamTabIconPicker.ScrollFrame.ScrollBar)\n\t\tT.SkinEditBox(self.MultiLine)\n\t\tMixin(self.MultiLine, BackdropTemplateMixin)\n\t\tself.MultiLine:SetTemplate(\"Transparent\")\n\t\tT.SkinScrollBar(self.MultiLine.ScrollBar)\n\t\tfor _,child in ipairs({self.MultiLine:GetChildren()}) do\n\t\t  if child:GetObjectType()==\"Button\" then\n\t\t    child:SetBackdrop({})\n\t\t  end\n\t\tend\n\t\tT.SkinCheckBox(self.CheckButton)\n\t\t--self.CollectionReport.ChartTypeComboBox:SetBackdrop({})\n\t\t--self.CollectionReport.Chart:SetBackdrop({})\n\t\tT.SkinEditBox(self.SaveAs.Name)\n\t\t--self.SaveAs.Name:SetBackdrop({})\n\t\tT.SkinEditBox(self.SaveAs.Target)\n\t\tMixin(self.SaveAs.Target, BackdropTemplateMixin)\n\t\tself.SaveAs.Target:StripTextures()\n\t\tself.SaveAs.Target:SetTemplate(\"Transparent\")\n\t\tT.SkinEditBox(self.ScriptFilter.Name)\n\t\t--self.ScriptFilter.Name:SetBackdrop({})\n\t\tfor i=1,3 do\n\t\t  self.ScriptFilter.ReferenceButtons[i]:SkinButton()\n\t\tend\n\t\tfor _,button in ipairs({\"MinHP\",\"MaxHP\",\"MinXP\",\"MaxXP\"}) do\n\t\t  T.SkinEditBox(self.Preferences[button])\n\t\t  --self.Preferences[button]:SetBackdrop({})\n\t\tend\n\t\tT.SkinCheckBox(self.Preferences.AllowMM)\n\t\tlocal handledExpectedDD\n\t\thooksecurefunc(Rematch,\"ShowPreferencesDialog\",function()\n\t\t\tif not handledExpectedDD then\n\t\t\t\tfor i=1,10 do\n\t\t\t\t\tself.Preferences.expectedDD[i]:SkinButton()\n\t\t\t\t\tself.Preferences.expectedDD[i].IconBorder:Hide()\n\t\t\t\tend\n\t\t\t\thandledExpectedDD = true\n\t\t\tend\n\t\tend)\n\tend,\n\n\tNotes = function(self)\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tself:SetTemplate(\"Transparent\")\n\t\tself.Controls.SaveButton:SkinButton()\n\t\tself.Controls.UndoButton:SkinButton()\n\t\tself.Controls.DeleteButton:SkinButton()\n\t\tT.SkinCloseButton(self.CloseButton)\n\t\tself.LockButton:Kill()\n\t\tself.Content:StripTextures()\n\t\tself.Content:SetTemplate(\"Transparent\")\n\t\tfor _,region in ipairs({self.Content:GetRegions()}) do\n\t\t  if region:GetDrawLayer()==\"ARTWORK\" then\n\t\t    if region:GetObjectType()==\"Texture\" then -- restore thin gold border around icons\n\t\t      region:SetTexture(\"Interface\\\\PetBattles\\\\PetBattleHUD\")\n\t\t      region:SetTexCoord(0.884765625,0.943359375,0.681640625,0.798828125)\n\t\t    end\n\t\t  end\n\t\tend\n\tend,\n\n}\n\n--[[ Stuff that needs to be done on login that has no panel goes here (menus, tooltips, etc) ]]\nskin.misc = {\n\n\tMenu = function()\n\t\t-- menu framepool is local, going to force the creation of three levels of menus and skin them\n\t\tfor i=1,3 do\n\t\t\tlocal menu = Rematch:GetMenuFrame(i,UIParent)\n\t\t\tmenu:Hide()\n\t\t\tMixin(menu, BackdropTemplateMixin)\n\t\t\tmenu:StripTextures()\n\t\t\tmenu:SetTemplate(\"Default\")\n\t\t\tfor _,region in ipairs({menu.Title:GetRegions()}) do\n\t\t\t\tif region:GetObjectType()==\"Texture\" and region:GetDrawLayer()==\"BACKGROUND\" then\n\t\t\t\t\tregion:SetTexture()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend,\n\n\tTooltip = function()\n\t\tMixin(RematchTooltip, BackdropTemplateMixin)\n\t\tRematchTooltip:StripTextures()\n\t\tRematchTooltip:SetTemplate(\"Default\")\n\t\tMixin(RematchTableTooltip, BackdropTemplateMixin)\n\t\tRematchTableTooltip:StripTextures()\n\t\tRematchTableTooltip:SetTemplate(\"Default\")\n\tend,\n\n\tWinRecordCard = function()\n\t\tlocal self = RematchWinRecordCard\n\t\tMixin(self, BackdropTemplateMixin)\n\t\tself:StripTextures()\n\t\tself:SetTemplate(\"Transparent\")\n\t\tfor _,button in ipairs({\"SaveButton\",\"CancelButton\",\"ResetButton\"}) do\n\t\t\tself.Controls[button]:SkinButton()\n\t\t\tself.Controls[button]:SetHeight(20)\n\t\tend\n\t\tT.SkinCloseButton(self.CloseButton)\n\t\tMixin(self.Content, BackdropTemplateMixin)\n\t\tself.Content:StripTextures()\n\t\tself.Content:SetTemplate(\"Default\")\n\t\tfor _,stat in ipairs({\"Wins\",\"Losses\",\"Draws\"}) do\n\t\t\tT.SkinEditBox(self.Content[stat].EditBox)\n\t\t\tself.Content[stat].EditBox:SetBackdrop({bgFile=\"Interface\\\\ChatFrame\\\\ChatFrameBackground\",insets={left=3,right=3,top=3,bottom=3}})\n\t\t\tself.Content[stat].EditBox:SetBackdropColor(0,0,0)\n\t\t\tself.Content[stat].Add:SkinButton()\n\t\t\tself.Content[stat].Add.IconBorder:Hide()\n\t\tend\n\tend,\n}\n\n--[[ Helper functions ]]\nlocal icons = {\n\tLocked = {0, 0.5, 0, 0.25},\n\tUnlocked = {0.5, 1, 0, 0.25},\n\tMinimized = {0, 0.5, 0.25, 0.5},\n\tMaximized = {0.5, 1, 0.25, 0.5},\n\tSinglePanel = {0, 0.5, 0.5, 0.75},\n\tDualPanel = {0.5, 1, 0.5, 0.75},\n\tPinned = {0, 0.5, 0.75, 1},\n}\n\nfunction skin:ColorPetListBordersPet()\n\tfor _,button in ipairs(self.buttons) do\n\n\t\tif (button.index ~= nil) then\n\t\t\tlocal petID = roster.petList[button.index]\n\n\t\t\tif type(petID) == \"string\" then\n\t\t\t\tlocal _, _, _, _, rarity = C_PetJournal.GetPetStats(petID)\n\t\t\t\tif rarity then\n\t\t\t\t\tlocal color = ITEM_QUALITY_COLORS[rarity-1]\n\t\t\t\t\tbutton.Name:SetTextColor(color.r, color.g, color.b)\n\t\t\t\telse\n\t\t\t\t\tbutton.Name:SetTextColor(1, 1, 1)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tbutton.Name:SetTextColor(0.5, 0.5, 0.5)\n\t\t\tend\n\n\t\tend\n\tend\nend\n\nfunction skin:ColorPetListBordersQueue()\n\tfor _,button in ipairs(self.buttons) do\n\t\tif (button.index ~= nil) then\n\t\t\tlocal petID = RematchSettings.LevelingQueue[button.index]\n\t\t\tif type(petID) == \"string\" then\n\t\t\t\tlocal _, _, _, _, rarity = C_PetJournal.GetPetStats(petID)\n\t\t\t\tif rarity then\n\t\t\t\t\tlocal color = ITEM_QUALITY_COLORS[rarity-1]\n\t\t\t\t\tbutton.Name:SetTextColor(color.r, color.g, color.b)\n\t\t\t\telse\n\t\t\t\t\tbutton.Name:SetTextColor(1, 1, 1)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tbutton.Name:SetTextColor(0.5, 0.5, 0.5)\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction skin:HandlePanelTab(tab)\n\tif not tab then return end\n\tfor _,texture in ipairs({tab:GetRegions()}) do\n\t\tif texture:GetDrawLayer()==\"BACKGROUND\" then\n\t\t\t\ttexture:SetTexture(nil)\n\t\tend\n\tend\n\tMixin(tab, BackdropTemplateMixin)\n\n\tif tab.GetHighlightTexture and tab:GetHighlightTexture() then\n\t\ttab:GetHighlightTexture():SetTexture(nil)\n\telse\n\t\tMixin(tab, BackdropTemplateMixin)\n\t\ttab:StripTextures()\n\tend\n\ttab.backdrop = CreateFrame(\"Frame\", nil, tab)\n\tMixin(tab.backdrop, BackdropTemplateMixin)\n\ttab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)\n\tif bg then\n\t\ttab.backdrop:SetTemplate(\"Overlay\")\n\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 3, -7)\n\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, 2)\n\telse\n\t\ttab.backdrop:SetTemplate(\"Transparent\")\n\t\ttab.backdrop:SetPoint(\"TOPLEFT\", 3, -3)\n\t\ttab.backdrop:SetPoint(\"BOTTOMRIGHT\", -3, 3)\n\tend\nend\n\nfunction skin:HandleAutoScrollFrame(listFrame)\n\tif not listFrame then\n\t\treturn\n\tend\n\tMixin(listFrame, BackdropTemplateMixin)\n\tMixin(listFrame.Background, BackdropTemplateMixin)\n\tlistFrame:StripTextures()\n\tlistFrame.Background:StripTextures()\n\n\tMixin(listFrame.ScrollFrame, BackdropTemplateMixin)\n\tMixin(listFrame.ScrollFrame.ScrollBar, BackdropTemplateMixin)\n\tlistFrame.ScrollFrame:StripTextures()\n\tlistFrame.ScrollFrame.ScrollBar:StripTextures()\n\n\tlocal upButton = listFrame.ScrollFrame.ScrollBar.UpButton\n\tT.SkinNextPrevButton(upButton, nil, \"Up\")\n\tupButton:SetSize(upButton:GetWidth() + 7,upButton:GetHeight() + 7)\n\n\tlocal downButton = listFrame.ScrollFrame.ScrollBar.DownButton\n\tT.SkinNextPrevButton(downButton, nil, \"Down\")\n\tdownButton:SetSize(downButton:GetWidth() + 7,downButton:GetHeight() + 7)\n\n\tlocal scrollBar = listFrame.ScrollFrame.ScrollBar\n\tscrollBar:GetThumbTexture():SetTexture(nil)\n\tscrollBar.thumbbg = CreateFrame(\"Frame\", nil, scrollBar)\n\tscrollBar.thumbbg:SetPoint(\"TOPLEFT\", scrollBar:GetThumbTexture(), \"TOPLEFT\", 0, -3)\n\tscrollBar.thumbbg:SetPoint(\"BOTTOMRIGHT\", scrollBar:GetThumbTexture(), \"BOTTOMRIGHT\", 0, 3)\n\tscrollBar.thumbbg:SetTemplate(\"Overlay\")\nend\n\nlocal f = CreateFrame(\"Frame\")\nf:SetScript(\"OnEvent\",function(self)\n\tC_Timer.After(0,function()\n\t\tif Rematch.isLoaded and not self.skinDone then\n\t\t\tfor panel,func in pairs(skin.panels) do\n\t\t\t\tfunc(Rematch[panel])\n\t\t\tend\n\t\t\tfor _,func in pairs(skin.misc) do\n\t\t\t\tfunc()\n\t\t\tend\n\t\t\tself.skinDone = true\n\t\t\tself:UnregisterAllEvents()\n\t\tend\n\tend)\nend)\nf:RegisterEvent(\"PLAYER_LOGIN\")\nf:RegisterEvent(\"PET_JOURNAL_LIST_UPDATE\")"
  },
  {
    "path": "ShestakUI/Modules/Skins/Skada.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.skada ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSkada skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"Skada\") then return end\n\n\tlocal barmod = Skada.displays[\"bar\"]\n\n\t-- Used to strip unecessary options from the in-game config\n\tlocal function StripOptions(options)\n\t\toptions.baroptions.args.barspacing = nil\n\t\toptions.titleoptions.args.texture = nil\n\t\toptions.titleoptions.args.bordertexture = nil\n\t\toptions.titleoptions.args.thickness = nil\n\t\toptions.titleoptions.args.margin = nil\n\t\toptions.titleoptions.args.color = nil\n\t\toptions.windowoptions = nil\n\t\toptions.baroptions.args.barfont = nil\n\t\toptions.baroptions.args.reversegrowth = nil\n\t\toptions.titleoptions.args.font = nil\n\tend\n\n\tbarmod.AddDisplayOptions_ = barmod.AddDisplayOptions\n\tbarmod.AddDisplayOptions = function(self, win, options)\n\t\tself:AddDisplayOptions_(win, options)\n\t\tStripOptions(options)\n\tend\n\n\tfor _, options in pairs(Skada.options.args.windows.args) do\n\t\tif options.type == \"group\" then\n\t\t\tStripOptions(options.args)\n\t\tend\n\tend\n\n\t-- Override settings from in-game GUI\n\tbarmod.ApplySettings_ = barmod.ApplySettings\n\tbarmod.ApplySettings = function(self, win)\n\t\tbarmod.ApplySettings_(self, win)\n\n\t\tlocal skada = win.bargroup\n\n\t\tlocal titlefont = CreateFont(\"TitleFont\"..win.db.name)\n\t\ttitlefont:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\ttitlefont:SetShadowColor(0, 0, 0, C.font.stylization_font_shadow and 1 or 0)\n\n\t\tif win.db.enabletitle then\n\t\t\tskada.button:SetNormalFontObject(titlefont)\n\t\t\tskada.button:SetBackdrop(nil)\n\t\t\tskada.button:GetFontString():SetPoint(\"TOPLEFT\", skada.button, \"TOPLEFT\", 2, -2)\n\t\t\tskada.button:SetHeight(19)\n\n\t\t\tif not skada.button.backdrop then\n\t\t\t\tskada.button:CreateBackdrop(\"Transparent\")\n\t\t\t\tskada.button.backdrop:SetPoint(\"TOPLEFT\", win.bargroup.button, \"TOPLEFT\", -2, 2)\n\t\t\t\tskada.button.backdrop:SetPoint(\"BOTTOMRIGHT\", win.bargroup.button, \"BOTTOMRIGHT\", 2, 5)\n\t\t\tend\n\n\t\t\tskada.button.bg = skada.button:CreateTexture(nil, \"BACKGROUND\")\n\t\t\tskada.button.bg:SetTexture(C.media.texture)\n\t\t\tskada.button.bg:SetVertexColor(unpack(C.media.border_color))\n\t\t\tskada.button.bg:SetPoint(\"TOPLEFT\", win.bargroup.button, \"TOPLEFT\", 0, 0)\n\t\t\tskada.button.bg:SetPoint(\"BOTTOMRIGHT\", win.bargroup.button, \"BOTTOMRIGHT\", 0, 7)\n\t\tend\n\n\t\tskada:SetTexture(C.media.texture)\n\t\tskada:SetSpacing(7)\n\t\tskada:SetBackdrop(nil)\n\t\tskada.borderFrame:SetBackdrop(nil)\n\tend\n\n\thooksecurefunc(Skada, \"UpdateDisplay\", function(self)\n\t\tfor _, win in ipairs(self:GetWindows()) do\n\t\t\tfor _, v in pairs(win.bargroup:GetBars()) do\n\t\t\t\tif not v.BarStyled then\n\t\t\t\t\tif not v.backdrop then\n\t\t\t\t\t\tv:CreateBackdrop(\"Transparent\")\n\t\t\t\t\tend\n\n\t\t\t\t\tv:SetHeight(12)\n\n\t\t\t\t\tv.label:ClearAllPoints()\n\t\t\t\t\tv.label.ClearAllPoints = T.dummy\n\t\t\t\t\tv.label:SetPoint(\"LEFT\", v, \"LEFT\", 2, 0)\n\t\t\t\t\tv.label.SetPoint = T.dummy\n\n\t\t\t\t\tv.label:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\t\tv.label.SetFont = T.dummy\n\t\t\t\t\tv.label:SetShadowOffset(0, 0)\n\t\t\t\t\tv.label.SetShadowOffset = T.dummy\n\n\t\t\t\t\tv.timerLabel:ClearAllPoints()\n\t\t\t\t\tv.timerLabel.ClearAllPoints = T.dummy\n\t\t\t\t\tv.timerLabel:SetPoint(\"RIGHT\", v, \"RIGHT\", 0, 0)\n\t\t\t\t\tv.timerLabel.SetPoint = T.dummy\n\n\t\t\t\t\tv.timerLabel:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\t\t\t\tv.timerLabel.SetFont = T.dummy\n\t\t\t\t\tv.timerLabel:SetShadowOffset(0, 0)\n\t\t\t\t\tv.timerLabel.SetShadowOffset = T.dummy\n\n\t\t\t\t\tv.BarStyled = true\n\t\t\t\tend\n\t\t\t\tif v.icon and v.icon:IsShown() then\n\t\t\t\t\tv.backdrop:SetPoint(\"TOPLEFT\", -14, 2)\n\t\t\t\t\tv.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -2)\n\t\t\t\telse\n\t\t\t\t\tv.backdrop:SetPoint(\"TOPLEFT\", -2, 2)\n\t\t\t\t\tv.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -2)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\n\thooksecurefunc(Skada, \"OpenReportWindow\", function(self)\n\t\tif not self.ReportWindow.frame.reskinned then\n\t\t\tself.ReportWindow.frame:StripTextures()\n\t\t\tself.ReportWindow.frame:SetTemplate(\"Transparent\")\n\t\t\tT.SkinCloseButton(self.ReportWindow.frame:GetChildren())\n\t\t\tself.ReportWindow.frame.reskinned = true\n\t\tend\n\tend)\n\n\t-- Update pre-existing displays\n\tfor _, window in ipairs(Skada:GetWindows()) do\n\t\twindow:UpdateDisplay()\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/TinyDPS.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.tiny_dps ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTinyDPS skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"TinyDPS\") then return end\n\n\ttdps.width = 221\n\ttdps.barHeight = 12\n\ttdps.spacing = 3\n\ttdps.border = {0, 0, 0, 0}\n\ttdps.backdrop = {0, 0, 0, 0}\n\ttdps.barbackdrop = {0, 0, 0, 0}\n\ttdps.swapColor = true\n\ttdps.showMinimapButton = false\n\ttdps.layout = 11\n\ttdpsVisibleBars = 7\n\ttdpsFont.name = C.font.stylization_font\n\ttdpsFont.size = C.font.stylization_font_size\n\ttdpsFont.outline = C.font.stylization_font_style\n\ttdpsFont.shadow = C.font.stylization_font_shadow and 1 or 0\n\ttdpsTextOffset = 0\n\n\ttdpsFrame:SetTemplate(\"Default\")\n\tnoData:SetTextColor(1, 1, 1, 1)\n\n\tif tdpsStatusBar then\n\t\ttdpsStatusBar:SetStatusBarTexture(C.media.texture)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/VanasKoS.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.vanaskos ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tVanasKoS skin\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"VanasKoS\") then return end\n\n\ttable.insert(UISpecialFrames, \"VanasKoSFrame\")\n\n\tVanasKoS_WarnFrame:SetTemplate(\"Transparent\")\n\tVanasKoS_WarnFrame.SetBackdropBorderColor = T.dummy\n\n\tVanasKoS_FontKos:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tVanasKoS_FontEnemy:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tVanasKoS_FontFriendly:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tVanasKoS_FontNormal:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\n\tVanasKoSFrame:StripTextures(true)\n\tVanasKoSFrame:CreateBackdrop(\"Transparent\")\n\tVanasKoSFrame.backdrop:SetPoint(\"TOPLEFT\", 16, -12)\n\tVanasKoSFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", -30, 75)\n\n\tVanasKoSListFrameChangeButton:SkinButton()\n\tVanasKoSListFrameRemoveButton:SkinButton()\n\tVanasKoSListFrameAddButton:SkinButton()\n\tVanasKoSListFrameConfigurationButton:SkinButton()\n\n\tT.SkinCloseButton(VanasKosFrameCloseButton, VanasKoSFrame.backdrop)\n\tT.SkinCheckBox(VanasKoSListFrameCheckBox)\n\tT.SkinNextPrevButton(VanasKoSListFrameToggleRightButton)\n\tT.SkinNextPrevButton(VanasKoSListFrameToggleLeftButton)\n\tT.SkinDropDownBox(VanasKoSPvPStatsCharacterDropDown, 90)\n\tT.SkinDropDownBox(VanasKoSPvPStatsTimeSpanDropDown, 90)\n\tT.SkinDropDownBox(VanasKoSFrameChooseListDropDown)\n\tT.SkinEditBox(VanasKoSListFrameSearchBox, nil, 18)\n\n\tfor i = 1, 2 do\n\t\tT.SkinTab(_G[\"VanasKoSFrameTab\"..i])\n\tend\n\n\tfor i = 1, 5 do\n\t\t_G[\"VanasKoSListFrameColButton\"..i]:StripTextures()\n\tend\n\n\tVanasKoSPvPStatsCharacterDropDown:ClearAllPoints()\n\tVanasKoSPvPStatsCharacterDropDown:SetPoint(\"RIGHT\", VanasKoSListFrameToggleLeftButton, \"LEFT\", -7, 0)\n\tVanasKoSPvPStatsTimeSpanDropDown:ClearAllPoints()\n\tVanasKoSPvPStatsTimeSpanDropDown:SetPoint(\"RIGHT\", VanasKoSPvPStatsCharacterDropDown, \"LEFT\", 10, 0)\n\tVanasKoSListFrameAddButton:ClearAllPoints()\n\tVanasKoSListFrameAddButton:SetPoint(\"BOTTOMRIGHT\", VanasKoSFrame.backdrop, \"BOTTOMRIGHT\", -4, 4)\n\tVanasKoSListFrameRemoveButton:ClearAllPoints()\n\tVanasKoSListFrameRemoveButton:SetPoint(\"RIGHT\", VanasKoSListFrameAddButton, \"LEFT\", -3, 0)\n\tVanasKoSListFrameChangeButton:ClearAllPoints()\n\tVanasKoSListFrameChangeButton:SetPoint(\"RIGHT\", VanasKoSListFrameRemoveButton, \"LEFT\", -3, 0)\n\tVanasKoSListFrameConfigurationButton:ClearAllPoints()\n\tVanasKoSListFrameConfigurationButton:SetPoint(\"BOTTOMRIGHT\", VanasKoSListFrameAddButton, \"TOPRIGHT\", 0, 3)\n\tVanasKoSListFrameSearchBox:ClearAllPoints()\n\tVanasKoSListFrameSearchBox:SetPoint(\"RIGHT\", VanasKoSListFrameConfigurationButton, \"LEFT\", -5, 0)\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/WeakAuras.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.skins.weak_auras ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tWeakAuras skin\n----------------------------------------------------------------------------------------\nif not IsAddOnLoaded(\"WeakAuras\") then return end\n\nlocal i = 0\nlocal function Skin_WeakAuras(frame, type)\n\tif not frame.styled then\n\t\tif type == \"icon\" then\n\t\t\tframe.b = CreateFrame(\"Frame\", nil, frame)\n\t\t\tframe.b:CreateBackdrop(\"Transparent\")\n\t\t\tframe.b:SetInside(frame)\n\t\t\tframe.b.backdrop:SetBackdropColor(0, 0, 0, 0)\n\t\t\tframe.b.backdrop:HookScript(\"OnUpdate\", function(self)\n\t\t\t\tself:SetAlpha(frame.icon:GetAlpha())\n\t\t\tend)\n\t\t\tframe.icon:SetAllPoints(frame.b)\n\t\t\tframe.styled = true\n\t\telseif type == \"aurabar\" then\n\t\t\tif i < 50 then\n\t\t\t\tframe.bar:CreateBackdrop(\"Transparent\")\n\t\t\t\tframe.bar.backdrop:SetBackdropColor(0, 0, 0, 0)\n\t\t\telse\n\t\t\t\tframe.bar:CreateBackdrop(\"Default\")\n\t\t\tend\n\t\t\ti = i + 1\n\n\t\t\tframe.styled = true\n\t\tend\n\tend\n\n\tif frame.icon then\n\t\tframe.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tframe.icon.SetTexCoord = T.dummy\n\tend\n\n\tif frame.bar then\n\t\tframe.bar.fg:SetTexture(C.media.texture)\n\t\tframe.bar.bg:SetTexture(C.media.texture)\n\tend\n\n\tif frame.stacks then\n\t\tframe.stacks:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\t\tframe.stacks:SetShadowOffset(C.media.cooldown_timers_font_shadow and 1 or 0, C.media.cooldown_timers_font_shadow and -1 or 0)\n\tend\n\n\tif frame.text then\n\t\tframe.text:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\t\tframe.text:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\n\tend\n\n\tif frame.text2 then\n\t\tframe.text2:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\t\tframe.text2:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\n\tend\n\n\tif frame.timer then\n\t\tframe.timer:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)\n\t\tframe.timer:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)\n\tend\nend\n\nhooksecurefunc(WeakAuras.regionPrototype, \"create\", function(region)\n\tif region.regionType == \"icon\" or region.regionType == \"aurabar\" then\n\t\tSkin_WeakAuras(region, region.regionType)\n\tend\n\nend)\nhooksecurefunc(WeakAuras.regionPrototype, \"modifyFinish\", function(_, region)\n\tif region.regionType == \"icon\" or region.regionType == \"aurabar\" then\n\t\tSkin_WeakAuras(region, region.regionType)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Skins/lsToasts.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.skins.ls_toasts ~= true or not IsAddOnLoaded(\"ls_Toasts\") then return end\n\n----------------------------------------------------------------------------------------\n--\tls:Toasts skin\n----------------------------------------------------------------------------------------\nlocal toast_F = unpack(ls_Toasts)\nfunction toast_F:SkinToast(toast, toastType)\n\ttoast:SetFrameStrata(\"DIALOG\")\n\ttoast.Border:SetAlpha(0)\n\ttoast:SetTemplate(\"Default\")\n\ttoast.BG:SetAlpha(0.9)\n\ttoast.BG:SetPoint(\"TOPLEFT\", toast, 0, 0)\n\ttoast.BG:SetPoint(\"BOTTOMRIGHT\", toast, 0, 0)\n\n\tif toast.Level then\n\t\ttoast.Level:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\ttoast.Level:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tend\n\tif toast.Count then\n\t\ttoast.Count:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\ttoast.Count:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\t\ttoast.CountUpdate:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\ttoast.CountUpdate:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tend\n\tif toast.Points then\n\t\ttoast.Points:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)\n\t\ttoast.Points:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)\n\tend\n\n\tif toastType == \"mission\" or toastType == \"follower\" then return end\n\tif toast.IconBorder then\n\t\tif toastType == \"misc\" then\n\t\t\tlocal texture = toast.BG:GetTexture()\n\t\t\tif texture == \"Interface\\\\AddOns\\\\ls_Toasts\\\\media\\\\toast-bg-archaeology\" then return end\n\t\tend\n\t\ttoast.IconBorder:Hide()\n\t\ttoast:CreateBackdrop(\"Default\")\n\t\ttoast.backdrop:SetPoint(\"TOPLEFT\", toast.IconBorder, 1, -1)\n\t\ttoast.backdrop:SetPoint(\"BOTTOMRIGHT\", toast.IconBorder, -1, 1)\n\t\ttoast.backdrop:SetBackdropColor(0, 0, 0, 0)\n\t\tlocal r, g, b = toast.IconBorder:GetVertexColor()\n\t\ttoast.backdrop:SetBackdropBorderColor(r, g, b, 1)\n\t\ttoast.backdrop:SetFrameStrata(\"FULLSCREEN\")\n\t\tif toast.Icon then\n\t\t\ttoast.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\t\ttoast.Icon:SetPoint(\"TOPLEFT\", toast.IconBorder, 2, -2)\n\t\t\ttoast.Icon:SetPoint(\"BOTTOMRIGHT\", toast.IconBorder, -2, 2)\n\t\tend\n\tend\nend"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/Achievement.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.achievements ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tYour achievement status in tooltip(Enhanced Achievements by Syzgyn)\n----------------------------------------------------------------------------------------\nlocal function SetHyperlink(tooltip, refString)\n\tif select(3, string.find(refString, \"(%a-):\")) ~= \"achievement\" then return end\n\n\tlocal _, _, achievementID = string.find(refString, \":(%d+):\")\n\tlocal _, _, GUID = string.find(refString, \":%d+:(.-):\")\n\n\tif GUID == UnitGUID(\"player\") then\n\t\ttooltip:Show()\n\t\treturn\n\tend\n\n\ttooltip:AddLine(\" \")\n\tlocal _, _, _, completed, _, _, _, _, _, _, _, _, wasEarnedByMe, earnedBy = GetAchievementInfo(achievementID)\n\n\tif completed then\n\t\tif earnedBy then\n\t\t\tif earnedBy ~= \"\" then\n\t\t\t\ttooltip:AddLine(format(ACHIEVEMENT_EARNED_BY, earnedBy))\n\t\t\tend\n\t\t\tif not wasEarnedByMe then\n\t\t\t\ttooltip:AddLine(format(ACHIEVEMENT_NOT_COMPLETED_BY, T.name))\n\t\t\telseif T.name ~= earnedBy then\n\t\t\t\ttooltip:AddLine(format(ACHIEVEMENT_COMPLETED_BY, T.name))\n\t\t\tend\n\t\tend\n\tend\n\ttooltip:Show()\nend\n\nhooksecurefunc(GameTooltip, \"SetHyperlink\", SetHyperlink)\nhooksecurefunc(ItemRefTooltip, \"SetHyperlink\", SetHyperlink)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/HyperLink.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.chat.enable ~= true or C.tooltip.enable ~= true or IsAddOnLoaded(\"tekKompare\") then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on tekKompare(by Tekkub)\n----------------------------------------------------------------------------------------\nlocal orig1, orig2, GameTooltip = {}, {}, GameTooltip\nlocal linktypes = {item = true, enchant = true, spell = true, quest = true, unit = true, talent = true, achievement = true, glyph = true, instancelock = true, currency = true}\n\nlocal function OnHyperlinkEnter(frame, link, ...)\n\tlocal linktype = link:match(\"^([^:]+)\")\n\tif linktype and linktype == \"battlepet\" then\n\t\tGameTooltip:SetOwner(frame, \"ANCHOR_TOPLEFT\", -3, 0)\n\t\tGameTooltip:Show()\n\t\tlocal _, speciesID, level, breedQuality, maxHealth, power, speed = strsplit(\":\", link)\n\t\tBattlePetToolTip_Show(tonumber(speciesID), tonumber(level), tonumber(breedQuality), tonumber(maxHealth), tonumber(power), tonumber(speed))\n\telseif linktype and linktypes[linktype] then\n\t\tGameTooltip:SetOwner(frame, \"ANCHOR_TOPLEFT\", -3, 0)\n\t\tGameTooltip:SetHyperlink(link)\n\t\tGameTooltip:Show()\n\tend\n\n\tif orig1[frame] then return orig1[frame](frame, link, ...) end\nend\n\nlocal function OnHyperlinkLeave(frame, link, ...)\n\tif BattlePetTooltip:IsShown() then\n\t\tBattlePetTooltip:Hide()\n\telse\n\t\tGameTooltip:Hide()\n\tend\n\n\tif orig1[frame] then return orig1[frame](frame, link, ...) end\nend\n\nfor i = 1, NUM_CHAT_WINDOWS do\n\tlocal frame = _G[\"ChatFrame\"..i]\n\torig1[frame] = frame:GetScript(\"OnHyperlinkEnter\")\n\tframe:SetScript(\"OnHyperlinkEnter\", OnHyperlinkEnter)\n\n\torig2[frame] = frame:GetScript(\"OnHyperlinkLeave\")\n\tframe:SetScript(\"OnHyperlinkLeave\", OnHyperlinkLeave)\nend"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/InstanceLockCompare.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.instance_lock ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tYour instance lock status in tooltip(Instance Lock Compare by Dridzt)\n----------------------------------------------------------------------------------------\nlocal myTip = CreateFrame(\"GameTooltip\", \"InstanceLockTooltip\", nil, \"GameTooltipTemplate\")\n\nlocal function ILockCompare(frame, link)\n\tif not frame or not link then return end\n\n\tlocal linkType = string.match(link, \"(instancelock):\")\n\tif linkType == \"instancelock\" then\n\t\tlocal mylink, templink\n\t\tlocal myguid = UnitGUID(\"player\")\n\t\tlocal guid = string.match(link, \"instancelock:([^:]+)\")\n\n\t\tif guid ~= myguid then\n\t\t\tlocal instanceguid = string.match(link, \"instancelock:[^:]+:(%d+):\")\n\t\t\tlocal numsaved = GetNumSavedInstances()\n\t\t\tif numsaved > 0 then\n\t\t\t\tfor i = 1, numsaved do\n\t\t\t\t\tlocal locked, extended = select(5, GetSavedInstanceInfo(i))\n\t\t\t\t\tif extended or locked then\n\t\t\t\t\t\ttemplink = GetSavedInstanceChatLink(i)\n\t\t\t\t\t\tlocal myinstanceguid = string.match(templink, \"instancelock:[^:]+:(%d+):\")\n\t\t\t\t\t\tif myinstanceguid == instanceguid then\n\t\t\t\t\t\t\tmylink = string.match(templink, \"(instancelock:[^:]+:%d+:%d+:%d+)\")\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tmylink = mylink or string.gsub(link, \"(instancelock:)([^:]+)(:%d+:%d+:)(%d+)\", function(a, g, b, k) g = myguid; k = \"0\"; return a..g..b..k end)\n\t\t\telse\n\t\t\t\tmylink = string.gsub(link, \"(instancelock:)([^:]+)(:%d+:%d+:)(%d+)\", function(a, g, b, k) g = myguid; k = \"0\"; return a..g..b..k end)\n\t\t\tend\n\t\tend\n\n\t\tif mylink then\n\t\t\tif not myTip:IsVisible() and frame:IsVisible() then\n\t\t\t\tmyTip:SetParent(frame)\n\t\t\t\tmyTip:SetOwner(frame, \"ANCHOR_NONE\")\n\t\t\t\tmyTip:SetTemplate(\"Transparent\")\n\n\t\t\t\tlocal side = \"left\"\n\t\t\t\tlocal rightDist = 0\n\t\t\t\tlocal leftPos = frame:GetLeft()\n\t\t\t\tlocal rightPos = frame:GetRight()\n\t\t\t\tif not rightPos then\n\t\t\t\t\trightPos = 0\n\t\t\t\tend\n\t\t\t\tif not leftPos then\n\t\t\t\t\tleftPos = 0\n\t\t\t\tend\n\t\t\t\trightDist = GetScreenWidth() - rightPos\n\t\t\t\tif leftPos and (rightDist < leftPos) then\n\t\t\t\t\tside = \"left\"\n\t\t\t\telse\n\t\t\t\t\tside = \"right\"\n\t\t\t\tend\n\t\t\t\tmyTip:ClearAllPoints()\n\t\t\t\tif side == \"left\" then\n\t\t\t\t\tmyTip:SetPoint(\"TOPRIGHT\", frame, \"TOPLEFT\", -3, -10)\n\t\t\t\telseif side == \"right\" then\n\t\t\t\t\tmyTip:SetPoint(\"TOPLEFT\", frame, \"TOPRIGHT\", 3, -10)\n\t\t\t\tend\n\t\t\t\tmyTip:SetHyperlink(mylink)\n\t\t\t\tmyTip:Show()\n\t\t\tend\n\t\tend\n\tend\nend\n\nItemRefTooltip:HookScript(\"OnDragStop\", function(self)\n\tif myTip:IsVisible() and (myTip:GetParent():GetName() == self:GetName()) then\n\t\tlocal side = \"left\"\n\t\tlocal rightDist = 0\n\t\tlocal leftPos = self:GetLeft()\n\t\tlocal rightPos = self:GetRight()\n\t\tif not rightPos then\n\t\t\trightPos = 0\n\t\tend\n\t\tif not leftPos then\n\t\t\tleftPos = 0\n\t\tend\n\t\trightDist = GetScreenWidth() - rightPos\n\t\tif leftPos and (rightDist < leftPos) then\n\t\t\tside = \"left\"\n\t\telse\n\t\t\tside = \"right\"\n\t\tend\n\t\tmyTip:ClearAllPoints()\n\t\tif side == \"left\" then\n\t\t\tmyTip:SetPoint(\"TOPRIGHT\", self, \"TOPLEFT\", -3, -10)\n\t\telseif side == \"right\" then\n\t\t\tmyTip:SetPoint(\"TOPLEFT\", self, \"TOPRIGHT\", 3, -10)\n\t\tend\n\tend\nend)\n\nhooksecurefunc(GameTooltip, \"SetHyperlink\", ILockCompare)\nhooksecurefunc(ItemRefTooltip,\"SetHyperlink\", ILockCompare)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/ItemCount.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.item_count ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tItem count in bags and bank(by Tukz)\n----------------------------------------------------------------------------------------\nlocal function OnTooltipSetItem(self, data)\n\tif self ~= GameTooltip or self:IsForbidden() then return end\n\tlocal num = GetItemCount(data.id, true)\n\tif num > 1 then\n\t\tself:AddLine(\"|cffffffff\"..L_TOOLTIP_ITEM_COUNT..\" \"..num..\"|r\")\n\tend\nend\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, OnTooltipSetItem)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/ItemIcons.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.item_icon ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tAdds item icons to tooltips(Tipachu by Tuller)\n----------------------------------------------------------------------------------------\nlocal function setTooltipIcon(self, icon)\n\tlocal title = icon and _G[self:GetName()..\"TextLeft1\"]\n\tlocal text = title:GetText()\n\tif title and text and not text:find(\"|T\"..icon) then\n\t\ttitle:SetFormattedText(\"|T%s:20:20:0:0:64:64:5:59:5:59:%d|t %s\", icon, 20, text)\n\tend\nend\n\nlocal whiteTooltip = {\n\t[GameTooltip] = true,\n\t[ItemRefTooltip] = true,\n\t[ItemRefShoppingTooltip1] = true,\n\t[ItemRefShoppingTooltip2] = true,\n\t[ShoppingTooltip1] = true,\n\t[ShoppingTooltip2] = true,\n}\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, function(self, data)\n\tif whiteTooltip[self] and not self:IsForbidden() then\n\t\tif data and data.id then\n\t\t\tsetTooltipIcon(self, GetItemIcon(data.id))\n\t\tend\n\tend\nend)\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Spell, function(self, data)\n\tif whiteTooltip[self] and not self:IsForbidden() then\n\t\tif data and data.id then\n\t\t\tsetTooltipIcon(self, select(3, GetSpellInfo(data.id)))\n\t\tend\n\tend\nend)\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Macro, function(self, data)\n\tif whiteTooltip[self] and not self:IsForbidden() then\n\t\tlocal lineData = data.lines and data.lines[1]\n\t\tlocal tooltipType = lineData and lineData.tooltipType\n\t\tif not tooltipType then return end\n\n\t\tif tooltipType == 0 then -- item\n\t\t\tsetTooltipIcon(self, GetItemIcon(lineData.tooltipID))\n\t\telseif tooltipType == 1 then -- spell\n\t\t\tsetTooltipIcon(self, select(3, GetSpellInfo(lineData.tooltipID)))\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/ItemLevel.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.average_lvl ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tEquipped average item level(AverageItemLevel by Semlar)\n----------------------------------------------------------------------------------------\nlocal F, Events = CreateFrame(\"frame\"), {}\n\nlocal function Raise(_, event, ...)\n\tif Events[event] then\n\t\tfor module in pairs(Events[event]) do\n\t\t\tmodule[event](module, ...)\n\t\tend\n\tend\nend\n\nlocal function RegisterEvent(module, event, func)\n\tif func then\n\t\trawset(module, event, func)\n\tend\n\tif not Events[event] then\n\t\tEvents[event] = {}\n\tend\n\tEvents[event][module] = true\n\tif strmatch(event, \"^[%u_]+$\") then\n\t\tpcall(function() return F:RegisterEvent(event) end)\n\tend\n\treturn module\nend\n\nlocal function UnregisterEvent(module, event)\n\tif Events[event] then\n\t\tEvents[event][module] = nil\n\t\tif not next(Events[event]) and strmatch(event, \"^[%u_]+$\") then\n\t\t\tF:UnregisterEvent(event)\n\t\tend\n\tend\n\treturn module\nend\n\nlocal Module = {\n\t__newindex = RegisterEvent,\n\t__call = Raise,\n\t__index = {\n\t\tRegisterEvent = RegisterEvent,\n\t\tUnregisterEvent = UnregisterEvent,\n\t\tRaise = Raise,\n\t},\n}\n\nT.Eve = setmetatable({}, {\n\t__call = function(eve)\n\t\tlocal module = setmetatable({}, Module)\n\t\teve[ #eve + 1 ] = module\n\t\treturn module\n\tend,\n})\n\nF:SetScript(\"OnEvent\", Raise)\n\nlocal E = T:Eve()\n\nlocal CACHE_TIMEOUT = 5\nlocal GuidCache = {}\nlocal ActiveGUID\nlocal ScannedGUID\nlocal INSPECT_TIMEOUT = 1.5\n\nlocal function GetUnitIDFromGUID(guid)\n\tlocal _, _, _, _, _, name = GetPlayerInfoByGUID(guid)\n\tif UnitExists(name) then -- unit is in our group and can use its name as a unit ID\n\t\treturn name, name\n\telseif UnitGUID(\"mouseover\") == guid then -- unit is under our cursor\n\t\treturn \"mouseover\", name\n\telseif UnitGUID(\"target\") == guid then -- unit is our target\n\t\treturn \"target\", name\n\telseif GetCVar(\"nameplateShowFriends\") == \"1\" then -- friendly nameplates are visible\n\t\tfor i = 1, 30 do\n\t\t\tlocal unitID = \"nameplate\"..i\n\t\t\tlocal nameplateGUID = UnitGUID(unitID)\n\t\t\tif nameplateGUID then\n\t\t\t\tif nameplateGUID == guid then\n\t\t\t\t\treturn unitID, name\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\telse -- scan every group member\"s target (this is probably overkill)\n\t\tlocal numMembers = GetNumGroupMembers()\n\t\tif numMembers > 0 then\n\t\t\tlocal unitPrefix = IsInRaid() and \"raid\" or \"party\"\n\t\t\tif unitPrefix == \"party\" then numMembers = numMembers - 1 end\n\t\t\tfor i = 1, numMembers do\n\t\t\t\tlocal unitID = unitPrefix..i..\"-target\"\n\t\t\t\tlocal targetGUID = UnitGUID(unitID)\n\t\t\t\tif targetGUID == guid then\n\t\t\t\t\treturn unitID, name\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\treturn nil, name\nend\n\nlocal function ColorDiff(p, t)\n\tlocal diff = t - p\n\tlocal r, g, b\n\tif diff >= 10 then\n\t\tr, g, b = 1, 0.1, 0.1\n\telseif diff >= 5 then\n\t\tr, g, b = 1, 0.5, 0.25\n\telseif diff >= -5 then\n\t\tr, g, b = 1, 1, 0\n\telseif diff >= -10 then\n\t\tr, g, b = 0.25, 0.75, 0.25\n\telse\n\t\tr, g, b = 0.7, 0.7, 0.7\n\tend\n\treturn r, g, b\nend\n\nlocal ItemLevelPattern1 = ITEM_LEVEL:gsub(\"%%d\", \"(%%d+)\")\nlocal ItemLevelPattern2 = ITEM_LEVEL_ALT:gsub(\"([()])\", \"%%%1\"):gsub(\"%%d\", \"(%%d+)\")\n\nlocal TwoHanders = {\n\t[\"INVTYPE_RANGED\"] = true,\n\t[\"INVTYPE_RANGEDRIGHT\"] = true,\n\t[\"INVTYPE_2HWEAPON\"] = true,\n}\n\nlocal InventorySlots = {}\nfor i = 1, 17 do\n\tif i ~= 4 then -- ignore shirt, tabard is 19\n\t\ttinsert(InventorySlots, i)\n\tend\nend\n\nlocal function IsArtifact(itemLink)\n\treturn itemLink:find(\"|cffe6cc80\") -- this is probably a horrible way to find whether it\"s an artifact\nend\n\nlocal function IsCached(itemLink) -- we can\"t get the correct level of an artifact until all of its relics have been cached\n\tlocal cached = true\n\tlocal _, itemID, _, relic1, relic2, relic3 = strsplit(\":\", itemLink)\n\n\tif not GetDetailedItemLevelInfo(itemID) then cached = false end\n\tif IsArtifact(itemLink) then\n\t\tif relic1 and relic1 ~= \"\" and not GetDetailedItemLevelInfo(relic1) then cached = false end\n\t\tif relic2 and relic2 ~= \"\" and not GetDetailedItemLevelInfo(relic2) then cached = false end\n\t\tif relic3 and relic3 ~= \"\" and not GetDetailedItemLevelInfo(relic3) then cached = false end\n\tend\n\n\treturn cached\nend\n\nlocal Sekret = \"|Hilvl|h\"\nlocal function AddLine(sekret, leftText, rightText, prefixColor, detailColor, dontShow)\n\tleftText = sekret..leftText\n\tfor i = 2, GameTooltip:NumLines() do\n\t\tlocal line = _G[\"GameTooltipTextLeft\"..i]\n\t\tlocal text = line and line:IsShown() and line:GetText()\n\t\tif text and text:find(sekret) then\n\t\t\tline:SetText(prefixColor..leftText..detailColor..rightText)\n\t\t\tGameTooltip:Show()\n\t\t\treturn\n\t\tend\n\tend\n\tif not dontShow or GameTooltip:IsShown() then\n\t\tGameTooltip:AddLine(prefixColor..leftText..detailColor..rightText)\n\t\tGameTooltip:Show()\n\tend\nend\n\nlocal SlotCache = {} -- [slot] = itemLevel or false\nlocal ItemCache = {} -- [slot] = itemLink\nlocal TestTips = {}\nfor _, slot in pairs(InventorySlots) do\n\tlocal tip = CreateFrame(\"GameTooltip\", \"AverageItemLevelTooltip\"..slot, nil, \"GameTooltipTemplate\")\n\ttip:SetOwner(WorldFrame, \"ANCHOR_NONE\")\n\tTestTips[slot] = tip\n\ttip.slot = slot\nend\n\nfunction OnTooltipSetItem(self)\n\tlocal slot = self.slot\n\tif(not slot) then\n\t\treturn\n\tend\n\tlocal _, itemLink = self:GetItem()\n\tlocal tipName = self:GetName()\n\tif self.itemLink then\n\t\titemLink = self.itemLink\n\tend\n\tif itemLink then\n\t\tlocal isCached = IsCached(itemLink)\n\t\tif isCached then\n\t\t\tfor i = 2, self:NumLines() do\n\t\t\t\tlocal str = _G[tipName..\"TextLeft\"..i]\n\t\t\t\tlocal text = str and str:GetText()\n\t\t\t\tif text then\n\t\t\t\t\tlocal ilevel = text:match(ItemLevelPattern1)\n\t\t\t\t\tif not ilevel then\n\t\t\t\t\t\tilevel = text:match(ItemLevelPattern2)\n\t\t\t\t\tend\n\t\t\t\t\tif ilevel then\n\t\t\t\t\t\tSlotCache[slot] = tonumber(ilevel)\n\t\t\t\t\t\tItemCache[slot] = itemLink\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal finished = true\n\tlocal totalItemLevel = 0\n\tfor slot, ilevel in pairs(SlotCache) do\n\t\tif not ilevel then\n\t\t\tfinished = false\n\t\t\tbreak\n\t\telse\n\t\t\tif slot ~= 16 and slot ~= 17 then\n\t\t\t\ttotalItemLevel = totalItemLevel + ilevel\n\t\t\tend\n\t\tend\n\tend\n\n\tif finished then\n\t\tlocal weaponLevel = 0\n\t\tlocal isDual = false\n\t\tif SlotCache[16] and SlotCache[17] then -- we have 2 weapons\n\t\t\tisDual = true\n\t\t\tif IsArtifact(ItemCache[16]) or IsArtifact(ItemCache[17]) then -- take the higher of the 2 weapons and double it\n\t\t\t\tlocal ilevelMain = SlotCache[16]\n\t\t\t\tlocal ilevelOff = SlotCache[17]\n\t\t\t\tweaponLevel = ilevelMain > ilevelOff and ilevelMain or ilevelOff\n\t\t\t\ttotalItemLevel = totalItemLevel + (weaponLevel * 2)\n\t\t\telse\n\t\t\t\tlocal ilevelMain = SlotCache[16]\n\t\t\t\tlocal ilevelOff = SlotCache[17]\n\t\t\t\ttotalItemLevel = totalItemLevel + ilevelMain + ilevelOff\n\t\t\t\tif ilevelMain > ilevelOff then\n\t\t\t\t\tweaponLevel = ilevelMain\n\t\t\t\telse\n\t\t\t\t\tweaponLevel = ilevelOff\n\t\t\t\tend\n\t\t\tend\n\t\telseif SlotCache[16] then -- main hand only\n\t\t\tlocal _, _, _, weaponType = GetItemInfoInstant(ItemCache[16])\n\t\t\tlocal ilevelMain = SlotCache[16]\n\t\t\tweaponLevel = ilevelMain\n\t\t\tif TwoHanders[weaponType] then -- 2 handed, count it twice\n\t\t\t\ttotalItemLevel = totalItemLevel + (ilevelMain * 2)\n\t\t\telse\n\t\t\t\ttotalItemLevel = totalItemLevel + ilevelMain\n\t\t\tend\n\t\telseif SlotCache[17] then -- off hand only?\n\t\t\tlocal ilevelOff = SlotCache[17]\n\t\t\ttotalItemLevel = totalItemLevel + ilevelOff\n\t\t\tweaponLevel = ilevelOff\n\t\tend\n\n\t\tif weaponLevel >= 900 and ScannedGUID ~= UnitGUID(\"player\") then\n\t\t\tweaponLevel = weaponLevel + 15\n\t\t\tif isDual then\n\t\t\t\ttotalItemLevel = totalItemLevel + 15\n\t\t\telse\n\t\t\t\ttotalItemLevel = totalItemLevel + 30\n\t\t\tend\n\t\tend\n\n\t\tlocal averageItemLevel = totalItemLevel / 16\n\n\t\t-- should we just return the cache for this GUID?\n\t\tlocal guid = ScannedGUID\n\t\tif not GuidCache[guid] then\n\t\t\tGuidCache[guid] = {}\n\t\tend\n\n\t\tGuidCache[guid].ilevel = averageItemLevel\n\t\tGuidCache[guid].weaponLevel = weaponLevel\n\t\tGuidCache[guid].timestamp = GetTime()\n\n\t\tE(\"ItemScanComplete\", guid, GuidCache[guid])\n\tend\nend\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, OnTooltipSetItem)\n\nlocal function GetTooltipGUID()\n\tlocal _, unitID = GameTooltip:GetUnit()\n\tlocal guid = unitID and UnitGUID(unitID)\n\tif UnitIsPlayer(unitID) and CanInspect(unitID) then\n\t\treturn guid\n\tend\nend\n\nlocal f = CreateFrame(\"frame\", nil, GameTooltip)\nlocal ShouldInspect = false\nlastInspectRequest = 0\nlocal FailTimeout = 1\nf:SetScript(\"OnUpdate\", function()\n\tlocal _, unitID = GameTooltip:GetUnit()\n\tlocal guid = unitID and UnitGUID(unitID)\n\tif not guid or (InspectFrame and InspectFrame:IsVisible()) then return end\n\tlocal timeSince = GetTime() - lastInspectRequest\n\tif ShouldInspect and (ActiveGUID == guid or (timeSince >= INSPECT_TIMEOUT)) then\n\t\tShouldInspect = false\n\t\tif ActiveGUID ~= guid then\n\t\t\tlocal cache = GuidCache[guid]\n\t\t\tif cache and GetTime() - cache.timestamp <= CACHE_TIMEOUT then\n\t\t\telseif CanInspect(unitID) then\n\t\t\t\tNotifyInspect(unitID)\n\t\t\tend\n\t\tend\n\telseif ShouldInspect and (timeSince < INSPECT_TIMEOUT) then\n\t\tif unitID and UnitIsPlayer(unitID) and CanInspect(unitID) and not GuidCache[ guid ]then\n\t\t\tAddLine(Sekret, QUEUED_STATUS_WAITING..\": \", format(\"%.1fs\", INSPECT_TIMEOUT - (GetTime() - lastInspectRequest)), \"|cff9A9A9A\", \"|cff9A9A9A\")\n\t\tend\n\telse\n\t\tif ActiveGUID then\n\t\t\tif guid == ActiveGUID then\n\t\t\t\tif timeSince <= FailTimeout then\n\t\t\t\t\tAddLine(Sekret, SEARCH..\": \", format(\"%d%%\", timeSince / FailTimeout * 100), \"|cff9A9A9A\", \"|cff9A9A9A\")\n\t\t\t\telse\n\t\t\t\t\tAddLine(Sekret, SEARCH..\": \", FAILED, \"|cff9A9A9A\", \"|cff9A9A9A\")\n\t\t\t\t\tActiveGUID = nil\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tActiveGUID = nil\n\t\t\t\tif timeSince > FailTimeout and CanInspect(unitID) then\n\t\t\t\t\tNotifyInspect(unitID)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend)\n\nhooksecurefunc(\"NotifyInspect\", function(unitID)\n\tif not GuidCache[UnitGUID(unitID)] then\n\t\tActiveGUID = UnitGUID(unitID)\n\tend\n\tlastInspectRequest = GetTime()\nend)\n\nhooksecurefunc(\"ClearInspectPlayer\", function()\n\tActiveGUID = nil\nend)\n\nlocal function DoInspect()\n\tShouldInspect = true\nend\n\nlocal function DecorateTooltip(guid, isInspect)\n\tlocal cache = GuidCache[guid]\n\tif not cache then return end\n\tif GetTooltipGUID() == guid or (isInspect and guid == UnitGUID(\"target\")) then\n\t\tlocal _, ourEquippedItemLevel = GetAverageItemLevel()\n\t\tlocal averageItemLevel = cache.ilevel or 0\n\t\tlocal r1, g1, b1 = ColorDiff(ourEquippedItemLevel, averageItemLevel)\n\n\t\tlocal _, unitID = GameTooltip:GetUnit()\n\t\tif isInspect then\n\t\t\tunitID = \"target\"\n\t\tend\n\n\t\tlocal levelText = format(\"|cff%2x%2x%2x%.1f|r\", r1 * 255, g1 * 255, b1 * 255, averageItemLevel)\n\n\t\tif isInspect and averageItemLevel > 0 then\n\t\t\tInspectFrameiLvL:SetText(levelText)\n\t\tend\n\n\t\tAddLine(Sekret, STAT_AVERAGE_ITEM_LEVEL..\": \", levelText, \"|cffF9D700\", \"|cffffffff\")\n\tend\nend\n\nlocal function ScanUnit(unitID)\n\tScannedGUID = UnitGUID(unitID)\n\twipe(SlotCache)\n\twipe(ItemCache)\n\tlocal numEquipped = 0\n\tfor _, slot in pairs(InventorySlots) do\n\t\tif GetInventoryItemTexture(unitID, slot) then\n\t\t\tSlotCache[slot] = false\n\t\t\tnumEquipped = numEquipped + 1\n\t\tend\n\tend\n\n\tif numEquipped > 0 then\n\t\tfor slot in pairs(SlotCache) do\n\t\t\tTestTips[slot].itemLink = GetInventoryItemLink(unitID, slot)\n\t\t\tTestTips[slot]:SetOwner(WorldFrame, \"ANCHOR_NONE\")\n\t\t\tTestTips[slot]:SetInventoryItem(unitID, slot)\n\t\tend\n\telse\n\t\tlocal guid = ScannedGUID\n\t\tif not GuidCache[guid] then GuidCache[guid] = {} end\n\t\tGuidCache[guid].ilevel = 0\n\t\tGuidCache[guid].weaponLevel = 0\n\t\tGuidCache[guid].timestamp = GetTime()\n\t\tE(\"ItemScanComplete\", guid, GuidCache[guid])\n\tend\nend\n\nfunction E:INSPECT_READY(guid)\n\tActiveGUID = nil\n\tlocal unitID = GetUnitIDFromGUID(guid)\n\tif unitID then\n\t\t-- local _, class = UnitClass(unitID)\n\t\t-- local colors = class and RAID_CLASS_COLORS[class]\n\t\t-- local specID = GetInspectSpecialization(unitID)\n\t\t-- local specName\n\t\t-- if not specName and specID and specID ~= 0 then\n\t\t\t-- specID, specName = GetSpecializationInfoByID(specID, UnitSex(unitID))\n\t\t\t-- if colors then\n\t\t\t\t-- specName = \"|c\"..colors.colorStr..specName..\"|r\"\n\t\t\t-- end\n\t\t-- end\n\n\t\tif not GuidCache[guid] then\n\t\t\tGuidCache[guid] = {\n\t\t\t\tilevel = 0,\n\t\t\t\tweaponLevel = 0,\n\t\t\t\ttimestamp = 0,\n\t\t\t}\n\t\tend\n\t\t-- local cache = GuidCache[guid]\n\t\t-- cache.specID = specID\n\t\t-- cache.class = class\n\t\t-- cache.specName = specName\n\t\t-- cache.itemLevel = C_PaperDollInfo.GetInspectItemLevel(unitID)\n\n\t\tScanUnit(unitID)\n\tend\nend\n\nlocal function InspectLevel()\n\tif not InspectFrameiLvL then\n\t\tlocal text = InspectModelFrame:CreateFontString(\"InspectFrameiLvL\", \"OVERLAY\", \"SystemFont_Outline_Small\")\n\t\ttext:SetPoint(\"BOTTOM\", 5, 20)\n\t\ttext:Hide()\n\t\tInspectPaperDollFrame:HookScript(\"OnShow\", function()\n\t\t\ttext:Show()\n\t\t\tDecorateTooltip(UnitGUID(\"target\"), true)\n\t\tend)\n\t\tInspectPaperDollFrame:HookScript(\"OnHide\", function()\n\t\t\ttext:Hide()\n\t\tend)\n\tend\nend\n\nfunction E:ADDON_LOADED(addon)\n\tif addon == \"Blizzard_InspectUI\" then\n\t\tInspectLevel()\n\tend\nend\n\nfunction E:ItemScanComplete(guid)\n\tDecorateTooltip(guid)\nend\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, function(self)\n\tif self ~= GameTooltip or self:IsForbidden() then return end\n\tif C.tooltip.show_shift and not IsShiftKeyDown() then return end\n\tlocal _, unitID = self:GetUnit()\n\tlocal guid = unitID and UnitGUID(unitID)\n\tif guid and UnitIsPlayer(unitID) then\n\t\tlocal cache = GuidCache[guid]\n\t\tif cache then\n\t\t\tDecorateTooltip(guid)\n\t\tend\n\t\tif CanInspect(unitID) then\n\t\t\tDoInspect()\n\t\tend\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tCharacter Info Sheet\n----------------------------------------------------------------------------------------\nMIN_PLAYER_LEVEL_FOR_ITEM_LEVEL_DISPLAY = 1\nhooksecurefunc(\"PaperDollFrame_SetItemLevel\", function(self, unit)\n\tif unit ~= \"player\" then return end\n\n\tlocal total, equip = GetAverageItemLevel()\n\tif total > 0 then total = string.format(\"%.1f\", total) end\n\tif equip > 0 then equip = string.format(\"%.1f\", equip) end\n\n\tlocal ilvl = equip\n\tif equip ~= total then\n\t\tilvl = equip..\" / \"..total\n\tend\n\n\tself.Value:SetText(ilvl)\n\n\tself.tooltip = \"|cffffffff\"..STAT_AVERAGE_ITEM_LEVEL..\": \"..ilvl\nend)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/MountSource.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.mount ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tShow source of mount\n----------------------------------------------------------------------------------------\nlocal MountCache = {}\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tfor _, mountID in ipairs(C_MountJournal.GetMountIDs()) do\n\t\tMountCache[select(2, C_MountJournal.GetMountInfoByID(mountID))] = mountID\n\tend\nend)\n\nhooksecurefunc(GameTooltip, \"SetUnitBuffByAuraInstanceID\", function(self, ...)\n\tif not UnitIsPlayer(...) or UnitIsUnit(..., \"player\") then return end\n\tlocal aura = C_UnitAuras.GetAuraDataByAuraInstanceID(...)\n\tlocal id = aura and aura.spellId\n\n\tif id and MountCache[id] then\n\t\tlocal text = NOT_COLLECTED\n\t\tlocal r, g, b = 1, 0, 0\n\t\tlocal collected = select(11, C_MountJournal.GetMountInfoByID(MountCache[id]))\n\n\t\tif collected then\n\t\t\ttext = COLLECTED\n\t\t\tr, g, b = 0, 1, 0\n\t\tend\n\n\t\tself:AddLine(\" \")\n\t\tself:AddLine(text, r, g, b)\n\n\t\tlocal sourceText = select(3, C_MountJournal.GetMountInfoExtraByID(MountCache[id]))\n\t\tself:AddLine(sourceText, 1, 1, 1)\n\t\tself:AddLine(\" \")\n\t\tself:Show()\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/MultiItemRef.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tMulti ItemRefTooltip\n----------------------------------------------------------------------------------------\nlocal tips = {[1] = _G[\"ItemRefTooltip\"]}\nlocal types = {item = true, enchant = true, spell = true, quest = true, unit = true, talent = true, achievement = true, glyph = true, instancelock = true, currency = true}\nlocal shown\n\nlocal CreateTip = function(link)\n\tfor _, v in ipairs(tips) do\n\t\tfor _, tip in ipairs(tips) do\n\t\t\tif tip:IsShown() and tip.link == link then\n\t\t\t\ttip.link = nil\n\t\t\t\tHideUIPanel(tip)\n\t\t\t\treturn\n\t\t\tend\n\t\tend\n\t\tif not v:IsShown() then\n\t\t\tv.link = link\n\t\t\treturn v\n\t\tend\n\tend\n\n\tlocal num = #tips + 1\n\tlocal tip = CreateFrame(\"GameTooltip\", \"ItemRefTooltip\"..num, UIParent, \"GameTooltipTemplate\")\n\tif num == 2 then\n\t\ttip:SetPoint(\"LEFT\", ItemRefTooltip, \"RIGHT\", 3, 0)\n\telse\n\t\ttip:SetPoint(\"LEFT\", \"ItemRefTooltip\"..num - 1, \"RIGHT\", 3, 0)\n\tend\n\ttip:SetSize(128, 64)\n\ttip:EnableMouse(true)\n\ttip:SetMovable(true)\n\ttip:SetClampedToScreen(true)\n\ttip:RegisterForDrag(\"LeftButton\")\n\ttip:SetScript(\"OnDragStart\", function(self) self:StartMoving() end)\n\ttip:SetScript(\"OnDragStop\", function(self) self:StopMovingOrSizing() end)\n\ttip.NineSlice:SetAlpha(0)\n\n\tlocal bg = CreateFrame(\"Frame\", nil, tip)\n\tbg:SetPoint(\"TOPLEFT\")\n\tbg:SetPoint(\"BOTTOMRIGHT\")\n\tbg:SetFrameLevel(tip:GetFrameLevel() - 1)\n\tbg:SetTemplate(\"Transparent\")\n\n\tlocal close = CreateFrame(\"Button\", \"ItemRefTooltip\"..num..\"CloseButton\", tip)\n\tclose:SetScript(\"OnClick\", function() HideUIPanel(tip) end)\n\tT.SkinCloseButton(close)\n\n\ttable.insert(UISpecialFrames, tip:GetName())\n\n\ttip.link = link\n\ttips[num] = tip\n\n\treturn tip\nend\n\nlocal ShowTip = function(tip, link)\n\tShowUIPanel(tip)\n\tif not tip:IsShown() then\n\t\ttip:SetOwner(UIParent, \"ANCHOR_PRESERVE\")\n\tend\n\tshown = true\n\ttip:SetHyperlink(link)\n\tshown = nil\nend\n\nlocal SetHyperlink = _G.ItemRefTooltip.SetHyperlink\nfunction _G.ItemRefTooltip:SetHyperlink(link, ...)\n\tlocal handled = strsplit(\":\", link)\n\tif not InCombatLockdown() and not IsModifiedClick() and handled and types[handled] and not shown then\n\t\tlocal tip = CreateTip(link)\n\t\tif tip then\n\t\t\tShowTip(tip, link)\n\t\tend\n\t\treturn\n\tend\n\n\tSetHyperlink(self, link, ...)\nend"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/RuFix.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tClean ruRU tooltip(snt_rufix by Don Kaban, edited by ALZA)\n----------------------------------------------------------------------------------------\nITEM_CREATED_BY = \"\"\t-- No creator name\nITEM_SOCKETABLE = \"\"\t-- No gem info line\nEMPTY_SOCKET_RED = \"|cffFF4040\"..EMPTY_SOCKET_RED..\"|r\"\nEMPTY_SOCKET_YELLOW = \"|cffffff40\"..EMPTY_SOCKET_YELLOW..\"|r\"\nEMPTY_SOCKET_BLUE = \"|cff6060ff\"..EMPTY_SOCKET_BLUE..\"|r\"\n\nif T.client ~= \"ruRU\" then return end\n\nGUILD_ACHIEVEMENT = \"Уведомл. для гильдии\"\n\nlocal ttext\nlocal replace = {\n\t[\"красного цвета\"] = \"|cffFF4040красного цвета|r\",\n\t[\"синего цвета\"] = \"|cff6060ffсинего цвета|r\",\n\t[\"желтого цвета\"] = \"|cffffff40желтого цвета|r\",\n\t[\"Требуется хотя бы\"] = \"Требуется\",\n}\n\nlocal replaceclass = {\n\t[\"Воин\"] = \"|cffC79C6EВоин|r\",\n\t[\"Друид\"] = \"|cffFF7D0AДруид|r\",\n\t[\"Жрец\"] = \"|cffFFFFFFЖрец|r\",\n\t[\"Маг\"] = \"|cff69CCF0Маг|r\",\n\t[\"Монах\"] = \"|cff00FF96Монах|r\",\n\t[\"Охотник\"] = \"|cffABD473Охотник|r\",\n\t[\"Охотник на демонов\"] = \"|cffA330C9Охотник на демонов|r\",\n\t[\"Паладин\"] = \"|cffF58CBAПаладин|r\",\n\t[\"Разбойник\"] = \"|cffFFF569Разбойник|r\",\n\t[\"Рыцарь смерти\"] = \"|cffC41F3BРыцарь смерти|r\",\n\t[\"Чернокнижник\"] = \"|cff9482C9Чернокнижник|r\",\n\t[\"Шаман\"] = \"|cff0070DEШаман|r\",\n}\n\nlocal function Translate(text)\n\tif text then\n\t\tfor rus, replace in next, replace do\n\t\t\ttext = text:gsub(rus, replace)\n\t\tend\n\t\treturn text\n\tend\nend\n\nlocal function TranslateClass(text)\n\tif text then\n\t\tfor rus, replaceclass in next, replaceclass do\n\t\t\tif not (rus == \"Охотник\" and string.find(text, \"Охотник на демонов\")) then\n\t\t\t\ttext = text:gsub(rus, replaceclass)\n\t\t\tend\n\t\tend\n\t\treturn text\n\tend\nend\n\nlocal whiteTooltip = {\n\t[GameTooltip] = true,\n\t[ItemRefTooltip] = true,\n\t[ShoppingTooltip1] = true,\n\t[ShoppingTooltip2] = true,\n}\n\nlocal function UpdateTooltip(self)\n\tif whiteTooltip[self] and not self:IsForbidden() then\n\t\tif not TooltipUtil.GetDisplayedItem(self) then return end\n\t\tlocal tname = self:GetName()\n\t\tfor i = 3, self:NumLines() do\n\t\t\tttext = _G[tname..\"TextLeft\"..i]\n\t\t\tlocal class = ttext:GetText() and (string.find(ttext:GetText(), \"Класс\") or string.find(ttext:GetText(), \"Требуется\"))\n\t\t\tif ttext then ttext:SetText(Translate(ttext:GetText())) end\n\t\t\tif ttext and class then ttext:SetText(TranslateClass(ttext:GetText())) end\n\t\t\tttext = _G[tname..\"TextRight\"..i]\n\t\t\tif ttext then ttext:SetText(Translate(ttext:GetText())) end\n\t\tend\n\t\tttext = nil\n\tend\nend\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, UpdateTooltip)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/SpellID.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.spell_id ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSpell/Item IDs(idTip by Silverwind)\n----------------------------------------------------------------------------------------\nlocal debuginfo = false\nlocal function addLine(self, id, isItem)\n\tfor i = 1, self:NumLines() do\n\t\tlocal line = _G[self:GetName()..\"TextLeft\"..i]\n\t\tif not line then break end\n\t\tlocal text = line:GetText()\n\t\tif text and strfind(text, id) then return end\n\tend\n\tif isItem then\n\t\tself:AddLine(\"|cffffffff\"..L_TOOLTIP_ITEM_ID..\" \"..id)\n\telse\n\t\tself:AddLine(\"|cffffffff\"..L_TOOLTIP_SPELL_ID..\" \"..id)\n\t\tself:Show()\n\tend\nend\n\n-- Spells\nhooksecurefunc(GameTooltip, \"SetUnitAura\", function(self, ...)\n\tlocal id = select(10, UnitAura(...))\n\tif id then addLine(self, id) end\n\tif debuginfo == true and id and IsModifierKeyDown() then print(UnitAura(...)..\": \"..id) end\nend)\n\nlocal function attachByAuraInstanceID(self, ...)\n\tlocal aura = C_UnitAuras.GetAuraDataByAuraInstanceID(...)\n\tlocal id = aura and aura.spellId\n\tif id then addLine(self, id) end\n\tif debuginfo == true and id and IsModifierKeyDown() then print(UnitAura(...)..\": \"..id) end\nend\n\nhooksecurefunc(GameTooltip, \"SetUnitBuffByAuraInstanceID\", attachByAuraInstanceID) -- from oUF Auras\nhooksecurefunc(GameTooltip, \"SetUnitDebuffByAuraInstanceID\", attachByAuraInstanceID)\n\nhooksecurefunc(\"SetItemRef\", function(link)\n\tlocal id = tonumber(link:match(\"spell:(%d+)\"))\n\tif id then addLine(ItemRefTooltip, id) end\nend)\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Spell, function(self, data)\n\tif self ~= GameTooltip or self:IsForbidden() then return end\n\tif data and data.id then\n\t\taddLine(self, data.id)\n\tend\nend)\n\n-- Items\nlocal whiteTooltip = {\n\t[GameTooltip] = true,\n\t[ItemRefTooltip] = true,\n\t[ItemRefShoppingTooltip1] = true,\n\t[ItemRefShoppingTooltip2] = true,\n\t[ShoppingTooltip1] = true,\n\t[ShoppingTooltip2] = true,\n}\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, function(self, data)\n\tif whiteTooltip[self] and not self:IsForbidden() then\n\t\tif data and data.id then\n\t\t\taddLine(self, data.id, true)\n\t\tend\n\tend\nend)\n\n-- Macros\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Macro, function(self, data)\n\tif self:IsForbidden() then return end\n\n\tlocal lineData = data.lines and data.lines[1]\n\tlocal tooltipType = lineData and lineData.tooltipType\n\tif not tooltipType then return end\n\n\tif tooltipType == 0 then -- item\n\t\taddLine(self, lineData.tooltipID, true)\n\telseif tooltipType == 1 then -- spell\n\t\taddLine(self, lineData.tooltipID)\n\tend\nend)\n\n-- Toys\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Toy, function(self, data)\n\tif self ~= GameTooltip or self:IsForbidden() then return end\n\tif data and data.id then\n\t\taddLine(self, data.id, true)\n\tend\nend)\n\nSlashCmdList.SHOWSPELLID = function()\n\tif not debuginfo then\n\t\tdebuginfo = true\n\telse\n\t\tdebuginfo = false\n\tend\nend\n\nSLASH_SHOWSPELLID1 = \"/showid\"\nSLASH_SHOWSPELLID2 = \"/si\"\nSLASH_SHOWSPELLID3 = \"/ыш\"\n"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/Talents.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.talents ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTarget Talents(TipTacTalents by Aezay)\n----------------------------------------------------------------------------------------\n-- Constants\nlocal TALENTS_PREFIX = SPECIALIZATION..\":|cffffffff \"\nlocal CACHE_SIZE = 25\nlocal INSPECT_DELAY = 0.2\nlocal INSPECT_FREQ = 1.5\n\n-- Variables\nlocal ttt = CreateFrame(\"Frame\", \"TipTacTalents\")\nlocal cache = {}\nlocal current = {}\n\n-- Time of the last inspect reuqest. Init this to zero, just to make sure. This is a global so other addons could use this variable as well\nlastInspectRequest = 0\n\n-- Allow these to be accessed through other addons\nttt.cache = cache\nttt.current = current\nttt:Hide()\n\n----------------------------------------------------------------------------------------\n--\tGather Talents\n----------------------------------------------------------------------------------------\nlocal function GatherTalents(mouseover)\n\tif mouseover == 1 then\n\t\tlocal id = GetInspectSpecialization(\"mouseover\")\n\t\tlocal currentSpecName = id and select(2, GetSpecializationInfoByID(id)) or L_TOOLTIP_LOADING\n\t\tcurrent.tree = currentSpecName\n\telse\n\t\tlocal currentSpec = GetSpecialization()\n\t\tlocal currentSpecName = currentSpec and select(2, GetSpecializationInfo(currentSpec)) or L_TOOLTIP_NO_TALENT\n\t\tcurrent.tree = currentSpecName\n\tend\n\n\t-- Set the tips line output, for inspect, only update if the tip is still showing a unit\n\tif mouseover == 0 then\n\t\tGameTooltip:AddLine(TALENTS_PREFIX..current.tree)\n\telseif GameTooltip:GetUnit() then\n\t\tfor i = 2, GameTooltip:NumLines() do\n\t\t\tif (_G[\"GameTooltipTextLeft\"..i]:GetText() or \"\"):match(\"^\"..TALENTS_PREFIX) then\n\t\t\t\t_G[\"GameTooltipTextLeft\"..i]:SetFormattedText(\"%s%s\", TALENTS_PREFIX, current.tree)\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\n\t-- Organise Cache\n\tlocal cacheSize = CACHE_SIZE\n\tfor i = #cache, 1, -1 do\n\t\tif current.name == cache[i].name then\n\t\t\ttremove(cache, i)\n\t\t\tbreak\n\t\tend\n\tend\n\tif #cache > cacheSize then\n\t\ttremove(cache, 1)\n\tend\n\t-- Cache the new entry\n\tif cacheSize > 0 then\n\t\tcache[#cache + 1] = CopyTable(current)\n\tend\n\n\tGameTooltip:Show()\nend\n\n----------------------------------------------------------------------------------------\n--\tEvent Handling\n----------------------------------------------------------------------------------------\n-- OnEvent\nttt:SetScript(\"OnEvent\", function(self, event, guid)\n\tself:UnregisterEvent(event)\n\tif guid == current.guid then\n\t\tGatherTalents(1)\n\tend\nend)\n\n-- OnUpdate\nttt:SetScript(\"OnUpdate\", function(self, elapsed)\n\tself.nextUpdate = (self.nextUpdate - elapsed)\n\tif self.nextUpdate <= 0 then\n\t\tself:Hide()\n\t\t-- Make sure the mouseover unit is still our unit\n\t\tif UnitGUID(\"mouseover\") == current.guid then\n\t\t\tif (InspectFrame and InspectFrame:IsVisible()) then return end\n\t\t\tlastInspectRequest = GetTime()\n\t\t\tself:RegisterEvent(\"INSPECT_READY\")\n\t\t\tNotifyInspect(current.unit)\n\t\tend\n\tend\nend)\n\n-- HOOK: OnTooltipSetUnit\nlocal function OnTooltipSetUnit(self)\n\tif self ~= GameTooltip or self:IsForbidden() then return end\n\n\t-- Abort any delayed inspect in progress\n\tttt:Hide()\n\n\tif C.tooltip.show_shift and not IsShiftKeyDown() then return end\n\n\t-- Get the unit -- Check the UnitFrame unit if this tip is from a concated unit, such as \"targettarget\".\n\tlocal _, unit = self:GetUnit()\n\tif not unit then\n\t\tlocal mFocus = GetMouseFocus()\n\t\tif mFocus and mFocus.unit then\n\t\t\tunit = mFocus.unit\n\t\tend\n\tend\n\n\t-- No Unit or not a Player\n\tif not unit or not UnitIsPlayer(unit) then\n\t\treturn\n\tend\n\n\t-- Only bother for players over level 9\n\tlocal level = UnitLevel(unit)\n\tif level > 9 or level == -1 then\n\t\t-- Wipe Current Record\n\t\twipe(current)\n\t\tcurrent.unit = unit\n\t\tcurrent.name = UnitName(unit)\n\t\tcurrent.guid = UnitGUID(unit)\n\t\t-- No need for inspection on the player\n\t\tif UnitIsUnit(unit, \"player\") then\n\t\t\tGatherTalents(0)\n\t\t\treturn\n\t\tend\n\t\t-- Show Cached Talents, If Available\n\t\tlocal isInspectOpen = (InspectFrame and InspectFrame:IsShown()) or (Examiner and Examiner:IsShown())\n\t\tlocal cacheLoaded = false\n\t\tfor _, entry in ipairs(cache) do\n\t\t\tif current.name == entry.name and not isInspectOpen then\n\t\t\t\tself:AddLine(TALENTS_PREFIX..entry.tree)\n\t\t\t\tcurrent.tree = entry.tree\n\t\t\t\tcacheLoaded = true\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\t\t-- Queue an inspect request\n\t\tif CanInspect(unit) and not isInspectOpen then\n\t\t\tif C.tooltip.average_lvl then\n\t\t\t\tttt:RegisterEvent(\"INSPECT_READY\")\n\t\t\telse\n\t\t\t\tlocal lastInspectTime = GetTime() - lastInspectRequest\n\t\t\t\tttt.nextUpdate = (lastInspectTime > INSPECT_FREQ) and INSPECT_DELAY or (INSPECT_FREQ - lastInspectTime + INSPECT_DELAY)\n\t\t\t\tttt:Show()\n\t\t\tend\n\t\t\tif not cacheLoaded then\n\t\t\t\tself:AddLine(TALENTS_PREFIX..L_TOOLTIP_LOADING)\n\t\t\tend\n\t\telseif isInspectOpen then\n\t\t\tself:AddLine(TALENTS_PREFIX..L_TOOLTIP_INSPECT_OPEN)\n\t\tend\n\tend\nend\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, OnTooltipSetUnit)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/Tooltip.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tBased on aTooltip(by ALZA)\n----------------------------------------------------------------------------------------\nlocal StoryTooltip = QuestScrollFrame.StoryTooltip\nStoryTooltip:SetFrameLevel(4)\n\nlocal CampaignTooltip = QuestScrollFrame.CampaignTooltip\nT.SkinCloseButton(_G.ItemRefTooltip.CloseButton)\n\nlocal tooltips = {\n\tGameTooltip,\n\tItemRefTooltip,\n\tShoppingTooltip1,\n\tShoppingTooltip2,\n\tFriendsTooltip,\n\tItemRefShoppingTooltip1,\n\tItemRefShoppingTooltip2,\n\tStoryTooltip,\n\tReputationParagonTooltip,\n\tCampaignTooltip,\n\tEmbeddedItemTooltip,\n\tQuickKeybindTooltip,\n\tSettingsTooltip,\n\t-- Addons\n\tAtlasLootTooltip,\n\tQuestGuru_QuestWatchTooltip,\n\tTomTomTooltip,\n\tLibDBIconTooltip,\n\tAceConfigDialogTooltip,\n\tBigWigsOptionsTooltip\n}\n\nlocal backdrop = {\n\tbgFile = C.media.blank, edgeFile = C.media.blank, edgeSize = T.mult,\n\tinsets = {left = -T.mult, right = -T.mult, top = -T.mult, bottom = -T.mult}\n}\n\nfor _, tt in pairs(tooltips) do\n\tif not IsAddOnLoaded(\"Aurora\") then\n\t\ttt.NineSlice:SetAlpha(0)\n\n\t\tlocal bg = CreateFrame(\"Frame\", nil, tt)\n\t\tbg:SetPoint(\"TOPLEFT\")\n\t\tbg:SetPoint(\"BOTTOMRIGHT\")\n\t\tif tt:GetFrameLevel() - 1 >= 0 then\n\t\t\tbg:SetFrameLevel(tt:GetFrameLevel() - 1)\n\t\telse\n\t\t\tbg:SetFrameLevel(0)\n\t\tend\n\t\tbg:SetTemplate(\"Transparent\")\n\n\t\ttt.GetBackdrop = function() return backdrop end\n\t\ttt.GetBackdropColor = function() return C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha end\n\t\ttt.GetBackdropBorderColor = function() return unpack(C.media.border_color) end\n\tend\nend\n\n-- LibExtraTip skin\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nframe:SetScript(\"OnEvent\", function()\n\tif not IsAddOnLoaded(\"Auc-Advanced\") then return end\n\n\tlocal LT = LibStub(\"LibExtraTip-1\")\n\tfor _, Tooltip in pairs({GameTooltip, ItemRefTooltip}) do\n\t\tTooltip:HookScript(\"OnUpdate\", function(self)\n\t\t\tif not LT then return end\n\t\t\tlocal ExtraTip = LT:GetExtraTip(self)\n\t\t\tif ExtraTip then\n\t\t\t\tif not ExtraTip.IsDone then\n\t\t\t\t\tExtraTip:StripTextures()\n\t\t\t\t\tExtraTip:CreateBackdrop(\"Transparent\")\n\t\t\t\t\tExtraTip.backdrop:SetPoint(\"TOPLEFT\", 0, -3)\n\t\t\t\t\tExtraTip.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 2)\n\t\t\t\t\tExtraTip:HookScript(\"OnShow\", function()\n\t\t\t\t\t\tExtraTip.backdrop:SetFrameLevel(0)\n\t\t\t\t\tend)\n\t\t\t\t\tExtraTip.IsDone = true\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\tend\nend)\n\nif IsAddOnLoaded(\"RaiderIO\") then\n\tPVEFrame:HookScript(\"OnShow\", function(self)\n\t\tif not RaiderIO_ProfileTooltip.styled then\n\t\t\tRaiderIO_ProfileTooltip.NineSlice:SetAlpha(0)\n\t\t\tRaiderIO_ProfileTooltip:CreateBackdrop(\"Transparent\")\n\t\t\tRaiderIO_ProfileTooltip.backdrop:SetPoint(\"TOPLEFT\", 3, 0)\n\t\t\tRaiderIO_ProfileTooltip.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, 0)\n\t\t\tRaiderIO_ProfileTooltip.styled = true\n\n\t\t\tif DF_Frame and C.skins.blizzard_frames then\n\t\t\t\tDF_Frame:StripTextures()\n\t\t\t\tDF_Frame:SetTemplate(\"Transparent\")\n\t\t\t\tT.SkinEditBox(DF_Frame.minRioEdit, nil, 15)\n\t\t\t\tT.SkinEditBox(DF_Frame.maxRioEdit, nil, 15)\n\t\t\t\tT.SkinCheckBox(DF_Frame.showRIO)\n\t\t\t\tT.SkinCheckBox(DF_Frame.showClass)\n\t\t\t\tT.SkinCheckBox(DF_Frame.removeSelfRole)\n\t\t\t\tT.SkinCheckBox(DF_Frame.showPreviousRIO)\n\t\t\t\tDF_Frame.applyBtn:SkinButton()\n\t\t\tend\n\t\tend\n\tend)\nend\n\nlocal anchor = CreateFrame(\"Frame\", \"TooltipAnchor\", UIParent)\nanchor:SetSize(200, 40)\nanchor:SetPoint(unpack(C.position.tooltip))\n\n-- Hide PVP text\nPVP_ENABLED = \"\"\n\n-- Statusbar\nGameTooltipStatusBar:SetStatusBarTexture(C.media.texture)\nGameTooltipStatusBar:SetHeight(4)\nGameTooltipStatusBar:ClearAllPoints()\nGameTooltipStatusBar:SetPoint(\"TOPLEFT\", GameTooltip, \"BOTTOMLEFT\", 2, 6)\nGameTooltipStatusBar:SetPoint(\"TOPRIGHT\", GameTooltip, \"BOTTOMRIGHT\", -2, 6)\n\n-- Raid icon\nlocal ricon = GameTooltip:CreateTexture(\"GameTooltipRaidIcon\", \"OVERLAY\")\nricon:SetHeight(18)\nricon:SetWidth(18)\nricon:SetPoint(\"BOTTOM\", GameTooltip, \"TOP\", 0, 5)\n\nGameTooltip:HookScript(\"OnHide\", function() ricon:SetTexture(nil) end)\n\n-- Add \"Targeted By\" line\nlocal targetedList = {}\nlocal ClassColors = {}\nlocal token\nfor class, color in next, RAID_CLASS_COLORS do\n\tClassColors[class] = (\"|cff%.2x%.2x%.2x\"):format(color.r * 255, color.g * 255, color.b * 255)\nend\n\nlocal function AddTargetedBy()\n\tlocal numParty, numRaid = GetNumSubgroupMembers(), GetNumGroupMembers()\n\tif numParty > 0 or numRaid > 0 then\n\t\tfor i = 1, (numRaid > 0 and numRaid or numParty) do\n\t\t\tlocal unit = (numRaid > 0 and \"raid\"..i or \"party\"..i)\n\t\t\tif UnitIsUnit(unit..\"target\", token) and not UnitIsUnit(unit, \"player\") then\n\t\t\t\tlocal _, class = UnitClass(unit)\n\t\t\t\ttargetedList[#targetedList + 1] = ClassColors[class]\n\t\t\t\ttargetedList[#targetedList + 1] = UnitName(unit)\n\t\t\t\ttargetedList[#targetedList + 1] = \"|r, \"\n\t\t\tend\n\t\tend\n\t\tif #targetedList > 0 then\n\t\t\ttargetedList[#targetedList] = nil\n\t\t\tGameTooltip:AddLine(\" \", nil, nil, nil, 1)\n\t\t\tlocal line = _G[\"GameTooltipTextLeft\"..GameTooltip:NumLines()]\n\t\t\tif not line then return end\n\t\t\tline:SetFormattedText(L_TOOLTIP_WHO_TARGET..\" (|cffffffff%d|r): %s\", (#targetedList + 1) / 3, table.concat(targetedList))\n\t\t\twipe(targetedList)\n\t\tend\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tUnit tooltip styling\n----------------------------------------------------------------------------------------\nlocal function GetColor(unit)\n\tif not unit then return end\n\tlocal r, g, b\n\n\tif UnitIsPlayer(unit) then\n\t\tlocal _, class = UnitClass(unit)\n\t\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]\n\t\tif color then\n\t\t\tr, g, b = color.r, color.g, color.b\n\t\telse\n\t\t\tr, g, b = 1, 1, 1\n\t\tend\n\telseif UnitIsTapDenied(unit) or UnitIsDead(unit) then\n\t\tr, g, b = 0.6, 0.6, 0.6\n\telse\n\t\tlocal reaction = T.oUF_colors.reaction[UnitReaction(unit, \"player\")]\n\t\tif reaction then\n\t\t\tr, g, b = reaction[1], reaction[2], reaction[3]\n\t\telse\n\t\t\tr, g, b = 1, 1, 1\n\t\tend\n\tend\n\n\treturn r, g, b\nend\n\nlocal function GameTooltipDefault(tooltip, parent)\n\tif C.tooltip.cursor == true then\n\t\ttooltip:SetOwner(parent, \"ANCHOR_CURSOR_RIGHT\", 20, 20)\n\telse\n\t\ttooltip:SetOwner(parent, \"ANCHOR_NONE\")\n\t\ttooltip:ClearAllPoints()\n\t\ttooltip:SetPoint(\"BOTTOMRIGHT\", TooltipAnchor, \"BOTTOMRIGHT\", 0, 0)\n\t\ttooltip.default = 1\n\tend\n\tif not C.tooltip.shift_modifer then\n\t\tif InCombatLockdown() and C.tooltip.hide_combat and not IsShiftKeyDown() then\n\t\t\ttooltip:Hide()\n\t\tend\n\tend\nend\nhooksecurefunc(\"GameTooltip_SetDefaultAnchor\", GameTooltipDefault)\n\nif C.tooltip.shift_modifer == true then\n\tGameTooltip:SetScript(\"OnShow\", function(self)\n\t\tif IsShiftKeyDown() then\n\t\t\tself:Show()\n\t\telse\n\t\t\tif not HoverBind.enabled then\n\t\t\t\tself:Hide()\n\t\t\tend\n\t\tend\n\tend)\nend\n\nif C.tooltip.health_value == true then\n\tGameTooltipStatusBar:SetScript(\"OnValueChanged\", function(self, value)\n\t\tif not value then return end\n\t\tlocal min, max = self:GetMinMaxValues()\n\t\tif (value < min) or (value > max) then return end\n\t\tself:SetStatusBarColor(0, 1, 0)\n\t\tlocal _, unit = GameTooltip:GetUnit()\n\t\tif unit then\n\t\t\tmin, max = UnitHealth(unit), UnitHealthMax(unit)\n\t\t\tif not self.text then\n\t\t\t\tself.text = self:CreateFontString(nil, \"OVERLAY\", \"Tooltip_Med\")\n\t\t\t\tself.text:SetPoint(\"CENTER\", GameTooltipStatusBar, 0, 1.5)\n\t\t\tend\n\t\t\tself.text:Show()\n\t\t\tlocal hp = T.ShortValue(min)..\" / \"..T.ShortValue(max)\n\t\t\tself.text:SetText(hp)\n\t\tend\n\tend)\nend\n\nlocal OnTooltipSetUnit = function(self)\n\tif self ~= GameTooltip or self:IsForbidden() then return end\n\tlocal lines = self:NumLines()\n\tlocal unit = (select(2, self:GetUnit())) or (GetMouseFocus() and GetMouseFocus().GetAttribute and GetMouseFocus():GetAttribute(\"unit\")) or (UnitExists(\"mouseover\") and \"mouseover\") or nil\n\n\tif not unit then return end\n\n\tlocal name, realm = UnitName(unit)\n\tlocal race, englishRace = UnitRace(unit)\n\tlocal level = UnitLevel(unit)\n\tlocal levelColor = GetCreatureDifficultyColor(level)\n\tlocal classification = UnitClassification(unit)\n\tlocal creatureType = UnitCreatureType(unit)\n\tlocal _, faction = UnitFactionGroup(unit)\n\tlocal _, playerFaction = UnitFactionGroup(\"player\")\n\tlocal titleName = UnitPVPName(unit)\n\tlocal isPlayer = UnitIsPlayer(unit)\n\n\tif level and level == -1 then\n\t\tif classification == \"worldboss\" then\n\t\t\tlevel = \"|cffff0000|r\"..ENCOUNTER_JOURNAL_ENCOUNTER\n\t\telse\n\t\t\tlevel = \"|cffff0000??|r\"\n\t\tend\n\tend\n\n\tif classification == \"rareelite\" then classification = \" R+\"\n\telseif classification == \"rare\" then classification = \" R\"\n\telseif classification == \"elite\" then classification = \"+\"\n\telse classification = \"\" end\n\n\n\tif titleName and C.tooltip.title then\n\t\tname = titleName\n\tend\n\n\tlocal r, g, b = GetColor(unit)\n\t_G[\"GameTooltipTextLeft1\"]:SetFormattedText(\"|cff%02x%02x%02x%s|r\", r * 255, g * 255, b * 255, name or \"\")\n\n\tif realm and realm ~= \"\" and C.tooltip.realm then\n\t\tself:AddLine(FRIENDS_LIST_REALM..\"|cffffffff\"..realm..\"|r\")\n\tend\n\n\tif isPlayer then\n\t\tif UnitIsAFK(unit) then\n\t\t\tself:AppendText((\" %s\"):format(\"|cffE7E716\"..L_CHAT_AFK..\"|r\"))\n\t\telseif UnitIsDND(unit) then\n\t\t\tself:AppendText((\" %s\"):format(\"|cffFF0000\"..L_CHAT_DND..\"|r\"))\n\t\tend\n\n\t\tif isPlayer and (englishRace == \"Pandaren\" or englishRace == \"Dracthyr\") and faction ~= nil and faction ~= playerFaction then\n\t\t\tlocal hex = \"cffff3333\"\n\t\t\tif faction == \"Alliance\" then\n\t\t\t\thex = \"cff69ccf0\"\n\t\t\tend\n\t\t\tself:AppendText((\" [|%s%s|r]\"):format(hex, faction:sub(1, 2)))\n\t\tend\n\n\t\tlocal guildName, guildRank = GetGuildInfo(unit)\n\t\tif guildName then\n\t\t\t_G[\"GameTooltipTextLeft2\"]:SetFormattedText(\"%s\", guildName)\n\t\t\tif UnitIsInMyGuild(unit) then\n\t\t\t\t_G[\"GameTooltipTextLeft2\"]:SetTextColor(1, 1, 0)\n\t\t\telse\n\t\t\t\t_G[\"GameTooltipTextLeft2\"]:SetTextColor(0, 1, 1)\n\t\t\tend\n\t\t\tif C.tooltip.rank then\n\t\t\t\tself:AddLine(RANK..\": |cffffffff\"..guildRank..\"|r\")\n\t\t\tend\n\t\tend\n\n\t\tlocal n = guildName and 3 or 2\n\t\t-- thx TipTac for the fix above with color blind enabled\n\t\tif GetCVar(\"colorblindMode\") == \"1\" then\n\t\t\tn = n + 1\n\t\t\tlocal class = UnitClass(unit)\n\t\t\t_G[\"GameTooltipTextLeft\"..n]:SetFormattedText(\"|cff%02x%02x%02x%s|r %s %s\", levelColor.r * 255, levelColor.g * 255, levelColor.b * 255, level, race or UNKNOWN, class or \"\")\n\t\telse\n\t\t\t_G[\"GameTooltipTextLeft\"..n]:SetFormattedText(\"|cff%02x%02x%02x%s|r %s\", levelColor.r * 255, levelColor.g * 255, levelColor.b * 255, level, race or UNKNOWN)\n\t\tend\n\n\t\tfor i = n + 1, lines do\n\t\t\tlocal line = _G[\"GameTooltipTextLeft\"..i]\n\t\t\tif not line or not line:GetText() then return end\n\t\t\tif line and line:GetText() and (line:GetText() == FACTION_HORDE or line:GetText() == FACTION_ALLIANCE) then\n\t\t\t\tline:SetText()\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\telse\n\t\tfor i = 2, lines do\n\t\t\tlocal line = _G[\"GameTooltipTextLeft\"..i]\n\t\t\tif not line or not line:GetText() or UnitIsBattlePetCompanion(unit) then return end\n\t\t\tif (level and line:GetText():find(\"^\"..LEVEL)) or (creatureType and line:GetText():find(\"^\"..creatureType)) then\n\t\t\t\tline:SetFormattedText(\"|cff%02x%02x%02x%s%s|r %s\", levelColor.r * 255, levelColor.g * 255, levelColor.b * 255, level, classification, creatureType or \"\")\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\n\n\tif C.tooltip.target == true and UnitExists(unit..\"target\") then\n\t\tlocal r, g, b = GetColor(unit..\"target\")\n\t\tlocal text = \"\"\n\n\t\tif UnitIsEnemy(\"player\", unit..\"target\") then\n\t\t\tr, g, b = unpack(T.oUF_colors.reaction[1])\n\t\telseif not UnitIsFriend(\"player\", unit..\"target\") then\n\t\t\tr, g, b = unpack(T.oUF_colors.reaction[4])\n\t\tend\n\n\t\tif UnitName(unit..\"target\") == UnitName(\"player\") then\n\t\t\ttext = \"|cfffed100\"..STATUS_TEXT_TARGET..\":|r \"..\"|cffff0000> \"..UNIT_YOU..\" <|r\"\n\t\telse\n\t\t\ttext = \"|cfffed100\"..STATUS_TEXT_TARGET..\":|r \"..UnitName(unit..\"target\")\n\t\tend\n\n\t\tself:AddLine(text, r, g, b)\n\tend\n\n\tif C.tooltip.raid_icon == true then\n\t\tlocal raidIndex = GetRaidTargetIndex(unit)\n\t\tif raidIndex then\n\t\t\tricon:SetTexture(\"Interface\\\\TargetingFrame\\\\UI-RaidTargetingIcon_\"..raidIndex)\n\t\telse\n\t\t\tricon:SetTexture(nil)\n\t\tend\n\tend\n\n\tif C.tooltip.who_targetting == true then\n\t\ttoken = unit AddTargetedBy()\n\tend\nend\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, OnTooltipSetUnit)\n\n----------------------------------------------------------------------------------------\n--\tHide tooltips in combat for action bars, pet bar and stance bar\n----------------------------------------------------------------------------------------\nif C.tooltip.hidebuttons == true then\n\tlocal CombatHideActionButtonsTooltip = function(self)\n\t\tif not IsShiftKeyDown() then\n\t\t\tself:Hide()\n\t\tend\n\tend\n\n\thooksecurefunc(GameTooltip, \"SetAction\", CombatHideActionButtonsTooltip)\n\thooksecurefunc(GameTooltip, \"SetPetAction\", CombatHideActionButtonsTooltip)\n\thooksecurefunc(GameTooltip, \"SetShapeshift\", CombatHideActionButtonsTooltip)\nend\n\n----------------------------------------------------------------------------------------\n--\tFix compare tooltips(by Blizzard)(../FrameXML/GameTooltip.lua)\n----------------------------------------------------------------------------------------\nhooksecurefunc(TooltipComparisonManager, \"AnchorShoppingTooltips\", function(self, primaryShown, secondaryItemShown)\n\tlocal tooltip = self.tooltip;\n\tlocal shoppingTooltip1 = tooltip.shoppingTooltips[1];\n\tlocal shoppingTooltip2 = tooltip.shoppingTooltips[2];\n\tlocal point = shoppingTooltip1:GetPoint(2)\n\tif secondaryItemShown then\n\t\tif point == \"TOP\" then\n\t\t\tshoppingTooltip1:ClearAllPoints()\n\t\t\tshoppingTooltip2:ClearAllPoints()\n\t\t\tshoppingTooltip1:SetPoint(\"TOPLEFT\", self.anchorFrame, \"TOPRIGHT\", 3, -10)\n\t\t\tshoppingTooltip2:SetPoint(\"TOPLEFT\", shoppingTooltip1, \"TOPRIGHT\", 3, 0)\n\t\telseif point == \"RIGHT\" then\n\t\t\tshoppingTooltip1:ClearAllPoints()\n\t\t\tshoppingTooltip2:ClearAllPoints()\n\t\t\tshoppingTooltip1:SetPoint(\"TOPRIGHT\", self.anchorFrame, \"TOPLEFT\", -3, -10)\n\t\t\tshoppingTooltip2:SetPoint(\"TOPRIGHT\", shoppingTooltip1, \"TOPLEFT\", -3, 0)\n\t\tend\n\telse\n\t\tif point == \"LEFT\" then\n\t\t\tshoppingTooltip1:ClearAllPoints()\n\t\t\tshoppingTooltip1:SetPoint(\"TOPLEFT\", self.anchorFrame, \"TOPRIGHT\", 3, -10)\n\t\telseif point == \"RIGHT\" then\n\t\t\tshoppingTooltip1:ClearAllPoints()\n\t\t\tshoppingTooltip1:SetPoint(\"TOPRIGHT\", self.anchorFrame, \"TOPLEFT\", -3, -10)\n\t\tend\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tFix GameTooltipMoneyFrame font size\n----------------------------------------------------------------------------------------\nhooksecurefunc(\"SetTooltipMoney\", function()\n\tfor i = 1, 2 do\n\t\tif _G[\"GameTooltipMoneyFrame\"..i] then\n\t\t\t_G[\"GameTooltipMoneyFrame\"..i..\"PrefixText\"]:SetFontObject(\"GameTooltipText\")\n\t\t\t_G[\"GameTooltipMoneyFrame\"..i..\"SuffixText\"]:SetFontObject(\"GameTooltipText\")\n\t\t\t_G[\"GameTooltipMoneyFrame\"..i..\"GoldButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\t\t_G[\"GameTooltipMoneyFrame\"..i..\"SilverButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\t\t_G[\"GameTooltipMoneyFrame\"..i..\"CopperButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\tend\n\tend\n\tfor i = 1, 2 do\n\t\tif _G[\"ShoppingTooltip1MoneyFrame\"..i] then\n\t\t\t_G[\"ShoppingTooltip1MoneyFrame\"..i..\"PrefixText\"]:SetFontObject(\"GameTooltipText\")\n\t\t\t_G[\"ShoppingTooltip1MoneyFrame\"..i..\"SuffixText\"]:SetFontObject(\"GameTooltipText\")\n\t\t\t_G[\"ShoppingTooltip1MoneyFrame\"..i..\"GoldButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\t\t_G[\"ShoppingTooltip1MoneyFrame\"..i..\"SilverButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\t\t_G[\"ShoppingTooltip1MoneyFrame\"..i..\"CopperButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\tend\n\tend\n\n\t-- Custom tooltip from MultiItemRef.lua\n\tif _G[\"ItemRefTooltipMoneyFrame1\"] then\n\t\t_G[\"ItemRefTooltipMoneyFrame1PrefixText\"]:SetFontObject(\"GameTooltipText\")\n\t\t_G[\"ItemRefTooltipMoneyFrame1SuffixText\"]:SetFontObject(\"GameTooltipText\")\n\t\t_G[\"ItemRefTooltipMoneyFrame1GoldButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\t_G[\"ItemRefTooltipMoneyFrame1SilverButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\t_G[\"ItemRefTooltipMoneyFrame1CopperButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\tend\n\n\tfor i = 2, 4 do\n\t\tif _G[\"ItemRefTooltip\"..i..\"MoneyFrame1\"] then\n\t\t\t_G[\"ItemRefTooltip\"..i..\"MoneyFrame1PrefixText\"]:SetFontObject(\"GameTooltipText\")\n\t\t\t_G[\"ItemRefTooltip\"..i..\"MoneyFrame1SuffixText\"]:SetFontObject(\"GameTooltipText\")\n\t\t\t_G[\"ItemRefTooltip\"..i..\"MoneyFrame1GoldButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\t\t_G[\"ItemRefTooltip\"..i..\"MoneyFrame1SilverButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\t\t_G[\"ItemRefTooltip\"..i..\"MoneyFrame1CopperButton\"]:SetNormalFontObject(\"GameTooltipText\")\n\t\tend\n\tend\nend)\n\n----------------------------------------------------------------------------------------\n--\tSkin GameTooltip.ItemTooltip and EmbeddedItemTooltip\n----------------------------------------------------------------------------------------\nGameTooltip.ItemTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\nhooksecurefunc(GameTooltip.ItemTooltip.IconBorder, \"SetVertexColor\", function(self, r, g, b)\n\tif r ~= BAG_ITEM_QUALITY_COLORS[1].r ~= r and g ~= BAG_ITEM_QUALITY_COLORS[1].g then\n\t\tself:GetParent().backdrop:SetBackdropBorderColor(r, g, b)\n\tend\n\tself:SetTexture(\"\")\nend)\n\nhooksecurefunc(GameTooltip.ItemTooltip.IconBorder, \"Hide\", function(self)\n\tself:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\nend)\n\nGameTooltip.ItemTooltip:CreateBackdrop(\"Default\")\nGameTooltip.ItemTooltip.backdrop:SetPoint(\"TOPLEFT\", GameTooltip.ItemTooltip.Icon, \"TOPLEFT\", -2, 2)\nGameTooltip.ItemTooltip.backdrop:SetPoint(\"BOTTOMRIGHT\", GameTooltip.ItemTooltip.Icon, \"BOTTOMRIGHT\", 2, -2)\nGameTooltip.ItemTooltip.Count:ClearAllPoints()\nGameTooltip.ItemTooltip.Count:SetPoint(\"BOTTOMRIGHT\", GameTooltip.ItemTooltip.Icon, \"BOTTOMRIGHT\", 1, 0)\n\nBONUS_OBJECTIVE_REWARD_FORMAT = \"|T%1$s:16:16:0:0:64:64:5:59:5:59|t %2$s\"\nBONUS_OBJECTIVE_REWARD_WITH_COUNT_FORMAT = \"|T%1$s:16:16:0:0:64:64:5:59:5:59|t |cffffffff%2$d|r %3$s\"\n\nlocal reward = EmbeddedItemTooltip.ItemTooltip\nlocal icon = reward.Icon\nif icon then\n\ticon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\treward:CreateBackdrop(\"Default\")\n\treward.backdrop:SetPoint(\"TOPLEFT\", icon, \"TOPLEFT\", -2, 2)\n\treward.backdrop:SetPoint(\"BOTTOMRIGHT\", icon, \"BOTTOMRIGHT\", 2, -2)\n\n\thooksecurefunc(reward.IconBorder, \"SetVertexColor\", function(self, r, g, b)\n\t\tif r ~= BAG_ITEM_QUALITY_COLORS[1].r ~= r and g ~= BAG_ITEM_QUALITY_COLORS[1].g then\n\t\t\tself:GetParent().backdrop:SetBackdropBorderColor(r, g, b)\n\t\tend\n\t\tself:SetTexture(\"\")\n\tend)\n\n\thooksecurefunc(reward.IconBorder, \"Hide\", function(self)\n\t\tself:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\tend)\nend\n\nhooksecurefunc(\"GameTooltip_ShowProgressBar\", function(tt)\n\tif not tt or tt:IsForbidden() or not tt.progressBarPool then return end\n\n\tlocal frame = tt.progressBarPool:GetNextActive()\n\tif (not frame or not frame.Bar) or frame.Bar.backdrop then return end\n\n\tlocal bar = frame.Bar\n\tlocal label = bar.Label\n\tif bar then\n\t\tbar:StripTextures()\n\t\tbar:CreateBackdrop(\"Transparent\")\n\t\tbar.backdrop:SetBackdropColor(0.1, 0.1, 0.1, 1)\n\t\tbar:SetStatusBarTexture(C.media.texture)\n\t\tlabel:ClearAllPoints()\n\t\tlabel:SetPoint(\"CENTER\", bar, 0, 0)\n\t\tlabel:SetDrawLayer(\"OVERLAY\")\n\t\tlabel:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tend\nend)\n\nhooksecurefunc(\"GameTooltip_ShowStatusBar\", function(tt)\n\tif not tt or tt:IsForbidden() or not tt.statusBarPool then return end\n\n\tlocal frame = tt.statusBarPool:GetNextActive()\n\n\tif frame and not frame.backdrop then\n\t\tframe:StripTextures()\n\t\tframe:CreateBackdrop(\"Transparent\")\n\t\tframe.backdrop:SetBackdropColor(0.1, 0.1, 0.1, 1)\n\t\tframe:SetStatusBarTexture(C.media.texture)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Tooltip/UnitRole.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.tooltip.enable ~= true or C.tooltip.unit_role ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tDisplays a players LFD/LFR role(gTooltipRoles by g0st)\n----------------------------------------------------------------------------------------\nlocal function GetLFDRole(unit)\n\tlocal role = UnitGroupRolesAssigned(unit)\n\n\tif role == \"NONE\" then\n\t\treturn \"|cFFB5B5B5\"..NO_ROLE..\"|r\"\n\telseif role == \"TANK\" then\n\t\treturn \"|cFF0070DE\"..TANK..\"|r\"\n\telseif role == \"HEALER\" then\n\t\treturn \"|cFF00CC12\"..HEALER..\"|r\"\n\telse\n\t\treturn \"|cFFFF3030\"..DAMAGER..\"|r\"\n\tend\nend\n\nlocal function OnTooltipSetUnit(self)\n\tif self ~= GameTooltip or self:IsForbidden() then return end\n\tlocal _, instanceType = IsInInstance()\n\tif instanceType == \"scenario\" then return end\n\tlocal _, unit = GameTooltip:GetUnit()\n\tif unit and UnitIsPlayer(unit) and ((UnitInParty(unit) or UnitInRaid(unit)) and GetNumGroupMembers() > 0) then\n\t\tlocal leaderText = UnitIsGroupLeader(unit) and \"|cfFFFFFFF - \"..LEADER..\"|r\" or \"\"\n\t\tGameTooltip:AddLine(ROLE..\": \"..GetLFDRole(unit)..leaderText)\n\tend\nend\n\nTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, OnTooltipSetUnit)"
  },
  {
    "path": "ShestakUI/Modules/Trade/AlreadyKnown.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.trade.already_known ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tColorizes recipes/mounts/pets/toys that is already known(AlreadyKnown by Villiv)\n----------------------------------------------------------------------------------------\nlocal color = {r = 0.1, g = 1, b = 0.1}\nlocal knowns, lines = {}, {}\nlocal recipe = Enum.ItemClass.Recipe\nlocal pet = Enum.ItemMiscellaneousSubclass.CompanionPet\nlocal mount = Enum.ItemMiscellaneousSubclass.Mount\nlocal knowables = {[recipe] = true, [pet] = true, [mount] = true}\n\nlocal pattern = ITEM_PET_KNOWN:gsub(\"%(\", \"%%(\")\npattern = pattern:gsub(\"%)\", \"%%)\")\n\nlocal tooltip = CreateFrame(\"GameTooltip\", \"AKScanningTooltip\", nil, \"GameTooltipTemplate\")\ntooltip:SetOwner(WorldFrame, \"ANCHOR_NONE\")\n\nlocal function Scan(line, numLines)\n\tif line > numLines then return end\n\n\tlocal text = _G[\"AKScanningTooltipTextLeft\"..line]:GetText()\n\tif not text or text == \"\" or text ~= ITEM_SPELL_KNOWN and not text:match(pattern) then return Scan(line + 1, numLines) end\n\n\treturn true\nend\n\nlocal function IsKnown(itemLink)\n\tif not itemLink then return end\n\n\tlocal speciesID = itemLink:match(\"battlepet:(%d+):\")\n\tif speciesID then return C_PetJournal.GetNumCollectedInfo(speciesID) > 0 and true end\n\n\tlocal itemID = itemLink:match(\"item:(%d+):\")\n\tif not itemID then return end\n\tif knowns[itemID] then return true end\n\n\tif PlayerHasToy(itemID) then\n\t\tknowns[itemID] = true\n\t\treturn true\n\tend\n\n\tif C_Heirloom.PlayerHasHeirloom(itemID) then\n\t\tknowns[itemID] = true\n\t\treturn true\n\tend\n\n\tlocal _, _, _, _, _, _, _, _, _, _, _, class, subClass = GetItemInfo(itemID)\n\tif not (knowables[class] or knowables[subClass]) then return end\n\n\ttooltip:ClearLines()\n\ttooltip:SetHyperlink(itemLink)\n\tif not Scan(2, tooltip:NumLines()) then return end\n\n\tif subClass ~= pet then knowns[itemID] = true end\n\treturn true\nend\n\n-- Mail frame\nlocal function OpenMailFrame_UpdateButtonPositions()\n\tfor i = 1, ATTACHMENTS_MAX_RECEIVE do\n\t\tlocal button = _G[\"OpenMailAttachmentButton\"..i]\n\t\tif button then\n\t\t\tlocal name, _, _, _, canUse = GetInboxItem(InboxFrame.openMailID, i)\n\t\t\tif name and canUse and IsKnown(GetInboxItemLink(InboxFrame.openMailID, i)) then\n\t\t\t\tSetItemButtonTextureVertexColor(button, color.r, color.g, color.b)\n\t\t\tend\n\t\tend\n\tend\nend\nhooksecurefunc(\"OpenMailFrame_UpdateButtonPositions\", OpenMailFrame_UpdateButtonPositions)\n\n-- Loot frame\nlocal function LootFrame_UpdateButton(self)\n\tlocal slotIndex = self:GetSlotIndex()\n\tlocal texture, _, _, _, _, locked = GetLootSlotInfo(slotIndex)\n\tif texture and not locked and IsKnown(GetLootSlotLink(slotIndex)) then\n\t\tSetItemButtonTextureVertexColor(self.Item, color.r, color.g, color.b)\n\tend\nend\nhooksecurefunc(LootFrameElementMixin, \"Init\", LootFrame_UpdateButton)\n\n-- Merchant frame\nlocal function MerchantFrame_UpdateMerchantInfo()\n\tlocal numItems = GetMerchantNumItems()\n\n\tfor i = 1, MERCHANT_ITEMS_PER_PAGE do\n\t\tlocal index = (MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE + i\n\t\tif index > numItems then return end\n\n\t\tlocal button = _G[\"MerchantItem\"..i..\"ItemButton\"]\n\t\tif button and button:IsShown() then\n\t\t\tlocal _, _, _, _, _, isUsable = GetMerchantItemInfo(index)\n\t\t\tif isUsable and IsKnown(GetMerchantItemLink(index)) then\n\t\t\t\tSetItemButtonTextureVertexColor(button, color.r, color.g, color.b)\n\t\t\tend\n\t\tend\n\tend\nend\nhooksecurefunc(\"MerchantFrame_UpdateMerchantInfo\", MerchantFrame_UpdateMerchantInfo)\n\nlocal function MerchantFrame_UpdateBuybackInfo()\n\tlocal numItems = GetNumBuybackItems()\n\n\tfor i = 1, BUYBACK_ITEMS_PER_PAGE do\n\t\tif i > numItems then return end\n\n\t\tlocal button = _G[\"MerchantItem\"..i..\"ItemButton\"]\n\t\tif button and button:IsShown() then\n\t\t\tlocal _, _, _, _, _, isUsable = GetBuybackItemInfo(i)\n\t\t\tif isUsable and IsKnown(GetBuybackItemLink(i)) then\n\t\t\t\tSetItemButtonTextureVertexColor(button, color.r, color.g, color.b)\n\t\t\tend\n\t\tend\n\tend\nend\nhooksecurefunc(\"MerchantFrame_UpdateBuybackInfo\", MerchantFrame_UpdateBuybackInfo)\n\n-- Quest frame\nlocal function QuestInfo_ShowRewards()\n\tlocal numQuestRewards, numQuestChoices\n\tif QuestInfoFrame.questLog then\n\t\tnumQuestRewards, numQuestChoices = GetNumQuestLogRewards(), GetNumQuestLogChoices(C_QuestLog.GetSelectedQuest(), true)\n\telse\n\t\tnumQuestRewards, numQuestChoices = GetNumQuestRewards(), GetNumQuestChoices()\n\tend\n\n\tlocal totalRewards = numQuestRewards + numQuestChoices\n\tif totalRewards == 0 then return end\n\n\tlocal rewardsCount = 0\n\n\tif numQuestChoices > 0 then\n\t\tlocal baseIndex = rewardsCount\n\t\tfor i = 1, numQuestChoices do\n\t\t\tlocal button = _G[\"QuestInfoItem\"..i + baseIndex]\n\t\t\tif button and button:IsShown() then\n\t\t\t\tlocal isUsable\n\t\t\t\tif QuestInfoFrame.questLog then\n\t\t\t\t\t_, _, _, _, isUsable = GetQuestLogChoiceInfo(i)\n\t\t\t\telse\n\t\t\t\t\t_, _, _, _, isUsable = GetQuestItemInfo(\"choice\", i)\n\t\t\t\tend\n\t\t\t\tif isUsable and IsKnown(QuestInfoFrame.questLog and GetQuestLogItemLink(\"choice\", i) or GetQuestItemLink(\"choice\", i)) then\n\t\t\t\t\tSetItemButtonTextureVertexColor(button, color.r, color.g, color.b)\n\t\t\t\tend\n\t\t\tend\n\t\t\trewardsCount = rewardsCount + 1\n\t\tend\n\tend\n\n\tif numQuestRewards > 0 then\n\t\tlocal baseIndex = rewardsCount\n\t\tfor i = 1, numQuestRewards do\n\t\t\tlocal button = _G[\"QuestInfoItem\"..i + baseIndex]\n\t\t\tif button and button:IsShown() then\n\t\t\t\tlocal isUsable\n\t\t\t\tif QuestInfoFrame.questLog then\n\t\t\t\t\t_, _, _, _, isUsable = GetQuestLogRewardInfo(i)\n\t\t\t\telse\n\t\t\t\t\t_, _, _, _, isUsable = GetQuestItemInfo(\"reward\", i)\n\t\t\t\tend\n\t\t\t\tif isUsable and IsKnown(QuestInfoFrame.questLog and GetQuestLogItemLink(\"reward\", i) or GetQuestItemLink(\"reward\", i)) then\n\t\t\t\t\tSetItemButtonTextureVertexColor(button, color.r, color.g, color.b)\n\t\t\t\tend\n\t\t\t\trewardsCount = rewardsCount + 1\n\t\t\tend\n\t\tend\n\tend\nend\n\nif IsAddOnLoaded(\"Pawn\") then\n\thooksecurefunc(\"PawnUI_OnQuestInfo_ShowRewards\", QuestInfo_ShowRewards)\nelse\n\thooksecurefunc(\"QuestInfo_ShowRewards\", QuestInfo_ShowRewards)\nend\n\n-- Guild rewards frame\nlocal function GuildRewards_Update()\n\tlocal offset = HybridScrollFrame_GetOffset(GuildRewardsContainer)\n\tlocal buttons = GuildRewardsContainer.buttons\n\tlocal _, _, standingID = GetGuildFactionInfo()\n\n\tfor i = 1, #buttons do\n\t\tlocal button = buttons[i]\n\t\tif button and button:IsShown() then\n\t\t\tlocal achievementID, itemID, itemName, _, repLevel = GetGuildRewardInfo(offset + i)\n\t\t\tif itemName and not (achievementID and achievementID > 0) and repLevel <= standingID then\n\t\t\t\tlocal _, itemLink = GetItemInfo(itemID)\n\t\t\t\tif IsKnown(itemLink) then\n\t\t\t\t\tbutton.icon:SetVertexColor(color.r, color.g, color.b)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal isBlizzard_GuildUILoaded\nif IsAddOnLoaded(\"Blizzard_GuildUI\") then\n\tisBlizzard_GuildUILoaded = true\n\thooksecurefunc(\"GuildRewards_Update\", GuildRewards_Update)\n\thooksecurefunc(GuildRewardsContainer, \"update\", GuildRewards_Update)\nend\n\n-- GuildBank frame\nlocal function GuildBankFrame_Update()\n\tif GuildBankFrame.mode ~= \"bank\" then return end\n\n\tlocal tab = GetCurrentGuildBankTab()\n\n\tfor i = 1, 98 do\n\t\tlocal index = math.fmod(i, 14)\n\t\tif index == 0 then index = 14 end\n\t\tlocal column = math.ceil((i - 0.5) / 14)\n\t\tlocal button = GuildBankFrame.Columns[column].Buttons[index]\n\n\t\tif button and button:IsShown() then\n\t\t\tlocal texture, _, locked = GetGuildBankItemInfo(tab, i)\n\t\t\tif texture and not locked then\n\t\t\t\tif IsKnown(GetGuildBankItemLink(tab, i)) then\n\t\t\t\t\tSetItemButtonTextureVertexColor(button, color.r, color.g, color.b)\n\t\t\t\telse\n\t\t\t\t\tSetItemButtonTextureVertexColor(button, 1, 1, 1)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal isBlizzard_GuildBankUILoaded\nif IsAddOnLoaded(\"Blizzard_GuildBankUI\") then\n\tisBlizzard_GuildBankUILoaded = true\n\thooksecurefunc(GuildBankFrame, \"Update\", GuildBankFrame_Update)\nend\n\n-- Auction frame\nlocal function AuctionHouseFrame_RefreshScrollFrame(self)\n\t-- Derived from https://www.townlong-yak.com/framexml/10.0.0/Blizzard_AuctionHouseUI/Blizzard_AuctionHouseItemList.lua#322\n\tself.ScrollBox:ForEachFrame(function(button)\n\t\tif button.rowData.itemKey.itemID then\n\t\t\tlocal itemLink\n\t\t\tif button.rowData.itemKey.itemID == 82800 then -- BattlePet\n\t\t\t\titemLink = format(\"|Hbattlepet:%d::::::|h[Dummy]|h\", button.rowData.itemKey.battlePetSpeciesID)\n\t\t\telse -- Normal item\n\t\t\t\titemLink = format(\"item:%d:\", button.rowData.itemKey.itemID)\n\t\t\tend\n\n\t\t\tif itemLink and IsKnown(itemLink) then\n\t\t\t\t-- Highlight\n\t\t\t\tbutton.SelectedHighlight:Show()\n\t\t\t\tbutton.SelectedHighlight:SetVertexColor(color.r, color.g, color.b)\n\t\t\t\tbutton.SelectedHighlight:SetAlpha(.2)\n\t\t\t\t-- Icon\n\t\t\t\tbutton.cells[2].Icon:SetVertexColor(color.r, color.g, color.b)\n\t\t\t\tbutton.cells[2].IconBorder:SetVertexColor(color.r, color.g, color.b)\n\t\t\telse\n\t\t\t\t-- Highlight\n\t\t\t\tbutton.SelectedHighlight:SetVertexColor(1, 1, 1)\n\t\t\t\t-- Icon\n\t\t\t\tbutton.cells[2].Icon:SetVertexColor(1, 1, 1)\n\t\t\t\tbutton.cells[2].IconBorder:SetVertexColor(1, 1, 1)\n\t\t\tend\n\t\tend\n\tend)\nend\n\n-- Black market frame\nlocal function BlackMarketFrame_UpdateHotItem(self)\n\tlocal texture = self.HotDeal.Item.IconTexture\n\tif not (texture and texture:IsShown()) then return end\n\n\tlocal name, _, _, _, usable, _, _, _, _, _, _, _, _, _, link = C_BlackMarket.GetHotItem()\n\tif name and usable and IsKnown(link) then\n\t\ttexture:SetVertexColor(color.r, color.g, color.b)\n\tend\nend\n\nlocal function BlackMarketScrollFrame_Update(self, elementData)\n\tlocal name, _, _, _, usable, _, _, _, _, _, _, _, _, _, link = C_BlackMarket.GetItemInfoByIndex(elementData.index)\n\tif name and usable and IsKnown(link) then\n\t\tself.Item.IconTexture:SetVertexColor(color.r, color.g, color.b)\n\tend\nend\n\nlocal isBlizzard_BlackMarketUILoaded\nif IsAddOnLoaded(\"Blizzard_BlackMarketUI\") then\n\tisBlizzard_BlackMarketUILoaded = true\n\thooksecurefunc(\"BlackMarketFrame_UpdateHotItem\", BlackMarketFrame_UpdateHotItem)\n\thooksecurefunc(BlackMarketItemMixin, \"Init\", BlackMarketScrollFrame_Update)\nend\n\n-- LoD addons\nif not (isBlizzard_GuildUILoaded and isBlizzard_GuildBankUILoaded and isBlizzard_AuctionUILoaded and isBlizzard_BlackMarketUILoaded) then\n\tlocal function OnEvent(self, event, addon)\n\t\tif addon == \"Blizzard_GuildUI\" then\n\t\t\tisBlizzard_GuildUILoaded = true\n\t\t\thooksecurefunc(\"GuildRewards_Update\", GuildRewards_Update)\n\t\t\thooksecurefunc(GuildRewardsContainer, \"update\", GuildRewards_Update)\n\t\telseif addon == \"Blizzard_GuildBankUI\" then\n\t\t\tisBlizzard_GuildBankUILoaded = true\n\t\t\thooksecurefunc(GuildBankFrame, \"Update\", GuildBankFrame_Update)\n\t\telseif addon == \"Blizzard_AuctionHouseUI\" then\n\t\t\tisBlizzard_AuctionUILoaded = true\n\t\t\thooksecurefunc(AuctionHouseFrame.BrowseResultsFrame.ItemList, \"RefreshScrollFrame\", AuctionHouseFrame_RefreshScrollFrame)\n\t\telseif addon == \"Blizzard_BlackMarketUI\" then\n\t\t\tisBlizzard_BlackMarketUILoaded = true\n\t\t\thooksecurefunc(\"BlackMarketFrame_UpdateHotItem\", BlackMarketFrame_UpdateHotItem)\n\t\t\thooksecurefunc(BlackMarketItemMixin, \"Init\", BlackMarketScrollFrame_Update)\n\t\tend\n\n\t\tif isBlizzard_GuildUILoaded and isBlizzard_GuildBankUILoaded and isBlizzard_AuctionUILoaded and isBlizzard_BlackMarketUILoaded then\n\t\t\tself:UnregisterEvent(event)\n\t\t\tself:SetScript(\"OnEvent\", nil)\n\t\t\tOnEvent = nil\n\t\tend\n\tend\n\n\ttooltip:SetScript(\"OnEvent\", OnEvent)\n\ttooltip:RegisterEvent(\"ADDON_LOADED\")\nend"
  },
  {
    "path": "ShestakUI/Modules/Trade/Archaeology.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.trade.archaeology ~= true or IsAddOnLoaded(\"stArchaeologist\") then return end\n\n----------------------------------------------------------------------------------------\n--\tArchaeology tracker(stArchaeologist by Safturento)\n----------------------------------------------------------------------------------------\nlocal stArch = {}\nstArch[\"archSkill\"] = {}\t-- Archaeology skill level\nstArch[\"progressBars\"] = {}\t-- Status bars for artifacts\nstArch[\"artifactInfo\"] = {}\t-- Information to update bars\n\nlocal numRaces = 20\nlocal Loaded = false\n\nfunction stArch:OnLoad(self)\n\tif ShestakUISettingsPerChar == nil then ShestakUISettingsPerChar = {} end\n\tif ShestakUISettingsPerChar.Archaeology == false then self:Hide() end\n\t-- Title Bar\n\tstArch[\"title\"] = CreateFrame(\"Frame\", \"ArchTitleFrame\", self)\n\tstArch[\"title\"]:SetWidth(self:GetWidth() - 10)\n\tstArch[\"title\"]:SetHeight(19)\n\tstArch[\"title\"]:SetPoint(\"TOP\", self, \"TOP\", 0, 0)\n\tstArch[\"title\"][\"text\"] = stArch[\"title\"]:CreateFontString()\n\tstArch[\"title\"][\"text\"]:SetPoint(\"CENTER\", stArch[\"title\"], \"CENTER\", 0, 0)\n\tstArch[\"title\"][\"text\"]:SetJustifyH(\"CENTER\")\n\tstArch[\"title\"][\"text\"]:SetJustifyV(\"CENTER\")\n\tstArch[\"title\"][\"text\"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tstArch[\"title\"][\"text\"]:SetText(PROFESSIONS_ARCHAEOLOGY)\n\n\t-- Close button\n\tstArch[\"close\"] = CreateFrame(\"Button\", \"ArchCloseButton\", self)\n\tT.SkinCloseButton(stArch[\"close\"], nil, nil, true)\n\tstArch[\"close\"]:SetWidth(12)\n\tstArch[\"close\"]:SetHeight(12)\n\tstArch[\"close\"]:SetScript(\"OnMouseUp\", function() self:Hide() ShestakUISettingsPerChar.Archaeology = false end)\n\n\t-- Artifact Progress Bars\n\tlocal progressBars = stArch[\"progressBars\"]\n\n\tprogressBars[\"frame\"] = CreateFrame(\"Frame\", \"ArchBarFrame\", self)\n\tprogressBars[\"frame\"]:SetHeight(200)\n\tprogressBars[\"frame\"]:SetWidth(self:GetWidth() - 8)\n\tprogressBars[\"frame\"]:SetPoint(\"TOP\", stArch[\"title\"], \"BOTTOM\", 0, 0)\n\tprogressBars[\"frame\"]:SetTemplate(\"Overlay\")\n\tfor i = 1, numRaces do\n\t\t-- Fill Table\n\t\tprogressBars[i] = {}\n\t\tprogressBars[i][\"border\"] = CreateFrame(\"Frame\", \"ArchBar\"..i..\"Border\", progressBars[\"frame\"])\n\t\tprogressBars[i][\"bar\"] = CreateFrame(\"StatusBar\", \"ArchBar\"..i, progressBars[i][\"border\"], \"TextStatusBar\")\n\t\tprogressBars[i][\"race\"] = progressBars[i][\"bar\"]:CreateFontString()\n\t\tprogressBars[i][\"progress\"] = progressBars[i][\"bar\"]:CreateFontString()\n\t\tprogressBars[i][\"solve\"] = CreateFrame(\"Button\", \"ArchBar\"..i, self)\n\n\t\t-- Border\n\t\tprogressBars[i][\"border\"]:SetWidth(progressBars[\"frame\"]:GetWidth() - 10)\n\t\tprogressBars[i][\"border\"]:SetHeight(16)\n\t\tprogressBars[i][\"border\"]:SetTemplate(\"Overlay\")\n\t\tif i == 1 then\n\t\t\tprogressBars[i][\"border\"]:SetPoint(\"TOP\", progressBars[\"frame\"], \"TOP\", 0, -5)\n\t\telse\n\t\t\tprogressBars[i][\"border\"]:SetPoint(\"TOP\", progressBars[i-1][\"border\"], \"BOTTOM\", 0, -5)\n\t\tend\n\n\t\t-- Bar\n\t\tprogressBars[i][\"bar\"]:SetStatusBarTexture(C.media.texture)\n\t\tprogressBars[i][\"bar\"]:SetPoint(\"TOPRIGHT\", progressBars[i][\"border\"], \"TOPRIGHT\", -2, -2)\n\t\tprogressBars[i][\"bar\"]:SetPoint(\"BOTTOMLEFT\", progressBars[i][\"border\"], \"BOTTOMLEFT\", 2, 2)\n\t\tprogressBars[i][\"bar\"]:SetStatusBarColor(0.4, 0.4, 0.4)\n\t\tprogressBars[i][\"bar\"]:SetScript(\"OnEnter\", function(self)\n\t\t\tGameTooltip:SetOwner(self, \"ANCHOR_TOPLEFT\", -2, 7)\n\t\t\tGameTooltip:ClearLines()\n\t\t\tif GetNumArtifactsByRace(i) > 0 then\n\t\t\t\tSetSelectedArtifact(i)\n\t\t\t\tlocal artifactName, artifactDescription, artifactRarity, _, _, keystoneCount = GetSelectedArtifactInfo()\n\t\t\t\tlocal numFragmentsCollected, _, numFragmentsRequired = GetArtifactProgress()\n\t\t\t\tlocal r, g, b\n\t\t\t\tif artifactRarity == 1 then\n\t\t\t\t\tartifactRarity = ITEM_QUALITY3_DESC\n\t\t\t\t\tr, g, b = GetItemQualityColor(3)\n\t\t\t\telse\n\t\t\t\t\tartifactRarity = ITEM_QUALITY1_DESC\n\t\t\t\t\tr, g, b = GetItemQualityColor(1)\n\t\t\t\tend\n\t\t\t\tGameTooltip:AddLine(artifactName, r, g, b, 1)\n\t\t\t\tGameTooltip:AddLine(artifactRarity, r, g, b, r, g, b)\n\t\t\t\tGameTooltip:AddDoubleLine(ARCHAEOLOGY_RUNE_STONES..\": \"..numFragmentsCollected..\"/\"..numFragmentsRequired, \"Keystones: \"..keystoneCount, 1, 1, 1, 1, 1, 1)\n\t\t\t\tGameTooltip:AddLine(\" \")\n\t\t\t\tGameTooltip:AddLine(artifactDescription, 1, 1, 1, 1)\n\t\t\t\tGameTooltip:Show()\n\t\t\tend\n\t\tend)\n\t\tprogressBars[i][\"bar\"]:SetScript(\"OnLeave\", function()\n\t\t\tGameTooltip:Hide()\n\t\tend)\n\n\t\t-- Progress Text\n\t\tprogressBars[i][\"progress\"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\tprogressBars[i][\"progress\"]:SetText(\"\")\n\t\tprogressBars[i][\"progress\"]:SetPoint(\"RIGHT\", progressBars[i][\"bar\"], \"RIGHT\", 1, 0)\n\n\t\t-- Race Text\n\t\tprogressBars[i][\"race\"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\tprogressBars[i][\"race\"]:SetText(RACE)\n\t\tprogressBars[i][\"race\"]:SetPoint(\"LEFT\", progressBars[i][\"bar\"], \"LEFT\", 2, 0)\n\t\tprogressBars[i][\"race\"]:SetPoint(\"RIGHT\", progressBars[i][\"progress\"], \"LEFT\", -2, 0)\n\t\tprogressBars[i][\"race\"]:SetWordWrap(false)\n\t\tprogressBars[i][\"race\"]:SetJustifyH(\"LEFT\")\n\tend\n\n\t-------------------------------------------------------------\n\t-- Archaeology Skill Level Frame\n\tlocal archSkill = stArch[\"archSkill\"]\n\tarchSkill[\"frame\"] = CreateFrame(\"Frame\", \"ArchSkillFrame\", self)\n\tarchSkill[\"bar\"] = CreateFrame(\"StatusBar\", \"ArchSkillBar\", archSkill[\"frame\"], \"TextStatusBar\")\n\tarchSkill[\"text\"] = archSkill[\"bar\"]:CreateFontString()\n\n\t-- Border\n\tarchSkill[\"frame\"]:SetHeight(24)\n\tarchSkill[\"frame\"]:SetWidth(self:GetWidth() - 8)\n\tarchSkill[\"frame\"]:SetPoint(\"TOP\", progressBars[\"frame\"], \"BOTTOM\", 0, -3)\n\tarchSkill[\"frame\"]:SetTemplate(\"Overlay\")\n\n\t-- StatusBar\n\tarchSkill[\"bar\"]:SetStatusBarTexture(C.media.texture)\n\tarchSkill[\"bar\"]:SetPoint(\"TOPRIGHT\", archSkill[\"frame\"], \"TOPRIGHT\", -2, -2)\n\tarchSkill[\"bar\"]:SetPoint(\"BOTTOMLEFT\", archSkill[\"frame\"], \"BOTTOMLEFT\", 2, 2)\n\tarchSkill[\"bar\"]:SetStatusBarColor(0, 0.4, 0.8)\n\tarchSkill[\"bar\"]:SetScript(\"OnMouseUp\", function()\n\t\tif IsAddOnLoaded(\"Blizzard_ArchaeologyUI\") then\n\t\t\tToggleFrame(ArchaeologyFrame)\n\t\telse\n\t\t\tlocal loaded = LoadAddOn(\"Blizzard_ArchaeologyUI\")\n\t\t\tif loaded then\n\t\t\t\tShowUIPanel(ArchaeologyFrame)\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Text\n\tarchSkill[\"text\"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tarchSkill[\"text\"]:SetText(\"-\")\n\tarchSkill[\"text\"]:SetPoint(\"CENTER\", archSkill[\"bar\"], \"CENTER\", 0, 0)\n\n\t-------------------------------------------------------------\n\t-- Solve Frame\n\tprogressBars[\"solveFrame\"] = CreateFrame(\"Frame\", \"ArchSolveFrame\", self)\n\tprogressBars[\"solveFrame\"]:SetHeight(progressBars[\"frame\"]:GetHeight())\n\tprogressBars[\"solveFrame\"]:SetWidth(85)\n\tprogressBars[\"solveFrame\"]:SetFrameLevel(0)\n\tprogressBars[\"solveFrame\"]:SetPoint(\"LEFT\", self, \"RIGHT\", 1, 0)\n\tprogressBars[\"solveFrame\"]:SetPoint(\"TOP\", progressBars[\"frame\"], \"TOP\", 0, 0)\n\tprogressBars[\"solveFrame\"]:SetTemplate(\"Transparent\")\n\tprogressBars[\"solveFrame\"]:Hide()\n\tfor i = 1, numRaces do progressBars[i][\"solve\"]:Hide() end\n\n\t-- Solve Toggle\n\tprogressBars[\"solveToggle\"] = CreateFrame(\"Frame\", \"ArchSolveToggle\", self)\n\tprogressBars[\"solveToggle\"]:SetHeight(progressBars[\"solveFrame\"]:GetHeight())\n\tprogressBars[\"solveToggle\"]:SetWidth(16)\n\tprogressBars[\"solveToggle\"]:SetPoint(\"LEFT\", self, \"RIGHT\", 1, 0)\n\tprogressBars[\"solveToggle\"]:SetPoint(\"TOP\", progressBars[\"frame\"], \"TOP\", 0, 0)\n\tprogressBars[\"solveToggle\"]:SetTemplate(\"Transparent\")\n\tprogressBars[\"solveToggle\"]:SetAlpha(0)\n\n\t-- Solve Toggle Text\n\tprogressBars[\"solveToggle\"][\"text\"] = progressBars[\"solveToggle\"]:CreateFontString()\n\tprogressBars[\"solveToggle\"][\"text\"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\tprogressBars[\"solveToggle\"][\"text\"]:SetText(\">\")\n\tprogressBars[\"solveToggle\"][\"text\"]:SetPoint(\"CENTER\", progressBars[\"solveToggle\"], \"CENTER\", 1, 0)\n\n\tprogressBars[\"solveToggle\"][\"closeDirection\"] = \"<\"\n\tprogressBars[\"solveToggle\"][\"openDirection\"] = \">\"\n\n\tprogressBars[\"solveToggle\"]:SetScript(\"OnEnter\", function()\n\t\tprogressBars[\"solveToggle\"][\"text\"]:SetTextColor(unpack(C.media.classborder_color))\n\t\tprogressBars[\"solveToggle\"]:FadeIn()\n\tend)\n\tprogressBars[\"solveToggle\"]:SetScript(\"OnLeave\", function()\n\t\tprogressBars[\"solveToggle\"][\"text\"]:SetTextColor(1, 1, 1)\n\t\tprogressBars[\"solveToggle\"]:FadeOut()\n\tend)\n\tprogressBars[\"solveToggle\"]:SetScript(\"OnMouseUp\", function()\n\t\tif progressBars[\"solveFrame\"]:IsShown() then\n\t\t\tprogressBars[\"solveFrame\"]:Hide()\n\t\t\tfor i = 1, numRaces do progressBars[i][\"solve\"]:Hide() end\n\t\t\tprogressBars[\"solveToggle\"][\"text\"]:SetText(progressBars[\"solveToggle\"][\"openDirection\"])\n\t\t\tprogressBars[\"solveToggle\"]:ClearAllPoints()\n\t\t\tprogressBars[\"solveToggle\"]:SetPoint(unpack(progressBars[\"solveToggle\"][\"openPoint1\"]))\n\t\t\tprogressBars[\"solveToggle\"]:SetPoint(unpack(progressBars[\"solveToggle\"][\"openPoint2\"]))\n\t\telse\n\t\t\tprogressBars[\"solveFrame\"]:Show()\n\t\t\tfor i = 1, numRaces do progressBars[i][\"solve\"]:Show() end\n\t\t\tprogressBars[\"solveToggle\"][\"text\"]:SetText(progressBars[\"solveToggle\"][\"closeDirection\"])\n\t\t\tprogressBars[\"solveToggle\"]:ClearAllPoints()\n\t\t\tprogressBars[\"solveToggle\"]:SetPoint(unpack(progressBars[\"solveToggle\"][\"closePoint\"]))\n\t\tend\n\tend)\n\n\tlocal solveFrame = stArch[\"progressBars\"]\n\tfor i = 1, numRaces do\n\t\t-- Button\n\t\tsolveFrame[i][\"solve\"]:SetHeight(progressBars[i][\"border\"]:GetHeight())\n\t\tsolveFrame[i][\"solve\"]:SetWidth(progressBars[\"solveFrame\"]:GetWidth() - 10)\n\t\tsolveFrame[i][\"solve\"]:SetPoint(\"LEFT\", progressBars[\"solveFrame\"], \"LEFT\", 5, 0)\n\t\tsolveFrame[i][\"solve\"]:SetPoint(\"TOP\", progressBars[i][\"border\"], \"TOP\", 0, 0)\n\t\tsolveFrame[i][\"solve\"]:SetTemplate(\"Overlay\")\n\n\t\t-- Text\n\t\tsolveFrame[i][\"solve\"][\"text\"] = solveFrame[i][\"solve\"]:CreateFontString()\n\t\tsolveFrame[i][\"solve\"][\"text\"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)\n\t\tsolveFrame[i][\"solve\"][\"text\"]:SetText(SOLVE)\n\t\tsolveFrame[i][\"solve\"][\"text\"]:SetPoint(\"CENTER\", solveFrame[i][\"solve\"], \"CENTER\", 2, 0)\n\tend\n\n\t-------------------------------------------------------------\n\t-- Construct artifact info table\n\tfor i = 1, numRaces do\n\t\tstArch[\"artifactInfo\"][i] = {}\n\tend\n\n\tLoaded = true\nend\n\nfunction stArch:UpdateFrameHeight(self)\n\t-- Update frame Sizes to fit correctly\n\tstArch[\"progressBars\"][\"frame\"]:SetHeight(numRaces * (stArch[\"progressBars\"][1][\"border\"]:GetHeight() + 5) + 5)\n\tstArch[\"progressBars\"][\"solveFrame\"]:SetHeight(stArch[\"progressBars\"][\"frame\"]:GetHeight())\n\tstArch[\"progressBars\"][\"solveToggle\"]:SetHeight(stArch[\"progressBars\"][\"frame\"]:GetHeight())\n\tif stArch[\"archSkill\"][\"frame\"]:IsShown() then\n\t\tself:SetHeight(stArch[\"title\"]:GetHeight() + stArch[\"progressBars\"][\"frame\"]:GetHeight() + stArch[\"archSkill\"][\"frame\"]:GetHeight() + 7)\n\telse\n\t\tself:SetHeight(stArch[\"title\"]:GetHeight() + stArch[\"progressBars\"][\"frame\"]:GetHeight() + 5)\n\tend\nend\n\nlocal function IsArchaeologist()\n\tlocal _, _, arch = GetProfessions()\n\tif arch then\n\t\treturn true\n\telse\n\t\treturn false\n\tend\nend\n\n-- Update archaeology skill information\nfunction stArch:updateSkillLevel()\n\tif IsArchaeologist() then\n\t\tlocal _, _, rank, maxRank = GetProfessionInfo(select(3, GetProfessions()))\n\t\tstArch[\"archSkill\"][\"rank\"] = rank\n\t\tstArch[\"archSkill\"][\"maxRank\"] = maxRank\n\telse\n\t\tstArch[\"archSkill\"][\"rank\"] = 0\n\t\tstArch[\"archSkill\"][\"maxRank\"] = 0\n\tend\nend\n\n-- Update a status bar to represent the skill information\nfunction stArch:updateSkillBar()\n\tlocal skill = stArch[\"archSkill\"]\n\n\tskill[\"bar\"]:SetMinMaxValues(0, skill[\"maxRank\"])\n\tskill[\"bar\"]:SetValue(skill[\"rank\"])\n\tskill[\"text\"]:SetText(skill[\"rank\"]..\"/\"..skill[\"maxRank\"])\n\n\tif (skill[\"rank\"] + 5) > skill[\"maxRank\"] and skill[\"rank\"] ~= skill[\"maxRank\"] then\n\t\tskill[\"bar\"]:SetStatusBarColor(0.7, 0.2, 0)\n\telse\n\t\tskill[\"bar\"]:SetStatusBarColor(0, 0.4, 0.8)\n\tend\nend\n\n-- Update artifact details, only keep relevant data\nfunction stArch:updateArtifact(index)\n\tlocal numProjects = GetNumArtifactsByRace(index)\n\tlocal raceName, _, raceItemID = GetArchaeologyRaceInfo(index)\n\tlocal artifact = stArch[\"artifactInfo\"][index]\n\n\tartifact[\"race\"] = raceName\n\tartifact[\"keyID\"] = raceItemID\n\tartifact[\"numKeystones\"] = 0\t-- Will dig for these in inventory later\n\tif numProjects == 0 then\t\t-- The Artifact hasn\"t been discovered\n\t\tartifact[\"numKeysockets\"] = 0\n\t\tartifact[\"progress\"] = 0\n\t\tartifact[\"modifier\"] = 0\n\t\tartifact[\"total\"] = 0\n\t\tartifact[\"canSolve\"] = false\n\telse\n\t\tSetSelectedArtifact(index)\n\t\tlocal _, _, _, _, _, keystoneCount = GetSelectedArtifactInfo()\n\t\tlocal numFragmentsCollected, numFragmentsAdded, numFragmentsRequired = GetArtifactProgress()\n\n\t\tartifact[\"numKeysockets\"] = keystoneCount\n\t\tartifact[\"progress\"] = numFragmentsCollected\n\t\tartifact[\"modifier\"] = numFragmentsAdded\n\t\tartifact[\"total\"] = numFragmentsRequired\n\t\tartifact[\"canSolve\"] = CanSolveArtifact()\n\n\t\tfor i = 0, 4 do\n\t\t\tfor j = 1, C_Container.GetContainerNumSlots(i) do\n\t\t\t\tlocal slotID = C_Container.GetContainerItemID(i, j)\n\t\t\t\tif slotID == artifact[\"keyID\"] then\n\t\t\t\t\tlocal _, count = GetContainerItemInfo(i, j)\n\t\t\t\t\tif artifact[\"numKeystones\"] < artifact[\"numKeysockets\"] then\n\t\t\t\t\t\tartifact[\"numKeystones\"] = artifact[\"numKeystones\"] + count\n\t\t\t\t\tend\n\t\t\t\t\tif min(artifact[\"numKeystones\"], artifact[\"numKeysockets\"]) * numRaces + artifact[\"progress\"] >= artifact[\"total\"] then\n\t\t\t\t\t\tartifact[\"canSolve\"] = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction stArch:updateArtifactBar(index)\n\tlocal artifact = stArch[\"artifactInfo\"][index]\n\tlocal bar = stArch[\"progressBars\"][index]\n\n\tbar[\"race\"]:SetText(artifact[\"race\"])\n\n\tif GetNumArtifactsByRace(index) ~= 0 then\n\t\tlocal keystoneBonus = 0\n\n\t\tif artifact[\"numKeysockets\"] then\n\t\t\tkeystoneBonus = min(artifact[\"numKeystones\"], artifact[\"numKeysockets\"]) * numRaces\n\t\tend\n\n\t\tbar[\"bar\"]:SetMinMaxValues(0, artifact[\"total\"])\n\t\tbar[\"bar\"]:SetValue(min(artifact[\"progress\"] + keystoneBonus, artifact[\"total\"]))\n\n\t\tif artifact[\"numKeysockets\"] and artifact[\"numKeysockets\"] > 0 then\n\t\t\tbar[\"solve\"][\"text\"]:SetText(SOLVE..\" [\"..artifact[\"numKeystones\"]..\"/\"..artifact[\"numKeysockets\"]..\"]\")\n\t\telse\n\t\t\tbar[\"solve\"][\"text\"]:SetText(SOLVE)\n\t\tend\n\n\t\tif keystoneBonus > 0 then\n\t\t\tbar[\"progress\"]:SetText(format(\"|cff00c1ea%d|r/%d\", artifact[\"progress\"] + keystoneBonus, artifact[\"total\"]))\n\t\telse\n\t\t\tif artifact[\"total\"] > 65 then\n\t\t\t\tbar[\"progress\"]:SetText(format(\"%d/|cff00c1ea%d|r\", artifact[\"progress\"], artifact[\"total\"]))\n\t\t\telse\n\t\t\t\tbar[\"progress\"]:SetText(format(\"%d/%d\", artifact[\"progress\"], artifact[\"total\"]))\n\t\t\tend\n\t\tend\n\t\tif artifact[\"canSolve\"] then\n\t\t\tbar[\"bar\"]:SetStatusBarColor(0.2, 0.8, 0.2)\n\t\t\tstArch:EnableSolve(index, bar[\"solve\"])\n\t\telse\n\t\t\tbar[\"bar\"]:SetStatusBarColor(0.7, 0.2, 0)\n\t\t\tstArch:DisableSolve(bar[\"solve\"])\n\t\tend\n\n\t\tbar[\"border\"]:SetAlpha(1)\n\t\tbar[\"solve\"]:SetAlpha(1)\n\telse\n\t\t-- Empty information, sometimes tries to falsely update\n\t\tbar[\"solve\"][\"text\"]:SetText(\"\")\n\t\tbar[\"progress\"]:SetText(\"\")\n\t\tstArch:DisableSolve(bar[\"solve\"])\n\t\tbar[\"bar\"]:SetStatusBarColor(0.4, 0.4, 0.4)\n\n\t\tstArch[\"progressBars\"][index][\"border\"]:SetAlpha(0.2)\n\t\tstArch[\"progressBars\"][index][\"solve\"]:SetAlpha(0.2)\n\tend\nend\n\nfunction stArch:EnableSolve(index, button)\n\tbutton[\"text\"]:SetTextColor(1, 1, 1)\n\tbutton:HookScript(\"OnEnter\", T.SetModifiedBackdrop)\n\tbutton:HookScript(\"OnLeave\", T.SetOriginalBackdrop)\n\n\tbutton:SetScript(\"OnClick\", function()\n\t\tSetSelectedArtifact(index)\n\t\tlocal _, _, _, _, _, numSockets = GetActiveArtifactByRace(index)\n\t\tlocal _, _, itemID = GetArchaeologyRaceInfo(index)\n\n\t\tif numSockets and numSockets > 0 then\n\t\t\tfor socketNum = 1, numSockets do\n\t\t\t\tif not ItemAddedToArtifact(itemID) then\n\t\t\t\t\tSocketItemToArtifact()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif GetNumArtifactsByRace(index) > 0 then\n\t\t\tif stArch[\"artifactInfo\"][index][\"canSolve\"] then\n\t\t\t\tif not ((stArch[\"archSkill\"][\"rank\"] + 5) > stArch[\"archSkill\"][\"maxRank\"] and stArch[\"archSkill\"][\"rank\"] ~= stArch[\"archSkill\"][\"maxRank\"]) or IsShiftKeyDown() then\n\t\t\t\t\tSolveArtifact()\n\t\t\t\tend\n\t\t\t\tif (stArch[\"archSkill\"][\"rank\"] + 5) > stArch[\"archSkill\"][\"maxRank\"] and stArch[\"archSkill\"][\"rank\"] ~= stArch[\"archSkill\"][\"maxRank\"] and not IsShiftKeyDown() then\n\t\t\t\t\tprint(\"[|cffe76a6ast|rArch] You should go train before finishing this cast or you won't get all your skill points! (Hold shift if you don't care and still want to complete your artifact now)\")\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\nend\n\nfunction stArch:DisableSolve(button)\n\tbutton[\"text\"]:SetTextColor(0.5, 0.5, 0.5)\n\tbutton:SetBackdropBorderColor(unpack(C.media.border_color))\n\tbutton.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)\n\tbutton:SetScript(\"OnEnter\", function() end)\n\tbutton:SetScript(\"OnLeave\", function() end)\n\tbutton:SetScript(\"OnMouseUp\", function() end)\nend\n\nfunction stArch:OnEvent()\n\tfor i = 1, numRaces do\n\t\tstArch:updateArtifact(i)\n\tend\n\tfor i = 1, numRaces do\n\t\tstArch:updateArtifactBar(i)\n\tend\n\tstArch:updateSkillLevel()\n\tstArch:updateSkillBar()\n\n\tif stArch[\"archSkill\"][\"rank\"] == stArch[\"archSkill\"][\"maxRank\"] then\n\t\tstArch[\"archSkill\"][\"frame\"]:Hide()\n\tend\nend\n\nfunction stArch:updateFramePosition(self)\n\tlocal progressBars = stArch[\"progressBars\"]\n\tlocal _, _, relativePoint = self:GetPoint()\n\tif relativePoint == \"TOPRIGHT\" or relativePoint == \"RIGHT\" or relativePoint == \"BOTTOMRIGHT\" then\n\t\tprogressBars[\"solveFrame\"]:ClearAllPoints()\n\t\tprogressBars[\"solveFrame\"]:SetPoint(\"RIGHT\", self, \"LEFT\", -1, 0)\n\t\tprogressBars[\"solveFrame\"]:SetPoint(\"TOP\", progressBars[\"frame\"], \"TOP\", 0, 0)\n\n\t\tprogressBars[\"solveToggle\"][\"openPoint1\"] = {\"RIGHT\", self, \"LEFT\", -1, 0}\n\t\tprogressBars[\"solveToggle\"][\"openPoint2\"] = {\"TOP\", progressBars[\"frame\"], \"TOP\", 0, 0}\n\t\tprogressBars[\"solveToggle\"][\"closePoint\"] = {\"RIGHT\", progressBars[\"solveFrame\"], \"LEFT\", -1, 0}\n\n\t\tprogressBars[\"solveToggle\"][\"closeDirection\"] = \">\"\n\t\tprogressBars[\"solveToggle\"][\"openDirection\"] = \"<\"\n\telse\n\t\tprogressBars[\"solveFrame\"]:ClearAllPoints()\n\t\tprogressBars[\"solveFrame\"]:SetPoint(\"LEFT\", self, \"RIGHT\", 1, 0)\n\t\tprogressBars[\"solveFrame\"]:SetPoint(\"TOP\", progressBars[\"frame\"], \"TOP\", 0, 0)\n\n\t\tprogressBars[\"solveToggle\"][\"openPoint1\"] = {\"LEFT\", self, \"RIGHT\", 1, 0}\n\t\tprogressBars[\"solveToggle\"][\"openPoint2\"] = {\"TOP\", progressBars[\"frame\"], \"TOP\", 0, 0 }\n\t\tprogressBars[\"solveToggle\"][\"closePoint\"] = {\"LEFT\", progressBars[\"solveFrame\"], \"RIGHT\", 1, 0}\n\n\t\tprogressBars[\"solveToggle\"][\"closeDirection\"] = \"<\"\n\t\tprogressBars[\"solveToggle\"][\"openDirection\"] = \">\"\n\tend\n\n\tif progressBars[\"solveFrame\"]:IsShown() then\n\t\tprogressBars[\"solveToggle\"][\"text\"]:SetText(progressBars[\"solveToggle\"][\"closeDirection\"])\n\telse\n\t\tprogressBars[\"solveToggle\"][\"text\"]:SetText(progressBars[\"solveToggle\"][\"openDirection\"])\n\tend\n\n\tprogressBars[\"solveToggle\"]:ClearAllPoints()\n\tif progressBars[\"solveFrame\"]:IsShown() then\n\t\tprogressBars[\"solveToggle\"]:SetPoint(unpack(progressBars[\"solveToggle\"][\"closePoint\"]))\n\telse\n\t\tprogressBars[\"solveToggle\"]:SetPoint(unpack(progressBars[\"solveToggle\"][\"openPoint1\"]))\n\t\tprogressBars[\"solveToggle\"]:SetPoint(unpack(progressBars[\"solveToggle\"][\"openPoint2\"]))\n\tend\nend\n\nlocal stArchFrame = CreateFrame(\"Frame\", \"stArchaeologyFrame\", UIParent)\nstArchFrame:RegisterEvent(\"RESEARCH_ARTIFACT_HISTORY_READY\")\nstArchFrame:RegisterEvent(\"RESEARCH_ARTIFACT_COMPLETE\")\nstArchFrame:RegisterEvent(\"RESEARCH_ARTIFACT_DIG_SITE_UPDATED\")\nstArchFrame:RegisterEvent(\"CURRENCY_DISPLAY_UPDATE\")\nstArchFrame:RegisterEvent(\"SKILL_LINES_CHANGED\")\nstArchFrame:RegisterEvent(\"BAG_UPDATE\")\nstArchFrame:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\nstArchFrame:SetWidth(C.minimap.size)\nstArchFrame:SetHeight(15)\nstArchFrame:SetPoint(unpack(C.position.archaeology))\nstArchFrame:SetTemplate(\"Transparent\")\nstArchFrame:SetFrameLevel(1)\nstArchFrame:SetFrameStrata(\"HIGH\")\n\nstArchFrame:EnableMouse(true)\nstArchFrame:SetMovable(true)\nstArchFrame:HookScript(\"OnMouseDown\", function(self, button)\n\tif IsAltKeyDown() or IsShiftKeyDown() then\n\t\tself:StartMoving()\n\telseif IsControlKeyDown() and button == \"RightButton\" then\n\t\tself:ClearAllPoints()\n\t\tself:SetPoint(unpack(C.position.archaeology))\n\t\tself:SetUserPlaced(false)\n\tend\nend)\nstArchFrame:HookScript(\"OnMouseUp\", function(self)\n\tself:StopMovingOrSizing()\n\tstArch:updateFramePosition(self)\nend)\n\nSlashCmdList.STARCHAEOLOGIST = function()\n\tToggleFrame(stArchFrame)\n\tstArchFrame:StopMovingOrSizing()\n\n\tif stArchFrame:IsShown() then ShestakUISettingsPerChar.Archaeology = true else ShestakUISettingsPerChar.Archaeology = false end\nend\nSLASH_STARCHAEOLOGIST1 = \"/starch\"\nSLASH_STARCHAEOLOGIST2 = \"/arch\"\n\nstArchFrame:HookScript(\"OnEvent\", function(self)\n\tif Loaded ~= true then\n\t\tstArch:OnLoad(self)\n\t\tstArch:updateFramePosition(self)\n\telse\n\t\tstArch:OnEvent()\n\t\tstArch:UpdateFrameHeight(self)\n\tend\n\tif not select(3, GetProfessions()) then stArchFrame:Hide() ShestakUISettingsPerChar.Archaeology = false end\n\tif ShestakUISettingsPerChar.Archaeology == true and not self:IsShown() then self:Show() end\nend)\n\nlocal b = CreateFrame(\"Button\", \"SwitchArch\", UIParent)\nb:SetTemplate(\"ClassColor\")\nif C.actionbar.toggle_mode == true then\n\tb:SetPoint(\"TOPLEFT\", Minimap, \"TOPRIGHT\", 3, -58)\nelse\n\tb:SetPoint(\"TOPLEFT\", Minimap, \"TOPRIGHT\", 3, -38)\nend\nb:SetSize(19, 19)\nb:SetAlpha(0)\n\nb:SetScript(\"OnClick\", function()\n\tif _G[\"stArchaeologyFrame\"]:IsShown() then\n\t\t_G[\"stArchaeologyFrame\"]:Hide()\n\t\tShestakUISettingsPerChar.Archaeology = false\n\telse\n\t\t_G[\"stArchaeologyFrame\"]:Show()\n\t\tShestakUISettingsPerChar.Archaeology = true\n\tend\n\tif C.minimap.toggle_menu and _G[\"TTMenuAddOnBackground\"]:IsShown() then\n\t\t_G[\"TTMenuAddOnBackground\"]:Hide()\n\tend\n\tif C.minimap.toggle_menu and _G[\"TTMenuBackground\"]:IsShown() then\n\t\t_G[\"TTMenuBackground\"]:Hide()\n\tend\nend)\n\nb:SetScript(\"OnEnter\", function()\n\tb:FadeIn()\n\tGameTooltip:SetOwner(b, \"ANCHOR_LEFT\")\n\tGameTooltip:AddLine(PROFESSIONS_ARCHAEOLOGY)\n\tGameTooltip:Show()\nend)\n\nb:SetScript(\"OnLeave\", function()\n\tb:FadeOut()\n\tGameTooltip:Hide()\nend)\n\nlocal bt = b:CreateTexture(nil, \"OVERLAY\")\nbt:SetTexture(\"Interface\\\\Icons\\\\Trade_Archaeology\")\nbt:SetTexCoord(0.1, 0.9, 0.1, 0.9)\nbt:SetPoint(\"TOPLEFT\", b, 2, -2)\nbt:SetPoint(\"BOTTOMRIGHT\", b, -2, 2)\n\n----------------------------------------------------------------------------------------\n--\tSurvey cooldown timer\n----------------------------------------------------------------------------------------\nlocal f = CreateFrame(\"Frame\", nil, UIParent)\nf:SetPoint(\"CENTER\", 0, -80)\nf:SetSize(40, 40)\n\nlocal text = f:CreateFontString(nil, \"OVERLAY\")\ntext:SetFont(C.media.pixel_font, 16, \"MONOCHROMEOUTLINE\")\ntext:SetPoint(\"CENTER\")\n\nlocal last = 0\nlocal time = 3\n\nf:RegisterEvent(\"UNIT_SPELLCAST_STOP\")\nf:SetScript(\"OnEvent\", function(_, _, unit, _, _, _, spellid)\n\tif not unit == \"player\" or select(2, UnitRace(\"player\")) == \"Dwarf\" then return end\n\tif spellid == 80451 then\n\t\ttext:SetText(\"3\")\n\t\tf:SetScript(\"OnUpdate\", function(_, elapsed)\n\t\t\tlast = last + elapsed\n\t\t\tif last > 1 then\n\t\t\t\ttime = time - 1\n\t\t\t\ttext:SetText(time)\n\t\t\t\t\tif time <= 0 then\n\t\t\t\t\t\tf:SetScript(\"OnUpdate\", nil)\n\t\t\t\t\t\ttext:SetText(\"\")\n\t\t\t\t\t\ttime = 3\n\t\t\t\t\tend\n\t\t\t\tlast = 0\n\t\t\tend\n\t\tend)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Trade/Merchant.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tAlt+Click to buy a stack\n----------------------------------------------------------------------------------------\nhooksecurefunc(\"MerchantItemButton_OnModifiedClick\", function(self)\n\tif IsAltKeyDown() then\n\t\tlocal id = self:GetID()\n\t\tlocal itemLink = GetMerchantItemLink(id)\n\t\tif not itemLink then return end\n\n\t\tlocal maxStack = select(8, GetItemInfo(itemLink))\n\t\tif maxStack and maxStack > 1 then\n\t\t\tlocal numAvailable = select(5, GetMerchantItemInfo(id))\n\t\t\tif numAvailable > -1 then\n\t\t\t\tBuyMerchantItem(id, numAvailable)\n\t\t\telse\n\t\t\t\tBuyMerchantItem(id, GetMerchantItemMaxStack(id))\n\t\t\tend\n\t\tend\n\tend\nend)\n\nITEM_VENDOR_STACK_BUY = _G.ITEM_VENDOR_STACK_BUY..\"\\n|cff00ff00<\"..L_MISC_BUY_STACK..\">|r\"\n\n----------------------------------------------------------------------------------------\n--\tShow item level for weapons and armor in merchant\n----------------------------------------------------------------------------------------\nif C.trade.merchant_itemlevel ~= true then return end\nlocal function MerchantItemlevel()\n\tlocal numItems = GetMerchantNumItems()\n\n\tfor i = 1, MERCHANT_ITEMS_PER_PAGE do\n\t\tlocal index = (MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE + i\n\t\tif index > numItems then return end\n\n\t\tlocal button = _G[\"MerchantItem\"..i..\"ItemButton\"]\n\t\tif button and button:IsShown() then\n\t\t\tif not button.text then\n\t\t\t\tbutton.text = button:CreateFontString(nil, \"OVERLAY\", \"SystemFont_Outline_Small\")\n\t\t\t\tbutton.text:SetPoint(\"TOPLEFT\", 1, -1)\n\t\t\t\tbutton.text:SetTextColor(1, 1, 0)\n\t\t\telse\n\t\t\t\tbutton.text:SetText(\"\")\n\t\t\tend\n\n\t\t\tlocal itemLink = GetMerchantItemLink(index)\n\t\t\tif itemLink then\n\t\t\t\tlocal _, _, quality, itemlevel, _, _, _, _, _, _, _, itemClassID = GetItemInfo(itemLink)\n\t\t\t\tif (itemlevel and itemlevel > 1) and (quality and quality > 1) and (itemClassID == Enum.ItemClass.Weapon or itemClassID == Enum.ItemClass.Armor) then\n\t\t\t\t\tbutton.text:SetText(itemlevel)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\nhooksecurefunc(\"MerchantFrame_UpdateMerchantInfo\", MerchantItemlevel)"
  },
  {
    "path": "ShestakUI/Modules/Trade/OneClickDisenchanting.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.trade.disenchanting ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tOne-click Milling, Prospecting and Disenchanting(Molinari by p3lim)\n----------------------------------------------------------------------------------------\nlocal button = CreateFrame(\"Button\", \"OneClickMPD\", UIParent, \"SecureActionButtonTemplate, AutoCastShineTemplate\")\nbutton:RegisterForClicks(\"AnyUp\", \"AnyDown\")\nbutton:SetScript(\"OnEvent\", function(self, event, ...) self[event](self, ...) end)\nbutton:RegisterEvent(\"PLAYER_LOGIN\")\n\nlocal enchantingItems = {\n\t-- Legion enchanting quest line\n\t[137195] = true, -- Highmountain Armor\n\t[137221] = true, -- Enchanted Raven Sigil\n\t[137286] = true, -- Fel-Crusted Rune\n\n\t-- Shadowlands profession world quests\n\t[182021] = true, -- Antique Kyrian Javelin\n\t[182043] = true, -- Antique Necromancer's Staff\n\t[182067] = true, -- Antique Duelist's Rapier\n\t[181991] = true, -- Antique Stalker's Bow\n\n\t-- Dragonflight profession items\n\t-- https://www.wowhead.com/items?filter=104;0;amount+of+magical+power+can+be+sensed+from+within\n\t[200939] = true, -- Chromatic Pocketwatch\n\t[200940] = true, -- Everflowing Inkwell\n\t[200941] = true, -- Seal of Order\n\t[200942] = true, -- Vibrant Emulsion\n\t[200943] = true, -- Whispering Band\n\t[200945] = true, -- Valiant Hammer\n\t[200946] = true, -- Thunderous Blade\n\t[200947] = true, -- Carving of Awakening\n\t-- https://www.wowhead.com/items?filter=104;0;Disenchant+to+gain+Enchanting+knowledge\n\t[198694] = true, -- Enriched Earthen Shard\n\t[198798] = true, -- Flashfrozen Scroll\n\t[198800] = true, -- Fractured Titanic Sphere\n\t[198689] = true, -- Stormbound Horn\n\t[198799] = true, -- Forgotten Arcane Tome\n\t[198675] = true, -- Lava-Infused Seed\n\t[201360] = true, -- Glimmer of Order\n\t[201358] = true, -- Glimmer of Air\n\t[201357] = true, -- Glimmer of Frost\n\t[201359] = true, -- Glimmer of Earth\n\t[201356] = true, -- Glimmer of Fire\n}\n\nfunction button:PLAYER_LOGIN()\n\tlocal disenchanter, rogue\n\n\tif IsSpellKnown(13262) then\n\t\tdisenchanter = true\n\tend\n\n\tif IsSpellKnown(1804) then\n\t\trogue = ITEM_MIN_SKILL:gsub(\"%%s\", (T.client == \"ruRU\" and \"Взлом замков\" or GetSpellInfo(1809))):gsub(\"%%d\", \"%(.*%)\")\n\tend\n\n\tlocal function OnTooltipSetUnit(self)\n\t\tif self ~= GameTooltip or self:IsForbidden() then return end\n\t\tlocal _, link = TooltipUtil.GetDisplayedItem(self)\n\n\t\tif link and not InCombatLockdown() and IsAltKeyDown() and not (AuctionHouseFrame and AuctionHouseFrame:IsShown()) then\n\t\t\tlocal itemID = GetItemInfoFromHyperlink(link)\n\t\t\tif not itemID then return end\n\t\t\tlocal spell, r, g, b\n\t\t\tif disenchanter then\n\t\t\t\tif enchantingItems[itemID] then\n\t\t\t\t\tspell, r, g, b = GetSpellInfo(13262), 0.5, 0.5, 1\n\t\t\t\telse\n\t\t\t\t\tlocal _, _, quality, _, _, _, _, _, _, _, _, class, subClass = GetItemInfo(link)\n\t\t\t\t\tif quality and ((quality >= Enum.ItemQuality.Uncommon and quality <= Enum.ItemQuality.Epic)\n\t\t\t\t\t\tand C_Item.GetItemInventoryTypeByID(itemID) ~= Enum.InventoryType.IndexBodyType\n\t\t\t\t\t\tand (class == Enum.ItemClass.Weapon\n\t\t\t\t\t\t\tor (class == Enum.ItemClass.Armor and subClass ~= Enum.ItemClass.Cosmetic)\n\t\t\t\t\t\t\tor (class == Enum.ItemClass.Gem and subClass == 11)\n\t\t\t\t\t\t\tor class == Enum.ItemClass.Profession)) then\n\t\t\t\t\t\tspell, r, g, b = GetSpellInfo(13262), 0.5, 0.5, 1\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif rogue then\n\t\t\t\tfor index = 1, self:NumLines() do\n\t\t\t\t\tif string.match(_G[\"GameTooltipTextLeft\"..index]:GetText() or \"\", rogue) then\n\t\t\t\t\t\tspell, r, g, b = GetSpellInfo(1804), 0, 1, 1\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal bag, slot = GetMouseFocus():GetParent(), GetMouseFocus()\n\t\t\tif spell and C_Container.GetContainerItemLink(bag:GetID(), slot:GetID()) == link then\n\t\t\t\tbutton:SetAttribute(\"macrotext\", string.format(\"/cast %s\\n/use %s %s\", spell, bag:GetID(), slot:GetID()))\n\t\t\t\tbutton:SetAllPoints(slot)\n\t\t\t\tbutton:Show()\n\t\t\t\tAutoCastShine_AutoCastStart(button, r, g, b)\n\t\t\tend\n\t\tend\n\tend\n\n\tTooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, OnTooltipSetUnit)\n\n\tself:SetFrameStrata(\"TOOLTIP\")\n\tself:SetAttribute(\"*type1\", \"macro\")\n\tself:SetScript(\"OnLeave\", self.MODIFIER_STATE_CHANGED)\n\n\tself:RegisterEvent(\"MODIFIER_STATE_CHANGED\")\n\tself:Hide()\n\n\tfor _, sparks in pairs(self.sparkles) do\n\t\tsparks:SetHeight(sparks:GetHeight() * 3)\n\t\tsparks:SetWidth(sparks:GetWidth() * 3)\n\tend\nend\n\nfunction button:MODIFIER_STATE_CHANGED(key)\n\tif not self:IsShown() and not key and key ~= \"LALT\" and key ~= \"RALT\" then return end\n\n\tif InCombatLockdown() then\n\t\tself:SetAlpha(0)\n\t\tself:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\telse\n\t\tself:ClearAllPoints()\n\t\tself:SetAlpha(1)\n\t\tself:Hide()\n\t\tAutoCastShine_AutoCastStop(self)\n\tend\nend\n\nfunction button:PLAYER_REGEN_ENABLED()\n\tself:UnregisterEvent(\"PLAYER_REGEN_ENABLED\")\n\tself:MODIFIER_STATE_CHANGED()\nend"
  },
  {
    "path": "ShestakUI/Modules/Trade/OneClickEnchantScroll.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.trade.enchantment_scroll ~= true or IsAddOnLoaded(\"OneClickEnchantScroll\") then return end\n\n----------------------------------------------------------------------------------------\n--\tEnchantment scroll on TradeSkill frame(OneClickEnchantScroll by Sara.Festung)\n----------------------------------------------------------------------------------------\nlocal button = CreateFrame(\"Button\", \"TradeSkillCreateScrollButton\", ProfessionsFrame, \"MagicButtonTemplate\")\nif C.skins.blizzard_frames == true then\n\tbutton:SkinButton(true)\n\tbutton:SetPoint(\"TOPRIGHT\", ProfessionsFrame.CraftingPage.CreateButton, \"TOPLEFT\", -1, 0)\nelse\n\tbutton:SetPoint(\"TOPRIGHT\", ProfessionsFrame.CraftingPage.CreateButton, \"TOPLEFT\")\nend\nbutton:SetScript(\"OnClick\", function()\n\tlocal currentRecipeInfo = ProfessionsFrame.CraftingPage.SchematicForm:GetRecipeInfo()\n\tif currentRecipeInfo then\n\t\tC_TradeSkillUI.CraftRecipe(currentRecipeInfo.recipeID)\n\t\tUseItemByName(38682)\n\tend\nend)\n\nhooksecurefunc(ProfessionsFrame.CraftingPage, \"ValidateControls\", function(self)\n\tif C_TradeSkillUI.IsTradeSkillGuild() or C_TradeSkillUI.IsNPCCrafting() or C_TradeSkillUI.IsTradeSkillLinked() then\n\t\tbutton:Hide()\n\telse\n\t\tlocal currentRecipeInfo = ProfessionsFrame.CraftingPage.SchematicForm:GetRecipeInfo()\n\t\tif currentRecipeInfo and currentRecipeInfo.alternateVerb then\n\t\t\tlocal professionInfo = ProfessionsFrame:GetProfessionInfo()\n\t\t\tif professionInfo and professionInfo.parentProfessionID == 333 then\n\t\t\t\tbutton:Show()\n\t\t\t\tlocal isEnchantingRecipe = currentRecipeInfo.isEnchantingRecipe\n\t\t\t\tlocal numScrollsAvailable = GetItemCount(38682)\n\t\t\t\tbutton:SetText(L_MISC_SCROLL..\" (\"..numScrollsAvailable..\")\")\n\t\t\t\t if numScrollsAvailable == 0 then\n\t\t\t\t\tisEnchantingRecipe = false\n\t\t\t\tend\n\t\t\t\tif isEnchantingRecipe then\n\t\t\t\t\tbutton:Enable()\n\t\t\t\telse\n\t\t\t\t\tbutton:Disable()\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tbutton:Hide()\n\t\t\tend\n\t\telse\n\t\t\tbutton:Hide()\n\t\tend\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Trade/ProfessionTabs.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.trade.profession_tabs ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tProfessions tabs on tradeskill frame(ProfessionTabs by Beoko)\n----------------------------------------------------------------------------------------\nlocal IsCurrentSpell = IsCurrentSpell\nlocal format = string.format\nlocal next = next\nlocal ranks = PROFESSION_RANKS\nlocal tabs, spells = {}, {}\n\nlocal handler = CreateFrame(\"Frame\")\nhandler:SetScript(\"OnEvent\", function(self, event) self[event](self, event) end)\nhandler:RegisterEvent(\"TRADE_SKILL_SHOW\")\nhandler:RegisterEvent(\"TRADE_SKILL_CLOSE\")\nhandler:RegisterEvent(\"TRADE_SHOW\")\nhandler:RegisterEvent(\"SKILL_LINES_CHANGED\")\nhandler:RegisterEvent(\"CURRENT_SPELL_CAST_CHANGED\")\n\nlocal buttonList = {\n\t[1] = {\"Professions-Icon-Skill-High\", TRADESKILL_FILTER_HAS_SKILL_UP, C_TradeSkillUI.GetOnlyShowSkillUpRecipes, C_TradeSkillUI.SetOnlyShowSkillUpRecipes},\n\t[2] = {\"Interface\\\\RAIDFRAME\\\\ReadyCheck-Ready\", CRAFT_IS_MAKEABLE, C_TradeSkillUI.GetOnlyShowMakeableRecipes, C_TradeSkillUI.SetOnlyShowMakeableRecipes},\n}\n\nlocal function filterClick(self)\n\tlocal value = self.__value\n\tif value[3]() then\n\t\tvalue[4](false)\n\t\tself:SetBackdropBorderColor(unpack(C.media.border_color))\n\telse\n\t\tvalue[4](true)\n\t\tself:SetBackdropBorderColor(1, 0.8, 0)\n\tend\nend\n\nlocal buttons = {}\nfor index, value in pairs(buttonList) do\n\tlocal button = CreateFrame(\"Button\", nil, ProfessionsFrame.CraftingPage, \"BackdropTemplate\")\n\tbutton:SetSize(22, 22)\n\tbutton:SetPoint(\"BOTTOMRIGHT\", ProfessionsFrame.CraftingPage.RecipeList.FilterButton, \"TOPRIGHT\", -(index-1)*27, 10)\n\tbutton:SetTemplate(\"Overlay\")\n\tbutton.Icon = button:CreateTexture(nil, \"OVERLAY\")\n\tif index == 1 then\n\t\tbutton.Icon:SetAtlas(value[1])\n\telse\n\t\tbutton.Icon:SetTexture(value[1])\n\tend\n\tbutton.Icon:SetPoint(\"TOPLEFT\", button, 2, -2)\n\tbutton.Icon:SetPoint(\"BOTTOMRIGHT\", button, -2, 2)\n\n\tlocal tooltip_hide = function()\n\t\tGameTooltip:Hide()\n\tend\n\n\tlocal tooltip_show = function(self)\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_TOPRIGHT\", 0, 3)\n\t\tGameTooltip:ClearLines()\n\t\tGameTooltip:SetText(value[2])\n\tend\n\tbutton:SetScript(\"OnEnter\", tooltip_show)\n\tbutton:SetScript(\"OnLeave\", tooltip_hide)\n\n\tbutton.__value = value\n\tbutton:SetScript(\"OnClick\", filterClick)\n\n\tbuttons[index] = button\nend\n\nfunction handler:TRADE_SKILL_LIST_UPDATE()\n\tfor index, value in pairs(buttonList) do\n\t\tif value[3]() then\n\t\t\tbuttons[index]:SetBackdropBorderColor(1, 0.8, 0)\n\t\telse\n\t\t\tbuttons[index]:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\tend\nend\nhandler:RegisterEvent(\"TRADE_SKILL_LIST_UPDATE\")\n\nlocal defaults = {\n\t-- Primary Professions\n\t[171] = {true, false},\t-- Alchemy\n\t[164] = {true, false},\t-- Blacksmithing\n\t[333] = {true, true},\t-- Enchanting\n\t[202] = {true, false},\t-- Engineering\n\t[182] = {false, false},\t-- Herbalism\n\t[773] = {true, true},\t-- Inscription\n\t[755] = {true, true},\t-- Jewelcrafting\n\t[165] = {true, false},\t-- Leatherworking\n\t[186] = {true, false},\t-- Mining\n\t[393] = {false, false},\t-- Skinning\n\t[197] = {true, false},\t-- Tailoring\n\n\t-- Secondary Professions\n\t[794] = {false, false},\t-- Archaeology\n\t[185] = {true, true},\t-- Cooking\n\t[356] = {false, false},\t-- Fishing\n}\n\nif T.class == \"DEATHKNIGHT\" then spells[#spells + 1] = 53428 end\t-- Runeforging\nif T.class == \"ROGUE\" then spells[#spells + 1] = 1804 end\t\t\t-- Pick Lock\n\nlocal function UpdateSelectedTabs(object)\n\tif not handler:IsEventRegistered(\"CURRENT_SPELL_CAST_CHANGED\") then\n\t\thandler:RegisterEvent(\"CURRENT_SPELL_CAST_CHANGED\")\n\tend\n\n\tfor index = 1, #tabs[object] do\n\t\tlocal tab = tabs[object][index]\n\t\ttab:SetChecked(IsCurrentSpell(tab.name))\n\tend\nend\n\nlocal function ResetTabs(object)\n\tfor index = 1, #tabs[object] do\n\t\ttabs[object][index]:Hide()\n\tend\n\n\ttabs[object].index = 0\nend\n\nlocal function UpdateTab(object, name, rank, texture, hat)\n\tlocal index = tabs[object].index + 1\n\tlocal tab = tabs[object][index] or CreateFrame(\"CheckButton\", \"ProTabs\"..tabs[object].index, object, \"SpellBookSkillLineTabTemplate, SecureActionButtonTemplate\")\n\ttab:RegisterForClicks(\"LeftButtonUp\", \"LeftButtonDown\")\n\n\ttab:ClearAllPoints()\n\n\tif IsAddOnLoaded(\"Aurora\") then\n\t\ttab:SetPoint(\"TOPLEFT\", object, \"TOPRIGHT\", 11, (-44 * index) + 10)\n\n\t\ttab:DisableDrawLayer(\"BACKGROUND\")\n\t\ttab:SetNormalTexture(texture)\n\t\ttab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\tlocal F, C = unpack(Aurora)\n\t\ttab:SetCheckedTexture(C.media.checked)\n\t\ttab:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3)\n\t\ttab:GetHighlightTexture():SetAllPoints(tab:GetNormalTexture())\n\t\tF.CreateBG(tab)\n\telseif C.skins.blizzard_frames == true then\n\t\ttab:SetPoint(\"TOPLEFT\", object, \"TOPRIGHT\", 1, (-44 * index) + 44)\n\n\t\ttab:DisableDrawLayer(\"BACKGROUND\")\n\t\ttab:SetNormalTexture(texture)\n\t\ttab:GetNormalTexture():ClearAllPoints()\n\t\ttab:GetNormalTexture():SetPoint(\"TOPLEFT\", 2, -2)\n\t\ttab:GetNormalTexture():SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\ttab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\ttab:CreateBackdrop(\"Default\")\n\t\ttab.backdrop:SetAllPoints()\n\t\ttab:StyleButton(true)\n\telse\n\t\ttab:SetPoint(\"TOPLEFT\", object, \"TOPRIGHT\", 0, (-44 * index) + 18)\n\t\ttab:SetNormalTexture(texture)\n\tend\n\n\tif hat then\n\t\ttab:SetAttribute(\"type\", \"toy\")\n\t\ttab:SetAttribute(\"toy\", 134020)\n\telseif texture == 135805 then\t-- Cooking Fire\n\t\ttab:SetAttribute(\"type\", \"macro\")\n\t\ttab:SetAttribute(\"macrotext\", \"/cast [@player]\"..name)\n\telse\n\t\ttab:SetAttribute(\"type\", \"spell\")\n\t\ttab:SetAttribute(\"spell\", name)\n\tend\n\n\ttab:Show()\n\n\ttab.name = name\n\ttab.tooltip = rank and (rank ~= \"\" and rank ~= name) and format(\"%s (%s)\", name, rank) or name\n\n\ttabs[object][index] = tabs[object][index] or tab\n\ttabs[object].index = tabs[object].index + 1\nend\n\nlocal function GetProfessionRank(currentSkill, skillLineName)\n\tif skillLineName then\n\t\treturn skillLineName\n\tend\n\n\tif currentSkill <= 74 then\n\t\treturn APPRENTICE\n\tend\n\n\tfor index = #ranks, 1, -1 do\n\t\tlocal requiredSkill, title = ranks[index][1], ranks[index][2]\n\n\t\tif currentSkill >= requiredSkill then\n\t\t\treturn title\n\t\tend\n\tend\nend\n\nlocal function HandleProfession(object, professionID, hat)\n\tif professionID then\n\t\tlocal _, _, currentSkill, _, numAbilities, offset, skillID, _, _, _, skillLineName = GetProfessionInfo(professionID)\n\n\t\tif defaults[skillID] then\n\t\t\tfor index = 1, numAbilities do\n\t\t\t\tif defaults[skillID][index] then\n\t\t\t\t\tlocal name = GetSpellBookItemName(offset + index, \"profession\")\n\t\t\t\t\tlocal rank = GetProfessionRank(currentSkill, skillLineName)\n\t\t\t\t\tlocal texture = GetSpellBookItemTexture(offset + index, \"profession\")\n\n\t\t\t\t\tif name and rank and texture then\n\t\t\t\t\t\tUpdateTab(object, name, rank, texture)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif hat and PlayerHasToy(134020) and C_ToyBox.IsToyUsable(134020) then\n\t\t\tUpdateTab(object, GetSpellInfo(67556), nil, 236571, true)\n\t\tend\n\tend\nend\n\nlocal function HandleTabs(object)\n\tif not object then return end\n\ttabs[object] = tabs[object] or {}\n\n\tif InCombatLockdown() then\n\t\thandler:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\telse\n\t\tlocal firstProfession, secondProfession, archaeology, fishing, cooking = GetProfessions()\n\n\t\tResetTabs(object)\n\n\t\tHandleProfession(object, firstProfession)\n\t\tHandleProfession(object, secondProfession)\n\t\tHandleProfession(object, archaeology)\n\t\tHandleProfession(object, fishing)\n\t\tHandleProfession(object, cooking, true)\n\n\t\tfor index = 1, #spells do\n\t\t\tif IsSpellKnown(spells[index]) then\n\t\t\t\tlocal name, rank, texture = GetSpellInfo(spells[index])\n\t\t\t\tUpdateTab(object, name, rank, texture)\n\t\t\tend\n\t\tend\n\tend\n\n\tUpdateSelectedTabs(object)\nend\n\nfunction handler:TRADE_SKILL_SHOW(event)\n\tlocal owner = ATSWFrame or MRTSkillFrame or SkilletFrame or ProfessionsFrame\n\n\tif IsAddOnLoaded(\"TradeSkillDW\") and owner == ProfessionsFrame then\n\t\tself:UnregisterEvent(event)\n\telse\n\t\tHandleTabs(owner)\n\t\tUpdateSelectedTabs(owner)\n\tend\nend\n\nfunction handler:TRADE_SKILL_CLOSE()\n\tfor object in next, tabs do\n\t\tif object:IsShown() then\n\t\t\tUpdateSelectedTabs(object)\n\t\tend\n\tend\nend\n\nfunction handler:TRADE_SHOW(event)\n\tlocal owner = TradeFrame\n\n\tHandleTabs(owner)\n\tself[event] = function() UpdateSelectedTabs(owner) end\nend\n\nfunction handler:PLAYER_REGEN_ENABLED(event)\n\tself:UnregisterEvent(event)\n\n\tfor object in next, tabs do HandleTabs(object) end\nend\n\nfunction handler:SKILL_LINES_CHANGED()\n\tfor object in next, tabs do HandleTabs(object) end\nend\n\nfunction handler:CURRENT_SPELL_CAST_CHANGED(event)\n\tlocal numShown = 0\n\n\tfor object in next, tabs do\n\t\tif object:IsShown() then\n\t\t\tnumShown = numShown + 1\n\t\t\tUpdateSelectedTabs(object)\n\t\tend\n\tend\n\n\tif numShown == 0 then self:UnregisterEvent(event) end\nend"
  },
  {
    "path": "ShestakUI/Modules/Trade/SumAucBuyouts.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\nif C.trade.sum_buyouts ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tSum up all current auctions(Sigma by Ailae)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function(_, _, addon)\n\tif addon == \"Blizzard_AuctionHouseUI\" then\n\t\tlocal f = CreateFrame(\"Frame\", nil, AuctionHouseFrame)\n\t\tf:SetSize(200, 20)\n\t\tf:SetPoint(\"LEFT\", AuctionHouseFrame.MoneyFrameBorder, \"RIGHT\", 38, -1)\n\n\t\tlocal text = f:CreateFontString(nil, \"OVERLAY\", \"PriceFont\")\n\t\ttext:SetPoint(\"LEFT\")\n\n\t\tf:RegisterEvent(\"OWNED_AUCTIONS_UPDATED\")\n\t\tf:SetScript(\"OnEvent\", function()\n\t\t\tlocal totalBuyout = 0\n\t\t\tlocal totalBid = 0\n\n\t\t\tfor i = 1, C_AuctionHouse.GetNumOwnedAuctions() do\n\t\t\t\tlocal info = C_AuctionHouse.GetOwnedAuctionInfo(i)\n\t\t\t\tif info.buyoutAmount then\n\t\t\t\t\ttotalBuyout = totalBuyout + (info.buyoutAmount * info.quantity)\n\t\t\t\tend\n\t\t\t\tif info.bidAmount then\n\t\t\t\t\ttotalBid = totalBid + info.bidAmount\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif totalBid > 0 and totalBuyout > 0 then\n\t\t\t\ttext:SetText(BIDS..\": \"..GetCoinTextureString(totalBid)..\"     \"..BUYOUT..\": \"..GetCoinTextureString(totalBuyout))\n\t\t\telseif totalBid > 0 and totalBuyout == 0 then\n\t\t\t\ttext:SetText(BIDS..\": \"..GetCoinTextureString(totalBid))\n\t\t\telseif totalBid == 0 and totalBuyout > 0 then\n\t\t\t\ttext:SetText(BUYOUT..\": \"..GetCoinTextureString(totalBuyout))\n\t\t\telse\n\t\t\t\ttext:SetText(\"\")\n\t\t\tend\n\t\tend)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/Trade/TrainAll.lua",
    "content": "﻿local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n-- Learn all available skills(TrainAll by SDPhantom)\n----------------------------------------------------------------------------------------\nlocal frame = CreateFrame(\"Frame\")\nframe:RegisterEvent(\"ADDON_LOADED\")\nframe:SetScript(\"OnEvent\", function(_, _, addon)\n\tif addon == \"Blizzard_TrainerUI\" then\n\t\tlocal cost, num\n\t\tlocal button = CreateFrame(\"Button\", \"ClassTrainerTrainAllButton\", ClassTrainerFrame, \"UIPanelButtonTemplate\")\n\t\tbutton:SetText(ACHIEVEMENTFRAME_FILTER_ALL)\n\t\tbutton:SetScript(\"OnEnter\", function()\n\t\t\tGameTooltip:SetOwner(button, \"ANCHOR_RIGHT\")\n\t\t\tGameTooltip:SetText(AVAILABLE..\": \"..num..\"\\n\"..COSTS_LABEL..\" \"..GetMoneyString(cost))\n\t\tend)\n\t\tbutton:SetScript(\"OnLeave\", function()\n\t\t\tGameTooltip:Hide()\n\t\tend)\n\t\tif C.skins.blizzard_frames == true then\n\t\t\tbutton:SkinButton()\n\t\t\tbutton:SetPoint(\"TOPRIGHT\", ClassTrainerTrainButton, \"TOPLEFT\", -3, 0)\n\t\telse\n\t\t\tbutton:SetPoint(\"TOPRIGHT\", ClassTrainerTrainButton, \"TOPLEFT\", 0, 0)\n\t\tend\n\t\tbutton:SetWidth(min(50, button:GetTextWidth() + 15))\n\t\tbutton:SetScript(\"OnClick\", function()\n\t\t\tfor i = 1, GetNumTrainerServices() do\n\t\t\t\tif select(2, GetTrainerServiceInfo(i)) == \"available\" then\n\t\t\t\t\tBuyTrainerService(i)\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\t\thooksecurefunc(\"ClassTrainerFrame_Update\", function()\n\t\t\tnum, cost = 0, 0\n\t\t\tfor i = 1, GetNumTrainerServices() do\n\t\t\t\tif select(2, GetTrainerServiceInfo(i)) == \"available\" then\n\t\t\t\t\tnum = num + 1\n\t\t\t\t\tcost = cost + GetTrainerServiceCost(i)\n\t\t\t\tend\n\t\t\tend\n\t\t\tbutton:SetEnabled(num > 0)\n\t\tend)\n\tend\nend)"
  },
  {
    "path": "ShestakUI/Modules/UnitFrames/Colors.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\n\n----------------------------------------------------------------------------------------\n--\tColors\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nT.oUF_colors = setmetatable({\n\ttapped = {0.6, 0.6, 0.6},\n\tdisconnected = {0.84, 0.75, 0.65},\n\tpower = setmetatable({\n\t\t[\"MANA\"] = {0.31, 0.45, 0.63},\n\t\t[\"RAGE\"] = {0.69, 0.31, 0.31},\n\t\t[\"FOCUS\"] = {0.71, 0.43, 0.27},\n\t\t[\"ENERGY\"] = {0.65, 0.63, 0.35},\n\t\t[\"POWER_TYPE_FEL_ENERGY\"] = {0.65, 0.63, 0.35},\n\t\t[\"RUNES\"] = {0.55, 0.57, 0.61},\n\t\t[\"RUNIC_POWER\"] = {0, 0.82, 1},\n\t\t[\"AMMOSLOT\"] = {0.8, 0.6, 0},\n\t\t[\"FUEL\"] = {0, 0.55, 0.5},\n\t}, {__index = oUF.colors.power}),\n\treaction = setmetatable({\n\t\t[1] = {0.85, 0.27, 0.27}, -- Hated\n\t\t[2] = {0.85, 0.27, 0.27}, -- Hostile\n\t\t[3] = {0.85, 0.27, 0.27}, -- Unfriendly\n\t\t[4] = {0.85, 0.77, 0.36}, -- Neutral\n\t\t[5] = {0.33, 0.59, 0.33}, -- Friendly\n\t\t[6] = {0.33, 0.59, 0.33}, -- Honored\n\t\t[7] = {0.33, 0.59, 0.33}, -- Revered\n\t\t[8] = {0.33, 0.59, 0.33}, -- Exalted\n\t}, {__index = oUF.colors.reaction}),\n}, {__index = oUF.colors})"
  },
  {
    "path": "ShestakUI/Modules/UnitFrames/Functions.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tUnit frames functions\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\nT.oUF = oUF\n\nT.UpdateAllElements = function(frame)\n\tfor _, v in ipairs(frame.__elements) do\n\t\tv(frame, \"UpdateElement\", frame.unit)\n\tend\nend\n\nT.SetFontString = function(parent, fontName, fontHeight, fontStyle)\n\tlocal fs = parent:CreateFontString(nil, \"ARTWORK\")\n\tfs:SetFont(fontName, fontHeight, fontStyle)\n\tfs:SetShadowOffset(C.font.unit_frames_font_shadow and 1 or 0, C.font.unit_frames_font_shadow and -1 or 0)\n\treturn fs\nend\n\nT.PostUpdateHealth = function(health, unit, min, max)\n\tif unit and unit:find(\"arena%dtarget\") then return end\n\tif not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then\n\t\thealth:SetValue(0)\n\t\tif not UnitIsConnected(unit) then\n\t\t\thealth.value:SetText(\"|cffD7BEA5\"..L_UF_OFFLINE..\"|r\")\n\t\telseif UnitIsDead(unit) then\n\t\t\thealth.value:SetText(\"|cffD7BEA5\"..L_UF_DEAD..\"|r\")\n\t\telseif UnitIsGhost(unit) then\n\t\t\thealth.value:SetText(\"|cffD7BEA5\"..L_UF_GHOST..\"|r\")\n\t\tend\n\telse\n\t\tlocal r, g, b\n\t\tif (C.unitframe.own_color ~= true and C.unitframe.enemy_health_color and unit == \"target\" and UnitIsEnemy(unit, \"player\") and UnitIsPlayer(unit)) or (C.unitframe.own_color ~= true and unit == \"target\" and not UnitIsPlayer(unit) and UnitIsFriend(unit, \"player\")) then\n\t\t\tlocal c = T.oUF_colors.reaction[UnitReaction(unit, \"player\")]\n\t\t\tif c then\n\t\t\t\tr, g, b = c[1], c[2], c[3]\n\t\t\t\thealth:SetStatusBarColor(r, g, b)\n\t\t\telse\n\t\t\t\tr, g, b = 0.3, 0.7, 0.3\n\t\t\t\thealth:SetStatusBarColor(r, g, b)\n\t\t\tend\n\t\tend\n\t\tif unit == \"pet\" then\n\t\t\tlocal _, class = UnitClass(\"player\")\n\t\t\tlocal r, g, b = unpack(T.oUF_colors.class[class])\n\t\t\tif C.unitframe.own_color == true then\n\t\t\t\thealth:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\t\t\t\thealth.bg:SetVertexColor(0.1, 0.1, 0.1)\n\t\t\telse\n\t\t\t\tif b then\n\t\t\t\t\thealth:SetStatusBarColor(r, g, b)\n\t\t\t\t\tif health.bg and health.bg.multiplier then\n\t\t\t\t\t\tlocal mu = health.bg.multiplier\n\t\t\t\t\t\thealth.bg:SetVertexColor(r * mu, g * mu, b * mu)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif C.unitframe.bar_color_value == true and not UnitIsTapDenied(unit) then\n\t\t\tif C.unitframe.own_color == true then\n\t\t\t\tr, g, b = C.unitframe.uf_color[1], C.unitframe.uf_color[2], C.unitframe.uf_color[3]\n\t\t\telse\n\t\t\t\tr, g, b = health:GetStatusBarColor()\n\t\t\tend\n\t\t\tlocal newr, newg, newb = oUF:ColorGradient(min, max, 1, 0, 0, 1, 1, 0, r, g, b)\n\n\t\t\thealth:SetStatusBarColor(newr, newg, newb)\n\t\t\tif health.bg and health.bg.multiplier then\n\t\t\t\tlocal mu = health.bg.multiplier\n\t\t\t\thealth.bg:SetVertexColor(newr * mu, newg * mu, newb * mu)\n\t\t\tend\n\t\tend\n\t\tif min ~= max then\n\t\t\tr, g, b = oUF:ColorGradient(min, max, 0.69, 0.31, 0.31, 0.65, 0.63, 0.35, 0.33, 0.59, 0.33)\n\t\t\tif (unit == \"player\" and not UnitHasVehicleUI(\"player\") or unit == \"vehicle\") and health:GetAttribute(\"normalUnit\") ~= \"pet\" then\n\t\t\t\tif C.unitframe.show_total_value == true then\n\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cff559655%s|r |cffD7BEA5-|r |cff559655%s|r\", T.ShortValue(min), T.ShortValue(max))\n\t\t\t\t\telse\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cffffffff%s - %s|r\", T.ShortValue(min), T.ShortValue(max))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cffAF5050%d|r |cffD7BEA5-|r |cff%02x%02x%02x%d%%|r\", min, r * 255, g * 255, b * 255, floor(min / max * 100))\n\t\t\t\t\telse\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cffffffff%d - %d%%|r\", min, floor(min / max * 100))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif unit == \"target\" then\n\t\t\t\tif C.unitframe.show_total_value == true then\n\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cff559655%s|r |cffD7BEA5-|r |cff559655%s|r\", T.ShortValue(min), T.ShortValue(max))\n\t\t\t\t\telse\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cffffffff%s - %s|r\", T.ShortValue(min), T.ShortValue(max))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cff%02x%02x%02x%d%%|r |cffD7BEA5-|r |cffAF5050%s|r\", r * 255, g * 255, b * 255, floor(min / max * 100), T.ShortValue(min))\n\t\t\t\t\telse\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cffffffff%d%% - %s|r\", floor(min / max * 100), T.ShortValue(min))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif unit and unit:find(\"boss%d\") then\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\thealth.value:SetFormattedText(\"|cff%02x%02x%02x%d%%|r |cffD7BEA5-|r |cffAF5050%s|r\", r * 255, g * 255, b * 255, floor(min / max * 100), T.ShortValue(min))\n\t\t\t\telse\n\t\t\t\t\thealth.value:SetFormattedText(\"|cffffffff%d%% - %s|r\", floor(min / max * 100), T.ShortValue(min))\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\thealth.value:SetFormattedText(\"|cff%02x%02x%02x%d%%|r\", r * 255, g * 255, b * 255, floor(min / max * 100))\n\t\t\t\telse\n\t\t\t\t\thealth.value:SetFormattedText(\"|cffffffff%d%%|r\", floor(min / max * 100))\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif (unit == \"player\" and not UnitHasVehicleUI(\"player\") or unit == \"vehicle\") then\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\thealth.value:SetText(\"|cff559655\"..max..\"|r\")\n\t\t\t\telse\n\t\t\t\t\thealth.value:SetText(\"|cffffffff\"..max..\"|r\")\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\thealth.value:SetText(\"|cff559655\"..T.ShortValue(max)..\"|r\")\n\t\t\t\telse\n\t\t\t\t\thealth.value:SetText(\"|cffffffff\"..T.ShortValue(max)..\"|r\")\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nT.PostUpdateRaidHealth = function(health, unit, min, max)\n\tlocal self = health:GetParent()\n\tlocal power = self.Power\n\tlocal border = self.backdrop\n\tif not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then\n\t\thealth:SetValue(0)\n\t\tif not UnitIsConnected(unit) then\n\t\t\thealth.value:SetText(\"|cffD7BEA5\"..L_UF_OFFLINE..\"|r\")\n\t\telseif UnitIsDead(unit) then\n\t\t\thealth.value:SetText(\"|cffD7BEA5\"..L_UF_DEAD..\"|r\")\n\t\telseif UnitIsGhost(unit) then\n\t\t\thealth.value:SetText(\"|cffD7BEA5\"..L_UF_GHOST..\"|r\")\n\t\tend\n\telse\n\t\tlocal r, g, b\n\t\tif not UnitIsPlayer(unit) and UnitIsFriend(unit, \"player\") and C.unitframe.own_color ~= true then\n\t\t\tlocal c = T.oUF_colors.reaction[5]\n\t\t\tlocal r, g, b = c[1], c[2], c[3]\n\t\t\thealth:SetStatusBarColor(r, g, b)\n\t\t\tif health.bg and health.bg.multiplier then\n\t\t\t\tlocal mu = health.bg.multiplier\n\t\t\t\thealth.bg:SetVertexColor(r * mu, g * mu, b * mu)\n\t\t\tend\n\t\tend\n\t\tif C.unitframe.bar_color_value == true and not UnitIsTapDenied(unit) then\n\t\t\tif C.unitframe.own_color == true then\n\t\t\t\tr, g, b = C.unitframe.uf_color[1], C.unitframe.uf_color[2], C.unitframe.uf_color[3]\n\t\t\telse\n\t\t\t\tr, g, b = health:GetStatusBarColor()\n\t\t\tend\n\t\t\tlocal newr, newg, newb = oUF:ColorGradient(min, max, 1, 0, 0, 1, 1, 0, r, g, b)\n\n\t\t\thealth:SetStatusBarColor(newr, newg, newb)\n\t\t\tif health.bg and health.bg.multiplier then\n\t\t\t\tlocal mu = health.bg.multiplier\n\t\t\t\thealth.bg:SetVertexColor(newr * mu, newg * mu, newb * mu)\n\t\t\tend\n\t\tend\n\t\tif min ~= max then\n\t\t\tr, g, b = oUF:ColorGradient(min, max, 0.69, 0.31, 0.31, 0.65, 0.63, 0.35, 0.33, 0.59, 0.33)\n\t\t\tif self:GetParent():GetName():match(\"oUF_PartyDPS\") then\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\thealth.value:SetFormattedText(\"|cffAF5050%s|r |cffD7BEA5-|r |cff%02x%02x%02x%d%%|r\", T.ShortValue(min), r * 255, g * 255, b * 255, floor(min / max * 100))\n\t\t\t\telse\n\t\t\t\t\thealth.value:SetFormattedText(\"|cffffffff%s - %d%%|r\", T.ShortValue(min), floor(min / max * 100))\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\tif C.raidframe.deficit_health == true then\n\t\t\t\t\t\thealth.value:SetText(\"|cffffffff\"..\"-\"..T.ShortValue(max - min))\n\t\t\t\t\telse\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cff%02x%02x%02x%d%%|r\", r * 255, g * 255, b * 255, floor(min / max * 100))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif C.raidframe.deficit_health == true then\n\t\t\t\t\t\thealth.value:SetText(\"|cffffffff\"..\"-\"..T.ShortValue(max - min))\n\t\t\t\t\telse\n\t\t\t\t\t\thealth.value:SetFormattedText(\"|cffffffff%d%%|r\", floor(min / max * 100))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif C.unitframe.color_value == true then\n\t\t\t\thealth.value:SetText(\"|cff559655\"..T.ShortValue(max)..\"|r\")\n\t\t\telse\n\t\t\t\thealth.value:SetText(\"|cffffffff\"..T.ShortValue(max)..\"|r\")\n\t\t\tend\n\t\tend\n\t\tif C.raidframe.alpha_health == true then\n\t\t\tif min / max > 0.95 then\n\t\t\t\thealth:SetAlpha(0.6)\n\t\t\t\tpower:SetAlpha(0.6)\n\t\t\t\tborder:SetAlpha(0.6)\n\t\t\telse\n\t\t\t\thealth:SetAlpha(1)\n\t\t\t\tpower:SetAlpha(1)\n\t\t\t\tborder:SetAlpha(1)\n\t\t\tend\n\t\tend\n\tend\nend\n\nT.PreUpdatePower = function(power, unit)\n\tlocal _, pToken = UnitPowerType(unit)\n\n\tlocal color = T.oUF_colors.power[pToken]\n\tif color then\n\t\tpower:SetStatusBarColor(color[1], color[2], color[3])\n\tend\nend\n\nT.PostUpdatePower = function(power, unit, cur, _, max)\n\tif unit and unit:find(\"arena%dtarget\") then return end\n\tlocal self = power:GetParent()\n\tlocal pType, pToken = UnitPowerType(unit)\n\tlocal color = T.oUF_colors.power[pToken]\n\n\tif color then\n\t\tpower.value:SetTextColor(color[1], color[2], color[3])\n\tend\n\n\tif not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then\n\t\tpower:SetValue(0)\n\tend\n\n\tif unit == \"focus\" or unit == \"focustarget\" or unit == \"targettarget\" or (self:GetParent():GetName():match(\"oUF_RaidDPS\")) then return end\n\n\tif not UnitIsConnected(unit) then\n\t\tpower.value:SetText()\n\telseif UnitIsDead(unit) or UnitIsGhost(unit) or max == 0 then\n\t\tpower.value:SetText()\n\telse\n\t\tif cur ~= max then\n\t\t\tif pType == 0 and pToken ~= \"POWER_TYPE_DINO_SONIC\" then\n\t\t\t\tif unit == \"target\" then\n\t\t\t\t\tif C.unitframe.show_total_value == true then\n\t\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"%s |cffD7BEA5-|r %s\", T.ShortValue(max - (max - cur)), T.ShortValue(max))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"|cffffffff%s - %s|r\", T.ShortValue(max - (max - cur)), T.ShortValue(max))\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"%d%% |cffD7BEA5-|r %s\", floor(cur / max * 100), T.ShortValue(max - (max - cur)))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"|cffffffff%d%% - %s|r\", floor(cur / max * 100), T.ShortValue(max - (max - cur)))\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\telseif (unit == \"player\" and power:GetAttribute(\"normalUnit\") == \"pet\") or unit == \"pet\" then\n\t\t\t\t\tif C.unitframe.show_total_value == true then\n\t\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"%s |cffD7BEA5-|r %s\", T.ShortValue(max - (max - cur)), T.ShortValue(max))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"%s |cffffffff-|r %s\", T.ShortValue(max - (max - cur)), T.ShortValue(max))\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"%d%%\", floor(cur / max * 100))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"|cffffffff%d%%|r\", floor(cur / max * 100))\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\telseif unit and (unit:find(\"arena%d\") or unit:find(\"boss%d\")) then\n\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\tpower.value:SetFormattedText(\"|cffD7BEA5%d%% - %s|r\", floor(cur / max * 100), T.ShortValue(max - (max - cur)))\n\t\t\t\t\telse\n\t\t\t\t\t\tpower.value:SetFormattedText(\"|cffffffff%d%% - %s|r\", floor(cur / max * 100), T.ShortValue(max - (max - cur)))\n\t\t\t\t\tend\n\t\t\t\telseif self:GetParent():GetName():match(\"oUF_PartyDPS\") then\n\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\tpower.value:SetFormattedText(\"%s |cffD7BEA5-|r %d%%\", T.ShortValue(max - (max - cur)), floor(cur / max * 100))\n\t\t\t\t\telse\n\t\t\t\t\t\tpower.value:SetFormattedText(\"|cffffffff%s - %d%%|r\", T.ShortValue(max - (max - cur)), floor(cur / max * 100))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif C.unitframe.show_total_value == true then\n\t\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"%s |cffD7BEA5-|r %s\", T.ShortValue(max - (max - cur)), T.ShortValue(max))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"|cffffffff%s - %s|r\", T.ShortValue(max - (max - cur)), T.ShortValue(max))\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"%d |cffD7BEA5-|r %d%%\", max - (max - cur), floor(cur / max * 100))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpower.value:SetFormattedText(\"|cffffffff%d - %d%%|r\", max - (max - cur), floor(cur / max * 100))\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\tpower.value:SetText(max - (max - cur))\n\t\t\t\telse\n\t\t\t\t\tpower.value:SetText(\"|cffffffff\"..max - (max - cur)..\"|r\")\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif unit == \"pet\" or unit == \"target\" or (unit and unit:find(\"arena%d\")) or (self:GetParent():GetName():match(\"oUF_PartyDPS\")) then\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\tpower.value:SetText(T.ShortValue(cur))\n\t\t\t\telse\n\t\t\t\t\tpower.value:SetText(\"|cffffffff\"..T.ShortValue(cur)..\"|r\")\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif C.unitframe.color_value == true then\n\t\t\t\t\tpower.value:SetText(cur)\n\t\t\t\telse\n\t\t\t\t\tpower.value:SetText(\"|cffffffff\"..cur..\"|r\")\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal SetUpAnimGroup = function(self)\n\tself.anim = self:CreateAnimationGroup()\n\tself.anim:SetLooping(\"BOUNCE\")\n\tself.anim.fade = self.anim:CreateAnimation(\"Alpha\")\n\tself.anim.fade:SetFromAlpha(1)\n\tself.anim.fade:SetToAlpha(0)\n\tself.anim.fade:SetDuration(0.6)\n\tself.anim.fade:SetSmoothing(\"IN_OUT\")\nend\n\nlocal Flash = function(self)\n\tif not self.anim then\n\t\tSetUpAnimGroup(self)\n\tend\n\n\tif not self.anim:IsPlaying() then\n\t\tself.anim:Play()\n\tend\nend\n\nlocal StopFlash = function(self)\n\tif self.anim then\n\t\tself.anim:Finish()\n\tend\nend\n\nT.UpdateManaLevel = function(self, elapsed)\n\tself.elapsed = (self.elapsed or 0) + elapsed\n\tif self.elapsed < 0.2 then return end\n\tself.elapsed = 0\n\n\tif UnitPowerType(\"player\") == 0 then\n\t\tlocal cur = UnitPower(\"player\", 0)\n\t\tlocal max = UnitPowerMax(\"player\", 0)\n\t\tlocal percMana = max > 0 and (cur / max * 100) or 100\n\t\tif percMana <= 20 and not UnitIsDeadOrGhost(\"player\") then\n\t\t\tself.ManaLevel:SetText(\"|cffaf5050\"..MANA_LOW..\"|r\")\n\t\t\tFlash(self)\n\t\telse\n\t\t\tself.ManaLevel:SetText()\n\t\t\tStopFlash(self)\n\t\tend\n\telseif T.class ~= \"DRUID\" and T.class ~= \"PRIEST\" and T.class ~= \"SHAMAN\" then\n\t\tself.ManaLevel:SetText()\n\t\tStopFlash(self)\n\tend\nend\n\nT.UpdateClassMana = function(self)\n\tif self.unit ~= \"player\" then return end\n\n\tif UnitPowerType(\"player\") ~= 0 then\n\t\tlocal min = UnitPower(\"player\", 0)\n\t\tlocal max = UnitPowerMax(\"player\", 0)\n\t\tlocal percMana = max > 0 and (min / max * 100) or 100\n\t\tif percMana <= 20 and not UnitIsDeadOrGhost(\"player\") then\n\t\t\tself.FlashInfo.ManaLevel:SetText(\"|cffaf5050\"..MANA_LOW..\"|r\")\n\t\t\tFlash(self.FlashInfo)\n\t\telse\n\t\t\tself.FlashInfo.ManaLevel:SetText()\n\t\t\tStopFlash(self.FlashInfo)\n\t\tend\n\n\t\tif min ~= max then\n\t\t\tif self.Power.value:GetText() then\n\t\t\t\tself.ClassMana:SetPoint(\"RIGHT\", self.Power.value, \"LEFT\", -1, 0)\n\t\t\t\tself.ClassMana:SetFormattedText(\"%d%%|r |cffD7BEA5-|r\", floor(min / max * 100))\n\t\t\t\tself.ClassMana:SetJustifyH(\"RIGHT\")\n\t\t\telse\n\t\t\t\tself.ClassMana:SetPoint(\"LEFT\", self.Power, \"LEFT\", 4, 0)\n\t\t\t\tself.ClassMana:SetFormattedText(\"%d%%\", floor(min / max * 100))\n\t\t\tend\n\t\telse\n\t\t\tself.ClassMana:SetText()\n\t\tend\n\n\t\tself.ClassMana:SetAlpha(1)\n\telse\n\t\tself.ClassMana:SetAlpha(0)\n\tend\nend\n\nT.UpdatePvPStatus = function(self)\n\tlocal unit = self.unit\n\n\tif self.Status then\n\t\tlocal factionGroup = UnitFactionGroup(unit)\n\t\tif UnitIsPVPFreeForAll(unit) then\n\t\t\tself.Status:SetText(PVP)\n\t\telseif factionGroup and UnitIsPVP(unit) then\n\t\t\tself.Status:SetText(PVP)\n\t\telse\n\t\t\tself.Status:SetText(\"\")\n\t\tend\n\tend\nend\n\nlocal ticks = {}\nlocal setBarTicks = function(Castbar, numTicks)\n\tfor _, v in pairs(ticks) do\n\t\tv:Hide()\n\tend\n\tif numTicks and numTicks > 0 then\n\t\tlocal delta = Castbar:GetWidth() / numTicks\n\t\tfor i = 1, numTicks do\n\t\t\tif not ticks[i] then\n\t\t\t\tticks[i] = Castbar:CreateTexture(nil, \"OVERLAY\")\n\t\t\t\tticks[i]:SetTexture(C.media.texture)\n\t\t\t\tticks[i]:SetVertexColor(unpack(C.media.border_color))\n\t\t\t\tticks[i]:SetWidth(1)\n\t\t\t\tticks[i]:SetHeight(Castbar:GetHeight())\n\t\t\t\tticks[i]:SetDrawLayer(\"OVERLAY\", 7)\n\t\t\tend\n\t\t\tticks[i]:ClearAllPoints()\n\t\t\tticks[i]:SetPoint(\"CENTER\", Castbar, \"RIGHT\", -delta * i, 0)\n\t\t\tticks[i]:Show()\n\t\tend\n\tend\nend\n\nlocal function castColor(unit)\n\tlocal r, g, b\n\tif UnitIsPlayer(unit) then\n\t\tlocal _, class = UnitClass(unit)\n\t\tlocal color = T.oUF_colors.class[class]\n\t\tif color then\n\t\t\tr, g, b = color[1], color[2], color[3]\n\t\tend\n\telse\n\t\tlocal reaction = UnitReaction(unit, \"player\")\n\t\tlocal color = T.oUF_colors.reaction[reaction]\n\t\tif color and reaction >= 5 then\n\t\t\tr, g, b = color[1], color[2], color[3]\n\t\telse\n\t\t\tr, g, b = 0.85, 0.77, 0.36\n\t\tend\n\tend\n\n\treturn r, g, b\nend\n\nT.PostCastStart = function(Castbar, unit)\n\tif unit == \"vehicle\" then unit = \"player\" end\n\n\tif unit == \"player\" and C.unitframe.castbar_latency == true and Castbar.Latency then\n\t\tlocal _, _, _, ms = GetNetStats()\n\t\tCastbar.Latency:SetText((\"%dms\"):format(ms))\n\t\tif Castbar.casting then\n\t\t\tCastbar.SafeZone:SetDrawLayer(\"BORDER\")\n\t\t\tCastbar.SafeZone:SetVertexColor(0.85, 0.27, 0.27)\n\t\telse\n\t\t\tCastbar.SafeZone:SetDrawLayer(\"ARTWORK\")\n\t\t\tCastbar.SafeZone:SetVertexColor(0.85, 0.27, 0.27, 0.75)\n\t\tend\n\tend\n\n\tif unit == \"player\" and C.unitframe.castbar_ticks == true then\n\t\tif Castbar.casting then\n\t\t\tsetBarTicks(Castbar, 0)\n\t\telse\n\t\t\tlocal spell = UnitChannelInfo(unit)\n\t\t\tCastbar.channelingTicks = T.CastBarTicks[spell] or 0\n\t\t\tsetBarTicks(Castbar, Castbar.channelingTicks)\n\t\tend\n\tend\n\n\tif Castbar.notInterruptible and UnitCanAttack(\"player\", unit) then\n\t\tCastbar:SetStatusBarColor(0.8, 0, 0)\n\t\tCastbar.bg:SetVertexColor(0.8, 0, 0, 0.2)\n\t\tCastbar.Overlay:SetBackdropBorderColor(0.8, 0, 0)\n\t\tif C.unitframe.castbar_icon == true and (unit == \"target\" or unit == \"focus\") then\n\t\t\tCastbar.Button:SetBackdropBorderColor(0.8, 0, 0)\n\t\tend\n\telse\n\t\tif unit == \"pet\" or unit == \"vehicle\" then\n\t\t\tlocal _, class = UnitClass(\"player\")\n\t\t\tlocal r, g, b = unpack(T.oUF_colors.class[class])\n\t\t\tif C.unitframe.own_color == true then\n\t\t\t\tCastbar:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\t\t\t\tCastbar.bg:SetVertexColor(C.unitframe.uf_color_bg[1], C.unitframe.uf_color_bg[2], C.unitframe.uf_color_bg[3], 1)\n\t\t\telse\n\t\t\t\tif b then\n\t\t\t\t\tCastbar:SetStatusBarColor(r, g, b)\n\t\t\t\t\tCastbar.bg:SetVertexColor(r, g, b, 0.2)\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif C.unitframe.own_color == true then\n\t\t\t\tCastbar:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\t\t\t\tCastbar.bg:SetVertexColor(C.unitframe.uf_color_bg[1], C.unitframe.uf_color_bg[2], C.unitframe.uf_color_bg[3], 1)\n\t\t\telse\n\t\t\t\tlocal r, g, b = castColor(unit)\n\t\t\t\tCastbar:SetStatusBarColor(r, g, b)\n\t\t\t\tCastbar.bg:SetVertexColor(r, g, b, 0.2)\n\t\t\tend\n\t\tend\n\t\tCastbar.Overlay:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tif C.unitframe.castbar_icon == true and (unit == \"target\" or unit == \"focus\") then\n\t\t\tCastbar.Button:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\tend\n\n\tif Castbar.Time and Castbar.Text then\n\t\tlocal timeWidth = Castbar.Time:GetStringWidth()\n\t\tlocal textWidth = Castbar:GetWidth() - timeWidth - 5\n\n\t\tif timeWidth == 0 then\n\t\t\tC_Timer.After(0.05, function()\n\t\t\t\ttextWidth = Castbar:GetWidth() - Castbar.Time:GetStringWidth() - 5\n\t\t\t\tif textWidth > 0 then\n\t\t\t\t\tCastbar.Text:SetWidth(textWidth)\n\t\t\t\tend\n\t\t\tend)\n\t\telse\n\t\t\tCastbar.Text:SetWidth(textWidth)\n\t\tend\n\tend\nend\n\nT.CustomCastTimeText = function(self, duration)\n\tself.Time:SetText((\"%.1f / %.1f\"):format(self.channeling and duration or self.max - duration, self.max))\nend\n\nT.CustomCastDelayText = function(self, duration)\n\tself.Time:SetText((\"%.1f |cffaf5050%s %.1f|r\"):format(self.channeling and duration or self.max - duration, self.channeling and \"-\" or \"+\", abs(self.delay)))\nend\n\nT.AuraTrackerTime = function(self, elapsed)\n\tif self.active then\n\t\tself.timeleft = self.timeleft - elapsed\n\t\tif self.timeleft <= 5 then\n\t\t\tself.text:SetTextColor(1, 0, 0)\n\t\telse\n\t\t\tself.text:SetTextColor(1, 1, 1)\n\t\tend\n\t\tif self.timeleft <= 0 then\n\t\t\tself.icon:SetTexture(\"\")\n\t\t\tself.text:SetText(\"\")\n\t\tend\n\t\tself.text:SetFormattedText(\"%.1f\", self.timeleft)\n\tend\nend\n\nT.HideAuraFrame = function(self)\n\tif self.unit == \"player\" then\n\t\tif not C.aura.player_auras then\n\t\t\tBuffFrame:Hide()\n\t\t\tself.Debuffs:Hide()\n\t\tend\n\telseif self.unit == \"pet\" and not C.aura.pet_debuffs or self.unit == \"focus\" and not C.aura.focus_debuffs\n\tor self.unit == \"focustarget\" and not C.aura.fot_debuffs or self.unit == \"targettarget\" and not C.aura.tot_debuffs then\n\t\tself.Debuffs:Hide()\n\telseif self.unit == \"target\" and not C.aura.target_auras then\n\t\tself.Auras:Hide()\n\tend\nend\n\nT.PostCreateIcon = function(element, button)\n\tbutton:SetTemplate(\"Default\")\n\n\tbutton.remaining = T.SetFontString(button, C.font.auras_font, C.font.auras_font_size, C.font.auras_font_style)\n\tbutton.remaining:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)\n\tbutton.remaining:SetPoint(\"CENTER\", button, \"CENTER\", 1, 1)\n\tbutton.remaining:SetJustifyH(\"CENTER\")\n\n\tbutton.Cooldown.noCooldownCount = true\n\n\tbutton.Icon:SetPoint(\"TOPLEFT\", 2, -2)\n\tbutton.Icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\tbutton.Count:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMRIGHT\", 1, 0)\n\tbutton.Count:SetJustifyH(\"RIGHT\")\n\tbutton.Count:SetFont(C.font.auras_font, C.font.auras_font_size, C.font.auras_font_style)\n\tbutton.Count:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)\n\n\tif C.aura.show_spiral == true then\n\t\telement.disableCooldown = false\n\t\tbutton.Cooldown:SetReverse(true)\n\t\tbutton.Cooldown:SetPoint(\"TOPLEFT\", button, \"TOPLEFT\", 2, -2)\n\t\tbutton.Cooldown:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMRIGHT\", -2, 2)\n\t\tbutton.parent = CreateFrame(\"Frame\", nil, button)\n\t\tbutton.parent:SetFrameLevel(button.Cooldown:GetFrameLevel() + 1)\n\t\tbutton.Count:SetParent(button.parent)\n\t\tbutton.remaining:SetParent(button.parent)\n\telse\n\t\telement.disableCooldown = true\n\tend\nend\n\nlocal day, hour, minute = 86400, 3600, 60\nlocal FormatTime = function(s)\n\tif s >= day then\n\t\treturn format(\"%dd\", floor(s / day + 0.5))\n\telseif s >= hour then\n\t\treturn format(\"%dh\", floor(s / hour + 0.5))\n\telseif s >= minute then\n\t\treturn format(\"%dm\", floor(s / minute + 0.5))\n\telseif s >= 5 then\n\t\treturn floor(s + 0.5)\n\tend\n\treturn format(\"%.1f\", s)\nend\n\nT.CreateAuraTimer = function(self, elapsed)\n\tif self.timeLeft then\n\t\tself.elapsed = (self.elapsed or 0) + elapsed\n\t\tif self.elapsed >= 0.1 then\n\t\t\tif not self.first then\n\t\t\t\tself.timeLeft = self.timeLeft - self.elapsed\n\t\t\telse\n\t\t\t\tself.timeLeft = self.timeLeft - GetTime()\n\t\t\t\tself.first = false\n\t\t\tend\n\t\t\tif self.timeLeft > 0 then\n\t\t\t\tlocal time = FormatTime(self.timeLeft)\n\t\t\t\tself.remaining:SetText(time)\n\t\t\telse\n\t\t\t\tself.remaining:Hide()\n\t\t\t\tself:SetScript(\"OnUpdate\", nil)\n\t\t\tend\n\t\t\tself.elapsed = 0\n\t\tend\n\tend\nend\n\n\nlocal playerUnits = {\n\tplayer = true,\n\tpet = true,\n\tvehicle = true,\n}\n\nT.PostUpdateIcon = function(_, button, unit, data)\n\tif data.isHarmful then\n\t\tif not UnitIsFriend(\"player\", unit) and not playerUnits[data.sourceUnit] then\n\t\t\tif not C.aura.player_aura_only then\n\t\t\t\tbutton:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\tbutton.Icon:SetDesaturated(true)\n\t\t\tend\n\t\telse\n\t\t\tif C.aura.debuff_color_type == true then\n\t\t\t\tlocal color = DebuffTypeColor[data.dispelName] or DebuffTypeColor.none\n\t\t\t\tbutton:SetBackdropBorderColor(color.r, color.g, color.b)\n\t\t\t\tbutton.Icon:SetDesaturated(false)\n\t\t\telse\n\t\t\t\tbutton:SetBackdropBorderColor(1, 0, 0)\n\t\t\tend\n\t\tend\n\telse\n\t\tif (data.isStealable or ((T.class == \"MAGE\" or T.class == \"PRIEST\" or T.class == \"SHAMAN\" or T.class == \"HUNTER\") and data.dispelName == \"Magic\")) and not UnitIsFriend(\"player\", unit) then\n\t\t\tbutton:SetBackdropBorderColor(1, 0.85, 0)\n\t\telse\n\t\t\tbutton:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\t\tbutton.Icon:SetDesaturated(false)\n\tend\n\n\tif data.duration and data.duration > 0 and C.aura.show_timer == true then\n\t\tbutton.remaining:Show()\n\t\tbutton.timeLeft = data.expirationTime\n\t\tbutton:SetScript(\"OnUpdate\", T.CreateAuraTimer)\n\telse\n\t\tbutton.remaining:Hide()\n\t\tbutton.timeLeft = math.huge\n\t\tbutton:SetScript(\"OnUpdate\", nil)\n\tend\n\n\tbutton.first = true\nend\n\nT.CustomFilter = function(element, unit, data)\n\tif C.aura.player_aura_only then\n\t\tif data.isHarmful then\n\t\t\tif not UnitIsFriend(\"player\", unit) and not playerUnits[data.sourceUnit] then\n\t\t\t\treturn false\n\t\t\tend\n\t\tend\n\tend\n\treturn true\nend\n\nT.CustomFilterBoss = function(element, unit, data)\n\tif data.isHarmful then\n\t\tif (playerUnits[data.sourceUnit] or data.sourceUnit == unit) then\n\t\t\tif (T.DebuffBlackList and not T.DebuffBlackList[data.name]) or not T.DebuffBlackList then\n\t\t\t\treturn true\n\t\t\tend\n\t\tend\n\t\treturn false\n\tend\n\treturn true\nend\n\nT.UpdateThreat = function(self, unit, status, r, g, b)\n\tlocal parent = self:GetParent()\n\tlocal badunit = not unit or parent.unit ~= unit\n\n\tif not badunit and status and status > 1 then\n\t\tparent.backdrop:SetBackdropBorderColor(r, g, b)\n\telse\n\t\tparent.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\tend\nend\n\nlocal CountOffSets = {\n\tTOPLEFT = {\"LEFT\", \"RIGHT\", 1, 0},\n\tTOPRIGHT = {\"RIGHT\", \"LEFT\", 2, 0},\n\tBOTTOMLEFT = {\"LEFT\", \"RIGHT\", 1, 0},\n\tBOTTOMRIGHT = {\"RIGHT\", \"LEFT\", 2, 0},\n\tLEFT = {\"LEFT\", \"RIGHT\", 1, 0},\n\tRIGHT = {\"RIGHT\", \"LEFT\", 2, 0},\n\tTOP = {\"RIGHT\", \"LEFT\", 2, 0},\n\tBOTTOM = {\"RIGHT\", \"LEFT\", 2, 0},\n}\n\nT.CreateAuraWatchIcon = function(_, icon)\n\ticon:SetTemplate(\"Default\")\n\ticon.icon:SetPoint(\"TOPLEFT\", icon, 1, -1)\n\ticon.icon:SetPoint(\"BOTTOMRIGHT\", icon, -1, 1)\n\ticon.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\ticon.icon:SetDrawLayer(\"ARTWORK\")\n\tif icon.cd then\n\t\ticon.cd:SetReverse(true)\n\tend\nend\n\nT.CreateAuraWatch = function(self)\n\tlocal auras = CreateFrame(\"Frame\", nil, self)\n\tauras:SetPoint(\"TOPLEFT\", self.Health, 0, 0)\n\tauras:SetPoint(\"BOTTOMRIGHT\", self.Health, 0, 0)\n\tauras.icons = {}\n\tauras.PostCreateIcon = T.CreateAuraWatchIcon\n\n\tif not C.aura.show_timer then\n\t\tauras.hideCooldown = true\n\tend\n\n\tlocal buffs = {}\n\n\tif T.RaidBuffs[\"ALL\"] then\n\t\tfor _, value in pairs(T.RaidBuffs[\"ALL\"]) do\n\t\t\ttinsert(buffs, value)\n\t\tend\n\tend\n\n\tif T.RaidBuffs[T.class] then\n\t\tfor _, value in pairs(T.RaidBuffs[T.class]) do\n\t\t\ttinsert(buffs, value)\n\t\tend\n\tend\n\n\tif buffs then\n\t\tfor _, spell in pairs(buffs) do\n\t\t\tlocal icon = CreateFrame(\"Frame\", nil, auras)\n\t\t\ticon.spellID = spell[1]\n\t\t\ticon.anyUnit = spell[4]\n\t\t\ticon.strictMatching = spell[5]\n\t\t\ticon:SetSize(7 * C.raidframe.icon_multiplier, 7 * C.raidframe.icon_multiplier)\n\t\t\ticon:SetPoint(spell[2], 0, 0)\n\n\t\t\tlocal tex = icon:CreateTexture(nil, \"OVERLAY\")\n\t\t\ttex:SetAllPoints(icon)\n\t\t\ttex:SetTexture(C.media.blank)\n\t\t\tif spell[3] then\n\t\t\t\ttex:SetVertexColor(unpack(spell[3]))\n\t\t\telse\n\t\t\t\ttex:SetVertexColor(0.8, 0.8, 0.8)\n\t\t\tend\n\t\t\ticon.icon = tex\n\n\t\t\tlocal count = T.SetFontString(icon, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\tlocal point, anchorPoint, x, y = unpack(CountOffSets[spell[2]])\n\t\t\tcount:SetPoint(point, icon, anchorPoint, x, y)\n\t\t\ticon.count = count\n\n\t\t\tauras.icons[spell[1]] = icon\n\t\tend\n\tend\n\n\tself.AuraWatch = auras\nend\n\nT.CreateHealthPrediction = function(self)\n\tlocal mhpb = self.Health:CreateTexture(nil, \"ARTWORK\")\n\tmhpb:SetTexture(C.media.texture)\n\tmhpb:SetVertexColor(0, 1, 0.5, 0.2)\n\n\tlocal ohpb = self.Health:CreateTexture(nil, \"ARTWORK\")\n\tohpb:SetTexture(C.media.texture)\n\tohpb:SetVertexColor(0, 1, 0, 0.2)\n\n\tlocal ahpb = self.Health:CreateTexture(nil, \"ARTWORK\")\n\tahpb:SetTexture(C.media.texture)\n\tahpb:SetVertexColor(1, 1, 0, 0.2)\n\n\tlocal hab = self.Health:CreateTexture(nil, \"ARTWORK\")\n\thab:SetTexture(C.media.texture)\n\thab:SetVertexColor(1, 0, 0, 0.4)\n\n\tlocal oa = self.Health:CreateTexture(nil, \"ARTWORK\")\n\toa:SetTexture([[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Cross.tga]], \"REPEAT\", \"REPEAT\")\n\toa:SetVertexColor(0.5, 0.5, 1)\n\toa:SetHorizTile(true)\n\toa:SetVertTile(true)\n\toa:SetAlpha(0.4)\n\toa:SetBlendMode(\"ADD\")\n\n\tlocal oha = self.Health:CreateTexture(nil, \"ARTWORK\")\n\toha:SetTexture([[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Cross.tga]], \"REPEAT\", \"REPEAT\")\n\toha:SetVertexColor(1, 0, 0)\n\toha:SetHorizTile(true)\n\toha:SetVertTile(true)\n\toha:SetAlpha(0.4)\n\toha:SetBlendMode(\"ADD\")\n\n\tself.HealthPrediction = {\n\t\tmyBar = mhpb,\n\t\totherBar = ohpb,\n\t\tabsorbBar = ahpb,\n\t\thealAbsorbBar = hab,\n\t\toverAbsorb = C.raidframe.plugins_over_absorb and oa,\n\t\toverHealAbsorb = C.raidframe.plugins_over_heal_absorb and oha\n\t}\nend"
  },
  {
    "path": "ShestakUI/Modules/UnitFrames/Layout.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tUnitFrames based on oUF_Caellian(by Caellian)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\n-- Frame size\nif C.unitframe.extra_height_auto then\n\tC.unitframe.extra_health_height = C.font.unit_frames_font_size - 8\n\tC.unitframe.extra_power_height = C.font.unit_frames_font_size - 8\nend\nT.extraHeight = C.unitframe.extra_health_height + C.unitframe.extra_power_height\n\nlocal player_width = C.unitframe.player_width\nlocal pet_width = (player_width - 7) / 2\nlocal boss_width = C.unitframe.boss_width\n\n-- Create layout\nlocal function Shared(self, unit)\n\t-- Set our own colors\n\tself.colors = T.oUF_colors\n\n\t-- Register click\n\tself:RegisterForClicks(\"AnyUp\")\n\tself:SetScript(\"OnEnter\", UnitFrame_OnEnter)\n\tself:SetScript(\"OnLeave\", UnitFrame_OnLeave)\n\n\tlocal unit = (unit and unit:find(\"arena%dtarget\")) and \"arenatarget\"\n\tor (unit and unit:find(\"arena%d\")) and \"arena\"\n\tor (unit and unit:find(\"boss%d\")) and \"boss\" or unit\n\n\t-- Menu\n\tif (unit == \"arena\" and C.unitframe.show_arena == true and unit ~= \"arenatarget\") or (unit == \"boss\" and C.unitframe.show_boss == true) then\n\t\tself:SetAttribute(\"type2\", \"focus\")\n\t\tself:SetAttribute(\"type3\", \"macro\")\n\t\tself:SetAttribute(\"macrotext3\", \"/clearfocus\")\n\t\tself:SetAttribute('oUF-enableArenaPrep', false)\n\telse\n\t\tself:SetAttribute(\"*type2\", \"togglemenu\")\n\tend\n\n\t-- Backdrop for every units\n\tself:CreateBackdrop(\"Default\")\n\tself:SetFrameStrata(\"BACKGROUND\")\n\tself.backdrop:SetFrameLevel(3)\n\n\t-- Health bar\n\tself.Health = CreateFrame(\"StatusBar\", self:GetName()..\"_Health\", self)\n\tif unit == \"player\" or unit == \"target\" or unit == \"arena\" or unit == \"boss\" then\n\t\tself.Health:SetHeight(21 + C.unitframe.extra_health_height)\n\telseif unit == \"arenatarget\" then\n\t\tself.Health:SetHeight(27 + T.extraHeight)\n\telse\n\t\tself.Health:SetHeight(13 + (C.unitframe.extra_health_height / 2))\n\tend\n\tself.Health:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", 0, 0)\n\tself.Health:SetPoint(\"TOPRIGHT\", self, \"TOPRIGHT\", 0, 0)\n\tself.Health:SetStatusBarTexture(C.media.texture)\n\n\tif C.unitframe.own_color == true then\n\t\tself.Health.colorTapping = false\n\t\tself.Health.colorDisconnected = false\n\t\tself.Health.colorClass = false\n\t\tself.Health.colorReaction = false\n\t\tself.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\telse\n\t\tself.Health.colorTapping = true\n\t\tself.Health.colorDisconnected = true\n\t\tself.Health.colorClass = true\n\t\tself.Health.colorReaction = true\n\tend\n\tif C.unitframe.plugins_smooth_bar == true then\n\t\tself.Health.Smooth = true\n\tend\n\n\tself.Health.PostUpdate = T.PostUpdateHealth\n\n\t-- Health bar background\n\tself.Health.bg = self.Health:CreateTexture(nil, \"BORDER\")\n\tself.Health.bg:SetAllPoints()\n\tself.Health.bg:SetTexture(C.media.texture)\n\tif C.unitframe.own_color == true then\n\t\tself.Health.bg:SetVertexColor(unpack(C.unitframe.uf_color_bg))\n\telse\n\t\tself.Health.bg.multiplier = 0.2\n\tend\n\n\tself.Health.value = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\tif unit == \"player\" or unit == \"pet\" or unit == \"focus\" then\n\t\tself.Health.value:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\tself.Health.value:SetJustifyH(\"RIGHT\")\n\telseif unit == \"arena\" then\n\t\tif C.unitframe.arena_on_right == true then\n\t\t\tself.Health.value:SetPoint(\"LEFT\", self.Health, \"LEFT\", 2, 0)\n\t\t\tself.Health.value:SetJustifyH(\"LEFT\")\n\t\telse\n\t\t\tself.Health.value:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\t\tself.Health.value:SetJustifyH(\"RIGHT\")\n\t\tend\n\telseif unit == \"boss\" then\n\t\tif C.unitframe.boss_on_right == true then\n\t\t\tself.Health.value:SetPoint(\"LEFT\", self.Health, \"LEFT\", 2, 0)\n\t\t\tself.Health.value:SetJustifyH(\"LEFT\")\n\t\telse\n\t\t\tself.Health.value:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\t\tself.Health.value:SetJustifyH(\"RIGHT\")\n\t\tend\n\telseif unit == \"arenatarget\" then\n\t\tself.Health.value:Hide()\n\telse\n\t\tself.Health.value:SetPoint(\"LEFT\", self.Health, \"LEFT\", 2, 0)\n\t\tself.Health.value:SetJustifyH(\"LEFT\")\n\tend\n\n\t-- Power bar\n\tself.Power = CreateFrame(\"StatusBar\", self:GetName()..\"_Power\", self)\n\tif unit == \"player\" or unit == \"target\" or unit == \"arena\" or unit == \"boss\" then\n\t\tself.Power:SetHeight(5 + C.unitframe.extra_power_height)\n\telseif unit == \"arenatarget\" then\n\t\tself.Power:SetHeight(0)\n\telse\n\t\tself.Power:SetHeight(2)\n\tend\n\tself.Power:SetPoint(\"TOPLEFT\", self.Health, \"BOTTOMLEFT\", 0, -1)\n\tself.Power:SetPoint(\"TOPRIGHT\", self.Health, \"BOTTOMRIGHT\", 0, -1)\n\tself.Power:SetStatusBarTexture(C.media.texture)\n\n\tself.Power.frequentUpdates = true\n\tself.Power.colorDisconnected = true\n\tself.Power.colorTapping = true\n\tif C.unitframe.own_color == true then\n\t\tself.Power.colorClass = true\n\telse\n\t\tself.Power.colorPower = true\n\tend\n\tif C.unitframe.plugins_smooth_bar == true then\n\t\tself.Power.Smooth = true\n\tend\n\n\tself.Power.PreUpdate = T.PreUpdatePower\n\tself.Power.PostUpdate = T.PostUpdatePower\n\n\tself.Power.bg = self.Power:CreateTexture(nil, \"BORDER\")\n\tself.Power.bg:SetAllPoints()\n\tself.Power.bg:SetTexture(C.media.texture)\n\tif C.unitframe.own_color == true and unit == \"pet\" then\n\t\tself.Power.bg:SetVertexColor(C.unitframe.uf_color[1], C.unitframe.uf_color[2], C.unitframe.uf_color[3], 0.2)\n\telse\n\t\tself.Power.bg.multiplier = 0.2\n\tend\n\n\tself.Power.value = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\tif unit == \"player\" then\n\t\tself.Power.value:SetPoint(\"RIGHT\", self.Power, \"RIGHT\", 0, 0)\n\t\tself.Power.value:SetJustifyH(\"RIGHT\")\n\telseif unit == \"arena\" then\n\t\tif C.unitframe.arena_on_right == true then\n\t\t\tself.Power.value:SetPoint(\"LEFT\", self.Power, \"LEFT\", 2, 0)\n\t\t\tself.Power.value:SetJustifyH(\"LEFT\")\n\t\telse\n\t\t\tself.Power.value:SetPoint(\"RIGHT\", self.Power, \"RIGHT\", 0, 0)\n\t\t\tself.Power.value:SetJustifyH(\"RIGHT\")\n\t\tend\n\telseif unit == \"boss\" then\n\t\tif C.unitframe.boss_on_right == true then\n\t\t\tself.Power.value:SetPoint(\"LEFT\", self.Power, \"LEFT\", 2, 0)\n\t\t\tself.Power.value:SetJustifyH(\"LEFT\")\n\t\telse\n\t\t\tself.Power.value:SetPoint(\"RIGHT\", self.Power, \"RIGHT\", 0, 0)\n\t\t\tself.Power.value:SetJustifyH(\"RIGHT\")\n\t\tend\n\telseif unit == \"pet\" or unit == \"focus\" or unit == \"focustarget\" or unit == \"targettarget\" then\n\t\tself.Power.value:Hide()\n\telse\n\t\tself.Power.value:SetPoint(\"LEFT\", self.Power, \"LEFT\", 2, 0)\n\t\tself.Power.value:SetJustifyH(\"LEFT\")\n\tend\n\n\t-- Names\n\tif unit ~= \"player\" then\n\t\tself.Info = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tself.Info:SetWordWrap(false)\n\t\tif unit ~= \"arenatarget\" then\n\t\t\tself.Level = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tend\n\t\tif unit == \"target\" then\n\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\t\tself.Info:SetPoint(\"LEFT\", self.Health.value, \"RIGHT\", 0, 0)\n\t\t\tself.Info:SetJustifyH(\"RIGHT\")\n\t\t\tself:Tag(self.Info, \"[GetNameColor][NameLong]\")\n\t\t\tself.Level:SetPoint(\"RIGHT\", self.Power, \"RIGHT\", 0, 0)\n\t\t\tself:Tag(self.Level, \"[cpoints] [Threat] [DiffColor][level][shortclassification]\")\n\t\telseif unit == \"focus\" or unit == \"pet\" then\n\t\t\tself.Info:SetPoint(\"LEFT\", self.Health, \"LEFT\", 2, 0)\n\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health.value, \"LEFT\", 0, 0)\n\t\t\tself.Info:SetJustifyH(\"LEFT\")\n\t\t\tif unit == \"pet\" then\n\t\t\t\tself:Tag(self.Info, \"[PetNameColor][NameMedium]\")\n\t\t\telse\n\t\t\t\tself:Tag(self.Info, \"[GetNameColor][NameMedium]\")\n\t\t\tend\n\t\telseif unit == \"arenatarget\" then\n\t\t\tself.Info:SetPoint(\"CENTER\", self.Health, \"CENTER\", 1, 0)\n\t\t\tself:Tag(self.Info, \"[GetNameColor][NameArena]\")\n\t\telseif unit == \"arena\" then\n\t\t\tif C.unitframe.arena_on_right == true then\n\t\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\t\t\tself.Info:SetPoint(\"LEFT\", self.Health.value, \"RIGHT\", 0, 0)\n\t\t\t\tself.Info:SetJustifyH(\"RIGHT\")\n\t\t\telse\n\t\t\t\tself.Info:SetPoint(\"LEFT\", self.Health, \"LEFT\", 2, 0)\n\t\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health.value, \"LEFT\", 0, 0)\n\t\t\t\tself.Info:SetJustifyH(\"LEFT\")\n\t\t\tend\n\t\t\tself:Tag(self.Info, \"[GetNameColor][NameMedium]\")\n\t\telseif unit == \"boss\" then\n\t\t\tif C.unitframe.boss_on_right == true then\n\t\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\t\t\tself.Info:SetPoint(\"LEFT\", self.Health.value, \"RIGHT\", 0, 0)\n\t\t\t\tself.Info:SetJustifyH(\"RIGHT\")\n\t\t\telse\n\t\t\t\tself.Info:SetPoint(\"LEFT\", self.Health, \"LEFT\", 2, 0)\n\t\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health.value, \"LEFT\", 0, 0)\n\t\t\t\tself.Info:SetJustifyH(\"LEFT\")\n\t\t\tend\n\t\t\tself:Tag(self.Info, \"[GetNameColor][NameMedium]\")\n\t\telse\n\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\t\tself.Info:SetPoint(\"LEFT\", self.Health.value, \"RIGHT\", 0, 0)\n\t\t\tself.Info:SetJustifyH(\"RIGHT\")\n\t\t\tself:Tag(self.Info, \"[GetNameColor][NameMedium]\")\n\t\tend\n\tend\n\n\tif unit == \"player\" then\n\t\tself.FlashInfo = CreateFrame(\"Frame\", \"FlashInfo\", self)\n\t\tself.FlashInfo:SetScript(\"OnUpdate\", T.UpdateManaLevel)\n\t\tself.FlashInfo:SetFrameLevel(self.Health:GetFrameLevel() + 1)\n\t\tself.FlashInfo:SetAllPoints(self.Health)\n\n\t\tself.FlashInfo.ManaLevel = T.SetFontString(self.FlashInfo, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tself.FlashInfo.ManaLevel:SetPoint(\"CENTER\", 0, 0)\n\n\t\t-- Combat icon\n\t\tif C.unitframe.icons_combat == true then\n\t\t\tself.CombatIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\t\tself.CombatIndicator:SetSize(18, 18)\n\t\t\tself.CombatIndicator:SetPoint(\"TOPRIGHT\", 4, 8)\n\t\tend\n\n\t\t-- Resting icon\n\t\tif C.unitframe.icons_resting == true then\n\t\t\tself.RestingIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\t\tself.RestingIndicator:SetSize(18, 18)\n\t\t\tself.RestingIndicator:SetPoint(\"BOTTOMLEFT\", self, \"BOTTOMLEFT\", -8, -8)\n\t\tend\n\n\t\t-- Leader/Assistant icons\n\t\tif C.raidframe.icons_leader == true then\n\t\t\t-- Leader icon\n\t\t\tself.LeaderIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\t\tself.LeaderIndicator:SetSize(14, 14)\n\t\t\tself.LeaderIndicator:SetPoint(\"TOPLEFT\", -3, 9)\n\n\t\t\t-- Assistant icon\n\t\t\tself.AssistantIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\t\tself.AssistantIndicator:SetSize(12, 12)\n\t\t\tself.AssistantIndicator:SetPoint(\"TOPLEFT\", -3, 8)\n\t\tend\n\n\t\t-- LFD role icons\n\t\tif C.raidframe.icons_role == true then\n\t\t\tself.GroupRoleIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\t\tself.GroupRoleIndicator:SetSize(12, 12)\n\t\t\tself.GroupRoleIndicator:SetPoint(\"TOPLEFT\", 10, 8)\n\t\tend\n\n\t\t-- Rune bar\n\t\tif C.unitframe_class_bar.rune == true and T.class == \"DEATHKNIGHT\" then\n\t\t\tself.Runes = CreateFrame(\"Frame\", self:GetName()..\"_RuneBar\", self)\n\t\t\tself.Runes:CreateBackdrop(\"Default\")\n\t\t\tself.Runes:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\tself.Runes:SetSize(player_width, 7)\n\t\t\tself.Runes.colorSpec = true\n\t\t\tself.Runes.sortOrder = \"asc\"\n\n\t\t\tfor i = 1, 6 do\n\t\t\t\tself.Runes[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_Rune\"..i, self.Runes)\n\t\t\t\tself.Runes[i]:SetSize((player_width - 5) / 6, 7)\n\t\t\t\tif i == 1 then\n\t\t\t\t\tself.Runes[i]:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\telse\n\t\t\t\t\tself.Runes[i]:SetPoint(\"TOPLEFT\", self.Runes[i-1], \"TOPRIGHT\", 1, 0)\n\t\t\t\tend\n\t\t\t\tself.Runes[i]:SetStatusBarTexture(C.media.texture)\n\n\t\t\t\tself.Runes[i].bg = self.Runes[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\tself.Runes[i].bg:SetAllPoints()\n\t\t\t\tself.Runes[i].bg:SetTexture(C.media.texture)\n\t\t\t\tself.Runes[i].bg.multiplier = 0.2\n\t\t\tend\n\t\tend\n\n\t\tif T.class == \"MAGE\" then\n\t\t\t-- Arcane Charge bar\n\t\t\tif C.unitframe_class_bar.arcane == true then\n\t\t\t\tself.ArcaneCharge = CreateFrame(\"Frame\", self:GetName()..\"_ArcaneChargeBar\", self)\n\t\t\t\tself.ArcaneCharge:CreateBackdrop(\"Default\")\n\t\t\t\tself.ArcaneCharge:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\tself.ArcaneCharge:SetSize(player_width, 7)\n\n\t\t\t\tfor i = 1, 4 do\n\t\t\t\t\tself.ArcaneCharge[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_ArcaneCharge\"..i, self.ArcaneCharge)\n\t\t\t\t\tself.ArcaneCharge[i]:SetSize((player_width - 3) / 4, 7)\n\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\tself.ArcaneCharge[i]:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\t\telse\n\t\t\t\t\t\tself.ArcaneCharge[i]:SetPoint(\"TOPLEFT\", self.ArcaneCharge[i-1], \"TOPRIGHT\", 1, 0)\n\t\t\t\t\tend\n\t\t\t\t\tself.ArcaneCharge[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\t\tself.ArcaneCharge[i]:SetStatusBarColor(0.4, 0.8, 1)\n\n\t\t\t\t\tself.ArcaneCharge[i].bg = self.ArcaneCharge[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\t\tself.ArcaneCharge[i].bg:SetAllPoints()\n\t\t\t\t\tself.ArcaneCharge[i].bg:SetTexture(C.media.texture)\n\t\t\t\t\tself.ArcaneCharge[i].bg:SetVertexColor(0.4, 0.8, 1, 0.2)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif T.class == \"MONK\" then\n\t\t\t-- Chi bar\n\t\t\tif C.unitframe_class_bar.chi == true then\n\t\t\t\tself.HarmonyBar = CreateFrame(\"Frame\", self:GetName()..\"_HarmonyBar\", self)\n\t\t\t\tself.HarmonyBar:CreateBackdrop(\"Default\")\n\t\t\t\tself.HarmonyBar:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\tself.HarmonyBar:SetSize(player_width, 7)\n\n\t\t\t\tfor i = 1, 6 do\n\t\t\t\t\tself.HarmonyBar[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_Harmony\"..i, self.HarmonyBar)\n\t\t\t\t\tself.HarmonyBar[i]:SetSize((player_width - 5) / 6, 7)\n\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\tself.HarmonyBar[i]:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\t\telse\n\t\t\t\t\t\tself.HarmonyBar[i]:SetPoint(\"TOPLEFT\", self.HarmonyBar[i-1], \"TOPRIGHT\", 1, 0)\n\t\t\t\t\tend\n\t\t\t\t\tself.HarmonyBar[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\t\tself.HarmonyBar[i]:SetStatusBarColor(0.33, 0.63, 0.33)\n\n\t\t\t\t\tself.HarmonyBar[i].bg = self.HarmonyBar[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\t\tself.HarmonyBar[i].bg:SetAllPoints()\n\t\t\t\t\tself.HarmonyBar[i].bg:SetTexture(C.media.texture)\n\t\t\t\t\tself.HarmonyBar[i].bg:SetVertexColor(0.33, 0.63, 0.33, 0.2)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- Stagger bar\n\t\t\tif C.unitframe_class_bar.stagger == true then\n\t\t\t\tself.Stagger = CreateFrame(\"StatusBar\", self:GetName()..\"_Stagger\", self)\n\t\t\t\tself.Stagger:CreateBackdrop(\"Default\")\n\t\t\t\tself.Stagger:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\tself.Stagger:SetSize(player_width, 7)\n\t\t\t\tself.Stagger:SetStatusBarTexture(C.media.texture)\n\n\t\t\t\tself.Stagger.bg = self.Stagger:CreateTexture(nil, \"BORDER\")\n\t\t\t\tself.Stagger.bg:SetAllPoints()\n\t\t\t\tself.Stagger.bg:SetTexture(C.media.texture)\n\t\t\t\tself.Stagger.bg.multiplier = 0.2\n\n\t\t\t\tself.Stagger.Text = T.SetFontString(self.Stagger, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\t\tself.Stagger.Text:SetPoint(\"CENTER\", self.Stagger, \"CENTER\", 0, 0)\n\t\t\tend\n\t\tend\n\n\t\t-- Holy Power bar\n\t\tif C.unitframe_class_bar.holy == true and T.class == \"PALADIN\" then\n\t\t\tself.HolyPower = CreateFrame(\"Frame\", self:GetName()..\"_HolyPowerBar\", self)\n\t\t\tself.HolyPower:CreateBackdrop(\"Default\")\n\t\t\tself.HolyPower:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\tself.HolyPower:SetSize(player_width, 7)\n\n\t\t\tfor i = 1, 5 do\n\t\t\t\tself.HolyPower[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_HolyPower\"..i, self.HolyPower)\n\t\t\t\tself.HolyPower[i]:SetSize((player_width - 4) / 5, 7)\n\t\t\t\tif i == 1 then\n\t\t\t\t\tself.HolyPower[i]:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\telse\n\t\t\t\t\tself.HolyPower[i]:SetPoint(\"TOPLEFT\", self.HolyPower[i-1], \"TOPRIGHT\", 1, 0)\n\t\t\t\tend\n\t\t\t\tself.HolyPower[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\tself.HolyPower[i]:SetStatusBarColor(0.89, 0.88, 0.1)\n\n\t\t\t\tself.HolyPower[i].bg = self.HolyPower[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\tself.HolyPower[i].bg:SetAllPoints()\n\t\t\t\tself.HolyPower[i].bg:SetTexture(C.media.texture)\n\t\t\t\tself.HolyPower[i].bg:SetVertexColor(0.89, 0.88, 0.1, 0.2)\n\t\t\tend\n\t\tend\n\n\t\t-- Soul Shards bar\n\t\tif C.unitframe_class_bar.shard == true and T.class == \"WARLOCK\" then\n\t\t\tself.SoulShards = CreateFrame(\"Frame\", self:GetName()..\"_SoulShardsBar\", self)\n\t\t\tself.SoulShards:CreateBackdrop(\"Default\")\n\t\t\tself.SoulShards:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\tself.SoulShards:SetSize(player_width, 7)\n\n\t\t\tfor i = 1, 5 do\n\t\t\t\tself.SoulShards[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_SoulShards\"..i, self.SoulShards)\n\t\t\t\tself.SoulShards[i]:SetSize((player_width - 4) / 5, 7)\n\t\t\t\tif i == 1 then\n\t\t\t\t\tself.SoulShards[i]:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\telse\n\t\t\t\t\tself.SoulShards[i]:SetPoint(\"TOPLEFT\", self.SoulShards[i-1], \"TOPRIGHT\", 1, 0)\n\t\t\t\tend\n\t\t\t\tself.SoulShards[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\tself.SoulShards[i]:SetStatusBarColor(0.9, 0.37, 0.37)\n\n\t\t\t\tself.SoulShards[i].bg = self.SoulShards[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\tself.SoulShards[i].bg:SetAllPoints()\n\t\t\t\tself.SoulShards[i].bg:SetTexture(C.media.texture)\n\t\t\t\tself.SoulShards[i].bg:SetVertexColor(0.9, 0.37, 0.37, 0.2)\n\t\t\tend\n\t\tend\n\n\t\t-- Essence bar\n\t\tif C.unitframe_class_bar.essence == true and T.class == \"EVOKER\" then\n\t\t\tself.Essence = CreateFrame(\"Frame\", self:GetName()..\"_Essence\", self, \"BackdropTemplate\", \"BackdropTemplate\")\n\t\t\tlocal maxEssence = UnitPowerMax(self.unit, Enum.PowerType.Essence)\n\t\t\tself.Essence:CreateBackdrop(\"Default\")\n\t\t\tself.Essence:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\tself.Essence:SetSize(player_width, 7)\n\n\t\t\tfor i = 1, 6 do\n\t\t\t\tself.Essence[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_Essence\"..i, self.Essence, \"BackdropTemplate\")\n\t\t\t\tself.Essence[i]:SetSize((player_width - 5) / 6, 7)\n\t\t\t\tif i == 1 then\n\t\t\t\t\tself.Essence[i]:SetPoint(\"LEFT\", self.Essence)\n\t\t\t\telse\n\t\t\t\t\tself.Essence[i]:SetPoint(\"TOPLEFT\", self.Essence[i-1], \"TOPRIGHT\", 1, 0)\n\t\t\t\tend\n\t\t\t\tself.Essence[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\tself.Essence[i]:SetStatusBarColor(0.2, 0.58, 0.5)\n\n\t\t\t\tself.Essence[i].bg = self.Essence[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\tself.Essence[i].bg:SetAllPoints()\n\t\t\t\tself.Essence[i].bg:SetTexture(C.media.texture)\n\t\t\t\tself.Essence[i].bg:SetVertexColor(0.2, 0.58, 0.5, 0.2)\n\t\t\tend\n\t\tend\n\n\t\t-- Rogue/Druid Combo bar\n\t\tif C.unitframe_class_bar.combo == true and C.unitframe_class_bar.combo_old ~= true and (T.class == \"ROGUE\" or T.class == \"DRUID\") then\n\t\t\tself.ComboPoints = CreateFrame(\"Frame\", self:GetName()..\"_ComboBar\", self)\n\t\t\tself.ComboPoints:CreateBackdrop(\"Default\")\n\t\t\tself.ComboPoints:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\tself.ComboPoints:SetSize(player_width, 7)\n\n\t\t\tfor i = 1, 7 do\n\t\t\t\tself.ComboPoints[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_Combo\"..i, self.ComboPoints)\n\t\t\t\tself.ComboPoints[i]:SetSize((player_width - 5) / 7, 7)\n\t\t\t\tif i == 1 then\n\t\t\t\t\tself.ComboPoints[i]:SetPoint(\"LEFT\", self.ComboPoints)\n\t\t\t\telse\n\t\t\t\t\tself.ComboPoints[i]:SetPoint(\"LEFT\", self.ComboPoints[i-1], \"RIGHT\", 1, 0)\n\t\t\t\tend\n\t\t\t\tself.ComboPoints[i]:SetStatusBarTexture(C.media.texture)\n\t\t\tend\n\t\tend\n\n\t\t-- Totem bar for Shaman\n\t\tif C.unitframe_class_bar.totem == true and T.class == \"SHAMAN\" then\n\t\t\tself.TotemBar = CreateFrame(\"Frame\", self:GetName()..\"_TotemBar\", self)\n\t\t\tself.TotemBar:CreateBackdrop(\"Default\")\n\t\t\tself.TotemBar:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\tself.TotemBar:SetSize(player_width, 7)\n\t\t\tself.TotemBar.Destroy = true\n\n\t\t\tfor i = 1, 4 do\n\t\t\t\tself.TotemBar[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_Totem\"..i, self.TotemBar)\n\t\t\t\tself.TotemBar[i]:SetSize((player_width - 3) / 4, 7)\n\n\t\t\t\tif i == 1 then\n\t\t\t\t\tself.TotemBar[i]:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\telse\n\t\t\t\t\tself.TotemBar[i]:SetPoint(\"TOPLEFT\", self.TotemBar[i-1], \"TOPRIGHT\", 1, 0)\n\t\t\t\tend\n\t\t\t\tself.TotemBar[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\tself.TotemBar[i]:SetMinMaxValues(0, 1)\n\n\t\t\t\tself.TotemBar[i].bg = self.TotemBar[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\tself.TotemBar[i].bg:SetAllPoints()\n\t\t\t\tself.TotemBar[i].bg:SetTexture(C.media.texture)\n\t\t\t\tself.TotemBar[i].bg.multiplier = 0.2\n\t\t\tend\n\t\tend\n\n\t\t-- Totem bar for other classes\n\t\tif C.unitframe_class_bar.totem == true and C.unitframe_class_bar.totem_other == true and T.class ~= \"SHAMAN\" then\n\t\t\tself.TotemBar = CreateFrame(\"Frame\", self:GetName()..\"_TotemBar\", self)\n\t\t\tself.TotemBar:SetFrameLevel(self.Health:GetFrameLevel() + 2)\n\t\t\tself.TotemBar:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", 0, 0)\n\t\t\tself.TotemBar:SetSize(140, 7)\n\t\t\tself.TotemBar.Destroy = true\n\n\t\t\tfor i = 1, 4 do\n\t\t\t\tself.TotemBar[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_Totem\"..i, self.TotemBar)\n\t\t\t\tself.TotemBar[i]:SetSize(140 / 4, 7)\n\t\t\t\tif i == 1 then\n\t\t\t\t\tself.TotemBar[i]:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", 0, 0)\n\t\t\t\telse\n\t\t\t\t\tself.TotemBar[i]:SetPoint(\"TOPLEFT\", self.TotemBar[i-1], \"TOPRIGHT\", 0, 0)\n\t\t\t\tend\n\t\t\t\tself.TotemBar[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\tself.TotemBar[i]:SetMinMaxValues(0, 1)\n\t\t\t\tself.TotemBar[i]:CreateBorder(false, true)\n\n\t\t\t\tself.TotemBar[i].bg = self.TotemBar[i]:CreateTexture(nil, \"BORDER\")\n\t\t\t\tself.TotemBar[i].bg:SetAllPoints()\n\t\t\t\tself.TotemBar[i].bg:SetTexture(C.media.texture)\n\t\t\t\tself.TotemBar[i].bg.multiplier = 0.2\n\t\t\tend\n\t\tend\n\n\t\t-- Additional mana\n\t\tif T.class == \"DRUID\" or T.class == \"PRIEST\" or T.class == \"SHAMAN\" then\n\t\t\tCreateFrame(\"Frame\"):SetScript(\"OnUpdate\", function() T.UpdateClassMana(self) end)\n\t\t\tself.ClassMana = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\tself.ClassMana:SetTextColor(1, 0.49, 0.04)\n\t\tend\n\n\t\t-- Experience bar\n\t\tif C.unitframe.plugins_experience_bar == true then\n\t\t\tself.Experience = CreateFrame(\"StatusBar\", self:GetName()..\"_Experience\", self)\n\t\t\tself.Experience:CreateBackdrop(\"Default\")\n\t\t\tself.Experience:EnableMouse(true)\n\t\t\tif C.unitframe.portrait_enable == true then\n\t\t\t\tself.Experience:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", -25 - C.unitframe.portrait_width, 28)\n\t\t\telse\n\t\t\t\tself.Experience:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", -18, 28)\n\t\t\tend\n\t\t\tself.Experience:SetSize(7, 94 + T.extraHeight + (C.unitframe.extra_health_height / 2))\n\t\t\tself.Experience:SetOrientation(\"Vertical\")\n\t\t\tself.Experience:SetStatusBarTexture(C.media.texture)\n\n\t\t\tself.Experience.bg = self.Experience:CreateTexture(nil, \"BORDER\")\n\t\t\tself.Experience.bg:SetAllPoints()\n\t\t\tself.Experience.bg:SetTexture(C.media.texture)\n\n\t\t\tself.Experience.Rested = CreateFrame(\"StatusBar\", nil, self.Experience)\n\t\t\tself.Experience.Rested:SetOrientation(\"Vertical\")\n\t\t\tself.Experience.Rested:SetAllPoints()\n\t\t\tself.Experience.Rested:SetStatusBarTexture(C.media.texture)\n\n\t\t\tself.Experience.inAlpha = 1\n\t\t\tself.Experience.outAlpha = 0\n\t\tend\n\n\t\t-- Reputation bar\n\t\tif C.unitframe.plugins_reputation_bar == true then\n\t\t\tself.Reputation = CreateFrame(\"StatusBar\", self:GetName()..\"_Reputation\", self)\n\t\t\tself.Reputation:CreateBackdrop(\"Default\")\n\t\t\tself.Reputation:EnableMouse(true)\n\t\t\tif C.unitframe.portrait_enable == true then\n\t\t\t\tif self.Experience and self.Experience:IsShown() then\n\t\t\t\t\tself.Reputation:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", -39 - C.unitframe.portrait_width, 28)\n\t\t\t\telse\n\t\t\t\t\tself.Reputation:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", -25 - C.unitframe.portrait_width, 28)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif self.Experience and self.Experience:IsShown() then\n\t\t\t\t\tself.Reputation:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", -32, 28)\n\t\t\t\telse\n\t\t\t\t\tself.Reputation:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", -18, 28)\n\t\t\t\tend\n\t\t\tend\n\t\t\tself.Reputation:SetSize(7, 94 + T.extraHeight + (C.unitframe.extra_health_height / 2))\n\t\t\tself.Reputation:SetOrientation(\"Vertical\")\n\t\t\tself.Reputation:SetStatusBarTexture(C.media.texture)\n\n\t\t\tself.Reputation.bg = self.Reputation:CreateTexture(nil, \"BORDER\")\n\t\t\tself.Reputation.bg:SetAllPoints()\n\t\t\tself.Reputation.bg:SetTexture(C.media.texture)\n\n\t\t\tself.Reputation.inAlpha = 1\n\t\t\tself.Reputation.outAlpha = 0\n\t\t\tself.Reputation.colorStanding = true\n\t\tend\n\n\t\t-- GCD spark\n\t\tif C.unitframe.plugins_gcd == true then\n\t\t\tself.GCD = CreateFrame(\"Frame\", self:GetName()..\"_GCD\", self)\n\t\t\tself.GCD:SetWidth(player_width + 3)\n\t\t\tself.GCD:SetHeight(3)\n\t\t\tself.GCD:SetFrameStrata(\"HIGH\")\n\t\t\tself.GCD:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 0)\n\n\t\t\tself.GCD.Color = {1, 1, 1}\n\t\t\tself.GCD.Height = T.Scale(3)\n\t\t\tself.GCD.Width = T.Scale(4)\n\t\tend\n\n\t\t-- Absorbs value\n\t\tif C.unitframe.plugins_absorbs == true then\n\t\t\tself.Absorbs = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\tself.Absorbs:SetPoint(\"LEFT\", self.Health, \"LEFT\", 4, 0)\n\t\t\tself:Tag(self.Absorbs, \"[Absorbs]\")\n\t\tend\n\tend\n\n\t-- Counter bar (Darkmoon Fair)\n\tif unit == \"player\" or unit == \"pet\" then\n\t\tself.CounterBar = CreateFrame(\"StatusBar\", self:GetName()..\"_CounterBar\", self)\n\t\tself.CounterBar:CreateBackdrop(\"Default\")\n\t\tself.CounterBar:SetWidth(221)\n\t\tself.CounterBar:SetHeight(20)\n\t\tself.CounterBar:SetStatusBarTexture(C.media.texture)\n\t\tself.CounterBar:SetPoint(\"TOP\", UIParent, \"TOP\", 0, -102)\n\n\t\tself.CounterBar.bg = self.CounterBar:CreateTexture(nil, \"BORDER\")\n\t\tself.CounterBar.bg:SetAllPoints()\n\t\tself.CounterBar.bg:SetTexture(C.media.texture)\n\n\t\tself.CounterBar.Text = T.SetFontString(self.CounterBar, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tself.CounterBar.Text:SetPoint(\"CENTER\")\n\n\t\tself.CounterBar:SetScript(\"OnValueChanged\", function(_, value)\n\t\t\tlocal _, max = self.CounterBar:GetMinMaxValues()\n\t\t\tlocal r, g, b = oUF:ColorGradient(value, max, 0.8, 0, 0, 0.8, 0.8, 0, 0, 0.8, 0)\n\t\t\tself.CounterBar:SetStatusBarColor(r, g, b)\n\t\t\tself.CounterBar.bg:SetVertexColor(r, g, b, 0.2)\n\t\t\tself.CounterBar.Text:SetText(floor(value))\n\t\tend)\n\tend\n\n\tif unit == \"pet\" or unit == \"targettarget\" or unit == \"focus\" or unit == \"focustarget\" then\n\t\tself.Debuffs = CreateFrame(\"Frame\", self:GetName()..\"_Debuffs\", self)\n\t\tself.Debuffs:SetHeight(25)\n\t\tself.Debuffs:SetWidth(pet_width + 4)\n\t\tself.Debuffs.size = T.Scale(C.aura.debuff_size)\n\t\tself.Debuffs.spacing = T.Scale(3)\n\t\tself.Debuffs.num = 4\n\t\tself.Debuffs[\"growth-y\"] = \"DOWN\"\n\t\tif unit == \"pet\" or unit == \"focus\" then\n\t\t\tself.Debuffs:SetPoint(\"TOPRIGHT\", self, \"BOTTOMRIGHT\", 2, -17)\n\t\t\tself.Debuffs.initialAnchor = \"TOPRIGHT\"\n\t\t\tself.Debuffs[\"growth-x\"] = \"LEFT\"\n\t\telse\n\t\t\tself.Debuffs:SetPoint(\"TOPLEFT\", self, \"BOTTOMLEFT\", -2, -17)\n\t\t\tself.Debuffs.initialAnchor = \"TOPLEFT\"\n\t\t\tself.Debuffs[\"growth-x\"] = \"RIGHT\"\n\t\tend\n\t\tself.Debuffs.PostCreateButton = T.PostCreateIcon\n\t\tself.Debuffs.PostUpdateButton = T.PostUpdateIcon\n\t\tself.Debuffs.FilterAura = T.CustomFilter\n\n\t\tif unit == \"pet\" then\n\t\t\tself:RegisterEvent(\"UNIT_PET\", T.UpdateAllElements)\n\t\tend\n\tend\n\n\tif unit == \"player\" or unit == \"target\" then\n\t\tif C.unitframe.portrait_enable == true then\n\t\t\tif C.unitframe.portrait_type == \"3D\" or C.unitframe.portrait_type == \"OVERLAY\" then\n\t\t\t\tself.Portrait = CreateFrame(\"PlayerModel\", self:GetName()..\"_Portrait\", self)\n\t\t\telse\n\t\t\t\tself.Portrait = CreateFrame(\"Frame\", self:GetName()..\"_Portrait\", self)\n\t\t\tend\n\t\t\tself.Portrait:SetHeight(C.unitframe.portrait_height)\n\t\t\tself.Portrait:SetWidth(C.unitframe.portrait_width)\n\t\t\tif unit == \"player\" then\n\t\t\t\tself.Portrait:SetPoint(unpack(C.position.unitframes.player_portrait))\n\t\t\telseif unit == \"target\" then\n\t\t\t\tself.Portrait:SetPoint(unpack(C.position.unitframes.target_portrait))\n\t\t\tend\n\n\t\t\tself.Portrait.Icon = self.Portrait:CreateTexture(nil, \"ARTWORK\")\n\t\t\tself.Portrait.Icon:SetAllPoints()\n\n\t\t\tif C.unitframe.portrait_type == \"ICONS\" then\n\t\t\t\tself.Portrait.classIcons = true\n\t\t\tend\n\n\t\t\tself.Portrait:CreateBackdrop(\"Transparent\")\n\t\t\tself.Portrait.backdrop:SetPoint(\"TOPLEFT\", -2 - T.mult, 2 + T.mult)\n\t\t\tself.Portrait.backdrop:SetPoint(\"BOTTOMRIGHT\", 2 + T.mult, -2 - T.mult)\n\n\t\t\tif C.unitframe.portrait_classcolor_border == true then\n\t\t\t\tif unit == \"player\" then\n\t\t\t\t\tself.Portrait.backdrop:SetBackdropBorderColor(T.color.r, T.color.g, T.color.b)\n\t\t\t\telseif unit == \"target\" then\n\t\t\t\t\tself.Portrait.backdrop:RegisterEvent(\"PLAYER_TARGET_CHANGED\")\n\t\t\t\t\tself.Portrait.backdrop:SetScript(\"OnEvent\", function()\n\t\t\t\t\t\tlocal _, class = UnitClass(\"target\")\n\t\t\t\t\t\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]\n\t\t\t\t\t\tif color then\n\t\t\t\t\t\t\tself.Portrait.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tself.Portrait.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\t\t\t\t\tend\n\t\t\t\t\tend)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif C.unitframe.portrait_type == \"OVERLAY\" then\n\t\t\t\tlocal healthTex = self.Health:GetStatusBarTexture()\n\t\t\t\tself.Portrait:ClearAllPoints()\n\t\t\t\tself.Portrait:SetPoint(\"TOPLEFT\", healthTex, \"TOPLEFT\", 0, 0)\n\t\t\t\tself.Portrait:SetPoint(\"BOTTOMRIGHT\", healthTex, \"BOTTOMRIGHT\", 0, 1)\n\t\t\t\tself.Portrait:SetFrameLevel(self.Health:GetFrameLevel())\n\t\t\t\tself.Portrait.backdrop:Hide()\n\t\t\t\tself.Portrait:SetAlpha(0.5)\n\n\t\t\t\tif C.filger.enable then\n\t\t\t\t\tlocal frame = CreateFrame(\"Frame\")\n\t\t\t\t\tframe:RegisterEvent(\"PLAYER_LOGIN\")\n\t\t\t\t\tframe:SetScript(\"OnEvent\", function()\n\t\t\t\t\t\tT_DE_BUFF_BAR_Anchor:ClearAllPoints()\n\t\t\t\t\t\tT_DE_BUFF_BAR_Anchor:SetPoint(C.position.filger.target_bar[1], C.position.filger.target_bar[2], C.position.filger.target_bar[3], C.position.filger.target_bar[4], C.position.filger.target_bar[5])\n\t\t\t\t\tend)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif unit == \"player\" then\n\t\t\tself.Debuffs = CreateFrame(\"Frame\", self:GetName()..\"_Debuffs\", self)\n\t\t\tself.Debuffs:SetHeight(165)\n\t\t\tself.Debuffs:SetWidth(player_width + 4)\n\t\t\tself.Debuffs.size = T.Scale(C.aura.debuff_size)\n\t\t\tself.Debuffs.spacing = T.Scale(3)\n\t\t\tself.Debuffs.initialAnchor = \"BOTTOMRIGHT\"\n\t\t\tself.Debuffs[\"growth-y\"] = \"UP\"\n\t\t\tself.Debuffs[\"growth-x\"] = \"LEFT\"\n\t\t\tif (T.class == \"DEATHKNIGHT\" and C.unitframe_class_bar.rune == true)\n\t\t\tor ((T.class == \"DRUID\" or T.class == \"ROGUE\") and C.unitframe_class_bar.combo == true and C.unitframe_class_bar.combo_old ~= true)\n\t\t\tor (T.class == \"SHAMAN\" and C.unitframe_class_bar.totem == true)\n\t\t\tor (T.class == \"WARLOCK\" and C.unitframe_class_bar.shard == true) then\n\t\t\t\tself.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 19)\n\t\t\telse\n\t\t\t\tself.Debuffs:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 2, 5)\n\t\t\tend\n\n\t\t\tself.Debuffs.PostCreateButton = T.PostCreateIcon\n\t\t\tself.Debuffs.PostUpdateButton = T.PostUpdateIcon\n\t\tend\n\n\t\tif unit == \"target\" then\n\t\t\tself.Auras = CreateFrame(\"Frame\", self:GetName()..\"_Auras\", self)\n\t\t\tself.Auras:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", -2, 5)\n\t\t\tself.Auras.initialAnchor = \"BOTTOMLEFT\"\n\t\t\tself.Auras[\"growth-x\"] = \"RIGHT\"\n\t\t\tself.Auras[\"growth-y\"] = \"UP\"\n\t\t\tself.Auras.numDebuffs = 16\n\t\t\tself.Auras.numBuffs = 32\n\t\t\tself.Auras:SetHeight(165)\n\t\t\tself.Auras:SetWidth(player_width + 4)\n\t\t\tself.Auras.spacing = T.Scale(3)\n\t\t\tself.Auras.size = T.Scale(C.aura.debuff_size)\n\t\t\tself.Auras.gap = true\n\t\t\tself.Auras.PostCreateButton = T.PostCreateIcon\n\t\t\tself.Auras.PostUpdateButton = T.PostUpdateIcon\n\t\t\tself.Auras.FilterAura = T.CustomFilter\n\n\t\t\t-- Rogue/Druid Combo bar\n\t\t\tif C.unitframe_class_bar.combo == true and (C.unitframe_class_bar.combo_old == true or (T.class ~= \"DRUID\" and T.class ~= \"ROGUE\")) then\n\t\t\t\tself.ComboPoints = CreateFrame(\"Frame\", self:GetName()..\"_ComboBar\", self)\n\t\t\t\tself.ComboPoints:CreateBackdrop(\"Default\")\n\t\t\t\tself.ComboPoints:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", 0, 7)\n\t\t\t\tself.ComboPoints:SetSize(player_width, 7)\n\n\t\t\t\tfor i = 1, 7 do\n\t\t\t\t\tself.ComboPoints[i] = CreateFrame(\"StatusBar\", self:GetName()..\"_Combo\"..i, self.ComboPoints)\n\t\t\t\t\tself.ComboPoints[i]:SetSize((player_width - 5) / 7, 7)\n\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\tself.ComboPoints[i]:SetPoint(\"LEFT\", self.ComboPoints)\n\t\t\t\t\telse\n\t\t\t\t\t\tself.ComboPoints[i]:SetPoint(\"LEFT\", self.ComboPoints[i-1], \"RIGHT\", 1, 0)\n\t\t\t\t\tend\n\t\t\t\t\tself.ComboPoints[i]:SetStatusBarTexture(C.media.texture)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- Enemy specialization\n\t\t\tif C.unitframe.plugins_enemy_spec == true then\n\t\t\t\tself.EnemySpec = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\t\tself.EnemySpec:SetTextColor(1, 0, 0)\n\t\t\t\tself.EnemySpec:SetPoint(\"BOTTOM\", self.Power, \"BOTTOM\", 0, -1)\n\t\t\tend\n\n\t\t\t-- Quest icon\n\t\t\tself.QuestIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\t\tself.QuestIndicator:SetSize(20, 20)\n\t\t\tself.QuestIndicator:SetPoint(\"CENTER\", self.Health, \"CENTER\", -20, 0)\n\t\tend\n\n\t\tif C.unitframe.plugins_combat_feedback == true then\n\t\t\tself.CombatFeedbackText = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)\n\t\t\tif C.unitframe.portrait_enable == true then\n\t\t\t\tself.CombatFeedbackText:SetPoint(\"BOTTOM\", self.Portrait, \"BOTTOM\", 0, 0)\n\t\t\t\tself.CombatFeedbackText:SetParent(self.Portrait)\n\t\t\telse\n\t\t\t\tself.CombatFeedbackText:SetPoint(\"CENTER\", 0, 1)\n\t\t\tend\n\t\tend\n\n\t\tif C.unitframe.icons_pvp == true then\n\t\t\tself.Status = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\tself.Status:SetPoint(\"CENTER\", self.Health, \"CENTER\", 0, 0)\n\t\t\tself.Status:SetTextColor(0.69, 0.31, 0.31)\n\t\t\tself.Status:Hide()\n\t\t\tself.Status.Override = T.dummy\n\n\t\t\tself:SetScript(\"OnEnter\", function(self) FlashInfo.ManaLevel:Hide() T.UpdatePvPStatus(self) self.Status:Show() UnitFrame_OnEnter(self) end)\n\t\t\tself:SetScript(\"OnLeave\", function(self) FlashInfo.ManaLevel:Show() self.Status:Hide() UnitFrame_OnLeave(self) end)\n\t\tend\n\tend\n\n\tif C.unitframe.unit_castbar == true and not unit:match('%wtarget$') then\n\t\tself.Castbar = CreateFrame(\"StatusBar\", self:GetName()..\"_Castbar\", self)\n\t\tself.Castbar:SetStatusBarTexture(C.media.texture, \"ARTWORK\")\n\n\t\tself.Castbar.bg = self.Castbar:CreateTexture(nil, \"BORDER\")\n\t\tself.Castbar.bg:SetAllPoints()\n\t\tself.Castbar.bg:SetTexture(C.media.texture)\n\n\t\tself.Castbar.Overlay = CreateFrame(\"Frame\", nil, self.Castbar)\n\t\tself.Castbar.Overlay:SetTemplate(\"Default\")\n\t\tself.Castbar.Overlay:SetFrameStrata(\"BACKGROUND\")\n\t\tself.Castbar.Overlay:SetFrameLevel(3)\n\t\tself.Castbar.Overlay:SetPoint(\"TOPLEFT\", -2, 2)\n\t\tself.Castbar.Overlay:SetPoint(\"BOTTOMRIGHT\", 2, -2)\n\n\t\tself.Castbar.PostCastStart = T.PostCastStart\n\n\t\tif unit == \"player\" then\n\t\t\tif C.unitframe.castbar_icon == true then\n\t\t\t\tself.Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4] + ((C.unitframe.castbar_height + 7) / 2) , C.position.unitframes.player_castbar[5])\n\t\t\t\tself.Castbar:SetWidth(C.unitframe.castbar_width)\n\t\t\telse\n\t\t\t\tself.Castbar:SetPoint(unpack(C.position.unitframes.player_castbar))\n\t\t\t\tself.Castbar:SetWidth(C.unitframe.castbar_width + C.unitframe.castbar_height + 7)\n\t\t\tend\n\t\t\tself.Castbar:SetHeight(C.unitframe.castbar_height)\n\t\telseif unit == \"target\" then\n\t\t\tif C.unitframe.castbar_icon == true then\n\t\t\t\tif C.unitframe.plugins_swing == true then\n\t\t\t\t\tself.Castbar:SetPoint(C.position.unitframes.target_castbar[1], C.position.unitframes.target_castbar[2], C.position.unitframes.target_castbar[3], C.position.unitframes.target_castbar[4] - C.unitframe.castbar_height - 7, C.position.unitframes.target_castbar[5] + 12)\n\t\t\t\telse\n\t\t\t\t\tself.Castbar:SetPoint(C.position.unitframes.target_castbar[1], C.position.unitframes.target_castbar[2], C.position.unitframes.target_castbar[3], C.position.unitframes.target_castbar[4] - C.unitframe.castbar_height - 7, C.position.unitframes.target_castbar[5])\n\t\t\t\tend\n\t\t\t\tself.Castbar:SetWidth(C.unitframe.castbar_width)\n\t\t\telse\n\t\t\t\tif C.unitframe.plugins_swing == true then\n\t\t\t\t\tself.Castbar:SetPoint(C.position.unitframes.target_castbar[1], C.position.unitframes.target_castbar[2], C.position.unitframes.target_castbar[3], C.position.unitframes.target_castbar[4], C.position.unitframes.target_castbar[5] + 12)\n\t\t\t\telse\n\t\t\t\t\tself.Castbar:SetPoint(unpack(C.position.unitframes.target_castbar))\n\t\t\t\tend\n\t\t\t\tself.Castbar:SetWidth(C.unitframe.castbar_width + C.unitframe.castbar_height + 7)\n\t\t\tend\n\t\t\tself.Castbar:SetHeight(C.unitframe.castbar_height)\n\t\telseif unit == \"arena\" or unit == \"boss\" then\n\t\t\tself.Castbar:SetPoint(\"TOPLEFT\", self, \"BOTTOMLEFT\", 0, -7)\n\t\t\tself.Castbar:SetWidth(boss_width)\n\t\t\tself.Castbar:SetHeight(16)\n\t\telse\n\t\t\tself.Castbar:SetPoint(\"TOPLEFT\", self, \"BOTTOMLEFT\", 0, -7)\n\t\t\tself.Castbar:SetWidth(pet_width)\n\t\t\tself.Castbar:SetHeight(5)\n\t\tend\n\n\t\tif unit == \"player\" or unit == \"target\" or unit == \"arena\" or unit == \"boss\" then\n\t\t\tself.Castbar.Time = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\tself.Castbar.Time:SetPoint(\"RIGHT\", self.Castbar, \"RIGHT\", 0, 0)\n\t\t\tself.Castbar.Time:SetTextColor(1, 1, 1)\n\t\t\tself.Castbar.Time:SetJustifyH(\"RIGHT\")\n\t\t\tself.Castbar.CustomTimeText = T.CustomCastTimeText\n\t\t\tself.Castbar.CustomDelayText = T.CustomCastDelayText\n\n\t\t\tself.Castbar.Text = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\tself.Castbar.Text:SetPoint(\"LEFT\", self.Castbar, \"LEFT\", 2, 0)\n\t\t\tself.Castbar.Text:SetTextColor(1, 1, 1)\n\t\t\tself.Castbar.Text:SetJustifyH(\"LEFT\")\n\t\t\tself.Castbar.Text:SetWordWrap(false)\n\t\t\tself.Castbar.Text:SetWidth(self.Castbar:GetWidth() - 50)\n\n\t\t\tif (C.unitframe.castbar_icon == true and (unit == \"player\" or unit == \"target\")) or unit == \"arena\" or unit == \"boss\" then\n\t\t\t\tself.Castbar.Button = CreateFrame(\"Frame\", nil, self.Castbar)\n\t\t\t\tself.Castbar.Button:SetSize(self.Castbar:GetHeight() + 4, self.Castbar:GetHeight() + 4)\n\t\t\t\tself.Castbar.Button:SetTemplate(\"Default\")\n\n\t\t\t\tself.Castbar.Icon = self.Castbar.Button:CreateTexture(nil, \"ARTWORK\")\n\t\t\t\tself.Castbar.Icon:SetPoint(\"TOPLEFT\", self.Castbar.Button, 2, -2)\n\t\t\t\tself.Castbar.Icon:SetPoint(\"BOTTOMRIGHT\", self.Castbar.Button, -2, 2)\n\t\t\t\tself.Castbar.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\t\tif unit == \"player\" then\n\t\t\t\t\tself.Castbar.Button:SetPoint(\"RIGHT\", self.Castbar, \"LEFT\", -5, 0)\n\t\t\t\telseif unit == \"target\" then\n\t\t\t\t\tself.Castbar.Button:SetPoint(\"LEFT\", self.Castbar, \"RIGHT\", 5, 0)\n\t\t\t\telseif unit == \"boss\" then\n\t\t\t\t\tif C.unitframe.boss_on_right == true then\n\t\t\t\t\t\tself.Castbar.Button:SetPoint(\"TOPRIGHT\", self.Castbar, \"TOPLEFT\", -5, 2)\n\t\t\t\t\telse\n\t\t\t\t\t\tself.Castbar.Button:SetPoint(\"TOPLEFT\", self.Castbar, \"TOPRIGHT\", 5, 2)\n\t\t\t\t\tend\n\t\t\t\telseif unit == \"arena\" then\n\t\t\t\t\tif C.unitframe.arena_on_right == true then\n\t\t\t\t\t\tself.Castbar.Button:SetPoint(\"TOPRIGHT\", self.Castbar, \"TOPLEFT\", -5, 2)\n\t\t\t\t\telse\n\t\t\t\t\t\tself.Castbar.Button:SetPoint(\"TOPLEFT\", self.Castbar, \"TOPRIGHT\", 5, 2)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif unit == \"player\" and C.unitframe.castbar_latency == true then\n\t\t\t\tself.Castbar.SafeZone = self.Castbar:CreateTexture(nil, \"BORDER\", nil, 1)\n\t\t\t\tself.Castbar.SafeZone:SetTexture(C.media.texture)\n\t\t\t\tself.Castbar.SafeZone:SetVertexColor(0.85, 0.27, 0.27)\n\n\t\t\t\tself.Castbar.Latency = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\t\tself.Castbar.Latency:SetTextColor(1, 1, 1)\n\t\t\t\tself.Castbar.Latency:SetPoint(\"TOPRIGHT\", self.Castbar.Time, \"BOTTOMRIGHT\", 0, 0)\n\t\t\t\tself.Castbar.Latency:SetJustifyH(\"RIGHT\")\n\t\t\tend\n\t\tend\n\n\t\tif unit == \"focus\" then\n\t\t\tself.Castbar.Button = CreateFrame(\"Frame\", nil, self.Castbar)\n\t\t\tself.Castbar.Button:SetSize(65, 65)\n\t\t\tself.Castbar.Button:SetPoint(unpack(C.position.unitframes.focus_castbar))\n\t\t\tself.Castbar.Button:SetTemplate(\"Default\")\n\n\t\t\tself.Castbar.Icon = self.Castbar.Button:CreateTexture(nil, \"ARTWORK\")\n\t\t\tself.Castbar.Icon:SetPoint(\"TOPLEFT\", self.Castbar.Button, 2, -2)\n\t\t\tself.Castbar.Icon:SetPoint(\"BOTTOMRIGHT\", self.Castbar.Button, -2, 2)\n\t\t\tself.Castbar.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\tself.Castbar.Time = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)\n\t\t\tself.Castbar.Time:SetParent(self.Castbar.Button)\n\t\t\tself.Castbar.Time:SetPoint(\"CENTER\", self.Castbar.Icon, \"CENTER\", 0, 10)\n\t\t\tself.Castbar.Time:SetTextColor(1, 1, 1)\n\n\t\t\tself.Castbar.Time2 = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)\n\t\t\tself.Castbar.Time2:SetParent(self.Castbar.Button)\n\t\t\tself.Castbar.Time2:SetPoint(\"CENTER\", self.Castbar.Icon, \"CENTER\", 0, -10)\n\t\t\tself.Castbar.Time2:SetTextColor(1, 1, 1)\n\n\t\t\tself.Castbar.CustomTimeText = function(self, duration)\n\t\t\t\tself.Time:SetText((\"%.1f\"):format(self.max))\n\t\t\t\tself.Time2:SetText((\"%.1f\"):format(self.channeling and duration or self.max - duration))\n\t\t\tend\n\t\t\tself.Castbar.CustomDelayText = function(self)\n\t\t\t\tself.Time:SetText((\"|cffaf5050%s %.1f|r\"):format(self.channeling and \"-\" or \"+\", abs(self.delay)))\n\t\t\tend\n\t\tend\n\tend\n\n\t-- Swing bar\n\tif C.unitframe.plugins_swing == true and unit == \"player\" then\n\t\tself.Swing = CreateFrame(\"StatusBar\", self:GetName()..\"_Swing\", self)\n\t\tself.Swing:CreateBackdrop(\"Default\")\n\t\tif C.unitframe.unit_castbar then\n\t\t\tself.Swing:SetPoint(\"BOTTOMRIGHT\", \"oUF_Player_Castbar\", \"TOPRIGHT\", 0, 7)\n\t\telse\n\t\t\tself.Swing:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4], C.position.unitframes.player_castbar[5] + 23)\n\t\tend\n\t\tself.Swing:SetSize(281, 5)\n\t\tself.Swing:SetStatusBarTexture(C.media.texture)\n\t\tif C.unitframe.own_color == true then\n\t\t\tself.Swing:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\t\telse\n\t\t\tself.Swing:SetStatusBarColor(T.color.r, T.color.g, T.color.b)\n\t\tend\n\n\t\tself.Swing.bg = self.Swing:CreateTexture(nil, \"BORDER\")\n\t\tself.Swing.bg:SetAllPoints(self.Swing)\n\t\tself.Swing.bg:SetTexture(C.media.texture)\n\t\tif C.unitframe.own_color == true then\n\t\t\tself.Swing.bg:SetVertexColor(unpack(C.unitframe.uf_color_bg))\n\t\telse\n\t\t\tself.Swing.bg:SetVertexColor(T.color.r, T.color.g, T.color.b, 0.2)\n\t\tend\n\n\t\tself.Swing.Text = T.SetFontString(self.Swing, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tself.Swing.Text:SetPoint(\"CENTER\", 0, 0)\n\t\tself.Swing.Text:SetTextColor(1, 1, 1)\n\tend\n\n\tif C.unitframe.show_arena and unit == \"arena\" then\n\t\tself.Trinket = CreateFrame(\"Frame\", self:GetName()..\"_Trinket\", self)\n\t\tself.Trinket:SetSize(31 + T.extraHeight, 31 + T.extraHeight)\n\t\tself.Trinket:SetTemplate(\"Default\")\n\n\t\tif C.unitframe.arena_on_right == true then\n\t\t\tself.Trinket:SetPoint(\"TOPRIGHT\", self, \"TOPLEFT\", -5, 2)\n\t\telse\n\t\t\tself.Trinket:SetPoint(\"TOPLEFT\", self, \"TOPRIGHT\", 5, 2)\n\t\tend\n\n\t\tself.FactionIcon = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.FactionIcon:SetSize(16, 16)\n\t\tself.FactionIcon:SetPoint(\"TOP\", 0, 0)\n\n\t\tself.AuraTracker = CreateFrame(\"Frame\", self:GetName()..\"_AuraTracker\", self)\n\t\tself.AuraTracker:SetWidth(self.Trinket:GetWidth())\n\t\tself.AuraTracker:SetHeight(self.Trinket:GetHeight())\n\t\tself.AuraTracker:SetPoint(\"CENTER\", self.Trinket, \"CENTER\")\n\t\tself.AuraTracker:SetFrameStrata(\"HIGH\")\n\n\t\tself.AuraTracker.icon = self.AuraTracker:CreateTexture(nil, \"ARTWORK\")\n\t\tself.AuraTracker.icon:SetWidth(self.Trinket:GetWidth())\n\t\tself.AuraTracker.icon:SetHeight(self.Trinket:GetHeight())\n\t\tself.AuraTracker.icon:SetPoint(\"TOPLEFT\", self.Trinket, 2, -2)\n\t\tself.AuraTracker.icon:SetPoint(\"BOTTOMRIGHT\", self.Trinket, -2, 2)\n\t\tself.AuraTracker.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\tself.AuraTracker.text = T.SetFontString(self.AuraTracker, C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)\n\t\tself.AuraTracker.text:SetPoint(\"CENTER\", self.AuraTracker, 0, 0)\n\t\tself.AuraTracker:SetScript(\"OnUpdate\", T.AuraTrackerTime)\n\n\t\tif C.unitframe.plugins_enemy_spec == true then\n\t\t\tself.EnemySpec = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\tself.EnemySpec:SetTextColor(1, 0, 0)\n\t\t\tif C.unitframe.arena_on_right == true then\n\t\t\t\tself.EnemySpec:SetPoint(\"RIGHT\", self.Power, \"RIGHT\", 0, 0)\n\t\t\t\tself.EnemySpec:SetJustifyH(\"LEFT\")\n\t\t\telse\n\t\t\t\tself.EnemySpec:SetPoint(\"LEFT\", self.Power, \"LEFT\", 2, 0)\n\t\t\t\tself.EnemySpec:SetJustifyH(\"RIGHT\")\n\t\t\tend\n\t\tend\n\tend\n\n\tif C.unitframe.show_boss and unit == \"boss\" then\n\t\tself.AlternativePower = CreateFrame(\"StatusBar\", nil, self.Health, \"BackdropTemplate\")\n\t\tself.AlternativePower:SetFrameLevel(self.Health:GetFrameLevel() + 1)\n\t\tself.AlternativePower:SetHeight(5)\n\t\tself.AlternativePower:SetStatusBarTexture(C.media.texture)\n\t\tself.AlternativePower:SetStatusBarColor(0.9, 0, 0)\n\t\tself.AlternativePower:SetPoint(\"LEFT\")\n\t\tself.AlternativePower:SetPoint(\"RIGHT\")\n\t\tself.AlternativePower:SetPoint(\"TOP\", self.Health, \"TOP\")\n\t\tself.AlternativePower:SetBackdrop({\n\t\t\tbgFile = C.media.blank,\n\t\t\tedgeFile = C.media.blank,\n\t\t\ttile = false, tileSize = 0, edgeSize = T.Scale(1),\n\t\t\tinsets = {left = 0, right = 0, top = 0, bottom = T.Scale(-1)}\n\t\t})\n\t\tself.AlternativePower:SetBackdropColor(0, 0, 0)\n\t\tself.AlternativePower:SetBackdropBorderColor(0, 0, 0)\n\n\t\tself.AlternativePower.text = T.SetFontString(self.AlternativePower, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tself.AlternativePower.text:SetPoint(\"CENTER\", self.AlternativePower, \"CENTER\", 0, 0)\n\t\tself:Tag(self.AlternativePower.text, \"[AltPower]\")\n\n\t\tif C.aura.boss_auras == true then\n\t\t\tself.Auras = CreateFrame(\"Frame\", self:GetName()..\"_Auras\", self)\n\t\t\tif C.unitframe.boss_on_right == true then\n\t\t\t\tself.Auras:SetPoint(\"RIGHT\", self, \"LEFT\", -5, 0)\n\t\t\t\tself.Auras.initialAnchor = \"RIGHT\"\n\t\t\t\tself.Auras[\"growth-x\"] = \"LEFT\"\n\t\t\telse\n\t\t\t\tself.Auras:SetPoint(\"LEFT\", self, \"RIGHT\", 5, 0)\n\t\t\t\tself.Auras.initialAnchor = \"LEFT\"\n\t\t\t\tself.Auras[\"growth-x\"] = \"RIGHT\"\n\t\t\tend\n\t\t\tself.Auras.numDebuffs = C.aura.boss_debuffs\n\t\t\tself.Auras.numBuffs = C.aura.boss_buffs\n\t\t\tself.Auras:SetHeight(31 + T.extraHeight)\n\t\t\tself.Auras:SetWidth((34 + T.extraHeight) * (C.aura.boss_debuffs + C.aura.boss_buffs + 1))\n\t\t\tself.Auras.spacing = T.Scale(3)\n\t\t\tself.Auras.size = T.Scale(31 + T.extraHeight)\n\t\t\tself.Auras.gap = true\n\t\t\tself.Auras.PostCreateButton = T.PostCreateIcon\n\t\t\tself.Auras.PostUpdateButton = T.PostUpdateIcon\n\t\t\tself.Auras.FilterAura = T.CustomFilterBoss\n\t\tend\n\n\t\tself:HookScript(\"OnShow\", T.UpdateAllElements)\n\tend\n\n\t-- Aggro border\n\tif C.raidframe.aggro_border == true and unit ~= \"arenatarget\" then\n\t\tself.ThreatIndicator = CreateFrame(\"Frame\", nil, self)\n\t\tself.ThreatIndicator.PostUpdate = T.UpdateThreat\n\tend\n\n\t-- Raid marks\n\tif C.raidframe.icons_raid_mark == true then\n\t\tself.RaidTargetIndicator = self:CreateTexture(nil, \"OVERLAY\")\n\t\tself.RaidTargetIndicator:SetParent(self.Health)\n\t\tself.RaidTargetIndicator:SetSize((unit == \"player\" or unit == \"target\") and 15 or 12, (unit == \"player\" or unit == \"target\") and 15 or 12)\n\t\tself.RaidTargetIndicator:SetPoint(\"TOP\", self.Health, 0, 0)\n\tend\n\n\t-- Debuff highlight\n\tif unit ~= \"arenatarget\" then\n\t\tself.DebuffHighlight = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.DebuffHighlight:SetAllPoints(self.Health)\n\t\tself.DebuffHighlight:SetTexture(C.media.highlight)\n\t\tself.DebuffHighlight:SetVertexColor(0, 0, 0, 0)\n\t\tself.DebuffHighlight:SetBlendMode(\"ADD\")\n\t\tself.DebuffHighlightAlpha = 1\n\t\tself.DebuffHighlightFilter = true\n\tend\n\n\t-- Incoming heals and heal/damage absorbs\n\tif C.raidframe.plugins_healcomm == true then\n\t\tT.CreateHealthPrediction(self)\n\tend\n\n\t-- Power Prediction bar\n\tif C.unitframe.plugins_power_prediction == true and unit == \"player\" then\n\t\tlocal mainBar = CreateFrame(\"StatusBar\", self:GetName()..\"_PowerPrediction\", self.Power)\n\t\tmainBar:SetReverseFill(true)\n\t\tmainBar:SetPoint(\"TOP\")\n\t\tmainBar:SetPoint(\"BOTTOM\")\n\t\tmainBar:SetPoint(\"RIGHT\", self.Power:GetStatusBarTexture(), \"RIGHT\")\n\t\tmainBar:SetStatusBarTexture(C.media.texture)\n\t\tmainBar:SetStatusBarColor(1, 1, 1, 0.5)\n\t\tmainBar:SetWidth(player_width)\n\n\t\tself.PowerPrediction = {\n\t\t\tmainBar = mainBar\n\t\t}\n\tend\n\n\t-- Fader\n\tif C.unitframe.plugins_fader == true then\n\t\tif unit ~= \"arena\" or unit ~= \"arenatarget\" or unit ~= \"boss\" then\n\t\t\tself.Fader = {\n\t\t\t\t[1] = {Combat = 1, Arena = 1, Instance = 1},\n\t\t\t\t[2] = {PlayerTarget = 1, PlayerNotMaxHealth = 1, PlayerNotMaxMana = 1, Casting = 1},\n\t\t\t\t[3] = {Stealth = 0.5},\n\t\t\t\t[4] = {notCombat = 0, PlayerTaxi = 0},\n\t\t\t}\n\t\tend\n\t\tself.NormalAlpha = 1\n\tend\n\n\tT.HideAuraFrame(self)\n\n\tif T.PostCreateUnitFrames then\n\t\tT.PostCreateUnitFrames(self, unit)\n\tend\n\n\treturn self\nend\n\n----------------------------------------------------------------------------------------\n--\tDefault position of ShestakUI unitframes\n----------------------------------------------------------------------------------------\noUF:RegisterStyle(\"Shestak\", Shared)\n\nlocal player = oUF:Spawn(\"player\", \"oUF_Player\")\nplayer:SetPoint(unpack(C.position.unitframes.player))\nplayer:SetSize(player_width, 27 + T.extraHeight)\n\nlocal target = oUF:Spawn(\"target\", \"oUF_Target\")\ntarget:SetPoint(unpack(C.position.unitframes.target))\ntarget:SetSize(player_width, 27 + T.extraHeight)\n\nif C.unitframe.show_pet == true then\n\tlocal pet = oUF:Spawn(\"pet\", \"oUF_Pet\")\n\tpet:SetPoint(unpack(C.position.unitframes.pet))\n\tpet:SetSize(pet_width, 16 + (C.unitframe.extra_health_height / 2))\nend\n\nif C.unitframe.show_focus == true then\n\tlocal focus = oUF:Spawn(\"focus\", \"oUF_Focus\")\n\tfocus:SetPoint(unpack(C.position.unitframes.focus))\n\tfocus:SetSize(pet_width, 16 + (C.unitframe.extra_health_height / 2))\n\n\tlocal focustarget = oUF:Spawn(\"focustarget\", \"oUF_FocusTarget\")\n\tfocustarget:SetPoint(unpack(C.position.unitframes.focus_target))\n\tfocustarget:SetSize(pet_width, 16 + (C.unitframe.extra_health_height / 2))\nend\n\nif C.unitframe.show_target_target == true then\n\tlocal targettarget = oUF:Spawn(\"targettarget\", \"oUF_TargetTarget\")\n\ttargettarget:SetPoint(unpack(C.position.unitframes.target_target))\n\ttargettarget:SetSize(pet_width, 16 + (C.unitframe.extra_health_height / 2))\nend\n\nif C.unitframe.show_boss == true then\n\tlocal boss = {}\n\tfor i = 1, 8 do\n\t\tboss[i] = oUF:Spawn(\"boss\"..i, \"oUF_Boss\"..i)\n\t\tif i == 1 then\n\t\t\tif C.unitframe.boss_on_right == true then\n\t\t\t\tboss[i]:SetPoint(unpack(C.position.unitframes.boss))\n\t\t\telse\n\t\t\t\tboss[i]:SetPoint(\"BOTTOMLEFT\", C.position.unitframes.boss[2], \"LEFT\", C.position.unitframes.boss[4] + 46, C.position.unitframes.boss[5])\n\t\t\tend\n\t\telse\n\t\t\tboss[i]:SetPoint(\"BOTTOM\", boss[i-1], \"TOP\", 0, 30)\n\t\tend\n\t\tboss[i]:SetSize(boss_width, 27 + T.extraHeight)\n\tend\nend\n\nif C.unitframe.show_arena == true then\n\tlocal arena = {}\n\tfor i = 1, 5 do\n\t\tarena[i] = oUF:Spawn(\"arena\"..i, \"oUF_Arena\"..i)\n\t\tif i == 1 then\n\t\t\tif C.unitframe.arena_on_right == true then\n\t\t\t\tarena[i]:SetPoint(unpack(C.position.unitframes.arena))\n\t\t\telse\n\t\t\t\tarena[i]:SetPoint(\"BOTTOMLEFT\", C.position.unitframes.arena[2], \"LEFT\", C.position.unitframes.arena[4] + 120, C.position.unitframes.arena[5])\n\t\t\tend\n\t\telse\n\t\t\tarena[i]:SetPoint(\"BOTTOM\", arena[i-1], \"TOP\", 0, 30)\n\t\tend\n\t\tarena[i]:SetSize(boss_width, 27 + T.extraHeight)\n\tend\n\n\tlocal arenatarget = {}\n\tfor i = 1, 5 do\n\t\tarenatarget[i] = oUF:Spawn(\"arena\"..i..\"target\", \"oUF_Arena\"..i..\"Target\")\n\t\tif i == 1 then\n\t\t\tif C.unitframe.arena_on_right == true then\n\t\t\t\tarenatarget[i]:SetPoint(\"TOPLEFT\", arena[i], \"TOPRIGHT\", 7, 0)\n\t\t\telse\n\t\t\t\tarenatarget[i]:SetPoint(\"TOPRIGHT\", arena[i], \"TOPLEFT\", -7, 0)\n\t\t\tend\n\t\telse\n\t\t\tarenatarget[i]:SetPoint(\"BOTTOM\", arenatarget[i-1], \"TOP\", 0, 30)\n\t\tend\n\t\tarenatarget[i]:SetSize(30 + T.extraHeight, 27 + T.extraHeight)\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tArena preparation(by Blizzard)(../Blizzard_ArenaUI/Blizzard_ArenaUI.lua)\n----------------------------------------------------------------------------------------\nif C.unitframe.show_arena == true then\n\tlocal arenaprep = {}\n\tfor i = 1, 5 do\n\t\tarenaprep[i] = CreateFrame(\"Frame\", \"oUF_ArenaPrep\"..i, UIParent)\n\t\tarenaprep[i]:SetAllPoints(_G[\"oUF_Arena\"..i])\n\t\tarenaprep[i]:CreateBackdrop(\"Default\")\n\t\tarenaprep[i]:SetFrameStrata(\"BACKGROUND\")\n\n\t\tarenaprep[i].Health = CreateFrame(\"StatusBar\", nil, arenaprep[i])\n\t\tarenaprep[i].Health:SetAllPoints()\n\t\tarenaprep[i].Health:SetStatusBarTexture(C.media.texture)\n\n\t\tarenaprep[i].Spec = T.SetFontString(arenaprep[i].Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tarenaprep[i].Spec:SetPoint(\"CENTER\")\n\n\t\tarenaprep[i]:Hide()\n\tend\n\n\tlocal arenaprepupdate = CreateFrame(\"Frame\")\n\tarenaprepupdate:RegisterEvent(\"PLAYER_LOGIN\")\n\tarenaprepupdate:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tarenaprepupdate:RegisterEvent(\"ARENA_OPPONENT_UPDATE\")\n\tarenaprepupdate:RegisterEvent(\"ARENA_PREP_OPPONENT_SPECIALIZATIONS\")\n\tarenaprepupdate:SetScript(\"OnEvent\", function(_, event)\n\t\tif event == \"PLAYER_LOGIN\" then\n\t\t\tfor i = 1, 5 do\n\t\t\t\tarenaprep[i]:SetAllPoints(_G[\"oUF_Arena\"..i])\n\t\t\tend\n\t\telseif event == \"ARENA_OPPONENT_UPDATE\" then\n\t\t\tfor i = 1, 5 do\n\t\t\t\tarenaprep[i]:Hide()\n\t\t\tend\n\t\telse\n\t\t\tlocal numOpps = GetNumArenaOpponentSpecs()\n\n\t\t\tif numOpps > 0 then\n\t\t\t\tfor i = 1, 5 do\n\t\t\t\t\tlocal f = arenaprep[i]\n\n\t\t\t\t\tif i <= numOpps then\n\t\t\t\t\t\tlocal s = GetArenaOpponentSpec(i)\n\t\t\t\t\t\tlocal _, spec, class = nil, \"UNKNOWN\", \"UNKNOWN\"\n\n\t\t\t\t\t\tif s and s > 0 then\n\t\t\t\t\t\t\t_, spec, _, _, _, class = GetSpecializationInfoByID(s)\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif class and spec then\n\t\t\t\t\t\t\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]\n\t\t\t\t\t\t\tif C.unitframe.own_color == true then\n\t\t\t\t\t\t\t\tf.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\t\t\t\t\t\t\t\tf.Spec:SetText(spec)\n\t\t\t\t\t\t\t\tf.Spec:SetTextColor(color.r, color.g, color.b)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif color then\n\t\t\t\t\t\t\t\t\tf.Health:SetStatusBarColor(color.r, color.g, color.b)\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tf.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tf.Spec:SetText(spec)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tf:Show()\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tf:Hide()\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tfor i = 1, 5 do\n\t\t\t\t\tarenaprep[i]:Hide()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tTest UnitFrames(by community)\n----------------------------------------------------------------------------------------\nlocal moving = false\nSlashCmdList.TEST_UF = function()\n\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\tif not moving then\n\t\tfor _, frames in pairs({\"oUF_Target\", \"oUF_TargetTarget\", \"oUF_Pet\", \"oUF_Focus\", \"oUF_FocusTarget\"}) do\n\t\t\tif _G[frames] then\n\t\t\t\t_G[frames].oldunit = _G[frames].unit\n\t\t\t\t_G[frames]:SetAttribute(\"unit\", \"player\")\n\t\t\tend\n\t\tend\n\n\t\t-- if C.unitframe.show_arena == true then\n\t\t\t-- for i = 1, 5 do\n\t\t\t\t-- _G[\"oUF_Arena\"..i].oldunit = _G[\"oUF_Arena\"..i].unit\n\t\t\t\t-- _G[\"oUF_Arena\"..i].Trinket.Hide = T.dummy\n\t\t\t\t-- _G[\"oUF_Arena\"..i].Trinket.Icon:SetTexture(\"Interface\\\\Icons\\\\INV_Jewelry_Necklace_37\")\n\t\t\t\t-- _G[\"oUF_Arena\"..i]:SetAttribute(\"unit\", \"player\")\n\n\t\t\t\t-- _G[\"oUF_Arena\"..i..\"Target\"].oldunit = _G[\"oUF_Arena\"..i..\"Target\"].unit\n\t\t\t\t-- _G[\"oUF_Arena\"..i..\"Target\"]:SetAttribute(\"unit\", \"player\")\n\n\t\t\t\t-- if C.unitframe.plugins_enemy_spec == true then\n\t\t\t\t\t-- _G[\"oUF_Arena\"..i].EnemySpec:SetText(SPECIALIZATION)\n\t\t\t\t-- end\n\n\t\t\t\t-- if C.unitframe.plugins_diminishing == true then\n\t\t\t\t\t-- SlashCmdList.DIMINISHINGCD()\n\t\t\t\t-- end\n\t\t\t-- end\n\t\t-- end\n\n\t\tif C.unitframe.show_boss == true then\n\t\t\tfor i = 1, 8 do\n\t\t\t\t_G[\"oUF_Boss\"..i].oldunit = _G[\"oUF_Boss\"..i].unit\n\t\t\t\t_G[\"oUF_Boss\"..i]:SetAttribute(\"unit\", \"player\")\n\t\t\tend\n\t\tend\n\t\tmoving = true\n\telse\n\t\tfor _, frames in pairs({\"oUF_Target\", \"oUF_TargetTarget\", \"oUF_Pet\", \"oUF_Focus\", \"oUF_FocusTarget\"}) do\n\t\t\tif _G[frames] then\n\t\t\t\t_G[frames].unit = _G[frames].oldunit\n\t\t\t\t_G[frames]:SetAttribute(\"unit\", _G[frames].unit)\n\t\t\tend\n\t\tend\n\n\t\t-- if C.unitframe.show_arena == true then\n\t\t\t-- for i = 1, 5 do\n\t\t\t\t-- _G[\"oUF_Arena\"..i].Trinket.Hide = nil\n\t\t\t\t-- _G[\"oUF_Arena\"..i]:SetAttribute(\"unit\", _G[\"oUF_Arena\"..i].oldunit)\n\t\t\t\t-- _G[\"oUF_Arena\"..i..\"Target\"]:SetAttribute(\"unit\", _G[\"oUF_Arena\"..i..\"Target\"].oldunit)\n\t\t\t-- end\n\t\t-- end\n\n\t\tif C.unitframe.show_boss == true then\n\t\t\tfor i = 1, 8 do\n\t\t\t\t_G[\"oUF_Boss\"..i].unit = _G[\"oUF_Boss\"..i].oldunit\n\t\t\t\t_G[\"oUF_Boss\"..i]:SetAttribute(\"unit\", _G[\"oUF_Boss\"..i].unit)\n\t\t\tend\n\t\tend\n\t\tmoving = false\n\tend\nend\nSLASH_TEST_UF1 = \"/testui\"\nSLASH_TEST_UF2 = \"/еуыегш\"\nSLASH_TEST_UF3 = \"/testuf\"\nSLASH_TEST_UF4 = \"/еуыега\"\n\n----------------------------------------------------------------------------------------\n--\tPlayer line\n----------------------------------------------------------------------------------------\nif C.unitframe.lines == true then\n\tlocal HorizontalPlayerLine = CreateFrame(\"Frame\", \"HorizontalPlayerLine\", oUF_Player)\n\tHorizontalPlayerLine:CreatePanel(\"ClassColor\", player_width + 11, 1, \"TOPLEFT\", \"oUF_Player\", \"BOTTOMLEFT\", -5, -5)\n\tHorizontalPlayerLine:SetBackdropBorderColor(T.color.r, T.color.g, T.color.b)\n\n\tlocal VerticalPlayerLine = CreateFrame(\"Frame\", \"VerticalPlayerLine\", oUF_Player)\n\tVerticalPlayerLine:CreatePanel(\"ClassColor\", 1, 98 + T.extraHeight + (C.unitframe.extra_health_height / 2), \"TOPRIGHT\", \"oUF_Player\", \"TOPLEFT\", -5, 30)\n\tVerticalPlayerLine:SetBackdropBorderColor(T.color.r, T.color.g, T.color.b)\nend\n\n----------------------------------------------------------------------------------------\n--\tTarget line\n----------------------------------------------------------------------------------------\nif C.unitframe.lines == true then\n\tlocal HorizontalTargetLine = CreateFrame(\"Frame\", \"HorizontalTargetLine\", oUF_Target)\n\tHorizontalTargetLine:CreatePanel(\"ClassColor\", player_width + 11, 1, \"TOPRIGHT\", \"oUF_Target\", \"BOTTOMRIGHT\", 5, -5)\n\tHorizontalTargetLine:RegisterEvent(\"PLAYER_TARGET_CHANGED\")\n\tHorizontalTargetLine:SetScript(\"OnEvent\", function(self)\n\t\tlocal _, class = UnitClass(\"target\")\n\t\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]\n\t\tif color then\n\t\t\tself:SetBackdropBorderColor(color.r, color.g, color.b)\n\t\telse\n\t\t\tself:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\tend)\n\n\tlocal VerticalTargetLine = CreateFrame(\"Frame\", \"VerticalTargetLine\", oUF_Target)\n\tVerticalTargetLine:CreatePanel(\"ClassColor\", 1, 98 + T.extraHeight + (C.unitframe.extra_health_height / 2), \"TOPLEFT\", \"oUF_Target\", \"TOPRIGHT\", 5, 30)\n\tVerticalTargetLine:RegisterEvent(\"PLAYER_TARGET_CHANGED\")\n\tVerticalTargetLine:SetScript(\"OnEvent\", function(self)\n\t\tlocal _, class = UnitClass(\"target\")\n\t\tlocal color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]\n\t\tif color then\n\t\t\tself:SetBackdropBorderColor(color.r, color.g, color.b)\n\t\telse\n\t\t\tself:SetBackdropBorderColor(unpack(C.media.border_color))\n\t\tend\n\tend)\nend\n\n----------------------------------------------------------------------------------------\n--\tAuto reposition heal raid frame\n----------------------------------------------------------------------------------------\nif C.raidframe.auto_position == \"DYNAMIC\" then\n\tlocal prevNum = 5\n\tlocal function Reposition(self, event)\n\t\tif (C.raidframe.layout == \"HEAL\" or C.raidframe.layout == \"AUTO\") and not C.raidframe.raid_groups_vertical and C.raidframe.raid_groups > 5 then\n\t\t\tif InCombatLockdown() then\n\t\t\t\tself:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\t\t\treturn\n\t\t\tend\n\t\t\tlocal maxGroup = 5\n\t\t\tlocal num = GetNumGroupMembers()\n\t\t\tif num > 5 then\n\t\t\t\tlocal _, _, subgroup = GetRaidRosterInfo(num)\n\t\t\t\tif subgroup and subgroup > maxGroup then\n\t\t\t\t\tmaxGroup = subgroup\n\t\t\t\tend\n\t\t\tend\n\t\t\tif maxGroup >= C.raidframe.raid_groups then\n\t\t\t\tmaxGroup = C.raidframe.raid_groups\n\t\t\tend\n\t\t\tif C.raidframe.layout == \"AUTO\" and not T.IsHealerSpec() then maxGroup = 5 end\n\t\t\tif prevNum ~= maxGroup then\n\t\t\t\t-- local offset = (maxGroup - 5) * (C.raidframe.heal_raid_height + 7) + ((maxGroup - ((maxGroup - 5))) * (C.raidframe.heal_raid_height - 26))\n\t\t\t\tlocal offset = (maxGroup - 5) * (C.raidframe.heal_raid_height + 7)\n\t\t\t\tif C.raidframe.layout == \"AUTO\" and not T.IsHealerSpec() then offset = 0 end\n\t\t\t\tif C.unitframe.castbar_icon == true then\n\t\t\t\t\toUF_Player_Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4] + 11, C.position.unitframes.player_castbar[5] + offset)\n\t\t\t\telse\n\t\t\t\t\toUF_Player_Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4], C.position.unitframes.player_castbar[5] + offset)\n\t\t\t\tend\n\n\t\t\t\tplayer:SetPoint(C.position.unitframes.player[1], C.position.unitframes.player[2], C.position.unitframes.player[3], C.position.unitframes.player[4], C.position.unitframes.player[5] + offset)\n\t\t\t\ttarget:SetPoint(C.position.unitframes.target[1], C.position.unitframes.target[2], C.position.unitframes.target[3], C.position.unitframes.target[4], C.position.unitframes.target[5] + offset)\n\t\t\t\tprevNum = maxGroup\n\t\t\tend\n\t\t\tif event == \"PLAYER_REGEN_ENABLED\" then\n\t\t\t\tself:UnregisterEvent(\"PLAYER_REGEN_ENABLED\")\n\t\t\tend\n\t\telse\n\t\t\tself:UnregisterAllEvents()\n\t\tend\n\tend\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"PLAYER_LOGIN\")\n\tframe:RegisterEvent(\"GROUP_ROSTER_UPDATE\")\n\tif C.raidframe.layout == \"AUTO\" then\n\t\tframe:RegisterUnitEvent(\"PLAYER_SPECIALIZATION_CHANGED\", \"player\")\n\tend\n\tframe:SetScript(\"OnEvent\", Reposition)\nelseif C.raidframe.auto_position == \"STATIC\" then\n\tlocal function Reposition(self)\n\t\tif (C.raidframe.layout == \"HEAL\" or C.raidframe.layout == \"AUTO\") and not C.raidframe.raid_groups_vertical and C.raidframe.raid_groups > 5 then\n\t\t\t-- local offset = (C.raidframe.raid_groups - 5) * (C.raidframe.heal_raid_height + 7) + ((C.raidframe.raid_groups - ((C.raidframe.raid_groups - 5))) * (C.raidframe.heal_raid_height - 26))\n\t\t\tlocal offset = (C.raidframe.raid_groups - 5) * (C.raidframe.heal_raid_height + 7)\n\t\t\tif C.raidframe.layout == \"AUTO\" and not T.IsHealerSpec() then offset = 0 end\n\t\t\tif C.unitframe.castbar_icon == true then\n\t\t\t\toUF_Player_Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4] + 11, C.position.unitframes.player_castbar[5] + offset)\n\t\t\telse\n\t\t\t\toUF_Player_Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4], C.position.unitframes.player_castbar[5] + offset)\n\t\t\tend\n\n\t\t\tplayer:SetPoint(C.position.unitframes.player[1], C.position.unitframes.player[2], C.position.unitframes.player[3], C.position.unitframes.player[4], C.position.unitframes.player[5] + offset)\n\t\t\ttarget:SetPoint(C.position.unitframes.target[1], C.position.unitframes.target[2], C.position.unitframes.target[3], C.position.unitframes.target[4], C.position.unitframes.target[5] + offset)\n\t\telse\n\t\t\tself:UnregisterAllEvents()\n\t\tend\n\tend\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"PLAYER_LOGIN\")\n\tif C.raidframe.layout == \"AUTO\" then\n\t\tframe:RegisterUnitEvent(\"PLAYER_SPECIALIZATION_CHANGED\", \"player\")\n\tend\n\tframe:SetScript(\"OnEvent\", Reposition)\nend"
  },
  {
    "path": "ShestakUI/Modules/UnitFrames/Nameplates.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.nameplate.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\toUF nameplates\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\nlocal frame = CreateFrame(\"Frame\")\nframe:SetScript(\"OnEvent\", function(self, event, ...) self[event](self, ...) end)\nif C.nameplate.combat == true then\n\tframe:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\tframe:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\n\tframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\n\tfunction frame:PLAYER_REGEN_ENABLED()\n\t\tSetCVar(\"nameplateShowEnemies\", 0)\n\tend\n\n\tfunction frame:PLAYER_REGEN_DISABLED()\n\t\tSetCVar(\"nameplateShowEnemies\", 1)\n\tend\n\n\tfunction frame:PLAYER_ENTERING_WORLD()\n\t\tif InCombatLockdown() then\n\t\t\tSetCVar(\"nameplateShowEnemies\", 1)\n\t\telse\n\t\t\tSetCVar(\"nameplateShowEnemies\", 0)\n\t\tend\n\tend\nend\n\nframe:RegisterEvent(\"PLAYER_LOGIN\")\nfunction frame:PLAYER_LOGIN()\n\tif C.nameplate.enhance_threat == true then\n\t\tSetCVar(\"threatWarning\", 3)\n\tend\n\tSetCVar(\"nameplateGlobalScale\", 1)\n\tSetCVar(\"namePlateMinScale\", 1)\n\tSetCVar(\"namePlateMaxScale\", 1)\n\tSetCVar(\"nameplateLargerScale\", 1)\n\tSetCVar(\"nameplateSelectedScale\", 1)\n\tSetCVar(\"nameplateMinAlpha\", 1)\n\tSetCVar(\"nameplateMaxAlpha\", 1)\n\tSetCVar(\"nameplateSelectedAlpha\", 1)\n\tSetCVar(\"nameplateNotSelectedAlpha\", 1)\n\tSetCVar(\"nameplateLargeTopInset\", 0.08)\n\n\tSetCVar(\"nameplateOtherTopInset\", C.nameplate.clamp and 0.08 or -1)\n\tSetCVar(\"nameplateOtherBottomInset\", C.nameplate.clamp and 0.1 or -1)\n\tSetCVar(\"clampTargetNameplateToScreen\", C.nameplate.clamp and \"1\" or \"0\")\n\n\tif C.nameplate.only_name then\n\t\tSetCVar(\"nameplateShowOnlyNames\", 1)\n\tend\n\n\tlocal function changeFont(self, size)\n\t\tlocal mult = size or 1\n\t\tself:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * mult * T.noscalemult, C.font.nameplates_font_style)\n\t\tself:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)\n\tend\n\tchangeFont(SystemFont_NamePlateFixed)\n\tchangeFont(SystemFont_LargeNamePlateFixed, 2)\nend\n\nlocal healList, exClass, healerSpecs = {}, {}, {}\n\nexClass.DEATHKNIGHT = true\nexClass.DEMONHUNTER = true\nexClass.HUNTER = true\nexClass.MAGE = true\nexClass.ROGUE = true\nexClass.WARLOCK = true\nexClass.WARRIOR = true\nif C.nameplate.healer_icon == true then\n\tlocal t = CreateFrame(\"Frame\")\n\tt.factions = {\n\t\t[\"Horde\"] = 1,\n\t\t[\"Alliance\"] = 0,\n\t}\n\tlocal healerSpecIDs = {\n\t\t105,\t-- Druid Restoration\n\t\t1468,\t-- Evoker Preservation\n\t\t270,\t-- Monk Mistweaver\n\t\t65,\t\t-- Paladin Holy\n\t\t256,\t-- Priest Discipline\n\t\t257,\t-- Priest Holy\n\t\t264,\t-- Shaman Restoration\n\t}\n\tfor _, specID in pairs(healerSpecIDs) do\n\t\tlocal _, name = GetSpecializationInfoByID(specID)\n\t\tif name and not healerSpecs[name] then\n\t\t\thealerSpecs[name] = true\n\t\tend\n\tend\n\n\tlocal lastCheck = 20\n\tlocal function CheckHealers(_, elapsed)\n\t\tlastCheck = lastCheck + elapsed\n\t\tif lastCheck > 25 then\n\t\t\tlastCheck = 0\n\t\t\thealList = {}\n\t\t\tfor i = 1, GetNumBattlefieldScores() do\n\t\t\t\tlocal name, _, _, _, _, faction, _, _, _, _, _, _, _, _, _, talentSpec = GetBattlefieldScore(i)\n\n\t\t\t\tif name and healerSpecs[talentSpec] and t.factions[UnitFactionGroup(\"player\")] == faction then\n\t\t\t\t\tname = name:match(\"(.+)%-.+\") or name\n\t\t\t\t\thealList[name] = talentSpec\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal function CheckArenaHealers(_, elapsed)\n\t\tlastCheck = lastCheck + elapsed\n\t\tif lastCheck > 10 then\n\t\t\tlastCheck = 0\n\t\t\thealList = {}\n\t\t\tfor i = 1, 5 do\n\t\t\t\tlocal specID = GetArenaOpponentSpec(i)\n\t\t\t\tif specID and specID > 0 then\n\t\t\t\t\tlocal name = UnitName(format(\"arena%d\", i))\n\t\t\t\t\tlocal _, talentSpec = GetSpecializationInfoByID(specID)\n\t\t\t\t\tif name and healerSpecs[talentSpec] then\n\t\t\t\t\t\thealList[name] = talentSpec\n\t\t\t\t\t\tlocal nameplate = C_NamePlate.GetNamePlateForUnit(format(\"arena%d\", i))\n\t\t\t\t\t\tif nameplate then\n\t\t\t\t\t\t\tnameplate.unitFrame:UpdateAllElements(\"UNIT_NAME_UPDATE\")\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal function CheckLoc(_, event)\n\t\tif event == \"PLAYER_ENTERING_WORLD\" then\n\t\t\tlocal _, instanceType = IsInInstance()\n\t\t\tif instanceType == \"pvp\" then\n\t\t\t\tt:SetScript(\"OnUpdate\", CheckHealers)\n\t\t\telseif instanceType == \"arena\" then\n\t\t\t\tt:SetScript(\"OnUpdate\", CheckArenaHealers)\n\t\t\telse\n\t\t\t\thealList = {}\n\t\t\t\tt:SetScript(\"OnUpdate\", nil)\n\t\t\tend\n\t\tend\n\tend\n\n\tt:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tt:SetScript(\"OnEvent\", CheckLoc)\nend\n\nlocal totemData = {\n\t[GetSpellInfo(192058)] = 136013,\t-- Capacitor Totem\n\t[GetSpellInfo(98008)]  = 237586,\t-- Spirit Link Totem\n\t[GetSpellInfo(192077)] = 538576,\t-- Wind Rush Totem\n\t[GetSpellInfo(204331)] = 511726,\t-- Counterstrike Totem\n\t[GetSpellInfo(204332)] = 136114,\t-- Windfury Totem\n\t[GetSpellInfo(204336)] = 136039,\t-- Grounding Totem\n\t[GetSpellInfo(157153)] = 971076,\t-- Cloudburst Totem\n\t[GetSpellInfo(5394)]   = 135127,\t-- Healing Stream Totem\n\t[GetSpellInfo(108280)] = 538569,\t-- Healing Tide Totem\n\t[GetSpellInfo(207399)] = 136080,\t-- Ancestral Protection Totem\n\t[GetSpellInfo(198838)] = 136098,\t-- Earthen Wall Totem\n\t[GetSpellInfo(51485)]  = 136100,\t-- Earthgrab Totem\n\t[GetSpellInfo(196932)] = 136232,\t-- Voodoo Totem\n\t[GetSpellInfo(192222)] = 971079,\t-- Liquid Magma Totem\n\t[GetSpellInfo(204330)] = 135829,\t-- Skyfury Totem\n}\n\nlocal function CreateBorderFrame(frame, point)\n\tif point == nil then point = frame end\n\tif point.backdrop then return end\n\n\tframe.backdrop = frame:CreateTexture(nil, \"BORDER\")\n\tframe.backdrop:SetDrawLayer(\"BORDER\", -8)\n\tframe.backdrop:SetPoint(\"TOPLEFT\", point, \"TOPLEFT\", -T.noscalemult * 3, T.noscalemult * 3)\n\tframe.backdrop:SetPoint(\"BOTTOMRIGHT\", point, \"BOTTOMRIGHT\", T.noscalemult * 3, -T.noscalemult * 3)\n\tframe.backdrop:SetColorTexture(unpack(C.media.backdrop_color))\n\n\tframe.bordertop = frame:CreateTexture(nil, \"BORDER\")\n\tframe.bordertop:SetPoint(\"TOPLEFT\", point, \"TOPLEFT\", -T.noscalemult * 2, T.noscalemult * 2)\n\tframe.bordertop:SetPoint(\"TOPRIGHT\", point, \"TOPRIGHT\", T.noscalemult * 2, T.noscalemult * 2)\n\tframe.bordertop:SetHeight(T.noscalemult)\n\tframe.bordertop:SetColorTexture(unpack(C.media.border_color))\n\tframe.bordertop:SetDrawLayer(\"BORDER\", -7)\n\n\tframe.borderbottom = frame:CreateTexture(nil, \"BORDER\")\n\tframe.borderbottom:SetPoint(\"BOTTOMLEFT\", point, \"BOTTOMLEFT\", -T.noscalemult * 2, -T.noscalemult * 2)\n\tframe.borderbottom:SetPoint(\"BOTTOMRIGHT\", point, \"BOTTOMRIGHT\", T.noscalemult * 2, -T.noscalemult * 2)\n\tframe.borderbottom:SetHeight(T.noscalemult)\n\tframe.borderbottom:SetColorTexture(unpack(C.media.border_color))\n\tframe.borderbottom:SetDrawLayer(\"BORDER\", -7)\n\n\tframe.borderleft = frame:CreateTexture(nil, \"BORDER\")\n\tframe.borderleft:SetPoint(\"TOPLEFT\", point, \"TOPLEFT\", -T.noscalemult * 2, T.noscalemult * 2)\n\tframe.borderleft:SetPoint(\"BOTTOMLEFT\", point, \"BOTTOMLEFT\", T.noscalemult * 2, -T.noscalemult * 2)\n\tframe.borderleft:SetWidth(T.noscalemult)\n\tframe.borderleft:SetColorTexture(unpack(C.media.border_color))\n\tframe.borderleft:SetDrawLayer(\"BORDER\", -7)\n\n\tframe.borderright = frame:CreateTexture(nil, \"BORDER\")\n\tframe.borderright:SetPoint(\"TOPRIGHT\", point, \"TOPRIGHT\", T.noscalemult * 2, T.noscalemult * 2)\n\tframe.borderright:SetPoint(\"BOTTOMRIGHT\", point, \"BOTTOMRIGHT\", -T.noscalemult * 2, -T.noscalemult * 2)\n\tframe.borderright:SetWidth(T.noscalemult)\n\tframe.borderright:SetColorTexture(unpack(C.media.border_color))\n\tframe.borderright:SetDrawLayer(\"BORDER\", -7)\nend\n\nlocal function SetColorBorder(frame, r, g, b)\n\tframe.bordertop:SetColorTexture(r, g, b)\n\tframe.borderbottom:SetColorTexture(r, g, b)\n\tframe.borderleft:SetColorTexture(r, g, b)\n\tframe.borderright:SetColorTexture(r, g, b)\nend\n\n-- Auras functions\nlocal AurasCustomFilter = function(element, unit, data)\n\tlocal allow = false\n\n\tif not UnitIsFriend(\"player\", unit) then\n\t\tif data.isHarmful then\n\t\t\tif C.nameplate.track_debuffs and data.isPlayerAura or data.sourceUnit == \"pet\" then\n\t\t\t\tif ((data.nameplateShowAll or data.nameplateShowPersonal) and not T.DebuffBlackList[data.name]) then\n\t\t\t\t\tallow = true\n\t\t\t\telseif T.DebuffWhiteList[data.name] then\n\t\t\t\t\tallow = true\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif T.BuffWhiteList[data.name] then\n\t\t\t\tallow = true\n\t\t\telseif data.isStealable then\n\t\t\t\tallow = true\n\t\t\tend\n\t\tend\n\tend\n\n\treturn allow\nend\n\nlocal Mult = 1\nif T.screenHeight > 1200 then\n\tMult = T.mult\nend\n\nlocal AurasPostCreateIcon = function(element, button)\n\tCreateBorderFrame(button)\n\n\tbutton.remaining = T.SetFontString(button, C.font.auras_font, C.font.auras_font_size * T.noscalemult / Mult, C.font.auras_font_style)\n\tbutton.remaining:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)\n\tbutton.remaining:SetPoint(\"CENTER\", button, \"CENTER\", 1, 0)\n\tbutton.remaining:SetJustifyH(\"CENTER\")\n\n\tbutton.Cooldown.noCooldownCount = true\n\n\tbutton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\tbutton.Count:SetPoint(\"BOTTOMRIGHT\", button, \"BOTTOMRIGHT\", 1, 0)\n\tbutton.Count:SetJustifyH(\"RIGHT\")\n\tbutton.Count:SetFont(C.font.auras_font, C.font.auras_font_size * T.noscalemult / Mult, C.font.auras_font_style)\n\tbutton.Count:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)\n\n\tif C.aura.show_spiral == true then\n\t\telement.disableCooldown = false\n\t\tbutton.Cooldown:SetReverse(true)\n\t\tbutton.parent = CreateFrame(\"Frame\", nil, button)\n\t\tbutton.parent:SetFrameLevel(button.Cooldown:GetFrameLevel() + 1)\n\t\tbutton.Count:SetParent(button.parent)\n\t\tbutton.remaining:SetParent(button.parent)\n\telse\n\t\telement.disableCooldown = true\n\tend\nend\n\nlocal AurasPostUpdateIcon = function(_, button, unit, data)\n\tif not UnitIsFriend(\"player\", unit) then\n\t\tif data.isHarmful then\n\t\t\tif C.nameplate.track_debuffs and data.isPlayerAura or data.sourceUnit == \"pet\" then\n\t\t\t\tif C.nameplate.track_buffs then\n\t\t\t\t\tSetColorBorder(button, unpack(C.media.border_color))\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif T.BuffWhiteList[data.name] then\n\t\t\t\tSetColorBorder(button, 0, 0.5, 0)\n\t\t\telseif data.isStealable then\n\t\t\t\tSetColorBorder(button, 1, 0.85, 0)\n\t\t\tend\n\t\tend\n\tend\n\n\tif data.duration and data.duration > 0 and C.aura.show_timer == true then\n\t\tbutton.remaining:Show()\n\t\tbutton.timeLeft = data.expirationTime\n\t\tbutton:SetScript(\"OnUpdate\", T.CreateAuraTimer)\n\telse\n\t\tbutton.remaining:Hide()\n\t\tbutton.timeLeft = math.huge\n\t\tbutton:SetScript(\"OnUpdate\", nil)\n\tend\n\tbutton.first = true\nend\n\nlocal function UpdateTarget(self)\n\tlocal isTarget = UnitIsUnit(self.unit, \"target\")\n\tlocal isMe = UnitIsUnit(self.unit, \"player\")\n\n\tif isTarget and not isMe then\n\t\tif C.nameplate.ad_height > 0 or C.nameplate.ad_width > 0 then\n\t\t\tself:SetSize((C.nameplate.width + C.nameplate.ad_width) * T.noscalemult, (C.nameplate.height + C.nameplate.ad_height) * T.noscalemult)\n\t\t\tself.Castbar:SetPoint(\"BOTTOMLEFT\", self.Health, \"BOTTOMLEFT\", 0, -8-((C.nameplate.height + C.nameplate.ad_height) * T.noscalemult))\n\t\t\tself.Castbar.Icon:SetSize(((C.nameplate.height + C.nameplate.ad_height) * 2 * T.noscalemult) + 8, ((C.nameplate.height + C.nameplate.ad_height) * 2 * T.noscalemult) + 8)\n\t\t\tif C.nameplate.class_icons == true then\n\t\t\t\tself.Class.Icon:SetSize(((C.nameplate.height + C.nameplate.ad_height) * 2 * T.noscalemult) + 8, ((C.nameplate.height + C.nameplate.ad_height) * 2 * T.noscalemult) + 8)\n\t\t\tend\n\t\tend\n\t\tif C.nameplate.target_glow then\n\t\t\tself.Glow:Show()\n\t\tend\n\t\tself:SetAlpha(1)\n\telse\n\t\tif C.nameplate.ad_height > 0 or C.nameplate.ad_width > 0 then\n\t\t\tself:SetSize(C.nameplate.width * T.noscalemult, C.nameplate.height * T.noscalemult)\n\t\t\tself.Castbar:SetPoint(\"BOTTOMLEFT\", self.Health, \"BOTTOMLEFT\", 0, -8-(C.nameplate.height * T.noscalemult))\n\t\t\tself.Castbar.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)\n\t\t\tif C.nameplate.class_icons == true then\n\t\t\t\tself.Class.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)\n\t\t\tend\n\t\tend\n\t\tif C.nameplate.target_glow then\n\t\t\tself.Glow:Hide()\n\t\tend\n\t\tif not UnitExists(\"target\") or isMe then\n\t\t\tself:SetAlpha(1)\n\t\telse\n\t\t\tself:SetAlpha(C.nameplate.alpha)\n\t\tend\n\tend\nend\n\nlocal function UpdateName(self)\n\tif C.nameplate.healer_icon == true then\n\t\tlocal name = self.unitName\n\t\tif name then\n\t\t\tif healList[name] then\n\t\t\t\tif exClass[healList[name]] then\n\t\t\t\t\tself.HealerIcon:Hide()\n\t\t\t\telse\n\t\t\t\t\tself.HealerIcon:Show()\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tself.HealerIcon:Hide()\n\t\t\tend\n\t\tend\n\tend\n\n\tif C.nameplate.class_icons == true then\n\t\tlocal reaction = UnitReaction(self.unit, \"player\")\n\t\tif UnitIsPlayer(self.unit) and (reaction and reaction <= 4) then\n\t\t\tlocal _, class = UnitClass(self.unit)\n\t\t\tlocal texcoord = CLASS_ICON_TCOORDS[class]\n\t\t\tself.Class.Icon:SetTexCoord(texcoord[1] + 0.015, texcoord[2] - 0.02, texcoord[3] + 0.018, texcoord[4] - 0.02)\n\t\t\tself.Class:Show()\n\t\t\tself.Level:SetPoint(\"RIGHT\", self.Name, \"LEFT\", -2, 0)\n\t\telse\n\t\t\tself.Class.Icon:SetTexCoord(0, 0, 0, 0)\n\t\t\tself.Class:Hide()\n\t\t\tself.Level:SetPoint(\"RIGHT\", self.Health, \"LEFT\", -2, 0)\n\t\tend\n\tend\n\n\tif C.nameplate.totem_icons == true then\n\t\tlocal name = self.unitName\n\t\tif name then\n\t\t\tif totemData[name] then\n\t\t\t\tself.Totem.Icon:SetTexture(totemData[name])\n\t\t\t\tself.Totem:Show()\n\t\t\telse\n\t\t\t\tself.Totem:Hide()\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal kickID = 0\nif C.nameplate.kick_color then\n\tif T.class == \"DEATHKNIGHT\" then\n\t\tkickID = 47528\n\telseif T.class == \"DEMONHUNTER\" then\n\t\tkickID = 183752\n\telseif T.class == \"DRUID\" then\n\t\tkickID = 106839\n\telseif T.class == \"EVOKER\" then\n\t\tkickID = 351338\n\telseif T.class == \"HUNTER\" then\n\t\tkickID = GetSpecialization() == 3 and 187707 or 147362\n\telseif T.class == \"MAGE\" then\n\t\tkickID = 2139\n\telseif T.class == \"MONK\" then\n\t\tkickID = 116705\n\telseif T.class == \"PALADIN\" then\n\t\tkickID = 96231\n\telseif T.class == \"PRIEST\" then\n\t\tkickID = 15487\n\telseif T.class == \"ROGUE\" then\n\t\tkickID = 1766\n\telseif T.class == \"SHAMAN\" then\n\t\tkickID = 57994\n\telseif T.class == \"WARLOCK\" then\n\t\tkickID = 119910\n\telseif T.class == \"WARRIOR\" then\n\t\tkickID = 6552\n\tend\nend\n\n-- Cast color\nlocal function castColor(self)\n\tif self.notInterruptible then\n\t\tself:SetStatusBarColor(0.78, 0.25, 0.25)\n\t\tself.bg:SetColorTexture(0.78, 0.25, 0.25, 0.2)\n\telse\n\t\tif C.nameplate.kick_color then\n\t\t\tlocal start = GetSpellCooldown(kickID)\n\t\t\tif start ~= 0 then\n\t\t\t\tself:SetStatusBarColor(1, 0.5, 0)\n\t\t\t\tself.bg:SetColorTexture(1, 0.5, 0, 0.2)\n\t\t\telse\n\t\t\t\tself:SetStatusBarColor(1, 0.8, 0)\n\t\t\t\tself.bg:SetColorTexture(1, 0.8, 0, 0.2)\n\t\t\tend\n\t\telse\n\t\t\tself:SetStatusBarColor(1, 0.8, 0)\n\t\t\tself.bg:SetColorTexture(1, 0.8, 0, 0.2)\n\t\tend\n\tend\n\n\tif C.nameplate.cast_color then\n\t\tif T.InterruptCast[self.spellID] then\n\t\t\tSetColorBorder(self, 1, 0.8, 0)\n\t\telseif T.ImportantCast[self.spellID] then\n\t\t\tSetColorBorder(self, 1, 0, 0)\n\t\telse\n\t\t\tSetColorBorder(self, unpack(C.media.border_color))\n\t\tend\n\tend\nend\n\n-- Health color\nlocal function threatColor(self, forced)\n\tif UnitIsPlayer(self.unit) then return end\n\n\tif C.nameplate.enhance_threat ~= true then\n\t\tSetColorBorder(self.Health, unpack(C.media.border_color))\n\tend\n\tif UnitIsTapDenied(self.unit) then\n\t\tself.Health:SetStatusBarColor(0.6, 0.6, 0.6)\n\telseif UnitAffectingCombat(\"player\") then\n\t\tlocal threatStatus = UnitThreatSituation(\"player\", self.unit)\n\t\tif self.npcID == \"120651\" then\t-- Explosives affix\n\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.extra_color))\n\t\telseif self.npcID == \"174773\" then\t-- Spiteful Shade affix\n\t\t\tif threatStatus == 3 then\n\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.extra_color))\n\t\t\telse\n\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.good_color))\n\t\t\tend\n\t\telseif threatStatus == 3 then\t-- securely tanking, highest threat\n\t\t\tif T.Role == \"Tank\" then\n\t\t\t\tif C.nameplate.enhance_threat == true then\n\t\t\t\t\tif C.nameplate.mob_color_enable and T.ColorPlate[self.npcID] then\n\t\t\t\t\t\tself.Health:SetStatusBarColor(unpack(T.ColorPlate[self.npcID]))\n\t\t\t\t\telse\n\t\t\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.good_color))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tSetColorBorder(self.Health, unpack(C.nameplate.bad_color))\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif C.nameplate.enhance_threat == true then\n\t\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.bad_color))\n\t\t\t\telse\n\t\t\t\t\tSetColorBorder(self.Health, unpack(C.nameplate.bad_color))\n\t\t\t\tend\n\t\t\tend\n\t\telseif threatStatus == 2 then\t-- insecurely tanking, another unit have higher threat but not tanking\n\t\t\tif C.nameplate.enhance_threat == true then\n\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.near_color))\n\t\t\telse\n\t\t\t\tSetColorBorder(self.Health, unpack(C.nameplate.near_color))\n\t\t\tend\n\t\telseif threatStatus == 1 then\t-- not tanking, higher threat than tank\n\t\t\tif C.nameplate.enhance_threat == true then\n\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.near_color))\n\t\t\telse\n\t\t\t\tSetColorBorder(self.Health, unpack(C.nameplate.near_color))\n\t\t\tend\n\t\telseif threatStatus == 0 then\t-- not tanking, lower threat than tank\n\t\t\tif C.nameplate.enhance_threat == true then\n\t\t\t\tif T.Role == \"Tank\" then\n\t\t\t\t\tlocal offTank = false\n\t\t\t\t\tif IsInRaid() then\n\t\t\t\t\t\tfor i = 1, GetNumGroupMembers() do\n\t\t\t\t\t\t\tif UnitExists(\"raid\"..i) and not UnitIsUnit(\"raid\"..i, \"player\") and UnitGroupRolesAssigned(\"raid\"..i) == \"TANK\" then\n\t\t\t\t\t\t\t\tlocal isTanking = UnitDetailedThreatSituation(\"raid\"..i, self.unit)\n\t\t\t\t\t\t\t\tif isTanking then\n\t\t\t\t\t\t\t\t\toffTank = true\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif offTank then\n\t\t\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.offtank_color))\n\t\t\t\t\telse\n\t\t\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.bad_color))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif C.nameplate.mob_color_enable and T.ColorPlate[self.npcID] then\n\t\t\t\t\t\tself.Health:SetStatusBarColor(unpack(T.ColorPlate[self.npcID]))\n\t\t\t\t\telse\n\t\t\t\t\t\tself.Health:SetStatusBarColor(unpack(C.nameplate.good_color))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif not forced then\n\t\tself.Health:ForceUpdate()\n\tend\nend\n\nlocal function HealthPostUpdate(self, unit, cur, max)\n\tlocal main = self:GetParent()\n\tlocal perc = 0\n\tif max and max > 0 then\n\t\tperc = cur / max\n\tend\n\n\tlocal r, g, b\n\tlocal mu = self.bg.multiplier\n\tlocal isPlayer = UnitIsPlayer(unit)\n\tlocal unitReaction = UnitReaction(unit, \"player\")\n\tif not UnitIsUnit(\"player\", unit) and isPlayer and (unitReaction and unitReaction >= 5) then\n\t\tr, g, b = unpack(T.oUF_colors.power[\"MANA\"])\n\t\tself:SetStatusBarColor(r, g, b)\n\t\tself.bg:SetVertexColor(r * mu, g * mu, b * mu)\n\telseif not UnitIsTapDenied(unit) and not isPlayer then\n\t\tif C.nameplate.mob_color_enable and T.ColorPlate[main.npcID] then\n\t\t\tr, g, b = unpack(T.ColorPlate[main.npcID])\n\t\telse\n\t\t\tlocal reaction = T.oUF_colors.reaction[unitReaction]\n\t\t\tif reaction then\n\t\t\t\tr, g, b = reaction[1], reaction[2], reaction[3]\n\t\t\telse\n\t\t\t\tr, g, b = UnitSelectionColor(unit, true)\n\t\t\tend\n\t\tend\n\n\t\tself:SetStatusBarColor(r, g, b)\n\t\tself.bg:SetVertexColor(r * mu, g * mu, b * mu)\n\tend\n\n\tif isPlayer then\n\t\tif perc <= 0.5 and perc >= 0.2 then\n\t\t\tSetColorBorder(self, 1, 1, 0)\n\t\telseif perc < 0.2 then\n\t\t\tSetColorBorder(self, 1, 0, 0)\n\t\telse\n\t\t\tSetColorBorder(self, unpack(C.media.border_color))\n\t\tend\n\telseif not isPlayer and C.nameplate.enhance_threat == true then\n\t\tif C.nameplate.low_health then\n\t\t\tif perc < C.nameplate.low_health_value then\n\t\t\t\tSetColorBorder(self, unpack(C.nameplate.low_health_color))\n\t\t\telse\n\t\t\t\tSetColorBorder(self, unpack(C.media.border_color))\n\t\t\tend\n\t\telse\n\t\t\tSetColorBorder(self, unpack(C.media.border_color))\n\t\tend\n\tend\n\n\tthreatColor(main, true)\nend\n\nlocal function callback(self, event, unit)\n\tif not self then return end\n\tif unit then\n\t\tlocal unitGUID = UnitGUID(unit)\n\t\tself.npcID = unitGUID and select(6, strsplit('-', unitGUID))\n\t\tself.unitName = UnitName(unit)\n\t\tself.widgetsOnly = UnitNameplateShowsWidgetsOnly(unit)\n\t\tif self.npcID and T.PlateBlacklist[self.npcID] then\n\t\t\tself:Hide()\n\t\telse\n\t\t\tself:Show()\n\t\tend\n\n\t\tif UnitIsUnit(unit, \"player\") then\n\t\t\tself.Power:Show()\n\t\t\tself.Name:Hide()\n\t\t\tself.Castbar:SetAlpha(0)\n\t\t\tself.RaidTargetIndicator:SetAlpha(0)\n\t\telse\n\t\t\tself.Power:Hide()\n\t\t\tself.Name:Show()\n\t\t\tself.Castbar:SetAlpha(1)\n\t\t\tself.RaidTargetIndicator:SetAlpha(1)\n\n\t\t\tif self.widgetsOnly or (UnitWidgetSet(unit) and UnitIsOwnerOrControllerOfUnit(\"player\", unit)) then\n\t\t\t\tself.Health:SetAlpha(0)\n\t\t\t\tself.Level:SetAlpha(0)\n\t\t\t\tself.Name:SetAlpha(0)\n\t\t\t\tself.Castbar:SetAlpha(0)\n\t\t\telse\n\t\t\t\tself.Health:SetAlpha(1)\n\t\t\t\tself.Level:SetAlpha(1)\n\t\t\t\tself.Name:SetAlpha(1)\n\t\t\t\tself.Castbar:SetAlpha(1)\n\t\t\tend\n\n\t\t\tlocal nameplate = C_NamePlate.GetNamePlateForUnit(unit)\n\t\t\tif nameplate.UnitFrame then\n\t\t\t\tif nameplate.UnitFrame.WidgetContainer then\n\t\t\t\t\tnameplate.UnitFrame.WidgetContainer:SetParent(nameplate)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif C.nameplate.only_name then\n\t\t\t\tif UnitIsFriend(\"player\", unit) then\n\t\t\t\t\tself.Health:SetAlpha(0)\n\t\t\t\t\tself.Name:ClearAllPoints()\n\t\t\t\t\tself.Name:SetPoint(\"CENTER\", self, \"CENTER\", 0, 0)\n\t\t\t\t\tself.Level:SetAlpha(0)\n\t\t\t\t\tself.Castbar:SetAlpha(0)\n\t\t\t\t\tif C.nameplate.target_glow then\n\t\t\t\t\t\tself.Glow:SetAlpha(0)\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tself.Health:SetAlpha(1)\n\t\t\t\t\tself.Name:ClearAllPoints()\n\t\t\t\t\tself.Name:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", -3, 4)\n\t\t\t\t\tself.Name:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 3, 4)\n\t\t\t\t\tself.Level:SetAlpha(1)\n\t\t\t\t\tself.Castbar:SetAlpha(1)\n\t\t\t\t\tif C.nameplate.target_glow then\n\t\t\t\t\t\tself.Glow:SetAlpha(1)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function style(self, unit)\n\tlocal nameplate = C_NamePlate.GetNamePlateForUnit(unit)\n\tlocal main = self\n\tself.unit = unit\n\n\tself:SetPoint(\"CENTER\", nameplate, \"CENTER\")\n\tself:SetSize(C.nameplate.width * T.noscalemult, C.nameplate.height * T.noscalemult)\n\n\t-- Health Bar\n\tself.Health = CreateFrame(\"StatusBar\", nil, self)\n\tself.Health:SetAllPoints(self)\n\tself.Health:SetStatusBarTexture(C.media.texture)\n\tself.Health.colorTapping = true\n\tself.Health.colorDisconnected = true\n\tself.Health.colorClass = true\n\tself.Health.colorReaction = true\n\tself.Health.colorHealth = true\n\tCreateBorderFrame(self.Health)\n\n\tself.Health.bg = self.Health:CreateTexture(nil, \"BORDER\")\n\tself.Health.bg:SetAllPoints()\n\tself.Health.bg:SetTexture(C.media.texture)\n\tself.Health.bg.multiplier = 0.2\n\n\t-- Health Text\n\tif C.nameplate.health_value == true then\n\t\tself.Health.value = self.Health:CreateFontString(nil, \"OVERLAY\")\n\t\tself.Health.value:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)\n\t\tself.Health.value:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)\n\t\tself.Health.value:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\tself:Tag(self.Health.value, \"[NameplateHealth]\")\n\tend\n\n\t-- Player Power Bar\n\tself.Power = CreateFrame(\"StatusBar\", nil, self)\n\tself.Power:SetStatusBarTexture(C.media.texture)\n\tself.Power:SetPoint(\"TOPLEFT\", self.Health, \"BOTTOMLEFT\", 0, -6)\n\tself.Power:SetPoint(\"BOTTOMRIGHT\", self.Health, \"BOTTOMRIGHT\", 0, -6-(C.nameplate.height * T.noscalemult / 2))\n\tself.Power.frequentUpdates = true\n\tself.Power.colorPower = true\n\tself.Power.PostUpdate = T.PreUpdatePower\n\tCreateBorderFrame(self.Power)\n\n\tself.Power.bg = self.Power:CreateTexture(nil, \"BORDER\")\n\tself.Power.bg:SetAllPoints()\n\tself.Power.bg:SetTexture(C.media.texture)\n\tself.Power.bg.multiplier = 0.2\n\n\t-- Hide Blizzard Power Bar\n\thooksecurefunc(_G.NamePlateDriverFrame, \"SetupClassNameplateBars\", function(frame)\n\t\tif not frame or frame:IsForbidden() then\n\t\t\treturn\n\t\tend\n\t\tif frame.classNamePlatePowerBar then\n\t\t\tframe.classNamePlatePowerBar:Hide()\n\t\t\tframe.classNamePlatePowerBar:UnregisterAllEvents()\n\t\tend\n\tend)\n\n\t-- Name Text\n\tself.Name = self:CreateFontString(nil, \"OVERLAY\")\n\tself.Name:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)\n\tself.Name:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)\n\tself.Name:SetPoint(\"BOTTOMLEFT\", self, \"TOPLEFT\", -3, 4)\n\tself.Name:SetPoint(\"BOTTOMRIGHT\", self, \"TOPRIGHT\", 3, 4)\n\tself.Name:SetWordWrap(false)\n\n\tif C.nameplate.name_abbrev then\n\t\tself:Tag(self.Name, \"[NameplateNameColor][NameLongAbbrev]\")\n\telseif C.nameplate.short_name then\n\t\tself:Tag(self.Name, \"[NameplateNameColor][NameplateNameShort]\")\n\telse\n\t\tself:Tag(self.Name, \"[NameplateNameColor][NameLong]\")\n\tend\n\n\t-- Target Glow\n\tif C.nameplate.target_glow then\n\t\tself.Glow = CreateFrame(\"Frame\", nil, self, \"BackdropTemplate\")\n\t\tself.Glow:SetBackdrop({edgeFile = [[Interface\\AddOns\\ShestakUI\\Media\\Textures\\Glow.tga]], edgeSize = 4 * T.noscalemult})\n\t\tself.Glow:SetPoint(\"TOPLEFT\", -7 * T.noscalemult, 7 * T.noscalemult)\n\t\tself.Glow:SetPoint(\"BOTTOMRIGHT\", 7 * T.noscalemult, -7 * T.noscalemult)\n\t\tself.Glow:SetBackdropBorderColor(0.8, 0.8, 0.8)\n\t\tself.Glow:SetFrameLevel(0)\n\t\tself.Glow:Hide()\n\tend\n\n\t-- Level Text\n\tself.Level = self:CreateFontString(nil, \"ARTWORK\")\n\tself.Level:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)\n\tself.Level:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)\n\tself.Level:SetPoint(\"RIGHT\", self.Health, \"LEFT\", -2, 0)\n\tself:Tag(self.Level, \"[DiffColor][NameplateLevel][shortclassification]\")\n\n\t-- Cast Bar\n\tself.Castbar = CreateFrame(\"StatusBar\", nil, self)\n\tself.Castbar:SetFrameLevel(3)\n\tself.Castbar:SetStatusBarTexture(C.media.texture)\n\tself.Castbar:SetStatusBarColor(1, 0.8, 0)\n\tself.Castbar:SetPoint(\"TOPLEFT\", self.Health, \"BOTTOMLEFT\", 0, -8)\n\tself.Castbar:SetPoint(\"BOTTOMRIGHT\", self.Health, \"BOTTOMRIGHT\", 0, -8-(C.nameplate.height * T.noscalemult))\n\tCreateBorderFrame(self.Castbar)\n\n\tself.Castbar.bg = self.Castbar:CreateTexture(nil, \"BORDER\")\n\tself.Castbar.bg:SetAllPoints()\n\tself.Castbar.bg:SetTexture(C.media.texture)\n\tself.Castbar.bg:SetColorTexture(1, 0.8, 0, 0.2)\n\n\tself.Castbar.PostCastStart = castColor\n\tself.Castbar.PostCastInterruptible = castColor\n\n\t-- Cast Time Text\n\tself.Castbar.Time = self.Castbar:CreateFontString(nil, \"ARTWORK\")\n\tself.Castbar.Time:SetPoint(\"RIGHT\", self.Castbar, \"RIGHT\", 0, 0)\n\tself.Castbar.Time:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)\n\tself.Castbar.Time:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)\n\n\tself.Castbar.CustomTimeText = function(self, duration)\n\t\tself.Time:SetText((\"%.1f\"):format(self.channeling and duration or self.max - duration))\n\tend\n\n\t-- Cast Name Text\n\tif C.nameplate.show_castbar_name == true then\n\t\tself.Castbar.Text = self.Castbar:CreateFontString(nil, \"OVERLAY\")\n\t\tself.Castbar.Text:SetPoint(\"LEFT\", self.Castbar, \"LEFT\", 3, 0)\n\t\tself.Castbar.Text:SetPoint(\"RIGHT\", self.Castbar.Time, \"LEFT\", -1, 0)\n\t\tself.Castbar.Text:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)\n\t\tself.Castbar.Text:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)\n\t\tself.Castbar.Text:SetHeight(C.font.nameplates_font_size)\n\t\tself.Castbar.Text:SetJustifyH(\"LEFT\")\n\tend\n\n\t-- Cast Bar Icon\n\tself.CastbarIcon = CreateFrame(\"Frame\", nil, self.Castbar)\n\tself.Castbar.Icon = self.CastbarIcon:CreateTexture(nil, \"OVERLAY\")\n\tself.Castbar.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tself.Castbar.Icon:SetDrawLayer(\"ARTWORK\")\n\tself.Castbar.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)\n\tself.Castbar.Icon:SetPoint(\"TOPLEFT\", self.Health, \"TOPRIGHT\", 8, 0)\n\tCreateBorderFrame(self.CastbarIcon, self.Castbar.Icon)\n\n\t-- Raid Icon\n\tself.RaidTargetIndicator = self:CreateTexture(nil, \"OVERLAY\", nil, 7)\n\tself.RaidTargetIndicator:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)\n\tself.RaidTargetIndicator:SetPoint(\"BOTTOM\", self.Health, \"TOP\", 0, C.nameplate.track_debuffs == true and 38 or 16)\n\n\t-- Class Icon\n\tif C.nameplate.class_icons == true then\n\t\tself.Class = CreateFrame(\"Frame\", nil, self)\n\t\tself.Class.Icon = self.Class:CreateTexture(nil, \"OVERLAY\")\n\t\tself.Class.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)\n\t\tself.Class.Icon:SetPoint(\"TOPRIGHT\", self.Health, \"TOPLEFT\", -8, 0)\n\t\tself.Class.Icon:SetTexture(\"Interface\\\\WorldStateFrame\\\\Icons-Classes\")\n\t\tself.Class.Icon:SetTexCoord(0, 0, 0, 0)\n\t\tCreateBorderFrame(self.Class, self.Class.Icon)\n\tend\n\n\t-- Totem Icon\n\tif C.nameplate.totem_icons == true then\n\t\tself.Totem = CreateFrame(\"Frame\", nil, self)\n\t\tself.Totem.Icon = self.Totem:CreateTexture(nil, \"OVERLAY\")\n\t\tself.Totem.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)\n\t\tself.Totem.Icon:SetPoint(\"BOTTOM\", self.Health, \"TOP\", 0, 16)\n\t\tself.Totem.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tCreateBorderFrame(self.Totem, self.Totem.Icon)\n\tend\n\n\t-- Healer Icon\n\tif C.nameplate.healer_icon == true then\n\t\tself.HealerIcon = self.Health:CreateFontString(nil, \"OVERLAY\")\n\t\tself.HealerIcon:SetFont(C.font.nameplates_font, 32, C.font.nameplates_font_style)\n\t\tself.HealerIcon:SetText(\"|cFFD53333+|r\")\n\t\tself.HealerIcon:SetPoint(\"BOTTOM\", self.Name, \"TOP\", 0, C.nameplate.track_debuffs == true and 13 or 0)\n\tend\n\n\t-- Quest Icon\n\tif C.nameplate.quests then\n\t\tself.QuestIcon = self:CreateTexture(nil, \"OVERLAY\", nil, 7)\n\t\tself.QuestIcon:SetSize((C.nameplate.height * 2 * T.noscalemult), (C.nameplate.height * 2 * T.noscalemult))\n\t\tself.QuestIcon:SetPoint(\"RIGHT\", self.Health, \"LEFT\", -5, 0)\n\t\tself.QuestIcon:Hide()\n\n\t\tself.QuestIcon.Text = self:CreateFontString(nil, \"OVERLAY\")\n\t\tself.QuestIcon.Text:SetPoint(\"RIGHT\", self.QuestIcon, \"LEFT\", -1, 0)\n\t\tself.QuestIcon.Text:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult * 2, C.font.nameplates_font_style)\n\t\tself.QuestIcon.Text:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)\n\n\t\tself.QuestIcon.Item = self:CreateTexture(nil, \"OVERLAY\")\n\t\tself.QuestIcon.Item:SetSize((C.nameplate.height * 2 * T.noscalemult) - 2, (C.nameplate.height * 2 * T.noscalemult) - 2)\n\t\tself.QuestIcon.Item:SetPoint(\"RIGHT\", self.QuestIcon.Text, \"LEFT\", -2, 0)\n\t\tself.QuestIcon.Item:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\tend\n\n\t-- Aura tracking\n\tif C.nameplate.track_debuffs == true or C.nameplate.track_buffs == true then\n\t\tself.Auras = CreateFrame(\"Frame\", nil, self)\n\t\tself.Auras:SetPoint(\"BOTTOMRIGHT\", self.Health, \"TOPRIGHT\", 0, C.font.nameplates_font_size + 7)\n\t\tself.Auras.initialAnchor = \"BOTTOMRIGHT\"\n\t\tself.Auras[\"growth-y\"] = \"UP\"\n\t\tself.Auras[\"growth-x\"] = \"LEFT\"\n\t\tself.Auras.numDebuffs = C.nameplate.track_debuffs and 6 or 0\n\t\tself.Auras.numBuffs = C.nameplate.track_buffs and 4 or 0\n\t\tself.Auras:SetSize(20 + C.nameplate.width, C.nameplate.auras_size)\n\t\tself.Auras.spacing = 5 * T.noscalemult\n\t\tself.Auras.size = C.nameplate.auras_size * T.noscalemult - 3\n\t\tself.Auras.disableMouse = true\n\n\t\tself.Auras.FilterAura = AurasCustomFilter\n\t\tself.Auras.PostCreateButton = AurasPostCreateIcon\n\t\tself.Auras.PostUpdateButton = AurasPostUpdateIcon\n\tend\n\n\t-- Health color\n\tself.Health:RegisterEvent(\"PLAYER_REGEN_DISABLED\")\n\tself.Health:RegisterEvent(\"PLAYER_REGEN_ENABLED\")\n\tself.Health:RegisterEvent(\"UNIT_THREAT_SITUATION_UPDATE\")\n\tself.Health:RegisterEvent(\"UNIT_THREAT_LIST_UPDATE\")\n\n\tself.Health:SetScript(\"OnEvent\", function()\n\t\tthreatColor(main)\n\tend)\n\n\tself.Health.PostUpdate = HealthPostUpdate\n\n\t-- Absorb\n\tif C.raidframe.plugins_healcomm == true then\n\t\tlocal ahpb = self.Health:CreateTexture(nil, \"ARTWORK\")\n\t\tahpb:SetTexture(C.media.texture)\n\t\tahpb:SetVertexColor(1, 1, 0, 1)\n\t\tself.HealthPrediction = {\n\t\t\tabsorbBar = ahpb\n\t\t}\n\tend\n\n\t-- Every event should be register with this\n\ttable.insert(self.__elements, UpdateName)\n\tself:RegisterEvent(\"UNIT_NAME_UPDATE\", UpdateName)\n\n\ttable.insert(self.__elements, UpdateTarget)\n\tself:RegisterEvent(\"PLAYER_TARGET_CHANGED\", UpdateTarget, true)\n\n\t-- Disable movement via /moveui\n\tself.disableMovement = true\n\n\tif T.PostCreateNameplates then\n\t\tT.PostCreateNameplates(self, unit)\n\tend\nend\n\noUF:RegisterStyle(\"ShestakNameplates\", style)\noUF:SetActiveStyle(\"ShestakNameplates\")\noUF:SpawnNamePlates(\"ShestakNameplates\", callback)"
  },
  {
    "path": "ShestakUI/Modules/UnitFrames/RaidDPS.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tUnitFrames based on oUF_Caellian(by Caellian)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\n-- Party size\nlocal party_width = C.raidframe.dps_party_width\nlocal party_height = C.raidframe.dps_party_height + T.extraHeight\nlocal party_power_height = C.raidframe.dps_party_power_height + C.unitframe.extra_power_height\nlocal partytarget_width = party_height + 3\nlocal partytarget_height = party_height\n-- Raid size\nlocal raid_width = C.raidframe.dps_raid_width\nlocal raid_height = C.raidframe.dps_raid_height\nlocal raid_power_height = C.raidframe.dps_raid_power_height\nlocal tank_width = C.raidframe.heal_raid_width\nlocal tank_height = C.raidframe.heal_raid_height\n\n-- Create layout\nlocal function Shared(self, unit)\n\tlocal unit = (self:GetParent():GetName():match(\"oUF_PartyDPS\")) and \"party\"\n\tor (self:GetParent():GetName():match(\"oUF_RaidDPS\")) and \"raid\"\n\tor (self:GetParent():GetName():match(\"oUF_MainTank\")) and \"tank\" or unit\n\n\tlocal suffix = self:GetAttribute(\"unitsuffix\")\n\n\t-- Set our own colors\n\tself.colors = T.oUF_colors\n\n\t-- Register click\n\tself:RegisterForClicks(\"AnyUp\")\n\tself:SetScript(\"OnEnter\", UnitFrame_OnEnter)\n\tself:SetScript(\"OnLeave\", UnitFrame_OnLeave)\n\n\t-- Backdrop for every units\n\tself:CreateBackdrop(\"Default\")\n\n\t-- Health bar\n\tself.Health = CreateFrame(\"StatusBar\", nil, self)\n\tself.Health:SetPoint(\"TOPLEFT\", self, \"TOPLEFT\", 0, 0)\n\tself.Health:SetPoint(\"TOPRIGHT\", self, \"TOPRIGHT\", 0, 0)\n\tif (suffix == \"pet\" or suffix == \"target\") and unit ~= \"tank\" then\n\t\tself.Health:SetHeight(party_height)\n\telseif unit == \"tank\" then\n\t\tself.Health:SetHeight(tank_height - 3)\n\telseif unit == \"raid\" then\n\t\tself.Health:SetHeight(raid_height - raid_power_height - (raid_power_height > 0 and 1 or 0))\n\telseif unit == \"party\" then\n\t\tself.Health:SetHeight(party_height - party_power_height - (party_power_height > 0 and 1 or 0))\n\telse\n\t\tself.Health:SetHeight(17)\n\tend\n\tself.Health:SetStatusBarTexture(C.media.texture)\n\n\tself.Health.PostUpdate = function(health, unit)\n\t\tif not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then\n\t\t\thealth:SetValue(0)\n\t\tend\n\tend\n\n\tself.Health.colorTapping = true\n\tself.Health.colorDisconnected = true\n\tself.Health.colorClassPet = false\n\tif C.unitframe.own_color == true then\n\t\tself.Health.colorReaction = false\n\t\tself.Health.colorClass = false\n\t\tself.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\telse\n\t\tself.Health.colorReaction = true\n\t\tself.Health.colorClass = true\n\tend\n\n\t-- Health bar background\n\tself.Health.bg = self.Health:CreateTexture(nil, \"BORDER\")\n\tself.Health.bg:SetAllPoints(self.Health)\n\tself.Health.bg:SetTexture(C.media.texture)\n\tif C.unitframe.own_color == true then\n\t\tself.Health.bg:SetVertexColor(unpack(C.unitframe.uf_color_bg))\n\telse\n\t\tself.Health.bg.multiplier = 0.2\n\tend\n\n\tif not (suffix == \"pet\" or (suffix == \"target\" and unit ~= \"tank\")) then\n\t\tself.Health.value = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tif unit == \"tank\" then\n\t\t\tself.Health.value:SetPoint(\"CENTER\", self.Health, \"CENTER\", 0, -5)\n\t\telse\n\t\t\tself.Health.value:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 1, 0)\n\t\tend\n\t\tself.Health.value:SetTextColor(1, 1, 1)\n\n\t\tif unit == \"raid\" and C.raidframe.hide_health_value then\n\t\t\tself.Health.value:SetAlpha(0)\n\t\tend\n\n\t\tself.Health.PostUpdate = T.PostUpdateRaidHealth\n\n\t\t-- Power bar\n\t\tself.Power = CreateFrame(\"StatusBar\", nil, self)\n\t\tif unit == \"raid\" then\n\t\t\tself.Power:SetHeight(raid_power_height)\n\t\telseif unit == \"party\" then\n\t\t\tself.Power:SetHeight(party_power_height)\n\t\telse\n\t\t\tself.Power:SetHeight(2)\n\t\tend\n\t\tself.Power:SetPoint(\"TOPLEFT\", self.Health, \"BOTTOMLEFT\", 0, -1)\n\t\tself.Power:SetPoint(\"TOPRIGHT\", self.Health, \"BOTTOMRIGHT\", 0, -1)\n\t\tself.Power:SetStatusBarTexture(C.media.texture)\n\n\t\tself.Power.frequentUpdates = true\n\t\tself.Power.colorDisconnected = true\n\t\tif C.unitframe.own_color == true then\n\t\t\tself.Power.colorClass = true\n\t\telse\n\t\t\tself.Power.colorPower = true\n\t\tend\n\n\t\tself.Power.PreUpdate = T.PreUpdatePower\n\t\tself.Power.PostUpdate = T.PostUpdatePower\n\n\t\t-- Power bar background\n\t\tself.Power.bg = self.Power:CreateTexture(nil, \"BORDER\")\n\t\tself.Power.bg:SetAllPoints(self.Power)\n\t\tself.Power.bg:SetTexture(C.media.texture)\n\t\tself.Power.bg:SetAlpha(1)\n\t\tself.Power.bg.multiplier = 0.2\n\n\t\tself.Power.value = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tif not (suffix == \"pet\" or suffix == \"target\") and unit ~= \"tank\" then\n\t\t\tself.Power.value:SetPoint(\"RIGHT\", self.Power, \"RIGHT\", 0, 0)\n\t\t\tself.Power.value:SetJustifyH(\"RIGHT\")\n\t\tend\n\tend\n\n\t-- Names\n\tself.Info = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\tif (suffix == \"pet\" or suffix == \"target\") and unit ~= \"tank\" then\n\t\tself.Info:SetPoint(\"CENTER\", self.Health, \"CENTER\", 2, 0)\n\telseif unit == \"tank\" then\n\t\tself.Info:SetPoint(\"CENTER\", self.Health, \"CENTER\", 0, 4)\n\telse\n\t\tself.Info:SetPoint(\"LEFT\", self.Health, \"LEFT\", 3, 0)\n\t\tself.Info:SetPoint(\"RIGHT\", self.Health.value, \"LEFT\", 0, 0)\n\t\tself.Info:SetJustifyH(\"LEFT\")\n\tend\n\tif suffix == \"pet\" or (suffix == \"target\" and unit ~= \"tank\") then\n\t\tself:Tag(self.Info, \"[GetNameColor][NameArena]\")\n\telse\n\t\tif unit == \"party\" and C.raidframe.icons_role ~= true then\n\t\t\tself:Tag(self.Info, \"[LFD] [GetNameColor][NameShort]\")\n\t\telse\n\t\t\tself:Tag(self.Info, \"[GetNameColor][NameShort]\")\n\t\tend\n\tend\n\n\t-- LFD role icons\n\tif C.raidframe.icons_role == true and not (suffix == \"pet\" or suffix == \"target\") then\n\t\tself.GroupRoleIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.GroupRoleIndicator:SetSize(12, 12)\n\t\tself.GroupRoleIndicator:SetPoint(\"TOPRIGHT\", self.Health, 2, 5)\n\tend\n\n\t-- Leader/Assistant icons\n\tif C.raidframe.icons_leader == true and not (suffix == \"target\") then\n\t\t-- Leader icon\n\t\tself.LeaderIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.LeaderIndicator:SetSize(12, 12)\n\t\tself.LeaderIndicator:SetPoint(\"TOPLEFT\", self.Health, -3, 8)\n\n\t\t-- Assistant icon\n\t\tself.AssistantIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.AssistantIndicator:SetSize(12, 12)\n\t\tself.AssistantIndicator:SetPoint(\"TOPLEFT\", self.Health, -3, 8)\n\tend\n\n\t-- Aggro border\n\tif C.raidframe.aggro_border == true then\n\t\tself.ThreatIndicator = CreateFrame(\"Frame\", nil, self)\n\t\tself.ThreatIndicator.PostUpdate = T.UpdateThreat\n\tend\n\n\t-- Raid marks\n\tif C.raidframe.icons_raid_mark == true then\n\t\tself.RaidTargetIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.RaidTargetIndicator:SetSize(12, 12)\n\t\tself.RaidTargetIndicator:SetPoint(\"CENTER\", self.Health, \"TOP\")\n\tend\n\n\t-- Ready check icons\n\tif C.raidframe.icons_ready_check == true and not (suffix == \"target\") then\n\t\tself.ReadyCheckIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.ReadyCheckIndicator:SetSize(12, 12)\n\t\tself.ReadyCheckIndicator:SetPoint(\"BOTTOMRIGHT\", self.Health, 2, -1)\n\tend\n\n\t-- Phase icons\n\tif C.raidframe.icons_phase == true and not (suffix == \"target\") then\n\t\tself.PhaseIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.PhaseIndicator:SetSize(18, 18)\n\t\tself.PhaseIndicator:SetPoint(\"BOTTOMLEFT\", self.Health, -5, -10)\n\tend\n\n\t-- Summon icons\n\tif C.raidframe.icons_sumon == true and not (suffix == \"target\") then\n\t\tself.SummonIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.SummonIndicator:SetSize(24, 24)\n\t\tself.SummonIndicator:SetPoint(\"BOTTOMRIGHT\", self.Health, 6, -5)\n\tend\n\n\tif unit == \"party\" and (not (suffix == \"target\")) and (not (suffix == \"pet\")) then\n\t\tself.Debuffs = CreateFrame(\"Frame\", self:GetName()..\"Debuffs\", self)\n\t\tself.Debuffs:SetPoint(\"TOPLEFT\", self, \"BOTTOMLEFT\", -2, -5)\n\t\tself.Debuffs:SetHeight(18)\n\t\tself.Debuffs:SetWidth(144)\n\t\tself.Debuffs.size = T.Scale(18)\n\t\tself.Debuffs.spacing = T.Scale(3)\n\t\tself.Debuffs.initialAnchor = \"LEFT\"\n\t\tself.Debuffs.num = 7\n\t\tself.Debuffs[\"growth-y\"] = \"DOWN\"\n\t\tself.Debuffs[\"growth-x\"] = \"RIGHT\"\n\t\tself.Debuffs.PostCreateButton = T.PostCreateIcon\n\t\tself.Debuffs.PostUpdateButton = T.PostUpdateIcon\n\tend\n\n\t-- Debuff highlight\n\tself.DebuffHighlight = self.Health:CreateTexture(nil, \"OVERLAY\")\n\tself.DebuffHighlight:SetAllPoints(self.Health)\n\tself.DebuffHighlight:SetTexture(C.media.highlight)\n\tself.DebuffHighlight:SetVertexColor(0, 0, 0, 0)\n\tself.DebuffHighlight:SetBlendMode(\"ADD\")\n\tself.DebuffHighlightAlpha = 1\n\tself.DebuffHighlightFilter = true\n\n\t-- Incoming heals and heal/damage absorbs\n\tif C.raidframe.plugins_healcomm == true then\n\t\tT.CreateHealthPrediction(self)\n\tend\n\n\t-- Range alpha\n\tif C.raidframe.show_range == true and (not (suffix == \"target\")) then\n\t\tself.Range = {insideAlpha = 1, outsideAlpha = C.raidframe.range_alpha}\n\tend\n\n\t-- Smooth bars\n\tif C.unitframe.plugins_smooth_bar == true then\n\t\tself.Health.Smooth = true\n\t\tif not (suffix == \"pet\" or suffix == \"target\") then\n\t\t\tself.Power.Smooth = true\n\t\tend\n\tend\n\n\tif T.PostCreateDPSRaidFrames then\n\t\tT.PostCreateDPSRaidFrames(self, unit)\n\tend\n\n\treturn self\nend\n\n----------------------------------------------------------------------------------------\n--\tDefault position of ShestakUI unitframes\n----------------------------------------------------------------------------------------\noUF:Factory(function(self)\n\tif C.raidframe.layout ~= \"DPS\" and C.raidframe.layout ~= \"AUTO\" then return end\n\n\toUF:RegisterStyle(\"ShestakDPS\", Shared)\n\toUF:SetActiveStyle(\"ShestakDPS\")\n\tif C.raidframe.show_party == true then\n\t\t-- Party\n\t\tlocal party = self:SpawnHeader(\"oUF_PartyDPS\", nil, \"custom [@raid6,exists] hide;show\",\n\t\t\t\"oUF-initialConfigFunction\", [[\n\t\t\t\tlocal header = self:GetParent()\n\t\t\t\tself:SetWidth(header:GetAttribute(\"initial-width\"))\n\t\t\t\tself:SetHeight(header:GetAttribute(\"initial-height\"))\n\t\t\t]],\n\t\t\t\"initial-width\", T.Scale(party_width),\n\t\t\t\"initial-height\", T.Scale(party_height),\n\t\t\t\"showSolo\", C.raidframe.solo_mode,\n\t\t\t\"showPlayer\", C.raidframe.player_in_party,\n\t\t\t\"groupBy\", C.raidframe.by_role and \"ASSIGNEDROLE\",\n\t\t\t\"groupingOrder\", C.raidframe.by_role and \"TANK,HEALER,DAMAGER,NONE\",\n\t\t\t\"sortMethod\", C.raidframe.by_role and \"NAME\",\n\t\t\t\"showParty\", true,\n\t\t\t\"showRaid\", true,\n\t\t\t\"yOffset\", T.Scale(28),\n\t\t\t\"point\", \"BOTTOM\"\n\t\t)\n\t\t_G[\"PartyDPSAnchor\"]:SetSize(T.Scale(party_width), T.Scale(party_height) * 5 + T.Scale(28) * 4)\n\t\tparty:SetPoint(\"BOTTOMLEFT\", _G[\"PartyDPSAnchor\"])\n\n\t\t-- Party targets\n\t\tif C.raidframe.show_target then\n\t\t\tlocal partytarget = self:SpawnHeader(\"oUF_PartyTargetDPS\", nil, \"custom [@raid6,exists] hide;show\",\n\t\t\t\t\"oUF-initialConfigFunction\", [[\n\t\t\t\t\tlocal header = self:GetParent()\n\t\t\t\t\tself:SetWidth(header:GetAttribute(\"initial-width\"))\n\t\t\t\t\tself:SetHeight(header:GetAttribute(\"initial-height\"))\n\t\t\t\t\tself:SetAttribute(\"unitsuffix\", \"target\")\n\t\t\t\t]],\n\t\t\t\t\"initial-width\", T.Scale(partytarget_width),\n\t\t\t\t\"initial-height\", T.Scale(partytarget_height),\n\t\t\t\t\"showSolo\", C.raidframe.solo_mode,\n\t\t\t\t\"showPlayer\", C.raidframe.player_in_party,\n\t\t\t\t\"groupBy\", C.raidframe.by_role and \"ASSIGNEDROLE\",\n\t\t\t\t\"groupingOrder\", C.raidframe.by_role and \"TANK,HEALER,DAMAGER,NONE\",\n\t\t\t\t\"sortMethod\", C.raidframe.by_role and \"NAME\",\n\t\t\t\t\"showParty\", true,\n\t\t\t\t\"showRaid\", true,\n\t\t\t\t\"yOffset\", T.Scale(28),\n\t\t\t\t\"point\", \"BOTTOM\"\n\t\t\t)\n\t\t\t_G[\"PartyTargetDPSAnchor\"]:SetSize(T.Scale(partytarget_width), T.Scale(partytarget_height) * 5 + T.Scale(28) * 4)\n\t\t\tpartytarget:SetPoint(\"BOTTOMLEFT\", _G[\"PartyTargetDPSAnchor\"])\n\t\tend\n\n\t\t-- Party pets\n\t\tif C.raidframe.show_pet then\n\t\t\tlocal partypet = self:SpawnHeader(\"oUF_PartyPetDPS\", nil, \"custom [@raid6,exists] hide;show\",\n\t\t\t\t\"oUF-initialConfigFunction\", [[\n\t\t\t\t\tlocal header = self:GetParent()\n\t\t\t\t\tself:SetWidth(header:GetAttribute(\"initial-width\"))\n\t\t\t\t\tself:SetHeight(header:GetAttribute(\"initial-height\"))\n\t\t\t\t\tself:SetAttribute(\"useOwnerUnit\", \"true\")\n\t\t\t\t\tself:SetAttribute(\"unitsuffix\", \"pet\")\n\t\t\t\t]],\n\t\t\t\t\"initial-width\", T.Scale(partytarget_width),\n\t\t\t\t\"initial-height\", T.Scale(partytarget_height),\n\t\t\t\t\"showSolo\", C.raidframe.solo_mode,\n\t\t\t\t\"showPlayer\", C.raidframe.player_in_party,\n\t\t\t\t\"groupBy\", C.raidframe.by_role and \"ASSIGNEDROLE\",\n\t\t\t\t\"groupingOrder\", C.raidframe.by_role and \"TANK,HEALER,DAMAGER,NONE\",\n\t\t\t\t\"sortMethod\", C.raidframe.by_role and \"NAME\",\n\t\t\t\t\"showParty\", true,\n\t\t\t\t\"showRaid\", true,\n\t\t\t\t\"yOffset\", T.Scale(28),\n\t\t\t\t\"point\", \"BOTTOM\"\n\t\t\t)\n\t\t\t_G[\"PartyPetDPSAnchor\"]:SetSize(T.Scale(partytarget_width), T.Scale(partytarget_height) * 5 + T.Scale(28) * 4)\n\t\t\tpartypet:SetPoint(\"BOTTOMLEFT\", _G[\"PartyPetDPSAnchor\"])\n\t\tend\n\tend\n\n\tif C.raidframe.show_raid == true then\n\t\t-- Raid\n\t\tlocal raid = {}\n\t\tfor i = 1, C.raidframe.raid_groups do\n\t\t\tlocal raidgroup = self:SpawnHeader(\"oUF_RaidDPS\"..i, nil, \"custom [@raid6,exists] show;hide\",\n\t\t\t\t\"oUF-initialConfigFunction\", [[\n\t\t\t\t\tlocal header = self:GetParent()\n\t\t\t\t\tself:SetWidth(header:GetAttribute(\"initial-width\"))\n\t\t\t\t\tself:SetHeight(header:GetAttribute(\"initial-height\"))\n\t\t\t\t]],\n\t\t\t\t\"initial-width\", T.Scale(raid_width),\n\t\t\t\t\"initial-height\", T.Scale(raid_height),\n\t\t\t\t\"showRaid\", true,\n\t\t\t\t\"yOffset\", T.Scale(-7),\n\t\t\t\t\"point\", \"TOPLEFT\",\n\t\t\t\t\"groupFilter\", tostring(i),\n\t\t\t\t\"groupBy\", C.raidframe.by_role and \"ASSIGNEDROLE\",\n\t\t\t\t\"groupingOrder\", C.raidframe.by_role and \"TANK,HEALER,DAMAGER,NONE\",\n\t\t\t\t\"sortMethod\", C.raidframe.by_role and \"NAME\",\n\t\t\t\t\"maxColumns\", 5,\n\t\t\t\t\"unitsPerColumn\", 1,\n\t\t\t\t\"columnSpacing\", T.Scale(7),\n\t\t\t\t\"columnAnchorPoint\", \"TOP\"\n\t\t\t)\n\t\t\tif i == 1 then\n\t\t\t\t_G[\"RaidDPSAnchor\"..i]:SetPoint(unpack(C.position.unitframes.raid_dps))\n\t\t\t\traidgroup:SetPoint(\"TOPLEFT\", _G[\"RaidDPSAnchor\"..i])\n\t\t\telseif i == 5 then\n\t\t\t\t_G[\"RaidDPSAnchor\"..i]:SetPoint(\"TOPLEFT\", _G[\"RaidDPSAnchor1\"], \"TOPRIGHT\", 7, 0)\n\t\t\t\traidgroup:SetPoint(\"TOPLEFT\", _G[\"RaidDPSAnchor\"..i])\n\t\t\telse\n\t\t\t\t_G[\"RaidDPSAnchor\"..i]:SetPoint(\"TOPLEFT\", _G[\"RaidDPSAnchor\"..i-1], \"BOTTOMLEFT\", 0, -7)\n\t\t\t\traidgroup:SetPoint(\"TOPLEFT\", _G[\"RaidDPSAnchor\"..i])\n\t\t\tend\n\t\t\traid[i] = raidgroup\n\t\tend\n\tend\n\n\tif C.raidframe.raid_tanks == true then\n\t\t-- Tanks\n\t\tlocal raidtank = self:SpawnHeader(\"oUF_MainTankDPS\", nil, \"raid\",\n\t\t\t\"oUF-initialConfigFunction\", ([[\n\t\t\t\tself:SetWidth(%d)\n\t\t\t\tself:SetHeight(%d)\n\t\t\t]]):format(tank_width, tank_height),\n\t\t\t\"showRaid\", true,\n\t\t\t\"yOffset\", T.Scale(-7),\n\t\t\t\"groupFilter\", \"MAINTANK\",\n\t\t\t\"template\", C.raidframe.raid_tanks_tt and \"oUF_MainTankTT\" or \"oUF_MainTank\"\n\t\t)\n\t\t_G[\"RaidTankDPSAnchor\"]:SetSize(tank_width, tank_height)\n\t\traidtank:SetPoint(\"BOTTOMLEFT\", _G[\"RaidTankDPSAnchor\"])\n\tend\nend)\n\n-- Create anchors\nfor i = 1, C.raidframe.raid_groups do\n\tlocal raid = CreateFrame(\"Frame\", \"RaidDPSAnchor\"..i, UIParent)\n\traid:SetSize(raid_width, T.Scale(raid_height) * 5 + T.Scale(7) * 4)\nend\n\nlocal party = CreateFrame(\"Frame\", \"PartyDPSAnchor\", UIParent)\nparty:SetPoint(unpack(C.position.unitframes.party_dps))\n\nlocal party_target = CreateFrame(\"Frame\", \"PartyTargetDPSAnchor\", UIParent)\nparty_target:SetPoint(\"TOPLEFT\", party, \"TOPRIGHT\", 7, 0)\n\nlocal party_pet = CreateFrame(\"Frame\", \"PartyPetDPSAnchor\", UIParent)\nparty_pet:SetPoint(\"BOTTOMLEFT\", party, \"BOTTOMRIGHT\", partytarget_width + 14, 0)\n\nlocal raidtank = CreateFrame(\"Frame\", \"RaidTankDPSAnchor\", UIParent)\nif C.threat.enable then\n\traidtank:SetPoint(C.position.unitframes.tank[1], C.position.unitframes.tank[2], C.position.unitframes.tank[3], C.position.unitframes.tank[4] + C.threat.width + 6, C.position.unitframes.tank[5])\nelse\n\tif C.actionbar.split_bars then\n\t\traidtank:SetPoint(C.position.unitframes.tank[1], SplitBarRight, C.position.unitframes.tank[3], C.position.unitframes.tank[4], C.position.unitframes.tank[5])\n\telse\n\t\traidtank:SetPoint(unpack(C.position.unitframes.tank))\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tAuto change raid frame layout\n----------------------------------------------------------------------------------------\nif C.raidframe.layout == \"AUTO\" then\n\tlocal function CheckSpec(self, event, unit)\n\t\tif T.IsHealerSpec() then\n\t\t\t-- Disable DPS\n\t\t\tfor _, party in pairs({oUF_PartyDPS, oUF_PartyTargetDPS, oUF_PartyPetDPS}) do\n\t\t\t\tparty:SetAttribute(\"showSolo\", false)\n\t\t\t\tparty:SetAttribute(\"showParty\", false)\n\t\t\t\tparty:SetAttribute(\"showRaid\", false)\n\t\t\tend\n\n\t\t\tfor i = 1, C.raidframe.raid_groups do\n\t\t\t\tif _G[\"oUF_RaidDPS\"..i] then\n\t\t\t\t\t_G[\"oUF_RaidDPS\"..i]:SetAttribute(\"showRaid\", false)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif oUF_MainTankDPS then\n\t\t\t\toUF_MainTankDPS:SetAttribute(\"showRaid\", false)\n\t\t\tend\n\n\t\t\t-- Enable Heal\n\t\t\tfor _, party in pairs({oUF_Party, oUF_PartyTarget, oUF_PartyPet}) do\n\t\t\t\tparty:SetAttribute(\"showSolo\", C.raidframe.solo_mode)\n\t\t\t\tparty:SetAttribute(\"showParty\", true)\n\t\t\t\tparty:SetAttribute(\"showRaid\", true)\n\t\t\tend\n\n\t\t\tfor i = 1, C.raidframe.raid_groups do\n\t\t\t\tif _G[\"oUF_RaidHeal\"..i] then\n\t\t\t\t\t_G[\"oUF_RaidHeal\"..i]:SetAttribute(\"showRaid\", true)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif oUF_MainTank then\n\t\t\t\toUF_MainTank:SetAttribute(\"showRaid\", true)\n\t\t\tend\n\t\telse\n\t\t\t-- Enable DPS\n\t\t\tfor _, party in pairs({oUF_PartyDPS, oUF_PartyTargetDPS, oUF_PartyPetDPS}) do\n\t\t\t\tparty:SetAttribute(\"showSolo\", C.raidframe.solo_mode)\n\t\t\t\tparty:SetAttribute(\"showParty\", true)\n\t\t\t\tparty:SetAttribute(\"showRaid\", true)\n\t\t\tend\n\n\t\t\tfor i = 1, C.raidframe.raid_groups do\n\t\t\t\tif _G[\"oUF_RaidDPS\"..i] then\n\t\t\t\t\t_G[\"oUF_RaidDPS\"..i]:SetAttribute(\"showRaid\", true)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif oUF_MainTankDPS then\n\t\t\t\toUF_MainTankDPS:SetAttribute(\"showRaid\", true)\n\t\t\tend\n\n\t\t\t-- Disable Heal\n\t\t\tfor _, party in pairs({oUF_Party, oUF_PartyTarget, oUF_PartyPet}) do\n\t\t\t\tparty:SetAttribute(\"showSolo\", false)\n\t\t\t\tparty:SetAttribute(\"showParty\", false)\n\t\t\t\tparty:SetAttribute(\"showRaid\", false)\n\t\t\tend\n\n\t\t\tfor i = 1, C.raidframe.raid_groups do\n\t\t\t\tif _G[\"oUF_RaidHeal\"..i] then\n\t\t\t\t\t_G[\"oUF_RaidHeal\"..i]:SetAttribute(\"showRaid\", false)\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif oUF_MainTank then\n\t\t\t\toUF_MainTank:SetAttribute(\"showRaid\", false)\n\t\t\tend\n\t\tend\n\t\tself:UnregisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tend\n\n\tlocal frame = CreateFrame(\"Frame\")\n\tframe:RegisterEvent(\"PLAYER_ENTERING_WORLD\")\n\tframe:RegisterUnitEvent(\"PLAYER_SPECIALIZATION_CHANGED\", \"player\")\n\tframe:SetScript(\"OnEvent\", CheckSpec)\nend\n\n----------------------------------------------------------------------------------------\n--\tTest RaidFrames\n----------------------------------------------------------------------------------------\ndo\n\tlocal frames = {}\n\tlocal moving = false\n\tSlashCmdList.TEST_RAID_DPS = function()\n\t\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\t\tif not moving then\n\t\t\toUF_RaidDPS1:Show()\n\t\t\tlocal raid = {}\n\t\t\tlocal raid_j = {}\n\t\t\tif #frames == 0 then\n\t\t\t\tfor j = 1, C.raidframe.raid_groups do\n\t\t\t\t\tfor i = 1, 5 do\n\t\t\t\t\t\tlocal frame = CreateFrame(\"Frame\", nil, UIParent)\n\t\t\t\t\t\tframe:SetSize(raid_width, raid_height)\n\t\t\t\t\t\tif j == 1 then\n\t\t\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", oUF_RaidDPS1, \"TOPLEFT\", 0, 0)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOP\", raid[i-1], \"BOTTOM\", 0, -7)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telseif j == 5 then\n\t\t\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", oUF_RaidDPS1, \"TOPRIGHT\", 7, 0)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOP\", raid[i-1], \"BOTTOM\", 0, -7)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", raid_j[j-1], \"BOTTOMLEFT\", 0, -7)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOP\", raid[i-1], \"BOTTOM\", 0, -7)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif i == 5 then\n\t\t\t\t\t\t\traid_j[j] = frame\n\t\t\t\t\t\tend\n\t\t\t\t\t\tframe:CreateBackdrop(\"Overlay\")\n\t\t\t\t\t\tframe.backdrop.overlay:SetVertexColor(0.1, 0.9 - (j * 0.08) , 0.1)\n\t\t\t\t\t\traid[i] = frame\n\t\t\t\t\t\ttable.insert(frames, frame)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tfor _, frame in pairs(frames) do\n\t\t\t\t\tframe:Show()\n\t\t\t\tend\n\t\t\tend\n\t\t\tmoving = true\n\t\telse\n\t\t\tfor _, frame in pairs(frames) do\n\t\t\t\tframe:Hide()\n\t\t\tend\n\t\t\tmoving = false\n\t\tend\n\tend\n\tSLASH_TEST_RAID_DPS1 = \"/testraiddps\"\n\tSLASH_TEST_RAID_DPS2 = \"/еуыекфшввзы\"\n\tSLASH_TEST_RAID_DPS3 = \"/raiddpstest\"\n\tSLASH_TEST_RAID_DPS4 = \"/кфшввзыеуые\"\nend"
  },
  {
    "path": "ShestakUI/Modules/UnitFrames/RaidHeal.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tUnitFrames based on oUF_Caellian(by Caellian)\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\n-- Party size\nlocal party_width = C.raidframe.heal_party_width\nlocal party_height = C.raidframe.heal_party_height\nlocal party_power_height = C.raidframe.heal_party_power_height\nC.raidframe.icon_multiplier = C.raidframe.heal_party_height / 26\n-- Raid size\nlocal raid_width = C.raidframe.heal_raid_width\nlocal raid_height = C.raidframe.heal_raid_height\nlocal raid_power_height = C.raidframe.heal_raid_power_height\n\n-- Create layout\nlocal function Shared(self, unit)\n\tlocal unit = (self:GetParent():GetName():match(\"oUF_Party\")) and \"party\"\n\tor (self:GetParent():GetName():match(\"oUF_RaidHeal\")) and \"raid\"\n\tor (self:GetParent():GetName():match(\"oUF_MainTank\")) and \"tank\" or unit\n\n\tlocal suffix = self:GetAttribute(\"unitsuffix\")\n\n\tif unit == \"party\" then\n\t\tC.raidframe.icon_multiplier = C.raidframe.heal_party_height / 26\n\telseif unit == \"raid\" then\n\t\tC.raidframe.icon_multiplier = C.raidframe.heal_raid_height / 26\n\tend\n\n\t-- Set our own colors\n\tself.colors = T.oUF_colors\n\n\t-- Register click\n\tself:RegisterForClicks(\"AnyUp\")\n\tself:SetScript(\"OnEnter\", UnitFrame_OnEnter)\n\tself:SetScript(\"OnLeave\", UnitFrame_OnLeave)\n\n\t-- Backdrop for every units\n\tself:CreateBackdrop(\"Default\")\n\n\t-- Health bar\n\tself.Health = CreateFrame(\"StatusBar\", nil, self)\n\tself.Health:SetPoint(\"TOPLEFT\")\n\tself.Health:SetPoint(\"TOPRIGHT\")\n\tif (suffix == \"pet\" or suffix == \"target\") and unit ~= \"tank\" then\n\t\tself.Health:SetPoint(\"BOTTOMLEFT\", self, \"BOTTOMLEFT\", 0, 0)\n\t\tself.Health:SetPoint(\"BOTTOMRIGHT\", self, \"BOTTOMRIGHT\", 0, 0)\n\telseif unit == \"party\" then\n\t\tself.Health:SetPoint(\"BOTTOMLEFT\", self, \"BOTTOMLEFT\", 0, party_power_height > 0 and party_power_height + 1 or 0)\n\t\tself.Health:SetPoint(\"BOTTOMRIGHT\", self, \"BOTTOMRIGHT\", 0, party_power_height > 0 and party_power_height + 1 or 0)\n\telse\n\t\tself.Health:SetPoint(\"BOTTOMLEFT\", self, \"BOTTOMLEFT\", 0, raid_power_height > 0 and raid_power_height + 1 or 0)\n\t\tself.Health:SetPoint(\"BOTTOMRIGHT\", self, \"BOTTOMRIGHT\", 0, raid_power_height > 0 and raid_power_height + 1 or 0)\n\tend\n\tself.Health:SetStatusBarTexture(C.media.texture)\n\n\tif C.raidframe.vertical_health == true then\n\t\tself.Health:SetOrientation(\"VERTICAL\")\n\tend\n\n\tself.Health.PostUpdate = function(health, unit)\n\t\tif not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then\n\t\t\thealth:SetValue(0)\n\t\tend\n\tend\n\n\tif C.unitframe.own_color == true then\n\t\tself.Health.colorDisconnected = false\n\t\tself.Health.colorReaction = false\n\t\tself.Health.colorClass = false\n\t\tself.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))\n\telse\n\t\tself.Health.colorDisconnected = true\n\t\tself.Health.colorReaction = true\n\t\tself.Health.colorClass = true\n\tend\n\n\t-- Health bar background\n\tself.Health.bg = self.Health:CreateTexture(nil, \"BORDER\")\n\tself.Health.bg:SetAllPoints(self.Health)\n\tself.Health.bg:SetTexture(C.media.texture)\n\tif C.unitframe.own_color == true then\n\t\tself.Health.bg:SetVertexColor(unpack(C.unitframe.uf_color_bg))\n\telse\n\t\tself.Health.bg.multiplier = 0.2\n\tend\n\n\t-- Names\n\tself.Info = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\tself.Info:SetWordWrap(false)\n\tif (suffix == \"pet\" or suffix == \"target\") and unit ~= \"tank\" then\n\t\tself.Info:SetPoint(\"LEFT\", self.Health, \"LEFT\", 0, 0)\n\t\tself.Info:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\telseif unit == \"party\" then\n\t\tif C.raidframe.hide_health_value then\n\t\t\tself.Info:SetPoint(\"LEFT\", self.Health, \"LEFT\", 0, 0)\n\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\telse\n\t\t\tlocal center = (party_height - (C.font.unit_frames_font_size * 2 + 2)) / 2\n\t\t\tself.Info:SetPoint(\"TOPLEFT\", self.Health, \"TOPLEFT\", 0, -center)\n\t\t\tself.Info:SetPoint(\"TOPRIGHT\", self.Health, \"TOPRIGHT\", 0, -center)\n\t\tend\n\telse\n\t\tif C.raidframe.hide_health_value then\n\t\t\tself.Info:SetPoint(\"LEFT\", self.Health, \"LEFT\", 0, 0)\n\t\t\tself.Info:SetPoint(\"RIGHT\", self.Health, \"RIGHT\", 0, 0)\n\t\telse\n\t\t\tlocal center = (raid_height - (C.font.unit_frames_font_size * 2 + 2)) / 2\n\t\t\tself.Info:SetPoint(\"TOPLEFT\", self.Health, \"TOPLEFT\", 0, -center)\n\t\t\tself.Info:SetPoint(\"TOPRIGHT\", self.Health, \"TOPRIGHT\", 0, -center)\n\t\tend\n\tend\n\tself:Tag(self.Info, \"[GetNameColor][NameShort]\")\n\n\tif not (suffix == \"pet\" or (suffix == \"target\" and unit ~= \"tank\")) then\n\t\tself.Health.value = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tself.Health.value:SetPoint(\"TOP\", self.Info, \"BOTTOM\", 0, -1)\n\t\tself.Health.value:SetTextColor(1, 1, 1)\n\n\t\tif C.raidframe.hide_health_value then\n\t\t\tself.Health.value:SetAlpha(0)\n\t\tend\n\n\t\tself.Health.PostUpdate = T.PostUpdateRaidHealth\n\n\t\t-- Power bar\n\t\tself.Power = CreateFrame(\"StatusBar\", nil, self)\n\t\tself.Power:SetPoint(\"BOTTOMLEFT\", self, \"BOTTOMLEFT\", 0, 0)\n\t\tself.Power:SetPoint(\"BOTTOMRIGHT\", self, \"BOTTOMRIGHT\", 0, 0)\n\t\tself.Power:SetPoint(\"TOP\", self, \"BOTTOM\", 0, unit == \"party\" and party_power_height or raid_power_height)\n\t\tself.Power:SetStatusBarTexture(C.media.texture)\n\n\t\tself.Power.PostUpdate = function(power, unit)\n\t\t\tif not UnitIsConnected(unit) or UnitIsDeadOrGhost(unit) then\n\t\t\t\tpower:SetValue(0)\n\t\t\tend\n\t\tend\n\n\t\tself.Power.frequentUpdates = true\n\t\tself.Power.colorDisconnected = true\n\t\tif C.unitframe.own_color == true then\n\t\t\tself.Power.colorClass = true\n\t\telse\n\t\t\tself.Power.colorPower = true\n\t\tend\n\n\t\t-- Power bar background\n\t\tself.Power.bg = self.Power:CreateTexture(nil, \"BORDER\")\n\t\tself.Power.bg:SetAllPoints(self.Power)\n\t\tself.Power.bg:SetTexture(C.media.texture)\n\t\tself.Power.bg:SetAlpha(1)\n\t\tself.Power.bg.multiplier = 0.2\n\tend\n\n\t-- Aggro border\n\tif C.raidframe.aggro_border == true then\n\t\tself.ThreatIndicator = CreateFrame(\"Frame\", nil, self)\n\t\tself.ThreatIndicator.PostUpdate = T.UpdateThreat\n\tend\n\n\t-- Raid marks\n\tif C.raidframe.icons_raid_mark == true then\n\t\tself.RaidTargetIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.RaidTargetIndicator:SetSize(12 * C.raidframe.icon_multiplier, 12 * C.raidframe.icon_multiplier)\n\t\tself.RaidTargetIndicator:SetPoint(\"BOTTOMLEFT\", self.Health, -2, -5)\n\tend\n\n\t-- LFD role icons\n\tif C.raidframe.icons_role == true and not (suffix == \"target\") then\n\t\tself.GroupRoleIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.GroupRoleIndicator:SetSize(10 * C.raidframe.icon_multiplier, 10 * C.raidframe.icon_multiplier)\n\t\tself.GroupRoleIndicator:SetPoint(\"TOP\", self.Health, 0, 6)\n\tend\n\n\t-- Ready check icons\n\tif C.raidframe.icons_ready_check == true and not (suffix == \"target\" or suffix == \"targettarget\") then\n\t\tself.ReadyCheckIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.ReadyCheckIndicator:SetSize(12 * C.raidframe.icon_multiplier, 12 * C.raidframe.icon_multiplier)\n\t\tself.ReadyCheckIndicator:SetPoint(\"BOTTOMRIGHT\", self.Health, 2, 1)\n\tend\n\n\t-- Summon icons\n\tif C.raidframe.icons_sumon == true and not (suffix == \"target\" or suffix == \"targettarget\") then\n\t\tself.SummonIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.SummonIndicator:SetSize(24 * C.raidframe.icon_multiplier, 24 * C.raidframe.icon_multiplier)\n\t\tself.SummonIndicator:SetPoint(\"BOTTOMRIGHT\", self.Health, 7, -11)\n\tend\n\n\t-- Phase icons\n\tif C.raidframe.icons_phase == true and not (suffix == \"target\" or suffix == \"targettarget\") then\n\t\tself.PhaseIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.PhaseIndicator:SetSize(20 * C.raidframe.icon_multiplier, 20 * C.raidframe.icon_multiplier)\n\t\tself.PhaseIndicator:SetPoint(\"TOPRIGHT\", self.Health, 5, 5)\n\tend\n\n\t-- Leader/Assistant icons\n\tif C.raidframe.icons_leader == true and not (suffix == \"target\" or suffix == \"targettarget\") then\n\t\t-- Leader icon\n\t\tself.LeaderIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.LeaderIndicator:SetSize(12 * C.raidframe.icon_multiplier, 12 * C.raidframe.icon_multiplier)\n\t\tself.LeaderIndicator:SetPoint(\"TOPLEFT\", self.Health, -3, 8)\n\n\t\t-- Assistant icon\n\t\tself.AssistantIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.AssistantIndicator:SetSize(12 * C.raidframe.icon_multiplier, 12 * C.raidframe.icon_multiplier)\n\t\tself.AssistantIndicator:SetPoint(\"TOPLEFT\", self.Health, -3, 8)\n\tend\n\n\t-- Resurrect icon\n\tif not (suffix == \"target\" or suffix == \"targettarget\") then\n\t\tself.ResurrectIndicator = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.ResurrectIndicator:SetSize(13 * C.raidframe.icon_multiplier, 13 * C.raidframe.icon_multiplier)\n\t\tself.ResurrectIndicator:SetPoint(\"BOTTOMRIGHT\", self.Health, 2, -7)\n\tend\n\n\t-- Debuff highlight\n\tif not (suffix == \"target\" or suffix == \"targettarget\") then\n\t\tself.DebuffHighlight = self.Health:CreateTexture(nil, \"OVERLAY\")\n\t\tself.DebuffHighlight:SetAllPoints(self.Health)\n\t\tself.DebuffHighlight:SetTexture(C.media.highlight)\n\t\tself.DebuffHighlight:SetVertexColor(0, 0, 0, 0)\n\t\tself.DebuffHighlight:SetBlendMode(\"ADD\")\n\t\tself.DebuffHighlightAlpha = 1\n\t\tself.DebuffHighlightFilter = true\n\tend\n\n\t-- Incoming heals and heal/damage absorbs\n\tif C.raidframe.plugins_healcomm == true then\n\t\tT.CreateHealthPrediction(self)\n\tend\n\n\t-- Range alpha\n\tif C.raidframe.show_range == true and not (suffix == \"target\" or suffix == \"targettarget\") then\n\t\tself.Range = {insideAlpha = 1, outsideAlpha = C.raidframe.range_alpha}\n\tend\n\n\t-- Smooth bars\n\tif C.unitframe.plugins_smooth_bar == true then\n\t\tself.Health.Smooth = true\n\t\tif not (suffix == \"pet\" or suffix == \"target\") then\n\t\t\tself.Power.Smooth = true\n\t\tend\n\tend\n\n\tif C.raidframe.plugins_aura_watch == true and not (suffix == \"pet\" or suffix == \"target\" or suffix == \"targettarget\") then\n\t\t-- Classbuffs\n\t\tT.CreateAuraWatch(self, unit)\n\n\t\t-- Raid debuffs\n\t\tself.RaidDebuffs = CreateFrame(\"Frame\", nil, self)\n\t\tself.RaidDebuffs:SetSize(19, 19)\n\t\tself.RaidDebuffs:SetPoint(\"CENTER\", self, 0, 1)\n\t\tself.RaidDebuffs:SetFrameStrata(\"MEDIUM\")\n\t\tself.RaidDebuffs:SetFrameLevel(10)\n\t\tself.RaidDebuffs:SetTemplate(\"Default\")\n\n\t\tself.RaidDebuffs.icon = self.RaidDebuffs:CreateTexture(nil, \"BORDER\")\n\t\tself.RaidDebuffs.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\t\tself.RaidDebuffs.icon:SetPoint(\"TOPLEFT\", 2, -2)\n\t\tself.RaidDebuffs.icon:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\n\t\tif C.raidframe.plugins_aura_watch_timer == true then\n\t\t\tself.RaidDebuffs.time = T.SetFontString(self.RaidDebuffs, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\t\tself.RaidDebuffs.time:SetPoint(\"CENTER\", 1, 1)\n\t\t\tself.RaidDebuffs.time:SetTextColor(1, 1, 1)\n\t\tend\n\n\t\tself.RaidDebuffs.count = T.SetFontString(self.RaidDebuffs, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)\n\t\tself.RaidDebuffs.count:SetPoint(\"BOTTOMRIGHT\", self.RaidDebuffs, \"BOTTOMRIGHT\", 3, -1)\n\t\tself.RaidDebuffs.count:SetTextColor(1, 1, 1)\n\n\t\tif C.aura.show_spiral == true then\n\t\t\tself.RaidDebuffs.cd = CreateFrame(\"Cooldown\", nil, self.RaidDebuffs, \"CooldownFrameTemplate\")\n\t\t\tself.RaidDebuffs.cd:SetPoint(\"TOPLEFT\", 2, -2)\n\t\t\tself.RaidDebuffs.cd:SetPoint(\"BOTTOMRIGHT\", -2, 2)\n\t\t\tself.RaidDebuffs.cd:SetReverse(true)\n\t\t\tself.RaidDebuffs.cd:SetDrawEdge(false)\n\t\t\tself.RaidDebuffs.cd.noCooldownCount = true\n\t\t\tself.RaidDebuffs.parent = CreateFrame(\"Frame\", nil, self.RaidDebuffs)\n\t\t\tself.RaidDebuffs.parent:SetFrameLevel(self.RaidDebuffs.cd:GetFrameLevel() + 1)\n\t\t\tif C.raidframe.plugins_aura_watch_timer == true then\n\t\t\t\tself.RaidDebuffs.time:SetParent(self.RaidDebuffs.parent)\n\t\t\tend\n\t\t\tself.RaidDebuffs.count:SetParent(self.RaidDebuffs.parent)\n\t\tend\n\n\t\tself.RaidDebuffs.ShowDispellableDebuff = C.raidframe.plugins_debuffhighlight_icon\n\t\tself.RaidDebuffs.FilterDispellableDebuff = true\n\t\tself.RaidDebuffs.MatchBySpellName = true\n\tend\n\n\tif T.PostCreateHealRaidFrames then\n\t\tT.PostCreateHealRaidFrames(self, unit)\n\tend\n\n\treturn self\nend\n\n----------------------------------------------------------------------------------------\n--\tDefault position of ShestakUI unitframes\n----------------------------------------------------------------------------------------\noUF:Factory(function(self)\n\tif C.raidframe.layout ~= \"HEAL\" and C.raidframe.layout ~= \"AUTO\" then return end\n\n\toUF:RegisterStyle(\"ShestakHeal\", Shared)\n\toUF:SetActiveStyle(\"ShestakHeal\")\n\tif C.raidframe.show_party == true then\n\t\tlocal party = self:SpawnHeader(\"oUF_Party\", nil, \"custom [@raid6,exists] hide;show\",\n\t\t\t\"oUF-initialConfigFunction\", [[\n\t\t\t\tlocal header = self:GetParent()\n\t\t\t\tself:SetWidth(header:GetAttribute(\"initial-width\"))\n\t\t\t\tself:SetHeight(header:GetAttribute(\"initial-height\"))\n\t\t\t]],\n\t\t\t\"initial-width\", party_width,\n\t\t\t\"initial-height\", T.Scale(party_height),\n\t\t\t\"showSolo\", C.raidframe.solo_mode,\n\t\t\t\"showPlayer\", C.raidframe.player_in_party,\n\t\t\t\"groupBy\", C.raidframe.by_role and \"ASSIGNEDROLE\",\n\t\t\t\"groupingOrder\", C.raidframe.by_role and \"TANK,HEALER,DAMAGER,NONE\",\n\t\t\t\"sortMethod\", C.raidframe.by_role and \"NAME\",\n\t\t\t\"showParty\", true,\n\t\t\t\"showRaid\", true,\n\t\t\t\"xOffset\", not C.raidframe.party_vertical and T.Scale(7),\n\t\t\t\"yOffset\", C.raidframe.party_vertical and T.Scale(-7),\n\t\t\t\"point\", C.raidframe.party_vertical and \"TOP\" or \"LEFT\"\n\t\t)\n\t\tparty:SetPoint(\"TOPLEFT\", _G[\"PartyAnchor\"])\n\t\tif C.raidframe.party_vertical then\n\t\t\t_G[\"PartyAnchor\"]:SetSize(party_width, party_height * 5 + T.Scale(7) * 4)\n\t\telse\n\t\t\t_G[\"PartyAnchor\"]:SetSize(party_width * 5 + T.Scale(7) * 4, party_height)\n\t\tend\n\n\t\t-- Party targets\n\t\tif C.raidframe.show_target then\n\t\t\tlocal partytarget = self:SpawnHeader(\"oUF_PartyTarget\", nil, \"custom [@raid6,exists] hide;show\",\n\t\t\t\t\"oUF-initialConfigFunction\", [[\n\t\t\t\t\tlocal header = self:GetParent()\n\t\t\t\t\tself:SetWidth(header:GetAttribute(\"initial-width\"))\n\t\t\t\t\tself:SetHeight(header:GetAttribute(\"initial-height\"))\n\t\t\t\t\tself:SetAttribute(\"unitsuffix\", \"target\")\n\t\t\t\t]],\n\t\t\t\t\"initial-width\", C.raidframe.party_vertical and T.Scale(party_height) or party_width,\n\t\t\t\t\"initial-height\", C.raidframe.party_vertical and T.Scale(party_height) or T.Scale(party_height / 2),\n\t\t\t\t\"showSolo\", C.raidframe.solo_mode,\n\t\t\t\t\"showPlayer\", C.raidframe.player_in_party,\n\t\t\t\t\"groupBy\", C.raidframe.by_role and \"ASSIGNEDROLE\",\n\t\t\t\t\"groupingOrder\", C.raidframe.by_role and \"TANK,HEALER,DAMAGER,NONE\",\n\t\t\t\t\"sortMethod\", C.raidframe.by_role and \"NAME\",\n\t\t\t\t\"showParty\", true,\n\t\t\t\t\"showRaid\", true,\n\t\t\t\t\"xOffset\", not C.raidframe.party_vertical and T.Scale(7),\n\t\t\t\t\"yOffset\", C.raidframe.party_vertical and T.Scale(-7),\n\t\t\t\t\"point\", C.raidframe.party_vertical and \"TOP\" or \"LEFT\"\n\t\t\t)\n\t\t\tpartytarget:SetPoint(\"TOPLEFT\", _G[\"PartyTargetAnchor\"])\n\t\t\tif C.raidframe.party_vertical then\n\t\t\t\t_G[\"PartyTargetAnchor\"]:SetSize(T.Scale(party_height), T.Scale(party_height) * 5 + T.Scale(7) * 4)\n\t\t\t\t_G[\"PartyTargetAnchor\"]:SetPoint(\"TOPLEFT\", party, \"TOPRIGHT\", 7, 0)\n\t\t\telse\n\t\t\t\t_G[\"PartyTargetAnchor\"]:SetSize(party_width * 5 + T.Scale(7) * 4, T.Scale(party_height / 2))\n\t\t\tend\n\t\tend\n\n\t\t-- Party pets\n\t\tif C.raidframe.show_pet then\n\t\t\tlocal partypet = self:SpawnHeader(\"oUF_PartyPet\", nil, \"custom [@raid6,exists] hide;show\",\n\t\t\t\t\"oUF-initialConfigFunction\", [[\n\t\t\t\t\tlocal header = self:GetParent()\n\t\t\t\t\tself:SetWidth(header:GetAttribute(\"initial-width\"))\n\t\t\t\t\tself:SetHeight(header:GetAttribute(\"initial-height\"))\n\t\t\t\t\tself:SetAttribute(\"useOwnerUnit\", \"true\")\n\t\t\t\t\tself:SetAttribute(\"unitsuffix\", \"pet\")\n\t\t\t\t]],\n\t\t\t\t\"initial-width\", C.raidframe.party_vertical and T.Scale(party_height) or party_width,\n\t\t\t\t\"initial-height\", C.raidframe.party_vertical and T.Scale(party_height) or T.Scale(party_height / 2),\n\t\t\t\t\"showSolo\", C.raidframe.solo_mode,\n\t\t\t\t\"showPlayer\", C.raidframe.player_in_party,\n\t\t\t\t\"groupBy\", C.raidframe.by_role and \"ASSIGNEDROLE\",\n\t\t\t\t\"groupingOrder\", C.raidframe.by_role and \"TANK,HEALER,DAMAGER,NONE\",\n\t\t\t\t\"sortMethod\", C.raidframe.by_role and \"NAME\",\n\t\t\t\t\"showParty\", true,\n\t\t\t\t\"showRaid\", true,\n\t\t\t\t\"xOffset\", not C.raidframe.party_vertical and T.Scale(7),\n\t\t\t\t\"yOffset\", C.raidframe.party_vertical and T.Scale(-7),\n\t\t\t\t\"point\", C.raidframe.party_vertical and \"TOP\" or \"LEFT\"\n\t\t\t)\n\t\t\tpartypet:SetPoint(\"TOPLEFT\", _G[\"PartyPetAnchor\"])\n\t\t\tif C.raidframe.party_vertical then\n\t\t\t\t_G[\"PartyPetAnchor\"]:SetSize(T.Scale(party_height), T.Scale(party_height) * 5 + T.Scale(7) * 4)\n\t\t\t\t_G[\"PartyPetAnchor\"]:SetPoint(\"TOPLEFT\", party, \"TOPRIGHT\", T.Scale(party_height) + 14.5, 0)\n\t\t\telse\n\t\t\t\t_G[\"PartyPetAnchor\"]:SetSize(party_width * 5 + T.Scale(7) * 4, T.Scale(party_height / 2))\n\t\t\tend\n\t\tend\n\tend\n\n\tif C.raidframe.show_raid == true then\n\t\tlocal raid = {}\n\t\tfor i = 1, C.raidframe.raid_groups do\n\t\t\tlocal raidgroup = self:SpawnHeader(\"oUF_RaidHeal\"..i, nil, \"custom [@raid6,exists] show;hide\",\n\t\t\t\t\"oUF-initialConfigFunction\", [[\n\t\t\t\t\tlocal header = self:GetParent()\n\t\t\t\t\tself:SetWidth(header:GetAttribute(\"initial-width\"))\n\t\t\t\t\tself:SetHeight(header:GetAttribute(\"initial-height\"))\n\t\t\t\t]],\n\t\t\t\t\"initial-width\", raid_width,\n\t\t\t\t\"initial-height\", T.Scale(raid_height),\n\t\t\t\t\"showRaid\", true,\n\t\t\t\t\"groupFilter\", tostring(i),\n\t\t\t\t\"groupBy\", C.raidframe.by_role and \"ASSIGNEDROLE\",\n\t\t\t\t\"groupingOrder\", C.raidframe.by_role and \"TANK,HEALER,DAMAGER,NONE\",\n\t\t\t\t\"sortMethod\", C.raidframe.by_role and \"NAME\",\n\t\t\t\t\"maxColumns\", 5,\n\t\t\t\t\"unitsPerColumn\", 1,\n\t\t\t\t\"columnSpacing\", T.Scale(7),\n\t\t\t\t\"yOffset\", C.raidframe.raid_groups_vertical and T.Scale(-5),\n\t\t\t\t\"point\", C.raidframe.raid_groups_vertical and \"TOPLEFT\" or \"LEFT\",\n\t\t\t\t\"columnAnchorPoint\", C.raidframe.raid_groups_vertical and \"TOP\" or \"LEFT\"\n\t\t\t)\n\t\t\traidgroup:SetPoint(\"TOPLEFT\", _G[\"RaidAnchor\"..i])\n\t\t\tif C.raidframe.raid_groups_vertical then\n\t\t\t\t_G[\"RaidAnchor\"..i]:SetSize(raid_width, T.Scale(raid_height) * 5 + T.Scale(7) * 4)\n\t\t\t\tif i == 1 then\n\t\t\t\t\t_G[\"RaidAnchor\"..i]:SetPoint(unpack(C.position.unitframes.raid_heal))\n\t\t\t\telse\n\t\t\t\t\t_G[\"RaidAnchor\"..i]:SetPoint(\"TOPLEFT\", _G[\"RaidAnchor\"..i-1], \"TOPRIGHT\", 7, 0)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\t_G[\"RaidAnchor\"..i]:SetSize(raid_width * 5 + T.Scale(7) * 4, T.Scale(raid_height))\n\t\t\t\tif i == 1 then\n\t\t\t\t\t_G[\"RaidAnchor\"..i]:SetPoint(unpack(C.position.unitframes.raid_heal))\n\t\t\t\telse\n\t\t\t\t\t_G[\"RaidAnchor\"..i]:SetPoint(\"TOPLEFT\", _G[\"RaidAnchor\"..i-1], \"BOTTOMLEFT\", 0, -7)\n\t\t\t\tend\n\t\t\tend\n\t\t\traid[i] = raidgroup\n\t\tend\n\n\t\tif C.raidframe.raid_tanks == true then\n\t\t\t-- Tanks\n\t\t\tlocal raidtank = self:SpawnHeader(\"oUF_MainTank\", nil, \"raid\",\n\t\t\t\t\"oUF-initialConfigFunction\", ([[\n\t\t\t\t\tself:SetWidth(%d)\n\t\t\t\t\tself:SetHeight(%d)\n\t\t\t\t]]):format(raid_width, raid_height),\n\t\t\t\t\"showRaid\", true,\n\t\t\t\t\"yOffset\", T.Scale(-7),\n\t\t\t\t\"groupFilter\", \"MAINTANK\",\n\t\t\t\t\"template\", C.raidframe.raid_tanks_tt and \"oUF_MainTankTT\" or \"oUF_MainTank\"\n\t\t\t)\n\t\t\t_G[\"RaidTankAnchor\"]:SetSize(raid_width, raid_height)\n\t\t\traidtank:SetPoint(\"BOTTOMLEFT\", _G[\"RaidTankAnchor\"])\n\t\tend\n\tend\nend)\n\n-- Create anchors\nfor i = 1, C.raidframe.raid_groups do\n\tlocal raid = CreateFrame(\"Frame\", \"RaidAnchor\"..i, UIParent)\nend\n\nlocal party = CreateFrame(\"Frame\", \"PartyAnchor\", UIParent)\nif C.raidframe.player_in_party == true then\n\tparty:SetPoint(unpack(C.position.unitframes.party_heal))\nelse\n\tparty:SetPoint(C.position.unitframes.party_heal[1], C.position.unitframes.party_heal[2], C.position.unitframes.party_heal[3], C.position.unitframes.party_heal[4] + 32, C.position.unitframes.party_heal[5])\nend\n\nlocal party_target = CreateFrame(\"Frame\", \"PartyTargetAnchor\", UIParent)\nparty_target:SetPoint(\"TOPLEFT\", party, \"BOTTOMLEFT\", 0, -7)\n\nlocal party_pet = CreateFrame(\"Frame\", \"PartyPetAnchor\", UIParent)\nparty_pet:SetPoint(\"TOPLEFT\", party, \"BOTTOMLEFT\", 0, -((party_height / 2) + 14.5))\n\nlocal raidtank = CreateFrame(\"Frame\", \"RaidTankAnchor\", UIParent)\nif C.threat.enable then\n\traidtank:SetPoint(C.position.unitframes.tank[1], C.position.unitframes.tank[2], C.position.unitframes.tank[3], C.position.unitframes.tank[4] + C.threat.width + 6, C.position.unitframes.tank[5])\nelse\n\tif C.actionbar.split_bars then\n\t\traidtank:SetPoint(C.position.unitframes.tank[1], SplitBarRight, C.position.unitframes.tank[3], C.position.unitframes.tank[4], C.position.unitframes.tank[5])\n\telse\n\t\traidtank:SetPoint(unpack(C.position.unitframes.tank))\n\tend\nend\n\n----------------------------------------------------------------------------------------\n--\tTest RaidFrames\n----------------------------------------------------------------------------------------\ndo\n\tlocal frames = {}\n\tlocal moving = false\n\tSlashCmdList.TEST_RAID = function()\n\t\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\t\tif not moving then\n\t\t\toUF_RaidHeal1:Show()\n\t\t\tlocal raid = {}\n\t\t\tlocal raid_j = {}\n\t\t\tif #frames == 0 then\n\t\t\t\tfor j = 1, C.raidframe.raid_groups do\n\t\t\t\t\tfor i = 1, 5 do\n\t\t\t\t\t\tlocal frame = CreateFrame(\"Frame\", nil, UIParent)\n\t\t\t\t\t\tframe:SetSize(raid_width, raid_height)\n\t\t\t\t\t\tif j == 1 then\n\t\t\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", oUF_RaidHeal1, \"TOPLEFT\", 0, 0)\n\t\t\t\t\t\t\t\traid_j[j] = frame\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", raid[i-1], \"TOPRIGHT\", 7, 0)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", raid_j[j-1], \"TOPLEFT\", 0, -raid_height - 7)\n\t\t\t\t\t\t\t\traid_j[j] = frame\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", raid[i-1], \"TOPRIGHT\", 7, 0)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tframe:CreateBackdrop(\"Overlay\")\n\t\t\t\t\t\tframe.backdrop.overlay:SetVertexColor(0.1, 0.9 - (j * 0.08) , 0.1)\n\t\t\t\t\t\traid[i] = frame\n\t\t\t\t\t\ttable.insert(frames, frame)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tfor _, frame in pairs(frames) do\n\t\t\t\t\tframe:Show()\n\t\t\t\tend\n\t\t\tend\n\t\t\tmoving = true\n\t\telse\n\t\t\tfor _, frame in pairs(frames) do\n\t\t\t\tframe:Hide()\n\t\t\tend\n\t\t\tmoving = false\n\t\tend\n\tend\n\tSLASH_TEST_RAID1 = \"/testraid\"\n\tSLASH_TEST_RAID2 = \"/еуыекфшв\"\n\tSLASH_TEST_RAID3 = \"/raidtest\"\n\tSLASH_TEST_RAID4 = \"/кфшвеуые\"\nend\n\ndo\n\tlocal frames = {}\n\tlocal moving = false\n\tSlashCmdList.TEST_PARTY = function()\n\t\tif InCombatLockdown() then print(\"|cffffff00\"..ERR_NOT_IN_COMBAT..\"|r\") return end\n\t\tif not moving then\n\t\t\toUF_PartyUnitButton1:Show()\n\t\t\tlocal raid = {}\n\t\t\tif #frames == 0 then\n\t\t\t\tfor i = 1, 5 do\n\t\t\t\t\tlocal frame = CreateFrame(\"Frame\", nil, UIParent)\n\t\t\t\t\tframe:SetSize(party_width, party_height)\n\t\t\t\t\tif i == 1 then\n\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", oUF_PartyUnitButton1, \"TOPLEFT\", 0, 0)\n\t\t\t\t\telse\n\t\t\t\t\t\tif C.raidframe.party_vertical then\n\t\t\t\t\t\t\tframe:SetPoint(\"TOP\", raid[i-1], \"BOTTOM\", 0, -7)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tframe:SetPoint(\"TOPLEFT\", raid[i-1], \"TOPRIGHT\", 7, 0)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tframe:CreateBackdrop(\"Overlay\")\n\t\t\t\t\tframe.backdrop.overlay:SetVertexColor(random(255) / 255, random(255) / 255, random(255) / 255)\n\t\t\t\t\traid[i] = frame\n\t\t\t\t\ttable.insert(frames, frame)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tfor _, frame in pairs(frames) do\n\t\t\t\t\tframe:Show()\n\t\t\t\tend\n\t\t\tend\n\t\t\tmoving = true\n\t\telse\n\t\t\tfor _, frame in pairs(frames) do\n\t\t\t\tframe:Hide()\n\t\t\tend\n\t\t\tmoving = false\n\t\tend\n\tend\n\tSLASH_TEST_PARTY1 = \"/testparty\"\n\tSLASH_TEST_PARTY2 = \"/еуыезфкен\"\n\tSLASH_TEST_PARTY3 = \"/partytest\"\n\tSLASH_TEST_PARTY4 = \"/зфкенеуые\"\nend"
  },
  {
    "path": "ShestakUI/Modules/UnitFrames/Tags.lua",
    "content": "local T, C, L, _ = unpack(select(2, ...))\nif C.unitframe.enable ~= true and C.nameplate.enable ~= true then return end\n\n----------------------------------------------------------------------------------------\n--\tTags\n----------------------------------------------------------------------------------------\nlocal _, ns = ...\nlocal oUF = ns.oUF\n\noUF.Tags.Methods[\"Threat\"] = function()\n\tlocal _, status, percent = UnitDetailedThreatSituation(\"player\", \"target\")\n\tif percent and percent > 0 then\n\t\treturn (\"%s%d%%|r\"):format(Hex(GetThreatStatusColor(status)), percent)\n\tend\nend\noUF.Tags.Events[\"Threat\"] = \"UNIT_THREAT_LIST_UPDATE\"\n\noUF.Tags.Methods[\"DiffColor\"] = function(unit)\n\tlocal r, g, b\n\tlocal level = UnitLevel(unit)\n\tif level < 1 then\n\t\tr, g, b = 0.69, 0.31, 0.31\n\telse\n\t\tlocal DiffColor = UnitLevel(unit) - UnitLevel(\"player\")\n\t\tif DiffColor >= 5 then\n\t\t\tr, g, b = 0.69, 0.31, 0.31\n\t\telseif DiffColor >= 3 then\n\t\t\tr, g, b = 0.71, 0.43, 0.27\n\t\telseif DiffColor >= -2 then\n\t\t\tr, g, b = 0.84, 0.75, 0.65\n\t\telseif -DiffColor <= 5 then\n\t\t\tr, g, b = 0.33, 0.59, 0.33\n\t\telse\n\t\t\tr, g, b = 0.55, 0.57, 0.61\n\t\tend\n\tend\n\treturn string.format(\"|cff%02x%02x%02x\", r * 255, g * 255, b * 255)\nend\noUF.Tags.Events[\"DiffColor\"] = \"UNIT_LEVEL\"\n\noUF.Tags.Methods[\"PetNameColor\"] = function()\n\treturn string.format(\"|cff%02x%02x%02x\", T.color.r * 255, T.color.g * 255, T.color.b * 255)\nend\noUF.Tags.Events[\"PetNameColor\"] = \"UNIT_POWER_UPDATE\"\n\noUF.Tags.Methods[\"GetNameColor\"] = function(unit)\n\tlocal reaction = UnitReaction(unit, \"player\")\n\tif UnitIsPlayer(unit) then\n\t\treturn _TAGS[\"raidcolor\"](unit)\n\telseif reaction then\n\t\tlocal c = T.oUF_colors.reaction[reaction]\n\t\treturn string.format(\"|cff%02x%02x%02x\", c[1] * 255, c[2] * 255, c[3] * 255)\n\telse\n\t\tlocal r, g, b = 0.33, 0.59, 0.33\n\t\treturn string.format(\"|cff%02x%02x%02x\", r * 255, g * 255, b * 255)\n\tend\nend\noUF.Tags.Events[\"GetNameColor\"] = \"UNIT_POWER_UPDATE UNIT_FLAGS\"\n\noUF.Tags.Methods[\"NameArena\"] = function(unit)\n\tlocal name = UnitName(unit)\n\treturn T.UTF(name, 4, false)\nend\noUF.Tags.Events[\"NameArena\"] = \"UNIT_NAME_UPDATE\"\n\noUF.Tags.Methods[\"NameShort\"] = function(unit)\n\tlocal name = UnitName(unit)\n\treturn T.UTF(name, 8, false)\nend\noUF.Tags.Events[\"NameShort\"] = \"UNIT_NAME_UPDATE\"\n\noUF.Tags.Methods[\"NameMedium\"] = function(unit)\n\tlocal name = UnitName(unit)\n\treturn T.UTF(name, 11, true)\nend\noUF.Tags.Events[\"NameMedium\"] = \"UNIT_NAME_UPDATE\"\n\noUF.Tags.Methods[\"NameLong\"] = function(unit)\n\tlocal name = UnitName(unit)\n\treturn T.UTF(name, 18, true)\nend\noUF.Tags.Events[\"NameLong\"] = \"UNIT_NAME_UPDATE\"\n\noUF.Tags.Methods[\"NameLongAbbrev\"] = function(unit)\n\tlocal name = UnitName(unit)\n\tif string.len(name) > 18 then\n\t\tname = string.gsub(name, \"-\", \"\")\n\t\tname = string.gsub(name, \"%s?(.[\\128-\\191]*)%S+%s\", \"%1. \")\n\tend\n\treturn T.UTF(name, 18, false)\nend\noUF.Tags.Events[\"NameLongAbbrev\"] = \"UNIT_NAME_UPDATE\"\n\noUF.Tags.Methods[\"LFD\"] = function(unit)\n\tlocal role = UnitGroupRolesAssigned(unit)\n\tif role == \"TANK\" then\n\t\treturn \"|cff0070DE[T]|r\"\n\telseif role == \"HEALER\" then\n\t\treturn \"|cff00CC12[H]|r\"\n\telseif role == \"DAMAGER\" then\n\t\treturn \"|cffFF3030[D]|r\"\n\tend\nend\noUF.Tags.Events[\"LFD\"] = \"PLAYER_ROLES_ASSIGNED GROUP_ROSTER_UPDATE\"\n\noUF.Tags.Methods[\"AltPower\"] = function(unit)\n\tlocal min = UnitPower(unit, ALTERNATE_POWER_INDEX)\n\tlocal max = UnitPowerMax(unit, ALTERNATE_POWER_INDEX)\n\tif max > 0 and not UnitIsDeadOrGhost(unit) then\n\t\treturn (\"%s%%\"):format(math.floor(min / max * 100 + 0.5))\n\tend\nend\noUF.Tags.Events[\"AltPower\"] = \"UNIT_POWER_UPDATE\"\n\noUF.Tags.Methods[\"NameplateLevel\"] = function(unit)\n\tlocal level = UnitLevel(unit)\n\tlocal c = UnitClassification(unit)\n\tif UnitIsWildBattlePet(unit) or UnitIsBattlePetCompanion(unit) then\n\t\tlevel = UnitBattlePetLevel(unit)\n\tend\n\n\tif level == T.level and c == \"normal\" then return end\n\tif level > 0 then\n\t\treturn level\n\telse\n\t\treturn \"??\"\n\tend\nend\noUF.Tags.Events[\"NameplateLevel\"] = \"UNIT_LEVEL PLAYER_LEVEL_UP\"\n\noUF.Tags.Methods[\"NameplateNameColor\"] = function(unit)\n\tlocal reaction = UnitReaction(unit, \"player\")\n\tif not UnitIsUnit(\"player\", unit) and UnitIsPlayer(unit) and (reaction and reaction >= 5) then\n\t\tif C.nameplate.only_name then\n\t\t\treturn _TAGS[\"raidcolor\"](unit)\n\t\telse\n\t\t\tlocal c = T.oUF_colors.power[\"MANA\"]\n\t\t\treturn string.format(\"|cff%02x%02x%02x\", c[1] * 255, c[2] * 255, c[3] * 255)\n\t\tend\n\telseif UnitIsPlayer(unit) then\n\t\treturn _TAGS[\"raidcolor\"](unit)\n\telseif reaction then\n\t\tlocal c = T.oUF_colors.reaction[reaction]\n\t\treturn string.format(\"|cff%02x%02x%02x\", c[1] * 255, c[2] * 255, c[3] * 255)\n\telse\n\t\tlocal r, g, b = 0.33, 0.59, 0.33\n\t\treturn string.format(\"|cff%02x%02x%02x\", r * 255, g * 255, b * 255)\n\tend\nend\noUF.Tags.Events[\"NameplateNameColor\"] = \"UNIT_POWER_UPDATE UNIT_FLAGS\"\n\noUF.Tags.Methods[\"NameplateNameShort\"] = function(unit)\n\tlocal name = UnitName(unit)\n\tname = T.ShortNames[name] or name\n\treturn T.UTF(name, 18, true)\nend\noUF.Tags.Events[\"NameplateNameShort\"] = \"UNIT_NAME_UPDATE\"\n\noUF.Tags.Methods[\"NameplateHealth\"] = function(unit)\n\tlocal hp = UnitHealth(unit)\n\tlocal maxhp = UnitHealthMax(unit)\n\tif maxhp == 0 then\n\t\treturn 0\n\telse\n\t\treturn (\"%s - %d%%\"):format(T.ShortValue(hp), hp / maxhp * 100 + 0.5)\n\tend\nend\noUF.Tags.Events[\"NameplateHealth\"] = \"UNIT_HEALTH UNIT_MAXHEALTH NAME_PLATE_UNIT_ADDED\"\n\noUF.Tags.Methods[\"Absorbs\"] = function(unit)\n    local absorb = UnitGetTotalAbsorbs(unit)\n    if absorb and absorb > 0 then\n        return T.ShortValue(absorb)\n    end\nend\noUF.Tags.Events[\"Absorbs\"] = \"UNIT_ABSORB_AMOUNT_CHANGED\""
  },
  {
    "path": "ShestakUI/ShestakUI.toc",
    "content": "## Interface: 100005\n## Title: ShestakUI\n## Notes: A total UI overhaul for World of Warcraft\n## Author: Shestak\n## Version: 9.20\n## OptionalDeps: Blizzard_CombatText, ShestakUI_Config, ShestakUI_Profile, AtlasLoot, cargBags, Clique, epgp, Grid, Grid2, ls_Toasts, Mapster, Omen, OPie, PitBull4, Postal, Prat-3.0, Quartz, Recount, Rematch, ShadowedUnitFrames, TidyPlates, TipTac, TipTacTalents, tullaCC, VuhDo, WeakAuras\n## SavedVariables: ShestakUISettings, ShestakUIStats, ShestakUIBindings, ShestakUICurrency, ShestakUIPositions\n## SavedVariablesPerCharacter: ShestakUISettingsPerChar, ShestakUIChatHistory, ShestakUIPositionsPerChar\n\n## X-Website: http://shestak.org\n## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Chiril, CrusaderHeimdall, Cybey, Dawn, Dencer, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, Wrug, Xuerian, Yleaf, Zork\n## X-Translation: Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius\n## X-Thanks: Akimba, Antthemage, Crunching, Dandruff, DesFolk, Elfrey, Ente, Erratic, Falchior, Gromcha, Halogen, Homicidal Retribution, ILF7, Illusion, Ipton, k07n, Kazarl, Lanseb, Leots, m2jest1c, MoLLIa, Nefrit, Noobolov, Obakol, Oz, PterOs, Sart, Scorpions, Sitatunga, Sw2rT1, Tryllemann, Wetxius, Yakodzuna, UI Users and Russian Community\n## X-oUF: oUFShestakUI\n## X-Curse-Project-ID: 27854\n## X-WoWI-ID: 19033\n\nShestakUI.xml"
  },
  {
    "path": "ShestakUI/ShestakUI.xml",
    "content": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\">\n\t<Script file=\"Core\\Init.lua\"/>\n\t<Script file=\"Core\\Constants.lua\"/>\n\n\t<Script file=\"Locales\\English.lua\"/>\n\t<Script file=\"Locales\\Chinese.lua\"/>\n\t<Script file=\"Locales\\French.lua\"/>\n\t<Script file=\"Locales\\German.lua\"/>\n\t<Script file=\"Locales\\Italian.lua\"/>\n\t<Script file=\"Locales\\Russian.lua\"/>\n\t<Script file=\"Locales\\Spanish.lua\"/>\n\t<Script file=\"Locales\\Taiwan.lua\"/>\n\n\t<Script file=\"Config\\Settings.lua\"/>\n\t<Script file=\"Config\\Positions.lua\"/>\n\t<Script file=\"Config\\Fonts.lua\"/>\n\t<Script file=\"Config\\Profiles.lua\"/>\n\n\t<Script file=\"Core\\GUI.lua\"/>\n\t<Script file=\"Core\\PixelPerfect.lua\"/>\n\n\t<Include file=\"Libs\\oUF\\oUF.xml\"/>\n\t<Include file=\"Libs\\oGlow\\oGlow.xml\"/>\n\t<Script file=\"Modules\\Blizzard\\LibShowUIPanel.lua\"/>\n\t<Script file=\"Libs\\LitePanels\\LitePanels.lua\"/>\n\t<Script file=\"Libs\\LitePanels\\Layout.lua\"/>\n\t<Script file=\"Config\\DataText.lua\"/>\n\t<Script file=\"Libs\\LiteStats\\LiteStats.lua\"/>\n\t<Script file=\"Modules\\UnitFrames\\Colors.lua\"/>\n\n\t<Script file=\"Config\\Filters\\Announcements.lua\"/>\n\t<Script file=\"Config\\Filters\\ArenaControl.lua\"/>\n\t<Script file=\"Config\\Filters\\AutoButton.lua\"/>\n\t<Script file=\"Config\\Filters\\BadBuffs.lua\"/>\n\t<Script file=\"Config\\Filters\\ChannelingTicks.lua\"/>\n\t<Script file=\"Config\\Filters\\ChatSpam.lua\"/>\n\t<Script file=\"Config\\Filters\\CombatText.lua\"/>\n\t<Script file=\"Config\\Filters\\Cooldowns.lua\"/>\n\t<Script file=\"Config\\Filters\\Diminishing.lua\"/>\n\t<Script file=\"Config\\Filters\\Errors.lua\"/>\n\t<Script file=\"Config\\Filters\\FilgerSpells.lua\"/>\n\t<Script file=\"Config\\Filters\\Nameplates.lua\"/>\n\t<Script file=\"Config\\Filters\\OpenItems.lua\"/>\n\t<Script file=\"Config\\Filters\\RaidAuraWatch.lua\"/>\n\t<Script file=\"Config\\Filters\\Reminders.lua\"/>\n\n\t<Script file=\"Core\\API.lua\"/>\n\t<Script file=\"Core\\Functions.lua\"/>\n\t<Script file=\"Core\\Launch.lua\"/>\n\t<Script file=\"Core\\Disable.lua\"/>\n\t<Script file=\"Core\\Commands.lua\"/>\n\t<Script file=\"Core\\WTF.lua\"/>\n\t<Script file=\"Core\\Kill.lua\"/>\n\t<Script file=\"Core\\Temp.lua\"/>\n\t<Script file=\"Core\\CheckVersion.lua\"/>\n\t<Script file=\"Core\\Panels.lua\"/>\n\n\t<Script file=\"Modules\\UnitFrames\\Functions.lua\"/>\n\t<Script file=\"Modules\\UnitFrames\\Tags.lua\"/>\n\t<Script file=\"Modules\\UnitFrames\\Layout.lua\"/>\n\t<Script file=\"Modules\\UnitFrames\\RaidDPS.lua\"/>\n\t<Script file=\"Modules\\UnitFrames\\RaidHeal.lua\"/>\n\t<Script file=\"Modules\\UnitFrames\\Nameplates.lua\"/>\n\n\t<Script file=\"Modules\\Misc\\BattlefieldScore.lua\"/>\n\t<Script file=\"Modules\\Misc\\CharsCurrency.lua\"/>\n\t<Script file=\"Modules\\Misc\\ClickCast.lua\"/>\n\t<Script file=\"Modules\\Misc\\LFGQueueTimer.lua\"/>\n\t<Script file=\"Modules\\Misc\\MagePortals.lua\"/>\n\t<Script file=\"Modules\\Misc\\Marking.lua\"/>\n\t<Script file=\"Modules\\Misc\\Misc.lua\"/>\n\t<Script file=\"Modules\\Misc\\Mounts.lua\"/>\n\t<Script file=\"Modules\\Misc\\PvPQueueTimer.lua\"/>\n\t<Script file=\"Modules\\Misc\\RaidUtility.lua\"/>\n\t<Script file=\"Modules\\Misc\\SlotItemLevel.lua\"/>\n\t<Script file=\"Modules\\Misc\\Threat.lua\"/>\n\n\t<Script file=\"Modules\\Trade\\AlreadyKnown.lua\"/>\n\t<Script file=\"Modules\\Trade\\Archaeology.lua\"/>\n\t<Script file=\"Modules\\Trade\\Merchant.lua\"/>\n\t<Script file=\"Modules\\Trade\\OneClickDisenchanting.lua\"/>\n\t<Script file=\"Modules\\Trade\\OneClickEnchantScroll.lua\"/>\n\t<Script file=\"Modules\\Trade\\ProfessionTabs.lua\"/>\n\t<Script file=\"Modules\\Trade\\SumAucBuyouts.lua\"/>\n\t<Script file=\"Modules\\Trade\\TrainAll.lua\"/>\n\n\t<Script file=\"Modules\\ActionBars\\Core.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bindings.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bar1.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bar2.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bar3.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bar4.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bar5.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bar6.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bar7.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Bar8.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\BarPet.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\BarStance.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Toggle.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Style.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Range.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\VehicleExit.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\Cooldowns.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\ExtraBar.lua\"/>\n\t<Script file=\"Modules\\ActionBars\\MicroMenu.lua\"/>\n\n\t<Script file=\"Modules\\Announcements\\BadGear.lua\"/>\n\t<Script file=\"Modules\\Announcements\\Drinking.lua\"/>\n\t<Script file=\"Modules\\Announcements\\FeastsAndPortals.lua\"/>\n\t<Script file=\"Modules\\Announcements\\FlaskAndFood.lua\"/>\n\t<Script file=\"Modules\\Announcements\\Interrupts.lua\"/>\n\t<Script file=\"Modules\\Announcements\\PullCountdown.lua\"/>\n\t<Script file=\"Modules\\Announcements\\SafariHat.lua\"/>\n\t<Script file=\"Modules\\Announcements\\Spells.lua\"/>\n\n\t<Script file=\"Modules\\Auras\\AuraSource.lua\"/>\n\t<Script file=\"Modules\\Auras\\BuffFrame.lua\"/>\n\t<Script file=\"Modules\\Auras\\Filger.lua\"/>\n\t<Script file=\"Modules\\Auras\\SelfBuffsReminder.lua\"/>\n\t<Script file=\"Modules\\Auras\\RaidBuffsReminder.lua\"/>\n\n\t<Script file=\"Modules\\Automation\\AutoInvite.lua\"/>\n\t<Script file=\"Modules\\Automation\\AutoOpens.lua\"/>\n\t<Script file=\"Modules\\Automation\\AutoRelease.lua\"/>\n\t<Script file=\"Modules\\Automation\\BuffOnScroll.lua\"/>\n\t<Script file=\"Modules\\Automation\\CancelBadBuffs.lua\"/>\n\t<Script file=\"Modules\\Automation\\DeclineDuel.lua\"/>\n\t<Script file=\"Modules\\Automation\\LoggingCombat.lua\"/>\n\t<Script file=\"Modules\\Automation\\Resurrection.lua\"/>\n\t<Script file=\"Modules\\Automation\\Screenshots.lua\"/>\n\t<Script file=\"Modules\\Automation\\SetRole.lua\"/>\n\t<Script file=\"Modules\\Automation\\SkipCinematic.lua\"/>\n\t<Script file=\"Modules\\Automation\\SolveArtifact.lua\"/>\n\t<Script file=\"Modules\\Automation\\Summon.lua\"/>\n\t<Script file=\"Modules\\Automation\\TabBinder.lua\"/>\n\n\t<Include file=\"Modules\\Blizzard\\TaintLess.xml\"/>\n\t<Script file=\"Modules\\Blizzard\\AlertFrames.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\AltPowerBar.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\Bags.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\ClassColorNames.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\ColorPicker.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\CombatText.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\Durability.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\Errors.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\Fixes.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\Fonts.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\Mail.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\MirrorBars.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\MoveBlizzFrames.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\PetBattle.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\TalkingHead.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\TimerTracker.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\UIWidget.lua\"/>\n\t<Script file=\"Modules\\Blizzard\\Vehicle.lua\"/>\n\n\t<Script file=\"Modules\\Chat\\ChatFrames.lua\"/>\n\t<Script file=\"Modules\\Chat\\ChatTabs.lua\"/>\n\t<Script file=\"Modules\\Chat\\CopyUrl.lua\"/>\n\t<Script file=\"Modules\\Chat\\CopyChat.lua\"/>\n\t<Script file=\"Modules\\Chat\\ChatBars.lua\"/>\n\t<Script file=\"Modules\\Chat\\Filters.lua\"/>\n\t<Script file=\"Modules\\Chat\\History.lua\"/>\n\t<Script file=\"Modules\\Chat\\Invite.lua\"/>\n\t<Script file=\"Modules\\Chat\\MouseScroll.lua\"/>\n\t<Script file=\"Modules\\Chat\\Sounds.lua\"/>\n\t<Script file=\"Modules\\Chat\\TellTarget.lua\"/>\n\t<Script file=\"Modules\\Chat\\RealLinks.lua\"/>\n\t<Script file=\"Modules\\Chat\\SpamageMeters.lua\"/>\n\t<Script file=\"Modules\\Chat\\ChatBind.lua\"/>\n\t<Script file=\"Modules\\Chat\\FadeCombat.lua\"/>\n\n\t<Script file=\"Modules\\Cooldowns\\DiminishingCD.lua\"/>\n\t<Script file=\"Modules\\Cooldowns\\EnemyCD.lua\"/>\n\t<Script file=\"Modules\\Cooldowns\\PulseCD.lua\"/>\n\t<Script file=\"Modules\\Cooldowns\\RaidCD.lua\"/>\n\n\t<Script file=\"Modules\\Loot\\AutoConfirm.lua\"/>\n\t<Script file=\"Modules\\Loot\\AutoGreed.lua\"/>\n\t<Script file=\"Modules\\Loot\\FasterLoot.lua\"/>\n\t<Script file=\"Modules\\Loot\\GroupLoot.lua\"/>\n\t<Script file=\"Modules\\Loot\\Loot.lua\"/>\n\t<Script file=\"Modules\\Loot\\MasterLoot.lua\"/>\n\n\t<Script file=\"Modules\\Maps\\BattlefieldMap.lua\"/>\n\t<Script file=\"Modules\\Maps\\ButtonCollect.lua\"/>\n\t<Script file=\"Modules\\Maps\\FogOfWar.lua\"/>\n\t<Script file=\"Modules\\Maps\\MiniMap.lua\"/>\n\t<Script file=\"Modules\\Maps\\MiniMapButtons.lua\"/>\n\t<Script file=\"Modules\\Maps\\ToggleMenu.lua\"/>\n\t<Script file=\"Modules\\Maps\\WorldMap.lua\"/>\n\n\t<Script file=\"Modules\\Quests\\AutoAccept.lua\"/>\n\t<Script file=\"Modules\\Quests\\AutoButton.lua\"/>\n\t<Script file=\"Modules\\Quests\\ObjectiveTracker.lua\"/>\n\t<Script file=\"Modules\\Quests\\WowheadLink.lua\"/>\n\n\t<Include file=\"Modules\\Skins\\Blizzard\\LoadFrames.xml\"/>\n\t<Script file=\"Modules\\Skins\\Ace3.lua\"/>\n\t<Script file=\"Modules\\Skins\\AtlasLoot.lua\"/>\n\t<Script file=\"Modules\\Skins\\Aurora.lua\"/>\n\t<Script file=\"Modules\\Skins\\BigWigs.lua\"/>\n\t<Script file=\"Modules\\Skins\\BloodShieldTracker.lua\"/>\n\t<Script file=\"Modules\\Skins\\Capping.lua\"/>\n\t<Script file=\"Modules\\Skins\\Clique.lua\"/>\n\t<Script file=\"Modules\\Skins\\CoolLine.lua\"/>\n\t<Script file=\"Modules\\Skins\\DBM.lua\"/>\n\t<Script file=\"Modules\\Skins\\Details.lua\"/>\n\t<Script file=\"Modules\\Skins\\Dominos.lua\"/>\n\t<Script file=\"Modules\\Skins\\FlyoutButtonCustom.lua\"/>\n\t<Script file=\"Modules\\Skins\\MageNuggets.lua\"/>\n\t<Script file=\"Modules\\Skins\\MyRolePlay.lua\"/>\n\t<Script file=\"Modules\\Skins\\NPCScan.lua\"/>\n\t<Script file=\"Modules\\Skins\\NugRunning.lua\"/>\n\t<Script file=\"Modules\\Skins\\Omen.lua\"/>\n\t<Script file=\"Modules\\Skins\\Ovale.lua\"/>\n\t<Script file=\"Modules\\Skins\\Recount.lua\"/>\n\t<Script file=\"Modules\\Skins\\Skada.lua\"/>\n\t<Script file=\"Modules\\Skins\\TinyDPS.lua\"/>\n\t<Script file=\"Modules\\Skins\\VanasKoS.lua\"/>\n\t<Script file=\"Modules\\Skins\\WeakAuras.lua\"/>\n\t<Script file=\"Modules\\Skins\\oPie.lua\"/>\n\t<Script file=\"Modules\\Skins\\Rematch.lua\"/>\n\t<Script file=\"Modules\\Skins\\Postal.lua\"/>\n\t<Script file=\"Modules\\Skins\\lsToasts.lua\"/>\n\n\t<Script file=\"Modules\\Tooltip\\Tooltip.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\HyperLink.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\Achievement.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\Talents.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\ItemIcons.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\ItemLevel.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\MountSource.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\MultiItemRef.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\RuFix.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\SpellID.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\ItemCount.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\UnitRole.lua\"/>\n\t<Script file=\"Modules\\Tooltip\\InstanceLockCompare.lua\"/>\n\n\t<Script file=\"Core\\Movers.lua\"/>\n</Ui>\n"
  },
  {
    "path": "ShestakUI_Config/Core.lua",
    "content": "local T, C\nlocal _, ns = ...\nlocal L = ns\n\n----------------------------------------------------------------------------------------\n--\tGUI for ShestakUI(by Haleth, Solor)\n----------------------------------------------------------------------------------------\nlocal realm = GetRealmName()\nlocal name = UnitName(\"player\")\n\n-- [[ Variables ]]\n\nns.buttons = {}\nns.NextPrevButtons = {}\n\nlocal checkboxes = {}\nlocal sliders = {}\nlocal editboxes = {}\nlocal dropdowns = {}\nlocal colourpickers = {}\nlocal panels = {}\n\n-- cache old values to check whether UI needs to be reloaded\nlocal old = {}\nlocal oldColours = {}\n\nlocal userChangedSlider = true -- to use SetValue without triggering OnValueChanged\nlocal baseName = \"ShestakUIOptionsPanel\"\n\n-- [[ Functions ]]\n\n-- when an option needs a reload\nlocal function setReloadNeeded(isNeeded)\n\tShestakUIOptionsPanel.reloadText:SetShown(isNeeded)\n\tns.needReload = isNeeded -- for the popup when clicking okay\n\tif isNeeded then\n\t\tShestakUIOptionsPanelOkayButton:Enable()\n\telse\n\t\tShestakUIOptionsPanelOkayButton:Disable()\n\tend\nend\nns.setReloadNeeded = setReloadNeeded\n\n-- check if a reload is needed\nlocal function checkIsReloadNeeded()\n\tfor frame, value in pairs(old) do\n\t\tif C[frame.group][frame.option] ~= value then\n\t\t\tsetReloadNeeded(true)\n\t\t\treturn\n\t\tend\n\tend\n\n\tfor colourOption, oldTable in pairs(oldColours) do\n\t\tlocal savedTable = C[colourOption.group][colourOption.option]\n\t\tif savedTable[1] ~= oldTable[1] or savedTable[2] ~= oldTable[2] or savedTable[3] ~= oldTable[3] then\n\t\t\tsetReloadNeeded(true)\n\t\t\treturn\n\t\tend\n\tend\n\n\t-- if the tables were empty, or all of the old values match their current ones\n\tsetReloadNeeded(false)\nend\n\n-- Called by every widget to save a value\nlocal function SaveValue(f, value)\n\tif not C.options[f.group] then C.options[f.group] = {} end\n\tif not C.options[f.group][f.option] then C.options[f.group][f.option] = {} end\n\n\tC.options[f.group][f.option] = value -- these are the saved variables\n\tC[f.group][f.option] = value -- and this is from the lua options\nend\n\n-- [[ Widgets ]]\n\n-- Check boxes\n\nlocal function toggleChildren(self, checked)\n\tlocal tR, tG, tB\n\tif checked then\n\t\ttR, tG, tB = 1, 1, 1\n\telse\n\t\ttR, tG, tB = .3, .3, .3\n\tend\n\n\tfor _, child in next, self.children do\n\t\tchild:SetEnabled(checked)\n\t\tchild.Text:SetTextColor(tR, tG, tB)\n\tend\nend\n\nlocal function toggle(self)\n\tlocal checked = self:GetChecked()\n\n\tif checked then\n\t\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)\n\telse\n\t\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF)\n\tend\n\n\tSaveValue(self, checked)\n\tif self.children then toggleChildren(self, checked) end\n\n\tif self.needsReload then\n\t\tif old[self] == nil then\n\t\t\told[self] = not checked\n\t\tend\n\n\t\tcheckIsReloadNeeded()\n\tend\nend\n\nns.CreateCheckBox = function(parent, option, text, textDesc)\n\tlocal f = CreateFrame(\"CheckButton\", nil, parent)\n\n\tf:SetSize(26, 26)\n\n\tf.Text = f:CreateFontString(nil, \"OVERLAY\", \"GameFontHighlight\")\n\tf.Text:SetJustifyH(\"LEFT\")\n\tf.Text:SetTextColor(1, 1, 1)\n\tf.Text:SetPoint(\"LEFT\", f, \"RIGHT\", 3, 0)\n\n\tf.group = parent.tag\n\tf.option = option\n\n\tif text then\n\t\tf.Text:SetText(text)\n\telse\n\t\tf.Text:SetText(ns[parent.tag..\"_\"..option])\n\tend\n\n\tf.Text:SetWidth(540)\n\n\tf.tooltipText = ns[parent.tag..\"_\"..option..\"_desc\"] or textDesc or ns[parent.tag..\"_\"..option] or text\n\n\tf:SetScript(\"OnEnter\", function()\n\t\tGameTooltip:SetOwner(f, \"ANCHOR_RIGHT\", 0, 0)\n\t\tGameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)\n\tend)\n\n\tf:SetScript(\"OnLeave\", function()\n\t\tGameTooltip:Hide()\n\tend)\n\n\tf.needsReload = true\n\n\tf:SetScript(\"OnClick\", toggle)\n\tparent[option] = f\n\n\ttinsert(checkboxes, f)\n\n\treturn f\nend\n\n-- Sliders\n\nlocal function onValueChanged(self, value)\n\tif self.step < 1 then\n\t\tif self.option == \"uiscale\" then\n\t\t\tvalue = tonumber(string.format(\"%.3f\", value))\n\t\telse\n\t\t\tvalue = tonumber(string.format(\"%.2f\", value))\n\t\tend\n\telse\n\t\tvalue = floor(value + 0.5)\n\tend\n\n\tif self.textInput then\n\t\tself.textInput:SetText(value)\n\tend\n\n\tif userChangedSlider then\n\t\tSaveValue(self, value)\n\n\t\tif self.needsReload then\n\t\t\tif self.step < 1 then\n\t\t\t\tself.oldValue = tonumber(string.format(\"%.2f\", self.oldValue))\n\t\t\tend\n\t\t\told[self] = self.oldValue\n\t\t\tcheckIsReloadNeeded()\n\t\tend\n\tend\nend\n\nlocal function onMouseWheel(self, delta)\n\tif not IsControlKeyDown() and not IsShiftKeyDown() then\n\t\tlocal script = self.parent:GetScript(\"OnMouseWheel\")\n\t\tif script then\n\t\t\tscript(self.parent, delta)\n\t\tend\n\t\treturn\n\tend\n\n\tvalue = self.textInput:GetText()\n\n\tlocal step = self.step\n\tif IsControlKeyDown() then\n\t\tstep = self.step * 5\n\telseif IsShiftKeyDown() then\n\t\tstep = self.step\n\tend\n\n\tif delta < 0 then\n\t\tvalue = value + step\n\telse\n\t\tvalue = value - step\n\tend\n\n\tif self.step < 1 then\n\t\tif self.option == \"uiscale\" then\n\t\t\tvalue = tonumber(string.format(\"%.3f\", value))\n\t\telse\n\t\t\tvalue = tonumber(string.format(\"%.2f\", value))\n\t\tend\n\telse\n\t\tvalue = floor(value + 0.5)\n\tend\n\n\tif value < self.min then\n\t\tvalue = self.min\n\telseif value > self.max then\n\t\tvalue = self.max\n\tend\n\n\tif self.textInput then\n\t\tself.textInput:SetText(value)\n\tend\n\n\tself:SetValue(value)\n\n\tif userChangedSlider then\n\t\tSaveValue(self, value)\n\n\t\tif self.needsReload then\n\t\t\tif self.step < 1 then\n\t\t\t\tself.oldValue = tonumber(string.format(\"%.2f\", self.oldValue))\n\t\t\tend\n\t\t\told[self] = self.oldValue\n\t\t\tcheckIsReloadNeeded()\n\t\tend\n\tend\nend\n\nlocal function createSlider(parent, option, lowText, highText, low, high, step, needsReload, text, textDesc)\n\tlocal sliderName = parent:GetName()..option\n\tlocal f = CreateFrame(\"Slider\", sliderName, parent, \"OptionsSliderTemplate\")\n\n\tf.group = parent.tag\n\tf.option = option\n\n\t_G[sliderName..\"Text\"]:SetFontObject(GameFontHighlightSmall)\n\t_G[sliderName..\"Text\"]:SetSize(150, 20)\n\n\tif text then\n\t\t_G[sliderName..\"Text\"]:SetText(text)\n\telse\n\t\t_G[sliderName..\"Text\"]:SetText(ns[parent.tag..\"_\"..option])\n\tend\n\n\t_G[sliderName..\"Low\"]:SetText(lowText)\n\t_G[sliderName..\"High\"]:SetText(highText)\n\n\tf:SetMinMaxValues(low, high)\n\tf:SetObeyStepOnDrag(true)\n\tf:SetValueStep(step)\n\tf:SetWidth(150)\n\n\tf.tooltipText = ns[parent.tag..\"_\"..option..\"_desc\"] or textDesc or ns[parent.tag..\"_\"..option] or text\n\n\tf:SetScript(\"OnEnter\", function()\n\t\tGameTooltip:SetOwner(f, \"ANCHOR_RIGHT\", 0, 0)\n\t\tGameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)\n\tend)\n\n\tf:SetScript(\"OnLeave\", function()\n\t\tGameTooltip:Hide()\n\tend)\n\n\tf.needsReload = needsReload\n\tf.step = step\n\tf.min = low\n\tf.max = high\n\tf.parent = parent\n\n\tf:SetScript(\"OnValueChanged\", onValueChanged)\n\tf:SetScript(\"OnMouseWheel\", onMouseWheel)\n\tparent[option] = f\n\n\ttinsert(sliders, f)\n\n\treturn f\nend\n\nlocal function onSliderEscapePressed(self)\n\tself:ClearFocus()\nend\n\nlocal function onSliderEnterPressed(self)\n\tlocal slider = self:GetParent()\n\tlocal min, max = slider:GetMinMaxValues()\n\n\tlocal value = tonumber(self:GetText())\n\tif value and value >= floor(min) and value <= floor(max) then\n\t\tif slider.option == \"uiscale\" then\n\t\t\tslider:SetValueStep(0.001)\n\t\tend\n\t\tslider:SetValue(value)\n\telse\n\t\tself:SetText(floor(slider:GetValue()*1000)/1000)\n\tend\n\n\tself:ClearFocus()\nend\n\nns.CreateNumberSlider = function(parent, option, lowText, highText, low, high, step, needsReload, text, textDesc)\n\tlocal slider = createSlider(parent, option, lowText, highText, low, high, step, needsReload, text, textDesc)\n\n\tlocal f = CreateFrame(\"EditBox\", parent:GetName()..option..\"TextInput\", slider, \"InputBoxTemplate\")\n\tf:SetAutoFocus(false)\n\tf:SetWidth(50)\n\tf:SetHeight(18)\n\tf:SetMaxLetters(8)\n\tf:SetFontObject(GameFontHighlight)\n\n\tf:SetPoint(\"LEFT\", slider, \"RIGHT\", 10, 0)\n\n\tf:SetScript(\"OnEscapePressed\", onSliderEscapePressed)\n\tf:SetScript(\"OnEnterPressed\", onSliderEnterPressed)\n\tf:SetScript(\"OnEditFocusGained\", nil)\n\tf:SetScript(\"OnEditFocusLost\", onSliderEnterPressed)\n\n\tslider.textInput = f\n\n\treturn slider\nend\n\n-- EditBox\n\nlocal function onEnterPressed(self)\n\tlocal value = self.valueNumber and tonumber(self:GetText()) or tostring(self:GetText())\n\tSaveValue(self, value)\n\tself:ClearFocus()\n\told[self] = self.oldValue\n\tcheckIsReloadNeeded()\nend\n\nns.CreateEditBox = function(parent, option, needsReload, text, number)\n\tlocal f = CreateFrame(\"EditBox\", parent:GetName()..option..\"TextInput\", parent, \"InputBoxTemplate\")\n\tf:SetAutoFocus(false)\n\tf:SetWidth(60)\n\tf:SetHeight(18)\n\tf:SetMaxLetters(8)\n\tf:SetFontObject(GameFontHighlight)\n\n\tf:SetPoint(\"LEFT\", 40, 0)\n\n\tf.value = \"\"\n\tf.valueNumber = number and true or false\n\n\tf:SetScript(\"OnEscapePressed\", function(self) self:ClearFocus() self:SetText(f.value) end)\n\tf:SetScript(\"OnEnterPressed\", onEnterPressed)\n\tf:SetScript(\"OnEditFocusGained\", function() f.value = f:GetText() end)\n\tf:SetScript(\"OnEditFocusLost\", onEnterPressed)\n\n\tlocal label = f:CreateFontString(nil, \"OVERLAY\", \"GameFontHighlight\")\n\tlabel:SetWidth(440)\n\tlabel:SetHeight(20)\n\tlabel:SetJustifyH(\"LEFT\")\n\tlabel:SetPoint(\"LEFT\", f, \"RIGHT\", 10, 0)\n\n\tif text then\n\t\tlabel:SetText(text)\n\telse\n\t\tlabel:SetText(ns[parent.tag..\"_\"..option])\n\tend\n\n\tf.label = label\n\tf.tooltipText = ns[parent.tag..\"_\"..option..\"_desc\"] or text\n\n\tf:SetScript(\"OnEnter\", function()\n\t\tGameTooltip:SetOwner(f, \"ANCHOR_RIGHT\", 5, 5)\n\t\tGameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)\n\tend)\n\n\tf:SetScript(\"OnLeave\", function()\n\t\tGameTooltip:Hide()\n\tend)\n\n\tf.group = parent.tag\n\tf.option = option\n\n\tf.needsReload = needsReload\n\tparent[option] = f\n\n\ttinsert(editboxes, f)\n\n\treturn f\nend\n\n-- Colour pickers\n\n-- we update this in onColourSwatchClicked, need it for setColour / resetColour\n-- because it can't be passed as parameter\nlocal currentColourOption\n\nlocal function round(x)\n\treturn floor((x * 100) + .5) / 100\nend\n\nlocal function setColour()\n\tlocal newR, newG, newB = ColorPickerFrame:GetColorRGB()\n\tnewR, newG, newB = round(newR), round(newG), round(newB)\n\n\tcurrentColourOption:SetBackdropBorderColor(newR, newG, newB)\n\tcurrentColourOption:SetBackdropColor(newR, newG, newB, 0.3)\n\tSaveValue(currentColourOption, {newR, newG, newB})\n\n\tcheckIsReloadNeeded()\nend\n\nlocal function resetColour(previousValues)\n\tlocal oldR, oldG, oldB = unpack(previousValues)\n\n\tcurrentColourOption:SetBackdropBorderColor(oldR, oldG, oldB)\n\tcurrentColourOption:SetBackdropColor(oldR, oldG, oldB, 0.3)\n\tSaveValue(currentColourOption, {oldR, oldG, oldB})\n\n\tcheckIsReloadNeeded()\nend\n\nlocal function onColourSwatchClicked(self, button)\n\tif button == \"RightButton\" then\n\t\tC.options[self.group][self.option] = nil\n\t\tsetReloadNeeded(true)\n\t\treturn\n\tend\n\n\tlocal colourTable = C[self.group][self.option]\n\tlocal r, g, b = unpack(colourTable)\n\tr, g, b = round(r), round(g), round(b)\n\tlocal originalR, originalG, originalB = r, g, b\n\n\tcurrentColourOption = self\n\n\tif self.needsReload and oldColours[self] == nil then\n\t\toldColours[self] = {r, g, b}\n\tend\n\n\tColorPickerFrame:SetColorRGB(r, g, b)\n\tColorPickerFrame.previousValues = {originalR, originalG, originalB}\n\tColorPickerFrame.func = setColour\n\tColorPickerFrame.cancelFunc = resetColour\n\tColorPickerFrame:Hide()\n\tColorPickerFrame:Show()\nend\n\nns.CreateColourPicker = function(parent, option, needsReload, text)\n\tlocal f = CreateFrame(\"Button\", nil, parent)\n\tf:SetSize(40, 20)\n\n\tlocal colortext = f:CreateFontString(nil, \"OVERLAY\", \"GameFontHighlight\")\n\tcolortext:SetText(COLOR)\n\tcolortext:SetPoint(\"CENTER\")\n\tcolortext:SetJustifyH(\"CENTER\")\n\tf:SetWidth(colortext:GetWidth() + 5)\n\n\tlocal label = f:CreateFontString(nil, \"OVERLAY\", \"GameFontHighlight\")\n\tif text then\n\t\tlabel:SetText(text)\n\telse\n\t\tlabel:SetText(ns[parent.tag..\"_\"..option])\n\tend\n\tlabel:SetWidth(440)\n\tlabel:SetHeight(20)\n\tlabel:SetJustifyH(\"LEFT\")\n\tlabel:SetPoint(\"LEFT\", 50, 0)\n\n\tf.group = parent.tag\n\tf.option = option\n\n\tf.needsReload = needsReload\n\n\tf:SetScript(\"OnMouseUp\", onColourSwatchClicked)\n\tparent[option] = f\n\n\ttinsert(colourpickers, f)\n\n\treturn f\nend\n\n-- DropDown\nlocal DropDownText = {\n\t[\"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Textures\\\\Texture.tga\"] = \"Normal texture\",\n\t[\"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Fonts\\\\Normal.ttf\"] = \"Normal font\",\n\t[\"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Fonts\\\\Pixel.ttf\"] = \"Pixel Font\",\n\t[STANDARD_TEXT_FONT] = \"Blizzard font\",\n\t[\"BLACKLIST\"] = L.general_error_blacklist,\n\t[\"WHITELIST\"] = L.general_error_whitelist,\n\t[\"COMBAT\"] = L.general_error_combat,\n\t[\"NONE\"] = L.general_error_none,\n\t[\"RAID\"] = L.automation_auto_collapse_raid,\n\t[\"RELOAD\"] = L.automation_auto_collapse_reload,\n\t[\"SCENARIO\"] = L.automation_auto_collapse_scenario,\n\t[\"DYNAMIC\"] = L.raidframe_auto_position_dynamic,\n\t[\"STATIC\"] = L.raidframe_auto_position_static,\n\t[\"HEAL\"] = L.raidframe_heal_layout,\n\t[\"DPS\"] = L.raidframe_dps_layout,\n\t[\"AUTO\"] = L.raidframe_auto_layout,\n\t[\"BLIZZARD\"] = \"Blizzard\",\n\t[\"ICONS\"] = L.unitframe_portrait_type_icons,\n\t[\"OVERLAY\"] = L.unitframe_portrait_type_overlay,\n}\n\nns.CreateDropDown = function(parent, option, needsReload, text, tableValue, LSM, isFont)\n\tlocal f = CreateFrame(\"Frame\", parent:GetName()..option..\"DropDown\", parent, \"UIDropDownMenuTemplate\")\n\tUIDropDownMenu_SetWidth(f, 110)\n\n\tUIDropDownMenu_Initialize(f, function(self)\n\t\tlocal info = UIDropDownMenu_CreateInfo()\n\t\tinfo.func = self.SetValue\n\t\tfor key, value in pairs(tableValue) do\n\t\t\tinfo.text = LSM and (DropDownText[value] or key) or DropDownText[value] or value\n\t\t\tinfo.arg1 = value\n\t\t\tinfo.arg2 = key\n\t\t\tinfo.checked = value == f.selectedValue\n\n\t\t\tif isFont then\n\t\t\t\tlocal fObject = CreateFont(info.text)\n\t\t\t\tfObject:SetFont(value, 12, \"\")\n\t\t\t\tinfo.fontObject = fObject\n\t\t\tend\n\n\t\t\tUIDropDownMenu_AddButton(info)\n\t\tend\n\tend)\n\n\tfunction f:SetValue(newValue, newkey)\n\t\tf.selectedValue = newValue\n\t\tlocal text = LSM and (DropDownText[newValue] or newkey) or DropDownText[newValue] or newValue\n\t\tUIDropDownMenu_SetText(f, text)\n\t\tSaveValue(f, newValue)\n\t\told[f] = f.oldValue\n\t\tcheckIsReloadNeeded()\n\t\tCloseDropDownMenus()\n\tend\n\n\tlocal label = f:CreateFontString(nil, \"OVERLAY\", \"GameFontHighlight\")\n\tif text then\n\t\tlabel:SetText(text)\n\telse\n\t\tlabel:SetText(ns[parent.tag..\"_\"..option])\n\tend\n\t-- label:SetWidth(440)\n\tlabel:SetHeight(20)\n\tlabel:SetJustifyH(\"LEFT\")\n\tlabel:SetPoint(\"LEFT\", 160, 4)\n\tf.label = label\n\n\tf.tooltipText = ns[parent.tag..\"_\"..option..\"_desc\"]\n\tif f.tooltipText then\n\t\tf:SetScript(\"OnEnter\", function()\n\t\t\tGameTooltip:SetOwner(f, \"ANCHOR_RIGHT\", 0, 0)\n\t\t\tGameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)\n\t\tend)\n\n\t\tf:SetScript(\"OnLeave\", function()\n\t\t\tGameTooltip:Hide()\n\t\tend)\n\tend\n\n\tf.group = parent.tag\n\tf.option = option\n\n\tf.needsReload = needsReload\n\n\tparent[option] = f\n\n\ttinsert(dropdowns, f)\n\n\treturn f\nend\n\n-- [[ Categories and tabs ]]\n\nlocal offset = 50\nlocal activeTab = nil\n\nlocal function setActiveTab(tab)\n\tactiveTab = tab\n\n\tactiveTab.panel.tab.Text:SetTextColor(1, 1, 1)\n\n\tactiveTab.panel:Show()\n\n\tif activeTab.panel_2 then\n\t\tactiveTab.panel.PrevPageButton:Show()\n\t\tactiveTab.panel.PrevPageButton:Disable()\n\t\tactiveTab.panel.NextPageButton:Enable()\n\t\tactiveTab.panel.pageText:SetFormattedText(COLLECTION_PAGE_NUMBER, 1, activeTab.panel.maxPages)\n\t\tactiveTab.panel.currentPage = 1\n\t\tactiveTab.panel_2:Hide()\n\tend\n\n\tC.category = tab.panel.tag\nend\n\nlocal onTabClick = function(tab)\n\tactiveTab.panel:Hide()\n\n\tactiveTab.panel.tab.Text:SetTextColor(1, 0.82, 0)\n\n\tif activeTab.panel_2 then\n\t\tactiveTab.panel.PrevPageButton:Hide()\n\t\tactiveTab.panel_2:Hide()\n\tend\n\n\tif activeTab.panel_3 then\n\t\tactiveTab.panel_3:Hide()\n\tend\n\n\tif activeTab.panel_4 then\n\t\tactiveTab.panel_4:Hide()\n\tend\n\n\tsetActiveTab(tab)\n\n\tns.HideSpellList()\nend\n\nlocal function CreateOptionPanel(name, text, subText)\n\tlocal panel = CreateFrame(\"Frame\", name, ShestakUIOptionsPanel)\n\tpanel:SetSize(600, 670)\n\tpanel:SetPoint(\"RIGHT\", 0, 10)\n\tpanel:EnableMouseWheel(true)\n\tpanel:Hide()\n\n\tpanel.Title = panel:CreateFontString(nil, \"ARTWORK\", \"GameFontNormalLarge\")\n\tpanel.Title:SetPoint(\"TOPLEFT\", 8, -16)\n\tpanel.Title:SetText(text)\n\n\tpanel.subText = panel:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlightSmall\")\n\tpanel.subText:SetPoint(\"TOPLEFT\", panel.Title, \"BOTTOMLEFT\", 0, -8)\n\tpanel.subText:SetJustifyH(\"LEFT\")\n\tpanel.subText:SetJustifyV(\"TOP\")\n\tpanel.subText:SetSize(570, 30)\n\tpanel.subText:SetText(subText)\n\n\treturn panel\nend\n\nns.addCategory = function(name, text, subText, num)\n\tlocal tab = CreateFrame(\"Button\", nil, ShestakUIOptionsPanel)\n\ttab:SetPoint(\"TOPLEFT\", 11, -offset)\n\ttab:SetSize(168, 22)\n\n\ttab.Text = tab:CreateFontString(nil, \"ARTWORK\", \"GameFontNormal\")\n\ttab.Text:SetPoint(\"LEFT\", tab, 8, 0)\n\ttab.Text:SetText(text)\n\ttab.Text:SetSize(160, 20)\n\ttab.Text:SetJustifyH(\"LEFT\")\n\n\ttab:SetScript(\"OnMouseUp\", onTabClick)\n\toffset = (offset + 24)\n\n\tlocal tag = strlower(name)\n\tlocal panel = CreateOptionPanel(baseName..name, text, subText)\n\tpanel[1] = panel\n\ttinsert(panels, panel)\n\n\ttab.panel = panel\n\tpanel.tab = tab\n\tpanel.tag = tag\n\tShestakUIOptionsPanel[tag] = panel\n\n\tlocal numPages = num or 1\n\tif numPages > 1 then\n\t\tlocal name2 = name..\"2\"\n\t\tlocal tag2 = strlower(name2)\n\t\tlocal panel_2 = CreateOptionPanel(baseName..name2, text, subText)\n\t\tpanel[2] = panel_2\n\t\ttinsert(panels, panel_2)\n\n\t\tif name == \"general\" then\n\t\t\tpanel_2.tag = \"media\"\n\t\telse\n\t\t\tpanel_2.tag = tag\n\t\tend\n\n\t\tShestakUIOptionsPanel[tag2] = panel_2\n\t\ttab.panel_2 = panel_2\n\n\t\tlocal PrevPageButton = CreateFrame(\"Button\", baseName..name..\"PrevButton\", ShestakUIOptionsPanel)\n\t\tPrevPageButton:SetPoint(\"TOPRIGHT\", -45, -44)\n\t\tPrevPageButton:SetSize(28, 28)\n\t\tPrevPageButton:SetHighlightTexture(\"Interface\\Buttons\\UI-Common-MouseHilight\")\n\t\tPrevPageButton:Hide()\n\t\tPrevPageButton:Disable()\n\n\t\tlocal pageText = PrevPageButton:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\n\t\tpageText:SetPoint(\"RIGHT\", PrevPageButton, \"LEFT\", -5, 0)\n\t\tpanel.pageText = pageText\n\n\t\tlocal NextPageButton = CreateFrame(\"Button\", baseName..name..\"NextButton\", PrevPageButton)\n\t\tNextPageButton:SetPoint(\"LEFT\", PrevPageButton, \"RIGHT\", 5, 0)\n\t\tNextPageButton:SetSize(28, 28)\n\t\tNextPageButton:SetHighlightTexture(\"Interface\\Buttons\\UI-Common-MouseHilight\")\n\n\t\tpanel.currentPage = 1\n\t\tpanel.maxPages = numPages\n\t\tlocal function SetPage(prev)\n\t\t\tpanel.currentPage = panel.currentPage + (prev and - 1 or 1)\n\t\t\tpageText:SetFormattedText(COLLECTION_PAGE_NUMBER, panel.currentPage, panel.maxPages)\n\n\t\t\tfor i = 1, numPages do\n\t\t\t\tpanel[i]:Hide()\n\t\t\tend\n\n\t\t\tif panel.currentPage == 1 then\n\t\t\t\tPrevPageButton:Disable()\n\t\t\t\tNextPageButton:Enable()\n\t\t\t\tpanel[1]:Show()\n\t\t\telseif panel.currentPage == 2 then\n\t\t\t\tPrevPageButton:Enable()\n\t\t\t\tif numPages > 2 then\n\t\t\t\t\tNextPageButton:Enable()\n\t\t\t\telse\n\t\t\t\t\tNextPageButton:Disable()\n\t\t\t\tend\n\t\t\t\tpanel[2]:Show()\n\t\t\telseif panel.currentPage == 3 then\n\t\t\t\tPrevPageButton:Enable()\n\t\t\t\tif numPages > 3 then\n\t\t\t\t\tNextPageButton:Enable()\n\t\t\t\telse\n\t\t\t\t\tNextPageButton:Disable()\n\t\t\t\tend\n\t\t\t\tpanel[3]:Show()\n\t\t\telseif panel.currentPage == 4 then\n\t\t\t\tPrevPageButton:Enable()\n\t\t\t\tNextPageButton:Disable()\n\t\t\t\tpanel[4]:Show()\n\t\t\tend\n\t\tend\n\n\t\tPrevPageButton:SetScript(\"OnClick\", function()\n\t\t\tSetPage(true)\n\t\tend)\n\n\t\tNextPageButton:SetScript(\"OnClick\", function()\n\t\t\tSetPage(false)\n\t\tend)\n\n\t\ttinsert(ns.NextPrevButtons, PrevPageButton)\n\t\ttinsert(ns.NextPrevButtons, NextPageButton)\n\n\t\tpanel.PrevPageButton = PrevPageButton\n\t\tpanel.NextPageButton = NextPageButton\n\n\t\tpanel:SetScript(\"OnMouseWheel\", function(_, delta)\n\t\t\tif delta < 0 then\n\t\t\t\tNextPageButton:Click()\n\t\t\tend\n\t\tend)\n\n\t\tpanel_2:SetScript(\"OnMouseWheel\", function(_, delta)\n\t\t\tif delta > 0 then\n\t\t\t\tPrevPageButton:Click()\n\t\t\tend\n\t\tend)\n\n\t\tif numPages > 2 then\n\t\t\tlocal name3 = name..\"3\"\n\t\t\tlocal tag3 = strlower(name3)\n\t\t\tlocal panel_3 = CreateOptionPanel(baseName..name3, text, subText)\n\t\t\tpanel[3] = panel_3\n\t\t\ttinsert(panels, panel_3)\n\n\t\t\ttab.panel_3 = panel_3\n\t\t\tpanel_3.tag = tag\n\t\t\tShestakUIOptionsPanel[tag3] = panel_3\n\n\t\t\tpanel_2:SetScript(\"OnMouseWheel\", function(_, delta)\n\t\t\t\tif delta > 0 then\n\t\t\t\t\tPrevPageButton:Click()\n\t\t\t\telseif delta < 0 then\n\t\t\t\t\tNextPageButton:Click()\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tpanel_3:SetScript(\"OnMouseWheel\", function(_, delta)\n\t\t\t\tif delta > 0 then\n\t\t\t\t\tPrevPageButton:Click()\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tif numPages > 3 then\n\t\t\t\tlocal name4 = name..\"4\"\n\t\t\t\tlocal tag4 = strlower(name4)\n\t\t\t\tlocal panel_4 = CreateOptionPanel(baseName..name4, text, subText)\n\t\t\t\tpanel[4] = panel_4\n\t\t\t\ttinsert(panels, panel_4)\n\n\t\t\t\ttab.panel_4 = panel_4\n\t\t\t\tpanel_4.tag = tag\n\t\t\t\tShestakUIOptionsPanel[tag4] = panel_4\n\n\t\t\t\tpanel_3:SetScript(\"OnMouseWheel\", function(_, delta)\n\t\t\t\t\tif delta > 0 then\n\t\t\t\t\t\tPrevPageButton:Click()\n\t\t\t\t\telseif delta < 0 then\n\t\t\t\t\t\tNextPageButton:Click()\n\t\t\t\t\tend\n\t\t\t\tend)\n\n\t\t\t\tpanel_4:SetScript(\"OnMouseWheel\", function(_, delta)\n\t\t\t\t\tif delta > 0 then\n\t\t\t\t\t\tPrevPageButton:Click()\n\t\t\t\t\tend\n\t\t\t\tend)\n\t\t\tend\n\t\tend\n\tend\nend\n\nns.addSubCategory = function(category, name)\n\tlocal header = category:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlightSmall\")\n\theader:SetText(name)\n\theader:SetTextColor(179/255, 211/255, 243/255)\n\n\tlocal line = category:CreateTexture(nil, \"ARTWORK\")\n\tline:SetSize(500, 1)\n\tline:SetPoint(\"TOPLEFT\", header, \"BOTTOMLEFT\", 0, -4)\n\tline:SetColorTexture(0.37, 0.3, 0.3, 1)\n\n\treturn header, line\nend\n\n-- [[ Init ]]\n\nlocal function changeProfile()\n\tlocal profile\n\tif ShestakUIOptionsGlobal[realm][name] == true then\n\t\tif ShestakUIOptionsPerChar == nil then\n\t\t\tShestakUIOptionsPerChar = {}\n\t\tend\n\t\tprofile = ShestakUIOptionsPerChar\n\telse\n\t\tprofile = ShestakUIOptions\n\tend\n\n\tfor group, options in pairs(profile) do\n\t\tif C[group] then\n\t\t\tfor option, value in pairs(options) do\n\t\t\t\tif C[group][option] == nil or C[group][option] == value then\n\t\t\t\t\tprofile[group][option] = nil\n\t\t\t\telse\n\t\t\t\t\tC[group][option] = value\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tprofile[group] = nil\n\t\tend\n\tend\n\n\tC.options = profile\nend\n\nlocal function displaySettings()\n\tfor _, box in pairs(checkboxes) do\n\t\tbox:SetChecked(C[box.group][box.option])\n\t\tif box.children then toggleChildren(box, box:GetChecked()) end\n\tend\n\n\tuserChangedSlider = false\n\n\tfor _, slider in pairs(sliders) do\n\t\tlocal value = C[slider.group][slider.option]\n\t\tif T.screenHeight > 1200 and slider.group == \"font\" and slider.option ~= \"nameplates_font_size\" then\n\t\t\tvalue = value / T.mult\n\t\tend\n\t\tslider:SetValue(value)\n\t\tslider.textInput:SetText(floor(value * 1000) / 1000)\n\t\tslider.textInput:SetCursorPosition(0)\n\t\tslider.oldValue = value\n\tend\n\n\tuserChangedSlider = true\n\n\tfor _, editbox in pairs(editboxes) do\n\t\teditbox:SetText(C[editbox.group][editbox.option])\n\t\teditbox:SetCursorPosition(0)\n\t\teditbox.oldValue = C[editbox.group][editbox.option]\n\tend\n\n\tfor _, dropdown in pairs(dropdowns) do\n\t\tlocal text = DropDownText[C[dropdown.group][dropdown.option]] or C[dropdown.group][dropdown.option] or \"\"\n\t\tUIDropDownMenu_SetText(dropdown, text)\n\t\tdropdown.selectedValue = C[dropdown.group][dropdown.option]\n\t\tdropdown.oldValue = C[dropdown.group][dropdown.option]\n\tend\nend\n\nlocal init = CreateFrame(\"Frame\")\ninit:RegisterEvent(\"PLAYER_LOGIN\")\ninit:SetScript(\"OnEvent\", function()\n\tif not ShestakUI then return end\n\n\tT, C = unpack(ShestakUI)\n\n\tlocal ShestakUIOptionsPanel = ShestakUIOptionsPanel\n\n\tStaticPopupDialogs.PERCHAR = {\n\t\ttext = L_GUI_PER_CHAR,\n\t\tOnAccept = function()\n\t\t\tif ShestakUIOptionsPanel.ProfileBox:GetChecked() then\n\t\t\t\tShestakUIOptionsGlobal[realm][name] = true\n\t\t\telse\n\t\t\t\tShestakUIOptionsGlobal[realm][name] = false\n\t\t\tend\n\t\t\t-- changeProfile()\n\t\t\tReloadUI()\n\t\tend,\n\t\tOnCancel = function()\n\t\t\tif ShestakUIOptionsPanel.ProfileBox:GetChecked() then\n\t\t\t\tShestakUIOptionsPanel.ProfileBox:SetChecked(false)\n\t\t\telse\n\t\t\t\tShestakUIOptionsPanel.ProfileBox:SetChecked(true)\n\t\t\tend\n\t\tend,\n\t\tbutton1 = ACCEPT,\n\t\tbutton2 = CANCEL,\n\t\ttimeout = 0,\n\t\twhileDead = 1,\n\t\tpreferredIndex = 5,\n\t}\n\n\tShestakUIOptionsPanel.ProfileBox:SetChecked(ShestakUIOptionsGlobal[realm][name])\n\tShestakUIOptionsPanel.ProfileBox:SetScript(\"OnClick\", function()\n\t\tStaticPopup_Show(\"PERCHAR\")\n\tend)\n\n\tShestakUIOptionsPanel:SetTemplate(\"Transparent\")\n\n\tlocal sunFrame = CreateFrame(\"Frame\", nil, ShestakUIOptionsPanel)\n\tsunFrame:SetPoint(\"LEFT\", 10, 9)\n\tsunFrame:SetSize(175, 670)\n\tsunFrame:CreateBackdrop(\"Overlay\")\n\tsunFrame.backdrop:SetPoint(\"TOPLEFT\", 0, 3)\n\tsunFrame.backdrop:SetPoint(\"BOTTOMRIGHT\", -2, -4)\n\n\tT.SkinCheckBox(ShestakUIOptionsPanel.ProfileBox)\n\n\tfor _, panel in pairs(panels) do\n\t\tpanel:CreateBackdrop(\"Overlay\")\n\t\tpanel.backdrop:SetPoint(\"TOPLEFT\", -10, 2)\n\t\tpanel.backdrop:SetPoint(\"BOTTOMRIGHT\", -10, -5)\n\tend\n\n\tfor _, button in pairs(ns.buttons) do\n\t\tbutton:SkinButton()\n\tend\n\n\tfor _, button in pairs(ns.NextPrevButtons) do\n\t\tT.SkinNextPrevButton(button, nil, \"Any\")\n\tend\n\n\tfor _, box in pairs(checkboxes) do\n\t\tT.SkinCheckBox(box)\n\tend\n\n\tfor _, slider in pairs(sliders) do\n\t\tT.SkinSlider(slider)\n\t\tT.SkinEditBox(slider.textInput)\n\tend\n\n\tfor _, picker in pairs(colourpickers) do\n\t\tlocal value = C[picker.group][picker.option]\n\t\tpicker:SetTemplate(\"Transparent\")\n\t\tpicker:SetBackdropBorderColor(unpack(value))\n\t\tpicker:SetBackdropColor(value[1], value[2], value[3], 0.3)\n\tend\n\n\tfor _, editbox in pairs(editboxes) do\n\t\tT.SkinEditBox(editbox)\n\tend\n\n\tfor _, dropdown in pairs(dropdowns) do\n\t\tT.SkinDropDownBox(dropdown)\n\tend\n\n\tlocal title = ShestakUIOptionsPanel:CreateFontString(\"UIConfigTitleVer\", \"OVERLAY\", \"GameFontNormal\")\n\ttitle:SetPoint(\"TOP\", 0, -10)\n\ttitle:SetText(\"ShestakUI \"..T.version)\n\n\tsetActiveTab(ShestakUIOptionsPanel.general.tab)\n\n\tdisplaySettings()\nend)"
  },
  {
    "path": "ShestakUI_Config/Locales/Chinese.lua",
    "content": "local _, L = ...\nif GetLocale() ~= \"zhCN\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for zhCN client\n--\tTranslation: Mania, Tat2dawn, Sakaras, Joe\n----------------------------------------------------------------------------------------\nL_GUI_SET_SAVED_SETTTINGS = \"角色专用设定\"\nL_GUI_SET_SAVED_SETTTINGS_DESC = \"在 一般设定 与 角色专用设定 之间切换。\"\nL_GUI_RESET_CHAR = \"确定要重置你所有角色的 ShestakUI 设定?\"\nL_GUI_RESET_ALL = \"确定要重置全部 ShestakUI 到预设值?\"\nL_GUI_PER_CHAR = \"确定要设定/取消 角色专用设定 模式?\"\nL_GUI_RESET_CAT = \"确定要重置当前分类到预设值?\"\nL_GUI_RESET_CAT_DESC = \"左键重置当前分类到预设值。\\nCTRL+左键重置全部到预设值。\"\nL_GUI_NEED_RELOAD = \"请点击套用以重载当前改动。\"\nL_GUI_LAYOUT = \"布局切换\"\nL_GUI_SPELL_LIST = \"法术列表\"\nL_GUI_SPELL_INPUT = \"法术ID\"\nL_GUI_TIME_INPUT = \"时间\"\nL_GUI_EXPERT_MODE = \"专家模式\"\nL_GUI_EXPERT_MODE_DESC = \"编写你的插件代码\"\nL_GUI_RESET_SPELLS_DESC = \"Ctrl+左键重置列表\"\n\n-- Profile\nL.profile = \"Profile\" -- Need review\nL.profile_title = \"Profile options\" -- Need review\nL.profile_choose = \"Choose profile\" -- Need review\nL.profile_options = \"Settings\" -- Need review\nL.profile_movers = \"Moving elements\" -- Need review\nL.profile_export = \"Export\" -- Need review\nL.profile_import = \"Import\" -- Need review\nL.profile_error_lib = \"To enable export and import - install WeakAuras\" -- Need review\nL.profile_error_code = \"Error in imported code!\" -- Need review\n\n-- General options\nL_GUI_GENERAL_SUBTEXT = \"一般用戶界面设置，键入 /uihelp 获取更多可用命令。\"\nL_GUI_GENERAL_WELCOME_MESSAGE = \"欢迎信息\"\nL_GUI_GENERAL_AUTOSCALE = \"自动UI缩放\"\nL_GUI_GENERAL_UISCALE = \"自定义UI缩放\"\nL.general_subheader_blizzard = \"暴雪插件\"\nL.general_error_filter = \"红字错误过滤\"\nL.general_error_blacklist = \"黑名单\"\nL.general_error_whitelist = \"白名单\"\nL.general_error_combat = \"战斗中\"\nL.general_error_none = \"不过滤\"\nL.general_vehicle_mouseover = \"驾驶框架解锁\"\nL.general_move_blizzard = \"移动暴雪界面框架\"\nL.general_color_picker = \"改进型颜色选择器\"\nL.general_color_picker_desc = \"增加按鈕：复制/粘上/职业 输入框：RGB/色值/透明度\"\nL.general_minimize_mouseover = \"任务栏最小化按钮鼠标悬停显示\"\nL.general_hide_banner = \"自动隐藏Boss额外拾取提示\"\nL.general_hide_talking_head = \"自动隐藏任务对话框\"\nL.general_hide_maw_buffs = \"隐藏心能之力框架\"\n\n-- Media options\nL.media_border_color = \"背景颜色\"\nL.media_classborder_color = \"边框按职业着色\"\nL.media_backdrop_color = \"边框背景颜色\"\nL.media_backdrop_alpha = \"透明背景\"\nL.media_texture = \"主要材质\"\nL.media_subheader_normal = \"通用字体\"\nL.media_subheader_pixel = \"像素字体\"\n\n-- Font options\nL.font = \"字体设置\"\nL.font_subtext = \"自定义字体格式\"\nL.font_stats_font = \"字体\"\nL.font_stats_font_style = \"描边\"\nL.font_stats_font_shadow = \"阴影\"\nL.font_subheader_stats = \"信息条\"\nL.font_subheader_combat = \"战斗资讯(xCT)\"\nL.font_subheader_chat = \"聊天信息\"\nL.font_subheader_chat_tabs = \"聊天频道标签\"\nL.font_subheader_action = \"动作条\"\nL.font_subheader_threat = \"仇恨条\"\nL.font_subheader_raidcd = \"团队冷却\"\nL.font_subheader_cooldown = \"冷却时间\"\nL.font_subheader_loot = \"拾取框\"\nL.font_subheader_nameplates = \"单位姓名板\"\nL.font_subheader_unit = \"单位框架\"\nL.font_subheader_aura = \"增益減益\"\nL.font_subheader_filger = \"法术监视(Filger)\"\nL.font_subheader_style = \"界面美化\"\nL.font_subheader_bag = \"背包\"\nL.font_subheader_blizzard = \"系统\"\nL.font_tooltip_header_font_size = \"鼠标提示标题\"\nL.font_tooltip_font_size = \"鼠标提示信息\"\nL.font_global_font = \"禁用像素字体\"\n\n-- Skins options\nL_GUI_SKINS = \"界面美化\"\nL_GUI_SKINS_SUBTEXT = \"对游戏默认界面和单体插件界面进行美化\"\nL_GUI_SKINS_BLIZZARD = \"美化暴雪默认界面\"\nL_GUI_SKINS_MINIMAP_BUTTONS = \"小地图插件图标\"\nL_GUI_SKINS_SUBHEADER = \"单体插件\"\nL.skins_minimap_buttons_mouseover = \"鼠标悬停显示插件图标\"\nL.skins_bubbles = \"美化聊天泡泡\"\n\n-- Unit Frames options\nL_GUI_UF_SUBTEXT = \"定制玩家/目标框架/其他框架\"\nL_GUI_UF_ENABLE = \"单位框架增强\"\nL_GUI_UF_OWN_COLOR = \"自定义颜色\"\nL_GUI_UF_UF_COLOR = \"生命条颜色\"\nL.unitframe_uf_color_bg = \"背景颜色\"\nL.unitframe_enemy_health_color = \"敌对目标生命条以红色着色\"\nL_GUI_UF_TOTAL_VALUE = \"玩家/目标框架显示详细的文字变化\"\nL_GUI_UF_COLOR_VALUE = \"生命值/魔法值按职业着色\"\nL_GUI_UF_BAR_COLOR_VALUE = \"生命值按剩余血量着色\"\nL_GUI_UF_LINES = \"玩家/目标框架显示划线\"\nL_GUI_UF_SUBHEADER_CAST = \"施法条\"\nL_GUI_UF_UNIT_CASTBAR = \"施法条增强\"\nL_GUI_UF_CASTBAR_ICON = \"法术图标\"\nL_GUI_UF_CASTBAR_LATENCY = \"施法延迟\"\nL_GUI_UF_CASTBAR_TICKS = \"施法跳数\"\nL_GUI_UF_SUBHEADER_FRAMES = \"其他框架\"\nL_GUI_UF_SHOW_PET = \"宠物框架\"\nL_GUI_UF_SHOW_FOCUS = \"焦点框架\"\nL_GUI_UF_SHOW_TOT = \"目标的目标框架\"\nL_GUI_UF_SHOW_BOSS = \"Boss框架\"\nL_GUI_UF_BOSS_RIGHT = \"右侧显示Boss框架\"\nL_GUI_UF_SHOW_ARENA = \"竞技场框架\"\nL_GUI_UF_ARENA_RIGHT = \"右侧显示竞技场框架\"\nL_GUI_UF_BOSS_DEBUFFS = \"DeBuff数量\"\nL_GUI_UF_BOSS_DEBUFFS_DESC = \"Boss框架DeBuff数量\"\nL_GUI_UF_BOSS_BUFFS = \"Buff数量\"\nL_GUI_UF_BOSS_BUFFS_DESC = \"Boss框架Buff数量\"\nL.unitframe_icons_pvp = \"PvP状态\"\nL.unitframe_icons_pvp_desc = \"PvP状态(鼠标悬停显示)\"\nL_GUI_UF_ICONS_COMBAT = \"战斗标记\"\nL_GUI_UF_ICONS_RESTING = \"休息标记\"\nL_GUI_UF_SUBHEADER_PORTRAIT = \"3D头像\"\nL_GUI_UF_PORTRAIT_ENABLE = \"玩家/目标头像\"\nL_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = \"头像边框按职业着色\"\nL.unitframe_portrait_type = \"头像类型\"\nL.unitframe_portrait_type_icons = \"职业图标\"\nL.unitframe_portrait_type_overlay = \"生命条显示\"\nL_GUI_UF_PORTRAIT_HEIGHT = \"头像高度\"\nL_GUI_UF_PORTRAIT_WIDTH = \"头像宽度\"\nL_GUI_UF_SUBHEADER_PLUGINS = \"辅助功能\"\nL_GUI_UF_PLUGINS_GCD = \"公共CD计时条\"\nL_GUI_UF_PLUGINS_SWING = \"普通攻击计时条\"\nL.unitframe_plugins_reputation_bar = \"声望条\"\nL.unitframe_plugins_reputation_bar_desc = \"在玩家框架左侧鼠标悬停显示，中键锁定显示。\"\nL.unitframe_plugins_experience_bar = \"经验条\"\nL.unitframe_plugins_experience_bar_desc = \"在玩家框架左侧鼠标悬停显示，中键锁定显示。\"\nL_GUI_UF_PLUGINS_SMOOTH_BAR = \"平滑条\"\nL_GUI_UF_PLUGINS_ENEMY_SPEC = \"敌对玩家天赋\"\nL_GUI_UF_PLUGINS_COMBAT_FEEDBACK = \"玩家/目标框架显示战斗文字\"\nL_GUI_UF_PLUGINS_FADER = \"自动隐藏玩家框架\"\nL_GUI_UF_PLUGINS_DIMINISHING = \"竞技场框架显示技能递减\"\nL_GUI_UF_PLUGINS_POWER_PREDICTION = \"即将获得的资源\"\nL.unitframe_plugins_absorbs = \"吸收量\"\nL.unitframe_subheader_player_width = \"玩家/目标框架大小\"\nL.unitframe_player_width = \"宽度\"\nL.unitframe_subheader_boss_width = \"Boss框架与竞技场框架大小\"\nL.unitframe_extra_height_auto = \"血量/能量框架自动增高\"\nL.unitframe_extra_height_auto_desc = \"按字体大小智能调节框架高度\"\nL.unitframe_extra_health_height = \"血量框架额外增高\"\nL.unitframe_extra_power_height = \"能量框架额外增高\"\nL.unitframe_subheader_castbar = \"玩家/目标施法条大小\"\nL.unitframe_castbar_height = \"高度\"\n\n-- Unit Frames Class bar options\nL_GUI_UF_PLUGINS_CLASS_BAR = \"职业资源栏\"\nL_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = \"显示职业的特殊资源\"\nL_GUI_UF_PLUGINS_COMBO_BAR = \"连击点\"\nL_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = \"总是显示德鲁伊连击点\"\nL_GUI_UF_PLUGINS_COMBO_BAR_OLD = \"目标框架显示连击点\"\nL_GUI_UF_PLUGINS_ARCANE_BAR = \"奥术充能\"\nL_GUI_UF_PLUGINS_CHI_BAR = \"真气\"\nL_GUI_UF_PLUGINS_STAGGER_BAR = \"醉拳池(酒仙武僧)\"\nL_GUI_UF_PLUGINS_HOLY_BAR = \"圣光能量\"\nL_GUI_UF_PLUGINS_SHARD_BAR = \"灵魂碎片\"\nL_GUI_UF_PLUGINS_RUNE_BAR = \"符文\"\nL_GUI_UF_PLUGINS_TOTEM_BAR = \"图腾\"\nL.unitframe_class_bar_totem_other = \"其他职业图腾\"\nL.unitframe_class_bar_essence = \"Enable Essence bar for Evoker\" -- Need review\n\n-- Raid Frames options\nL_GUI_UF_RAIDFRAMES_SUBTEXT = \"定制队伍/团队框架\"\nL_GUI_UF_BY_ROLE = \"按职责排序\"\nL_GUI_UF_AGGRO_BORDER = \"边框按仇恨值着色\"\nL_GUI_UF_DEFICIT_HEALTH = \"团队生命值亏减模式\"\nL_GUI_UF_SHOW_PARTY = \"队伍框架\"\nL_GUI_UF_SHOW_RAID = \"团队框架\"\nL.raidframe_layout = \"团队布局\"\nL.raidframe_heal_layout = \"治疗\"\nL.raidframe_dps_layout = \"输出\"\nL.raidframe_auto_layout = \"自动\"\nL.raidframe_show_target = \"目标框架\"\nL.raidframe_show_pet = \"宠物框架\"\nL.raidframe_vertical_health = \"垂直显示团队框架生命值\"\nL.raidframe_vertical_health_desc = \"仅限治疗布局中生效\"\nL_GUI_UF_ALPHA_HEALTH = \"满血时淡化单位框架\"\nL_GUI_UF_SHOW_RANGE = \"单位框架按距离变化设定透明度\"\nL_GUI_UF_RANGE_ALPHA = \"透明度\"\nL_GUI_UF_RANGE_ALPHA_DESC = \"单位框架超出距离的透明度\"\nL_GUI_UF_SUBHEADER_RAIDFRAMES = \"其他框架\"\nL_GUI_UF_SOLO_MODE = \"总是显示玩家框架\"\nL_GUI_UF_PLAYER_PARTY = \"队伍中显示玩家框架\"\nL_GUI_UF_SHOW_TANK = \"团队主坦克框架\"\nL_GUI_UF_SHOW_TANK_TT = \"坦克目标的目标\"\nL_GUI_UF_RAID_GROUP = \"小队数目\"\nL.raidframe_party_vertical  = \"竖向排列队伍\"\nL.raidframe_raid_groups_vertical = \"竖向排列团队队伍\"\nL.raidframe_raid_groups_vertical_desc = \"仅限治疗布局中生效\"\nL_GUI_UF_SUBHEADER_ICONS = \"标记\"\nL_GUI_UF_ICONS_ROLE = \"角色类型标记\"\nL_GUI_UF_ICONS_RAID_MARK = \"团队标记\"\nL_GUI_UF_ICONS_READY_CHECK = \"就绪确认标记\"\nL_GUI_UF_ICONS_LEADER = \"队长/助手标记\"\nL_GUI_UF_ICONS_SUMON = \"召唤标记\"\nL.raidframe_icons_phase = \"相位标记\"\nL.raidframe_plugins_debuffhighlight_icon = \"高亮DeBuff图标\"\nL.raidframe_plugins_aura_watch = \"团队法术监视\"\nL.raidframe_plugins_aura_watch_timer = \"团队减益时间\"\nL.raidframe_plugins_pvp_debuffs = \"PvP DeBuff图标\"\nL_GUI_UF_PLUGINS_HEALCOMM = \"即将受到的治疗\"\nL.raidframe_plugins_over_absorb = \"显示吸收条\"\nL.raidframe_plugins_over_heal_absorb = \"显示过量治疗吸收条\"\nL.raidframe_plugins_auto_resurrection = \"中键施放复活技能\"\nL.raidframe_plugins_auto_resurrection_desc = \"鼠标中键点击已死亡角色时施放复活技能(Clique启用时无效)\"\nL.raidframe_hide_health_value = \"隐藏血量\"\nL.raidframe_auto_position = \"玩家/目标框架自动定位\"\nL.raidframe_auto_position_desc = \"动态: 当小队数目大于5，框架位置按小队数目调整\\n仅限治疗布局非竖向排列时生效\"\nL.raidframe_auto_position_dynamic = \"动态\"\nL.raidframe_auto_position_static = \"静态\"\nL.raidframe_subheader_heal_size = \"治疗布局框架大小\"\nL.raidframe_heal_width = \"框架宽度\"\nL.raidframe_heal_height = \"框架高度\"\nL.raidframe_heal_power_height = \"能量框架高度\"\nL.raidframe_subheader_dps_size = \"输出布局框架大小\"\nL.raidframe_dps_party_width = \"队伍框架宽度\"\nL.raidframe_dps_party_height = \"队伍框架高度\"\nL.raidframe_dps_raid_width = \"框架宽度\"\nL.raidframe_dps_raid_height = \"框架高度\"\nL.raidframe_dps_party_power_height = \"队伍能量框架高度\"\nL.raidframe_dps_raid_power_height = \"能量框架高度\"\n\n-- ActionBar options\nL_GUI_ACTIONBAR = \"动作条\"\nL_GUI_ACTIONBAR_ENABLE = \"动作条增强\"\nL_GUI_ACTIONBAR_HOTKEY = \"按键键名\"\nL_GUI_ACTIONBAR_MACRO = \"宏名称\"\nL_GUI_ACTIONBAR_GRID = \"动作条显示空白快捷键\"\nL_GUI_ACTIONBAR_BUTTON_SIZE = \"快捷键大小\"\nL_GUI_ACTIONBAR_BUTTON_SPACE = \"快捷键间距\"\nL_GUI_ACTIONBAR_SPLIT_BARS = \"#5动作条分段(2*6; 该选项开启后将激活所有动作条)\"\nL_GUI_ACTIONBAR_CLASSCOLOR_BORDER = \"动作条边框按职业着色\"\nL.actionbar_toggle_mode = \"自由折叠\"\nL.actionbar_toggle_mode_desc = \"可随时调节动作条显示数目。按钮位于底部动作条上方及右側动作条下方，鼠标悬停显示。\"\nL_GUI_ACTIONBAR_HIDE_HIGHLIGHT = \"关闭动作条技能特效高亮\"\nL_GUI_ACTIONBAR_BOTTOMBARS = \"底部动作条数目\"\nL_GUI_ACTIONBAR_RIGHTBARS = \"右侧动作条数目\"\nL.actionbar_bottombars_mouseover = \"底部动作条鼠标悬停显示\"\nL_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = \"右侧动作条鼠标悬停显示\"\nL_GUI_ACTIONBAR_PETBAR_HIDE = \"隐藏宠物动作条\"\nL_GUI_ACTIONBAR_PETBAR_HORIZONTAL = \"宠物动作条横向排列\"\nL_GUI_ACTIONBAR_PETBAR_MOUSEOVER = \"鼠标悬停显示\"\nL_GUI_ACTIONBAR_STANCEBAR_HIDE = \"隐藏变身/姿态动作条\"\nL_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = \"变身/姿态动作条横向排列\"\nL.actionbar_stancebar_horizontal_desc = \"位于玩家框架下方\"\nL_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = \"鼠标悬停显示\"\nL_GUI_ACTIONBAR_MICROMENU = \"微型菜单\"\nL_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = \"鼠标悬停显示\"\nL.actionbar_editor = \"动作条布局\"\nL.actionbar_editor_desc = \"允许动作条独立移动和更改\"\nL.actionbar_bar1_num = \"快捷键数\"\nL.actionbar_bar1_row = \"每行快捷键数\"\nL.actionbar_bar1_mouseover = \"鼠标悬停显示\"\n\n-- Tooltip options\nL.tooltip = \"鼠标提示\"\nL.tooltip_subtext = \"设置鼠标提示\"\nL.tooltip_enable = \"鼠标提示增强\"\nL.tooltip_shift_modifer = \"按下Shift时显示提示\"\nL.tooltip_cursor = \"提示跟随鼠标\"\nL.tooltip_item_icon = \"物品图标\"\nL.tooltip_health_value = \"生命值以百分比显示\"\nL.tooltip_hidebuttons = \"隐藏动作条提示\"\nL.tooltip_hide_combat = \"战斗中隐藏提示\"\nL.tooltip_subheader = \"辅助功能\"\nL.tooltip_talents = \"天赋\"\nL.tooltip_show_shift = \"按下Shift时显示\"\nL.tooltip_show_shift_desc = \"按下Shift时显示天赋/平均装等\"\nL.tooltip_achievements = \"成就比较\"\nL.tooltip_target = \"目标的目标\"\nL.tooltip_title = \"头衔\"\nL.tooltip_realm = \"服务器\"\nL.tooltip_rank = \"公会会阶\"\nL.tooltip_spell_id = \"法术ID\"\nL.tooltip_average_lvl_desc = \"平均装等\"\nL.tooltip_raid_icon = \"团队标记\"\nL.tooltip_who_targetting = \"关注成员(在队伍/团队中谁以目标為目标)\"\nL.tooltip_item_count = \"物品的简易统计\"\nL.tooltip_unit_role = \"角色类型\"\nL.tooltip_instance_lock = \"副本进度比较\"\nL.tooltip_mount = \"坐骑来源\"\n\n-- Chat options\nL.chat_subtext = \"这里可以设置你的聊天框\"\nL.chat_enable = \"聊天框增强\"\nL.chat_background = \"聊天框背景\"\nL.chat_background_alpha = \"聊天框背景透明度\"\nL.chat_filter = \"屏蔽无用系统信息\"\nL.chat_filter_desc = \"决斗, 切换专精, 城中NPC对话\"\nL.chat_spam = \"屏蔽玩家垃圾信息\"\nL.chat_spam_list = \"过滤词列表\"\nL.chat_spam_list_desc = \"添加过滤词 (中文词用空格分隔，英文词用小写分隔)\"\nL.chat_width = \"聊天框宽度\"\nL.chat_height = \"聊天框高度\"\nL.chat_chat_bar = \"聊天频道快捷键\"\nL.chat_chat_bar_mouseover = \"鼠标悬停显示聊天频道快捷键\"\nL.chat_whisp_sound = \"接受密语时声音提示\"\nL.chat_combatlog = \"战斗记录标签\"\nL.chat_tabs_mouseover = \"鼠标悬停显示频道标签\"\nL.chat_sticky = \"记住上一次使用的频道\"\nL.chat_damage_meter_spam = \"在链接中合并垃圾邮件\"\nL.chat_loot_icons = \"拾取信息带图标\"\nL.chat_hide_combat = \"战斗中隐藏\"\nL.chat_custom_time_color = \"自定义时间标签颜色\"\nL.chat_time_color = \"时间标签颜色\"\n\n-- Nameplate options\nL_GUI_NAMEPLATE_SUBTEXT = \"单位姓名板设置\"\nL_GUI_NAMEPLATE_ENABLE = \"单位姓名板增强\"\nL_GUI_NAMEPLATE_COMBAT = \"战斗中自动显示单位姓名板\"\nL_GUI_NAMEPLATE_HEALTH = \"生命值以百分比显示\"\nL_GUI_NAMEPLATE_HEIGHT = \"高度\"\nL_GUI_NAMEPLATE_WIDTH = \"宽度\"\nL.nameplate_alpha = \"透明度\"\nL.nameplate_alpha_desc = \"非当前目标的单位姓名板透明度\"\nL.nameplate_ad_height = \"额外高度\"\nL.nameplate_ad_width = \"额外宽度\"\nL.nameplate_ad_height_desc = \"目标的单位姓名板额外高度\"\nL.nameplate_ad_width_desc = \"目标的单位姓名板额外宽度\"\nL_GUI_NAMEPLATE_CASTBAR_NAME = \"法术名称\"\nL_GUI_NAMEPLATE_CLASS_ICON = \"PvP时显示职业图标\"\nL_GUI_NAMEPLATE_NAME_ABBREV = \"名字缩写\"\nL.nameplate_short_name = \"替换名称\"\nL.nameplate_clamp = \"贴边显示\"\nL.nameplate_clamp_desc = \"当单位姓名板超出屏幕时仍贴边显示\"\nL_GUI_NAMEPLATE_SHOW_DEBUFFS = \"显示DeBuff(需要关闭名字缩写)\"\nL_GUI_NAMEPLATE_SHOW_BUFFS = \"显示可进攻驱散\"\nL_GUI_NAMEPLATE_DEBUFFS_SIZE = \"图标大小\"\nL_GUI_NAMEPLATE_HEALER_ICON = \"战场中显示治疗职业图标\"\nL_GUI_NAMEPLATE_TOTEM_ICONS = \"显示敌对图腾图标\"\nL.nameplate_target_glow = \"目标边框高亮\"\nL.nameplate_only_name = \"友方玩家只显示名称\"\nL.nameplate_quests = \"任务图标\"\nL.nameplate_cast_color = \"重要法术施法条边框高亮\"\nL.nameplate_kick_color = \"当断法技能冷却中则施法条变色\"\nL.nameplate_low_health_value = \"斩杀线阈值\"\nL.nameplate_low_health = \"斩杀边框高亮\"\nL_GUI_NAMEPLATE_THREAT = \"仇恨情况\"\nL_GUI_NAMEPLATE_GOOD_COLOR = \"安全仇恨颜色\"\nL_GUI_NAMEPLATE_NEAR_COLOR = \"临界仇恨颜色\"\nL_GUI_NAMEPLATE_BAD_COLOR = \"危险仇恨颜色\"\nL_GUI_NAMEPLATE_OFFTANK_COLOR = \"副坦仇恨颜色\"\nL.nameplate_extra_color = \"易爆/怨毒词缀颜色\"\nL.nameplate_mob_color_enable = \"副本中重要小怪着色\"\nL.nameplate_mob_color = \"小怪颜色\"\n\n-- Combat text options\nL_GUI_COMBATTEXT = \"战斗文字\"\nL_GUI_COMBATTEXT_SUBTEXT = \"键入 /xct 获取更多可用命令\"\nL_GUI_COMBATTEXT_ENABLE = \"启用xCT战斗信息\"\nL.combattext_blizz_head_numbers = \"启用暴雪默认战斗信息\"\nL.combattext_blizz_head_numbers_desc = \"暴雪默认伤害/治疗模式(需关闭xCT战斗信息)\"\nL.combattext_damage_style = \"改变默认的显示风格\"\nL.combattext_damage_style_desc = \"改变模型顶部/玩家头像的伤害/治疗字体\"\nL_GUI_COMBATTEXT_DAMAGE = \"独立显示伤害输出\"\nL_GUI_COMBATTEXT_HEALING = \"独立显示治疗输出\"\nL.combattext_incoming = \"滚动战斗记录\"\nL_GUI_COMBATTEXT_HOTS = \"Hot造成的治疗\"\nL_GUI_COMBATTEXT_OVERHEALING = \"过量治疗输出\"\nL_GUI_COMBATTEXT_PET_DAMAGE = \"宠物伤害输出\"\nL_GUI_COMBATTEXT_DOT_DAMAGE = \"Dot造成的伤害\"\nL_GUI_COMBATTEXT_DAMAGE_COLOR = \"伤害文字按法术类型着色\"\nL_GUI_COMBATTEXT_CRIT_PREFIX = \"暴击时文本左侧修饰符号\"\nL_GUI_COMBATTEXT_CRIT_POSTFIX = \"暴击时文本右侧修饰符号\"\nL_GUI_COMBATTEXT_ICONS = \"伤害输出技能图标\"\nL_GUI_COMBATTEXT_ICON_SIZE = \"图标大小\"\nL_GUI_COMBATTEXT_ICON_SIZE_DESC = \"伤害输出图标大小\"\nL_GUI_COMBATTEXT_TRESHOLD = \"伤害输出最小阈值\"\nL_GUI_COMBATTEXT_HEAL_TRESHOLD = \"承受/输出治疗最小阈值\"\nL_GUI_COMBATTEXT_SCROLLABLE = \"允许使用鼠标滚轮滚动区域\"\nL_GUI_COMBATTEXT_MAX_LINES = \"最大行数\"\nL_GUI_COMBATTEXT_MAX_LINES_DESC = \"滚动区域显示最大行数\"\nL_GUI_COMBATTEXT_TIME_VISIBLE = \"时间\"\nL_GUI_COMBATTEXT_TIME_VISIBLE_DESC = \"信息保留时间(秒)\"\nL_GUI_COMBATTEXT_DK_RUNES = \"死亡骑士符文恢复\"\nL_GUI_COMBATTEXT_KILLINGBLOW = \"击杀信息\"\nL.combattext_merge_aoe_spam = \"将AOE伤害合并为一条信息\"\nL.combattext_merge_aoe_spam_desc = \"将AOE伤害合并为一条信息\"\nL_GUI_COMBATTEXT_MERGE_MELEE = \"将多个自动攻击伤害合并为一条信息\"\nL.combattext_merge_all = \"Merges all spells\" -- Needs review\nL_GUI_COMBATTEXT_DISPEL = \"当你驱散成功时提示\"\nL_GUI_COMBATTEXT_INTERRUPT = \"当你打断成功时提示\"\nL_GUI_COMBATTEXT_DIRECTION = \"滚动方向从下向上\"\nL_GUI_COMBATTEXT_SHORT_NUMBERS = \"数值以K为单位显示\"\n\n-- Auras/Buffs/Debuffs\nL_GUI_AURA_PLAYER_BUFF_SIZE = \"Buff大小\"\nL_GUI_AURA_PLAYER_BUFF_SIZE_DESC = \"玩家Buff图标大小\"\nL.aura_debuff_size = \"DeBuffs大小\"\nL_GUI_AURA_SHOW_SPIRAL = \"漩涡冷却样式\"\nL_GUI_AURA_SHOW_TIMER = \"层数堆叠\"\nL_GUI_AURA_PLAYER_AURAS = \"玩家显示法术效果\"\nL_GUI_AURA_TARGET_AURAS = \"目标显示法术效果\"\nL_GUI_AURA_FOCUS_DEBUFFS = \"焦点显示DeBuff\"\nL_GUI_AURA_FOT_DEBUFFS = \"焦点的目标显示DeBuff\"\nL_GUI_AURA_PET_DEBUFFS = \"宠物显示DeBuff\"\nL_GUI_AURA_TOT_DEBUFFS = \"目标的目标显示DeBuff\"\nL.aura_subheader_boss = \"Boss显示Buff/DeBuff\"\nL_GUI_AURA_PLAYER_AURA_ONLY = \"目标只显示自身施放的DeBuff\"\nL_GUI_AURA_DEBUFF_COLOR_TYPE = \"DeBuff按法术类型着色\"\nL_GUI_AURA_CAST_BY = \"提示Buff/DeBuff提供者\"\nL_GUI_AURA_CLASSCOLOR_BORDER = \"自身Buff图标边框按职业着色\"\nL.aura_subheader_buffs = \"玩家Buff\"\nL.aura_subheader_debuffs = \"Debuffs\"\n\n-- Bag options\nL_GUI_BAGS = \"背包\"\nL_GUI_BAGS_SUBTEXT = \"背包的关闭按钮另有菜单按右键开启。按住Shift+左键可拖动。\"\nL_GUI_BAGS_ENABLE = \"背包增强\"\nL_GUI_BAGS_ILVL = \"显示物品等级\"\nL.bag_new_items = \"新物品闪动显示\"\nL.bag_filter = \"Always show filter buttons\" -- Need review\nL_GUI_BAGS_BUTTON_SIZE = \"格子大小\"\nL_GUI_BAGS_BUTTON_SPACE = \"格子间距\"\nL_GUI_BAGS_BANK = \"银行每行格数\"\nL_GUI_BAGS_BAG = \"背包每行格数\"\n\n-- Minimap options\nL_GUI_MINIMAP_SUBTEXT = \"小地图设置\"\nL_GUI_MINIMAP_ENABLE = \"小地图增强\"\nL.minimap_on_top = \"小地图定位到右上角\"\nL_GUI_MINIMAP_ICON = \"追踪菜单\"\nL_GUI_GARRISON_ICON = \"圣所报告图标\"\nL_GUI_MINIMAP_SIZE = \"小地图大小\"\nL_GUI_MINIMAP_HIDE_COMBAT = \"战斗中隐藏小地图\"\nL_GUI_MINIMAP_TOGGLE_MENU = \"小地图顶部快捷菜单\"\nL.minimap_bg_map_stylization = \"战场地图增强\"\nL.minimap_fog_of_war = \"地图全亮\"\n\n-- Loot options\nL_GUI_LOOT_SUBTEXT = \"拾取框架设置\"\nL_GUI_LOOT_ENABLE = \"拾取增强\"\nL_GUI_LOOT_ROLL_ENABLE = \"团队拾取框架增强\"\nL_GUI_LOOT_ICON_SIZE = \"拾取框架图标大小\"\nL_GUI_LOOT_WIDTH = \"拾取框架宽度\"\nL_GUI_LOOT_AUTOGREED = \"满级后自动贪婪绿色物品\"\nL_GUI_LOOT_AUTODE = \"自动选择分解\"\nL.loot_faster_loot = \"快速拾取\"\nL.loot_faster_loot_desc = \"仅在自动拾取模式中生效\"\n\n-- Filger\nL_GUI_FILGER = \"法术监视\"\nL_GUI_FILGER_SUBTEXT = \"Filger - 类似WeakAuras，更简单易用，可选择图标和计时条形式显示你的增益减益和计时。\"\nL_GUI_FILGER_ENABLE = \"法术监视\"\nL_GUI_FILGER_TEST_MODE = \"调试模式\"\nL_GUI_FILGER_MAX_TEST_ICON = \"调试模式图标数量\"\nL_GUI_FILGER_SHOW_TOOLTIP = \"鼠标指向提示\"\nL.filger_subheader_elements = \"分组显示\"\nL.filger_show_buff = \"玩家Buff\"\nL.filger_show_proc = \"玩家Procs Buff\"\nL.filger_show_debuff = \"目标DeBuff\"\nL.filger_show_aura_bar = \"目标Buff计时条\"\nL.filger_show_special = \"玩家Special Buff\"\nL.filger_show_pvp_player = \"玩家PvP DeBuff\"\nL.filger_show_pvp_target = \"目标PvP DeBuff\"\nL.filger_show_cd = \"技能冷却\"\nL.filger_subheader_size = \"图标大小\"\nL.filger_subheader_test = \"调试模式\"\nL_GUI_FILGER_EXPIRATION = \"按冷却时间排序\"\nL_GUI_FILGER_BUFFS_SIZE = \"Buff图标大小\"\nL_GUI_FILGER_COOLDOWN_SIZE = \"技能冷却图标大小\"\nL_GUI_FILGER_PVP_SIZE = \"PvP DeBuff图标大小\"\nL.filger_buffs_space = \"图标间距\"\nL.filger_pvp_space = \"图标间距\"\nL.filger_cooldown_space = \"图标间距\"\nL.filger_subheader_spells = \"添加法术\"\nL.filger_category_list = \"分组\"\n\n-- Announcements options\nL_GUI_ANNOUNCEMENTS = \"通告预警\"\nL_GUI_ANNOUNCEMENTS_SUBTEXT = \"添加特定事件進行通报\"\nL.announcements_drinking = \"当敌人进食时在聊天框进行通告\"\nL.announcements_interrupts = \"断法\"\nL.announcements_interrupts_desc = \"当你打断成功时在队伍/团队中进行通告\"\nL.announcements_spells = \"施法\"\nL.announcements_spells_desc = \"当你施放指定法术时在队伍/团队中进行通告\"\nL.announcements_spells_from_all = \"检查所有队员\"\nL.announcements_spells_from_all_desc = \"检查来源包括所有队员\"\nL.announcements_toys = \"使用玩具火车/烈酒的遥控器时进行通告\"\nL.announcements_pull_countdown = \"倒计时通告\"\nL.announcements_pull_countdown_desc = \"倒计时通告(/pc #)\"\nL.announcements_flask_food = \"食物和合剂\"\nL.announcements_flask_food_desc = \"通告食物和合剂的使用情況(/ffcheck)\"\nL.announcements_flask_food_raid = \"在团队频道通告\"\nL.announcements_flask_food_auto = \"当团队就位确认时进行检查\"\nL.announcements_feasts = \"放置食物/大锅/灵魂井/修理机器人时进行通告\"\nL.announcements_portals = \"开启传送门/召唤仪式时进行通告\"\nL.announcements_subheader_self = \"个人通告\"\nL.announcements_bad_gear = \"检查装备\"\nL.announcements_bad_gear_desc = \"进入副本时提醒非副本装备(鱼竿等装备)\"\nL.announcements_safari_hat = \"狩猎帽\"\nL.announcements_safari_hat_desc = \"检查'狩猎帽'使用情况\"\n\n-- Automation options\nL_GUI_AUTOMATION = \"自动设定\"\nL_GUI_AUTOMATION_SUBTEXT = \"一些自动化的设置\"\nL.automation_release = \"战场中自动释放灵魂\"\nL.automation_screenshot = \"获得成就时自动截屏\"\nL.automation_solve_artifact = \"自动辨识考古文物\"\nL.automation_solve_artifact_desc = \"当有足夠碎片时自动弹出辨识窗口并插上符文石\"\nL.automation_accept_invite = \"自动接受好友/公会成员的组队邀请\"\nL.automation_decline_duel = \"自动取消决斗\"\nL.automation_accept_quest = \"自动交接任务(按住Shift临时停用)\"\nL.automation_auto_collapse = \"自动折叠任务追踪框架\"\nL.automation_auto_collapse_raid = \"副本中\"\nL.automation_auto_collapse_reload = \"重载后\"\nL.automation_auto_collapse_scenario = \"场景战役\"\nL.automation_skip_cinematic = \"自动跳过过场动画(按住Ctrl临时停用)\"\nL.automation_auto_role = \"自动设定角色类型\"\nL.automation_cancel_bad_buffs = \"自动取消非增益性质的Buff\"\nL.automation_tab_binder = \"Tab键只选定玩家\"\nL.automation_tab_binder_desc = \"在PvP区域按Tab键只选取敌对玩家目标，忽略宠物图腾等次要目标。\"\nL.automation_logging_combat = \"团队副本时自动开启战斗记录\"\nL.automation_buff_on_scroll = \"使用鼠标滚轮施放Buff\"\nL.automation_buff_on_scroll_desc = \"指定Buff缺失时使用鼠标滚轮施放\"\nL.automation_open_items = \"自动打开背包中的封装物品\"\nL.automation_resurrection = \"自动确认复活\"\nL.automation_summon = \"自动确认召唤\"\nL.automation_whisper_invite = \"密语自动邀请\"\nL.automation_invite_keyword = \"添加关键词(需加空隔键)\"\nL.automation_invite_keyword_desc = \"通过关键词自动邀请对方进组\"\n\n-- Buffs reminder options\nL_GUI_REMINDER = \"Buff提示\"\nL_GUI_REMINDER_SUBTEXT = \"提示缺失的Buff\"\nL_GUI_REMINDER_SOLO_ENABLE = \"自身Buff缺失时图标提示\"\nL_GUI_REMINDER_SOLO_SOUND = \"自身Buff缺失时声音提示\"\nL_GUI_REMINDER_SOLO_SIZE = \"图标大小\"\nL_GUI_REMINDER_SOLO_SIZE_DESC = \"自身Buff提示图标大小\"\nL_GUI_REMINDER_SUBHEADER = \"团队Buff\"\nL_GUI_REMINDER_RAID_ENABLE = \"团队Buff缺失时图标提示\"\nL_GUI_REMINDER_RAID_ALWAYS = \"总是显示Buff提示\"\nL_GUI_REMINDER_RAID_SIZE = \"图标大小\"\nL_GUI_REMINDER_RAID_SIZE_DESC = \"团队Buff提示图标大小\"\nL_GUI_REMINDER_RAID_ALPHA = \"透明度\"\nL_GUI_REMINDER_RAID_ALPHA_DESC = \"当团队Buff存在时图标透明度\"\n\n-- Raid cooldowns options\nL_GUI_COOLDOWN_RAID = \"团队技能冷却\"\nL_GUI_COOLDOWN_RAID_SUBTEXT = \"显示在屏幕左上方\"\nL_GUI_COOLDOWN_RAID_ENABLE = \"团队技能冷却\"\nL_GUI_COOLDOWN_RAID_HEIGHT = \"计量条高度\"\nL_GUI_COOLDOWN_RAID_WIDTH = \"计量条宽度\"\nL_GUI_COOLDOWN_RAID_SORT = \"团队技能冷却向上延伸\"\nL_GUI_COOLDOWN_RAID_EXPIRATION = \"按冷却时间排序\"\nL_GUI_COOLDOWN_RAID_SHOW_SELF = \"自身团队技能\"\nL_GUI_COOLDOWN_RAID_ICONS = \"团队技能冷却图标\"\nL_GUI_COOLDOWN_RAID_IN_RAID = \"团队中显示团队技能冷却\"\nL_GUI_COOLDOWN_RAID_IN_PARTY = \"队伍中显示团队技能冷却\"\nL_GUI_COOLDOWN_RAID_IN_ARENA = \"竞技场中显示团队技能冷却\"\n\n-- Enemy cooldowns options\nL_GUI_COOLDOWN_ENEMY = \"敌对技能冷却\"\nL_GUI_COOLDOWN_ENEMY_SUBTEXT = \"显示在你的施法条上方\"\nL_GUI_COOLDOWN_ENEMY_ENABLE = \"敌对技能冷却\"\nL_GUI_COOLDOWN_ENEMY_SIZE = \"敌对技能冷却图标大小\"\nL_GUI_COOLDOWN_ENEMY_DIRECTION = \"敌对技能冷却图标方向\"\nL_GUI_COOLDOWN_ENEMY_EVERYWHERE = \"始终显示敌对技能冷却\"\nL_GUI_COOLDOWN_ENEMY_IN_BG = \"战场中显示敌对技能冷却\"\nL_GUI_COOLDOWN_ENEMY_IN_ARENA = \"竞技场中显示敌对技能冷却\"\nL.enemycooldown_show_inparty = \"组队时显示敌对技能冷却\"\nL.enemycooldown_class_color = \"按职业着色\"\n\n-- Pulse cooldowns options\nL_GUI_COOLDOWN_PULSE = \"技能冷却闪烁\"\nL_GUI_COOLDOWN_PULSE_SUBTEXT = \"显示在屏幕中央\"\nL_GUI_COOLDOWN_PULSE_ENABLE = \"技能冷却闪烁提示\"\nL_GUI_COOLDOWN_PULSE_SIZE = \"技能冷却闪烁大小\"\nL_GUI_COOLDOWN_PULSE_SOUND = \"播放声音提醒\"\nL_GUI_COOLDOWN_PULSE_ANIM_SCALE = \"动画缩放\"\nL_GUI_COOLDOWN_PULSE_HOLD_TIME = \"持续时间\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD = \"持续时间最小阈值\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = \"持续时间最小阈值\"\n\n-- Threat options\nL_GUI_THREAT = \"仇恨栏\"\nL_GUI_THREAT_SUBTEXT = \"仇恨威胁值统计(类似Omen)\"\nL_GUI_THREAT_ENABLE = \"仇恨栏\"\nL_GUI_THREAT_HEIGHT = \"仇恨栏高度\"\nL_GUI_THREAT_WIDTH = \"仇恨栏宽度\"\nL_GUI_THREAT_ROWS = \"仇恨栏数目\"\nL_GUI_THREAT_HIDE_SOLO = \"仅在队伍/团队中开启\"\n\n-- Top panel options\nL_GUI_TOP_PANEL = \"顶部信息条\"\nL_GUI_TOP_PANEL_SUBTEXT = \"管理顶部信息条\"\nL_GUI_TOP_PANEL_ENABLE = \"顶部信息条\"\nL_GUI_TOP_PANEL_MOUSE = \"鼠标悬停时显示顶部信息条\"\nL_GUI_TOP_PANEL_WIDTH = \"信息条宽度\"\nL_GUI_TOP_PANEL_HEIGHT = \"信息条高度\"\n\n-- Stats options\nL_GUI_STATS = \"信息条\"\nL_GUI_STATS_SUBTEXT = \"位于屏幕底部的信息条，键入 /ls 获取更多资讯。\"\nL_GUI_STATS_CLOCK = \"时钟\"\nL_GUI_STATS_LATENCY = \"延迟\"\nL_GUI_STATS_FPS = \"帧数\"\nL_GUI_STATS_EXPERIENCE = \"经验\"\nL_GUI_STATS_TALENTS_DESC = \"左键专精选单/右键拾取专精选单\"\nL_GUI_STATS_COORDS = \"坐标\"\nL_GUI_STATS_LOCATION = \"位置\"\nL_GUI_STATS_BG = \"战场分数\"\nL.stats_bottom_line = \"底部职业着色划线\"\nL_GUI_STATS_SUBHEADER_CURRENCY = \"货币(金币信息中显示)\"\nL_GUI_STATS_CURRENCY_ARCHAEOLOGY = \"考古\"\nL_GUI_STATS_CURRENCY_COOKING = \"烹饪\"\nL_GUI_STATS_CURRENCY_RAID = \"副本徽记\"\n\n-- Trade options\nL_GUI_TRADE = \"商业\"\nL_GUI_TRADE_SUBTEXT = \"专业和商业设罝\"\nL.trade_profession_tabs = \"专业介面快捷按鈕\"\nL.trade_profession_tabs_desc = \"专业/商业介面显示快捷按鈕\"\nL.trade_already_known = \"彩色显示已学会的\"\nL.trade_already_known_desc = \"彩色显示已学会的食谱/图纸/坐骑/宠物\"\nL.trade_disenchanting = \"快捷研磨\"\nL.trade_disenchanting_desc = \"Alt+左键包里物品即可快捷研磨/选矿/分解/开锁\"\nL.trade_sum_buyouts = \"总结拍卖物品的总金额\"\nL.trade_sum_buyouts_desc = \"拍卖界面显示拍卖物品的总金额\"\nL.trade_enchantment_scroll = \"附魔界面显示附魔卷轴数量\"\nL.trade_archaeology = \"考古学小助手\"\nL.trade_archaeology_desc = \"显示考古学各类文物的进度及符文石数量(键入 /arch 或点击小地图隐藏按键打开界面)\"\nL.trade_merchant_itemlevel = \"商人界面显示物品等级\"\nL.trade_merchant_itemlevel_desc = \"在商人界面显示武器装备的物品等级\"\n\n-- Miscellaneous options\nL_GUI_MISC_SUBTEXT = \"一些便捷的功能设置\"\nL.misc_shift_marking = \"鼠标目标标记\"\nL.misc_shift_marking_desc = \"鼠标指向目标Shift+左键显示团队标记菜单(仅限队伍/团队)\"\nL.misc_afk_spin_camera = \"AFK时旋转镜头\"\nL.misc_quest_auto_button = \"任务/道具自动按钮\"\nL.misc_quest_auto_button_desc = \"任务/道具自动按钮\"\nL.misc_raid_tools = \"团队工具\"\nL.misc_raid_tools_desc = \"团队管理便捷功能: 右键就位确认，中键角色检查，左键展开更多功能(仅限队长/助手)\"\nL.misc_item_level = \"角色界面显示物品等级\"\nL.misc_item_level_desc = \"角色界面显示武器装备的物品等级\"\nL.misc_click_cast = \"简单的点击施法绑定\"\nL.misc_click_cast_desc = \"开启后法术书有鼠标绑定界面可以进行设置\"\nL.misc_click_cast_filter = \"忽略玩家/目标框架点击施法\"\nL.misc_chars_currency = \"追踪所有角色的货币\"\nL.misc_chars_currency_desc = \"在货币界面中追踪所有角色的货币\"\nL.misc_hide_raid_button = \"输出布局最小化按钮\"\nL.misc_hide_raid_button_desc = \"按钮在团队框架左上方鼠标悬停显示\"\n"
  },
  {
    "path": "ShestakUI_Config/Locales/English.lua",
    "content": "local _, L = ...\n----------------------------------------------------------------------------------------\n--\tLocalization for enUS and enGB client\n----------------------------------------------------------------------------------------\nL_GUI_SET_SAVED_SETTTINGS = \"Set settings Per-Character\"\nL_GUI_SET_SAVED_SETTTINGS_DESC = \"Switch between a profile that applies to all characters and one that is unique to this character.\"\nL_GUI_RESET_CHAR = \"Are you sure you want to reset your character's settings for ShestakUI?\"\nL_GUI_RESET_ALL = \"Are you sure you want to reset all settings for ShestakUI\"\nL_GUI_PER_CHAR = \"Are you sure you want to change to or from 'Per Char Settings'?\"\nL_GUI_RESET_CAT = \"Are you sure you want to reset category's settings?\"\nL_GUI_RESET_CAT_DESC = \"Reset category's settings. \\nCTRL-click to reset all\"\nL_GUI_NEED_RELOAD = \"You need to reload the UI to apply your changes.\"\nL_GUI_LAYOUT = \"Change layout\"\nL_GUI_SPELL_LIST = \"List of spells\"\nL_GUI_SPELL_INPUT = \"Spell ID\"\nL_GUI_TIME_INPUT = \"Time\"\nL_GUI_EXPERT_MODE = \"Expert mode\"\nL_GUI_EXPERT_MODE_DESC = \"Custom editing of Lua profile\"\nL_GUI_RESET_SPELLS_DESC = \"CTRL-click to reset list\"\nL_GUI_INFO = \"Info & Help\"\nL_GUI_WIKI_URL = \"https://github.com/Wetxius/ShestakUI_Help/wiki/English\"\n\n-- Profile\nL.profile = \"Profile\"\nL.profile_title = \"Profile options\"\nL.profile_choose = \"Choose profile\"\nL.profile_options = \"Settings\"\nL.profile_movers = \"Moving elements\"\nL.profile_export = \"Export\"\nL.profile_import = \"Import\"\nL.profile_error_lib = \"To enable export and import - install WeakAuras\"\nL.profile_error_code = \"Error in imported code!\"\n\n-- General options\nL_GUI_GENERAL_SUBTEXT = \"These settings control the general user interface settings. Type in chat '/uihelp' for help.\"\nL_GUI_GENERAL_WELCOME_MESSAGE = \"Welcome message in chat\"\nL_GUI_GENERAL_AUTOSCALE = \"Auto UI Scale\"\nL_GUI_GENERAL_UISCALE = \"UI Scale (if auto-scale is disabled)\"\nL.general_subheader_blizzard = \"Blizzard UI elements\"\nL.general_error_filter = \"Error filtering\"\nL.general_error_blacklist = \"Blacklist\"\nL.general_error_whitelist = \"Whitelist\"\nL.general_error_combat = \"In combat\"\nL.general_error_none = \"None\"\nL.general_vehicle_mouseover = \"Vehicle frame on mouseover\"\nL.general_move_blizzard = \"Move some Blizzard frames\"\nL.general_color_picker = \"Improved ColorPicker\"\nL.general_color_picker_desc = \"Add copy/paste buttons and digit text entry for Blizzard color picker frame\"\nL.general_minimize_mouseover = \"Mouseover for quest minimize button\"\nL.general_hide_banner = \"Hide Boss Banner Loot Frame\"\nL.general_hide_talking_head = \"Hide Talking Head Frame\"\nL.general_hide_maw_buffs = \"Hide Maw Buffs frame in instances\"\n\n-- Media options\nL.media_border_color = \"Color for borders\"\nL.media_classborder_color = \"Color for class borders\"\nL.media_backdrop_color = \"Color for borders backdrop\"\nL.media_backdrop_alpha = \"Alpha for transparent backdrop\"\nL.media_texture = \"Main texture\"\nL.media_subheader_normal = \"Change general font\"\nL.media_subheader_pixel = \"Change secondary font\"\n\n-- Font options\nL.font = \"Fonts\"\nL.font_subtext = \"Customize individual fonts for elements. 'MONOCHROMEOUTLINE' for pixel fonts only.\"\nL.font_stats_font = \"Select font\"\nL.font_stats_font_style = \"Font flag\"\nL.font_stats_font_shadow = \"Font shadow\"\nL.font_subheader_stats = \"Stats font\"\nL.font_subheader_combat = \"Combat text font\"\nL.font_subheader_chat = \"Chat font\"\nL.font_subheader_chat_tabs = \"Chat tabs font\"\nL.font_subheader_action = \"Action bars font\"\nL.font_subheader_threat = \"Threat meter font\"\nL.font_subheader_raidcd = \"Raid cooldowns font\"\nL.font_subheader_cooldown = \"Cooldowns timer font\"\nL.font_subheader_loot = \"Loot font\"\nL.font_subheader_nameplates = \"Nameplates font\"\nL.font_subheader_unit = \"Unit frames font\"\nL.font_subheader_aura = \"Auras font\"\nL.font_subheader_filger = \"Filger bar font\"\nL.font_subheader_style = \"Stylization font\"\nL.font_subheader_bag = \"Bags font\"\nL.font_subheader_blizzard = \"System font size\"\nL.font_tooltip_header_font_size = \"Tooltip header\"\nL.font_tooltip_font_size = \"Tooltip text\"\nL.font_global_font = \"Disable Pixel font\"\n\n-- Skins options\nL_GUI_SKINS = \"Stylization\"\nL_GUI_SKINS_SUBTEXT = \"Change the appearance of the standard interface.\"\nL_GUI_SKINS_BLIZZARD = \"Enable styling Blizzard frames\"\nL_GUI_SKINS_MINIMAP_BUTTONS = \"Enable styling addons icons on minimap\"\nL_GUI_SKINS_SUBHEADER = \"Stylization of addons\"\nL.skins_ace3 = \"Ace3\"\nL.skins_atlasloot = \"AtlasLoot\"\nL.skins_bigwigs = \"BigWigs\"\nL.skins_blood_shield_tracker = \"BloodShieldTracker\"\nL.skins_capping = \"Capping\"\nL.skins_clique = \"Clique\"\nL.skins_cool_line = \"CoolLine\"\nL.skins_dbm = \"DBM\"\nL.skins_details = \"Details\"\nL.skins_dominos = \"Dominos\"\nL.skins_flyout_button = \"FlyoutButtonCustom\"\nL.skins_ls_toasts = \"ls: Toasts\"\nL.skins_mage_nuggets = \"MageNuggets\"\nL.skins_my_role_play = \"MyRolePlay\"\nL.skins_npcscan = \"NPCScan\"\nL.skins_nug_running = \"NugRunning\"\nL.skins_omen = \"Omen\"\nL.skins_opie = \"OPie\"\nL.skins_ovale = \"OvaleSpellPriority\"\nL.skins_postal = \"Postal\"\nL.skins_recount = \"Recount\"\nL.skins_rematch = \"Rematch\"\nL.skins_skada = \"Skada\"\nL.skins_tiny_dps = \"TinyDPS\"\nL.skins_vanaskos = \"VanasKoS\"\nL.skins_weak_auras = \"WeakAuras\"\nL.skins_minimap_buttons_mouseover = \"Addons icons on mouseover\"\nL.skins_bubbles = \"Skin Blizzard chat bubbles\"\n\n-- Unit Frames options\nL_GUI_UF_SUBTEXT = \"Customize player, target frames and etc.\"\nL_GUI_UF_ENABLE = \"Enable unit frames\"\nL_GUI_UF_OWN_COLOR = \"Set your color for health bars\"\nL_GUI_UF_UF_COLOR = \"Color of health bars\"\nL.unitframe_uf_color_bg = \"Color of health background\"\nL.unitframe_enemy_health_color = \"Enemy target healthbar is red\"\nL_GUI_UF_TOTAL_VALUE = \"Display of info text on player and target with XXXX/Total\"\nL_GUI_UF_COLOR_VALUE = \"Health/mana value is colored\"\nL_GUI_UF_BAR_COLOR_VALUE = \"Health bar color by current health remaining\"\nL_GUI_UF_LINES = \"Show Player and Target lines\"\nL_GUI_UF_SUBHEADER_CAST = \"Castbars\"\nL_GUI_UF_UNIT_CASTBAR = \"Show castbars\"\nL_GUI_UF_CASTBAR_ICON = \"Show castbar icons\"\nL_GUI_UF_CASTBAR_LATENCY = \"Castbar latency\"\nL_GUI_UF_CASTBAR_TICKS = \"Castbar ticks\"\nL_GUI_UF_SUBHEADER_FRAMES = \"Frames\"\nL_GUI_UF_SHOW_PET = \"Pet\"\nL_GUI_UF_SHOW_FOCUS = \"Focus\"\nL_GUI_UF_SHOW_TOT = \"Target of target\"\nL_GUI_UF_SHOW_BOSS = \"Bosses\"\nL_GUI_UF_BOSS_RIGHT = \"Boss frames on the right\"\nL_GUI_UF_SHOW_ARENA = \"Arena\"\nL_GUI_UF_ARENA_RIGHT = \"Arena frames on the right\"\nL_GUI_UF_BOSS_DEBUFFS = \"Number of debuffs\"\nL_GUI_UF_BOSS_DEBUFFS_DESC = \"Number of debuffs on the boss frames\"\nL_GUI_UF_BOSS_BUFFS = \"Number of buffs\"\nL_GUI_UF_BOSS_BUFFS_DESC = \"Number of buffs on the boss frames\"\nL.unitframe_icons_pvp = \"PvP status text\"\nL.unitframe_icons_pvp_desc = \"Mouseover PvP text(not icons) on player and target frames\"\nL_GUI_UF_ICONS_COMBAT = \"Combat icon\"\nL_GUI_UF_ICONS_RESTING = \"Resting icon\"\nL_GUI_UF_SUBHEADER_PORTRAIT = \"3D Portraits\"\nL_GUI_UF_PORTRAIT_ENABLE = \"Enable player/target 3D portraits\"\nL_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = \"Classcolor border for portraits\"\nL.unitframe_portrait_type = \"Type of portraits\"\nL.unitframe_portrait_type_icons = \"Class Icons\"\nL.unitframe_portrait_type_overlay = \"Overlay\"\nL_GUI_UF_PORTRAIT_HEIGHT = \"Portrait height\"\nL_GUI_UF_PORTRAIT_WIDTH = \"Portrait width\"\nL_GUI_UF_SUBHEADER_PLUGINS = \"Plugins\"\nL_GUI_UF_PLUGINS_GCD = \"Global cooldown spark on player frame\"\nL_GUI_UF_PLUGINS_SWING = \"Enable swing bar\"\nL.unitframe_plugins_reputation_bar = \"Reputation bar\"\nL.unitframe_plugins_reputation_bar_desc = \"Enable Reputation bar (left from player frame by mouseover, Middle-Click to lock visibility)\"\nL.unitframe_plugins_experience_bar = \"Experience bar\"\nL.unitframe_plugins_experience_bar_desc = \"Enable Experience bar (left from player frame by mouseover, Middle-Click to lock visibility)\"\nL_GUI_UF_PLUGINS_SMOOTH_BAR = \"Smooth bar\"\nL_GUI_UF_PLUGINS_ENEMY_SPEC = \"Show enemy talent spec in BG and Arena\"\nL_GUI_UF_PLUGINS_COMBAT_FEEDBACK = \"Combat text on player/target frame\"\nL_GUI_UF_PLUGINS_FADER = \"Fade unit frames\"\nL_GUI_UF_PLUGINS_DIMINISHING = \"Diminishing Returns icons on arena frames\"\nL_GUI_UF_PLUGINS_POWER_PREDICTION = \"Power cost prediction bar on player frame\"\nL.unitframe_plugins_absorbs = \"Absorbs value on player frame\"\nL.unitframe_subheader_player_width = \"Player and target frame size\"\nL.unitframe_player_width = \"Width\"\nL.unitframe_subheader_boss_width = \"Boss and arena frame size\"\nL.unitframe_extra_height_auto = \"Auto height for health/power\"\nL.unitframe_extra_height_auto_desc = \"Smart adjust depending on font size\"\nL.unitframe_extra_health_height = \"Additional height for health\"\nL.unitframe_extra_power_height = \"Additional height for power\"\nL.unitframe_subheader_castbar = \"Size of player and target castbar\"\nL.unitframe_castbar_height = \"Height\"\n\n-- Unit Frames Class bar options\nL_GUI_UF_PLUGINS_CLASS_BAR = \"Class Power Bars\"\nL_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = \"Control of special class resources.\"\nL_GUI_UF_PLUGINS_COMBO_BAR = \"Enable Rogue/Druid Combo bar\"\nL_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = \"Always show Combo bar for Druid\"\nL_GUI_UF_PLUGINS_COMBO_BAR_OLD = \"Show combo point on the target\"\nL_GUI_UF_PLUGINS_ARCANE_BAR = \"Enable Arcane Charge bar\"\nL_GUI_UF_PLUGINS_CHI_BAR = \"Enable Chi bar\"\nL_GUI_UF_PLUGINS_STAGGER_BAR = \"Enable Stagger bar (for Monk Tanks)\"\nL_GUI_UF_PLUGINS_HOLY_BAR = \"Enable Holy Power bar\"\nL_GUI_UF_PLUGINS_SHARD_BAR = \"Enable Shards bar\"\nL_GUI_UF_PLUGINS_RUNE_BAR = \"Enable Rune bar\"\nL_GUI_UF_PLUGINS_TOTEM_BAR = \"Enable Totem bar for Shaman\"\nL.unitframe_class_bar_totem_other = \"Enable Totem bar for other classes\"\nL.unitframe_class_bar_essence = \"Enable Essence bar for Evoker\"\n\n-- Raid Frames options\nL_GUI_UF_RAIDFRAMES_SUBTEXT = \"Customize the appearance of the raid frames.\"\nL_GUI_UF_BY_ROLE = \"Sorting players in group by role\"\nL_GUI_UF_AGGRO_BORDER = \"Aggro border\"\nL_GUI_UF_DEFICIT_HEALTH = \"Raid deficit health\"\nL_GUI_UF_SHOW_PARTY = \"Show party frames\"\nL_GUI_UF_SHOW_RAID = \"Show raid frames\"\nL.raidframe_layout = \"Raid layout\"\nL.raidframe_heal_layout = \"Heal\"\nL.raidframe_dps_layout = \"DPS\"\nL.raidframe_auto_layout = \"Auto\"\nL.raidframe_show_target = \"Show target frames\"\nL.raidframe_show_pet = \"Show pet frames\"\nL.raidframe_vertical_health = \"Vertical orientation of health\"\nL.raidframe_vertical_health_desc = \"Only for heal layout\"\nL_GUI_UF_ALPHA_HEALTH = \"Alpha of healthbars when 100%hp\"\nL_GUI_UF_SHOW_RANGE = \"Show range opacity for raidframes\"\nL_GUI_UF_RANGE_ALPHA = \"Alpha\"\nL_GUI_UF_RANGE_ALPHA_DESC = \"Alpha of unitframes when unit is out of range\"\nL_GUI_UF_SUBHEADER_RAIDFRAMES = \"Frames\"\nL_GUI_UF_SOLO_MODE = \"Show frames when solo\"\nL_GUI_UF_PLAYER_PARTY = \"Show player frame in party\"\nL_GUI_UF_SHOW_TANK = \"Show raid tanks\"\nL_GUI_UF_SHOW_TANK_TT = \"Show raid tanks target target\"\nL_GUI_UF_RAID_GROUP = \"Number of groups in raid\"\nL.raidframe_party_vertical = \"Vertical party frames\"\nL.raidframe_raid_groups_vertical = \"Vertical raid groups\"\nL.raidframe_raid_groups_vertical_desc = \"Only for heal layout\"\nL_GUI_UF_SUBHEADER_ICONS = \"Icons\"\nL_GUI_UF_ICONS_ROLE = \"Roles\"\nL_GUI_UF_ICONS_RAID_MARK = \"Raid marks\"\nL_GUI_UF_ICONS_READY_CHECK = \"Ready check\"\nL_GUI_UF_ICONS_LEADER = \"Leader and assistant\"\nL_GUI_UF_ICONS_SUMON = \"Summon icons\"\nL.raidframe_icons_phase = \"Phase\"\nL.raidframe_plugins_debuffhighlight_icon = \"Show dispellable debuff icon\"\nL.raidframe_plugins_aura_watch = \"Raid debuff icons (from the list)\"\nL.raidframe_plugins_aura_watch_timer = \"Timer on raid debuff icons\"\nL.raidframe_plugins_pvp_debuffs = \"Show PvP debuff icons (from the list)\"\nL_GUI_UF_PLUGINS_HEALCOMM = \"Show incoming heal on frame\"\nL.raidframe_plugins_over_absorb = \"Show over absorb bar on frame\"\nL.raidframe_plugins_over_heal_absorb = \"Show over heal absorb on frame\"\nL.raidframe_plugins_auto_resurrection = \"Auto cast resurrection\"\nL.raidframe_plugins_auto_resurrection_desc = \"Auto cast resurrection on middle-click (doesn't work with Clique)\"\nL.raidframe_hide_health_value = \"Hide raid health value\"\nL.raidframe_auto_position = \"Auto reposition raid frame\"\nL.raidframe_auto_position_desc = \"If there are more than 5 groups, the frame points changes. \\nOnly for heal layout\"\nL.raidframe_auto_position_dynamic = \"Dynamic\"\nL.raidframe_auto_position_static = \"Static\"\nL.raidframe_subheader_heal_size = \"Size for heal layout\"\nL.raidframe_heal_width = \"Frame width\"\nL.raidframe_heal_height = \"Frame height\"\nL.raidframe_heal_power_height = \"Power height\"\nL.raidframe_subheader_dps_size = \"Size for dps layout\"\nL.raidframe_dps_party_width = \"Party width\"\nL.raidframe_dps_party_height = \"Party height\"\nL.raidframe_dps_raid_width = \"Raid width\"\nL.raidframe_dps_raid_height = \"Raid height\"\nL.raidframe_dps_party_power_height = \"Party power height\"\nL.raidframe_dps_raid_power_height = \"Raid power height\"\n\n-- ActionBar options\nL_GUI_ACTIONBAR = \"Action Bars\"\nL_GUI_ACTIONBAR_ENABLE = \"Enable action bars\"\nL_GUI_ACTIONBAR_HOTKEY = \"Show hotkey on buttons\"\nL_GUI_ACTIONBAR_MACRO = \"Show macro name on buttons\"\nL_GUI_ACTIONBAR_GRID = \"Show empty action bar buttons\"\nL_GUI_ACTIONBAR_BUTTON_SIZE = \"Buttons size\"\nL_GUI_ACTIONBAR_BUTTON_SPACE = \"Buttons space\"\nL_GUI_ACTIONBAR_SPLIT_BARS = \"Split the fifth bar on two bars on 6 buttons\"\nL_GUI_ACTIONBAR_CLASSCOLOR_BORDER = \"Enable classcolor border for buttons\"\nL.actionbar_toggle_mode = \"Enable toggle mode\"\nL.actionbar_toggle_mode_desc = \"The quick change in the number of panels. For the lower panels, hover the mouse over the hidden area above the panels. For right panels, hover the mouse over the area below the panels.\"\nL_GUI_ACTIONBAR_HIDE_HIGHLIGHT = \"Hide proc highlight\"\nL_GUI_ACTIONBAR_BOTTOMBARS = \"Number of action bars on the bottom\"\nL_GUI_ACTIONBAR_RIGHTBARS = \"Number of action bars on right\"\nL.actionbar_bottombars_mouseover = \"Bottom bars on mouseover\"\nL_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = \"Right bars on mouseover\"\nL_GUI_ACTIONBAR_PETBAR_HIDE = \"Hide pet bar\"\nL_GUI_ACTIONBAR_PETBAR_HORIZONTAL = \"Enable horizontal pet bar\"\nL_GUI_ACTIONBAR_PETBAR_MOUSEOVER = \"Petbar on mouseover\"\nL_GUI_ACTIONBAR_STANCEBAR_HIDE = \"Hide stance bar\"\nL_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = \"Enable horizontal stance bar\"\nL.actionbar_stancebar_horizontal_desc = \"Located below the player's frame\"\nL_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = \"Stance bar on mouseover\"\nL_GUI_ACTIONBAR_MICROMENU = \"Enable micro menu\"\nL_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = \"Micro menu on mouseover\"\nL.actionbar_editor = \"Bars editor\"\nL.actionbar_editor_desc = \"Allow to move and change each panel individually\"\nL.actionbar_bar1_num = \"Number of buttons\"\nL.actionbar_bar1_row = \"Buttons per row\"\nL.actionbar_bar1_mouseover = \"Bar on mouseover\"\n\n-- Tooltip options\nL.tooltip = \"Tooltip\"\nL.tooltip_subtext = \"In this block, you can change the standard tips when mouseovering.\"\nL.tooltip_enable = \"Enable tooltip\"\nL.tooltip_shift_modifer = \"Show tooltip when Shift is pushed\"\nL.tooltip_cursor = \"Tooltip above cursor\"\nL.tooltip_item_icon = \"Item icon in tooltip\"\nL.tooltip_health_value = \"Numeral health value\"\nL.tooltip_hidebuttons = \"Hide tooltips for actions bars\"\nL.tooltip_hide_combat = \"Hide tooltip in combat\"\nL.tooltip_subheader = \"Plugins\"\nL.tooltip_talents = \"Show tooltip talents\"\nL.tooltip_show_shift = \"Show when Shift is pushed\"\nL.tooltip_show_shift_desc = \"Show items level and spec when Shift is pushed\"\nL.tooltip_achievements = \"Comparing achievements in tooltip\"\nL.tooltip_target = \"Target player in tooltip\"\nL.tooltip_title = \"Player title in tooltip\"\nL.tooltip_realm = \"Player realm name in tooltip\"\nL.tooltip_rank = \"Player guild-rank in tooltip\"\nL.tooltip_spell_id = \"Spell ID\"\nL.tooltip_average_lvl_desc = \"The average item level\"\nL.tooltip_raid_icon = \"Raid icon\"\nL.tooltip_who_targetting = \"Display who is targeting the unit that is in your party/raid\"\nL.tooltip_item_count = \"Item count in bags and bank\"\nL.tooltip_unit_role = \"Unit role\"\nL.tooltip_instance_lock = \"Your instance lock status in tooltip\"\nL.tooltip_mount = \"Source of mount\"\n\n-- Chat options\nL.chat_subtext = \"Here you can change the settings of the chat window.\"\nL.chat_enable = \"Enable chat\"\nL.chat_background = \"Enable chat background\"\nL.chat_background_alpha = \"Alpha of chat background\"\nL.chat_filter = \"Removing some systems spam\"\nL.chat_filter_desc = \"Duels, change talents, NPC dialogue in city\"\nL.chat_spam = \"Removing some players spam\"\nL.chat_spam_list = \"Black list\"\nL.chat_spam_list_desc = \"List of words (separated by space, lowercase letters) to hide messages\"\nL.chat_width = \"Chat width\"\nL.chat_height = \"Chat height\"\nL.chat_chat_bar = \"Lite Button Bar for switch chat channel\"\nL.chat_chat_bar_mouseover = \"Lite Button Bar on mouseover\"\nL.chat_whisp_sound = \"Sound when whisper\"\nL.chat_combatlog = \"Show Combat Log tab\"\nL.chat_tabs_mouseover = \"Chat tabs on mouseover\"\nL.chat_sticky = \"Remember last channel\"\nL.chat_damage_meter_spam = \"Merge damage meter spam in one line-link\"\nL.chat_loot_icons = \"Icons for loot\"\nL.chat_hide_combat = \"Hide chat in combat\"\nL.chat_custom_time_color = \"Enable custom timestamp coloring\"\nL.chat_time_color = \"Timestamp coloring\"\n\n-- Nameplate options\nL_GUI_NAMEPLATE_SUBTEXT = \"Nameplate settings\"\nL_GUI_NAMEPLATE_ENABLE = \"Enable nameplates\"\nL_GUI_NAMEPLATE_COMBAT = \"Automatically show nameplates in combat\"\nL_GUI_NAMEPLATE_HEALTH = \"Numeral health value\"\nL_GUI_NAMEPLATE_HEIGHT = \"Nameplate height\"\nL_GUI_NAMEPLATE_WIDTH = \"Nameplate width\"\nL.nameplate_alpha = \"Alpha\"\nL.nameplate_alpha_desc = \"Non-target nameplate alpha\"\nL.nameplate_ad_height = \"Additional height\"\nL.nameplate_ad_width = \"Additional width\"\nL.nameplate_ad_height_desc = \"Additional height for selected nameplate\"\nL.nameplate_ad_width_desc = \"Additional width for selected nameplate\"\nL_GUI_NAMEPLATE_CASTBAR_NAME = \"Show castbar name\"\nL_GUI_NAMEPLATE_CLASS_ICON = \"Class icons in PvP\"\nL_GUI_NAMEPLATE_NAME_ABBREV = \"Display abbreviated names\"\nL.nameplate_short_name = \"Replace names with short ones\"\nL.nameplate_clamp = \"Clamp nameplates\"\nL.nameplate_clamp_desc = \"Clamp nameplates to the top of the screen when outside of view\"\nL_GUI_NAMEPLATE_SHOW_DEBUFFS = \"Show your debuffs (from the list)\"\nL_GUI_NAMEPLATE_SHOW_BUFFS = \"Show dispellable enemy buffs and buffs from the list\"\nL_GUI_NAMEPLATE_DEBUFFS_SIZE = \"Auras size\"\nL_GUI_NAMEPLATE_HEALER_ICON = \"Show icon above enemy healers\"\nL_GUI_NAMEPLATE_TOTEM_ICONS = \"Show totems icon\"\nL.nameplate_target_glow = \"Show glow texture for target\"\nL.nameplate_only_name = \"Show only name for friendly units\"\nL.nameplate_quests = \"Show quest icon\"\nL.nameplate_cast_color = \"Show color border for casting important spells\"\nL.nameplate_kick_color = \"Change cast color if interrupt on cd\"\nL.nameplate_low_health_value = \"Health value\"\nL.nameplate_low_health = \"Low health highlight\"\nL_GUI_NAMEPLATE_THREAT = \"Enable threat feature, automatically changes by your role\"\nL_GUI_NAMEPLATE_GOOD_COLOR = \"Good threat color, varies depending if your a tank or dps/heal\"\nL_GUI_NAMEPLATE_NEAR_COLOR = \"Losing/Gaining threat color\"\nL_GUI_NAMEPLATE_BAD_COLOR = \"Bad threat color, varies depending if your a tank or dps/heal\"\nL_GUI_NAMEPLATE_OFFTANK_COLOR = \"Offtank threat color\"\nL.nameplate_extra_color = \"Explosive and Spiteful affix color\"\nL.nameplate_mob_color_enable = \"Change color for important mobs in dungeons\"\nL.nameplate_mob_color = \"Color for mobs\"\n\n-- Combat text options\nL_GUI_COMBATTEXT = \"Combat Text\"\nL_GUI_COMBATTEXT_SUBTEXT = \"For moving type in the chat '/xct'\"\nL_GUI_COMBATTEXT_ENABLE = \"Enable Combat Text\"\nL.combattext_blizz_head_numbers = \"Enable Blizzard combat text\"\nL.combattext_blizz_head_numbers_desc = \"Use Blizzard damage/healing output (above mob/player head)\"\nL.combattext_damage_style = \"Change default combat font\"\nL.combattext_damage_style_desc = \"Change default combat font above heads (you need to restart WoW to see changes)\"\nL_GUI_COMBATTEXT_DAMAGE = \"Show outgoing damage\"\nL_GUI_COMBATTEXT_HEALING = \"Show outgoing healing\"\nL.combattext_incoming = \"Show incoming damage and healing\"\nL_GUI_COMBATTEXT_HOTS = \"Show periodic healing effects in healing frame\"\nL_GUI_COMBATTEXT_OVERHEALING = \"Show outgoing overhealing\"\nL_GUI_COMBATTEXT_PET_DAMAGE = \"Show your pet damage\"\nL_GUI_COMBATTEXT_DOT_DAMAGE = \"Show damage from your dots\"\nL_GUI_COMBATTEXT_DAMAGE_COLOR = \"Display damage numbers depending on school of magic\"\nL_GUI_COMBATTEXT_CRIT_PREFIX = \"Symbol that will be added before crit\"\nL_GUI_COMBATTEXT_CRIT_POSTFIX = \"Symbol that will be added after crit\"\nL_GUI_COMBATTEXT_ICONS = \"Show outgoing damage icons\"\nL_GUI_COMBATTEXT_ICON_SIZE = \"Icon size\"\nL_GUI_COMBATTEXT_ICON_SIZE_DESC = \"Icon size of spells in outgoing damage frame, also has effect on dmg font size\"\nL_GUI_COMBATTEXT_TRESHOLD = \"Minimum damage to show in damage frame\"\nL_GUI_COMBATTEXT_HEAL_TRESHOLD = \"Minimum healing to show in incoming/outgoing healing messages\"\nL_GUI_COMBATTEXT_SCROLLABLE = \"Allows you to scroll frame lines with mousewheel\"\nL_GUI_COMBATTEXT_MAX_LINES = \"Max lines\"\nL_GUI_COMBATTEXT_MAX_LINES_DESC = \"Max lines to keep in scrollable mode (more lines = more memory)\"\nL_GUI_COMBATTEXT_TIME_VISIBLE = \"Time\"\nL_GUI_COMBATTEXT_TIME_VISIBLE_DESC = \"Time(seconds) a single message will be visible\"\nL_GUI_COMBATTEXT_DK_RUNES = \"Show Death knight's rune recharge\"\nL_GUI_COMBATTEXT_KILLINGBLOW = \"Tells you about your killing blows\"\nL.combattext_merge_aoe_spam = \"Merges spell spam into single message\"\nL.combattext_merge_aoe_spam_desc = \"Merges multiple AoE damage/heal spam into single message\"\nL_GUI_COMBATTEXT_MERGE_MELEE = \"Merges multiple auto attack damage spam\"\nL.combattext_merge_all = \"Merges all spells\"\nL_GUI_COMBATTEXT_DISPEL = \"Tells you about your dispels\"\nL_GUI_COMBATTEXT_INTERRUPT = \"Tells you about your interrupts\"\nL_GUI_COMBATTEXT_DIRECTION = \"Change scrolling direction from bottom to top\"\nL_GUI_COMBATTEXT_SHORT_NUMBERS = \"Use short numbers ('25.3k' instead of '25342')\"\n\n-- Auras/Buffs/Debuffs\nL_GUI_AURA_PLAYER_BUFF_SIZE = \"Buffs size\"\nL_GUI_AURA_PLAYER_BUFF_SIZE_DESC = \"Player buffs size\"\nL.aura_debuff_size = \"Debuffs size\"\nL_GUI_AURA_SHOW_SPIRAL = \"Spiral on aura icons\"\nL_GUI_AURA_SHOW_TIMER = \"Show cooldown timer on aura icons\"\nL_GUI_AURA_PLAYER_AURAS = \"Auras on player frame\"\nL_GUI_AURA_TARGET_AURAS = \"Auras on target frame\"\nL_GUI_AURA_FOCUS_DEBUFFS = \"DeBuffs on focus frame\"\nL_GUI_AURA_FOT_DEBUFFS = \"DeBuffs on focus target frame\"\nL_GUI_AURA_PET_DEBUFFS = \"DeBuffs on pet frame\"\nL_GUI_AURA_TOT_DEBUFFS = \"DeBuffs on targettarget frame\"\nL.aura_subheader_boss = \"Auras on boss frame\"\nL_GUI_AURA_PLAYER_AURA_ONLY = \"Only your debuff on target frame\"\nL_GUI_AURA_DEBUFF_COLOR_TYPE = \"Color debuff by type\"\nL_GUI_AURA_CAST_BY = \"Show who cast a buff/debuff in its tooltip\"\nL_GUI_AURA_CLASSCOLOR_BORDER = \"Enable classcolor border for player buffs\"\nL.aura_subheader_buffs = \"Player buffs\"\nL.aura_subheader_debuffs = \"Debuffs\"\n\n-- Bag options\nL_GUI_BAGS = \"Bags\"\nL_GUI_BAGS_SUBTEXT = \"Right click on the close button to open the menu. To move the bags, hold down Shift - click.\"\nL_GUI_BAGS_ENABLE = \"Enable bags\"\nL_GUI_BAGS_ILVL = \"Show item level for weapons and armor\"\nL.bag_new_items = \"Show animation for new items\"\nL.bag_filter = \"Always show filter buttons\"\nL_GUI_BAGS_BUTTON_SIZE = \"Buttons size\"\nL_GUI_BAGS_BUTTON_SPACE = \"Buttons space\"\nL_GUI_BAGS_BANK = \"Number of columns in bank\"\nL_GUI_BAGS_BAG = \"Number of columns in main bag\"\n\n-- Minimap options\nL_GUI_MINIMAP_SUBTEXT = \"Minimap settings.\"\nL_GUI_MINIMAP_ENABLE = \"Enable minimap\"\nL.minimap_on_top = \"Move minimap on top right corner\"\nL_GUI_MINIMAP_ICON = \"Tracking icon\"\nL_GUI_GARRISON_ICON = \"Covenant icon\"\nL_GUI_MINIMAP_SIZE = \"Map size\"\nL_GUI_MINIMAP_HIDE_COMBAT = \"Hide minimap in combat\"\nL_GUI_MINIMAP_TOGGLE_MENU = \"Show toggle menu\"\nL.minimap_bg_map_stylization = \"BG map stylization\"\nL.minimap_fog_of_war = \"Remove fog of war on World Map\"\n\n-- Loot options\nL_GUI_LOOT_SUBTEXT = \"Settings for loot frame.\"\nL_GUI_LOOT_ENABLE = \"Enable loot frame\"\nL_GUI_LOOT_ROLL_ENABLE = \"Enable group loot frame\"\nL_GUI_LOOT_ICON_SIZE = \"Icon size\"\nL_GUI_LOOT_WIDTH = \"Loot frame width\"\nL_GUI_LOOT_AUTOGREED = \"Enable auto-greed/disenchant for green item at max level\"\nL_GUI_LOOT_AUTODE = \"Auto confirm disenchant\"\nL.loot_faster_loot = \"Faster looting\"\nL.loot_faster_loot_desc = \"Works only if enabled auto loot\"\n\n-- Filger\nL_GUI_FILGER = \"Timers (Filger)\"\nL_GUI_FILGER_SUBTEXT = \"Filger - analogue WeakAuras, but more simple and easy. Allows you to display in the form of icons and bars your auras and timers.\"\nL_GUI_FILGER_ENABLE = \"Enable Filger\"\nL_GUI_FILGER_TEST_MODE = \"Test icon mode\"\nL_GUI_FILGER_MAX_TEST_ICON = \"Number of icons in test mode\"\nL_GUI_FILGER_SHOW_TOOLTIP = \"Show tooltip\"\nL.filger_subheader_elements = \"Showing elements\"\nL.filger_show_buff = \"Player buffs\"\nL.filger_show_proc = \"Player procs\"\nL.filger_show_debuff = \"Debuffs on target\"\nL.filger_show_aura_bar = \"Aura bars on target\"\nL.filger_show_special = \"Special buffs on player\"\nL.filger_show_pvp_player = \"SPvP debuffs on player\"\nL.filger_show_pvp_target = \"PvP auras on target\"\nL.filger_show_cd = \"Cooldowns\"\nL.filger_subheader_size = \"Icons size\"\nL.filger_subheader_test = \"Test mode\"\nL_GUI_FILGER_EXPIRATION = \"Sort cooldowns by expiration time\"\nL_GUI_FILGER_BUFFS_SIZE = \"Buffs size\"\nL_GUI_FILGER_COOLDOWN_SIZE = \"Cooldowns size\"\nL_GUI_FILGER_PVP_SIZE = \"PvP auras size\"\nL.filger_buffs_space = \"Buffs space\"\nL.filger_pvp_space = \"PvP auras space\"\nL.filger_cooldown_space = \"Cooldowns space\"\nL.filger_subheader_spells = \"Adding new spells\"\nL.filger_category_list = \"Spell list category\"\n\n-- Announcements options\nL_GUI_ANNOUNCEMENTS = \"Announcements\"\nL_GUI_ANNOUNCEMENTS_SUBTEXT = \"Settings that add chat announcements about spells or items.\"\nL.announcements_drinking = \"Arena enemy is drinking\"\nL.announcements_interrupts = \"Interrupts\"\nL.announcements_interrupts_desc = \"Announce in party/raid when you interrupt\"\nL.announcements_spells = \"Cast spells\"\nL.announcements_spells_desc = \"Announce in party/raid when you cast some spell (from the list)\"\nL.announcements_spells_from_all = \"From all members\"\nL.announcements_spells_from_all_desc = \"Check spells cast from all members\"\nL.announcements_toys = \"Cast some annoying toys\"\nL.announcements_pull_countdown = \"Pull countdown\"\nL.announcements_pull_countdown_desc = \"Pull countdown announce (/pc #)\"\nL.announcements_flask_food = \"Usage of flasks and food\"\nL.announcements_flask_food_desc = \"Announce the usage of flasks and food (/ffcheck)\"\nL.announcements_flask_food_raid = \"Announce to raid channel\"\nL.announcements_flask_food_auto = \"Auto check when ReadyCheck\"\nL.announcements_feasts = \"Feasts/Souls/Repair Bots\"\nL.announcements_portals = \"Portals/Ritual of Summoning\"\nL.announcements_subheader_self = \"Self announce\"\nL.announcements_bad_gear = \"Check your bad gear\"\nL.announcements_bad_gear_desc = \"Check your bad gear in instance (fishing pole, from the list)\"\nL.announcements_safari_hat = \"Safari Hat\"\nL.announcements_safari_hat_desc_desc = \"Check Safari Hat when starting Pet Battle\"\n\n-- Automation options\nL_GUI_AUTOMATION = \"Automation\"\nL_GUI_AUTOMATION_SUBTEXT = \"This block contains settings that facilitate the routine.\"\nL.automation_release = \"Auto release the spirit in battlegrounds\"\nL.automation_screenshot = \"Take screenshot when player get achievement\"\nL.automation_solve_artifact = \"Auto popup for solve artifact\"\nL.automation_solve_artifact_desc = \"If there are enough fragments for an artifact, a popup will appear to solve it.\"\nL.automation_accept_invite = \"Auto accept invite\"\nL.automation_decline_duel = \"Auto decline duel (/disduel to temporarily disable)\"\nL.automation_accept_quest = \"Auto accept quest (disabled if hold Shift)\"\nL.automation_auto_collapse = \"Auto collapse Objective Tracker\"\nL.automation_auto_collapse_raid = \"In Instance\"\nL.automation_auto_collapse_reload = \"After reload\"\nL.automation_auto_collapse_scenario = \"Partially\"\nL.automation_skip_cinematic = \"Auto skip cinematics/movies (disabled if hold Ctrl)\"\nL.automation_auto_role = \"Auto set your role\"\nL.automation_cancel_bad_buffs = \"Auto cancel annoying holiday buffs (from the list)\"\nL.automation_tab_binder = \"Auto change 'Tab' key binding in PvP\"\nL.automation_tab_binder_desc = \"'Tab' key target only enemy players when in PvP zones, ignores pets and mobs\"\nL.automation_logging_combat = \"Auto enables combat log text file in raid instances\"\nL.automation_buff_on_scroll = \"Cast buff on mouse scroll (from the list)\"\nL.automation_buff_on_scroll_desc = \"If the buff from the list is not applied to the player, it will cast by the mouse scroll\"\nL.automation_open_items = \"Auto opening of items in bag\"\nL.automation_resurrection = \"Confirm resurrection\"\nL.automation_summon = \"Confirm summon\"\nL.automation_whisper_invite = \"Auto invite when whisper keyword\"\nL.automation_invite_keyword = \"List of keyword (separated by space)\"\nL.automation_invite_keyword_desc = \"When player whisper you keyword he will be invited in your group\"\n\n-- Buffs reminder options\nL_GUI_REMINDER = \"Buffs Reminder\"\nL_GUI_REMINDER_SUBTEXT = \"Display of missed auras.\"\nL_GUI_REMINDER_SOLO_ENABLE = \"Show missing self buffs\"\nL_GUI_REMINDER_SOLO_SOUND = \"Warning sound notification for self buffs reminder\"\nL_GUI_REMINDER_SOLO_SIZE = \"Icon size\"\nL_GUI_REMINDER_SOLO_SIZE_DESC = \"Self buffs icon size\"\nL_GUI_REMINDER_SUBHEADER = \"Raid buffs\"\nL_GUI_REMINDER_RAID_ENABLE = \"Show missing raid buffs\"\nL_GUI_REMINDER_RAID_ALWAYS = \"Show buffs reminder always (default show only in raid)\"\nL_GUI_REMINDER_RAID_SIZE = \"Icon size\"\nL_GUI_REMINDER_RAID_SIZE_DESC = \"Raid buffs icon size\"\nL_GUI_REMINDER_RAID_ALPHA = \"Transparent\"\nL_GUI_REMINDER_RAID_ALPHA_DESC = \"Transparent icons when the buffs is present\"\n\n-- Raid cooldowns options\nL_GUI_COOLDOWN_RAID = \"Raid Cooldowns\"\nL_GUI_COOLDOWN_RAID_SUBTEXT = \"Tracking raid abilities in the upper left corner.\"\nL_GUI_COOLDOWN_RAID_ENABLE = \"Enable raid cooldowns\"\nL_GUI_COOLDOWN_RAID_HEIGHT = \"Bars height\"\nL_GUI_COOLDOWN_RAID_WIDTH = \"Bars width\"\nL_GUI_COOLDOWN_RAID_SORT = \"Raid cooldowns sort upwards bars\"\nL_GUI_COOLDOWN_RAID_EXPIRATION = \"Sort by expiration time\"\nL_GUI_COOLDOWN_RAID_SHOW_SELF = \"Show self cooldowns\"\nL_GUI_COOLDOWN_RAID_ICONS = \"Raid cooldowns icons\"\nL_GUI_COOLDOWN_RAID_IN_RAID = \"Show raid cooldowns in raid zone\"\nL_GUI_COOLDOWN_RAID_IN_PARTY = \"Show raid cooldowns in party zone\"\nL_GUI_COOLDOWN_RAID_IN_ARENA = \"Show raid cooldowns in arena zone\"\n\n-- Enemy cooldowns options\nL_GUI_COOLDOWN_ENEMY = \"Enemy Cooldowns\"\nL_GUI_COOLDOWN_ENEMY_SUBTEXT = \"Tracking enemy abilities as icons above your spell casting bar.\"\nL_GUI_COOLDOWN_ENEMY_ENABLE = \"Enable enemy cooldowns\"\nL_GUI_COOLDOWN_ENEMY_SIZE = \"Enemy cooldowns icon size\"\nL_GUI_COOLDOWN_ENEMY_DIRECTION = \"Enemy cooldowns icon direction\"\nL_GUI_COOLDOWN_ENEMY_EVERYWHERE = \"Show everywhere enemy cooldowns\"\nL_GUI_COOLDOWN_ENEMY_IN_BG = \"Show enemy cooldowns in bg zone\"\nL_GUI_COOLDOWN_ENEMY_IN_ARENA = \"Show enemy cooldowns in arena zone\"\nL.enemycooldown_show_inparty = \"Show in party zone for allies\"\nL.enemycooldown_class_color = \"Enable classcolor border\"\n\n-- Pulse cooldowns options\nL_GUI_COOLDOWN_PULSE = \"Pulse Cooldowns\"\nL_GUI_COOLDOWN_PULSE_SUBTEXT = \"Track your cd using a pulse icon in the center of the screen.\"\nL_GUI_COOLDOWN_PULSE_ENABLE = \"Show cooldowns pulse\"\nL_GUI_COOLDOWN_PULSE_SIZE = \"Cooldowns pulse icon size\"\nL_GUI_COOLDOWN_PULSE_SOUND = \"Warning sound notification\"\nL_GUI_COOLDOWN_PULSE_ANIM_SCALE = \"Animation scaling\"\nL_GUI_COOLDOWN_PULSE_HOLD_TIME = \"Max opacity hold time\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD = \"Threshold time\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = \"Minimal threshold time\"\n\n-- Threat options\nL_GUI_THREAT = \"Threat Bars\"\nL_GUI_THREAT_SUBTEXT = \"Display of the threat list (a simple analogue of Omen).\"\nL_GUI_THREAT_ENABLE = \"Enable threat bars\"\nL_GUI_THREAT_HEIGHT = \"Threat bars height\"\nL_GUI_THREAT_WIDTH = \"Threat bars width\"\nL_GUI_THREAT_ROWS = \"Number of threat bars\"\nL_GUI_THREAT_HIDE_SOLO = \"Show only in party/raid\"\n\n-- Top panel options\nL_GUI_TOP_PANEL = \"Top Panel\"\nL_GUI_TOP_PANEL_SUBTEXT = \"Manage built-in top panel with information.\"\nL_GUI_TOP_PANEL_ENABLE = \"Enable top panel\"\nL_GUI_TOP_PANEL_MOUSE = \"Top panel on mouseover\"\nL_GUI_TOP_PANEL_WIDTH = \"Panel width\"\nL_GUI_TOP_PANEL_HEIGHT = \"Panel height\"\n\n-- Stats options\nL_GUI_STATS = \"Stats\"\nL_GUI_STATS_SUBTEXT = \"Statistics blocks located at the bottom of the screen. Type in the chat '/ls' for info.\"\nL_GUI_STATS_CLOCK = \"Clock\"\nL_GUI_STATS_LATENCY = \"Latency\"\nL_GUI_STATS_FPS = \"FPS\"\nL_GUI_STATS_EXPERIENCE = \"Experience\"\nL_GUI_STATS_TALENTS_DESC = \"Date-text allows you to change the spec and loot on click\"\nL_GUI_STATS_COORDS = \"Coords\"\nL_GUI_STATS_LOCATION = \"Location\"\nL_GUI_STATS_BG = \"Battleground\"\nL.stats_bottom_line = \"Bottom classcolor line\"\nL_GUI_STATS_SUBHEADER_CURRENCY = \"Currency (displayed in gold data text)\"\nL_GUI_STATS_CURRENCY_ARCHAEOLOGY = \"Archaeology Fragments\"\nL_GUI_STATS_CURRENCY_COOKING = \"Cooking Awards\"\nL_GUI_STATS_CURRENCY_RAID = \"Raid Seals\"\n\n-- Trade options\nL_GUI_TRADE = \"Trade\"\nL_GUI_TRADE_SUBTEXT = \"Settings related to professions and trade\"\nL.trade_profession_tabs = \"Professions tabs\"\nL.trade_profession_tabs_desc = \"Professions tabs on tradeskill/trade frames\"\nL.trade_already_known = \"Colorizes already known items\"\nL.trade_already_known_desc = \"Colorizes recipes/mounts/pets/toys that is already known\"\nL.trade_disenchanting = \"Quick Disenchanting\"\nL.trade_disenchanting_desc = \"Milling, Prospecting and Disenchanting by Alt + click\"\nL.trade_sum_buyouts = \"Sum up all current auctions\"\nL.trade_sum_buyouts_desc = \"At auctions tab shows sum up all current auctions\"\nL.trade_enchantment_scroll = \"Enchantment scroll on TradeSkill frame\"\nL.trade_archaeology = \"Archaeology tracker\"\nL.trade_archaeology_desc = \"Archaeology tracker ('/arch' or right mouseover minimap button to show)\"\nL.trade_merchant_itemlevel = \"Item level in merchant\"\nL.trade_merchant_itemlevel_desc = \"Show item level for weapons and armor in merchant\"\n\n-- Miscellaneous options\nL_GUI_MISC_SUBTEXT = \"Other settings that add interesting features.\"\nL.misc_shift_marking = \"Marks mouseover target\"\nL.misc_shift_marking_desc = \"Marks mouseover target when you push Shift (only in group)\"\nL.misc_afk_spin_camera = \"Spin camera while afk\"\nL.misc_quest_auto_button = \"Quest items auto button\"\nL.misc_quest_auto_button_desc = \"The button for quest items above the minimap (from the list)\"\nL.misc_item_level = \"Item level on slot buttons\"\nL.misc_item_level_desc = \"Item level on character/inspect slot buttons\"\nL.misc_raid_tools = \"Raid tools\"\nL.misc_raid_tools_desc = \"Button at the top of the screen for ready check (Left-click), checking roles (Middle-click), setting marks, etc. (for leader and assistants)\"\nL.misc_click_cast = \"Simple click2cast spell binder\"\nL.misc_click_cast_desc = \"Allows you to assign spells (analog Clique) to the mouse buttons. Setup through the side bookmark in the spell book\"\nL.misc_click_cast_filter = \"Ignore Player and Target frames\"\nL.misc_chars_currency = \"Tracks your currency tokens across multiple characters\"\nL.misc_chars_currency_desc = \"Hover over the icon of the required currency in the character window to display information in the tooltip\"\nL.misc_hide_raid_button = \"Button to hide raid frames in dps layout\"\nL.misc_hide_raid_button_desc = \"The button is displayed by hovering the mouse in the upper left corner\"\n"
  },
  {
    "path": "ShestakUI_Config/Locales/French.lua",
    "content": "local _, L = ...\nif GetLocale() ~= \"frFR\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for frFR client\n--\tTranslation: Cranan, Puree, AlbertDuval, Skyzo-be\n----------------------------------------------------------------------------------------\nL_GUI_SET_SAVED_SETTTINGS = \"Définir les paramètres par personnage\"\nL_GUI_SET_SAVED_SETTTINGS_DESC = \"Basculez entre un profil qui s’applique à tous les personnages et un profil qui est unique à ce personnage.\"\nL_GUI_RESET_CHAR = \"Êtes-vous sûr de vouloir réinitialiser les paramètres de votre personnage pour ShestakUI ?\"\nL_GUI_RESET_ALL = \"Voulez-vous vraiment réinitialiser tous les paramètres de ShestakUI\"\nL_GUI_PER_CHAR = \"Modifier la configuration du personnage ?\"\nL_GUI_RESET_CAT = \"Êtes-vous sûr de vouloir réinitialiser les paramètres de la catégorie ?\"\nL_GUI_RESET_CAT_DESC = \"Clique pour réinitialiser les paramètres de la catégorie ou \\nCTRL+clique pour réinitialiser les paramètres de votre personnage.\"\nL_GUI_NEED_RELOAD = \"Vous devez recharger l'Interface pour appliquer vos changements.\"\nL_GUI_LAYOUT = \"Changé la disposition\"\nL_GUI_SPELL_LIST = \"Liste des sorts\"\nL_GUI_SPELL_INPUT = \"ID du sort\"\nL_GUI_TIME_INPUT = \"Temps\"\nL_GUI_EXPERT_MODE = \"Mode expert\"\nL_GUI_EXPERT_MODE_DESC = \"Modification personnalisée du profil Lua\"\nL_GUI_RESET_SPELLS_DESC = \"CTRL+Click pour réinitialiser la liste\"\n\n-- Profile\nL.profile = \"Profile\" -- Need review\nL.profile_title = \"Profile options\" -- Need review\nL.profile_choose = \"Choose profile\" -- Need review\nL.profile_options = \"Settings\" -- Need review\nL.profile_movers = \"Moving elements\" -- Need review\nL.profile_export = \"Export\" -- Need review\nL.profile_import = \"Import\" -- Need review\nL.profile_error_lib = \"To enable export and import - install WeakAuras\" -- Need review\nL.profile_error_code = \"Error in imported code!\" -- Need review\n\n-- General options\nL_GUI_GENERAL_SUBTEXT = \"Ces paramètres contrôlent les paramètres généraux de l’interface utilisateur. \\nTapez '/uihelp' dans le chat pour obtenir de l’aide.\"\nL_GUI_GENERAL_WELCOME_MESSAGE = \"Message de bienvenue dans le chat\"\nL_GUI_GENERAL_AUTOSCALE = \"Mise à l'échelle automatique de l’interface utilisateur\"\nL_GUI_GENERAL_UISCALE = \"Mettre l'interface à l'échelle \\n(si 'Mise à l'échelle automatique de l’interface utilisateur' est désactivée)\"\nL.general_subheader_blizzard = \"Éléments de l’interface utilisateur Blizzard\"\nL.general_error_filter = \"Filtrage des erreurs\"\nL.general_error_blacklist = \"Liste noire\"\nL.general_error_whitelist = \"Liste blanche\"\nL.general_error_combat = \"En combat\"\nL.general_error_none = \"Aucun\"\nL.general_vehicle_mouseover = \"Cadre de véhicule au survol de la souris\"\nL.general_move_blizzard = \"Autorise le déplacement de certains fenêtres de l'interface Blizzard\"\nL.general_color_picker = \"Amélioration du sélecteur de couleurs\"\nL.general_color_picker_desc = \"Ajoute des boutons de copier/coller et une entrée de texte numérique pour le cadre du sélecteur de couleur Blizzard\"\nL.general_minimize_mouseover = \"Bouton pour réduire la fenêtre de quête au survol de la souris\"\nL.general_hide_banner = \"Masquer la bannière du cadre de butin de Boss\"\nL.general_hide_talking_head = \"Masquer la fenêtre de dialogue des PNJ's\"\nL.general_hide_maw_buffs = \"Masquer le cadre des buffs de l'antre en instance\"\n\n-- Media options\nL.media_border_color = \"   Couleur des bordures\"\nL.media_classborder_color = \"   Couleur pour les bordures de classe\"\nL.media_backdrop_color = \"   Couleur pour le fond des bordures\"\nL.media_backdrop_alpha = \"Transparence du fond des bordures\"\nL.media_texture = \"Texture principale\"\nL.media_subheader_normal = \"Modifier la police principale\"\nL.media_subheader_pixel = \"Modifier la police secondaire\"\n\n-- Font options\nL.font = \"Polices\"\nL.font_subtext = \"Personnalisez la police pour chaque élément. \\nAttention 'MONOCHROMEOUTLINE' ne fonctionne que pour 'Pixel Font'\"\nL.font_stats_font = \"Selectionner la police\"\nL.font_stats_font_style = \"Contour de la police\"\nL.font_stats_font_shadow = \"Activer l'ombre\"\nL.font_subheader_stats = \"Police des Statistiques\"\nL.font_subheader_combat = \"Police des Textes de Combat\"\nL.font_subheader_chat = \"Police du chat\"\nL.font_subheader_chat_tabs = \"Police des onglets du chat\"\nL.font_subheader_action = \"Police des Barres d'Actions\"\nL.font_subheader_threat = \"Police de l'indicateur de menace\"\nL.font_subheader_raidcd = \"Police des temps de recharde du Raid\"\nL.font_subheader_cooldown = \"Police des temps de recharge\"\nL.font_subheader_loot = \"Police du Butin\"\nL.font_subheader_nameplates = \"Police des Barres de Noms\"\nL.font_subheader_unit = \"Police des Barres de vie\"\nL.font_subheader_aura = \"Police des Auras\"\nL.font_subheader_filger = \"Police de Filger\"\nL.font_subheader_style = \"Police de la stylisation\"\nL.font_subheader_bag = \"Police des Sacs\"\nL.font_subheader_blizzard = \"Taille de la police de l’infobulle\"\nL.font_tooltip_header_font_size = \"En-tête de l’infobulle\"\nL.font_tooltip_font_size = \"Texte de l’infobulle\"\nL.font_global_font = \"Désactiver Pixel Font\"\n\n-- Skins options\nL_GUI_SKINS = \"Personnalisation\"\nL_GUI_SKINS_SUBTEXT = \"Change l’apparence de l’interface standard.\"\nL_GUI_SKINS_BLIZZARD = \"Activer la personnalisation des fenêtres Blizzard\"\nL_GUI_SKINS_MINIMAP_BUTTONS = \"Activer la personnalisation des icônes de la minimap\"\nL_GUI_SKINS_SUBHEADER = \"Change l’apparence des addons\"\nL.skins_minimap_buttons_mouseover = \"Icônes de la minimap au survol de la souris\"\nL.skins_bubbles = \"Skin de l'infobulle\"\n\n-- Unit Frames options\nL_GUI_UF_SUBTEXT = \"Personnalisez le cadre du joueur, de la cible, etc...\"\nL_GUI_UF_ENABLE = \"Activer les cadres d'unité\"\nL_GUI_UF_OWN_COLOR = \"Définissez votre couleur pour les barres de santé\"\nL_GUI_UF_UF_COLOR = \"   Couleur de la barre\"\nL.unitframe_uf_color_bg = \"   Couleur du fond\"\nL.unitframe_enemy_health_color = \"La barre de santé de la cible ennemie est rouge\"\nL_GUI_UF_TOTAL_VALUE = \"Afficher le texte de la vie des joueur/cible avec XXXX/Total\"\nL_GUI_UF_COLOR_VALUE = \"La valeur santé/mana est colorée\"\nL_GUI_UF_BAR_COLOR_VALUE = \"Couleur de la barre de santé selon la santé actuelle restante\"\nL_GUI_UF_LINES = \"Afficher les lignes autour du cadre du joueur et de la cible\"\nL_GUI_UF_SUBHEADER_CAST = \"Barre d'incantation\"\nL_GUI_UF_UNIT_CASTBAR = \"Activer la barre d'incantation\"\nL_GUI_UF_CASTBAR_ICON = \"Voir l'icone de sort sur la barre d'incantation\"\nL_GUI_UF_CASTBAR_LATENCY = \"Voir la latence sur la barre d'incantation\"\nL_GUI_UF_CASTBAR_TICKS = \"Affiche les ticks des sorts sur la barre d'incantation\"\nL_GUI_UF_SUBHEADER_FRAMES = \"Cadres d'unités\"\nL_GUI_UF_SHOW_PET = \"Afficher le cadre du familier\"\nL_GUI_UF_SHOW_FOCUS = \"Afficher le cadre du focus\"\nL_GUI_UF_SHOW_TOT = \"Afficher le cadre de la cible de la cible\"\nL_GUI_UF_SHOW_BOSS = \"Afficher le cadre de boss\"\nL_GUI_UF_BOSS_RIGHT = \"Afficher le cadre de boss à droite\"\nL_GUI_UF_SHOW_ARENA = \"Afficher le cadre d'arène\"\nL_GUI_UF_ARENA_RIGHT = \"Afficher le cadre d'arène sur la droite\"\nL_GUI_UF_BOSS_DEBUFFS = \"Nombre d'affaiblissement\"\nL_GUI_UF_BOSS_DEBUFFS_DESC = \"Afficher le nombre d'affaiblissement sur le cadre des boss\"\nL_GUI_UF_BOSS_BUFFS = \"Nombre de buff\"\nL_GUI_UF_BOSS_BUFFS_DESC = \"Afficher le nombre de buff sur le cadre de boss\"\nL.unitframe_icons_pvp = \"Texte d’état de JcJ\"\nL.unitframe_icons_pvp_desc = \"Texte JcJ au survol de la souris pour le cadre du joueur et de la cible\"\nL_GUI_UF_ICONS_COMBAT = \"Icône de combat\"\nL_GUI_UF_ICONS_RESTING = \"Icône de repos\"\nL_GUI_UF_SUBHEADER_PORTRAIT = \"Portraits\"\nL_GUI_UF_PORTRAIT_ENABLE = \"Activer les portraits du joueur et de la cible\"\nL_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = \"Activer la bordure aux couleurs de la classe\"\nL.unitframe_portrait_type = \"Type de portraits\"\nL.unitframe_portrait_type_icons = \"Icônes de classe\"\nL.unitframe_portrait_type_overlay = \"Overlay\"\nL_GUI_UF_PORTRAIT_HEIGHT = \"Hauteur des portraits\"\nL_GUI_UF_PORTRAIT_WIDTH = \"Largeur des portraits\"\nL_GUI_UF_SUBHEADER_PLUGINS = \"Plugins\"\nL_GUI_UF_PLUGINS_GCD = \"Scintillement du cooldown global sur le cadre du joueur\"\nL_GUI_UF_PLUGINS_SWING = \"Barre d'attaque automatique / tir automatique\"\nL.unitframe_plugins_reputation_bar = \"Barre de réputation\"\nL.unitframe_plugins_reputation_bar_desc = \"Activer la barre de réputation (à gauche du cadre du joueur au survol de la souris, clic du milieu pour verrouiller la visibilité)\"\nL.unitframe_plugins_experience_bar = \"Barre d'expérience\"\nL.unitframe_plugins_experience_bar_desc = \"Activer la barre d'expérience (à gauche du cadre du joueur au survol de la souris, clic du milieu pour verrouiller la visibilité)\"\nL_GUI_UF_PLUGINS_SMOOTH_BAR = \"Lissage des barres\"\nL_GUI_UF_PLUGINS_ENEMY_SPEC = \"Afficher la spécialisation de l’ennemi dans les champs de bataille et en arène\"\nL_GUI_UF_PLUGINS_COMBAT_FEEDBACK = \"Texte de combat sur le cadre joueur/cible\"\nL_GUI_UF_PLUGINS_FADER = \"Disparition des cadres d'unités\"\nL_GUI_UF_PLUGINS_DIMINISHING = \"Icône de rendement décroissants sur les cadres d'arène\"\nL_GUI_UF_PLUGINS_POWER_PREDICTION = \"Prédiction du coût des sorts sur le cadre du joueur\"\nL.unitframe_plugins_absorbs = \"Valeur d'absorption sur le cadre du joueur\"\nL.unitframe_subheader_player_width = \"Taille du cadre du joueur et de la cible\"\nL.unitframe_player_width = \"Largeur\"\nL.unitframe_subheader_boss_width = \"Taille du cadre du boss et de l’aréne\"\nL.unitframe_extra_height_auto = \"Hauteur automatique pour la santé/puissance\"\nL.unitframe_extra_height_auto_desc = \"Ajustement intelligent en fonction de la taille de la police\"\nL.unitframe_extra_health_height = \"Hauteur supplémentaire pour la santé\"\nL.unitframe_extra_power_height = \"Hauteur supplémentaire pour la puissance\"\nL.unitframe_subheader_castbar = \"Taille de la barre d'incantation du joueur et de la cible\"\nL.unitframe_castbar_height = \"Hauteur\"\n\n-- Unit Frames Class bar options\nL_GUI_UF_PLUGINS_CLASS_BAR = \"Barres de classe\"\nL_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = \"Contrôle des ressources spéciales des classes.\"\nL_GUI_UF_PLUGINS_COMBO_BAR = \"Afficher la barre des points de combo pour les Voleurs/Druides\"\nL_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = \"Toujours montrer la barre des points de combo pour la classe Druide\"\nL_GUI_UF_PLUGINS_COMBO_BAR_OLD = \"Activer les points de Combo sur la cible\"\nL_GUI_UF_PLUGINS_ARCANE_BAR = \"Activer la barre de charge Arcanique\"\nL_GUI_UF_PLUGINS_CHI_BAR = \"Activer la barre de Chi\"\nL_GUI_UF_PLUGINS_STAGGER_BAR = \"Activer la barre de chancelement (pour les Tanks Monk)\"\nL_GUI_UF_PLUGINS_HOLY_BAR = \"Activer la barre de Puissance sacrée\"\nL_GUI_UF_PLUGINS_SHARD_BAR = \"Activier la barre de Fragment d'âme\"\nL_GUI_UF_PLUGINS_RUNE_BAR = \"Activer la barre de Rune\"\nL_GUI_UF_PLUGINS_TOTEM_BAR = \"Activer la barre totem pour Shaman\"\nL.unitframe_class_bar_totem_other = \"Activer la barre totem pour les autres classes\"\nL.unitframe_class_bar_essence = \"Enable Essence bar for Evoker\" -- Need review\n\n-- Raid Frames options\nL_GUI_UF_RAIDFRAMES_SUBTEXT = \"Personnalisez l’apparence des cadres de raid.\"\nL_GUI_UF_BY_ROLE = \"Trier les joueurs par rôle dans les groupes\"\nL_GUI_UF_AGGRO_BORDER = \"Aggro signalée en bordure\"\nL_GUI_UF_DEFICIT_HEALTH = \"Déficit en vie du raid\"\nL_GUI_UF_SHOW_PARTY = \"Afficher les cadres du groupe\"\nL_GUI_UF_SHOW_RAID = \"Afficher les cadres de raid\"\nL.raidframe_layout = \"Disposition du raid\"\nL.raidframe_heal_layout = \"Heal\"\nL.raidframe_dps_layout = \"DPS\"\nL.raidframe_auto_layout = \"Auto\"\nL.raidframe_show_target = \"Afficher les cadres de cible\"\nL.raidframe_show_pet = \"Afficher les cadres de familier\"\nL.raidframe_vertical_health = \"Orientation verticale de la santé\"\nL.raidframe_vertical_health_desc = \"Uniquement pour la disposition de raid 'Heal'\"\nL_GUI_UF_ALPHA_HEALTH = \"Opacité des barres de vie quand 100%hp\"\nL_GUI_UF_SHOW_RANGE = \"Afficher l’opacité de portée pour les cadres de raid\"\nL_GUI_UF_RANGE_ALPHA = \"Opacité\"\nL_GUI_UF_RANGE_ALPHA_DESC = \"Opacité de la barre vie quand hors de portée\"\nL_GUI_UF_SUBHEADER_RAIDFRAMES = \"Cadres\"\nL_GUI_UF_SOLO_MODE = \"Afficher le cadre du joueur en solo\"\nL_GUI_UF_PLAYER_PARTY = \"Afficher le cadre du joueur en groupe\"\nL_GUI_UF_SHOW_TANK = \"Afficher les tanks de raid\"\nL_GUI_UF_SHOW_TANK_TT = \"Afficher la cible de la cible des tanks\"\nL_GUI_UF_RAID_GROUP = \"Nombre de groupe dans le raid\"\nL.raidframe_party_vertical = \"Cadres de groupe verticaux\"\nL.raidframe_raid_groups_vertical = \"Groupes de raid vertical\"\nL.raidframe_raid_groups_vertical_desc = \"Uniquement pour la disposition du raid 'Heal'\"\nL_GUI_UF_SUBHEADER_ICONS = \"Icônes\"\nL_GUI_UF_ICONS_ROLE = \"Icône de rôle\"\nL_GUI_UF_ICONS_RAID_MARK = \"Icône de marques de raid\"\nL_GUI_UF_ICONS_READY_CHECK = \"Icône d'appel\"\nL_GUI_UF_ICONS_LEADER = \"Icône de Chef de raid et assistant\"\nL_GUI_UF_ICONS_SUMON = \"Icône d’invocation\"\nL.raidframe_icons_phase = \"Icône de Phase\"\nL.raidframe_plugins_debuffhighlight_icon = \"Afficher l’icône d'affaiblissement dispellable\"\nL.raidframe_plugins_aura_watch = \"Icônes d'affaiblissement de raid (de la liste)\"\nL.raidframe_plugins_aura_watch_timer = \"Durée sur les icônes d'affaiblissement du raid\"\nL.raidframe_plugins_pvp_debuffs = \"Afficher les icônes d'affaiblissement JcJ (de la liste)\"\nL_GUI_UF_PLUGINS_HEALCOMM = \"Afficher l'estimation des soins entrant sur le cadre\"\nL.raidframe_plugins_over_absorb = \"Montrer la barre d'absorption sur le cadre\"\nL.raidframe_plugins_over_heal_absorb = \"Montrer l'excédent de soin absorber sur le cadre\"\nL.raidframe_plugins_auto_resurrection = \"Incantation automatique de résurrection\"\nL.raidframe_plugins_auto_resurrection_desc = \"Lance résurrection avec le clic du milieu de la souris (ne fonctionne pas avec l'addon Clique activé)\"\nL.raidframe_hide_health_value = \"Masquer la valeur de santé du raid\"\nL.raidframe_auto_position = \"Repositionnement automatique des cadres de raid\"\nL.raidframe_auto_position_desc = \"S’il y a plus de 5 groupes, les points d'ancrage des cadres de raid changent. \\nSeulement pour la disposition de raid 'Heal'\"\nL.raidframe_auto_position_dynamic = \"Dynamique\"\nL.raidframe_auto_position_static = \"Statique\"\nL.raidframe_subheader_heal_size = \"Taille pour la disposition 'Heal'\"\nL.raidframe_heal_width = \"Largeur du cadre\"\nL.raidframe_heal_height = \"Hauteur du cadre\"\nL.raidframe_heal_power_height = \"Hauteur de la barre de puissance\"\nL.raidframe_subheader_dps_size = \"Taille pour la disposition 'DPS'\"\nL.raidframe_dps_party_width = \"Largeur du groupe\"\nL.raidframe_dps_party_height = \"Hauteur du groupe\"\nL.raidframe_dps_raid_width = \"Largeur du raid\"\nL.raidframe_dps_raid_height = \"Hauteur du raid\"\nL.raidframe_dps_party_power_height = \"Hauteur de la barre de puissance du groupe\"\nL.raidframe_dps_raid_power_height = \"Hauteur de la barre de puissance du raid\"\n\n-- ActionBar options\nL_GUI_ACTIONBAR = \"Barres d'action\"\nL_GUI_ACTIONBAR_ENABLE = \"Activer les barres d'action\"\nL_GUI_ACTIONBAR_HOTKEY = \"Afficher les raccourcis clavier sur les boutons\"\nL_GUI_ACTIONBAR_MACRO = \"Afficher le nom de la macro sur les boutons\"\nL_GUI_ACTIONBAR_GRID = \"Afficher les boutons vide de la barre d’action\"\nL_GUI_ACTIONBAR_BUTTON_SIZE = \"Taille des boutons\"\nL_GUI_ACTIONBAR_BUTTON_SPACE = \"Espacement des boutons\"\nL_GUI_ACTIONBAR_SPLIT_BARS = \"Séparation de la 5ème barre en 2 barres de 6 boutons de chaque côté\"\nL_GUI_ACTIONBAR_CLASSCOLOR_BORDER = \"Active la couleur de votre classe pour la bordure de boutons\"\nL.actionbar_toggle_mode = \"Activer le mode d'extension des barres d'action\"\nL.actionbar_toggle_mode_desc = \"Changement rapide du nombre de barre d'action. Pour les barres inférieurs, passez la souris sur la zone cachée au-dessus des barres. Pour les panneaux de droite, placez le curseur de la souris sur la zone située sous les barres.\"\nL_GUI_ACTIONBAR_HIDE_HIGHLIGHT = \"Cache la surbrillance des effets à déclenchement\"\nL_GUI_ACTIONBAR_BOTTOMBARS = \"Nombre de barres d'action en bas\"\nL_GUI_ACTIONBAR_RIGHTBARS = \"Nombre de barres d'action à droite\"\nL.actionbar_bottombars_mouseover = \"Barres du bas au survol de la souris\"\nL_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = \"Barres de droite au survol de la souris\"\nL_GUI_ACTIONBAR_PETBAR_HIDE = \"Cacher la barre du familier\"\nL_GUI_ACTIONBAR_PETBAR_HORIZONTAL = \"Activer la barre du familier horizontale\"\nL_GUI_ACTIONBAR_PETBAR_MOUSEOVER = \"Barre du familier au survol de la souris(uniquement pour la barre horizontale)\"\nL_GUI_ACTIONBAR_STANCEBAR_HIDE = \"Cacher changeforme\"\nL_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = \"Activer la barre de posture horizontale\"\nL.actionbar_stancebar_horizontal_desc = \"Situé sous le cadre du joueur\"\nL_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = \"Barre de posture au survol de la souris\"\nL_GUI_ACTIONBAR_MICROMENU = \"Active le Micro menu\"\nL_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = \"Affiche le Micro menu au survol de la souris\"\nL.actionbar_editor = \"Éditeur de barres\"\nL.actionbar_editor_desc = \"Permettre de déplacer et de changer chaque panneau individuellement\"\nL.actionbar_bar1_num = \"Nombre de boutons\"\nL.actionbar_bar1_row = \"Boutons par ligne\"\nL.actionbar_bar1_mouseover = \"Afficher au survol de la souris\"\n\n-- Tooltip options\nL.tooltip = \"Tooltip\"\nL.tooltip_subtext = \"Dans ce bloc, vous pouvez changer les informations du tooltip.\"\nL.tooltip_enable = \"Activer le tooltip\"\nL.tooltip_shift_modifer = \"Afficher le tooltip quand la touche 'MAJ' est appuyée\"\nL.tooltip_cursor = \"Afficher le Tooltip sous le curseur\"\nL.tooltip_item_icon = \"Afficher l'îcone de l'objet\"\nL.tooltip_health_value = \"Afficher les points de vie\"\nL.tooltip_hidebuttons = \"Cacher le tooltip pour les barres d'action\"\nL.tooltip_hide_combat = \"Cacher le tooltips en combat\"\nL.tooltip_subheader = \"Plugins\"\nL.tooltip_talents = \"Afficher les talents\"\nL.tooltip_show_shift = \"Afficher lorsque Shift est maintenu\"\nL.tooltip_show_shift_desc = \"Afficher le niveau et la spécialisation lorsque Shift est maintenu\"\nL.tooltip_achievements = \"Comparaison des Hauts Faits\"\nL.tooltip_target = \"Afficher la cible\"\nL.tooltip_title = \"Afficher les titres\"\nL.tooltip_realm = \"Affiche le royaume du joueur\"\nL.tooltip_rank = \"Afficher le rang de guilde\"\nL.tooltip_spell_id = \"Afficher l'ID du sort\"\nL.tooltip_average_lvl_desc = \"Afficher l'ilevel moyen\"\nL.tooltip_raid_icon = \"Afficher l'îcone de raid\"\nL.tooltip_who_targetting = \"Afficher qui cible actuellement l'unité qui est dans votre groupe/raid\"\nL.tooltip_item_count = \"Afficher le nombre d'objets possédés dans les sacs et à la banque\"\nL.tooltip_unit_role = \"Afficher les rôles\"\nL.tooltip_instance_lock = \"Afficher le verrouillage de votre instance\"\nL.tooltip_mount = \"Source de la monture\"\n\n-- Chat options\nL.chat_subtext = \"Ici vous pouvez modifier les paramètres de la fenêtre de chat.\"\nL.chat_enable = \"Activer le chat\"\nL.chat_background = \"Activer l'arrière plan\"\nL.chat_background_alpha = \"Transparence de l'arrière plan\"\nL.chat_filter = \"Suppression de certains spams du système\"\nL.chat_filter_desc = \"Duels, changement de talents, dialogue PNJ en ville\"\nL.chat_spam = \"Suppression du spam des joueurs (de la liste noire)\"\nL.chat_spam_list = \"Liste noire\"\nL.chat_spam_list_desc = \"Liste de mots (séparés par des espaces, lettres minuscules) pour masquer les messages\"\nL.chat_width = \"Largeur de la fenêtre\"\nL.chat_height = \"Hauteur de la fenêtre\"\nL.chat_chat_bar = \"Barre de boutons pour changer de canal de chat\"\nL.chat_chat_bar_mouseover = \"Affiche les boutons pour changer de canal au survol de la souris\"\nL.chat_whisp_sound = \"Alerte sonore quand murmure\"\nL.chat_combatlog = \"Afficher l'onglet du journal de combat\"\nL.chat_tabs_mouseover = \"Affiche les onglets de discussion au survol de la souris\"\nL.chat_sticky = \"Active le dernier canal utilisé(canal persistant)\"\nL.chat_damage_meter_spam = \"Fusionnez le spam de compteur de dégâts dans un seul lien/ligne\"\nL.chat_loot_icons = \"Affiche une icône à côté du butin dans le chat\"\nL.chat_hide_combat = \"Cacher le chat en combat\"\nL.chat_custom_time_color = \"Activer la coloration personnalisée de l'heure\"\nL.chat_time_color = \"   Couleur de l'heure\"\n\n-- Nameplate options\nL_GUI_NAMEPLATE_SUBTEXT = \"Paramètres des barres de noms\"\nL_GUI_NAMEPLATE_ENABLE = \"Activer les barres de noms\"\nL_GUI_NAMEPLATE_COMBAT = \"Afficher automatiquement les barres de noms en combat\"\nL_GUI_NAMEPLATE_HEALTH = \"Valeur de points de vie\"\nL_GUI_NAMEPLATE_HEIGHT = \"Hauteur des barres de noms\"\nL_GUI_NAMEPLATE_WIDTH = \"Largeur des barres de noms\"\nL.nameplate_alpha = \"Transparence\"\nL.nameplate_alpha_desc = \"Transparence des barres de noms autres que la Cible\"\nL.nameplate_ad_height = \"Epaisseur additionnelle\"\nL.nameplate_ad_width = \"Largeur additionnelle\"\nL.nameplate_ad_height_desc = \"Epaisseur additionnelle pour la barre de Noms de la cible\"\nL.nameplate_ad_width_desc = \"LArgeur additionnelle pour la barre de Noms de la cible\"\nL_GUI_NAMEPLATE_CASTBAR_NAME = \"Afficher le nom du sort\"\nL_GUI_NAMEPLATE_CLASS_ICON = \"Icône de classe en JcJ\"\nL_GUI_NAMEPLATE_NAME_ABBREV = \"Afficher les noms abrégés\"\nL.nameplate_short_name = \"Remplacer les noms par des noms courts\"\nL.nameplate_clamp = \"Afficher les barres en haut de l'écran quand celles-ci sont hors champs\"\nL.nameplate_clamp_desc = \"Afficher les barres en haut de l'écran quand celles-ci sont hors champs\"\nL_GUI_NAMEPLATE_SHOW_DEBUFFS = \"Afficher vos debuffs (de la liste)\"\nL_GUI_NAMEPLATE_SHOW_BUFFS = \"Afficher les buffs et debuffs ennemis dissipables (de la liste)\"\nL_GUI_NAMEPLATE_DEBUFFS_SIZE = \"Taille des debuffs\"\nL_GUI_NAMEPLATE_HEALER_ICON = \"Affiche une icône de soigneur sur les barres ennemis dans les champs de bataille\"\nL_GUI_NAMEPLATE_TOTEM_ICONS = \"Afficher l’icône des totems\"\nL.nameplate_target_glow = \"Montrer une lueur sur la texture pour la cible sélectionner\"\nL.nameplate_only_name = \"Afficher uniquement le nom (san les barres) pour les unités amies\"\nL.nameplate_quests = \"Afficher l’icône de quête\"\nL.nameplate_cast_color = \"Afficher la bordure de couleur pour certains sorts importants\"\nL.nameplate_kick_color = \"Changer la couleur de cast pour le cooldown d’interruption\"\nL.nameplate_low_health_value = \"Valeur des points de vie\"\nL.nameplate_low_health = \"Mise en évidence pour les points de vie faible\"\nL_GUI_NAMEPLATE_THREAT = \"Activer la gestion de la menace, change automatiquement selon votre rôle\"\nL_GUI_NAMEPLATE_GOOD_COLOR = \"   Bonne couleur de menace, dépend de si vous êtes un tank ou dps/heal\"\nL_GUI_NAMEPLATE_NEAR_COLOR = \"   Perte/Gain de couleur de menace\"\nL_GUI_NAMEPLATE_BAD_COLOR = \"   Mauvaise couleur de menace, dépend de si vous êtes un tank ou dps/heal\"\nL_GUI_NAMEPLATE_OFFTANK_COLOR = \"   Coloration de la menace du tank secondaire\"\nL.nameplate_extra_color = \"   Couleur d'affix pour explosif et méchant\"\nL.nameplate_mob_color_enable = \"Changer de couleur pour les mobs importants dans les donjons\"\nL.nameplate_mob_color = \"   Couleur pour les mobs\"\n\n-- Combat text options\nL_GUI_COMBATTEXT = \"Texte de combat\"\nL_GUI_COMBATTEXT_SUBTEXT = \"Pour déplacer écrivez /xct dans le chat\"\nL_GUI_COMBATTEXT_ENABLE = \"Activer les textes de combat\"\nL.combattext_blizz_head_numbers = \"Activer les textes de combat Blizzard\"\nL.combattext_blizz_head_numbers_desc = \"Utiliser la sortie des dégâts/soins Blizzard (au-dessus de la tête du mob/joueur)\"\nL.combattext_damage_style = \"Changer la police par défautt\"\nL.combattext_damage_style_desc = \"Change la police par défaut des dégâts/soins au dessus de la tête de la cible (Vous devez redémarrer WoW pour valider le changement)\"\nL_GUI_COMBATTEXT_DAMAGE = \"Montrer les dommages sortants\"\nL_GUI_COMBATTEXT_HEALING = \"Montrer les soins sortants\"\nL.combattext_incoming = \"Montrer les dommages et les soins entrants\"\nL_GUI_COMBATTEXT_HOTS = \"Afficher les effets des soins périodiques dans la fenêtre de soin\"\nL_GUI_COMBATTEXT_OVERHEALING = \"Afficher les excès de soins sortants\"\nL_GUI_COMBATTEXT_PET_DAMAGE = \"Afficher les dégâts du familier\"\nL_GUI_COMBATTEXT_DOT_DAMAGE = \"Afficher les dégâts des dots\"\nL_GUI_COMBATTEXT_DAMAGE_COLOR = \"Afficher les dégâts en fonction de l'école de magie\"\nL_GUI_COMBATTEXT_CRIT_PREFIX = \"Caractère à afficher avant le montant d'un critique\"\nL_GUI_COMBATTEXT_CRIT_POSTFIX = \"Caractère à afficher après le montant d'un critique\"\nL_GUI_COMBATTEXT_ICONS = \"Afficher l'icône du sort\"\nL_GUI_COMBATTEXT_ICON_SIZE = \"Taille de l'icône\"\nL_GUI_COMBATTEXT_ICON_SIZE_DESC = \"Taille de l'icône du sort\"\nL_GUI_COMBATTEXT_TRESHOLD = \"Dégâts minimum pour afficher dans la fenêtre de dégâts\"\nL_GUI_COMBATTEXT_HEAL_TRESHOLD = \"Soins minimum pour afficher dans la fenêtre de dégâts\"\nL_GUI_COMBATTEXT_SCROLLABLE = \"Autoriser le défilement avec la molette dans la fenêtre de dégâts/soins\"\nL_GUI_COMBATTEXT_MAX_LINES = \"Lignes maximum\"\nL_GUI_COMBATTEXT_MAX_LINES_DESC = \"Nombre de lignes maximum à conserver si l'option de défilement est activée (plus de ligne = plus de mémoire utilisée)\"\nL_GUI_COMBATTEXT_TIME_VISIBLE = \"Temps\"\nL_GUI_COMBATTEXT_TIME_VISIBLE_DESC = \"Temps en seconde durant lequel un message est affiché\"\nL_GUI_COMBATTEXT_DK_RUNES = \"Afficher le rechargement des runes du chevalier de la mort\"\nL_GUI_COMBATTEXT_KILLINGBLOW = \"Afficher les coups fatals\"\nL.combattext_merge_aoe_spam = \"Merges spell spam into single message\" -- Needs review\nL.combattext_merge_aoe_spam_desc = \"Rassembler tous les dégâts d'un aoe en un seul message\"\nL_GUI_COMBATTEXT_MERGE_MELEE = \"Rassemble les dégâts multiples en auto attaque\"\nL.combattext_merge_all = \"Merges all spells\" -- Needs review\nL_GUI_COMBATTEXT_DISPEL = \"Affiche les sorts que vous avez dissipé\"\nL_GUI_COMBATTEXT_INTERRUPT = \"Affiche les sorts que vous avez interrompu\"\nL_GUI_COMBATTEXT_DIRECTION = \"Changer la direction de défilement de bas en haut\"\nL_GUI_COMBATTEXT_SHORT_NUMBERS = \"Rendre plus lisible les nombres ('25.3k' au lieu de '25342')\"\n\n-- Auras/Buffs/Debuffs\nL_GUI_AURA_PLAYER_BUFF_SIZE = \"Taille des buffs\"\nL_GUI_AURA_PLAYER_BUFF_SIZE_DESC = \"Taille des buffs du joueur\"\nL.aura_debuff_size = \"Taille des debuffs\"\nL_GUI_AURA_SHOW_SPIRAL = \"Spirale sur les icones de buff\"\nL_GUI_AURA_SHOW_TIMER = \"Afficher le cooldown sur les icônes de buff\"\nL_GUI_AURA_PLAYER_AURAS = \"Afficher les buffs du joueur\"\nL_GUI_AURA_TARGET_AURAS = \"Afficher les buffs de la cible\"\nL_GUI_AURA_FOCUS_DEBUFFS = \"Afficher les debuffs du focus\"\nL_GUI_AURA_FOT_DEBUFFS = \"Afficher les debuffs de la cible du focus\"\nL_GUI_AURA_PET_DEBUFFS = \"Afficher les debuffs du pet\"\nL_GUI_AURA_TOT_DEBUFFS = \"Afficher les debuffs de la cible de la cible\"\nL.aura_subheader_boss = \"Afficher les buffs du Boss\"\nL_GUI_AURA_PLAYER_AURA_ONLY = \"Afficher seulement ses propres debuffs sur la cible\"\nL_GUI_AURA_DEBUFF_COLOR_TYPE = \"Couleur de debuff par type\"\nL_GUI_AURA_CAST_BY = \"Montrer qui a lancé un buff/debuff dans son tooltip\"\nL_GUI_AURA_CLASSCOLOR_BORDER = \"Activer la couleur de votre classe pour la bordure de vos buffs\"\nL.aura_subheader_buffs = \"Les buffs des joueurs\"\nL.aura_subheader_debuffs = \"Les Débuffs des joueurs\"\n\n-- Bag options\nL_GUI_BAGS = \"Sacs\"\nL_GUI_BAGS_SUBTEXT = \"Cliquez avec le bouton droit de la souris sur le bouton de fermeture pour ouvrir le menu. Pour déplacer les sacs, maintenez la touche Maj enfoncée - cliquez.\"\nL_GUI_BAGS_ENABLE = \"Activer les sacs\"\nL_GUI_BAGS_ILVL = \"Afficher le niveau d'objet des armes et armures\"\nL.bag_new_items = \"Afficher l’animation pour les nouveaux objets\"\nL.bag_filter = \"Always show filter buttons\" -- Need review\nL_GUI_BAGS_BUTTON_SIZE = \"Taille des boutons\"\nL_GUI_BAGS_BUTTON_SPACE = \"Espacement des boutons\"\nL_GUI_BAGS_BANK = \"Nombre de colonne pour la banque\"\nL_GUI_BAGS_BAG = \"Nombre de colonne pour les sacs\"\n\n-- Minimap options\nL_GUI_MINIMAP_SUBTEXT = \"Paramètres de la minimap\"\nL_GUI_MINIMAP_ENABLE = \"Activer minimap\"\nL.minimap_on_top = \"Move minimap on top right corner\" -- Need review\nL_GUI_MINIMAP_ICON = \"Icone de pistage\"\nL_GUI_GARRISON_ICON = \"Icône de Covenant\"\nL_GUI_MINIMAP_SIZE = \"Taille de la minicarte\"\nL_GUI_MINIMAP_HIDE_COMBAT = \"Cacher la minimap en combat\"\nL_GUI_MINIMAP_TOGGLE_MENU = \"Montre le menu déroulant\"\nL.minimap_bg_map_stylization = \"Personnalisation de l'arrière plan de la carte du monde\"\nL.minimap_fog_of_war = \"Retire le brouillard des zones non explorées sur la carte du monde\"\n\n-- Loot options\nL_GUI_LOOT_SUBTEXT = \"Paramètres pour le cadre de butin.\"\nL_GUI_LOOT_ENABLE = \"Activer le cadre de butin\"\nL_GUI_LOOT_ROLL_ENABLE = \"Activer le cadre de butin de groupe\"\nL_GUI_LOOT_ICON_SIZE = \"Taille de l'icône\"\nL_GUI_LOOT_WIDTH = \"Largeur du cadre de butin\"\nL_GUI_LOOT_AUTOGREED = \"Activer désenchantement automatique pour les objets verts au niveau maximum\"\nL_GUI_LOOT_AUTODE = \"Confirmation automatique pour le désenchantement\"\nL.loot_faster_loot = \"Pillage plus rapide\"\nL.loot_faster_loot_desc = \"Fonctionne uniquement si le butin automatique est activé\"\n\n-- Filger\nL_GUI_FILGER = \"Temps de recharge (Filger)\"\nL_GUI_FILGER_SUBTEXT = \"Filger - Un analogue de WeakAuras, mais plus simple à utiliser. Vous permet d’afficher sous la forme d’icônes et de barres vos auras et chronomètres.\"\nL_GUI_FILGER_ENABLE = \"Activer Filger\"\nL_GUI_FILGER_TEST_MODE = \"Activer le mode test\"\nL_GUI_FILGER_MAX_TEST_ICON = \"Nombre d'icône pour le mode Test\"\nL_GUI_FILGER_SHOW_TOOLTIP = \"Afficher l'infobulle\"\nL.filger_subheader_elements = \"Affichage des éléments\"\nL.filger_show_buff = \"Buffs du joueur\"\nL.filger_show_proc = \"Procs du joueur\"\nL.filger_show_debuff = \"Debuffs sur la cible\"\nL.filger_show_aura_bar = \"Barre d'aura sur la cible\"\nL.filger_show_special = \"Buffs spéciaux sur le joueur\"\nL.filger_show_pvp_player = \"Debuffs JcJ sur le joueur\"\nL.filger_show_pvp_target = \"Auras JcJ sur la cible\"\nL.filger_show_cd = \"Temps de recharge\"\nL.filger_subheader_size = \"Taille des icônes\"\nL.filger_subheader_test = \"Mode test\"\nL_GUI_FILGER_EXPIRATION = \"Organiser les temps de recharge par temps d'expiration\"\nL_GUI_FILGER_BUFFS_SIZE = \"Taille des buffs\"\nL_GUI_FILGER_COOLDOWN_SIZE = \"Taille des temps de recharge\"\nL_GUI_FILGER_PVP_SIZE = \"Taille des debuffs JcJ\"\nL.filger_buffs_space = \"Espacement des buffs\"\nL.filger_pvp_space = \"Espacements des auras JcJ\"\nL.filger_cooldown_space = \"Espacement des temps de recharge\"\nL.filger_subheader_spells = \"Ajout de nouveaux sorts\"\nL.filger_category_list = \"Catégorie de la liste de sorts\"\n\n-- Announcements options\nL_GUI_ANNOUNCEMENTS = \"Annonces\"\nL_GUI_ANNOUNCEMENTS_SUBTEXT = \"Paramètres qui ajoutent des annonces de chat pour les sorts ou les objets.\"\nL.announcements_drinking = \"Un ennemi de l’arène est entrain de boire\"\nL.announcements_interrupts = \"Interruptions\"\nL.announcements_interrupts_desc = \"Annonce dans le groupe/raid lorsque vous interrompez un sort\"\nL.announcements_spells = \"Lancement de certains sorts\"\nL.announcements_spells_desc = \"Annonce dans le groupe/raid quand vous lancez un sort (dans la liste)\"\nL.announcements_spells_from_all = \"De tous les membres\"\nL.announcements_spells_from_all_desc = \"Annonce dans le groupe/raid quand un des membres du groupe/raid lance un sort\"\nL.announcements_toys = \"Annonce le lancement de certains jouets\"\nL.announcements_pull_countdown = \"Compte à rebours\"\nL.announcements_pull_countdown_desc = \"Annonce le compte à rebours pou Pull '/pc #'\"\nL.announcements_flask_food = \"Utilisation de flacons et de nourritures\"\nL.announcements_flask_food_desc = \"Annonce l'usage de flacon et nourriture (/ffcheck)\"\nL.announcements_flask_food_raid = \"Annoncer sur le canal de raid\"\nL.announcements_flask_food_auto = \"Vérification automatique après un appel de raid\"\nL.announcements_feasts = \"Annonce la pose de Festins/Pierre de soins/Robots de réparation\"\nL.announcements_portals = \"Annonce le lancement de Portails/Pierre de téléportation\"\nL.announcements_subheader_self = \"Annonces personnelles\"\nL.announcements_bad_gear = \"Vérifiez le mauvais équipement\"\nL.announcements_bad_gear_desc = \"Vérifie si un mauvais équipement est porté en instance (dans la liste)\"\nL.announcements_safari_hat = \"Chapeau de safari\"\nL.announcements_safari_hat_desc = \"Vérifie si le chapeau de safari est activé lors du démarrage d'un combat de pet\"\n\n-- Automation options\nL_GUI_AUTOMATION = \"Automatisation\"\nL_GUI_AUTOMATION_SUBTEXT = \"Ce bloc contient des paramètres qui facilitent la routine.\"\nL.automation_release = \"Libération automatique de l'esprit dans les champs de bataille\"\nL.automation_screenshot = \"Faire une capture d’écran lorsque le joueur obtient un haut-fait\"\nL.automation_solve_artifact = \"Affiche automatiquement une fenêtre pour la résolution d'artéfact\"\nL.automation_solve_artifact_desc = \"S’il y a suffisamment de fragments pour un artefact, une fenêtre apparaît pour le résoudre.\"\nL.automation_accept_invite = \"Accepter automatiquement les invitations\"\nL.automation_decline_duel = \"Décliner les duels automatiquement (/disduel pour désactiver temporairement)\"\nL.automation_accept_quest = \"Accepter les quêtes automatiquement (désactivée si vous maintenez Shift)\"\nL.automation_auto_collapse = \"Réduire automatiquement la fenêtre de quête\"\nL.automation_auto_collapse_raid = \"En instance\"\nL.automation_auto_collapse_reload = \"Après un (/reload)\"\nL.automation_auto_collapse_scenario = \"Partiellement\"\nL.automation_skip_cinematic = \"Désactive automatiquement les cinématiques/film (inactif si vous maintenez Ctrl)\"\nL.automation_auto_role = \"Active automatiquement l'affichage de votre rôle\"\nL.automation_cancel_bad_buffs = \"Annulation automatique des buffs de fêtes (de la liste)\"\nL.automation_tab_binder = \"Changement automatique de la touche 'Tab' dans les zones JcJ\"\nL.automation_tab_binder_desc = \"La touche 'Tab' cible uniquement les joueurs ennemis dans les zones JcJ, ignore les animaux de compagnie et les mobs\"\nL.automation_logging_combat = \"Active automatiquement l'enregistrement du journal de combat en raid\"\nL.automation_buff_on_scroll = \"Lancement de sort via la molette souris (dans la liste)\"\nL.automation_buff_on_scroll_desc = \"Si le buff de la liste n’est pas appliqué sur le joueur, il sera lancé par le défilement de la souris\"\nL.automation_open_items = \"Ouverture automatique des objets dans les sacs\"\nL.automation_resurrection = \"Accepter la résurrection\"\nL.automation_summon = \"Accepter l'invocation\"\nL.automation_whisper_invite = \"Invitation automatique par mot-clé\"\nL.automation_invite_keyword = \"Liste des mots-clés (séparés par un espace)\"\nL.automation_invite_keyword_desc = \"Lorsque le joueur vous chuchote un des mot-clés, il sera invité dans votre groupe\"\n\n-- Buffs reminder options\nL_GUI_REMINDER = \"Contrôle des buffs\"\nL_GUI_REMINDER_SUBTEXT = \"Affichage des buffs manquants.\"\nL_GUI_REMINDER_SOLO_ENABLE = \"Afficher les buffs personnelles manquants\"\nL_GUI_REMINDER_SOLO_SOUND = \"Notification sonore pour les buffs personnelles manquants\"\nL_GUI_REMINDER_SOLO_SIZE = \"Taille de l'icône\"\nL_GUI_REMINDER_SOLO_SIZE_DESC = \"Taille de l'icône pour les buffs personnelles\"\nL_GUI_REMINDER_SUBHEADER = \"Buffs de raid\"\nL_GUI_REMINDER_RAID_ENABLE = \"Voir les buffs de raid manquants\"\nL_GUI_REMINDER_RAID_ALWAYS = \"Toujours voir les buffs manquants\"\nL_GUI_REMINDER_RAID_SIZE = \"Taille de l'icône\"\nL_GUI_REMINDER_RAID_SIZE_DESC = \"Taille de l'icône pour les buffs de raid\"\nL_GUI_REMINDER_RAID_ALPHA = \"Opacité\"\nL_GUI_REMINDER_RAID_ALPHA_DESC = \"Icônes transparentes lorsque les buffs sont présents\"\n\n-- Raid cooldowns options\nL_GUI_COOLDOWN_RAID = \"Temps de recharge du raid\"\nL_GUI_COOLDOWN_RAID_SUBTEXT = \"Suivi des temps de recharge du raid dans le coin supérieur gauche.\"\nL_GUI_COOLDOWN_RAID_ENABLE = \"Activer les CD de raid\"\nL_GUI_COOLDOWN_RAID_HEIGHT = \"Hauteur des barres\"\nL_GUI_COOLDOWN_RAID_WIDTH = \"Largeur des barres\"\nL_GUI_COOLDOWN_RAID_SORT = \"Nouvelle barre vers le haut\"\nL_GUI_COOLDOWN_RAID_EXPIRATION = \"Tri par temps d'expiration\"\nL_GUI_COOLDOWN_RAID_SHOW_SELF = \"Montrer mes temps de recharge\"\nL_GUI_COOLDOWN_RAID_ICONS = \"Icônes des temps de recharge de raid\"\nL_GUI_COOLDOWN_RAID_IN_RAID = \"Voir les temps de recharge alliés en raid\"\nL_GUI_COOLDOWN_RAID_IN_PARTY = \"Voir les temps de recharge alliés en groupe\"\nL_GUI_COOLDOWN_RAID_IN_ARENA = \"Voir les temps de recharge alliés en arène\"\n\n-- Enemy cooldowns options\nL_GUI_COOLDOWN_ENEMY = \"Temps de recharge des ennemis\"\nL_GUI_COOLDOWN_ENEMY_SUBTEXT = \"Afficher les capacités ennemies en tant qu’icônes au-dessus de votre barre d'incantation.\"\nL_GUI_COOLDOWN_ENEMY_ENABLE = \"Activer les temps de recharge ennemis\"\nL_GUI_COOLDOWN_ENEMY_SIZE = \"Taille de l'icône des temps de recharge ennemis\"\nL_GUI_COOLDOWN_ENEMY_DIRECTION = \"Direction des icônes du temps de recharge ennemis\"\nL_GUI_COOLDOWN_ENEMY_EVERYWHERE = \"Voir les temps de recharge ennemis partout\"\nL_GUI_COOLDOWN_ENEMY_IN_BG = \"Voir les temps de recharge ennemis dans les champs de bataille\"\nL_GUI_COOLDOWN_ENEMY_IN_ARENA = \"Voir les temps de recharge ennemis en arène\"\nL.enemycooldown_show_inparty = \"Afficher sur le cadre du groupe pour les alliés\"\nL.enemycooldown_class_color = \"Active la couleur de classe pour la bordure des icônes\"\n\n-- Pulse cooldowns options\nL_GUI_COOLDOWN_PULSE = \"Temps de recharge par îcone d'impulsion\"\nL_GUI_COOLDOWN_PULSE_SUBTEXT = \"Suivez vos temp de recharge à l’aide d’une icône d’impulsion au centre de l’écran.\"\nL_GUI_COOLDOWN_PULSE_ENABLE = \"Activation de l'îcone d'impulsion\"\nL_GUI_COOLDOWN_PULSE_SIZE = \"Taille de l'îcone d'impulsion\"\nL_GUI_COOLDOWN_PULSE_SOUND = \"Avertissement sonore\"\nL_GUI_COOLDOWN_PULSE_ANIM_SCALE = \"Mise à l'échelle des animations\"\nL_GUI_COOLDOWN_PULSE_HOLD_TIME = \"Temps maximum pour la rémanence de l'îcone\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD = \"Temps de déclenchement\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = \"Temps minimum de déclenchement\"\n\n-- Threat options\nL_GUI_THREAT = \"Barre de menace\"\nL_GUI_THREAT_SUBTEXT = \"Affichage de la liste des menaces (un simple analogue d’Omen).\"\nL_GUI_THREAT_ENABLE = \"Activer les barres de menace\"\nL_GUI_THREAT_HEIGHT = \"Hauteur des barres de menace\"\nL_GUI_THREAT_WIDTH = \"Largeur des barres de menace\"\nL_GUI_THREAT_ROWS = \"Nombre de barres de menace\"\nL_GUI_THREAT_HIDE_SOLO = \"Afficher uniquement en groupe/raid\"\n\n-- Top panel options\nL_GUI_TOP_PANEL = \"Panneau supérieur\"\nL_GUI_TOP_PANEL_SUBTEXT = \"Gérer les options du panneau supérieur.\"\nL_GUI_TOP_PANEL_ENABLE = \"Activer le panneau supérieur\"\nL_GUI_TOP_PANEL_MOUSE = \"Panneau supérieur au survol de la souris\"\nL_GUI_TOP_PANEL_WIDTH = \"Largeur du panneau\"\nL_GUI_TOP_PANEL_HEIGHT = \"Hauteur du panneau\"\n\n-- Stats options\nL_GUI_STATS = \"Statistiques\"\nL_GUI_STATS_SUBTEXT = \"Blocs statistiques situés au bas de l’écran. Tapez '/ls' dans le chat pour info.\"\nL_GUI_STATS_CLOCK = \"Horloge\"\nL_GUI_STATS_LATENCY = \"Latence\"\nL_GUI_STATS_FPS = \"FPS\"\nL_GUI_STATS_EXPERIENCE = \"Expérience\"\nL_GUI_STATS_TALENTS_DESC = \"En cliquant sur Le texte cela vous permet de modifier la spécialisation et le type de butin\"\nL_GUI_STATS_COORDS = \"Coordonnées\"\nL_GUI_STATS_LOCATION = \"Lieu actuel\"\nL_GUI_STATS_BG = \"Champ de bataille\"\nL.stats_bottom_line = \"Ligne de couleur de classe en bas de l'écran\"\nL_GUI_STATS_SUBHEADER_CURRENCY = \"Devise (afficher au survol de la souris du texte d'information sur l'or)\"\nL_GUI_STATS_CURRENCY_ARCHAEOLOGY = \"Fragments archéologiques dans devise\"\nL_GUI_STATS_CURRENCY_COOKING = \"Prix de cuisine dans devise\"\nL_GUI_STATS_CURRENCY_RAID = \"Sceaux de raid dans devise\"\n\n-- Trade options\nL_GUI_TRADE = \"Métier\"\nL_GUI_TRADE_SUBTEXT = \"Paramètres liés aux professions et aux métiers\"\nL.trade_profession_tabs = \"Onglet des Professions\"\nL.trade_profession_tabs_desc = \"Onglet des professions sur les fenêtres de métiers et de craft\"\nL.trade_already_known = \"Colore les éléments déjà connus\"\nL.trade_already_known_desc = \"Colore les recettes/supports/animaux/jouets déjà connus\"\nL.trade_disenchanting = \"Désenchantement rapide\"\nL.trade_disenchanting_desc = \"Mouture, Prospection et Désenchantement avec Alt+clique\"\nL.trade_sum_buyouts = \"Somme totale de toutes les ventes aux enchères en cours\"\nL.trade_sum_buyouts_desc = \"À l’onglet Ventes aux enchères, affiche la somme totale de toutes les ventes aux enchères en cours.\"\nL.trade_enchantment_scroll = \"Onglet : parchemin d'enchantement sur la fenêtre de métier\"\nL.trade_archaeology = \"Traqueur d’archéologie\"\nL.trade_archaeology_desc = \"Traqueur d’archéologie ('/arch' ou bouton à droite de la minimap au survol de la souris\"\nL.trade_merchant_itemlevel = \"Niveau d’objet chez le marchand\"\nL.trade_merchant_itemlevel_desc = \"Montrer le niveau d'objet des armes et amures chez le marchand\"\n\n-- Miscellaneous options\nL_GUI_MISC_SUBTEXT = \"Paramètres qui ajoutent des fonctionnalités intéressantes.\"\nL.misc_shift_marking = \"Marques de raid au survol de la souris\"\nL.misc_shift_marking_desc = \"Menu de marques de raid quand vous faite un Shift+Clique sur la cible (Fonctionne uniquement en groupe)\"\nL.misc_afk_spin_camera = \"Faire tourner la caméra quand absent\"\nL.misc_quest_auto_button = \"Bouton automatique des objets de quête\"\nL.misc_quest_auto_button_desc = \"Affiche un bouton pour les objets de quête au-dessus de la minimap (de la liste)\"\nL.misc_raid_tools = \"Outils de raid\"\nL.misc_raid_tools_desc = \"Bouton en haut de l’écran pour la vérification de la disponibilité (clic gauche), vérification des rôles (clic du milieu), établissement des marques, etc. (pour le leader et les adjoints)\"\nL.misc_item_level = \"Niveau d'objet sur les icônes de la fiche de personnage\"\nL.misc_item_level_desc = \"Affiche le niveau d'objet sur les icônes d'équipement dans la fiche de personnage\"\nL.misc_click_cast = \"Simple addon d'assignation de sorts : click2cast\"\nL.misc_click_cast_desc = \"Vous permet d’assigner des sorts aux boutons de la souris. Configuration dans le livre de sorts\"\nL.misc_click_cast_filter = \"Ignore les cadres Joueur et Cible pour l'addon click2cast\"\nL.misc_chars_currency = \"Affiche les jetons et autres monnaies de vos différents personnages\"\nL.misc_chars_currency_desc = \"Passez la souris sur l’icône de la devise requise dans la fenêtre de caractères pour afficher des informations dans l’infobulle\"\nL.misc_hide_raid_button = \"Bouton pour masquer les cadres de raid dans la disposition 'DPS'\"\nL.misc_hide_raid_button_desc = \"Le bouton s’affiche en plaçant la souris dans le coin en haut à gauche\"\n"
  },
  {
    "path": "ShestakUI_Config/Locales/German.lua",
    "content": "local _, L = ...\nif GetLocale() ~= \"deDE\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for deDE client\n--\tTranslation: Alwa, Baine, Chubidu, F5Hellbound, Vienchen\n----------------------------------------------------------------------------------------\nL_GUI_SET_SAVED_SETTTINGS = \"Einstellungen für jeden Charakter einzeln vornehmen\"\nL_GUI_SET_SAVED_SETTTINGS_DESC = \"Umschalten zwischen einem Profil, das für alle Chars gilt, und einem Profil, das für diesen Chars gilt.\"\nL_GUI_RESET_CHAR = \"Bist du sicher, dass du die Charaktereinstellungen für ShestakUI zurücksetzen willst?\"\nL_GUI_RESET_ALL = \"Bist du sicher, dass du alle Einstellungen von ShestakUI zurücksetzen willst?\"\nL_GUI_PER_CHAR = \"Bist du sicher, dass du 'Einzelne Einstellungen für jeden Charakter' ein oder ausschalten möchtest?\"\nL_GUI_RESET_CAT = \"Bist Du sicher, dass Du die Einstellungen der Kategorie zurücksetzen möchtest?\"\nL_GUI_RESET_CAT_DESC = \"Einstellungen der Kategorie zurücksetzen. \\nCTRL-Klick zum Zurücksetzen aller\"\nL_GUI_NEED_RELOAD = \"Benutzeroberfläche erneut laden, um Ihre Änderungen zu übernehmen.\"\nL_GUI_LAYOUT = \"Layout ändern\"\nL_GUI_SPELL_LIST = \"Liste der Zauber\"\nL_GUI_SPELL_INPUT = \"Zauber ID\"\nL_GUI_TIME_INPUT = \"Zeit\"\nL_GUI_EXPERT_MODE = \"Expert mode\" -- Need review\nL_GUI_EXPERT_MODE_DESC = \"Custom editing of Lua profile\" -- Need review\nL_GUI_RESET_SPELLS_DESC = \"CTRL-click to reset list\" -- Need review\n\n-- Profile\nL.profile = \"Profile\" -- Need review\nL.profile_title = \"Profile options\" -- Need review\nL.profile_choose = \"Choose profile\" -- Need review\nL.profile_options = \"Settings\" -- Need review\nL.profile_movers = \"Moving elements\" -- Need review\nL.profile_export = \"Export\" -- Need review\nL.profile_import = \"Import\" -- Need review\nL.profile_error_lib = \"To enable export and import - install WeakAuras\" -- Need review\nL.profile_error_code = \"Error in imported code!\" -- Need review\n\n-- General options\nL_GUI_GENERAL_SUBTEXT = \"Diese Einstellungen steuern die allgemeinen Einstellungen der Benutzeroberfläche. Geben Sie im Chat '/uihelp ein, um Hilfe zu erhalten.\"\nL_GUI_GENERAL_WELCOME_MESSAGE = \"Welcome message in chat\"\nL_GUI_GENERAL_AUTOSCALE = \"Automatisch UI skalieren\"\nL_GUI_GENERAL_UISCALE = \"UI Skalierung (falls automatische Skalierung deaktiviert)\"\nL.general_subheader_blizzard = \"Blizzard UI Elemente\"\nL.general_error_filter = \"Fehlerfilterung\"\nL.general_error_blacklist = \"Blacklist\"\nL.general_error_whitelist = \"Whitelist\"\nL.general_error_combat = \"Im Kampf\"\nL.general_error_none = \"Nichts\"\nL.general_vehicle_mouseover = \"Fahrzeugfenster bei mouseover anzeigen\"\nL.general_move_blizzard = \"Einige Blizzardfenster frei bewegbar machen\"\nL.general_color_picker = \"Verbesserte Farbauswahl\"\nL.general_color_picker_desc = \"Hinzufügen von Kopieren/Einfügen-Schaltflächen und Eingabe von Zifferntext für Blizzard-Farbauswahlrahmen\"\nL.general_minimize_mouseover = \"Mouseover für Quest minimieren Taste\"\nL.general_hide_banner = \"Autoverstecken des Boss Loot Frame\"\nL.general_hide_talking_head = \"Verstecke Talking Head Frame\"\nL.general_hide_maw_buffs = \"Hide Maw Buffs frame in instances\" -- Need review\n\n-- Media options\nL.media_border_color = \"Farbe für Rahmen\"\nL.media_classborder_color = \"Farbe für Klassenrahmen\"\nL.media_backdrop_color = \"Farbe für Rahmen-Hintergrund\"\nL.media_backdrop_alpha = \"Alpha für transparenten Hintergrund\"\nL.media_texture = \"Haupttextur\"\nL.media_subheader_normal = \"Change general font\" -- Need review\nL.media_subheader_pixel = \"Ändere Pixel Schriftart\" -- Need review\n\n-- Font options\nL.font = \"Schriftart\"\nL.font_subtext = \"Anpassen der einzelne Schriftarten für Elemente.\"\nL.font_stats_font = \"Schriftart auswählen\"\nL.font_stats_font_style = \"Schriftart Flag\"\nL.font_stats_font_shadow = \"Schriftart Schatten\"\nL.font_subheader_stats = \"Stats Schriftart\"\nL.font_subheader_combat = \"Combat Text Schriftart\"\nL.font_subheader_chat = \"Chat Text Schriftart\"\nL.font_subheader_chat_tabs = \"Chat Tabs Schriftart\"\nL.font_subheader_action = \"Actionbars Schriftart\"\nL.font_subheader_threat = \"Threatmeter Schriftart\"\nL.font_subheader_raidcd = \"Raid Cooldowns Schriftart\"\nL.font_subheader_cooldown = \"Cooldowns Timer Schriftart\"\nL.font_subheader_loot = \"Loot Schriftart\"\nL.font_subheader_nameplates = \"Nameplates Schriftart\"\nL.font_subheader_unit = \"Unit Frames Schriftart\"\nL.font_subheader_aura = \"Auras Schriftart\"\nL.font_subheader_filger = \"Filger Schriftart\"\nL.font_subheader_style = \"Design Schriftart\"\nL.font_subheader_bag = \"Taschen Schriftart\"\nL.font_subheader_blizzard = \"System font size\" -- Need review\nL.font_tooltip_header_font_size = \"Tooltip header\" -- Need review\nL.font_tooltip_font_size = \"Tooltip text\" -- Need review\nL.font_global_font = \"Disable Pixel font\" -- Need review\n\n-- Skins options\nL_GUI_SKINS = \"Design/Skins\"\nL_GUI_SKINS_SUBTEXT = \"Ändert das Erscheinungsbild der Standard UI.\"\nL_GUI_SKINS_BLIZZARD = \"Aktiviere Styles für Blizzardfenster\"\nL_GUI_SKINS_MINIMAP_BUTTONS = \"Aktiviere styling Addonincons an der Minimap\"\nL_GUI_SKINS_SUBHEADER = \"Design/Skins für Addons\"\nL.skins_minimap_buttons_mouseover = \"Addons-Symbole bei Mouseover\"\nL.skins_bubbles = \"Blizzard Chat Blasen verändern\"\n\n-- Unit Frames options\nL_GUI_UF_SUBTEXT = \"Anpassen von Player, Zielframes usw.\"\nL_GUI_UF_ENABLE = \"Unitframes aktivieren\"\nL_GUI_UF_OWN_COLOR = \"Farbe für die Lebensleiste festlegen\"\nL_GUI_UF_UF_COLOR = \"Farbe der Lebensleiste (falls eigene Farbe verwender wird)\"\nL.unitframe_uf_color_bg = \"Color of health background\" -- Need review\nL.unitframe_enemy_health_color = \"Lebensleiste eines gegnerischen Ziels ist rot\"\nL_GUI_UF_TOTAL_VALUE = \"Zeige Infotext auf Spieler und Ziel mit XXX/Gesamt\"\nL_GUI_UF_COLOR_VALUE = \"Lebens/Mana Werte einfärben\"\nL_GUI_UF_BAR_COLOR_VALUE = \"Lebensbalken nach vorhandenem Leben einfärben\"\nL_GUI_UF_LINES = \"Zeige Spieler & Ziel Extra Linien an\"\nL_GUI_UF_SUBHEADER_CAST = \"Zauberleiste\"\nL_GUI_UF_UNIT_CASTBAR = \"Zeige Zauberleisten\"\nL_GUI_UF_CASTBAR_ICON = \"Zeige Symbole der Zauberleisten an\"\nL_GUI_UF_CASTBAR_LATENCY = \"Latenz in Zauberleiste anzeigen\"\nL_GUI_UF_CASTBAR_TICKS = \"Castbar Ticks\"\nL_GUI_UF_SUBHEADER_FRAMES = \"Frames/Einheitenfenster\"\nL_GUI_UF_SHOW_PET = \"Zeige Begleiterfenster an\"\nL_GUI_UF_SHOW_FOCUS = \"Zeige Fokusfenster an\"\nL_GUI_UF_SHOW_TOT = \"Zeige 'Ziel des Ziels' Fenster an\"\nL_GUI_UF_SHOW_BOSS = \"Zeige Bossfenster\"\nL_GUI_UF_BOSS_RIGHT = \"Bossfenster rechts\"\nL_GUI_UF_SHOW_ARENA = \"Zeige Arenafenster\"\nL_GUI_UF_ARENA_RIGHT = \"Arenafenster Rechts\"\nL_GUI_UF_BOSS_DEBUFFS = \"Anzahl der Debuffs\"\nL_GUI_UF_BOSS_DEBUFFS_DESC = \"Anzahl der Debuffs am Boss Frames\"\nL_GUI_UF_BOSS_BUFFS = \"Anzahl der Buffs\"\nL_GUI_UF_BOSS_BUFFS_DESC = \"Anzahl der Buffs am Boss Frames\"\nL.unitframe_icons_pvp = \"PvP-Status-Text\"\nL.unitframe_icons_pvp_desc = \"Zeige PvP Text (keine Symbole) bei Mouseover (Spieler+Ziel)\"\nL_GUI_UF_ICONS_COMBAT = \"Kampfsymbol\"\nL_GUI_UF_ICONS_RESTING = \"Ausruhensymbol für low-lvl Chars\"\nL_GUI_UF_SUBHEADER_PORTRAIT = \"Portraits\"\nL_GUI_UF_PORTRAIT_ENABLE = \"Aktiviere Spieler/Ziel Portraits\"\nL_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = \"Aktiviere Rahmen in Klassenfarbe\"\nL.unitframe_portrait_type = \"Type of portraits\" -- Need review\nL.unitframe_portrait_type_icons = \"Class Icons\" -- Need review\nL.unitframe_portrait_type_overlay = \"Overlay\" -- Need review\nL_GUI_UF_PORTRAIT_HEIGHT = \"Portraithöhe\"\nL_GUI_UF_PORTRAIT_WIDTH = \"Portraitbreite\"\nL_GUI_UF_SUBHEADER_PLUGINS = \"Plugins\"\nL_GUI_UF_PLUGINS_GCD = \"Blitz für globalen Cooldown\"\nL_GUI_UF_PLUGINS_SWING = \"Swingleiste\"\nL.unitframe_plugins_reputation_bar = \"Rufleiste\"\nL.unitframe_plugins_reputation_bar_desc = \"Rufleiste\"\nL.unitframe_plugins_experience_bar = \"Erfahrungsleiste\"\nL.unitframe_plugins_experience_bar_desc = \"Erfahrungsleiste\"\nL_GUI_UF_PLUGINS_SMOOTH_BAR = \"Weichgezeichnete Leisten\"\nL_GUI_UF_PLUGINS_ENEMY_SPEC = \"Zeige gegnerische Talente\"\nL_GUI_UF_PLUGINS_COMBAT_FEEDBACK = \"Kampftexts auf Spieler/Zielfenster\"\nL_GUI_UF_PLUGINS_FADER = \"Blende Einheitenfenster aus\"\nL_GUI_UF_PLUGINS_DIMINISHING = \"Diminishing Returns Symbole auf Arena Fenstern\"\nL_GUI_UF_PLUGINS_POWER_PREDICTION = \"Balken der Energiekosten auf dem Spielerframe\"\nL.unitframe_plugins_absorbs = \"Absorbiert den Wert auf dem Spielerframe\"\nL.unitframe_subheader_player_width = \"Spieler- und Ziel-Frame-Größe\"\nL.unitframe_player_width = \"Breite\"\nL.unitframe_subheader_boss_width = \"Boss and arena frame size\" -- Need review\nL.unitframe_extra_height_auto = \"Automatische Höhe für Gesundheit/Kraft\"\nL.unitframe_extra_height_auto_desc = \"Intelligente Anpassung je nach Schriftgröße\"\nL.unitframe_extra_health_height = \"Zusätzliche Höhe für die Gesundheit\"\nL.unitframe_extra_power_height = \"Zusätzliche Höhe für Power/Energie\"\nL.unitframe_subheader_castbar = \"Size of player and target castbar\" -- Need review\nL.unitframe_castbar_height = \"Height\" -- Need review\n\n-- Unit Frames Class bar options\nL_GUI_UF_PLUGINS_CLASS_BAR = \"Unit Frames Klassenleisten\"\nL_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = \"Kontrolle von Ressourcen der Sonderklasse.\"\nL_GUI_UF_PLUGINS_COMBO_BAR = \"Symbole für Schurke/Druide Combopunkte\"\nL_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = \"Zeige immer die Combo Leiste für Druiden\"\nL_GUI_UF_PLUGINS_COMBO_BAR_OLD = \"Zeige Combopunkte auf dem Ziel\"\nL_GUI_UF_PLUGINS_ARCANE_BAR = \"Aktiviere Arcane Charge Leiste\"\nL_GUI_UF_PLUGINS_CHI_BAR = \"Ativiere Chi Leiste\"\nL_GUI_UF_PLUGINS_STAGGER_BAR = \"Aktiviere Stagger Leiste (für Monk Tanks)\"\nL_GUI_UF_PLUGINS_HOLY_BAR = \"Aktivere Heilige Kraft Leiste\"\nL_GUI_UF_PLUGINS_SHARD_BAR = \"Aktiviere Splitter Leiste\"\nL_GUI_UF_PLUGINS_RUNE_BAR = \"Runenleiste\"\nL_GUI_UF_PLUGINS_TOTEM_BAR = \"Totemleiste\"\nL.unitframe_class_bar_totem_other = \"Enable Totem bar for other classes\" -- Need review\nL.unitframe_class_bar_essence = \"Enable Essence bar for Evoker\" -- Need review\n\n-- Raid Frames options\nL_GUI_UF_RAIDFRAMES_SUBTEXT = \"Anpassen des Aussehens der Raid Frames.\"\nL_GUI_UF_BY_ROLE = \"Sortierung der Gruppenspieler nach Rolle\"\nL_GUI_UF_AGGRO_BORDER = \"Rahmen bei Bedrohung\"\nL_GUI_UF_DEFICIT_HEALTH = \"Fehlendes Leben im Raid\"\nL_GUI_UF_SHOW_PARTY = \"Zeige Gruppenfenster\"\nL_GUI_UF_SHOW_RAID = \"Zeige Raidfenster\"\nL.raidframe_layout = \"Raid layout\" -- Needs review\nL.raidframe_heal_layout = \"Heal\" -- Needs review\nL.raidframe_dps_layout = \"DPS\" -- Needs review\nL.raidframe_auto_layout = \"Auto\" -- Needs review\nL.raidframe_show_target = \"Show target frames\" -- Needs review\nL.raidframe_show_pet = \"Show pet frames\" -- Needs review\nL.raidframe_vertical_health = \"Vertikale Orientierung für Lebensbalken\"\nL.raidframe_vertical_health_desc = \"Only for heal layout\" -- Needs review\nL_GUI_UF_ALPHA_HEALTH = \"Transparenz der Lebensbalken wenn 100% Leben\"\nL_GUI_UF_SHOW_RANGE = \"Raidframes durchsichtig abhängig von der Entfernung\"\nL_GUI_UF_RANGE_ALPHA = \"Alpha\"\nL_GUI_UF_RANGE_ALPHA_DESC = \"Einheitenfenster zu diesem Maß ausblenden wenn außer Reichweite\"\nL_GUI_UF_SUBHEADER_RAIDFRAMES = \"Frames\"\nL_GUI_UF_SOLO_MODE = \"Spielerfenster immer Anzeigen\"\nL_GUI_UF_PLAYER_PARTY = \"Spielerfenster in der Gruppe anzeigen\"\nL_GUI_UF_SHOW_TANK = \"Zeige Raid Tanks an\"\nL_GUI_UF_SHOW_TANK_TT = \"Zeige Ziel des Raid Tank Ziels (Ziel des Ziels)\"\nL_GUI_UF_RAID_GROUP = \"Anzahl der Gruppen im Raid\"\nL.raidframe_party_vertical = \"Vertical party frames\" -- Needs review\nL.raidframe_raid_groups_vertical = \"Vertikale Raidgruppen\" -- Needs review\nL.raidframe_raid_groups_vertical_desc = \"Heiler Layout\" -- Needs review\nL_GUI_UF_SUBHEADER_ICONS = \"Icons\"\nL_GUI_UF_ICONS_ROLE = \"Rollensymbol auf den Unit Frames\"\nL_GUI_UF_ICONS_RAID_MARK = \"Raidsymbole\"\nL_GUI_UF_ICONS_READY_CHECK = \"Bereitschaftschecksymbole\"\nL_GUI_UF_ICONS_LEADER = \"Anführer/Assistent an den Fenstern anzeigen\"\nL_GUI_UF_ICONS_SUMON = \"Sumon-Symbole\"\nL.raidframe_icons_phase = \"Phase\"\nL.raidframe_plugins_debuffhighlight_icon = \"Debufftextur und Symbol hervorheben\" -- Need review\nL.raidframe_plugins_aura_watch = \"'RAID' Buffüberwachung\"\nL.raidframe_plugins_aura_watch_timer = \"Timer auf Schlachtzugsdebuff Icons\"\nL.raidframe_plugins_pvp_debuffs = \"Zeige ebenfalls PvP Debuff Symbol (aus der Liste)\"\nL_GUI_UF_PLUGINS_HEALCOMM = \"Leiste für Eingehende Heilung\"\nL.raidframe_plugins_over_absorb = \"Show over absorb bar on frame\" -- Need review\nL.raidframe_plugins_over_heal_absorb = \"Show over heal absorb on frame\" -- Need review\nL.raidframe_plugins_auto_resurrection = \"Automatische Wiederbelebung\"\nL.raidframe_plugins_auto_resurrection_desc = \"Mittel-Klick um automatisch Auferstehung zu zauber wenn das Ziel tot ist (funktioniert nicht wenn Clique installiert ist)\"\nL.raidframe_hide_health_value = \"Gesundheitswert ausblenden\" -- Needs review\nL.raidframe_auto_position = \"Automatische Neupositionierung der Raid-Frames\"\nL.raidframe_auto_position_desc = \"Wenn es mehr als 5 Gruppen gibt, ändern sich die Frames\" -- Need review\nL.raidframe_auto_position_dynamic = \"Dynamic\" -- Need review\nL.raidframe_auto_position_static = \"Static\" -- Need review\nL.raidframe_subheader_heal_size = \"Größe für Heal-Layout\"\nL.raidframe_heal_width = \"Frame Breite\"\nL.raidframe_heal_height = \"Frame Höhe\"\nL.raidframe_heal_power_height = \"Power Höhe\"\nL.raidframe_subheader_dps_size = \"Größe für DPS-Layout\"\nL.raidframe_dps_party_width = \"Party Breite\"\nL.raidframe_dps_party_height = \"Party Höhe\"\nL.raidframe_dps_raid_width = \"Raid Breite\"\nL.raidframe_dps_raid_height = \"Raid Höhe\"\nL.raidframe_dps_party_power_height = \"Party Power Höhe\"\nL.raidframe_dps_raid_power_height = \"Raid Power Höhe\"\n\n-- ActionBar options\nL_GUI_ACTIONBAR = \"Aktionsleisten\"\nL_GUI_ACTIONBAR_ENABLE = \"Aktionsleisten aktivieren\"\nL_GUI_ACTIONBAR_HOTKEY = \"Zeige Hotkey-Text an\"\nL_GUI_ACTIONBAR_MACRO = \"Zeige Makronamen auf den Buttons\"\nL_GUI_ACTIONBAR_GRID = \"Zeige die leeren Knöpfe der Aktionsleisten an\"\nL_GUI_ACTIONBAR_BUTTON_SIZE = \"Knopfgröße\"\nL_GUI_ACTIONBAR_BUTTON_SPACE = \"Buttonabstand\"\nL_GUI_ACTIONBAR_SPLIT_BARS = \"Splitte die Fünfte Aktionsleiste im zwei 6 Knöpfe Leisten\"\nL_GUI_ACTIONBAR_CLASSCOLOR_BORDER = \"Aktiviere Klassenfarbe für Aktionsleisten\"\nL.actionbar_toggle_mode = \"Aktiviere 'toggle mode'\"\nL.actionbar_toggle_mode_desc = \"The quick change in the number of panels. For the lower panels, hover the mouse over the hidden area above the panels. For right panels, hover the mouse over the area below the panels.\" -- Need review\nL_GUI_ACTIONBAR_HIDE_HIGHLIGHT = \"hebe keine Procs hervor\"\nL_GUI_ACTIONBAR_BOTTOMBARS = \"Anzahl der Aktionsleisten an der unteren Seite\"\nL_GUI_ACTIONBAR_RIGHTBARS = \"Anzahl der Aktionsleisten an der rechten Seite\"\nL.actionbar_bottombars_mouseover = \"Bottom bars on mouseover\" -- Needs review\nL_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = \"Zeige die rechten Leisten nur bei Mouseover\"\nL_GUI_ACTIONBAR_PETBAR_HIDE = \"Verstecke Begleiterleiste\"\nL_GUI_ACTIONBAR_PETBAR_HORIZONTAL = \"Aktiviere horizontale Begleiterleiste\"\nL_GUI_ACTIONBAR_PETBAR_MOUSEOVER = \"Zeige die Begleiterleiste nur bei Mouseover(nur für horizontale Begleiterleiste)\"\nL_GUI_ACTIONBAR_STANCEBAR_HIDE = \"Gestaltenleiste verstecken\"\nL_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = \"Horizontale Haltungsleiste aktivieren\"\nL.actionbar_stancebar_horizontal_desc = \"Befindet sich unter dem Rahmen des Spielers\"\nL_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = \"Zeige Haltungsleiste/Gestaltenleiste nur bei Mouseover\"\nL_GUI_ACTIONBAR_MICROMENU = \"Zeige Micromenü\"\nL_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = \"Micromenü bei MouseOver\"\nL.actionbar_editor = \"Bars editor\" -- Needs review\nL.actionbar_editor_desc = \"Allow to move and change each panel individually\" -- Needs review\nL.actionbar_bar1_num = \"Number of buttons\" -- Needs review\nL.actionbar_bar1_row = \"Buttons per row\" -- Needs review\nL.actionbar_bar1_mouseover = \"Bar on mouseover\" -- Needs review\n\n-- Tooltip options\nL.tooltip = \"Tooltip\"\nL.tooltip_subtext = \"Hier kannst Du die Standard Tips beim Mouseover ändern.\"\nL.tooltip_enable = \"Aktiviere Tooltip\"\nL.tooltip_shift_modifer = \"Tooltip anzeigen wenn 'Umschalttaste' gedrückt wird\"\nL.tooltip_cursor = \"Tooltip unter dem Mauszeiger öffnen\"\nL.tooltip_item_icon = \"Symbol der Gegenstände im Tooltip anzeigen\"\nL.tooltip_health_value = \"Numerischer Wert der Lebenspunkte\"\nL.tooltip_hidebuttons = \"Tooltips für Aktionsleisten verstecken\"\nL.tooltip_hide_combat = \"Verstecke Tooltip im Kampf\"\nL.tooltip_subheader = \"Plugins\"\nL.tooltip_talents = \"Zeige die Talente im Tooltip an\"\nL.tooltip_show_shift = \"Anzeigen, wenn Shift gedrückt wird\"\nL.tooltip_show_shift_desc = \"Zeige Item-Level und Spezifikationen, wenn die Umschalttaste gedrückt wird\"\nL.tooltip_achievements = \"Verlgeichen von Erfolgen in Tooltips\"\nL.tooltip_target = \"Ziel des Spielers im Tooltip anzeigen\"\nL.tooltip_title = \"Spieler Title im Tooltip\"\nL.tooltip_realm = \"Spieler Realm Name im Tooltip\"\nL.tooltip_rank = \"Gildenrank im Tooltip anzeigen\"\nL.tooltip_spell_id = \"Zauber ID\"\nL.tooltip_average_lvl_desc = \"Der durchschnittliche Item Level (GS)\"\nL.tooltip_raid_icon = \"Raidsymbol\"\nL.tooltip_who_targetting = \"Zeige an, wer die Eihneit, die in deiner Gruppe/Raid ist, ins Ziel nimmt\"\nL.tooltip_item_count = \"Gegenstandsanzahl\"\nL.tooltip_unit_role = \"Klassenrolle (Tank/Schaden/Heiler)\"\nL.tooltip_instance_lock = \"Deine abgeschlossenen Instanzen im Tooltip\"\nL.tooltip_mount = \"Source of mount\" -- Needs review\n\n-- Chat options\nL.chat_subtext = \"Hier Einstellungen des Chat-Fensters ändern.\"\nL.chat_enable = \"Chat aktivieren\"\nL.chat_background = \"Chathintergrund aktivieren\"\nL.chat_background_alpha = \"Transparenz des Hintergrunds\"\nL.chat_filter = \"Entferne Systemspam\"\nL.chat_filter_desc = \"Duels, change talents, NPC dialogue in city\" -- Need review\nL.chat_spam = \"Entferne einigen Spam vom Server\"\nL.chat_spam_list = \"Black list\" -- Need review\nL.chat_spam_list_desc = \"List of words (separated by space, lowercase letters) to hide messages\" -- Need review\nL.chat_width = \"Breite des Chatfensters\"\nL.chat_height = \"Höhe desChatfensters\"\nL.chat_chat_bar = \"Kleine Leiste um den Chatchannel zu wechseln\"\nL.chat_chat_bar_mouseover = \"Aktionsleiste bei Mousover hervorheben\"\nL.chat_whisp_sound = \"Geräusch abspielen wenn eine private Nachricht empfangen wird\"\nL.chat_combatlog = \"Kampflog Reiter anzeigen\"\nL.chat_tabs_mouseover = \"Zeige Chat-Reiter bei Mouseover\"\nL.chat_sticky = \"Behalte den letzen Channel\"\nL.chat_damage_meter_spam = \"Fasse DMG-Meterspam in einer Zeile zusammen\"\nL.chat_loot_icons = \"Symbole für Beute\"\nL.chat_hide_combat = \"Hide chat in combat\" -- Needs review\nL.chat_custom_time_color = \"Aktivieren der benutzerdefinierten Zeitstempelfärbung\"\nL.chat_time_color = \"Farbe des Zeitstempels\"\n\n-- Nameplate options\nL_GUI_NAMEPLATE_SUBTEXT = \"Nameplates Einstellung\"\nL_GUI_NAMEPLATE_ENABLE = \"Namensplaketten aktivieren\"\nL_GUI_NAMEPLATE_COMBAT = \"Namensplaketten automatisch im Kampf anzeigen\"\nL_GUI_NAMEPLATE_HEALTH = \"Numerischer Wert der Lebenspunkte\"\nL_GUI_NAMEPLATE_HEIGHT = \"Höhe der Namensplakette\"\nL_GUI_NAMEPLATE_WIDTH = \"Breite der Namensplakette\"\nL.nameplate_alpha = \"Alpha\"\nL.nameplate_alpha_desc = \"Kein-Ziel Nameplate Alpha\"\nL.nameplate_ad_height = \"Zusätzliche Höhe\"\nL.nameplate_ad_width = \"Zusätzliche Breite\"\nL.nameplate_ad_height_desc = \"Zusätzliche Höhe für ausgewähltes Nameplate\"\nL.nameplate_ad_width_desc = \"Zusätzliche Breite für ausgewählte Nameplate\"\nL_GUI_NAMEPLATE_CASTBAR_NAME = \"Zeige den Namen in der Zauberleiste\"\nL_GUI_NAMEPLATE_CLASS_ICON = \"Zeige Klassensymbole an (PvP)\"\nL_GUI_NAMEPLATE_NAME_ABBREV = \"Namen abgekürzt anzeigen\"\nL.nameplate_short_name = \"Replace names with short ones\" -- Need review\nL.nameplate_clamp = \"Namensschilder am oberen Rand des Bildschirms, wenn außerhalb der Sichtweite.\" -- Need review\nL.nameplate_clamp_desc = \"Namensschilder am oberen Rand des Bildschirms, wenn außerhalb der Sichtweite.\"\nL_GUI_NAMEPLATE_SHOW_DEBUFFS = \"Zeige Schwächungszauber (Abgekürzte Namen müssen deaktiviert sein)\"\nL_GUI_NAMEPLATE_SHOW_BUFFS = \"Show dispellable enemy buffs and buffs from the list\" -- Need review\nL_GUI_NAMEPLATE_DEBUFFS_SIZE = \"Größe der Debuffs\" -- Need review\nL_GUI_NAMEPLATE_HEALER_ICON = \"Zeige Heilersymbol auf allen gegnerischen Heiler-Nameplates im BG\"\nL_GUI_NAMEPLATE_TOTEM_ICONS = \"Symbol über dem Namensschild des feindlichen Totems anzeigen\"\nL.nameplate_target_glow = \"Show glow texture for target\" -- Need review\nL.nameplate_only_name = \"Show only name for friendly units\" -- Need review\nL.nameplate_quests = \"Show quest icon\" -- Need review\nL.nameplate_cast_color = \"Show color border for casting important spells\" -- Need review\nL.nameplate_kick_color = \"Change cast color if interrupt on cd\" -- Need review\nL.nameplate_low_health_value = \"Health value\" -- Need review\nL.nameplate_low_health = \"Low health highlight\" -- Need review\nL_GUI_NAMEPLATE_THREAT = \"Aktiviere Bedrohungsanzeige, ändert sich automatisch je nach deiner Rolle\"\nL_GUI_NAMEPLATE_GOOD_COLOR = \"Positive Bedrohungsfarbe. Variiert abhängig ob Tank oder dps/heal\"\nL_GUI_NAMEPLATE_NEAR_COLOR = \"Verlust oder Zuwachs der Bedrohung farbig kennzeichen\"\nL_GUI_NAMEPLATE_BAD_COLOR = \"Negative Bedrohungsfarbe. Variiert abhängig ob Tank oder dps/heal\"\nL_GUI_NAMEPLATE_OFFTANK_COLOR = \"Farbe der Offtank-Bedrohung\"\nL.nameplate_extra_color = \"Explosive and Spiteful affix color\" -- Need review\nL.nameplate_mob_color_enable = \"Change color for important mobs in dungeons\" -- Need review\nL.nameplate_mob_color = \"Color for mobs\" -- Need review\n\n-- Combat text options\nL_GUI_COMBATTEXT = \"Kampftext\"\nL_GUI_COMBATTEXT_SUBTEXT = \"Zum Verschieben tippe im Chat '/xct' ein\"\nL_GUI_COMBATTEXT_ENABLE = \"Kampftext aktivieren\"\nL.combattext_blizz_head_numbers = \"Aktiviere Blizzard Kampftext\"\nL.combattext_blizz_head_numbers_desc = \"Blizzard Schaden-/Heilausgabe benutzen (über Spieler/Kreaturen Kopf)\"\nL.combattext_damage_style = \"Ändert die Standardkampfschriftart\"\nL.combattext_damage_style_desc = \"Standard Schaden/Heilung Schriftart über Kreaturen/Spieler Köpfen ändern (Neustart von WoW erforderlich um Änderungen zu sehen)\"\nL_GUI_COMBATTEXT_DAMAGE = \"Zeige ausgehenden Schaden in einem eigenen Fenster\"\nL_GUI_COMBATTEXT_HEALING = \"Zeige ausgehende Heilung in einem eigenen Fenster\"\nL.combattext_incoming = \"Show incoming damage and healing\" -- Need review\nL_GUI_COMBATTEXT_HOTS = \"Zeige peroidische Heilungseffekte im Heilungsfenster\"\nL_GUI_COMBATTEXT_OVERHEALING = \"Zeige ausgehende Überheilung an\"\nL_GUI_COMBATTEXT_PET_DAMAGE = \"Zeige Begleiterschaden\"\nL_GUI_COMBATTEXT_DOT_DAMAGE = \"Zeige Schaden von Schaden über Zeit\"\nL_GUI_COMBATTEXT_DAMAGE_COLOR = \"Zeige Schadensnummern in Abhängigkeit von der Art des Zaubers\"\nL_GUI_COMBATTEXT_CRIT_PREFIX = \"Symbol vor einem kritischen Treffer\"\nL_GUI_COMBATTEXT_CRIT_POSTFIX = \"Symbol hinter einem kritischen Treffer\"\nL_GUI_COMBATTEXT_ICONS = \"Zeige Symbole für ausgehenden Schaden\"\nL_GUI_COMBATTEXT_ICON_SIZE = \"Icon größe\"\nL_GUI_COMBATTEXT_ICON_SIZE_DESC = \"Symbolgröße der Zauber im Fenster für ausgehenden Schaden. Nimmt auch Einfluss auf die Schriftgröße\"\nL_GUI_COMBATTEXT_TRESHOLD = \"Ab welcher Größe soll der Schaden angezeigt werden\"\nL_GUI_COMBATTEXT_HEAL_TRESHOLD = \"Ab welche Größe soll ein-/ausgehende Heilung angezeigt werden\"\nL_GUI_COMBATTEXT_SCROLLABLE = \"Erlaubt es dir mit dem Mausrad durch die letzten Zeilen zu scrollen\"\nL_GUI_COMBATTEXT_MAX_LINES = \"Max. Zeilen\"\nL_GUI_COMBATTEXT_MAX_LINES_DESC = \"Maximale Zeilen, die behalten werden sollen im Scrollmodus (mehr Zeilen = mehr Speicherverbrauch)\"\nL_GUI_COMBATTEXT_TIME_VISIBLE = \"Zeit\"\nL_GUI_COMBATTEXT_TIME_VISIBLE_DESC = \"Zeit(Sekunden) wielange eine einzelne Nachricht angezeigt wird\"\nL_GUI_COMBATTEXT_DK_RUNES = \"Zeige Runenaufladung vom Todesritter\"\nL_GUI_COMBATTEXT_KILLINGBLOW = \"Teilt dir mit ob du den Todesstoß bei einer Kreatur/einem Spieler hattest\"\nL.combattext_merge_aoe_spam = \"Merges spell spam into single message\" -- Needs review\nL.combattext_merge_aoe_spam_desc = \"Vereint mehrfachen Flächenschaden in eine einzige Nachricht\"\nL_GUI_COMBATTEXT_MERGE_MELEE = \"Fügt mehrfachen automatischen Angriffsschaden-Spam zusammen\"\nL.combattext_merge_all = \"Merges all spells\" -- Needs review\nL_GUI_COMBATTEXT_DISPEL = \"Informiert dich über deine Bannungen\"\nL_GUI_COMBATTEXT_INTERRUPT = \"Informiert dich über deine Unterbrechungen\"\nL_GUI_COMBATTEXT_DIRECTION = \"Ändert die Bildlaufrichtung von unten nach oben\"\nL_GUI_COMBATTEXT_SHORT_NUMBERS = \"Zeige kurze Zahlen an ('25.3k' statt '25342')\"\n\n-- Auras/Buffs/Debuffs\nL_GUI_AURA_PLAYER_BUFF_SIZE = \"Buff größe\"\nL_GUI_AURA_PLAYER_BUFF_SIZE_DESC = \"Größe der Spielerbuffs\"\nL.aura_debuff_size = \"Debuff größe\"\nL_GUI_AURA_SHOW_SPIRAL = \"Spirale auf Buffsymbolen\"\nL_GUI_AURA_SHOW_TIMER = \"Zeige Abklingzeit für Buffs\"\nL_GUI_AURA_PLAYER_AURAS = \"Buffs auf dem Spielerfenster\"\nL_GUI_AURA_TARGET_AURAS = \"Buffs auf dem Zielfenster\"\nL_GUI_AURA_FOCUS_DEBUFFS = \"Debuffs auf dem Fokusfenster\"\nL_GUI_AURA_FOT_DEBUFFS = \"Debuffs auf dem Fokusziel\"\nL_GUI_AURA_PET_DEBUFFS = \"Debuffs auf dem Begleiterfenster\"\nL_GUI_AURA_TOT_DEBUFFS = \"Debuffs bei Ziel des Ziels anzeigen\"\nL.aura_subheader_boss = \"Stärkungszauber auf dem Bossframe anzeigen.\" -- Need review\nL_GUI_AURA_PLAYER_AURA_ONLY = \"Nur eigenen Debuffs bei dem Zielfenster anzeigen\"\nL_GUI_AURA_DEBUFF_COLOR_TYPE = \"Debuffs nach Art einfärben\"\nL_GUI_AURA_CAST_BY = \"Zeige im Tooltip an von wem ein Buff- bzw. Debuff gewirkt wurde\"\nL_GUI_AURA_CLASSCOLOR_BORDER = \"Aktiviere Klassenfarbe für Spielerbuffs\"\nL.aura_subheader_buffs = \"Player buffs\" -- Need review\nL.aura_subheader_debuffs = \"Debuffs\" -- Need review\n\n-- Bag options\nL_GUI_BAGS = \"Taschen\"\nL_GUI_BAGS_SUBTEXT = \"Klicke mit der rechten Maustaste auf die Schaltfläche Schließen, um das Menü zu öffnen. Um die Beutel zu bewegen, halte die Umschalttaste gedrückt.\"\nL_GUI_BAGS_ENABLE = \"Taschen aktivieren\"\nL_GUI_BAGS_ILVL = \"Zeigt Itemlevel der Waffen & Rüstung\"\nL.bag_new_items = \"Show animation for new items\" -- Need review\nL.bag_filter = \"Always show filter buttons\" -- Need review\nL_GUI_BAGS_BUTTON_SIZE = \"Buttongröße\"\nL_GUI_BAGS_BUTTON_SPACE = \"Buttonabstand\"\nL_GUI_BAGS_BANK = \"Anzahl der Spalten in der Bank\"\nL_GUI_BAGS_BAG = \"Anzahl der Spalten in der Tasche\"\n\n-- Minimap options\nL_GUI_MINIMAP_SUBTEXT = \"Minimap Einstellungen.\"\nL_GUI_MINIMAP_ENABLE = \"Minimap aktivieren\"\nL.minimap_on_top = \"Move minimap on top right corner\" -- Need review\nL_GUI_MINIMAP_ICON = \"Aufspüren Symbol\"\nL_GUI_GARRISON_ICON = \"Garrisons Symbol\" -- Need review\nL_GUI_MINIMAP_SIZE = \"Minimap-Größe\"\nL_GUI_MINIMAP_HIDE_COMBAT = \"Minimap im Kampf verstecken\"\nL_GUI_MINIMAP_TOGGLE_MENU = \"Zeige Toggle Menü\"\nL.minimap_bg_map_stylization = \"Schlachtfeldkarte Aussehn\"\nL.minimap_fog_of_war = \"Nebel des Krieges auf der Weltkarte\"\n\n-- Loot options\nL_GUI_LOOT_SUBTEXT = \"Einstellungen für den Beuterahmen.\"\nL_GUI_LOOT_ENABLE = \"Plünderfenster aktivieren\"\nL_GUI_LOOT_ROLL_ENABLE = \"Gruppenplünderfenster aktivieren\"\nL_GUI_LOOT_ICON_SIZE = \"Symbolgröße\"\nL_GUI_LOOT_WIDTH = \"Breite des Plünderfensters\"\nL_GUI_LOOT_AUTOGREED = \"Aktiviere automatisches Würfeln (Gier) für Gegenstände, falls das höchste Level erreicht wurde.\"\nL_GUI_LOOT_AUTODE = \"Entzauberung automatisch bestätigen\"\nL.loot_faster_loot = \"Schnelleres Plündern\"\nL.loot_faster_loot_desc = \"Funktioniert nur, wenn die automatische Beute aktiviert ist\"\n\n-- Filger\nL_GUI_FILGER = \"Timers (Filger)\"\nL_GUI_FILGER_SUBTEXT = \"Filger - analog WeakAuras, aber einfacher und leichter. Ermöglicht es die, Auren und Timer in Form von Symbolen und Balken anzuzeigen.\"\nL_GUI_FILGER_ENABLE = \"Aktiviere Filger\"\nL_GUI_FILGER_TEST_MODE = \"Test Icon Mode\"\nL_GUI_FILGER_MAX_TEST_ICON = \"Anzahl der Icons im Test Mode\"\nL_GUI_FILGER_SHOW_TOOLTIP = \"Zeige Tooltips\"\nL.filger_subheader_elements = \"Zeige Elemente\"\nL.filger_show_buff = \"Spieler Buffs\"\nL.filger_show_proc = \"Spieler Procs\"\nL.filger_show_debuff = \"Debuffs auf Ziel\"\nL.filger_show_aura_bar = \"Aurabalken auf Ziel\"\nL.filger_show_special = \"Besondere Buffs auf Spieler\"\nL.filger_show_pvp_player = \"PvP-Debuffs auf Spieler\"\nL.filger_show_pvp_target = \"PvP-Auren auf Spieler\"\nL.filger_show_cd = \"Cooldowns\"\nL.filger_subheader_size = \"Icons größe\"\nL.filger_subheader_test = \"Test Modus\"\nL_GUI_FILGER_EXPIRATION = \"Abklingzeiten nach ablaufzeit sortieren\"\nL_GUI_FILGER_BUFFS_SIZE = \"Buff größe ändern\"\nL_GUI_FILGER_COOLDOWN_SIZE = \"Cooldowns größe ändern\"\nL_GUI_FILGER_PVP_SIZE = \"PvP Debuffs größe ändern\"\nL.filger_buffs_space = \"Buffs space\"\nL.filger_pvp_space = \"PvP Auren space\"\nL.filger_cooldown_space = \"Cooldowns space\"\nL.filger_subheader_spells = \"Hinzufügen neuer Zaubersprüche\"\nL.filger_category_list = \"Kategorie der Zauberliste\"\n\n-- Announcements options\nL_GUI_ANNOUNCEMENTS = \"Benachrichtigungen\"\nL_GUI_ANNOUNCEMENTS_SUBTEXT = \"Einstellungen, die Chat-Ankündigungen über Zaubersprüche oder Gegenstände hinzufügen.\"\nL.announcements_drinking = \"Sage im Chat an wenn ein Arenagegener trinkt\"\nL.announcements_interrupts = \"Interrupts\" -- Need review\nL.announcements_interrupts_desc = \"Sage deine Unterbrechungen im Raid oder Schlachtzugschat an\"\nL.announcements_spells = \"Cast spells\" -- Needs review\nL.announcements_spells_desc = \"Sage im Raid/Schachtzugschat an, wenn du den selben Zauber castest\"\nL.announcements_spells_from_all = \"From all members\" -- Needs review\nL.announcements_spells_from_all_desc = \"Prüfe Zauber von allen Spielern\"\nL.announcements_toys = \"Benachrichtigung über Spielzeugzug oder Düsterbräu's Fernbedienung\"\nL.announcements_pull_countdown = \"Pull countdown\" -- Needs review\nL.announcements_pull_countdown_desc = \"Pull cuntdown Benachrichtigung '/pc #'\"\nL.announcements_flask_food = \"Usage of flasks and food\" -- Needs review\nL.announcements_flask_food_desc = \"Benachrichtigung über Fläschchen und Bufffood (/ffcheck)\"\nL.announcements_flask_food_raid = \"Benachrichtigung in den Raid Channel\"\nL.announcements_flask_food_auto = \"Automatische Benachrichtigung beim ReadyCheck\" -- Needs review\nL.announcements_feasts = \"Benachrichtigung wenn Festmahl/Kessel/Seelensteine/Reparatur Bots aufgestellt wurden\"\nL.announcements_portals = \"Benachrichtigung über Portale/Ritual der Beschwörung\"\nL.announcements_subheader_self = \"Self announce\" -- Needs review\nL.announcements_bad_gear = \"Überprüfe Deine schlechte Ausrüstung\"\nL.announcements_bad_gear_desc = \"Überprüfe auf schlechte Ausrüstung in Instanzen\"\nL.announcements_safari_hat = \"Safari Hat\" -- Needs review\nL.announcements_safari_hat_desc = \"Überprüfe Safari Hat\"\n\n-- Automation options\nL_GUI_AUTOMATION = \"Automatisierung\"\nL_GUI_AUTOMATION_SUBTEXT = \"Dieser Block enthält Einstellungen, die die Routine erleichtern.\"\nL.automation_release = \"Automatisch im Schlachtfeld wiederbeleben\"\nL.automation_screenshot = \"Speicher einen Screenshot wenn ein Achivment errungen wird\"\nL.automation_solve_artifact = \"Auto Popup für gelöste Artefakte\"\nL.automation_solve_artifact_desc = \"Wenn es genug Fragmente für ein Artefakt gibt, erscheint ein Popup-Fenster, um es zu lösen.\"\nL.automation_accept_invite = \"Einladungen automatisch annehmen\"\nL.automation_decline_duel = \"Duell automatisch ablehnen\"\nL.automation_accept_quest = \"Quests automatisch annehmen\"\nL.automation_auto_collapse = \"Automatisches Zusammenklappen des Objective Tracker\"\nL.automation_auto_collapse_raid = \"In Instanzen\"\nL.automation_auto_collapse_reload = \"Nach dem Reload\"\nL.automation_auto_collapse_scenario = \"Partially\" -- Need review\nL.automation_skip_cinematic = \"Auto Cinematics/Filme überspringen\"\nL.automation_auto_role = \"Automatisch die eigene Rolle wählen\"\nL.automation_cancel_bad_buffs = \"Automatisch einige Buffs abbrechen\"\nL.automation_tab_binder = \"Automatisch nur feindliche Spieler mit der TAB Taste anvisieren\"\nL.automation_tab_binder_desc = \"'Tab' zielt nur auf feindliche Spieler in PvP-Zonen, ignoriert Haustiere und Mobs\"\nL.automation_logging_combat = \"Automatisch Kampflog in Raids als Textdatei mitschreiben\"\nL.automation_buff_on_scroll = \"Wirke Stärkungszauber mit Mausrad\"\nL.automation_buff_on_scroll_desc = \"Wenn der Stärkungszauber aus der Liste nicht auf den Spieler angewendet wird.(Maus-Rad Scroll).\"\nL.automation_open_items = \"Öffnet Automatisch Items in der Tasche\"\nL.automation_resurrection = \"Auferstehung bestätigen\"\nL.automation_summon = \"Bestätige Summon\"\nL.automation_whisper_invite = \"Auto invite when whisper keyword\" -- Needs review\nL.automation_invite_keyword = \"List of keyword (separated by space)\" -- Needs review\nL.automation_invite_keyword_desc = \"When player whisper you keyword he will be invited in your group\" -- Needs review\n\n-- Buffs reminder options\nL_GUI_REMINDER = \"Erinnerungen für Buffs\"\nL_GUI_REMINDER_SUBTEXT = \"Anzeige der vermissten Auren.\"\nL_GUI_REMINDER_SOLO_ENABLE = \"Zeige fehlende Eigenbuffs\"\nL_GUI_REMINDER_SOLO_SOUND = \"Spiele Warngeräusch ab bei fehlenden Eigenbuffs\"\nL_GUI_REMINDER_SOLO_SIZE = \"Solo Icon größe\"\nL_GUI_REMINDER_SOLO_SIZE_DESC = \"Eigener buff Icon größe\"\nL_GUI_REMINDER_SUBHEADER = \"Raidbuffs\"\nL_GUI_REMINDER_RAID_ENABLE = \"Zeige fehlende Raidbuffs an\"\nL_GUI_REMINDER_RAID_ALWAYS = \"Zeige Bufferinnerungen immer an\"\nL_GUI_REMINDER_RAID_SIZE = \"Raid Icon größe\"\nL_GUI_REMINDER_RAID_SIZE_DESC = \"Symbolgröße für Raidbuffs\"\nL_GUI_REMINDER_RAID_ALPHA = \"Transparent\"\nL_GUI_REMINDER_RAID_ALPHA_DESC = \"Transparente Symbole wenn der Buff vorhanden ist\"\n\n-- Raid cooldowns options\nL_GUI_COOLDOWN_RAID = \"Schlachtzugs Cooldowns\"\nL_GUI_COOLDOWN_RAID_SUBTEXT = \"Verfolgen von Raid-Cooldowns in der linken oberen Ecke.\"\nL_GUI_COOLDOWN_RAID_ENABLE = \"Abklingzeiten des Raids aktivieren\"\nL_GUI_COOLDOWN_RAID_HEIGHT = \"Bars Höhe\"\nL_GUI_COOLDOWN_RAID_WIDTH = \"Bars Breite\"\nL_GUI_COOLDOWN_RAID_SORT = \"Leisten für Raidabklingzeiten wachsen nach oben\"\nL_GUI_COOLDOWN_RAID_EXPIRATION = \"Sortieren nach Abklingzeit\"\nL_GUI_COOLDOWN_RAID_SHOW_SELF = \"Zeige deine Cooldowns\"\nL_GUI_COOLDOWN_RAID_ICONS = \"Symbole für Raidabklingzeiten\"\nL_GUI_COOLDOWN_RAID_IN_RAID = \"Zeige Raidabklingzeiten in Raidgebieten\"\nL_GUI_COOLDOWN_RAID_IN_PARTY = \"Zeige Raidabklingzeiten in Gruppengebieten\"\nL_GUI_COOLDOWN_RAID_IN_ARENA = \"Zeige Raidabklingzeiten in der Arena\"\n\n-- Enemy cooldowns options\nL_GUI_COOLDOWN_ENEMY = \"Gegner Cooldowns\"\nL_GUI_COOLDOWN_ENEMY_SUBTEXT = \"Verfolgen feindlicher Fähigkeiten als Symbole über der Zauberleiste.\"\nL_GUI_COOLDOWN_ENEMY_ENABLE = \"Aktiviere gegnerische Abklingzeiten\"\nL_GUI_COOLDOWN_ENEMY_SIZE = \"Symbolgröße für gegnerische Abklingzeiten\"\nL_GUI_COOLDOWN_ENEMY_DIRECTION = \"Gegner Cooldowns Symbol ausrichtung\"\nL_GUI_COOLDOWN_ENEMY_EVERYWHERE = \"Zeige gegnerische Abklingzeiten überall\"\nL_GUI_COOLDOWN_ENEMY_IN_BG = \"Zeige gegnerische Abklingzeiten in Schlachtfeldern\"\nL_GUI_COOLDOWN_ENEMY_IN_ARENA = \"Zeige gegnerische Abklingzeiten in der Arena\"\nL.enemycooldown_show_inparty = \"Anzeigen in der Partyzone für Allies\"\nL.enemycooldown_class_color = \"Klassenfarbige Umrandung aktivieren\"\n\n-- Pulse cooldowns options\nL_GUI_COOLDOWN_PULSE = \"Pulse Cooldowns\"\nL_GUI_COOLDOWN_PULSE_SUBTEXT = \"Verfolge CD mit einem Puls-Symbol in der Mitte des Bildschirms.\"\nL_GUI_COOLDOWN_PULSE_ENABLE = \"Zeige Abklingzeitimpuls\"\nL_GUI_COOLDOWN_PULSE_SIZE = \"Abklingzeitimpuls Symbolgröße\"\nL_GUI_COOLDOWN_PULSE_SOUND = \"Akustische Warnungen\"\nL_GUI_COOLDOWN_PULSE_ANIM_SCALE = \"Animationen Skalieren\"\nL_GUI_COOLDOWN_PULSE_HOLD_TIME = \"Maximale Zeit in der die Anzeige aktiv ist\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD = \"Threshold time\" -- Need review\nL_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = \"Minimale Zeitschwälle\"\n\n-- Threat options\nL_GUI_THREAT = \"Bedrohungsleisten\"\nL_GUI_THREAT_SUBTEXT = \"Display of the threat list (a simple analogue of Omen).\" -- Need review\nL_GUI_THREAT_ENABLE = \"Aktiviere Bedrohungsleisten\"\nL_GUI_THREAT_HEIGHT = \"Höhe der Bedrohungsleisten\"\nL_GUI_THREAT_WIDTH = \"Breite der Bedrohungsleisten\"\nL_GUI_THREAT_ROWS = \"Anzahl der Bedrohungsleisten\"\nL_GUI_THREAT_HIDE_SOLO = \"Nur in Gruppen oder Schlachtzügen anzeigen\"\n\n-- Top panel options\nL_GUI_TOP_PANEL = \"Oberes Panel\"\nL_GUI_TOP_PANEL_SUBTEXT = \"Eingebautes oberes Bedienfeld mit Informationen verwalten.\"\nL_GUI_TOP_PANEL_ENABLE = \"Aktiviere oberes Panel\"\nL_GUI_TOP_PANEL_MOUSE = \"Oberes Panel nur bei Mouseover anzeigen\"\nL_GUI_TOP_PANEL_WIDTH = \"Breite des Panels\"\nL_GUI_TOP_PANEL_HEIGHT = \"Höhe des Panels\"\n\n-- Stats options\nL_GUI_STATS = \"Statistiken\"\nL_GUI_STATS_SUBTEXT = \"Statistik-Anzeige am unteren Bildschirmrand. Im Chat '/ls' für Info.\"\nL_GUI_STATS_CLOCK = \"Uhr\"\nL_GUI_STATS_LATENCY = \"Latenz\"\nL_GUI_STATS_FPS = \"BPS\"\nL_GUI_STATS_EXPERIENCE = \"Erfahrung\"\nL_GUI_STATS_TALENTS_DESC = \"Wechselt bei Klick die Beute und Spec\"\nL_GUI_STATS_COORDS = \"Koordinaten\"\nL_GUI_STATS_LOCATION = \"Ort\"\nL_GUI_STATS_BG = \"Schlachtfeld\"\nL.stats_bottom_line = \"Bottom classcolor line\" -- Need review\nL_GUI_STATS_SUBHEADER_CURRENCY = \"Currency/Abzeichen (Anzeige im Gold Data Text)\"\nL_GUI_STATS_CURRENCY_ARCHAEOLOGY = \"Zeige Archäologie Fragmente\"\nL_GUI_STATS_CURRENCY_COOKING = \"Zeige Kochpreise/Marken\"\nL_GUI_STATS_CURRENCY_RAID = \"Zeige Schlatzugs Siegel/Bonuswürffe\"\n\n-- Trade options\nL_GUI_TRADE = \"Handel\"\nL_GUI_TRADE_SUBTEXT = \"Einstellungen für Handel und Berufe\"\nL.trade_profession_tabs = \"Berufereiter/Tabs\"\nL.trade_profession_tabs_desc = \"Berufereiter an Handelsfähigkeiten und Handelsfenstern anzeigen\"\nL.trade_already_known = \"Färbt bereits bekannte Elemente ein\"\nL.trade_already_known_desc = \"Bekannte Rezepte/Reittiere/Begleiter farblich hervorheben\"\nL.trade_disenchanting = \"Schnelle Entzauberung\"\nL.trade_disenchanting_desc = \"Sondieren, Mahlen and Entzaubern mit einem Klick\"\nL.trade_sum_buyouts = \"Alle Auktionen aufsummieren\"\nL.trade_sum_buyouts_desc = \"zeigt eine Zusammenfassung aller laufenden Auktionen\"\nL.trade_enchantment_scroll = \"Verzauberung auf Rolle im Beruffenster\"\nL.trade_archaeology = \"Archäologie Artifakte und Abklingzeit\"\nL.trade_archaeology_desc = \"Archäologie-Tracker ('/arch' oder rechte Maustaste auf Minimap-Taste zum Anzeigen)\"\nL.trade_merchant_itemlevel = \"Item level beim Händler\"\nL.trade_merchant_itemlevel_desc = \"Zeige Itemlevel für Waffen & Rüstung bei Händler\"\n\n-- Miscellaneous options\nL_GUI_MISC_SUBTEXT = \"Andere Einstellungen, die interessante Funktionen hinzufügen.\"\nL.misc_shift_marking = \"Markiert Mouseover-Ziel\"\nL.misc_shift_marking_desc = \"Markiert das Mouseover-Ziel, beim drücken der Umschalttaste (nur in der Gruppe)\"\nL.misc_afk_spin_camera = \"Kamera drehen während du AFK bist\"\nL.misc_quest_auto_button = \"Quest items auto Taste\"\nL.misc_quest_auto_button_desc = \"Quest/Gegenstand auto Taste\"\nL.misc_raid_tools = \"Raid Hilfsmittel\"\nL.misc_raid_tools_desc = \"Button at the top of the screen for ready check (Left-click), checking roles (Middle-click), setting marks, etc. (for leader and assistants)\" -- Need review\nL.misc_item_level = \"Item level on slot buttons\" -- Need review\nL.misc_item_level_desc = \"Itemlevel im Charakterfenster auf Items anzeigen\"\nL.misc_click_cast = \"Simpler 'click2cast' spell binder\"\nL.misc_click_cast_desc = \"Allows you to assign spells (analog Clique) to the mouse buttons. Setup through the side bookmark in the spell book\" -- Need review\nL.misc_click_cast_filter = \"Ignoriere Spieler- und Zielfenster für click2cast\"\nL.misc_chars_currency = \"Zeige deine Währungstoken über diverse Karaktere\"\nL.misc_chars_currency_desc = \"Hover over the icon of the required currency in the character window to display information in the tooltip\" -- Need review\nL.misc_hide_raid_button = \"Verstecke oUF_RaidDPS Knopf\"\nL.misc_hide_raid_button_desc = \"The button is displayed by hovering the mouse in the upper left corner\" -- Need review\n"
  },
  {
    "path": "ShestakUI_Config/Locales/Italian.lua",
    "content": "local _, L = ...\nif GetLocale() ~= \"itIT\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for itIT client\n--\tTranslation: Oz\n----------------------------------------------------------------------------------------\nL_GUI_SET_SAVED_SETTTINGS = \"Imposta le impostazioni 'Per-Personaggio'\"\nL_GUI_SET_SAVED_SETTTINGS_DESC = \"Switch between a profile that applies to all characters and one that is unique to this character.\" -- Need review\nL_GUI_RESET_CHAR = \"Vuoi davvero ripristinare le impostazioni iniziali della ShestakUI per questo personaggio?\"\nL_GUI_RESET_ALL = \"Vuoi davvero ripristinate tutte le impostazioni iniziali della ShestakUI?\"\nL_GUI_PER_CHAR = \"Vuoi davvero modificare questa impostazione (attivazione/disattivazione salvataggio impostazioni 'Per-Personaggio')?\"\nL_GUI_RESET_CAT = \"Are you sure you want to reset category's settings?\" -- Need review\nL_GUI_RESET_CAT_DESC = \"Reset category's settings. \\nCTRL-click to reset all\" -- Need review\nL_GUI_NEED_RELOAD = \"You need to reload the UI to apply your changes.\" -- Need review\nL_GUI_LAYOUT = \"Change layout\" -- Need review\nL_GUI_SPELL_LIST = \"List of spells\" -- Need review\nL_GUI_SPELL_INPUT = \"Spell ID\" -- Need review\nL_GUI_TIME_INPUT = \"Time\" -- Need review\nL_GUI_EXPERT_MODE = \"Expert mode\" -- Need review\nL_GUI_EXPERT_MODE_DESC = \"Custom editing of Lua profile\" -- Need review\nL_GUI_RESET_SPELLS_DESC = \"CTRL-click to reset list\" -- Need review\n\n-- Profile\nL.profile = \"Profile\" -- Need review\nL.profile_title = \"Profile options\" -- Need review\nL.profile_choose = \"Choose profile\" -- Need review\nL.profile_options = \"Settings\" -- Need review\nL.profile_movers = \"Moving elements\" -- Need review\nL.profile_export = \"Export\" -- Need review\nL.profile_import = \"Import\" -- Need review\nL.profile_error_lib = \"To enable export and import - install WeakAuras\" -- Need review\nL.profile_error_code = \"Error in imported code!\" -- Need review\n\n-- General options\nL_GUI_GENERAL_SUBTEXT = \"These settings control the general user interface settings. Type in chat '/uihelp' for help.\" -- Need review\nL_GUI_GENERAL_WELCOME_MESSAGE = \"Messaggio di benvenuto in chat\"\nL_GUI_GENERAL_AUTOSCALE = \"Ridimensionamento automatico dell'interfaccia\"\nL_GUI_GENERAL_UISCALE = \"Scala dell'interfaccia (se il ridimensionamento automatico è disabilitato)\"\nL.general_subheader_blizzard = \"Blizzard UI elements\" -- Need review\nL.general_error_filter = \"Error filtering\" -- Need review\nL.general_error_blacklist = \"Blacklist\" -- Need review\nL.general_error_whitelist = \"Whitelist\" -- Need review\nL.general_error_combat = \"In combat\" -- Need review\nL.general_error_none = \"None\" -- Need review\nL.general_vehicle_mouseover = \"Riquadro veicolo al passaggio del mouse\"\nL.general_move_blizzard = \"Consenti di muovere alcuni riquadri dell'interfaccia Blizzard\"\nL.general_color_picker = \"Selezionatore colore migliorato\"\nL.general_color_picker_desc = \"Add copy/paste buttons and digit text entry for Blizzard color picker frame\" -- Need review\nL.general_minimize_mouseover = \"Pulsante per minimizzare le missioni al passaggio del mouse\"\nL.general_hide_banner = \"Nascondi il Boss Banner Loot Frame\"\nL.general_hide_talking_head = \"Nascondi il Talking Head Frame\"\nL.general_hide_maw_buffs = \"Hide Maw Buffs frame in instances\" -- Need review\n\n-- Media options\nL.media_border_color = \"Color for borders\" -- Need review\nL.media_classborder_color = \"Color for class borders\" -- Need review\nL.media_backdrop_color = \"Color for borders backdrop\" -- Need review\nL.media_backdrop_alpha = \"Alpha for transparent backdrop\" -- Need review\nL.media_texture = \"Main texture\" -- Need review\nL.media_subheader_normal = \"Change general font\" -- Need review\nL.media_subheader_pixel = \"Change secondary font\" -- Need review\n\n-- Font options\nL.font = \"Fonts\" -- Need review\nL.font_subtext = \"Customize individual fonts for elements.\" -- Need review\nL.font_stats_font = \"Select font\" -- Need review\nL.font_stats_font_style = \"Font flag\" -- Need review\nL.font_stats_font_shadow = \"Font shadow\" -- Need review\nL.font_subheader_stats = \"Stats font\" -- Need review\nL.font_subheader_combat = \"Combat text font\" -- Need review\nL.font_subheader_chat = \"Chat font\" -- Need review\nL.font_subheader_chat_tabs = \"Chat tabs font\" -- Need review\nL.font_subheader_action = \"Action bars font\" -- Need review\nL.font_subheader_threat = \"Threat meter font\" -- Need review\nL.font_subheader_raidcd = \"Raid cooldowns font\" -- Need review\nL.font_subheader_cooldown = \"Cooldowns timer font\" -- Need review\nL.font_subheader_loot = \"Loot font\" -- Need review\nL.font_subheader_nameplates = \"Nameplates font\" -- Need review\nL.font_subheader_unit = \"Unit frames font\" -- Need review\nL.font_subheader_aura = \"Auras font\" -- Need review\nL.font_subheader_filger = \"Filger font\" -- Need review\nL.font_subheader_style = \"Stylization font\" -- Need review\nL.font_subheader_bag = \"Bags font\" -- Need review\nL.font_subheader_blizzard = \"System font size\" -- Need review\nL.font_tooltip_header_font_size = \"Tooltip header\" -- Need review\nL.font_tooltip_font_size = \"Tooltip text\" -- Need review\nL.font_global_font = \"Disable Pixel font\" -- Need review\n\n-- Skins options\nL_GUI_SKINS = \"Restyling\"\nL_GUI_SKINS_SUBTEXT = \"Change the appearance of the standard interface.\" -- Need review\nL_GUI_SKINS_BLIZZARD = \"Attiva il restyling dei riquadri Blizzard\"\nL_GUI_SKINS_MINIMAP_BUTTONS = \"Attiva il restyling dei pulsanti delle AddOns sulla minimappa\"\nL_GUI_SKINS_SUBHEADER = \"Stylization of addons\" -- Need review\nL.skins_minimap_buttons_mouseover = \"Addons icons on mouseover\" -- Need review\nL.skins_bubbles = \"Restyling dei fumetti delle chats\"\n\n-- Unit Frames options\nL_GUI_UF_SUBTEXT = \"Customize player, target frames and etc.\" -- Need review\nL_GUI_UF_ENABLE = \"Abilita i riquadri delle unità\"\nL_GUI_UF_OWN_COLOR = \"Scegli il colore per la tua barra della salute\"\nL_GUI_UF_UF_COLOR = \"Colore barre salute (se è attivo il colore per la tua barra della salute)\"\nL.unitframe_uf_color_bg = \"Color of health background\" -- Need review\nL.unitframe_enemy_health_color = \"Colora di rosso la barra della salute dei nemici\"\nL_GUI_UF_TOTAL_VALUE = \"Visualizza un testo sui riquadri di giocatore e bersaglio con i valori XXXX/Totale\"\nL_GUI_UF_COLOR_VALUE = \"Valori di salute e mana colorati\"\nL_GUI_UF_BAR_COLOR_VALUE = \"Barra della salute colorata in base alla salute restante\"\nL_GUI_UF_LINES = \"Mostra le linee per giocatore e bersaglio\"\nL_GUI_UF_SUBHEADER_CAST = \"Castbars\" -- Need review\nL_GUI_UF_UNIT_CASTBAR = \"Mostra le barre incantesimi\"\nL_GUI_UF_CASTBAR_ICON = \"Mostra le icone della barra incantesimi\"\nL_GUI_UF_CASTBAR_LATENCY = \"Latenza della barra incantesimi\"\nL_GUI_UF_CASTBAR_TICKS = \"Mostra le tacchette (ticks) sulla barra incantesimi\"\nL_GUI_UF_SUBHEADER_FRAMES = \"Frames\" -- Need review\nL_GUI_UF_SHOW_PET = \"Mostra il riquadro per il famiglio\"\nL_GUI_UF_SHOW_FOCUS = \"Mostra il riquadro per il focus\"\nL_GUI_UF_SHOW_TOT = \"Mostra il riquadro per il bersaglio del bersaglio\"\nL_GUI_UF_SHOW_BOSS = \"Mostra i riquadri per i bosses\"\nL_GUI_UF_BOSS_RIGHT = \"Riquadri per i bosses sulla destra\"\nL_GUI_UF_SHOW_ARENA = \"Mostra i riquadri per l'arena\"\nL_GUI_UF_ARENA_RIGHT = \"Riquadri per l'arena sulla destra\"\nL_GUI_UF_BOSS_DEBUFFS = \"Number of debuffs\" -- Need review\nL_GUI_UF_BOSS_DEBUFFS_DESC = \"Numero di penalità sui riquadri dei bosses\"\nL_GUI_UF_BOSS_BUFFS = \"Number of buffs\" -- Need review\nL_GUI_UF_BOSS_BUFFS_DESC = \"Numero di benefici sui riquadri dei bosses\"\nL.unitframe_icons_pvp = \"PvP status text\" -- Need review\nL.unitframe_icons_pvp_desc = \"Testo PvP (senza icona) al passaggio del mouse sui riquadri di giocatore e bersaglio\"\nL_GUI_UF_ICONS_COMBAT = \"Icona di status 'in combattimento'\"\nL_GUI_UF_ICONS_RESTING = \"Icona 'Riposato' per personaggi di basso livello\"\nL_GUI_UF_SUBHEADER_PORTRAIT = \"Portraits\" -- Need review\nL_GUI_UF_PORTRAIT_ENABLE = \"Attiva ritratti per giocatore e bersaglio\"\nL_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = \"Bordi dei ritratti colorati in base alla classe\"\nL.unitframe_portrait_type = \"Type of portraits\" -- Need review\nL.unitframe_portrait_type_icons = \"Class Icons\" -- Need review\nL.unitframe_portrait_type_overlay = \"Overlay\" -- Need review\nL_GUI_UF_PORTRAIT_HEIGHT = \"Altezza del ritratto\"\nL_GUI_UF_PORTRAIT_WIDTH = \"Larghezza del ritratto\"\nL_GUI_UF_SUBHEADER_PLUGINS = \"Plugins\" -- Need review\nL_GUI_UF_PLUGINS_GCD = \"Scintilla del recupero globale\"\nL_GUI_UF_PLUGINS_SWING = \"Attiva la barra dei fendenti\"\nL.unitframe_plugins_reputation_bar = \"Reputation bar\" -- Need review\nL.unitframe_plugins_reputation_bar_desc = \"Attiva la barra reputazioni\" -- Need review\nL.unitframe_plugins_experience_bar = \"Experience bar\" -- Need review\nL.unitframe_plugins_experience_bar_desc = \"Attiva la barra esperienza\" -- Need review\nL_GUI_UF_PLUGINS_SMOOTH_BAR = \"Barra a cambiamento graduale\"\nL_GUI_UF_PLUGINS_ENEMY_SPEC = \"Mostra la specializzazione dei talenti del nemico\"\nL_GUI_UF_PLUGINS_COMBAT_FEEDBACK = \"Testo di combattimento sul riquadro del giocatore/bersaglio\"\nL_GUI_UF_PLUGINS_FADER = \"Sfuma i riquadri delle unità\"\nL_GUI_UF_PLUGINS_DIMINISHING = \"Diminuzione dell'effetto (diminishing return) sulle icone dei riquadri d'arena\"\nL_GUI_UF_PLUGINS_POWER_PREDICTION = \"Previsione del costo in potere sulla barra del riquadro del giocatore\"\nL.unitframe_plugins_absorbs = \"Absorbs value on player frame\" -- Need review\nL.unitframe_subheader_player_width = \"Player and target frame size\" -- Need review\nL.unitframe_player_width = \"Width\" -- Need review\nL.unitframe_subheader_boss_width = \"Boss and arena frame size\" -- Need review\nL.unitframe_extra_height_auto = \"Auto height for health/power\" -- Need review\nL.unitframe_extra_height_auto_desc = \"Smart adjust depending on font size\" -- Need review\nL.unitframe_extra_health_height = \"Additional height for health\" -- Need review\nL.unitframe_extra_power_height = \"Additional height for power\" -- Need review\nL.unitframe_subheader_castbar = \"Size of player and target castbar\" -- Need review\nL.unitframe_castbar_height = \"Height\" -- Need review\n\n-- Unit Frames Class bar options\nL_GUI_UF_PLUGINS_CLASS_BAR = \"Barre di classe\"\nL_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = \"Control of special class resources.\" -- Need review\nL_GUI_UF_PLUGINS_COMBO_BAR = \"Icone punti combo per druido e ladro\"\nL_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = \"Mostra sempre la barra combo per il druido\"\nL_GUI_UF_PLUGINS_COMBO_BAR_OLD = \"Mostra i punti combo sul bersaglio\"\nL_GUI_UF_PLUGINS_ARCANE_BAR = \"Attiva la barra carica arcana\"\nL_GUI_UF_PLUGINS_CHI_BAR = \"Attiva la barra di classe del monaco\"\nL_GUI_UF_PLUGINS_STAGGER_BAR = \"Attiva la barra noncuranza (per i monaci difensori)\"\nL_GUI_UF_PLUGINS_HOLY_BAR = \"Attiva la barra di classe del paladino\"\nL_GUI_UF_PLUGINS_SHARD_BAR = \"Attiva la barra di classe dello stregone\"\nL_GUI_UF_PLUGINS_RUNE_BAR = \"Attiva la barra di classe del cavaliere della morte\"\nL_GUI_UF_PLUGINS_TOTEM_BAR = \"Attiva la barra dei totems dello sciamano\"\nL.unitframe_class_bar_totem_other = \"Enable Totem bar for other classes\" -- Need review\nL.unitframe_class_bar_essence = \"Enable Essence bar for Evoker\" -- Need review\n\n-- Raid Frames options\nL_GUI_UF_RAIDFRAMES_SUBTEXT = \"Customize the appearance of the raid frames.\" -- Need review\nL_GUI_UF_BY_ROLE = \"Suddividi i giocatori in gruppo a seconda del ruolo\"\nL_GUI_UF_AGGRO_BORDER = \"Cambio di colore dei bordi in base al grado di aggressione\"\nL_GUI_UF_DEFICIT_HEALTH = \"Deficit salute in incursione\"\nL_GUI_UF_SHOW_PARTY = \"Mostra i riquadri del gruppo\"\nL_GUI_UF_SHOW_RAID = \"Mostra i riquadri d'incursione\"\nL.raidframe_layout = \"Raid layout\" -- Needs review\nL.raidframe_heal_layout = \"Heal\" -- Needs review\nL.raidframe_dps_layout = \"DPS\" -- Needs review\nL.raidframe_auto_layout = \"Auto\" -- Needs review\nL.raidframe_show_target = \"Show target frames\" -- Needs review\nL.raidframe_show_pet = \"Show pet frames\" -- Needs review\nL.raidframe_vertical_health = \"Orientamento verticale della salute\"\nL.raidframe_vertical_health_desc = \"Only for heal layout\" -- Needs review\nL_GUI_UF_ALPHA_HEALTH = \"Trasparenza delle barre della salute quando i punti sono al 100%\"\nL_GUI_UF_SHOW_RANGE = \"Abilita l'opacità dei riquadri d'incursione in base alla distanza\"\nL_GUI_UF_RANGE_ALPHA = \"Alpha\" -- Need review\nL_GUI_UF_RANGE_ALPHA_DESC = \"Trasparenza dei riquadri delle unità quando un'unità è fuori portata\"\nL_GUI_UF_SUBHEADER_RAIDFRAMES = \"Frames\" -- Need review\nL_GUI_UF_SOLO_MODE = \"Mostra sempre il riquadro del giocatore\"\nL_GUI_UF_PLAYER_PARTY = \"Mostra il riquadro del giocatore in gruppo\"\nL_GUI_UF_SHOW_TANK = \"Mostra i difensori dell'incursione\"\nL_GUI_UF_SHOW_TANK_TT = \"Mostra il bersaglio del bersaglio dei difensori dell'incursione\"\nL_GUI_UF_RAID_GROUP = \"Numero dei gruppi nell'incursione\"\nL.raidframe_party_vertical = \"Vertical party frames\" -- Needs review\nL.raidframe_raid_groups_vertical = \"Gruppi dell'incursione verticali\" -- Needs review\nL.raidframe_raid_groups_vertical_desc = \"Gruppi dell'incursione verticali (solo per la Disposizione da Guaritore)\" -- Needs review\nL_GUI_UF_SUBHEADER_ICONS = \"Icons\" -- Need review\nL_GUI_UF_ICONS_ROLE = \"Icona del ruolo sui riquadri\"\nL_GUI_UF_ICONS_RAID_MARK = \"Marchi d'incursione\"\nL_GUI_UF_ICONS_READY_CHECK = \"Icone dell'appello\"\nL_GUI_UF_ICONS_LEADER = \"Icona del capoincursione, dell'assistente\"\nL_GUI_UF_ICONS_SUMON = \"Icone d’evocazione sui riquadri\"\nL.raidframe_icons_phase = \"Phase\" -- Need review\nL.raidframe_plugins_debuffhighlight_icon = \"Evidenzia texture + icona delle penalità\" -- Need review\nL.raidframe_plugins_aura_watch = \"Icone delle penalità d'incursione\"\nL.raidframe_plugins_aura_watch_timer = \"Timer sulle icone delle penalità d'incursione\"\nL.raidframe_plugins_pvp_debuffs = \"Mostra anche un’icona per le penalità PvP (dall’elenco)\"\nL_GUI_UF_PLUGINS_HEALCOMM = \"Mostra le cure in arrivo sul riquadro\"\nL.raidframe_plugins_over_absorb = \"Show over absorb bar on frame\" -- Need review\nL.raidframe_plugins_over_heal_absorb = \"Show over heal absorb on frame\" -- Need review\nL.raidframe_plugins_auto_resurrection = \"Auto cast resurrection\" -- Need review\nL.raidframe_plugins_auto_resurrection_desc = \"'Auto-lancia' resurrezione col tasto centrale quando l'unità è morta (non funziona con Clique attiva)\"\nL.raidframe_hide_health_value = \"Hide raid health value\" -- Needs review\nL.raidframe_auto_position = \"Auto reposition raid frame\" -- Need review\nL.raidframe_auto_position_desc = \"If there are more than 5 groups, the frame points changes. \\nOnly for heal layout\" -- Need review\nL.raidframe_auto_position_dynamic = \"Dynamic\" -- Need review\nL.raidframe_auto_position_static = \"Static\" -- Need review\nL.raidframe_subheader_heal_size = \"Size for heal layout\" -- Need review\nL.raidframe_heal_width = \"Frame width\" -- Need review\nL.raidframe_heal_height = \"Frame height\" -- Need review\nL.raidframe_heal_power_height = \"Power height\" -- Need review\nL.raidframe_subheader_dps_size = \"Size for dps layout\" -- Need review\nL.raidframe_dps_party_width = \"Party width\" -- Need review\nL.raidframe_dps_party_height = \"Party height\" -- Need review\nL.raidframe_dps_raid_width = \"Raid width\" -- Need review\nL.raidframe_dps_raid_height = \"Raid height\" -- Need review\nL.raidframe_dps_party_power_height = \"Party power height\" -- Need review\nL.raidframe_dps_raid_power_height = \"Raid power height\" -- Need review\n\n-- ActionBar options\nL_GUI_ACTIONBAR = \"Barre delle azioni\"\nL_GUI_ACTIONBAR_ENABLE = \"Attiva le barre delle azioni\"\nL_GUI_ACTIONBAR_HOTKEY = \"Mostra i nomi dei tasti di scelta rapida sugli scomparti\"\nL_GUI_ACTIONBAR_MACRO = \"Mostra i nomi delle macro sugli scomparti\"\nL_GUI_ACTIONBAR_GRID = \"Mostra lo sfondo degli scomparti vuoti sulle barre delle azioni\"\nL_GUI_ACTIONBAR_BUTTON_SIZE = \"Dimensioni degli scomparti\"\nL_GUI_ACTIONBAR_BUTTON_SPACE = \"Spazio tra gli scomparti\"\nL_GUI_ACTIONBAR_SPLIT_BARS = \"Dividi la quinta barra in 2 barre da 6 scomparti ciascuna\"\nL_GUI_ACTIONBAR_CLASSCOLOR_BORDER = \"Colora i bordi degli scomparti con i colori delle classi\"\nL.actionbar_toggle_mode = \"Attiva la modalità a scomparsa\"\nL.actionbar_toggle_mode_desc = \"The quick change in the number of panels. For the lower panels, hover the mouse over the hidden area above the panels. For right panels, hover the mouse over the area below the panels.\" -- Need review\nL_GUI_ACTIONBAR_HIDE_HIGHLIGHT = \"Nascondi il lumeggiare (highlight) di un proc.\"\nL_GUI_ACTIONBAR_BOTTOMBARS = \"Numero delle barre delle azioni in basso\"\nL_GUI_ACTIONBAR_RIGHTBARS = \"Numero di barre delle azioni sulla destra\"\nL.actionbar_bottombars_mouseover = \"Bottom bars on mouseover\" -- Needs review\nL_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = \"Barre sulla destra al passaggio del mouse\"\nL_GUI_ACTIONBAR_PETBAR_HIDE = \"Nascondi la barra famiglio\"\nL_GUI_ACTIONBAR_PETBAR_HORIZONTAL = \"Rendi orizzontale la barra famiglio\"\nL_GUI_ACTIONBAR_PETBAR_MOUSEOVER = \"Barra famiglio al passaggio del mouse (solo con la barra famiglio orizzontale)\"\nL_GUI_ACTIONBAR_STANCEBAR_HIDE = \"Nascondi barra postura\"\nL_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = \"Rendi orizzontale la barra postura\"\nL.actionbar_stancebar_horizontal_desc = \"Located below the player's frame\" -- Needs review\nL_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = \"Barra postura al passaggio del mouse\"\nL_GUI_ACTIONBAR_MICROMENU = \"Attiva il micromenu\"\nL_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = \"Micromenu al passaggio del mouse\"\nL.actionbar_editor = \"Bars editor\" -- Needs review\nL.actionbar_editor_desc = \"Allow to move and change each panel individually\" -- Needs review\nL.actionbar_bar1_num = \"Number of buttons\" -- Needs review\nL.actionbar_bar1_row = \"Buttons per row\" -- Needs review\nL.actionbar_bar1_mouseover = \"Bar on mouseover\" -- Needs review\n\n-- Tooltip options\nL.tooltip = \"Suggerimenti\"\nL.tooltip_subtext = \"In this block, you can change the standard tips when mouseovering.\" -- Need review\nL.tooltip_enable = \"Attiva i suggerimenti\"\nL.tooltip_shift_modifer = \"Mostra i suggerimenti quando è premuto il tasto Shift\"\nL.tooltip_cursor = \"Suggerimenti sopra il cursore\"\nL.tooltip_item_icon = \"Icone degli oggetti nei suggerimenti\"\nL.tooltip_health_value = \"Valore numerico della salute\"\nL.tooltip_hidebuttons = \"Nascondi i suggerimenti relativi alle barre delle azioni\"\nL.tooltip_hide_combat = \"Nascondi i suggerimenti in combattimento\"\nL.tooltip_subheader = \"Plugins\" -- Need review\nL.tooltip_talents = \"Mostra i talenti nei suggerimenti\"\nL.tooltip_show_shift = \"Show when Shift is pushed\" -- Need review\nL.tooltip_show_shift_desc = \"Show items level and spec when Shift is pushed\" -- Need review\nL.tooltip_achievements = \"Mostra il paragone delle imprese nei suggerimenti\"\nL.tooltip_target = \"Mostra nei suggerimenti chi ha il giocatore come bersaglio\"\nL.tooltip_title = \"Titolo del giocatore nei suggerimenti\"\nL.tooltip_realm = \"Reame del giocatore nei suggerimenti\"\nL.tooltip_rank = \"Rango in gilda nei suggerimenti\"\nL.tooltip_spell_id = \"ID Incantesimo/Abilità\"\nL.tooltip_average_lvl_desc = \"The average item level\" -- Need review\nL.tooltip_raid_icon = \"Visualizza i marchi d'incursione nei suggerimenti\"\nL.tooltip_who_targetting = \"Visualizza chi ha in bersaglio l'unità che è nel tuo gruppo/incursione\"\nL.tooltip_item_count = \"Conteggio oggetti\"\nL.tooltip_unit_role = \"Ruolo dell'unità\"\nL.tooltip_instance_lock = \"Info incursione nei suggerimenti\"\nL.tooltip_mount = \"Source of mount\" -- Needs review\n\n-- Chat options\nL.chat_subtext = \"Here you can change the settings of the chat window.\" -- Need review\nL.chat_enable = \"Attiva chat\"\nL.chat_background = \"Attiva lo sfondo della chat\"\nL.chat_background_alpha = \"Trasparenza sfondo della chat\"\nL.chat_filter = \"Rimozione di un po' di spam di sistema\"\nL.chat_filter_desc = \"Duels, change talents, NPC dialogue in city\" -- Need review\nL.chat_spam = \"Rimozione di un po' di spam degli altri giocatori\"\nL.chat_spam_list = \"Black list\" -- Need review\nL.chat_spam_list_desc = \"List of words (separated by space, lowercase letters) to hide messages\" -- Need review\nL.chat_width = \"Larghezza chat\"\nL.chat_height = \"Altezza chat\"\nL.chat_chat_bar = \"Barra con pulsanti per passare velocemente da un canale all'altro della chat\"\nL.chat_chat_bar_mouseover = \"Barra canali chat al passaggio del mouse\"\nL.chat_whisp_sound = \"Suono quando ricevi un sussurro\"\nL.chat_combatlog = \"Mostra la linguetta del Registro di combattimento\"\nL.chat_tabs_mouseover = \"Linguette delle chats al passaggio del mouse\"\nL.chat_sticky = \"Ricorda l'ultimo canale\"\nL.chat_damage_meter_spam = \"Riunisce lo spam di un contatore dei danni in un singolo link\"\nL.chat_loot_icons = \"Icons for loot\" -- Needs review\nL.chat_hide_combat = \"Hide chat in combat\" -- Needs review\nL.chat_custom_time_color = \"Enable custom timestamp coloring\" -- Needs review\nL.chat_time_color = \"Colorazione orario dei messaggi\"\n\n-- Nameplate options\nL_GUI_NAMEPLATE_SUBTEXT = \"Nameplate settings\" -- Need review\nL_GUI_NAMEPLATE_ENABLE = \"Attiva le barre delle unità\"\nL_GUI_NAMEPLATE_COMBAT = \"Mostra automaticamente le barre delle unità in combattimento\"\nL_GUI_NAMEPLATE_HEALTH = \"Valore numerico della salute\"\nL_GUI_NAMEPLATE_HEIGHT = \"Altezza delle barre delle unità\"\nL_GUI_NAMEPLATE_WIDTH = \"Larghezza delle barre delle unità\"\nL.nameplate_alpha = \"Alpha\" -- Needs review\nL.nameplate_alpha_desc = \"Non-target nameplate alpha\" -- Needs review\nL.nameplate_ad_height = \"Additional height\" -- Need review\nL.nameplate_ad_width = \"Additional width\" -- Need review\nL.nameplate_ad_height_desc = \"Additional height for selected nameplate\" -- Needs review\nL.nameplate_ad_width_desc = \"Additional width for selected nameplate\" -- Needs review\nL_GUI_NAMEPLATE_CASTBAR_NAME = \"Mostra il nome di incantesimi/abilità sulle barre incantesimi\"\nL_GUI_NAMEPLATE_CLASS_ICON = \"Icone delle classi in PvP\"\nL_GUI_NAMEPLATE_NAME_ABBREV = \"Mostra nomi abbreviati\"\nL.nameplate_short_name = \"Replace names with short ones\" -- Need review\nL.nameplate_clamp = \"Aggancia le barre delle unità in cima allo schermo quando sono fuori portata visiva\" -- Need review\nL.nameplate_clamp_desc = \"Aggancia le barre delle unità in cima allo schermo quando sono fuori portata visiva\"\nL_GUI_NAMEPLATE_SHOW_DEBUFFS = \"Mostra le penalità sulle barre delle unità (l'ozpione 'Mostra nomi abbreviati' deve essere disabilitata)\"\nL_GUI_NAMEPLATE_SHOW_BUFFS = \"Show dispellable enemy buffs and buffs from the list\" -- Need review\nL_GUI_NAMEPLATE_DEBUFFS_SIZE = \"Dimensioni delle penalità sulle barre delle unità\" -- Need review\nL_GUI_NAMEPLATE_HEALER_ICON = \"Nei Campi di Battaglia, mostra un'icona 'guaritore' accanto alle barre delle unità di tutti i guaritori nemici\"\nL_GUI_NAMEPLATE_TOTEM_ICONS = \"Mostra un’icona sopra la barra dei totem nemici\"\nL.nameplate_target_glow = \"Show glow texture for target\" -- Need review\nL.nameplate_only_name = \"Show only name for friendly units\" -- Need review\nL.nameplate_quests = \"Show quest icon\" -- Need review\nL.nameplate_cast_color = \"Show color border for casting important spells\" -- Need review\nL.nameplate_kick_color = \"Change cast color if interrupt on cd\" -- Need review\nL.nameplate_low_health_value = \"Health value\" -- Need review\nL.nameplate_low_health = \"Low health highlight\" -- Need review\nL_GUI_NAMEPLATE_THREAT = \"Attiva il sensore di rilevamento minaccia (si adatta automaticamente al tuo ruolo)\"\nL_GUI_NAMEPLATE_GOOD_COLOR = \"Colore se il PG è minacciato (in base a difensore o assaltatore/guaritore)\"\nL_GUI_NAMEPLATE_NEAR_COLOR = \"Colore per perdita/guadagno minaccia\"\nL_GUI_NAMEPLATE_BAD_COLOR = \"Colore se il PG non è minacciato (se difensore o assaltatore/guaritore)\"\nL_GUI_NAMEPLATE_OFFTANK_COLOR = \"Colore della minaccia per il difensore secondario\"\nL.nameplate_extra_color = \"Explosive and Spiteful affix color\" -- Need review\nL.nameplate_mob_color_enable = \"Change color for important mobs in dungeons\" -- Need review\nL.nameplate_mob_color = \"Color for mobs\" -- Need review\n\n-- Combat text options\nL_GUI_COMBATTEXT = \"Testo di combattimento\"\nL_GUI_COMBATTEXT_SUBTEXT = \"For moving type in the chat '/xct'\" -- Need review\nL_GUI_COMBATTEXT_ENABLE = \"Attiva il testo di combattimento\"\nL.combattext_blizz_head_numbers = \"Enable Blizzard combat text\" -- Need review\nL.combattext_blizz_head_numbers_desc = \"Usa il testo di combattimento della Blizzard per danni/cure\"\nL.combattext_damage_style = \"Change default combat font\" -- Need review\nL.combattext_damage_style_desc = \"Cambia il carattere di base per danni/cure (è necessario riavviare il gioco)\"\nL_GUI_COMBATTEXT_DAMAGE = \"Mostra i danni in un proprio riquadro dedicato\"\nL_GUI_COMBATTEXT_HEALING = \"Mostra le cure in un proprio riquadro dedicato\"\nL.combattext_incoming = \"Show incoming damage and healing\" -- Need review\nL_GUI_COMBATTEXT_HOTS = \"Mostra gli effetti delle cure periodiche nel riquadro delle cure\"\nL_GUI_COMBATTEXT_OVERHEALING = \"Mostra le cure in eccesso\"\nL_GUI_COMBATTEXT_PET_DAMAGE = \"Mostra i danni del tuo famiglio\"\nL_GUI_COMBATTEXT_DOT_DAMAGE = \"Mostra i tuoi danni nel tempo\"\nL_GUI_COMBATTEXT_DAMAGE_COLOR = \"Colora i numeri dei danni in base alla scuola di magia\"\nL_GUI_COMBATTEXT_CRIT_PREFIX = \"Simbolo che sarà aggiunto prima dei critici\"\nL_GUI_COMBATTEXT_CRIT_POSTFIX = \"Simbolo che sarà aggiunto dopo i critici\"\nL_GUI_COMBATTEXT_ICONS = \"Mostra le icone dei danni\"\nL_GUI_COMBATTEXT_ICON_SIZE = \"Icon size\" -- Need review\nL_GUI_COMBATTEXT_ICON_SIZE_DESC = \"Dimensioni icone danni (influenza anche le dimensioni del carattere dei danni)\"\nL_GUI_COMBATTEXT_TRESHOLD = \"Danno minimo da mostrare nel riquadro dei danni\"\nL_GUI_COMBATTEXT_HEAL_TRESHOLD = \"Cure minime da mostrare nei messaggi delle cure\"\nL_GUI_COMBATTEXT_SCROLLABLE = \"Attiva la 'modalità scorrimento': consente di scorrere tra le righe dei riquadri con la rotellina del mouse\"\nL_GUI_COMBATTEXT_MAX_LINES = \"Max lines\" -- Need review\nL_GUI_COMBATTEXT_MAX_LINES_DESC = \"Massimo numero righe da ricordare in 'scorrimento' (più righe = più memoria)\"\nL_GUI_COMBATTEXT_TIME_VISIBLE = \"Time\" -- Need review\nL_GUI_COMBATTEXT_TIME_VISIBLE_DESC = \"Tempo (in secondi) in cui un singolo messaggio sarà visibile\"\nL_GUI_COMBATTEXT_DK_RUNES = \"Mostra la ricarica delle rune dei cavalieri della morte\"\nL_GUI_COMBATTEXT_KILLINGBLOW = \"Comunica i tuoi colpi di grazia\"\nL.combattext_merge_aoe_spam = \"Merges spell spam into single message\" -- Needs review\nL.combattext_merge_aoe_spam_desc = \"Unisci lo spam per danni multipli a più bersagli in un singolo messaggio\"\nL_GUI_COMBATTEXT_MERGE_MELEE = \"Unifica lo spam di attacchi automatici multipli\"\nL.combattext_merge_all = \"Merges all spells\" -- Needs review\nL_GUI_COMBATTEXT_DISPEL = \"Comunica le tue dissoluzioni (dispels)\"\nL_GUI_COMBATTEXT_INTERRUPT = \"Comunica le tue interruzioni (interrupts)\"\nL_GUI_COMBATTEXT_DIRECTION = \"Change scrolling direction from bottom to top\" -- Need review\nL_GUI_COMBATTEXT_SHORT_NUMBERS = \"Usa abbreviazioni numeriche ('25.3k' invece di '25342')\"\n\n-- Auras/Buffs/Debuffs\nL_GUI_AURA_PLAYER_BUFF_SIZE = \"Buffs size\" -- Need review\nL_GUI_AURA_PLAYER_BUFF_SIZE_DESC = \"Dimensione benefici giocatore\"\nL.aura_debuff_size = \"Debuffs size\" -- Need review\nL_GUI_AURA_SHOW_SPIRAL = \"Spirale trascorrere tempo sulle icone delle auree\"\nL_GUI_AURA_SHOW_TIMER = \"Mostra il timer del recupero sulle icone delle auree\"\nL_GUI_AURA_PLAYER_AURAS = \"Auree sul riquadro del giocatore\"\nL_GUI_AURA_TARGET_AURAS = \"Auree sul riquadro del bersaglio\"\nL_GUI_AURA_FOCUS_DEBUFFS = \"Penalità sul riquadro del focus\"\nL_GUI_AURA_FOT_DEBUFFS = \"Penalità sul riquadro del bersaglio del focus\"\nL_GUI_AURA_PET_DEBUFFS = \"Penalità sul riquadro del famiglio\"\nL_GUI_AURA_TOT_DEBUFFS = \"Penalità sul riquadro del bersaglio del bersaglio\"\nL.aura_subheader_boss = \"Benefici sul riquadro del boss\" -- Need review\nL_GUI_AURA_PLAYER_AURA_ONLY = \"Mostra solo le tue penalità sul riquadro del bersaglio\"\nL_GUI_AURA_DEBUFF_COLOR_TYPE = \"Colora le penalità a seconda del tipo\"\nL_GUI_AURA_CAST_BY = \"Mostra chi ha lanciato un beneficio o una penalità nei suggerimenti\"\nL_GUI_AURA_CLASSCOLOR_BORDER = \"Colora i bordi dei benefici del giocatore in base al colore della classi\"\nL.aura_subheader_buffs = \"Player buffs\" -- Need review\nL.aura_subheader_debuffs = \"Debuffs\" -- Need review\n\n-- Bag options\nL_GUI_BAGS = \"Sacche\"\nL_GUI_BAGS_SUBTEXT = \"Right click on the close button to open the menu. To move the bags, hold down Shift - click.\" -- Need review\nL_GUI_BAGS_ENABLE = \"Attiva le sacche\"\nL_GUI_BAGS_ILVL = \"Mostra il livello oggetto di armi e armature\"\nL.bag_new_items = \"Show animation for new items\" -- Need review\nL.bag_filter = \"Always show filter buttons\" -- Need review\nL_GUI_BAGS_BUTTON_SIZE = \"Dimensioni degli scomparti\"\nL_GUI_BAGS_BUTTON_SPACE = \"Spazio tra gli scomparti\"\nL_GUI_BAGS_BANK = \"Numero di colonne in banca\"\nL_GUI_BAGS_BAG = \"Numero di colonne nella sacca principale\"\n\n-- Minimap options\nL_GUI_MINIMAP_SUBTEXT = \"Minimap settings.\" -- Need review\nL_GUI_MINIMAP_ENABLE = \"Attiva la minimappa\"\nL.minimap_on_top = \"Move minimap on top right corner\" -- Need review\nL_GUI_MINIMAP_ICON = \"Icona tracciamento\"\nL_GUI_GARRISON_ICON = \"Icona della guarnigione\" -- Need review\nL_GUI_MINIMAP_SIZE = \"Dimensioni della minimappa\"\nL_GUI_MINIMAP_HIDE_COMBAT = \"Nascondi la minimappa in combattimento\"\nL_GUI_MINIMAP_TOGGLE_MENU = \"Mostra il menu a scomparsa\"\nL.minimap_bg_map_stylization = \"Restyling della mappa dei Campi di Battaglia\"\nL.minimap_fog_of_war = \"Nebbia della guerra sulla mappa del mondo\"\n\n-- Loot options\nL_GUI_LOOT_SUBTEXT = \"Settings for loot frame.\" -- Need review\nL_GUI_LOOT_ENABLE = \"Attiva il riquadro bottino\"\nL_GUI_LOOT_ROLL_ENABLE = \"Attiva il riquadro del bottino di gruppo\"\nL_GUI_LOOT_ICON_SIZE = \"Dimensioni delle icone\"\nL_GUI_LOOT_WIDTH = \"Larghezza del riquadro bottino\"\nL_GUI_LOOT_AUTOGREED = \"A livello massimo, attiva automaticamente la bramosia per gli oggetti verdi\"\nL_GUI_LOOT_AUTODE = \"'Auto-conferma' il disincantamento degli oggetti\"\nL.loot_faster_loot = \"Faster looting\" -- Need review\nL.loot_faster_loot_desc = \"Works only if enabled auto loot\" -- Need review\n\n-- Filger\nL_GUI_FILGER = \"Timers (Filger)\"\nL_GUI_FILGER_SUBTEXT = \"Filger - analogue WeakAuras, but more simple and easy. Allows you to display in the form of icons and bars your auras and timers.\" -- Need review\nL_GUI_FILGER_ENABLE = \"Attiva Filger\"\nL_GUI_FILGER_TEST_MODE = \"Modalità di prova delle icone\"\nL_GUI_FILGER_MAX_TEST_ICON = \"Il numero di icone da sottoporre alla prova\"\nL_GUI_FILGER_SHOW_TOOLTIP = \"Mostra suggerimenti\"\nL.filger_subheader_elements = \"Showing elements\" -- Need review\nL.filger_show_buff = \"Player buffs\" -- Need review\nL.filger_show_proc = \"Player procs\" -- Need review\nL.filger_show_debuff = \"Debuffs on target\" -- Need review\nL.filger_show_aura_bar = \"Aura bars on target\" -- Need review\nL.filger_show_special = \"Special buffs on player\" -- Need review\nL.filger_show_pvp_player = \"SPvP debuffs on player\" -- Need review\nL.filger_show_pvp_target = \"PvP auras on target\" -- Need review\nL.filger_show_cd = \"Cooldowns\" -- Need review\nL.filger_subheader_size = \"Icons size\" -- Need review\nL.filger_subheader_test = \"Test mode\" -- Need review\nL_GUI_FILGER_EXPIRATION = \"Sort cooldowns by expiration time\" -- Need review\nL_GUI_FILGER_BUFFS_SIZE = \"Dimensione dei benefici\"\nL_GUI_FILGER_COOLDOWN_SIZE = \"Dimensione dei recuperi\"\nL_GUI_FILGER_PVP_SIZE = \"Dimensione delle penalità PvP\"\nL.filger_buffs_space = \"Buffs space\" -- Need review\nL.filger_pvp_space = \"PvP auras space\" -- Need review\nL.filger_cooldown_space = \"Cooldowns space\" -- Need review\nL.filger_subheader_spells = \"Adding new spells\" -- Need review\nL.filger_category_list = \"Spell list category\" -- Need review\n\n-- Announcements options\nL_GUI_ANNOUNCEMENTS = \"Annunci\"\nL_GUI_ANNOUNCEMENTS_SUBTEXT = \"Settings that add chat announcements about spells or items.\" -- Need review\nL.announcements_drinking = \"Annuncia in chat quando un nemico in arena sta bevendo\"\nL.announcements_interrupts = \"Interrupts\" -- Need review\nL.announcements_interrupts_desc = \"Annuncia in gruppo/incursione quando tu interrompi un incantesimo/abilità\"\nL.announcements_spells = \"Cast spells\" -- Needs review\nL.announcements_spells_desc = \"Annuncia in gruppo/incursione quando usi alcuni incantesimi/abilità\"\nL.announcements_spells_from_all = \"From all members\" -- Needs review\nL.announcements_spells_from_all_desc = \"Controlla incantesimi/abilità lanciati da tutti i compagni di gruppo/incursione\"\nL.announcements_toys = \"Annuncia l'uso del Trenino Giocattolo o del Telecomando di Birranera\"\nL.announcements_pull_countdown = \"Pull countdown\" -- Needs review\nL.announcements_pull_countdown_desc = \"Annuncia il conto alla rovescia di avvio incontro '/pc #'\"\nL.announcements_flask_food = \"Usage of flasks and food\" -- Needs review\nL.announcements_flask_food_desc = \"Annuncia l'uso di tonici e cibo (/ffcheck)\"\nL.announcements_flask_food_raid = \"Annuncia l'uso di cibi e tonici nel canale incursione\"\nL.announcements_flask_food_auto = \"Annuncia automaticamente l'uso di cibi e tonici all'appello\" -- Needs review\nL.announcements_feasts = \"Annuncia l'uso di tripudi/calderoni/anime/robots per le riparazioni\"\nL.announcements_portals = \"Annuncia l'uso di un portale/Rituale d'Evocazione\"\nL.announcements_subheader_self = \"Self announce\" -- Needs review\nL.announcements_bad_gear = \"Check your bad gear\" -- Need review\nL.announcements_bad_gear_desc = \"Controlla l'equip. non idoneo in instance\"\nL.announcements_safari_hat = \"Safari Hat\" -- Needs review\nL.announcements_safari_hat_desc = \"Controlla se il Cappello da Safari sia indossato o meno\"\n\n-- Automation options\nL_GUI_AUTOMATION = \"Automatismi\"\nL_GUI_AUTOMATION_SUBTEXT = \"This block contains settings that facilitate the routine.\" -- Need review\nL.automation_release = \"'Auto-risorgi' nei Campi di Battaglia\"\nL.automation_screenshot = \"Cattura una schermata quando completi un'impresa\"\nL.automation_solve_artifact = \"Popup automatico restauro manufatto\"\nL.automation_solve_artifact_desc = \"If there are enough fragments for an artifact, a popup will appear to solve it.\" -- Need review\nL.automation_accept_invite = \"'Auto-accetta' gli inviti\"\nL.automation_decline_duel = \"'Auto-declina' i duelli\"\nL.automation_accept_quest = \"'Auto-accetta' le missioni\"\nL.automation_auto_collapse = \"Auto collapse Objective Tracker\" -- Need review\nL.automation_auto_collapse_raid = \"In Instance\" -- Need review\nL.automation_auto_collapse_reload = \"After reload\" -- Need review\nL.automation_auto_collapse_scenario = \"Partially\" -- Need review\nL.automation_skip_cinematic = \"'Auto-salta' i filmati\"\nL.automation_auto_role = \"'Auto-imposta' il tuo ruolo\"\nL.automation_cancel_bad_buffs = \"'Auto-cancella' alcuni benefici\"\nL.automation_tab_binder = \"Usando il tasto TAB, consente di prendere come bersaglio soltanto nemici controllati da altri giocatori (se presenti)\"\nL.automation_tab_binder_desc = \"'Tab' key target only enemy players when in PvP zones, ignores pets and mobs\" -- Need review\nL.automation_logging_combat = \"In instances da incursione, 'auto-attiva' la registrazione del Registro di combattimento in un file di testo\"\nL.automation_buff_on_scroll = \"Lancia benefici con la rotellina del mouse\"\nL.automation_buff_on_scroll_desc = \"If the buff from the list is not applied to the player, it will cast by the mouse scroll\" -- Need review\nL.automation_open_items = \"Apertura automatica degli oggetti nelle sacche\"\nL.automation_resurrection = \"Confirm resurrection\" -- Needs review\nL.automation_summon = \"Confirm summon\" -- Needs review\nL.automation_whisper_invite = \"Auto invite when whisper keyword\" -- Needs review\nL.automation_invite_keyword = \"List of keyword (separated by space)\" -- Needs review\nL.automation_invite_keyword_desc = \"When player whisper you keyword he will be invited in your group\" -- Needs revieww\n\n-- Buffs reminder options\nL_GUI_REMINDER = \"Promemoria benefici\"\nL_GUI_REMINDER_SUBTEXT = \"Display of missed auras.\" -- Need review\nL_GUI_REMINDER_SOLO_ENABLE = \"Mostra i propri benefici mancanti\"\nL_GUI_REMINDER_SOLO_SOUND = \"Attiva un suono d'avviso per il promemoria dei propri benefici mancanti\"\nL_GUI_REMINDER_SOLO_SIZE = \"Icon size\" -- Need review\nL_GUI_REMINDER_SOLO_SIZE_DESC = \"Dimensione dell'icona dei propri benefici\"\nL_GUI_REMINDER_SUBHEADER = \"Raid buffs\" -- Need review\nL_GUI_REMINDER_RAID_ENABLE = \"Mostra i benefici d'incursione mancanti\"\nL_GUI_REMINDER_RAID_ALWAYS = \"Mostra sempre il promemoria benefici\"\nL_GUI_REMINDER_RAID_SIZE = \"Icon size\" -- Need review\nL_GUI_REMINDER_RAID_SIZE_DESC = \"Dimensioni delle icone del promemoria benefici d'incursione\"\nL_GUI_REMINDER_RAID_ALPHA = \"Transparent\" -- Need review\nL_GUI_REMINDER_RAID_ALPHA_DESC = \"Trasparenza icona quando il beneficio è presente\"\n\n-- Raid cooldowns options\nL_GUI_COOLDOWN_RAID = \"Recuperi d'incursione\"\nL_GUI_COOLDOWN_RAID_SUBTEXT = \"Tracking raid abilities in the upper left corner.\" -- Need review\nL_GUI_COOLDOWN_RAID_ENABLE = \"Visualizza i recuperi d'incursione\"\nL_GUI_COOLDOWN_RAID_HEIGHT = \"Bars height\" -- Need review\nL_GUI_COOLDOWN_RAID_WIDTH = \"Bars width\" -- Need review\nL_GUI_COOLDOWN_RAID_SORT = \"Disposizione verso l'alto delle barre dei recuperi d'incursione\"\nL_GUI_COOLDOWN_RAID_EXPIRATION = \"Ordina in base al tempo di scadenza\"\nL_GUI_COOLDOWN_RAID_SHOW_SELF = \"Mostra i miei recuperi\"\nL_GUI_COOLDOWN_RAID_ICONS = \"Icone dei recuperi d'incursione\"\nL_GUI_COOLDOWN_RAID_IN_RAID = \"Mostra i recuperi d'incursione nelle aree da incursione\"\nL_GUI_COOLDOWN_RAID_IN_PARTY = \"Mostra i recuperi d'incursione nelle aree da gruppo\"\nL_GUI_COOLDOWN_RAID_IN_ARENA = \"Mostra i recuperi d'incursione nelle aree da arena\"\n\n-- Enemy cooldowns options\nL_GUI_COOLDOWN_ENEMY = \"Recuperi del nemico\"\nL_GUI_COOLDOWN_ENEMY_SUBTEXT = \"Tracking enemy abilities as icons above your spell casting bar.\" -- Need review\nL_GUI_COOLDOWN_ENEMY_ENABLE = \"Visualizza i recuperi del nemico\"\nL_GUI_COOLDOWN_ENEMY_SIZE = \"Dimensioni delle icone dei recuperi del nemico\"\nL_GUI_COOLDOWN_ENEMY_DIRECTION = \"Direzione icone recuperi del nemico\"\nL_GUI_COOLDOWN_ENEMY_EVERYWHERE = \"Mostra i recuperi del nemico in qualsiasi area\"\nL_GUI_COOLDOWN_ENEMY_IN_BG = \"Mostra i recuperi del nemico nelle aree da Campo di Battaglia\"\nL_GUI_COOLDOWN_ENEMY_IN_ARENA = \"Mostra i recuperi del nemico nelle aree da arena\"\nL.enemycooldown_show_inparty = \"Show in party zone for allies\" -- Need review\nL.enemycooldown_class_color = \"Enable classcolor border\" -- Need review\n\n-- Pulse cooldowns options\nL_GUI_COOLDOWN_PULSE = \"Recuperi effetto 'pulse'\"\nL_GUI_COOLDOWN_PULSE_SUBTEXT = \"Track your cd using a pulse icon in the center of the screen.\" -- Need review\nL_GUI_COOLDOWN_PULSE_ENABLE = \"Mostra i recuperi con effetto 'pulse'\"\nL_GUI_COOLDOWN_PULSE_SIZE = \"Dimensione dell'icona dei recuperi con effetto 'pulse'\"\nL_GUI_COOLDOWN_PULSE_SOUND = \"Attiva un suono di avviso\"\nL_GUI_COOLDOWN_PULSE_ANIM_SCALE = \"Regolazione dell'animazione\"\nL_GUI_COOLDOWN_PULSE_HOLD_TIME = \"Opacità del tempo d'attesa massimo\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD = \"Threshold time\" -- Need review\nL_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = \"Soglia di tempo minimo\"\n\n-- Threat options\nL_GUI_THREAT = \"Barre di minaccia\"\nL_GUI_THREAT_SUBTEXT = \"Display of the threat list (a simple analogue of Omen).\" -- Need review\nL_GUI_THREAT_ENABLE = \"Attiva le barre di minaccia\"\nL_GUI_THREAT_HEIGHT = \"Altezza delle barre di minaccia\"\nL_GUI_THREAT_WIDTH = \"Larghezza delle barre di minaccia\"\nL_GUI_THREAT_ROWS = \"Numero delle barre di minaccia\"\nL_GUI_THREAT_HIDE_SOLO = \"Mostra soltanto in gruppo/incursione\"\n\n-- Top panel options\nL_GUI_TOP_PANEL = \"Pannello superiore\"\nL_GUI_TOP_PANEL_SUBTEXT = \"Manage built-in top panel with information.\" -- Need review\nL_GUI_TOP_PANEL_ENABLE = \"Attiva il pannello superiore\"\nL_GUI_TOP_PANEL_MOUSE = \"Pannello superiore al passaggio del mouse\"\nL_GUI_TOP_PANEL_WIDTH = \"Larghezza pannello\"\nL_GUI_TOP_PANEL_HEIGHT = \"Altezza pannello\"\n\n-- Stats options\nL_GUI_STATS = \"Stats\"\nL_GUI_STATS_SUBTEXT = \"Statistics blocks located at the bottom of the screen. Type in the chat '/ls' for info.\" -- Need review\nL_GUI_STATS_CLOCK = \"Orologio\"\nL_GUI_STATS_LATENCY = \"Latenza\"\nL_GUI_STATS_FPS = \"Frames Per Seconds\"\nL_GUI_STATS_EXPERIENCE = \"Esperienza\"\nL_GUI_STATS_TALENTS_DESC = \"Date-text allows you to change the spec and loot on click\" -- Need review\nL_GUI_STATS_COORDS = \"Coordinate\"\nL_GUI_STATS_LOCATION = \"Località\"\nL_GUI_STATS_BG = \"Campi di Battaglia\"\nL.stats_bottom_line = \"Bottom classcolor line\" -- Need review\nL_GUI_STATS_SUBHEADER_CURRENCY = \"Currency (displayed in gold data text)\" -- Need review\nL_GUI_STATS_CURRENCY_ARCHAEOLOGY = \"Mostra i frammenti di archeologia sotto la linguetta della valuta\"\nL_GUI_STATS_CURRENCY_COOKING = \"Mostra le ricompense di cucina sotto la linguetta della valuta\"\nL_GUI_STATS_CURRENCY_RAID = \"Mostra i sigilli delle incursioni\"\n\n-- Trade options\nL_GUI_TRADE = \"Trade\" -- Need review\nL_GUI_TRADE_SUBTEXT = \"Settings related to professions and trade\" -- Need review\"\nL.trade_profession_tabs = \"Professions tabs\" -- Need review\nL.trade_profession_tabs_desc = \"Visualizza la linguetta delle professioni sul riquadro abilità di commercio/commercio\"\nL.trade_already_known = \"Colorizes already known items\" -- Need review\nL.trade_already_known_desc = \"Colora ricette/cavalcature/mascottes possedute\"\nL.trade_disenchanting = \"Quick Disenchanting\" -- Need review\nL.trade_disenchanting_desc = \"Disincantamento, Pestatura e Prospezione in un solo click\"\nL.trade_sum_buyouts = \"Somma assieme tutte le aste correnti\"\nL.trade_sum_buyouts_desc = \"At auctions tab shows sum up all current auctions\" -- Need review\nL.trade_enchantment_scroll = \"Pergamena Incantamento sul riquadro sul riquadro abilità di commercio\"\nL.trade_archaeology = \"Archeologia: reliquie e recuperi\"\nL.trade_archaeology_desc = \"Archaeology tracker ('/arch' or right mouseover minimap button to show)\" -- Need review\nL.trade_merchant_itemlevel = \"Item level in merchant\" -- Need review\nL.trade_merchant_itemlevel_desc = \"Mostra il livello dell’oggetto di armi e armature in vendita\"\n\n-- Miscellaneous options\nL_GUI_MISC_SUBTEXT = \"Other settings that add interesting features.\" -- Need review\nL.misc_shift_marking = \"Marks mouseover target\" -- Need review\nL.misc_shift_marking_desc = \"Marks mouseover target when you push Shift (only in group)\" -- Need review\nL.misc_afk_spin_camera = \"Ruota la camera mentre sei assente\"\nL.misc_quest_auto_button = \"Quest items auto button\" -- Need review\nL.misc_quest_auto_button_desc = \"Pulsante automatico missione/oggetto\" -- Need review\nL.misc_raid_tools = \"Strumenti per le incursioni\"\nL.misc_raid_tools_desc = \"Button at the top of the screen for ready check (Left-click), checking roles (Middle-click), setting marks, etc. (for leader and assistants)\" -- Need review\nL.misc_item_level = \"Item level on slot buttons\" -- Need review\nL.misc_item_level_desc = \"Livello oggetto sugli scomparti della schermata Personaggio\"\nL.misc_click_cast = \"Scorciatoie da mouse (Click2Cast)\"\nL.misc_click_cast_desc = \"Allows you to assign spells (analog Clique) to the mouse buttons. Setup through the side bookmark in the spell book\" -- Need review\nL.misc_click_cast_filter = \"Ignora i riquadri di giocatore e bersaglio con Click2Cast\"\nL.misc_chars_currency = \"Traccia la valuta complessiva posseduta dai tuoi personaggi\"\nL.misc_chars_currency_desc = \"Hover over the icon of the required currency in the character window to display information in the tooltip\" -- Need review\nL.misc_hide_raid_button = \"Nascondi il pulsante di oUF_RaidDPS\"\nL.misc_hide_raid_button_desc = \"The button is displayed by hovering the mouse in the upper left corner\" -- Need review"
  },
  {
    "path": "ShestakUI_Config/Locales/Russian.lua",
    "content": "local _, L = ...\nif GetLocale() ~= \"ruRU\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for ruRU client\n--\tTranslation: Shestak, Wetxius\n----------------------------------------------------------------------------------------\nL_GUI_SET_SAVED_SETTTINGS = \"Персональный профиль\"\nL_GUI_SET_SAVED_SETTTINGS_DESC = \"Переключение между профилем, который применяется ко всем персонажам, и профилем, уникальным для этого персонажа.\"\nL_GUI_RESET_CHAR = \"Вы уверены, что хотите сбросить все настройки ShestakUI для этого персонажа?\"\nL_GUI_RESET_ALL = \"Вы уверены, что хотите сбросить все настройки ShestakUI?\"\nL_GUI_PER_CHAR = \"Вы уверены, что хотите сменить режим сохранения настроек?\"\nL_GUI_RESET_CAT = \"Вы уверены, что хотите сбросить настройки этого раздела?\"\nL_GUI_RESET_CAT_DESC = \"Сбрасывает настройки раздела. \\nCTRL-клик, чтобы сбросить всё\"\nL_GUI_NEED_RELOAD = \"Для активации настроек нужна перезагрузка.\"\nL_GUI_LAYOUT = \"Смена раскладки\"\nL_GUI_SPELL_LIST = \"Список заклинаний\"\nL_GUI_SPELL_INPUT = \"Номер заклинания\"\nL_GUI_TIME_INPUT = \"Время\"\nL_GUI_EXPERT_MODE = \"Режим эксперта\"\nL_GUI_EXPERT_MODE_DESC = \"Редактирование профиля Lua\"\nL_GUI_RESET_SPELLS_DESC = \"CTRL-клик, чтобы сбросить список\"\nL_GUI_INFO = \"Помощь\"\nL_GUI_WIKI_URL = \"https://github.com/Wetxius/ShestakUI_Help/wiki/Русский\"\n\n-- Profile\nL.profile = \"Профиль\"\nL.profile_title = \"Настройка профиля\"\nL.profile_choose = \"Выбор профиля\"\nL.profile_options = \"Настройки\"\nL.profile_movers = \"Перемещение элементов\"\nL.profile_export = \"Экспорт\"\nL.profile_import = \"Импорт\"\nL.profile_error_lib = \"Для включения импорта и экспорта - установите WeakAuras\"\nL.profile_error_code = \"Ошибка в импортируемом коде!\"\n\n-- General options\nL_GUI_GENERAL_SUBTEXT = \"Эти настройки контролируют общие параметры UI. Наберите в чат '/uihelp' для помощи.\"\nL_GUI_GENERAL_WELCOME_MESSAGE = \"Приветственное сообщение в чате\"\nL_GUI_GENERAL_AUTOSCALE = \"Автоматически масштабировать интерфейс\"\nL_GUI_GENERAL_UISCALE = \"Масштаб интерфейса\"\nL.general_subheader_blizzard = \"Элементы стандартного интерфейса\"\nL.general_error_filter = \"Фильтрация ошибок\"\nL.general_error_blacklist = \"Черный список\"\nL.general_error_whitelist = \"Белый список\"\nL.general_error_combat = \"В бою\"\nL.general_error_none = \"Отключено\"\nL.general_vehicle_mouseover = \"Индикатор транспорта по наведению курсора\"\nL.general_move_blizzard = \"Перемещение рамок Blizzard\"\nL.general_color_picker = \"Улучшенный подбор цвета\"\nL.general_color_picker_desc = \"В стандартное окно подбора цвета добавляются кнопки копировать/вставить, а так же поля для цифрового выставления цвета\"\nL.general_minimize_mouseover = \"Кнопка сворачивания квестов по наведению курсора\"\nL.general_hide_banner = \"Скрыть подсказку добычи после победы над боссом\"\nL.general_hide_talking_head = \"Скрыть рамку говорящей головы\"\nL.general_hide_maw_buffs = \"Скрыть Силу Анимы в подземельях\"\n\n-- Media options\nL.media_border_color = \"Цвет для окантовки\"\nL.media_classborder_color = \"Цвет для классовых окантовок\"\nL.media_backdrop_color = \"Цвет для фона\"\nL.media_backdrop_alpha = \"Прозрачность фона\"\nL.media_texture = \"Основная текстура\"\nL.media_subheader_normal = \"Изменение основного шрифта\"\nL.media_subheader_pixel = \"Изменение дополнительного шрифта\"\n\n-- Font options\nL.font = \"Шрифты\"\nL.font_subtext = \"Настройка шрифтов для элементов. 'MONOCHROMEOUTLINE' только для пиксельных шрифтов.\"\nL.font_stats_font = \"Выбор шрифта\"\nL.font_stats_font_style = \"Стиль шрифта\"\nL.font_stats_font_shadow = \"Тень для шрифта\"\nL.font_subheader_stats = \"Шрифт статистики\"\nL.font_subheader_combat = \"Шрифт текста боя\"\nL.font_subheader_chat = \"Шрифт чата\"\nL.font_subheader_chat_tabs = \"Шрифт вкладок чата\"\nL.font_subheader_action = \"Шрифт панелей команд\"\nL.font_subheader_threat = \"Шрифт списка угрозы\"\nL.font_subheader_raidcd = \"Шрифт рейдовых перезарядок\"\nL.font_subheader_cooldown = \"Шрифт перезарядок на панелях команд\"\nL.font_subheader_loot = \"Шрифт добычи\"\nL.font_subheader_nameplates = \"Шрифт индикаторов здоровья\"\nL.font_subheader_unit = \"Шрифт рамок портретов\"\nL.font_subheader_aura = \"Шрифт аур\"\nL.font_subheader_filger = \"Шрифт полос Filger\"\nL.font_subheader_style = \"Шрифт стилизаций\"\nL.font_subheader_bag = \"Шрифт сумок\"\nL.font_subheader_blizzard = \"Размер системных шрифтов\"\nL.font_tooltip_header_font_size = \"Заголовок подсказки\"\nL.font_tooltip_font_size = \"Текст подсказки\"\nL.font_global_font = \"Отключить пиксельный шрифт\"\n\n-- Skins options\nL_GUI_SKINS = \"Стилизация\"\nL_GUI_SKINS_SUBTEXT = \"Изменение внешнего вида стандартного интерфейса.\"\nL_GUI_SKINS_BLIZZARD = \"Стилизация элементов интерфейса Blizzard\"\nL_GUI_SKINS_MINIMAP_BUTTONS = \"Стилизация кнопок модификаций у миникарты\"\nL_GUI_SKINS_SUBHEADER = \"Стилизация сторонних модификаций\"\nL.skins_minimap_buttons_mouseover = \"Кнопки по наведению курсора\"\nL.skins_bubbles = \"Стилизация облачков чата\"\n\n-- Unit Frames options\nL_GUI_UF_SUBTEXT = \"Настройка рамок игрока, цели и т.д.\"\nL_GUI_UF_ENABLE = \"Включить рамки портретов\"\nL_GUI_UF_OWN_COLOR = \"Использовать свой цвет для полос здоровья\"\nL_GUI_UF_UF_COLOR = \"Цвет полос здоровья\"\nL.unitframe_uf_color_bg = \"Цвет фона\"\nL.unitframe_enemy_health_color = \"Красный цвет для врагов\"\nL.unitframe_enemy_health_color_desc = \"Окрашивать полосу здоровья вражеского игрока в красный\"\nL_GUI_UF_TOTAL_VALUE = \"Отображать общее здоровье/энергию\"\nL_GUI_UF_COLOR_VALUE = \"Цветное значение здоровья/энергии\"\nL_GUI_UF_BAR_COLOR_VALUE = \"Цвет полосы здоровья по его значению\"\nL_GUI_UF_LINES = \"Отображать линии игрока и цели\"\nL_GUI_UF_SUBHEADER_CAST = \"Полоса чтения заклинаний\"\nL_GUI_UF_UNIT_CASTBAR = \"Отображать полосу чтения заклинаний\"\nL_GUI_UF_CASTBAR_ICON = \"Иконка заклинания на полосе чтения\"\nL_GUI_UF_CASTBAR_LATENCY = \"Задержка заклинания на полосе\"\nL_GUI_UF_CASTBAR_TICKS = \"Отображать такты заклинания на полосе\"\nL_GUI_UF_SUBHEADER_FRAMES = \"Отображение рамок\"\nL_GUI_UF_SHOW_PET = \"Питомец\"\nL_GUI_UF_SHOW_FOCUS = \"Фокус\"\nL_GUI_UF_SHOW_TOT = \"Цель цели\"\nL_GUI_UF_SHOW_BOSS = \"Боссы\"\nL_GUI_UF_BOSS_RIGHT = \"Рамки боссов справа\"\nL_GUI_UF_SHOW_ARENA = \"Арена\"\nL_GUI_UF_ARENA_RIGHT = \"Рамки арены справа\"\nL_GUI_UF_BOSS_DEBUFFS = \"Количество дебаффов\"\nL_GUI_UF_BOSS_DEBUFFS_DESC = \"Количество дебаффов на рамке босса\"\nL_GUI_UF_BOSS_BUFFS = \"Количество баффов\"\nL_GUI_UF_BOSS_BUFFS_DESC = \"Количество баффов на рамке босса\"\nL.unitframe_icons_pvp = \"PvP статус\"\nL.unitframe_icons_pvp_desc = \"Отображается при наведении курсора на рамки игрока и цели\"\nL_GUI_UF_ICONS_COMBAT = \"Отображать иконку боя на рамке игрока\"\nL_GUI_UF_ICONS_RESTING = \"Отображать иконку отдыха на рамке игрока\"\nL_GUI_UF_SUBHEADER_PORTRAIT = \"3D Портреты\"\nL_GUI_UF_PORTRAIT_ENABLE = \"Отображать 3D портреты игрока и цели\"\nL_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = \"Окрашивать края портретов по цвету класса\"\nL.unitframe_portrait_type = \"Тип портретов\"\nL.unitframe_portrait_type_icons = \"Иконка класса\"\nL.unitframe_portrait_type_overlay = \"Наложение\"\nL_GUI_UF_PORTRAIT_HEIGHT = \"Высота портретов\"\nL_GUI_UF_PORTRAIT_WIDTH = \"Ширина портретов\"\nL_GUI_UF_SUBHEADER_PLUGINS = \"Плагины\"\nL_GUI_UF_PLUGINS_GCD = \"Полоса глобальной перезарядки на рамке игрока\"\nL_GUI_UF_PLUGINS_SWING = \"Индикатор автоматической атаки\"\nL.unitframe_plugins_reputation_bar = \"Индикатор репутации\"\nL.unitframe_plugins_reputation_bar_desc = \"Включить индикатор репутации (слева от игрока по наведению курсора, СКМ - фиксация видимости)\"\nL.unitframe_plugins_experience_bar = \"Индикатор опыта\"\nL.unitframe_plugins_experience_bar_desc = \"Включить индикатор опыта (слева от игрока по наведению курсора, СКМ - фиксация видимости)\"\nL_GUI_UF_PLUGINS_SMOOTH_BAR = \"Плавное изменение полос\"\nL_GUI_UF_PLUGINS_ENEMY_SPEC = \"Специализация врага на полях боя и Арене\"\nL_GUI_UF_PLUGINS_COMBAT_FEEDBACK = \"Текст боя на рамках игрока и цели\"\nL_GUI_UF_PLUGINS_FADER = \"Скрывать рамки вне боя\"\nL_GUI_UF_PLUGINS_DIMINISHING = \"Иконка диминишинга на рамках арены\"\nL_GUI_UF_PLUGINS_POWER_PREDICTION = \"Полоса прогноза использования маны/энергии\"\nL.unitframe_plugins_absorbs = \"Количество поглощения на рамке игрока\"\nL.unitframe_subheader_player_width = \"Размеры рамок игрока и цели\"\nL.unitframe_player_width = \"Ширина\"\nL.unitframe_subheader_boss_width = \"Размеры рамок босса и арены\"\nL.unitframe_extra_height_auto = \"Авто высота здоровья и энергии\"\nL.unitframe_extra_height_auto_desc = \"Умное увеличение в зависимости от размера шрифта\"\nL.unitframe_extra_health_height = \"Доп. высота для здоровья\"\nL.unitframe_extra_power_height = \"Доп. высота для энергии\"\nL.unitframe_subheader_castbar = \"Размер кастбара игрока и цели\"\nL.unitframe_castbar_height = \"Высота\"\n\n-- Unit Frames Class bar options\nL_GUI_UF_PLUGINS_CLASS_BAR = \"Классовые панели\"\nL_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = \"Управление особыми классовые ресурсами.\"\nL_GUI_UF_PLUGINS_COMBO_BAR = \"Индикатор серии приемов\"\nL_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = \"Всегда показывать индикатор серии приемов (для друидов)\"\nL_GUI_UF_PLUGINS_COMBO_BAR_OLD = \"Отображать индикатор серии приемов на цели\"\nL_GUI_UF_PLUGINS_ARCANE_BAR = \"Индикатор чародейского заряда\"\nL_GUI_UF_PLUGINS_CHI_BAR = \"Индикатор ци\"\nL_GUI_UF_PLUGINS_STAGGER_BAR = \"Индикатор пошатывания (для танков монахов)\"\nL_GUI_UF_PLUGINS_HOLY_BAR = \"Индикатор энергии света\"\nL_GUI_UF_PLUGINS_SHARD_BAR = \"Индикатор осколков душ\"\nL_GUI_UF_PLUGINS_RUNE_BAR = \"Индикатор рун\"\nL_GUI_UF_PLUGINS_TOTEM_BAR = \"Индикатор тотемов для шаманов\"\nL.unitframe_class_bar_totem_other = \"Индикатор 'тотемов' для других классов\"\nL.unitframe_class_bar_essence = \"Индикатор сущности\"\n\n-- Raid Frames options\nL_GUI_UF_RAIDFRAMES_SUBTEXT = \"Настройка внешнего вида рейдовых рамок.\"\nL_GUI_UF_BY_ROLE = \"Сортировка игроков в группе по ролям\"\nL_GUI_UF_AGGRO_BORDER = \"Отображение угрозы\"\nL_GUI_UF_DEFICIT_HEALTH = \"Значение здоровья по дефициту\"\nL.raidframe_vertical_health = \"Вертикальное направление полосы здоровья\"\nL.raidframe_vertical_health_desc = \"Только для раскладки 'Лекарь'\"\nL_GUI_UF_ALPHA_HEALTH = \"Прозрачность рамок при полном здоровье\"\nL_GUI_UF_SHOW_RANGE = \"Прозрачность рамок вне зоны досягаемости\"\nL_GUI_UF_RANGE_ALPHA = \"Прозрачность\"\nL_GUI_UF_RANGE_ALPHA_DESC = \"Значение для прозрачности рамок вне зоны досягаемости\"\nL_GUI_UF_SUBHEADER_RAIDFRAMES = \"Рамки\"\nL_GUI_UF_SHOW_PARTY = \"Рамки группы\"\nL_GUI_UF_SHOW_RAID = \"Рамки рейда\"\nL.raidframe_layout = \"Рейдовая раскладка\"\nL.raidframe_heal_layout = \"Лекарь\"\nL.raidframe_dps_layout = \"Боец\"\nL.raidframe_auto_layout = \"Авто\"\nL.raidframe_show_target = \"Рамки целей\"\nL.raidframe_show_pet = \"Рамки питомцев\"\nL_GUI_UF_SOLO_MODE = \"Отображать в соло\"\nL_GUI_UF_PLAYER_PARTY = \"Отображать рамку игрока в группе\"\nL_GUI_UF_SHOW_TANK = \"Рамки танков рейда\"\nL_GUI_UF_SHOW_TANK_TT = \"Рамки целей цели танков\"\nL_GUI_UF_RAID_GROUP = \"Количество групп в рейде\"\nL.raidframe_party_vertical = \"Расположить рамки группы вертикально\"\nL.raidframe_raid_groups_vertical = \"Расположить рамки рейда вертикально\"\nL.raidframe_raid_groups_vertical_desc = \"Только для раскладки 'Лекарь'\"\nL_GUI_UF_SUBHEADER_ICONS = \"Отображение иконок\"\nL_GUI_UF_ICONS_ROLE = \"Роль\"\nL_GUI_UF_ICONS_RAID_MARK = \"Рейдовые метки\"\nL_GUI_UF_ICONS_READY_CHECK = \"Готовность\"\nL_GUI_UF_ICONS_LEADER = \"Лидер и помощник\"\nL_GUI_UF_ICONS_SUMON = \"Призыв\"\nL.raidframe_icons_phase = \"Фаза\"\nL.raidframe_plugins_debuffhighlight_icon = \"Отображать снимаемые дебаффы\"\nL.raidframe_plugins_aura_watch = \"Отображать рейдовые дебаффы (из списка)\"\nL.raidframe_plugins_aura_watch_timer = \"Включить цифровой таймер\"\nL.raidframe_plugins_pvp_debuffs = \"Отображать PvP дебаффы (из списка)\"\nL_GUI_UF_PLUGINS_HEALCOMM = \"Отображать поступающее лечение\"\nL.raidframe_plugins_over_absorb = \"Избыточное поглощение\"\nL.raidframe_plugins_over_heal_absorb = \"Избыточное поглощение исцеления\"\nL.raidframe_plugins_auto_resurrection = \"Автокаст воскрешения\"\nL.raidframe_plugins_auto_resurrection_desc = \"Автокаст воскрешения средней кнопкой мыши (не работает с Clique)\"\nL.raidframe_hide_health_value = \"Скрыть значение здоровья для рейда\"\nL.raidframe_auto_position = \"Авто крепление рейда\"\nL.raidframe_auto_position_desc = \"Если групп больше 5 - меняются крепления рамок. \\nТолько для раскладки 'Лекарь' \"\nL.raidframe_auto_position_dynamic = \"Динамическое\"\nL.raidframe_auto_position_static = \"Статическое\"\nL.raidframe_subheader_heal_size = \"Размеры для раскладки 'Лекарь'\"\nL.raidframe_heal_width = \"Ширина рамок\"\nL.raidframe_heal_height = \"Высота рамок\"\nL.raidframe_heal_power_height = \"Высота энергии\"\nL.raidframe_subheader_dps_size = \"Размеры для раскладки 'Боец'\"\nL.raidframe_dps_party_width = \"Ширина группы\"\nL.raidframe_dps_party_height = \"Высота группы\"\nL.raidframe_dps_raid_width = \"Ширина рейда\"\nL.raidframe_dps_raid_height = \"Высота рейда\"\nL.raidframe_dps_party_power_height = \"Высота энергии группы\"\nL.raidframe_dps_raid_power_height = \"Высота энергии рейда\"\n\n-- ActionBar options\nL_GUI_ACTIONBAR = \"Панели команд\"\nL_GUI_ACTIONBAR_ENABLE = \"Включить панели команд\"\nL_GUI_ACTIONBAR_HOTKEY = \"Отображать назначения клавиш\"\nL_GUI_ACTIONBAR_MACRO = \"Отображать имена макросов\"\nL_GUI_ACTIONBAR_GRID = \"Отображать пустые кнопки панелей команд\"\nL_GUI_ACTIONBAR_BUTTON_SIZE = \"Размер кнопок\"\nL_GUI_ACTIONBAR_BUTTON_SPACE = \"Промежуток\"\nL_GUI_ACTIONBAR_SPLIT_BARS = \"Разделить пятую панель на две панели по 6 кнопок\"\nL_GUI_ACTIONBAR_CLASSCOLOR_BORDER = \"Окрашивать края кнопок в цвет класса\"\nL.actionbar_toggle_mode = \"Включить режим переключения панелей\"\nL.actionbar_toggle_mode_desc = \"Быстрое изменение количества панелей. Для нижних панелей - навести мышкой на скрытую область выше панелей. Для правых панелей - навести на область ниже панелей.\"\nL_GUI_ACTIONBAR_HIDE_HIGHLIGHT = \"Скрывать подсветку кнопок\"\nL_GUI_ACTIONBAR_BOTTOMBARS = \"Количество нижних панелей\"\nL_GUI_ACTIONBAR_RIGHTBARS = \"Количество правых панелей\"\nL.actionbar_bottombars_mouseover = \"Нижние панели команд по наведению курсора\"\nL_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = \"Правые панели команд по наведению курсора\"\nL_GUI_ACTIONBAR_PETBAR_HIDE = \"Скрыть панель питомца\"\nL_GUI_ACTIONBAR_PETBAR_HORIZONTAL = \"Горизонтальная панель питомца\"\nL_GUI_ACTIONBAR_PETBAR_MOUSEOVER = \"По наведению курсора\"\nL_GUI_ACTIONBAR_STANCEBAR_HIDE = \"Скрыть панель стоек\"\nL_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = \"Горизонтальная панель стоек\"\nL.actionbar_stancebar_horizontal_desc = \"Расположена снизу от фрейма игрока\"\nL_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = \"По наведению курсора\"\nL_GUI_ACTIONBAR_MICROMENU = \"Включить микроменю\"\nL_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = \"Микроменю по наведению курсора\"\nL.actionbar_editor = \"Редактор панелей\"\nL.actionbar_editor_desc = \"Разблокировать настройку и перемещение каждой панели в отдельности\"\nL.actionbar_bar1_num = \"Количество кнопок\"\nL.actionbar_bar1_row = \"Кнопок в ряду\"\nL.actionbar_bar1_mouseover = \"По наведению курсора\"\n\n-- Tooltip options\nL.tooltip = \"Подсказки\"\nL.tooltip_subtext = \"В этом блоке можно изменить стандартные подсказки при наведении курсора.\"\nL.tooltip_enable = \"Включить подсказки\"\nL.tooltip_shift_modifer = \"Показывать подсказку при зажатой кнопке Shift\"\nL.tooltip_cursor = \"Подсказка над указателем мыши\"\nL.tooltip_item_icon = \"Иконка заклинания/предмета в подсказке\"\nL.tooltip_health_value = \"Цифровое значение здоровья в подсказке\"\nL.tooltip_hidebuttons = \"Прятать подсказку для кнопок панели команд\"\nL.tooltip_hide_combat = \"Прятать подсказку в бою\"\nL.tooltip_subheader = \"Плагины\"\nL.tooltip_talents = \"Специализация цели в подсказке\"\nL.tooltip_show_shift = \"Только при зажатой кнопке Shift\"\nL.tooltip_show_shift_desc = \"Специализация и уровень предметов отображаются, если зажата кнопка Shift\"\nL.tooltip_achievements = \"Сравнивать достижения в чате с вашими\"\nL.tooltip_target = \"Цель цели в подсказке\"\nL.tooltip_title = \"Звание игрока\"\nL.tooltip_realm = \"Игровой мир игрока\"\nL.tooltip_rank = \"Ранг в гильдии\"\nL.tooltip_spell_id = \"Номер заклинания/предмета\"\nL.tooltip_average_lvl_desc = \"Средний уровень предметов игроков\"\nL.tooltip_raid_icon = \"Рейдовые метки\"\nL.tooltip_who_targetting = \"Показать, кто выбрал целью данного персонажа\"\nL.tooltip_item_count = \"Количество предметов в сумках и банке\"\nL.tooltip_unit_role = \"Роль игрока\"\nL.tooltip_instance_lock = \"Ваш статус прохождения подземелий в подсказке\"\nL.tooltip_mount = \"Источник средства передвижения\"\n\n-- Chat options\nL.chat_subtext = \"Здесь можно изменить настройки окна чата.\"\nL.chat_enable = \"Включить чат\"\nL.chat_background = \"Включить фон чата\"\nL.chat_background_alpha = \"Прозрачность фона\"\nL.chat_filter = \"Удаление системных сообщений\"\nL.chat_filter_desc = \"Дуэли, смена талантов, диалоги NPC в городах\"\nL.chat_spam = \"Удаление спама от игроков\"\nL.chat_spam_list = \"Черный список\"\nL.chat_spam_list_desc = \"Список слов (через пробел, строчными буквами) для скрытия сообщений\"\nL.chat_width = \"Ширина чата\"\nL.chat_height = \"Высота чата\"\nL.chat_chat_bar = \"Панель кнопок каналов\"\nL.chat_chat_bar_mouseover = \"Панель по наведению курсора\"\nL.chat_whisp_sound = \"Звуковое оповещение во время шепота\"\nL.chat_combatlog = \"Показывать вкладку журнала боя\"\nL.chat_tabs_mouseover = \"Вкладки чата по наведению курсора\"\nL.chat_sticky = \"Запоминать последний канал чата\"\nL.chat_damage_meter_spam = \"Объединять спам измерителей урона в одну строку\"\nL.chat_loot_icons = \"Иконки для добычи\"\nL.chat_hide_combat = \"Скрывать чат в бою\"\nL.chat_custom_time_color = \"Задать свой цвет времени\"\nL.chat_time_color = \"Цвет времени чата\"\n\n-- Nameplate options\nL_GUI_NAMEPLATE_SUBTEXT = \"Изменение индикаторов здоровья.\"\nL_GUI_NAMEPLATE_ENABLE = \"Включить индикаторы здоровья\"\nL_GUI_NAMEPLATE_COMBAT = \"Автоматически показывать индикаторы во время боя\"\nL_GUI_NAMEPLATE_HEALTH = \"Цифровое значение здоровья\"\nL_GUI_NAMEPLATE_HEIGHT = \"Высота индикатора\"\nL_GUI_NAMEPLATE_WIDTH = \"Ширина индикатора\"\nL.nameplate_alpha = \"Прозрачность\"\nL.nameplate_alpha_desc = \"Прозрачность индикаторов, которые не являются выбранной целью\"\nL.nameplate_ad_height = \"Дополнительная высота\"\nL.nameplate_ad_width = \"Дополнительная ширина\"\nL.nameplate_ad_height_desc = \"Дополнительная высота выбранного индикатора\"\nL.nameplate_ad_width_desc = \"Дополнительная ширина выбранного индикатора\"\nL_GUI_NAMEPLATE_CASTBAR_NAME = \"Название заклинания\"\nL_GUI_NAMEPLATE_CLASS_ICON = \"Иконки классов в PvP\"\nL_GUI_NAMEPLATE_NAME_ABBREV = \"Сокращение имен\"\nL.nameplate_short_name = \"Заменить имена на короткие\"\nL.nameplate_clamp = \"Прикреплять индикаторы\"\nL.nameplate_clamp_desc = \"Прикреплять к верху экрана, когда цели пропадают из прямой видимости\"\nL_GUI_NAMEPLATE_SHOW_DEBUFFS = \"Отображать ваши отрицательные эффекты (из списка)\"\nL_GUI_NAMEPLATE_SHOW_BUFFS = \"Отображать снимаемые баффы + из списка\"\nL_GUI_NAMEPLATE_DEBUFFS_SIZE = \"Размер иконок аур\"\nL_GUI_NAMEPLATE_HEALER_ICON = \"Иконка над вражескими целителями\"\nL_GUI_NAMEPLATE_TOTEM_ICONS = \"Иконка тотемов\"\nL.nameplate_target_glow = \"Выделять текущую цель\"\nL.nameplate_only_name = \"Отображать только имя для союзников\"\nL.nameplate_quests = \"Иконка квестов\"\nL.nameplate_cast_color = \"Выделить цветом чтение важных заклинаний\"\nL.nameplate_kick_color = \"Изменить цвет чтения заклинания, если ваше прерывание на кд\"\nL.nameplate_low_health_value = \"Уровень здоровья\"\nL.nameplate_low_health = \"Подсветка низкого здоровья\"\nL_GUI_NAMEPLATE_THREAT = \"Цветовое обозначение угрозы (зависит от роли)\"\nL_GUI_NAMEPLATE_GOOD_COLOR = \"Цвет наименьшей угрозы (для танка наивысшей)\"\nL_GUI_NAMEPLATE_NEAR_COLOR = \"Цвет получения/сброса угрозы\"\nL_GUI_NAMEPLATE_BAD_COLOR = \"Цвет наивысшей угрозы (для танка наименьшей)\"\nL_GUI_NAMEPLATE_OFFTANK_COLOR = \"Цвет угрозы для оффтанка (если вы танк)\"\nL.nameplate_extra_color = \"Цвет сфер и теней (аффиксы)\"\nL.nameplate_mob_color_enable = \"Изменить цвет важных противников в подземельях\"\nL.nameplate_mob_color = \"Цвет для противников\"\n\n-- Combat text options\nL_GUI_COMBATTEXT = \"Текст боя\"\nL_GUI_COMBATTEXT_SUBTEXT = \"Для перемещения набрать в чате '/xct'\"\nL_GUI_COMBATTEXT_ENABLE = \"Включить текст боя\"\nL.combattext_blizz_head_numbers = \"Задействовать текст боя Blizzard\"\nL.combattext_blizz_head_numbers_desc = \"Включить исходящий текст боя Blizzard (над головами)\"\nL.combattext_damage_style = \"Смена шрифта текста боя\"\nL.combattext_damage_style_desc = \"Использовать пиксельный шрифт текста боя над головами (требуется рестарт WoW)\"\nL_GUI_COMBATTEXT_DAMAGE = \"Отображать исходящий урон\"\nL_GUI_COMBATTEXT_HEALING = \"Отображать исходящее лечение\"\nL.combattext_incoming = \"Отображать входящий урон и лечение\"\nL_GUI_COMBATTEXT_HOTS = \"Отображать лечение ваших периодических заклинаний\"\nL_GUI_COMBATTEXT_OVERHEALING = \"Отображать исходящее избыточное лечение\"\nL_GUI_COMBATTEXT_PET_DAMAGE = \"Отображать урон вашего питомца\"\nL_GUI_COMBATTEXT_DOT_DAMAGE = \"Отображать урон ваших периодических заклинаний\"\nL_GUI_COMBATTEXT_DAMAGE_COLOR = \"Окрашивать значения урона в цвет магии\"\nL_GUI_COMBATTEXT_CRIT_PREFIX = \"Символ, добавляемый перед критическими значениями\"\nL_GUI_COMBATTEXT_CRIT_POSTFIX = \"Символ, добавляемый после критических значений\"\nL_GUI_COMBATTEXT_ICONS = \"Отображать иконки исходящего лечения и урона\"\nL_GUI_COMBATTEXT_ICON_SIZE = \"Размер иконок\"\nL_GUI_COMBATTEXT_ICON_SIZE_DESC = \"Размер иконок в блоке исходящего лечения и урона\"\nL_GUI_COMBATTEXT_TRESHOLD = \"Минимально отображаемое значение урона\"\nL_GUI_COMBATTEXT_HEAL_TRESHOLD = \"Минимально отображаемое значение лечения\"\nL_GUI_COMBATTEXT_SCROLLABLE = \"Включить прокручивание текста в блоках колесом мыши\"\nL_GUI_COMBATTEXT_MAX_LINES = \"Количество линий\"\nL_GUI_COMBATTEXT_MAX_LINES_DESC = \"Максимальное количество строк (больше строк = больше памяти)\"\nL_GUI_COMBATTEXT_TIME_VISIBLE = \"Время\"\nL_GUI_COMBATTEXT_TIME_VISIBLE_DESC = \"Время (в секундах) до исчезновения текста\"\nL_GUI_COMBATTEXT_DK_RUNES = \"Отображать перезарядку рун Рыцарей Смерти\"\nL_GUI_COMBATTEXT_KILLINGBLOW = \"Отображать Победный удар\"\nL.combattext_merge_aoe_spam = \"Объединять заклинания в одно сообщение\"\nL.combattext_merge_aoe_spam_desc = \"Объединять многократные значения урона и лечения в одно сообщение\"\nL_GUI_COMBATTEXT_MERGE_MELEE = \"Объединять автоатаки\"\nL.combattext_merge_all = \"Объединять все способности\"\nL_GUI_COMBATTEXT_DISPEL = \"Отображать ваши рассеивания\"\nL_GUI_COMBATTEXT_INTERRUPT = \"Отображать ваши прерывания\"\nL_GUI_COMBATTEXT_DIRECTION = \"Сменить направление прокрутки текста боя\"\nL_GUI_COMBATTEXT_SHORT_NUMBERS = \"Сокращать цифры ('25.3k' вместо '25342')\"\n\n-- Auras/Buffs/Debuffs\nL_GUI_AURA_PLAYER_BUFF_SIZE = \"Размер аур\"\nL_GUI_AURA_PLAYER_BUFF_SIZE_DESC = \"Размер положительных эффектов игрока\"\nL.aura_debuff_size = \"Размер дебаффов\"\nL_GUI_AURA_SHOW_SPIRAL = \"Спираль перезарядки на аурах\"\nL_GUI_AURA_SHOW_TIMER = \"Отображать таймер перезарядки аур\"\nL_GUI_AURA_PLAYER_AURAS = \"Ауры игрока\"\nL_GUI_AURA_TARGET_AURAS = \"Цель\"\nL_GUI_AURA_FOCUS_DEBUFFS = \"Фокус\"\nL_GUI_AURA_FOT_DEBUFFS = \"Цель фокуса\"\nL_GUI_AURA_PET_DEBUFFS = \"Питомец\"\nL_GUI_AURA_TOT_DEBUFFS = \"Цель цели\"\nL_GUI_AURA_PLAYER_AURA_ONLY = \"Только ваши отрицательные эффекты на цели\"\nL_GUI_AURA_DEBUFF_COLOR_TYPE = \"Окрашивать края по их типу\"\nL_GUI_AURA_CAST_BY = \"Отображать имя того, кто применил эффект\"\nL_GUI_AURA_CLASSCOLOR_BORDER = \"Окрашивать края в цвет класса\"\nL.aura_subheader_buffs = \"Положительные эффекты игрока\"\nL.aura_subheader_debuffs = \"Отрцательные эффекты\"\nL.aura_subheader_boss = \"Ауры босса\"\n\n-- Bag options\nL_GUI_BAGS = \"Сумки\"\nL_GUI_BAGS_SUBTEXT = \"Правый клик по кнопке закрытия, чтобы открыть меню. Для перемещения сумок зажать Shift - клик.\"\nL_GUI_BAGS_ENABLE = \"Включить сумки\"\nL_GUI_BAGS_ILVL = \"Показывать уровень предметов для оружия и брони\"\nL.bag_new_items = \"Анимация для новых предметов\"\nL.bag_filter = \"Всегда отображать панель фильтров\"\nL_GUI_BAGS_BUTTON_SIZE = \"Размер ячеек\"\nL_GUI_BAGS_BUTTON_SPACE = \"Промежуток\"\nL_GUI_BAGS_BANK = \"Cтолбцов в банке\"\nL_GUI_BAGS_BAG = \"Cтолбцов в сумках\"\n\n-- Minimap options\nL_GUI_MINIMAP_SUBTEXT = \"Настройка миникарты.\"\nL_GUI_MINIMAP_ENABLE = \"Включить миникарту\"\nL.minimap_on_top = \"Переместить в правый верхний угол\"\nL_GUI_MINIMAP_ICON = \"Иконка отслеживания объектов\"\nL_GUI_GARRISON_ICON = \"Иконка ковенанта\"\nL_GUI_MINIMAP_SIZE = \"Размер миникарты\"\nL_GUI_MINIMAP_HIDE_COMBAT = \"Скрыть миникарту в бою\"\nL_GUI_MINIMAP_TOGGLE_MENU = \"Отображать меню над миникартой\"\nL.minimap_bg_map_stylization = \"Стилизация карты полей боя\"\nL.minimap_fog_of_war = \"Убрать туман войны с глобальной карты\"\n\n-- Loot options\nL_GUI_LOOT_SUBTEXT = \"Настройка окна добычи.\"\nL_GUI_LOOT_ENABLE = \"Включить окно добычи\"\nL_GUI_LOOT_ROLL_ENABLE = \"Включить групповое окно добычи\"\nL_GUI_LOOT_ICON_SIZE = \"Размер иконки\"\nL_GUI_LOOT_WIDTH = \"Ширина окна добычи\"\nL_GUI_LOOT_AUTOGREED = \"Авто не откажусь/распылить для зеленых предметов на макс. уровне\"\nL_GUI_LOOT_AUTODE = \"Убрать запрос о распылении предмета\"\nL.loot_faster_loot = \"Ускорить взятие добычи\"\nL.loot_faster_loot_desc = \"Работает, если включен автоматический сбор добычи\"\n\n-- Filger\nL_GUI_FILGER = \"Таймеры (Filger)\"\nL_GUI_FILGER_SUBTEXT = \"Filger - аналог WeakAuras, но более простой и легкий. Позволяет выводить в виде иконок и полос ваши ауры и таймеры.\"\nL_GUI_FILGER_ENABLE = \"Включить Filger\"\nL_GUI_FILGER_TEST_MODE = \"Тестирование иконок\"\nL_GUI_FILGER_MAX_TEST_ICON = \"Иконок для теста\"\nL_GUI_FILGER_SHOW_TOOLTIP = \"Показывать подсказку для иконок\"\nL.filger_subheader_elements = \"Отображение элементов\"\nL.filger_show_buff = \"Баффы игрока\"\nL.filger_show_proc = \"Проки игрока\"\nL.filger_show_debuff = \"Дебаффы на цели\"\nL.filger_show_aura_bar = \"Полосы аур на цели\"\nL.filger_show_special = \"Особые баффы на игроке\"\nL.filger_show_pvp_player = \"PvP дебаффы на игроке\"\nL.filger_show_pvp_target = \"PvP ауры на цели\"\nL.filger_show_cd = \"Перезарядки\"\nL.filger_subheader_size = \"Размеры иконок\"\nL.filger_subheader_test = \"Режим тестирования\"\nL_GUI_FILGER_EXPIRATION = \"Сортировать перезарядки по времени\"\nL_GUI_FILGER_BUFFS_SIZE = \"Размер баффов и проков\"\nL_GUI_FILGER_COOLDOWN_SIZE = \"Размер перезарядок\"\nL_GUI_FILGER_PVP_SIZE = \"Размер PvP аур\"\nL.filger_buffs_space = \"Промежуток\"\nL.filger_pvp_space = \"Промежуток\"\nL.filger_cooldown_space = \"Промежуток\"\nL.filger_subheader_spells = \"Добавление новых заклинаний\"\nL.filger_category_list = \"Выбор списка\"\n\n-- Announcements options\nL_GUI_ANNOUNCEMENTS = \"Объявления\"\nL_GUI_ANNOUNCEMENTS_SUBTEXT = \"Здесь можно включить оповещения в чат о заклинаниях и предметах.\"\nL.announcements_drinking = \"Враг пьет на арене\"\nL.announcements_interrupts = \"Прерывание заклинания\"\nL.announcements_interrupts_desc = \"Сообщать о вашем прерывании заклинания\"\nL.announcements_spells = \"Использование заклинаний\"\nL.announcements_spells_desc = \"Сообщать, когда вы применили заклинание (из списка)\"\nL.announcements_spells_from_all = \"Включая других игроков\"\nL.announcements_spells_from_all_desc = \"Сообщать, когда применил участник группы/рейда\"\nL.announcements_toys = \"Применение назойливых игрушек\"\nL.announcements_pull_countdown = \"Отсчёт до атаки\"\nL.announcements_pull_countdown_desc = \"Команда для отсчета времени до атаки (/pc #)\"\nL.announcements_flask_food = \"Отсутствующие настои и еда\"\nL.announcements_flask_food_desc = \"Сообщать об отсутствующих настоях и еде (/ffcheck)\"\nL.announcements_flask_food_raid = \"Сообщать в рейдовый канал\"\nL.announcements_flask_food_auto = \"Сообщать при проверке готовности\"\nL.announcements_feasts = \"Пир, почта, ремонт и кодекс\"\nL.announcements_portals = \"Порталы и ритуал призыва\"\nL.announcements_subheader_self = \"Локальное оповещение\"\nL.announcements_bad_gear = \"'Плохое' снаряжение\"\nL.announcements_bad_gear_desc = \"Проверять ваше 'плохое' снаряжение в подземельях (удочки и прочее из списка)\"\nL.announcements_safari_hat = \"Шляпа для сафари\"\nL.announcements_safari_hat_desc = \"Проверять Шляпу для сафари в начале битвы петов\"\n\n-- Automation options\nL_GUI_AUTOMATION = \"Автоматизация\"\nL_GUI_AUTOMATION_SUBTEXT = \"В этом блоке расположены настройки, которые облегчают рутину.\"\nL.automation_release = \"Покидать тело на полях боя\"\nL.automation_screenshot = \"Сохранять скриншот, если получено достижение\"\nL.automation_solve_artifact = \"Предлагать собрать артефакт для Археологии\"\nL.automation_solve_artifact_desc = \"Если хватает фрагментов для артефакта, появится окно для его сборки\"\nL.automation_accept_invite = \"Принятие приглашений от друзей и гильдии\"\nL.automation_decline_duel = \"Отмена дуэлей (/disduel, чтобы временно отключить)\"\nL.automation_accept_quest = \"Принятие заданий (если зажат Shift - не работает)\"\nL.automation_auto_collapse = \"Сворачивать отслеживание заданий\"\nL.automation_auto_collapse_raid = \"В подземельях\"\nL.automation_auto_collapse_reload = \"При загрузке\"\nL.automation_auto_collapse_scenario = \"Частично\"\nL.automation_skip_cinematic = \"Пропуск видеороликов (если зажат Ctrl - не работает)\"\nL.automation_auto_role = \"Выбор вашей роли (в группе/рейде)\"\nL.automation_cancel_bad_buffs = \"Снимать назойливые праздничные баффы (из списка)\"\nL.automation_tab_binder = \"Менять поведение клавиши 'Tab' в PvP\"\nL.automation_tab_binder_desc = \"Клавиша 'Tab' будет выбирать только вражеских игроков, игнорируя петов и мобов\"\nL.automation_logging_combat = \"Включать запись журнала боя в рейде\"\nL.automation_buff_on_scroll = \"Накладывать баффы на себя прокруткой колеса мыши (из списка)\"\nL.automation_buff_on_scroll_desc = \"Если бафф из списка не висит на игроке, прокрутив колесо он применится\"\nL.automation_open_items = \"Открывать сундуки и ящики в вашей сумке\"\nL.automation_resurrection = \"Принятие воскрешений\"\nL.automation_summon = \"Принятие призыва\"\nL.automation_summon_desc = \"Суммон от игроков\"\nL.automation_whisper_invite = \"Авто приглашение по ключевым словам\"\nL.automation_invite_keyword = \"Список слов (через пробел)\"\nL.automation_invite_keyword_desc = \"Если вам напишут в личку ключевое слово, то сработает приглашение в группу\"\n\n-- Buffs reminder options\nL_GUI_REMINDER = \"Напоминания\"\nL_GUI_REMINDER_SUBTEXT = \"Отображение пропущенных аур.\"\nL_GUI_REMINDER_SOLO_ENABLE = \"Показать пропущенные ауры игрока\"\nL_GUI_REMINDER_SOLO_SOUND = \"Дополнительное звуковое предупреждение\"\nL_GUI_REMINDER_SOLO_SIZE = \"Размер иконки\"\nL_GUI_REMINDER_SOLO_SIZE_DESC = \"Размер иконки ауры игрока\"\nL_GUI_REMINDER_SUBHEADER = \"Рейдовые ауры\"\nL_GUI_REMINDER_RAID_ENABLE = \"Включить отображение пропущенных аур\"\nL_GUI_REMINDER_RAID_ALWAYS = \"Всегда показывать иконки (по умолчанию только в рейде)\"\nL_GUI_REMINDER_RAID_SIZE = \"Размер иконок\"\nL_GUI_REMINDER_RAID_SIZE_DESC = \"Размер иконок рейдовых аур\"\nL_GUI_REMINDER_RAID_ALPHA = \"Прозрачность\"\nL_GUI_REMINDER_RAID_ALPHA_DESC = \"Прозрачность иконок рейдовых аур\"\n\n-- Raid cooldowns options\nL_GUI_COOLDOWN_RAID = \"Перезарядки рейда\"\nL_GUI_COOLDOWN_RAID_SUBTEXT = \"Отслеживание рейдовых способностей в виде полос в левом верхнем углу.\"\nL_GUI_COOLDOWN_RAID_ENABLE = \"Включить рейдовые перезарядки\"\nL_GUI_COOLDOWN_RAID_HEIGHT = \"Высота индикаторов\"\nL_GUI_COOLDOWN_RAID_WIDTH = \"Ширина индикаторов\"\nL_GUI_COOLDOWN_RAID_SORT = \"Сделать сортировку вверх\"\nL_GUI_COOLDOWN_RAID_EXPIRATION = \"Сортировка по времени\"\nL_GUI_COOLDOWN_RAID_SHOW_SELF = \"Отображать свои перезарядки\"\nL_GUI_COOLDOWN_RAID_ICONS = \"Отображать иконки рейдовых перезарядок\"\nL_GUI_COOLDOWN_RAID_IN_RAID = \"Отображать в рейде\"\nL_GUI_COOLDOWN_RAID_IN_PARTY = \"Отображать в группе\"\nL_GUI_COOLDOWN_RAID_IN_ARENA = \"Отображать на арене\"\n\n-- Enemy cooldowns options\nL_GUI_COOLDOWN_ENEMY = \"Перезарядки врагов\"\nL_GUI_COOLDOWN_ENEMY_SUBTEXT = \"Отслеживание способностей врагов в виде иконок над вашей полосой чтения заклинаний.\"\nL_GUI_COOLDOWN_ENEMY_ENABLE = \"Включить вражеские перезарядки\"\nL_GUI_COOLDOWN_ENEMY_SIZE = \"Размер иконок\"\nL_GUI_COOLDOWN_ENEMY_DIRECTION = \"Направление иконок\"\nL_GUI_COOLDOWN_ENEMY_EVERYWHERE = \"Отображать везде\"\nL_GUI_COOLDOWN_ENEMY_IN_BG = \"Отображать на полях боя\"\nL_GUI_COOLDOWN_ENEMY_IN_ARENA = \"Отображать на арене\"\nL.enemycooldown_show_inparty = \"Отображать в группе для союзников\"\nL.enemycooldown_class_color = \"Окрашивать края в цвет класса\"\n\n-- Pulse cooldowns options\nL_GUI_COOLDOWN_PULSE = \"Свои перезарядки\"\nL_GUI_COOLDOWN_PULSE_SUBTEXT = \"Отслеживание ваших перезарядок с помощью всплывающей иконки в центре экрана.\"\nL_GUI_COOLDOWN_PULSE_ENABLE = \"Отображать иконку окончания перезарядки\"\nL_GUI_COOLDOWN_PULSE_SIZE = \"Размер иконки окончания перезарядки\"\nL_GUI_COOLDOWN_PULSE_SOUND = \"Включить звуковое предупреждение\"\nL_GUI_COOLDOWN_PULSE_ANIM_SCALE = \"Масштаб анимации\"\nL_GUI_COOLDOWN_PULSE_HOLD_TIME = \"Время до исчезновения\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD = \"Порог времени\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = \"Минимальный порог времени\"\n\n-- Threat options\nL_GUI_THREAT = \"Список угрозы\"\nL_GUI_THREAT_SUBTEXT = \"Отображение списка угрозы в виде полос (простой аналог Omen).\"\nL_GUI_THREAT_ENABLE = \"Включить список угрозы\"\nL_GUI_THREAT_HEIGHT = \"Высота полос\"\nL_GUI_THREAT_WIDTH = \"Ширина полос\"\nL_GUI_THREAT_ROWS = \"Количество полос\"\nL_GUI_THREAT_HIDE_SOLO = \"Отображать только в группе/рейде\"\n\n-- Top panel options\nL_GUI_TOP_PANEL = \"Верхняя панель\"\nL_GUI_TOP_PANEL_SUBTEXT = \"Управление встроенной верхней панелью с информацией.\"\nL_GUI_TOP_PANEL_ENABLE = \"Включить верхнюю панель\"\nL_GUI_TOP_PANEL_MOUSE = \"Панель по наведению курсора\"\nL_GUI_TOP_PANEL_HEIGHT = \"Высота панели\"\nL_GUI_TOP_PANEL_WIDTH = \"Ширина панели\"\n\n-- Stats options\nL_GUI_STATS = \"Статистика\"\nL_GUI_STATS_SUBTEXT = \"Блоки статистики, которые расположены внизу экрана. Набрать в чате '/ls' для полезной информации\"\nL_GUI_STATS_CLOCK = \"Часы\"\nL_GUI_STATS_LATENCY = \"Задержка\"\nL_GUI_STATS_FPS = \"Кадры в секунду\"\nL_GUI_STATS_EXPERIENCE = \"Опыт\"\nL_GUI_STATS_TALENTS_DESC = \"Дата-текст позволяет менять спек и лут по клику\"\nL_GUI_STATS_COORDS = \"Координаты\"\nL_GUI_STATS_LOCATION = \"Зона\"\nL_GUI_STATS_BG = \"Поле боя\"\nL.stats_bottom_line = \"Цветная полоса снизу\"\nL_GUI_STATS_SUBHEADER_CURRENCY = \"Валюта (отображается в дата-тексте золота)\"\nL_GUI_STATS_CURRENCY_ARCHAEOLOGY = \"Фрагменты археологии\"\nL_GUI_STATS_CURRENCY_COOKING = \"Кулинарные награды\"\nL_GUI_STATS_CURRENCY_RAID = \"Рейдовые печати\"\n\n-- Trade options\nL_GUI_TRADE = \"Торговля\"\nL_GUI_TRADE_SUBTEXT = \"Настройки связанные с профессиями и торговлей\"\nL.trade_profession_tabs = \"Вкладки профессий\"\nL.trade_profession_tabs_desc = \"Вкладки ваших профессий у окна торговли/профессии\"\nL.trade_already_known = \"Изученные предметы\"\nL.trade_already_known_desc = \"Помечать цветом известные рецепты/спутников/игрушки\"\nL.trade_disenchanting = \"Быстрое распыление\"\nL.trade_disenchanting_desc = \"Распылять, просеивать и т.д. предметы, нажимая Alt + кнопка мыши\"\nL.trade_sum_buyouts = \"Отображать сумму ваших аукционов\"\nL.trade_sum_buyouts_desc = \"Во вкладе лоты аукциона будет выводиться сумма ваших аукционов\"\nL.trade_enchantment_scroll = \"Свиток наложения чар в окне профессии\"\nL.trade_archaeology = \"Панель археологии\"\nL.trade_archaeology_desc = \"Отслеживание раскопок артефактов (для показа нажмите скрытую кнопку справа от миникарты или введите '/arch')\"\nL.trade_merchant_itemlevel = \"Уровень предметов у торговца\"\nL.trade_merchant_itemlevel_desc = \"Отображать уровень предметов для оружия и брони в окне торговца\"\n\n-- Miscellaneous options\nL_GUI_MISC_SUBTEXT = \"Прочие настройки, которые добавляют интересные возможности.\"\nL.misc_shift_marking = \"Меню с метками цели\"\nL.misc_shift_marking_desc = \"Shift-клик по врагу вызывает меню с метками (работает только в группе)\"\nL.misc_afk_spin_camera = \"Вращать камеру во время афк\"\nL.misc_quest_auto_button = \"Кнопка квестовых предметов\"\nL.misc_quest_auto_button_desc = \"Кнопка квестовых предметов над миникартой (берется из списка)\"\nL.misc_item_level = \"Уровень предметов\"\nL.misc_item_level_desc = \"Отображать уровень предметов на экранах персонажа и осмотра\"\nL.misc_raid_tools = \"Инструменты рейда\"\nL.misc_raid_tools_desc = \"Кнопка вверху экрана для проверки готовности (ПКМ), проверки ролей (СКМ), установки меток и прочее (для лидера и помощников)\"\nL.misc_click_cast = \"Назначение клавиш мыши\"\nL.misc_click_cast_desc = \"Позволяет назначить на клавиши мыши заклинания (аналог Clique). Настройка через боковую вкладку в книге заклинаний\"\nL.misc_click_cast_filter = \"Игнорировать рамки игрока и цели\"\nL.misc_chars_currency = \"Отслеживать валюту на других персонажах\"\nL.misc_chars_currency_desc = \"Наведите на иконку необходимой валюты в окне персонажа для вывода информации в подсказке\"\nL.misc_hide_raid_button = \"Кнопка для скрытия рейда в раскладке 'Боец'\"\nL.misc_hide_raid_button_desc = \"Кнопка отображается по наведению мыши в верхнем левом углу\""
  },
  {
    "path": "ShestakUI_Config/Locales/Spanish.lua",
    "content": "local _, L = ...\nif GetLocale() ~= \"esES\" and GetLocale() ~= \"esMX\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for esES and esMX client\n--\tTranslation: eXecrate\n----------------------------------------------------------------------------------------\nL_GUI_SET_SAVED_SETTTINGS = \"Cambios aplicables sólo a este PJ\"\nL_GUI_SET_SAVED_SETTTINGS_DESC = \"Switch between a profile that applies to all characters and one that is unique to this character.\" -- Need review\nL_GUI_RESET_CHAR = \"¿Estás seguro de que quieres reiniciar tus preferencias de ShestakUI para este PJ?\"\nL_GUI_RESET_ALL = \"¿Estás seguro de que quieres reiniciar tus preferencias de ShestakUI para todos los PJs?\"\nL_GUI_PER_CHAR = \"¿Estás segudo de que quieres cambiar a o desde 'Cambios sólo a este PJ'?\"\nL_GUI_RESET_CAT = \"Are you sure you want to reset category's settings?\" -- Need review\nL_GUI_RESET_CAT_DESC = \"Reset category's settings. \\nCTRL-click to reset all\" -- Need review\nL_GUI_NEED_RELOAD = \"You need to reload the UI to apply your changes.\" -- Need review\nL_GUI_LAYOUT = \"Change layout\" -- Need review\nL_GUI_SPELL_LIST = \"List of spells\" -- Need review\nL_GUI_SPELL_INPUT = \"Spell ID\" -- Need review\nL_GUI_TIME_INPUT = \"Time\" -- Need review\nL_GUI_EXPERT_MODE = \"Expert mode\" -- Need review\nL_GUI_EXPERT_MODE_DESC = \"Custom editing of Lua profile\" -- Need review\nL_GUI_RESET_SPELLS_DESC = \"CTRL-click to reset list\" -- Need review\n\n-- Profile\nL.profile = \"Profile\" -- Need review\nL.profile_title = \"Profile options\" -- Need review\nL.profile_choose = \"Choose profile\" -- Need review\nL.profile_options = \"Settings\" -- Need review\nL.profile_movers = \"Moving elements\" -- Need review\nL.profile_export = \"Export\" -- Need review\nL.profile_import = \"Import\" -- Need review\nL.profile_error_lib = \"To enable export and import - install WeakAuras\" -- Need review\nL.profile_error_code = \"Error in imported code!\" -- Need review\n\n-- General options\nL_GUI_GENERAL_SUBTEXT = \"These settings control the general user interface settings. Type in chat '/uihelp' for help.\" -- Need review\nL_GUI_GENERAL_WELCOME_MESSAGE = \"Mensaje de bienvenida en el chat\"\nL_GUI_GENERAL_AUTOSCALE = \"Auto escalado de la UI\"\nL_GUI_GENERAL_UISCALE = \"Escalado de la UI (si auto escalado está desactivado)\"\nL.general_subheader_blizzard = \"Blizzard UI elements\" -- Need review\nL.general_error_filter = \"Error filtering\" -- Need review\nL.general_error_blacklist = \"Blacklist\" -- Need review\nL.general_error_whitelist = \"Whitelist\" -- Need review\nL.general_error_combat = \"In combat\" -- Need review\nL.general_error_none = \"None\" -- Need review\nL.general_vehicle_mouseover = \"Marco del Vehículo al pasar el ratón por encima\"\nL.general_move_blizzard = \"Move some Blizzard frames\" -- Needs review\nL.general_color_picker = \"Improved ColorPicker\" -- Needs review\nL.general_color_picker_desc = \"Add copy/paste buttons and digit text entry for Blizzard color picker frame\" -- Need review\nL.general_minimize_mouseover = \"Mouseover for quest minimize button\" -- Need review\nL.general_hide_banner = \"Hide Boss Banner Loot Frame\" -- Need review\nL.general_hide_talking_head = \"Hide Talking Head Frame\" -- Need review\nL.general_hide_maw_buffs = \"Hide Maw Buffs frame in instances\" -- Need review\n\n-- Media options\nL.media_border_color = \"Color for borders\" -- Need review\nL.media_classborder_color = \"Color for class borders\" -- Need review\nL.media_backdrop_color = \"Color for borders backdrop\" -- Need review\nL.media_backdrop_alpha = \"Alpha for transparent backdrop\" -- Need review\nL.media_texture = \"Main texture\" -- Need review\nL.media_subheader_normal = \"Change general font\" -- Need review\nL.media_subheader_pixel = \"Change secondary font\" -- Need review\n\n-- Font options\nL.font = \"Fonts\" -- Need review\nL.font_subtext = \"Customize individual fonts for elements.\" -- Need review\nL.font_stats_font = \"Select font\" -- Need review\nL.font_stats_font_style = \"Font flag\" -- Need review\nL.font_stats_font_shadow = \"Font shadow\" -- Need review\nL.font_subheader_stats = \"Stats font\" -- Need review\nL.font_subheader_combat = \"Combat text font\" -- Need review\nL.font_subheader_chat = \"Chat font\" -- Need review\nL.font_subheader_chat_tabs = \"Chat tabs font\" -- Need review\nL.font_subheader_action = \"Action bars font\" -- Need review\nL.font_subheader_threat = \"Threat meter font\" -- Need review\nL.font_subheader_raidcd = \"Raid cooldowns font\" -- Need review\nL.font_subheader_cooldown = \"Cooldowns timer font\" -- Need review\nL.font_subheader_loot = \"Loot font\" -- Need review\nL.font_subheader_nameplates = \"Nameplates font\" -- Need review\nL.font_subheader_unit = \"Unit frames font\" -- Need review\nL.font_subheader_aura = \"Auras font\" -- Need review\nL.font_subheader_filger = \"Filger font\" -- Need review\nL.font_subheader_style = \"Stylization font\" -- Need review\nL.font_subheader_bag = \"Bags font\" -- Need review\nL.font_subheader_blizzard = \"System font size\" -- Need review\nL.font_tooltip_header_font_size = \"Tooltip header\" -- Need review\nL.font_tooltip_font_size = \"Tooltip text\" -- Need review\nL.font_global_font = \"Disable Pixel font\" -- Need review\n\n-- Skins options\nL_GUI_SKINS = \"Estilización\"\nL_GUI_SKINS_SUBTEXT = \"Change the appearance of the standard interface.\" -- Need review\nL_GUI_SKINS_BLIZZARD = \"Activar estilizado de marcos de Blizzard\"\nL_GUI_SKINS_MINIMAP_BUTTONS = \"Activar estilizado de los iconos de los addons en el minimapa\"\nL_GUI_SKINS_SUBHEADER = \"Stylization of addons\" -- Need review\nL.skins_minimap_buttons_mouseover = \"Addons icons on mouseover\" -- Need review\nL.skins_bubbles = \"Estilizar las burbujas de chat\"\n\n-- Unit Frames options\nL_GUI_UF_SUBTEXT = \"Customize player, target frames and etc.\" -- Need review\nL_GUI_UF_ENABLE = \"Activar marcos de unidades\"\nL_GUI_UF_OWN_COLOR = \"Color para las barras de vida\"\nL_GUI_UF_UF_COLOR = \"Color de las Barras de vida (si color para las barras de vida está activo)\"\nL.unitframe_uf_color_bg = \"Color of health background\" -- Need review\nL.unitframe_enemy_health_color = \"Barra de vida del enemigo objetivo en rojo\"\nL_GUI_UF_TOTAL_VALUE = \"Mostrar vida restante en jugador y objetivo con XXXX/Total\"\nL_GUI_UF_COLOR_VALUE = \"Colorear valor de Vida/Maná\"\nL_GUI_UF_BAR_COLOR_VALUE = \"Color de la barra de vida dependiendo de la vida restante\"\nL_GUI_UF_LINES = \"Show Player and Target lines\" -- Need review\nL_GUI_UF_SUBHEADER_CAST = \"Castbars\" -- Need review\nL_GUI_UF_UNIT_CASTBAR = \"Mostrar barras de lanzamiento\"\nL_GUI_UF_CASTBAR_ICON = \"Mostrar iconos en las barras de lanzamiento\"\nL_GUI_UF_CASTBAR_LATENCY = \"Latencia en la barra de lanzamiento\"\nL_GUI_UF_CASTBAR_TICKS = \"Castbar ticks\" -- Needs review\nL_GUI_UF_SUBHEADER_FRAMES = \"Frames\" -- Need review\nL_GUI_UF_SHOW_PET = \"Mostrar marco de la mascota\"\nL_GUI_UF_SHOW_FOCUS = \"Mostrar marco del foco\"\nL_GUI_UF_SHOW_TOT = \"Mostrar marco del objetivo del objetivo\"\nL_GUI_UF_SHOW_BOSS = \"Mostrar marco del jefe\"\nL_GUI_UF_BOSS_RIGHT = \"Marco/Marcos del/de los jefe/jefes en la derecha\"\nL_GUI_UF_SHOW_ARENA = \"Mostrar marcos de arena\"\nL_GUI_UF_ARENA_RIGHT = \"Marcos de arena en la derecha\"\nL_GUI_UF_BOSS_DEBUFFS = \"Number of debuffs\" -- Need review\nL_GUI_UF_BOSS_DEBUFFS_DESC = \"Number of debuffs on the boss frames\" -- Need review\nL_GUI_UF_BOSS_BUFFS = \"Number of buffs\" -- Need review\nL_GUI_UF_BOSS_BUFFS_DESC = \"Number of buffs on the boss frames\" -- Need review\nL.unitframe_icons_pvp = \"PvP status text\" -- Need review\nL.unitframe_icons_pvp_desc = \"Texto JcJ (iconos no) al pasar el ratón sobre los marcos del jugador y objetivo\"\nL_GUI_UF_ICONS_COMBAT = \"Icono de combate\"\nL_GUI_UF_ICONS_RESTING = \"Icono de descansado para pjs con nivel bajo\"\nL_GUI_UF_SUBHEADER_PORTRAIT = \"Portraits\" -- Need review\nL_GUI_UF_PORTRAIT_ENABLE = \"Activar retratos del jugador/objetivo\"\nL_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = \"Borde de color de clase para los retratos\"\nL.unitframe_portrait_type = \"Type of portraits\" -- Need review\nL.unitframe_portrait_type_icons = \"Class Icons\" -- Need review\nL.unitframe_portrait_type_overlay = \"Overlay\" -- Need review\nL_GUI_UF_PORTRAIT_HEIGHT = \"Altura del retrato\"\nL_GUI_UF_PORTRAIT_WIDTH = \"Anchura del retrato\"\nL_GUI_UF_SUBHEADER_PLUGINS = \"Plugins\" -- Need review\nL_GUI_UF_PLUGINS_GCD = \"Brillo de tiempo de reutilización global\"\nL_GUI_UF_PLUGINS_SWING = \"Activar barra de oscilación\"\nL.unitframe_plugins_reputation_bar = \"Reputation bar\" -- Need review\nL.unitframe_plugins_reputation_bar_desc = \"Activar barra de reputación\" -- Need review\nL.unitframe_plugins_experience_bar = \"Experience bar\" -- Need review\nL.unitframe_plugins_experience_bar_desc = \"Activar barra de experiencia\" -- Need review\nL_GUI_UF_PLUGINS_SMOOTH_BAR = \"Activar barra de suavizado\"\nL_GUI_UF_PLUGINS_ENEMY_SPEC = \"Mostrar configuración de los talentos del enemigo\"\nL_GUI_UF_PLUGINS_COMBAT_FEEDBACK = \"Texto de combate en el marco del jugador/objetivo\"\nL_GUI_UF_PLUGINS_FADER = \"Desvanecer marcos de unidades\"\nL_GUI_UF_PLUGINS_DIMINISHING = \"Diminishing Returns icons on arena frames\" -- Needs review\nL_GUI_UF_PLUGINS_POWER_PREDICTION = \"Power cost prediction bar on player frame\" -- Need review\nL.unitframe_plugins_absorbs = \"Absorbs value on player frame\" -- Need review\nL.unitframe_subheader_player_width = \"Player and target frame size\" -- Need review\nL.unitframe_player_width = \"Width\" -- Need review\nL.unitframe_subheader_boss_width = \"Boss and arena frame size\" -- Need review\nL.unitframe_extra_height_auto = \"Auto height for health/power\" -- Need review\nL.unitframe_extra_height_auto_desc = \"Smart adjust depending on font size\" -- Need review\nL.unitframe_extra_health_height = \"Additional height for health\" -- Need review\nL.unitframe_extra_power_height = \"Additional height for power\" -- Need review\nL.unitframe_subheader_castbar = \"Size of player and target castbar\" -- Need review\nL.unitframe_castbar_height = \"Height\" -- Need review\n\n-- Unit Frames Class bar options\nL_GUI_UF_PLUGINS_CLASS_BAR = \"Unit Frames Class bars\" -- Needs review\nL_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = \"Control of special class resources.\" -- Need review\nL_GUI_UF_PLUGINS_COMBO_BAR = \"Iconos de puntos de combo de Pícaros/Druidas\"\nL_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = \"Always show Combo bar for Druid\" -- Need review\nL_GUI_UF_PLUGINS_COMBO_BAR_OLD = \"Show combo point on the target\" -- Need review\nL_GUI_UF_PLUGINS_ARCANE_BAR = \"Enable Arcane Charge bar\" -- Need review\nL_GUI_UF_PLUGINS_CHI_BAR = \"Enable Chi bar\" -- Needs review\nL_GUI_UF_PLUGINS_STAGGER_BAR = \"Enable Stagger bar (for Monk Tanks)\" -- Need review\nL_GUI_UF_PLUGINS_HOLY_BAR = \"Activar barra de poder sagrado\"\nL_GUI_UF_PLUGINS_SHARD_BAR = \"Activar barra de fragmentos\"\nL_GUI_UF_PLUGINS_RUNE_BAR = \"Activar barra de Runas\"\nL_GUI_UF_PLUGINS_TOTEM_BAR = \"Activar barra de totems\"\nL.unitframe_class_bar_totem_other = \"Enable Totem bar for other classes\" -- Need review\nL.unitframe_class_bar_essence = \"Enable Essence bar for Evoker\" -- Need review\n\n-- Raid Frames options\nL_GUI_UF_RAIDFRAMES_SUBTEXT = \"Customize the appearance of the raid frames.\" -- Need review\nL_GUI_UF_BY_ROLE = \"Sorting players in group by role\" -- Needs review\nL_GUI_UF_AGGRO_BORDER = \"Borde de aggro\"\nL_GUI_UF_DEFICIT_HEALTH = \"Déficit de vida de la banda\"\nL_GUI_UF_SHOW_PARTY = \"Mostrar marcos de grupo en la banda\"\nL_GUI_UF_SHOW_RAID = \"Mostrar marcos de banda\"\nL.raidframe_layout = \"Raid layout\" -- Needs review\nL.raidframe_heal_layout = \"Heal\" -- Needs review\nL.raidframe_dps_layout = \"DPS\" -- Needs review\nL.raidframe_auto_layout = \"Auto\" -- Needs review\nL.raidframe_show_target = \"Show target frames\" -- Needs review\nL.raidframe_show_pet = \"Show pet frames\" -- Needs review\nL.raidframe_vertical_health = \"Orientación vertical de la vida\"\nL.raidframe_vertical_health_desc = \"Only for heal layout\" -- Needs review\nL_GUI_UF_ALPHA_HEALTH = \"Opacidad de las barras de vida cuando están al 100%\"\nL_GUI_UF_SHOW_RANGE = \"Mostrar rango de opacidad para los marcos de banda\"\nL_GUI_UF_RANGE_ALPHA = \"Alpha\" -- Need review\nL_GUI_UF_RANGE_ALPHA_DESC = \"Opacidad de los marcos de unidades cuando están fuera de rango\"\nL_GUI_UF_SUBHEADER_RAIDFRAMES = \"Frames\" -- Need review\nL_GUI_UF_SOLO_MODE = \"Mostrar marco del jugador siempre\"\nL_GUI_UF_PLAYER_PARTY = \"Mostrar marco del jugador en grupo\"\nL_GUI_UF_SHOW_TANK = \"Mostrar tanques de la banda\"\nL_GUI_UF_SHOW_TANK_TT = \"Mostrar el objetivo del objetivo de los tanques de la banda\"\nL_GUI_UF_RAID_GROUP = \"Número de grupos en la banda\"\nL.raidframe_party_vertical = \"Vertical party frames\" -- Needs review\nL.raidframe_raid_groups_vertical = \"Grupos de la banda en vertical\" -- Needs review\nL.raidframe_raid_groups_vertical_desc = \"Only for heal layout\" -- Needs review\nL_GUI_UF_SUBHEADER_ICONS = \"Icons\" -- Need review\nL_GUI_UF_ICONS_ROLE = \"Role icon on frames\" -- Needs review\nL_GUI_UF_ICONS_RAID_MARK = \"Marcas de banda\"\nL_GUI_UF_ICONS_READY_CHECK = \"Iconos de comprobación\"\nL_GUI_UF_ICONS_LEADER = \"Iconos de líder, ayudantes en los marcos\"\nL_GUI_UF_ICONS_SUMON = \"Sumon icons\" -- Need review\nL.raidframe_icons_phase = \"Phase\" -- Need review\nL.raidframe_plugins_debuffhighlight_icon = \"Remarcar textura de desventajas + icono\" -- Need review\nL.raidframe_plugins_aura_watch = \"'BANDA' Ver las auras\"\nL.raidframe_plugins_aura_watch_timer = \"Temporizador en los iconos de perjuicios de la banda\"\nL.raidframe_plugins_pvp_debuffs = \"Show PvP debuff icons (from the list)\" -- Need review\nL_GUI_UF_PLUGINS_HEALCOMM = \"Barra de sanación entrante\"\nL.raidframe_plugins_over_absorb = \"Show over absorb bar on frame\" -- Need review\nL.raidframe_plugins_over_heal_absorb = \"Show over heal absorb on frame\" -- Need review\nL.raidframe_plugins_auto_resurrection = \"Auto cast resurrection\" -- Need review\nL.raidframe_plugins_auto_resurrection_desc = \"Auto lanzar resurreción con click central cuando la unidad este muerta (no funciona cuando Clique está activado)\"\nL.raidframe_hide_health_value = \"Hide raid health value\" -- Needs review\nL.raidframe_auto_position = \"Auto reposition raid frame\" -- Need review\nL.raidframe_auto_position_desc = \"If there are more than 5 groups, the frame points changes. \\nOnly for heal layout\" -- Need review\nL.raidframe_auto_position_dynamic = \"Dynamic\" -- Need review\nL.raidframe_auto_position_static = \"Static\" -- Need review\nL.raidframe_subheader_heal_size = \"Size for heal layout\" -- Need review\nL.raidframe_heal_width = \"Frame width\" -- Need review\nL.raidframe_heal_height = \"Frame height\" -- Need review\nL.raidframe_heal_power_height = \"Power height\" -- Need review\nL.raidframe_subheader_dps_size = \"Size for dps layout\" -- Need review\nL.raidframe_dps_party_width = \"Party width\" -- Need review\nL.raidframe_dps_party_height = \"Party height\" -- Need review\nL.raidframe_dps_raid_width = \"Raid width\" -- Need review\nL.raidframe_dps_raid_height = \"Raid height\" -- Need review\nL.raidframe_dps_party_power_height = \"Party power height\" -- Need review\nL.raidframe_dps_raid_power_height = \"Raid power height\" -- Need review\n\n-- ActionBar options\nL_GUI_ACTIONBAR = \"Action Bars\" -- Need review\nL_GUI_ACTIONBAR_ENABLE = \"Activar barras de acción\"\nL_GUI_ACTIONBAR_HOTKEY = \"Mostrar texto los atajos de teclado\"\nL_GUI_ACTIONBAR_MACRO = \"Mostrar nombre de la macro en los botones\"\nL_GUI_ACTIONBAR_GRID = \"Mostrar botones de la barra de acción vacíos\"\nL_GUI_ACTIONBAR_BUTTON_SIZE = \"Tamaño de los botones\"\nL_GUI_ACTIONBAR_BUTTON_SPACE = \"Espacio entre botones\"\nL_GUI_ACTIONBAR_SPLIT_BARS = \"Dividir la quinta barra en dos de 6 botones cada una\"\nL_GUI_ACTIONBAR_CLASSCOLOR_BORDER = \"Activar borde por color de clase para los botones\"\nL.actionbar_toggle_mode = \"Activar modo cambiar\"\nL.actionbar_toggle_mode_desc = \"The quick change in the number of panels. For the lower panels, hover the mouse over the hidden area above the panels. For right panels, hover the mouse over the area below the panels.\" -- Need review\nL_GUI_ACTIONBAR_HIDE_HIGHLIGHT = \"Hide proc highlight\" -- Needs review\nL_GUI_ACTIONBAR_BOTTOMBARS = \"Número de barras de acción abajo\"\nL_GUI_ACTIONBAR_RIGHTBARS = \"Número de barras de acción en la derecha\"\nL.actionbar_bottombars_mouseover = \"Bottom bars on mouseover\" -- Needs review\nL_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = \"Barras de la derecha se muestran al pasar el ratón\"\nL_GUI_ACTIONBAR_PETBAR_HIDE = \"Ocultar barra de mascota\"\nL_GUI_ACTIONBAR_PETBAR_HORIZONTAL = \"Activar barra de mascota horizontal\"\nL_GUI_ACTIONBAR_PETBAR_MOUSEOVER = \"Barra de mascota al pasar el ratón (sólo para la barra de mascota horizontal)\"\nL_GUI_ACTIONBAR_STANCEBAR_HIDE = \"Ocultar cambio de forma\"\nL_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = \"Activar barra de estancia horizontal\"\nL.actionbar_stancebar_horizontal_desc = \"Located below the player's frame\" -- Needs review\nL_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = \"Barras de Cambios de forma/Estancias al pasar el ratón\" -- Needs review\nL_GUI_ACTIONBAR_MICROMENU = \"Enable micro menu\" -- Needs review\nL_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = \"Micro menu on mouseover\" -- Needs review\nL.actionbar_editor = \"Bars editor\" -- Needs review\nL.actionbar_editor_desc = \"Allow to move and change each panel individually\" -- Needs review\nL.actionbar_bar1_num = \"Number of buttons\" -- Needs review\nL.actionbar_bar1_row = \"Buttons per row\" -- Needs review\nL.actionbar_bar1_mouseover = \"Bar on mouseover\" -- Needs review\n\n-- Tooltip options\nL.tooltip = \"Descripciones\"\nL.tooltip_subtext = \"In this block, you can change the standard tips when mouseovering.\" -- Need review\nL.tooltip_enable = \"Activar descripciones\"\nL.tooltip_shift_modifer = \"Mostrar descripción mientras Shift está pulsado\"\nL.tooltip_cursor = \"Descripción bajo el cursos\"\nL.tooltip_item_icon = \"Icono del objeto en la descripción\"\nL.tooltip_health_value = \"Valor de la vida en números\"\nL.tooltip_hidebuttons = \"Ocultar descripciones de las barras de acción\"\nL.tooltip_hide_combat = \"Ocultar descripción en combate\"\nL.tooltip_subheader = \"Plugins\" -- Need review\nL.tooltip_talents = \"Mostrar descripción de los talentos\"\nL.tooltip_show_shift = \"Show when Shift is pushed\" -- Need review\nL.tooltip_show_shift_desc = \"Show items level and spec when Shift is pushed\" -- Need review\nL.tooltip_achievements = \"Comparar logros en la descripción\"\nL.tooltip_target = \"Jugador objetivo en la descripción\"\nL.tooltip_title = \"Player title in tooltip\" -- Need review\nL.tooltip_realm = \"Player realm name in tooltip\" -- Need review\nL.tooltip_rank = \"Rango del jugador en la hermandad en la descripción\"\nL.tooltip_spell_id = \"ID del hechizo\"\nL.tooltip_average_lvl_desc = \"The average item level\" -- Need review\nL.tooltip_raid_icon = \"Icono de banda\"\nL.tooltip_who_targetting = \"Muestra quien está marcando la unidad que está en tu grupo/banda\"\nL.tooltip_item_count = \"Contador del objeto\"\nL.tooltip_unit_role = \"Unit role\" -- Needs review\nL.tooltip_instance_lock = \"Your instance lock status in tooltip\" -- Needs review\nL.tooltip_mount = \"Source of mount\" -- Needs review\n\n-- Chat options\nL.chat_subtext = \"Here you can change the settings of the chat window.\" -- Need review\nL.chat_enable = \"Activar chat\"\nL.chat_background = \"Activar fondo del chat\"\nL.chat_background_alpha = \"Opacidad del fondo del chat\"\nL.chat_filter = \"Remover ciertos mensajes de spam\"\nL.chat_filter_desc = \"Duels, change talents, NPC dialogue in city\" -- Need review\nL.chat_spam = \"Remover spam del algunos jugadores (Vendedores de oro)\"\nL.chat_spam_list = \"Black list\" -- Need review\nL.chat_spam_list_desc = \"List of words (separated by space, lowercase letters) to hide messages\" -- Need review\nL.chat_width = \"Anchura del chat\"\nL.chat_height = \"Altura del chat\"\nL.chat_chat_bar = \"Pequeña barra de botones para cambiar de canal en el chat\"\nL.chat_chat_bar_mouseover = \"Lite Button Bar on mouseover\" -- Needs review\nL.chat_whisp_sound = \"Sonido cuando te susurran\"\nL.chat_combatlog = \"Mostrar la pestaña del Registro de Combate\"\nL.chat_tabs_mouseover = \"Chat tabs on mouseover\" -- Needs review\nL.chat_sticky = \"Recordar último canal\"\nL.chat_damage_meter_spam = \"Merge damage meter spam in one line-link\" -- Needs review\nL.chat_loot_icons = \"Icons for loot\" -- Needs review\nL.chat_hide_combat = \"Hide chat in combat\" -- Needs review\nL.chat_custom_time_color = \"Enable custom timestamp coloring\" -- Needs review\nL.chat_time_color = \"Color de la marca de tiempo\"\n\n-- Nameplate options\nL_GUI_NAMEPLATE_SUBTEXT = \"Nameplate settings\" -- Need review\nL_GUI_NAMEPLATE_ENABLE = \"Activar placas de nombre\"\nL_GUI_NAMEPLATE_COMBAT = \"Mostrar automáticamente placa de nombre en combate\"\nL_GUI_NAMEPLATE_HEALTH = \"Valor de la vida en números\"\nL_GUI_NAMEPLATE_HEIGHT = \"Altura de la placa de nombre\"\nL_GUI_NAMEPLATE_WIDTH = \"Anchura de la placa de nombre\"\nL.nameplate_alpha = \"Alpha\" -- Needs review\nL.nameplate_alpha_desc = \"Non-target nameplate alpha\" -- Needs review\nL.nameplate_ad_height = \"Additional height\" -- Need review\nL.nameplate_ad_width = \"Additional width\" -- Need review\nL.nameplate_ad_height_desc = \"Additional height for selected nameplate\" -- Needs review\nL.nameplate_ad_width_desc = \"Additional width for selected nameplate\" -- Needs review\nL_GUI_NAMEPLATE_CASTBAR_NAME = \"Mostrar nombre del hechizo en la barra de lanzamiento\"\nL_GUI_NAMEPLATE_CLASS_ICON = \"Iconos de clase en JcJ\"\nL_GUI_NAMEPLATE_NAME_ABBREV = \"Mostrar los nombres abreviados\"\nL.nameplate_short_name = \"Replace names with short ones\" -- Need review\nL.nameplate_clamp = \"Clamp nameplates to the top of the screen when outside of view\" -- Need review\nL.nameplate_clamp_desc = \"Clamp nameplates to the top of the screen when outside of view\" -- Need review\nL_GUI_NAMEPLATE_SHOW_DEBUFFS = \"Mostrar perjuicios (Nombres abreviados debe ser desactivado)\"\nL_GUI_NAMEPLATE_SHOW_BUFFS = \"Show dispellable enemy buffs and buffs from the list\" -- Need review\nL_GUI_NAMEPLATE_DEBUFFS_SIZE = \"Tamaño de los perjuicios\" -- Need review\nL_GUI_NAMEPLATE_HEALER_ICON = \"Show icon above enemy healers nameplate in battlegrounds\" -- Needs review\nL_GUI_NAMEPLATE_TOTEM_ICONS = \"Show icon above enemy totems nameplate\" -- Need review\nL.nameplate_target_glow = \"Show glow texture for target\" -- Need review\nL.nameplate_only_name = \"Show only name for friendly units\" -- Need review\nL.nameplate_quests = \"Show quest icon\" -- Need review\nL.nameplate_cast_color = \"Show color border for casting important spells\" -- Need review\nL.nameplate_kick_color = \"Change cast color if interrupt on cd\" -- Need review\nL.nameplate_low_health_value = \"Health value\" -- Need review\nL.nameplate_low_health = \"Low health highlight\" -- Need review\nL_GUI_NAMEPLATE_THREAT = \"Activar visor de amenaza, cambia automáticamente según tu rol\"\nL_GUI_NAMEPLATE_GOOD_COLOR = \"Color de alta amenaza, varía dependiendo si eres tanque o dps/sanador\"\nL_GUI_NAMEPLATE_NEAR_COLOR = \"Color de perdiendo/ganando amenaza\"\nL_GUI_NAMEPLATE_BAD_COLOR = \"Color de baja amenaza, varía dependiendo si eres tanque o dps/sanador\"\nL_GUI_NAMEPLATE_OFFTANK_COLOR = \"Offtank threat color\" -- Need review\nL.nameplate_extra_color = \"Explosive and Spiteful affix color\" -- Need review\nL.nameplate_mob_color_enable = \"Change color for important mobs in dungeons\" -- Need review\nL.nameplate_mob_color = \"Color for mobs\" -- Need review\n\n-- Combat text options\nL_GUI_COMBATTEXT = \"Texto de Combate\"\nL_GUI_COMBATTEXT_SUBTEXT = \"For moving type in the chat '/xct'\" -- Need review\nL_GUI_COMBATTEXT_ENABLE = \"Activar Texto de Combate\"\nL.combattext_blizz_head_numbers = \"Enable Blizzard combat text\" -- Need review\nL.combattext_blizz_head_numbers_desc = \"Usar la salida de daño/curación de Blizzard (sobre la cabeza del monstruo/jugador)\"\nL.combattext_damage_style = \"Change default combat font\" -- Need review\nL.combattext_damage_style_desc = \"Cambiar la fuente de daño/sanación por defecto de encima de los monstruos/jugadores (tendrás que reiniciar WoW para ver los cambios)\"\nL_GUI_COMBATTEXT_DAMAGE = \"Mostrar daño saliente en su propio marco\"\nL_GUI_COMBATTEXT_HEALING = \"Mostrar sanación saliente en su propio marco\"\nL.combattext_incoming = \"Show incoming damage and healing\" -- Need review\nL_GUI_COMBATTEXT_HOTS = \"Mostrar efectos de cura periódicos en el marco de curas\"\nL_GUI_COMBATTEXT_OVERHEALING = \"Mostrar la sobrecuracion saliente\"\nL_GUI_COMBATTEXT_PET_DAMAGE = \"Mostrar el daño de tu mascota\"\nL_GUI_COMBATTEXT_DOT_DAMAGE = \"Mostrar el daño de tus dots (Daño periodico)\"\nL_GUI_COMBATTEXT_DAMAGE_COLOR = \"Mostrar números de daño dependiendo de la escuela de magia\"\nL_GUI_COMBATTEXT_CRIT_PREFIX = \"Símbolo que se añadirá antes de un crítico\"\nL_GUI_COMBATTEXT_CRIT_POSTFIX = \"Símbolo que se añadirá después de un crítico\"\nL_GUI_COMBATTEXT_ICONS = \"Mostrar iconos de daño saliente\"\nL_GUI_COMBATTEXT_ICON_SIZE = \"Icon size\" -- Need review\nL_GUI_COMBATTEXT_ICON_SIZE_DESC = \"Tamaño de los iconos de los hechizos en el marco de daño saliente, también tiene efecto sobre el tamaño de la fuente de daño\"\nL_GUI_COMBATTEXT_TRESHOLD = \"Daño mínimo que se mostrar en el marco de daño\"\nL_GUI_COMBATTEXT_HEAL_TRESHOLD = \"Sanación mínima que se mostrar en los mensajes de sanación entrante/saliente\"\nL_GUI_COMBATTEXT_SCROLLABLE = \"Permitir usar la rueda del ratón para desplazar las líneas de los marcos\"\nL_GUI_COMBATTEXT_MAX_LINES = \"Max lines\" -- Need review\nL_GUI_COMBATTEXT_MAX_LINES_DESC = \"Máx de líneas para mantener desplazables (a más lineas, más memoria requerida)\"\nL_GUI_COMBATTEXT_TIME_VISIBLE = \"Time\" -- Need review\nL_GUI_COMBATTEXT_TIME_VISIBLE_DESC = \"Tiempo (segundos) en que un mensaje es visible\"\nL_GUI_COMBATTEXT_DK_RUNES = \"Mostrar recarga de runas de los Caballeros de la Muerte\"\nL_GUI_COMBATTEXT_KILLINGBLOW = \"Mostrar tus golpes de gracia\"\nL.combattext_merge_aoe_spam = \"Merges spell spam into single message\" -- Needs review\nL.combattext_merge_aoe_spam_desc = \"Unir el spam de daño de area en un solo mensaje\"\nL_GUI_COMBATTEXT_MERGE_MELEE = \"Merges multiple auto attack damage spam\" -- Needs review\nL.combattext_merge_all = \"Merges all spells\" -- Needs review\nL_GUI_COMBATTEXT_DISPEL = \"Mostrar tus disipaciones\"\nL_GUI_COMBATTEXT_INTERRUPT = \"Mostrar tus interrupciones\"\nL_GUI_COMBATTEXT_DIRECTION = \"Change scrolling direction from bottom to top\" -- Need review\nL_GUI_COMBATTEXT_SHORT_NUMBERS = \"Use short numbers ('25.3k' instead of '25342')\" -- Need review\n\n-- Auras/Buffs/Debuffs\nL_GUI_AURA_PLAYER_BUFF_SIZE = \"Buffs size\" -- Need review\nL_GUI_AURA_PLAYER_BUFF_SIZE_DESC = \"Tamaño de las beneficios del jugador\"\nL.aura_debuff_size = \"Debuffs size\" -- Need review\nL_GUI_AURA_SHOW_SPIRAL = \"Espiral en los iconos de las auras\"\nL_GUI_AURA_SHOW_TIMER = \"Mostrar tiempo de reutilización en los iconos de las auras\"\nL_GUI_AURA_PLAYER_AURAS = \"Auras en el marco del jugador\"\nL_GUI_AURA_TARGET_AURAS = \"Auras en el marco del objetivo\"\nL_GUI_AURA_FOCUS_DEBUFFS = \"Perjuicios en el marco del foco\"\nL_GUI_AURA_FOT_DEBUFFS = \"Perjuicios en el marco del objetivo del foco\"\nL_GUI_AURA_PET_DEBUFFS = \"Perjuicios en el marco de la mascota\"\nL_GUI_AURA_TOT_DEBUFFS = \"Perjuicios en el marco del objetivo del objetivo\"\nL.aura_subheader_boss = \"Beneficios en el marco del jefe\" -- Need review\nL_GUI_AURA_PLAYER_AURA_ONLY = \"Solo tus perjuicios en el marco del objetivo\"\nL_GUI_AURA_DEBUFF_COLOR_TYPE = \"Color de los perjuicios por tipo\"\nL_GUI_AURA_CAST_BY = \"Mostrar quién lanza un beneficio/perjuicio en su descripción\"\nL_GUI_AURA_CLASSCOLOR_BORDER = \"Activar borde por color de clase para los beneficios del jugador\"\nL.aura_subheader_buffs = \"Player buffs\" -- Need review\nL.aura_subheader_debuffs = \"Debuffs\" -- Need review\n\n-- Bag options\nL_GUI_BAGS = \"Bolsas\"\nL_GUI_BAGS_SUBTEXT = \"Right click on the close button to open the menu. To move the bags, hold down Shift - click.\" -- Need review\nL_GUI_BAGS_ENABLE = \"Activar bolsas\"\nL_GUI_BAGS_ILVL = \"Show item level for weapons and armor\" -- Need review\nL.bag_new_items = \"Show animation for new items\" -- Need review\nL.bag_filter = \"Always show filter buttons\" -- Need review\nL_GUI_BAGS_BUTTON_SIZE = \"Tamaño de los huecos\"\nL_GUI_BAGS_BUTTON_SPACE = \"Espacio entre huecos\"\nL_GUI_BAGS_BANK = \"Número de columnas en el banco\"\nL_GUI_BAGS_BAG = \"Número de columnas en la bolsa principal\"\n\n-- Minimap options\nL_GUI_MINIMAP_SUBTEXT = \"Minimap settings.\" -- Need review\nL_GUI_MINIMAP_ENABLE = \"Activar minimapa\"\nL.minimap_on_top = \"Move minimap on top right corner\" -- Need review\nL_GUI_MINIMAP_ICON = \"Icono de seguimiento\"\nL_GUI_GARRISON_ICON = \"Covenant icon\" -- Need review\nL_GUI_MINIMAP_SIZE = \"Tamaño del minimapa\"\nL_GUI_MINIMAP_HIDE_COMBAT = \"Ocultar minimapa en combate\"\nL_GUI_MINIMAP_TOGGLE_MENU = \"Show toggle menu\" -- Needs review\nL.minimap_bg_map_stylization = \"Estilizado del mapa de CB\"\nL.minimap_fog_of_war = \"Remove fog of war on World Map\" -- Needs review\n\n-- Loot options\nL_GUI_LOOT_SUBTEXT = \"Settings for loot frame.\" -- Need review\nL_GUI_LOOT_ENABLE = \"Activar el marco de botín\"\nL_GUI_LOOT_ROLL_ENABLE = \"Activar el marco de botín de grupo\"\nL_GUI_LOOT_ICON_SIZE = \"Tamaño de los iconos\"\nL_GUI_LOOT_WIDTH = \"Anchura del marco de botín\"\nL_GUI_LOOT_AUTOGREED = \"Activar auto-codicia para objetos verdes cuando eres nivel máx\"\nL_GUI_LOOT_AUTODE = \"Auto confirmar desencantar\"\nL.loot_faster_loot = \"Faster looting\" -- Need review\nL.loot_faster_loot_desc = \"Works only if enabled auto loot\" -- Need review\n\n-- Filger\nL_GUI_FILGER = \"Timers (Filger)\" -- Need review\nL_GUI_FILGER_SUBTEXT = \"Filger - analogue WeakAuras, but more simple and easy. Allows you to display in the form of icons and bars your auras and timers.\" -- Need review\nL_GUI_FILGER_ENABLE = \"Enable Filger\" -- Need review\nL_GUI_FILGER_TEST_MODE = \"Test icon mode\" -- Need review\nL_GUI_FILGER_MAX_TEST_ICON = \"The number of icons to the test\" -- Need review\nL_GUI_FILGER_SHOW_TOOLTIP = \"Show tooltip\" -- Need review\nL.filger_subheader_elements = \"Showing elements\" -- Need review\nL.filger_show_buff = \"Player buffs\" -- Need review\nL.filger_show_proc = \"Player procs\" -- Need review\nL.filger_show_debuff = \"Debuffs on target\" -- Need review\nL.filger_show_aura_bar = \"Aura bars on target\" -- Need review\nL.filger_show_special = \"Special buffs on player\" -- Need review\nL.filger_show_pvp_player = \"SPvP debuffs on player\" -- Need review\nL.filger_show_pvp_target = \"PvP auras on target\" -- Need review\nL.filger_show_cd = \"Cooldowns\" -- Need review\nL.filger_subheader_size = \"Icons size\" -- Need review\nL.filger_subheader_test = \"Test mode\" -- Need review\nL_GUI_FILGER_EXPIRATION = \"Sort cooldowns by expiration time\" -- Need review\nL_GUI_FILGER_BUFFS_SIZE = \"Buffs size\" -- Need review\nL_GUI_FILGER_COOLDOWN_SIZE = \"Cooldowns size\" -- Need review\nL_GUI_FILGER_PVP_SIZE = \"PvP debuffs size\" -- Need review\nL.filger_buffs_space = \"Buffs space\" -- Need review\nL.filger_pvp_space = \"PvP auras space\" -- Need review\nL.filger_cooldown_space = \"Cooldowns space\" -- Need review\nL.filger_subheader_spells = \"Adding new spells\" -- Need review\nL.filger_category_list = \"Spell list category\" -- Need review\n\n-- Announcements options\nL_GUI_ANNOUNCEMENTS = \"Anuncios\"\nL_GUI_ANNOUNCEMENTS_SUBTEXT = \"Settings that add chat announcements about spells or items.\" -- Need review\nL.announcements_drinking = \"Anunciar en el chat cuando un enemigo en la arena beba\"\nL.announcements_interrupts = \"Interrupts\" -- Need review\nL.announcements_interrupts_desc = \"Anunciar en el grupo/banda cuando interrumpes\"\nL.announcements_spells = \"Cast spells\" -- Needs review\nL.announcements_spells_desc = \"Anunciar en grupo/banda cuando lanzas el mismo hechizo que otro\"\nL.announcements_spells_from_all = \"From all members\" -- Needs review\nL.announcements_spells_from_all_desc = \"Comprueba los lanzamientos de hechizo de todos los miembros\"\nL.announcements_toys = \"Cast some annoying toys\" -- Needs review\nL.announcements_pull_countdown = \"Pull countdown\" -- Needs review\nL.announcements_pull_countdown_desc = \"Pull countdown announce (/pc #)\" -- Needs review\nL.announcements_flask_food = \"Usage of flasks and food\" -- Needs review\nL.announcements_flask_food_desc = \"Announce the usage of flasks and food (/ffcheck)\" -- Needs review\nL.announcements_flask_food_raid = \"Announce to raid channel\" -- Needs review\nL.announcements_flask_food_auto = \"Auto check when ReadyCheck\" -- Needs review\nL.announcements_feasts = \"Feasts/Souls/Repair Bots\" -- Needs review\nL.announcements_portals = \"Portals/Ritual of Summoning\" -- Needs review\nL.announcements_subheader_self = \"Self announce\" -- Needs review\nL.announcements_bad_gear = \"Check your bad gear\" -- Need review\nL.announcements_bad_gear_desc = \"Check your bad gear in instance (fishing pole, from the list)\" -- Needs review\nL.announcements_safari_hat = \"Safari Hat\" -- Needs review\nL.announcements_safari_hat_desc = \"Check Safari Hat when starting Pet Battle\" -- Needs review\n\n-- Automation options\nL_GUI_AUTOMATION = \"Automation\" -- Needs review\nL_GUI_AUTOMATION_SUBTEXT = \"This block contains settings that facilitate the routine.\" -- Need review\nL.automation_release = \"Auto resurrección en los Campos de Batalla\" -- Need review\nL.automation_screenshot = \"Tomar una captura de pantalla cuando consigas un logro\"\nL.automation_solve_artifact = \"Auto popup for solve artifact\" -- Needs review\nL.automation_solve_artifact_desc = \"If there are enough fragments for an artifact, a popup will appear to solve it.\" -- Need review\nL.automation_accept_invite = \"Auto aceptar invitaciones\"\nL.automation_decline_duel = \"Auto rechazar duelos\"\nL.automation_accept_quest = \"Auto aceptar misiones\"\nL.automation_auto_collapse = \"Auto collapse Objective Tracker\" -- Need review\nL.automation_auto_collapse_raid = \"In Instance\" -- Need review\nL.automation_auto_collapse_reload = \"After reload\" -- Need review\nL.automation_auto_collapse_scenario = \"Partially\" -- Need review\nL.automation_skip_cinematic = \"Auto skip cinematics/movies (disabled if hold Ctrl)\" -- Needs review\nL.automation_auto_role = \"Auto set your role\" -- Needs review\nL.automation_cancel_bad_buffs = \"Auto cancel annoying holiday buffs (from the list)\" -- Needs review\nL.automation_tab_binder = \"Auto change 'Tab' key binding in PvP\" -- Needs review\nL.automation_tab_binder_desc = \"'Tab' key target only enemy players when in PvP zones, ignores pets and mobs\" -- Need review\nL.automation_logging_combat = \"Auto enables combat log text file in raid instances\" -- Needs review\nL.automation_buff_on_scroll = \"Cast buff on mouse scroll (from the list)\" -- Needs review\nL.automation_buff_on_scroll_desc = \"If the buff from the list is not applied to the player, it will cast by the mouse scroll\" -- Need review\nL.automation_open_items = \"Auto opening of items in bag\" -- Needs review\nL.automation_resurrection = \"Confirm resurrection\" -- Needs review\nL.automation_summon = \"Confirm summon\" -- Needs review\nL.automation_whisper_invite = \"Auto invite when whisper keyword\" -- Needs review\nL.automation_invite_keyword = \"List of keyword (separated by space)\" -- Needs review\nL.automation_invite_keyword_desc = \"When player whisper you keyword he will be invited in your group\" -- Needs review\n\n-- Buffs reminder options\nL_GUI_REMINDER = \"Recordatorio de Ventajas\"\nL_GUI_REMINDER_SUBTEXT = \"Display of missed auras.\" -- Need review\nL_GUI_REMINDER_SOLO_ENABLE = \"Mostrar ventajas propias que faltan\"\nL_GUI_REMINDER_SOLO_SOUND = \"Alerta sonora para avisar de ventajas propias\"\nL_GUI_REMINDER_SOLO_SIZE = \"Icon size\" -- Need review\nL_GUI_REMINDER_SOLO_SIZE_DESC = \"Tamaño de los iconos de las ventajas propias\"\nL_GUI_REMINDER_SUBHEADER = \"Raid buffs\" -- Need review\nL_GUI_REMINDER_RAID_ENABLE = \"Mostrar ventajas que faltan en la Banda\"\nL_GUI_REMINDER_RAID_ALWAYS = \"Mostrar Recordatorio de Ventajas siempre\"\nL_GUI_REMINDER_RAID_SIZE = \"Icon size\" -- Need review\nL_GUI_REMINDER_RAID_SIZE_DESC = \"Tamaño de los iconos de las ventajas de la Banda\"\nL_GUI_REMINDER_RAID_ALPHA = \"Transparent\" -- Need review\nL_GUI_REMINDER_RAID_ALPHA_DESC = \"Icono transparente cuando la ventaja está presente\"\n\n-- Raid cooldowns options\nL_GUI_COOLDOWN_RAID = \"Tiempos de reutilización de la Banda\"\nL_GUI_COOLDOWN_RAID_SUBTEXT = \"Tracking raid abilities in the upper left corner.\" -- Need review\nL_GUI_COOLDOWN_RAID_ENABLE = \"Mostrar tiempos de reutilización de la Banda\"\nL_GUI_COOLDOWN_RAID_HEIGHT = \"Bars height\" -- Need review\nL_GUI_COOLDOWN_RAID_WIDTH = \"Bars width\" -- Need review\nL_GUI_COOLDOWN_RAID_SORT = \"Barras de tiempos de reutilización de la Banda ordenadas hacia arriba\"\nL_GUI_COOLDOWN_RAID_EXPIRATION = \"Sort by expiration time\" -- Needs review\nL_GUI_COOLDOWN_RAID_SHOW_SELF = \"Show self cooldowns\" -- Needs review\nL_GUI_COOLDOWN_RAID_ICONS = \"Iconos de tiempos de reutilización de la Banda\"\nL_GUI_COOLDOWN_RAID_IN_RAID = \"Mostrar tiempos de reutilización de la Banda en zona de Banda\"\nL_GUI_COOLDOWN_RAID_IN_PARTY = \"Mostrar tiempos de reutilización de la Banda en zona de Grupo\"\nL_GUI_COOLDOWN_RAID_IN_ARENA = \"Mostrar tiempos de reutilización de la Banda en zona de Arena\"\n\n-- Enemy cooldowns options\nL_GUI_COOLDOWN_ENEMY = \"Tiempos de reutilización del enemigo\"\nL_GUI_COOLDOWN_ENEMY_SUBTEXT = \"Tracking enemy abilities as icons above your spell casting bar.\" -- Need review\nL_GUI_COOLDOWN_ENEMY_ENABLE = \"Activar tiempos de reutilización del enemigo\"\nL_GUI_COOLDOWN_ENEMY_SIZE = \"Tamaño del icono de tiempos de reutilización del enemigo\"\nL_GUI_COOLDOWN_ENEMY_DIRECTION = \"Icono de dirección de tiempos de reutilización del enemigo\"\nL_GUI_COOLDOWN_ENEMY_EVERYWHERE = \"Mostrar tiempos de reutilización del enemigo siempre\"\nL_GUI_COOLDOWN_ENEMY_IN_BG = \"Mostrar tiempos de reutilización del enemigo en zona de CB\"\nL_GUI_COOLDOWN_ENEMY_IN_ARENA = \"Mostrar tiempos de reutilización del enemigo en zona de Arena\"\nL.enemycooldown_show_inparty = \"Show in party zone for allies\" -- Need review\nL.enemycooldown_class_color = \"Enable classcolor border\" -- Need review\n\n-- Pulse cooldowns options\nL_GUI_COOLDOWN_PULSE = \"Cuenta atrás de tiempos de reutilización\"\nL_GUI_COOLDOWN_PULSE_SUBTEXT = \"Track your cd using a pulse icon in the center of the screen.\" -- Need review\nL_GUI_COOLDOWN_PULSE_ENABLE = \"Mostrar cuentas atrás de tiempos de reutilización\"\nL_GUI_COOLDOWN_PULSE_SIZE = \"Tamaño de los icono de las cuentas atras de tiempos de reutilización\"\nL_GUI_COOLDOWN_PULSE_SOUND = \"Aviso sonoro\"\nL_GUI_COOLDOWN_PULSE_ANIM_SCALE = \"Escalado animado\"\nL_GUI_COOLDOWN_PULSE_HOLD_TIME = \"Opacidad máxima del tiempo de espera\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD = \"Threshold time\" -- Need review\nL_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = \"Umbral de tiempo mínimo\"\n\n-- Threat options\nL_GUI_THREAT = \"Barras de Amenaza\"\nL_GUI_THREAT_SUBTEXT = \"Display of the threat list (a simple analogue of Omen).\" -- Need review\nL_GUI_THREAT_ENABLE = \"Activar Barras de Amenaza\"\nL_GUI_THREAT_HEIGHT = \"Altura de las barras de amenaza\"\nL_GUI_THREAT_WIDTH = \"Anchura de las barras de amenaza\"\nL_GUI_THREAT_ROWS = \"Número de barras de amenaza\"\nL_GUI_THREAT_HIDE_SOLO = \"Mostrar solo en grupo/raid\"\n\n-- Top panel options\nL_GUI_TOP_PANEL = \"Panel superior\"\nL_GUI_TOP_PANEL_SUBTEXT = \"Manage built-in top panel with information.\" -- Need review\nL_GUI_TOP_PANEL_ENABLE = \"Activar panel superior\"\nL_GUI_TOP_PANEL_MOUSE = \"Panel superior al pasar el ratón\"\nL_GUI_TOP_PANEL_WIDTH = \"Anchura del panel\"\nL_GUI_TOP_PANEL_HEIGHT = \"Altura del panel\"\n\n-- Stats options\nL_GUI_STATS = \"Estadísticas\"\nL_GUI_STATS_SUBTEXT = \"Statistics blocks located at the bottom of the screen. Type in the chat '/ls' for info.\" -- Need review\nL_GUI_STATS_CLOCK = \"Reloj\"\nL_GUI_STATS_LATENCY = \"Latencia\"\nL_GUI_STATS_FPS = \"FPS (Marcos por segundo)\"\nL_GUI_STATS_EXPERIENCE = \"Experiencia\"\nL_GUI_STATS_TALENTS_DESC = \"Date-text allows you to change the spec and loot on click\" -- Need review\nL_GUI_STATS_COORDS = \"Coordenadas\"\nL_GUI_STATS_LOCATION = \"Localización\"\nL_GUI_STATS_BG = \"Campo de Batalla\"\nL.stats_bottom_line = \"Bottom classcolor line\" -- Need review\nL_GUI_STATS_SUBHEADER_CURRENCY = \"Currency (displayed in gold data text)\" -- Need review\nL_GUI_STATS_CURRENCY_ARCHAEOLOGY = \"Show Archaeology Fragments\" -- Needs review\nL_GUI_STATS_CURRENCY_COOKING = \"Show Cooking Awards\" -- Needs review\nL_GUI_STATS_CURRENCY_RAID = \"Show Raid Seals\" -- Needs review\n\n-- Trade options\nL_GUI_TRADE = \"Trade\" -- Need review\nL_GUI_TRADE_SUBTEXT = \"Settings related to professions and trade\" -- Need review\nL.trade_profession_tabs = \"Professions tabs\" -- Need review\nL.trade_profession_tabs_desc = \"Pestanas de profesiones de artesania y marcos de comercio\"\nL.trade_already_known = \"Colorizes already known items\" -- Need review\nL.trade_already_known_desc = \"Colorizes recipes/mounts/pets/toys that is already known\" -- Needs review\nL.trade_disenchanting = \"Quick Disenchanting\" -- Need review\nL.trade_disenchanting_desc = \"Milling, Prospecting and Disenchanting by Alt + click\" -- Needs review\nL.trade_sum_buyouts = \"Sum up all current auctions\" -- Needs review\nL.trade_sum_buyouts_desc = \"At auctions tab shows sum up all current auctions\" -- Need review\nL.trade_enchantment_scroll = \"Enchantment scroll on TradeSkill frame\" -- Needs review\nL.trade_archaeology = \"Archaeology tracker\" -- Needs review\nL.trade_archaeology_desc = \"Archaeology tracker ('/arch' or right mouseover minimap button to show)\" -- Need review\nL.trade_merchant_itemlevel = \"Item level in merchant\" -- Need review\nL.trade_merchant_itemlevel_desc = \"Show item level for weapons and armor in merchant\" -- Need review\n\n-- Miscellaneous options\nL_GUI_MISC_SUBTEXT = \"Other settings that add interesting features.\" -- Need review\nL.misc_shift_marking = \"Marks mouseover target\" -- Need review\nL.misc_shift_marking_desc = \"Marks mouseover target when you push Shift (only in group)\" -- Need review\nL.misc_afk_spin_camera = \"Rotar cámara mientras estás ausente\"\nL.misc_quest_auto_button = \"Quest items auto button\" -- Need review\nL.misc_quest_auto_button_desc = \"Auto botón misión/objeto\" -- Need review\nL.misc_raid_tools = \"Herramientas de Raid\"\nL.misc_raid_tools_desc = \"Button at the top of the screen for ready check (Left-click), checking roles (Middle-click), setting marks, etc. (for leader and assistants)\" -- Need review\nL.misc_item_level = \"Item level on slot buttons\" -- Need review\nL.misc_item_level_desc = \"Item level on character slot buttons\" -- Needs review\nL.misc_click_cast = \"Simple click2cast spell binder\" -- Needs review\nL.misc_click_cast_desc = \"Allows you to assign spells (analog Clique) to the mouse buttons. Setup through the side bookmark in the spell book\" -- Need review\nL.misc_click_cast_filter = \"Ignore Player and Target frames for click2cast\" -- Needs review\nL.misc_chars_currency = \"Tracks your currency tokens across multiple characters\" -- Needs review\nL.misc_chars_currency_desc = \"Hover over the icon of the required currency in the character window to display information in the tooltip\" -- Need review\nL.misc_hide_raid_button = \"Button to hide raid frames in dps layout\" -- Need review\nL.misc_hide_raid_button_desc = \"The button is displayed by hovering the mouse in the upper left corner\" -- Need review"
  },
  {
    "path": "ShestakUI_Config/Locales/Taiwan.lua",
    "content": "local _, L = ...\nif GetLocale() ~= \"zhTW\" then return end\n\n----------------------------------------------------------------------------------------\n--\tLocalization for zhTW client\n--\tTranslation: Leg883, Mania, Tat2dawn, Tibles, Sakaras, Joe\n----------------------------------------------------------------------------------------\nL_GUI_SET_SAVED_SETTTINGS = \"角色專用設定\"\nL_GUI_SET_SAVED_SETTTINGS_DESC = \"在 一般設定 與 角色專用設定 之間切換。\"\nL_GUI_RESET_CHAR = \"確定要重置你所有角色的 ShestakUI 設定?\"\nL_GUI_RESET_ALL = \"確定要重置全部 ShestakUI 到預設值?\"\nL_GUI_PER_CHAR = \"確定要設定/取消 角色專用設定 模式?\"\nL_GUI_RESET_CAT = \"確定要重置當前分類到預設值?\"\nL_GUI_RESET_CAT_DESC = \"左鍵重置當前分類到預設值。\\nCTRL+左鍵重置全部到預設值。\"\nL_GUI_NEED_RELOAD = \"請點擊套用以重載當前改動。\"\nL_GUI_LAYOUT = \"佈局切換\"\nL_GUI_SPELL_LIST = \"法術列表\"\nL_GUI_SPELL_INPUT = \"法術ID\"\nL_GUI_TIME_INPUT = \"時間\"\nL_GUI_EXPERT_MODE = \"專家模式\"\nL_GUI_EXPERT_MODE_DESC = \"編寫你的插件代碼\"\nL_GUI_RESET_SPELLS_DESC = \"Ctrl+左鍵重置列表\"\n\n-- Profile\nL.profile = \"Profile\" -- Need review\nL.profile_title = \"Profile options\" -- Need review\nL.profile_choose = \"Choose profile\" -- Need review\nL.profile_options = \"Settings\" -- Need review\nL.profile_movers = \"Moving elements\" -- Need review\nL.profile_export = \"Export\" -- Need review\nL.profile_import = \"Import\" -- Need review\nL.profile_error_lib = \"To enable export and import - install WeakAuras\" -- Need review\nL.profile_error_code = \"Error in imported code!\" -- Need review\n\n-- General options\nL_GUI_GENERAL_SUBTEXT = \"一般用戶界面設置，鍵入 /uihelp 獲取更多可用命令。\"\nL_GUI_GENERAL_WELCOME_MESSAGE = \"歡迎信息\"\nL_GUI_GENERAL_AUTOSCALE = \"自動UI縮放\"\nL_GUI_GENERAL_UISCALE = \"自定義UI縮放\"\nL.general_subheader_blizzard = \"暴雪插件\"\nL.general_error_filter = \"紅字錯誤過濾\"\nL.general_error_blacklist = \"黑名單\"\nL.general_error_whitelist = \"白名單\"\nL.general_error_combat = \"戰鬥中\"\nL.general_error_none = \"不過濾\"\nL.general_vehicle_mouseover = \"駕駛框架解鎖\"\nL.general_move_blizzard = \"移動暴雪界面框架\"\nL.general_color_picker = \"改進型顏色選擇器\"\nL.general_color_picker_desc = \"增加按鈕：複製/貼上/職業 輸入框：RGB/色值/透明度\"\nL.general_minimize_mouseover = \"任務欄最小化按鈕滑鼠懸停顯示\"\nL.general_hide_banner = \"自動隱藏Boss額外拾取提示\"\nL.general_hide_talking_head = \"自動隱藏任務對話框\"\nL.general_hide_maw_buffs = \"隱藏靈魄能力框架\"\n\n-- Media options\nL.media_border_color = \"背景顏色\"\nL.media_classborder_color = \"邊框按職業著色\"\nL.media_backdrop_color = \"邊框背景顏色\"\nL.media_backdrop_alpha = \"透明背景\"\nL.media_texture = \"主要材質\"\nL.media_subheader_normal = \"通用字體\"\nL.media_subheader_pixel = \"像素字體\"\n\n-- Font options\nL.font = \"字體設置\"\nL.font_subtext = \"自定義字體格式\"\nL.font_stats_font = \"字體\"\nL.font_stats_font_style = \"描邊\"\nL.font_stats_font_shadow = \"陰影\"\nL.font_subheader_stats = \"信息條\"\nL.font_subheader_combat = \"戰鬥資訊(xCT)\"\nL.font_subheader_chat = \"聊天信息\"\nL.font_subheader_chat_tabs = \"聊天頻道標籤\"\nL.font_subheader_action = \"快捷列\"\nL.font_subheader_threat = \"仇恨條\"\nL.font_subheader_raidcd = \"團隊冷卻\"\nL.font_subheader_cooldown = \"冷卻時間\"\nL.font_subheader_loot = \"拾取框\"\nL.font_subheader_nameplates = \"單位名條\"\nL.font_subheader_unit = \"單位框架\"\nL.font_subheader_aura = \"增益減益\"\nL.font_subheader_filger = \"法術監視(Filger)\"\nL.font_subheader_style = \"界面美化\"\nL.font_subheader_bag = \"背包\"\nL.font_subheader_blizzard = \"系統\"\nL.font_tooltip_header_font_size = \"滑鼠提示標題\"\nL.font_tooltip_font_size = \"滑鼠提示信息\"\nL.font_global_font = \"禁用像素字體\"\n\n-- Skins options\nL_GUI_SKINS = \"界面美化\"\nL_GUI_SKINS_SUBTEXT = \"對遊戲默認界面和單體插件界面進行美化\"\nL_GUI_SKINS_BLIZZARD = \"美化暴雪默認界面\"\nL_GUI_SKINS_MINIMAP_BUTTONS = \"小地圖插件圖標\"\nL_GUI_SKINS_SUBHEADER = \"單體插件\"\nL.skins_minimap_buttons_mouseover = \"滑鼠懸停顯示\"\nL.skins_bubbles = \"美化聊天泡泡\"\n\n-- Unit Frames options\nL_GUI_UF_SUBTEXT = \"定制玩家/目標框架/其他框架\"\nL_GUI_UF_ENABLE = \"單位框架增強\"\nL_GUI_UF_OWN_COLOR = \"自定義顏色\"\nL_GUI_UF_UF_COLOR = \"生命條顏色\"\nL.unitframe_uf_color_bg = \"背景顏色\"\nL.unitframe_enemy_health_color = \"敵對目標生命條以紅色著色\"\nL_GUI_UF_TOTAL_VALUE = \"玩家/目標框架顯示詳細的文字變化\"\nL_GUI_UF_COLOR_VALUE = \"生命值/魔法值按職業著色\"\nL_GUI_UF_BAR_COLOR_VALUE = \"生命值按剩餘血量著色\"\nL_GUI_UF_LINES = \"玩家/目標框架顯示劃線\"\nL_GUI_UF_SUBHEADER_CAST = \"施法條\"\nL_GUI_UF_UNIT_CASTBAR = \"施法條增強\"\nL_GUI_UF_CASTBAR_ICON = \"法術圖標\"\nL_GUI_UF_CASTBAR_LATENCY = \"施法延遲\"\nL_GUI_UF_CASTBAR_TICKS = \"施法跳數\"\nL_GUI_UF_SUBHEADER_FRAMES = \"其他框架\"\nL_GUI_UF_SHOW_PET = \"寵物框架\"\nL_GUI_UF_SHOW_FOCUS = \"焦點框架\"\nL_GUI_UF_SHOW_TOT = \"目標的目標框架\"\nL_GUI_UF_SHOW_BOSS = \"Boss框架\"\nL_GUI_UF_BOSS_RIGHT = \"右側顯示Boss框架\"\nL_GUI_UF_SHOW_ARENA = \"競技場框架\"\nL_GUI_UF_ARENA_RIGHT = \"右側顯示競技場框架\"\nL_GUI_UF_BOSS_DEBUFFS = \"DeBuff數量\"\nL_GUI_UF_BOSS_DEBUFFS_DESC = \"Boss框架DeBuff數量\"\nL_GUI_UF_BOSS_BUFFS = \"Buff數量\"\nL_GUI_UF_BOSS_BUFFS_DESC = \"Boss框架Buff數量\"\nL.unitframe_icons_pvp = \"PvP狀態\"\nL.unitframe_icons_pvp_desc = \"PvP狀態(滑鼠懸停顯示)\"\nL_GUI_UF_ICONS_COMBAT = \"戰鬥標記\"\nL_GUI_UF_ICONS_RESTING = \"休息標記\"\nL_GUI_UF_SUBHEADER_PORTRAIT = \"3D頭像\"\nL_GUI_UF_PORTRAIT_ENABLE = \"玩家/目標頭像\"\nL_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = \"頭像邊框按職業著色\"\nL.unitframe_portrait_type = \"頭像類型\"\nL.unitframe_portrait_type_icons = \"職業圖標\"\nL.unitframe_portrait_type_overlay = \"生命條顯示\"\nL_GUI_UF_PORTRAIT_HEIGHT = \"頭像高度\"\nL_GUI_UF_PORTRAIT_WIDTH = \"頭像寬度\"\nL_GUI_UF_SUBHEADER_PLUGINS = \"輔助功能\"\nL_GUI_UF_PLUGINS_GCD = \"公共CD計時條\"\nL_GUI_UF_PLUGINS_SWING = \"普通攻擊計時條\"\nL.unitframe_plugins_reputation_bar = \"聲望條\"\nL.unitframe_plugins_reputation_bar_desc = \"在玩家框架左側滑鼠懸停顯示，中鍵鎖定顯示。\"\nL.unitframe_plugins_experience_bar = \"經驗條\"\nL.unitframe_plugins_experience_bar_desc = \"在玩家框架左側滑鼠懸停顯示，中鍵鎖定顯示。\"\nL_GUI_UF_PLUGINS_SMOOTH_BAR = \"平滑條\"\nL_GUI_UF_PLUGINS_ENEMY_SPEC = \"敵對玩家天賦\"\nL_GUI_UF_PLUGINS_COMBAT_FEEDBACK = \"玩家/目標框架顯示戰鬥文字\"\nL_GUI_UF_PLUGINS_FADER = \"自動隱藏玩家框架\"\nL_GUI_UF_PLUGINS_DIMINISHING = \"競技場框架顯示技能遞減\"\nL_GUI_UF_PLUGINS_POWER_PREDICTION = \"即將獲得的資源\"\nL.unitframe_plugins_absorbs = \"吸收量\"\nL.unitframe_subheader_player_width = \"玩家/目標框架大小\"\nL.unitframe_player_width = \"寬度\"\nL.unitframe_subheader_boss_width = \"Boss框架與競技場框架大小\"\nL.unitframe_extra_height_auto = \"血量/能量框架自動增高\"\nL.unitframe_extra_height_auto_desc = \"按字體大小智能調節框架高度\"\nL.unitframe_extra_health_height = \"血量框架額外增高\"\nL.unitframe_extra_power_height = \"能量框架額外增高\"\nL.unitframe_subheader_castbar = \"玩家/目標施法條大小\"\nL.unitframe_castbar_height = \"高度\"\n\n-- Unit Frames Class bar options\nL_GUI_UF_PLUGINS_CLASS_BAR = \"職業資源欄\"\nL_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = \"顯示職業的特殊資源\"\nL_GUI_UF_PLUGINS_COMBO_BAR = \"連擊點\"\nL_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = \"總是顯示德魯伊連擊點\"\nL_GUI_UF_PLUGINS_COMBO_BAR_OLD = \"目標框架顯示連擊點\"\nL_GUI_UF_PLUGINS_ARCANE_BAR = \"秘法充能\"\nL_GUI_UF_PLUGINS_CHI_BAR = \"真氣\"\nL_GUI_UF_PLUGINS_STAGGER_BAR = \"醉拳池(酒仙武僧)\"\nL_GUI_UF_PLUGINS_HOLY_BAR = \"聖光能量\"\nL_GUI_UF_PLUGINS_SHARD_BAR = \"靈魂碎片\"\nL_GUI_UF_PLUGINS_RUNE_BAR = \"符文\"\nL_GUI_UF_PLUGINS_TOTEM_BAR = \"圖騰\"\nL.unitframe_class_bar_totem_other = \"其他職業圖騰\"\nL.unitframe_class_bar_essence = \"Enable Essence bar for Evoker\" -- Need review\n\n-- Raid Frames options\nL_GUI_UF_RAIDFRAMES_SUBTEXT = \"定制隊伍/團隊框架\"\nL_GUI_UF_BY_ROLE = \"按職責排序\"\nL_GUI_UF_AGGRO_BORDER = \"邊框按仇恨值著色\"\nL_GUI_UF_DEFICIT_HEALTH = \"團隊生命值虧減模式\"\nL_GUI_UF_SHOW_PARTY = \"隊伍框架\"\nL_GUI_UF_SHOW_RAID = \"團隊框架\"\nL.raidframe_layout = \"團隊佈局\"\nL.raidframe_heal_layout = \"治療\"\nL.raidframe_dps_layout = \"輸出\"\nL.raidframe_auto_layout = \"自動\"\nL.raidframe_show_target = \"目標框架\"\nL.raidframe_show_pet = \"寵物框架\"\nL.raidframe_vertical_health = \"垂直顯示團隊框架生命值\"\nL.raidframe_vertical_health_desc = \"僅限治療佈局中生效\"\nL_GUI_UF_ALPHA_HEALTH = \"滿血時淡化單位框架\"\nL_GUI_UF_SHOW_RANGE = \"單位框架按距離變化設定透明度\"\nL_GUI_UF_RANGE_ALPHA = \"透明度\"\nL_GUI_UF_RANGE_ALPHA_DESC = \"單位框架超出距離的透明度\"\nL_GUI_UF_SUBHEADER_RAIDFRAMES = \"其他框架\"\nL_GUI_UF_SOLO_MODE = \"總是顯示玩家框架\"\nL_GUI_UF_PLAYER_PARTY = \"隊伍中顯示玩家框架\"\nL_GUI_UF_SHOW_TANK = \"團隊主坦克框架\"\nL_GUI_UF_SHOW_TANK_TT = \"坦克目標的目標\"\nL_GUI_UF_RAID_GROUP = \"小隊數目\"\nL.raidframe_party_vertical  = \"竪向排列隊伍\"\nL.raidframe_raid_groups_vertical = \"竪向排列團隊隊伍\"\nL.raidframe_raid_groups_vertical_desc = \"僅限治療佈局中生效\"\nL_GUI_UF_SUBHEADER_ICONS = \"標記\"\nL_GUI_UF_ICONS_ROLE = \"角色類型標記\"\nL_GUI_UF_ICONS_RAID_MARK = \"團隊標記\"\nL_GUI_UF_ICONS_READY_CHECK = \"就緒確認標記\"\nL_GUI_UF_ICONS_LEADER = \"隊長/助手標記\"\nL_GUI_UF_ICONS_SUMON = \"召喚標記\"\nL.raidframe_icons_phase = \"相位標記\"\nL.raidframe_plugins_debuffhighlight_icon = \"高亮DeBuff圖標\"\nL.raidframe_plugins_aura_watch = \"團隊法術監視\"\nL.raidframe_plugins_aura_watch_timer = \"團隊減益時間\"\nL.raidframe_plugins_pvp_debuffs = \"PvP DeBuff圖標\"\nL_GUI_UF_PLUGINS_HEALCOMM = \"即將受到的治療\"\nL.raidframe_plugins_over_absorb = \"顯示吸收條\"\nL.raidframe_plugins_over_heal_absorb = \"顯示過量治療吸收條\"\nL.raidframe_plugins_auto_resurrection = \"中鍵施放復活技能\"\nL.raidframe_plugins_auto_resurrection_desc = \"滑鼠中鍵點擊已死亡角色時施放復活技能(Clique啟用時無效)\"\nL.raidframe_hide_health_value = \"隱藏血量\"\nL.raidframe_auto_position = \"玩家/目標框架自動定位\"\nL.raidframe_auto_position_desc = \"動態: 當小隊數目大於5，框架位置按小隊數目調整\\n僅限治療佈局非竪向排列時生效\"\nL.raidframe_auto_position_dynamic = \"動態\"\nL.raidframe_auto_position_static = \"靜態\"\nL.raidframe_subheader_heal_size = \"治療佈局框架大小\"\nL.raidframe_heal_width = \"框架寬度\"\nL.raidframe_heal_height = \"框架高度\"\nL.raidframe_heal_power_height = \"能量框架高度\"\nL.raidframe_subheader_dps_size = \"輸出佈局框架大小\"\nL.raidframe_dps_party_width = \"隊伍框架寬度\"\nL.raidframe_dps_party_height = \"隊伍框架高度\"\nL.raidframe_dps_raid_width = \"框架寬度\"\nL.raidframe_dps_raid_height = \"框架高度\"\nL.raidframe_dps_party_power_height = \"隊伍能量框架高度\"\nL.raidframe_dps_raid_power_height = \"能量框架高度\"\n\n-- ActionBar options\nL_GUI_ACTIONBAR = \"快捷列\"\nL_GUI_ACTIONBAR_ENABLE = \"快捷列增強\"\nL_GUI_ACTIONBAR_HOTKEY = \"按鍵鍵名\"\nL_GUI_ACTIONBAR_MACRO = \"巨集名稱\"\nL_GUI_ACTIONBAR_GRID = \"快捷列顯示空白快捷鍵\"\nL_GUI_ACTIONBAR_BUTTON_SIZE = \"快捷鍵大小\"\nL_GUI_ACTIONBAR_BUTTON_SPACE = \"快捷鍵間隔\"\nL_GUI_ACTIONBAR_SPLIT_BARS = \"#5快捷列分段(2*6; 該選項開啟後將激活所有快捷列)\"\nL_GUI_ACTIONBAR_CLASSCOLOR_BORDER = \"快捷列邊框按職業著色\"\nL.actionbar_toggle_mode = \"自由折疊\"\nL.actionbar_toggle_mode_desc = \"可隨時調節快捷列顯示數目。按鈕位於底部快捷列上方及右側快捷列下方，滑鼠懸停顯示。\"\nL_GUI_ACTIONBAR_HIDE_HIGHLIGHT = \"關閉快捷列技能特效高亮\"\nL_GUI_ACTIONBAR_BOTTOMBARS = \"底部快捷列數目\"\nL_GUI_ACTIONBAR_RIGHTBARS = \"右側快捷列數目\"\nL.actionbar_bottombars_mouseover = \"底部快捷列滑鼠懸停顯示\"\nL_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = \"右側快捷列滑鼠懸停顯示\"\nL_GUI_ACTIONBAR_PETBAR_HIDE = \"隱藏寵物快捷列\"\nL_GUI_ACTIONBAR_PETBAR_HORIZONTAL = \"寵物快捷列橫向排列\"\nL_GUI_ACTIONBAR_PETBAR_MOUSEOVER = \"滑鼠懸停顯示\"\nL_GUI_ACTIONBAR_STANCEBAR_HIDE = \"隱藏變身/姿態快捷列\"\nL_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = \"變身/姿態快捷列橫向排列\"\nL.actionbar_stancebar_horizontal_desc = \"位於玩家框架下方\"\nL_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = \"滑鼠懸停顯示\"\nL_GUI_ACTIONBAR_MICROMENU = \"微型菜單\"\nL_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = \"滑鼠懸停顯示\"\nL.actionbar_editor = \"快捷列佈局\"\nL.actionbar_editor_desc = \"允許快捷列獨立移動和更改\"\nL.actionbar_bar1_num = \"快捷鍵數\"\nL.actionbar_bar1_row = \"每行快捷鍵數\"\nL.actionbar_bar1_mouseover = \"滑鼠懸停顯示\"\n\n-- Tooltip options\nL.tooltip = \"滑鼠提示\"\nL.tooltip_subtext = \"設置滑鼠提示\"\nL.tooltip_enable = \"滑鼠提示增強\"\nL.tooltip_shift_modifer = \"按下Shift時顯示提示\"\nL.tooltip_cursor = \"提示跟隨滑鼠\"\nL.tooltip_item_icon = \"物品圖標\"\nL.tooltip_health_value = \"生命值以百分比顯示\"\nL.tooltip_hidebuttons = \"隱藏快捷列提示\"\nL.tooltip_hide_combat = \"戰鬥中隱藏提示\"\nL.tooltip_subheader = \"輔助功能\"\nL.tooltip_talents = \"天賦\"\nL.tooltip_show_shift = \"按下Shift時顯示\"\nL.tooltip_show_shift_desc = \"按下Shift時顯示天賦/平均裝等\"\nL.tooltip_achievements = \"成就比較\"\nL.tooltip_target = \"目標的目標\"\nL.tooltip_title = \"頭銜\"\nL.tooltip_realm = \"伺服器\"\nL.tooltip_rank = \"公會階級\"\nL.tooltip_spell_id = \"法術ID\"\nL.tooltip_average_lvl_desc = \"平均裝等\"\nL.tooltip_raid_icon = \"團隊標記\"\nL.tooltip_who_targetting = \"關注成員(在隊伍/團隊中誰以目標為目標)\"\nL.tooltip_item_count = \"物品的簡易統計\"\nL.tooltip_unit_role = \"角色類型\"\nL.tooltip_instance_lock = \"副本進度比較\"\nL.tooltip_mount = \"坐騎來源\"\n\n-- Chat options\nL.chat_subtext = \"這裡可以設置你的聊天框\"\nL.chat_enable = \"聊天框增強\"\nL.chat_background = \"聊天框背景\"\nL.chat_background_alpha = \"聊天框背景透明度\"\nL.chat_filter = \"屏蔽無用系統信息\"\nL.chat_filter_desc = \"決鬥, 切換專精, 城中NPC對話\"\nL.chat_spam = \"屏蔽玩家垃圾信息\"\nL.chat_spam_list = \"過濾詞列表\"\nL.chat_spam_list_desc = \"添加過濾詞(中文詞用空格分隔，英文詞用小寫分隔)\"\nL.chat_width = \"聊天框寬度\"\nL.chat_height = \"聊天框高度\"\nL.chat_chat_bar = \"聊天頻道快捷鍵\"\nL.chat_chat_bar_mouseover = \"滑鼠懸停顯示聊天頻道快捷鍵\"\nL.chat_whisp_sound = \"接受密語時聲音提示\"\nL.chat_combatlog = \"戰鬥記錄標籤\"\nL.chat_tabs_mouseover = \"滑鼠懸停顯示頻道標籤\"\nL.chat_sticky = \"記住上一次使用的頻道\"\nL.chat_damage_meter_spam = \"在鏈接中合併垃圾郵件\"\nL.chat_loot_icons = \"拾取信息帶圖標\"\nL.chat_hide_combat = \"戰鬥中隱藏\"\nL.chat_custom_time_color = \"自定義時間標籤顏色\"\nL.chat_time_color = \"時間標籤顏色\"\n\n-- Nameplate options\nL_GUI_NAMEPLATE_SUBTEXT = \"單位名條設置\"\nL_GUI_NAMEPLATE_ENABLE = \"單位名條增強\"\nL_GUI_NAMEPLATE_COMBAT = \"戰鬥中自動顯示單位名條\"\nL_GUI_NAMEPLATE_HEALTH = \"生命值以百分比顯示\"\nL_GUI_NAMEPLATE_HEIGHT = \"高度\"\nL_GUI_NAMEPLATE_WIDTH = \"寬度\"\nL.nameplate_alpha = \"透明度\"\nL.nameplate_alpha_desc = \"非當前目標的單位名條透明度\"\nL.nameplate_ad_height = \"額外高度\"\nL.nameplate_ad_width = \"額外寬度\"\nL.nameplate_ad_height_desc = \"目標的單位名條額外高度\"\nL.nameplate_ad_width_desc = \"目標的單位名條額外寬度\"\nL_GUI_NAMEPLATE_CASTBAR_NAME = \"法術名稱\"\nL_GUI_NAMEPLATE_CLASS_ICON = \"PvP時顯示職業圖標\"\nL_GUI_NAMEPLATE_NAME_ABBREV = \"名字縮寫\"\nL.nameplate_short_name = \"替換名稱\"\nL.nameplate_clamp = \"貼邊顯示\"\nL.nameplate_clamp_desc = \"當單位名條超出屏幕時仍貼邊顯示\"\nL_GUI_NAMEPLATE_SHOW_DEBUFFS = \"顯示DeBuff(需要關閉名字縮寫)\"\nL_GUI_NAMEPLATE_SHOW_BUFFS = \"顯示可進攻駆散\"\nL_GUI_NAMEPLATE_DEBUFFS_SIZE = \"圖標大小\"\nL_GUI_NAMEPLATE_HEALER_ICON = \"戰場中顯示治療職業圖標\"\nL_GUI_NAMEPLATE_TOTEM_ICONS = \"顯示敵對圖騰圖標\"\nL.nameplate_target_glow = \"目標邊框高亮\"\nL.nameplate_only_name = \"友方玩家只顯示名稱\"\nL.nameplate_quests = \"任務圖標\"\nL.nameplate_cast_color = \"重要法術施法條邊框高亮\"\nL.nameplate_kick_color = \"當斷法技能在冷卻中則施法條變色\"\nL.nameplate_low_health_value = \"斬殺線閾值\"\nL.nameplate_low_health = \"斬殺邊框高亮\"\nL_GUI_NAMEPLATE_THREAT = \"仇恨情況\"\nL_GUI_NAMEPLATE_GOOD_COLOR = \"安全仇恨顏色\"\nL_GUI_NAMEPLATE_NEAR_COLOR = \"臨界仇恨顏色\"\nL_GUI_NAMEPLATE_BAD_COLOR = \"危險仇恨顏色\"\nL_GUI_NAMEPLATE_OFFTANK_COLOR = \"副坦仇恨顏色\"\nL.nameplate_extra_color = \"炸藥/惡意詞綴顏色\"\nL.nameplate_mob_color_enable = \"副本中重要小怪著色\"\nL.nameplate_mob_color = \"小怪顏色\"\n\n-- Combat text options\nL_GUI_COMBATTEXT = \"戰鬥文字\"\nL_GUI_COMBATTEXT_SUBTEXT = \"鍵入 /xct 獲取更多可用命令\"\nL_GUI_COMBATTEXT_ENABLE = \"開啟xCT戰鬥信息\"\nL.combattext_blizz_head_numbers = \"開啟暴雪默認戰鬥信息\"\nL.combattext_blizz_head_numbers_desc = \"暴雪默認傷害/治療模式(需關閉xCT戰鬥信息)\"\nL.combattext_damage_style = \"改變默認的顯示風格\"\nL.combattext_damage_style_desc = \"改變模型頂部/玩家頭像的傷害/治療字體\"\nL_GUI_COMBATTEXT_DAMAGE = \"獨立顯示傷害輸出\"\nL_GUI_COMBATTEXT_HEALING = \"獨立顯示治療輸出\"\nL.combattext_incoming = \"自己的戰鬥文字捲動\"\nL_GUI_COMBATTEXT_HOTS = \"Hot造成的治療\"\nL_GUI_COMBATTEXT_OVERHEALING = \"過量治療輸出\"\nL_GUI_COMBATTEXT_PET_DAMAGE = \"寵物傷害輸出\"\nL_GUI_COMBATTEXT_DOT_DAMAGE = \"Dot造成的傷害\"\nL_GUI_COMBATTEXT_DAMAGE_COLOR = \"傷害文字按法術類型著色\"\nL_GUI_COMBATTEXT_CRIT_PREFIX = \"暴擊時文本左側修飾符號\"\nL_GUI_COMBATTEXT_CRIT_POSTFIX = \"暴擊時文本右側修飾符號\"\nL_GUI_COMBATTEXT_ICONS = \"傷害輸出技能圖標\"\nL_GUI_COMBATTEXT_ICON_SIZE = \"圖標大小\"\nL_GUI_COMBATTEXT_ICON_SIZE_DESC = \"傷害輸出圖標大小\"\nL_GUI_COMBATTEXT_TRESHOLD = \"傷害輸出最小閾值\"\nL_GUI_COMBATTEXT_HEAL_TRESHOLD = \"承受/輸出治療最小閾值\"\nL_GUI_COMBATTEXT_SCROLLABLE = \"允許使用滑鼠滾輪滾動區域\"\nL_GUI_COMBATTEXT_MAX_LINES = \"最大行數\"\nL_GUI_COMBATTEXT_MAX_LINES_DESC = \"滾動區域顯示最大行數\"\nL_GUI_COMBATTEXT_TIME_VISIBLE = \"時間\"\nL_GUI_COMBATTEXT_TIME_VISIBLE_DESC = \"信息保留時間(秒)\"\nL_GUI_COMBATTEXT_DK_RUNES = \"死亡騎士符文恢復\"\nL_GUI_COMBATTEXT_KILLINGBLOW = \"擊殺信息\"\nL.combattext_merge_aoe_spam = \"將AOE傷害合併為一條信息\"\nL.combattext_merge_aoe_spam_desc = \"將AOE傷害合併為一條信息\"\nL_GUI_COMBATTEXT_MERGE_MELEE = \"將多個自動攻擊傷害合併為一條信息\"\nL.combattext_merge_all = \"Merges all spells\" -- Needs review\nL_GUI_COMBATTEXT_DISPEL = \"當你驅散成功時提示\"\nL_GUI_COMBATTEXT_INTERRUPT = \"當你斷法成功時提示\"\nL_GUI_COMBATTEXT_DIRECTION = \"滾動方向從下向上\"\nL_GUI_COMBATTEXT_SHORT_NUMBERS = \"數值以K為單位顯示\"\n\n-- Auras/Buffs/Debuffs\nL_GUI_AURA_PLAYER_BUFF_SIZE = \"Buff大小\"\nL_GUI_AURA_PLAYER_BUFF_SIZE_DESC = \"玩家Buff圖標大小\"\nL.aura_debuff_size = \"DeBuffs大小\"\nL_GUI_AURA_SHOW_SPIRAL = \"漩渦冷卻樣式\"\nL_GUI_AURA_SHOW_TIMER = \"層數堆疊\"\nL_GUI_AURA_PLAYER_AURAS = \"玩家顯示法術效果\"\nL_GUI_AURA_TARGET_AURAS = \"目標顯示法術效果\"\nL_GUI_AURA_FOCUS_DEBUFFS = \"焦點顯示DeBuff\"\nL_GUI_AURA_FOT_DEBUFFS = \"焦點的目標顯示DeBuff\"\nL_GUI_AURA_PET_DEBUFFS = \"寵物顯示DeBuff\"\nL_GUI_AURA_TOT_DEBUFFS = \"目標的目標顯示DeBuff\"\nL.aura_subheader_boss = \"Boss顯示Buff/DeBuff\"\nL_GUI_AURA_PLAYER_AURA_ONLY = \"目標只顯示自身施放的DeBuff\"\nL_GUI_AURA_DEBUFF_COLOR_TYPE = \"DeBuff按法術類型著色\"\nL_GUI_AURA_CAST_BY = \"提示Buff/DeBuff提供者\"\nL_GUI_AURA_CLASSCOLOR_BORDER = \"自身Buff圖標邊框按職業著色\"\nL.aura_subheader_buffs = \"玩家Buff\"\nL.aura_subheader_debuffs = \"DeBuff\"\n\n-- Bag options\nL_GUI_BAGS = \"背包\"\nL_GUI_BAGS_SUBTEXT = \"背包的關閉按鈕另有菜單按右鍵開啓。按住Shift+左鍵可拖動。\"\nL_GUI_BAGS_ENABLE = \"背包增強\"\nL_GUI_BAGS_ILVL = \"顯示物品等級\"\nL.bag_new_items = \"新物品閃動顯示\"\nL.bag_filter = \"Always show filter buttons\" -- Need review\nL_GUI_BAGS_BUTTON_SIZE = \"格子大小\"\nL_GUI_BAGS_BUTTON_SPACE = \"格子間隔\"\nL_GUI_BAGS_BANK = \"銀行每行格數\"\nL_GUI_BAGS_BAG = \"背包每行格數\"\n\n-- Minimap options\nL_GUI_MINIMAP_SUBTEXT = \"小地圖設置\"\nL_GUI_MINIMAP_ENABLE = \"小地圖增強\"\nL.minimap_on_top = \"小地圖定位到右上角\"\nL_GUI_MINIMAP_ICON = \"追蹤菜單\"\nL_GUI_GARRISON_ICON = \"聖所報告圖標\"\nL_GUI_MINIMAP_SIZE = \"小地圖大小\"\nL_GUI_MINIMAP_HIDE_COMBAT = \"戰鬥中隱藏小地圖\"\nL_GUI_MINIMAP_TOGGLE_MENU = \"小地圖頂部快捷菜單\"\nL.minimap_bg_map_stylization = \"戰場地圖增強\"\nL.minimap_fog_of_war = \"地圖全亮\"\n\n-- Loot options\nL_GUI_LOOT_SUBTEXT = \"拾取框架設置\"\nL_GUI_LOOT_ENABLE = \"拾取增強\"\nL_GUI_LOOT_ROLL_ENABLE = \"團隊拾取框架增強\"\nL_GUI_LOOT_ICON_SIZE = \"拾取框架圖標大小\"\nL_GUI_LOOT_WIDTH = \"拾取框架寬度\"\nL_GUI_LOOT_AUTOGREED = \"滿級後自動貪婪綠色物品\"\nL_GUI_LOOT_AUTODE = \"自動選擇分解\"\nL.loot_faster_loot = \"快速拾取\"\nL.loot_faster_loot_desc = \"僅在自動拾取模式中生效\"\n\n-- Filger\nL_GUI_FILGER = \"法術監視\"\nL_GUI_FILGER_SUBTEXT = \"Filger - 類似WeakAuras，更簡單易用，可選擇圖標和計時條形式顯示你的增益減益和計時。\"\nL_GUI_FILGER_ENABLE = \"法術監視\"\nL_GUI_FILGER_TEST_MODE = \"調試模式\"\nL_GUI_FILGER_MAX_TEST_ICON = \"調試模式圖標數量\"\nL_GUI_FILGER_SHOW_TOOLTIP = \"滑鼠指向提示\"\nL.filger_subheader_elements = \"分組顯示\"\nL.filger_show_buff = \"玩家Buff\"\nL.filger_show_proc = \"玩家Procs Buff\"\nL.filger_show_debuff = \"目標DeBuff\"\nL.filger_show_aura_bar = \"目標Buff計時條\"\nL.filger_show_special = \"玩家Special Buff\"\nL.filger_show_pvp_player = \"玩家PvP DeBuff\"\nL.filger_show_pvp_target = \"目標PvP DeBuff\"\nL.filger_show_cd = \"技能冷卻\"\nL.filger_subheader_size = \"圖標大小\"\nL.filger_subheader_test = \"調試模式\"\nL_GUI_FILGER_EXPIRATION = \"按冷卻時間排序\"\nL_GUI_FILGER_BUFFS_SIZE = \"Buff圖標大小\"\nL_GUI_FILGER_COOLDOWN_SIZE = \"技能冷卻圖標大小\"\nL_GUI_FILGER_PVP_SIZE = \"PvP DeBuff圖標大小\"\nL.filger_buffs_space = \"圖標間距\"\nL.filger_pvp_space = \"圖標間距\"\nL.filger_cooldown_space = \"圖標間距\"\nL.filger_subheader_spells = \"添加法術\"\nL.filger_category_list = \"分組\"\n\n-- Announcements options\nL_GUI_ANNOUNCEMENTS = \"通告預警\"\nL_GUI_ANNOUNCEMENTS_SUBTEXT = \"添加特定事件進行通報\"\nL.announcements_drinking = \"當敵人進食時在聊天框進行通告\"\nL.announcements_interrupts = \"斷法\"\nL.announcements_interrupts_desc = \"當你斷法成功時在隊伍/團隊中進行通告\"\nL.announcements_spells = \"施法\"\nL.announcements_spells_desc = \"當你施放指定法術時在隊伍/團隊中進行通告\"\nL.announcements_spells_from_all = \"檢查所有隊員\"\nL.announcements_spells_from_all_desc = \"檢查來源包括所有隊員\"\nL.announcements_toys = \"使用玩具火車/烈酒的遙控器時進行通告\"\nL.announcements_pull_countdown = \"倒計時通告\"\nL.announcements_pull_countdown_desc = \"倒計時通告(/pc #)\"\nL.announcements_flask_food = \"食物和精煉\"\nL.announcements_flask_food_desc = \"通告食物和精煉的使用情況(/ffcheck)\"\nL.announcements_flask_food_raid = \"在團隊頻道通告\"\nL.announcements_flask_food_auto = \"當團隊凖備確認時進行檢查\"\nL.announcements_feasts = \"放置食物/大鍋/靈魂井/修理機器人時進行通告\"\nL.announcements_portals = \"開啟傳送門/召喚儀式時進行通告\"\nL.announcements_subheader_self = \"個人通告\"\nL.announcements_bad_gear = \"檢查裝備\"\nL.announcements_bad_gear_desc = \"進入副本時提醒非副本裝備(魚竿等裝備)\"\nL.announcements_safari_hat = \"狩旅團之帽\"\nL.announcements_safari_hat_desc = \"檢查'狩旅團之帽'使用情況\"\n\n-- Automation options\nL_GUI_AUTOMATION = \"自動設定\"\nL_GUI_AUTOMATION_SUBTEXT = \"一些自動化的設置\"\nL.automation_release = \"戰場中自動釋放靈魂\"\nL.automation_screenshot = \"獲得成就時自動截屏\"\nL.automation_solve_artifact = \"自動辨識考古文物\"\nL.automation_solve_artifact_desc = \"當有足夠碎片時自動彈出辨識窗口並插上符文石\"\nL.automation_accept_invite = \"自動接受好友/公會成員的組隊邀請\"\nL.automation_decline_duel = \"自動取消决鬥\"\nL.automation_accept_quest = \"自動交接任務(按住Shift臨時停用)\"\nL.automation_auto_collapse = \"自動折疊任務追蹤框架\"\nL.automation_auto_collapse_raid = \"副本中\"\nL.automation_auto_collapse_reload = \"重載後\"\nL.automation_auto_collapse_scenario = \"場景戰役\"\nL.automation_skip_cinematic = \"自動跳過過場動畫(按住Ctrl臨時停用)\"\nL.automation_auto_role = \"自動設定角色類型\"\nL.automation_cancel_bad_buffs = \"自動取消非增益性質的Buff\"\nL.automation_tab_binder = \"Tab鍵只選定玩家\"\nL.automation_tab_binder_desc = \"在PvP區域按Tab鍵只選取對敵玩家目標，忽略寵物圖騰等次要目標。\"\nL.automation_logging_combat = \"團隊副本時自動開啟戰鬥記錄\"\nL.automation_buff_on_scroll = \"使用滑鼠滾輪施放Buff\"\nL.automation_buff_on_scroll_desc = \"指定Buff缺失時使用滑鼠滾輪施放\"\nL.automation_open_items = \"自動打開背包中的封裝物品\"\nL.automation_resurrection = \"自動確認復活\"\nL.automation_summon = \"自動確認召喚\"\nL.automation_whisper_invite = \"密語自動邀請\"\nL.automation_invite_keyword = \"添加關鍵詞(需加空隔鍵)\"\nL.automation_invite_keyword_desc = \"通過關鍵詞自動邀請對方進組\"\n\n-- Buffs reminder options\nL_GUI_REMINDER = \"Buff提示\"\nL_GUI_REMINDER_SUBTEXT = \"提示缺失的Buff\"\nL_GUI_REMINDER_SOLO_ENABLE = \"自身Buff缺失時圖標提示\"\nL_GUI_REMINDER_SOLO_SOUND = \"自身Buff缺失時聲音提示\"\nL_GUI_REMINDER_SOLO_SIZE = \"圖標大小\"\nL_GUI_REMINDER_SOLO_SIZE_DESC = \"自身Buff提示圖標大小\"\nL_GUI_REMINDER_SUBHEADER = \"團隊Buff\"\nL_GUI_REMINDER_RAID_ENABLE = \"團隊Buff缺失時圖標提示\"\nL_GUI_REMINDER_RAID_ALWAYS = \"總是顯示Buff提示\"\nL_GUI_REMINDER_RAID_SIZE = \"圖標大小\"\nL_GUI_REMINDER_RAID_SIZE_DESC = \"團隊Buff提示圖標大小\"\nL_GUI_REMINDER_RAID_ALPHA = \"透明度\"\nL_GUI_REMINDER_RAID_ALPHA_DESC = \"當團隊Buff存在時圖標透明度\"\n\n-- Raid cooldowns options\nL_GUI_COOLDOWN_RAID = \"團隊技能冷卻\"\nL_GUI_COOLDOWN_RAID_SUBTEXT = \"顯示在屏幕左上方\"\nL_GUI_COOLDOWN_RAID_ENABLE = \"團隊技能冷卻\"\nL_GUI_COOLDOWN_RAID_HEIGHT = \"計量條高度\"\nL_GUI_COOLDOWN_RAID_WIDTH = \"計量條寬度\"\nL_GUI_COOLDOWN_RAID_SORT = \"團隊技能冷卻向上延伸\"\nL_GUI_COOLDOWN_RAID_EXPIRATION = \"按冷卻時間排序\"\nL_GUI_COOLDOWN_RAID_SHOW_SELF = \"自身團隊技能\"\nL_GUI_COOLDOWN_RAID_ICONS = \"團隊技能冷卻圖標\"\nL_GUI_COOLDOWN_RAID_IN_RAID = \"團隊中顯示團隊技能冷卻\"\nL_GUI_COOLDOWN_RAID_IN_PARTY = \"隊伍中顯示團隊技能冷卻\"\nL_GUI_COOLDOWN_RAID_IN_ARENA = \"競技場中顯示團隊技能冷卻\"\n\n-- Enemy cooldowns options\nL_GUI_COOLDOWN_ENEMY = \"敵對技能冷卻\"\nL_GUI_COOLDOWN_ENEMY_SUBTEXT = \"顯示在你的施法條上方\"\nL_GUI_COOLDOWN_ENEMY_ENABLE = \"敵對技能冷卻\"\nL_GUI_COOLDOWN_ENEMY_SIZE = \"敵對技能冷卻圖標大小\"\nL_GUI_COOLDOWN_ENEMY_DIRECTION = \"敵對技能冷卻圖標方向\"\nL_GUI_COOLDOWN_ENEMY_EVERYWHERE = \"始終顯示敵對技能冷卻\"\nL_GUI_COOLDOWN_ENEMY_IN_BG = \"戰場中顯示敵對技能冷卻\"\nL_GUI_COOLDOWN_ENEMY_IN_ARENA = \"競技場中顯示敵對技能冷卻\"\nL.enemycooldown_show_inparty = \"組隊時顯示敵對技能冷卻\"\nL.enemycooldown_class_color = \"按職業著色\"\n\n-- Pulse cooldowns options\nL_GUI_COOLDOWN_PULSE = \"技能冷卻閃爍\"\nL_GUI_COOLDOWN_PULSE_SUBTEXT = \"顯示在屏幕中央\"\nL_GUI_COOLDOWN_PULSE_ENABLE = \"技能冷卻閃爍提示\"\nL_GUI_COOLDOWN_PULSE_SIZE = \"冷卻閃爍提示大小\"\nL_GUI_COOLDOWN_PULSE_SOUND = \"播放聲音提醒\"\nL_GUI_COOLDOWN_PULSE_ANIM_SCALE = \"動畫縮放\"\nL_GUI_COOLDOWN_PULSE_HOLD_TIME = \"持續時間\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD = \"持續時間最小閾值\"\nL_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = \"持續時間最小閾值\"\n\n-- Threat options\nL_GUI_THREAT = \"仇恨欄\"\nL_GUI_THREAT_SUBTEXT = \"仇恨威脅值統計(類似Omen)\"\nL_GUI_THREAT_ENABLE = \"仇恨欄\"\nL_GUI_THREAT_HEIGHT = \"仇恨欄高度\"\nL_GUI_THREAT_WIDTH = \"仇恨欄寬度\"\nL_GUI_THREAT_ROWS = \"仇恨欄數目\"\nL_GUI_THREAT_HIDE_SOLO = \"僅在隊伍/團隊中開啟\"\n\n-- Top panel options\nL_GUI_TOP_PANEL = \"頂部信息條\"\nL_GUI_TOP_PANEL_SUBTEXT = \"管理頂部信息條\"\nL_GUI_TOP_PANEL_ENABLE = \"頂部信息條\"\nL_GUI_TOP_PANEL_MOUSE = \"滑鼠懸停時顯示頂部信息條\"\nL_GUI_TOP_PANEL_WIDTH = \"信息條寬度\"\nL_GUI_TOP_PANEL_HEIGHT = \"信息條高度\"\n\n-- Stats options\nL_GUI_STATS = \"信息條\"\nL_GUI_STATS_SUBTEXT = \"位于屏幕底部的信息條，鍵入 /ls 獲取更多資訊。\"\nL_GUI_STATS_CLOCK = \"時鐘\"\nL_GUI_STATS_LATENCY = \"延遲\"\nL_GUI_STATS_FPS = \"幀數\"\nL_GUI_STATS_EXPERIENCE = \"經驗\"\nL_GUI_STATS_TALENTS_DESC = \"左鍵專精選單/右鍵拾取專精選單\"\nL_GUI_STATS_COORDS = \"座標\"\nL_GUI_STATS_LOCATION = \"位置\"\nL_GUI_STATS_BG = \"戰場分數\"\nL.stats_bottom_line = \"底部職業著色劃線\"\nL_GUI_STATS_SUBHEADER_CURRENCY = \"兌換通貨(金幣信息中顯示)\"\nL_GUI_STATS_CURRENCY_ARCHAEOLOGY = \"考古學\"\nL_GUI_STATS_CURRENCY_COOKING = \"烹飪\"\nL_GUI_STATS_CURRENCY_RAID = \"副本徽印\"\n\n-- Trade options\nL_GUI_TRADE = \"商業\"\nL_GUI_TRADE_SUBTEXT = \"專業和商業設置\"\nL.trade_profession_tabs = \"專業界面快捷按鈕\"\nL.trade_profession_tabs_desc = \"專業/商業界面顯示快捷按鈕\"\nL.trade_already_known = \"彩色顯示已學會的\"\nL.trade_already_known_desc = \"彩色顯示已學會的食譜/圖紙/坐騎/寵物\"\nL.trade_disenchanting = \"快捷研磨\"\nL.trade_disenchanting_desc = \"Alt+左鍵包裡物品即可快捷研磨/選礦/分解/開鎖\"\nL.trade_sum_buyouts = \"結算拍賣物品的總金額\"\nL.trade_sum_buyouts_desc = \"拍賣界面顯示拍賣物品的總金額\"\nL.trade_enchantment_scroll = \"附魔界面顯示附魔卷軸數量\"\nL.trade_archaeology = \"考古學小助手\"\nL.trade_archaeology_desc = \"顯示考古學各類文物的進度及符文石數量(鍵入 /arch 或點擊小地圖隱藏按鈕打開界面)\"\nL.trade_merchant_itemlevel = \"商人界面顯示物品等級\"\nL.trade_merchant_itemlevel_desc = \"在商人界面顯示武器裝備的物品等級\"\n\n-- Miscellaneous options\nL_GUI_MISC_SUBTEXT = \"一些便捷的功能設置\"\nL.misc_shift_marking = \"滑鼠目標標記\"\nL.misc_shift_marking_desc = \"滑鼠指向目標Shift+左鍵顯示團隊標記菜單(僅限隊伍/團隊)\"\nL.misc_afk_spin_camera = \"AFK時旋轉鏡頭\"\nL.misc_quest_auto_button = \"任務/道具自動按鈕\"\nL.misc_quest_auto_button_desc = \"任務/道具自動按鈕\"\nL.misc_raid_tools = \"團隊工具\"\nL.misc_raid_tools_desc = \"團隊管理便捷功能: 右鍵就位確認，中鍵角色檢查，左鍵展開更多功能(僅限隊長/助手)\"\nL.misc_item_level = \"人物界面顯示物品等級\"\nL.misc_item_level_desc = \"人物界面顯示武器裝備的物品等級\"\nL.misc_click_cast = \"簡單的點擊施法綁定\"\nL.misc_click_cast_desc = \"開啟後法術書有滑鼠綁定界面可以進行設置\"\nL.misc_click_cast_filter = \"忽略玩家/目標框架點擊施法\"\nL.misc_chars_currency = \"追蹤所有角色的兌換通貨\"\nL.misc_chars_currency_desc = \"在兌換通貨界面中追蹤所有角色的兌換通貨\"\nL.misc_hide_raid_button = \"輸出佈局最小化按鈕\"\nL.misc_hide_raid_button_desc = \"按鈕在團隊框架左上方滑鼠懸停顯示\"\n"
  },
  {
    "path": "ShestakUI_Config/Options.lua",
    "content": "local T, C\nlocal _, ns = ...\nlocal L = ns\n\n----------------------------------------------------------------------------------------\n--\tGUI for ShestakUI(by Haleth, Solor)\n----------------------------------------------------------------------------------------\nlocal realm = GetRealmName()\nlocal name = UnitName(\"player\")\n\n-- Main window\nlocal options = CreateFrame(\"Frame\", \"ShestakUIOptionsPanel\", UIParent)\noptions:SetSize(800, 770)\noptions:SetPoint(\"CENTER\")\noptions:SetFrameStrata(\"HIGH\")\noptions:EnableMouse(true)\ntinsert(UISpecialFrames, options:GetName())\n\nlocal CloseButton = CreateFrame(\"Button\", nil, options, \"UIPanelButtonTemplate\")\nCloseButton:SetPoint(\"TOPRIGHT\", options, \"BOTTOMRIGHT\", -10, 30)\nCloseButton:SetSize(100, 23)\nCloseButton:SetText(CLOSE)\nCloseButton:SetScript(\"OnClick\", function()\n\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION)\n\toptions:Hide()\nend)\n\nlocal OkayButton = CreateFrame(\"Button\", \"ShestakUIOptionsPanelOkayButton\", options, \"UIPanelButtonTemplate\")\nOkayButton:SetPoint(\"RIGHT\", CloseButton, \"LEFT\", -4, 0)\nOkayButton:SetSize(100, 23)\nOkayButton:SetText(APPLY)\nOkayButton:SetScript(\"OnClick\", function()\n\tReloadUI()\nend)\nOkayButton:Disable()\n\ntinsert(ns.buttons, CloseButton)\ntinsert(ns.buttons, OkayButton)\n\nlocal reloadText = options:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\nreloadText:SetPoint(\"BOTTOM\", 0, 11)\nreloadText:SetText(\"|cffff2735\"..L_GUI_NEED_RELOAD..\"|r\")\nreloadText:Hide()\noptions.reloadText = reloadText\n\nStaticPopupDialogs.SHESTAKUI_RESET_PERCHAR = {\n\ttext = L_GUI_RESET_CHAR,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function()\n\t\tlocal i = tostring(ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name])\n\t\tShestakUIOptionsPerChar[i] = {}\n\t\tC.options = ShestakUIOptionsPerChar[i]\n\t\tReloadUI()\n\tend,\n\twhileDead = true,\n\thideOnEscape = true,\n\tshowAlert = true,\n}\n\nStaticPopupDialogs.SHESTAKUI_RESET = {\n\ttext = L_GUI_RESET_ALL,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function()\n\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\tShestakUIOptions[i] = {}\n\t\tC.options = ShestakUIOptions[i]\n\t\tReloadUI()\n\tend,\n\twhileDead = true,\n\thideOnEscape = true,\n\tshowAlert = true,\n}\n\nStaticPopupDialogs.SHESTAKUI_RESET_CATEGORY = {\n\ttext = L_GUI_RESET_CAT,\n\tbutton1 = ACCEPT,\n\tbutton2 = CANCEL,\n\tOnAccept = function()\n\t\tif ShestakUIOptionsPanelgeneral2:IsShown() then\n\t\t\tC.options.media = {}\n\t\t\tC.options.media.profile = C.media.profile\n\t\telse\n\t\t\tC.options[C.category] = {}\n\t\tend\n\t\tReloadUI()\n\tend,\n\twhileDead = true,\n\thideOnEscape = true,\n}\n\nlocal ResetButton = CreateFrame(\"Button\", nil, options, \"UIPanelButtonTemplate\")\nResetButton:SetSize(100, 23)\nResetButton:SetText(DEFAULT)\nResetButton.tooltipText = \"|cffFFD100\"..L_GUI_RESET_CAT_DESC..\"|r\"\nResetButton:SetPoint(\"BOTTOMLEFT\", ShestakUIOptionsPanel, \"BOTTOMLEFT\", 10, 7)\nResetButton:SetScript(\"OnClick\", function()\n\tif IsModifiedClick() then\n\t\tif ShestakUIOptionsGlobal[realm][name] == true then\n\t\t\tStaticPopup_Show(\"SHESTAKUI_RESET_PERCHAR\")\n\t\telse\n\t\t\tStaticPopup_Show(\"SHESTAKUI_RESET\")\n\t\tend\n\telse\n\t\tStaticPopup_Show(\"SHESTAKUI_RESET_CATEGORY\")\n\tend\nend)\ntinsert(ns.buttons, ResetButton)\n\n-- Tables\nlocal FontTable\nlocal LSM = LibStub and LibStub:GetLibrary(\"LibSharedMedia-3.0\", true)\nif LSM then\n\tFontTable = LSM:HashTable(\"font\")\nelse\n\tFontTable = {\n\t\t\"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Fonts\\\\Normal.ttf\",\n\t\t\"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Fonts\\\\Pixel.ttf\",\n\t\tSTANDARD_TEXT_FONT\n\t}\nend\n\nlocal FlagsTable = {\n\t\"OUTLINE\",\n\t\"MONOCHROMEOUTLINE\",\n\t\"\"\n}\n\nlocal ErrorTable = {\n\t\"BLACKLIST\",\n\t\"WHITELIST\",\n\t\"COMBAT\",\n\t\"NONE\"\n}\n\nlocal CollapseTable = {\n\t\"RAID\",\n\t\"RELOAD\",\n\t\"SCENARIO\",\n\t\"NONE\"\n}\n\nlocal RaidTable = {\n\t\"HEAL\",\n\t\"DPS\",\n\t\"AUTO\",\n\t\"BLIZZARD\"\n}\n\nlocal PortraitTable = {\n\t\"3D\",\n\t\"2D\",\n\t\"ICONS\",\n\t\"OVERLAY\"\n}\n\nlocal TextureTable\nif LSM then\n\tTextureTable = LSM:HashTable(\"statusbar\")\nelse\n\tTextureTable = {\n\t\t\"Interface\\\\AddOns\\\\ShestakUI\\\\Media\\\\Textures\\\\Texture.tga\"\n\t}\nend\n\nlocal FilgerTable = {\n\tL.filger_show_buff,\n\tL.filger_show_proc,\n\tL.filger_show_debuff,\n\tL.filger_show_aura_bar,\n\tL.filger_show_cd,\n\tIGNORE\n}\n\nlocal FilgerDropDownText = {\n\t[L.filger_show_buff] = \"buff_spells_list\",\n\t[L.filger_show_proc] = \"proc_spells_list\",\n\t[L.filger_show_debuff] = \"debuff_spells_list\",\n\t[L.filger_show_aura_bar] = \"aura_bar_spells_list\",\n\t[L.filger_show_cd] = \"cd_spells_list\",\n\t[IGNORE] = \"ignore_spells_list\",\n}\n\n-- Spell list frame\nlocal SpellList = CreateFrame(\"Frame\", \"SpellList\", ShestakUIOptionsPanel, \"ButtonFrameTemplate\")\nSpellList:SetPoint(\"TOPLEFT\", ShestakUIOptionsPanel, \"TOPRIGHT\", 22, 0)\nSpellList:SetSize(290, 420)\nSpellList:Hide()\n\nSpellListPortrait:SetAlpha(0)\n\nSpellList.title = _G[\"SpellListTitle\"] or SpellList:CreateFontString(\"SpellListTitle\", \"OVERLAY\", \"GameFontNormal\")\nSpellList.title:SetPoint(\"TOP\", _G[\"SpellList\"], \"TOP\", 0, -5)\nSpellList.title:SetText(L_GUI_SPELL_LIST)\n\nlocal ScrollSpells = CreateFrame(\"ScrollFrame\", \"SpellListScrollFrameSpellList\", _G[\"SpellListInset\"], \"UIPanelScrollFrameTemplate\")\nScrollSpells:SetPoint(\"TOPLEFT\", _G[\"SpellListInset\"], \"TOPLEFT\", -10, 19)\nScrollSpells:SetPoint(\"BOTTOMRIGHT\", _G[\"SpellListInset\"], \"BOTTOMRIGHT\", -30, 40)\nScrollSpells.child = CreateFrame(\"Frame\", \"SpellListScrollFrameSpellListChild\", ScrollSpells)\nScrollSpells.child:SetSize(270, 290)\nScrollSpells:SetScrollChild(ScrollSpells.child)\n\nlocal isFilger = false\nlocal doubleInput = false\nSpellList.makeSpellsList = function(_, db, double)\n\tlocal oldb\n\tlocal scroll = SpellListScrollFrameSpellListChild\n\n\tlocal i = 1\n\twhile _G[\"SpellList\"..i..\"_cbs\"] do\n\t\t_G[\"SpellList\"..i..\"_fs\"]:SetText(\"\")\n\t\t_G[\"SpellList\"..i..\"_fs2\"]:SetText(\"\")\n\t\t_G[\"SpellList\"..i..\"_texture\"]:SetTexture(nil)\n\t\t_G[\"SpellList\"..i..\"_cbs\"]:ClearAllPoints()\n\t\t_G[\"SpellList\"..i..\"_cbs\"]:Hide()\n\t\ti = i + 1\n\tend\n\n\tlocal i = 1\n\tfor k, spell in pairs(db) do\n\t\tif spell then\n\t\t\tif not isFilger or isFilger and spell[2] == T.class then\n\t\t\t\tlocal sp = (double or ShestakUIOptionsPanelfilger:IsShown()) and spell[1] or spell\n\t\t\t\tlocal name, _, icon = GetSpellInfo(sp)\n\t\t\t\tlocal bf = _G[\"SpellList\"..i..\"_cbs\"] or CreateFrame(\"Button\", \"SpellList\"..i..\"_cbs\", scroll, \"BackdropTemplate\")\n\n\t\t\t\tif i == 1 then\n\t\t\t\t\tbf:SetPoint(\"TOPLEFT\", scroll, \"TOPLEFT\", 10, -5)\n\t\t\t\t\tbf:SetPoint(\"BOTTOMRIGHT\", scroll, \"TOPRIGHT\", -10, -29)\n\t\t\t\telse\n\t\t\t\t\tbf:SetPoint(\"TOPLEFT\", oldb, \"BOTTOMLEFT\", 0, -2)\n\t\t\t\t\tbf:SetPoint(\"BOTTOMRIGHT\", oldb, \"BOTTOMRIGHT\", 0, -26)\n\t\t\t\tend\n\n\t\t\t\tbf:EnableMouse(true)\n\n\t\t\t\tbf.tex = bf.tex or bf:CreateTexture(\"SpellList\"..i..\"_texture\", \"OVERLAY\")\n\t\t\t\tbf.tex:SetSize(22, 22)\n\t\t\t\tbf.tex:SetPoint(\"LEFT\")\n\t\t\t\tbf.tex:SetTexture(icon)\n\t\t\t\tbf.tex:SetTexCoord(0.1, 0.9, 0.1, 0.9)\n\n\t\t\t\tbf.delete = bf.delete or CreateFrame(\"Button\", \"SpellList\"..i..\"_delete\", bf)\n\t\t\t\tbf.delete:SetSize(16, 16)\n\t\t\t\tbf.delete:SetPoint(\"RIGHT\")\n\t\t\t\tbf.delete:SetNormalTexture(\"Interface\\\\BUTTONS\\\\UI-GroupLoot-Pass-Up\")\n\t\t\t\tbf.delete:GetNormalTexture():SetVertexColor(0.8, 0, 0)\n\t\t\t\tbf.delete:SetPushedTexture(\"Interface\\\\BUTTONS\\\\UI-GroupLoot-Pass-Up\")\n\t\t\t\tbf.delete:SetHighlightTexture(\"Interface\\\\BUTTONS\\\\UI-GroupLoot-Pass-Up\")\n\t\t\t\tbf.delete:SetScript(\"OnClick\", function()\n\t\t\t\t\ttremove(db, k)\n\t\t\t\t\tSpellList:makeSpellsList(db, double)\n\t\t\t\t\tns.setReloadNeeded(true)\n\t\t\t\tend)\n\n\t\t\t\tbf:SetScript(\"OnEnter\", function(self)\n\t\t\t\t\tbf.delete:GetNormalTexture():SetVertexColor(1, 0, 0)\n\t\t\t\t\tself:SetBackdrop({bgFile = \"Interface\\\\Buttons\\\\WHITE8x8\"})\n\t\t\t\t\tself:SetBackdropColor(0.2, 0.2, 0.2, 0.7)\n\t\t\t\t\tGameTooltip:SetOwner(bf, \"ANCHOR_TOP\", 5, 5)\n\t\t\t\t\tGameTooltip:SetHyperlink(format(\"spell:%s\", sp))\n\t\t\t\tend)\n\t\t\t\tbf:SetScript(\"OnLeave\", function(self)\n\t\t\t\t\tbf.delete:GetNormalTexture():SetVertexColor(0.8, 0, 0)\n\t\t\t\t\tself:SetBackdrop(nil)\n\t\t\t\t\tGameTooltip:Hide()\n\t\t\t\tend)\n\n\t\t\t\tbf.fs = bf.fs or bf:CreateFontString(\"SpellList\"..i..\"_fs\", \"OVERLAY\", \"GameFontNormal\")\n\t\t\t\tbf.fs:SetText(name)\n\t\t\t\tbf.fs:SetPoint(\"RIGHT\", bf.delete, \"LEFT\", -4, 0)\n\t\t\t\tbf.fs:SetPoint(\"LEFT\", bf.tex, \"RIGHT\", 5, 0)\n\t\t\t\tbf.fs:SetWordWrap(false)\n\t\t\t\tbf.fs:SetJustifyH(\"RIGHT\")\n\n\t\t\t\tbf.fs2 = bf.fs2 or bf:CreateFontString(\"SpellList\"..i..\"_fs2\", \"OVERLAY\", \"GameFontNormal\")\n\t\t\t\tbf.fs2:SetPoint(\"RIGHT\", bf.delete, \"LEFT\", -4, 0)\n\t\t\t\tbf.fs2:SetWordWrap(false)\n\t\t\t\tbf.fs2:SetJustifyH(\"RIGHT\")\n\n\t\t\t\tif double and spell[2] and tonumber(spell[2]) > 0 then\n\t\t\t\t\tbf.fs2:SetText(format(GARRISON_DURATION_SECONDS, spell[2]))\n\t\t\t\t\tbf.fs:SetPoint(\"RIGHT\", bf.fs2, \"LEFT\", -4, 0)\n\t\t\t\tend\n\n\t\t\t\tbf:Show()\n\t\t\t\toldb = bf\n\t\t\t\ti = i + 1\n\n\t\t\t\t-- Remove outdated spells\n\t\t\t\tif not name then\n\t\t\t\t\ttremove(db, k)\n\t\t\t\t\tSpellList:makeSpellsList(db, double)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\tSpellList:Show()\n\tif double then\n\t\tSpellListTextInput2:Show()\n\telse\n\t\tSpellListTextInput2:Hide()\n\tend\nend\n\nlocal function onEnterPressed(self)\n\tlocal value = tonumber(self:GetText())\n\tAddSpellButton:Disable()\n\tif value and value > 0 then\n\t\tlocal name = GetSpellInfo(value)\n\t\tif name then\n\t\t\tself:SetText(name)\n\t\t\tself:SetCursorPosition(0)\n\t\t\tself:ClearFocus()\n\t\t\tself.value = value\n\t\t\tif not SpellListTextInput2:IsShown() or SpellListTextInput2:GetText() ~= \"\" then\n\t\t\t\tAddSpellButton:Enable()\n\t\t\tend\n\t\telse\n\t\t\tself:SetText(UNKNOWN)\n\t\t\tself.value = value\n\t\tend\n\telse\n\t\tself.value = \"\"\n\tend\nend\n\nlocal InputSpell = CreateFrame(\"EditBox\", SpellList:GetName()..\"TextInput\", SpellList, \"InputBoxTemplate\")\nInputSpell:SetAutoFocus(false)\nInputSpell:SetWidth(150)\nInputSpell:SetHeight(18)\nInputSpell:SetMaxLetters(99)\nInputSpell:SetFontObject(GameFontHighlight)\n\nInputSpell:SetPoint(\"TOPLEFT\", SpellList, \"BOTTOMLEFT\", -2, 37)\n\nInputSpell.value = \"\"\n\nInputSpell:SetScript(\"OnEscapePressed\", function(self) self:ClearFocus() self:SetText(InputSpell.value) end)\nInputSpell:SetScript(\"OnEnterPressed\", onEnterPressed)\nInputSpell:SetScript(\"OnEditFocusGained\", function() InputSpell:SetText(InputSpell.value) end)\nInputSpell:SetScript(\"OnEditFocusLost\", onEnterPressed)\n\nlocal label = InputSpell:CreateFontString(nil, \"OVERLAY\", \"GameFontHighlight\")\nlabel:SetWidth(440)\nlabel:SetHeight(20)\nlabel:SetJustifyH(\"LEFT\")\nlabel:SetPoint(\"BOTTOMLEFT\", InputSpell, \"TOPLEFT\", -2, 2)\nlabel:SetText(L_GUI_SPELL_INPUT)\n\nlocal function onEnterPressed(self)\n\tlocal value = tonumber(self:GetText())\n\tAddSpellButton:Disable()\n\tif value and value > 0 then\n\t\tself:ClearFocus()\n\t\tself.value = value\n\t\tif InputSpell.value ~= \"\" then\n\t\t\tAddSpellButton:Enable()\n\t\tend\n\tend\nend\n\nlocal InputArg = CreateFrame(\"EditBox\", SpellList:GetName()..\"TextInput2\", SpellList, \"InputBoxTemplate\")\nInputArg:SetAutoFocus(false)\nInputArg:SetWidth(40)\nInputArg:SetHeight(18)\nInputArg:SetMaxLetters(4)\nInputArg:SetFontObject(GameFontHighlight)\n\nInputArg:SetPoint(\"LEFT\", InputSpell, \"RIGHT\", 10, 0)\n\nInputArg:SetScript(\"OnEscapePressed\", function(self) self:ClearFocus() self:SetText(InputArg.value) end)\nInputArg:SetScript(\"OnEnterPressed\", onEnterPressed)\nInputArg:SetScript(\"OnEditFocusGained\", function() InputArg.value = InputArg:GetText() end)\nInputArg:SetScript(\"OnEditFocusLost\", onEnterPressed)\n\nlocal label = InputArg:CreateFontString(nil, \"OVERLAY\", \"GameFontHighlight\")\nlabel:SetWidth(440)\nlabel:SetHeight(20)\nlabel:SetJustifyH(\"LEFT\")\nlabel:SetPoint(\"BOTTOMLEFT\", InputArg, \"TOPLEFT\", -2, 2)\nlabel:SetText(L_GUI_TIME_INPUT)\n\nInputArg:Hide()\n\nlocal curOption\nlocal function BuildSpellList(option, double, hiding)\n\tif ProfileList:IsVisible() then ProfileList:Hide() end\n\tif not hiding and SpellList:IsVisible() then SpellList:Hide() return end\n\tcurOption = option\n\tdoubleInput = double\n\tisFilger = hiding\n\tSpellList:makeSpellsList(option, double)\nend\n\nns.HideSpellList = function()\n\tInputSpell:SetText(\"\")\n\tInputSpell.value = \"\"\n\tInputArg:SetText(\"\")\n\tUIDropDownMenu_SetText(ShestakUIOptionsPanelfilgercategory_listDropDown, \"\")\n\tShestakUIOptionsPanelfilgercategory_listDropDown.selectedValue = nil\n\tAddSpellButton:Disable()\n\tSpellList:Hide()\nend\n\nlocal AddSpellButton = CreateFrame(\"Button\", \"AddSpellButton\", SpellList, \"UIPanelButtonTemplate\")\nAddSpellButton:SetPoint(\"TOPRIGHT\", SpellList, \"BOTTOMRIGHT\", -10, 40)\nAddSpellButton:SetSize(100, 23)\nAddSpellButton:SetText(ADD)\nAddSpellButton:SetWidth(AddSpellButton.Text:GetWidth() + 15)\nAddSpellButton:SetScript(\"OnClick\", function()\n\tif doubleInput then\n\t\ttinsert(curOption, {InputSpell.value, InputArg.value})\n\telse\n\t\tif isFilger then\n\t\t\ttinsert(curOption, {InputSpell.value, T.class})\n\t\telse\n\t\t\ttinsert(curOption, InputSpell.value)\n\t\tend\n\tend\n\tInputSpell:SetText(\"\")\n\tInputSpell.value = \"\"\n\tInputArg:SetText(\"\")\n\tAddSpellButton:Disable()\n\tns.setReloadNeeded(true)\n\tSpellList:makeSpellsList(curOption, doubleInput)\nend)\n\nAddSpellButton:SetScript(\"OnEnter\", function()\n\tGameTooltip:SetOwner(AddSpellButton, \"ANCHOR_RIGHT\", 5, 5)\n\tGameTooltip:SetHyperlink(format(\"spell:%s\", InputSpell.value))\nend)\n\nAddSpellButton:SetScript(\"OnLeave\", function()\n\tGameTooltip:Hide()\nend)\n\nAddSpellButton:Disable()\ntinsert(ns.buttons, AddSpellButton)\n\n-- Info frame\ndo\n\tlocal frame = CreateFrame(\"Frame\", \"ShestakUIInfoFrame\", UIParent)\n\tframe:SetWidth(800)\n\tframe:SetHeight(770)\n\tframe:SetPoint(\"CENTER\", UIParent, \"CENTER\", 0, 0)\n\tframe:SetFrameStrata(\"DIALOG\")\n\ttinsert(UISpecialFrames, \"ShestakUIInfoFrame\")\n\tframe:Hide()\n\tframe:EnableMouse(true)\n\n\tlocal title = frame:CreateFontString(nil, \"ARTWORK\", \"GameFontNormalLarge\")\n\ttitle:SetPoint(\"TOPLEFT\", 26, -26)\n\ttitle:SetText(\"Links:\")\n\n\tlocal HelpButton = CreateFrame(\"Button\", nil, frame, \"UIPanelButtonTemplate\")\n\tHelpButton:SetPoint(\"TOPLEFT\", title, \"BOTTOMLEFT\", 0, -20)\n\tHelpButton:SetSize(100, 23)\n\tHelpButton:SetText(\"Wiki page\")\n\tHelpButton:SetWidth(HelpButton.Text:GetWidth() + 15)\n\tlocal url = L_GUI_WIKI_URL\n\tHelpButton:SetScript(\"OnClick\", function()\n\t\tStaticPopup_Show(\"LINK_URL\", _, _, url)\n\tend)\n\n\tlocal DiscordButton = CreateFrame(\"Button\", nil, frame, \"UIPanelButtonTemplate\")\n\tDiscordButton:SetPoint(\"LEFT\", HelpButton, \"RIGHT\", 10, 0)\n\tDiscordButton:SetSize(100, 23)\n\tDiscordButton:SetText(\"Discord\")\n\tDiscordButton:SetWidth(DiscordButton.Text:GetWidth() + 15)\n\tlocal url = \"https://discord.gg/vwHwnTt\"\n\tDiscordButton:SetScript(\"OnClick\", function()\n\t\tStaticPopup_Show(\"LINK_URL\", _, _, url)\n\tend)\n\n\tlocal GithubButton = CreateFrame(\"Button\", nil, frame, \"UIPanelButtonTemplate\")\n\tGithubButton:SetPoint(\"LEFT\", DiscordButton, \"RIGHT\", 10, 0)\n\tGithubButton:SetSize(100, 23)\n\tGithubButton:SetText(\"Github\")\n\tGithubButton:SetWidth(GithubButton.Text:GetWidth() + 15)\n\tlocal url = \"https://github.com/Shestak/ShestakUI\"\n\tGithubButton:SetScript(\"OnClick\", function()\n\t\tStaticPopup_Show(\"LINK_URL\", _, _, url)\n\tend)\n\n\ttinsert(ns.buttons, DiscordButton)\n\ttinsert(ns.buttons, HelpButton)\n\ttinsert(ns.buttons, GithubButton)\n\n\tlocal title2 = frame:CreateFontString(nil, \"ARTWORK\", \"GameFontNormalLarge\")\n\ttitle2:SetPoint(\"TOPLEFT\", title, \"BOTTOMLEFT\", 0, -66)\n\ttitle2:SetText(\"Credits:\")\n\n\tlocal subtitle2 = frame:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\n\tsubtitle2:SetWidth(750)\n\tsubtitle2:SetPoint(\"TOPLEFT\", title2, \"BOTTOMLEFT\", 0, -8)\n\tsubtitle2:SetJustifyH(\"LEFT\")\n\tsubtitle2:SetText(GetAddOnMetadata(\"ShestakUI\", \"X-Credits\"))\n\n\tlocal title3 = frame:CreateFontString(nil, \"ARTWORK\", \"GameFontNormalLarge\")\n\ttitle3:SetPoint(\"TOPLEFT\", subtitle2, \"BOTTOMLEFT\", 0, -16)\n\ttitle3:SetText(\"Translation:\")\n\n\tlocal subtitle3 = frame:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\n\tsubtitle3:SetWidth(750)\n\tsubtitle3:SetPoint(\"TOPLEFT\", title3, \"BOTTOMLEFT\", 0, -8)\n\tsubtitle3:SetJustifyH(\"LEFT\")\n\tsubtitle3:SetText(GetAddOnMetadata(\"ShestakUI\", \"X-Translation\"))\n\n\tlocal title4 = frame:CreateFontString(nil, \"ARTWORK\", \"GameFontNormalLarge\")\n\ttitle4:SetPoint(\"TOPLEFT\", subtitle3, \"BOTTOMLEFT\", 0, -16)\n\ttitle4:SetText(\"Thanks:\")\n\n\tlocal subtitle4 = frame:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\n\tsubtitle4:SetWidth(750)\n\tsubtitle4:SetPoint(\"TOPLEFT\", title4, \"BOTTOMLEFT\", 0, -8)\n\tsubtitle4:SetJustifyH(\"LEFT\")\n\tsubtitle4:SetText(GetAddOnMetadata(\"ShestakUI\", \"X-Thanks\"))\n\n\tlocal CancelButton = CreateFrame(\"Button\", nil, frame, \"UIPanelButtonTemplate\")\n\tCancelButton:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -10, 10)\n\tCancelButton:SetSize(100, 23)\n\tCancelButton:SetText(CLOSE)\n\tCancelButton:SetWidth(CancelButton.Text:GetWidth() + 15)\n\tCancelButton:SetScript(\"OnClick\", function()\n\t\tframe:Hide()\n\tend)\n\n\ttinsert(ns.buttons, CancelButton)\n\n\tStaticPopupDialogs.LINK_URL = {\n\t\ttext = \"Help\",\n\t\tbutton1 = OKAY,\n\t\ttimeout = 0,\n\t\twhileDead = true,\n\t\thasEditBox = true,\n\t\teditBoxWidth = 350,\n\t\tOnShow = function(self, text)\n\t\t\tself.editBox:SetMaxLetters(0)\n\t\t\tself.editBox:SetText(text)\n\t\t\tself.editBox:HighlightText()\n\t\t\tselfText = text\n\t\tend,\n\t\tEditBoxOnEnterPressed = function(self) self:GetParent():Hide() end,\n\t\tEditBoxOnEscapePressed = function(self) self:GetParent():Hide() end,\n\t\tEditBoxOnTextChanged = function(self)\n\t\t\tif self:GetText():len() < 1 then\n\t\t\t\tself:GetParent():Hide()\n\t\t\telse\n\t\t\t\tself:SetText(selfText)\n\t\t\t\tself:HighlightText()\n\t\t\tend\n\t\tend,\n\t\tpreferredIndex = 5,\n\t}\nend\n\n-- Expert mode\ndo\n\tlocal frame = CreateFrame(\"Frame\", \"ShestakUIProfileFrame\", UIParent)\n\tframe:SetWidth(650)\n\tframe:SetHeight(520)\n\tframe:SetPoint(\"CENTER\", UIParent, \"CENTER\", 0, 0)\n\tframe:SetFrameStrata(\"DIALOG\")\n\ttinsert(UISpecialFrames, \"ShestakUIProfileFrame\")\n\tframe:Hide()\n\tframe:EnableMouse(true)\n\n\tlocal editBox = CreateFrame(\"EditBox\", \"ShestakUIProfileFrameEditBox\", frame)\n\teditBox:SetMultiLine(true)\n\teditBox:SetMaxLetters(99999)\n\teditBox:SetAutoFocus(true)\n\teditBox:SetFontObject(ChatFontNormal)\n\teditBox:SetWidth(620)\n\teditBox:SetHeight(500)\n\teditBox:SetScript(\"OnEscapePressed\", function() frame:Hide() end)\n\n\tlocal scrollArea = CreateFrame(\"ScrollFrame\", \"ShestakUIProfileFrameScroll\", frame, \"UIPanelScrollFrameTemplate\")\n\tscrollArea:SetPoint(\"TOPLEFT\", frame, \"TOPLEFT\", 10, -10)\n\tscrollArea:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -29, 34)\n\tscrollArea:SetScrollChild(editBox)\n\tShestakUIProfileFrameScrollScrollBar:SetPoint(\"TOPLEFT\", ShestakUIProfileFrameScroll, \"TOPRIGHT\", 8, -12)\n\tShestakUIProfileFrameScrollScrollBar:SetPoint(\"BOTTOMLEFT\", ShestakUIProfileFrameScroll, \"BOTTOMRIGHT\", 8, 12)\n\n\tlocal CancelButton = CreateFrame(\"Button\", nil, frame, \"UIPanelButtonTemplate\")\n\tCancelButton:SetPoint(\"BOTTOMRIGHT\", frame, \"BOTTOMRIGHT\", -4, 4)\n\tCancelButton:SetSize(100, 23)\n\tCancelButton:SetText(CLOSE)\n\tCancelButton:SetWidth(CancelButton.Text:GetWidth() + 15)\n\tCancelButton:SetScript(\"OnClick\", function()\n\t\tframe:Hide()\n\tend)\n\n\ttinsert(ns.buttons, CancelButton)\n\n\tlocal SaveButton = CreateFrame(\"Button\", nil, frame, \"UIPanelButtonTemplate\")\n\tSaveButton:SetPoint(\"BOTTOMRIGHT\", CancelButton, \"BOTTOMLEFT\", -4, 0)\n\tSaveButton:SetSize(100, 23)\n\tSaveButton:SetText(SAVE)\n\tSaveButton:SetWidth(SaveButton.Text:GetWidth() + 15)\n\tSaveButton:SetScript(\"OnClick\", function()\n\t\tlocal _, output = loadstring(editBox:GetText())\n\t\tif output then\n\t\t\tprint(\"|cffFF0000\"..output..\"|r\")\n\t\telse\n\t\t\tC.options.media = C.options.media or {}\n\t\t\tC.options.media.profile = editBox:GetText()\n\t\t\tframe:Hide()\n\t\t\tns.setReloadNeeded(true)\n\t\tend\n\tend)\n\n\ttinsert(ns.buttons, SaveButton)\nend\n\n-- Category\nns.addCategory(\"general\", GENERAL_LABEL, L_GUI_GENERAL_SUBTEXT, 2)\nns.addCategory(\"font\", L.font, L.font_subtext, 4)\nns.addCategory(\"skins\", L_GUI_SKINS, L_GUI_SKINS_SUBTEXT)\nns.addCategory(\"unitframe\", UNITFRAME_LABEL, L_GUI_UF_SUBTEXT, 3)\nns.addCategory(\"unitframe_class_bar\", L_GUI_UF_PLUGINS_CLASS_BAR, L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT)\nns.addCategory(\"raidframe\", RAID_FRAMES_LABEL, L_GUI_UF_RAIDFRAMES_SUBTEXT, 2)\nns.addCategory(\"aura\", BUFFOPTIONS_LABEL, BUFFOPTIONS_SUBTEXT)\nns.addCategory(\"actionbar\", L_GUI_ACTIONBAR, ACTIONBARS_SUBTEXT, 3)\nns.addCategory(\"tooltip\", L.tooltip, L.tooltip_subtext)\nns.addCategory(\"chat\", SOCIALS, L.chat_subtext)\nns.addCategory(\"nameplate\", UNIT_NAMEPLATES, L_GUI_NAMEPLATE_SUBTEXT, 2)\nns.addCategory(\"combattext\", L_GUI_COMBATTEXT, COMBATTEXT_SUBTEXT..\" \"..L_GUI_COMBATTEXT_SUBTEXT, 2)\nns.addCategory(\"bag\", L_GUI_BAGS, L_GUI_BAGS_SUBTEXT)\nns.addCategory(\"minimap\", MINIMAP_LABEL, L_GUI_MINIMAP_SUBTEXT)\nns.addCategory(\"loot\", LOOT, L_GUI_LOOT_SUBTEXT)\nns.addCategory(\"filger\", L_GUI_FILGER, L_GUI_FILGER_SUBTEXT)\nns.addCategory(\"announcements\", L_GUI_ANNOUNCEMENTS, L_GUI_ANNOUNCEMENTS_SUBTEXT)\nns.addCategory(\"automation\", L_GUI_AUTOMATION, L_GUI_AUTOMATION_SUBTEXT)\nns.addCategory(\"reminder\", L_GUI_REMINDER, L_GUI_REMINDER_SUBTEXT)\nns.addCategory(\"raidcooldown\", L_GUI_COOLDOWN_RAID, L_GUI_COOLDOWN_RAID_SUBTEXT)\nns.addCategory(\"enemycooldown\", L_GUI_COOLDOWN_ENEMY, L_GUI_COOLDOWN_ENEMY_SUBTEXT)\nns.addCategory(\"pulsecooldown\", L_GUI_COOLDOWN_PULSE, L_GUI_COOLDOWN_PULSE_SUBTEXT)\nns.addCategory(\"threat\", L_GUI_THREAT, L_GUI_THREAT_SUBTEXT)\nns.addCategory(\"toppanel\", L_GUI_TOP_PANEL, L_GUI_TOP_PANEL_SUBTEXT)\nns.addCategory(\"stats\", L_GUI_STATS, L_GUI_STATS_SUBTEXT)\nns.addCategory(\"trade\", L_GUI_TRADE, L_GUI_TRADE_SUBTEXT)\nns.addCategory(\"misc\", OTHER, L_GUI_MISC_SUBTEXT)\n\n-- General\ndo\n\tlocal parent = ShestakUIOptionsPanel.general\n\n\tlocal welcome_message = ns.CreateCheckBox(parent, \"welcome_message\", L_GUI_GENERAL_WELCOME_MESSAGE)\n\twelcome_message:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal auto_scale = ns.CreateCheckBox(parent, \"auto_scale\", L_GUI_GENERAL_AUTOSCALE)\n\tauto_scale:SetPoint(\"TOPLEFT\", welcome_message, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal uiscale = ns.CreateNumberSlider(parent, \"uiscale\", nil, nil, 0.4, 1.1, 0.01, true, L_GUI_GENERAL_UISCALE)\n\tuiscale:SetPoint(\"TOPLEFT\", auto_scale, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal function toggleUIScaleOptions()\n\t\tlocal shown = not auto_scale:GetChecked()\n\t\tuiscale:SetShown(shown)\n\tend\n\n\tauto_scale:HookScript(\"OnClick\", toggleUIScaleOptions)\n\tuiscale:HookScript(\"OnShow\", toggleUIScaleOptions)\n\n\t-- Blizzard UI\n\tlocal subheader = ns.addSubCategory(parent, L.general_subheader_blizzard)\n\tsubheader:SetPoint(\"TOPLEFT\", uiscale, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal error_filter = ns.CreateDropDown(parent, \"error_filter\", true, nil, ErrorTable)\n\terror_filter:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal vehicle_mouseover = ns.CreateCheckBox(parent, \"vehicle_mouseover\")\n\tvehicle_mouseover:SetPoint(\"TOPLEFT\", error_filter, \"BOTTOMLEFT\", 16, 0)\n\n\tlocal move_blizzard = ns.CreateCheckBox(parent, \"move_blizzard\")\n\tmove_blizzard:SetPoint(\"TOPLEFT\", vehicle_mouseover, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal color_picker = ns.CreateCheckBox(parent, \"color_picker\")\n\tcolor_picker:SetPoint(\"TOPLEFT\", move_blizzard, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal minimize_mouseover = ns.CreateCheckBox(parent, \"minimize_mouseover\")\n\tminimize_mouseover:SetPoint(\"TOPLEFT\", color_picker, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hide_banner = ns.CreateCheckBox(parent, \"hide_banner\")\n\thide_banner:SetPoint(\"TOPLEFT\", minimize_mouseover, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hide_talking_head = ns.CreateCheckBox(parent, \"hide_talking_head\")\n\thide_talking_head:SetPoint(\"TOPLEFT\", hide_banner, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hide_maw_buffs = ns.CreateCheckBox(parent, \"hide_maw_buffs\")\n\thide_maw_buffs:SetPoint(\"TOPLEFT\", hide_talking_head, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal InfoButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tInfoButton:SetPoint(\"BOTTOMRIGHT\", parent, \"BOTTOMRIGHT\", -20, 5)\n\tInfoButton:SetSize(100, 23)\n\tInfoButton:SetText(L_GUI_INFO)\n\tInfoButton:SetWidth(InfoButton.Text:GetWidth() + 15)\n\tInfoButton:SetScript(\"OnClick\", function()\n\t\tShestakUIInfoFrame:Show()\n\tend)\n\n\ttinsert(ns.buttons, InfoButton)\n\n\t-- Panel 2\n\tlocal parent = ShestakUIOptionsPanel.general2\n\n\tlocal border_color = ns.CreateColourPicker(parent, \"border_color\", true)\n\tborder_color:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 4, 0)\n\n\tlocal classborder_color = ns.CreateColourPicker(parent, \"classborder_color\", true)\n\tclassborder_color:SetPoint(\"TOPLEFT\", border_color, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal backdrop_color = ns.CreateColourPicker(parent, \"backdrop_color\", true)\n\tbackdrop_color:SetPoint(\"TOPLEFT\", classborder_color, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal backdrop_alpha = ns.CreateNumberSlider(parent, \"backdrop_alpha\", nil, nil, 0, 1, 0.05, true)\n\tbackdrop_alpha:SetPoint(\"TOPLEFT\", backdrop_color, \"BOTTOMLEFT\", 0, -28)\n\n\tlocal texture = ns.CreateDropDown(parent, \"texture\", true, nil, TextureTable, LSM and true)\n\ttexture:SetPoint(\"TOPLEFT\", backdrop_alpha, \"BOTTOMLEFT\", -20, -15)\n\n\tlocal texturePreview = CreateFrame(\"Frame\", nil, parent)\n\ttexturePreview:SetSize(100, 30)\n\ttexturePreview:SetPoint(\"LEFT\", texture.label, \"RIGHT\", 10, 0)\n\ttexturePreview:Hide()\n\n\ttexturePreview.tex = texturePreview:CreateTexture(nil, \"OVERLAY\")\n\ttexturePreview.tex:SetPoint(\"CENTER\")\n\ttexturePreview.tex:SetSize(100, 30)\n\n\thooksecurefunc(texture, \"SetValue\", function()\n\t\ttexturePreview:Show()\n\t\ttexturePreview.tex:SetTexture(C.options.media.texture)\n\t\ttexturePreview.tex:SetVertexColor(unpack(C.media.classborder_color))\n\tend)\n\n\t-- Normal Font\n\tlocal subheader = ns.addSubCategory(parent, L.media_subheader_normal)\n\tsubheader:SetPoint(\"TOPLEFT\", texture, \"BOTTOMLEFT\", 16, -10)\n\n\tlocal normal_font = ns.CreateDropDown(parent, \"normal_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tnormal_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\t-- Pixel Font\n\tlocal subheader = ns.addSubCategory(parent, L.media_subheader_pixel)\n\tsubheader:SetPoint(\"TOPLEFT\", normal_font, \"BOTTOMLEFT\", 16, -10)\n\n\tlocal pixel_font = ns.CreateDropDown(parent, \"pixel_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tpixel_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal pixel_font_style = ns.CreateDropDown(parent, \"pixel_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tpixel_font_style:SetPoint(\"LEFT\", pixel_font, \"RIGHT\", 150, 0)\n\n\tlocal pixel_font_size = ns.CreateNumberSlider(parent, \"pixel_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tpixel_font_size:SetPoint(\"TOPLEFT\", pixel_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal LuaButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tLuaButton:SetPoint(\"BOTTOMRIGHT\", parent, \"BOTTOMRIGHT\", -20, 5)\n\tLuaButton:SetSize(100, 23)\n\tLuaButton:SetText(L_GUI_EXPERT_MODE)\n\tLuaButton:SetWidth(LuaButton.Text:GetWidth() + 15)\n\tLuaButton:SetScript(\"OnClick\", function()\n\t\tShestakUIProfileFrameEditBox:SetText(C.media.profile)\n\t\tC_Timer.After(0.01, function()\n\t\t\tlocal _, max = ShestakUIProfileFrameScrollScrollBar:GetMinMaxValues()\n\t\t\tfor _ = 1, max do\n\t\t\t\tScrollFrameTemplate_OnMouseWheel(ShestakUIProfileFrameScroll, -1)\n\t\t\tend\n\t\tend)\n\t\tShestakUIProfileFrame:Show()\n\tend)\n\n\tLuaButton:SetScript(\"OnEnter\", function()\n\t\tGameTooltip:SetOwner(LuaButton, \"ANCHOR_RIGHT\", 5, 5)\n\t\tGameTooltip:SetText(L_GUI_EXPERT_MODE_DESC, nil, nil, nil, nil, true)\n\tend)\n\n\tLuaButton:SetScript(\"OnLeave\", function()\n\t\tGameTooltip:Hide()\n\tend)\n\n\ttinsert(ns.buttons, LuaButton)\n\n\t-- Profile list frame\n\tlocal ProfileList = CreateFrame(\"Frame\", \"ProfileList\", ShestakUIOptionsPanel, \"ButtonFrameTemplate\")\n\tProfileList:SetPoint(\"TOPLEFT\", ShestakUIOptionsPanel, \"TOPRIGHT\", 22, 0)\n\tProfileList:SetSize(290, 420)\n\tProfileList:Hide()\n\tProfileListPortrait:SetAlpha(0)\n\n\tProfileList.title = ProfileList:CreateFontString(\"ProfileListTitle\", \"OVERLAY\", \"GameFontNormal\")\n\tProfileList.title:SetPoint(\"TOP\", _G[\"ProfileList\"], \"TOP\", 0, -5)\n\tProfileList.title:SetText(L.profile_title)\n\n\tlocal ProfileButton = CreateFrame(\"Button\", \"ShestakUIOptionsPanelProfileButton\", options, \"UIPanelButtonTemplate\")\n\tProfileButton:SetPoint(\"TOPRIGHT\", -10, -8)\n\tProfileButton:SetSize(100, 23)\n\tProfileButton:SetText(L.profile)\n\tProfileButton:SetScript(\"OnClick\", function()\n\t\tif SpellList:IsVisible() then SpellList:Hide() end\n\t\tif ProfileList:IsVisible() then ProfileList:Hide() return end\n\t\tProfileList:Show()\n\tend)\n\n\ttinsert(ns.buttons, ProfileButton)\n\n\tlocal ProfileListPanel = CreateFrame(\"Frame\", \"ProfileListPanel\", _G[\"ProfileListInset\"])\n\tProfileListPanel:SetPoint(\"TOPLEFT\", _G[\"ProfileListInset\"], \"TOPLEFT\", -10, 20)\n\tProfileListPanel:SetPoint(\"BOTTOMRIGHT\", _G[\"ProfileListInset\"], \"BOTTOMRIGHT\", -6, -5)\n\n\tlocal ProfileBox = CreateFrame(\"CheckButton\", nil, ProfileList, \"InterfaceOptionsCheckButtonTemplate\")\n\tProfileBox:SetPoint(\"TOPLEFT\", ProfileList, \"TOPLEFT\", 1, -78)\n\tProfileBox.tooltipText = L_GUI_SET_SAVED_SETTTINGS_DESC\n\tProfileBox:SetScript(\"OnEnter\", function(self)\n\t\tGameTooltip:SetOwner(self, \"ANCHOR_RIGHT\", 0, 0)\n\t\tGameTooltip:SetText(self.tooltipText, nil, nil, nil, nil, true)\n\tend)\n\n\tProfileBox:SetScript(\"OnLeave\", function()\n\t\tGameTooltip:Hide()\n\tend)\n\toptions.ProfileBox = ProfileBox\n\n\tlocal label = ProfileBox:CreateFontString(nil, \"OVERLAY\", \"GameFontNormal\")\n\tlabel:SetText(L_GUI_SET_SAVED_SETTTINGS)\n\tlabel:SetTextColor(1, 1, 1)\n\tlabel:SetPoint(\"LEFT\", ProfileBox, \"RIGHT\", 10, 0)\n\n\tlocal profileName\n\tStaticPopupDialogs.SHESTAKUI_RENAME_PROFILE = {\n\t\ttext = PET_RENAME..\" \"..strlower(L.profile),\n\t\tbutton1 = ACCEPT,\n\t\tbutton2 = CANCEL,\n\t\thasEditBox = true,\n\t\teditBoxWidth = 350,\n\t\tOnShow = function(self, text)\n\t\t\tself.editBox:SetMaxLetters(0)\n\t\t\tself.editBox:SetText(text)\n\t\t\tself.editBox:HighlightText()\n\t\t\tprofileName = text\n\t\tend,\n\t\tEditBoxOnEscapePressed = function(self) self:GetParent():Hide() end,\n\t\tEditBoxOnTextChanged = function(self)\n\t\t\tprofileName = self:GetText()\n\t\tend,\n\t\tOnAccept = function()\n\t\t\tif not profileName or profileName == \"\" then return end\n\t\t\tif ShestakUIOptionsGlobal[realm][name] then\n\t\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name])\n\t\t\t\tif ShestakUIOptionsPerChar[i] then\n\t\t\t\t\tif not ShestakUIOptionsPerChar[i][\"general\"] then\n\t\t\t\t\t\tShestakUIOptionsPerChar[i][\"general\"] = {}\n\t\t\t\t\tend\n\t\t\t\t\tShestakUIOptionsPerChar[i][\"general\"][\"profile_name\"] = profileName\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\t\t\tif ShestakUIOptions[i] then\n\t\t\t\t\tif not ShestakUIOptions[i][\"general\"] then\n\t\t\t\t\t\tShestakUIOptions[i][\"general\"] = {}\n\t\t\t\t\tend\n\t\t\t\t\tShestakUIOptions[i][\"general\"][\"profile_name\"] = profileName\n\t\t\t\tend\n\t\t\tend\n\t\t\tUIDropDownMenu_SetText(ShestakUIOptionsPanelgeneralchoose_profileDropDown, profileName)\n\t\tend,\n\t\twhileDead = true,\n\t\thideOnEscape = true,\n\t}\n\n\tlocal RenameButton = CreateFrame(\"Button\", \"ProfileListPaneRenameButton\", ProfileList, \"UIPanelButtonTemplate\")\n\tRenameButton:SetPoint(\"TOPLEFT\", ProfileBox, \"TOPLEFT\", 4, -34)\n\tRenameButton:SetSize(100, 23)\n\tRenameButton:SetText(PET_RENAME)\n\tRenameButton:SetWidth(RenameButton.Text:GetWidth() + 15)\n\tRenameButton:SetScript(\"OnClick\", function()\n\t\tif ShestakUIOptionsGlobal then\n\t\t\tif ShestakUIOptionsGlobal[realm][name] then\n\t\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name])\n\t\t\t\tprofileName = ShestakUIOptionsPerChar[i] and ShestakUIOptionsPerChar[i][\"general\"] and ShestakUIOptionsPerChar[i][\"general\"][\"profile_name\"] or i\n\t\t\telse\n\t\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\t\t\tprofileName = ShestakUIOptions[i] and ShestakUIOptions[i][\"general\"] and ShestakUIOptions[i][\"general\"][\"profile_name\"] or i\n\t\t\tend\n\t\t\tStaticPopup_Show(\"SHESTAKUI_RENAME_PROFILE\", _, _, profileName)\n\t\tend\n\tend)\n\ttinsert(ns.buttons, RenameButton)\n\n\tlocal status = ProfileListPanel:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlight\")\n\tstatus:SetPoint(\"BOTTOM\", ProfileListPanel, \"BOTTOM\", 0, 35)\n\tstatus:SetWidth(200)\n\tstatus:SetTextColor(0.8, 0.2, 0)\n\n\tlocal selfTextExport\n\tStaticPopupDialogs.SHESTAKUI_EXPORT_PROFILE = {\n\t\ttext = L.profile_export,\n\t\tbutton1 = OKAY,\n\t\ttimeout = 0,\n\t\twhileDead = true,\n\t\thasEditBox = true,\n\t\teditBoxWidth = 350,\n\t\tOnShow = function(self, text)\n\t\t\tself.editBox:SetMaxLetters(0)\n\t\t\tself.editBox:SetText(text)\n\t\t\tself.editBox:HighlightText()\n\t\t\tselfTextExport = text\n\t\tend,\n\t\tEditBoxOnEnterPressed = function(self) self:GetParent():Hide() end,\n\t\tEditBoxOnEscapePressed = function(self) self:GetParent():Hide() end,\n\t\tEditBoxOnTextChanged = function(self)\n\t\t\tif self:GetText():len() < 1 then\n\t\t\t\tself:GetParent():Hide()\n\t\t\telse\n\t\t\t\tself:SetText(selfTextExport)\n\t\t\t\tself:HighlightText()\n\t\t\tend\n\t\tend,\n\t\tpreferredIndex = 5,\n\t}\n\n\tlocal profileVar = \"General\"\n\tlocal function startExport()\n\t\tlocal Prefix = \"ShestakUI:Profile:\"\n\t\tlocal LibDeflate = LibStub:GetLibrary(\"LibDeflate\")\n\t\tlocal LibSerialize = LibStub(\"LibSerialize\")\n\n\t\tlocal Serialized\n\t\tif profileVar == \"General\" then\n\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\t\tSerialized = LibSerialize:Serialize(ShestakUIOptions[i])\n\t\telseif profileVar == \"Personal\" then\n\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name])\n\t\t\tSerialized = LibSerialize:Serialize(ShestakUIOptionsPerChar[i])\n\t\telseif profileVar == \"Mover\" then\n\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\t\tSerialized = LibSerialize:Serialize(ShestakUIPositions[i])\n\t\telseif profileVar == \"Mover_Personal\" then\n\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name])\n\t\t\tSerialized = LibSerialize:Serialize(ShestakUIPositionsPerChar[i])\n\t\tend\n\n\t\tlocal Compressed = LibDeflate:CompressDeflate(Serialized)\n\t\tlocal Encoded = LibDeflate:EncodeForPrint(Compressed)\n\t\tlocal Result = Prefix..Encoded\n\t\tStaticPopup_Show(\"SHESTAKUI_EXPORT_PROFILE\", _, _, Result)\n\tend\n\n\tlocal selfTextImport\n\tlocal importVar = \"General\"\n\tStaticPopupDialogs.SHESTAKUI_IMPORT_PROFILE = {\n\t\ttext = L.profile_import,\n\t\tbutton1 = ACCEPT,\n\t\tbutton2 = CANCEL,\n\t\ttimeout = 0,\n\t\twhileDead = true,\n\t\thasEditBox = true,\n\t\teditBoxWidth = 350,\n\t\tEditBoxOnEscapePressed = function(self) self:GetParent():Hide() end,\n\t\tEditBoxOnTextChanged = function(self)\n\t\t\tselfTextImport = self:GetText()\n\t\tend,\n\t\tOnAccept = function(self)\n\t\t\tlocal Code = selfTextImport\n\t\t\tlocal Prefix = \"ShestakUI:Profile:\"\n\t\t\tlocal LibDeflate = LibStub:GetLibrary(\"LibDeflate\")\n\t\t\tlocal LibSerialize = LibStub(\"LibSerialize\")\n\n\t\t\tlocal LibCode = string.gsub(Code, Prefix, \"\")\n\t\t\tlocal Decoded = LibDeflate:DecodeForPrint(LibCode)\n\n\t\t\tif Decoded then\n\t\t\t\tlocal Decompressed = LibDeflate:DecompressDeflate(Decoded)\n\t\t\t\tlocal Success, Table = LibSerialize:Deserialize(Decompressed)\n\t\t\t\tif Success then\n\t\t\t\t\tif profileVar == \"General\" then\n\t\t\t\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\t\t\t\t\tShestakUIOptions[i] = Table\n\t\t\t\t\telseif profileVar == \"Personal\" then\n\t\t\t\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name])\n\t\t\t\t\t\tShestakUIOptionsPerChar[i] = Table\n\t\t\t\t\telseif profileVar == \"Mover\" then\n\t\t\t\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\t\t\t\t\tShestakUIPositions[i] = Table\n\t\t\t\t\telseif profileVar == \"Mover_Personal\" then\n\t\t\t\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name])\n\t\t\t\t\t\tShestakUIPositionsPerChar[i] = Table\n\t\t\t\t\tend\n\t\t\t\t\tReloadUI()\n\t\t\t\telse\n\t\t\t\t\tstatus:SetText(L.profile_error_code)\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tstatus:SetText(L.profile_error_code)\n\t\t\tend\n\t\tend,\n\t\tpreferredIndex = 5,\n\t}\n\n\tlocal subheader = ProfileListPanel:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlightSmall\")\n\tsubheader:SetPoint(\"TOPLEFT\", RenameButton, 15, -40)\n\tsubheader:SetText(L.profile_options)\n\tsubheader:SetTextColor(179/255, 211/255, 243/255)\n\n\tlocal ExportButton = CreateFrame(\"Button\", \"ProfileListPanelExportButton\", ProfileList, \"UIPanelButtonTemplate\")\n\tExportButton:SetPoint(\"TOPLEFT\", subheader, 10, -20)\n\tExportButton:SetSize(100, 23)\n\tExportButton:SetText(L.profile_export)\n\tExportButton:SetScript(\"OnClick\", function()\n\t\tprofileVar = ShestakUIOptionsGlobal[realm][name] and \"Personal\" or \"General\"\n\t\tstartExport()\n\tend)\n\n\ttinsert(ns.buttons, ExportButton)\n\n\tlocal ImportButton = CreateFrame(\"Button\", \"ProfileListPaneImportButton\", ProfileList, \"UIPanelButtonTemplate\")\n\tImportButton:SetPoint(\"LEFT\", ExportButton, \"RIGHT\", 10, 0)\n\tImportButton:SetSize(100, 23)\n\tImportButton:SetText(L.profile_import)\n\tImportButton:SetScript(\"OnClick\", function()\n\t\tprofileVar = ShestakUIOptionsGlobal[realm][name] and \"Personal\" or \"General\"\n\t\tStaticPopup_Show(\"SHESTAKUI_IMPORT_PROFILE\")\n\tend)\n\n\ttinsert(ns.buttons, ImportButton)\n\n\tlocal subheader = ProfileListPanel:CreateFontString(nil, \"ARTWORK\", \"GameFontHighlightSmall\")\n\tsubheader:SetPoint(\"TOPLEFT\", ExportButton, -10, -35)\n\tsubheader:SetText(L.profile_movers)\n\tsubheader:SetTextColor(179/255, 211/255, 243/255)\n\n\tlocal ExportMoveButton = CreateFrame(\"Button\", \"ProfileListPanelExportMoveButton\", ProfileList, \"UIPanelButtonTemplate\")\n\tExportMoveButton:SetPoint(\"TOPLEFT\", subheader, 10, -20)\n\tExportMoveButton:SetSize(100, 23)\n\tExportMoveButton:SetText(L.profile_export)\n\tExportMoveButton:SetScript(\"OnClick\", function()\n\t\tprofileVar = ShestakUIOptionsGlobal[realm][name] and \"Mover_Personal\" or \"Mover\"\n\t\tstartExport()\n\tend)\n\n\ttinsert(ns.buttons, ExportMoveButton)\n\n\tlocal ImportMoveButton = CreateFrame(\"Button\", \"ProfileListPaneImportMoveButton\", ProfileList, \"UIPanelButtonTemplate\")\n\tImportMoveButton:SetPoint(\"LEFT\", ExportMoveButton, \"RIGHT\", 10, 0)\n\tImportMoveButton:SetSize(100, 23)\n\tImportMoveButton:SetText(L.profile_import)\n\tImportMoveButton:SetScript(\"OnClick\", function()\n\t\tprofileVar = ShestakUIOptionsGlobal[realm][name] and \"Mover_Personal\" or \"Mover\"\n\t\tStaticPopup_Show(\"SHESTAKUI_IMPORT_PROFILE\")\n\tend)\n\n\ttinsert(ns.buttons, ImportMoveButton)\n\n\tC_Timer.After(0.3, function() -- need to grab SavedVariables and loaded libraries\n\t\tlocal LibDeflate = LibStub and LibStub:GetLibrary(\"LibDeflate\", true)\n\t\tlocal LibSerialize = LibStub and LibStub:GetLibrary(\"LibSerialize\", true)\n\t\tlocal LibsExist = LibDeflate and LibSerialize\n\n\t\tif not LibsExist then\n\t\t\tExportButton:Disable()\n\t\t\tImportButton:Disable()\n\t\t\tExportMoveButton:Disable()\n\t\t\tImportMoveButton:Disable()\n\t\t\tstatus:SetText(L.profile_error_lib)\n\t\tend\n\n\t\t-- Use existing function in Core.lua to create dropdown with name via SavedVariables\n\t\tlocal function SaveValue(f, value)\n\t\t\tif not C.options[f.group] then C.options[f.group] = {} end\n\t\t\tif not C.options[f.group][f.option] then C.options[f.group][f.option] = {} end\n\n\t\t\tC.options[f.group][f.option] = value -- these are the saved variables\n\t\t\tC[f.group][f.option] = value -- and this is from the lua options\n\t\tend\n\n\t\tlocal old = {}\n\t\tlocal function checkIsReloadNeeded()\n\t\t\tfor frame, value in pairs(old) do\n\t\t\t\tif C[frame.group][frame.option] ~= value then\n\t\t\t\t\tns.setReloadNeeded(true)\n\t\t\t\t\treturn\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tns.setReloadNeeded(false)\n\t\tend\n\n\t\tlocal function GetProfileName(key)\n\t\t\tif ShestakUIOptionsGlobal[realm][name] then\n\t\t\t\tlocal i = tostring(key)\n\t\t\t\tif ShestakUIOptionsPerChar[i] and ShestakUIOptionsPerChar[i][\"general\"] and ShestakUIOptionsPerChar[i][\"general\"][\"profile_name\"] then\n\t\t\t\t\treturn ShestakUIOptionsPerChar[i][\"general\"][\"profile_name\"]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal i = tostring(key)\n\t\t\t\tif ShestakUIOptions[i] and ShestakUIOptions[i][\"general\"] and ShestakUIOptions[i][\"general\"][\"profile_name\"] then\n\t\t\t\t\treturn ShestakUIOptions[i][\"general\"][\"profile_name\"]\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tlocal CreateDropDown = function(parent, option, needsReload, text, tableValue)\n\t\t\tlocal f = CreateFrame(\"Frame\", parent:GetName()..option..\"DropDown\", parent, \"UIDropDownMenuTemplate\")\n\t\t\tUIDropDownMenu_SetWidth(f, 110)\n\n\t\t\tUIDropDownMenu_Initialize(f, function(self)\n\t\t\t\tlocal info = UIDropDownMenu_CreateInfo()\n\t\t\t\tinfo.func = self.SetValue\n\t\t\t\tfor key, value in pairs(tableValue) do\n\t\t\t\t\tinfo.text = GetProfileName(key) or value\n\t\t\t\t\tinfo.arg1 = value\n\t\t\t\t\tinfo.arg2 = key\n\t\t\t\t\tinfo.checked = value == f.selectedValue\n\n\t\t\t\t\tif isFont then\n\t\t\t\t\t\tlocal fObject = CreateFont(info.text)\n\t\t\t\t\t\tfObject:SetFont(value, 12, \"\")\n\t\t\t\t\t\tinfo.fontObject = fObject\n\t\t\t\t\tend\n\t\t\t\t\tUIDropDownMenu_AddButton(info)\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tfunction f:SetValue(newValue, newkey)\n\t\t\t\tf.selectedValue = newValue\n\t\t\t\tlocal text = GetProfileName(newkey) or newValue\n\t\t\t\tUIDropDownMenu_SetText(f, text)\n\t\t\t\tif ShestakUIOptionsGlobal[realm][name] then\n\t\t\t\t\tShestakUIOptionsGlobal[realm][\"Current_Profile\"][name] = newValue\n\t\t\t\telse\n\t\t\t\t\tShestakUIOptionsGlobal[\"Current_Profile\"] = newValue\n\t\t\t\tend\n\t\t\t\tSaveValue(f, newValue)\n\t\t\t\told[f] = f.oldValue\n\t\t\t\tcheckIsReloadNeeded()\n\t\t\t\tCloseDropDownMenus()\n\t\t\tend\n\n\t\t\tlocal label = f:CreateFontString(nil, \"OVERLAY\", \"GameFontHighlight\")\n\t\t\tif text then\n\t\t\t\tlabel:SetText(text)\n\t\t\telse\n\t\t\t\tlabel:SetText(ns[parent.tag..\"_\"..option])\n\t\t\tend\n\t\t\tlabel:SetHeight(20)\n\t\t\tlabel:SetJustifyH(\"LEFT\")\n\t\t\tlabel:SetPoint(\"LEFT\", 160, 4)\n\t\t\tf.label = label\n\n\t\t\tf.tooltipText = ns[parent.tag..\"_\"..option..\"_desc\"]\n\t\t\tif f.tooltipText then\n\t\t\t\tf:SetScript(\"OnEnter\", function()\n\t\t\t\t\tGameTooltip:SetOwner(f, \"ANCHOR_RIGHT\", 0, 0)\n\t\t\t\t\tGameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)\n\t\t\t\tend)\n\n\t\t\t\tf:SetScript(\"OnLeave\", function()\n\t\t\t\t\tGameTooltip:Hide()\n\t\t\t\tend)\n\t\t\tend\n\n\t\t\tf.group = parent.tag\n\t\t\tf.option = option\n\n\t\t\tf.needsReload = needsReload\n\n\t\t\tparent[option] = f\n\n\t\t\treturn f\n\t\tend\n\n\t\tlocal choose_profile = CreateDropDown(ShestakUIOptionsPanel.general, \"choose_profile\", true, L.profile_choose, {1, 2, 3})\n\t\tchoose_profile:SetPoint(\"TOPLEFT\", ProfileList, \"TOPLEFT\", -15, -46)\n\t\tchoose_profile:SetParent(ProfileListPanel)\n\n\t\tlocal value = ShestakUIOptionsGlobal[realm][name] and ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name] or ShestakUIOptionsGlobal[\"Current_Profile\"]\n\t\tchoose_profile.selectedValue = value\n\t\tchoose_profile.oldValue = value\n\n\t\tlocal text\n\t\tif ShestakUIOptionsGlobal[realm][name] then\n\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[realm][\"Current_Profile\"][name])\n\t\t\ttext = ShestakUIOptionsPerChar[i] and ShestakUIOptionsPerChar[i][\"general\"] and ShestakUIOptionsPerChar[i][\"general\"][\"profile_name\"]\n\t\telse\n\t\t\tlocal i = tostring(ShestakUIOptionsGlobal[\"Current_Profile\"])\n\t\t\ttext = ShestakUIOptions[i] and ShestakUIOptions[i][\"general\"] and ShestakUIOptions[i][\"general\"][\"profile_name\"]\n\t\tend\n\t\ttext = text or value\n\t\tUIDropDownMenu_SetText(choose_profile, text)\n\tend)\nend\n\n-- Font\ndo\n\tlocal parent = ShestakUIOptionsPanel.font\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_unit)\n\tsubheader:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal unit_frames_font = ns.CreateDropDown(parent, \"unit_frames_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tunit_frames_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal unit_frames_font_style = ns.CreateDropDown(parent, \"unit_frames_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tunit_frames_font_style:SetPoint(\"LEFT\", unit_frames_font, \"RIGHT\", 150, 0)\n\n\tlocal unit_frames_font_size = ns.CreateNumberSlider(parent, \"unit_frames_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tunit_frames_font_size:SetPoint(\"TOPLEFT\", unit_frames_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal unit_frames_font_shadow = ns.CreateCheckBox(parent, \"unit_frames_font_shadow\", L.font_stats_font_shadow)\n\tunit_frames_font_shadow:SetPoint(\"LEFT\", unit_frames_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_aura)\n\tsubheader:SetPoint(\"TOPLEFT\", unit_frames_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal auras_font = ns.CreateDropDown(parent, \"auras_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tauras_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal auras_font_style = ns.CreateDropDown(parent, \"auras_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tauras_font_style:SetPoint(\"LEFT\", auras_font, \"RIGHT\", 150, 0)\n\n\tlocal auras_font_size = ns.CreateNumberSlider(parent, \"auras_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tauras_font_size:SetPoint(\"TOPLEFT\", auras_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal auras_font_shadow = ns.CreateCheckBox(parent, \"auras_font_shadow\", L.font_stats_font_shadow)\n\tauras_font_shadow:SetPoint(\"LEFT\", auras_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_nameplates)\n\tsubheader:SetPoint(\"TOPLEFT\", auras_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal nameplates_font = ns.CreateDropDown(parent, \"nameplates_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tnameplates_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal nameplates_font_style = ns.CreateDropDown(parent, \"nameplates_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tnameplates_font_style:SetPoint(\"LEFT\", nameplates_font, \"RIGHT\", 150, 0)\n\n\tlocal nameplates_font_size = ns.CreateNumberSlider(parent, \"nameplates_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tnameplates_font_size:SetPoint(\"TOPLEFT\", nameplates_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal nameplates_font_shadow = ns.CreateCheckBox(parent, \"nameplates_font_shadow\", L.font_stats_font_shadow)\n\tnameplates_font_shadow:SetPoint(\"LEFT\", nameplates_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_action)\n\tsubheader:SetPoint(\"TOPLEFT\", nameplates_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal action_bars_font = ns.CreateDropDown(parent, \"action_bars_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\taction_bars_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal action_bars_font_style = ns.CreateDropDown(parent, \"action_bars_font_style\", true, L.font_stats_font_style, FlagsTable)\n\taction_bars_font_style:SetPoint(\"LEFT\", action_bars_font, \"RIGHT\", 150, 0)\n\n\tlocal action_bars_font_size = ns.CreateNumberSlider(parent, \"action_bars_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\taction_bars_font_size:SetPoint(\"TOPLEFT\", action_bars_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal action_bars_font_shadow = ns.CreateCheckBox(parent, \"action_bars_font_shadow\", L.font_stats_font_shadow)\n\taction_bars_font_shadow:SetPoint(\"LEFT\", action_bars_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_cooldown)\n\tsubheader:SetPoint(\"TOPLEFT\", action_bars_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal cooldown_timers_font = ns.CreateDropDown(parent, \"cooldown_timers_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tcooldown_timers_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal cooldown_timers_font_style = ns.CreateDropDown(parent, \"cooldown_timers_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tcooldown_timers_font_style:SetPoint(\"LEFT\", cooldown_timers_font, \"RIGHT\", 150, 0)\n\n\tlocal cooldown_timers_font_size = ns.CreateNumberSlider(parent, \"cooldown_timers_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tcooldown_timers_font_size:SetPoint(\"TOPLEFT\", cooldown_timers_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal cooldown_timers_font_shadow = ns.CreateCheckBox(parent, \"cooldown_timers_font_shadow\", L.font_stats_font_shadow)\n\tcooldown_timers_font_shadow:SetPoint(\"LEFT\", cooldown_timers_font_size, \"RIGHT\", 160, 0)\n\n\tlocal global_font = ns.CreateCheckBox(parent, \"global_font\")\n\tglobal_font:SetPoint(\"TOPLEFT\", cooldown_timers_font_size, \"BOTTOMLEFT\", 0, -30)\n\n\t-- Panel 2\n\tlocal parent = ShestakUIOptionsPanel.font2\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_combat)\n\tsubheader:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal combat_text_font = ns.CreateDropDown(parent, \"combat_text_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tcombat_text_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal combat_text_font_style = ns.CreateDropDown(parent, \"combat_text_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tcombat_text_font_style:SetPoint(\"LEFT\", combat_text_font, \"RIGHT\", 150, 0)\n\n\tlocal combat_text_font_size = ns.CreateNumberSlider(parent, \"combat_text_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tcombat_text_font_size:SetPoint(\"TOPLEFT\", combat_text_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal combat_text_font_shadow = ns.CreateCheckBox(parent, \"combat_text_font_shadow\", L.font_stats_font_shadow)\n\tcombat_text_font_shadow:SetPoint(\"LEFT\", combat_text_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_filger)\n\tsubheader:SetPoint(\"TOPLEFT\", combat_text_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal filger_font = ns.CreateDropDown(parent, \"filger_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tfilger_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal filger_font_style = ns.CreateDropDown(parent, \"filger_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tfilger_font_style:SetPoint(\"LEFT\", filger_font, \"RIGHT\", 150, 0)\n\n\tlocal filger_font_size = ns.CreateNumberSlider(parent, \"filger_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tfilger_font_size:SetPoint(\"TOPLEFT\", filger_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal filger_font_shadow = ns.CreateCheckBox(parent, \"filger_font_shadow\", L.font_stats_font_shadow)\n\tfilger_font_shadow:SetPoint(\"LEFT\", filger_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_threat)\n\tsubheader:SetPoint(\"TOPLEFT\", filger_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal threat_meter_font = ns.CreateDropDown(parent, \"threat_meter_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tthreat_meter_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal threat_meter_font_style = ns.CreateDropDown(parent, \"threat_meter_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tthreat_meter_font_style:SetPoint(\"LEFT\", threat_meter_font, \"RIGHT\", 150, 0)\n\n\tlocal threat_meter_font_size = ns.CreateNumberSlider(parent, \"threat_meter_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tthreat_meter_font_size:SetPoint(\"TOPLEFT\", threat_meter_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal threat_meter_font_shadow = ns.CreateCheckBox(parent, \"threat_meter_font_shadow\", L.font_stats_font_shadow)\n\tthreat_meter_font_shadow:SetPoint(\"LEFT\", threat_meter_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_raidcd)\n\tsubheader:SetPoint(\"TOPLEFT\", threat_meter_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal raid_cooldowns_font = ns.CreateDropDown(parent, \"raid_cooldowns_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\traid_cooldowns_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal raid_cooldowns_font_style = ns.CreateDropDown(parent, \"raid_cooldowns_font_style\", true, L.font_stats_font_style, FlagsTable)\n\traid_cooldowns_font_style:SetPoint(\"LEFT\", raid_cooldowns_font, \"RIGHT\", 150, 0)\n\n\tlocal raid_cooldowns_font_size = ns.CreateNumberSlider(parent, \"raid_cooldowns_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\traid_cooldowns_font_size:SetPoint(\"TOPLEFT\", raid_cooldowns_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal raid_cooldowns_font_shadow = ns.CreateCheckBox(parent, \"raid_cooldowns_font_shadow\", L.font_stats_font_shadow)\n\traid_cooldowns_font_shadow:SetPoint(\"LEFT\", raid_cooldowns_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_loot)\n\tsubheader:SetPoint(\"TOPLEFT\", raid_cooldowns_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal loot_font = ns.CreateDropDown(parent, \"loot_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tloot_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal loot_font_style = ns.CreateDropDown(parent, \"loot_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tloot_font_style:SetPoint(\"LEFT\", loot_font, \"RIGHT\", 150, 0)\n\n\tlocal loot_font_size = ns.CreateNumberSlider(parent, \"loot_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tloot_font_size:SetPoint(\"TOPLEFT\", loot_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal loot_font_shadow = ns.CreateCheckBox(parent, \"loot_font_shadow\", L.font_stats_font_shadow)\n\tloot_font_shadow:SetPoint(\"LEFT\", loot_font_size, \"RIGHT\", 160, 0)\n\n\t-- Panel 3\n\tlocal parent = ShestakUIOptionsPanel.font3\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_bag)\n\tsubheader:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal bags_font = ns.CreateDropDown(parent, \"bags_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tbags_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal bags_font_style = ns.CreateDropDown(parent, \"bags_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tbags_font_style:SetPoint(\"LEFT\", bags_font, \"RIGHT\", 150, 0)\n\n\tlocal bags_font_size = ns.CreateNumberSlider(parent, \"bags_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tbags_font_size:SetPoint(\"TOPLEFT\", bags_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal bags_font_shadow = ns.CreateCheckBox(parent, \"bags_font_shadow\", L.font_stats_font_shadow)\n\tbags_font_shadow:SetPoint(\"LEFT\", bags_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_chat)\n\tsubheader:SetPoint(\"TOPLEFT\", bags_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal chat_font = ns.CreateDropDown(parent, \"chat_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tchat_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal chat_font_style = ns.CreateDropDown(parent, \"chat_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tchat_font_style:SetPoint(\"LEFT\", chat_font, \"RIGHT\", 150, 0)\n\n\tlocal chat_font_shadow = ns.CreateCheckBox(parent, \"chat_font_shadow\", L.font_stats_font_shadow)\n\tchat_font_shadow:SetPoint(\"TOPLEFT\", chat_font, \"BOTTOMLEFT\", 16, -7)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_chat_tabs)\n\tsubheader:SetPoint(\"TOPLEFT\", chat_font_shadow, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal chat_tabs_font = ns.CreateDropDown(parent, \"chat_tabs_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tchat_tabs_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal chat_tabs_font_style = ns.CreateDropDown(parent, \"chat_tabs_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tchat_tabs_font_style:SetPoint(\"LEFT\", chat_tabs_font, \"RIGHT\", 150, 0)\n\n\tlocal chat_tabs_font_size = ns.CreateNumberSlider(parent, \"chat_tabs_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tchat_tabs_font_size:SetPoint(\"TOPLEFT\", chat_tabs_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal chat_tabs_font_shadow = ns.CreateCheckBox(parent, \"chat_tabs_font_shadow\", L.font_stats_font_shadow)\n\tchat_tabs_font_shadow:SetPoint(\"LEFT\", chat_tabs_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_style)\n\tsubheader:SetPoint(\"TOPLEFT\", chat_tabs_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal stylization_font = ns.CreateDropDown(parent, \"stylization_font\", true, L.font_stats_font, FontTable, LSM and true, true)\n\tstylization_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal stylization_font_style = ns.CreateDropDown(parent, \"stylization_font_style\", true, L.font_stats_font_style, FlagsTable)\n\tstylization_font_style:SetPoint(\"LEFT\", stylization_font, \"RIGHT\", 150, 0)\n\n\tlocal stylization_font_size = ns.CreateNumberSlider(parent, \"stylization_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tstylization_font_size:SetPoint(\"TOPLEFT\", stylization_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal stylization_font_shadow = ns.CreateCheckBox(parent, \"stylization_font_shadow\", L.font_stats_font_shadow)\n\tstylization_font_shadow:SetPoint(\"LEFT\", stylization_font_size, \"RIGHT\", 160, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_stats)\n\tsubheader:SetPoint(\"TOPLEFT\", stylization_font_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal stats_font = ns.CreateDropDown(parent, \"stats_font\", true, nil, FontTable, LSM and true, true)\n\tstats_font:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal stats_font_style = ns.CreateDropDown(parent, \"stats_font_style\", true, nil, FlagsTable)\n\tstats_font_style:SetPoint(\"LEFT\", stats_font, \"RIGHT\", 150, 0)\n\n\tlocal stats_font_size = ns.CreateNumberSlider(parent, \"stats_font_size\", nil, nil, 8, 48, 1, true, FONT_SIZE)\n\tstats_font_size:SetPoint(\"TOPLEFT\", stats_font, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal stats_font_shadow = ns.CreateCheckBox(parent, \"stats_font_shadow\")\n\tstats_font_shadow:SetPoint(\"LEFT\", stats_font_size, \"RIGHT\", 160, 0)\n\n\t-- Panel 3\n\tlocal parent = ShestakUIOptionsPanel.font4\n\n\tlocal subheader = ns.addSubCategory(parent, L.font_subheader_blizzard)\n\tsubheader:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal tooltip_header_font_size = ns.CreateNumberSlider(parent, \"tooltip_header_font_size\", nil, nil, 10, 22, 1, true)\n\ttooltip_header_font_size:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal tooltip_font_size = ns.CreateNumberSlider(parent, \"tooltip_font_size\", nil, nil, 10, 22, 1, true)\n\ttooltip_font_size:SetPoint(\"LEFT\", tooltip_header_font_size, \"RIGHT\", 120, 0)\n\n\tlocal bubble_font_size = ns.CreateNumberSlider(parent, \"bubble_font_size\", nil, nil, 10, 24, 1, true, CHAT_BUBBLES_TEXT)\n\tbubble_font_size:SetPoint(\"TOPLEFT\", tooltip_header_font_size, \"BOTTOMLEFT\", 0, -20)\nend\n\n-- Skins\ndo\n\tlocal parent = ShestakUIOptionsPanel.skins\n\n\tlocal blizzard_frames = ns.CreateCheckBox(parent, \"blizzard_frames\", L_GUI_SKINS_BLIZZARD)\n\tblizzard_frames:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal bubbles = ns.CreateCheckBox(parent, \"bubbles\")\n\tbubbles:SetPoint(\"TOPLEFT\", blizzard_frames, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal minimap_buttons = ns.CreateCheckBox(parent, \"minimap_buttons\", L_GUI_SKINS_MINIMAP_BUTTONS)\n\tminimap_buttons:SetPoint(\"TOPLEFT\", bubbles, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal minimap_buttons_mouseover = ns.CreateCheckBox(parent, \"minimap_buttons_mouseover\")\n\tminimap_buttons_mouseover:SetPoint(\"TOPLEFT\", minimap_buttons, \"BOTTOMLEFT\", 20, 0)\n\n\t-- Addons\n\tlocal subheader = ns.addSubCategory(parent, L_GUI_SKINS_SUBHEADER)\n\tsubheader:SetPoint(\"TOPLEFT\", minimap_buttons_mouseover, \"BOTTOMLEFT\", -20, -16)\n\n\tlocal ace3 = ns.CreateCheckBox(parent, \"ace3\")\n\tace3:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal skinTable = {\n\t\t{\"atlasloot\"},\n\t\t{\"bigwigs\"},\n\t\t{\"blood_shield_tracker\"},\n\t\t{\"capping\"},\n\t\t{\"clique\"},\n\t\t{\"cool_line\"},\n\t\t{\"dbm\"},\n\t\t{\"details\"},\n\t\t{\"dominos\"},\n\t\t{\"flyout_button\"},\n\t\t{\"ls_toasts\"},\n\t\t{\"mage_nuggets\"},\n\t\t{\"my_role_play\"},\n\t\t{\"npcscan\"},\n\t\t{\"nug_running\"},\n\t\t{\"omen\"},\n\t\t{\"opie\"},\n\t\t{\"ovale\"},\n\t\t{\"postal\"},\n\t\t{\"recount\"},\n\t\t{\"rematch\"},\n\t\t{\"skada\"},\n\t\t{\"tiny_dps\"},\n\t\t{\"vanaskos\"},\n\t\t{\"weak_auras\"},\n\t}\n\n\tlocal last\n\tfor i = 1, #skinTable do\n\t\tlocal name = tostring(unpack(skinTable[i]))\n\t\tlocal addon\n\t\tif i == 1 then\n\t\t\taddon = ns.CreateCheckBox(parent, name)\n\t\t\taddon:SetPoint(\"LEFT\", ace3, \"RIGHT\", 320, 0)\n\t\t\tlast = ace3\n\t\telseif i % 2 == 0 then\n\t\t\taddon = ns.CreateCheckBox(parent, name)\n\t\t\taddon:SetPoint(\"TOPLEFT\", last, \"BOTTOMLEFT\", 0, 0)\n\t\t\tlast = addon\n\t\telse\n\t\t\taddon = ns.CreateCheckBox(parent, name)\n\t\t\taddon:SetPoint(\"LEFT\", last, \"RIGHT\", 320, 0)\n\t\tend\n\tend\nend\n\n-- Unit Frames\ndo\n\tlocal parent = ShestakUIOptionsPanel.unitframe\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_UF_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal own_color = ns.CreateCheckBox(parent, \"own_color\", L_GUI_UF_OWN_COLOR)\n\town_color:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal uf_color = ns.CreateColourPicker(parent, \"uf_color\", true, L_GUI_UF_UF_COLOR)\n\tuf_color:SetPoint(\"TOPLEFT\", own_color, \"BOTTOMLEFT\", 24, -4)\n\n\tlocal uf_color_bg = ns.CreateColourPicker(parent, \"uf_color_bg\", true)\n\tuf_color_bg:SetPoint(\"LEFT\", uf_color, \"RIGHT\", 248, 0)\n\n\tlocal enemy_health_color = ns.CreateCheckBox(parent, \"enemy_health_color\")\n\tenemy_health_color:SetPoint(\"TOPLEFT\", uf_color, \"BOTTOMLEFT\", -24, -4)\n\n\tlocal show_total_value = ns.CreateCheckBox(parent, \"show_total_value\", L_GUI_UF_TOTAL_VALUE)\n\tshow_total_value:SetPoint(\"TOPLEFT\", enemy_health_color, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal color_value = ns.CreateCheckBox(parent, \"color_value\", L_GUI_UF_COLOR_VALUE)\n\tcolor_value:SetPoint(\"TOPLEFT\", show_total_value, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal bar_color_value = ns.CreateCheckBox(parent, \"bar_color_value\", L_GUI_UF_BAR_COLOR_VALUE)\n\tbar_color_value:SetPoint(\"TOPLEFT\", color_value, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal lines = ns.CreateCheckBox(parent, \"lines\", L_GUI_UF_LINES)\n\tlines:SetPoint(\"TOPLEFT\", bar_color_value, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Cast bars\n\tlocal subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_CAST)\n\tsubheader:SetPoint(\"TOPLEFT\", lines, \"BOTTOMLEFT\", 0, -16)\n\n\tlocal unit_castbar = ns.CreateCheckBox(parent, \"unit_castbar\", L_GUI_UF_UNIT_CASTBAR)\n\tunit_castbar:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal castbar_icon = ns.CreateCheckBox(parent, \"castbar_icon\", L_GUI_UF_CASTBAR_ICON)\n\tcastbar_icon:SetPoint(\"TOPLEFT\", unit_castbar, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal castbar_latency = ns.CreateCheckBox(parent, \"castbar_latency\", L_GUI_UF_CASTBAR_LATENCY)\n\tcastbar_latency:SetPoint(\"TOPLEFT\", castbar_icon, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal castbar_ticks = ns.CreateCheckBox(parent, \"castbar_ticks\", L_GUI_UF_CASTBAR_TICKS)\n\tcastbar_ticks:SetPoint(\"TOPLEFT\", castbar_latency, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Frames\n\tlocal subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_FRAMES)\n\tsubheader:SetPoint(\"TOPLEFT\", castbar_ticks, \"BOTTOMLEFT\", 0, -16)\n\n\tlocal show_pet = ns.CreateCheckBox(parent, \"show_pet\", L_GUI_UF_SHOW_PET)\n\tshow_pet:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal show_focus = ns.CreateCheckBox(parent, \"show_focus\", L_GUI_UF_SHOW_FOCUS)\n\tshow_focus:SetPoint(\"TOPLEFT\", show_pet, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_target_target = ns.CreateCheckBox(parent, \"show_target_target\", L_GUI_UF_SHOW_TOT)\n\tshow_target_target:SetPoint(\"LEFT\", show_focus, \"RIGHT\", 248, 0)\n\n\tlocal show_boss = ns.CreateCheckBox(parent, \"show_boss\", L_GUI_UF_SHOW_BOSS)\n\tshow_boss:SetPoint(\"TOPLEFT\", show_focus, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal boss_on_right = ns.CreateCheckBox(parent, \"boss_on_right\", L_GUI_UF_BOSS_RIGHT)\n\tboss_on_right:SetPoint(\"LEFT\", show_boss, \"RIGHT\", 248, 0)\n\n\tlocal show_arena = ns.CreateCheckBox(parent, \"show_arena\", L_GUI_UF_SHOW_ARENA)\n\tshow_arena:SetPoint(\"TOPLEFT\", show_boss, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal arena_on_right = ns.CreateCheckBox(parent, \"arena_on_right\", L_GUI_UF_ARENA_RIGHT)\n\tarena_on_right:SetPoint(\"LEFT\", show_arena, \"RIGHT\", 248, 0)\n\n\t-- Panel 2\n\tlocal parent = ShestakUIOptionsPanel.unitframe2\n\n\tlocal icons_pvp = ns.CreateCheckBox(parent, \"icons_pvp\")\n\ticons_pvp:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal icons_combat = ns.CreateCheckBox(parent, \"icons_combat\", L_GUI_UF_ICONS_COMBAT)\n\ticons_combat:SetPoint(\"TOPLEFT\", icons_pvp, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal icons_resting = ns.CreateCheckBox(parent, \"icons_resting\", L_GUI_UF_ICONS_RESTING)\n\ticons_resting:SetPoint(\"TOPLEFT\", icons_combat, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Portraits\n\tlocal subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_PORTRAIT)\n\tsubheader:SetPoint(\"TOPLEFT\", icons_resting, \"BOTTOMLEFT\", 0, -16)\n\n\tlocal portrait_enable = ns.CreateCheckBox(parent, \"portrait_enable\", L_GUI_UF_PORTRAIT_ENABLE)\n\tportrait_enable:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal portrait_classcolor_border = ns.CreateCheckBox(parent, \"portrait_classcolor_border\", L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER)\n\tportrait_classcolor_border:SetPoint(\"TOPLEFT\", portrait_enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal portrait_type = ns.CreateDropDown(parent, \"portrait_type\", true, nil, PortraitTable)\n\tportrait_type:SetPoint(\"TOPLEFT\", portrait_classcolor_border, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal portrait_height = ns.CreateNumberSlider(parent, \"portrait_height\", nil, nil, 0, 190, 1, true, L_GUI_UF_PORTRAIT_HEIGHT)\n\tportrait_height:SetPoint(\"TOPLEFT\", portrait_type, \"BOTTOMLEFT\", 16, -16)\n\n\tlocal portrait_width = ns.CreateNumberSlider(parent, \"portrait_width\", nil, nil, 0, 130, 1, true, L_GUI_UF_PORTRAIT_WIDTH)\n\tportrait_width:SetPoint(\"LEFT\", portrait_height, \"RIGHT\", 120, 0)\n\n\t-- Plugins\n\tlocal subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_PLUGINS)\n\tsubheader:SetPoint(\"TOPLEFT\", portrait_height, \"BOTTOMLEFT\", 0, -16)\n\n\tlocal plugins_gcd = ns.CreateCheckBox(parent, \"plugins_gcd\", L_GUI_UF_PLUGINS_GCD)\n\tplugins_gcd:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal plugins_swing = ns.CreateCheckBox(parent, \"plugins_swing\", L_GUI_UF_PLUGINS_SWING)\n\tplugins_swing:SetPoint(\"TOPLEFT\", plugins_gcd, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_experience_bar = ns.CreateCheckBox(parent, \"plugins_experience_bar\")\n\tplugins_experience_bar:SetPoint(\"TOPLEFT\", plugins_swing, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_reputation_bar = ns.CreateCheckBox(parent, \"plugins_reputation_bar\")\n\tplugins_reputation_bar:SetPoint(\"TOPLEFT\", plugins_experience_bar, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_smooth_bar = ns.CreateCheckBox(parent, \"plugins_smooth_bar\", L_GUI_UF_PLUGINS_SMOOTH_BAR)\n\tplugins_smooth_bar:SetPoint(\"TOPLEFT\", plugins_reputation_bar, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_enemy_spec = ns.CreateCheckBox(parent, \"plugins_enemy_spec\", L_GUI_UF_PLUGINS_ENEMY_SPEC)\n\tplugins_enemy_spec:SetPoint(\"TOPLEFT\", plugins_smooth_bar, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_combat_feedback = ns.CreateCheckBox(parent, \"plugins_combat_feedback\", L_GUI_UF_PLUGINS_COMBAT_FEEDBACK)\n\tplugins_combat_feedback:SetPoint(\"TOPLEFT\", plugins_enemy_spec, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_fader = ns.CreateCheckBox(parent, \"plugins_fader\", L_GUI_UF_PLUGINS_FADER)\n\tplugins_fader:SetPoint(\"TOPLEFT\", plugins_combat_feedback, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_diminishing = ns.CreateCheckBox(parent, \"plugins_diminishing\", L_GUI_UF_PLUGINS_DIMINISHING)\n\tplugins_diminishing:SetPoint(\"TOPLEFT\", plugins_fader, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_power_prediction = ns.CreateCheckBox(parent, \"plugins_power_prediction\", L_GUI_UF_PLUGINS_POWER_PREDICTION)\n\tplugins_power_prediction:SetPoint(\"TOPLEFT\", plugins_diminishing, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_absorbs = ns.CreateCheckBox(parent, \"plugins_absorbs\")\n\tplugins_absorbs:SetPoint(\"TOPLEFT\", plugins_power_prediction, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Panel 3\n\tlocal parent = ShestakUIOptionsPanel.unitframe3\n\n\tlocal subheader = ns.addSubCategory(parent, L.unitframe_subheader_player_width)\n\tsubheader:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal player_width = ns.CreateNumberSlider(parent, \"player_width\", nil, nil, 105, 400, 1, true)\n\tplayer_width:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -28)\n\n\tlocal subheader = ns.addSubCategory(parent, L.unitframe_subheader_boss_width)\n\tsubheader:SetPoint(\"TOPLEFT\", player_width, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal boss_width = ns.CreateNumberSlider(parent, \"boss_width\", nil, nil, 105, 300, 1, true, L.unitframe_player_width)\n\tboss_width:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -28)\n\n\tlocal extra_height_auto = ns.CreateCheckBox(parent, \"extra_height_auto\")\n\textra_height_auto:SetPoint(\"TOPLEFT\", boss_width, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal extra_health_height = ns.CreateNumberSlider(parent, \"extra_health_height\", nil, nil, 0, 40, 1, true)\n\textra_health_height:SetPoint(\"TOPLEFT\", extra_height_auto, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal extra_power_height = ns.CreateNumberSlider(parent, \"extra_power_height\", nil, nil, 0, 20, 1, true)\n\textra_power_height:SetPoint(\"LEFT\", extra_health_height, \"RIGHT\", 120, 0)\n\n\tlocal subheader = ns.addSubCategory(parent, L.unitframe_subheader_castbar)\n\tsubheader:SetPoint(\"TOPLEFT\", extra_health_height, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal castbar_width = ns.CreateNumberSlider(parent, \"castbar_width\", nil, nil, 190, 450, 1, true, L.unitframe_player_width)\n\tcastbar_width:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -28)\n\n\tlocal castbar_height = ns.CreateNumberSlider(parent, \"castbar_height\", nil, nil, 16, 40, 1, true)\n\tcastbar_height:SetPoint(\"LEFT\", castbar_width, \"RIGHT\", 120, 0)\n\n\tlocal function toggleOptions()\n\t\tlocal shown = not extra_height_auto:GetChecked()\n\t\textra_health_height:SetShown(shown)\n\t\textra_power_height:SetShown(shown)\n\tend\n\n\textra_height_auto:HookScript(\"OnClick\", toggleOptions)\n\textra_health_height:HookScript(\"OnShow\", toggleOptions)\nend\n\n-- Unit Frames Class bar\ndo\n\tlocal parent = ShestakUIOptionsPanel.unitframe_class_bar\n\n\tlocal combo = ns.CreateCheckBox(parent, \"combo\", L_GUI_UF_PLUGINS_COMBO_BAR)\n\tcombo:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal combo_always = ns.CreateCheckBox(parent, \"combo_always\", L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS)\n\tcombo_always:SetPoint(\"TOPLEFT\", combo, \"BOTTOMLEFT\", 20, 0)\n\n\tlocal combo_old = ns.CreateCheckBox(parent, \"combo_old\", L_GUI_UF_PLUGINS_COMBO_BAR_OLD)\n\tcombo_old:SetPoint(\"TOPLEFT\", combo_always, \"BOTTOMLEFT\", 0, 0)\n\n\tcombo.children = {combo_always, combo_old}\n\n\tlocal arcane = ns.CreateCheckBox(parent, \"arcane\", L_GUI_UF_PLUGINS_ARCANE_BAR)\n\tarcane:SetPoint(\"TOPLEFT\", combo_old, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal chi = ns.CreateCheckBox(parent, \"chi\", L_GUI_UF_PLUGINS_CHI_BAR)\n\tchi:SetPoint(\"TOPLEFT\", arcane, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal essence = ns.CreateCheckBox(parent, \"essence\")\n\tessence:SetPoint(\"TOPLEFT\", chi, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal stagger = ns.CreateCheckBox(parent, \"stagger\", L_GUI_UF_PLUGINS_STAGGER_BAR)\n\tstagger:SetPoint(\"TOPLEFT\", essence, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal holy = ns.CreateCheckBox(parent, \"holy\", L_GUI_UF_PLUGINS_HOLY_BAR)\n\tholy:SetPoint(\"TOPLEFT\", stagger, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal shard = ns.CreateCheckBox(parent, \"shard\", L_GUI_UF_PLUGINS_SHARD_BAR)\n\tshard:SetPoint(\"TOPLEFT\", holy, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal rune = ns.CreateCheckBox(parent, \"rune\", L_GUI_UF_PLUGINS_RUNE_BAR)\n\trune:SetPoint(\"TOPLEFT\", shard, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal totem = ns.CreateCheckBox(parent, \"totem\", L_GUI_UF_PLUGINS_TOTEM_BAR)\n\ttotem:SetPoint(\"TOPLEFT\", rune, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal totem_other = ns.CreateCheckBox(parent, \"totem_other\")\n\ttotem_other:SetPoint(\"TOPLEFT\", totem, \"BOTTOMLEFT\", 20, 0)\n\n\ttotem.children = {totem_other}\nend\n\n-- Raid Frames\ndo\n\tlocal parent = ShestakUIOptionsPanel.raidframe\n\n\tlocal layout = ns.CreateDropDown(parent, \"layout\", true, nil, RaidTable)\n\tlayout:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", -16, 0)\n\n\tlocal show_party = ns.CreateCheckBox(parent, \"show_party\", L_GUI_UF_SHOW_PARTY)\n\tshow_party:SetPoint(\"TOPLEFT\", layout, \"BOTTOMLEFT\", 16, 0)\n\n\tlocal show_raid = ns.CreateCheckBox(parent, \"show_raid\", L_GUI_UF_SHOW_RAID)\n\tshow_raid:SetPoint(\"LEFT\", show_party, \"RIGHT\", 248, 0)\n\n\tlocal show_target = ns.CreateCheckBox(parent, \"show_target\")\n\tshow_target:SetPoint(\"TOPLEFT\", show_party, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_pet = ns.CreateCheckBox(parent, \"show_pet\")\n\tshow_pet:SetPoint(\"LEFT\", show_target, \"RIGHT\", 248, 0)\n\n\tlocal raid_tanks = ns.CreateCheckBox(parent, \"raid_tanks\", L_GUI_UF_SHOW_TANK)\n\traid_tanks:SetPoint(\"TOPLEFT\", show_target, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal raid_tanks_tt = ns.CreateCheckBox(parent, \"raid_tanks_tt\", L_GUI_UF_SHOW_TANK_TT)\n\traid_tanks_tt:SetPoint(\"LEFT\", raid_tanks, \"RIGHT\", 248, 0)\n\n\tlocal solo_mode = ns.CreateCheckBox(parent, \"solo_mode\", L_GUI_UF_SOLO_MODE)\n\tsolo_mode:SetPoint(\"TOPLEFT\", raid_tanks, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal player_in_party = ns.CreateCheckBox(parent, \"player_in_party\", L_GUI_UF_PLAYER_PARTY)\n\tplayer_in_party:SetPoint(\"LEFT\", solo_mode, \"RIGHT\", 248, 0)\n\n\tlocal raid_groups = ns.CreateNumberSlider(parent, \"raid_groups\", nil, nil, 1, 8, 1, true, L_GUI_UF_RAID_GROUP)\n\traid_groups:SetPoint(\"TOPLEFT\", solo_mode, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal auto_position = ns.CreateDropDown(parent, \"auto_position\", true, L.raidframe_auto_position, {\"DYNAMIC\", \"STATIC\", \"NONE\"})\n\tauto_position:SetPoint(\"TOPLEFT\", raid_groups, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal party_vertical = ns.CreateCheckBox(parent, \"party_vertical\", nil, L.raidframe_raid_groups_vertical_desc)\n\tparty_vertical:SetPoint(\"TOPLEFT\", auto_position, \"BOTTOMLEFT\", 16, 0)\n\n\tlocal raid_groups_vertical = ns.CreateCheckBox(parent, \"raid_groups_vertical\")\n\traid_groups_vertical:SetPoint(\"TOPLEFT\", party_vertical, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal vertical_health = ns.CreateCheckBox(parent, \"vertical_health\")\n\tvertical_health:SetPoint(\"TOPLEFT\", raid_groups_vertical, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal by_role = ns.CreateCheckBox(parent, \"by_role\", L_GUI_UF_BY_ROLE)\n\tby_role:SetPoint(\"TOPLEFT\", vertical_health, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal aggro_border = ns.CreateCheckBox(parent, \"aggro_border\", L_GUI_UF_AGGRO_BORDER)\n\taggro_border:SetPoint(\"TOPLEFT\", by_role, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal deficit_health = ns.CreateCheckBox(parent, \"deficit_health\", L_GUI_UF_DEFICIT_HEALTH)\n\tdeficit_health:SetPoint(\"TOPLEFT\", aggro_border, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hide_health_value = ns.CreateCheckBox(parent, \"hide_health_value\")\n\thide_health_value:SetPoint(\"TOPLEFT\", deficit_health, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal alpha_health = ns.CreateCheckBox(parent, \"alpha_health\", L_GUI_UF_ALPHA_HEALTH)\n\talpha_health:SetPoint(\"TOPLEFT\", hide_health_value, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_range = ns.CreateCheckBox(parent, \"show_range\", L_GUI_UF_SHOW_RANGE)\n\tshow_range:SetPoint(\"TOPLEFT\", alpha_health, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal range_alpha = ns.CreateNumberSlider(parent, \"range_alpha\", nil, nil, 0, 1, 0.05, true, L_GUI_UF_RANGE_ALPHA, L_GUI_UF_RANGE_ALPHA_DESC)\n\trange_alpha:SetPoint(\"TOPLEFT\", show_range, \"BOTTOMLEFT\", 0, -20)\n\n\t-- Icons\n\tlocal subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_ICONS)\n\tsubheader:SetPoint(\"TOPLEFT\", range_alpha, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal icons_role = ns.CreateCheckBox(parent, \"icons_role\", L_GUI_UF_ICONS_ROLE)\n\ticons_role:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal icons_raid_mark = ns.CreateCheckBox(parent, \"icons_raid_mark\", L_GUI_UF_ICONS_RAID_MARK)\n\ticons_raid_mark:SetPoint(\"LEFT\", icons_role, \"RIGHT\", 248, 0)\n\n\tlocal icons_ready_check = ns.CreateCheckBox(parent, \"icons_ready_check\", L_GUI_UF_ICONS_READY_CHECK)\n\ticons_ready_check:SetPoint(\"TOPLEFT\", icons_role, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal icons_leader = ns.CreateCheckBox(parent, \"icons_leader\", L_GUI_UF_ICONS_LEADER)\n\ticons_leader:SetPoint(\"LEFT\", icons_ready_check, \"RIGHT\", 248, 0)\n\n\tlocal icons_sumon = ns.CreateCheckBox(parent, \"icons_sumon\", L_GUI_UF_ICONS_SUMON)\n\ticons_sumon:SetPoint(\"TOPLEFT\", icons_ready_check, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal icons_phase = ns.CreateCheckBox(parent, \"icons_phase\")\n\ticons_phase:SetPoint(\"LEFT\", icons_sumon, \"RIGHT\", 248, 0)\n\n\t-- Panel 2\n\tlocal parent = ShestakUIOptionsPanel.raidframe2\n\n\tlocal plugins_aura_watch = ns.CreateCheckBox(parent, \"plugins_aura_watch\")\n\tplugins_aura_watch:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ListButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tListButton:SetPoint(\"LEFT\", plugins_aura_watch, \"RIGHT\", 400, 0)\n\tListButton:SetSize(100, 23)\n\tListButton:SetText(ADD)\n\tListButton:SetWidth(ListButton.Text:GetWidth() + 15)\n\tListButton:SetScript(\"OnClick\", function()\n\t\tif not C.options[\"raidframe\"] then\n\t\t\tC.options[\"raidframe\"] = {}\n\t\tend\n\t\tif not C.options[\"raidframe\"][\"plugins_aura_watch_list\"] then\n\t\t\tC.options[\"raidframe\"][\"plugins_aura_watch_list\"] = {}\n\t\tend\n\t\tBuildSpellList(C.options[\"raidframe\"][\"plugins_aura_watch_list\"])\n\tend)\n\ttinsert(ns.buttons, ListButton)\n\n\tlocal function toggleListButton()\n\t\tlocal shown = plugins_aura_watch:GetChecked()\n\t\tListButton:SetEnabled(shown)\n\tend\n\n\tplugins_aura_watch:HookScript(\"OnClick\", toggleListButton)\n\tListButton:HookScript(\"OnShow\", toggleListButton)\n\n\tlocal plugins_aura_watch_timer = ns.CreateCheckBox(parent, \"plugins_aura_watch_timer\")\n\tplugins_aura_watch_timer:SetPoint(\"TOPLEFT\", plugins_aura_watch, \"BOTTOMLEFT\", 20, 0)\n\n\tlocal plugins_debuffhighlight_icon = ns.CreateCheckBox(parent, \"plugins_debuffhighlight_icon\")\n\tplugins_debuffhighlight_icon:SetPoint(\"TOPLEFT\", plugins_aura_watch_timer, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_pvp_debuffs = ns.CreateCheckBox(parent, \"plugins_pvp_debuffs\")\n\tplugins_pvp_debuffs:SetPoint(\"TOPLEFT\", plugins_debuffhighlight_icon, \"BOTTOMLEFT\", 0, 0)\n\n\tplugins_aura_watch.children = {plugins_aura_watch_timer, plugins_debuffhighlight_icon, plugins_pvp_debuffs}\n\n\tlocal plugins_healcomm = ns.CreateCheckBox(parent, \"plugins_healcomm\", L_GUI_UF_PLUGINS_HEALCOMM)\n\tplugins_healcomm:SetPoint(\"TOPLEFT\", plugins_pvp_debuffs, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal plugins_over_absorb = ns.CreateCheckBox(parent, \"plugins_over_absorb\")\n\tplugins_over_absorb:SetPoint(\"TOPLEFT\", plugins_healcomm, \"BOTTOMLEFT\", 20, 0)\n\n\tlocal plugins_over_heal_absorb = ns.CreateCheckBox(parent, \"plugins_over_heal_absorb\")\n\tplugins_over_heal_absorb:SetPoint(\"TOPLEFT\", plugins_over_absorb, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal plugins_auto_resurrection = ns.CreateCheckBox(parent, \"plugins_auto_resurrection\")\n\tplugins_auto_resurrection:SetPoint(\"TOPLEFT\", plugins_over_heal_absorb, \"BOTTOMLEFT\", -20, 0)\n\n\t-- Heal layout size\n\tlocal subheader = ns.addSubCategory(parent, L.raidframe_subheader_heal_size)\n\tsubheader:SetPoint(\"TOPLEFT\", plugins_auto_resurrection, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal heal_party_width = ns.CreateNumberSlider(parent, \"heal_party_width\", nil, nil, 50, 200, 1, true, L.raidframe_dps_party_width)\n\theal_party_width:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal heal_party_height = ns.CreateNumberSlider(parent, \"heal_party_height\", nil, nil, 20, 200, 1, true, L.raidframe_dps_party_height)\n\theal_party_height:SetPoint(\"LEFT\", heal_party_width, \"RIGHT\", 120, 0)\n\n\tlocal heal_raid_width = ns.CreateNumberSlider(parent, \"heal_raid_width\", nil, nil, 50, 200, 1, true, L.raidframe_dps_raid_width)\n\theal_raid_width:SetPoint(\"TOPLEFT\", heal_party_width, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal heal_raid_height = ns.CreateNumberSlider(parent, \"heal_raid_height\", nil, nil, 20, 200, 1, true, L.raidframe_dps_raid_height)\n\theal_raid_height:SetPoint(\"LEFT\", heal_raid_width, \"RIGHT\", 120, 0)\n\n\tlocal heal_party_power_height = ns.CreateNumberSlider(parent, \"heal_party_power_height\", nil, nil, 0, 10, 1, true, L.raidframe_dps_party_power_height)\n\theal_party_power_height:SetPoint(\"TOPLEFT\", heal_raid_width, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal heal_raid_power_height = ns.CreateNumberSlider(parent, \"heal_raid_power_height\", nil, nil, 0, 10, 1, true, L.raidframe_dps_raid_power_height)\n\theal_raid_power_height:SetPoint(\"LEFT\", heal_party_power_height, \"RIGHT\", 120, 0)\n\n\t-- DPS layout size\n\tlocal subheader = ns.addSubCategory(parent, L.raidframe_subheader_dps_size)\n\tsubheader:SetPoint(\"TOPLEFT\", heal_party_power_height, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal dps_party_width = ns.CreateNumberSlider(parent, \"dps_party_width\", nil, nil, 80, 300, 1, true)\n\tdps_party_width:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal dps_party_height = ns.CreateNumberSlider(parent, \"dps_party_height\", nil, nil, 15, 60, 1, true)\n\tdps_party_height:SetPoint(\"LEFT\", dps_party_width, \"RIGHT\", 120, 0)\n\n\tlocal dps_raid_width = ns.CreateNumberSlider(parent, \"dps_raid_width\", nil, nil, 80, 200, 1, true)\n\tdps_raid_width:SetPoint(\"TOPLEFT\", dps_party_width, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal dps_raid_height = ns.CreateNumberSlider(parent, \"dps_raid_height\", nil, nil, 15, 40, 1, true)\n\tdps_raid_height:SetPoint(\"LEFT\", dps_raid_width, \"RIGHT\", 120, 0)\n\n\tlocal dps_party_power_height = ns.CreateNumberSlider(parent, \"dps_party_power_height\", nil, nil, 0, 10, 1, true)\n\tdps_party_power_height:SetPoint(\"TOPLEFT\", dps_raid_width, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal dps_raid_power_height = ns.CreateNumberSlider(parent, \"dps_raid_power_height\", nil, nil, 0, 10, 1, true)\n\tdps_raid_power_height:SetPoint(\"LEFT\", dps_party_power_height, \"RIGHT\", 120, 0)\nend\n\n-- Auras/Buffs/Debuffs\ndo\n\tlocal parent = ShestakUIOptionsPanel.aura\n\n\tlocal show_spiral = ns.CreateCheckBox(parent, \"show_spiral\", L_GUI_AURA_SHOW_SPIRAL)\n\tshow_spiral:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_timer = ns.CreateCheckBox(parent, \"show_timer\", L_GUI_AURA_SHOW_TIMER)\n\tshow_timer:SetPoint(\"TOPLEFT\", show_spiral, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal cast_by = ns.CreateCheckBox(parent, \"cast_by\", L_GUI_AURA_CAST_BY)\n\tcast_by:SetPoint(\"TOPLEFT\", show_timer, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Buffs\n\tlocal subheader = ns.addSubCategory(parent, L.aura_subheader_buffs)\n\tsubheader:SetPoint(\"TOPLEFT\", cast_by, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal player_auras = ns.CreateCheckBox(parent, \"player_auras\", L_GUI_AURA_PLAYER_AURAS)\n\tplayer_auras:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal classcolor_border = ns.CreateCheckBox(parent, \"classcolor_border\", L_GUI_AURA_CLASSCOLOR_BORDER)\n\tclasscolor_border:SetPoint(\"TOPLEFT\", player_auras, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal player_buff_size = ns.CreateNumberSlider(parent, \"player_buff_size\", nil, nil, 0, 50, 1, true, L_GUI_AURA_PLAYER_BUFF_SIZE, L_GUI_AURA_PLAYER_BUFF_SIZE_DESC)\n\tplayer_buff_size:SetPoint(\"TOPLEFT\", classcolor_border, \"BOTTOMLEFT\", 0, -20)\n\n\t-- Debuffs\n\tlocal subheader = ns.addSubCategory(parent, L.aura_subheader_debuffs)\n\tsubheader:SetPoint(\"TOPLEFT\", player_buff_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal target_auras = ns.CreateCheckBox(parent, \"target_auras\", L_GUI_AURA_TARGET_AURAS)\n\ttarget_auras:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal tot_debuffs = ns.CreateCheckBox(parent, \"tot_debuffs\", L_GUI_AURA_TOT_DEBUFFS)\n\ttot_debuffs:SetPoint(\"LEFT\", target_auras, \"RIGHT\", 320, 0)\n\n\tlocal focus_debuffs = ns.CreateCheckBox(parent, \"focus_debuffs\", L_GUI_AURA_FOCUS_DEBUFFS)\n\tfocus_debuffs:SetPoint(\"TOPLEFT\", target_auras, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal fot_debuffs = ns.CreateCheckBox(parent, \"fot_debuffs\", L_GUI_AURA_FOT_DEBUFFS)\n\tfot_debuffs:SetPoint(\"LEFT\", focus_debuffs, \"RIGHT\", 320, 0)\n\n\tlocal pet_debuffs = ns.CreateCheckBox(parent, \"pet_debuffs\", L_GUI_AURA_PET_DEBUFFS)\n\tpet_debuffs:SetPoint(\"TOPLEFT\", focus_debuffs, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal player_aura_only = ns.CreateCheckBox(parent, \"player_aura_only\", L_GUI_AURA_PLAYER_AURA_ONLY)\n\tplayer_aura_only:SetPoint(\"TOPLEFT\", pet_debuffs, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal debuff_color_type = ns.CreateCheckBox(parent, \"debuff_color_type\", L_GUI_AURA_DEBUFF_COLOR_TYPE)\n\tdebuff_color_type:SetPoint(\"TOPLEFT\", player_aura_only, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal debuff_size = ns.CreateNumberSlider(parent, \"debuff_size\", nil, nil, 0, 50, 1, true)\n\tdebuff_size:SetPoint(\"TOPLEFT\", debuff_color_type, \"BOTTOMLEFT\", 0, -20)\n\n\t-- Boss auras\n\tlocal subheader = ns.addSubCategory(parent, L.aura_subheader_boss)\n\tsubheader:SetPoint(\"TOPLEFT\", debuff_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal boss_auras = ns.CreateCheckBox(parent, \"boss_auras\", ENABLE)\n\tboss_auras:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal boss_debuffs = ns.CreateNumberSlider(parent, \"boss_debuffs\", nil, nil, 0, 5, 1, true, L_GUI_UF_BOSS_DEBUFFS, L_GUI_UF_BOSS_DEBUFFS_DESC)\n\tboss_debuffs:SetPoint(\"TOPLEFT\", boss_auras, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal boss_buffs = ns.CreateNumberSlider(parent, \"boss_buffs\", nil, nil, 0, 3, 1, true, L_GUI_UF_BOSS_BUFFS, L_GUI_UF_BOSS_BUFFS_DESC)\n\tboss_buffs:SetPoint(\"LEFT\", boss_debuffs, \"RIGHT\", 120, 0)\nend\n\n-- ActionBar\ndo\n\tlocal parent = ShestakUIOptionsPanel.actionbar\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_ACTIONBAR_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hotkey = ns.CreateCheckBox(parent, \"hotkey\", L_GUI_ACTIONBAR_HOTKEY)\n\thotkey:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal macro = ns.CreateCheckBox(parent, \"macro\", L_GUI_ACTIONBAR_MACRO)\n\tmacro:SetPoint(\"TOPLEFT\", hotkey, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_grid = ns.CreateCheckBox(parent, \"show_grid\", L_GUI_ACTIONBAR_GRID)\n\tshow_grid:SetPoint(\"TOPLEFT\", macro, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal button_size = ns.CreateNumberSlider(parent, \"button_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbutton_size:SetPoint(\"TOPLEFT\", show_grid, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal button_space = ns.CreateNumberSlider(parent, \"button_space\", nil, nil, 0, 10, 1, true, L_GUI_ACTIONBAR_BUTTON_SPACE)\n\tbutton_space:SetPoint(\"LEFT\", button_size, \"RIGHT\", 120, 0)\n\n\tlocal split_bars = ns.CreateCheckBox(parent, \"split_bars\", L_GUI_ACTIONBAR_SPLIT_BARS)\n\tsplit_bars:SetPoint(\"TOPLEFT\", button_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal classcolor_border = ns.CreateCheckBox(parent, \"classcolor_border\", L_GUI_ACTIONBAR_CLASSCOLOR_BORDER)\n\tclasscolor_border:SetPoint(\"TOPLEFT\", split_bars, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hide_highlight = ns.CreateCheckBox(parent, \"hide_highlight\", L_GUI_ACTIONBAR_HIDE_HIGHLIGHT)\n\thide_highlight:SetPoint(\"TOPLEFT\", classcolor_border, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal toggle_mode = ns.CreateCheckBox(parent, \"toggle_mode\")\n\ttoggle_mode:SetPoint(\"TOPLEFT\", hide_highlight, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal bottombars = ns.CreateNumberSlider(parent, \"bottombars\", nil, nil, 1, 3, 1, true, L_GUI_ACTIONBAR_BOTTOMBARS)\n\tbottombars:SetPoint(\"TOPLEFT\", toggle_mode, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal rightbars = ns.CreateNumberSlider(parent, \"rightbars\", nil, nil, 0, 3, 1, true, L_GUI_ACTIONBAR_RIGHTBARS)\n\trightbars:SetPoint(\"LEFT\", bottombars, \"RIGHT\", 120, 0)\n\n\tlocal bottombars_mouseover = ns.CreateCheckBox(parent, \"bottombars_mouseover\")\n\tbottombars_mouseover:SetPoint(\"TOPLEFT\", bottombars, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal rightbars_mouseover = ns.CreateCheckBox(parent, \"rightbars_mouseover\", L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER)\n\trightbars_mouseover:SetPoint(\"TOPLEFT\", bottombars_mouseover, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal petbar_hide = ns.CreateCheckBox(parent, \"petbar_hide\", L_GUI_ACTIONBAR_PETBAR_HIDE)\n\tpetbar_hide:SetPoint(\"TOPLEFT\", rightbars_mouseover, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal petbar_horizontal = ns.CreateCheckBox(parent, \"petbar_horizontal\", L_GUI_ACTIONBAR_PETBAR_HORIZONTAL)\n\tpetbar_horizontal:SetPoint(\"TOPLEFT\", petbar_hide, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal petbar_mouseover = ns.CreateCheckBox(parent, \"petbar_mouseover\", L_GUI_ACTIONBAR_PETBAR_MOUSEOVER)\n\tpetbar_mouseover:SetPoint(\"TOPLEFT\", petbar_horizontal, \"BOTTOMLEFT\", 20, 0)\n\n\t-- petbar_horizontal.children = {petbar_mouseover}\n\n\tlocal stancebar_hide = ns.CreateCheckBox(parent, \"stancebar_hide\", L_GUI_ACTIONBAR_STANCEBAR_HIDE)\n\tstancebar_hide:SetPoint(\"TOPLEFT\", petbar_mouseover, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal stancebar_horizontal = ns.CreateCheckBox(parent, \"stancebar_horizontal\", L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL)\n\tstancebar_horizontal:SetPoint(\"TOPLEFT\", stancebar_hide, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal stancebar_mouseover = ns.CreateCheckBox(parent, \"stancebar_mouseover\", L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER)\n\tstancebar_mouseover:SetPoint(\"TOPLEFT\", stancebar_horizontal, \"BOTTOMLEFT\", 20, 0)\n\n\t-- stancebar_horizontal.children = {stancebar_mouseover}\n\n\tlocal micromenu = ns.CreateCheckBox(parent, \"micromenu\", L_GUI_ACTIONBAR_MICROMENU)\n\tmicromenu:SetPoint(\"TOPLEFT\", stancebar_mouseover, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal micromenu_mouseover = ns.CreateCheckBox(parent, \"micromenu_mouseover\", L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER)\n\tmicromenu_mouseover:SetPoint(\"TOPLEFT\", micromenu, \"BOTTOMLEFT\", 20, 0)\n\n\tmicromenu.children = {micromenu_mouseover}\n\n\t-- Panel 2\n\tlocal parent = ShestakUIOptionsPanel.actionbar2\n\n\tlocal editor = ns.CreateCheckBox(parent, \"editor\")\n\teditor:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Bar 1\n\tlocal subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR..\" 1\")\n\tsubheader:SetPoint(\"TOPLEFT\", editor, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar1_num = ns.CreateNumberSlider(parent, \"bar1_num\", nil, nil, 0, 12, 1, true)\n\tbar1_num:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal bar1_row = ns.CreateNumberSlider(parent, \"bar1_row\", nil, nil, 1, 12, 1, true)\n\tbar1_row:SetPoint(\"LEFT\", bar1_num, \"RIGHT\", 120, 0)\n\n\tlocal bar1_size = ns.CreateNumberSlider(parent, \"bar1_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbar1_size:SetPoint(\"TOPLEFT\", bar1_num, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar1_mouseover = ns.CreateCheckBox(parent, \"bar1_mouseover\")\n\tbar1_mouseover:SetPoint(\"LEFT\", bar1_size, \"RIGHT\", 130, 0)\n\n\t-- Bar 2\n\tlocal subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR..\" 2\")\n\tsubheader:SetPoint(\"TOPLEFT\", bar1_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar2_num = ns.CreateNumberSlider(parent, \"bar2_num\", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)\n\tbar2_num:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal bar2_row = ns.CreateNumberSlider(parent, \"bar2_row\", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)\n\tbar2_row:SetPoint(\"LEFT\", bar2_num, \"RIGHT\", 120, 0)\n\n\tlocal bar2_size = ns.CreateNumberSlider(parent, \"bar2_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbar2_size:SetPoint(\"TOPLEFT\", bar2_num, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar2_mouseover = ns.CreateCheckBox(parent, \"bar2_mouseover\", L.actionbar_bar1_mouseover)\n\tbar2_mouseover:SetPoint(\"LEFT\", bar2_size, \"RIGHT\", 130, 0)\n\n\t-- Bar 3\n\tlocal subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR..\" 3\")\n\tsubheader:SetPoint(\"TOPLEFT\", bar2_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar3_num = ns.CreateNumberSlider(parent, \"bar3_num\", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)\n\tbar3_num:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal bar3_row = ns.CreateNumberSlider(parent, \"bar3_row\", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)\n\tbar3_row:SetPoint(\"LEFT\", bar3_num, \"RIGHT\", 120, 0)\n\n\tlocal bar3_size = ns.CreateNumberSlider(parent, \"bar3_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbar3_size:SetPoint(\"TOPLEFT\", bar3_num, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar3_mouseover = ns.CreateCheckBox(parent, \"bar3_mouseover\", L.actionbar_bar1_mouseover)\n\tbar3_mouseover:SetPoint(\"LEFT\", bar3_size, \"RIGHT\", 130, 0)\n\n\t-- Bar 4\n\tlocal subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR..\" 4\")\n\tsubheader:SetPoint(\"TOPLEFT\", bar3_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar4_num = ns.CreateNumberSlider(parent, \"bar4_num\", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)\n\tbar4_num:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal bar4_row = ns.CreateNumberSlider(parent, \"bar4_row\", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)\n\tbar4_row:SetPoint(\"LEFT\", bar4_num, \"RIGHT\", 120, 0)\n\n\tlocal bar4_size = ns.CreateNumberSlider(parent, \"bar4_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbar4_size:SetPoint(\"TOPLEFT\", bar4_num, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar4_mouseover = ns.CreateCheckBox(parent, \"bar4_mouseover\", L.actionbar_bar1_mouseover)\n\tbar4_mouseover:SetPoint(\"LEFT\", bar4_size, \"RIGHT\", 130, 0)\n\n\t-- Bar 5\n\tlocal subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR..\" 5\")\n\tsubheader:SetPoint(\"TOPLEFT\", bar4_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar5_num = ns.CreateNumberSlider(parent, \"bar5_num\", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)\n\tbar5_num:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal bar5_row = ns.CreateNumberSlider(parent, \"bar5_row\", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)\n\tbar5_row:SetPoint(\"LEFT\", bar5_num, \"RIGHT\", 120, 0)\n\n\tlocal bar5_size = ns.CreateNumberSlider(parent, \"bar5_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbar5_size:SetPoint(\"TOPLEFT\", bar5_num, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar5_mouseover = ns.CreateCheckBox(parent, \"bar5_mouseover\", L.actionbar_bar1_mouseover)\n\tbar5_mouseover:SetPoint(\"LEFT\", bar5_size, \"RIGHT\", 130, 0)\n\n\t-- Panel 2\n\tlocal parent = ShestakUIOptionsPanel.actionbar3\n\n\t-- Bar 6\n\tlocal subheader = ns.addSubCategory(parent, BINDING_HEADER_ACTIONBAR..\" 6\")\n\tsubheader:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar6_num = ns.CreateNumberSlider(parent, \"bar6_num\", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)\n\tbar6_num:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal bar6_row = ns.CreateNumberSlider(parent, \"bar6_row\", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)\n\tbar6_row:SetPoint(\"LEFT\", bar6_num, \"RIGHT\", 120, 0)\n\n\tlocal bar6_size = ns.CreateNumberSlider(parent, \"bar6_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbar6_size:SetPoint(\"TOPLEFT\", bar6_num, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar6_mouseover = ns.CreateCheckBox(parent, \"bar6_mouseover\", L.actionbar_bar1_mouseover)\n\tbar6_mouseover:SetPoint(\"LEFT\", bar6_size, \"RIGHT\", 130, 0)\n\n\t-- Bar 7\n\tlocal subheader = ns.addSubCategory(parent, BINDING_HEADER_ACTIONBAR..\" 7\")\n\tsubheader:SetPoint(\"TOPLEFT\", bar6_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar7_enable = ns.CreateCheckBox(parent, \"bar7_enable\", ENABLE)\n\tbar7_enable:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar7_num = ns.CreateNumberSlider(parent, \"bar7_num\", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)\n\tbar7_num:SetPoint(\"TOPLEFT\", bar7_enable, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar7_row = ns.CreateNumberSlider(parent, \"bar7_row\", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)\n\tbar7_row:SetPoint(\"LEFT\", bar7_num, \"RIGHT\", 120, 0)\n\n\tlocal bar7_size = ns.CreateNumberSlider(parent, \"bar7_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbar7_size:SetPoint(\"TOPLEFT\", bar7_num, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar7_mouseover = ns.CreateCheckBox(parent, \"bar7_mouseover\", L.actionbar_bar1_mouseover)\n\tbar7_mouseover:SetPoint(\"LEFT\", bar7_size, \"RIGHT\", 130, 0)\n\n\t-- Bar 8\n\tlocal subheader = ns.addSubCategory(parent, BINDING_HEADER_ACTIONBAR..\" 8\")\n\tsubheader:SetPoint(\"TOPLEFT\", bar7_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar8_enable = ns.CreateCheckBox(parent, \"bar8_enable\", ENABLE)\n\tbar8_enable:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bar8_num = ns.CreateNumberSlider(parent, \"bar8_num\", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)\n\tbar8_num:SetPoint(\"TOPLEFT\", bar8_enable, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar8_row = ns.CreateNumberSlider(parent, \"bar8_row\", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)\n\tbar8_row:SetPoint(\"LEFT\", bar8_num, \"RIGHT\", 120, 0)\n\n\tlocal bar8_size = ns.CreateNumberSlider(parent, \"bar8_size\", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)\n\tbar8_size:SetPoint(\"TOPLEFT\", bar8_num, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar8_mouseover = ns.CreateCheckBox(parent, \"bar8_mouseover\", L.actionbar_bar1_mouseover)\n\tbar8_mouseover:SetPoint(\"LEFT\", bar8_size, \"RIGHT\", 130, 0)\nend\n\n-- Tooltip\ndo\n\tlocal parent = ShestakUIOptionsPanel.tooltip\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\")\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal shift_modifer = ns.CreateCheckBox(parent, \"shift_modifer\")\n\tshift_modifer:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal cursor = ns.CreateCheckBox(parent, \"cursor\")\n\tcursor:SetPoint(\"TOPLEFT\", shift_modifer, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal item_icon = ns.CreateCheckBox(parent, \"item_icon\")\n\titem_icon:SetPoint(\"TOPLEFT\", cursor, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal health_value = ns.CreateCheckBox(parent, \"health_value\")\n\thealth_value:SetPoint(\"TOPLEFT\", item_icon, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hidebuttons = ns.CreateCheckBox(parent, \"hidebuttons\")\n\thidebuttons:SetPoint(\"TOPLEFT\", health_value, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hide_combat = ns.CreateCheckBox(parent, \"hide_combat\")\n\thide_combat:SetPoint(\"TOPLEFT\", hidebuttons, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Plugins\n\tlocal subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_PLUGINS)\n\tsubheader:SetPoint(\"TOPLEFT\", hide_combat, \"BOTTOMLEFT\", 0, -16)\n\n\tlocal title = ns.CreateCheckBox(parent, \"title\")\n\ttitle:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal realm = ns.CreateCheckBox(parent, \"realm\")\n\trealm:SetPoint(\"LEFT\", title, \"RIGHT\", 320, 0)\n\n\tlocal target = ns.CreateCheckBox(parent, \"target\")\n\ttarget:SetPoint(\"TOPLEFT\", title, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal rank = ns.CreateCheckBox(parent, \"rank\")\n\trank:SetPoint(\"LEFT\", target, \"RIGHT\", 320, 0)\n\n\tlocal talents = ns.CreateCheckBox(parent, \"talents\")\n\ttalents:SetPoint(\"TOPLEFT\", target, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal average_lvl = ns.CreateCheckBox(parent, \"average_lvl\", STAT_AVERAGE_ITEM_LEVEL)\n\taverage_lvl:SetPoint(\"LEFT\", talents, \"RIGHT\", 320, 0)\n\n\tlocal show_shift = ns.CreateCheckBox(parent, \"show_shift\")\n\tshow_shift:SetPoint(\"TOPLEFT\", talents, \"BOTTOMLEFT\", 20, 0)\n\n\tlocal raid_icon = ns.CreateCheckBox(parent, \"raid_icon\")\n\traid_icon:SetPoint(\"TOPLEFT\", show_shift, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal unit_role = ns.CreateCheckBox(parent, \"unit_role\")\n\tunit_role:SetPoint(\"LEFT\", raid_icon, \"RIGHT\", 320, 0)\n\n\tlocal who_targetting = ns.CreateCheckBox(parent, \"who_targetting\")\n\twho_targetting:SetPoint(\"TOPLEFT\", raid_icon, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal spell_id = ns.CreateCheckBox(parent, \"spell_id\")\n\tspell_id:SetPoint(\"TOPLEFT\", who_targetting, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal item_count = ns.CreateCheckBox(parent, \"item_count\")\n\titem_count:SetPoint(\"TOPLEFT\", spell_id, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal achievements = ns.CreateCheckBox(parent, \"achievements\")\n\tachievements:SetPoint(\"TOPLEFT\", item_count, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal instance_lock = ns.CreateCheckBox(parent, \"instance_lock\")\n\tinstance_lock:SetPoint(\"TOPLEFT\", achievements, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal mount = ns.CreateCheckBox(parent, \"mount\")\n\tmount:SetPoint(\"TOPLEFT\", instance_lock, \"BOTTOMLEFT\", 0, 0)\nend\n\n-- Chat\ndo\n\tlocal parent = ShestakUIOptionsPanel.chat\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\")\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal width = ns.CreateNumberSlider(parent, \"width\", nil, nil, 0, 750, 1, true)\n\twidth:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal height = ns.CreateNumberSlider(parent, \"height\", nil, nil, 0, 300, 1, true)\n\theight:SetPoint(\"LEFT\", width, \"RIGHT\", 120, 0)\n\n\tlocal background = ns.CreateCheckBox(parent, \"background\")\n\tbackground:SetPoint(\"TOPLEFT\", width, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal background_alpha = ns.CreateNumberSlider(parent, \"background_alpha\", nil, nil, 0, 1, 0.05, true)\n\tbackground_alpha:SetPoint(\"TOPLEFT\", background, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal filter = ns.CreateCheckBox(parent, \"filter\")\n\tfilter:SetPoint(\"TOPLEFT\", background_alpha, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal spam = ns.CreateCheckBox(parent, \"spam\")\n\tspam:SetPoint(\"TOPLEFT\", filter, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal spam_list = ns.CreateEditBox(parent, \"spam_list\", true)\n\tspam_list:SetPoint(\"TOPLEFT\", spam, \"BOTTOMLEFT\", 6, -10)\n\tspam_list:SetWidth(200)\n\tspam_list:SetMaxLetters(40)\n\n\tlocal chat_bar = ns.CreateCheckBox(parent, \"chat_bar\")\n\tchat_bar:SetPoint(\"TOPLEFT\", spam_list, \"BOTTOMLEFT\", -6, -10)\n\n\tlocal chat_bar_mouseover = ns.CreateCheckBox(parent, \"chat_bar_mouseover\")\n\tchat_bar_mouseover:SetPoint(\"TOPLEFT\", chat_bar, \"BOTTOMLEFT\", 20, 0)\n\n\tchat_bar.children = {chat_bar_mouseover}\n\n\tlocal whisp_sound = ns.CreateCheckBox(parent, \"whisp_sound\")\n\twhisp_sound:SetPoint(\"TOPLEFT\", chat_bar_mouseover, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal combatlog = ns.CreateCheckBox(parent, \"combatlog\")\n\tcombatlog:SetPoint(\"TOPLEFT\", whisp_sound, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal tabs_mouseover = ns.CreateCheckBox(parent, \"tabs_mouseover\")\n\ttabs_mouseover:SetPoint(\"TOPLEFT\", combatlog, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal sticky = ns.CreateCheckBox(parent, \"sticky\")\n\tsticky:SetPoint(\"TOPLEFT\", tabs_mouseover, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal damage_meter_spam = ns.CreateCheckBox(parent, \"damage_meter_spam\")\n\tdamage_meter_spam:SetPoint(\"TOPLEFT\", sticky, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal loot_icons = ns.CreateCheckBox(parent, \"loot_icons\")\n\tloot_icons:SetPoint(\"TOPLEFT\", damage_meter_spam, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal role_icons = ns.CreateCheckBox(parent, \"role_icons\", L.tooltip_unit_role)\n\trole_icons:SetPoint(\"TOPLEFT\", loot_icons, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal history = ns.CreateCheckBox(parent, \"history\", HISTORY)\n\thistory:SetPoint(\"TOPLEFT\", role_icons, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal hide_combat = ns.CreateCheckBox(parent, \"hide_combat\")\n\thide_combat:SetPoint(\"TOPLEFT\", history, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal custom_time_color = ns.CreateCheckBox(parent, \"custom_time_color\")\n\tcustom_time_color:SetPoint(\"TOPLEFT\", hide_combat, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal time_color = ns.CreateColourPicker(parent, \"time_color\", true)\n\ttime_color:SetPoint(\"TOPLEFT\", custom_time_color, \"BOTTOMLEFT\", 24, -4)\nend\n\n-- Nameplate\ndo\n\tlocal parent = ShestakUIOptionsPanel.nameplate\n\n\tlocal multScale = 768 / select(2, GetPhysicalScreenSize())\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_NAMEPLATE_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal width = ns.CreateNumberSlider(parent, \"width\", nil, nil, 0, 150 / multScale, 1, true, L_GUI_NAMEPLATE_WIDTH)\n\twidth:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal height = ns.CreateNumberSlider(parent, \"height\", nil, nil, 0, 20 / multScale, 1, true, L_GUI_NAMEPLATE_HEIGHT)\n\theight:SetPoint(\"LEFT\", width, \"RIGHT\", 120, 0)\n\n\tlocal ad_width = ns.CreateNumberSlider(parent, \"ad_width\", nil, nil, 0, 80 / multScale, 1, true)\n\tad_width:SetPoint(\"TOPLEFT\", width, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal ad_height = ns.CreateNumberSlider(parent, \"ad_height\", nil, nil, 0, 15 / multScale, 1, true)\n\tad_height:SetPoint(\"LEFT\", ad_width, \"RIGHT\", 120, 0)\n\n\tlocal alpha = ns.CreateNumberSlider(parent, \"alpha\", nil, nil, 0, 1, 0.05, true)\n\talpha:SetPoint(\"TOPLEFT\", ad_width, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal combat = ns.CreateCheckBox(parent, \"combat\", L_GUI_NAMEPLATE_COMBAT)\n\tcombat:SetPoint(\"TOPLEFT\", alpha, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal health_value = ns.CreateCheckBox(parent, \"health_value\", L_GUI_NAMEPLATE_HEALTH)\n\thealth_value:SetPoint(\"TOPLEFT\", combat, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_castbar_name = ns.CreateCheckBox(parent, \"show_castbar_name\", L_GUI_NAMEPLATE_CASTBAR_NAME)\n\tshow_castbar_name:SetPoint(\"TOPLEFT\", health_value, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal class_icons = ns.CreateCheckBox(parent, \"class_icons\", L_GUI_NAMEPLATE_CLASS_ICON)\n\tclass_icons:SetPoint(\"TOPLEFT\", show_castbar_name, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal name_abbrev = ns.CreateCheckBox(parent, \"name_abbrev\", L_GUI_NAMEPLATE_NAME_ABBREV)\n\tname_abbrev:SetPoint(\"TOPLEFT\", class_icons, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal short_name = ns.CreateCheckBox(parent, \"short_name\")\n\tshort_name:SetPoint(\"TOPLEFT\", name_abbrev, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal clamp = ns.CreateCheckBox(parent, \"clamp\")\n\tclamp:SetPoint(\"TOPLEFT\", short_name, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal track_debuffs = ns.CreateCheckBox(parent, \"track_debuffs\", L_GUI_NAMEPLATE_SHOW_DEBUFFS)\n\ttrack_debuffs:SetPoint(\"TOPLEFT\", clamp, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ListButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tListButton:SetPoint(\"LEFT\", track_debuffs, \"RIGHT\", 400, 0)\n\tListButton:SetSize(100, 23)\n\tListButton:SetText(ADD)\n\tListButton:SetWidth(ListButton.Text:GetWidth() + 15)\n\tListButton:SetScript(\"OnClick\", function()\n\t\tif not C.options[\"nameplate\"] then\n\t\t\tC.options[\"nameplate\"] = {}\n\t\tend\n\t\tif not C.options[\"nameplate\"][\"debuffs_list\"] then\n\t\t\tC.options[\"nameplate\"][\"debuffs_list\"] = {}\n\t\tend\n\t\tBuildSpellList(C.options[\"nameplate\"][\"debuffs_list\"])\n\tend)\n\ttinsert(ns.buttons, ListButton)\n\n\tlocal function toggleListButton()\n\t\tlocal shown = track_debuffs:GetChecked()\n\t\tListButton:SetEnabled(shown)\n\tend\n\n\ttrack_debuffs:HookScript(\"OnClick\", toggleListButton)\n\tListButton:HookScript(\"OnShow\", toggleListButton)\n\n\tlocal track_buffs = ns.CreateCheckBox(parent, \"track_buffs\", L_GUI_NAMEPLATE_SHOW_BUFFS)\n\ttrack_buffs:SetPoint(\"TOPLEFT\", track_debuffs, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ListButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tListButton:SetPoint(\"LEFT\", track_buffs, \"RIGHT\", 400, 0)\n\tListButton:SetSize(100, 23)\n\tListButton:SetText(ADD)\n\tListButton:SetWidth(ListButton.Text:GetWidth() + 15)\n\tListButton:SetScript(\"OnClick\", function()\n\t\tif not C.options[\"nameplate\"] then\n\t\t\tC.options[\"nameplate\"] = {}\n\t\tend\n\t\tif not C.options[\"nameplate\"][\"buffs_list\"] then\n\t\t\tC.options[\"nameplate\"][\"buffs_list\"] = {}\n\t\tend\n\t\tBuildSpellList(C.options[\"nameplate\"][\"buffs_list\"])\n\tend)\n\ttinsert(ns.buttons, ListButton)\n\n\tlocal function toggleListButton()\n\t\tlocal shown = track_buffs:GetChecked()\n\t\tListButton:SetEnabled(shown)\n\tend\n\n\ttrack_buffs:HookScript(\"OnClick\", toggleListButton)\n\tListButton:HookScript(\"OnShow\", toggleListButton)\n\n\tlocal auras_size = ns.CreateNumberSlider(parent, \"auras_size\", nil, nil, 0, 35 / multScale, 1, true, L_GUI_NAMEPLATE_DEBUFFS_SIZE)\n\tauras_size:SetPoint(\"TOPLEFT\", track_buffs, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal healer_icon = ns.CreateCheckBox(parent, \"healer_icon\", L_GUI_NAMEPLATE_HEALER_ICON)\n\thealer_icon:SetPoint(\"TOPLEFT\", auras_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal totem_icons = ns.CreateCheckBox(parent, \"totem_icons\", L_GUI_NAMEPLATE_TOTEM_ICONS)\n\ttotem_icons:SetPoint(\"TOPLEFT\", healer_icon, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal target_glow = ns.CreateCheckBox(parent, \"target_glow\")\n\ttarget_glow:SetPoint(\"TOPLEFT\", totem_icons, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal only_name = ns.CreateCheckBox(parent, \"only_name\")\n\tonly_name:SetPoint(\"TOPLEFT\", target_glow, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal quests = ns.CreateCheckBox(parent, \"quests\")\n\tquests:SetPoint(\"TOPLEFT\", only_name, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Panel 2\n\tlocal parent = ShestakUIOptionsPanel.nameplate2\n\n\tlocal low_health_value = ns.CreateNumberSlider(parent, \"low_health_value\", nil, nil, 0.1, 1, 0.05, true)\n\tlow_health_value:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal low_health_color = ns.CreateColourPicker(parent, \"low_health_color\", true)\n\tlow_health_color:SetPoint(\"LEFT\", low_health_value, \"RIGHT\", 85, 0)\n\n\tlocal low_health = ns.CreateCheckBox(parent, \"low_health\")\n\tlow_health:SetPoint(\"LEFT\", low_health_color, \"RIGHT\", 15, 0)\n\n\tlocal cast_color = ns.CreateCheckBox(parent, \"cast_color\")\n\tcast_color:SetPoint(\"TOPLEFT\", low_health_value, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal kick_color = ns.CreateCheckBox(parent, \"kick_color\")\n\tkick_color:SetPoint(\"TOPLEFT\", cast_color, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal enhance_threat = ns.CreateCheckBox(parent, \"enhance_threat\", L_GUI_NAMEPLATE_THREAT)\n\tenhance_threat:SetPoint(\"TOPLEFT\", kick_color, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal good_color = ns.CreateColourPicker(parent, \"good_color\", true, L_GUI_NAMEPLATE_GOOD_COLOR)\n\tgood_color:SetPoint(\"TOPLEFT\", enhance_threat, \"BOTTOMLEFT\", 24, -4)\n\n\tlocal near_color = ns.CreateColourPicker(parent, \"near_color\", true, L_GUI_NAMEPLATE_NEAR_COLOR)\n\tnear_color:SetPoint(\"TOPLEFT\", good_color, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal bad_color = ns.CreateColourPicker(parent, \"bad_color\", true, L_GUI_NAMEPLATE_BAD_COLOR)\n\tbad_color:SetPoint(\"TOPLEFT\", near_color, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal offtank_color = ns.CreateColourPicker(parent, \"offtank_color\", true, L_GUI_NAMEPLATE_OFFTANK_COLOR)\n\tofftank_color:SetPoint(\"TOPLEFT\", bad_color, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal extra_color = ns.CreateColourPicker(parent, \"extra_color\", true)\n\textra_color:SetPoint(\"TOPLEFT\", offtank_color, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal mob_color_enable = ns.CreateCheckBox(parent, \"mob_color_enable\")\n\tmob_color_enable:SetPoint(\"TOPLEFT\", extra_color, \"BOTTOMLEFT\", -24, -8)\n\n\tlocal mob_color = ns.CreateColourPicker(parent, \"mob_color\", true)\n\tmob_color:SetPoint(\"TOPLEFT\", mob_color_enable, \"BOTTOMLEFT\", 24, -4)\nend\n\n-- Combat text\ndo\n\tlocal parent = ShestakUIOptionsPanel.combattext\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_COMBATTEXT_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal blizz_head_numbers = ns.CreateCheckBox(parent, \"blizz_head_numbers\")\n\tblizz_head_numbers:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal damage_style = ns.CreateCheckBox(parent, \"damage_style\")\n\tdamage_style:SetPoint(\"TOPLEFT\", blizz_head_numbers, \"BOTTOMLEFT\", 20, 0)\n\n\tblizz_head_numbers.children = {damage_style}\n\n\tlocal damage = ns.CreateCheckBox(parent, \"damage\", L_GUI_COMBATTEXT_DAMAGE)\n\tdamage:SetPoint(\"TOPLEFT\", damage_style, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal pet_damage = ns.CreateCheckBox(parent, \"pet_damage\", L_GUI_COMBATTEXT_PET_DAMAGE)\n\tpet_damage:SetPoint(\"TOPLEFT\", damage, \"BOTTOMLEFT\", 20, 0)\n\n\tlocal dot_damage = ns.CreateCheckBox(parent, \"dot_damage\", L_GUI_COMBATTEXT_DOT_DAMAGE)\n\tdot_damage:SetPoint(\"TOPLEFT\", pet_damage, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal healing = ns.CreateCheckBox(parent, \"healing\", L_GUI_COMBATTEXT_HEALING)\n\thealing:SetPoint(\"TOPLEFT\", dot_damage, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal show_hots = ns.CreateCheckBox(parent, \"show_hots\", L_GUI_COMBATTEXT_HOTS)\n\tshow_hots:SetPoint(\"TOPLEFT\", healing, \"BOTTOMLEFT\", 20, 0)\n\n\tlocal show_overhealing = ns.CreateCheckBox(parent, \"show_overhealing\", L_GUI_COMBATTEXT_OVERHEALING)\n\tshow_overhealing:SetPoint(\"TOPLEFT\", show_hots, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal incoming = ns.CreateCheckBox(parent, \"incoming\", L.combattext_incoming)\n\tincoming:SetPoint(\"TOPLEFT\", show_overhealing, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal damage_color = ns.CreateCheckBox(parent, \"damage_color\", L_GUI_COMBATTEXT_DAMAGE_COLOR)\n\tdamage_color:SetPoint(\"TOPLEFT\", incoming, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal dispel = ns.CreateCheckBox(parent, \"dispel\", L_GUI_COMBATTEXT_DISPEL)\n\tdispel:SetPoint(\"TOPLEFT\", damage_color, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal interrupt = ns.CreateCheckBox(parent, \"interrupt\", L_GUI_COMBATTEXT_INTERRUPT)\n\tinterrupt:SetPoint(\"TOPLEFT\", dispel, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal icons = ns.CreateCheckBox(parent, \"icons\", L_GUI_COMBATTEXT_ICONS)\n\ticons:SetPoint(\"TOPLEFT\", interrupt, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal icon_size = ns.CreateNumberSlider(parent, \"icon_size\", nil, nil, 0, 40, 1, true, L_GUI_COMBATTEXT_ICON_SIZE, L_GUI_COMBATTEXT_ICON_SIZE_DESC)\n\ticon_size:SetPoint(\"TOPLEFT\", icons, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal max_lines = ns.CreateNumberSlider(parent, \"max_lines\", nil, nil, 0, 30, 1, true, L_GUI_COMBATTEXT_MAX_LINES, L_GUI_COMBATTEXT_MAX_LINES_DESC)\n\tmax_lines:SetPoint(\"TOPLEFT\", icon_size, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal time_visible = ns.CreateNumberSlider(parent, \"time_visible\", nil, nil, 0, 10, 1, true, L_GUI_COMBATTEXT_TIME_VISIBLE, L_GUI_COMBATTEXT_TIME_VISIBLE_DESC)\n\ttime_visible:SetPoint(\"LEFT\", max_lines, \"RIGHT\", 120, 0)\n\n\tlocal short_numbers = ns.CreateCheckBox(parent, \"short_numbers\", L_GUI_COMBATTEXT_SHORT_NUMBERS)\n\tshort_numbers:SetPoint(\"TOPLEFT\", max_lines, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal merge_aoe_spam = ns.CreateCheckBox(parent, \"merge_aoe_spam\")\n\tmerge_aoe_spam:SetPoint(\"TOPLEFT\", short_numbers, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ListButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tListButton:SetPoint(\"LEFT\", merge_aoe_spam, \"RIGHT\", 400, 0)\n\tListButton:SetSize(100, 23)\n\tListButton:SetText(ADD)\n\tListButton:SetWidth(ListButton.Text:GetWidth() + 15)\n\tListButton:SetScript(\"OnClick\", function()\n\t\tif not C.options[\"combattext\"] then\n\t\t\tC.options[\"combattext\"] = {}\n\t\tend\n\t\tif not C.options[\"combattext\"][\"spells_list\"] then\n\t\t\tC.options[\"combattext\"][\"spells_list\"] = {}\n\t\tend\n\t\tBuildSpellList(C.options[\"combattext\"][\"spells_list\"], true)\n\tend)\n\ttinsert(ns.buttons, ListButton)\n\n\tlocal function toggleListButton()\n\t\tlocal shown = merge_aoe_spam:GetChecked()\n\t\tListButton:SetEnabled(shown)\n\tend\n\n\tmerge_aoe_spam:HookScript(\"OnClick\", toggleListButton)\n\tListButton:HookScript(\"OnShow\", toggleListButton)\n\n\tlocal merge_melee = ns.CreateCheckBox(parent, \"merge_melee\", L_GUI_COMBATTEXT_MERGE_MELEE)\n\tmerge_melee:SetPoint(\"TOPLEFT\", merge_aoe_spam, \"BOTTOMLEFT\", 20, 0)\n\n\tlocal merge_all = ns.CreateCheckBox(parent, \"merge_all\")\n\tmerge_all:SetPoint(\"TOPLEFT\", merge_melee, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal direction = ns.CreateCheckBox(parent, \"direction\", L_GUI_COMBATTEXT_DIRECTION)\n\tdirection:SetPoint(\"TOPLEFT\", merge_all, \"BOTTOMLEFT\", -20, 0)\n\n\t-- Panel 2\n\tlocal parent = ShestakUIOptionsPanel.combattext2\n\n\tlocal dk_runes = ns.CreateCheckBox(parent, \"dk_runes\", L_GUI_COMBATTEXT_DK_RUNES)\n\tdk_runes:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal killingblow = ns.CreateCheckBox(parent, \"killingblow\", L_GUI_COMBATTEXT_KILLINGBLOW)\n\tkillingblow:SetPoint(\"TOPLEFT\", dk_runes, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal scrollable = ns.CreateCheckBox(parent, \"scrollable\", L_GUI_COMBATTEXT_SCROLLABLE)\n\tscrollable:SetPoint(\"TOPLEFT\", killingblow, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal crit_prefix = ns.CreateEditBox(parent, \"crit_prefix\", true, L_GUI_COMBATTEXT_CRIT_PREFIX)\n\tcrit_prefix:SetPoint(\"TOPLEFT\", scrollable, \"BOTTOMLEFT\", 6, -8)\n\n\tlocal crit_postfix = ns.CreateEditBox(parent, \"crit_postfix\", true, L_GUI_COMBATTEXT_CRIT_POSTFIX)\n\tcrit_postfix:SetPoint(\"TOPLEFT\", crit_prefix, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal treshold = ns.CreateEditBox(parent, \"treshold\", true, L_GUI_COMBATTEXT_TRESHOLD, true)\n\ttreshold:SetPoint(\"TOPLEFT\", crit_postfix, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal heal_treshold = ns.CreateEditBox(parent, \"heal_treshold\", true, L_GUI_COMBATTEXT_HEAL_TRESHOLD, true)\n\theal_treshold:SetPoint(\"TOPLEFT\", treshold, \"BOTTOMLEFT\", 0, -10)\nend\n\n-- Bag\ndo\n\tlocal parent = ShestakUIOptionsPanel.bag\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_BAGS_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ilvl = ns.CreateCheckBox(parent, \"ilvl\", L_GUI_BAGS_ILVL)\n\tilvl:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal new_items = ns.CreateCheckBox(parent, \"new_items\")\n\tnew_items:SetPoint(\"TOPLEFT\", ilvl, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal filter = ns.CreateCheckBox(parent, \"filter\")\n\tfilter:SetPoint(\"TOPLEFT\", new_items, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal button_size = ns.CreateNumberSlider(parent, \"button_size\", nil, nil, 0, 50, 1, true, L_GUI_BAGS_BUTTON_SIZE)\n\tbutton_size:SetPoint(\"TOPLEFT\", filter, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal button_space = ns.CreateNumberSlider(parent, \"button_space\", nil, nil, 0, 10, 1, true, L_GUI_BAGS_BUTTON_SPACE)\n\tbutton_space:SetPoint(\"LEFT\", button_size, \"RIGHT\", 120, 0)\n\n\tlocal bag_columns = ns.CreateNumberSlider(parent, \"bag_columns\", nil, nil, 0, 20, 1, true, L_GUI_BAGS_BAG)\n\tbag_columns:SetPoint(\"TOPLEFT\", button_size, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bank_columns = ns.CreateNumberSlider(parent, \"bank_columns\", nil, nil, 0, 25, 1, true, L_GUI_BAGS_BANK)\n\tbank_columns:SetPoint(\"LEFT\", bag_columns, \"RIGHT\", 120, 0)\nend\n\n-- Minimap\ndo\n\tlocal parent = ShestakUIOptionsPanel.minimap\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_MINIMAP_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal on_top = ns.CreateCheckBox(parent, \"on_top\")\n\ton_top:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal tracking_icon = ns.CreateCheckBox(parent, \"tracking_icon\", L_GUI_MINIMAP_ICON)\n\ttracking_icon:SetPoint(\"TOPLEFT\", on_top, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal garrison_icon = ns.CreateCheckBox(parent, \"garrison_icon\", DRAGONFLIGHT_LANDING_PAGE_TITLE)\n\tgarrison_icon:SetPoint(\"TOPLEFT\", tracking_icon, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal size = ns.CreateNumberSlider(parent, \"size\", nil, nil, 0, 300, 1, true, L_GUI_MINIMAP_SIZE)\n\tsize:SetPoint(\"TOPLEFT\", garrison_icon, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal hide_combat = ns.CreateCheckBox(parent, \"hide_combat\", L_GUI_MINIMAP_HIDE_COMBAT)\n\thide_combat:SetPoint(\"TOPLEFT\", size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal toggle_menu = ns.CreateCheckBox(parent, \"toggle_menu\", L_GUI_MINIMAP_TOGGLE_MENU)\n\ttoggle_menu:SetPoint(\"TOPLEFT\", hide_combat, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Other\n\tlocal subheader = ns.addSubCategory(parent, OTHER)\n\tsubheader:SetPoint(\"TOPLEFT\", toggle_menu, \"BOTTOMLEFT\", 0, -16)\n\n\tlocal bg_map_stylization = ns.CreateCheckBox(parent, \"bg_map_stylization\")\n\tbg_map_stylization:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal fog_of_war = ns.CreateCheckBox(parent, \"fog_of_war\")\n\tfog_of_war:SetPoint(\"TOPLEFT\", bg_map_stylization, \"BOTTOMLEFT\", 0, 0)\nend\n\n-- Loot\ndo\n\tlocal parent = ShestakUIOptionsPanel.loot\n\n\tlocal lootframe = ns.CreateCheckBox(parent, \"lootframe\", L_GUI_LOOT_ENABLE)\n\tlootframe:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal icon_size = ns.CreateNumberSlider(parent, \"icon_size\", nil, nil, 0, 50, 1, true, L_GUI_LOOT_ICON_SIZE)\n\ticon_size:SetPoint(\"TOPLEFT\", lootframe, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal width = ns.CreateNumberSlider(parent, \"width\", nil, nil, 0, 400, 1, true, L_GUI_LOOT_WIDTH)\n\twidth:SetPoint(\"TOPLEFT\", icon_size, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal faster_loot = ns.CreateCheckBox(parent, \"faster_loot\")\n\tfaster_loot:SetPoint(\"TOPLEFT\", width, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal rolllootframe = ns.CreateCheckBox(parent, \"rolllootframe\", L_GUI_LOOT_ROLL_ENABLE)\n\trolllootframe:SetPoint(\"TOPLEFT\", faster_loot, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal auto_greed = ns.CreateCheckBox(parent, \"auto_greed\", L_GUI_LOOT_AUTOGREED)\n\tauto_greed:SetPoint(\"TOPLEFT\", rolllootframe, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal auto_confirm_de = ns.CreateCheckBox(parent, \"auto_confirm_de\", L_GUI_LOOT_AUTODE)\n\tauto_confirm_de:SetPoint(\"TOPLEFT\", auto_greed, \"BOTTOMLEFT\", 0, 0)\nend\n\n-- Filger\ndo\n\tlocal parent = ShestakUIOptionsPanel.filger\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_FILGER_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_tooltip = ns.CreateCheckBox(parent, \"show_tooltip\", L_GUI_FILGER_SHOW_TOOLTIP)\n\tshow_tooltip:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal expiration = ns.CreateCheckBox(parent, \"expiration\", L_GUI_FILGER_EXPIRATION)\n\texpiration:SetPoint(\"TOPLEFT\", show_tooltip, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Elements\n\tlocal subheader = ns.addSubCategory(parent, L.filger_subheader_elements)\n\tsubheader:SetPoint(\"TOPLEFT\", expiration, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal show_buff = ns.CreateCheckBox(parent, \"show_buff\")\n\tshow_buff:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal show_proc = ns.CreateCheckBox(parent, \"show_proc\")\n\tshow_proc:SetPoint(\"LEFT\", show_buff, \"RIGHT\", 320, 0)\n\n\tlocal show_debuff = ns.CreateCheckBox(parent, \"show_debuff\")\n\tshow_debuff:SetPoint(\"TOPLEFT\", show_buff, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_aura_bar = ns.CreateCheckBox(parent, \"show_aura_bar\")\n\tshow_aura_bar:SetPoint(\"LEFT\", show_debuff, \"RIGHT\", 320, 0)\n\n\tlocal show_pvp_player = ns.CreateCheckBox(parent, \"show_pvp_player\")\n\tshow_pvp_player:SetPoint(\"TOPLEFT\", show_debuff, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_pvp_target = ns.CreateCheckBox(parent, \"show_pvp_target\")\n\tshow_pvp_target:SetPoint(\"LEFT\", show_pvp_player, \"RIGHT\", 320, 0)\n\n\tlocal show_special = ns.CreateCheckBox(parent, \"show_special\")\n\tshow_special:SetPoint(\"TOPLEFT\", show_pvp_player, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_cd = ns.CreateCheckBox(parent, \"show_cd\")\n\tshow_cd:SetPoint(\"LEFT\", show_special, \"RIGHT\", 320, 0)\n\n\t-- Size\n\tlocal subheader = ns.addSubCategory(parent, L.filger_subheader_size)\n\tsubheader:SetPoint(\"TOPLEFT\", show_special, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal buffs_size = ns.CreateNumberSlider(parent, \"buffs_size\", nil, nil, 0, 60, 1, true, L_GUI_FILGER_BUFFS_SIZE)\n\tbuffs_size:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -30)\n\n\tlocal buffs_space = ns.CreateNumberSlider(parent, \"buffs_space\", nil, nil, 0, 10, 1, true)\n\tbuffs_space:SetPoint(\"LEFT\", buffs_size, \"RIGHT\", 120, 0)\n\n\tlocal pvp_size = ns.CreateNumberSlider(parent, \"pvp_size\", nil, nil, 0, 90, 1, true, L_GUI_FILGER_PVP_SIZE)\n\tpvp_size:SetPoint(\"TOPLEFT\", buffs_size, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal pvp_space = ns.CreateNumberSlider(parent, \"pvp_space\", nil, nil, 0, 10, 1, true)\n\tpvp_space:SetPoint(\"LEFT\", pvp_size, \"RIGHT\", 120, 0)\n\n\tlocal cooldown_size = ns.CreateNumberSlider(parent, \"cooldown_size\", nil, nil, 0, 60, 1, true, L_GUI_FILGER_COOLDOWN_SIZE)\n\tcooldown_size:SetPoint(\"TOPLEFT\", pvp_size, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal cooldown_space = ns.CreateNumberSlider(parent, \"cooldown_space\", nil, nil, 0, 10, 1, true)\n\tcooldown_space:SetPoint(\"LEFT\", cooldown_size, \"RIGHT\", 120, 0)\n\n\t-- Testing\n\tlocal subheader = ns.addSubCategory(parent, L.filger_subheader_test)\n\tsubheader:SetPoint(\"TOPLEFT\", cooldown_size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal test_mode = ns.CreateCheckBox(parent, \"test_mode\", L_GUI_FILGER_TEST_MODE)\n\ttest_mode:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal max_test_icon = ns.CreateNumberSlider(parent, \"max_test_icon\", nil, nil, 0, 10, 1, true, L_GUI_FILGER_MAX_TEST_ICON)\n\tmax_test_icon:SetPoint(\"TOPLEFT\", test_mode, \"BOTTOMLEFT\", 0, -20)\n\n\t-- Spell List\n\tlocal subheader = ns.addSubCategory(parent, L.filger_subheader_spells)\n\tsubheader:SetPoint(\"TOPLEFT\", max_test_icon, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal category_list = ns.CreateDropDown(parent, \"category_list\", true, L.filger_category_list, FilgerTable)\n\tcategory_list:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", -16, -10)\n\n\thooksecurefunc(category_list, \"SetValue\", function()\n\t\tif not C.options[\"filger\"] then\n\t\t\tC.options[\"filger\"] = {}\n\t\tend\n\t\tif not C.options[\"filger\"][FilgerDropDownText[category_list.selectedValue]] then\n\t\t\tC.options[\"filger\"][FilgerDropDownText[category_list.selectedValue]] = {}\n\t\tend\n\t\tBuildSpellList(C.options[\"filger\"][FilgerDropDownText[category_list.selectedValue]], false, true)\n\tend)\nend\n\n-- Announcements\ndo\n\tlocal parent = ShestakUIOptionsPanel.announcements\n\n\tlocal interrupts = ns.CreateCheckBox(parent, \"interrupts\")\n\tinterrupts:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal spells = ns.CreateCheckBox(parent, \"spells\")\n\tspells:SetPoint(\"TOPLEFT\", interrupts, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ListButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tListButton:SetPoint(\"LEFT\", spells, \"RIGHT\", 400, 0)\n\tListButton:SetSize(100, 23)\n\tListButton:SetText(ADD)\n\tListButton:SetWidth(ListButton.Text:GetWidth() + 15)\n\tListButton:SetScript(\"OnClick\", function()\n\t\tif not C.options[\"announcements\"] then\n\t\t\tC.options[\"announcements\"] = {}\n\t\tend\n\t\tif not C.options[\"announcements\"][\"spells_list\"] then\n\t\t\tC.options[\"announcements\"][\"spells_list\"] = T.announce_spells\n\t\tend\n\t\tBuildSpellList(C.options[\"announcements\"][\"spells_list\"])\n\tend)\n\ttinsert(ns.buttons, ListButton)\n\n\tlocal function toggleListButton()\n\t\tlocal shown = spells:GetChecked()\n\t\tListButton:SetEnabled(shown)\n\t\tif not T.announce_spells then\n\t\t\tListButton.tooltipText = \"|cffFFD100\"..REQUIRES_RELOAD..\"|r\"\n\t\t\tListButton:SetScript(\"OnClick\", nil)\n\t\tend\n\tend\n\n\tspells:HookScript(\"OnClick\", toggleListButton)\n\tListButton:HookScript(\"OnShow\", toggleListButton)\n\n\tlocal spells_from_all = ns.CreateCheckBox(parent, \"spells_from_all\")\n\tspells_from_all:SetPoint(\"TOPLEFT\", spells, \"BOTTOMLEFT\", 20, 0)\n\n\tspells.children = {spells_from_all}\n\n\tlocal feasts = ns.CreateCheckBox(parent, \"feasts\")\n\tfeasts:SetPoint(\"TOPLEFT\", spells_from_all, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal portals = ns.CreateCheckBox(parent, \"portals\")\n\tportals:SetPoint(\"TOPLEFT\", feasts, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal toys = ns.CreateCheckBox(parent, \"toys\")\n\ttoys:SetPoint(\"TOPLEFT\", portals, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal flask_food = ns.CreateCheckBox(parent, \"flask_food\")\n\tflask_food:SetPoint(\"TOPLEFT\", toys, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal flask_food_raid = ns.CreateCheckBox(parent, \"flask_food_raid\")\n\tflask_food_raid:SetPoint(\"TOPLEFT\", flask_food, \"BOTTOMLEFT\", 20, 0)\n\n\tlocal flask_food_auto = ns.CreateCheckBox(parent, \"flask_food_auto\")\n\tflask_food_auto:SetPoint(\"TOPLEFT\", flask_food_raid, \"BOTTOMLEFT\", 0, 0)\n\n\tflask_food.children = {flask_food_raid, flask_food_auto}\n\n\tlocal drinking = ns.CreateCheckBox(parent, \"drinking\")\n\tdrinking:SetPoint(\"TOPLEFT\", flask_food_auto, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal pull_countdown = ns.CreateCheckBox(parent, \"pull_countdown\")\n\tpull_countdown:SetPoint(\"TOPLEFT\", drinking, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Self announce\n\tlocal subheader = ns.addSubCategory(parent, L.announcements_subheader_self)\n\tsubheader:SetPoint(\"TOPLEFT\", pull_countdown, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal bad_gear = ns.CreateCheckBox(parent, \"bad_gear\")\n\tbad_gear:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal safari_hat = ns.CreateCheckBox(parent, \"safari_hat\")\n\tsafari_hat:SetPoint(\"TOPLEFT\", bad_gear, \"BOTTOMLEFT\", 0, 0)\nend\n\n-- Automation\ndo\n\tlocal parent = ShestakUIOptionsPanel.automation\n\n\tlocal release = ns.CreateCheckBox(parent, \"release\")\n\trelease:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal screenshot = ns.CreateCheckBox(parent, \"screenshot\")\n\tscreenshot:SetPoint(\"TOPLEFT\", release, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal solve_artifact = ns.CreateCheckBox(parent, \"solve_artifact\")\n\tsolve_artifact:SetPoint(\"TOPLEFT\", screenshot, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal accept_invite = ns.CreateCheckBox(parent, \"accept_invite\")\n\taccept_invite:SetPoint(\"TOPLEFT\", solve_artifact, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal decline_duel = ns.CreateCheckBox(parent, \"decline_duel\")\n\tdecline_duel:SetPoint(\"TOPLEFT\", accept_invite, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal accept_quest = ns.CreateCheckBox(parent, \"accept_quest\")\n\taccept_quest:SetPoint(\"TOPLEFT\", decline_duel, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal skip_cinematic = ns.CreateCheckBox(parent, \"skip_cinematic\")\n\tskip_cinematic:SetPoint(\"TOPLEFT\", accept_quest, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal auto_role = ns.CreateCheckBox(parent, \"auto_role\")\n\tauto_role:SetPoint(\"TOPLEFT\", skip_cinematic, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal cancel_bad_buffs = ns.CreateCheckBox(parent, \"cancel_bad_buffs\")\n\tcancel_bad_buffs:SetPoint(\"TOPLEFT\", auto_role, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal tab_binder = ns.CreateCheckBox(parent, \"tab_binder\")\n\ttab_binder:SetPoint(\"TOPLEFT\", cancel_bad_buffs, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal logging_combat = ns.CreateCheckBox(parent, \"logging_combat\")\n\tlogging_combat:SetPoint(\"TOPLEFT\", tab_binder, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal buff_on_scroll = ns.CreateCheckBox(parent, \"buff_on_scroll\")\n\tbuff_on_scroll:SetPoint(\"TOPLEFT\", logging_combat, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal open_items = ns.CreateCheckBox(parent, \"open_items\")\n\topen_items:SetPoint(\"TOPLEFT\", buff_on_scroll, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal resurrection = ns.CreateCheckBox(parent, \"resurrection\")\n\tresurrection:SetPoint(\"TOPLEFT\", open_items, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal summon = ns.CreateCheckBox(parent, \"summon\")\n\tsummon:SetPoint(\"TOPLEFT\", resurrection, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal whisper_invite = ns.CreateCheckBox(parent, \"whisper_invite\")\n\twhisper_invite:SetPoint(\"TOPLEFT\", summon, \"BOTTOMLEFT\", 0, 0)\n\twhisper_invite.needsReload = false\n\n\tlocal invite_keyword = ns.CreateEditBox(parent, \"invite_keyword\", true)\n\tinvite_keyword:SetPoint(\"TOPLEFT\", whisper_invite, \"BOTTOMLEFT\", 6, -6)\n\tinvite_keyword:SetWidth(90)\n\tinvite_keyword:SetMaxLetters(20)\n\n\tlocal auto_collapse = ns.CreateDropDown(parent, \"auto_collapse\", true, false, CollapseTable)\n\tauto_collapse:SetPoint(\"TOPLEFT\", invite_keyword, \"BOTTOMLEFT\", -22, -10)\nend\n\n-- Reminder\ndo\n\tlocal parent = ShestakUIOptionsPanel.reminder\n\n\tlocal solo_buffs_enable = ns.CreateCheckBox(parent, \"solo_buffs_enable\", L_GUI_REMINDER_SOLO_ENABLE)\n\tsolo_buffs_enable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal solo_buffs_sound = ns.CreateCheckBox(parent, \"solo_buffs_sound\", L_GUI_REMINDER_SOLO_SOUND)\n\tsolo_buffs_sound:SetPoint(\"TOPLEFT\", solo_buffs_enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal solo_buffs_size = ns.CreateNumberSlider(parent, \"solo_buffs_size\", nil, nil, 0, 80, 1, true, L_GUI_REMINDER_SOLO_SIZE, L_GUI_REMINDER_SOLO_SIZE_DESC)\n\tsolo_buffs_size:SetPoint(\"TOPLEFT\", solo_buffs_sound, \"BOTTOMLEFT\", 0, -20)\n\n\t-- Raid buffs\n\tlocal subheader = ns.addSubCategory(parent, L_GUI_REMINDER_SUBHEADER)\n\tsubheader:SetPoint(\"TOPLEFT\", solo_buffs_size, \"BOTTOMLEFT\", 0, -16)\n\n\tlocal raid_buffs_enable = ns.CreateCheckBox(parent, \"raid_buffs_enable\", L_GUI_REMINDER_RAID_ENABLE)\n\traid_buffs_enable:SetPoint(\"TOPLEFT\", subheader, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal raid_buffs_always = ns.CreateCheckBox(parent, \"raid_buffs_always\", L_GUI_REMINDER_RAID_ALWAYS)\n\traid_buffs_always:SetPoint(\"TOPLEFT\", raid_buffs_enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal raid_buffs_size = ns.CreateNumberSlider(parent, \"raid_buffs_size\", nil, nil, 0, 40, 1, true, L_GUI_REMINDER_RAID_SIZE, L_GUI_REMINDER_RAID_SIZE_DESC)\n\traid_buffs_size:SetPoint(\"TOPLEFT\", raid_buffs_always, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal raid_buffs_alpha = ns.CreateNumberSlider(parent, \"raid_buffs_alpha\", nil, nil, 0, 1, 0.05, true, L_GUI_REMINDER_RAID_ALPHA, L_GUI_REMINDER_RAID_ALPHA_DESC)\n\traid_buffs_alpha:SetPoint(\"TOPLEFT\", raid_buffs_size, \"BOTTOMLEFT\", 0, -20)\nend\n\n-- Raid cooldowns\ndo\n\tlocal parent = ShestakUIOptionsPanel.raidcooldown\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_COOLDOWN_RAID_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal height = ns.CreateNumberSlider(parent, \"height\", nil, nil, 0, 30, 1, true, L_GUI_COOLDOWN_RAID_HEIGHT)\n\theight:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal width = ns.CreateNumberSlider(parent, \"width\", nil, nil, 0, 300, 1, true, L_GUI_COOLDOWN_RAID_WIDTH)\n\twidth:SetPoint(\"LEFT\", height, \"RIGHT\", 120, 0)\n\n\tlocal upwards = ns.CreateCheckBox(parent, \"upwards\", L_GUI_COOLDOWN_RAID_SORT)\n\tupwards:SetPoint(\"TOPLEFT\", height, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal expiration = ns.CreateCheckBox(parent, \"expiration\", L_GUI_COOLDOWN_RAID_EXPIRATION)\n\texpiration:SetPoint(\"TOPLEFT\", upwards, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_self = ns.CreateCheckBox(parent, \"show_self\", L_GUI_COOLDOWN_RAID_SHOW_SELF)\n\tshow_self:SetPoint(\"TOPLEFT\", expiration, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_icon = ns.CreateCheckBox(parent, \"show_icon\", L_GUI_COOLDOWN_RAID_ICONS)\n\tshow_icon:SetPoint(\"TOPLEFT\", show_self, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_inraid = ns.CreateCheckBox(parent, \"show_inraid\", L_GUI_COOLDOWN_RAID_IN_RAID)\n\tshow_inraid:SetPoint(\"TOPLEFT\", show_icon, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_inparty = ns.CreateCheckBox(parent, \"show_inparty\", L_GUI_COOLDOWN_RAID_IN_PARTY)\n\tshow_inparty:SetPoint(\"TOPLEFT\", show_inraid, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_inarena = ns.CreateCheckBox(parent, \"show_inarena\", L_GUI_COOLDOWN_RAID_IN_ARENA)\n\tshow_inarena:SetPoint(\"TOPLEFT\", show_inparty, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ListButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tListButton:SetPoint(\"TOPLEFT\", show_inarena, \"BOTTOMLEFT\", 3, -5)\n\tListButton:SetSize(100, 23)\n\tListButton:SetText(L_GUI_SPELL_LIST)\n\tListButton:SetWidth(ListButton.Text:GetWidth() + 15)\n\tListButton.tooltipText = \"|cffFFD100\"..L_GUI_RESET_SPELLS_DESC..\"|r\"\n\tListButton:SetScript(\"OnClick\", function()\n\t\tif not C.options[\"raidcooldown\"] then\n\t\t\tC.options[\"raidcooldown\"] = {}\n\t\tend\n\t\tif not C.options[\"raidcooldown\"][\"spells_list\"] then\n\t\t\tC.options[\"raidcooldown\"][\"spells_list\"] = T.raid_spells\n\t\t\tC.options.raidcooldown.spells_list_ver = 3\n\t\tend\n\t\tif IsControlKeyDown() then\n\t\t\tC.options[\"raidcooldown\"][\"spells_list\"] = nil\n\t\t\tns.setReloadNeeded(true)\n\t\t\tListButton.tooltipText = \"|cffFFD100\"..REQUIRES_RELOAD..\"|r\"\n\t\t\tListButton:SetScript(\"OnClick\", nil)\n\t\t\tGameTooltip:Hide()\n\t\t\tSpellList:Hide()\n\t\t\treturn\n\t\tend\n\t\tBuildSpellList(C.options[\"raidcooldown\"][\"spells_list\"], true)\n\tend)\n\ttinsert(ns.buttons, ListButton)\n\n\tlocal function toggleListButton()\n\t\tlocal shown = enable:GetChecked()\n\t\tListButton:SetEnabled(shown)\n\t\tif not T.raid_spells then ListButton:Disable() return end\n\tend\n\n\tenable:HookScript(\"OnClick\", toggleListButton)\n\tListButton:HookScript(\"OnShow\", toggleListButton)\nend\n\n-- Enemy cooldowns\ndo\n\tlocal parent = ShestakUIOptionsPanel.enemycooldown\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_COOLDOWN_ENEMY_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal size = ns.CreateNumberSlider(parent, \"size\", nil, nil, 0, 60, 1, true, L_GUI_COOLDOWN_ENEMY_SIZE)\n\tsize:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal direction = ns.CreateDropDown(parent, \"direction\", true, L_GUI_COOLDOWN_ENEMY_DIRECTION, {\"RIGHT\", \"LEFT\", \"UP\", \"DOWN\"})\n\tdirection:SetPoint(\"TOPLEFT\", size, \"BOTTOMLEFT\", -16, -10)\n\n\tlocal show_always = ns.CreateCheckBox(parent, \"show_always\", L_GUI_COOLDOWN_ENEMY_EVERYWHERE)\n\tshow_always:SetPoint(\"TOPLEFT\", direction, \"BOTTOMLEFT\", 16, 0)\n\n\tlocal show_inpvp = ns.CreateCheckBox(parent, \"show_inpvp\", L_GUI_COOLDOWN_ENEMY_IN_BG)\n\tshow_inpvp:SetPoint(\"TOPLEFT\", show_always, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_inarena = ns.CreateCheckBox(parent, \"show_inarena\", L_GUI_COOLDOWN_ENEMY_IN_ARENA)\n\tshow_inarena:SetPoint(\"TOPLEFT\", show_inpvp, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal show_inparty = ns.CreateCheckBox(parent, \"show_inparty\")\n\tshow_inparty:SetPoint(\"TOPLEFT\", show_inarena, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal class_color = ns.CreateCheckBox(parent, \"class_color\")\n\tclass_color:SetPoint(\"TOPLEFT\", show_inparty, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ListButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tListButton:SetPoint(\"TOPLEFT\", class_color, \"BOTTOMLEFT\", 3, -5)\n\tListButton:SetSize(100, 23)\n\tListButton:SetText(L_GUI_SPELL_LIST)\n\tListButton:SetWidth(ListButton.Text:GetWidth() + 15)\n\tListButton.tooltipText = \"|cffFFD100\"..L_GUI_RESET_SPELLS_DESC..\"|r\"\n\tListButton:SetScript(\"OnClick\", function()\n\t\tif not C.options[\"enemycooldown\"] then\n\t\t\tC.options[\"enemycooldown\"] = {}\n\t\tend\n\t\tif not C.options[\"enemycooldown\"][\"spells_list\"] then\n\t\t\tC.options[\"enemycooldown\"][\"spells_list\"] = T.enemy_spells\n\t\t\tC.options.enemycooldown.spells_list_ver = 2\n\t\tend\n\t\tif IsControlKeyDown() then\n\t\t\tC.options[\"enemycooldown\"][\"spells_list\"] = nil\n\t\t\tns.setReloadNeeded(true)\n\t\t\tListButton.tooltipText = \"|cffFFD100\"..REQUIRES_RELOAD..\"|r\"\n\t\t\tListButton:SetScript(\"OnClick\", nil)\n\t\t\tGameTooltip:Hide()\n\t\t\tSpellList:Hide()\n\t\t\treturn\n\t\tend\n\t\tBuildSpellList(C.options[\"enemycooldown\"][\"spells_list\"], true)\n\tend)\n\ttinsert(ns.buttons, ListButton)\n\n\tlocal function toggleListButton()\n\t\tlocal shown = enable:GetChecked()\n\t\tListButton:SetEnabled(shown)\n\t\tif not T.enemy_spells then ListButton:Disable() return end\n\tend\n\n\tenable:HookScript(\"OnClick\", toggleListButton)\n\tListButton:HookScript(\"OnShow\", toggleListButton)\nend\n\n-- Pulse cooldowns\ndo\n\tlocal parent = ShestakUIOptionsPanel.pulsecooldown\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_COOLDOWN_PULSE_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal size = ns.CreateNumberSlider(parent, \"size\", nil, nil, 0, 150, 1, true, L_GUI_COOLDOWN_ENEMY_SIZE)\n\tsize:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal sound = ns.CreateCheckBox(parent, \"sound\", L_GUI_COOLDOWN_PULSE_SOUND)\n\tsound:SetPoint(\"TOPLEFT\", size, \"BOTTOMLEFT\", 0, -10)\n\n\tlocal anim_scale = ns.CreateNumberSlider(parent, \"anim_scale\", nil, nil, 0, 3, 0.05, true, L_GUI_COOLDOWN_PULSE_ANIM_SCALE)\n\tanim_scale:SetPoint(\"TOPLEFT\", sound, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal hold_time = ns.CreateNumberSlider(parent, \"hold_time\", nil, nil, 0, 5, 1, true, L_GUI_COOLDOWN_PULSE_HOLD_TIME)\n\thold_time:SetPoint(\"TOPLEFT\", anim_scale, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal threshold = ns.CreateNumberSlider(parent, \"threshold\", nil, nil, 0, 15, 1, true, L_GUI_COOLDOWN_PULSE_THRESHOLD, L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC)\n\tthreshold:SetPoint(\"TOPLEFT\", hold_time, \"BOTTOMLEFT\", 0, -20)\nend\n\n-- Threat\ndo\n\tlocal parent = ShestakUIOptionsPanel.threat\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_THREAT_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal height = ns.CreateNumberSlider(parent, \"height\", nil, nil, 0, 25, 1, true, L_GUI_THREAT_HEIGHT)\n\theight:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal width = ns.CreateNumberSlider(parent, \"width\", nil, nil, 0, 350, 1, true, L_GUI_THREAT_WIDTH)\n\twidth:SetPoint(\"TOPLEFT\", height, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal bar_rows = ns.CreateNumberSlider(parent, \"bar_rows\", nil, nil, 1, 15, 1, true, L_GUI_THREAT_ROWS)\n\tbar_rows:SetPoint(\"TOPLEFT\", width, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal hide_solo = ns.CreateCheckBox(parent, \"hide_solo\", L_GUI_THREAT_HIDE_SOLO)\n\thide_solo:SetPoint(\"TOPLEFT\", bar_rows, \"BOTTOMLEFT\", 0, -20)\nend\n\n-- Top Panel\ndo\n\tlocal parent = ShestakUIOptionsPanel.toppanel\n\n\tlocal enable = ns.CreateCheckBox(parent, \"enable\", L_GUI_TOP_PANEL_ENABLE)\n\tenable:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal mouseover = ns.CreateCheckBox(parent, \"mouseover\", L_GUI_TOP_PANEL_MOUSE)\n\tmouseover:SetPoint(\"TOPLEFT\", enable, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal height = ns.CreateNumberSlider(parent, \"height\", nil, nil, 40, 150, 1, true, L_GUI_TOP_PANEL_HEIGHT)\n\theight:SetPoint(\"TOPLEFT\", mouseover, \"BOTTOMLEFT\", 0, -20)\n\n\tlocal width = ns.CreateNumberSlider(parent, \"width\", nil, nil, 100, 500, 1, true, L_GUI_TOP_PANEL_WIDTH)\n\twidth:SetPoint(\"TOPLEFT\", height, \"BOTTOMLEFT\", 0, -20)\nend\n\n-- Stats\ndo\n\tlocal parent = ShestakUIOptionsPanel.stats\n\n\tlocal clock = ns.CreateCheckBox(parent, \"clock\", L_GUI_STATS_CLOCK)\n\tclock:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal latency = ns.CreateCheckBox(parent, \"latency\", L_GUI_STATS_LATENCY)\n\tlatency:SetPoint(\"TOPLEFT\", clock, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal fps = ns.CreateCheckBox(parent, \"fps\", L_GUI_STATS_FPS)\n\tfps:SetPoint(\"TOPLEFT\", latency, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal friend = ns.CreateCheckBox(parent, \"friend\", FRIENDS)\n\tfriend:SetPoint(\"TOPLEFT\", fps, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal guild = ns.CreateCheckBox(parent, \"guild\", GUILD)\n\tguild:SetPoint(\"TOPLEFT\", friend, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal durability = ns.CreateCheckBox(parent, \"durability\", DURABILITY)\n\tdurability:SetPoint(\"TOPLEFT\", guild, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal experience = ns.CreateCheckBox(parent, \"experience\", L_GUI_STATS_EXPERIENCE)\n\texperience:SetPoint(\"TOPLEFT\", durability, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal talents = ns.CreateCheckBox(parent, \"talents\", SPECIALIZATION, L_GUI_STATS_TALENTS_DESC)\n\ttalents:SetPoint(\"TOPLEFT\", experience, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal location = ns.CreateCheckBox(parent, \"location\", L_GUI_STATS_LOCATION)\n\tlocation:SetPoint(\"TOPLEFT\", talents, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal coords = ns.CreateCheckBox(parent, \"coords\", L_GUI_STATS_COORDS)\n\tcoords:SetPoint(\"TOPLEFT\", location, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal battleground = ns.CreateCheckBox(parent, \"battleground\", L_GUI_STATS_BG)\n\tbattleground:SetPoint(\"TOPLEFT\", coords, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal damage = ns.CreateCheckBox(parent, \"damage\", DAMAGE)\n\tdamage:SetPoint(\"TOPLEFT\", battleground, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal bottom_line = ns.CreateCheckBox(parent, \"bottom_line\")\n\tbottom_line:SetPoint(\"TOPLEFT\", damage, \"BOTTOMLEFT\", 0, 0)\n\n\t-- Currency\n\tlocal currency = ns.addSubCategory(parent, L_GUI_STATS_SUBHEADER_CURRENCY)\n\tcurrency:SetPoint(\"TOPLEFT\", bottom_line, \"BOTTOMLEFT\", 0, -16)\n\n\tlocal currency_archaeology = ns.CreateCheckBox(parent, \"currency_archaeology\", L_GUI_STATS_CURRENCY_ARCHAEOLOGY)\n\tcurrency_archaeology:SetPoint(\"TOPLEFT\", currency, \"BOTTOMLEFT\", 0, -8)\n\n\tlocal currency_cooking = ns.CreateCheckBox(parent, \"currency_cooking\", L_GUI_STATS_CURRENCY_COOKING)\n\tcurrency_cooking:SetPoint(\"TOPLEFT\", currency_archaeology, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal currency_raid = ns.CreateCheckBox(parent, \"currency_raid\", L_GUI_STATS_CURRENCY_RAID)\n\tcurrency_raid:SetPoint(\"TOPLEFT\", currency_cooking, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal currency_misc = ns.CreateCheckBox(parent, \"currency_misc\", CURRENCY.. \" \"..EXPANSION_NAME9)\n\tcurrency_misc:SetPoint(\"TOPLEFT\", currency_raid, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal ResetGoldButton = CreateFrame(\"Button\", nil, parent, \"UIPanelButtonTemplate\")\n\tResetGoldButton:SetPoint(\"BOTTOMRIGHT\", parent, \"BOTTOMRIGHT\", -20, 5)\n\tResetGoldButton:SetSize(100, 23)\n\tResetGoldButton:SetText(RESET..\" \"..strlower(WORLD_QUEST_REWARD_FILTERS_GOLD))\n\tResetGoldButton:SetWidth(ResetGoldButton.Text:GetWidth() + 15)\n\tResetGoldButton:SetScript(\"OnClick\", function()\n\t\tStaticPopup_Show(\"RESET_STATS\")\n\tend)\n\n\ttinsert(ns.buttons, ResetGoldButton)\nend\n\n-- Trade\ndo\n\tlocal parent = ShestakUIOptionsPanel.trade\n\n\tlocal profession_tabs = ns.CreateCheckBox(parent, \"profession_tabs\")\n\tprofession_tabs:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal already_known = ns.CreateCheckBox(parent, \"already_known\")\n\talready_known:SetPoint(\"TOPLEFT\", profession_tabs, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal disenchanting = ns.CreateCheckBox(parent, \"disenchanting\")\n\tdisenchanting:SetPoint(\"TOPLEFT\", already_known, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal enchantment_scroll = ns.CreateCheckBox(parent, \"enchantment_scroll\")\n\tenchantment_scroll:SetPoint(\"TOPLEFT\", disenchanting, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal sum_buyouts = ns.CreateCheckBox(parent, \"sum_buyouts\")\n\tsum_buyouts:SetPoint(\"TOPLEFT\", enchantment_scroll, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal archaeology = ns.CreateCheckBox(parent, \"archaeology\")\n\tarchaeology:SetPoint(\"TOPLEFT\", sum_buyouts, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal merchant_itemlevel = ns.CreateCheckBox(parent, \"merchant_itemlevel\")\n\tmerchant_itemlevel:SetPoint(\"TOPLEFT\", archaeology, \"BOTTOMLEFT\", 0, 0)\nend\n\n-- Miscellaneous\ndo\n\tlocal parent = ShestakUIOptionsPanel.misc\n\n\tlocal raid_tools = ns.CreateCheckBox(parent, \"raid_tools\")\n\traid_tools:SetPoint(\"TOPLEFT\", parent.subText, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal shift_marking = ns.CreateCheckBox(parent, \"shift_marking\")\n\tshift_marking:SetPoint(\"TOPLEFT\", raid_tools, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal afk_spin_camera = ns.CreateCheckBox(parent, \"afk_spin_camera\")\n\tafk_spin_camera:SetPoint(\"TOPLEFT\", shift_marking, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal quest_auto_button = ns.CreateCheckBox(parent, \"quest_auto_button\")\n\tquest_auto_button:SetPoint(\"TOPLEFT\", afk_spin_camera, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal item_level = ns.CreateCheckBox(parent, \"item_level\")\n\titem_level:SetPoint(\"TOPLEFT\", quest_auto_button, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal click_cast = ns.CreateCheckBox(parent, \"click_cast\")\n\tclick_cast:SetPoint(\"TOPLEFT\", item_level, \"BOTTOMLEFT\", 0, 0)\n\n\tlocal click_cast_filter = ns.CreateCheckBox(parent, \"click_cast_filter\")\n\tclick_cast_filter:SetPoint(\"TOPLEFT\", click_cast, \"BOTTOMLEFT\", 20, 0)\n\n\tclick_cast.children = {click_cast_filter}\n\n\tlocal chars_currency = ns.CreateCheckBox(parent, \"chars_currency\")\n\tchars_currency:SetPoint(\"TOPLEFT\", click_cast_filter, \"BOTTOMLEFT\", -20, 0)\n\n\tlocal hide_raid_button = ns.CreateCheckBox(parent, \"hide_raid_button\")\n\thide_raid_button:SetPoint(\"TOPLEFT\", chars_currency, \"BOTTOMLEFT\", 0, 0)\nend\n\n----------------------------------------------------------------------------------------\n--\tSkin extra frames\n----------------------------------------------------------------------------------------\nlocal f = CreateFrame(\"Frame\")\nf:RegisterEvent(\"PLAYER_LOGIN\")\nf:SetScript(\"OnEvent\", function()\n\tif not ShestakUI then return end\n\tT, C = unpack(ShestakUI)\n\n\tSpellList:StripTextures()\n\tSpellList:CreateBackdrop(\"Transparent\")\n\tSpellList.backdrop:SetPoint(\"TOPLEFT\", -18, 0)\n\tSpellList.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 9)\n\n\tSpellListScrollFrameSpellList:StripTextures()\n\tSpellListScrollFrameSpellList:CreateBackdrop(\"Overlay\")\n\tSpellListScrollFrameSpellList.backdrop:SetPoint(\"TOPLEFT\", 2, 3)\n\tSpellListScrollFrameSpellList.backdrop:SetPoint(\"BOTTOMRIGHT\", 2, -3)\n\tT.SkinCloseButton(SpellListCloseButton)\n\n\tSpellListScrollFrameSpellListScrollBar:SetPoint(\"TOPLEFT\", SpellListScrollFrameSpellList, \"TOPRIGHT\", 6, -13)\n\tSpellListScrollFrameSpellListScrollBar:SetPoint(\"BOTTOMLEFT\", SpellListScrollFrameSpellList, \"BOTTOMRIGHT\", 6, 13)\n\tT.SkinScrollBar(SpellListScrollFrameSpellListScrollBar)\n\n\tT.SkinEditBox(SpellListTextInput)\n\tT.SkinEditBox(SpellListTextInput2)\n\n\tProfileList:StripTextures()\n\tProfileList:CreateBackdrop(\"Transparent\")\n\tProfileList.backdrop:SetPoint(\"TOPLEFT\", -18, 0)\n\tProfileList.backdrop:SetPoint(\"BOTTOMRIGHT\", 0, 9)\n\tT.SkinCloseButton(ProfileListCloseButton)\n\n\tProfileListPanel:CreateBackdrop(\"Overlay\")\n\n\tShestakUIInfoFrame:SetTemplate(\"Overlay\")\n\n\tShestakUIProfileFrame:SetTemplate(\"Transparent\")\n\tT.SkinScrollBar(ShestakUIProfileFrameScrollScrollBar)\n\tShestakUIProfileFrameScroll:CreateBackdrop(\"Overlay\")\n\tShestakUIProfileFrameScroll.backdrop:SetPoint(\"TOPLEFT\", -4, 4)\n\tShestakUIProfileFrameScroll.backdrop:SetPoint(\"BOTTOMRIGHT\", 4, -4)\n\n\tC_Timer.After(3, function()\n\t\tlocal dropdown = ShestakUIOptionsPanelgeneralchoose_profileDropDown\n\t\tif dropdown then\n\t\t\tT.SkinDropDownBox(dropdown)\n\t\tend\n\tend)\nend)\n\n----------------------------------------------------------------------------------------\n--\tSlash commands\n----------------------------------------------------------------------------------------\ndo\n\tfunction SlashCmdList.CONFIG()\n\t\tif not options or not options:IsShown() then\n\t\t\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION)\n\t\t\tHideUIPanel(GameMenuFrame)\n\t\t\toptions:Show()\n\t\telse\n\t\t\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION)\n\t\t\toptions:Hide()\n\t\tend\n\tend\n\tSLASH_CONFIG1 = \"/config\"\n\tSLASH_CONFIG2 = \"/cfg\"\n\tSLASH_CONFIG3 = \"/configui\"\n\n\tfunction SlashCmdList.RESETCONFIG()\n\t\tif ShestakUIOptionsGlobal[realm][name] == true then\n\t\t\tStaticPopup_Show(\"SHESTAKUI_RESET_PERCHAR\")\n\t\telse\n\t\t\tStaticPopup_Show(\"SHESTAKUI_RESET\")\n\t\tend\n\tend\n\tSLASH_RESETCONFIG1 = \"/resetconfig\"\nend\n\n----------------------------------------------------------------------------------------\n--\tButton in GameMenuButton frame\n----------------------------------------------------------------------------------------\nlocal menuButton = CreateFrame(\"Button\", \"GameMenuButtonSettingsUI\", GameMenuFrame, \"GameMenuButtonTemplate\")\nmenuButton:SetText(\"ShestakUI\")\nmenuButton:SetPoint(\"TOP\", GetLocale() ~= \"koKR\" and \"GameMenuButtonAddons\" or \"GameMenuButtonRatings\", \"BOTTOM\", 0, -1)\n\nGameMenuFrame:HookScript(\"OnShow\", function(self)\n\tself:SetHeight(self:GetHeight() + menuButton:GetHeight())\n\tGameMenuButtonLogout:SetPoint(\"TOP\", menuButton, \"BOTTOM\", 0, -16)\nend)\n\nmenuButton:SetScript(\"OnClick\", function()\n\tPlaySound(SOUNDKIT.IG_MAINMENU_OPTION)\n\tHideUIPanel(GameMenuFrame)\n\toptions:Show()\nend)"
  },
  {
    "path": "ShestakUI_Config/ShestakUI_Config.toc",
    "content": "## Interface: 100005\n## Title: ShestakUI Config\n## Notes: In-game configuration for ShestakUI\n## Author: Shestak\n## Version: 9.20\n## RequiredDeps: ShestakUI\n## SavedVariables: ShestakUIOptionsGlobal, ShestakUIOptions\n## SavedVariablesPerCharacter: ShestakUIOptionsPerChar\n\n## X-Website: http://shestak.org\n## X-Credits: Haleth, Solor\n## X-Thanks: Tryllemann, Wetxius\n\nLocales\\English.lua\nLocales\\Chinese.lua\nLocales\\French.lua\nLocales\\German.lua\nLocales\\Italian.lua\nLocales\\Russian.lua\nLocales\\Spanish.lua\nLocales\\Taiwan.lua\n\nCore.lua\nOptions.lua"
  }
]