From 38f7821dd65fa8e0272c8c8df0c08c2e5bd23886 Mon Sep 17 00:00:00 2001
From: Kraseo Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives,
+ this kit will provide you contracts to take on for TC payments. Provided within, we give your specialist contractor space suit. It's even more compact, being able to fit into a pocket, and faster than the
+ Syndicate space suit available to you on the uplink. We also provide your chameleon jumpsuit and mask, both of which can be changed
+ to any form you need for the moment. The cigarettes are a special blend - it'll heal your injuries slowly overtime. The three additional items, apart from the tablet and loadout box, have been randomly selected from what we had available. We hope
+ they're useful to you for you mission. Be careful when accepting a contract. While you'll be able to see the location of the dropoff point, cancelling will make it
+ unavailable to take on again. The tablet can be recharged at any cell charger. We need your target for our own reasons, but we ransom them back to your mission area once their use is served. They will return back
+ from where you sent them off from in several minutes time. Don't worry agent, we give you a cut of what we get paid. We pay this into whatever
+ ID card you have equipped, on top of the TC payment we give. Be careful when accepting a contract. While you'll be able to see the location of the dropoff point, cancelling will make it
unavailable to take on again. The tablet can be recharged at any cell charger. The tablet can also be recharged at any cell charger. We need your target for our own reasons, but we ransom them back to your mission area once their use is served. They will return back
- from where you sent them off from in several minutes time. Don't worry agent, we give you a cut of what we get paid. We pay this into whatever
- ID card you have equipped, on top of the TC payment we give.
Completed [completed_contracts] [pluralCheck] for a total of \
+ [tc_total] TC!
"
+
if(traitorwin)
result += "The [special_role_text] was successful!"
else
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index adfbe3308a..d31b18e1d7 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -42,6 +42,8 @@
var/soundVolume = 80 //Volume to play sounds at. Ignores the cap
var/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map.
var/list/explosionSize = list(0,0,2,3)
+ var/stay_after_drop = FALSE
+ var/specialised = TRUE // It's not a general use pod for cargo/admin use
/obj/structure/closet/supplypod/bluespacepod
style = STYLE_BLUESPACE
@@ -49,6 +51,15 @@
explosionSize = list(0,0,1,2)
landingDelay = 15 //Slightly quicker than the supplypod
+/obj/structure/closet/supplypod/extractionpod
+ name = "Syndicate Extraction Pod"
+ desc = "A specalised, blood-red styled pod for extracting high-value targets out of active mission areas."
+ specialised = TRUE
+ style = STYLE_SYNDICATE
+ bluespace = TRUE
+ explosionSize = list(0,0,1,2)
+ landingDelay = 25 //Slightly longer than others
+
/obj/structure/closet/supplypod/centcompod
style = STYLE_CENTCOM
bluespace = TRUE
@@ -56,6 +67,13 @@
landingDelay = 20 //Very speedy!
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+/obj/structure/closet/supplypod/proc/specialisedPod()
+ return 1
+
+/obj/structure/closet/supplypod/extractionpod/specialisedPod(atom/movable/holder)
+ holder.forceMove(pick(GLOB.holdingfacility)) // land in ninja jail
+ open(holder, forced = TRUE)
+
/obj/structure/closet/supplypod/Initialize()
. = ..()
setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly
@@ -76,7 +94,7 @@
return
style = chosenStyle
icon_state = POD_STYLES[chosenStyle][POD_ICON_STATE] //POD_STYLES is a 2D array we treat as a dictionary. The style represents the verticle index, with the icon state, name, and desc being stored in the horizontal indexes of the 2D array.
- if (!adminNamed) //We dont want to name it ourselves if it has been specifically named by an admin using the centcom_podlauncher datum
+ if (!adminNamed && !specialised) //We dont want to name it ourselves if it has been specifically named by an admin using the centcom_podlauncher datum
name = POD_STYLES[chosenStyle][POD_NAME]
desc = POD_STYLES[chosenStyle][POD_DESC]
update_icon()
@@ -96,6 +114,30 @@
/obj/structure/closet/supplypod/toggle(mob/living/user) //Supplypods shouldn't be able to be manually opened under any circumstances, as the open() proc generates supply order datums
return
+/obj/structure/closet/supplypod/proc/handleReturningClose(atom/movable/holder, returntobay)
+ opened = FALSE
+ INVOKE_ASYNC(holder, .proc/setClosed) //Use the INVOKE_ASYNC proc to call setClosed() on whatever the holder may be, without giving the atom/movable base class a setClosed() proc definition
+ for(var/atom/movable/O in get_turf(holder))
+ if ((ismob(O) && !isliving(O)) || (is_type_in_typecache(O, GLOB.blacklisted_cargo_types) && !isliving(O))) //We dont want to take ghosts with us, and we don't want blacklisted items going, but we allow mobs.
+ continue
+ O.forceMove(holder) //Put objects inside before we close
+ var/obj/effect/temp_visual/risingPod = new /obj/effect/abstract/DPfall(get_turf(holder), src) //Make a nice animation of flying back up
+ risingPod.pixel_z = 0 //The initial value of risingPod's pixel_z is 200 because it normally comes down from a high spot
+ animate(risingPod, pixel_z = 200, time = 10, easing = LINEAR_EASING) //Animate our rising pod
+ if(returntobay)
+ holder.forceMove(bay) //Move the pod back to centcom, where it belongs
+ QDEL_IN(risingPod, 10)
+ reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() )
+ bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever
+ open(holder, forced = TRUE)
+ else
+ reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() )
+ bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever
+ QDEL_IN(risingPod, 10)
+ audible_message("The pod hisses, closing quickly and launching itself away from the station.", "The ground vibrates, the nearby pod launching away from the station.")
+ stay_after_drop = FALSE
+ specialisedPod(holder) // Do special actions for specialised pods - this is likely if we were already doing manual launches
+
/obj/structure/closet/supplypod/proc/preOpen() //Called before the open() proc. Handles anything that occurs right as the pod lands.
var/turf/T = get_turf(src)
var/list/B = explosionSize //Mostly because B is more readable than explosionSize :p
@@ -172,7 +214,8 @@
if (style == STYLE_SEETHROUGH)
depart(src)
else
- addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time
+ if(!stay_after_drop) // Departing should be handled manually
+ addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time
/obj/structure/closet/supplypod/proc/depart(atom/movable/holder)
if (leavingSound)
@@ -187,20 +230,14 @@
qdel(holder)
/obj/structure/closet/supplypod/centcompod/close(atom/movable/holder) //Closes the supplypod and sends it back to centcom. Should only ever be called if the "reversing" variable is true
- opened = FALSE
- INVOKE_ASYNC(holder, .proc/setClosed) //Use the INVOKE_ASYNC proc to call setClosed() on whatever the holder may be, without giving the atom/movable base class a setClosed() proc definition
- for (var/atom/movable/O in get_turf(holder))
- if (ismob(O) && !isliving(O)) //We dont want to take ghosts with us
- continue
- O.forceMove(holder) //Put objects inside before we close
- var/obj/effect/temp_visual/risingPod = new /obj/effect/abstract/DPfall(get_turf(holder), src) //Make a nice animation of flying back up
- risingPod.pixel_z = 0 //The initial value of risingPod's pixel_z is 200 because it normally comes down from a high spot
- holder.forceMove(bay) //Move the pod back to centcom, where it belongs
- animate(risingPod, pixel_z = 200, time = 10, easing = LINEAR_EASING) //Animate our rising pod
- QDEL_IN(risingPod, 10)
- reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() )
- bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever
- open(holder, forced = TRUE)
+ handleReturningClose(holder, TRUE)
+
+/obj/structure/closet/supplypod/extractionpod/close(atom/movable/holder) //handles closing, and returns pod - deletes itself when returned
+ if(!holder)
+ holder = src
+ if(leavingSound)
+ playsound(get_turf(holder), leavingSound, soundVolume, 0, 0)
+ handleReturningClose(holder, FALSE)
/obj/structure/closet/supplypod/proc/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open() proc for more details
update_icon()
diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm
index 54e43a8731..154e3b5e41 100644
--- a/code/modules/modular_computers/computers/item/tablet.dm
+++ b/code/modules/modular_computers/computers/item/tablet.dm
@@ -20,4 +20,16 @@
finish_color = pick("red","blue","brown","green","black")
icon_state = "tablet-[finish_color]"
icon_state_unpowered = "tablet-[finish_color]"
- icon_state_powered = "tablet-[finish_color]"
\ No newline at end of file
+ icon_state_powered = "tablet-[finish_color]"
+
+/obj/item/modular_computer/tablet/syndicate_contract_uplink
+ name = "tablet computer"
+ icon = 'icons/obj/modular_tablet.dmi'
+ icon_state = "tablet-red"
+ icon_state_unpowered = "tablet"
+ icon_state_powered = "tablet"
+ icon_state_menu = "hostile"
+ w_class = WEIGHT_CLASS_SMALL
+ slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT
+ comp_light_luminosity = 4.3
+ finish_color = "red"
\ No newline at end of file
diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm
index c793ae22f6..c72b3061d0 100644
--- a/code/modules/modular_computers/computers/item/tablet_presets.dm
+++ b/code/modules/modular_computers/computers/item/tablet_presets.dm
@@ -27,3 +27,15 @@
install_component(new /obj/item/computer_hardware/hard_drive/small)
install_component(new /obj/item/computer_hardware/network_card)
install_component(new /obj/item/computer_hardware/printer/mini)
+
+// Given by the syndicate as part of the contract uplink bundle
+/obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink/Initialize()
+ . = ..()
+ var/obj/item/computer_hardware/hard_drive/small/syndicate/hard_drive = new
+ hard_drive.store_file(new /datum/computer_file/program/contract_uplink)
+ install_component(new /obj/item/computer_hardware/processor_unit/small)
+ install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer))
+ install_component(hard_drive)
+ install_component(new /obj/item/computer_hardware/network_card)
+ install_component(new /obj/item/computer_hardware/card_slot)
+ install_component(new /obj/item/computer_hardware/printer/mini)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm
index 4109b2c3f0..303c74a8f8 100644
--- a/code/modules/modular_computers/hardware/hard_drive.dm
+++ b/code/modules/modular_computers/hardware/hard_drive.dm
@@ -158,6 +158,13 @@
icon_state = "ssd_mini"
w_class = WEIGHT_CLASS_TINY
+// Syndicate variant - very slight better
+/obj/item/computer_hardware/hard_drive/small/syndicate
+ desc = "An efficient SSD for portable devices developed by a rival organisation."
+ power_usage = 8
+ max_capacity = 70
+ var/datum/antagonist/traitor/traitor_data // Syndicate hard drive has the user's data baked directly into it on creation
+
/obj/item/computer_hardware/hard_drive/micro
name = "micro solid state drive"
desc = "A highly efficient SSD chip for portable devices."
diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm
index 23fb23f198..8b29c246b9 100644
--- a/code/modules/uplink/uplink_items/uplink_bundles.dm
+++ b/code/modules/uplink/uplink_items/uplink_bundles.dm
@@ -30,6 +30,17 @@
cost = 14 // normally 16
include_modes = list(/datum/game_mode/nuclear)
+/datum/uplink_item/bundles_TC/contract_kit
+ name = "Contract Kit"
+ desc = "The Syndicate have a number of urgent contracts for you to take on, become a contractor and complete them for TC. Upon purchase, \
+ you'll be granted your own contract uplink embedded within the supplied tablet computer. Additonally, you'll be granted contractor \
+ gear to help with your mission - comes supplied with the tablet, space suit, chameleon jumpsuit and mask, agent card, and two \
+ randomly selected low cost items."
+ item = /obj/item/storage/box/syndie_kit/contract_kit
+ cost = 20
+ player_minimum = 20
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/bundles_TC/cybernetics_bundle
name = "Cybernetic Implants Bundle"
desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. Comes with an autosurgeon."
diff --git a/tgstation.dme b/tgstation.dme
index 6fe8ead35b..44218f00fc 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -79,8 +79,8 @@
#include "code\__DEFINES\obj_flags.dm"
#include "code\__DEFINES\pinpointers.dm"
#include "code\__DEFINES\pipe_construction.dm"
-#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\pool.dm"
+#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\preferences.dm"
#include "code\__DEFINES\procpath.dm"
#include "code\__DEFINES\profile.dm"
@@ -1468,6 +1468,7 @@
#include "code\modules\antagonists\swarmer\swarmer.dm"
#include "code\modules\antagonists\swarmer\swarmer_event.dm"
#include "code\modules\antagonists\traitor\datum_traitor.dm"
+#include "code\modules\antagonists\traitor\syndicate_contract.dm"
#include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm"
#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm"
#include "code\modules\antagonists\valentines\heartbreaker.dm"
@@ -2474,6 +2475,7 @@
#include "code\modules\modular_computers\file_system\programs\nttransfer.dm"
#include "code\modules\modular_computers\file_system\programs\powermonitor.dm"
#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm"
+#include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm"
#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm"
#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm"
#include "code\modules\modular_computers\hardware\_hardware.dm"
From d93ade7e03e8c68b4ce856d1718f1769e612063d Mon Sep 17 00:00:00 2001
From: Kraseo Using the tablet
+
+
+ Extracting
+
+
+ Ransoms
+ Extracting
Ransoms
Good luck agent.
"} return ..() @@ -456,6 +459,7 @@ /obj/item/storage/box/syndie_kit/contract_kit/PopulateContents() new /obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink(src) new /obj/item/storage/box/syndicate/contractor_loadout(src) + new /obj/item/melee/classic_baton/telescopic/contractor_baton(src) var/list/item_list = list( // All 4 TC or less - some nukeops only items, but fit nicely to the theme. /obj/item/storage/backpack/duffelbag/syndie/x4, /obj/item/storage/box/syndie_kit/throwing_weapons, diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 791724d162..d05d1e383d 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -31,14 +31,26 @@ ..() /datum/antagonist/traitor/proc/create_contracts() - var/contract_generation_quantity = 6 - var/lowest_TC_threshold = 28 // We don't want the sum of all the payouts to be under this amount + // 6 contracts + var/list/to_generate = list( + CONTRACT_PAYOUT_LARGE, + CONTRACT_PAYOUT_MEDIUM, + CONTRACT_PAYOUT_SMALL, + CONTRACT_PAYOUT_SMALL, + CONTRACT_PAYOUT_SMALL, + CONTRACT_PAYOUT_SMALL + ) + var/lowest_TC_threshold = 30 // We don't want the sum of all the payouts to be under this amount var/total = 0 var/lowest_paying_sum = 0 var/datum/syndicate_contract/lowest_paying_contract - for(var/i = 1; i <= contract_generation_quantity; i++) - var/datum/syndicate_contract/contract_to_add = new(owner) + + to_generate = shuffle(to_generate) // Randomise order, so we don't have contracts always in payout order. + var/list/assigned_targets = list() + for (var/i = 1; i <= to_generate.len; i++) // Generate contracts, and find the lowest paying. + var/datum/syndicate_contract/contract_to_add = new(owner, to_generate[i], assigned_targets) var/contract_payout_total = contract_to_add.contract.payout + contract_to_add.contract.payout_bonus + assigned_targets.Add(contract_to_add.contract.target) if(!lowest_paying_contract || (contract_payout_total < lowest_paying_sum)) lowest_paying_sum = contract_payout_total lowest_paying_contract = contract_to_add diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index d31b18e1d7..e82a2141eb 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -233,6 +233,10 @@ handleReturningClose(holder, TRUE) /obj/structure/closet/supplypod/extractionpod/close(atom/movable/holder) //handles closing, and returns pod - deletes itself when returned + . = ..() + return + +/obj/structure/closet/supplypod/extractionpod/proc/send_up(atom/movable/holder) if(!holder) holder = src if(leavingSound) diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm index 2a0a7f947a..039a29a69d 100644 --- a/code/modules/uplink/uplink_items/uplink_bundles.dm +++ b/code/modules/uplink/uplink_items/uplink_bundles.dm @@ -35,7 +35,7 @@ desc = "The Syndicate have offered you the chance to become a contractor, take on kidnapping contracts for TC and cash payouts. Upon purchase, \ you'll be granted your own contract uplink embedded within the supplied tablet computer. Additionally, you'll be granted \ standard contractor gear to help with your mission - comes supplied with the tablet, specialised space suit, chameleon jumpsuit and mask, \ - agent card, and three randomly selected low cost items. Includes potentially otherwise unobtainable items." + specialised contractor baton, and three randomly selected low cost items. Can include otherwise unobtainable items." item = /obj/item/storage/box/syndie_kit/contract_kit cost = 20 player_minimum = 20 diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index bb4289a86007238caa8c58cf64e6c42a1d90fe04..bd038883a0eb61c03d8e5b7bf94feb497c7d54af 100644 GIT binary patch literal 2761 zcmYLJ3pf*e7oTp5$fcFnTPVFE)p#)zHbM-eSRuDGxwG8aY>1I0*Oa;SQSNOtDU{1p z2rai<=90_EUB=dy*|*;B>-*00{LeYR^PJ~Azw>*}^G~{LWhy2jD*^xj#NcMeHUNOo z4Z$>a*|vC*ey%KTZGtaO9s z0*q5L9~xyF+Fs7B8NVU5&BN_{njfM*DI}L=3jTJf2#r$OmytMqqGE(MAD)u%kx7`v zea&GF3Q@U)A50RU|9p7(i-4sB zbbeUlgZT~Fa;|%dv3PHRU=N|B*EYG_jAC8ZHXN?f#dKNnKSAxdhFj<3659(zCWKE} zm{c;ER)jqZ8e@N@kk``QB^poCueaya2*3TNSCpe~bhG`%&IHMNTVK1Yr*_dmXsRo# z#dj`9&2}n*n_jp!B0OEgL&eMOVviW9axuuGz)!w!Wy@^4=yKq!KnvT0^(re( Z*dvdKSz!y z3^Jbsvkjv0k5@+_n3!J*q)}DoyxMGTGa{zWSeA@_?`9J{(PfBiI2G`iU&n{;Thtkq zx21%`75x+XS#f86ENZDZzSvL5?mbS}I74K48g4cb;rF@5q8B62$Rbi?>h*$-L4OFL zpN 0?kKg7NI)wQ%~WSC{rmcV9IbpFQQbb1LwZ4yv{) z=gXgOI(Mt{9!z<@jwqWZ+s|j@4&l>&r|k g;i6?wxx%{*eO*z;`Q^g)Xlu&oq zkV29IrAy=JUx^8NeWfTpFUd0SlYg@u9R4Atr#aSrJJ}Hx;eUMY?<}523$>kfh+=2r zIvsZVhkkn1H-6*r8DZXR8l{e~*OjtPqYsZLu5a-adKU&~ZG^MZm0>|$(^)dLSz2_I zQBR8A;p#WZd*7wbU)5#fllV~h`-gVoqqo0*2S^R!o}JcOS=cob&3fd{0pq{RanT~$ zl>?@Z3VCfCb?fv=UKZGVfy8Oq+byiD*G`0nOYl)<;jim!9c2@EyC1tG9Ff%rgY_I< zBgguF2cp&+gIzXj9jhG&L7|g?**De1yQT FmJk(MCMAi;|fvV z0~h)`9LmWXUL)itjHpdyyCyI}d1M&494!89(R_^FY80u`{frvx1Xr8fJ03*Y?P3HD zu^`$hMojk|pwS#1(iOvh6G%*RA4T#+7wEJhgZD?xn}~Kj32Wd1_$Mo#>$lS>SQr2Z zzrL-l`Jh<|MLc*Ui4$J=aYaLh$KYL7z?!6NI@qGl0OWX|vMFq;VK^1tVcYY**-j=l z3I*ZZ2}K%Pe$x>X?TzHVUs1W006N-;-l5vU!D+V1JGfJLWl|CzYU?#%TfI?iGMWMa zfd>;eI&{+>fQ{(6K6x522vk`lCw%-wmEnO_u3n602L5McA(I@tcW#u)ChdyQe6@v| zVUbZbZav-mj{cy}{eT98Nn$%Pa90{%M5x{{1Eul)z)*YrllEiJC#pg*^wFa?>+Jh@ z=>1N$tTheSS|=)i?0+s@=gh7dTEy$R;19vgHV*mkpHw~9w-G{!H2GD^6V~i!ow9bA z>@fM|OC|ff#-miTCB%s6-1WFSVt@sW%6?fvA<3-bVZobml1it|XsKx?`Z=8|wBK(e z{*GaW;z{6rVxl(iJ|(5=sNHrp$JyCg%hmPrv6BM%O%mmTdVl&rr>y`$BW*e44JaQA z{3U1IZ+E{OX^6V|T_@O{YS&!`PXEn!Y?g4@XpRzi$()SC<=Egofxi5tC-yxH-RW@V z`(axe0k_%N6dm=J`qXG{CxTPPfqwtz0vA yf@4oreKxbzu z1;2Msj>sw#&!mQk_+_W{u?jyBk5Ss)s2yxu*cE}pg*iDnm3_C)asU>_^%tD3eor*d z+sGV|kButs%ESvQx#d??U5yb`Vh22yKl&b|HdQwnP>; +0(2OW`+*<8o>vbQZ}Zx}hG4&E=QO z37UA|(2AP5#6yt(cLPO~)eaj3Q@4L2h(|x|;qI2DeWH!jdL^dQ3cjx2PlH>sA`Xbz zN~{p1z4SZsRc1IPGg~Cbl!~8_|1$}Eh5Y;J+qZ9uIJklWcbQp*){`gaXWW$TW~si( z%sjirkt{i-sFV!YxVtI<8VA5!&kOb&rW_k;OAC+eLEzrh%Lu^6%CB-=Dj}6F>h0UM z9L+GlV;Z@4v(@jIxzPxT5qo{V(j=xVKXp@N;qU)R*bejrBN61rJDhR}*{VUJQh4#F zQwB bhOkpL&Ugx<8$8%BSSx{ zqE7e(LSfROPel1HrP5wu`r;uOAQu*7fEpv~+r0x-hBQI=$h@dc{5p8~G{b8sbn>Y0 zu8r?0S)42T-VK_WCA(1%Hzvb4K{1^PDH3g37<-dO(oCzs5BiS!IsKW_GwBnFfdjt+ z+3A3Q`tX}()6vB=xdHVF(xkl_sq$gOR>0I(yu=m%!A}Lm^0hxzP4~?n$9$Asw=6AF zkBH%ApA+g*Ud4qGbBVGiz9g-~65!8~nXx0bsWDcf#mC1tT%#2jWQ!-^5F_$S#O3Q9OAl5) zr#Mj8)gtGp9!eV6cH$sP_ROldV;yX5J7z1QBHOwp*$AE3$zCvAD1D(H4%EqKcWhG+ zRo_t$ubP^ZkENS^WCB+z_mka%Z{QkdvrH}_%otU<5QVSsOS56+mY~0Y%9CTgs?7NX zR!pUNB #BvZVBVQQqYQx^GWLqua7!ss3yRz(BBJS~(>*-G(z2u`%6RcN z$%Q`1h#xV6M7X^ %w$Sh8UU8zWVRy| z&AKEmE6_7D46u2&SW)~}kzD^(tM-n21?7yJ*9-&jWl`<8FY(2#TTjw1mtp7^zl;s# z4xc_c?ENd2?rxrC+kF*mC1|X-%{*bnC7 3slUd-?@sDWO*y+@I_PMVh(Q!7a?7g!(Kv{x;KM$Y-k|1vMI);Ki{2i!vgS0}O zMvo}nQJT+)J}J?S6}^0 ?@>xGZRn8`6TQ~Z3iM(;IRE8)`#2VJe{1+pEA$ljS!zm>B ?|g9%c5}OeNmn@T{(av}5D#ulTr=(XP &NNQ= zZkIS8-7C@ZRr^kw5$&h+3|_^H!`naCm%X5LUr9WdL~h}gvm52&H7om(0-BCWo}GCl z5>z$mkGd|YVfGmv!*xn}JexSS=(`5qZefOB?%G{D9u*rq3Y$41ANn@EIy(2%V`pRw z%eGhIShG?98nnajexUv6eC903*A=%RdzplWJa@Fmd~@d~9SoR5wKi%vkYTq43 +Is
7~-%zGZvx;DHTcXC6}SJgxXzP;sl*32Xll z3rB7~Fi1&1b!ThQGM0moL4%x0NCSb12G>V%R9PMzt }wL4A5Epw9uB^712JT!!ntp|oq`_9XZh3u 6dzS9pq#y8*prfQTCv(FyhM5`;C`?7%# zceNVXwPPfep~4FvSXoz>Xjcf%$tx(#&qoUDn3$Y-Ck%g=n#u>fPp9YN=8gytXY3su z90%rj(FCS*>PSB5OePq=E-sd!KwMl$W$?Z<&|(1l9^M|wkszZkav%VYIOZO^_faQx z5Q)PQkg>&Hp)nH^76H2*ypZ)mV+EDgaPawf<=G8kO5MyhYfB5buLc)M3|0+d|4JpP zP!__QV|S@G C{)wvce1%#a(#N{rB ^H}q_y2)0o)%`AWp>y) zL_<~iTj*qh>95Xkb2GK1l#a~KXsD_F0y&qvOr6J+q9iB{uG0WeU0pqV3@9b4wIZ)( z6Z_5k+~pXCCL>UtdT0xAk;h6S?~kRsr*%%VAr)z2P8! Y``0{FK7+zxl`htCz23J01j~pu5+IQCeICX+`mr)~)Xrqo#!^#mf zw--gxSY^JeSL8F)0u>eAW>^5_$JV7FDnI{+{LQ9s*gQsnmf6UHrVYaBc5cnu^Sgt0 zGIW8RyFaZiQf6kX=z-=8@aY~A3cGtF!=j^ iODd718}p zb6>3M&151ka?sx@mV&*U =?A?TbYcY}V!FC|G>)0}PN)L|Pv=sn zcc{B4!b)D;Rofpdp3SqKpLW;?;PuZ6zve3FL}+w3`yJKsfjsaPKx5-TjC!(gvexk_ zgc`w>Nr{Q!guQ(yf3)su(Vz|h@N{0*UOY~-4kaQO06$STA?i|uN ^t!xGS_}(vzM#*-tK-4y&sJ%~ zY-J}|lyczXH$>);8Q$Qv!{!+4kQf2~Kv )lx*ZkPrDNUldN>2nSQ8Q9 z!^-dr|IPC()5OVT6V<|m|87~|zyA|guhA~NAvb&Z2^IY^n-1s?oD(ef-*+d3EG|A| z!^8eqF;^X<5y3UpQzh4Ejsuyk>y>CXX*>tuh(bk)aaSDMBd}sWnONeC6hJ7!_>p6m zf^i_WM`|N*nZuY6>QAe|G+x_AFd FAzF63*5o&1%-G(;LbwCaHt5pCoziB_v=&s^a>V#<)K5>3rhI0 zIW|B~0c$p&A}?>-eMrj1*(n@+ESL2zGs;mQ1=Ds^68n)X)Q}Zs%3rGez&9Xw+`9NG zNDCoxogHO3b)FN-1Tt;suGxmKuAhIki+TSX54AoKF-D&^OK_2pm@4p vt=Pf~L;8s&>qBvH}vNE =436 z>Ko)2o@2pRzJ>jOG6U8sIKw^ez=z6O;6j93$MZ2pWn=7^Ox8t!VGIp~GHFsiB|ioo zacRa&`XE{1Pi7<23o*A(qKDiCVIed^e(xBio%}YRBOv+0$xEhk!c>aq>VJ}?|C3~( zdphvR9*uDMEIV@pjF#Qo`y>X%!GdPpzk@vhP&!G(gln{V*5WcZjQEGA>d1|M{KBr} z@!LWOv5>kk5TyG`X|Pqto9-m|ywXu;L6Y{gB*(!N9L#=^5;+_&RaA17rlsv7Z;1n; zyrGYwL0 UcGo`7@W*rf+!?sW^nX@Xl_K zacgCN_NPR5E_@IrED)YJFp$BxIc Gar~dl}D@{y3cEyr6=}%*?E>-QN+2j{zY< zCK>m+OYPl@XE}YvGBn-BqoW~b1*|I(=k9Bf2In`!37%}?Kka1xcYT|74{o~YzSvwN zC({~d)bpb-1^r=w<2j9Xuq;-%dxKm3ZEWntqLGq8K>6d{ADx{aCQINxNu}1oJQrtm z#K;F)#0VZmn#^?Hm#sfp r{4=m zBC{o>a)_b5?|Zl;KE8yNd2CMTy!BIxfGeqoM-cA}zW#6k8A{6%kG&P3IM+K6qNkhC zVFXcA>0W1sYrQ-mUW6$lrM(}o#)t5s`36w^NPDX!;9oUXxJeu|2J_69wTIpaAmrmQ z@aUxkY*VySvb4 b2RZTH6+(w*tm zm!i_reP-j&i(Qq?c@=LvMQ$y270Kiy3I`rIQ!D!1?_8I4xg;Ww_SVhcau6_uV2T|} zQQ_K@36)l9KSkvEO2o0ZFv9&w+5k(`w~UOxOoT=>c(l~5kK`UlL`rJ3%{3mL1;%1w zpdwXfEcSd^{#@~J;c#Ug;_gX2S^a}O6*E^x`rD|E9z~`*{Rm3~vG4R8I3FoMp)4_> z`j0=boggT0Sa>e2+34OS^-#tyiTG|+?sp%)yJ&u5yH_&o890fXcK&Zax&OG#n&jjw z*80G6-lOd|0*b*>boXr4Q$Z{zmLl d+QnM`D9w99q>MDQxx#9FOqih!1XOb zEpr7+7}kwJmKX{FMH(y)Z9F1@sS5ls3pFt7`XkS=j4~?GQHCm~qu @ z-m%u4V3cU4S_5AJQH@EWc<)?Ei5Tw?eh})Ds5aFbG9yA_X?153l~{w@T^7`ffX{CA zc2}?#>}g2OUB$n;>MVBe65Bb zW+Vg{&GL&q1G2bl3DZt-nzT9t3g@>kaS(nk|}dN&k9P5S7+r6l^DIM(@!v z<&q82|D$WujWD{9_W72rY~gl>vQOare!z?QHl~wvw_0QZ%i6{15OEK%NUdF7dClG- zZ0SA>o}bJC)b!IXr}b4e4Bq@whs=G6pTYa3oz=^r(=wIe;i}YCus(xbSou$wZi+ z`}GgPX;Fkl!&RJc`WWebZpx_YlhG|4cHUzJ4X=`V_{7OVX1%A5KP1s|5HyD93Hc%W znFT)aBix7(+~bk{B$EH9yENXuTZ(dCn$5$Bs5L`I^yOok_=u(J?ze*H8WL-WvY)WY zID_}51m?q_f16PV- zRFuhrlt7iU_(`BZL#BnkC{$xtisUE-#`7bu-%F#EsHE?G6!!Pxt+|`K_P1J~A1MjM zC(e4iql?ZP1bzwp+4s)WSYvCD8@d&V>k7l+9JF {y^1+dQT?*GPMh|< zh7u*@&)lz+lS>H6T=5M=YPcTRM?pMT _;LMO@|*N&Yxm!4NX=8`=N1tqeuH26a)}jM#h$%1ILt2g;$D z|C&l&T}FTX%CFHC4+;TQ8|7|-KrxE=uit`Ng0w*-Ih{73LyhnQT54*W>`%5peGk+$ zXwte{_1)C}|2t5ng~DZfQ7y|quQvJ8>8I_Nt4HMg!L>s**#9iF=|WW#;>ZAb%A%V- z(}keMs~UB{p1TbHw*cY_LiLGx61^9-`NKiGZ8fq9M;G$ZJ@|iLn2yIbx+6$`lwy02 z(Y=BRZH-Pcp=Egb5aV?$eh>vhpR g+D>0DNuq~^mLf84Tlz*oGPd}6@KgQR~OU?}<_<)x8=53c-9U;$oTYnS+ihnz% z{;w?|L>C-!OV7xFBJbx6I8zS$rl3NqOdqt}f53DOka_kB+Xkp$|1I3SYwj$7p#4+- zsK2qh9_=yz3b!BN+Ui&xQ1j|DodxHylh0 R& #diM@2+}ZJ9qZn3=yFY;TbMeOE#0>A{SZ)l6<^6PQdN50Q zfS+~&(~wCxmAv>pk~mMoY5e7ZF#eu2I~>t%l CviO)HXg|v4l7W>&A7n4rDym0gU>6iU5vx=;NpXnR%YZ8;+opI_QvMK z-98S@N*Y|Ya4q_${qDl0>-U3M0*)}M*qghi2jD$aVY~&`30e2b&EAgdnw995b8ige z3-3#yRyWF!(tGH2aOp%oY~X&U(arUJxQyamM9h_FVWplo@^z1C4q4l|gi;dX+2LSZ zE(8xiV*YF~uGXUAH0Ki?&%)tulR#u`Ue%ip?af`xJ1yTIDff?w!K+gf4?vx~hp5p3 za2k(!*G9kj7%bGyRhfed!+4{RVXChr?$H({ A_n6GMffEpUcvl~nGtlGmCid)xKUDg82eLdP}O08Xm&?UZ2+Cd&w =E8R=B-kz6UcXXbI zlCqh=$ma_?Af;RThq&V>sIOQhM?b_SJ~;OC8MWPZAu$UqC6<1M=N=fl*!_= seel(?h)$ap=Y7P`ucob=Oo)cmLCSk%`$4`w;WSrw%5{LXGv#tKepBYo!X?K^ bbDFThW*s+dN{thMKDTe()&8ty^XmTr&${-j delta 9807 zcmYj$2UHW$*6xJftI|7CRFI-HsUm_j0Skx-0TBTyK@^ad2_Q|XBBF@&q9R1;JqRiw zU7COpdWVD_Ldrkh``-Is)|$1l=FFbi?R VCNtrf z*wH9|3vRPO^CC^t2*eC69!7bzJy`;VQ(U*V5BqDCItOiT>nLS!+0|;KRep5PQ4$mP zMO=L1ld%MTrvsV!`xC@3JVS+bcz|`yUz6wOg1@#jdkTbPQIRLqMC-WZ?wMQO$T;}2 z9&h8x2{sP2=+Dd^{LGJ?f*y2wP_W6Q7is*!@6u4!xz8CX7_5Tb;k(6<`fP9ugP`E5 zj4jSp{lX`IijAkceD&5>KBoaMs|OAztN&=~qN>H_?|_0*2v3#~^N_oG*-OsK4r)Nj zZG8iws2HP5^r|c20S5ZS1*cT$7NrKQ(7L0?LYtDar3|>!^1A*OH2XrW(S=pwtY?=> zBAnGu++5p~N%>Z!Jp`+*b1GY7WK7T&(tUyFX5XiM^Q0E+S<9_#+`e#&QF)*1=7tE7 zsQ9x>W(f4; z6PIKsUC5e@Mh^v5P9*1)?R^RBgh&6mKGkG*xW2eXY4>zq&VMM#cIJ(9!X;;u@l+4x zKXa)$m0tFWV?X-)5oL|h{ClE%y8ZzgE_>Ol&mCF8+@5G#Ph4cHTT<8MM7x$zSiAvh z{`lltO?&d1nfjAgYtt(|6%X!*{uxdhQ)xRp%C2$kdmt`|%IO<~Ng*b=S vrkMqSvhT!{v}PIs?qvf)DyV8j+h_G& zxaG%1{o%AF8hw~$nk=oZ@K0WL#NW)=Kg?0Cw0X!C7q;TZdAG_+bn?T_q# {M_du)VY<^fzPVaO|lNCKIAU`cjo25O& zZ8Au#e{dEd_;t%Hg#WL;{z#e#of0fE&4TVOv)b2Z+o}atTl8sP>4d@bs%M`iYG}Sn zbAqQy$EjDut?XYtW pZs}9uPtyf%clX>B^(!Y5a`et9W z4x3c&zuW+`zaW{DTyI_{WZv~K;n(hJ4p%ecLJjgAWfDS?W!b#f*Hq4Cv00sahRQh0 zPUGX- `{Z9G`qG53_*WJ%@7Tlckv!nfZ?b z>Mo=%q$jhTrGI5PAND>*Jj 4jAc1 zhrKS{T9>$!Qyt~pE04#2y;|5}<6}?9<#Ij0qI1YUfciv8rv^FJ$TRrpK;h_R?7>%l zyy#PS%A14x(XAccl6kURfBUi=On2fatij@UPmA@cHpGq`dv-h3GJK&Kxu{^5dP1QV zK}y?qU}yUKizotKs|YCTPrkc6tI^%-zgsOxT6>R@{jvM<9o>WTYiQ&{e8^|o$*|=} z6pw3$yezZs)7J(dFU=i($E$x-nFvmP3f)51KY+-GJ5J^03UFn1=bE`W88u7BNU=OJ z!zrBtMmOUedMT_!!@g$PB}4TyyVa2~IYWDGRm%o};jY@EpNdguIG7>}NvF;loQS;i zfVDFGG+P;K+}(|fl#sL-#xvrS%Lg5s?DGqeihTr$O#jDQH>5lwesFF)UwWriUQ(OZ z&nODQ%@TH 8LtGE>Y+4qRIE+87iAm8GfuYP}L5fLJm37!O>L!77 zXnRwfp3X#lDdY(8=elkN-h-!~%p{|f79@<-S5OLL-Q{atY+P1+7KYWuxvowi?}icQ z=jY~eIS4B2 Tp3>Mn--TnXmh#a z)S6-HQt#)<=H3q%EMQUx7p6)VdfxjMJmnbDyr*<=i16FBC|YptL+Vpgqiwefv|6aX zOI+M4DSR>HE%Dg!Kg)i7u=M89nB8L?&J>nTcQpBDP#M|53topJA0M6tzU)*>J^_m> zVDbWw|G;faw%fRy>B~02DQ#Fk>FEjb7caZ4M*oxR7?Rnc>(o6SKR-WZ*bE+_%+Z7C zo$o|{V6LkmQ&8$8uWsbU$18S6q}_gIK z< z$AGQiMZn;(oPm|^eR_!)7Xj|utUs+gXSBD61pEjYs0}ij=x+J(N32Xy8%cv8>m1{< zcaKcmKle?1<*$tXmY=4(z)x|l8{+`*2ZKeMhZRbOQcIC9X2oaZ0Fcd9ljJ#^<01gP zc-xN=^`Ad6E~L20`v{;w`)|AJn`=MEE8UM89{4{0ev?(E_)g(_{f$E dJsqyvQY#tXi8 zbPRpEReECoadV`J>&T~DcQM`o^v$a{3{|h#@*M*Zmz*pMboTTt%(p9xo@ks(UR!&} zCZKF^P^>J olxUsOt7{Q5gZvP-Oq5hjHx@Q{hJNhSCn|f zbcvSe5*#Bq?l1&==Bi;|rMHrRjEH2|yL>MKx|{Zl_#+z>Z3o*Q150{(NmAk*Cj0in z969noVyq72AB*Q0yKV_@k%Gd)bVeqx-D{T%)$}l%`CVjQ6@DDpM5P?R(LjiKs|#0D zRDfIp0&xlaO8$%}?q3xv5ml!u%_g); M zItG-J7r~tm>@qc%<&}B{H=9oPXBsARZT#UFL>~IUQ01 (Cw&t{A{`il46@{`eK H{0 z$mTYbGR&tR;*;VWPw9kdq@dEI+R=*N;zPZfzT vgK5!Q7uUO|g zNg0{XdGqkK5GBLi+aP%K{%PdkGPra~o^{h>pNQCJMwR&I)Off4?I_{aXXi?o@-6A< z>EWBz*V7X#wJkHec8%k+?b&NNdhC_sJsnYl(W1NUOaRACI~u?!2*?%@ws3zKLF+Dp zEO-Ju-xy;Cejcp&n@<+%fiNZ(mNpcOmcWcM>dV$OH=d?)e@$44CcN#OvXeMXs=!WR z+{Xhf8M~;YWHPqG$ifQj*^8I&&rI|*_su|(k`@k+=nNDOZA^9%g*7=j3~?pZctqv+ z7x#WKpw(Qd`Flr{r(IwVX91*>hhdni>~}fVLwzmvH~-WE+1baka?TqP`oE4|Pp*Dl z(?s4@j0Jyc3WTfH47SHAV3wI1=15Y1TS%9scMFN4@RPih%GzSd2Sg*I@3O3%RMea| zMn Z2^OLTH7lJEwex8)) z&jmHZoTY5hX2wupFK>Z4R>1HCav!JBsImtBGFa20DGq05VzRE91$P#@`tWckr!6*W zbLip0J3PFKBm*Vb$ty3MK;OQzMIv5hU+{1*ZJPByC4k6%F8nAd+l=2LO0 0*QO^5=^-Cm<_+J>_}-NU5W*srd52<@LXP%0|LKTM8tbaVm`>8_*#SiWZ!CK#8;Ah+z zyAMj~7#J?LQ+F1-bz`VIJN|Fq$ exvNwaWtO5T%jkuv9nk{zYtm}(V$gju172dS2_S|NeLk++phg^^ z5XUfQjt_Ait3xHt$s~}p-SIwTZ;-euzM_4+N!T*et*ESFKC5qIb0Ru_Yki%Knos*7 zaCqG5LHkJuX1&`P#gpm^31U})R0@{WW$K7NB$*?olZ+7BkUxf@B8QSRgX&AO8`N#? zW3E|I+*Kiim;^w+#Fz$FdA-*uoYab!CRD*G709@0Qq;;wXs$FtBbu{=sqhUR*M;_t znwHLMflTAXW|Q)lM60He2ge1V8*t(f&q-JTJmi4dj#JZXl{F4WxH2j2XWa+x_wNsE zj8}dQ-d*CGr7m=(Rj8W_IPkIM=|wTjt_f-bs0MIKau^*0#t%TQ&U>A;qPzAvhDw=g zpassDotN~dzGGm#K^05xYGLfVc~SrVODLFQ@Vkj`t#o7mU8L$#n=l1&nT{VV_$!== zcjnqI6i{~1A2g%d87rcL)F-#bO6WQ}H~DR7?kyZtV&72Io0$pt`0FR^kV#*@C@+K2 zq4=3^>Kb3{@E#(1gB0@!z1=Vt#Un==%A;Q_08 8ISR8LT|rqrFMW z>KvSwIt~aS|M&r*;%^kswtXuAA=jfPSEx|w+1u-9a5>Do2(*%EanCx*7=;jtw+z_$ z$RPu&*qAaUTVfCQ$nxP)iWd6S&RF@+o|5eL=(Bb VdBl{m291c3dT`b@*t^VGth-1T18Ei>-1vfIrn< z8I|W}%A|AkRJe3untleTS6t`1(J@pKDa_)HGVIZ#N7r!DDLTJbO*U&31m;BIDHm|G ze_e30!w4Y}i{wFftpKXl=pEuN&Zz@Zjur^33RDAT*0Y1w=Z0daEfGn5{Rz|5L-v(9 zg<~5Nid%0Z9y~!A`7N&7hUr~;nn@h7gG*{^3Oruw@$47Jy%-p M2;**%z;&oPQ>! yKD57N{#QiuN{IgD`#`m9Lc>wniU8+=2<^H|(ZB Pv zMn*+}Di4R{>FDUHI#Lk4Ha0e99v&Z5p 5y|**jW65*)!_5 p*DKi6xRV~Z8Ruc{H;RVicB=F9rFiTkU27+|2QG7d^Q|oa>*@sZ z^6~(QDmr<2d8QXHUc5?AF9KSXz$5dEA$#&HtgO-Am#wY2rbBVMq%}JX4WM9OK?n8q zGB!v9M=uiF+WMzw=nHMggGvm<-sIP?-+vYzJy?ovd0tVW>OE1_B}kDL=Lm`+x67G1 zP6KRzCyr^GwpaG*?+4@9N#Oje>MMAP_ZY(z=QD4NI%#ZdjCIvnFkY=PwlS+JpnA+^ z NEpXqZ}Fry8yjM~9D9oybf zP6MciJ>pT341#=wI&{rl4xvug_!Q*kN~FkWLQw@oiY{($1}uYllI3Zd`smd2m`kG3 z*srdPfP{jA#cf7|8qE1;oClRTWPh?^Hc%Cij}9z^zn9BJI`tc@iM3o|Ku8m`NdID) z)c0a}?#6RG9=+eqLLKbyZ<|#z%lfw4ZZ*2jN4YhO2S0yiKoQ7@#wSWYb)NF~<>;}@ zIME&IENaYx;(o7Y00TES86RwmXo~KEKxAZORvvuVOt<~G%5#%xY8=vuc! nb{r$n^B|4fMaOvQxML zlGJ0BY0^+5AX2cEA6c8PAOR4RgIZ32#>OB6426jWH&=H5?Yogb@)t D41VUpVmKVKU_^J*i4>``G7|geKH0v?0{%%44?fhJYj<;>-U85_vRLEX_I85 z-@L9@ r;LXVv z0E1lgot>plA}~Li52x1;XR+aX_D={Ii*`}V)Rv3lr8OHt4E-C_Nkw^*_Cy#ZfBv=P zrwy}pP7WRVNf{FY=K75@iX_k~>w+M)$ 3^>s8#EmZcAz2j%Q`+_NlsT| z9GJV2Y+91vmg5alCPoO(j+y2JB^}3zHcqO-cbwCq(#0^Zb&4Bd1W&boLig+1EmKx1 ziZtMOXEN^ht%M@qcHTUFztcf$yne#j9L>p52h$%)ONW|yXL>QaiFz%`4Skx& tyxNN&^%|5WqFab(0L^ajW|$Na=}i$Eet{F>CnNZER!RCk<40!%@?t&UUO( zeljWH{-Y;B#LG)3+n=aEw>k}!)1n6OJ}1CSWH&aVjn&Qf }aRiiwm+6ihME|<$CK7$P&JJ{z)hDt?8dG5?kEFS$ zEXtVG^N0wKq=7*Y& rG`` z|NRQgNo17+1n`yeQ|*{v+n*Q!wcpucBIt*$WX&}NGWX`8I?m9Rz_^ex^J-MRhGKbf z$7qG~189X^R1Zm^gznas*g4K0U$u!CsGwCNb?=mZ$suoyjbZ0%W6|kg)1&j$Wn*h? z*cx{KNpOBWF94-1VSE0%8S-Aol)l?6c za{RS^sG6Nx?}{zO+^oY+HnF~)6;Fjno^P_^PbAi2rJ-8g_?zN55$IupJwB)ttv %&C8L2?-_}#N~slQ2b5~En2gGzXeeuy~eL5OON zcjsrWryy32isCXsgm z7V2azB14G6ZxV!Hq1ydZvwn2_`3Anf)5Y{b z`t^~kg#4xFuPWr;QlL(dou2|T0mhJV#Z@)jwxuW4-&sx!0o+9z{-nY}ew~QwQn<0M z<51Tuvk5^=sNT-hqB<44jqxJz;}}JdjH;wX`x}MC>Mz(?{V?YezaZ%Ni$#B7YJ@a9 zx1`7XW-zwQq1H_FsN}34Gc~_9LWK|f>yUR}3~gf+3rZ74g87Y^sRl#5KyNJDwXNGx zR(6U%S4{Y>ZhNgxUdE0D84-DJD8Ay+;O{=K?rem=Jv^lL3e2DsOd(r>GTVd9F_do6 z*ANx*f;@pLXM8xGPB>_68MYdwj1d(-n#SNwzRS9HdtsRl8*x mmP1r#<#} ztE5m6N`61g>pmfhl~{G&_duq_XszpQv7=a>({;hGoC@Je*d#)ATD}`$zu@TUr&$e^ zlh+UaQBP*^$4v1bQ8H@G54AGo!F!*gc`O`K-#q-;RiJ(!VHuUZ+$e`xna3_IcMO$S z1qA{z?83#9nbbrPrySv{C7(nJ;zcNeKf#FZri1`bp4!5<5Q_hGslG@(m-+VmJ8b|$ z^AlTktKLvBUYb56>~Gk4coYgn?y+8m_@LG_Z1@$aaBKPI){Q|lx^_J0&6y!IJM}?4 zMdwuU#R>f m(2P@c bQMqj zdUChzvacNQ&-R&~Of|4Ocu4)N#Z^<&?NYDNN!6^<#~X$RmqUrt_xJ}{x6c>Ffb+z6 z=E-{@JTp_+CaLS8+SRYzE%OS3nj-#&(?g&1G;SH02n*MC{-h6a5`dp@@L25vtKSs0 ze3L)w1xd9WV{48YM&Z_V0gH~ C$+r4tmdVC9t{{=@Gm{L~rJ`fSF2H k-OAR#uefcHtYkNKUPW?lTQ7+|At!ecp(&Gk22BE z#~A{s2^?7C-R?Tdop72~Wwv&KgvIU*UH~IZ#wD_eYNP{KnZ-8{y=ba@-Qa}MgX!oX zj0b5PR4Sr{vPKesEHN9O-QZt`doY% {gtz2{w|N#I@*}X2j?3Tzw92 zWUu)oWY%EOMwUv^KW3(@A{
%2%|HZp^x z&&)4Lc{uAUz#kePba(>a9itY_d#`%#WGJagA6K8sLt+{zY%36#?7X7(J2x3sT7X~c zyxeyEd~cj-v82mvo3VbCbiXReCfJ`eAt$lci5bPMGRHfKGn@CGNMC+RBN;+1T}G9C zGR}k(j&SNUiW4{y5QZS$SlUO62EU$_vqx@f&2-^bPe)(-C&U3C>cp(9TTM|bNUHrH z9OBSP0^Axof+}5Y2;>Bhh#+NjLP<3&bSLzT&6-6AmVDQmY?@*E34Z^0gzH==wHxnc z?#DKcjF_EF!@9;_m%B*WT8><+1+J50w5XXaKa~?fYX0#l=kfI{p+WI?X|$V#x53>E z{w4Wrv+sL*=uLH4yEt9VwfASpgi0)i9MAapg~7eof6nJ)nv_kpZ%P%H=r7I2UuAS= z-bDwrIPC78a*o-C-wEf%mpKo=!y0NoV+$9kCKs735Mc&437GT2^rM0AP%%|k+S 4v2v_J zj&Ew@W5eyu29ewa*q8&>R(VQ$v^F=$ot9{#e~tHG_{ut>j7*|KxsdoBa{vG$$-ENY zS?%emNaLqT|A!;%Qo6S{l>t9hL8jgnh=9oSynhYwLFgW L!2Zn@8uZ?`fa9K=OJq1;s8g;aoQ=Q_*V$Y8G~}i$xt-(l``IfepVC=Q>Z^?B?wB z!7%+n=ztCR)-)2QNWos1J0S%@0z36o`b1=H2+8d@AcjoYbQdUg9oP~DD&5#Od-da- zni=Qt5#AZXDRDN|aHN3+;b4K^CUBu!iRD0eNa-QnZ@c3w-j_>{;RgTT%5iOu%bVoO zjbI
JyG4|5iv7EN6QM7NhZpmPU= z3ho#Tv7WY7nPT4f3P=(ZzqB84>$jM8#lIy;s2_Rm*hQe&=kLxLgRhm#TH=zObw~fu z c0n|cbxw#f$vxD>3!7xAD4`b-GZg=MsojOx$*v4$kKPqF=nVLCBYW~yRQFH z@82?8yRrso1(iC{fcLKd`@AySP+|v1tD*MYX%5-{ssPW@ceEi8|D(LJh1}2Occ>Ay zn3NMIuLgH9{Xad%I{Fbb4+N+`+<5%<^ak*Z5$P~%seAl3mWzVRV|z_US8%j$*CO*N z%zzX*8{$lg2q(el->@*gG`3laY!J 5wi$S!9dXF9|yO>k;Xpec?qaECydc62nEgPNN@KDTIOc69yxvs%pQFgY$} z3 VzDP(?DP=wp)cz5|^o?d)cdR|a=ENW(VI zAMn?06NJF(P0io1VXg%+zR6wb)e7k+UBpG{Nu~KET$j@MFgZtAcZk2-xoSqR?T>;m zt#J9scX%Fmp0p+qqhOh5ZhP!@oa9e(i$So?c 4o>EVbJr`e#CB+g zw~L2{4yS~di9>?fbUn&QHf|SVi;CeFa&Tm`iA%vwT-edRShR1i(mmlS$_Jg7A*8f( z-TT6uq{C3mbio%?|GL$o&5A8as^-$VoWa_5?N#sq8kCLwt91Ggj4f1s$e}I6?{YLC zB4qt!Bt*-n=R$EPfeW`3>|DLd{Cv$WTuK|hbqu#%ZkI {`!4b*95 zD(X5r;I}9J$~))zpDYoDs)YS{#MuG-=YkCxb-9isHJizqztqW+U%J%$$LxV*(?c&a za8H4D$M)b=ZiaQcyGmCl@~M<<$0=8j+nPL_ONLj+(|%Gv6mQ6EJNxeP)B8Z}S!_(S z`9FC#M+m_QaxB~~D|H{~3?>YEJ35iv?_mYi@b68maO5Ba5>8~AB?EynvXr(2#B^`F e{}+E2sj$FT0k>$=gB}6U&-BVQqjE#%$o~QMf(01> From e3c77f2f5ad546b59a41ddfc9836f42f87e9841f Mon Sep 17 00:00:00 2001 From: Kraseo Date: Sun, 1 Mar 2020 22:05:35 +0100 Subject: [PATCH 04/16] part 4: the one where i slowly go insane --- code/__HELPERS/areas.dm | 5 ++ code/__HELPERS/game.dm | 33 +++++++ code/__HELPERS/roundend.dm | 1 + code/_globalvars/lists/poll_ignore.dm | 4 +- code/datums/mind.dm | 4 + code/game/gamemodes/objective.dm | 2 +- code/game/objects/items/melee/misc.dm | 2 +- code/game/objects/items/pinpointer.dm | 9 +- .../game/objects/items/storage/uplink_kits.dm | 11 ++- .../modules/antagonists/_common/antag_team.dm | 3 + .../antagonists/traitor/datum_traitor.dm | 84 ++++++++---------- code/modules/clothing/spacesuits/syndi.dm | 16 ++-- code/modules/events/grid_check.dm | 5 +- .../computers/item/tablet.dm | 22 ++--- .../computers/item/tablet_presets.dm | 8 +- icons/mob/head.dmi | Bin 217230 -> 223443 bytes icons/mob/suit.dmi | Bin 420037 -> 421742 bytes tgstation.dme | 1 + 18 files changed, 130 insertions(+), 80 deletions(-) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index d7378abfa6..715f17af92 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -1,5 +1,10 @@ #define BP_MAX_ROOM_SIZE 300 +GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engine/engineering, \ + /area/engine/supermatter, \ + /area/engine/atmospherics_engine, \ + /area/ai_monitored/turret_protected/ai)) + //Repopulates sortedAreas list /proc/repopulate_sorted_areas() GLOB.sortedAreas = list() diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 60d7fa42b9..75e711ad03 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -549,3 +549,36 @@ var/pressure = environment.return_pressure() if(pressure <= LAVALAND_EQUIPMENT_EFFECT_PRESSURE) . = TRUE + +/proc/ispipewire(item) + var/static/list/pipe_wire = list( + /obj/machinery/atmospherics, + /obj/structure/disposalpipe, + /obj/structure/cable + ) + return (is_type_in_list(item, pipe_wire)) + +// Find a obstruction free turf that's within the range of the center. Can also condition on if it is of a certain area type. +/proc/find_obstruction_free_location(var/range, var/atom/center, var/area/specific_area) + var/list/turfs = RANGE_TURFS(range, center) + var/list/possible_loc = list() + for(var/turf/found_turf in turfs) + var/area/turf_area = get_area(found_turf) + if (specific_area) // We check if both the turf is a floor, and that it's actually in the area. // We also want a location that's clear of any obstructions. + if(!istype(turf_area, specific_area)) + continue + if(!isspaceturf(found_turf)) + if(!is_blocked_turf(found_turf)) + possible_loc.Add(found_turf) + if (possible_loc.len < 1) // Need at least one free location. + return FALSE + return pick(possible_loc) + +/proc/power_fail(duration_min, duration_max) + for(var/P in GLOB.apcs_list) + var/obj/machinery/power/apc/C = P + if(C.cell && SSmapping.level_trait(C.z, ZTRAIT_STATION)) + var/area/A = C.area + if(GLOB.typecache_powerfailure_safe_areas[A.type]) + continue + C.energy_fail(rand(duration_min,duration_max)) \ No newline at end of file diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 0f1e75ff73..8a26b1f44b 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -354,6 +354,7 @@ roundend_report.set_content(content) roundend_report.stylesheets = list() roundend_report.add_stylesheet("roundend", 'html/browser/roundend.css') + roundend_report.add_stylesheet("font-awesome", 'html/font-awesome/css/all.min.css') roundend_report.open(0) /datum/controller/subsystem/ticker/proc/personal_report(client/C, popcount) diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index e30ce1d1ed..f5f3adbcc0 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -18,6 +18,7 @@ #define POLL_IGNORE_DEMON "demon" #define POLL_IGNORE_WIZARD "wizard" #define POLL_IGNORE_CLONE "clone" +#define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support" GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", @@ -37,7 +38,8 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SPLITPERSONALITY = "Split Personality", POLL_IGNORE_DEMON = "Demons", POLL_IGNORE_WIZARD = "Wizards", - POLL_IGNORE_CLONE = "Defective/SDGF clones" + POLL_IGNORE_CLONE = "Defective/SDGF clones", + POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit" )) GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore()) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 4689d52bd9..29bb694a6f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -617,6 +617,10 @@ if(!(has_antag_datum(/datum/antagonist/traitor))) add_antag_datum(/datum/antagonist/traitor) +/datum/mind/proc/make_Contractor_Support() + if(!(has_antag_datum(/datum/antagonist/traitor/contractor_support))) + add_antag_datum(/datum/antagonist/traitor/contractor_support) + /datum/mind/proc/make_Changeling() var/datum/antagonist/changeling/C = has_antag_datum(/datum/antagonist/changeling) if(!C) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 4acd2ac6c0..95f6f8cbae 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1166,7 +1166,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages) var/found = FALSE while(!found) var/area/dropoff_area = pick(GLOB.sortedAreas) - if(dropoff_area && is_station_level(dropoff_area.z) && dropoff_area.valid_territory) + if(dropoff_area && is_station_level(dropoff_area.z) && !dropoff_area.outdoors) dropoff = dropoff_area found = TRUE diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 2f8b562cca..3fcfb77603 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -376,7 +376,7 @@ w_class = WEIGHT_CLASS_SMALL item_flags = NONE force = 5 - cooldown = 30 + cooldown = 20 stam_dmg = 45 //3 hit stamcrit affect_silicon = TRUE on_sound = 'sound/weapons/contractorbatonextend.ogg' diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 65eb7ab658..261a842807 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -17,6 +17,7 @@ var/active = FALSE var/atom/movable/target //The thing we're searching for var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination + var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off var/alert = FALSE // TRUE to display things more seriously /obj/item/pinpointer/Initialize() @@ -77,6 +78,8 @@ name = "crew pinpointer" desc = "A handheld tracking device that points to crew suit sensors." icon_state = "pinpointer_crew" + var/has_owner = FALSE + var/pinpointer_owner = null /obj/item/pinpointer/crew/proc/trackable(mob/living/carbon/human/H) var/turf/here = get_turf(src) @@ -101,7 +104,11 @@ STOP_PROCESSING(SSfastprocess, src) update_icon() return - + if (has_owner && !pinpointer_owner) + pinpointer_owner = user + if (pinpointer_owner && pinpointer_owner != user) + to_chat(user, "The pinpointer doesn't respond. It seems to only recognise its owner.") + return var/list/name_counts = list() var/list/names = list() diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 43b69676eb..ab55555562 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -419,6 +419,8 @@ to any form you need for the moment. The cigarettes are a special blend - it'll heal your injuries slowly overtime. The three additional items, apart from the tablet and loadout box, have been randomly selected from what we had available. We hope they're useful to you for you mission.
+The contractor hub, available at the top right of the uplink, will provide you unique items and abilities. These are bought using Contractor Rep, + with two Rep being provided each time you complete a contract.
Using the tablet
- Open the Syndicate Contract Uplink program.
@@ -443,13 +445,13 @@We need your target for our own reasons, but we ransom them back to your mission area once their use is served. They will return back from where you sent them off from in several minutes time. You will be paid in TC for your services.
-Good luck agent.
"} +Good luck agent. You can burn this document with the supplied lighter.
"} return ..() /obj/item/storage/box/syndicate/contractor_loadout/PopulateContents() - new /obj/item/clothing/head/helmet/space/syndicate/contract/black/red(src) - new /obj/item/clothing/suit/space/syndicate/contract/black/red(src) + new /obj/item/clothing/head/helmet/space/syndicate/contract(src) + new /obj/item/clothing/suit/space/syndicate/contract(src) new /obj/item/clothing/under/chameleon(src) new /obj/item/clothing/mask/chameleon(src) new /obj/item/card/id/syndicate(src) @@ -479,7 +481,8 @@ /obj/item/clothing/gloves/krav_maga/combatglovesplus, /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot, /obj/item/reagent_containers/syringe/stimulants, - /obj/item/storage/box/syndie_kit/imp_freedom + /obj/item/storage/box/syndie_kit/imp_freedom, + /obj/item/toy/eightball/haunted ) var/obj/item1 = pick_n_take(item_list) var/obj/item2 = pick_n_take(item_list) diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index 027abc7c94..653853cfb5 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -4,6 +4,7 @@ var/name = "team" var/member_name = "member" var/list/objectives = list() //common objectives, these won't be added or removed automatically, subtypes handle this, this is here for bookkeeping purposes. + var/show_roundend_report = TRUE /datum/team/New(starting_members) . = ..() @@ -25,6 +26,8 @@ //Display members/victory/failure/objectives for the team /datum/team/proc/roundend_report() + if(!show_roundend_report) + return var/list/report = list() report += "[name]:" diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index d05d1e383d..0b6b3f7f7a 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -13,10 +13,7 @@ var/should_give_codewords = TRUE var/should_equip = TRUE var/traitor_kind = TRAITOR_HUMAN //Set on initial assignment - var/datum/syndicate_contract/current_contract - var/list/assigned_contracts = list() - var/contract_TC_payed_out = 0 - var/contract_TC_to_redeem = 0 + var/datum/contractor_hub/contractor_hub hijack_speed = 0.5 //10 seconds per hijack stage by default /datum/antagonist/traitor/on_gain() @@ -30,36 +27,6 @@ finalize_traitor() ..() -/datum/antagonist/traitor/proc/create_contracts() - // 6 contracts - var/list/to_generate = list( - CONTRACT_PAYOUT_LARGE, - CONTRACT_PAYOUT_MEDIUM, - CONTRACT_PAYOUT_SMALL, - CONTRACT_PAYOUT_SMALL, - CONTRACT_PAYOUT_SMALL, - CONTRACT_PAYOUT_SMALL - ) - var/lowest_TC_threshold = 30 // We don't want the sum of all the payouts to be under this amount - var/total = 0 - var/lowest_paying_sum = 0 - var/datum/syndicate_contract/lowest_paying_contract - - to_generate = shuffle(to_generate) // Randomise order, so we don't have contracts always in payout order. - var/list/assigned_targets = list() - for (var/i = 1; i <= to_generate.len; i++) // Generate contracts, and find the lowest paying. - var/datum/syndicate_contract/contract_to_add = new(owner, to_generate[i], assigned_targets) - var/contract_payout_total = contract_to_add.contract.payout + contract_to_add.contract.payout_bonus - assigned_targets.Add(contract_to_add.contract.target) - if(!lowest_paying_contract || (contract_payout_total < lowest_paying_sum)) - lowest_paying_sum = contract_payout_total - lowest_paying_contract = contract_to_add - total += contract_payout_total - contract_to_add.id = i - assigned_contracts.Add(contract_to_add) - if(total < lowest_TC_threshold) // If the threshold for TC payouts isn't reached, boost the lowest paying contract - lowest_paying_contract.contract.payout_bonus += (lowest_TC_threshold - total) - /datum/antagonist/traitor/apply_innate_effects() if(owner.assigned_role == "Clown") var/mob/living/carbon/human/traitor_mob = owner.current @@ -447,19 +414,8 @@ var/special_role_text = lowertext(name) - var/completed_contracts = 0 - var/tc_total = contract_TC_payed_out + contract_TC_to_redeem - for (var/datum/syndicate_contract/contract in assigned_contracts) - if (contract.status == CONTRACT_STATUS_COMPLETE) - completed_contracts++ - - - if (completed_contracts > 0) - var/pluralCheck = "contract" - if (completed_contracts > 1) - pluralCheck = "contracts" - result += "
Completed [completed_contracts] [pluralCheck] for a total of \ - [tc_total] TC!
" + if(contractor_hub) + result += contractor_round_end() if(traitorwin) result += "The [special_role_text] was successful!" @@ -469,12 +425,44 @@ return result.Join("
") +/// Proc detailing contract kit buys/completed contracts/additional info +/datum/antagonist/traitor/proc/contractor_round_end() + var result = "" + var total_spent_rep = 0 + + var/completed_contracts = 0 + var/tc_total = contractor_hub.contract_TC_payed_out + contractor_hub.contract_TC_to_redeem + for(var/datum/syndicate_contract/contract in contractor_hub.assigned_contracts) + if(contract.status == CONTRACT_STATUS_COMPLETE) + completed_contracts++ + + var/contractor_item_icons = "
" // Icons of purchases + var/contractor_support_unit = "" // Set if they had a support unit - and shows appended to their contracts completed + + for(var/datum/contractor_item/contractor_purchase in contractor_hub.purchased_items) // Get all the icons/total cost for all our items bought + contractor_item_icons += "\[ [contractor_purchase.name] - [contractor_purchase.cost] Rep
[contractor_purchase.desc] \]" + total_spent_rep += contractor_purchase.cost + if(istype(contractor_purchase, /datum/contractor_item/contractor_partner)) // Special case for reinforcements, we want to show their ckey and name on round end. + var/datum/contractor_item/contractor_partner/partner = contractor_purchase + contractor_support_unit += "
[partner.partner_mind.key] played [partner.partner_mind.current.name], their contractor support unit." + if (contractor_hub.purchased_items.len) + result += contractor_item_icons + result += "
(used [total_spent_rep] Rep)" + result += "
" + if(completed_contracts > 0) + var/pluralCheck = "contract" + if(completed_contracts > 1) + pluralCheck = "contracts" + result += "Completed [completed_contracts] [pluralCheck] for a total of \ + [tc_total] TC!
" + return result + /datum/antagonist/traitor/roundend_report_footer() var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") var/responses = jointext(GLOB.syndicate_code_response, ", ") var message = "
The code phrases were: [phrases]
\ - The code responses were: [responses]
" + The code responses were: [responses]
" return message diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 30014f4292..aca98df232 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -76,21 +76,21 @@ item_state = "syndicate-black" //Black-red syndicate contract varient -/obj/item/clothing/head/helmet/space/syndicate/contract/black/red +/obj/item/clothing/head/helmet/space/syndicate/contract name = "contractor helmet" - desc = "A specialised black and red helmet that's quicker, and more compact that its counterpart. Can be ultra-compressed into even the tightest of spaces." + desc = "A specialised black and gold helmet that's more compact than its standard Syndicate counterpart. Can be ultra-compressed into even the tightest of spaces." slowdown = 0.55 w_class = WEIGHT_CLASS_SMALL - icon_state = "syndicate-helm-black-red" - item_state = "syndicate-helm-black-red" + icon_state = "syndicate-contract-helm" + item_state = "syndicate-contract-helm" -/obj/item/clothing/suit/space/syndicate/contract/black/red +/obj/item/clothing/suit/space/syndicate/contract name = "contractor space suit" - desc = "A specialised black and red space suit that's quicker, and more compact that its counterpart. Can be ultra-compressed into even the tightest of spaces." + desc = "A specialised black and gold space suit that's quicker, and more compact than its standard Syndicate counterpart. Can be ultra-compressed into even the tightest of spaces." slowdown = 0.55 w_class = WEIGHT_CLASS_SMALL - icon_state = "syndicate-black-red" - item_state = "syndicate-black-red" + icon_state = "syndicate-contract" + item_state = "syndicate-contract" //Black-green syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/green diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index b289c8ae1b..5bb3862422 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -13,7 +13,4 @@ /datum/round_event/grid_check/start() - for(var/P in GLOB.apcs_list) - var/obj/machinery/power/apc/C = P - if(C.cell && is_station_level(C.z)) - C.energy_fail(rand(30,120)) \ No newline at end of file + power_fail(30, 120) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 154e3b5e41..0818ce8034 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -12,24 +12,26 @@ slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT has_light = TRUE //LED flashlight! comp_light_luminosity = 2.3 //Same as the PDA + var/has_variants = TRUE var/finish_color = null /obj/item/modular_computer/tablet/update_icon() ..() - if(!finish_color) - finish_color = pick("red","blue","brown","green","black") - icon_state = "tablet-[finish_color]" - icon_state_unpowered = "tablet-[finish_color]" - icon_state_powered = "tablet-[finish_color]" + if(has_variants) + if(!finish_color) + finish_color = pick("red","blue","brown","green","black") + icon_state = "tablet-[finish_color]" + icon_state_unpowered = "tablet-[finish_color]" + icon_state_powered = "tablet-[finish_color]" /obj/item/modular_computer/tablet/syndicate_contract_uplink - name = "tablet computer" - icon = 'icons/obj/modular_tablet.dmi' + name = "contractor tablet" + icon = 'icons/obj/contractor_tablet.dmi' icon_state = "tablet-red" icon_state_unpowered = "tablet" icon_state_powered = "tablet" - icon_state_menu = "hostile" + icon_state_menu = "assign" w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT - comp_light_luminosity = 4.3 - finish_color = "red" \ No newline at end of file + comp_light_luminosity = 6.3 + has_variants = FALSE \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index 09b3a73ff0..f516d3802f 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -28,10 +28,14 @@ install_component(new /obj/item/computer_hardware/network_card) install_component(new /obj/item/computer_hardware/printer/mini) -/obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink/Initialize() // Given by the syndicate as part of the contract uplink bundle +/obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink/Initialize() // Given by the syndicate as part of the contract uplink bundle - loads in the Contractor Uplink. . = ..() var/obj/item/computer_hardware/hard_drive/small/syndicate/hard_drive = new - hard_drive.store_file(new /datum/computer_file/program/contract_uplink) + var/datum/computer_file/program/contract_uplink/uplink = new + active_program = uplink + uplink.program_state = PROGRAM_STATE_ACTIVE + uplink.computer = src + hard_drive.store_file(uplink) install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) install_component(hard_drive) diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 01e9f2ac2c84585e3c7ed5e371fbd19885856102..a5497145ca2dd5ad8bc0c57830efde22fba9c47c 100644 GIT binary patch literal 223443 zcmd?QgRDD> Ozo+K3>a4Ta4?}^^^g%9Ja)i?5+LA9F}Q$DxJtpt$7$d6}7OPI5p^kfqdf$sQH z r+Asp9AMTAnq} zEJ;PmtSe<=HHhO%*1NZB-|fXRv%hDZ);0OoE zYj`8HsO8sp1lXpdQ@+s9JkrZ?poAKnNtX6Bfkd1-=1o@ z(s5MqWScC-Qki EgW5R?V+w_5Yf4XvF;;dC~V}!Ym&nHt)yLKxTesaU+%IWrUR4 zL`=VbGamY(@f*qZvQKBvrSs};c98Q!RFJvz!xusYZS0jw?g2My3qLuF;_JCj_d(`c zKR&BJw%DgKy=w&DI-4PDyU>}@gkitAn{Q*`rz_JCYch57CUL5a8R0K>ovj*vw6K(z zy4KMMm$9LnF!ER-UyoS5`i3yVPirVb38F}wf0V5zFE %m4L;%TTMQEgzcv3D7iqE4>|peslN@*>= +$cEa*2fau<`q%M1nT}?EahxUdG2N7A*}iuJWG}B z#9h4xcX7S8O4u5%;qRCt=A!Qn(k66$p$dDULlK#xcT5fB51-C|i3TrL`kXTcHodCA zdeqHzLdXw={dhNVMi0&1f|265k~^j%oVLvji%atKtZU& ZSf=&-jFNCOIp%0dbf(MoB6(tBy4qOz@u3oH2i?#6 z0`s`A27h;hc@2*2vKx7n!+`bi7d^Q7$`bX)ok<6uOIVGsB93?6H;EcQX%@3Ot^^Ce z4!|C xWf&TqZK1~F9M5en+C-YPE%WG`CHY!FtfJ&)jlBTn5 zsT$AX{7n)y;*Vntk@GW}t-+Y@=8SUJ-|l75CGy*PP}V3XX=cam>$X^{O|d2^<&2lG zMQV|oSl$suT2MRfQpP;(-Ns2|$tlr!R9uQ*n-$ a=9(MF4Vpxhd9!pAq9jz3f2s6J~eSK-GKz{Q^Ugq Tavlk# h-CQ##us;7zMM~g`#M4vH z*|@IG@=Yk?hc<2bJNJ{;Wf|k%m8ri-?dFX}HW?3nKb>K_k(fC}N9=igS&;G r3>WkVt(U#0}4a`FEm=`V{vpw(}_CcWPgby7JT_aw7&R7-+#N)$fk73Rg*{GgV z0mt6VXLs@#vYV?-->;=$VWHf-2>f%0bDmnsA~1F~(Wc>%4}9YN%=h{m#Lk&B+c-`4 zs`B6YmpeEzNn$dVxQ2{mk6hw>cQ;5vXo)##-R}!V?^ELsXw^=qu+h@9hQ$1C9>eV% zkkyF2^}0<(LHAM 2cY&vr#kgOvG-o!H82t<8p@b5-|}S?k}gM zC(1NV6;glQ8ssChd9 JPWK0znI&b^Jp-!deq|$0{spV}= zm;GS4P}x4_*Sa&Vz)_W^-jlfol E`3dr>^nn<= zR({x(qbq0dqiy4Ww|kcqBpyyGI!bu_3_a`kI${c^5psDiWGX08)bk@PVhf*cFX@PE zI+-jj-WE1#4ZOD}{v0VW@rBj5Vo2h)@I(7sPZWn@{-PZ+r;aj>Zv{>v?1)1srqsV= zvW!o=bN%p5I37#py;v9@eXKW}S;CPYc)vX0Sdb~bRqzk)OPW_A(fAxvWg|wWz3hY6 z*y{nqZ+jj7Oz)3*f3fX;_t_jT=yUc534WF`dVb5vPnzqcy`{1YlL?>T8;rA>8`}-# z^f9G6gwZy-xmccU)}MZ^>75e@-ECo#QpJi_W@N~8h>Qt8Q_viYdqI=mI @VCsWxg)2;8Y=h}Ya$3^Jr==i7n$2xmLaU)e>J!qUj}C9* zDU=Go5nZgS3}+?JDU4n%O+CjU+z`g@`W#d7KKnD?tsaZ2@140#AIvb 7nFzM?H-2GB7~<0_GR$y@-No@pQQ?|) zAi!17k*J_N^kzNyh0Udhe}Z*AB$Kh4L3M<>ZN;^A@2$5fKgnd%uM{t|u$CZq(blJy z-#;TfWb9_DobB7{!t&b1LjpF6sZ523`*zl~XhZ97DNm;aZ#(>PTT`(Sso{;to)`FZ z7H>c>Wg=q5G+3A~KbeweoB2o5ZL~KjjiHuz^M%fuu*+t(^=$=wYo=xkR|8?lhUUF| zpAQdt=27yTw^AwIyH6Quoit*TY|)cf;$$B#nm|7*ZzZ}v+LJfo6@-5~mC)ItO3#sC zSy+kiRAlo!wn0}>D!t3rlZ|asN^19KkofhdaXDe#k%~NZc>W50LSd)FaPC}W>a z4e=twU)=N6-e4WlEZ*DHKI+jm%DQ(vCU;LuAY6T8lBukD#~aU@%W;OaThs5>@2+A= z?BwWPvc~!QxW9aqkNXm&*c*t2)x}ef*~O1>OwZ^=@H(W5J1MR*diXzBmFH^<9XBe? zk1$g{>ET={`8#zY`ojSuhf5I7I=? T+wg z7aa};>+3OfZ2r?7(-rr3I(k263Cw2)o#sBkCK=0G{dvpE*f(hD{YA{|*K@sgOM_{J zN`kXXvA6Q-TKpGHZkY^1aP;-w=9HvAcr5APj-eZMdj16f7y(7umztg_`wL#48kVz? z$Bz0+Ry0bl>mHR<=W>O_54@zjOlBo_@kvMPy}HWweGJ5pZuuunY;eMt&7#FUzj# zEs%Wm |2;alJ@{Z26}mZ6FqmaSW+9<=k=B&09=dncHZ>@J z4O~Z3|6Tr#XW8(pKai&tWmt82^%(*1dX{5pX^~pCXp8ioh;3$A`l{B!^Ve_^48RY? zHceGWY*S^rM?05CqOB?ByUwF0foB)6?(NH)!bB>n!o8m3^OGZc5GGD%;?Bq-^PRRk zH_sh8`-9B{=GlmbdME2{;AoU%#eBnJ@+@4uRd5R=-h+MIg3*JE6wuu$(0y?dlNQOd zH-}E=GimKPlN<&YXTY>CWp1P`)FxA7PZ>EW!v)-SHD4gNvwQpcumE4gO6YWhOFrvu z#vc3twQTv7 vRyva%|uG#-+3C3QY|-Le!P9}fVb*;pbCY||jNQ5rhEf?A3{;8(gKoLS3w&kqe6 z;syK$BC!jtnO9A8K@Ohz&se?A3kN&lZKVtyV?A&b$iv78oSdBW4i3thn`du=FdS^` zI5+*C^cP g z=p}zlo$leAi$x4f2XPIyBTeS7(|aVNV3(3NCTnM)GhhzH>2Z2+UoB#`u1$*8VB-a9 z{h}o{s=J5)j|s54|78nU`MMCiup%O8INf&@jbC+?mc~v|VZ%nF%_?+*Ri4;Ea`NRK zTl G&MJO4=WDeQg)$cj|{YtsZ z 72ECp_g~XboD* z&4+J1iti7!z+LZR-i4B2Eqjl0!4dcY(@Zh~*I-d(S?dJ5zpHC?B`5qCFJO1qX5RB` z&?s_fn`_JagbWxR9hII7K*K~X;WyVN#(VbYqgns_kuw+>(xmsli@GGU1 Z)*Fu8BPt-J7Up}%HRm6i|*ySsf9HTv}F$le8DsQRLT zjx;Bq1MUIoi~_2M!KZjkRD_|$_}_?Bq+IY{burpVJV5H@OQwepckfVJ->28n*3;V& zM5-9wzdN{M74VxptXF}hvWl3T+FBMG24rNkX$9ZeS$ )D|{0YH|H948%5obx0bzG$SEjpB@ePbDuupFB%K%@U_1vpr!fzMg2^QsG`1(r z-@OXJ_%kp+T_URK2w63C0o#ve>gD0Q?~j4EVW`|OSK}u #C!q2M0Lx{9kUt$SxoYvN{X~VleeKo1DIIKMvq3X=*}fu)EGc z;tnOv@gb67*@i4;>l0)tQD;Xm4+D?F3po8SmZ82)sNe3ciduwNLJlq->HbcK(ftd; zC5>@a%+XyKTkGzuTuQ~va856sgagWxOI^ykkghwy9gYt;JCfm=nz$b@b0JN*+gv%3 zHfkuy$h 4jeEg9ah{vDm0jG-Jg{^^=mko@cPn*aXf im=BDbof1-9^B!(=!&8vvAqM{C- zrJKC5GxUatIpwWew+O%81~xV}2*}8e&L3tpHye7|)i}0Z%Qq}(`Gh&$EY&u3UH4@5 zg|ENpwmk>a(ML9W=jW~w43hMq{uxhmwA$j-&C-Fd=oSw{VS*5L+7SrJz(v*w6^=6q z9^`KP6yUg3)Ead#0$xiGfs&usmiXV{78{|>cuqdAF)Uxh*N_8+AW!-k%!W0Zk3_1* z`yd7G8#i?#WRmubb?7^K_zW)C0}JX1d<^q)vkaYRq_dq8&sD@eE=4ZY>s2{jd=n~( zn}RoO9K K_ r9eN8? 53un6CHP?Ll5g)<1~%29e!Vrj znT;0>#c?CWhrVV^azZ{TE+K(qt~xp`Ez;uk-B>Qgf}$dqIo3*LQ3-b=qtw_}jk`G3 zcZ#)(96H19Z2fsveRcs)$^Rju=md5fE$zXs&cHz-$zMY~Bj}}zR+mfI+{c2hYm>=| zYxvOx7_x;ECWe7#M{dEcdTQy#J~uXsj!#T@4PGyONAvLed%W<%Oyz+ZLcjxBst?H0 z@H22E5`IvDfs+h_`t;yd1`ea^?yW?jNia!82&YtVB&l@A_3ZH!= el{B*e3 zfs@Cc&-Xs7AJTaEI8KtIy(X$ p0rbWM?FZQ8e83-|J#f5f9PZXY2eM}C5j|Xg zxZ}Gj>yym(xM5Sgw1@%@p4#5_>g?J|hmj@^ZpN%hii+wd@tNZRPaFZ{DF}1ig*`6` zC*`-lSvuPST`piUGB|d%Q6cFdPcc{{0-hl}8d8SAQ$MeB@f+||6dbtfx`N4b14Vs5 z1?OmPKxc8Nt40{plbffcIAs{VL+of!s9%B;z%y9}+eI8Y1{>q@2@C7;Cl3ORr62_r zRd!yU{20>2+gp_0Z_klq;{b-bHsWw`aS2%`XJFtFzb^BL(;eo)Tqs?GBVCiAw;_Nh z%CN8BaxJOD$>joM7}~M1T?KP9NhtnpBzV-Lxs|D9r+NvmGX<+atV@{AKw1nRLmLq= z-0-6-5)k%)FrD;GxFpcq*joe?!SUYXsmF&q8J41txIl1&YDq9znF@OG7w^$2I*~k4 zvXXaI;LJZbmi#PZ^ctK;^I%ZJ7 Kn}bG#RyqL2d+im6 zhu=Aqt9=#1c>e|-&JN%>HOYV1~{~o?HHm>70g+U!H@~jSl`>> #iwTwk7dnK(+|-MM2O zz6E2>8n`zMCVXeu! %i_qU%wm%VHz#N=B({7l| z;hy4e^&zc{7(KYsc*eu6J{7f6h)D>CkNJx-pwa6Zp`?RcT!>vs8q*5hM_g(6i b^r_MmYZ_|K|6)8{8`up_srHZKabqhkk zUuXPlBVWbOs;*zfV&3Nk#|WYA3-y v?0JiZmGzM07k;eSLj>-S2E?$LS9?<^Rv9o2{j#$w#3ksNFObbeS6s z`Dm0$6mc76xLlH`8@v3shq=XKzKHU?uJl5Ud~5*f2 agPiB2 zp(9(%3wS{SPaokXm(^pVmuEeSCcci0yoDmM_VBjXKR9EwF_ fbD2^V>;P zRaLxwmP kko6QB2j<(7}E1i;(2s zV)TFd&foi{K61O(HHv-J`b|YK(6~&8hztrP6D3iMzW0+Lw9l%NLeO>*?~;g$Kli)2 zB#bIs1S9{6&6Kf^vMwnkSo)2w*7@x$K%igre?o5d@QoqOqa)DcnW3#l&(|=R85%tN zM4DX5T?xGSBaTVkt2qMQ*VHv~KUTe8X`3ubtyTV+`Wc;W*BuxUF>r`TAa09^xuc*8 zQvMT|( nb z;8BXu$vQh%uCJ}(NJ>i1`yDeb(uq;Rk%wZ 87Vz<65OZe3j@zU6s zo|BTeSet_c4+mII%VTXmIErd+ev!$8y}G*kNQ4p)rX_uxP+u<`Oe^}x?op*7>V+$U z_q_vh>75t)QY0$5C*om9JPZ*uqE^0(FxO;|>L1YWOc!!YGgx`f#)j_!!&Fw<-JIo1 z-$)`WlH;lDY~Q~af12=(Mu^B3rvY)X5c6ifd`Bb~tQ*ubqZe})@W1KF4~hJw*~1`K zi5}oPt)x8J8cg2O_8b@*>TXGg|Ki*tJOqWcK)A@-Z ZTC!Rcggw-IbptQ& zuQTU1@w<*M7mN;14{B#VUThyG-na;#9D1N`p!WHLPRkS5`^BRE_Hv1p#>SJ(m~`;U ztFC>ILX8iBO3>>+f%W7mN=JcLTl;E}AT{_vu*#e}N*q%#BB<+qCA)($!BACJkumXo zjBvi`mc*p9-coQ3ll1HFRoScgN0QJTOuNZ?qCOm@a)=+F7YR2y;>WV7=s1|bc3&zJ zWh|1zW{X8qCvD?{yg@Of&0ZdT&ygCIr=iU+*NH!R2!Ed~?2-Q+SLy?e){~rsz`Ib= zgK91)ES|DA%N)V}*@$4FG7`Nzfd>h#n47lF^|>)B;u_Efp7afHB>K&v@|OqE=_cFW z%I|7g4Ty3c`iNmdu0R8_x`lX9>_dYCcQwJjAd(7rXLv#dpFR=lx`a1DaJn!vlm7AL zs!Eh2e^PE+TVQXW_{!)SY+$maebr+MTzfx=oq@9~`l8P7I57GtqeDIVvi7k~F^)l< z%_InEo{bI7#ZO60ZcW9`0A>H&_y7ijksgAd3XqY8;!IUjn!SrTO(VX^@~xN>QhM6` z^$GSsHZ17VCjbZu32_pp1p>aNH`fU6hj$TUG4k`@eHBT2=aiOK#5qS(Uw`-fz>k zXeJo|aC37DE7$jFA(*c~?0FoyQJ>cS5Q3{v7~vk4A~?pf2 kCQeU`MsTv9c zjHuLe0X4bh?H-38{YMYs)WFbYJj-eFck5kdrwll}9DSsVy3o0RjU}7pf91yZ&_R8- zR>R#FMrv?lHdP~M_8GR2@^99~@c+tE1g_CH>9M!i&c6q&`Z;9wg>FGlIc98uvmU@? zAaO^`j9-2O7oRp0>~o>P?d+(=lH@r5Gxwf)g7H^f*uWbGKaOGoJ7b}D27U8ISO8A= zshRNGO>JDt8IUd >v^ZXX|?Q4IP-D)oa6T&i#|MQs5OSUA5>Y_F&iZs zgKAo*N194^^XP`ZY+t_Q{;kt-uV32jpsBX1-pUE2(!MT5n{olmQK}MOrWSoQdNCfH z7?osRbbag;hOR@7DzJ$I(_j4r+k+N8r;Xww;ghEo3b~C9=tfx(b6~?IKMV^FC`?rt ztE+|E_{<#t(*#*=Y{=S&9D)sBqxA1fZ6JVXljxA?pJx4Bz~HKoh{611!tB||-+5d( z27|Ec!7>x!Z1Kr*T|57%RIFg0GUpC!Ngoju);UoN$1b2{0Gvq=UbX)u{Ll1s2iN+N zI!lJYs!=Sz04xJZUlU!@;YBf>B)2^}rQ&VbD>7z0+y~zCcvL9s+!x4_-z#mg@aCi? zvnmHDF5ojlrxG|<^n8anu IKa zQ5W#6%uGyd?G>e?2*y%p$#YBz@bo_^(-BP_GUmZxmx_d}t*t$VIJj3!$T=lIxZG_| z=^BTC3(4R_;e*w7G+DP4GxZp|_wem~%9q^rn?FlCE6Oja%>4cRrSzz2Nki3f5AClj zDjuwF<#XO35DFBMUbaT>G{c_Z0*CrXHc|Fu^N$||3NqP$T>m*EH-XH+AzQ+m%EvxF zJCpIZD~_IaKAG~!d%X51@C726+Nri3Ybo(ZL}D_AYVM@|8WrViebU5^!EXDhmhDs! z?kFGD`%-+jwtmO8f(K|2mlaFaiL9a^g{HopcWrzS@OLxo%7pq_%tcmyEYO#c6DY94 zeIMCdZ#L#K{h31g2Hv#F07TG VA9nvPAnSiz+RtL zN)Dd||DjMQUghXo3e #y(YPPY su_ml zL)F8ysRHF<@{M|-HW0U3#C1bJkLnn3IACHAWm`n`mJFJp(J~HR1uiWk%ubHJM!A05 z$)?vKA<;ao;~z<-yi$A10tWcVa`IUO9SGQe{bFozH>whRJNi7;LEdhj{Bb@+GCLgn zeLbY}<{}A$4?rBSJRps^=dlm_U|ZE($a4kH>NGBXMm@N2_(6vy$Y(5s7G!qYhXKN# zBVU`!Ao~o=+t)~N@%#6*pFVpY8Lwk(t>%1p0fan9rkKBYgY*1%u_`RTf3n|Hpic(; z>zv6PYcQf!4z|?~=RIkXE`G?53$gR%Gj_Vhx&;x~l#c}^8O(z|l{X!<+d@90F%zG@ zm8 zfAE}Ui&eMaIXgQ$9h@>RyBch3#Fx(14*TrYT+d%M-@SK_&vCK&a<#ZkI7$Nfq_V0? zt+~;2lXb1{AfSlu{nXbRa#I_70JD&JQ1iovzm7_5L+4YhEt+sRC#OOD12Xfy0c*57 zF>vq|ZnOK7!Er#=DPSa#ZC-QENN&2jTfS~?Aihx?x!2`KFmAF0*O;@l+*!Ey*eB68 zqY2g~^#+o-oYq@_k6wKFYBsGToRK)DTNts29$B|jb2uZe4DQAcpvjNYcsCHTJnT-p zJx-tXwT*5LRYiyIwB|Zh3)y`u=i24&ozfKVIS9zd6NT>s0Y9fR>;FlhA2ARjcS%pd zz{Bc4l!*>gq5Xn|g_q*s`lL=I^pf}+8BpcWBJ+id>QkLR!ax6#TnqPbdK0qx3{XD~ z5Y77@TSZ8ecW+Xx{G#KE2f^pZeNHv3p*ykT+c^v~G&GEWxY*ng4zPFcYk2rD$e7S( zQ?q+{FozHDl8|(d7i#dm>m-oULJgSQ#Fr!J=na&>eT@frcpbdF4+6qO-a;%TZ)aEH z!?RN*CkQY#-pG}0gJp1k3IK_-?fYfXc%%YcS~%u{V$Q%JG(%wR9WQ(C&1|oWrENgg zY6(nr)4~;`9*o^y * zi5(psAzhMCAYW<%_ZOypK?~A8!;{axBba;}`ux`j4GPVM?zL|Mi<_>yf+X}LZO;ck zb-jBDv9~G?;ROq?soqm*?R|4^3OfdX?1jkvEE~V^!(8J3yha?;PxnvEYYhQ_29JzV z5T6%_!(94R9sU&8N=RG6xco`eN6uY^L}E0Hew9jWRchb8d$-(gXwBi^4#nd`nXrO_ zCk1o9Hz_@XyQ97O1-`3(Rq%-)U(pTyQP5fcI`{|L#BIp3 !tA2(K#Di+a@CnW^<=~?WWj|CP)aR miFA5m zw*dO)>!V}6o7#eMhrilU)aujGLMYEcrj7h^CP&ZNT|Vho;I9eIsT3DIj{L7g 2B%E4MXAoL%sRpHKYQP2pJq||>Z@g# z0e6--c;!~W&JiWI{oh)EE; h~{D3CAkQ;=T(}YXv5(5+qWM;y>*7%@=+3kc2+j+tz7AV z)c$!$-3AT;-rFkkgT`q;1Bso}cHNdjh&867rRAI$AFqF2Ibn0)+(O_S$O4hT*Z|>& z =qzD%#EFpRG5TcKL8%jUcf#)zI>P33_>yF$CeYsaG!YQYbb|aZ3h!+ zr8O9m39rY(!m7_NBxIu_-M{5z ;W%uadAOFO8R-h;gzf`?!LR& zr=TD;6B8agBz_IVeCcvh27msHZ3Ta@Qj?hI r^1~tT$@c9MD5d{}hmvRf2FcD6 zld8h@=l!#DZ*eHd#>T-3>Evc-$6ofn9ep$XunK8Fb&AisyL69wX=Z+3``k@Xh&XC# z!90rkInms)Snlo>a<7c|8~h;fL!7R;{I^|!Rg-bd07L17XtI-Q*TXYLKOb;PG=e zqnsZ>e&mu<-mSM3=!ZkqZ8}b ;_PvtvS;M=j zpKf4_@Hk!l3rQd@K0dQuEp&Wc&C}{nyl%DCojk0zi?QQHpQDwHb+rPg@yz1ly|V2q zd0(Kw(Y+CAqIGUBJcgbAK7a1$%b%C_7OT9pUS{$9`>=-rw)t;j-H&F+ipqLQQ~4G3 zp{F^a1s+fKcA6D9&K BaHsVTqul{T>X{P4?P$0LS(&Z1Y+woF?i z{%=~lp5vb_hbdV4op$c@yN{mS>wY5@-$K5bNoncV16eLeYqmRMc)PmIwdX`*SfbNg zJW9_)a}S=8{CXvAQcO<~P@-Kl1kuVjwZ5Mq_4s0MKu03wkHg+fFlrR@Dtt96sd4!( z#1>v0Ex~drKVJDYT0RE$k=rs%F5ld_CddFtq@eT?Tz8~3uJNTS{nic$t64DqGY_}X zvyVFQnmgqmK8JnKr+Q(z=!x1|PaDaNXi&lqU?BD55g-$Zq%|4vj~)g=fOl|3>Oze8 z5IX?2eL+A%a^D}tAnvW1kdngLH^$lP=x$?UW6Jv=_!}lZRrsTHLR{P -jIAn~FY>J48C@3hrb-o^S^bd-X zxa)C;NCd-C){NbzMUvnG71R9QD}!@$w$9jf?@km|SoGZmoRaZ%(x}`ZX(xY !K7PDlUz8MeP~2l*EE2Gphy{C5wH5aAwV6z0JidpT8+ z1c=5a{sKp3hPwUZHjx$Q@PccY*d+*&p!28OMQAbr%A9y&hKI8^-VjrA=?7me`jFMl zI}=M_5ayiv)dXbXm sWhLJd0^Gc!~09aoDV=FN%%e1s=@&{ z74_2H=Wjfr_t_0-FMJakj9t8*Y7*Ac4B*Im=k%*UD)AnoP8CI(Zhyz)j*SQ=JA*{Alq!IqtK)+hsZ<)Pv<2$r%hFZz9)r=7 zCUu)(4f)4SL=`QP=ub(8=eHWuZ**m8?o-ZGKnUxks57SAl0ofjD-dT*UF(mKShr@D z?PjoZ^~3vnqV0+*ovw^}k{!#FOYW1op2ahQp6?O2#z|cdybecZArPK~+b>kNqMnmp zyxH>aduvpZ! #G-6$c>4fTy5O4gzgR43- zH04K}ca-ySkEmJjI0gc-N*(8(3kX7pbS ;B^I`Tq z5VOS=catR#$8PhhVp9lD;C5*`PDEl1%36Zq{*@+HC?+*|OA#wmav-C$b;$nED262f z>q*7 *dvYd-L7it|NYyl4Kmuj3w^Mva=@2Q^c!r>DwQ@1OFB*4Zum+C!Fg z?r{6}yr_vRd+bIkt53urrr~uM534hRQu`b9CVRA{V4uLw08gv>J5JqlsV^=5Xz#%* zcoV{9^G}SR{p=$FhVOmB)zt!zF`I+Q;(tMBQfQ0X&AYm~6urE>`u$ni*f?%r=i6%k znWd ih2a*t_H+g^IiV`$wj&7{Iwz% z;knq%;@7nP$*f+@=YL *lxcjb<$dm;Nk}Y z>sMCzj}!5DnM%t?fX>Rr_GmV5(roy@jE|Cv%47~XCzXG`a`L400`g+d4Kmo$Yx%jk zimk1!1jNKH2KZJw1V7fS6N3ybR8&-c^!N8ezBA4q%GjvO$_BHBm^K{K(9q0TFN|it za)U|>q}SLUKUNe?C56DK!ya%z^xOFbm&=2g7eoO?$KHr-zMtO?7(^ksX{~umpbXtz zxoWhQ+^KdrK!V$!J3EQKNs8G=jt@`aub5^2&jXZJ>ZqJY6xE0E@4Wd+uyg*(r~lV; zAFTCnCpCY5e?M`%cf>CLM|w*7dx@XS481Z@bXw%mZ4pm?f1Qw5iIle#RC}&I)4rgF zF9orDHK0<(2F{1e-cHszNM li++rC!@H^6n$I3%eC_LnvW0=t%;s~oxmOMTvc_4iXp14O{%zr8fLgy%PZ{X z301h9I=h5WGCC$bfBjYUjjXLL2he6Gm|Z{Z#(sWrA?M&OxO(p%lMU`Mq+E(0Pfj2x z&=pL04*<$6yXf!(>apTG+|aiXyIo?z68QPzsMbf%#iBh#&xHX_x*tNc0JL?Cjb!Vi zZq(G&>hkh8_zZ=Gh5A%dO%Y{X+me88#k&vzSEx|ZO~3YK4;nuJ@;IvvTWR+mO8V}< zdCJI3KFU%mYq7{celJ(%WlZqj`lSx{ea4404}&RRPMnCHTKLXY1S!y!Q}d~bHlv0q zGyRT7cu+Z?m Ej4Le;`g=OFhLkt*gP?Rv-a_orL2 zqgI+jV7C0X_LYuMtok9)y@^gfTW$JUl8Z~3h?rQ$&Fy(*WhE~R **0*op`Y)l%T&Qj=TpT|%^!4tlhm_Pm1PkRENB;i(1o22ra?4PWs*>g9J6Z|v z;<+^w=ohYhN>{og?^4$TOKf>?N4~0j4dy;e`}76pcu^F1`n8{)BGBgrwx_ym*twJ| z$>rqKN>bp<{)3z_a>a1$9HCCQ&0B^13mN3z^FA|Zkbuy9So`}A33IaD9vm+qyzA