From f49499b79bcea982497ad2717fc9a36db935e850 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Wed, 14 Jul 2021 14:53:17 -0500 Subject: [PATCH 01/12] Add JobType property --- src/Mod/Path/PathScripts/PathJob.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/Mod/Path/PathScripts/PathJob.py b/src/Mod/Path/PathScripts/PathJob.py index 63a452c0d4..6235f7a96f 100644 --- a/src/Mod/Path/PathScripts/PathJob.py +++ b/src/Mod/Path/PathScripts/PathJob.py @@ -181,6 +181,13 @@ class ObjectJob: ), ) + obj.addProperty( + "App::PropertyEnumeration", + "JobType", + "Base", + QtCore.QT_TRANSLATE_NOOP("PathJob", "Select the Type of Job"), + ) + obj.addProperty( "App::PropertyBool", "SplitOutput", @@ -208,6 +215,8 @@ class ObjectJob: obj.OrderOutputBy = ["Fixture", "Tool", "Operation"] obj.Fixtures = ["G54"] + obj.JobType = ["2D", "2.5D", "Lathe", "Multiaxis"] + obj.PostProcessorOutputFile = PathPreferences.defaultOutputFile() obj.PostProcessor = postProcessors = PathPreferences.allEnabledPostProcessors() defaultPostProcessor = PathPreferences.defaultPostProcessor() @@ -478,6 +487,15 @@ class ObjectJob: ) obj.SplitOutput = False + if not hasattr(obj, "JobType"): + obj.addProperty( + "App::PropertyEnumeration", + "JobType", + "Base", + QtCore.QT_TRANSLATE_NOOP("PathJob", "Select the Type of Job"), + ) + obj.JobType = ["2D", "2.5D", "Lathe", "Multiaxis"] + def onChanged(self, obj, prop): if prop == "PostProcessor" and obj.PostProcessor: processor = PostProcessor.load(obj.PostProcessor) From 4ae8f300f18dc283243e6a950adcb895ced8da31 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Sun, 7 Nov 2021 13:34:18 -0600 Subject: [PATCH 02/12] Drill Generator and testing --- src/Mod/Path/Generators/drill_generator.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Mod/Path/Generators/drill_generator.py b/src/Mod/Path/Generators/drill_generator.py index 74d8238305..84adf233a6 100644 --- a/src/Mod/Path/Generators/drill_generator.py +++ b/src/Mod/Path/Generators/drill_generator.py @@ -39,8 +39,6 @@ else: def generate(edge, dwelltime=0.0, peckdepth=0.0, repeat=1): - - startPoint = edge.Vertexes[0].Point endPoint = edge.Vertexes[1].Point From d42f8af3a0d22fcf5c8b866e71d375d3e255a008 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Mon, 8 Nov 2021 18:54:19 -0600 Subject: [PATCH 03/12] Refactor PathDrilling to user generator Uses the drill generator. centralizes feed rate assignment Tracks current machine position with MachineState --- src/Mod/Path/PathFeedRate.py | 95 ++++++++++ src/Mod/Path/PathMachineState.py | 105 +++++++++++ src/Mod/Path/PathScripts/PathDrilling.py | 227 ++++++++++++++++------- 3 files changed, 365 insertions(+), 62 deletions(-) create mode 100644 src/Mod/Path/PathFeedRate.py create mode 100644 src/Mod/Path/PathMachineState.py diff --git a/src/Mod/Path/PathFeedRate.py b/src/Mod/Path/PathFeedRate.py new file mode 100644 index 0000000000..64ee30f501 --- /dev/null +++ b/src/Mod/Path/PathFeedRate.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# *************************************************************************** +# * Copyright (c) 2021 sliptonic * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +import FreeCAD +import PathScripts.PathLog as PathLog +import PathMachineState +import PathScripts.PathGeom as PathGeom +import Part + +__title__ = "Feed Rate Helper Utility" +__author__ = "sliptonic (Brad Collette)" +__url__ = "https://www.freecadweb.org" +__doc__ = "Helper for adding Feed Rate to Path Commands" + +""" +TODO: This needs to be able to handle feedrates for axes other than X,Y,Z +""" + +if True: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) + + +def setFeedRate(commandlist, ToolController): + def _isVertical(currentposition, command): + x = ( + command.Parameters["X"] + if "X" in command.Parameters.keys() + else currentposition.x + ) + y = ( + command.Parameters["Y"] + if "Y" in command.Parameters.keys() + else currentposition.y + ) + z = ( + command.Parameters["Z"] + if "Z" in command.Parameters.keys() + else currentposition.z + ) + endpoint = FreeCAD.Vector(x, y, z) + if currentposition == endpoint: + return True + return PathGeom.isVertical(Part.makeLine(currentposition, endpoint)) + + feedcommands = ["G01", "G1", "G2", "G3", "G02", "G03", "G81", "G82", "G83"] + rapidcommands = ["G0", "G00"] + + machine = PathMachineState.MachineState() + + for command in commandlist: + if command.Name not in feedcommands + rapidcommands: + continue + + if _isVertical(machine.getPosition(), command): + rate = ( + ToolController.VertRapid.Value + if command in rapidcommands + else ToolController.VertFeed.Value + ) + else: + rate = ( + ToolController.HorizRapid.Value + if command in rapidcommands + else ToolController.HorizFeed.Value + ) + + params = command.Parameters + params["F"] = rate + command.Parameters = params + + machine.addCommand(command) + + return commandlist diff --git a/src/Mod/Path/PathMachineState.py b/src/Mod/Path/PathMachineState.py new file mode 100644 index 0000000000..f852c66ef9 --- /dev/null +++ b/src/Mod/Path/PathMachineState.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +# *************************************************************************** +# * Copyright (c) 2021 sliptonic shopinthewoods@gmail.com * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "Path Machine State" +__author__ = "sliptonic (Brad Collette)" +__url__ = "https://www.freecadweb.org" +__doc__ = "Dataclass to implement a machinestate tracker" +__contributors__ = "" + +import PathScripts.PathLog as PathLog +import FreeCAD +from dataclasses import dataclass, field + +if True: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) + + +@dataclass +class MachineState: + WCSLIST = [ + "G53", + "G54", + "G55", + "G56", + "G57", + "G58", + "G59", + "G59.1", + "G59.2", + "G59.3", + "G59.4", + "G59.5", + "G59.6", + "G59.7", + "G59.8", + "G59.9", + ] + + X: float = field(default=None) + Y: float = field(default=None) + Z: float = field(default=None) + A: float = field(default=None) + B: float = field(default=None) + C: float = field(default=None) + F: float = field(default=None) + Coolant: bool = field(default=False) + WCS: str = field(default="G54") + Spindle: str = field(default="off") + S: int = field(default=0) + T: str = field(default=None) + + def addCommand(self, command): + if command.Name == "M6": + self.T = command.Parameters["T"] + return + + if command.Name in ["M3", "M4"]: + self.S = command.Parameters["S"] + self.SpindApple = "CW" if command.Name == "M3" else "CCW" + return + + if command.Name in ["M2", "M5"]: + self.S = 0 + self.Spindle = "off" + return + + if command.Name in self.WCSLIST: + self.WCS = command.Name + return + + for p in command.Parameters: + self.__setattr__(p, command.Parameters[p]) + + def getPosition(self): + """ + Returns an App.Vector of the current location + """ + x = 0 if self.X is None else self.X + y = 0 if self.Y is None else self.Y + z = 0 if self.Z is None else self.Z + + return FreeCAD.Vector(x, y, z) + diff --git a/src/Mod/Path/PathScripts/PathDrilling.py b/src/Mod/Path/PathScripts/PathDrilling.py index fbcbce910a..f7b626cf48 100644 --- a/src/Mod/Path/PathScripts/PathDrilling.py +++ b/src/Mod/Path/PathScripts/PathDrilling.py @@ -23,15 +23,19 @@ from __future__ import print_function + +from Generators import drill_generator as generator +from PySide import QtCore import FreeCAD +import Part import Path +import PathFeedRate +import PathMachineState import PathScripts.PathCircularHoleBase as PathCircularHoleBase import PathScripts.PathLog as PathLog import PathScripts.PathOp as PathOp import PathScripts.PathUtils as PathUtils -from PySide import QtCore - __title__ = "Path Drilling Operation" __author__ = "sliptonic (Brad Collette)" __url__ = "https://www.freecadweb.org" @@ -39,8 +43,8 @@ __doc__ = "Path Drilling operation." __contributors__ = "IMBack!" -PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -# PathLog.trackModule(PathLog.thisModule()) +PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) +PathLog.trackModule(PathLog.thisModule()) # Qt translation handling @@ -49,104 +53,203 @@ def translate(context, text, disambig=None): class ObjectDrilling(PathCircularHoleBase.ObjectOp): - '''Proxy object for Drilling operation.''' + """Proxy object for Drilling operation.""" def circularHoleFeatures(self, obj): - '''circularHoleFeatures(obj) ... drilling works on anything, turn on all Base geometries and Locations.''' - return PathOp.FeatureBaseGeometry | PathOp.FeatureLocations | PathOp.FeatureCoolant + """circularHoleFeatures(obj) ... drilling works on anything, turn on all Base geometries and Locations.""" + return ( + PathOp.FeatureBaseGeometry | PathOp.FeatureLocations | PathOp.FeatureCoolant + ) def initCircularHoleOperation(self, obj): - '''initCircularHoleOperation(obj) ... add drilling specific properties to obj.''' - obj.addProperty("App::PropertyLength", "PeckDepth", "Drill", QtCore.QT_TRANSLATE_NOOP("App::Property", "Incremental Drill depth before retracting to clear chips")) - obj.addProperty("App::PropertyBool", "PeckEnabled", "Drill", QtCore.QT_TRANSLATE_NOOP("App::Property", "Enable pecking")) - obj.addProperty("App::PropertyFloat", "DwellTime", "Drill", QtCore.QT_TRANSLATE_NOOP("App::Property", "The time to dwell between peck cycles")) - obj.addProperty("App::PropertyBool", "DwellEnabled", "Drill", QtCore.QT_TRANSLATE_NOOP("App::Property", "Enable dwell")) - obj.addProperty("App::PropertyBool", "AddTipLength", "Drill", QtCore.QT_TRANSLATE_NOOP("App::Property", "Calculate the tip length and subtract from final depth")) - obj.addProperty("App::PropertyEnumeration", "ReturnLevel", "Drill", QtCore.QT_TRANSLATE_NOOP("App::Property", "Controls how tool retracts Default=G99")) - obj.addProperty("App::PropertyDistance", "RetractHeight", "Drill", QtCore.QT_TRANSLATE_NOOP("App::Property", "The height where feed starts and height during retract tool when path is finished while in a peck operation")) - obj.addProperty("App::PropertyEnumeration", "ExtraOffset", "Drill", QtCore.QT_TRANSLATE_NOOP("App::Property", "How far the drill depth is extended")) + """initCircularHoleOperation(obj) ... add drilling specific properties to obj.""" + obj.addProperty( + "App::PropertyLength", + "PeckDepth", + "Drill", + QtCore.QT_TRANSLATE_NOOP( + "App::Property", + "Incremental Drill depth before retracting to clear chips", + ), + ) + obj.addProperty( + "App::PropertyBool", + "PeckEnabled", + "Drill", + QtCore.QT_TRANSLATE_NOOP("App::Property", "Enable pecking"), + ) + obj.addProperty( + "App::PropertyFloat", + "DwellTime", + "Drill", + QtCore.QT_TRANSLATE_NOOP( + "App::Property", "The time to dwell between peck cycles" + ), + ) + obj.addProperty( + "App::PropertyBool", + "DwellEnabled", + "Drill", + QtCore.QT_TRANSLATE_NOOP("App::Property", "Enable dwell"), + ) + obj.addProperty( + "App::PropertyBool", + "AddTipLength", + "Drill", + QtCore.QT_TRANSLATE_NOOP( + "App::Property", + "Calculate the tip length and subtract from final depth", + ), + ) + obj.addProperty( + "App::PropertyEnumeration", + "ReturnLevel", + "Drill", + QtCore.QT_TRANSLATE_NOOP( + "App::Property", "Controls how tool retracts Default=G99" + ), + ) + obj.addProperty( + "App::PropertyDistance", + "RetractHeight", + "Drill", + QtCore.QT_TRANSLATE_NOOP( + "App::Property", + "The height where feed starts and height during retract tool when path is finished while in a peck operation", + ), + ) + obj.addProperty( + "App::PropertyEnumeration", + "ExtraOffset", + "Drill", + QtCore.QT_TRANSLATE_NOOP( + "App::Property", "How far the drill depth is extended" + ), + ) - obj.ReturnLevel = ['G99', 'G98'] # Canned Cycle Return Level - obj.ExtraOffset = ['None', 'Drill Tip', '2x Drill Tip'] # Canned Cycle Return Level + obj.ReturnLevel = ["G99", "G98"] # Canned Cycle Return Level + obj.ExtraOffset = [ + "None", + "Drill Tip", + "2x Drill Tip", + ] # Canned Cycle Return Level def circularHoleExecute(self, obj, holes): - '''circularHoleExecute(obj, holes) ... generate drill operation for each hole in holes.''' + """circularHoleExecute(obj, holes) ... generate drill operation for each hole in holes.""" PathLog.track() + machine = PathMachineState.MachineState() self.commandlist.append(Path.Command("(Begin Drilling)")) # rapid to clearance height - self.commandlist.append(Path.Command('G0', {'Z': obj.ClearanceHeight.Value, 'F': self.vertRapid})) + command = Path.Command( + "G0", {"Z": obj.ClearanceHeight.Value, "F": self.vertRapid} + ) + machine.addCommand(command) + self.commandlist.append(command) - tiplength = 0.0 - if obj.ExtraOffset == 'Drill Tip': - tiplength = PathUtils.drillTipLength(self.tool) - elif obj.ExtraOffset == '2x Drill Tip': - tiplength = PathUtils.drillTipLength(self.tool) * 2 + self.commandlist.append(Path.Command("G90")) # Absolute distance mode - holes = PathUtils.sort_jobs(holes, ['x', 'y']) - self.commandlist.append(Path.Command('G90')) + # Calculate offsets to add to target edge + endoffset = 0.0 + if obj.ExtraOffset == "Drill Tip": + endoffset = PathUtils.drillTipLength(self.tool) + elif obj.ExtraOffset == "2x Drill Tip": + endoffset = PathUtils.drillTipLength(self.tool) * 2 + + # http://linuxcnc.org/docs/html/gcode/g-code.html#gcode:g98-g99 self.commandlist.append(Path.Command(obj.ReturnLevel)) - cmd = "G81" - cmdParams = {} - cmdParams['Z'] = obj.FinalDepth.Value - tiplength - cmdParams['F'] = self.vertFeed - cmdParams['R'] = obj.RetractHeight.Value + holes = PathUtils.sort_jobs(holes, ["x", "y"]) - if obj.PeckEnabled and obj.PeckDepth.Value > 0: - cmd = "G83" - cmdParams['Q'] = obj.PeckDepth.Value - elif obj.DwellEnabled and obj.DwellTime > 0: - cmd = "G82" - cmdParams['P'] = obj.DwellTime + # This section is technical debt. The computation of the + # target shapes should be factored out for re-use. + # This will likely mean refactoring upstream CircularHoleBase to pass + # spotshapes instead of holes. - # parentJob = PathUtils.findParentJob(obj) - # startHeight = obj.StartDepth.Value + parentJob.SetupSheet.SafeHeightOffset.Value startHeight = obj.StartDepth.Value + self.job.SetupSheet.SafeHeightOffset.Value - for p in holes: - params = {} - params['X'] = p['x'] - params['Y'] = p['y'] + edgelist = [] + for hole in holes: + v1 = FreeCAD.Vector(hole["x"], hole["y"], obj.StartDepth.Value) + v2 = FreeCAD.Vector(hole["x"], hole["y"], obj.FinalDepth.Value - endoffset) + edgelist.append(Part.makeLine(v1, v2)) + + # iterate the edgelist and generate gcode + for edge in edgelist: + + PathLog.debug(edge) # move to hole location - self.commandlist.append(Path.Command('G0', {'X': p['x'], 'Y': p['y'], 'F': self.horizRapid})) - self.commandlist.append(Path.Command('G0', {'Z': startHeight, 'F': self.vertRapid})) - self.commandlist.append(Path.Command('G1', {'Z': obj.StartDepth.Value, 'F': self.vertFeed})) - # Update changes to parameters - params.update(cmdParams) + command = Path.Command( + "G0", {"X": hole["x"], "Y": hole["y"], "F": self.horizRapid} + ) + self.commandlist.append(command) + machine.addCommand(command) - # Perform canned drilling cycle - self.commandlist.append(Path.Command(cmd, params)) + command = Path.Command("G0", {"Z": startHeight, "F": self.vertRapid}) + self.commandlist.append(command) + machine.addCommand(command) - # Cancel canned drilling cycle - self.commandlist.append(Path.Command('G80')) - self.commandlist.append(Path.Command('G0', {'Z': obj.SafeHeight.Value})) + command = Path.Command( + "G1", {"Z": obj.StartDepth.Value, "F": self.vertFeed} + ) + self.commandlist.append(command) + machine.addCommand(command) + + # Technical Debt: We are assuming the edges are aligned. + # This assumption should be corrected and the necessary rotations + # performed to align the edge with the Z axis for drilling + + # Perform drilling + dwelltime = obj.DwellTime if obj.DwellEnabled else 0.0 + peckdepth = obj.PeckDepth.Value if obj.PeckEnabled else 0.0 + repeat = 1 # technical debt: Add a repeat property for user control + + try: + drillcommands = generator.generate(edge, dwelltime, peckdepth, repeat) + + except ValueError as e: # any targets that fail the generator are ignored + PathLog.info(e) + continue + + self.commandlist.extend(drillcommands) + + # Cancel canned drilling cycle + self.commandlist.append(Path.Command("G80")) + command = Path.Command("G0", {"Z": obj.SafeHeight.Value}) + self.commandlist.append(command) + machine.addCommand(command) + + # Apply feedrates to commands + PathFeedRate.setFeedRate(self.commandlist, obj.ToolController) def opSetDefaultValues(self, obj, job): - '''opSetDefaultValues(obj, job) ... set default value for RetractHeight''' + """opSetDefaultValues(obj, job) ... set default value for RetractHeight""" obj.ExtraOffset = "None" - if hasattr(job.SetupSheet, 'RetractHeight'): + if hasattr(job.SetupSheet, "RetractHeight"): obj.RetractHeight = job.SetupSheet.RetractHeight - elif self.applyExpression(obj, 'RetractHeight', 'StartDepth+SetupSheet.SafeHeightOffset'): + elif self.applyExpression( + obj, "RetractHeight", "StartDepth+SetupSheet.SafeHeightOffset" + ): if not job: obj.RetractHeight = 10 else: obj.RetractHeight.Value = obj.StartDepth.Value + 1.0 - if hasattr(job.SetupSheet, 'PeckDepth'): + if hasattr(job.SetupSheet, "PeckDepth"): obj.PeckDepth = job.SetupSheet.PeckDepth - elif self.applyExpression(obj, 'PeckDepth', 'OpToolDiameter*0.75'): + elif self.applyExpression(obj, "PeckDepth", "OpToolDiameter*0.75"): obj.PeckDepth = 1 - if hasattr(job.SetupSheet, 'DwellTime'): + if hasattr(job.SetupSheet, "DwellTime"): obj.DwellTime = job.SetupSheet.DwellTime else: obj.DwellTime = 1 + def SetupProperties(): setup = [] setup.append("PeckDepth") @@ -161,7 +264,7 @@ def SetupProperties(): def Create(name, obj=None, parentJob=None): - '''Create(name) ... Creates and returns a Drilling operation.''' + """Create(name) ... Creates and returns a Drilling operation.""" if obj is None: obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", name) @@ -169,4 +272,4 @@ def Create(name, obj=None, parentJob=None): if obj.Proxy: obj.Proxy.findAllHoles(obj) - return obj \ No newline at end of file + return obj From 69d2ce25018ef69dda599ea3acf88e6c7e1e3b18 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Thu, 2 Dec 2021 22:12:18 -0600 Subject: [PATCH 04/12] Helpers and tests Drillable lib and Tests --- src/Mod/Path/CMakeLists.txt | 5 + src/Mod/Path/PathFeedRate.py | 6 +- src/Mod/Path/PathMachineState.py | 55 ++-- src/Mod/Path/PathScripts/drillableLib.py | 235 +++++++++++++++ src/Mod/Path/PathTests/Drilling_1.FCStd | Bin 0 -> 238841 bytes src/Mod/Path/PathTests/TestPathDrillable.py | 310 ++++++++++++++++++++ src/Mod/Path/PathTests/TestPathHelpers.py | 103 +++++++ src/Mod/Path/TestPathApp.py | 8 +- 8 files changed, 696 insertions(+), 26 deletions(-) create mode 100644 src/Mod/Path/PathScripts/drillableLib.py create mode 100644 src/Mod/Path/PathTests/Drilling_1.FCStd create mode 100644 src/Mod/Path/PathTests/TestPathDrillable.py create mode 100644 src/Mod/Path/PathTests/TestPathHelpers.py diff --git a/src/Mod/Path/CMakeLists.txt b/src/Mod/Path/CMakeLists.txt index c82bb15bcc..728e8fe0ea 100644 --- a/src/Mod/Path/CMakeLists.txt +++ b/src/Mod/Path/CMakeLists.txt @@ -10,6 +10,8 @@ set(Path_Scripts Init.py PathCommands.py TestPathApp.py + PathMachineState.py + PathFeedRate.py ) if(BUILD_GUI) @@ -144,6 +146,7 @@ SET(PathScripts_SRCS SET(Generator_SRCS Generators/drill_generator.py + Generators/rotation_generator.py ) SET(PathScripts_post_SRCS @@ -221,8 +224,10 @@ SET(PathTests_SRCS PathTests/TestPathDressupDogbone.py PathTests/TestPathDressupHoldingTags.py PathTests/TestPathDrillGenerator.py + PathTests/TestPathRotationGenerator.py PathTests/TestPathGeom.py PathTests/TestPathHelix.py + PathTests/TestPathHelpers.py PathTests/TestPathLog.py PathTests/TestPathOpTools.py PathTests/TestPathPost.py diff --git a/src/Mod/Path/PathFeedRate.py b/src/Mod/Path/PathFeedRate.py index 64ee30f501..bd33265aab 100644 --- a/src/Mod/Path/PathFeedRate.py +++ b/src/Mod/Path/PathFeedRate.py @@ -73,16 +73,16 @@ def setFeedRate(commandlist, ToolController): if command.Name not in feedcommands + rapidcommands: continue - if _isVertical(machine.getPosition(), command): + if _isVertical(FreeCAD.Vector(machine.X, machine.Y, machine.Z), command): rate = ( ToolController.VertRapid.Value - if command in rapidcommands + if command.Name in rapidcommands else ToolController.VertFeed.Value ) else: rate = ( ToolController.HorizRapid.Value - if command in rapidcommands + if command.Name in rapidcommands else ToolController.HorizFeed.Value ) diff --git a/src/Mod/Path/PathMachineState.py b/src/Mod/Path/PathMachineState.py index f852c66ef9..e57ebb9476 100644 --- a/src/Mod/Path/PathMachineState.py +++ b/src/Mod/Path/PathMachineState.py @@ -58,48 +58,61 @@ class MachineState: "G59.9", ] - X: float = field(default=None) - Y: float = field(default=None) - Z: float = field(default=None) - A: float = field(default=None) - B: float = field(default=None) - C: float = field(default=None) + X: float = field(default=0) + Y: float = field(default=0) + Z: float = field(default=0) + A: float = field(default=0) + B: float = field(default=0) + C: float = field(default=0) F: float = field(default=None) Coolant: bool = field(default=False) WCS: str = field(default="G54") Spindle: str = field(default="off") S: int = field(default=0) - T: str = field(default=None) + T: int = field(default=None) def addCommand(self, command): + """Processes a command and updates the internal state of the machine. Returns true if the command has alterned the machine state""" + oldstate = self.getState() if command.Name == "M6": - self.T = command.Parameters["T"] - return + self.T = int(command.Parameters["T"]) + return not oldstate == self.getState() if command.Name in ["M3", "M4"]: self.S = command.Parameters["S"] - self.SpindApple = "CW" if command.Name == "M3" else "CCW" - return + self.Spindle = "CW" if command.Name == "M3" else "CCW" + return not oldstate == self.getState() if command.Name in ["M2", "M5"]: self.S = 0 self.Spindle = "off" - return + return not oldstate == self.getState() if command.Name in self.WCSLIST: self.WCS = command.Name - return + return not oldstate == self.getState() for p in command.Parameters: self.__setattr__(p, command.Parameters[p]) - def getPosition(self): - """ - Returns an App.Vector of the current location - """ - x = 0 if self.X is None else self.X - y = 0 if self.Y is None else self.Y - z = 0 if self.Z is None else self.Z + return not oldstate == self.getState() - return FreeCAD.Vector(x, y, z) + def getState(self): + """ + Returns a dictionary of the current machine state + """ + state = {} + state['X'] = self.X + state['Y'] = self.Y + state['Z'] = self.Z + state['A'] = self.A + state['B'] = self.B + state['C'] = self.C + state['F'] = self.F + state['Coolant'] = self.Coolant + state['WCS'] = self.WCS + state['Spindle'] = self.Spindle + state['S'] = self.S + state['T'] = self.T + return state diff --git a/src/Mod/Path/PathScripts/drillableLib.py b/src/Mod/Path/PathScripts/drillableLib.py new file mode 100644 index 0000000000..4e8dd59342 --- /dev/null +++ b/src/Mod/Path/PathScripts/drillableLib.py @@ -0,0 +1,235 @@ +import PathScripts.PathLog as PathLog +import FreeCAD as App +import Part +import numpy +import math + +if False: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) + +def isDrillableCylinder(obj, candidate, tooldiameter=None, vector=App.Vector(0, 0, 1)): + """ + checks if a candidate cylindrical face is drillable + """ + + matchToolDiameter = tooldiameter is not None + matchVector = vector is not None + + PathLog.debug( + "\n match tool diameter {} \n match vector {}".format( + matchToolDiameter, matchVector + ) + ) + + def raisedFeature(obj, candidate): + # check if the cylindrical 'lids' are inside the base + # object. This eliminates extruded circles but allows + # actual holes. + + startLidCenter = App.Vector( + candidate.BoundBox.Center.x, + candidate.BoundBox.Center.y, + candidate.BoundBox.ZMax, + ) + + endLidCenter = App.Vector( + candidate.BoundBox.Center.x, + candidate.BoundBox.Center.y, + candidate.BoundBox.ZMin, + ) + + return obj.isInside(startLidCenter, 1e-6, False) or obj.isInside( + endLidCenter, 1e-6, False + ) + + def getSeam(candidate): + # Finds the vertical seam edge in a cylinder + + for e in candidate.Edges: + if isinstance(e.Curve, Part.Line): # found the seam + return e + + if not candidate.ShapeType == "Face": + raise TypeError("expected a Face") + + if not str(candidate.Surface) == "": + raise TypeError("expected a cylinder") + + if len(candidate.Edges) != 3: + raise TypeError("cylinder does not have 3 edges. Not supported yet") + + if raisedFeature(obj, candidate): + PathLog.debug("The cylindrical face is a raised feature") + return False + + if not matchToolDiameter and not matchVector: + return True + + elif matchToolDiameter and tooldiameter / 2 > candidate.Surface.Radius: + PathLog.debug("The tool is larger than the target") + return False + + elif matchVector and not (compareVecs(getSeam(candidate).Curve.Direction, vector)): + PathLog.debug("The feature is not aligned with the given vector") + return False + else: + return True + + +def isDrillableCircle(obj, candidate, tooldiameter=None, vector=App.Vector(0, 0, 1)): + """ + checks if a flat face or edge is drillable + """ + + matchToolDiameter = tooldiameter is not None + matchVector = vector is not None + PathLog.debug( + "\n match tool diameter {} \n match vector {}".format( + matchToolDiameter, matchVector + ) + ) + + if candidate.ShapeType == "Face": + if not type(candidate.Surface) == Part.Plane: + PathLog.debug("Drilling on non-planar faces not supported") + return False + + if ( + len(candidate.Edges) == 1 and type(candidate.Edges[0].Curve) == Part.Circle + ): # Regular circular face + edge = candidate.Edges[0] + elif ( + len(candidate.Edges) == 2 + and type(candidate.Edges[0].Curve) == Part.Circle + and type(candidate.Edges[1].Curve) == Part.Circle + ): # process a donut + e1 = candidate.Edges[0] + e2 = candidate.Edges[1] + edge = e1 if e1.Curve.Radius < e2.Curve.Radius else e2 + else: + PathLog.debug( + "expected a Face with one or two circular edges got a face with {} edges".format( + len(candidate.Edges) + ) + ) + return False + + else: # edge + edge = candidate + if not (isinstance(edge.Curve, Part.Circle) and edge.isClosed()): + PathLog.debug("expected a closed circular edge") + return False + + if not hasattr(edge.Curve, "Radius"): + PathLog.debug("The Feature edge has no radius - Ellipse.") + return False + + if not matchToolDiameter and not matchVector: + return True + + elif matchToolDiameter and tooldiameter / 2 > edge.Curve.Radius: + PathLog.debug("The tool is larger than the target") + return False + + elif matchVector and not (compareVecs(edge.Curve.Axis, vector)): + PathLog.debug("The feature is not aligned with the given vector") + return False + else: + return True + + +def isDrillable(obj, candidate, tooldiameter=None, vector=App.Vector(0, 0, 1)): + """ + Checks candidates to see if they can be drilled at the given vector. + Candidates can be either faces - circular or cylindrical or circular edges. + The tooldiameter can be optionally passed. if passed, the check will return + False for any holes smaller than the tooldiameter. + + vector defaults to (0,0,1) which aligns with the Z axis. By default will return False + for any candidate not drillable in this orientation. Pass 'None' to vector to test whether + the hole is drillable at any orientation. + + obj=Shape + candidate = Face or Edge + tooldiameter=float + vector=App.Vector or None + + """ + PathLog.debug( + "obj: {} candidate: {} tooldiameter {} vector {}".format( + obj, candidate, tooldiameter, vector + ) + ) + + if list == type(obj): + for shape in obj: + if isDrillable(shape, candidate, tooldiameter, vector): + return (True, shape) + return (False, None) + + if candidate.ShapeType not in ["Face", "Edge"]: + raise TypeError("expected a Face or Edge. Got a {}".format(candidate.ShapeType)) + + try: + if ( + candidate.ShapeType == "Face" + and str(candidate.Surface) == "" + ): + return isDrillableCylinder(obj, candidate, tooldiameter, vector) + else: + return isDrillableCircle(obj, candidate, tooldiameter, vector) + except TypeError as e: + PathLog.debug(e) + return False + # raise TypeError("{}".format(e)) + + +def compareVecs(vec1, vec2): + """ + compare the two vectors to see if they are aligned for drilling + alignment can indicate the vectors are the same or exactly opposite + """ + + angle = vec1.getAngle(vec2) + angle = 0 if math.isnan(angle) else math.degrees(angle) + PathLog.debug("vector angle: {}".format(angle)) + return numpy.isclose(angle, 0, rtol=1e-05, atol=1e-06) or numpy.isclose( + angle, 180, rtol=1e-05, atol=1e-06 + ) + + +def getDrillableTargets(obj, ToolDiameter=None, vector=App.Vector(0, 0, 1)): + """ + Returns a list of tuples for drillable subelements from the given object + [(obj,'Face1'),(obj,'Face3')] + + Finds cylindrical faces that are larger than the tool diameter (if provided) and + oriented with the vector. If vector is None, all drillables are returned + + """ + + shp = obj.Shape + + results = [] + for i in range(1, len(shp.Faces)): + fname = 'Face{}'.format(i) + PathLog.debug(fname) + candidate = obj.getSubObject(fname) + + if not str(candidate.Surface) == '': + continue + + try: + drillable = isDrillable(shp, candidate, tooldiameter=ToolDiameter, vector=vector) + PathLog.debug("fname: {} : drillable {}".format(fname, drillable)) + except Exception as e: + PathLog.debug(e) + continue + + if drillable: + results.append((obj,fname)) + + return results diff --git a/src/Mod/Path/PathTests/Drilling_1.FCStd b/src/Mod/Path/PathTests/Drilling_1.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..8ad87ac69a73e4085dc7ab3da7daafb09d47c303 GIT binary patch literal 238841 zcmY(pQ;=v)urAoPZQHhO+r8ViZQHhO+qUi9wl(`dXC~&}myB9jxhkJ3DnBSl1B0Ld z002M$w3vh_3udLRI8Xxs>~;VF!2HXK*crLlnAkegx!YJ@>smQ&iKTw$>JO}>ZPe%r zns*l@nn~Ro9aeIv(QIW+prexvGBu%0011+3>i3lavglob0RkmUTu`MnitwzPZ}s5q-4ZO|WiDikq71ceOJM+g4E*OXE z-v(jm7g}t>mzA}bv`_v0c+qyp_nsZK|C1A4TllVvvVDeso>}0>fV0IW{%aHW^O%?P z)+Z-sN4CVkAC&X;9fs&jXMauV6MYy4`qQgJGdnlJx#kdD!HG$GM4(5jpS|8`!8G))NXSVbmStgy!kQ2J_YS1|dqblZ2 zW~-MO|9q_=SujoRC`V)ZBXvJ=cnI*>BMT-fZUVpcBWTk&-c z_I7(!-sMbZt*bYn?MOW9D=#R^e$y5%6aPn*B}0zTMPFmB?3+_#^frH~R}N1VVp5;G zod6>q=t!lFpXqkHagO%rb+(DA1J-OR^>E|MQtttj?H$iilqru^JdN>bXeRRVlUDrs zd}vO19A+=Oo_)vks7rQijJ>SM;^S?qDJzUwdTFi`?g=;5l?C#+@SDzm6x}O$J^SGs zP+Yw2{HAz~`~?PFI@1N|KPFF9xsb`q@E(PN+ZCk26LqE=3mY=fl<*^UYIhs#n7w zO`u1ow@ApwtnvA6LXs;HYmJWH77xB{NyHERve0ov$EWBOq@*|uI z(PifwO`j~amDVTcvU70Q#x8!Wu%@WbRJtBqTiwpiJr;q(`CHYIrI1Lk7AS5Rn;jg~ zPZ}1&DO7DT_>ib)%j_pYL*Fka4|Nlbf($<`=fQjIId@xqz1E(Rec!$J$$pY@7Tly8 z!jb3Yp6FJ{>AVh8O-*BV9y~_f%0_#8q>c7&fZMEoo8;6jtJPS{DyvncD6|;flGCLOUYIaCx{pRzRjJZ&2`rTn`Pee0k zq@^u1SXqz=ysaSy!u&a)3Xg};kh?KGJF_4o7?CXQlON^rVxY&PBLyITX5w z?88|#cs$vDMBbzNqx>b*UHpO`$$;92ASU_=Ejk>jA8yn3KFH#jHlu*pbGY`$?!wUq zZ{l!Gh|{gTHQe&vsvtIbtyGI3dUkGUZ&96ml)g~+i%z3wvMZUCBtp03mh+u80shLl zCp5l2Wg;h2q=qS)raL)?}Bz;XfyQ;~uad9^3qU8pk(D0--?cE`9yC_R% z-eAl!?pUeZ_fqeq`hb;yh}-cK`7^R5OVp$20CCTFC6pWDrwH1xPYUiKG@u_=qY}Ne z<~P#s4j2L!J~d{Jx=P$V;*f%zygv7CamjYgU-WL7fRBDb-ePMtR*A5AJZkoy!s>0~ zK;ZR(!%YUrVRXI%IQu*ti<0_9in%}b4uzJF)2$L@bKZHBj+X32>!B*92aWO^H^Af# ztg=s)NDPB~_4tuY(snpzyng77L=s;A0TSWR{bPj~B25QeXXZ}+Fi@RGl5ZJ1<=j7V z!P)nPYcq97^Z!x_ z3MZ(R^;@Ol`eD5`IICJD|NV@vhv;SVE0i4HAv@QAw@TkiOBd$d^|wveg#s*~U_b%s zsN$uLN=F+dtU6>V>AF0qCq5d%)HQ0eZkX-vn@fl~kC`>UJAL(qyC*zd3QVnrc+0pk znKcqCddFpVKVm0zlB#i0(NNQb!F%Nr6*)2Nq$*CpFoX`cFE4reAr!gcdznbeW)leS!)WnQ2SHww3psHOsx(^kYI-OZW$JWL{ zNsYQ)v3!Eq>6-sEshc`QxGq=EFU(nnGP#>~%9z{9msF&e$%lK*cw5MxN;0)1ZB~o6 z?U@{Q@7GOB;s&vsk(((xOxwV9hhaSJl!+4!LE1T+m=GtI0)2!+X5s@7CZ?<7lsmHLWSJ=Y(n02!=)!Q?Gsd(L zHPKXtf)4LO1*JM`tXQvH{D98pERJBKhRIj?PXhRZI2D`*`jT3!C;xOAEhfa`q{Yc+ z1=rRP#4BC$&Cwh1MynJT`(8UYb&DEdek_-|&9yV$E?;Oloa~vF@A=rtU9o-=M*Q(3 z2^h&c4kLkX(-hT0lRf^hKaA`v?NVEYZF=uO-(Tb8QGe?-R+}Ar@6-2K!=opbf8{)o zhBZFBgxPoDTy7W#d^$NJ9Ikmnig@zI^osNPZ7M7x;{%>RcXj{otV6^ zU3poI+;|-_vAPoH;wTR~ssMzAjXR=r9r`oXMS3M4Z!%78BqW^?Wf!}F1!Z+`1qjEU zF&=TYniQ1lV@_9ECVen2csfR=5b)-8_ZVTvo{^0>Tii{?lgY{>jEUFh7=j`{tE&th z+B4bdZ%Jml^fT2*JK8AAsG#Q)PH`n3mHgW}yaY$N_LwTzlHKuZPf&E_>Pr42zGTi{i{P7pUA;kv3>=vgBoyMoCR1t}TIz+fMUOUiJIv zJf7=8bada|gJBd1vfKhyd?PAnIH1UyIL4Y$SsQ_XRkD{=F4TCXQMwB#x(oJc`^bve z#tJ1m2l98Hoi?9E(6~I9BT^x&_&1mK+p0LBj)sdlM#lnK;4GW!&39-^+LD6!GqJ+MW(nXzkMM%<{+;yP-ZN+A04TjB#n`SP+HS5V5(Rs-!3`GK;auTHSCoLX-YUJ z{A7y{%uhk$T0G?J7oD^Px!$zpv##UNeu(EsAvgrIATFn z%u~Qh0?p`yN!Lgqr$FjeHaW#g7A@7$sMM`{ z2bBQx_c72FsGHE{ey-3Iu&qj%=u4h~rLv8ZQ`9cO=je9)D{tl=8!f4w9=5j!!Q3=W zuGM>lW!-S+95A+N0a|I1 zty<7D6U6lKh?@twG5T`u>6{0i9HH>^@ET-_6nV0h`5(}1zT*M-Y)VQwhjN^SI^yw+ zvMUXl3PL^QN|h3L`zC?~H=LMMZNHh5W!xWm$(xYiDMlo64~$>dGAe5_F3}b<9NJ(d zPE`1YCa&t3sqw@-GWhxbXW4q{ls>Jds1gewuN@tBnW2-dsyzHHaTA+e6-KPwP7PFB z_Q?=?tfQIzeC+Ac6yeXtZNhA2d+z(KH=DKM{1M-Gt=2sT_BijpBiwa_=B;maec1*G zuv*qCwM-UEmXyW(;Vv^HqR~qf#y>u;`Y;elEmlItaCY{kJe%)@yGyF#XZa-pG%|2b z8hX9;ZV6^Bf;?mYetB8E$!6Cj}zO@~3 z4DOd!#G^MideL=AaN}WlfyInFbf*Knaz=(FVURS$_)bd-a3_>G^2KgozAWU7xzqdm z;fS;o_#G515x;ErKh5<1yoVtA?cpuq>^uol8eo$(C)?id`cE7@v(I`!xLZ{n*9*n^ zW{AHIptPlek}n0dH+&G-QkRTm@5m1A@sYOt8&A#f1MiJPOe{7tGpfND$T4DLf%I}k z4wU>R>c$|kn$oYaV{JD1`ru)hA?#gQ#O2y+PwrBdWTd9o>>I;uNQa9dmlE%PG8xhg z$6AvRXzX?fQ4T7MtXeBRbH`w&fJ#E`9)_R9WX+9q-%1U+W6d(#BkQ7MV5M#)Ebk5o zUX&`ZjB`ynQct?*TxEg`PaZ?#I?$4P@4i<8r|0XD(xI_{k-c0ho2RrC)^PS5dFD*n z&_uPKRm}w>Vz+nH#4THUqu7QbJm3dk3T8cl;B4u;e_yNL8-UTo+n4dsCdU*d&3bxPdZ1K7vHHyj=a%_^Wc7v`SI+$>3I~# zR_bvL^-&2KxcBs48F9#i4zFiZym@ov(4-?F&?S>#5f7{fCl}2uJ8k-RCyt>PeiEND zN>8!Ee~D`|e>7@>1{TY&Ul#V=2JjyxKzuSv&P#z`SDkGbsLFD0yC$lg!Gf@(Sh7#r z|N2Zt;37^-%e0dePVX1CYp5GcitgxO!ENNE<7M|jp)PR(m)?M?O9Hl_sak-+^p?c2 z*_oi75*-^7$OCA~?wLIRi*|0vaX;gd%*w1$*+x}sS(a%+6f)p(Pq;9H#9TGcxMG>w z%aev%2-s+cUUsFM$|ni-WD;-rV00*7G0M~N@GPXsY=oc5_<#)v6rya7Fu)vV;gn1K1s_`F zSvsJkK;|U2Ei$}{%faT)XOC)WwX<7YJKv`(3)W7Z#*VAcy#X8F$V$( zthdJhoJsWAV$|%m-9tkQDr4rJxl0>L%Dnw65n~954Yo=jr`i@JceC6Za)${v?FiPf zjI7k?^2x?2%&u$uSd3=B(Hla54e{rr-i|p@ywMJ^Xu2vtR|j_DT3gv^9)7r0CWnzO zZhLPMIAMCl9-=rWcPIu@BE;X1mAJb-0J>xB#YDJ}K<=+dCT4qms0{K}=F9=T&QwWy z*qE9#_!;4Koey+>?#bW}Oa86Qc({5X#Ncg6r~miiX1!WsxH32V#G20A78?Qx7w~Fj z_F@qI?0s!%nD&KEaC_M|2$8dZ+WgN(n|B&Z!YX^iM!Pvna`!&TN!@`R9BBPLe4Cx& zD_^T4M?QO(-;2$k-+U3wnIae#js+L+DQ2&x)G!rt;C+(e8`A8d|49O{B! zu&7XgAjHwdN1n_%;3rC;EBlF$!}FnLBx4%I3a$n1x-NBs#Hrr6&qt zXO_`{8;*e}4lfy3COX~~&pkhb+FR6JJ-`2vNt%kdrt2_0|*cszhFw9bzn(az%3D%?18=5Cath-E`7!;;l6G;PGzTIB1iD_u2W$*6Cto_`~yB)JvoX=iX9ltoUH-~nPDLHsb>xigL7^K-& zr5byf(!IL7id@*vSqX#h&L9k%zOFvOVf1uH1B^o_FPohxR-1$F0h2L1Cg_`l(zpN73|Fr)PO^KJC@j)x@ zx0rcZ@Y*h@a`yyw_yd9y+Iluac;#WzmVQ$}(^GeFXL0XP`$YAkJjqWxlvZWJ(}$kg zR2(o<^dSs>Ra@rCN{Rw70?Xs*obTcAz^JtX%!5vFiOVAx8jmo>90Uq4Azv?K@ zZD2Rl0@7Sg@x}vAMJPQL6k3F-KtL}CVV;mopvOB7dri$ElM-?--gof;of{&|;Osq# zMa1`PECHPhAuWi;Loz}WsPz?~V`rGE-`#hBZwz&2=^OPIwtyBYJApU&37=uJ5H#9O zo)8VVxL><~hOL>I+Z68z$Ry_Z?+Z{*AZ zi;%iXN$rM5{0K*G%Pj*-C(#5DQh(v%T|U|`7(*}s+M_7O2z&-IQ#0@-jNu@1|6!O` zE)WjLbrTOry@Y6YXONvb{6N)U5X8!#Zs{pgeO$)4o~r0|z(PJ~-6s~NEZ$z*{SqXE zQqj5GC?uBqGI~fUg@n)Xs=yCU36Pq(N@9T&GX{oT%1~?61 z&(Ezb)noyS6OPSlrndf(W|{-m&(5dYB1jnq~WQm%$#abpE zi)VUfzc|l5i+YT5olf@AJ50;na~f&xBFyFyY=z zd3c=AZ0FDa3=4kc9;whpK#Xq=q^}t5_S)d`@%$9p}92E|alm*eZ#ripnizKSc&H zY9jlvC4Not*RO_AK?p19{|=PW_V>?le^bL3HnQ0us4>oivDTj8M_gsojzBk~EUHU9 zWXC|BZ{3vgj)$`bk8a-CCU4Ky-Bs`0b7bo*8(D#J>hf4E?|LADO6&gJYET3y<7zHT zzP5qgVOZDR&j|(HezddRFFAoR^*9wZWUTeC^#+-xW;J-`jL4KgT zv?v1|_V$bUx~4}A$Dp&fwgbd}z=J&;&^%#+{%U1MoD|GKFbqft2Z!OnAi=#-CX7?; zfj@}lJb;BEa-rIcY#PKuOk6Dp&Xk~=j0vCkOPV}z_@x7)6@Cn@IBgjR%2L1jd}MM# znk?8E1Z;=e1m5D8Ov%FJt2J1{Rip) z>?0o&dvhfcVS$1Z0jb2N~jmaTZb}zld*woM;WZ!~;?5c;7{;%A=w>?~IXN125~Oq|nMj zk16Kiu((h=)>MyfHawJ4N_uJ)Qt3hus(>gC2(`k}F=_oKkj{)H5;^OeD*W)#>4)-G z)ERfz;f6C%tTjX|mCVK&*ND!~%i+&wrqxHPEmYjxonhX6&|hy)OZUu6&f0^MAA(o! zw}rhEy~)cB4EE>rQSY@DM=Wyew1fDER1UH}!?@WJ62Y$$)&gNCxyr&-Q{b#LnSY?g zD-FpwBl8A3R2zcyjGPp5a_?}$oGEI^98D$!NLCo{bKa|?3q(@?)fAUR)j9)?2omaO z%g)f*Hy3Ril95vb(sFmil|XPY#sQtHd>`gYe!8>i1)|Vec@w@>`XUkG<2oB31x5$- zo_&2N+(LLoI;*EUV>YOLcyX`tcIxhm4C6BF&I^NfsKGfsF7kFGwkBw0pcfduR7)j8 zYf2C<){x^0Y#YQF$~2<|n((5<6>aJ8SnW?N=O` z#~xsm5`UR(Q8WHBNSpv~zBE_n&>my42#g_{VL2^!UDWtr|gL02>GsUu8$x(@n9U zS2RT=h7fKRkZZj83 zrYX<{TN0{B=XT)SBT!>+-xH`zK_y2o&pOI}!fPPEo3iHc9S5$eEb;&ynN9155Ac*` z<<=Hb;_^|Fyy1xSxJ+h|=rB4YBSR%m4rSC;JJRVBc7q7Ds7x_w9WZ?eL#N+ZkUjE{ z-vU?!@-T*>wYQ#PO*dC(&q5Z{e?rp&APlnE?789qXwR=NvO}&kva9gAs6?Gvz}2e= z1RC?(YChly=)sJ!InL6Im&&KP zNzu?kI(?=9ArBJLk~K76rI(D<#{w+@aSi^5F($AP9;w?>0DTgHYdh(!^B5s{eh#H&rTV@&@cAVw%G?k3<&*9?vQd5G4VlMY zV4@@wJf77kj~Jog!Q+D97v<6!XywB#5*MuRc-ej7ku!W?XkTOGj)C((_L%E(L^6vK55;Hke`qC#?^DgFEO|Pbp@N{t`w+0ut z#yNy1zu;j09kSdc_gNG2UEOV^?~G)7fwhUxV~uDwz)Sez!Lgp|6?@-M`dw$rNxi^7 z$8{s*2Vbe5vWzN3oEUg)O`eVS$oH&O}Q}tiH_4Q*e z3uO@b>^32inf$C>C{Z{LG?ht`jC5eR8GgAq6OB19(RX)4eh^D73C&;RKZ0IG&k)d_ z?F*AR&)am(CUY^L;|=-tUl$>rJvn$lK~e_jEyJuW*F~*9&myAW$s2bdW&kvZ7|H$l z@=##7#elE=1`0j5Y7z$XKPW%q0AQl7Vg31}2*#nq5(AZn#X1dZ4lEfvDH84~{pU|2 z3z1seuU|YtLu50f{@vNnH{=PscX*_&uwXih3QYx?JOP5#Vg~v)T}})X|I<{&KJ@{1 z+!EE1kAPJmV)KO*(_Xb=L<`5Y#x2tZI6e4EWw%wHeo3aFDbozQcgQh(K@T~*K(Wo1 zKvkVZK511Smvk<9&#h}~Yn&ti8bW6tPiMXbEYiL7Lexdr2%2GteW9?<)6>x!u)k%P zIVA-@x5sXUd!}I5LiCoUcoa+nEST0^$T}cduU0xds~$9%R^dSg*Y5Mk(7iNWcpb3P5-G5Ni;oM`xWK_im-Rye=Ww9NtP8~7_!P(PnDgFhuDq<=Mg{^ z;Vxckhqm6WzYdRCe!nea`E=ec|A`yJ@cCN^bW%T3a0hWD8&6QQ4gVw#_tW%g8QIwZ z&?F4dPejzbqcerXed4jlIy1iLG`9gP8nL6}+8JXVm>xT!nT<Ko%)qNDqiF2DEZ{W z308*+`vM_^kbbsr|6c3|&^m?FJSPRQ23w3*EXh)`#HJG*R@(|KvvmcpQWUU)S;UH) z$B>IyJt*Chk%wC|lM_J@1+M>#xe6rp zU;(VTDAkM-VS9iBSj(t1i7(7v%Q+AJ5d?am_ZNJm1RS=_V3xM!wCnHhSP(^^VW5EQ zu0Y!y563^V5Gc}Amm13YS>LCKcXanq5E!OfV89{G1rN~FKGnFTjBAY;A7L1scG{gw zTmBeqvTNKq5eNUKqP8jmp{)syWNq+??B;pzl#VSy@H>Nh!Y@3rDf?=+KM(BJyqRZx zx_dUdoc)Gu26@uY8=7lff{dGH6054U$a-ZZ!8pPsFq@J0ScyHJ{QPay@~ns#Om z?&xAbEZbg!aJgzY#f*=47NV@6OAZdhQ$iuX+?Zo~$37*URvo$>WVg~L8le^3 zrDo?cx&Er6ARh;79(h%Ljb!rc<`s&L9SO`1M>Bsclc#}?eeTVMW5#CO$4olUI8!G_ ztGJ`Gh!38rKZq6#rRM@G{=HJvUi+1G>g+gSJAjqn5ZL4eHBG}2lhQJ5E{CH@{jg1O z9}Y*1r-R}Lc)sPAI-xn<(0Ht2r;X%Pv*fi!w*(s>n%p#94M@skm7G|KYSttTGKDB9BjBBleWF`k)9h11S$c(C zgr_lroQ<6}b`?btQU&|jkI%aX2$x3d;#=+`Y_*ZthiiQ1g1~{tP2jrDjX5ImPy(xF zFfZTUUDGmoNkYE; zv)xfmIN9N_6?{RS)QP;~+fBX9n1hCVYf9E3Pv$B7Z1WCVKe&o5N;pj{AP8X0 ziF|DMt~{= z7@dWqaoB=Z_cOAdZq?o%U*kFTPw5G1InOlF)Cr*e?IEBAz1jyb02R{*As>K(Q2VEj zsVMQ~aGsguuK5l^mG2zYZt-f3E!-fQBUrw!*X$I@g9L&GC2rpb+OQ; z2qk(gxWh0O;u1l7p7}y*3XB7hHtxHBwjehWY_N455B>)}lV{0&H2}7qJ2X(L>Ek9N zMZN-t@!QqE0>*t28~x)!b(_!U1w5?wGI^02{ojB?ta1g9TPsd_E{(xYij94X%H*BBA%lXyu^%Gv_96gF$T^+3IHn;GjD|kb$C3T338f}zFIYLQ zHL2cgSuF`e)b$4;0Tu7q9Qt{{XILw}*L1zq1T7e4aj>iPi4Z)bCB9IqlcPAeg`j#w z?iFEB3*v42@nY2+SG-Lu9|qED0n#dWC7*4U=y)Ad|}VmP5Y1pup2uP{IHjNZUEW1{SV$z0EYHr{f`F)R5l-r<2RV1}jM?yQlA+xI0Er z4)dSsG^$DcQM>suW5n-+xPx$XNMd*%1}J@UK$A^pwk`h5xe?fne1 z^ZR~m`?l-*e%|u?c}Ua$Cwjj4_5L1g>A&Bl=_a7ty=(i9m-2UAmG*Uy=yzQ&%m&$d zJy|(wBGKz-OKaZOnPfEP=zHC?oVn5mJRng}qPRmQr@cQnD(EdTiK=x^*QGUkOHTd2 zL8hQzTC2DC!_#5ME@jie5+v7XI%y-h^vwYpL zlXnU2VS|tDV|`uJo3gbA-TR|9q1jxKNu7nTm1u-)+m#DrMEah2IKj`J7ylw!|XL)TuiSNS7J}&Mf)n{Uy zb`Tr-3i~BD&;Ln(lWo2eiCEgm;^k%fGMbS|0U2E1qAjgqla(!dL&mCzfDv&7%=WN!}ryLd$s34TZvQN5ZxOmY^~ZJdu80S zqqFEbG_JXfMD2B>VCsX$?xUA#tFmt2*R{N>_4=ZaF0!|LlW9de+i%9>ZHx;yuVzo= z;7VZ>D!!q|AOrU<7oZN+O<8R;VOyzxcWA@rr4y~ccn|FWh|4(>gjMe%8h34te&#hyxMT!)0{@azHJ>w zr==b^&L=#J)AMEx9-g+odWG*jc^rFNH9s7XC%A+9k7^Mi58eEmJ@x~6xNS4q-FN$b zJxKguX7{Vp>fiejeXh(m7qT`2BkqayS)x7RRYAHQ(Ft0*i9YTrs}DQxS6-InLNZ$x+3dX7HTQ zX4y2eNl{bHHm^Y{?|U-?bA_RaH{+ z0PaqsM9NfB`2Owsr|VaMj-Ism`}?vYx8(;#KBRl36TH0PsxSocPCqhEOWMFWoPM_N z4#cPFt2miAbA>5y-PJ#Xb5r3?tEXjDAmdf*mTBg6H4ytWL@;oLeY-?eV|!LKUq2BZ z$MQS3(?1dd_`e7!M#r>pem{57r<_N>8lXM}0>=Zb3t?j5j`-pHgR0AeP4KG=6?~^j zhVYz0SX3^t#2u`=@hHS^3aKi5(jf6Ii6z>{J2fqe-H*oDd6yfudjJ-M87Piryp*IL zZFAcCN6`?uS+oy`NMY!dUxt%5B0l)sj@-n#b{q7Pg^1>*4Wt};VM?-Jswkf<#Ziwx z+98UYg+G6<53r4$G$eK@kTFp}@m0~C0Er#%Q(ai=*-z$#GA1ya9X{ne<#JhTC9q{V z%JNUf>G&dbvkWObOCR&gCdy{=QSk|9*HkdTafZ;fBSP$Eq8)2dq`6l__!`BRf6w|*e?QOzEO!}N;5|~-d={2XcAjnYk^V#!+nzqvoY^^S z=JG#GU(BD1Zrr!GT4vTxR{1_ME03X!h@*|pGW3Yw7!BjVOZb|11u0FYmm|w`Y_WzF zQa{2G2xqnV?66K6x{MG`eU_eY70z}xmJNxtZLNg$o;MXvRCZH0l35)ix+agLaSnE! z_Y1M80u#uzvAL|U%5FV)Exc-ih1Ole>#DNIZam2@IJ;=8xl*UGSzYqfZI;epLbkbv z@lm@NsrTnZo2hiBv_0zVqxtBix}+X3*jp{2sO~ZDGSrvuxnXi8XixPPMTliV4<`gzW$~!J6&qD(g~CR zEa$JCb+l=#VZv@`OI^7fKN-Ih7>jW0omDu(h*@S?W$Wa^ zZbW$t=vki-R20ZrA+&)_O*x0edut-kTKaiZ$egJPNO3aQ<3dyRWIHl9F>XT*d?(fL z*Z@(0zxi52mbKlc9Qj<*)+Qf*vi-s{my+9|x^xrbwz7N}v%mijkfL})%3$gJt?T~T}magCCid063M z%?@BdU`kD97F-$7nq{HtJSVFZoUVrF1gL#WqdlH4pjybYHzavK|XOtYl| z_1_ja)^Py2-Rt%D12q|I955P(roR;jm{uuBxLOC_GPzm|;Y?OgcerLXN=CSkLEtWU zR#gFqbce_*$MsOhi19nUqhBXX3N+ zQE=Crc<=g`fE;u(5UH8kAiCnS@P&LsfI}sftU;XyuqwE-He~#Ns#P(#<19*FzHZtpN8KP>Vh@I%blok$_>c1>h12UOKRq3 z2IieFEvnr)9BU5lRI2uY3U66gnL#VjULo5O8fLTedKD*@lWXhKH2S*j-?VL_9bYUCUL=c7kj>2D8iihjm9#L7tBo@BU$ z`%NlnjLbL=wBYo#R5Ri*YhQsbJu$Ct-_XiPOgAF5XQCBH8Ak{m2h85qfEaInI={$F zH9&&Yt0&Bmx0o)p8xn!YmYIsI2XQ8a8@5>wj81LH4e1|mu7=W>mjpYLV6(*Ku9nzq zuAT(05o-8FSvasIIZw2hr~$D=vG_x3aMfZx1iIw-q~a{T!ImEQuenDxXoC_OwWH}k z^AqL1m;g~HkrXju|D=eX2sW6**Raq&DqzOS&&U1aSroN3(l`F-GkEj^;q36J!)bal zMhjC{cq8%iIFyZKP&aI62Qf}%quSsz$1#Q!Zi8|)H4&OuvyJRHIH`6K7GxthHq>R5 zc6}~Zb0$jbjYuofp?WD1`G?g09t?9xTtnr;jk)2p+s;NoYr+l)X|Ysq>M-c6H(HmF?e|E8VLebwE@swC$cs+bCv?{lc3{N=qv*@Y9Rq+ zb+}sq*5I1B&ug~nUP2E6rx40mArMB=wlGelq1smy5e9f7*sw@=ID!<>W^uiQ*j+XS zKcjE8LhkH-_!NT89~P;}W(s;GhEllGEIqMvKxKan{sQzuxzrm$TlBC{8EmMsvEpG+ zB4=3n+1L@z+?~1fQ?lglw0KXV&d^Qc8;o9&4P!Z@S0Oc*-PBRyW;7zpVO0hrh>-zM z9@=;0lY)siV0|;lmmS7?6?Du4QXx&=nuQFcR1mhHRKyNkM|_cS4HZwa3JOw(WRiW~ z=B}IIkLchpxK;e$#V~ig4tN^q2WlRqS4m0VKusE;XbSi7zDK5}j&ZX)nrbLVrFB9f z;ydxsh!6?15~4&B_=>N2stk@u%1A{XvfV z0tRkPKzAZ76zIv;uxT68IsXk|?rJ9t??0O!HmvN!&2g!*lp|DNand#V6*?_Z zzE=tdE)A9I#up_ z7JX4C5_PTsI0 ztb=2xpPJ66ZWLH{v|xzI-U%PIQ$R$Zl}gAE--7x<>Jp-g#bpWb zll)A=B;jUKqSFLv3Cl1j-I9EjsXmgwhKTJ_oY5%eeJ(bBYrI;U+&M6*sUvkwund#G zlu7cQ`HTFKN@<2TDzU!yFf|cl7*<^T5TA}@2bH%zF?%_+K*Hp5p{)H+!)rS*>g=bL zP~U^@P_&bKUw6hxc&UxqHnlMk9iJYSHIX0Jn)p{0l3YfK7w#p1m#$7+ohLmW^MesT zKw=VSDoKZ@h!t3Bc@xr#8^rnlT@uyUlZJ%bpQ)VJ`c$4Q5|;@&#AUzVZVbtep*+(E z=Gh>yj|j3~WGCNCwU6@acjCB5azrA2sHhkIrp!;p^rz^f;TjTwIN3Dl6A3INH$Io_ zTo?^QO8%meWUgmY>Z=kiGD2Rbha-YLsuRICAR78n>~iBnz}<;J=y}VBw`zhy8o+5;eGe!OYR*fZm?*|9SPpbzD?04|B zoKN(#GuUc%%Fbrdhh!jnDzu-7*00hIZ5zUr5Yf3)@)^M8+-e8PZK86|2S61%mmNS7 z4unF(0ENC2@O9;wAW&k{gJ-FyGbvzYU9sJC8q!}$wsfVLK5*H+mLN2uo;ZTv%vbK5 ztBEmEC;oR;=%wG|HMdG#&X)TzHgw~e9G-$$AOr1~At{GkDi}yhJDpEzvN=4|RzPQ9 zm(paNMC+oz9E=5b7@Kz4U%kK_#O*ALp;+j^8A*~kugKuhjWaARC$W>HadqI*{?@=) z^MEHm2n|V-ZS6K00LvAFGhOgJ)EMZ+JOBU!Lb%Ddf1~b+Mk6pP*Yb!sU z&(o}Vc7I1vxg|8nhPlkqE=oaDE>%lmRB*qL=PM7&RDMy>!dJ9gw_{^KzGPbt?4C6Hfg9lh>ht(K+EA_mm$65wpJ{Xek}hRBIzbtMQemCpE3v%0 z^6&UI1g8hA+#$GR32^IK2FWXrQ82XN!=>)hf%nt$5U|a&N6V+3oMMQEaTO@GdtJ|YqkOSN@ zMp0Y6_*BK)HO%egE8hZKRPW=nfUb}$D54^|j(9u>o}!U+yEl;Mj!VeHEcqyuTMm^JI|?4Ky0(1%g~l1X<3TID+^hb%xf375Ac zGM0mZG?Fn;=M!7T141e~Hi^L8irogBHzU9x+)=LB9f+S`Q*av0>?g>_6#$DmpauN$aBg_}l~c z47dmHuk=u*n7bBHP2UA+>>FsN09VRNzfGV&y^1LTXr7S*6rHycW%pz}jmro))dwq4 zi`AQJdA^RoJHG?5h53ZluT}{>0VAaZ6hZm15TvvNm|u=pQ#h1Z)ylHV6#_RviLBMpY8(Pcx|w6_l`l{&zfN zurLJ(_W_ydv|D?mz>9d}GS!MIdbt!*Yi*4_B5tr;Rmqm(T3A22^9zL~nq#o`-=s=1 z_4M8d!{FFP$xX!up|HGe)0!s%zXJ$Xk}-TL_Ht>0mN>6DKYvZ-w3vC>oagTy|6}r6 z0xa$@0hpXr0SBW4#XUJ-CN?Gt=i>AGvQ$1gE;PlEp>a<&Mpkz(!%+)`|A()83eqg< z)&-rmS!rih+P1&6ZB*K}ZQHhO+qP|^Qm6jCyHEE%(b3oIX2n_&BjOozykiRSQ^J5$ zDJm@AWCD(8qt@c&9aG1S@~T!%XQo0F)Z)h0_QT5yQll41672DmSNO|}U?|RE134w+ z52RbHCx;7%Ppxr-0LC?A?qk0X3s_;<=I1*_NLrWP=T^m7Sp%^P1}9UhAGMp#5Yv1` z5S0UiD8f&R@r1_E19jkmLkQ4k8mP`FgTTEtsg}%r@g$M{6bwU*y&THv2!)FcBfK?~ zN+{)sTLHUEzK^+Y%AdXl1N^s&V#3AnN^=`V^0UNFoyTevQIVi##i|i$k>oy$x7)7? zy$yN@$&Gx4#`9;RhPz#Yt>HG&Yr{4<4_?kY50s2-Fr*1zqNQTR<;sHXoazg|V5bl6 z(BE>aT)($ypn{c|^@(_X(gkbeVp@6zvJ34_6-$ErVBj0W#FW;mc1o1zF~23Hn~f8c zt~PD7kN=XENb-62Q@vFgZYD+-`{)FFB$k&Sjn@=?$WXB>3hR~|nt-pPZa-zM!ILEp zkNfx4=sqouUzBx{9ycfP298tY3%1z8GPYC?$UQGHzD=p9p<3HPpJ4{i*r&Zy*YGji z9Y*9o9>Y8*%ot&HbC&RBvT%NB?^S4Bls7;ugmiHG>*?kf`O$(;!p znt4p)i@D!zLGOckrJ^`r2LN^rTcSU#{Xf9(h5l*~a7k4)xhP*pt*O*Zf525j|Eg#xV6LEdN<99T`5!8HnJ zj<1OJi%(6if~X7`F(Bc@aKZ-I4&acVqdEh9{BdzkRir{Rq-yn#3;R+EN@e+t=Rk0C zCknjKfHW#?Fqd{>&k7Q^rFm!IDd2UWf|RGfNAg$$m`KXRG15HMI?fnbT=k1xDiok7 zgvIfOYo>%gV|8aqI2$E_9jGC3tI#TcfxJ4Wl=PMRKs0AOIR!<434<5k6qh|KJxLyFrJo1GtAEBbjnbHqGY6D z?g$gIkWuHq0?_|}XYSyqqT9KtYOCg@tl|Q3KUTJ=hWQxk_)`sx@&hH(68=jTrQ{66 z5FrX0T|i06MfYP1$U01nmRsq|sLO3@`~l6*0X8amI6PT^$g8$D2ch`*MvU^HJlQaSqMRP`vpcs z+w|l@@v7n@YZgrQbcs^Q0OA*he0mbp!DhKi4+7Gj8^4NJK-)i1Q&uBZT}w(< z)tW=g7d~gA>~kPq5Lcy7o`r)To%K3Q4LEu#KTVQ}O~sU#EUaV!@cs`c_^*>O`SfaL z7|y4`yB}QW0fjx?@j+qf6wVT_FzwZgx4bxp;|(x&4qyL6NCM<`h_OCcvp(M_t1||t z)|q|5#Z!O|cgt%O-2xGbjeCEf*ql)%s>`W*^gg8CcIeS|E^wP8y+EFmKn)>5sedJQ z7mo$G$X~1r7d8dI+~SLGWsT`gU?Qkgfl}~nI2aQg`PYF>f+i%Lylv-7nzuw+E`|UrAzwWDt0LOvWhjl0KpQMkyvFYn9Haqz^C)LsvtYx)F~s z6Og2$2^V9x--U+OcD8O|k&PT(dogK4m;^HTdd%(@=ZGZ_@H1QHrO8kC$PgZnmaw>R z9d|M-MmXVO`0dcLzZ62}tm;u)f_M^S+Q7BDeTA-D@EvS=+m2$)bxm1c!?gfDp)HKL zCa9%!n7t?N<-toJM^w%A%Gj)az1I7hnwTNMsa590&B(qlpF?+>0PCB>BRqJ#T%v3G zJ$O?Y+fC%n*?qv_Ys4X4t5t$=blsQy1+9L9r=0zC(^ug5CVlNyD@HT(=!O`|#YOYqFW9fhC znQ%5ymK>Xd*g2E(2Ri57Qd0}1+_oCU0rZRVT1gCUf`>ltrPPv%mQt+?Em%uERQ}8e zAG|VHgSCblC9-iL?Hh`dH%N3-^4oA_*^(LzH3~0d%A>?-o{C1#kFVSBuT5WhQ*p-e z&3~INHtoA8P*10Ug_XHJNhrwWV1Mooe|@gwOwa7@oF(Qy_O|}iU!T`=vig4R{#!gZn9& z+5h$hO{#hSwrM7k_68skOA{*;dXnzx-1xHf4DMkhvz0lS9gDR6{h+%~q+86)Cz=+K zlM{|hW}0+!kruuef4((C)%%TsP}p`%t4Ztt!IGNO`njt&aDWI~e&a^<12w0NiC|sr z`kA~Kz;*Mbx2q0)bCF#&qDiW^29R|)FVXP`2FLa#U339I&d^c4l!yBkmeACg`Zdjm z0^5{36i{CTO)-A5y!piAUJTxiwbe2KO@OP$8Exz=wn&;ctU#uADj?p}r*Gu6fcv}Y z)Gkk5b>X$6kTL)-Q3%#qb4NGHWKg5Ckkc-2DQ0HkNJI*0f^~Z%EoQ^q@moZX74K(v zZn`er!9P&)ta_5DBfDk?j;W%0T^7$fBa?3R{CQl-Oih-^Dhv?sDdf-T#!ABJVDK3mf(20>!cqVhWzWi^}5TYC~#l2As}DR@nX9~ z--*4za{_<|M5IdeM+r@u4nHY0%V&{y+kBrPbieO+hQcCswjKw4xXTG=-Gk0J&c55k z_G0rN%`hUyCNS%wkuwQ;0{~P#-iOgwob(@XD$WXO8p|2WX4qFr=lk5q3aJjCq92Zw zA-!$qTS?rGWD*aKi;R#xuF&+Dy7&zZOJEB<2Qx;d=)ziun8%AVnwa;&{DUkGIa?<% zk||oPqI=`3rYz=~g~TZ5Ge+%-sa4t^17#YTVS2msfB_pg|$cVnn>+(=ULGDl2I6<#E|~45P-ks z4gJSd8Lx<5kG(?HnvthGE});B89gN2a+OCra{m@LWq8Bq^mqUMt(o(OYv*nE)HPpJ zC$8pHmFEm(AAdZ7nm#rQE5)jv1yJZj0jRT=sLFCv3_a(>TvXunWGth5kOcxRoL`s- z(=l!&GO2OvrK?-~y`9pjf@mO*YhHlucf0c5?*S`{U5}iJdisy&Toj<*uh14WRS?)obHOD`9z&XRPH~8T zKtu&wQz4AfQAs!rojy|TuJLnW-2O5kVD-4L8bd)_N7zM=^{Hxv0Uw};XgY6_4a#|q zE#RpJ68PSq6E3o?p)%jiH0$&OLzP4hvK9n}&lJ1aIPIZ&9~~a%w9tp?tLo&Y2_@sg zhh?+{BmJ@vgX$Cu>f6^Q7jfD_K|uY&yewGd9M~V#D5S2YebVH@?B>6S`Qfc>;Qv$&*o6c}R~pM_g9?~&Je49>~P|6H!d4{=qSvk|** z%8h5|wAc!cOvUV{G&HVmjgcK}*T;sCpLOrxc1n{Dn_}$st&Ee)*UWq3kCi10Im0WZ z!ZfLm+$4raIHi&r#@7szZwQ3 zDiZ7%!O8_IrQ?pAz-x~=6OHfFl4uZ22@RjH9Y=|^mzSMuyvm6M^#l;2JMOfb>99Y7 zegOnMz6iD~4(K-+d~@Q@M!7S@o!ktsW|lQlGy5rm4+7iNzX z4|$r#x5g;7R~;d-g*}f&QE2PiS?R!zgKKXJ(A_I9^ z1qx#oT5A8ZX+V#ERY9Z1M(HAQ5p=QcSRSI?w1^^_NUMpKv^mYF&5oQjkO%_ofl`#w-Llei;WC2I zo9S@yV7MoXFvS(T%$bV*J5c>m0Ki9&y5}|a%7FNTUmS7KqYPG3pCZG;2fyPc9!N4c z?g4iZmYx5V&H`MBUD)G=#}H?PWhJ7L{AozRoWU*P;@0#=BXvOl<^*gI*NV_xLvFPOtV{=1}Aw--f0e0DOcf)n*OQ60fEmni??sj9V@!WmuSb< zESQm?%YSU0Rd*TWpRseZD{hID3V(ZGfk%zn!gyFFS1lZ;|oIu()fV!Do&>uqs`k05K2gtfC?*2h;7 z&rdvzHltQ$rj~99D<(O z$8O3uqwl{T?v}XG#}N#&SaHEFhRp(=WdYlK@W*@WbAM{B3}e-xiW0WN%7_^KX-E`9 zKw)ge7P^!D*p)|~KPVpXV)mg1Iq}#%bb1<@>(K2~J}^w7%5dzEVj{Qe1(<+P^JGIr znWuLy?hX8Z1)n-Vcp~(k;SCzKnQ#+>-SWuxjsl5F4T#aUXEjaWwbc=ufSCYGNatAw z|6)^TI6x_&3b$J2bib1h*Pt=cOdu}LEUs&qlt5i{7-D4mumC42x*!TlPe3wcpe)T- zX1&%~nhY;*y$({34KkVgT4U8jUh|H`8RVp0mg2Og5V1g!_$>iKUS)WC z^m0rpyoPN>b>Qm6)N+}H1jTo739A)Y$QaI_l2;f?;N%7|S5AiG&2lQRQ~UVG=m)xx z)!h^+z+@~aS@jl{aXnBoq&nj_A$@P+zDaBATKTz@+kis#@`2F zM6qQ37s>-#AAXPzKK?bYNrV_Y(b zKRU=ci2HAe&uLIvnQv!YXast?Bx-oC;nu1CVX(;+RHvtgo3&b$&i<4gzG4rfJy+ge zQb*_Ed{jG{ptBELKY<-Z{?$W;Idgv$t}X;Gl{~a-I4SMB3~d{NHkc2F*K^?uc>_}F zCFouvXvdeC-~c>U`b=5z!%l2$5}Rrm1O^8Y(Yti85i%s!Trlw_S^Sw*hu~qU-zA8! zQlzwjvN3t){<`c~Kh)69^0}=x;b8zWdH%Ut{U&=+%25Bz(TOyYqY)}2n&2Arga>d} z|GeFk_Y_BMV@--*4q_D=B+t5nhD@BsZVb%7X#Ju6`1Af4++I+A{K`KOa0*f6(^z2@w5fU-=^nE{zscFZyxEgFkw#zXOVT2LiS}a$oa?`` zQk1vDCIN+{w;E}V(P|S8lu>1W7Mt>Mu7v#-$fA6HIe!u!FC{`5AiwYNsDIi;@m^|T1<%7n9;Hl7%Ji0OHmN*L+z7YZBQyWsik%W6}&JeQTkK;8{I%0 z6{*Q+4CffqOD=9_f3RwXmqIt$=#xf)gwKDg6ylml;)i5Pc0JX(!N1F!i}jA5rBbV` zp9y{mih$SxD#B-c0j)V=JcVH}-p;cv2+vtmvJMUXb){YXR}NulA6rt3HuVJvti?=S z04072YVf{ZeT1|msm~yF^{5(d#Y>Nrx?H(;%1b7G&Igr9Z66HsI8+bZU z6O#(LI%R#idNg%K12eQig5it>Gr0_QnPiH7bcJzpe3v@e}J5S+W63A4iR$+=)s`^LfT0ux0%5DF>8S_NPgHYBV>*~ zQaey)gq241a3gucL<{Hi-~{)Q>JP|xq`YTSZ?bhDKI*_wdab($=TO}VY?bV^TC@UP zGm(Ku;zskGE512PX=cSl!+J--p(KnFNoJ`B=YGd$dkt{eiuo69O!qi_{XU zxjbdT>OO1&69krKoDr+W&ngd;uW<`c{_j8Tubb>6xUC}`HSO}CYi+vbzqzfbCuOEf z8nRx)ODZksro)Pc`}!XD2UT)#6gj!t7r~LjPy384-Dd6-dsz)Sq9-hb(uoO9q!GI# z9V9$V5EoVSOr#Ng+vi5cpxE~R9`HfFCaS8pXJ1lViOh?68hS@yUS5tp4`ti5?0S_} zx@_*AE9*HQbW|s&d)@W29&;ramOr7&21UoPEo=#HA`-;-w)Z)btfrk3nq#8+*VGk4zwQq{N7qy*cg@H5$k3%&0+)JQ4mjW>yUE(= z5S-xfJ~2+9yBfbR=)77M{(HkdCz7?Ga|t5FI>d0ge{Gt{5=vHYf;78nLS=X@v6j6wnucs=EGaZf&OTTSL0bz!|BQZl}1&U-#N|2 zOfSk5AsWnD(;3gs?kg6pEKGsb!gC;I;@M(cnpblw$I3^iNrNM!%C&HTKrjH+WA%O} z?XDPjwLWN+5L_{`gkZ!~*Eb;&rUAFbT=r@^{c`d}Z}C}@g&@Q}-P8$ZEXGaEGj(Qz zy$7U?=3Tlgs}Lr4amCLC5a7LLvpo@{04QEMNbovIPS=43mAy@m4Ox}Ejx@HiTIt0W z1aFDm451AO!cw(tsTCXb!;*RBN^0BX3laJ$kCQVEmswWT%GM+hJ*NXzEfv~uMQasY zOYM7Y#;+$1J$VBvPzH21ueOdp+Pv(m+%lL6<2DhojaKqWxxxl%;@aiVc9_Ob>cG_- z|4yOSk#1N*5cu#_lxVDo zJX}oFML4ihbM%fh@(u&_O}rf=djsz`XhIsl1A7cjU_2YtA*aDK9Mksai2KB<=&-rK zsymXTmgLDB5j>qDlAFQq(~pRZJc)2Cm-*ePjI?OvWh(u{!qFL?*`t;U?ne@PX&k=VP8tGN__vc?{VEA2Ax_D&oDnN<_7}z%cO_Ag~ zzdsjNq6Oxx;s4USbj^l1qo-h?S;9`F7nWQ2c1*ZKc9Li0{tZ`N4Z5<734Y6X;_QXs z&uUv3AkFKZ=DOip^6{juiM+a#m0uf&NCSxSiDX$1J{Pp>S|#qx{CM9(7zr>Rps~Dz!kfq z&UUNMr$lonOB26pedHV}47krFt^aLe$`6&r0>365ZX|CVVGtk%txE`*1Vf!+(2>1g zQl@gg0UxV57jv0N?}m^ka6W}*v5NRwEPcdJxLKWQHz1pV(wn4$jXJrqN*Te>LSM*; z+{=K@+|gmc>G$5pAvWBm2UznPbA}qY{-+wfpxlO7S6)aoz{o@o5bg#tSDx1e+DL1l zjtjMb#?qOuCOaH{^@}l;EDwrACVUzft(ck>#k5|>LLI`Yc~1XM(<|*jg2^a<@q|?e z**JLTU>q*5QB&wdBO#e393KfIiV_eviA)WhJzp?ztP3|zzN{d2UvZ|MYuT{ug&m4z zbA-ydp2_W@bfokr38R^~Cm~5W)iMcJMtF+agS1Y(gVuJQ1wM4I1U~X|$_Qsq3!^tr zK!z;$R%m{2Ob3Zz(d`N-Kb@e`@VO!UkAJ4{?ErdbR!%4n?V8kHjT+b-vGdGBST74S z4^YeGa)V%XS{2{V1(UWyQ&@hH3rK)d^-&YN`1a<2^N9H%^!1?cImR??5UGLV%s^Y; zg*nnj9d{-S!9P_L*W2D_rLh%R;r-w~&$Ayi5qR78upF~^BAB_$=3cBAHqi^ zfD);R!B}l~rBed!m%-t$esXn4;rx5d`|07ox)c_3pLa3SK4kTtv|7o1 z+h@i9tFg}togiX;TrY!3%Sq^z@_mNYf1Nsj@gbg+-Da;PTDlZQgV-NXgVy9w7Dg{eJ3fN_9Yjh~?q+K?17Mx&Abpv9sf6!~0{GkVDC>2U{ zySIUDY4Z7w|9X#o%aB!A0;O&9obGGJZ_Es&?GDVWFiVg|wKUTR&x-2-_^Foryyj5L zAuAT7`8eKr)#_K*3x1W6N4`%VqL!MqVGg)%C1an; zAL^W!l0+#u(YiB7a)tm_>gZ8}SsgtpE6;TH&ehDKSHqLND zvXvpLT-en#S}thylCPwpEA*0#1S7ah3==KEioL0QY({S7^DAM&RxbeKrcYJG2Wr{B$l+1%&Bnb;WE{ba-hWH zGx|n-#X6C8)JA;z2&9`|xY~tbIc0sz-E?5cv!w3rah5dAi9RS%^gdSGTW4 zco$5)P~9$&_`Kd4I0y&II)kYyFtA>Az!)3bL15ca#nj&5QK3V$72twA)=}rX4ci>e zoL2epA-&F?#|ef)dJ^ia4B`Rsc;yv7E3mpgu;r|`ZWc*J$b6b7V21gvJYgTQF5xFtYXZq3%&_f0Qf}Tl_Ll^ZU#P;}g zw_6&57GCALq8ZMB6iS#9>HV~%{HnYtzj>w+L{d#%g@D-K_SsQ}~iS5hNeIAk7^U^YxEno}#^^=q3M(?99ck^`q z{g~|KwU*20hB4YUO1Y%jAlZy-Nj8t>P3fQbZ{coLq(yp3R+*=DT9MO$w7nfs|fY02hyB!Dj&1X)81SpTCmm0GCBZjG)+=!#6K#C z+NxYL+y}rYQmhFRnQm^}z;`bddOHo-zK24ZzMQ3iHjo}kBp4}vEBbX?8bIb}H6v7_ z2(zrrtVqPUlu$>LgyKWBA3|V=K;8`4uSlX)t%^%;kQM_F0+f$b*O#>)Z9s+B=$ zh8x~kgP9PMC4DH&ks?4O{6}bEO5{gjB&)_8*J2zkNb=CZD057IgyU5UA0qaBrzGRB zX((5x$SE<)si4dE7_r2Hw0!E&43_{J)o8*g5-HS63!hU6z3RD`miJNQaIB#%=;5&ILl!)!?ysmE2~*XUiO0jcCXM0|2Oh z>IDxTs2E+b>lO%bNf z-}zGA>cT+1P~V?Y~@K%iC{e> za*m7;^z{C@8}&IjT-ZD?wZh%%e%nFN(IaEND+|K00hxvP6;*3&dDdi3F;GhHI&-CT z9+CM)RAA@R?CEZr ze0aZXqE1-zUEeJ`Z9L>=$3Q%F;?4^#>Fc1nBxZr4Rf`1%7D0JmSpCuC&Q&E@>;>-S z&9x4`N$LB|TYVwBbv`2K-{M7*x(Q=#Y2948c}>!WF!+G@KPz3F{u^55zx;W#?f+5f znEq4gu5~nGaoACOZuRD4JLfC z+WPpuo^M}=?&r4J+VC9?mMT;VB6=u(@E3AjX6E-?ca^7y&t(3c?dD*P!Tw3NuNG(B zV^{L&{jh#KpKa`I!2r>GPJsj_fF%IA*U!c3lpfHV5!Um1fBT?6Ih8YF0rk;?=~g_r zT}jS6G?_B5%1wCCHSaL4teUCuRIOe#c4(LpPjqG?a$l6I%x+rb%iOD$<20$1VJ}w9 zakx6X>0V&7kJVf~2;ucM7TQK@u7}=4)qxr}PbIL5RVQaX`abwT_ymz;>pW|m-T_Mv z2*(mIt?xUi4=p<$>_#jnipmanOs-)W9yhaeXo2XA%NtF&#ptFeaJUggykMg+m63!g zIK4*8BTrr(;WX`zOea+|6R#oRtNW{^(aq6J)ESqss$Mrt@Ujm#WJFB>Uy=c|t_DoL zP!{%_C^t_5vQ@!xKW_rFb7{6jpChIgOO>K!e`YO}B&g4VrwS6DC{YV%CO3KdJ` zbu_}wF1QVW9_30NY}G_eu=+kOOvH(}QdS1ib9bmI(@%LF5VJNON3+E0jU~*qV{zFa z$%tb*&fgtz=qTz@Z>ZU`AfT_%y*^~a=tiXqfMjhC6U{8sX5li!`*&rCG*^l79-I*K zsb4SIFa8#+4(xW12ZdocYg}S&WUsf#GLS1O0{NE-za@lpo_3&BdJD)MioiKk=pswA z_*&=kxm>7zFTZam=zB~Wg)_u%4OW_F+3Kypr*Bj=QKiozZB8QHtEfVKb}jvOm}W&d z)&*>MLvGXV81GcmX4yE}^0u6VsNiuzMH&2^_?UH)Kl+{B;FQ@1#abv!(7M`icgJzN zV-p;p_s=#CZ0)#g>+XSTi9DR3i?&D(hURqVd&m(Ll;RPi35=A9o@RLh?ey)P&6!E? zGkw(~xU!}X1Wh5e`KX^`P^HXqmdG`Q7rCE*i&5qkm*m7G4~uvj1|jH50@Hw0;~H?u z;ma2_N!Ub31c_b<*B{x|lXwkLjuKdr0D9za@SJAJ%F=iG@y#Z^M>in?5Jo&?UHjh# zF1K+p+g{~XK~N-={zrSyMNbm7KlDV!Xs<_<)OdmG7YkwP>uBr3X-)IRTpAO5&_<-? z=ph_*lI0g3-}h>*bBeMbESe3dW0Rqjr)c@KY;4mI{3R^$*9-SEMH-ny7#bb0*Q1G2 z<@pqFNph4~;M(|i?>dv1QkThVz6+12XpIe6^TkHelKKL#dX!81?o>Jgstmr0oy1zio~NSPHQOlH+{4Hu)$xawEXR!m zMC8MZRqbetUKBfwf+Vr1GGbFP7YNJz^ zQQwGwuOnus@)Q*fAT&8O`mZ7~hh&8=&%Nv7CbS&yV?W&(Z-?&%_1q z3%q_%m&3Z|v(&dj{+z==!wwOy6SrG1S?zDfIuTF@u**hm_p!{O(6yTZWCcQ6sm!@&REH(3Oa$B7#xPKR>bla9!vGKP~^$4 z)}j(@;(xu9kW>l`fqBDVB-lt{!cH#d$cua1C%Kdb#=yXF1Fnfg(f;y39&RA_-w;tr z92@iFV>VN2GG__{`z46Ug)^uMS}^MkXD>7eJ;CKlH8-f#6(H3yQ+C5MvsjEjaLlXN zqASSSZK{iAkMr&M@g3XRN^m9BMcefLnTuG<-_!Yi_cHl0&Fy62_I!N!W3!X@lpjfa zL*wlf9@xe$1Vf~IhHcH0O{a}{uk)RYtLcT@%Rjjz;je7g5rIGx9nEg!p+J}-XLD?* zapuH*p*anH_Y_Cr&oV2j z{+U%S*in`qc81`~EjSmbV*i1}A9tx+6|lYkT&ZX4BV3m`cy~y@S*Y1UdEtNmiMRNs zMqv+81Q7}>{>SW--)oWG)7xXv;qR>vehZ6LIelrk{4Dube^%h2bSGzk2;at@70Uh@ zJpXU>dZAW0E>xzS4g!sxUpbG?t2jyv=yl&g=d*`jUiwn|-D&)L-Mr?d@=Ea!JJI}T z0cSA=wj^c|&g8_sSTO+PAC{9j7_L@`_QQB{W=hfdVR!mRMs|c&W%5+K9wbtyGt~VG& z*TIbP98TQHFK$-D`8V5#e>KvNq4LObzj%!2d#vI_HwsgJ=~n*X{8#U(po;7sKxhLX zZq@=ZI-KgAof^jM=Zo@}D>sdtg=9I2BXa(=?BqBsqS(OI6Xs!?fz%DaLDchy6_$|V#oDWhXxmazpW9IduP}lT`%tz#lWJF7Gh$#OC0*H^@Vv7K+ z>{$m?hhny|s?p1)g3zA5SDPmk{D@L+!M2xnxd--#U+RopXT~B6wn7Z(ha!oGF}#Op ztbSelwggQirO-|R}K*g4^h>5VrpP3a&PFclTS5r&zKjZufLqJD>+s_&d$?&+9A1XpMHyA~g4Ww+2jqNXrlEn~D z??dTJ((G;=`6YNNggh%gV4}EP2fiSuZ(fn)G|bZqC^$4+1uk?qdt$8HGtRdTW5=Sw zQ=TB>rvMMeoU>>AdC;)zv8Dtin*7j^*>tG!Gv14HWSWe#vO{hbPEwJPQ~CpZom)Geh!Q$V852nN8v72}QfPH^SM8+Z&1@piYSOc>VHt>zbKM2jiT& z4|U*7dfTlzNr|P zYHm0gHA%m91nu#qGnDAwcP;}pQ?9HBk!ujf*o#qwPG1{yyo^4ps4kC`y_M6~H#Zu} zIR*hu&0Vjfya6ft^>-Yf{VQvpT!IUvBv@fWgsJfq?MXRR9bdz+SNN{uHVHP1!M(q^J zqe19-0?-eD{m@oreO?c(2yp|rB~Y?s50=N^GEG_DB?3g06px`)9+4P%y$GB=Z*U|n z-0tb-CD{ItzzSOeqA@=foru5QG)M})(at4uMF0L9Nib&t3M4~-l^{b9ay>;uB(f4n zv7tb$6jrQ|uGL;!!r4mYUg$2Fdg>3=f&nGyb044`zcl9*Q4Rr@b>U9&;+Cn3LQ!u5 zW6wJnS!rtYL=(mj3LC-DxEDknq)3%n?s)?9bzpTJNux(@M0O_@$vz?(DS%3oI4I0^ zLo|%8CIe&nC9WI!(!h8|Fzy!-0QF&K#URMfgR4ecc_XlpxC9>^OP*c~YJ%fb9oa4$ zjYDaz5Hu3doN7sVmA~YPM6~x5ldEF9-;)U5{rk+Ah`K|lA5RSpmXbiqvsXwJL+y?D zs45Y+YOmoC=CvlHQ2k)I%L(Y_fqPDRx7ow^B}`{f*ODf#!iBmB)Gqjn##Ce#UO~@H zG(NG6zG=bSmJC{K33V9F0_m9<+_jr07<3p`(}(>-&hxPEQh4dm_Ew|2L^cim>rjvS zqFIv&J@8!j%VX6UP-D6-_W4MstV(r-==g0j!f24DMt za4^RTSu(>N$@{eCxX1%yY!EBZ+8C&>zMzWbyBf7;s`yjwP%Ml zrpslohria=yRTsD;5qQx!@C6Xku-Ln{@UfOhYritIpHBJl1xzgjh&P$hNH_UTo?p8{18<$Hm6)EL7 zU+iaf0n%HQs?FF!C2HhLG731EggIwI0NKt@GbY3IrMZvB$?Yg=fpHT|@0Rt{m>P+xIx4PFc(MyO}DEiB$@; zejORaWkFghD+9BCwkayvNp|LukYXhSx0hrxk{(vK&{d)}+NT^WMuPES7GYAC98<%C zVJv3KT&V_@9t1ndCq}9_g-?hU2Cn$OumZ1zQDT7w)=hEl=|PXIx(H*EsLAnFq!~mD zi~J5C_$Dm@Qaol)>gFPR7ABXYBYcY7@P8fGzYN!2B&!-*?NDBmv-*d;FDK{^dbfhP z-e;5Px+U&r2gHTbSOzqiXH>`IurI??J{X@y@RUe->S1}3>UqKz$Cb%9S9jG*sO^M` zOU8cnG&q-vaT2ZtM$aNRE7vB%Vx=ypBB$tVq~T#db%gimswif8y<2kA#7P64T81@G zMN-qfzwj+t>KRg8ZdRhpNhH_*VV;tknZ7`K=GNkd%mjoflBy9xDf2L*CdtYiw7s#& z9MCBL+U5CoZdOg2@(1)<{|$#^K^EV*@S}QlLQ>@95nwHt^SnG zDQ^5<%v)Os>u#Xz2(@0=NVzcnw|01oM53Ev$zDNQH8nD}w<9>kVWV_DAy+_`Pnxq7 z%Ci2&ob8RVINU2W=9O-GgY;!gk+Mloj;J^!n}LC^*bc+aedyJdR(R*qq6 z!sIGOo>CCW-56BJ#Tint$&C*rA?4Lqi{0sRR6 zGIIfI9ebIX`NU$sL;o~C<+p)5np|~p7%+E$ByF>h8PRj9VmLC@pE9!^-3q8`+7o9z zTjGSZu|2IN`8#pd-$we0s1#Q`agrI1Yh$LC?qX_Fo>!)GOvqWn`?xvK{(fQ{cYuV{ zi0e-b|7slGN5jsL6PlOynS#8Nc})YJ3QH(BqqL+Fk-uEUH+P3*G(zm;LB%;CqHPbC zN;xzWC&(c{;c$ppc^QvpUAIYHXv^>`dau_@tcl73GV+yY4N6p4O>}Jx?oPh>9lR8+ zyvOk~H&B%AO^+U#g20Meu>oA=TQj!*VcrlCuyxdbGcQD!$*4L_=Y!lnZqCD#fTrm0 ziuPx+9{owTo9|j(SeJ}P(`xNrG?Svp`@Who$%B}qp?xE*6ed7jA2ES8p^|(MbLYpw zrpYA&qE=kd`MVeg2X#eV0$opAVUJf($9<37I2;)rzsh-#Iq*fr{~LPF|DgB!9jkZ4x2E={Y4-K#%h&b( zcJnewueVd%OQk$`Nl)4J{9o1!`EToO{y)~s{V(gu zp=0m<$9le>gv)`2pZ{gOT2I{nSa0)xST9Tp+|}lIFOX2#ad;n`f6y`GR3PJ&hQ?=R ziBM-rTExlre_D^Nb1-wYcjr4~+6G||k>3`fcD<+!lKjC{`cN->2rCX77Xmjq|K8JW z{{Oa~FE$&CRoQ4e;qfOfmqh5ea?DiI@lw2zSSGTl%E=N@%uzZ)Qbe0zE8Ka>X!3FN zKBt~*HzS!2@MUb;H_Hx5Oxx){?Ohrf1Z~ljp6|gTVcl-O#cI^J8LCsC&_HQ{2^xAa z;?5C&TTkVqJLSMTj2h{OS;8Tz!!J^+Sd>K`8n~Pzl0;mqi*iZxcjz90i6#&(&W$Su zJ(E|x6@mLHG=klYM(&TgZvG~UP%HDAQ`rY+2M}8Z8~FAHr!?JK&+j;i5a zeDl_nCUas41JS=p)56gYmhOY;+vU^W|I+G%A-#mCyEvj-t@j|V3rc(ijYK?qx2El=9|jQJQv^j) zxKVjw0&)#GkW=3Fnz`_)&>7-i_t=y_?YxjDY|H+kFYD}5%%67ef3fvW!L~(fm*uu? z+qP}YN+qP}nwr!tnyUzVHv!e1wJBE4^!UYAb$jbMxnMktzgRe+L5wn!4I;V&^ z2g%?V8@Qur?jT>g4`Q)<^qRO$im>~?+$UK1FZUJchuR5O`dfskNDz!*=YR<&%>JA> zqQu*h_>{=x@vr^b6VdYD=ig>Kr0Q zod2J1l|f9z5t&{1a-&7}*v#}20Ky2RQMvFwn*$$<5cwDxXP4A8>af!^ABZez zJDzzdz>06xl8q{a~&x2eq`i(kC$_tb~1+2z%R5vf(+FfY(L7JnuEj~Iz0*9PIQlj!i)(da6itNw7a zW2M*7)qHqSk)a^}kw&p(ES&g+EprFACR7%2IymWzm?KXYwuU>ub5qno)Y7_vT~Ray zr6GklnID9=%NX>0D%Fk~#4HC_ntUc$Z&*rIhG$*}fRg58%jS`Ri|0q@@BhXkX+_~* zT~ks9`Fzdl*GVQ|ZUiTtx^3+r{iv!zK8pINV(@*j%|^Kimm=tgRDu{lkQ-Ks7QA`$L0?3?{p6>_Sy;zBkxFU$cyEC&X8;rN>Zu}lw=v>b#)DB`Wa zCiz_Hcd76Lzmdx^x&MiiQ!1YSn7Hnn0`S?mT;zmbgvRhvu>tVeF*$$MDUuy<3zGB^ zKMD?&YcHI}yCd~5k5A!?7<4_dBa)9tCbAdxi6lY1N6-XM?GFm2hBV?JtWs+`5naJ~ zPWL>lp}RKXm5LKeU3YpK+_cUv@WLn1Fs`ARdfy0C#rq*xDS(EtiN-0cwgu zVehUQbzmga5l}y$wgSqRrwBZ3kXZ*gJ7ybhri_?#ABS|mp`3i_$NhG)*an8_3D6(d@EaBTP$Q?9Mz}$t_RLgrewGB9huP* zE_+sR|J9@v-SGj_(EJPmG_h(PY4Jq(VG7OE9eI{EOsG7Fa3)zNA5&_Q8I>2Kunqy} zfzDeWPheopVF3(*{ruNTPG0ZuhynosSit|+O0xb>l2)6r#S%p5SyOvrWVBeGvc{pc zm)jtT_rWs&Cng*S$f9J^4jiXZ``K&-&xslY_ zioe`-;q~0HT`k2+#eQ<+&0ClHRFRpAy?m%5?b&0?Ac~{D<@lTDwkYLn3|xGxW0NLfx+~q7e)ka;EoqJ#BpFi%(Y#M zce{P9X%c)g)yXc_T~?$S#$;{kqvozvynD=sUo3k1wZT@x!6}hV2gHWZIos(0hj+TK z#xy{JPxzzkQw?ob!;`(T`|6YMUX4Apdq&0n%`&s&ySAl0!VE_k{&}?`+bXeu5s^d` zfBLUFMK0}B{-$`DNX_F{xS>k$LzOnybY(G)fpqJ$Zfe3(m(FZUbP69PrmgDsq?ztG zFA`U4d~x&R`|2E>l@*=9l_-z3w4`S0C;6)@_umgR>E7qvf44rj_LfW4ste5sjGy@> zqdQ~|2^G@q!Xlnr0Iya&0h~N!T$zBrcn}kZ7qDXp zlJFEXes4M}(W()#v39E};C@%&1mQ!y&~x3gf;i9`^=u-z8bCGk|s{+eE`asXYT@w+sd7#}k5{}^h`@c3E(N=V2#=p(x z?EhaIj_rS+$lD!>A^D!w?H}1TlYH>u1xdQG|yVIsHCB|_|i*)A@Kq1D2a?XsQ#@#EcCMkxYs07E0L^P;Vyyy91=mRul zROm5qn&8y{^hL3hnC8qesNi2Ia#tQ6;q0t6Q7I4c6GhMfQHtEihD-n+0-x-hDVt&= z<@*)Z0Qp@F#OYjM^=vSLs-u_^0d7T26DRfX^jH)WhStDn%=6L{mTAs+^JG25B%Y7C@c?JB>rnQMg4WvuB3J$}psP&c) z=5Qn8KLO{s4hzWnfuk#dA-d6Wc6*mm0Rk~vqzF&R^@oV5pT+4l4m}8&=c52+$OWZ6 zGoYDZ3r83zgP;uTCu0z zU@1Mz5+cIy3^wI2(4a;C1_EJ1%}UY~lvo=wi`qFoQ0L`)G-1ZXhLDT)!ptI#s=N*RL! zvUu;WOgnECCGw|GCuJ+CXB8qELqtoel5PJ4@^-J;=N@x6{7dUb-Xp&l$Z$hbG%ZJI z;+UNKd$cQxT{EJZ|M5C3m?FOs)5GX^1OXCMU$~Qy0MbAuG>)Sr6ov^tZtml5C${Z% zSD+gaULqWZFXC7dch@BYW|_`Qk&8Gh!JBk68GE+1{FOD@WZZY6&R|qqru+b_I zRsG{m;q=7g*B&_?M-3@g#=_~6mRjHdBqSS&iU2N2i^#v_{#EgM$(Y8;IEtx?1Lb?c z0)y40^7$^VNz%rRAev}QHc%8qd|&F= zpAah1p3h-btx(U#1}k&WFOC_LYRV2g6KdKG^qG~1k!r@CrKPd)7dAZLln;Z~yn)*F zE_gpxEr0%oZckHnt4&eLK3Ltdo>azQ4_s zy}IG=eZLs&od~+v`F%e1b=@W;E}>jl$WE|&bRBL&R5%`HR1`L1F*C_V*-eu129C3o z8eypsm|&$2E6t48HatYDSD}QzCvA14qhlRqS~=fCJp4Mk?P8%J<7Xv{&?*tCihwvC5~@(NLbV_*VY^Ey^`^#lLH@Ff z4eC_`)Jw`4w_;;nuwpqAVm(oi_|7;J?Ra*{m=z&3pEEmHpz_B{yV^p5)gM4q9DaW> zW3xlegd?ss9UR%BKAiV@d@k+Gp*$!Qe7=ksMGYB|N{(^($5zPbphG*C*PnAe#V)@6 ztNmyD%p^`*^7|Hc(;jkoUXG0JBv3LEshuEZwy`K|H)$3O<2cy%@&tHx;kI-U^yyC? z!rc3 z9D4{ve*bF3^{&7#booBY!bxRf97SfXEG`T#X{@R0c$BtXOlevnz~|$EOo4*33tCm^ z8hJihzi8K@L$cZG{PRwCH}EaF{~dMH^_m2>Aq`W5rB%#4oOP+(C)|f;!}xIPrthH& zn2ap|o-kj~6nYo}D`lt?^y}^^$MNnG7%GMaE;ytdI?Z`+NjHUxPALj{gCghaSxS*S z5^*XyrGr5G19sI5UfTRoyqcYDy)v4WY43oqZf%fA%kqmdj%Mkf!CYQ5sT8Cr*KUb# z&wA0>9us7r@)}~VXe7RA=rPqAj)vwc*POpBFB(;x*kaV6HMY_YPLob<3~DOF_vtdI zlDrp8DB)3^q7N$U-eEvw3OC<4xDka*OdTvg{TJhsLr~4w5ws9&;6g1f<)sSFM|7U( zCUvA}iNrKf!7>Zoo6E5SaMlWOBRU?lWz|Y#FPtQ)*ZDfZdDC~;T(WEFi~u@)6b+U4)nc3sjs7;obkXaUtnQZ^wU)QBHIoJ^p~2E!UC zXr%9B@F(ICMSI>rerb~6lPi|Zz&V`C0Z)W`bnIClVGK?PUBJ^JBCPK%MgxIPc+)1O zh^ds}Ic2+yg8^rBe^Prq4}t{KcLnG!b3FL33I+tPqmc_id0RvwFd??Ao7$S1_$0bqtl3;tNf9e2x zu;)1uNW!kb?4J;*D8ctvPmb-!^sUG?z^P%48zL;`Pg1^T-QJq#YzQ`0- z{iua2^E_x6@;yd1}z*rjDB*o5d_hBIxaiZga zOcE&NdW)qZB&F79L`cR6bjINg`^bihk84nha+jD0*@(57u9A8Z?FJk*njGF})5Vvd zgX`3pGLqnzf2B}wLdY00&XnMjH9RGFlXrAYlW9fq&L@a=NfPSch8mBxB;yv2--da3 z#r_7?ZK)$e^t{A^2)SFu5zQh(Jmw*c|Er`*Bazgu5aND$z+JMZFl)%CBkC4Ou6Qs} zwPi#s(N6e#TJ@--p*$7C1F2ymQY~qep>3x=k!s8e9|V%}^{sp#_kwt57-@ z^sx~{WjO~?(I1>u&HsC~|3XR;yy9NclGl8^3pt&eldQBz-b_}hUE0#lH5}-Qss1+8 zH{q=#+)rdxuX{y>mzVU1aDBRqA}kt6aSQ z{)}hc2*!Z_lCJbDI$_$QR}Q%kqz&W?6&roC+LpMu7b^6wbzLzpBtYG(=Ct%dYJvGH zZiw(~?iI~tJ9VO_a3GVsY@4U$vQApnj>epH@{T_1bMKf^qP#^eKil;3Te~0+EBQ_-8*Sh&5TTj}%|2M>s^RXvdGYK#tPm=&X+`dvvxn5Cd znl$Z#s}oXDmcKN)L4yZVR@%f4e@QH{B)| z<;TCbUgHs~#}QlyLz8BISL$sb0gwy*Q3+NPsd|FzroANl3Cd!xV3Y3a%N4!!}E zBP20d5uC<~{tbZF&=d#=I#&^=qeXeVYe6x9=IcJEm^))>t3DB&k6Y2>LL+=K_&|Q1 z!jI}^Ma#g90{mL>qZ^T>7Q@piHI1a|thPi7gKsv8BWfg?SJ0Oo1~yRpWuAXLsT|c^ z_K6@RsFDOa-n~nj0g=ko#S0Fk^`~3!8GKJEEaGdMKbc$`u}ZtdQ#%OW?4argS8j1I zjG8|*$+s4*=J#CBY`_=FLT{gkUw?Y+t5B_4tziE@(h1L~tEiP(>&najM?C3}v&iCjYd5Q7 z`6r&dSji&#_YQ|j3Dzbix%e#eVVLPi$!(bnb8|MNJF?IDJJX+)FQ`&~GU1sRRF3mfN=Ax9#zKTEW$8R^nA!zO4TvZWscVcUdP*0i(!cT*M>1HV z;Ltah!QUB8PE2SdA#K3yz5ptRJZy5DRl6}RmDA|7rF5Lbc+k}*daGj4Ay+q0=?gJa zX->z_#H2vc+kE`TJ%Ob-i9cfHlB!H}@{!{!*Y9SgG%ixf-|BtE_=gvqW6ObT-{2x` z{>Lx@fSL%*IX8uwaIdPFq8f?T@MlRwGp(53_QL&hOB6mLa#FY;cqM>lZr}5dFGw)Q zpn-p-iCuYEgy&gmVpEq8CV8Rf(}-Qmgii=e1ljyMoUU;BQ;o{Af&=iqvyLZ%3oL<+ z{0}fB?40Y|T03$^1Cjs(iU!*V7=k%cYFsD6;XOz_b9%zIvXGe^q5(@C**ePqLrB=! z6RDT>T*x_=u$iln)~EwP0TORGRzfl-%b)Ai@Xy=+qBy#@H9}WT=d7MZEurlJ_Nw|0 zmq~3CrGE!L6i!)(0d`~v%5a*csL1RIHd41`Z!DZyFpee;?-UDMZ}Z{f*i&Ns!73q5 z&#dMtCxW)kN{krB8sZRK7#bGH!{Z$Ox-_!TLYjmn<1WmIIxG3W{ar7w^nZ@^TtGGl zji~{J?7_;|-Ca>D0%CPdNzO0(LycF^Az#_V+WPuDz9W8K9x2-8&jee7yBhRbEPlQY z4mt)ww)$Z7=U#>X0VXNWG;qLOYz>?Pai0svg+g6CPlH~sr*>Ilx=vTw_AkFAZJ8HG zcydT9bPoDy?PDHxhBCVz61#W|!#S(YNBNI&NA)5Yu97-<<~ z@XL^&ydI2rtgl}#hfM!NB>F(bur-EfuDeGGFx^8N|HC5~NyRaCuZx^xLI)4TcG*Fr zxX}E}*%~kxuA;vt<85rs&SA}Y2XGNxrtxw;wzSV!!7f&3H`dwX7L*Srjuo?!BUy2a zw3~AL3^czvmo{u@$eL$DFScl^x74la=E{fPIHcd%(3~WrpQ_PGi=<4K%Vrg$u?b)1 z&$5Y7wib-^gKm{BDLV^~251cr#LP2Vs11rIuO@_+!#Oa58KvO<^p7F;_EmfydYnq# zWul=x@nKHoe9-5_XSNDT=N!Ei(|(!)2v z1)nM=?L^_(5J8FGdrAD=kfW;}c6~dJO=KZk`9Tk*-%Bnn^d$r@WliF&ODA9>iB7D? z+~D8}RH0!d+q7BSbZW{oYK|}(j%itlAIo6>HETtmt|wWX5s8ZP`-{dz)!<_P?0v!p z3D-eV>SJs|Qlgh}Wr5xCcz|GI0-Z;32&X_Qq(zNlevW^2=5fm+M+vteKT!p0nGf!x z(Rg9}bwUu26BDM>@^=rBdcRzh1{pXYZp0q^qCdJ~bo3>+6f&1;fD-9&!@$jQ*oREP>i(%3!gt8EjiF35|Hg&* zhy@}yk`5*K$6suRtPdr`b{7Us91k2SeWW1GGe^4cwVZ2YV2b6*Ja%t__$6IQe9$<4 zmtM;xmFFq%^gGs`Ew|V{+@CWSbqr?gminhih2dKnp)=ANC~gnwXsLLa7}Tek0NL9v zVWWg4bXTYw8M>;BbW&cBKfFjv_AxFcWc(|xDrk?jpkDHFG^1ymU3h~9m0RxZX zpt3#^sEUtoaT#Xi?d8?pjV;N6MC31S)(Bfs9#1MV*Z-RkoYJt3aOKBS^TuP8=g(~J zo3}6Qjb{enlFNpkSdsRZ576$NZbCk|&*$s*+fAZ|@f6XKJF|QB zFq*9bZe-2_b*7TBsj%W+R)a8(p^3dzg{4(MiiKua2{hKm$OJj1Op3uMOh*Pf=6<3D z@d@IK{#3?xI}UFDppBPW4oW+RCiQ zLf*s;fA(`R{((3b)pBa1c7Hx$v88!i<-Cuv@Y@p8UshEpRFjx+M+g(UAX+@&Ewv%I zx#G%%hLuS$iU-*%^es?(aZ!U$dew>wwL4Ga&rj$`ez8L1C~VX(Hcc&x38EJ1oT;!b zb+7Z)yECkPR#%w`RV7VIyVUV9YV`XgWbfzcwft*eKV&Ruc9)$W2i~TmHgUa?c3`ZA zQ@b4S9-*6W+mP!gR$mwWrlsDT=+tH3kFT5cP{T6^azVDSV3>sixH#iVYEauOrHy@X zeEkg~eEsMRoWEN$fBkcN{W%8S=W`*yDQpD57jtDFj1L#5g@|4>!aTirCPUfsy-|n> z?c!qX=N3bwyCFM16gNx=rEr6w47mWwx~#v~=+EoH!7CtZ={;de?6^w#fK6)3T*= z0vICt%E^t~(gZo2=&vVyp_!kVMuIg6XlclbP zmTjMTXwm58MQgU90;SzKi$W}F`UCShcqL#p22kQkwMCOuSt&4#YSr@=Ay)I=2wR+$ zBNfC3uu$V6!w8svYt-C*z+ipE92eg>sdn4ZkkxV(EV(k^xZ2t630R7-$04<@pn94a z;ULl(7i3M-VjVDIU2R=kCyh=lYdF;jG-Lw?Bm6W2R{h43B)dyA$4J@+R6$Ox#G}qN zsn$Ugk3I)_qJc5sLJO>LV;Hp*-_5Nv*0j zL()V?E}`y*=JlaE0Dt7!37WU}J<}V_?$v|18RmgxmL*yvF{W|9g&DGLs_DgkvGX$EY!#$%Pfl&6BIV1;w~H?EvTzPuivq*s*yT@Er`(-PS( z!sbATlZeW(QLSg~8+d&XTzQI1j19zcv{|@V@@fa7hqsv zM+6(H`+Q4*U{)8_;AOdT{}y49#}oyv{stdVLW_Grx5q zf81GsMQJ|N5o#;S#iB73J$9%j9CEk*-@h2cvO4^^h43}QbP2VS9obh}c@mr;DYz+T zA)3t~s+UFzGzfAxT{A42PQLTJ>>ZJgzq#!)#^yvQJGeS-zuF0tUU$2*M!&q3hC}@1 zkjVjWEa-e@Cg@JstRzer{y9{YtRV;bB~g60Xo=bRzj?!~ZX!ZsMydeB@b3@d6s2E( zW+L68Y;O)4ho=odHBpFz9<3JOP2s1Y%thO^fv||KnuClxXat3~%L-X3 zgE5TR6u7-|3l=^r70x7K|Egp!pCxMgn*)2nrGZ)krsT$35IJ>WHXl;OKSd6ntw;ug z(xO-WH6ts|2!FZk9S&AAwBMz}*W4uLI0*x1Xt;xPlD(HqEH zr$+=weA{avWd`8XO*A9eU*f{u@^&h0tB7Fb6p@TZp8^^mN)V3n#M2GJFj5sZIcn&G zX^wTMxp-k4r;|10sb^bpxTWz$$-`nN?lYsghB)Q4shJwH`+mBIkSf#$?DGAFXtE*rW+_Z zrWiodJzydTgl&eV>)i*!zBiuTFmH^OG_!|5WN>PZ`r=yFT(lmCvv_pH%u&`O3_yKW;mMl$ zkP=F!`Ek*k;t8t9cy2*p>;RB^aY18mr`FU=8WN~8-p>FO;AqxpTkX{SSA-%T>Ry(@B0L(4 zcYONR)e(W2TM|OXPIOrn$zMJRc-rC|o5M7TZtK`S)DMGOtWeU?QQ$50;hByAycrkH z`4WgTt5kE24`r+$uMphu08Wg>5Z!I44H*RRS0uNTH#Z)E=}d@QG#nfqMG(1&IC5Ww zand5=cNzwh13EwBmT<>mqcofurvqYX2_hU6BpH+82oy!orp!9kQA1&P|D~VsK3O|R zq!7*_y6a#IGO~Z!&zpM7Z84XNwOcI*`P#M%xI3ISl6wcU=(i~`U@ag>j{0KW2;mQn;tFp4L-Sp_FY@~25GkcX zFq&HV>{d$OS+S9V|b)}C*{}E;9TKI zGq(;+M$7oMUwRiG^XFE6%2i!1Dt)}#eL+VXYuswrU5UgPt5f%GFbuJ-Z1nPbf+a}% zQn=7GDQXo#asbg%8UE!9L3-~va>yLQWm>o1GY)0ds2Nsl#-#1o1!hcQ*~~>-sXG;* z9npa31gL5d441qAy3O^v6T&O=&q1^NZwHO@e>rGdwwnS7K6!QPV{Fa~y4}4zV)1;> zWSFFLXp)dfgNSJo@1MCXF~W^W^`I(Jn?OvvCZ;db(;4>yMURfoe7y)sAGNy6P2dg{ z{1Na=afend8Y+(3HkF_6p1SlG(!4cn?HbTE5=nTKW%LEHn*|Ej981v!7)xv@A5q;# z*~~)b-7)c+6oZp2S38wm+-w7hoQ!0!1v1$s7+Z_D5W-NuSqjB`F!DzY_~c*fk+H2+ zpV&@4Xp{!;*{@Qfw-f$X3ZXO3=8jcPW-6skgC`XYKxQ9*jzcBS*SbI>>cwP49XR=E_>OJBEh_Hgb-I(BeJQ*6fj1H zh{OLQqQ%YVbtg5Tah`s|kHp$M73uO!UzXq&NxQ!8r6sL&YtFVt+4?H{u~p-*vJgJr zi^P>aR=4f(!TT;KJOvtdJx%_3QCADFQy3imr5%uBA{LeyY2;TYpnQ9^>iJRYfSu6!g&_AtZq?2ux{36t{|V%ZwjO|jfupmsxq-b2Bg6l~*wX*O*u9@>=j~a#&_tBIu>&MsX+D6+#&a;vjlwG6^<|(pWW}b&)iC<}U zeq;5(@|=4QY%TOE8G)>b-^xSD<>23N;_&l+xJZHAf8OTLh+#^bbBdwmL6nP0H24#B zrzh$QSiXQGV9A&7E>^TUGrdwarF&3VJs)Q0a_cgucc+hY2=Huq)y0@1o8rW2IlW&! zlCBpQFqg7M;;#4v%f}Q+`M`m8j0Fufl8!Tr)S@FT!NM4G)WD&zJZ~(W2$&{`#|fAD7z>7y zkL326YJ5&PWTarZnm##qq9@8FVTx}dF&NT)Og9=0H;x}iBTbB!tWg`@WnlixToU2o zX+{eou~*lr+SRtY5adFtbCRCj9P5SnbU%!YT^9uKkT8R?kbK1T4f5HEBaQpsl6+g{ zM?=Z)RnKD31g^&Qe%bcg_nY7M3$R`0hOx`F#>&8%H0ky!^w)uSb9wZ|px#yCi8^zj zoFj7YkCjTr{1wKuc~2~rIeNA2ZPmp}x%Kia7ItBr*u`nCl*MF1oY#w(^`UMH{SfBe zlk(s4C);MJzM}PkcIiSEUf>z-TXqMJWqAtdtt`e-!W6?b3mGiz(A%g!it*3} z%lvswU~Z6R0*Pjj=k~w1S^j10R}>ev@qaURXZ%>G0$6yRM;2$>*fD%EMliw$Kgr>X z-4!NGI0q0vKqSLdBRp}c{R_u1tpYi2kL(8Ey85+CdnZCn;$zWLrd`lA7fFNl`Ds`mf>KitaXIq2Dn{4mZoIDcjuO!iwtzP%Cj!C3 zdFaJXFavp)?aN{qesxs-#={V4nAhMY0cl92KR5|d#owoBXj&-VX~z(5j<81XgmZny zF)bgFrE4(w^P$+?J>i5jTNzgR8UB>`=m7IpI-+mcUV885Nf*9GBRwZ7U)p+}4Fs^mNDzSy8Y{RtAyr=ZiX(JX4;6a)kmYMjG82LrdR@NRa+6wdB^N ze<`}6wMgCGRVu|$Kyxa;7Cwz5zZq_Xt5+Np_7c+R9Ybp353LVHHAPiQ zu*FVM^&Hl+<0*c3^AHXEN;R&T2LL`FdC9)i0z(_70%tH5Vc|eN1wJ2#H}p?_Cw-x6 zcH}5nyWK8NLnk#W!XXih?&G8(Ypq}_^OYv6FEbi*6 zC#;NLI--c;jw}R8wek_RiK{474e&E<{^^Ds-7Zr>44<&9ascLY47S?gC zan3{`++#Y~{}m$C!vrznWib&o2(CZbS5<&1Hex}*8T;_;kI2UCNIL8v>rmZ54XP&W z5-}u*SpfK>IRQ%yYLIx<6Qf23Dd0WvM6h?`V8R7efP>t@S@qBmP*yG;SI}9^Yi`XH zv97puq}Yn@#u$xVT3F=9>~ILPAKMI$S&ma@8n2m*xRH>Jk zTd2HZex_y;yabj|JL_Xb996&_f z&S+pO^hSi$8X;40yW#7NzpBMdoLuK-{xNsh?%VtR>cijbVbwFB@4UG6>-j$Y&Khgu z|9N?IKJBmf`ri8d9L zm}kjgXpKvuEy=CAOEBqDN5dkIni4pN`k-Hxi9N%2Ij$k>X@68gYB3L4$IvM#t^}Re z@rr(MSaM~GdRT2LQ`4(n=#u4Jiy|Gfq3YBvRn>3XUj5SSfY&e?VxmJ_QwSpi1NXL# za{Y^_*3bZ%iq=Kf668pl)H1@0TnwAvEO>?<^ZI2K&==YDX zYts8HbiUX1?csjf|K-KSl_Y0a04&%J=$2`^&>nWWS>@%CwABD*ZYG12yLGRdQkgFf=JKs!31gUdq%*#|&M14nC-y?Cyt&Wh#w< z7zzb9N);v?9a%I3#Ji_hnLY$K0bsU`IduSU8*oB-+Ra1fSoKW?v3Y_TN{Bh)<0G&*q-;l}Q>H z3Q1KIUOG=dQ_d7SH#wa(ZyI;n#%%H$V{_dDTH`UKj;kzWox^?cs}0CLq>23U58XOY zM0xBF1awzRB;?2^5ta!rauW^VRnyy(Bf$fyWA9mcr%_ZcQat%V{FqA&@9>i>DAoyo z@Gqr8!E!xe0DZFhEF2l>UB;45M0!1r#BB?Yop~mDLUPjfRFc)szoh-2BbEP;K!e15&g?i zKEYF8j5y44u}&hab=n;0zlMzkjs@ngVS@2*^!NJ@$hrHlcCWvg3)UB?G4h!Q1Ybak}D}m zhjWWUOSnui?Hbp6ovW5T%I1eF>SU}|`h z_PJ7Q_I*A!A?X9O2N}w3OM%a85ianXBY-)m829!#NnioUSdlDy{J8)T4zXr2LdH!y z@&!zLe9krzLP*~-ivW;U#?@y=QW*7Iqio4QA{%%0CMTi#J-J-w`JZ!mpk~;;2p-7m zq%Z5eUIO^){?sRk248NES-?+@)}BIrp7pVUQjix;*e!rh_1J6)7Rh=-o~TeLA+Y{cov%neNSd7(w8>?E7K*f!%E3oqlm@44Y((IbYu!h2Q}} zT4EGha?H&Hyt6@d7Ff}oH$dh!D0y))L$bAJ(pVP|oL5O}*4O>xqBbjB!3NvJq3ML) zIAUVD3Cp(1Do&exCeu(?yp@*N-1lTyjx~ngc2#G%s4eM^KB2=y%fihs8p$-7{8$SI z9OpF-Z|;!OWlPhgrkEem7)A^;4Uj#i#U>1KDkc1p9g_dXulIMzKBf~2NhH%-Wg1LI zI%0Z{D0aM$*o2eGjv=6qBVsfV+fU@{2(W}jP+Hd~(Nh<8%o|`839-z>jM*-x&M(cy zfW+jD9=F7N0kpNy-}2}{?a~!sMw-SG3_Z42TY%M$V9jI?Dduu`{FvJ#s-SZB>j-kb zYhve`9)lw6NG8V&BdOvPI`%pWMQ+eO6m8gI<1^XscZPYY!lt+ME5Z6llEzgtwwOR3^i_GU5PNB~1hb!H1 zqstO(2`hI943nEVE}UWF9xPZnXQ(VDz#^sLx|7xs6LjvEQ&?P0MF3`_BsoHvuuA4` zgNfS|vadVu}Rynq>+V3EUzu zo4*tUrMwjUE@KfAkRN2qu%rBtn5HBRoHKuPbGpox#}G~kdaz(`7zA^KeC>izyiX^b zBh`2=6k!4p@gxluO~Q*nQ-=eJ%&F7XJ_oCg|EaY${KZRFVb!#ZZLfqDcidLzr>5Az;5d;sTiL5$akrZ7~?L zE@wY=F_;2G^h}=xRP?&^qIY7?lqWIQw`{+z!vH%h`l@^J!2^fI)Tm)8l^NjV0a;xV z4_PQTB_z!J#6cl4vjy0GDva7R1r}X(PSHUm;%s79BH6q zMvQ}Jmqd66bOJzVC97+D4by&-pp1WBDsfP}&x;mUg> z5@c|cz>*iqUrChs#k+Q6KOG&O29P7?c`YrdLLD4;5iPvwNM=B;V0}hRt$Sf7qo`yc zrBIHvOuDT@d$CsbQj2xwVL&Ik4+vzwtad2oOgW z1Kk??L7{OZni-@7g{ozj&DnX3)`SuAK`3)&4sWt^{54v-J-wQWPan zWH$-&kwA}{0EPjghMj~7a%K+$>M0xE2i)`B1|WX{Lm2$i!4vQJKuEHDG7I$~+d@v`A2UVd=~h&fg;poPaByqdAH? zdV%Z<^7i^x@XP$=;2_09@9Vkq!+A(>**SN)WkV=TYSw=PPI-HRHjq_nZO~5|e_PTUP zfy?&C+63v*=i<4Bd>Flf`zMV2_8*<=tUoq()+?!iS$|7-Kbi=;1ksSwXkJolI@*0n z3637_+*WjStb04m+m2hhvX-KehG`+u=)UWV?yF{(l8DZ19ff7!+b`$xO|cXf=Bz9O zDN#CTpu#wC?Ow;+_YqA==!Q3k#D(Tzb-z!aJVDePEFQ=cP}U=9IU6k z7}B;4dnS0WDOK*iK7ApKX1n=jZyZwf1c*}IQo3HmFlqjZc(TyOA1rnZ`qru+7Zq;MUB8d zcN6vQROFSVyUXuEQ{`x`c%24!n|mDxxBmgm@qX9NsJF4?Yu&-#hToc9oQ_Pu`B2TY zI9a&znq@Sv;hc_QOFpHMT?{|iBwCWua%qCEwqEbHJukNGcX3d(FZXH#DiY)3t8zUP zQvGI7N(yq2f%kB+hNx8G>comEHya=2p^`{fgItOtw+>x-%fsx1R>9Y1%Oz0OD2;zh zmXOiA@;YJaH!Ik2Er>Nac{M}Fs}Z4G^_{5*a>sdVw)dig#Mw>+Y*Kw)Z?fKaX~qup zk97A5x?+++%oij;Z*>VcrkvU;k@mYB)?k&zJ7is}e7&p6P-2=@Z}XM@u6#;$!Xhq{iOxnhuCIRb zoqa3tLZ!|xsRFOEt*xoHYkf(6RRZ=^P?J+ToVV;&Py36I`LK_2uNgsR8fe1O?1MK? z5TE$(vR{Q~Dfb(C$cuS28{NUH`R@3XA#zGMT&<%8mje{)yP5L2DtqdO{T2OdiPhz~ z+98xsQ#(8O1m&^NDy5z)%e4sN7=gg1568w?BV}TQy2zIf*Oov~UV?F63rkzGPor?J zdR8oYE&zNlA3|CJHqYOBkPEhXIdd| zym2;LYz97?8h=*Cf$<6d#HCkLD1hqtiXn#p>DWKqSpTYjn#{w{5^SZmx0~hPuDx@< z>4i%o%AM<+ehfIl2rIDAv-q=Ots!t`V|IXP%@axi@&LhCO73JyriZRBf;M) z`iaz@vjv+AxJDL-x2^KA)iOvZtEVahZea&`8;)1^ROv9y&msn^it&Z*RieiF$u|AO zgZaH7;Kg?IEh?|K0oXd=q_+gR%C2V*)ZPpe*azXA(}-AI=&2JN4nXS9{>6SV`cAc_ zpFh}N0^Rf|BEI?hZ(K*fA=bTsNV1N#Hd1G;6o@_>0tIAZ*Aco6Xw|oBClDX7xC-tBPbIqBP6^cYamrM& z#R~4dw82}FDn-PHQ-ilS*DsSDi9s0a6OVX2MFfJpCNA!UW&+F7vG!5R?63iTMaqXP zTLID~%8xtJpF)p-Wsm+KB#38aYH}JisOHvfFLfJv@o zg}NU(5fL-Lltw5>$vYhQZQ_i%Kiyk*BBg&jSBWE5JhxWmwlo&!y?Yq{qR}$$>D#Iy zVj=nITprlsu{7pB}aljNC?H$yp0NJvpE zUUIXN#NZtm78k#DIhRI)r1Y~wT+p0nGB1CpnVRQpO?Jtk(z6oxcNX>;&2J`K`$Wn~ znl-Sdq~Btq7H8~_Dkq-yRzjzzvIS1uER=2(zZ%Ak&ch?58*f3AGTO6jy;MjsS^T>7 zYx2XjmC+?xY4eLe77=IfDlpxthBQmOeY#Vdi4dsaR%7S4kpbEY=7BtXtMzb(Zex&#$#W0DFUd7FXd)lbPQ3&|7q#6t(#4^)%spAk>! zmL;3X-bIRr1Kl2UDvVsLt^@?kA}$KLQ4sl6%o3pX-vNWX&Y*KOSvGNz?;Xyy3;d#? z46prgQN@lW)7?FV$kg8a5TN6q=IidXA%i7eNgyS&C<{fg-T8@k#1*>b7Z{1AlS(T6 z3bmXqXw9_$_^^$ySHvn|fuV(M!K=cZ78ViAG77z;Rw9)`N2+W#awzzCS@7lxzJDp_ zu@awb!8rat+Tv*BG0HX*8M61)HVZcx7+?ySWk79@C#GiEKOUKlv;SkRufq1sMzS~! zVML9pMGhZ$#KcGd*t~R#ll|3ZlgRib{jglF?$jHlgNRAOc%D6rMWP&KVv%i@uF8pf zLW^y7iNK+`qzEn#+AVUufX_Z_O&bM=s`)|)k>0{<BQs6b)re7o`)BIVPA{x1}}J^cK-ViTmPV z_Um+Y%TbQ&ml4miPAxZd@(2h+WgAMSNV`x`-*keI0o!@&&>Yp_y(jrMF(BTI(=3YphakQe`kB1K347 z6CzDC3>Te?wh=6yE{C>x33+uWowBp4e!7xKxrJH@fKSOV#1$xPJwM;G4D8nvR5DeF zia6+mj(q1ItIevbeP|@RjEROn+QbZGD(_shU)FYn;G^6GLe|kIp3N^AfwL~7IWiem z;4xj4`g-@!LJE8#hxZEa)PAlnM+4h@UjZOQ9bh^=@A_YUL8YBE6V`d%YW=-UqEKS8XG{C8#EF zL*^7~Spum=R)&hybBRB_#@#jrC7qPfo9f@4rGM9YNe|3no9A@>op{VMgN|OvfK+&V zqu^Mo$Azk;rxonuinP^N&En5nJUq-j0lnJD-3jekP^AAlx=FcCfRLab=sR}ECKi(! z_DgB?w-wMBY5M*|ELSt;7e+B4=Mnx18H`Tk-upDly4`JIz;@+g!WM%`4O;n)u1kbL z1+n;Y!w^8CA=X#o*Y}_{8Dr?ApqlVF%R&7oV4^P7WdJ37)Ii(@I-(9Yu^z6?oCPRk z*su+I9VdZiz}|pSIi}xechJZjA{1G_-WR5I*hu_EiWIs&lrq6NVB+|KBo&K1ASKI(*;UwKFykK z)MwyoQ1n*dsylr>P9C5>$N8a`0sF+EQWee`EIai@uw8usJp@FTxh(%=H=ROW6*!AxMe2k@eU0a*t*%0sZR zU1D1|>Mt24=A?5m49QKA7z7krmx42p>5Y-bqq<9SBo0=tQ1fXQL?K@NQFk}~-vI;@ zhm@dhS5teY%R8hcfitY3o6$K&O>)uv<2xl>O0ky?_I^ZwG5Z)vuP_ZV+; zGTW~b%5lEII1#5Sj)^>!qK6EJ!HChC^4RuH`FSMv>2? z*kV2FT>Wl|8z}VTV>e&OcaGFqGbh*#I>#qxW7iu*C(B z_Ji)WUdu|FQuDB;`%Dr?9%nEV80^SeTzyAME6$Q{9n68flM$zhVyX<29REF)gu}DL zfl?2jcj~@2l{#g$vHYIx2)lNt!CgJ|5hl;_D{7@m5UU-ew5fCmsjP1q(cC_hP)7Pt zd-(VAP^I;GJFaDWQ?+Cht7YYR%7|-`g*df74HAWV#6F582D1{Vd)%-DC{vvA%%@Ak z(K#1F2Hw%^tzG?2ltGmUrZDnfhfi_L-X%n9^UOS&butZ$jHjrQfjTms{f)6H%31|* z3`xvwc`+t&uC%8Fq-K(_;5`{vF3{h@eXcL8do<`S=mHLyrN2KZCwWsz;E2X^ER?ly zKs><^Rpgo=P%wp^7_||>G{tqG?KaUaIzr1v+Q>C9d4Bu(WlH&;u>FP>J8SOJH%ctn zQye}(ncPCyU5zH$vY!(|yRga@P&{%cBZPw$iy(yCq!ow@jghWy;=~Zb*{~-@vHg*# zJ=IE(*Xzm}@Q#n3DlAI|@)r>%y5R{7V~n_fkoXvIzz{;*nPS!J;1Q1!5;uCjLI~7@ zMW7hLI9Q3rUU8l%Km+As(oSf@zw+l`WzdLl+}I+=%PKb}imgPs@mL5XasdZ>cY(|? zaabOLc~$*lZy*n04i|S4I{Rfzd`$2wrI^9{TUlzDEc!rV@0r+q52I#A9h)%m<@`Y* z%O~_~`blXyT$QwlRVr0)7jdTvFl-7qzcFB8nN#pf`YX**p`=9Mue!PasNG zsrUE*C)4h$Pss~pU9}Yiq<|kglJk;ewm=AEx30)W5L>iyRt0qgb3J#NH-t6gy-h>A z&c@_B!4Ac4Roe6CN(PI{#CnF)27;;rV6a|nAI!S>J4L2EO)zd_uDSmgKZYOc;Y%4z z(@^FYtQmG_+0J*NzJH@1bIncFcwV#kflKD8YWo?Q!Vy4S8imrN<>tp@;jo6jdiw~o zwEb|oF|4AYv^CefQ-O{MmOf9c$tOvz%$lEj84Ho_=MP}WDBJ$eBwQ+$1@osA4Np*)E%(TwLhR}(+sdmnSJ$cSB*mp&B*KF+<=c2n7=ekj}EA-WB$%l(*%2C z6^lnaT{W*>niLN0#3wn`X9tBdm!(Yv5>|uT7MaP%qJ>b*S95^gS5ZA89Jo|g*+Bys z!j{HOyd)4qStiwI`dyZH$&ArTvHj zCF(WraMTUClJRrUYi6*}aY5{tW=BSpSxAsVcZ~Q8Oycc+E%1MebUq8OqboG}Bzn!?in-OFSdb;YT z{!F5v5)%x%%CdZJo-WeT*z6AZL>%slj)MBg~ji3Mv8^hnS1gz(^h=VeI-cd_pkqau(dGQ6x z2rfVl%#-saRP+FOW#XYI19M>%7t9bOKwKYF=>oc4 zoezhpBkx6sumlkGQdS5|6ZvFkpuufJGD`)<@i5JOgRo<4zpbeT=4Q<$;-Ut&GMN~i z%I%K6o1i`!0T{`yT8-gWm|%$N*F}Z=O#u3vd*>V=h9++mB119eaoJ$k3}ceUyi6GT z+pZZsHBl%-nAHS|FKJ`gz@MMgAD~%ZUH24~L8ne24TZLuVUl>6W?ThFUr6$XQH`WQ z%(_UQ^z7y?RImS*`U)8+`s7yWEz#6-Y*sg&R`D^t09wn&nM>#7j!+EULB4HtPTKmM zNaw}BbuccUHrTjb9nl~4I$5GB4|*Lxb;P}WhnCq7ppU))S{$|kAiSXe3ew(>(N!|1 zdKQ%8L~6>X>Q2^WOlum`su)@Vurd}s|3&z1I4xsvvZ#{)+82tW9}gzNi16`()Fe4s z!_1$fiU7J=v|>vTZBiF%Y@ePG8q$Xleoltn`+{FFS0m@=?3Dcw-OMpWHb~HST10eO z5`x^kM52VPDV9llHu=#ivHWEEnHi}QhQb}dDeR49Ek}W}vdk8ji)o|;h1oMDhLP9%YV9tpVS5EE@Y|n7vt61#?+!8(r?GVNzT9Fw~F<4FJ z5QqLk9Q&oq=|jLr@ZH}%FF4*4@+(d26@l(2qQb{Gz}GM`5nqXf#XoCMao_*iGd`}R zTF8Iw89YA;!T+u8{#WzoR>G9U06jwB^*xG*Rl>Sikz{i;;aF8sP~Zb~W)7A=>IHFZ zOASn&R2)3%$he@c=sX#7N55xt`V5+s=6eF)+dvfS$G`m*=z*5k& zqxxWng`f;>;0eL|4(Fd7>q~hce%L2JRGuT62FH$fgvTZC6Kh%%m1{gVxiMG z8~+$JjDIHj-$VU(?~a;`?T=HVYo=z^5Zl6%@1p4$L%{tk1w`^cP7VCHyX*JmRghKl z)g7e;ETao!)2FG)jaw$znvsF?xv12|n8*BVo(Qc+3C~n-6upY6a!JvpV)yi#$Up6E*H`Nm&q}|Y zNx{+j*xYJ)!AHi}rIEfiWpHiOgOZH)4uQc_ei z{_+~yJH)bU5lgo%uJxPmuMe1TL?lEtz!TUU@+}fUPQ(y@cPX$QXh8?q>0}e#igeHT z==%4#SvV@4by7*1XF+&uVylnGD@XJfBM~ocaZY1S)Zl5E+u*ghTHPW|6LMjk*X`>( z-5n^cLVPRD9SF_ExZiSDq?iQKuIc*d$*SI4aBR?O-V&I1>U@?L!-j3gb0rVnvY2GZ zTkU! z$I8q)VI5O(0*}c-1sUWHcFHpICk)9>=aOTppjdFPtC@yy13UQeMr?v(hH-=6 zF}l=?fRW8o0xSF?p(1&3n*3kiKk^-z8o z;=P^!1eG_u)@2dXgr95}_WYQ=B#@8*yceL&6z7M4H_}FSYmBl#%c}*`tyCtf4rhJTb8kZU?T@DpTkrSF>+);9@5_5VzVBE3rR%L8 zHU71BIonHdyLQf?fUXOuWziq4>-o-R^tH~-+)5VQ|We4DUGhScquy6ON7VmdHBFS z5c1mLB-qZex~Ik@Gl_Ti z7%Miq#*%jd8YJ6lHfU&&36tT1QvOVr%1on`Rx}dUIeE371gDR4mgi!Rkv_{Jv>>n~ zbbiL#OzZA#iH)6w-}HWGTGN4CV=8HkBvXiXf58;G(S825-0~N``_vzE@6hXPU>oaz z>Omp?&ObF1X_16QAVF#NUD3b&!uQWY`*DjG$3(VpoW>TNaO!DyjaKb8R8|EljlI_I z{)gNRJeqXEP}o#qVFan0be7cWafYkUE$esH?dVFv>b^C{GQ{ITFRHg=4VsVebxOPBJKEY@L<1 z{2yC_W}7X|-Df0pwtq#{Mc$T9E`Ye>B-w5h#1&5|_YYDwCA$eT`!C46Zx66XawRw> z6=M-MTcSLduys*BG#gDBqR@?P!hv5>vOCY({HS$&7*IYs=pgLwR=cGfugLt~j$n_kv*i=v;6?TdjIk=(h( zOuF-5kr9LOl@8Sh-306Oh1r(6=x%FIeDG_FTmAH>#eQzsLiDrhXivWktsDcT4$}7M zrARM+f{7HJ3omR0P@%0q#AN}i-5&oYz%Q-_w`b`TOlzUmTLb-bS)OD|0F$ZC)^8>N z!PKS~x6sK!00POP?}{BA6K&Tv{}5pJ|4)FKb)7Fl63|}{*Rz8lV1Ed(t}<*Ra7I6-Y{>=?M z!qR9E=d$$*yE+6hOurxIXH)(3{W|Es39#0`3Gj(F8#7P6&{tU1ayF+g{(5^zCN_9U zcuZR^uYW0K8dCmJ_k<;O>#GbQt}F_e)2%1`q=36vk5Xpb9oYQ8>g9-dtkv$HRr9MB zQk+ltVQC3<=Xi2Wlcd1PIV@`XZnjUky6R4Q9GmgSUbf-SLKwdP_`fZ~^-@Vc%jo!K z-J_D_TFS=JWAt51VDCzfuau}G_X;DF;K$&;zDfR3C%>JJ+w6#`VFFpi3qOV-1pxMX zAe$^Hv=ybd@6yGW4$(ojKkTRf94zia&%8cg7+Sy_H1FK@_twYL@j;Iez-UDD@hk;K zgLi@V^Dp*d0}B$l5^dE>OmWOPMA`oq%IM*GoC^8l?b1&dJskouqYlhlG)uJp1PwL4 z8ImT#>J#ZZ;FUHbWMO&mXrgZ_99k?(% z*iF{{Y!DIW$#xJm4TE*MNM*_+^8NZQBC%lvTi3~X@kgV z_nPKG7Rtu5V8m?ql)*(LtWR7;+%vSbRus5trb=EGm{gHcOq1)dahcKgRN6Q#YnnwAq`|}u{At_>TbEf<# ze;`^x^m8I+5AP{5kdL?5hN7Q@A66If1579Av4#}Dy{uW;=T^d= zJhnRCD27&8u?=1pU9=2$(}VDQEq(JylVYb?(%3R8dYaij^jVN|&BR-|Aea>(PZGY2 zOn+ennafT=g8rG1`O6YaSCT=Ml8;xnI%_XNdyG?sxS9sYLG&Bm1t646(Ypynez;U! z27M!3 zY{80fDiZ8STq@9Nj1xBd>_E||!r%C!*BO+k)C$w*6vss2 z^d-F;t#C!obJ8`1kWH+YGRrTZQW4pA-OMv@eto$u@v14VBcf5j50Qy5=71W0zpgH_xp$vy3+gP)r2WhE)8 zo2~N>g=M(3_<8zT@w2u%2XV3}>NruF^snDZ;w%=F+4*hJ<={(F9Bl4qfXY>8#HoDu1^6&Psb&4ZW z@1kmazkrc`AJ*-k|K>Z760;+-hR3dsg?Jeea&cpH;vedTmDuW%|AS( z(p7#)`!C<*RasiMnF}9I3zY{==>F3zt7)=(u0gRiUR@3%F8tIxz2GA3z!l<5T|4#5 zl&k1G!b-gC{)K*D8W1Me#{ zGDR&7kTjV6$)aBrNH0*0z6-iy@Y!}_#0#EpdgIHRtH?)E~h>@-? zSnMEv)UW(1Q}?7?G;NM7c4gH=v|cw58M4rX8*DtS1~w}vJUABn(JD`7E2la-F+;A@ z!-0NhyMjHfv)`YuHQz7y$M^#+I15alUwVAr-wW_L-XHfhKA#U0@HsvoX+56L=W^fg zr|?c~u4`MCwkZ?UASrEgGv%XB@P)Jb4Gm-ZD+hmA%q|`qp3on!GyRgxTuzalql1(< zpB((scv(iL8gm63#k#tIzJ0VupNCf`Crm`<@T%#d3)D`C)`aY9U<+_<*5Eyt=UUpN zF9x8x-koYa)txp=!VV1`hNwU~?+bLGOnc4ZZgH#FO!oQVS#2d{d)%FdD8VnKO}q@s zqy{!??|O%XN13m=?QVO6mKPr%7lyi#;5yWmf?8CT(^LY_l2Owc8ChJ!O&Jc?t%d0K z6eOD!C7&qCy`2yhu63zRHxpgo!$CIxCi{6932ZC$%8a;EZ-8BZ?&=-CV z%o{x(C|zQc!Ws=)om^=`O6eWj$v|L)+! z%Rav0eh+VUH`%4cyrZCei_{FfCB0v=N;m9s?+^dWLp{a{<_iL(6R(`yFuVCiTD*TX~Vd8D6F@tFo4 z<-Kmq``y`IR0o66@JULt5E5h5hi~dENlL8hiZwIh;hY|1vrgyowIWf1hd~;C7~`gw zE6+gB*7EWtTved^ws7C~1LUHj&H5pj9L8x=I19Z}>EX5lYrRe1Z; z)V~FYe>w_R68;Q_Y!BN~jW*q8vau7ajQjI<*ynvTmR6gi@09O&?kb)cdx=*8nJ zT_g+!vpVBZZS6=&7jMP(5lWNZZS)#hsh1E`FjoQKP^Ki=m`PeS!;K7@oZtsdwTDd& z`+0RCWjKrbSy}}r_82kAO3>A6{26`jTXYFg87vm4Tg&mrE(oK}yntEBgYX zVuxzPWd~wz)Mg0mKl~hZNS+7Gf|ObTO#yFc>M|z?5=o6rnQb<1b^J za{6zc$Qz$8m^9Brd2XN|PNq=xI)Bv$#QD!tW^NPMErY!8raG^L_}X7Ha&%H5%*g9f zy}f*yU*#N660uF#Ed;Fl=Y)kU_Zoi#)5*bHfJVwE7Oz1D>^~|>Yt*LQqnAqY_%r>P zjh7m}`U%Cv5wmi{{I%g+6jzlb(j!8>#cbd+{)~gi8+|fvLhH+3--7qaclNbfz&&~! zu!^PoMs|8?bS(b1Stq@UTm{&c=2*|7UbvyN=0*(}LzLH4fI#)>5QyryTuRpS#oovm9i^Y9JXI2sU*2H{9L%mYpnh4&{8w zG0xu($M#fV!%$TSgehGH*=g(0es2T;b%`HGf+|Z)XT8%k=pgF)tv*1sMTd;}vxT#~ zOpyFTsw0KgI9c+nahMuO-V4R8Ctz`hm5$IiI4;Q8DtggKy_zr3og>;0{WeLn?U4VH zuEaJhuyppd`?n~b=zxqF=lUDsT1iqH1o_GmR@~7%m$@9bbjoU5vzEwVn_{%j%I6 zl-coQXr8cZ!rB*}Y|QBk7LjjeBaC?CKn`i;Bg6~9{0gs3NytTq(V$f`hfvWLjb#|F z!xt#vtHTRM0BQOcpoVlHX4UHP3?|?}GfVQ16o~$WnAZX4vG7yV*{Sb;G=pBFlR$K_ zRDhe7!H#2AnA4=yVLN&(1tkmt!gzZGK__M_E#6Vh$CK)6+acB)m1t1of7e^8h z#VNLz-sa;#8DOhY7z8?2*;mdJQSHX+G{qx64Y|tkm}o5c6FDBW8ui z2~OOBLs<7*N{b7&4gr)}Qou?PO+UySl#>_vquO6;g)nn>0qaC8G-%)ng(vJ_c^rJo znm#yuFbce|e{8nTg2Xe>Z8$l*94e(o=}JGe_*7sWAjQuP#eT6EY(bpo1Knh=mEX*4 zVrEDazGxCrekryA7UN5e9@@~hE0{Uzs=bUotNJVWl*N9(RT%r2M}HKpG^*;f6Q>k? zhA%MTig3e8NXMC9BFmpOLkM!+2w%V_!K%WLBxJqKesXr0I2^8&Mzk?!-DyHc1iOyM z#Hs*KKnn_KOV}DhL4Tez3Ul2v$i890b~~mOmIAmO07~?yTtRuGc%7cgo=EmaI(e0y z7J-deswk9ADb^JY zmRJ`BZ8`%RQ9rc%NrZ@6b?^T?g+_UCgH*Jp2-Xot3Vxk7Nr|YEk5D@lDVnX!Y*4*Q zyj!#+3Q3qeZI6>I{tLw^h$qG4yu9!FQ+#8GP+qe^r2MfoKoIA+UAdrDW7QD{O}xPK z9m=CVGn41~+R81o$+j404kT4yRZvPI4ZD-l;SPgi#9n<5CYk1Z#*=KfBh_;6F13!p z9bkVTyb)!k2ho)1rcorL!mcfc5G(|tst3+~$Of9C)mcvdb z808&L@x((s?pgri>?RRvJ4bQrU8!8pNAPMCN44_|STr_coXgVG=c>;|w--ds^R z$|5;H(WL^JmgWpXB3l8oR?f`Qo=I$m<6~K}*M%YaWFh=BlxwYx%9WpKj7VE1p?etK zM5T+4X%5uN(Rj1VLN}0$doNj}?PoxXg{?8^o5HBoDVa1N%8?K;6p~c-NDc}qTS*)g zd7gwt*;{`(@ENh~fu&eMn61=P}_!Al?u^1<50(>2x7p?13_ z^x7%aK9beZVgq9gvRpN@s{)XD;*cEb)Q4TD(aAj|g9HPhLoEW)(xoVVtK~OntD^z+E@5pfPi!V3(3+1Qwz>R#$Y;}rf3W?9OVTDk^^d2;@Yq?gQgp`f*l@p=rV zvnSN)zj3}CBznFy=eNw>?Lf^ap+9Su6GN3bQa62Y>@-a>1(W3&rrM%x3nv=KA^<>s z@cnPxGz!GO^E93+WRsWG!uaO|8K)==q=>E`5I@-7?3m(v@rJsO7St%O&Cp>Az>Rr8 z^6^}6ndOVmt ze2!MjWaUyufpjUZAqwSf%7>j0jW|?>hNxa%tzwf^h`dnDXjj}NRo|#TiE2Ay++{2}>7Fwj4ALGZLzv^XW2I)bc3H;&F!y$D)x@CYF`ArK-uhC`Ujgq5}c zM7en$v|(fxnZSWd&fpM8zy5mmEtOyHbO5zHb>lu&iA$-dBPhrS{Gwm*gMe-xePzsb zW3%x$YAsS-Am(zIfe^jQhZ<>!h{9R%#% z&xr_P95B#98>eY=m>WPDUzfmaolut|LN>ZGa29R!i^``Y5^A|Enu}dCS0@Yy_d`I& zGE~qM`ZWY=cK9(Hy`6-Eh#tXD@RGdz7HbV~1Pd87QN<1gHul}@_G6!aC`#1F zL3a>JU!Z^`tjypx+YQmhBCa`4XoJrBcuP4Z%7Qbf(Owe&cnxX}4O3C4oDhpdOjV5H ztG9j%ZSVKjS6)=EbO1L;6P@vOr64WOGDj!hTTktH* z7r83HBZnQ7CvX(hxC?_~4<=(|ci>A7hB2x?;PphV=MO1(0G8}Y^)ztVC%7IWlFLT& zLB&VR`*oDr`Ag$t#OMLqH3vSVkuE-V{G@u$di;y@e=Uzx>t`KQKP;W^|FHCbmBel- z_1W~(!*uo3+}H;+g(C~D{{phfV1*ooug7QHsAp{01Ijf0thY;wzWH{pz z7AlqbLFuL?Vaz1bQ1^~rYp2!=ZLkc?8Yx(oYtr}AtBMAsWoZzz(|Qxq+73lvh6+i> z*F4naF_lta0YaD>^AnDTPC41mFAyQ;yvinoKwBTr7CI^2>pAc(y7KB-=X81(ny3XB z%N4dhiK%@iE8Fr{oZ!()rey8l>zkZK*4uh0dWxa5z6L{#^!*MIy06($>Uf~VPmU#g zC1ukvrpx3bv@L5WJSF|Bv2g>VmVq-!W2h7iODf{;=$L5u^A}xs6<#i5!o!E-ZvaaKe{O z^w~4QB?M+n&F;E9e&k-S5RqhN$Lo&oSjLGtVGNjJoo|+IVx^T;*1DC;*yiN@)45B7 zR2;vG5;Qqk4Nsm>%f80`4zOq9U4#~==S}>29aT@dt%(tsQO4d7ruxpBi9*C!DyfJP z^v>m<>7fOgZWu-WK!^a!3RuODsMFC*Y zR}kxxx}JQd*i8aGdiU_jQxRb1$er864D3vPjdg+<9XG54$k>igjRV?I{sXkp``JDU zpe}&6VHnzDj@a!f>~WSQJC&IAuE6`BR799JO@AJ0t+PnqnrW3x&BZ zuLI%_Jb7!qPV?wSyi~HL*BASiKw=ThNpMy6Q_!>a4%9dyEiPMe@Yt9C70z_CZ*VU#p3n z4OgQ@rNw3zm1Q zs|oKWH{4!P(Ry})n}i( zITV5pn{*=Ayv`E)mwP8|k04ouh3nnS+$Mz2$8~hMye_+}PS-WtC4eFtDrVB<>y^9& zUeDXp7pk1HT19Z!@odO>&^Ua~wN&ne3ZDHvm4$mUqixQ3N?QPUrXfajW^JfMEaW^n z5gas)C`cL&(uZ}a&vCgr^LuSkL8w7+DVZb#k7R5_e3a?K$eLt+lQ$<2mW zAbwvE65iNZo2JQ&ECu83-pn{QMc(LR?t7TkVcd;5fIDe%OA!_&p@X&|p?zsX%q-cA zYHb>$Vb|<93MmTV8w}VnlZy(@hA(q$38t1VeWF*$zT<+c^8lpYG8`8UG(w->Pe#0u z^m8f67rVK;C%6kN(Er6v; zPYM{2IBC}|kORkpM=&ZvDEa142DCDBY9cC6qNB#UmBwqA|BtJ4iq0fj+ih&yw#|;6 zbZpx;zu4;7w%xJqj&0lK$=?6f*>`oZMvZrjRqLXv=JQOEZB^I#(C!OivZDGg-AaIF zsw|ttcX zovr4T)_PpX^@J-E0gcd#5%a`;D4Tvx;*rbAH89+&wA03=6y(fJKBEUOeP* z!t*h`uDg64bW_`Kx)NStMhdo&s8TAPDj?+=kJmSudU{#gw$Qz`tP9;x?r|OEFWb2J zS3xnT=})0LC0L&zpsgx}l+cJziQoxZyGNZX`mDZ1ouBiW|zmcL)1x?z{$76}w*#4TL% z6x3Qa*=KCYJD&vesk8%IZ5-it1l8;BO>H!IHDH3o??PuDNsK|z>;RUVx=ZgMDu@7b z=LJ*73Z%-g*8s74F(iw^2!sWcMS~PS+_E<1aun!^cJOi;|$a_s=WL>#z$BAtw^*!hAOND6LkGg zJlo5SyEL!83j!AHJK5+yS@k>F{yit@`%wnKdGG8PjyQuU1Liw8T>f@Txim$JRa@0q{fz#hH_oYY)_*P*14Y*a zM=osg(#PfDZw{0{fm1(+D5Oeu9fUFN+x^p|=N(Rj9x$|lBo$xCEt{awfemrDcyvJI7 zV*K&_F^RnX#R;*|-kZdJh2C|9@tifT-Hq_(=#fMqEfL6w5@Aj1>#)D6M1qWn&qxl0 z6@`+PsaGq85;ae=%Y(!kfZq{Im15!%Ui*OH{KjDd&Ed)EIhG{~TX$-_%)#DE_8G3f zb+EV3?|+W}r5|C#R+NWD4~Aj%NecAl^AC1VKSoC0gMat6==qU5zgA3QZ~Cb)DfRTMn7has6C+i$dg$=E%CGwwaOuf zJ+-)(`LC;WAv_LSzMac|@E?NHY9e8zgk|Z78d_mQYr28o)3Qgmdo46lq%a2*mO`3IaFfg4UloTPs&$Y7eq;B=TE(;^uX77Z z38zvVRJsmo^xKuE4R6Wv?u=~8ZOe zL>-@BW%4iIFE1s?cO}w!q^b|9RR64Bi$bmw9QKBo&UqT`&Y+|718wO@8c&VXM*t$! z4A@*Es%E6zje0p3n~u8?{Ov@tn{GfJgvnA^=~X#dh3!NN>%)98*3@~}6S-EtuC-fH z^;_ya0=mD?YoLlmZ+R6~@HL%esL%oaA7<2V84YC@YE^x)jF3^kE!A}6cXZVk?%B|~ zLdDN~F?K@S`LGSeh#Ib;q*RhBnIDqy`l>VCr``DPC?28RZT zHZ4rZ5Lf?bkIz8M*+W!FR;@B5gk&j)D2$8I52>Ce`X88)Rc6H`c}+naUaj=+a% zAa%=t$c^6wiIc*H-Q)v7z*)j9B~g2LTW%sV-z!nfu(5urH5`=VSVfUC2?Be$H3Q3h z$4yC2B~&k_U!P)!NvQ;=p7Q&XJZ%9?J1%Xb`DrvAE2@Kfs$ zopfT!8~xz@nDJ$uDF^b!C{x6FoIA0XIY_3~SLlr;_U!ySqD5unY9r)y?3hU?L>$JV zh%SQ*mxV=%KA21TgkZo7F(?l;(=@knXqiD}^-IW+ES{1oCyyyIBd2rEA48bPbwzpG z+s09Z-hR=}(r12V_5Q&&*_Gw(u7iH|^>DB}ndc5{2$dE^#}{Q(D)84Qw>r;vxPZjj zdG2(N5H#SeIaFM#_G0}`%f5AqDXsXaow#WfT6*p1I=R2|7haFKSOIM8uB3NOC{QI{ z%^eM}yJbW-N1a#4^uWA2L~_^clFb|bn0Pl-&MIJo@Ym?$TME+ZJ$w$+iYwP$_wS`l^jz|)YafaqUPU)Qj!+%|4CtJ_x@8|nJ-!EVH@{7xOp&Vad0s?^d`yUwK?W=`Q;3t!Qoa?*G_`@0Be*@lP z_bR2qzSj0CRgsupL)^tV8^>~PUB3HC-MQo5g}-Swd(nD!#``mq#h*7@Rx)OMMkdq6 ztjl{R)F*A-_xr~`1{S1TAm99YX!W&?4z@TL!BwDH1 zbahl8?b5f5VJf%ixd@cC|3a)^%f9+nw2E91^PSK*lcb;*X(%EeEk{p|4ipq+cD%QD z@?KH0Tt~O<5xe6rqGFJeC@Vh&520eHRqu|BM7c(g`!<_dt?KC=V<6kT&(hJ&C!S7P z@$bthWAQ1cn<=GVf$W((uKxwgBX^vU0L$toQmkb#do{QjMQeItZ4`+6(9X{I3?3o^ zCpZ3vj`G9NNLo*p;i?4k9OG}*eGdNU$;l`uX3rS5AcxC$A~ z_x!Oj-02OA2@A?8CEa(lZvXXmYF~ur05o~@$8QzyipNc56$^N2?c_GS`#V&QG*ea) zgZ$gpx5e&Bz*m_$yA3-j*EkLyY%yS#*^hHuJuqG z2PQ@5{W`bTI}wp8&p>Q|tRVn9#l!@2SMv*>|vI|gGJYcc%dXWqMN zvH3-0Zp!VE+qdwl=u|i;{A3b!=FL%{L!=OCxk|BRD5Ztp`RvuUmiz%`!kOh6%`Fj* z4GWqk=elFaK`;`#GfeplL=B8#nzz#!PesdwpXNr5PIV~oa{-C5%8gtwGOasnlzFq$ zb$`g=pJ1bFV}m#?$~P~9l1fQ4NcEe4x8qne)7Xdzr9FY<5kJk&M{{JYbLUC@0{~~l zLeGfmj{!}c(8s%#a`I#{im@xMceavN;XUnl;R%^{c$oPw<)K@Dd*YW0TJxwx?&l7uum&1 zsNfERS&<|-JwyPb<952~Mysxm#Uo`wDJ;Wxp;@eNRt){k;8$$f6x?@=@(-np=!fP@ z^Xyx|8Py6XF$Q5%Om>bBDmo5Z#P#D_u(91duyR$?Y+;l@Gf8^n1_756`(xpfB^=X@ zs0{3dF^#Qss=^g5U|E^KOO$y@+_KALbwh9Ss=CX!tWTuPhZ8W6<}dr0NY^ae zQ3bU`!Kb!Vn3-w_OB9>&Nv65DqvF&C0d5z#Zh_;p7YNQNslJoq+yzU@?XDs^Yo%xo zCV~~5+~Z)-$259}9jw}w)LDE!|jJj?JOnwwd^aPK@ zreOh1I1%QQpG4XkS~hkvt-HIcfk?jYP_K(&;|3v_elF$y*O2Xe4@enYG)uffua%u4 z_K^uC+MS0!E*6I5`Vi~{TsUV!7B7L}MH7e{fOihewt{+Z2L)Zv0f~2~OW^24l|H5K z3!DdI#t|hXM>*mJv|18$`PaYCtc=c?Zv}#~USl>Z74*;(Xf9mLx!y%Py`>8yjV#@C zWtmiujKhL{ptWzyT32rGuooqLZ6K=1aHs-%TFb z_Z(Mp;BnR873QlA3}7`}+WNiM5;@8z4%*H>qY*g4q|0%`EE-ELIe!}n8%x+GWzeRh zqN|#)b&yOTcF4yibL_rRhkZ$nL9R`k=?^r4R-z>)3Wv&;6M62#CG)?vKMMM!*NoY=S$p z*A@%4RV;p<+i-jU2Z1d%jBw*{44KLuXg#nMcnmS7jt&tkxUJmN2X$qXKdu+pyqSf< zz23F#rIkK#C}eV2#@c+ELb_RjTey;uBMPjPdU%H(&ixRUx3)*nZClRtWN zVT45AKsJdtLAVGcs8xxPwnySis5IyBE8+>P-0~fUX+SY-c5(dY6RvH&>M~%i8eZ|{ z4>ul+%So8?Rb2!;aXXz&bTfu9Z0wfHA=*ozwgEA{hPBw{{^eD1F_F*j7)+K6HP>P!NuivS2%<7Nb=(e~hY z;POFZKzfo;X5$Q@@OLibg{B8ney-4jBQh~%&3tFa12C(BJo+@Jdjv%n@~{PxLy2`P zuSXTQ%e?yzJHvS6xyGbXX@B=GQ70Y7ILg9vZyan}=uyk1S9%tAK4YIq!A|xaRkequ zWf5}3Mf28TD+s$a*BC2Kc@~G8u*6QUp>Y^DU#2n!fln!mgG!UdVqrD_KBkbLCUt(>tU?FAPX^=n_lto zPvxdQj?iiVByz=ucIpsrq`I--Df#V!lx5EZ;Z%-Hn@On*fqtS z@7~%ekYmTd;Kh-F$KI@LhKui6D(&pV_Gp!}r^Lh-YZ>V8CFA>c5`uiO2}C;SU70txrocKp3jVT~y@6RHQNR5##r zYm&O8Dt1>ZfK$vD?Q{$ljs6lDn66&&Oiq}RzJrB0C@{&T#{2;}Ta%hIW}HyF<@afC zu#v*}rSGN}p1nNT)*_n<4@z&P*<9^C#cYsNVUvK5kojX2=m4e2K+Io@_HAvj*xL7* zV%QBnUy7(`HzTt`Hl4E5Ju#}BC7J!pCKl`1zE}sY@{nzU524v~W;akuTbW|g)o4mv zX4Y1Il-}yXt=n8TFPCzu=FGs1mtS+L#X}JcuOLYQLNN-TQmy^piC*7d8+3(5h0gRj zKB`oFkCqG=Qs`GLgI1FwA%;3OZ|oz?l{L7$c3sCD$^q1QNA7D~rVaB6$oe#l&a@P% z&}drx3`c+KP2$OUld0%D6^6|xQW%qI9D#XLF18qSS$wKg_>Y#D7*c;NU1awzvzzkN_9u2RhDewtB*m;Vc#?s0Ir%Ho z5B&0CbO4Pio|Fm5l4DGiB>rv3oQBCWb9ia^Fc5e1>PAbsAf@2*9+(J6;xUWp=|)-i zYv1iGRwos#4u_V_arO^-oCK0y##n#O5R46BFjzD10G(P{%E2mY`QBm7i~IuDGrm@D zfnIWmN8fwY9@%*ub06H4(u!2Z*b}%mo@<6<+zGdOJkSFid!6}mXj4^JtBon^a(k~D z*`es@1mQFX#MjLb5uApP4TR{=;8>wnlqa%Axh&J9BOr*CCW(?H#9FQ9mFU?`A3`Lt zIlR;Nji$g*2D(tjM$kkoih`CZB`d`Ci_FtZu@kXi8MjR|4lM-SHjAubcs6!Oi^_l; zYEkoe5d*0<%%g{v4!1 z#(@#q$)GqB_hG(;zN|h({a`0PUz13F+aqA%eQ)Fshr&hjd!!J|zWz&=>HU#FI>^T$ zXyrRrL`nT|Yx_RL@=DREBuEyD7vjc(c>h|DB)#C${OfKw!rC3k-38}!rDAso0iXPp z#}`BELhP@Ac?`_joiN!I)(;W9px(#|5d7m=;|Ly_X*WkIIzhyK@xZ!?)i4Giey&*5 z2P8jgZJDxQ)R1B_&0-dMu7iE_3!-U!Mrmy{UWCtz89k1IZM{W3h5~vlDQ&d0F|^*( zGc-&y=7?zRh5b{sp9VrhvxM+Ea$8rHkR&?&prMe}=Ai2mRvkZRY8yUaXNg!@mLMLI zyLaNbPaB8?W|L6+FRv3}jTt%lPUOHDk7XA!xjso(WG$wbeEcXbCGGF<9@Q_3E)kQN z@yqOB(0;eZ#65S%-vw6=gz|I1`Xy-UL8~lrlTo%JBt;vHkLoONh!h4AGxm)^f}VL# zXh_WT!-ZM)q!-e9_8)ZOJbnX=WiU%}Iq;myhyKS*4=k8X3^%Vw_hyAx&X=rZM1{Ut zv0~r<6I#Em^vekTp%+{r|2HE1f2KwiS?m7)hSt-JtuyL!DZJ4hm*xVE{zYlw#)+b! ze>`W?E5>gcz&*^7*`#bvWpdtcfeja~da$MMb#5fDJ304*`}LI`vUaZmO!p%;*Nyd# zO@V6<=dLW33c(P58Ma_H=+W-@Eg|v%Er4sihJAUufhZbG#`nD_;4d4g=9aS4?3BqS zNEfF4I;Vxp#?(wO8&EM(UyNboHa;nru-1#wUZV0EMzxz$v7Fb*NQW#4BN@`A{u`>! zVkjQ|kkJW8xyY>&Zf6(0u9x(J1n0nreNF zZI5`=Xx~xD2O9NQO!&IWyu&RMnk3dk9#8?_%eDW|OB8*@TT1!U^np2|H%eNX883Q; z{;~|6LzOK>KHZHzqfqid%p%!l#`a5aE453+@+uBf=uU?`!Lqux3m~#}8yj|cAkzK? z?zvie7wcZ-JGNaObEb?NhR5p)d6N#x6_j93Bn?eBXXj8ws{RZtc%btD`u}ITC1lbO zG=ESNTk`+iu>blXH??Ht*MBzby7s2t_RK=yVuhb1uT-rXZ6Sv~4++|EFm48(_aRX%fTpD~*r<51*29O4fN%=NEa;)bhdn>G6RCz)!nW;t}xK z+N#aAeCF+}wY@*2Yt+Ot{`+x4qQDza(EsBnF~gJ6G0&g%YvMI?=8%H(wMobjrR{9| z`aIjbQ`HYtHWPz}&ySf*9CWveBx1MR|Hm|WGbh4Kilw(#AA$O{l0m?~!Jo6<*fD4Z zbFJ^ato5OZL&nPxDxWBuJ$>&}%}lFbHc`$#PsgZhR(Uv(VdPL`e4%%i2>PdkBd{od zAzcSFA2i!ZJJNw$nn8+s@1p%q`Ha=*+CJqjD1wlDPBBZ`@-2L!vfyOPl#yPj%KH;@y9!$CDE4nTKcKJT zvSGCT@CRIDPyXjELO%`=N7^KkkcU5#z04_pdiC4O!`rU-)V~*X_;lHpub{TUQfvM6 zayJ;x&ZELA53wWE?!(r59;w@h=xS8zr;LySlr&bwLLHXd9NVOy3EnfgE>z41J($R5 zgicvt_K|T38@{@Q_CM-_)(P0A-;xm+uG?` z4bXvYL-D(PRGoBZKFMO%MTCzt(=7m>4Yr?a#D%fof%lyHKJfj=E@(LcUe4>pWWygJ zagxH+9K=W{cASno_q)8o|ESAJeJVh*lH5Y%Nk|?*sp-WQU?S_XG`du!4ID(IL)oxq zE1xOJ?WVCrq=_Wx$P*`qgvPkeIbmnuWj6+GD_0Qckp<=|5PBBO2aim9N)A+mJD^eM z^EX5X^@)8wwS^0w&t&w(!ThKw7)ecl`Q|&Bne8gm1b0i)PVTa!3--p&Vaa6C8HLA52Qp6u}RX$+<{;!(I*_k;@k=`Mp>y+YzX2$7~=G$VjQGn^|B6;Kj>5s?0He z6Jqh7G(vwCf;I$Y>9%^|096+b-z!@|1rrZfG?to-%o7v`f!}K{WxX#x&jcv1>NL)uy$;-X4L0B z?t8)1@)~^=b7suo?Zz69%J(3;F`{C8JeOHih}^H|3N`lp6=FQZ$nJ;xI&&v8vaQD- zoV6`Hqks66_k0YQ6RV$cXPV!0CvkPWtQR&@|57?T`^f%5ig@z*Dzo5QU!c~k-^_jj zA>o45xjQj&JX_1lY|8SmJm5H99Ihy+2doV>M(y${D`|tUpY8uw!WFs4&L<;4GzqJk zY|JVc{y;PR+0){!n`XVDRx8a)KdjU4YzFN^O`V^^yCFwAw(E+?Bdh-4APEG*Y@2>Z z!QFO!QA`&Np!m1=N0oj&*|&|0#93#S`MbV;c*A!YCw1k?vVK?;BE=n(gO2b$I!?%A zR8Gufn8`i*X%RM6DXl~LNGYiszUu3VpLs3s^ft5+hUlH;?L-l4%CRQV?Yty@HqCj9 zt1t?N*XxQWpQNH4!S;1Hn!$>*kUsweIP-PKqE@WUZ-q`q_2_z4=e%#0ZphzbgAU#9 zd6MOIXW68lEa{(?XSwaQCzD4zAli)?(!_Zrmwxf_<6EB(*A5J)5~3M%C)y37v954- z1bxe~`~E!ixvLVk%`k5hbIcjuWqZcRf_?lbX*(i#<7!;W0H+Y10C&qloY`?Fn%`@1 zegVD-?{N#CW}+(VgDto4+_yof`h*N|ok(2UZsrMJ6T$g9mQ8jk+HdXV^;+^l-tN(t zLb4=g{80~wIjk+=6@ajQn&duvGnCA028X#W{MV>Oh%i~b3s3^r9!6FBQ{F(LqtEWw z2($!^xx%)EV z*m89P$AL{(6Vk zj)P6fd4cvGfNR)LS@xMcfJ5+R(X?c2JnOsUlP&7&kYSW`@C*6oiBO#^Alo3UIt62CqSwQ)}~G zSBZ+5?r=R=8@g(=*Ae!Y(l_8|0=44;k?HF9pz)S z!}t0g=Hs?=EwfExP`Xj2whatV_J zZ6n4he=7%x3-P?#eRk*vXfp>+wD5iJwJam2=&IH@ z%nMEJV2Zl*yT=-Qz>-NN&3Q-rSY|;@WX)+*T-2-Dq9**UN}gVNi{}7lYw&$l`JDoL zzA0yBP4It6n|X9sXxfwe8glYFv`u%!4t7@op_GELmCj%0uw zN$9x5c{zs`k&O=VhL|qJjW%5`hj+KnI#&9os+fWt=+^)}gLyo8dKDGY%gjDa9kjpz zz1aOj*z5Lb7TP%O(q@b*H8&F`0U@FPb>EAQFnnb?Ei14!(pmm5((TEG)5f8)OAD|elw-t`X5?k z19|ua1}8YzO!9?~h1C*5N`GE_r`YTdY(qA+{Wj;tqoRpWfeD~CR>{Xy4PPAi=q)G_ zb7C(bXaA?ghb6Y=rFb&CF-q~8y@u)gtKd1HgYC6&nlIM8Qer>N#x0K&r2h?!yQ9rh?J^A?qGe+e|;X!~*` z?yD8E>ya}iT0GdmaWr7CyE7^-A)-iJ=y%F^lYUwhHt~CB_eXCVuz-h~H7E5kwPu%6 zJ%uwy4x6^p#I(&dZao%+H_k{>`N6p5Dk}OfR}rB6A!P+;pRup1gpF{KW0;%=wZ|`A z#j5tBv1ES^e32#@MLi+J(kpMM>o0Ys7Kq6D+*_~i z?9~y0sI~X*pC6sA*iZem^wNzIkDk{UgfvDmy(Wuft^};4y+23Ob(u#?Jtzf^apUM! zN@0pJyEEq8IP0_PN|dS3<&ovx_%j1=8^AL=GdoRx3tI*6W!6;F`b)(U^!TJijeLPG z^9GWkd{vIkv*3W)4!)TKJ+S|S-n$+y#{8v!<1^cl&2{OvE-54~PSiGWn>Lu+Z1;!E zIKs;5H5QMu$F*9npB0j?1IlFK-hFYE7iExhr20g_gOQizPuyS8Pq7fUW9N0tqxB=f zJ6Pqog}_L>yw0J4vm^O(CAd3qD=Uhbkv+sM?&q}fg;(=Ya&2m+1g#v!=sIA<+{4dt_cNaupMJl6Q$-%iA>5ScazlySA z1woYPE*Z)c0l&`nA-g)eYsPMi+9Sll(6V|U4?WW>(y6U{Pw{6jd~ZO+FGQG|0_#rq zRM<6RWWw+USG0>$#yJ_~pRWEKVRoDZ8qEWcVG?O2*|&mecPuKMq(*F^%p}hP^CN_Y zYOfZ(Jqs|U|CB~~K7+CF;WRl}N(t`-QqZ432V;XQ`pIAdxC1#^Q;s76<>h=kDj zreK7HzF<9X;Uy^0#atH6FrCPNKR~VZsCe6(ehxA}%g2rgN z8DhmG;Az~yVD);p>jywlYOTtx4d2KDIHc8Dr#o|L=oMgf!7lCjbD1nOqtxh#>G{^Yu_9_ zNz{QLSMQ7K4#-PBUY%$JX; zx_1pSdTwKkiwvHpdGUlY+Wo0KUm!y&JUw-LAb&8aYVzXLH1>vx0+5&WE_Ma4=|7u` z2Y_9hj?b)VoF}h#&29$lW%8zW4~uJsW$f#B!`y%+HsZKiX59W&V~#pCQ|>$y(xa=v zcjl`fdoIqqvw--g4p0UPdJRic9PZnL!l)Ly>=`=GNKQN*{^i!fD#}K z6;`s@W9GjSO zE3B?)T`j`hoS^isPt@C^2;AeI7OOoue6--5%POU4o`|1VqyNm_yC{f!F3Tpb3LzPa zJsRM{=nWlxBKX&tMfaDp!Pc_~@LJmmFjw(AULzMify-YrOMCQPhm$!-?KVT&Z|Zr` z&0F86gi*DcUM7EXrN;R8Ct;+9zK?NXgO6XK!v2^GzkiWk)^0qK;o4<7f&qjl@d1xQ zIM)dWYp&+t_LaW>{kzE#3DX;2CX4}4uDp`iUn z`@Gv&1(NBRf=cnNUTC1LWT;8{mA@;ZUimRWxdfnF&_F}ChjFTXQ6edYo>JP0cJ!$f zRqSInB_c~?5VbeV>~pES9tv(n-tQ3)RHeKx)HbJwAzdDZ`kBm}<(E9FEeuD=({9xd zQ7k3vw`*{Wg%8q{wdIFH#y!b<__HO^@EKW{Xj{-f^m+@%F?f6V(AV`y&)5AwLO&`$ z=SjqY>z`&2_n$VI-7tag&ssv?udjVXfm?y?ug{V1_Z!HwTp7Mb1M|;DOtzyd0iF2m zgV%MC079X4?=0c~N6UnQi{Z(g#nu&16DD23Fx6oMqsE7kfe?aY-0xFsR7&b9IThCT*HUff7nAsK z+qU(uNzGcVdWmSSZA0l<+W=qZUGJkSHQ-LI1n=I@vG^;Zqi&6I_ron)4>guOOrZmL zDGu*yp98&yKmH#{(Vwa9$5B4z1Mb^jhXdQAsRiGIyY7BGS+_qfqgw-$KPto6AQNaq zpxJPUVZROn1j6($aRKETlVRVNgovr!I%a-F52>2Lg*qw9Y!4d3r?=GWq_z~0u~ zpkX_9r!r>{^@LfKLE@+QSYMvLyXNe)7$V21l@R6AGgkB&|I{kem3^$sk0S72yI-tQ zmdH5GIO+1D>P+Es@7-V(*VL_~_DzU^Om%_rrh82wWLVeETjjuY&mS8TBHVO#nIzkT zg!!Sb7x8NqF0ALTcgUNq15g+$jrci&%{-^f0|Sf+@uENb?$dqOq?`th6fJ8qC_9vS z>kjUte_RBf9Y>&@=Gb(lqWK=<(mqjI$>GbmJvc`NnuZu*4_9_dWR1%qBhlhD5hs_C zBceIf5J>iK%s@5DErnV+l8Xt-luVktV_DNrUFFP#&l*NO0-8zEnLD&iAV_3Ke}^w5 z*<2cWB89vDLh$%yFMEY#^EG=-%C;L4q(>ZWGKLys2rgsYQ0(6yah13<))b>cu#1a+?JPDCY1}y3kqSa~ySO+v%bj6!k_%Rl%=NmvD~jwG z8^Dm6yyKA^wqu~sojQt=)-{u9F1Im#p<3o?m&*X$j?K}BVyT!Swa(erOBu4XQk~gE z!80jY1fIVToMJ15U)cD>Q(aBH+PsB#;?vNMkD2% zU~LW($vI07n9p89g)_+Ct|I1^warWYJ+-hoQWp=!Bq|2WyLcr-xi7AD;&3NyGc7hvV4~ppNcU37EwWTUxOc zhO9ZM)}E6}O<^zVwOt)!VG2jdDyX|o%?Jpd?)2&1u+kc%qK<}VV;?J8tvQMI63ZE) zBO%Y<^J?-6-YHsE1_#gGB3!mbJC(arg(B)&dWfXYYgKTPV;+E6JZsi zuH{lQRyEfF?W}gEM+i}Gr42g@Xv^_xvagM0F^Ba|dDj2(=K+5kOZo;eY! z7R0TA&4Uh*O$wl$iEcKWn6Hh-wtbWt@Aga~FQcf!Lri{l1IxbLYm2eWPfhd&v+&Xd zsumrR1g_p0#LTec3}6Mvl|!&GbO)#jR;vynYh}ePYC`7Nfn~fTZzw1{U5T?JP@%9+ zIk{8|!2?&7l`MlVn2bZ0p|5Dm;&Y)lTaGs;k{)w8R#jN>G&;~JRAMaKy#=dw1Pq^Z z0K;nrdYRoI1wqT5B&OKIGey9f;8xxhjHAFZ>o9g;Gksg!hHLuJq%scL&qi+Jk%OQGUDBm#B9J~aR|6% z+_8o}MI1!b4s*m83!2Bf6A49#jx@Zp1vL*7%F~Vz*UcPnkL&~&$mxyi36yFL_1q2$ zSOG9hynPu1)+IWk-2(t2lB3ofAu3HY7Vx*3?|af(u#Fr?c_yW2I-uwC7@FwgJ_C(| zpws#(^&RiL{9BfYx7ghiV1eRjy$|eMyYFIVdiRITidwf5O_R?>V4^AgIK=^W7^DNLZ zKXi*}rTv82Hew6BIPe4z0>3wk+){6I<@=8KyI#Cq-mhiu4I;eBL=~UWL)CS}=ATs$ zz$+VOye1*qmjo_B%+j0&u?NZLAU0(CY}9qH7f+uC>jtR3RX|y}(z|z6HwYs*5+nJo zz#Lr+y%3iacq7f!;L0O}o|r2;1s?j)tD~;K9D5V}cjE2u zi^Oeo=1n+l+SDVO}{l>OfwHtTRF#KU7ZHG)zpz?;M&;UJpcX zcic4>)mojVx5q5KC2TUGYT*A^V2ymIP}k+*f~SDc16P@XKAjszFF&0l0;QzEy?}G? zQ&2LfEoMClu0NBeB|m2mE<)PO_Yz_>29AFNHMdFnZi6Z_)ziaJfG=B_QP9NR+$6C6 z>WFmqb^t$aXyjVHZ?>@5)NOXv9WkYvNG)XbX)(rONoWmNy3Vc1=PS^z3stId-U>-W zV~nxjaf`#6r0X9eRm9hNp{RQ#=KOV<1KJE<0{kW0yE8xljO&x(x(&)9>=tS3rRxtLrZvZw zCjpps^q6YwYwlwsIs;ybZVW^bh0%^zR=e)yn4>Otffp@lo$d>T1X}7~)vL?xuw_Dk zD*f@NlqmiFEvLi)c;Vi)>($;gxoro^Y8OoKcOEKz8n6v=6;v^T-SDcGYK65^XziD+ zg>8)oaRjxyN9~?;IPq;=tpT70ga_LP;xZHloBNU1g}veIa(LiTqLZ3B zE?VMJYl+AV0UXX4>$qV*um(hvxnIS8cAPz7GYnTHBSz0>c~3eB*^2CQDyqG2dD{;acJ zy#w;T`I3)_MDH+QofC;i4Awx04C9{VbqWz2xu}oQ(XMO4&4m+2BeVKhoNEB&>m$-f zj?kraQK0QZenhi*9`Ar`HcAO)-LCVEbH^U~7dQPV&`8a{>{AYiR z{5jPJGuixhKBhu-42^(so&3vzj`z5B0s{E%2bc?8a#_t{qTkY7>UXWT@dwV3qOgoJ ztxTlyZLhZ(d&FntrC%N?ljA7a;ju#FjJ%zCbo79vT8T`RW1@ryZoxQU*E65BSm3O9;JrQ_;YisvA_8A z-lH!%q&6*b1rwow5b6I+gEmlEh__11U7>@Cg`jW{XNaLB(~xo2^fSMyO!I}uD!<|0 z(l6K5o5sA4N%-oq2F)O8sOXB~;9ead)V-brhl<~LBInIMX;vmiyIf>t+5t0S15<%c ztejOPQAM}bmn+q4^8bfWaqn$ zBI;VLqs6RyYhny}%?L5ON}zuyliTE&5IpaRvbLVxnHcPw>@D&*m|PiRELE|ohwb}! zglYwQV0lW68m$i67>fnsbcx$X|0;B-&li>Xvt9C~3R^lPAMcEG9!l9{28Dg@HR9o3 zUsg8`1vzf2sviuhO;ZjMtgM`v{&O9T~l7pz7K|eN{mK@|Iv(wv!ZXoob7ssxwj+Mm5d5Fq6 zNhyTgjt29PsAg$M7sZy(D;a;5o?Iu3YKs+@Z5KrfnP7^Sky%1f(9CjMXRswaNBd?J zqF@~R&Q{AI^o)wst52@ng;&TtNBol7P>V0cCWCHh)MyiOdp9h;Y9=X6z*>f{@%r_~ z?e#m5xzHAv=F4w@)MHm=_Lh%jSdEB013^JacI3kB1Z=_Xt7vkm8Yd3Cfa=iKA7~ul zBn(5|OF>QLSVT+Huf&M1rKvil6kkPDaxt4;|)U?>Idg%)?rODNx0epU)b~?2;S&SLM z^^UGW4w<#^&@Z7Q3|6-9hSXBkBuxZHzEL}Loa zh4r!`1i)k^N>#4Cr^q|TrK7GYA@y(@>O%gkqJy-T_3)S+2lm@ikGh6$1a;p9UKfaA zW0%L>AwHU-zEOGd0@Qja|EVO`&R}FAv;5S*<8C$O&a?1u2|v^TzeWirjZ?Ucs18j; zpnOK`hByM7btf~WC1tNGJ~u~^s^ncOn<5&<;fmERdmTTUMEw$<{O>rC1HMURjDFVu zyg*(ij4|WjAgG$Wy{@4@oHIdr@2ylCtiVdxLN$Y3pD*zi3l{&6ta}QsELz(I9CVV7 z-LcuRZQHhOb<(lZv7K~m+xCiWJ6W-L()&MEr~Z8|SIw$*Gv*i*n1>T68G_BB10`^b zD?~&Z#5RT3#^Arc;`Tn=B35v3Y;#`;{}8wn!KjPO4&&?JN+4BcV+juMmB?Z6>F_5g zD2#NDK^yz|u>-hTjUvRJbb!U2pPH7Sk(h- zygY-v1{#W{SdNGQz1HG8d7_7p0^#`>EeX-S_jUEjl2q$!2xoWRPuLPp< zWcf}~z?l1Zc5mz0dar;735xo-c6Kbpcj~8yJ^#fAtA=SAg_*!3OXK&?{|y@b(=GJ= z2~;-7{{oFnjC4j$4jU@6_W$y;Ue%vkda(zeCy~+r#b-5SQ5(QPE2{93e!OS?`C$vp z-D9DRnms0~y*>|&fGN%zBzGuUCN;%%0`DUXxXWsqU}y|H0V#^ zIWHg}Y#lmru>X&ZitRAbxuUDbFJpxu}VXQ4UI+wzs z6b+wtrqU;5Ygsd7_@Hs?-CniX;9H{#jZ|O=4oVa~WF#*895o_T_d+e=f|v)k^n;MY zTGY*)3+>8-8NRqCQd6i*qqUT|-^@TlMae=7$6(j9z-`;=z8YoDO)9VxR0hrYdy-_? z@zFBA$H%n!$4Gk3UIoT{>?Wju-~#3iEU>W23BdgfVRkA0_ksyh+>YmhgMjFKH4FW( zo-3yRl!pN|wB^?r(0m@NulB@JMp6b+#8sB(?39o_qx}TQ=5w6lo*rK_Su9I89;TzC z8KuxrhWYsTKDwqJ4Ey_MuC9(#|IV}DyLvy5$RALA?3|N)YHi4tpO>_i;}13O{qF0U zH($WRw`)a{VM>cA=BI0-GE6knT-P=m>zME3rchNxYfB8Eu(3Tl1Vr0Q|E2WLOEn93 z{=+}WJSyt0JmLAs=J|W(XVKFM2~S*2yx*A9KAJBIcwjHPBLfknd|)jmsh3ST!eucc z#wo6h0^B9Q2S$)C!ar)L#?tAa!3CrxX)$Gzva?>c?5`q-dL$IGblSL%UFVFH>rD=z z;j+|6$yBo}MTCO7h&aL_=(?kpQK|TWwy$!e^Iqu*!A_~ju@!Y4CF>m3&et|FYIegZ zu-B|`BI`!)hi*YqfWZ*J0rWR|E27mY6AMRKYV>=jt_6%PE2^}34qtLm7h{IGw*lmu8SjQ zRIY1^dI@LVK^!C0s?j4aVnEVDdruwfl5^<`!OthD+9}nCq$sZ>_X4~T)e~2)WMpCYh=ORJ!@>1Zwddm=( zAwwN}WJsCw6J%+i4X< zBsxUM{={t#vo;4Gx+?6%VBiz*0pu+n!E8$g6hcE^t+F68v#|dWN;Je?#1x2V^_STR z!^ZmFs|^J0qQi`>Vq|DLwIJ0f0*i&3b&g@l6HVq(DanA@F-o(UNg;Q3i4;6W`FZiA zBS_*r<`q6(AKb{_vSuF7IWCl0A{W2n1jVF`LldtVB9>-DVFR89K4cUcZ}Q*}B4Z|F z-wHvo&9%I~&fbQt7P{yyJ@=3+*cnx_5Bv?ueXf3 zhUT!?_$e5UV3R3Z{--Mtc{TV!5H@8bQsc%ST7?cp#x9QiTPuzz%nJ$lG-M^i4*aL@ ze|d67ppcR>1qcX^@_$Rt|7oqu(yTrkaU9;7DxNmp#erT=5jQ^HC&OU~x%D#SegGNL zF&<)zwg0=-E%7z}TbM_g)vhs|o%@w%wz1G?|NgK+-~D-!(*1IO!T$H-=49&c$CGdS z*5PN}Yw_0m?FB#I$9-|ktG@T!*>Lyg)xWuauh&QUFZHR;_tpW(c#HbPt2^1EYd=eA zJ}`cS2f}?>!0JKM+)gi`&bK{%3oN1|jEPPQyT>oW8G_>96Or37U!4+ivzv^pcg=BM zz6=c4?V|qm>ZN|2d-zvOUyIM>ZSG7u`}*e;FyC$p_@RTi-^gcX56ANME2_tLW>|>; z_I2cw6^6hQXL+-y8{4zEGt>73w4L9xR8GJ0lvD=ka6g0#+{|L``TFjCcW*D&>?YY> zJT*}|+JJ$#zXgd1JLj3yDkJdKk>NqVCRq{Ftl)Xlj~U}k+KKY|&$)t`cQU)Tev<8i zI;~Pe^=*aSX~)ke6?Mkew#P5s>Afa=r|{4bUk*b|Q=sivaIxA{9??eml4k{AkT{%b z4eVx@sUn=-$Qv0Z!}uu#(B0iW8YIJ@*VxnztMxjM=!s|*W7_`X)2R*6WXO-o_r47% zjjuB2GWiL-2(jTfg=&8MGb0up$BxSi-MO=SCS`Vl;F0Ys0M*6${z~y{HikZ=#ji5w zjbj;mn+HGoY14Jc1BZXq3Rk84)B-r>+L+v%lFkEi*k5IEJppvC)R1PZ#tPOj{Sq>kyKrKl%DzQN|g2HCkQUn-f$3Va{jku7R8x zm+A)jm^JEK5Iz^@A0(UYoU+aqbf2qlfGym(`8~Gbk)zynVQxW65< zDd1wb%GSI_%;uXLi>Ct=zVu)BUpJ2cq{FUKL{__)DnLY8nbf)yA}N7}lDQxEFkusD z^o(3t&iCV+S4s4aCr7jBjlJJgQ%&cC7R1f%V$70O@{r?|9w0|Npg4wRBU`KlbFD}D zmR7%_%pljAO}15_w|vZU>u=2va#?)dhZg@*Eb?2JrHvmDZM*CIW*T?*=;svi;IG=A z%=GlQjFcS~3%8hl?a-BzLTVLASvP6~cZCOC`gsxA{P*ij=#%Afwsg|B0YHS@l+_6IROpw(l5J=QHp`Wq}Xy~ISZ5^6l#H@IXX|)pgD@Oze=fJ9Fa;mbCbyI^mi8Ev9KZdmcRS1Lh`c@ z|0OIBc^Ba}BRor^C-_gIy7~BSzQr%ILmC?V&!(B@3u`c8r)9zpbI_HYEb?fhK5xvk z@%g5(R6yUGx35c};yY(@pLZHfr&S+Y5y|UCjmCnIqkq*p@o)ssp0xn>PCNwu<&H zptMW`gl=V~<=ry`iA2Yde$5gqw?# z;puw|Sivg?Zzbma&-TyEQmg#%xNxfQy|en%<=l+G}$-ZP+sxCj88@87anFJxO$F z6s;T}9H;>}omtas>}0U0GO$bG-62}B`CACQE#lg@T|$p_*E{l_GfVP9?Hv`vvYjC) zgDfnVD9^KO2QxK_qC?9<2xm)GA_y;{8LJQkP}Vhx*sgR?&jcS1=9Zpy(AI(Cy%gF1 z?JY53V_oq_+vTBNu5Ze5$)1>>%5b~WOsFgq-dd1dL~~Vjk<}lm?wFz`Rz{MCI8D;b zV14tu$;3;i0+f^6uS^tC8;-ox+P3A<8A5n3Htx%(%z8K1XkTjf=jL(NcwiCLr;oB7 zFXEA|?}z58l5;bg>6cfXYW5S~cJ|PuQPifaVqc11o&@`HN+Sc@h;r~OU`8N}EE#db zko!^}bbToYx^LQyNyfsXkV?#+pg3A-&J zQP$ZmEO2;HBDhGWOiF$CCD-IoVnEM2nBsh*H|STC8(dc`tLBCpC+Rn&--_E{pH{$I z7Hho`oIc%b@2TK`zXm4iO&)9Ncpbu@66)oMv=NtQ72sLrxKc?`ochs{_QKR)aM z6~FO)mXaQz!mYJnEXC$4wH^@oUDVOTE|FbtC*Q^qlQ&wKx0#>lbm}P)!vdQ8#h|`) zX}kBAF5PVuhY?*t*{vIt1x0Wn)46GE$lptJb)G}ixARNpF+ z>aq}~_IE0Q#(aZBm6(>&ZN);MVxn{sgqFtOndFMWgST^!D%4g0yfW*ze^G8LNncTJ z3ml496Ua&IE*3B3Q*9MM1!#w*7XE<8h+<6(@XLhaVmsy!Pu-nROyBXbAJYaXM(Di8 z_vcPhg7BX3YLp*1gNNMZA2{Z(tUo{3QeGBHK5@nrOmP{^xpEyzHNe_Tb?gQ1AU2w}6jr;ZgfNAd+F#YodOpP~a z4yys$mS=zxGz--HpT)Z zi*`k^UquR`6Vhi{}# z(Giz5H(<^ah*vL76g*M5m0Wx_@^fceEJm3_CKO!*hrn!g9D`r75W zWc_2>#Spej*zhVTKtV;{C}-;{^0p~C-WksS@a>Tm<1Hx)1561-a=*@*T4NW%x*~&8mayYlM26}|L<@zU5+Ae!<|^rP#4WPNLNZ6~RelR7+M zuUpvlL2-V>=iHlF$ybc&Rz;-^*Pb!C7XGy#OJqH|70ZY=IsO>@*v1(!suVYo z)c7>k|MoMELm~EAQTaWGI(FnosoyaFZ^!DKSqd9pTsQ0a>qlXq zv`c9^RK)n_vqwg*4&_5Dji4+Y8u%%e@E9C$J!`k;&d4BO`_8xFO-uHs;DfG_4UMK{ zjr=aOc2Ukx?9bjGa+e)Xk{?;W@*|h@aLG#Tg=)L2J6jm6b!_)UF_g^_a|1A9xMmix zvGzC5dYyu)4xBKstbHrqGm+id+ySsgst@$Vx$9fY)FwqW^v4qujZsHw~NsujNX zab(sp=2b*gf`ZfO$7blL9&4`yzY;Q6{)s_SEd0is!wSD)}Mjny%BCAz7t+dBWNk68d>ks_E z#G3(L-hd5FTbkRr?R`~rSs}1i$<iT2xtHw$UVjJ5&k3XqmJEvZr6 zdqMx9y-vpnK;Fw))^?QFE>E|70!RKek5&>jT`Ke~=|N&g46=E0jN36Tg8FUFHg5mml)u-q}`QT!;FRiHOX!n(`O`#H3X9MXgp zGYr!#9l2#>)|zSxAXRmEmbK2yS$@oc%_^JJ6lic+X9fD>I%0d^hUPk*?|3m&+2L19 zwE(TQYpF8x+a*2adLbb=?#gLv?&L?0JcP=fkFYR^d(~K>iRvsY_gt$TDNs)>l$9#K z`&m3M%-M^3u>e$yVp-q9*NZK2o)H(l$%SEFtuDntXkTYYv6tLWlmS)jdVx3?0=Gr% z1w{1en|Dt|D(yR5)L*0(KarZoc=x< zC1^xn)tM^|zX1VUO2(&if#G;a$uXMXCFqUn9I%CM;OyvdiMBk+=J=RFG7ZH+Ir_1B zQQHc)^7-*?x9n5Nu(1c{H)~QAZKiU$lvu^rttI=dHV3>NoU@PiB z*qR)<&uDt5F#;ZcXr!p>nDb|{6oU!g*#bo*bU&TMV6r=z8pg28tKo`iPA`X}t`b8n z6JiM<$>ahl$0ey}*F+tae_*EEJ&_{+U_#M3FaZ*N#DS5Ym$H-(EP2@I(wji_v6+5}M13pQ;cZ+sJk&^ShYMHn zI@J2;v&A7_@yQxU^!pRB8`g#MLk83a@Qp`QL_YH8S}FEqbRUNzNAbPbPdciUb098> zIEt{Wb93FU3o6$Td^E`m$31S|;4?1EMPcjQUVU}}@?EG}DM>NYO+d&D1>%OswfjU~ zL^#-=<~^rajDUfw+QRSVwWR+{?EVYX`@OoO&(UU@LBQW%P--3Tl4p;1 zJI~;v^-eQbkTz|WB&8Kge~L}Ji~C_=c+99`@a_Ib#IDmWH!Obx@xpz3!@QCMp>(5X z?}XM{zk9BtNK@>rl$#i~R>IX~@05m9+}UH=Q;#)JadWX6%`Rv)h~54NVl()k5C4JK z`uAvRLkQYa#G7`k4oc%Tyy}TCrm+&2@N_Ljp6Fs35pfws$Ri_Z3kRyBtI&4#9YX|e zA7kDhB`99csq(IO@mm&2V{U{C?@!DJLJ@uX|I?DFoKeM*-l>+ zOC?dZutn2lxr(^On>Bl0?`5u? zY4W$f&ndX{P&86Q8ylsxa;%g~u zJKedsq$G$$)pQw9X%2MQ3&o%j6Dfiog8f0S;Xa|*<=wHI?1X1-t)KdS?AF&a*Q|)y z8UJQa`po}rpxO?12}V}!ptyBK(9qZ>q6)XD;aFNJxZE0LE^kbIzQP-0OUP;G+9roG za?fXlGAQqn%t>DDYl@p>#|XA7D5LO&-HvwoeW<6l)#4FH>7Gp;*k!<&Dol0g)4NLm z{ll(Rm-vH#wlCr*=)Mt;PC8AH^)8t;%mo{{u-9|XmGs4`P9xcoS(ueV{4oqlN`;{) zH)P`gr=H@0oho@y#tA_+YuKbEtfa`+&Z+ttio$xZeVV5RXXNSB4rp_6LTF&eTHf(Y zl6dou=E<5qL>xaE?_=XlghHAx-{z6Y`R9n|huqI*MSS$bNky~dc+1P=?U&$6uQ=Z4 zhm6b5yK8zA`Pte%g z_Wg8A@3(y5UM*sX@G1s4g-5GO8%*M?H&;Nqz={93+;yff%Y!+qoa@#Ve*0JqDvOU|Y zi2X3nN<^=``n?LFluqYjT$WhZ`1?8*C}?61L$Z5gOYpL0<#kNZmr&BDGc_1l41{doQF1aIQF-FnM!x34S0TEHwf5$#${Wb>4uuMm^1fIuP!jJ* zC4Q~JO?vd<-Ynj-_iuWB@=zd_c4I5rX#rZ+060Y6@KQl06gh`V9cUj>Q0z{u@hO^p z#E($D(LFc9=h-G}L`rBh-C2#=YOdAaIFUKL`cYEr`n{k!NSu%IL?-hPFS&|jgo&NB z+!r424^4p*nKb;zK}3@$yBz!=eTD(BblA~rVE zqaro;n@_Kw2yMAEyq6AUD291IHHgE7Z){2uBsMy|K0teI=QUrOuQXn9KJArvqqiB) zVPHY2%=C7T*KZ>IL%F{E-vYuMEyq0!U`QBLS=h>QP~Em=-^qHM?vCFBHcu@;nk5;)VC+@!Obxv)f}bn*C&c`SR-&87Bq;TcCbfeFDP zkMf_G>rukov=?q4z=deeudu4wmX6PT{)CA#XZ(t>{wim0-jrRoIBWA9$8))@eO#aP z1GGj5N+xggQ{i0v;IP9Gf;I9Si!HG9YM56Ah9W#D>>`ro9h(a9edy_ed>D&MYU@?K#!LP#V8He_E zswx4sZJG2>{)1Rd3>7g{z1dp0mV0P@MyD>kOP1*R=_Vp5q}lCng;kV$7q-*pmk!f9 zYfvBENRB(yZQ8vGMVN6(^!P7X5_#Vrb}Yt%%4`4QXI+$-f!PwovJAhZ(OSm>oi|%b zlv{JYcA_CH62*j%TKH)MxYs5n^sk<%sR?*PwShyE|RkVx? zBW@*Bs4~DcPUn#LOXMy-`{%bbadTWaKk7a$)Us`){<*9nq>6(HctXtKHWq7DOvb^F z?jYD`ZCRQaZ0PN;#gppV*=?s`&_NZDT9+@EB@koR#jSzwaKMz8L<-i$T{9$giFPMK z6QqGc61Argp#Lsv*UfSs&5`)k0vasrUU-Q9&=q6M?FZ?(+k_(oQWnF3*4`PHAZ+6H z^}73U;JmXzLS*5tf$nD@bS>rCDXS#65Lo)B^c#z^ci?(Jd0?kSX}C})Ur^tEJ(hD) z`TT&ymL90gf?DsyPiB5}>RDw(zj8v7V7Y{pf?MjS9x8v2o>w|^tjYv2`0ONUvsZ8D zFSH#PFPXq3Wfzf%3K(EmOLZFmwghybzKFppPtnqv^p785AT;@>b3xUyVE*V74*Fwe zPjungQAdKUEA|kXVME(tLgY;II)Kj=B)Yj}^+z!WC}b*M=fEm+8 zxfu-M8CV-ex>tu75=LZ3NU=bICN&S2uPQ z`9=ReG7rr9pU*`Sr4^&nLLq^_9IBhfC7L=x?F5)_r3hS3IKQ7Q-6(;l0StN5V2{amTUy#^1?h{_B>yFqTysBq zrlq-KmAUPVLyzdnqAM?rFwIuxY3&-VPt@-pt-fs`ZlO&5*zR6Cd;px=mHlISH%4Cs zB0oHAccC*4+@+n&(n^h;%5OC|XhG?CY9!O~ex@1-IabKhf$|~)K#|eGXn&(H#uZmO zC;?<7GElb0p+k*_+t&30FPi8rACP6WWk}q5rAsY()0L#AxV?klR5HLbWS!wrV)Wws!#DLo-#;4QRN!}#4#VwmLE*T8-gPtT)nv6-G9X-;kn&XW zr6GU@VzOsCu#fBBg1|39Y>z|4f77AlYy5f_E5JK^thYk|;-F=o+mOLH>*sBLIOM~N z4##dS&sE+S{th5j0T~OM>k#a>EMUzudmN>hJ4g}M4%+yt_qeS!#D!r`-{9!Xbjy6e zZ3I&{dbdZQL(?uK;b&c=?FVk-6i#}w6OST#^s2A`bC%a%vAxC^5tj!_2nC2*Ui9J= z^ANDhbp6h1Gq(>!&8xU{{ec{>E{wscfY=&m={@a)MEP|Zohf1iYG0Pr8~!N*Rs1d^ zn&eRaK}EpkPzI0A6@UstXL7&%=eEq76L=zFlHa5#8NL%Whc7M0XzQVyX$++JUm>V$ z&XB|8X+<+0J1S|sulbl1qfi=f`_VmFE4o)Fy^Tni`E5eFT8MUB4QCcQ#^?h>A!_B8 z{lZ8plAzf&JTT&t_SoB!buvuLeg8jji^fWNA!oQ-2AC3!iEw)OpL@b~JT4z9cG4%K z4Tq1Ax!9xPYDHEFk<7m8{*yNnmtc51g5X)Y7&(FLur8%uP&=nVR8VH2esutaB1c$; zGpd_04tXXC6yqz$MP)>~2ztQ`e;J|3A)?<8L-z^hU8wKZV`M_T>kzplLhzztFu8iw_jqa38s{0>;WL@x;@gP! zl^6-t-!BdUe)0k!9;wdC5q1Hr~{%not+N3+P#XElAcOl>%z)*fRNY5DeiXqK(3{ z3#9H3zF5&ZqwF-9WIR+I!-M7ID7s8`Ew@ymA^@a~g+#J*CE_jZuytVHU|+A^o!IIk zJau!mdUDmbtI<_srk@ortE)Ti9>tBJmL}onD7(g|4SY1yx;2UqymWVJnu$fea9dS0 zx|Zu0(optbCUy@xB`~XM2!Yg*y}_0y#LNOZ30NAh(rKVOfk^$`uxNP3XYL?X(r~J> ze^>}`^#23!>ZT~Q;c1*jFL?8f2 zwOKecFtuS5hFAz3OLS8RW;7c_-A$z>i3WGfxV@#>Q_JKj%_L*AHVCwcL!P>Z`Ayg7 z(Ce+Wcy^2TpG~LwGvHyq>vv4-0?}1Gu(KqpKe!%V9*&z=El9N%OrWT&aIBz8Z!fuE z>MQen6@+A2Xs9@E21p#>9QElVcX*syyOmy$x;@djbnUHBe`p6~&=)n?+_F{-(ZssO zXt=0wXC3sM$0KrpUld5Z8T-ium@B{f*DAgR>b9Q4qFYa&AyE#R3-{g8$-Zw||@2 z9(6pSOO9#D5+{?ANC^-kXPMEuiDAg4b=cQ3h2`EMHp>4d{EYvwchBZlF>sK$M!Sh)7kKeJHgh%~QuWk^$MSODTAO*1` z$*!%5t<;rlrr^KV$HftDo=38goSryDtuxO?a?7w}beR}jI-_u@wL11ym>6iWHG-N} zW5MOhDHhG^EI_xDXoJqcI7zp6XvTce+-Y~oL1QF|)>7UDk%h?N4?1mBb@qV#s zjSHJ70ER0H$}qKLWgvDil85wUMtBa{O&B4yd9o3SsQKE!_#K#;BRsGAe}I5Re(~V% zM6u)r_(YEUBO8=|pRev=d}5=t^}l1V1e5v<+*q*hg_7yhYFdNwOH5HH>pvlzaVx(G ztf;Y;XU-<4yTkIUk%|Ly47AFxz@wDqD~<@7Kmva5xkeL&uw6;I7n5xIGFzld<-ktaoXHmsJ2RPoc?FCz?>XMprPdwTg1&_bB=}JQZ2S z(8hL3s5lBbRb^TbMN8NnF7arhrD$U_ICd3`>a%SvDbX#68Q4)HP9f{Md!BX7`g^&S znaV+UeTk(1R<)F57_o`laYRwiXb~tEsPTVTk z^%@f)V&6XaKioSZ-qL#^guho5ekP*Y#!c1`U@(*7&EI|{cW(5ah#WgSj~v*=T-3Z{ zB4+j;TbvT`lGbt18ZdlAsOo_R7FCh+){%T5M^FwEi3$zEJT{KwHkb&G-3xA9xyMA4 ziYgT$knNh;ho`_*UGxT;wDK)6TJG`_yMlz#QE`WcjemEIqMVxl5R(x*w^hP1xaD{` zvTaI!_ceVaZ{qwgZ5&EPblk{@k@97Pp8f7-uxj(&^{|C4LNc7UG;9-z-HcI^u9x-_ z&aiT;y2mK*=XoiDZiTScbR#nPjfp&Re_`OnL%)q5we32&j(Ih6PRr{nKVFRc*k(^0 zqr85H(jRvrXTTDLRv{)R4l%V1RmMlV4ofnsZF52p2M^u&VOf35(Chc%wcGsz1a+yl zB#gXs_paMC08||wYot>`D+90Yz$n+46zN7QRK5^%EZI+Azx9e6UrLJ}Kd$tFs=Z$x zBnmg2_M;L4q=QtUafyQiw~0+~*1KwN7!?!ac87Fx8Lf_rtb7S^zrtY$NNV=ECkI|W z=5WOOQe#5k8J?6u`&Ur@JAfA;Z^KmN?}Kl~YB)z5&`ajAY@8)colur|EC zzc?!-^qWmG9XkN;oHVxkl55$2kuUX5i3&$DvLMOKoK&JX!i6hiuZ}12)#+C+I`2;Z z3$lKlanfM@d1}@z7d@;y-O@@NH>(vPAyGF*;xD3UeK-AMe*t5mvyTGbNjV~_NNBQx z;?oY*jJC7I5&@!7LYCldmDwMaaKEWLh;3zxxyW+qTNCqZv&TBzzMq}+-|o(AFNggh zEVnhvQdYtSj!4Uie(&S_De0DWl?itGxPQU0ZQev7Ge)%qKK-EaR)YZ>m+chf9u_I`1*YS6f?CEu54Q*bm-0U!A5h z@ZNHQd2L2tb_Ah8zD7h%wcjQmqUAyHMfsj#ww>!F1ku#7FqOR%piD|xog#Z%_e&v7}ZrLDQ!SoRVQGA6`syZ4x*UQ zNB_U+v+6}KRM{7OcKHA3^MAUYfg1nQNqkG~ZnGza^y?IpWGFHPwMyS#J1PSz0tn^3eXYNBmL4z4!dP3~iou2SvtS5l!AM_r^JlWVf{m7DLM61}U7*+!f@6giP4Cgbt(* zBlm=B?`t;SRn}ezMk6`wSvHSkCmRf6LRLZZ)K?~yA2E#BY$Cgk5-+)ZF}ict8|NQ7 z+5YhHJKh$ZWp&-?(3>+@Y_>l;Q8r7)pw)5g3xC&5=BkxDb1QkDvb6T;_A)%nS~~GHaH|OpIv-Ly(>%Z{~-}ha@Tr8 zHh`ShG7=o0{y>=WLxtPwPG@H1uSwNl?k+S&az%`Sz?(4Tw`yI>f(J8yXnpPBO6tl6 zv5(iXbLZaK*V)xFl!ZR<*snt#nBznl-l!;WAWjMbDzdBYdG9bIw*dMOd3*GCZf~U^ zO>bRy0#OB>yDj70QZB#EPSiq4*E#q8W)PlQwri52R$<8GQqGx-!&6$&uFi=WHF^1w z^V&9O58nUptU~Slw7btBSr8jw;Tu5aQ4u?Z&Rnj*b9Xv@^Ea<3^oX>6xf*J84`$D8kgT zQY41^5Gc>0k_hDh5(H`(p<;_66-&wqt;DlP|0BL;Mz*Q13p_@lu-4F{ZVK4*U>icX zr^0q?OoH6$gXvRiaHP1LKSZET#!SK?A>?r(tdP_B_JlnS7KGpI8=;;W%>|w;wvX%h zOF@p~N<5-|=Yhux2ePq!$H4i6;7wW{I-J@@Jc-mE&o%Y*x$PqHMJIFzEr)qII%SLb zm_?2?!szUAIPh|kxx}2>LWEZ`#gZow=KanHT|4Yucyq|-T+cyV_{xJt3_U#sg?a?f z+zAxELkbJEwSR9Ab6=dnHoS-{lhcH!K9hhx@_g@Y9Uuv^gD*v1)%zs;11={_^gIG7 zW*sn%cQdr@j#e~s4bq@kEbrdG)&0M>HEdL&DJc~Qh>+cX8|eS38qd;85um=W&+qaIu%q9v70{S3WvOR$iB94LhyK*t zUq57Yzn-xBKCX51zg;YSKHbN3f9!N4e8zuH^?yFSZ{dD?eX9Am13s z()aav)$jiJSkr&HIuhPgvwzn185{BqJ%MNyKQry9!Tvx!+A5+)=>25%%CX3=KzQ{j|R;JP;oK z^z|1eZFBucL-VVGwi-67eseeHid8}`03zw4>ar$}@*VqTR(R^-RGk%8qaN@Yw*}!kqw^BO(LSz4b<8M_a zyC&<~N^gs{m35yJr;X3Mp4R~v^G7F483ieR{poF3E~izt?QJCydGuvXF2d%&^<8da zzRBC%=C>dJF6Er{x;Pa76?4Gb;C;Ks=lvKkkN%k?vK%PA$+V-JecgEQkY7#>Q09EG z?h;QSI#wS=`F7Iz92T;91il^6z^GD9fe&NpX~D=-ZQh-_DZ*yMw#9RNjB?@ zp7_$16`hXi)9c9I@?qyG8inR{FYipWy?Xs0PiXDDU0uaoJX1AKH!Vxy>O6<)ZqlaN zjzi3&$r;s%J1Z0K>SLw*Q|oC??n9YQ_*wyR1}<$G=%XanJHJ8$kXL$j-lgGZhI;cr(;A4JF}HDCQHu7+3vVY_*8@nTcJ(S)#pU)+9c<7 zfG%HGNnX_)b;%ArpFw-g!Mcm}7ZMI%X7_qx|5^(-f~;FKTe^`!+{}-B>&WaB|D!cl z71?)v&*pdfkmF$L5iub6M>XR29Ip@Kcx@*4+==_U`C&-?SXoZpO+7?ytpX2=?6#3@ zrayE})uDqJtz4`pR^EJ&vBMtga~hdnOBf2+gS!|Kps(KV6>st~lC@{7xP6Y)AAVFE z6wFXJ8__MLpcHv)lk{q1*cE<{hMvcUqhS)8EDbs;^t_?7tL{7`;**Qx)9nRk-;%*k z=Q#xGprbh0F;G-jr&ALY!bDD6w7li*Z`IPGHV;=C?xi+=y41(8Q%+PDWku4i-w)Y& zWtTplT?2iw7w+&678;-DBEkbtlGq^$q17-9C&fX3oAqzhAE7)3MQ)b!y^?0^xvd_Z z6tdUzF}t`k1DTDrdN0l5T^gI1j#5Zw4BPD|{kdD0g+rPc$F+TDz8V3GKi`^n^-Hxb zBG?mKf1;Sjnd}YNJ6C_lU@})+B<){t6|*zQx;Irj^d@C>IH<@uDLrnlD_hH(YR@C8 zw|i|*F76mR>#{hlyLf4$msEP}BW?7#d}l^Z@Eeg^L-U;2TbCb`_Ku-Hg>bS;xT)i6 z^w>aC)pXTOO0iwB5ih2cG3KuVIhm1{r#9O#eSGv#wN+7ci#69~h4)mwClJe5WEkw} z2$0xl56THmN-oe^@?KdIO>mW+k*X8%FhpDEbV2bfJ?TGdJ3%>HAK~cwPmb@gIX*!! z)$wr3h7iw#uIdk6iqBuV+1LYGYKV^EWx!xTxz=t}tzpeoM*A}5O*dW8Kl!_NvKgwg zZdvqarVXOLW!Q=FY}Nmh;d>7KmEqfkAjOla^!LA%_2!qdF8zH)B0(}fmZjQPJIzV%gwJ^6_j?ZF#E7w8E03#F${dVp_&f6*8z#=^-c9Q8dGq*rY&cGV^#qUz!XH4YQK+fUM>8?Pc8+sE6cN7~2}4@@HeX z$1JQJ(QSE6lf8Fe5*cU-nrXy8bTL`3tj4A~laii4=2@G~^K~ByhkO}5~1PfIDuQU(rZ%YN>(nPhY-Zx%-5j1neoSC8SSGy<2NJ(l@i8R~i{Tl}Qy zSXNeH3t(nD`qANi!}W@~8!OH(8`q1Hdz@8+)j?f{eYn=BI=v-uBm-+I>;cg-?vd-- z6c}_Sr>pFWuEOxPa9|g%t;a%PA}vNI0#9$t@XpN=NzRY1paef5ael?d`@};{Ohfo) z$xCR0`N`<^80tuAiwc(aGxl)ANdY}0$d(7U{X<2fbLeV!l>g$r zCRpn9ia|;P0A^bs08E%CNn6WwDv-#o|C?xEH_c#^+ws7r)m`X;rc`22Lt5BP@zwQIO1r3Y!L{0yySaIBg z3LuDNf5YTylRljx1c*=dDXz(8>uPnSjGBdg=k3L-Z=bZ4^e%R6M$!4Tjrq9y z9;4ntdLe24ar8+p8Bx0{D&jCqN|&|sZSnl&;3ds%?QoW2o@rP1oBiU>+asw>Hxr(} zqui8R$XB1Q(Yr}AWa9BadDT2iiQsDP-d0nEbt>t3X%S28O!WrmtGUbP{Uk z@j`{IMOyo!c56n61=>g%OX8lhPk5gy-H~;QO|5NXZnHn@1O;8a1G0>ih~0p(A}EY( za|WA$;JW?rhI+=J+VSQyN+O`{hMFd-@9 zO-R@{kZQ%<3DtTL*pKZ|Ri1JIw*%4W2#z;o;bo#1VM^3m(W>5+yFu0N(DPG^S_fiC zKf}LJnRHBKe&!Zy;fF~Bw{UaN8P-#tN=2^-aZ-7HGqAO4g%S=PvZ?1npg|LF(I9Nz z3)-Z5Mr+Bh6F(lEK{R~&EN34IVtQD`iu&h=EOF_GhAogdP^tw1LPi2zMY$=T< zPEF;}BA~B)<+h*?m|0b@fzgNw201_vCTMwmC=(Uk-fz@Ua0eYDyz@-)aOx*e1HJK_ zxN}tMuyaEUiqAZcH4O)+e^# zOxW`o|L}Q>a)BvYlVwsR?L#}iNC2WTs2?mQGLLOYd0BO})j<+$Ecm=qBE;JRtX+dF z(d#P=k>iHisI6f;-t6H8^e;Ju-X>b^0*+v_>3?tO<=y1v6C^|vM@cRwnxThkcAjDr zog~FFZm{2MXC%9-h;6_uN8I3gyZ8!Zgkn&Ex)eH!OI-R?7?xs$;@tI?y`;MRRJ8d+5 zVYoWVq@bO*+RFRdt3zKLV1lxZnZJt$O+ zdWE#6Vd_i-`A*^?J>D$`rCoT-aHr_=fdCm9B$({f25-7=MK#oXecT98!lE z|9{AOry$wFF44BQ%eHOXHg|cKZQHhO+qP}nwr!sJyF22Z)AuzWGBR`KS{d=>7-N3K zJ$?||1z8?7Gw-CG;Kx6-Jwq~AO<*)0S#v3$mFb|o@xX{;2Fc-)S<=6?LE8@ z;>JXppUT4?v$&|hXJCaWh8ODowLxhWVw zq^u%CGZwFzeVYYb?v;r1otM&4HngjddKnHd|;#TftlC={}vzhZ*y|(de_sEmK33lSytbeVF;d5SmRfyqVsUzqrB7`$>F69?ki90Fa#SNY~ zxJZ{4c{iC=4@VWm6L8Zm#za}2!|P%a{ZQ-jMc|Bpnd;hiw5v>4jKUC*)j3TTTY=>J zPr2A=to_uV7vxU7^hKT`=OmR%7f&TEUJ`3F&|H+Iv8ep@)v^Au`~BfeU!7mZTDRbk z8Pj?nkyrqR2M|nKHYb4N7x51Ir$4g%<@O7CPZDCqbsFBc*d4_WX;kd}Lf*IkfxJ)U z1!#%gF|7vCN2QeLP!uZcYUjJD9V_xnr02)ZEp?M}!wZUNTAJdW2k_u{azn~RmW#a6 zp7y8^L@L=pS*Xh;^0mY~rltx-*uWTCKq)UssFb%NHhDd3#xJkkP)a)8Y${g+=ThvN zhAAZ&|D7NMhz;aeJO&PDVWSH#kZH!JM5!c34TcXrcVj{Lm(C~n*`+}&>$wg^sb|z?H&^_M@o_rvZ z)RAgJ+Fgv&$0zF%$w<9O0O;W~=3=M^$|DN?6Od59$?qcHv+hdL#mlr6rR7Zr0L5tx zM6Ahiw1({JJbs&IP*KN*l=ELNgEofb8u~PwkQ-ThQi_GCYCN5I^h`{BA(VVN4i6w) zAF$Z2o`8dF;spUGM`_hRjfq=Om%dI*pQkTpuFqRjQEQwzLEhfhqL2k-rQQp20)EH? zMHgmk%1#cMXROx*rB9p25d_ZHBHN?B7)cTk>=0jd3#k^Ss!>(>>4a0QJo=ZYU1HTM zZky8tcyTvRpr^r-Y;npXmZ1y|-Yn@3gh_ZMea6T7c#$u(_K;L(3RmL_T+88lY;~>F zjAKJ_Jdl)#bYfK59l4ZJ_r9~N>V<*t=QWOA5soA>nu0rrjIC%Vb#j_6q*UEAAMl$_2WyLA(xoC$FV8m^&ocmJtvbT$EjyBMB=^f~n;TWqU+oMcSO9AV@98PXU+)o|lCjLbzH(V>M)Y!THI;OdW=+gE6&q57zAp8n0k# zylj6ua4U9E4y=YWxNj$s^N}TgjqC$R_aGa%6ZWvcn2|X8u)q-%s!3xnMP>A;<9+pM zq_NHRE^NoRD6VN_T2(NilpzA&cFti$f)9M+vUh?{Idf-z1&Sfr51cX0sFlRpI(2Zl z1)UrNnFo80tvkqI$cZUT&=Tw~LTCp`rBeR9NiDgvn~WKY4D63?}{C_DukqFH1gh` zOxd)Zg^3b%B;zO9^?kUqHp=3k=W1FqN=n2vbdi$QwoK)-KjNAn(R6>E2pYTnZJJ9J zRcan*mA689TsjkBSZHs2DSamCKQqs zfpUKS;E;XBL(3)n9%^C-N;J&olF#+moOmimBNud0dVOW*C>mm}l{gU0(`Ct5Yk}__ zardy#IN7gRFj+r=`C#4_&nLV7!j;C6%55vgt{6uROHDIOyZecA3F>9md?^P!=7_Wf zxbLN-xBg`2Y@PeSz{=;XCGC7ol6GCp1?24CyZf6R>G15EoyC4G4z8SK^yATaAkL;e zgJnBmB{%t;#F`OzPyf6PhKh>5edNhHHeRkQ#DyfDCZ@d2I0<)vA_dft6BV<4im}P-(CUPkIw=P> zpD~~Jk514~Lg}h>p|wFLEs#C$7k*}Hd_HUVKHsI@HiVv8J->H)KCl1s`FtF~`FtI; z^n89^(D@wec)wrdeDAdEEU1@2o@iKER2_iIESlXqHlxEOlRb__Wht|EeHJ%Ue<%97 zavOS(#YNfdieR?j>>+753WhqXtjYd1oDpYkZ~X^kgtj4a_<#7W$6Huq*M$4E-EKf@ zGB9}ZoTidpUi6P2R%AHFhO;^Ns24U$tft|hqP;jzK2w$a=-e#yA$cV*1!lBWI z4Mc%iCwX|xC0g(Cz*KJb-ISvdMmr~RP|p( z6l|0i_R)bvsB%t2p%$cj_$(x&X@m5Z`AwyS1of19#!yH7Wp+FT6PNU0prqDGVn>zP zup-u$ zP$1u44~t#8B2%ms@ro{W(%f{Hk{NR^0n^v^=ytTAEd}zb2yG0PMtHd!up9~q;Wa8aE4~G$R{CIq9ST)SJT{*t@ z{H(N0aA|IT^J7756Y`m+_UI3mh>VhM9(Jb(uy+1~yOm2AaRHFEz{8=IGmq>q2^I43 zj?^u@^9BB-`sG=^SM5z+JM=(40YlO9HDweTZbrUUbk3@pfc)wW$wr* ztrw`p@{W$}p&E2fIg~V5IgZF?XI66X(<5K)n>u(f;)@W&YJe z$<&<=WBk70TK?LllvM8t>eBt(X!-eY&?N$115bz!Qui=Fg++h3!F~h=J6QL5{j)9h z<_id^V%WH1dn}Xrn~8o1koqqw{USDUxoCO}kBH6oMcTS4g?Lqs^Qx+qa|RY@8=K4E z#|!#XTc;bBgoxV2Vs zL&xtJ0IDbTT<^?r1vVuLMh)$ev`Nd%cr~QaN}N)dSIjhl_?OYh3Y)P?)HqQRjSp77 zP-bUtI#+I<)lq`g&jvnG)BWFQG@#hyoPTZOa|ET9XS~pVVM|N6#^9t?y;w2cBt-y_BLqzgC=j%l&Edx zppY#+`46HyO`by+5>@d@5k%9I6urE027Eyi{)9P$)t_8q_1|+ykN<$_qJ>NU0n>33 zIOCGjCmNdz4M(0>?JIx5^oGXZfv7qbkSXr6Q(|j!cpf_$O8Wuu5OY?3cH~qS!L@9b zpGf6?YcK`Pb>}Mx541XU6B)oz!k~7OxI?*;QOAmbtW=WVB+Chk zfh_}Mrq_+4)|{A zxM&Kb?H35WyC5eJIUhcQUsX2jtJ8^wmom}}JE4fc%jC5NSoX!>h|GneJu7B|ErkPW zcS0^W*3xc>P_@Wa^ounLG4?+*FGtN%ExJVPhAKEva7JWjq1&f6vWE-*xYn6|Gqr^7 zrwo+uBkFp;4f&8}G=Wr~XCV(WEWZ8ARWDqfpA}v1W&fPY807^tw=-gg4feD0$P0cp zA1^+6XIPzG6?Vw<;u2EnH6Bf~mz{p!8HQcoo}McDc3UPf?67^1P+lj1HIj`Bq2mK; z_EYv#VyMNaA~ki~ZcQP&E4K2$!JPoTE`2cD(nX31vE#~vhU!;&(Bj>X97W8kn*?mf zEMca6QG+yH&>rBiPF_3P%8-Xi+GwGCQzns9>4kPfO!+6#jp}K~oC!hSVE2dVN(gc; zTv3$In?e6l2?V?~Jqv*M>VrYi3|D8*Qr!`sdM_?O;4`D4w7Y)$gC6xN;dXb8aitxmMs&&FXn5t0B&|A>H+g~YzFXQ zL!^}Z*qW9^trlo47PPi+luI<$0fcq0v=?<4V>NdJqJB#l&ZMj1%#-aVvnxxy>r!1f zUFo%8m10Fea7PDUAxzt@nSOfL*xkmz38i&6o%3Weu9#wD8r{&XygZ$?Jac9{9m$$& zu@hQDo*D_vdO4U&@;fUuRcDaZ5o&-H%S0}~G03WnKSp@DN+XhjF%tT^PCzqEpd2_} zOr1BtG+LnkuFJP+6+ciP{y|KbeQ~WDb6V;m4RbA=mYxZKYX=!a8X1%joq#2)rg;jwiBc#5aq>7j8u42?_tnQjMkRDlyTB0@6cNC9og_3rJ!*|xyyP>aO5 zp_k|$Xi6U1`ginghDSHBJ)=TW34&Jz3Qi8B0Aw5ibN@bNApY=%!2z`8l%HXwQh)eF zLr0qUk&q(;9)sIh;HuxfU9BHg>qIOxm8*sv<0w_4jUBp)E)_{}!rEg)!M^_7+?A~c zg6QsQ&O1QJLoXn`%P7e7jT?w{CMyxizYyW+{Q?dqLhE=+IvRM&&Hk5zf{ndq!bE&r zoSDzC@=hGVK7}=ITii42`S-&6V7qXe(pa-37ZsAy&R`_70LSIdOuY`RBV`NOmG(eB zL`Yj~ICMu2n@Fh>gxWiF;EX7yT7f}{l2$sP2AmBQRmiMBpu%%dtZ$q&w(5(KRh7`e z-%&Bu+Hp%MB;#h)1z!1T=uwJ0=m-=CI-y9r0_@x}Vx$GzL9#ElaV3}0IsXSZmj<;I zgr`+GLNu~LPX?*M6=0u4a0Rmc{p8uS1%v->uAM^mTY_ysD*9i)=%Ly4>yf+ZB?Fp(BUH0WU9 zyEuaoT#sMf*k1%HZY~|*JqYGn#yN5QSNiW{M;$nYIJ&oK9~FxF)dm9)3N8_l3gEXZ z{w85n=dj)k9FY=xN$oLY_aSPxC9Msh09~I9Nm1Xs(Oyl%hZ4i;i&)~Q6^%du2*~Pg zjUEuXVOSd%)7PrH7HC5m00Td4%2Y2`kzP>8aTtwuy!a}sb_qPT%1FKoh1IT2#%N#iS;Lf@??J+ zle#=pszg6FxU4UKyiHlT>qKQBbjV~W6j~2669V&aXAZuYLG{5uZ`8ogNsS`3f`8^2 zG{S!ADbdHHCdYVIg9Oo!w?Y_m$;loljl2W>d|KB`1w=^rz#0MC#=C<6^(toIq!<+= zt@#fx`D;bBP3R5B30{e^hJUn3=*g|T6Z{^QR8BAv00uO#MXsRipP$&r>c4Os2GMWw z9^AJeD&>{;pDm0A>$i($Jcqgf>;U_1Hno}d_0^g#k3sK)-ucnU_J1oQOD(&MU$z+h6{^VD zglrLv0BZOf5cpIgO`nKKqq0z9K&_P<{m2QnOmLr*y+Ldfy-jlVlL?}`h*&By!s}6%dUif^!Rg_q;7&z!@i7n10X#{WcYz%< z+{>!`n_txf(;udBPdnmjkm(Un++H$#WRs?-A8}&&*wxvP#={nGfk^^r*$6P?Fruk9 zySL297-$_=e!rPk=~+^A4Nd_-BE?P}OGyZn65BA|Ti}!e^MXb6rO?CA9(7T}t*7iQ z|1=6&hfY5){_s5H&$b^>4k_e7jFk}t5j9(PL0vTG@t1+SPQTwY!|f@Hx?abt7f-am zXo!@F6ghQdxJVo9kF6u=r=TK@%)rlU$dGo0*tpDQvbAZkx@VYlY`s!4huj^C6c}|F zeY&m{%9o6bsWuNasyU0Fu+Waw3&~5=t4$7;$F86C+OxH<*YBAJ*|D@7;?ihr6|C}9 z0L+Cj@P*Wzov2WagkCp3>N*71xGYz@C(dPqnbqmqQ)YJpE$LYm)v>l<>v3#JAM z!g{6B;sz7pV2EXn3yImYW<|H!d|#gi}PdwHfWM9+6D}p%t1l zJnFUE$7*$6g_`)k1E^S!JHI-c9F;@0X}RUb6!EwiR99gKQV(q-I(bN0YH^;z|D-lJ zJ@jG^_>}2GN@t~xei^eEbcMnPn9Ny6Hi!g! z`4aH62>-H%MWp`$3>~?}-p9a6ehmd3cQdoMbqnM4BaGm*Y{Ss_hO7yqmz?@tD3+ha zslrrGyEp=vCEe^@;C$jkG`0=J;Q#Dj5qOV6Ko~Yb~u;3cz|6%;&8T zg`nmxV-2t?5{Q75rV`i3I^N1&3U0T*+&;m&&&F5x?BSZ0V=WN19EfRh$%v!r!wEwK z;azVGm$&tX%c;0C9WZ)Vif72-k5ZHJJ>X*sKOG3Y=7IKtS`jGD(2)ka+v9ucP6bwP zA4&L0b%oTp+y*d@Z;+>leFr+;k)%#_*w;X7lj~5csA8<}7A7tgj}5cY23NC1(I+tk zKMSJwHKK!gSB{2FGXS{KK=8-V5_km-qMs?kC7zoDf-`A=A520jN)rBVjbm#v$1o7O zSW3L2N!_N0QwU5LWw214sSv)GPOdX3UIj>Kk;s-PO3E}L8xZipq4+n^K&L8C%1b2D zwHB6a0yC9mI=JfOINgBX?v4++UWW;FOY07GFJPscAJp}rVXc;SX^G>5?~!g7mypM= zN;@GPk@cbnS0SK`JFnB(QVLvlXL92pdO<)RC!X5YOl@0CCm+qnBJ;=Ne)HB-??7fE zyf^$Bd?5^!>bY09X+L^aa@kFcx&a)@J)O!SC?Vmqd4NLi;Had$c!d=QX+XymB=Qu& zk9?3%h+-bUpe0uesz|@@Xq2YKS3yzv4Gl1H*a%318TPLwM<+Ky8X}wS>X6J5xPlD0 zR$!mK=o%v`q2GQXBVJV+9R)e+6!aR!J!_tJr^fA1^x!|mb&JH&c{)U(owTZEoU+GZ zDsc+rubMXC>WZpc9-`#3;9`@ExN%QGA=f+W7h3i2%AUD-Bw@hxtmfRJRF(Uhk zP;MYKY&A*z-)^sFc;B4;-nPscD&-bjrx}{H+*m9_u%zQQ-pRcYkHE5@DW9JbUX}?CB-6PGPs1shFr+I&$t_JD6gzmgL7@X0B^ zv{-a^A(I%hkHNrYk?msxM3mFe^W99`{DwvOmVW=STpXQ(gWNQ}$^($&sv_aE)+0NN zC7dNT`Eq~Gb)0P@WlSl!zI$XCb0KT;Sx%O!G2_Y%BrCMj#2~T+YhMSnx#hNa)_JA{8TF?;~JnRm2^?C4H##=qoowTDIiSlLn5*!{JO5R7Ilz{vxx zbG%O$S(^sh+t3Z9@iiTwm)!ys$|pH7#k4QgBGxAQa0cTTh7kR;hipHnz+y1UP-w0l zTc8nvZAZfEhka>HX2JyJ4f1;%a1slC)f}xGUWrs~u~PNJt`*usID>0jT$X_X;IJfU zS=uFlnW*`eK6w7~9!MpOk8C7t=o$+kfG7%c9%k&e>3jyx4- zF(Wj=(tAQ&5dw4E&elK%eO^t38;XVmUECGs`5K2mkEN;Q&Orw?6D6W`8J{&0MBTt? zjV4!Hl17z&@y{A9Sg-1^h7=H2sxYcL{CP5-8(xyAMB6GgzjJ!$t+gbOahQM>lcX9u zZ7X77y@(Qp%+MFrXkIYr=Kb6N9I$b>>&)IS@ugC8 zKE%a)2cs=hbJx9YRj#jkRX$+fQMqFK?{7txbaSbnpCl(x(xm-%Jlt~n^uRt(`MkXC_>eKkL7dfCaDY`;1JsV|k3vd6 zd4)gG#O5{E30jD@=6Tt|he4OS&Y}emGE4f~fP1}~%EgfPQX_7kYmZx5@dL41Gg!i% z#S^IqZuYSi*DZy@sdC35}ZC%?8+yvaWW`sEx+-eIQuFc-b(Lm%Ij ztv3029(j$W=0yxoL0ScW_uEd8vUuW#!%0Y0K7wbY3tWCav)lhQ%9tJjDnSqcfOMSy zT{~z0&nS=7Hmonf8mZh@4A+n zQf^rJarzOCA)i3gg&;3vc4=pK@%j|ds_3Y&RaDrV^L!P3w|**qZSZYAUAg_t`gC>o zXm7FpRMLKcWo}Zl};xajbu#f%0m?z;0$H&u79pdR-R%$`Y$(Q4S-A0s93X_noDW={KgHg2aSdU30s zQ8?>VC^BY0Qe!nn^r==Dj4zXJ`zQ@N(F^rboWYOEKijqpPwmpgMXd{MdyKF(1oc%q z6got&6-`>lqarB)@P3`iQ8;pP;I#lIDNgr9JZR)kV;X3(TKvTl=CkKI!@w21+?TqB%rOAU4;z;&(jr&qNvXD~MaGf-SncB1F=%SPtF!cGU zWm}65=E?Dor-LFQ*hCYK7DI7@A~jRwXetF_?t<5KgYpyL01A9r8(Gt>{U)jq?0?!S zCce?Cdnw88|%fFn=IK7U7mgm_2)M#Y&+E|Ezj6rr^laHS3_G)J|0i5 z4Q|Q{Q}=h*J>Q7JM=|_L`=sR?MFEIE{9-tn`6JU#g^uzWj0A==kN7bzo9?r~>7{#T_1fHR+2! z%3Ty$lK#NsUSdl3y|qIU;VfkYbHP1wJsXMI@*lJ68MXJ!aH9>q) z47lMPMyB!of<<;fADJkBp_OV)B;t4!*eSYqB-qV6G7s|{i?(4}cr4FA0&QKj(aY2Q zpR>!0{S%IUTTO>sbUomoXiBzHb?g))QRblmx_`WRN8l$Q=*g%@bYET^YirK^Zl5Tp- z83;t@chA_PjXEx+E^0V5@#!uxk<$1nUu0Cbfzsjm@A~`dFJjf_@(qhuMRLmQPCU<*%HV3EsK~A$s@;X1Q2&xfr?(@au$#hH0drpq3OdL5 zT~GDhrTC?H+~m_s=ellVr;;E>pO)j2>q6$m`T0l&^85TEf?i>KE${yl8X^n-KcQi0 zlGN4GZR>t}Wr5`7LHXKfHB=V5MgzY5|8BnL9j~;p`H&WI^V*UzKPu!z!ELS?xU$LY z+}Fe9boJpU6vkJ!HY8@3`fD`lizkR^KF&rFLd*oVDQBD6y$c6OqpqOlFc}t&HQP6`<0~#jva1NmF#6{sGnYq)~T}{E;5hR#I1Ogf8OST zUxL;t(_cF!j_m%XEgm^oXD!aK6+t8vC;8ZPYQp5La}7oaHN*clOZz+f<+~(RuzkKb z3tdw8SXxuLuo;$#TD(%Z0vnhA<*u|_nQ9Y!0{(Ak34C}397;x^RmuW{Wv zi#ENhLRZ3H1F80hlKCh#D690y{bZkYP3BT$lg&(652TW}N{O_o_QkXiYSKKWHl>Dm zSLTGEo{Sk@!X;mltxr*C&Sco0=4HNeGjL5ccc`SUf;F}S_?m#+XP~}sTa9i{IKCr3 zPES&?t_yOe4X!mdhgcp>o{)7rF{~1LvD(fq8+7*_Ue5w8cs%YMR>wT<7uv==!aC>^ zTn-v^o811)K&fa1esXhub-G5poSx9D9`U@NVIOx7X{lPeozxhZkj?Y7jm=M?0Omo* zMdh zCGBLUrS3;L-K$aJOo&%2>bthC&}uj0blrw(b-HE;@B3DTfZP*BUuJk1M6=! z%b=YB8Jw=Seu3DS7}cPu;^UZvn1|ks}I^-WC za=sg$mx2m}rnV|d41mK?1TZ<-o@()CE3~GgOZ&KBYN26m6_+{F?S(7izF{v`B-q4} z@q1$;_P%D1eo^006TkMJVK+#|Qd=T+P~Yt;0KR#dmz}%4(kE46KXy11EAdJ{LRpe7*U7F^FCPQX~SsxI8vWGlR}K`fyX>fxOLGyH|aL(v%OB-RJ-ayGq4{Tm=pxD z;XG6-rodgrPl|d*emFk+f+Y!L^X)N+xS9NQl?z&hXJ-5AnsQE$I1OvY913u1<`ngy zeHvk$V!hQpZ`}F3n)!LN8S0tG=o|!4&0k|I0aV)WFxrejYWsCR217463;4wT%l+6* zLbb3y(n4{geXp)OZ$5pfHZ?V?`_h^a(mrz1VRlk;@!CisAFr~(?D8h)L_~I*Wp=A+ z(<$b4Et`4G-`=Qko$<<)__z5)Ksq^a-^IWYV1ZnPFNwO;-+S7rM(=AmjZ+fx}(x1xNp`eq~;{DjH;!Rtd)>-&dR#- zQf3qsq@)5io;~A@z5$y?FBSC^M$$TyAvEIfbjWSP70U1BONFL2&L7B93>WV0k5s?m9T5omd?e`J*O?lGL$+QKhOC%Qek=pit!UF zl^vDe8PH4?c2|t&H&9Ntb2F#1sqq*SS2Ux6i3AyKDnakWk3Bch>!Y-7I&1YI&Rlfb ztV6e9|Ar<(BfjNW&`W3(dVX{N1&BT@)QZc{$XBl9n2Uoshl9MY_4Tw0V+Suvs z(;I|Xt9dr>&j`RtYO{u5>61sLC6(sC9!i?DSC^S6-c!A@(`iThSbBbSI4l?WOk!&3 z=yroEr7GM6sl{u*Wk&J%efgNt1+!Kd|8k119%N;1{rRtjGN4U?XByG^R88``db&br z>8LZA!k?Gw*5CO9)qUkO$hc8$^-jWC*H%l6!xRB~LV?Pt0Lt%2BN0q|hc(g>y<{ze zrQp{?;fqrAlNr_NH2`I-qH-u*Aa56p8EGaJT}D|AN>^n0e(HX#o~{u3FAt?%EGQ=C zbj%@@^CtBZRo09+DIIKzQItK4R-;`VS8S(0zR-kgbk_NR`b3K&&-+BpIF)IFjbloF zSb~Ac(w*GlxCM74jm?-7Eu?&0U3y~=4CdC??ip;6AjUeKP>8rbA8&9pe_G;a{ zc1QO_8rVqC4YY95F1JY}@rFCk_bI)+LKXDjuNLp5?F3XN!5tYQirP9nkV2MY0v@D_ z!c=o=dtO@pUwQsDl;4D}^<>zAtngap&U11{I`{I~-{4DH)xg0)fev(arh z+O^oDaSk=U@J;?RI7%q#6NlAe}b)SQi{`teK>W3q zr96TLz?(>1!a0FtK`GW~7O#7FyWpD}0@_&yxQADt*xq4LKU#)Vf;koJm=RL5c1-0I4YZNuX> z!0g4;vufBlt+7P8=>!V!i0IlF^n#v>h3T#puP_txW!jLd=wz_&IER2yd%ZTvw70MGac;YE(ccUFTR z{moNKA}ovXyYOoCzv`i4b5>nQ_{Ct{rkA3MDv8-Q0PXTuBP*fH&(C{O&>5gJ?`>8f zJ&#>vO}F^StlEWd#@bxl`BB}&Gn$zrex~kd0S||hqXN2qpjN3&ARgtP{@n5a z;%^12!Jl^U5+?EMwuOZf6MpmFAVj}*fRl_0Y=WJp+A|J_^KbV}u)M=!t2?}-CYBc& zyk+S;@dl9Z~O=;FA!GP1Ls)fy{~o!@$a@H_g{wNuAd!8qt&Zy{H~4WI@%f zFhD<&bC7D%EjtEDYN%qUISi`>+$E@$m)b zIx8pRDc(!|_R-S-60r$EO>Ize>ib}T6x~V6v?J;4&0bRyd_#D(z~Rg6#Y;2u*umYb zK9URR`AtM=<_w`n+dsm>FTP^JPA1hMX!u;7#X-+;BObBmV)k$0vNg<$Xh+VhuSmihegaNoq z5Zd&^GWpS3IvRT z>3d?7V7CRA%z^+e_)y)UZcs2otumU8R2AY*vZ=*@&qyCxmwc_ow}ST&2J0<%L%DQ`pO`v zqMDn|22dG*-p{`2ru!j3I?pL^n~f9bq5`xZ;jZ3_K0Qf3Pl!kZ3oJs5AeChAcN$ni zk{DYAj&H5to3EQ0irIJVR~McE0@6>SYzUZrR$L3) zhLVhb0WOL-3lRtIlW=CNY{zCT$qOU^=3d}S=VxLFb3p3Wmv%E$E(l?P?M$koN5$NE z+huOlyZS^@Qvj&1LZDE@j`%Xk*+uSZamOLrHWqQHjgwXcPl(eprR0Lm0RDB`;k+Un@bN|3*%avSlkG^ zz9l-8V>P6}3mUCyp`MKS9t^1>D}oPLo$N1I!0(|pYbx#ykP$$OlqxeQG^7{t=m{5< z7-Up=&+l7eacyLrkC+#Iraz0Ok41{v$;r%S0y>%gs6hhOf@lrBMyi1mrmq_Xi-qzm zvxTBq62C91G_a<`HagGc@sAx+z-So2fQNxOA1aQq0H8f}m@iNuk(bv-05BCufSrg+ zGFl?*Y&uWZxLLf_A_Ly06nc?cX{gheeAM6==`Gkt=o*TYf3%q;=`XmN6Ri54UQiay z^&2l+smq{aKova8vZC^))4}w*Zx6T(EY$4@1b2)}M#=ydMZe;sf{bcGj7Hf5i1_D=spjE?R-2d zBG(|?e=@`8{2B>@DORY*UCKhAhIy>+2_wK*I#_6ulDFuF$i5=M}ao~F4GiEJHGV2O^;x@b}!C!n;Htc z^-g>aWBg%3%Q2DqMjTJQi4OW7xmlG+;>;}oIsGyv3(`0vRzrhM8xq&{d z6RgWbqYJOFj>viyNub2Cl1*}c#-hOPJfx{~*l4knzl*gd>1De|f{~XZr$rGxim$G{ z1}G#v#%72HjbUos5itD#bnB4)6*nwD1AJ3@DkS<5QQ(p6GK@72VkfdGj&1A{N~{I^ zNQ5`pI2rE{a+Od!*YiX6jQ93H6qTOTgs`5@B;T>OK6D38m!Xz>CBp=j^t6#qxJ2-lUIEy1p0?v=@#CA3***}tDI$# zEXCh<56rf~SvNEY?w_>K{@tGkl-k7M&}I*))@j#rvyTTh7@w#~ACR{d?wz$e%2;5e=ytOMjrj8~7Yay_H0{GB+Z1tpA*(+)1j_^XeE z!L`K$tR&y%oBv?&6??m`R1XB*%ryx_Og7Jng)aP~$G>4Y=ET|r1+p&6sPn`V@)4I- zA_?twAdT{@ScYL(DS5ZIutU4wzgC7kP2ha<%$o~o4#7kHWe3F-AR2UKlJ4xf*0`gtbVv&kokW3%L$337LC1S*)$jG3QYw%+#TlOGTrK7UI}2yvG; zFA;96XWWF>=tZ%qC6O$E*h7-Cb7Hvd4Wf8>9bvF`OxrXO`WMoLE&gbjXnTm4qA_g2 z?XS%2P?o-8gK>&d*p`lhunU2NnW{}s{LwbCyn3$Q8d~r;LnCOAWgF!JV^V+~V3}te zrs@^7pn#S>*FhAfbK8ozz9J$WGWtg6pjOQTj7+J6wx#JjQois2Ehcxliv6}*9Od{2 zmcib0thIXYg>GW2fpnl}XUnU7tZWC7cWHzmSUlY0jJ95Yo{$_AmZvL7*uAE|&?83C z2s|wp%td&Xvx8BJ%oRXYzIl*ydRE7aHGBTe%fYzILMkUKuj3lRVty9n-x5~u)%bvE z((i`>4CNnC?d0Y*M3s^EJ;l13a9|m2*^H?9xqxPHO99C@_C5cCWCMedj*M2klPA~T zb=0-JWBKx-heN2M(P$LfntPYI6|}++vU@$-t`8Gf!z4YsFg>nD@Py4@{T6GT;tXL~ zv*$NSb&}Rne1?^YgUTfpFS1;Q1gkb#tVNFw+(o46-%uE5Bk%Q!u;Gi7QvRJ82J5tn zR;v^{06+AN48<~KUQ!MGkb}{l0wYlfaW!e7Nt5*{-q4V_dbE_yFL6cpsLE z`o}%|+;ol5E&WirP>UQ$qXT7b3;-;wvNUIcW3b0J933@{w8QO*E_!k;!HCPW^%%an zbuKJc&x_9R)Bsmcrgm)KiRUw|LDvwUAyA9L)@CUH^y8LK#OQc9p$D1pUQ(hu3$O|6 z(&+%WKH{Uq>sTIUaYhpcEijJymw0cF_9ENq*J|hck`MadL^FT!wn0dFH-Wk0M8le5 zor%)+E>#*q60l7%(DO z?oo)@+mI|8rn?E&c@8D$rP4e}@UiC+nBlqnZ4=#}-7UAVV(;x3&fVs)o_GjF24oK} z(_V4Y$U+JU*Nn)fYlOnH;}q4oEDh0+FoFO0aP*AoWUN5_!S- z%-byJmmHr&VdiIYsv=Bl{t}tO)xF`LcNFttp*WQqaMP`~|3istX+V+PfjkG^J_2;q z=QszlLf`9W#$*2c+xv~z1HktU!wGTH?KF6tI@zUY;Uqqa^x$&mu2W5k?mZAGM1-AER>6@%xUxUev}>V#u-gf#A)BcIXkIa&~5NOAAde3a=tHOdOkJ3om0A^a(-rJ zdVU`M?)ZEk?0i3d)$o1YKj{1(Cx1Vm{Jea@J(gEo&y~}jZv`>{?Wvcw#-@gL67@Mkfvs;1C2cGY(O=C4dnUfV+@6Hk?bK_%;xow10mv0Ov$ z)!|DD37f=-H45kVJx{h7B%=ctYMbD+QpaDiw@<$mHoz>ed|QSn*BMPVhP%3gdAoD@ z((*l|U%K#;v1817Uks`t@4+;ylxaz=t zo~%u=&{@H~I9kioudd$`OR*#A>Q8aHzU2bRSQQ?WK}89qk`lt=vH|}OSN9ZLNgK8c zIJRxuwry+0ww;MHv2EM7ZA@&N6MK@K@81Wz{(aI_>!54ZdaHW%+ttr?-}@;|oUrPA z?5)QBX}ux17F3f2MgmY>fK44tzk=nq7LR>Ql91hQNAZX|%tG->D}(l}ckw7@FvYMv zMun&@s!Pqqur7Ar*MqB8Dt#QC75{&GYc%0kmGjM|^pmckd7 zH~i>m+6=uWgxTPlf1rrbNjmTi@ZIMJ3$D}@Cs+I9njSCH@7Ve62!Q)O`YlJ>O+Je2 zW@z{-qsHJUuiAn$h8l9tL=(paF(EEMmD}WwDJsPmrJ=b#BX8IZY{6ggZ8e01hG_S` zVCZ>U2n7Y1KM5caD@ymfz3|&jzMWig7;t~&FrqKwny+o*c43};zC3$u z-t;E7JZyds_4VfL>_0y9s_=J<_bwW}MJiBbT?FnI-mZ_t`Y|*#N&YH-c;$rZrCnl4 zi=pH0e5CfdU~I$l;F$y)?>l&InGS%h|M+juzNRJAP#?=pq%usD(L z-69WR=_x;oZhxOg^~$~o(6~}tT*S+=c5gt<0k*Q*bCf#x3?=r$<=T+geE4A0icEEJ zHG}~5@-gFAqg$PMX0a2+z9%G{ng_(3>HCyw^5XfN0LSe|Dy2n2njKS3QGq^=hM?zjZXDnE9|5j z772&R3qd(m?Mv7r{u>01sGOPK8bXmfEP5(qWSN(v=`a;)Ll9w)ij$m+7Xs0hUTJYp zrkBjhlqbbKB}dnJ03)+AQanIg>Pmvl6X|fc0F=|*kRe&t&HWQ??$In%nntkvy)1sr z!NDw8l#~iKGe)&T4S;6%1tnUK-E4g%s>+Q0=JcJn@_*NxjVxd``t)hVE3Kt-|4J6o zHQnAVP&-tis@e&vvJ)vp-NnY21q zL!=P4B0$OQ!C52?@w4xbp}^70njh|sMlOPWqiaagV<3%!Bll)e~NV1)3+0eT0*;cd!4*ZEN79-vjSUhlm(WAw^5p?zO|r%K zY4O%FuTi6h1k0Kx=dsddOEV?R%aE-p^$+Q2uES}yp}VZ6Umt8LG#%YPYC+H)JTZ5P zNj0BBJBN$2ZsCv7qBIkuWU!3)>rJ`QWy%1`+|C?f(^7zzjID7h{Wsb3jJ=w3W}{#0 zuwYUW`nyX0b;{ZNM1xZJ|HhCn6$BUjf2Hf?fya>Q7= z&)4TdTlr5C;ffV-H)qpwl*e?tXfhpMf@Yqk~n!a_)_ zXj7X;&&AbnPsMy}xRj;o84+3Iffi2Y>f0zV-BLf%Whz0&S+rzhnP&&=>v-EvfG{@b zp~OTcXxXi=GbP@$ISE9KqP-?6%z}TZZ9493e-C628&XM+rvoZTaqPGXE!}LdJ{-h{ z5?e|4i9ZNd|HL{rf`D7x;P6j5S)*e);#ir86K+%&JYS!M>==c-wQ9Qb2bVtJ!g4!! zcUIu;lNZyTX7GML#`a+9KI`WCMb6TYsE}TmmLiT(FTdGH&h;dNGd=hIRCxmACvr{oKd zy&iTi$T-E4<5S@Jq#|hutRtOnJk0@)R>wIaD>nd#@iQydKb77dxP~6LZ~CBtp0DWV zP-0XH922h#>+1ssMd&0un#9tT@XE5)mNN539K5ruR9+YBD887s5A-na)9d+$O~*v0 zp5d5iEomYEVb;fpy1Lpw)gpe8=0i@xtm{0~60`^a^%Rt0&&rUE=cYVKVXe%6@ayM4 z8HD6$1V7WD&z++d%2xE584Tg{oH?-!LI^Cw9pY!V$70z11$?lD>rTRKYdtc`G1smi z6pXx`!HZV=uc8;KV4Yc{USrRn|%Eg+A?FR_H+y~$-gt3I_O*0{8c>rC( zo^p5^Begq2qAqda1*bxvh?HE#7;Iw=%zx;kD6UBM$n*BnT}25=MbId zL$(_(gtTuu46?4TZ>L8OO`YUHjAn0?R-QgUL`XcwGj;Mck<8yGQXVl1cVVS;|08ll z6cS;qsqdzWWL=Bd%yhA6sC<>(%8P|_?b z(?v9Bz3_q$(ui6~9xi+d5*A~!PQR~Vz1Bx^INt=3f$?#7n77$bLQR&t-)^q27-WEqFT!n+gC>?_(3o{>mWF;G-zj=)3U_|ZUmr|iW6(|_R zBk`vi&gYL(l}TyRL5|26lmyl!Ke;g5O$W_n4M`i_Ly4Jfe zMrT_ZX*|S56UIY>8Jh267m#(#@7vT8zgxb2pP5iBp`-*S?WLe_K@&PPZSCD6EF~HR zAws&slgX3-Dx5r*RpM?8@GD5|O0*7A!__>gB`ROR(>tZGv6vsjsWaMdF<9tZeGF#Q z%F0iuIpZ`*&gbjr$(M{avs3jPm<`v_+i#>PkAuHu6E`Kuq#fmk&d#$ZWRy_O->=KS zKxRzANRqk(61iZ9h?uW-Hc`$f(}|;%CNMJCy;EDI5JWC)7xmnR9AeNNQ zKEZ1zB?2)PsAfqkgTLQ2_VG~G+=m~S*&^~mo_QgH@Du9Z_1mHT)wZI$<5fFdL9uo> zblk3TO*WEN7_KF&b-Q;Ia%qJ#s> zZBYcX(%2Zljdg4$-{EYJa=n;$A`i#G%LQ`*P7Ac4EJ>kH*RIQ4aR;#1;ihC=akAnUj9V)&cxhEA79zYuXBL6#4F1{vNMtYq9+OVlOp)p?id;6;0u+1k7kgZi( zy-;X^+a#G}C+-Jih-Vrljwa3_B4SI_ooj0vYua-)b{K6N>}?80FntXw2=`kFp=g#eE61KnfKB?*M~JT{oy}9AgMy6mTVhVq?UXm2-TA9y38=N+1e__(U3Z!k zU!P3&lcvm&?5#C|FRBT^#l*s54q-yM-`G)Lx-3Gb`#p88mB@0k58<@ zI*Gmipv*P615c2SLbV~ztNx8GOBiTcesRKbr_4oMB&4MJ9Bzsd9ubp@;m@=tn%Qvc-Dkg?1YMUWABGCF=& zLXqr&Q{w@-2Tun+52ojkf>R;ZJQRqkZPgOP@(qK}_d(Yyb%sDCz zK?4M#KfiX_*8=tcAFI{Ysg!B0;Ck(B-#2N!Khp88dCIQGq5GpnTbujPTMVfynI?0+ z4b0#JhrZ{p@H`v4L8FE2ircytSOpU8`f!V826^{E;lsFjtc`+h`U@FaJ|eVZC@1;U zH9x4TbBrZNVk;NY6}S-_MEHEVHwvt}PJvm*4Z~no6H4(OyJ{q~xIG%K zR9gO;^Wjxalfx@M6$jV88KaM!;&3*Ko%lo5FpjwAM?G${-E_nqNCCL5fM4Oyu?Unj% zv@dya9B53_)Y?h#gjvLK1_~%9B6A~y6x~Oq40{=QV2nWb+PahlxaDb@lQKh(A_3+JRY11zJ+- z7W=Y}td4|5iW!KZ*6I~pSV@RYN9qc(!-GXa^6ZYz0AHv$>oLq$8a3nXr3r&CID(Uv6!o~3CcidBBvQ+ z!L~J^TT)IF6h%fv6x1mM;su;9vYQF)Tv^}o%kVL??u{POi=H{iHNkvCgZFoD!5Q!y z&6)rd_6AlBt+f!mH(pW`qP=2oc8#NvL@PD{ZesqUM$ViPK!sqAOEH}ZKHk72bDt}1 zjwYp@DBNqpg`02Bo4g<7Kr4kL)*;RE1nBf_zj^5m21AmNXB$i)p2Px)ByFI7+~%)4oP91~@D2QsZ9e7n-Ch5|fX@WxNR5qqAs-GHERS zv8k}6RI^NV(Z*q-3|S&HvId(dt5}TosvPe}`F4=<^ajc7I&_;18f!l~+R!lC2vod& zY5F@(4`)h)p+!K&pl@U}(EWE2pD`wtGg6P?q}s|g3<|SPm>B5A>$n<(cZgW3W%r+w zc#phzsYoVa-;pA5Uwf;z6E}vPUmFXO`xQV>^ufp~$tB^`%&Olf{$<)oo*98nE3uOf zo%~RtD{%K1Ar38S5tG#rA5(r^LMl?83MwmZrdvj!1EVn~bviMdn)RBab~B)(!Kp(s z8ng_i9W$H>yfd6`g_ni4d8c8-=nMr@lTo}pp#u$fwzSdx~ z(h(^y@$mHnTp~@D4ckkK6u7vR;j^cHhi#rjfT+%I0_+5fwwFijeNa>Dw+8V5siqvi z&%+h`9KqeKv{hn07ZRv-#IHL-C*p&O3T`nCc8V%836Zp!A;gJZknZ~cT285mPm0Cl z!Fo7V87W0oo-e=qBe(kyXpH?i%C(>s%^H>{=`itjk(-!^#`>L{cyUh%X@mTZOM~oPCP2}a#pz=GGZ|jZ8tZwrT^$U9nmk~K_85hVOd8a;os5L zTcQodgrv@bisJ;tzaKhL7@u`f9+z|~Fo!2PLbW(NZ-PIk<4mTe$bw&ppmT3#3>hRq zpTtXC%h`WK?sV9a^Z-qS4?N3t#;#_Vh?581AJR$HOts7KfR=bEXj3oyOIp#or=XwzCTV-4xM$6>Sk~+;~Qk z9lQK&ppdG}#IHGTzcoCc>g)^@v<1Q%4Dn9n+c`~~PJx0K<7=$(pPeKUbq${s}1w}JNuS|kp2MfJA? zf)c?U_i}b*vSivv3)&c}TA*P`n`hb$HDJ6AtK^tFg5)kH^B?{*F~vW=fh8^Wi6uJM1jFafk9e^zVyp+)FD`SW~^>u__bON(j4o0*ia}?=vCH#Y>IO-EF5@uhR_jWI(!eHSsb>~H3Xkk=stsGEO(p!) z(_^pT9Xa*reY@`3U>~=a2{|8^r}&Ru&`R&4bDLw*yR%IrpO)(d$|WXcO-r`HX`+iN z6tB>qz8;Ya4H7pyI?@Zz1VX(V9?s}cpxJN&1cRW8XbceF82{KTeo0y)J*NY=v``b-JnhCm%aiU(j5+Mh7U-whbwpx!ztA+!e`HM7K~9Td}K{5f0U*6x%o? z?bZ|n|0KoXAj{<#Rt2| zi?ZoKqCJ0Jod~6d5hI_F+hr_GU8C~KGxSApE|P!rzwy@s<_-d4=_-U|KnMIWsfJL5 z?<=pybV$4oP(WrY$PaW`03<^TYgNpN^a&FX?l7ql8FY`bx7LQG#MK!=7M29F(_o^x zUIGw8Jy!H$E3$6WRg(4gZM65mphzk*nIP=CIwccVBvU{kc`gFbQX$H3@XKJU;LC>S ziZqN%(ni`_!b}_ba2Zwe@V*jHaP7WG zx|mp#r3cw14C9oF*WBRJSpb=kO`0s;KfE|K5Wfhg70r2_J0l&&VJCTXo#5Y%nGj7@ zr?n=pL=O;u`<@lP1ubpR&D0D8QiAx3bF-!CxB!Q`z6L>ONHnQ3?~D&NNx(R5nw_P# zO>QY;KI+Wm2#5Yv7d@D89x~lr*rc_k&Jvct_SkjIhnVog&MoBT)(Pbhw=w*gp|u0n zIOCD|$(b?88xU(M%JB568a4xEu~FNXgK9Ba%;P+e48>zW^KT8_Q6Z$O%cSxvC%5WM z^J|TKvFTcoiU{-Zn6P>hMSf+}U1G#Tm(qJO*2N{PN8aOz8|%m>V6OIVa_HNCg{j{Aj=J%F*-+WF`e%38&@swE!0`Cw`1obyQT&CfshO{l=1>Kpm6Lg2vX>pD|vh zsxupCG^SZIq>T{_MF1=Pf?XgTte2x$767Ta)v7!~OTwi7v{E%sQ+iwn->Ih@D2zqf z29ti2a+geW?L{j}i^E(1mAElp%R6blW&lk;PRBdON{87Ka>3ZWAy#!2qOVs-$KYM; zEIfzN6P#v$*X2(r@_ndp*O~$|qb<&k&|1c#WG2ei*bDKPq>O0 zCXXs2+0S4e|YOsiBs`MlPeqZZ_eGx#xrWX6>3Gc z2)_T`H5iuQ5AV9y=j&>9Qr_40s8vX*yE~FyZFE9`;WK&jfbv2OV!GzIfG)Htr-l>R zVL#2;$qoMG_=s%@kB%UWY2d)d)vO@GEt9Z_m<&yj!Irs0q&v%XDXZVx!Nb&p*PklS zP_~(D+#OT6y+BOssjDyyg!m}Y=S-=3**1D5MX9Rw@*t0*M1HN;_iZQrfXdo_b-pNr zA~CLs7~g2P30^3eHM|C{C_V_mPSuGPChbzpJ>~8g*$v#N?x4)P7t;9|7@YWGtp1xV{&@H8%RQe4M$ml3ZWOT3fxz5{2xJ|q_ zm}5Pe)Ck!Wu@*(`SetJ%zAUMZN*7w1`#|Q`RAR8-)ZNTCqcbN`*WLG|M#ds#nmX=YQ)Q=P zv;9+yO`qqm_p795aI8(fFDN1%)CEA9wl8vY?owV|kxd^2J+DqMlInMgq)5$Ai6ZGO zqB$rF(gbi-x}YCH=~bi96jOMnD*OAEv?s<*psa>(*P;Xy8TYJ!c|3$9bx*G|$V z&NkapHLwn&cgoluSY&1<^VPQCDU;87dB32IJE&n9jevVUDf~#$su@D#vFX7zffJTz z>We;es04BI*pqf=X)ObR;{ck*@I3RrWIL%x3fFmBCWjoK{xc(yE4 zS}Z%RdxzO?I?{1IY`B%CpFAgDej)@Q`g)nb!8JaaMSgH6_no2f%E)%BeDJ2Q1sk^+%zpI+MGI*4gU5Ng>8Cx<2o9II2 zTbalZ{303p(uAW3RJE}&ssh2-r&1>X$s+7Pg4!Z3NXz`tT% z4VsF@IY#s9VSvR^`;kjbf1?mZE)++`I_WyDyJfz|`20rQPrklSaj8dLv6GZQYjCdo znS9n`A_F@`wS-K}M1&vc|GupJdElCSd4PZlm;OIl&C2qBWi=pfSseg?Mmf60$j1#<{*mcEi-;jMrV??H4VEb|-Z ze{^-9e%}#x-u;%q#pBlOoSU%z=9mPb&PRFGPlU)Hvk<-1o^$DpoIjVrvjP{?x>a$% zSUi@-R0v@|#`}Kp5W1!4nJUgdTur!#Fw{RZtwKD7ZRbY{4=abv*cf6lgB$4k5&CZB zq){M#3v^cK!eEg;r976T*39QAYL7ku)^Z*vP8CKb?1N~Tc2h_`BF5j6qMyA5Zj>bi zQe{D(gw1@T9rGnG=?#e7Da{!y^Hd@&i#@Im>90+lPbZppGm@^J5vwkmqU8}j*0p*4 z1V5gMbq;TU#BkQZ{#S7v-Sz)-)^D~BT=xGt>lYLIxy@UFnR=80EQ7Xuwe1!=O-wiC zNAcxUdzqQKsGUzzX>^m|v*=F!iz;Rj*JrF9(Z#mzt3?Y&tl-3}51NUQRx@)Pet`Iv zx->813-5IX%BY>4_d?g^B7S-lWgaJE>pK2Ff?fDLMb9M#mvs#SgQ80bf+GoA1p<6M zK<62g4{O1 z4|I;>aY6ARW+CCNg)e}Dl>wuyAVHs-FO^+?KFB0YvH2fc4Y_^9;C;&sZ-JoMl*QAu zHywJ7c5*H^+!GA=;moBkw4a|tp?L<0@8lJI<;5I2O-VKDkW|sOGdo8f4q6%8X3vYp za`V0)%LTWNR1d=bgX3Pe!lVDdd)R(GLRK7{6$xgx88hBx+btf#E5j>bDv|4+{(&ckdfVTauvmc0q#j&UG&F!f6L%i1GypI=% z#q4^2c#zAqGT5^u87z=w6vb1-pakCQ^jUbpWP}*@r2$&QHJSk(T)X9mz$EzB>-B4l z6L*A#OjeLG)u_-KulrTVz~pM3&@^so-on3G7{xbghR?i6Yv)}#W1g+d{B!ZdK;R|^ z*YDY7NhBcJU#MK?x2}K{nOd;gJ6?e??}#D_O@oDhvQmV=$54pO6@4z5nsJ+cUgY8O zFz3=Yj_d6%&^R3Jq5xP!S^&>n2Q0uV?bLL>m?~8}!p0vL%I;pmhF7?muM^ z`u8hDOv{Eg&*Y}kHy@$DX{fySr{JGozGBbLs@bRbmd~YjoqVVlf>WJCm~`Rf9^z(Q z*?^tM-k!Z@k-_2|j&~k8;0lHY!PvhzjRqKLdCHM<&C3{dZJyPvdXLbIZIWLz_S`zW zv=hf9JQ6CEneS>ze-_-`74yd`5r}&j6S#sFx6|3G9^_y?2nMuymS>}&eX9i5Y%9i5&)k^Rt;$U zG|u11f|;j@uOzSWl9Ct$MFf7BQ9e|4>JcKu1r&43u8l3)V128*!`iR` zptOEyx0rG2TsQ`tm6eZN(7w;{VLuN{_fXX)I}%Q~IG-6&Fq@-b%*;z6nf1xOeVL;b zI^MoR*9AQP4* z!y(eIRMs;dA3HgH_UK&#KjVrx?_Kt*5{R4Iu7v!Tp#3~UHv`>#a}~Ipe&7F!CWV)V z)BNMXgbizAJHYca4Nb!!A2t2|{oGA-?&{c_sWv%}4t*NTkjs4!x=Qlm{)caKjbHMZ zAgWsUW~6u#QU^EP*E)A$`f6&p={#1Kg>Eo!?zZq9tLwjrtERcFw)sZPJ}!{4`~7`_ z&B@3gS6KY7xeo>Pr@3zgGp6TXhUyXRmc;@0qrtxR<|m zV`0_(Lz85>)Ctb zRc19^{arRm3@2CWGPL8>Sy%&pJakjLVV+jdAfgAKrsC{F>u;!>AoB#ya24}o+IkNf zn^D+_4+dK8nS32>aZ2J^pu)cwc>uuPa>dMLX?Z%qYlZEUc~|ucKP=Q%8$I8Y9W?YW zvuh1NkNM+{hchb;0k=wC0M#D7D9oIb5 z#{zW^y;iJ8jUQ$`XmszY%ZAylQvXV?VWMT8`|L9s&GRkCROj<^8zF2^W7Lg%?Q_xp z3OyVwExGMr01U%=&sVX&ZvrRjEE`dm@u1C^EbJ0ExsxjDIA_iXnhMiuDphxvR*}R*~AI&tM(ws=P#J)fXXydK)GDLGExIii^THO%JFn{RwA_&h&Z?s;HW?8ju zWg(+m9L-H71E>5Sc9SQb0!=epUIG&an3Lx?zrVNTDK|IcoF9GF+MS4+IQ z+o4}^u5m94Whm(bQ@apY+BwxxDpE;}lwQzi4BV=wbz$3k4VX)PMu>^0alS7TS;@05n+VU{GVx6@mnG{PMkjMjcJL6=yG2(w-J?Gs-Qt|c+Wgqf`7!DMK9 zZ5L3=kV#O>Gtv6$Zr)lPyBt?4`gC-El7?+G%|PzUq?o75sXl{SBZ8Q2aB%{*HNgC6 z*;E)uI?~g$5A!tGR*Faave3IvHV|>kn-LI;96bPrb{gTndyxwrGt`n%N8Aq)aVb^= z=9Q+qbN!V#Wk#_H`2(Z{S-lfY3`6Jv3M}f)pDMKee(Z^D!eo<8fHp3*PMi*pFBV!I zH545KcYklIoWdZ*uEv?o-U}wr$2^YorwX%+51fLK_bEW1bNsAlW96Iu==_o7Sg+2C z_sIcbmW378BSH{nhE~RD)d-EiIFBUao@V(>Mu$w5 z>x3@fE(W?hsUQvBUvn!}yW`)M3vTGZLA zgG*B~-G>%a__+Fb5ydk+E|Fnc_)fQ{54l%X9M{^&`(+hJ+H0i!U(16$AM4F!)tAs} z@J^MP^4K?lu}EU#Sc%~fYw&zCCF^y}eP0XTgin`}b@mErmc_nAG7cKompKyKN&snU z9(9=VXMl8ZgeR&HTIn6GeUTt%CLg6=Uz%f!5ehpPdO$e16q)8(!|7DFWflRa%_52s z8NCrUfk9JWv_Af>VXyxAMn8AU$WkOJ-)7Ty-EFWHHdkAC%IY`3H=$=)fDm%A{2)mAp;i8vDcLmvs+lJKm`!aYghjw zc$2~}0vH*hS`@4_Cmu`b8Lzl1Y&%9gH7&;BW@4Cga>I-Mmb?PH{F2X~W`o`fdKAV6 z-^o6V0AtQYmJ}F`Fif1-vVfVl z;OLnf8sRWd7t+6xGsu4m(1t&_=28~DKd4)VT2p1{%MEQO5aWCAM@Nh~uPQ3N?A%3>$NwN}z z-gyWrP6Gws!Wpnld1%21YvoMIKlGa)mly)q+lS6`F*yUMIBpnkE#4D;5ivWo<@Y|= zZx-|bMt}r3=Li?dqY5ndG|om zmE2&slonQ4U!q}&HwF}Fr8CHadE)H@F_jwyT(sHfyLm=RWPmk2sQie=X@$>k@u;;W zzLnIti7$vJ#P@ZTsqn$@eJSsQQF=mGbGxlM7NhHXZH=uPu;A7pj*9sg)qi1{Uc6->4>JQ+rx0Ko$B%U|9%qQbf1T@iPHUDIZkQv`QfE z9$mF9H2h{B6R6`Kz&Ojm2Nb}l#Ciuvm(Do6W{NnKn;8l)=?o<;d)~e#Bjl5S2ah?F zfsO64Mt8uZ0zzgi&CQ6EbNkad*oX!U=8a(}jzw80!Hs5^I3ho|b#R{unu$-Dmgb2x zK^I>>fE01d`NgV%?r~VERSU&~_YUp@y+mPy z#c9r9q0brz{zqM-*fTFdB#50BIYlRz_)&~CAEE)F~wHMh=^+0E5Q z+4XA$&soe7)wQpze>^}wB0S5vY!h<-79{i|MXP_9IK#8Ou&^peD2=%?k5e_kqsrd{v$fT*r3;+5 z$=syLAlaE_xhG1YfvUKzmDf95)TZ;Kpm7%B%u=Y2z=Rs?qQ{CTWia<^F&5&_he%~8 z1L?^v^K>7JxJO?`>=lY5&5lPVny6TGvYHCcU_g7=p&r1e1ZIX+reh+3drkY0?5_D9 z>W4uiHQLGJ;EHIF=WASjZ|fM{c;({MQb{2SR8WuCN!$RHm&RI}Up~%1w^Yf8J16as)Q9P2{?DnzogTnDHgg}JG(yGU)CE|m)S^;KV8v%T15MfMt z$>u)>-dU?a+@6Hz^~Lsv{#Q0yE^SM8OWv*SbCU7v^TL=rkXx_STkG&6&0)kMyyM@w zzUOHxT7DhXB1sLWz6-PXda~rIgtHseiF5gt9eSoH41^xFB z0YOl#Zu{kPd|N!bG=Z&wzqQXkcf+ELrk@x&oizZlmJI1MrJzE3j^cYK<94ZRKyVEzJ<5h(+Yj7Zt{HIc?(E@V^so_DmSysXq}N!|Tr-_cuw#ry)oa zAPyhGt)q~{zTi7045W8yup0G+`E7q>4O^fE^ZbQyYU0ItnL6^M+nQzwWOWl-O6Z<& z;Xk6ki*!{S*PRVc%*(|xJ;>B9AmTb{-yEXGYWGJ7e=(3CZ=cSI^V#CH{3$}2u0qfl zrrhGoW})oHSc&9$NT9H`@iASII-3)cRpa42Vh&6LZ(~M#0haV6I+Y&DkgkFj45(jz z9y&eIWrmL!!^HytX;nIDPZ8ageZ{XmpE}@t;bind{?Kp(U#hha6=>f8G8+0V!H*kB zad@VIEPbEH^P2+xc`+DCh!_8lYhS< zumBid#3{I1fwLuTMos^18@7b<#-Tw6AAu`NBYeFRB+rHDaIDA9fi$}QJ_ax22EvJW z^q+K#vlvu^l(9-+I9R9-d}pWf);&$B9qcw+lhw}rXpe6Cq!;B1{5v%wM3TET82Cbc z22stl$T&q#$nLtYPd8=T`}@9tbiuW+XZRNrlxOM zV|6^tk_peV67w~5Mmas8zs24o?P-p4251c;R{f{y%Hh^8K%b0e8$CspNesHFgKZ;jR4u_pZAnk({AXGcRFbk9+x< zi{r$ZXCLW(JKv;*`UVQ_sZcI`?S5f4Qj#HfJK;gSTDVR*D;q5#nIfe@24mT0zj8e0i3z>u#mmOTBSQ6(>68^tyHlaobLTim3rp?~+@49O z*gaJ78S9S1DnMaFtao_hG1E^wP?khx@h0)by1L${IEHPseBa%lO4Jijj#he}D-UnV z^Ll9n+`6n|HXRX_WwNyOY&R(7misM2wOK!eK96^uY5j`c(Vo zrNs^%HUr(OBT+{z8Sw2Z_(a|y-ggpDV!QULNzWUHoLVFj!@-Z zi@)=YBwiff-jA34>OmxUOS|B&!yUO)^Euc41P^2Vw^flX9WgM~X!Y*UY&&bEm*xnn z|C)BvqeVT>pGw*@;(TZRjCwV02nKPCt&FS*G~pL@iBJ6CbOsb zNnLx+_v`m>=#g3op}iLBBL*o_^`d`KgS6KqpAvc>pYga@f6RiZG&Ims(>|3WbTy2did`yiQb?{NI&b6yK}K(KQTfu z?v&J#-y-J*=)Sz0956#;7lpsv+C0wkEbgXJfhOD;6TMDDm8DFX~PXx z+;Yk$+glT+8fZ=BRTjnvZkap~f-<)^DLfY9j=^Yn;+3{-=iY*W%KWZ^wf^9oH%3qZ z^mJ|84Z@P;wZOp#C9p&BuZXJ5<$?(HhaBj?>HE!i!Ml$&dZTli_Qz2 z*FN)A4UU-xUcjGSY}XJG1W)!?r?u#&p6;)UR?Hfk{pWulAkj;5ULn{Jo54(=sW?Qa z19$hbd^xe{6&<$_gc>s=w6g{3L>*|FOE+d6Bc2~eW#79$FF6hRzK`RM>k!vBZ{NN@ z@7ny|-^v8PzUus6&lv^3@5clm(snVhm4_F=5I-8V{$3;Zh?TjfSkrxm^9f|5Rr1T31N7 zjM2RSYrGOK<}y!c94Ag6n2(sMt{+PxpGFf6irmA5F6v0r>)K(+g06w45Z#H&qYdTB zJjgXOSfX}zR0n4qP>0Tr>V?mXzjgGv&kRg=ct>H<_H);yW;D^I8zXOys_m;tI-Ekg zul7$sUpQ>Mi6N$A#hY^-yZffEOHr0B*kw7tgOu)@kH`4aW6{%ZZ`C;aEE z^BIZM4dI9I^esRATG^<(Yq>6Y=?uNWyhPPSrljoU2F|r}x%{Qg{=J%l`Yxf1q#5j| z^iI$}r1*HKG?dHNV65*tWnguY)ig?@=8Tqd8EbCWfU)(y^AS(>#R>xvJCx8?|3pz~ zhdgl!Bjd|z#pKGHhn}Jh4CY=3)K>O(j_maUBelG~7T*5^4+VCUdVDB~LjF@WydV*T zr4MzrN-5F3GRlylW1n$av=Ld@sjsm~YjMqfuZ)+I{ZGoFaxVKJ2D(VVs8}Gyz;4gK zYpQ!jo#SAGN`;*qRh<1F#~;LoX^#oeM;v^8;qH+^`KNI01Wjc2ht}?oQU!vW8O2J^ z1xa#kFN+y@c*cn&y8!{3n)9d_p9I#2=gr;E55;fcSvcRdov*juo!P(MR>>dk#cgb6 zsAqO^9$gp)MiPQ@@0k^cY{$Aoio^cdJ@cD;*Dy)eLl{7;%#j+i#4mcJK3F=NVifv=X zwr$(CZQHhO+qP}2*tVUVeE&Xms`h_w`mS$gcXiL2V?5(+=rC#ejBU9y#z!rv@XGq7 z=!wILyZQe>3~>t_JKVq~*6k$<<>q;6w^M?D42V3W%;Nl*iPCNQ z?6&0PF?fhir|>@DnrqV1=n89RfIIJV0y?Dx?XodIFe5c(erf_Rk6-+tQ5WXyH3HG9tE`kuwh{tzk z&KG4m4iA|LRvz=88HNr8JXmqY-Vkr18+U9-?yw9iv(a{!8Mb)BovnIAn($ z8E*z?Te3rT-U$Kf1ScCOUGOF`8|WiFNW&E~lhq(syZyszSMceW;N)}?ZHFX`i={nl+7c?mR z1SHP-p|_+zVwX<@Xj10D=FuWRNL!gFZOx*Vcy8gaCdgAF2F=E%gJKhlLvPX6Oa=o4 z4*Xsf)@+Q93Rpe~4%1algqYJYOui7JAK%%aa)StyeLbe4RfN@q>@q=2%@1o!6ZG)p zr!gqr7L6n~G(5wkRdsDw%US3!Pd{p7?i-5BJK(hV+QL!Gf}c)7%35Glvb}DmM+o^& zKE>DWdu+uVzQGmB6Z#B~dUOo1ypyod|H*SqO&5Cx=m5`liNeyxhlLc{k?NN*lN^>Y z7Prk2&%a|PQ|S)gv>Bq0=Q?r=TR{xegRzFG4yNgb;+^9v+Cy(t-P|))kIYl^m$7ly z@XAg&npO5=CYH?gBB|Q6>&CNCp}e2CYx|lfY#(AHg3z?B`1=PGMB`Tdmg%e^cwaP6~Cz= zCZ!r>-oRq-e_T8k?TDy4edLJ{A15OfZBm zRmTv^ZXxp2*e6PXM&=bbXC|w29ZJ*FX2WU9O!w^1|A3G|O4cx7syRHitabDHn_MAW zL+T=|s$l63;z1DfXUNww{HWmrGKzVL=>I3pFOM=fZuBccWUB6+(2mM0EHDX@nkJc9H(e^+L0Za8&ikm>EgrZ8 zIN=y&+oPMUBbQO};H^y1m}@iGCKsULCzQL(_tg<<<=qhT8Y zi+I4+Ovs)c&Zc`%EHs%Ghws{LR(qlG`vus*&&dBZTnRRl8x-MLN|Q3Lld@Xnnc-?U zA8QXTl|AvkylIEwx6kB?u2F>uf$Jj(au~{Pd-XIY6LnY_)4;lKa?+n+xTf?2hrhah zdRggcz0y}ZuC}B8i5C{v8^#DzTKUjlE48LZ6BZ*15lNm8gJldaL8R6uS7&m%s`A{l zVz)u?Xs+}>0`yk-i{A3$#DZ0a(74z36%@LQqe22q;UslAk~PzOC58Nq^0K8{08c=p zN9I-9Sc^`F`7)cU5SBM$jrs?NCHhU1s*~h&Q-PZLUYgK@J}>5QdGzot5w1hBY{#0bb4ZP{iJU8>^RCZ zWOa+XXu(aKP*qa=XvC97=ek{G;QWS1I1%@7Hbo8W;eu}{lL+Q8U5uyE280gWMEHLO znx@P@iARB@P&bp8oCl=g*5)lJtGgOayS*<75bb&+A6!S!(N-truitpr5Fp<&thhBZ~EWhb|Puu0U3jx3FV*CZj8lYICULHnaj>Jy#Oi z09`EpO_5ys5~chxk^}B?Q4E~i^%O9I0V{tY2VrE%qQ;*$d3ZwfYe>xy_de%9+J5SF zorvP55uh*$#k>pAU0$`{Cb8))uUz>d9$ohbT(ScmmI2)&SgPLzauBn_qWkHO8iJke zXBo!_WlO)6neAjX)L?iw-Lk215w0lrfr6Ck3)EVBw7K;W#r!yKvv}9o@EPTA;3r}p zqLHp0mFy#|CUep{=V18HU2Nf-YTY5waDq&RN%VJP=c>8J(gR;4M?tpg#1jE`j6KiH zg7g@B*I1SY;R%Ek&PBJds$|hgC?0QwRET(p9tQ1YSTp9SQ_8Kz;YS|a7jX-*M4mD7 ziC>yCZ4`ijiMx$PsEc&AuOFzrh_hm3VZq}8w`WIZGh761@SM3{a>rooh5-0tfrp)c z&3NB97D9u&=}DXCO?^1_o~iQj8Z(1D0fbd7Ex;8Mt_FbLt2JQIL4aM!X-eKYv;F1h zDT@vOWdK@G);Z9w0~`><-3&#g3KhU^5tScL3JXFunqMdtz!BgpDs7lEKhnrTuqt+2574FA`aF$rOYKTAgEJMb`}Acq{U!k-KA~vCAaCg+SGcnYxvU zRWbg3mX6>5wuc~WX4!Lir%XsslyB9ohj_SJ7Df;)gbzVWWUQtNDEYaf-=6(qMn+8u zEZAtsOj$ezNR%{L9sbokrK(+WrY#)XzT5`UEmcXUiP0J7O6AFyjy?M+rxDgTxD3Y8 zc&W|FBugZwZ3t`sX=0bLtLQ`YV*BCZC#eG8HH!{&vxyYm2Rg>@ToS&n7n&YN?OXfv z6awdXo?qzLBr3r9F0cegt?qVWfm8EuIR46b$+41fTw!3z2S}blW=tu+tZQ>x2SEUm z@34CyZjK!^_T*Qt@6*XK@W&We{Bm#<_XK}EmNa2eu#0TgW7MGsXz7KZqe;$2ODA2w z!9*j<+?h3x8%Gb+{l+Re0HS_x6AUnH59N z>2vjZ+$7O44>`HnkFZ^UK{|U~{We#D^BT$$#RvtKt%wu;zsHIZKLjV%h=AY5M+|Qh zGS;h2Rf&t)dl#sbBUDCQTlq1da?5Dc1~oiD z({c&odFIa(=T2SA9adEZG6;p+T79v;`?(NOkOG|e@W)ChgnXyyAc8#m_gm;V2k|x? z+PRjWXVw7ZUtMAg(Wn@jhkqFC7`U7ePb6?XTNe;gpEf=+Roez!D6Nuz^NZ2Zh0>nr zzM#TOT+3l^*qi?HZ27A3c8LyF@fL?n z|2RxIi0?pIzdD1zQdUCT!TRuEL;DKTNV1JNd3w$s-5;t>h92s*0-EZ9aoxGh1(Od$ zLgHJVB8GBn``hk;n3z>z14jK|R1Ylxb&p@ykh-Ri#zyXKE_$KLUH|TcW~KX%obxCR z+SKo0S)}|_+iCUm&3)`jJ!sOY3>k1p!m2z85zJva=L^j}P+1d{+(9h@H1HGW+WUew z78DSTDexcZP*k-B8uk$1ez<;NyU2qu7ee}AsCtV$jh|~6&AA@=#VuGsR5l+baoIR} zJ}}@Trr=g#QX3pH$va6YVO24S!%>!8uzx8LEVIS3{jH9F)(K=W2S-g>AhLr$!S8Vs zTxJ6_Ulx-!3>U+}4q}s2y@S0U22y^*Z|?zwkOpYpLjR2Wp%rjv#Ti%#WHQEPso+u_ z1DEO$sz?o0H1oY-$RN;tP@0Joh;fjGTOP@ux(uQHHV}S314BMVT;Mpm1tf^`cU%fv5>ArqDzrEPl9$eu?quA@AIh&@*s+_>GI(&Jn;6r@-Oq)^9Rp*oew; zbrQ`0|AfxUohe3zwj4wpIn-Y8u+0o$SQqfPkmLECN8L%BdG3`lc}JMyB}=rB^jtGE zHPw)W!j5lJsE(;e3)u4Ng`Go%M3#rCdW1k=SFAU6GdOesp>BXkE=vP|Ktlx@X`pKK zrpBglB`WAv7#S->z>`&_+O{g13wUGAO?V#L-Z4?!7@mxQ}Wfmf|K(=<#py)HJ9;vD?<(nh5wIo&zeH^-DhkhgW(+C*Sf-d%8ih#FT%4i8YB+M=k&!W z+DCONjZg{x(Ka^O#J8$2juNAnT&zSuVjMfR+Yk>HAqK!njDM@FfOa0bp!D$*!x{q| zz2BArx|S1R)#u-46ShDdzTE1-Q>baA40nYPdzSGpOfLn9bG*d~(?>oC(wAAZiLLxh zcZ5@jI9CH3)m(mPV(guJDcS(b4Vf;3IAD3urZFTZlLeNCWK6wQnwAwxY&gGz`-a zse9pH3Mf%*JhK&fhD^_Vyk%l_*_g_R+$=~qpgasI);38c_}w9z+4drLw&)seWpn#n zOVVXgD^5Jckyl&!+G4oo6r}wAjwfVa12kCnKO=p`s=<+v!uu?w^ui^zQmM1x%YRSD z7|v1driNfRhw%f&5YRK#{*g&t-cGyA+J2m1En3kejx&9rx^8+&&x!aatOR9jn555% z^qUNoDf`TYmSYk+1x}MQamr|-r1)X?uR!;1qj!Jv;C8WJ-_+W*+E<{|kf~FSr<5T( zi8f%|14}MIvYifk-6pjwSw-|KmgmX6yMSW_>Dn&QD6@x;?|MURatE`xp(MwW3J1U001MaDQrF1L$$_*?#Tnf`Uqts;k_{Q%(m)}KXyq?9x!Y>OY+L`4 za%z_#gO))5bswjUm==pjz5>-hz=yr&o#Znz*oN}o=1}b_Q?J0o} zebZjH!AJqQFR?Ii#x^;sc}7dzNX(*a(Zc!VzNjQ#=Ylw8@4 zzMY%}(Er(Q5i($@F12*VqOi<848PjRZ3QrvzQ<G_rT;$8?=9Zpe%N%)wydHkMj0AgHFd1 zB~Y$Hg0VY?p9!F319ZT?AFrcwf2AcpNg_ma`>GY|l7359?e>Q!cpr(M`2F;cXo^e1 za5x2i{3JH@qP5P3(|CE{?s~4Xt2S5Qf;6~d^RJ3%| zT^hjahIc@!0@=4icNQrHf%4?8mIqBe>w{*uQ(fvV<6Bf3Niwj9KuAAl=Y|Qw|Lh?M z^WN)DdFA9*LtgEBS`|Ph0KVVZ9r!cSjFC zxe`}XNAh-anL(FHqv_8Kl+wF5V1t>GDD<9nh(v9ev+gx4vIg(K%4Y9JH@nOPhMZWE zV1brAKWPBNBfeY&dOVeTBI-r@Fnl*KwSPZ~ba8|hgNYh@vGS$}tZB^4+w!^q721*h z8XJ97i1$CgB;6N%0s=Lb%yoMbBp;f5-xKmlN`Ax zUv+ysRbybWHL{dz*m$$55-Q;uCa0l{D`DMyBBux*8l~WPL z$H~!eFeXSn1D7mR;1#F*IYsw9G&@$#)n_AmOhY`&3tv$ET17t`@G7pc96`#5hzl-@ z3sn!BFPW9GuueJoP0?b`Wm8FZ+N@Zh=}U6arNdv;bDNmF(sU1pG1>Hx*VCrN??{%` zauCeeVRQ>X=4D7LV`7c#pzba#&}_i0N?PxnD9W&cqwhQv2pTFhMlUzF*b)*RD1 zuT^lC#*I1-Tlh~K8U@=h77*okM`2SOJ1+s%PJ+pr01EM@A1f5x?|F%DDRG(qbYc*T zVsi>;)EL68M5IXQ;l~a9jp!M4ki`u;#xSijj5~qL{5)sNYH==Wh+N^y9qXfpIUUU@ z#aGccqr~os%hx_#NO9zPBu}s(uQ|r*sR%7o-yo)i0-n(gw(*!Ln9iolW>ab7Y4h((LZ#8}KUj(Tl9)E#c1g%%wg^q_58DiNFNng949?TTEw;g2kG|Cs;~ zf_{Q>aT?B`ozYQDg{Cx+vdLsuz&LHY!dehHfab7R)j_rsHHZ< zFG(>WFAdt|euhOO4-lHEvNwa14Wd5D&R?GM?(V^`>av7l_=PZkCV-t88l`^Upj&YbH??#0Xl}{k3CC4jt)UX5Z`K{gV zD3+CWg^}&0qoTV#xYh1j<^J!-JI`(l3e}t0(CSOXKO#J}K+F`rofdoecA%I?Qk9h5;Dhg( ztxYq`TuNEJ@WzoBko6Ylf3yO@BoL;b01EfrQ8yGN;`Hx-^s@kTNZGpcip7xCbD+=E zlA^t*VSexsWz|$dA(L~r_tK{~16eQ} z6kzlZ2@XM&*Dt9m%Zd`0pR-c!sWb$6PyLK!8IPtxD&fhhfNm^>4N)URI5{~?<&DItstdq2h1d`Ba z_(vEGt=eAmCPg%cr|qk}gY;v1(AvFG80zsZsjL9L))>NqLyF#7$D_JyK3I`Pu9y6& z(@^5!P+@;2$A89olpv4IB0M}2M?68}1A3aOc%k%T6S%q>Zp&CIFJy#dNS?qO8Y+Zy z>S!^;Hj?-*SDA&>Rw?*`vY7#}d9s^4P?;N2R;k!J3w4d_Rd}ULD4O2gILh&PjxyJ+4d&yBjR#bDm z-EcV(aRT9~evFW`cT9LKb5br+rcG|9w|`vWaKYQEH(mnCvQ5qZ(lV?$9O47MU70kJ>XTlXb1VFj7^)H*LLbqr3qlxEKg5jCYTR^nj{lO~4?Vhp&) z9$Wp_rJL}Mr3hW8XG(Pbfg#TFVzoyjXr8y4m)4R6FkKAGJJkPvm7jJJEI_yb0Pqg~ zZ^6#|KZ0F6mQvGU=jDmKt;t(EI4iVxE}{DlxCyWJFOj+h-zlk6EAZ*Y$4hLY(Gh$p z`Z!VLb$9Gjh*7-*hrI!=uFs2V@6VR**V9hc_w%an*ORW#SLqMim-d^k?9bWF&%@bo z26*akSit*g@8?mf@6TZF&+Wxu-S5#_-=9g{*V_}twTAc~k%P(8^tpPLnga*)6a8LH^{SNeEMJ=H;!_SavBKl>{%=E6 zTY23$nWplxK_XSzMg6WI6xHRr%n|IP49o$`dr8vH(YxxYz9IIr5^eAQq=ox?G<64Q z=R;k7?w=XI>UTp6z*}1yV`agMy!NN2?wJ1l8zUJR`oje&(tQ*UdhR;6N}w6Yn=3SO zq3y4-Qvof=a zwC?C7#&uKAO!wOp-|<%$xT~TQaK(PL4u8Z`w6%JZwx$b8?m7u5#ZALgH(`-0FQ0p5 zr@cLmT#t)$UVq{88JyVF_Pa}n70x@<{@jaL3qR#CWN2r2`};?7kG7`#^Cy@k7~|gE zxX1YM_|5a7lohYr8*d^`y8J6=V*_v9_Fquz950sBDL}f9trz$#**0Z;81i(4R=HD= z_#`4*SsQI_?cU|c+-pzh#=$WTdy$O~nVBq6_iUaa%^a?`NViNz)CfeAUY-HzBc2x= zyx7M9_glAH3tE}>2S=OXEBJnI_9Ka9MiG-169=X3>2OTbK`!_EsCyRE&6HyI@28VB z5HQ-D$jEhnOT$;ivy*m5da$pT(KoN&JH7ZEewGQn2Jbj3EGia3qC%K|8Gi;;bwGp4uNJL7q;btR5HgK>*3pfPNZkI9${$Cm{n&l-^;RD!3 zlffG=Nbm|iE2O~%uz@{P0vf)+&-qxwd^eg)H#&O@_cXmjvNfW%I7hA~q~wuKA4R#j z-D>BT*$q~;5&Oaxw&@GjR|Jwn*90$E$YiM@e$Qz#TKKtzza@;*!oz`5H&~YRTXgH{&6*U9_zIN;vZLQi*G{QXsjZdlf4ae_PHG{g9Nt*Fh-&oB)>~Ph za&>f~)#_Q|Vy$EQ@b8N`-PLVYbV-bx>f*Kk-a%5fR`cHdYP~h(K1iRevc%ltoc-F& z861a`vNYTMJjR-_wNs40^Wie`qRYbNeuA=2biQ2yHA_mMbB_Y!CI^n5r@J&Yf=Ery@g@rDt^Q*;qh8F%0cV}g3u@VKc4;yDzZG1mJ$7Iu9WP9IHO(*uqM8l zSGUk>Pu0YJRh#FdT9@seK8Gc3II`Cx79&?H+s7GOdN#?>lj)*m6~z1r*!zXgdRI%~ z9BvM)wpL5&>b=WYtEk%NOfNQWUMa-vp4X-tD2<~$EJv0wCq~y5DCQyb->d?epyy$5qL|NL~t=~MfnwSj!2{(QXyXT+xp zVMla_$>VEeIl=!Suw~qHdes^{EA<^$cggbu=jIJlbOFcJ8(i$~T?LSs4jSrI%^(Bde|Vnv3$_v!AT9uIs3K^R+tQZv9Qa zx{c(teA4Q1k;LOWcV+B0V^kRt6rO@5CQ6GTcZ;$rwDz*3r-N}p=L#Whvya<`i(m{v z3`E?GQ!xfAv}(lu8|*nJ#Trd#a0U~sv^EUtlI2A!>{CddZp0hw7a4Q}!(>|pdJl2t zm8AYZ3a|FRA&`i)8xEK6e|rAQJO{44t3H#H@oe*1g+q}bE^$jMy;LV#xT`*gmlY0e z2_LGE*M+;0aLPA+T4}akQxz5nt;hNhrBbrsSM8eTZ5HA}k=9Md`L=#jkGVQ6)M+u_ z9?8FosIkbj;De)pQnqC}9OdJJDGN1Gbn?>gkX}VLUQAwa?#K_pzmRO0Lsx^KM32lb zb*GAd1lxnJUCwu0)`M^OD;}2P;DIyJDj}rZ0%WVo+LfKtYhl09P$S){!Q3_L)!yxO z@I~n`TZ()n&Vo}TTd#bjDW!&74 z&2mYyC9h+?aWE)*o=rdqo?hry)e4;Uo63_#4HT+C<@B5!W{-ARm&SI*CM~Pp{`sud z`M)k^K?vn^Tt-wBk8Z zoAc(?ck)mT1$Hu@!V9WwES>-?e^=!%(7;Ph7AEUb^|jc`Z;?BKXgND}5H zVzD{$QRpF%;ds%uK@oeMX3pE+gmx8JG$!rn=Ii;SLS$eSxECzFdG61y#Opb3izhu~ z?z#)et)jiVBE<-6XItV*a>-Y^=pp@Cq|oYmM13*o$jEY`BD4HFK~@(d8f5gCz7f8L zFU0Sz_KaW`_=rzE>)1E$rU(})T~uc{GrFWY6x@1`6$noOofvD^ZOOH<|EB^Q3X)iElOs%Ao@v` z@l!ka``fKb553yVpKT_9YhBC4l2)a`DcS8-zr_-AkEIF-S4HI8nM-#s!R)K=E?8meI+GodX23=u8Jp~ zquw_YGpS|47If9yUhenzjX>L2ZP(>d{$JN@Z@`wXu>an;iQ#6e)?(TW!I+jL!@VVf_)`E_y|ws-+xop&(z%je_qM}`om%& za0E0g+?oa zCF)DoqS`j(l8?qLjBx_;v;niVlBBeNV&}S5_`9nLK@yAFL8-12Ah1uwnl4-fEDf`?3J|BAa2 zK-|MZ;I=#XB%Wv4G2JK6k|$nz;Lji6(LJsDE#WNS3Czv%f6q- zqrq^RD!qkE^)I`<(bxPW_ZYuq`@E`++S5b^etgKA_s@y87t1|GWVFqwJBo&)i42%W z_7AX=*YJ1!d_RXjnn$_F3%#GY5Sxi&bdam;s1x)bIIXuDphN6Sr6W*_U{Eab-By`L zMyO%4Q@CYVF6ych@>44`MxVCDW4@eUUm+GWzzwm(yw192Osj)Vu(L5w_@hT=pp(Zd zAlm#J$(@V(UI&h2z8w{%SJfoBv)PZRQwt7Bo@c!$US{74%WS>~kFLae!2ek2UT3At zt$pMf<}@{k*cYQhum8c~+G}9ZV5k$5F9?J_#|l?}jGJ#YVqkU%h8xtJ_L=y}>IwY? z^>othyC;W!2}y9PC^^zey|bP{I6F12aCUi+@s$N-eMw`2-(>A@dFbJ^TSuA+s?>CJ zu(m~Z%)rcvjCDjKGiN~Q6foa!jBM~P`pugD{@%9rKG^oA&AV)%P~!|bfuI6&PfZ*O zvdAo~8%YB^1)I-;4f{X~pkg<1Z+78pl{rTU8GCl;8?4S4M1kacPReCw^?ZEf=6NL6 zeRSDXa#wF+^wbMF>B!+aVdg-{6J}!)1in96fFeD@TG2*}uHC}N#4)ySFUg1xbjt{% znC|^WCeq|Q1$tvLnEIl})HA3_V#LBm4qgEng{3Yg$OR`@@vu@p%mrhrn8MOH7+*La zE_X@tIG!W!|8CfgrIf98Iv~iMim)P!u*zKUA`@p=J@=dMP9Dl?NQ0xWI|^*aX&GnV zNkmXmA)TOz(Qy2s7fPTrIq6#6V?Fj?Z^xwO!xg#ygq&pd?bSSX+P z?gg0f&!u+qG8DS`g@E;#>)a}`l8hHRw}?9VLOv_VG%5zE8B!)(cQ!ZZULh5$CE6e|sm zqOgf@C^FJe29>K7v1p_Tl}->8Of}68zZZt(E^i}*nDf)QR*$fwegpkL-25+7U0;Ze zDr``foM@4oG7YfVc1gKT{Pj&Qi315(gfXxOzfl80Zk|DW`SkoZQ+>`%KXZL_aKI8ic0oml zruzik2sC1$Pq<0y>Ev-9obClCjLHJU#V8;!Y%SoZ(CY(%pu{8&4LfoePU*m34mmm< zgWnt+MOh$a$Y^bMlurFfqPYvuy}k}#Dm5{+oRePt{enC(MJ5oJxUYxo4_IXXRKSFQ z6RJMCGM7Pp(u!)GjGcxQgbpOoA8twqVKve!5%qsY=}?(Tj**j+ux3;;G_`kl3eZF< zs^?O-h@7w$3tt=_?GeAR>MoE@zy#z7&?(?P2fTq5ZCI?rj=}SLbG3bv3f2)Z&V|Pg z$DYB>5hzWtoJg6)s>}%!&`Z97%@>k7qEJHB0mTw_M%U`l9`X~-K__WZBeXL&;mUB< z{G+5y3`K}Ec;JAhoV7wY8wOW%|0h-*V?P=mj!s?eH&%TBX+`c%XbGRJoR3wG`ZCOU zLJ?lB4Db|`OG!Xc0qo4Ca(`B&e(6&_gd`)SB%~|~XRw6s#cKy^h|{V=P&JI=qJ0HO5Kdi@uSkfk9I`E9AC>RAH|OgrNRAX=PFFC0J2m*9x|;+BXRD6 zv4j7u1>0=44l*c4!zYY!XD^5TfTPQr6W)H7yZ&E&Hv9ycvjfh42Jehj0an9_F!vYf zd)Dmb=)Ko0$o^lFB2up0TQ1G-T;Usi@tpBQM^K%-`;eOq@g&X_GRpTy=V8W?AVl#V zD#uyR+%}o#Bs$6K_}c8~QN*NdQF0g)^mjCRQTED$q;&HcSEi(bAtf%Pwi!|O(p%m# zB&WIG-k9lg@-`o-{$dtj%`NUIsr%z$r5`(B(s!PjKwrB}pX*_eWG`K&kB>t}N`#l9 z9Y($$Y}3!GTAZ$>NyXSz9GrOxSd%f|*oYI`G+mZ&1nMM=7))K+W$FZ~+Orki9F7J41}&$F{#4RBc|5 z#gPA44j$4=T0m_(6!5$l89qR~&sZw>&I99?E00w6z>sJfntql?6krvys)5f*l03@a z;lD}QMYmy@A{d@o0uCs#V6NYQZoRQ75OvI&kZw^XeakqBg_^sAp zv>pHnqw$Yy>s$dtD3e?F3vCOxX-~c><=`ne_jzre=fEd}XA`&#o!5_s7yzDjccI%* zq@lato_nMeZI~UC{RR7ap|MtAijVgA70||*QapT|%?R4QBL&VbVu6|8yzToM~ANwvD;Pgks0={>AyD~eZLTq4h<(9Mi_v|QN!D1VRq#g_{Q{l=$>F zofkc#+9wvwQQNnyHR~)Pl72|Q%qK$C78- zIKB0f=&xBEO8t4Uc=6=dRq!cZ33lME2#fV7v$Qkh_9^QvQ z#oGZi;8F|zc`|BQ3}F=$9j45%DeXO-xa(qCxl|}Ohyph5rfBS3rBVDns@EM=>w-{9 zoq=}yj~MfzWP$H+DMqYF>M=0Zgti_j*+(y3>D#4TM{;sSmV1LFyNesBj?~D z6!!LYzNCyd;2ea6D$ctS5yy&=OaYN5TpA0%Mt)Rpw^JLz`{W8(&2?ygJgRqcG)f2x zC|0Q86v_}4u0?PSa_TaT*x|dLq<$fl=X*hJ;hBDZ13#uMji7Dbw3eaGVR-+yNCx)< zaur*dNRrIRpHV{XWEHniyw}R3$ToCyckErgdMK%#j+xp4e*M|v9bPN_Btlv?iEXg{ zJ;xb*He}YSCTJ=?eL9vapAK>*j?)sUKNa6yQoZ;y%9k zf3|)a-<;6H2i5vV_OLn*hQH{Pi!#80^9Q6rK33`va60OFt>pXYTd2)GCa?BlrOT49 zA|8nj3%YlqAWhnBQ=1ggY(?O@8ca7gsZpLNkqC9YOorV8xZ`{I@-TD9 zM49XNc=e7tve4eq4Z%NV@5m+R5;C&R#FQ)hf-oEOu(<`^v;^&rk{n;~ZIkzYPy8k8 zShrSN9}?no%3K{vaSrr=!mYe@oyDtc-*B1vHZDbX3|!1z{-JD|-EDd;j6-gcb-Evj zd`m)*o)n)`6co5@g)1>%R_P>x%SA(sp8Zk914r5(!gx>X5yHM>(hl^nFIAz0flE{LPySGm8k+`p+zOm zZfot&2R{P};jSX|c{Cx7*RYYvCS(TtjQk>Q&WWEGs#7vI1`xqe!}9w3?x{t%5eB## zZH$pg_rtZ*zL-zgR2b8hAFsfqlds{3bOHF` zmolZg(!_SW!jMB6P)WL)pzSA<*oA>imb9o){V}kE7&APlmr>qC`o);kYL@^9x`b;c zSEKiS#K#AP_(U5OqsPgc6s-0U)HjEcl{;Md#v3ah105hsVStcBEG?pt_J^5xe+9s70&nKQ#ysLvYwa|ohT`kBHnzo zbLV>e3JGHk7%rgc5NOQoC!++(j#q^WGtuL^g}cKApqRbU8~SNi%@8(2CE7>@$TGg; z$^?CLE=Ff=Vp-0IN3eP`)&h_4Gn$p1pd*#8C?UWi+AV(^S>L($FB~>7g&kKv`^wyR z(37@rWlZqSSO)s8nXag`OQ3FIF$%l}x=12gfLnNiJk))Rf2n}x{$Dt!Ze|CLfZC~8 zUfj%WwzuE_T`N+pDg2yTUX~f0=g*oDUKiF+yC2lGx_7Gg?pjB=nh`+ z@9$X>zUZs>7#e_i~zFrR3#){j8JKlrD2qTDE7!f-c^Q%#hz|j z&18rz5PnH65>H-p(JlSGrJ(e{2+5`+mmV`F#Vs`7>*gwYo0iq+&@6X~P(vO$xX=RP<}d1R zvJswQR^Z@~0=ca;{=tzCF9Ox4N_nrc=w40GQ7$ADi^@fh3Mnr;6?keDv7T`C*)b=H zkTo8^CbVvNS1TnkE(COCQ$z|EnvaaF_hMMm>EP@q1^7M zQdaKNk2dc0Iq*vu(NtM8(((D;lD`&fo15o$ZW#Y-u#l)@(O`Tx;kp1iV*%Xw@jyrT zypP2*LK6>gGa(g*NgW~nJLv%^lcQrt_LW$K3j%(GZZmLa?xjFP9a z_inmY-p6P8iP=MS?jnb~_InKbxV9_iiLe3}r9VP9U@d>Cuwv@)j zvtQ9I;lveZU!bEzW}Kzr>*Lz~fIwTCU1!>`^w!1R*rda~%Ycj&qf4(6*ZG z8js0>8WP`mD%-9&HQ!1c&W~(;e`b3>DU%hQ*SbHqczd#TUKlc7hRaJVmOfjH9Q z&qnXE&}c!D)oG_rsoq|Wda*k{QdVnhe^`HR9l}?&w!ejp0c_=Soc^)U+ad1MeJlv? zHC7^ZuNauh-U8^+?f|gih~@F47&eij@g&22spj#MK38C#O3eU3t;<^H{ss7n+1LT~ zt@_9KIY{^CyXiPuAgNJYH!5c<>)Uf(v&K!`MugiMw6lD=EkODk2}QY9M1lwX)Z~Mq zNq{tCWTAAYKW^$RJLOP6$@Lqv*rNVPL3^yWHh{nXuJv49_$msu#RJ%M8R(+N9!1M6 zh<}jeYWU|%(0~wW?X>!>uq7U-8!dFPH3OB{dAj}Q3hj3L2ndu+Eq*@7r1padtnpt8 z;?~ejO`hDvpWcEDTe9_(<@?_H65S5DFn%~5NaGnWDh%v<8nsB*LdT(E+TG*F&I#zj4^#`QB=Y%*iV32ICRq=@UbKen}TOm4%7GF)Z`J0Zo6d+Gj( zB8Z-L6z0U@tAYO4uVG3Y{!D)%Tg{h7p=G3^xaQH51bQ-1d8o@}{Vs>BJ>LUaw)%Xx z)L^n9SlMvyreEKnS9qA`d=9@Q!Ieov;_<35ak#-zq?6WJ@XlQW#DL)xev4Nzo5)e{ z;{o!Y0oO&`Vc9o85D_SGHFhvVVWSPJ;7c1aFBsE9fF&|utc9++j?jumeC&zYramyW z-g}y4(6Od4TYu!$XdBFz=F!<;NZ7mteNJoLzpJm(=x;5M+qARGeb-Py?_Dl%3A)Zi zSmDZ~?mBlyK8cKHF)2B56e*kC$9i!}8Pi5aiB77e%@?NI4f2_k3(adT@u}GJ{vWQ+ zDM*xH>DFW0wr$VsvF+Jo+qR88wr$(CZQC~P{O3NM(+}Md6&+C#nNf|bwZ3FY8?D|M zFD~3eSE;??*Rb-o*nW?n9{ZdhC=L;Q7?n-J3!g{f#Z@(o;<0;a+9o$IDH3KOYf^#Z z6_x^+lfePqmMCFQpn=Nl)(R+-Xok*iXNgN=i*=MImQR_L{iB*vh~HBowM3yjscx6u zeh3rR`fGrLX^onmf+)}C`$V~91s+v;Nq3;|nxvddgXU_@sVU+{pJdO?UurRzmT(-$ zaCl7DimAW-dxirZUo&4&J;#8fGXVe#HJ2u3%y90=FrN8G9R3Lg^W+mW2+4U)gC0I_ z-CjPq4|GuoxL1=<*JR&=pIQh&BL9qAD#qQV(OVG%Q_auNc%4jrf zoQ$Nsd8WI0q>;`pJTCwS(a-SdNpE8Ge&KgPVPfGm*wNj#tS2|9k{hqhBgtA6#l)Mr z;OLpSG~V>gxfyZ=U_=_>%LPPQkgE%v5iZor7CzMGxvvQtUUk$*^PDsuLl3EaUv4e>wF$W9Rkal= zq-y>mCq`hD_-v^sbi`b{W*=xx7UC$-HI+yd=FMGj%F+JD=Y)@tK!uMO6|rVk;Qe(3 zwYhEtyC3|tyPTdLAGl#sjNr0hVl-r5OA6|%f_TbItqw)hhbWY`5T~!;-yr{9nwQ|) z4`-=WAhtgK!LYDeE7{(RGsnO+{FzQ%=wq3l3<%HKkUEv;gkzxKLpvGA5>|mn6T_oL z%UDYYy#yR?D9D1#&Tn{7Uq0gDg!G+twOe=~{{RbiPTyH&KZzu9aWcH3g zMnq5Ww5}Khs&B>X4%xTM^oD!*8>wr+Db3&QK+G^<_zG_^Vk$8*R{}?$V8i(-nbz}E zX#uU_SJEAKf-tFY7?u`HhZgim90bUdxjB8;Iz};ZkK}dPF3G zmZ0I{G?3ZVsc&UM!El*9g`ZGk1ZiBSsdJhEF=GefiR$0ZD|rMUN|HV;t7p9?A0^kdnb?k>qd27Aap{d$D1GHz5f^5yR2<2Z`>&cmhOc%=<`L#c(A1 ziOq!Fj4VExLWEc2_J!}DWAR7Ld0O+tX!?S7WF{e)rWgzMNl$yXAjv})na0?wFOXe@ zL$Kef6Vm^6DDFh{WieTdXEMaWfW5` zpR#TtC9+92vMtLKIS{*y!j+Pl?LkWd^oz1~9qcURlmT4z!Ad?$0ovp1_joef(NM)( zh2>~orO2ihXWSnGT1WB{B^W6W-x4812U@Y~)@YysS{&)Z865rdTYZxA9s7XNFl^#0 zMYcfM^-0wprlvUOg2!=Hzoh=xIXPBO7?i4Cx=?jM=WfV8B_X@qu* z@mG)es+&lKSlVjegr!S=ffcFSRtJ7oq%+jVr`oCK>aX%Ve)R|IKK+IPlcWCD+$ztE zc9HGYAP|fmX3S9R$}rML*t;PY@vSI#q}RMw?JA0%P-~k-t0UYNkJF~ zD7hfAl(_l|rIT{=nYZ>Lt~${VtpsQi>JT#lnd%uZ+}`R5fab0wh$pLSE^w{rifz{H zC(56xXO`lqOx4f{B+uZH+oT*VMp?} z#=XGXfJiL6eM%yZjLi%uWgMw@utyned&z1Uf?cdnd%Lx4wa>|DY@|EVxHc}kfeyeth2W5 z_-Mj1ta$f#WE|6|JF6r2<7hsmt|5kO*PciblKC{JDBhP3`lS?mRpF|QNlMKH?20(n zklOYl`vagpJQF7P?pcqyfZW^XS)Ym4ct44rW*;6=j)zpbk)Cfn!oK;P+$g4zYB>k2 zWk*)_vV7-~4hkcK)q%9b402uQtgx|?4he%mk3KySB1jcm@ltJAko@@1JBx7e-{+GL z#FH#^TWeN?#(skQ9klL8&n1>rjhxZ)9Ym5PNUZ-}a+JfbPG0$23^`Y2a~a;WFq%hv zJ(Q4_96*H~Q9=flzHC5+ZQF8yl*nctTt|&oF-J6CU2?T!$3hY;X;p^D;mZ#>+%dzx z@9*wSmniJ|+b?+2EN|wjuJ0BDTBcu?Gu*VX2lpOYf#eO9Cb@R}t#Bre6fMaO0%NQO zn+jSo_;c2;Z|hONYXd>u9Mh+*k=o8NvqW2?f0I2v?MjdG6h{#$IqBG7qJ)Ho29aAG z35|09j9}hv&#Wa6Wf(4TYqiftiHa;YkZ#i6UJ)?@ZY=btfN(5WtXi>N^1ic_LV!xZ zLpe6F)X%x2;nM$7Q;(g0^k`H@92{4??$*N9%5cn~4yWQ4w3FyoEDKh;cVOET$w-GZw~YwRmph~5X1i#cU?9$LFz2WF@R zimKn@t(IzqN+LT|FbYR;>Zc`M8Qt0e&$$Vcd69NZ8BtK%AEg@!)l^B5xjuc^f*Vq~ z8c;<8EJ<0g3Ja9k3zSZ!T3*3p7xO|om}y97DVbObr>;}0Uc9}Vl)8R*CtZ2jg516o zBT@tfHhh8A_^%=W;f)j_U&!vP(?O6t!fE!xUU@hZ5&SJg0m*BpEMhw4vF3N3A1_4x#tU9qjg~Je#FeFRO zqYkt)w8GaanC6@+hKx=ws$vEBL@^v!m0%f%0kGxcw2mHc!=NRR8qJvilguzCwEbGh zbtDyY6F8?M%(NU@v_3sY7%7V9%HX6x2m zyudB7IoxCbI5xH<5>li6$~71MGfl3$_yLcBKPv<0K)RDwgV`?4>d_*^H<#%UC8?$- z+TN&7)WjSKEQ#dy+T1@vD;1Dt!|3D}B3uOf2@?@2*xNXI$tMV(TP;E_1JUsC@cC|0Ty zx!{$2+4*2MBrhnZ0lYoAwZUZP2L-+E>-hq(bLrXyRG+f(4VL6i(G<@~I27wH9}X5% z5Xv;X21qnKs!E_Uu^J}$NByNUSxv0~6wX&`&D8hXjP$!5xE@|a0B*B6#dqNMg_)9Lt3aRcJvOQJHcY#K@T2R&67Qi?9cpInMjlbU16;=?dxTb|#Je zlVqEr0TS_}P{cc;@g;N!#0PuqAqf&$Z);ARk!19la zbmKqNpZ~xZrGdc>j++^)O%Q~_kq7N$d|?=!A3SV}NK6$#3_bvIPY3D3#spBh^eADZ zApr8r@L*~Aywz#DfohIqJ(4`(8OQb$l&HSm z`}UWn4ZGc98R}ne(bo6%kF_g?LRDIdJpW?TStyP{;4gF2CqdodM~A)-9{KT^XonSxo(e|IK59oyRVq(txh`9!sB={>ufn!n8@W)G8prfxCv*D0TN|7sfx`!k z-{G|f9HXuqce39K6G1m_7PAqRc&a`m*)6-q4YsgDxe)^?HN=d0fUgkG;9Soh_F0lv zC(G6?O(_3x&nP~9K8m}= zwbA{%C$@Aphlgy_Wyp~4k=Af!vuLoSY9NL+wR8m}+u}i{dIi&}iiMTzVyE>@uIxLR zLOM=*c~)y6P;X3c4BmHr>r-nynjeeyo*EK)hc%d+3Eba-8BpveFVgqx^m>p>(EIN? zPmJron$~yT;e0yXi5&C+!(9#x{AXv;llow!!nh3KY272%BR6fyOA6{)Sa(|JS?~oJ zMp_9QLP5NCgX_*l&|Z#`gLNxrg=kB-4YZ7-3~6;fAE_Q6KYU!@oC7f;cKkmE!Eqyq zgDdgO5JZMPEY^%(Yx8)bC>4iNVJ4)yYMC3E=qv5Y$G{bvfdtDkPiP>pRakLu~JqU|e$hZjYY{I?L93>-H@-^N(W94WNV@Vxv(II6G( zAn7X0F%nZNkG}g+$pin||1BQ(eD*&vG1tdRW)MfJYmDlb*FNUZW{fEWyJ%W19EzOQ z7ez{sg0v`rvW--DR@1E#CWoZ6Vy1DI3S!f6dH`=Uf9`PjV^ENYOGOK>p<2tu0)tB=xH`r;7QT_D?3nEG@Q;x~a(c~x>SH?_V z3kPi0Gq)1pEaTm4QVzlH1{w|zBv*%GO{r`Ku=D1!kr(y?9ZPR7(f{?|y-)dk0Pwy( zMEP1hJZx)b4?_vWJiz;=cz+XO`Dq2==v!N#nUNy-XWXOWC&#S3jl`^Lk;>fv?RW+6 z5+@CPsnBi)xboq$!5O}VemW5tql$anxm8hp1?rLM@%1B!V44mDRT|E!aJN1#8u#s~ zif*0eXLBWgeyJ~yHe(4n^KwPHe=2~fxp3`alNeL0>a%j#JDp6DWKN}uAD&YW7CJ)n zJ)#qkq#$3b(6*;b`z?EukIT3x)vQXkRacQd$*(h&TzxJyVnx6gdqhVU#dZX(Q&oj* zh4Gr!;W>?31&?swK%#BU?mneXg&I`-eVm#%cW&yg6M(*^H@j*T^!6N3qtRGWh6#i> zR9d@(D0q(cHP5+yp4xFh=qacz8 z%7oveJ+`~RWHRq7x#g(gSv!2rprcU{jtf!*)W9JCiO$MD`PV6U)Jq~j$vMfvxpMM& zod@2Ln`_3L!XWqhEUN?~sWz>0s08Wr^_rAK;;3}6&B$LXoJ&UqQBS#ka<#T}%JRH2 z^55p{SnLI`w!V3A#>i#^i+HX!S}tk<&4Du@R`ZX(hK;vKe!$psuf@2FICID7{GWlD zw3`5?PiX*IRxQ9xNvQk$UD%h=^5PgAa8G6o`iVNGwO!O(ZSB1G@(Z;}qc)uDnvhsc zWV8V#*n{pe@ra)bc9_40I{3MXS3^-^W!KcE-5&KbWfq;life_n=h5c;sU?M(v85WR zS!a@eShs-5ps)sO`jEuA3@+1AWz*tI9l({42FBZgtGMkRwfhyd(U@a6b=&g^H_5b* zdQi?N(QpoqF=wiJE-Y#&C0Fwv%t%(Nxa9Wt|3*zr(Mk=A!}Dc4f=SJN79UzGp(+At z(d`%Urp=6PC#p=E6fDYqyKHpL9mJW#uypA)BeIU9d|vHWQv2|GTE(tzw44Y|HVW{=~*vO>y>kzJ1vGr$&@3kNxhKlr-2YU`au)GkP zgYNoO1s$xbFp#G7q{n=~j^%xR+dglAXMLu)lOLCFBxGObjU;CK2>jD8$(U=`8k!Rl zl*=|Fj)YL8ofA5ao)vmT7x*Vl*06D-z@2-%&OIBbRMfN;fY&a48W)58DBkuEWzF`8 zFn^xv)ODE~YMg37HU9T$JCIgm?LMFViWBq*c)IW3+z5t^k7eh27iKWhOA=HBLxu^~C0r2{mk8wuL02`QuE4v+zD zoF~}%jI~;WC(Y?0>MdXLq>_BH#f@JgTJQeLdP54$Lt#F&lr;S@zisHjV_AG=AMr$% zsV1TI6F_nNK$9de$YD&$LU)xT(bO@ti2MlO0;yCB_AtVpqYUw$hh_;f+9t)5P$O8v zH}+-kSEt$t{uyKvQX?&E*ol&j(dsOAMmkydg&*PzSQi( z5=tYlz?#LBBrPM~0gAjM`3^t+75|@yiJXt-djmz}>HhiwE`=bth**a+P>T0SpUlY?t8@DCHb2Nj0d2}&wq86jZe9-qBG1$6LQoPxx=CKfI`TY@3AEe1^w1$p1Ub>DFn-y!F zTYtXYjwR2}#cVihW?Q+dhv(L-=i55XCUWK&3V#0SAHLb1F3jQUICw)CM16E+*-M3DEGXuFkSEx7V>L7t9+4M$5~ zmJlYxT{!-S4t*PSob(QW%j0$aN{4Mr=a?)x^2@!4$7jPsqt7{#T2|pot|V2doRGEgCre}^Hq2bk6{kb?cRu9 zdiNU<3>EHdj>KvM;==UsTRf&gK4$+ao05^d^|0|V(gZ9^8D5yAUK?X^xOJ!$0Nf*9(tjGZ!! zuf|W1Brz8x_VokLmX6diG+j99ZyB`Yv%$=CCa0qb(J*28G&&5f$zL-{i5T&3 zP<=&tna6bPTr=^CUK)59CnI9kI8Lkqe-sVd{LSHUh&T9=NbyQTZ*R^>$@!Y)(y)u@lr)yo`U$CP%<#%7$uE_6%?lkM{%l_ zSwHY*x~XbL+LD1@ad6Rhgd80@B9%!b7V;sCTr!ujEf_Eo|B|c%1>us2BmXRWQnYHu z(4{M{cSW#}mBGf@j;fpe)xziNr?%)M4Rp1RvD5k`SEx?>Y26k=K-K8futeNrEC4Y> zb~G}heK)g0YP3OSC#H5NZ1bPwPDosT18@g%nr6?|1JMv9Ln$9`D@Z_$+uLn&*l>#; z`H(?wa?$HMo(0wR2^{<~9s^*e^gG|ktwP#4cAa5=z|0X`Updh=J&82u?r`ta{KqRP zjfehceWE&ENB`c2v<~ViDUo$hS+Yp7+*pS-Ns9i=_2h7pkLqOt%QElPTZ2#)6JwVh z%i)-UBc}i{9^j~5(FV52nKv(>%b;Tv2FWCFQzQ$;S`P6k0^?{>1Cg3Szb@VpM%TU=t2ZPP$O`cD|?@A~skg&nT^;e!Y+;N}6ie!jZXlC9Z(H zfw)4kL&W^(4p%T29p_SxyP6WGXx#b`0tIF{+6&LWtP{j+-yEA>8OA=0>`J~aCx7~|`TLid4g zeCA$6P;38-+<&iNTDYU@Gf@Bl2za3Xd1G<@X9Z`C#ZXVg6~DZpXt}JIBQe5H1SoH1 zWCK8|TtFxNCFP%`HKWMg?(W&)5g*=_{mXzc$#cR)sBLmTxNGx!4A`3B_q>nne4gX` ze#wRIe1G2j`8hlJ^LetD^YG*HO5gKQ6Z-SCu=9PtaJTa3>#F4E_25@M^^o)D`(&o) zdLz*S+4)w|2E4!vg^MmJ1*URP} zt^797kdS}NFPTBt7WRmimbZSt%BQR7Nb_&^|34Ll0@<3sB`5DxG}6F@?#JSf4>0~w z{#1PU5%q2SoWJ|g@jb-sIcobVpK$EpTY+`A?qPdxYSML9vuQzXud3aE+EQJ$4z{7b zY`zq_nYnD%X>oq8*q%ausu&*de6%dnh5ktTF_-=<@3a%tDJkOaIP^PUBN*VgGC=YWKgMglM1k;-I@4zo6Yxm z0`f_)=nYJlPqQM1UdzS9Y-{&~zSRyo<8ZopN9=XAzp5qY8N)I&6lwliKp!13URQ7( zlh;+XIura_`s>?C`;ZycFX;UzV(C2&2Le*6hOuNK5HAyV+3zm%%JTs{`a9+#{RA41 z^{-Y)$jH)#M=ZEWs(P8KVsEEm)2H?aj>sMGU5vaDPatv(W44-{A%}dVeKzS6PB%6Z0QS^2iEi#1}LZME3(uKcCA}dNDoI6CG1Tr-Q_@<95`qE8c=wUy)m_@&g4xc-QNVtEm z_R_mSHLUEd2ha?$+rdkI(-Y?J+ow07Y7a1lojjK#IxAwPDW-HCTZZwic#pZj{ESA> zX&|xHLkWL?moxOtVa)(eEK*HP*qm-oZ>A=31VBf0z9^VkrphpX8sF3=MY8V#@|wGm z=s|>ErIz`=%jaa@XkI^@axS~T=|*2CBJs8W=`f!a^;5Y9rF8KE%*C`iC=GkT)t_RA zUPxvL?I$xtvTy^jk_ZV6ne0D&2m}E(dLUpM(jJZ7smT9Kxe~-nWi9GTkTB<}g&)3F zh)#FY9~+hZnH&2JRb(d3Z$#F|kZ^|_7YASabuztcLY{{8*@&g5A`P}vGTY}WbO#;g z)Oykn3=q%Vi zUagTFZb-?FonF)eh5O?CVeKuOl49!i{^ylFbc{*q| zC>PB~h35-bga5N(7A!V7-GauPJ`~PA9F-uq#i+~|v1yYM_|LIQO2<8Q`H292hK&82 zbY6S)9lRWrWPoS>v$521|1D=1UOPy-#Ze}oZ4M#WE3?Gwequnmo7}ziT)l8QL5idu zf~~HN6YLnOE?DEx^#)><-xrqr?%DBl^Remcl|Yyz(5xHm5}c{)a0?R4OOeD$IA|-( z=ZTJ1y!(b5xv*OW-MSDZ$||szz99B^KT=O<@{OuRe8DDR@nB)|Gv2jC+^c|P>OgSS z8PC(mu4j<|-|>qs$Q{vYCT^j$v>GW|x9EK8i%$nX77w-KPvQr5TAd*!`~LbMD)fV) zL3oTWw z&(hA%J$?`Uw@OvgJN)6hR)kU9VC$f(lo}iQ{bYV+IO&qJsCzNj#YAPIZtq9&q7rHz z)q8d2dGqN*wHZZxlXvA2WzBs%eR_LkNB5PK7o4Wpd6zHY5wg>^d78lh4_%%-%sDk2 z3)?&D0ndAy(~y!Y;TfLLmEJwm#G16WE~|{L6Rmnk=O0#$IhD7!iS`=(Zg-X8&ia9N z9#rGFCDM*gng%v{%R{9^AVw&kN-V*B>nK21_qZmJl@#L@qas;~5^+P2k$NuwX}m9n z7GNfQG(kBDNx(y{?Fx27bSH#92P$IXFh!Figj?Pe)`#Fj?-bN3)mhrA{78g90QrVb zHI<94=ZnYA0~#vMw@PctQ!W}+rf3MQwwi9qBdT4V&t*zO)DG1xUhs;>J)PAVboLb1JpA3K(lv)-Pp2K_G+dFrOGjk_#sm)N zKrbpAmMWb!XgD%NrA?%Sgki*_JQ+G+$-4x*d4HGivSj`CVv8l7u( z@TlIEmh@N}Glyk1P$@n*v|RS`7KOLKS0fCUxW87N@iB6P8|>HydyIw|Y_7ai2n-A+N&;`ZE=*HhO*;ezHDCGiLXGA#KiN&v)ma9q8$Pa z#M)Hk;1mNVk6I}>(Myg3AgZbYs=Qnj#xEMSwW+q4BDy6v*Tms0q8SJ0FHY4EgFC9k zT{eg-hxFk4oosfxJNy4Tf?g698816gQ3uEv@%wY(Y^bjU3M#T$M`5$wz zR0gvx`>p!aY%z)+)-3FDVi)T(OD_h4er9##mt1i2Ysedhy}l}whPrac{cOF)UfZu3 zT>BN%8j+qzDX^Y4lr&Pluc06N(9QE71;eXVyP{^I^^oM9FJ)?MX|KREODc2bR72`S zrH#AF!&W5_rzPfxjYe5Y2D(`o4e3qGMGCJA^{L5u1u+B`2|S5Gei}_5Ss(}JH~_?{ zj;61IYv(c}3$3uWL)1u5#uDnuc8Y8xmx^`_o)af+P@nCbpfnpSnT>)t=Y2NNHt}WB z!z6UnZOmCNbUr8%uDu0L46G(zoEq_{%pifX0d)BQMYG2oJ^E$uR!t_Aqu|2T#c^k0 zkq6i!8x6?3yTk?4UeKxmhzrG1X3Ex4>C6#!#KsV`@Cg=qexbsQe@Y9=Gd>FLwDlwY zAzXEds$~`aY#dX6W_o>!^PIWKuXB>&o{y<&)_&1WzFsVl&orhf-8+)zhMrqFk9rl+ ze+gyOJdyI*nK+0!3OcgD-yZ0N$#+qM_}Tc(aW$o`Bh4)EQi%ePG@zuw-~9QR^c}UZZzZV1_}?0{98ZZ^?df@6)xf@E zKh{6w@LjF$OJl^NH6Gb&xj_ET>!bF~sT^Ql1@F}TH48#Tnmgr8Dim$6)IIPI*U+iW z9F9YG=LNfCHPYc9*@)m*Ol?TemQc(7i2gdSEl0Szpu0>cbI#$!IYvG%5%N-)j zIT=O~hIlAxtc91^SJs!k5|?ySGsw%bd;!G%K9zkU^V-AwV~vHJ_4W!!`3tXD&SAK$ zbW?dEW~rt#S?iFOWF@Q~l#^6JFvAC$iMyh`qCG_x^-U73u%@8M5(E?^=GEl4HzcCbmdAT!maCFxq>1gKS7*#FC3mo`Fljk_78* z1RLWbd24702G*JN7-BGTo|JtWzv^2;lHTWj^Im}J|y90xfX*5>dxg(QA#BbNudq> zvw~Ea9Xbw3iP@CS=4C~RzqQTNaIdYbM#6PMm(>c;9NLv>pJn{{{HlkC1esDpzxQ2E z@}TtXiq%@3e{m=T*Vpp2VL&9C*IE&d=xVHddJm*ZV|tYF!@ z+g$}Bo5_q!fo49XlBy-d3}fYTi~)UwrAT< z1>hsRQlT@l>W&hZy&KU>Iqpzf>IVlgF7wDG!YO}T6k$h6Enk;;n&%x!t?_=pbVZlm zjG!j%=1qlFYrx_sG;HIlRYNMYP?S=)uc;;y%DPMq3Q=QlK9-$*@jD<~ z38}52W0EITB2K`pWQq-T03viM;gO}$$8J|CU z*NtNvmY3?c_SjFTZ!Z3kL_TtcjtpkL#Sli8BXC!h)l10qMTpZ1JfF|8%0k*_zq}9C zyH}3DaOc58Hdq(u8+5Ng7y#@!zlQ$v$b=M1KgCda@ICfU=kc=X14;yNwIkH-@+)pS zP=2?_+p}T+$5T#O4zpK;a4y=BWGQuxuowqd1cVR_I|#V6R`fcOAy(wNyn2y0H53#ty5wT7&EvFI{+H_CF@1p4)gTX)736gA zhSzf;jG>T2r2!WMO9;*y1{_wVgE~Sw<5XvGyNJB;fL?Hhfa_=jp@I?ve}3>=z3|mp zv&!88qt)>}re{Je10iB4zvJGzUfLqB^6p5 zAT*ORLULHVHw(xf+ClNLyAT0&Bx=TdM&ZH-kT@=WZmRKinNEGv|peRTv;531uJ)iUBTh)H9p% zlq4sp1?hzR2zC@OXGUUiYo_D&8|a1a>ho{1KnWMH(sj74!dQ)%fTuvY?Qknnw~qx> z(?X=v`8n+5XWx59pow*P6}Y~s+XuERP`1m@xl`g87`iL0B^sf7rIZJs$vNqK2AjU` zDjtgi$rbA(B^`)u4FbH?STMrBVV$}GzI}_*+kb(1^XmWXv79{_euMUrOTDZRugYqE zfV)0GnfCg1c9Bkd`BYP$p7CDflQ+GXsB{T&w_v>968~$AN8^Lt&A~!GlOk)7uVIh~ z7O1ESJ1xm<5&2gC)dvf;M8rXRLm2;h|{X z(kKsodi1?^GIMlX5EFRfZxKxo(9hYPO@KxKrcA0hlLc{U9hp*L(01ixLJ@HTfNQ0} z<8@NS-cLA0y?IgoFqgRE?@_gV8-NAC6Bt+|i*f)b$6pNx2>*#-4^AglB1he6t6V27 zAe5MNh1|KrMgqzpFRks+fh>)BXuG)rNGfP;b0G-+BQk1uJaH0zqS5M!S8&qG387ep zG=SEG@!Z{ad6z%rTx0i9_$_2(zi=~WQa_5fzEUASq+V3XYjRg1iJ-yOHSE_p&@g3v z6k{(xJ5=0J9mQ*~K9qVG35Pr)a0s#C66z!Mask_2ZzXdEDTuy}avE$T=|V+2UJWu5 z!hrq29RZkfD3Cy8t%!HfpufG)`2h$L(3Gze*6t)|gV04CyD)wKCYbg_N;Y9sJ~&uC zZvA&PBwP(-s)sPE&F{Wk$F=6(F&PaIh{zG5F67d3$AgGO!C6!YMX69AOQOh8z?y`q z=FK7419Ss5{a&C3B^im42%WhNkXZKQO@VExG(?OTo`kswyY|zRd6_YY{P5fYT{YC< z)uSy`OUZy%4h)u(?85oIL3R>pf^r+>an0=p3n<9@h>IdE=o13U)=8oG?`}FLiJTK{ zcQrt0Ae@l9>fa?#fekpI{@m*ImZ6mbW0gPJ3VQFm)t0x%E6+iR4&g&UD{anYhpXv& z!5+l<4DR-G0A3?i1}XXXM7SdprsFZSB<+??;;jQh1|ue*?l+HL@y4Xy=Wc2q=^&bs z+RF`v(a`0p6Hbe!l0s;px#1I1FH$J*C1*gvsB)1emz`CR2<;clZ!3d??Apt+@F7N% z^-DLA8lzX}LC_3g@{|z=k_Eb|m~ar17|i8XjM0Zo<<7F8P2m9!RJS74qc^rikzq*0 zu1Zi~9jlNvLGkXr0_IjpivrH+8-rGfX+#vVS>m~n3P8jI? z$OS`)$X{;Sq2)}BP$;GF%Ujkl5^ZqpBwCLym6tPw3nXOb){8`>iRO6F;sdi`_f25Q z4nv6%{z8v1lKv^k(hwPo0w!(x!=}821CH&dVP)6_c z=C0u2N#+1>!5{ZKVE}@p>Q+eF74}j+m)?VwqWb|RHn?3PoZpK9Xp2!uoI$pQ5m+iG zh@vip**Nxt`;lvAouX|>XjBG07(-QJfu7Ar;6fe)T=bG>>N!>c%h*LT&Nhj|mSc{J zkjVti*6;L+FO_)tc<=86xCAU@MfRectxa$89Z@yU0OBXNqI zpoZ)igcM~$dL#h#43L!lGid_!cRZ%pAf9d5h;WcoY-evDBfZK-_{2*<*;++BEVENC zWh!rUW2fyg5K(3iRx#EJ9-dti&xmWDkR&$iih69n3P}Kf!FmUxqGkA_0xi*l5$9rQ#J@ zj1UXqqz8d_G5kO<2sL=auU_7$7pkk06I(SJNGiy>NQ(xl52DG8HNTk5ygXuL*dx|* znc4)y<842wjAid`AOElhydWjN?{)^I70@qepa%uZ-b-!hXIycXk z%H+db;BeLLvwcx>UfT6YlSuX@>6etB!g3+V1~iciqIXrUM@$EqGiVhA~8> zx>>yoj0h!(C7+o3Q)$L|x1IeUIlF!2Wjmv0CHKeI174;O!iOms-YzA_a4<+>thrBk zIKkyj(T2&CW0|PObec0T8WK(?2v`8*qi>}QP<}y@wX7~S+TLwvmwFy z7=rRL@(9r$N2kVya2nRE!gvYN;gfZv>U~NKV4`__&C>#FWnpogY+3YA1}00z@TgoFzuJ|$u>=_ zacPKv-mU(ub*^Fqyc@Bky7yWehO|Vhi6=E8H~`2`z@k?qHFOPvw{7kmTMMHnBN~7J z@^D8XThA3eKSzIje$+NA#>e4NwZv%v{MlF%0qwj2P)e!=2u}Oq*Qo5}H_(*0zdR;3 z&O3BbHIdv`|GYf$ z(~BjH(3W5+DJ=hUsoEL+peDn=Lcc+k`Iz-NI0U@~s*%DQ!jzG0V?=lyboJA%Xs>V{ zCet;~_#joGeY^LV=ZLj7GIrYK(Is-}yg-}bdw^%xgcvjYV5usA!(SE+OW8xwu)obzjS#-Ijil%j56uUrO@_$wiW>*Sfv!glTO$Zi~u} z44IMZm=)h#g}FjHC=3?o;XJva!XT)%pqZAk&a4t8X@m=fu1m455VQwD94a>tx;1+l zto+ncH3Rpz{*FGiOK{U$(rL7YVo>oIs%@#=wV<%39NEXR7*1ha8pL*edRy7cf9dTR zj|n9nPj8`Ku;&;`cIucB1OH++OcVAW+=!OJHIE7i5Veb|-Pp=`a86+)u?RF`P4DHK zcEO268daKqvBZbWq-Ql6E}3Yg^@*Dv^EorCok9CoU=Jhiy=!FL)3FmS>vhv>3VlcC z#oCI1=sYiJB~%*Y-LFJbUd5GK4BaoN58(jcKP~(i+K;T7(m?V)4`y*_-O{n8rq@ zjZ(q2d!a-Wne=HDx4q}N^q4Rm<%QDVUP&6@qdv*L3v;lxCoz>2e^*1Bc zq^Of2bq$SEJ*B#y-gaV%Xa-Jmh3iAv5Y87Cw^?K3Sa;^==4c2ZEfXEo**d)XP6MLe z90}`C(pDZ+iVDvcx>S&5=%g_dDu2Co`OyMqwtbmll6)Gw#$WH9gGOH=IVuq67SkV5 zk^<-}F>E9KexTQK4&ms4pcWS@=hJp8jTI+IBhp_?%!Q?1V_tMT@GYDv&6YwYkNbI* z=CCZu<3YiRG;{zXl5<#MftKMfi$&Ka@-6Cd!~Zorm|GO1(!4zuanMEdd>eSn+A4zB zTUjISWQ!AvjFS*SmDH;*wm@kgL9`^h$od7^@MIppsnLg(|tED9E|#+`XO-j!|2XXP>4|XZ-QCWh?myOCAu&u z%sD^09qJF&xC7Rs0#v%8^(j8o0G{SogtKC=uU4&u< z@5yF;&z#Zz2UhmW+0B~e8y=;O)H?jtWsR!~ky`k~dU|9fpYIPKUi?`V(xW21SB=Q$ zED2A2-usKA=vf|6pC!KFT-q-pY8jvek=x|9H#s8N}1Xgi#6e6I&H-#D*5|Ql%vsg{tG3Iwbd13P~b2u-Xnl3Ap<{DiA(zd5o}-* zvcEJCxYwuvLGg_sMB7+A3W}Ks=p!pUCKhR1Ft|+sBo_JwP>E*##qshD51;(8@aDNW zGDMZn+&01ISRP*CT$QFvjS|0c!jXiWA3$*>kDJT_NImv0LWgVVM29-rLz@A@3$ZXp zXmWfmJAyItgukqqOx(xC?zjo#tB0V|T7?`J@ge?1&IaYZCb(ZUh4Sk#i(pyf7?+X$ zo!D3UbnmYad|6=O2YQ8GB%#M@Zjqs}xS%>hvrMQ~G`TB%3N6WQ0cCo3tLuWbBo$J|PB8otFA~`BK}O(f5@2iqW|<-LfwG*Qk(={-A(@+Re&@tO ztK^n%o_Z}pIO2aGm!$TUi&k=9992Yt>#ar0U57UzeeZxKQ1V!XQT93Re8>%|VI)0m z6x7sXaQht=%oyVir(dxILn)=P&rYVyQP2o<(v*3eU7ll=#JgjC8IO|Vkpxy5n%yEB z7JZ}9jGN(OnM2w%rqnp%E^;7sn+`UYHpfr#!NQr*hxza#pnDE?3;6lk&` zrVnkp83s^j9{{bTPxWquTFXN2&FTc8+U;8W+@o?7k&I?k&h`)8(CClNLgPC|jGH)|-G!Y;yb|=!jdt5Y zdD7&qgGz{_u(Uv)Vo*3djmd!G^i`Z5FLW_1bw&DPC(`dv;Z8rY_3%tiZ8yObg)ZZJ z8-4ER{a`4M5jX}_lQ+w+emOsY&>3Fwy7Oh|l{6%etF=9xSNwB6@1MmDcR~##ja%V1 zW}^=#WNQu62nfPo_W1E`wa|}jwGTT~qZ#EkCD$onDzi1?X7#M)&7b%6^85Li_wxwP z|NHmrneY?C_m|)A=UVUQZSh}d&@2D%mvihI*TbCWqTFx^zwCI=HQ;Pkzsjchj2)%Ztd4hv9QJLw)NGVTexVj}< zc1>|Eu3Rye3JAMGH}QQr6x0E2772?5*C8W$CQi*Q%}Bt+j7}Eq~!juJ}2jIR9vmv z>i7F6h~zXhU$7@WMwOHeo!=vwC}w3^g^fY#u^v^y5OzK78S9B<`WZV9*e~-Hir~l3 zqbMCIrO)9FH6oX9lH8O%ov9rwIV{*Hyf3LKKyV-L#TP8!x!!OJ@h>x z-RxJ;@g67K{CtbOKyZpo^i{N05Z{5D{A-LX`OdBeop2tAt+e23w-6WI3cWi2*; zt?!o}k_h-XGU%a2)Gj>CI-Rqft{rf){CR3AuN%PTO`+Bp1>nlG7v7YOBR>YdHEpdYaK&#nbabCZA_|B~&dOSxrw_( z&zinW{DvM;Z!bB8-qVH8As3Z&KLR=li3xL)(ijexJSqs;?N0MJ>bZ!t>Wb-RM2es1 z2*kP>XYO2Q3l4$8`bsq!V#Oy)bwuYo$ADKZ{9$BVO%+%Iwe1+IRoUekITrXkt5jQI zr^U1G32&f)w&l#7V323J+f*m=V-C%PR0P(-*63{;R8R67UxKb4#_9F$z0LaNoeZxu zgSzH}Tf?N=M7EFI_cM@UXQgVf)HLqhExyv@5#nq09ty<8PD|VKE0Z*1h9eb=I6do= zsO*lo-Jg?P-w!v(i;2eHx6@s}>`^a^$sdQQ$52On9j%4v&S5+-)yl>#&U7Wqys$h8 z3d+xXo%d02old8p*L(QQ+#Y4J)41O;d%7ZigbQPocR~C~d)J|=e?e!qj(ReA zCb!GLyaa2b>=3fl+9`KuPnacgh-E*Bmj17_P#=1WFGcxmn~u$J4|VQeMo*)WyoG(;xOMa74!xlg|LXpStPt@=;- zy}u^$gD@~#WhTqt#bI;dxd@HH*^r+}ENj1S`TJiLIQ4^tP(r%N$t1#yB`TMNA8z2F z18O4>dI@HmCNDDAAMp3SObF40l!r7Z9C%~HK;VaM)9(o=> zaq4lO8Mr=F?TZx+YdbvJVPT2HoflH`rKu=$aTY{j$>0)k-D#c+KP%7Q{1$;7>IZ93 zQq;9?pO=<-;^~e%e5DFL1T?{=Osi%wLYR==%RKmOky@xFMTkK|8|SczPfN{*C<(CM z?abi>X*_fh$Q3ceoy9HVL$Hw7oxm(@N;ZQ{8~57mIlIn%KC}(j)+3P2%}zCRiLLnG zT8qevk03uw#1)lvizl8jK{#a1$8Q4%OL_@=TX2j3WvRo10qpo|S%ES;$j<+s1KLhk zO`;$=7YUm@@P9MzmnpqeH&{kOe-f57HWsL9!@VD5qhPjB%6M|PNvDu;jG*a8pU7uA zE_TUsx_EpB!j-v*8?su<&FfxBJc>u9Ur@0E^M>O)A9&Ey4|tsZ^{#zgw-{CC!Agph z?$j-$WB}xj&1S9*Z5nfUcZMn@Tc;XYDyg4##4Yi*uW7{&JCkvd{J59UIhc~TYCSNT z=OI<)J?rssob`@!V)ul|h|Bjy;5#~7EL}|x3nH)eBCECAyDksK`|B(8*~d1ADw{+7 z$E@bKD1Vfp%u6d3XO0Bltl&y9q(a`AlMBxVyTYPp?ZS$7D}QEDFf*5P;=@>JIRV!g zN z*M^iVJj278EUTA5swf&Z+qlp~DcQ%IgtLLinW`FzWsHWN0%Rv`PLjp2HNq#g9nVi- zAU0x)p(J4*Y!n=bMzScKuHpuk)l6n3Rb_O4z-|*$vIDQXV%awU-H-TXvBzFL8&V= z#@uyzP~}U-L`MNt6i=Eh_W449EB4i~xMc=t_E_mdLXg`rbHl>V4oLG*w@VmZ`l&3` zK+En#5lTm9FxgRHP+A7*T5Jl(ZjCmc`)qs9}>A14gyY*WiUEU=+$8PE@HrBhy?D=f|6fon@$1r-;W zzomuw9uSHaO%hCA=9Fz&$gI)o7|zkzr5M26=jOnz`&~GfutLK_WH@YoU&DuSX*GQ} zLVyACFPy9}?`mN4CFQQgpL$9QnjtgpEDyzsAn+F+xT0_8$>QP+XYU}5!?@oHjSW&& zV8%vTOZBdYer4p?lcPs?t(sCAC|FG5d zsWLd%hh=kT1_8t06JLo*-V3mQYR^q8_d#ygp7wWLYsS&ZBgRy6mxu@ z@tALUWhV9cY)C(uHq$gyg`4I<7n&@U%OcvWQ`PFQMQ+-%7tDW-=O5~WF58=V!Dm4( zXVS^jde2mdP4;juhYC0MZD_Z)4bJt^OhJM@;48<&JbP5#1h_$M9$%T?HZ~Gd1?tL` z1ozZxQRTF{2)n2=vt!m|WbIrQ)Z=p0UX}$f+RVw|H?=Fwn^PiTH&e)-VMr5AQl6%x z(rh;HRakND>_J@v(=Q{3w+?XVZ?95V1Gt6<4eN8iT2tLHhR}M`x!W+nDKbFRT#hxw zm6o1q38IYf4Uw9&Bb|Di1HK`ka^#WLyv-@z8z^)Z&YOzhD`ts)W8xLzqVp$q%?FMe znicuCYi}ZgQr!HQtwEMc9ehab2c|druxleQ0KcsXm6JiWJB32GE>f%!zv6y`gSajV z5bYkX5u1Au&3|8#BLyT~@`YsI2VSE@=7Ayl^+*J#$ARY{tr~fgAgH(jfenX9l(R{) zIfB8oB2(I04G{xCM1v$8thQZQ3_i6BAt}i+9n`NbS(wAFP@^%f$&yM+#L3~y3cWKC zdC;fLs<1q0^OGWaJ&{F3^4!3aSH$>R=^)jM_ny3kFE46aoH8et8>Z!OeTb>3q%B_K zi4J#-+b9~d-(LpMjIL8S`Xr0J2_gg{CdfD)nNIDf>mUhoCA+^G&Bb7fec)Xw zhuv+}$lZBjv7FIX4@k-k`48weVF+J1zLBG`gzNATA_OPEg|V{oKhaaPt83Seu-H_L z=G^zjN?<`Py~vQET?}Pq*BeTA1epbQD74+5jDN>owx8d(VUHY5iBR8Qtc`h$Cd;0A zJ;)vGN$-I+xrSD;Fl+_NGdyrP=|`Z0SPo~78v;-7u4qjAp%fFe3s$|ayNOZZ+M55H zOa(~KnXA$jA*GdUiy+BJYyBKhF6)^-+$|9P`up)zz}bb@R5emDI$+^}vDhFf2JD7N zPo(gLlHxeUj=TQ+()KWYPPJ;%Kw(&$()%)=vi+>YaUn5OMvSkR=DZK{#9Ox*mC*zU6PhgAf_s~bV6Iw zwuM=XiJ2$J>OTYz{$8DA32)6$XmD%t16;&lN1%!06ZgHh$c8Oy`}3Z%GcmnAUxJmUHk zVIK{k03k=GyYE7~c^Xz!m8uU|hk(uLPq^6Kd$xDug8V0B>BI&LL6nZoJ&RT|r1iH? zNW1FBWmWKxjk)U1G9g&J%D5pR3DW|rfo-mxZmIdJB_lI5ME8_G3r~hGJL!nk^~!J} zxZ?xjxQ~xSLu!4dC74rBhW9zrK@%Hb8uk2jua6+N!o&}s-~R@)>|@$EHN^BVPtX=i zE3*D%stsp{gt12$8XEmZfbnQD#I#{2irk{Fzn1V!_ypUG<17m_gGz$6AXbt$d^71u zJp&YxHu5FRS5#1AJW#!6j-Q7`fY&budYhr_TtH%0**Tt4Spi69;~w-2@*MWsW#F8; zW(!AmLeDzo+ovlv)2DNOCv`XC2vFK&rJWy(B6G^KC-&QB)dabyE_jE64fSsc>JkO? zzB+e{=8v_ayas_W-n?6{e1z7->BER;gth(Z0yf%mS&u&_9u5IDY^}Os`r40FlUbEO zZ3j&x+N#h~r5SHrJV$n4uU>5BDCiEr!eZfLDIrc3T2=)~ncWQ`!C=q>o?h8P$=19< zm!SXyG00aZ&{ERK`p5eA9T83_hK^U%t;?G>4H*JZ zSS$gt4fv5x=di1zWU)xE;wsH3u3J_x?*%I4@OSb<-ym)gzmj8A~>Kz(y~%VN%X zA%TVBvP_9$R&CHy+wN1uZ{2S*>bU$RZI%l?*24kiGAynsih}DMtDxh>!K|}G+7A+4 z#)6Yai~9jw-D{Dpj|l@A3H}UUc4RhvPxB7zNkz{m!Q)@WO=3pVqdONm|JU`DUFZK4(IN`n_A7xCDf~$YMxH{Tb{**b zpPD5?0Th&Y+s&Y)j$(KpL9w@|q@~VWY z0bX_udRNTDskq%a9aT8w0c8x*N3o)MoNymdHG99aZmv4VxD5BKRjjtH7WwFLw_}B&i2!&rW}|>;!~=Z;A9xBml!t%?E;#Z zCm8hxi7x`IVjKYGTCmjgrmmm7Cf*`nWvG`(=g@?xCTOr#BgOb@Yh5_mqE-2WKt74*eHBTi3B(bWr3fc!nA9Unha_A~^iA`UHF zwj@NWp^EHm%}ef5>Z;DNlNeEg7%vRn?P$ zW;E3AfxXA^N>Ngl6dkD)H>#F8K}Yf!Egv#`MVgNZHX8E_mu<0CK!g(OHU&taoDQQB z@-$hh3=5DV^XEY<>7L(w1Ko-}jLlUtl^~)^nPmV~svFCkPkafSE5uO#X40Ujo|(sO zhz$&WVkU%2XHaa+sst}a15A00fX3^HR3>_=tLwLXb&$u zG7|22yH5%byEz(@lx~y-j^tsBku)J8w3>WvLqQK39T87z*m zObY?n=|y(OA7Kf%5|wcqp@F;fGk{szP#8HP5|%{>i9H^})jWq3Y&A<8{M<+n+9`+t z5XA9t$f5MX{wSU?Dp=(JG@r3jr#6T=kV*s5{3tl?QJN=e7)}&%7&9~59@bi48=3Ev zXk!6)VFRQHC(1C3G#OrD(hF%l-UGMPLDU8Dh3Kk;0rZ{)tlov}mDmWaCc>V_`6Mzw(vE^fT0wyIp#I>l~~Kp3FL4Qipp12&HO@`#`1Kkv)n# zZBDJDn8VOTo}%h|p(VSaf$okhdh`9EA%_ zq3%JuQQ_?)T|`UKQNC|RN_dJ$YW|;jJB?3nS^kdwKv}UPJt~hHWIHks-XvsB^+%Vd zq}-8=H-zuCe+^#yX`tWDHg+mT#>LYdanezgm}O8P9}t~icwRM>>J+GRy|6L)P`@6p zHWV;5Hnm=*DsYe8vxy1I*H{d!@%s2f?<6v zjv=<=;bZqo)bFr@TtGP$?bJHYfIX1yU*RW1@xrU};%{L<_px&}NfN zl-$ZaP?k7xY;J1q^RRR#sYZ0Hvm-uqF<~}D+G>`7#gfUrAG?8HT%Be6XDZ&B5I z$-Wsfc+DBPb>m4b3g!x00yw)#wr!jx4;FjIz)B3cVbDUt-)PyYOg&k^02bn%t9p2>9 zdA1K3q)C1>I6DXN`wsT0oXIjhcLT740va@Pxye4YeE2+&|NNsQsl94ymmgRYOc2PK zY;vh&rBTZA-1@RFRt=Q7-iVKzF_@b}dcF+dss~b$*kB4t)^CJcCd4O-V6T6=wm({? zwLF9pc_KEV+(_as^fP*bTG8j-q_Ziv7vMbE%Fnq4q-`&_u_lanYMWMCTeTi2F195f zAP7%8ZHPSL%M5l-@G>qv1j(7I%TIVQpwC#^PI;NpLIaQ8SPX2)c0rnVD$^EEGhc<# z{Gk*qb^@`6PjIg!nETS*%&mw47Op*JX#kiFZXZ4NYLx1<#k`&B^Sz(`D5g7B4V4o* zp7snYdxU`Vx=DXOpOm!)%f$8Wz#U~q+tq&obO06{=EjjVZ6Faj# zH*hd9!eP#`7c@_U+VKGvww?r+n#T@oemTCM9Ax#@$bwwNwXw1_n`MwbjX4rvk)wxo-e4sCb}xqiAad{!ey2e>&mDWhHqSil=yC9kG)-JIfMvmrVZkE*a zWcV-0^pf@+VyC^wpm!7XV$6FmY90qxa%mg}2V4vIbSf7ZdlU>!;q>klk7ShV{f$H; zb|D?%x)C-*qVV6GnrgxDD8&Qn6plwb@=oB-zTRmBDTT>fc(;1LxJHGK@hB7yU@bq^bNmDDZ5quOCxyVjk5CdeP(kqW(y{nue zK+d_pQO@Zl7;0dR3q()^bmrGAqZ~fqOljs>(Ilg|O-|YsUgCc#-mB1}-IhP^6n)4d9Aru>r)z!nx9%ulNKnG6`n_QTbP{aXVJ~SW&9ku-pO)f$ zkY5deWYH{6Iw(*82KWl9U#8|F%+nERoEOQbC4-f?1fe#~c9Qp661ESLQCSq7oIiAZ z2w_cB5%}9=pu}>6-RGA!?plMbEG_e)J8EVJZxV87La6>3{9r>tk$cw?Sz`18IWthc zd5Z+0k-JJU&2DveZW~z#4rAn_YY6*ntuP$>#%UE#aXMY>$D>A4O8GO`u8ca;w1!l4 zu@K@*ZuhDABL7z`n=KPE&*=prANt=l409RDjoskcBmYmfFP}q-QG)SK#3TR~X{Lxe zv;pLFlG?l~-iar1TiKMrBKx{@k{RVh z-B}VgU7OzrfO{ab8lqVTn~<#IHAN=YFtYdN@gS2{_3awYA7 zSc+p9b_Dq$Cx_4CgcbV<>_6rou4|g(Um^nX=5I`*C?ZguD^`2lwDvP*Z6wLDUIl{d|)@ z^?q-^ZTq)RClKh-S#f3B464F`iQ|?1^E#i?xK>y{NEcUJm7H_Saf%jc$`G3Ep?R(~ zRH=Qaijp*rV^VO+NO@qII<-3wwc|TUd;>Y+xFOzL>BgcqsQp$p(_3@I{qeMEmZ(o- zPtI8ZAN8TLoJlYqSfhliDZ)YD&o+HwWLj&|yw0W;b>mOr4Wser4hC_ytX@Mc6&zmX zqsxiY5kw=eYr@WrQ|k0y)#d&~5WP|fbq4SV0Z38s^YF3Pu7 z$q8C=$-Pn0vssp;zfm*dQNKtf1% zWW}YwF~%V!dJftB(7t^Pg{G(2SG2ITVf}b(zJODT5~ibID3|+wTg6(@c!SM>JT9pn zMd#O64*r$GI&-MJFpB6_Jbh~OKzxG;1#rw((f65Z7$t`U7yy{)t?5-ktWz;SX{Pj= zVxU5eZyDXUZ+3u)88DMzRm}nIVyVoV3A5}jr>nfX_4dUHklH{en0oRshJ#uv0y{X~ zFJSt5s-O(c{ClFwH4(h@8kwSj4Wd%H7ceJLRP68IPKS~V2GTI_$m&YXHt1ySN@Z5V zfPl{-77x|+UjFaMO94GX-1o7mCf3(IsD|D-AK~Z!I&N^hK1=xj_%hXhw$=Y~+*la? zqvGT!%2*Bl3?t4b|y- zz7!0>s%$=;y!k;hVq0X8S1oP4l5gfQ3z-F^X^@Gh*v&)i)={Gn)t9y8HaFC{2kBUo z9a76?3ip#Q4XlgFD$@}8p!4}8(ivCy5k^?w+5fjNWca29VfL?%+GPK?mW=-uhBW{D zhl1<5R6A>DZ7K+R=0cNn+klps&xvWZ0tRtNX#S4`MmOU!EI+((2y8|qRcK^{%=Py74egGHfi7IB9^+Bw3d7+>k%9;|bh zZ48Pb8(IjCDM{#di!rb;NVZ)`+qaMUbiEe8%b_;gANyt6D-iQSJ3pOlIw# zEO|rEwy*hI;WrxNRpvh8!BNp<=^8(1UVT1YvVMP%$hx*e7IyE$HJWiaCa*4g)|>qW zDJ%G&A$^%y#t~2Qf{B{$c`j>=k&Q9eM4YSS9P0_gMFw8s0B9%rKk63? z)BmVn>#@w!4yCi7RPG#yct|buVWGyK#%uzCK3~EsV?ZF^p=^C_{Il2^qAQ7#Vhv+A zKbqFGS0`$JOpT3=Y3xM0z7O#Io}>J}j`?wYzaRa6zQXeSUiHHKrhiBGd%sV5@qbq3 z{N5MkM)iK4((-;@KKXxtPWgMjXY>3X7xmtbXT$#O>EC84vwm?JJ9|8|c3pRih~YbK z=j+BzYFoT(vcnGbtk2hH>Udu_oWjxsJRnivL3M$SOMJUolGB=>#v;=`o)c5)E#CkC zfCtr8eEdhV=Rbp|@$jMZE%n~5Ekl&Rd=bMTDsGJ|`&@A8~` zi7)N5l|k==9&DVROWL;a>|)Y2u4|ZW{bf^H?`_!gYd=8=MENh3{_YN=4 zZ}nQ0E$+BaqhL|q(-TjC2J-&Z{jW-AMH#qKg`=}0PpngGJ{EGOd+3q%PZj)xuQv#qfAB5OjAe2W9eR7$AhA!&*sBAzHGT%13+!V zS&>Ze8~}g%gww+ z&(@r@oBKm~Pf`|N#j$<*V5Afmyuy=RiiY zN7v*XV$x=z`WNoi)J;%Vw;K(vF!!x=Mq*O$Z8Oy<`PSvKy$2Cb1Mg}OPy0h~*ELBx z-%{4Cu3jixZ6)VDz2DB?@+AMhyXxESuGbm5S#9mtf-CG-zSontHio#D@6*r<#pvm| zP<7-%-Y}Bp>s;(q_1;(A&^OPk_;}N99?#P2rH^aQkqep2_t1^;xljp`LELx2LEPUj zzDX2=?A4>LnO+mVO|!|()rs$NYI0<1Xt*010%9O3BIY3xv;oGrsQzluttb~?e z7mu1G*=7qtyqCgs2o=|8bxgG`sVwDdoDT&aRzer4s{&9y>ZvcFmtp9{E7`s}0 zpSqnLmNL_i#S^^-7$EVl;peQhz$+h_-MW!h*B?I9`BO;Pdv+O+WbI=;Wr2*2p9m^# zWc)sGsPcdBp)D{hc8{T}qx7Z=sFGUd__FBj1E}I-064tHCm~R?>r4;d&I65qK_@p< z^e{niqUE?f#Xo6-hS8BG&?5~2AL1?d;O-FX(L^QP1Z!E)MZqU|9Y?DT*gnbT!8 zr!mz#rP^Ymw(g>lH+>57Bb?JN4P=g=-W*9$3LlPQJ2tg>>TJ!QetntHXWx}}spW3= zF_t9npE2frQT%57w$!Vyp`yh%`Jrokc)p1!D;S%bzEKF6R2RgQ^)`C01We=N@)^$N zdE`-#wKLkak{0>v09nPJ1UQf=t-9kjN&^4TV1IYr>6YFv3~&=SrszF#z(;%g_LDST z5>!pkCAJWl^`V>;uVp(EniDWj#zd~S#dbxGPA?Ro zm4DAZ;TR9&A@)8q?-l1gKAhY>HI&{YIR zoHkNnSKZ9gZKwEi?u+(dqXZA@Blm!CpWddB!G2sgV2a;*F7InOqA0dHJx*OAKD<~j zbR7OCbj8?*yt>woG!Ttbv2&pWY4)ppLqF}S%D_ygf;w|NcJlY?I}?z$%%fc39M&9 zt{WR^X~|{eo%O)ytjT9pVa*Nxxb7Pt@PhC97THeAKt6mY%j}T)4dbVX1R&oBAaC(% zqmX+vJRX#k94b3u+0TE>?Vd&DAFeOOJD_~{I!)fEpbvR%GRWD!0w?o6Cx#AmD~_Fe zX zGPF$5Fxc|e2CF7Qr;Rn|#3`!^=B|&OzqCosnKJ1C3px?Vf1&&{Chht3g2ChL*QVkq zD!-z7f6ncCX@7EdB4j>8z15{i5<$CnYqpQJrkJA|$uiYfF+*-Is_B~)Z)&^cRH7Tt zIvXoD3&kB-lkvCsS00kpJhstgbXIhBUr33}ZY8>3>tv%ruJf9u8w~JP8Gyi^QNgjW zze64HzNI_%E93~znL{`Fk4#dVGW^9@{?TJL(;Az3nbl{N-d~M3R_S&crRbP7MV&mT zq&qcauXWqtv`)SZsEP;`;^0^8KO1wqq%F&CTC?K7&kzL2-QY6x(%oC+WINvs}_gEk)E! z_osu0wVYjq0ocF5(#s)UP5nbf^p&_l2nurVKeAVP=PZ;k@yc+7;Uca|Sri>`%1R4B z+m_ZGw?7ZR3oE$VP9e|=FB)}$b`K39W-+$k#8nM1LASD`aLL5vU;!tpPKFzR&_>sF z1k7ahb)-`2D^976f|<^`5@shi&V|x0Lk-!XGHoN-VfC@1C9sozyv=d|r9~y!zw~sQ z_#2tU)-N3an1{_c8^4Q6AQ+=X_63j4#>PMI=1r|LkCiqEEf-Gnu4R1GE(T@7JcpPm zbjR0Rtd*6slZ`XUJhLUB3x97h>@d_959_f&t7Dh`x9gQ1RQ6xj>#Nh`*`2Jfe_g4D zjU(wmi*A|=Hud!tCPj&f#|6h~M>voUIB$G>Q_+-1yjo>#LUgjv3A$X*iVm}o zbU;rb1}BzuWbJST^+x1WLTnN9CC7n>WtmdX}Tlfg`zshLla4SDdnGc?#_>3yrIZPK0FYm2=zM+wP)5RYIU4i)Q6Bi z8s-#Atmy<(dP&C%nfp&MWV290LJlkbJo?Qvm|Kc&G}gXUmT!gA?(A3?T3Ttkxtga_ z8Keh_Yc++^UXwx4sR&8de5&`TV`L~CbT(o;wtEek1=Ey$Ecw{gl&FrDJpKQ5y{fu5 z3B3xjPizK4G{%h$6s{+PCrv|69ZjKK_RZh~v}>ecCt6cj)=C4-P`$_QJqfd|(s5!K ztO$5;bOw?;K?~HlPC+~Wnhxt@O6uPafeFu054s;E(7IoAVyzG4Qge|=Q^YF(Y6!=w zSR;X`fMtQg;+_XqPnI+g`|WxAKvJWfJ&^jJ*Orv>@1>H5d!OO6cg+>An=lvzsHQO+ zx|V<S%-awD4g>GRR?yB`0uN>*s+Wjm* zu8~zqYxv=L<)cxRhSSj6Hb zAw!3`xWRAWF3OCb0Dxn<#d#<{3^Afb`HMD>D$yWNuGhSRiO6_P!@X!@@E| zbZZSzB)Jw(q-NyV$E=;{RCz4Kr*y+Xr9cUPiQ$TRX~V>pl^%RiW`WoN0xSw|33uS&Y(g+03BIDGO0Ax_rU!fT-La7P z$qT#^YVq8wz4^|7T2bX3lP`exl?urg!59Mg11z8Vr*I@45QU`Aj#b-mZBoMQeiVA3 zlc6)gi958(Og5FbY_-Fi!7PtK?l&ZIpc*?DRwYu>hleS&B48L$>>L7^!0RAU6KKj? z+6FS2rdGf%I6cLBKP=SK@mJks+54}7?2P_X`Tf_Z4{?`Nj8Ust(jY0Csir#LXOP*1 z#_srE=lxx#ii;~~m+(LPI%x16s%XK-5~JPGt5CW`Ln>O@sHD0>rX?l?^a`lrk*)@f zQuM3Da|oFn{)BkSn;hYaQ=zew<0F`q1fk6VV-SUiLn1IoNSh!2{=>e%{b?KF_7h1{ zG58~19ZsU`H~w~Au>31AU;ZZ4B=Yjy%psKsX={j)DiXW7-ceu4AfqYkg@`irqm23x z2n0~w3^>`eiXO*H_PJC8c1KyEf@_r|*1>b+JBt%Ea}Kz;|CUb6x=(SF$LYp7LzECm z9mxHP7yKPVCW+EbgkB_hZ9SwpUMeHISp_+rbL)emU;RW|N@K7kj z>yQI_XcJ-P0{~&?>)OK^+&{42v&%xvKOguQT=77`NZ1!40~&IwDO{2xfo49&AX6CE22o#{h_z%gP5&=Hu2?1wo7_n>yWkvqj6l>%gIr9IH3hFrVTBubQG zGxv;#h5|h$qMCW*^k9P)8?0|

K3C$T0INt=vj2j8+rDOW;k=WB$(wmdmvxdjF_ddXbCna@BAHzsvFl0z5Cy>ffDPA4)H!m2<0`){xnyXU|(HqA*o#FveeseIizz;{tN;fZa?Z5NQNQRSe>MPsg{y zrnR;qRI2mIfAS5)@c20I3$FwXZ}3GB6RF`sD5jPVI zP)>L_fq5aGIidQT-eVs2%Ys`F2jOAN>?ja40&!Xu@IG8{g}42#IH(hlKEFeX)VjmD z)G#~ze;Fu(FbIxk%0?myO7fvu$?^K{1{?fH+{j?9^cQr3xfq z4SwT-@A=Qv)odUMf{go>#>0?TI$g(SzCYt0MyOET1nLCWcR^czBa!gcF^c^Wd}5$; ziNp6K4+Nt#3V=Waae1dqS(vmRl8axO=`}YR2=E7hLusg=@E9z^E#sv;4ibR&2lj(D z18k(E&LQfFHBBPq0ZH{N^s-(Ne9_d7-B+EU{xMl;1(FD-p#?rM5QspLFk?!IVtUYA z?<_YUz9DfSw0{19Qd$D@^4ZwXt%Go+MFNcFAZX4pm@$TeM)?ZOjqC7ttk6F_VjvR0 z`urJSN5vu*OTP#d^0)Ju{($y7kh^eUu>ATq6nFlftBp>h^!sz8ov4QCaMGcx{$eid zk)HGO55x5wa!FYj;_a^gA}rg>#k7Q-T>ugon8))6{K`oR7i8}+!gnY+irmPH2dt!1 z3tW{v6Yu?*!H!64x$_5)ChMc~O7xnFa*Or+n1X%Bi{HL;nH45c;>~aYI0U4;fhHJ< z29dfbGs52fNc0?C1ER-%hCcchrhM8xf4+2e`Z^G@auy z{Ni)v*`9ut@E{11yVlmLzFAPJG5$ZY?lCyipluUyY}>YN+jwFdlZowQV%xTzOl;ej z*tVT)-mS&=?f&mySJ!=4SJ&CcNgyV4F`~8Hhj>wQpdp@|6q%SV; zKbV<}h2|Y$GItn3CZfA9#C_^JoViTUw{)=43up?i{U@*@#b4?&Mc}tQWi6NhsUr>b zHFAMpcLZ$&HwC97hH+FQkS}=S$n2LY=%6tZAjUW?xd27wNKbdd?A)Ygr97D}2jfLe zFR-xmW34u&gk8@P=7dgV&!{p-*=+bTZ=@*5N<_BYQuD=D<=43Uwv2}Rk2x$qX?7%P zqI^$v#0B+Yvr&RbGh4VNYo2k7GA_D5EY`$Aa)yS|`4Xw5eA5Y{P#|WDo&}6}VM>4uxIc-p`5RRY1f ztvQPVclp3(eb+#}s#l?X)c1cx*nv#_{dR}?(vhsHt6C0`!4Mf$tsxab=G;=CFF?sf z%DBR}8z_Z9`Qq_ZmJa~I$AIsmZ{c)WZ7OOBxQ&&U{<@arq?!knI5i@8aJWL_WW&OzSUt zlB>ho`;8Twr3isJ42^&qhMfhIp*)!hwEPg)RvpA(`ZS9WL>QG;W!tJ@E4Uv<{cAIP z(D<%*e>6p14_(v=YB#tP!Mq+Jg&Xz*?}s!K_(zwLc}A>GN}B?CLW?a?lIa+&b_0#~ zD@K&%4>1^~)Gih}kCGXcW(2FdIuo2c#7YsJk-s1j6z~M#42UC8#0iYp3rwnER%lee zcL0WFKuShB4H(KuAKgW13I|T>rdfs%vj$5YW6?f2}hon(3B%6yLSqEX%+0pH6?yNMGPWTVw3))eueaX}YqfM1COAfLdG>C=5H$ zrvF7Wwqu;xey+_(0B31k)Ke21`!sGo9^`ITY^LJf z{gb$y-lwAj6=Zp2G&~`$$PpeRnphz3&>H=e$MGDcF5ox=B6{RF)&n9E&s#B%_7nUCNrH(RQqQNwp>O6g*UDbk@deJi2 zTH!M!5osAkDIiL=N>3S@FEEODQ~~$o)ic9{e+o4CKu{_ry(P*@g(6{ue^iX{UxHAr z%U$xIZJ8n3G0KIF&^^?P!-1e4aIwlgt7B`c_3(r`9ork3XKRQXo0G5zp{pt)Q`@_o z4JlP*2T@R8&eBhNs zO8BLEiRpDB3t;;}&Dx$w+rHSR)9u%%WEnku2|Yd0t5nO=q$JJgV4qb4*^64L!a@aV z!?sF?hD`Qv&r5WsFIEt~1bAQmUfutd!<4=YJp+5|G=s}1GsvmTmuaH?(Dod6<-P4%&uhWhgSJZ zsz?^XJuWtj6g|q^lyrXjj$Dt&1^-;PT$)*3m%R`Zb0p(Rb`5i%6zkt%Z4ymG6^}+5 zhXH$(_z#c`u73T!3oux?+EWW@6P){ns4Pg+qIY_R<~)Sy6Jn;8G>5DdbOt8&HcTjl zk83)Inzk`h^uBt8t)r_P^7lWU*-ZMk191@u|7pwL1x;F97WDFGeDH%-!&B`Xd2^jig#12L**KlIPBh`4o%pr|a$A zujtDjco~VL9+Dk2P9UnME2;}`LXacbt4NC~aWK*Qm%m}4E(N~5W!VQyW*k%uwgd{# zF?X*H2}&7I4>@SN_%a8KUvH&7pHDNb8r6`2OORy1AVnLqL7;{&z&ANK)qfsf1x=R* z``orb$(E>yzdR=xl_fy&r=@m8#P%b{jLebbP z0Y-GQt-R%K+UE8UCQpZdB_KUZ4qztw48I0K)wqQ@KT*(M5_pzXy+Rt|?#XdRHN{;e z#dlvsMCRQhCC?#0Mz^g$r?SJ-rjMT$>c-WIm8T3FiNqph29QXb9go=%0dbOP0FFle zh&(hlDqh;3z`J}t)9bgYD}wk`VSh7vA|QYuwtUIs^|I-bp~{B`ut7P=3bsUiyufl^ z5EXZnA3&~FTk%7{7~rp!>ncQS6lV#g*XwaLR(+aH9MZ_iZe=(oVI;)wdk)ohygdG{9%|U-#b%)KlOqVfbJ*1d$VyWxgZ{dM?rgfbQ#Yno7iUf8X{j=o zcAVMA?ALQ-r7_%q-!yR>p(U>m7L;s=b^+ zqfa5HRa5Y*BKMHCEl};!VDe-qViXnB*Bq9vFB=>7(8ez)o+pqG(~Nv};pR**-e+{J z6FcF$-iK!IRzHRs7t^2bMuH{J3^BF4a~RQW3X0fgut&21vVeUBqgSs!GSNFM#5+4< zGXO{tg3NWblsbd{qnqDPLa(f0Cwoc2kuq01fl)lds%A%JnZhKCLLFT-6Hv%=;e6BF zf2I19GIjDx^RJb}_I`1~5MTi_kAgN@bu3<|9n?p?%)eZBV^qN{JVwjN!@Ugii6BKIn=-rWK$6oneD0VpH!jQnZulvO%9tW|0AfoCM)K zWpyrQ{dPzzXw1R0`Cj zb&_G;^t3eU5*1uZ&WUfJ2dG)p!X}L-fqcaTLuTuiE8c_vGM=EB&3$XANO&P4x(VIK zC=o`x3KQ}5koQXOAznqF2G)zewAQdnw7Z9Q{jg;zL|rf?-fuN8s=1j3%&IMU>7;vc znjmTuR98Zoiu0yaOe20{iOPS{DTvWr%Ykz*4&M$=fZlHouZu{sUU^mOVfbjAC5G|k zAGyye@>ce;V{;U@?!9uQ_hYQA8+@|*B9c79I1Q3BsM^rh7Wy^BJUYP~6i;t4ZAlUu zIcq#yDqWzVnZaB{M1{xAS6k3}NDgfm!N*uOiIzT0mdXvzojEJ@|dLH`k3|I z(c9CN$o1@_U^*+cduGpo-Ns;R3qHvBwy=(+JI7hfnR-=)%`0>mxYg0LG;lzwy*{?^ zYl$Nz1IMpll2!TrK7i$uPGH$oDj!2XJ}Yaa=Dwtr{f3XbyEc$kONbiQa{W_wdx(H7 z4HHLCoj7A<{2RTyQVVP?IG?80xlYCNb*hU6G6Ok#RjIy2fwklKk{nB`#q*Egse|$w zzgJ5e>T2obX=otXJx76iLx<65vR3}2MsYMt$vNsd3a*`lKoBQK=OwXI6U2IMg5I^5kS~CTNZ#GUuJ1RHvP4SLm}l8#*zLaP=u9m#3(Hj z0tll_-Q%9oA@Q?%0MA9aV(DFP-yPh-ug5J!S`b~{CT|$uPuxx&Xc69COAp&On;Jam zi&>CEN={11e?SIq66pc+!~57aa4Bh0kMlBU;^at3~z(#?b{}O-qem z5D_L#OZvYKC>E41=rddZk&RV=jLC+wz8z6VtHtZJXDKn^>?c3*HB}Vk)jq4)0^i6e zLeb`|tVNS41lE-dUAOL~72L|fPoMq`dJd!lB!>gDt2`$?`I9avI{-;Ba(hz!w(>1a z@yDl69~B0h8H~*l6LkgnT z9_0@%Ww@5h7SLW=%(A35t!A^zkLkU1$Od$OKwhO`J>U-{5k#CnI;Av%Z(zQ6shHu1 zw&^mQI(1|~u4-3nDQ6j++W~^R^;PsbqG1T;qNncPok++NfNbLKgxIRK6NH;0kb6*@ z_n3v%wcT}61z&5(2YCy z^~!V_;|L`q1UO~b}EbXHUFk7GKSumubrXM@`#G{%5!3-X*z3`f>UF zlTZ78+nn*E^Ya)T-u|BXDXT2q{(czQ{(M9f{5*UX{Jx#}n5g|Z)qFoM*im)sRT^$@ z?JaEewF!$}$!YY&TB!uNYAiWC?`&eeS)6hx6DrxbS%?izuw9M4$I$x+&7BRryZv#a z9l3S>UvL`Yzi+{-$$b|%ZH4135>=l}l|PiF2#8vv2lt?CN3bxUYpEY5O%H8;2JWXv zdNM6S(tD0i#Lk75y6En@KlQV$ZhKxoR$A7ymoT?2ji9GT*NiN9-gC;sRw4SOR-@0o zdV^3^3KumPOzrc9g|VZmWr^`*esP$Q7HSX>l~AR_m#A|35B4c)c9rffvaBLiKN+-m z{R+lg;8}j&_tRR_YS1d)cC))^Pxv-dfvdpOl7|a9_a4=-FJ4^pZ%%uUnP@krVBhvH z6$AWJ>dmVW_b#{EgrDkeYkpYY0I8DxuN@2aYgD%tD8D)5L3s)qWDms4TD9-PA^p6Yb5W^}igjOlL|0TMo(PC9=3<>HdtUs=!r=API#ZzWLztAT zxq?$k_E>w_1N`M}t(_&@-#k8k=!OQT!P%6-8p%$%lD;a;j>T4p?-Naaq|5(wNxBXc_`$y=#p$b-sU9(c3elC#$ZYXs!BI@N0yLiJB^ zQ_(0<23WNk9l$aKW?+mnuj}0InE$*sZP6Y%_dzoP<7Z^b4g$nC)VHs3@x!1mE)xF2 z&^T6g7w+Fjpq!n5-e~sdfV+-xCE}~-qY~Et@x!F;E|+-X+a+=}V zNGXK#$UH@DUcTNcYN*ereW|er~b_d_9ys0+K3)A3SSo5WZ2CQ+T(IB87*u=q1oG_8~Zj zwyC&;=TvawIU<`GvbFp1%4mFnqMK2`)vb9PeF~|mWzFLQk-L1y0LAP?)nhna{IFZQ z-ms09?2%GhAB%K6M?S}NYogp$;6DK4lU)y@vFSe!Rg5LHzhK@<@+C8)%d|9Q#rbsr*O+?&q@!FF^UY{FxJgkur=3OC!OF0nTreoNiaz}6%2+w9XN zwGxbo280@OPP&J&Bk-B#I@P1SogOW%x3gGAi9JKZds7t7&H@(f&6*J%T`jYuxQj;z z3vjRU+H=wtJw~z=#DpPlZFG6~`B0r@>H!MX1{DR)4~n}|#j}PkkM_9jIEp8W5ejT7 zmKh0??HMS+aTmQN)SBBG@+03F-6uG_8!}}@mwR0~cioWCXfuyaFlwPN?p#X&kJyDu z>K<oG{6dSQ zPbEF-Ol2ew$=T5-M54bpDg}MQZF#8eL-O=9ZOfaMG zbW#!buD7`CG2L0OsuzV3_2JVbexE)=3uZSI4p*>RRfCD;RQ@gDdI_00JwZ7x8eNe8 zH9yd1Qo}Y!)Q6GNE=*7i{YuB2tU}OPTE`MT;j^9^8nL#U)O;L^!Ms#IJy|+SYlM7# zcoPckII@uHnVan@H&n=6e${nOo&i$WvOmg9p{EaT5x;-;ik9|N2gB?_ZOvNWA<(LR zmN4upub1G2RZd#C!y=2r-1Dax+@ zyILc{&r0U7u)deiOb7d$$ZQY^_sSB<&pzuuW)-C_n+^`exipBn<;)e0w)uyWb|@wY zj_wCedN)3Oub_oBi^bb{3(81q?G}X+lTRQ0*_73{kncx!5t?qvyF>pL{w6lCAd87?D?h&ktmg`g2w}ZZl zKk*5!V-=iAWxMJ|!WeonK0Ae^ICAsufwz!PZNh)Dx))HwlcQt{@tZx_o9y zU?m~ z-#|JhO@%jl&O@n~IrxZw68^#?X`7}vu#72q$`suu9k7;1@@1ZJf?7Q) zkS_m%*F6GPbU4L(2ne}Gc6)PMv$=VV8C;^|P#8`*Ke{j_Lb~Tbr*f9her8j(K2fW5 zI8~~&vMNm#7Y0RNOxfg}R)~3w`K{1owX14U#XaTGpC6JjnvbzAI5**t5{|+gd+_$w zIALJR@fHk)Dd0U#FZ%VDZ&5tLN^(t!<7IfMAU>u64Qa3SJRQCZ%W_r9iR0uIs9}hI z%7N#kX$G*5@S?Jr-G3Cbh;IJH26qbE_6dyQH5Br{GM9)^^CFj1LW3CK#g#bL z02~wbCf}_}Eo!MFV+e3|vK!7D9FQJfw(b!{k7#O~TKHVr3g)mOjBGIo(bW)H86JTV zwbFLT8|{sPa8|{;uyBKE=tL$9JGbdxaYd7XrDlX6uHL^ak7dmfX!f zoPY4`E^#`}u(`7Bb3dW(7=@E&tME{j44h?`xk|VDS#~GE z)qu~&sIH;YJXB%~?;-uDtPX4P5AE(!#U*S6eyz}56Y)lzAXn97di&|B%om3m!-=Co zoEJeb-4L*U^s8ibGrpY+v>g!wYia$xedq1fP^v5NUl&2=ZWos`(oug9E)p^O7vH@v5nKs_dwNw z3ly&A;#^Ly1Um-x_e9F}ImfA0-f8R|8lF&58q&YA{hKu0lJxc5xgT?z7vM@7#T zqAW~*2l`b)<Z%Bg71CGi6AkY=w1sRLeVN5BX4xoZ2+mTW zRjeLISlQbr16ETuiIIQyMsL!ghwqB1?j*@V8wsAeGu#pnVynqO z%#~Y21D}5B=FfiKNY`2xtD7q!B#p>h0tyXJgUbIuz} zF#g<2$y}UVXUuDbR>8S6-fjNh15pcj!Zqt_Jg;3*96G`u=*#{v5c%&@S^<3QuYQw7 z&Xpfa793apr2H;g0}n5!onxid$|SBC9LWyjmsTLOh+#7~JG}xA9ib5<+iJ$q@0YPm z5J6Ui&gnfmDCh^oNrvl3c_Gx+8iPIhAPTCTEA$LQG2-r5W4h;Hb4qvEU*pIz(U9^x zHDD+-4qf0{#!q)sM6&)xXqH9#QV|Yw?ZwyX3^?xscTv!L$cOTWWKaq2Ny-V9hQ;KF!KXa59^RlrwI(5mGrET}l6t1W3&{0u?BH zlwZ8p0iC!B)nOh}*9fg8WRe9C%Avg4?NIe?ft~Gp4rRqNNs>ij$;)81nb6~& zqODpv@RAVl?Ji176%IbSr@*NlM;wWHK+ia6;|&G4(wYaPwxpLKo6o<(q;&B=VoTbo z-}^aEG)6dk7Q|Na9Orz z6z3iJ=cMMO6YzLE7>{K@wLNNb6D?;`=O>d!Zso~b0t?Hv44RC9utaifP?eC)6V|$d z(%EEHW$f|-6hu13llAiefK<`}ld`0LhfW~UGyE8J2~i2SQ1sx;Cg!@XXO`buYI-?= za>G~|SHWScm_5G#pli+xBjwB?-;Kf*%x24If&$_nF<^#|g)CcoT|%J5RGR$!MoNXw zIt12t?LHjd+_KW!YvTk_D-pDJ@8>bonp{cW#9werIJ7a|cuPD3FvHt_Lo1Zq!E74f z1hfiy|HJD@mxn!fEQ?roM(MY?I=?O0Jg)nz0*M2Twn%4*Xnh$m;Ho#N$T0aIg)C?C z-n>J;#nK(ANI`S~-?J1*7aVQK!)<%P?ve=fR|K?k#t%TYk0=QfZzr-1pYzZOO0(&r z1$BTbZe)fgaJL=!yT5ng%FDb1dNgQ?Ku$0>+}_HXeR+zGuy+Upqpv(z2Sltl?;&3s zuimn$wuI=svTZ!`)3nd20NSK+JEK+4X3aN`)!t3B z4qC5Wd8$d!FS5ibu-_K+cLrS6pB6*vpar?{%_fN=$ zflw}8r#e}XMQuN2PL7bSk`OQ`rss7g{d5;eVqQPAo&ZtbVTX}Gys@U0&Rua}`~tYo zeOK>a41xR<1ys$*9#r2jwO4351NBG+U`#~Ln1W5oz7YEeAv7L@tZD5ytjV;zn&USu zu3&k8>%!GoABM5;2ze?tVGb8`h&8YByRisU%7VDjs#_u8)x@jeh-^+lrGHlW9?N8t!7@lD5Qy1lvrf#ED^jvEQ? zZb?;A>R^Q_ijkaR~eDEn5Sk-P>n#=BQ&y?Lbq zguci<7(PWb%+Y_#d~CBuzh<1tqjWH3`)XB}4->$igL~J(T05>JOgEoGU}d|;4tE+! z#=%hWPm1&Dq3NT^;d`o5&@d>Vl4pg- zQC>74=)6DrFrVS@2VvWhUjOCJuE*Xk*bbDt#$psSgocD*`)Z*eet5?ir^Pu4FkR`r z8&T|a?!c1fz>zq@>P4Ay63G#7LFoTYz&D)!sO{BO&KU`D+qpLv9PMgw5sW(%+G3F9 z`57W0nyigbH6$DjOm}Z!Ch;i{6Wf@!2!y=Nh1AuEpWHp~k^f!TnsQQ<`J;h^fCYk< z!{tcjGQif{kdY#$iv8-b8=e`M9jf4(BINE7edxBa(h)pas$myjJ@5~l*ms$ACd%zi z)#;?~$n0#SX2H#bRXE#fQ8@uM?hD?Zo<8-|GEC+VxSDaehn4$HCVu)cn>}%+mzN*p zjhjOzrj)O5hcHM+#Wg6BnG8S94CY|>>A5ap^AE%zetlLEmldEPM^6!-{hRkdYP6-# z6aEVVVnnz5sa_j@5H(X!Eg#-aQv&Ti05Ph-(=Cz^d0HNdOqyg5FBtgz1f_0;vihjX zW>fA-ID=8pT=1|NYvAM1Se*ZzpD62V5l^1!CRGhGA_v5;Bb3GLrH{ zV@d)+KpcHt6%W%WF!@?=WNwz?hXoNQ2L>z9P3XUKD6E4;c;#^$NDlgxKq6#>4+?*k zO-`bFWp9tj^OW*oVUJ#*XYAW5PUAovXQA##&3>P)d53ZfGwL=ykYVy7AuzBT=`tRo zAvw^6^n>nTB+eG3PM6JwEVwbTh(f27n+Xzk*{kx~7=@bp2h@*z6tf0wK<{t*VK8@j zkVfW3dKs-HE>-g~RaAU{c~{*ltOz;;f3m=MRruxmHIe%Oeimeo8y&Geoi0^!u>nfv zKe(kR@S4);JSp+Ww>rK3TYhCsDEd2!Cl3tc~5A-8MXOiB(hmIU}|FCl~2RS4d z2K)L8I!!I7V38o8Xy6sYb5hVJ5SY+F?*b{(cu9G%!% z->+Hx;^G(R(^pL_>=UYeVLA42P5eq++kQvRvXJ{6E!S{rA&a8*PTepP_5eVIR6Ydw zKse)&eJj`lWDt}GZ+YURIcsq){_$<0HGpl^F>o2evH*-Iq^P4TR~dV0OV83nf?hY1 z=A%?BQEO;KNmm1oW+U>f%yPoNYd*N1%`F(Mt`Xg61I_UgDRIruN(ZCd%LZI z-8YiBrR)>R5=&^jYC(B)&G8B7$YGPYkt14Zt#E)bRUT*3odW`@uBg1b#)`0Xdp7sf z_su4pyq=w7KDJ0t^Mv4ySON4i#31EC^a%2;n4_ZEQ*gbkZzG;miqI%?+nA9zd+iEL z7b&~NrVl5dR6WbVil{+x{u?p$K*>;NI5Sk~7E4Z~+rjqrFnM&m%>5n!@_w~w$K5y}NXL$zAt_9IOT$lk&| z`Y@#ghGS0((96nGQm3@sA#s;Eij9$(VS&Nu)FST(79ISZ_WGRGn z2PcLIfHtl@VVwEPSY=?1M}aG}D_1SOxb#a8lys99ah$?f^7>9Qp->yTV}>&wf`mt@ zPE47%LB&ZOgo;_S#7jMn)uw#sVm2iUy3;)O@8XR5`ZoO$_F${Df1I0il<^rdv12V8 zPkTE6P#ariKJ>h72Z(UnWv*(?8#=UV6LWmBP|`Sf;%Aoa!x;Cbt7piI2!42opHZK}TZdNF7 zf*=e<)gLQTg?M$`G#{#2cH`&ENxSUM%g>Ycyt^l zPw5y-88awPvS3`LH-#uG*E3xQqo53S9Fj5Hy%R-Sq&-I`ii)OBc^w*yIN=g6cEgxe zrqt<7X;gw9{gp_*Cha>O8R$oG4P~@19v}!2y=_d3TaZxS^wUTE&6YVV7V5HSG@Lm) zfzY$DgDY%C_WcCsrQQVj5=nfLd!TGm+2l-H%DDmURBblaA@fLry7 zcl-@T82a!Yr(|V8)YxsSVujbJ^**i9GT9{kn_uprHMaEiRVEA6Z0xM~G&R}0Sf+r- zqK=LkiTW884|;combT{1rg5wTK?}Cm6H)6@KvONzjZm?1tZ+ZG6aIJ#pwiOHtQC@f zg8~th&B|j}Q@(&R?!0CBf}pOk>9vR5A4xmrJSx1`6`kwSQz6iWdsIBzz?qt}vw z2UShjz+ecYjpV4W%ZfHKLhotzBkaZ=0GMyv7;^+t%4#xmc4t6*P`o3COuG=;Zhlf!tpd*xu2&f4_yfg@?YqFFadt1bD(`(++ zGXLoxhShqdZCk?z>%7>+lj>8qvkPQjn0```_`ILC;P?-*TN(QeUQzd<0TzFSpte(` zBZ}u;KIX@@gO`Ch;vXlTr=0qVlrP}M@*uu+mgix)hr$1y$6m4V8nC{|T6Kl(W-V`I zan!p`pR$lU)1&M#2vDD%2Tl4g=$+&oPPXX~I}+0LdNnLe=EmaO%x_1z;x&)xRYC`P zr^VlJvhDeFmQfuTFHeHv3i6EJ9U++-|2Gd2Ptm?7k_R-WQ*{oijJHj%BC>0;fD0V5 zc6bGZN^=0J)~;LXHfU3>IO&4kOS*L?+AWQ6_&w(J3f7E*sluAwmK`9f6MhH9 z9(}^itFF*EDaH}j(0d>pW`mS09I2~C(ETqIyeMz*vLMI}YMFN^Vx+Vw>IU;$K9CXmPpT z8=1!jVwR@UQ6Bqt!C4vWdRK))+)jq9YJyJG6vq~FTF5WBe6VJq6N;5u+&S&|F$z2x zcgfXp4XI;bFQ#1!{nU(j9|iY#lz@N7u4Upj)yaKK@UC^i)r{bltUf%`pYX5Q71u+p zCkjW8CzYegBu~>pU&35v;tw5DLga%3$20=8yV2FQZFtx2@-9K0>joM{4}3edcpXWL zx9D)%I{LVmoOi4R=T$M%_k4&v7lnByU(-SwR;J&2A0kYG8q>9zUQ# z)+8Sw8E}Vw;w1>RkaK}S!FB69NcHdOu`csD6MHsX+P9r9^bzCU!3EQ?VQlph`%9LHH7Wb@!8kg^n9Lj#D-AkxO{9BM|hG-R_eN zk)>@U^BrLLN4{{`GKB|#6A8tlT&frBq`0I5`G_w#s%fS;*chX*w5+0MQsI69nKl9>QWW~*;!>#~+MI{B#Hcfnajjmo&3p7{w2@RJ&yvoVVW zd!m~rn3u*yopAW&8^~W&h2v#;?eTA5Qvi^|5k=s_x!OyBrEym4i0D<8nf{N|n_<;t zw1b$p|DWi*=!L`PAf`NJY2*+GiHk>)TDP1zo}s#iW^DAToT5!+0_te9+s0aPNL)nP zg@a!!i+3XO(ja|N9Ql6pxsG{F^NukuLf^k3nJ9(nxnq*^u>$r!NT*=KwP%&t0N@h5 zA{lp1l>26h@T=KB4%}P2s$ka=O-48J)G_SO%IP}&N+~d`V5L948$^%eT(H4hA<-#d z&KvP0@6Uy2L6%-ol|E(??2QeS$E3`h=F?nq1`(@#v?=*xoF-pCjK7}8AY71C&Y%%Q z31E8D*19%`U||c^VLb|AyLCz@S=)>HElo{nQ|Q zU&tJUbF&`aIDPB&TgL67XH@c0J3t~8W>mz5-t{p$d@`t~DLHYZ2>uG65{F5CLCDxV zL#yy_gfWwz*5Zsj8G7rv<^yRj=MXh509F4cY;IhHSHPXLD(LBA1qj6YS0!OXoJsmg z`vJC!9vcr8oQTH&*k8+FV2lgBYTfX;#U)YvrBT?wH;h2{u~Y1ZKl1U(8cSKN*mX^F zC?v21awC9li8=XZsUIJ9Xa*1CBVP=|eVfVW5!D=`6!XCTI(-ZNcK}Hl***jG2Y6Hd z|A05v{{TqU3G%;#n2C1&`7kPL3oWt}_yOMl|QMWbe8C{i2>fx!2`*#RXH)Y%6K$ zT>_FyI0%MEpq#X2)se~pqaNM{QG+z9GR31_8^2_TV5gukK*%vB^!u>BQ3f_4q8QlU zGKAiO`iA)L^HLQ1TA==!6$;h=i@34aXE2QSxChHJq*vSyZ-oBsR=u8)(k>y%%im1rk)Gt^V_2LTrNiL z$B zX)BwX<`c-he$m0H*cf0W5Uidi*4E3kfUYHFk2k9C>zsPlLCP4tffv0Lb82MP%}}#5i9`avUW0A}-hMlEzSNhTl;TH% zpNxbcaAZQ3DFlfGwa#$t(=R(}?PZl_xm7>`uyl>gDxjHImYMRlwMkT(ITho!r9Di= zj2sahts)_Y~a$oj8XghWsSb-|+^UOP}H`j*_E@KJUk8 zrd`$=m@OKg;jy|?b}N2s;B?138i44!ki>v(|FgIX@?CikB0w-La@fpV@ZzRBXF@w% zq{IzE5e7%2RPn*dzbY~XHO3l4bnp`BsB^cRy zz>eXKGUVBd96vJh`VEYvo_&Atbf>+d&FwGb!?5LP-%;dGHmM}(LfCBfwexQUDDHsO zNAZrp5fhr^q_iiIze%lw5asbGq+<0X;bm@W0mV>EWe3l9bH+;O6yYu@4CqN5DyGi;=?jwRRk)b8AcI4Dv4djQK{N9G)P;8Tx(isEsQ z-k>(=f$yL0KaYf2Fz$=QA<~o8Ldy%yDQGd=oSd9=d|AETHx0hO-26T{{k&c}48AW{ z{5~IZzqfa4OIPXgELmk!CbH6ewsUnS72ICmQ{IN8HY=pK^ zg-{{LsRF7pU6RLb%c9zLgSSD;Ee{GV`O&)I=W|1y<`6{nTppDQEwdHnw_SWxILx?{ zTr|WlXAfqyepQIa5DBbn&jtFK9(1iWvcCT1l|{*A6H%b^)P&z z9(QVYUmxd6S&owAY~1)>c9Pm|4iR>^m(;f2@YuA7oJUZ*KEx%)4Z zba%+n;qPEYiv5{`l~Js`6AVOGPI8~mdfEXhMgk}&efh7aeVZ8hd6`Pa_IE9}Mf zEBOz2CSS&h6R$SYfyzlL#wfd-f9tvL(e3MvIcL5IGmqIr{|dstFx*$XUvqK9UV3Ss zT9AUk(J1`<;yf4?U&=!14wfRs8blD^rjD~rRbzyeEBh1AirczTzmH;1D)i=HsJlHO>Z-$foRW z?OEThAch#L7`j-@vJIyo8xQ56OqWfyFH2;P}TtT21DhJuXIQg?$tmYiXuiJ zZJ8{@=ET}~S(OUv-J-KPM0t@hqdNB^p&LM0$0yF=96_be?$qYHCPK~(S-IDKQH825 zm1lf534(-%@%jQGFiZdXN-K2=daoF(c>@5I4CQ!oxYYbBIgb=**NJeFn)EyK*xgqu z0a*evH}LBy0(vgB#ynOdGz%vTAok4}J4|wCHHNuK(3&kWB16q<*g4CcA+dS;a=sG6 z%UW+f3vDlN50slPV38lPY$Wsl@(@l`T-v_Q(A)C2qgq4r?>4A5rH_j&fGnAFwK2#7 zpXbVbAHbyZHlDDE+XC;F+17VfP}0!gnmsr_NSyfCe<(kSlDFSGy`1rXs}6bQu8kJ1 z=|RGxqaQOpyoT@>#9qR}ok6X;M%)>iCB>>`;OxwlYvW|)ukz@lyzHX) zXVx<>nM%Qq&Sj5c{>d247U($%sqcP2?0IZx>fWEPPZtqY&pny3RXhAw9cn5l|1TEB zkqD7cu1}Ix%0x(CiU_B0o?if-$!AzRouVDys^da_RiwLqA_Kz-Z^VQxS1DTDC(cpT z$@h8@k>x0O_${EYF4SA zYG-iSeYt53E5rM4ilD&S_tDELG{cMMJtND#qVc-F7yK9ZO zJJnOsEVP!hfPhKA_)l9acl$F6&cfh*k^o^Iv*IHGc-jmwbBS2jn4tW!8wiMEULkpv zJz@W>-w{eRM}0LXrtytS%&lfeUxc~=+2&yP7mGt1I+)4#YFarv^B$&e!>8sJ{9p=o z^%z=?*oJDi3HF`0E1!4KH?Lifh(nF_o3Q_N2fJiM_<&u%4`;w! z0gKjKVw#XN)q6ka2aUYZ>2hrQ%OlnG7g~4@7d$|`WO9zbeAQHgEPAx6@Y--DCY`j~ zJXt8Y1X_TTeiQ^bk@RZ9lB0ZUl&hf@9KSRALKdG}CBldPK@)(Tz~^r7{Ob1oRr>u> zdPlefUg~FZ%y_uIN)4UzYKt#=D3YV44quj7!cA(Caj%qJ3F1WdR6XV)d4fOCxvMMH;=;!&1!Z>^slmF~C<7Zvl5ki?H}V)wBKo ztDX%UEVUW30_Xo;&%fZMCK)K_PxaB$?Y0hqIMTs5p|MgStx(ZQJ}xm%)mUl+9SK}? zq~1}!u~|T3u`_`Sk{@@{coJ26yley1QBlof_0?A>=4Dd~PG0)|sArcUlNhRRN;6)M zM+GOIVY3teTqJe?=KDzY|YXKq{#)|-A2!s{HryU!5M51E^1F*ObzlbR?2o^9F)#F zo9UsvG<5qF#xLZMZ8}pKoNV3 zoOrro>yahc5$*U&t+0S0E`>Vsk=(P7W&AjOj6w0kDumD{)hD&NK#YqBTcQX?)^Pk!9#_UFV7eZS%oh2)C>=WiHfqE9J^7 zqRMJhuW*0bn#6bz`S;~Pe}@k2(iplFagZxoROx!woE4n&SPl+wyW{9-!}FVc@uy;NNHKiIm*;7X$RZPc-C+cqY)olI$mzFxtbN4_Uw86${y~N`m42 zcSQvBQyL@e5A{pwf5~U9|0AD;?!i_6k9-!6V)!5VY~hj4+JOf5rGV$bmW`>Ug`u0T znL3SCW~jJMTTW;s1~Qe7m}1SlYM<7imdajdUC+HUWE3ZqqZDY--?pwqb*%gj%(yR@ zUss()j+xPIuuHD(R)<+rL$&jMu3mGmJ#bA}_az+^$qi8@s6m$=zNLC^O{gETOAYD- zfO?wv5g3lajgst_i7AwvQKk@zR?FR6g^I=Az`_!;20 zI@1q+#-W;oF#q!hpt7|eYhave6P6{)B4AvgmGb0W07WzYE*rA7Npg!Gu*x}a4)@!c z;g2_mPw_((D^&f+w@kliP7=9&h*PZpE|$ST{T*hr{zd2whMEqt_qN-`K;&i@%zds? zWP^S$UY+)MP=Pposo5m+G=f2axn|%Mwv=)m^v@b;zwEn_l791iNt*g?m4@1P=fCdU zU-NIO&*1Oh6wE}fAd2y?HibrpU28-+0bb`#!6+9JW5Or;sk5Nq% zD66ox({STi>BTNgo`yY<*}xaa2Vo>a7B3<+l?VqIm;Qyf)ol=|7Hn2M%NM)jk%6Z# zs&m)(bYq=QnI_p`rNL2<=v}_Nl4(+x3~~Z_|G;iE&$(qSeV=PeZLU>y>SRt4b?US> zhj@Cq+ANeb(CA}1P$2HjyFt}di(3C*`V3L}n*BfYnWw>j(PtS4a*=vlhRGf=911C7 zN11Kd^k6<%50HaZLs2aFsI-Mgt5|*+c~aqZA&V0!4`3Ue!h;}}H<`g#_U9Qr)Ib3b zLKO_&Je<(^Lu*wBEdnm)Sq4x%OIjMjIVqB4qp)plxZv z^yN$NC6K&>#lfz{42>fiXd1<4UAo@38jb5>OrP7HV(fAuyRw#}=dG-ge z*#hW6XaQpJaph8D{K7EQEnc{^tRiKDJHwk~L!zVd3&p4~s#AF)G+Y$K(wFo9hkQo< zU-DVff8;Y)zW=X$X8XVLSxv(KA)j$3*6k`=3!^7rARX$Aye<#;&LOH9?RR_^MC6aL&(VrV65pHyl$CdlH8R z=Xe(S7YR@VMH#J-J)WIs1Yd`G{0yuV7&NmGR!thF$Zw7df9h!=O*X!;uonahZR+-Q zPugf#-ap4ahzqH(_~{!0a%yqH0)6>nkovl+Au)HLJI1vnd*VW&Tyb_xr(jVynv(Nk zK;)IP5`<^El%%6~Ep~Xc$7=Gc$RgN$$v*$tfW{qH1{MK4IfD-8!*?A{IVCL4-g*{F(Is!Jh$}gV};Hqk^^%x9}4i z)bIG+7ITnf-IF;Tgx%#_>&!><>{4!r=3a>V_BAAFta=LO(Ye(uo8CrCUd6Iz9yv(xVC)zPuH^Sfh z-FGa?&8^O*G6;vWB_9hrcF@GMgQa!h|632)#ME3p7*2f~GwN-yoCj{E&Mu($r_cD=VA#k? zwjSJ&!)ZUv*?udS2e=k6LEr{-D`dVM9wN-L$cmI8LFyQ`B2WOlA|qE=o%?I%3od2w zspmrvlPdu@1X=q$0H_|1js}W$Aei+g@)oge^N?v*`FEZf_Z?am9q3T#_N6b-=z4d$t7?7~ zt9*I%_Ol1~De5E#12wWWqK zuIg7p5>=b>jH+s2Gi9(ThDDL*tWBoOgLlD}*&GZNaw1;g@dc?(bXF7VL9*v({sLIh z3)C^6f+ z12uOg^@0hmS#W45rmbc=tL)l%7-1DUlgnA6+?X7xAU!CaaPocSaN?_?58(g((=;b^ zz={YqJ0U)}v;kzidABpd;d;8O{NOs6PZ2eEVzk6C<|KCNxS7v0Bfy{Clyo*TqYv3?wW#6$Ch(ni4BD{V8?8)U%`sOkai*8Bk4mlLwL!5+m1)*`Q z?=BE_nZp0zV|`_c$72umko$q~-%tzr1f@+a$t~H#meBW*h2oS*E|rMlq2?bu_x4oU zz~j>(b5ZU3468s{M|GiDgwk`1W8XTBu94tOPavF+Lap-+Oy81%rn}C3qds3%bS`5s z#WdQPQc0w5ZcWT*s+mKCjC@cW#M*4!00JkXp*83-=tk*X5nosYmw_H#@Dk+!2`=!{ zC?URGRGR2z?pkH|Q@u7?2zpWI0aQ2_pf8DXDq}cvygwyyTs*#|xppZF=)F^H@ien@ zXnyWvr-)8J-4_i&(%};GERfSZY=>omTqOLqufFb&azY<4TuHBGWMQ|Vdyt8M4BubM zmkePv`{#kPYU@3ae}QUc7lNwDx>jDYd6FTwQLdtTbJgRo&HYUqpzpwxmQ55eSX2g* zA-!YwVqZ{!gdkDW$4W^{5fqFnRe!+=%WNX4X6Yc*t?MZCE&E>&$x#u57(h(y0b@IA z%8#1PgHjVaNb`ve@NeOca@n?O(=M`za-XMd{5hk&fdYq1+<596}^y zh8x3sBiobYcv3K`Q^y(~5D`ZlOvrS>fo+=>aDrBbttg+>5$W+Yt)&HQB;J=M1P&ns z4WPIa+bXO>UOUTjrr-(hI#UQ_=SUPKPh?B7g~^1EC>93zha))64Xy@tA*NC`nqcmd z4dYj!N$pKaZKyEBC9nY|_R7L8JEHs)If|RQSuGpEmXd74d`p)WQ9r=&Gz=;6CZona za(3$v0Yp+5`k?A#LtuxMcyM#2m+-vl5#!Xr3Uda5RRy3-ZUNp7=7~kXI2mm0f!0w9 z>NHvlapY0oBE?*A+)=$U_SSJ@8clg!;1U#JL4qhB@^jME6L9ht^a+2M!=N?yP{9r| z??p~h+T1_GIdd>!?81#ADWgpXVx_c5)g0~n5Q58~$^#?KxSb;k6XFyI0Jajcfr8kH zeRt--v*73aKOV(d@ra`7P#&!)_#XVWX#o1dK(btpuEFjCA0&3c`f@#&^b4k`11u&QhkJlY^O7(Pi49Cc;3?|` zSq9k2|)!O zDsWHJ8ThuCh%7MBm3IAw;RQK?95^CD8mvDWuQZrg$Of$xWK<5il!opxz(sed0svGb z1dEAO@*{Ms>_SIB=9djS2Vca2q5M3iWs%UjnWc3=N5@yiC3T!B~_15J?+YSlh_EFljKw!x96p^PCx80l%8 zVz1n}+*{TZ^o;TFfVddi6ze{7Py~u#4p+2WE=(yr<<+HvORy%XKwttvteXh0@-W3X zR#82N)m|bvAt@)RNq8RR$e-2_e-x6^dm_fP@&MkDhk6U(U*R8{DK4a!?M(y2Hu&on znsQb7LJ$>>2Qyt`hnU@dXA+%UE_hdOvu|uU$kUsz?_TgRV=+5Az!g5dxp?SB(m*Yu zeHo_^V7i0`8zxl-Co~i6FP-{Q29obJRVPbb+-Lej8g<3m^YhNCGXA)U0CkRG z`mp_FIi)7gx1fqHp%EKH``NE(0xWHgR)ny2G-U#>M|&nrdb6+()YZn{jba|Vs)WaE zeJ92-NK;^3(pLQiW|4LMlU4*4eSve18Zhuf6>Y2vYM^(oIMry9GqA!#ko_ccXuL;$MawVd%ri;dtgKJ){PPG^Jw9LejKj zoDr31xwU&UZZ-(d*SU6XA5`8Cq_M1YZ>&`8rI{2z$(Q9j>@e+BbwSnDsJ87{xuLyx zBdD#oy#*b2g_lvES~PeH&Je-w6=s2>gg3ft2Z+Ovvg5x|QdFDKI9EDy0BTp->d#Kg zsy|0pQ212BI=P5;!qpSh0-MZGfhZGFmk zn~*w*vo?RUX(WE_b9`d?sC4;fX7JpEX+*A^Dt+_ZBR7esJf_W>OQ&)oP5zbwiNEN4 zZ)>>P@lzQ&Cl7T^noWnoPwHz)g>gss9NG|OymR!dRBMNe9eTw{8YE%r=y<3(%f`45 zvL8uxE-?*D5(R|$9W4JXQ0X7KJ^XyaBd9Cc$JFd*G`}4FJAci}=&*fS>3(d~LpaXL zp0~2czY9de+tZ%umTAusk;0&LmiN-C57Zam4ZV`!U@P~44#j1is$ctJO6R7@8Swj2 zryY0~5F{#fAi*Z$Sy%d%-6xref-h1h8I`&K#dL!#!dcv%@CQh#2q4z*ntETH06fxgYt=Yno3=|J{gTFPy#0WGRHqp_o-2 zY_0Gp^k5*l6Cr^y>c`QzIzGJ&g7qDL*vI~}2ZTV_i@{$p|1Yi`LsZp#&0ib(!M-O( za%wPs82^`t^sc-smHA)9&si>lQIdK+HKbN5N!9kXI=J=%GU*YOH%$6JRS(=mneG-Q z-|ud6ev#A3>EET@`d7|(d@6}fvSUh`10pZ~_R2dDe4FV%YHA@B1k!mCXp?Q7C~sQ6 zVy?rc{%$jQw4S-D{=8v7@lZ1Aa7$s4jp{0cLCqy%h#i7*6%c9vZNRiX;~x!{@!H2- zSxL;4=qFXaQq4V68IpJ2`bgR@vwx^@>eTA}`KTEgOW*UUTi!817KogI!#W?3JcL+u z8ln9)v-T=(U$QimNb^=GahSXP35!8KV;4l=DyL7<96;A;S$ zhiVfmvmpMQ4F0JDG@~TK+iI&TMQ06tos_GvveR&1NI7o>NF8HOf}m zR7djM`^g%mcriPNVTr5Y`5I&;u$#|8F-Pqclf~riTx9P@ew+_zRf0ysp01oGo}I;#iSh~E{3PN zlO)G`Yl{~YW|#jW4H8{$TaQv)Er#$mXH;h}c$JzDNbOD315KJ`^D}4o9Uu|%H?^&h zdRYpY=25Hb;rbPgulG5fZLe$uLf1~DPWW0M9k+2uS_*#0YUnBZ8q+dtcp-ocJ|N{gTuCpbC*oY13%6 zQrnOGv;7{#Kos4#RM38>;Zk!$A5S*T#GD@&7Xo?}VHs(?l7=LQViA#l-o+yR%w3|p zB=0~J-e#9wOmf;@DpT7Hgv1zIS8ihsA5urr8Zc)^?u$!58th%6^^Ec=Klo1~zWB>( zlVL8@TfrQ)#5ykD-@HFriBv^+&Ygb=e`J1#U(NSYCKjV!XD0_}4{0g1#{@8Ckgs!| zi{*P|H}`Nt+ClNEoCo0Ko~y;;hW;i!*Nq?i0Nd#GQOAgJIU0Xm%O3&ahFV)p6%i}& zL{hZXkDVf0!H3-ZO~?c_PTiJXEr81h8}4A>&XA~*19F!l4-p6WVy)jM&_KsNjOGJ0!i|ge!bX|5ZN(@*VzlrP=dmj4AGfrY>1q9{^ofU_B%6ssxmm!6g z=!)X4_Fh~a8A4yy{<~MxhN`$GP~~xcD!hj9+Wx|i|MXSTH+(r6{%o{(f{#nH51+$v zq|4-sJK28>$pf7@SRq}fAxYB_lz{mLJO><>zYeKu#MpZd4!TJ^n)rNZUUBBWd{x#@ z)#Z&}(+q;_aKBQC?Hh5Z!sBY zB#kin5_B@5u&m)Cu@50oONBt+3^Lj#Z?U+jmll%%%9|R5wjp0Fye!yU8h|e)X^>-y z0%(?ab?T5?a7eJd;|~(;T;YC&tm{={$$X;Adssj{RPKrl5EvH&3H+7qIgQel*;@iZ zKJS0~%}%ktWX8J^eP32SS`lnXV>jpb)CH`Eni4e( zOa#i9xAZdH7(hBY%jUlD$fI=*qSq1a4?YI;@dKy@5ZKZ@_)<^D$V56G5s=wo!qKa| z9)d$P8B1jxOA3N_01OG5iFCt^ALgUp-^?R{oR6GjQ4m?#F__R z*Uk5Bd|knQp4TGWa%S_}L0`RnqMY8*4}k5tZUJeE`C3BO+0Ai#7F>0ShbCXB$gHAa zbD)`=Q&k6!f$p;x_b;^$#N2k`4THaF55RY$_hzWMoH)4Y#oa{a4FV!~TjcZ1X~0yB zrhZgKy*aOG!O2GR*1obNEh}*EE{)m^f$uaL973oaPNU(vGs3MwLHoDzmfWEq$-Kg@ zABl{fq?Ac!bs+lsa_11XIYU)n1my9oF2O2fPgso%p)_r6d7DF4Zx1`teN4^5FeCYAO{cTpbZ_vv^h_0yA|M1l7_qp=@Jlp$K|CTxU zdjJ0YcChn#hS>XYm;3#x@Ao=M==*t)`&)X z^(DMCUkroD?``OvVmK*V;AM_~`htBT&o;rfH$Ey#Zphw>)Eoc|fRpstciF(5MyOI3Vwj1jsd3hFfx@P4-KSV2 zY$&@5EVZYFU-eH9N>3Ys3R!PeOcm!xIuBxwIx?>F#B;MSsN|NF0idO+-dKS|MzsfIX<>A5M&|Ki{_n3hNTCOhY-aaw6 zFwk_b4~D%$(zgVT{9R0>Z6GSd8~-|(hg&Q)cgP{9 z2)}~GIeJ}L9UrOY1ZC;U8;hQ9l8}lpUfzXo_v^dN73&G$Z$MjL^&qXz?rPml#!IvbIk!sqTSmX{IeT2m~_c>uX`ABtTr0*Zrn6a{Llx~Kc zeO$HDMxwWDs;@K{s0hE_lW(wh;6yd89}DI%wihwq#y(HX~e2;ir4eGb@P3c>PLDIS7B%8_pM-;dWW%6 z04tB7d}X3veMezu&VsXZx~q4)v!Q?G^`>=9NBG_P{o;y0=<*0TvB4a%pBMWN310%j zRlkGUn|&FrP(Ah$DdqqdtW+QZCX4OO`Ans!eMvwVzJYY2;YNCnh1}(xU-U;(`^NgL zH)4E5T!eaCl;o6Fs)0De>F(hFXl-iQyyMV^W3T+FnAH)FbO_7*;G~(-Lr9`4O3bX5 z*$L0KNa}lXe4%#osifv+=da%Wx__ljDR4GeX3D(&q8n2L#8wz%{0qJCI{xg}WDE1u zf#v@`zxw_l2E;pTSS-mZO^!kS(Io7NKXE97sQIkzCBoF;*vYGvE z6GSbFh}y4AvDA54Jfm~RA)UuFS^%+!jkX<0E%K_J z_vBaJ6FhW$0aZfBuUqt7DSy)D*$=gUZ!29Ne;s8NfJIfr{oU*?g0%{sCgr7;qV>*> zfuq^K9%KLGs9{DYCnM12gP-h#PFgA-IVG@KsboCbU#HQ^QL&e>IeM|B5)S5HqBD%oKK2wf7w^{C+rWO8S)OwU-2gHT>OzSMj1U0`aR4MucdZe(~ znVo!Mk?iHLPu{p8*M5q8lD4%hlL5kVXALOOjOQ^zvCXV}D04P=>21sCM9ZDY;Btfz zt7X(1F&IBOhSKoP+h(eZ=76DiJ}``fGdQDpVV>t`4*yA>$#S2hW~a&WHQh2tWj)kn zPoHX@CIi0Mb&l0DM@Euu!cj4&@^@Rj^~kE$kEI65%yO@A=~&!K`PJ_CnZ;Z2`o{2{ z_s2anb1~LNAmk%4<^1d0JHlM|kWjGKODdv~6*Yz?r^a-}C{#OHPovvz)FYABv1U$d9!5ovMZk^G_7 zVj85{SVwbz_IEpZH%WAVPMO#vXn%;m{yKArwYm!6f>LdqMPJSk=~S$?)lQ-j&GJot zf)uwb$FR;DnM_EKr{|yshy2sAcEg93Y>H$Ap(F(22U<&f`yRwO;-&o<6~(Iep98G6 zMbiHQz?C>cw5r-{T2|V6BJTdQc;0!?dkwv$It`e>Wq3_-&}dg^Q}^~i`oD&zH~&H` zG12A#3I4j^@PA*Mj%9iYo&)TP|Jj`67UZ_uOnmj}NCu5DVZV^erR^YQWX)Hcxl-HU zUrQ?Op@wWOR1lD-eT%N3#jtWuWzi7LEX{i{5vdZL%`E>VvZtaMc4jQbdM>b3)1kkg zrOAn7QfvH%@k6W;f^B+0xeMQv1yISi)iU~aed+vj;Tc1NK-gx}mCNg}q@K21honhP zU)sBXemQM}))k=4eC>f6t{EFiJ@t3wQeZ+vO|ItcSDD(^Q53k=F;d3QR4M1rf64rB zXl>f9^}VX`ig)*Lx9JW?Y?~WV8csMH^57(4&691%Z6?SRcTlKUN--0%q9sNEktoy7 z>E%Dp8k1AX8>wTp!dEqmPtDjleT1Ga$|4 zbH!L4jW9FX_P$g)$P^c`uck7wjM=us`g{*lb=`W}jG(j`OWz%= z!~%fWw?9_<2Y8zX^_5puT(vBV0x+d=-4~>?@{v*UaNobQpB52C$y>&7@UzA(8T^m2 zw)=tOaq7DZ7T6$RUxSUf)$1!xtUAI&=X{NE$|%ClzS@NUFJ<;)K&BK1DuNoj)29S-4i+bSitfbXP#BDyqArh> zy%SiU67B5Rl3^$D(vRArDUM@WW1fj!!GJdH-~nx?LqL22e)W4wbk08WVcL)azbCJ} z6BS;xBh;SN9Lv^&ji{rRv4_<+VfF8L%MrohM9Rw4xG7W}4=;L@oDJDZMrqUTOu~Br z4%pb0Fbn#Qcrh$p0S3&;VUP|JeSj(E#KeDXB3Q?xGQ5qT(SQ=C*R^U5tZ zx$E%Ispp48)m=$8W#P8LKZxv&yGFkfw`I=Z;9g}x)?QB4!&b~KXZ1OS7Oox!NPKdR8M~1*svH0@LtiEz^{e8p+gteqQ4V{2!Ig zL`N;i;FrOH|5cW$)xi2mjIsYJL=30>97$4)X^_DP17wzHwp;ttjlO_6B}{!>cA)j* z$!DTw3*v8tG68Rfz8t{?;dao@12}gy!P_?D1v=S%QoBJ;g9{mtpH6dqE4{*Ed6^!R zH&2Q%dcEmKzyJv)br1QM9wi#~rj^>`yb#glll`P2{;z#e1^G)Y)o47x#2|8sKdw<9 zac93^a|h!G40+F4&lvmzI_r(SC2Wrlqr-!vZcRz()FtcRIr^Dhambro_UC&V&R}bM zp<_CAP6h}#Ibh)x$L_*yd-t@x4F1$45%Y;ZA){C`Kll|#u#Kd`mL#`zT$J`Z!ckHY z(M0hq`Vo^;_oGZAxFDY;o+NRiZNXF(G3h&XEAX0_ay@n{3>LVv$;J+p#ul=;b-@Z1 zT(!E`PCx(^04efyh71H(n9(R;fw2;uBs?Qrz45ALeYS!u1F=E4nVOPcJA_OD#rJL6Gf@cAM_k>HN3+1 z#S8G9KkaElrwRAO)j%|Lc)|Jy#J4{X=y|{>bIuHtL1kVJ`4I2sW6ZYtNIiua{eb&Q zrU5(?rZH|yWI{^u3iNPS0|F83eU^&;x;ig;1^3WQ6;7svoQmzo#GYI4Qh4V}8k)2M zB89dV?i$3MARx|HV7;rCr}y@ADmkz)w5=}hSa8n0ryD@5i&o}3uRT8rsP{V(Xe2RI zJbxEY5?rm`GWq@rK#!1|`liLM^4)(Fj)`$2n#W$pW#e(N4OKEFns$vKQpnIS6jed$ zG4m`JTU)sBcENS%2XtpkOzpmBZB#smm^YadUhS=s9-vARW37F!m*y!lgMMZ}z|f^Hk;jiT~~bS+reQKTci z(SS&RrPU*8?yInByI#WzL{Syo2q?Fn{gALdQ?%W}TW>;tWiRTB--+6YQbwHf24E;O zTZSiCw{J2ftz*Yyy5j~pub>AWK(J(|a!U)Qa{q?WfT2P$3wy?o;-PkhDw-xsfYJ_w zUPtw{7B&OAJ5N#F8wCv)!40-HZmCBUc*HSw1zT~JB)etRrJTI&j)ZB751^K*Qu37#K&YR8QFIas~Kqf z=_thmH3~-$ zR1%e^_2{5Jc2_B?gy5fI(Ec>U+zNmo*JoH6f&T{$yUQd~S#%)mG!HdoCqKba$fYEg z!6XZmfcgaw6S~MbVqXOg0~##3t`XzudXVG`rs@=&nPi4Gx1)rFKPaMlfCQV0&~O1C ziRIm&rByCivRl>Ip$u_4QaRdK3>U6)H;S4#3dsAg4)l3a;2x~h`rRF(n|hS5+MY|0 z84;tq_n<0}q0ZJ_N@874h!$h`;xMSDwwy-URWH=qI`oGnpdE2{<0w@OFf9C1W$L&@ z<`-W;%10eDHU)dVUb?dizCZYAymjz|sclaB$@RjG$S*8lPX_S)xzyhR=w%)!ZB)gz z5F4Ydo)EC#&Pan>nc1IL%e~kPSiLuc*T$PD&vjKUAyW}t+}^G7atzX8zM)0p54Tb> z+lCKyZ*yJ|T>jzzwCN+>4$savWEZ=B*XB*lnX~ z@?XP^sF`v6y*cv*ejBqsMk zFzG?40RKV(E}O#2<#y<8rozODTrA4yXT~g(w+?hxsVwJGvaGv{Y6>0TM?PT^ z0mq-2k~DJ~6)l>^VVE%^#YTf^Ado$6Ml)ZpsB04sm0BiQ)G%>_ft`~&U1&Wndrh96 zJm%}emSr7lhQ95?)|jR2XA`6oqe;XQ8OR#JKo2t`IZB2n@b1xjdbti(uR>GcwJLlj z*%W(=|2rCS%;GeL+W`eipAmNKm#&)X!-#1bHA3X?3@G6ezVB;4t6%f)DM5=ORa6KH zTAGp&EvB~st>5GlQIA*m(>&}oS1H)3RgKV$maBqlH<+t?c&oD%+5?EPXy&yxG5&*E zQRK+aN*wiDx>4)n_@>*cjcTlnn9uYaz=To3Xqgt=#?RAhqMO8&1b4{e>&3*`=ed)& z$k39!%P|}rQafFP6ym$onR)jnl?e9{sAuX1TXy6eS%JcxYeNeLgOM{4q>B5=oG@pq zgeIuTgFy>V4(d(=O;G;bOWsdGR9y;`aqc!5f0^ddF#^l!ne;Au zZk5uoWCbCTaRXuD8C&N1qvh>Kml?i?oYk;z$OR-IC2IGtvqCvnzMbuTZe#a43>zEH^d?UiEQW z5|N&Cm{14^kj$K=>C<4Q@#wv*b^Ea=``~H!ezi;0!>ZOL)O0UGG}+4s8#mL2i|;41lj%-tVfU|3ZbjAyB9|Np>pqvp7O8 z26&eaCWf+Pw^}YepU_Ju{u3R0uy#osCwO25XSZu%F*KOg)@F3xVByH9bxSrXoZ=DF z({$M`(P!A{YCLzHw0)VBP&LBt_esUh+a8|7B2arz7LSOZk~?W( zpZ8fc2jd)A48U8i(b)0d5|*K#vGi<-nGm`MVJMSuI&Yxh#8>wZ$B`2yQtOl##v(@AD3V~?$ZW(^ncj6Xbv2udE*KB6 z$!t4@w(u7&ZpM=4g9ULsL8gMfd==@2$v5%$#zm@0{Rv4-!DW=hLZ}l@aScxKAJnRc z>>Jkc^RprDZH%=g7aGoV$7YG0tUin9T;JM3jS^@qX%_CfChIyA+m0&@H`pKTS z@mpmghVP&@SmGn}9i8bAM_a^EY=zlPgFWc=_EBQAMnzuZ6+&dQ*bZ}Ru`&pscZ)1^ zFEUNrH-R9Pz9vN;$Tgz<{jiEH6Dv8FASKU+deQV|!BaLDK3OJ7>y(Cc@dYxkqI9ks z`YsvJU}Vh~Ur#CjAUO>|3U~Hj>*m#qmVIMne@m$M@XI)57rcu#wf_N*DS-S0}2*Uz9Z__vPFSq=$EyH~fs{AdLZRdOr=!qG5x^Rk z9Ey!mLu-XnvmSwv=Xsx)($0W7=_Ob1Zgna+9GTnwdIJMpbBwNG!{c! zO2d*MpLYLECDIHycHt6SUTZ^YPY6j3;P_Z9P6lIM<8Zb#*Jq5D2b4hjen*d z{>77uNwtWq34%N>?3khIXU9}e$o$jKLBMyNFcOy+0OluKv(vx$N30~132hVHC6nhJ z4_8l(e#~bmbapAJ2USmr7{fIZ-6X!G{T6_=`H=S2Dtn|k)|OP{$v9G)FMAwaO1mqS z%sR>Ukje}ZSu>U`LytDib8xS*!=WO%`<=k4wG2)EV<_7K%^1J!ButBaMSG9E9q|#B z{TN~%Fk@|jWWU=6?l!HPCRmUZ*|jphu{4V%)b15CaSk*P-E@Sdjm6Qq0=X7Wd>)8{ zR-7A$hl`}?BQQA?6Y4VHsh_ayN#t~eGXnZ<4^HlNe(!fge8ZFt$9zJVNLvlI-rcy( zm?dYWF-tkFcgT_m41T`hAsV3Q@60d*KpgIUaW#y267!ylQ@Ab-`9WnH@_oZ2GMHaqL4f7bYbm3&;YgJ+0{S&sn9a;Ko7Q zhA^AC83H(($(&0tnw&Odg+-X8JQ{8;S^LPfyCzeTdH^zgX2AbGkW!gIhiTap)w)pd zswu*y!Fln73fy*eU(Ecv7gbHJ{h7E09vMRzE#YS;n&PWv!L}o!s zG->!itQv#<6>L_-Ucn$1J``#u;wKWdhQM+;IFSxtjh_-A73GTS8J|&owEK9+$58rA zqgGs*%hGPZ$$T0*6FJeO*`M1j3@#e0Y(hdG_{f`vk`KRK~9~>3)0u7D|vqL01NDai^D_ELUu{-n5sh=!0 zNyb|!fjFGzHNR&~|AuL7lfOPX%@~ovYw&s0N3?iq#7$ zo$@KJ2gw*Q7uLr{EgELn4R;mPCRybM^fDhioNr{7+$##ZSYq+Kw|qBZb@0nGjPKZN zGh8v-ji!4&@PX}9X@RaMtCUrf(MF1mGHkfhQ8l1JUR6X-;oUmD+*S`+%YNfK195sE zkqBJ(ZOm~On!HXq03#vARH}IiXhc(RYf%Se2k(KwCFw>Ae#r2 z>?4!c7tGs-L`)mF7mi(?Kq;+M*)B1m2onmXrbyhL2Z!^>&syJa#}jy{-#?pz4C`dM zcgW;;0dTazzZvR1F z$z?%6*1`gL%hUlYo}q%KPy%u<2DtY>PIJ@z5r1q{AG=jQL%(M8Px?~(1W{CPd%h}L z#4&O}zu~@zS;pTZxzPK3*SG0^6v>p(c9azP)Afz`e``oJmE*{9gg`*qAfP~qKtMne zE|#Kp#x6Fdw$2RhHr7|Vx=xv^DL%8c25f4JjHuX1Z}%ELGWChhB?~JxV~NhsGMFhb z^eE6&f-Nqk$Gx)<0bp1m59GnOGlSh{PzQye?^!;7*S)GE{dgHMCrIzSC+j78Eo}Z_ zhODZXo2?-h>i_Ql+~{Zge)%^&+}rK*F8;cU?8x1tT$6QXC3U$gfS!wFN&t5Ky0*5s zsPaz0ke1O%>A2$B1$nf6msEU!{1dEOE5qu)GjH3v)8zx}CTm+DTjJEf);l6%VM%|) zx#;(Onc>Pt@e-!LLv?#X^46N}i1B@*9?84qK2yj}x}A)jHc{Nz5TsPe8s$gymj9?0 zVZ$(9#{Mc4c&4NFP9GxLO4g_(V?%wD3ySh7@3++P?>CuC=F2l>E@dwbw$_WoJ!B}h zehJtgOy8~OGjKxnzpoyiR0l*%r4Lud)$SGoohA>>ti9*fUO|^(n4O3po0Lq(40j-r zFXO391|xRe_APtyBTi+d?VfEcdYQ_rD zt0_VXBlLJPo7@@7#UAC=a&m~Y0DZT$fWtz z^2|!>FZg=wE^uw|orQ_ufZ}csKg_zVlP0@q)=RQ|eHbw1PM_Q{RZFneDC%-$Mv`9Pxjimo_qc?_cJpaqwinkjPi{=&SPM2(NH(> zZTq~%FzIM>5qoD$J)gC9glN)2wsx2{Pryb*Wzxs>&~D>w(+jzu0ZQhW&Q>jAGw(*) zWz6*#tNhw{KRfpFPxf=Mvh)n(G4Ppe5(PUE1qBC>QN`chV(!j%tSsDq)-*}T-!nIL zQygpFgrgwm)a2x+_8}^cw9!RnO33x6JzLh<$`x|{g7khwz5{v=r5$$f)ihh?pV^&t zIQ;zXu3!+atoySTCFSF)VjAOwt|@Ia$}pImjEUj#L*E3}uK8JfDQ5 zN|Te-(o*#qSwKGYeDonr3Glt6yBwM&`ey@ zG~T@zb-sTkq%zgN<5?@I_H3tzjSS6ZZBfJ|UT;Q&W>Q%8q^>EAqqC{t!S<<-%S<7O zkJ>}kC^8C(a=LmzHG>Myref{$s<LbrgW{hIme|WuaP_iwP*GTV~e@V?dfBJgKl=%28m12hU9R+*Vp~D0h(xl4LVA^l2Oo>_yY~z#a zX}Xs;n|v(CWA^RVO_C=m<_FgdH%&jU)>-r2=&)HBRG)ca9(Jdoak*fy6ieDaWbXCy z+@N}K!+37LYCaQhT}FhILBm9Ku2vySlF7A%UV;Y+DWW&D?@|?YWtHss8v5knU9yXU z@DN6v9nhE$&>DIqrYOVN0ja*oCpqI)T>zdBzH{tseGwmv^!BmyK(FDzBMx)Zu2Z+R zwj?`o>dix##7gXs${?~GV>v~S$8roudid!~yK(9@b!yyRYBYYIKF(Doc4;#c@GJ3Z zi5SaG9RZb`F}Y}H2a(?hipt*yh+g3ES_YsMxt&nei>+4((x9i!)_8@K;)WQo9OERQ-|`aG_x zn{INMZ}(dU!v@HQQ0enFW^|)@)WaF3CEVe=87dyJcHdPz^n426Y*#IoeJ+;%K9b+{ z=xnTNuLps+8cRzL?{?hxjQPjSDjuvYCM{s>A%Gd;y0<8K*KOwR&Pd!o$4~}K0tcHH z|DEhwQIZtaAzZzYiigvb3D*k5$Df`l5Lf1-UB%?_ta-Ur@-l`XlbJJtAT!2*>g0(& z2|l?~9CK$1e@(MMTpYu%99&j3l;J|Urnxz-AIpciS;}>3>U~UVuEhp zX@23uIr*Pn*QueDVQ@7dmNcyxNHK;}AZ{Y3x;fqPsejM*shag6hwGSF!t{@Ysuv#A zMZ^i!PC`zVhi6+DpWZpchjTq9)hH`BzmwVcC8N;A;?%$yv#$cjFJr00+hiGbec6q3 z@w`;Oci51XAL!I#@ZrR%;goK27C2q-8d(`=ns~2pGjzg^oA2TP)q(TU<9DTflURH> zO){lvulM!Zv)YZ53|xe`=sD=k1J|C{xZs|ZG9|i@9!C|{-B*|a)5qRGYTOt(T6|nG7$!0mr7XZ47wa+#*UiRV+KblB&XSAj9q=*m zx_-^hc`P9MNzu2Lev3i;}B)=tcaehi)JvFD%+WPZ`f3@J9g8U zPh&gwqrhvCYWin|z!boH$gBA?VWlbP>T-9N+h$`aI_?>901zy*C3^WM~qE zCvz@SZA7n7%4}EYQFRKxD>E(poSD6fr7RQm0OyCBY#$b0N}B}tqMx(A&>RVU2gJMO zber|901{UNbqQPgF2noMO!JZgkZ7kzIb+&ij7Qk5=1kEL;=t9iJOESvxz;~mO z7*P}K_Cg+#cJA(Evdl|Hudqon&r4oub#i`Pxbs|q@ZDNm5modGbN1dY=)s&eN&AA4 z>7#S>94G%(tKIXWrjC3A5{lD1r_`1dA3!oMNqD(insx~X&WD8KQs91QB^lklzFdE6)T9p39POQ0bh6?dy*DnC=v7sF~YT4eolBDjN@XY(ZIbK^Zp z+9dH-m@~sY6J81>Qe|D@TU>Bv3E!m%G|Qz12bu|qm>G_^7vgU$vlfKkeajo_b9(`s zh2gdj*-+`Zf^+l}cx%kSFG%F2PX3WhkF(n!wae?1z#R4CZCXW@?8Yn1>#-t5$^E~Q ztK3gtjnRA*c;kYOxubf;ODi5VS^EupysXg)5Z^I&mETXFi}C#7uG z^ocFk?^Y%9i;9nain{nNP5O!17^MGTe&v(E1u>Rz3T-s8PY4QX{|wAs!xbN>JlJj& zw>?_h4PSm@m`fQIdpTj8on+X0$ZiM42h=2%I0Yipo z*7{Kz)db~D$a5zD4ifPPw^+0=1!}+=S0uh9xI?UK7~LCq=eOMXjjtTN`dqX)LAaby zzI0j5JY>Jzq)}(Pzp&=Q*_PHK5}cM6d;_V@WUyoXEN+Q_KDV(a!*aFP3umi!6ZBngqomevcvC$2f% zu%vx2?eXQye2@U{l#x_zxkX51Yu1fU{~nS3_X$&@^8J~GOGhKN^W8YV=HKzr(W?YA zY2^v@%Tv8>xHcmyJ4QA-yTCW4b$|Hy{w^hJaAPs(S2h0m)Yec*8hVr5{_!MjhRLR* zI9zekIU}hi;zV~XtSil{Vg<^FH1k;Q%KZK8pZlbiPE&v=<(R&gDP`Lc179TCBA4F( zOm?NotwuY7|Mlx;EzmEA(}m|P6v4dvUP|2R-EW#_vvO?R0&bKU-5*JI57U+Va+q(Z z@(CNq_djz$;_p*wR9FVxrejt<$tfFBmK9n}Pwm#EUh+`2?u)y=EZN+6wq32ObBQ;j zmtt)5?a%d@c;#~vjbr)&XKHm_HD?cR95Mv$8Ofd58VP)e3&t|+`q^2@q8@h^&$d8x zmLzWVcHy@l?>_7%1dJZeh1Go3yrYi6W!YvvcnN#^$#dr#AKiflE`IjGFoCK&b00VE z`8h=<$Cpn^Ypmr+a+)ZMCmt|w0CTNkJBuiLU9JK-z8Q;$8!gu_v#=PZZSmlm7>$pO zCHYR|8pM@9Fa?XfylqO6KtW>F;$vf?orm+@Q7(zv4wJa+!`g`3H&JKIMyYG&!uFm@ zaiVmUmfwFea8yfL`>r1gkd_ffiIJ9DNFNID3RGXH%E!pmVtdW1S6SNGOczk}f5slAJDOC8R!$lCA_un6C`AWKC$C-~G zpDPF_z^)9sX-U7GlJYzs6JsMSwzeduQnZj!N%MV+9xc5_qw`)4rdHbrNqQyC6ob(` z%rI?5UE?dvcx92Ndgpb+m}OoG4p5d{s#ZNTStg>wyIeuv!2kTv+iGLT?2Aqqb743~ zi?T_MUQLZmWQAVM{wcR;%rH;Sy_}80w4c=Gwbj9bjw^}CVM5T69&4%A#Z~F zB|&k{)URQFXh;d03eS&Rom-B*o_LFOkm>i)2Z`tB+*2uSBz|ec{oZ+$RCr(U}``JCGM)6YEGCsKpU zH#3_L%4*ibT4KkN=2cy!w+@biEjG6IF81IRP<~IxYxSy9qm25t*2t|?B|dhn z)+MI?Z!cGf(>+pOuF< zX9+785q9I_ru}@AqAKy>M`ED{t7mAXTaWd^5HN#xC?UZIqLczesa$z>$IN{!w0P)l$!Q^TDZ`N+r4K9~?Bc(xnG@~66xEo<8 z*5$BO1bhH;awL;k8r6^l-KbQ7*GMdJfyH*E; z8<@YSslf0*7P;4_w|V$@Ysz!9+hS&tthRB3lf9~OL*dI|_oK#*c9B`&>qKQh@4ip= z-R9EHni3n`@;+7` ziR>A#O6)zwa_($JeQ4XSd>!oM#CWiX<4Q9W<7N7hxRN02t-9+t=`~8p-|ZuKmA!s5 z#}MZYmtwamWt6;6Dihb?2&>w(f5U|V2j($8&w>2V>Mm;KELVH!a|DCAWK#-)j#KL* z2F)K&^9%|-ew<6rz%y8A_T|gLdP?JSJdalT&b`6|(sHW662&MrAJ0p9VuR;{G3fFX zIq5&jEbSF0PwuQPmp@WwZ&svbo|6^_^#kXWsBVem))6Yr^H^ZuI44gGa+DGT%W>sW z>(OwId4{U_ywCHvEBLE~>VBM>Pl=+xk8OsL5|i5Cgj*)L#eDq-rC5rVh5=Vz1F@{p z1p8#&f_pT{HEb-MO;Pjo%$?WIpYkb?NSa^Fk%-#LrFL!h_^I7U0;1Kjleik~5?q6| zd+B+>E4i=i3RM*}mS$~10^m&ZRF9c*6JrxS9ZT92O-uKUv)q?{xaAh^&nN4z4%!Xl z^0LpJZSy3+6$fW-+KasQOfW5<`l(wl2+nN6jxODf?O;Djwqh_`p>aFEz4d{-rJ)A$ zW5~Y*$L8m2&se563KNx))L4Q%b`ohnlG<@4O`0kf6!B0KW8W=wm&7oGDAEkF$Wqcj0<{{Dt7U^yZPc7VQW=EG4q!FW7o*- zNKdD|m+OU)-f4+~(&N{l3I8&y;dR5uCB60XDx7ovwb8N$ z<-#wTm2QLOr8*Brn|HXw)NLNuq)@UjRHoV$+4Kwz_gHJ)G^rZKGAoVk#+R2WuL(Vw zo<94HR6G+F>%&UVAIYoWvM}rv=SwZK6etXCv0PbaCRsC2 zd*xzcRbKQwgd}<^oP$bcYtqyHNVI*#a`S=_e-<7I_v4fa3u>C9sfU(3UiMj!qV$YF zEHb9T^YP&?Gv7Y-ck9eEzW9tyI$e{oxkb*s$y#5kKfS1(XN>K@=8QWsn$DHOtuBP2Xdoo8U>90+ zzI>IJ)Almwh*=`*YKv_@Z+kIsxvw=l0e{yWF)9kCEXNBU>Jurc;yNCNZRcT|e+ijF{ z1!H978nZEel##iywkRgkEEyAUGCMjnyuosFHehjx=!4sO0r0_#+Nrg`cQfZqTCPgx z+UQp0$8lV(XJ*r?radKVGLUSqUy~XsU^m-WVl3iPf&cL9e;_muO6yvlGadJ9%Ep zi=iV*PFm&VvzbrDGaB9+o#DJ-*J}_V+#Gd#;Wn0;0F|=+wtxit z29B1~vGE8oX1_uTUzA(F!pUKK$92frjJk4KU%M4inFxgpToZw;Nr!GR&gz@xWA3RU zM)tkLbXw+T$z;P%tx(EX`jnGQ2^I2OD@JiiK zZbo+?ncw?}AX;7q>q89ww#u3z?(^o|ZNA(Q8*N@~7?tW(3Bo?-&8yBeSdM!~M{Hc; zTqGPlS!JdnOHcY^%7>S1cdyqvV05PNi5oYz>hvv5b)_>p_3FC*cedNJ{(H8o`r{Qo zW~XuEPc_0((evh4b7!RpD)VOpA=slqd9OKXNG_|76OJx=&sx>lQgq$X^#s0FNfLWh z)S$VZ#jw(LNy@O&=xP)H^Kagv8&xe0Df-lrl??_LFgckC^-WmYBP$=Yh7y;W(~!6` z2DJEin-EHBmkUHtTrG}sFE{UgbD$Z)6{sd{Idm@AoSk8fa2lVS+_)(rW#jh`6YlFc z_egk0^DVNhyUrRlWjjG=OZp=yIrTDCyu_mBH_vs_x;CVkCjIWh4a(955>tEm3XH&G zCd`*OZq=MS6nDK`8LhraOX;OoS7)&7{&gHUnn_B%8m96#D5#!|am9tx+^y!|##oi4 z_OKd5nFxI}PS08WfyWDbfog=?Ew4TEihW8*3V%oBt>%Nx#is;d^eHFLi$H`FlSE&g{3Az|C7BcbnHJ9yuRz zX{;kgGm~C3v)#|=os$m15xo^Dr!77cFq4=S2506Qre6B+d;gR)rx=+`GTWzmMy<;7 zwL05>W*Zs6C{CXFTTPG1B8e@H#Q0Cov3BQhNceW5sf!t|bm&gv1^SXeKO7O-PC4Yv}22L7HKhzU)QjZ zsJkwBFw}I-&kZ8K?j%h~HO<>V>w>lS<>f%p={Ad4C+XV_3LtC!rrtMB1hxW?tIkvA z__j6IQXA@Qc4W!Y=sVL0Drime$O|e=7f#bSUgg`xmRLE5cRrvrMEe)y`RsFugW!$b z&Gei$L9FH6!rwCjvjpOI-^4aIdN~egp1n&^uV%wxE?Di|;*V3Jyii%bx3`a137i3{ zxfuBN&D3-a6=~Uib6$AY7yc%UM_ZROkJ!3y4I2(IYf-mA=xm>?Zj_$#v~CT*)2o)Q zMQ(htA!XlsdWtp4OiLrmopHmOU9-YFsmn*I?MRHKNI$JP$i*k)lxoAL*snjXFAuXB zM_t~jr=yczS3I&RQ_52FO(lg$EGcA_EJy?eeO6h%l%>YmFwUu8x6pW(Z_3yB$yrrT zFz31=!#HqC0yvmi-+yD9LE)R%duGXOOQd%*T`ZpLZR?m0a4_?F@wD-SfX!w_ms;1y z;j3Oc#c$;0F06M*S?}lQQ%5(0u^{0u%*`>!w$fs?Z|OKtcow+|JOti-zxKAm`N!O^ zpWQE9*F(79oU<~?^?9>hw9(f2=Ii>4Uyj~Khf7}%53hE87Oh+`!(cXy72AADTp_;7 z<00L0GswxOJ|T~G$}eQ>!+acrK!+bIhW1j$#3$cp3N2;6RP|FBgx|E3g=ec|Z3nh# z1C4Z>uT@Oy$GiU+788<{sKhCfWseV7m;d|~KWOG9p1%i@a04Eyk``d8N! zJGR5O@69*eM?SPYV`qA+S|a~=|9jxG(KX-rRe!}_dm)3rA`KX69F5*mE~;$Jj*7!y zyq~@pXDW&b0>uLNGr+}rA1B{yHtyEWZV-VhfBlo+)7^1{Xa};gbZ_3q%4+st-xD8m zh?u$W6*gP2O=~}fUgjyrq|QsCAlU|NQtNJ-a!ROUuDA z_|-m!k&=2q#3vRS$7CZqHqxg``-Yr&yQ;_D_nY{yFRiddwX5Iy;_+^>b!n`fw20xA zGMi<3Q90jNrqZsRex<9q=J71?$DyR{v|U(IF~SmbtfaJf!e@ltb!>F~1#LvC9aL=9 zxNIfz`#x*j?RuD4F>7s}#YmRmzlN^_vot1djOH-*t!dI?`-tfSW7E8tQI1}0? zF2@r~%iK0h6xy~oa`i>Xj+|@eWNX1|=d0~BSMN{D0;hR}qio)Nh7g!-3)yL2aBgvq z?YC$M9neXL67^gDcA@u((v0T#OT|h|vc=hf-JqER6HKbY+K=wSk&&ri1RB3Z${Fd0 zYzG?-zocFHMm#<*xsbrv>i6QF+`*80_S4}DY{72tKj_VrK)&zxlG90k3pyQGLt_4G z+sB;PEchqz#VfOie)vHP6Q}lzfIi;gq5 z^0f_bGc~t}1>StW8ToXk!1m+QC83#spyH8h3&+1`YP9=y{bhCXyFZstKReCsG%d`T zgH0>UcK`G3f@dJXjxcNAD&U0&E-&Z$#&t^jaEMGj?||YLWZZ`DGq2!*ajj)~!!9z) zSLe)}8#C|mCMzK*N$1XO9Uj-nyLc2JE9fN@(EPor9HQog34(o{2tiR!2R;xnJm5|Q z+!dW29DE`63Lb7A-nMq2Tf&ZSL2wA=FJb?aho9U@fV+mX`+puU=k0BM-PX>^>MJQW z8s_BXC^{a_?moX4f(C+iBL*O7Hz5>q1D7e4{*pUc5Ukt@g{i8l3TFomks;clpwQ`o zQRqR}4p9%F{;qgP^iWXf^o0LN51{@)4+VuzPvnpE0O}9)P*CXfL{aEL#|Uxdo>2cj zdnhP$dSZX1cS8MpJroo=J@G%%JE8u)9tsMbp2Q#NolyT?4+VuzPx6oSPN;vchk}CE zJK6uk?3M-pf#1nK3~s-Cg8hx)X(T&l6c}2=f6_US7@}wb(AzvRLlhWV!++8|kQk!q z1JEr8nIQ@cts$!Z0bLCwh9}q`tYs7!T0>MVLq_uLje1e8lu3^8lq|^e`5$>e`1INLu>d? zItr4tjG{UG-C9P0p)&;kSx@hSu=UdI}gtbATQf zl5H6khSu=UdI}gtbNHJaqQcM`qUtHo)j-@*zyS6qYZ(QG)(}-sfvyG;!xQWewiFZ? zT0>MlTV1H6W6c}2=KkF%A6wLv8T*$T*6c}2=KkF%A6wTr93{hZc4gajCfKfCD z==371Aqotgq41yel;7CD-%_A43`|NaO5jii4^(d-p)Z$_`oW7A1e$Kb{C)Zj_{HyA zUD(NA(C^sNQHLd6Vki>5B|)H-Cm5iUlVg9~>cTRB=hLzF_R)8;_O$1>@%DsAeUFJ2 zTCqVOGphfb!22I6VGo50A!F}aeWfe|mRIiq&$7Bev0!AZ;_1;B?*aC!Cp`PjABq)5 z#?tE4MKfZ6Ko8QU;b)h=O88k+H0kcOIt! zoKGk`TNeYxiXmh5FHhr-l7m1MMeywPG$>Xa8B3DC%*}*!yf@0BSP5k8;Z%gI1~6V1 zgzT3w2|iPb6H6GZ9v-x7k&wLgfy{w*4I2_;HE0-V z!i2Wu_4GMGAUb_`Z4NDH7-_-Ql%)f}mlf2_tD_$<79}g%Pxa3ZY@72}^t-$14wnB%J}i+Lw!=VWbJG zed8W4ev=FN21WCX6^h>xco+HUx?WyPn+_pkN1d?ZVs)-D6{Fj7o7xZVXC zMw&1Z+2Hpl-5D`qy-%QE5u^#T`D%ve2xyygz-!agLc>TC)_QB0=Di9C)W{02UDf~% zBTbm@Y0q>lKwB3fVdcM|VWbJuR{S~44S?ia@Y)|iSpQp9B1jWfGn@{Y1GKp*;I+Zn z&@j@3!GD&)UsHp+uuGa)@Skh|KiP$UEye%fV>c|6udIN77U*M%lgs3P-Ri=eJg{J{ zfWVW`hgYzZ&kTTsy$phmg$?*SfQ7q;4i7^s!yX`Dd%`LU!K2UzT(HZP08m(Gv@ozU z`u|&9*fju#lSZIXTj#@BgW;{AD-CNsieQZvhP5X0La;`lQCrIcH1q{B;eT%J2cWRE zMhnAQmmyjs(5S8F;H*XdxiytHyfs=F)>;jK;Sz#CqqYtOXy{st!ds)xbsd5=S{T-P z4bd8bMs3XmfwdO<=hpfF3Y!qLFsyYn0K?T9fktiJ3TG|;&#iY6tkJ@-)|@^F)(A9e zYYTvePKd-mw@w03*jl57VXeCmtr2L{)<58^CI7j#pf9{NS{T;a9)RHzfB@ZBIqo+^K3jTGg3&Zh4@J7T@i^~Eyj5tD*g5Hn7ihBbrY)XXC(y-zs zNW>9v)Z#Pn;s|{Tx<$f@Q~D!_qorZR)c_hUDMAQ1YVj}thp9M1t3qAz21IeRG_3e0 z5^)3^wfMOJIB|q-g<9MgVBw;ImWCBi0BHD%BjBjTJK@C<8W!rPd`A>VOT&r_UPly1 zz)_1k0ys=m5PBBsie~~WT*cASu;N2V#1U}R;`o7Z;s|XEb;U0LESxx68dlr~py8u} zfTI>KgBM5WT&Tro5yjEcu;SD~h~fx1YH>{fhlvV8^Fke!TL24JakMn7cq0;V1RS;a zHk>&4Uvy5k8}Q=jX;^VnfQE|-B92--3BaK%4n}BRsH4(_D2|qf75{-m905lyE*uOe zj?lbNi#q`U_Xlv8 zs30^i)DBs?94!qi{u+rm0*+ez7rZz^^Fl2y z5{4j-mWCB~0ciNBAmFIQa{(Nt;t0(Pb;d^!#nIBR;zYL)#Sw7S;tBu`EiU{oI%fdD t!bSx>4J%%WD1L&U0 * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +# import Path +import FreeCAD as App +import PathScripts.PathLog as PathLog +import PathTests.PathTestUtils as PathTestUtils +import PathScripts.drillableLib as drillableLib + +PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) +PathLog.trackModule(PathLog.thisModule()) + + +class TestPathDrillable(PathTestUtils.PathTestBase): + def setUp(self): + self.doc = App.open(App.getHomePath() + "/Mod/Path/PathTests/Drilling_1.FCStd") + self.obj = self.doc.getObject("Pocket010") + + def tearDown(self): + App.closeDocument(self.doc.Name) + + def test00(self): + """Test CompareVecs""" + + # Vec and origin + v1 = App.Vector(0, 0, 10) + v2 = App.Vector(0, 0, 0) + self.assertTrue(drillableLib.compareVecs(v1, v2)) + + # two valid vectors + v1 = App.Vector(0, 10, 0) + v2 = App.Vector(0, 20, 0) + self.assertTrue(drillableLib.compareVecs(v1, v2)) + + # two valid vectors not aligned + v1 = App.Vector(0, 10, 0) + v2 = App.Vector(10, 0, 0) + self.assertFalse(drillableLib.compareVecs(v1, v2)) + + def test10(self): + """Test isDrillable""" + + # Invalid types + candidate = self.obj.getSubObject("Vertex1") + self.assertRaises( + TypeError, lambda: drillableLib.isDrillable(self.obj.Shape, candidate) + ) + + # # partial cylinder + # candidate = self.obj.getSubObject("Face10") + # self.assertRaises( + # TypeError, lambda: drillableLib.isDrillable(self.obj.Shape, candidate) + # ) + + # Test cylinder faces + + # thru-hole + candidate = self.obj.getSubObject("Face25") + + # Typical drilling + self.assertTrue(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Drilling with smaller bit + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, tooldiameter=20) + ) + + # Drilling with bit too large + self.assertFalse( + drillableLib.isDrillable(self.obj.Shape, candidate, tooldiameter=30) + ) + + # off-axis hole + candidate = self.obj.getSubObject("Face42") + + # Typical drilling + self.assertFalse(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # Passing explicit vector + self.assertTrue( + drillableLib.isDrillable( + self.obj.Shape, candidate, vector=App.Vector(0, 1, 0) + ) + ) + + # Drilling with smaller bit + self.assertTrue( + drillableLib.isDrillable( + self.obj.Shape, candidate, tooldiameter=10, vector=App.Vector(0, 1, 0) + ) + ) + + # Drilling with bit too large + self.assertFalse( + drillableLib.isDrillable( + self.obj.Shape, candidate, tooldiameter=30, vector=App.Vector(0, 1, 0) + ) + ) + + # ellipse hole + candidate = self.obj.getSubObject("Face20") + + # Typical drilling + self.assertFalse(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertFalse( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # raised cylinder + candidate = self.obj.getSubObject("Face30") + + # Typical drilling + self.assertFalse(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertFalse( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + + # cylinder on slope + candidate = self.obj.getSubObject("Face26") + # Typical drilling + self.assertTrue(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # Circular Faces + candidate = self.obj.getSubObject("Face51") + + # Typical drilling + self.assertTrue(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # Passing explicit vector + self.assertTrue( + drillableLib.isDrillable( + self.obj.Shape, candidate, vector=App.Vector(0, 0, 1) + ) + ) + + # Drilling with smaller bit + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, tooldiameter=10) + ) + + # Drilling with bit too large + self.assertFalse( + drillableLib.isDrillable(self.obj.Shape, candidate, tooldiameter=30) + ) + + # off-axis circular face hole + candidate = self.obj.getSubObject("Face54") + + # Typical drilling + self.assertFalse(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # Passing explicit vector + self.assertTrue( + drillableLib.isDrillable( + self.obj.Shape, candidate, vector=App.Vector(0, 1, 0) + ) + ) + + # raised face + candidate = self.obj.getSubObject("Face45") + # Typical drilling + self.assertTrue(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # interrupted Face + candidate = self.obj.getSubObject("Face46") + # Typical drilling + self.assertFalse(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertFalse( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # donut face + candidate = self.obj.getSubObject("Face44") + # Typical drilling + self.assertTrue(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # Test edges + # circular edge + candidate = self.obj.getSubObject("Edge53") + + # Typical drilling + self.assertTrue(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # Passing explicit vector + self.assertTrue( + drillableLib.isDrillable( + self.obj.Shape, candidate, vector=App.Vector(0, 0, 1) + ) + ) + + # Drilling with smaller bit + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, tooldiameter=10) + ) + + # Drilling with bit too large + self.assertFalse( + drillableLib.isDrillable(self.obj.Shape, candidate, tooldiameter=30) + ) + + # off-axis circular edge + candidate = self.obj.getSubObject("Edge72") + + # Typical drilling + self.assertFalse(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertTrue( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # Passing explicit vector + self.assertTrue( + drillableLib.isDrillable( + self.obj.Shape, candidate, vector=App.Vector(0, 1, 0) + ) + ) + + # incomplete circular edge + candidate = self.obj.getSubObject("Edge108") + # Typical drilling + self.assertFalse(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertFalse( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + # elliptical edge + candidate = self.obj.getSubObject("Edge54") + # Typical drilling + self.assertFalse(drillableLib.isDrillable(self.obj.Shape, candidate)) + + # Passing None as vector + self.assertFalse( + drillableLib.isDrillable(self.obj.Shape, candidate, vector=None) + ) + + + def test20(self): + """Test getDrillableTargets""" + results = drillableLib.getDrillableTargets(self.obj) + self.assertEqual(len(results), 15) + + results = drillableLib.getDrillableTargets(self.obj, vector=None) + self.assertEqual(len(results), 18) + + results = drillableLib.getDrillableTargets(self.obj, ToolDiameter= 20, vector=None) + self.assertEqual(len(results), 5) diff --git a/src/Mod/Path/PathTests/TestPathHelpers.py b/src/Mod/Path/PathTests/TestPathHelpers.py new file mode 100644 index 0000000000..6810c21f43 --- /dev/null +++ b/src/Mod/Path/PathTests/TestPathHelpers.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +# *************************************************************************** +# * Copyright (c) 2021 sliptonic * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +import FreeCAD +import PathFeedRate +import PathMachineState +import Path +import PathScripts.PathToolController as PathToolController + +from PathTests.PathTestUtils import PathTestBase + + +class TestPathHelpers(PathTestBase): + def setUp(self): + self.doc = FreeCAD.newDocument("TestPathUtils") + + c1 = Path.Command("G0 Z10") + c2 = Path.Command("G0 X20 Y10") + c3 = Path.Command("G1 X20 Y10 Z5") + c4 = Path.Command("G1 X20 Y20") + + self.commandlist = [c1, c2, c3, c4] + + def tearDown(self): + FreeCAD.closeDocument("TestPathUtils") + + def test00(self): + """Test that FeedRate Helper populates horiz and vert feed rate based on TC""" + t = Path.Tool("test", "5.0") + tc = PathToolController.Create("TC0", t) + tc.VertRapid = 5 + tc.HorizRapid = 10 + tc.VertFeed = 15 + tc.HorizFeed = 20 + + resultlist = PathFeedRate.setFeedRate(self.commandlist, tc) + + self.assertTrue(resultlist[0].Parameters["F"] == 5) + self.assertTrue(resultlist[1].Parameters["F"] == 10) + self.assertTrue(resultlist[2].Parameters["F"] == 15) + self.assertTrue(resultlist[3].Parameters["F"] == 20) + + def test01(self): + """Test that Machine State initializes and stores position correctly""" + + machine = PathMachineState.MachineState() + state = machine.getState() + self.assertTrue(state['X'] == 0 ) + self.assertTrue(state['Y'] == 0 ) + self.assertTrue(state['Z'] == 0 ) + self.assertTrue(machine.WCS == "G54") + + for c in self.commandlist: + result = machine.addCommand(c) + + state = machine.getState() + self.assertTrue(state['X'] == 20 ) + self.assertTrue(state['Y'] == 20 ) + self.assertTrue(state['Z'] == 5 ) + + machine.addCommand(Path.Command("M3 S200")) + self.assertTrue(machine.S == 200) + self.assertTrue(machine.Spindle == "CW") + + machine.addCommand(Path.Command("M4 S200")) + self.assertTrue(machine.Spindle == "CCW") + + machine.addCommand(Path.Command("M2")) + self.assertTrue(machine.Spindle == "off") + self.assertTrue(machine.S == 0) + + machine.addCommand(Path.Command("G57")) + self.assertTrue(machine.WCS == "G57") + + machine.addCommand(Path.Command("M6 T5")) + self.assertTrue(machine.T == 5) + + # Test that non-change commands return false + result = machine.addCommand(Path.Command("G0 X20")) + self.assertFalse(result) + + result = machine.addCommand(Path.Command("G0 X30")) + self.assertTrue(result) + diff --git a/src/Mod/Path/TestPathApp.py b/src/Mod/Path/TestPathApp.py index 6f34e71c5a..37091fb6a2 100644 --- a/src/Mod/Path/TestPathApp.py +++ b/src/Mod/Path/TestPathApp.py @@ -22,6 +22,8 @@ import TestApp +# from PathTests.TestPathHelix import TestPathHelix +# from PathTests.TestPathPost import PathPostTestCases from PathTests.TestPathAdaptive import TestPathAdaptive from PathTests.TestPathCore import TestPathCore from PathTests.TestPathDeburr import TestPathDeburr @@ -30,12 +32,12 @@ from PathTests.TestPathDressupDogbone import TestDressupDogbone from PathTests.TestPathDressupHoldingTags import TestHoldingTags from PathTests.TestPathDrillGenerator import TestPathDrillGenerator from PathTests.TestPathGeom import TestPathGeom -# from PathTests.TestPathHelix import TestPathHelix +from PathTests.TestPathHelpers import TestPathHelpers from PathTests.TestPathLog import TestPathLog from PathTests.TestPathOpTools import TestPathOpTools -# from PathTests.TestPathPost import PathPostTestCases from PathTests.TestPathPreferences import TestPathPreferences from PathTests.TestPathPropertyBag import TestPathPropertyBag +from PathTests.TestPathRotationGenerator import TestPathRotationGenerator from PathTests.TestPathSetupSheet import TestPathSetupSheet from PathTests.TestPathStock import TestPathStock from PathTests.TestPathThreadMilling import TestPathThreadMilling @@ -57,10 +59,12 @@ False if TestPathCore.__name__ else True False if TestPathDeburr.__name__ else True False if TestPathGeom.__name__ else True # False if TestPathHelix.__name__ else True +False if TestPathHelpers.__name__ else True False if TestPathLog.__name__ else True False if TestPathOpTools.__name__ else True False if TestPathPreferences.__name__ else True False if TestPathPropertyBag.__name__ else True +False if TestPathRotationGenerator.__name__ else True False if TestPathSetupSheet.__name__ else True False if TestPathStock.__name__ else True False if TestPathThreadMilling.__name__ else True From 18582ff9aff5c060f0b7acb6c604d987457f6c4e Mon Sep 17 00:00:00 2001 From: sliptonic Date: Sun, 5 Dec 2021 20:16:23 -0600 Subject: [PATCH 05/12] Make CircularHoleBase use drillableLib debugs remove deprecated PathUtils.isDrillable drillableLib cmake make PathProfile use new drillableLib --- src/Mod/Path/CMakeLists.txt | 3 + .../Path/PathScripts/PathCircularHoleBase.py | 101 ++--------- src/Mod/Path/PathScripts/PathDrilling.py | 8 +- src/Mod/Path/PathScripts/PathJob.py | 3 + src/Mod/Path/PathScripts/PathProfile.py | 3 +- src/Mod/Path/PathScripts/PathSelection.py | 167 +++++++++--------- src/Mod/Path/PathScripts/PathUtils.py | 113 ------------ src/Mod/Path/PathTests/TestPathDrillable.py | 7 +- src/Mod/Path/TestPathApp.py | 18 +- 9 files changed, 133 insertions(+), 290 deletions(-) diff --git a/src/Mod/Path/CMakeLists.txt b/src/Mod/Path/CMakeLists.txt index 728e8fe0ea..96156db6d1 100644 --- a/src/Mod/Path/CMakeLists.txt +++ b/src/Mod/Path/CMakeLists.txt @@ -27,6 +27,7 @@ INSTALL( SET(PathScripts_SRCS PathCommands.py + PathScripts/drillableLib.py PathScripts/PathAdaptive.py PathScripts/PathAdaptiveGui.py PathScripts/PathAreaOp.py @@ -211,6 +212,7 @@ SET(Tools_Shape_SRCS SET(PathTests_SRCS PathTests/__init__.py PathTests/boxtest.fcstd + PathTests/Drilling_1.FCStd PathTests/PathTestUtils.py PathTests/test_adaptive.fcstd PathTests/test_centroid_00.ngc @@ -224,6 +226,7 @@ SET(PathTests_SRCS PathTests/TestPathDressupDogbone.py PathTests/TestPathDressupHoldingTags.py PathTests/TestPathDrillGenerator.py + PathTests/TestPathDrillable.py PathTests/TestPathRotationGenerator.py PathTests/TestPathGeom.py PathTests/TestPathHelix.py diff --git a/src/Mod/Path/PathScripts/PathCircularHoleBase.py b/src/Mod/Path/PathScripts/PathCircularHoleBase.py index 9e5253e474..30c1c78d4d 100644 --- a/src/Mod/Path/PathScripts/PathCircularHoleBase.py +++ b/src/Mod/Path/PathScripts/PathCircularHoleBase.py @@ -23,7 +23,9 @@ import FreeCAD import PathScripts.PathLog as PathLog import PathScripts.PathOp as PathOp -import PathScripts.PathUtils as PathUtils + +# import PathScripts.PathUtils as PathUtils +import PathScripts.drillableLib as drillableLib from PySide import QtCore @@ -46,9 +48,11 @@ def translate(context, text, disambig=None): return QtCore.QCoreApplication.translate(context, text, disambig) -PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -# PathLog.trackModule(PathLog.thisModule()) - +if False: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) class ObjectOp(PathOp.ObjectOp): """Base class for proxy objects of all operations on circular holes.""" @@ -172,7 +176,6 @@ class ObjectOp(PathOp.ObjectOp): return False holes = [] - for base, subs in obj.Base: for sub in subs: PathLog.debug("processing {} in {}".format(sub, base.Name)) @@ -204,85 +207,19 @@ class ObjectOp(PathOp.ObjectOp): def findAllHoles(self, obj): """findAllHoles(obj) ... find all holes of all base models and assign as features.""" PathLog.track() - if not self.getJob(obj): + job = self.getJob(obj) + if not job: return + + matchvector = None if job.JobType == "Multiaxis" else FreeCAD.Vector(0, 0, 1) + tooldiameter = obj.ToolController.Tool.Diameter + features = [] for base in self.model: - features.extend(self.findHoles(obj, base)) + features.extend( + drillableLib.getDrillableTargets( + base, ToolDiameter=tooldiameter, vector=matchvector + ) + ) obj.Base = features obj.Disabled = [] - - def findHoles(self, obj, baseobject): - """findHoles(obj, baseobject) ... inspect baseobject and identify all features that resemble a straight cricular hole.""" - shape = baseobject.Shape - PathLog.track("obj: {} shape: {}".format(obj, shape)) - holelist = [] - features = [] - # tooldiameter = float(obj.ToolController.Proxy.getTool(obj.ToolController).Diameter) - tooldiameter = None - PathLog.debug( - "search for holes larger than tooldiameter: {}: ".format(tooldiameter) - ) - if DraftGeomUtils.isPlanar(shape): - PathLog.debug("shape is planar") - for i in range(len(shape.Edges)): - candidateEdgeName = "Edge" + str(i + 1) - e = shape.getElement(candidateEdgeName) - if PathUtils.isDrillable(shape, e, tooldiameter): - PathLog.debug( - "edge candidate: {} (hash {})is drillable ".format( - e, e.hashCode() - ) - ) - x = e.Curve.Center.x - y = e.Curve.Center.y - diameter = e.BoundBox.XLength - holelist.append( - { - "featureName": candidateEdgeName, - "feature": e, - "x": x, - "y": y, - "d": diameter, - "enabled": True, - } - ) - features.append((baseobject, candidateEdgeName)) - PathLog.debug( - "Found hole feature %s.%s" - % (baseobject.Label, candidateEdgeName) - ) - else: - PathLog.debug("shape is not planar") - for i in range(len(shape.Faces)): - candidateFaceName = "Face" + str(i + 1) - f = shape.getElement(candidateFaceName) - if PathUtils.isDrillable(shape, f, tooldiameter): - PathLog.debug("face candidate: {} is drillable ".format(f)) - if hasattr(f.Surface, "Center"): - x = f.Surface.Center.x - y = f.Surface.Center.y - diameter = f.BoundBox.XLength - else: - center = f.Edges[0].Curve.Center - x = center.x - y = center.y - diameter = f.Edges[0].Curve.Radius * 2 - holelist.append( - { - "featureName": candidateFaceName, - "feature": f, - "x": x, - "y": y, - "d": diameter, - "enabled": True, - } - ) - features.append((baseobject, candidateFaceName)) - PathLog.debug( - "Found hole feature %s.%s" - % (baseobject.Label, candidateFaceName) - ) - - PathLog.debug("holes found: {}".format(holelist)) - return features diff --git a/src/Mod/Path/PathScripts/PathDrilling.py b/src/Mod/Path/PathScripts/PathDrilling.py index f7b626cf48..17ef9bc6d3 100644 --- a/src/Mod/Path/PathScripts/PathDrilling.py +++ b/src/Mod/Path/PathScripts/PathDrilling.py @@ -43,9 +43,11 @@ __doc__ = "Path Drilling operation." __contributors__ = "IMBack!" -PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) -PathLog.trackModule(PathLog.thisModule()) - +if False: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) # Qt translation handling def translate(context, text, disambig=None): diff --git a/src/Mod/Path/PathScripts/PathJob.py b/src/Mod/Path/PathScripts/PathJob.py index 6235f7a96f..5f21da0c40 100644 --- a/src/Mod/Path/PathScripts/PathJob.py +++ b/src/Mod/Path/PathScripts/PathJob.py @@ -187,6 +187,7 @@ class ObjectJob: "Base", QtCore.QT_TRANSLATE_NOOP("PathJob", "Select the Type of Job"), ) + obj.setEditorMode("JobType", 2) # Hide obj.addProperty( "App::PropertyBool", @@ -494,6 +495,8 @@ class ObjectJob: "Base", QtCore.QT_TRANSLATE_NOOP("PathJob", "Select the Type of Job"), ) + obj.setEditorMode("JobType", 2) # Hide + obj.JobType = ["2D", "2.5D", "Lathe", "Multiaxis"] def onChanged(self, obj, prop): diff --git a/src/Mod/Path/PathScripts/PathProfile.py b/src/Mod/Path/PathScripts/PathProfile.py index d5afb71e21..76f6840a86 100644 --- a/src/Mod/Path/PathScripts/PathProfile.py +++ b/src/Mod/Path/PathScripts/PathProfile.py @@ -28,6 +28,7 @@ import PathScripts.PathAreaOp as PathAreaOp import PathScripts.PathLog as PathLog import PathScripts.PathOp as PathOp import PathScripts.PathUtils as PathUtils +import PathScripts.drillableLib as drillableLib import math import numpy from PySide.QtCore import QT_TRANSLATE_NOOP @@ -444,7 +445,7 @@ class ObjectProfile(PathAreaOp.ObjectOp): for baseShape, wire in holes: cont = False f = Part.makeFace(wire, "Part::FaceMakerSimple") - drillable = PathUtils.isDrillable(baseShape, wire) + drillable = drillableLib.isDrillable(baseShape, f) if obj.processCircles: if drillable: diff --git a/src/Mod/Path/PathScripts/PathSelection.py b/src/Mod/Path/PathScripts/PathSelection.py index 8f0725407b..2c640aaca2 100644 --- a/src/Mod/Path/PathScripts/PathSelection.py +++ b/src/Mod/Path/PathScripts/PathSelection.py @@ -21,13 +21,13 @@ # * * # *************************************************************************** -'''Selection gates and observers to control selectability while building Path operations ''' +"""Selection gates and observers to control selectability while building Path operations """ import FreeCAD import FreeCADGui import PathScripts.PathLog as PathLog import PathScripts.PathPreferences as PathPreferences -import PathScripts.PathUtils as PathUtils +import PathScripts.drillableLib as drillableLib import math PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) @@ -41,12 +41,12 @@ class PathBaseGate(object): class EGate(PathBaseGate): def allow(self, doc, obj, sub): # pylint: disable=unused-argument - return sub and sub[0:4] == 'Edge' + return sub and sub[0:4] == "Edge" class MESHGate(PathBaseGate): def allow(self, doc, obj, sub): # pylint: disable=unused-argument - return obj.TypeId[0:4] == 'Mesh' + return obj.TypeId[0:4] == "Mesh" class VCARVEGate: @@ -59,20 +59,20 @@ class VCARVEGate: if math.fabs(shape.Volume) < 1e-9 and len(shape.Wires) > 0: return True - if shape.ShapeType == 'Face': + if shape.ShapeType == "Face": return True - elif shape.ShapeType == 'Solid': - if sub and sub[0:4] == 'Face': + elif shape.ShapeType == "Solid": + if sub and sub[0:4] == "Face": return True - elif shape.ShapeType == 'Compound': - if sub and sub[0:4] == 'Face': + elif shape.ShapeType == "Compound": + if sub and sub[0:4] == "Face": return True if sub: subShape = shape.getElement(sub) - if subShape.ShapeType == 'Edge': + if subShape.ShapeType == "Edge": return False return False @@ -88,35 +88,35 @@ class ENGRAVEGate(PathBaseGate): if math.fabs(shape.Volume) < 1e-9 and len(shape.Wires) > 0: return True - if shape.ShapeType == 'Edge': + if shape.ShapeType == "Edge": return True if sub: subShape = shape.getElement(sub) - if subShape.ShapeType == 'Edge': + if subShape.ShapeType == "Edge": return True return False class CHAMFERGate(PathBaseGate): - def allow(self, doc, obj, sub): # pylint: disable=unused-argument + def allow(self, doc, obj, sub): # pylint: disable=unused-argument try: shape = obj.Shape - except Exception: # pylint: disable=broad-except + except Exception: # pylint: disable=broad-except return False if math.fabs(shape.Volume) < 1e-9 and len(shape.Wires) > 0: return True - if 'Edge' == shape.ShapeType or 'Face' == shape.ShapeType: + if "Edge" == shape.ShapeType or "Face" == shape.ShapeType: return True if sub: subShape = shape.getElement(sub) - if subShape.ShapeType == 'Edge': + if subShape.ShapeType == "Edge": return True - elif (subShape.ShapeType == 'Face'): + elif subShape.ShapeType == "Face": return True return False @@ -124,16 +124,19 @@ class CHAMFERGate(PathBaseGate): class DRILLGate(PathBaseGate): def allow(self, doc, obj, sub): # pylint: disable=unused-argument - PathLog.debug('obj: {} sub: {}'.format(obj, sub)) - if hasattr(obj, "Shape") and sub: - shape = obj.Shape - subobj = shape.getElement(sub) - return PathUtils.isDrillable(shape, subobj, includePartials=True) - else: + PathLog.debug("obj: {} sub: {}".format(obj, sub)) + if not hasattr(obj, "Shape") and sub: return False + shape = obj.Shape + subobj = shape.getElement(sub) + if subobj.ShapeType not in ["Edge", "Face"]: + return False + return drillableLib.isDrillable(shape, subobj, vector=None) -class FACEGate(PathBaseGate): # formerly PROFILEGate class using allow_ORIG method as allow() +class FACEGate( + PathBaseGate +): # formerly PROFILEGate class using allow_ORIG method as allow() def allow(self, doc, obj, sub): # pylint: disable=unused-argument profileable = False @@ -142,15 +145,15 @@ class FACEGate(PathBaseGate): # formerly PROFILEGate class using allow_ORIG me except Exception: # pylint: disable=broad-except return False - if obj.ShapeType == 'Compound': - if sub and sub[0:4] == 'Face': + if obj.ShapeType == "Compound": + if sub and sub[0:4] == "Face": profileable = True - elif obj.ShapeType == 'Face': # 3D Face, not flat, planar? - profileable = True # Was False + elif obj.ShapeType == "Face": # 3D Face, not flat, planar? + profileable = True # Was False - elif obj.ShapeType == 'Solid': - if sub and sub[0:4] == 'Face': + elif obj.ShapeType == "Solid": + if sub and sub[0:4] == "Face": profileable = True return profileable @@ -163,27 +166,27 @@ class FACEGate(PathBaseGate): # formerly PROFILEGate class using allow_ORIG me except Exception: # pylint: disable=broad-except return False - if obj.ShapeType == 'Edge': + if obj.ShapeType == "Edge": profileable = False - elif obj.ShapeType == 'Compound': - if sub and sub[0:4] == 'Face': + elif obj.ShapeType == "Compound": + if sub and sub[0:4] == "Face": profileable = True - if sub and sub[0:4] == 'Edge': + if sub and sub[0:4] == "Edge": profileable = False - elif obj.ShapeType == 'Face': + elif obj.ShapeType == "Face": profileable = False - elif obj.ShapeType == 'Solid': - if sub and sub[0:4] == 'Face': + elif obj.ShapeType == "Solid": + if sub and sub[0:4] == "Face": profileable = True - if sub and sub[0:4] == 'Edge': + if sub and sub[0:4] == "Edge": profileable = False - elif obj.ShapeType == 'Wire': + elif obj.ShapeType == "Wire": profileable = False return profileable @@ -191,7 +194,7 @@ class FACEGate(PathBaseGate): # formerly PROFILEGate class using allow_ORIG me class PROFILEGate(PathBaseGate): def allow(self, doc, obj, sub): # pylint: disable=unused-argument - if sub and sub[0:4] == 'Edge': + if sub and sub[0:4] == "Edge": return True try: @@ -199,18 +202,18 @@ class PROFILEGate(PathBaseGate): except Exception: # pylint: disable=broad-except return False - if obj.ShapeType == 'Compound': - if sub and sub[0:4] == 'Face': + if obj.ShapeType == "Compound": + if sub and sub[0:4] == "Face": return True - elif obj.ShapeType == 'Face': + elif obj.ShapeType == "Face": return True - elif obj.ShapeType == 'Solid': - if sub and sub[0:4] == 'Face': + elif obj.ShapeType == "Solid": + if sub and sub[0:4] == "Face": return True - elif obj.ShapeType == 'Wire': + elif obj.ShapeType == "Wire": return True return False @@ -225,18 +228,18 @@ class POCKETGate(PathBaseGate): except Exception: # pylint: disable=broad-except return False - if obj.ShapeType == 'Edge': + if obj.ShapeType == "Edge": pocketable = False - elif obj.ShapeType == 'Face': + elif obj.ShapeType == "Face": pocketable = True - elif obj.ShapeType == 'Solid': - if sub and sub[0:4] == 'Face': + elif obj.ShapeType == "Solid": + if sub and sub[0:4] == "Face": pocketable = True - elif obj.ShapeType == 'Compound': - if sub and sub[0:4] == 'Face': + elif obj.ShapeType == "Compound": + if sub and sub[0:4] == "Face": pocketable = True return pocketable @@ -266,22 +269,22 @@ class PROBEGate: class TURNGate(PathBaseGate): def allow(self, doc, obj, sub): # pylint: disable=unused-argument - PathLog.debug('obj: {} sub: {}'.format(obj, sub)) + PathLog.debug("obj: {} sub: {}".format(obj, sub)) if hasattr(obj, "Shape") and sub: shape = obj.Shape subobj = shape.getElement(sub) - return PathUtils.isDrillable(shape, subobj, includePartials=True) + return drillableLib.isDrillable(shape, subobj, vector=None) else: return False class ALLGate(PathBaseGate): def allow(self, doc, obj, sub): # pylint: disable=unused-argument - if sub and sub[0:6] == 'Vertex': + if sub and sub[0:6] == "Vertex": return True - if sub and sub[0:4] == 'Edge': + if sub and sub[0:4] == "Edge": return True - if sub and sub[0:4] == 'Face': + if sub and sub[0:4] == "Face": return True return False @@ -348,7 +351,7 @@ def slotselect(): def surfaceselect(): gate = False - if(MESHGate() or FACEGate()): + if MESHGate() or FACEGate(): gate = True FreeCADGui.Selection.addSelectionGate(gate) if not PathPreferences.suppressSelectionModeWarning(): @@ -380,30 +383,30 @@ def turnselect(): def select(op): opsel = {} - opsel['Contour'] = contourselect # (depreciated) - opsel['Deburr'] = chamferselect - opsel['Drilling'] = drillselect - opsel['Engrave'] = engraveselect - opsel['Helix'] = drillselect - opsel['MillFace'] = pocketselect - opsel['Pocket'] = pocketselect - opsel['Pocket 3D'] = pocketselect - opsel['Pocket Shape'] = pocketselect - opsel['Profile Edges'] = eselect # (depreciated) - opsel['Profile Faces'] = fselect # (depreciated) - opsel['Profile'] = profileselect - opsel['Slot'] = slotselect - opsel['Surface'] = surfaceselect - opsel['Waterline'] = surfaceselect - opsel['Adaptive'] = adaptiveselect - opsel['Vcarve'] = vcarveselect - opsel['Probe'] = probeselect - opsel['Custom'] = customselect - opsel['Thread Milling'] = drillselect - opsel['TurnFace'] = turnselect - opsel['TurnProfile'] = turnselect - opsel['TurnPartoff'] = turnselect - opsel['TurnRough'] = turnselect + opsel["Contour"] = contourselect # (depreciated) + opsel["Deburr"] = chamferselect + opsel["Drilling"] = drillselect + opsel["Engrave"] = engraveselect + opsel["Helix"] = drillselect + opsel["MillFace"] = pocketselect + opsel["Pocket"] = pocketselect + opsel["Pocket 3D"] = pocketselect + opsel["Pocket Shape"] = pocketselect + opsel["Profile Edges"] = eselect # (depreciated) + opsel["Profile Faces"] = fselect # (depreciated) + opsel["Profile"] = profileselect + opsel["Slot"] = slotselect + opsel["Surface"] = surfaceselect + opsel["Waterline"] = surfaceselect + opsel["Adaptive"] = adaptiveselect + opsel["Vcarve"] = vcarveselect + opsel["Probe"] = probeselect + opsel["Custom"] = customselect + opsel["Thread Milling"] = drillselect + opsel["TurnFace"] = turnselect + opsel["TurnProfile"] = turnselect + opsel["TurnPartoff"] = turnselect + opsel["TurnRough"] = turnselect return opsel[op] diff --git a/src/Mod/Path/PathScripts/PathUtils.py b/src/Mod/Path/PathScripts/PathUtils.py index 4d4f2426fb..54ad03832b 100644 --- a/src/Mod/Path/PathScripts/PathUtils.py +++ b/src/Mod/Path/PathScripts/PathUtils.py @@ -73,119 +73,6 @@ def waiting_effects(function): return new_function -def isDrillable(obj, candidate, tooldiameter=None, includePartials=False): - """ - Checks candidates to see if they can be drilled. - Candidates can be either faces - circular or cylindrical or circular edges. - The tooldiameter can be optionally passed. if passed, the check will return - False for any holes smaller than the tooldiameter. - obj=Shape - candidate = Face or Edge - tooldiameter=float - """ - PathLog.track( - "obj: {} candidate: {} tooldiameter {}".format(obj, candidate, tooldiameter) - ) - if list == type(obj): - for shape in obj: - if isDrillable(shape, candidate, tooldiameter, includePartials): - return (True, shape) - return (False, None) - - drillable = False - try: - if candidate.ShapeType == "Face": - face = candidate - # eliminate flat faces - if (round(face.ParameterRange[0], 8) == 0.0) and ( - round(face.ParameterRange[1], 8) == round(math.pi * 2, 8) - ): - for ( - edge - ) in face.Edges: # Find seam edge and check if aligned to Z axis. - if isinstance(edge.Curve, Part.Line): - PathLog.debug("candidate is a circle") - v0 = edge.Vertexes[0].Point - v1 = edge.Vertexes[1].Point - # check if the cylinder seam is vertically aligned. Eliminate tilted holes - if ( - numpy.isclose(v1.sub(v0).x, 0, rtol=1e-05, atol=1e-06) - ) and (numpy.isclose(v1.sub(v0).y, 0, rtol=1e-05, atol=1e-06)): - drillable = True - # vector of top center - lsp = Vector( - face.BoundBox.Center.x, - face.BoundBox.Center.y, - face.BoundBox.ZMax, - ) - # vector of bottom center - lep = Vector( - face.BoundBox.Center.x, - face.BoundBox.Center.y, - face.BoundBox.ZMin, - ) - # check if the cylindrical 'lids' are inside the base - # object. This eliminates extruded circles but allows - # actual holes. - if obj.isInside(lsp, 1e-6, False) or obj.isInside( - lep, 1e-6, False - ): - PathLog.track( - "inside check failed. lsp: {} lep: {}".format( - lsp, lep - ) - ) - drillable = False - # eliminate elliptical holes - elif not hasattr(face.Surface, "Radius"): - PathLog.debug("candidate face has no radius attribute") - drillable = False - else: - if tooldiameter is not None: - drillable = face.Surface.Radius >= tooldiameter / 2 - else: - drillable = True - elif type(face.Surface) == Part.Plane and PathGeom.pointsCoincide( - face.Surface.Axis, FreeCAD.Vector(0, 0, 1) - ): - if len(face.Edges) == 1 and type(face.Edges[0].Curve) == Part.Circle: - center = face.Edges[0].Curve.Center - if obj.isInside(center, 1e-6, False): - if tooldiameter is not None: - drillable = face.Edges[0].Curve.Radius >= tooldiameter / 2 - else: - drillable = True - else: - for edge in candidate.Edges: - if isinstance(edge.Curve, Part.Circle) and ( - includePartials or edge.isClosed() - ): - PathLog.debug("candidate is a circle or ellipse") - if not hasattr(edge.Curve, "Radius"): - PathLog.debug("No radius. Ellipse.") - drillable = False - else: - PathLog.debug("Has Radius, Circle") - if tooldiameter is not None: - drillable = edge.Curve.Radius >= tooldiameter / 2 - if not drillable: - FreeCAD.Console.PrintMessage( - "Found a drillable hole with diameter: {}: " - "too small for the current tool with " - "diameter: {}".format( - edge.Curve.Radius * 2, tooldiameter - ) - ) - else: - drillable = True - PathLog.debug("candidate is drillable: {}".format(drillable)) - except Exception as ex: # pylint: disable=broad-except - PathLog.warning( - translate("Path", "Issue determine drillability: {}").format(ex) - ) - return drillable - - # set at 4 decimal places for testing def fmt(val): return format(val, ".4f") diff --git a/src/Mod/Path/PathTests/TestPathDrillable.py b/src/Mod/Path/PathTests/TestPathDrillable.py index c1eb7cc0dc..76728b0149 100644 --- a/src/Mod/Path/PathTests/TestPathDrillable.py +++ b/src/Mod/Path/PathTests/TestPathDrillable.py @@ -26,9 +26,12 @@ import PathScripts.PathLog as PathLog import PathTests.PathTestUtils as PathTestUtils import PathScripts.drillableLib as drillableLib -PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -PathLog.trackModule(PathLog.thisModule()) +if False: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) class TestPathDrillable(PathTestUtils.PathTestBase): def setUp(self): diff --git a/src/Mod/Path/TestPathApp.py b/src/Mod/Path/TestPathApp.py index 37091fb6a2..b8f7dda9a0 100644 --- a/src/Mod/Path/TestPathApp.py +++ b/src/Mod/Path/TestPathApp.py @@ -22,19 +22,20 @@ import TestApp -# from PathTests.TestPathHelix import TestPathHelix -# from PathTests.TestPathPost import PathPostTestCases from PathTests.TestPathAdaptive import TestPathAdaptive from PathTests.TestPathCore import TestPathCore from PathTests.TestPathDeburr import TestPathDeburr from PathTests.TestPathDepthParams import depthTestCases from PathTests.TestPathDressupDogbone import TestDressupDogbone from PathTests.TestPathDressupHoldingTags import TestHoldingTags +from PathTests.TestPathDrillable import TestPathDrillable from PathTests.TestPathDrillGenerator import TestPathDrillGenerator from PathTests.TestPathGeom import TestPathGeom +# from PathTests.TestPathHelix import TestPathHelix from PathTests.TestPathHelpers import TestPathHelpers from PathTests.TestPathLog import TestPathLog from PathTests.TestPathOpTools import TestPathOpTools +# from PathTests.TestPathPost import PathPostTestCases from PathTests.TestPathPreferences import TestPathPreferences from PathTests.TestPathPropertyBag import TestPathPropertyBag from PathTests.TestPathRotationGenerator import TestPathRotationGenerator @@ -50,18 +51,21 @@ from PathTests.TestPathVcarve import TestPathVcarve from PathTests.TestPathVoronoi import TestPathVoronoi # dummy usage to get flake8 and lgtm quiet -False if depthTestCases.__name__ else True False if TestApp.__name__ else True -False if TestDressupDogbone.__name__ else True -False if TestHoldingTags.__name__ else True False if TestPathAdaptive.__name__ else True False if TestPathCore.__name__ else True False if TestPathDeburr.__name__ else True -False if TestPathGeom.__name__ else True +False if depthTestCases.__name__ else True +False if TestDressupDogbone.__name__ else True +False if TestHoldingTags.__name__ else True # False if TestPathHelix.__name__ else True +False if TestPathDrillable.__name__ else True +False if TestPathDrillGenerator.__name__ else True +False if TestPathGeom.__name__ else True False if TestPathHelpers.__name__ else True False if TestPathLog.__name__ else True False if TestPathOpTools.__name__ else True +# False if TestPathPost.__name__ else True False if TestPathPreferences.__name__ else True False if TestPathPropertyBag.__name__ else True False if TestPathRotationGenerator.__name__ else True @@ -75,4 +79,4 @@ False if TestPathTooltable.__name__ else True False if TestPathUtil.__name__ else True False if TestPathVcarve.__name__ else True False if TestPathVoronoi.__name__ else True -False if TestPathDrillGenerator.__name__ else True + From 95a83c811b4bd1fa06db148dfc226f33e56a89ff Mon Sep 17 00:00:00 2001 From: sliptonic Date: Wed, 22 Dec 2021 18:09:52 -0600 Subject: [PATCH 06/12] fix feedrate update Fix machinestate to handle drill moves and tests move feed and rapid declarations to PathGeom --- src/Mod/Path/PathFeedRate.py | 18 +++++++++++------- src/Mod/Path/PathMachineState.py | 17 +++++++++++++++++ src/Mod/Path/PathScripts/PathGeom.py | 3 ++- src/Mod/Path/PathTests/TestPathHelpers.py | 8 ++++++++ 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/Mod/Path/PathFeedRate.py b/src/Mod/Path/PathFeedRate.py index bd33265aab..06962d60e1 100644 --- a/src/Mod/Path/PathFeedRate.py +++ b/src/Mod/Path/PathFeedRate.py @@ -25,6 +25,7 @@ import PathScripts.PathLog as PathLog import PathMachineState import PathScripts.PathGeom as PathGeom import Part +from PathScripts.PathGeom import CmdMoveRapid, CmdMoveAll __title__ = "Feed Rate Helper Utility" __author__ = "sliptonic (Brad Collette)" @@ -43,6 +44,12 @@ else: def setFeedRate(commandlist, ToolController): + """Set the appropriate feed rate for a list of Path commands using the information from a Tool Controler + + Every motion command in the list will have a feed rate parameter added or overwritten based + on the information stored in the tool controller. If a motion is a plunge (vertical) motion, the + VertFeed value will be used, otherwise the HorizFeed value will be used instead.""" + def _isVertical(currentposition, command): x = ( command.Parameters["X"] @@ -64,25 +71,22 @@ def setFeedRate(commandlist, ToolController): return True return PathGeom.isVertical(Part.makeLine(currentposition, endpoint)) - feedcommands = ["G01", "G1", "G2", "G3", "G02", "G03", "G81", "G82", "G83"] - rapidcommands = ["G0", "G00"] - machine = PathMachineState.MachineState() for command in commandlist: - if command.Name not in feedcommands + rapidcommands: + if command.Name not in CmdMoveAll: continue - if _isVertical(FreeCAD.Vector(machine.X, machine.Y, machine.Z), command): + if _isVertical(machine.getPosition(), command): rate = ( ToolController.VertRapid.Value - if command.Name in rapidcommands + if command.Name in CmdMoveRapid else ToolController.VertFeed.Value ) else: rate = ( ToolController.HorizRapid.Value - if command.Name in rapidcommands + if command.Name in CmdMoveRapid else ToolController.HorizFeed.Value ) diff --git a/src/Mod/Path/PathMachineState.py b/src/Mod/Path/PathMachineState.py index e57ebb9476..2e64dc4b97 100644 --- a/src/Mod/Path/PathMachineState.py +++ b/src/Mod/Path/PathMachineState.py @@ -29,6 +29,7 @@ __contributors__ = "" import PathScripts.PathLog as PathLog import FreeCAD from dataclasses import dataclass, field +from PathScripts.PathGeom import CmdMoveRapid, CmdMoveAll, CmdMoveDrill if True: PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) @@ -92,6 +93,13 @@ class MachineState: self.WCS = command.Name return not oldstate == self.getState() + if command.Name in CmdMoveDrill: + oldZ = self.Z + for p in command.Parameters: + self.__setattr__(p, command.Parameters[p]) + self.__setattr__("Z", oldZ) + return not oldstate == self.getState() + for p in command.Parameters: self.__setattr__(p, command.Parameters[p]) @@ -116,3 +124,12 @@ class MachineState: state['T'] = self.T return state + + def getPosition(self): + """ + Returns a vector of the current machine position + """ + + # This is technical debt. The actual position may include a rotation + # component as well. We should probably be returning a placement + return FreeCAD.Vector(self.X, self.Y, self.Z) diff --git a/src/Mod/Path/PathScripts/PathGeom.py b/src/Mod/Path/PathScripts/PathGeom.py index bf45ca4141..7c8ab9681e 100644 --- a/src/Mod/Path/PathScripts/PathGeom.py +++ b/src/Mod/Path/PathScripts/PathGeom.py @@ -87,8 +87,9 @@ CmdMoveRapid = ["G0", "G00"] CmdMoveStraight = ["G1", "G01"] CmdMoveCW = ["G2", "G02"] CmdMoveCCW = ["G3", "G03"] +CmdMoveDrill = ["G81", "G82", "G83"] CmdMoveArc = CmdMoveCW + CmdMoveCCW -CmdMove = CmdMoveStraight + CmdMoveArc +CmdMove = CmdMoveStraight + CmdMoveArc + CmdMoveDrill CmdMoveAll = CmdMove + CmdMoveRapid diff --git a/src/Mod/Path/PathTests/TestPathHelpers.py b/src/Mod/Path/PathTests/TestPathHelpers.py index 6810c21f43..3ac42e0273 100644 --- a/src/Mod/Path/PathTests/TestPathHelpers.py +++ b/src/Mod/Path/PathTests/TestPathHelpers.py @@ -53,6 +53,7 @@ class TestPathHelpers(PathTestBase): tc.HorizFeed = 20 resultlist = PathFeedRate.setFeedRate(self.commandlist, tc) + print(resultlist) self.assertTrue(resultlist[0].Parameters["F"] == 5) self.assertTrue(resultlist[1].Parameters["F"] == 10) @@ -101,3 +102,10 @@ class TestPathHelpers(PathTestBase): result = machine.addCommand(Path.Command("G0 X30")) self.assertTrue(result) + # Test that Drilling moves are handled correctly + result = machine.addCommand(Path.Command("G81 X50 Y50 Z0")) + state = machine.getState() + self.assertTrue(state['X'] == 50 ) + self.assertTrue(state['Y'] == 50 ) + self.assertTrue(state['Z'] == 5 ) + From 97e943896012ade7559cbf43d53491e8a0661464 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Sun, 16 Jan 2022 09:50:06 -0600 Subject: [PATCH 07/12] Removed F words. Various fixes from code review --- src/Mod/Path/PathScripts/PathDrilling.py | 18 +++++++----------- src/Mod/Path/PathScripts/drillableLib.py | 18 ++++++++++-------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathDrilling.py b/src/Mod/Path/PathScripts/PathDrilling.py index 17ef9bc6d3..0d9c40a9f6 100644 --- a/src/Mod/Path/PathScripts/PathDrilling.py +++ b/src/Mod/Path/PathScripts/PathDrilling.py @@ -144,9 +144,7 @@ class ObjectDrilling(PathCircularHoleBase.ObjectOp): self.commandlist.append(Path.Command("(Begin Drilling)")) # rapid to clearance height - command = Path.Command( - "G0", {"Z": obj.ClearanceHeight.Value, "F": self.vertRapid} - ) + command = Path.Command("G0", {"Z": obj.ClearanceHeight.Value}) machine.addCommand(command) self.commandlist.append(command) @@ -184,19 +182,15 @@ class ObjectDrilling(PathCircularHoleBase.ObjectOp): # move to hole location - command = Path.Command( - "G0", {"X": hole["x"], "Y": hole["y"], "F": self.horizRapid} - ) + command = Path.Command("G0", {"X": hole["x"], "Y": hole["y"]}) self.commandlist.append(command) machine.addCommand(command) - command = Path.Command("G0", {"Z": startHeight, "F": self.vertRapid}) + command = Path.Command("G0", {"Z": startHeight}) self.commandlist.append(command) machine.addCommand(command) - command = Path.Command( - "G1", {"Z": obj.StartDepth.Value, "F": self.vertFeed} - ) + command = Path.Command("G1", {"Z": obj.StartDepth.Value}) self.commandlist.append(command) machine.addCommand(command) @@ -216,7 +210,9 @@ class ObjectDrilling(PathCircularHoleBase.ObjectOp): PathLog.info(e) continue - self.commandlist.extend(drillcommands) + for command in drillcommands: + self.commandlist.append(command) + machine.addCommand(command) # Cancel canned drilling cycle self.commandlist.append(Path.Command("G80")) diff --git a/src/Mod/Path/PathScripts/drillableLib.py b/src/Mod/Path/PathScripts/drillableLib.py index 4e8dd59342..7a5fe4108b 100644 --- a/src/Mod/Path/PathScripts/drillableLib.py +++ b/src/Mod/Path/PathScripts/drillableLib.py @@ -10,6 +10,7 @@ if False: else: PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) + def isDrillableCylinder(obj, candidate, tooldiameter=None, vector=App.Vector(0, 0, 1)): """ checks if a candidate cylindrical face is drillable @@ -55,7 +56,7 @@ def isDrillableCylinder(obj, candidate, tooldiameter=None, vector=App.Vector(0, if not candidate.ShapeType == "Face": raise TypeError("expected a Face") - if not str(candidate.Surface) == "": + if not isinstance(candidate.Surface, Part.Cylinder): raise TypeError("expected a cylinder") if len(candidate.Edges) != 3: @@ -174,9 +175,8 @@ def isDrillable(obj, candidate, tooldiameter=None, vector=App.Vector(0, 0, 1)): raise TypeError("expected a Face or Edge. Got a {}".format(candidate.ShapeType)) try: - if ( - candidate.ShapeType == "Face" - and str(candidate.Surface) == "" + if candidate.ShapeType == "Face" and isinstance( + candidate.Surface, Part.Cylinder ): return isDrillableCylinder(obj, candidate, tooldiameter, vector) else: @@ -215,21 +215,23 @@ def getDrillableTargets(obj, ToolDiameter=None, vector=App.Vector(0, 0, 1)): results = [] for i in range(1, len(shp.Faces)): - fname = 'Face{}'.format(i) + fname = "Face{}".format(i) PathLog.debug(fname) candidate = obj.getSubObject(fname) - if not str(candidate.Surface) == '': + if not isinstance(candidate.Surface, Part.Cylinder): continue try: - drillable = isDrillable(shp, candidate, tooldiameter=ToolDiameter, vector=vector) + drillable = isDrillable( + shp, candidate, tooldiameter=ToolDiameter, vector=vector + ) PathLog.debug("fname: {} : drillable {}".format(fname, drillable)) except Exception as e: PathLog.debug(e) continue if drillable: - results.append((obj,fname)) + results.append((obj, fname)) return results From f737930d2f4ef14daa94660ba603dd63b33afe51 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Sun, 16 Jan 2022 12:37:14 -0600 Subject: [PATCH 08/12] Test case for filterArcs --- src/Mod/Path/PathTests/TestPathHelpers.py | 48 ++++++++++++++++++----- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Mod/Path/PathTests/TestPathHelpers.py b/src/Mod/Path/PathTests/TestPathHelpers.py index 3ac42e0273..653fafabad 100644 --- a/src/Mod/Path/PathTests/TestPathHelpers.py +++ b/src/Mod/Path/PathTests/TestPathHelpers.py @@ -21,10 +21,13 @@ # *************************************************************************** import FreeCAD +import Part +import Path import PathFeedRate import PathMachineState -import Path +import PathScripts.PathGeom as PathGeom import PathScripts.PathToolController as PathToolController +import PathScripts.PathUtils as PathUtils from PathTests.PathTestUtils import PathTestBase @@ -65,18 +68,18 @@ class TestPathHelpers(PathTestBase): machine = PathMachineState.MachineState() state = machine.getState() - self.assertTrue(state['X'] == 0 ) - self.assertTrue(state['Y'] == 0 ) - self.assertTrue(state['Z'] == 0 ) + self.assertTrue(state["X"] == 0) + self.assertTrue(state["Y"] == 0) + self.assertTrue(state["Z"] == 0) self.assertTrue(machine.WCS == "G54") for c in self.commandlist: result = machine.addCommand(c) state = machine.getState() - self.assertTrue(state['X'] == 20 ) - self.assertTrue(state['Y'] == 20 ) - self.assertTrue(state['Z'] == 5 ) + self.assertTrue(state["X"] == 20) + self.assertTrue(state["Y"] == 20) + self.assertTrue(state["Z"] == 5) machine.addCommand(Path.Command("M3 S200")) self.assertTrue(machine.S == 200) @@ -105,7 +108,32 @@ class TestPathHelpers(PathTestBase): # Test that Drilling moves are handled correctly result = machine.addCommand(Path.Command("G81 X50 Y50 Z0")) state = machine.getState() - self.assertTrue(state['X'] == 50 ) - self.assertTrue(state['Y'] == 50 ) - self.assertTrue(state['Z'] == 5 ) + self.assertTrue(state["X"] == 50) + self.assertTrue(state["Y"] == 50) + self.assertTrue(state["Z"] == 5) + def test02(self): + """Test PathUtils filterarcs""" + + # filter a full circle + c = Part.Circle() + c.Radius = 5 + edge = c.toShape() + + results = PathUtils.filterArcs(edge) + self.assertTrue(len(results) == 2) + e1 = results[0] + self.assertTrue(isinstance(e1.Curve, Part.Circle)) + self.assertTrue(PathGeom.pointsCoincide(edge.Curve.Location, e1.Curve.Location)) + self.assertTrue(edge.Curve.Radius == e1.Curve.Radius) + + # filter a 180 degree arc + results = PathUtils.filterArcs(e1) + self.assertTrue(len(results) == 1) + + # Handle a straight segment + v1 = FreeCAD.Vector(0, 0, 0) + v2 = FreeCAD.Vector(10, 0, 0) + l = Part.makeLine(v1, v2) + results = PathUtils.filterArcs(l) + self.assertTrue(len(results) == 0) From ad296ee060805984cd4e58b180e5ef1d0f195c20 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Sun, 16 Jan 2022 12:39:39 -0600 Subject: [PATCH 09/12] Refactor filter arcs. Slightly more readable. Avoids error with missing variable. --- src/Mod/Path/PathScripts/PathUtils.py | 44 +++++++++++++-------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathUtils.py b/src/Mod/Path/PathScripts/PathUtils.py index 54ad03832b..2cb2adf3bb 100644 --- a/src/Mod/Path/PathScripts/PathUtils.py +++ b/src/Mod/Path/PathScripts/PathUtils.py @@ -176,31 +176,30 @@ def horizontalFaceLoop(obj, face, faceList=None): def filterArcs(arcEdge): - """filterArcs(Edge) -used to split arcs that over 180 degrees. Returns list""" + """filterArcs(Edge) -used to split an arc that is over 180 degrees. Returns list""" PathLog.track() - s = arcEdge - if isinstance(s.Curve, Part.Circle): - splitlist = [] - angle = abs(s.LastParameter - s.FirstParameter) - # overhalfcircle = False - goodarc = False - if angle > math.pi: - pass - # overhalfcircle = True + splitlist = [] + if isinstance(arcEdge.Curve, Part.Circle): + angle = abs(arcEdge.LastParameter - arcEdge.FirstParameter) # Angle in radians + goodarc = angle <= math.pi + + if goodarc: + splitlist.append(arcEdge) else: - goodarc = True - if not goodarc: - arcstpt = s.valueAt(s.FirstParameter) - arcmid = s.valueAt( - (s.LastParameter - s.FirstParameter) * 0.5 + s.FirstParameter + arcstpt = arcEdge.valueAt(arcEdge.FirstParameter) + arcmid = arcEdge.valueAt( + (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.5 + + arcEdge.FirstParameter ) - arcquad1 = s.valueAt( - (s.LastParameter - s.FirstParameter) * 0.25 + s.FirstParameter + arcquad1 = arcEdge.valueAt( + (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.25 + + arcEdge.FirstParameter ) # future midpt for arc1 - arcquad2 = s.valueAt( - (s.LastParameter - s.FirstParameter) * 0.75 + s.FirstParameter + arcquad2 = arcEdge.valueAt( + (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.75 + + arcEdge.FirstParameter ) # future midpt for arc2 - arcendpt = s.valueAt(s.LastParameter) + arcendpt = arcEdge.valueAt(arcEdge.LastParameter) # reconstruct with 2 arcs arcseg1 = Part.ArcOfCircle(arcstpt, arcquad1, arcmid) arcseg2 = Part.ArcOfCircle(arcmid, arcquad2, arcendpt) @@ -209,9 +208,8 @@ def filterArcs(arcEdge): eseg2 = arcseg2.toShape() splitlist.append(eseg1) splitlist.append(eseg2) - else: - splitlist.append(s) - elif isinstance(s.Curve, Part.LineSegment): + + elif isinstance(arcEdge.Curve, Part.LineSegment): pass return splitlist From d121e27694f829d21d83ea8dd4e56eb5c9bbe8bd Mon Sep 17 00:00:00 2001 From: sliptonic Date: Sun, 16 Jan 2022 12:57:49 -0600 Subject: [PATCH 10/12] rename function. 'job' has a meaning in Path. sort_jobs doesn't sort jobs, it sorts hole locations. --- src/Mod/Path/PathScripts/PathAreaOp.py | 8 ++++---- src/Mod/Path/PathScripts/PathDrilling.py | 2 +- src/Mod/Path/PathScripts/PathHelix.py | 4 ++-- src/Mod/Path/PathScripts/PathUtils.py | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathAreaOp.py b/src/Mod/Path/PathScripts/PathAreaOp.py index 483560e865..026a8e487f 100644 --- a/src/Mod/Path/PathScripts/PathAreaOp.py +++ b/src/Mod/Path/PathScripts/PathAreaOp.py @@ -327,21 +327,21 @@ class ObjectOp(PathOp.ObjectOp): shapes.append(shp) if len(shapes) > 1: - jobs = list() + locations = [] for s in shapes: if s[2] == 'OpenEdge': shp = Part.makeCompound(s[0]) else: shp = s[0] - jobs.append({ + locations.append({ 'x': shp.BoundBox.XMax, 'y': shp.BoundBox.YMax, 'shape': s }) - jobs = PathUtils.sort_jobs(jobs, ['x', 'y']) + locations = PathUtils.sort_locations(locations, ['x', 'y']) - shapes = [j['shape'] for j in jobs] + shapes = [j['shape'] for j in locations] sims = [] for shape, isHole, sub in shapes: diff --git a/src/Mod/Path/PathScripts/PathDrilling.py b/src/Mod/Path/PathScripts/PathDrilling.py index 0d9c40a9f6..4f845a145b 100644 --- a/src/Mod/Path/PathScripts/PathDrilling.py +++ b/src/Mod/Path/PathScripts/PathDrilling.py @@ -160,7 +160,7 @@ class ObjectDrilling(PathCircularHoleBase.ObjectOp): # http://linuxcnc.org/docs/html/gcode/g-code.html#gcode:g98-g99 self.commandlist.append(Path.Command(obj.ReturnLevel)) - holes = PathUtils.sort_jobs(holes, ["x", "y"]) + holes = PathUtils.sort_locations(holes, ["x", "y"]) # This section is technical debt. The computation of the # target shapes should be factored out for re-use. diff --git a/src/Mod/Path/PathScripts/PathHelix.py b/src/Mod/Path/PathScripts/PathHelix.py index a19910ed8c..cdf3a24faf 100644 --- a/src/Mod/Path/PathScripts/PathHelix.py +++ b/src/Mod/Path/PathScripts/PathHelix.py @@ -29,7 +29,7 @@ import PathScripts.PathOp as PathOp from PathScripts.PathUtils import fmt from PathScripts.PathUtils import findParentJob -from PathScripts.PathUtils import sort_jobs +from PathScripts.PathUtils import sort_locations from PySide import QtCore __title__ = "Path Helix Drill Operation" @@ -79,7 +79,7 @@ class ObjectHelix(PathCircularHoleBase.ObjectOp): output = '' output += "G0 Z" + fmt(zsafe) - holes = sort_jobs(holes, ['x', 'y']) + holes = sort_locations(holes, ['x', 'y']) for hole in holes: output += self.helix_cut(obj, hole['x'], hole['y'], hole['r'] / 2, float(obj.StartRadius.Value), (float(obj.StepOver.Value) / 50.0) * self.radius) PathLog.debug(output) diff --git a/src/Mod/Path/PathScripts/PathUtils.py b/src/Mod/Path/PathScripts/PathUtils.py index 2cb2adf3bb..cd2448a5ab 100644 --- a/src/Mod/Path/PathScripts/PathUtils.py +++ b/src/Mod/Path/PathScripts/PathUtils.py @@ -639,7 +639,7 @@ def rampPlunge(edge, rampangle, destZ, startZ): return rampCmds -def sort_jobs(locations, keys, attractors=None): +def sort_locations(locations, keys, attractors=None): """sort holes by the nearest neighbor method keys: two-element list of keys for X and Y coordinates. for example ['x','y'] originally written by m0n5t3r for PathHelix From d21b1921aa543df3b1d8c7d7e9e194852a868a8d Mon Sep 17 00:00:00 2001 From: sliptonic Date: Sun, 16 Jan 2022 13:06:33 -0600 Subject: [PATCH 11/12] Remove deprecated code --- src/Mod/Path/PathScripts/PathUtils.py | 193 -------------------------- 1 file changed, 193 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathUtils.py b/src/Mod/Path/PathScripts/PathUtils.py index cd2448a5ab..68689684f7 100644 --- a/src/Mod/Path/PathScripts/PathUtils.py +++ b/src/Mod/Path/PathScripts/PathUtils.py @@ -446,199 +446,6 @@ def addToJob(obj, jobname=None): return job -def rapid(x=None, y=None, z=None): - """Returns gcode string to perform a rapid move.""" - retstr = "G00" - if (x is not None) or (y is not None) or (z is not None): - if x is not None: - retstr += " X" + str("%.4f" % x) - if y is not None: - retstr += " Y" + str("%.4f" % y) - if z is not None: - retstr += " Z" + str("%.4f" % z) - else: - return "" - return retstr + "\n" - - -def feed(x=None, y=None, z=None, horizFeed=0, vertFeed=0): - """Return gcode string to perform a linear feed.""" - retstr = "G01 F" - if (x is None) and (y is None): - retstr += str("%.4f" % horizFeed) - else: - retstr += str("%.4f" % vertFeed) - - if (x is not None) or (y is not None) or (z is not None): - if x is not None: - retstr += " X" + str("%.4f" % x) - if y is not None: - retstr += " Y" + str("%.4f" % y) - if z is not None: - retstr += " Z" + str("%.4f" % z) - else: - return "" - return retstr + "\n" - - -def arc(cx, cy, sx, sy, ex, ey, horizFeed=0, ez=None, ccw=False): - """ - Return gcode string to perform an arc. - - Assumes XY plane or helix around Z - Don't worry about starting Z- assume that's dealt with elsewhere - If start/end radii aren't within eps, abort. - - cx, cy -- arc center coordinates - sx, sy -- arc start coordinates - ex, ey -- arc end coordinates - ez -- ending Z coordinate. None unless helix. - horizFeed -- horiz feed speed - ccw -- arc direction - """ - - eps = 0.01 - if ( - math.sqrt((cx - sx) ** 2 + (cy - sy) ** 2) - - math.sqrt((cx - ex) ** 2 + (cy - ey) ** 2) - ) >= eps: - PathLog.error(translate("Path", "Illegal arc: Start and end radii not equal")) - return "" - - retstr = "" - if ccw: - retstr += "G03 F" + str(horizFeed) - else: - retstr += "G02 F" + str(horizFeed) - - retstr += " X" + str("%.4f" % ex) + " Y" + str("%.4f" % ey) - - if ez is not None: - retstr += " Z" + str("%.4f" % ez) - - retstr += " I" + str("%.4f" % (cx - sx)) + " J" + str("%.4f" % (cy - sy)) - - return retstr + "\n" - - -def helicalPlunge(plungePos, rampangle, destZ, startZ, toold, plungeR, horizFeed): - """ - Return gcode string to perform helical entry move. - - plungePos -- vector of the helical entry location - destZ -- the lowest Z position or milling level - startZ -- Starting Z position for helical move - rampangle -- entry angle - toold -- tool diameter - plungeR -- the radius of the entry helix - """ - # toold = self.radius * 2 - - helixCmds = "(START HELICAL PLUNGE)\n" - if plungePos is None: - raise Exception("Helical plunging requires a position!") - - helixX = plungePos.x + toold / 2 * plungeR - helixY = plungePos.y - - helixCirc = math.pi * toold * plungeR - dzPerRev = math.sin(rampangle / 180.0 * math.pi) * helixCirc - - # Go to the start of the helix position - helixCmds += rapid(helixX, helixY) - helixCmds += rapid(z=startZ) - - # Helix as required to get to the requested depth - lastZ = startZ - curZ = max(startZ - dzPerRev, destZ) - done = False - while not done: - done = curZ == destZ - # NOTE: FreeCAD doesn't render this, but at least LinuxCNC considers it valid - # helixCmds += arc(plungePos.x, plungePos.y, helixX, helixY, helixX, helixY, ez = curZ, ccw=True) - - # Use two half-helixes; FreeCAD renders that correctly, - # and it fits with the other code breaking up 360-degree arcs - helixCmds += arc( - plungePos.x, - plungePos.y, - helixX, - helixY, - helixX - toold * plungeR, - helixY, - horizFeed, - ez=(curZ + lastZ) / 2.0, - ccw=True, - ) - helixCmds += arc( - plungePos.x, - plungePos.y, - helixX - toold * plungeR, - helixY, - helixX, - helixY, - horizFeed, - ez=curZ, - ccw=True, - ) - lastZ = curZ - curZ = max(curZ - dzPerRev, destZ) - - return helixCmds - - -def rampPlunge(edge, rampangle, destZ, startZ): - """ - Return gcode string to linearly ramp down to milling level. - - edge -- edge to follow - rampangle -- entry angle - destZ -- Final Z depth - startZ -- Starting Z depth - - FIXME: This ramps along the first edge, assuming it's long - enough, NOT just wiggling back and forth by ~0.75 * toolD. - Not sure if that's any worse, but it's simpler - I think this should be changed to be limited to a maximum ramp size. Otherwise machine time will get longer than it needs to be. - """ - - rampCmds = "(START RAMP PLUNGE)\n" - if edge is None: - raise Exception("Ramp plunging requires an edge!") - - sPoint = edge.Vertexes[0].Point - ePoint = edge.Vertexes[1].Point - # Evidently edges can get flipped- pick the right one in this case - if ePoint == sPoint: - # print "FLIP" - ePoint = edge.Vertexes[-1].Point - - rampDist = edge.Length - rampDZ = math.sin(rampangle / 180.0 * math.pi) * rampDist - - rampCmds += rapid(sPoint.x, sPoint.y) - rampCmds += rapid(z=startZ) - - # Ramp down to the requested depth - - curZ = max(startZ - rampDZ, destZ) - done = False - while not done: - done = curZ == destZ - - # If it's an arc, handle it! - if isinstance(edge.Curve, Part.Circle): - raise Exception("rampPlunge: Screw it, not handling an arc.") - # Straight feed! Easy! - else: - rampCmds += feed(ePoint.x, ePoint.y, curZ) - rampCmds += feed(sPoint.x, sPoint.y) - - curZ = max(curZ - rampDZ, destZ) - - return rampCmds - - def sort_locations(locations, keys, attractors=None): """sort holes by the nearest neighbor method keys: two-element list of keys for X and Y coordinates. for example ['x','y'] From e0a59129cf27e9b4a22e9bdb2e66fb9210a5a22d Mon Sep 17 00:00:00 2001 From: sliptonic Date: Sun, 16 Jan 2022 13:16:23 -0600 Subject: [PATCH 12/12] cleanup imports Remove py2 test for Queue. --- src/Mod/Path/PathScripts/PathUtils.py | 50 ++++++++++++--------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathUtils.py b/src/Mod/Path/PathScripts/PathUtils.py index 68689684f7..63e42f3330 100644 --- a/src/Mod/Path/PathScripts/PathUtils.py +++ b/src/Mod/Path/PathScripts/PathUtils.py @@ -20,19 +20,17 @@ # * * # *************************************************************************** """PathUtils -common functions used in PathScripts for filtering, sorting, and generating gcode toolpath data """ + import FreeCAD -import Path - -# import PathScripts -import PathScripts.PathJob as PathJob -import PathScripts.PathGeom as PathGeom -import math -import numpy - from FreeCAD import Vector from PathScripts import PathLog from PySide import QtCore from PySide import QtGui +import Path +import PathScripts.PathGeom as PathGeom +import PathScripts.PathJob as PathJob +import math +from numpy import linspace # lazily loaded modules from lazy_loader.lazy_loader import LazyLoader @@ -149,7 +147,7 @@ def horizontalFaceLoop(obj, face, faceList=None): # verify they form a valid hole by getting the outline and comparing # the resulting XY footprint with that of the faces comp = Part.makeCompound([obj.Shape.getElement(f) for f in faces]) - outline = TechDraw.findShapeOutline(comp, 1, FreeCAD.Vector(0, 0, 1)) + outline = TechDraw.findShapeOutline(comp, 1, Vector(0, 0, 1)) # findShapeOutline always returns closed wires, by removing the # trace-backs single edge spikes don't contribute to the bound box @@ -188,16 +186,16 @@ def filterArcs(arcEdge): else: arcstpt = arcEdge.valueAt(arcEdge.FirstParameter) arcmid = arcEdge.valueAt( - (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.5 + - arcEdge.FirstParameter + (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.5 + + arcEdge.FirstParameter ) arcquad1 = arcEdge.valueAt( - (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.25 + - arcEdge.FirstParameter + (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.25 + + arcEdge.FirstParameter ) # future midpt for arc1 arcquad2 = arcEdge.valueAt( - (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.75 + - arcEdge.FirstParameter + (arcEdge.LastParameter - arcEdge.FirstParameter) * 0.75 + + arcEdge.FirstParameter ) # future midpt for arc2 arcendpt = arcEdge.valueAt(arcEdge.LastParameter) # reconstruct with 2 arcs @@ -219,9 +217,7 @@ def makeWorkplane(shape): Creates a workplane circle at the ZMin level. """ PathLog.track() - loc = FreeCAD.Vector( - shape.BoundBox.Center.x, shape.BoundBox.Center.y, shape.BoundBox.ZMin - ) + loc = Vector(shape.BoundBox.Center.x, shape.BoundBox.Center.y, shape.BoundBox.ZMin) c = Part.makeCircle(10, loc) return c @@ -273,11 +269,11 @@ def getEnvelope(partshape, subshape=None, depthparams=None): eLength = partshape.BoundBox.ZLength - sec.BoundBox.ZMin # Shift the section based on selection and depthparams. - newPlace = FreeCAD.Placement(FreeCAD.Vector(0, 0, zShift), sec.Placement.Rotation) + newPlace = FreeCAD.Placement(Vector(0, 0, zShift), sec.Placement.Rotation) sec.Placement = newPlace # Extrude the section to top of Boundbox or desired height - envelopeshape = sec.extrude(FreeCAD.Vector(0, 0, eLength)) + envelopeshape = sec.extrude(Vector(0, 0, eLength)) if PathLog.getLevel(PathLog.thisModule()) == PathLog.Level.DEBUG: removalshape = FreeCAD.ActiveDocument.addObject("Part::Feature", "Envelope") removalshape.Shape = envelopeshape @@ -451,13 +447,11 @@ def sort_locations(locations, keys, attractors=None): keys: two-element list of keys for X and Y coordinates. for example ['x','y'] originally written by m0n5t3r for PathHelix """ + from queue import PriorityQueue + from collections import defaultdict + if attractors is None: attractors = [] - try: - from queue import PriorityQueue - except ImportError: - from Queue import PriorityQueue - from collections import defaultdict attractors = attractors or [keys[0]] @@ -724,7 +718,7 @@ class depth_params(object): than max_size.""" steps_needed = math.ceil((start - stop) / max_size) - depths = list(numpy.linspace(stop, start, steps_needed, endpoint=False)) + depths = list(linspace(stop, start, steps_needed, endpoint=False)) return depths @@ -736,7 +730,7 @@ class depth_params(object): fullsteps = int((start - stop) / size) last_step = start - (fullsteps * size) - depths = list(numpy.linspace(last_step, start, fullsteps, endpoint=False)) + depths = list(linspace(last_step, start, fullsteps, endpoint=False)) if last_step == stop: return depths @@ -800,7 +794,7 @@ def RtoIJ(startpoint, command): chord = endpoint.sub(startpoint) # Take its perpendicular (we assume the arc is in the XY plane) - perp = chord.cross(FreeCAD.Vector(0, 0, 1)) + perp = chord.cross(Vector(0, 0, 1)) # use pythagoras to get the perp length plength = math.sqrt(radius ** 2 - (chord.Length / 2) ** 2)