From 33b7018d2e0eff1a107630082c75f1e59d1ed57a Mon Sep 17 00:00:00 2001 From: Tercio Date: Sun, 1 Nov 2015 22:59:07 -0200 Subject: [PATCH] - Added an option for Numeral System. --- API UI.txt | 6 ++ boot.lua | 6 +- core/util.lua | 206 ++++++++++++++++++++++++++------------- functions/profiles.lua | 6 +- gumps/janela_options.lua | 45 ++++++--- gumps/janela_welcome.lua | 108 +++++++++++++++++++- images/icons2.tga | Bin 319729 -> 348621 bytes startup.lua | 2 +- 8 files changed, 289 insertions(+), 90 deletions(-) diff --git a/API UI.txt b/API UI.txt index dcef64ce..9b0ebe53 100644 --- a/API UI.txt +++ b/API UI.txt @@ -246,3 +246,9 @@ returns a table containing the texture file and coords for a arena. Details:GetBattlegroundInfo (mapid) returns a table containing the texture file and coords for a battleground. + +Details:GelectNumericalSystem() +returns a number indicating which are the current numerical system: 1 for american/european, 2 for asian. + +Details:SelectNumericalSystem (system) +Set the numerical system to be used, 1 for american/european, 2 for asian. \ No newline at end of file diff --git a/boot.lua b/boot.lua index 00a7cc84..4645a63c 100644 --- a/boot.lua +++ b/boot.lua @@ -1,10 +1,10 @@ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> global name declaration - + _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") _detalhes.build_counter = 2059 --it's 2061 for release - _detalhes.userversion = "v4.0.5e" + _detalhes.userversion = "v4.0.6" _detalhes.realversion = 76 --core version _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" Details = _detalhes @@ -28,7 +28,7 @@ do -- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v4.0.5e (|cFFFFCC00Oct 28, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r More improvements for East Asian Numerical System.\n\n|cFFFFFF00v4.0.5c (|cFFFFCC00Oct 24, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option to disable the all-displays window (right click on title bar).\n\n|cFFFFFF00-|r Added an option to suppress segment changes after killing a boss encounter (experimental).\n\n|cFFFFFF00-|r Fixed pet battles auto hide.\n\n|cFFFFFF00-|r Fixed an issue with bar animations starting from the middle of the bar.\n\n|cFFFFFF00-|r Fixed buffs and spell cast start on weakauras creator tool.\n\n|cFFFFFF00v4.0.3a (|cFFFFCC00Set 29, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for an error on Damage Taken By Spell display.\n\n|cFFFFFF00v4.0.3 (|cFFFFCC00Set 27, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Some improvements on Plugin's icon at the title bar.\n\n|cFFFFFF00v4.0.2 (|cFFFFCC00Set 26, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added 'ShielTronic Shield' on HealthPotion & Stone display.\n\n|cFFFFFF00-|r Improvements done on Vanguard Plugin.\n\n|cFFFFFF00-|r Fixed an alignment issue which was happening with few tooltips.\n\n|cFFFFFF00-|r Fixed a problem where sometimes the addon crashes while doing a /reload during raid.\n\n|cFFFFFF00-|r Fixed the creation of auras for weakauras from the Forge (/details forge).\n\n|cFFFFFF00v4.0.1 (|cFFFFCC00Set 21, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an options to use a customized skin file.\n\n|cFFFFFF00-|r Added an options to use a customized bar texture file.\n\n|cFFFFFF00-|r A Package with photoshop files with examples and the skin file for Minimalistic skin are available at WoW Interface.\n\n|cFFFFFF00-|r Added 'API Custom Displays.txt' on Details! folder, this file explain how to create scripts for custom displays.\n\n|cFFFFFF00v4.0h (|cFFFFCC00Set 19, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Created new plugin 'Target Caller' for RBGs, it's available at Curse.com.\n\n|cFFFFFF00-|r Fixed death display color when not using colored by the player class.\n\n|cFFFFFF00-|r Fixed a rare bug where the window for Encounter Details Plugin won't open when clicking on its icon.\n\n|cFFFFFF00-|r Added officer channel to 'Announce Death' feature.\n\n|cFFFFFF00v4.0f (|cFFFFCC00Set 16, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the title bar encounter timer.\n\n|cFFFFFF00v4.0e (|cFFFFCC00Set 14, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added a custom display for Crowd Control Received.\n\n|cFFFFFF00-|r Weak Aura Creator Tool, now has full support for BigWigs and Dbm time bars.\n\n|cFFFFFF00-|r Auras for interrupt and dispelling has been added on the Weak Aura Creator Tool.\n\n|cFFFFFF00-|r Details! Forge now has support for DBM and BigWigs time bars.\n\n|cFFFFFF00-|r Solo Plugins now has a close button on their panels.\n\n|cFFFFFF00-|r Fixed damage/healing score message after a boss kill.\n\n|cFFFFFF00-|r Now, an alert to open the history panel is shown after killing a boss.\n\n|cFFFFFF00-|r Added a 'all-displays' menu when right clicking title bar.\n\n|cFFFFFF00-|r Removed few texture from bookmarks panel, now it has a more clean appearance.\n\n|cFFFFFF00-|r Updated Details! Framework.\n\n|cFFFFFF00-|r Added option in order to change the bar orientation.\n\n|cFFFFFF00-|r Added an option to make the menus on title bar work with clicks instead of hovering over them.\n\n|cFFFFFF00-|r Healing for battleground enemies is now placed on healing done instead of enemy healing done.\n\n|cFFFFFF00-|r Improvements on our support for Arena battles.\n\n|cFFFFFF00-|r Fixed some issues on the Player Detail Window.\n\n|cFFFFFF00-|r Fixed encounter time on title bar text.\n\n|cFFFFFF00-|r Fixed death display tooltip, wasn't respecting the font and size set on options panel.\n\n|cFFFFFF00v3.18.5 (|cFFFFCC00Aug 19, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Improvements on Weakauras creation from Encounter Details plugin.\n\n|cFFFFFF00-|r Improvements on 'Auto Switch to Current' feature. Details! windows are now more responsible about auto changing a segment while the player, for instance, has the report window opened.\n\n|cFFFFFF00-|r Added slash command '/de wipe'. It ends the raid encounter segment and stop capturing data.\nIf you are the raid leader, all other users of Details! will also stop.\nWorks great for players not make damage padding after a wipe call.\n\n|cFFFFFF00-|r Added the overheal made by pets on tooltip and player details window.\n\n|cFFFFFF00-|r Added an option to disable stretch button and bar highlight.\n\n|cFFFFFF00-|r Disabling nicknames now also disable avatars.\n\n|cFFFFFF00-|r Added 'spinal healing injector' on custom display 'Health Potion & Stone' used.\n\n|cFFFFFF00-|r Fixed title text width when auto-hide menu buttons is enabled.\n\n|cFFFFFF00-|r Fixed item level of timewarped items.\n\n|cFFFFFF00-|r Fixed report for custom display Crowd Control.\n\n|cFFFFFF00-|r Fixed role icons on custom displays.\n\n|cFFFFFF00-|r Fixed an issue with dropdown boxes where wasn't showing all options.\n\n|cFFFFFF00-|r Fixed Ticket #53: background alpha after stretching which wasn't correctly coming back to original color.\n\n|cFFFFFF00-|r Fixed ticket #51: API Call 'GetCombat('overall')' wasn't returning the overall combat object.\n\n|cFFFFFF00-|r Fixed ticket #50: issue opening icon selection frame.\n\n|cFFFFFF00v3.17.12 (|cFFFFCC00Aug 05, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option for lock micro displays. When locked they don't interact with mouse or stay on top of menus.\n\n|cFFFFFF00-|r Fixed ticket #49: death display not working correctly with sort direction bottom-to-top.\n\n|cFFFFFF00-|r Fixed an issue with death display where the text wasn't updating their width correctly.\n\n|cFFFFFF00-|r Fixed an issue with energy and miscellaneous displays type not working correctly with bar animations.\n\n|cFFFFFF00-|r Fixed an issue while loading old profiles wans't updating their values for newer versions of the addon.\n\n|cFFFFFF00-|r Fixed an issue with bookmarks panel not opening correctly.\n\n|cFFFFFF00v3.17.10 (|cFFFFCC00Aug 02, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed ticket #47: Title bar font resets with UI reload / relog.\n\n|cFFFFFF00-|r Fixed ticket #46: Icon select panel wasn't opening.\n\n|cFFFFFF00-|r Fixed ticket #45: Windwalker icon for Mistweaver monks.\n\n|cFFFFFF00-|r Fixed issue with vehicles exchanging ownership, e.g. Soulbound Constructor on HFC raid.\n\n|cFFFFFF00v3.17.6 (|cFFFFCC00Jul 16, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Major improvements on the aura tool creation for WeakAuras.\n\n|cFFFFFF00-|r Fixed some issues with spec icons where sometimes it shows four small icons.\n\n|cFFFFFF00-|r Added an option to show a stopwatch on the title text showing the elapsed time of an encounter.\n\n|cFFFFFF00-|r Window title text now shrinks correctly when isn't enough space for it.\n\n|cFFFFFF00-|r For some special cases, left click now open the report window and shift+click shows the tooltip content in the window.\n\n|cFFFFFF00-|r Damage Taken by Spells now are a part of Damage bracket (no more on custom).\n\n|cFFFFFF00-|r Fixed custom functions for the customized bar left text.\n\n|cFFFFFF00-|r Improvements on report text format and also reverse option now works as intended.\n\n|cFFFFFF00-|r Removed the option for report only what is shown in the window.\n\n|cFFFFFF00-|r Added skins for report panel, the skin follow the skin selected for Player Detail Window." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v4.0.6 (|cFFFFCC00Nov 01, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option for numeral system: Western/East Asian.\n\n|cFFFFFF00v4.0.5c (|cFFFFCC00Oct 24, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option to disable the all-displays window (right click on title bar).\n\n|cFFFFFF00-|r Added an option to suppress segment changes after killing a boss encounter (experimental).\n\n|cFFFFFF00-|r Fixed pet battles auto hide.\n\n|cFFFFFF00-|r Fixed an issue with bar animations starting from the middle of the bar.\n\n|cFFFFFF00-|r Fixed buffs and spell cast start on weakauras creator tool.\n\n|cFFFFFF00v4.0.3a (|cFFFFCC00Set 29, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for an error on Damage Taken By Spell display.\n\n|cFFFFFF00v4.0.3 (|cFFFFCC00Set 27, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Some improvements on Plugin's icon at the title bar.\n\n|cFFFFFF00v4.0.2 (|cFFFFCC00Set 26, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added 'ShielTronic Shield' on HealthPotion & Stone display.\n\n|cFFFFFF00-|r Improvements done on Vanguard Plugin.\n\n|cFFFFFF00-|r Fixed an alignment issue which was happening with few tooltips.\n\n|cFFFFFF00-|r Fixed a problem where sometimes the addon crashes while doing a /reload during raid.\n\n|cFFFFFF00-|r Fixed the creation of auras for weakauras from the Forge (/details forge).\n\n|cFFFFFF00v4.0.1 (|cFFFFCC00Set 21, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an options to use a customized skin file.\n\n|cFFFFFF00-|r Added an options to use a customized bar texture file.\n\n|cFFFFFF00-|r A Package with photoshop files with examples and the skin file for Minimalistic skin are available at WoW Interface.\n\n|cFFFFFF00-|r Added 'API Custom Displays.txt' on Details! folder, this file explain how to create scripts for custom displays.\n\n|cFFFFFF00v4.0h (|cFFFFCC00Set 19, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Created new plugin 'Target Caller' for RBGs, it's available at Curse.com.\n\n|cFFFFFF00-|r Fixed death display color when not using colored by the player class.\n\n|cFFFFFF00-|r Fixed a rare bug where the window for Encounter Details Plugin won't open when clicking on its icon.\n\n|cFFFFFF00-|r Added officer channel to 'Announce Death' feature.\n\n|cFFFFFF00v4.0f (|cFFFFCC00Set 16, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the title bar encounter timer.\n\n|cFFFFFF00v4.0e (|cFFFFCC00Set 14, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added a custom display for Crowd Control Received.\n\n|cFFFFFF00-|r Weak Aura Creator Tool, now has full support for BigWigs and Dbm time bars.\n\n|cFFFFFF00-|r Auras for interrupt and dispelling has been added on the Weak Aura Creator Tool.\n\n|cFFFFFF00-|r Details! Forge now has support for DBM and BigWigs time bars.\n\n|cFFFFFF00-|r Solo Plugins now has a close button on their panels.\n\n|cFFFFFF00-|r Fixed damage/healing score message after a boss kill.\n\n|cFFFFFF00-|r Now, an alert to open the history panel is shown after killing a boss.\n\n|cFFFFFF00-|r Added a 'all-displays' menu when right clicking title bar.\n\n|cFFFFFF00-|r Removed few texture from bookmarks panel, now it has a more clean appearance.\n\n|cFFFFFF00-|r Updated Details! Framework.\n\n|cFFFFFF00-|r Added option in order to change the bar orientation.\n\n|cFFFFFF00-|r Added an option to make the menus on title bar work with clicks instead of hovering over them.\n\n|cFFFFFF00-|r Healing for battleground enemies is now placed on healing done instead of enemy healing done.\n\n|cFFFFFF00-|r Improvements on our support for Arena battles.\n\n|cFFFFFF00-|r Fixed some issues on the Player Detail Window.\n\n|cFFFFFF00-|r Fixed encounter time on title bar text.\n\n|cFFFFFF00-|r Fixed death display tooltip, wasn't respecting the font and size set on options panel.\n\n|cFFFFFF00v3.18.5 (|cFFFFCC00Aug 19, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Improvements on Weakauras creation from Encounter Details plugin.\n\n|cFFFFFF00-|r Improvements on 'Auto Switch to Current' feature. Details! windows are now more responsible about auto changing a segment while the player, for instance, has the report window opened.\n\n|cFFFFFF00-|r Added slash command '/de wipe'. It ends the raid encounter segment and stop capturing data.\nIf you are the raid leader, all other users of Details! will also stop.\nWorks great for players not make damage padding after a wipe call.\n\n|cFFFFFF00-|r Added the overheal made by pets on tooltip and player details window.\n\n|cFFFFFF00-|r Added an option to disable stretch button and bar highlight.\n\n|cFFFFFF00-|r Disabling nicknames now also disable avatars.\n\n|cFFFFFF00-|r Added 'spinal healing injector' on custom display 'Health Potion & Stone' used.\n\n|cFFFFFF00-|r Fixed title text width when auto-hide menu buttons is enabled.\n\n|cFFFFFF00-|r Fixed item level of timewarped items.\n\n|cFFFFFF00-|r Fixed report for custom display Crowd Control.\n\n|cFFFFFF00-|r Fixed role icons on custom displays.\n\n|cFFFFFF00-|r Fixed an issue with dropdown boxes where wasn't showing all options.\n\n|cFFFFFF00-|r Fixed Ticket #53: background alpha after stretching which wasn't correctly coming back to original color.\n\n|cFFFFFF00-|r Fixed ticket #51: API Call 'GetCombat('overall')' wasn't returning the overall combat object.\n\n|cFFFFFF00-|r Fixed ticket #50: issue opening icon selection frame.\n\n|cFFFFFF00v3.17.12 (|cFFFFCC00Aug 05, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option for lock micro displays. When locked they don't interact with mouse or stay on top of menus.\n\n|cFFFFFF00-|r Fixed ticket #49: death display not working correctly with sort direction bottom-to-top.\n\n|cFFFFFF00-|r Fixed an issue with death display where the text wasn't updating their width correctly.\n\n|cFFFFFF00-|r Fixed an issue with energy and miscellaneous displays type not working correctly with bar animations.\n\n|cFFFFFF00-|r Fixed an issue while loading old profiles wans't updating their values for newer versions of the addon.\n\n|cFFFFFF00-|r Fixed an issue with bookmarks panel not opening correctly.\n\n|cFFFFFF00v3.17.10 (|cFFFFCC00Aug 02, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed ticket #47: Title bar font resets with UI reload / relog.\n\n|cFFFFFF00-|r Fixed ticket #46: Icon select panel wasn't opening.\n\n|cFFFFFF00-|r Fixed ticket #45: Windwalker icon for Mistweaver monks.\n\n|cFFFFFF00-|r Fixed issue with vehicles exchanging ownership, e.g. Soulbound Constructor on HFC raid.\n\n|cFFFFFF00v3.17.6 (|cFFFFCC00Jul 16, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Major improvements on the aura tool creation for WeakAuras.\n\n|cFFFFFF00-|r Fixed some issues with spec icons where sometimes it shows four small icons.\n\n|cFFFFFF00-|r Added an option to show a stopwatch on the title text showing the elapsed time of an encounter.\n\n|cFFFFFF00-|r Window title text now shrinks correctly when isn't enough space for it.\n\n|cFFFFFF00-|r For some special cases, left click now open the report window and shift+click shows the tooltip content in the window.\n\n|cFFFFFF00-|r Damage Taken by Spells now are a part of Damage bracket (no more on custom).\n\n|cFFFFFF00-|r Fixed custom functions for the customized bar left text.\n\n|cFFFFFF00-|r Improvements on report text format and also reverse option now works as intended.\n\n|cFFFFFF00-|r Removed the option for report only what is shown in the window.\n\n|cFFFFFF00-|r Added skins for report panel, the skin follow the skin selected for Player Detail Window." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r " diff --git a/core/util.lua b/core/util.lua index 2b2919de..e611899c 100644 --- a/core/util.lua +++ b/core/util.lua @@ -84,31 +84,33 @@ return _table end + _detalhes.ToKFunctions = {} + --krKR by @yuk6196 (http://wow.curseforge.com/profiles/yuk6196) function _detalhes:UseEastAsianNumericalSystem() function _detalhes:ToK (numero) if (numero > 100000000) then - return _string_format ("%.2f", numero/100000000) .. Loc ["STRING_ABBREVIATE_LETTER_B_UPPER"] + return _string_format ("%.2f", numero/100000000) .. "억" elseif (numero > 10000) then - return _string_format ("%.2f", numero/10000) ..Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.2f", numero/10000) .. "만" elseif (numero > 1000) then - return _string_format ("%.1f", numero/1000) ..Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _string_format ("%.1f", numero/1000) .. "천" end return numero end function _detalhes:ToK2 (numero) if (numero > 99999999) then - return _string_format ("%.2f", numero/100000000) .. Loc ["STRING_ABBREVIATE_LETTER_B_UPPER"] + return _string_format ("%.2f", numero/100000000) .. "억" elseif (numero > 999999) then - return _string_format ("%.2f", numero/10000) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.2f", numero/10000) .. "만" elseif (numero > 99999) then - return _math_floor (numero/10000) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _math_floor (numero/10000) .. "만" elseif (numero > 9999) then - return _string_format ("%.1f", (numero/10000)) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.1f", (numero/10000)) .. "만" elseif (numero > 999) then - return _string_format ("%.1f", (numero/1000)) .. Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _string_format ("%.1f", (numero/1000)) .. "천" end return _string_format ("%.1f", numero) end @@ -116,37 +118,37 @@ --> short numbers no numbers after comma function _detalhes:ToK0 (numero) if (numero > 100000000) then - return _string_format ("%.0f", numero/100000000) ..Loc ["STRING_ABBREVIATE_LETTER_B_UPPER"] + return _string_format ("%.0f", numero/100000000) .. "억" elseif (numero > 10000) then - return _string_format ("%.0f", numero/10000) ..Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.0f", numero/10000) .. "만" elseif (numero > 1000) then - return _string_format ("%.0f", numero/1000) ..Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _string_format ("%.0f", numero/1000) .. "천" end return _string_format ("%.0f", numero) end function _detalhes:ToKMin (numero) if (numero > 100000000) then - return _string_format ("%.2f", numero/100000000) ..Loc ["STRING_ABBREVIATE_LETTER_B_UPPER"] + return _string_format ("%.2f", numero/100000000) .. "억" elseif (numero > 10000) then - return _string_format ("%.2f", numero/10000) ..Loc ["STRING_ABBREVIATE_LETTER_M_LOWER"] + return _string_format ("%.2f", numero/10000) .. "만" elseif (numero > 1000) then - return _string_format ("%.1f", numero/1000) ..Loc ["STRING_ABBREVIATE_LETTER_K_LOWER"] + return _string_format ("%.1f", numero/1000) .. "천" end return numero end function _detalhes:ToK2Min (numero) if (numero > 99999999) then - return _string_format ("%.2f", numero/100000000) .. Loc ["STRING_ABBREVIATE_LETTER_B_LOWER"] + return _string_format ("%.2f", numero/100000000) .. "억" elseif (numero > 999999) then - return _string_format ("%.2f", numero/10000) .. Loc ["STRING_ABBREVIATE_LETTER_M_LOWER"] + return _string_format ("%.2f", numero/10000) .. "만" elseif (numero > 99999) then - return _math_floor (numero/10000) .. Loc ["STRING_ABBREVIATE_LETTER_M_LOWER"] + return _math_floor (numero/10000) .. "만" elseif (numero > 9999) then - return _string_format ("%.1f", (numero/10000)) .. Loc ["STRING_ABBREVIATE_LETTER_M_LOWER"] + return _string_format ("%.1f", (numero/10000)) .. "만" elseif (numero > 999) then - return _string_format ("%.1f", (numero/1000)) .. Loc ["STRING_ABBREVIATE_LETTER_K_LOWER"] + return _string_format ("%.1f", (numero/1000)) .. "천" end return _string_format ("%.1f", numero) end @@ -154,11 +156,11 @@ --> short numbers no numbers after comma function _detalhes:ToK0Min (numero) if (numero > 100000000) then - return _string_format ("%.0f", numero/100000000) ..Loc ["STRING_ABBREVIATE_LETTER_B_UPPER"] + return _string_format ("%.0f", numero/100000000) .. "억" elseif (numero > 10000) then - return _string_format ("%.0f", numero/10000) ..Loc ["STRING_ABBREVIATE_LETTER_M_LOWER"] + return _string_format ("%.0f", numero/10000) .. "만" elseif (numero > 1000) then - return _string_format ("%.0f", numero/1000) ..Loc ["STRING_ABBREVIATE_LETTER_K_LOWER"] + return _string_format ("%.0f", numero/1000) .. "천" end return _string_format ("%.0f", numero) end @@ -166,11 +168,11 @@ --> short numbers no numbers after comma function _detalhes:ToKReport (numero) if (numero > 100000000) then - return _string_format ("%.2f", numero/100000000) ..Loc ["STRING_ABBREVIATE_LETTER_B_UPPER"] + return _string_format ("%.2f", numero/100000000) .. "억" elseif (numero > 10000) then - return _sting_format ("%.1f", numero/10000) ..Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.1f", numero/10000) .. "만" elseif (numero > 1000) then - return _string_format ("%.0f", numero/1000) ..Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _string_format ("%.0f", numero/1000) .. "천" end return numero end @@ -179,9 +181,9 @@ n = _math_floor (n) if (custom) then if (n > 99999999) then - return _string_format (custom, n/100000000) .. Loc ["STRING_ABBREVIATE_LETTER_B_UPPER"] + return _string_format (custom, n/100000000) .. "억" elseif (n > 9999) then - return _string_format (custom, n/10000) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format (custom, n/10000) .. "만" elseif (n > 999) then return _string_format (custom, (n/1000)) else @@ -191,31 +193,53 @@ return _detalhes.ToKFunctions [_detalhes.ps_abbreviation] (nil, n) end end + + --> no changes + function _detalhes:NoToK (numero) + return _math_floor (numero) + end + -- thanks http://richard.warburton.it + function _detalhes:comma_value (n) + if (not n) then return "0" end + n = _math_floor (n) + if (n == 0) then + return "0" + end + local left,num,right = _string_match (n,'^([^%d]*%d)(%d*)(.-)$') + return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right + end + + wipe (_detalhes.ToKFunctions) + + tinsert (_detalhes.ToKFunctions, _detalhes.NoToK) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK2) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK0) + tinsert (_detalhes.ToKFunctions, _detalhes.ToKMin) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK2Min) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK0Min) + tinsert (_detalhes.ToKFunctions, _detalhes.comma_value) + end - --> load specific ToK functions for East Asia region - if (LibStub("AceLocale-3.0"):NewLocale ("Details", "koKR")) then - _detalhes:UseEastAsianNumericalSystem() - else - --> load the defaults for all other languages - + function _detalhes:UseWestNumericalSystem() --> short numbers function _detalhes:ToK (numero) if (numero > 1000000) then - return _string_format ("%.2f", numero/1000000) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.2f", numero/1000000) .. "M" elseif (numero > 1000) then - return _string_format ("%.1f", numero/1000) .. Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _string_format ("%.1f", numero/1000) .. "K" end return _string_format ("%.1f", numero) end function _detalhes:ToK2 (numero) if (numero > 999999) then - return _string_format ("%.2f", numero/1000000) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.2f", numero/1000000) .. "M" elseif (numero > 99999) then - return _math_floor (numero/1000) .. Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _math_floor (numero/1000) .. "K" elseif (numero > 999) then - return _string_format ("%.1f", (numero/1000)) .. Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _string_format ("%.1f", (numero/1000)) .. "K" end return _string_format ("%.1f", numero) end @@ -223,29 +247,29 @@ --> short numbers no numbers after comma function _detalhes:ToK0 (numero) if (numero > 1000000) then - return _string_format ("%.0f", numero/1000000) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.0f", numero/1000000) .. "M" elseif (numero > 1000) then - return _string_format ("%.0f", numero/1000) .. Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _string_format ("%.0f", numero/1000) .. "K" end return _string_format ("%.0f", numero) end function _detalhes:ToKMin (numero) if (numero > 1000000) then - return _string_format ("%.2f", numero/1000000) .. Loc ["STRING_ABBREVIATE_LETTER_M_LOWER"] + return _string_format ("%.2f", numero/1000000) .. "m" elseif (numero > 1000) then - return _string_format ("%.1f", numero/1000) .. Loc ["STRING_ABBREVIATE_LETTER_K_LOWER"] + return _string_format ("%.1f", numero/1000) .. "k" end return _string_format ("%.1f", numero) end function _detalhes:ToK2Min (numero) if (numero > 999999) then - return _string_format ("%.2f", numero/1000000) .. Loc ["STRING_ABBREVIATE_LETTER_M_LOWER"] + return _string_format ("%.2f", numero/1000000) .. "m" elseif (numero > 99999) then - return _math_floor (numero/1000) .. Loc ["STRING_ABBREVIATE_LETTER_K_LOWER"] + return _math_floor (numero/1000) .. "k" elseif (numero > 999) then - return _string_format ("%.1f", (numero/1000)) .. Loc ["STRING_ABBREVIATE_LETTER_K_LOWER"] + return _string_format ("%.1f", (numero/1000)) .. "k" end return _string_format ("%.1f", numero) end @@ -253,9 +277,9 @@ --> short numbers no numbers after comma function _detalhes:ToK0Min (numero) if (numero > 1000000) then - return _string_format ("%.0f", numero/1000000) .. Loc ["STRING_ABBREVIATE_LETTER_M_LOWER"] + return _string_format ("%.0f", numero/1000000) .. "m" elseif (numero > 1000) then - return _string_format ("%.0f", numero/1000) .. Loc ["STRING_ABBREVIATE_LETTER_K_LOWER"] + return _string_format ("%.0f", numero/1000) .. "k" end return _string_format ("%.0f", numero) end @@ -263,9 +287,9 @@ --> short numbers no numbers after comma function _detalhes:ToKReport (numero) if (numero > 1000000) then - return _string_format ("%.2f", numero/1000000) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format ("%.2f", numero/1000000) .. "M" elseif (numero > 1000) then - return _string_format ("%.1f", numero/1000) .. Loc ["STRING_ABBREVIATE_LETTER_K_UPPER"] + return _string_format ("%.1f", numero/1000) .. "K" end return numero end @@ -274,7 +298,7 @@ n = _math_floor (n) if (custom) then if (n > 999999) then - return _string_format (custom, n/1000000) .. Loc ["STRING_ABBREVIATE_LETTER_M_UPPER"] + return _string_format (custom, n/1000000) .. "M" elseif (n > 999) then return _string_format (custom, (n/1000)) else @@ -284,36 +308,78 @@ return _detalhes.ToKFunctions [_detalhes.ps_abbreviation] (nil, n) end end - end - ---------end of ToK functions---- - - --> no changes - function _detalhes:NoToK (numero) - return _math_floor (numero) - end - -- thanks http://richard.warburton.it - function _detalhes:comma_value (n) - if (not n) then return "0" end - n = _math_floor (n) - if (n == 0) then - return "0" + + --> no changes + function _detalhes:NoToK (numero) + return _math_floor (numero) end - local left,num,right = _string_match (n,'^([^%d]*%d)(%d*)(.-)$') - return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right + + -- thanks http://richard.warburton.it + function _detalhes:comma_value (n) + if (not n) then return "0" end + n = _math_floor (n) + if (n == 0) then + return "0" + end + local left,num,right = _string_match (n,'^([^%d]*%d)(%d*)(.-)$') + return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right + end + + wipe (_detalhes.ToKFunctions) + + tinsert (_detalhes.ToKFunctions, _detalhes.NoToK) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK2) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK0) + tinsert (_detalhes.ToKFunctions, _detalhes.ToKMin) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK2Min) + tinsert (_detalhes.ToKFunctions, _detalhes.ToK0Min) + tinsert (_detalhes.ToKFunctions, _detalhes.comma_value) + + -- end + --> load western as default, the proper method is loaded within the profile + _detalhes:UseWestNumericalSystem() + function _detalhes:GetCurrentToKFunction() return _detalhes.ToKFunctions [_detalhes.ps_abbreviation] end + +------------------------------------------------------------------------------------------------------------ +--> numerical system - _detalhes.ToKFunctions = {_detalhes.NoToK, _detalhes.ToK, _detalhes.ToK2, _detalhes.ToK0, _detalhes.ToKMin, _detalhes.ToK2Min, _detalhes.ToK0Min, _detalhes.comma_value} + function _detalhes:GetNumericalSystem() + return _detalhes.numerical_system + end + + function _detalhes:SelectNumericalSystem (system) + if (not system or type (system) ~= "number") then + system = _detalhes.numerical_system or 1 + end + _detalhes.numerical_system = system + + if (system == 1) then + _detalhes:UseWestNumericalSystem() + elseif (system == 2) then + _detalhes:UseEastAsianNumericalSystem() + end + + _detalhes:UpdateToKFunctions() + end + function _detalhes:UpdateToKFunctions() + _detalhes.atributo_damage:UpdateSelectedToKFunction() + _detalhes.atributo_heal:UpdateSelectedToKFunction() + _detalhes.atributo_energy:UpdateSelectedToKFunction() + _detalhes.atributo_misc:UpdateSelectedToKFunction() + _detalhes.atributo_custom:UpdateSelectedToKFunction() + _detalhes:AtualizaGumpPrincipal (-1, true) + end - - - +--------end of ToK functions---- + --> replacing data for custom texts _detalhes.string = {} diff --git a/functions/profiles.lua b/functions/profiles.lua index 9b283462..0ab6054e 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -539,6 +539,9 @@ function _detalhes:ApplyProfile (profile_name, nosave, is_copy) --> update player detail window _detalhes:ApplyPDWSkin() + + --> update the numerical system + _detalhes:SelectNumericalSystem() if (_detalhes.initializing) then _detalhes.profile_loaded = true @@ -914,11 +917,12 @@ local default_profile = { --> item level tracker track_item_level = true, - --> text sizes + --> text settings font_sizes = {menus = 10}, font_faces = {menus = "Friz Quadrata TT"}, ps_abbreviation = 3, total_abbreviation = 2, + numerical_system = 1, --> performance use_row_animations = false, diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index 733b0c10..edcfaff4 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -3955,13 +3955,8 @@ function window:CreateFrame1() local onSelectTimeAbbreviation = function (_, _, abbreviationtype) _detalhes.ps_abbreviation = abbreviationtype - _detalhes.atributo_damage:UpdateSelectedToKFunction() - _detalhes.atributo_heal:UpdateSelectedToKFunction() - _detalhes.atributo_energy:UpdateSelectedToKFunction() - _detalhes.atributo_misc:UpdateSelectedToKFunction() - _detalhes.atributo_custom:UpdateSelectedToKFunction() + _detalhes:UpdateToKFunctions() - _detalhes:AtualizaGumpPrincipal (-1, true) _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) end local icon = [[Interface\COMMON\mini-hourglass]] @@ -3982,11 +3977,12 @@ function window:CreateFrame1() end local d = g:NewDropDown (frame1, _, "$parentAbbreviateDropdown", "dpsAbbreviateDropdown", 160, dropdown_height, buildAbbreviationMenu, _detalhes.ps_abbreviation, options_dropdown_template) - frame1.dpsAbbreviateDropdown:SetPoint ("left", frame1.dpsAbbreviateLabel, "right", 2, 0) - window:CreateLineBackground2 (frame1, "dpsAbbreviateDropdown", "dpsAbbreviateLabel", Loc ["STRING_OPTIONS_PS_ABBREVIATE_DESC"]) + + --> avatar + local avatar = NickTag:GetNicknameAvatar (UnitGUID ("player"), NICKTAG_DEFAULT_AVATAR, true) local background, cords, color = NickTag:GetNicknameBackground (UnitGUID ("player"), NICKTAG_DEFAULT_BACKGROUND, NICKTAG_DEFAULT_BACKGROUND_CORDS, {1, 1, 1, 1}, true) @@ -3995,6 +3991,29 @@ function window:CreateFrame1() frame1.avatarPreview2.texcoord = cords frame1.avatarPreview2:SetVertexColor (unpack (color)) + --> numerical system + g:NewLabel (frame1, _, "$parentNumericalSystemLabel", "NumericalSystemLabel", Loc ["STRING_NUMERALSYSTEM"], "GameFontHighlightLeft") + + local onSelectNumeralSystem = function (_, _, systemNumber) + _detalhes:SelectNumericalSystem (systemNumber) + end + + + + + local numeralSystems = { + {value = 1, label = Loc ["STRING_NUMERALSYSTEM_ARABIC_WESTERN"], desc = "1K = 1.000 \n10K = 10.000 \n100K = 100.000 \n1M = 1.000.000", onclick = onSelectNumeralSystem, icon = icon, iconcolor = iconcolor, iconsize = iconsize}, + {value = 2, label = Loc ["STRING_NUMERALSYSTEM_MYRIAD_EASTASIA"], desc = "1천 = 1.000 \n1만 = 10.000 \n10만 = 100.000 \n100만 = 1.000.000", onclick = onSelectNumeralSystem, icon = icon, iconcolor = iconcolor, iconsize = iconsize}, + } + + local buildNumeralSystemsMenu = function() + return numeralSystems + end + + local d = g:NewDropDown (frame1, _, "$parentNumericalSystemOfADropdown", "NumericalSystemDropdown", 160, dropdown_height, buildNumeralSystemsMenu, _detalhes.numerical_system, options_dropdown_template) + d:SetPoint ("left", frame1.NumericalSystemLabel, "right", 2, 0) + window:CreateLineBackground2 (frame1, "NumericalSystemDropdown", "NumericalSystemLabel", Loc ["STRING_NUMERALSYSTEM_DESC"]) + --> animate bars g:NewLabel (frame1, _, "$parentAnimateLabel", "animateLabel", Loc ["STRING_OPTIONS_ANIMATEBARS"], "GameFontHighlightLeft") @@ -4221,11 +4240,12 @@ function window:CreateFrame1() {"maxInstancesLabel", 7, true}, {"dpsAbbreviateLabel", 8}, + {"NumericalSystemLabel", 9}, - {frame1.ToolsLabel, 9, true}, - {frame1.EraseDataLabel, 10}, - {frame1.BookmarkButton, 11}, - {frame1.ClassColorsButton, 12}, + {frame1.ToolsLabel, 10, true}, + {frame1.EraseDataLabel, 11}, + {frame1.BookmarkButton, 12}, + {frame1.ClassColorsButton, 13}, --{"WindowControlsLabel", 9, true}, --{"LockButton", 10}, @@ -10370,6 +10390,7 @@ end --> if not window _G.DetailsOptionsWindow1Slider.MyObject:SetValue (_detalhes.segments_amount) --segments _G.DetailsOptionsWindow1SegmentsLockedSlider.MyObject:SetValue (_detalhes.instances_segments_locked) --locked segments + _G.DetailsOptionsWindow1NumericalSystemOfADropdown.MyObject:Select (_detalhes.numerical_system) _G.DetailsOptionsWindow1WheelSpeedSlider.MyObject:SetValue (_detalhes.scroll_speed) _G.DetailsOptionsWindow1SliderMaxInstances.MyObject:SetValue (_detalhes.instances_amount) diff --git a/gumps/janela_welcome.lua b/gumps/janela_welcome.lua index e13f3c93..d8dfa43b 100644 --- a/gumps/janela_welcome.lua +++ b/gumps/janela_welcome.lua @@ -463,8 +463,16 @@ local window_openned_at = time() continuous:SetChecked (true) end - chronometer:SetScript ("OnClick", function() continuous:SetChecked (false); _detalhes.time_type = 1 end) - continuous:SetScript ("OnClick", function() chronometer:SetChecked (false); _detalhes.time_type = 2 end) + chronometer:SetScript ("OnClick", function() + chronometer:SetChecked (true); + continuous:SetChecked (false); + _detalhes.time_type = 1 + end) + continuous:SetScript ("OnClick", function() + continuous:SetChecked (true); + chronometer:SetChecked (false); + _detalhes.time_type = 2 + end) -- @@ -502,7 +510,7 @@ local window_openned_at = time() pleasewait:SetText ("") pleasewait:Hide() end - end) + end) pages [#pages+1] = {pleasewait, free_frame3, thedude, sword_icon, ampulheta, texto2, chronometer, continuous, chronometer_text, continuous_text, window.changemind2Label} @@ -510,6 +518,100 @@ local window_openned_at = time() widget:Hide() end +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> numeral system + + local numeral_image = window:CreateTexture (nil, "overlay") + + numeral_image:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) + numeral_image:SetPoint ("bottomright", window, "bottomright", -10, 10) + numeral_image:SetHeight (125*3)--125 + numeral_image:SetWidth (89*3)--82 + numeral_image:SetAlpha (.05) + numeral_image:SetTexCoord (1, 0, 0, 1) + + g:NewLabel (window, _, "$parentChangeMindNumeralLabel", "changemindNumeralLabel", Loc ["STRING_WELCOME_2"], "GameFontNormal", 9, "orange") + window.changemindNumeralLabel:SetPoint ("center", window, "center") + window.changemindNumeralLabel:SetPoint ("bottom", window, "bottom", 0, 19) + window.changemindNumeralLabel.align = "|" + + local texto2Numeral = window:CreateFontString (nil, "overlay", "GameFontNormal") + texto2Numeral:SetPoint ("topleft", window, "topleft", 20, -80) + texto2Numeral:SetText (Loc ["STRING_NUMERALSYSTEM_DESC"] .. ":") + + local NumeralType1 = CreateFrame ("CheckButton", "WelcomeWindowNumeralType1", window, "ChatConfigCheckButtonTemplate") + NumeralType1:SetPoint ("topleft", window, "topleft", 20, -110) + local NumeralType2 = CreateFrame ("CheckButton", "WelcomeWindowNumeralType2", window, "ChatConfigCheckButtonTemplate") + NumeralType2:SetPoint ("topleft", window, "topleft", 20, -170) + + _G ["WelcomeWindowNumeralType1Text"]:SetText (Loc ["STRING_NUMERALSYSTEM_ARABIC_WESTERN"] .. ": " .. Loc ["STRING_NUMERALSYSTEM_ARABIC_WESTERN_DESC"]) + _G ["WelcomeWindowNumeralType2Text"]:SetText (Loc ["STRING_NUMERALSYSTEM_MYRIAD_EASTASIA"] .. ": " .. Loc ["STRING_NUMERALSYSTEM_ARABIC_MYRIAD_EASTASIA"]) + + local sword_icon2 = window:CreateTexture (nil, "overlay") + sword_icon2:SetTexture ([[Interface\Addons\Details\images\icons2]]) + sword_icon2:SetPoint ("topright", window, "topright", -30, -10) + sword_icon2:SetSize (128*1.4, 64*1.4) + sword_icon2:SetTexCoord (330/512, 509/512, 437/512, 509/512) + sword_icon2:SetDrawLayer ("overlay", 2) + + local thedude2 = window:CreateTexture (nil, "overlay") + --thedude2:SetTexture ([[Interface\TUTORIALFRAME\UI-TutorialFrame-TheDude]]) + thedude2:SetPoint ("bottomright", sword_icon, "bottomleft", 70, 19) + thedude2:SetWidth (128*1.0) + thedude2:SetHeight (128*1.0) + thedude2:SetTexCoord (0, 1, 0, 1) + thedude2:SetDrawLayer ("overlay", 3) + + local NumeralType1_text = window:CreateFontString (nil, "overlay", "GameFontNormal") + NumeralType1_text:SetText ("1K = 1.000 |cFFFFCC00| |r10K = 10.000 |cFFFFCC00| |r100K = 100.000 |cFFFFCC00| |r1M = 1.000.000") + NumeralType1_text:SetWidth (500) + NumeralType1_text:SetHeight (40) + NumeralType1_text:SetJustifyH ("left") + NumeralType1_text:SetJustifyV ("top") + NumeralType1_text:SetTextColor (.8, .8, .8, 1) + --NumeralType1_text:SetPoint ("topleft", _G ["WelcomeWindowNumeralType1Text"], "topright", 0, 0) + NumeralType1_text:SetPoint ("topleft", window, "topleft", 40, -130) + + local NumeralType2_text = window:CreateFontString (nil, "overlay", "GameFontNormal") + NumeralType2_text:SetText ("1천 = 1.000 |cFFFFCC00| |r1만 = 10.000 |cFFFFCC00| |r10만 = 100.000 |cFFFFCC00| |r100만 = 1.000.000") + NumeralType2_text:SetWidth (500) + NumeralType2_text:SetHeight (40) + NumeralType2_text:SetJustifyH ("left") + NumeralType2_text:SetJustifyV ("top") + NumeralType2_text:SetTextColor (.8, .8, .8, 1) + --NumeralType2_text:SetPoint ("topleft", _G ["WelcomeWindowNumeralType2Text"], "topright", 0, 0) + NumeralType2_text:SetPoint ("topleft", window, "topleft", 40, -190) + + NumeralType1:SetHitRectInsets (0, -70, 0, 0) + NumeralType2:SetHitRectInsets (0, -70, 0, 0) + + if (_detalhes.numerical_system == 1) then --> west + NumeralType1:SetChecked (true) + NumeralType2:SetChecked (false) + elseif (_detalhes.numerical_system == 2) then --> east + NumeralType1:SetChecked (false) + NumeralType2:SetChecked (true) + end + + NumeralType1:SetScript ("OnClick", function() + NumeralType1:SetChecked (true); + NumeralType2:SetChecked (false); + _detalhes.numerical_system = 1 + _detalhes:SelectNumericalSystem() + end) + NumeralType2:SetScript ("OnClick", function() + NumeralType2:SetChecked (true); + NumeralType1:SetChecked (false); + _detalhes.numerical_system = 2 + _detalhes:SelectNumericalSystem() + end) + + pages [#pages+1] = {thedude2, sword_icon2, numeral_image, texto2Numeral, NumeralType1, NumeralType2, NumeralType1_text, NumeralType2_text, window.changemindNumeralLabel} + + for _, widget in ipairs (pages[#pages]) do + widget:Hide() + end + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> Skins Page diff --git a/images/icons2.tga b/images/icons2.tga index c7458707a1663161f5e87bc336ea26c0d5d538ba..c41e2e36ad49447227cc3ab9f288b93b25edfb1e 100644 GIT binary patch delta 30478 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 VT#tvx@zA&HtX-4W@i6_q`2ksu=!pOT delta 813 zcmX@RSoGsT;SGx!r<=Mk@^9YGcmv8>%={M0l3>?jg2IH<##TLABT$_d!^bxBIJY_O{4{ z@E98>FL2b`EMf~adb(;Jqrm1hjtxlCDw`*}#WL~z2Lc8#(Fi0r%X?>Gh;8$a#t`!g z@x~Cl6cLCa<`Wx_A+|EHm1+82hI=N}F5rcQ8$V z5d#e5_>#vEC7bOkpF>&tb)TUuqh@AiNN_uLa6?&{y-dv0f7k%^E}sOH4YOqApUz** z$h!IC^q){|YI8ZDii;KrLX>Pixm*IuQeLaWJbk$-(13ZHOrYvCcQ`>==l4cHSP(;J z98N&yrkyMXb4510pNFxuueLzNq;GdXSkwQ+Fmi2{d{_z9yE_@kWqyvrefXvVD(jF1 zbbb4$GUn-`)xc2u_&pvXv03bIG=#PN8Y5#Il*z)z2ou%jVhn|v0Sp1I?N50bBN2So z?F$4M{gL@WqKv^%Q*