From 7637bc441f74d9817852cfe242d84743bfaaebf0 Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 27 Jan 2016 22:27:51 +0200 Subject: [PATCH] Selecting stairs based on WorldRect in editor, disable input if window not active, disable traveling if no locations are selected --- Subsurface/Source/Camera.cs | 2 +- Subsurface/Source/CoroutineManager.cs | 20 ++--- Subsurface/Source/DebugConsole.cs | 2 +- Subsurface/Source/GUI/GUI.cs | 2 +- Subsurface/Source/GUI/GUIButton.cs | 2 +- Subsurface/Source/GUI/GUITextBox.cs | 4 +- Subsurface/Source/GUI/GUITickBox.cs | 2 +- Subsurface/Source/Items/CharacterInventory.cs | 6 +- .../Items/Components/Holdable/RepairTool.cs | 2 +- .../Source/Items/Components/Signal/Wire.cs | 2 +- Subsurface/Source/Items/Inventory.cs | 10 +-- Subsurface/Source/Items/ItemPrefab.cs | 5 +- Subsurface/Source/Map/MapEntity.cs | 16 ++-- Subsurface/Source/Map/MapEntityPrefab.cs | 6 +- Subsurface/Source/Map/Structure.cs | 6 +- Subsurface/Source/Map/StructurePrefab.cs | 6 +- Subsurface/Source/Map/Submarine.cs | 2 +- Subsurface/Source/PlayerInput.cs | 73 +++++++++++------- Subsurface/Source/Screens/GameScreen.cs | 2 +- Subsurface/Source/Screens/LobbyScreen.cs | 2 + Subsurface_Solution.v12.suo | Bin 928768 -> 928768 bytes 21 files changed, 95 insertions(+), 77 deletions(-) diff --git a/Subsurface/Source/Camera.cs b/Subsurface/Source/Camera.cs index 5739ab2c5..cd23b9fb0 100644 --- a/Subsurface/Source/Camera.cs +++ b/Subsurface/Source/Camera.cs @@ -183,7 +183,7 @@ namespace Barotrauma } else { - Vector2 mousePos = new Vector2(PlayerInput.GetMouseState.X, PlayerInput.GetMouseState.Y); + Vector2 mousePos = PlayerInput.MousePosition; Vector2 offset = mousePos - new Vector2(resolution.X / 2.0f, resolution.Y / 2.0f); diff --git a/Subsurface/Source/CoroutineManager.cs b/Subsurface/Source/CoroutineManager.cs index fbc50a3bd..2fb853b17 100644 --- a/Subsurface/Source/CoroutineManager.cs +++ b/Subsurface/Source/CoroutineManager.cs @@ -70,18 +70,18 @@ namespace Barotrauma } } - //try - //{ + try + { Coroutines[i].MoveNext(); -// } + } -// catch (Exception e) -// { -//#if DEBUG -// DebugConsole.ThrowError("Coroutine " + Coroutines[i] + " threw an exception: " + e.Message); -//#endif -// Coroutines.RemoveAt(i); -// } + catch (Exception e) + { +#if DEBUG + DebugConsole.ThrowError("Coroutine " + Coroutines[i] + " threw an exception: " + e.Message); +#endif + Coroutines.RemoveAt(i); + } } } diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index 3c2372f97..0f305bae9 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -99,7 +99,7 @@ namespace Barotrauma //textBox.Update(deltaTime); - if (PlayerInput.GetKeyboardState.IsKeyDown(Keys.Enter) && textBox.Text != "") + if (PlayerInput.KeyDown(Keys.Enter) && textBox.Text != "") { NewMessage(textBox.Text, Color.White); ExecuteCommand(textBox.Text, game); diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 8625a1bb9..d63eda23f 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -300,7 +300,7 @@ namespace Barotrauma if (rect.Contains(PlayerInput.MousePosition)) { - clicked = (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed); + clicked = PlayerInput.LeftButtonDown(); color = clicked ? new Color(100, 100, 100) : new Color(250, 250, 250); diff --git a/Subsurface/Source/GUI/GUIButton.cs b/Subsurface/Source/GUI/GUIButton.cs index e75436c11..468aa6f91 100644 --- a/Subsurface/Source/GUI/GUIButton.cs +++ b/Subsurface/Source/GUI/GUIButton.cs @@ -152,7 +152,7 @@ namespace Barotrauma if (rect.Contains(PlayerInput.MousePosition) && CanBeSelected && Enabled && (MouseOn == null || MouseOn == this || IsParentOf(MouseOn))) { state = ComponentState.Hover; - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) + if (PlayerInput.LeftButtonDown()) { if (OnPressed != null) { diff --git a/Subsurface/Source/GUI/GUITextBox.cs b/Subsurface/Source/GUI/GUITextBox.cs index ade97466e..897f680e4 100644 --- a/Subsurface/Source/GUI/GUITextBox.cs +++ b/Subsurface/Source/GUI/GUITextBox.cs @@ -152,7 +152,7 @@ namespace Barotrauma if (style != null) style.Apply(textBlock, this); textBlock.Padding = new Vector4(3.0f, 0.0f, 3.0f, 0.0f); - previousMouse = PlayerInput.GetMouseState; + //previousMouse = PlayerInput.GetMouseState; CaretEnabled = true; //SetTextPos(); @@ -171,7 +171,7 @@ namespace Barotrauma if (keyboardDispatcher.Subscriber == this) keyboardDispatcher.Subscriber = null; } - MouseState previousMouse; + //MouseState previousMouse; public override void Update(float deltaTime) { if (!Visible) return; diff --git a/Subsurface/Source/GUI/GUITickBox.cs b/Subsurface/Source/GUI/GUITickBox.cs index 3c4953291..f6097edfa 100644 --- a/Subsurface/Source/GUI/GUITickBox.cs +++ b/Subsurface/Source/GUI/GUITickBox.cs @@ -61,7 +61,7 @@ namespace Barotrauma box.State = ComponentState.Hover; - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) + if (PlayerInput.LeftButtonDown()) { box.State = ComponentState.Selected; } diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index 28ed5c998..e248da4e5 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -326,10 +326,10 @@ namespace Barotrauma if (draggingItem != null && !draggingItemSlot.Contains(PlayerInput.MousePosition)) { - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) + if (PlayerInput.LeftButtonDown()) { - slotRect.X = PlayerInput.GetMouseState.X - slotRect.Width / 2; - slotRect.Y = PlayerInput.GetMouseState.Y - slotRect.Height / 2; + slotRect.X = (int)PlayerInput.MousePosition.X - slotRect.Width / 2; + slotRect.Y = (int)PlayerInput.MousePosition.Y - slotRect.Height / 2; DrawSlot(spriteBatch, slotRect, draggingItem, false, false); } diff --git a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs index 09873d8b0..f40c34d5a 100644 --- a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs +++ b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs @@ -136,7 +136,7 @@ namespace Barotrauma.Items.Components ignoredBodies.Add(limb.body.FarseerBody); } - Vector2 rayStart = item.WorldPosition + TransformedBarrelPos; + Vector2 rayStart = item.WorldPosition; Vector2 rayEnd = targetPosition; Body targetBody = Submarine.PickBody( diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index ec748568e..289b008b3 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -351,7 +351,7 @@ namespace Barotrauma.Items.Components if (selectedNodeIndex == null && draggingWire == null)// && !MapEntity.SelectedAny) { - if (PlayerInput.LeftButtonDown() && PlayerInput.GetOldMouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Released) + if (PlayerInput.LeftButtonClicked()) { MapEntity.DisableSelect = true; MapEntity.SelectEntity(item); diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 94021653e..2393997e4 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -205,10 +205,10 @@ namespace Barotrauma if (draggingItem != null && !draggingItemSlot.Contains(PlayerInput.MousePosition) && draggingItem.Container == this.Owner) { - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) + if (PlayerInput.LeftButtonDown()) { - slotRect.X = PlayerInput.GetMouseState.X - slotRect.Width / 2; - slotRect.Y = PlayerInput.GetMouseState.Y - slotRect.Height / 2; + slotRect.X = (int)PlayerInput.MousePosition.X - slotRect.Width / 2; + slotRect.Y = (int)PlayerInput.MousePosition.Y - slotRect.Height / 2; //GUI.DrawRectangle(spriteBatch, rect, Color.White, true); //draggingItem.sprite.Draw(spriteBatch, new Vector2(rect.X + rect.Width / 2, rect.Y + rect.Height / 2), Color.White); @@ -261,12 +261,12 @@ namespace Barotrauma { if (draggingItem == null) { - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) + if (PlayerInput.LeftButtonDown()) { draggingItem = item; } } - else if (PlayerInput.GetMouseState.LeftButton == ButtonState.Released) + else if (PlayerInput.LeftButtonReleased()) { if (PlayerInput.DoubleClicked()) { diff --git a/Subsurface/Source/Items/ItemPrefab.cs b/Subsurface/Source/Items/ItemPrefab.cs index 35cb39684..32ec8048f 100644 --- a/Subsurface/Source/Items/ItemPrefab.cs +++ b/Subsurface/Source/Items/ItemPrefab.cs @@ -114,8 +114,7 @@ namespace Barotrauma if (placePosition == Vector2.Zero) { - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) - placePosition = position; + if (PlayerInput.LeftButtonDown()) placePosition = position; } else { @@ -124,7 +123,7 @@ namespace Barotrauma if (resizeVertical) placeSize.Y = Math.Max(placePosition.Y - position.Y, size.Y); - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Released) + if (PlayerInput.LeftButtonReleased()) { var item = new Item(new Rectangle((int)placePosition.X, (int)placePosition.Y, (int)placeSize.X, (int)placeSize.Y), this, Submarine.Loaded); placePosition = Vector2.Zero; diff --git a/Subsurface/Source/Map/MapEntity.cs b/Subsurface/Source/Map/MapEntity.cs index d3a542d81..c29f15baf 100644 --- a/Subsurface/Source/Map/MapEntity.cs +++ b/Subsurface/Source/Map/MapEntity.cs @@ -253,7 +253,7 @@ namespace Barotrauma return; } - if (PlayerInput.GetKeyboardState.IsKeyDown(Keys.Delete)) + if (PlayerInput.KeyDown(Keys.Delete)) { foreach (MapEntity e in selectedList) e.Remove(); selectedList.Clear(); @@ -283,7 +283,7 @@ namespace Barotrauma //started moving selected entities if (startMovingPos != Vector2.Zero) { - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Released) + if (PlayerInput.LeftButtonReleased()) { //mouse released -> move the entities to the new position of the mouse @@ -320,10 +320,10 @@ namespace Barotrauma e.isHighlighted = true; } - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Released) + if (PlayerInput.LeftButtonReleased()) { - if (PlayerInput.GetKeyboardState.IsKeyDown(Keys.LeftControl) || - PlayerInput.GetKeyboardState.IsKeyDown(Keys.RightControl)) + if (PlayerInput.KeyDown(Keys.LeftControl) || + PlayerInput.KeyDown(Keys.RightControl)) { foreach (MapEntity e in newSelection) { @@ -353,8 +353,8 @@ namespace Barotrauma else { - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed && - PlayerInput.GetKeyboardState.IsKeyUp(Keys.Space)) + if (PlayerInput.LeftButtonDown() && + PlayerInput.KeyUp(Keys.Space)) { //if clicking a selected entity, start moving it foreach (MapEntity e in selectedList) @@ -377,7 +377,7 @@ namespace Barotrauma { if (GUIComponent.MouseOn != null) return; - Vector2 position = new Vector2(PlayerInput.GetMouseState.X, PlayerInput.GetMouseState.Y); + Vector2 position = PlayerInput.MousePosition; position = cam.ScreenToWorld(position); if (startMovingPos != Vector2.Zero) diff --git a/Subsurface/Source/Map/MapEntityPrefab.cs b/Subsurface/Source/Map/MapEntityPrefab.cs index c026f2eda..150942020 100644 --- a/Subsurface/Source/Map/MapEntityPrefab.cs +++ b/Subsurface/Source/Map/MapEntityPrefab.cs @@ -134,7 +134,7 @@ namespace Barotrauma GUI.DrawLine(spriteBatch, new Vector2(position.X, -(position.Y - GameMain.GraphicsHeight)), new Vector2(position.X, -(position.Y + GameMain.GraphicsHeight)), Color.White); - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) placePosition = position; + if (PlayerInput.LeftButtonDown()) placePosition = position; } else { @@ -152,7 +152,7 @@ namespace Barotrauma newRect.Location -= Submarine.Loaded.Position.ToPoint(); } - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Released) + if (PlayerInput.LeftButtonReleased()) { object[] lobject = new object[] { this, newRect }; constructor.Invoke(lobject); @@ -164,7 +164,7 @@ namespace Barotrauma GUI.DrawRectangle(spriteBatch, newRect, Color.DarkBlue); } - if (PlayerInput.GetMouseState.RightButton == ButtonState.Pressed) + if (PlayerInput.RightButtonDown()) { placePosition = Vector2.Zero; selected = null; diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index ece4518c4..66b18e72e 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -283,11 +283,11 @@ namespace Barotrauma if (StairDirection == Direction.Left) { - return MathUtils.LineToPointDistance(new Vector2(rect.X, rect.Y), new Vector2(rect.Right, rect.Y - rect.Height), position)< 40.0f; + return MathUtils.LineToPointDistance(new Vector2(WorldRect.X, WorldRect.Y), new Vector2(WorldRect.Right, WorldRect.Y - WorldRect.Height), position) < 40.0f; } else - { - return MathUtils.LineToPointDistance(new Vector2(rect.X,rect.Y-rect.Height), new Vector2(rect.Right, rect.Y), position) <40.0f; + { + return MathUtils.LineToPointDistance(new Vector2(WorldRect.X, WorldRect.Y - rect.Height), new Vector2(WorldRect.Right, WorldRect.Y), position) < 40.0f; } } } diff --git a/Subsurface/Source/Map/StructurePrefab.cs b/Subsurface/Source/Map/StructurePrefab.cs index 2b2df7539..f19cc52ed 100644 --- a/Subsurface/Source/Map/StructurePrefab.cs +++ b/Subsurface/Source/Map/StructurePrefab.cs @@ -124,7 +124,7 @@ namespace Barotrauma if (placePosition == Vector2.Zero) { - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) + if (PlayerInput.LeftButtonDown()) placePosition = Submarine.MouseToWorldGrid(cam); newRect.X = (int)position.X; @@ -140,7 +140,7 @@ namespace Barotrauma newRect = Submarine.AbsRect(placePosition, placeSize); - if (PlayerInput.GetMouseState.LeftButton == ButtonState.Released) + if (PlayerInput.LeftButtonReleased()) { if (Submarine.Loaded != null) { @@ -161,7 +161,7 @@ namespace Barotrauma GUI.DrawRectangle(spriteBatch, new Rectangle(newRect.X - GameMain.GraphicsWidth, -newRect.Y, newRect.Width + GameMain.GraphicsWidth*2, newRect.Height), Color.White); GUI.DrawRectangle(spriteBatch, new Rectangle(newRect.X, -newRect.Y - GameMain.GraphicsHeight, newRect.Width, newRect.Height + GameMain.GraphicsHeight*2), Color.White); - if (PlayerInput.GetMouseState.RightButton == ButtonState.Pressed) selected = null; + if (PlayerInput.RightButtonDown()) selected = null; } } } diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index f32694aa3..b02b4c92d 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -258,7 +258,7 @@ namespace Barotrauma public static Vector2 MouseToWorldGrid(Camera cam) { - Vector2 position = new Vector2(PlayerInput.GetMouseState.X, PlayerInput.GetMouseState.Y); + Vector2 position = PlayerInput.MousePosition; position = cam.ScreenToWorld(position); return VectorToWorldGrid(position); diff --git a/Subsurface/Source/PlayerInput.cs b/Subsurface/Source/PlayerInput.cs index 12dedae1e..a93f6e742 100644 --- a/Subsurface/Source/PlayerInput.cs +++ b/Subsurface/Source/PlayerInput.cs @@ -214,14 +214,14 @@ namespace Barotrauma get { return new Vector2(mouseState.Position.X, mouseState.Position.Y); } } - public static MouseState GetMouseState - { - get { return mouseState; } - } - public static MouseState GetOldMouseState - { - get { return oldMouseState; } - } + //public static MouseState GetMouseState + //{ + // get { return mouseState; } + //} + //public static MouseState GetOldMouseState + //{ + // get { return oldMouseState; } + //} public static bool MouseInsideWindow { @@ -231,74 +231,91 @@ namespace Barotrauma public static Vector2 MouseSpeed { get - { - return MousePosition - new Vector2(oldMouseState.X, oldMouseState.Y); + { + return GameMain.Instance.IsActive ? MousePosition - new Vector2(oldMouseState.X, oldMouseState.Y) : Vector2.Zero; } } - public static KeyboardState GetKeyboardState - { - get { return keyboardState; } - } + public static KeyboardState GetKeyboardState + { + get { return keyboardState; } + } - public static KeyboardState GetOldKeyboardState - { - get { return oldKeyboardState; } - } + public static KeyboardState GetOldKeyboardState + { + get { return oldKeyboardState; } + } public static int ScrollWheelSpeed { - get { return mouseState.ScrollWheelValue - oldMouseState.ScrollWheelValue; } + get { return GameMain.Instance.IsActive ? mouseState.ScrollWheelValue - oldMouseState.ScrollWheelValue : 0; } } public static bool LeftButtonDown() { - return mouseState.LeftButton == ButtonState.Pressed; + return GameMain.Instance.IsActive && mouseState.LeftButton == ButtonState.Pressed; + } + + public static bool LeftButtonReleased() + { + return GameMain.Instance.IsActive && mouseState.LeftButton == ButtonState.Released; } public static bool LeftButtonClicked() { - return (oldMouseState.LeftButton == ButtonState.Pressed + return (GameMain.Instance.IsActive && + oldMouseState.LeftButton == ButtonState.Pressed && mouseState.LeftButton == ButtonState.Released); } public static bool RightButtonDown() { - return mouseState.RightButton == ButtonState.Pressed; + return GameMain.Instance.IsActive && mouseState.RightButton == ButtonState.Pressed; } public static bool RightButtonClicked() { - return (oldMouseState.RightButton == ButtonState.Pressed + return (GameMain.Instance.IsActive && + oldMouseState.RightButton == ButtonState.Pressed && mouseState.RightButton == ButtonState.Released); } public static bool DoubleClicked() { - return doubleClicked; + return GameMain.Instance.IsActive && doubleClicked; } public static bool KeyHit(InputType inputType) { - return GameMain.Config.KeyBind(inputType).IsHit(); + return GameMain.Instance.IsActive && GameMain.Config.KeyBind(inputType).IsHit(); } public static bool KeyDown(InputType inputType) { - return GameMain.Config.KeyBind(inputType).IsDown(); + return GameMain.Instance.IsActive && GameMain.Config.KeyBind(inputType).IsDown(); + } + + public static bool KeyUp(InputType inputType) + { + return GameMain.Instance.IsActive && !GameMain.Config.KeyBind(inputType).IsDown(); } public static bool KeyHit(Keys button) { - return (oldKeyboardState.IsKeyDown(button) && keyboardState.IsKeyUp(button)); + return (GameMain.Instance.IsActive && oldKeyboardState.IsKeyDown(button) && keyboardState.IsKeyUp(button)); } public static bool KeyDown(Keys button) { - return (keyboardState.IsKeyDown(button)); + return (GameMain.Instance.IsActive && keyboardState.IsKeyDown(button)); } + public static bool KeyUp(Keys button) + { + return GameMain.Instance.IsActive && keyboardState.IsKeyUp(button); + } + public static void Update(double deltaTime) { timeSinceClick += deltaTime; diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 7168b4315..e64f19178 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -202,7 +202,7 @@ namespace Barotrauma GUI.Draw((float)deltaTime, spriteBatch, cam); - if (PlayerInput.GetMouseState.LeftButton != ButtonState.Pressed) Inventory.draggingItem = null; + if (!PlayerInput.LeftButtonDown()) Inventory.draggingItem = null; spriteBatch.End(); } diff --git a/Subsurface/Source/Screens/LobbyScreen.cs b/Subsurface/Source/Screens/LobbyScreen.cs index e67d8a119..0160487b4 100644 --- a/Subsurface/Source/Screens/LobbyScreen.cs +++ b/Subsurface/Source/Screens/LobbyScreen.cs @@ -525,6 +525,8 @@ namespace Barotrauma private bool StartShift(GUIButton button, object selection) { + if (GameMain.GameSession.Map.SelectedConnection == null) return false; + GameMain.ShowLoading(ShiftLoading()); //GameMain.GameSession.StartShift(selectedLevel, false); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 20e934c357ebea2f5edb079ca47dbfca35a20c74..ae415765edc9f100331162c7c367458c9b31d6f3 100644 GIT binary patch delta 4090 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 delta 4762 zcmeHKc~sR^9)EXvz+;gIvWb9?=TpEH(3BDd(i|`Zm&UZT!0{j`+9J6{<8v9!HSp>C znwkRIQ_BoN`8CN*m}!fQU}9<^hq1(R8pjG-IO?0veMm!1=hSKDocU*d=X}n0z2Cci zf8Tqr^?ZW$d_qxTB)`q%Z{cGrkfVaa!K9$2Cy)V5gxt(*r{oEF3!T`u=+pUE z%+{h`=~g~7*wx;xQ~QvP_SC68+Bt3Y@-69N+9Oo97(%5zohL;1MGs~S?_0F613Q6d zfL_o|1pN)58d6p|@5j#5`g9)52kFR>&dp|JxCVz4z$64(1zHT+hQ`kW#OP`|pA~ot z{5qf(_79Z}^b^V(%lop^co4g!A~yfIOeefy8WH? zdYgw%x0)7(vc8&S3~TJJvbFaw$<`(vJ(A7`wCCzDvzo|%mZR(}ZGMywV}*2jEbkuh zQ@Kbffjpd&7rBLMLvz{R1eqtxQrofP@pNOd%rLl8WM1d#QNa|sj=n56%%baed-_w& z9M1r)Xf7*4ZsxFNMwguKqqWfs*@uH{rZg;OgljPmU@^&BB`joFBrWoZ&LOpeRCa)A z=0ogioZN*?C1VSVZvVj&TbLzvE4DKY_!_7NF2hIV{i{Gea2RquU_?~4YOUa30}jI0 z0>l7HPkURKY06$m5S+u|y#{54xwp z?}QHrjf1T8RDFeo>8C;SI$cCCzMI)@Ki^xke2S9c7$UgibLL$YAEi;X~}J5>=30qB5jm<%V5^3GWZx@yRS%HLb1|JGq1J5w<9|1YQ1jx53vW|CUN9e9PKGb#M(BpMHAS50B0SfR_F)I;k zKX}?+$3yshMpbn@Lhpp;FkPtQQ7ng88GC?Y%bCA6^L75b@2?pA1`O!e4_*!P-v_VK z_vZ%hsO8+AE0)sIeIkR(AMx_{jTrb@&rg#c%&x9GRiX>3r<55Yh}`l-8!MxwnPQ1% zt>;!RHj7f$iZN84?`AqYTW)47mzL)6RNIJpla|-SDF)eNwv}Bod%S?f+zNbO2B}~^ ztM}LrRml(43)niFH3s?QDVn+({b8H~jKbP{|BEkCv-%90LTtc1pbtEzLOusx)$A0| zVCa5a0AO-`KUDyfp$P3d3V@PT0Z_COv>cd>m|Zamt%dnabBCa6g4(wKNliG5j{mDQ zA;Y4XO`@s2CRjul8b8Ucht|U(&5T$aPa^9cX>|-1oK0<)liwF}j2qr;%Qvj}y5Z)Q z=!@x5K4U3+Dht*c-WUB?Re~^kk~vHEmU&pMPMe=4GYw2F?cC0Ktu;$}v#L=-N|Lxk z=#__)!YkOY|6fyF*A#Y(E>yB8$70TD*%7Z9+KhDZg3#DC(SzGcROP)FmA9%*Zee^6 zb6voTOD5X$8Gfi(*2Ktfks*qTTD|rOqHV|(RD=RJupo32c%(PrI_}NS$Sgcxgcx9sR zx6pUhYy1-yHp0+eLke*ndj?STWC^Gha2yc4YMe-6bo4yWpy$Sm2;W%uoalKyci(St zoGj0qonV z$L!H+^{nD5X?}Q}Z+KJ+t2hAll1=$4nHDj)zR_l36&U7vYic za}OGI|8E4!P`q={=3UV1z>C0GK%Fif&zx-7f9jd@7~1cEZyHAMH0XG)qq+*FU-B3f zr7(89deo-_(3Jq=y;rb#3-`ve~=B}<=4#J`ZCbUlt6apQ5F zjL8#yYS?08(`AO1xkeuJb###&#q8+o>|VNl-lGde?9qE`)3(b!dQCnntC_p=*_c27 z(HYfV&>B}u3!T0w18MB5+@MA5mX{ctPAnHUvdj&9lksKarsdsjU7I&wJ$~OiYv)dE zZ|3nF|JJcra(jcC)SIFwqhr-9o}M};UbdN1QQ`LEZ?aEDa7zZ>PX*YAPV1Q=Gi}Fs z9JPWm=pKhry&pO`WU6CY-M^mftoJTJE!>8cRiC3A8`6Ntxt=t?LH?!vSRVk(_i^|z zn9j-!kABdGbhdbZhiZ#puFp1peGoNI(#ut$)e3sR4R8lM00ZC&cmdv8XthtvWB&x` COpdDn