Quantcast

updated for wowi

Jennifer [06-26-19 - 21:16]
updated for wowi
Filename
CHANGELOG.txt
Core/Message.lua
EMA.toc
GUI/AceGUIContainer-EMAWindow.lua
Libs/AceAddon-3.0/AceAddon-3.0.lua
Libs/AceBucket-3.0/AceBucket-3.0.lua
Libs/AceComm-3.0/AceComm-3.0.lua
Libs/AceComm-3.0/ChatThrottleLib.lua
Libs/AceConfig-3.0/AceConfig-3.0.lua
Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
Libs/AceConsole-3.0/AceConsole-3.0.lua
Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
Libs/AceEvent-3.0/AceEvent-3.0.lua
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml
Libs/AceGUI-3.0-SharedMediaWidgets/CHANGES.txt
Libs/AceGUI-3.0-SharedMediaWidgets/R61 updated.txt
Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
Libs/AceGUI-3.0/AceGUI-3.0.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
Libs/AceHook-3.0/AceHook-3.0.lua
Libs/AceSerializer-3.0/AceSerializer-3.0.lua
Libs/AceTab-3.0/AceTab-3.0.lua
Libs/AceTimer-3.0/AceTimer-3.0.lua
Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
Libs/Changelog-Ace3-Release-r1151.txt
Libs/Changelog-Ace3-r1151.txt
Libs/Changelog-Ace3-r1214.txt
Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
Libs/LibSharedMedia-3.0/lib.xml
Libs/changelog-Ace3-r1202.txt
Locales/Core-Locale-enUS.lua
Media/Sounds/Warning.ogg
Media/Sounds/desktop.ini
Media/Sounds/raidwarning.ogg
Modules/Interaction.lua
Modules/Toon.lua
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index f047b27..37a88ff 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -2,15 +2,47 @@
 ChangeLogs:
 ---------------------------

-EMA Version: v8.1.5-Release-v2.0(0122)
+EMA Version: v8.2.0-Release-v2.1(0127)
+Game Version: 8.2.0
+Release Date: 26/6/2019
+
+## Core
+	- Updated Ace3
+	- Updated SharedMediaWidgets
+	- Updated LibSharedMedia-3.0
+
+
+
+## Message
+	- Fixed 8.2 Sound changes
+		- Added new sound EMA Warning (from jamba-extras)
+		- Had to added blizzard own Riad warning Sound for libsheardmedia to work. (hacky)
+
+
+
+
+
+
+---------------------------
+
+EMA Version: v8.1.5-Release-v2.1(0126)
 Game Version: 8.1.5
-Release Date: 21/4/2019
+Release Date: 8/6/2019

+## Core
+	- Updated Ace3
+	- Updated LibSharedMedia-3.0

 ## Item-Use
-	- Will now Disaply Item count to 9999 before it * out
+	- Will now Disaply Item count to 9999 before it * out Issue #20
+
+## Interaction
+	- Fixed a Bug not telling Team when you loot a Epic/Rare BoE items

+## Toon
+	- Fixed Issue #70

+
 ---------------------------

 EMA Version: v8.1.5-Release-v2.0(0121)
diff --git a/Core/Message.lua b/Core/Message.lua
index a56ba3f..88a8853 100644
--- a/Core/Message.lua
+++ b/Core/Message.lua
@@ -28,8 +28,8 @@ local EMAHelperSettings = LibStub:GetLibrary( "EMAHelperSettings-1.0" )
 local Media = LibStub("LibSharedMedia-3.0")

 -- Built in Sounds
-Media:Register("sound", "EMA: RaidWarning", "Sound\\interface\\RaidWarning.ogg")
-
+Media:Register("sound", "EMA: RaidWarning", "Interface\\Addons\\EMA\\Media\\Sounds\\raidwarning.ogg" )
+Media:Register("sound", "EMA: Warning", "Interface\\Addons\\EMA\\Media\\Sounds\\Warning.ogg")

 -- Constants and Locale for this module.
 EMA.moduleName = "Message"
@@ -886,6 +886,7 @@ end


 local function PlayMessageSound( soundToPlay )
+	--EMA:Print("test", Media:Fetch( 'sound', soundToPlay  ) )
 	PlaySoundFile( Media:Fetch( 'sound', soundToPlay ), "Ambience" )
 end

@@ -946,7 +947,8 @@ local function ProcessReceivedMessage( sender, areaName, message, suppressSender
 		-- Do nothing! Mute means eat the message.
 	end
 	if areaType.usesSound == true and area.soundToPlay ~= "None" then
-		PlayMessageSound(area.soundToPlay)
+		--EMA:Print("test", area.soundToPlay )
+		PlayMessageSound(area.soundToPlay )
 	end
 end

diff --git a/EMA.toc b/EMA.toc
index 754a91f..da37bbd 100644
--- a/EMA.toc
+++ b/EMA.toc
@@ -1,8 +1,8 @@
-## Interface: 80100
+## Interface: 80200
 ## Title: EMA
 ## Notes: Ebony's MultiBoxing Assistant
 ## Author: Jennifer Calladine 'Ebony'
-## Version: v8.1.5-Release-v2.0(0121)
+## Version: v8.1.5-Release-v2.1(0127)
 ## SavedVariables: CoreProfileDB, CommunicationsProfileDB, TeamProfileDB, TagProfileDB, MessageProfileDB, CurrProfileDB, DisplayTeamProfileDB, FollowProfileDB, GuildProfileDB, InteractionProfileDB, ItemUseProfileDB, PurchaseProfileDB, QuestProfileDB,  QuestWatcherProfileDB, SellProfileDB, TalkProfileDB, ToonProfileDB, TradeProfileDB, MailProfileDB, ISBoxerProfileDB

 #Libs
diff --git a/GUI/AceGUIContainer-EMAWindow.lua b/GUI/AceGUIContainer-EMAWindow.lua
index 635e7b4..4072ecf 100644
--- a/GUI/AceGUIContainer-EMAWindow.lua
+++ b/GUI/AceGUIContainer-EMAWindow.lua
@@ -50,7 +50,7 @@ Scripts
 -------------------------------------------------------------------------------]]
 local function Button_OnClick(frame)
 	--7.3 PlaySound Update.
