From 8b3adf6085949437f4ac21d0fde0dd19f894d51c Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Mon, 6 Nov 2023 07:02:02 +0300 Subject: [PATCH] Anomaly Synchronizer (#20945) * added textures and basic prototype without functionality * add full functional * finish work * fix naming * reduce random anomaly spawner offset * Update AnomalySystem.Vessel.cs * Update SharedAnomalySystem.cs * Update SharedAnomalySystem.cs * Update production.yml * fix errors * fix? * Update anomaly_sync.yml * deltanedas code fixes. Thx, deltanedas! * git what * fix yml * fix yml 2 * meh, try again * work, work, work * fix powered checking. now component work also without ApcPowerReceiving * now supercrit port invoke on start growing, not after explosion fix errors * deltanedas fix pack 1 * Update AnomalySynchronizerComponent.cs --- .../Anomaly/AnomalySynchronizerSystem.cs | 148 ++++++++++++++++++ .../AnomalySynchronizerComponent.cs | 42 +++++ .../Anomaly/Components/AnomalyComponent.cs | 5 +- Content.Shared/Anomaly/SharedAnomalySystem.cs | 10 +- .../Audio/Machines/anomaly_sync_connect.ogg | Bin 0 -> 16588 bytes Resources/Audio/Machines/attributions.yml | 7 +- Resources/Locale/en-US/anomaly/anomaly.ftl | 3 + .../machine-linking/transmitter_ports.ftl | 15 ++ .../Locale/en-US/research/technologies.ftl | 2 +- .../Prototypes/DeviceLinking/source_ports.yml | 25 +++ .../Markers/Spawners/Random/anomaly.yml | 1 + .../Circuitboards/Machine/production.yml | 16 ++ .../Structures/Machines/anomaly_sync.yml | 75 +++++++++ .../Entities/Structures/Machines/lathe.yml | 1 + .../Prototypes/Recipes/Lathes/electronics.yml | 10 ++ .../Prototypes/Research/experimental.yml | 7 +- .../Machines/anomaly_sync.rsi/base.png | Bin 0 -> 923 bytes .../Machines/anomaly_sync.rsi/energy.png | Bin 0 -> 486 bytes .../Machines/anomaly_sync.rsi/meta.json | 38 +++++ .../Machines/anomaly_sync.rsi/pulse.png | Bin 0 -> 324 bytes 20 files changed, 393 insertions(+), 12 deletions(-) create mode 100644 Content.Server/Anomaly/AnomalySynchronizerSystem.cs create mode 100644 Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs create mode 100644 Resources/Audio/Machines/anomaly_sync_connect.ogg create mode 100644 Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml create mode 100644 Resources/Textures/Structures/Machines/anomaly_sync.rsi/base.png create mode 100644 Resources/Textures/Structures/Machines/anomaly_sync.rsi/energy.png create mode 100644 Resources/Textures/Structures/Machines/anomaly_sync.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/anomaly_sync.rsi/pulse.png diff --git a/Content.Server/Anomaly/AnomalySynchronizerSystem.cs b/Content.Server/Anomaly/AnomalySynchronizerSystem.cs new file mode 100644 index 0000000000..6e881aa3d1 --- /dev/null +++ b/Content.Server/Anomaly/AnomalySynchronizerSystem.cs @@ -0,0 +1,148 @@ +using Content.Server.Anomaly.Components; +using Content.Server.DeviceLinking.Systems; +using Content.Server.Power.Components; +using Content.Server.Power.EntitySystems; +using Content.Shared.Anomaly.Components; +using Content.Shared.Interaction; +using Content.Shared.Popups; + +namespace Content.Server.Anomaly; + +/// +/// a device that allows you to translate anomaly activity into multitool signals. +/// +public sealed partial class AnomalySynchronizerSystem : EntitySystem +{ + [Dependency] private readonly AnomalySystem _anomaly = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly EntityLookupSystem _entityLookup = default!; + [Dependency] private readonly DeviceLinkSystem _signal = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly PowerReceiverSystem _power = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteractHand); + SubscribeLocalEvent(OnPowerChanged); + + SubscribeLocalEvent(OnAnomalyPulse); + SubscribeLocalEvent(OnAnomalySeverityChanged); + SubscribeLocalEvent(OnAnomalyStabilityChanged); + } + + private void OnPowerChanged(EntityUid uid, AnomalySynchronizerComponent component, ref PowerChangedEvent args) + { + if (args.Powered) + return; + + if (!TryComp(component.ConnectedAnomaly, out var anomaly)) + return; + + _anomaly.DoAnomalyPulse(component.ConnectedAnomaly.Value, anomaly); + DisconneсtFromAnomaly(uid, component, anomaly); + } + + private void OnInteractHand(EntityUid uid, AnomalySynchronizerComponent component, InteractHandEvent args) + { + if (!_power.IsPowered(uid)) + return; + + foreach (var entity in _entityLookup.GetEntitiesInRange(uid, 0.15f)) //is the radius of one tile. It must not be set higher, otherwise the anomaly can be moved from tile to tile + { + if (!TryComp(entity, out var anomaly)) + continue; + + + ConnectToAnomaly(uid, component, entity, anomaly); + break; + } + } + + private void ConnectToAnomaly(EntityUid uid, AnomalySynchronizerComponent component, EntityUid auid, AnomalyComponent anomaly) + { + if (component.ConnectedAnomaly == auid) + return; + + component.ConnectedAnomaly = auid; + //move the anomaly to the center of the synchronizer, for aesthetics. + var targetXform = _transform.GetWorldPosition(uid); + _transform.SetWorldPosition(auid, targetXform); + + _anomaly.DoAnomalyPulse(component.ConnectedAnomaly.Value, anomaly); + _popup.PopupEntity(Loc.GetString("anomaly-sync-connected"), uid, PopupType.Medium); + _audio.PlayPvs(component.ConnectedSound, uid); + } + + //TO DO: disconnection from the anomaly should also be triggered if the anomaly is far away from the synchronizer. + //Currently only bluespace anomaly can do this, but for some reason it is the only one that cannot be connected to the synchronizer. + private void DisconneсtFromAnomaly(EntityUid uid, AnomalySynchronizerComponent component, AnomalyComponent anomaly) + { + if (component.ConnectedAnomaly == null) + return; + + _anomaly.DoAnomalyPulse(component.ConnectedAnomaly.Value, anomaly); + _popup.PopupEntity(Loc.GetString("anomaly-sync-disconnected"), uid, PopupType.Large); + _audio.PlayPvs(component.ConnectedSound, uid); + + component.ConnectedAnomaly = default!; + } + + private void OnAnomalyPulse(ref AnomalyPulseEvent args) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var ent, out var component)) + { + if (args.Anomaly != component.ConnectedAnomaly) + continue; + if (!_power.IsPowered(ent)) + continue; + + _signal.InvokePort(ent, component.PulsePort); + } + } + + private void OnAnomalySeverityChanged(ref AnomalySeverityChangedEvent args) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var ent, out var component)) + { + if (args.Anomaly != component.ConnectedAnomaly) + continue; + if (!_power.IsPowered(ent)) + continue; + //The superscritical port is invoked not at the AnomalySupercriticalEvent, + //but at the moment the growth animation starts. Otherwise, there is no point in this port. + //ATTENTION! the console command supercriticalanomaly does not work here, + //as it forcefully causes growth to start without increasing severity. + if (args.Severity >= 1) + _signal.InvokePort(ent, component.SupercritPort); + } + } + private void OnAnomalyStabilityChanged(ref AnomalyStabilityChangedEvent args) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var ent, out var component)) + { + if (args.Anomaly != component.ConnectedAnomaly) + continue; + if (TryComp(ent, out var apcPower) && !apcPower.Powered) + continue; + + if (args.Stability < 0.25f) //I couldn't find where these values are stored, so I hardcoded them. Tell me where these variables are stored and I'll fix it + { + _signal.InvokePort(ent, component.DecayingPort); + } + else if (args.Stability > 0.5f) //I couldn't find where these values are stored, so I hardcoded them. Tell me where these variables are stored and I'll fix it + { + _signal.InvokePort(ent, component.GrowingPort); + } + else + { + _signal.InvokePort(ent, component.StabilizePort); + } + } + } +} diff --git a/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs b/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs new file mode 100644 index 0000000000..295ce885c2 --- /dev/null +++ b/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs @@ -0,0 +1,42 @@ +using Content.Shared.Anomaly; +using Content.Shared.Anomaly.Components; +using Content.Shared.DeviceLinking; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; + +namespace Content.Server.Anomaly.Components; + +/// +/// a device that allows you to translate anomaly activity into multitool signals. +/// +[RegisterComponent, Access(typeof(AnomalySynchronizerSystem))] +public sealed partial class AnomalySynchronizerComponent : Component +{ + /// + /// The uid of the anomaly to which the synchronizer is connected. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public EntityUid? ConnectedAnomaly; + + + [DataField] + public ProtoId DecayingPort = "Decaying"; + + [DataField] + public ProtoId StabilizePort = "Stabilize"; + + [DataField] + public ProtoId GrowingPort = "Growing"; + + [DataField] + public ProtoId PulsePort = "Pulse"; + + [DataField] + public ProtoId SupercritPort = "Supercritical"; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier ConnectedSound = new SoundPathSpecifier("/Audio/Machines/anomaly_sync_connect.ogg"); + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier DisconnectedSound = new SoundPathSpecifier("/Audio/Machines/anomaly_sync_connect.ogg"); +} diff --git a/Content.Shared/Anomaly/Components/AnomalyComponent.cs b/Content.Shared/Anomaly/Components/AnomalyComponent.cs index cf3ba75aaa..a6f4f6c086 100644 --- a/Content.Shared/Anomaly/Components/AnomalyComponent.cs +++ b/Content.Shared/Anomaly/Components/AnomalyComponent.cs @@ -243,16 +243,17 @@ public sealed partial class AnomalyComponent : Component /// /// Event raised at regular intervals on an anomaly to do whatever its effect is. /// +/// The anomaly pulsing /// /// [ByRefEvent] -public readonly record struct AnomalyPulseEvent(float Stability, float Severity); +public readonly record struct AnomalyPulseEvent(EntityUid Anomaly, float Stability, float Severity); /// /// Event raised on an anomaly when it reaches a supercritical point. /// [ByRefEvent] -public readonly record struct AnomalySupercriticalEvent; +public readonly record struct AnomalySupercriticalEvent(EntityUid Anomaly); /// /// Event broadcast after an anomaly goes supercritical diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index ca77544a15..48413ac001 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -109,9 +109,9 @@ public abstract class SharedAnomalySystem : EntitySystem var pulse = EnsureComp(uid); pulse.EndTime = Timing.CurTime + pulse.PulseDuration; Appearance.SetData(uid, AnomalyVisuals.IsPulsing, true); - - var ev = new AnomalyPulseEvent(component.Stability, component.Severity); - RaiseLocalEvent(uid, ref ev); + + var ev = new AnomalyPulseEvent(uid, component.Stability, component.Severity); + RaiseLocalEvent(uid, ref ev, true); } /// @@ -154,8 +154,8 @@ public abstract class SharedAnomalySystem : EntitySystem if (_net.IsServer) _sawmill.Info($"Raising supercritical event. Entity: {ToPrettyString(uid)}"); - var ev = new AnomalySupercriticalEvent(); - RaiseLocalEvent(uid, ref ev); + var ev = new AnomalySupercriticalEvent(uid); + RaiseLocalEvent(uid, ref ev, true); EndAnomaly(uid, component, true); } diff --git a/Resources/Audio/Machines/anomaly_sync_connect.ogg b/Resources/Audio/Machines/anomaly_sync_connect.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c718eaf45979569b2e425d073ebbb1f7361dd6e6 GIT binary patch literal 16588 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml index bbf4ea9ac0..3fa3aa06d7 100644 --- a/Resources/Audio/Machines/attributions.yml +++ b/Resources/Audio/Machines/attributions.yml @@ -46,4 +46,9 @@ - files: ["warning_buzzer.ogg"] license: "CC-BY-SA-3.0" copyright: "Taken from TG station." - source: "https://github.com/tgstation/tgstation/blob/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0/sound/machines/warning-buzzer.ogg" \ No newline at end of file + source: "https://github.com/tgstation/tgstation/blob/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0/sound/machines/warning-buzzer.ogg" + +- files: ["anomaly_sync_connect.ogg"] + license: "CC0-1.0" + copyright: Created by newagesoup, convert to ogg mono by TheShuEd" + source: "https://freesound.org/people/newagesoup/sounds/341172/" \ No newline at end of file diff --git a/Resources/Locale/en-US/anomaly/anomaly.ftl b/Resources/Locale/en-US/anomaly/anomaly.ftl index 29d5169694..83b992ce23 100644 --- a/Resources/Locale/en-US/anomaly/anomaly.ftl +++ b/Resources/Locale/en-US/anomaly/anomaly.ftl @@ -25,6 +25,9 @@ anomaly-scanner-particle-unstable = - [color=plum]Unstable type:[/color] {$type} anomaly-scanner-particle-containment = - [color=goldenrod]Containment type:[/color] {$type} anomaly-scanner-pulse-timer = Time until next pulse: [color=gray]{$time}[/color] +anomaly-sync-connected = Anomaly successfully attached +anomaly-sync-disconnected = The connection to the anomaly has been lost! + anomaly-generator-ui-title = Anomaly Generator anomaly-generator-fuel-display = Fuel: anomaly-generator-cooldown = Cooldown: [color=gray]{$time}[/color] diff --git a/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl b/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl index 154f20eee7..e5f92c5b00 100644 --- a/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl +++ b/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl @@ -45,3 +45,18 @@ signal-port-description-air-warning = This port is invoked with HIGH when in war signal-port-name-air-normal = Normal signal-port-description-air-normal = This port is invoked with HIGH when in normal mode and LOW when not. + +signal-port-name-decaying = Decaying +signal-port-description-decaying = This port is invoked when a bound anomaly starts to decay. + +signal-port-name-stabilize = Stabilize +signal-port-description-stabilize = This port is invoked when a bound anomaly is normalized. + +signal-port-name-growing = Growing +signal-port-description-growing = This port is invoked when a bound anomaly starts to grow. + +signal-port-name-pulse = Pulse +signal-port-description-pulse = This port is invoked when a bound anomaly is pulsing. + +signal-port-name-supercrit = Supercritical +signal-port-description-supercrit = This port is invoked when a bound anomaly explode after supercrit state. \ No newline at end of file diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index 28c7377082..0f8a657aa4 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -53,7 +53,7 @@ research-technology-advanced-parts = Advanced Parts research-technology-grappling = Grappling research-technology-abnormal-artifact-manipulation = Abnormal Artifact Manipulation research-technology-gravity-manipulation = Gravity Manipulation -research-technology-mobile-anomaly-tech = Mobile Anomaly Tech +research-technology-advanced-anomaly-research = Advanced Anomaly Research research-technology-rped = Rapid Part Exchange research-technology-super-parts = Super Parts diff --git a/Resources/Prototypes/DeviceLinking/source_ports.yml b/Resources/Prototypes/DeviceLinking/source_ports.yml index 73e96978a7..6e97c3c809 100644 --- a/Resources/Prototypes/DeviceLinking/source_ports.yml +++ b/Resources/Prototypes/DeviceLinking/source_ports.yml @@ -114,3 +114,28 @@ name: signal-port-name-air-normal description: signal-port-description-air-normal defaultLinks: [ DoorBolt ] + +- type: sourcePort + id: Decaying + name: signal-port-name-decaying + description: signal-port-description-decaying + +- type: sourcePort + id: Stabilize + name: signal-port-name-stabilize + description: signal-port-description-stabilize + +- type: sourcePort + id: Growing + name: signal-port-name-growing + description: signal-port-description-growing + +- type: sourcePort + id: Pulse + name: signal-port-name-pulse + description: signal-port-description-pulse + +- type: sourcePort + id: Supercritical + name: signal-port-name-supercrit + description: signal-port-description-supercrit \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml index 043bf707b4..3b5d33ee06 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml @@ -19,3 +19,4 @@ - AnomalyRock - AnomalyLiquid chance: 1 + offset: 0.15 # not to put it higher. The anomaly sychnronizer looks for anomalies within this radius, and if the radius is higher, the anomaly can be attracted from a neighboring tile. diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index a25e5b7069..2aed92bc28 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -233,6 +233,22 @@ Cable: 1 PlasmaGlass: 10 +- type: entity + parent: BaseMachineCircuitboard + id: AnomalySynchronizerCircuitboard + name: anomaly synchronizer machine board + description: A machine printed circuit board for an anomaly synchronizer. + components: + - type: Sprite + state: science + - type: MachineBoard + prototype: MachineAnomalySynchronizer + requirements: + Manipulator: 2 + Capacitor: 5 + materialRequirements: + PlasmaGlass: 25 + - type: entity parent: BaseMachineCircuitboard id: APECircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml new file mode 100644 index 0000000000..d37cc714e2 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml @@ -0,0 +1,75 @@ +- type: entity + id: MachineAnomalySynchronizer + parent: [ BaseMachinePowered, ConstructibleMachine ] + name: anomaly synchronizer + description: A sophisticated device that reads changes in anomalous waves, and converts them into energy signals. + components: + - type: AnomalySynchronizer + - type: Machine + board: AnomalySynchronizerCircuitboard + - type: DeviceNetwork + deviceNetId: Wireless + - type: WirelessNetworkConnection + range: 300 + - type: DeviceNetworkRequiresPower + - type: DeviceLinkSource + ports: + - Decaying + - Stabilize + - Growing + - Pulse + - Supercritical + - type: Sprite + noRot: true + sprite: Structures/Machines/anomaly_sync.rsi + layers: + - state: base + - state: energy + shader: unshaded + map: ["enum.PowerDeviceVisualLayers.Powered"] + - type: AmbientSound + enabled: false + sound: + path: /Audio/Machines/scan_loop.ogg + range: 5 + volume: -8 + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.35,-0.35,0.35,0.35" + density: 190 + mask: + - MachineMask + layer: + - Impassable + - MidImpassable + - LowImpassable + hard: False + - type: Transform + anchored: true + noRot: false + - type: ApcPowerReceiver + powerLoad: 15000 + needsPower: true + - type: UpgradePowerDraw + powerDrawMultiplier: 0.80 + scaling: Exponential + - type: ItemPlacer + whitelist: + components: + - Anomaly + - type: DeviceList + - type: PointLight + radius: 1.8 + energy: 1.6 + color: "#b53ca1" + - type: LitOnPowered + - type: Appearance + - type: GenericVisualizer + visuals: + enum.PowerDeviceVisuals.Powered: + enum.PowerDeviceVisualLayers.Powered: + True: { visible: true } + False: { visible: false } diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index fb77167b73..b82f3f6828 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -366,6 +366,7 @@ - AnalysisComputerCircuitboard - ExosuitFabricatorMachineCircuitboard - AnomalyVesselCircuitboard + - AnomalySynchronizerCircuitboard - APECircuitboard - ArtifactAnalyzerMachineCircuitboard - TraversalDistorterMachineCircuitboard diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml index bc54c78ca1..88b655644f 100644 --- a/Resources/Prototypes/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml @@ -248,6 +248,16 @@ Steel: 100 Glass: 900 +- type: latheRecipe + id: AnomalySynchronizerCircuitboard + result: AnomalySynchronizerCircuitboard + completetime: 4 + materials: + Steel: 500 + Glass: 700 + Gold: 200 + Silver: 100 + - type: latheRecipe id: APECircuitboard result: APECircuitboard diff --git a/Resources/Prototypes/Research/experimental.yml b/Resources/Prototypes/Research/experimental.yml index 02d66c06bf..363dee815e 100644 --- a/Resources/Prototypes/Research/experimental.yml +++ b/Resources/Prototypes/Research/experimental.yml @@ -99,16 +99,17 @@ - TraversalDistorterMachineCircuitboard - type: technology - id: MobileAnomalyTech - name: research-technology-mobile-anomaly-tech + id: AdvancedAnomalyResearch + name: research-technology-advanced-anomaly-research icon: - sprite: Objects/Weapons/Guns/Revolvers/chimp.rsi + sprite: Structures/Machines/anomaly_sync.rsi state: base discipline: Experimental tier: 2 cost: 10000 recipeUnlocks: - WeaponPistolCHIMP + - AnomalySynchronizerCircuitboard technologyPrerequisites: - BasicAnomalousResearch diff --git a/Resources/Textures/Structures/Machines/anomaly_sync.rsi/base.png b/Resources/Textures/Structures/Machines/anomaly_sync.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..e51f0e4a80808d8a8eb66203a197cb02661bc6aa GIT binary patch literal 923 zcmV;M17!S(P)Px&RY^oaR9J=Wmd{HYK@`Wo+O_y2=oU3Uv`|EaZhBFR1ae9aMKJvXT2u^ZPCcqe z(H?qId-K#5EK&5<9uh%%NKS$#)!-qEsF6amYf_7Q=uPPM5NFuk?5^3mN(=d1CYjlJ z@B3!nycwWMl`2)LRH=~g#EcxCn34Y_`?Xe#M<&Ms0A1aEvdur zax|m4#R=|l7oK>%_>HFd%>K5iea4FTbb6PL6$^Qs zo@8onA|3#-L06mj2nGgmm9p~6hXq4FG=;QV7M_@q=VqtS;b|)qe|nOsu|vF(y>xmP ziDU{Lo;J+QPMM|?1AykT&mWR^w&T=Lb4v@>H)2#g&u5_=x0@^5GRJwT&zCQr15hup zaz_{n|poelIVRUr##==)uR}FngKaaq+ z_9FB33jm<+=`+>1={=ytD0Q5!PF$QHRjyXUgSKAPe~$Bl&x zP@3P^P!B;o*Y#-z0|4>(C*8rly`8eY^^F*S())<~wiD&*Rs!?m>{$2q)$4C}_sHbD x*#v??(XE>hu<&%^slD!gPEBh3(yKUxOsIQ-(SDGpGwzWUm0Du+v>`; zdwO5$UF%IUU)cxE4AFVAG;m!l#Ns992D=)nG?^0iq`6_(Zfxg!#4}W%& zxgLD$%ld0xN&dek-~GJ*yLRk@gvSS$ObwnZFX0olvsSLI;h*TQt0{Zsq1HAq8|O}SACCt_)JcTN}d(- z`dnqjl(fh`^2_SWMUCdIm8(+bpI__dTEFQf}R*Y2cYx6T7uN7u)dHrYiw7qiE-P(Wr{h2#Q?^eCj@~;JlK`vm1`ecHb{3-EH TzNH;|x3>UV>HlIIa`(i=YoffM?=}aYwMlTLa?n{kp=7_cMHNJS9vgZ3br^9bD z#5WpD76R%AgF@5mX&JA7ZwTA7Z6E*Ht&zI-RtMK_dOT;k-*b1ZRo+p_!dt)AYOM0M znk(<^{I>1aYRi4*zn5S6K5g&5$TfQd>NnktU;Dmq<({eSOF5@(|CI3g&%9sE zVAHL?f4$cFPM~XEeaS0+29_;pm;Y{ldPjL(;;iB$rhA&!zTTI~ADcI&e@Eq~62E=U zuCuO5KDXM(>=tpjY P0||J#`njxgN@xNA=Z2DO literal 0 HcmV?d00001