From ea1101ec5c4d2bc54366faaa93cbd08d82dbd548 Mon Sep 17 00:00:00 2001
From: "Wowzewow (Wezzy)" <42310821+alsoandanswer@users.noreply.github.com>
Date: Sun, 8 Oct 2023 05:36:13 +0800
Subject: [PATCH] Better Bodyscanners and Surgery Stuff (#17520)
* Better Bodyscanners and Surgery Stuff
* ope
* i can't believe that worked
* adv
* bodyscanner fixes
---
code/game/machinery/OpTable.dm | 76 ++-
code/game/machinery/Sleeper.dm | 2 +-
code/game/machinery/body_scanner.dm | 432 ++++++++++--------
code/game/machinery/computer/Operating.dm | 424 ++++-------------
code/game/machinery/computer/sentencing.dm | 4 +-
code/game/machinery/machinery.dm | 11 +-
code/game/machinery/requests_console.dm | 2 +-
code/game/objects/items/devices/scanners.dm | 209 +++++----
code/game/sound.dm | 6 +
.../detectivework/microscope/dnascanner.dm | 2 +-
.../detectivework/microscope/microscope.dm | 2 +-
code/modules/economy/ATM.dm | 25 +-
.../heavy_vehicle/equipment/medical.dm | 8 +-
code/modules/mob/living/carbon/carbon.dm | 2 +-
.../carbon/human/species/outsider/revenant.dm | 2 +-
.../carbon/human/species/outsider/undead.dm | 2 +-
.../living/carbon/human/species/species.dm | 8 +-
.../human/species/station/diona/diona.dm | 4 +-
.../carbon/human/species/station/golem.dm | 2 +-
.../carbon/human/species/station/ipc/ipc.dm | 2 +-
.../carbon/human/species/station/monkey.dm | 6 +-
.../human/species/station/skrell/skrell.dm | 8 +-
.../carbon/human/species/station/slime.dm | 2 +-
.../human/species/station/tajara/tajara.dm | 6 +-
.../station/tajara/tajaran_subspecies.dm | 6 +-
.../human/species/station/unathi/unathi.dm | 16 +-
.../human/species/station/vaurca/vaurca.dm | 6 +-
.../station/vaurca/vaurca_subspecies.dm | 8 +-
code/modules/organs/internal/_internal.dm | 4 +-
code/modules/organs/organ_stump.dm | 1 +
code/modules/paperwork/photocopier.dm | 2 +-
code/modules/paperwork/photography.dm | 2 +-
code/modules/research/rdconsole.dm | 2 +-
code/modules/research/weaponsanalyzer.dm | 2 +-
.../machinery/artifact_analyser.dm | 2 +-
html/changelogs/wezzy_bodyscanner-better.yml | 46 ++
icons/mob/items/device/lefthand_device.dmi | Bin 6213 -> 6213 bytes
icons/mob/items/device/righthand_device.dmi | Bin 6273 -> 6273 bytes
icons/obj/device.dmi | Bin 34275 -> 34275 bytes
icons/obj/sleeper.dmi | Bin 55097 -> 45882 bytes
icons/obj/surgery.dmi | Bin 14070 -> 14327 bytes
maps/sccv_horizon/sccv_horizon-2_deck_2.dmm | 98 +++-
tgui/packages/tgui/interfaces/BodyScanner.tsx | 272 ++++++-----
tgui/packages/tgui/interfaces/Operating.tsx | 174 +++++++
tgui/packages/tgui/interfaces/Sleeper.tsx | 4 +-
45 files changed, 1015 insertions(+), 877 deletions(-)
create mode 100644 html/changelogs/wezzy_bodyscanner-better.yml
create mode 100644 tgui/packages/tgui/interfaces/Operating.tsx
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 9ebb8cd6a4d..35f70dd8d09 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -15,11 +15,29 @@
/obj/item/stock_parts/scanning_module = 1
)
- var/mob/living/carbon/human/victim = null
+ var/mob/living/carbon/human/occupant = null
var/suppressing = FALSE
var/obj/machinery/computer/operating/computer = null
+ var/list/allowed_species = list(
+ SPECIES_HUMAN,
+ SPECIES_HUMAN_OFFWORLD,
+ SPECIES_SKRELL,
+ SPECIES_SKRELL_AXIORI,
+ SPECIES_UNATHI,
+ SPECIES_TAJARA,
+ SPECIES_TAJARA_MSAI,
+ SPECIES_TAJARA_ZHAN,
+ SPECIES_VAURCA_WORKER,
+ SPECIES_VAURCA_WARRIOR,
+ SPECIES_VAURCA_BREEDER,
+ SPECIES_VAURCA_BULWARK,
+ SPECIES_DIONA,
+ SPECIES_DIONA_COEUS,
+ SPECIES_MONKEY
+ )
+
/obj/machinery/optable/Initialize()
. = ..()
LAZYADD(can_buckle, /mob/living)
@@ -55,18 +73,18 @@
qdel(src)
return
- if(!victim)
+ if(!occupant)
to_chat(user, SPAN_WARNING("There is nobody on \the [src]. It would be pointless to turn the suppressor on."))
return TRUE
if((user.a_intent != I_HELP) && buckled)
user_unbuckle(user)
return
- if(user != victim && !use_check_and_message(user)) // Skip checks if you're doing it to yourself or turning it off, this is an anti-griefing mechanic more than anything.
+ if(user != occupant && !use_check_and_message(user)) // Skip checks if you're doing it to yourself or turning it off, this is an anti-griefing mechanic more than anything.
user.visible_message(SPAN_WARNING("\The [user] begins switching [suppressing ? "off" : "on"] \the [src]'s neural suppressor."))
if(!do_after(user, 3 SECONDS, src, DO_UNIQUE))
return
- if(!victim)
+ if(!occupant)
to_chat(user, SPAN_WARNING("There is nobody on \the [src]. It would be pointless to turn the suppressor on."))
suppressing = !suppressing
@@ -84,32 +102,32 @@
user.drop_from_inventory(O,get_turf(src))
..()
-/obj/machinery/optable/proc/check_victim()
- if(!victim || !victim.lying || victim.loc != loc)
+/obj/machinery/optable/proc/check_occupant()
+ if(!occupant || !occupant.lying || occupant.loc != loc)
suppressing = FALSE
- victim = null
+ occupant = null
var/mob/living/carbon/human/H = locate() in loc
if(istype(H))
if(H.lying)
icon_state = H.pulse() ? "[modify_state]-active" : "[modify_state]-idle"
- victim = H
- if(victim && !victim.isSynthetic())
- if(suppressing && victim.sleeping < 7)
- victim.Sleeping(7 - victim.sleeping)
- victim.willfully_sleeping = FALSE
- if(victim.eye_blurry < 7)
- victim.eye_blurry = (7 - victim.eye_blurry)
- icon_state = victim.pulse() ? "[modify_state]-active" : "[modify_state]-idle"
- if(victim.stat == DEAD || victim.is_asystole() || victim.status_flags & FAKEDEATH)
+ occupant = H
+ if(occupant && !occupant.isSynthetic())
+ if(suppressing && occupant.sleeping < 7)
+ occupant.Sleeping(7 - occupant.sleeping)
+ occupant.willfully_sleeping = FALSE
+ if(occupant.eye_blurry < 7)
+ occupant.eye_blurry = (7 - occupant.eye_blurry)
+ icon_state = occupant.pulse() ? "[modify_state]-active" : "[modify_state]-idle"
+ if(occupant.stat == DEAD || occupant.is_asystole() || occupant.status_flags & FAKEDEATH)
icon_state = "[modify_state]-critical"
return TRUE
icon_state = "[modify_state]-idle"
return FALSE
/obj/machinery/optable/process()
- check_victim()
+ check_occupant()
-/obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user)
+/obj/machinery/optable/proc/take_occupant(mob/living/carbon/C, mob/living/carbon/user)
if(C == user)
user.visible_message("\The [user] climbs on \the [src].", "You climb on \the [src].")
else
@@ -122,7 +140,7 @@
add_fingerprint(user)
if(ishuman(C))
var/mob/living/carbon/human/H = C
- victim = H
+ occupant = H
icon_state = H.pulse() ? "[modify_state]-active" : "[modify_state]-idle"
if(H.stat == DEAD || H.is_asystole() || H.status_flags & FAKEDEATH)
icon_state = "[modify_state]-critical"
@@ -147,7 +165,7 @@
if(bucklestatus == 2)
var/obj/structure/LB = L.buckled_to
LB.user_unbuckle(user)
- take_victim(target,user)
+ take_occupant(target,user)
else
return ..()
@@ -159,12 +177,12 @@
if(usr.stat || !ishuman(usr) || usr.restrained() )
return
- take_victim(usr,usr)
+ take_occupant(usr,usr)
/obj/machinery/optable/attackby(obj/item/W, mob/living/carbon/user)
if(istype(W, /obj/item/grab))
var/obj/item/grab/G = W
- if(victim)
+ if(occupant)
to_chat(usr, SPAN_NOTICE(SPAN_BOLD("\The [src] is already occupied!")))
return TRUE
@@ -178,7 +196,7 @@
else
user.visible_message(SPAN_NOTICE("\The [user] starts putting \the [L] onto \the [src]."), SPAN_NOTICE("You start putting \the [L] onto \the [src]."), range = 3)
if(do_mob(user, L, 10, needhand = FALSE))
- take_victim(G.affecting,usr)
+ take_occupant(G.affecting,usr)
qdel(W)
return TRUE
if(default_deconstruction_screwdriver(user, W))
@@ -189,11 +207,19 @@
return TRUE
/obj/machinery/optable/proc/check_table(mob/living/carbon/patient)
- check_victim()
- if(victim?.lying && get_turf(victim) == get_turf(src))
+ check_occupant()
+ if(occupant?.lying && get_turf(occupant) == get_turf(src))
to_chat(usr, SPAN_WARNING("\The [src] is already occupied!"))
return FALSE
if(patient.buckled_to)
to_chat(usr, SPAN_NOTICE("Unbuckle \the [patient] first!"))
return FALSE
return TRUE
+
+/obj/machinery/optable/proc/check_species()
+ if (!occupant || !ishuman(occupant))
+ return TRUE
+ var/mob/living/carbon/human/O = occupant
+ if (!O)
+ return TRUE
+ return !(O.get_species() in allowed_species)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index eec4ebc251d..b8e42dc784c 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -115,7 +115,7 @@
/obj/machinery/sleeper/ui_interact(mob/user, var/datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "Sleeper", "Sleeper", 1200, 800)
+ ui = new(user, src, "Sleeper", "Sleeper", 450, 500)
ui.open()
/obj/machinery/sleeper/ui_data(mob/user)
diff --git a/code/game/machinery/body_scanner.dm b/code/game/machinery/body_scanner.dm
index d1f1860a84f..58721e579e1 100644
--- a/code/game/machinery/body_scanner.dm
+++ b/code/game/machinery/body_scanner.dm
@@ -4,7 +4,7 @@
desc_info = "The advanced scanner detects and reports internal injuries such as bone fractures, internal bleeding, and organ damage. \
This is useful if you are about to perform surgery.
\
\
- Click your target with Grab intent, then click on the scanner to place them in it. Click the red terminal to operate. \
+ Click your target with Grab intent, then click on the scanner to place them in it. Click the connected terminal to operate. \
Right-click the scanner and click 'Eject Occupant' to remove them. You can enter the scanner yourself in a similar way, using the 'Enter Body Scanner' \
verb."
icon = 'icons/obj/sleeper.dmi'
@@ -45,6 +45,11 @@
/obj/machinery/bodyscanner/Initialize()
. = ..()
+ for(var/obj/machinery/body_scanconsole/C in orange(1,src))
+ connected = C
+ break
+ if(connected)
+ connected.connected = src
update_icon()
/obj/machinery/bodyscanner/Destroy()
@@ -104,9 +109,6 @@
if (occupant)
to_chat(usr, SPAN_WARNING("The scanner is already occupied!"))
return
- if (usr.abiotic())
- to_chat(usr, SPAN_WARNING("The subject cannot have abiotic items on."))
- return
usr.pulling = null
usr.client.perspective = EYE_PERSPECTIVE
usr.client.eye = src
@@ -121,8 +123,8 @@
if(!occupant || locked)
return
- playsound(loc, 'sound/machines/compbeep2.ogg', 50)
- playsound(loc, 'sound/machines/windowdoor.ogg', 50)
+ playsound(loc, 'sound/machines/compbeep2.ogg', 25)
+ playsound(loc, 'sound/machines/cryopod/cryopod_exit.ogg', 25)
last_occupant_name = occupant.name
if (occupant.client)
@@ -140,9 +142,6 @@
if (occupant)
to_chat(user, SPAN_WARNING("The scanner is already occupied!"))
return TRUE
- if (G.affecting.abiotic())
- to_chat(user, SPAN_WARNING("Subject cannot have abiotic items on."))
- return TRUE
var/mob/living/M = G.affecting
var/bucklestatus = M.bucklecheck(user)
@@ -174,9 +173,6 @@
if (occupant)
to_chat(user, SPAN_NOTICE("The scanner is already occupied!"))
return
- if (M.abiotic())
- to_chat(user, SPAN_NOTICE("Subject cannot have abiotic items on."))
- return
var/mob/living/L = O
var/bucklestatus = L.bucklecheck(user)
@@ -199,7 +195,8 @@
occupant = M
update_use_power(POWER_USE_ACTIVE)
update_icon()
- playsound(loc, 'sound/machines/medbayscanner1.ogg', 50)
+ playsound(loc, 'sound/machines/cryopod/cryopod_enter.ogg', 25)
+ playsound(loc, 'sound/machines/medbayscanner1.ogg', 25)
add_fingerprint(user)
//G = null
return
@@ -260,11 +257,16 @@
/obj/item/stock_parts/console_screen
)
var/global/image/console_overlay
+ var/list/connected_displays = list()
+ var/list/data = list()
+ var/scan_data
/obj/machinery/body_scanconsole/Destroy()
if (connected)
connected.connected = null
connected = null
+ for(var/D in connected_displays)
+ remove_display(D)
return ..()
/obj/machinery/body_scanconsole/power_change()
@@ -281,26 +283,6 @@
add_overlay(console_overlay)
set_light(1.4, 1, COLOR_PURPLE)
-/obj/machinery/body_scanconsole/proc/get_collapsed_lung_desc()
- if (!connected || !connected.occupant)
- return
- if (connected.occupant.name != connected.last_occupant_name || !collapse_desc)
- var/ldesc = pick("shows symptoms of collapse", "dollapsed", "pneumothorax detected")
- collapse_desc = ldesc
- connected.last_occupant_name = connected.occupant.name
-
- return collapse_desc
-
-/obj/machinery/body_scanconsole/proc/get_broken_lung_desc()
- if (!connected || !connected.occupant)
- return
- if (connected.occupant.name != connected.last_occupant_name || !broken_desc)
- var/ldesc = pick("shows symptoms of rupture", "ruptured", "extensive damage detected")
- broken_desc = ldesc
- connected.last_occupant_name = connected.occupant.name
-
- return broken_desc
-
/obj/machinery/body_scanconsole/Initialize()
. = ..()
for(var/obj/machinery/bodyscanner/C in orange(1,src))
@@ -328,22 +310,36 @@
switch(action)
// shouldn't be reachable if occupant is invalid
if("print")
- var/obj/item/paper/medscan/R = new(loc)
+ var/obj/item/paper/medscan/R = new /obj/item/paper/medscan
R.color = "#eeffe8"
R.set_content_unsafe("Scan ([connected.occupant])", format_occupant_data(connected.get_occupant_data()))
- print(R, message = "\The [src] beeps, printing \the [R] after a moment.")
+ print(R, message = "\The [src] beeps, printing \the [R] after a moment.", user = usr)
if("eject")
if(connected)
connected.eject()
+/obj/machinery/body_scanconsole/proc/FindDisplays()
+ for(var/obj/machinery/computer/operating/D in SSmachinery.machinery)
+ if (AreConnectedZLevels(D.z, z))
+ connected_displays += D
+ destroyed_event.register(D, src, PROC_REF(remove_display))
+ return !!length(connected_displays)
+
/obj/machinery/body_scanconsole/ui_interact(mob/user, var/datum/tgui/ui)
+ if(!connected)
+ to_chat(usr, SPAN_WARNING("[icon2html(src, usr)]Error: No body scanner detected."))
+ return
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "BodyScanner", "Zeng-Hu Pharmaceuticals Body Scanner", 1200, 800)
+ ui = new(user, src, "BodyScanner", "Zeng-Hu Pharmaceuticals Body Scanner", 450, 500)
ui.open()
+/obj/machinery/body_scanconsole/proc/remove_display(obj/machinery/computer/operating/display)
+ connected_displays -= display
+ destroyed_event.unregister(display, src, PROC_REF(remove_display))
+
/obj/machinery/body_scanconsole/ui_data(mob/user)
var/list/data = list(
"noscan" = null,
@@ -351,6 +347,7 @@
"occupied" = null,
"invalid" = null,
"ipc" = null,
+ "stationtime" = null,
"stat" = null,
"name" = null,
"species" = null,
@@ -360,6 +357,7 @@
"blood_pressure_level" = null,
"blood_volume" = null,
"blood_o2" = null,
+ "blood_type" = null,
"rads" = null,
"cloneLoss" = null,
"oxyLoss" = null,
@@ -419,6 +417,8 @@
if(occupant.status_flags & FAKEDEATH)
displayed_stat = DEAD
blood_oxygenation = min(blood_oxygenation, BLOOD_VOLUME_SURVIVE)
+
+ data["stationtime"] = worldtime2text()
data["stat"] = displayed_stat
data["name"] = occupant.name
data["species"] = occupant.get_species()
@@ -428,6 +428,7 @@
data["blood_pressure_level"] = occupant.get_blood_pressure_alert()
data["blood_volume"] = occupant.get_blood_volume()
data["blood_o2"] = blood_oxygenation
+ data["blood_type"] = occupant.dna.b_type
data["rads"] = occupant.total_radiation
data["cloneLoss"] = get_severity(occupant.getCloneLoss(), TRUE)
@@ -451,8 +452,10 @@
data["organs"] = get_internal_wound_data(occupant)
data["has_internal_injuries"] = has_internal_injuries
data["has_external_injuries"] = has_external_injuries
- var/list/missing = get_missing_organs(occupant)
- data["missing_organs"] = missing
+ var/list/missing_limbs = get_missing_limbs(occupant)
+ data["missing_limbs"] = missing_limbs
+ var/list/missing_organs = get_missing_organs(occupant)
+ data["missing_organs"] = missing_organs
return data
/obj/machinery/body_scanconsole/proc/get_internal_damage(var/obj/item/organ/internal/I)
@@ -485,6 +488,17 @@
missingOrgans += organ_name
return capitalize(english_list(missingOrgans))
+/obj/machinery/body_scanconsole/proc/get_missing_limbs(var/mob/living/carbon/human/H)
+ var/list/missingLimbs = list()
+ var/list/species_limbs = H.species.has_limbs
+ for(var/limb_tag in species_limbs)
+ var/obj/item/organ/external/E = H.get_organ(limb_tag)
+ if(!locate(E) in H.organs)
+ var/list/organ_data = species_limbs[limb_tag]
+ var/organ_descriptor = organ_data["descriptor"]
+ missingLimbs += organ_descriptor
+ return capitalize(english_list(missingLimbs))
+
/obj/machinery/body_scanconsole/proc/get_external_wound_data(var/mob/living/carbon/human/H)
// Limbs.
var/organs = list()
@@ -499,7 +513,7 @@
var/list/wounds = list()
if (O.status & ORGAN_ROBOT)
- wounds += "appears to be composed of inorganic material"
+ wounds += "inorganic"
if (O.status & ORGAN_ARTERY_CUT)
wounds += "severed [O.artery_name]"
if (O.tendon_status() & TENDON_CUT)
@@ -513,34 +527,37 @@
if (O.status & ORGAN_BROKEN)
wounds += "[O.broken_description]"
if (O.open)
- wounds += "has an open wound"
+ wounds += "open"
+
+ var/list/infection = list()
if (O.germ_level)
var/level = get_infection_level(O.germ_level)
if (level && level != "")
- wounds += "shows symptoms of \a [level] infection"
+ infection += "[level]"
if (O.rejecting)
- wounds += "shows symptoms indicating limb rejection"
+ infection += "rejection"
if (O.implants.len)
var/unk = 0
var/list/organic = list()
for (var/atom/movable/I in O.implants)
if(is_type_in_list(I, known_implants))
- wounds += "\a [I.name] is installed"
+ wounds += "[I.name] installed"
else if(istype(I, /obj/effect/spider))
organic += I
else
unk += 1
if (unk)
- wounds += "has unknown objects present"
+ wounds += "unknown objects present"
var/friends = length(organic)
if(friends)
- wounds += friends > 1 ? "multiple abnormal organic bodies present" : "abnormal organic body present"
+ wounds += friends > 1 ? "multiple abnormal organic bodies" : "abnormal organic body"
if(length(wounds) || brute_damage != "None" || burn_damage != "None")
has_external_injuries = TRUE
data["wounds"] = capitalize(english_list(wounds, "None"))
+ data["infection"] = capitalize(english_list(infection, "None"))
organs += list(data)
return organs
@@ -558,63 +575,70 @@
if(H.status_flags & FAKEDEATH)
internal_damage = "Severe" // fake some brain damage
if(!(O.status & ORGAN_DEAD)) // to prevent this wound from appearing twice
- wounds += "Necrotic and decaying."
+ wounds += "necrotic; dead"
if(H.has_brain_worms())
- wounds += "Has an abnormal growth."
+ wounds += "abnormal growth"
data["damage"] = internal_damage
+ if(O.is_broken())
+ wounds += "broken"
+ else if(O.is_bruised())
+ wounds += "bruised"
if(istype(O, /obj/item/organ/internal/lungs))
var/obj/item/organ/internal/lungs/L = O
- if(L.is_broken())
- wounds += get_broken_lung_desc()
- else if(L.is_bruised())
- wounds += get_collapsed_lung_desc()
if(L.rescued)
- wounds += "has a small puncture wound"
+ wounds += "punctured"
if(O.status & ORGAN_DEAD)
- wounds += "necrotic and decaying"
+ if(O.can_recover())
+ wounds += "necrotic; debridable"
+ else
+ wounds += "necrotic; dead"
if(istype(O, H.species.vision_organ))
if(H.sdisabilities & BLIND)
- wounds += "appears to have cataracts"
+ wounds += "has cataracts"
else if(H.disabilities & NEARSIGHTED)
- wounds += "appears to have misaligned retinas"
+ wounds += "has misaligned retinas"
+ var/list/infection = list()
if(O.germ_level)
var/level = get_infection_level(O.germ_level)
if (level && level != "")
- wounds += "shows symptoms of \a [level] infection"
+ infection += "[level]"
if(O.rejecting)
- wounds += "shows symptoms of organ rejection"
+ infection += "rejection"
if(O.get_scarring_level() > 0.01)
wounds += "[O.get_scarring_results()]"
- if(length(wounds) || internal_damage != "None")
+ if(length(wounds) || internal_damage != "None" || length(infection))
has_internal_injuries = TRUE
- data["wounds"] = english_list(wounds, "None")
+ if(!length(infection))
+ infection += "healthy"
+ data["wounds"] = capitalize(english_list(wounds, "None"))
+ data["infection"] = capitalize(english_list(infection, "None"))
organs += list(data)
return organs
/obj/machinery/body_scanconsole/proc/get_infection_level(var/level)
switch (level)
if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200)
- return "mild"
+ return "Sepsis"
if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300)
- return "worsening mild"
+ return "Worsening Sepsis"
if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400)
- return "borderline acute"
+ return "Borderline Severe Sepsis"
if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200)
- return "acute"
+ return "Severe Sepsis"
if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300)
- return "worsening acute"
+ return "Worsening Severe Sepsis"
if (INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400)
- return "borderline septic"
+ return "Borderline Septic Shock"
if (INFECTION_LEVEL_THREE to INFINITY)
- return "septic"
+ return "Septic Shock"
return ""
@@ -633,12 +657,55 @@
return
var/mob/living/carbon/human/H = occupant
+ var/displayed_stat = H.stat
+ var/blood_oxygenation = H.get_blood_oxygenation()
+ if(H.status_flags & FAKEDEATH)
+ displayed_stat = DEAD
+ blood_oxygenation = min(blood_oxygenation, BLOOD_VOLUME_SURVIVE)
+ switch(displayed_stat)
+ if(CONSCIOUS)
+ displayed_stat = "Conscious"
+ if(UNCONSCIOUS)
+ displayed_stat = "Unconscious"
+ if(DEAD)
+ displayed_stat = "DEAD"
+
+ var/pulse_result
+ if(H.should_have_organ(BP_HEART))
+ var/obj/item/organ/internal/heart/heart = H.internal_organs_by_name[BP_HEART]
+ if(!heart)
+ pulse_result = 0
+ else if(BP_IS_ROBOTIC(heart))
+ pulse_result = -2
+ else if(H.status_flags & FAKEDEATH)
+ pulse_result = 0
+ else
+ pulse_result = H.get_pulse(GETPULSE_TOOL)
+ else
+ pulse_result = -1
+
+ if(pulse_result == ">250")
+ pulse_result = -3
+
+ var/datum/reagents/R = H.bloodstr
+
+ connected.has_internal_injuries = FALSE
+ connected.has_external_injuries = FALSE
+ var/list/bodyparts = connected.get_external_wound_data(H)
+ var/list/organs = connected.get_internal_wound_data(H)
+
var/list/occupant_data = list(
"stationtime" = worldtime2text(),
+ "stat" = displayed_stat,
+ "name" = H.name,
+ "species" = H.get_species(),
+
"brain_activity" = H.get_brain_status(),
+ "pulse" = text2num(pulse_result),
"blood_volume" = H.get_blood_volume(),
"blood_oxygenation" = H.get_blood_oxygenation(),
"blood_pressure" = H.get_blood_pressure(),
+ "blood_type" = H.dna.b_type,
"bruteloss" = get_severity(H.getBruteLoss(), TRUE),
"fireloss" = get_severity(H.getFireLoss(), TRUE),
@@ -648,159 +715,122 @@
"rads" = H.total_radiation,
"paralysis" = H.paralysis,
- "bodytemp" = H.bodytemperature - T0C,
+ "bodytemp" = H.bodytemperature,
"borer_present" = H.has_brain_worms(),
- "inaprovaline_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/inaprovaline),
- "dexalin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/dexalin),
- "soporific_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/soporific),
- "bicaridine_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/bicaridine),
- "dermaline_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/dermaline),
- "thetamycin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/thetamycin),
- "blood_amount" = REAGENT_VOLUME(H.vessel, /singleton/reagent/blood),
- "disabilities" = H.sdisabilities,
- "lung_ruptured" = H.is_lung_ruptured(),
- "lung_rescued" = H.is_lung_rescued(),
- "external_organs" = H.organs.Copy(),
- "internal_organs" = H.internal_organs.Copy(),
- "species_organs" = H.species.has_organ //Just pass a reference for this, it shouldn't ever be modified outside of the datum.
+ "inaprovaline_amount" = REAGENT_VOLUME(R, /singleton/reagent/inaprovaline),
+ "dexalin_amount" = REAGENT_VOLUME(R, /singleton/reagent/dexalin),
+ "soporific_amount" = REAGENT_VOLUME(R, /singleton/reagent/soporific),
+ "bicaridine_amount" = REAGENT_VOLUME(R, /singleton/reagent/bicaridine),
+ "dermaline_amount" = REAGENT_VOLUME(R, /singleton/reagent/dermaline),
+ "thetamycin_amount" = REAGENT_VOLUME(R, /singleton/reagent/thetamycin),
+ "other_amount" = R.total_volume - (REAGENT_VOLUME(R, /singleton/reagent/inaprovaline) + REAGENT_VOLUME(R, /singleton/reagent/soporific) + REAGENT_VOLUME(R, /singleton/reagent/bicaridine) + REAGENT_VOLUME(R, /singleton/reagent/dexalin) + REAGENT_VOLUME(R, /singleton/reagent/dermaline) + REAGENT_VOLUME(R, /singleton/reagent/thetamycin)),
+ "bodyparts" = bodyparts,
+ "organs" = organs,
+ "has_internal_injuries" = connected.has_internal_injuries,
+ "has_external_injuries" = connected.has_external_injuries,
+ "missing_limbs" = connected.get_missing_limbs(H),
+ "missing_organs" = connected.get_missing_organs(H)
)
return occupant_data
/obj/machinery/body_scanconsole/proc/format_occupant_data(var/list/occ)
- var/dat = "Scan performed at [occ["stationtime"]]
"
- dat += "Occupant Statistics:
"
- dat += text("Brain Activity: []
", occ["brain_activity"])
- dat += text("Blood Pressure: []
", occ["blood_pressure"])
- dat += text("Blood Oxygenation: []%
", occ["blood_oxygenation"])
- dat += text("Blood Volume: []%
", occ["blood_volume"])
- dat += text("Physical Trauma: []
", occ["bruteloss"])
+ var/dat = "Scan performed at [occ["stationtime"]]
"
+ dat += ""
+ dat += "Patient Status
"
+ dat += ""
+ dat += text("Name: []
", occ["name"])
+ dat += text("Status: []
", occ["stat"])
+ dat += text("Species: []
", occ["species"])
+ dat += text("Pulse: [] BPM
", occ["pulse"])
+ dat += text("Brain Activity: []
", occ["brain_activity"])
+ dat += text("Body Temperature: []°C ", (occ["bodytemp"] - T0C))
+ dat += text("([]°F)
", (occ["bodytemp"]*1.8-459.67))
+
+ dat += "
Blood Status
"
+ dat += text("Blood Pressure: []
", occ["blood_pressure"])
+ dat += text("Blood Oxygenation: []%
", occ["blood_oxygenation"])
+ dat += text("Blood Volume: []%
", occ["blood_volume"])
+ dat += text("Blood Type: []
", occ["blood_type"])
+
+ if(occ["inaprovaline_amount"])
+ dat += text("Inaprovaline: [] units
", occ["inaprovaline_amount"])
+ if(occ["soporific_amount"])
+ dat += text("Soporific: [] units
", occ["soporific_amount"])
+ if(occ["dermaline_amount"])
+ dat += text("[]\tDermaline: [] units
", (""), occ["dermaline_amount"])
+ if(occ["bicaridine_amount"])
+ dat += text("[]\tBicaridine: [] units
", (""), occ["bicaridine_amount"])
+ if(occ["dexalin_amount"])
+ dat += text("[]\tDexalin: [] units
", (""), occ["dexalin_amount"])
+ if(occ["thetamycin_amount"])
+ dat += text("[]\tThetamycin: [] units
", (""), occ["thetamycin_amount"])
+ if(occ["other_amount"])
+ dat += text("Other: [] units
", occ["other_amount"])
+
+ dat += "
Symptom Status
"
+ dat += text("Radiation Level: [] Gy
", round(occ["rads"]))
+ dat += text("Genetic Damage: []
", occ["cloneloss"])
+ if(occ["paralysis"])
+ dat += text("Est Paralysis Level: [] Seconds Left
", round(occ["paralysis"] / 4))
+ else
+ dat += text("Est Paralysis Level: None
")
+
+ dat += "
Damage Status
"
+ dat += text("Brute Trauma: []
", occ["bruteloss"])
+ dat += text("Burn Severity: []
", occ["fireloss"])
dat += text("Oxygen Deprivation: []
", occ["oxyloss"])
- dat += text("Systemic Organ Failure: []
", occ["toxloss"])
- dat += text("Burn Severity: []
", occ["fireloss"])
+ dat += text("Toxin Exposure: []
", occ["toxloss"])
- dat += text("[]\tRadiation Level %: []
", (""), occ["rads"])
- dat += text("Genetic Tissue Damage: []
", occ["cloneloss"])
- dat += text("Paralysis Summary %: [] ([] seconds left!)
", occ["paralysis"], round(occ["paralysis"] / 4))
- dat += text("Body Temperature: [occ["bodytemp"]]°C
")
-
- if(occ["borer_present"])
- dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
"
-
- dat += text("Inaprovaline: [] units
", occ["inaprovaline_amount"])
- dat += text("Soporific: [] units
", occ["soporific_amount"])
- dat += text("[]\tDermaline: [] units
", (""), occ["dermaline_amount"])
- dat += text("[]\tBicaridine: [] units
", (""), occ["bicaridine_amount"])
- dat += text("[]\tDexalin: [] units
", (""), occ["dexalin_amount"])
- dat += text("[]\tThetamycin: [] units
", (""), occ["thetamycin_amount"])
-
- dat += ""
- dat += "
"
+
+ if(occ["missing_organs"] != "Nothing")
+ dat += text("Missing organs : [occ["missing_organs"]]"
- dat += " "
-
- for(var/obj/item/organ/external/e in occ["external_organs"])
- var/list/wounds = list()
+ dat += "Organ "
- dat += "Burn Severity "
- dat += "Physical Trauma "
- dat += "Other Wounds "
- dat += "
Body Status
"
+ if(occ["has_external_injuries"])
+ dat += ""
dat += "
"
- var/infection = get_infection_level(i.germ_level)
- if(infection == "")
- infection = "No infection."
- else
- infection = "[infection] infection."
- if(i.rejecting)
- infection += "(being rejected)."
+ if(occ["missing_limbs"] != "Nothing")
+ dat += text("Missing limbs : [occ["missing_limbs"]]"
-
- if(e.status & ORGAN_ARTERY_CUT)
- wounds += "severed [e.artery_name]"
- if(e.tendon_status() & TENDON_CUT)
- wounds += "severed [e.tendon.name]"
- if(istype(e, /obj/item/organ/external/chest) && occ["lung_ruptured"])
- wounds += "lung ruptured"
- if(e.status & ORGAN_SPLINTED)
- wounds += "splinted"
- if(ORGAN_IS_DISLOCATED(e))
- wounds += "dislocated"
- if(e.status & ORGAN_BLEEDING)
- wounds += "bleeding"
- if(e.status & ORGAN_BROKEN)
- wounds += "[e.broken_description]"
- if(e.status & ORGAN_ROBOT)
- wounds += "prosthetic"
- if(e.open)
- wounds += "open"
-
- var/infection = get_infection_level(e.germ_level)
- if (infection != "")
- var/infected = "[infection] infection"
- if(e.rejecting)
- infected += " (being rejected)"
- wounds += infection
-
- if (e.implants.len)
- var/unk = 0
- var/list/organic = list()
- var/imp
- for(var/I in e.implants)
- if(istype(I, /obj/item/implant))
- var/obj/item/implant/A = I
- if (A.hidden)
- return
- else if(A.known)
- imp += "[I] implanted:"
- else
- unk += 1
- else if(istype(I, /obj/effect/spider))
- organic += I
- else
- unk += 1
- if(unk)
- wounds += "has unknown objects present:"
- var/friends = length(organic)
- if(friends)
- wounds += friends > 1 ? "multiple abnormal organic bodies present" : "abnormal organic body present"
- if(!length(wounds))
- wounds += "none"
- if(!e.is_stump())
- dat += " "
+ for(var/list/data in occ["bodyparts"]) // cant believe this shit worked HOLY FUCK
- for(var/obj/item/organ/internal/i in occ["internal_organs"])
+ dat += "[e.name] [get_severity(e.burn_dam, TRUE)] [get_severity(e.brute_dam, TRUE)] [capitalize(english_list(wounds))] "
- else
- dat += "[e.name] - - Not [e.is_stump() ? "Found" : "Attached Completely"] "
+ dat += "Name "
+ dat += "Brute "
+ dat += "Burn "
+ dat += "Complications "
+ dat += "Immune "
dat += ""
+ dat += " "
- var/mech = ""
- if(i.robotic == ROBOTIC_ASSISTED)
- mech = "Assisted:"
- if(i.robotic == ROBOTIC_MECHANICAL)
- mech = "Mechanical:"
+ if(!has_external_injuries)
+ dat += "No external injuries detected.[data["name"]] [data["brute_damage"]] [data["burn_damage"]] [data["wounds"]] [data["infection"]] "
+ dat += "
"
+ else
+ dat += "
")
- var/necrotic = ""
- if(i.get_scarring_level() > 0.01)
- necrotic += " [i.get_scarring_results()]."
- if(i.status & ORGAN_DEAD)
- necrotic = " Necrotic and decaying."
-
- var/rescued = ""
- if(istype(i, /obj/item/organ/internal/lungs) && occ["lung_rescued"])
- rescued = " Has a small puncture wound."
+ dat += "
Internal Organ Status
"
+ if(occ["has_internal_injuries"])
+ dat += ""
dat += "
"
+ for(var/list/data in occ["organs"]) // cant believe this shit worked HOLY FUCK
- var/list/species_organs = occ["species_organs"]
- for(var/organ_name in species_organs)
- if(!locate(species_organs[organ_name]) in occ["internal_organs"])
- dat += text("No [organ_name] detected."
- dat += " "
- dat += "[i.name] N/A [get_internal_damage(i)] [infection][mech][necrotic][rescued] "
+ dat += " Name "
+ dat += "Damage "
+ dat += "Complications "
+ dat += "Immune "
dat += "
")
+ dat += ""
+ dat += " "
+
+ if(!has_internal_injuries)
+ dat += "No internal injuries detected.[data["name"]] [data["damage"]] [data["wounds"]] [data["infection"]] "
+ dat += "
"
+ else
+ dat += "
")
+
+ dat += ""
- if(occ["sdisabilities"] & BLIND)
- dat += text("Cataracts detected.
")
- if(occ["sdisabilities"] & NEARSIGHTED)
- dat += text("Retinal misalignment detected.
")
return dat
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index d2694eff7e1..ca120aa80e2 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -8,371 +8,105 @@
icon_screen = "crew"
icon_keyboard = "teal_key"
light_color = LIGHT_COLOR_BLUE
-
circuit = /obj/item/circuitboard/operating
- var/mob/living/carbon/human/victim = null
var/obj/machinery/optable/table = null
- var/obj/machinery/body_scanconsole/internal_bodyscanner = null
- var/obj/item/paper/medscan/input_scan = null
- var/scan_slot = FALSE
- var/backup_victim = null // Backup data
- var/backup_data = null
+ var/list/bodyscans = list()
+ var/selected = 0
- var/last_critical // Spam checks for the alarms
- var/last_ba // Brain Activity
- var/last_bo // Blood Oxygenation
-
-/obj/machinery/computer/operating/Initialize()
- . = ..()
- for(dir in list(NORTH,EAST,SOUTH,WEST))
- table = locate(/obj/machinery/optable, get_step(src, dir))
+/obj/machinery/computer/operating/New()
+ ..()
+ for(var/obj/machinery/optable/T in orange(1,src))
+ table = T
if (table)
table.computer = src
break
- if(!internal_bodyscanner) // So it can scan correctly
- var/obj/machinery/body_scanconsole/S = new (src)
- S.forceMove(src)
- S.update_use_power(POWER_USE_OFF)
- internal_bodyscanner = S
-
-/obj/machinery/computer/operating/Destroy()
- QDEL_NULL(table.computer)
- QDEL_NULL(internal_bodyscanner)
- QDEL_NULL(input_scan)
- return ..()
/obj/machinery/computer/operating/attack_ai(mob/user)
if(!ai_can_interact(user))
return
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER))
- return
- interact(user)
+ return attack_hand(user)
+
/obj/machinery/computer/operating/attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER))
- return
- interact(user)
-
-/obj/machinery/computer/operating/attackby(obj/item/O as obj, mob/user)
- if(!istype(O, /obj/item/paper/medscan))
- return ..()
- else if(scan_slot)
- if(input_scan)
- to_chat(usr, SPAN_NOTICE("You try to insert \the [O], but \the [src] buzzes. There is already a [O] inside!"))
- playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
- return TRUE
-
- if(O.name != "Scan ([victim])")
- to_chat(usr, SPAN_NOTICE("This scan is of a different patient! Please insert the scan of the correct patient."))
- playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
- return TRUE
-
- user.drop_from_inventory(O, src)
- input_scan = O
- input_scan.color = "#272727"
- input_scan.set_content_unsafe("Scan ([victim])", operating_format(get_medical_data(victim)))
- usr.visible_message("\The [src] pings, displaying \the [input_scan].")
- to_chat(usr, SPAN_NOTICE("You insert \the [O] into [src]."))
- playsound(src, 'sound/bureaucracy/scan.ogg', 50, 1)
- return TRUE
- else
- to_chat(usr, SPAN_WARNING("\The [src]'s scan slot is closed! Please put in a valid patient on the table to open it!"))
- return TRUE
-
-/obj/machinery/computer/operating/interact(mob/user)
- if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.unset_machine()
- user << browse(null, "window=op")
- return
-
- user.set_machine(src)
- var/dat = "
| Organ | " - dat += "Burn Severity | " - dat += "Physical Trauma | " - dat += "Other Wounds | " - dat += "||||
|---|---|---|---|---|---|---|---|
| [e.name] | [get_severity(e.burn_dam, TRUE)] | [get_severity(e.brute_dam, TRUE)] | [robot][bled][AN][splint][open][infected][imp][dislocated][internal_bleeding][severed_tendon][lung_ruptured] | " + pulse_result = occupant.get_pulse(GETPULSE_TOOL) else - dat += "[e.name] | - | - | Not [e.is_stump() ? "Found" : "Attached Completely"] | " - dat += "
| [i.name] | N/A | [internal_bodyscanner.get_internal_damage(i)] | [infection][mech][necrotic][rescued] | " - dat += " |
y4(pqadTh5PD0pfrs z`V|zB15rMkr{qp11BciT-+7~9%cZ0Td!y%lnCnhE1EO?qjPA;SWx=L2Q#ABvMu#pR z<@n8>L<2gNhYP|XDFPd->55WsuztI8^uCATH?0t**1+Yp;C=R4DTM{o-i_{6EpnG` z4B=83o=#In_{P1BD%2eXDMFdqN4`$7#w0lQNhyNV{=Jf^05{wsYJ4wz_p6CE^NLCR zL@M;z!*gT}3hDefg|P_BHu)W%0BM2N*AW-v@b6!ahtVbZQ|b(m F-m4?e#Zkg=&l(9K;a!xZwfyxg^AaQ*X_k4jeDg7xuuZ`#daAq*9{JYZolS) zhV1}A$Nh#619^gvqw4dWt|9yMd@TD?fjgbKF_C-?#jZPRIUUPL$4Yt0Q|k1{u|DXo zg49exUj=5eREz ;NrocMu) zsU4QYDX|oJxpkBTSiGNGZMg9cU8xIu0nlmQ Bc;o1$`X(L3)`tVBQogZb=^E8v zy%W=y{YGYdKKa9tSZPy}{>3|m-GehejE*~=xWQ6qg#Onbxz25See(lN&Pa-O??%IF zX0Hdkdw2+DCe^`oQXt5PE~rQ1b{=q5r2-k3&B&GVRG}X_Hl$PY^S1P9mKV|tfZ=it z(|Tzu_ccWNbQz|O6ugZ;^uY1-Dc$O6eBQPp0YBl#j6=&;YUmS@pn3VS;! Q1oE1YCD zURRMFWbwaORb3S&Bf~zZ%-NYq_TCny7j!&et%aQdUzDnrfPAR{5+2hhp?~H)71(FN z%Hqw>?>v})U$l~36Ic9tYyP45s`pS6ORktJcS)R#ux-(f42|?Z&H|onTgDP^p)O66 z%Vg?zFD;{}E0dKx^ZwUIKW* IIuH+m9EVUs_^~-!`t4igv0hw6x 9PrL*gCB8qn4a-%O-lD!!F&{5wqsS5B+Vr<~-?;{An>zr?$a1 UTORv)KJFa;skFtscHkSCB8rg>j?LV%oy;myL zA#Oi^U_|;T!P*U{usJQ7a|LGbbc9SH<#WF9w1Lfwm8-=usda4lv+wQLV#nu-_Goe$ z(e?^bWkbbH++1Xc*sLL18zxqUdDmHw5hTdy_ue){i)0kQvTJaag7MuhBX1s&JK+Ke z9PW4A8*8(<&NB=IzY;F^pHOH$rqyTFDZp#6V;xeFIn>d6V?lo{6a8)Z;5G2}q8X}H zhM6-&%Z@aB%fj|<709P%h%6$Ys)DO1J@1pvQXzaAnTt}k)TJ!4z(TQA#XK}PeLjgQ zXNt-<7sO?6Ul7hPssM)IQ@oxYj!QE3v}Ll=T%fb&K~NL}#0h6H)AT;8>KX>~I%*vp zy%tQwe;k^FOQeQHD@xG$EoLs|6GkYaHHa(G;jGtHrE0EDpHfqV3kc6%e07mwvo0!; z5PEutz>!YW)quU2j`(p{2pRuXJV CPnAcHCj5>y+r|i4 zVi8;g$fAN#sM^%{FunGHU!b#m-!rhJ9wckB(A@MrCMO@CXB-!+EW<2P(xCP8fZ?5w zk6!li=HLAul)1gV)v@*zF*rF^7)KbtnEpXB=NGt}exjm(qIBC(=A7#9WO2n$evV3a zk&IlcLvD5^zrBT{<7A$*=iu=z_ua?M(-Y>r0h}WJ24Y`NT(iI93_d0&9EZi}O+el8 zSjq!iXD>b_2&$kmh=lS3<;}wDaVcWDv$l!uCQ3VJT_2yn4#pMK1r(n`l)X@m^`soL zyYl{Gf*w-qaDMH<+_RyROLh=MW|L=9oz1Ghq%E(Q1&jYvuUR4|#{3%~q0~1or~ r?;N&w?@Cm^fGBj9RSyaP{`2p&DmXuHIy8i%A zUAnw7IH5Slc9XxPs&Y%eM3XzU+m}3vVrASrZ|(x0ehqnauo{~jXBnml_G394%g0BJ z8h`i!&CHP!3L*$ow8+vp2K=!3I*aQ#uW_>qb|2R;gEh(zKY-t5$z;MY@oDWH)fS3~ zAN?hBrWCmBATURMcsiy1s^k7g;@7n~G`Nfh;(~r$cMf_y$c;B5!0oJ!eJfmfXu5Ko z*Pnho0slecaFHkHsVZHAmKCJR*hatlm@Fdn{0o))^WnM`(yc_W0)WUBSw)ULzq+yp zbl}umUnt>eZL8yyw-{aPPTO)UQ(4?;`87l-;oo?(xP|@IANy%6{R;e7UkAjJ59PtQ z`l{RQl8S&(ZQylawN!q5+T+${=7_V}Fz+dI7ZgJY>p`18IJyy1L@60~8pPIKJp+q~ z*X&DK5vo`Yb*ArlK4m&C6}d-{`GK%@@?MjKW9E-nw*zz5f_Y|U!x2O+Ap1G8`|;Hu z5sHcv^?_3l=9VW3bhr9`4`-6nwJ*?&X&_=Z!Gg}To>OF9OCR^k7uWmIBhP2P3go}( zUAib%FA@W<{Lm0RLV{p!#*}>X?eN8~KVyvg7Od>~8du!DhhzG1^G?SWy@KUzOh=q_ zEIUNv)Y8gQv3zU$$6QrqfBS#XMEse98I^sdsWxmp9UNxUPn0YaHbDuL_ESsfM!Jwc z>$cKG!wcLsxT{y(W*stEhj!X%#dHMRL%my!3a<6RCUS+W|sKZn9ZOucO>_$)nux&dt#rInR5U* zg5s+XI4&l1RP!A87lBZ;CMXA-=P7`(ylT}*<&1KY*n{OUDenHwhq_FU?=G&G7?fHE z>ph6)slfDuixkdL1czzCF07^(vtb|?-mv`9vhOA58O^_u0Lw06YR`pGD=L@}!8`}T zgP6_r^v%Bqz%tAAIY9Rp8;IWa{$H?xG3N68(fY~hX-bg!l+O?W@aL?!D+~US%7pm8 z;e(Xh65Z1=KRI+H*3~FNuh?~X{1q2{LeX ?Tq(G7u7f80p(qkv1{vw42H~Tx9c;I%tLL(q35%3!}_@7uol#Jz05ySrm zDBOyP%8 7%8ovk!}zn-Q;F}vS-5hPpAUExMWr{WYFCmBCAR25R3`gY3iyP z*01yGsQQF| d!(|G)3cCQb%OL%8Gf z=FS#*4J|sZmxG&QAo=d)+q*x201zqv6P_5vUHAR3jO {knPdGXu xf)MPya&fsS0G^7kO znFCKes$cnn(P0JZISt`AGaA`H@1pzI+2h##_~-8x-RZbW|6>z}2Olp7tY)XfEY+yu z&8Pc*2k8<2_$w(WxJ`Z+Y}9&_aCXqz9SqW(`+I@3WOgU>OE4s7g>9JdG}T?9qW zsOct_@MWYD+yK|=zQf0PTDXD?zs5WjpCuEQzFfAg%7A4s0A*lx+OrG>-X6l^;YDG9 z_OqlR$o<8oN&gE%l)e0=miaAWycC?l5fzFZa>gq@QU`>m_ZXpo!4YBOxS!oo;vrQ6 zX7fQW3fEvud>^H|>UYenxEI8XhRh056k%LW$A>^Hx8D%>)7GQnigf%VwlH^&OU!C? zrgvK_-v-j3Cep{<{G8iqW-yKLHJ|)j9xAilJ@|@S)aCXtHy-;>6yioMW;4m3(g=M_ ztoAq7WEH}*AZ1{^3ABtf4Op574tH+RSB+2^a|MGdt9m%>Q$}XUhOZh(iMu76lYmfK zxHA)kQY?tQUs|KkF2EF>8XATv5e1U hS@E{BukG&UGZW-$oCl4pajXDCQ%DaFjtXQCzYNADKbz!`&L<~`H1{+o7iNK ze6lun`{Px_uK@wKLH@5O0^jYA1>sS&xik)|BayttJa|SUrj(Aa z)!=diI3?)43PyWm2xc;{Lai%-BZra!moGH=B|6bH?;`GHiHqpHxFIVzcj$z^ zqCzvDdyjc}f!Wy6%pN+CQ-#ZDe t&yK(!Xl?ajk01XLzL+DicaLw;nxfCP5?<~HqgKTQrC^Z8D$2J8(nbV4j zhY23o+B$kjW%QKteNLWy*&ZRQXo+$9NpdPC2qAY_2If4hQyZ$V4XlIeQ4PBUa^%pO zLDlH?Y?Aok$9~L338{aDugbdz0mvjXw5-upl7upj&!@3%?g`?6d-`XUrxBG4d0>&q z*kRKgAy@c)nNEkwDhpf!ZZ~P?F_dXNh>((ZUk?bpo$v*T-JWG9Qa*FC?{O7pKI}Aq z5fL$%%zvVSOW{^*hTMjJ96rG&8;c`z!+?rjMc;{+hg^9*ftn7VDYx0sioE!sHz>EN z6$v&J^X(Mz9@JjW6b%oGbeNmmZ`Mnent7uAPl!-jh8dcecgAZe C9|iky0j zwS7Mq|AzQyZ?NX}V>z&xn~#k7i;~8nwBuslXG8O2ge_rUEpFTvtDJLLCC_|xd$6BT zm)ml9C2slP?0%nc{(o49>?_uRP;T`ztlr2u%}e1_$7Nk@Zk0z>`)@(Tu5|@&2FTFX zq`r|Un(H7kx?WgEMkNli3x!sIwL2ZPkCcl)Q;2*U(Ad$F5F94Qf1Wg9HGL=XRZc_^ zoEKa~r6h UG)7hXirL-2HxQz=uxT(;db(-A?VtY{Xc`(9Zpw~^)O7ibKuar?m zEB;{oFKMwsub&r 3knG;aBaw%sM2oa(VD1o z8hk}xXa)ZRtJEn{A3>j8e0dAT6xS*jTx!XCQ;Rn%wFs%on@*G7)`Jl&=|zR1{}nLc zDTco%Y(WJ}<{pcQ^7lVi91 cFg(*K%!+ zy~f4lz_-_CFvlwN5Vw+bnqNsSl}PE}fz&Qg{1Y}0i(&sHPsoyIetClit?S8A zpG%1#LNH%f9h!gb(J6Mtt(XGT@rpm&%+$)^oBoJ8keFYR>(W@L*lWzmn1 FRB4USU1UXYdN2tfY<$68w}L*$+qpg{+TpWi*nMME*+YLtUKeCUYTkK; zJ@=$1WicYX=-`n1nCMH(gUdLv-tz9APxtDOd)j}(-xe7DGQ#JNkR@`GT{LOR1p-a) z?}L(Q;PdRim;&V?+8l#*uT~J^vX;+8e( C=Q-p_y{s6gE5wd&L8X8h`Y%&)1v;E!$^MH5ij-(_;wNvxpT1KDnl9uq#4XYj zA#WeIa?I=|Td-xhKjnDzj1+$eGYD>OpfG+nk+?GqBW@h}r6JLS3)L_ieuXY%R8Y8& zom=3T$Hx(WKgXbOZBS<;&>hCCJoxh1CC9h@l(Z);eo?ibajyZ}w)HW$2~=k_-A_JL zbH&Qvv wA6iVW!gbVHU8-7$dwC5=qPhGCqSXJ%?!;8R%=W}aG@gD89zOMydAMCc*zpv z+kH*1-t?OTTQA6EeVD5t1LY2Rce|-M9$nQ(l|}FpNH W)|D>#ypi7|ax6_f8xk0X2OEcny}{`=;T}lp-+0kbkM?L@EwuiSm4S|GOt~ zX~#A1o@{}!%vM?bNRtU7_r%C<53ne}%^?pf3y{xOe=#dgmz-g!Y7oX6qIYvFl1B^1 z3$DU2$k~SQxL9mp0XB1zxjuLCBwgF-`2T>Uu+t~}&Lhn6f=r01$vgoms50%D07jDL zAJ)RaUS#mG<^(hF7@3M?%Em;U8l$}zHDE2;i5W+(h2}<^u zEHHrZY#>OD;ne5AnJ3Z>D{%lQECcYcWUP@ zGgR4J>$^D9Q*FiP{^RCOQTEd3pMm#hhQs`#+*rP`v<0?5yi#^} z|Ct5H#V(Gbo$iTGUc_EAp{ez2q~Fv-5*+u %@c~-Rojw(5E z9jCelf77#a3n~vx{a$E&Nk}+^#0eBfB+1iH5(s>kKI{KjACU|jd!960e<%D=_ybKG z|J{-C;V;Hxlh#d^=Bc4wtLyLLgLWT@GO!=4_TF21*Hdv-B@UoGKORSe6bUO}kow5~ z2mKC{Ma;jX5P6EXqK(Fy5@2C?ZWH*=Kv`dg*=&oxst?|7|4+eV-S>*#coq8~?>4B= zX|GAdcbccmfSWAW>;bp}CPl>`Cti+_{y!v-0hDeli0Qz3aKqLL_;BUKdplvM_1ifH zKq@DL vOTgE 9zb$Wt@r%FGB)un#+bTt}Glhr9aHUrC*s~DxP1;c{VJ@KRM z6}Iu@#06v{6FwU3vp1)EB3AB%T)0WhkPF71y82(yonnnw2S*0PM*bd%X4}|%4{%*? z A}+We3#&d zE6vP(W-FY_0==`lgGVY`iD`{_g;oVXkIp@i>g8S)E t^3y^R?#CEa^X2UaN3 zva_+L{Nbj<*`TOGy?s=v@QR@7APg-0Kt89Iiwk1g?9gwD7m_L#LkD32^&{~UNbO0E zRZDaUcHK%YiVVm)#QOdo1x#N4Z-k}2*MYKtzu!x59TDY*Z;LE h4nPfht9plDf<*GY=DKeb#kEPF*A^?1L5m<0 zFfOJmx7poMdSP;NeSZSZBTpc%I(bi6?*+|83P){PLxsoVC?`F9j*EWXDZB7?YA60a zCrZ=0cDLcXF7|Z+osUlf8S6W75PJ&X&lDbe3T5qJ!E;;e)P;cadS%3;6laAzd%VBK zzOJGwD19+i1an$6^IBX2eNZ7AAF_UGo#B-JldY1a2aR`E{y#dBNa<{lp|W^CXD0Lz z1lZxA8>q`66y?4-s*U|cS%qn_xJYE&Qy(G3C%w>&Q Rf}Q=?$)LM z5Lg#K|B7C2NW2qJ^g7Q09eV$Uj6lz#oY)`yM+a2 B zh&{7wEhH|e=;v$$5*y6bC(5Z!{MQz84r}g4oG6Q450t-19NCy55og&+@A0XU0h|s} z4CZJoH)>yEwLmQlg+sNT(&4;%1r|XvzKa$qR+?Z*n5+2e*@iVI9|Q7lq$uBN4UCQd z-j;RWER-26wnP4>Cy(+zx=8_|@a37d`^rxx7*Ol&)`)D%@=sdNIA#V#NA}kwiezr! z+9CrKB=?PeV81QPAp7Q5((hGaS&mMpF+EVo;0LVPT2(LJAIvS73bkbE2%XPJVMg_J zuGwr8yoLW5^?0^K-srta`oPA?*pF)`;eO3@Xxr)qHwj0*%(F@o7h~9Obt=x@p+- *KqrNJZ0J+8As%n;>Ni8xv~hLZTap(k8?)c$Fw!Qn2AhV2tJWK} zev6K*xfOT?V$1#YYsZ~J^8(?z%?MkX-m7=c(-RD&8VxVGac+|W@Yfrcxp|zveo_1< z
E&XOu!x@nTl#`h1HMCj zzoX1=)T6?$rwgS!wc}C|K%CzYKWsTQJi?#HfOS%hu=4h00eax29V+&d-!fm`8AHe( z-Z@$vLu|mN6&H-7@OtxdXV-l9av*wb^4l*P6z^OH=c(2CgclT{gL$qO5}i?RA5YmS z=ezuH6_neq_&a6Vlh_1`fOGJorI+MH?-(7DLYV54r^u&5L86icGo;-vCWv_CJ%~~U z7r;3)AY5Ur!B$A=fUk-L?^DNm{vFT`rtR{~s0#Kn2TfQE|MTrL<<*{3 zU@SYkNGbiwduth_Hx))$U3Q?N(P;vT<%4X2XAKrHe Sd7J;`XY~h-T{X9Ph>di2HKxKoPm{`MX*6tn-drR znGLw?`e+?gP@bWW2LIs{d7qb+L )^gzDsOn<(|RL(5* zx0e)p)2b3EfL6Ic>ymA-5*wgUuc^>U=-fQoGmPzF%YcWnLcn0XEhZ}Hud4o{rvi=L znLkb{(Jy1;Jpa{0QC6RrMBeh@$@x(FP}bG0JitENf5kr`77G*H{{&2c&KS?d@ImBl z9w~K6N>`U-W6(~xvAw0yD_KH{#o02;J#18h+=gZ08?4{T%7*VwJo()a<~|2{L3-}I z-Uiy2uWE|bPwRFX8T}(
z8d#pW!r{f} WaW2t2lE;9f#mEgUSiNUn-4kqQli7pkrR9+i6>BV@H=<3pSj^qN64olG0v z#pyGp8VqudR$^@RN5b1_vfy1x(}wb}vC={;4z>Gx>}0kW*A%9B?GKv&vcPzqj&1Fg z4c6z_oLYc*;fCQ%H~)--vr@+E(=YE&S2g%bc;;>igj=QSy`Eub0VDOz-{XhxkA!f< zv!|1lKU|5sT_RAvstJhZN*>b =OULYj`8*q5#ZahR}K=}qu|_crq3)Q1T%NRCJAoqp4W_|&JkB{ zbAA(`X=k;Qr!cRdQaxG#EdX!cV^XJJ6a(q@>pF+ef1NEqQ8?ROf2mzFuin5}ifSl~ zC``vd+J3hx&RcXqK$s>}#vn^`Zl s^Q@+0bz5& zZ=K3nd_KXbO9coXsXI@2NDAf0?_vw?uT1Ncp;i1U=q_ikp-i+gmvz(Yz*!7$E?n^f z&c$`7V{$iz;TrB{xAfJWMl^_nJQi>6&175-{8`Mc=RbF^9Jc=T2HC8T-Z{8>a&b^r zK|rQs55phMXTd+fh}-_J60;$)1Bz=GkazJ^*D$dk{pG@k%O9Mhhawp}C+{a(2SC$c z(NUr+a~#|Qy~Q~&6h2@#9O-!177xUB&yYz)@K~%LW2O0k{|A&lU6OBsv}UYW+uir5 zdC(%7gWf~%r(cTQk~8+bXZ(IhBlw3%Zv{Tz!k^G+dm}?9>_CknRI#`f!z1U$p3x(>u&yZx+!S4r51I3S>4U3D;;MNmYjo9NFeu2>uA ziKQ6{l=l7QWMDjRf`;xN%k*s_o9qEHve%WploVq8*0?yw~u){6K z^R#sP?>D|vNuyU!Y)?hG2stw&J=CXR- $Rue`WgP$5?YfKPm=R~-QnrQ8|`{iqt47= zX>C|TfiDJw$!29nD~WBAFxriaVTLB-s*u%Y78~hDw9reRg%h!pqeNNW6^D0yvbUC* zCsbOH4)+-^$-2Thx!?2u!-}ZH^L8TR7$;81v2G**ii0=X)m#5#+GAuFp(o5C##i`k zi7RI|5eBkdVcd6?PVV2hk0#bAbznr#Cd^N6&d<-M&)5a6 Q5DDV1%V_P6RV z)TQzEZ7)7|a{KO-UBy)Yc+e{8=$TLiKi3hjI?g+Jk}w;MQ8-x^#90_iey~v*#C2NX zvX!0k#WjZxVzk=E?n3bLN-E$q(m rwn6=IVhT(s6zV_W~voj_&OTWa@I%}a1PGTBX zKML?4Mu) OWJ~xwX}5a2Kd-UREVH8CC`YVG%M@K~P%nY7&1ujO zaN4sxeM1f3HeI8AI$j^FHn(CT;hikdw7t`NAB6HEXlcogQcOEI#3&2~ECjI+(9FQT z|51(3Dky_=jst&c-JK1JN?OalAZ`XXw5Riw*9WacnM*9@#k%?%+ ^|8lT0R<%y|PPc!?>ZDyC9NzfbKZ-ADvfnbzi>S8^Dp}SXikbw)2&_D-5$Husl>z zC*WLxsVjzeC&PrTQJJ*x6I*v9vbpoZ$_!GgZmkT*r=)lfcvh-wYJ}1j%nRSZBgI0j z-)JBy#$AeR0-G3%w$P~|VVEpYmNmvjZ~ H2D5xF(%OBFPvaj(@642sIXrp;gTXD6e(ca%1HO^-9y6!B1DxGmk~FT%9pe-F z0~#XH_Mnhk2}!yI_AB0C`t%I&l`_Y|G4S-P13v5mLa-W!nlC>o#qwn6t&;uI<(YE3 zwVPqa5);#($MWXtSlvEV86x}AMaoEjB9d)0{V734eoj&P$UKik+>tphm+)OHV8dsT z7jhW-X$ilCfx5et*3I>_N2)Ddltz4MwIl_kGky+2@q&d2A{zFZ`cSr|n5lgf&oxB7 zd>O`1f-xySCqKRDa8VOx4cyvoznd*~%lCWZACyP-Q8dq|=Rnd%OejCal{=)qQ#rbc z7_gYb@*qjJ`Hbmr(Myc=5_0oA^DlkUfD3@;HmksMD*hR6L-k@Wl}9iGH_wH*O{{t+ zK0CA2AttfyIZjC%$}>O^^F5w?seSVF096S8@mp+D7(4|yI1-XI1zGTWytYIvhbZiH zk1HVVjwja$dvMH5QU)4&zl~%B5Pb$M((k9juYRvDG;!(g^_Bm^hll(KzrxM_n~7lQ zV4^N~4%KR8Yl{$!eS_)u1+;VabdCli*W%1mAQrDJ4MQc9p?6~7X9Yfu#VTS*5@f-l za&Gj`5OJAl>@g(^BToTV%bygGx#dorKx5;1b3;5bsTpvlhz#b+=*RB(sabBGnSnn$ zIB6-UqKBAB!{{M$u2o8P%Xy_9oW}u2G^L4_lAz;86m0aoO)1HRc*bVGOkIliNi-r- zxxHU(B+wcUWc2AL?Indd^&37-IbTYAdUf>+8;73&zw54EZY5W)<>uyylA5;8(nYfm z^r{b0>YsgxFsq-tXJ$NRL{ei^wjRx+pf6K{WOT${hF83t${`3^jf_ny}xKdI|gL z(S>xCNgw` L3%SQtp9>J4}=g~EG1&|TLa zuZDq*kI>V3B$LOA6-bdK^LFhx$%6iil*U}_SNE*VV9w;gd<3sP?H(7>Vl%7Sa?Jewb&W2(z5aF72=$ro65C3TfCP|zxP5n`vLj&4R z51$jtrnUGCBksbhz#EiE#U4fy+QFo? Q?LCG0K_ z;_}uR$nPD#*8s_q9#r&}a+a8HO%yZN1bLmo%-d%Js?di|Nd0c%C#)KwQ|*VD =@hFkc#QGRsu$3?iLTOFrFswB$<$_;XG!gwRkb7|zLOs3 zl8uFdyEwN 1s7KubDGHV(%5Y+$xO~B{c3b`P=&lel`EeQ|@@#%S{4=*mp5s zQ^r9?V#?}Fk2@~A=lJKLMvkpD?XRFhY_Pcb4 CswPZI!4&^D)fBoT`fQ_E9 z=kI|CJ}%eYr@7CZii5WFZ!!AoaGBR{l5~V-;FRYsll)IkMz9NXeS@5g5~ok$V5Ni; zCh!9u1?P`u8~42n_FlWH>Ne9du!R~VWd3$dmh92M|JgK&>yavkpY!Q?FBtoW#>t*| zUQz;OU*FvIE*_pX$`OeN{W&tySXR!aYmG
$EFbd3$)Bt Qm+@sVQN%_qzt1AZ9w~D! zfFbEd7)BO{3+JbdSsWhSm>7~k96E2y`+1ywEV3|yH&*!}=J3_l{6mGa+wb}tZ}FNd zbafLF sBrzi4zJ z#?Si<>Rc{bbp>uu-h$YYf8|+~UR^D{W_dPZVr$&`byJ>k&|hHWK(Im$#`jh5J!%@< zd|Wne-7CJDpnWT%ZDTajixj2bML~q43M;h?7*20~r_mFL5$r~J9#j(fcQXLy18K)A z?XpUNMk_sJV5??pB%e|{GuDkX9sSD @iM_Km!HqLElW)wnLkKZDx_p7 zZ5unbI~5|7 vNt}3rVX%Skia_%t z{^_UeTc>H;kr3=+xErBszb4jiygMUsw$K)Bx7zFWRltz|h=Cn$OpGS;n%nuT@Raym zKI#N_)$y~MrAbaK=V;T}y?zCLYaYB|ZYpu;1NiwQIX4XBwdw@^_Y*B!rSIJrb?(5u zoR%XBuR}QMD|uE)X0Fxr!)wrN?;@Dfg>6>t+1GOZI`aS33%X$~cCE$d9$>e7{ojqC zg$UeCUP3F`xFf=ag5|srH_ub1;og}6mlBr@H5P*tPTZf6?#*N5V z#~o~}w}$e^8LSF|3vp<~^(S>Yz%{_CCd&fn*H|CtMdP!9##O)3etoCf*u-m5 7wYy_6%un2N@z2=N2k@5il$m;osE(Y)qmD&}StrXK7_&cwFC&T0KR zA$CjO!Wz7 {nZ> 2G^Y9G_w^K3x|h>fycB1cdV)@oJ^Z=bh@T z3xwFRK5ptV4hg|T>03hRQetqkG46wZHnH2+*F;}#VaKh+I<_Y(_r0>5MK@e)R0a(O zk0H0h|7^mXWc>End`nrmt<9^mtHIQv^tFjS#+%v$rNo99AP^T EdEbbw@_`leD z>wu`%wrhOT-K8QSpmZoA%}@eLhm^Dkic-=!1Bi5rfYOM7Qi7yNh$y8rNJ>db_YgDl zyGK2q^E~hKe((GJ{{H?to|$2@+56tty{>hwwdThVY`RmG4M*+s7UsAKL+Q5g`90XG zc=I)$2ETu=05wOS7ENqJqo&|tEiL000kkzcT;jwo>ZBz4f>Sul7f53-VXe39jE11M z{eF1wefM=CAzqEZj_`9qW$C1R6A5rzPOFJco$VFD@SK6Elhv@)%h&c@s<>I3@Qcx} zHjX<1mbR+=@PbluGXA}_7zcGF+9E(c_`<-^0eh-Wv$bMI(<|(vZ1rk7fn9X_ MA9voo14NPc&zr1wwm+|#o5K6Jz1Ry>opz;LEu6;y(Dx${X zm^V|^rae(6n|DJ2C{lk=v0ox&pAS*NZ|R58DeGcbm%@UF-}l(rsNR&W#Fhf~%z%AN zl?;01){R=!{vq 1hhjPm&brYco>Zaiip8v=_KedDY0fH^mcmX=0dn9Zt^CX< z90DZ90rM^<_8k~ZN~zLQ)gFpnEfkjZB~fMoWR^1h-Ui!JY#xq8(;e5sqp*g77Yw?C zQ$6mf`le6TsxvnG(W4MC
$RDHZGJz1=K*Rb; zu4Kn2AoIAq0=r(iQZ~LkABnbj-QQGE*?RD18$|p-=e8EonyyKDu9WPE9Ohr+RRSD^ zq?^m~gNda5NiTSu*Ayz?&Y}CQ<-|}4Z;^m|23J?l;F}!3TJ&q6vT`c6vAry=KF&w2 zgVm%;`IsZI$w1>}ZwYWKf-SB;m;-DUP&{D3*n$oyrH;nWK-LfYG!K~W=Vw1~n%EAQ zyJvax>B+06+xvp4ek(HXJXce1zwMW1ocX-0@4fS73VR{`v =O-l1Zre-7@ z{3~mK^C@MuLN@EnH9(vs4O7%z?20iAB%yX^E2^6GyjeD8vN-E{SZDGg$1k$y)2pp6 zVLF-`VXVm79_y7=$FsuTU}07?O(tp)t}y3}et+qM)F65p-Zs{RR+rgr{~B#}5%-GI zVWY0DZp625Q#KQ|$_d=sPaT%=)y!&La2^+E5X6skxY*j_GcY_E0qn+UKai7gHyG{E zJJ~hSRaJtX8hpn;fBvUD V+5gd_51o7M+I0{U)_5W!)HYY^GJ}_t zbV7o?yU4z{ed&B@mu$(y<6;v_Wq|1tva;g9CtXycp?Z~fZf%D5y|-T`VJWOkya_;I z%_mlRpCsO9HMskS!ZN^8Sa^xgtN$y7g;lZ`0#C#9pQ~V2T{W?3AiYVSNC@rt^QttR zB=S1G9sQe@$|dB%Bt;B~89O xzh|p!~*)T~{%s(wVng7MI({T(I2v*wi!B#j{|EDV#(h0Qm*&YF6VZoY5 z|0ZnNF~Xb*{o^ 7S`IBVb@1ZEgNB{Zo8>ac&2&rH~8m^p@7ao@x_jX^7Eq^o~1c6s?xvkFr zZPTR#7CxJBW$6hU#ua%E^zKNS>9WcrmCYx&y_ES(^{@Q#9ow^&5+Y6o>n;XGGIM)h z)qu~g9{ )zFp`ocf2+2S{L(k_DOpUlR(N-`dRM zn6b7^z!L3el)L{!{`%XRV}%-Ozl~y{fJTGgHsxyY DPix4l2ZSqLxx{lt_B-;lX#yS81UlQ>WapNUSgH7 z6==|cJkWHz*(U=PH__d?0q-{iLcq-OS4}`_D+}1^d-(E9P0RD<39;3lwfQubdSJxc z`9wb5nRYln*Fi~ky^LqT_i(h_s@ols2V53K9d?z7yfTy{mY T9I p;=vh2m^ragh>e{tvbsF~GYe bkZM}Z!or5WSoixrr(? BLYs8X@B0DHu2!5%|wP^|X1N z`n+EVUV>@*FH^7jPgAeR$#TKdZavaJ=A6(ys<^_X4Jm?nCt(d5(@X^hT`~IG_C~^2 zoK3Lm#}_i+$2Ntt4ef?ue%4sqM2R)(4HMs+=Q!+s)<1HAFEG^X(0xt=G!=qx-}HM) zHh^BIW!DeowC8vQrT5<%bDBZp`b36}>GM;{?OWszh%c;W)ABtL{6We76Ki9ovvp#? z#At<@1X5Yj73T}gShcLnPH>X*>Q`K@6DPi$DC5yj6jbM6(;nGcG6t?SWggkhONsHW zYf1q0in9*GZopxC?B+)U53UYRF*~hI-D6P;Ljy8kZhwRB$pM&{QCFj9rLP0u&%gV5 z`%V)yK9_HZZS5L$xTdZ>MUpPzXT 35_B02_6>qJr-^08p71Wmt~%KYRW>JZ9am z;U0Z8I!W9K^G(+W<5z-b{X=-+8rFf64UneAeN7hA*BnjkY_b8|*g{iiW*YS$?7Y|1 ztBKw}3?`?e%_=@%f7ES^d58vxEBqaL@bC@#=xep26Ndh-;47Eo#e=3;bV4jXj~`sm z+O8+_$pfMPYUa%*I!d!ynzqkezH^TVT(9%8SThd8uqDtr`lGU(WvES19mrd#4~`f> zTjd<$c{i*BGAA(u9NUyo{z5uC5Y}rdews@Wkx2Em;3z(?Sh8zCVqlXvK9gj~-5bNe z6$rfX#lSg&8u}@ -xr-kvvnGD0}f8qh~ z@wJFVthf}k-Wv5x7pxED+sE`}r&a=>H^w%$0^;gXSFET*jDQPKJ0BabvD~ {lf`J})dy@FK0ocPDH4w&zG6&PHk-A&_S7Z(i zI<<>-6?$;Me1+lh1x+nUkls@9IfO5!M=l0fc{RE;u-$b4!a(S-fZ1@dqs_hSwwK(z zxe(oxAqsGzYOsE3V2kUW`j?RvJI;6P#EP&tIZR oSiOWp^SJ8}56f5dCt zy7yByn>1zQ^Z@^yvl40j9fAyP1ukrE$cbSvc50=>6_>=|`f&&6j~Rw}Bo6Yo$@2~p z0@*l3RA}YH*}w+*`g-j%@*Mc{U?jy~;8(u4XFCQWSL!&t|8~NXB< nvU*GomS@t`5(cQ_D_X=<$tIuz=2DZ0fe~} zE@AeYdB3{78%zLZ2M=kh1VHvyUJ_vxcnzeG&)-$F?5jVo&7%eikeG5q60n=ZfYn^> z_5gINg>h@10!D+oRL}9OP;IejYj>y^Gtvhme_#&(IthVi?_cplQm^BL#k!!;7;w6p zrRgF@GCvT;zkY -wTM|5f&`Orto^dH|Xcflbc1bYzrbVA70Ls!bYiV<7u=}7ZaNxK=oG%yJD8D zi=8eijpC*QhUb?5y_T1>$^<6<(x8rq{)_=>?-63r7vU&wlC#DdPO<{QUt~$p4^JPs z2Kw+1Kn5styH(qi<1|Spo $jcC{}z%XUUQn;Resszsi%X7(=;4$ndsw;o0qQc?X zn(#J;+oNzAq^Oh84}ifA{>QZICtQyH);GkaQ-lY!y}Md^LzeuM5CLDi-S %5rfs7-VKNN4z=uTG@$(5z)-7!M}1q7I>`Q{ pFFnj6caG!k^^QsA=V! zL@ 8(rlcOHhJj_}?O z;|#4BPYy)=pAmx|7BSo|!{h#M4ZF4tS0zt{Q2vzyqKBOkn 6#exI+8S77qd}IGF1myod1cX_ 2*gxoJ#fN` zO}z8}5}U~Mo@2id@F$gHG_C|k2e1jcftGb0G!NfV@UG@ExXTeFU;)VHO%h5k@;g)s zGJ1xs3_T!j0GkqqP2jMC;cjA8BfmrF=;ou2_i)$NDq_RJK+plV&KMax-O5jZ;T{8*KBPoEeC?!jHK!6hX@o|&@ZTq t@4AQT{$J!EYP65eBxw#2Oo?sRr7MiZsR>2wyXlX@P~5)M@61c zF %G zKweXROqtFy)4uEC4s0J*fV{@*Q-8!wuKer|Cizj>ogcA`8fGM9&xkW+&ufy>_&YlC zQVDr90a-DyUjXms>#DypnNQt&lKsb$@%1lD1}IKV#6VMqWjj2uO+z$@9-7%ct`e0$ zrayifa!y+Zw(OC>?+Dz!rC)gD@Ap{$Gigjidn%$;Sd I)qT* zKvz8ni{qM$Cg%~9WMs%=gzMUP%~&ZC4DM?Ir_zDb7Xt(dc+j(hru*$rrd`?)Kw6^! z{h$;!#KJ9z7EKE#cDg2}Hhgi&0W1zbz*}*CwD&b+@2jd2yyP}w`2q{$G|2Dlh4oSZ zcIA8M_bp&y{2l`IL+{&riGhyBu?)+W7;%66gC}M^%K$MkfB|9Eno0_lFn6HPY 9LVGRTnAoK%x%Yh>jgc+zB?0W6tw11cS49s>= zwq9Q%9Y{ioai izvNqj zE(&-0oBaG@?wiwOFF+8|=_su0cl^Uq{fDElkV23L@{@KTM}Qk2a&ju =Ue)#dHz$?R2heMWE{p7X(BR>(Vn_Vm* z{Pb%A@nC%PFjp_oL~wV1dqJ-{zGeX+CfK=&f8~TotKzr~oF_)z_;Gq=g9Ubk*L{S< z9`~)`siUY*=GC)C@Ma5c*in_E!LEI-sRx=^&7+?E)^;L2fJ?G z`SB2||C|-VwycJzIN)aZ#OH$dpGb-QG#mVjs(HS^@d?;M>=djYFL_(e@HF_t|AQm9 z`$$y@-t5QXa(&TLQ~2oKY3Qj-Fm@P3avDUTPFwx(iFln%T-C3CUMJ$3W0=0_&>bVs zc%(I!abJG4XA}lnXb(`ODB@WgopL&SqaKJ5vixPv&HFi<`9CCsM28ww{y%T-|GhUC z8$Y&aN=tDPzKSnP{p1mjchqA+Dux7??Tck!tLHGz8 RoI(Kk?Ke^%aLEPxmRwTyT82|Jy_XlzvXFXzi@cC>USw?{CEeA zT)d{q+JO$by3c(a##aIV&T-5?b@N)#Y8jwtwVRn$D-2!pKE-{K>Tu|fFWgJ5t33aV zP0bcF60yoA?a6ajZFeK %>Q=#)6(*YjqK#1INca@x;NXzj*?C>SvhnQR-rh*n zJtoi95t^aQM+Um`Y=|#SzE5!w4C2Mpak9ssRg#ipKR!e^!QhFQ87dZs`Foe@VG|UP z_xHAgMC(KYTg+hcnPWExCnrXaoVQd$qu3h8*NZPz$ z+3>lz);hGE=Hbqj?=3>O%^6 >M914=Y6ec$j06Ma$kp<1MdM;dn$rysp7@X=KeU`FknZmK|WNl)1}Jx z8cl 81$0`f?^Ef|HKV!o*e{afl^CWi*>Y7Gln}&+`(%ev zR$X#fKNsE2bs~Vw%u!^&bbbuYR#S~ 5AlD{=~b;*6;wbLZsIde8%m|hHb ETx zXUb@L=x1rBxyeJu;u8*aSLyAAg2)`xYjZaflu`Oc@ |1MWZ^$6O_3V=@W7fF)P9tFM=()9x78D>gt8>PT2;} z6INoWZnUh-4 v;#7)3gzJTCaSeTAjED=JnUjKlFu 8*@U3rKpfa;p?$6 )-DtAT1qcGSDR}g}_}mjg=jqI< zqT6LA{wPKNqrOF`9i6b0pt>>OeOfwMfVU;hIkZNrE~R`fL3O!?JK *m}vXV(bD<}+G0Q5OK; z@Y@#@2gT+wM%C}$AK<$*;QFoX-}3Azj^EJS*LEa0%1A_slb&}*s}HK&e6Kh`3qzk| zcj35^7U-~P^Izb-yOW=i3i2Q$C!e@=MQ&y|W5TahGreEX6uwy2xSu|o+8-3sR_-&P zj pUVkU-r3VPEW|rox`x*aWbLN(%fndWzlrK zyWgYDLv_j? ^!1*_I`1hRatXdNe< zP{4qsUZCYPu1MM&g99^S6vabV0w^14vrUjjoj(eLIjrTne`~iAwo3_b*f mkld0N{kouhmEO*FnRDS) zx2|(gbH$7C!#QvxFMN)A;AE0e$e+5iXae&8WQO#vMh ed61NK}DC}p@xrZeXU8rEhdP$(@r2wYv_4mFU1p~ zK5m~?V`cl=C@JO67@Xr;H=4hxJ-8eOOX!GvmAuv!HrFx|$hE(iTr}@XRM#_sxem^( z1Cs#?Ny*I`RY5tmik+{;CY)Pc#x?5^wOgU2#yHf&JS|TjF}+j@c};Mtn;J33IQ{wQ z0G;0ZYk79v>D}Yku3g_}KD|26vISKuHZ$m@(@k$JERAA}Z_#y|EzvPJD3Xw2YNmX% zV8W*Ri+rcE0w^Pzf_m9nro@AHw24($1Fmz0HqrJpZ7%i~bBXP1GaQa%KuObRQk1H? zXyP$FCRa@)?;>EhUt=oh?<{zb_DNL4;L;|W_jJ(1?NGg9Xi$9c(cs#;aQETEopZ#h zEzdLygAk3o^J3OlskzE&$FQezK{Jhu&+K6+^EgV_lQbHv-B6S4;28bNHJD*`^5zo= zN_ 4b{k;_(T?>|N53|pB zh`rA5pUi_bUy`b};IfY$5H?H4rr)_guf!KNiw_o?@jd+?sItM%m}FE@h(=a|e&wp= zvCi|tmU99Vp~o%PgI-S)jZA47#|wkX1B%1DNiblV$!!Z!WyMr2eKQgkn1S!~$T{oU zk__O4^Q$F{z!GTD+SqI4-_X0C)9tPn%8F3qI{WM~bAFV^Oxo(nS4+70gW}xT1?&y~ zf!91KFmVpr&k}# H@3qE(`IXe&P~i;u+Wd zCe*%Z>KBvLlU~?db5($GwXmh@`0*;H#i2^s7Gto46W)pzu3o=NG;)yRs4nQ@xjM-s zzRGxg!;x?EU~Qbc&Yp(>ac2Q`hk!k?Jl86SD!8M`j?Up+p`B!Z 48yM%co0YL~-Wrb2cikgIMyhRNVr zwC+An0Jb$%8%&h257I5Eb&ta(RMx8$lhkfS`Vk$G)P!PT8c8mm!= KT-R|=yc5$UlA`?8p~zFS9z+Up8_g&Y8=NI`y3E`pPPQLB3vAzZ{2#G;CH5N zjMLKYwDrdpX QCkW8U3dD!9u+?Z_2K0AXX zqq+6^rf7nlvgjo_#rgxUy{P2x^Q31=tyVXFFquo!tXk??#1x@sp@+ gNV48T$}dahxvRQaV9y-)O@jHky&JIj?tJnE8#Q`giKn>x)(cr$hB6IA#dC zv?XS7hoI&j_@3X%aa <{8z$UP+zTE2XQEPLxI>?1fps!?c?dUHu)vC8%VT_9QQ?}Luj!F(4Xl3uFq?pJ zYpyG9nOeT`qt7L>^X@Lj$7L{z`l?ff>d{4FCXS0A-g>>eVOsG}+bz$$frTYQVtC}C zxyNHJLI0Wl`gBmI9s+cP?5s-IlWFHo*q;JG@K*dI+~g>2m!7d9T}$eSC~_VHyLDSL zIi-mkUl`DR6&P HU`uU?Bd(s|?#jG)Sw6esbXXN*~$Oe{RXy#bw zpmf }TY3X}w}M$H1TDeY=bK1SJVJ?lK-hvzeYR#tF p8w-jV6XJ`{(FY6(-d|sm4CtCD}V^!%yzvY(+aE;qD z$pg>h95*$~)cu{q(?92{ 6(``qQTkH~8mEs!TY0H1&*9@)*b{?!r9 zHQg{ou1W)I^#4dIf7M3}ma-2{@{tS}(@e&CMky^5P``W#tK4im5Eem^jr1p~D;}BY z21eYUS%C`-9w#T8wKSc~_X{4#6D0PctJ==oCT(c$L+X7*Csat>5ax+O*37Q DS zYGjXcbJ2oo<#N@7!O+0y>Wc>q_b;9W4 3ZvCpU+~j# z9EaJ%Uof=TT>Nr5`3%)QmDharR<27R-Hd2fxP2&cYmUgAQX)|-oU^37ox#STp;L($ z3ejxZ5yqDg6Bpk}NRhC={6;bgMj4*LqpmKbdp3oh^}y@h>eABp(=9^Iv0oTS(Fc@Q zszgSdukABUk)4{_U-Z53&?l}H9g!@;X7=%})2LhIqMLd81mE3>s`uYv_c?aOB?4vY zP{bAij;jaT8@P=7wiJOI>fX+tH21Gwcqi^B0A%S2orboFvRWstn<4v 4sPz<# n_dN pwa!z*gl2l7;x|(V >SzzHKqT{Z$fgMK1Lrm7{H@indSCNAm|$hx>6HT1v&qa}@c; z!bHW%KUoOg)2mr(SLeJU2GMh%1Ijo4UXq{x$fU}F!4l^;>5wqkr2mTV4uO@-EAZCK z;^Nlr`L1Og4TS`h{!KtFFpk1}NzahD$nbG;;`uhPe*E|md|j#BB~ekj3@*L1S3!UE z>yt~oy!=plrKzBbsw!Ouxn8jHpSRkd3^IT(fyo|n`1dzH9z$oP2G5AA=7AoZYfh|{ zTW%{t+kci07U M z)bci!fAcJQI=SZ{%=zojORUam{XA?IvXwi~A4$vIY+Qz7y(1<(ONV_49EOc8uy-DT zGwfrvGMu5irAKZrsr~nx=8dmNA#NwqAQuMFx}NK^-6UQyj(@++5~#)iQ8wnjB?X(n zhx`J|X_%W>)IzdSqFDQv1%dmMZ)J Y<-L;;4%RT!kPPvu)m@aEo`y|2| z6VDI5x2-ZoinZ5?wV~+f)z9N$f{0kvcwor@KBT(Eqb4k#gtkbLJxivwEHoa6%Y4tO zE24k4_63qZ!5@KH9D?nO`%F#j!A?r_$(=D+|A}e?E`)$@k_H@Ws^3z$W`Ta^qo*48 z=~I;JT$|}<^B4Z}&l~v2 MR>9MTX;jDsR-eEH&kWYo`h+b#FHzhuHLmlmK6i^f&6c^S?I-RI7M3;?z`)nka zclTUi@fustNmm0x0&Pt85UF@|03Feei7N5y3!;de@^W|2eH|OH*gAWt?irZ3A7_XD z@CsTzLW=o+S4Uv*?p(3&h*eP5@93VYanAalnIi*5bT@6{B+W(Drwg>kRiN7R(Wvta zZ$hcIZrNj8kmd9T=+i~+%9!8BOA vR1RkPPS~}eGi(07EU`&zJ0vm`Rt})>y!@CB<6}N z3YXPqS8kLI@oVLP<=Ph3a{#%x5oZP1aq@K*=}zf%IkWj9dHc>P&A12a6d3Y^DslZ; zt6OvGk09*F1`NoEtJ8x+dCh9pgy@riN%2M86l*}yX`^qtk->@nC#z$NAs14Sb72^p z6^ml31WSyqC|@Sele`e*%lC`k50=>je{9b8E1Yb#rI=H=Tz#tr_VecVbBSk&YlH>d zB_xcnc!WShW~+@2em!~6hwGGO>E=s##Zx42^P Hho }>)f}ImeK6AYo!$LPT~Hl0^r$ hBAl++ze0HXWRQCtgon z%|Z7qP1aCpb1KfDn&a`R>)#J1EN~ @quX%a?z(eDPToz;2}C}6|Y_;__4CW&_i+~XY 8l|}6n tYyDq`d~H&A%$<+=mopT$#R+Gor|eis^F{f7jR5!)t4J@}LrP(eldZ5+HsSW%{H$ z#Msh$(L7M6_H#~pIJV0FU5;<7FMbrjfn2~M`MB}V_g*FAW!^M=SaQ=#<)iw=UMl&2 zoPf~{oat80bJK5m0d(sKG^F+FPCWm<;oLt?1$piUB!P_l!6$H2iV6$RpiNK$kk7D8 zk#PxQpO~E+W3|&HtKphG$2OLcAvwY_$F6g#9B{dVr^twM_@xEd5V+BU3vpluV1~1q z^0VK?YXbDC$l~ +aBSUj$ +LY0i(QV$ty@3cq4g(cq=q=0Rzw7Da%uC zgttk hnNVTEqlaZp=(pd6Gf&j^Y*xM@u*LXOv@8uW zVGP!H$Rr1^7OYC#5F1bP@hrw*5);_IV6eYt-JE` (Tn{KO(Uh`P>8Rj(~RB!Gyu@J?7-*MM!eU{^_g!kDvxoU-r z-&`->I?F8$AFp<#DIt8adZ_L3`$7D9f1;A{C@=T8fOU3aJTOtgfqvA|<50Q0%(U75 z{GbC3{S!zu5+Rt?z4xESfahN&KuNGEU}>g6`4&aXGJcL$i4JL)+TTm9ErlEh+Ysl! zWCX |y1N@19|Vj8j|w?n`xk73cW_vg_MhZ|-GLJ+qqCCT}#83eS={QHH@m-RN=r zFw^B20Yf7z-av+VZ}x(DP4pIn@QC8n9oQ!VQIEgKXdpLT+lC^M9UUotOAmh*Xnt9E ztG1S0&5bT910*%vfBQTG;#d1d1L}2cgVnho%&h|&*a=6Wv|_FBK`#lLiWo=W_IBtK ziaK{{xXsRdCd}G5Jj=}AsVJGPaPu4*`F%$VktW{Iif>x#;^oL<5wIqC 4 z&Ie8Y!=8Dzcg%s2YS(xxuthR!?Cr}Lee@2|d=y q~0SK~Dt*)=u(AZ++7 zPcf-{?hUXt7#JGb9B$9=LiyQ$mu%UNN4TsTo$c)ii!xPL*NZ?D75Dk`XJzgPdeuJ% zf%#tV1Q@l%FsiSwPnkO;2}~XTLhujHdk_GL)t#!be}7|34#JM!wt_o9Dqi@ Y 7B=8L_aG%m!5Yn=`SSC%hN~Q z48{((-kxN;JXMnXdto3q&ubw7R*o{kg{A>uiJbc9dp87$WNM0u0pA%NnPQXuFF>p8 z6>f7xnqsquesN)GA__YWIIkY;r}U3g*;0B1xoiT;*0|c86${rePm4@0*PIO=a-cE4 zb;aI#Wq8ecDDVOY{L3@3#B8dSVObh+a9`y{vyirM@XTV%Jn@C1q2T_0JxE?vl^ZT# zah(v2M i~KV^ Z8z0dYh89?*;o`l z{i|Ze`4T`7W}4w>KP~xFaN@gvR`#mY`s;_Cs(v>Z5y%F_;~=(s$8Dk*v@knO6JM9t zU*NeZ{_eOQS^6Y }HXVqD#Oq-8{&}W2SG~SXxrHW;yPT__&j@ zdZM<*_T?n(2F}Rd);(l<3WOo*z2BY45)z&dEFaEOavictJ`imNd aZuHFNE#7sMsNr%r`uFj8Eek ll`*$K!^3nfL-l^|P5|HWFI*pt2@N}qZtFtx9 z9vO<3zI#p&@Go+-s)tBZWUGw|1NJ^+HjXBAhaEu2eAkG!^h0{Kz5^&eIMeka1OQ>- z`ZLp!?im0|gTCXu7`2n7@sf*6>E`m?WwKQ7**F+FN#Ny ow)7D_u1VnM zBfg{*xswk3#PkNx4`zq*#wC?L!$SM4QJx>M)a!0KrM)k`bCZOlNw06;xSa{Q1GwM& zme Fj3B`MSzfpk@0QPB=zS0h#v_|Q?)ALve3+ +yFOuD3N(X?-8cK`>Z@H?os4u93~vyFvBh_naOu)StD8>Df8j*pK|$I`OQTdO^SEQk&4P^;Sh6|gN( z@>>=IAVpnGO^P=TLwxAJSdnw5zy5Cv^sM{h53yH9CHl|Br{YVaRRLiB;EAh|cj?ll z?5``jW@h9mU7=L46Oq1a93ORm0r~Q=&5#%f(WlEj;Y4M|%2b?8BayD Qn;>0h>Wn6}tk@o+W9xxs@C`~= zPx6W(mwtz;Q!Ff+?w8a^XhC}d+J#2GjWY6)mh?wmR#m1Kf4FbA$yiXmjSYxA;V*sY zH;9+wN6%`hu(anr-7rFFw@p5)8sS_sKI1Mmz2yz~8k`tHv9^`1Hub1JlIDfiEpv8c zN4I@t8~Z#M_pj-1CO9fTXv! `C @#VjGV9I-%b2g 8^eiMB QXI*2TAZ)GaPzby~r~@PeGgdqer^lg$DMQMqwK_E`mQn}X0*>)Ats0n*J+C|K*V zevFLeAfC&?q-C<7Q0^=Ft?1uPPQ(n}{gt7)J;fD >zWE5} zK>;3$W!4RTQom^B;j?LSOt4E%F_*Py9#lO;QyhS1s_h*L-6ek w zFMm$AA%5jn>&pA-rPMd0RVkla3z+=+?v~r2FV7P7=RKVrh85gv#3A>@mEfDUx3j^# z96;8t$&{vfkf0Bc*H&Q<$bmKqg3Jvm$yM+grQkwx8!Ymw+QOZ78cdVof=guzSWYl0 zeta#cYyMH!Jnq~*0#OS>CxxI-%Tc9KNaSZpvx`+w3>Xl3@5{vJ(=Y@=n?9;crB5$X z1Sl!JCUPCq@CbaH;JC#kZ085n!X8;S(Y->o5Ug&z3zzhfM6QHoO?!_^`oHm)6Jl9X zYO~LJ-yg`T6-Ea~&*GP6NiqZ&GOu#ls5a+$;&OqeSa0{cXWh)6_e`Jnv}>H^O}9F; zcW%tw1w*7!Uno@{;e-jhE2L${?l&qN9>1MjI(<55Xq`O}symBN;atPvF=+|p9=sYx z_u-1P*%{$6)neq~Uf1jSHI`H5qpz*T=+8 N$vfhliDZ`*^fHU&e z!(JnWjb6x&hx>QuZG%id^(ZLCdV0$j$HjcM|8NZ~Zy~9(JgySGBjVw+pULU%?ZUey z#cYV6%KhDz_1nD+dEmR&1KD5BA9z8>7-E4UYku7HeT?o8yk7g$3R9aRRzg7fu@^@* zT|J82kWIFZmP!}F17A)Mt`LS761;(Pn!6eF`UDzQc~UN$wX UNH3nT=(Ke+yM8%h;Ko1==z<8fL^=XoRdZo<%kl^ z%F&NX)UO^v3&{)s4`LZ#ihbxeh@@+?KSg*Zh7g>FX-2Xzaze rvqO>H*x z{=x=MG{ZYZRGYB)oMj-A8fu VXp_G_25f_svZ3mq)X! z_iKfl&Td{>x<kl8_Ala?=YIx6_=lqe9zlzC@#}2pU-TW-m1 OZJ~00qP?(7EaKbHD&RHfc>rT^nWIF1h#vs5Dk|?St0+m z6)zF5Vzit}v0?3mQ0;+di>L=_ta~K{kv3P?)&&>^$`N{ F2=XY)V2k?;5JgCm;Nb*d4<;ry75d2`^rK`Xuh6o$LcRr6!56}i4*c;= zk$1;(s!bd9{gMna*dAj-i95;8PjvcT03<)q@4`cu^0Ut `%C^Y9~L z(4nR)X58QP#lLq;X`owL!FEd*!~%JWg3kM)^)s-HbYR7Jmj2!?m`Z>;Sp~%^hvb9 zBrj@lUm{njZS>$S6{^RDAAJir@k%6>&nDnZ7R(3(<=Yxelfh2^!*6<|$1KGlo5&H2 z$`uM;QUBrt=sr+geYz~wxQPcXtV-VLAHebSJbQV0*=lSI8c20B3+fZjmfbq9$4p$< zT-f&gWpP{fMNYhEiyru*B?*MMT!2?6RkC!-5@(t<8niv(SRsh`;PyCB#9ZH ba`zpHQIgT5#e-i-uo_ZYh0_&4ka&3 zHaqRihxs|y8hu?}Qgm7K+Rr-H+0bMzdqyKY*MkuKq8h1gUmlQCQRHAWm?3tUFx8b? zguOmNvb>yl`K$K@Ox?wP2<>yi`1ReXt~vak;Q%!bwi~px_yT7V(3pSg=#`Vr#U?8l zPzbL$&7hsMef(GJ7+@6vyNLWXwxL6v&{)c1x`*ziQou&SW5yff4yY)n7hY`VI8MPN zAPCv*_4N{Db?H?6-OE-gT367z#^K-AoxFGNw!7k#>JpiW=70F{;Js*udGK)d5C=?Y z4EF;1j2&nfX10vJ+AP+SH=@O=H!Po9XJ8~) 3?qc-XcH9qk#n(JFu+L-@%Y=F=Dce@YCR(7zTQ!O)**0Yp@&oGT=?-Qml=%T zqQ=P>a~pFEcTvCQSR@DYtWq-{3RPOQEgD}}oJ*mc)xO_2vBRxFwbjNApR3-u)pwtQ z@r&KfOy;J;ci){K9Fe2b9f>jtnx(2wd)#doKjUpL4!tI)Xui_Qn0jU^)h$*lN y)nzs6dG1c=u}2y#0THS<7jgaM`vMhIIIeMGFn_F` z$~qedmxE;X!q_@lvj~ s_%PB+4Xm{wxBy tXOrQk1PrM4t_)3`YJU9N5^<;kSvs z3?`_`+CpGwQNp_KKLijWu9_4p<$mexRu#=#$sSmq*8DoN+e~eNtO*Me4axNrxA$?~ zwh`_h7?|1iJzsKL5 P7XMS?xrz37Dt)&rzrlSX5xfFp}56QXW=*b#if1{xzd42Ff+P= z^uU%X)Cn(ogvBd>?P|?rv{M%`Xi%5RWVz~Mtxs7U-gxcPu$jNo*RV&iI@u5vr>yD^ z|Nq)L&!{HaFM&_!7>Wvl(iITtP3c8YnuQ_)3P=J7(g__ENa#|eNL2_RML=G&NFxJQ||A!7EYu(A$CDS+%f2!prD` fA0CS95 VkE7`CxRX3ba@=Xd;$eP zdl_+%@30-Hwi045;waBVCQfRxOFg*K@MEbepTdvqlJr@ci||yQ=N7lH>tI!slUAdQ zPS{;vvofj<6|qdr)0R0J1!2(t@&$Zy9^eCg0r#jfO#eTY#Foek+z6*$*;FYG+*tTN zlANZ_=;(7ffnPJKug@($o@w50oR*1ce-12~_{w$NAL>?j1{5;1p@Fb1$0ftm)SW Gq%sN`|fPW8DL$H`%pBw=I_cwI$(T_GAN0%KmoOjv50q2*QHf;C(c+KRQ z^poWtdTW1rt7q5M>w|5s6DFue%e%#OG{JtA?z2 %7QQL4&nU7|s;5@@=Q`1S#%^0oyu@blKn zhttfoR_V$3w&tUmUUqhN0Wb#Xatb3bI6fW?ihp9mf5;0^db%rQ6GCt>BOLd*Ycjpb z4g1bP+%MKN^HBxbq(gR~`}^;$!uBhXPc`02xBT|BkozXq<|_hkwU?4Y9{?fSIQKx( zOQ;h*{@}A@>u~@+ _04hC8O`pV!1}_*?(xwotkz7iJhotJ|#fYxYvGiU$9B^xfj I+v|pKJFNIy5_m^@wMv~8EltF zCbF$l4B{%JL_XU@uU{(^;+V|6c`vn)%J?bLp^anqsx@8HG)wUaB(V!js)9OQEm5{f z)U>gTH>}Eu=EDYd$Tjm}S5%-Ug`)Uw4x&TuZ(`uu((mu*d3 qA U7KL$nSQEMrf)B!9$h#Php1>$S7ZIlJE#REB!KQRi~>28aVf2 z-RP3&t$PrC#hUVsxz1sZz($z;rU+(YqD$}D$&i9u`}>EHE8g*QdX!pP_YMy7XX<7* zw*~EJ<}55hy~WF+!7l7rbz-c}8v42QM$o1ajBpLW`NT0dvxtyO1z4vGq}1@=6!ulV zEvbemIJLjPFc)LkQvYQf!+BrnP)OuPs}7;Hd_^w1eo}{^_-?JLxR%}{ uUMIM=U7drd;(A`)xTe=Y&ztUikz( z&V+Yo(S+M1rpXuMN`A(KM6(sh`J5pYjZy_1U(-HN;nnzEpBFM1#_cV?lb8eHX&8(g zi*tiynm%9vO5S8gvk59N9WQy(rL@x&(%XEBS>9??LZzTNtKE*-KL@-&*QMIDqa%W0 z{;}M;a+YU n^9^8#zocm3ni2r#*3`Mjv zW0>fu7Ohmr*V~RG&eo3nS_g$Z`~1HW!`+u 7+3k#;u! TwF(B*Y)cY6Gj^D0i# zbE^&EDed@pWvC^9mFZ~;J_pFcg!36~I};mBzwI(tb?`Tg6s09;CDN0AnA{m#TiB!Q z=w #Bbz0#LjVFQW~72<@u<(jM)_brfy!jMN^1z7 z6a{NEW3=8%xC6kMFoT;~_Y1EW& rzZ zcP&6^Xv>%C;pItUVnUVauXPXBsdBfq{HzQ7i*_YvzlE^Yk#OOxXVJf8lQ{#y0ERzv z7EHEshXzf^o@#pTX5Ea{7;99=Vxr?es|ncmDKoFGt_09{Ldx7jt*rT&8m7B{x(E~f zdl~Me?Ai_{mWQb=_!nT5xsrHe*$VqR04Yv4K32Gl{%++!9}Vz$ Q~(- zDpjheIhx5Wp3c1fgoJk6w$+<&1SnkL5ao=1yS lryL6TF{F*z_3hmxYExn3$OK z6Bz5WeH*JRo|>~S)0FtDdMvnh_9Go>s~CWp_FU{!dH`|oMGZjtt%%_FRNF?sgJ09o zC-3G4g_}xgmCoF(1@wh e z0fG_byngqjV1kO@yXkE;Q^$y_Uf1(2yLV66gEchfedm6KQdb4|-3aJlzE0a@zN?>f z5oMe$a1uOExbf(b(^M^e?SZ8RC4MBPg8Br$vHmr?=hi2YMJhlyI+}VnEj1&f`1qIc zJIK4R^lVt@?ymRwm%5q#js~OJwnAW}e2?K%H$da-ra-{um(PbJfU^cBuT(0kXn&B< z$Eoh2MsGwl#y!9jQ7tt5AlDY8q1js-;bV$RTOTZEKTHljpHt%L7qLC?3vRl*gkqet z#1(6tE7mGVu4{wjHI*|@)3fH0_B!r`Ao-^>HRCs<=sw+8dB&-t<*g3!HcUb^$ozW7 z1>U*c`;f^HtuB&9X^9#zTZS1B2!xC71(F^dsHu&>A&CyR)b#Y&1V$(l$iK# O;zX0~pDRaRL51*~|jmUov)-D$n6;0-0 z9i PoxA-3Z>ueBy%OwV#d+yym!y>L zlJj2q#l_sT6koQ_?&XMMyKjl{314JH`DuN6+kE}=cD~A*G2X*a9WBF-`zt&AcWHP? zq)X(Y-t SKF>%J(ayd? DQ^ za8mjGZl%!2NTfs)?&SFRzWe;e3S%iLDP0E#;Xk4UL$mU0YR;CKmuovX6wUeSQ>d`5 z+5)MD#cb22-E(3(v*tJTy-xR22_& D8XnwQ_+{0`F6eRXplNL{@gq z&x&hihtUe1`bdw0dVh^6b9x#Scl#VCr>QXfbL?OJoXgS=sIch}uppgR0?vDTSGnm3 zN4fj&*Q0eR459rWoCojZ#^kWQ1c2rl;Q6Lds&r Hx6^g0D zo?J@m>Fw;*feP|cC2hFRib1aO$o%+s6Icc6wyh{Q`#|E)kNAZv;mYGx6dtlYP8I9G zt&D9x384eL?_SRI*^^O~reAJs%-i|6EAL%HSR3~7Mocm*!o7zax;MGMeTZi=xD-J| zZ^_}854g^7!>w>+q6C`dDQ${ZgL&LooH{rSWFF?S__U{1&%C%0nQ3Vq_I;$dZDk)` za|iV1 -f9gNvZG>)-UqmxrOB9tZXcF`M=tTlMYk?Y#km z WV+=9xKW?I5-%*xMS+0>xG8S t5oU6%_ytwc1>~wNUbJy)#F<%9)y4nIF!|9w0MO4o=At& zRXfLu{YN5QumD$_T ;f5!=4+?Lvuk^1h+b0;z>{+x!7<1H()5@~$5= zSW8DBKZnEBf&Tvf2X$^2xMv57$HvTC&JIpZi5+`P);K63Z~#-wsdDhqiNv4~ykM%@ zACG!|AvLNC_9$-A!Ugw%D%wbX0^h$ZEaE}fla^f@HU!#SqjS2h#((_uM*;3$ehez@ z*ZD>0^~ByzX}VNbxr-Q$Qz=?gRLDQ7(~kv#DIDE1AEj?NFm03CH&QaiXHl$D0 z^^x~eIsb9kg*0DT(V0KVg>6nF7?B&;toV6)H8V1-%Q+kiAg@~x%^M-(ORm7np@{XX zaoRm$t^+yh7bUy0Bzm^j&dfbyU-)VUXs<#LD(IluEtvA0CCMA>l?Gf7W<}l08C`hE z&ieO^a3!Sb&?*a6&RUb3d)&e5V3b2!m!uZ7HX)nhc}E>Y-;N$EpZ!JXNEN-~^e{`r zTDZMoNGRT#OWDi*IP$Wf+66j+4uMi2)7SEG>G=#YsUVbK#h-czM-T=S&nG2kg@-h; z*@U0r%ZS^8Kv1PzbjuFu5B?#W3x{8=ntw^Qs>*$G!7-YL{(65fB=7K}I^#yz;nw?l z%!XF9?C2rTmnj=AO{Axzt3pyjfVOMn)`E>Qj y}k3|khh1xl_Hpw=TB_K z<3J2zxBg*C*H5?h5CyBRWR{&V7-cueEm!kjy`%^J;NP+7#@Cwo=;?Kg!(OnPJ3cw% zDt_sdG)t}{0&k9sDuwCn!PVEDEzghmIjwMiecvFA-?kRN>~J2@&Y6@b4pinUGsBpy zCeQ6W_Qm=o;))Wx@Ntf{TM=tpR2oxKOVsv3s135F!^hd<*CSQYO zIDfOn;JxuPAR>~Ih$PyBC?MoO+(Z~9P9(K1bHKsnSAhLO*_TEMm&Q6ut8HyHrD}50 zKJ9URR?LXkYg&zb(f@w>^yG`bOvsf0s-7!EL=4|B08}YuNt&(u`?oZIhXd>WkGT(& zhDPG%$||%yJfxa_yZmJS%ans;-69RjLi+`=%}WEzpT=iO+VwCOG?>XjZ!OCeWLwvZ z)ijM~`5AM2HG%AvRkpnh>E!-a%ISzze;W6qS++& Hu}JbSes4k-1|QA0Lk+HdJ5n*-|4&^dJ$efWINJ z?fHp-VvqZAk8jI1_Ao_62z#>E+MwM>pVtkm+o1 1wEC4 zkJWJqJID6NzT_f9S<0=TlizYLx_Bei^VfIQMGIuONMWaGlHZ(AalxN39DVq2CSxyY z%X;0$CZ|N(_`!p2i}XL)J79RQub m!Q8%$ifoo0B-L|FnP1A z3~FKRMf<0Lj#-&G1pb_33e%;gc6@w%GlX%rJEY6HJtzC6-E-p0+mv;2{MX%Qyk5%W zTxp4 ?`?6=`d}&dU^t-;D;Mx*xwba)+d43y{Ly`VT@XVNnsjQLn zqz#HUo@VyHl@$DEspajhjjL@rIXOvNys^7`dtSdsMO(Hx%^9XJ7@ahrSek)tJa+3- zo{j_PqET<=KRIe;00w`L7dRbWn=n1$1)kt%Xo>|;DPR)1tPxrza&B&}N(>U2F_SV# zg}25aPbGY7rJ^F5zfw3G!_FV0Hcv Qop`d%!nwu%TC _h^fIcPA)tR_&Mb zE@dcs+QUu3VGfbB>H-eFway}qI&JDpF4Vbfsbz9f<-YZ~ZIPIUg(wy(W)aX}-lpBa z;RL*Wd Cl_H{`5#xwlQhjJ@mN@$5r2r=2mq)!&jjfFNm8ULh rJL;evqMhI IdzvlN8mp0t6?L zC@NhoTCN5Ed+OzhREM2?r-Mx7L(V3HP-gx1?!C%~GR;DpjN+w5c+}HIaw_>RjR?Zd zk`q}b>m3|f;gJjh?Z0iU%r2fV1(j5E8O0cxJyNL5Rk*VeAg|Qh8^Pzb*n&w>vddj8 z7XHnWUr=?zvvNP{9i!C{MQ-wy2*cx+fLpAhwG8X*SxpK`; Mg7=ovF~R3ONy6wpS-!vzg+fQN!{ir&kQI@ zjK5_C)I7F)kkJ)ZIXW;Zp(3`G_vRvSTCSR4V7+&z^)#o-rAdG-a)T3-XqCrutcqfB z3%ic+m4$-B`?}87Je1)e5C=#_K~~!%bEnDM>DpA*89Jp!lriWEo}2<{c=X4cT==H0 zbb_;w4b%F&ZdN-M@22Yn8_1h~H_h} MoBk#p zKRXXuRA@<96 `doWM~ba^oyxLE~hHO zcg=D{4KTi_^Fz6ApVd+Bo8)pG1v8EE`2K;H6sz_|wQoA2neTC(?(Xb#T-f9!VI5HN zH$Wec!!#tC*Kh1!kLcdd3U1oZs+>!6hqQh8c%BcM0Ou}24)A)08TXx!)y}!qG@dC& z%Qj2f-^FZWn`64Dl&`bpFCsnlkDB)Dv zx}f_(L3zR V~;M{!><#a&!5(G^_*PA}+H!X@fQ^*_ZBapLMfQo-Kg zWel`*tBajC^bbZy+=$FFEG8eUN}FZeC8M%W%VP;X-!i)oI+=knR0dS2|5%)p{(80X z0DKiM+>P?Fpx}p^;MHX=5ZXV4gVgVrTH}{$lg-c}c6N2A8%;?fq)I$NG%!2chGjci zIn3Y-S$x*-_x#?}v4#`L$#^tUw}9{4#(i@)9<`k5e2o>M^FJWGGJ%j~8l9TjaHq5Q zkT$y@H*@a%Q(_^vcArakO=|O@Sw4-3P%|D0@42}LTW~z~ag{9ocbcH7Axq$nJRI>c zbtr#vd2p^pEy*r!UH4jLn&^wnU$bI~S{Ehe>j&O<5=A7hJXF z2uc=7wkykCy^gux EOy@A~GmwAAauv^(PNv*v#k;O*@V9T5?w?AX>z^FE3tK9Q#-a`he0*nK zYTIAXsIVGOU=V8Gj+L>2u X1?3|f3<;{3j zYp>Z(S}Whvs*gqGHrcJOS_cq;fpL$Q7UNx3Le<{e@XtJ$(3hFVLO&Wn%oi1rgYRPq z%suY}vFU!DuO>Kez2I-GJNdka3^&$5l%CR1N*%-mYC_CgxrMKBbmA^TGPrp8RV{0; z-GztT{cxvCle=!_m}dPGX3)pdeXjNSd)-dh!f@U8}_&S}K2M@QNfJJty`#4)S{I#zqX{H$M2#D8((N+8oeacXD&AD{kC(b5j7l zt8~yBPAS*6 mfANSkQE;lb>3hk8&07Z^+?dHc~#YrTNn$?_f%}j&!JwvI2jgpURFRI zOg}iksG{`oH6->s-(h*0`H*g^6dI}l(Gi=jTsdFLnQv+MAipU-8Dm1CVTjoVekoax zztd#$OKh=ZopuWJkOM^(zgCJSwpUOJMT)a4(d4u>mS+=#qj6)*W-ARAiFe-j-k>BA zGn5i89%6Rd6IwtWRe7OypVmn;#Y~nHNH9p$Fc(FaFXtG_7>7#v?BQurY-qU(bS<%i z9*?BP$Hqb~6MqU0!02u$&BaDs?S5e~LwIaPPV)Hb_-*s$4reBjWw-XX(2XE$1)>_{ zpI-~Jm9V!`tlmYXM5&ydMi3qKr3lZ -dSxj7Mv)1S7 zzFkM;dhT=CUo+m71ieRo)K%EE$