luxury furnisher, updated libraries, hopefully fixed rumour misclassification

git [08-18-18 - 12:42]
luxury furnisher, updated libraries, hopefully fixed rumour misclassification
Filename
FurCData.lua
FurnitureCatalogue.txt
data/02_Morrowind/M_Recipes.lua
data/03_Reach/HotR_LuxuryFurnisher.lua
data/100024.lua
data/LuxuryFurnisher.lua
data/RumourRecipes.lua
libs/LibAddonMenu-2.0.txt
libs/LibAsync/LibAsync.txt
libs/LibCustomMenu/LibCustomMenu.lua
libs/LibCustomMenu/LibCustomMenu.txt
libs/LibCustomMenu/libs/LibStub.lua
libs/LibCustomMenu/libs/LibStub.txt
libs/LibCustomMenu/libs/LibVotansAddonList/LibVotansAddonList.txt
libs/LibCustomMenu/libs/LibVotansAddonList/Main.lua
libs/LibCustomMenu/libs/LibVotansAddonList/lang/de.lua
libs/LibCustomMenu/libs/LibVotansAddonList/lang/fr.lua
libs/LibCustomMenu/libs/LibVotansAddonList/lang/strings.lua
libs/LibCustomTitles/LibCustomTitles.lua
locale/de.lua
startup.lua
diff --git a/FurCData.lua b/FurCData.lua
index 34d425e..8279ea2 100644
--- a/FurCData.lua
+++ b/FurCData.lua
@@ -458,11 +458,22 @@ local function scanFromFiles(shouldScanCharacter)
 			startupMessage(GetString(SI_FURC_VERBOSE_STARTUP))
 		end
     end
+	local function rescanRumourRecipes()
+		-- make sure that all rumour items
+		for recipeKey, recipeArray in pairs(FurC.settings.data) do
+			if FurC.RumourRecipes[recipeKey] or recipeArray.blueprint and FurC.RumourRecipes[recipeArray.blueprint] then
+
+			end
+		end
+	end

 	FurC.IsLoading(true)

-	task:Call(scanMiscItemFile)
-	:Then(scanRecipeFile)
+	-- task:Call(scanMiscItemFile)
+	-- :Then(scanRecipeFile)
+
+	task:Call(scanRecipeFile)
+	:Then(scanMiscItemFile)
 	:Then(scanVendorFiles)
 	:Then(scanRolis)
 	:Then(scanFestivalFiles)
diff --git a/FurnitureCatalogue.txt b/FurnitureCatalogue.txt
index 9308135..d3406b4 100644
--- a/FurnitureCatalogue.txt
+++ b/FurnitureCatalogue.txt
@@ -1,7 +1,7 @@
 ## Title: FurnitureCatalogue
 ## Author: manavortex
-## Version: 2.5.18
-## APIVersion: 100023 100024
+## Version: 2.6.0
+## APIVersion: 100024
 ## SavedVariables: FurnitureCatalogue_Settings
 ## OptionalDependsOn: pChat

