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.
1919 lines
86 KiB
1919 lines
86 KiB
-- ShamanElemental.lua
|
|
-- 09.2020
|
|
|
|
local addon, ns = ...
|
|
local Hekili = _G[ addon ]
|
|
|
|
local class = Hekili.Class
|
|
local state = Hekili.State
|
|
|
|
local PTR = ns.PTR
|
|
|
|
|
|
-- Conduits
|
|
-- [x] Call of Flame
|
|
-- [-] High Voltage
|
|
-- [-] Pyroclastic Shock
|
|
-- [-] Shake the Foundations
|
|
|
|
-- Covenants
|
|
-- [-] Elysian Dirge
|
|
-- [-] Lavish Harvest
|
|
-- [-] Tumbling Waves
|
|
-- [x] Essential Extraction
|
|
|
|
-- Endurance
|
|
-- [-] Astral Protection
|
|
-- [-] Refreshing Waters
|
|
-- [x] Vital Accretion
|
|
|
|
-- Finesse
|
|
-- [x] Crippling Hex
|
|
-- [x] Spiritual Resonance
|
|
-- [x] Thunderous Paws
|
|
-- [x] Totemic Surge
|
|
|
|
|
|
if UnitClassBase( "player" ) == "SHAMAN" then
|
|
local spec = Hekili:NewSpecialization( 262, true )
|
|
|
|
spec:RegisterResource( Enum.PowerType.Maelstrom )
|
|
spec:RegisterResource( Enum.PowerType.Mana )
|
|
|
|
-- Talents
|
|
spec:RegisterTalents( {
|
|
earthen_rage = 22356, -- 170374
|
|
echo_of_the_elements = 22357, -- 333919
|
|
static_discharge = 22358, -- 342243
|
|
|
|
aftershock = 23108, -- 273221
|
|
echoing_shock = 23460, -- 320125
|
|
elemental_blast = 23190, -- 117014
|
|
|
|
spirit_wolf = 23162, -- 260878
|
|
earth_shield = 23163, -- 974
|
|
static_charge = 23164, -- 265046
|
|
|
|
master_of_the_elements = 19271, -- 16166
|
|
storm_elemental = 19272, -- 192249
|
|
liquid_magma_totem = 19273, -- 192222
|
|
|
|
natures_guardian = 22144, -- 30884
|
|
ancestral_guidance = 22172, -- 108281
|
|
wind_rush_totem = 21966, -- 192077
|
|
|
|
surge_of_power = 22145, -- 262303
|
|
primal_elementalist = 19266, -- 117013
|
|
icefury = 23111, -- 210714
|
|
|
|
unlimited_power = 21198, -- 260895
|
|
stormkeeper = 22153, -- 191634
|
|
ascendance = 21675, -- 114050
|
|
} )
|
|
|
|
-- PvP Talents
|
|
spec:RegisterPvpTalents( {
|
|
control_of_lava = 728, -- 204393
|
|
counterstrike_totem = 3490, -- 204331
|
|
grounding_totem = 3620, -- 204336
|
|
lightning_lasso = 731, -- 305483
|
|
seasoned_winds = 5415, -- 355630
|
|
skyfury_totem = 3488, -- 204330
|
|
spectral_recovery = 3062, -- 204261
|
|
static_field_totem = 727, -- 355580
|
|
swelling_waves = 3621, -- 204264
|
|
traveling_storms = 730, -- 204403
|
|
unleash_shield = 3491, -- 356736
|
|
} )
|
|
|
|
-- Auras
|
|
spec:RegisterAuras( {
|
|
ancestral_guidance = {
|
|
id = 108281,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
|
|
ascendance = {
|
|
id = 114050,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
|
|
astral_shift = {
|
|
id = 108271,
|
|
duration = function () return level > 53 and 12 or 8 end,
|
|
max_stack = 1,
|
|
},
|
|
|
|
celestial_guidance = {
|
|
id = 324748,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
|
|
earth_shield = {
|
|
id = 974,
|
|
duration = 600,
|
|
type = "Magic",
|
|
max_stack = 9,
|
|
},
|
|
|
|
earthbind = {
|
|
id = 3600,
|
|
duration = 5,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
-- might be the debuff on targets
|
|
earthquake = {
|
|
id = 61882,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
|
|
echoing_shock = {
|
|
id = 320125,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
|
|
elemental_blast = {
|
|
duration = 10,
|
|
type = "Magic",
|
|
max_stack = 3,
|
|
generate = function ()
|
|
local eb = buff.elemental_blast
|
|
|
|
local count = ( buff.elemental_blast_critical_strike.up and 1 or 0 ) +
|
|
( buff.elemental_blast_haste.up and 1 or 0 ) +
|
|
( buff.elemental_blast_mastery.up and 1 or 0 )
|
|
local applied = max( buff.elemental_blast_critical_strike.applied,
|
|
buff.elemental_blast_haste.applied,
|
|
buff.elemental_blast_mastery.applied )
|
|
|
|
eb.name = class.abilities.elemental_blast.name or "Elemental Blast"
|
|
eb.count = count
|
|
eb.applied = applied
|
|
eb.expires = applied + 15
|
|
eb.caster = count > 0 and "player" or "nobody"
|
|
end
|
|
},
|
|
|
|
elemental_blast_critical_strike = {
|
|
id = 118522,
|
|
duration = 10,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
elemental_blast_haste = {
|
|
id = 173183,
|
|
duration = 10,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
elemental_blast_mastery = {
|
|
id = 173184,
|
|
duration = 10,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
elemental_fury = {
|
|
id = 60188,
|
|
},
|
|
|
|
far_sight = {
|
|
id = 6196,
|
|
duration = 60,
|
|
max_stack = 1,
|
|
},
|
|
|
|
flame_shock = {
|
|
id = 188389,
|
|
duration = function () return level > 58 and ( fire_elemental.up or storm_elemental.up ) and 36 or 18 end,
|
|
tick_time = function () return 2 * haste end,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
frost_shock = {
|
|
id = 196840,
|
|
duration = 6,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
ghost_wolf = {
|
|
id = 2645,
|
|
duration = 3600,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
icefury = {
|
|
id = 210714,
|
|
duration = 15,
|
|
max_stack = 4,
|
|
},
|
|
|
|
lava_surge = {
|
|
id = 77762,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
|
|
lightning_lasso = {
|
|
id = 305484,
|
|
duration = 5,
|
|
max_stack = 1
|
|
},
|
|
|
|
lightning_shield = {
|
|
id = 192106,
|
|
duration = 1800,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
master_of_the_elements = {
|
|
id = 260734,
|
|
duration = 15,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
primordial_wave = {
|
|
id = 327164,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
|
|
reincarnation = {
|
|
id = 20608,
|
|
},
|
|
|
|
spirit_wolf = {
|
|
id = 260881,
|
|
duration = 3600,
|
|
max_stack = 4,
|
|
},
|
|
|
|
spiritwalkers_grace = {
|
|
id = 79206,
|
|
duration = 15,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
},
|
|
|
|
static_discharge = {
|
|
id = 342243,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
},
|
|
|
|
stormkeeper = {
|
|
id = 191634,
|
|
duration = 15,
|
|
max_stack = 2,
|
|
},
|
|
|
|
surge_of_power = {
|
|
id = 285514,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
|
|
surge_of_power_debuff = {
|
|
id = 285515,
|
|
duration = 6,
|
|
max_stack = 1,
|
|
},
|
|
|
|
thunderstorm = {
|
|
id = 51490,
|
|
duration = 5,
|
|
max_stack = 1,
|
|
},
|
|
|
|
unlimited_power = {
|
|
id = 272737,
|
|
duration = 10,
|
|
max_stack = 99,
|
|
},
|
|
|
|
water_walking = {
|
|
id = 546,
|
|
duration = 600,
|
|
max_stack = 1,
|
|
},
|
|
|
|
wind_rush = {
|
|
id = 192082,
|
|
duration = 5,
|
|
max_stack = 1,
|
|
},
|
|
|
|
wind_gust = {
|
|
id = 263806,
|
|
duration = 30,
|
|
max_stack = 20
|
|
},
|
|
|
|
|
|
-- Pet aura.
|
|
call_lightning = {
|
|
duration = 15,
|
|
generate = function( t, db )
|
|
if storm_elemental.up then
|
|
local name, _, count, _, duration, expires = FindUnitBuffByID( "pet", 157348 )
|
|
|
|
if name then
|
|
t.count = count
|
|
t.expires = expires
|
|
t.applied = expires - duration
|
|
t.caster = "pet"
|
|
return
|
|
end
|
|
end
|
|
|
|
t.count = 0
|
|
t.expires = 0
|
|
t.applied = 0
|
|
t.caster = "nobody"
|
|
end,
|
|
},
|
|
|
|
|
|
-- Legendaries
|
|
-- TODO: Implement like Bloodtalons, but APL doesn't really require it mechanically.
|
|
elemental_equilibrium = {
|
|
id = 347348,
|
|
duration = 10,
|
|
max_stack = 1
|
|
},
|
|
|
|
elemental_equilibrium_debuff = {
|
|
id = 347349,
|
|
duration = 30,
|
|
max_stack = 1
|
|
},
|
|
|
|
-- Conduit
|
|
swirling_currents = {
|
|
id = 338340,
|
|
duration = 15,
|
|
max_stack = 1
|
|
}
|
|
} )
|
|
|
|
|
|
-- Pets
|
|
spec:RegisterPet( "primal_storm_elemental", 77942, "storm_elemental", function() return 30 * ( 1 + ( 0.01 * conduit.call_of_flame.mod ) ) end )
|
|
spec:RegisterTotem( "greater_storm_elemental", 1020304 ) -- Texture ID
|
|
|
|
spec:RegisterPet( "primal_fire_elemental", 61029, "fire_elemental", function() return 30 * ( 1 + ( 0.01 * conduit.call_of_flame.mod ) ) end )
|
|
spec:RegisterTotem( "greater_fire_elemental", 135790 ) -- Texture ID
|
|
|
|
spec:RegisterPet( "primal_earth_elemental", 61056, "earth_elemental", 60 )
|
|
spec:RegisterTotem( "greater_earth_elemental", 136024 ) -- Texture ID
|
|
|
|
local elementals = {
|
|
[77942] = { "primal_storm_elemental", function() return 30 * ( 1 + ( 0.01 * state.conduit.call_of_flame.mod ) ) end, true },
|
|
[61029] = { "primal_fire_elemental", function() return 30 * ( 1 + ( 0.01 * state.conduit.call_of_flame.mod ) ) end, true },
|
|
[61056] = { "primal_earth_elemental", function () return 60 end, false }
|
|
}
|
|
|
|
local death_events = {
|
|
UNIT_DIED = true,
|
|
UNIT_DESTROYED = true,
|
|
UNIT_DISSIPATES = true,
|
|
PARTY_KILL = true,
|
|
SPELL_INSTAKILL = true,
|
|
}
|
|
|
|
local summon = {}
|
|
local wipe = table.wipe
|
|
|
|
local vesper_heal = 0
|
|
local vesper_damage = 0
|
|
local vesper_used = 0
|
|
|
|
local vesper_expires = 0
|
|
local vesper_guid
|
|
local vesper_last_proc = 0
|
|
|
|
spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
|
|
-- Deaths/despawns.
|
|
if death_events[ subtype ] then
|
|
if destGUID == summon.guid then
|
|
wipe( summon )
|
|
elseif destGUID == vesper_guid then
|
|
vesper_guid = nil
|
|
end
|
|
return
|
|
end
|
|
|
|
if sourceGUID == state.GUID then
|
|
-- Summons.
|
|
if subtype == "SPELL_SUMMON" then
|
|
local npcid = destGUID:match("(%d+)-%x-$")
|
|
npcid = npcid and tonumber( npcid ) or -1
|
|
local elem = elementals[ npcid ]
|
|
|
|
if elem then
|
|
summon.guid = destGUID
|
|
summon.type = elem[1]
|
|
summon.duration = elem[2]()
|
|
summon.expires = GetTime() + summon.duration
|
|
summon.extends = elem[3]
|
|
end
|
|
|
|
if spellID == 324386 then
|
|
vesper_guid = destGUID
|
|
vesper_expires = GetTime() + 30
|
|
|
|
vesper_heal = 3
|
|
vesper_damage = 3
|
|
vesper_used = 0
|
|
end
|
|
|
|
-- Tier 28
|
|
elseif summon.extends and state.set_bonus.tier28_4pc > 0 and subtype == "SPELL_ENERGIZE" and ( spellID == 51505 or spellID == 285466 ) then
|
|
summon.expires = summon.expires + 1.5
|
|
summon.duration = summon.duration + 1.5
|
|
|
|
-- Vesper Totem heal
|
|
elseif spellID == 324522 then
|
|
local now = GetTime()
|
|
|
|
if vesper_last_proc + 0.75 < now then
|
|
vesper_last_proc = now
|
|
vesper_used = vesper_used + 1
|
|
vesper_heal = vesper_heal - 1
|
|
end
|
|
|
|
-- Vesper Totem damage; only fires on SPELL_DAMAGE...
|
|
elseif spellID == 324520 then
|
|
local now = GetTime()
|
|
|
|
if vesper_last_proc + 0.75 < now then
|
|
vesper_last_proc = now
|
|
vesper_used = vesper_used + 1
|
|
vesper_damage = vesper_damage - 1
|
|
end
|
|
|
|
end
|
|
|
|
if subtype == "SPELL_CAST_SUCCESS" then
|
|
-- Reset in case we need to deal with an instant after a hardcast.
|
|
vesper_last_proc = 0
|
|
end
|
|
end
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "vesper_totem_heal_charges", function()
|
|
return vesper_heal
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "vesper_totem_dmg_charges", function ()
|
|
return vesper_damage
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "vesper_totem_used_charges", function ()
|
|
return vesper_used
|
|
end )
|
|
|
|
spec:RegisterStateFunction( "trigger_vesper_heal", function ()
|
|
if vesper_totem_heal_charges > 0 then
|
|
vesper_totem_heal_charges = vesper_totem_heal_charges - 1
|
|
vesper_totem_used_charges = vesper_totem_used_charges + 1
|
|
end
|
|
end )
|
|
|
|
spec:RegisterStateFunction( "trigger_vesper_damage", function ()
|
|
if vesper_totem_dmg_charges > 0 then
|
|
vesper_totem_dmg_charges = vesper_totem_dmg_charges - 1
|
|
vesper_totem_used_charges = vesper_totem_used_charges + 1
|
|
end
|
|
end )
|
|
|
|
|
|
spec:RegisterTotem( "liquid_magma_totem", 971079 )
|
|
spec:RegisterTotem( "tremor_totem", 136108 )
|
|
spec:RegisterTotem( "wind_rush_totem", 538576 )
|
|
|
|
spec:RegisterTotem( "vesper_totem", 3565451 )
|
|
|
|
|
|
spec:RegisterStateTable( "fire_elemental", setmetatable( { onReset = function( self ) self.cast_time = nil end }, {
|
|
__index = function( t, k )
|
|
if k == "cast_time" then
|
|
t.cast_time = class.abilities.fire_elemental.lastCast or 0
|
|
return t.cast_time
|
|
end
|
|
|
|
local elem = talent.primal_elementalist.enabled and pet.primal_fire_elemental or pet.greater_fire_elemental
|
|
|
|
if k == "active" or k == "up" then
|
|
return elem.up
|
|
|
|
elseif k == "down" then
|
|
return not elem.up
|
|
|
|
elseif k == "remains" then
|
|
return max( 0, elem.remains )
|
|
|
|
end
|
|
|
|
return false
|
|
end
|
|
} ) )
|
|
|
|
spec:RegisterStateTable( "storm_elemental", setmetatable( { onReset = function( self ) self.cast_time = nil end }, {
|
|
__index = function( t, k )
|
|
if k == "cast_time" then
|
|
t.cast_time = class.abilities.storm_elemental.lastCast or 0
|
|
return t.cast_time
|
|
end
|
|
|
|
local elem = talent.primal_elementalist.enabled and pet.primal_storm_elemental or pet.greater_storm_elemental
|
|
|
|
if k == "active" or k == "up" then
|
|
return elem.up
|
|
|
|
elseif k == "down" then
|
|
return not elem.up
|
|
|
|
elseif k == "remains" then
|
|
return max( 0, elem.remains )
|
|
|
|
end
|
|
|
|
return false
|
|
end
|
|
} ) )
|
|
|
|
spec:RegisterStateTable( "earth_elemental", setmetatable( { onReset = function( self ) self.cast_time = nil end }, {
|
|
__index = function( t, k )
|
|
if k == "cast_time" then
|
|
t.cast_time = class.abilities.earth_elemental.lastCast or 0
|
|
return t.cast_time
|
|
end
|
|
|
|
local elem = talent.primal_elementalist.enabled and pet.primal_earth_elemental or pet.greater_earth_elemental
|
|
|
|
if k == "active" or k == "up" then
|
|
return elem.up
|
|
|
|
elseif k == "down" then
|
|
return not elem.up
|
|
|
|
elseif k == "remains" then
|
|
return max( 0, elem.remains )
|
|
|
|
end
|
|
|
|
return false
|
|
end
|
|
} ) )
|
|
|
|
|
|
-- Tier 28
|
|
spec:RegisterGear( "tier28", 188925, 188924, 188923, 188922, 188920 )
|
|
spec:RegisterSetBonuses( "tier28_2pc", 364472, "tier28_4pc", 363671 )
|
|
-- 2-Set - Fireheart - While your Storm Elemental / Fire Elemental is active, your Lava Burst deals 20% additional damage and you gain Lava Surge every 8 sec.
|
|
-- 4-Set - Fireheart - Casting Lava Burst extends the duration of your Storm Elemental / Fire Elemental by 1.5 sec. If your Storm Elemental / Fire Elemental is not active. Lava Burst has a 20% chance to reduce its remaining cooldown by 10 sec instead.
|
|
spec:RegisterAura( "fireheart", {
|
|
id = 364523,
|
|
duration = 30,
|
|
max_stack = 1
|
|
} )
|
|
|
|
|
|
local TriggerFireheart = setfenv( function()
|
|
applyBuff( "lava_surge" )
|
|
end, state )
|
|
|
|
|
|
spec:RegisterHook( "reset_precast", function ()
|
|
if talent.master_of_the_elements.enabled and action.lava_burst.in_flight and buff.master_of_the_elements.down then
|
|
applyBuff( "master_of_the_elements" )
|
|
end
|
|
|
|
if vesper_expires > 0 and now > vesper_expires then
|
|
vesper_expires = 0
|
|
vesper_heal = 0
|
|
vesper_damage = 0
|
|
vesper_used = 0
|
|
end
|
|
|
|
vesper_totem_heal_charges = nil
|
|
vesper_totem_dmg_charges = nil
|
|
vesper_totem_used_charges = nil
|
|
|
|
if totem.vesper_totem.up then
|
|
applyBuff( "vesper_totem", totem.vesper_totem.remains )
|
|
end
|
|
|
|
rawset( state.pet, "earth_elemental", talent.primal_elementalist.enabled and state.pet.primal_earth_elemental or state.pet.greater_earth_elemental )
|
|
rawset( state.pet, "fire_elemental", talent.primal_elementalist.enabled and state.pet.primal_fire_elemental or state.pet.greater_fire_elemental )
|
|
rawset( state.pet, "storm_elemental", talent.primal_elementalist.enabled and state.pet.primal_storm_elemental or state.pet.greater_storm_elemental )
|
|
|
|
if talent.primal_elementalist.enabled then
|
|
dismissPet( "primal_fire_elemental" )
|
|
dismissPet( "primal_storm_elemental" )
|
|
dismissPet( "primal_earth_elemental" )
|
|
|
|
if summon.expires then
|
|
if summon.expires <= now then
|
|
wipe( summon )
|
|
else
|
|
summonPet( summon.type, summon.expires - now )
|
|
end
|
|
end
|
|
end
|
|
|
|
if buff.fireheart.up then
|
|
if pet.fire_elemental.up then buff.fireheart.expires = pet.fire_elemental.expires
|
|
elseif pet.storm_elemental.up then buff.fireheart.expires = pet.storm_elemental.expires end
|
|
|
|
-- Proc the next Lava Surge from Fireheart.
|
|
local next_ls = 8 - ( ( query_time - buff.fireheart.applied ) % 8 )
|
|
|
|
if next_ls < buff.fireheart.remains then
|
|
state:QueueAuraEvent( "fireheart", TriggerFireheart, query_time + next_ls, "AURA_PERIODIC" )
|
|
end
|
|
end
|
|
end )
|
|
|
|
|
|
-- Abilities
|
|
spec:RegisterAbilities( {
|
|
ancestral_guidance = {
|
|
id = 108281,
|
|
cast = 0,
|
|
cooldown = 120,
|
|
gcd = "off",
|
|
|
|
talent = "ancestral_guidance",
|
|
toggle = "defensives",
|
|
|
|
startsCombat = false,
|
|
texture = 538564,
|
|
|
|
handler = function ()
|
|
applyBuff( "ancestral_guidance" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end
|
|
end,
|
|
},
|
|
|
|
ancestral_spirit = {
|
|
id = 2008,
|
|
cast = 10,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.04,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 136077,
|
|
|
|
handler = function ()
|
|
end,
|
|
},
|
|
|
|
ascendance = {
|
|
id = 114050,
|
|
cast = 0,
|
|
cooldown = 180,
|
|
gcd = "spell",
|
|
|
|
talent = "ascendance",
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = false,
|
|
texture = 135791,
|
|
|
|
handler = function ()
|
|
applyBuff( "ascendance" )
|
|
gainCharges( "lava_burst", 2 )
|
|
end,
|
|
},
|
|
|
|
astral_recall = {
|
|
id = 556,
|
|
cast = function () return 10 * haste end,
|
|
cooldown = 600,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 136010,
|
|
|
|
handler = function ()
|
|
end,
|
|
},
|
|
|
|
astral_shift = {
|
|
id = 108271,
|
|
cast = 0,
|
|
cooldown = 90,
|
|
gcd = "spell",
|
|
|
|
toggle = "defensives",
|
|
|
|
startsCombat = false,
|
|
texture = 538565,
|
|
|
|
handler = function ()
|
|
applyBuff( "astral_shift" )
|
|
end,
|
|
},
|
|
|
|
bloodlust = {
|
|
id = 2825,
|
|
cast = 0,
|
|
cooldown = 300,
|
|
gcd = "spell",
|
|
|
|
spend = 0.22,
|
|
spendType = "mana",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = false,
|
|
texture = 136012,
|
|
|
|
handler = function ()
|
|
applyBuff( "bloodlust" )
|
|
applyDebuff( "player", "sated" )
|
|
if conduit.spiritual_resonance.enabled then
|
|
applyBuff( "spiritwalkers_grace", conduit.spiritual_resonance.mod * 0.001 )
|
|
end
|
|
end,
|
|
},
|
|
|
|
capacitor_totem = {
|
|
id = 192058,
|
|
cast = 0,
|
|
cooldown = function () return 60 + ( conduit.totemic_surge.mod * 0.001 ) end,
|
|
gcd = "spell",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 136013,
|
|
|
|
handler = function ()
|
|
end,
|
|
},
|
|
|
|
--[[ chain_harvest = {
|
|
id = 320674,
|
|
cast = function () return 2.5 * haste end,
|
|
cooldown = 90,
|
|
gcd = "spell",
|
|
|
|
toggle = "covenant",
|
|
|
|
startsCombat = true,
|
|
texture = 3565725,
|
|
|
|
handler = function ()
|
|
end,
|
|
}, ]]
|
|
|
|
chain_heal = {
|
|
id = 1064,
|
|
cast = function ()
|
|
if buff.chains_of_devastation_ch.up then return 0 end
|
|
return 2.5 * haste
|
|
end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.3,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 136042,
|
|
|
|
handler = function ()
|
|
removeBuff( "chains_of_devastation_ch" )
|
|
removeBuff( "echoing_shock" )
|
|
|
|
if legendary.chains_of_devastation.enabled then
|
|
applyBuff( "chains_of_devastation_cl" )
|
|
end
|
|
|
|
if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end
|
|
end,
|
|
},
|
|
|
|
chain_lightning = {
|
|
id = 188443,
|
|
cast = function () return ( buff.stormkeeper.up or buff.chains_of_devastation_cl.up ) and 0 or ( 2 * haste ) end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
nobuff = "ascendance",
|
|
bind = "lava_beam",
|
|
|
|
spend = 0.01,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136015,
|
|
|
|
handler = function ()
|
|
removeBuff( "master_of_the_elements" )
|
|
removeBuff( "echoing_shock" )
|
|
removeBuff( "chains_of_devastation_cl" )
|
|
|
|
if legendary.chains_of_devastation.enabled then
|
|
applyBuff( "chains_of_devastation_ch" )
|
|
end
|
|
|
|
-- 4 MS per target, direct.
|
|
-- 3 MS per target, overload.
|
|
|
|
gain( ( buff.stormkeeper.up and 7 or 4 ) * min( 5, active_enemies ), "maelstrom" )
|
|
removeStack( "stormkeeper" )
|
|
|
|
if pet.storm_elemental.up then
|
|
addStack( "wind_gust", nil, 1 )
|
|
end
|
|
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
cleanse_spirit = {
|
|
id = 51886,
|
|
cast = 0,
|
|
cooldown = 8,
|
|
gcd = "spell",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 236288,
|
|
|
|
handler = function ()
|
|
end,
|
|
},
|
|
|
|
earth_elemental = {
|
|
id = 198103,
|
|
cast = 0,
|
|
cooldown = 300,
|
|
gcd = "spell",
|
|
|
|
toggle = "defensives",
|
|
|
|
startsCombat = false,
|
|
texture = 136024,
|
|
|
|
handler = function ()
|
|
summonPet( talent.primal_elementalist.enabled and "primal_earth_elemental" or "greater_earth_elemental", 60 )
|
|
if conduit.vital_accretion.enabled then
|
|
applyBuff( "vital_accretion" )
|
|
health.max = health.max * ( 1 + ( conduit.vital_accretion.mod * 0.01 ) )
|
|
end
|
|
end,
|
|
|
|
usable = function ()
|
|
return max( cooldown.fire_elemental.true_remains, cooldown.storm_elemental.true_remains ) > 0, "DPS elementals must be on CD first"
|
|
end,
|
|
|
|
timeToReady = function ()
|
|
return max( pet.fire_elemental.remains, pet.storm_elemental.remains, pet.primal_fire_elemental.remains, pet.primal_storm_elemental.remains )
|
|
end,
|
|
|
|
auras = {
|
|
-- Conduit
|
|
vital_accretion = {
|
|
id = 337984,
|
|
duration = 60,
|
|
max_stack = 1
|
|
}
|
|
}
|
|
},
|
|
|
|
earth_shield = {
|
|
id = 974,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
talent = "earth_shield",
|
|
|
|
startsCombat = false,
|
|
texture = 136089,
|
|
|
|
handler = function ()
|
|
applyBuff( "earth_shield" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end
|
|
end,
|
|
},
|
|
|
|
earth_shock = {
|
|
id = 8042,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 60,
|
|
spendType = "maelstrom",
|
|
|
|
startsCombat = true,
|
|
texture = 136026,
|
|
|
|
handler = function ()
|
|
if talent.surge_of_power.enabled then
|
|
applyBuff( "surge_of_power" )
|
|
end
|
|
|
|
if runeforge.echoes_of_great_sundering.enabled then
|
|
applyBuff( "echoes_of_great_sundering" )
|
|
end
|
|
|
|
if runeforge.windspeakers_lava_resurgence.enabled then
|
|
applyBuff( "lava_surge" )
|
|
gainCharges( "lava_burst", 1 )
|
|
applyBuff( "windspeakers_lava_resurgence" )
|
|
end
|
|
|
|
removeBuff( "echoing_shock" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
|
|
auras = {
|
|
windspeakers_lava_resurgence = {
|
|
id = 336065,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
}
|
|
},
|
|
|
|
earthbind_totem = {
|
|
id = 2484,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
spend = 0.02,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136102,
|
|
|
|
handler = function ()
|
|
end,
|
|
},
|
|
|
|
earthquake = {
|
|
id = 61882,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 60,
|
|
spendType = "maelstrom",
|
|
|
|
startsCombat = true,
|
|
texture = 451165,
|
|
|
|
handler = function ()
|
|
removeBuff( "echoes_of_great_sundering" )
|
|
removeBuff( "master_of_the_elements" )
|
|
removeBuff( "echoing_shock" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
|
|
auras = {
|
|
echoes_of_great_sundering = {
|
|
id = 336217,
|
|
duration = 25,
|
|
max_stack = 1
|
|
}
|
|
}
|
|
},
|
|
|
|
echoing_shock = {
|
|
id = 320125,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
spend = 0.03,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 1603013,
|
|
|
|
talent = "echoing_shock",
|
|
|
|
handler = function ()
|
|
applyBuff( "echoing_shock" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
elemental_blast = {
|
|
id = 117014,
|
|
cast = function () return 2 * haste end,
|
|
cooldown = 12,
|
|
gcd = "spell",
|
|
|
|
spend = -30,
|
|
spendType = "maelstrom",
|
|
|
|
startsCombat = true,
|
|
texture = 651244,
|
|
|
|
handler = function ()
|
|
applyBuff( "elemental_blast" )
|
|
|
|
if talent.surge_of_power.enabled then
|
|
applyBuff( "surge_of_power" )
|
|
end
|
|
|
|
if runeforge.echoes_of_great_sundering.enabled then
|
|
applyBuff( "echoes_of_great_sundering" )
|
|
end
|
|
|
|
removeBuff( "master_of_the_elements" )
|
|
removeBuff( "echoing_shock" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
far_sight = {
|
|
id = 6196,
|
|
cast = function () return 2 * haste end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 136034,
|
|
|
|
handler = function ()
|
|
end,
|
|
},
|
|
|
|
fire_elemental = {
|
|
id = 198067,
|
|
cast = 0,
|
|
charges = 1,
|
|
cooldown = 150,
|
|
recharge = 150,
|
|
gcd = "spell",
|
|
|
|
spend = 0.05,
|
|
spendType = "mana",
|
|
|
|
toggle = "cooldowns",
|
|
notalent = "storm_elemental",
|
|
|
|
startsCombat = false,
|
|
texture = 135790,
|
|
|
|
timeToReady = function ()
|
|
return max( pet.earth_elemental.remains, pet.primal_earth_elemental.remains, pet.storm_elemental.remains, pet.primal_storm_elemental.remains )
|
|
end,
|
|
|
|
handler = function ()
|
|
summonPet( talent.primal_elementalist.enabled and "primal_fire_elemental" or "greater_fire_elemental" )
|
|
|
|
if set_bonus.tier28_2pc > 0 then
|
|
applyBuff( "fireheart", pet.fire_elemental.remains )
|
|
state:QueueAuraEvent( "fireheart", TriggerFireheart, query_time + 8, "AURA_PERIODIC" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
flame_shock = {
|
|
id = 188389,
|
|
cast = 0,
|
|
cooldown = 6,
|
|
gcd = "spell",
|
|
|
|
spend = 0.02,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 135813,
|
|
|
|
cycle = "flame_shock",
|
|
min_ttd = function () return debuff.flame_shock.duration / 3 end,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "flame_shock" )
|
|
|
|
if buff.surge_of_power.up then
|
|
active_dot.surge_of_power = min( active_enemies, active_dot.flame_shock + 1 )
|
|
removeBuff( "surge_of_power" )
|
|
end
|
|
|
|
removeBuff( "echoing_shock" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
frost_shock = {
|
|
id = 196840,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.02,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 135849,
|
|
|
|
handler = function ()
|
|
removeBuff( "master_of_the_elements" )
|
|
removeBuff( "echoing_shock" )
|
|
|
|
applyDebuff( "target", "frost_shock" )
|
|
|
|
if buff.icefury.up then
|
|
gain( 8, "maelstrom" )
|
|
removeStack( "icefury", 1 )
|
|
end
|
|
|
|
if buff.surge_of_power.up then
|
|
applyDebuff( "target", "surge_of_power_debuff" )
|
|
removeBuff( "surge_of_power" )
|
|
end
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
ghost_wolf = {
|
|
id = 2645,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 136095,
|
|
|
|
handler = function ()
|
|
applyBuff( "ghost_wolf" )
|
|
if talent.spirit_wolf.enabled then applyBuff( "spirit_wolf" ) end
|
|
if conduit.thunderous_paws.enabled then applyBuff( "thunderous_paws" ) end
|
|
end,
|
|
},
|
|
|
|
healing_stream_totem = {
|
|
id = 5394,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
spend = 0.09,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 135127,
|
|
|
|
handler = function ()
|
|
if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end
|
|
if conduit.swirling_currents.enabled then applyBuff( "swirling_currents" ) end
|
|
end,
|
|
},
|
|
|
|
healing_surge = {
|
|
id = 8004,
|
|
cast = function () return 1.5 * haste end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.24,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
texture = 136044,
|
|
|
|
handler = function ()
|
|
removeBuff( "echoing_shock" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end
|
|
if buff.swirling_currents.up then removeStack( "swirling_currents" ) end
|
|
end,
|
|
},
|
|
|
|
hex = {
|
|
id = 51514,
|
|
cast = function () return 1.7 * haste end,
|
|
cooldown = function () return level > 55 and 20 or 30 end,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 237579,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "hex" )
|
|
end,
|
|
|
|
auras = {
|
|
-- Conduit
|
|
crippling_hex = {
|
|
id = 338055,
|
|
duration = 8,
|
|
max_stack = 1
|
|
}
|
|
}
|
|
},
|
|
|
|
icefury = {
|
|
id = 210714,
|
|
cast = 2,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
spend = 0.03,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 135855,
|
|
|
|
talent = "icefury",
|
|
|
|
handler = function ()
|
|
removeBuff( "master_of_the_elements" )
|
|
removeBuff( "echoing_shock" )
|
|
|
|
applyBuff( "icefury", 15, 4 )
|
|
gain( 25, "maelstrom" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
lava_beam = {
|
|
id = 114074,
|
|
cast = function () return 2 * haste end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
buff = "ascendance",
|
|
bind = "chain_lightning",
|
|
|
|
startsCombat = true,
|
|
texture = 236216,
|
|
|
|
handler = function ()
|
|
removeBuff( "echoing_shock" )
|
|
|
|
-- 4 MS per target, direct.
|
|
-- 3 MS per target, overload.
|
|
|
|
gain( ( buff.stormkeeper.up and 7 or 4 ) * min( 5, active_enemies ), "maelstrom" )
|
|
removeStack( "stormkeeper" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
lava_burst = {
|
|
id = 51505,
|
|
cast = function () return buff.lava_surge.up and 0 or ( 2 * haste ) end,
|
|
charges = function () return talent.echo_of_the_elements.enabled and 2 or nil end,
|
|
cooldown = function () return buff.ascendance.up and 0 or ( 8 * haste ) end,
|
|
recharge = function () return buff.ascendance.up and 0 or ( 8 * haste ) end,
|
|
gcd = "spell",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 237582,
|
|
|
|
velocity = 30,
|
|
|
|
indicator = function()
|
|
return active_enemies > 1 and settings.cycle and dot.flame_shock.down and active_dot.flame_shock > 0 and "cycle" or nil
|
|
end,
|
|
|
|
handler = function ()
|
|
removeBuff( "windspeakers_lava_resurgence" )
|
|
removeBuff( "lava_surge" )
|
|
removeBuff( "echoing_shock" )
|
|
|
|
gain( 10, "maelstrom" )
|
|
|
|
if talent.master_of_the_elements.enabled then applyBuff( "master_of_the_elements" ) end
|
|
|
|
if talent.surge_of_power.enabled then
|
|
gainChargeTime( "fire_elemental", 6 )
|
|
removeBuff( "surge_of_power" )
|
|
end
|
|
|
|
if buff.primordial_wave.up and state.spec.elemental and legendary.splintered_elements.enabled then
|
|
applyBuff( "splintered_elements", nil, active_dot.flame_shock )
|
|
end
|
|
removeBuff( "primordial_wave" )
|
|
|
|
if set_bonus.tier28_4pc > 0 then
|
|
if pet.fire_elemental.up then
|
|
pet.fire_elemental.expires = pet.fire_elemental.expires + 1.5
|
|
buff.fireheart.expires = pet.fire_elemental.expires
|
|
elseif pet.storm_elemental.up then
|
|
pet.storm_elemental.expires = pet.storm_elemental.expires + 1.5
|
|
buff.fireheart.expires = pet.storm_elemental.expires
|
|
end
|
|
end
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
|
|
impact = function () end, -- This + velocity makes action.lava_burst.in_flight work in APL logic.
|
|
},
|
|
|
|
lightning_bolt = {
|
|
id = 188196,
|
|
cast = function () return buff.stormkeeper.up and 0 or ( 2 * haste ) end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
essential = true,
|
|
|
|
spend = 0.02,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136048,
|
|
|
|
handler = function ()
|
|
removeBuff( "echoing_shock" )
|
|
|
|
gain( ( buff.stormkeeper.up and 11 or 8 ) + ( buff.surge_of_power.up and 3 or 0 ), "maelstrom" )
|
|
|
|
removeBuff( "master_of_the_elements" )
|
|
removeBuff( "surge_of_power" )
|
|
|
|
removeStack( "stormkeeper" )
|
|
|
|
if pet.storm_elemental.up then
|
|
addStack( "wind_gust", nil, 1 )
|
|
end
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
lightning_lasso = {
|
|
id = 305483,
|
|
cast = function () return 5 * haste end,
|
|
channeled = true,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 1385911,
|
|
|
|
pvptalent = function ()
|
|
if essence.conflict_and_strife.major then return end
|
|
return "lightning_lasso"
|
|
end,
|
|
|
|
start = function ()
|
|
removeBuff( "echoing_shock" )
|
|
applyDebuff( "target", "lightning_lasso" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
|
|
copy = 305485
|
|
},
|
|
|
|
lightning_shield = {
|
|
id = 192106,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.02,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136051,
|
|
|
|
readyTime = function () return buff.lightning_shield.remains - 120 end,
|
|
|
|
handler = function ()
|
|
applyBuff( "lightning_shield" )
|
|
end,
|
|
},
|
|
|
|
liquid_magma_totem = {
|
|
id = 192222,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = true,
|
|
texture = 971079,
|
|
|
|
talent = "liquid_magma_totem",
|
|
|
|
handler = function ()
|
|
summonTotem( "liquid_magma_totem" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
primal_strike = {
|
|
id = 73899,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.09,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 460956,
|
|
|
|
handler = function ()
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
purge = {
|
|
id = 370,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136075,
|
|
|
|
toggle = "interrupts",
|
|
interrupt = true,
|
|
|
|
buff = "dispellable_magic",
|
|
|
|
handler = function ()
|
|
removeBuff( "dispellable_magic" )
|
|
end,
|
|
},
|
|
|
|
spiritwalkers_grace = {
|
|
id = 79206,
|
|
cast = 0,
|
|
cooldown = 120,
|
|
gcd = "spell",
|
|
|
|
spend = 0.14,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 451170,
|
|
|
|
handler = function ()
|
|
applyBuff( "spiritwalkers_grace" )
|
|
end,
|
|
},
|
|
|
|
static_discharge = {
|
|
id = 342243,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
|
|
spend = 0.03,
|
|
spendType = "mana",
|
|
|
|
startsCombat = off,
|
|
texture = 135845,
|
|
|
|
talent = "static_discharge",
|
|
buff = "lightning_shield",
|
|
|
|
handler = function ()
|
|
applyBuff( "static_discharge" )
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
storm_elemental = {
|
|
id = 192249,
|
|
cast = 0,
|
|
charges = 1,
|
|
cooldown = 150,
|
|
recharge = 150,
|
|
gcd = "spell",
|
|
|
|
toggle = "cooldowns",
|
|
talent = "storm_elemental",
|
|
|
|
startsCombat = true,
|
|
texture = 2065626,
|
|
|
|
timeToReady = function ()
|
|
return max( pet.earth_elemental.remains, pet.primal_earth_elemental.remains, pet.fire_elemental.remains, pet.primal_fire_elemental.remains )
|
|
end,
|
|
|
|
handler = function ()
|
|
summonPet( talent.primal_elementalist.enabled and "primal_storm_elemental" or "greater_storm_elemental" )
|
|
|
|
if set_bonus.tier28_2pc > 0 then
|
|
applyBuff( "fireheart", pet.storm_elemental.remains )
|
|
state:QueueAuraEvent( "fireheart", TriggerFireheart, query_time + 8, "AURA_PERIODIC" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
stormkeeper = {
|
|
id = 191634,
|
|
cast = function () return 1.5 * haste end,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = false,
|
|
texture = 839977,
|
|
|
|
talent = "stormkeeper",
|
|
|
|
handler = function ()
|
|
applyBuff( "stormkeeper", 20, 2 )
|
|
end,
|
|
},
|
|
|
|
thunderstorm = {
|
|
id = 51490,
|
|
cast = 0,
|
|
cooldown = 45,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 237589,
|
|
|
|
handler = function ()
|
|
if target.within10 then applyDebuff( "target", "thunderstorm" ) end
|
|
|
|
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
|
|
end,
|
|
},
|
|
|
|
tremor_totem = {
|
|
id = 8143,
|
|
cast = 0,
|
|
cooldown = function () return 60 + ( conduit.totemic_surge.mod * 0.001 ) end,
|
|
gcd = "spell",
|
|
|
|
spend = 0.02,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136108,
|
|
|
|
handler = function ()
|
|
summonTotem( "tremor_totem" )
|
|
end,
|
|
},
|
|
|
|
water_walking = {
|
|
id = 546,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 135863,
|
|
|
|
handler = function ()
|
|
applyBuff( "water_walking" )
|
|
end,
|
|
},
|
|
|
|
wind_rush_totem = {
|
|
id = 192077,
|
|
cast = 0,
|
|
cooldown = 120,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 538576,
|
|
|
|
talent = "wind_rush_totem",
|
|
|
|
handler = function ()
|
|
summonTotem( "wind_rush_totem" )
|
|
end,
|
|
},
|
|
|
|
wind_shear = {
|
|
id = 57994,
|
|
cast = 0,
|
|
cooldown = 12,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
texture = 136018,
|
|
|
|
toggle = "interrupts",
|
|
|
|
debuff = "casting",
|
|
readyTime = state.timeToInterrupt,
|
|
|
|
handler = function ()
|
|
interrupt()
|
|
end,
|
|
},
|
|
|
|
|
|
-- Pet Abilities
|
|
meteor = {
|
|
id = 117588,
|
|
known = function () return talent.primal_elementalist.enabled and not talent.storm_elemental.enabled and fire_elemental.up end,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "off",
|
|
|
|
startsCombat = true,
|
|
texture = 1033911,
|
|
|
|
talent = "primal_elementalist",
|
|
|
|
usable = function () return fire_elemental.up end,
|
|
handler = function () end,
|
|
},
|
|
|
|
eye_of_the_storm = {
|
|
id = 157375,
|
|
known = function () return talent.primal_elementalist.enabled and talent.storm_elemental.enabled and storm_elemental.up end,
|
|
cast = 0,
|
|
cooldown = 40,
|
|
gcd = "off",
|
|
|
|
startsCombat = true,
|
|
-- texture = ,
|
|
|
|
talent = "primal_elementalist",
|
|
|
|
usable = function () return storm_elemental.up end,
|
|
handler = function () end,
|
|
},
|
|
|
|
|
|
-- Shaman - Kyrian - 324386 - vesper_totem (Vesper Totem)
|
|
vesper_totem = {
|
|
id = 324386,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "totem",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 3565451,
|
|
|
|
toggle = "essences",
|
|
|
|
handler = function ()
|
|
summonPet( "vesper_totem", 30 )
|
|
applyBuff( "vesper_totem" )
|
|
|
|
vesper_totem_heal_charges = 3
|
|
vesper_totem_dmg_charges = 3
|
|
vesper_totem_used_charges = 0
|
|
end,
|
|
|
|
auras = {
|
|
vesper_totem = {
|
|
duration = 30,
|
|
max_stack = 1,
|
|
}
|
|
}
|
|
},
|
|
|
|
-- Shaman - Necrolord - 326059 - primordial_wave (Primordial Wave)
|
|
primordial_wave = {
|
|
id = 326059,
|
|
cast = 0,
|
|
cooldown = 45,
|
|
recharge = 45,
|
|
charges = 1,
|
|
gcd = "spell",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 3578231,
|
|
|
|
toggle = "essences",
|
|
|
|
cycle = "flame_shock",
|
|
velocity = 45,
|
|
|
|
impact = function ()
|
|
applyDebuff( "target", "flame_shock" )
|
|
applyBuff( "primordial_wave" )
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
|
end,
|
|
|
|
auras = {
|
|
primordial_wave = {
|
|
id = 327164,
|
|
duration = 15,
|
|
max_stack = 1
|
|
},
|
|
splintered_elements = {
|
|
id = 354648,
|
|
duration = 10,
|
|
max_stack = 10,
|
|
},
|
|
}
|
|
},
|
|
|
|
-- Shaman - Night Fae - 328923 - fae_transfusion (Fae Transfusion)
|
|
fae_transfusion = {
|
|
id = 328923,
|
|
cast = function () return haste * 3 * ( 1 + ( conduit.essential_extraction.mod * 0.01 ) ) end,
|
|
channeled = true,
|
|
cooldown = 120,
|
|
gcd = "spell",
|
|
|
|
spend = 0.075,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 3636849,
|
|
|
|
toggle = "essences",
|
|
nobuff = "fae_transfusion",
|
|
|
|
start = function ()
|
|
applyBuff( "fae_transfusion" )
|
|
end,
|
|
|
|
tick = function ()
|
|
if legendary.seeds_of_rampant_growth.enabled then
|
|
if state.spec.enhancement then reduceCooldown( "feral_spirit", 9 )
|
|
elseif state.spec.elemental then reduceCooldown( talent.storm_elemental.enabled and "storm_elemental" or "fire_elemental", 6 )
|
|
else reduceCooldown( "healing_tide_totem", 5 ) end
|
|
addStack( "seeds_of_rampant_growth" )
|
|
end
|
|
end,
|
|
|
|
finish = function ()
|
|
if state.spec.enhancement then addStack( "maelstrom_weapon", nil, 3 ) end
|
|
end,
|
|
|
|
auras = {
|
|
fae_transfusion = {
|
|
id = 328933,
|
|
duration = 20,
|
|
max_stack = 1
|
|
},
|
|
seeds_of_rampant_growth = {
|
|
id = 358945,
|
|
duration = 15,
|
|
max_stack = 5
|
|
}
|
|
},
|
|
},
|
|
|
|
fae_transfusion_heal = {
|
|
id = 328930,
|
|
cast = 0,
|
|
channeled = true,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
suffix = "(Heal)",
|
|
|
|
startsCombat = false,
|
|
texture = 3636849,
|
|
|
|
buff = "fae_transfusion",
|
|
|
|
handler = function ()
|
|
removeBuff( "fae_transfusion" )
|
|
end,
|
|
},
|
|
|
|
-- Shaman - Venthyr - 320674 - chain_harvest (Chain Harvest)
|
|
chain_harvest = {
|
|
id = 320674,
|
|
cast = 2.5,
|
|
cooldown = 90,
|
|
gcd = "spell",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 3565725,
|
|
|
|
toggle = "essences",
|
|
|
|
handler = function ()
|
|
if legendary.elemental_conduit.enabled then
|
|
applyDebuff( "target", "flame_shock" )
|
|
active_dot.flame_shock = min( active_enemies, active_dot.flame_shock + min( 5, active_enemies ) )
|
|
end
|
|
end,
|
|
}
|
|
|
|
|
|
} )
|
|
|
|
|
|
--[[ spec:RegisterSetting( "funnel_damage", false, {
|
|
name = "Funnel AOE -> Target",
|
|
desc = function ()
|
|
local s = "If checked, the addon's default priority will encourage you to spread |T135813:0|t Flame Shock but will focus damage on your current target, using |T136026:0|t Earth Shock rather than |T451165:0|t Earthquake."
|
|
|
|
if not Hekili.DB.profile.specs[ state.spec.id ].cycle then
|
|
s = s .. "\n\n|cFFFF0000Requires 'Recommend Target Swaps' on Targeting tab.|r"
|
|
end
|
|
|
|
return s
|
|
end,
|
|
type = "toggle",
|
|
width = 1.5
|
|
} ) ]]
|
|
|
|
|
|
spec:RegisterStateExpr( "funneling", function ()
|
|
return false
|
|
-- return active_enemies > 1 and settings.cycle and settings.funnel_damage
|
|
end )
|
|
|
|
|
|
spec:RegisterSetting( "stack_buffer", 1.1, {
|
|
name = "|T135855:0|t Icefury and |T839977:0|t Stormkeeper Padding",
|
|
desc = "The default priority tries to avoid wasting |T839977:0|t Stormkeeper and |T135855:0|t Icefury stacks with a grace period of 1.1 GCD per stack.\n\n" ..
|
|
"Increasing this number will reduce the likelihood of wasted Icefury / Stormkeeper stacks due to other procs taking priority, and leave you with more time to react.",
|
|
type = "range",
|
|
min = 1,
|
|
max = 2,
|
|
step = 0.01,
|
|
width = "full"
|
|
} )
|
|
|
|
|
|
spec:RegisterOptions( {
|
|
enabled = true,
|
|
|
|
aoe = 3,
|
|
|
|
nameplates = false,
|
|
nameplateRange = 8,
|
|
|
|
damage = true,
|
|
damageDots = true,
|
|
damageExpiration = 8,
|
|
|
|
potion = "potion_of_spectral_intellect",
|
|
|
|
package = "Elemental",
|
|
} )
|
|
|
|
--[[ spec:RegisterSetting( "micromanage_pets", true, {
|
|
name = "Micromanage Primal Elemental Pets",
|
|
desc = "If checked, Meteor, Eye of the Storm, etc. will appear in your recommendations.",
|
|
type = "toggle",
|
|
width = 1.5
|
|
} ) ]]
|
|
|
|
spec:RegisterPack( "Elemental", 20220315, [[dG0KscqiePhbHO2ee9juLWOKs5usPAvOkPxjLywcOBbHuAxi9lPOggQsDmuvTmPKEMqPMgIixdruBtOK(geImoiKCouLO1juImpiW9qu7dr4GcLGwOqXdfkrnrHsGUiec5JqifDsiKQvIQYmHqGBcHqzNOk(jecvTuiKcpfvMQuKRcHqLVkucySqiO9sXFjmyromvlgHhtPjd0Lv2SO(mGrlKtRYRLcZwv3gs7wYVrz4c64qOwouph00jDDPA7c03HGgVqj05fG5luTFI2WVPjdhORZWtR8U1w5DS5NKP8JOIDSssKKHtdiCgUq32WbMHRC0z4qe9dDL6VHl0d4zoOPjdhK1X2z4Iunegl1CZaNg1jOwgAZWdT)UESYI9S2m8qTnB4i63Ri6LHWWb66m80kVBTvEhB(jzk)iQyhRKKHdgoRHNwJ1wnCrhi4kdHHdCqRHdr0p0vQ)YexKJ6LKpeXCSnsM4V1aLPw5DRTk5tYxSCKxadglj5drRmHOxwgoKHDDYeCQEfaKcv32qq0Z5HLPmdlti62L74acuM4uggTXw4WujFiALPyHGGYeIythdltEbktiIcyYelltA0KjoLHrLjhWVIA4cXS89ZWHiJiltiI(HUs9xM4ICuVK8HiJiltiI5yBKmXFRbktTY7wBvYNKpezezzkwoYlGbJLK8HiJiltiALje9YYWHmSRtMGt1RaGuO62gcIEopSmLzyzcr3UChhqGYeNYWOn2chMk5drgrwMq0ktXcbbLjeXMogwM8cuMqefWKjwwM0OjtCkdJktoGFfvYNKpezzcruS4SDDGY0coCaYKEOtM0OjtUvzyz6GYKh0V3j(rL85w9yfKgINLHs4k55ynsSFORu)d8YKjv9FLsdXhQ)I9dDL6)bv6kN4hOKpezzcrCWjtCkdJ2ylCyzkepldLWvzQx)GqzcYqNm5GGqzcH3)Yem0ryjtqgROs(CREScsdXZYqjCTfYnN)bJSypRbEzYqw)jUcKg2HA)Ny4EOESkECiR)exbsdYExVFci7dUsL85w9yfKgINLHs4AlKBgQmmAJTWHd8YKv)xPuOYWOn2chMUYj(bISnSFGIfCLsDqqi1Y6LIGyhpo2pqXcUsPoiiKEfjizE3UKp3QhRG0q8SmucxBHCZ5dpX(HUs9xYNB1JvqAiEwgkHRTqU59dDL6VG4DOg4LjR(VsP7h6k1FbX7qLUYj(bIegU)fQJbMcP2i)kXFarADfacITKpezzkMz9oCYeIGGXitrouMCzsXEW9YKEOlqzsJMm5GGSsMcF3oOmXRA0bLPvkoaEvMyLmflhlOmLzyzk2YeCwwbcLjLjtEq2bktGSoXpeTiccgJmXkzkS)pvYNB1JvqAiEwgkHRTqU53d6cIogQb(xnHfKCSd8YKjv9FLs3p0vQ)cI3HkDLt8dejmC)luhdmfsTr(vI)aI06kaee74Xj65mfQmmAJTWHP9qjFUvpwbPH4zzOeU2c5MTr(vI)aI06kGaVmzsv)xP09dDL6VG4DOsx5e)arcd3)c1XatHuBKFL4pGiTUcGeKJnssj65mfQmmAJTWHP9qjFUvpwbPH4zzOeU2c5Mdz6XkjFs(qKLje9shg3dvzILLjRdvivYNB1JvWwi3mcVcuaJMJL85w9yfSfYnddp8Pi0)gddfay3UarzbVcGm)s(CRESc2c5Mdz6XkjFUvpwbBHCZD4eNouOKp3QhRGTqU587OtaJy2gbEzYTrQ6)kLUFORu)feVdv6kN4hy7ijvpBJRaqsA4ukuzyuX(HUs9N6w9coKTbd3)c1XatHuBKFL4pGiTUcabXoEC1)vkf1H6WcwwOrtSFORuiDLt8dmECCVwMHbgf2iac88gddf5B4aeGd9GJoe3VWWb2UKp3QhRGTqU5q8HYWGN)ce6bxG2aS)eQJbMcjZFGxMmPe9CMgIpugg88xGqp4O9qKTrA4ukuzyuX(HUs9N6w9cU4XHH7FH6yGPqQnYVs8hqKwxbGGyJKONZueEfOaOdvkuDBde0kVJhhY6pXvG0FoOGiaXIfD0WF0voXpW4XX9Azggyuy4FLo8af7h6kfshI7xy4aBhzBWW9VqDmWui1g5xj(disRRaqajhpU6)kLI6qDybll0Oj2p0vkKUYj(bgpoUxlZWaJcBeabEEJHHI8nCacWHEWrhI7xy4aJhhY6pXvG0FoOGiaXIfD0WF0voXpW4XX9Azggyuy4FLo8af7h6kfshI7xy4aBhjPe9CMcd)R0HhOy)qxPqApuYNB1JvWwi3C(D0jGrmBJaVmzs1Z24kaKTrA4ukuzyuX(HUs9N6w9cU4XHH7FH6yGPqQnYVs8hqKwxbGGyJKONZueEfOaOdvkuDBde0kVBhzBWW9VqDmWui1g5xj(disRRaqqSJhx9FLsrDOoSGLfA0e7h6kfsx5e)aJhh3RLzyGrHncGapVXWqr(goab4qp4OdX9lmCGTl5ZT6XkylKBoF4j2p0vQ)s(CRESc2c5MrNogwYNB1JvWwi3mXZyGIChhqGxMmPQ)RuQdTRa9Yo6kN4hy84e9CM6q7kqVSJ2dJh3YypidHf1H2vGEzhfpu)kijizEl5ZT6XkylKBMyy4WnUciWltMu1)vk1H2vGEzhDLt8dmECIEotDODfOx2r7Hs(CRESc2c5MZhEepJbg4LjtQ6)kL6q7kqVSJUYj(bgporpNPo0Uc0l7O9W4XTm2dYqyrDODfOx2rXd1VcscsM3s(CRESc2c5M9YoOI9xy9)d8YKjv9FLsDODfOx2rx5e)aJhNONZuhAxb6LD0Ey84wg7bziSOo0Uc0l7O4H6xbjbjZBjFUvpwbBHCZeoGGLfk(SnGbEzYKQ(VsPo0Uc0l7ORCIFGXJtkrpNPo0Uc0l7O9qjFUvpwbBHCZbhmCyHY0Hk5ZT6XkylKBo7tOyVG5o8yvGxMSLfCLxkToGivK9HKuCVwMHbgfUbcfSSa7OHEPcamdHAeDiUFHHdezBKQ(VsPOouhwWYcnAI9dDLcPRCIFGXJt0ZzkQd1HfSSqJMy)qxPqApSDKWW9VqDmWui1g5xj(disRRaqqSL85w9yfSfYnN9juSxWChESkWlt2YcUYlLwhqKkY(qI71YmmWOWnqOGLfyhn0lvaGziuJOdX9lmCGiBJu1)vkf1H6WcwwOrtSFORuiDLt8dmECIEotrDOoSGLfA0e7h6kfs7HXJdd3)c1XatHuBKFL4pGiTUcGeKJD7iBZYypidHfnF4j2p0vQ)u8q9RGKOvEhpULXEqgclkuzyuX(HUs9NIhQFfKeTY72L85w9yfSfYnJ7LWT6XkXFqnWYrhzNTaHk(Skz(d8YKDREbNy1qVbjrRiBdgU)fQJbMcP2i)kXFarADfajAnECy4(xOogykK(EqxqmhLeT2UKp3QhRGTqUzCVeUvpwj(dQbwo6idVc4NqDmW0aHk(Skz(d8YKjv9FLsHkdJk2p0vQ)0voXpqKUvVGtSAO3GiGCRs(CRESc2c5MX9s4w9yL4pOgy5OJmCc4va)eQJbMgiuXNvjZFGxMS6)kLcvggvSFORu)PRCIFGiDREbNy1qVbra5wL8j5ZT6Xki1zJmuzyuX(HUs9pWltM0WPuOYWOI9dDL6p1T6fCs(CREScsD2AHCZlGjyzHgnbuzy0aVmzIEotT()I)aI06kakEO(vqsqMFEl5ZT6Xki1zRfYnphRriU7nwGxMmrpNPZgXUcqaJy2g0EOKp3QhRGuNTwi3SnYVse54GdQs(CREScsD2AHCZqLHrBSfoCGxMS6)kLcvggTXw4W0voXpqjFUvpwbPoBTqU587OtaJy2gbAdW(tOogykKm)bEzY4LXdg5e)q2wBUvVGtaYuA(D0jGrmBde0ks3QxWjwn0Bqeqo2iTm2dYqyrdXhkddE(lqOhCu8q9RGiG)yfPLfCLxkTMfZEggejPHtPqLHrf7h6k1FQB1l4Ih3T6fCcqMsZVJobmIzBGa(r6w9coXQHEdscYKessdNsHkdJk2p0vQ)u3QxWHu9FLsrDOoSGLfA0e7h6kfsx5e)aBpE82W9AzggyuyJaiWZBmmuKVHdqao0do6qC)cdhissdNsHkdJk2p0vQ)u3QxW1E84TH71YmmWOWW)kD4bk2p0vkKoe3VWWbISn3QxWjazkn)o6eWiMTbcInssX9Azggy0zJydkyzbaEUkG9cC4RaOdX9lmCGXJ7w9cobitP53rNagXSnqaj1oY2Sm2dYqyrdXhkddE(lqOhCu8q9RGiG)ynECIEotdXhkddE(lqOhC0Ey7T3UKp3QhRGuNTwi3C(D0jGrmBJaVmzsDREbNaKP087OtaJy2gijnCkfQmmQy)qxP(tDREbhY2u)xPuuhQdlyzHgnX(HUsH0voXpW4XX9AzggyuyJaiWZBmmuKVHdqao0do6qC)cdhy7XJ3gUxlZWaJcd)R0HhOy)qxPq6qC)cdhiss1Z24kaKe9CMgIpugg88xGqp4O9W2L85w9yfK6S1c5MNnIDfGagXSnc8YKv)xP0zJyxbiGrmBd6kN4hisuFpuXmusqow5nY2W9Azggy0zJydkyzbaEUkG9cC4RaOdX9lmCGij65mD2i2GcwwaGNRcyVah(kaApmECsX9Azggy0zJydkyzbaEUkG9cC4RaOdX9lmCGTl5ZT6Xki1zRfYn7q7kqVSlWltw9FLsDODfOx2rx5e)ar2gPHtPqLHrf7h6k1FQB1l4AhzBKQ(VsPND5ooa6kN4hy84Ks0Zz6zxUJdG2drsQLXEqgcl6zxUJdG2dBxYNB1JvqQZwlKB(pe3pqbQdG6cLPdnWltw9FLs)dX9duG6aOUqz6qPRCIFGs(CREScsD2AHCZ2i)kXFarADfqGxMmmC)luhdmfsTr(vI)aI06kaeqsij65mf1H6WcwwOrtSFORuiThIe13dvmdfbKmVL85w9yfK6S1c5MNJ1ibmIzBe4LjJ71YmmWOZgXguWYca8Cva7f4WxbqhI7xy4arskrpNPZgXguWYca8Cva7f4Wxbq7Hs(CREScsD2AHCZVh0feDmud8YKbzkn)o6eWiMTbfpu)kisy4(xOogykKAJ8Re)beP1vaiGKq2gPHtPqLHrf7h6k1FQB1l4AhzBe9CM(Eqxa7yGr7HijLONZuuhQdlyzHgnX(HUsH0Eis1)vkf1H6WcwwOrtSFORuiDLt8dSDjFUvpwbPoBTqU55yncXDVXc8YKHH7FH6yGPqQnYVs8hqKwxbqcYTIKuCVwMHbgD2i2GcwwaGNRcyVah(ka6qC)cdhiY2u)xPuuhQdlyzHgnX(HUsH0voXpqKO(EOIzOKGmjZBKKs0ZzkQd1HfSSqJMy)qxPqApSDjFUvpwbPoBTqU53d6cIogQbAdW(tOogykKm)bEzYwwWvEP0Awm7zyqK4ETmddm6SrSbfSSaapxfWEbo8va0H4(fgoqKWPccw1Hu9gUveLGKcTij65m99GUa2XaJ2drskrpNPH4dLHbp)fi0doApuYNB1JvqQZwlKB(9GUGOJHAG2aS)eQJbMcjZFGxMmrpNPVh0fWogy0EisIEotdXhkddE(lqOhC0EiY2i65mneFOmm45VaHEWrXd1VcIGyZRawW4XDREbNaKP087OtaJy2gKHH7FH6yGPqQnYVs8hqKwxbepUB1l4eGmLMFhDcyeZ2GCSrskUxlZWaJoBeBqbllaWZvbSxGdFfaDiUFHHdmEC3QxWjazkn)o6eWiMTbzsQDjFUvpwbPoBTqU53d6cIogQbEzYGmLMFhDcyeZ2GIhQFfejmC)luhdmfsTr(vI)aI06kaeqsiX9AzggyuyJaiWZBmmuKVHdqao0do6qC)cdhisIEotFpOlGDmWO9qKQ)RukQd1HfSSqJMy)qxPq6kN4hissj65mf1H6WcwwOrtSFORuiThIe13dvmdLeKjzEl5ZT6Xki1zRfYn)Eqxq0XqnWltgKP087OtaJy2gu8q9RGiBRny4(xOogykKAJ8Re)beP1vaiGKqI71YmmWOWgbqGN3yyOiFdhGaCOhC0H4(fgoqKQ)RukQd1HfSSqJMy)qxPq6kN4hy7XJ3M6)kLI6qDybll0Oj2p0vkKUYj(bIe13dvmdLeKjzEJKuIEotrDOoSGLfA0e7h6kfs7HiBJuCVwMHbgD2i2GcwwaGNRcyVah(ka6qC)cdhy84e9CMoBeBqbllaWZvbSxGdFfaTh2ossX9AzggyuyJaiWZBmmuKVHdqao0do6qC)cdhy7Tl5ZT6Xki1zRfYn)Eqxq0XqnWltgKP087OtaJy2gu8q9RGiHH7FH6yGPqQnYVs8hqKwxbqMKqI71YmmWOWgbqGN3yyOiFdhGaCOhC0H4(fgoqKe9CM(Eqxa7yGr7Hiv)xPuuhQdlyzHgnX(HUsH0voXpqKKs0ZzkQd1HfSSqJMy)qxPqApejQVhQygkjitY8wYNB1JvqQZwlKBEowJqC3BSaVmzy4(xOogykKAJ8Re)beP1vaKGCRs(CREScsD2AHCZ2i)kXFarADfqGxMmrpNPqLHrBSfomfpu)kicInVcyb5vIEotHkdJ2ylCykuDBdjFUvpwbPoBTqU53d6cIogQbAdW(tOogykKm)bEzYWPccw1Hu9gUveLGKcTij65m99GUa2XaJ2drskrpNPH4dLHbp)fi0doApuYNB1JvqQZwlKB(9GUGOJHAGxMmCQGGvDivVHBfrjiPqlsIEotFpOlGDmWO9qKKs0ZzAi(qzyWZFbc9GJ2dL85w9yfK6S1c5MFpOli6yOg4Ljt0Zz67bDbSJbgThIegU)fQJbMcP2i)kXFarADfacijKTrA4ukuzyuX(HUs9N6w9cU2rcYuA(D0jGrmBdQE2gxbi5ZT6Xki1zRfYnVFORu)feVd1aVmz1)vkD)qxP(liEhQ0voXpqKWW9VqDmWui1g5xj(disRRaqajJSnsdNsHkdJk2p0vQ)u3QxW1UKp3QhRGuNTwi387bDbXC0aVmz1)vk1H2vGEzhDLt8duYNB1JvqQZwlKB2g5xj(disRRaK85w9yfK6S1c5MFpOli6yOgikl4vaK5pWltMONZ03d6cyhdmApePLXEqgclbEUvL85w9yfK6S1c5MZVJobmIzBeikl4vaK5pqBa2Fc1XatHK5pWltgVmEWiN4NKp3QhRGuNTwi3CgZGQagXSnceLf8kaY8l5tYNB1JvqkCc4va)eQJbMsgQmmQy)qxP(h4LjtA4ukuzyuX(HUs9N6w9cojFUvpwbPWjGxb8tOogyAlKB(pGiTUcqqWEnWltMONZuyhdmbllcziCyApuYNB1JvqkCc4va)eQJbM2c5MdXhkddE(lqOhCbAdW(tOogykKm)bEzYwwWvEP0Awm7zyqKKs0ZzAi(qzyWZFbc9GJ2drskrpNPWW)kD4bk2p0vkK2dL85w9yfKcNaEfWpH6yGPTqU5fWeSSqJMaQmmAGxMmrpNPw)FXFarADfafpu)kijiZpVL85w9yfKcNaEfWpH6yGPTqU5mMbvbmIzBe4LjR(VsPND5ooa6kN4hisIEotp7YDCa0EisIEotp7YDCau8q9RGiaovVcasHQBBii658W8kGfKxj65m9Sl3XbqHQBBGKONZueEfOaOdvkuDBdeWpIsYNB1JvqkCc4va)eQJbM2c5MZVJobmIzBeOna7pH6yGPqY8h4LjJxgpyKt8tYNB1JvqkCc4va)eQJbM2c5MZygufWiMTrGxMS6)kLE2L74aORCIFGij65m9Sl3Xbq7Hij65m9Sl3XbqXd1VcIa(P8ZRawqELONZ0ZUChhafQUTHKp3QhRGu4eWRa(juhdmTfYnVFORu)feVd1aVmz1)vkD)qxP(liEhQ0voXpqjFUvpwbPWjGxb8tOogyAlKBgQmmAJTWHd8YKv)xPuOYWOn2chMUYj(bk5ZT6Xkifob8kGFc1XatBHCZZgXUcqaJy2gbEzYQ)Ru6SrSRaeWiMTbDLt8dePLXEqgcl67bDbrhdvkEO(vqeqgWcIegU)fQJbMcP2i)kXFarADfacAnECuFpuXmusqow5nsy4(xOogykKAJ8Re)beP1vaKGCRiBJuCVwMHbgD2i2GcwwaGNRcyVah(ka6qC)cdhy84e9CMoBeBqbllaWZvbSxGdFfaTh2UKp3QhRGu4eWRa(juhdmTfYn)Eqxq0XqnWltUnIEotr4vGcGouPq1Tnqa)ikKKs0ZzkXZyGFhQ0Ey7XJt0Zz67bDbSJbgThk5ZT6Xkifob8kGFc1XatBHCZVh0feDmud8YKv)xP0zJyxbiGrmBd6kN4hisIEotNnIDfGagXSnO9qKWW9VqDmWui1g5xj(disRRaqqRs(CREScsHtaVc4NqDmW0wi38CSgH4U3ybEzYQ)Ru6SrSRaeWiMTbDLt8dejrpNPZgXUcqaJy2g0Eisy4(xOogykKAJ8Re)beP1vaKGCRs(CREScsHtaVc4NqDmW0wi38FarADfGGG9AGxMmrpNPqLHrBSfomThk5ZT6Xkifob8kGFc1XatBHCZZXAeI7EJf4Ljt0Zz6SrSbfSSaapxfWEbo8va0EOKp3QhRGu4eWRa(juhdmTfYnphRrcyeZ2iWltggU)fQJbMcP2i)kXFarADfacAfjQVhQygkjihR8gzBe9CMIWRafaDOsHQBBGGw5D84O(EOIzOKGxY72JhVnCVwMHbgD2i2GcwwaGNRcyVah(ka6qC)cdhissj65mD2i2GcwwaGNRcyVah(kaApS94XX9AzggyueEfimCEJHHI3d6c8GDmWk7OdX9lmCGs(CREScsHtaVc4NqDmW0wi38CSgH4U3ybEzYTbd3)c1XatHuBKFL4pGiTUcGe83oY2ifKP087OtaJy2gu8Y4bJCIFTl5ZT6Xkifob8kGFc1XatBHCZ2i)kXFarADfqGxMSB1l4eRg6nij4hz4ukuzyuX(HUs9N6w9coKe9CMs8mg43HkThk5ZT6Xkifob8kGFc1XatBHCZ)beP1vacc2RbEzYHtPqLHrf7h6k1FQB1l4qs0ZzkXZyGFhQ0EOKp3QhRGu4eWRa(juhdmTfYn)Eqxq0XqnWltMONZuhAxb6LD0EOKp3QhRGu4eWRa(juhdmTfYn)Eqxq0XqnWlt2YypidHLap3Qs(CREScsHtaVc4NqDmW0wi387bDbrhd1aVmzlJ9Gmewc8CRI0g5yGbjH6)kLoBetWYcnAI9dDLcPRCIFGs(CREScsHtaVc4NqDmW0wi3CgZGQagXSnc8YKv)xP0ZUChhaDLt8dejrpNPND5ooaApuYNB1JvqkCc4va)eQJbM2c5MTr(vIihhCqvYNB1JvqkCc4va)eQJbM2c5MZ)GrwSN1aVmziR)exbsdYExVFci7dUsrskrpNPbzVR3pbK9bxPIOoQxSdK2dd8kDyCpufhk6apxhz(d8kDyCpufapJWFY8h4v6W4EOkUmziR)exbsdYExVFci7dUsL85w9yfKcNaEfWpH6yGPTqUzO66zfGh0g5yGf4LjR(VsPq11ZkapOnYXaJUYj(bk5ZT6Xkifob8kGFc1XatBHCZZXAKy)qxP(h4LjtQ6)kLgIpu)f7h6k1)dQ0voXpW4Xv)xP0q8H6Vy)qxP(FqLUYj(bISnsdNsHkdJk2p0vQ)u3QxW1UKp3QhRGu4eWRa(juhdmTfYnBJ8Re)beP1vabEzYUvVGtSAO3GKGFKTbd3)c1XatHuBKFL4pGiTUcGe8hpomC)luhdmfsFpOliMJsc(BxYNB1JvqkCc4va)eQJbM2c5M)disRRaeeSxL85w9yfKcNaEfWpH6yGPTqU587OtaJy2gbIYcEfaz(d0gG9NqDmWuiz(d8YKXlJhmYj(j5ZT6Xkifob8kGFc1XatBHCZ53rNagXSnceLf8kaY8h4LjJYco0vkf8GQx2rIyvYNB1JvqkCc4va)eQJbM2c5MZygufWiMTrGOSGxbqMFjFs(CREScsHxb8tOogyk5)aI06kabb71aVm52i65mfQmmAJTWHP4H6xbraCQEfaKcv32qq0Z5H5valiVs0Zzkuzy0gBHdtHQBB0UKp3QhRGu4va)eQJbM2c5MZygufWiMTrGxMS6)kLE2L74aORCIFGij65m9Sl3Xbq7Hij65m9Sl3XbqXd1VcIa4u9kaifQUTHGONZdZRawqELONZ0ZUChhafQUTHKp3QhRGu4va)eQJbM2c5MZVJobmIzBeOna7pH6yGPqY8h4Lj3gP6zBCfq84GmLMFhDcyeZ2GIhQFfebKbSGXJR(VsPo0Uc0l7ORCIFGibzkn)o6eWiMTbfpu)kicAZYypidHf1H2vGEzhfpu)kyle9CM6q7kqVSJc2XUESQDKwg7bziSOo0Uc0l7O4H6xbraj1oY2i65m99GUa2XaJ2dJhNuIEotjEgd87qL2dBxYNB1Jvqk8kGFc1XatBHCZ53rNagXSnc0gG9NqDmWuiz(d8YKj65mneFOmm45VaHEWr7HiXlJhmYj(j5ZT6XkifEfWpH6yGPTqUzhAxb6LDbEzYQ)RuQdTRa9Yo6kN4hiY20dDKGCSY74Xj65mL4zmWVdvApSDKTzzShKHWI(Eqxq0XqLIhQFfKe8UDKTrQ6)kLE2L74aORCIFGXJtkrpNPND5ooaApejPwg7bziSOND5ooaApSDjFUvpwbPWRa(juhdmTfYn)Eqxq0XqnWltMONZ03d6cyhdmApezB4ETmddmkcVcegoVXWqX7bDbEWogyLD0H4(fgoW4XjLONZuuhQdlyzHgnX(HUsH0Eis1)vkf1H6WcwwOrtSFORuiDLt8dSDjFUvpwbPWRa(juhdmTfYnVFORu)feVd1aVmz1)vkD)qxP(liEhQ0voXpqKTH67HkMHIaejE3ossj65m1H2vGEzhThk5ZT6XkifEfWpH6yGPTqUzOYWOn2choWltw9FLsHkdJ2ylCy6kN4hiY2W(bkwWvk1bbHulRxkcID84y)afl4kL6GGq6vKGK5D7iBd13dvmdfbKej1UKp3QhRGu4va)eQJbM2c5MNnIDfGagXSnc8YKv)xP0zJyxbiGrmBd6kN4hislJ9Gmew03d6cIogQu8q9RGiGmGfuYNB1Jvqk8kGFc1XatBHCZVh0feDmud8YKv)xP0zJyxbiGrmBd6kN4hisIEotNnIDfGagXSnO9qjFUvpwbPWRa(juhdmTfYn)hI7hOa1bqDHY0Hg4LjR(VsP)H4(bkqDauxOmDO0voXpqjFUvpwbPWRa(juhdmTfYnphRriU7nwGxMmrpNPZgXguWYca8Cva7f4Wxbq7Hiv)xPuuhQdlyzHgnX(HUsH0voXpqKe9CMI6qDybll0Oj2p0vkK2dL85w9yfKcVc4NqDmW0wi38FarADfGGG9AGxMmrpNPqLHrBSfomThIKONZuuhQdlyzHgnX(HUsH0EisuFpuXmueeR8wYNB1Jvqk8kGFc1XatBHCZZXAeI7EJf4Ljt0Zz6SrSbfSSaapxfWEbo8va0EiY2u)xPuuhQdlyzHgnX(HUsH0voXpqKTr0ZzkQd1HfSSqJMy)qxPqApmEClJ9Gmew03d6cIogQu8q9RGKG3ir99qfZqjbzEzRXJdd3)c1XatHuBKFL4pGiTUcabTIKONZuOYWOn2chM2drAzShKHWI(Eqxq0XqLIhQFfebKbSGThpoPQ)RukQd1HfSSqJMy)qxPq6kN4hy84wg7bziSO7h6k1FbX7qLIhQFfebKHt1RaGuO62gcIEopmVcyb51wBxYNB1Jvqk8kGFc1XatBHCZZXAeI7EJf4Ljdd3)c1XatHuBKFL4pGiTUcGe8JKuqMsZVJobmIzBqXlJhmYj(HKuCVwMHbgD2i2GcwwaGNRcyVah(ka6qC)cdhiY2iv9FLsrDOoSGLfA0e7h6kfsx5e)aJhNONZuuhQdlyzHgnX(HUsH0Ey84wg7bziSOVh0feDmuP4H6xbjbVrI67HkMHscY8YwBxYNB1Jvqk8kGFc1XatBHCZZXAKagXSnc8YKX9AzggyueEfimCEJHHI3d6c8GDmWk7OdX9lmCGij65m1H2vGEzhThk5ZT6XkifEfWpH6yGPTqU53d6cIogQbEzYwg7bziSe45wfzBKs0ZzkQd1HfSSqJMy)qxPqApejrpNPND5ooaApSDjFUvpwbPWRa(juhdmTfYn)Eqxq0XqnWlt2YypidHLap3QiTrogyqsO(VsPZgXeSSqJMy)qxPq6kN4hissj65m9Sl3Xbq7Hs(CREScsHxb8tOogyAlKB(9GUGOJHAGxMS6)kLoBetWYcnAI9dDLcPRCIFGijLONZuuhQdlyzHgnX(HUsH0EisuFpuXmusqMK5nssj65mD2i2GcwwaGNRcyVah(kaApuYNB1Jvqk8kGFc1XatBHCZZXAKagXSnc8YKBd3RLzyGrNnInOGLfa45Qa2lWHVcGoe3VWWbgpomC)luhdmfsTr(vI)aI06kae0A7iBt9FLsrDOoSGLfA0e7h6kfsx5e)arskrpNPZgXguWYca8Cva7f4Wxbq7HiBJONZuuhQdlyzHgnX(HUsH0Ey84O(EOIzOKGmVS14XHH7FH6yGPqQnYVs8hqKwxbGGwrs0Zzkuzy0gBHdt7HiTm2dYqyrFpOli6yOsXd1VcIaYawW2JhNu1)vkf1H6WcwwOrtSFORuiDLt8dmEClJ9Gmew09dDL6VG4DOsXd1VcIaYWP6vaqkuDBdbrpNhMxbSG8ARTl5ZT6XkifEfWpH6yGPTqU5mMbvbmIzBe4LjR(VsPND5ooa6kN4his1)vkf1H6WcwwOrtSFORuiDLt8dejrpNPND5ooaApejrpNPOouhwWYcnAI9dDLcP9qjFUvpwbPWRa(juhdmTfYn)Eqxq0XqnWltMONZuhAxb6LD0EOKp3QhRGu4va)eQJbM2c5MFpOli6yOg4LjBzShKHWsGNBvKKQ(VsPOouhwWYcnAI9dDLcPRCIFGs(CREScsHxb8tOogyAlKB(Sl3Xbe4LjR(VsPND5ooa6kN4hissBd13dvmdLeXMKrAzShKHWI(Eqxq0XqLIhQFfebK5D7s(CREScsHxb8tOogyAlKBoJzqvaJy2gbEzYQ)Ru6zxUJdGUYj(bIKONZ0ZUChhaThISnIEotp7YDCau8q9RGiaWcYRKeVs0Zz6zxUJdGcv32iECIEotHkdJ2ylCyApmECsv)xPuuhQdlyzHgnX(HUsH0voXpW2L85w9yfKcVc4NqDmW0wi387bDbrhdvjFUvpwbPWRa(juhdmTfYnNFhDcyeZ2iqBa2Fc1XatHK5pWltgVmEWiN4NKp3QhRGu4va)eQJbM2c5MZygufWiMTrGxMmUxlZWaJUFORu)fdX97pc81rPdX9lmCGijLONZ09dDL6VyiUF)rGVoQaCe9CM2drsQ6)kLUFORu)feVdv6kN4hissv)xP0zJyxbiGrmBd6kN4hOKp3QhRGu4va)eQJbM2c5MZ)GrwSN1aVmziR)exbsdYExVFci7dUsrskrpNPbzVR3pbK9bxPIOoQxSdK2dd8kDyCpufhk6apxhz(d8kDyCpufapJWFY8h4v6W4EOkUmziR)exbsdYExVFci7dUsL85w9yfKcVc4NqDmW0wi3SnYVse54GdQs(CREScsHxb8tOogyAlKBoJzqvaJy2gbEzYQ)Ru6zxUJdGUYj(bIKONZ0ZUChhaThk5ZT6XkifEfWpH6yGPTqUzO66zfGh0g5yGf4LjR(VsPq11ZkapOnYXaJUYj(bk5ZT6XkifEfWpH6yGPTqU55ynsSFORu)d8YKjv9FLsdXhQ)I9dDL6)bv6kN4hy84KgoLMp8e7h6k1FQB1l4K85w9yfKcVc4NqDmW0wi3SnYVs8hqKwxbe4Ljdd3)c1XatHuBKFL4pGiTUcGe8l5ZT6XkifEfWpH6yGPTqU5)aI06kabb7vjFUvpwbPWRa(juhdmTfYnNFhDcyeZ2iquwWRaiZFG2aS)eQJbMcjZFGxMmEz8GroXpjFUvpwbPWRa(juhdmTfYnNFhDcyeZ2iquwWRaiZFGxMmkl4qxPuWdQEzhjIvjFUvpwbPWRa(juhdmTfYnNXmOkGrmBJarzbVcGm)s(CREScsHxb8tOogyAlKBoJzqvaJy2gbEzYQ)Ru6zxUJdGUYj(bIKONZ0ZUChhaThIKONZ0ZUChhafpu)kicGt1RaGuO62gcIEopmVcyb5vIEotp7YDCauO62ggUGddpwz4PvE3AR8o28ownCi0X1vaqdxSaXcr0GheDEq0mwsMKPMIMmDOHmSktzgwM4fWRa(juhdmLxit4H4(HhOmbzOtM8UYqDDGYKnYlGbPs(qeC1KPw5LXsYuSmRcoSoqzIxaz9N4kqkIqEHmPmzIxaz9N4kqkIq6kN4hiVqMAJ)yX2Ps(K8flqSqen4brNhenJLKjzQPOjthAidRYuMHLjEriEwgkHR8czcpe3p8aLjidDYK3vgQRduMSrEbmivYhIGRMm1ASKmflZQGdRduM4fqw)jUcKIiKxitktM4fqw)jUcKIiKUYj(bYlKP24pwSDQKpebxnzQ1yjzkwMvbhwhOmXlGS(tCfifriVqMuMmXlGS(tCfifriDLt8dKxitUktiIqepIazQn(JfBNk5tYxSaXcr0GheDEq0mwsMKPMIMmDOHmSktzgwM4fWjGxb8tOogykVqMWdX9dpqzcYqNm5DLH66aLjBKxadsL8Hi4QjtTsYXsYuSmRcoSoqzIxaz9N4kqkIqEHmPmzIxaz9N4kqkIq6kN4hiVqMAJ)yX2Ps(K8HOJgYW6aLjswMCRESsM(dQqQKpdN31ig2WXDO931JvXYypRgU)Gk00KHdEfWpH6yGPMMm8WVPjd3kN4hOjgdNfF6WNB4AtMi65mfQmmAJTWHP4H6xbLjeitWP6vaqkuDBdbrpNhwM4vzcWckt8Qmr0Zzkuzy0gBHdtHQBBitTB4CRESYW9hqKwxbiiyVAudpTAAYWTYj(bAIXWzXNo85go1)vk9Sl3Xbqx5e)aLjKYerpNPND5ooaApuMqkte9CME2L74aO4H6xbLjeitWP6vaqkuDBdbrpNhwM4vzcWckt8Qmr0Zz6zxUJdGcv32WW5w9yLHlJzqvaJy2gg1WtSnnz4w5e)anXy4CRESYWLFhDcyeZ2WWzXNo85gU2KjsLj9SnUcqMIhxMazkn)o6eWiMTbfpu)kOmHaYYeGfuMIhxMu)xPuhAxb6LD0voXpqzcPmbYuA(D0jGrmBdkEO(vqzcbYuBYKLXEqgclQdTRa9YokEO(vqzQfzIONZuhAxb6LDuWo21JvYu7YeszYYypidHf1H2vGEzhfpu)kOmHazIKKP2LjKYuBYerpNPVh0fWogy0EOmfpUmrQmr0ZzkXZyGFhQ0EOm1UHZgG9NqDmWuOHh(nQHhsY0KHBLt8d0eJHZT6Xkdx(D0jGrmBddNfF6WNB4i65mneFOmm45VaHEWr7HYeszcVmEWiN4NHZgG9NqDmWuOHh(nQHhs20KHBLt8d0eJHZIpD4ZnCQ)RuQdTRa9Yo6kN4hOmHuMAtM0dDYejiltXkVLP4XLjIEotjEgd87qL2dLP2LjKYuBYKLXEqgcl67bDbrhdvkEO(vqzIeYeVLP2LjKYuBYePYK6)kLE2L74aORCIFGYu84YePYerpNPND5ooaApuMqktKktwg7bziSOND5ooaApuMA3W5w9yLHZH2vGEzNrn8eRMMmCRCIFGMymCw8PdFUHJONZ03d6cyhdmApuMqktTjt4ETmddmkcVcegoVXWqX7bDbEWogyLD0H4(fgoqzkECzIuzIONZuuhQdlyzHgnX(HUsH0EOmHuMu)xPuuhQdlyzHgnX(HUsH0voXpqzQDdNB1JvgU3d6cIogQg1WdIKPjd3kN4hOjgdNfF6WNB4u)xP09dDL6VG4DOsx5e)aLjKYuBYeQVhQygQmHazcrI3Yu7YeszIuzIONZuhAxb6LD0EOHZT6Xkd3(HUs9xq8ounQHheLPjd3kN4hOjgdNfF6WNB4u)xPuOYWOn2chMUYj(bktiLP2KjSFGIfCLsDqqi1Y6LktiqMITmfpUmH9duSGRuQdccPxjtKqMizEltTltiLP2KjuFpuXmuzcbYejrsYu7go3QhRmCqLHrBSfoSrn8Wlnnz4w5e)anXy4S4th(CdN6)kLoBe7kabmIzBqx5e)aLjKYKLXEqgcl67bDbrhdvkEO(vqzcbKLjalOHZT6Xkd3SrSRaeWiMTHrn8WpVnnz4w5e)anXy4S4th(CdN6)kLoBe7kabmIzBqx5e)aLjKYerpNPZgXUcqaJy2g0EOHZT6Xkd37bDbrhdvJA4HF(nnz4w5e)anXy4S4th(CdN6)kL(hI7hOa1bqDHY0Hsx5e)anCUvpwz4(dX9duG6aOUqz6qnQHh(B10KHBLt8d0eJHZIpD4ZnCe9CMoBeBqbllaWZvbSxGdFfaThktiLj1)vkf1H6WcwwOrtSFORuiDLt8duMqkte9CMI6qDybll0Oj2p0vkK2dnCUvpwz4MJ1ie39gZOgE4p2MMmCRCIFGMymCw8PdFUHJONZuOYWOn2chM2dLjKYerpNPOouhwWYcnAI9dDLcP9qzcPmH67HkMHktiqMIvEB4CRESYW9hqKwxbiiyVAudp8tsMMmCRCIFGMymCw8PdFUHJONZ0zJydkyzbaEUkG9cC4RaO9qzcPm1MmP(VsPOouhwWYcnAI9dDLcPRCIFGYeszQnzIONZuuhQdlyzHgnX(HUsH0EOmfpUmzzShKHWI(Eqxq0XqLIhQFfuMiHmXBzcPmH67HkMHktKGSmXlBvMIhxMGH7FH6yGPqQnYVs8hqKwxbitiqMAvMqkte9CMcvggTXw4W0EOmHuMSm2dYqyrFpOli6yOsXd1VcktiGSmbybLP2LP4XLjsLj1)vkf1H6WcwwOrtSFORuiDLt8duMIhxMSm2dYqyr3p0vQ)cI3Hkfpu)kOmHaYYeCQEfaKcv32qq0Z5HLjEvMaSGYeVktTktTB4CRESYWnhRriU7nMrn8WpjBAYWTYj(bAIXWzXNo85goy4(xOogykKAJ8Re)beP1vaYejKj(LjKYePYeitP53rNagXSnO4LXdg5e)KjKYePYeUxlZWaJoBeBqbllaWZvbSxGdFfaDiUFHHduMqktTjtKktQ)RukQd1HfSSqJMy)qxPq6kN4hOmfpUmr0ZzkQd1HfSSqJMy)qxPqApuMIhxMSm2dYqyrFpOli6yOsXd1VcktKqM4TmHuMq99qfZqLjsqwM4LTktTB4CRESYWnhRriU7nMrn8WFSAAYWTYj(bAIXWzXNo85goCVwMHbgfHxbcdN3yyO49GUapyhdSYo6qC)cdhOmHuMi65m1H2vGEzhThA4CRESYWnhRrcyeZ2WOgE4hrY0KHBLt8d0eJHZIpD4ZnCwg7bziSe45wvMqktTjtKkte9CMI6qDybll0Oj2p0vkK2dLjKYerpNPND5ooaApuMA3W5w9yLH79GUGOJHQrn8WpIY0KHBLt8d0eJHZIpD4ZnCwg7bziSe45wvMqkt2ihdmOmrczs9FLsNnIjyzHgnX(HUsH0voXpqzcPmrQmr0Zz6zxUJdG2dnCUvpwz4EpOli6yOAudp8Zlnnz4w5e)anXy4S4th(CdN6)kLoBetWYcnAI9dDLcPRCIFGYeszIuzIONZuuhQdlyzHgnX(HUsH0EOmHuMq99qfZqLjsqwMizEltiLjsLjIEotNnInOGLfa45Qa2lWHVcG2dnCUvpwz4EpOli6yOAudpTYBttgUvoXpqtmgol(0Hp3W1MmH71YmmWOZgXguWYca8Cva7f4WxbqhI7xy4aLP4XLjy4(xOogykKAJ8Re)beP1vaYecKPwLP2LjKYuBYK6)kLI6qDybll0Oj2p0vkKUYj(bktiLjsLjIEotNnInOGLfa45Qa2lWHVcG2dLjKYuBYerpNPOouhwWYcnAI9dDLcP9qzkECzc13dvmdvMibzzIx2QmfpUmbd3)c1XatHuBKFL4pGiTUcqMqGm1QmHuMi65mfQmmAJTWHP9qzcPmzzShKHWI(Eqxq0XqLIhQFfuMqazzcWcktTltXJltKktQ)RukQd1HfSSqJMy)qxPq6kN4hOmfpUmzzShKHWIUFORu)feVdvkEO(vqzcbKLj4u9kaifQUTHGONZdlt8QmbybLjEvMAvMA3W5w9yLHBowJeWiMTHrn80k)MMmCRCIFGMymCw8PdFUHt9FLsp7YDCa0voXpqzcPmP(VsPOouhwWYcnAI9dDLcPRCIFGYeszIONZ0ZUChhaThktiLjIEotrDOoSGLfA0e7h6kfs7Hgo3QhRmCzmdQcyeZ2WOgEATvttgUvoXpqtmgol(0Hp3Wr0ZzQdTRa9YoAp0W5w9yLH79GUGOJHQrn80ASnnz4w5e)anXy4S4th(CdNLXEqgclbEUvLjKYePYK6)kLI6qDybll0Oj2p0vkKUYj(bA4CRESYW9Eqxq0Xq1OgEALKmnz4w5e)anXy4S4th(CdN6)kLE2L74aORCIFGYeszIuzQnzc13dvmdvMiHmfBswMqktwg7bziSOVh0feDmuP4H6xbLjeqwM4Tm1UHZT6Xkd3zxUJdWOgEALKnnz4w5e)anXy4S4th(CdN6)kLE2L74aORCIFGYeszIONZ0ZUChhaThktiLP2KjIEotp7YDCau8q9RGYecKjalOmXRYejjt8Qmr0Zz6zxUJdGcv32qMIhxMi65mfQmmAJTWHP9qzkECzIuzs9FLsrDOoSGLfA0e7h6kfsx5e)aLP2nCUvpwz4YygufWiMTHrn80ASAAYW5w9yLH79GUGOJHQHBLt8d0eJrn80kIKPjd3kN4hOjgdNB1JvgU87OtaJy2ggol(0Hp3WHxgpyKt8ZWzdW(tOogyk0Wd)g1WtRikttgUvoXpqtmgol(0Hp3WH71YmmWO7h6k1FXqC)(JaFDu6qC)cdhOmHuMivMi65mD)qxP(lgI73Fe4RJkahrpNP9qzcPmrQmP(VsP7h6k1FbX7qLUYj(bktiLjsLj1)vkD2i2vacyeZ2GUYj(bA4CRESYWLXmOkGrmBdJA4PvEPPjd3kN4hOjgdNfF6WNB4GS(tCfini7D9(jGSp4kLUYj(bktiLjsLjIEotdYExVFci7dUsfrDuVyhiThA4Ushg3dvXLnCqw)jUcKgK9UE)eq2hCLA4Ushg3dvXHIoWZ1z443W5w9yLHl)dgzXEwnCxPdJ7HQa4ze(B443OgEInVnnz4CRESYWzJ8Reroo4GQHBLt8d0eJrn8eB(nnz4w5e)anXy4S4th(CdN6)kLE2L74aORCIFGYeszIONZ0ZUChhaThA4CRESYWLXmOkGrmBdJA4j2TAAYWTYj(bAIXWzXNo85go1)vkfQUEwb4bTrogy0voXpqdNB1JvgoO66zfGh0g5yGzudpXo2MMmCRCIFGMymCw8PdFUHJuzs9FLsdXhQ)I9dDL6)bv6kN4hOmfpUmrQmfoLMp8e7h6k1FQB1l4mCUvpwz4MJ1iX(HUs93OgEInjzAYWTYj(bAIXWzXNo85goy4(xOogykKAJ8Re)beP1vaYejKj(nCUvpwz4Sr(vI)aI06kaJA4j2KSPjdNB1JvgU)aI06kabb7vd3kN4hOjgJA4j2XQPjdhkl4vagE43WTYj(jqzbVcWeJHZT6Xkdx(D0jGrmBddNna7pH6yGPqdp8B4S4th(CdhEz8GroXpd3kN4hOjgJA4j2isMMmCRCIFGMymCRCIFcuwWRamXy4S4th(Cdhkl4qxPuWdQEzNmrczkwnCUvpwz4YVJobmIzBy4qzbVcWWd)g1WtSruMMmCOSGxby4HFd3kN4NaLf8katmgo3QhRmCzmdQcyeZ2WWTYj(bAIXOgEInV00KHBLt8d0eJHZIpD4ZnCQ)Ru6zxUJdGUYj(bktiLjIEotp7YDCa0EOmHuMi65m9Sl3XbqXd1VcktiqMGt1RaGuO62gcIEopSmXRYeGfuM4vzIONZ0ZUChhafQUTHHZT6XkdxgZGQagXSnmQrnCGl79xnnz4HFttgUvoXpqtmgoWbT4lupwz4q0lDyCpuLjwwMSouHudNB1JvgoeEfOagnhBudpTAAYWHYcEfGHh(nCRCIFcuwWRamXy4CRESYWbdp8Pi0)gddfay3od3kN4hOjgJA4j2MMmCUvpwz4cz6Xkd3kN4hOjgJA4HKmnz4CRESYW1HtC6qHgUvoXpqtmg1WdjBAYWTYj(bAIXWzXNo85gU2KjsLj1)vkD)qxP(liEhQ0voXpqzQDzcPmrQmPNTXvaYeszIuzkCkfQmmQy)qxP(tDREbNmHuMAtMGH7FH6yGPqQnYVs8hqKwxbitiqMITmfpUmP(VsPOouhwWYcnAI9dDLcPRCIFGYu84YeUxlZWaJcBeabEEJHHI8nCacWHEWrhI7xy4aLP2nCUvpwz4YVJobmIzByudpXQPjd3kN4hOjgdNB1JvgUq8HYWGN)ce6bNHZIpD4ZnCKkte9CMgIpugg88xGqp4O9qzcPm1MmrQmfoLcvggvSFORu)PUvVGtMIhxMGH7FH6yGPqQnYVs8hqKwxbitiqMITmHuMi65mfHxbka6qLcv32qMqGm1kVLP4XLjiR)exbs)5GcIaelw0rd)rx5e)aLP4XLjCVwMHbgfg(xPdpqX(HUsH0H4(fgoqzQDzcPm1Mmbd3)c1XatHuBKFL4pGiTUcqMqGmrYYu84YK6)kLI6qDybll0Oj2p0vkKUYj(bktXJlt4ETmddmkSrae45nggkY3Wbiah6bhDiUFHHduMIhxMGS(tCfi9NdkicqSyrhn8hDLt8duMIhxMW9Azggyuy4FLo8af7h6kfshI7xy4aLP2LjKYePYerpNPWW)kD4bk2p0vkK2dnC2aS)eQJbMcn8WVrn8GizAYWTYj(bAIXWzXNo85gosLj9SnUcqMqktTjtKktHtPqLHrf7h6k1FQB1l4KP4XLjy4(xOogykKAJ8Re)beP1vaYecKPyltiLjIEotr4vGcGouPq1TnKjeitTYBzQDzcPm1Mmbd3)c1XatHuBKFL4pGiTUcqMqGmfBzkECzs9FLsrDOoSGLfA0e7h6kfsx5e)aLP4XLjCVwMHbgf2iac88gddf5B4aeGd9GJoe3VWWbktTB4CRESYWLFhDcyeZ2WOgEquMMmCUvpwz4YhEI9dDL6VHBLt8d0eJrn8Wlnnz4CRESYWHoDmSHBLt8d0eJrn8WpVnnz4w5e)anXy4S4th(CdhPYK6)kL6q7kqVSJUYj(bktXJlte9CM6q7kqVSJ2dLP4XLjlJ9GmewuhAxb6LDu8q9RGYejKjsM3go3QhRmCepJbkYDCag1Wd)8BAYWTYj(bAIXWzXNo85gosLj1)vk1H2vGEzhDLt8duMIhxMi65m1H2vGEzhThA4CRESYWrmmC4gxbyudp83QPjd3kN4hOjgdNfF6WNB4ivMu)xPuhAxb6LD0voXpqzkECzIONZuhAxb6LD0EOmfpUmzzShKHWI6q7kqVSJIhQFfuMiHmrY82W5w9yLHlF4r8mgOrn8WFSnnz4w5e)anXy4S4th(CdhPYK6)kL6q7kqVSJUYj(bktXJlte9CM6q7kqVSJ2dLP4XLjlJ9GmewuhAxb6LDu8q9RGYejKjsM3go3QhRmCEzhuX(lS()g1Wd)KKPjd3kN4hOjgdNfF6WNB4ivMu)xPuhAxb6LD0voXpqzkECzIuzIONZuhAxb6LD0EOHZT6XkdhHdiyzHIpBdOrn8WpjBAYW5w9yLHl4GHdluMoud3kN4hOjgJA4H)y10KHBLt8d0eJHZIpD4ZnCwwWvEP06aIur2NmHuMivMW9Azggyu4giuWYcSJg6LkaWmeQr0H4(fgoqzcPm1MmrQmP(VsPOouhwWYcnAI9dDLcPRCIFGYu84YerpNPOouhwWYcnAI9dDLcP9qzQDzcPmbd3)c1XatHuBKFL4pGiTUcqMqGmfBdNB1JvgUSpHI9cM7WJvg1Wd)isMMmCRCIFGMymCw8PdFUHZYcUYlLwhqKkY(KjKYeUxlZWaJc3aHcwwGD0qVubaMHqnIoe3VWWbktiLP2KjsLj1)vkf1H6WcwwOrtSFORuiDLt8duMIhxMi65mf1H6WcwwOrtSFORuiThktXJltWW9VqDmWui1g5xj(disRRaKjsqwMITm1UmHuMAtMSm2dYqyrZhEI9dDL6pfpu)kOmrczQvEltXJltwg7bziSOqLHrf7h6k1FkEO(vqzIeYuR8wMA3W5w9yLHl7tOyVG5o8yLrn8WpIY0KHBLt8d0eJHZIpD4ZnCUvVGtSAO3GYejKPwLjKYuBYemC)luhdmfsTr(vI)aI06kazIeYuRYu84YemC)luhdmfsFpOliMJktKqMAvMA3Wbv8zvdp8B4CRESYWH7LWT6XkXFq1W9hufLJodNZMrn8WpV00KHBLt8d0eJHZIpD4ZnCKktQ)RukuzyuX(HUs9NUYj(bktiLj3QxWjwn0BqzcbKLPwnCqfFw1Wd)go3QhRmC4EjCRESs8hunC)bvr5OZWbVc4NqDmWuJA4PvEBAYWTYj(bAIXWzXNo85go1)vkfQmmQy)qxP(tx5e)aLjKYKB1l4eRg6nOmHaYYuRgoOIpRA4HFdNB1JvgoCVeUvpwj(dQgU)GQOC0z4GtaVc4NqDmWuJAudxiEwgkHRMMm8WVPjd3kN4hOjgdNB1JvgU5ynsSFORu)nCGdAXxOESYWHikwC2UoqzAbhoazsp0jtA0Kj3QmSmDqzYd637e)Ogol(0Hp3WrQmP(VsPH4d1FX(HUs9)GkDLt8d0OgEA10KHBLt8d0eJHZT6Xkdx(hmYI9SA4ah0IVq9yLHdrCWjtCkdJ2ylCyzkepldLWvzQx)GqzcYqNm5GGqzcH3)Yem0ryjtqgROgol(0Hp3Wbz9N4kqAyhQ9FIH7H6Xk6kN4hOmfpUmbz9N4kqAq2769tazFWvkDLt8d0OgEITPjd3kN4hOjgdNfF6WNB4u)xPuOYWOn2chMUYj(bktiLP2KjSFGIfCLsDqqi1Y6LktiqMITmfpUmH9duSGRuQdccPxjtKqMizEltTB4CRESYWbvggTXw4Wg1WdjzAYW5w9yLHlF4j2p0vQ)gUvoXpqtmg1WdjBAYWTYj(bAIXWzXNo85go1)vkD)qxP(liEhQ0voXpqzcPmbd3)c1XatHuBKFL4pGiTUcqMqGmfBdNB1JvgU9dDL6VG4DOAudpXQPjd3kN4hOjgdNB1JvgU3d6cIogQgU)QjSGgUyB4S4th(CdhPYK6)kLUFORu)feVdv6kN4hOmHuMGH7FH6yGPqQnYVs8hqKwxbitiqMITmfpUmr0Zzkuzy0gBHdt7HgoWbT4lupwz4IzwVdNmHiiymYuKdLjxMuShCVmPh6cuM0OjtoiiRKPW3Tdkt8QgDqzALIdGxLjwjtXYXcktzgwMITmbNLvGqzszYKhKDGYeiRt8drlIGGXitSsMc7)tnQHhejttgUvoXpqtmgol(0Hp3WrQmP(VsP7h6k1FbX7qLUYj(bktiLjy4(xOogykKAJ8Re)beP1vaYejiltXwMqktKkte9CMcvggTXw4W0EOHZT6XkdNnYVs8hqKwxbyudpikttgo3QhRmCHm9yLHBLt8d0eJrnQHZzZ0KHh(nnz4w5e)anXy4S4th(CdhPYu4ukuzyuX(HUs9N6w9codNB1JvgoOYWOI9dDL6Vrn80QPjd3kN4hOjgdNfF6WNB4i65m16)l(disRRaO4H6xbLjsqwM4N3go3QhRmClGjyzHgnbuzyuJA4j2MMmCRCIFGMymCw8PdFUHJONZ0zJyxbiGrmBdAp0W5w9yLHBowJqC3BmJA4HKmnz4CRESYWzJ8Reroo4GQHBLt8d0eJrn8qYMMmCRCIFGMymCw8PdFUHt9FLsHkdJ2ylCy6kN4hOHZT6Xkdhuzy0gBHdBudpXQPjd3kN4hOjgdNB1JvgU87OtaJy2ggol(0Hp3WHxgpyKt8tMqktTjtTjtUvVGtaYuA(D0jGrmBdzcbYuRYeszYT6fCIvd9guMqazzk2YeszYYypidHfneFOmm45VaHEWrXd1VcktiqM4pwLjKYKLfCLxkTMfZEgguMqktKktHtPqLHrf7h6k1FQB1l4KP4XLj3QxWjazkn)o6eWiMTHmHazIFzcPm5w9coXQHEdktKGSmrsYeszIuzkCkfQmmQy)qxP(tDREbNmHuMu)xPuuhQdlyzHgnX(HUsH0voXpqzQDzkECzQnzc3RLzyGrHncGapVXWqr(goab4qp4OdX9lmCGYeszIuzkCkfQmmQy)qxP(tDREbNm1UmfpUm1MmH71YmmWOWW)kD4bk2p0vkKoe3VWWbktiLP2Kj3QxWjazkn)o6eWiMTHmHazk2YeszIuzc3RLzyGrNnInOGLfa45Qa2lWHVcGoe3VWWbktXJltUvVGtaYuA(D0jGrmBdzcbYejjtTltiLP2KjlJ9Gmew0q8HYWGN)ce6bhfpu)kOmHazI)yvMIhxMi65mneFOmm45VaHEWr7HYu7Yu7Yu7goBa2Fc1XatHgE43OgEqKmnz4w5e)anXy4S4th(CdhPYKB1l4eGmLMFhDcyeZ2qMqktKktHtPqLHrf7h6k1FQB1l4KjKYuBYK6)kLI6qDybll0Oj2p0vkKUYj(bktXJlt4ETmddmkSrae45nggkY3Wbiah6bhDiUFHHduMAxMIhxMAtMW9Azggyuy4FLo8af7h6kfshI7xy4aLjKYePYKE2gxbitiLjIEotdXhkddE(lqOhC0EOm1UHZT6Xkdx(D0jGrmBdJA4brzAYWTYj(bAIXWzXNo85go1)vkD2i2vacyeZ2GUYj(bktiLjuFpuXmuzIeKLPyL3YeszQnzc3RLzyGrNnInOGLfa45Qa2lWHVcGoe3VWWbktiLjIEotNnInOGLfa45Qa2lWHVcG2dLP4XLjsLjCVwMHbgD2i2GcwwaGNRcyVah(ka6qC)cdhOm1UHZT6Xkd3SrSRaeWiMTHrn8Wlnnz4w5e)anXy4S4th(CdN6)kL6q7kqVSJUYj(bktiLP2KjsLPWPuOYWOI9dDL6p1T6fCYu7YeszQnzIuzs9FLsp7YDCa0voXpqzkECzIuzIONZ0ZUChhaThktiLjsLjlJ9Gmew0ZUChhaThktTB4CRESYW5q7kqVSZOgE4N3MMmCRCIFGMymCw8PdFUHt9FLs)dX9duG6aOUqz6qPRCIFGgo3QhRmC)H4(bkqDauxOmDOg1Wd)8BAYWTYj(bAIXWzXNo85goy4(xOogykKAJ8Re)beP1vaYecKjssMqkte9CMI6qDybll0Oj2p0vkK2dLjKYeQVhQygQmHazIK5THZT6XkdNnYVs8hqKwxbyudp83QPjd3kN4hOjgdNfF6WNB4W9Azggy0zJydkyzbaEUkG9cC4RaOdX9lmCGYeszIuzIONZ0zJydkyzbaEUkG9cC4RaO9qdNB1JvgU5ynsaJy2gg1Wd)X20KHBLt8d0eJHZIpD4ZnCGmLMFhDcyeZ2GIhQFfuMqktWW9VqDmWui1g5xj(disRRaKjeitKKmHuMAtMivMcNsHkdJk2p0vQ)u3QxWjtTltiLP2KjIEotFpOlGDmWO9qzcPmrQmr0ZzkQd1HfSSqJMy)qxPqApuMqktQ)RukQd1HfSSqJMy)qxPq6kN4hOm1UHZT6Xkd37bDbrhdvJA4HFsY0KHBLt8d0eJHZIpD4ZnCWW9VqDmWui1g5xj(disRRaKjsqwMAvMqktKkt4ETmddm6SrSbfSSaapxfWEbo8va0H4(fgoqzcPm1MmP(VsPOouhwWYcnAI9dDLcPRCIFGYeszc13dvmdvMibzzIK5TmHuMivMi65mf1H6WcwwOrtSFORuiThktTB4CRESYWnhRriU7nMrn8WpjBAYWTYj(bAIXW5w9yLH79GUGOJHQHZIpD4ZnCwwWvEP0Awm7zyqzcPmH71YmmWOZgXguWYca8Cva7f4WxbqhI7xy4aLjKYeCQGGvDivVHBfrjiPqRmHuMi65m99GUa2XaJ2dLjKYePYerpNPH4dLHbp)fi0doAp0WzdW(tOogyk0Wd)g1Wd)XQPjd3kN4hOjgdNB1JvgU3d6cIogQgol(0Hp3Wr0Zz67bDbSJbgThktiLjIEotdXhkddE(lqOhC0EOmHuMAtMi65mneFOmm45VaHEWrXd1VcktiqMITmXRYeGfuMIhxMCREbNaKP087OtaJy2gYezzcgU)fQJbMcP2i)kXFarADfGmfpUm5w9cobitP53rNagXSnKjYYuSLjKYePYeUxlZWaJoBeBqbllaWZvbSxGdFfaDiUFHHduMIhxMCREbNaKP087OtaJy2gYezzIKKP2nC2aS)eQJbMcn8WVrn8WpIKPjd3kN4hOjgdNfF6WNB4azkn)o6eWiMTbfpu)kOmHuMGH7FH6yGPqQnYVs8hqKwxbitiqMijzcPmH71YmmWOWgbqGN3yyOiFdhGaCOhC0H4(fgoqzcPmr0Zz67bDbSJbgThktiLj1)vkf1H6WcwwOrtSFORuiDLt8duMqktKkte9CMI6qDybll0Oj2p0vkK2dLjKYeQVhQygQmrcYYejZBdNB1JvgU3d6cIogQg1Wd)ikttgUvoXpqtmgol(0Hp3WbYuA(D0jGrmBdkEO(vqzcPm1Mm1Mmbd3)c1XatHuBKFL4pGiTUcqMqGmrsYeszc3RLzyGrHncGapVXWqr(goab4qp4OdX9lmCGYeszs9FLsrDOoSGLfA0e7h6kfsx5e)aLP2LP4XLP2Kj1)vkf1H6WcwwOrtSFORuiDLt8duMqktO(EOIzOYejiltKmVLjKYePYerpNPOouhwWYcnAI9dDLcP9qzcPm1MmrQmH71YmmWOZgXguWYca8Cva7f4WxbqhI7xy4aLP4XLjIEotNnInOGLfa45Qa2lWHVcG2dLP2LjKYePYeUxlZWaJcBeabEEJHHI8nCacWHEWrhI7xy4aLP2LP2nCUvpwz4EpOli6yOAudp8Zlnnz4w5e)anXy4S4th(CdhitP53rNagXSnO4H6xbLjKYemC)luhdmfsTr(vI)aI06kazISmrsYeszc3RLzyGrHncGapVXWqr(goab4qp4OdX9lmCGYeszIONZ03d6cyhdmApuMqktQ)RukQd1HfSSqJMy)qxPq6kN4hOmHuMivMi65mf1H6WcwwOrtSFORuiThktiLjuFpuXmuzIeKLjsM3go3QhRmCVh0feDmunQHNw5TPjd3kN4hOjgdNfF6WNB4GH7FH6yGPqQnYVs8hqKwxbitKGSm1QHZT6Xkd3CSgH4U3yg1WtR8BAYWTYj(bAIXWzXNo85goIEotHkdJ2ylCykEO(vqzcbYuSLjEvMaSGYeVkte9CMcvggTXw4WuO62ggo3QhRmC2i)kXFarADfGrn80ARMMmCRCIFGMymCUvpwz4EpOli6yOA4S4th(CdhCQGGvDivVHBfrjiPqRmHuMi65m99GUa2XaJ2dLjKYePYerpNPH4dLHbp)fi0doAp0WzdW(tOogyk0Wd)g1WtRX20KHBLt8d0eJHZIpD4ZnCWPccw1Hu9gUveLGKcTYeszIONZ03d6cyhdmApuMqktKkte9CMgIpugg88xGqp4O9qdNB1JvgU3d6cIogQg1WtRKKPjd3kN4hOjgdNfF6WNB4i65m99GUa2XaJ2dLjKYemC)luhdmfsTr(vI)aI06kazcbYejjtiLP2KjsLPWPuOYWOI9dDL6p1T6fCYu7YeszcKP087OtaJy2gu9SnUcWW5w9yLH79GUGOJHQrn80kjBAYWTYj(bAIXWzXNo85go1)vkD)qxP(liEhQ0voXpqzcPmbd3)c1XatHuBKFL4pGiTUcqMqGmrYYeszQnzIuzkCkfQmmQy)qxP(tDREbNm1UHZT6Xkd3(HUs9xq8ounQHNwJvttgUvoXpqtmgol(0Hp3WP(VsPo0Uc0l7ORCIFGgo3QhRmCVh0feZrnQHNwrKmnz4CRESYWzJ8Re)beP1vagUvoXpqtmg1WtRikttgUvoXpqtmgUvoXpbkl4vaMymCw8PdFUHJONZ03d6cyhdmApuMqktwg7bziSe45w1W5w9yLH79GUGOJHQHdLf8kadp8BudpTYlnnz4qzbVcWWd)gUvoXpbkl4vaMymCUvpwz4YVJobmIzBy4Sby)juhdmfA4HFdNfF6WNB4WlJhmYj(z4w5e)anXyudpXM3MMmCOSGxby4HFd3kN4NaLf8katmgo3QhRmCzmdQcyeZ2WWTYj(bAIXOg1WbNaEfWpH6yGPMMm8WVPjd3kN4hOjgdNfF6WNB4ivMcNsHkdJk2p0vQ)u3QxWz4CRESYWbvggvSFORu)nQHNwnnz4w5e)anXy4S4th(CdhrpNPWogycwweYq4W0EOHZT6Xkd3FarADfGGG9Qrn8eBttgUvoXpqtmgo3QhRmCH4dLHbp)fi0dodNfF6WNB4SSGR8sP1Sy2ZWGYeszIuzIONZ0q8HYWGN)ce6bhThktiLjsLjIEotHH)v6WduSFORuiThA4Sby)juhdmfA4HFJA4HKmnz4w5e)anXy4S4th(CdhrpNPw)FXFarADfafpu)kOmrcYYe)82W5w9yLHBbmbll0OjGkdJAudpKSPjd3kN4hOjgdNfF6WNB4u)xP0ZUChhaDLt8duMqkte9CME2L74aO9qzcPmr0Zz6zxUJdGIhQFfuMqGmbNQxbaPq1Tnee9CEyzIxLjalOmXRYerpNPND5ooakuDBdzcPmr0ZzkcVcua0HkfQUTHmHazIFeLHZT6XkdxgZGQagXSnmQHNy10KHBLt8d0eJHZT6Xkdx(D0jGrmBddNfF6WNB4WlJhmYj(z4Sby)juhdmfA4HFJA4brY0KHBLt8d0eJHZIpD4ZnCQ)Ru6zxUJdGUYj(bktiLjIEotp7YDCa0EOmHuMi65m9Sl3XbqXd1VcktiqM4NYVmXRYeGfuM4vzIONZ0ZUChhafQUTHHZT6XkdxgZGQagXSnmQHheLPjd3kN4hOjgdNfF6WNB4u)xP09dDL6VG4DOsx5e)anCUvpwz42p0vQ)cI3HQrn8Wlnnz4w5e)anXy4S4th(CdN6)kLcvggTXw4W0voXpqdNB1JvgoOYWOn2ch2OgE4N3MMmCRCIFGMymCw8PdFUHt9FLsNnIDfGagXSnORCIFGYeszYYypidHf99GUGOJHkfpu)kOmHaYYeGfuMqktWW9VqDmWui1g5xj(disRRaKjeitTktXJltO(EOIzOYejiltXkVLjKYemC)luhdmfsTr(vI)aI06kazIeKLPwLjKYuBYePYeUxlZWaJoBeBqbllaWZvbSxGdFfaDiUFHHduMIhxMi65mD2i2GcwwaGNRcyVah(kaApuMA3W5w9yLHB2i2vacyeZ2WOgE4NFttgUvoXpqtmgol(0Hp3W1Mmr0ZzkcVcua0HkfQUTHmHazIFeLmHuMivMi65mL4zmWVdvApuMAxMIhxMi65m99GUa2XaJ2dnCUvpwz4EpOli6yOAudp83QPjd3kN4hOjgdNfF6WNB4u)xP0zJyxbiGrmBd6kN4hOmHuMi65mD2i2vacyeZ2G2dLjKYemC)luhdmfsTr(vI)aI06kazcbYuRgo3QhRmCVh0feDmunQHh(JTPjd3kN4hOjgdNfF6WNB4u)xP0zJyxbiGrmBd6kN4hOmHuMi65mD2i2vacyeZ2G2dLjKYemC)luhdmfsTr(vI)aI06kazIeKLPwnCUvpwz4MJ1ie39gZOgE4NKmnz4w5e)anXy4S4th(CdhrpNPqLHrBSfomThA4CRESYW9hqKwxbiiyVAudp8tYMMmCRCIFGMymCw8PdFUHJONZ0zJydkyzbaEUkG9cC4RaO9qdNB1JvgU5yncXDVXmQHh(JvttgUvoXpqtmgol(0Hp3Wbd3)c1XatHuBKFL4pGiTUcqMqGm1QmHuMq99qfZqLjsqwMIvEltiLP2KjIEotr4vGcGouPq1TnKjeitTYBzkECzc13dvmdvMiHmXl5Tm1UmfpUm1MmH71YmmWOZgXguWYca8Cva7f4WxbqhI7xy4aLjKYePYerpNPZgXguWYca8Cva7f4Wxbq7HYu7Yu84YeUxlZWaJIWRaHHZBmmu8EqxGhSJbwzhDiUFHHd0W5w9yLHBowJeWiMTHrn8WpIKPjd3kN4hOjgdNfF6WNB4AtMGH7FH6yGPqQnYVs8hqKwxbitKqM4xMAxMqktTjtKktGmLMFhDcyeZ2GIxgpyKt8tMA3W5w9yLHBowJqC3BmJA4HFeLPjd3kN4hOjgdNfF6WNB4CREbNy1qVbLjsit8ltiLPWPuOYWOI9dDL6p1T6fCYeszIONZuINXa)ouP9qdNB1JvgoBKFL4pGiTUcWOgE4NxAAYWTYj(bAIXWzXNo85gUWPuOYWOI9dDL6p1T6fCYeszIONZuINXa)ouP9qdNB1JvgU)aI06kabb7vJA4PvEBAYWTYj(bAIXWzXNo85goIEotDODfOx2r7Hgo3QhRmCVh0feDmunQHNw530KHBLt8d0eJHZIpD4ZnCwg7bziSe45w1W5w9yLH79GUGOJHQrn80ARMMmCRCIFGMymCw8PdFUHZYypidHLap3QYeszYg5yGbLjsitQ)Ru6Srmbll0Oj2p0vkKUYj(bA4CRESYW9Eqxq0Xq1OgEAn2MMmCRCIFGMymCw8PdFUHt9FLsp7YDCa0voXpqzcPmr0Zz6zxUJdG2dnCUvpwz4YygufWiMTHrn80kjzAYW5w9yLHZg5xjICCWbvd3kN4hOjgJA4Pvs20KHBLt8d0eJHZIpD4ZnCqw)jUcKgK9UE)eq2hCLsx5e)aLjKYePYerpNPbzVR3pbK9bxPIOoQxSdK2dnCxPdJ7HQ4YgoiR)exbsdYExVFci7dUsnCxPdJ7HQ4qrh456mC8B4CRESYWL)bJSypRgUR0HX9qva8mc)nC8BudpTgRMMmCRCIFGMymCw8PdFUHt9FLsHQRNvaEqBKJbgDLt8d0W5w9yLHdQUEwb4bTrogyg1WtRisMMmCRCIFGMymCw8PdFUHJuzs9FLsdXhQ)I9dDL6)bv6kN4hOmfpUmP(VsPH4d1FX(HUs9)GkDLt8duMqktTjtKktHtPqLHrf7h6k1FQB1l4KP2nCUvpwz4MJ1iX(HUs93OgEAfrzAYWTYj(bAIXWzXNo85go3QxWjwn0BqzIeYe)YeszQnzcgU)fQJbMcP2i)kXFarADfGmrczIFzkECzcgU)fQJbMcPVh0feZrLjsit8ltTB4CRESYWzJ8Re)beP1vag1WtR8sttgo3QhRmC)beP1vacc2RgUvoXpqtmg1WtS5TPjdhkl4vagE43WTYj(jqzbVcWeJHZT6Xkdx(D0jGrmBddNna7pH6yGPqdp8B4S4th(CdhEz8GroXpd3kN4hOjgJA4j28BAYWTYj(bAIXWTYj(jqzbVcWeJHZIpD4ZnCOSGdDLsbpO6LDYejKPy1W5w9yLHl)o6eWiMTHHdLf8kadp8BudpXUvttgouwWRam8WVHBLt8tGYcEfGjgdNB1JvgUmMbvbmIzBy4w5e)anXyuJAuJAuJb]] )
|
|
|
|
end
|
|
|