From ff58e6462d493cbaef3194ada2c23beff0394bf1 Mon Sep 17 00:00:00 2001 From: brainfood1183 <113240905+brainfood1183@users.noreply.github.com> Date: Sat, 29 Apr 2023 10:50:10 +0100 Subject: [PATCH] CloningPod emag effect. (#15876) Co-authored-by: metalgearsloth --- Content.Server/Cloning/CloningSystem.cs | 31 ++++++++++++++ .../Cloning/Components/CloningPodComponent.cs | 22 ++++++++++ .../components/cloning-pod-component.ftl | 1 + .../Prototypes/Entities/Mobs/NPCs/flesh.yml | 39 ++++++++++++++++++ .../Demons/abomination.rsi/abomination.png | Bin 0 -> 21859 bytes .../Mobs/Demons/abomination.rsi/dead.png | Bin 0 -> 20338 bytes .../Mobs/Demons/abomination.rsi/meta.json | 18 ++++++++ 7 files changed, 111 insertions(+) create mode 100644 Resources/Textures/Mobs/Demons/abomination.rsi/abomination.png create mode 100644 Resources/Textures/Mobs/Demons/abomination.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Demons/abomination.rsi/meta.json diff --git a/Content.Server/Cloning/CloningSystem.cs b/Content.Server/Cloning/CloningSystem.cs index 0483a50d9d..c98fa51803 100644 --- a/Content.Server/Cloning/CloningSystem.cs +++ b/Content.Server/Cloning/CloningSystem.cs @@ -19,6 +19,7 @@ using Content.Server.Construction; using Content.Server.Materials; using Content.Server.Stack; using Content.Server.Jobs; +using Content.Shared.Emag.Components; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Zombies; @@ -32,6 +33,11 @@ using Robust.Shared.Configuration; using Robust.Shared.Containers; using Robust.Shared.Physics.Components; using Content.Shared.Humanoid; +using Content.Shared.Doors.Components; +using Content.Shared.Emag.Systems; +using Robust.Shared.Audio; +using System.Runtime.InteropServices; +using Content.Server.Popups; namespace Content.Server.Cloning { @@ -52,8 +58,10 @@ namespace Content.Server.Cloning [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly PuddleSystem _puddleSystem = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly MaterialStorageSystem _material = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; public readonly Dictionary ClonesWaitingForMind = new(); public const float EasyModeCloningCost = 0.7f; @@ -70,6 +78,7 @@ namespace Content.Server.Cloning SubscribeLocalEvent(OnPortDisconnected); SubscribeLocalEvent(OnAnchor); SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnEmagged); } private void OnComponentInit(EntityUid uid, CloningPodComponent clonePod, ComponentInit args) @@ -280,6 +289,19 @@ namespace Content.Server.Cloning } } + /// + /// On emag, spawns a failed clone when cloning process fails which attacks nearby crew. + /// + private void OnEmagged(EntityUid uid, CloningPodComponent clonePod, ref GotEmaggedEvent args) + { + if (!this.IsPowered(uid, EntityManager)) + return; + + _audio.PlayPvs(clonePod.SparkSound, uid); + _popupSystem.PopupEntity(Loc.GetString("cloning-pod-component-upgrade-emag-requirement"), uid); + args.Handled = true; + } + public void Eject(EntityUid uid, CloningPodComponent? clonePod) { if (!Resolve(uid, ref clonePod)) @@ -306,6 +328,12 @@ namespace Content.Server.Cloning var tileMix = _atmosphereSystem.GetTileMixture(transform.GridUid, null, indices, true); + if (HasComp(uid)) + { + _audio.PlayPvs(clonePod.ScreamSound, uid); + Spawn(clonePod.MobSpawnId, transform.Coordinates); + } + Solution bloodSolution = new(); int i = 0; @@ -318,7 +346,10 @@ namespace Content.Server.Cloning } _puddleSystem.TrySpillAt(uid, bloodSolution, out _); + if (!HasComp(uid)) + { _material.SpawnMultipleFromMaterial(_robustRandom.Next(1, (int) (clonePod.UsedBiomass / 2.5)), clonePod.RequiredMaterial, Transform(uid).Coordinates); + } clonePod.UsedBiomass = 0; RemCompDeferred(uid); diff --git a/Content.Server/Cloning/Components/CloningPodComponent.cs b/Content.Server/Cloning/Components/CloningPodComponent.cs index 97b276b8d0..30674856aa 100644 --- a/Content.Server/Cloning/Components/CloningPodComponent.cs +++ b/Content.Server/Cloning/Components/CloningPodComponent.cs @@ -1,6 +1,7 @@ using Content.Shared.Cloning; using Content.Shared.Construction.Prototypes; using Content.Shared.Materials; +using Robust.Shared.Audio; using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -57,6 +58,27 @@ namespace Content.Server.Cloning.Components [ViewVariables(VVAccess.ReadWrite)] public float CloningTime = 30f; + /// + /// The mob to spawn on emag + /// + [ViewVariables(VVAccess.ReadWrite), DataField("mobSpawnId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string MobSpawnId = "MobAbomination"; + + /// + /// Emag sound effects. + /// + [DataField("sparkSound")] + public SoundSpecifier SparkSound = new SoundCollectionSpecifier("sparks") + { + Params = AudioParams.Default.WithVolume(8), + }; + + [DataField("screamSound")] + public SoundSpecifier ScreamSound = new SoundCollectionSpecifier("ZombieScreams") + { + Params = AudioParams.Default.WithVolume(4), + }; + /// /// The machine part that affects how much biomass is needed to clone a body. /// diff --git a/Resources/Locale/en-US/medical/components/cloning-pod-component.ftl b/Resources/Locale/en-US/medical/components/cloning-pod-component.ftl index 81f9778e5e..e92ac86a1e 100644 --- a/Resources/Locale/en-US/medical/components/cloning-pod-component.ftl +++ b/Resources/Locale/en-US/medical/components/cloning-pod-component.ftl @@ -2,3 +2,4 @@ cloning-pod-biomass = It currently has [color=red]{$number}[/color] units of bio cloning-pod-component-upgrade-speed = cloning speed cloning-pod-component-upgrade-biomass-requirement = biomass requirement +cloning-pod-component-upgrade-emag-requirement = The card zaps something inside the cloning pod. diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml b/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml index 9c98789536..eabbc68c0b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml @@ -154,3 +154,42 @@ - type: MovementSpeedModifier baseWalkSpeed: 2 baseSprintSpeed: 2.5 + +- type: entity + parent: BaseMobFlesh + id: MobAbomination + name: abomination + description: A rejected clone, in constant pain and seeking revenge. + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Demons/abomination.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: abomination + - type: DamageStateVisuals + states: + Alive: + Base: abomination + Dead: + Base: dead + - type: MobState + allowedStates: + - Alive + - Dead + - type: MobThresholds + thresholds: + 0: Alive + 100: Dead + - type: MovementSpeedModifier + baseWalkSpeed: 1.5 + baseSprintSpeed: 2.5 + - type: MeleeWeapon + hidden: true + soundHit: + path: /Audio/Weapons/Xeno/alien_claw_flesh3.ogg + angle: 0 + animation: WeaponArcClaw + damage: + types: + Blunt: 10 diff --git a/Resources/Textures/Mobs/Demons/abomination.rsi/abomination.png b/Resources/Textures/Mobs/Demons/abomination.rsi/abomination.png new file mode 100644 index 0000000000000000000000000000000000000000..1444ab45238480a5611b55c34189a3869668f5e5 GIT binary patch literal 21859 zcmeI430M=?+JFa9i>O5^id!`z?hcvBWHOTo2!eoBP!I*RQfCW9APFRF)>=exK~alW z>t6Tu7p-2=RuSAS+Ip+Dbr-A~?Nwaxf+%=TNWw(KcCPyW_v!x(56j`qx14#ubH4e` zndiyuks*Pt9XmNf5Y&2TkbfBX>tp(HXbygF)g)X4e_H5+#u^}~Wn0sa9kgsk2M8K| zL=zrqj0_&GVs!By6sw~-kJNZQkcJ@7L8*F*iRFwEnv2$Gz1+(87rIF_te0B^9*hL* z{kRxS(BwpJ)Z~zGW^yc}WZedNJ9?(7fPr|6 zmz%H2p(HYRq{L5`$VqSy1lWI<3THm!fq^MlUxvlcV}C%YDV`>m6wg7IuK5G?mgzQ4d7gm=ep> z>*$jbJWbC@!#IO3DUsoZB!gS&(b(M^jA0xf9Ra3*c%z1l8ue@Jn6A7Q0+*_J zjhg9-S*>nPnM3UfpsD;4Im)O@4A<%6yv@^fq%{^2Kfk)^Dd`iT(XzS}Ltjs6Llu7F z@YXng%E)=k5HJ@}1V&`xD6YbA6-x9+P!)pM7%@vWuo0|dHR?304Gc!)uuK__$W(|@ zg<`fgY$O}n01J_&jFccNwz4*MSVpDRCB{=mZ%sTE%}MpzXiq8MX(L%bJym|XI9(zb z7Uzw5N*n8LRLft-B$?KSua@BqAQ%RlAc0WTWq`p{^vk{03vn86bN*pDwqXk1Ak3=We7ikZr2uA0l2PDqYFbUP1i>&crsU-B z*0hpiF*VH*FwH4xD-aZgX@aFuN`@)bIQ@pBW>7hf1F+!9fmv8nGKCzbWGu^J3MIy2 z+#8x^F@~ZsmVrr1&6r0`$r%bJaZDzYp$r0U=1omgGBv9tl&})zNDFHk{0k->M$2R% zk_7sOra6@3NCj0lYK!T2HENEPvoeZQn}EDy(`p$i!$>e{xdOzpZZ%Sf8hBD89FAd( zjG);+1p>0K2MZQCO(QhJs!^Cyb4r-S;0t zS)ETh7SmSmz;xq@hfyoREmIiG;keR5ks(RIfn?+?M<^*7QTKcSj%ZFqdBH<%d1h_w zyc$kn2wqWty^oX_PWwj%f!S1@)a#8HbZTP?mB{%@6p4*58%iT?(E z(~LLY024!LqdC@FY8{TX7Cf~{4q*t4Rx?U9sEgh> zVpuqWs7yga#h@AM^PNtc%q9LO84u)D3hdN5P-m+Xb@7t=@?K)pNhrNOPQy^9R4Pr@ zvX*^seN}CZo{f$F!wJfAiJJc;so0E?v0{?^#qRm7(E8B$#q6aKGrTuz9Q=9QHs>jxrdK5@a6$u43+l>wZ*buFN}r9jx@(c9la{!ox|0+_ zhJY_AYWi(awY}U>b?hIj+Fov`%4?3+YK-18i?;^dHd?0lIp&uQqrf{%&Rc=w7&!53 z*xgWLq$ZV%i}crkmkkEfS&>3+(P?<0QN^*ZQ?$8YQ8X_bo41X1fid@jcbVWds)4V~^3C}`6OT;Ar5-%d+;#ml2iMRwn;zdMUJPQFW5tjf+yoiX4 zXCa^^;t~Lf7ZGvsECjSfTmm5RA|fuHg@BfbO8_KZM8w6j5YQ5F34p|lh`4wb0$L(2 z0g!kR5f{%wKug3W01_`E;^J8dXo*76Mu#E&-5u5fK;9LO@Hz zB>)mHBI4p%2xy781VG|NL|i-z0WA@i07$%uh>K?-p!J8i9QjWsewzqEswEKQs>}W4SO5e$bQ%fjwD>)z$MxB>X5_Bq_?B}@PIYx$evfkMInlu@a>0?P zpIyfFaVg(2QvZIhHhsJ*7Q`3LjLPh|#yvQ$iAU7}6YO@_{8{>kyj z_jYMoer?sUYjZxoK@`^h<6+THSGJApArH@~{q)Y``Csho?H4t4Ctmb0v^DfVd-p?d z!FyoOnbN|+h8=^y+E(UQeW2Imi|EAQir;>!=nnh74@*BsGR%#?F@2%Y(24U6vdp*rR>`h#K7z%w- zlh(QXbgct(m^_}D;3CT|aP7WpIWe`iZOk{ctNoR8gCmfBi?%^N6OOzeA*sqeul|Je z*t2K{Ub^h&!>^)Wto>*IMcW*jKTmyrbJ*7Fmp`T?u8~W=Y67iy3V-lpo5Kk$?rZG2 zelhdYap|$SCuX0?shH+S4;XlCR(Xy?hwXUZC$k>`finAc8xj|Fij8T$pvbRi_JAl? zJLpDOt4aNy9j`2Pc6IM7H~P3A{G?w**|R~_$3|?i`*@+JW5;HIM{jSUtJf5&)8{3O zzTnZa9>s0jr}}p--FJR!*My{+c})lGXCHoh(ynL;5;Ev$`r<^l!~V?NUAJ5$=>>tEyS1Ly zxu$DXj6+X9y?Y_nIp@sf^uYns*19CE3(c?_N zD>0q_xfxqQyd@sT^fwGCw{C;UGU{(@Cq&R8q1h(P15S@fD(yUW;!){}{CyQQt$V6|(iWvM0FqfFsuTp0@IvboVUsMw5Uk>kdp_wW%uW+|NGQPHg(< zJt5~#IZd78acPrNxMS7O^zYj(DOtGu*6OO2nRj!N#?wV<5#Jrw%&{+$H&fiG>_yf* zIMTyoR95J@X3hzH75dDiu(?b7oy(0Z%-H_cqZkwxag|+heG?K2k9ymPZ#fidd2zqeMX-8=Oh8GW*G#%_{et>_lV_bT$87F&KD_<+1&)V%cz8~(TC3YK zuZ2CB+97kLOWI4;dJXVRo`tvcbaOH;nc4el?CRS1+rdY5WX>-`Ttdc=95r_HmH{By{fo#?$gK@{5$jg$ z|8!vmQC)jn0lJUDEAsE2ocDF?_opHEv&R?T0b}(I%{E46R8b2;cPu#YWh-@`kM?)} z$R*{UE|S2I(!UR>nP268D!*ge-etvMUx78T;Ijwk&)#3|F{@(n{+xx9>@a_~w1qtk z(+52}#awRvpmId}l2z>`J9K3Q7Xna&v+NXVlwa>&Nt-HZqtC?H951>($|T zVH=%KUwG8zgYT9vSl@2ujCs3 zrg>D|zA9$cyt3rm4j0wa*O!O%!spGOt_)$E;-TLCeFyA>JEyNd<_Z^J)92l3GO6FN z6Bk#0kg;jwt_Q8YX|cE?c*1-EZkNPX_s&Z2(k!{1KR)*`saf06@{s*2)$BMhw2?WZ+Lhcz6%|B_C+(B>;d4QwHBsK>D8P0HEN+wX}40_TdS6 z0v}!=!p_nX5y9MenkJ@3+b5)f?xLRzEnwmVvKuca_ zVZ7G7AIeead_KCkIN zbD!3Bv^(=uoot!h#9g*H7eds;T#H$g{@PG^<=WF0BeQ4)-9SJ^?i5Q)(5E8>ypJ?C zo~K z1NMyrR#r0^&44o!SUGpy^SeM)=KI|dQozz3TB=g}k^#gNDBcS2nGYPTTfE5{pre7Q zZ2Kz|-~kdq+j+8Wf#YX^vRai1Cjq&M0NN!!Rv#D_0j#Xj(Fp}&b^}uvyzw-CJ+Dxu z%>X8~`=oKPF2y=}sT?v$*3;8ymR_yhw0TpB;2&VRnNda9?itu?v@T?z%e2pC-)ta?ZMQuL0G3f2ID>^%i;?YmRFgtVI23rim|e@!6OXsAN>(aZbr3Q28S$ zmsPG;8ZAH0yh?5gsP!mbim{2VvsG@|?%4NQ<+kG{Z`MUzkDuzIZJ$iA#kg*AM|jw3 zzA@qdL5cHTa6Wl{6@Xp;d1I*!W=Hf%7n46Hp0O-GLYf(~;J}1iEFmU6No`-oE&l15 zCW*xTZMX7$lpiJ0EGyAvFQ&`luK1yiu3fe`K{k|6VOF2eJ~}b~+RWpNk4l#$yk*v% z2pKmy+PX}hI4;Bj0nReFr903UJ+M83(9p$CdL&PhmyU6%n5&&~#QyZ0^OHVYna;ps z;^?-9I`<|gO+l$d#9Lk==}u0t#Lg|=_J`exL+*Db-&t@cz*VQ+FgF8lJ5wj+`XiR_ zNmIae5(wUhBfy%nC|-c z$bR=pgrp@F1^bI!kGaGhnSu{ar_^jvv$M}GII#2XOrL2!z1(9jgy$zc-Z^Vg>MhSZ z)$KMfQeQ~-giKW2sJfvto})J-W4i2g&Ww=h$I=`Q&$zpJMx{HNgn55L$}8{ z3OQibKqLM{d5bf#rpTppF>z{`0OcA@Q~##&ULd!PTuoVPX;=`yD# z>dG`stetLrl@P=;)0j{}dO11tKZl+ttT^r6cPO)G^cl_oA`}NgEsWhVu^=pr- zF0?EZz71OTH2lun%#2eR6&*(!j&%|{xt(#1dvD_R>SuZ31h+0%S^nkHdfRlu-koUQ zrlXNgmQK-}Gi^F3CMwyp;QsNm*&%toVAnL-I~sp)Gp*T}^aT6FYsF1c+1aYI)lQdr zSu0|jEZ6A_um-{hZUZ?{v!yuF3DM@!OaJ)vK75VVrLCsa2I$?%haKjL`-;s~&6Cy_ ztZywZ(DJGJds~54Z(CYzaxGUW);aRUy<4*2b8z$J$cb}f<6=EGnr;n@r_a2NNhO5b zZnP9MS$(wHW%VS3gK?r9LoOs3(DIB{89ySO$DcR7X2kZoSx?WT+xgjRP>c);i2;5W zn?84R$34q@HlaCUS{kZqSzy@y+KQgo9JO4d$%fQjW)AU-$UFXRu3~UREphgnDIv4B zDuh*NR&caYw~4poA6R-D%v$uu*1$1*``^i>gfQK!xNO7L;+VO)+e#f29Uf;;v((a8 zBmA)@)C-sm+mp8iS>$OsrWA2ra-OqSS09C9PxfC8*nAc>Yp3jW-&5O;j`u<;6j>a8 z;l4!gzJcsX4&=$cRFiOnvMWDpUQNf%Q#Ts6k@j@$9q5=`G5P8CqU??Ko=8pl^9x5; zQBE2Mg*7NNtB#+yak0!%<8zye4E*bz@;f|J3nMSg33v33US5702YQX6t?F^S8<%!B?l_&Bf2EjJ$G*dE zfBpoSwNzHJ#nH|K*L$`1ZIjyLNdDZu+Uk;rA#*zmN}Wnq^q6&+KeT)t zS8uwszwtp=tEfky`6S@f9jjmluQ0=vin|^y_#{X;abJDSr@N|;xNm5 z7Jup}4`~e1>^j(_?9{Rbu}*Km=fjD&ZnttirOZf485k#>*8Q1@LpA__xhvP5E~Gm; zP?oKt`edf$%{T0E|sT13{)QBt$SE4mZF=yQ}1qHiFAC(e@-bq8$S*As?=7 zI3IEgU*ygV_hnL8+NLxG<4`K>z#kHVh){pO00A}BM0?0D75+WgjM7F7brJfSXqyiP zM9>|b5tckYgdi9ZkxVp^gdkCjFa#0_PclSc(HH^>jYHwkNGy(uM^o`w#K=pVrU3sk z=CjyTSE~gh;b6%`+eau2q@qwEAt6Q~I3pgPgThcK6cieZ!eWtd52PS0KnR8+0|Yw5 zPDcG$K>{Y98z|)R0uY0KK?W~aXriq>80gDuWL*A%UjhXPM%cj=QK4WU3S)#u{lv)8 zQM{SI{|_w%LhIG=m5hw+hXDodVSy0J6%z1*`Ao=qH54G!`O!rLj^0W9*xeWPPe;LG zez6P;=KBo+W-(EaALI|m6u@?vAC5uDWq+NVZ-y|a`Dr*Pl=~C2LCvt)P$~@1kTINp zR7*Yt3VD2Y9?y?9oMm6{pWxf4!K^~)d2$0-ybyuDF-p|r>wJIp23dhZh=xUDaY!^C zi6y(Eu~amMil@wjKhfwhPKJAm_;7@Cp9KoRZ@o~4yilk(%vdkq^cD5PV{zGG|H#YN zp5OX#bfnq^2!vn&6SA|S!DBb#a#>V7o`GgiAS@EZQ7}jlg9nimBA$uFGC&v?5yV0` z;?N+!HUG}F6^|J_m4q3?v1lfN&g;LSQmk zSRxr54ejt5FaQ&T>1~Y8tV0P zCjuT@7y|Mka}Jy#|72wjd;Qi-)V(okuvYtV{|_cY0IvSuO#=}ku+U@(UQi4+oQ`-n zCmAFHoRcgP9s?&jnFQfSr}@8p8op*R(+3RTKr9++bY!Cq|4lRZ&+6eXFQD%$|Nq|t z`fW2eyb`~yiKBJ)`xp2E4<17YT!EqEe zf$@u1&BWjd1Q;xQ*Ml3KMl2DJ1hFg@eA=SmARP3Iu30!H$iT6fNHWM~j${a)2_ne^ z92SekFwyW}e$_RIWwR(G3X+0>$Rn&7un6Zfj)BF(Gf9G1-!CN}gn=M35gfYe5!c{v zx@ri-k+B#!k>Mpn8Ue!mJxc~+;aOOa%pPR@o3EOU#b9w{7zmySr^)bH8O??xvC$9# zhht(%4EU7zA6So`iW%?$pUGmwXAw3;L9z&VHj+YNpy6Xa1I@&f@empFll3TBbeiadB5NQKYi@YxU?ItRmf^j({1fBN9L z+AnyhKM9M5UntDr=ZNW8wWz6=c+;_JQPZ!M9syh-4LcG|q$9)1k%bi=LiqZRn6 z4(iKeo$ofmFZUw9^T*c_{Z6kUz9d0JfQT0*xWw}j(MoWM01+=raEa$5qLtth0U}H52oUk21ebU|B3cP95g_742`=$` zM6?oIB0$885?tc>h-f9aM1Y7FCAh@%5z$I;i2xBVN^ptiBchey5&Z zB?3geD8VJ3kBC-+O9Y5`QG!c69}%qtmk1E?q6C+CJ|bEPE)gK&MF}qPd_=SoTp~ck zixOPo`G{yGxI}=67bUpF^AXWXaESmBFG_HU=Odz(;1U5MUXH+|eHnp=dcMpAZB^Bc{#btWsI?glA?5bsx)z$e@@~@A$y9G{~n5$;xZDn4i zeXcluGnt~A<6u3GG*?r@yCgwns=Jkn&LqOBRPQbR>E24YXE32kuWNO6-(Agm?-x8Y3Kn3kWJv@mt1~1xI4nsR16!QY$mmuEtvD`4%LbC*F*P`_%=V&F0Twl(g<| zf2~*+s-5V+r14zexG0;{uF&SPDn$Qzg{=kk`m}XPax>P-9$(Hy3tFeXdz|w*?WVIg zU8731NvbMn=aQ$I%?W7O^Y-+GFPF+k!E!KkGhePLA92ig5le88W0;$3Nbp}D9^-?r zc-~8F&w+_$jj;z?f@>ZYO@23z zzS1D(%{}d%)hZ4#Ug7^veE6zO>H)OmsOL<*EvuE4t*WL^l{YE7Uyq{CBfM1JRZ3|% z?K90&$~mfT9)X@4w&wMg7&rzHyWP$pRcmegp`4iV-FnfvDj81^vD@X#p5Bf7tOYK= zuW>m(tah3Gd}NYz;f3w2E{c&XIx$T}E4CWlA-v(+8MVkD70l&EXoTketz#q$kPmJR zHq#({wkzMa1?D}`th?DDd4pXobopFz_(e>*lArv_4`5E|%Y|*MRoR`(XxmSw-0G*t zt+Bk=9UJr5<@l6ID23;J_b*izG_46dcw(6r-@EN`j(kT_Sh1}0O#hxKcmFoQwyv|k zx1>nFFYRM74Yb-dQ@KRlmR?z4!5j|i`V7pTNU=tCG7mTV8Sa$ zRp6CleZ=afX1*C+DwcwNvD$5>zrySke(}QntarA@d5Q^D`X70fkxB``2d09zO6C?n z=WDl|9D0ur>>WrumlNoQIijUlYbATwL3fkRS=QdHNR0;vKFo^lzjPp=XmjF+U4M`g z`QBI242RC$)6d^SGvG`Jt4y}C$LO83-I~AL=~ls~`ZH<{!YkLu6N@?P;h8?LcE7V* rxc+(H2io$}sUd>5)w?1FG=Kqs>${@8