From 9135341847cef13c63c44bf9e8b8c79750cc5b75 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Thu, 19 Oct 2017 23:23:43 -0500 Subject: [PATCH] Steals Bays modular armor, for later use --- code/__defines/items_clothing.dm | 13 + code/modules/clothing/suits/armor.dm | 68 ++++++ .../clothing/under/accessories/armor.dm | 228 ++++++++++++++++++ .../mob/living/carbon/human/human_defense.dm | 24 +- icons/mob/modular_armor.dmi | Bin 0 -> 4820 bytes icons/obj/clothing/modular_armor.dmi | Bin 0 -> 2641 bytes polaris.dme | 1 + 7 files changed, 324 insertions(+), 10 deletions(-) create mode 100644 code/modules/clothing/under/accessories/armor.dm create mode 100644 icons/mob/modular_armor.dmi create mode 100644 icons/obj/clothing/modular_armor.dmi diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 0a8598d21f..7c80895a81 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -22,6 +22,19 @@ #define SLOT_TIE 0x4000 #define SLOT_HOLSTER 0x8000 //16th bit - higher than this will overflow +#define ACCESSORY_SLOT_UTILITY "Utility" +#define ACCESSORY_SLOT_ARMBAND "Armband" +#define ACCESSORY_SLOT_RANK "Rank" +#define ACCESSORY_SLOT_DEPT "Department" +#define ACCESSORY_SLOT_DECOR "Decor" +#define ACCESSORY_SLOT_MEDAL "Medal" +#define ACCESSORY_SLOT_INSIGNIA "Insignia" +#define ACCESSORY_SLOT_ARMOR_C "Chest armor" +#define ACCESSORY_SLOT_ARMOR_A "Arm armor" +#define ACCESSORY_SLOT_ARMOR_L "Leg armor" +#define ACCESSORY_SLOT_ARMOR_S "Armor storage" +#define ACCESSORY_SLOT_ARMOR_M "Misc armor" + // Flags bitmasks. #define NOBLUDGEON 0x1 // When an item has this it produces no "X has been hit by Y with Z" message with the default handler. #define CONDUCT 0x2 // Conducts electricity. (metal etc.) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 68b656f0d7..864ee369ba 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -455,3 +455,71 @@ desc = "Pukish armor." icon_state = "tdgreen" siemens_coefficient = 1 + +//Modular plate carriers +/obj/item/clothing/suit/armor/pcarrier + name = "plate carrier" + desc = "A lightweight black plate carrier vest. It can be equipped with armor plates, but provides no protection of its own." + icon = 'icons/obj/clothing/modular_armor.dmi' + item_icons = list(slot_wear_suit_str = 'icons/mob/modular_armor.dmi') + icon_state = "pcarrier" + valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S, ACCESSORY_SLOT_ARMOR_M) + restricted_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMOR_C, ACCESSORY_SLOT_ARMOR_A, ACCESSORY_SLOT_ARMOR_L, ACCESSORY_SLOT_ARMOR_S) + blood_overlay_type = "armor" + +/obj/item/clothing/suit/armor/pcarrier/light + starting_accessories = list(/obj/item/clothing/accessory/armorplate) + +/obj/item/clothing/suit/armor/pcarrier/light/sol + starting_accessories = list(/obj/item/clothing/accessory/armorplate, /obj/item/clothing/accessory/armor/tag) + +/obj/item/clothing/suit/armor/pcarrier/light/nt + starting_accessories = list(/obj/item/clothing/accessory/armorplate, /obj/item/clothing/accessory/armor/tag/nt) + +/obj/item/clothing/suit/armor/pcarrier/medium + starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches) + +/obj/item/clothing/suit/armor/pcarrier/medium/sol + starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag) + +/obj/item/clothing/suit/armor/pcarrier/medium/security + starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/sec) + +/obj/item/clothing/suit/armor/pcarrier/medium/command + starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/com) + +/obj/item/clothing/suit/armor/pcarrier/medium/nt + starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/nt) + +/obj/item/clothing/suit/armor/pcarrier/blue + name = "blue plate carrier" + desc = "A lightweight blue plate carrier vest. It can be equipped with armor plates, but provides no protection of its own." + icon_state = "pcarrier_blue" + +/obj/item/clothing/suit/armor/pcarrier/blue/sol + name = "peacekeeper plate carrier" + desc = "A lightweight plate carrier vest in SCG Peacekeeper colors. It can be equipped with armor plates, but provides no protection of its own." + starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches/blue, /obj/item/clothing/accessory/armguards/blue, /obj/item/clothing/accessory/armor/tag) + +/obj/item/clothing/suit/armor/pcarrier/green + name = "green plate carrier" + desc = "A lightweight green plate carrier vest. It can be equipped with armor plates, but provides no protection of its own." + icon_state = "pcarrier_green" + +/obj/item/clothing/suit/armor/pcarrier/navy + name = "navy plate carrier" + desc = "A lightweight navy blue plate carrier vest. It can be equipped with armor plates, but provides no protection of its own." + icon_state = "pcarrier_navy" + +/obj/item/clothing/suit/armor/pcarrier/tan + name = "tan plate carrier" + desc = "A lightweight tan plate carrier vest. It can be equipped with armor plates, but provides no protection of its own." + icon_state = "pcarrier_tan" + +/obj/item/clothing/suit/armor/pcarrier/tan/tactical + name = "tactical plate carrier" + starting_accessories = list(/obj/item/clothing/accessory/armorplate/tactical, /obj/item/clothing/accessory/storage/pouches/large/tan) + +/obj/item/clothing/suit/armor/pcarrier/merc + starting_accessories = list(/obj/item/clothing/accessory/armorplate/merc, /obj/item/clothing/accessory/armguards/merc, /obj/item/clothing/accessory/legguards/merc, /obj/item/clothing/accessory/storage/pouches/large) + diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm new file mode 100644 index 0000000000..0caa62b2a2 --- /dev/null +++ b/code/modules/clothing/under/accessories/armor.dm @@ -0,0 +1,228 @@ +//Pouches +/obj/item/clothing/accessory/storage/pouches + name = "storage pouches" + desc = "A collection of black pouches that can be attached to a plate carrier. Carries up to two items." + icon_override = 'icons/mob/modular_armor.dmi' + icon = 'icons/obj/clothing/modular_armor.dmi' +// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi') + icon_state = "pouches" + gender = PLURAL + slot = ACCESSORY_SLOT_ARMOR_S + slots = 2 + +/obj/item/clothing/accessory/storage/pouches/blue + desc = "A collection of blue pouches that can be attached to a plate carrier. Carries up to two items." + icon_state = "pouches_blue" + +/obj/item/clothing/accessory/storage/pouches/navy + desc = "A collection of navy blue pouches that can be attached to a plate carrier. Carries up to two items." + icon_state = "pouches_navy" + +/obj/item/clothing/accessory/storage/pouches/green + desc = "A collection of green pouches that can be attached to a plate carrier. Carries up to two items." + icon_state = "pouches_green" + +/obj/item/clothing/accessory/storage/pouches/tan + desc = "A collection of tan pouches that can be attached to a plate carrier. Carries up to two items." + icon_state = "pouches_tan" + +/obj/item/clothing/accessory/storage/pouches/large + name = "large storage pouches" + desc = "A collection of black pouches that can be attached to a plate carrier. Carries up to four items." + icon_state = "lpouches" + slots = 4 + +/obj/item/clothing/accessory/storage/pouches/large/blue + desc = "A collection of blue pouches that can be attached to a plate carrier. Carries up to four items." + icon_state = "lpouches_blue" + +/obj/item/clothing/accessory/storage/pouches/large/navy + desc = "A collection of navy blue pouches that can be attached to a plate carrier. Carries up to four items." + icon_state = "lpouches_navy" + +/obj/item/clothing/accessory/storage/pouches/large/green + desc = "A collection of green pouches that can be attached to a plate carrier. Carries up to four items." + icon_state = "lpouches_green" + +/obj/item/clothing/accessory/storage/pouches/large/tan + desc = "A collection of tan pouches that can be attached to a plate carrier. Carries up to four items." + icon_state = "lpouches_tan" + +//Armor plates +/obj/item/clothing/accessory/armorplate + name = "light armor plate" + desc = "A basic armor plate made of steel-reinforced synthetic fibers. Attaches to a plate carrier." + icon = 'icons/obj/clothing/modular_armor.dmi' + icon_state = "armor_light" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + armor = list(melee = 30, bullet = 15, laser = 40, energy = 10, bomb = 25, bio = 0, rad = 0) + slot = ACCESSORY_SLOT_ARMOR_C + +/obj/item/clothing/accessory/armorplate/medium + name = "medium armor plate" + desc = "A plasteel-reinforced synthetic armor plate, providing good protection. Attaches to a plate carrier." + icon_state = "armor_medium" + armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0) + +/obj/item/clothing/accessory/armorplate/tactical + name = "tactical armor plate" + desc = "A medium armor plate with additional ablative coating. Attaches to a plate carrier." + icon_state = "armor_tactical" + armor = list(melee = 40, bullet = 40, laser = 60, energy = 35, bomb = 30, bio = 0, rad = 0) + +/obj/item/clothing/accessory/armorplate/merc + name = "heavy armor plate" + desc = "A ceramics-reinforced synthetic armor plate, providing state of of the art protection. Attaches to a plate carrier." + icon_state = "armor_heavy" + armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) + +//Arm guards +/obj/item/clothing/accessory/armguards + name = "arm guards" + desc = "A pair of black arm pads reinforced with armor plating. Attaches to a plate carrier." + icon_override = 'icons/mob/modular_armor.dmi' + icon = 'icons/obj/clothing/modular_armor.dmi' +// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi') + icon_state = "armguards" + gender = PLURAL + body_parts_covered = ARMS + armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0) + slot = ACCESSORY_SLOT_ARMOR_A + +/obj/item/clothing/accessory/armguards/blue + desc = "A pair of blue arm pads reinforced with armor plating. Attaches to a plate carrier." + icon_state = "armguards_blue" + +/obj/item/clothing/accessory/armguards/navy + desc = "A pair of navy blue arm pads reinforced with armor plating. Attaches to a plate carrier." + icon_state = "armguards_navy" + +/obj/item/clothing/accessory/armguards/green + desc = "A pair of green arm pads reinforced with armor plating. Attaches to a plate carrier." + icon_state = "armguards_green" + +/obj/item/clothing/accessory/armguards/tan + desc = "A pair of tan arm pads reinforced with armor plating. Attaches to a plate carrier." + icon_state = "armguards_tan" + +/obj/item/clothing/accessory/armguards/merc + name = "heavy arm guards" + desc = "A pair of red-trimmed black arm pads reinforced with heavy armor plating. Attaches to a plate carrier." + icon_state = "armguards_merc" + armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) + +//Leg guards +/obj/item/clothing/accessory/legguards + name = "leg guards" + desc = "A pair of armored leg pads in black. Attaches to a plate carrier." + icon_override = 'icons/mob/modular_armor.dmi' + icon = 'icons/obj/clothing/modular_armor.dmi' +// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi') + icon_state = "legguards" + gender = PLURAL + body_parts_covered = LEGS + armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0) + slot = ACCESSORY_SLOT_ARMOR_L + +/obj/item/clothing/accessory/legguards/blue + desc = "A pair of armored leg pads in blue. Attaches to a plate carrier." + icon_state = "legguards_blue" + +/obj/item/clothing/accessory/legguards/navy + desc = "A pair of armored leg pads in navy blue. Attaches to a plate carrier." + icon_state = "legguards_navy" + +/obj/item/clothing/accessory/legguards/green + desc = "A pair of armored leg pads in green. Attaches to a plate carrier." + icon_state = "legguards_green" + +/obj/item/clothing/accessory/legguards/tan + desc = "A pair of armored leg pads in tan. Attaches to a plate carrier." + icon_state = "legguards_tan" + +/obj/item/clothing/accessory/legguards/merc + name = "heavy leg guards" + desc = "A pair of heavily armored leg pads in red-trimmed black. Attaches to a plate carrier." + icon_state = "legguards_merc" + armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) + + +//Decorative attachments +/obj/item/clothing/accessory/armor/tag + name = "\improper SCG Flag" + desc = "An emblem depicting the Sol Central Government's flag." + icon_override = 'icons/mob/modular_armor.dmi' + icon = 'icons/obj/clothing/modular_armor.dmi' +// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi') + icon_state = "solflag" + slot = ACCESSORY_SLOT_ARMOR_M + +/obj/item/clothing/accessory/armor/tag/ec + name = "\improper Expeditionary Corps crest" + desc = "An emblem depicting the crest of the SCG Expeditionary Corps." + icon_state = "ecflag" + +/obj/item/clothing/accessory/armor/tag/sec + name = "\improper POLICE tag" + desc = "An armor tag with the word POLICE printed in silver lettering on it." + icon_state = "sectag" + +/obj/item/clothing/accessory/armor/tag/com + name = "\improper SCG tag" + desc = "An armor tag with the words SOL CENTRAL GOVERNMENT printed in gold lettering on it." + icon_state = "comtag" + +/obj/item/clothing/accessory/armor/tag/nt + name = "\improper CORPORATE SECURITY tag" + desc = "An armor tag with the words CORPORATE SECURITY printed in red lettering on it." + icon_state = "nanotag" + +/obj/item/clothing/accessory/armor/tag/pcrc + name = "\improper PCRC tag" + desc = "An armor tag with the words PROXIMA CENTAURI RISK CONTROL printed in cyan lettering on it." + icon_state = "pcrctag" + +/obj/item/clothing/accessory/armor/tag/saare + name = "\improper SAARE tag" + desc = "An armor tag with the acronym SAARE printed in olive-green lettering on it." + icon_state = "saaretag" + +/obj/item/clothing/accessory/armor/tag/opos + name = "\improper O+ blood patch" + desc = "An embroidered patch indicating the wearer's blood type as O POSITIVE." + icon_state = "opostag" + +/obj/item/clothing/accessory/armor/tag/oneg + name = "\improper O- blood patch" + desc = "An embroidered patch indicating the wearer's blood type as O NEGATIVE." + icon_state = "onegtag" + +/obj/item/clothing/accessory/armor/tag/apos + name = "\improper A+ blood patch" + desc = "An embroidered patch indicating the wearer's blood type as A POSITIVE." + icon_state = "apostag" + +/obj/item/clothing/accessory/armor/tag/aneg + name = "\improper A- blood patch" + desc = "An embroidered patch indicating the wearer's blood type as A NEGATIVE." + icon_state = "anegtag" + +/obj/item/clothing/accessory/armor/tag/bpos + name = "\improper B+ blood patch" + desc = "An embroidered patch indicating the wearer's blood type as B POSITIVE." + icon_state = "bpostag" + +/obj/item/clothing/accessory/armor/tag/bneg + name = "\improper B- blood patch" + desc = "An embroidered patch indicating the wearer's blood type as B NEGATIVE." + icon_state = "bnegtag" + +/obj/item/clothing/accessory/armor/tag/abpos + name = "\improper AB+ blood patch" + desc = "An embroidered patch indicating the wearer's blood type as AB POSITIVE." + icon_state = "abpostag" + +/obj/item/clothing/accessory/armor/tag/abneg + name = "\improper AB- blood patch" + desc = "An embroidered patch indicating the wearer's blood type as AB NEGATIVE." + icon_state = "abnegtag" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index e37be0e032..87246e3fe4 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -149,22 +149,26 @@ emp_act if(!type || !def_zone) return 0 var/protection = 0 var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) - for(var/gear in protective_gear) - if(gear && istype(gear ,/obj/item/clothing)) - var/obj/item/clothing/C = gear - if(istype(C) && C.body_parts_covered & def_zone.body_part) - protection += C.armor[type] + for(var/obj/item/clothing/gear in protective_gear) + if(gear.body_parts_covered & def_zone.body_part) + protection += gear.armor[type] + if(gear.accessories.len) + for(var/obj/item/clothing/accessory/bling in gear.accessories) + if(bling.body_parts_covered & def_zone.body_part) + protection += bling.armor[type] return protection /mob/living/carbon/human/proc/getsoak_organ(var/obj/item/organ/external/def_zone, var/type) if(!type || !def_zone) return 0 var/soaked = 0 var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) - for(var/gear in protective_gear) - if(gear && istype(gear ,/obj/item/clothing)) - var/obj/item/clothing/C = gear - if(istype(C) && C.body_parts_covered & def_zone.body_part) - soaked += C.armorsoak[type] + for(var/obj/item/clothing/gear in protective_gear) + if(gear.body_parts_covered & def_zone.body_part) + soaked += gear.armorsoak[type] + if(gear.accessories.len) + for(var/obj/item/clothing/accessory/bling in gear.accessories) + if(bling.body_parts_covered & def_zone.body_part) + soaked += bling.armorsoak[type] return soaked /mob/living/carbon/human/proc/check_head_coverage() diff --git a/icons/mob/modular_armor.dmi b/icons/mob/modular_armor.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2c7d8ea841cb95f616d640976c637e9115f9c07e GIT binary patch literal 4820 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 OsjI7MtGrP%3;rLm%AuMXMz=4Y^v>uGUs5 zNi8Ks?NpU&aU&IdYFA#~yYJoi-}}CqbIv#O`)1DXoS8Fo*WUIrNI*sa004k2EzBG_ zdj4OXkBcK!Hws5NieYcH7oeo1#PQk#0FaQ7C;$KgImn|Uz{m)> zgB(H*;SfRJoxQ+89E*0ebpl*mn&Kdisp6d7qs;=M{3Am!(IFAx06-l1(L{TAGF+T{ zUfP)3YO5j0w`UagYU27x zUtgs3-?HtzoCmE!L&H~odbSnJ?_J3i#vMuBBDFQy>s?o0dMW=OI8 zCoJTMskt_PTyrv<&a-OUZg@Ml_53c3rdcI!jdIyxCijD|HfjIsn*n3fjjVbLR|3K50V+-oouOhf4=yxm=jF0Ki#C@xm)_lOZBudua7QMYeP18G&!R}qp?B~ zM<01ysKJ<=TLBGhrfR5YF>!ROhG!=-s!QjF!%C>2pzw4Gt=PB5z-1u$B-6viye^O3 zDe(O(I@7mgo-VK{2r{p8VbKJ>OL%4$qj~F0xaz(x9Ze9EbvySIJ!4hazYC=GR(){n z*eK<>oaRyTjp!56xuA(|bY$sxVxkMQ1qfjlwQ?Br!-F`}av$1{tV(}^L|}QfKj9|B z-m~{WfJAN1+C8am8YZ{Vpl%v|Xm0uw&)a*_pAQWNr#z~trq8?uUVRq2TBoCqa(_O9 zsIsvZajj^UFR!$di|J%U1oZLM9FX?(&z7@lrnGTF{N5fX>kKD>;{w&U&TQ+a^Lw8= zyK}i87$H;u*{$baq5%tVB#4tR_!{#n(Hd!;Q{e4L9JnxyDfVyOrV;yQE_f_tc%tpSYo%p!vwWjh3ulr-hU~taT`pht^1*8b zuRgJ@o}i*Uw}0V2m7zS@F^}J?fo5=KOalAG5g z_kJDcKw2i*+niCZw$Ck`J#xWUypv*E$dH({X&(QySM=-2AIjF?AAMO{0GYJ>I$c$QP{ozsKYf1(B{d)AC3HO`w?m+0%_>0a<>=sHu5G>|9wa7vWu%yQ zP4pP(uh`OVE_7xW%5VQvfJ-f1A znZ(4f#X4p{%66ra^D&#fo}f z<|G2&F8_S%^mNl8B`lX|q)?t6yEUA}2U>iB#N~A~N(8-bNQ*HGmSVH0a-uRl2Kb*U z?T^Km?F4!d_~M(@ta)*@l(-;aEp)$-?Sc^Ybpvl9Hh{MblZKd^=6YZHBH5|cRF2I` z3iO=r3Q05=`%!Z|#tm){gGymfj!hVF&)nrV_u_8av`yMm?<%h>Zk|&b4!4FgmCLJR z1){S(*U>~K(4z-`{{QN=rnDEQc9@pKpe{E%VmMz1PAu9qXP*0>9Wi}A;(Y7G^oG{G z*|?xuu-G_iFvw7%l9EAT0HVyp%?5q3AmV9@ED$8q##(AvUE9 zLoxC(O0+;udY!M036-WlQ$PoEjHcAw{C8i)xMAn=VZD8IS75ck0R;WSVz8p#i1f_& zaWw~D^og?EchRY}fleBqu2JCK&e%I)A>{`;McKru@IK55nCn&Zi`NI(EW!EPfgckP zENsw-m4ICx=6KgHPn;-{%yMT$Z=B}|dCAK0!{9l-iNaCGSsJA(g2j77A zpRymo`1_$bW<@ zk2T0dnZ`zK{gJEjRb^DLlpFk1s>zoqUXnLGFu>A$WB=&Z--%F^6B0>+2<;)Dcal2} z0}g>i7Q$sx>b#2eWbt!~{FNuEz#CW@F|(F$h;ht;odbuBpN0JokLuBOyU-#jqiZ=S zKGYpUd|~4BYKlhMuJ@_`6;jTvry1?a+{oGMvLtm*wurvceOk@+`OqQWKWOKdPj_td z;i7T3aOtb}KuO-JWx{P=8c?!Qm&DAFJ38o^jwEJu6Ki3PW5RJrwQbaYkL#ZiebGzZR?Kb>i(7f}O@(C$dw}Cw+B+TJtG1b(+l=49qCTD3 z)QS4l%3ru2QHsDWugkS@)@DDLUz>z9>BiP5kQ