You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1211 lines
54 KiB
1211 lines
54 KiB
-- WarriorFury.lua
|
|
-- June 2018
|
|
|
|
local addon, ns = ...
|
|
local Hekili = _G[ addon ]
|
|
|
|
local class = Hekili.Class
|
|
local state = Hekili.State
|
|
|
|
local IsActiveSpell = ns.IsActiveSpell
|
|
|
|
local FindUnitBuffByID = ns.FindUnitBuffByID
|
|
|
|
|
|
-- Conduits
|
|
-- [x] depths_of_insanity
|
|
-- [-] hack_and_slash
|
|
-- [-] vicious_contempt
|
|
|
|
|
|
if UnitClassBase( 'player' ) == 'WARRIOR' then
|
|
local spec = Hekili:NewSpecialization( 72 )
|
|
|
|
local base_rage_gen, fury_rage_mult = 1.75, 1.00
|
|
local offhand_mod = 0.50
|
|
|
|
spec:RegisterResource( Enum.PowerType.Rage, {
|
|
mainhand_fury = {
|
|
swing = "mainhand",
|
|
|
|
last = function ()
|
|
local swing = state.swings.mainhand
|
|
local t = state.query_time
|
|
|
|
return swing + floor( ( t - swing ) / state.swings.mainhand_speed ) * state.swings.mainhand_speed
|
|
end,
|
|
|
|
interval = "mainhand_speed",
|
|
|
|
stop = function () return state.time == 0 or state.swings.mainhand == 0 end,
|
|
value = function ()
|
|
return ( state.talent.war_machine.enabled and 1.1 or 1 ) * base_rage_gen * fury_rage_mult * state.swings.mainhand_speed / state.haste
|
|
end
|
|
},
|
|
|
|
offhand_fury = {
|
|
swing = "offhand",
|
|
|
|
last = function ()
|
|
local swing = state.swings.offhand
|
|
local t = state.query_time
|
|
|
|
return swing + floor( ( t - swing ) / state.swings.offhand_speed ) * state.swings.offhand_speed
|
|
end,
|
|
|
|
interval = "offhand_speed",
|
|
|
|
stop = function () return state.time == 0 or state.swings.offhand == 0 end,
|
|
value = function ()
|
|
return ( state.talent.war_machine.enabled and 1.1 or 1 ) * base_rage_gen * fury_rage_mult * state.swings.offhand_speed * offhand_mod / state.haste
|
|
end,
|
|
},
|
|
|
|
bladestorm = {
|
|
aura = "bladestorm",
|
|
|
|
last = function ()
|
|
local app = state.buff.bladestorm.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( ( t - app ) / state.haste ) * state.haste
|
|
end,
|
|
|
|
interval = function () return state.haste end,
|
|
|
|
value = 5,
|
|
},
|
|
|
|
battle_trance = {
|
|
aura = "battle_trance",
|
|
|
|
last = function ()
|
|
local app = state.buff.battle_trance.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( ( t - app ) / 3 ) * 3
|
|
end,
|
|
|
|
interval = 3,
|
|
|
|
value = 5,
|
|
},
|
|
|
|
conquerors_banner = {
|
|
aura = "conquerors_banner",
|
|
|
|
last = function ()
|
|
local app = state.buff.conquerors_banner.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( t - app )
|
|
end,
|
|
|
|
interval = 1,
|
|
|
|
value = 4,
|
|
},
|
|
} )
|
|
|
|
-- Talents
|
|
spec:RegisterTalents( {
|
|
war_machine = 22632, -- 262231
|
|
sudden_death = 22633, -- 280721
|
|
fresh_meat = 22491, -- 215568
|
|
|
|
double_time = 19676, -- 103827
|
|
impending_victory = 22625, -- 202168
|
|
storm_bolt = 23093, -- 107570
|
|
|
|
massacre = 22379, -- 206315
|
|
frenzy = 22381, -- 335077
|
|
onslaught = 23372, -- 315720
|
|
|
|
furious_charge = 23097, -- 202224
|
|
bounding_stride = 22627, -- 202163
|
|
warpaint = 22382, -- 208154
|
|
|
|
seethe = 22383, -- 335091
|
|
frothing_berserker = 22393, -- 215571
|
|
cruelty = 19140, -- 335070
|
|
|
|
meat_cleaver = 22396, -- 280392
|
|
dragon_roar = 22398, -- 118000
|
|
bladestorm = 22400, -- 46924
|
|
|
|
anger_management = 22405, -- 152278
|
|
reckless_abandon = 22402, -- 202751
|
|
siegebreaker = 16037, -- 280772
|
|
} )
|
|
|
|
-- PvP Talents
|
|
spec:RegisterPvpTalents( {
|
|
barbarian = 166, -- 280745
|
|
battle_trance = 170, -- 213857
|
|
bloodrage = 172, -- 329038
|
|
death_sentence = 25, -- 198500
|
|
death_wish = 179, -- 199261
|
|
demolition = 5373, -- 329033
|
|
disarm = 3533, -- 236077
|
|
enduring_rage = 177, -- 198877
|
|
master_and_commander = 3528, -- 235941
|
|
slaughterhouse = 3735, -- 352998
|
|
warbringer = 5431, -- 356353
|
|
} )
|
|
|
|
|
|
-- Auras
|
|
spec:RegisterAuras( {
|
|
battle_shout = {
|
|
id = 6673,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
shared = "player", -- check for anyone's buff on the player.
|
|
},
|
|
berserker_rage = {
|
|
id = 18499,
|
|
duration = 6,
|
|
type = "",
|
|
max_stack = 1,
|
|
},
|
|
bladestorm = {
|
|
id = 46924,
|
|
duration = function () return 4 * haste end,
|
|
max_stack = 1,
|
|
},
|
|
bounding_stride = {
|
|
id = 202164,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
},
|
|
charge = {
|
|
id = 105771,
|
|
duration = 1,
|
|
max_stack = 1,
|
|
},
|
|
enrage = {
|
|
id = 184362,
|
|
duration = 4,
|
|
max_stack = 1,
|
|
},
|
|
enraged_regeneration = {
|
|
id = 184364,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
frenzy = {
|
|
id = 335082,
|
|
duration = 12,
|
|
max_stack = 4,
|
|
},
|
|
furious_charge = {
|
|
id = 202225,
|
|
duration = 5,
|
|
max_stack = 1,
|
|
},
|
|
hamstring= {
|
|
id = 1715,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
ignore_pain = {
|
|
id = 190456,
|
|
duration = 12,
|
|
max_stack = 1,
|
|
},
|
|
intimidating_shout = {
|
|
id = 5246,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
piercing_howl = {
|
|
id = 12323,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
rallying_cry = {
|
|
id = 97463,
|
|
duration = function () return ( azerite.moment_of_glory.enabled and 12 or 10 ) * ( 1 + conduit.inspiring_presence.mod * 0.01 ) end,
|
|
max_stack = 1,
|
|
},
|
|
recklessness = {
|
|
id = 1719,
|
|
duration = function () return ( level > 51 and 12 or 10 ) * ( 1 + conduit.depths_of_insanity.mod * 0.01 ) end,
|
|
max_stack = 1,
|
|
},
|
|
siegebreaker = {
|
|
id = 280773,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
spell_reflection = {
|
|
id = 23920,
|
|
duration = function () return legendary.misshapen_mirror.enabled and 8 or 5 end,
|
|
max_stack = 1,
|
|
},
|
|
storm_bolt = {
|
|
id = 132169,
|
|
duration = 4,
|
|
max_stack = 1,
|
|
},
|
|
sudden_death = {
|
|
id = 280776,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
taunt = {
|
|
id = 355,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
},
|
|
victorious = {
|
|
id = 32216,
|
|
duration = 20,
|
|
max_stack = 1,
|
|
},
|
|
whirlwind = {
|
|
id = 85739,
|
|
duration = 20,
|
|
max_stack = function () return talent.meat_cleaver.enabled and 4 or 2 end,
|
|
copy = "meat_cleaver"
|
|
},
|
|
|
|
|
|
-- Azerite Powers
|
|
gathering_storm = {
|
|
id = 273415,
|
|
duration = 6,
|
|
max_stack = 5,
|
|
},
|
|
|
|
-- Cold Steel, Hot Blood
|
|
gushing_wound = {
|
|
id = 288091,
|
|
duration = 6,
|
|
max_stack = 1,
|
|
},
|
|
|
|
intimidating_presence = {
|
|
id = 288644,
|
|
duration = 12,
|
|
max_stack = 1,
|
|
},
|
|
|
|
moment_of_glory = {
|
|
id = 280210,
|
|
duration = 12,
|
|
max_stack = 1,
|
|
},
|
|
|
|
|
|
-- PvP Talents
|
|
battle_trance = {
|
|
id = 213858,
|
|
duration = 18,
|
|
max_stack = 1
|
|
},
|
|
} )
|
|
|
|
|
|
-- Tier 28
|
|
spec:RegisterSetBonuses( "tier28_2pc", 364554, "tier28_4pc", 363738 )
|
|
-- 2-Set - Frenzied Destruction - Raging Blow deals 15% increased damage and gains an additional charge.
|
|
-- 4-Set - Frenzied Destruction - Raging Blow has a 20% chance to grant Recklessness for 4 sec.
|
|
-- Now appropriately grants Crushing Blow and Bloodbath when Reckless Abandon is talented, and no longer grants 50 Rage when Recklessness triggers while Reckless Abandon is talented.
|
|
|
|
|
|
spec:RegisterGear( 'tier20', 147187, 147188, 147189, 147190, 147191, 147192 )
|
|
spec:RegisterAura( "raging_thirst", {
|
|
id = 242300,
|
|
duration = 8
|
|
} ) -- fury 2pc.
|
|
spec:RegisterAura( "bloody_rage", {
|
|
id = 242952,
|
|
duration = 10,
|
|
max_stack = 10
|
|
} ) -- fury 4pc.
|
|
|
|
spec:RegisterGear( 'tier21', 152178, 152179, 152180, 152181, 152182, 152183 )
|
|
spec:RegisterAura( "slaughter", {
|
|
id = 253384,
|
|
duration = 4
|
|
} ) -- fury 2pc dot.
|
|
spec:RegisterAura( "outrage", {
|
|
id = 253385,
|
|
duration = 8
|
|
} ) -- fury 4pc.
|
|
|
|
spec:RegisterGear( "ceannar_charger", 137088 )
|
|
spec:RegisterGear( "timeless_stratagem", 143728 )
|
|
spec:RegisterGear( "kazzalax_fujiedas_fury", 137053 )
|
|
spec:RegisterAura( "fujiedas_fury", {
|
|
id = 207776,
|
|
duration = 10,
|
|
max_stack = 4
|
|
} )
|
|
spec:RegisterGear( "mannoroths_bloodletting_manacles", 137107 ) -- NYI.
|
|
spec:RegisterGear( "najentuss_vertebrae", 137087 )
|
|
spec:RegisterGear( "valarjar_berserkers", 151824 )
|
|
spec:RegisterGear( "ayalas_stone_heart", 137052 )
|
|
spec:RegisterAura( "stone_heart", { id = 225947,
|
|
duration = 10
|
|
} )
|
|
spec:RegisterGear( "the_great_storms_eye", 151823 )
|
|
spec:RegisterAura( "tornados_eye", {
|
|
id = 248142,
|
|
duration = 6,
|
|
max_stack = 6
|
|
} )
|
|
spec:RegisterGear( "archavons_heavy_hand", 137060 )
|
|
spec:RegisterGear( "weight_of_the_earth", 137077 ) -- NYI.
|
|
|
|
spec:RegisterGear( "soul_of_the_battlelord", 151650 )
|
|
|
|
state.IsActiveSpell = IsActiveSpell
|
|
|
|
local whirlwind_consumers = {
|
|
bloodthirst = 1,
|
|
execute = 1,
|
|
impending_victory = 1,
|
|
raging_blow = 1,
|
|
rampage = 1,
|
|
siegebreaker = 1,
|
|
victory_rush = 1
|
|
}
|
|
|
|
local whirlwind_gained = 0
|
|
local whirlwind_stacks = 0
|
|
|
|
local rageSpent = 0
|
|
local gloryRage = 0
|
|
|
|
local fresh_meat_actual = {}
|
|
local fresh_meat_virtual = {}
|
|
|
|
|
|
spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
|
|
|
|
if sourceGUID == state.GUID then
|
|
if subtype == "SPELL_CAST_SUCCESS" then
|
|
local ability = class.abilities[ spellID ]
|
|
|
|
if not ability then return end
|
|
|
|
if ability.key == "whirlwind" then
|
|
whirlwind_gained = GetTime()
|
|
whirlwind_stacks = state.talent.meat_cleaver.enabled and 4 or 2
|
|
|
|
elseif whirlwind_consumers[ ability.key ] and whirlwind_stacks > 0 then
|
|
whirlwind_stacks = whirlwind_stacks - 1
|
|
|
|
end
|
|
|
|
if ability.key == "conquerors_banner" then
|
|
rageSinceBanner = 0
|
|
end
|
|
|
|
elseif state.talent.fresh_meat.enabled and spellID == 23881 and subtype == "SPELL_DAMAGE" and not fresh_meat_actual[ destGUID ] and UnitGUID( "target" ) == destGUID then
|
|
fresh_meat_actual[ destGUID ] = true
|
|
end
|
|
end
|
|
end )
|
|
|
|
|
|
local wipe = table.wipe
|
|
|
|
spec:RegisterEvent( "PLAYER_REGEN_ENABLED", function()
|
|
wipe( fresh_meat_actual )
|
|
end )
|
|
|
|
spec:RegisterHook( "UNIT_ELIMINATED", function( id )
|
|
fresh_meat_actual[ id ] = nil
|
|
end )
|
|
|
|
|
|
local RAGE = Enum.PowerType.Rage
|
|
local lastRage = -1
|
|
|
|
spec:RegisterUnitEvent( "UNIT_POWER_FREQUENT", "player", nil, function( event, unit, powerType )
|
|
if powerType == "RAGE" then
|
|
local current = UnitPower( "player", RAGE )
|
|
|
|
if current < lastRage then
|
|
rageSpent = ( rageSpent + lastRage - current ) % 20 -- Recklessness.
|
|
|
|
if state.legendary.glory.enabled and FindUnitBuffByID( "player", 324143 ) then
|
|
gloryRage = ( gloryRage + lastRage - current ) % 20 -- Glory.
|
|
end
|
|
end
|
|
|
|
lastRage = current
|
|
end
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "rage_spent", function ()
|
|
return rageSpent
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "glory_rage", function ()
|
|
return gloryRage
|
|
end )
|
|
|
|
|
|
spec:RegisterHook( "spend", function( amt, resource )
|
|
if resource == "rage" then
|
|
if talent.recklessness.enabled then
|
|
rage_spent = rage_spent + amt
|
|
cooldown.recklessness.expires = cooldown.recklessness.expires - floor( rage_spent / 20 )
|
|
rage_spent = rage_spent % 20
|
|
end
|
|
|
|
if legendary.glory.enabled and buff.conquerors_banner.up then
|
|
glory_rage = glory_rage + amt
|
|
local reduction = floor( glory_rage / 20 ) * 0.5
|
|
glory_rage = glory_rage % 20
|
|
|
|
buff.conquerors_banner.expires = buff.conquerors_banner.expires + reduction
|
|
end
|
|
end
|
|
end )
|
|
|
|
|
|
local WillOfTheBerserker = setfenv( function()
|
|
applyBuff( "will_of_the_berserker" )
|
|
end, state )
|
|
|
|
|
|
|
|
|
|
spec:RegisterHook( "TimeToReady", function( wait, action )
|
|
local id = class.abilities[ action ].id
|
|
if buff.bladestorm.up and ( id < -99 or id > 0 ) then
|
|
wait = max( wait, buff.bladestorm.remains )
|
|
end
|
|
return wait
|
|
end )
|
|
|
|
|
|
spec:RegisterHook( "reset_precast", function ()
|
|
rage_spent = nil
|
|
rage_since_banner = nil
|
|
|
|
if buff.bladestorm.up and buff.gathering_storm.up then
|
|
applyBuff( "gathering_storm", buff.bladestorm.remains + 6, 5 )
|
|
end
|
|
|
|
if buff.whirlwind.up then
|
|
if whirlwind_stacks == 0 then removeBuff( "whirlwind" )
|
|
elseif whirlwind_stacks < buff.whirlwind.stack then
|
|
applyBuff( "whirlwind", buff.whirlwind.remains, whirlwind_stacks )
|
|
end
|
|
end
|
|
|
|
if legendary.will_of_the_berserker.enabled and buff.recklessness.up then
|
|
state:QueueAuraExpiration( "recklessness", WillOfTheBerserker, buff.recklessness.expires )
|
|
end
|
|
|
|
wipe( fresh_meat_virtual )
|
|
active_dot.hit_by_fresh_meat = 0
|
|
|
|
for k, v in pairs( fresh_meat_actual ) do
|
|
fresh_meat_virtual[ k ] = v
|
|
|
|
if k == target.unit then
|
|
applyDebuff( "target", "hit_by_fresh_meat" )
|
|
else
|
|
active_dot.hit_by_fresh_meat = active_dot.hit_by_fresh_meat + 1
|
|
end
|
|
end
|
|
end )
|
|
|
|
|
|
-- Abilities
|
|
spec:RegisterAbilities( {
|
|
battle_shout = {
|
|
id = 6673,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 132333,
|
|
|
|
essential = true,
|
|
nobuff = "battle_shout",
|
|
|
|
handler = function ()
|
|
applyBuff( "battle_shout" )
|
|
end,
|
|
},
|
|
|
|
|
|
berserker_rage = {
|
|
id = 18499,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "off",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = false,
|
|
texture = 136009,
|
|
|
|
handler = function ()
|
|
applyBuff( "berserker_rage" )
|
|
end,
|
|
},
|
|
|
|
|
|
bladestorm = {
|
|
id = 46924,
|
|
cast = function () return 4 * haste end,
|
|
channeled = true,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = true,
|
|
texture = 236303,
|
|
|
|
talent = "bladestorm",
|
|
range = 8,
|
|
|
|
start = function ()
|
|
applyBuff( "bladestorm" )
|
|
gain( 5, "rage" )
|
|
|
|
if azerite.gathering_storm.enabled then
|
|
applyBuff( "gathering_storm", 6 + ( 4 * haste ), 5 )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
bloodbath = {
|
|
id = 335096,
|
|
known = 23881,
|
|
cast = 0,
|
|
cooldown = 4.5,
|
|
hasteCD = true,
|
|
gcd = "spell",
|
|
|
|
spend = function () return ( talent.seethe.enabled and ( stat.crit >= 100 and -4 or -2 ) or 0 ) - 8 end,
|
|
spendType = "rage",
|
|
|
|
cycle = function () return talent.fresh_meat.enabled and "hit_by_fresh_meat" or nil end,
|
|
|
|
startsCombat = true,
|
|
texture = 236304,
|
|
|
|
bind = "bloodthirst",
|
|
talent = "reckless_abandon",
|
|
buff = "recklessness",
|
|
|
|
handler = function ()
|
|
gain( health.max * ( buff.enraged_regeneration.up and 0.23 or 0.03 ), "health" )
|
|
|
|
removeBuff( "bloody_rage" )
|
|
removeStack( "whirlwind" )
|
|
|
|
if azerite.cold_steel_hot_blood.enabled and stat.crit >= 100 then
|
|
applyDebuff( "target", "gushing_wound" )
|
|
gain( 4, "rage" )
|
|
end
|
|
|
|
if legendary.cadence_of_fujieda.enabled then
|
|
if buff.cadence_of_fujieda.stack < 5 then stat.haste = stat.haste + 0.01 end
|
|
addStack( "cadence_of_fujieda", nil, 1 )
|
|
end
|
|
|
|
if talent.fresh_meat.enabled and debuff.hit_by_fresh_meat.down then
|
|
applyBuff( "enrage" )
|
|
applyDebuff( "target", "hit_by_fresh_meat" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
|
|
bloodthirst = {
|
|
id = 23881,
|
|
cast = 0,
|
|
cooldown = 4.5,
|
|
hasteCD = true,
|
|
gcd = "spell",
|
|
|
|
spend = function () return ( talent.seethe.enabled and ( stat.crit >= 100 and -4 or -2 ) or 0 ) - 8 end,
|
|
spendType = "rage",
|
|
|
|
cycle = function () return talent.fresh_meat.enabled and "hit_by_fresh_meat" or nil end,
|
|
|
|
startsCombat = true,
|
|
texture = 136012,
|
|
|
|
bind = "bloodbath",
|
|
|
|
readyTime = function()
|
|
if talent.reckless_abandon.enabled then return buff.recklessness.remains end
|
|
return 0
|
|
end,
|
|
|
|
handler = function ()
|
|
gain( health.max * ( buff.enraged_regeneration.up and 0.23 or 0.03 ), "health" )
|
|
|
|
removeBuff( "bloody_rage" )
|
|
removeStack( "whirlwind" )
|
|
|
|
if azerite.cold_steel_hot_blood.enabled and stat.crit >= 100 then
|
|
applyDebuff( "target", "gushing_wound" )
|
|
gain( 4, "rage" )
|
|
end
|
|
|
|
if legendary.cadence_of_fujieda.enabled then
|
|
if buff.cadence_of_fujieda.stack < 5 then stat.haste = stat.haste + 0.01 end
|
|
addStack( "cadence_of_fujieda", nil, 1 )
|
|
end
|
|
|
|
if talent.fresh_meat.enabled and debuff.hit_by_fresh_meat.down then
|
|
applyBuff( "enrage" )
|
|
applyDebuff( "target", "hit_by_fresh_meat" )
|
|
end
|
|
end,
|
|
|
|
auras = {
|
|
cadence_of_fujieda = {
|
|
id = 335558,
|
|
duration = 12,
|
|
max_stack = 5,
|
|
},
|
|
hit_by_fresh_meat = {
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
}
|
|
},
|
|
},
|
|
|
|
|
|
charge = {
|
|
id = 100,
|
|
cast = 0,
|
|
charges = function () return talent.double_time.enabled and 2 or nil end,
|
|
cooldown = function () return talent.double_time.enabled and 17 or 20 end,
|
|
recharge = function () return talent.double_time.enabled and 17 or 20 end,
|
|
gcd = "off",
|
|
|
|
startsCombat = true,
|
|
texture = 132337,
|
|
|
|
usable = function () return target.distance > 10 and ( query_time - action.charge.lastCast > gcd.execute ) end,
|
|
handler = function ()
|
|
applyDebuff( "target", "charge" )
|
|
if talent.furious_charge.enabled then applyBuff( "furious_charge" ) end
|
|
setDistance( 5 )
|
|
end,
|
|
},
|
|
|
|
|
|
crushing_blow = {
|
|
id = 335097,
|
|
known = 85288,
|
|
cast = 0,
|
|
charges = function () return set_bonus.tier28_2pc > 0 and 3 or 2 end,
|
|
cooldown = 8,
|
|
recharge = 8,
|
|
hasteCD = true,
|
|
gcd = "spell",
|
|
|
|
spend = -12,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 132215,
|
|
|
|
bind = "raging_blow",
|
|
talent = "reckless_abandon",
|
|
buff = "recklessness",
|
|
|
|
handler = function ()
|
|
removeStack( "whirlwind" )
|
|
if talent.reckless_abandon.enabled then spendCharges( "raging_blow", 1 ) end
|
|
|
|
if buff.will_of_the_berserker.up then buff.will_of_the_berserker.expires = query_time + 12 end
|
|
end,
|
|
},
|
|
|
|
|
|
dragon_roar = {
|
|
id = 118000,
|
|
cast = 0,
|
|
cooldown = 35,
|
|
gcd = "spell",
|
|
|
|
spend = -10,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 642418,
|
|
|
|
talent = "dragon_roar",
|
|
range = 12,
|
|
},
|
|
|
|
|
|
enraged_regeneration = {
|
|
id = 184364,
|
|
cast = 0,
|
|
cooldown = function () return 120 - conduit.stalwart_guardian.mod * 0.001 end,
|
|
gcd = "off",
|
|
|
|
toggle = "defensives",
|
|
|
|
startsCombat = false,
|
|
texture = 132345,
|
|
|
|
handler = function ()
|
|
applyBuff( "enraged_regeneration" )
|
|
end,
|
|
},
|
|
|
|
|
|
execute = {
|
|
id = function () return IsActiveSpell( 280735 ) and 280735 or 5308 end,
|
|
known = 5308,
|
|
noOverride = 317485,
|
|
cast = 0,
|
|
cooldown = 6,
|
|
hasteCD = true,
|
|
gcd = "spell",
|
|
|
|
spend = -20,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 135358,
|
|
|
|
usable = function () return buff.sudden_death.up or buff.stone_heart.up or target.health.pct < ( IsActiveSpell( 280735 ) and 35 or 20 ) end,
|
|
handler = function ()
|
|
if buff.stone_heart.up then removeBuff( "stone_heart" )
|
|
elseif buff.sudden_death.up then removeBuff( "sudden_death" ) end
|
|
removeStack( "whirlwind" )
|
|
end,
|
|
|
|
copy = { 280735, 5308 }
|
|
},
|
|
|
|
|
|
heroic_leap = {
|
|
id = 6544,
|
|
cast = 0,
|
|
cooldown = function () return talent.bounding_stride.enabled and 30 or 45 end,
|
|
charges = function () return legendary.leaper.enabled and 3 or nil end,
|
|
recharge = function () return legendary.leaper.enabled and ( talent.bounding_stride.enabled and 30 or 45 ) or nil end,
|
|
gcd = "off",
|
|
|
|
startsCombat = false,
|
|
texture = 236171,
|
|
|
|
usable = function () return ( query_time - action.heroic_leap.lastCast > gcd.execute ) end,
|
|
handler = function ()
|
|
setDistance( 15 ) -- probably heroic_leap + charge combo.
|
|
if talent.bounding_stride.enabled then applyBuff( "bounding_stride" ) end
|
|
end,
|
|
|
|
copy = 52174
|
|
},
|
|
|
|
ignore_pain = {
|
|
id = 190456,
|
|
cast = 0,
|
|
cooldown = 12,
|
|
gcd = "off",
|
|
|
|
toggle = "defensives",
|
|
|
|
spend = 80,
|
|
spendType = "rage",
|
|
|
|
startsCombat = false,
|
|
texture = 1377132,
|
|
|
|
handler = function ()
|
|
applyBuff( "ignore_pain" )
|
|
end,
|
|
},
|
|
|
|
|
|
impending_victory = {
|
|
id = 202168,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
spend = 10,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 589768,
|
|
|
|
talent = "impending_victory",
|
|
|
|
handler = function ()
|
|
gain( health.max * 0.3, "health" )
|
|
removeStack( "whirlwind" )
|
|
if conduit.indelible_victory.enabled then applyBuff( "indelible_victory" ) end
|
|
end,
|
|
},
|
|
|
|
|
|
intimidating_shout = {
|
|
id = 5246,
|
|
cast = 0,
|
|
cooldown = 90,
|
|
gcd = "spell",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = true,
|
|
texture = 132154,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "intimidating_shout" )
|
|
--if azerite.intimidating_presence.enabled then applyDebuff( "target", "intimidating_presence" ) end
|
|
end,
|
|
},
|
|
|
|
|
|
onslaught = {
|
|
id = 315720,
|
|
cast = 0,
|
|
cooldown = 12,
|
|
hasteCD = true,
|
|
gcd = "spell",
|
|
|
|
spend = -15,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 132364,
|
|
|
|
buff = "enrage",
|
|
|
|
handler = function ()
|
|
removeStack( "whirlwind" )
|
|
end,
|
|
},
|
|
|
|
piercing_howl = {
|
|
id = 12323,
|
|
cast = 0,
|
|
cooldown = function () return 30 + conduit.disturb_the_peace.mod * 0.001 end,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 136147,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "piercing_howl" )
|
|
end,
|
|
},
|
|
|
|
|
|
pummel = {
|
|
id = 6552,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
gcd = "off",
|
|
|
|
startsCombat = true,
|
|
texture = 132938,
|
|
|
|
toggle = "interrupts",
|
|
|
|
debuff = "casting",
|
|
readyTime = state.timeToInterrupt,
|
|
|
|
handler = function ()
|
|
interrupt()
|
|
end,
|
|
},
|
|
|
|
|
|
raging_blow = {
|
|
id = 85288,
|
|
cast = 0,
|
|
charges = function () return set_bonus.tier28_2pc > 0 and 3 or 2 end,
|
|
cooldown = 8,
|
|
recharge = 8,
|
|
hasteCD = true,
|
|
gcd = "spell",
|
|
|
|
spend = -12,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 589119,
|
|
|
|
bind = "crushing_blow",
|
|
|
|
readyTime = function ()
|
|
if talent.reckless_abandon.enabled then return buff.recklessness.remains end
|
|
return 0
|
|
end,
|
|
|
|
handler = function ()
|
|
removeStack( "whirlwind" )
|
|
if talent.reckless_abandon.enabled then spendCharges( "crushing_blow", 1 ) end
|
|
|
|
if buff.will_of_the_berserker.up then buff.will_of_the_berserker.expires = query_time + 12 end
|
|
end,
|
|
},
|
|
|
|
|
|
rallying_cry = {
|
|
id = 97462,
|
|
cast = 0,
|
|
cooldown = 180,
|
|
gcd = "spell",
|
|
|
|
toggle = "defensives",
|
|
|
|
startsCombat = false,
|
|
texture = 132351,
|
|
|
|
handler = function ()
|
|
applyBuff( "rallying_cry" )
|
|
|
|
if azerite.moment_of_glory.enabled then applyBuff( "moment_of_glory" ) end
|
|
end,
|
|
},
|
|
|
|
|
|
rampage = {
|
|
id = 184367,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 80,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
if talent.frenzy.enabled then addStack( "frenzy", nil, 1 ) end
|
|
applyBuff( "enrage" )
|
|
removeStack( "whirlwind" )
|
|
end,
|
|
},
|
|
|
|
|
|
recklessness = {
|
|
id = 1719,
|
|
cast = 0,
|
|
cooldown = 90,
|
|
gcd = "off",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = false,
|
|
texture = 458972,
|
|
|
|
handler = function ()
|
|
applyBuff( "recklessness" )
|
|
if talent.reckless_abandon.enabled then
|
|
gain( 50, "rage" )
|
|
end
|
|
if legendary.will_of_the_berserker.enabled then
|
|
state:QueueAuraExpiration( "recklessness", WillOfTheBerserker, buff.recklessness.expires )
|
|
end
|
|
end,
|
|
|
|
auras = {
|
|
will_of_the_berserker = {
|
|
id = 335597,
|
|
duration = 12,
|
|
max_stack = 1
|
|
}
|
|
}
|
|
},
|
|
|
|
shattering_throw = {
|
|
id = 64382,
|
|
cast = 1.5,
|
|
cooldown = 180,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 311430,
|
|
|
|
range = 30,
|
|
},
|
|
|
|
|
|
siegebreaker = {
|
|
id = 280772,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
spend = -10,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 294382,
|
|
|
|
talent = "siegebreaker",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "siegebreaker" )
|
|
removeStack( "whirlwind" )
|
|
end,
|
|
},
|
|
|
|
|
|
slam = {
|
|
id = 1464,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
spend = 20,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 132340,
|
|
|
|
handler = function ()
|
|
removeStack( "whirlwind" )
|
|
end,
|
|
},
|
|
|
|
|
|
spell_reflection = {
|
|
id = 23920,
|
|
cast = 0,
|
|
cooldown = 25,
|
|
gcd = "off",
|
|
|
|
toggle = "interrupts",
|
|
|
|
startsCombat = false,
|
|
texture = 132361,
|
|
|
|
debuff = "casting",
|
|
readyTime = state.timeToInterrupt,
|
|
|
|
handler = function ()
|
|
applyBuff( "spell_reflection" )
|
|
end,
|
|
},
|
|
|
|
storm_bolt = {
|
|
id = 107570,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 613535,
|
|
|
|
talent = "storm_bolt",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "storm_bolt" )
|
|
end,
|
|
},
|
|
|
|
|
|
taunt = {
|
|
id = 355,
|
|
cast = 0,
|
|
cooldown = 8,
|
|
gcd = "off",
|
|
|
|
startsCombat = true,
|
|
texture = 136080,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "taunt" )
|
|
end,
|
|
},
|
|
|
|
|
|
victory_rush = {
|
|
id = 34428,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 132342,
|
|
|
|
notalent = "impending_victory",
|
|
buff = "victorious",
|
|
|
|
handler = function ()
|
|
removeBuff( "victorious" )
|
|
removeStack( "whirlwind" )
|
|
if conduit.indelible_victory.enabled then applyBuff( "indelible_victory" ) end
|
|
end,
|
|
},
|
|
|
|
|
|
whirlwind = {
|
|
id = 190411,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
|
|
usable = function ()
|
|
if settings.check_ww_range and target.outside7 then return false, "target is outside of whirlwind range" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
if level > 36 then
|
|
applyBuff ( "whirlwind", nil, talent.meat_cleaver.enabled and 4 or 2 )
|
|
end
|
|
end,
|
|
},
|
|
} )
|
|
|
|
|
|
spec:RegisterOptions( {
|
|
enabled = true,
|
|
|
|
aoe = 2,
|
|
|
|
nameplates = true,
|
|
nameplateRange = 8,
|
|
|
|
damage = true,
|
|
damageExpiration = 8,
|
|
|
|
potion = "potion_of_phantom_fire",
|
|
|
|
package = "Fury",
|
|
} )
|
|
|
|
|
|
spec:RegisterSetting( "check_ww_range", false, {
|
|
name = "Check |T132369:0|t Whirlwind Range",
|
|
desc = "If checked, when your target is outside of |T132369:0|t Whirlwind's range, it will not be recommended.",
|
|
type = "toggle",
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterSetting( "heroic_charge", false, {
|
|
name = "Use Heroic Charge Combo",
|
|
desc = "If checked, the default priority will check |cFFFFD100settings.heroic_charge|r to determine whether to use Heroic Leap + Charge together.\n\n" ..
|
|
"This is generally a DPS increase but the erratic movement can be disruptive to smooth gameplay.",
|
|
type = "toggle",
|
|
width = "full",
|
|
} )
|
|
|
|
|
|
spec:RegisterPack( "Fury", 20220319, [[d4KkCbqiOk1JOeSjKYNecJIeCkc0QiHc8kskZIs0TGQODr0VOuzyqvDmsYYaGNjezAKq11OKABcr5Bcr14iH4CqvW6iGmpa09iO9Hu5GeqzHuQ6HivPjIuf6Ieq1gjHc9rOkegjju0jrQIALa0mjH0nHQq1oPK8tsOGgkufklLek9uuAQKuDvOkeTvKQGVIufzSqvYEj1Fr0GbDyjlgjpwWKb6YQ2mu(mcJgQCAiRgQcPEnLYSP42eA3u9BunCaDCcWYv65snDfxhfBNe9DH04Pe68iv16HQqY8fQ9lATkT6AwWAU2kaGpaaa(rsfEqca8XpYSwr0Sd9bEnlWkyRiUM1lXRzvmYS0xZcSOVHxGA11SnNzdxZIBgGTazNDeObhdLmWfTRrImMAqCpSf2yxJed2PzPyqMHE21uAwWAU2kaGpaaa(rsfEqca8XpYSoY0SfZGJVAwwKi9Mq7sOaBd4qIdA5TMfhce8UMsZc(oOzvmYS0pH0t1Ui(MaIhV2aUeQcpyzcba(aaajGjG0lUYjElqjG4zcfyGGhmH4XyefVrMaINjKEe1fL5GjuKR8I3NeAxcvm)YrHeQOVaMWqzmjubNpj0)bpycX4BcroEsuIpHbUp3IJGYeq8mH4X5kpycT3uGVh(kMWYbti94weCpHkwETjSO4kFcT3W5Gdo02tchEcrIaxUYNqS9cG5EG(jKJLW9bUO4DWAqCVtOcnsSt4YziWzOFcVaykJGYeq8mHcmqWdMq7RzmpHS44mtchEcbUpWfPQjHcm8ykQmbeptOade8GjepY(jKEEUyltaXZeQE0x2sigFti9eo0AIICWesDm((eAUYBsyKICzciEMqf7f5kpycf4DFp8wMaINjKEK7rmjKPFczrN4u7lBFticlHOjIoHLzFbs)eYamHkqp(AWjw2(kOmbepti7hgGjeRS9e2xam3dVtigFtilIW)KqoW7FLAwdQNwRUMT4xRU2kvA11S3lkZb12RzdlA(IknlrauUxSqENqHje)eslHnNXqHCqjgA7HSNfz7Y7fL5GjKwcPyWWKyOThYEwKTl3lwiVtiTesXGHjVVfXL7flK3jeGjKiaQzRWG4UMnuE4gskgmmnlfdggPxIxZszkW3dFf1J2kaOvxZEVOmhuBVMnSO5lQ0SumyyY7BrCjdWeslHbo3aYJ6Y9bBM3T)UL7flK3jKUeATMTcdI7A2YdO7dzHnFBC8Gn9OTksA11S3lkZb12RzdlA(IknlfdgM8(wexYamH0s4wepHamHko(A2kmiURzBGVwsogjv1dI76rBLIRvxZEVOmhuBVMnSO5lQ0SumyyY7BrCjdWeslHnWBmKtTeFAzuCO1ef5GjKUecanBfge31SuMc89WxrnlYNVldWHeHPzjcGY9IfYBH4tR5mgkKdkXqBpK9SiBNgfdgMedT9q2ZISD5EXc5nnkgmm59TiUCVyH8gGebq9OTYAT6A27fL5GA71SHfnFrLMvHesXGHjVVfXLmatyCCcPyWWK7d2mVB)DlzaMqAjCz8JXxIlBKJXyiBML4Y7fL5GjuWeslHkRfvuMlVfFGzojqCvFnBfge31SbUdErxpARImT6A2kmiURzB0jo1(Y2xn79IYCqT96rBvKRvxZwHbXDn7wIalIRzVxuMdQTxpARueT6A27fL5GA71SHfnFrLMLIbdtEFlIlzaMqAjmW5gqEuxUpyZ8U93TCVyH8oH0LqR1SvyqCxZ2aFTKCmsQQhe31J2k8GwDn79IYCqT9A2WIMVOsZsXGHjVVfXL7flK3jKUeseatOIbjeasR1SvyqCxZszkW3dFf1JE0SnYjmNCQL4JwDTvQ0QRzVxuMdQTxZgw08fvA2LXpgFjUmkYyi5yKdUts9T)A7R8cGbbe4btiTesXGHjJImgsog5G7KuF7V2(k3lwiVtiatirauZwHbXDn7weiNGKYWJQhTvaqRUM9ErzoO2EnByrZxuPzxg)y8L4YOiJHKJro4oj13(RTVYlageqGhmH0sifdgMmkYyi5yKdUts9T)A7RCVyH8oHamHebqnBfge31SHLPXHCcskdpQE0wfjT6A27fL5GA71SHfnFrLMTbEJHCQL4tlJIdTMOihmHctOQeslHebq5EXc5DcfMq8tiTeQqcNYCFKIv3vyV8ErzoycJJtyGR8E5Ju59bh93ekycPLqL1IkkZL3IpWmNeiUQFcPLqfs4wepH0Lq8a(jmooH4DcdCUbKh1LbUdErxUxSqENqb1SvyqCxZgkpCdjfdgMMLIbdJ0lXRzPmf47HVI6rBLIRvxZEVOmhuBVMnSO5lQ0SkKqkgmm59TiUKbycJJtifdgMCFWM5D7VBjdWeslHlJFm(sCzJCmgdzZSexEVOmhmHcMqAjuzTOIYC5T4dmZjbIR6RzRWG4UMnWDWl66rBL1A11S3lkZb12RzdlA(Iknl4PyWWKn6eNAFz7ReKh1tiTeQqcBG3yiNAj(0YO4qRjkYbtiDjuvcJJt4wiqYR8(ilqWwI8esxcvzDcfuZwHbXDnBJoXP2x2(QhTvrMwDn79IYCqT9A2WIMVOsZsXGHj3hSzE3(7wYamHXXjuHesXGHjVVfXL7flK3jeGjKiaMW44eUfXtiDjurWpHcMW44esXGHjX274rrF5EXc5DcbycvjTwZwHbXDn7wIalIRhTvrUwDn79IYCqT9A2WIMVOsZ2FiP4otlh0xaOiKaayiHXXjmGRwI3juycbqcJJtOcjKIbdtUpyZ8U93TKbycPLqL1IkkZL3IpWmNeiUQFcPLWPm3hPy1Df2lVxuMdMqb1SvyqCxZgwMghYjiPm8O6rBLIOvxZwHbXDnBG7Gx01S3lkZb12RhTv4bT6A27fL5GA71SHfnFrLMLIbdtEFlIlzaMqAjmW5gqEuxUpyZ8U93TCVyH8oH0LqRtiTeQqcP4DNqAjedrGBi3lwiVtiDjepyDcJJtifdgMCFWM5D7VBjdWeghNqkE3jKwcXqe4gY9IfY7ecWeca8tOGjKwc3cbsEL3hzbc2sKNq6syKBTMTcdI7A2YdO7dzHnFBC8Gn9OTsf(A11SvyqCxZEl(aZCn79IYCqT96rBLkvA11S3lkZb12RzdlA(Ikn7Y4hJVexEd9Bu5KIicCJ8ErzoycPLqkgmm59TiUKbycPLWaNBa5rD5(GnZ72F3Y9IfY7esxcToH0sOcjKIbdtUpyZ8U93TKbycJJtifV7eslHyicCd5EXc5Dcbycba(jmooHGNIbdt2OtCQ9LTVsgGjmooH4DcNYCFKn6eNAFz7R8ErzoycPLqkE3jKwcXqe4gY9IfY7esxcJmfjHcMqAjClei5vEFKfiylrEcPlHwBTMTcdI7A2g4RLKJrsv9G4UE0wPcaA11S3lkZb12RzdlA(IknlfdgM8(wexYamH0sOcjeVtifdgMCFWM5D7VB5EXc5DcJJt4wepHamHwJFcfmH0sOcjSbEJHCQL4tlJIdTMOihmHctOQeslHBHajVY7JSabBjYtiDjuXToHXXjSbEJHCQL4tlJIdTMOihmHctiasOGA2kmiURzPmf47HVI6rBLQiPvxZEVOmhuBVMnSO5lQ0SumyyY7BrCjdWeslHbo3aYJ6Y9bBM3T)UL7flK3jKUeADcPLqfsifdgMCFWM5D7VBjdWeghNqkE3jKwcXqe4gY9IfY7ecWeca8tyCCcbpfdgMSrN4u7lBFLmatyCCcX7eoL5(iB0jo1(Y2x59IYCWeslHu8UtiTeIHiWnK7flK3jKUegzkscfmH0s4wiqYR8(ilqWwI8esxcT2AnBfge31SnWxljhJKQ6bXD9OTsLIRvxZEVOmhuBVMnSO5lQ0SumyyY7BrCjipQNW44eg4oidAKkrbeNPjdCFUiWrULBlH0LqRtiTeo1s8rI7LzWjbgMecWegjR1SvyqCxZsz4CWbhA7rpARuzTwDn79IYCqT9A2WIMVOsZsXGHjVVfXLG8OEcJJtyG7GmOrQefqCMMmW95Iah5wUTesxcToH0s4ulXhjUxMbNeyysiatyKSoH0siENWPm3hzyzUzOV8ErzoOMTcdI7AwkdNdsvdo9OTsvKPvxZEVOmhuBVMnSO5lQ0SumyysXVbK5DtsX9tSih8RKbycPLWg4ngYPwIpTmko0AIICWesxcvPzRWG4UMnko0AIICq9OTsvKRvxZEVOmhuBVMnSO5lQ0S9hskUZ0Yb9fakcjaagsyCCcd4QL4DcfMqaKW44eQqcPyWWK7d2mVB)DlzaMqAjuzTOIYC5T4dmZjbIR6NqAjCkZ9rkwDxH9Y7fL5GjuqnBfge31SBrGCcskdpQE0wPsr0QRzVxuMdQTxZgw08fvAwkgmm59TiUKbycPLqfsyd8gd5ulXNwgfhAnrroycPlHQsyCCc3cbsEL3hzbc2sKNq6sOkRtOGA2kmiURzb3IG7KlVw9OTsfEqRUM9ErzoO2EnByrZxuPzPyWWK33I4sgGA2kmiURz5EBkgcCJE0wba81QRzRWG4UMLYW5Gdo02JM9ErzoO2E9OTcaQ0QRzRWG4UMLYW5Gu1GtZEVOmhuBVE0wbaaOvxZwHbXDn7weiNGKYWJQzVxuMdQTxpARaqK0QRzRWG4UMnSmnoKtqsz4r1S3lkZb12RhTvaqX1QRzRWG4UMnko0AIICqn79IYCqT96rpAwWJvmMrRU2kvA11S3lkZb12RzRWG4UMnGRwIRzbFhweWbXDnl9IRwINqewcJ(i2Nqd3jsiWQNeYz2eYbE)RLjKVjm6tii3JysO)dMWb3tih49VjmWfP4jeJVjKfr4FsOco3Xt6H7do6Vck1SHfnFrLMDqIpH0LqfjHXXjCkZ9rcYzOmNCqIxEVOmhmHXXjScds5jVFr07esxcvLW44eg4kVx(ivEFWr)nHXXjeVt4Y4hJVex2ic)djhJC4R495GK2qorlVayqabEWeghNWaNBa5rD5(GnZ72F3Y9IfY7esxcjcG6rBfa0QRzRWG4UMfiJO4nA27fL5GA71J2QiPvxZEVOmhuBVMLduZ2F0SvyqCxZQSwurzUMvzzyUMDkZ9rkwDxH9Y7fL5GjKwcNAj(iX9Ym4KadtcbycJK1jmooHtTeFK4EzgCsGHjHamHaa)eghNWPwIpsCVmdojWWKq6sOIGFcPLWax59YhPY7do6VAwL1s6L41S3IpWmNeiUQVE0wP4A11S3lkZb12Rz5a1S9hnBfge31SkRfvuMRzvwgMRzxg)y8L4Ygr4Fi5yKdFfVphK0gYjA59IYCWeghNWLXpgFjUSrogJHSzwIlVxuMdMW44eUm(X4lXL3q)gvoPiIa3iVxuMdQzvwlPxIxZY4ibWCsZjUdwl6TE0wzTwDn79IYCqT9A2kmiURzPmCo4GdT9Ozni)KbqnRk81SHfnFrLMDqIpHamHkscPLWkmiLN8(frVtOWeQkH0s4Y4hJVex2ic)djhJC4R495GK2qorlVayqabEWeslHkKq8oHbUY7LpsL3hC0FtyCCcdCUbKh1L7d2mVB)Dl3lwiVtiafMqIaycfuZc(oSiGdI7AwbUiJPM3je5ObvMeAVHZbhCOTNe2xam3dpHy8nHnYjmhpNAj(Kq1silIW)i1J2QitRUM9ErzoO2EnBfge31S7d2mVB)DRzni)KbqnRk81SHfnFrLMDqIpHamHkscPLWkmiLN8(frVtOWeQkH0syGR8E5Ju59bh93eslHlJFm(sCzJi8pKCmYHVI3NdsAd5eT8cGbbe4btiTecCVsjLHZbhCOThnl47WIaoiURzf4ImMAENqKJguzsOI9bBM3T)UtyFbWCp8eIX3e2iNWC8CQL4tcvlH0d3hC0FtOAjKfr4FK6rBvKRvxZEVOmhuBVMTcdI7AwCF5OaP5fqnRb5NmaQzvHVMnSO5lQ0S9Nb5eTe3xokqgWvlXtiTeoiXNqaMqRtiTewHbP8K3Vi6DcfMqvjKwcX7eg4kVx(ivEFWr)nH0s4Y4hJVex2ic)djhJC4R495GK2qorlVayqabEWeslHa3Rusz4CWbhA7jH0syGZnG8OUmGRwIl3lwiVtiati(sR1SGVdlc4G4UMvGlYyQ5DcroAqLjHkMF5Oqcv0xatiDjKEXvlXtyFbWCp8eIX3e2iNWC8CQL4tcvlHo3Xt6H7do6VjuTeYIi8ps9OTsr0QRzVxuMdQTxZwHbXDnBaxTexZAq(jdGAwv4RzdlA(IknB)zqorlX9LJcKbC1s8eslHds8jeGj06eslHvyqkp59lIENqHjuvcPLq8oHbUY7LpsL3hC0FtiTeUm(X4lXLnIW)qYXih(kEFoiPnKt0YlageqGhmH0siW9kL4(YrbsZlGAwW3HfbCqCxZkWfzm18oHihnOYKqfZVCuiHk6lGjKUesV4QL4jSVayUhEcX4BcBKtyoEo1s8jHQLqN74j9W9bh93eQwczre(hPE0wHh0QRzRWG4UMfiFqCxZEVOmhuBVE0wPcFT6A27fL5GA71SHfnFrLMDlINq6syKJVMTcdI7A2a3faZx(2KuL7F1J2kvQ0QRzVxuMdQTxZgw08fvAwkgmm59TiUKbycPLWTiEcbycJC81SvyqCxZ2aFTKCmsQQhe31J2kvaqRUM9ErzoO2EnByrZxuPzdCUbKh1L7d2mVB)Dl3lwiVtiatyKsiTeoL5(i3hSzE3Kfv5GCxEVOmhuZwHbXDn7wIalIRhTvQIKwDn79IYCqT9A2WIMVOsZsXGHj3hSzE3(7wcYJ6jKwcbpfdgMSrN4u7lBFLG8OEcJJtigIa3qUxSqENqaMqRXxZwHbXDnBG7cG5lFBsQY9V6rBLkfxRUM9ErzoO2EnByrZxuPzxg)y8L4Yg5ymgYMzjU8ErzoycPLqIaOCVyH8oHcti(jKwcviHkRfvuMlVfFGzojqCv)eghNqfs4ulXh5Gep5WjbggYizDcPlHko(jKwcNYCFKLt8LuS8I4I3h59IYCWeghNWPwIpYbjEYHtcmmKrY6esxcJC8tiTeI3jCkZ9rwoXxsXYlIlEFK3lkZbtOGjuWeslHkKWg4ngYPwIpTmko0AIICWekmHQsyCCcPyWWKIVgYG5LYVsgGjuqnBfge31S7d2mVB)DRhTvQSwRUM9ErzoO2EnByrZxuPzxg)y8L4YBOFJkNuerGBK3lkZbtiTeseaL7flK3juycXpH0sOcjmW5gqEux2aFTKCmsQQhe3L7flK3jeGj06eghNWaNBa5rDzd81sYXiPQEqCxUxSqENq6siaWpHcMqAjuHeQqcPyWWKugoh0W0JKbycJJt4uM7JSCIVKILxex8(iVxuMdMW44eUfcK8kVpYceSLipH0Lqv4NqbtyCCcP4DNqAjedrGBi3lwiVtiDjuf(4NW44eQSwurzU8w8bM5KaXv9tyCCcP4DNqAjedrGBi3lwiVtiatOkRtiTeUfcK8kVpYceSLipH0Lqv4NqbtiTeQqcBG3yiNAj(0YO4qRjkYbtOWeQkHXXjKIbdtk(AidMxk)kzaMqb1SvyqCxZUpyZ8U93TE0wPkY0QRzVxuMdQTxZgw08fvAw8oHkRfvuMlzCKayoP5e3bRf9oH0sirauUxSqENqHje)eslHkKqfsifdgMKYW5GgMEKmatyCCcNYCFKLt8LuS8I4I3h59IYCWeghNWTqGKx59rwGGTe5jKUeQc)ekycJJtifV7eslHyicCd5EXc5DcPlHQWh)eghNqL1IkkZL3IpWmNeiUQFcJJtifV7eslHyicCd5EXc5DcbycvzDcPLWTqGKx59rwGGTe5jKUeQc)ekycPLqfsyd8gd5ulXNwgfhAnrroycfMqvjmooHumyysXxdzW8s5xjdWekycPLqfsiENWax59YhP)WYn8fmHXXjmW5gqEuxg4Uay(Y3MKQC)RCVyH8oH0LqaGFcfuZwHbXDn7(GnZ72F36rBLQixRUM9ErzoO2EnByrZxuPzxg)y8L4Ygr4Fi5yKdFfVphK0gYjA5fadciWdMqAje4ELKebqPk5wIalINqAjuHeQqcPyWWKugoh0W0JKbycJJt4uM7JSCIVKILxex8(iVxuMdMW44eUfcK8kVpYceSLipH0Lqv4NqbtyCCcP4DNqAjedrGBi3lwiVtiDjuf(4NW44eQSwurzU8w8bM5KaXv9tyCCcP4DNqAjedrGBi3lwiVtiatOkRtiTeUfcK8kVpYceSLipH0Lqv4NqbtiTeQqcBG3yiNAj(0YO4qRjkYbtOWeQkHXXjKIbdtk(AidMxk)kzaMqb1SvyqCxZUpyZ8U93TMLPpjhdJKiaQTsLE0wPsr0QRzVxuMdQTxZgw08fvAwZvEtcPlHrkYsiTeQqcBG3yiNAj(0YO4qRjkYbtiDjuvcPLq8oHumyysXxdzW8s5xjdWeghNWTqGKx59rwGGTe5jeGjKiaMqAjeVtifdgMu81qgmVu(vYamHcQzRWG4UMnko0AIICq9OTsfEqRUM9ErzoO2EnBfge31SiVdlZuuMtkaMYhgrsWRefUMnSO5lQ0Sbo3aYJ6Y9bBM3T)UL7flK3jKUeQc)eslHkKqkgmm5(GnZ72F3sgGjmooHu8UtiTeIHiWnK7flK3jeGjeaQsyCCcP4DNqAjedrGBi3lwiVtiDjufEa)eghNqkgmmjLHZbnm9izaMqb1SEjEnlY7WYmfL5KcGP8HrKe8krHRhTvaaFT6A27fL5GA71SvyqCxZgTSD)BtITChuZgw08fvA2aNBa5rD5(GnZ72F3Y9IfY7esxcvHFcPLqfsifdgMCFWM5D7VBjdWeghNqkE3jKwcXqe4gY9IfY7ecWeQksjmooHu8UtiTeIHiWnK7flK3jKUeQks4Nqb1SEjEnB0Y29Vnj2YDq9OTcaQ0QRzVxuMdQTxZwHbXDnRyfkQ9KnU)HuKPrbnByrZxuPzdCUbKh1L7d2mVB)Dl3lwiVtiDjuf(jKwcviHumyyY9bBM3T)ULmatyCCcP4DNqAjedrGBi3lwiVtiatiaSoHXXjKI3DcPLqmebUHCVyH8oH0LqvQWpHcQz9s8AwXkuu7jBC)dPitJc6rBfaaGwDn79IYCqT9A2kmiURz5k)gf3nIiNGeip6xYWs)EkJMnSO5lQ0Sbo3aYJ6Y9bBM3T)UL7flK3jKUeQc)eslHkKqkgmm5(GnZ72F3sgGjmooHu8UtiTeIHiWnK7flK3jeGjuvKLW44esX7oH0sigIa3qUxSqENq6sOk8XpHcQz9s8AwUYVrXDJiYjibYJ(LmS0VNYOhTvaisA11S3lkZb12RzRWG4UMf59SmHHVnjisjYpj1ngnByrZxuPzdCUbKh1L7d2mVB)Dl3lwiVtiDjuf(jKwcviHumyyY9bBM3T)ULmatyCCcP4DNqAjedrGBi3lwiVtiatOk8tyCCcP4DNqAjedrGBi3lwiVtiDjepyDcfuZ6L41SiVNLjm8Tjbrkr(jPUXOhTvaqX1QRzVxuMdQTxZwHbXDnlMPepjhJKQMXCnByrZxuPzdCUbKh1L7d2mVB)Dl3lwiVtiDjuf(jKwcviHumyyY9bBM3T)ULmatyCCcP4DNqAjedrGBi3lwiVtiatOkvjmooHu8UtiTeIHiWnK7flK3jKUeQcF8tOGAwVeVMfZuINKJrsvZyUE0wbaR1QRzVxuMdQTxZwHbXDnlHPar1W3MKQajUMnSO5lQ0Sbo3aYJ6Y9bBM3T)UL7flK3jKUeQc)eslHkKqkgmm5(GnZ72F3sgGjmooHu8UtiTeIHiWnK7flK3jeGjuLQeghNqkE3jKwcXqe4gY9IfY7esxcJmRtOGAwVeVMLWuGOA4BtsvGexpARaqKPvxZEVOmhuBVM1lXRz7qTnjhJeBR5RxgYEwe21SvyqCxZ2HABsogj2wZxVmK9SiSRhTvaiY1QRzVxuMdQTxZ6L41SeLYBi5yKdUtIH2EiRLcnF1SvyqCxZsukVHKJro4ojgA7HSwk08vpARaGIOvxZwHbXDnltFs0CXwZEVOmhuBVE0wba8GwDnBfge31SugohKeJzPVM9ErzoO2E9OTks4RvxZEVOmhuBVMnSO5lQ0SumyyY9bBM3T)ULma1SvyqCxZs9T)Ad5e6rBvKuPvxZEVOmhuBVMnSO5lQ0SumyyY9bBM3T)ULG8OEcPLqWtXGHjB0jo1(Y2xjipQRzRWG4UM1GiWnnjE0mGeI3h9OTksaqRUMTcdI7Awm0EkdNdQzVxuMdQTxpARIuK0QRzRWG4UMT8W7zldzOmgn79IYCqT96rBvKuCT6A27fL5GA71SHfnFrLMLIbdtUpyZ8U93TeKh1tiTecEkgmmzJoXP2x2(kb5r9eslHumyyY7BrCjdqnBfge31SufbjhJCwuWwRhTvrYAT6A27fL5GA71SHfnFrLMTbEJHCQL4tlJIdTMOihmH0LqvA2Ewuy0wPsZwHbXDnBOmgYkmiUtAq9OznOEi9s8A2IF9OTksrMwDn79IYCqT9A2kmiURzxgNScdI7KgupAwdQhsVeVMTroH5KtTeF0JE0Sa3h4Iu1OvxBLkT6A2kmiURzPQzmNSXXzgn79IYCqT96rBfa0QRzVxuMdQTxZgw08fvAw8oHlJFm(sCzJi8pKCmYHVI3NdsAd5eT8cGbbe4b1SvyqCxZUpyZ8U93TE0wfjT6A2kmiURzdCxamF5BtsvU)vZEVOmhuBVE0JE0Sk)2iURTca4daaGFKuPsZgTwh5eTMLEsGPyTIE2k8ieOeMq1X9eIebY3jHy8nHru8hrc3lag0EWe2CXNWIz4I1CWegWvoXBzcOII8NqvcucPxUR87CWegrZzmuihuIxrKWHNWiAoJHc5Gs8sEVOmhmIeQGklkOmburr(tO1cucPxUR87CWegXY4hJVexIxrKWHNWiwg)y8L4s8sEVOmhmIeQGklkOmbmbKEsGPyTIE2k8ieOeMq1X9eIebY3jHy8nHr0iNWCYPwIprKW9cGbThmHnx8jSygUynhmHbCLt8wMaQOi)jmscucPxUR87CWegrGR8E5JeVK3lkZbJiHdpHre4kVx(iXRisOcQSOGYeqff5pHkUaLq6L7k)ohmHrSm(X4lXL4vejC4jmILXpgFjUeVK3lkZbJiHkOYIcktavuK)eQsLaLq6L7k)ohmHrmL5(iXRis4WtyetzUps8sEVOmhmIeQGklkOmburr(tOkvcucPxUR87CWegXY4hJVexIxrKWHNWiwg)y8L4s8sEVOmhmIeQGklkOmburr(tOQijqjKE5UYVZbtyetzUps8kIeo8egXuM7JeVK3lkZbJiHkOYIcktataPNeykwRONTcpcbkHjuDCpHirG8DsigFtyeGhRymtejCVayq7btyZfFclMHlwZbtyax5eVLjGkkYFcJKaLq6L7k)ohmHrmL5(iXRis4WtyetzUps8sEVOmhmIeQGklkOmburr(tOIlqjKE5UYVZbtyelJFm(sCjEfrchEcJyz8JXxIlXl59IYCWisOcQSOGYeqff5pHkUaLq6L7k)ohmHrSm(X4lXL4vejC4jmILXpgFjUeVK3lkZbJiH1KqbUIHkAcvqLffuMaQOi)juXfOesVCx535GjmILXpgFjUeVIiHdpHrSm(X4lXL4L8ErzoyejubvwuqzcOII8NWitGsi9YDLFNdMWicCL3lFK4L8ErzoyejC4jmIax59YhjEfrcvqLffuMaQOi)jmYfOesVCx535GjmIax59YhjEjVxuMdgrchEcJiWvEV8rIxrKqfuzrbLjGkkYFcvebkH0l3v(DoycJiWvEV8rIxY7fL5GrKWHNWicCL3lFK4vejubvwuqzcOII8NqvkUaLq6L7k)ohmHrmL5(iXRis4WtyetzUps8sEVOmhmIeQaaSOGYeqff5pHQuCbkH0l3v(DoycJyz8JXxIlXRis4WtyelJFm(sCjEjVxuMdgrcvqLffuMaQOi)juL1cucPxUR87CWegXY4hJVexIxrKWHNWiwg)y8L4s8sEVOmhmIeQGklkOmbmbKEweiFNdMqfpHvyqCpHgupTmbuZcC5yiZ1SwWcjuXiZs)espv7I4BcOfSqcXJxBaxcvHhSmHaaFaaGeWeqlyHesV4kN4TaLaAblKq8mHcmqWdMq8ymII3itaTGfsiEMq6ruxuMdMqrUYlEFsODjuX8lhfsOI(cycdLXKqfC(Kq)h8GjeJVje54jrj(eg4(ClocktaTGfsiEMq84CLhmH2BkW3dFfty5GjKEClcUNqflV2ewuCLpH2B4CWbhA7jHdpHirGlx5ti2EbWCpq)eYXs4(axu8oyniU3juHgj2jC5me4m0pHxamLrqzcOfSqcXZekWabpycTVMX8eYIJZmjC4je4(axKQMekWWJPOYeqlyHeINjuGbcEWeIhz)esppxSLjGwWcjeptO6rFzlHy8nH0t4qRjkYbti1X47tO5kVjHrkYLjGwWcjeptOI9ICLhmHc8UVhEltaTGfsiEMq6rUhXKqM(jKfDItTVS9nHiSeIMi6ewM9fi9tidWeQa94RbNyz7RGYeqlyHeINjK9ddWeIv2Ec7laM7H3jeJVjKfr4Fsih49VYeWeqlyHekWT4dmZbti1X47tyGlsvtcPobYBzcfyHWboDcDUJN4QveJXKWkmiU3jK7g6ltaRWG4ElbUpWfPQrnH2rvZyozJJZmjGvyqCVLa3h4Iu1OMq72hSzE3(72seMq8Ez8JXxIlBeH)HKJro8v8(CqsBiNOLxamiGapycyfge3BjW9bUivnQj0Ua3faZx(2KuL7FtataTGfsOa3IpWmhmHx5x6NWbj(eo4EcRWW3eI6ewklKPOmxMaAHesV4QL4jeHLWOpI9j0WDIecS6jHCMnHCG3)Azc5BcJ(ecY9iMe6)GjCW9eYbE)BcdCrkEcX4Bczre(NeQGZD8KE4(GJ(RGYeWkmiU3cd4QL4wIWeoiXtNIehpL5(ib5muMtoiXlVxuMdghxHbP8K3Vi6nDQIJdCL3lFKkVp4O)ghJ3lJFm(sCzJi8pKCmYHVI3NdsAd5eT8cGbbe4bJJdCUbKh1L7d2mVB)Dl3lwiVPJiaMawHbX9wnH2bKru8MeWkmiU3Qj0oL1IkkZT0lXl8w8bM5KaXv9TuzzyUWPm3hPy1Df2tBQL4Je3lZGtcmmamswhhp1s8rI7LzWjbggaca8JJNAj(iX9Ym4KaddDkc(0cCL3lFKkVp4O)MawHbX9wnH2PSwurzULEjEHmosamN0CI7G1IEBPYYWCHlJFm(sCzJi8pKCmYHVI3NdsAd5eDC8Y4hJVex2ihJXq2mlXJJxg)y8L4YBOFJkNuerGBsaTGfsO64qDcrDcf59yOFchEcbUx59jHbo3aYJ6DcXwUycPoYjsyfciW7tzm0pHm9btiiZICIekYvEX7Jmb0cwiHvyqCVvtODlJtwHbXDsdQhl9s8cf5kV49XseMqrUYlEFKGOEkpC6Sob0cwiHvyqCVvtOD4(YrbsZlGwIWeQWwiqYR8(if5kV49rcI6P8WPdawtBlei5vEFKICLx8(iroDkU1cMaAblKWkmiU3Qj0U(cG5E4wIWewHbP8K3Vi6Tqv0cCL3lFKkVp4O)kVxuMdsBz8JXxIlBeH)HKJro8v8(CqsBiNOLxamiGapOLEjEH2Ronf7d2eikdNdo4qBpc0(GnZ72F3jGwiHcCrgtnVtiYrdQmj0EdNdo4qBpjSVayUhEcX4BcBKtyoEo1s8jHQLqweH)rMawHbX9wnH2rz4CWbhA7XsdYpzauOk8TeHjCqIhGkcTkmiLN8(frVfQI2Y4hJVex2ic)djhJC4R495GK2qorlVayqabEqAkG3bUY7LpsL3hC0FJJdCUbKh1L7d2mVB)Dl3lwiVbOqIaOGjGwiHcCrgtnVtiYrdQmjuX(GnZ72F3jSVayUhEcX4BcBKtyoEo1s8jHQLq6H7do6VjuTeYIi8pYeWkmiU3Qj0U9bBM3T)UT0G8tgafQcFlrychK4bOIqRcds5jVFr0BHQOf4kVx(ivEFWr)vEVOmhK2Y4hJVex2ic)djhJC4R495GK2qorlVayqabEqAa3Rusz4CWbhA7jb0cwiHvyqCVvtOD9faZ9WTeHjScds5jVFr0BHQOH3bUY7LpsL3hC0FL3lkZbPTm(X4lXLnIW)qYXih(kEFoiPnKt0YlageqGh0sVeVq7vNg9IRwIlqugohCWH2EeiCF5OazaxTepb0cjuGlYyQ5DcroAqLjHkMF5Oqcv0xatiDjKEXvlXtyFbWCp8eIX3e2iNWC8CQL4tcvlHo3Xt6H7do6VjuTeYIi8pYeWkmiU3Qj0oCF5OaP5fqlni)KbqHQW3seMW(ZGCIwI7lhfid4QL40gK4bO10QWGuEY7xe9wOkA4DGR8E5Ju59bh9x59IYCqAlJFm(sCzJi8pKCmYHVI3NdsAd5eT8cGbbe4bPbCVsjLHZbhCOThAbo3aYJ6YaUAjUCVyH8gG4lTob0cjuGlYyQ5DcroAqLjHkMF5Oqcv0xatiDjKEXvlXtyFbWCp8eIX3e2iNWC8CQL4tcvlHo3Xt6H7do6VjuTeYIi8pYeWkmiU3Qj0UaUAjULgKFYaOqv4Bjcty)zqorlX9LJcKbC1sCAds8a0AAvyqkp59lIElufn8oWvEV8rQ8(GJ(R8ErzoiTLXpgFjUSre(hsog5WxX7ZbjTHCIwEbWGac8G0aUxPe3xokqAEbmbScdI7TAcTdiFqCpbScdI7TAcTlWDbW8LVnjv5(xlryc3I40f54NawHbX9wnH21aFTKCmsQQhe3TeHjKIbdtEFlIlzasBlIdWih)eWkmiU3Qj0UTebwe3seMWaNBa5rD5(GnZ72F3Y9IfYBagjAtzUpY9bBM3nzrvoi3L3lkZbtaRWG4ERMq7cCxamF5BtsvU)1seMqkgmm5(GnZ72F3sqEuNg4PyWWKn6eNAFz7ReKh1JJXqe4gY9IfYBaAn(jGvyqCVvtOD7d2mVB)DBjct4Y4hJVex2ihJXq2mlXPreaL7flK3cXNMckRfvuMlVfFGzojqCv)4yfMAj(ihK4jhojWWqgjRPtXXN2uM7JSCIVKILxex8(ehp1s8roiXtoCsGHHmswtxKJpn8EkZ9rwoXxsXYlIlEFeuqAk0aVXqo1s8PLrXHwtuKdkuvCmfdgMu81qgmVu(vYauWeWkmiU3Qj0U9bBM3T)UTeHjCz8JXxIlVH(nQCsrebUHgrauUxSqEleFAke4CdipQlBGVwsogjv1dI7Y9IfYBaADCCGZnG8OUSb(Aj5yKuvpiUl3lwiVPda4linfuGIbdtsz4CqdtpsgGXXtzUpYYj(skwErCX7J8ErzoyC8wiqYR8(ilqWwIC6uHVGXXu8UPHHiWnK7flK30PcF8JJvwlQOmxEl(aZCsG4Q(XXu8UPHHiWnK7flK3auL102cbsEL3hzbc2sKtNk8fKMcnWBmKtTeFAzuCO1ef5GcvfhtXGHjfFnKbZlLFLmafmbScdI7TAcTBFWM5D7VBlrycXBL1IkkZLmosamN0CI7G1IEtJiak3lwiVfIpnfuGIbdtsz4CqdtpsgGXXtzUpYYj(skwErCX7J8ErzoyC8wiqYR8(ilqWwIC6uHVGXXu8UPHHiWnK7flK30PcF8JJvwlQOmxEl(aZCsG4Q(XXu8UPHHiWnK7flK3auL102cbsEL3hzbc2sKtNk8fKMcnWBmKtTeFAzuCO1ef5GcvfhtXGHjfFnKbZlLFLmafKMc4DGR8E5J0Fy5g(cghh4CdipQldCxamF5BtsvU)vUxSqEthaWxWeWkmiU3Qj0U9bBM3T)UTKPpjhdJKiakuLLimHlJFm(sCzJi8pKCmYHVI3NdsAd5eT8cGbbe4bPbCVssIaOuLClrGfXPPGcumyyskdNdAy6rYamoEkZ9rwoXxsXYlIlEFK3lkZbJJ3cbsEL3hzbc2sKtNk8fmoMI3nnmebUHCVyH8Mov4JFCSYArfL5YBXhyMtcex1poMI3nnmebUHCVyH8gGQSM2wiqYR8(ilqWwIC6uHVG0uObEJHCQL4tlJIdTMOihuOQ4ykgmmP4RHmyEP8RKbOGjGvyqCVvtODrXHwtuKdAjctO5kVHUifz0uObEJHCQL4tlJIdTMOihKov0WBkgmmP4RHmyEP8RKbyC8wiqYR8(ilqWwICaseaPH3umyysXxdzW8s5xjdqbtaRWG4ERMq7y6tIMlAPxIxiY7WYmfL5KcGP8HrKe8krHBjctyGZnG8OUCFWM5D7VB5EXc5nDQWNMcumyyY9bBM3T)ULmaJJP4DtddrGBi3lwiVbiaufhtX7MggIa3qUxSqEtNk8a(XXumyyskdNdAy6rYauWeWkmiU3Qj0oM(KO5Iw6L4fgTSD)BtITCh0seMWaNBa5rD5(GnZ72F3Y9IfYB6uHpnfOyWWK7d2mVB)DlzaghtX7MggIa3qUxSqEdqvrkoMI3nnmebUHCVyH8MovrcFbtaRWG4ERMq7y6tIMlAPxIxOyfkQ9KnU)HuKPrblrycdCUbKh1L7d2mVB)Dl3lwiVPtf(0uGIbdtUpyZ8U93TKbyCmfVBAyicCd5EXc5nabG1XXu8UPHHiWnK7flK30Psf(cMawHbX9wnH2X0Nenx0sVeVqUYVrXDJiYjibYJ(LmS0VNYyjctyGZnG8OUCFWM5D7VB5EXc5nDQWNMcumyyY9bBM3T)ULmaJJP4DtddrGBi3lwiVbOQiloMI3nnmebUHCVyH8Mov4JVGjGvyqCVvtODm9jrZfT0lXle59SmHHVnjisjYpj1nglrycdCUbKh1L7d2mVB)Dl3lwiVPtf(0uGIbdtUpyZ8U93TKbyCmfVBAyicCd5EXc5navHFCmfVBAyicCd5EXc5nD4bRfmbScdI7TAcTJPpjAUOLEjEHyMs8KCmsQAgZTeHjmW5gqEuxUpyZ8U93TCVyH8Mov4ttbkgmm5(GnZ72F3sgGXXu8UPHHiWnK7flK3auLQ4ykE30Wqe4gY9IfYB6uHp(cMawHbX9wnH2X0Nenx0sVeVqctbIQHVnjvbsClrycdCUbKh1L7d2mVB)Dl3lwiVPtf(0uGIbdtUpyZ8U93TKbyCmfVBAyicCd5EXc5navPkoMI3nnmebUHCVyH8MUiZAbtaRWG4ERMq7y6tIMlAPxIxyhQTj5yKyBnF9Yq2ZIWEcyfge3B1eAhtFs0Crl9s8cjkL3qYXihCNedT9qwlfA(MawHbX9wnH2X0NenxStaRWG4ERMq7OmCoijgZs)eWkmiU3Qj0oQV9xBiNWseMqkgmm5(GnZ72F3sgGjGvyqCVvtODgebUPjXJMbKq8(yjctifdgMCFWM5D7VBjipQtd8umyyYgDItTVS9vcYJ6jGvyqCVvtODyO9ugohmbScdI7TAcTR8W7zldzOmMeWkmiU3Qj0oQIGKJrolkyRTeHjKIbdtUpyZ8U93TeKh1PbEkgmmzJoXP2x2(kb5rDAumyyY7BrCjdWeWkmiU3Qj0UqzmKvyqCN0G6XYEwuyeQYsVeVWIFlrycBG3yiNAj(0YO4qRjkYbPtvcyfge3B1eA3Y4KvyqCN0G6XsVeVWg5eMto1s8jbmbScdI7TS4xyO8WnKumyyw6L4fszkW3dFfTeHjKiak3lwiVfIpTMZyOqoOedT9q2ZISDAumyysm02dzplY2L7flK30OyWWK33I4Y9IfYBaseataRWG4Ell(vtODLhq3hYcB(244bBwIWesXGHjVVfXLmaPf4CdipQl3hSzE3(7wUxSqEtN1jGvyqCVLf)Qj0Ug4RLKJrsv9G4ULimHumyyY7BrCjdqABrCaQ44NawHbX9ww8RMq7Omf47HVIwI857YaCirycjcGY9IfYBH4tR5mgkKdkXqBpK9SiBNgfdgMedT9q2ZISD5EXc5nnkgmm59TiUCVyH8gGebqlrycPyWWK33I4sgG0AG3yiNAj(0YO4qRjkYbPdajGvyqCVLf)Qj0Ua3bVOBjctOcumyyY7BrCjdW4ykgmm5(GnZ72F3sgG0wg)y8L4Yg5ymgYMzjUG0uwlQOmxEl(aZCsG4Q(jGvyqCVLf)Qj0UgDItTVS9nbScdI7TS4xnH2TLiWI4jGvyqCVLf)Qj0Ug4RLKJrsv9G4ULimHumyyY7BrCjdqAbo3aYJ6Y9bBM3T)UL7flK30zDcyfge3BzXVAcTJYuGVh(kAjctifdgM8(wexUxSqEthrauXaaiTobmbScdI7TSroH5KtTeFutODBrGCcskdpQLimHlJFm(sCzuKXqYXihCNK6B)12x5fadciWdsJIbdtgfzmKCmYb3jP(2FT9vUxSqEdqIaycyfge3BzJCcZjNAj(OMq7cltJd5eKugEulrycxg)y8L4YOiJHKJro4oj13(RTVYlageqGhKgfdgMmkYyi5yKdUts9T)A7RCVyH8gGebWeWkmiU3Yg5eMto1s8rnH2fkpCdjfdgMLEjEHuMc89WxrlrycBG3yiNAj(0YO4qRjkYbfQIgrauUxSqEleFAkmL5(ifRURWE59IYCW44ax59YhPY7do6VY7fL5GcstzTOIYC5T4dmZjbIR6ttHTioD4b8JJX7aNBa5rDzG7Gx0L7flK3cMawHbX9w2iNWCYPwIpQj0Ua3bVOBjctOcumyyY7BrCjdW4ykgmm5(GnZ72F3sgG0wg)y8L4Yg5ymgYMzjUG0uwlQOmxEl(aZCsG4Q(jGvyqCVLnYjmNCQL4JAcTRrN4u7lBFTeHje8umyyYgDItTVS9vcYJ60uObEJHCQL4tlJIdTMOihKovXXBHajVY7JSabBjYPtL1cMawHbX9w2iNWCYPwIpQj0UTebwe3seMqkgmm5(GnZ72F3sgGXXkqXGHjVVfXL7flK3aKiaghVfXPtrWxW4ykgmmj2Ehpk6l3lwiVbOkP1jGvyqCVLnYjmNCQL4JAcTlSmnoKtqsz4rTeHjS)qsXDMwoOVaqribaWqCCaxTeVfcG4yfOyWWK7d2mVB)DlzastzTOIYC5T4dmZjbIR6tBkZ9rkwDxH9Y7fL5GcMawHbX9w2iNWCYPwIpQj0Ua3bVONawHbX9w2iNWCYPwIpQj0UYdO7dzHnFBC8GnlrycPyWWK33I4sgG0cCUbKh1L7d2mVB)Dl3lwiVPZAAkqX7MggIa3qUxSqEthEW64ykgmm5(GnZ72F3sgGXXu8UPHHiWnK7flK3aea4liTTqGKx59rwGGTe50f5wNawHbX9w2iNWCYPwIpQj0UBXhyMNawHbX9w2iNWCYPwIpQj0Ug4RLKJrsv9G4ULimHlJFm(sC5n0VrLtkIiWn0OyWWK33I4sgG0cCUbKh1L7d2mVB)Dl3lwiVPZAAkqXGHj3hSzE3(7wYamoMI3nnmebUHCVyH8gGaa)4yWtXGHjB0jo1(Y2xjdW4y8EkZ9r2OtCQ9LTV0O4DtddrGBi3lwiVPlYuebPTfcK8kVpYceSLiNoRTobScdI7TSroH5KtTeFutODuMc89WxrlrycPyWWK33I4sgG0uaVPyWWK7d2mVB)Dl3lwiVJJ3I4a0A8fKMcnWBmKtTeFAzuCO1ef5GcvrBlei5vEFKfiylroDkU1XXnWBmKtTeFAzuCO1ef5GcbGGjGvyqCVLnYjmNCQL4JAcTRb(Aj5yKuvpiUBjctifdgM8(wexYaKwGZnG8OUCFWM5D7VB5EXc5nDwttbkgmm5(GnZ72F3sgGXXu8UPHHiWnK7flK3aea4hhdEkgmmzJoXP2x2(kzaghJ3tzUpYgDItTVS9LgfVBAyicCd5EXc5nDrMIiiTTqGKx59rwGGTe50zT1jGvyqCVLnYjmNCQL4JAcTJYW5Gdo02JLimHumyyY7BrCjipQhhh4oidAKkrbeNPjdCFUiWrULBJoRPn1s8rI7LzWjbggagjRtaRWG4ElBKtyo5ulXh1eAhLHZbPQbNLimHumyyY7BrCjipQhhh4oidAKkrbeNPjdCFUiWrULBJoRPn1s8rI7LzWjbggagjRPH3tzUpYWYCZqF59IYCWeWkmiU3Yg5eMto1s8rnH2ffhAnrroOLimHumyysXVbK5DtsX9tSih8RKbiTg4ngYPwIpTmko0AIICq6uLawHbX9w2iNWCYPwIpQj0UTiqobjLHh1seMW(djf3zA5G(cafHeaadXXbC1s8wiaIJvGIbdtUpyZ8U93TKbinL1IkkZL3IpWmNeiUQpTPm3hPy1Df2lVxuMdkycyfge3BzJCcZjNAj(OMq7a3IG7KlVwlrycPyWWK33I4sgG0uObEJHCQL4tlJIdTMOihKovXXBHajVY7JSabBjYPtL1cMawHbX9w2iNWCYPwIpQj0oU3MIHa3yjctifdgM8(wexYambScdI7TSroH5KtTeFutODugohCWH2EsaRWG4ElBKtyo5ulXh1eAhLHZbPQbxcyfge3BzJCcZjNAj(OMq72Ia5eKugE0eWkmiU3Yg5eMto1s8rnH2fwMghYjiPm8OjGvyqCVLnYjmNCQL4JAcTlko0AIICqnBd8bTvroa0JE0Aa]] )
|
|
|
|
|
|
end
|
|
|