From a7f631f364323dee3d2ac3fe8326777b3fa6be00 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 1 Mar 2015 01:07:14 -0500 Subject: [PATCH] Health and Stack Fixes --- code/game/objects/items/stacks/rods.dm | 30 +++++++----- .../objects/items/stacks/sheets/mineral.dm | 6 +-- .../items/stacks/sheets/sheet_types.dm | 6 +-- .../objects/items/stacks/sheets/sheets.dm | 2 +- code/game/objects/items/stacks/stack.dm | 4 +- .../objects/items/stacks/tiles/plasteel.dm | 6 +-- code/game/objects/items/weapons/shards.dm | 45 ++++++------------ .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 3 ++ .../mob/living/carbon/human/inventory.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 6 +-- .../modules/mob/living/carbon/metroid/life.dm | 2 +- code/modules/mob/living/carbon/monkey/life.dm | 2 +- code/modules/mob/living/living.dm | 12 +++-- code/modules/mob/mob.dm | 11 +++-- sound/weapons/grenadelaunch.ogg | Bin 0 -> 9251 bytes 16 files changed, 67 insertions(+), 72 deletions(-) create mode 100644 sound/weapons/grenadelaunch.ogg diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 3d6ce2459ec..a4d429a655e 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,42 +1,46 @@ /obj/item/stack/rods - name = "metal rods" + name = "metal rod" desc = "Some rods. Can be used for building, or something." singular_name = "metal rod" icon_state = "rods" + item_state = "rods" flags = CONDUCT w_class = 3.0 force = 9.0 - throwforce = 15.0 - throw_speed = 5 - throw_range = 20 - m_amt = 1875 + throwforce = 10.0 + throw_speed = 3 + throw_range = 7 + m_amt = 1000 max_amount = 60 attack_verb = list("hit", "bludgeoned", "whacked") + hitsound = 'sound/weapons/grenadelaunch.ogg' /obj/item/stack/rods/New(var/loc, var/amount=null) + ..() + update_icon() - return ..() /obj/item/stack/rods/update_icon() - if(get_amount() <= 5) - icon_state = "rods-[get_amount()]" + var/amount = get_amount() + if((amount <= 5) && (amount > 0)) + icon_state = "rods-[amount]" else icon_state = "rods" /obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob, params) - ..() if (istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W - if(amount < 2) - user << "\red You need at least two rods to do this." + if(get_amount() < 2) + user << "You need at least two rods to do this." return if(WT.remove_fuel(0,user)) var/obj/item/stack/sheet/metal/new_item = new(usr.loc) new_item.add_to_stacks(usr) - for (var/mob/M in viewers(src)) - M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) + user.visible_message("[user.name] shaped [src] into metal with the weldingtool.", \ + "You shaped [src] into metal with the weldingtool.", \ + "You hear welding.") var/obj/item/stack/rods/R = src src = null var/replace = (user.get_inactive_hand()==R) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 52f94679a42..4ad71cb9c93 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -77,7 +77,7 @@ obj/item/stack/sheet/mineral/iron origin_tech = "materials=1" sheettype = "iron" color = "#333333" - perunit = 3750 + perunit = 2000 obj/item/stack/sheet/mineral/iron/New() ..() @@ -88,7 +88,7 @@ obj/item/stack/sheet/mineral/iron/New() desc = "This appears to be a combination of both sand and stone." singular_name = "sandstone brick" icon_state = "sheet-sandstone" - throw_speed = 4 + throw_speed = 3 throw_range = 5 origin_tech = "materials=1" sheettype = "sandstone" @@ -101,7 +101,7 @@ obj/item/stack/sheet/mineral/iron/New() name = "diamond" icon_state = "sheet-diamond" origin_tech = "materials=6" - perunit = 3750 + perunit = 2000 sheettype = "diamond" diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 56a78e1065c..4545936e722 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -78,7 +78,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ singular_name = "metal sheet" icon_state = "sheet-metal" m_amt = 3750 - throwforce = 14.0 + throwforce = 10.0 flags = CONDUCT origin_tech = "materials=1" @@ -88,7 +88,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ singular_name = "metal sheet" icon_state = "sheet-metal" m_amt = 0 - throwforce = 14.0 + throwforce = 10.0 flags = CONDUCT /obj/item/stack/sheet/metal/New(var/loc, var/amount=null) @@ -115,7 +115,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ icon_state = "sheet-plasteel" item_state = "sheet-metal" m_amt = 7500 - throwforce = 15.0 + throwforce = 10.0 flags = CONDUCT origin_tech = "materials=2" diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 8482d4a7cd1..739c625cb54 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -4,7 +4,7 @@ force = 5 throwforce = 5 max_amount = 50 - throw_speed = 3 + throw_speed = 1 throw_range = 3 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") var/perunit = MINERAL_MATERIAL_AMOUNT diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 15aa4938875..32c04c5b6a7 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -184,9 +184,9 @@ continue oldsrc.attackby(item, usr) usr << "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s." - if(!oldsrc) + if(oldsrc.amount <= 0) break - update_icon() + oldsrc.update_icon() /obj/item/stack/proc/get_amount() return amount diff --git a/code/game/objects/items/stacks/tiles/plasteel.dm b/code/game/objects/items/stacks/tiles/plasteel.dm index 80c0a6919d1..ee9c5832f72 100644 --- a/code/game/objects/items/stacks/tiles/plasteel.dm +++ b/code/game/objects/items/stacks/tiles/plasteel.dm @@ -6,9 +6,9 @@ w_class = 3.0 force = 6.0 m_amt = 937.5 - throwforce = 15.0 - throw_speed = 5 - throw_range = 20 + throwforce = 10.0 + throw_speed = 3 + throw_range = 7 flags = CONDUCT max_amount = 60 diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index c406a1bea1d..ed1535eb4d9 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -7,33 +7,19 @@ sharp = 1 edge = 1 desc = "Could probably be used as ... a throwing weapon?" - w_class = 2.0 + w_class = 1.0 force = 5.0 - throwforce = 8.0 + throwforce = 10.0 item_state = "shard-glass" -// matter = list("glass" = 3750) + g_amt = MINERAL_MATERIAL_AMOUNT attack_verb = list("stabbed", "slashed", "sliced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' /obj/item/weapon/shard/suicide_act(mob/user) viewers(user) << pick("\red [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.", \ "\red [user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.") return (BRUTELOSS) -/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return ..() - -/obj/item/weapon/shard/Bump() - - spawn( 0 ) - if (prob(20)) - src.force = 15 - else - src.force = 4 - ..() - return - return - /obj/item/weapon/shard/New() src.icon_state = pick("large", "medium", "small") @@ -50,23 +36,20 @@ else return -/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - ..() - if ( istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W +/obj/item/weapon/shard/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = I if(WT.remove_fuel(0, user)) var/obj/item/stack/sheet/glass/NG = new (user.loc) - for (var/obj/item/stack/sheet/glass/G in user.loc) - if(G==NG) + for(var/obj/item/stack/sheet/glass/G in user.loc) + if(G == NG) continue - if(G.amount>=G.max_amount) + if(G.amount >= G.max_amount) continue - G.attackby(NG, user, params) - usr << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheets." - //SN src = null - del(src) - return - return ..() + G.attackby(NG, user) + user << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s." + qdel(src) + ..() /obj/item/weapon/shard/Crossed(AM as mob|obj) if(ismob(AM)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index e5a3413bb2e..c107068955f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -213,7 +213,7 @@ distance = 1 if (src.stat) msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n" - if((stat == 2 || src.health < config.health_threshold_crit) && distance <= 3) + if((stat == 2 || src.health <= config.health_threshold_crit) && distance <= 3) msg += "[t_He] does not appear to be breathing.\n" if(istype(usr, /mob/living/carbon/human) && !usr.stat && distance <= 1) for(var/mob/O in viewers(usr.loc, null)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 05e8bdd1ef9..328197ce46b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1680,3 +1680,6 @@ /mob/living/carbon/human/canBeHandcuffed() return 1 + +/mob/living/carbon/human/InCritical() + return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index f56ee3a3cc7..a9bad50b27a 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -735,7 +735,7 @@ It can still be worn/put on as normal. W.layer = initial(W.layer) W.add_fingerprint(source) if("CPR") - if ((target.health > config.health_threshold_dead && target.health < config.health_threshold_crit)) + if ((target.health > config.health_threshold_dead && target.health <= config.health_threshold_crit)) var/suff = min(target.getOxyLoss(), 7) target.adjustOxyLoss(-suff) target.updatehealth() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 3877fa52634..6c2c876ef50 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -397,7 +397,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc var/datum/gas_mixture/breath // HACK NEED CHANGING LATER - if(health < config.health_threshold_crit) + if(health <= config.health_threshold_crit) losebreath++ if(losebreath>0) //Suffocating so do not take a breath @@ -1051,7 +1051,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc analgesic = max(0, analgesic - 1) //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit > health) ) + if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) Paralyse(3) /* Done by handle_breath() @@ -1638,7 +1638,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(status_flags & GODMODE) return 0 //godmode if(analgesic || (species && species.flags & NO_PAIN)) return // analgesic avoids all traumatic shock temporarily - if(health < 0)// health 0 makes you immediately collapse + if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse shock_stage = max(shock_stage, 61) if(traumatic_shock >= 100) diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index f1aa5bea66b..66eba695377 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -203,7 +203,7 @@ death() return - else if(src.health < config.health_threshold_crit) + else if(src.health <= config.health_threshold_crit) if(!src.reagents.has_reagent("inaprovaline")) src.adjustOxyLoss(10) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 12e2c1bcacb..1cc651fdc32 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -499,7 +499,7 @@ return 1 //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit > health) ) + if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) if( health <= 20 && prob(1) ) spawn(0) emote("gasp") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1a9a1e80f2c..9f228068ab3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -23,11 +23,15 @@ */ /mob/living/verb/succumb() set hidden = 1 - if ((src.health < 0 && src.health > -95.0)) - src.adjustOxyLoss(src.health + 200) - src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src << "\blue You have given up life and succumbed to death." + if (InCritical()) + src.attack_log += "[src] has ["succumbed to death"] with [round(health, 0.1)] points of health!" + src.adjustOxyLoss(src.health - config.health_threshold_dead) + updatehealth() + src << "You have given up life and succumbed to death." + death() +/mob/living/proc/InCritical() + return (src.health < 0 && src.health > -95.0 && stat == UNCONSCIOUS) /mob/living/proc/updatehealth() if(status_flags & GODMODE) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 2047ee7f965..9f54d762431 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -757,12 +757,13 @@ var/list/slot_equipment_priority = list( \ /mob/proc/pull_damage() if(ishuman(src)) var/mob/living/carbon/human/H = src - if(H.health - H.halloss <= config.health_threshold_crit) + if(H.health - H.halloss <= config.health_threshold_softcrit) for(var/name in H.organs_by_name) var/datum/organ/external/e = H.organs_by_name[name] - if((H.lying) && ((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100)) - return 1 - break + if(H.lying) + if(((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100)) + return 1 + break return 0 /mob/MouseDrop(mob/M as mob) @@ -902,7 +903,7 @@ var/list/slot_equipment_priority = list( \ process = processScheduler.getProcess("obj") stat(null, "OBJ([processing_objects.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - + process = processScheduler.getProcess("bot") stat(null, "BOT([aibots.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") diff --git a/sound/weapons/grenadelaunch.ogg b/sound/weapons/grenadelaunch.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4662058f28aaaf2a90eae94a56b4ef64a83860f7 GIT binary patch literal 9251 zcmeHsc{tly_xMc^L1++ZD4N6;iYA1jTSBO{B}5}=iKVf%meSQU*4k^U+S-XFK}rY3 zl(th^RBfe7(M_k-O{dd+eP?_>p)>FN=J!6|_xn8W^ZoDpd2a4=?z!ilbMIO1J@;nY zu3er04!(V>cP|4i*tHCpHY{OJEH^Apf`T&|zmdc&6Q6@^lZ^cHlZ=Extxp>)zgIR{ z{M#qB%t;F(V24HXOt;1E!bgU2y_fjoo$zL4@;b7mnVEzgOlFzb(ALfy29OYj;)?I% zkL9xfKm!nSQP^t|A>MEq0VZedNs2;>Rs%p9@JVucHIJRb zN3D0^4DwhQ8z9&^@mm*49L?H09(B6g1&>LC?~% zs*Y;L4iM@pW95zN1?ahv<^Hp7h8mSFxnO=VV_|rDvgC$EiVfX_|P)JmI91Z3udTAb7Wk1+Z$sK zRf}}6alb{%==y5bKbNX!lZjiT8Xqj?R|2Ge9B)?$0y##?c2w;)wWH1gknNlX3$ zErf6~v?QF5G|vxQQVSnqi>pG~p_U~<1Q}J2@a1FWZ%3?^%I5_Qn2L#>Os@)q&W6&8 zB@0H5sy~EmX*gKcCny^$j~jJDl?#`l11c4=O$|37ocfbWrGE85h%W3#xopD>8yf2~ zR{prY69Yk+#T5qaonFiQzPUxij>^#<>j%(?%-M>FPC0)F`W#&Oazsvo`@8$lAiD)l zL1I-RsI)<9{jFUu$}(=s{)N%*4}tBg>1mJt4~H zMEva^)BLC7@83$ie=B$A%JjcG)}N6BprA=zipgSb4&`cP%2r#sWdr{aIWd^41)A3i zbX{6?-EJ6EJT3hvEJ7w&A(IIqGaVtmKPLKgd<&T6 zu(^LL{x6Xu2@#@o-b2Si>3>F!fRy*MRi2Jhp{`G%{(+KRndJ>-r=B%b%l|EMcv*F& zS#=p%PcrgInI&PF<>Joj$iXuUUH`WH897^Gb)f=9j(x1|Um~ZQqG<<3Q>(Gt+vPQG z9ETLT*M8++4FEuQKFVcjAMs$COfoGdnIjr^=kI{**vSP@yj`yujAnK3&C?3E!|!^=9GrH`7Zqm`u zB+S>#Lfak^RH*}{t1wMBDNPqCDDotq(*$tCz(!Ohrv>zNk5g%?8)>Tc%gz6+h6GVP zq@nVS4J2sX3pP&uCJU0%ZEjDaLMO?8{{0JC9u}}|f00F_y3xGc{&PwH$Kn4p@NYE$ zxj0M-`eALW2y5VcD;PNXkXDFydPU_2`Mlb&U&B>(j*Z>0qFi?3kLZ97*f-Su+8b7g z1o#6`$0>-|QPT0G=MTSzCi2QvRU|i_8V=tuks5ZH8YuqPlj8%x zhsgpyP#vWGIj0&&6#%RXgMFae(utV)Do)dMlc zE)$G`5GV=CBvK(z`P7pGBDw2tp>>n8s>9&W@dBw`Mxu60p0lx%J8!@l;B`Uw1FMqx z1J$G~D1QpEjB<+a>a7l_5ryUwf`0#E`qb3DWcF(+xY8Urxb4FmXYq|LSZR^%$TbFTnKqm>9U zAYaG{bfySVK`OTLRe`Ryj)Y())5uULZ)>D?oJn^S)-uhUO@t*(8N%^G=LUQ&lW8ae z_*z!bkBv-AZWRlJtetp>X1B<4D00IA!l zP;}sw0hG6f7uGIg$~Rp9ru_q_zUesDAF_r-QF=oX8#Rc<@=$96QdF8G-xZ4&E_X=u ze=9!lwnX_0UEPr0<3rTXNse!01pu~117Oq~7@t~H-O>#mba2UenMy$#LOBZ&8 zG)&9?f88I(hsN;H-)<2;rJ;KgvFd}lMY-(BmuHo1cVDRcW#Gp&{86dojW01OCK&G*Pc}2E9s4BvM`*F zb7`661U0tn*W?sRaECz!*oJ-NXYg2B_1a6D`qV&4stVm zs^lhCi(KlUL+K@CGxeZ9I;v6&nS;;>Ne3iOPk3{A1WA$!J2(8c5dUu-kRXW7@(2i! zq~OOTv=U&cZjeAwbGcsb5JG|=+rLL+JczQjjK`a2!26NEXHUo&n>avGVUwr~{ z%IX9|iZxw%se3*61b`!xpOL|PY-O`y6U~<4;OOkS)g77uZ0VGw0T>dwd>NIrk;vs& z51Q%H_@&88^4jY%$7EM;_xADdqPw}fEv{MATeMnSzersqFPcFRebIf|tB`pU^| zAFez*J#|WaVbdbL^Zu=mzkZLPof!SadkJqU?~gdr_KvSq{bzP!pf;8OHv4{7cd&Y}{cVlN&7;G>F9%b65b- zlz%^B)oOf{4O};%o}Z2h_R%gteD{-mlziEvG9C;?4YJP_u$1i^e*Lm<>UTu8*i)L~ zx)6YKxcxRQp=<-@Oy&N&yF!)OT@7w616B9~D5^&Mh-%b?hOx)Ps_}Z(wl=r8XuQY6 zd7~Or`?fqr1+CjTL?*)MAfvC#Fr!LeBgcVGJ{#2>E-#)*nXTQ}{S~ai7Z8hWC$WZN z1rI8(<;%P@3ckUihHnWjU)!qWjczweOdyoJYty z+Z-PG+;2x%nrHI@V;(CR;rZKlm4U;=_$mI*Pkm3mg8-V}r;#V`4A@vZ9L!C%iMxwE zCP3P>?Dje>R{H_d{1l^}?Onr1g<_>(ZLJs=DGU$ka1+UF$<(qz*}Hs_&#@WGQP%sU z%;R6HKRb+zd8ISPXaCyfh*W8pLp9G%pYH2#4jpOB;<;^>umOBS=_13+A5=iRpPow8x-EV8{?a;3o8%1%a6F0 z20o{Y&$sO!`0DdlPUt$jR@6z24zYxo6TzkgVlmOl`xH$8K^ z!m=ci!!mYia@BE?BK#!%Aa>Y-=j>=zOAcXvt27RSARcyFUbY1h-FE^GY-WlMpxGQEx_cZC@@Zl zZ}Uq1;ugLVy}5^|p@S?s5n)z#_rj(5#dB^TOPQe~FBsHoI2L^3-bF7#W7oTk@MAsu zyOAxr{x8#6FQ%HVZh9!&H`Be6jX-6~{8aZm8D&M&!51af>6z|CR$n}mZ~n1rCX7gK zmw6o%y5CDbGBicRGg3HoeqwAz=GQmtty6*c%G@q+Dom@bPSB6vt?~CNbtZnmi_{U^Tw@`!PVy%E)Q;_}b*Ct;1567ABG;I9A$kR`#WoFo zyFcKfnlefT8F*TQ8PK}>!JVJR!|e|o{UyfzywN-HV=leo_`AglS_Cz5N&+{|;CE+>e#J(ir&uSSnfUJ3Gia^M1Qfq|^QS$yZt%l?f!U#8CtYbAWb zZuofp<$Jim35Fwsdrl)UF42hBukGM|Cr{oqUMCxZUcFhjd-Agy2-tVf(;8`|ymro@ zPmxgC*IQazS_T6HL|D3=-2B)WU4~8|9SxdnyCxQ@4f*vl6&0?8s=2IcO34r!T2@z! z^h9n6dJ9VyD|KUI4RQ9S| z+Tif^`j;QZGkMewzA~x=8HG*yz2@m#*YyiTHQy+w8#uz9;6uL6cqE*i-G3RO8c<6_ zj0c>|3h-6Fot)KrnIA5b?cfd*Sh-^rrE2do`SfSeYK{(88POT3-J!}3z>0aedew`L z^44UFIg_8#<`oz+IeLA zm(8=oXOp=&IN~Qctw*K=bn&eUM#Jv$$8q`RQ~838_jH}(6*lu54edS9;b!Kv;C@Rj zp?LomL#5BbYCja~>W6YgGQBv!4r<=*)94W~cISKsr^>f^O1V)SZ*dz=M$zl)xgNPJ zWmcO8OD1JH>o%7~&C0NkOmW=E&g_e8KhT% zsf5eu8XQLc#uLVXaw9>)2&nl+uLzNdVSB&KRp>?2teRwD;Nvu|V@CFix$ zEwE@szC&Y+gG_G<66k^vTgNNR1G>To!beVxumBp6uD2$YS3e(b-nk&fvDt%G+d46O zZS?SA+*Qtuajrq4(hbwy;pCSPDy$x zTp&{OSb*0H5LWW+6d5`SuH7t^W+~sNz)?oSV2m7|S^$r+{_DkLL@pnRpVm-QtC1Jf zGoyY~wNfPRMLJUKbIg8sE$huY7+LQy$K5_`5}`Yn;An2dqDjlB_0(svTX?-w0vNqU zrqPaN(O+-V1O1KhRNuW2DIa{x1mnRrQ%ORZm>L1DELz!oHb2ir7eq9jEbcGT}2HZP0 z+~DG+;>i3x3p~_YV$7C^8YhmR_SYdU??qYgbypRzZ-9t3sz*AL^KCnUVFVqm5 zwg6Rgig^*hSyY#5Yh~`p9k>}lHqx(hOy*xaS+3lH;Ci4Zx~GWY@)-?m4UxqaaxYbp zJ{ic6Y2vvnCbK3G=07sr?MYV%1jjY4G&Z7|>8}RIz6p>+{`QnM|1efwr+i=qjn++M zS8;2{3S3jc3t$X9lwvRJA}IaiVQa#u%K3$;_I?s6Lv1XdP^gyzSN4@=dF6UU0X*OI z+=*r=8J$hCnC1*(x8fg*I#+hjZNLHqAE1D{M-nK$bye0-XC((&2_>9uVl^+uaF^7? z^EXD$Vd#T^MB!XxTFcqAtp|770STO|t9 zNY85WZXGjIXl$6~O=8qjOgM^0Tt&{ zrJtMBr(vQaFZO7xZsD>RFN#+kF4Wp02l#i%5YHmp(TRkhE#jI;H#9BhJL!?ucq0*RTC*In zQEgmY3EQ(5)7Q^otr3#~Sv8&v8rq|UU2ELURS@0WgA8Gax!L_lF$oVRW^4uB4)k6U zHd{Q5B6;q`B(yM?NloXB;r8oF+gwOGm>2E@^(iaJAcoF5Orxtk{9P zDL5?DqY0~Zfd)gKvO@J}p*H6x+zlT3;-q?%aIO!iw=Fnz)PMiVHg7mliJ;l5>3qj^ z^0Ms^+;vzN2#hk*b2Gz^^*Q$5KvY~EC6BbIhmT-RJA`_h9Sh#777>t{AxvXySaM2d z*c==`)0=^+Ms@_CSv9jZaAlV4i8Q+#M{@OxcJJ?>W@%@Z3!9@hh#!}M`6C zcV>Ucs%O9X9hQfk9i7=NRlWn9a%_92<51Ay{Dbug$KM#$;yne)ywmSW&6$fb>K<9n zQO>)1jjya%w`BaRWzA~Gh8HH3m6l3_;>gH_>WiKAY_uCSk` z>la0Cl&=nF7;sEV-QQP-qu30dK-tBSq$$dwORQ(9 z<)}2~z?1AAx^pALwUT*6hP*NYU|}>2dONb-3aOS%woLQUVXy;`^W~%hBTp` zk%-{khb<{h=O|ynBE?d)c3!(tJ${Nuqf2KS)vK!7dOdfdHWG34Iy`?fM@_DqFHoD+ zyyX7FMAbaMTU~|!U{5OROK;7?#zHxk;;a!Djmm9yPzVUlp2%G=GciEg8DFzh0>~G- zNEojNdJL8lj0L9lOC$7*`W%651Lh4z#x=HTK( z<$X6Rn07!PM?zR=#3xFXaPEIlen^Vj|JQ9<(9aCzVNPh}Q2EZV`e*A0&y zv&>`^lz?lb-KAAKqg2xM{Q}PQJdbjm-eT0E-n*6At|1ECJ0l039%Pe3UPP&7X!vaX zMXiJn$wGK`Q{WztRgLWO@GwHUi9=&HS3^X=B}}p0mC<{vlQa0?F0MEl5^+p9he+h~ zWzZ%UULrI{?hSmGaDSQ`;Wy2Z%4i_rbg7M%Ur;m;+YHyUJ*QfG|@R-B6;P_)2~Mj9gKJ9fpO6 ztn4>A_I~}PJ%tt8`$aH8Yf)Lu*L|6N_eX8iQa;v)g19|}nIXsGMJX@yw(a0^VYCMd zoo`)771#1%WUM8+PrX%MH)o!&-LDdR?fkJE6Fwq`!6TpF_d5@irR+MZ@(Bk{g?i1c z_X$VTw8j*D19i^E%i2KXL(bUu8r{1DE1ZZy%{ zUWz^R6(Qwn*T`9=hqdHngmFknQGMWDgv-bc2L+1#u()X&j=d#zbkXZfpVz}!AydfY zWR3e(R|4l;LLRX;^&}rZo~)+U(){RrvtKAYKpkTwuk66C^?A{aF$*REp9D0~6|DoR z(LPuQQ5}Vz5e>%RbB65hXX6!o~J7t+^~{dFBeY}>K~&)s&9&@PR64s!Q?zrK!q zs4M-7{rqu8{nKCXQ7(R156%0-yQgQ%66GKEMsB5~ykYpaxaRHqt%pUQ@LZX;`t9qa zq``WgH?i)*YPTjm#mqEib{5PyG8kOgs{_x?;0DvGg0n|eiN28cO-X+#_n*|>2bBH` D-qJy( literal 0 HcmV?d00001