-	PlaySound(PlaySoundKitID and "gsTitleOptionExit" or 799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
+	PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
 	frame.obj:Hide()
 end

diff --git a/Libs/AceAddon-3.0/AceAddon-3.0.lua b/Libs/AceAddon-3.0/AceAddon-3.0.lua
index e9d4154..2b2a00e 100644
--- a/Libs/AceAddon-3.0/AceAddon-3.0.lua
+++ b/Libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -6,29 +6,29 @@
 -- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
 -- * **OnDisable**, which is only called when your addon is manually being disabled.
 -- @usage
--- -- A small (but complete) addon, that doesn't do anything,
+-- -- A small (but complete) addon, that doesn't do anything,
 -- -- but shows usage of the callbacks.
 -- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
---
+--
 -- function MyAddon:OnInitialize()
---   -- do init tasks here, like loading the Saved Variables,
+--   -- do init tasks here, like loading the Saved Variables,
 --   -- or setting up slash commands.
 -- end
---
+--
 -- function MyAddon:OnEnable()
 --   -- Do more initialization here, that really enables the use of your addon.
---   -- Register Events, Hook functions, Create Frames, Get information from
+--   -- Register Events, Hook functions, Create Frames, Get information from
 --   -- the game that wasn't available in OnInitialize
 -- end
 --
 -- function MyAddon:OnDisable()
 --   -- Unhook, Unregister Events, Hide frames that you created.
---   -- You would probably only use an OnDisable if you want to
+--   -- You would probably only use an OnDisable if you want to
 --   -- build a "standby" mode, or be able to toggle modules on/off.
 -- end
 -- @class file
 -- @name AceAddon-3.0.lua
--- @release $Id: AceAddon-3.0.lua 1184 2018-07-21 14:13:14Z nevcairiel $
+-- @release $Id: AceAddon-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 local MAJOR, MINOR = "AceAddon-3.0", 12
 local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -75,7 +75,7 @@ end
 local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype

 -- used in the addon metatable
-local function addontostring( self ) return self.name end
+local function addontostring( self ) return self.name end

 -- Check if the addon is queued for initialization
 local function queuedForInitialization(addon)
@@ -88,14 +88,14 @@ local function queuedForInitialization(addon)
 end

 --- Create a new AceAddon-3.0 addon.
--- Any libraries you specified will be embeded, and the addon will be scheduled for
+-- Any libraries you specified will be embeded, and the addon will be scheduled for
 -- its OnInitialize and OnEnable callbacks.
 -- The final addon object, with all libraries embeded, will be returned.
 -- @paramsig [object ,]name[, lib, ...]
 -- @param object Table to use as a base for the addon (optional)
 -- @param name Name of the addon object to create
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create a simple addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
 --
@@ -115,10 +115,10 @@ function AceAddon:NewAddon(objectorname, ...)
 	if type(name)~="string" then
 		error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
 	end
-	if self.addons[name] then
+	if self.addons[name] then
 		error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
 	end
-
+
 	object = object or {}
 	object.name = name

@@ -128,7 +128,7 @@ function AceAddon:NewAddon(objectorname, ...)
 		for k, v in pairs(oldmeta) do addonmeta[k] = v end
 	end
 	addonmeta.__tostring = addontostring
-
+
 	setmetatable( object, addonmeta )
 	self.addons[name] = object
 	object.modules = {}
@@ -136,7 +136,7 @@ function AceAddon:NewAddon(objectorname, ...)
 	object.defaultModuleLibraries = {}
 	Embed( object ) -- embed NewModule, GetModule methods
 	self:EmbedLibraries(object, select(i,...))
-
+
 	-- add to queue of addons to be initialized upon ADDON_LOADED
 	tinsert(self.initializequeue, object)
 	return object
@@ -147,7 +147,7 @@ end
 -- Throws an error if the addon object cannot be found (except if silent is set).
 -- @param name unique name of the addon object
 -- @param silent if true, the addon is optional, silently return nil if its not found
--- @usage
+-- @usage
 -- -- Get the Addon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 function AceAddon:GetAddon(name, silent)
@@ -202,7 +202,7 @@ end
 -- @paramsig name[, silent]
 -- @param name unique name of the module
 -- @param silent if true, the module is optional, silently return nil if its not found (optional)
--- @usage
+-- @usage
 -- -- Get the Addon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- -- Get the Module
@@ -225,23 +225,23 @@ local function IsModuleTrue(self) return true end
 -- @param name unique name of the module
 -- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create a module with some embeded libraries
 -- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
---
+--
 -- -- Create a module with a prototype
 -- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
 -- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
 function NewModule(self, name, prototype, ...)
 	if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
 	if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
-
+
 	if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
-
+
 	-- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
 	-- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
 	local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
-
+
 	module.IsModule = IsModuleTrue
 	module:SetEnabledState(self.defaultModuleState)
 	module.moduleName = name
@@ -256,24 +256,24 @@ function NewModule(self, name, prototype, ...)
 	if not prototype or type(prototype) == "string" then
 		prototype = self.defaultModulePrototype or nil
 	end
-
+
 	if type(prototype) == "table" then
 		local mt = getmetatable(module)
 		mt.__index = prototype
 		setmetatable(module, mt)  -- More of a Base class type feel.
 	end
-
+
 	safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
 	self.modules[name] = module
 	tinsert(self.orderedModules, module)
-
+
 	return module
 end

 --- Returns the real name of the addon or module, without any prefix.
 -- @name //addon//:GetName
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- print(MyAddon:GetName())
 -- -- prints "MyAddon"
 function GetName(self)
@@ -285,8 +285,8 @@ end
 -- and enabling all modules of the addon (unless explicitly disabled).\\
 -- :Enable() also sets the internal `enableState` variable to true
 -- @name //addon//:Enable
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Enable MyModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -306,8 +306,8 @@ end
 -- and disabling all modules of the addon.\\
 -- :Disable() also sets the internal `enableState` variable to false
 -- @name //addon//:Disable
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Disable MyAddon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyAddon:Disable()
@@ -320,7 +320,7 @@ end
 -- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
 -- @name //addon//:EnableModule
 -- @paramsig name
--- @usage
+-- @usage
 -- -- Enable MyModule using :GetModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -338,7 +338,7 @@ end
 -- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
 -- @name //addon//:DisableModule
 -- @paramsig name
--- @usage
+-- @usage
 -- -- Disable MyModule using :GetModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -357,7 +357,7 @@ end
 -- @name //addon//:SetDefaultModuleLibraries
 -- @paramsig lib[, lib, ...]
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create the addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
 -- -- Configure default libraries for modules (all modules need AceEvent-3.0)
@@ -376,7 +376,7 @@ end
 -- @name //addon//:SetDefaultModuleState
 -- @paramsig state
 -- @param state Default state for new modules, true for enabled, false for disabled
--- @usage
+-- @usage
 -- -- Create the addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
 -- -- Set the default state to "disabled"
@@ -396,7 +396,7 @@ end
 -- @name //addon//:SetDefaultModulePrototype
 -- @paramsig prototype
 -- @param prototype Default prototype for the new modules (table)
--- @usage
+-- @usage
 -- -- Define a prototype
 -- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
 -- -- Set the default prototype
@@ -428,8 +428,8 @@ end

 --- Return an iterator of all modules associated to the addon.
 -- @name //addon//:IterateModules
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Enable all modules
 -- for name, module in MyAddon:IterateModules() do
 --    module:Enable()
@@ -438,13 +438,13 @@ local function IterateModules(self) return pairs(self.modules) end

 -- Returns an iterator of all embeds in the addon
 -- @name //addon//:IterateEmbeds
--- @paramsig
+-- @paramsig
 local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end

 --- Query the enabledState of an addon.
 -- @name //addon//:IsEnabled
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- if MyAddon:IsEnabled() then
 --     MyAddon:Disable()
 -- end
@@ -489,20 +489,20 @@ end

 -- - Initialize the addon after creation.
 -- This function is only used internally during the ADDON_LOADED event
--- It will call the **OnInitialize** function on the addon object (if present),
+-- It will call the **OnInitialize** function on the addon object (if present),
 -- and the **OnEmbedInitialize** function on all embeded libraries.
---
+--
 -- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
 -- @param addon addon object to intialize
 function AceAddon:InitializeAddon(addon)
 	safecall(addon.OnInitialize, addon)
-
+
 	local embeds = self.embeds[addon]
 	for i = 1, #embeds do
 		local lib = LibStub:GetLibrary(embeds[i], true)
 		if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
 	end
-
+
 	-- we don't call InitializeAddon on modules specifically, this is handled
 	-- from the event handler and only done _once_
 end
@@ -510,7 +510,7 @@ end
 -- - Enable the addon after creation.
 -- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
 -- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
--- It will call the **OnEnable** function on the addon object (if present),
+-- It will call the **OnEnable** function on the addon object (if present),
 -- and the **OnEmbedEnable** function on all embeded libraries.\\
 -- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
 --
@@ -520,12 +520,12 @@ end
 function AceAddon:EnableAddon(addon)
 	if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
 	if self.statuses[addon.name] or not addon.enabledState then return false end
-
+
 	-- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
 	self.statuses[addon.name] = true
-
+
 	safecall(addon.OnEnable, addon)
-
+
 	-- make sure we're still enabled before continueing
 	if self.statuses[addon.name] then
 		local embeds = self.embeds[addon]
@@ -533,7 +533,7 @@ function AceAddon:EnableAddon(addon)
 			local lib = LibStub:GetLibrary(embeds[i], true)
 			if lib then safecall(lib.OnEmbedEnable, lib, addon) end
 		end
-
+
 		-- enable possible modules.
 		local modules = addon.orderedModules
 		for i = 1, #modules do
@@ -545,24 +545,24 @@ end

 -- - Disable the addon
 -- Note: This function is only used internally.
--- It will call the **OnDisable** function on the addon object (if present),
+-- It will call the **OnDisable** function on the addon object (if present),
 -- and the **OnEmbedDisable** function on all embeded libraries.\\
 -- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
 --
--- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
 -- Use :Disable on the addon itself instead.
 -- @param addon addon object to enable
 function AceAddon:DisableAddon(addon)
 	if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
 	if not self.statuses[addon.name] then return false end
-
+
 	-- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
 	self.statuses[addon.name] = false
-
+
 	safecall( addon.OnDisable, addon )
-
+
 	-- make sure we're still disabling...
-	if not self.statuses[addon.name] then
+	if not self.statuses[addon.name] then
 		local embeds = self.embeds[addon]
 		for i = 1, #embeds do
 			local lib = LibStub:GetLibrary(embeds[i], true)
@@ -574,12 +574,12 @@ function AceAddon:DisableAddon(addon)
 			self:DisableAddon(modules[i])
 		end
 	end
-
+
 	return not self.statuses[addon.name] -- return true if we're disabled
 end

 --- Get an iterator over all registered addons.
--- @usage
+-- @usage
 -- -- Print a list of all installed AceAddon's
 -- for name, addon in AceAddon:IterateAddons() do
 --   print("Addon: " .. name)
@@ -587,7 +587,7 @@ end
 function AceAddon:IterateAddons() return pairs(self.addons) end

 --- Get an iterator over the internal status registry.
--- @usage
+-- @usage
 -- -- Print a list of all enabled addons
 -- for name, status in AceAddon:IterateAddonStatus() do
 --   if status then
@@ -613,7 +613,7 @@ local function onEvent(this, event, arg1)
 			AceAddon:InitializeAddon(addon)
 			tinsert(AceAddon.enablequeue, addon)
 		end
-
+
 		if IsLoggedIn() then
 			while(#AceAddon.enablequeue > 0) do
 				local addon = tremove(AceAddon.enablequeue, 1)
diff --git a/Libs/AceBucket-3.0/AceBucket-3.0.lua b/Libs/AceBucket-3.0/AceBucket-3.0.lua
index 5d42530..514c05e 100644
--- a/Libs/AceBucket-3.0/AceBucket-3.0.lua
+++ b/Libs/AceBucket-3.0/AceBucket-3.0.lua
@@ -1,28 +1,28 @@
 --- A bucket to catch events in. **AceBucket-3.0** provides throttling of events that fire in bursts and
 -- your addon only needs to know about the full burst.
---
+--
 -- This Bucket implementation works as follows:\\
 --   Initially, no schedule is running, and its waiting for the first event to happen.\\
 --   The first event will start the bucket, and get the scheduler running, which will collect all
---   events in the given interval. When that interval is reached, the bucket is pushed to the
---   callback and a new schedule is started. When a bucket is empty after its interval, the scheduler is
+--   events in the given interval. When that interval is reached, the bucket is pushed to the
+--   callback and a new schedule is started. When a bucket is empty after its interval, the scheduler is
 --   stopped, and the bucket is only listening for the next event to happen, basically back in its initial state.
---
--- In addition, the buckets collect information about the "arg1" argument of the events that fire, and pass those as a
+--
+-- In addition, the buckets collect information about the "arg1" argument of the events that fire, and pass those as a
 -- table to your callback. This functionality was mostly designed for the UNIT_* events.\\
 -- The table will have the different values of "arg1" as keys, and the number of occurances as their value, e.g.\\
 --   { ["player"] = 2, ["target"] = 1, ["party1"] = 1 }
 --
--- **AceBucket-3.0** can be embeded into your addon, either explicitly by calling AceBucket:Embed(MyAddon) or by
+-- **AceBucket-3.0** can be embeded into your addon, either explicitly by calling AceBucket:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceBucket itself.\\
 -- It is recommended to embed AceBucket, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceBucket.
 -- @usage
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("BucketExample", "AceBucket-3.0")
---
+--
 -- function MyAddon:OnEnable()
---   -- Register a bucket that listens to all the HP related events,
+--   -- Register a bucket that listens to all the HP related events,
 --   -- and fires once per second
 --   self:RegisterBucketEvent({"UNIT_HEALTH", "UNIT_MAXHEALTH"}, 1, "UpdateHealth")
 -- end
@@ -34,7 +34,7 @@
 -- end
 -- @class file
 -- @name AceBucket-3.0.lua
--- @release $Id: AceBucket-3.0.lua 1185 2018-07-21 14:15:16Z nevcairiel $
+-- @release $Id: AceBucket-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 local MAJOR, MINOR = "AceBucket-3.0", 4
 local AceBucket, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -79,7 +79,7 @@ end
 -- send the bucket to the callback function and schedule the next FireBucket in interval seconds
 local function FireBucket(bucket)
 	local received = bucket.received
-
+
 	-- we dont want to fire empty buckets
 	if next(received) ~= nil then
 		local callback = bucket.callback
@@ -88,11 +88,11 @@ local function FireBucket(bucket)
 		else
 			safecall(callback, received)
 		end
-
+
 		for k in pairs(received) do
 			received[k] = nil
 		end
-
+
 		-- if the bucket was not empty, schedule another FireBucket in interval seconds
 		bucket.timer = AceTimer.ScheduleTimer(bucket, FireBucket, bucket.interval, bucket)
 	else -- if it was empty, clear the timer and wait for the next event
@@ -101,16 +101,16 @@ local function FireBucket(bucket)
 end

 -- BucketHandler ( event, arg1 )
---
+--
 -- callback func for AceEvent
 -- stores arg1 in the received table, and schedules the bucket if necessary
 local function BucketHandler(self, event, arg1)
 	if arg1 == nil then
 		arg1 = "nil"
 	end
-
+
 	self.received[arg1] = (self.received[arg1] or 0) + 1
-
+
 	-- if we are not scheduled yet, start a timer on the interval for our bucket to be cleared
 	if not self.timer then
 		self.timer = AceTimer.ScheduleTimer(self, FireBucket, self.interval, self)
@@ -125,14 +125,14 @@ end
 -- isMessage(boolean) - register AceEvent Messages instead of game events
 local function RegisterBucket(self, event, interval, callback, isMessage)
 	-- try to fetch the librarys
-	if not AceEvent or not AceTimer then
+	if not AceEvent or not AceTimer then
 		AceEvent = LibStub:GetLibrary("AceEvent-3.0", true)
 		AceTimer = LibStub:GetLibrary("AceTimer-3.0", true)
 		if not AceEvent or not AceTimer then
 			error(MAJOR .. " requires AceEvent-3.0 and AceTimer-3.0", 3)
 		end
 	end
-
+
 	if type(event) ~= "string" and type(event) ~= "table" then error("Usage: RegisterBucket(event, interval, callback): 'event' - string or table expected.", 3) end
 	if not callback then
 		if type(event) == "string" then
@@ -144,7 +144,7 @@ local function RegisterBucket(self, event, interval, callback, isMessage)
 	if not tonumber(interval) then error("Usage: RegisterBucket(event, interval, callback): 'interval' - number expected.", 3) end
 	if type(callback) ~= "string" and type(callback) ~= "function" then error("Usage: RegisterBucket(event, interval, callback): 'callback' - string or function or nil expected.", 3) end
 	if type(callback) == "string" and type(self[callback]) ~= "function" then error("Usage: RegisterBucket(event, interval, callback): 'callback' - method not found on target object.", 3) end
-
+
 	local bucket = next(bucketCache)
 	if bucket then
 		bucketCache[bucket] = nil
@@ -152,9 +152,9 @@ local function RegisterBucket(self, event, interval, callback, isMessage)
 		bucket = { handler = BucketHandler, received = {} }
 	end
 	bucket.object, bucket.callback, bucket.interval = self, callback, tonumber(interval)
-
+
 	local regFunc = isMessage and AceEvent.RegisterMessage or AceEvent.RegisterEvent
-
+
 	if type(event) == "table" then
 		for _,e in pairs(event) do
 			regFunc(bucket, e, "handler")
@@ -162,10 +162,10 @@ local function RegisterBucket(self, event, interval, callback, isMessage)
 	else
 		regFunc(bucket, event, "handler")
 	end
-
+
 	local handle = tostring(bucket)
 	AceBucket.buckets[handle] = bucket
-
+
 	return handle
 end

@@ -177,7 +177,7 @@ end
 -- @usage
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceBucket-3.0")
 -- MyAddon:RegisterBucketEvent("BAG_UPDATE", 0.2, "UpdateBags")
---
+--
 -- function MyAddon:UpdateBags()
 --   -- do stuff
 -- end
@@ -193,7 +193,7 @@ end
 -- @usage
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceBucket-3.0")
 -- MyAddon:RegisterBucketEvent("SomeAddon_InformationMessage", 0.2, "ProcessData")
---
+--
 -- function MyAddon:ProcessData()
 --   -- do stuff
 -- end
@@ -208,17 +208,17 @@ function AceBucket:UnregisterBucket(handle)
 	if bucket then
 		AceEvent.UnregisterAllEvents(bucket)
 		AceEvent.UnregisterAllMessages(bucket)
-
+
 		-- clear any remaining data in the bucket
 		for k in pairs(bucket.received) do
 			bucket.received[k] = nil
 		end
-
+
 		if bucket.timer then
 			AceTimer.CancelTimer(bucket, bucket.timer)
 			bucket.timer = nil
 		end
-
+
 		AceBucket.buckets[handle] = nil
 		-- store our bucket in the cache
 		bucketCache[bucket] = true
@@ -240,10 +240,10 @@ end
 -- embedding and embed handling
 local mixins = {
 	"RegisterBucketEvent",
-	"RegisterBucketMessage",
+	"RegisterBucketMessage",
 	"UnregisterBucket",
 	"UnregisterAllBuckets",
-}
+}

 -- Embeds AceBucket into the target object making the functions from the mixins list available on target:..
 -- @param target target object to embed AceBucket in
diff --git a/Libs/AceComm-3.0/AceComm-3.0.lua b/Libs/AceComm-3.0/AceComm-3.0.lua
index 9a38979..242d92c 100644
--- a/Libs/AceComm-3.0/AceComm-3.0.lua
+++ b/Libs/AceComm-3.0/AceComm-3.0.lua
@@ -2,14 +2,14 @@
 -- It'll automatically split the messages into multiple parts and rebuild them on the receiving end.\\
 -- **ChatThrottleLib** is of course being used to avoid being disconnected by the server.
 --
--- **AceComm-3.0** can be embeded into your addon, either explicitly by calling AceComm:Embed(MyAddon) or by
+-- **AceComm-3.0** can be embeded into your addon, either explicitly by calling AceComm:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceComm itself.\\
 -- It is recommended to embed AceComm, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceComm.
 -- @class file
 -- @name AceComm-3.0
--- @release $Id: AceComm-3.0.lua 1174 2018-05-14 17:29:49Z h.leppkes@gmail.com $
+-- @release $Id: AceComm-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 --[[ AceComm-3.0

@@ -52,7 +52,7 @@ AceComm.multipart_origprefixes = nil
 AceComm.multipart_reassemblers = nil

 -- the multipart message spool: indexed by a combination of sender+distribution+
-AceComm.multipart_spool = AceComm.multipart_spool or {}
+AceComm.multipart_spool = AceComm.multipart_spool or {}

 --- Register for Addon Traffic on a specified prefix
 -- @param prefix A printable character (\032-\255) classification of the message (typically AddonName or AddonNameEvent), max 16 characters
@@ -90,7 +90,7 @@ function AceComm:SendCommMessage(prefix, text, distribution, target, prio, callb
 			type(text)=="string" and
 			type(distribution)=="string" and
 			(target==nil or type(target)=="string" or type(target)=="number") and
-			(prio=="BULK" or prio=="NORMAL" or prio=="ALERT")
+			(prio=="BULK" or prio=="NORMAL" or prio=="ALERT")
 		) then
 		error('Usage: SendCommMessage(addon, "prefix", "text", "distribution"[, "target"[, "prio"[, callbackFn, callbackarg]]])', 2)
 	end
@@ -105,7 +105,7 @@ function AceComm:SendCommMessage(prefix, text, distribution, target, prio, callb
 			return callbackFn(callbackArg, sent, textlen)
 		end
 	end
-
+
 	local forceMultipart
 	if match(text, "^[\001-\009]") then -- 4.1+: see if the first character is a control character
 		-- we need to escape the first character with a \004
@@ -150,17 +150,17 @@ do
 	local compost = setmetatable({}, {__mode = "k"})
 	local function new()
 		local t = next(compost)
-		if t then
+		if t then
 			compost[t]=nil
 			for i=#t,3,-1 do	-- faster than pairs loop. don't even nil out 1/2 since they'll be overwritten
 				t[i]=nil
 			end
 			return t
 		end
-
+
 		return {}
 	end
-
+
 	local function lostdatawarning(prefix,sender,where)
 		DEFAULT_CHAT_FRAME:AddMessage(MAJOR..": Warning: lost network data regarding '"..tostring(prefix).."' from '"..tostring(sender).."' (in "..where..")")
 	end
@@ -168,14 +168,14 @@ do
 	function AceComm:OnReceiveMultipartFirst(prefix, message, distribution, sender)
 		local key = prefix.."\t"..distribution.."\t"..sender	-- a unique stream is defined by the prefix + distribution + sender
 		local spool = AceComm.multipart_spool
-
+
 		--[[
-		if spool[key] then
+		if spool[key] then
 			lostdatawarning(prefix,sender,"First")
 			-- continue and overwrite
 		end
 		--]]
-
+
 		spool[key] = message  -- plain string for now
 	end

@@ -183,7 +183,7 @@ do
 		local key = prefix.."\t"..distribution.."\t"..sender	-- a unique stream is defined by the prefix + distribution + sender
 		local spool = AceComm.multipart_spool
 		local olddata = spool[key]
-
+
 		if not olddata then
 			--lostdatawarning(prefix,sender,"Next")
 			return
@@ -204,14 +204,14 @@ do
 		local key = prefix.."\t"..distribution.."\t"..sender	-- a unique stream is defined by the prefix + distribution + sender
 		local spool = AceComm.multipart_spool
 		local olddata = spool[key]
-
+
 		if not olddata then
 			--lostdatawarning(prefix,sender,"End")
 			return
 		end

 		spool[key] = nil
-
+
 		if type(olddata) == "table" then
 			-- if we've received a "next", the spooled data will be a table for rapid & garbage-free tconcat
 			tinsert(olddata, message)
diff --git a/Libs/AceComm-3.0/ChatThrottleLib.lua b/Libs/AceComm-3.0/ChatThrottleLib.lua
index 01088f6..ad21af4 100644
--- a/Libs/AceComm-3.0/ChatThrottleLib.lua
+++ b/Libs/AceComm-3.0/ChatThrottleLib.lua
@@ -3,7 +3,7 @@
 --
 -- Manages AddOn chat output to keep player from getting kicked off.
 --
--- ChatThrottleLib:SendChatMessage/:SendAddonMessage functions that accept
+-- ChatThrottleLib:SendChatMessage/:SendAddonMessage functions that accept
 -- a Priority ("BULK", "NORMAL", "ALERT") as well as prefix for SendChatMessage.
 --
 -- Priorities get an equal share of available bandwidth when fully loaded.
@@ -118,7 +118,7 @@ end


 -----------------------------------------------------------------------
--- Recycling bin for pipes
+-- Recycling bin for pipes
 -- A pipe is a plain integer-indexed queue of messages
 -- Pipes normally live in Rings of pipes  (3 rings total, one per priority)

@@ -169,7 +169,7 @@ end
 -- Initialize queues, set up frame for OnUpdate, etc


-function ChatThrottleLib:Init()
+function ChatThrottleLib:Init()

 	-- Set up queues
 	if not self.Prio then
@@ -356,8 +356,8 @@ function ChatThrottleLib.OnUpdate(this,delay)
 	-- See how many of our priorities have queued messages (we only have 3, don't worry about the loop)
 	local n = 0
 	for prioname,Prio in pairs(self.Prio) do
-		if Prio.Ring.pos or Prio.avail < 0 then
-			n = n + 1
+		if Prio.Ring.pos or Prio.avail < 0 then
+			n = n + 1
 		end
 	end

diff --git a/Libs/AceConfig-3.0/AceConfig-3.0.lua b/Libs/AceConfig-3.0/AceConfig-3.0.lua
index a99ddf7..5071cdc 100644
--- a/Libs/AceConfig-3.0/AceConfig-3.0.lua
+++ b/Libs/AceConfig-3.0/AceConfig-3.0.lua
@@ -3,7 +3,7 @@
 -- as well as associate it with a slash command.
 -- @class file
 -- @name AceConfig-3.0
--- @release $Id: AceConfig-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 --[[
 AceConfig-3.0
@@ -45,7 +45,7 @@ local pcall, error, type, pairs = pcall, error, type, pairs
 function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
 	local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
 	if not ok then error(msg, 2) end
-
+
 	if slashcmd then
 		if type(slashcmd) == "table" then
 			for _,cmd in pairs(slashcmd) do
diff --git a/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
index 33f9fe1..5113875 100644
--- a/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
+++ b/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
@@ -1,7 +1,7 @@
 --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
 -- @class file
 -- @name AceConfigCmd-3.0
--- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 --[[
 AceConfigCmd-3.0
@@ -63,7 +63,7 @@ local funcmsg = "expected function or member name"

 -- pickfirstset() - picks the first non-nil value and returns it

-local function pickfirstset(...)
+local function pickfirstset(...)
 	for i=1,select("#",...) do
 		if select(i,...)~=nil then
 			return select(i,...)
@@ -120,7 +120,7 @@ local function callfunction(info, tab, methodtype, ...)
 	info.arg = tab.arg
 	info.option = tab
 	info.type = tab.type
-
+
 	if type(method)=="function" then
 		return method(info, ...)
 	else
@@ -131,7 +131,7 @@ end
 -- do_final() - do the final step (set/execute) along with validation and confirmation

 local function do_final(info, inputpos, tab, methodtype, ...)
-	if info.validate then
+	if info.validate then
 		local res = callmethod(info,inputpos,tab,"validate",...)
 		if type(res)=="string" then
 			usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
@@ -139,7 +139,7 @@ local function do_final(info, inputpos, tab, methodtype, ...)
 		end
 	end
 	-- console ignores .confirm
-
+
 	callmethod(info,inputpos,tab,methodtype, ...)
 end

@@ -152,8 +152,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
 	if val~=nil then
 		if val==false then
 			val=nil
-		elseif not types[type(val)] then
-			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
+		elseif not types[type(val)] then
+			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
 		end
 		info[paramname] = val
 		info[paramname.."_at"] = depth
@@ -166,13 +166,13 @@ end
 local dummytable={}

 local function iterateargs(tab)
-	if not tab.plugins then
-		return pairs(tab.args)
+	if not tab.plugins then
+		return pairs(tab.args)
 	end
-
+
 	local argtabkey,argtab=next(tab.plugins)
 	local v
-
+
 	return function(_, k)
 		while argtab do
 			k,v = next(argtab, k)
@@ -206,18 +206,18 @@ local function showhelp(info, inputpos, tab, depth, noHead)
 	if not noHead then
 		print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
 	end
-
+
 	local sortTbl = {}	-- [1..n]=name
 	local refTbl = {}   -- [name]=tableref
-
+
 	for k,v in iterateargs(tab) do
 		if not refTbl[k] then	-- a plugin overriding something in .args
 			tinsert(sortTbl, k)
 			refTbl[k] = v
 		end
 	end
-
-	tsort(sortTbl, function(one, two)
+
+	tsort(sortTbl, function(one, two)
 		local o1 = refTbl[one].order or 100
 		local o2 = refTbl[two].order or 100
 		if type(o1) == "function" or type(o1) == "string" then
@@ -240,7 +240,7 @@ local function showhelp(info, inputpos, tab, depth, noHead)
 		if o1==o2 then return tostring(one)<tostring(two) end   -- compare names
 		return o1<o2
 	end)
-
+
 	for i = 1, #sortTbl do
 		local k = sortTbl[i]
 		local v = refTbl[k]
@@ -327,7 +327,7 @@ local function keybindingValidateFunc(text)
 	return s
 end

--- handle() - selfrecursing function that processes input->optiontable
+-- handle() - selfrecursing function that processes input->optiontable
 -- - depth - starts at 0
 -- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)

@@ -346,16 +346,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
 	local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
 	local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
 	--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
-
+
 	-------------------------------------------------------------------
 	-- Act according to .type of this table
-
+
 	if tab.type=="group" then
 		------------ group --------------------------------------------
-
+
 		if type(tab.args)~="table" then err(info, inputpos) end
 		if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
-
+
 		-- grab next arg from input
 		local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
 		if not arg then
@@ -363,11 +363,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			return
 		end
 		nextpos=nextpos+1
-
+
 		-- loop .args and try to find a key with a matching name
 		for k,v in iterateargs(tab) do
 			if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
-
+
 			-- is this child an inline group? if so, traverse into it
 			if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
 				info[depth+1] = k
@@ -383,8 +383,8 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				return handle(info,nextpos,v,depth+1)
 			end
 		end
-
-		-- no match
+
+		-- no match
 		if retfalse then
 			-- restore old infotable members and return false to indicate failure
 			info.handler,info.handler_at = oldhandler,oldhandler_at
@@ -395,23 +395,23 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
 			return false
 		end
-
+
 		-- couldn't find the command, display error
 		usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
 		return
 	end
-
+
 	local str = strsub(info.input,inputpos);
-
+
 	if tab.type=="execute" then
 		------------ execute --------------------------------------------
 		do_final(info, inputpos, tab, "func")
-

-
+
+
 	elseif tab.type=="input" then
 		------------ input --------------------------------------------
-
+
 		local res = true
 		if tab.pattern then
 			if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
@@ -420,11 +420,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				return
 			end
 		end
-
+
 		do_final(info, inputpos, tab, "set", str)
-

-
+
+
 	elseif tab.type=="toggle" then
 		------------ toggle --------------------------------------------
 		local b
@@ -444,7 +444,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			else
 				b = not b
 			end
-
+
 		elseif str==L["on"] then
 			b = true
 		elseif str==L["off"] then
@@ -459,9 +459,9 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			end
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", b)
-
+

 	elseif tab.type=="range" then
 		------------ range --------------------------------------------
@@ -481,21 +481,21 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", val)

-
+
 	elseif tab.type=="select" then
 		------------ select ------------------------------------
 		local str = strtrim(strlower(str))
-
+
 		local values = tab.values
 		if type(values) == "function" or type(values) == "string" then
 			info.values = values
 			values = callmethod(info, inputpos, tab, "values")
 			info.values = nil
 		end
-
+
 		if str == "" then
 			local b = callmethod(info, inputpos, tab, "get")
 			local fmt = "|cffffff78- [%s]|r %s"
@@ -512,7 +512,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 		end

 		local ok
-		for k,v in pairs(values) do
+		for k,v in pairs(values) do
 			if strlower(k)==str then
 				str = k	-- overwrite with key (in case of case mismatches)
 				ok = true
@@ -523,20 +523,20 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", str)
-
+
 	elseif tab.type=="multiselect" then
 		------------ multiselect -------------------------------------------
 		local str = strtrim(strlower(str))
-
+
 		local values = tab.values
 		if type(values) == "function" or type(values) == "string" then
 			info.values = values
 			values = callmethod(info, inputpos, tab, "values")
 			info.values = nil
 		end
-
+
 		if str == "" then
 			local fmt = "|cffffff78- [%s]|r %s"
 			local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
@@ -550,7 +550,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			end
 			return
 		end
-
+
 		--build a table of the selections, checking that they exist
 		--parse for =on =off =default in the process
 		--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
@@ -559,25 +559,25 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--parse option=on etc
 			local opt, val = v:match('(.+)=(.+)')
 			--get option if toggling
-			if not opt then
-				opt = v
+			if not opt then
+				opt = v
 			end
-
+
 			--check that the opt is valid
 			local ok
-			for k,v in pairs(values) do
+			for k,v in pairs(values) do
 				if strlower(k)==opt then
 					opt = k	-- overwrite with key (in case of case mismatches)
 					ok = true
 					break
 				end
 			end
-
+
 			if not ok then
 				usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
 				return
 			end
-
+
 			--check that if val was supplied it is valid
 			if val then
 				if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
@@ -596,14 +596,14 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				sels[opt] = true
 			end
 		end
-
+
 		for opt, val in pairs(sels) do
 			local newval
-
+
 			if (val == true) then
 				--toggle the option
 				local b = callmethod(info, inputpos, tab, "get", opt)
-
+
 				if tab.tristate then
 					--cycle in true, nil, false order
 					if b then
@@ -627,11 +627,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 					newval = nil
 				end
 			end
-
+
 			do_final(info, inputpos, tab, "set", opt, newval)
 		end
-
-
+
+
 	elseif tab.type=="color" then
 		------------ color --------------------------------------------
 		local str = strtrim(strlower(str))
@@ -639,16 +639,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--TODO: Show current value
 			return
 		end
-
+
 		local r, g, b, a
-
+
 		local hasAlpha = tab.hasAlpha
 		if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
 			info.hasAlpha = hasAlpha
 			hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
 			info.hasAlpha = nil
 		end
-
+
 		if hasAlpha then
 			if str:len() == 8 and str:find("^%x*$")  then
 				--parse a hex string
@@ -662,7 +662,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
 				return
 			end
-
+
 			if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
 				--values are valid
 			elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
@@ -701,7 +701,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
 			end
 		end
-
+
 		do_final(info, inputpos, tab, "set", r,g,b,a)

 	elseif tab.type=="keybinding" then
@@ -737,7 +737,7 @@ end
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
 -- -- Use AceConsole-3.0 to register a Chat Command
 -- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
---
+--
 -- -- Show the GUI if no input is supplied, otherwise handle the chat input.
 -- function MyAddon:ChatCommand(input)
 --   -- Assuming "MyOptions" is the appName of a valid options table
@@ -754,7 +754,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 		error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
 	end
 	local options = assert( optgetter("cmd", MAJOR) )
-
+
 	local info = {   -- Don't try to recycle this, it gets handed off to callbacks and whatnot
 		[0] = slashcmd,
 		appName = appName,
@@ -765,7 +765,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 		uiType = "cmd",
 		uiName = MAJOR,
 	}
-
+
 	handle(info, 1, options, 0)  -- (info, inputpos, table, depth)
 end

diff --git a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index d5cbc45..bcfe071 100644
--- a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
@@ -1,13 +1,13 @@
 --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
 -- @class file
 -- @name AceConfigDialog-3.0
--- @release $Id: AceConfigDialog-3.0.lua 1197 2019-01-21 23:41:10Z nevcairiel $
+-- @release $Id: AceConfigDialog-3.0.lua 1212 2019-06-26 05:53:51Z nevcairiel $

 local LibStub = LibStub
 local gui = LibStub("AceGUI-3.0")
 local reg = LibStub("AceConfigRegistry-3.0")

-local MAJOR, MINOR = "AceConfigDialog-3.0", 69
+local MAJOR, MINOR = "AceConfigDialog-3.0", 73
 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigDialog then return end
@@ -56,18 +56,18 @@ local width_multiplier = 170
 --[[
 Group Types
   Tree 	- All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
-  		- Descendant Groups with inline=true and thier children will not become nodes
+        - Descendant Groups with inline=true and thier children will not become nodes

   Tab	- Direct Child Groups will become tabs, direct child options will appear above the tab control
-  		- Grandchild groups will default to inline unless specified otherwise
+        - Grandchild groups will default to inline unless specified otherwise

   Select- Same as Tab but with entries in a dropdown rather than tabs


   Inline Groups
-  	- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
-  	- If declared on a direct child of a root node of a select group, they will appear above the group container control
-  	- When a group is displayed inline, all descendants will also be inline members of the group
+    - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
+    - If declared on a direct child of a root node of a select group, they will appear above the group container control
+    - When a group is displayed inline, all descendants will also be inline members of the group

 ]]

@@ -168,11 +168,11 @@ local allIsLiteral = {
 local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
 	--get definition for the member
 	local inherits = isInherited[membername]
-
+

 	--get the member of the option, traversing the tree if it can be inherited
 	local member
-
+
 	if inherits then
 		local group = options
 		if group[membername] ~= nil then
@@ -187,7 +187,7 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 	else
 		member = option[membername]
 	end
-
+
 	--check if we need to call a functon, or if we have a literal value
 	if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
 		--We have a function to call
@@ -196,13 +196,13 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		local handler
 		local group = options
 		handler = group.handler or handler
-
+
 		for i = 1, #path do
 			group = GetSubOption(group, path[i])
 			info[i] = path[i]
 			handler = group.handler or handler
 		end
-
+
 		info.options = options
 		info.appName = appName
 		info[0] = appName
@@ -212,8 +212,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		info.type = option.type
 		info.uiType = "dialog"
 		info.uiName = MAJOR
-
-		local a, b, c ,d
+
+		local a, b, c ,d
 		--using 4 returns for the get of a color type, increase if a type needs more
 		if type(member) == "function" then
 			--Call the function
@@ -230,8 +230,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		return a,b,c,d
 	else
 		--The value isnt a function to call, return it
-		return member
-	end
+		return member
+	end
 end

 --[[calls an options function that could be inherited, method name or function ref
@@ -296,7 +296,7 @@ local function compareOptions(a,b)
 		return NameA:upper() < NameB:upper()
 	end
 	if OrderA < 0 then
-		if OrderB > 0 then
+		if OrderB >= 0 then
 			return false
 		end
 	else
@@ -315,7 +315,7 @@ end
 local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 	tempOrders = new()
 	tempNames = new()
-
+
 	if group.plugins then
 		for plugin, t in pairs(group.plugins) do
 			for k, v in pairs(t) do
@@ -331,7 +331,7 @@ local function BuildSortedOptionsTable(group, keySort, opts, options, path, appN
 			end
 		end
 	end
-
+
 	for k, v in pairs(group.args) do
 		if not opts[k] then
 			tinsert(keySort, k)
@@ -362,7 +362,7 @@ local function DelTree(tree)
 end

 local function CleanUserData(widget, event)
-
+
 	local user = widget:GetUserDataTable()

 	if user.path then
@@ -402,7 +402,7 @@ end
 -- - Gets a status table for the given appname and options path.
 -- @param appName The application name as given to `:RegisterOptionsTable()`
 -- @param path The path to the options (a table with all group keys)
--- @return
+-- @return
 function AceConfigDialog:GetStatusTable(appName, path)
 	local status = self.Status

@@ -436,7 +436,7 @@ end
 function AceConfigDialog:SelectGroup(appName, ...)
 	local path = new()

-
+
 	local app = reg:GetOptionsTable(appName)
 	if not app then
 		error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
@@ -448,9 +448,9 @@ function AceConfigDialog:SelectGroup(appName, ...)
 		status.groups = {}
 	end
 	status = status.groups
-	local treevalue
-	local treestatus
-
+	local treevalue
+	local treestatus
+
 	for n = 1, select("#",...) do
 		local key = select(n, ...)

@@ -477,12 +477,12 @@ function AceConfigDialog:SelectGroup(appName, ...)
 			--the selected group will be overwritten if a child is the final target but still needs to be open
 			treestatus.selected = treevalue
 			treestatus.groups[treevalue] = true
-
+
 		end
-
+
 		--move to the next group in the path
 		group = GetSubOption(group, key)
-		if not group then
+		if not group then
 			break
 		end
 		tinsert(path, key)
@@ -492,10 +492,10 @@ function AceConfigDialog:SelectGroup(appName, ...)
 		end
 		status = status.groups
 	end
-
+
 	del(path)
 	reg:NotifyChange(appName)
-end
+end

 local function OptionOnMouseOver(widget, event)
 	--show a tooltip/set the status bar to the desc text
@@ -510,14 +510,14 @@ local function OptionOnMouseOver(widget, event)
 	local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
 	local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
 	local descStyle = opt.descStyle
-
+
 	if descStyle and descStyle ~= "tooltip" then return end
-
+
 	GameTooltip:SetText(name, 1, .82, 0, true)
-
+
 	if opt.type == "multiselect" then
 		GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
-	end
+	end
 	if type(desc) == "string" then
 		GameTooltip:AddLine(desc, 1, 1, 1, true)
 	end
@@ -675,7 +675,7 @@ local function ActivateControl(widget, event, ...)
 			end
 		end
 	end
-
+
 	local success
 	if validated and option.type ~= "execute" then
 		if type(validate) == "string" then
@@ -690,7 +690,7 @@ local function ActivateControl(widget, event, ...)
 			if not success then validated = false end
 		end
 	end
-
+
 	local rootframe = user.rootframe
 	if not validated or type(validated) == "string" then
 		if not validated then
@@ -715,7 +715,7 @@ local function ActivateControl(widget, event, ...)
 		del(info)
 		return true
 	else
-
+
 		local confirmText = option.confirmText
 		--call confirm func/method
 		if type(confirm) == "string" then
@@ -756,10 +756,10 @@ local function ActivateControl(widget, event, ...)
 						confirmText = confirmText.." - "..desc
 					end
 				end
-
+
 				local iscustom = user.rootframe:GetUserData("iscustom")
 				local rootframe
-
+
 				if iscustom then
 					rootframe = user.rootframe
 				end
@@ -796,7 +796,7 @@ local function ActivateControl(widget, event, ...)
 		--full refresh of the frame, some controls dont cause this on all events
 		if option.type == "color" then
 			if event == "OnValueConfirmed" then
-
+
 				if iscustom then
 					AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
 				else
@@ -1049,6 +1049,10 @@ local function CreateControl(userControlType, fallbackControlType)
 	return control
 end

+local function sortTblAsStrings(x,y)
+	return tostring(x) < tostring(y) -- Support numbers as keys
+end
+
 --[[
 	options - root of the options table being fed
 	container - widget that controls will be placed in
@@ -1079,7 +1083,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					else
 						GroupContainer = gui:Create("SimpleGroup")
 					end
-
+
 					GroupContainer.width = "fill"
 					GroupContainer:SetLayout("flow")
 					container:AddChild(GroupContainer)
@@ -1088,14 +1092,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 			else
 				--Control to feed
 				local control
-
+
 				local name = GetOptionsMemberValue("name", v, options, path, appName)
-
+
 				if v.type == "execute" then
-
+
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
+
 					local iconControl = type(image) == "string" or type(image) == "number"
 					control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button")
 					if iconControl then
@@ -1125,7 +1129,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 				elseif v.type == "input" then
 					control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox")
-
+
 					if v.multiline and control.SetNumLines then
 						control:SetNumLines(tonumber(v.multiline) or 4)
 					end
@@ -1144,15 +1148,15 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					local value = GetOptionsMemberValue("get",v, options, path, appName)
 					control:SetValue(value)
 					control:SetCallback("OnValueChanged",ActivateControl)
-
+
 					if v.descStyle == "inline" then
 						local desc = GetOptionsMemberValue("desc", v, options, path, appName)
 						control:SetDescription(desc)
 					end
-
+
 					local image = GetOptionsMemberValue("image", v, options, path, appName)
 					local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)
-
+
 					if type(image) == "string" or type(image) == "number" then
 						if type(imageCoords) == "table" then
 							control:SetImage(image, unpack(imageCoords))
@@ -1175,6 +1179,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 				elseif v.type == "select" then
 					local values = GetOptionsMemberValue("values", v, options, path, appName)
+					local sorting = GetOptionsMemberValue("sorting", v, options, path, appName)
 					if v.style == "radio" then
 						local disabled = CheckOptionDisabled(v, options, path, appName)
 						local width = GetOptionsMemberValue("width",v,options,path,appName)
@@ -1185,12 +1190,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 						control:PauseLayout()
 						local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
-						local t = {}
-						for value, text in pairs(values) do
-							t[#t+1]=value
+						if not sorting then
+							sorting = {}
+							for value, text in pairs(values) do
+								sorting[#sorting+1]=value
+							end
+							tsort(sorting, sortTblAsStrings)
 						end
-						tsort(t)
-						for k, value in ipairs(t) do
+						for k, value in ipairs(sorting) do
 							local text = values[value]
 							local radio = gui:Create("CheckBox")
 							radio:SetLabel(text)
@@ -1224,7 +1231,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 							itemType = nil
 						end
 						control:SetLabel(name)
-						control:SetList(values, nil, itemType)
+						control:SetList(values, sorting, itemType)
 						local value = GetOptionsMemberValue("get",v, options, path, appName)
 						if not values[value] then
 							value = nil
@@ -1236,7 +1243,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				elseif v.type == "multiselect" then
 					local values = GetOptionsMemberValue("values", v, options, path, appName)
 					local disabled = CheckOptionDisabled(v, options, path, appName)
-
+
 					local valuesort = new()
 					if values then
 						for value, text in pairs(values) do
@@ -1244,7 +1251,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						end
 					end
 					tsort(valuesort)
-
+
 					local controlType = v.dialogControl or v.control
 					if controlType then
 						control = gui:Create(controlType)
@@ -1313,9 +1320,9 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						control:ResumeLayout()
 						control:DoLayout()

-
+
 					end
-
+
 					del(valuesort)

 				elseif v.type == "color" then
@@ -1340,7 +1347,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				elseif v.type == "description" then
 					control = CreateControl(v.dialogControl or v.control, "Label")
 					control:SetText(name)
-
+
 					local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
 					if fontSize == "medium" then
 						control:SetFontObject(GameFontHighlight)
@@ -1349,10 +1356,10 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					else -- small or invalid
 						control:SetFontObject(GameFontHighlightSmall)
 					end
-
+
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
+
 					if type(image) == "string" or type(image) == "number" then
 						if not width then
 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
@@ -1401,7 +1408,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					InjectInfo(control, options, v, path, rootframe, appName)
 					container:AddChild(control)
 				end
-
+
 			end
 		end
 		tremove(path)
@@ -1426,7 +1433,7 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
 	local option = user.option
 	local path = user.path
 	local appName = user.appName
-
+
 	local feedpath = new()
 	for i = 1, #path do
 		feedpath[i] = path[i]
@@ -1441,8 +1448,9 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)

 	local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
 	local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
-
+
 	GameTooltip:SetOwner(button, "ANCHOR_NONE")
+	GameTooltip:ClearAllPoints()
 	if widget.type == "TabGroup" then
 		GameTooltip:SetPoint("BOTTOM",button,"TOP")
 	else
@@ -1450,11 +1458,11 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
 	end

 	GameTooltip:SetText(name, 1, .82, 0, true)
-
+
 	if type(desc) == "string" then
 		GameTooltip:AddLine(desc, 1, 1, 1, true)
 	end
-
+
 	GameTooltip:Show()
 end

@@ -1465,25 +1473,25 @@ end

 local function GroupExists(appName, options, path, uniquevalue)
 	if not uniquevalue then return false end
-
+
 	local feedpath = new()
 	local temppath = new()
 	for i = 1, #path do
 		feedpath[i] = path[i]
 	end
-
+
 	BuildPath(feedpath, ("\001"):split(uniquevalue))
-
+
 	local group = options
 	for i = 1, #feedpath do
 		local v = feedpath[i]
 		temppath[i] = v
 		group = GetSubOption(group, v)
-
-		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
+
+		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
 			del(feedpath)
 			del(temppath)
-			return false
+			return false
 		end
 	end
 	del(feedpath)
@@ -1602,7 +1610,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			tab:SetCallback("OnGroupSelected", GroupSelected)
 			tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
 			tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
-
+
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
@@ -1622,7 +1630,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 					break
 				end
 			end
-
+
 			container:AddChild(tab)

 		elseif grouptype == "select" then
@@ -1645,7 +1653,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			if firstgroup then
 				select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
 			end
-
+
 			select.width = "fill"
 			select.height = "fill"

@@ -1657,14 +1665,14 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			local tree = gui:Create("TreeGroup")
 			InjectInfo(tree, options, group, path, rootframe, appName)
 			tree:EnableButtonTooltips(false)
-
+
 			tree.width = "fill"
 			tree.height = "fill"

 			tree:SetCallback("OnGroupSelected", GroupSelected)
 			tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
 			tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
-
+
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
@@ -1705,7 +1713,7 @@ local function RefreshOnUpdate(this)
 		end
 		this.closing[appName] = nil
 	end
-
+
 	if this.closeAll then
 		for k, v in pairs(AceConfigDialog.OpenFrames) do
 			if not this.closeAllOverride[k] then
@@ -1715,7 +1723,7 @@ local function RefreshOnUpdate(this)
 		this.closeAll = nil
 		wipe(this.closeAllOverride)
 	end
-
+
 	for appName in pairs(this.apps) do
 		if AceConfigDialog.OpenFrames[appName] then
 			local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
@@ -1800,10 +1808,10 @@ function AceConfigDialog:Open(appName, container, ...)
 	local options = app("dialog", MAJOR)

 	local f
-
+
 	local path = new()
 	local name = GetOptionsMemberValue("name", options, options, path, appName)
-
+
 	--If an optional path is specified add it to the path table before feeding the options
 	--as container is optional as well it may contain the first element of the path
 	if type(container) == "string" then
@@ -1813,7 +1821,7 @@ function AceConfigDialog:Open(appName, container, ...)
 	for n = 1, select("#",...) do
 		tinsert(path, (select(n, ...)))
 	end
-
+
 	local option = options
 	if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then
 		for i = 1, #path do
@@ -1821,7 +1829,7 @@ function AceConfigDialog:Open(appName, container, ...)
 		end
 		name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName))
 	end
-
+
 	--if a container is given feed into that
 	if container then
 		f = container
@@ -1915,19 +1923,19 @@ end
 -- @param name A descriptive name to display in the options tree (defaults to appName)
 -- @param parent The parent to use in the interface options tree.
 -- @param ... The path in the options table to feed into the interface options panel.
--- @return The reference to the frame registered into the Interface Options.
+-- @return The reference to the frame registered into the Interface Options.
 function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
 	local BlizOptions = AceConfigDialog.BlizOptions
-
+
 	local key = appName
 	for n = 1, select("#", ...) do
 		key = key.."\001"..select(n, ...)
 	end
-
+
 	if not BlizOptions[appName] then
 		BlizOptions[appName] = {}
 	end
-
+
 	if not BlizOptions[appName][key] then
 		local group = gui:Create("BlizOptionsGroup")
 		BlizOptions[appName][key] = group
diff --git a/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
index 1e40811..f8d9225 100644
--- a/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+++ b/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
@@ -4,14 +4,14 @@
 -- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
 -- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
 -- * The **appName** field is the options table name as given at registration time \\
---
+--
 -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
 -- @class file
 -- @name AceConfigRegistry-3.0
--- @release $Id: AceConfigRegistry-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $
+-- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $
 local CallbackHandler = LibStub("CallbackHandler-1.0")

-local MAJOR, MINOR = "AceConfigRegistry-3.0", 18
+local MAJOR, MINOR = "AceConfigRegistry-3.0", 20
 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigRegistry then return end
@@ -33,7 +33,7 @@ local error, assert = error, assert


 AceConfigRegistry.validated = {
-	-- list of options table names ran through :ValidateOptionsTable automatically.
+	-- list of options table names ran through :ValidateOptionsTable automatically.
 	-- CLEARED ON PURPOSE, since newer versions may have newer validators
 	cmd = {},
 	dropdown = {},
@@ -94,13 +94,20 @@ local basekeys={
 }

 local typedkeys={
-	header={},
+	header={
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
+	},
 	description={
 		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
 		fontSize=optstringfunc,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	group={
 		args=istable,
@@ -117,6 +124,9 @@ local typedkeys={
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	input={
 		pattern=optstring,
@@ -130,6 +140,9 @@ local typedkeys={
 		tristate=optbool,
 		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	tristate={
 	},
@@ -141,12 +154,16 @@ local typedkeys={
 		step=optnumber,
 		bigStep=optnumber,
 		isPercent=optbool,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	select={
 		values=ismethodtable,
+		sorting=optmethodtable,
 		style={
-			["nil"]=true,
-			["string"]={dropdown=true,radio=true},
+			["nil"]=true,
+			["string"]={dropdown=true,radio=true},
 			_="string: 'dropdown' or 'radio'"
 		},
 		control=optstring,
@@ -164,9 +181,14 @@ local typedkeys={
 	},
 	color={
 		hasAlpha=optmethodbool,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	keybinding={
-		-- TODO
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 }

@@ -203,13 +225,13 @@ local function validate(options,errlvl,...)
 	if type(options.type)~="string" then
 		err(".type: expected a string, got a "..type(options.type), errlvl,...)
 	end
-
+
 	-- get type and 'typedkeys' member
 	local tk = typedkeys[options.type]
 	if not tk then
 		err(".type: unknown type '"..options.type.."'", errlvl,...)
 	end
-
+
 	-- make sure that all options[] are known parameters
 	for k,v in pairs(options) do
 		if not (tk[k] or basekeys[k]) then
@@ -302,7 +324,7 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation
 				AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl)	-- upgradable
 				AceConfigRegistry.validated[uiType][appName] = true
 			end
-			return options
+			return options
 		end
 	elseif type(options)=="function" then
 		AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
@@ -340,7 +362,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
 	if not f then
 		return nil
 	end
-
+
 	if uiType then
 		return f(uiType,uiName,1)	-- get the table for us
 	else
diff --git a/Libs/AceConsole-3.0/AceConsole-3.0.lua b/Libs/AceConsole-3.0/AceConsole-3.0.lua
index 0567a65..678fa95 100644
--- a/Libs/AceConsole-3.0/AceConsole-3.0.lua
+++ b/Libs/AceConsole-3.0/AceConsole-3.0.lua
@@ -2,14 +2,14 @@
 -- You can register slash commands to your custom functions and use the `GetArgs` function to parse them
 -- to your addons individual needs.
 --
--- **AceConsole-3.0** can be embeded into your addon, either explicitly by calling AceConsole:Embed(MyAddon) or by
+-- **AceConsole-3.0** can be embeded into your addon, either explicitly by calling AceConsole:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceConsole itself.\\
 -- It is recommended to embed AceConsole, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceConsole.
 -- @class file
 -- @name AceConsole-3.0
--- @release $Id: AceConsole-3.0.lua 1143 2016-07-11 08:52:03Z nevcairiel $
+-- @release $Id: AceConsole-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local MAJOR,MINOR = "AceConsole-3.0", 7

 local AceConsole, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -84,11 +84,11 @@ end
 -- @param persist if false, the command will be soft disabled/enabled when aceconsole is used as a mixin (default: true)
 function AceConsole:RegisterChatCommand( command, func, persist )
 	if type(command)~="string" then error([[Usage: AceConsole:RegisterChatCommand( "command", func[, persist ]): 'command' - expected a string]], 2) end
-
+
 	if persist==nil then persist=true end	-- I'd rather have my addon's "/addon enable" around if the author screws up. Having some extra slash regged when it shouldnt be isn't as destructive. True is a better default. /Mikk
-
+
 	local name = "ACECONSOLE_"..command:upper()
-
+
 	if type( func ) == "string" then
 		SlashCmdList[name] = function(input, editBox)
 			self[func](self, input, editBox)
@@ -132,9 +132,9 @@ local function nils(n, ...)
 		return ...
 	end
 end
-

---- Retreive one or more space-separated arguments from a string.
+
+--- Retreive one or more space-separated arguments from a string.
 -- Treats quoted strings and itemlinks as non-spaced.
 -- @param str The raw argument string
 -- @param numargs How many arguments to get (default 1)
@@ -144,7 +144,7 @@ end
 function AceConsole:GetArgs(str, numargs, startpos)
 	numargs = numargs or 1
 	startpos = max(startpos or 1, 1)
-
+
 	local pos=startpos

 	-- find start of new arg
@@ -169,24 +169,24 @@ function AceConsole:GetArgs(str, numargs, startpos)
 	else
 		delim_or_pipe="([| ])"
 	end
-
+
 	startpos = pos
-
+
 	while true do
 		-- find delimiter or hyperlink
 		local ch,_
 		pos,_,ch = strfind(str, delim_or_pipe, pos)
-
+
 		if not pos then break end
-
+
 		if ch=="|" then
 			-- some kind of escape
-
+
 			if strsub(str,pos,pos+1)=="|H" then
 				-- It's a |H....|hhyper link!|h
 				pos=strfind(str, "|h", pos+2)	-- first |h
 				if not pos then break end
-
+
 				pos=strfind(str, "|h", pos+2)	-- second |h
 				if not pos then break end
 			elseif strsub(str,pos, pos+1) == "|T" then
@@ -194,16 +194,16 @@ function AceConsole:GetArgs(str, numargs, startpos)
 				pos=strfind(str, "|t", pos+2)
 				if not pos then break end
 			end
-
+
 			pos=pos+2 -- skip past this escape (last |h if it was a hyperlink)
-
+
 		else
 			-- found delimiter, done with this arg
 			return strsub(str, startpos, pos-1), AceConsole:GetArgs(str, numargs-1, pos+1)
 		end
-
+
 	end
-
+
 	-- search aborted, we hit end of string. return it all as one argument. (yes, even if it's an unterminated quote or hyperlink)
 	return strsub(str, startpos), nils(numargs-1, 1e9)
 end
@@ -214,10 +214,10 @@ end
 local mixins = {
 	"Print",
 	"Printf",
-	"RegisterChatCommand",
+	"RegisterChatCommand",
 	"UnregisterChatCommand",
 	"GetArgs",
-}
+}

 -- Embeds AceConsole into the target object making the functions from the mixins list available on target:..
 -- @param target target object to embed AceBucket in
diff --git a/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua b/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
index 7477698..6ed3103 100644
--- a/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
+++ b/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
@@ -1,7 +1,7 @@
 --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
 -- @class file
 -- @name AceDBOptions-3.0
--- @release $Id: AceDBOptions-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $
+-- @release $Id: AceDBOptions-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15
 local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)

@@ -240,22 +240,22 @@ local tmpprofiles = {}
 -- @return Hashtable of all profiles with the internal name as keys and the display name as value.
 local function getProfileList(db, common, nocurrent)
 	local profiles = {}
-
+
 	-- copy existing profiles into the table
 	local currentProfile = db:GetCurrentProfile()
-	for i,v in pairs(db:GetProfiles(tmpprofiles)) do
-		if not (nocurrent and v == currentProfile) then
-			profiles[v] = v
-		end
+	for i,v in pairs(db:GetProfiles(tmpprofiles)) do
+		if not (nocurrent and v == currentProfile) then
+			profiles[v] = v
+		end
 	end
-
+
 	-- add our default profiles to choose from ( or rename existing profiles)
 	for k,v in pairs(defaultProfiles) do
 		if (common or profiles[k]) and not (nocurrent and k == currentProfile) then
 			profiles[k] = v
 		end
 	end
-
+
 	return profiles
 end

@@ -280,11 +280,11 @@ function OptionsHandlerPrototype:GetCurrentProfile()
 	return self.db:GetCurrentProfile()
 end

---[[
+--[[
 	List all active profiles
 	you can control the output with the .arg variable
 	currently four modes are supported
-
+
 	(empty) - return all available profiles
 	"nocurrent" - returns all available profiles except the currently active profile
 	"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default")
@@ -302,7 +302,7 @@ function OptionsHandlerPrototype:ListProfiles(info)
 	else
 		profiles = getProfileList(self.db)
 	end
-
+
 	return profiles
 end

@@ -336,19 +336,19 @@ local function getOptionsHandler(db, noDefaultProfiles)
 	if not defaultProfiles then
 		generateDefaultProfiles(db)
 	end
-
+
 	local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles }
-
+
 	for k,v in pairs(OptionsHandlerPrototype) do
 		handler[k] = v
 	end
-
+
 	AceDBOptions.handlers[db] = handler
 	return handler
 end

 --[[
-	the real options table
+	the real options table
 ]]
 local optionsTable = {
 	desc = {
@@ -436,7 +436,7 @@ local optionsTable = {
 --- Get/Create a option table that you can use in your addon to control the profiles of AceDB-3.0.
 -- @param db The database object to create the options table for.
 -- @return The options table to be used in AceConfig-3.0
--- @usage
+-- @usage
 -- -- Assuming `options` is your top-level options table and `self.db` is your database:
 -- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
 function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
@@ -445,7 +445,7 @@ function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
 			name = L["profiles"],
 			desc = L["profiles_sub"],
 		}
-
+
 	tbl.handler = getOptionsHandler(db, noDefaultProfiles)
 	tbl.args = optionsTable

diff --git a/Libs/AceEvent-3.0/AceEvent-3.0.lua b/Libs/AceEvent-3.0/AceEvent-3.0.lua
index bbf55c2..7ccd880 100644
--- a/Libs/AceEvent-3.0/AceEvent-3.0.lua
+++ b/Libs/AceEvent-3.0/AceEvent-3.0.lua
@@ -2,14 +2,14 @@
 -- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around
 -- CallbackHandler, and dispatches all game events or addon message to the registrees.
 --
--- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
+-- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceEvent itself.\\
 -- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceEvent.
 -- @class file
 -- @name AceEvent-3.0
--- @release $Id: AceEvent-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceEvent-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local CallbackHandler = LibStub("CallbackHandler-1.0")

 local MAJOR, MINOR = "AceEvent-3.0", 4
@@ -25,22 +25,22 @@ AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib

 -- APIs and registry for blizzard events, using CallbackHandler lib
 if not AceEvent.events then
-	AceEvent.events = CallbackHandler:New(AceEvent,
+	AceEvent.events = CallbackHandler:New(AceEvent,
 		"RegisterEvent", "UnregisterEvent", "UnregisterAllEvents")
 end

-function AceEvent.events:OnUsed(target, eventname)
+function AceEvent.events:OnUsed(target, eventname)
 	AceEvent.frame:RegisterEvent(eventname)
 end

-function AceEvent.events:OnUnused(target, eventname)
+function AceEvent.events:OnUnused(target, eventname)
 	AceEvent.frame:UnregisterEvent(eventname)
 end


 -- APIs and registry for IPC messages, using CallbackHandler lib
 if not AceEvent.messages then
-	AceEvent.messages = CallbackHandler:New(AceEvent,
+	AceEvent.messages = CallbackHandler:New(AceEvent,
 		"RegisterMessage", "UnregisterMessage", "UnregisterAllMessages"
 	)
 	AceEvent.SendMessage = AceEvent.messages.Fire
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
index 3644493..8592b88 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
@@ -1,19 +1,16 @@
-## Interface: 60200
-## X-Curse-Packaged-Version: r53
-## X-Curse-Project-Name: AceGUI-3.0-SharedMediaWidgets
-## X-Curse-Project-ID: ace-gui-3-0-shared-media-widgets
-## X-Curse-Repository-ID: wow/ace-gui-3-0-shared-media-widgets/mainline
+## Interface: 80200

 ## Title: Lib: AceGUI-3.0-SharedMediaWidgets
 ## Notes: Enables AceGUI-3.0 widgets for the 5 basic SharedMedia-3.0 types
 ## Author: Yssaril
-## OptionalDeps: Ace3, LibSharedMedia-3.0, Libstub, CallbackHandler-1.0
+## OptionalDeps: Ace3, LibSharedMedia-3.0
 ## X-Category: Library

 #@no-lib-strip@
-# Libs\Libstub\Libstub.lua
-# Libs\CallbackHandler-1.0\CallbackHandler-1.0.xml
-# Libs\AceGUI-3.0\AceGUI-3.0.xml
+Libs\Libstub\Libstub.lua
+Libs\CallbackHandler-1.0\CallbackHandler-1.0.xml
+Libs\AceGUI-3.0\AceGUI-3.0.xml
+Libs\LibSharedMedia-3.0\lib.xml
 #@end-no-lib-strip@

-widget.xml
\ No newline at end of file
+widget.xml
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
index 0b75952..3bb45ed 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Background"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
index 0cd2959..2211a4c 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Border"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
index eadf35f..723b028 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Font"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
index 1d39c28..10c8aa4 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Sound"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
index 2d0e32c..824ce07 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Statusbar"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
index 1af9928..f77cfa0 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
@@ -1,17 +1,11 @@
 -- Widget created by Yssaril
---[===[@debug@
-local DataVersion = 9001 -- dev version always overwrites everything else :)
---@end-debug@]===]
---@non-debug@
-local DataVersion = 53
---@end-non-debug@
+local DataVersion = 9003
 local AGSMW = LibStub:NewLibrary("AceGUISharedMediaWidgets-1.0", DataVersion)

 if not AGSMW then
   return	-- already loaded and no upgrade necessary
 end

-LoadAddOn("LibSharedMedia-3.0")
 local AceGUI = LibStub("AceGUI-3.0")
 local Media = LibStub("LibSharedMedia-3.0")

@@ -183,14 +177,12 @@ do
 			self:SetHeight(UIParent:GetHeight()*2/5)
 			self.slider:Show()
 			self:SetScript("OnMouseWheel", OnMouseWheel)
-			self.scrollframe:UpdateScrollChildRect()
 			self.slider:SetMinMaxValues(0, self.contentframe:GetHeight()-self.scrollframe:GetHeight())
 		else
 			self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -14, 12)
 			self:SetHeight(self.contentframe:GetHeight()+25)
 			self.slider:Hide()
 			self:SetScript("OnMouseWheel", nil)
-			self.scrollframe:UpdateScrollChildRect()
 			self.slider:SetMinMaxValues(0, 0)
 		end
 		self.contentframe:SetWidth(self.scrollframe:GetWidth())
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml
index 15cd102..43c46a1 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml
@@ -6,4 +6,4 @@
 	<Script file="StatusbarWidget.lua" />
 	<Script file="BorderWidget.lua" />
 	<Script file="BackgroundWidget.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/CHANGES.txt b/Libs/AceGUI-3.0-SharedMediaWidgets/CHANGES.txt
new file mode 100644
index 0000000..d4c7d8b
--- /dev/null
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/CHANGES.txt
@@ -0,0 +1,25 @@
+------------------------------------------------------------------------
+r60 | nevcairiel | 2019-06-14 23:53:41 +0000 (Fri, 14 Jun 2019) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0-SharedMediaWidgets.toc
+
+Update TOC
+------------------------------------------------------------------------
+r59 | nevcairiel | 2019-06-14 23:53:15 +0000 (Fri, 14 Jun 2019) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
+
+Remove unnecessary UpdateScrollChildRect() calls. The Scroll Child is recomputed when needed automatically, and this improves performance significantly
+------------------------------------------------------------------------
+r58 | nevcairiel | 2018-06-21 23:05:54 +0000 (Thu, 21 Jun 2018) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
+
+Hard code a version to avoid issues with the version being populated from the hosting repository
+------------------------------------------------------------------------
+
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/R61 updated.txt b/Libs/AceGUI-3.0-SharedMediaWidgets/R61 updated.txt
new file mode 100644
index 0000000..e69de29
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml b/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
index dd3eb2b..ecf2945 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Include file="AceGUI-3.0-SharedMediaWidgets\widget.xml" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Libs/AceGUI-3.0/AceGUI-3.0.lua b/Libs/AceGUI-3.0/AceGUI-3.0.lua
index a31a85a..66a5529 100644
--- a/Libs/AceGUI-3.0/AceGUI-3.0.lua
+++ b/Libs/AceGUI-3.0/AceGUI-3.0.lua
@@ -1,6 +1,6 @@
 --- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
 -- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
--- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
+-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
 -- stand-alone distribution.
 --
 -- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
@@ -24,7 +24,7 @@
 -- f:AddChild(btn)
 -- @class file
 -- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $
+-- @release $Id: AceGUI-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 36
 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)

@@ -51,7 +51,7 @@ AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
 AceGUI.WidgetBase = AceGUI.WidgetBase or {}
 AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
 AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
-
+
 -- local upvalues
 local WidgetRegistry = AceGUI.WidgetRegistry
 local LayoutRegistry = AceGUI.LayoutRegistry
@@ -79,7 +79,7 @@ do
 	-- Internal Storage of the objects changed, from an array table
 	-- to a hash table, and additionally we introduced versioning on
 	-- the widgets which would discard all widgets from a pre-29 version
-	-- anyway, so we just clear the storage now, and don't try to
+	-- anyway, so we just clear the storage now, and don't try to
 	-- convert the storage tables to the new format.
 	-- This should generally not cause *many* widgets to end up in trash,
 	-- since once dialogs are opened, all addons should be loaded already
@@ -89,7 +89,7 @@ do
 	if oldminor and oldminor < 29 and AceGUI.objPools then
 		AceGUI.objPools = nil
 	end
-
+
 	AceGUI.objPools = AceGUI.objPools or {}
 	local objPools = AceGUI.objPools
 	--Returns a new instance, if none are available either returns a new table or calls the given contructor
@@ -97,11 +97,11 @@ do
 		if not WidgetRegistry[type] then
 			error("Attempt to instantiate unknown widget type", 2)
 		end
-
+
 		if not objPools[type] then
 			objPools[type] = {}
 		end
-
+
 		local newObj = next(objPools[type])
 		if not newObj then
 			newObj = WidgetRegistry[type]()
@@ -151,12 +151,12 @@ function AceGUI:Create(type)
 			widget.OnAcquire = widget.Aquire
 			widget.Aquire = nil
 		end
-
+
 		if rawget(widget, "Release") then
-			widget.OnRelease = rawget(widget, "Release")
+			widget.OnRelease = rawget(widget, "Release")
 			widget.Release = nil
 		end
-
+
 		if widget.OnAcquire then
 			widget:OnAcquire()
 		else
@@ -238,18 +238,18 @@ end
 --[[
 	Widgets must provide the following functions
 		OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
-
+
 	And the following members
 		frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
 		type - the type of the object, same as the name given to :RegisterWidget()
-
+
 	Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
 	It will be cleared automatically when a widget is released
 	Placing values directly into a widget object should be avoided
-
+
 	If the Widget can act as a container for other Widgets the following
 		content - frame or derivitive that children will be anchored to
-
+
 	The Widget can supply the following Optional Members
 		:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
 		:OnWidthSet(width) - Called when the width of the widget is changed
@@ -265,21 +265,21 @@ end
 -- Widget Base Template --
 --------------------------
 do
-	local WidgetBase = AceGUI.WidgetBase
-
+	local WidgetBase = AceGUI.WidgetBase
+
 	WidgetBase.SetParent = function(self, parent)
 		local frame = self.frame
 		frame:SetParent(nil)
 		frame:SetParent(parent.content)
 		self.parent = parent
 	end
-
+
 	WidgetBase.SetCallback = function(self, name, func)
 		if type(func) == "function" then
 			self.events[name] = func
 		end
 	end
-
+
 	WidgetBase.Fire = function(self, name, ...)
 		if self.events[name] then
 			local success, ret = safecall(self.events[name], self, name, ...)
@@ -288,7 +288,7 @@ do
 			end
 		end
 	end
-
+
 	WidgetBase.SetWidth = function(self, width)
 		self.frame:SetWidth(width)
 		self.frame.width = width
@@ -296,7 +296,7 @@ do
 			self:OnWidthSet(width)
 		end
 	end
-
+
 	WidgetBase.SetRelativeWidth = function(self, width)
 		if width <= 0 or width > 1 then
 			error(":SetRelativeWidth(width): Invalid relative width.", 2)
@@ -304,7 +304,7 @@ do
 		self.relWidth = width
 		self.width = "relative"
 	end
-
+
 	WidgetBase.SetHeight = function(self, height)
 		self.frame:SetHeight(height)
 		self.frame.height = height
@@ -312,7 +312,7 @@ do
 			self:OnHeightSet(height)
 		end
 	end
-
+
 	--[[ WidgetBase.SetRelativeHeight = function(self, height)
 		if height <= 0 or height > 1 then
 			error(":SetRelativeHeight(height): Invalid relative height.", 2)
@@ -324,47 +324,47 @@ do
 	WidgetBase.IsVisible = function(self)
 		return self.frame:IsVisible()
 	end
-
+
 	WidgetBase.IsShown= function(self)
 		return self.frame:IsShown()
 	end
-
+
 	WidgetBase.Release = function(self)
 		AceGUI:Release(self)
 	end
-
+
 	WidgetBase.SetPoint = function(self, ...)
 		return self.frame:SetPoint(...)
 	end
-
+
 	WidgetBase.ClearAllPoints = function(self)
 		return self.frame:ClearAllPoints()
 	end
-
+
 	WidgetBase.GetNumPoints = function(self)
 		return self.frame:GetNumPoints()
 	end
-
+
 	WidgetBase.GetPoint = function(self, ...)
 		return self.frame:GetPoint(...)
-	end
-
+	end
+
 	WidgetBase.GetUserDataTable = function(self)
 		return self.userdata
 	end
-
+
 	WidgetBase.SetUserData = function(self, key, value)
 		self.userdata[key] = value
 	end
-
+
 	WidgetBase.GetUserData = function(self, key)
 		return self.userdata[key]
 	end
-
+
 	WidgetBase.IsFullHeight = function(self)
 		return self.height == "fill"
 	end
-
+
 	WidgetBase.SetFullHeight = function(self, isFull)
 		if isFull then
 			self.height = "fill"
@@ -372,11 +372,11 @@ do
 			self.height = nil
 		end
 	end
-
+
 	WidgetBase.IsFullWidth = function(self)
 		return self.width == "fill"
 	end
-
+
 	WidgetBase.SetFullWidth = function(self, isFull)
 		if isFull then
 			self.width = "fill"
@@ -384,29 +384,29 @@ do
 			self.width = nil
 		end
 	end
-
+
 --	local function LayoutOnUpdate(this)
 --		this:SetScript("OnUpdate",nil)
 --		this.obj:PerformLayout()
 --	end
-
+
 	local WidgetContainerBase = AceGUI.WidgetContainerBase
-
+
 	WidgetContainerBase.PauseLayout = function(self)
 		self.LayoutPaused = true
 	end
-
+
 	WidgetContainerBase.ResumeLayout = function(self)
 		self.LayoutPaused = nil
 	end
-
+
 	WidgetContainerBase.PerformLayout = function(self)
 		if self.LayoutPaused then
 			return
 		end
 		safecall(self.LayoutFunc, self.content, self.children)
 	end
-
+
 	--call this function to layout, makes sure layed out objects get a frame to get sizes etc
 	WidgetContainerBase.DoLayout = function(self)
 		self:PerformLayout()
@@ -414,7 +414,7 @@ do
 --			self.frame:SetScript("OnUpdate", LayoutOnUpdate)
 --		end
 	end
-
+
 	WidgetContainerBase.AddChild = function(self, child, beforeWidget)
 		if beforeWidget then
 			local siblingIndex = 1
@@ -422,7 +422,7 @@ do
 				if widget == beforeWidget then
 					break
 				end
-				siblingIndex = siblingIndex + 1
+				siblingIndex = siblingIndex + 1
 			end
 			tinsert(self.children, siblingIndex, child)
 		else
@@ -432,7 +432,7 @@ do
 		child.frame:Show()
 		self:DoLayout()
 	end
-
+
 	WidgetContainerBase.AddChildren = function(self, ...)
 		for i = 1, select("#", ...) do
 			local child = select(i, ...)
@@ -442,7 +442,7 @@ do
 		end
 		self:DoLayout()
 	end
-
+
 	WidgetContainerBase.ReleaseChildren = function(self)
 		local children = self.children
 		for i = 1,#children do
@@ -450,7 +450,7 @@ do
 			children[i] = nil
 		end
 	end
-
+
 	WidgetContainerBase.SetLayout = function(self, Layout)
 		self.LayoutFunc = AceGUI:GetLayout(Layout)
 	end
@@ -474,7 +474,7 @@ do
 			end
 		end
 	end
-
+
 	local function ContentResize(this)
 		if this:GetWidth() and this:GetHeight() then
 			this.width = this:GetWidth()
@@ -486,7 +486,7 @@ do
 	setmetatable(WidgetContainerBase, {__index=WidgetBase})

 	--One of these function should be called on each Widget Instance as part of its creation process
-
+
 	--- Register a widget-class as a container for newly created widgets.
 	-- @param widget The widget class
 	function AceGUI:RegisterAsContainer(widget)
@@ -502,7 +502,7 @@ do
 		widget:SetLayout("List")
 		return widget
 	end
-
+
 	--- Register a widget-class as a widget.
 	-- @param widget The widget class
 	function AceGUI:RegisterAsWidget(widget)
@@ -529,11 +529,11 @@ end
 -- @param Version The version of the widget
 function AceGUI:RegisterWidgetType(Name, Constructor, Version)
 	assert(type(Constructor) == "function")
-	assert(type(Version) == "number")
-
+	assert(type(Version) == "number")
+
 	local oldVersion = WidgetVersions[Name]
 	if oldVersion and oldVersion >= Version then return end
-
+
 	WidgetVersions[Name] = Version
 	WidgetRegistry[Name] = Constructor
 end
@@ -602,7 +602,7 @@ AceGUI:RegisterLayout("List",
 		local width = content.width or content:GetWidth() or 0
 		for i = 1, #children do
 			local child = children[i]
-
+
 			local frame = child.frame
 			frame:ClearAllPoints()
 			frame:Show()
@@ -611,22 +611,22 @@ AceGUI:RegisterLayout("List",
 			else
 				frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
 			end
-
+
 			if child.width == "fill" then
 				child:SetWidth(width)
 				frame:SetPoint("RIGHT", content)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
 			elseif child.width == "relative" then
 				child:SetWidth(width * child.relWidth)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
 			end
-
+
 			height = height + (frame.height or frame:GetHeight() or 0)
 		end
 		safecall(content.obj.LayoutFinished, content.obj, nil, height)
@@ -661,17 +661,17 @@ AceGUI:RegisterLayout("Flow",
 		--height of the current row
 		local rowheight = 0
 		local rowoffset = 0
-
+
 		local width = content.width or content:GetWidth() or 0
-
+
 		--control at the start of the row
 		local rowstart
 		local rowstartoffset
 		local isfullheight
-
+
 		local frameoffset
 		local lastframeoffset
-		local oversize
+		local oversize
 		for i = 1, #children do
 			local child = children[i]
 			oversize = nil
@@ -679,17 +679,17 @@ AceGUI:RegisterLayout("Flow",
 			local frameheight = frame.height or frame:GetHeight() or 0
 			local framewidth = frame.width or frame:GetWidth() or 0
 			lastframeoffset = frameoffset
-			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
+			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
 			-- That was moving all widgets half the widgets size down, is that intended?
 			-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
 			-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
 			-- TODO: Investigate moar!
 			frameoffset = child.alignoffset or (frameheight / 2)
-
+
 			if child.width == "relative" then
 				framewidth = width * child.relWidth
 			end
-
+
 			frame:Show()
 			frame:ClearAllPoints()
 			if i == 1 then
@@ -728,11 +728,11 @@ AceGUI:RegisterLayout("Flow",
 				else
 					--handles cases where the new height is higher than either control because of the offsets
 					--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
-
+
 					--offset is always the larger of the two offsets
 					rowoffset = math_max(rowoffset, frameoffset)
 					rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
-
+
 					frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
 					usedwidth = framewidth + usedwidth
 				end
@@ -741,11 +741,11 @@ AceGUI:RegisterLayout("Flow",
 			if child.width == "fill" then
 				safelayoutcall(child, "SetWidth", width)
 				frame:SetPoint("RIGHT", content)
-
+
 				usedwidth = 0
 				rowstart = frame
 				rowstartoffset = frameoffset
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
@@ -754,7 +754,7 @@ AceGUI:RegisterLayout("Flow",
 				rowstartoffset = rowoffset
 			elseif child.width == "relative" then
 				safelayoutcall(child, "SetWidth", width * child.relWidth)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
@@ -763,20 +763,20 @@ AceGUI:RegisterLayout("Flow",
 					frame:SetPoint("RIGHT", content)
 				end
 			end
-
+
 			if child.height == "fill" then
 				frame:SetPoint("BOTTOM", content)
 				isfullheight = true
 			end
 		end
-
+
 		--anchor the last row, if its full height needs a special case since  its height has just been changed by the anchor
 		if isfullheight then
 			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
 		elseif rowstart then
 			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
 		end
-
+
 		height = height + rowheight + 3
 		safecall(content.obj.LayoutFinished, content.obj, nil, height)
 	end)
@@ -840,7 +840,7 @@ AceGUI:RegisterLayout("Table",
 		local spaceH = tableObj.spaceH or tableObj.space or 0
 		local spaceV = tableObj.spaceV or tableObj.space or 0
 		local totalH = (content:GetWidth() or content.width or 0) - spaceH * (#cols - 1)
-
+
 		-- We need to reuse these because layout events can come in very frequently
 		local layoutCache = obj:GetUserData("layoutCache")
 		if not layoutCache then
@@ -848,7 +848,7 @@ AceGUI:RegisterLayout("Table",
 			obj:SetUserData("layoutCache", layoutCache)
 		end
 		local t, laneH, laneV, rowspans, rowStart, colStart = unpack(layoutCache)
-
+
 		-- Create the grid
 		local n, slotFound = 0
 		for i,child in ipairs(children) do
@@ -913,7 +913,7 @@ AceGUI:RegisterLayout("Table",
 							local f = child.frame
 							f:ClearAllPoints()
 							local childH = f:GetWidth() or 0
-
+
 							laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
 						end
 					end
@@ -947,7 +947,7 @@ AceGUI:RegisterLayout("Table",
 					local cellObj = child:GetUserData("cell")
 					local offsetH = GetCellDimension("H", laneH, 1, colStart[child] - 1, spaceH) + (colStart[child] == 1 and 0 or spaceH)
 					local cellH = GetCellDimension("H", laneH, colStart[child], col, spaceH)
-
+
 					local f = child.frame
 					f:ClearAllPoints()
 					local childH = f:GetWidth() or 0
@@ -957,7 +957,7 @@ AceGUI:RegisterLayout("Table",
 					if child:IsFullWidth() or alignFn == "fill" or childH > cellH then
 						f:SetPoint("RIGHT", content, "LEFT", offsetH + align + cellH, 0)
 					end
-
+
 					if child.DoLayout then
 						child:DoLayout()
 					end
@@ -976,7 +976,7 @@ AceGUI:RegisterLayout("Table",
 					local cellObj = child:GetUserData("cell")
 					local offsetV = GetCellDimension("V", laneV, 1, rowStart[child] - 1, spaceV) + (rowStart[child] == 1 and 0 or spaceV)
 					local cellV = GetCellDimension("V", laneV, rowStart[child], row, spaceV)
-
+
 					local f = child.frame
 					local childV = f:GetHeight() or 0

@@ -991,7 +991,7 @@ AceGUI:RegisterLayout("Table",

 		-- Calculate total height
 		local totalV = GetCellDimension("V", laneV, 1, #laneV, spaceV)
-
+
 		-- Cleanup
 		for _,v in pairs(layoutCache) do wipe(v) end

diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
index b0f81b7..4b09d64 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
@@ -150,7 +150,7 @@ local function Constructor()
 		widget[method] = func
 	end
 	dropdown.parentgroup = widget
-
+
 	return AceGUI:RegisterAsContainer(widget)
 end

diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
index eb8e215..d110d03 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
@@ -40,7 +40,7 @@ end
 Methods
 -------------------------------------------------------------------------------]]
 local methods = {
-	["OnAcquire"] = function(self)
+	["OnAcquire"] = function(self)
 		self:SetScroll(0)
 		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
 	end,
@@ -77,7 +77,7 @@ local methods = {
 	["MoveScroll"] = function(self, value)
 		local status = self.status or self.localstatus
 		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-
+
 		if self.scrollBarShown then
 			local diff = height - viewheight
 			local delta = 1
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
index 9129f9d..053e27d 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
@@ -161,21 +161,21 @@ local methods = {
 		self.tablist = tabs
 		self:BuildTabs()
 	end,
-
+

 	["BuildTabs"] = function(self)
 		local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
 		local tablist = self.tablist
 		local tabs = self.tabs
-
+
 		if not tablist then return end
-
+
 		local width = self.frame.width or self.frame:GetWidth() or 0
-
+
 		wipe(widths)
 		wipe(rowwidths)
 		wipe(rowends)
-
+
 		--Place Text into tabs and get thier initial width
 		for i, v in ipairs(tablist) do
 			local tab = tabs[i]
@@ -183,19 +183,19 @@ local methods = {
 				tab = self:CreateTab(i)
 				tabs[i] = tab
 			end
-
+
 			tab:Show()
 			tab:SetText(v.text)
 			tab:SetDisabled(v.disabled)
 			tab.value = v.value
-
+
 			widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
 		end
-
+
 		for i = (#tablist)+1, #tabs, 1 do
 			tabs[i]:Hide()
 		end
-
+
 		--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
 		local numtabs = #tablist
 		local numrows = 1
@@ -213,7 +213,7 @@ local methods = {
 		end
 		rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
 		rowends[numrows] = #tablist
-
+
 		--Fix for single tabs being left on the last row, move a tab from the row above if applicable
 		if numrows > 1 then
 			--if the last row has only one tab
@@ -244,22 +244,22 @@ local methods = {
 					tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
 				end
 			end
-
+
 			-- equal padding for each tab to fill the available width,
 			-- if the used space is above 75% already
-			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
+			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
 			-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
 			local padding = 0
 			if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
 				padding = (width - rowwidths[row]) / (endtab - starttab+1)
 			end
-
+
 			for i = starttab, endtab do
 				PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
 			end
 			starttab = endtab + 1
 		end
-
+
 		self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
 		self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
 	end,
@@ -285,7 +285,7 @@ local methods = {
 		content:SetHeight(contentheight)
 		content.height = contentheight
 	end,
-
+
 	["LayoutFinished"] = function(self, width, height)
 		if self.noAutoHeight then return end
 		self:SetHeight((height or 0) + (self.borderoffset + 23))
@@ -342,7 +342,7 @@ local function Constructor()
 	for method, func in pairs(methods) do
 		widget[method] = func
 	end
-
+
 	return AceGUI:RegisterAsContainer(widget)
 end

diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
index ba916d0..3558edd 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,7 +2,7 @@
 TreeGroup Container
 Container that uses a tree control to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 41
+local Type, Version = "TreeGroup", 42
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -36,7 +36,7 @@ do
 	function del(t)
 		for k in pairs(t) do
 			t[k] = nil
-		end
+		end
 		pool[t] = true
 	end
 end
@@ -66,7 +66,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 	local value = treeline.value
 	local uniquevalue = treeline.uniquevalue
 	local disabled = treeline.disabled
-
+
 	button.treeline = treeline
 	button.value = value
 	button.uniquevalue = uniquevalue
@@ -87,7 +87,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button:SetHighlightFontObject("GameFontHighlightSmall")
 		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
 	end
-
+
 	if disabled then
 		button:EnableMouse(false)
 		button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
@@ -95,20 +95,20 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button.text:SetText(text)
 		button:EnableMouse(true)
 	end
-
+
 	if icon then
 		button.icon:SetTexture(icon)
 		button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
 	else
 		button.icon:SetTexture(nil)
 	end
-
+
 	if iconCoords then
 		button.icon:SetTexCoord(unpack(iconCoords))
 	else
 		button.icon:SetTexCoord(0, 1, 0, 1)
 	end
-
+
 	if canExpand then
 		if not isExpanded then
 			toggle:SetNormalTexture(130838) -- Interface\\Buttons\\UI-PlusButton-UP
@@ -209,6 +209,7 @@ local function Button_OnEnter(frame)

 	if self.enabletooltips then
 		GameTooltip:SetOwner(frame, "ANCHOR_NONE")
+		GameTooltip:ClearAllPoints()
 		GameTooltip:SetPoint("LEFT",frame,"RIGHT")
 		GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true)

@@ -275,10 +276,10 @@ local function Dragger_OnMouseUp(frame)
 	treeframe:SetHeight(0)
 	treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
 	treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
-
+
 	local status = self.status or self.localstatus
 	status.treewidth = treeframe:GetWidth()
-
+
 	treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
 	-- recalculate the content width
 	treeframe.obj:OnWidthSet(status.fullwidth)
@@ -363,8 +364,8 @@ local methods = {
 	--sets the tree to be displayed
 	["SetTree"] = function(self, tree, filter)
 		self.filter = filter
-		if tree then
-			assert(type(tree) == "table")
+		if tree then
+			assert(type(tree) == "table")
 		end
 		self.tree = tree
 		self:RefreshTree()
@@ -372,7 +373,7 @@ local methods = {

 	["BuildLevel"] = function(self, tree, level, parent)
 		local groups = (self.status or self.localstatus).groups
-
+
 		for i, v in ipairs(tree) do
 			if v.children then
 				if not self.filter or ShouldDisplayLevel(v.children) then
@@ -409,7 +410,7 @@ local methods = {
 		local tree = self.tree

 		local treeframe = self.treeframe
-
+
 		status.scrollToSelection = status.scrollToSelection or scrollToSelection	-- needs to be cached in case the control hasn't been drawn yet (code bails out below)

 		self:BuildLevel(tree, 1)
@@ -426,7 +427,7 @@ local methods = {
 		end

 		local first, last
-
+
 		scrollToSelection = status.scrollToSelection
 		status.scrollToSelection = nil

@@ -502,9 +503,9 @@ local methods = {
 			button:Show()
 			buttonnum = buttonnum + 1
 		end
-
+
 	end,
-
+
 	["SetSelected"] = function(self, value)
 		local status = self.status or self.localstatus
 		if status.selected ~= value then
@@ -554,16 +555,16 @@ local methods = {
 		local treeframe = self.treeframe
 		local status = self.status or self.localstatus
 		status.fullwidth = width
-
+
 		local contentwidth = width - status.treewidth - 20
 		if contentwidth < 0 then
 			contentwidth = 0
 		end
 		content:SetWidth(contentwidth)
 		content.width = contentwidth
-
+
 		local maxtreewidth = math_min(400, width - 50)
-
+
 		if maxtreewidth > 100 and status.treewidth > maxtreewidth then
 			self:SetTreeWidth(maxtreewidth, status.treesizable)
 		end
@@ -589,16 +590,16 @@ local methods = {
 				treewidth = DEFAULT_TREE_WIDTH
 			else
 				resizable = false
-				treewidth = DEFAULT_TREE_WIDTH
+				treewidth = DEFAULT_TREE_WIDTH
 			end
 		end
 		self.treeframe:SetWidth(treewidth)
 		self.dragger:EnableMouse(resizable)
-
+
 		local status = self.status or self.localstatus
 		status.treewidth = treewidth
 		status.treesizable = resizable
-
+
 		-- recalculate the content width
 		if status.fullwidth then
 			self:OnWidthSet(status.fullwidth)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
index 9818e6d..2e28a3d 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
@@ -30,21 +30,21 @@ do
 	local function frameOnClose(this)
 		this.obj:Fire("OnClose")
 	end
-
+
 	local function closeOnClick(this)
 		PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
 		this.obj:Hide()
 	end
-
+
 	local function frameOnMouseDown(this)
 		AceGUI:ClearFocus()
 	end
-
+
 	local function titleOnMouseDown(this)
 		this:GetParent():StartMoving()
 		AceGUI:ClearFocus()
 	end
-
+
 	local function frameOnMouseUp(this)
 		local frame = this:GetParent()
 		frame:StopMovingOrSizing()
@@ -55,22 +55,22 @@ do
 		status.top = frame:GetTop()
 		status.left = frame:GetLeft()
 	end
-
+
 	local function sizerseOnMouseDown(this)
 		this:GetParent():StartSizing("BOTTOMRIGHT")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizersOnMouseDown(this)
 		this:GetParent():StartSizing("BOTTOM")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizereOnMouseDown(this)
 		this:GetParent():StartSizing("RIGHT")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizerOnMouseUp(this)
 		this:GetParent():StopMovingOrSizing()
 	end
@@ -78,19 +78,19 @@ do
 	local function SetTitle(self,title)
 		self.titletext:SetText(title)
 	end
-
+
 	local function SetStatusText(self,text)
 		-- self.statustext:SetText(text)
 	end
-
+
 	local function Hide(self)
 		self.frame:Hide()
 	end
-
+
 	local function Show(self)
 		self.frame:Show()
 	end
-
+
 	local function OnAcquire(self)
 		self.frame:SetParent(UIParent)
 		self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -98,21 +98,21 @@ do
 		self:EnableResize(true)
 		self:Show()
 	end
-
+
 	local function OnRelease(self)
 		self.status = nil
 		for k in pairs(self.localstatus) do
 			self.localstatus[k] = nil
 		end
 	end
-
+
 	-- called to set an external table to store status in
 	local function SetStatusTable(self, status)
 		assert(type(status) == "table")
 		self.status = status
 		self:ApplyStatus()
 	end
-
+
 	local function ApplyStatus(self)
 		local status = self.status or self.localstatus
 		local frame = self.frame
@@ -125,7 +125,7 @@ do
 			frame:SetPoint("CENTER",UIParent,"CENTER")
 		end
 	end
-
+
 	local function OnWidthSet(self, width)
 		local content = self.content
 		local contentwidth = width - 34
@@ -135,8 +135,8 @@ do
 		content:SetWidth(contentwidth)
 		content.width = contentwidth
 	end
-
-
+
+
 	local function OnHeightSet(self, height)
 		local content = self.content
 		local contentheight = height - 57
@@ -146,19 +146,19 @@ do
 		content:SetHeight(contentheight)
 		content.height = contentheight
 	end
-
+
 	local function EnableResize(self, state)
 		local func = state and "Show" or "Hide"
 		self.sizer_se[func](self.sizer_se)
 		self.sizer_s[func](self.sizer_s)
 		self.sizer_e[func](self.sizer_e)
 	end
-
+
 	local function Constructor()
 		local frame = CreateFrame("Frame",nil,UIParent)
 		local self = {}
 		self.type = "Window"
-
+
 		self.Hide = Hide
 		self.Show = Show
 		self.SetTitle =  SetTitle
@@ -170,9 +170,9 @@ do
 		self.OnWidthSet = OnWidthSet
 		self.OnHeightSet = OnHeightSet
 		self.EnableResize = EnableResize
-
+
 		self.localstatus = {}
-
+
 		self.frame = frame
 		frame.obj = self
 		frame:SetWidth(700)
@@ -183,7 +183,7 @@ do
 		frame:SetResizable(true)
 		frame:SetFrameStrata("FULLSCREEN_DIALOG")
 		frame:SetScript("OnMouseDown", frameOnMouseDown)
-
+
 		frame:SetScript("OnShow",frameOnShow)
 		frame:SetScript("OnHide",frameOnClose)
 		frame:SetMinResize(240,240)
@@ -193,81 +193,81 @@ do
 		titlebg:SetTexture(251966) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Title-Background
 		titlebg:SetPoint("TOPLEFT", 9, -6)
 		titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
-
+
 		local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
 		dialogbg:SetTexture(137056) -- Interface\\Tooltips\\UI-Tooltip-Background
 		dialogbg:SetPoint("TOPLEFT", 8, -24)
 		dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
 		dialogbg:SetVertexColor(0, 0, 0, .75)
-
+
 		local topleft = frame:CreateTexture(nil, "BORDER")
 		topleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		topleft:SetWidth(64)
 		topleft:SetHeight(64)
 		topleft:SetPoint("TOPLEFT")
 		topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
-
+
 		local topright = frame:CreateTexture(nil, "BORDER")
 		topright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		topright:SetWidth(64)
 		topright:SetHeight(64)
 		topright:SetPoint("TOPRIGHT")
 		topright:SetTexCoord(0.625, 0.75, 0, 1)
-
+
 		local top = frame:CreateTexture(nil, "BORDER")
 		top:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		top:SetHeight(64)
 		top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
 		top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
 		top:SetTexCoord(0.25, 0.369140625, 0, 1)
-
+
 		local bottomleft = frame:CreateTexture(nil, "BORDER")
 		bottomleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottomleft:SetWidth(64)
 		bottomleft:SetHeight(64)
 		bottomleft:SetPoint("BOTTOMLEFT")
 		bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
-
+
 		local bottomright = frame:CreateTexture(nil, "BORDER")
 		bottomright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottomright:SetWidth(64)
 		bottomright:SetHeight(64)
 		bottomright:SetPoint("BOTTOMRIGHT")
 		bottomright:SetTexCoord(0.875, 1, 0, 1)
-
+
 		local bottom = frame:CreateTexture(nil, "BORDER")
 		bottom:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottom:SetHeight(64)
 		bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
 		bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
 		bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
-
+
 		local left = frame:CreateTexture(nil, "BORDER")
 		left:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		left:SetWidth(64)
 		left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
 		left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
 		left:SetTexCoord(0.001953125, 0.125, 0, 1)
-
+
 		local right = frame:CreateTexture(nil, "BORDER")
 		right:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		right:SetWidth(64)
 		right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
 		right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
 		right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
-
+
 		local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
 		close:SetPoint("TOPRIGHT", 2, 1)
 		close:SetScript("OnClick", closeOnClick)
 		self.closebutton = close
 		close.obj = self
-
+
 		local titletext = frame:CreateFontString(nil, "ARTWORK")
 		titletext:SetFontObject(GameFontNormal)
 		titletext:SetPoint("TOPLEFT", 12, -8)
 		titletext:SetPoint("TOPRIGHT", -32, -8)
 		self.titletext = titletext
-
+
 		local title = CreateFrame("Button", nil, frame)
 		title:SetPoint("TOPLEFT", titlebg)
 		title:SetPoint("BOTTOMRIGHT", titlebg)
@@ -275,7 +275,7 @@ do
 		title:SetScript("OnMouseDown",titleOnMouseDown)
 		title:SetScript("OnMouseUp", frameOnMouseUp)
 		self.title = title
-
+
 		local sizer_se = CreateFrame("Frame",nil,frame)
 		sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
 		sizer_se:SetWidth(25)
@@ -311,7 +311,7 @@ do
 		sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
 		sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
 		self.sizer_s = sizer_s
-
+
 		local sizer_e = CreateFrame("Frame",nil,frame)
 		sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
 		sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -320,17 +320,17 @@ do
 		sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
 		sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
 		self.sizer_e = sizer_e
-
+
 		--Container Support
 		local content = CreateFrame("Frame",nil,frame)
 		self.content = content
 		content.obj = self
 		content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
 		content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
-
+
 		AceGUI:RegisterAsContainer(self)
-		return self
+		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(Type,Constructor,Version)
 end
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
index 0a23be4..0e286ca 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
@@ -51,7 +51,7 @@ local methods = {
 			self:SetWidth(self.text:GetStringWidth() + 30)
 		end
 	end,
-
+
 	["SetAutoWidth"] = function(self, autoWidth)
 		self.autoWidth = autoWidth
 		if self.autoWidth then
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
index be9ae81..53ef618 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
@@ -221,11 +221,11 @@ local methods = {
 			self:SetHeight(24)
 		end
 	end,
-
+
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			local n = select("#", ...)
 			if n == 4 or n == 8 then
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
index 4e911db..1101162 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 ColorPicker Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "ColorPicker", 24
+local Type, Version = "ColorPicker", 25
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -13,7 +13,7 @@ local CreateFrame, UIParent = CreateFrame, UIParent

 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
 -- List them here for Mikk's FindGlobals script
--- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
+-- GLOBALS: ColorPickerFrame, OpacitySliderFrame

 --[[-----------------------------------------------------------------------------
 Support functions
@@ -47,7 +47,7 @@ local function Control_OnLeave(frame)
 end

 local function ColorSwatch_OnClick(frame)
-	HideUIPanel(ColorPickerFrame)
+	ColorPickerFrame:Hide()
 	local self = frame.obj
 	if not self.disabled then
 		ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -77,7 +77,7 @@ local function ColorSwatch_OnClick(frame)
 			ColorCallback(self, r, g, b, a, true)
 		end

-		ShowUIPanel(ColorPickerFrame)
+		ColorPickerFrame:Show()
 	end
 	AceGUI:ClearFocus()
 end
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
index 549ce3e..7ae1401 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 1192 2018-07-30 18:03:51Z funkydude $ ]]--
+--[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--

 local AceGUI = LibStub("AceGUI-3.0")

@@ -33,7 +33,7 @@ end

 -- ItemBase is the base "class" for all dropdown items.
 -- Each item has to use ItemBase.Create(widgetType) to
--- create an initial 'self' value.
+-- create an initial 'self' value.
 -- ItemBase will add common functions and ui event handlers.
 -- Be sure to keep basic usage when you override functions.

@@ -52,7 +52,7 @@ function ItemBase.Frame_OnEnter(this)
 		self.highlight:Show()
 	end
 	self:Fire("OnEnter")
-
+
 	if self.specialOnEnter then
 		self.specialOnEnter(self)
 	end
@@ -60,10 +60,10 @@ end

 function ItemBase.Frame_OnLeave(this)
 	local self = this.obj
-
+
 	self.highlight:Hide()
 	self:Fire("OnLeave")
-
+
 	if self.specialOnLeave then
 		self.specialOnLeave(self)
 	end
@@ -89,7 +89,7 @@ end
 --       Do not call this method directly
 function ItemBase.SetPullout(self, pullout)
 	self.pullout = pullout
-
+
 	self.frame:SetParent(nil)
 	self.frame:SetParent(pullout.itemFrame)
 	self.parent = pullout.itemFrame
@@ -155,12 +155,12 @@ function ItemBase.Create(type)
 	self.frame = frame
 	frame.obj = self
 	self.type = type
-
+
 	self.useHighlight = true
-
+
 	frame:SetHeight(17)
 	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 	local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
 	text:SetTextColor(1,1,1)
 	text:SetJustifyH("LEFT")
@@ -178,7 +178,7 @@ function ItemBase.Create(type)
 	highlight:Hide()
 	self.highlight = highlight

-	local check = frame:CreateTexture("OVERLAY")
+	local check = frame:CreateTexture("OVERLAY")
 	check:SetWidth(16)
 	check:SetHeight(16)
 	check:SetPoint("LEFT",frame,"LEFT",3,-1)
@@ -192,26 +192,26 @@ function ItemBase.Create(type)
 	sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
 	sub:SetTexture(130940) -- Interface\\ChatFrame\\ChatFrameExpandArrow
 	sub:Hide()
-	self.sub = sub
-
+	self.sub = sub
+
 	frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
 	frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
-
+
 	self.OnAcquire = ItemBase.OnAcquire
 	self.OnRelease = ItemBase.OnRelease
-
+
 	self.SetPullout = ItemBase.SetPullout
 	self.GetText    = ItemBase.GetText
 	self.SetText    = ItemBase.SetText
 	self.SetDisabled = ItemBase.SetDisabled
-
+
 	self.SetPoint   = ItemBase.SetPoint
 	self.Show       = ItemBase.Show
 	self.Hide       = ItemBase.Hide
-
+
 	self.SetOnLeave = ItemBase.SetOnLeave
 	self.SetOnEnter = ItemBase.SetOnEnter
-
+
 	return self
 end

@@ -223,20 +223,20 @@ end

 --[[
 	Template for items:
-
+
 -- Item:
 --
 do
 	local widgetType = "Dropdown-Item-"
 	local widgetVersion = 1
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end
 --]]
@@ -247,25 +247,25 @@ end
 do
 	local widgetType = "Dropdown-Item-Header"
 	local widgetVersion = 1
-
+
 	local function OnEnter(this)
 		local self = this.obj
 		self:Fire("OnEnter")
-
+
 		if self.specialOnEnter then
 			self.specialOnEnter(self)
 		end
 	end
-
+
 	local function OnLeave(this)
 		local self = this.obj
 		self:Fire("OnLeave")
-
+
 		if self.specialOnLeave then
 			self.specialOnLeave(self)
 		end
 	end
-
+
 	-- exported, override
 	local function SetDisabled(self, disabled)
 		ItemBase.SetDisabled(self, disabled)
@@ -273,21 +273,21 @@ do
 			self.text:SetTextColor(1, 1, 0)
 		end
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.SetDisabled = SetDisabled
-
+
 		self.frame:SetScript("OnEnter", OnEnter)
 		self.frame:SetScript("OnLeave", OnLeave)
-
+
 		self.text:SetTextColor(1, 1, 0)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -296,7 +296,7 @@ end
 do
 	local widgetType = "Dropdown-Item-Execute"
 	local widgetVersion = 1
-
+
 	local function Frame_OnClick(this, button)
 		local self = this.obj
 		if self.disabled then return end
@@ -305,16 +305,16 @@ do
 			self.pullout:Close()
 		end
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.frame:SetScript("OnClick", Frame_OnClick)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -324,7 +324,7 @@ end
 do
 	local widgetType = "Dropdown-Item-Toggle"
 	local widgetVersion = 4
-
+
 	local function UpdateToggle(self)
 		if self.value then
 			self.check:Show()
@@ -332,12 +332,12 @@ do
 			self.check:Hide()
 		end
 	end
-
+
 	local function OnRelease(self)
 		ItemBase.OnRelease(self)
 		self:SetValue(nil)
 	end
-
+
 	local function Frame_OnClick(this, button)
 		local self = this.obj
 		if self.disabled then return end
@@ -350,31 +350,31 @@ do
 		UpdateToggle(self)
 		self:Fire("OnValueChanged", self.value)
 	end
-
+
 	-- exported
 	local function SetValue(self, value)
 		self.value = value
 		UpdateToggle(self)
 	end
-
+
 	-- exported
 	local function GetValue(self)
 		return self.value
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.frame:SetScript("OnClick", Frame_OnClick)
-
+
 		self.SetValue = SetValue
 		self.GetValue = GetValue
 		self.OnRelease = OnRelease
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -384,55 +384,55 @@ end
 do
 	local widgetType = "Dropdown-Item-Menu"
 	local widgetVersion = 2
-
+
 	local function OnEnter(this)
 		local self = this.obj
 		self:Fire("OnEnter")
-
+
 		if self.specialOnEnter then
 			self.specialOnEnter(self)
 		end
-
+
 		self.highlight:Show()
-
+
 		if not self.disabled and self.submenu then
 			self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
 		end
 	end
-
+
 	local function OnHide(this)
 		local self = this.obj
 		if self.submenu then
 			self.submenu:Close()
 		end
 	end
-
+
 	-- exported
 	local function SetMenu(self, menu)
 		assert(menu.type == "Dropdown-Pullout")
 		self.submenu = menu
 	end
-
+
 	-- exported
 	local function CloseMenu(self)
 		self.submenu:Close()
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.sub:Show()
-
+
 		self.frame:SetScript("OnEnter", OnEnter)
 		self.frame:SetScript("OnHide", OnHide)
-
+
 		self.SetMenu   = SetMenu
 		self.CloseMenu = CloseMenu
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -441,31 +441,31 @@ end
 do
 	local widgetType = "Dropdown-Item-Separator"
 	local widgetVersion = 2
-
+
 	-- exported, override
 	local function SetDisabled(self, disabled)
 		ItemBase.SetDisabled(self, disabled)
 		self.useHighlight = false
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.SetDisabled = SetDisabled
-
+
 		local line = self.frame:CreateTexture(nil, "OVERLAY")
 		line:SetHeight(1)
 		line:SetColorTexture(.5, .5, .5)
 		line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
 		line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
-
+
 		self.text:Hide()
-
+
 		self.useHighlight = false
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
index cf0b0aa..0d6308f 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
@@ -1,9 +1,9 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1167 2017-08-29 22:08:48Z funkydude $ ]]--
+--[[ $Id: AceGUIWidget-DropDown.lua 1209 2019-06-24 21:01:01Z nevcairiel $ ]]--
 local AceGUI = LibStub("AceGUI-3.0")

 -- Lua APIs
 local min, max, floor = math.min, math.max, math.floor
-local select, pairs, ipairs, type = select, pairs, ipairs, type
+local select, pairs, ipairs, type, tostring = select, pairs, ipairs, type, tostring
 local tsort = table.sort

 -- WoW APIs
@@ -40,9 +40,9 @@ end
 do
 	local widgetType = "Dropdown-Pullout"
 	local widgetVersion = 3
-
+
 	--[[ Static data ]]--
-
+
 	local backdrop = {
 		bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
 		edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
@@ -60,9 +60,9 @@ do

 	local defaultWidth = 200
 	local defaultMaxHeight = 600
-
+
 	--[[ UI Event Handlers ]]--
-
+
 	-- HACK: This should be no part of the pullout, but there
 	--       is no other 'clean' way to response to any item-OnEnter
 	--       Used to close Submenus when an other item is entered
@@ -74,22 +74,22 @@ do
 			end
 		end
 	end
-
+
 	-- See the note in Constructor() for each scroll related function
 	local function OnMouseWheel(this, value)
 		this.obj:MoveScroll(value)
 	end
-
+
 	local function OnScrollValueChanged(this, value)
 		this.obj:SetScroll(value)
 	end
-
+
 	local function OnSizeChanged(this)
 		this.obj:FixScroll()
 	end
-
+
 	--[[ Exported methods ]]--
-
+
 	-- exported
 	local function SetScroll(self, value)
 		local status = self.scrollStatus
@@ -106,9 +106,9 @@ do
 		child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
 		child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
 		status.offset = offset
-		status.scrollvalue = value
+		status.scrollvalue = value
 	end
-
+
 	-- exported
 	local function MoveScroll(self, value)
 		local status = self.scrollStatus
@@ -127,7 +127,7 @@ do
 			self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
 		end
 	end
-
+
 	-- exported
 	local function FixScroll(self)
 		local status = self.scrollStatus
@@ -140,7 +140,7 @@ do
 			child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
 			self.slider:SetValue(0)
 		else
-			self.slider:Show()
+			self.slider:Show()
 			local value = (offset / (viewheight - height) * 1000)
 			if value > 1000 then value = 1000 end
 			self.slider:SetValue(value)
@@ -153,44 +153,44 @@ do
 			end
 		end
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnAcquire(self)
 		self.frame:SetParent(UIParent)
 		--self.itemFrame:SetToplevel(true)
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnRelease(self)
 		self:Clear()
 		self.frame:ClearAllPoints()
 		self.frame:Hide()
 	end
-
+
 	-- exported
 	local function AddItem(self, item)
 		self.items[#self.items + 1] = item
-
+
 		local h = #self.items * 16
 		self.itemFrame:SetHeight(h)
 		self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
-
+
 		item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
 		item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
-
+
 		item:SetPullout(self)
 		item:SetOnEnter(OnEnter)
 	end
-
+
 	-- exported
-	local function Open(self, point, relFrame, relPoint, x, y)
+	local function Open(self, point, relFrame, relPoint, x, y)
 		local items = self.items
 		local frame = self.frame
 		local itemFrame = self.itemFrame
-
+
 		frame:SetPoint(point, relFrame, relPoint, x, y)

-
+
 		local height = 8
 		for i, item in pairs(items) do
 			if i == 1 then
@@ -198,23 +198,23 @@ do
 			else
 				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
 			end
-
+
 			item:Show()
-
+
 			height = height + 16
 		end
 		itemFrame:SetHeight(height)
 		fixstrata("TOOLTIP", frame, frame:GetChildren())
 		frame:Show()
 		self:Fire("OnOpen")
-	end
-
+	end
+
 	-- exported
 	local function Close(self)
 		self.frame:Hide()
 		self:Fire("OnClose")
-	end
-
+	end
+
 	-- exported
 	local function Clear(self)
 		local items = self.items
@@ -222,18 +222,18 @@ do
 			AceGUI:Release(item)
 			items[i] = nil
 		end
-	end
-
+	end
+
 	-- exported
 	local function IterateItems(self)
 		return ipairs(self.items)
 	end
-
+
 	-- exported
 	local function SetHideOnLeave(self, val)
 		self.hideOnLeave = val
 	end
-
+
 	-- exported
 	local function SetMaxHeight(self, height)
 		self.maxHeight = height or defaultMaxHeight
@@ -243,19 +243,19 @@ do
 			self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
 		end
 	end
-
+
 	-- exported
 	local function GetRightBorderWidth(self)
 		return 6 + (self.slider:IsShown() and 12 or 0)
 	end
-
+
 	-- exported
 	local function GetLeftBorderWidth(self)
 		return 6
 	end
-
+
 	--[[ Constructor ]]--
-
+
 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
 		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
@@ -264,7 +264,7 @@ do
 		self.type = widgetType
 		self.frame = frame
 		frame.obj = self
-
+
 		self.OnAcquire = OnAcquire
 		self.OnRelease = OnRelease

@@ -278,37 +278,37 @@ do
 		self.SetScroll  = SetScroll
 		self.MoveScroll = MoveScroll
 		self.FixScroll  = FixScroll
-
+
 		self.SetMaxHeight = SetMaxHeight
 		self.GetRightBorderWidth = GetRightBorderWidth
 		self.GetLeftBorderWidth = GetLeftBorderWidth
-
+
 		self.items = {}
-
+
 		self.scrollStatus = {
 			scrollvalue = 0,
 		}
-
+
 		self.maxHeight = defaultMaxHeight
-
+
 		frame:SetBackdrop(backdrop)
 		frame:SetBackdropColor(0, 0, 0)
 		frame:SetFrameStrata("FULLSCREEN_DIALOG")
 		frame:SetClampedToScreen(true)
 		frame:SetWidth(defaultWidth)
-		frame:SetHeight(self.maxHeight)
+		frame:SetHeight(self.maxHeight)
 		--frame:SetToplevel(true)
-
+
 		-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
 		local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
 		local itemFrame = CreateFrame("Frame", nil, scrollFrame)
-
+
 		self.scrollFrame = scrollFrame
 		self.itemFrame = itemFrame
-
+
 		scrollFrame.obj = self
 		itemFrame.obj = self
-
+
 		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
 		slider:SetOrientation("VERTICAL")
 		slider:SetHitRectInsets(0, 0, -10, 0)
@@ -318,7 +318,7 @@ do
 		slider:SetFrameStrata("FULLSCREEN_DIALOG")
 		self.slider = slider
 		slider.obj = self
-
+
 		scrollFrame:SetScrollChild(itemFrame)
 		scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
 		scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
@@ -327,46 +327,46 @@ do
 		scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
 		scrollFrame:SetToplevel(true)
 		scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 		itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
 		itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
 		itemFrame:SetHeight(400)
 		itemFrame:SetToplevel(true)
 		itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 		slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
 		slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
 		slider:SetScript("OnValueChanged", OnScrollValueChanged)
 		slider:SetMinMaxValues(0, 1000)
 		slider:SetValueStep(1)
 		slider:SetValue(0)
-
+
 		scrollFrame:Show()
 		itemFrame:Show()
 		slider:Hide()
-
+
 		self:FixScroll()
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
 end

 do
 	local widgetType = "Dropdown"
-	local widgetVersion = 31
-
+	local widgetVersion = 34
+
 	--[[ Static data ]]--
-
+
 	--[[ UI event handler ]]--
-
+
 	local function Control_OnEnter(this)
 		this.obj.button:LockHighlight()
 		this.obj:Fire("OnEnter")
 	end
-
+
 	local function Control_OnLeave(this)
 		this.obj.button:UnlockHighlight()
 		this.obj:Fire("OnLeave")
@@ -378,7 +378,7 @@ do
 			self.pullout:Close()
 		end
 	end
-
+
 	local function Dropdown_TogglePullout(this)
 		local self = this.obj
 		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
@@ -393,17 +393,17 @@ do
 			AceGUI:SetFocus(self)
 		end
 	end
-
+
 	local function OnPulloutOpen(this)
 		local self = this.userdata.obj
 		local value = self.value
-
+
 		if not self.multiselect then
 			for i, item in this:IterateItems() do
 				item:SetValue(item.userdata.value == value)
 			end
 		end
-
+
 		self.open = true
 		self:Fire("OnOpened")
 	end
@@ -413,7 +413,7 @@ do
 		self.open = nil
 		self:Fire("OnClosed")
 	end
-
+
 	local function ShowMultiText(self)
 		local text
 		for i, widget in self.pullout:IterateItems() do
@@ -429,10 +429,10 @@ do
 		end
 		self:SetText(text)
 	end
-
+
 	local function OnItemValueChanged(this, event, checked)
 		local self = this.userdata.obj
-
+
 		if self.multiselect then
 			self:Fire("OnValueChanged", this.userdata.value, checked)
 			ShowMultiText(self)
@@ -443,14 +443,14 @@ do
 			else
 				this:SetValue(true)
 			end
-			if self.open then
+			if self.open then
 				self.pullout:Close()
 			end
 		end
 	end
-
+
 	--[[ Exported methods ]]--
-
+
 	-- exported, AceGUI callback
 	local function OnAcquire(self)
 		local pullout = AceGUI:Create("Dropdown-Pullout")
@@ -460,13 +460,13 @@ do
 		pullout:SetCallback("OnOpen", OnPulloutOpen)
 		self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
 		fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
-
+
 		self:SetHeight(44)
 		self:SetWidth(200)
 		self:SetLabel()
 		self:SetPulloutWidth(nil)
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnRelease(self)
 		if self.open then
@@ -474,20 +474,20 @@ do
 		end
 		AceGUI:Release(self.pullout)
 		self.pullout = nil
-
+
 		self:SetText("")
 		self:SetDisabled(false)
 		self:SetMultiselect(false)
-
+
 		self.value = nil
 		self.list = nil
 		self.open = nil
 		self.hasClose = nil
-
+
 		self.frame:ClearAllPoints()
 		self.frame:Hide()
 	end
-
+
 	-- exported
 	local function SetDisabled(self, disabled)
 		self.disabled = disabled
@@ -503,19 +503,19 @@ do
 			self.text:SetTextColor(1,1,1)
 		end
 	end
-
+
 	-- exported
 	local function ClearFocus(self)
 		if self.open then
 			self.pullout:Close()
 		end
 	end
-
+
 	-- exported
 	local function SetText(self, text)
 		self.text:SetText(text or "")
 	end
-
+
 	-- exported
 	local function SetLabel(self, text)
 		if text and text ~= "" then
@@ -532,7 +532,7 @@ do
 			self.alignoffset = 12
 		end
 	end
-
+
 	-- exported
 	local function SetValue(self, value)
 		if self.list then
@@ -540,12 +540,12 @@ do
 		end
 		self.value = value
 	end
-
+
 	-- exported
 	local function GetValue(self)
 		return self.value
 	end
-
+
 	-- exported
 	local function SetItemValue(self, item, value)
 		if not self.multiselect then return end
@@ -558,7 +558,7 @@ do
 		end
 		ShowMultiText(self)
 	end
-
+
 	-- exported
 	local function SetItemDisabled(self, item, disabled)
 		for i, widget in self.pullout:IterateItems() do
@@ -567,7 +567,7 @@ do
 			end
 		end
 	end
-
+
 	local function AddListItem(self, value, text, itemType)
 		if not itemType then itemType = "Dropdown-Item-Toggle" end
 		local exists = AceGUI:GetWidgetVersion(itemType)
@@ -580,7 +580,7 @@ do
 		item:SetCallback("OnValueChanged", OnItemValueChanged)
 		self.pullout:AddItem(item)
 	end
-
+
 	local function AddCloseButton(self)
 		if not self.hasClose then
 			local close = AceGUI:Create("Dropdown-Item-Execute")
@@ -589,21 +589,29 @@ do
 			self.hasClose = true
 		end
 	end
-
+
 	-- exported
 	local sortlist = {}
+	local function sortTbl(x,y)
+		local num1, num2 = tonumber(x), tonumber(y)
+		if num1 and num2 then -- numeric comparison, either two numbers or numeric strings
+			return num1 < num2
+		else -- compare everything else tostring'ed
+			return tostring(x) < tostring(y)
+		end
+	end
 	local function SetList(self, list, order, itemType)
 		self.list = list
 		self.pullout:Clear()
 		self.hasClose = nil
 		if not list then return end
-
+
 		if type(order) ~= "table" then
 			for v in pairs(list) do
 				sortlist[#sortlist + 1] = v
 			end
-			tsort(sortlist)
-
+			tsort(sortlist, sortTbl)
+
 			for i, key in ipairs(sortlist) do
 				AddListItem(self, key, list[key], itemType)
 				sortlist[i] = nil
@@ -618,7 +626,7 @@ do
 			AddCloseButton(self)
 		end
 	end
-
+
 	-- exported
 	local function AddItem(self, value, text, itemType)
 		if self.list then
@@ -626,7 +634,7 @@ do
 			AddListItem(self, value, text, itemType)
 		end
 	end
-
+
 	-- exported
 	local function SetMultiselect(self, multi)
 		self.multiselect = multi
@@ -635,23 +643,23 @@ do
 			AddCloseButton(self)
 		end
 	end
-
+
 	-- exported
 	local function GetMultiselect(self)
 		return self.multiselect
 	end
-
+
 	local function SetPulloutWidth(self, width)
 		self.pulloutWidth = width
 	end
-
+
 	--[[ Constructor ]]--
-
+
 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
 		local frame = CreateFrame("Frame", nil, UIParent)
 		local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
-
+
 		local self = {}
 		self.type = widgetType
 		self.frame = frame
@@ -659,10 +667,10 @@ do
 		self.count = count
 		frame.obj = self
 		dropdown.obj = self
-
+
 		self.OnRelease   = OnRelease
 		self.OnAcquire   = OnAcquire
-
+
 		self.ClearFocus  = ClearFocus

 		self.SetText     = SetText
@@ -677,9 +685,9 @@ do
 		self.SetItemValue = SetItemValue
 		self.SetItemDisabled = SetItemDisabled
 		self.SetPulloutWidth = SetPulloutWidth
-
+
 		self.alignoffset = 26
-
+
 		frame:SetScript("OnHide",Dropdown_OnHide)

 		dropdown:ClearAllPoints()
@@ -690,10 +698,10 @@ do
 		local left = _G[dropdown:GetName() .. "Left"]
 		local middle = _G[dropdown:GetName() .. "Middle"]
 		local right = _G[dropdown:GetName() .. "Right"]
-
+
 		middle:ClearAllPoints()
 		right:ClearAllPoints()
-
+
 		middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
 		middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
 		right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
@@ -704,7 +712,7 @@ do
 		button:SetScript("OnEnter",Control_OnEnter)
 		button:SetScript("OnLeave",Control_OnLeave)
 		button:SetScript("OnClick",Dropdown_TogglePullout)
-
+
 		local button_cover = CreateFrame("BUTTON",nil,self.frame)
 		self.button_cover = button_cover
 		button_cover.obj = self
@@ -713,14 +721,14 @@ do
 		button_cover:SetScript("OnEnter",Control_OnEnter)
 		button_cover:SetScript("OnLeave",Control_OnLeave)
 		button_cover:SetScript("OnClick",Dropdown_TogglePullout)
-
+
 		local text = _G[dropdown:GetName() .. "Text"]
 		self.text = text
 		text.obj = self
 		text:ClearAllPoints()
 		text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
 		text:SetPoint("LEFT", left, "LEFT", 25, 2)
-
+
 		local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
 		label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
 		label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -732,6 +740,6 @@ do
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
+end
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
index bc3d02a..378e813 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
@@ -56,7 +56,7 @@ local methods = {
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			local n = select("#", ...)
 			if n == 4 or n == 8 then
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
index 7a754f6..eec999e 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
@@ -57,12 +57,12 @@ local function UpdateImageAnchor(self)
 		label:SetWidth(width)
 		height = label:GetStringHeight()
 	end
-
+
 	-- avoid zero-height labels, since they can used as spacers
 	if not height or height == 0 then
 		height = 1
 	end
-
+
 	self.resizing = true
 	frame:SetHeight(height)
 	frame.height = height
@@ -113,7 +113,7 @@ local methods = {
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			self.imageshown = true
 			local n = select("#", ...)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
index 9af4b87..f702110 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -233,7 +233,7 @@ local methods = {
 		end
 		Layout(self)
 	end,
-
+
 	["ClearFocus"] = function(self)
 		self.editBox:ClearFocus()
 		self.frame:SetScript("OnShow", nil)
@@ -253,12 +253,12 @@ local methods = {
 	["GetCursorPosition"] = function(self)
 		return self.editBox:GetCursorPosition()
 	end,
-
+
 	["SetCursorPosition"] = function(self, ...)
 		return self.editBox:SetCursorPosition(...)
 	end,
-
-
+
+
 }

 --[[-----------------------------------------------------------------------------
@@ -273,7 +273,7 @@ local backdrop = {
 local function Constructor()
 	local frame = CreateFrame("Frame", nil, UIParent)
 	frame:Hide()
-
+
 	local widgetNum = AceGUI:GetNextWidgetNum(Type)

 	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
@@ -290,7 +290,7 @@ local function Constructor()
 	button:SetText(ACCEPT)
 	button:SetScript("OnClick", OnClick)
 	button:Disable()
-
+
 	local text = button:GetFontString()
 	text:ClearAllPoints()
 	text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
@@ -339,7 +339,7 @@ local function Constructor()
 	editBox:SetScript("OnTextChanged", OnTextChanged)
 	editBox:SetScript("OnTextSet", OnTextSet)
 	editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
-
+

 	scrollFrame:SetScrollChild(editBox)

diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
index 5a81759..019c84e 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
@@ -105,7 +105,7 @@ local function EditBox_OnEnterPressed(frame)
 	else
 		value = tonumber(value)
 	end
-
+
 	if value then
 		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		self.slider:SetValue(value)
diff --git a/Libs/AceHook-3.0/AceHook-3.0.lua b/Libs/AceHook-3.0/AceHook-3.0.lua
index 8302334..d91c36f 100644
--- a/Libs/AceHook-3.0/AceHook-3.0.lua
+++ b/Libs/AceHook-3.0/AceHook-3.0.lua
@@ -2,14 +2,14 @@
 -- Using AceHook-3.0 is recommended when you need to unhook your hooks again, so the hook chain isn't broken
 -- when you manually restore the original function.
 --
--- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by
+-- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceHook itself.\\
 -- It is recommended to embed AceHook, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceHook.
 -- @class file
 -- @name AceHook-3.0
--- @release $Id: AceHook-3.0.lua 1118 2014-10-12 08:21:54Z nevcairiel $
+-- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8
 local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)

@@ -117,14 +117,14 @@ function donothing() end

 function hook(self, obj, method, handler, script, secure, raw, forceSecure, usage)
 	if not handler then handler = method end
-
+
 	-- These asserts make sure AceHooks's devs play by the rules.
 	assert(not script or type(script) == "boolean")
 	assert(not secure or type(secure) == "boolean")
 	assert(not raw or type(raw) == "boolean")
 	assert(not forceSecure or type(forceSecure) == "boolean")
 	assert(usage)
-
+
 	-- Error checking Battery!
 	if obj and type(obj) ~= "table" then
 		error(format("%s: 'object' - nil or table expected got %s", usage, type(obj)), 3)
@@ -146,8 +146,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			error(format("Cannot hook secure script %q; Use SecureHookScript(obj, method, [handler]) instead.", method), 3)
 		end
 	else
-		local issecure
-		if obj then
+		local issecure
+		if obj then
 			issecure = onceSecure[obj] and onceSecure[obj][method] or issecurevariable(obj, method)
 		else
 			issecure = onceSecure[method] or issecurevariable(method)
@@ -165,21 +165,21 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			end
 		end
 	end
-
+
 	local uid
 	if obj then
 		uid = registry[self][obj] and registry[self][obj][method]
 	else
 		uid = registry[self][method]
 	end
-
+
 	if uid then
 		if actives[uid] then
 			-- Only two sane choices exist here.  We either a) error 100% of the time or b) always unhook and then hook
 			-- choice b would likely lead to odd debuging conditions or other mysteries so we're going with a.
 			error(format("Attempting to rehook already active hook %s.", method))
 		end
-
+
 		if handlers[uid] == handler then -- turn on a decative hook, note enclosures break this ability, small memory leak
 			actives[uid] = true
 			return
@@ -197,7 +197,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 		handlers[uid], actives[uid], scripts[uid] = nil, nil, nil
 		uid = nil
 	end
-
+
 	local orig
 	if script then
 		orig = obj:GetScript(method) or donothing
@@ -206,13 +206,13 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 	else
 		orig = _G[method]
 	end
-
+
 	if not orig then
 		error(format("%s: Attempting to hook a non existing target", usage), 3)
 	end
-
+
 	uid = createHook(self, handler, orig, secure, not (raw or secure))
-
+
 	if obj then
 		self.hooks[obj] = self.hooks[obj] or {}
 		registry[self][obj] = registry[self][obj] or {}
@@ -221,7 +221,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 		if not secure then
 			self.hooks[obj][method] = orig
 		end
-
+
 		if script then
 			if not secure then
 				obj:SetScript(method, uid)
@@ -237,7 +237,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 		end
 	else
 		registry[self][method] = uid
-
+
 		if not secure then
 			_G[method] = uid
 			self.hooks[method] = orig
@@ -245,8 +245,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			hooksecurefunc(method, uid)
 		end
 	end
-
-	actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil
+
+	actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil
 end

 --- Hook a function or a method on an object.
@@ -262,7 +262,7 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
 --   -- Hook ActionButton_UpdateHotkeys, overwriting the secure status
 --   self:Hook("ActionButton_UpdateHotkeys", true)
@@ -275,12 +275,12 @@ function AceHook:Hook(object, method, handler, hookSecure)
 	if type(object) == "string" then
 		method, handler, hookSecure, object = object, method, handler, nil
 	end
-
+
 	if handler == true then
 		handler, hookSecure = nil, true
 	end

-	hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])")
+	hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])")
 end

 --- RawHook a function or a method on an object.
@@ -297,7 +297,7 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
 --   -- Hook ActionButton_UpdateHotkeys, overwriting the secure status
 --   self:RawHook("ActionButton_UpdateHotkeys", true)
@@ -314,11 +314,11 @@ function AceHook:RawHook(object, method, handler, hookSecure)
 	if type(object) == "string" then
 		method, handler, hookSecure, object = object, method, handler, nil
 	end
-
+
 	if handler == true then
 		handler, hookSecure = nil, true
 	end
-
+
 	hook(self, object, method, handler, false, false, true, hookSecure or false,  "Usage: RawHook([object], method, [handler], [hookSecure])")
 end

@@ -337,7 +337,7 @@ function AceHook:SecureHook(object, method, handler)
 	if type(object) == "string" then
 		method, handler, object = object, method, nil
 	end
-
+
 	hook(self, object, method, handler, false, true, false, false,  "Usage: SecureHook([object], method, [handler])")
 end

@@ -354,9 +354,9 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
---   -- Hook the OnShow of FriendsFrame
+--   -- Hook the OnShow of FriendsFrame
 --   self:HookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow")
 -- end
 --
@@ -380,9 +380,9 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
---   -- Hook the OnShow of FriendsFrame
+--   -- Hook the OnShow of FriendsFrame
 --   self:RawHookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow")
 -- end
 --
@@ -420,54 +420,54 @@ function AceHook:Unhook(obj, method)
 	if type(obj) == "string" then
 		method, obj = obj, nil
 	end
-
+
 	if obj and type(obj) ~= "table" then
 		error(format("%s: 'obj' - expecting nil or table got %s", usage, type(obj)), 2)
 	end
 	if type(method) ~= "string" then
 		error(format("%s: 'method' - expeting string got %s", usage, type(method)), 2)
 	end
-
+
 	local uid
 	if obj then
 		uid = registry[self][obj] and registry[self][obj][method]
 	else
 		uid = registry[self][method]
 	end
-
+
 	if not uid or not actives[uid] then
 		-- Declining to error on an unneeded unhook since the end effect is the same and this would just be annoying.
 		return false
 	end
-
+
 	actives[uid], handlers[uid] = nil, nil
-
+
 	if obj then
 		registry[self][obj][method] = nil
 		registry[self][obj] = next(registry[self][obj]) and registry[self][obj] or nil
-
+
 		-- if the hook reference doesnt exist, then its a secure hook, just bail out and dont do any unhooking
 		if not self.hooks[obj] or not self.hooks[obj][method] then return true end
-
+
 		if scripts[uid] and obj:GetScript(method) == uid then  -- unhooks scripts
-			obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil)
+			obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil)
 			scripts[uid] = nil
 		elseif obj and self.hooks[obj] and self.hooks[obj][method] and obj[method] == uid then -- unhooks methods
 			obj[method] = self.hooks[obj][method]
 		end
-
+
 		self.hooks[obj][method] = nil
 		self.hooks[obj] = next(self.hooks[obj]) and self.hooks[obj] or nil
 	else
 		registry[self][method] = nil
-
+
 		-- if self.hooks[method] doesn't exist, then this is a SecureHook, just bail out
 		if not self.hooks[method] then return true end
-
+
 		if self.hooks[method] and _G[method] == uid then -- unhooks functions
 			_G[method] = self.hooks[method]
 		end
-
+
 		self.hooks[method] = nil
 	end
 	return true
@@ -501,7 +501,7 @@ function AceHook:IsHooked(obj, method)
 			return true, handlers[registry[self][obj][method]]
 		end
 	end
-
+
 	return false, nil
 end

diff --git a/Libs/AceSerializer-3.0/AceSerializer-3.0.lua b/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
index 0b19e08..2a4c5ef 100644
--- a/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
+++ b/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
@@ -1,16 +1,16 @@
 --- **AceSerializer-3.0** can serialize any variable (except functions or userdata) into a string format,
--- that can be send over the addon comm channel. AceSerializer was designed to keep all data intact, especially
+-- that can be send over the addon comm channel. AceSerializer was designed to keep all data intact, especially
 -- very large numbers or floating point numbers, and table structures. The only caveat currently is, that multiple
 -- references to the same table will be send individually.
 --
--- **AceSerializer-3.0** can be embeded into your addon, either explicitly by calling AceSerializer:Embed(MyAddon) or by
+-- **AceSerializer-3.0** can be embeded into your addon, either explicitly by calling AceSerializer:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceSerializer itself.\\
 -- It is recommended to embed AceSerializer, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceSerializer.
 -- @class file
 -- @name AceSerializer-3.0
--- @release $Id: AceSerializer-3.0.lua 1135 2015-09-19 20:39:16Z nevcairiel $
+-- @release $Id: AceSerializer-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local MAJOR,MINOR = "AceSerializer-3.0", 5
 local AceSerializer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

@@ -40,7 +40,7 @@ local function SerializeStringHelper(ch)	-- Used by SerializeValue for strings
 		return "\126\122"
 	elseif n<=32 then 			-- nonprint + space
 		return "\126"..strchar(n+64)
-	elseif n==94 then		-- value separator
+	elseif n==94 then		-- value separator
 		return "\126\125"
 	elseif n==126 then		-- our own escape character
 		return "\126\124"
@@ -54,12 +54,12 @@ end
 local function SerializeValue(v, res, nres)
 	-- We use "^" as a value separator, followed by one byte for type indicator
 	local t=type(v)
-
+
 	if t=="string" then		-- ^S = string (escaped to remove nonprints, "^"s, etc)
 		res[nres+1] = "^S"
 		res[nres+2] = gsub(v,"[%c \94\126\127]", SerializeStringHelper)
 		nres=nres+2
-
+
 	elseif t=="number" then	-- ^N = number (just tostring()ed) or ^F (float components)
 		local str = tostring(v)
 		if tonumber(str)==v  --[[not in 4.3 or str==serNaN]] then
@@ -79,7 +79,7 @@ local function SerializeValue(v, res, nres)
 			res[nres+4] = tostring(e-53)	-- adjust exponent to counteract mantissa manipulation
 			nres=nres+4
 		end
-
+
 	elseif t=="table" then	-- ^T...^t = table (list of key,value pairs)
 		nres=nres+1
 		res[nres] = "^T"
@@ -89,7 +89,7 @@ local function SerializeValue(v, res, nres)
 		end
 		nres=nres+1
 		res[nres] = "^t"
-
+
 	elseif t=="boolean" then	-- ^B = true, ^b = false
 		nres=nres+1
 		if v then
@@ -97,15 +97,15 @@ local function SerializeValue(v, res, nres)
 		else
 			res[nres] = "^b"	-- false
 		end
-
+
 	elseif t=="nil" then		-- ^Z = nil (zero, "N" was taken :P)
 		nres=nres+1
 		res[nres] = "^Z"
-
+
 	else
 		error(MAJOR..": Cannot serialize a value of type '"..t.."'")	-- can't produce error on right level, this is wildly recursive
 	end
-
+
 	return nres
 end

@@ -121,14 +121,14 @@ local serializeTbl = { "^1" }	-- "^1" = Hi, I'm data serialized by AceSerializer
 -- @return The data in its serialized form (string)
 function AceSerializer:Serialize(...)
 	local nres = 1
-
+
 	for i=1,select("#", ...) do
 		local v = select(i, ...)
 		nres = SerializeValue(v, serializeTbl, nres)
 	end
-
+
 	serializeTbl[nres+1] = "^^"	-- "^^" = End of serialized data
-
+
 	return tconcat(serializeTbl, "", 1, nres+1)
 end

@@ -175,9 +175,9 @@ local function DeserializeValue(iter,single,ctl,data)
 		ctl,data = iter()
 	end

-	if not ctl then
+	if not ctl then
 		error("Supplied data misses AceSerializer terminator ('^^')")
-	end
+	end

 	if ctl=="^^" then
 		-- ignore extraneous data
@@ -185,7 +185,7 @@ local function DeserializeValue(iter,single,ctl,data)
 	end

 	local res
-
+
 	if ctl=="^S" then
 		res = gsub(data, "~.", DeserializeStringHelper)
 	elseif ctl=="^N" then
@@ -218,7 +218,7 @@ local function DeserializeValue(iter,single,ctl,data)
 			ctl,data = iter()
 			if ctl=="^t" then break end	-- ignore ^t's data
 			k = DeserializeValue(iter,true,ctl,data)
-			if k==nil then
+			if k==nil then
 				error("Invalid AceSerializer table format (no table end marker)")
 			end
 			ctl,data = iter()
@@ -231,7 +231,7 @@ local function DeserializeValue(iter,single,ctl,data)
 	else
 		error("Invalid AceSerializer control code '"..ctl.."'")
 	end
-
+
 	if not single then
 		return res,DeserializeValue(iter)
 	else
diff --git a/Libs/AceTab-3.0/AceTab-3.0.lua b/Libs/AceTab-3.0/AceTab-3.0.lua
index b7c64db..aa67ef8 100644
--- a/Libs/AceTab-3.0/AceTab-3.0.lua
+++ b/Libs/AceTab-3.0/AceTab-3.0.lua
@@ -2,7 +2,7 @@
 -- Note: This library is not yet finalized.
 -- @class file
 -- @name AceTab-3.0
--- @release $Id: AceTab-3.0.lua 1148 2016-07-18 09:13:02Z nevcairiel $
+-- @release $Id: AceTab-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 local ACETAB_MAJOR, ACETAB_MINOR = 'AceTab-3.0', 9
 local AceTab, oldminor = LibStub:NewLibrary(ACETAB_MAJOR, ACETAB_MINOR)
@@ -131,7 +131,7 @@ function AceTab:RegisterTabCompletion(descriptor, prematches, wordlist, usagefun
 	elseif type(listenframes) ~= 'table' or type(listenframes[0]) == 'userdata' and type(listenframes.IsObjectType) == 'function' then  -- single frame or framename
 		listenframes = { listenframes }
 	end
-
+
 	-- Hook each registered listenframe and give it a matches table.
 	for _, f in pairs(listenframes) do
 		if type(f) == 'string' then
@@ -148,7 +148,7 @@ function AceTab:RegisterTabCompletion(descriptor, prematches, wordlist, usagefun
 			end
 		end
 	end
-
+
 	-- Everything checks out; register this completion.
 	if not registry[descriptor] then
 		registry[descriptor] = { prematches = pmtable, wordlist = wordlist, usagefunc = usagefunc, listenframes = listenframes, postfunc = postfunc, pmoverwrite = pmoverwrite }
@@ -358,7 +358,7 @@ function AceTab:OnTabPressed(this)
 	firstPMLength = 0
 	hasNonFallback = false
 	for i in pairs(pmolengths) do pmolengths[i] = nil end
-
+
 	for desc in pairs(notfallbacks) do
 		fillMatches(this, desc)
 	end
@@ -368,7 +368,7 @@ function AceTab:OnTabPressed(this)
 		end
 	end

-	if not firstMatch then
+	if not firstMatch then
 		this.at3_last_precursor = "\0"
 		return true
 	end
@@ -390,7 +390,7 @@ function AceTab:OnTabPressed(this)
 		for desc, matches in pairs(this.at3matches) do
 			-- Don't print usage statements for fallback completion groups if we have 'real' completion groups with matches.
 			if hasNonFallback and fallbacks[desc] then break end
-
+
 			-- Use the group's description as a heading for its usage statements.
 			DEFAULT_CHAT_FRAME:AddMessage(desc..":")

diff --git a/Libs/AceTimer-3.0/AceTimer-3.0.lua b/Libs/AceTimer-3.0/AceTimer-3.0.lua
index 336864b..33b4da4 100644
--- a/Libs/AceTimer-3.0/AceTimer-3.0.lua
+++ b/Libs/AceTimer-3.0/AceTimer-3.0.lua
@@ -15,7 +15,7 @@
 -- make into AceTimer.
 -- @class file
 -- @name AceTimer-3.0
--- @release $Id: AceTimer-3.0.lua 1170 2018-03-29 17:38:58Z funkydude $
+-- @release $Id: AceTimer-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes
 local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -47,7 +47,7 @@ local function new(self, loop, func, delay, ...)
 	activeTimers[timer] = timer

 	-- Create new timer closure to wrap the "timer" object
-	timer.callback = function()
+	timer.callback = function()
 		if not timer.cancelled then
 			if type(timer.func) == "string" then
 				-- We manually set the unpack count to prevent issues with an arg set that contains nil and ends with nil
diff --git a/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
index 675d7b0..a8377fe 100644
--- a/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
+++ b/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -1,5 +1,5 @@
---[[ $Id: CallbackHandler-1.0.lua 1131 2015-06-04 07:29:24Z nevcairiel $ ]]
-local MAJOR, MINOR = "CallbackHandler-1.0", 6
+--[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 7
 local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)

 if not CallbackHandler then return end -- No upgrade needed
@@ -22,41 +22,15 @@ local function errorhandler(err)
 	return geterrorhandler()(err)
 end

-local function CreateDispatcher(argCount)
-	local code = [[
-	local next, xpcall, eh = ...
-
-	local method, ARGS
-	local function call() method(ARGS) end
-
-	local function dispatch(handlers, ...)
-		local index
-		index, method = next(handlers)
-		if not method then return end
-		local OLD_ARGS = ARGS
-		ARGS = ...
-		repeat
-			xpcall(call, eh)
-			index, method = next(handlers, index)
-		until not method
-		ARGS = OLD_ARGS
-	end
-
-	return dispatch
-	]]
-
-	local ARGS, OLD_ARGS = {}, {}
-	for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
-	code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
+local function Dispatch(handlers, ...)
+	local index, method = next(handlers)
+	if not method then return end
+	repeat
+		xpcall(method, errorhandler, ...)
+		index, method = next(handlers, index)
+	until not method
 end

-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-
 --------------------------------------------------------------------------
 -- CallbackHandler:New
 --
@@ -87,7 +61,7 @@ function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAll
 		local oldrecurse = registry.recurse
 		registry.recurse = oldrecurse + 1

-		Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
+		Dispatch(events[eventname], eventname, ...)

 		registry.recurse = oldrecurse

diff --git a/Libs/Changelog-Ace3-Release-r1151.txt b/Libs/Changelog-Ace3-Release-r1151.txt
deleted file mode 100644
index c78dc9d..0000000
--- a/Libs/Changelog-Ace3-Release-r1151.txt
+++ /dev/null
@@ -1,92 +0,0 @@
-------------------------------------------------------------------------
-r1151 | nevcairiel | 2016-07-18 17:03:29 +0000 (Mon, 18 Jul 2016) | 1 line
-Changed paths:
-   A /tags/Release-r1151 (from /trunk:1150)
-
-Tag as Release-r1151
-------------------------------------------------------------------------
-r1150 | nevcairiel | 2016-07-18 17:02:20 +0000 (Mon, 18 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/changelog.txt
-
-Update changelog
-------------------------------------------------------------------------
-r1149 | nevcairiel | 2016-07-18 17:02:10 +0000 (Mon, 18 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/Ace3.toc
-
-Update TOC for 7.0
-------------------------------------------------------------------------
-r1148 | nevcairiel | 2016-07-18 09:13:02 +0000 (Mon, 18 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
-   M /trunk/AceTab-3.0/AceTab-3.0.lua
-
-Remove remaining compat code for ancient WoW versions
-------------------------------------------------------------------------
-r1147 | nevcairiel | 2016-07-18 09:10:10 +0000 (Mon, 18 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
-
-Remove pre-MoP compat code from AceGUI widgets
-------------------------------------------------------------------------
-r1146 | nevcairiel | 2016-07-18 09:07:16 +0000 (Mon, 18 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
-
-Fix global leak
-------------------------------------------------------------------------
-r1145 | nevcairiel | 2016-07-18 08:32:42 +0000 (Mon, 18 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
-
-AceGUI-3.0: Keybinding: Support mousewheel up/down bindings (Ticket #372)
-------------------------------------------------------------------------
-r1144 | nevcairiel | 2016-07-11 09:04:48 +0000 (Mon, 11 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/changelog.txt
-
-Re-format changelog to be consistent with older entries
-------------------------------------------------------------------------
-r1143 | nevcairiel | 2016-07-11 08:52:03 +0000 (Mon, 11 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceConsole-3.0/AceConsole-3.0.lua
-
-AceConsole-3.0: Fix a typo in the LuaDoc function signature
-------------------------------------------------------------------------
-r1142 | nevcairiel | 2016-07-11 08:36:19 +0000 (Mon, 11 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceDB-3.0/AceDB-3.0.lua
-
-AceDB-3.0: Add the "locale" profile key to the LuaDoc (Ticket #344)
-------------------------------------------------------------------------
-r1141 | nevcairiel | 2016-07-11 08:32:23 +0000 (Mon, 11 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
-
-AceGUI-3.0: Expose the HighlightText API for EditBox and MultiLineEditBox Widgets (Ticket #378)
-------------------------------------------------------------------------
-r1140 | nevcairiel | 2016-07-03 07:53:29 +0000 (Sun, 03 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua
-
-AceDBOptions-3.0: Update localization from the WoWAce Localization system
-------------------------------------------------------------------------
-r1139 | nevcairiel | 2016-07-03 07:43:51 +0000 (Sun, 03 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
-   M /trunk/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
-
-AceConfig-3.0: Allow specifying images using the numeric fileID (Ticket #389)
-------------------------------------------------------------------------
-r1138 | nevcairiel | 2016-06-01 10:17:04 +0000 (Wed, 01 Jun 2016) | 3 lines
-Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
-
-AceGUI-3.0: TreeGroup: Refresh the tree in an OnUpdate once after Acquire, not only after creation
-
-The widget creation and acquire can be on different code paths, this ensures the tree height is always known and the tree populated properly.
-------------------------------------------------------------------------
diff --git a/Libs/Changelog-Ace3-r1151.txt b/Libs/Changelog-Ace3-r1151.txt
new file mode 100644
index 0000000..c78dc9d
--- /dev/null
+++ b/Libs/Changelog-Ace3-r1151.txt
@@ -0,0 +1,92 @@
+------------------------------------------------------------------------
+r1151 | nevcairiel | 2016-07-18 17:03:29 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   A /tags/Release-r1151 (from /trunk:1150)
+
+Tag as Release-r1151
+------------------------------------------------------------------------
+r1150 | nevcairiel | 2016-07-18 17:02:20 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/changelog.txt
+
+Update changelog
+------------------------------------------------------------------------
+r1149 | nevcairiel | 2016-07-18 17:02:10 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+Update TOC for 7.0
+------------------------------------------------------------------------
+r1148 | nevcairiel | 2016-07-18 09:13:02 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+   M /trunk/AceTab-3.0/AceTab-3.0.lua
+
+Remove remaining compat code for ancient WoW versions
+------------------------------------------------------------------------
+r1147 | nevcairiel | 2016-07-18 09:10:10 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+
+Remove pre-MoP compat code from AceGUI widgets
+------------------------------------------------------------------------
+r1146 | nevcairiel | 2016-07-18 09:07:16 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+
+Fix global leak
+------------------------------------------------------------------------
+r1145 | nevcairiel | 2016-07-18 08:32:42 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+
+AceGUI-3.0: Keybinding: Support mousewheel up/down bindings (Ticket #372)
+------------------------------------------------------------------------
+r1144 | nevcairiel | 2016-07-11 09:04:48 +0000 (Mon, 11 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/changelog.txt
+
+Re-format changelog to be consistent with older entries
+------------------------------------------------------------------------
+r1143 | nevcairiel | 2016-07-11 08:52:03 +0000 (Mon, 11 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceConsole-3.0/AceConsole-3.0.lua
+
+AceConsole-3.0: Fix a typo in the LuaDoc function signature
+------------------------------------------------------------------------
+r1142 | nevcairiel | 2016-07-11 08:36:19 +0000 (Mon, 11 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceDB-3.0/AceDB-3.0.lua
+
+AceDB-3.0: Add the "locale" profile key to the LuaDoc (Ticket #344)
+------------------------------------------------------------------------
+r1141 | nevcairiel | 2016-07-11 08:32:23 +0000 (Mon, 11 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+
+AceGUI-3.0: Expose the HighlightText API for EditBox and MultiLineEditBox Widgets (Ticket #378)
+------------------------------------------------------------------------
+r1140 | nevcairiel | 2016-07-03 07:53:29 +0000 (Sun, 03 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua
+
+AceDBOptions-3.0: Update localization from the WoWAce Localization system
+------------------------------------------------------------------------
+r1139 | nevcairiel | 2016-07-03 07:43:51 +0000 (Sun, 03 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+   M /trunk/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+
+AceConfig-3.0: Allow specifying images using the numeric fileID (Ticket #389)
+------------------------------------------------------------------------
+r1138 | nevcairiel | 2016-06-01 10:17:04 +0000 (Wed, 01 Jun 2016) | 3 lines
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+
+AceGUI-3.0: TreeGroup: Refresh the tree in an OnUpdate once after Acquire, not only after creation
+
+The widget creation and acquire can be on different code paths, this ensures the tree height is always known and the tree populated properly.
+------------------------------------------------------------------------
diff --git a/Libs/Changelog-Ace3-r1214.txt b/Libs/Changelog-Ace3-r1214.txt
new file mode 100644
index 0000000..6c00e8c
--- /dev/null
+++ b/Libs/Changelog-Ace3-r1214.txt
@@ -0,0 +1,417 @@
+Ace3 Release - Revision r1214 (June 26th, 2019)
+-----------------------------------------------
+- AceConfigDialog-3.0: Exposed "select" type sorting control through a new "sorting" config table member
+- AceConfigDialog-3.0: Clear existing anchors on the GameTooltip before re-anchoring it for 8.2 compatibility
+- AceConfigDialog-3.0: Improved options table sorting algorithm to produce a stable result in certain edge cases (Ticket #501)
+- AceConfigRegistry-3.0: Added missing custom controls entries for all types added in the last release (Ticket  #494)
+- AceGUI-3.0: ColorPicker: Removed usage of Show/HideUIPanel for WoW 8.2 compatibiliy
+- AceGUI-3.0: DropDown: Improved dropdown sorting algorithm to support tables with mixed string and numeric keys
+
+Ace3 Release - Revision r1200 (January 24th, 2019)
+--------------------------------------------------
+- Cleanup for WoW 8.0 improvements
+- AceGUI-3.0: Worked around various quirks in the WoW 8.0/8.1 API
+- AceGUI-3.0: ColorPicker: Store references to the background/checkers textures (Ticket #473)
+- AceConfigDialog-3.0: Allow custom controls for almost all option types (Ticket #475)
+
+Ace3 Release - Revision r1182 (July 17th, 2018)
+-----------------------------------------------
+- AceComm-3.0: Support numeric targets for custom channels (Ticket #419)
+- AceComm-3.0/ChatThrottleLib: Updated for WoW 8.0 API changes
+- AceConfig-3.0: Allow number values for the "width" parameter, which acts as a multiplier of the default width
+- AceConfigDialog-3.0: Enable iconCoords for the main level of a tree group (Ticket #417)
+- AceGUI-3.0: Implement a Table Layout (#442)
+- AceGUI-3.0: EditBox: Only try to handle dragging if a valid object is being dragged into the text box
+- AceGUI-3.0: Various fixes and work-arounds for WoW 8.0 changes
+
+Ace3 Release - Revision r1166 (August 29th, 2017)
+-------------------------------------------------
+- Updated any use of PlaySound to the new numeric constants (Fix for WoW 7.3)
+- AceConfigDialog-3.0: implement fallback validation feedback in a StaticPopup (Ticket #2)
+
+Ace3 Release - Revision r1158 (March 28th, 2017)
+------------------------------------------------
+- AceGUI-3.0: Fire OnShow events from Frame and Windows containers (Ticket #396)
+- AceGUI-3.0: Add SetJustifyV/H API to the Label/InteractiveLabel widgets (Ticket #397)
+
+Ace3 Release - Revision r1151 (July 18th, 2016)
+-----------------------------------------------
+- AceConfig-3.0: Allow specifying images using the numeric fileID (Ticket #389)
+- AceGUI-3.0: Use SetColorTexture in WoW 7.0
+- AceGUI-3.0: Expose the HighlightText API for EditBox and MultiLineEditBox Widgets (Ticket #378)
+- AceGUI-3.0: Keybinding: Support MouseWheel Up/Down bindings (Ticket #372)
+- AceGUI-3.0: TreeGroup: Refresh the tree in an OnUpdate once after Acquire, not only after creation (Fixes missing tree in WoW 7.0)
+- AceSerializer-3.0: Create consistent tokens for infinity, independent of the clients platform
+
+Ace3 Release - Revision r1134 (June 23rd, 2015)
+-----------------------------------------------
+- AceGUI-3.0: TreeGroup: Prevent Word Wrap in tree elements
+
+Ace3 Release - Revision r1128 (February 24th, 2015)
+---------------------------------------------------
+- AceGUI-3.0: Fixed an error in GameTooltip handling causing wrong formatting in some cases
+
+Ace3 Release - Revision r1122 (October 14th, 2014)
+--------------------------------------------------
+- AceDB-3.0: Now using the GetCurrentRegion() API to determine region-based profile keys (fix for WoW 6.0)
+- AceComm-3.0: Update ChatThrottleLib to v23
+- AceConfigDialog-3.0: Show a more meaningful title on Blizzard Options Groups (Ticket #353)
+- AceGUI-3.0: ColorPicker: Frame Level is automatically increased to ensure the color picker frame is above the option panel
+- AceGUI-3.0: DropDown: Properly disable all clickable areas when the dropdown is disabled (Ticket #360)
+- AceHook-3.0: Always use HookScript when hooking scripts in a secure fashion (Ticket #338)
+- AceTimer-3.0: New timer implementation based on C_Timer.After
+
+Ace3 Release - Revision r1109 (February 19th, 2014)
+---------------------------------------------------
+- AceComm-3.0: Ambiguate addon comm messages to restore behavior to be identical to pre-5.4.7
+- AceConfigRegistry-3.0: Added an option to skip options table validation on registering
+
+Ace3 Release - Revision r1104 (October 31st, 2013)
+--------------------------------------------------
+- AceGUI-3.0: Flow Layout: Added a safeguard to prevent an infinite loop in the layout engine
+- AceGUI-3.0: DropDown: Adjust its style slightly to closer resemble the Blizzard DropDown Widget
+- AceGUI-3.0: DropDown: API enhancements to specify the width of the pullout and be notified when its opened
+
+Ace3 Release - Revision r1098 (September 13th, 2013)
+----------------------------------------------------
+- AceDB-3.0: Switch characters to the default profile if their active profile is deleted (Ticket #324)
+- AceConfigDialog-3.0: Try to prevent static popup taint (Ticket #322)
+- AceGUI-3.0: Button: Add a new "Auto Width" option (Ticket #310)
+- AceGUI-3.0: DropDown: Make the entire DropDown widget clickable (Ticket #339)
+- AceGUI-3.0: EditBox: Allow dragging macros to the editbox (which will then contain the macros name) (Ticket #337)
+- AceGUI-3.0: Slider: Add a workaround for the broken slider steps in WoW 5.4 (Ticket #346)
+- AceGUI-3.0: TreeGroup: Fix an issue introduced by 5.4 broken scrollbars (Ticket #345)
+- AceHook-3.0: Allow hooking of AnimationGroup scripts (Ticket #314)
+
+Ace3 Release - Revision r1086 (May 21st, 2013)
+----------------------------------------------
+- AceAddon-3.0: Improved behavior when loading modules during game startup, ensures proper loading order
+
+Ace3 Release - Revision r1083 (March 4th, 2013)
+-----------------------------------------------
+- AceTimer-3.0: Fixed an issue that caused the parameter list passed to the callback to be cut off at nil values
+- AceGUI-3.0: InlineGroup: The title attribute is properly reset for recycled objects
+
+Ace3 Release - Revision r1078 (February 10th, 2013)
+---------------------------------------------------
+- AceTimer-3.0: Re-write based on AnimationTimers
+- AceHook-3.0: Improved checks/error messages when trying to hook a script on a "nil" frame
+- AceDBOptions-3.0: Added Italian locale
+- AceGUI-3.0: BlizOptionsGroup: Fixed the "default" button callback
+- AceGUI-3.0: Colorpicker: The colorpicker is now clamped to the screen
+
+Ace3 Release - Revision r1061 (August 27th, 2012)
+-------------------------------------------------
+- AceConfigDialog-3.0: Try to avoid potential taints in static popup dialogs
+- AceConfigDialog-3.0: Sort multiselects with "radio" style
+- AceGUI-3.0: Support for WoW 5.0
+- AceGUI-3.0: MultiLineEditBox: Support shift-click'ing items/spells/etc. into the editbox
+- AceGUI-3.0: Label: Fix text alignment (Ticket #301)
+- AceGUI-3.0: Checkbox: Description text on a disable checkbox should look disabled (Ticket #304)
+- AceGUI-3.0: Keybinding: Ensure the Keybinding popup is on the top level (Ticket #305)
+
+Ace3 Release - Revision r1041 (November 29th, 2011)
+---------------------------------------------------
+- AceDB-3.0: Added locale and factionrealmregion profile keys
+- AceSerializer-3.0: Removed support for NaN, as WoW 4.3 does no longer allow it.
+- AceGUI-3.0: Frame: Add :EnableResize (Ticket #214)
+
+Ace3 Release - Revision r1032 (June 29th, 2011)
+-----------------------------------------------
+- AceTab-3.0: Improvements to Match handling (Ticket #255 and #256)
+- AceGUI-3.0: DropDown layout fix with hidden labels (Ticket #234)
+
+Ace3 Release - Revision r1025 (April 27th, 2011)
+------------------------------------------------
+- AceComm-3.0: Updated for 4.1 changes - now handles RegisterAddonMessagePrefix internally for you.
+- AceGUI-3.0: TabGroup: Fixed width of tabs in 4.1(Ticket #243)
+
+Ace3 Release - Revision r1009 (February 9th, 2011)
+--------------------------------------------------
+- AceLocale-3.0: Fix erronous assumption that the default locale is always the first to be registered for the :NewLocale() "silent" flag. The flag must now be set on the FIRST locale to be registered.
+- AceLocale-3.0: The :NewLocale() "silent" flag may now be set to the string "raw", meaning nils are returned for unknown translations.
+- AceGUI-3.0: Fix the disabled state of Icon widgets
+- AceGUI-3.0: The header of the Frame widget now dynamically changes size to fit the text (Ticket #171)
+- AceGUI-3.0: Its now possible to define a custom order the elements in a dropdown widget
+- AceGUI-3.0: Improved widget focus behaviour across the board (Ticket #192, #193)
+- AceGUI-3.0: Fixed a bug that made it impossible to block the tree widget from being user resizable (Ticket #163)
+- AceGUI-3.0: Fixed a bug that caused TreeGroups to become unresponsive under certain conditions (Ticket #189, #202)
+- AceGUI-3.0: Enhanced the DropDown widget to allow it to be reused more easily.
+- AceConfigDialog-3.0: Select Groups now have the proper order in the dropdown (Ticket #184)
+- AceConfigDialog-3.0: Implemented "radio" style select boxes (Ticket #149)
+
+Ace3 Release - Revision r981 (October 27th, 2010)
+-------------------------------------------------
+- AceAddon-3.0: Fixed a library upgrading issue
+- AceAddon-3.0: Modules are now enabled in loading order
+- AceGUI-3.0: Keybinding: The widget will no longer steal keybindings even when inactive (Ticket #169)
+- AceGUI-3.0: EditBox: Fixed spell drag'n'drop
+
+
+Ace3 Release - Revision r971 (October 12th, 2010)
+-------------------------------------------------
+- Small fixes and adjustments for the 4.0 Content Patch.
+- AceGUI-3.0: ScrollFrame: Allow for a small margin of error when determining if the scroll bar should be shown.
+- AceGUI-3.0: Added new widget APIs: GetText for EditBox and DisableButton for MultiLineEditBox
+
+Ace3 Release - Revision r960 (July 20th, 2010)
+----------------------------------------------
+- AceGUI-3.0: Label: Reset Image Size and TexCoords on Acquire (Ticket #110)
+- AceGUI-3.0: CheckBox: Re-apply the disabled state after setting a value, so the visuals are correct in either case. (Ticket #107)
+- AceGUI-3.0: Icon: Fix the vertical size. It'll now properly scale with the image size, and not be fixed to about 110px. (Ticket #104)
+- AceGUI-3.0: External Containers (Frame, Window) should always start in a visible state. (Ticket #121)
+- AceGUI-3.0: Added Blizzard sounds to widgets (Ticket #120)
+- AceGUI-3.0: CheckBox: check for self.desc:GetText() being nil as well as "" to prevent setting the wrong height on the checkbox causing bouncing checkboxes.
+- AceGUI-3.0: Rewrite of the MultiLineEditBox (Ticket #68)
+- AceGUI-3.0: CheckBox: Fix alignment of the text in OnMouseDown when an image is set. (Ticket #142)
+- AceGUI-3.0: Add SetMaxLetters APIs to EB and MLEB (Ticket #135)
+- AceGUI-3.0: Frame: Add events for OnEnter/OnLeave of the statusbar (Ticket #139)
+- AceGUI-3.0: Major cleanups and refactoring in nearly all widgets and containers.
+- AceConfigDialog-3.0: Always obey the min/max values on range-type widgets (Ticket #114)
+- AceConfigDialog-3.0: Pass iconCoords set on groups in the options table to the tree widget (Ticket #111)
+- AceConfigDialog-3.0: Implement "softMin" and "softMax", allowing for a UI-specific minimum/maximum for range controls, while allowing manual input of values in the old min/max range. (Ticket #123)
+- AceConfigDialog-3.0: Don't close frames in CloseAll that are being opened after the CloseAll event was dispatched. (Ticket #132).
+- AceSerializer-3.0: Fix encoding & decoding of \030. (Ticket #115)
+- AceDB-3.0: Remove empty sections on logout, keeping the SV clean of more useless informations.
+- AceDBOptions-3.0.lua: Fix a string typo (Ticket #141)
+
+Ace3 Release - Revision r907 (December 16th, 2009)
+---------------------------------------------------
+- AceGUI-3.0: Frame: Properly save the width in the status table.
+- AceConfigCmd-3.0: Properly handle help output of inline groups with a different handler. (Ticket #101)
+- AceConfigDialog-3.0: Don't bail out and error when a dialogControl was invalid, instead show the error and fallback to the default control for that type.
+- AceConfigDialog-3.0: Fix a hickup with the OnUpdate script not getting upgraded properly in some situations.
+
+Ace3 Release - Revision r900 (December 8th, 2009)
+--------------------------------------------------
+- AceGUI-3.0: Alot of visual fixes regarding margins and general widget styles.
+- AceGUI-3.0: Ability to accept links for EditBox Widget (Ticket #21)
+- AceGUI-3.0: ScrollFrame: Hide the scrollbar when there is no overflowing content, and allow the Layout functions to use that space for widgets.
+- AceGUI-3.0: DropDown: Added a GetValue() API to the Widget (Ticket #69)
+- AceGUI-3.0: Button: Pass the arguments of the OnClick handler to the OnClick callback (Ticket #57)
+- AceGUI-3.0: add a Window container, basically a plain window with close button
+- AceGUI-3.0: Add support for inline descriptions to the checkbox widget.
+- AceGUI-3.0: Added an API to the Window container to disable the user-resizing of the same. (Ticket #80)
+- AceGUI-3.0: TreeGroup: Allow iconCoords to be passed for the tree elements. (Ticket #59)
+- AceGUI-3.0: Slider: Add a more visible backdrop/border around the manual input area (Ticket #98, #46)
+- AceGUI-3.0: Allow displaying a image in front of the checkbox label. (Ticket #82)
+- AceConfig-3.0: Added an experimental "descStyle" member to all option table nodes that allows you to control the way the description is presented.
+                 Supported values are "tooltip" for the old behaviour, and "inline" for a inline display of the description, pending support in AceGUI-3.0 widgets.
+- AceConfigCmd-3.0: Properly parse functions and methods supplied for the "hidden" option table member. (Ticket #96)
+- AceConfigDialog-3.0: Fix the unpacking of the basepath arguments when internally calling :Open (Ticket #90)
+- AceConfigDialog-3.0: Properly refresh BlizOptions Windows which are registered with a path on NotifyChange. (Ticket #93)
+- AceConfigDialog-3.0: Allow image/imageCoords on toogle elements (Note that the width/height of the image on the toggle cannot be changed) (Ticket #82)
+- AceConfigDialog-3.0: Pass the groups "name" tag to DropDownGroups as the title. (Ticket #79)
+- AceDB-3.0: Remove the metatable from the DB before removing defaults, so we don't accidentally invoke it in the process. (Ticket #66)
+- AceDB-3.0: Don't save the profileKeys for namespaces, since we use the profile of the parent DB anyway. This will cut down on SV complexity when using alot of namespaces.
+- AceDB-3.0: Don't fire the OnProfileReset callback when copying a profile.
+- AceDBOptions-3.0: Show the current profile on the dialog. (Ticket #56)
+- AceComm-3.0: Add callbacks for message chunks going out the wire (via CTL). Useful for displaying progress for very large messages.
+- AceConsole-3.0: Add :Printf() so you don't have to do Print(format())
+
+Ace3 Beta - Revision 820 (August 7th, 2009)
+--------------------------------------------
+- AceComm-3.0: Updated ChatThrottleLib to v21
+- AceGUI-3.0: Fixed a glitch in the TabGroup code that caused tabs to be unresponsive under rare conditions. (Ticket #38)
+- AceGUI-3.0: Consistent "disabled" behaviour of all widgets. (Ticket #47)
+- AceGUI-3.0: Changed the way widgets are handled on release to avoid a crash in the game client. (Ticket #49)
+- AceGUI-3.0: Fixed a glitch in the button graphics. (Ticket #58)
+- AceGUI-3.0: Localized the "Close" Text on the Frame widget.
+
+Ace3 Beta - Revision 803 (April 14th, 2009)
+--------------------------------------------
+- AceConfig-3.0: Allow spaces in the keys of config tables. Spaces will be changed on the fly to underscores in AceConfigCmd-3.0 - there is no collision check in place, yet.
+- AceConfig-3.0: Support a "fontSize" attribute to the description type. Possible values are "small" (default), "medium" and "large".
+- AceConfigDialog-3.0: Fixed an error that would occur when calling InterfaceOptionsFrame_OpenToCategory from within an event handler in a Blizzard Options integrated frame. (Ticket #33)
+- AceConfigDialog-3.0: The "execute" type does now recognize the "image" attributes, and will display a clickable icon instead of the button when an image is supplied. (Ticket #35)
+- AceConfigDialog-3.0: Pass icons defined in the option table to the TreeGroup widget (Ticket #20)
+- AceConfigDialog-3.0: Fixed a bug that caused an empty group widget to be drawn if all groups were hidden.
+- AceConfigCmd-3.0: Improved the behaviour of select and multiselect elements. (Ticket #26)
+- AceDB-3.0: Add a GetNamespace function to the DB Objects which returns an existing namespace from the DB object.
+- AceGUI-3.0 Slider Widget: Properly show percentage values as min/max if isPercent is true. (Ticket #32)
+- AceGUI-3.0: Fixed an error in the TreeGroup Widget that caused execution to stop if no name was provided.
+- AceGUI-3.0: Fixed the behaviour of the MultiLineEditbox Widget (Accept button not clickable). (Ticket #28)
+- AceGUI-3.0: TabGroup: Set a maximum width for tabs based on the size of the widget. (Ticket #34)
+- AceGUI-3.0: Added a new InteractiveLabel with OnEnter/OnLeave/OnClick callbacks and a highlight texture
+- AceGUI-3.0: Add SetFont and SetFontObject functions to the Label widget (and the new InteractiveLabel)
+- AceGUI-3.0: Support icons in the TreeGroup display. (Ticket #20)
+- AceGUI-3.0: Added a new :SetRelativeWidth Widget-API that allows you to set the width of widgets relative to their container.
+- AceGUI-3.0: Alot of fixes, tweaks and consistency changes.
+
+Ace3 Beta - Revision 741 (Feb 15th, 2009)
+--------------------------------------------
+- AceDBOptions-3.0: Disable the "Copy From" and "Delete" dropdowns if there are no profiles to choose from. (Ticket #19)
+- AceGUI-3.0: Improve TabGroup visual style - only stretch them to the full width if they would use more then 75% of the exisiting space.
+- AceGUI-3.0: Added a third optional argument to <container>:AddChild() to specify the position for the new widget. (Ticket #22)
+- AceConfigCmd-3.0: Improve help output when viewing groups.
+- AceConfigDialog-3.0: Refresh the Options Panel after a confirmation is canceled to reset the value to its previous value. (Ticket #23)
+- AceDB-3.0: Fix a data inconsistency when using false as a table key. (Ticket #25)
+
+Ace3 Beta - Revision 722 (Jan 4th, 2009)
+--------------------------------------------
+- AceHook-3.0: Fix :SecureHookScript to not fail on previously empty scripts since frame:HookScript does nothing at all in that case. (Ticket #16)
+- AceLocale-3.0: Implement 'silent' option for :NewLocale to disable the warnings on unknown entrys (Ticket #18)
+- AceTimer-3.0: Implement :TimeLeft(handle) function (Ticket #10)
+- AceGUI-3.0: Fix TabGroup tab resizing to be consistent
+- AceGUI-3.0: Fixed EditBox alignment when the label is disabled (Ticket #13)
+- AceDB-3.0: Implement OnProfileShutdown callback (Ticket #7)
+- AceDBOptions-3.0: Updated esES and ruRU locale
+
+Ace3 Beta - Revision 706 (Oct 18th, 2008)
+--------------------------------------------
+- First Beta release after WoWAce move
+- Removed WoW 2.4.x compat layer
+- AceGUI-3.0: Fix disabling of the Multiline Editbox
+- AceGUI-3.0: Improvements to the Keybinding Widget
+
+Ace3 Beta - Revision 81437 (Sept 6th, 2008)
+--------------------------------------------
+- AceConfigDialog-3.0: the confirm callback will now receive the new value that is being set (same signature as the validate callback)
+- AceConfigDialog-3.0: :Close and :CloseAll are now safe to call from within callbacks.
+- AceGUI-3.0: Added new methods to the widget base table, see ACE-205 for full reference
+- AceGUI-3.0: Various fixes to Widgets and recycling process
+- Now compatible with WoW 3.0 (compat layer is to be removed upon 3.0 release)
+
+
+Ace3 Beta - Revision 76325 (June 9th, 2008)
+--------------------------------------------
+- AceGUI-3.0: Finish Multiselect support for the Dropdown widget (nargiddley)
+- AceGUI-3.0: Re-write TabGroup layouting (nargiddley)
+- AceGUI-3.0: TreeGroup: Add :EnableButtonTooltips(enable) to make the default tooltips on the tree optional, enabled by default. (nargiddley)
+- AceGUI-3.0: TabGroup: Add OnTabEnter and OnTabLeave Callbacks  (nargiddley)
+- AceConfigDialog-3.0: Add :SelectGroup(appName, ...) - Selects the group given by the path specified then refreshes open windows. (nargiddley)
+- AceConfigDialog-3.0: :Open now accepts an optional path, when given will open the window with only the given group and its children visible (nargiddley)
+- AceConfigDialog-3.0: :AddToBlizOptions now accepts an optional path, this will add the config page to display the specified group and its children only. (nargiddley)
+- AceConfigDialog-3.0: ACE-189: allow multiselect to be shown as a dropdown by setting dialogControl = "Dropdown" (nargiddley)
+- AceConfigDialog-3.0: Add Custom tooltips to the TreeGroup and TabGroup, shows both name and desc for the group. (nargiddley)
+- AceConfigCmd-3.0: ACE-195: Remove unneeded references to .confirm, will no longer error when .confirm is a boolean (nargiddley)
+- AceAddon-3.0: Allow for an optional first argument to NewAddon to be a table to be used as the base for the addon. (ammo)
+
+Ace3 Beta - Revision 74633 (May 19th, 2008)
+--------------------------------------------
+- AceTimer-3.0: ACE-173: don't error on nil handle for CancelTimer(), just bail out early. (ammo)
+- AceGUI-3.0: ACE-161, ACE-180, ACE-181: New and improved DropDown widget (originally coded by Borlox) (nargiddley,nevcairiel)
+- AceGUI-3.0: AceGUI will call OnWidthSet and OnHeightSet as frames resize (nargiddley)
+- AceGUI-3.0: TabGroup: Use OptionsFrameTabButtonTemplate for tabs (nargiddley)
+- AceGUI-3.0: TabGroup: Tabs now span multiple lines when there are too many to fit in the width of the frame (nargiddley)
+- AceGUI-3.0: TreeGroup: Tree is now sizable by dragging, orig patch by yssaril (nargiddley)
+- AceGUI-3.0: Flow layout will now reduce widgets width to fit rather than leaving them sticking out the side of container widgets (nargiddley)
+- AceGUI-3.0: Dropdowns will no longer be left open in the background when the frame is clicked or other widgets are activated (nargiddley)
+- AceGUI-3.0: ACE-159: Rename Release to OnRelease and Acquire to OnAcquire for widgets. (nargiddley)
+- AceGUI-3.0: ACE-171: add IsVisible and IsShown methods to the widget metatable (nargiddley)
+- AceGUI-3.0: ACE-164: add tooltips to tree to show full text of childs that got clipped (ammo)
+- AceGUI-3.0: ACE-174: make buttons in AceGUI-3.0 locale independant (ammo)
+- AceGUI-3.0: ACE-166: fix treegroup visual bug (ammo)
+- AceGUI-3.0: ACE-184: make numeric entry for slider more intuitive (ammo)
+- AceConfigCmd-3.0: ACE-172 - ignore description in cmd (ammo)
+- AceConsole-3.0:  nolonger check for existance of slashcommands, overwrite where needed. Last one wins, this enables AddonLoader to X-LoadOn-Slash and override the slashcommand from AddonLoader slashcommand with an Ace3 one. (Ammo)
+
+Ace3 Beta - Revision 69509 (April 13th, 2008)
+---------------------------------------------
+- AceComm-3.0: turn off error messages when receiving invalid multi-part messages (its happening on login etc) (nevcairiel)
+- AceDBOptions-3.0: shorten info text at top to prevent scrollbars. (nevcairiel)
+- AceHook-3.0: ACE-162: fix unhooking of objects that were not actually hooked (nevcairiel)
+- AceDB-3.0: fire the DB callbacks after the namespaces changed their profile as well (nevcairiel)
+- AceDB-3.0: namespaces can now be individually reset using :ResetProfile() on the namespace directly (nevcairiel)
+- AceDB-3.0: added a optional argument to :ResetProfile to not populate the reset to all namespaces (so the main profile can reset individually without reseting all namespaces too)  (nevcairiel)
+
+Ace3 Beta - Revision 66329 (March 27th, 2008)
+---------------------------------------------
+- Overall 2.4 clean ups - removing 2.4 checks and work arounds (nevcairiel)
+- AceBucket-3.0: clear the timer reference when unregistering a bucket to prevent a error when unregistering a bucket that was never fired (nevcairiel)
+- AceAddon-3.0: Bugfix when enabling/disabling modules from the parents OnEnable after disabling / enabling the parent addon. (ammo)
+- AceGUI-3.0: Don't parent the BlizOptionsGroup widget to UIParent and Hide it by default. Fixes stray controls on the screen. (nargiddley)
+- AceConfigDialog-3.0: Config windows without a default size won't incorrectly get a default size from a previously open window. (nargiddley)
+- AceDBOptions-3.0: added zhCN and zhTW locale (nevcairiel)
+
+Ace3 Beta - Revision 65665 (March 25th, 2008)
+---------------------------------------------
+- AceGUI-3.0: ACE-139: Changed all Widgets to resemble the Blizzard 2.4 Options Style (nevcairiel)
+- AceGUI-3.0: Fixed "List"-Layout not reporting new width to "fill"-mode widgets (mikk)
+- AceGUI-3.0: added :SetColor to the Label widget (nevcairiel)
+- AceGUI-3.0: ACE-132: ColorPicker: added checkers texture for better alpha channel display, and fixed "white"-texture bug (nevcairiel,nargiddley,ammo)
+- AceConfig-3.0: ACE-113: Added uiName, uiType, handler, option, type to the info table (nevcairiel,nargiddley)
+- AceConfigDialog-3.0: ACE-139: Adjusted for 2.4 options panels (nevcairiel)
+- AceConfigDialog-3.0: Use "width" parameter for the description widget (if present) (nevcairiel)
+- AceConfigDialog-3.0: ACE-135: Add support for specifying a rowcount for multiline editboxes (nargiddley)
+- AceConfigDialog-3.0: :AddToBlizOptions will return the frame registered so you can use it in InterfaceOptionsFrame_OpenToFrame (nevcairiel)
+- AceConfigCmd-3.0: handle "hidden" in help-output (nevcairiel)
+- AceHook-3.0: fix unhooking of secure hooks (nevcairiel)
+- AceDBOptions-3.0: add optional argument to GetOptionsTable(db[, noDefaultProfiles]) - if set to true will not show the default profiles in the profile selection (nevcairiel)
+- AceDBOptions-3.0: added koKR locale (nevcairiel)
+- Ace3 Standalone: Removed the "Ace3" Category from the 2.4 options panel (nevcairiel)
+
+Ace3 Beta - Revision 64176 (March 10th, 2008)
+---------------------------------------------
+- AceGUI-3.0: Improve Alpha handling for the ColorPicker widget, ColorPicker widget closes the ColorPickerFrame before opening to prevent values getting carried over (nargiddley)
+- AceGUI-3.0: The Slider widget will only react to the mousewheel after it has been clicked (anywhere including the label) to prevent accidental changes to the value when trying to scroll the container it is in (nargiddley)
+- AceGUI-3.0: The TreeGroup widget is scrollable with the mousewheel (nargiddley)
+- AceGUI-3.0: ACE-154: Fix frame levels in more cases to prevent widgets ending up behind their containers (nargiddley)
+- AceConfigDialog: Color picker obeys hasAlpha on the color type (nargiddley)
+- AceConfigDialog-3.0: ACE-155: Make sure that the selected group is type='group' when checking if it exists (nargiddley)
+- AceDBOptions-3.0: added frFR locale (nevcairiel)
+
+Ace3 Beta - Revision 63886 (March 8th, 2008)
+---------------------------------------------
+- AceDBOptions-3.0: new library to provide a Ace3Options table to control the AceDB-3.0 profiles (nevcairiel)
+- AceDB-3.0: add "silent" option to DeleteProfile and CopyProfile when we deal with namespaces (nevcairiel)
+- AceDB-3.0: implement library upgrade path (nevcairiel)
+- AceDB-3.0: ACE-146: fix problem with non-table values overruling ['*']-type defaults (nevcairiel)
+- AceConsole-3.0: treat |T|t texture links similar to |H|h|h links. (ammo)
+- AceGUI-3.0: Use Blizzard Templates for the EditBox and DropDown widget (nevcairiel)
+- AceBucket-3.0: ACE-150: callback is now optional, if not supplied will use the eventname as method name (only possible if one event is supplied, and not a event table) (nevcairiel)
+- tests: adjust tests for AceGUI and AceConsole changes (nevcairiel)
+
+Ace3 Beta - Revision 63220 (Feb 29th, 2008)
+---------------------------------------------
+- AceTimer-3.0: CancelAllTimers() now cancels silent (elkano)
+- AceConfigDialog: Add :SetDefaultSize(appName, width, height), sets the size the dialog will open to. Does not effect already open windows.  (nargiddley)
+- AceConfigDialog: Fix typo in type check for range values (nargiddley)
+- AceGUI: ColorPicker widget will correctly fire OnValueChanged for the cancel event of the colorpicker popup.  Reset ColorPicker's color on Acquire.  (nargiddley)
+- AceGUI: Fix Spelling of Aquire -> Acquire for widgets, all custom widgets will need to be updated.  A warning will be printed for widgets not upgraded yet.  (nargiddley)
+- AceConfigCmd-3.0: add simple coloring to slashcommand output. (ammo)
+- AceConsole-3.0: add some color to :Print (ammo)
+- AceAddon-3.0: set error level on library embedding to point to the :NewAddon call (nevcairiel)
+
+Ace3 Beta - Revision 62182 (Feb 20th, 2008)
+---------------------------------------------
+- Ace3 StandAlone: Add a page to the Blizzard 2.4 Interface Options with icons to open dialogs for configs registered when installed standalone (nargiddley)
+- AceConfigDialog: type = 'description' now uses the fields image and imageCoords instead of icon and iconCoords, add imageWidth and imageHeight (nargiddley)
+- AceConfigDialog: Add :AddToBlizzardOptions(appName, name), this will add the specified config to the Blizzard Options pane new in 2.4.  This will only be available if running on the 2.4 PTR (nargiddley)
+- AceDB: fix GetProfiles() when setting the same profile twice (nevcairiel)
+- AceDB: bail out of :SetProfile early when trying to set to the same profile (nevcairiel)
+- AceDB: add nil checks to metatable handling (nevcairiel)
+- AceDB: clear tables that are empty after defaults removal (nevcairiel)
+- AceGUI: Fix a couple of layout bugs causing the width of groups to be wrong (nargiddley)
+- AceGUI: Add Icon widget (nargiddley)
+- AceGUI: Allow room for the border in the BlizOptionsGroup widget (nargiddley)
+- AceGUI: Button and Keybinding use UIPanelButtonTemplate2 (nargiddley)
+- AceConsole-3.0: Fix bug where no table for [self] was created when registering weak commands (ammo)
+- AceTimer-3.0: add missing :OnEmbedDisable (ammo)
+- AceAddon-3.0: added :GetName() that will always return the "real" name of a addon or module object without any prefixes (nevcairiel)
+
+Ace3 Beta - Revision 60697 (Feb 9th, 2008)
+---------------------------------------------
+- CallbackHandler-1.0: remove unnecessary table creation if a event is fired thats not registered (nevcairiel)
+- AceAddon-3.0: fixed a bug with recursive addon loading (nevcairiel)
+- AceGUI: Update TabGroup's tablist format, tabs are selected by value not index (nargiddley)
+- AceGUI: Add MultiLineEditBox widget (nargiddley, originally by bam)
+- AceGUI: Small fix to the flow layout preventing controls overlapping in some cases (nargiddley)
+- AceConfigDialog: Implement control and dialogControl for types 'input' and 'select' (nargiddley)
+- AceConfigDialog: Add support for multiline = true on type = 'input' (nargiddley)
+- AceConfigDialog: Fix an error when all groups are hidden in a group with childGroups = 'select' (nargiddley)
+- AceConfigDialog: type = 'description' will now show .icon as an image with its text (nargiddley)
+- AceConfigDialog: multiline inputs are no longer forced to width = "full" (nargiddley)
+- AceConfigDialog: bug fix when loading without AceConsole present (nevcairiel)
+
+Ace3 Beta - Revision 60545 (Feb 7th, 2008)
+---------------------------------------------
+- AceGUI: SetToplevel(true) for the Frame widget, multiple open windows should play nice together now (nargiddley)
+- AceGUI: Move Frames to the FULLSCREEN_DIALOG strata (nargiddley)
+- AceGUI: Dropdown, Editbox and Keybinding labels grey out when disabled (nargiddley)
+- AceGUI: Add OnClick callback to the TreeGroup widget (nargiddley)
+- AceConfigDialog: Confirm popups will be above the config window (nargiddley)
+
+Ace3 Beta - Revision 60163 (Feb 3rd, 2008)
+---------------------------------------------
+- Initial Beta release
\ No newline at end of file
diff --git a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
index 949db48..898168f 100644
--- a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
+++ b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
@@ -1,6 +1,6 @@
 --[[
 Name: LibSharedMedia-3.0
-Revision: $Revision: 74 $
+Revision: $Revision: 107 $
 Author: Elkano (elkano@gmx.de)
 Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
 Website: http://www.wowace.com/projects/libsharedmedia-3-0/
@@ -9,7 +9,7 @@ Dependencies: LibStub, CallbackHandler-1.0
 License: LGPL v2.1
 ]]

-local MAJOR, MINOR = "LibSharedMedia-3.0", 5000402 -- 5.0.4 v2 / increase manually on changes
+local MAJOR, MINOR = "LibSharedMedia-3.0", 6010003 -- Increase manually on changes
 local lib = LibStub:NewLibrary(MAJOR, MINOR)

 if not lib then return end
@@ -20,8 +20,6 @@ local pairs		= _G.pairs
 local type		= _G.type

 local band			= _G.bit.band
-
-local table_insert	= _G.table.insert
 local table_sort	= _G.table.sort

 local locale = GetLocale()
@@ -60,9 +58,13 @@ lib.MediaType.SOUND			= "sound"				-- sound files
 -- BACKGROUND
 if not lib.MediaTable.background then lib.MediaTable.background = {} end
 lib.MediaTable.background["None"]									= [[]]
+lib.MediaTable.background["Blizzard Collections Background"]		= [[Interface\Collections\CollectionsBackgroundTile]]
 lib.MediaTable.background["Blizzard Dialog Background"]				= [[Interface\DialogFrame\UI-DialogBox-Background]]
 lib.MediaTable.background["Blizzard Dialog Background Dark"]		= [[Interface\DialogFrame\UI-DialogBox-Background-Dark]]
 lib.MediaTable.background["Blizzard Dialog Background Gold"]		= [[Interface\DialogFrame\UI-DialogBox-Gold-Background]]
+lib.MediaTable.background["Blizzard Garrison Background"]			= [[Interface\Garrison\GarrisonUIBackground]]
+lib.MediaTable.background["Blizzard Garrison Background 2"]			= [[Interface\Garrison\GarrisonUIBackground2]]
+lib.MediaTable.background["Blizzard Garrison Background 3"]			= [[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]]
 lib.MediaTable.background["Blizzard Low Health"]					= [[Interface\FullScreenTextures\LowHealth]]
 lib.MediaTable.background["Blizzard Marble"]						= [[Interface\FrameGeneral\UI-Background-Marble]]
 lib.MediaTable.background["Blizzard Out of Control"]				= [[Interface\FullScreenTextures\OutOfControl]]
@@ -89,6 +91,10 @@ lib.DefaultMedia.border = "None"
 if not lib.MediaTable.font then lib.MediaTable.font = {} end
 local SML_MT_font = lib.MediaTable.font
 --[[
+All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4
+Fonts were checked using langcover.pl from DejaVu fonts (http://sourceforge.net/projects/dejavu/) and FontForge (http://fontforge.org/)
+latin means check for: de, en, es, fr, it, pt
+
 file				name							latin	koKR	ruRU	zhCN	zhTW
 2002.ttf			2002							X		X		X		-		-
 2002B.ttf			2002 Bold						X		X		X		-		-
@@ -101,7 +107,7 @@ bHEI01B.ttf			AR Heiti2 Bold B5				-		-		-		-		X
 bKAI00M.ttf			AR Kaiti Medium B5				-		-		-		-		X
 bLEI00D.ttf			AR Leisu Demi B5				-		-		-		-		X
 FRIZQT__.TTF		Friz Quadrata TT				X		-		-		-		-
-FRIZQT___CYR.TTF	FrizQuadrataCTT					-		-		X		-		-
+FRIZQT___CYR.TTF	FrizQuadrataCTT					x		-		X		-		-
 K_Damage.TTF		YDIWingsM						-		X		X		-		-
 K_Pagetext.TTF		MoK								X		X		X		-		-
 MORPHEUS.TTF		Morpheus						X		-		-		-		-
@@ -109,6 +115,9 @@ MORPHEUS_CYR.TTF	Morpheus						X		-		X		-		-
 NIM_____.ttf		Nimrod MT						X		-		X		-		-
 SKURRI.TTF			Skurri							X		-		-		-		-
 SKURRI_CYR.TTF		Skurri							X		-		X		-		-
+
+WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö
+Due to this, we cannot use it as a replacement for FRIZQT__.TTF
 ]]

 if locale == "koKR" then
@@ -186,7 +195,7 @@ lib.DefaultMedia.statusbar = "Blizzard"

 -- SOUND
 if not lib.MediaTable.sound then lib.MediaTable.sound = {} end
-lib.MediaTable.sound["None"]								= [[Interface\Quiet.ogg]]	-- Relies on the fact that PlaySound[File] doesn't error on non-existing input.
+lib.MediaTable.sound["None"]		= C_RaidLocks and 1 or [[Interface\Quiet.ogg]] -- Relies on the fact that PlaySound[File] doesn't error on non-existing input.
 lib.DefaultMedia.sound = "None"

 local function rebuildMediaList(mediatype)
@@ -211,7 +220,16 @@ function lib:Register(mediatype, key, data, langmask)
 		error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
 	end
 	mediatype = mediatype:lower()
-	if mediatype == lib.MediaType.FONT  and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end
+	if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end
+	if mediatype == lib.MediaType.SOUND and type(data) == "string" then
+		local path = data:lower()
+		-- Only ogg and mp3 are valid sounds.
+
+		if not path:find(".ogg", nil, true) and not path:find(".mp3", nil, true) then
+			return false
+		end
+
+	end
 	if not mediaTable[mediatype] then mediaTable[mediatype] = {} end
 	local mtable = mediaTable[mediatype]
 	if mtable[key] then return false end
diff --git a/Libs/LibSharedMedia-3.0/lib.xml b/Libs/LibSharedMedia-3.0/lib.xml
index 34aa874..7f2fd53 100644
--- a/Libs/LibSharedMedia-3.0/lib.xml
+++ b/Libs/LibSharedMedia-3.0/lib.xml
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="LibSharedMedia-3.0.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Libs/changelog-Ace3-r1202.txt b/Libs/changelog-Ace3-r1202.txt
new file mode 100644
index 0000000..69139b6
--- /dev/null
+++ b/Libs/changelog-Ace3-r1202.txt
@@ -0,0 +1,408 @@
+Ace3 Release - Revision r1200 (January 24th, 2019)
+--------------------------------------------------
+- Cleanup for WoW 8.0 improvements
+- AceGUI-3.0: Worked around various quirks in the WoW 8.0/8.1 API
+- AceGUI-3.0: ColorPicker: Store references to the background/checkers textures (Ticket #473)
+- AceConfigDialog-3.0: Allow custom controls for almost all option types (Ticket #475)
+
+Ace3 Release - Revision r1182 (July 17th, 2018)
+-----------------------------------------------
+- AceComm-3.0: Support numeric targets for custom channels (Ticket #419)
+- AceComm-3.0/ChatThrottleLib: Updated for WoW 8.0 API changes
+- AceConfig-3.0: Allow number values for the "width" parameter, which acts as a multiplier of the default width
+- AceConfigDialog-3.0: Enable iconCoords for the main level of a tree group (Ticket #417)
+- AceGUI-3.0: Implement a Table Layout (#442)
+- AceGUI-3.0: EditBox: Only try to handle dragging if a valid object is being dragged into the text box
+- AceGUI-3.0: Various fixes and work-arounds for WoW 8.0 changes
+
+Ace3 Release - Revision r1166 (August 29th, 2017)
+-------------------------------------------------
+- Updated any use of PlaySound to the new numeric constants (Fix for WoW 7.3)
+- AceConfigDialog-3.0: implement fallback validation feedback in a StaticPopup (Ticket #2)
+
+Ace3 Release - Revision r1158 (March 28th, 2017)
+------------------------------------------------
+- AceGUI-3.0: Fire OnShow events from Frame and Windows containers (Ticket #396)
+- AceGUI-3.0: Add SetJustifyV/H API to the Label/InteractiveLabel widgets (Ticket #397)
+
+Ace3 Release - Revision r1151 (July 18th, 2016)
+-----------------------------------------------
+- AceConfig-3.0: Allow specifying images using the numeric fileID (Ticket #389)
+- AceGUI-3.0: Use SetColorTexture in WoW 7.0
+- AceGUI-3.0: Expose the HighlightText API for EditBox and MultiLineEditBox Widgets (Ticket #378)
+- AceGUI-3.0: Keybinding: Support MouseWheel Up/Down bindings (Ticket #372)
+- AceGUI-3.0: TreeGroup: Refresh the tree in an OnUpdate once after Acquire, not only after creation (Fixes missing tree in WoW 7.0)
+- AceSerializer-3.0: Create consistent tokens for infinity, independent of the clients platform
+
+Ace3 Release - Revision r1134 (June 23rd, 2015)
+-----------------------------------------------
+- AceGUI-3.0: TreeGroup: Prevent Word Wrap in tree elements
+
+Ace3 Release - Revision r1128 (February 24th, 2015)
+---------------------------------------------------
+- AceGUI-3.0: Fixed an error in GameTooltip handling causing wrong formatting in some cases
+
+Ace3 Release - Revision r1122 (October 14th, 2014)
+--------------------------------------------------
+- AceDB-3.0: Now using the GetCurrentRegion() API to determine region-based profile keys (fix for WoW 6.0)
+- AceComm-3.0: Update ChatThrottleLib to v23
+- AceConfigDialog-3.0: Show a more meaningful title on Blizzard Options Groups (Ticket #353)
+- AceGUI-3.0: ColorPicker: Frame Level is automatically increased to ensure the color picker frame is above the option panel
+- AceGUI-3.0: DropDown: Properly disable all clickable areas when the dropdown is disabled (Ticket #360)
+- AceHook-3.0: Always use HookScript when hooking scripts in a secure fashion (Ticket #338)
+- AceTimer-3.0: New timer implementation based on C_Timer.After
+
+Ace3 Release - Revision r1109 (February 19th, 2014)
+---------------------------------------------------
+- AceComm-3.0: Ambiguate addon comm messages to restore behavior to be identical to pre-5.4.7
+- AceConfigRegistry-3.0: Added an option to skip options table validation on registering
+
+Ace3 Release - Revision r1104 (October 31st, 2013)
+--------------------------------------------------
+- AceGUI-3.0: Flow Layout: Added a safeguard to prevent an infinite loop in the layout engine
+- AceGUI-3.0: DropDown: Adjust its style slightly to closer resemble the Blizzard DropDown Widget
+- AceGUI-3.0: DropDown: API enhancements to specify the width of the pullout and be notified when its opened
+
+Ace3 Release - Revision r1098 (September 13th, 2013)
+----------------------------------------------------
+- AceDB-3.0: Switch characters to the default profile if their active profile is deleted (Ticket #324)
+- AceConfigDialog-3.0: Try to prevent static popup taint (Ticket #322)
+- AceGUI-3.0: Button: Add a new "Auto Width" option (Ticket #310)
+- AceGUI-3.0: DropDown: Make the entire DropDown widget clickable (Ticket #339)
+- AceGUI-3.0: EditBox: Allow dragging macros to the editbox (which will then contain the macros name) (Ticket #337)
+- AceGUI-3.0: Slider: Add a workaround for the broken slider steps in WoW 5.4 (Ticket #346)
+- AceGUI-3.0: TreeGroup: Fix an issue introduced by 5.4 broken scrollbars (Ticket #345)
+- AceHook-3.0: Allow hooking of AnimationGroup scripts (Ticket #314)
+
+Ace3 Release - Revision r1086 (May 21st, 2013)
+----------------------------------------------
+- AceAddon-3.0: Improved behavior when loading modules during game startup, ensures proper loading order
+
+Ace3 Release - Revision r1083 (March 4th, 2013)
+-----------------------------------------------
+- AceTimer-3.0: Fixed an issue that caused the parameter list passed to the callback to be cut off at nil values
+- AceGUI-3.0: InlineGroup: The title attribute is properly reset for recycled objects
+
+Ace3 Release - Revision r1078 (February 10th, 2013)
+---------------------------------------------------
+- AceTimer-3.0: Re-write based on AnimationTimers
+- AceHook-3.0: Improved checks/error messages when trying to hook a script on a "nil" frame
+- AceDBOptions-3.0: Added Italian locale
+- AceGUI-3.0: BlizOptionsGroup: Fixed the "default" button callback
+- AceGUI-3.0: Colorpicker: The colorpicker is now clamped to the screen
+
+Ace3 Release - Revision r1061 (August 27th, 2012)
+-------------------------------------------------
+- AceConfigDialog-3.0: Try to avoid potential taints in static popup dialogs
+- AceConfigDialog-3.0: Sort multiselects with "radio" style
+- AceGUI-3.0: Support for WoW 5.0
+- AceGUI-3.0: MultiLineEditBox: Support shift-click'ing items/spells/etc. into the editbox
+- AceGUI-3.0: Label: Fix text alignment (Ticket #301)
+- AceGUI-3.0: Checkbox: Description text on a disable checkbox should look disabled (Ticket #304)
+- AceGUI-3.0: Keybinding: Ensure the Keybinding popup is on the top level (Ticket #305)
+
+Ace3 Release - Revision r1041 (November 29th, 2011)
+---------------------------------------------------
+- AceDB-3.0: Added locale and factionrealmregion profile keys
+- AceSerializer-3.0: Removed support for NaN, as WoW 4.3 does no longer allow it.
+- AceGUI-3.0: Frame: Add :EnableResize (Ticket #214)
+
+Ace3 Release - Revision r1032 (June 29th, 2011)
+-----------------------------------------------
+- AceTab-3.0: Improvements to Match handling (Ticket #255 and #256)
+- AceGUI-3.0: DropDown layout fix with hidden labels (Ticket #234)
+
+Ace3 Release - Revision r1025 (April 27th, 2011)
+------------------------------------------------
+- AceComm-3.0: Updated for 4.1 changes - now handles RegisterAddonMessagePrefix internally for you.
+- AceGUI-3.0: TabGroup: Fixed width of tabs in 4.1(Ticket #243)
+
+Ace3 Release - Revision r1009 (February 9th, 2011)
+--------------------------------------------------
+- AceLocale-3.0: Fix erronous assumption that the default locale is always the first to be registered for the :NewLocale() "silent" flag. The flag must now be set on the FIRST locale to be registered.
+- AceLocale-3.0: The :NewLocale() "silent" flag may now be set to the string "raw", meaning nils are returned for unknown translations.
+- AceGUI-3.0: Fix the disabled state of Icon widgets
+- AceGUI-3.0: The header of the Frame widget now dynamically changes size to fit the text (Ticket #171)
+- AceGUI-3.0: Its now possible to define a custom order the elements in a dropdown widget
+- AceGUI-3.0: Improved widget focus behaviour across the board (Ticket #192, #193)
+- AceGUI-3.0: Fixed a bug that made it impossible to block the tree widget from being user resizable (Ticket #163)
+- AceGUI-3.0: Fixed a bug that caused TreeGroups to become unresponsive under certain conditions (Ticket #189, #202)
+- AceGUI-3.0: Enhanced the DropDown widget to allow it to be reused more easily.
+- AceConfigDialog-3.0: Select Groups now have the proper order in the dropdown (Ticket #184)
+- AceConfigDialog-3.0: Implemented "radio" style select boxes (Ticket #149)
+
+Ace3 Release - Revision r981 (October 27th, 2010)
+-------------------------------------------------
+- AceAddon-3.0: Fixed a library upgrading issue
+- AceAddon-3.0: Modules are now enabled in loading order
+- AceGUI-3.0: Keybinding: The widget will no longer steal keybindings even when inactive (Ticket #169)
+- AceGUI-3.0: EditBox: Fixed spell drag'n'drop
+
+
+Ace3 Release - Revision r971 (October 12th, 2010)
+-------------------------------------------------
+- Small fixes and adjustments for the 4.0 Content Patch.
+- AceGUI-3.0: ScrollFrame: Allow for a small margin of error when determining if the scroll bar should be shown.
+- AceGUI-3.0: Added new widget APIs: GetText for EditBox and DisableButton for MultiLineEditBox
+
+Ace3 Release - Revision r960 (July 20th, 2010)
+----------------------------------------------
+- AceGUI-3.0: Label: Reset Image Size and TexCoords on Acquire (Ticket #110)
+- AceGUI-3.0: CheckBox: Re-apply the disabled state after setting a value, so the visuals are correct in either case. (Ticket #107)
+- AceGUI-3.0: Icon: Fix the vertical size. It'll now properly scale with the image size, and not be fixed to about 110px. (Ticket #104)
+- AceGUI-3.0: External Containers (Frame, Window) should always start in a visible state. (Ticket #121)
+- AceGUI-3.0: Added Blizzard sounds to widgets (Ticket #120)
+- AceGUI-3.0: CheckBox: check for self.desc:GetText() being nil as well as "" to prevent setting the wrong height on the checkbox causing bouncing checkboxes.
+- AceGUI-3.0: Rewrite of the MultiLineEditBox (Ticket #68)
+- AceGUI-3.0: CheckBox: Fix alignment of the text in OnMouseDown when an image is set. (Ticket #142)
+- AceGUI-3.0: Add SetMaxLetters APIs to EB and MLEB (Ticket #135)
+- AceGUI-3.0: Frame: Add events for OnEnter/OnLeave of the statusbar (Ticket #139)
+- AceGUI-3.0: Major cleanups and refactoring in nearly all widgets and containers.
+- AceConfigDialog-3.0: Always obey the min/max values on range-type widgets (Ticket #114)
+- AceConfigDialog-3.0: Pass iconCoords set on groups in the options table to the tree widget (Ticket #111)
+- AceConfigDialog-3.0: Implement "softMin" and "softMax", allowing for a UI-specific minimum/maximum for range controls, while allowing manual input of values in the old min/max range. (Ticket #123)
+- AceConfigDialog-3.0: Don't close frames in CloseAll that are being opened after the CloseAll event was dispatched. (Ticket #132).
+- AceSerializer-3.0: Fix encoding & decoding of \030. (Ticket #115)
+- AceDB-3.0: Remove empty sections on logout, keeping the SV clean of more useless informations.
+- AceDBOptions-3.0.lua: Fix a string typo (Ticket #141)
+
+Ace3 Release - Revision r907 (December 16th, 2009)
+---------------------------------------------------
+- AceGUI-3.0: Frame: Properly save the width in the status table.
+- AceConfigCmd-3.0: Properly handle help output of inline groups with a different handler. (Ticket #101)
+- AceConfigDialog-3.0: Don't bail out and error when a dialogControl was invalid, instead show the error and fallback to the default control for that type.
+- AceConfigDialog-3.0: Fix a hickup with the OnUpdate script not getting upgraded properly in some situations.
+
+Ace3 Release - Revision r900 (December 8th, 2009)
+--------------------------------------------------
+- AceGUI-3.0: Alot of visual fixes regarding margins and general widget styles.
+- AceGUI-3.0: Ability to accept links for EditBox Widget (Ticket #21)
+- AceGUI-3.0: ScrollFrame: Hide the scrollbar when there is no overflowing content, and allow the Layout functions to use that space for widgets.
+- AceGUI-3.0: DropDown: Added a GetValue() API to the Widget (Ticket #69)
+- AceGUI-3.0: Button: Pass the arguments of the OnClick handler to the OnClick callback (Ticket #57)
+- AceGUI-3.0: add a Window container, basically a plain window with close button
+- AceGUI-3.0: Add support for inline descriptions to the checkbox widget.
+- AceGUI-3.0: Added an API to the Window container to disable the user-resizing of the same. (Ticket #80)
+- AceGUI-3.0: TreeGroup: Allow iconCoords to be passed for the tree elements. (Ticket #59)
+- AceGUI-3.0: Slider: Add a more visible backdrop/border around the manual input area (Ticket #98, #46)
+- AceGUI-3.0: Allow displaying a image in front of the checkbox label. (Ticket #82)
+- AceConfig-3.0: Added an experimental "descStyle" member to all option table nodes that allows you to control the way the description is presented.
+                 Supported values are "tooltip" for the old behaviour, and "inline" for a inline display of the description, pending support in AceGUI-3.0 widgets.
+- AceConfigCmd-3.0: Properly parse functions and methods supplied for the "hidden" option table member. (Ticket #96)
+- AceConfigDialog-3.0: Fix the unpacking of the basepath arguments when internally calling :Open (Ticket #90)
+- AceConfigDialog-3.0: Properly refresh BlizOptions Windows which are registered with a path on NotifyChange. (Ticket #93)
+- AceConfigDialog-3.0: Allow image/imageCoords on toogle elements (Note that the width/height of the image on the toggle cannot be changed) (Ticket #82)
+- AceConfigDialog-3.0: Pass the groups "name" tag to DropDownGroups as the title. (Ticket #79)
+- AceDB-3.0: Remove the metatable from the DB before removing defaults, so we don't accidentally invoke it in the process. (Ticket #66)
+- AceDB-3.0: Don't save the profileKeys for namespaces, since we use the profile of the parent DB anyway. This will cut down on SV complexity when using alot of namespaces.
+- AceDB-3.0: Don't fire the OnProfileReset callback when copying a profile.
+- AceDBOptions-3.0: Show the current profile on the dialog. (Ticket #56)
+- AceComm-3.0: Add callbacks for message chunks going out the wire (via CTL). Useful for displaying progress for very large messages.
+- AceConsole-3.0: Add :Printf() so you don't have to do Print(format())
+
+Ace3 Beta - Revision 820 (August 7th, 2009)
+--------------------------------------------
+- AceComm-3.0: Updated ChatThrottleLib to v21
+- AceGUI-3.0: Fixed a glitch in the TabGroup code that caused tabs to be unresponsive under rare conditions. (Ticket #38)
+- AceGUI-3.0: Consistent "disabled" behaviour of all widgets. (Ticket #47)
+- AceGUI-3.0: Changed the way widgets are handled on release to avoid a crash in the game client. (Ticket #49)
+- AceGUI-3.0: Fixed a glitch in the button graphics. (Ticket #58)
+- AceGUI-3.0: Localized the "Close" Text on the Frame widget.
+
+Ace3 Beta - Revision 803 (April 14th, 2009)
+--------------------------------------------
+- AceConfig-3.0: Allow spaces in the keys of config tables. Spaces will be changed on the fly to underscores in AceConfigCmd-3.0 - there is no collision check in place, yet.
+- AceConfig-3.0: Support a "fontSize" attribute to the description type. Possible values are "small" (default), "medium" and "large".
+- AceConfigDialog-3.0: Fixed an error that would occur when calling InterfaceOptionsFrame_OpenToCategory from within an event handler in a Blizzard Options integrated frame. (Ticket #33)
+- AceConfigDialog-3.0: The "execute" type does now recognize the "image" attributes, and will display a clickable icon instead of the button when an image is supplied. (Ticket #35)
+- AceConfigDialog-3.0: Pass icons defined in the option table to the TreeGroup widget (Ticket #20)
+- AceConfigDialog-3.0: Fixed a bug that caused an empty group widget to be drawn if all groups were hidden.
+- AceConfigCmd-3.0: Improved the behaviour of select and multiselect elements. (Ticket #26)
+- AceDB-3.0: Add a GetNamespace function to the DB Objects which returns an existing namespace from the DB object.
+- AceGUI-3.0 Slider Widget: Properly show percentage values as min/max if isPercent is true. (Ticket #32)
+- AceGUI-3.0: Fixed an error in the TreeGroup Widget that caused execution to stop if no name was provided.
+- AceGUI-3.0: Fixed the behaviour of the MultiLineEditbox Widget (Accept button not clickable). (Ticket #28)
+- AceGUI-3.0: TabGroup: Set a maximum width for tabs based on the size of the widget. (Ticket #34)
+- AceGUI-3.0: Added a new InteractiveLabel with OnEnter/OnLeave/OnClick callbacks and a highlight texture
+- AceGUI-3.0: Add SetFont and SetFontObject functions to the Label widget (and the new InteractiveLabel)
+- AceGUI-3.0: Support icons in the TreeGroup display. (Ticket #20)
+- AceGUI-3.0: Added a new :SetRelativeWidth Widget-API that allows you to set the width of widgets relative to their container.
+- AceGUI-3.0: Alot of fixes, tweaks and consistency changes.
+
+Ace3 Beta - Revision 741 (Feb 15th, 2009)
+--------------------------------------------
+- AceDBOptions-3.0: Disable the "Copy From" and "Delete" dropdowns if there are no profiles to choose from. (Ticket #19)
+- AceGUI-3.0: Improve TabGroup visual style - only stretch them to the full width if they would use more then 75% of the exisiting space.
+- AceGUI-3.0: Added a third optional argument to <container>:AddChild() to specify the position for the new widget. (Ticket #22)
+- AceConfigCmd-3.0: Improve help output when viewing groups.
+- AceConfigDialog-3.0: Refresh the Options Panel after a confirmation is canceled to reset the value to its previous value. (Ticket #23)
+- AceDB-3.0: Fix a data inconsistency when using false as a table key. (Ticket #25)
+
+Ace3 Beta - Revision 722 (Jan 4th, 2009)
+--------------------------------------------
+- AceHook-3.0: Fix :SecureHookScript to not fail on previously empty scripts since frame:HookScript does nothing at all in that case. (Ticket #16)
+- AceLocale-3.0: Implement 'silent' option for :NewLocale to disable the warnings on unknown entrys (Ticket #18)
+- AceTimer-3.0: Implement :TimeLeft(handle) function (Ticket #10)
+- AceGUI-3.0: Fix TabGroup tab resizing to be consistent
+- AceGUI-3.0: Fixed EditBox alignment when the label is disabled (Ticket #13)
+- AceDB-3.0: Implement OnProfileShutdown callback (Ticket #7)
+- AceDBOptions-3.0: Updated esES and ruRU locale
+
+Ace3 Beta - Revision 706 (Oct 18th, 2008)
+--------------------------------------------
+- First Beta release after WoWAce move
+- Removed WoW 2.4.x compat layer
+- AceGUI-3.0: Fix disabling of the Multiline Editbox
+- AceGUI-3.0: Improvements to the Keybinding Widget
+
+Ace3 Beta - Revision 81437 (Sept 6th, 2008)
+--------------------------------------------
+- AceConfigDialog-3.0: the confirm callback will now receive the new value that is being set (same signature as the validate callback)
+- AceConfigDialog-3.0: :Close and :CloseAll are now safe to call from within callbacks.
+- AceGUI-3.0: Added new methods to the widget base table, see ACE-205 for full reference
+- AceGUI-3.0: Various fixes to Widgets and recycling process
+- Now compatible with WoW 3.0 (compat layer is to be removed upon 3.0 release)
+
+
+Ace3 Beta - Revision 76325 (June 9th, 2008)
+--------------------------------------------
+- AceGUI-3.0: Finish Multiselect support for the Dropdown widget (nargiddley)
+- AceGUI-3.0: Re-write TabGroup layouting (nargiddley)
+- AceGUI-3.0: TreeGroup: Add :EnableButtonTooltips(enable) to make the default tooltips on the tree optional, enabled by default. (nargiddley)
+- AceGUI-3.0: TabGroup: Add OnTabEnter and OnTabLeave Callbacks  (nargiddley)
+- AceConfigDialog-3.0: Add :SelectGroup(appName, ...) - Selects the group given by the path specified then refreshes open windows. (nargiddley)
+- AceConfigDialog-3.0: :Open now accepts an optional path, when given will open the window with only the given group and its children visible (nargiddley)
+- AceConfigDialog-3.0: :AddToBlizOptions now accepts an optional path, this will add the config page to display the specified group and its children only. (nargiddley)
+- AceConfigDialog-3.0: ACE-189: allow multiselect to be shown as a dropdown by setting dialogControl = "Dropdown" (nargiddley)
+- AceConfigDialog-3.0: Add Custom tooltips to the TreeGroup and TabGroup, shows both name and desc for the group. (nargiddley)
+- AceConfigCmd-3.0: ACE-195: Remove unneeded references to .confirm, will no longer error when .confirm is a boolean (nargiddley)
+- AceAddon-3.0: Allow for an optional first argument to NewAddon to be a table to be used as the base for the addon. (ammo)
+
+Ace3 Beta - Revision 74633 (May 19th, 2008)
+--------------------------------------------
+- AceTimer-3.0: ACE-173: don't error on nil handle for CancelTimer(), just bail out early. (ammo)
+- AceGUI-3.0: ACE-161, ACE-180, ACE-181: New and improved DropDown widget (originally coded by Borlox) (nargiddley,nevcairiel)
+- AceGUI-3.0: AceGUI will call OnWidthSet and OnHeightSet as frames resize (nargiddley)
+- AceGUI-3.0: TabGroup: Use OptionsFrameTabButtonTemplate for tabs (nargiddley)
+- AceGUI-3.0: TabGroup: Tabs now span multiple lines when there are too many to fit in the width of the frame (nargiddley)
+- AceGUI-3.0: TreeGroup: Tree is now sizable by dragging, orig patch by yssaril (nargiddley)
+- AceGUI-3.0: Flow layout will now reduce widgets width to fit rather than leaving them sticking out the side of container widgets (nargiddley)
+- AceGUI-3.0: Dropdowns will no longer be left open in the background when the frame is clicked or other widgets are activated (nargiddley)
+- AceGUI-3.0: ACE-159: Rename Release to OnRelease and Acquire to OnAcquire for widgets. (nargiddley)
+- AceGUI-3.0: ACE-171: add IsVisible and IsShown methods to the widget metatable (nargiddley)
+- AceGUI-3.0: ACE-164: add tooltips to tree to show full text of childs that got clipped (ammo)
+- AceGUI-3.0: ACE-174: make buttons in AceGUI-3.0 locale independant (ammo)
+- AceGUI-3.0: ACE-166: fix treegroup visual bug (ammo)
+- AceGUI-3.0: ACE-184: make numeric entry for slider more intuitive (ammo)
+- AceConfigCmd-3.0: ACE-172 - ignore description in cmd (ammo)
+- AceConsole-3.0:  nolonger check for existance of slashcommands, overwrite where needed. Last one wins, this enables AddonLoader to X-LoadOn-Slash and override the slashcommand from AddonLoader slashcommand with an Ace3 one. (Ammo)
+
+Ace3 Beta - Revision 69509 (April 13th, 2008)
+---------------------------------------------
+- AceComm-3.0: turn off error messages when receiving invalid multi-part messages (its happening on login etc) (nevcairiel)
+- AceDBOptions-3.0: shorten info text at top to prevent scrollbars. (nevcairiel)
+- AceHook-3.0: ACE-162: fix unhooking of objects that were not actually hooked (nevcairiel)
+- AceDB-3.0: fire the DB callbacks after the namespaces changed their profile as well (nevcairiel)
+- AceDB-3.0: namespaces can now be individually reset using :ResetProfile() on the namespace directly (nevcairiel)
+- AceDB-3.0: added a optional argument to :ResetProfile to not populate the reset to all namespaces (so the main profile can reset individually without reseting all namespaces too)  (nevcairiel)
+
+Ace3 Beta - Revision 66329 (March 27th, 2008)
+---------------------------------------------
+- Overall 2.4 clean ups - removing 2.4 checks and work arounds (nevcairiel)
+- AceBucket-3.0: clear the timer reference when unregistering a bucket to prevent a error when unregistering a bucket that was never fired (nevcairiel)
+- AceAddon-3.0: Bugfix when enabling/disabling modules from the parents OnEnable after disabling / enabling the parent addon. (ammo)
+- AceGUI-3.0: Don't parent the BlizOptionsGroup widget to UIParent and Hide it by default. Fixes stray controls on the screen. (nargiddley)
+- AceConfigDialog-3.0: Config windows without a default size won't incorrectly get a default size from a previously open window. (nargiddley)
+- AceDBOptions-3.0: added zhCN and zhTW locale (nevcairiel)
+
+Ace3 Beta - Revision 65665 (March 25th, 2008)
+---------------------------------------------
+- AceGUI-3.0: ACE-139: Changed all Widgets to resemble the Blizzard 2.4 Options Style (nevcairiel)
+- AceGUI-3.0: Fixed "List"-Layout not reporting new width to "fill"-mode widgets (mikk)
+- AceGUI-3.0: added :SetColor to the Label widget (nevcairiel)
+- AceGUI-3.0: ACE-132: ColorPicker: added checkers texture for better alpha channel display, and fixed "white"-texture bug (nevcairiel,nargiddley,ammo)
+- AceConfig-3.0: ACE-113: Added uiName, uiType, handler, option, type to the info table (nevcairiel,nargiddley)
+- AceConfigDialog-3.0: ACE-139: Adjusted for 2.4 options panels (nevcairiel)
+- AceConfigDialog-3.0: Use "width" parameter for the description widget (if present) (nevcairiel)
+- AceConfigDialog-3.0: ACE-135: Add support for specifying a rowcount for multiline editboxes (nargiddley)
+- AceConfigDialog-3.0: :AddToBlizOptions will return the frame registered so you can use it in InterfaceOptionsFrame_OpenToFrame (nevcairiel)
+- AceConfigCmd-3.0: handle "hidden" in help-output (nevcairiel)
+- AceHook-3.0: fix unhooking of secure hooks (nevcairiel)
+- AceDBOptions-3.0: add optional argument to GetOptionsTable(db[, noDefaultProfiles]) - if set to true will not show the default profiles in the profile selection (nevcairiel)
+- AceDBOptions-3.0: added koKR locale (nevcairiel)
+- Ace3 Standalone: Removed the "Ace3" Category from the 2.4 options panel (nevcairiel)
+
+Ace3 Beta - Revision 64176 (March 10th, 2008)
+---------------------------------------------
+- AceGUI-3.0: Improve Alpha handling for the ColorPicker widget, ColorPicker widget closes the ColorPickerFrame before opening to prevent values getting carried over (nargiddley)
+- AceGUI-3.0: The Slider widget will only react to the mousewheel after it has been clicked (anywhere including the label) to prevent accidental changes to the value when trying to scroll the container it is in (nargiddley)
+- AceGUI-3.0: The TreeGroup widget is scrollable with the mousewheel (nargiddley)
+- AceGUI-3.0: ACE-154: Fix frame levels in more cases to prevent widgets ending up behind their containers (nargiddley)
+- AceConfigDialog: Color picker obeys hasAlpha on the color type (nargiddley)
+- AceConfigDialog-3.0: ACE-155: Make sure that the selected group is type='group' when checking if it exists (nargiddley)
+- AceDBOptions-3.0: added frFR locale (nevcairiel)
+
+Ace3 Beta - Revision 63886 (March 8th, 2008)
+---------------------------------------------
+- AceDBOptions-3.0: new library to provide a Ace3Options table to control the AceDB-3.0 profiles (nevcairiel)
+- AceDB-3.0: add "silent" option to DeleteProfile and CopyProfile when we deal with namespaces (nevcairiel)
+- AceDB-3.0: implement library upgrade path (nevcairiel)
+- AceDB-3.0: ACE-146: fix problem with non-table values overruling ['*']-type defaults (nevcairiel)
+- AceConsole-3.0: treat |T|t texture links similar to |H|h|h links. (ammo)
+- AceGUI-3.0: Use Blizzard Templates for the EditBox and DropDown widget (nevcairiel)
+- AceBucket-3.0: ACE-150: callback is now optional, if not supplied will use the eventname as method name (only possible if one event is supplied, and not a event table) (nevcairiel)
+- tests: adjust tests for AceGUI and AceConsole changes (nevcairiel)
+
+Ace3 Beta - Revision 63220 (Feb 29th, 2008)
+---------------------------------------------
+- AceTimer-3.0: CancelAllTimers() now cancels silent (elkano)
+- AceConfigDialog: Add :SetDefaultSize(appName, width, height), sets the size the dialog will open to. Does not effect already open windows.  (nargiddley)
+- AceConfigDialog: Fix typo in type check for range values (nargiddley)
+- AceGUI: ColorPicker widget will correctly fire OnValueChanged for the cancel event of the colorpicker popup.  Reset ColorPicker's color on Acquire.  (nargiddley)
+- AceGUI: Fix Spelling of Aquire -> Acquire for widgets, all custom widgets will need to be updated.  A warning will be printed for widgets not upgraded yet.  (nargiddley)
+- AceConfigCmd-3.0: add simple coloring to slashcommand output. (ammo)
+- AceConsole-3.0: add some color to :Print (ammo)
+- AceAddon-3.0: set error level on library embedding to point to the :NewAddon call (nevcairiel)
+
+Ace3 Beta - Revision 62182 (Feb 20th, 2008)
+---------------------------------------------
+- Ace3 StandAlone: Add a page to the Blizzard 2.4 Interface Options with icons to open dialogs for configs registered when installed standalone (nargiddley)
+- AceConfigDialog: type = 'description' now uses the fields image and imageCoords instead of icon and iconCoords, add imageWidth and imageHeight (nargiddley)
+- AceConfigDialog: Add :AddToBlizzardOptions(appName, name), this will add the specified config to the Blizzard Options pane new in 2.4.  This will only be available if running on the 2.4 PTR (nargiddley)
+- AceDB: fix GetProfiles() when setting the same profile twice (nevcairiel)
+- AceDB: bail out of :SetProfile early when trying to set to the same profile (nevcairiel)
+- AceDB: add nil checks to metatable handling (nevcairiel)
+- AceDB: clear tables that are empty after defaults removal (nevcairiel)
+- AceGUI: Fix a couple of layout bugs causing the width of groups to be wrong (nargiddley)
+- AceGUI: Add Icon widget (nargiddley)
+- AceGUI: Allow room for the border in the BlizOptionsGroup widget (nargiddley)
+- AceGUI: Button and Keybinding use UIPanelButtonTemplate2 (nargiddley)
+- AceConsole-3.0: Fix bug where no table for [self] was created when registering weak commands (ammo)
+- AceTimer-3.0: add missing :OnEmbedDisable (ammo)
+- AceAddon-3.0: added :GetName() that will always return the "real" name of a addon or module object without any prefixes (nevcairiel)
+
+Ace3 Beta - Revision 60697 (Feb 9th, 2008)
+---------------------------------------------
+- CallbackHandler-1.0: remove unnecessary table creation if a event is fired thats not registered (nevcairiel)
+- AceAddon-3.0: fixed a bug with recursive addon loading (nevcairiel)
+- AceGUI: Update TabGroup's tablist format, tabs are selected by value not index (nargiddley)
+- AceGUI: Add MultiLineEditBox widget (nargiddley, originally by bam)
+- AceGUI: Small fix to the flow layout preventing controls overlapping in some cases (nargiddley)
+- AceConfigDialog: Implement control and dialogControl for types 'input' and 'select' (nargiddley)
+- AceConfigDialog: Add support for multiline = true on type = 'input' (nargiddley)
+- AceConfigDialog: Fix an error when all groups are hidden in a group with childGroups = 'select' (nargiddley)
+- AceConfigDialog: type = 'description' will now show .icon as an image with its text (nargiddley)
+- AceConfigDialog: multiline inputs are no longer forced to width = "full" (nargiddley)
+- AceConfigDialog: bug fix when loading without AceConsole present (nevcairiel)
+
+Ace3 Beta - Revision 60545 (Feb 7th, 2008)
+---------------------------------------------
+- AceGUI: SetToplevel(true) for the Frame widget, multiple open windows should play nice together now (nargiddley)
+- AceGUI: Move Frames to the FULLSCREEN_DIALOG strata (nargiddley)
+- AceGUI: Dropdown, Editbox and Keybinding labels grey out when disabled (nargiddley)
+- AceGUI: Add OnClick callback to the TreeGroup widget (nargiddley)
+- AceConfigDialog: Confirm popups will be above the config window (nargiddley)
+
+Ace3 Beta - Revision 60163 (Feb 3rd, 2008)
+---------------------------------------------
+- Initial Beta release
\ No newline at end of file
diff --git a/Locales/Core-Locale-enUS.lua b/Locales/Core-Locale-enUS.lua
index 8460c01..33a8b02 100644
--- a/Locales/Core-Locale-enUS.lua
+++ b/Locales/Core-Locale-enUS.lua
@@ -375,9 +375,9 @@ L["SELL_RARE_HELP"] = "Sell All Rare(Blue) Items"
 L["SELL_EPIC"] = "|cffa335ee Sell Epic Items"
 L["SELL_EPIC_HELP"]	= "Sell All Epic(Purple) Items"
 L["AUTO_SELL_TOYS"] = "|cff00ccff Sell Already Known Toys"
-L["AUTO_SELL_TOYS_HELP"] = "Sell Or Destroy Already Known Toys"
+L["AUTO_SELL_TOYS_HELP"] = "Sell Or Destroy Already Known SoulBound Toys"
 L["AUTO_SELL_MOUNTS"] = "|cff00ccff Already Known Mounts"
-L["AUTO_SELL_MOUNTS_HELP"] = "Sell Or Destroy Already Known Mounts"
+L["AUTO_SELL_MOUNTS_HELP"] = "Sell Or Destroy Already Known SoulBound Mounts"
 L["SELL_LIST_DROP_ITEM"] = "Sell Other Item (DRAG ITEM TO BOX)"
 L["ITEM_TAG_ERR"] = "Item Tags Must Only Be Made Up Of Letters And Numbers."
 L["POPUP_REMOVE_ITEM"] = "Are You Sure You Wish To Remove The Selected Item From The Auto Sell: Items List?"
diff --git a/Media/Sounds/Warning.ogg b/Media/Sounds/Warning.ogg
new file mode 100644
index 0000000..987d60b
Binary files /dev/null and b/Media/Sounds/Warning.ogg differ
diff --git a/Media/Sounds/desktop.ini b/Media/Sounds/desktop.ini
new file mode 100644
index 0000000..d957fd1
--- /dev/null
+++ b/Media/Sounds/desktop.ini
@@ -0,0 +1,4 @@
+[ViewState]
+Mode=
+Vid=
+FolderType=Generic
diff --git a/Media/Sounds/raidwarning.ogg b/Media/Sounds/raidwarning.ogg
new file mode 100644
index 0000000..f7074ea
Binary files /dev/null and b/Media/Sounds/raidwarning.ogg differ
diff --git a/Modules/Interaction.lua b/Modules/Interaction.lua
index d89321a..29315c6 100644
--- a/Modules/Interaction.lua
+++ b/Modules/Interaction.lua
@@ -755,6 +755,7 @@ function EMA:doLoot( tries )
 				end
 				if EMA.db.tellBoEEpic == true or EMA.db.tellBoEMount == true then
 					if lootQuality == 4 then
+						--EMA:Print("Can Tell")
 						EMA:ScheduleTimer( "TellTeamEpicBoE", 1 , name)
 					end
 				end
@@ -815,6 +816,9 @@ function EMA:TellTeamEpicBoE( name )
 										rarity = L["RARE"]
 									end
 								end
+								if rarity ~= nil then
+									EMA:EMASendMessageToTeam( EMA.db.messageArea, L["I_HAVE_LOOTED_X_Y_ITEM"]( rarity, itemLink ), false )
+								end
 							else
 								if EMA.db.tellBoEMount == true then
 									if isBop == false then
diff --git a/Modules/Toon.lua b/Modules/Toon.lua
index 1a9ef40..ab34cd2 100644
--- a/Modules/Toon.lua
+++ b/Modules/Toon.lua
@@ -1464,9 +1464,11 @@ function EMA:UPDATE_INVENTORY_DURABILITY(event, agr1)
 	end
 	--EMA:Print("Test Durability Fired")
 	local curTotal, maxTotal, broken = 0, 0, 0
+	local durability = 100
 	for i = 1, 18 do
 		local curItemDurability, maxItemDurability = GetInventoryItemDurability(i)
-		if curItemDurability and maxItemDurability then
+		if (curItemDurability ~= nil) and (maxItemDurability ~= nil ) then
+			--EMA:Print("£test", i, curItemDurability, maxItemDurability )
 			curTotal = curTotal + curItemDurability
 			maxTotal = maxTotal + maxItemDurability
 			if maxItemDurability > 0 and curItemDurability == 0 then
@@ -1474,9 +1476,12 @@ function EMA:UPDATE_INVENTORY_DURABILITY(event, agr1)
 			end
 		end
 	end
-	local durability = (curTotal / maxTotal) * 100
+	--EMA:Print( curTotal, maxTotal )
+	if maxTotal > 0 then
+		durability = (curTotal / maxTotal) * 100
+	end
 	local durabilityText = tostring(gsub( durability, "%.[^|]+", "") )
-	--EMA:Print("Test Durability", durabilityText,"%")
+	--EMA:Print("Test Durability", durability, durabilityText,"%")
 	if EMA.toldMasterAboutDurability == true then
 		if durability >= tonumber( EMA.db.warnWhenDurabilityDropsAmount ) then
 			EMA.toldMasterAboutDurability = false
@@ -1487,7 +1492,7 @@ function EMA:UPDATE_INVENTORY_DURABILITY(event, agr1)
 			EMA.toldMasterAboutDurability = true
 			EMA:EMASendMessageToTeam( EMA.db.warningArea, EMA.db.warnDurabilityDropsMessage..L[" "]..durabilityText..L["%"], false )
 		end
-	end
+	end
 end

 function EMA:ResetDurability()