From 1ecd4fac0b424d03e1c080e4c1c9ebf2540f6b17 Mon Sep 17 00:00:00 2001 From: Ciaran Fisher Date: Wed, 6 May 2015 18:06:53 +0100 Subject: [PATCH] First Early Release First release allowing C-130 to pickup vehicles and troops Heli to pickup and drop off troops Crate spawning, carying and unpacking HAWK to be built by carrying over all the correct parts --- CTLD.lua | 1347 ++++++++++++++++++++++++++++++++++++++++++++++ test-mission.miz | Bin 0 -> 54994 bytes 2 files changed, 1347 insertions(+) create mode 100644 CTLD.lua create mode 100644 test-mission.miz diff --git a/CTLD.lua b/CTLD.lua new file mode 100644 index 0000000..d694895 --- /dev/null +++ b/CTLD.lua @@ -0,0 +1,1347 @@ +--[[ + Combat Troop and Logistics Drop + + Allows Huey, Mi-8 and C130 to transport troops internally and Helicopters to transport Logistic / Vehicle units to the field via slingloads + without requiring external mods via sling loads + + Once a crate is dropped in the field, it must be unpacked by landing next to it and using the radio menu to start the unpack + + Some vehicles may require more than one crate in close proximity + + Troop + + Supports usual CTTS functions such as spawn group + + Huey max carry weight = 4000lb / 1814.37 kg + Mi-8 Max carry weight = 6614 / 3000 kg + C-130 Max Carry Weight - 26,634 + - Two HMMWV (ATGM + MG ) and 10 troops + - It can actually hold 92 ground troops, 64 fully equipped paratroopers, or 74 litter patients + - Source http://fas.org/man/dod-101/sys/ac/c-130.htm + + -- Possible ideas for huey + mi8 + -- Make it so the huey cant carry all the bits needed, maybe need two trips? + + + -- use events to catch cargo destroyed events + - How to get crate damage? If damaged by a certain amount then destroy the jeep? + + -- Make ALL troop groups extractable? + -- iterate over nearby groups, + -- Destroy the units and add to new group? - worth the effort? + + ]] + +ctld = {} + +-- ************************************************************************ +-- ********************* USER CONFIGURATION ****************************** +-- ************************************************************************ + +ctld.disableAllSmoke = false -- if true, all smoke is diabled regardless of settings below. Leave false to respect settings below + +-- ***************** Pickup and dropoff zones ***************** + +-- Available colors (anything else like "none" disables smoke): "green", "red", "white", "orange", "blue", "none", + +-- Use any of the predefined names or set your own ones + +ctld.pickupZones = { + { "pickzone1", "blue" }, + { "pickzone2", "blue" }, + { "pickzone3", "none" }, + { "pickzone4", "none" }, + { "pickzone5", "none" }, + { "pickzone6", "none" }, + { "pickzone7", "none" }, + { "pickzone8", "none" }, + { "pickzone9", "none" }, + { "pickzone10", "none" }, +} + +-- ******************** Transports names ********************** + +-- Use any of the predefined names or set your own ones + +ctld.transportPilotNames = { + "helicargo1", + "helicargo2", + "helicargo3", + "helicargo4", + "helicargo5", + "helicargo6", + "helicargo7", + "helicargo8", + "helicargo9", + "helicargo10", + + "helicargo11", + "helicargo12", + "helicargo13", + "helicargo14", + "helicargo15", + "helicargo16", + "helicargo17", + "helicargo18", + "helicargo19", + "helicargo20", + + "helicargo21", + "helicargo22", + "helicargo23", + "helicargo24", + "helicargo25", +} + +-- *************** Optional Extractable GROUPS ***************** + +-- Use any of the predefined names or set your own ones + +ctld.extractableGroups = { + "extract1", + "extract2", + "extract3", + "extract4", + "extract5", + "extract6", + "extract7", + "extract8", + "extract9", + "extract10", + + "extract11", + "extract12", + "extract13", + "extract14", + "extract15", + "extract16", + "extract17", + "extract18", + "extract19", + "extract20", + + "extract21", + "extract22", + "extract23", + "extract24", + "extract25", +} + +-- ************** Optional Logistics CRATE UNITS ****************** + +-- Use any of the predefined names or set your own ones + +ctld.logisticUnits = { + "logistic1", + "logistic2", + "logistic3", + "logistic4", + "logistic5", + "logistic6", + "logistic7", + "logistic8", + "logistic9", + "logistic10", +} + +-- ****************** GENERAL SCRIPT CONFIG ******************** + +ctld.maxExtractDistance = 50 -- max distance from vehicle to troops to allow a group extraction +ctld.maximumDistanceLogistic = 200 -- max distance from vehicle to logistics to allow a loading or spawning operation +ctld.maximumSearchDistance = 4000 -- max distance for troops to search for enemy +ctld.maximumMoveDistance = 1000 -- max distance for troops to move from drop point if no enemy is nearby + +ctld.numberOfTroops = 10 -- default number of troops to load on a transport +ctld.vehiclesForTransport = { "M1045 HMMWV TOW", "M1043 HMMWV Armament" } -- vehicles to load onto c130 or hercules + +ctld.spawnRPGWithCoalition = true --spawns a friendly RPG unit with Coalition forces + +-- *************************************************************** +-- **************** BE CAREFUL BELOW HERE ************************ +-- *************************************************************** + +assert(mist ~= nil, "\n\n** HEY MISSION-DESIGNER! **\n\nMiST has not been loaded!\n\nMake sure MiST 3.6 or higher is running\n*before* running this script!\n") + +ctld.addedTo = {} +ctld.spawnedCratesRED = {} -- use to store crates that have been spawned +ctld.spawnedCratesBLUE = {} -- use to store crates that have been spawned + +ctld.droppedTroopsRED = {} -- stores dropped troop groups +ctld.droppedTroopsBLUE = {} -- stores dropped troop groups + +ctld.droppedVehiclesRED = {} -- stores vehicle groups for c-130 / hercules +ctld.droppedVehiclesBLUE = {} -- stores vehicle groups for c-130 / hercules + +ctld.inTransitTroops = {} + +-- Weights must be unique as we use the weight to change the cargo to the correct unit +-- when we unpack +ctld.spawnableCrates = { + ["M1045 HMMWV TOW"] = { weight = 1400, desc = "HMMWV - TOW", unit = "M1045 HMMWV TOW" }, + ["M1043 HMMWV Armament"] = { weight = 1200, desc = "HMMWV - MG", unit = "M1043 HMMWV Armament" }, + ["2B11 mortar"] = { weight = 200, desc = "2B11 Mortar", unit = "2B11 mortar" }, + ["Stinger manpad"] = { weight = 210, desc = "MANPAD", unit = "Stinger manpad" }, + ["Hawk ln"] = { weight = 1000, desc = "HAWK Launcher", unit = "Hawk ln" }, + ["Hawk sr"] = { weight = 1010, desc = "HAWK Search Radar", unit = "Hawk sr" }, + ["Hawk tr"] = { weight = 1020, desc = "HAWK Track Radar", unit = "Hawk tr" }, +} + + +--used to lookup what the crate will contain +ctld.crateLookupTable = {} + +for _name, _crate in pairs(ctld.spawnableCrates) do + -- convert number to string otherwise we'll have a pointless giant + -- table. String means 'hashmap' so it will only contain the right number of elements + ctld.crateLookupTable[tostring(_crate.weight)] = _name +end + + +--sort out pickup zones +for _, _zone in pairs(ctld.pickupZones) do + + local _zoneName = _zone[1] + local _zoneColor = _zone[2] + + if _zoneColor == "green" then + _zone[2] = trigger.smokeColor.Green + elseif _zoneColor == "red" then + _zone[2] = trigger.smokeColor.Red + elseif _zoneColor == "white" then + _zone[2] = trigger.smokeColor.White + elseif _zoneColor == "orange" then + _zone[2] = trigger.smokeColor.Orange + elseif _zoneColor == "blue" then + _zone[2] = trigger.smokeColor.Blue + else + _zone[2] = -1 -- no smoke colour + end +end + + +--- - Sort out extractable groups + +for _, _groupName in pairs(ctld.extractableGroups) do + + local _group = Group.getByName(_groupName) + + if _group ~= nil then + + if _group:getCoalition() == 1 then + + table.insert(ctld.droppedTroopsRED, _group:getName()) + else + + table.insert(ctld.droppedTroopsBLUE, _group:getName()) + end + end +end + + +---------------- FUNCTIONS ---------------- + +-- Remove intransit troops when heli / cargo plane dies +ctld.eventHandler = {} +function ctld.eventHandler:onEvent(_event) + + if _event == nil or _event.initiator == nil then + env.info("CTLD null event") + elseif _event.id == 9 then + -- Pilot dead + ctld.inTransitTroops[_event.initiator:getName()] = nil + + elseif world.event.S_EVENT_EJECTION == _event.id or _event.id == 8 then + -- env.info("Event unit - Pilot Ejected or Unit Dead") + ctld.inTransitTroops[_event.initiator:getName()] = nil + + -- env.info(_event.initiator:getName()) + end + +end + +function ctld.getTransportUnit(_unitName) + + if _unitName == nil then + return nil + end + + local _heli = Unit.getByName(_unitName) + + if _heli ~= nil and _heli:isActive() and _heli:getLife() > 0 then + + return _heli + end + + return nil +end + +function ctld.spawnCrateStatic(_side,_unitId,_point,_name,_weight) + + local _crate = { + ["category"] = "Cargo", + ["shape_name"] = "ab-212_cargo", + ["type"] = "Cargo1", + ["unitId"] = _unitId, + ["y"] = _point.z , + ["x"] = _point.x , + ["mass"] = _weight, + ["name"] = _name, + ["canCargo"] = true, + ["heading"] = 0, + -- ["displayName"] = "name 2", -- getCargoDisplayName function exists but no way to set the variable + -- ["DisplayName"] = "name 2", + -- ["cargoDisplayName"] = "cargo123", + -- ["CargoDisplayName"] = "cargo123", + } + + local _spawnedCrate + + if _side == 1 then + _spawnedCrate = coalition.addStaticObject(_side, _crate) + else + _spawnedCrate = coalition.addStaticObject(_side, _crate) + end + + return _spawnedCrate +end + +function ctld.spawnCrate(_args) + + -- use the cargo weight to guess the type of unit as no way to add description :( + + local _crateType = ctld.spawnableCrates[_args[2]] + local _heli = ctld.getTransportUnit(_args[1]) + + if _crateType ~= nil and _heli ~= nil and _heli:inAir() == false then + + if ctld.inLogisticsZone(_heli) == false then + + ctld.displayMessageToGroup(_heli, "You are not close enough to friendly logistics to get a crate!", 10) + + return + end + + + local _position = _heli:getPosition() + + --try to spawn at 12 oclock to us + local _angle = math.atan2(_position.x.z, _position.x.x) + local _xOffset = math.cos(_angle) * 30 + local _yOffset = math.sin(_angle) * 30 + + -- trigger.action.outText("Spawn Crate".._args[1].." ".._args[2],10) + + local _heli = ctld.getTransportUnit(_args[1]) + + local _point = _heli:getPoint() + + local _unitId = mist.getNextUnitId() + + local _side = _heli:getCoalition() + + local _name = string.format("%s #%i", _crateType.desc, _unitId) + + local _spawnedCrate = ctld.spawnCrateStatic(_side,_unitId,{x=_point.x+_xOffset,z=_point.z + _yOffset},_name,_crateType.weight) + + if _side == 1 then + -- _spawnedCrate = coalition.addStaticObject(_side, _spawnedCrate) + ctld.spawnedCratesRED[_name] = _crateType + else + -- _spawnedCrate = coalition.addStaticObject(_side, _spawnedCrate) + ctld.spawnedCratesBLUE[_name] = _crateType + end +-- for key, value in pairs(getmetatable(_spawnedCrate)) do +-- env.info(tostring(key)) +-- env.info(tostring(value)) +-- end + + ctld.displayMessageToGroup(_heli, string.format("A %s crate weighing %s kg has been brought out and is at your 12 o'clock ", _crateType.desc, _crateType.weight), 20) + + else + env.info("Couldn't find crate item to spawn") + end +end + +function ctld.troopsOnboard(_heli,_troops) + + if ctld.inTransitTroops[_heli:getName()] ~= nil then + + local _onboard = ctld.inTransitTroops[_heli:getName()] + + if _troops then + + if _onboard.troops ~= nil and #_onboard.troops > 0 then + return true + else + return false + end + else + + if _onboard.vehicles ~= nil and #_onboard.vehicles > 0 then + return true + else + return false + end + + end + + else + return false + end +end + +function ctld.deployTroops(_heli,_troops) + + local _onboard = ctld.inTransitTroops[_heli:getName()] + + -- deloy troops + if _troops then + + if _onboard.troops ~= nil and #_onboard.troops > 0 then + + local _droppedTroops = ctld.spawnDroppedGroup(_heli, _onboard.troops, false) + + if _heli:getCoalition() == 1 then + + table.insert(ctld.droppedTroopsRED, _droppedTroops:getName()) + else + + table.insert(ctld.droppedTroopsBLUE, _droppedTroops:getName()) + end + + ctld.inTransitTroops[_heli:getName()].troops = {} + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " dropped troops from " .. _heli:getTypeName() .. " into combat", 10) + + end + else + if _onboard.vehicles ~= nil and #_onboard.vehicles > 0 then + + local _droppedVehicles = ctld.spawnDroppedGroup(_heli, _onboard.vehicles, true) + + if _heli:getCoalition() == 1 then + + table.insert(ctld.droppedVehiclesRED, _droppedVehicles:getName()) + else + + table.insert(ctld.droppedVehiclesBLUE, _droppedVehicles:getName()) + end + + ctld.inTransitTroops[_heli:getName()].vehicles = {} + + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " dropped vehicles from " .. _heli:getTypeName() .. " into combat", 10) + + end + end + +end + +function ctld.loadTroops(_heli,_troops) + + -- load troops + vehicles if c130 or herc + -- "M1045 HMMWV TOW" + -- "M1043 HMMWV Armament" + local _onboard = ctld.inTransitTroops[_heli:getName()] + + if _onboard == nil then + _onboard = { troops = {}, vehicles = {} } + end + + if _troops then + + for _i = 1, ctld.numberOfTroops do + local _unitType = "Soldier AK" + + if _heli:getCoalition() == 2 then + _unitType = "Soldier M4" + if _i <= 4 and ctld.spawnRPGWithCoalition then + _unitType = "Paratrooper RPG-16" + end + if _i <= 2 then + _unitType = "Soldier M249" + end + else + _unitType = "Infantry AK" + if _i <= 4 then + _unitType = "Paratrooper RPG-16" + end + if _i <= 2 then + _unitType = "Paratrooper AKS-74" + end + end + + _onboard.troops[_i] = _unitType + end + + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " loaded "..ctld.numberOfTroops.." troops into " .. _heli:getTypeName(), 10) + + else + + for _i, _type in ipairs(ctld.vehiclesForTransport) do + _onboard.vehicles[_i] = _type + end + + local _count = #ctld.vehiclesForTransport + + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " loaded ".._count.." vehicles into " .. _heli:getTypeName(), 10) + + end + + ctld.inTransitTroops[_heli:getName()] = _onboard + +end + +function ctld.loadUnloadTroops(_args) + + local _heli = ctld.getTransportUnit(_args[1]) + local _troops = _args[2] + + if _heli == nil then + return + end + + local _inZone = ctld.inPickupZone(_heli) + + if _inZone == true and ctld.troopsOnboard(_heli,_troops) then + + if _troops then + ctld.displayMessageToGroup(_heli, "Dropped troops back to base", 20) + ctld.inTransitTroops[_heli:getName()].troops = {} + + else + ctld.displayMessageToGroup(_heli, "Dropped vehicles back to base", 20) + ctld.inTransitTroops[_heli:getName()].vehicles = {} + + end + + elseif _inZone == false and ctld.troopsOnboard(_heli,_troops) then + + ctld.deployTroops(_heli,_troops) + + elseif _inZone == true and not ctld.troopsOnboard(_heli,_troops) then + + ctld.loadTroops(_heli,_troops) + + else + -- search for nearest troops to pickup + ctld.extractTroops(_heli,_troops) + + end +end + +function ctld.extractTroops(_heli,_troops) + + + local _onboard = ctld.inTransitTroops[_heli:getName()] + + if _onboard == nil then + _onboard = { troops = {}, vehicles = {} } + end + + if _troops then + + local _extractTroops + + if _heli:getCoalition() == 1 then + _extractTroops = ctld.findNearestGroup(_heli, ctld.droppedTroopsRED) + else + _extractTroops = ctld.findNearestGroup(_heli, ctld.droppedTroopsBLUE) + end + + if _extractTroops ~= nil then + + _onboard.troops = _extractTroops.types + + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " extracted troops in " .. _heli:getTypeName() .. " from combat", 10) + + if _heli:getCoalition() == 1 then + ctld.droppedTroopsRED[_extractTroops.group:getName()] = nil + else + ctld.droppedTroopsBLUE[_extractTroops.group:getName()] = nil + end + + --remove + _extractTroops.group:destroy() + + else + _onboard.troops = {} + ctld.displayMessageToGroup(_heli, "No extractable troops nearby and not in a pickup zone", 20) + end + + + + else + + local _extractVehicles + + + if _heli:getCoalition() == 1 then + + _extractVehicles = ctld.findNearestGroup(_heli, ctld.droppedVehiclesRED) + else + + _extractVehicles = ctld.findNearestGroup(_heli, ctld.droppedVehiclesBLUE) + end + + if _extractVehicles ~= nil then + _onboard.vehicles = _extractVehicles.types + + if _heli:getCoalition() == 1 then + + ctld.droppedVehiclesRED[_extractVehicles.group:getName()] = nil + else + + ctld.droppedVehiclesBLUE[_extractVehicles.group:getName()] = nil + end + + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " extracted vehicles in " .. _heli:getTypeName() .. " from combat", 10) + + --remove + _extractVehicles.group:destroy() + + + else + _onboard.vehicles = {} + ctld.displayMessageToGroup(_heli, "No extractable vehicles nearby and not in a pickup zone", 20) + end + + end + + ctld.inTransitTroops[_heli:getName()] = _onboard + +end + + +function ctld.checkTroopStatus(_args) + + --list onboard troops, if c130 + + -- trigger.action.outText("Troop Status".._args[1],10) + + + local _heli = ctld.getTransportUnit(_args[1]) + + if _heli == nil then + return + end + + local _onboard = ctld.inTransitTroops[_heli:getName()] + + if _onboard == nil then + ctld.displayMessageToGroup(_heli, "No troops onboard", 10) + else + local _troops = #_onboard.troops + local _vehicles = #_onboard.vehicles + + local _txt = "" + + if _troops > 0 then + _txt = _txt .. " " .. _troops .. " troops onboard\n" + end + + if _vehicles > 0 then + _txt = _txt .. " " .. _vehicles .. " vehicles onboard\n" + end + + if _txt ~= "" then + ctld.displayMessageToGroup(_heli, _txt, 10) + else + ctld.displayMessageToGroup(_heli, "No troops onboard", 10) + end + end +end + +function ctld.listNearbyCrates(_args) + + --trigger.action.outText("Nearby Crates" .. _args[1], 10) + + local _message = "" + + local _heli = ctld.getTransportUnit(_args[1]) + + if _heli ~= nil then + + local _crates = ctld.getCratesAndDistance(_heli) + + for _, _crate in pairs(_crates) do + + if _crate.dist < 1000 then + _message = string.format("%s\n%s crate - kg %i - %i m", _message, _crate.details.desc, _crate.details.weight, _crate.dist) + end + end + end + + if _message ~= "" then + + local _txt = "Nearby Crates:\n" .. _message + + ctld.displayMessageToGroup(_heli, _txt, 20) + + else + --no crates nearby + + local _txt = "No Nearby Crates" + + ctld.displayMessageToGroup(_heli, _txt, 20) + end +end + +function ctld.displayMessageToGroup(_unit, _text, _time) + + trigger.action.outTextForGroup(_unit:getGroup():getID(), _text, _time) +end + +function ctld.getCratesAndDistance(_heli) + + local _crates = {} + + local _allCrates + if _heli:getCoalition() == 1 then + + _allCrates = ctld.spawnedCratesRED + else + + _allCrates = ctld.spawnedCratesBLUE + end + + for _crateName, _details in pairs(_allCrates) do + + --get crate + local _crate = StaticObject.getByName(_crateName) + + if _crate ~= nil and _crate:getLife() > 0 and _crate:inAir() == false then + + local _dist = ctld.getDistance(_crate:getPoint(), _heli:getPoint()) + + local _crateDetails = { crateUnit = _crate, dist = _dist, details = _details } + + table.insert(_crates, _crateDetails) + end + end + + return _crates +end + +function ctld.getClosestCrate(_heli, _crates) + + local _closetCrate = nil + local _shortestDistance = -1 + local _distance = 0 + + for _, _crate in pairs(_crates) do + + _distance = _crate.dist + + if _distance ~= nil and (_shortestDistance == -1 or _distance < _shortestDistance) then + _shortestDistance = _distance + _closetCrate = _crate + end + end + + return _closetCrate +end + +function ctld.unpackCrates(_args) + + -- trigger.action.outText("Unpack Crates".._args[1],10) + + local _heli = ctld.getTransportUnit(_args[1]) + + if _heli ~= nil and _heli:inAir() == false then + + local _crates = ctld.getCratesAndDistance(_heli) + local _crate = ctld.getClosestCrate(_heli, _crates) + + if _crate ~= nil and _crate.dist < 200 then + + if ctld.inPickupZone(_heli) == true then + + ctld.displayMessageToGroup(_heli, "You can't unpack that here! Take it to where it's needed!", 20) + + return + end + + -- is multi crate? + if string.match(_crate.details.desc, "HAWK") then + -- multicrate + + -- are there all the pieces close enough together + local _hawkParts = { ["Hawk ln"] = false, ["Hawk tr"] = false, ["Hawk sr"] = false } + + for _, _nearbyCrate in pairs(_crates) do + + if _nearbyCrate.dist < 200 then + + if _nearbyCrate.details.unit == "Hawk ln" or _nearbyCrate.details.unit == "Hawk sr" or _nearbyCrate.details.unit == "Hawk tr" then + + _hawkParts[_nearbyCrate.details.unit] = _nearbyCrate + + else + -- not part of hawk + end + end + end + + local _count = 0 + local _txt = "" + + local _posArray = {} + local _typeArray = {} + for _name, _hawkPart in pairs(_hawkParts) do + + if _hawkPart == false then + + if _name == "Hawk ln" then + _txt = "Missing HAWK Launcher\n" + elseif _name == "Hawk sr" then + _txt = _txt .. "Missing HAWK Search Radar\n" + else + _txt = _txt .. "Missing HAWK Track Radar\n" + end + else + table.insert(_posArray, _hawkPart.crateUnit:getPoint()) + table.insert(_typeArray, _name) + end + end + + if _txt ~= "" then + + ctld.displayMessageToGroup(_heli, "Cannot build Hawk\n" .. _txt .. "\n\nOr the crates are not close enough together", 20) + + return + else + + -- destroy crates + for _name, _hawkPart in pairs(_hawkParts) do + + if _heli:getCoalition() == 1 then + + ctld.spawnedCratesRED[_hawkPart.crateUnit:getName()] = nil + else + + ctld.spawnedCratesBLUE[_hawkPart.crateUnit:getName()] = nil + end + + + -- local _spawnedCrate = ctld.spawnCrateStatic( _heli:getCoalition(),_hawkPart.crateUnit:getID(),{x=100,z=100},_name,100) + + + --destroy + hawkPart.crateUnit:destroy() + end + + -- HAWK READY! + ctld.spawnCrateGroup(_heli, _posArray, _typeArray) + + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " successfully deployed a full HAWK AA System to the field", 10) + end + + else + -- single crate + local _cratePoint = _crate.crateUnit:getPoint() + local _crateName = _crate.crateUnit:getName(); + + -- ctld.spawnCrateStatic( _heli:getCoalition(),mist.getNextUnitId(),{x=100,z=100},_crateName,100) + + --remove crate + _crate.crateUnit:destroy() + + ctld.spawnCrateGroup(_heli, { _cratePoint }, { _crate.details.unit }) + + if _heli:getCoalition() == 1 then + + ctld.spawnedCratesRED[_crateName] = nil + else + + ctld.spawnedCratesBLUE[_crateName] = nil + end + + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " successfully deployed " .. _crate.details.desc .. " to the field", 10) + end + + else + + ctld.displayMessageToGroup(_heli, "No friendly crates close enough to unpack", 20) + end + end +end + + + +function ctld.spawnCrateGroup(_heli, _positions, _types) + + local _id = mist.getNextGroupId() + + local _groupName = _types[1] .. " #" .. _id + + local _side = _heli:getCoalition() + + local _group = { + ["visible"] = false, + ["groupId"] = _id, + ["hidden"] = false, + ["units"] = {}, + -- ["y"] = _positions[1].z, + -- ["x"] = _positions[1].x, + ["name"] = _groupName, + ["task"] = {}, + } + + if #_positions == 1 then + + _group.units[1] = ctld.createUnit(_positions[1].x + 5, _positions[1].z + 5, 120, _types[1]) + + else + + for _i, _pos in ipairs(_positions) do + _group.units[_i] = ctld.createUnit(_pos.x + 5, _pos.z + 5, 120, _types[_i]) + end + end + + local _spawnedGroup = coalition.addGroup(_side, Group.Category.GROUND, _group) + + --activate by moving and so we can set ROE and Alarm state + + local _dest = _spawnedGroup:getUnit(1):getPoint() + _dest = { x = _dest.x + 5, _y = _dest.y + 5, z = _dest.z + 5 } + + ctld.orderGroupToMoveToPoint(_spawnedGroup:getUnit(1), _dest) +end + + + +-- spawn normal group +function ctld.spawnDroppedGroup(_heli, _types, _spawnBehind) + + local _id = mist.getNextGroupId() + + local _groupName = "Dropped Group #" .. _id + + local _side = _heli:getCoalition() + + local _group = { + ["visible"] = false, + ["groupId"] = _id, + ["hidden"] = false, + ["units"] = {}, + -- ["y"] = _positions[1].z, + -- ["x"] = _positions[1].x, + ["name"] = _groupName, + ["task"] = {}, + } + + + if _spawnBehind == false then + + -- spawn in circle around heli + + local _pos = _heli:getPoint() + + for _i, _type in ipairs(_types) do + + local _angle = math.pi * 2 * (_i - 1) / #_types + local _xOffset = math.cos(_angle) * 30 + local _yOffset = math.sin(_angle) * 30 + + _group.units[_i] = ctld.createUnit(_pos.x + _xOffset, _pos.z + _yOffset, _angle, _type) + end + + else + + local _pos = _heli:getPoint() + + --try to spawn at 6 oclock to us + local _angle = math.atan2(_pos.z, _pos.x) + local _xOffset = math.cos(_angle) * 30 + local _yOffset = math.sin(_angle) * 30 + + + for _i, _type in ipairs(_types) do + _group.units[_i] = ctld.createUnit(_pos.x - (_xOffset + 10 * _i), _pos.z - (_yOffset + 10 * _i), _angle, _type) + end + end + + local _spawnedGroup = coalition.addGroup(_side, Group.Category.GROUND, _group) + + + -- find nearest enemy and head there + local _enemyPos = ctld.findNearestEnemy(_heli) + + ctld.orderGroupToMoveToPoint(_spawnedGroup:getUnit(1), _enemyPos) + + return _spawnedGroup +end + +function ctld.findNearestEnemy(_heli) + + local _closestEnemy = nil + + local _groups + + local _closestEnemyDist = ctld.maximumSearchDistance + + local _heliPoint = _heli:getPoint() + + if _heli:getCoalition() == 2 then + _groups = coalition.getGroups(1, Group.Category.GROUND) + else + _groups = coalition.getGroups(2, Group.Category.GROUND) + end + + for _, _group in pairs(_groups) do + + if _group ~= nil then + local _units = _group:getUnits() + + if _units ~= nil and #_units > 0 then + + local _leader = nil + + -- find alive leader + for x = 1, #_units do + if _units[x]:getLife() > 0 then + _leader = _units[x] + break + end + end + + if _leader ~= nil then + local _leaderPos = _leader:getPoint() + local _dist = ctld.getDistance(_heliPoint, _leaderPos) + if _dist < _closestEnemyDist then + _closestEnemyDist = _dist + _closestEnemy = _leaderPos + end + end + end + end + end + + + -- no enemy - move to random point + if _closestEnemy ~= nil then + + return _closestEnemy + else + + local _x = _heliPoint.x + math.random(0, ctld.maximumMoveDistance) - math.random(0, ctld.maximumMoveDistance) + local _z = _heliPoint.z + math.random(0, ctld.maximumMoveDistance) - math.random(0, ctld.maximumMoveDistance) + + return { x = _x, z = _z } + end +end + +function ctld.findNearestGroup(_heli, _groups) + + local _closestGroupTypes = {} + local _closestGroup = nil + + local _closestGroupDist = ctld.maxExtractDistance + + local _heliPoint = _heli:getPoint() + + for _, _groupName in pairs(_groups) do + + local _group = Group.getByName(_groupName) + + if _group ~= nil then + local _units = _group:getUnits() + + if _units ~= nil and #_units > 0 then + + local _leader = nil + + local _unitTypes = {} + + -- find alive leader + for x = 1, #_units do + if _units[x]:getLife() > 0 then + + if _leader == nil then + _leader = _units[x] + end + + table.insert(_unitTypes, _units[x]:getTypeName()) + end + end + + if _leader ~= nil then + local _leaderPos = _leader:getPoint() + local _dist = ctld.getDistance(_heliPoint, _leaderPos) + if _dist < _closestGroupDist then + _closestGroupDist = _dist + _closestGroupTypes = _unitTypes + _closestGroup = _group + end + end + end + end + end + + + if _closestGroup ~= nil then + + return { group = _closestGroup, types = _closestGroupTypes } + else + + return nil + end +end + + +function ctld.createUnit(_x, _y, _angle, _type) + + local _id = mist.getNextUnitId(); + + local _name = string.format("%s #%s", _type, _id) + + local _newUnit = { + ["y"] = _y, + ["type"] = _type, + ["name"] = _name, + ["unitId"] = _id, + ["heading"] = _angle, + ["playerCanDrive"] = true, + ["skill"] = "Excellent", + ["x"] = _x, + } + + return _newUnit +end + +function ctld.orderGroupToMoveToPoint(_leader, _destination) + + local _group = _leader:getGroup() + + local _mission = { + id = 'Mission', + params = { + route = { + points = { + [1] = { + action = 0, + x = _leader:getPoint().x, + y = _leader:getPoint().z, + speed = 0, + ETA = 100, + ETA_locked = false, + name = "Starting point", + task = nil + }, + [2] = { + action = 0, + x = _destination.x, + y = _destination.z, + speed = 100, + ETA = 100, + ETA_locked = false, + name = "End Point", + task = nil + }, + } + }, + } + } + local _controller = _group:getController(); + Controller.setOption(_controller, AI.Option.Ground.id.ALARM_STATE, AI.Option.Ground.val.ALARM_STATE.AUTO) + Controller.setOption(_controller, AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE) + _controller:setTask(_mission) +end + +-- are we in pickup zone +function ctld.inPickupZone(_heli) + + local _heliPoint = _heli:getPoint() + + for _, _zoneDetails in pairs(ctld.pickupZones) do + + local _triggerZone = trigger.misc.getZone(_zoneDetails[1]) + + if _triggerZone ~= nil then + + --get distance to center + + local _dist = ctld.getDistance(_heliPoint, _triggerZone.point) + + if _dist <= _triggerZone.radius then + return true + end + end + end + + return false +end + +-- are we near friendly logistics zone +function ctld.inLogisticsZone(_heli) + + local _heliPoint = _heli:getPoint() + + for _, _name in pairs(ctld.logisticUnits) do + + local _logistic = StaticObject.getByName(_name) + + if _logistic ~= nil and _logistic:getCoalition() == _heli:getCoalition() then + + --get distance + local _dist = ctld.getDistance(_heliPoint, _logistic:getPoint()) + + if _dist <= ctld.maximumDistanceLogistic then + return true + end + end + end + + return false +end + +function ctld.refreshSmoke() + + if ctld.disableAllSmoke == true then + return + end + + for _, _zoneDetails in pairs(ctld.pickupZones) do + + local _triggerZone = trigger.misc.getZone(_zoneDetails[1]) + + if _triggerZone ~= nil and _zoneDetails[2] >= 0 then + + -- Trigger smoke markers + + local _pos2 = { x = _triggerZone.point.x, y = _triggerZone.point.z } + local _alt = land.getHeight(_pos2) + local _pos3 = { x = _pos2.x, y = _alt, z = _pos2.y } + + trigger.action.smoke(_pos3, _zoneDetails[2]) + end + end + + + --refresh in 5 minutes + timer.scheduleFunction(ctld.refreshSmoke, nil, timer.getTime() + 300) +end + +function ctld.dropSmoke(_args) + + local _heli = ctld.getTransportUnit(_args[1]) + + if _heli ~= nil then + + local _colour = "" + + if _args[2] == trigger.smokeColor.Red then + + _colour = "RED" + elseif _args[2] == trigger.smokeColor.Blue then + + _colour = "BLUE" + elseif _args[2] == trigger.smokeColor.Green then + + _colour = "GREEN" + elseif _args[2] == trigger.smokeColor.Orange then + + _colour = "ORANGE" + end + + local _point = _heli:getPoint() + + local _pos2 = { x = _point.x, y = _point.z } + local _alt = land.getHeight(_pos2) + local _pos3 = { x = _point.x, y = _alt, z = _point.z } + + trigger.action.smoke(_pos3, _args[2]) + + trigger.action.outTextForCoalition(_heli:getCoalition(), _heli:getPlayerName() .. " dropped " .._colour .." smoke ", 10) + end +end + + +-- Adds menuitem to all heli units that are active +function addTransportMenuItem() + -- Loop through all Heli units + + timer.scheduleFunction(addTransportMenuItem, nil, timer.getTime() + 5) + + for _, _unitName in pairs(ctld.transportPilotNames) do + + local _unit = ctld.getTransportUnit(_unitName) + + if _unit ~= nil then + + if ctld.addedTo[_unitName] == nil then + + local _groupId = _unit:getGroup():getID() + + missionCommands.addSubMenuForGroup(_groupId, "Troop Transport") + missionCommands.addCommandForGroup(_groupId, "Load / Unload Troops", { "Troop Transport" }, ctld.loadUnloadTroops, { _unitName,true }) + + + if string.match(_unit:getTypeName(), "C-130") then + missionCommands.addCommandForGroup(_groupId, "Load / Unload Vehicles", { "Troop Transport" }, ctld.loadUnloadTroops, { _unitName,false }) + end + + missionCommands.addCommandForGroup(_groupId, "Check Status", { "Troop Transport" }, ctld.checkTroopStatus, { _unitName }) + + if not string.match(_unit:getTypeName(), "C-130") then + + missionCommands.addSubMenuForGroup(_groupId, "Ground Forces") + missionCommands.addCommandForGroup(_groupId, "HMMWV - TOW", { "Ground Forces" }, ctld.spawnCrate, { _unitName, "M1045 HMMWV TOW" }) + missionCommands.addCommandForGroup(_groupId, "HMMWV - MG", { "Ground Forces" }, ctld.spawnCrate, { _unitName, "M1043 HMMWV Armament" }) + + missionCommands.addCommandForGroup(_groupId, "2B11 Mortar", { "Ground Forces" }, ctld.spawnCrate, { _unitName, "2B11 mortar" }) + + missionCommands.addSubMenuForGroup(_groupId, "AA Crates") + missionCommands.addCommandForGroup(_groupId, "MANPAD", { "AA Crates" }, ctld.spawnCrate, { _unitName, "Stinger manpad" }) + + missionCommands.addCommandForGroup(_groupId, "HAWK Launcher", { "AA Crates" }, ctld.spawnCrate, { _unitName, "Hawk ln" }) + missionCommands.addCommandForGroup(_groupId, "HAWK Search Radar", { "AA Crates" }, ctld.spawnCrate, { _unitName, "Hawk sr" }) + missionCommands.addCommandForGroup(_groupId, "HAWK Track Radar", { "AA Crates" }, ctld.spawnCrate, { _unitName, "Hawk tr" }) + + end + + missionCommands.addSubMenuForGroup(_groupId, "Crate Commands") + missionCommands.addCommandForGroup(_groupId, "List Nearby Crates", { "Crate Commands" }, ctld.listNearbyCrates, { _unitName }) + missionCommands.addCommandForGroup(_groupId, "Unpack Crate", { "Crate Commands" }, ctld.unpackCrates, { _unitName }) + missionCommands.addCommandForGroup(_groupId, "Drop Red Smoke", { "Crate Commands" }, ctld.dropSmoke, { _unitName, trigger.smokeColor.Red }) + missionCommands.addCommandForGroup(_groupId, "Drop Blue Smoke", { "Crate Commands" }, ctld.dropSmoke, { _unitName, trigger.smokeColor.Blue }) + -- missionCommands.addCommandForGroup(_groupId, "Drop Orange Smoke", { "Crate Commands" }, ctld.dropSmoke, { _unitName, trigger.smokeColor.Orange }) + missionCommands.addCommandForGroup(_groupId, "Drop Green Smoke", { "Crate Commands" }, ctld.dropSmoke, { _unitName, trigger.smokeColor.Green }) + + + ctld.addedTo[_unitName] = true + end + else + -- env.info(string.format("unit nil %s",_unitName)) + end + end + + return +end + +--get distance in meters assuming a Flat world +function ctld.getDistance(_point1, _point2) + + local xUnit = _point1.x + local yUnit = _point1.z + local xZone = _point2.x + local yZone = _point2.z + + local xDiff = xUnit - xZone + local yDiff = yUnit - yZone + + return math.sqrt(xDiff * xDiff + yDiff * yDiff) +end + + + + +-- Scheduled functions (run cyclically) + +timer.scheduleFunction(ctld.refreshSmoke, nil, timer.getTime() + 5) +timer.scheduleFunction(addTransportMenuItem, nil, timer.getTime() + 5) + +--event handler for deaths +world.addEventHandler(ctld.eventHandler) + +env.info("CTLD event handler added") + diff --git a/test-mission.miz b/test-mission.miz new file mode 100644 index 0000000000000000000000000000000000000000..469f704e218a94f310a3e541baf391df423645f1 GIT binary patch literal 54994 zcmY(q18^qM)-@d4wlgs&b~3ST+qOBeZQHhOdtzHpjQKM6-oO5OdsTI<7dhjJ#f`{itBF zJl-fj|5lkl4dn=T4cI@}zlQ+Gvs5i(OTRdzwQy$Lm3lv%+&v!NFN(7L5d1#h_2b7& z$ZV(@*D`M%|K8#~-?XER@A&D$&&)zjWg>iN)ZYaPT;e_yXnIJZSLxCxeaf!e|q*1H~8)c%C%Ilbjvp8CsH6K~a||G<5p0i%W8L{Mo~Dl)%L*flv1 zP{;G75}gX>+!Y5pOm>e*sa8Lo!11Ls7HAiWS0oc@LiZSSHaY@@=6z5Ai7szL+^$2-##o3Q3oA&(fX6jT+ zce{3IV1GqxxVpX8=O`tiQMGf|(6tNh^vevnK6FBjVYWV^hA-CcW2{wUcXi3l)~D@N z65=My#3{MZDN57r!H}&l48fOsRWoLP^@4wdFsm=;XCRU!3@e1D+Bf13~va zU`uuRdVTlP(4zC{H58KhPf4&9VfE zAgYJ+>u+P(8@!*xXm;kAJ{s*n3jSIJYjVop6RW3c&tRC!dWCHozOU5f#IKpJFUB^7 zTgu$5T02of++;3=%E|s*Jdx|q_9=k=-r4Ik-|GDCKyxCin;j$~UFH^`*5-syLcNOr zvoHGxD6{)tKI}0Do)uf}E8GhbbIrB@Z4T`rsnzu93@w`czLf5rU?yKY={0i5u(B{K z5j=G#h;gN^;y#ZgJ@1AKSDRM(UHoI(vVa`FcLFP9A2y*|BhAnNnF=cyRu;pvALYVE zUgtv^kz5r+7s5r)*v4urjCWhqqve_nGMKlO=b^?szg%{H(LGY5RVf6Q2S`gP)wjG~ z$Bf=wzvyd>eo1n>)SN?%bO^~TGQLu(!uNOo%x12gxU}Bh%g9htkTScEgQLd2e(<*+ z$0Q|rkfkh8moUS(vOMt^>jzcEstR&Ijps=&kDaH!$3vG{_brtGkr~EHTeU>4d3THON(y~kL(|x zI9)c$i`Cf*+Ob^OeaS8yX>C)lpxZqMb!#iu>gFKSEhpF^E5yo^<4ja8x0nlI>@cM6 z50F-uz4LMnxytv=D$nu_&9f5O{m|oz)Kj(3OSDQ_gqDlZMR{X5D4}<*_J`XUgrBcV zTY)po`iUloA@CdB2@Ml5waZpVwA&AajyCwZ8+StpoaVJHbv!Eq#+T8J=ecaZ&pUfn zJNmTlkC+)QO`5AvQ%;}$)_kZA7Dy_9qP|Q%*8%93)ssJR(Je2MQo5THw9DblXc$IZ zC#CNYk%jnNEXCJXjJKs_EKFy13Q)u!` z8dF_>iy0E{XDwFEUstQFxLt~TXr4hzvll0N&x`d7Xm)ZrQ&gAn@+zqMnj8^yp`9*7 zt~j;UW37Ls{dFJwn&3#>^Bi|1WDLkP)_X&=UExnnu2KGbebHI1eLLS#KNzYg6~fNf zXfX_1+`%v;+`a~59;AsI{H%GP*v?CUiUG~S;Z1?dX`nNwsrg1PmSfOU&W*p)Jv05j zl)k258y$(;+iZf8>SML0HR@#oPm49b(C;4&7-S|(7M>{#j)flUN!Z*UI$C4;k8NRp>$dbPeHN#=oiUglMCwYt9>FrwAkVp)^g(b+Iw!>_BZsLe(if% z`@F;4zi@_^Ua^W6s?kl55lC=YTlZu`nNW~ac7~vh#{~Ih-;k`%9W6K1e&BDyrurhm zZze@{OSoPRP8*G`(A|f}sOuFbzc;fIh_`xbSte@_w;N>>J~maU1(L7g!VcoT2l!-7 z^WBA9yFa-3X1-QN$TV!!fcPrs~nxmq9HRwE5*xK3K9DX^Cftx^K5$dE*P*mOr~FrxnT zr(QVX!P+AQqKC~Ug{WpmS$C3Pt`xmn_(G$iujKGJ<;?=ZWk_&*T%zWh%W18K1ZJVd z^zoqEiUQgmdhU5wR|6Zwxy_sIuyGS*>bnqKSIH9pj7;MC$h0LNx5Cj9r@~sL)$iN^ zibTiEm$0>dmh3VIeK`UlXqB_mwLb_tCt8lmz9zMz{re8~`0LwAkw26bUUu7TZ2{U8 zd$b~w3_t(U)6_<={=wI`4J|wapo+c3qe_E#VZi4ujr!tx5x@@2zh6A2DHxpWMzg!| zJaO_nQEH9rJ-g!l$dzsIHgT<2?kuEa1jWUdm7{?z7ceB>zA+)SYNB@*=53UfRS^rV z5HBja{Ea{5L)$h(ptF<1SMAH-fxDeJ%4X6xiHi<@Zg_kgl|hV$)Zyx@IEbX{k?7^c zmIw=b?BKfrO?;Nzu>y+RWccK4QW&BNhe)(Fm+mE3;i68`x8()a+!9BvR95G_7PV!L`CP%y~%>%pkVOn~2}(U?yj%LsD~@t|H5auuJP< zIH;BCakC`C*e}J+wqeg~6WClxdQC7Xhtgc`Vg}@?Hq9e(*`XVP94(_cW13&TGN2lw z1!v9jAK^pOsy@ei3+K_W(Z{FhQwCLnmu6*LCNJ3lDZxoQ-%hhE09JulZYEQSp5JS; zG)S$8nKQw=DCD8LD`B&zsF z-r7bhWR&K)nU>0z6_$T6F83)6RQgdjGu0rV|nr7`m6kEs^vse;d2Avur%VgMh^inJo2-pex3QEZdk zRBrQP`A~ef>s_BixXS3O>nhu`7zLbzOzny9%A`*IdxNLCaC!=KJZX(kAk@AD%L-MSQK)` zK`$pX=x0AujmX}>!^62-{AYjLP)x3#D}W4yx(AcmH;gL(mj_!8CL|ZZse9hRd(nYb zrn1nr_ctg3gTR$e?Nb(+mThMv$UwPQtpe z^d;N`&%*laSw7sRo#Q5`s10j1s0{`Eoyr1nGPxeaBbjIU6g?I?9i_11Om$M_93o+S zgeAvc{kU?%^06Zqm~M2x88WW(8NxfDZ?4F3?NS6^b~g+|AK5BzlLfx>zOVxcXO-cc- z944+8+0QGWls7HaUFA4tky@Uy*)6r;xy%Feaf95Y_AG~I+Tt8IBt+bJ@MolIQNKIA zC(4whlxY7PUGr9HMl^pF+S3=UOZK(L(Jz1Bej$T{4YnhtI}!Wjo?%60>DwPscc8_O+zAZF2%jln~jY>fR3VI%wb5rv$ilMkGA@GRNligk;pTgzWgD7t`Rhox5aMj(9Hi_xTi%1 zsJKfkd5*v0Q`aQD2jKT|_zAZu?lpW4JTog7y~c!-@f$vphX; z!d@$-B#*U-@tNAd*`~qW!vofG&^)&elZ^h8b2yfJPs<;Hq;ETo5!9)}%LqTbn^|w( zCsW$fEFY3>%cU!n;Sbg9EAATTrWoK8;H7`RIpM(}Mk(2VXi5lxw);iy-r7`J$>6b! zSx>mNNuJnkV?BtVReLSwH{DZ*-@>XFR2H5DxX_nk*99DbQd`$|M|J+-*RyFkgTM^< z+edL}-|50{l~br|>*XDTN$Wc4R77YwskGvAVS7RI%;&Q9c6pK_@@x2)xW^Kb7oh$w zJbn(Jv(%X>ugoT{724(+Qdv)PAg9o~7zoxDe@^f7}@!qNV$oBBUQdy@I0k9p8TkK+dR#0SzR=b6<{k!=Nx4P)j#2MhDN3~^xi zoZ+gg))Qd8yFTKnBxDZ;-5=n#b@7&~Ds*cbr9ueZPtIGCBaxp=LCoPRarb0;r5(-Z zmk`6KT#vU@lXz(nJ^cKbV=+X`&N(OZUw7S%IZ#4RD*Kb#kNfwB*(TI0QqkC zBDv9z^CwL4RfIt*(J}6DMgLhuxrwNT-%W^M`v5_A0sWadOG9=9Z$*U*{6yF~hxDWFq--V3FAVGWqQ)*HwjbBaY+JU)MEfa z_V+;7C-}yfvi|lQdIVGf^@4N}vPRl!lx~}NVilr}1<=Dkga&)403EaXdwkl4_8YU#8RJ>MH!9iA2 z=n;I#f22OxB@1*6{Eb+!hYp}A-2c`>0s4TULTg?2qrusF;(8jD%)#jkXG^A_7TXW* z6yY1b;?C?~b6a4}kl)}(cc!Sw$HHNjiA1T8%I#93Q&DQz)ylfv0lQ0SE&-waueHAh zx~PC2F#34D@iE@VLmnXsZ;11oKA^gih~T+_+%5xY8gvSDiV*sk4mhp!zm}AOJXF-& zzpS%R2`-UjIJ4|brgY_JsOP^D{#S?CAP1(8N7Vn}A4&rsaM;i)3}sZ{@wGafIqa}5 zemPaJ%xGZ^c=UPny^`+njM@U{g}!qEp8}uCL7uYeFtPp;DVf;Akpk`B9)0S95J3Ef zA4?u)I}qX^ygLv82v7xwDYL(QusYC=hY@-le=dxE&_0?&cY5yGB|(Dx78!x8}T0)3tVbw{92&QUE; zEz782oYv1zWy%_;_kFmOAUH60LLFVz}=dG#?FO|tA&YqTk@Va-C)iTj_ zZJ(|FGavXA5e7hlxo6M@{h!L6{kIp;eyzeudZ^n;?pWEC`v7&D2&HiSf2!H;SoFjH zQ!V{%Xpv!R&ULKMklijzfZ>3cnTix2q=h<`f=eiT7Vq>-}{PO?g1r z5B_-}7h%pSqu?COiYIH8?zPd~N87*h%>IsM&ApYCUzy(rlYoG$|C>fJE|YqKYKB0Hn+MkdHW`vqHZ%`iIGvj zH7tmcsoLPO;r7D0)Q_Y}Mgx|xc_Exi>?FA2O zlUIxh!|BlkP^UAzjio$u6STP>%=-pGxLi)*e18ypZf078&ekF^*O>*dnwS1AAha{8 z9y)*hU@+DfB{uLFy*n$3F> z-@2gI`3+BH@*Jo9QN~HhnLFHKdm!Z3glfMnt?$H+RmDfOFY^nd*4GkC?{x9bep{tQ zaq3wCUc7Y#Sgg(HWWMO4z0}ZPlvU%;65w|?BYuE=5m;vd=R$aIjNe*_CkXw*Xl4n) zaa_-3(`&R;S8|Rv1Vr&UB9oH)3wo`oW!iMz;7t`TUbwa?p@rnEhD ziZEQBmq$vhYACAMEH2#h>8C9mgv8tspPzd1I}IUlZ!{~~mC7ZkH)xkx-EeOp2?ygu z=!9u>kQ8tL;e=iax9V6=4Y3odDVC*0S6t~0IY&i6umj2W$Ha_kKwp}`vA)VG$-RlG zX+wg2U8k)dT)ybImDaJ`9W~`()w$Cj`U53|so~NxbSc|9%lh25cy%KK7ppU0O73;` z14Zv0J|_x83Gw>^yTfJm0!^qy{W$ z7vG48bt;Hw&U-{ZO{EDddS>&&riA&v?}T~ z9*HyEw0tt~fRPP;feG7V8Ym(2hWSHXlXxl%6Os@Gc82kxGx?a~_xh`I~QsoLkXKbDKyusFcDGn5EPwDXrk{1JUUB9(0X-|hUiBnitiB6H`T zX0FGXb~!7>sG93{ga`Azg-oA(vTb9`{awzpiE_)&=T>x;N9kf7amGY+In88HPae>C z(%RZkfY)K`B#XJimKHMsDeA0^dH)s6wo#} z+`(U?>0xTYf+kF~qb;7=(XJ)b5gpsHT3jfG+1wo3f$5!-z@TxH*r*)~qF`Yt3wJ=5 zyyUeIwW`*CH75sRS<)zu)v(FnAxDFBOnF9{7U%IC=iQ9!OH7T-?_q|D22>G@vVs+U z@Exjyg~4Q9n_{#TsqbrFBTIS`He1hkCwrnQZl~HZO~x%#6(IS$I|PEy?#zrxFpCb4 za$UFxn+_9$XDTdcGOP?lzBkC50&l$Id&{Kt>_khCq)7P)4=K4cZxlMY zV3AW4<%5^*Xiw?5ZXeIoNaYDq1T8H=>-im@BX_pCGLHPGxoW2r9|W5kt~g$a*Nyfj zfY~c#8m$uPz5H&lA#zPHCC-gb)w?l(_8ag^vKyfOM4NL@jH(Bg|lG*S`06F zqQp&^B*yJgN(U@j<=xB-_beuStwqzTZpP`Fr!UQtfYR1yVo~bi<|L+tT46cTCd5+U zqSKdQ&Cvmu)WX?O=izGZVUbDg(UC(=(Zeb)&kWV{<%8ZNjbNt>?zou%iB7R3OGtE+$uK7&K#O{VTCL#0X#dm9u3(2!3xrjmqtd-&yBJRdp!{bNzIJ*eC7{H zOHIzgBcNN_>>2~aDmmZSV}klZJ35P(RWktL{|yhv5C%FU@jyWNhM@mR_4rQgaHh9* zF}Uoua>5<0XZ+BpSnykuPX^HsLXyysjWOgT4{w-0Io(GwIgvpkSV2*b!=6!8|!+=fbSj*26Uuy?^U(U}{0D!eELg@4LcBhxUzn`6LkL2@?NbN#{^n*qd zKlOq~@=Q#jn@3La^R?_^Lqv}74Zr=KdDbkK3JX`b*{FnaHkrwQ3B=-yp2wY)B2pT~ z{IB$^nW;lNk^6a)>5<#dX?Cbo1HTFWB}@VSjFB_ih)A*?H@B>vPTc-nTEbxsmWfDj z;3RR$WuI&f^2OIL9==@i13goVVG$A_k0gv`iKHy@pW;!Y2gZ2WWFm$u!(aTvS?pqe zB}GMbNT%F5gQm=ZRe1X6PU6iGBy93mSF?ZWhIpMw@U3{pD9QX>mdNH*P3a2%9fol^sbbcM4c5{uXN zG8*zGZbs2qFO2wi7ph3!u(MV^`RAZ{qSNoQetj@r-kC@ffS+7}tj4ek*Etf%5Ghkc z;n=l5CYN zgyeL=M~9_wh@dhAOeJn)rb|MuZZ1kurvl6C< z&;~431ENQmW9xcq1TDIm{cKj*ej37d-LHiPsZ>sXJv+PtQ|W%mt%T?e)s z4{(tvzMvInxVGS(;uFJ7q(gzM zB`C#a7AwE~pAc(va0x$!d`=UduGjQl-`B!_8DdKEd>71g{vw6z7?@%(E>5gg^PeFhf+V_ zHZ7{asm4BKMsm)o5L`GLw!mx(JdN6Tw62U_EEP;L5PI+E;>Mu z+rpzpGJ!`;kFG)_|7QhrF3k*#?nVd4 z`4b(?VS^db$kb7DIsbZJbhW}n`aq(i?dLKB6y3H4XnE0mb-hpZgwBXbB}x&Sy_??! zi{4#h`w^|XWr4C5We_P22!SNC4aT%I85Zy=k?vW??-Jyd<2Rn@p?$w_LQ+z?P4dM% z!s{Qk61HPr>Dc7xx-(JhqSlh0Sm;vKybN8Mt(ekP|M=e77BU(OKq632hdh>ypoaKc zfVKQ~GO#N{7YEcpE8O_Q9S23~TJ=pf1L?Iu^2{2b_Yl;V!MLyrhp-CL4d$g(3l3{E zV??K1St!q-X25`b&|<@v+|`4>tb&1=Yu010;ap0fES5w7!P)!nqk(tI8QS8fq1T>E zAKHJlSEgeu=G*d0`5V$TL#WPBPsYDq1Q2)qanZ9vI>srq1=IkKXdAtx5L^V^gJ`xI z<=BR_Xo61kbT43vu|$iy(Oli64p&M8N1G>#)CF3%*{RYZDisf?3~c00EV4|JVZEv2 zf{oSvVhVze_|U~gin3EJ8J#GI-?0MCNG%Tr<{w--^*v@q4p|RcVqP9_xlpRY|9I-cS%)lg>qd z^3h+14delvB0!PP%XpJnL3bt8?zjm z%j}9b-ABGg7O%Vo7!%#vWmP{&D>iCzz3Qiko_tq<*344$TMFvLHmqzUOsLji?KZ(Y zHd*=#5{wCVl;H=Dlo+IaF4)Js8C^LwyH>Tu$BZKh9yx^JCq65wY!Kx>-7wHQw%rwl zy`1taj02L~A6^w5vKH#GwW>~gjT0rs9ovunpv;yLEk5U?CgSDZDRg@b_siG}W?d2j z$psM|*q=a6Q^cKfwq!o~jbsG}93WQA#9m`$Vvz^^?o8P?e2uObcjD6mI(TQ|N!6r7 zeN6kOWZ2m-J9(IgkW0U(8@Nb!LP`hFS?VHysh zT``!>2%2A6Xm&b?Xsytjm?EBf>W`maly86ZS|7}Z=X)HsJ$CY>7_=uuTGe)v+mUMM zn-%WTKcsULBKyGv84#*Cx;SpHb8yJdcz*fR{PDEu4s!@5k-#EHlc5G*Wn|UPhSx^& z-8`4}Ou)}Q zWy9t4Aq15?$-_u0C-Yd`h#F4j4A}>Ne%}b(t>!Qm*EH^NPAB|8bFdgKE3+RbwcD+O z?B#7fWXJ4kKQ_i0@m;^!xfG_FV@p`M{zrcgB3qQ964v3TxYo;sgxucWq7R{Vl-wA2 z^f^$TSX~VWm!S$F&?A%JsyguVWg`w&Il93+H}@R?2u4>iPd*@hd79vQWn|{UvFkl5 zs;1$(Fc6nbYnwITenBzF95CBR1|&e`%B|l4<3pJ1QJoLyZ#f9JN&#&0vQ>!%xXy>y z&(ls7kvb)MHI7b6;7;KT4o)8;&dh3!8pA35cE$z--?QiFiIAM>dmV-Emf;2B% z-Obgrgq(T$A*kMtoh&0)ZyE(?Z>ykb*~wT=@G3O2<6&{Tz|-#rJrjxrnWdd8sv0md z-Xa%FzF-@t_UvZU=@V$mm*@)G`%D%oQtgrLti@dPl!|Mkw`ORZm#JuqQv7ok$|{nQ z|GZ7BxBvU*y0L7c(1TCREzub1Gfk~8jFeK9e2m0eDP=695DNpm?LKGUq-nig%~`7j z!_Hy36(3P`Y7{;Bvj)V#WdWfyzmv*~mp0TTcNFPZ4f6C&poLTJ>3)p0>~QLLW=T3| zkHICssMmE>7s*PGg*2-taf(a#gjSpiy|@5<=WM~CJ7Rcrf>7=Ej5a^Ca~473N2ugH#53^~Ki<8F zS|?d5c=7FZDdv1-saI_wp|8j1$JTb{Y8sY^oLFHIZNT-WmR6H19bwYAdEfGo%03#V zm?Nh-O3-Qt`7Wcb@i<~baK%dK+2$&ZVLjd#*9MNY&0_U3Nqll4w7O8TBF`(CXM0#- z5#{{=XVaT7dxA@*J0bS6DGxzn3~l8wm})S@4Ol33oB^Ff0OzmA+})JG8(lF}J9mcQ zv-d?%FHXWV@Q#lP$XUD+0tGVV$Ko{<>FKp4(y98UL{+v>=4mR6ex{2Q#P1Jpx zF4@VvE>w*ri&h8H)??1;`Ova)#2euOj7m$h4bhg z?&}PUY9y*+I6=6IL$a!8Aly6&RrHEQEcVEI3eAVm#CnnAn@ zZD5i3=c<{?vOycwb+FSzZ*0$JEnRNFh2RbD^3_HjtRHNt;&dG=cM0^u+E1OT6tv4s z+PV&>k+Q1!PC^;8y4zuAO;qT0z0PyE7sUml;>6{LuCWnN*>!&JyNk%x8-(1eZl7n= zY&s3sI}EImoQ*;{BfX{j z=F$>+@&!wikf2O@^@p$_;U#2MD(NyM8BPWq;RkmHMbDJk%imPRsxyv*mBpOTqt+8C zrf3lLR2unHxg#nx*Y@24oAu#OmDbY?DQ?zUBTQL_YWDJdI&CwOz@djoa_u$!mFZH; z=A$MR?pCf&_!gP3<4UuK)p@Z(xW26nSjWj)Ri^72tgwj1X92H)Qnxc+;#Tq`6a< zrBii1T4B|lmzt1!nB>xWiZ}DvQudskC2Wm)fmsa3*XMZbl^IN`Ld$AuwjPhn5hObV&7JY zi##~bs0~a+hc!mmBP<#rg=^Jq43ys8``559)7f~!AFfo!t%C&^f|qLycJdfbAj(9$ ze0sWfFT3HuI0emJSnE0VqB8PQ+|-38@;4jyWEoIf#EKa(mo3V()Nff73YfPQn9$Wa zK8xdyyHzo*oIN6zpY~OU-A0A7NE{Am)Udv-hdX4 zK$X^K(;>|cFLX_=9L{vyfcIQFQ$??18*NB#Yc-bv30}N(r>r#anrGUj#XwyuKNCrE2+dlf8AfD*a_SC5NqjXBplDyEoO|ygMzDqoIQ6uXN zc0@EeAH?oY0DF6Z>O_gRJqfL*4fK;sY!j9U(x(3&B>K|A&8>`>X5|PyoC=bsx{dw zG6vScNRibGJ(ctOW3b#SOp2A7%qe0gSBqQS?Ab1sleco4u`NPX9UGM9o6Tamg=RaR zT*po(1PG6s$*QyZ+eM=kXqvCz=Vq4M;oQRqwe+j6-y=t;pmB`W)%9P$^Oqy|u!f7B z?CbVZvfPwPX4+`YHlw`?Ih3#>baGUNzvP~ZN{$CzYWgCgwT~ic>?Uyyt9JQraSC=L zlpZP;A1ohC9=97~#UI?mOM9(iW2#CAhd-vMbQYB@@ws|27WaLxkTLeazFWBpU$E{3 z=gyvV}} z?{KBdR2`%22G4>F!FFRrxJN@9xrgkxIopnADt6;=*E~qE=#XvQQs;DQmN#f`Ty}Q7 zqXXxJz_LHHC7dG#RC1(enW}(7MxI(L&}+i_SOTIMGS67ou^hXm-5eP_ANnCFq}{&Xq-~PnJd2} z{V@;`Hm;F3+(K?{#@-t*zy46H!6H!num~w2_(#+FOw4=?)^y-xlXYc-Yq`uE;`gd7 zxJ{l46y@CV_QwqD{vp@b&Jqr^Gms#JCQYTLk;#$8g~DcwWTlai)x$?sxe)=TRJEpR zObW(*YO|b?$3}eDnb^(UCrp3It&}~DkiN&Q@I767Ie--PEmZd^SoF}HtiioB%urAg zQJ42B#*iliO`!)ZF%_9W3TBObv{#V78eE4cgVsL{Ph2!k#w;y0yv<+-AU(R>hXOG^ zBc}*Qj_mVH)-j8+aqujJ{bG&frC&m9wF;9%a+>?JQ6vFP7md9(`}5TVLn%dC>2*@_=8mtMkFs9m70gVjm7H433B8w|Q!7 zFxaTuiBTTJ!V7d$*m#tN3S@9e}_vC@z6M*JnnpxhD6 zpV{*lkAbc3z^;QEiZ{9L=*GFVYx#Q`sbKpaETTQ1pHA00ZrL*;m;2Hvki)8k{Ap%l z0;gay<(V0o@XheD1O91sj6Zupt3-T8Ueb&!>MT$T&0LvDGLv|JuCd}uV^hazN5S1h zEl&;CSNz$Cko;gXYsj!1p&wQ`o_ain|H>DvEuhGe%1;VOB=j%W%0Eq;EwRE%jb$Iy zoNb8ZUBoH;eHT?&-(-qk9L!bC%-hHy0QL6|j9jTo@=BDn3H|T_)9=YTdXAgYMURn4 zfsPWS?7pU;<=p&f{bi}vN8f!sD+hlixG3sw)!c!*r#fWIodXyD@? zyFA?4(mdQ$xyY(3&0%Dq$1ZlM`qXgs=~ZJxYBE^_t|F+sR`oRs0PfEETWE!ehQ+xA z4w)1m5kmY^DLo%#fe$8sc+dPamhn~nZjU@f;8=YiAPZ#nUj2>|r93I?2UB^uh9mr1 z##`-h_^ss7;YqgdBUcZ(EAAgJ3;~OiJH5NAL_PYv+y|xO@6NBeu22RT%2+W1H`o;v z{LwZ;)H^aUkz`ERtU36VVQ7YoRA-e}{C2!VgzFyEW#@gKxUq}wD=;bk4?y~F`Z9?y zo&b8k&xzoXayAZGP>xvF44}_AG8HL#t)Nh?osV_M%g0K$R~l;LK+n$!h=;djHDc=@ z{vn89C7S|_N0p2}l;BQZcJlP-7~{?X=DNO*x0}_~j2=)k&b|#eQ@dJ({z^l@9W1R# z`O3HutBZ2)f51!4+x zq?2^*m!PL}OAV7(;(d0~v7BhJ<-i~b6A_fy)OqYYRz|Xeb6uVx-Ae)34pMVX1H6(leI#wQ7$~myL#xWhhPmM^=EH~HFFK|C9JkAwmKXnE^ImXi&`ssM}ZXP7X{k(wL zynSEkY!7&6(Yx0`Kg1^t(g7;MCeHs0JpKb)xV5}#^`s=^jK5rJCjt_Y3 z-cwq8xDlV0z3mc}=WKJx{%u31utyv?nEz(r%#g^UtR zvdx)mdWgPK&CNh}?t<7XbHZer_?dLm@$8ZW?ifiny*ASR{#$xqxBN2``&4p3``0YR=k(|~39T=dKfVMQ>#NoZ%O=sVv>{KpfXI=-+Sk5t>t4V`}V6kDbG4v%SX{H?o+A zfY$Cuew`u6XmYcJ0<@eyEKDe(w+JhJo({3@Q(&KTu=JomVwbmH1aIihx3_`l&AiRR z1A$Spu6kDGA zBe8oxA;jA`Py8&x$vOyr!I0`13)SRH8-xXlky@Qs!x?3JSUl(CXnZ`>Pi{|!sNNnf za?xHA1MA1>1G~qI?(}R^^}TKlgv0{Gxw!{#uGq-na-w){xynRyrc$ZwGjKS_KFNvR zGVct)Jln0NMu4Qy+xX(UI-cxb5wyTZ0a|*&aWZYgF~#R=#|`#RO&OkB*)!xH&;oew ze?y}5=>gRWV_fJI3w+skG_rvWu@}xV^wdR=UN-Y520dl|Y;tfQK?J|oyLgJ6U>COp zO#7NhurE>Yvy;8gnjT2QC4_mxXHm9hu`nbWg-3eR4>eM97rQMA?kyU?2-XFR+27_N zb`kyx)UuPk;RaFO3u1x|U~!|!HyOAh>;i?$qUiBGIsA%l^D_oe#RCJG*HsX}VR-hv zz@@4tZgnG9os@K;OK%IRC$f2-tzz5uOSw?wZ@}0&IU%U4!XZ`iT?5YBnHw=Hpy)zq za^j~=O(osup@PFWJAc%%5RyA->k%PZi<%J3>um636k!!asmd~mh?A(vIALn&Aq%gC z3iusZR@N&Lsw_RBs-RW-Y@_7e39kbgCw??TpQFY$8jXNHQZ3*#%fl!ksE~6b8tR-) zDS`xDD*%;5eGob=t8c+6EwQTg_ngKXPmZOwl3n*u0str@f5)GFKg9SDva95})b8^Z z@5wyCi7q0rOyL$m|5CLRz06U%`*-^b+MbH}aNOl3?!XFLfdvckZ3<&i9vWEg3W+Ue z9GzUM0!wqLzu#86<{U2!TzT1vBw@>!g?jUCco4@DCr{-yj)r%egvuq8Pq zvHr&0C_Hyi&V<7Ivm3`?&5={f`o#iy+&5VMBvBd%U%>5?cF@;(870G3L{2+JUGV#4 zyxlK7%Ff{64+6{F-&9`!wY_@fDV?7LvnCzfUzfTWiwaEY*KU`U07AHIhHND0uw7#U zREE>vU);32eqYv)@V{?Qm&2V8rsf^tR)O1pM1z7op|moQmH&mw1~1)C%H7n?9oJMF zh_8D?kzZT}xhPYu9_Ep%k7mvxqlI9fGh@ORIcE!K<|*v*Nk7sm$|o$m#eJ+DV*7&r zYx9y~Am2>Wr9fx4L@*;sb3pmM0Gs3Cm=tTm8!2MIi@$n|#RcBrxo3l1{9_`A-&mxb zI#0Ab_x}N0K%>8U;%Ix_&L95`JW%?Fxm>yT>lsKjYKJAJSYucEhK;RR+AirwS#p+W zLl*u#lkTf8c5UFaf3agO%Y&Q|b#vdg7Ex=1M|h(J+4BI|1t7r@SAj&9Wr>l6@gOQK z)v~}J-_$n|Y?#5w7@B}pepp#F3XX#uip^f{$%@ z-$}NXHzuu5S4~O$!&ba4#x{n3EDykpJ#FRl9f0s}FNC^z6{et1)OBg0ebzS_wb%1% zc!wlver#+sy1fS(92)yzMD2#bMRtc&-_ZI=)uM%d`zD%KMQYn(<2gQYRT=ygBV>cc zSL~}Bh=w8riKUk<5B)OGwq(RxL9-Ds4MFJzHkr$sLOdTWM;Ts2^6|;v((2?n1yC zv|_~JvojtdWq)?Njy#q|nPK}GnRP4E$gCNSMxL@lU9-^+{f!;!*L2-y({uu#1|3&d zah^97Xgr2g?LhkOi)e(4M7i=%slTqq#)5`avT+EDNUP!#rn0!!e3tMhKN)#ZkwfST zAuG_?c>ke}zzP){MMlFR6>J=1VXg|eY$?M(mO`Pj{BcI=)aPCA>qN7h>na3DKeBYY z`r}-ygmm!GO)Uj&x0cmwn;lD%=dv zMe+yo=g}yiPT8Y)8jtw`Z$d|^QJ#(Qq*%NfCC(A_&0e)Hhiy9>ae#^v{P_&D$a!9z zimSu4FZ~B3f)IyCnIRDG-4)-%`!YjBUg*5Xy~BHV#Zh|SK33opg|L+bl{1KI>F??V^ZI;`uz8^`inUrN1^1obMV3px1V?TlCJA3N8Cb zf_x9p9A>BL1z5tqAMHi|Lbii4}@QEaw|5MmiHz(Xjo4p!(h8 zJ!w2jqhscdbykDitIc2fC)lYEKvl1J=5i8@lD|I~(GJ9uwo=5Q(_osMivZeq)1abP zy9{x<`TET}DrgB@`(^+Z+&{_B9YNhk_1LHW&MI-!s)S;=nkeyNk-AassDr-oRPW)B zZp$_ty6SBuuwA*iDf+5TI=L7LWAZo|(Fykk`wP%LBk@BfUsLScXbs`718#SHjUW(1 z4toF3+2>IXj6-u7Bq}2Lk@U!?LvWRzX@&8ZrE7?9KC7|`V{jwdCJer&ZqkV(G;r17 z9xJt?x{&H(i8M|oprXd&+N!S!Iw~Se>sGX{ykc48*=AKka~k0vbgtBi7PWjrA0hN3 zV`i9KOtt%YPmmC@-Q~RqRzh$U((*5e%$W z&P`X0$zy`p^-A5tAA45OQI?lUJ?xB%|In%T`Mk)*OCvbQ?CnH1YHH^QwEztA=2gt0 zaq>m=F1e^gIgl7z-fbcmC33lX3?o}ECX;lO;`nCiQ4ynWu#B))!@D0X^98$qj?_fF5glRBlICMCK8ZJ!K!Grx#kYK2SB-DkYry!%YA zKINMT{>N%|pVe-iiu9R$j;6ukrhUNF=)J}bFEwDHL%`~gIEeE|i^%AyD?D>Pd1$iD z&4;^q4H&Od#pvHc1cByH3EP3JZqUBJW40X`6NX52-l#HCCW z7w;(XQYPZ1WRp#>U9c6`ZFkex?xwHZ&4zYirpCo9zSv|o-zPtDf9r#buP{?JJXnfv z(dOWizJtvjii=bpEUePwc^jHAIlf|IFpYr{{JoUlm;8NMM`_fmk@u0JyZ|l8sz5J| zak!M&Y+Be|8l!R{5!|$(UU-N$jgK7^ZQSUZ@x}k_a9;;Y_3QF~c6$G_HF#792`eg$ z!24@5@MKLHGRCaLpGO6M~dppR5 zc;9Z6mt8KXxSuo1bS5$sR;rTDQ&ZK2_Te*x#PLMPp(`GvO;U33V^PGTB`Uon9-Y8n zC91LqGrU2LIxWI$%(%|%<6W+A=vo^Y6ZTtna5%NP-;SRG%#>x{`D6?jDxe z_Y^7&#WP#F?ur~EOA9M0LxzdU^mvwnAr{Zjt~ySu$M^2;=kV7zJA;Qi z5iuOr*b$e%EarLn(qtXbsCYUtBlhVdhCSPL1q%F>Oj9a^KeQPR3)$~$3?_=B)%e=G zw`UaC_dWv#?fBqw>tv1k;pzf^tHaIc$v2Mda8zQim7tti8TqW<|J_8rn#y;B&FZ4e zt8~VZPB45m*Xe!r?Un;8pVeVei&hy43sBn>bxc@5BN!&(o`Qk-D6$ov<} z#e8hi53(F`4VC++x1>h1FSvzE^EEgr+r&P;vx6CKmZ$h?^q8sJqDO3Jp(iD{9!^_; zNN$j7%aso9l;a%J^3b!mR+e&nvym$JXCuS1XCq5c@gqDNgHR=g_G}bT`A2v*0%g{n zje?k0osC9|pKdm~jegSEs2g`@5Rg=(43iMkle4X>V4&ry6>3bF+_AaMqp}wlicj{EhJ%{2h z5ZSjHFUGb369_em;Cl}I(2dQ~-aDwrO*8q1L#Uwuqi|j9l%)#t)AcN3k-KU6Odck5 zZI#2%Nk0nQn)r(d9!qlugN@;0i%W^HS{Tqy{9xrkxGKZ9FIEa8uuI2-mv5^4Bo1i}rwhJ>f^TS9@HH;$+1fXw4RN43qpl9`h5JorhKdwM!RQ=X;&#x!cp_6# zQNH)2_XX(PCMeGD^y&gMsY98M)AGdy1~}tu$RtlZCodURfaXJB?ATbmH9fXowNj4> z)5}#{-y0QrCSC+r4_cA)0={9#uLM3}WFBLnWbr_7x2Fq5E$I<&}NQcg}b-eRm|MktoM}wW6Z+Js) zb9?)nZ@+!GGx+vTe|q?#9}Rb?DDCh;`oo=X2H!sV_8}L32-P5AdwY8agY?iNGn1G$ z_vvIkE}+SyWh5WoW-XQF=T?e-yDdh{=ZmV8^Y56S>(<25UVbJ4&EpmMMqib)Cz@4I zkN&ZK2%Na{)eGyfYhCF;J{zv1x>D%M_>j3Bf7u*w4B0?EzouCpy-{R!!W_&9isxV@ z9%T!>&ZAC}WHSxXG61kFrJk-6@)Dy6CG2yma_XV&=qc{Qblexe>~6WR>ysE^uCIKzWkR16g2x&yqmiS#pw&)zk#Ecd6$}_^avOD7MAPh(K9SNNTFJ5K97F-|D+Xp1%dQs9 z8E`K6G5br z3bFBURrr0Dans{14Vglxb05}xoQ3NKD~Y#*!V_gCtsgfH1%WaW{2{f_dH>3j+9x6y z=9eVinvnbqTEh<%*>mLcd(~rfJyogUTt{sy!d=aBu&TE(Xj<4acgW6?U28D20w$Ib zIhl5G#Kp;~N~;BhodiStsrV9J!L;OHM;&z0$7KRud7+z@vnA#7!#q;{#*mQ~qavPE z6gbm>{yw^Q_s&lo<{a<&inlcB4!GDtD*K)o;20G(6s6>!qa*+pD6p15o(i=H}ny^M3R+f7*|pXX*6lDcwcgw0Z!x ze|4f?2HT8w-@Mq5@V?c%r~myT+I#)(P4x8n^Ebb|ei!|1@AWS3Rsq;{-Q-S6e3wuy zgf1YtCP<-J=$e=qW2u3-Ie;*tD6nbC_s%96rRx~>M+pwT#0Ri2sI>kt62)J|%cBH0 zEt2A|*sY5+&VHrHHX<1GSpwEcS}o;*P~#4OOWd;}H*Nr{@GPx9#us>h?9RS;eO?4V zMNfyLGSASmQcbA%>JQ3~%@+M}VMQ9zHRZ2x?0*Sk?uP!6RloC^j=m=9uL6iC5t?2Gs2LmR zhoUMXGiERx1L>V&lSoPrCJ_4AXp$_Q*iFE4SU3ogjx^3`*BOPxV>4$;97-$i6MQ7P z#0_lIH{i z9u;6k;$xxXg&A3%X+ZvDhIg4JL7#U)w%GjLX5Xl-4^D_#=yad=+R^ytHgKHe>(y4{ zA{?}6;nKxrY~eDVcSm#0rI+=Fsa-mBijQZkWyBOGIo+)#(<4>Z%LhzQzH^GcROH-- z4ptBT7k~aQ{=M_RH5X=~KbUc_-gy3?Yk8iH=Dn}11l^CGkA$?27RMIo@Pa5~F9sHi z9W8lhcg9aB0#_iL8@fqLR-={&Y+pQdn?y_E>3o*3dyYbL5Jf*=OnL>oZxzMBz#`iH zz?u3Q#8Rys=|#+BA|ZiZnDgPiz)2381|&$l`PNFU&vojynwC+0UJ`kw(Xv$Pd4!6G zoku{7D+%t7G$>v-397qET8lX{0qIWr#3A^Y$#K}Er2kcv?ArInYRrVOl`x*0BCrn7 zjgfdSlOk8G{-M?fttH>n15Or_bS9GpUm3!je_cwVq)BN4;`?BR!4{XEY0L(o z7C0uZB&WBnXJNKJ2=T3nY31vFf9O4^Ki1NsmPZ`p@vAtt(j)!Y;$nl|{!JzB=cYC7 zoDgy_t*@B>+TGu4#GC)x7=cXmJ9D-UlxNQt!h`Qwi zuk2Y7LhgOt$m=VMi~j9P8UL1a0*}00KOv2rRn!yX!}}te8N9=_nn_`$*&jN+Rd3PJ z%WZ^jmzTFid@d5MYolM!LU(pLHCinV>^3&McSJvzc|61NM98(B!GW$l0Va>AL|{sN7Y z9L&=jo#eOE_%}U`Z(>cV_Lu&%SEkO~^cQHHn|h)6dzhl$708+^b4{*K9MmAfkPR5| z5tbflHr9`Ya*zolpaJ?Cij!**A?5vtHP9vhN5jF;Iv4XbFzl37TvYGUX+p94Oy@+( zIn>dn{q>=RxGL(kMS4@!v!uX}T2+zWRCSVONl6vmH{MM^MZ)2*o}+6*QZzV6qBp^0 zkKgW{?3#`QQ8Pr>CCi8IfUq6j59i51Pm$+!<}Tya=x^^Q($ONz%4Er7^L|K<7fiB# zG-Qtp{`??3jM1@fjBZs0`rZq_iKv_>BfNVo;?dx&CCE!yPn?h+7A&_%ag`kBMS2O^ zk(NzZ8wf_L8kCk8ijzXl(xO~oW;%;_sUr&l;m5=7{_TM-TLWFH_`2;SiY1sX!Dta4&|>1%vKCV%&sh+0vl7z|G1@Et3j0#qQ2c>-6o?hC3bK;J()Jx8H77M7yCS9!JH%~bZt>P1 zJ9w734M6i_fB!{8Mae3v70D2R(#!)}jb$z!h)ee|1m7?Zb$N7vk`Pu@TucpFXK+S6 zlBPvZy8AO6Vj8|jPVccwmroiB7?}S&f*uLJP)cG?s14Lk_Bauh9@@jCdb)VoP z-zcyKX-B_yh~%yRq62zuOZVOKXNB|mjYW?xTXYkPUcCOWRuP00$p(9 zDle9UD`U}0SmXVuIX>nA_QbWDlHy%;`{Mc#y(-`;fG%y+mTg~6sd=Sban661Yf3)t zFABW2-nPl|^Q17Gt_L&wnq!k#92yW0JQqY-)f;Yzuf6dG0x?iY$03~a<%9c1RvUrdf6>># z8ijcyTS_X_mH$m#CcDCQGHq1p`=CaScOn>bAc~LUbhc@{#&HI!UbGNGXiZWL6*&$X z?u%U==x{^boh4b}+!y*t%?ZI&zu9;5?a5S@gyQ2PG$XBQZbwx880}CI(TXbm(Hior zkehByZ7{lQ;qEWqWTRDFp1SQ}+Re8_RW`z6@4E2u21vf2RBmr%`p4)IK8A$u0ZDBt zn|U|i@&x1NB(u@dZB}L6e4EpJEP@QXjq04xxS~qKCRwA=FI%D2wNBF&UVXGuipQ>R zf-xg}VLhEucuBsf#Hx{RzH!VdP;iZk4gV;-hO)~CD{eV^YA{+#BPo(KD5M}H)awou zOj;8P#q)5$a4ZlY99{N9XR4C#WE?L$FtocJ##tC&Ri36oK+6EIIGr&ap>WEnY=Fd<9$At z`!Q`zI2jOwR^1LPl^%vCPMQUIRnP*Qet6M;QQ#hJwgkzUl;qV(_gJ#@G$FyI+&QQG zfb|UDO;~qMP_ynxV_HLafR#ZGRS_^F)D(u6|vXV3R7?W zWv7PR+ESBu6`fwnz$VHEM`v~o-C&EEKp14sai(fcsZk(hvidx zh58Ac&%yUkH|AIgiirH9^MEY9dAh^cQvZ z9(mvcgB=m~M;i-j;E*aE^7t7>R29)M@PI+R~AyRhxNc zv_~ayHsHMv@fs(v>NFXrP9vHO(mi*J=IGYo5k_P$Fm0cA1ceMgLLQO72f9BS#pJCk1X<NINC-fQ(44MTf(u8A6|WUqY_Ko58OuMPP24WQ;X zm$&*vwrxqEG3%|#qFNNmCh%20K?{dYLqSx}l5@k#84MZ%Eb`l!P%9~_Zc7CEE2z;x z?M*-ygmbsUEh5qs*StQay({AU8W&_M@oTx!#aqm@W^xnhP3#Px+@vLnFZ*ZOh1}@1 z2=D2&(r%d3z3p6)-PhiDS}&uP*buzi>np9lsVg)*d%I*Pm7t4F?T9P1biCUb?|g4u z^Hk<4GGh7nOtD#VK>^=IU|f&qkWnIF;Fxe5;v9%_G9Isiz>gxS0Rvg25d{Hy^#i24 z%Nf}yMjY-|)|NEf+<*#^LKdUnjy3tGIj>cnDdLvWUO zjWEozekiL+p-c9hsl>LZUJWMk_zinvtEHlx8R99P$~tAAR)fPsP)Pi?y72}=)sIe- zWgk6ude`tt40$MuSIvs_IGx4WAv6Vzd$fLM#l3;(>;+i9_BwqC95Z0@4ASx8 zfk)6OYI89d?8S`M^~Q3monIvkg~9LyW^rc(_c;OJO(XShcLeT;3tSYr-deS^gs!CJO=Ao(2)ysJCLTORa? zhBI<~;qB?HpH0>b48K#uWP!DZe`R-S0aDiEfZ*t_9(ilj8%KO)CxQcyRF11Ena(M+ z?igdqPH9tYA{;P;2(y+S?#SRtu{}A3-wW>FXJa#|^RehD9)}{F4;h&!@*Nm=ZA;5q z(Y>IxXzl+7-^S>6Y1HWTATB(Rj|kC2(<1xQ&0hAz>(dzGYOpO&1d0TAS^GG3w2w62 z)Ala^)Hu-9cnnEAX0>At9R)BJMD6q%WssUP4B)ErD#Wmoob}SqxM9%kdZ8nr&gr_# z3?qV>)yQ?^aj<{#%6X@0-BV*pFQ~=rbe5mbI&H3i6!CePR32N*2)qXcrb!jks=Mp6 zcwoI<^^EmE^a6u1MJFKrGxldACsN)V7g6Ad+YZH@K6!SfoyhHdZSgGKc)Y6`?P4f* zXL?f-NG)7^pXWt39&pP3;fr5iync7M`{L;?3YJynp1*y%|C48!brUepQ@qf`mt^fU z6q~_x9bY1JQ328NR^?dZn392++82*&j7}&(T}siS_eBd`;653iy=)6%LemKl9@OACRtond;Pee=UQI6Key-W7Gjo-r7Psazr4a_T> z{OQ=W_|tJ{Q;m9FxBH=j*X-wR24M*rh#z13h~eF@xxux-M_UtIXKnED*9g~LE3{fO ztgovYx9)CoE%C*#DXz1&_#|tLo8X|8+|!a4NK1Gp%<%Wu2|L2I3QJ z)0J5bCt6l0Fj)1_a_T2uO?9nRP|pY!B>%HR%%P(R3e$JAdaI6fFhGpra_{cXMKVb* zlJfDryBovJ#ld$JP7&QbzTd!EyEv+f7-tXOKB7E4d*YagxE>HIw~gWP!FTLOs_J5p zDt&25UTabnHtRL));N>=$gGN^gYTrzqo`>%CbBw=ZAmTFYq)JWwdl$3*^(mA*d4uh zcfW#>*o-rZW`mE*rjwLjjo%o8^g56|hu;PUGDo$lvZF3eDsszOl*wd~q3;=_C)uQj zRnbAy0*VO+WR-7$whI->*a89HM&vLJOO~@hVPR3^-reUI6cZ=@p6>Z$9+aVWz6=cz zf>SZD6~%QuIa*Di9PCzt18C&WxgJhbMWN#duo4pu1Yn@Y=z2I{4TXZY`brEG2!J4* zP1nOgR8nY!fULws1CkTP9ApHbuyFaoSJ-OJsX*m<$V{d;$J8leLDR*k6cOHpqld-L zw}7ZZR7O(G1Y=RQR>}fq(~c&5ka#rl_1t!8>8)Is96h^oYOd}HI(u!gE$tEn-2=uo}}N6r???!ft~*2HwMI@PX^nq9{jG^cz+ zL%I^xsg0OjS`V0Ax}gD8g=+Xl%PwyXR;^A$L*`JSqSNxNMB4>cA{1!~%mI+5v^&wK-Z;qzB(EiqmAd5y8*bd2t>uH!u;*ht~=2&jPW=B_{2|>T8BSe)(_wdpDU) z#(qZ@j11_Q-AmsqCaf!F&lZyn1t_}xi zfy)u6@8hj}bK$BH!9~+iHcSs{Z!u=o*FcEllrE{GwqzMT|aAVvW1&uo|6wcAY>sVDv!Xbc#$2FiB?jzAO#WPU_ycGPqH5>a$Df zo3pbu=@b zt$e(-SZ^)Xt68k*j_$Zvuv32=jgq2@ff>|P=wcLvEHmOw_HHfO--bo|Tk}l2J;VCQ zUI=R#rN2E}(-vy(b)}Cc*=}voTgi4S*=|qge}jS)<)nD}p-7GwSzI_5VCp0b`?a}O z+_exjpVAbsUXUMmGB&OhWlMd}hhKuC7YWW{hp!bnwSdi7w9XOwp{n~DkFTR`^?(*# zTQbdH<84msMti8E{Gr?F%!?dfEr&I-LoI@)a-&HWi+2Kwq*@d+4a2zePj{w{lL})3 zyo%>eNi(*t=1WVV&hv|WD@>AjAeQr_= zaSKSHk(KD;yHXfK9RBr$RWV{g)Ho7q40Iq0`MQ^x^u&yQA#E3j{I;eviC6meXu4gd zLwX=XwM3gnvp?sh3f|%rysQrlPLs!-J73JK`LY;JPDSDmMZm7bBz>Ze&uF<0D_n8p2{6i4e96at z>Pn^#pc2+OqyUwdt|UE+3oS#3L;Q?pNir69gdg9#E31fsFNDKr|K43}0xgNf^e8Fd zyR7oLm4>D95utl`i{#(13oqj|=Iv?n9GGXoYF-Q^irt_h1$Q|y(`wq7qC}s54Qxbkb|EvmtiXa2# z!cY7q(9!kHTF%wtq$v9M*R(vgnF_o99K*eJJFCVXnvjG-YeNk_UV|>GuF*u#r`NCs z>lPeA^<@P)Wtvc)R{1i(m!cWvt8W0dxowuz3_}Iwr)-p|ho4q0n`va_IxCsW0O}1d z0mRrjb6e?j`thM=^@%uAPTMw&8e;duhK|6<*N&#&6QCD%pP$JDypNBQVgNu#2=o^i z%pag!S61k82L+q)dr&LuV3n=j`mG%0d6vYpb(*12Z>~^9?Y^2$(WXP)UiAGF#XpTG z*v)%Hx~v(KR2q~{-9A~njz(u$-4x}Rx>SFIZN<#(NAKTDRul$^0#xxSY z`gK;c6Fz+Kz4^Ai>eZALdS}k6bbZYu70+)=-Jl@HE^Cb=70&No%ZQP_hMqCij1u^g zn!iy^b5jb!u<1=h{#Hx0BG!L^su0spDhr`2zBpB32X%DTTlCqFuq*hY>qVSZ_~vU7 zFGq1n0r#l{Ef%@TAbOsU#T&gRRW*P7;6a&Bs&Y|G0J~8>eekpxoup^UgE+&ZkLqN4 zxV63Y(D@vkR8tK2KOFjG{GB`8tX@8#1jW>BX(dLO%6NOlF6D#Ny#xPSQ|8)~vV`n= z57|DzSlsc7+&ie=WPgkXF}~)n$><>u0u&Tse=jK3DebSQv`dwCDbq%%;b%Ur-9oK;`ha4u{(7roF)5HS_}Rg2%> z7<1OxHyO?TxP!7As%sG|@lhkTDLD^~?KHrO z6J~B}YB&}bQ6;g1FZma-L9BRFw=2(baEr1RIEhF}_x)mEV6-orukA*2rT9q|Jf%gV;A60xWkZ1&lCbGtXMQKGhYZzpsz8Xne%_xn@2M_5?YReXD z5jl)>{_iBb%120ikPr#kB_XsZ19I73W?Ii)hLx_sgI@BN5=gw`%!#4?8oiJACM z;}VB?O^~;_*!t@yvi{^SyjOPZO|P> zv1Rjhm(b>)h8H5P>pp^q1uOyBv^Gfbouovs4JkqormgHdGj#CnT3}UZKF6TE;^iN5 z{R5h-DSjT8`1T!pXdEp$qPhJfowVP7hcaOOeHB;X;+~3>*y4?)HMdv{?IwSE_g$27 z;~#yki};6s<3)n(h0SH_X${*r*6STUTrpQT+DSnC#*tG?VwEB&!M|aEJELWWJ^|A0 zGo6@aVN6Hl73ic<9daM=?ZXN1^9&K5KMKs_kQh7NM(@op32Sbv7{q+RnG6wY~5Bj%FsJ z0S_w6T6IN(+WifnOV!#rSG^aWK+NXCFQ^|~$ON%J){mBU$`WRcopSl1jU%DZFo*sv z1Sy`zL5pP~ILs^+^rP~!qIzu(z4-~#}WC7 zKy=?rx|KtP&EB*3A-L68gev6`39bu|fK|B3#Pk}>iqm@HN`h#YBP0R+Wi^Qwd zHg;H^2-it}hw7qJi4ihLx?R~2ZL8JEDqP@HsY_oekN=yI%lzJCS6U1^yl?ZbwWp(L z;D;1?;Fw+W{k(cLLM(lymcJ8nwKH&CH!}+n!)REwn?{{)v6pto-Aub<`IupXyPtNa zVMFbXsf<}a8kvEeGt3HZxItcUU+vD7Hr8a1>-%G}>z{JxOc6|a#nErE$#s*i1#9fP zeaaoQ>v+P|_s^RBa+Py2s6Mz=Q|r4=D900cDvJZGrO&8@3Sa3N6#+HT3(Od9f^R4 zi)TmX#&=snJ1wvBGf=gG{T4GpE;VmAUw)&TFM&1u7rq1I-G8|Pu1>wS2%C!||H|l7 z?xGyJMGdIobD}Hl8#sI;U>M}E@mX^h!iM|F_azQ>N@$g>i&#tS-|7ZLLywoWBFo<( zQEqmdVf9ACl=S8`_ZtptscL&yZ#(?w>_fi&=h_@3Y-pkf<-cHL(7V&o0BOVh3CfVUQu3`gK;OSX@9*y$pd{HG(uC%G`@~Pk!Kd}$v@i@WK z;?j>B&27gAY{%y#|OJ9BnVzX1n#_ekjn_2-2n;i$6 zT4@&>7&LM~O3PoC_h(_QE?{ChM&BWVRR$tqp%M$?L=Wit7WjG+g6g$hUM3 zg5zRulCFeymX@8hQJ_jX#RJfcKUW(pKZ^CM(4PT^mHuIEFCa>6{DGTpm&0xznGXHYwUd~F8Crg$Y2s(XH$&ljouf-Z}WOwY3=e@lTF?{lPSh! zv~5p2J5D=0b~`)Xc6Ms*?3nHBe8vlTzP&$Zb@Rz@b7b^yLxqh`Zy1ln%w(!|^)=Xq>_tk#O`)V+XYA=l?jgMFP%0i8C zb!m%-&C)xq;{CWgbf0#k&1(pA==3;C&yp3U@V&cK7B@`TW|an{wm#W*{ekkd6}iG_ zB&cYc&<}K1p%0yeEeiWh8eAXUe*1DxA&miA%gi!cRb-T!Tqj5afKv3A{`sREmCtDD zv^7Ki2v)3NwSfQV#zEhZ&f?b%+6&XXNN(+g&u%ZMVYsyy zZtaENzrFDN@5)|ice1?wdF+a4Q$C<8PJu)5QLom6>m63#8X7AN4W$`=6NU!nMuJtQ72h`L8hdbhNvZ*M$3JN`K@-MbsFjkkk^kJZ`n|JTRA z|4x7Z1N&6HrsMFfzWks60f*OX2X1g4Zm5Sr@Ox6XixQ1JL2m&3=j(`Et7`@R&ISH1 z3M^{{{=o(QAqreNQ&o~i{IJ4C*DrjNbfAL&SC_NGMV7)rBF+!ED0_n=jw<0&;3N`0 z1dLN2bkZTt$ZI`fKLKfIIrACFW{r1Ug=kK|Fc^oD{x~BhL#nD;pIWR*zGq+=kqsy= zYpFWYf2y03rX^f@y^vS4J;l_$Q#Bf!ALkDOj>gFpuY!oc_|v?!U%#cK!5qf1`XR$` zqr2=RW(fh!1vIJjfcc`vtC$1?lmhT$Es%6Ya`tPI@sAh$56ZWmHxlX$q@#HY^l4S4 z)nc5O2$>;HxqMUb_@9y(UpL0NL4^k*Ayoe7v>Ki0()1ZB`!>%qT@=4UCI23u>w@qR zD)%&hs>{JgsNC}`ogO`%u~HGmb($+64gX6?j0^1S9qkt9g!osZZ~ATbvi+H*6#u_P`C$zzt-)5 zsJ0INSY-|L6|>H>MajJFM-uvpERDJVi-o&t!CD9NF4UxuFi=&*eOZ4TnsICDV0aYP z?+VmdA9W;eBU!J2I@ekUb*QmE>V^;t_rQ{L>vqJdyiR{~#a^4Wply5n9I!;2>VS$g z>cCe%N~>kK&S+7f7DXG=UNwXNB!(MSe)H&dX*5!{;aemWWj$AwG%Sgt4#U!-xi zvQ$;Xv$CNS@RTq$NZLpTRqO;kSFRFLRMb&j1-rRXa z!N7zK`#9?KFchXVgyClgmSU(;%74x%N@fTG8ep7vqCF4_84lG#YpEbaOIU<3g zEwe^Vum)sJG$q!n8KE5*8I2pJ;Tn)ggGZ#o1)wld3^QRJT#w2;!>9{VTT6t6swGg< z2d%-t#80xMh>_zYC@HiD0|NCwI{>V4aD%O&u#A3$NojGal%a&{@d`}eq0~D|iZZDK zk`l2MAl2m>n6?mJkVulXgn*)&|L?)+s>=gFxz??DXX??YG!27-t=^Atgfc!M^lGXOf_OL4P3j>=>tt|S)pBGD{AAFO6Z zmmOhzR&z(|1&J!?HBPuK$2M`d^3ARI`V?Uh^skwr6To!Ec@?TwQe zK4yt<_Pt3rXntUjz&Oi+5zo`=BmxP$gY$<5 z`U9O070CpaHlTAsb(Be5j85=!x{VbD)B`6V6U}y?m4jC=s9eeHGSrn02I99SICO86#}rh*ProQOKstj- zk``q*nVq3q0nVTS=S2n|)<#;!BKO$KQ z+FbxwEoBUhiXID0QGu%*1YyTw8)3#_I_`^KcDG#Ey;^`agpnWpivmar>Znf#mV#f0 zBD!J$!cK3Xv>WB~Dk(N1w6UW~i!j$(D$94;PBD_c19u~}NHJTRo438H)72Lw#lUQfLoNh97VrLV>x z{8;0Nv8xKj9S|30tfBH^^U|+EP_pHdhOuwDO^0!~UR;P`o7QlLTT zWXw@nU%f!7myM%o4)a(nY9xqXQHcS4NW~3Spy^ws`7uPTsSu2vs4UG@S@p`g^wqX1 zzxXN|&8ju3$q2xz?qU5^*#-b*Tb>~vWMz_EbKCa1gEI5Wr)S#!nYAswfutDuutPI>=EQlG`4OXI=+N3B*GyBp| z5$bCS-dz-ceRZYgQ;`hwOH%JmNPY&Z$qy9e>1e|Wc=r*?odZGi-U*V5*{f%Dd5w7u)B8o?& zWDcedF4jHZ{`Rv8j6?+t<5^O?O~=U(paAvPK58-NzRUUCFka5*wvnOMO5){qhm)YV zHZFvhtZhVCC6?ZW|AbH!3f5^*uYb{Yvbs@6C8)7Q3^|_r7AY*h_aH#4PN0{vtg*{- zI-Q@q%U{jQ?#`Asa3Lc~Hj3Lt95)9c%a*|pA10!Z2__V)aZ+yr`k_>C=XpL;FAMtG z5a%yheh$lfOtbyDxfH<3CzHb>k9jhhsS&5vg_DKG8z}e|3)W%+YFIO01GAR!XRE*$ z@$A%wou#wnFg_}hvZ`l9p$w6}0-v|oS{RuTj>@V&8AIoTF;3%YK3h$iT~RI!=`2}| z%&$okF3AW~BMe}cOdOJloG6%+t!(-Q7kt^GeL6?+BM{Ci+G6mw({xF>K6Z2}MAP&H zSKiaO!tl2N zD`Z1L_R+13y_K=JTDq07U%HIFqKN&-GPc#dOD?4LS!M~lSP5t`9z{Gv(%_NAUp)u= zus|CV8hf+nX)%&-De2cL)7cDG-{!k_;*P^fLMKH#U(vG=^OXOE<>fe^c6-iy5|Maa zOJ+x3N1o#R8dvmvEv5iN*oijrSK!4l$a%GpG8rHlh?8(Pztv;g^>z>j-eM5>n-&4S zLPWkclYFyHLt!9a`H;3w&@ScH;FKKT;xals@mRgzb15mLtorQ|Yce@-=4Akgzf6lXQkMVh3$*zD@qUNQ=bU36+PT91Dm(Ha81T!O(Lv zTXsAkJ$qG1AZHfp9at5i2!G?l(Z(JUmpW1Rf2pASl&{=Kx%8D1Z=TA0|E_dkh*T@= zkx=v;^N2pMq2T7K^Ll8R;GSM-$qfQEPD^Au%5@k|RoG2it%4TE?>8_l8ng1sdeDGeSWzXx!9aQ|Xz|_*IVDGp_Tz+$Yyh z-N;M85MwDwFF`KO^=XA;j6WTKbd@~So$E@P?SPc|3f2@LTxEw)W^sMMxn%6`C4LX$U3fYhD@&d--g1xG{Qp*`x zmpyT58dR7N6JJH!gNF{2v_ty+uya8VB^%D54!JV}*Xv0gRJ;0;bL;%4ZafGdX2)^aRE-{`$SQFc zzW0-CV);MM(Gj8_fdE!`i`iv&zzp|O6AT2zDmaNx6JfrnfG{FypwuKb>ME*-TU&j+ zQz6%ys+QEk!qnooS^FF*h%a%PFRa!L06W~k6J!p~j>Zi0Cq_7d?`RJuFuIsfjGzTAJ1yLIZ{ukvMHch-X zNMJHEi_+tznmr9O@QEP0k)e3j=&6w{Of`M{>#?J>t~ZK!c1{d4)9Mzs{4U33upFKc ztCK|_4c;&(r{%k(DB^VXYn-LlQy?Q2LKSD@ep%VWvoBt}(WoclF+_eg5aXVaI|O}+ zdh8!ePU!^D+VSKRTq%h>ftwD<3YP9!QdG%U*=&*xZM<9#7l(8hjVcz~M0k~JoRfW* zmV84?daBRLY7d=b@W-y@LP9Sy?=Ol;JW6Qq(sWX{wx0wPLdD9k5ry{Z)ztKFsAzM% z6)ejlRA2U|7P-!x#C7T!3qFf@JeqadMNB+|hP1;Oh}xptByqsV}~( zjqS-Dcu$W0noulSm}YykadOe;-wx4C*cP)9VK8!W53Vp@MzjU&A{WZRoG? zs#=WYPYFdVOD7YLpy10a7}(7+0?K$g=g4CA8iR|gHSi-ns}vkp%G)(`IZseOn>qpI zH!>GeHTlZbYkI>|3ExA-9Z6M%ONyQk?@JO0qfd?`Q`2fk#>)fq=i#^b*OtZpEg_P1 z#Bj;v)k`sASv?# zm_Lh);{0ZSk4ysq_jK>~LU**(5Ji!9vgnFT+h3ITeMv8LZ6JVb>!{jHTSRibz z2J;~qZoi>9`ZCrxaz(c!bP`)ZZ$Sld*mNi0aS z%WJN3?YhMIjArSL+nv@%+!JTVu7zc4(&#FNson_}i_6+&-CnCZuPAnyYC7(F>)Wrs zu%_zrD?R1hbvDy7KsG7lE4ah$18a+ug6+!C5L{H>MT_=-dh^T6U66Lsah?P3;zd*J zo%XFhT3|G9GQaY10`vfqC7bgi&nIOh!t)L+bik$o!(^sTtMpsvLZoo4BP~uiPO2+R zEW{}os5pQcgJjT+)Ww5|K&wFC)rD`2P7%K0 zql!I$YUSg7zW`l<)2KVfgOg z|LK3!!6><4v-dF)=Y6Dujz^uJ;`8I}ZHfzrzjitifMXQ-deH}d(&l|+b+7Ydk{8Em z+!5jb6s8ir&eP59t>+X#3w}K9eE6Wi5S|@Cz9Z7?t~wB?qBXE&>P_SUs=+1DV}1mN zIk)pul4W`Hx4g*E>;I0l)C|7e*^=psRo_bl@y6AMzSHerPH|OF&l!a%pzxL)DXjxB z$r#_4xQXws@I~G(Ygw~N?Y`>hf;itS=v6@}3YcpU^{j=^~C&*SM2X$E}&!7_SDM=>R& zJ%ggBZ)QDzXac;`M}kKgaiVf#1Oj>G&Vaw-lJ4f_9Squ$&L(*mn7sfK3CAE3t#x`U z@5zdiYh0A|CT?yTc#MU2SP%zm->xNDoAC8q31*dZ=gytl$_>(*Ch(o$6u$EjCour8 zsUx)(gG@17OKb8?$Y(Yqxvef!Mp!NZJfola2h1eA6-hDf^GKk@k5MpQeHq>+B7Dk- z0|mj{pHtiPmlTfm*)mJcJ+T}hRZ>_}8zjs-e41rcE%Xeo*RyF~8xDZ-Q+^(aa6TL_ zUeP3;&y%>Q2i`E?CSxAIErfI;A(=o_K`H^Q(NXoh zNGsYgjq(haMY4%5?c{^fgi(jZ-Ltq%ftVmXQw(JUjgBa4oh(ivAy76egvetLX^)g0 z)DZ&?O2$tsU-&t9903*Hc%Zmn@@2M3nvv(1TC*cnX1SJ*OFT|LLc~GdB{2m;$%*}_ zzYGnb5TlNhGCiKfcxI$H^rv`C`}9y9c^JBz7igTI9dQwrOHduts00;}#T1wc7bhCF6lBHBd>UY$8IT^F(MP z3Zw%nY$IP(``ED!O$UNbj5yBO#-jI!2tf=wm58y*X{hQWRf=$HdJO!-V+}}MK-NIX z@(ocAWj!2`r-ZQS$<-iU)zp8bq~QlLG|6pXLehleQYjW5OA%I^n-jh#D2`v?mwotR zNL|1B#QIsv@gLoTD*-L6cj@FSOMx%w=!<^sy7$#N)Yi#j8qdmS%e`@Pv>VwM&y8P7 zZ_vte>r8f}X+zW-WJeOfXR9C;Q|CEBYO%OhNS zCTHTwCknWX1*GAVq8R&BF%aRq>~544JP-DI31 zahv&%XEH%0&E4?p<(8tL-Q*Pwtp?XHpVoj8(fS9M#v?KbaKjINfndmj+a0YqYCU%G zKayLs@9%3GhJ!hxp{_O`bOl^)M&&uKdeO4LLrqvyO%^4cDz|w~*mf}TVC!FxsAy-T z7FALkm1sUdY3@}vY>pYlhUoz}-prqYN>9wy`f3h0ceWPuF)UzTG0@HmK6Ki4Hy_rj z+_0Em1BzT7s+HnewZ(3Z+}K&GuF1CIV?}^N;hN%rk$b+Ma(bE@&HA_Xf~}gJzM}P= zN%7+7(c*YO+e7s7g5k3PaxVofa+&nscYs)(J_5&^Aw1~^)dlUU1`s7;S+hzwT|sUC zGJZ;j1kvGPDpsx5KDx89S0>dosbZ4RD4hFHz2_5Y))_?jx%ACVF*9DpGbmoTJnb0~ zn>lO>L-D@(O`*Lhe5$eYUnbdv-;qFRiEl$>B-2uMsud>{_+t5A#G!>WEZGD?(`O!+ zCGA<+l~Ep&OD;mDi_&@%FCG6SBD+)^mC??u`3eOfM3S+Odeqs3(A2bz3ija(O%zi2 zh@ee;JnA7O%d|0}_oKAukWYE0(%nj^fPSKj(FiI{7MWGpnoyo^Q`M-k!JQ-we4s!w z(aTYh&MPPjb0UiI18EGr&pqkV3@AFGO2(g?JzYb`y$_hmJ_GRj>wWP?%Nqb7`8Et*)6oJX`LVJN}} zV}@y}!ZsTgjv!IAa#q>l#eJLFPg<4w+T%~v+Gl1suh536ng$t`*M2EhGB4DQ3-KzW^2nGUX#=L^mlz`Z*hWb($zdj4sJFH z!k~VVz}oIL@v97CzverG46C=AOpu;d#Z-`vI9SAg&tCrWVy%7&-TToxh6r7uXCHfa-`xn~84%vrN6$|+ z^S|@Fdpda3K=msOlK(C5)s$w#94*VZ>Qb+I`~YyMA=i8hbApH6TFj#LJ3@2e>it+X zQ?I}!b)|fLXCz@fb9I(&-dDf=|Ms4>xozag&rVhT1J1rJkQJIM+41J$jk3j+wHxL1 za7l7}IhD=@kr0W90vG_4M5%PY{ieI;Jp&M;NLkLwwM&un=y~;Y&-C=;E3@A!bmkMF zb6-?fwQK`5#RVCOv3);2-H;g?GkN^VoY;k!V-twWXO<20vt$?;)Crc{iQkZ1w+)p* zRM;4e7YHzoSn88t?e(k)QPM#~>(cf#xsr);)!eC)##WErpsz+dZC}86PW!DM)jSzV z8e!s{g?1M6(Ue*IbGg7kLj=9q3l5}Ck$4=2f#TDAH~_<$5!%2c1!^B%#)h^zY6nLk zcoKTvC7H=Ez-TuU1*hXEJ=cwHJbFrkg;vds+|?#GTgkit(~y8e<8O%jmnh#h!#96o;dWCg0n`#vv~rvxk9vNg0yDBwABmL zmLgPJwqR`m;o1rWY}G=xr3l)-hOn)cW3F20R;e}R^yr~lg!MwWdkW%~c^g=|KyFc? z+|mSd4-(Eb(otRPUa}lP-SUKWO^5nqPWFon?iLc>J*EI}2|~QZ1bL4t%xkUyzM{KT zQz75O1$_$&`yN%`cR!)u;)1`&6#m^y0Jw_V`VuV^n+gV>$Z?=<8>~=B_%MdNd|~10 z1cpr+_BSLrd}>FG#}Xhu8BW+#u=qH_#f1cns}nN*D+n4_DQtWsfnz;Z*IwQ01(2vM zyyg{4R+~BaL}V~`9H4&-Svq*ukwJ6?PX+}NN`hwU#uNOBcgOf)8I@7$w}s=`_eP6Iz5 z`0M2HnRjkgYfWo^#=$r3Je}y+=+p=Hb?)d*gunKLy9i8Tw*M(#f=x)*Ho--0|{hT%u>j3}9TM z*&}og<6&H|!=VTX!iEv2{aH5%cClWP4wB1cFeR^gWc64~*um>8>633Ra+$^MYZ(|y zayx){@Kf7ypK5y9G`0iVBWR{g{&HTcU^dEIYS03!tErAR!mBiyZIH1hy{)#p93aCS z47ggxU=1Mx8PJLA9Yp2pkEaDYI#XBOj@1UP6i!c7*A1fs)-=z9uWa1!jO@$dMcpa24E}idDw|)d>-gjj*#*X8OJyqzN9N{-x>+}@F)w^5pI7O zVEV?0&lw=@fT7$4#61IFdAus4#sS(H!8M};At?a$8Dr3$d|8yyKq)mW@kR`!vfK^<#se@R0+){|Df4 zYg{HJ`v%xh=m<~zNUsczxzIOb8Kr%!aDE}|@nEETyIm7?1k-x}>cEJ7;cnix#N>2> zHPQ^g^}~n)jM!tWZgM`Ekd-=jjATS9h{n=$XC%U13%|QKdY(zYmW!EewL~mIDuuB- z*?>g+W}Z6ZsXW9WPrc!(H+ME%c78BtjCJlqlDAlUc-&~a6^hcS@#X`>YUJC*t_K4f z`vk=_pQ7XSrm@y}wT0&%-zn84*TDgTAY)@(X?0>Qgzsj?>~pxfPIwpvk&Y&VX_-eN zkr42L^@MyP#4;c*>ryQANh+8Gm1M(hz{q(C6_HlL7h7G#NhcOymKU*9v<+EYC1roa z(gesd6BON|;j)_#*oyuz&-0>B%dOxWOI1W-4HwG{!Wl)>TdRIu#1uBxqtme-{8Mwr zBfJyZTLITf zWG;9MxCnKvO)+C}aDUR`QP zDKfN-&axyDd1Ix@Mf^lF!ts;OjqK!!qaJxVWL%4V&hYc5!$?uNH@%>UV*EeL0Yv?B ziq}aWS5p1!1m@BOf7v~yg!wa(;wVK$mUNSkuV!jPod81zVPCQxQLTt*-9<*{DbFEgpg3zf! zGDH$--l;K=T&o|YAi+uFAv+UZ!c&iS%T|rzn;u)FSvC!>Kp~zL@FPW|EA!G(;;mi8 zcdwp*GoCE*T094p#QpGTqmp|OmXa56QRBG-SKPd*4!?QJi??~thim@#c#&tn<2;6o zHlnE?(;D5dABbsm1s8pE@X&LGo_CF|xe8C*d+@})1Wz9C20Xd<^>?z;yYDv`w8`J? z0-4m;7k_JUTQG8kxChC&EpB8M^5zs@vy?O{vwS8f1$R{&V5l%{!}7r{O@wNM@3q3u z=y~-aW{i8ASbl9F=FLv0A?nm~E4qz;JG`Il(+I|u##cwOYd{HIJwv5_2UpV;lwdga z-FHQ(#nOZTZ-_$Q6{;o&u3|yZ%MJ%okZ_RPEOP;nk`&{%C<%Y%GgjX`9N0Z$<6 zPC5|U6LG4$A5^`-!F9Vq;k(8eXKtC&MFM8{MR`g%miyj-B73!C!qacMBv*eTejr-N~fcBA&o;&LAIz6KQ&Be1C$ zO^8qn0)nP41ZYwLU!KX@H%!)6tVwt(Vl47`EvBchF}xM(^UCetg-MJq(Fw!&oSssz zviuxMG4w2zh5eZnK&+l5^Z3;{&{Hr!_?IHN(=kKPSzJMQZTllJEt<`dxvAy6aiRj2 zaqJ5y2%_1*DQ}OJ(IgNG1N6qZp+ijv$QWe79?(+G>4GKZSS_MSFaXmMwf!p~ozCfd z)fi{JbgLx?IZ0Kf_So$=b^#wzy?R==%J*Wo<<(Hqry^8*N_6yzi7`!Gfz{I2xgybL zV*3q95A18v6C$WCUAwQ^goh?K)u3>z&R3>bA?qQ5Dn+zQlmmZ7VqPWG zT?#R`WWa`eSW1nbsr$D^-8IQDbfd=p``Lj0n=$7v$|y&cQuNDUH_pjSf{}0V!ZFs| zr7%{Af_e1uBF#yH?LiS-0Op^nK&=A|ZdS$@aawBj-&hl+pPQq&f3CA0%+j3f5>-fw z{c}$&Fj=@u8ecP;PEa)^anmhQw92f9!>mDVV?&yKs)kN<)dUS>3DUts4*WHpu32@x zQN%>8?zLP2{5dm!!YfLZuXcNQ^&0$*25%_ZLm5dc1lQS|=Il^Y{wjuOtUdXFlXGZ$ zjN|!UZ*n|uuAEnL83e#uuK?t!!Mm&b^W~{Le0e~1-E8g+39TmR;Mx*B0HN~shgQ4o z){0RaVG;fi)TH*cQPY0du&s)!pv>x_+%%gMAW<)EK%kk6+p*bnyezp)`}gu>sM=5u~#``-LRZQQZf?0V;$xuWwhES4G|e`kKiB3>D?yJ(5KKM51i3( z&;}o}*v@=@!+pY`Iie>jsZ0Nbr60T?Bi${CgB%ms6N>;U0GiJJAdV-S*<{wLg=CO1 z>YsI_kv-!1ey5y310{#(s3VHUU9H}YcBPRcH{6QK{-~t`=6t%|sbKwt*ylhWDjD2P zeD}G_wdYL#cbdo1d7}f6ZL&RyW}tMZ%u{`QFa)*QI0R!SZ}uo2C;e59~5K4>csD8@xPPA|JjdY19S2*?6MR3;+Q zt;vn$5hiqOU0rQ7QHe7P{nSHrlHI}E(!oX^pGEyLLziR+HKUwBFIkv zfgFj?p8RRSlSiNqMQL-pjyl5etA!q9O|kYDFHGkG#Z5e1WcQ#yF#J5Jzoh zaC=Ixc?AWqs_l8Jg)3@IfxfJ?>PB`~$z(m1Dc1$jdgTN1=U}a^o>LGbLO=-2{kQtw z%bNy}U4GNBmeAX?y0z2=s{~7uAq@t_oxly+EDC@W#Zm-}3TZ60AP=-`LTHi_sMRR! zfpt!WUV5oV-9OGw)G>jm`x3$rtT0BwV?;M-7|6MT^@cXL95N0R0xPyymFr}}C;hL4 z+Yv`4#oz@m7ku0&w(#(9j_Qhu8{ACgnmkvlRnK(wf+lvl{L&Oy$ch@Kv`Rbl(V(U!?9D{ls~amQ|vR z8n&wS1_I}*!B&C8u2<_3LbujLfh0}i{JY`FdxQzc9wcWd^0p`Yr#hP<1CFI)`VT7 zi!eb4A#MN8X2)f} zp~R=X&%M7(u<9P9Ih0*rTMLY1oLDjqu?`r`KzhBMZYDV!R*Sm;5z4q4aWWmhA%vvh z-Txa5rKNB}ADYh-w8WW;hgt#2dZ)E9Qm-K7^lAzi#U=AT z@#sZ*0dFh@wyw+KooRtSyXu&J&>IT^mPE9nQkd^CJ2_K_8%H@^96zLhfhQ1IA|XpC z9}vKe^8YeA;MbU&PY2`{|{fr=fl2XEV9c94SvsU0^@4z**n#KHdmCO zVYQiAZC0TkUkTvlwfVXVZnS|uHSNI5nOT1(>d#yvVl!3gh~1CD_8V2%n=%99df9_!Hvia1XgpSy`Ww_zFOY|@L+oX$IT1Ty+K zp5g#7ESrBWbcu3N0bHQce?+UKEL8vQpc0wXNRC z52o`QV8@pEZD5>=oK?y$TCbdIlBa^iE%&lv4jv}Sl>M7sxS`1vaemp%_hBc&oKszQ zxC*2;SU3)7?BbrS9P1MR@fNU+leYH-9}W4H08*E#m2N3L8v)58#D$B|G5W$o`CkOF=>sYkWf}D2m)43sJ{j z=?FtHAzzdR;Rq8_*>(1uT`+&i@(X%U;}+G({}v?UHCU}Mx(1sS1D=b;4KVlt*t8oSEjck4HeC)P*e*JZV{k-~5X7$A^tR4a6Sk6lOyE-I+QhkW#v zPD_)M1*M z54n(Oz{;M@-sK*}j{WIU6V|+DR^W_)j$W zE{>AQ9%=x5J;a*cX{6QZkFum6>&$}8ae!_JEE_{KCg^rQkHG~B{$>}NE6^Tc<>cmY zp8jwxb!_5~DXk><^9IfyfK4DswI7OX{E z*n(4kfvLtM8n6(B3HS|VObmZaC#!GXNcz0hO0N)80m|Kf#w z-_>xK;ra^%@#5sfK7bsNX0Mk6D*mkVz)4gT@!*rgsWHIuaGJ*u*+)_gJ^>xv{slN$ zLUzP*GSt!nus#oMS}Pi<)l$9wX!P1zsS1iHsGiN7c{;_1)y(9*oEbbk__;IW)Np9k zx?O2LlhJzUZJK4wZ<)qtRjX(1&y0Cd#{9}f#JMOpSJBvGn9eP9=+vokUX@5JSSb5L zg{!0-F_<|x>u<=cAQHMjU=ar0PTXwg!sF*d zG|M)cfblB z0uU*4!5@suhJ*MlnvR7qn2+;_NEkhosdFg@cy@M>MFV`<-#vviUoQPVCa3(B#D?Dm4VF(EeaD>cwx6Y`uG>6K(IGxjvM7*VVVmNw zAr{!E!oAx#oYPpu4K?`{obx_C@?FC9#h>4rfhysC8omsO)XhOuXNQ(&w@x z$JtRms8-np`GCBQ8w)g1SMfnMWvAEEsDJJoE0>f`bAzYYXB$3@wnsz;M_*CB6TImJ zuh+eDvHMMmfQWOV{g8Y@PqX>NJl{Sp-+?QH(?6MsHiqXh_`om7Dfk&Xz?Z@2kD%~} zK?)#o9AR3OF#0Ge&fog39Ut+irsc>q`3NMsWarBx6n(Mvy{OIOSG;XL-(kf$u@%(->t`1i5nh*R6dju+p!;M1l^N=RmiC!`3nj&JK*TMb%!C7cI}+8&YR|+L5e~Pyyq| zqfiqbyR)E}PRP7DlM$i{p%2DLK2`!53JNs&HA4c?=9!m)R(WG$L9ZxzU014;sb*mX zL^feq=$2U-jR_Xo)Rd!cbXv4TwbueJBMj}}Prw zmy~f1&xR793hD)l5d~EQnSr%PR{hhsyo%$Lg5Z)=lDE&ODDTMckcwW5N6a|tkJz3- z8?h{igvSzP#lUZ)B^VCcy6N(W$O+la0B$ zQC{Rt?ZFmcZa_7+IYX1B`r6>yYBqO@q2bn#!4?--%Yz?Whmi0AV@U8V@(Mf%k^LxN z&W2W_BA^pAMe%&ZVN1tv2(_J+BXQ6uD0=p3+>fT{lK}+9@Cb=QShj7qC19|zWL+&v z$*B30>M@x@pWr^m-=--vWW1pamGG7l(0Cet|DOLQQ)x(f_kzMyK`Ukly1QFn4iC4! zFd`t%QmpFk7FL5F?3Xb7#-#AqgZ)ortxey)eA?SS3gN5-Wy$=GO7^x7KCV z&!K{ShextIidJk-jr0$S-6D=#LL@uJdJpytr zBahF;S|+q5*WLO0IU0z`T(91dj34*&=&bZ(*;aa%#N(tn`dD(X9!b!S|0kHcx2{Bs&t z?6~zcUxvVutDzS$`C4QGMb^CeACsXUIXQ`$7UzEKoI{#bk$#kZD&n5L+87zKs(dt= zjM*LID60bt|H9tu^|j5gGp9tas>EGqK^X(FLLN>TBTK$#91=OO4A;}`cJDfYc)O=q zpIs=?&mxr%Y7Fc*j|2*t;9Vk#3#$nEs*uGtdqzIQ`zt8+-Z(jj(0x%?bmj;>2?AHn z@$!Aks(=$n{xuqp`L}~9@6aWAK2mq~+rbcS8f(pYS005hy000O8002W&Ohhhhbz$v2Yj4{~lAm{g z`42rB3?fe?#gdauCcEB&Vk=H={ems;V9yg6v`AarNTimeY%4+bw_jEDgZ&~U*-mha zI|4J2`%zV0T~%FG>~6N(=jY#l$KcsXrBo6hrsT_QQNVDu4MTrSuI z#)1$NK!p@SGaTJK$3pC$1!0`BX_U;dIxhm`$XEiAG@Pc>h~4nv=4=`)#2_M|9R62~ zgM_6?B#BJeXp-g;n`P-;JdKNmghO+tfX-*g(Hy9m0}pnF!&7!OPew(YCOOOJqcIEM z-&t^*u$>^I?q6I#zirE{p{IQkayDT`q?x{o`q@H?rwIU<%|4T zFnTt^5qHMLRPwjoX2)rs$Cn`6aTviQTmi;0a{Vcr#;>#?wSiL~BNVHgi$Ar3K^B77 zFitAJL={P*D2zZ@L4ZI`@h?`~qH@Kv{5Qm|@XtYdq8l6*isdLMKo|hvb;`mh2SzNQ zE3Y>umUok zqU9{TVtG^)U=?#Pp|Egt*nSk;L;@7dL>A?&#R)Jc38sJm^d1Jx7GO(QdP_z= zSB#(082_7w1)|3#`!j1`IS#g~(6TQrr?yvHyQN6=)jqGSeNkKcvbOe@+S*sOwZGQZ zb~nxHI!%RzQurIWmm0R?yTZEjJwp%OpjG*foLf12fu4fQk&nUW{VRSv?=z0dy^^BzF9ZAnO z7oL&yJR|9OM$)5^RLCPcnxR7m4%(nx?bzPQ(b@57r7?SuKx(V%9$#lmaTIkW14Kd3 zF4(dQp4$a4?1Gne!7p~fE4$!VyTA}VS>{mNb;#{H^mZMByAH)&hvcq9bJrod>rmbE zP~CHR>`>ivsO~vb*9liCTV)8h1D?cyogKa(dc^BdH z9@wLnb^%OA@Nd&hIT)w_tZ~rYeEvejvcsd_(Nn>qEm73Zrl40z0iFwDSDAnk8%Aju zIAfp~Wuy5-Q#hKMljFVL<6^v%1`xNx>;PVL%>f)$L(~JDfj~Bduov1=C`2g}R(1hy zjyT+h#}Qr_?9G7f^iKwF&-UTx{?YI3-QZ+UiRy9a`2M>f&mkUdPC;tezqeTuPk{e_ zB!478(YwJv*uneLQ;4qGyMxpBd!X1q08*?zh);)X4DorAV&(^8Se%V0{DCSlWXuC}Dz#g7F;lLYbnI| zU!a>HS+@~qKdiDMZHAgY#-Nf4c~VB?K1XSmVT_ErOK@*7uX0;v6U&K4?~YG(xdNX% zX6OT1CzY@3g3WGWo(30<25;6D_KNJqwrj~$D0c3*Xf}$T55>Wrg~4MO6`J0gZWr^S zMUdIh4dB%7fVV55>%BFgrK2}pB-IYJ?|RIyL3hZF)y^+BDxK)18SE>!+|7Q|WJ z^ojch3sXKc&<{Xy1D0Pd<7DLM%|HsYWVdmSTK5EKAxjr(3JwKJ9d^n) zPa{xs_5>D&@idq{!PG3Rr2r>QV0je-nlW1C|RlOrWFH%lrlaIH<=VSvX zh#2wxcd(30M(5~b;A;<_E#g@)!8PC*{%J8xODl0^aatzn2m%G_fJq8OhQH6dADsFf z%%G_Ty$=!uxLSJsw#=JR{+BnwM|NZAqQuvrIvq;1QMb+>cHxaNG3Ua>6x>=6PjKO? zhR1VxYeD=SyVSuHX~DIC9#NkuqlD<~)$XE%gNw}bx0oHBXQB^^nI>y( zdhH?PO-mzai?ozGDj_*Ch0jSoctnuLH`|OFbgrY~%>p4cOQ0LN#PR0buM^BE2dWyp z1~|&oZEhexyH0C-xUR$YzlnL7`UnVlA!Rs^` z;GfM4DmA8yN|60HT_`P70NjC@2?{Rh;{i-78WlJ8s^#XqJL zJwE4+5tLo0*@C>e#ty2o%x>`p`8b$G1eZ4nF5A6s?_%V(EEcm!1JgBYIiXZ9iPoz* z0el#pPt2&h)9dccx+#R}yqXW%s8m#QzL?`q_+a@uI5%s@5v8%Ha#O1TLD!!1Mi}Q{ z_egyB$Po|27irKE*AGOoTQ*YLDPS>-bBOOQVO@lk^fp-V^cMGdZ-R{8h*l%stwLPg zWn|I9`-!(MTXj9{QTTg)vBXVJALt5&a;q<<5|7aV5RBy7i&+jX^hcLy$%N<&f!3_~ zqrr0Y(i+SX4Q*ZkYjUN2GGU^E^D=I~o@3~MHK;u3?vvrB1dYhzsNaa4@)zhABCJynBl^{*lgEkVTY;<9nZ?B%NQ6k)tZDX{4}mkBZpU z^#dqycXPu=%Y~sVQ+|~!5S*Q*xy-1lh2dC~H4Uikc9C(-r%hE5@^*VH1$rTDhSGWN zzy^<>LfvUlj5|RQB)z7>*SYI_YBBxKyA21x-O<$*+8F_2l;%wibc6lOwlN%3cc;Q87m=cp@OG%!UJR;rgtFb0cJKEKjrMlpW;SKQ>_lFdP|by zMQob3mE42RciVFLd@3cN^=Vrzw@=kPe~~^!Ns;AE;8SPExfrZ(f%OiW*y7_&Y@ZXM zw7M%=HQhAUgKt6;MrBKgLW5DRt{D1$#Lcib0Yu$p+zZk)jes09;Z2hU9{idMv~s;w z8VG=*x4oV1HfUzQ3bS^yZlf)R2MLa}NndCNRw~%$_~S7E{&P zHT;|#cnq{F{*{C{4%|{_lHsx4|HS4NMZ!`zSQnyTgEknn9A%K<(dhh4Ti_>Dc`9k| zHUqUOPO9Pi78{0S9TjJr+ii%tz!%+l$<6St?6L?s_i?aAK9n@E{ku;NT=;BPey&K9 zckAH_5>J=SK1JeUG_|U`(^W!Pw!mwz9yZ_SX-?S9)p2_fPqN{pTBUI9=V6>SGswgW z^I_r@I$WR_J#B%InG(5>B{?2->54gh_WhaE7;Hbfqt)pcvS24c_jwU0^dUFsh2Jwv zL*7?s0T04^T;pe)4trA3u3M!_o@`I2#WgrA8Ev6=ZNm%!i#5k=T}5OCV#}Eiq&|Qb zK1?7aGct!3{I^CnEnf0ZF#b%0`ka>$)cn*%yh+g!;SRiJ-uy*V>)S?OEU`(Mes{z zPpjnGvLN&P#;s$6rp2$UeeH{pyS!6b9PBRLAC5HkOPqVu_ji2?25N%cc0L&b5~$S4 zvTEiU7t`5vh9xN%-Z?wyZ)fRlC;jTCNN(hQacERP?{JW-d1Bj}_9aU`aRkl@`YHEb zw7%S=KDNg?c%Jnw;@7X_cf0dOp-mFnQcK{T9Al9%pGNMJqH|m)HnVTtLKXPFahZ8P zKyLo&HKsJZ0r2@zhTI=Gx=H1Num)&b@rOI3)ne8~y5ib?wTm>f5!@* zjpRv93J)U@(fuP|)!$gu`HR1!l2uwLe@-ho4#}?p zC1Xo}3H1a%Fm}3lpnwZM^ToVx$>LZdU7dq^4ROf0e){2wkvzlo=jIuO8qVs>8jyP5 zFKeR(R?a7Pf9dVmMiBWfFS~DETe{qC==L>x5^SkTYNzZ~TP;X8w&$LE9~J{Sq-NRX z@*c#KM5Vk#sK4VcT>TLAsyJk2Lhqfdp@;SL&(uTZgyAU^yL@lfkmpMa$2JZ>Gj&PH zBF1f@*1Q=8~$hgiDn`!tv+f(U}F-A{-TNhj# zLlt`SC_1?QIbEky^K0=VD(KuOw!BE{$?Ycs)Xrmi8o2d<_B!{s&3w#J+2>O|?h03z z$V&B#2gD%%?8P}Z`XWA(4*blS1uX@ChDFtsb@mCY5rbS$8pr74+A=M_v`7w_t! ztc7XHQvv_=1OH2Q?T?C!?LwOsbhnXr8lZ`2)Vxk*30n+DM;gJzcM11 zQm5(NboE33jN3=4#|(PW5%O}AoqV(ob@UmJ-Yp(J$%u9u6GGAGm5ozRebiO((&K)M zM?G%Fo{mbqjfL@@WiY4C(HN55?%>}B_NXzZ5`I(rPE_JrqnwjMDbi=tZ<)>AmU04kllr7I%F5w;1x-_M)8@FLF*YK>HeO>b82K2A<#V#BH)Fkc2aW8Sk(SkREy zR3Tsw)hrz=>JE%vfUgIo=e5p5BTEOcRPglsXFpFnloE;>1cr)IL@LRnkR>ZrlVtVjD9}NoB9;1k4<`P4`jRN6vYmS0yr@@(c54X!Zz2xGJ z^ybxjDikzBo~1czX2zE7nd}=bbdxu71qHJg$)<`CfHcqbAJL}JIpAKUxS44{{af)3 zGG?DQ?9XTNmaSv?MQ!On`(w{-3j_A-Dym*gP0yH;6j2TV3&Y|P_fcsA zLYvWF`YFFqJ@K-hlPZWHR(gd$=fQt`3oZRLNBh%PkMZc&zB+Prl*Kn_OAG0Q8)$ze z)kACiWf%S-sdxqhrHQ&^b`uUTd#ouUAbnPmDEs^5O*5Gi@9D{^v1IoX_Ph+z5r6-s z>Y|isib8a2XI@^d76$CENE+-qdw&Ha%&BtS=%df9HxHENKBHh+$EB}HlLw!($j;hZ zBPfK(AoR?(g4{@yQ`hzA4!b+EXYhi|+7wl!AJt>CHF@j(^MzeD+L1P*i*CG^^t>!& z&DT+M=UanbtpKkj{kmdPgky#vwDUl;S9D z^FCZGHpFp#2M8~Co6N_q+J(c+N3myMHye0?Zcav)Pid^V`E>KSpn{=1a(`<6w&@DP zQMrL5%GzDk#wG5+3mN9x^@og(1ZP9WZY=9Npw{!7`pe?EPkSF37?<9B8jC#f^l)qp zlKgzRKQf^7Dj=R;|Fc}audF+;iA5s**W_MvKgfegvbhe_5xcw3YHSakH}h1u(C2LQ zKN%G#9pJ1&#Ym3S8(v&1)o@NcbfRs0aP+hIR*S|3E#-pdc6HWP7e;3j{!V%(&Amv# zer!$nh0RjyEh2sLa}47wXM6;flks3<#evcoGn2r%ht`rgY zboBCMzKH49GfgxsoFwo)R)|e2#me~0Aul>a#*`s}mlKib$8T0a<{d6Rx#DhMvhY)= z(|YMzV5l^b+vqq|t2*SJ;V4C;*i9SJgBo06mD~wwS=yODpRq8CyqBF$FduJVQ%xkD?!2>-wB@&&TGjw1#7k-yZiz$G2_7#NY(>%hG&Nqac zzus>iW)i|ctyz#R9A!D_C}S%~*sIpsv%J%c4z$_f>2EW!tFJsk@F`Q7{aCV@`|xRH zBu!6Lz;Wk0cf>KGv&5Ev`VCFRO!lH3`kCEqf4R$R>;ftL-NV68Sy@Gf*t;;#28%-O zQ|Q50x^bXQtvt)VCn@&Stos{H((p6CHFf^SD#NwcPnlpA!+6P;Y{~Oyi%7HGk3CqH zf0VfOAg09*A}NJIt-9p)F@3NfeyL)eG=dGqd7((TKbav-f4!8sW~L(;yIhJv&@S7p zXRdt`)ABGY6&1uvC8PZB;b9S?uFAb5T#_l=hyqt%kaW{?b!7w_D9eay8v=G~qPAbqm$FJEB=DoA>ex0(ktJTF3X zr8xC0kMGd6c4Yzetp&T=7DIo=8x*#dp+B^%HopiN7_FP*!iHQXMCfeYZ2QZe3I@PX zdmGFA+of3stH!w9Vl6z2&{u}Wmi?Wzl{N0%_blC!NdOXk>bw!S+!t&`VX!$f1T9~*PY>(JOm!g*&cm2YJo6y zg;*VO=W%*%EtPZpvWvjC)LyWUr{oimjqBN|#VAls?2UVo)m9y`c}G*LU$w9%DlbI8 zO7YvfUk6vwa*8s~E6qS8UhH456f!XQt#&LK z*mPw4(dOaKcPF|8YRC=mwW$o!3t@+GI1f<8ACM^(&_K3z^il({nmwEUvQtAr#<=vs z$8nx5+A}!1RnQLtU$f%i*PX&if;74I{DrvPC)@|-qs#h>P+2S-_ngEYd~~fwLO`0p zsMosebf0D#n;OS;`14CcADb6O4hL_6-oGo?&C6UIZ%m+f@PYW3_AIFlRMGjj!FQYM z8(u$HNTo_##$h! z26kY!|KFg#UV$fYHy$ZDO-gpxr;NiRc|3|XI>AQmd)Y=C@z(mXH(k-ZXOO_|s`af@ zFYxY^0|jqQ28*;U+vDm9elV5%{Zo8=T@xou;YRfGC&-uOig5W4V8LSiITiXeIfAP@ zvl#^)h%XNMXZ;e*V_DAC8_DkQrwaD5VbyOg0}6n?p&gn zKHMR9Y{mPNGZkwWkTSPaSz=KG0W5Jr0IHj7m3}`Z#_W%TODU+DYBRqHl6=%p)K{j} zyn6Tmk=n5+nh+geS;dr4>Mj$zN|fU)DY(#2=oGu1{XNEkU`e-C=@GD7FyXx0Jv4YS zC`y&aFX<`A@$RFTabMYpcI*_MB(z$ZS>p_A0kO}YEBZnCxPS%>&4{f#NOxl~WY;8b zj1`?vj34b3zHQ$89{&mj0k_*tCI}u^$o>SY;#32LYI5qT%L5#_s}|?EOGv$Ih^p(r zM8OiN##>ZfOO?CFoL34%E-EcldQD7d-mT$@cJPq$Vo3f$wB`45ZNV&-`Ch6}h?Eqe z+6dcJeDR^>muAX{;^_e#z%eu6>j5iZb;Jo22YS6EOM!Zcr`J^4UxWb|E~e8ac7}73 znr2npi=Iy7eiS)k<(*1tM>eLc=PSj3L5lZ#gaQk}vWCer*&X)HS+8j$&CXz@)eq?c z^OYK!(ljfI@Fapn?1Ezh`Ou!^$tLQ{A0SasuzM4J5#|u5Jt+$!YkfUxJY3J>xc(YM zKy$=G`@PD4h|h&5YuqtKXuvnUvt{V-g%N`DCTewVsqx3s|f%HWDX&;KgB z8RVskw$krVS^2Dfz6VB+uNF3hcN0u*1^N|P>CAJ~pO-J$60mBVJ-xV^d_!K&*dJhn zR95a0sQ=)Xt|E?NVLtc00H{s!5Fb&W){vI~){V&PB;b-&lVq6HaDMMrOiIM8%*jXd z)ZYi%D$}F{Ygr{FI^2eB(;{K2F*(lH51d{+6CUTOuwMrjc*Mqi%bR~cbN4*p?4!;e z*A&{)-u^LxM6J$qJ+{}?=xZzh*CTGDEQ9PL7OkeSLl;!6`Q~3n{_mB%hF3L$!Pb& z0*o^Xd7+&rNE$uQ0~gXUlmG*-VmO{#(W$C4{LauoSfafU??*++`NZ`a$*<=Wkv}Tf zdP$JcgPwEa+r8aG_LMlcgtB!v>(>m!{YkXCZA()m?cvVEm!Sf8&*7x(>)3ptr~%mj5q7WwF1BwhY##vtrcT%Z zf_tgQKLzVwbKkl+czQaxx&Ai@+B3%Y;NFeE8vual|4sfE6nF2+*V4n*-p$+7*7Lt{ zc&|RDT;c!#B_x3VBKyJw0Jyn(-E;jf&^ErM>2L}FP;7mO;# oKUCEB`})5mEdQcd@6Ay2{};5pRl~#oX9VxQlHNP5L;lnIAE6Aq8vp