From 84aa369809e6564d8efe0af1530f3e9f30fec25b Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 16 Mar 2019 20:40:07 +0100 Subject: [PATCH] Airlocks rewritten to use appearances, use less ugly sprite from Eris. --- Content.Client/Content.Client.csproj | 1 + .../Components/Doors/AirlockVisualizer2D.cs | 40 ++++++++++++++++++ .../Components/Doors/ServerDoorComponent.cs | 22 +++------- Content.Shared/Content.Shared.csproj | 1 + .../Components/Doors/SharedDoorComponent.cs | 22 ++++++++++ Resources/Maps/stationstation.yml | 4 +- Resources/Prototypes/Entities/Door.yml | 25 +++++------ .../Buildings/airlock_basic.rsi/closed.png | Bin 0 -> 933 bytes .../Buildings/airlock_basic.rsi/closing.png | Bin 0 -> 2432 bytes .../Buildings/airlock_basic.rsi/deny.png | Bin 0 -> 1289 bytes .../Buildings/airlock_basic.rsi/locked.png | Bin 0 -> 933 bytes .../Buildings/airlock_basic.rsi/meta.json | 1 + .../Buildings/airlock_basic.rsi/o_closing.png | Bin 0 -> 2511 bytes .../Buildings/airlock_basic.rsi/o_opening.png | Bin 0 -> 2505 bytes .../Buildings/airlock_basic.rsi/open.png | Bin 0 -> 278 bytes .../Buildings/airlock_basic.rsi/opening.png | Bin 0 -> 2401 bytes .../Buildings/airlock_basic.rsi/spark.png | Bin 0 -> 2203 bytes 17 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs create mode 100644 Content.Shared/GameObjects/Components/Doors/SharedDoorComponent.cs create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/closed.png create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/closing.png create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/deny.png create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/locked.png create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/meta.json create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/o_closing.png create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/o_opening.png create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/open.png create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/opening.png create mode 100644 Resources/Textures/Buildings/airlock_basic.rsi/spark.png diff --git a/Content.Client/Content.Client.csproj b/Content.Client/Content.Client.csproj index 63590a2505..4a730db0b9 100644 --- a/Content.Client/Content.Client.csproj +++ b/Content.Client/Content.Client.csproj @@ -74,6 +74,7 @@ + diff --git a/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs b/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs new file mode 100644 index 0000000000..8496bdf640 --- /dev/null +++ b/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs @@ -0,0 +1,40 @@ +using System; +using Content.Shared.GameObjects.Components.Doors; +using SS14.Client.GameObjects; +using SS14.Client.Interfaces.GameObjects.Components; + +namespace Content.Client.GameObjects.Components.Doors +{ + public class AirlockVisualizer2D : AppearanceVisualizer + { + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + var sprite = component.Owner.GetComponent(); + if (!component.TryGetData(DoorVisuals.VisualState, out DoorVisualState state)) + { + state = DoorVisualState.Closed; + } + + switch (state) + { + case DoorVisualState.Closed: + case DoorVisualState.Closing: + sprite.LayerSetState(DoorVisualLayers.Base, "closed"); + break; + case DoorVisualState.Opening: + case DoorVisualState.Open: + sprite.LayerSetState(DoorVisualLayers.Base, "open"); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + } + + public enum DoorVisualLayers + { + Base + } +} diff --git a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs index 851f67484e..3687dd8f30 100644 --- a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs +++ b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs @@ -9,6 +9,7 @@ using SS14.Shared.Log; using SS14.Shared.Maths; using SS14.Shared.IoC; using Content.Server.GameObjects.EntitySystems; +using Content.Shared.GameObjects.Components.Doors; using SS14.Shared.Serialization; using SS14.Shared.Interfaces.Network; using SS14.Shared.ViewVariables; @@ -24,31 +25,20 @@ namespace Content.Server.GameObjects private float OpenTimeCounter; private CollidableComponent collidableComponent; - private SpriteComponent spriteComponent; - - private string OpenSprite; - private string CloseSprite; - - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - - serializer.DataField(ref OpenSprite, "openstate", "Objects/door_ewo.png"); - serializer.DataField(ref CloseSprite, "closestate", "Objects/door_ew.png"); - } + private AppearanceComponent _appearance; public override void Initialize() { base.Initialize(); collidableComponent = Owner.GetComponent(); - spriteComponent = Owner.GetComponent(); + _appearance = Owner.GetComponent(); } public override void OnRemove() { collidableComponent = null; - spriteComponent = null; + _appearance = null; base.OnRemove(); } @@ -87,7 +77,7 @@ namespace Content.Server.GameObjects { Opened = true; collidableComponent.IsHardCollidable = false; - spriteComponent.LayerSetTexture(0, OpenSprite); + _appearance.SetData(DoorVisuals.VisualState, DoorVisualState.Open); } public bool Close() @@ -100,7 +90,7 @@ namespace Content.Server.GameObjects Opened = false; OpenTimeCounter = 0; collidableComponent.IsHardCollidable = true; - spriteComponent.LayerSetTexture(0, CloseSprite); + _appearance.SetData(DoorVisuals.VisualState, DoorVisualState.Closed); return true; } diff --git a/Content.Shared/Content.Shared.csproj b/Content.Shared/Content.Shared.csproj index d2c544bb01..efa29c505e 100644 --- a/Content.Shared/Content.Shared.csproj +++ b/Content.Shared/Content.Shared.csproj @@ -64,6 +64,7 @@ + diff --git a/Content.Shared/GameObjects/Components/Doors/SharedDoorComponent.cs b/Content.Shared/GameObjects/Components/Doors/SharedDoorComponent.cs new file mode 100644 index 0000000000..8e19d0c58c --- /dev/null +++ b/Content.Shared/GameObjects/Components/Doors/SharedDoorComponent.cs @@ -0,0 +1,22 @@ +using System; +using SS14.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Doors +{ + [NetSerializable] + [Serializable] + public enum DoorVisuals + { + VisualState, + } + + [NetSerializable] + [Serializable] + public enum DoorVisualState + { + Closed, + Opening, + Open, + Closing, + } +} diff --git a/Resources/Maps/stationstation.yml b/Resources/Maps/stationstation.yml index f6b73b2779..6bf8f52630 100644 --- a/Resources/Maps/stationstation.yml +++ b/Resources/Maps/stationstation.yml @@ -166,7 +166,7 @@ entities: pos: 6,-4 rot: -1.570796 rad type: Transform -- type: DoorContent +- type: airlock components: - grid: 0 pos: -5.5,-4.5 @@ -238,7 +238,7 @@ entities: pos: -2.5,-4.5 rot: -1.570796 rad type: Transform -- type: DoorContent +- type: airlock components: - grid: 0 pos: 4.5,-4.5 diff --git a/Resources/Prototypes/Entities/Door.yml b/Resources/Prototypes/Entities/Door.yml index 3860d157f5..00b939b776 100644 --- a/Resources/Prototypes/Entities/Door.yml +++ b/Resources/Prototypes/Entities/Door.yml @@ -1,23 +1,24 @@ - type: entity - id: DoorContent - name: Actual door - description: It opens, it closes! + id: airlock + name: Airlock + description: It opens, it closes, and maybe crushes you. components: - type: Clickable - type: Sprite + drawdepth: Mobs # They're on the same layer as mobs, perspective. - texture: Objects/door_ew.png + sprite: Buildings/airlock_basic.rsi + layers: + - state: closed + map: ["enum.DoorVisualLayers.Base"] - type: Icon - texture: Objects/door_ew.png + sprite: Buildings/airlock_basic.rsi + state: closed - type: BoundingBox - aabb: "-2,-0.75,-1,0.75" - sizeX: 1.9 - offsetY: 1.5 - type: Collidable - type: Door - - placement: - snap: - - Wall + - type: Appearance + visuals: + - type: AirlockVisualizer2D diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/closed.png b/Resources/Textures/Buildings/airlock_basic.rsi/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..61e7b2d568f4f0957ebc9e7970341ed044f09424 GIT binary patch literal 933 zcmV;W16urvP)an8sZ<((_pegBY5=|=8jaD?;x8Hy!g(Xh z;kIIMb!FL<=B%o*j9bBu>#V8);K^iK#vBI%N7jH6@!8poDcR?1vW#27j_dO^nM`Q4 z^^HuA4?~+@iidQsDLE0(@Ke`2uAN(<^@mwY;iu1i-2A7Cp%MEU!o*@OO>;*CO?>Hb zyP0}ANl5on*WfZGhjbWA$+;F5r*@Th-Azt6OSE=ae@VK%GX<)HXAQ%jjh>sG|k=JmuxYc!4HL)0q(~f>+jyJzl!KSzG3W3Km+LSKdwZM zMq^)8TpCCwC%AhjYD@aLw;w1rtc7{^js#!6G|UD7s`k{9x%VF@Z?yC8A4$13^&Blp zhz&m8nSmE`)&>Bs{oZQ1!p8ma>!0U7OL%5FL+*bsUhnq+{53dGYM|Ox$K8i@08Bhb zuGOxhc;3iz;^IDLrqx<>oB+X1`=Ek~TZk!3NL-ip6tc)b3SzW_b~`o@X8+e}2u00000NkvXX Hu0mjfa3RH3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/closing.png b/Resources/Textures/Buildings/airlock_basic.rsi/closing.png new file mode 100644 index 0000000000000000000000000000000000000000..385ce627f73d833cf177073745d120f6bafd815e GIT binary patch literal 2432 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/locked.png b/Resources/Textures/Buildings/airlock_basic.rsi/locked.png new file mode 100644 index 0000000000000000000000000000000000000000..fb22d2c3f596d15bc7b080299b6f20c6ee6b0395 GIT binary patch literal 933 zcmV;W16urvP)t6-9tY-#R>CS_a&C$77p34o>LjEuR?4Ze8*l!-rjl(i-I^z#@m3|7DO_AY4esyas^o+TIz%a~zfIiR)E!+X~|wYYoxySmfr z8)$NSn4eqJ;)Ww5+9tFN2=R_?_1afrer{3Qgfy^IED{WcNyO&~naDLfF0NWvT@zay zyCmXyg26C5#iHcBq&s0f;`MNif|a9hB*Oakf2?nB()emWP%I;Lbhoj!q5ois94!NY zJQjzBO4}?NjWOOSO9Z21HMXAv^41eQ1L8OqBfzgQ*WuOE!%qq07mtj+2p9m<(-*bK z(P-?2ic15@WQtoqM;%FTPfi1+g0;2bJ(1w!$CljyK*K97WPkaMcRw5A$8VBy?45Y4 zEFm`g$H@%*wXQY*@X6P&DMvVZKEC|!gXa=nTg{Tc=g04F2jKhJnQ{Y-o>p$%Z3Q6p zCvt4`l*9{Gj(4thv9_vLk}I*bvCG0j#&!_NUEphWJ0=V9(|{oas^P;=Uw>|aTJ^vH zc;i9@I9li9cU(^utVB36Qj=o<+`T;~1MZif5t+1iGrC8sfR)?S;>nimLSzD;*UQ4f zydzn+$kbCeYF5L&{aq$6jcZRRFnMWQuOBE_Ieh*=RnppOmeH|6e!r8_5+5BKthrr% z{s09lhfBN}&EA}0cp$*J{`17+KPel_vwgi<1}eoxGh&)kJWQ{!w49M|N3P2seSQF? zQmkV_OsIkrS0ygq$mB^V0ss%wE12fgp$WTCBA!Et56SDz!jQ!U$!^}E5}YgQ;mOO`22ygzX1LRR-T53dj(x300000NkvXX Hu0mjf7X85I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/meta.json b/Resources/Textures/Buildings/airlock_basic.rsi/meta.json new file mode 100644 index 0000000000..b4c323b79e --- /dev/null +++ b/Resources/Textures/Buildings/airlock_basic.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris/blob/2b969adc2dfd3e9621bf3597c5cbffeb3ac8c9f0/icons/obj/doors/doorint.dmi", "states": [{"name": "closed", "directions": 1, "delays": [[1.0]]}, {"name": "closing", "directions": 1, "delays": [[0.2, 0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.3]]}, {"name": "deny", "directions": 1, "delays": [[0.1, 0.1, 0.1]]}, {"name": "locked", "directions": 1, "delays": [[1.0]]}, {"name": "o_closing", "directions": 1, "delays": [[0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.4]]}, {"name": "o_opening", "directions": 1, "delays": [[0.2, 0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.3]]}, {"name": "open", "directions": 1, "delays": [[1.0]]}, {"name": "opening", "directions": 1, "delays": [[0.2, 0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.3]]}, {"name": "spark", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}]} \ No newline at end of file diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/o_closing.png b/Resources/Textures/Buildings/airlock_basic.rsi/o_closing.png new file mode 100644 index 0000000000000000000000000000000000000000..56ba00b3e0ece0d4db7020ced1393d48c63b1246 GIT binary patch literal 2511 zcmV;=2{87FP) zZD<_F9mXF?8+5WF9Y{GD$&zB7>|j+dRccj-kvR8*Asm%uOdEnp3C)Mb4Z(s^ND3lR z4OQwwAke%>p#>R3@rQm0R|!ODKe%p;ks{N?k&uaWk}RLKmCwFJR#cx0%H_jp_ICGX z->jXPZSH;`d^fwd&)ocHXLo0w|G8-RoeOE~Fg7}Zs@i(6Bq_)7;xAvOZp%mgqEn|| zO9MbGwuGb{hp*%z(+Z@vOHox@kLKo}raWKurC4kUKqfMab61O)s_$?BN7DMTq#Vaa zVhI~ODnKDA$I%<=#LUbTx+4Kp*HyTB{CjJgn4V0aH`Ixbr#@B6rKB7O0B(&>wDdvX zsh_yBp3?~q?%#{`by<0TZ*5Zv!o9UkrM$YXLU~VKtILeY94mqKbr}cu@5RDOrrnFW zk3E~7{>NXreR(zA$DU0CfN1^Y>z75yqp2edNrBG0$B2;BIB{HvwkHB0dK}(< z^)zN@=Y-V569LF)3IW)GOw04e69M2k6>S91^$<0l2!LoV1UrRwf> z2&R~|4a16j*Dss_f+;%CnsEp4z7P>zLcZ!t#HBShiZnN0Q0tMj-kp}O`ie8It*sSf zqa)0F0ui5`ozs-(tG;4O(N~BiG%c^_w{`r0>6CP8TdQC21?lMO3L)_Q1ok&IDrK^~ zhT7UX&3gcvGOKMX%d1Fy7SPxd0S^X%M-Mb(W@ZZAfdGJ2P5H|5YRCsGI{aHI$9Yd|JINZ}}OIS}r{*qeW-V(&;^Gi8p z{>n;BPfnpb0!;@XjqfCBV(RjBO%TYJ@9GL+!G0!ydHHY zl&Wg$GyZsk0Bof;v9)Y|z(-*tv80T*X8HstjbB|?0XcrxnLavA_a_~}4z#n+NZ)g} zp)_jipRmk8p?$_JoDPBdv(F4A0I3ICNIlq6Hn2?5af;hRAdQXt_tDiA;x+^llmN_p za#bm0c^~ZbKA+VP=oGhyK!OB_P0lBtlpl7ZD`8ou8CII<51WKZPnMpY=bO=n! zaWr*=ar>+P!C%S04xTszMCK|3Q08W$(Q&1W*AOTHbbmhY1~KyH^Qecq;rG-uWA@t4 z8}ctIT}$TH4}lVZoY_Hjg?L~zJISjaR=EMu=s1&MvI$5_0Pyy?H!+aB2>_UXVSu|& z{_S&bDz8Pp z9-lCu{9Et#13dsvO$e#STkrOx4-?dS_(~o!H3}%t0irTQh_=XjB;`0R1Ums;J%083 zBLLjBr33{(QZ@6FZ0=+M>8qeE`_s)QD?W z<{Sm!a8Ijd7&OxVzsV19a|m#%zp}iF!#%CIcEw&B=^Nin%km=3`Yyl;ZVdruL?Zo| zocx={ngV2lUXF#IKXCp&`6{oi?M~A?M3R9DDnf^Eb#||hPk=c;Pm1afwqo=o6JJzwL@^AGUUleee``{HH;-uX)z zE?s%t@EArxP&Yp74gh3>AbJ*9$q(>{IXH*Q1tmd{!pJBMr)w zGy~A~5SAGtcJ#f_0azgcP#(+M+A<9tjgI4JU1o}iN0OYGKENkSQWO%9orh8TApbc| ze?UBX+<~G!hPoAZ9(2o9Z|NOjb&Nwfi3Bce`32vM!#-WSfDF43xyR1)M?G^^y zu?9NPw_}(!+O`{K97~kDpca_>=3aIXRE>VFrJfUG~?$S2SG%UkLHY~au%AKUBm zK@tG`us4kP-Y}|E%abQx+6VmR(_MXez+MAb>5H_*utoxaPd?5jA^S=mBHX84@L=5l zR{DVZ=2)+wEJ^l;k16(W!sfXjqkQKzs|K*E5Abou@y1bpfQSa*?Tq7%l$7J9{&-dm z;KZNrwmDX>FA`0DfRR7m?FKON=eM^6nVVx5V+$Jn!82EBhu}s|e!$7TXLcGO*IA%W z+Azb)9c<>$Z*K|WK=VPvI*{Yhuw#xTjZgG1e((pez98~~REUQ=*vg-;uY(?=U$8aW zSMN;bnG0bB^&-r=0qmfzgPusFpZXc2eVuCa#PBZ23k^W(Kr5%=WM8k4_xS-Le<}?C Zz6Jh|8l^HhN`L?W002ovPDHLkV1n_C%oqRw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/o_opening.png b/Resources/Textures/Buildings/airlock_basic.rsi/o_opening.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdc9f6b5ce4a62613f9015121318b4f5d009249 GIT binary patch literal 2505 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 T36%8900000NkvXXu0mjfipR&= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/open.png b/Resources/Textures/Buildings/airlock_basic.rsi/open.png new file mode 100644 index 0000000000000000000000000000000000000000..ac56b5978fc906d8ceff76344da2e5d3546621ac GIT binary patch literal 278 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 T4LVn700000NkvXXu0mjfmJydc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/spark.png b/Resources/Textures/Buildings/airlock_basic.rsi/spark.png new file mode 100644 index 0000000000000000000000000000000000000000..b52aff0a92a11dfc738fa02042391587a1e39f6c GIT binary patch literal 2203 zcmZ8jdpHw}7v3U-eQph@nJ>zn6!DQwa+gT7xzwnX%L*yC##R(bzq!wSxtFr7m|V(S zDwoAv!iQ3GTVYr;8N;{!`aMs7ocEmbJm;_TzVCU?L$@>bAW0QT0001Tbg*$3WCfIu{Ol1>S(Lue^vZA#3IA3b`$&)2lo6jfG z^|iF5@5oMN8(v|}MX)bHUufkpha)qCr-3Z9g%M2OS})4&=f~SFE5k2$O=2|fPo86L zrlsVr;oUs^Mf!V9-^OQ#*7(|l7kg#Gk20Ay7PgYIje4S(91pA_R_o{vMJ-qVoX)0Mg(gMZWgIe{WbxTn86XL`M8Oqz_a}PoDY1{4witef(=SRrI)hJID?|Dmw=LdbI=%3*52HeN z=LS^s-EHy>0S)8$!I3EBjnDoQrF?8ul&cLBaMd2 zt0TK^>(orsWSnRVbZ8_>8PSZyr*9ep%*?(2;hfyRJ$)+oVjTrb-W`~k`FZKQU)nQA z=xfcREs861y^fv*6P8^MWtu#FwObIH#e2%u%g@(h$z5M)O0D;H))h}1rtlm#mxJL> z5u;qWSvtN%J7_EoRL>Iq-&^L@X+yf%+Jl02-t&ax-+u@gqq^UQ_UE&OBj|sK9kb9F zB*(P&%?aO_p|F7eM`G+bQRS7 z-~;>Nok9y!`8C@>fdf2eF7`0MIU@bv268e--4f}OqtfTZAgB7hc1tt>rTTnf zE~S1Zv&gw0Y)UxW+D{qRxiwo;O&y?KCkmuVZ>A!NV=7>n8dl-&SRvDemSdWx8gQPh zPf={U?ecT#-pm%CrU*vyVh84E7z=4J26&YWBcI+$d!D0 zgX0@6)Iue8r_FLce`J2iEv2cFDz^_$T*mkZ5878gTi4CBBR@XZSeeDG61&}|JDLSs z3)dg=(EBQw&Le7QPYVy(6O649!@zX<*7muGOEF$&OGvw{nS)mnzqH)-Cnx`8zvwallQtP)f6{H<3*m|>(E?%YmiFVhKZB}LAQ;HRNq~=2$$Hm%nPnMo1yl_vKYi zQRG*mXQV(N-cNXuxJ*~9W7(zP!K935snIi<0-({{|AEmB^-F}Qt}bv{WpMv9+W_@d zP6U%-kF{=x%3hBD1Nu{uEGXhW`-sYh0LfJ!W-0JRwzoGdkOeKNc`*2hAa_&b0Hmg2 z{8zWmx4;E11X5#c{H_s>6VSTk7X$es8ZG5JgoERl*`xUwphRjPzrMd;ZGI-oOm$!c zEJ(YO2)j7t9FKDgwKiUN!rIjF?}>tVyOYghj5Oj}-3DA-u2F{SB59)L_bkfN>&{@(jfHR znr|yH3{5C#Cm_x>8>A@(Vek1xexg(>N{*stT+2Fu7cg0?9C@tJ784UrX7zN)ZLIZZ zecawPQqI;Mp$lPSw-c5xg0xCOT=D3Q_++{l5Bb6uafN`#k zhQ2D?Iu1A$`pYkfginFD4GcI1Z(#Z54ELK}{}QznRh` zIIJlwGxD<0PhqHT#D=^E4L7hYD(gzgc($q|oR_s??xsK_y|uSO%VDr5ok{`sO5%ZK zTYJ