From 12fb4b20975b89df96263fce72b0bc5231d0a2ba Mon Sep 17 00:00:00 2001 From: Jackrost Date: Mon, 23 Jan 2023 01:50:05 +0300 Subject: [PATCH] Spiders Buff and critters change (#13377) --- Content.Server/Spider/SpiderSystem.cs | 77 ++++++++++++++++++ .../StationEvents/Events/SpiderSpawn.cs | 32 ++++++++ .../StationEvents/Events/VentCritters.cs | 7 +- .../Spider/IgnoreSpiderWebComponent.cs | 7 ++ Content.Shared/Spider/SharedSpiderSystem.cs | 35 ++++++++ Content.Shared/Spider/SpiderComponent.cs | 22 +++++ .../Spider/SpiderWebObjectComponent.cs | 9 ++ .../Spider/SpiderWebVisualsComponent.cs | 9 ++ .../Locale/en-US/actions/actions/spider.ftl | 5 ++ Resources/Prototypes/Actions/spider.yml | 7 ++ .../Prototypes/Entities/Mobs/NPCs/animals.yml | 21 ++++- .../Entities/Objects/Misc/spider_web.yml | 75 +++++++++++++++++ Resources/Prototypes/GameRules/events.yml | 10 +++ .../Textures/Interface/Actions/meta.json | 5 +- Resources/Textures/Interface/Actions/web.png | Bin 0 -> 719 bytes .../Objects/Misc/spiderweb.rsi/meta.json | 17 ++++ .../Misc/spiderweb.rsi/spider_web_1.png | Bin 0 -> 2709 bytes .../Misc/spiderweb.rsi/spider_web_2.png | Bin 0 -> 2215 bytes 18 files changed, 332 insertions(+), 6 deletions(-) create mode 100644 Content.Server/Spider/SpiderSystem.cs create mode 100644 Content.Server/StationEvents/Events/SpiderSpawn.cs create mode 100644 Content.Shared/Spider/IgnoreSpiderWebComponent.cs create mode 100644 Content.Shared/Spider/SharedSpiderSystem.cs create mode 100644 Content.Shared/Spider/SpiderComponent.cs create mode 100644 Content.Shared/Spider/SpiderWebObjectComponent.cs create mode 100644 Content.Shared/Spider/SpiderWebVisualsComponent.cs create mode 100644 Resources/Locale/en-US/actions/actions/spider.ftl create mode 100644 Resources/Prototypes/Actions/spider.yml create mode 100644 Resources/Prototypes/Entities/Objects/Misc/spider_web.yml create mode 100644 Resources/Textures/Interface/Actions/web.png create mode 100644 Resources/Textures/Objects/Misc/spiderweb.rsi/meta.json create mode 100644 Resources/Textures/Objects/Misc/spiderweb.rsi/spider_web_1.png create mode 100644 Resources/Textures/Objects/Misc/spiderweb.rsi/spider_web_2.png diff --git a/Content.Server/Spider/SpiderSystem.cs b/Content.Server/Spider/SpiderSystem.cs new file mode 100644 index 0000000000..449e43984c --- /dev/null +++ b/Content.Server/Spider/SpiderSystem.cs @@ -0,0 +1,77 @@ +using System.Linq; +using Content.Server.Popups; +using Content.Shared.Spider; +using Content.Shared.Maps; +using Robust.Server.GameObjects; +using Robust.Shared.Map; + +namespace Content.Server.Spider; + +public sealed class SpiderSystem : SharedSpiderSystem +{ + [Dependency] private readonly PopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnSpawnNet); + } + + private void OnSpawnNet(EntityUid uid, SpiderComponent component, SpiderWebActionEvent args) + { + if (args.Handled) + return; + + var transform = Transform(uid); + + if (transform.GridUid == null) + { + _popup.PopupEntity(Loc.GetString("spider-web-action-nogrid"), args.Performer, args.Performer); + return; + } + + var coords = transform.Coordinates; + + // TODO generic way to get certain coordinates + + var result = false; + // Spawn web in center + if (!IsTileBlockedByWeb(coords)) + { + Spawn(component.WebPrototype, coords); + result = true; + } + + // Spawn web in other directions + for (var i = 0; i < 4; i++) + { + var direction = (DirectionFlag) (1 << i); + coords = transform.Coordinates.Offset(direction.AsDir().ToVec()); + + if (!IsTileBlockedByWeb(coords)) + { + Spawn(component.WebPrototype, coords); + result = true; + } + } + + if (result) + { + _popup.PopupEntity(Loc.GetString("spider-web-action-success"), args.Performer, args.Performer); + args.Handled = true; + } + else + _popup.PopupEntity(Loc.GetString("spider-web-action-fail"), args.Performer, args.Performer); + } + + private bool IsTileBlockedByWeb(EntityCoordinates coords) + { + foreach (var entity in coords.GetEntitiesInTile()) + { + if (HasComp(entity)) + return true; + } + return false; + } +} + diff --git a/Content.Server/StationEvents/Events/SpiderSpawn.cs b/Content.Server/StationEvents/Events/SpiderSpawn.cs new file mode 100644 index 0000000000..cb58e438ee --- /dev/null +++ b/Content.Server/StationEvents/Events/SpiderSpawn.cs @@ -0,0 +1,32 @@ +using Content.Server.StationEvents.Components; +using Content.Shared.Actions; +using Robust.Shared.Random; +using System.Linq; + +namespace Content.Server.StationEvents.Events; + +public sealed class SpiderSpawn : StationEventSystem +{ + public override string Prototype => "SpiderSpawn"; + + public override void Started() + { + base.Started(); + var spawnLocations = EntityManager.EntityQuery().ToList(); + RobustRandom.Shuffle(spawnLocations); + + var mod = Math.Sqrt(GetSeverityModifier()); + + var spawnAmount = (int) (RobustRandom.Next(4, 8) * mod); + Sawmill.Info($"Spawning {spawnAmount} of spiders"); + foreach (var location in spawnLocations) + { + if (spawnAmount-- == 0) + break; + + var coords = EntityManager.GetComponent(location.Owner); + + EntityManager.SpawnEntity("MobGiantSpiderAngry", coords.Coordinates); + } + } +} diff --git a/Content.Server/StationEvents/Events/VentCritters.cs b/Content.Server/StationEvents/Events/VentCritters.cs index d1569b07f1..5d61e10c71 100644 --- a/Content.Server/StationEvents/Events/VentCritters.cs +++ b/Content.Server/StationEvents/Events/VentCritters.cs @@ -1,4 +1,5 @@ using Content.Server.StationEvents.Components; +using Content.Shared.Actions; using Robust.Shared.Random; using System.Linq; @@ -7,7 +8,7 @@ namespace Content.Server.StationEvents.Events; public sealed class VentCritters : StationEventSystem { public static List SpawnedPrototypeChoices = new List() - {"MobGiantSpiderAngry", "MobMouse", "MobMouse1", "MobMouse2"}; + {"MobMouse", "MobMouse1", "MobMouse2"}; public override string Prototype => "VentCritters"; @@ -18,9 +19,7 @@ public sealed class VentCritters : StationEventSystem var spawnLocations = EntityManager.EntityQuery().ToList(); RobustRandom.Shuffle(spawnLocations); - var mod = Math.Sqrt(GetSeverityModifier()); - - var spawnAmount = (int) (RobustRandom.Next(4, 12) * mod); // A small colony of critters. + var spawnAmount = (int) (RobustRandom.Next(4, 12)); // A small colony of critters. Sawmill.Info($"Spawning {spawnAmount} of {spawnChoice}"); foreach (var location in spawnLocations) { diff --git a/Content.Shared/Spider/IgnoreSpiderWebComponent.cs b/Content.Shared/Spider/IgnoreSpiderWebComponent.cs new file mode 100644 index 0000000000..8b412df690 --- /dev/null +++ b/Content.Shared/Spider/IgnoreSpiderWebComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.Spider; + +[RegisterComponent] +public sealed class IgnoreSpiderWebComponent : Component +{ + +} diff --git a/Content.Shared/Spider/SharedSpiderSystem.cs b/Content.Shared/Spider/SharedSpiderSystem.cs new file mode 100644 index 0000000000..b64f980c34 --- /dev/null +++ b/Content.Shared/Spider/SharedSpiderSystem.cs @@ -0,0 +1,35 @@ +using System.Linq; +using Content.Shared.Spider; +using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Shared.Spider; + +public abstract class SharedSpiderSystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _action = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnWebStartup); + SubscribeLocalEvent(OnSpiderStartup); + } + + private void OnSpiderStartup(EntityUid uid, SpiderComponent component, ComponentStartup args) + { + var netAction = new InstantAction(_proto.Index(component.WebActionName)); + _action.AddAction(uid, netAction, null); + } + + private void OnWebStartup(EntityUid uid, SpiderWebObjectComponent component, ComponentStartup args) + { + _appearance.SetData(uid, SpiderWebVisuals.Variant, _robustRandom.Next(1, 3)); + } +} diff --git a/Content.Shared/Spider/SpiderComponent.cs b/Content.Shared/Spider/SpiderComponent.cs new file mode 100644 index 0000000000..a5b5731711 --- /dev/null +++ b/Content.Shared/Spider/SpiderComponent.cs @@ -0,0 +1,22 @@ +using Content.Shared.Actions; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Spider; + +[RegisterComponent, NetworkedComponent] +[Access(typeof(SharedSpiderSystem))] +public sealed class SpiderComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite)] + [DataField("webPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string WebPrototype = "SpiderWeb"; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("webActionName")] + public string WebActionName = "SpiderWebAction"; +} + +public sealed class SpiderWebActionEvent : InstantActionEvent { } diff --git a/Content.Shared/Spider/SpiderWebObjectComponent.cs b/Content.Shared/Spider/SpiderWebObjectComponent.cs new file mode 100644 index 0000000000..ad9f5b9f39 --- /dev/null +++ b/Content.Shared/Spider/SpiderWebObjectComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Spider; + +[RegisterComponent, NetworkedComponent] +[Access(typeof(SharedSpiderSystem))] +public sealed class SpiderWebObjectComponent : Component +{ +} diff --git a/Content.Shared/Spider/SpiderWebVisualsComponent.cs b/Content.Shared/Spider/SpiderWebVisualsComponent.cs new file mode 100644 index 0000000000..2d6fb58815 --- /dev/null +++ b/Content.Shared/Spider/SpiderWebVisualsComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Spider; + +[Serializable, NetSerializable] +public enum SpiderWebVisuals +{ + Variant +} diff --git a/Resources/Locale/en-US/actions/actions/spider.ftl b/Resources/Locale/en-US/actions/actions/spider.ftl new file mode 100644 index 0000000000..3fc482ce3e --- /dev/null +++ b/Resources/Locale/en-US/actions/actions/spider.ftl @@ -0,0 +1,5 @@ +spider-web-action-name = Spider Web +spider-web-action-description = Spawns a web that slows your prey down. +spider-web-action-nogrid = There is no floor under you! +spider-web-action-success = You place webs around you. +spider-web-action-fail = You can't place webs here! All cardinal directions already have webs! \ No newline at end of file diff --git a/Resources/Prototypes/Actions/spider.yml b/Resources/Prototypes/Actions/spider.yml new file mode 100644 index 0000000000..8a5ee0e52d --- /dev/null +++ b/Resources/Prototypes/Actions/spider.yml @@ -0,0 +1,7 @@ +- type: instantAction + id: SpiderWebAction + icon: Interface/Actions/web.png + name: spider-web-action-name + description: spider-web-action-description + serverEvent: !type:SpiderWebActionEvent + useDelay: 25 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 8d18229c23..23a0130615 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1316,6 +1316,21 @@ enabled: false autoPopulate: false name: action-name-disarm + - type: MobThresholds + thresholds: + 0: Alive + 90: Critical + 150: Dead + - type: MeleeWeapon + hidden: true + angle: 0 + animation: WeaponArcBite + soundHit: + path: /Audio/Effects/bite.ogg + damage: + types: + Piercing: 12 + Poison: 4 - type: ReplacementAccent accent: xeno - type: InteractionPopup @@ -1323,6 +1338,10 @@ interactSuccessString: petting-success-tarantula interactFailureString: petting-failure-generic - type: Puller + needsHands: false + - type: NoSlip + - type: Spider + - type: IgnoreSpiderWeb - type: entity name: tarantula @@ -1341,7 +1360,7 @@ makeSentient: true name: ghost-role-information-giant-spider-name description: ghost-role-information-giant-spider-description - + - type: entity name: possum parent: SimpleMobBase diff --git a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml new file mode 100644 index 0000000000..63d89fc479 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml @@ -0,0 +1,75 @@ +- type: entity + id: SpiderWeb + name: spider web + description: It's stringy and sticky. + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: MeleeSound + soundGroups: + Brute: + path: + "/Audio/Weapons/slash.ogg" + - type: Sprite + sprite: Objects/Misc/spiderweb.rsi + layers: + - state: spider_web_1 + map: ["spiderWebLayer"] + drawdepth: WallMountedItems + netsync: false + - type: Appearance + - type: GenericVisualizer + visuals: + enum.SpiderWebVisuals.Variant: + spiderWebLayer: + 1: {state: spider_web_1} + 2: {state: spider_web_2} + - type: Clickable + - type: Transform + anchored: true + - type: Physics + - type: Fixtures + fixtures: + - hard: false + density: 7 + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.5" + layer: + - MidImpassable + - type: Damageable + damageModifierSet: Wood + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Temperature + heatDamage: + types: + Heat: 5 + coldDamage: {} + ColdDamageThreshold: 0 + - type: Flammable + fireSpread: true + cold: + types: {} + damage: + types: + Heat: 1 + - type: Reactive + groups: + Flammable: [Touch] + Extinguish: [Touch] + - type: SpiderWebObject + - type: SlowContacts + walkSpeedModifier: 0.5 + sprintSpeedModifier: 0.5 + ignoreWhitelist: + components: + - IgnoreSpiderWeb diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index dae169bdd3..2597006dfa 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -186,6 +186,16 @@ weight: 5 endAfter: 60 +- type: gameRule + id: SpiderSpawn + config: + !type:StationEventRuleConfiguration + id: SpiderSpawn + earliestStart: 20 + minimumPlayers: 15 + weight: 5 + endAfter: 60 + - type: gameRule id: ZombieOutbreak config: diff --git a/Resources/Textures/Interface/Actions/meta.json b/Resources/Textures/Interface/Actions/meta.json index 5fb7046353..a26a136365 100644 --- a/Resources/Textures/Interface/Actions/meta.json +++ b/Resources/Textures/Interface/Actions/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/3d049e69fe71a0be2133005e65ea469135d648c8. Harm and disarm heavily modified.", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/3d049e69fe71a0be2133005e65ea469135d648c8. Harm and disarm heavily modified. Web made by jackfrost (github) for SS14", "states": [ { "name": "internal0" @@ -54,6 +54,9 @@ }, { "name": "malfunction" + }, + { + "name": "web" } ] } diff --git a/Resources/Textures/Interface/Actions/web.png b/Resources/Textures/Interface/Actions/web.png new file mode 100644 index 0000000000000000000000000000000000000000..e459a74bb08912614bbea751e028890d554d34a1 GIT binary patch literal 719 zcmV;=0xe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00K8jL_t(o!>w0M((E7z#Hrjz z*13@$2yWy$p2%yO-a_=2}(yr^;y2*82L&kbd zzVAd%#vK3vh?t0Ij4?(^DcMbP&Hw8%`HCYNJM;zI1ph@MDF)T7UY}-w>M4*7npg< zficF=*lWy}M3>uJIOM$zp~nFkr#Ym*O(FAenx*KB10EzEw8ttUtu<(^fd|Jb>@wD- z;#T-=L_9d8MPc`D9Kv7^;2p@qVL1?mUB9#amuA1s1{;mm8Zh&Hkls7=-tUbiL+q_* zYrmqx67_4XNzxG!6Cx&NhMe;)ue)n4h2;~$`QLR8L`+&_q?J;_{&}7*k>&eruJj*; z%4)!@?+J|HZkfO8zdkh|LcUVUEktr7U4}n)L@VMTV$uTBT6@$2d1pPvZ0%49)doWf z2{Xfao;P;qc@D`8AtE#1s!2q{;=knsywa@I&11Y4EAk=CNIm|Dei(%5+Wo8q#``g`8DhohpANYc zAzR<=f#kLkBt$es&=P#mEV-gzvxo;jZ@>6G{{y<)tfYLiD;NL(002ovPDHLkV1lzr BI`RMj literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/spiderweb.rsi/meta.json b/Resources/Textures/Objects/Misc/spiderweb.rsi/meta.json new file mode 100644 index 0000000000..fbb29bcf3b --- /dev/null +++ b/Resources/Textures/Objects/Misc/spiderweb.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/788b2576cd9511ced86e74222b6395fd3ef9affe", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "spider_web_1" + }, + { + "name": "spider_web_2" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Misc/spiderweb.rsi/spider_web_1.png b/Resources/Textures/Objects/Misc/spiderweb.rsi/spider_web_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e86c5ad4a13a2aee3759a7025fdac9e766860c26 GIT binary patch literal 2709 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 P00000NkvXXu0mjfUz{MZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/spiderweb.rsi/spider_web_2.png b/Resources/Textures/Objects/Misc/spiderweb.rsi/spider_web_2.png new file mode 100644 index 0000000000000000000000000000000000000000..949dc46083f1e1b165d66a008b9e0118f639f916 GIT binary patch literal 2215 zcmV;Y2w3-tP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvlEfwq{nsgS1jNp9SgUe_96w?;V9%tIN_(b_ zg%Fb7lW;@+>(2sz(1&ZsKq_Ok)0)voI_bElfo1*E@5p5PZXZ6T==qStn&2c7bQk?m z=b`UOuAT)(4tY4`VB)Z2haqIg)}roQ$3xE!LxOiXj%RRVotIlU zitGsvJPQ@IXSNHI_)L)1E$y6;G&zznY&c#Qd@QIV_Pq(y*W z8MvvDU%Fu94cmYfgrI6^wiKXep_>Q_A8v_;vmiaiB(Po@Xwoo1DWbgb!& zjm&Uv5GjwA@bTn17m^1;0F~kip%6AgXadLbx;L#c*mSw#T}-WofKWmUL(n+k2`niU z@yAF@9P&yi2}&ugjIzopuZ5OcX|0W}J<1zlq)|p2W2|w;TVbVDR$F7Ob=EuX1hp{b zv@_tWbIyC()RSpXt37FWA9xT!1{HKL!3Gz6B>F@dRn*Z$8(s8?Cy}W9lTHSbO)mM2 znW&UyR#|70ZFbog;#v_!7FBdH#THlmLT#XWqJ|f8zoUi&wThT*dgeim#Kue$SlfxJ zm=R)JA|Y-n0z_zDF=G~`zJ4o?H6s_Yz_oe(B7) zSiq-xqiu>MKk8&X-X2wqu-@uo0Z{?s6%d{ zD^=Nh@_SB9$9oLT!A#YEJ6+>ggFDQ+w&jTuK0QzMiNgrBFInPecY98U4H;PJ z+m#KLCRi%p8utd2qu~(AmgDgVc!Tpc*M~J`ID!sJ(J;}$hr}+WtWBLV~FSxt5$70^=XN7eHT)5rD_|DC##^2mYudwTUG_J z4ofp!HE3a<>-NTW-CGkubo1STayx*1p=xXC-i$KTo+^7}t)U(S*^2fh}_$(_xkpIM$+FF%;2*y*%tDZD(T6&nMW z)02bHCmZQL<61KNUC=XT7@IxC+LC|N+K6vtV{3VP#^BTO(S`2Sx7y5E4GCt(w&1qb zwyN){FMAZUZH?`0NA?0^MAjLzqJNcgX7FCPT5DtJvE<#Z7h7T5Xt1R@JsCUsw$V)t z)VCvpreXN`753qReH{%)%P#QiIdha5w}T$+tNFslmV-%8FQ4unu|L2MUctMW^Sh0v zhvhH2EwV!A+eW3c*1w+Y`wU?%M~~`FgC9w`PKvcZyiU@?2*2J2_H*XU29&F4t_nS3 z{-NTUE%>ohEgCw zcH9W8=;9gtR*taO-Sh zEdT%lNl8ROR9M5USFw@fFbu>oaNr0fumpyxNd>7Ug^V1l1jJ7M6N9tD0}$nV&Uj?W z6tP_F0`!lF?7jDe%xJBhp10O^5uxKa{+U~A-Sv5`b!X;Pe-n|7h=`e25!vucL{!Kb zt+hS7kAmBQfp9SM_`O5{EGr^HGvhdpMMO3)_~(8jqQOG(=+8#2b-$XUJH)`BRBU!5 zMHif*T^Fvk?g+#Kg-pEP@9pzg85vqAcj#3R`nh6*ndvx=<@I{G>15`$L;~^_6A==T zp$`oZv4H7)KA&UfDAEFSooL5OtfzYt1PJq9TMKtdlGY>Il7_Y?uYao#-y@!U_bGowDZI@VCXsf{5PH zK5??)-TYsrL`3My6}tPcMR)}wN(E|wnOB#AtSYJ|v_|MBTO(pYfs}7@k5v)D%%s9P zqGZhk173#}ibtf0 zhy^>>vgh@Sk{!X2jVKsCx2+x7Q2S~N*AiYP%4XPHW^$YXxwK(+8rB?phZF1(mU;!! zdtaEDeniAo`=@T7nv8ze1<@(^U74^sw*ntF%udGG