From 1b79aaf579aac3a0aec2be26cff9c0e60a451fca Mon Sep 17 00:00:00 2001 From: Heroman Date: Thu, 25 Feb 2021 06:37:13 +1000 Subject: [PATCH] Main-feature-complete --- code/_helpers/global_lists_vr.dm | 6 - .../living/carbon/human/species/species_vr.dm | 1 + .../station/station_special_abilities_vr.dm | 111 +++++++++++++++++- .../species/station/station_special_vr.dm | 6 +- .../species/station/traits_vr/positive.dm | 3 +- .../species/station/traits_vr/weaver_objs.dm | 54 ++++++++- .../station/traits_vr/weaver_recipies.dm | 19 +-- icons/vore/weaver_icons_vr.dmi | Bin 5485 -> 14169 bytes 8 files changed, 182 insertions(+), 18 deletions(-) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 5a3fddc8256..795b2fe0682 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -555,12 +555,6 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, return 1 // Hooks must return 1 var/global/list/weavable_structures = list() -/* -floor web -nest -wall -trap -*/ var/global/list/weavable_items = list() /* jumpsuit diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index 5dad639e31f..653af17a1b4 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -24,6 +24,7 @@ var/silk_production = FALSE var/silk_reserve = 100 var/silk_max_reserve = 500 + var/silk_color = "#FFFFFF" var/list/traits = list() diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index efa50c03750..ebdf6bb7ab7 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -857,6 +857,8 @@ if(species.is_weaver) to_chat(src, "Your silk reserves are at [species.silk_reserve]/[species.silk_max_reserve].") + else + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") /mob/living/carbon/human/proc/toggle_silk_production() set name = "Toggle Silk Production" @@ -865,12 +867,15 @@ if(species.is_weaver) species.silk_production = !(species.silk_production) to_chat(src, "You are [species.silk_production ? "now" : "no longer"] producing silk.") + else + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") /mob/living/carbon/human/proc/weave_structure() set name = "Weave Structure" set category = "Abilities" if(!(species.is_weaver)) + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") return var/choice @@ -880,16 +885,120 @@ while(finalized == "No" && src.client) choice = input(src,"What would you like to weave?") as null|anything in weavable_structures desired_result = weavable_structures[choice] - if(desired_result || !istype(desired_result)) + if(!desired_result || !istype(desired_result)) return if(choice) finalized = alert(src, "Are you sure you want to weave [desired_result.title]? It will cost you [desired_result.cost] silk.","Confirmation","Yes","No") + if(!desired_result || !istype(desired_result)) + return + + if(desired_result.cost > species.silk_reserve) + to_chat(src, "You don't have enough silk to weave that!") + return + + if(stat) + to_chat(src, "You can't do that in your current state!") + return + + if(locate(desired_result.result_type) in src.loc) + to_chat(src, "You can't create another weaversilk [desired_result.title] here!") + return + + if(!isturf(src.loc)) + to_chat(src, "You can't weave here!") + return + + if(do_after(src, desired_result.time, exclusive = TRUE)) + if(desired_result.cost > species.silk_reserve) + to_chat(src, "You don't have enough silk to weave that!") + return + + if(locate(desired_result.result_type) in src.loc) + to_chat(src, "You can't create another weaversilk [desired_result.title] here!") + return + + if(!isturf(src.loc)) + to_chat(src, "You can't weave here!") + return + + species.silk_reserve = max(species.silk_reserve - desired_result.cost, 0) + + //new desired_result.result_type(src.loc) + var/atom/O = new desired_result.result_type(src.loc) + O.color = species.silk_color + + /mob/living/carbon/human/proc/weave_item() set name = "Weave Item" set category = "Abilities" + if(!(species.is_weaver)) + return + + var/choice + var/datum/weaver_recipe/item/desired_result + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = input(src,"What would you like to weave?") as null|anything in weavable_items + desired_result = weavable_structures[choice] + if(!desired_result || !istype(desired_result)) + return + + if(choice) + finalized = alert(src, "Are you sure you want to weave [desired_result.title]? It will cost you [desired_result.cost] silk.","Confirmation","Yes","No") + + if(!desired_result || !istype(desired_result)) + return + + if(!(species.is_weaver)) + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") + return + + if(desired_result.cost > species.silk_reserve) + to_chat(src, "You don't have enough silk to weave that!") + return + + if(stat) + to_chat(src, "You can't do that in your current state!") + return + + if(!isturf(src.loc)) + to_chat(src, "You can't weave here!") + return + + if(do_after(src, desired_result.time, exclusive = TRUE)) + if(desired_result.cost > species.silk_reserve) + to_chat(src, "You don't have enough silk to weave that!") + return + + if(!isturf(src.loc)) + to_chat(src, "You can't weave here!") + return + + species.silk_reserve = max(species.silk_reserve - desired_result.cost, 0) + + //new desired_result.result_type(src.loc) + var/atom/O = new desired_result.result_type(src.loc) + O.color = species.silk_color + +/mob/living/carbon/human/proc/set_silk_color() + set name = "Set Silk Color" + set category = "Abilities" + + if(!(species.is_weaver)) + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") + return + + var/new_silk_color = input("Pick a color for your woven products:","Silk Color", species.silk_color) as null|color + if(new_silk_color) + species.silk_color = new_silk_color + + + + /mob/living/proc/weaveWebBindings() set name = "Weave Web Bindings" set category = "Species Powers" diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index a850e60534f..f699afd9c70 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -380,7 +380,11 @@ icobase_tail = 1 inherent_verbs = list( - /mob/living/proc/weaveWebBindings) + /mob/living/carbon/human/proc/check_silk_amount, + /mob/living/carbon/human/proc/toggle_silk_production, + /mob/living/carbon/human/proc/weave_structure, + /mob/living/carbon/human/proc/weave_item, + /mob/living/carbon/human/proc/set_silk_color) min_age = 18 max_age = 80 diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 07ad2ce9c32..ecc4571847e 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -151,4 +151,5 @@ H.verbs |= /mob/living/carbon/human/proc/check_silk_amount H.verbs |= /mob/living/carbon/human/proc/toggle_silk_production H.verbs |= /mob/living/carbon/human/proc/weave_structure - H.verbs |= /mob/living/carbon/human/proc/weave_item \ No newline at end of file + H.verbs |= /mob/living/carbon/human/proc/weave_item + H.verbs |= /mob/living/carbon/human/proc/set_silk_color \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm index 5b58ad0b9d5..cbac3ed9182 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm @@ -1,3 +1,5 @@ +// Structures + /obj/effect/weaversilk name = "weaversilk web" desc = "A thin layer of fiberous webs. It looks like it can be torn down with one strong hit." @@ -6,12 +8,13 @@ density = 0 /obj/effect/weaversilk/attack_hand(mob/user as mob) + ..() if(user.a_intent == I_HURT) to_chat(user,"You easily tear down [name].") qdel(src) /obj/effect/weaversilk/floor - var/possible_icon_states = list("floorweb1", "floorweb2") + var/possible_icon_states = list("floorweb1", "floorweb2", "floorweb3", "floorweb4", "floorweb5", "floorweb6", "floorweb7", "floorweb8") plane = DIRTY_PLANE /obj/effect/weaversilk/floor/Initialize() @@ -22,10 +25,22 @@ name = "weaversilk web wall" desc = "A thin layer of fiberous webs, but just thick enough to block your way. It looks like it can be torn down with one strong hit." icon_state = "wallweb1" + var/possible_icon_states = list("wallweb1", "wallweb2", "wallweb3") density = 1 +/obj/effect/weaversilk/wall/Initialize() + ..() + icon_state = pick(possible_icon_states) + +/obj/effect/weaversilk/wall/CanPass(atom/movable/mover, turf/target) + if(istype(mover, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mover + if(H.species.is_weaver) + return TRUE + ..() + /obj/structure/bed/double/weaversilk_nest - name = "nest" + name = "weaversilk nest" desc = "A nest of some kind, made of fiberous material." icon = 'icons/vore/weaver_icons_vr.dmi' icon_state = "nest" @@ -45,3 +60,38 @@ to_chat(user,"You easily tear down [name].") qdel(src) +/obj/effect/weaversilk/trap + name = "weaversilk trap" + desc = "A silky, yet firm trap. Be careful not to step into it! Or don't..." + icon_state = "trap" + var/trap_active = TRUE + +/obj/effect/weaversilk/trap/Crossed(atom/movable/AM as mob|obj) + if(AM.is_incorporeal()) + return + if(istype(AM, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + if(H.species.is_weaver) + return + if(isliving(AM) && trap_active) + var/mob/living/L = AM + if(L.m_intent == "run") + L.visible_message( + "[L] steps on \the [src].", + "You step on \the [src]!", + "You hear a squishy noise!" + ) + set_dir(L.dir) + can_buckle = 1 + buckle_mob(L) + L.Stun(1 SECOND) + to_chat(L, "The sticky fibers of \the [src] ensnare, trapping you in place!") + trap_active = 0 + can_buckle = initial(can_buckle) + desc += " Actually, it looks like it's been all spent." + ..() + + + +// Items + diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm index 385a2117818..06c9856e150 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm @@ -2,26 +2,31 @@ var/title = null var/result_type var/cost = 0 - var/time = 50 - var/one_per_turf = FALSE + var/time = 5 SECONDS /datum/weaver_recipe/structure - one_per_turf = TRUE /datum/weaver_recipe/structure/floor - title = "Floor" + title = "floor" result_type = /obj/effect/weaversilk/floor cost = 25 + time = 1 SECOND /datum/weaver_recipe/structure/wall - title = "Wall" + title = "wall" result_type = /obj/effect/weaversilk/wall cost = 100 /datum/weaver_recipe/structure/nest - title = "Wall" + title = "nest" result_type = /obj/structure/bed/double/weaversilk_nest cost = 100 +/datum/weaver_recipe/structure/trap + title = "trap" + result_type = /obj/effect/weaversilk/trap + cost = 250 + time = 15 SECONDS + /datum/weaver_recipe/item - one_per_turf = FALSE \ No newline at end of file + time = 10 SECONDS \ No newline at end of file diff --git a/icons/vore/weaver_icons_vr.dmi b/icons/vore/weaver_icons_vr.dmi index 0622346156f0a5d5740c03dcc1d0128337209e9f..17bcdb416af79378a3255b0ae60f24875a4c71ed 100644 GIT binary patch literal 14169 zcma)Dg;$hcwEgH7gprm~0g(nN`B9S6NT+l+DBU0(BHc(MAg#30B_J^Z!q6c#lnnhY z?+TqxefBvMrKTcBginnRK@gFGytD>*4Z8cm#Rk8-#Y~66%O@XA zT@PtXcXKye7Y|!!CkXP&jvH^s?`D8SEbG;*B<>cUZ;!2L5cV>D!%|Xm$TeJCw)OkLP9p>{Knl{5nqJv^{*Deb+y0x*Rw$+@S~nYeoe!3-Pld_XavGno zMsdKxzr7D&3o-669OJl0fUy9{U^*Ne8@pwBWSO~2bn;_s!jyfG>-#M_FxENnm!K7< zPr5caRoZpmPi3Ro_3JnWQ+pWS7oh}>|KN-UULhy=9=CI3HtdKqL}q($WZWJH26|hS zarap@H#L#}+CFJ>oF{`I*QpLyeSLjWLbMSM zKiAjSg>e%{t*p=Op&%D@XugTU!zeF}wl!&ZeUVrBxNl`;<#x!bzWzVs&6+3|YI=GT zCO-i|L4R6nYwNTS7h^+1!`z%4BQ_Yme6fb(rX~CYf7anGIYdrDk@g>L$MS?r27P~y zbxU=iuuVr*RTb9F<;KRwpWWSEQmE{kp;K@o7Yu*g)8F{&^G-|P;c9$yTT&z^w^V$|t39mJ4(y993r`$8-H>xL za1ntp;Z{DDt(=x(g-MNjP4YW$wFHFby_S9z_Tt_Ch@+F!&%;%D1IPJ){lywj>zKbd zUUC@0!9|O*u_|z)d-pge&OJo_8zXp9C5cH&aziJYo0XO2{#Z!bFu$I}u*JjH*4*4& z@@;&cfi4^`!n%G|&j{Y>F#iwTNNz?!);%C@b#+zoRk^0VzOivG4K1x9Q!;KBTtD~Q z<>e*8gbi$=kF3`H+n*mdH#eIC;bBEK9l{~(iRTAdJVn3y_V{@1JTEu1Ed2;9Bx4| zv5q1&k^y^1k(_DR-dk=QimHg?I%{aL6sNwXIFGpHF;1^b8-CALR;-&f5kQ_KJgd0=d8R$!$n2 zr0>{+G-Cu~3}@&S%G(nDv{=Jdfn37VjLCoFNd|hZRKd79WD&!(#!A0glV;RyKx6!( z_50G&(ud8<>&9qz_nWuD%~qm^J`bS9xI}N}=Enp|;826JtaE|&&8qOBs^U%C$jZ~$ zTD^`pQUv>9&=@ZD{NNc5Pi~?9#4e5z7a7DL6haZqOVI@vF(E-MMR6fXB%{QndyFvz z?_2XQ6gx=6Pidh2(;pb>kaRK3wFsR`oOqNTJy#}i?VgWOVvy#15APaoS>3w-{(xT# z%Yj%^Q&U%|YnZ!07Lii0^pbKXdj)pmn=L-Da((^&?ouRpf@fqYJV>+Z;Y*8$q+D9YrS<|#D`c2 zY}RsrZF?AyDDA9t9+wM^K3Pq7;p?9o-zIm3HqZ zNK(Qb@Y5h(9?9SXVe23uxfbQgC7y}=lE+fDdfllje!nKA_`7JFSK6~sm3F*b0Y)(t z9^0RRbYjt%57yT6aPb!}TBSKn-@a{nR@>ukNn%mrovgG?lJfBhxs9o}xA*?9VnxLw zOAn6w*?#{ytN+?=fNe7L`O4&Xoq7|VJ=a$1MH|7w%3u4?Hs)sL-F5aPgzW>q`L4L5 zqhovVj)+u2BL7!Lw56o`#TrUHAshD-JPCYSMj4F}gAXhKY_NGW>T?unl+!dh-l{_5 zp4Y=>+K*aU=qKLktCF}|Xek63cYJ-&kjh~7HiY5X=MA@S&24WsBSwmlb6mXQIVxkv zVTC_UY6dtsIXQjL_RD=`;YfsnyA{Cmy4hWJE?nMDd3EvU$pAJ|*4Hh=H%Q@+TT6F^ zrZphc_ougV9)}^0MU%FjrhPS!HRF_m8rXXecZNz zfx!~R6H;UBcFo2uQ7-l|1Dj=jnYLywOr~Uu_8_O8Prg`jWR1BxBrW2n&qNV{-A#KS z-J7nO_!B7NPEkvIzOJsdqkm6A1c~dkPot#N)MQ?be3My;G~yFc$@7jn4ap0{j92Co z|97lC-_sB|219kJ?P3i`Ft_ni^w%g5%7)@=*4Ni7R%yo+UeiGTODy41$Y0;R)#okk z?_*4sy|c7BG5HdYa2_V=YAF}@$F>?7BRJSAdAjGTa5`Y{vp?X|b067l&|6kNoW z<3yOXdK-3tjNSf-7l~DQyx={V-+jDGvID}X4|-2|Bi#{I%lyVw{M0Fd%eC<>u1JuonbgefrT`zq^jhm|IExR zlKfdPy(O3a{g}9E7Z^?HrCMn(Bal~m3d7&p*?Gy9a`!xLfOvpr2yvXR@3{h+f!@Qc z16Ok7AY5QY1RDouv%QmSKfW~XYfXX~amH{eTHLW<_y?-TldzAS8gt`O3?3YePn+JJ zf3w&~#&o@7ZwmAP=K>+(IJ6duj33KiYQAlIP%pbsE}n`fI<~>!Lu7h?$OaIdWN|%B zzMN?WiN%$?hFb{~bjG+|Hv=}`)5h98$8xr?k4lQ+oHUYZPqp|nL__L6KN?8!_)CSn z;lo879v(iaXvA5b-1DhDgR&jiv5cP0Tzj`5+k=eH)HPaEYJ*1bqxKd5ly04&dx_8O zG;!XS4&*vc%ONQewh=|JkhnYOxfi`2XO4d|nuO)PfGM%@&UZGGxoIKP2W_nWK|;R* z`Pbop4oLS(3%3_Cv+WXUUsz)7@GMFa318Q9Hku&Go1iS)=}_^_%fW)_3a4?=iwr^Z;F+ z8&$!6z#C%o^|6L-dK_8o0lH)#~)yMouxRLH9Gn#)a5Ao7;$N9I0|Gr zj@?9IX5I-9cjek&eOcGW=uElXqHb*xx#MuS=f$ zSI1M!pY|7v71L7N{Qbo|s8u;56XdqgXpN7zCq&1>+0#pe^MFh+s7ggBZh0(#XZeLf zp)^Q{rrbAwjv~Ifv#7m_Trw^lPuTA@yYIizVq)|>@a@~TPvvn@-@Nyjf6O*rC-6$H zj&^>fVYP{?^F?=5@*VcYKkw15mMVaJw0YBp+k5Q;$Gu1~E6_+*fk4{yQe3Ut412B% zgm6>1^&{VJoLQqk;}a6Nj9NSfH*@9`UHVGjn`!=hG;Qw;*&yb62q;VlS89mN-r(Hc z#HnnC295AK*Of=J(v^-iq^$r}x)Ck9t~=ysvE^(0^R%OYkP%?^Fts+62;@7m>cY4N zBdELkWnONyrJmxmXU|v~Jguxs_D~}uBOfgF1~!jb`mA^}o`~cQTBH(oBb^=eX3!zZ z2p(tfdP@&!Yip-kTUnt`J{+!7p-o;MC*sW*AvJoosM-{8A7yXj$DC|>?q^)!{^#&X zH@DxFC5qG^TyN#=6UqPABR)Rrcv7FJyK87@h_>_Xh0^BB1@dQ?oQv#{jG{lTT;qiZ z`1tssHKp{7j6=M^(b>KchBj&1?G9e6!SrY75A!lI^q4l*kG-EH50X4m#nobInJ|Pl zys7V-pPR1;$CI<9tByyV7h!^hxid;h8-7I@l|=C_IX`CF^*4c*6c2}nUgbxTyDnjc zP=q;k5hTTaXL1kin{Z944Z~6GcltUZO83x9p99%IZu9kxo_1DZB)&Ytn^tCYlW{7h zC^}}Z#5=-N!Vr^V%0Qx~*&bu!iGS{ng+vdd`$7zZi}oAN`1Uat&Vj?I$K~tv3^5sYehe8)_KTsheTH^&oQTgyqNG z-rT}%IWuk>*cI&_pw2@#NEQ?XOGabbbb(rj- z-@wa4>#DVWPd@jx_dT^9;uA6+=&tv3*d=Oag8hm{q(3lt)Zw-bmI~*>Tkz2MmUsf* zyn&MBd+1+!VPh>XekGgZs#YwDo3m$-*~o(51Hp^>fQO;_IXD=tYtql@yCZoJd(3Xa zzFdr>?SYZNz@8CGCEsJ|g&Ft5({@#@hSAh#s@h z^FEwak@5VuLQg_M@K${!i>hFfKpso$axjGtBdfS1u`Ts)JR7NB)J&LxZIh>dYA=Hs zi3^vIx0W3O1Aopc3e48%J_<~D>vN^`Aqiw%;DNwyXJc8_PTpw=*diX1h-pS`hqpMr``ntj%+*FGv3#xfAn&Y(;h z&VY+^liOZ0R(CFKD7`_pFBw8!bPaM{k;M!`&t)~EWmuG8PRR)&cmC5hg77pG;*b@c z8Qna#Cm?0Y$SeIOV*6!F$6J5A5nS1)EV;9?xq9%#7#_2oHem^lS2+vCxU!E-6>dvJ zgNep9zQxtCjW^5k+Gffq6|CEXiF0(YHPqNIP|#5Nk2f>65ewh-LOL;ICnzn0%j+GM z$ckB4>qjz>Wwc0(v)(4@R6urYxoy<^oFp+}^Y!8w2Jd&&=9`WYwwM5u&qm1pJOc<7 zC9`xtx!B#i=EHhUX>=NWY?OPXd`v9GYc0AEB_BbO@E|{L7RjalXs^i&)MuGkBI!17 z!5?tZkgZ3r`6r%7#g?wJVCKJ`e9u`pphun&C{7%2g|)8eb7TCFB(@AP2^!v`h!R+ zN#^8lAI3HxxSF11z;lgXeDI*pR7{sa+S;)#B0y^ zjOLj63&mc+8~(EA*P^qd;##;U?^Yf}cl+L=q*AH4v967ue0CX4$Qp*iaOf2;mU5l` zw=I&kCDY10+&i9s3kg&n#&VGLii z6}+RJ9KU=o!v;DFqDabxq0cKTs5eRCEacWAS_2_n65!Nh;woQ>VCTFSBy`kibw#Lq! zwz6H5VFv-f{3OxIqy=ZwRUDB{sCV`SI9TUKir*!@nG?QJo*ecpJr5&En(nc5A8yD? zy!VReMTP~Z&4>NQ)dbI$Tncoty}b=m5lODvms}yzc`_x(UWc>zP?(RhGHPrk%q+o> zKaN+DBxxh*??(>gt#5fLnY@Udqwm2Bo;-=3+q~Df7D!PslRlRuQo{!FF^r!T&qR>CLJ$Hg2-3Ks?ocxVY zn;FXu-T^mchd68dYQm&v&zAh-5c$U|&I&klf<LNnq@5)&-h3&wM;$?0-gn&rcHL}RSd`M~^Y z@+lRk2XXC}>Frj++|rnH?-;eEEDkp)BcJ&hMyCD%E~L@i8(;qZZuy@{s< zQ;M4#u2+xa9pvg7cz?%;2N)B5r`2oRUtt+`|mlKG_S8^Mm$GJw0<-S>hYiagPv_8oSil{u5v1WS4RD zgE}8*Gg(h8Psai+-+^<2@aX(Ghkk6`i9DXlm-IBGCUCh`~=EiK2#q)`VCVtSqJGn?+;dw&V4$DbWX zL(jzP*mn>zpVYNE(|Cl0%9{17+}e%D!n#eB)jvLhh9)MG+&nyb_?3OrUlqgpDD4HZ zR%2`1N^GqS;hq}hnr}fZez-eZe{NNeH(bXyXyHZ&Mfa{q@n&RG+&+tTn{>^NEwS~c zHen~fz27BgHkUGJ;a~(Wu%%`n9y$zTLf>g|s;J0(4a179CF@a#^;*QPNB1(>w4MEW zpFQ&5ky4@_t@5N<{Hg_E_dx2a;$CT{B%B}{{tIfz?_@#_A2R&r7CvDe@=T}tOGk$o zJ11w;!?f@F`fNQcYzG0T#mHiL9<%Qy`7y(ok}fWkMd`Y`uF|rmi_eo!{D0qH^aW= z<>fL{$^-r^<+6$v)A_ef&dvuLid^ksp`jSR+R}GgVybsIKQNFS2b&jsVXrK#uuDx} zUcSB00O!=wa);a?rKKXv34WsJ!l0iu)zv>I^4^JVE~9mGD=AOrSM)QI<;}gV!_3Cw z`7aw|$R?k8(>Vd}7@Q2Z)$@*r)Hw~V?I`hZY8#(Yy0n&VhMMT`t( z#C`KvBb*?!+ON0_ELQj+_EFMI)_SQKW1F5l?b*4x#z&My45$Lt3nx8tO|9piMq}P* z#gojUrpsNJkn-da)I~X**oRRjaTE{+)(cFKjYrZ-ma$J;TU%oTmtknPZd`|8k(5+a zXi&CzAl=m;(J-(wGmzE~>F72}OG*~&9euxZ$3}ylpfZ0wVRIsP=;a6e*Xwf-*ms$u z8~VH%eh1d#m$L^6adB}EA3l6S8YNw%$reZZ@S!C9^s-8O=du|(vZ8bdu>UFYk3WDHQ-~ORB`_u7Vq;_H+foB7 zB{53&lRhgfnl1VlH=()KWW(?4%d=-u(mw(V?wdPQXtG^*)qQ>;G?U&|Q9%XwJcbgL zn4d)#_CQ^(*&_?B?>v{*LMa*;ejaR6ns-F_NS`%+OmA*!nfph=KHlyz{J?ntYaL3j zs0d-lz=P<=i3kbv^{b8=@w)2KljPU%ZU6rKd2a>|zaBHWy@1bC4%>e_Gk6IFfxtr& zRoX92Oz1&l;|d{zT1!^FvX_;Wm8bmZATSI`SjO(bVtPB=zFjpHvgS?1P-2WQDb0 zER{k5##P!lROZ(p;L*2EoqKzGSrBiO^olQJHfX_10Oev0Km!0-ChOR_`>O3TQ#-v5 z3zfG^b%Ty@b1F62MBSBCy|!Kiz1?Hks@-rBi8uF|d1_6G4RZV`CrQ7Gswx*%geh~f z0>Iv~3On?#%6_}?BCz79`kA`(XMP{bUXd4rDiBGQaaY`v=E|S1Lynn>C^3hbP2cNpyvfTC?GL$ zi0|F|shiqpIxhe$s}5JNSo;PcXEfpE@C4>NkbFJK4^9O*DX-d%#ob+8Tx7MTC4HQY z*vWSg^YfRfj`Ilg#KSAECmBjsPoeogf2OvxE%iFENE(wH*fW$aVvLQ99>mBB-@M47 z=tF(aSrsZ-6=J?Mf_rMRJpkWB)NZx9gw;D6hH#l$UH+I}CIJ1k{gSo1VU~IUR0|SGSn)>3UjQYOs z@j6-$pgZM0-T3sRvCUIIu^Nm4_0=#6^k4G1=fxU$6kNs)?ZOVqlUGVX@POKL3%ykF zv=ZAgO*RIi4&SrtYFqty>n2ORFODxZwJ4shBKcx1c(-rC(GTlhW)EUtK-7JH#gv5X zB>P-dbw0wvJY)A9z`c@+3R8|scatL_5fSj$$}TLlS;f_+x(m+ z9kH5h;UN4s#UF0~t(tzWu9kv(f?Y8wyZa}Q0;uo#b2j`REqH}_L_}K1@WVT%Z1{h~ z*5VVP08?>lS59XESUk|G)Pf}HXJbX;U!y^Nx|R+OyO$<6M``fkbvL@)CjZk)llB+< z{2tf!V`8m$XwiD=V}vzM5hpA7u;2CGy?cMaUF!WFO2AK*#PZ-q@X;s^3(ffKNhY7yJYur z!w0H9e{LwoTDw&&{#D3=6x7ms-pjVSw)XfDBb1xr5YpKA+yQjl0{#8{%ckvaRDYFD z+9EVSSj_-~JKi&byI%ftM20gKYqCw#_Pau1)N$CA({`LeFIuXz3e*PRg;w>#Ti4=t zjrtU{{lO)+a^U9)YzjxpeJWx$>EwIGPx@@^KOSfkv+jl7$m@R6Kt0ZTgbav^KUxoCc|FkNDE(u2v3@xo4O+BFI4$q|rXCzC=gL1(U6tqq7{vt#RztlONNhnDZ&r6pN?xGmkv zOMlh*-0$Yf8=yGqDWb}t*)N!3i36QpM{P9dg1%x^$f@0!KDK`~ve#^!KQ7>K&Vv?5 z{Puk8)Pi@`gfmSQLxP{$GPV{E0^OG#ccW%it?9Cg3L*cC6EK`G1VTpu+JCQW;A0K? z9QB%PXb@A9JSYS@;Wqr#fDm}&&7bx zn?<}E!3+YDU}p^;b(m{EEcxpMEhr;{D$81|*xNz@^+SU>x%S-Cd*mzU{%a&bb^Uc?YS8IHjLr{=8+7`|@7})sPV^%xx{W}^YUNII2 zOmKj*?3!L9v#)uUmus#Jzw);q^6_89yexMoSn6OhF1xoBi@u!u2%Q6X1OLc z@LL1li5I)g&(C-EQ&wuRr68jkCkWN6JKgHkYS5yr4V_*(i z{OU|q9ThFPWd1LC@XPeH7DCBBbHkb_$XW7AB8ex}ofc>6-MHt1Caf3cbU^U9?E=fi z;i(te{nuR!3q~cZ_>bHE&D^8pot0Qp1i0lWq{d)NOqU`&&udJn4M zlVjOW_qAZ_{E&?L$M=U`S93svh7_{$^yy*?r4G4$%eIcqndIk~Lm)ac0Ft5w0kKFA zDxXHj)_{wX?fzb~!!qL<9hgkiLT4Z%!3~ro`=CRj3Uul0sMYJ5X}bwER*wwC7s--L zeAdPG;&v2Bx=W#8?+w9r0q(Zy0>tDd4bKz}1LJ^ijsIpJ%IO(ErdP!u%6ELKb=fa6 zmGw(1*hC57P4sBS?==Saas8SfL`hexVaTh)n(FIA?cvpp87Lqnw_4(lH^-VSF?uNK zaAD6#oHSqNvo8Zl)DiR5=adb!eDa(0tG+tUhXU3IqdfP`cR}S7WBin&T$3&DRk2&j zt6~%Nj|8Eip)}>1e0yU?>HU zlEZvFIX>2c=R&aj<3hAOgC|N-XO2-mVWlczb?i z`MYV4FSg6R{xY`Y$N1mBY!35%i0cJJfp+Ej$olm)4!z%a1RsJ=7f9?W*-z>K0)%}3 z?S3B^7Za_O97B$E`SDZX?Z?a zi|Il5N2rMLwY4I8T#fIM#LU}%Y$-oL5hxWd6%1#-_rd(y5)M(`Sp{!#iq z-O)OBU<(C6a7AqCz6KHvky2!uhp zu;<^YRl7!!TqR~8=}em(xd2(gJ^wSG7ie3MM5Z6e!Fyn1H9r8;57D7{9&Yi)V@T$n z3-h=KV$FplxL0lL{nI6myjmG(j(uc zuLFF-!cjoInUHAf=p0sdUfkgdix0XcE~(-OU@$ei#<{%z0DHmF-gtO;nELu&c2-ne zB+hkC;dlYH-3pQ1d;h6GZ3`sW+~LrV3?RY+lqc2L$q$}J|H6R=EslZ`Z5s7Ufa2ED z;-Zcyu+1zH^+SzE^{@T~lE$Z8bBHzi!#i3Qj2gosf)F{%NzVl`gH8*HjqDXPws99r zV{zP1RpwV4AEKi0vfxgP$l)i+3V;z>Vb1hYZwB?@r?hz-UQgC3AyF^n(sL2umxU%J z-8ZQZwx$u6A0EpSC!W8=@~FdnECK3~zB|_A!33~DNk`YmlIIsvsZ(R-=%}0ltgCWO zd>}ymyFC|*9Op{`RvZC&DrX3PXc?<~H*NzuYldfb7ni3#{$;Zc`k5trV2~+ygKFSv%BLGG!g?a2>1+!pPw62V(Slz9NWx)YoI->uBAnf{&oL8UWDn| ze}UOxWNqz*onL{>?=@2m>-d`>^GRhf%0;Vt)f1t9V&Z8^%&MBWrKP25Z6Y0k#A4Wt zm1{!r3JdZz@>rrV`|giP8sbLkKGRZ=f$7#*p73ai$CyRsV0mBtFPlsT@BBupVLp1H z_`lnf55jHk6>>p=&P#K1nMV_H^iS;`lX?ROwP9jHy>Z$u4x?5CyJD|iJlbXo^h7q|jd+96X5+%R;@dOZPQ;XzFq_4t)T)S0H% zf|&cp2+gt!N}Uz<3nnuN%w?r^d(U2I0m zlO^!ZtK|2cc~~g%kWX>Duk4xD%(goHKv2RNIqgh=Facg0SN z8f<-Hw%)pCwy8azb!c0vfEyo*F#Us;yY~+-TCo#B| z{64D(b=%avl7BpnQRkd=w>eC1cF4qAmc0#nx^F-Of#HQ+;5v)}ski84LN6HLUV-Fq zP<0)$fXVOxc{nq_tW+(JGe^IrYhvO&kEq!Z0Yy@16GJ?2IB)<8S*2$&iKi^r7BI|} z)D7X+To7_?Fd0EdNm(|2Fvk|{Hdn_EtO)&fugfYi%g_0rf7uu(fS*(}TQR8+Ud z1Dzy0Y)d|-T(vsR=Pz~)P+t5LS8T4UTY>MKU*8xi&MGk{3(Kf0*^&8%ei8NZE5+OFE-^z3ZW`_NHBd^sqAT7d5>UNQZ56eyPK+S=NK&VO_E z$8>JBz#Da!QKybBECWO1bM}q;n;?95+;IZ5D0kmaI$By$Uc%LPIM~?Z2!y!L#z=iO_4a1Zt5{JHtL4f5mxLGpEX}YtY&3ODGQv!pUDhr`8W{RY!9O`sO)PsftD6v z>K_`fBi?|*7tFzd*vikRIzgxlc;`L=#siPY<-)wpJbd){Gg@e`>dlhZYa4UmfB>Z7 z1>@w-82#S@?@m|W@16`kYfj3D+8Wkq{mSV+kgkuEC+Wha3R)^Enkp))O(`Eu+nsiT z`YR36egFRbar|m5Zy)uk&-DU;woc&T+|BDwOiavA*zkX1edXZc(cq}_xip2Ro7)Ub zEhiN%cpB-ZuH!hJ^y9cU=p-P1PY|Ih3d*h@(^_B+JXg~q7IM0HoIL35V>RKMI31YH z0TyhKs>LXYeAVM^1g{4bI66apQ`6h4u=v6+pd68X@h;drZaoiH*zPyQzjAgN7aN<+ zdNLl$40OT`U)aiVxE(wBd>MQvey8PJjaBo`t7+A)JoOEM`dyD=YxyQ@rY1c7U#ow# zDNv*Iq_qy>Nd=bU`^*v`Lhk|I;4j~~p!by*DNu_93m13hr+#ETmU~Um_j?MA&0|5C z6%`pk(#vpOm|&8CDOD=77SJqt*k4W=k@TGKkz(xfFZRwC@*xso5frDYs;Y`6nG&tu z{~6AQ$^IF9=^5;IGn@5e`{raI^K8wTu*kHRbZK6j{>fHfj5Ml;0Kjl(Cw-MR0r2N;55UwoQ8#xJmHG3& z-@pS3M4=8>o%#Bhs&@onGPA&^L->H|6nObe_Ifjgpj$cT$u4H6Oqe!3Rc<(PfOAsu z))DQooDz56QcHE7Y2=6?VfP80_UWUy%UBdTpe2|V)4KvpAs(Nw1p=rzp#`IV<_C8y zW#`k6I30prm%DduIaLy@|Nbd!b>tsEhCp6L-+of>Wc9i}g$EX#-4=FlUJRyFAf0iH zal0sJ{~y1^&JM8JZf`DGOlr2jJ73Q@d-{J`CqS(SZIVM~S2WITk_XE;E^P#*8s$q! zC^Rp9;~VW>Zg7>wOvLcf3iMvCW&c;W+0#gS4@0}o z5P^9{t#65(JI9(NFh;pk_g`FIu-I|*&0Ym5>DVO2bpu6Y;L7x{27G$v>eS@6F^~w$w>|xe0v#C>US0ggj0sPw*_CU_gyQ56 oq0jfFz$~QM%YpynpxlTH@$j`g<$T%?J}U<)$f!tHOT7vCA7|do6951J literal 5485 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 LW2jwq#XkCfQi7^w