diff --git a/data/02_Morrowind/M_Recipes.lua b/data/02_Morrowind/M_Recipes.lua
index da3b1de..8760ab1 100644
--- a/data/02_Morrowind/M_Recipes.lua
+++ b/data/02_Morrowind/M_Recipes.lua
@@ -281,7 +281,6 @@ FurC.Recipes[FURC_MORROWIND] = {
 	127098, -- Telvanni Lantern, Organic Azure
 	126839, -- Daedric Platform, Ashen
 	127074, -- Indoril Brazier, Knotwork
-	121107, -- Steak Dinner
 	126876, -- Dwarven Candlestick, Orrery
 	121105, -- Common Barrel, Dry
 	121103, -- Chicken Meal, Display
diff --git a/data/03_Reach/HotR_LuxuryFurnisher.lua b/data/03_Reach/HotR_LuxuryFurnisher.lua
index 3e7da0d..dd86bc2 100644
--- a/data/03_Reach/HotR_LuxuryFurnisher.lua
+++ b/data/03_Reach/HotR_LuxuryFurnisher.lua
@@ -2,7 +2,7 @@ FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}

 FurC.LuxuryFurnisher[FURC_REACH] = {

-	-- Oct. 21
+-- Oct. 21
 	[132155] = { -- Witch's Torch, Wretched
 		itemPrice 	= 5000,
 		itemDate	= "2017-10-20",
@@ -127,21 +127,6 @@ FurC.LuxuryFurnisher[FURC_REACH] = {
 	},


-	-- Sept. 2nd + 3rd
-	[120832] = { -- Blue Crystal Spire
-		itemPrice 	= 12000,
-		itemDate	= "2017-09-01",
-	},
-	[120834] = { -- Blue Flame Brazier
-		itemPrice 	= 5000,
-		itemDate	= "2017-09-01",
-	},
-	[121272] = { -- Great Soul Gem
-		itemPrice 	= 20000,
-		itemDate	= "2017-09-01",
-	},
-
-


 }
diff --git a/data/100024.lua b/data/100024.lua
index 49baba8..9054bc1 100644
--- a/data/100024.lua
+++ b/data/100024.lua
@@ -3,6 +3,10 @@ local function getCrownStorePriceString(price)
 end

 FurC.MiscItemSources[FURC_WEREWOLF] = FurC.MiscItemSources[FURC_WEREWOLF] or {}
+
+FurC.MiscItemSources[FURC_WEREWOLF][FURC_DROP] = {
+	[141851] = GetString(SI_FURC_WW_DUNGEON_DROP), 			-- Bear Skull, Fresh",
+}
 FurC.MiscItemSources[FURC_WEREWOLF][FURC_RUMOUR] = {
     [141824] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Vines, Sun-Bronzed Ivy Cluster",
     [141825] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Relic Vault, Impenetrable",
@@ -30,7 +34,7 @@ FurC.MiscItemSources[FURC_WEREWOLF][FURC_RUMOUR] = {
     [141848] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Animal Bones, Jumbled",
     [141849] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Animal Bones, Fresh",
     [141850] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Bear Skeleton, Picked Clean",
-    [141851] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Bear Skull, Fresh",
+
     [141852] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Ritual Fetish, Hircine",
     [141853] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Statue of Hircine's Bitter Mercy",
     [141854] = GetString(SI_FURC_ITEMSOURCE_UNKNOWN_YET), -- Decorative Hollowjack Flame-Skull",
diff --git a/data/LuxuryFurnisher.lua b/data/LuxuryFurnisher.lua
index 4ede13e..8616888 100644
--- a/data/LuxuryFurnisher.lua
+++ b/data/LuxuryFurnisher.lua
@@ -1,6 +1,27 @@
 FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
 FurC.LuxuryFurnisher[FURC_ALTMER] = {

+
+	[139102] = {        -- Blue Crystal Spire, Large
+        itemPrice   = 18000,
+		itemDate	= "2018-08-18",
+    },
+
+	-- Sept. 2nd + 3rd
+	[120832] = { -- Blue Crystal Spire
+		itemPrice 	= 12000,
+		itemDate	= "2018-08-18",
+	},
+	[120834] = { -- Blue Flame Brazier
+		itemPrice 	= 5000,
+		itemDate	= "2018-08-18",
+	},
+	[121272] = { -- Great Soul Gem
+		itemPrice 	= 20000,
+		itemDate	= "2018-08-18",
+	},
+
+
 	[139101] = {        -- Blue Crystal Cluster, Large
 		itemPrice   = 20000,
 		itemDate	= "2018-08-11",
diff --git a/data/RumourRecipes.lua b/data/RumourRecipes.lua
index 5bb4a0f..a3cefc3 100644
--- a/data/RumourRecipes.lua
+++ b/data/RumourRecipes.lua
@@ -12,7 +12,6 @@ FurC.RumourRecipes = {
     119437, -- Design: Pie, Display
     121161, -- Design: Ram Horns, Mounted
     121216, -- Blueprint: Redguard Divider, Gilded
-
     121203, -- Praxis: Khajiit Brazier, Enchanted
     121217, -- Formula: Redguard Lamp, Oil
     121215, -- Pattern: Redguard Canopy, Dusk
diff --git a/libs/LibAddonMenu-2.0.txt b/libs/LibAddonMenu-2.0.txt
new file mode 100644
index 0000000..891e536
--- /dev/null
+++ b/libs/LibAddonMenu-2.0.txt
@@ -0,0 +1,32 @@
+## APIVersion: 100022 100023
+## Title: LibAddonMenu-2.0
+## Version: 2.0 r26
+## AddOnVersion: 26
+## Author: Seerah, sirinsidiator, et al.
+## Contributors: votan, merlight, Garkin, Randactyl, KuroiLight, silvereyes333, Baertram, kyoma
+## Description: A library to aid in the creation of option panels.
+##
+## This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
+## The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
+## All rights reserved
+##
+## You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
+
+LibStub\LibStub.lua
+
+LibAddonMenu-2.0\LibAddonMenu-2.0.lua
+
+LibAddonMenu-2.0\controls\panel.lua
+LibAddonMenu-2.0\controls\submenu.lua
+LibAddonMenu-2.0\controls\button.lua
+LibAddonMenu-2.0\controls\checkbox.lua
+LibAddonMenu-2.0\controls\colorpicker.lua
+LibAddonMenu-2.0\controls\custom.lua
+LibAddonMenu-2.0\controls\description.lua
+LibAddonMenu-2.0\controls\dropdown.lua
+LibAddonMenu-2.0\controls\editbox.lua
+LibAddonMenu-2.0\controls\header.lua
+LibAddonMenu-2.0\controls\slider.lua
+LibAddonMenu-2.0\controls\texture.lua
+LibAddonMenu-2.0\controls\iconpicker.lua
+LibAddonMenu-2.0\controls\divider.lua
diff --git a/libs/LibAsync/LibAsync.txt b/libs/LibAsync/LibAsync.txt
new file mode 100644
index 0000000..0fb0d3e
--- /dev/null
+++ b/libs/LibAsync/LibAsync.txt
@@ -0,0 +1,11 @@
+## Title: LibAsync
+## Author: votan
+## APIVersion: 100023 100024
+## AddOnVersion: 170
+## Version: 1.7
+## Description: A share scheduler for deferred actions
+## DependsOn: LibStub
+
+## This Add-On is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates. The Elder Scrolls and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries. All rights reserved.
+
+LibAsync.lua
diff --git a/libs/LibCustomMenu/LibCustomMenu.lua b/libs/LibCustomMenu/LibCustomMenu.lua
index f458546..a7cd696 100644
--- a/libs/LibCustomMenu/LibCustomMenu.lua
+++ b/libs/LibCustomMenu/LibCustomMenu.lua
@@ -2,7 +2,7 @@
 -- thanks to: baertram & circonian

 -- Register with LibStub
-local MAJOR, MINOR = "LibCustomMenu", 6.5
+local MAJOR, MINOR = "LibCustomMenu", 6.6
 local lib, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 if not lib then return end -- the same or newer version of this lib is already loaded into memory

diff --git a/libs/LibCustomMenu/LibCustomMenu.txt b/libs/LibCustomMenu/LibCustomMenu.txt
new file mode 100644
index 0000000..e498832
--- /dev/null
+++ b/libs/LibCustomMenu/LibCustomMenu.txt
@@ -0,0 +1,11 @@
+## Title: LibCustomMenu
+## Author: votan
+## APIVersion: 100023 100024
+## Version: 6.6
+## AddOnVersion: 660
+## DependsOn: LibStub
+## Description: Fixes in-game bug that causes "Access a private function from insecure code" created by custom context-menu items, sub-menu and divider.
+
+## This Add-On is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates. The Elder Scrolls and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries. All rights reserved.
+
+LibCustomMenu.lua
diff --git a/libs/LibCustomMenu/libs/LibStub.lua b/libs/LibCustomMenu/libs/LibStub.lua
new file mode 100644
index 0000000..0e6bf67
--- /dev/null
+++ b/libs/LibCustomMenu/libs/LibStub.lua
@@ -0,0 +1,38 @@
+-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+-- LibStub developed for World of Warcraft by above members of the WowAce community.
+-- Ported to Elder Scrolls Online by Seerah
+
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 4
+local LibStub = _G[LIBSTUB_MAJOR]
+
+local strformat = string.format
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+	LibStub = LibStub or {libs = {}, minors = {} }
+	_G[LIBSTUB_MAJOR] = LibStub
+	LibStub.minor = LIBSTUB_MINOR
+
+	function LibStub:NewLibrary(major, minor)
+		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+		if type(minor) ~= "number" then
+			minor = assert(tonumber(zo_strmatch(minor, "%d+%.?%d*")), "Minor version must either be a number or contain a number.")
+		end
+
+		local oldminor = self.minors[major]
+		if oldminor and oldminor >= minor then return nil end
+		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+		return self.libs[major], oldminor
+	end
+
+	function LibStub:GetLibrary(major, silent)
+		if not self.libs[major] and not silent then
+			error(strformat("Cannot find a library instance of %q.", tostring(major)), 2)
+		end
+		return self.libs[major], self.minors[major]
+	end
+
+	function LibStub:IterateLibraries() return pairs(self.libs) end
+	setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
+
+LibStub.SILENT = true
\ No newline at end of file
diff --git a/libs/LibCustomMenu/libs/LibStub.txt b/libs/LibCustomMenu/libs/LibStub.txt
new file mode 100644
index 0000000..d5ae454
--- /dev/null
+++ b/libs/LibCustomMenu/libs/LibStub.txt
@@ -0,0 +1,8 @@
+## Title: LibStub
+## APIVersion: 100023 100024
+## Description: Universal Library Stub
+## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, ported to ESO by Seerah
+## Version: 1.0 r4
+## AddOnVersion: 4
+
+LibStub.lua
\ No newline at end of file
diff --git a/libs/LibCustomMenu/libs/LibVotansAddonList/LibVotansAddonList.txt b/libs/LibCustomMenu/libs/LibVotansAddonList/LibVotansAddonList.txt
new file mode 100644
index 0000000..b754cc6
--- /dev/null
+++ b/libs/LibCustomMenu/libs/LibVotansAddonList/LibVotansAddonList.txt
@@ -0,0 +1,15 @@
+## Title: Votan's Addon List
+## Author: votan
+## Description: Alternative Addon List Design
+## APIVersion: 100023 100024
+## AddOnVersion: 100
+## Version: 1.0.0
+## DependsOn: LibStub
+## OptionalDependsOn: AddonSelector
+
+## This Add-On is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates. The Elder Scrolls and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries. All rights reserved.
+
+lang/strings.lua
+lang/$(language).lua
+
+Main.lua
diff --git a/libs/LibCustomMenu/libs/LibVotansAddonList/Main.lua b/libs/LibCustomMenu/libs/LibVotansAddonList/Main.lua
new file mode 100644
index 0000000..78e7514
--- /dev/null
+++ b/libs/LibCustomMenu/libs/LibVotansAddonList/Main.lua
@@ -0,0 +1,273 @@
+
+local LIB_NAME = "LibVotansAddonList"
+local addon = LibStub:NewLibrary(LIB_NAME, 1)
+
+if not addon then
+	return
+	-- already loaded and no upgrade necessary
+end
+
+local em = GetEventManager()
+local AddOnManager = GetAddOnManager()
+
+function addon:Initialize()
+	ZO_ClearTable(ADD_ON_MANAGER.list.dataTypes)
+	ZO_ScrollList_AddDataType(ADD_ON_MANAGER.list, 1, "ZO_AddOnRow", 30, ADD_ON_MANAGER:GetRowSetupFunction())
+	ADD_ON_MANAGER.isDirty = true
+end
+
+local function setupHeaderFunction(control, data)
+	control:SetText(data.text)
+	control:SetMouseEnabled(false)
+end
+
+local function setupDividerFunction(control, data)
+	control:SetHeight(30)
+end
+
+do
+	local LIB_ROW_ID = 2
+	local orgSort
+	local orgSortScrollList = ZO_AddOnManager.SortScrollList
+	local scrollData
+	local function newSort(...)
+		scrollData = ...
+		table.sort = orgSort
+	end
+	local function sortBySortable(a, b)
+		return a.data.sortableName < b.data.sortableName
+	end
+	local function sortByLib(a, b)
+		return a.data.isLibrary == b.data.isLibrary and sortBySortable(a, b) or(not a.data.isLibrary and b.data.isLibrary)
+	end
+	function ZO_AddOnManager:SortScrollList()
+		ZO_ScrollList_AddDataType(self.list, LIB_ROW_ID, "ZO_GameMenu_LabelHeader", 30, setupHeaderFunction)
+		ZO_ScrollList_AddDataType(self.list, LIB_ROW_ID + 1, "ZO_DynamicHorizontalDivider", 30, setupDividerFunction)
+		orgSort, table.sort = table.sort, newSort
+		orgSortScrollList(self)
+		table.sort(scrollData, sortByLib)
+		local hasLibs = false
+		for i = #scrollData, 1, -1 do
+			if scrollData[i].data.isLibrary then
+				hasLibs = true
+			else
+				if hasLibs then
+					table.insert(scrollData, i + 1, ZO_ScrollList_CreateDataEntry(LIB_ROW_ID, { text = GetString(SI_VOTANS_ADDONLIST_LIBS) }))
+					table.insert(scrollData, i + 1, ZO_ScrollList_CreateDataEntry(LIB_ROW_ID + 1, { }))
+				end
+				break
+			end
+		end
+	end
+end
+
+do
+	local orgBuildMasterList = ZO_AddOnManager.BuildMasterList
+	local function isLibrary(item)
+		-- ZOS could know/call this "nested manifest". All nested manifests are libs. Never seen a main addon nesting a main addon.
+		-- In case of having the "nested" information: isPatch = depends on one non-nested addon. Else: isLibrary = isNested and not depends on non-nested.
+		local data = item.data
+		if data.isLibrary == nil then
+			data.isLibrary =(LibStub(data.addOnFileName, LibStub.SILENT) or data.addOnFileName:match("^[Ll]ib[%u%d]%a")) ~= nil
+		end
+	end
+	function ZO_AddOnManager:BuildMasterList()
+		orgBuildMasterList(self)
+		local scrollData = ZO_ScrollList_GetDataList(self.list)
+		self.masterList = self.masterList or { }
+		local masterList = self.masterList
+		ZO_ClearNumericallyIndexedTable(masterList)
+
+		local nameToLib = { }
+		local data
+		for i = 1, #scrollData do
+			isLibrary(scrollData[i])
+			data = scrollData[i].data
+			masterList[i] = data
+			nameToLib[data.addOnFileName] = data
+			data.sortableName = data.strippedAddOnName:upper()
+			data.expandable = false
+		end
+		local name, i, dependency, depCount, isPatchFor
+		for index = 1, #masterList do
+			data = masterList[index]
+			i = data.index
+			name, depCount = nil, 0
+			for j = 1, AddOnManager:GetAddOnNumDependencies(i) do
+				dependency = AddOnManager:GetAddOnDependencyInfo(i, j)
+				dependency = nameToLib[dependency]
+				if dependency and not dependency.isLibrary then
+					if not name then
+						name = dependency.sortableName
+						isPatchFor = dependency
+					end
+					depCount = depCount + 1
+				end
+			end
+
+			data.isPatch = depCount >= 1
+			if data.isPatch then
+				data.isLibrary = false
+				data.isPatchFor = isPatchFor
+				data.sortableName = string.format("%s-%s", name, data.sortableName)
+			end
+		end
+	end
+end
+
+do
+	local orgGetRowSetupFunction = ZO_AddOnManager.GetRowSetupFunction
+	local WARNING_COLOR = ZO_ColorDef:New("C5C23E")
+	local attentionIcon = zo_iconFormatInheritColor(ZO_KEYBOARD_NEW_ICON, 28, 28)
+
+	local function AddLine(tooltip, text, color, alignment)
+		local r, g, b = color:UnpackRGB()
+		tooltip:AddLine(text, "", r, g, b, CENTER, MODIFY_TEXT_TYPE_NONE, alignment, alignment ~= TEXT_ALIGN_LEFT)
+	end
+
+	local function AddLineCenter(tooltip, text, color)
+		if not color then color = ZO_TOOLTIP_DEFAULT_COLOR end
+		AddLine(tooltip, text, color, TEXT_ALIGN_CENTER)
+	end
+
+	local function AddLineTitle(tooltip, text, color)
+		if not color then color = ZO_SELECTED_TEXT end
+		local r, g, b = color:UnpackRGB()
+		tooltip:AddLine(text, "ZoFontHeader3", r, g, b, CENTER, MODIFY_TEXT_TYPE_NONE, TEXT_ALIGN_CENTER, true)
+	end
+
+	local function AddLineSubTitle(tooltip, text, color)
+		if not color then color = ZO_SELECTED_TEXT end
+		local r, g, b = color:UnpackRGB()
+		tooltip:AddLine(text, "ZoFontWinH5", r, g, b, CENTER, MODIFY_TEXT_TYPE_NONE, TEXT_ALIGN_CENTER, true)
+	end
+
+	-- zo_strformat converts the dot in version numbers into comma (localization of decimal numbers, but wrong here)
+	local formatDep = GetString(SI_ADDON_MANAGER_DEPENDENCIES):gsub("<<1>>", "%%s")
+	local function onMouseEnter(control)
+		local data = ZO_ScrollList_GetData(control)
+		if not data then return end
+		InitializeTooltip(ItemTooltip, control, LEFT, -7, -30, BOTTOMRIGHT)
+
+		ZO_ItemIconTooltip_OnAddGameData(ItemTooltip, TOOLTIP_GAME_DATA_ITEM_ICON, data.isLibrary and "esoui/art/journal/journal_tabicon_cadwell_up.dds" or "esoui/art/inventory/inventory_tabicon_misc_up.dds")
+
+		if data.isLibrary then
+			ItemTooltip:AddHeaderLine(zo_strformat(SI_ITEM_FORMAT_STR_TEXT1, GetString(SI_VOTANS_ADDONLIST_LIB)), "ZoFontWinH5", 1, TOOLTIP_HEADER_SIDE_LEFT, ZO_TOOLTIP_DEFAULT_COLOR:UnpackRGB())
+		end
+		ItemTooltip:AddVerticalPadding(14)
+		AddLineTitle(ItemTooltip, data.addOnName)
+		ItemTooltip:AddVerticalPadding(-9)
+		ZO_Tooltip_AddDivider(ItemTooltip)
+
+		if data.addOnAuthorByLine ~= "" then
+			AddLineSubTitle(ItemTooltip, data.addOnAuthorByLine)
+		end
+
+		if data.addOnDescription ~= "" then
+			AddLineCenter(ItemTooltip, data.addOnDescription)
+		end
+
+		if data.isOutOfDate then
+			AddLineCenter(ItemTooltip, GetString(SI_VOTANS_ADDONLIST_OUTDATED), WARNING_COLOR)
+		end
+
+		if data.hasDependencyError then
+			local dependencyText = { }
+			local i = data.index
+			local dependencyName, dependencyActive
+			for j = 1, AddOnManager:GetAddOnNumDependencies(i) do
+				dependencyName, dependencyActive = AddOnManager:GetAddOnDependencyInfo(i, j)
+				if dependencyName ~= "" and not dependencyActive then
+					dependencyName = ZO_ERROR_COLOR:Colorize(dependencyName)
+				end
+				dependencyText[#dependencyText + 1] = dependencyName
+			end
+			table.sort(dependencyText)
+			AddLineCenter(ItemTooltip, formatDep:format(table.concat(dependencyText, ", ")))
+		end
+
+		ZO_ItemIconTooltip_OnAddGameData(ItemTooltip, TOOLTIP_GAME_DATA_STOLEN, false)
+	end
+	local function onMouseExit(control)
+		ClearTooltip(ItemTooltip)
+	end
+
+	function ZO_AddOnManager:GetRowSetupFunction()
+		local orgSetup = orgGetRowSetupFunction(self)
+		local function modify(control, data)
+			local indent = data.isPatch and 12 or 0
+			local expandButton = control:GetNamedChild("ExpandButton")
+			expandButton:SetHidden(true)
+			local enableButton = control:GetNamedChild("Enabled")
+			enableButton:SetAnchor(TOPLEFT, nil, TOPLEFT, 7 + indent, 7)
+
+			local state = control:GetNamedChild("State")
+			state:SetDimensions(28, 28)
+			state:ClearAnchors()
+			state:SetAnchor(TOPRIGHT, nil, TOPRIGHT, -7, 1)
+			local stateText
+			-- out-dated libs coming from out-dated main-addons. If an out-dated lib is used by an up-to-date addon, it is still working.
+			-- if it is a patch, but its parent is not enabled, show out-of-date warning only.
+			if (data.isOutOfDate and not data.isLibrary) or(data.hasDependencyError and(not data.isPatch or(data.isPatch and data.isPatchFor.addOnEnabled))) then
+				stateText = attentionIcon
+				if not data.hasDependencyError and AddOnManager:GetLoadOutOfDateAddOns() or(data.isPatch and not data.isPatchFor.addOnEnabled) then
+					stateText = WARNING_COLOR:Colorize(stateText)
+				else
+					stateText = ZO_ERROR_COLOR:Colorize(stateText)
+				end
+			else
+				stateText = ""
+			end
+			state:SetText(stateText)
+
+			local name = control:GetNamedChild("Name")
+			name:SetWidth(385 - indent)
+			local author = control:GetNamedChild("Author")
+			author:SetWidth(372)
+
+			if data.isPatch and not data.isPatchFor.addOnEnabled then
+				local color = ZO_DEFAULT_DISABLED_COLOR
+				name:SetColor(color:UnpackRGBA())
+				author:SetColor(color:UnpackRGBA())
+			end
+
+			if not control.votanAddonLib then
+				control.votanAddonLib = true
+				ZO_PreHookHandler(control, "OnMouseEnter", onMouseEnter)
+				ZO_PreHookHandler(control, "OnMouseExit", onMouseExit)
+				control:SetMouseEnabled(true)
+			end
+		end
+		local function setupAddonRow(...)
+			orgSetup(...)
+			return modify(...)
+		end
+		return setupAddonRow
+	end
+end
+
+function ZO_AddOnManager:OnExpandButtonClicked(row)
+	-- Disabled.
+end
+
+ZO_AddOnsLoadOutOfDateAddOnsText:SetText(GetString(SI_ADDON_MANAGER_LOAD_OUT_OF_DATE_ADDONS))
+
+do
+	ZO_AddOnsLoadOutOfDateAddOnsText:SetMouseEnabled(true)
+
+	local function showOutOfDateAddonsTooltip()
+		ZO_Tooltips_ShowTextTooltip(ZO_AddOnsLoadOutOfDateAddOns, BOTTOM, GetString(SI_VOTANS_ADDONLIST_LOAD_OUT_OF_DATE_ADDONS_DESC))
+	end
+	ZO_AddOnsLoadOutOfDateAddOns:SetHandler("OnMouseEnter", showOutOfDateAddonsTooltip)
+	ZO_AddOnsLoadOutOfDateAddOnsText:SetHandler("OnMouseEnter", showOutOfDateAddonsTooltip)
+	ZO_AddOnsLoadOutOfDateAddOns:SetHandler("OnMouseExit", ZO_Tooltips_HideTextTooltip)
+	ZO_AddOnsLoadOutOfDateAddOnsText:SetHandler("OnMouseExit", ZO_Tooltips_HideTextTooltip)
+end
+
+local function OnAddonLoaded(event, name)
+	if name ~= LIB_NAME and name ~= "AddonSelector" then return end
+	em:UnregisterForEvent(addon.name, EVENT_ADD_ON_LOADED)
+	if name == LIB_NAME then addon:Initialize() end
+end
+
+em:RegisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED, OnAddonLoaded)
diff --git a/libs/LibCustomMenu/libs/LibVotansAddonList/lang/de.lua b/libs/LibCustomMenu/libs/LibVotansAddonList/lang/de.lua
new file mode 100644
index 0000000..f14d69d
--- /dev/null
+++ b/libs/LibCustomMenu/libs/LibVotansAddonList/lang/de.lua
@@ -0,0 +1,5 @@
+SafeAddString(SI_VOTANS_ADDONLIST_LIBS, "Bibliotheken")
+SafeAddString(SI_VOTANS_ADDONLIST_LIB, "Bibliothek")
+SafeAddString(SI_VOTANS_ADDONLIST_OUTDATED, "Kompatibilität mit der aktuellen Spielversion unbekannt.\nBitte informieren Sie sich, ob eine aktualisierte Version verfügbar ist oder Probleme bekannt sind.")
+SafeAddString(SI_ADDON_MANAGER_LOAD_OUT_OF_DATE_ADDONS, "Erweiterungen anderer Spielversionen zulassen", 1)
+SafeAddString(SI_VOTANS_ADDONLIST_LOAD_OUT_OF_DATE_ADDONS_DESC, "Wenn Ihr diese Checkbox anhakt, könnt Ihr Addons verwenden, die mit einer anderen API Version getestet wurden.\nDies wird weder Addons korrigieren noch prüfen, ob diese überhaupt funktionsuntüchtig sind!\n\nIhr solltet auf der Webseite des Addons, z.B. www.esoui.com prüfen, ob das Addon mit der aktuellen Spielversion kompatibel ist, oder nicht.")
\ No newline at end of file
diff --git a/libs/LibCustomMenu/libs/LibVotansAddonList/lang/fr.lua b/libs/LibCustomMenu/libs/LibVotansAddonList/lang/fr.lua
new file mode 100644
index 0000000..4ee8e76
--- /dev/null
+++ b/libs/LibCustomMenu/libs/LibVotansAddonList/lang/fr.lua
@@ -0,0 +1,4 @@
+SafeAddString(SI_VOTANS_ADDONLIST_LIBS, "Bibliothèques")
+SafeAddString(SI_VOTANS_ADDONLIST_LIB, "Bibliothèque")
+SafeAddString(SI_VOTANS_ADDONLIST_OUTDATED, "Compatibilité avec la version actuelle du jeu inconnue.\nVeuillez vérifier si une nouvelle version est disponible ou s'il existe des problèmes connus.")
+SafeAddString(SI_ADDON_MANAGER_LOAD_OUT_OF_DATE_ADDONS, "Autoriser extensions d'autres versions de client", 1)
\ No newline at end of file
diff --git a/libs/LibCustomMenu/libs/LibVotansAddonList/lang/strings.lua b/libs/LibCustomMenu/libs/LibVotansAddonList/lang/strings.lua
new file mode 100644
index 0000000..f3c2988
--- /dev/null
+++ b/libs/LibCustomMenu/libs/LibVotansAddonList/lang/strings.lua
@@ -0,0 +1,5 @@
+ZO_CreateStringId("SI_VOTANS_ADDONLIST_LIBS", "Libraries")
+ZO_CreateStringId("SI_VOTANS_ADDONLIST_LIB", "Library")
+ZO_CreateStringId("SI_VOTANS_ADDONLIST_OUTDATED", "Compatibility with current game version unknown.\nPlease check if a newer version is available or if there are known issues.")
+SafeAddString(SI_ADDON_MANAGER_LOAD_OUT_OF_DATE_ADDONS, "Allow add-ons of other client versions", 1)
+ZO_CreateStringId("SI_VOTANS_ADDONLIST_LOAD_OUT_OF_DATE_ADDONS_DESC", "If this checkbox is enabled you are allowed to use add-ons, which were tested with another API version.\nThis will not fix broken add-ons, nor will it check if add-ons are broken!\n\nYou need to check the add-on's webpage at e.g. www.esoui.com to see if the add-on is compatible with the current game version, or not.")
\ No newline at end of file
diff --git a/libs/LibCustomTitles/LibCustomTitles.lua b/libs/LibCustomTitles/LibCustomTitles.lua
index 8e5685c..75a5ca6 100644
--- a/libs/LibCustomTitles/LibCustomTitles.lua
+++ b/libs/LibCustomTitles/LibCustomTitles.lua
@@ -36,6 +36,14 @@ http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode

 Author: Dolgubon
 NOTE: Used Kyoma's version as a base. Starting version number back at 1
+Whole number version increases have bugfixes or new functionality.
+Decimal version increases merely have new titles.
+Version 3:
+	- Fixed some issues with language and players using a non official langauge
+
+Version 2:
+	- Fixed an issue where titles that did not globally replace were not showing up for the player with the title
+
 Version 1:
 	- Global titles will now show up only once in the list of titles, replacing 'Volunteer'
 	- The title will still be shown to other players regardless of what is selected
@@ -54,8 +62,6 @@ Changes: Rewrote how custom titles are added and stored to help reduce conflict
 	- Use achievementId instead of raw title name to make it work with all languages
 	- Make it default to english custom title if nothing is specified for the user's language
 	- Support for LibTitleLocale to fix issues with title differences for males and females
-
-	(Added the option to make a title hidden from the user itself) *mhuahahahaha*

 	(v18)
 	- Added support for colors and even a simple gradient
@@ -72,7 +78,7 @@ LibStub:NewLibrary(libName, 100)
 EVENT_MANAGER:UnregisterForEvent(libName, EVENT_ADD_ON_LOADED)

 local libLoaded
-local LIB_NAME, VERSION = "LibCustomTitlesN", 0.1
+local LIB_NAME, VERSION = "LibCustomTitlesN", 3.1
 local LibCustomTitles, oldminor = LibStub:NewLibrary(LIB_NAME, VERSION)
 if not LibCustomTitles then return end

@@ -86,27 +92,28 @@ local _, nonHideCharTitle =  GetAchievementRewardTitle(93)
 local lang = GetCVar("Language.2")
 local supportedLang =
 {
-	["en"]=1,
+	['en']=1,
 	['de']=1,
 	['fr']=1,
-	['jp']=1,
 }

+
 local customTitles = {}
 local playerDisplayName = HashString(GetDisplayName())
 local playerCharName = HashString( GetUnitName('player'))
-local doesPlayerHaveGlobal = false
-local doesCharHaveGlobal = false
+local doesPlayerHaveGlobal
+local doesCharHaveGlobal
 function LibCustomTitles:RegisterTitle(displayName, charName, override, title)
-
+	local titleToUse
 	if type(title) == "table" then
+		if title[lang] then
+			titleToUse = title[lang]
+		end

-		title = title[lang]
-
-		if not supportedLang[lang] then title=title['en'] end
-		if not title then return end
+		if not supportedLang[lang] then titleToUse=title['en'] end
+		if not titleToUse then return end
 	end
-
+	title = titleToUse
 	--local hidden = (extra == true) --support old format

 	if override == true  then
@@ -159,7 +166,7 @@ local maps=
 	[126]=32,
 	[125]=111,
 	[123]=246,
-	[124]=223,
+	[94]=223,
 	[40]=228,
 	[41]=252,
 	[42]=233,
@@ -217,7 +224,6 @@ function LibCustomTitles:Init()

 		-- check for global override
 		local returnTitle = GetCustomTitle(originalTitle, customTitles["-GLOBAL-"]) or originalTitle
-
 		-- check for player override
 		local registerType = GetCustomTitleType(displayName, charName)

@@ -244,17 +250,19 @@ function LibCustomTitles:Init()
 		local displayName = HashString(GetDisplayName())
 		local characterName = HashString(GetUnitName("player"))
 		local title = GetModifiedTitle(titleOriginal, displayName, characterName )
+
 		if title ~= titleOriginal then
 			-- We don't want the title to overwrite everything in the dropdown
 			-- So we only replace volunteer
-			if (doesPlayerHaveGlobal or doesCharHaveGlobal) and nonHideTitle==titleOriginal then return title else return titleOriginal end

-			if doesPlayerHaveGlobal or doesCharHaveGlobal  then
-				if nonHideTitle ~= titleOriginal then return titleOriginal end
-			end
-			if doesCharHaveGlobal then
-				if nonHideCharTitle ~= titleOriginal then return titleOriginal end
+			if nonHideTitle ~= titleOriginal then
+				if doesPlayerHaveGlobal or doesCharHaveGlobal then
+					return titleOriginal
+				else
+					return title
+				end
 			end
+
 			return title
 		else
 			return title
@@ -277,9 +285,7 @@ EVENT_MANAGER:RegisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED, OnAddonLoaded)
 local lct=LibCustomTitles
 lct.RT = lct.RegisterTitle

---                      Account           	Character  Override    English                                German                                  French                                     Extra (e.g. color, hidden)
-lct:RT(1276148971,2868841312,true,{en="O;]v;]aCYaku@{",})
-lct:RT(383898450,false,true,{en="3u{@;]aCYaT]Z@{",})lct:RT(383898450,4149698651,true,{en="q>v}Z>w",fr="nDZyyC]@;[",de="q>v}Z>w",})
+
 lct:RT(80340145,2040263953,92,{en="S<;ao>;aS]^;",fr="n;a6]uZ",de="0;]aNZ>;aTu<];",})
 lct:RT(716725346,4019141728,true,{en="nu{@a/}[;ZvaPZ>w",})
 lct:RT(1540406231,false,true,{en="S<;a0C};>",fr="n;a0C};>",de="0;]a0C};>",})
@@ -288,7 +294,7 @@ lct:RT(4141355865,false,92,{en="1^Z[vyu{@;]",fr="1^Z[vyu{@;]",de="1^Z[vyu{@;]",}
 lct:RT(959437082,false,2139,{en="1]}z<C>alu]@",})
 lct:RT(3185324787,false,92,{en="/]X<Z@;X@",fr="/]X<Z@;X@;",de="/]X<Z@;=@",})
 lct:RT(1171120197,false,true,{en="pQ1Cvv;{{",fr="pQ1Cvv;{{",de="pQ1Cvv;{{",})
-lct:RT(65500869,false,92,{en="p;CaMCZ",fr="p;CaMCZ",de="p;CaMCZ",})lct:RT(65500869,75627323,92,{en="m[a0^X;",})
+lct:RT(65500869,false,92,{en="5;u[aMCZ",fr="5;u[aMCZ",de="5;u[aMCZ",})lct:RT(65500869,75627323,92,{en="m[a0^X;",})
 lct:RT(4198689717,1143482591,92,{en="/]X<yuwZ{@;]",})
 lct:RT(2074654098,false,92,{en="/:{C[^@;[}aQC@a5^{zZXZC^{",fr="ku]]Ey;>@azu{a5^{z;X@",de="/:{C[^@aQZX<@a6;]vbX<@Zw",})lct:RT(2074654098,4247615100,92,{en="4[u>;{Au[=;]",fr="/]z;>@;^{;av;a3C>v;{",de="T;[@;>Au>v;];]",})
 lct:RT(1134753014,false,92,{en="q]{ua3uxC]",fr="q]{ua3uxC]",de="q]{ua3uxC]",})
@@ -306,26 +312,85 @@ lct:RT(416224960,false,92,{en="6;]}a/>w]}",fr="S]c{a;>aXC[c];",de="5;<]aA'@;>v",
 lct:RT(2740299925,3886364242,92,{en="0]uwC>a5zZ]Z@",fr="0]uwC>a5zZ]Z@",de="0]uwC>a5zZ]Z@",})
 lct:RT(3196471767,false,92,{en="1u][ZXakC>>CZ{{;^]",fr="kC>>CZ{{;^]aaa[DuZ[",de="P>C:[u^X<FP;>>;]",})
 lct:RT(1731359458,false,92,{en="5u>v:uwa3u{@;]",})
-
-lct:RT(2402295877,false,92,{en="1];u@a5uw;(aN?^u[aCYaO;u|;>",fr="1]u>va5uZ>@aawu[av^akZ;[",de="1]C~;]aO;Z[Zw;]aOZyy;[",})
-lct:RT(2762805744,false,1391,{en="5@C>;X^@@;]",})lct:RT(2762805744,435253680,1391,{en="5@C>;X^@@;]",})
+lct:RT(2392316419,false,true,{en="lZ{@Z=[ZaMu=[u|u",fr="ku>>;aMu=[u|u",de="U^X=;]]C<]aMu=[u|u",})lct:RT(2392316419,1701693549,true,{en="4Z{@uX<ZCaMu=[u|u",fr="ku>>;aMu=[u|u",de="U^X=;]]C<]aMu=[u|u",})
+lct:RT(2402295877,false,92,{en="1];u@a5uw;(aN?^u[aCYaO;u|;>",fr="1]u>va5uZ>@aawu[av^akZ;[",de="1]Ct;]aO;Z[Zw;]aOZyy;[",})
+lct:RT(2762805744,false,1391,{en="5@C>;X^@@;]",})
 lct:RT(1069428601,false,92,{en="O;u[;]aCYa@<;aT;u=a",fr="1^E]Z{{;^]av;{aluZ:[;{",de="O;Z[;]av;]a5X<AuX<;>",})
 lct:RT(2511359942,false,92,{en="S<;aU;]wakC>v^X@C]",fr="n;ak<;YaU;]w",de="0;]aU;]wa0Z]Zw;>@",})
-lct:RT(2037837684,false,92,{en="5;]|u>@aCYawCvv;{{a1[Z@@;]",})
+lct:RT(2037837684,false,92,{en="5;]|u>@aCYa1Cvv;{{a1[Z@@;]",})

 lct:RT(1904732837,false,true,{en="/vv;]aCYao>{",fr="/vvZ@ZC>>;^]av;ao>{",de="/vvZ;];]a|C>ao>{",})
 lct:RT(2787550069,453923765,true,{en="p;{@CFZ>F0Z{w^Z{;",fr="p;{@CFZ>F0Z{w^Z{;",de="p;{@CFZ>F0Z{w^Z{;",})
 lct:RT(1987214583,false,92,{en="S<;aN[v;]a0]uwC>",fr="S<;aN[v;]a0]uwC>",de="S<;aN[v;]a0]uwC>",})lct:RT(1987214583,3107977549,628,{en="S<;a3u{@;]yZ>v",fr="S<;a3u{@;]yZ>v",de="S<;a3u{@;]yZ>v",})
 lct:RT(2193066671,false,92,{en="pCX=;@;;]",})lct:RT(2193066671,2274919616,1810,{en="PC{yC>u^@aPZ@@}",})
-lct:RT(3600512696,false,92,{en="1];u@;{@aCYau[[aSZy;",fr="3;Z[[;^]av;aSC^{a[;{aS;yz{",de="1]`~@;]a/[[;]aU;Z@;>",})
+lct:RT(3600512696,false,92,{en="~XuI+XYYnZw<@>Z>walC]y~]",})
 lct:RT(1024520674,false,92,{en="4;uX;=;;z;]",fr="5C[vu@av;a[ua4uZ_",de="l]Z;v;>{AbX<@;]",})
 lct:RT(4257573713,false,92,{en="oyu;aTua3C^a5<Z>v;Z]^",fr="oyu;aTua3C^a5<Z>v;Z]^",de="oyu;aTua3C^a5<Z>v;Z]^",})

 lct:RT(3316406928,false,92,{en="5C>wA;u|;]",fr="SZ{{;^]av;ak<u>{C>",de="nZ;vA;:;]",})lct:RT(3316406928,331729979,1391,{en="nZ@;]u]}an;w;>v",fr="nEw;>v;anZ@@E]uZ];",de="nZ@;]u]Z{X<;an;w;>v;",})
-lct:RT(653129646,false,92,{en="S<;a1C[v;>a5uZ>@",fr="n;a5uZ>@avDo]",de="av;]awC[v;>;aO;Z[Zw;",})lct:RT(653129646,1618900846,92,{en="S<;a0]^Zv",fr="n;a0]^Zv;",de="0;]a0]^Zv;",})
-lct:RT(2514190522,false,92,{en="myz;]Zu[aMu@@[;yuw;",fr="Mu@@[;yuw;amyzE]Zu[",de="amyz;]Zu[;]aPuyzYyuwZ;]",})lct:RT(2514190522,2080803584,1810,{en="5z;u]aCYa5@;>vu]]",fr="nu>X;av;a5@;>vu]]",de="5z;;]a|C>a5@;>vu]]",})
+lct:RT(653129646,false,92,{en="S<;a1C[v;>a5uZ>@",fr="n;a5uZ>@avDo]",de="0;]a1C[v;>;aO;Z[Zw;",})lct:RT(653129646,1618900846,92,{en="S<;a0]^Zv",fr="n;a0]^Zv;",de="0;]a0]^Zv;",})
+lct:RT(2514190522,false,92,{en="myz;]Zu[aMu@@[;yuw;",fr="Mu@@[;yuw;amyzE]Zu[",de="myz;]Zu[;]aPuyzYyuwZ;]",})lct:RT(2514190522,2080803584,1810,{en="5z;u]aCYa5@;>vu]]",fr="nu>X;av;a5@;>vu]]",de="5z;;]a|C>a5@;>vu]]",})
 lct:RT(2224225614,false,92,{en="5z;u=;]aYC]a@<;a0;uv",})
 lct:RT(2455827257,false,92,{en="S<;a5@ZX=a4]Z>X;{{",de="0Z;a5@CX=a4]Z>B;{{Z>",})
+lct:RT(3879977139,false,92,{en="S<;a/{{;y:[}a1;>;]u[",})lct:RT(3879977139,189200680,92,{en="ku>>C@a4uvalZ|;",})
+lct:RT(3957423493,false,92,{en="S<;a5AC[;a4u@]C[",})
+lct:RT(3198987902,false,92,{en="S<;a1ZY@;v",})lct:RT(3198987902,3050075638,92,{en="S<;a/Au=;>;v",})
+lct:RT(265543675,false,92,{en="0]uwC>a5[u};]",fr="k<u{{;^]av;a0]uwC>",de="0]uX<;>@`@;]",})lct:RT(265543675,1652025059,92,{en="S<;ak^];aYC]a0;u@<",fr="n;ap;ycv;akC>@];a[ua3C]@",de="0Z;aO;Z[^>waY']av;>aSCv",})
+lct:RT(1517585757,false,92,{en="MuX<;[u{aMll",})
+lct:RT(2188837655,false,92,{en="SCza4]ZC]Z@}",fr="a4]ZC]Z@E",})lct:RT(2188837655,2836585406,51,{en="5<];=",})
+
+lct:RT(2083511209,false,92,{en="0u]=aNy;]u[v",fr="Ny;]u^v;a5Cy:];",})
+lct:RT(2050501477,false,92,{en="Tu>v;]Z>wa/v|;>@^];]",})lct:RT(2050501477,3768515314,51,{en="OC[}a4]Z;{@aCYa3;]ZvZu",})
+lct:RT(658966427,false,92,{en="/]@ZYZX;]aCYaU;>Z@<u]",fr="/]@ZYZXZ;]av;aU;>Z@<u]",de="P^>{@<u>vA;]=;]a|C>aU;>Z@<u]",})lct:RT(658966427,532842436,628,{en="p;va0ZuyC>v",fr="0Zuyu>@apC^w;",de="apC@;]a0Zuyu>@",})
+lct:RT(188206946,false,92,{en="3u{@;]aCYa3;y;{",fr="3ug@];av;{a3cy;{",de="3;Z{@;]av;]a3;y;{",})
+lct:RT(3235505263,false,92,{en="1Z>w;]",fr="pC^?^Z>",de="pC@=CzY",})
+lct:RT(397091973,false,true,{en="3;]XZ[;{{ap;{C[|;",fr="pE{C[^@ZC>amyzZ@C}u:[;",de="1>uv;>[C{;aN>@{X<[C{{;><;Z@",})
+lct:RT(2660919200,false,92,{en="3;>@C]",})
+
+lct:RT(1527484276,false,92,{en="5@C]y:];u=;]",})
+
+lct:RT(1375307746,false,true,{en="/yuBC>aR^;;>",fr="/yuBC>;ap;Z>;",de="/yuBC>;>=`>ZwZ>",})
+
+lct:RT(452725322,false,92,{en="0Z|Z>;aN_;X^@ZC>;]",fr="0Z|Z>aMC^]];u^",de="1`@@[ZX<;]a5X<u]Y]ZX<@;]",})lct:RT(452725322,3541899474,2079,{en="S<;a3uX<Z>;",fr="nua3uX<Z>;",de="0Z;a3u{X<Z>;",})
+lct:RT(671038416,false,2079,{en="5Z[|;]aU;]wa5^]Y;]",fr="/]w;>@a5^]Y;^]aU;]w",de="5Z[:;]aU;]wa5^]Y;]",})
+lct:RT(391627066,false,92,{en="1^u]vZu>a/>w;[",fr="/>w;a1u]vZ;>",de="5X<^@B;>w;[",})
+lct:RT(1449947651,false,92,{en="5X]^:@u{@ZXaku];:;u]",})
+lct:RT(1143345413,false,92,{en="l1ea4]Cw];{{ZC>aS;uy",fr="l1ea4]Cw];{{ZC>aS;uy",de="l1ea4]Cw];{{ZC>aS;uy",})
+lct:RT(3396402417,false,51,{en="S<;anZ|Z>wa5<uvCA",fr="nDCy:];a6Z|u>@;",de="0;]apu{@[C{;a5X<u@@;>",})lct:RT(3396402417,401432131,628,{en="T<Z@;alu>w",fr="k]CXaM[u>X",de="T;Zt;]alu>wBu<>",})
+lct:RT(2837968354,false,92,{en="o>;a3u>a/]y}",fr="q>aOCyy;a/]yE;",de="NZ>Fyu>>Fu]y;;",})
+
+
+lct:RT(173478323,2881560666,92,{en="5@]C>wa5y;[[Z>wao]X",de="5@u]=a3Z;Y;>v;]ao]=",})
+lct:RT(1804301692,false,92,{en="nuv}aCYa@<;a5C^@<am{[u>v",fr="0uy;av;a[Dm[;av^a5^v",de="0uy;av;]a5'vZ>{;[",})
+lct:RT(1044122497,false,92,{en="S<;anC];yu{@;]",fr="nC];yu{@;]",de="nC];yu{@;]",})lct:RT(1044122497,2763479321,1330,{en="0ka5z}",fr="N{zZC>a0k",de="0ka5zZC>",})
+lct:RT(3836251840,false,true,{en="ku=;{aM}aS<;aoX;u>",fr="1a@;u^au^aMC]vav;anDCXEu>",de="P^X<;>auya3;;]",})lct:RT(3836251840,3297937951,1330,{en="R^;;>aCYaku=;{",fr="p;Z>;av;{a1a@;u^_",de="P`>ZwZ>av;]aP^X<;>",})
+lct:RT(1059334478,false,92,{en="kCu_;{a3;@u[",fr="kCu_;{a3E@u[",de="PCu_;{a3;@u[[",})
+lct:RT(1076342159,false,92,{en="S<;aOC>C]u:[;",fr="nDOC>C]u:[;",de="0Z;aN<]<uY@;>",})
+lct:RT(130665165,false,92,{en="S<;aMCw;}yu>",fr="n;ak]C?^;FyZ@uZ>;",de="0;]aM^<yu>>",})
+lct:RT(244717510,false,92,{en="nuakC>?^E]u>@;azu{amyz[u?^u:[;",fr="nuakC>?^E]u>@;azu{amyz[u?^u:[;",de="nuakC>?^E]u>@;azu{amyz[u?^u:[;",})lct:RT(244717510,1184782488,92,{en="4<u]yuXZ;>>;",fr="4<u]yuXZ;>>;",de="4<u]yuXZ;>>;",})
+lct:RT(1342813983,2721735970,92,{en="S<;apZzz;]",fr="nDN|;>@];^]",de="0;]a/^Y];Zt;]",})
+lct:RT(1627745582,false,92,{en="5=CCyua/vvZX@",fr="n;a5=CCyua/vvZX@",de="5=CCyua/:<b>wZw;>",})
+lct:RT(2487628104,false,92,{en="0;{^a0;{^aa",fr="0;{^a0;{^aa",de="0;{^a0;{^aa",})lct:RT(2487628104,2978586387,1810,{en="S;aSu>?^;Ca4uzZaa",fr="2;a|uZ{a|C^{a@u>=;]azuzu",de="mX<aA;]v;a4u>B;]avZX<a4uzua",})
+
+lct:RT(210728403,270455745,92,{en="S<;a3;@<CvZXu[",})
+lct:RT(3252834201,false,92,{en="S<;a5ZyC>aN_z];{{",fr="n;a5ZyC>aN_z];{{",de="0;]a5ZyC>aN_z];{{",})
+lct:RT(1365579521,false,628,{en="TZz;{aC>aS]u{<",})
+lct:RT(2822666538,false,true,{en="~XllGGGG5C^[ap;uz;]~]",fr="~XllGGGG5C^[ap;uz;]~]",de="~XllGGGGnD/>=C^~]",})
+lct:RT(1507726281,3541509713,92,{en="2u|;[Z>aCYa5@;>vu]]",fr="2u|;[C@av;a5@;>vu]]",de="5z;;]A^]Ya|C>a5@;>vu]]",})
+lct:RT(713456003,false,92,{en="S<;al[uA[;{{a1[uvZu@C]",fr="1[uvZu@;^]amyz[uXu:[;",})lct:RT(713456003,3775367921,92,{en="S<;al[uA[;{{a1[uvZu@C]",fr="1[uvZu@;^]amyz[uXu:[;",})
+lct:RT(1158594345,false,92,{en="4]C@;X@C]aCYa@<;ap;u[y",})
+lct:RT(4267095257,false,92,{en="~X,GGG,Gk[C^vak<u{;]~]",fr="~X,GGG,GQ^uw;ak<u{{;~]",de="~X,GGG,GTC[=;>xbw;]~]",})
+lct:RT(109224740,1737010384,92,{en="0];uyaPZ[[;]",fr="S^;^]av;apK|;",de="S]u^yFPZ[[;]",})
+lct:RT(713456003,false,1330,{en="S<;al[uA[;{{a1[uvZu@C]",fr="1[uvZu@;^]amyz[uXu:[;",})lct:RT(713456003,3775367921,1330,{en="S<;al[uA[;{{a1[uvZu@C]",fr="1[uvZu@;^]amyz[uXu:[;",})
+lct:RT(3750747221,false,92,{en="1^u]vZu>aCYa@<;a1u[u_}",})lct:RT(3750747221,2918372644,51,{en="S<;aMZ]vaY]Cya3Z{YC]@^>;",fr="oZ{;u^av^a3u[<;^]",})
+lct:RT(1313177490,false,494,{en="S<;am>|Z>XZ:[;",fr="nDam>|Z>XZ:[;",de="0Z;aq>:;{Z;w:u];",})
+lct:RT(2864716338,false,92,{en="3Z{@];{{aCYa@<;a0u]=",})
+lct:RT(1013558538,3510921308,2079,{en="0Z{:u>va0Z{:u>va0Z{:u>v",fr="0Z{:u>va0Z{:u>va0Z{:u>v",de="0Z{:u>va0Z{:u>va0Z{:u>v",})
+lct:RT(4120068347,false,92,{en="S;ua3u=;]",en="S<EZc];",de="S;;=CX<;]",})lct:RT(4120068347,2030795112,1810,{en='0CoC0',})
+lct:RT(2416997617,false,92,{en="4u{<u",en="4uX<u",de="4u{<u",})
+lct:RT(841517891,false,92,{en="TC]@<}",})
+
+
 --[[
 Author: Kyoma
 Filename: LibTitleLocale.lua
diff --git a/locale/de.lua b/locale/de.lua
index d8dd22f..aaead57 100644
--- a/locale/de.lua
+++ b/locale/de.lua
@@ -251,6 +251,7 @@ local strings = {
 	SI_FURC_CHESTS                                  = "from treasure chests",
 	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
 	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
+	SI_FURC_WW_DUNGEON_DROP                     	= "Monster Hunter Keep/March of the Sacrifices",
 	SI_FURC_ITEMSOURCE_UNKNOWN_YET                  = "This item has been found in the sources/recipes for Summerset! \nIts origin isn't known yet.",
 	SI_FURC_EXISITING_ITEMSOURCE_UNKNOWN_YET        = "This item has been confirmed existing, but its origin isn't known yet.",
 	SI_FURC_ITEMSOURCE_ITEMPACK                     = "This item is part of the Crown Store item pack ",
diff --git a/startup.lua b/startup.lua
index 55637c0..91acae9 100644
--- a/startup.lua
+++ b/startup.lua
@@ -1,7 +1,7 @@
 FurnitureCatalogue 					= {}
 FurnitureCatalogue.name				= "FurnitureCatalogue"
 FurnitureCatalogue.author			= "manavortex"
-FurnitureCatalogue.version          = "2.5.18"
+FurnitureCatalogue.version          = "2.6.0"
 FurnitureCatalogue.CharacterName	= nil
 FurnitureCatalogue.settings			= {}