From f0601e27eccd477ef9773cccc319665ba007c635 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Wed, 24 Jun 2026 23:54:45 -0500 Subject: [PATCH] The Plum --- .github/workflows/compile_bluescreens.yaml | 4 + common/params_keys.h | 1 + .../opendbc/car/hyundai/carcontroller.py | 36 +++++-- .../opendbc/car/hyundai/hyundaicanfd.py | 30 +++++- opendbc_repo/opendbc/car/hyundai/interface.py | 5 +- .../opendbc/car/hyundai/tests/test_hyundai.py | 97 +++++++++++++++++- opendbc_repo/opendbc/car/hyundai/values.py | 4 +- opendbc_repo/opendbc/car/toyota/interface.py | 7 +- .../opendbc/car/toyota/tests/test_toyota.py | 18 ++++ .../opendbc/safety/modes/hyundai_canfd.h | 24 ++++- .../safety/tests/test_hyundai_canfd.py | 55 ++++++++++ panda/SConscript | 4 + panda/board/main.c | 14 ++- panda/board/main_comms.h | 2 +- .../obj/panda_can_ignition_only.bin.signed | Bin 0 -> 84552 bytes .../obj/panda_h7_can_ignition_only.bin.signed | Bin 0 -> 101576 bytes ...nda_h7_remote_can_ignition_only.bin.signed | Bin 0 -> 101512 bytes .../panda_remote_can_ignition_only.bin.signed | Bin 0 -> 84512 bytes selfdrive/controls/lib/latcontrol_torque.py | 38 +++---- selfdrive/pandad/panda.cc | 11 +- selfdrive/pandad/pandad.cc | 17 ++- selfdrive/pandad/pandad.py | 49 ++++++--- .../ui/layouts/settings/starpilot/vehicle.py | 36 ++++++- starpilot/common/starpilot_utilities.py | 27 ++++- starpilot/common/starpilot_variables.py | 1 + .../tools/device_settings_layout.json | 7 ++ starpilot/ui/qt/offroad/vehicle_settings.cc | 39 ++++--- starpilot/ui/qt/offroad/vehicle_settings.h | 2 +- tools/StarPilot/feasibleparams.txt | 1 + 29 files changed, 446 insertions(+), 83 deletions(-) create mode 100644 panda/board/obj/panda_can_ignition_only.bin.signed create mode 100644 panda/board/obj/panda_h7_can_ignition_only.bin.signed create mode 100644 panda/board/obj/panda_h7_remote_can_ignition_only.bin.signed create mode 100644 panda/board/obj/panda_remote_can_ignition_only.bin.signed diff --git a/.github/workflows/compile_bluescreens.yaml b/.github/workflows/compile_bluescreens.yaml index c17cf0830..184bc96fc 100644 --- a/.github/workflows/compile_bluescreens.yaml +++ b/.github/workflows/compile_bluescreens.yaml @@ -165,6 +165,10 @@ jobs: "panda/board/obj/panda_h7.bin.signed" "panda/board/obj/panda_remote.bin.signed" "panda/board/obj/panda_h7_remote.bin.signed" + "panda/board/obj/panda_can_ignition_only.bin.signed" + "panda/board/obj/panda_h7_can_ignition_only.bin.signed" + "panda/board/obj/panda_remote_can_ignition_only.bin.signed" + "panda/board/obj/panda_h7_remote_can_ignition_only.bin.signed" "panda/board/obj/panda_jungle_h7.bin.signed" "panda/board/obj/body_h7.bin.signed" ) diff --git a/common/params_keys.h b/common/params_keys.h index f46414262..988da57aa 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -286,6 +286,7 @@ inline static std::unordered_map keys = { {"FlashPanda", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}}, {"GMDashSpoofOffsets", {PERSISTENT, BOOL, "0", "0", 2}}, {"GMPedalLongitudinal", {PERSISTENT, BOOL, "1", "1", 2}}, + {"IgnoreIgnitionLine", {PERSISTENT, BOOL, "0", "0"}}, {"LongPitch", {PERSISTENT, BOOL, "1", "0", 2}}, {"RemoteStartBootsComma", {PERSISTENT, BOOL, "0", "0"}}, {"RemapCancelToDistance", {PERSISTENT, BOOL, "0", "0"}}, diff --git a/opendbc_repo/opendbc/car/hyundai/carcontroller.py b/opendbc_repo/opendbc/car/hyundai/carcontroller.py index 12befdac3..d8201bbc7 100644 --- a/opendbc_repo/opendbc/car/hyundai/carcontroller.py +++ b/opendbc_repo/opendbc/car/hyundai/carcontroller.py @@ -4,7 +4,7 @@ import numpy as np from opendbc.can import CANPacker from opendbc.car import Bus, DT_CTRL, make_tester_present_msg, rate_limit, structs from opendbc.car.common.filter_simple import FirstOrderFilter -from opendbc.car.lateral import apply_driver_steer_torque_limits, apply_steer_angle_limits_vm, common_fault_avoidance +from opendbc.car.lateral import apply_driver_steer_torque_limits, apply_steer_angle_limits_vm, common_fault_avoidance, get_max_angle_delta_vm from opendbc.car.common.conversions import Conversions as CV from opendbc.car.hyundai import hyundaicanfd, hyundaican from opendbc.car.hyundai.hyundaicanfd import CanBus @@ -64,6 +64,10 @@ REDNECK_BUTTON_COPIES_TIME = 7 REDNECK_BUTTON_COPIES_TIME_IMPERIAL = [REDNECK_BUTTON_COPIES_TIME + 3, 70] REDNECK_BUTTON_COPIES_TIME_METRIC = [REDNECK_BUTTON_COPIES_TIME, 40] ANGLE_SAFETY_BASELINE_MODEL = str(CAR.KIA_SPORTAGE_HEV_2026) +DEFAULT_ANGLE_SMOOTHING_VEGO_BP = [5.0, 10.0, 20.0] +DEFAULT_ANGLE_SMOOTHING_ALPHA_V = [0.2, 0.1, 0.0] +KIA_EV9_ANGLE_SMOOTHING_VEGO_BP = [0.0, 8.5, 11.0, 13.8, 18.0] +KIA_EV9_ANGLE_SMOOTHING_ALPHA_V = [0.05, 0.1, 0.3, 0.6, 1.0] def egmp_dynamic_longitudinal_tuning(CP) -> bool: @@ -220,6 +224,22 @@ def get_baseline_safety_cp(): return CarInterface.get_non_essential_params(ANGLE_SAFETY_BASELINE_MODEL) +def get_angle_smoothing_alpha(CP, v_ego: float) -> float: + if CP.carFingerprint == CAR.KIA_EV9: + return float(np.interp(v_ego, KIA_EV9_ANGLE_SMOOTHING_VEGO_BP, KIA_EV9_ANGLE_SMOOTHING_ALPHA_V)) + return float(np.interp(v_ego, DEFAULT_ANGLE_SMOOTHING_VEGO_BP, DEFAULT_ANGLE_SMOOTHING_ALPHA_V)) + + +def apply_steer_angle_limits_vm_checked(apply_angle: float, apply_angle_last: float, v_ego_raw: float, + steering_angle: float, lat_active: bool, limits, VM: VehicleModel) -> float | None: + new_apply_angle = apply_steer_angle_limits_vm(apply_angle, apply_angle_last, v_ego_raw, steering_angle, lat_active, limits, VM) + v_ego_raw = max(v_ego_raw, 1.0) + max_angle_delta = min(get_max_angle_delta_vm(v_ego_raw, VM, limits), limits.ANGLE_LIMITS.MAX_ANGLE_RATE) + safety_violation = lat_active and not np.isclose(new_apply_angle, + rate_limit(new_apply_angle, apply_angle_last, -max_angle_delta, max_angle_delta)) + return None if safety_violation else new_apply_angle + + def compute_torque_reduction_gain(steering_torque, v_ego, lat_active, last_gain): if lat_active: ceiling = np.interp(v_ego, [0.5, 1.5], [1.0, 0.85]) @@ -382,15 +402,16 @@ class CarController(CarControllerBase): -self.params.ANGLE_LIMITS.STEER_ANGLE_MAX, self.params.ANGLE_LIMITS.STEER_ANGLE_MAX)) - self.angle_filter.update_alpha(float(np.interp(CS.out.vEgo, [5.0, 10.0, 20.0], [0.2, 0.1, 0.0]))) + self.angle_filter.update_alpha(get_angle_smoothing_alpha(self.CP, CS.out.vEgo)) desired_angle = self.angle_filter.update(desired_angle) - apply_angle = apply_steer_angle_limits_vm(desired_angle, self.apply_angle_last, v_ego_raw, - CS.out.steeringAngleDeg, CC.latActive, self.params, self.VM) + angle_limit_fn = apply_steer_angle_limits_vm_checked if self.CP.carFingerprint == CAR.KIA_EV9 else apply_steer_angle_limits_vm + apply_angle = angle_limit_fn(desired_angle, self.apply_angle_last, v_ego_raw, + CS.out.steeringAngleDeg, CC.latActive, self.params, self.VM) if str(self.CP.carFingerprint) != ANGLE_SAFETY_BASELINE_MODEL: - apply_angle = apply_steer_angle_limits_vm(apply_angle or desired_angle, self.apply_angle_last, v_ego_raw, - CS.out.steeringAngleDeg, CC.latActive, self.params, self.BASELINE_VM) + apply_angle = angle_limit_fn(apply_angle or desired_angle, self.apply_angle_last, v_ego_raw, + CS.out.steeringAngleDeg, CC.latActive, self.params, self.BASELINE_VM) apply_torque = compute_torque_reduction_gain(CS.out.steeringTorque, v_ego_raw, CC.latActive, self.apply_torque_last) apply_steer_req = CC.latActive and apply_torque != 0.0 @@ -650,7 +671,8 @@ class CarController(CarControllerBase): # and stops publishing object tracks when it disappears. Spoof it periodically on # PT bus so the radar keeps tracking. if self.CP.carFingerprint in CANFD_RADAR_LIVE_LONGITUDINAL_CAR and self.frame % 4 == 0: - can_sends.append(hyundaicanfd.create_accelerator_brake_alt_spoof(0, self.frame // 4, CS.out.brakePressed, CS.out.gasPressed)) + can_sends.append(hyundaicanfd.create_accelerator_brake_alt_spoof(0, self.frame // 4, CS.out.brakePressed, + CS.out.gasPressed, self.CP.carFingerprint)) elif not ccnc_non_hda2: can_sends.extend(hyundaicanfd.create_fca_warning_light(self.packer, self.CAN, self.frame)) if self.CP.carFingerprint == CAR.HYUNDAI_IONIQ_6 and self.frame % 5 == 0: diff --git a/opendbc_repo/opendbc/car/hyundai/hyundaicanfd.py b/opendbc_repo/opendbc/car/hyundai/hyundaicanfd.py index f1fec6c37..00467c3d3 100644 --- a/opendbc_repo/opendbc/car/hyundai/hyundaicanfd.py +++ b/opendbc_repo/opendbc/car/hyundai/hyundaicanfd.py @@ -96,6 +96,8 @@ def create_steering_messages(packer, CP, CAN, enabled, lat_active, apply_torque, lfa_base_values=None, lkas_base_values=None, lka_icon=None): if lka_icon is None: lka_icon = 2 if enabled else 1 + ev9_angle_lkas_alt = str(CP.carFingerprint) == "KIA_EV9" and CP.flags & HyundaiFlags.CANFD_ANGLE_STEERING and \ + CP.flags & HyundaiFlags.CANFD_LKA_STEERING_ALT control_values = { "LKA_MODE": 2, @@ -128,6 +130,24 @@ def create_steering_messages(packer, CP, CAN, enabled, lat_active, apply_torque, lkas_values["ADAS_StrAnglReqVal"] = apply_angle lkas_values["LKAS_ANGLE_ACTIVE"] = 2 if lat_active else 1 lkas_values["ADAS_ACIAnglTqRedcGainVal"] = apply_torque if lat_active else 0.0 + if ev9_angle_lkas_alt: + lkas_values.update({ + "LKA_MODE": 0, + "LKA_AVAILABLE": 3 if lat_active else 0, + "LKA_WARNING": 0, + "LKA_ICON": lka_icon, + "FCA_SYSWARN": 0, + "TORQUE_REQUEST": 0, + "STEER_REQ": 0, + "LFA_BUTTON": 0, + "LKA_ASSIST": 0, + "DAMP_FACTOR": 100, + "HAS_LANE_SAFETY": 0, + }) + # These signals overlap DAMP_FACTOR in the local DBC naming; omitting them + # preserves the stock angle-steering damping byte expected by the ADAS ECU. + lkas_values.pop("STEER_MODE", None) + lkas_values.pop("NEW_SIGNAL_2", None) ret = [] if CP.flags & HyundaiFlags.CANFD_LKA_STEERING: @@ -709,11 +729,15 @@ def hkg_can_fd_checksum(address: int, sig, d: bytearray) -> int: # radar stops publishing real object tracks. Spoof this message ourselves with valid CRC # and current pedal state so the radar keeps tracking. # Length is 24 bytes on Ioniq 6 (DBC declares 32 for ICE Hyundais, but EV firmware uses 24). -# Byte template captured from a real ADAS broadcast; bytes 6-23 appear static / config. +# Byte templates captured from real ADAS broadcasts; only checksum, counter, +# brake, and accelerator bits are updated for the radar heartbeat. _ACCEL_BRAKE_ALT_TEMPLATE = bytes.fromhex("000000020000fcff000000000020000055ff000068000000") +_KIA_EV9_ACCEL_BRAKE_ALT_TEMPLATE = bytes.fromhex("00000000ff006f00e80400001201030055ffff0000000000") -def create_accelerator_brake_alt_spoof(bus: int, counter: int, brake_pressed: bool, accelerator_pressed: bool) -> CanData: - d = bytearray(_ACCEL_BRAKE_ALT_TEMPLATE) +def create_accelerator_brake_alt_spoof(bus: int, counter: int, brake_pressed: bool, accelerator_pressed: bool, + car_fingerprint=None) -> CanData: + template = _KIA_EV9_ACCEL_BRAKE_ALT_TEMPLATE if str(car_fingerprint) == "KIA_EV9" else _ACCEL_BRAKE_ALT_TEMPLATE + d = bytearray(template) d[2] = counter & 0xFF # COUNTER (bit 16, 8-bit) d[4] = (d[4] & ~0x01) | (0x01 if brake_pressed else 0x00) # BRAKE_PRESSED (bit 32) d[22] = (d[22] & ~0x01) | (0x01 if accelerator_pressed else 0x00) # ACCELERATOR_PEDAL_PRESSED (bit 176) diff --git a/opendbc_repo/opendbc/car/hyundai/interface.py b/opendbc_repo/opendbc/car/hyundai/interface.py index 797c6ee0e..468d578d8 100644 --- a/opendbc_repo/opendbc/car/hyundai/interface.py +++ b/opendbc_repo/opendbc/car/hyundai/interface.py @@ -4,6 +4,7 @@ from opendbc.car.hyundai.hyundaicanfd import CanBus from opendbc.car.hyundai.values import HyundaiFlags, CAR, CarControllerParams, \ CANFD_UNSUPPORTED_LONGITUDINAL_CAR, \ CANFD_SECURITYACCESS_CAR, \ + CANFD_ANGLE_LONGITUDINAL_CAR, \ CANFD_RADAR_LIVE_LONGITUDINAL_CAR, \ RADAR_LIVE_LONGITUDINAL_CAR, \ UNSUPPORTED_LONGITUDINAL_CAR, HyundaiSafetyFlags, \ @@ -99,8 +100,8 @@ class CarInterface(CarInterfaceBase): # this needs to be figured out for cars without an ADAS ECU # Cars in CANFD_SECURITYACCESS_CAR are known to have ADAS ECUs that work with SecurityAccess ret.alphaLongitudinalAvailable = False - if lka_steering and ret.flags & HyundaiFlags.CANFD_ANGLE_STEERING: - # Angle-steering LKA platforms still need stock longitudinal validation. + if lka_steering and ret.flags & HyundaiFlags.CANFD_ANGLE_STEERING and candidate not in CANFD_ANGLE_LONGITUDINAL_CAR: + # Most angle-steering LKA platforms still need stock longitudinal validation. ret.alphaLongitudinalAvailable = False ret.enableBsm = 0x1ba in fingerprint[CAN.ECAN] diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py index c5a0f5599..f61158134 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py @@ -10,7 +10,8 @@ from opendbc.car.fw_versions import build_fw_dict, match_fw_to_car from opendbc.car.hyundai.carcontroller import CarController, Ioniq6LongitudinalTuningState, GenesisG90LongitudinalTuningState, \ update_ioniq_6_longitudinal_tuning, \ update_genesis_g90_longitudinal_tuning, egmp_dynamic_longitudinal_tuning, \ - should_reset_ev6_gt_line_longitudinal_tuning, reset_ev6_gt_line_longitudinal_tuning + should_reset_ev6_gt_line_longitudinal_tuning, reset_ev6_gt_line_longitudinal_tuning, \ + get_angle_smoothing_alpha, apply_steer_angle_limits_vm_checked from opendbc.car.hyundai.carstate import CarState, decode_canfd_camera_lead, decode_ioniq_6_blindspot_radar_state from opendbc.car.hyundai.interface import CarInterface from opendbc.car.hyundai import hyundaican, hyundaicanfd @@ -22,6 +23,7 @@ from opendbc.car.hyundai.values import CAMERA_SCC_CAR, CANFD_CAR, CAN_GEARS, CAR UNSUPPORTED_LONGITUDINAL_CAR, PLATFORM_CODE_ECUS, HYUNDAI_VERSION_REQUEST_LONG, \ LEGACY_LONGITUDINAL_CAR, CarControllerParams, DBC, HyundaiFlags, get_platform_codes, HyundaiSafetyFlags, \ HyundaiStarPilotSafetyFlags, Buttons, kia_ev6_gt_line_longitudinal_tuning +from opendbc.car.vehicle_model import VehicleModel LongCtrlState = CarControl.Actuators.LongControlState from opendbc.car.hyundai.fingerprints import FW_VERSIONS @@ -168,6 +170,7 @@ class TestHyundaiFingerprint: (CAR.GENESIS_GV60_EV_1ST_GEN, MRR30_RADAR_START_ADDR), (CAR.HYUNDAI_KONA_EV_2ND_GEN, MRR35_RADAR_START_ADDR), (CAR.HYUNDAI_IONIQ_9, MRR35_RADAR_START_ADDR), + (CAR.KIA_EV9, MRR35_RADAR_START_ADDR), ): radar_config = get_radar_track_config(candidate) assert radar_config.start_addr == radar_addr @@ -226,6 +229,21 @@ class TestHyundaiFingerprint: assert CP.openpilotLongitudinalControl assert not CP.radarUnavailable + ev9_radar_config = get_radar_track_config(CAR.KIA_EV9) + fingerprint = gen_empty_fingerprint() + fingerprint[CanBus(None, fingerprint).CAM][0x110] = 32 + fingerprint[ev9_radar_config.bus][ev9_radar_config.start_addr] = ev9_radar_config.expected_length + ev9_car_fw = [CarParams.CarFw(ecu=Ecu.adas, fwVersion=b"", address=0x730, brand="hyundai")] + CP = CarInterface.get_params(CAR.KIA_EV9, fingerprint, ev9_car_fw, True, False, False, None) + assert CP.openpilotLongitudinalControl + assert not CP.radarUnavailable + assert CP.flags & HyundaiFlags.CANFD_LKA_STEERING_ALT + assert CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.LONG + assert CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.CANFD_ANGLE_STEERING + + CP = CarInterface.get_params(CAR.KIA_EV9, fingerprint, [], True, False, False, None) + assert not CP.openpilotLongitudinalControl + for candidate in HYUNDAI_NON_SCC_CARS: CP = CarInterface.get_params(candidate, gen_empty_fingerprint(), [], True, False, False, None) assert bool(CP.flags & HyundaiFlags.NON_SCC) @@ -260,6 +278,22 @@ class TestHyundaiFingerprint: assert CP.steerControlType == CarParams.SteerControlType.angle assert CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.CANFD_ANGLE_STEERING + def test_ev9_angle_smoothing_is_ev9_specific(self): + ev9_cp = SimpleNamespace(carFingerprint=CAR.KIA_EV9) + other_cp = SimpleNamespace(carFingerprint=CAR.KIA_SPORTAGE_HEV_2026) + + assert get_angle_smoothing_alpha(ev9_cp, 0.0) == pytest.approx(0.05) + assert get_angle_smoothing_alpha(ev9_cp, 13.8) == pytest.approx(0.6) + assert get_angle_smoothing_alpha(ev9_cp, 20.0) == pytest.approx(1.0) + assert get_angle_smoothing_alpha(other_cp, 20.0) == pytest.approx(0.0) + + def test_checked_angle_limiter_blocks_rate_accel_conflict(self): + CP = CarInterface.get_non_essential_params(CAR.KIA_EV9) + params = CarControllerParams(CP) + + assert apply_steer_angle_limits_vm_checked(0.0, 100.0, 20.0, 100.0, True, + params, VehicleModel(CP)) is None + def test_ccnc_hda2_lka_layout_does_not_set_ccnc_safety_param(self): fingerprint = gen_empty_fingerprint() cam_can = CanBus(None, fingerprint).CAM @@ -1554,6 +1588,67 @@ class TestHyundaiFingerprint: assert parser.vl["LKAS_ALT"]["STEER_REQ"] == 1 assert parser.vl["LKAS_ALT"]["LKA_ICON"] == 2 + def test_ev9_angle_lkas_alt_uses_angle_status_fields(self): + CP = CarParams.new_message() + CP.carFingerprint = CAR.KIA_EV9 + CP.flags = int(HyundaiFlags.CANFD | HyundaiFlags.EV | HyundaiFlags.CANFD_ANGLE_STEERING | + HyundaiFlags.CANFD_LKA_STEERING | HyundaiFlags.CANFD_LKA_STEERING_ALT) + + packer = CANPacker(DBC[CP.carFingerprint][Bus.pt]) + can_bus = CanBus(CP) + parser = CANParser(DBC[CP.carFingerprint][Bus.pt], [("LKAS_ALT", 0)], can_bus.ACAN) + + stock_lkas = { + "CHECKSUM": 1234, + "COUNTER": 42, + "LKA_MODE": 2, + "LKA_AVAILABLE": 0, + "LKA_WARNING": 1, + "LKA_ICON": 1, + "FCA_SYSWARN": 1, + "TORQUE_REQUEST": 17, + "STEER_REQ": 1, + "LFA_BUTTON": 1, + "LKA_ASSIST": 1, + "STEER_MODE": 5, + "NEW_SIGNAL_2": 0, + "LKAS_ANGLE_ACTIVE": 1, + "HAS_LANE_SAFETY": 1, + "ADAS_StrAnglReqVal": 12.3, + "ADAS_ACIAnglTqRedcGainVal": 0.42, + "DAMP_FACTOR": 0, + } + + msgs = hyundaicanfd.create_steering_messages(packer, CP, can_bus, True, True, 0.44, -31.5, + lkas_base_values=stock_lkas, lka_icon=2) + lkas_msgs = [msg for msg in msgs if msg[0] == 0x110] + assert len(lkas_msgs) == 1 + + parser.update([(1, lkas_msgs)]) + + assert parser.can_valid + assert parser.vl["LKAS_ALT"]["LKA_MODE"] == 0 + assert parser.vl["LKAS_ALT"]["LKA_AVAILABLE"] == 3 + assert parser.vl["LKAS_ALT"]["LKA_WARNING"] == 0 + assert parser.vl["LKAS_ALT"]["LKA_ICON"] == 2 + assert parser.vl["LKAS_ALT"]["FCA_SYSWARN"] == 0 + assert parser.vl["LKAS_ALT"]["TORQUE_REQUEST"] == 0 + assert parser.vl["LKAS_ALT"]["STEER_REQ"] == 0 + assert parser.vl["LKAS_ALT"]["LFA_BUTTON"] == 0 + assert parser.vl["LKAS_ALT"]["LKA_ASSIST"] == 0 + assert parser.vl["LKAS_ALT"]["DAMP_FACTOR"] == 100 + assert parser.vl["LKAS_ALT"]["LKAS_ANGLE_ACTIVE"] == 2 + assert parser.vl["LKAS_ALT"]["HAS_LANE_SAFETY"] == 0 + assert parser.vl["LKAS_ALT"]["ADAS_StrAnglReqVal"] == pytest.approx(-31.5) + assert parser.vl["LKAS_ALT"]["ADAS_ACIAnglTqRedcGainVal"] == pytest.approx(0.44) + + def test_ev9_accelerator_brake_alt_spoof_matches_route_template(self): + msg = hyundaicanfd.create_accelerator_brake_alt_spoof(0, 0x66, True, False, CAR.KIA_EV9) + + assert msg.address == 0x100 + assert msg.src == 0 + assert msg.dat.hex() == "470c6600ff006f00e80400001201030055ffff0000000000" + def test_ioniq_6_lfahda_cluster_allows_lfa_icon_override(self): CP = CarParams.new_message() CP.carFingerprint = CAR.HYUNDAI_IONIQ_6 diff --git a/opendbc_repo/opendbc/car/hyundai/values.py b/opendbc_repo/opendbc/car/hyundai/values.py index 96e19dcb2..bfbf9934c 100644 --- a/opendbc_repo/opendbc/car/hyundai/values.py +++ b/opendbc_repo/opendbc/car/hyundai/values.py @@ -1129,7 +1129,9 @@ CANFD_RADAR_SCC_CAR = CAR.with_flags(HyundaiFlags.RADAR_SCC) # TODO: merge with # CAN-FD cars with ADAS ECUs that work with the communication-control path. CANFD_SECURITYACCESS_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6, CAR.HYUNDAI_KONA_EV_2ND_GEN} CANFD_UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.CANFD_NO_RADAR_DISABLE) - CANFD_SECURITYACCESS_CAR # TODO: merge with UNSUPPORTED_LONGITUDINAL_CAR -CANFD_RADAR_LIVE_LONGITUDINAL_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6, CAR.KIA_EV6, CAR.GENESIS_GV60_EV_1ST_GEN} +CANFD_ANGLE_LONGITUDINAL_CAR = {CAR.KIA_EV9} +CANFD_RADAR_LIVE_LONGITUDINAL_CAR = {CAR.HYUNDAI_IONIQ_5, CAR.HYUNDAI_IONIQ_6, CAR.KIA_EV6, CAR.GENESIS_GV60_EV_1ST_GEN, + CAR.KIA_EV9} RADAR_LIVE_LONGITUDINAL_CAR = CANFD_RADAR_LIVE_LONGITUDINAL_CAR | { CAR.HYUNDAI_IONIQ, CAR.HYUNDAI_KONA_EV_2022, diff --git a/opendbc_repo/opendbc/car/toyota/interface.py b/opendbc_repo/opendbc/car/toyota/interface.py index 18a88fc5c..57febbcb9 100644 --- a/opendbc_repo/opendbc/car/toyota/interface.py +++ b/opendbc_repo/opendbc/car/toyota/interface.py @@ -68,10 +68,11 @@ class CarInterface(CarInterfaceBase): if candidate == CAR.TOYOTA_PRIUS: stop_and_go = True + ret.flags |= ToyotaFlags.HYBRID.value # Only give steer angle deadzone to for bad angle sensor prius for fw in car_fw: if fw.ecu == "eps" and not fw.fwVersion == b'8965B47060\x00\x00\x00\x00\x00\x00': - ret.steerActuatorDelay = 0.25 + ret.steerActuatorDelay = 0.14 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, steering_angle_deadzone_deg=0.3) elif candidate in (CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2): @@ -154,7 +155,9 @@ class CarInterface(CarInterfaceBase): # to a negative value, so it won't matter. ret.minEnableSpeed = -1. if (stop_and_go or ret.enableGasInterceptorDEPRECATED) else MIN_ACC_SPEED - if candidate in TSS2_CAR or ret.enableGasInterceptorDEPRECATED: + prius_long_defaults = candidate == CAR.TOYOTA_PRIUS and ret.openpilotLongitudinalControl + + if candidate in TSS2_CAR or ret.enableGasInterceptorDEPRECATED or prius_long_defaults: ret.flags |= ToyotaFlags.RAISED_ACCEL_LIMIT.value ret.vEgoStopping = 0.25 diff --git a/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py b/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py index 88793485e..d71aa912e 100644 --- a/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py +++ b/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py @@ -61,6 +61,24 @@ class TestToyotaInterfaces: assert car_params.flags & ToyotaFlags.AUTO_BRAKE_HOLD.value assert car_params.alternativeExperience & ALTERNATIVE_EXPERIENCE.ALLOW_AEB + def test_prius_openpilot_long_uses_hybrid_long_defaults(self): + car_params = CarInterface.get_params( + CAR.TOYOTA_PRIUS, + {0: {0x2FF: 8}}, + [], + alpha_long=False, + is_release=False, + docs=False, + starpilot_toggles=SimpleNamespace(), + ) + + assert car_params.openpilotLongitudinalControl + assert car_params.flags & ToyotaFlags.HYBRID.value + assert car_params.flags & ToyotaFlags.RAISED_ACCEL_LIMIT.value + assert abs(car_params.longitudinalActuatorDelay - 0.05) < 1e-6 + assert abs(car_params.vEgoStopping - 0.25) < 1e-6 + assert abs(car_params.vEgoStarting - 0.25) < 1e-6 + def test_essential_ecus(self, subtests): # Asserts standard ECUs exist for each platform common_ecus = {Ecu.fwdRadar, Ecu.fwdCamera} diff --git a/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h b/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h index f589cbf5a..12fb32428 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h @@ -221,7 +221,8 @@ static bool hyundai_canfd_tx_hook(const CANPacket_t *msg) { } // steering - const unsigned int steer_addr = (hyundai_canfd_lka_steering && !hyundai_longitudinal) ? hyundai_canfd_get_lka_addr() : 0x12aU; + const unsigned int steer_addr = (hyundai_canfd_lka_steering && (hyundai_canfd_angle_steering || !hyundai_longitudinal)) ? + hyundai_canfd_get_lka_addr() : 0x12aU; if (msg->addr == steer_addr) { if (hyundai_canfd_angle_steering) { const int lkas_angle_active = (msg->data[9] >> 4U) & 0x3U; @@ -334,6 +335,21 @@ static safety_config hyundai_canfd_init(uint16_t param) { {0x1DA, 1, 32, .check_relay = false}, // ADRV_0x1da }; + static const CanMsg HYUNDAI_CANFD_LKA_STEERING_ALT_LONG_TX_MSGS[] = { + HYUNDAI_CANFD_LKA_STEERING_ALT_COMMON_TX_MSGS(0, 1) + HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(1) + HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(1, true) + HYUNDAI_CANFD_BLINDSPOT_DASH_TX_MSGS(1) + {0x51, 0, 32, .check_relay = false}, // ADRV_0x51 + {0x100, 0, 24, .check_relay = false}, // ACCELERATOR_BRAKE_ALT radar heartbeat spoof + {0x730, 1, 8, .check_relay = false}, // tester present for ADAS ECU disable + {0x160, 1, 16, .check_relay = false}, // ADRV_0x160 + {0x1EA, 1, 32, .check_relay = false}, // ADRV_0x1ea + {0x200, 1, 8, .check_relay = false}, // ADRV_0x200 + {0x345, 1, 8, .check_relay = false}, // ADRV_0x345 + {0x1DA, 1, 32, .check_relay = false}, // ADRV_0x1da + }; + static const CanMsg HYUNDAI_CANFD_LFA_STEERING_TX_MSGS[] = { HYUNDAI_CANFD_CRUISE_BUTTON_TX_MSGS(2) HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(0) @@ -382,7 +398,11 @@ static safety_config hyundai_canfd_init(uint16_t param) { }; SET_RX_CHECKS(hyundai_canfd_lka_steering_long_rx_checks, ret); - SET_TX_MSGS(HYUNDAI_CANFD_LKA_STEERING_LONG_TX_MSGS, ret); + if (hyundai_canfd_lka_steering_alt) { + SET_TX_MSGS(HYUNDAI_CANFD_LKA_STEERING_ALT_LONG_TX_MSGS, ret); + } else { + SET_TX_MSGS(HYUNDAI_CANFD_LKA_STEERING_LONG_TX_MSGS, ret); + } } else { // Longitudinal checks for LFA steering diff --git a/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py b/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py index 77d367d0a..d45cb83e2 100755 --- a/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py +++ b/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py @@ -559,6 +559,61 @@ class TestHyundaiCanfdLKASteeringLongEV(HyundaiLongitudinalBase, TestHyundaiCanf return self.packer.make_can_msg_safety("SCC_CONTROL", 1, values) +class TestHyundaiCanfdLKASteeringAltAngleLongEV(HyundaiLongitudinalBase, TestHyundaiCanfdAngleSteering): + + TX_MSGS = [[0x110, 0], [0x1CF, 1], [0x362, 0], [0x51, 0], [0x100, 0], [0x730, 1], [0x12a, 1], [0x160, 1], + [0x1ba, 1], [0x1e0, 1], [0x1e5, 1], [0x31a, 1], [0x3b5, 1], [0x3c1, 1], + [0x1a0, 1], [0x1ea, 1], [0x200, 1], [0x345, 1], [0x1da, 1]] + + RELAY_MALFUNCTION_ADDRS = {0: (0x110, 0x362), 1: (0x1a0,)} # LKAS_ALT, CAM_0x362, SCC_CONTROL + FWD_BLACKLISTED_ADDRS = {0: MRR35_RADAR_TRACK_ADDRS, 2: [0x110, 0x362]} + + DISABLED_ECU_UDS_MSG = (0x730, 1) + DISABLED_ECU_ACTUATION_MSG = (0x1a0, 1) + + PT_BUS = 1 + SCC_BUS = 1 + BUTTONS_TX_BUS = 1 + STEER_MSG = "LKAS_ALT" + GAS_MSG = ("ACCELERATOR", "ACCELERATOR_PEDAL") + SAFETY_PARAM = HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT | \ + HyundaiSafetyFlags.CANFD_ANGLE_STEERING | HyundaiSafetyFlags.LONG | HyundaiSafetyFlags.EV_GAS + + def _angle_cmd_msg(self, angle, enabled, increment_timer=True, gain_raw=250): + if increment_timer: + self.safety.set_timer(self.angle_cmd_cnt * int(1e6 / self.LATERAL_FREQUENCY)) + self.angle_cmd_cnt += 1 + + values = { + "LKA_MODE": 0, + "LKA_AVAILABLE": 3 if enabled else 0, + "LKA_WARNING": 0, + "LKA_ICON": 2 if enabled else 1, + "FCA_SYSWARN": 0, + "TORQUE_REQUEST": 0, + "STEER_REQ": 0, + "LFA_BUTTON": 0, + "LKA_ASSIST": 0, + "DAMP_FACTOR": 100, + "LKAS_ANGLE_ACTIVE": 2 if enabled else 1, + "HAS_LANE_SAFETY": 0, + "ADAS_StrAnglReqVal": angle, + "ADAS_ACIAnglTqRedcGainVal": gain_raw * 0.004 if enabled or gain_raw != 250 else 0.0, + } + return self.packer.make_can_msg_safety("LKAS_ALT", 0, values) + + def _accel_msg(self, accel, aeb_req=False, aeb_decel=0): + values = { + "aReqRaw": accel, + "aReqValue": accel, + } + return self.packer.make_can_msg_safety("SCC_CONTROL", 1, values) + + def _tx_acc_state_msg(self, main_on): + values = {"MainMode_ACC": int(main_on), "ACCMode": 0} + return self.packer.make_can_msg_safety("SCC_CONTROL", 1, values) + + # Tests longitudinal for ICE, hybrid, EV cars with LFA steering class TestHyundaiCanfdLFASteeringLongBase(HyundaiLongitudinalBase, TestHyundaiCanfdLFASteeringBase): diff --git a/panda/SConscript b/panda/SConscript index 5b20be162..a607df245 100644 --- a/panda/SConscript +++ b/panda/SConscript @@ -169,6 +169,10 @@ build_project("panda", base_project_f4, "./board/main.c", []) build_project("panda_h7", base_project_h7, "./board/main.c", []) build_project("panda_remote", base_project_f4, "./board/main.c", ["-DPANDA_GM_REMOTE_START_C9"]) build_project("panda_h7_remote", base_project_h7, "./board/main.c", ["-DPANDA_GM_REMOTE_START_C9"]) +build_project("panda_can_ignition_only", base_project_f4, "./board/main.c", ["-DPANDA_IGNORE_IGNITION_LINE"]) +build_project("panda_h7_can_ignition_only", base_project_h7, "./board/main.c", ["-DPANDA_IGNORE_IGNITION_LINE"]) +build_project("panda_remote_can_ignition_only", base_project_f4, "./board/main.c", ["-DPANDA_GM_REMOTE_START_C9", "-DPANDA_IGNORE_IGNITION_LINE"]) +build_project("panda_h7_remote_can_ignition_only", base_project_h7, "./board/main.c", ["-DPANDA_GM_REMOTE_START_C9", "-DPANDA_IGNORE_IGNITION_LINE"]) # panda jungle fw flags = [ diff --git a/panda/board/main.c b/panda/board/main.c index a1bb0c508..e092d6e38 100644 --- a/panda/board/main.c +++ b/panda/board/main.c @@ -27,9 +27,21 @@ #include "board/obj/gitversion.h" #include "board/can_comms.h" + +static bool panda_ignition_line(void); + #include "board/main_comms.h" +static bool panda_ignition_line(void) { + #ifdef PANDA_IGNORE_IGNITION_LINE + return false; + #else + return harness_check_ignition(); + #endif +} + + // ********************* Serial debugging ********************* void debug_ring_callback(uart_ring *ring) { @@ -176,7 +188,7 @@ static void tick_handler(void) { const bool recent_heartbeat = heartbeat_counter == 0U; // tick drivers at 1Hz - bool started = harness_check_ignition() || ignition_can; + bool started = panda_ignition_line() || ignition_can; bootkick_tick(started, recent_heartbeat); // increase heartbeat counter and cap it at the uint32 limit diff --git a/panda/board/main_comms.h b/panda/board/main_comms.h index 4b362e495..7d528a3c0 100644 --- a/panda/board/main_comms.h +++ b/panda/board/main_comms.h @@ -12,7 +12,7 @@ static int get_health_pkt(void *dat) { health->voltage_pkt = current_board->read_voltage_mV(); health->current_pkt = current_board->read_current_mA(); - health->ignition_line_pkt = (uint8_t)(harness_check_ignition()); + health->ignition_line_pkt = (uint8_t)(panda_ignition_line()); health->ignition_can_pkt = ignition_can; health->controls_allowed_pkt = controls_allowed; diff --git a/panda/board/obj/panda_can_ignition_only.bin.signed b/panda/board/obj/panda_can_ignition_only.bin.signed new file mode 100644 index 0000000000000000000000000000000000000000..9147aecf346b2f4795d7f9631ef7d88c049626f8 GIT binary patch literal 84552 zcma&P30#!b{y%=6=b05o85VT})L9S_$UwYCN;b^k12QOXl?xSaH7+GCm5lsi6g5k` zS4GRUEUm2U3K%At42rhe_s-+e)zqZhG78BZHs?{6`M=LIxOMM+z5e+6ob$|CKWF=# z&*yVK=lJy)h8+EosMHt#6Ud+bZl|Hax4(sFi0Yq!%Ya`1*8u+pv;o=y%(FzL1oQxe z1Ns6600sgQ0Lg%d0FMByfH8nvz+-^vfEj>i0nY)J015%cfYpF?fQ^7R0lNTu03QMl z04f1T0LK7d0lo*E0bBrF0sIDN05k!7fKC8sM;`z}0KEWF00UqU-~m7i;9$*JX zD^H)#gjCdMthq*kH8MtaDSo53w3YH~CgvM!#8QL#p7^EOqqKh*q>$UD6*2L0VS7?u8|LxI=%mBt4B9}LWh6ZQ6VYyf#b4`!BSiuba z6@4m|Tgcj{%dPdNP3C6CSZd(}rz21=w~V`kNlgo*Ey$$lbvA7!F&=9%M@(BfZARpa z(_Y;E;*T$GU;5+H=$C9t#;a#F=QfpVZ3?5@z%}K|&^JSg3B8ogp$Ddws}U2*b8U;4 zHhGjbxlx8x<7EvV8NO+F!P4J6v>#*`?`W3j2iX{-w{qIjV=Xo8cDN*r#QX@~EN8q7 z8|u}CM86pQ65~~&ZmnYbi;S0*U4F5zo5V+EYh1E{@_}sI-)8Atk-V$Cw~ZufT$}-Q zwjExobD4Nxmn>m7kX!0KO5#Jh^Ss-3Y00miQRSNM97^P<0cL9Hx6%+~*weIIb{Tz0 zaowyW`V&2fet!_rx57Wsla6D^m?*Wj@>Cv!@fssfuRmjuHH4a2J~-oi#iV}6oBT$$ zt(axf+J_3d^%inTdo&!QrOK$OxN&=I?iqpG^I(|GTZz`Ep+92a$L76MB1YGsUt+F^ zbu~L*`st;oZ>{J$*5Zt1TFKH9QJ)WgCe!MC0q`uoA3r5d{v)l5#1C^Dv!h>9#Tso2 zgRzbn`o2WshYJI;<*`x4Z&q;!`{yVOd)s77$OE*eLhGWk$zYAEcWgxLyKO6H=v+a3 zy@w?9wsAMIB6_;y28Dt4Cz1M-jivpm&5@&oOG_?$Q1=8fDfq4_%KvZFG(mR4Vuq(SVgpj3uH`Um}_SF@S-jM2yvcr_6E5$I8csd_Rm2 zIgwyD-l5N_I=cd>#P-?eZTb$rrMrNQfY&C=hsI&XSky3(7`mKG0PyOj2X zcDJcS9HhtmVN1j~eUEGfFVi0vr)Z9gc^YD@y%vm?4o19_oi>ZMPcc^U-`a=q(4&3B z0H6w{Q+X#QGbxuU-nHC3uRVIVZRX})7D`!&qo$<<6m4UI##QsD_65?Q2ONQTP$6K; z7BUj86O4#Yf6c=2Jp|TqvCvtl%ODM#w8vXY*on8C-Wn_M`f17Wp~8=d)n-IGv>DR? zKRTk8(-fqkR9oA^gipe^M;hJNlyqcey!sq%p-dXVyW_`>^?9<;t~@{i;BIRUw&{vF zj8uRoVoqT$DFmydrf`SasW#Ws79MPyQ_Nz1(V1y(HlX!Eg4$LprY4!nYYK@vKw-_x zZ(;s5Ayz@hTTNRm?E&}9mq12KGyyvA{VU3AX=fwE{#DnTyQ6kP5sMD5Gzyrv}w zXw})@yp?jkZ+0(HJ~B#O)8yCxkVo2ziQmMGYEQECeZ#_DI&ZD1@E+|YGXGEwavGxR z88-J;Nmp*YRo25@-9$n@bup%BQ-+t3%`#(#J(^oTfoTxxJT&gGtDkYE`AkJiHx0vF zNByB*CZwRUhfTq2+{CEKDG?vmUz!y&EacQ*_>hw(dxErPUQ^m!*hh`>97Rr!i>9Ga zFVTlp7=teWt$!K|wwT45*oP58zXtY8wDsQ6x}Aa%Xn)Y2p#JUD+_IkCbeh9lqdTDh z8ckQ#`HIpzRQi9@Xl-^uC8z`^ZBsFeLj{9!3vX;Y2`mJFq2R_*;I1m?vlq~myRWjN@{$T4Z-!qf}BGWn}{ ztIPZ`4@B1MHd>6A=xVGjq`Zem@9xIgj#Ulrf5w z*DT~>($RMnn5fL{K6Y)I88D zuLt&9^oqIpkdf}a=H*RN58YcI&4YD(XAh^jd}zb%9CRlGe+|mzt&CD@ay)q?#>9Vt zeedf?y7s|wh|JTQEh?AX>y^vBAqqu9uU-k@g_&Uu-ECD>{<%h(K)F!A?~Gq{)Z9$# zWD%k?v~}ak3Q8kqXhhwOp8vMOh${na_g2cl=gF5vXU&#p)Srn-Q0IChdTK?k=46Wn zQq%?udokDRPwHQ{QA|r(Qq_}x$nGouz|u!}$$r!lA$(?kc66u^Jex7CKz#6mp6y)A z|LMM)vd0oEEV1tbRX=E-HChgth)LlR6ipF|p9CgpO7iLMc5&IK#kEP+)&lN0e2f;A z-?G!yjEQ&$kP@>+G|*5N`I*#N)rv7RRG-2aSDMqo&rrF~)w1w!NP&3sV6ifU-{&$9 zs;dA~36rpETECCc98LU8sY8GECSiy0H%6|>UMh{NJ6;FD_Mi$~9hB*Ef! z&a8!xH6Y1tbZxP5K|*<3XR+KRw@rDO=&9600H_gT8kk#bTrZ@VP^=Y#Y-hwAM(foQ zrMpxd&!kqBiW3Y$a3?aibKSy-1oq1^a8-KDlPc3zOEmn)!nay{j$#8~c~xb2A(7UZTkrRM@3%(xc7^FM zl7*_HY+-8UZ7Gc5wdkFrh?ntU?od%Nl5Gexx+|j8%ItG_#P|``b}H6(f7iOaDBXE* zWNpA4Ajw~BoVK!`pv8_okbGTbZvKD9jh1kCxx~$uiY7w)sTAC&r5x>xdB-9XN=0K5 zNl>}8y!I%g_o6KHgtRubmHKRs-y}|Am^jwGNu10~DK9~p!qANtr4Wfa^3zJNS8*s) zd$hdmc(DpQxzEEU=!JLMYKq=z%UgP>i4b#xhRm|eN(aw1>>a6>zKhXB&9KZ!-y}Yk z9#gKfs;obG7=zEVNqpQu;?KKv)*pb!*={^2pZ*=Vs{mj8=N*f&;ZI! zFv51Uj_7@!yVQcFQc{ZM)e%)3D7Pfb-{w7>Y9_7~IquyT0z9n(e6Lf@-N|8YW2=G75onEcB`g=jAwE`kyJO#G$&J zg$wK5(i)>B(jDtA*He%wRxTPduBb;bGepLx2;aZF+RMnhd=-9Ep|M*ZaIkHEF_o3n zs4rG{x6o5K!Wseoj2Ksl;|=725rVn-4Yb4}7?&Myv9K#Gk06yG<}nl1T>L!u?j}xy z*`(kbGzwY#EP?1}*O4LLy2-$AL0Mx_Y9DZJXNoU?+8Q$uGJI3vK}&>787qq&n$CI| zMHr~c3UT5LA_Og^DZlY>#%rE~ZPmrcgx!!OoMC3g182#Qp~4Dris7}FNxT&$UMYSI zcpQhOV1<}(2r9Nz(HwGwkr6uJzXFs*5OWNhls(THm$BZStSnwF90YAr2s0hK3x6pL zgBD|qko}@~bfY+hA#wi@7`u@U27FK!IQm%SA=tWAsfEQEYVKBS2Jl$oe-sK}f|LVWi znm>0|O#EDXYi099RYlv4;KZMT$NVobIdKaqIH2d;T@ zUnx6ggOoj!Yy!^+>20zBIsy2019T%Si_jWqOZ3VTajxOBY#Fa{L7vsG6!SGmA69~O z4E+f!Lpl-``4V_p+4eC*vL8^Y2aL6+bkQp5q!6J;?(l;`2W{n;V^> zUVDfJ6qvz|NswpZMq_y(jLx-nHuRpnL@bza7}5ptUT~tn9vf@{{sYNCW(%{cL|ims z)i^S+_S%z=m57Tcl!!|v)QUy$oq!b+R3>I*xYy4qL}vO;;iYk3UVA3x%WL+OHRAf@ zHR8TxMcbFlRRftvdU^fwV3B$Brtsyp=O6p>TESy$#QhW2h+j{5ZrnX(JbhDmU76)# zcL0yk8Lor3N?N9?dziUW;{B_WB$&PH(4rc&h>0b!@;5%0uwL!_0)DZ3csWTZ5<`&dB@1^q)T&gTPde!?kGLZ8;!ZRMUrKg6v>Rz7jMVT`mE9WJ^ zYR}{RS$>^o4PWX3_6)a?81{Lthzo$j7x3-QDvzxk_yA89xaB#^5jw^BcTZS30ZtzX zG$v8%BM$Ky$hX_`KF=P!BBnWaNb7;_KR*-^J^6n`e+v7|dK1y-^&|S713?LYC#qF| z{eT+4S-@352jGfW;B-h*EG^lNl9!<5u<|QnzVmrtk?)-EVRpRFha+T)a}Gi#J7;<{ zHcd8pkoHZ1C)oD9hYT)mee6Is#_6h?-9`q#=?=7J1ImnZW@C>mG7$X&uwN7>t%s;$ z0I7f+Kt5n8U@P!hSq6n4fX1sQ-zq6WSOz6!nyz6`!>f%cJ*2V_lJ8P}xc zuAUEvv>$16^|BW%UeC6ST8b>8F}23 z1pN=?>xn+;=*hfOdGFzyNom6j@F%r-ILHts;u8kCi+A&SHcFkIFf8ug*D3#cKG{@H zz`veP4(#>j$bw97<>EtzoGaqmn$6;+3G<^@iI!?N|!o6m6n0r(ea!%-1wYi&{kof2ZtFpG?D~=gOa~-OH zPJBp%ThpNAazrJWVox`Rn$yiw^S9YUt=sZ{lIB*OjL`>y-#ZBX=Qmcr?*Jr1d3Imk ze50d4mQrE~&EJ?0d6*S3J~VAA@DItMxHEsT5sCw6klVMJ2i7xk_7>MP*oqz+>i4bl zBTaHRWEI-NsH&q^Q_X&#^GNE^J8~D_lkYAonK3XaG+ntlB56~(-*?E*fJ=`9USCP& zFe7i5bGy9-NBzF{{S8tZEdA*|$Yx1Wj|)6H&S_X)V_>rUzVGh*MjiNFOMesAtVKI| z(sm>VYGzE^E!-`pi8RTGM)3PyxUb$6;I9S#`Xhede1DTCaP}cW^F-UwODgAU6_cV$ zqOD-ON^S>vOw<>I7`B-Q)iX-kGY?BWBX4jLzptZ`hWx%>{-OL}UXR}X z+8uw&&SB4=Rx<_!E}$s9^m&?`jdF9-=lQ>dOQW0sg>bl!*e3Ch-v-| z&NyoZYiP(f&73vU@4MO+#|IgM!HLfG(=QFaX8Uu!1xr*o9nte2=lgwmem$=;()poA z>|@>ILu9O(j$@K7az2&DB4<&b?e=BezAE6iI;p<^a@xem+0zzSuy;=j_!HqHAJzLJ zzLgA(oK1bFvD*)md@orX@SQWef5Vr`Sv-xV_mV)lz$5S*_(r;)_ein2kW zPXAH9U0a#kYGq}7ZmXG*V?DmqDZ@#hESu(|STDr9mzfwd7gFrkLI;r!ErdEz){w!z z=ITFUqj{q_xBkSi&91&PF68f=6=^qm(f9e=?HE&bdw!&SqO#+hBKzX})8f(u?YbQm zQ>^A2{v~DYEna7ZwtG#1zf6zCntgfsW^vhca0CKlS|t{bJS#388D-~;eT#H`hlWGM_Jj ztHUTS^9P%zSh=z%MOiy>t;L>7+YyO&EE}o7TIR}CRgaXDSjM z-}C_QgfKgku))5uXpNUqK{irqg%Kz-ts5H)f1&6+uo>3byQ&9vmY1hfY%EBTAf*_= zN7=7Sv{swFNh}T~D0vg=WfE97o1k$QWYYc)vxnNliqvyU&FiRS1%6x#N1skZ4~BJ9 zpeCst73TU#KWi%ymj$c3$3!$L;ii__G~; zpVm(dt57PPQ7W`xfz+RI<+I}y=Of}$T@m`43Y_XMD#)CzzbWBTP#F}f;h7*gPv`g| zYfu*2-EpmAkyVYa*bYO`BC8T#hK`>RrpTgeih0=Y>-z<94I_*>6_5r<1Ymxn3>j}} zE}jsFJj#x^EOT>9sNctS#AXr9@UHfOS#+k~YLCf^fPbUiB>BzlM#*n%H)L@LAJ(DI z3asSc+WYFeeCxZS;J(@wQy!JY7*$B&>WIWwPkepe(Fb24_^Rxn^=q>D=6nY9yge){ zAE77OL$h*QNjmbh(|(cT*V-At>5I5-ymj#PfP34c!EYh~XffzR5Kq3G|^9m}dnlhe#V=SbR^B){*Qj-)CT&dDLcBq%}KmL?p%sxm9Gh_MH9 z=6ylwJT0HnsQrV$=MuU<_W_R1WURCHi0p9tHm>7bcy>fqXijdc7VVhc9+n+8CLBHd zc)KPG6m*f_x1-%;-@$a8>xmwh&q%)!ve@s-Y*%KnsO9zcJ$BBk;ZzB?1WE@eO>XHZ z_N(Cgi><{fomnQsH%Vj7`f^zuo27%S3LZ79ATv6S=tbZ~d4^uut6tqCaSbcs*1o#8 zVn@YJXz2{)wXe$N?x^@BFSwxg)pUF@DF@q|TAB8UlpPhdD;T|$3w#XC7ge>Xn{NXy zdgwc(Ia+}7qjN^jy}Q$wyc#H{ty$h4mU0}wHdSng26cm|hX(EVtDB&Gt7vb#A#d+( z+*EOV1r6D5>E~Mcs(kLI3RoPtKAc>#f|kcM`BN@dfKSo~__4cuRG@B#r`%DsE6~o2 z{t@7Wxhn0^Ae;sC(EEM=_Uo7VeSi3yJ=hKSq$&=n8?bX@kN0@8UfJ$2DZXDbmJzwZnG zztI=PD2vYTf4WjDgU6l&|E#mf_+Wvq#&W4nub-~RkNu2kwYXv=O<}U0gd5;>HX#4@ zV3biQL#nNQI@?&Z;XHVYPY_4@Ig#>gp_|2(2{wrbpIJqB;j`k}`A^O}E3O)OLR>pN zA!A3>34Aj{S0NqxEwt|){!9m59~pg4ybAvDB;0f2ugP08H;V-$ZRH3xoD;pt;3zMg z6I&U~Ol+N~&oD`<3$>06aI`B&&bnQ1@Kn^hp4J-`oDmgy0^g|75P7G@z!^M2JKn}9 z`h7cHv`yPw9NaftGPtEKIou5{1>DzNO1Q7NRB&H$so}121;Jh63Woc#O9OYgi;nCv zS5LSvxI*AAc4^@*bcMoQ;0l8~*A));8Bk5XZES-=GQdr98R0(cGQl10ih-Nr8VEPZ6$|$P z*C4p@t~j`ZT!Z1pxZ>d&TnTXdyAt6>xgLP4a}9yp%k?1KFjo@X5LYr>jcX`ewJQa# z!Zi#o=lTm=;u;ROv-%;px2jX&`l=s>+gd#WZd3J0xQ*3ma2u*0g?qKy4EML{bh!Vj zw!pnoZH0TOIs@*7>d|n2sOI6Gsm_G!uFit{ef1c)-&Q{Y_p9nra8Fcc!#!4QgIisl z1NTVvSh$C)$HT3xo&dL^dLrBd)sx`vubvF|!|KQ2zF++W+&$G(;O?%T3U^m^9^CEK zPs4q)Iv?)l>KSl1R?md{*Xmht*HzDkyS91`+||_&TobJ^IWc3eh`XI6)?_CM!`+Jy zZ2@fOyP-4H zjxp*A!}o8UjLEbF6dQHLbkS1j45#HqRc+~}b+X}*Dwn)vp|W|kaP+EJLR?g)q;&rx z*5$vu*X=*xiz1N+^*kutuqQ3 z?CsnQY<}tNi|@BO_t<~QXND8gGeh>|%bIkuI^mqSKH(fz^BLU$m$Gp~{NcuD9q>np z@O#)at}EAj%=@Zw(7ak$+Y!@Aq&$f=2;IFgat5R^@XN#gANB#@CI@Ya1pK;&?p1_X z`)ezMpq=0n`kudXmGiPeJ;PT*R$vSv;1#rHjKN|0yNBV1Cpe3K5ks>lNcsvgT=%Ge z@n~?;SfibR-P!MZgziyvUnBtRje68K0sy-dgN&yu{{;9Py6S8EOybD%CY&oQ8@avz zB+Dw;F-%IA!QEq_a$6sFzbqp=#RxWk-nq-(b+WyJwm_lF6p8&@+_l|sIxR{ z3%Y#fE@s3(gkH9tmLBe2*}bxQ+vv$Ml`NDUbT!L52*%&LA}p)T6UZ?LIWEG^XQxH& zR%NTR)OT_;wyU##!`R>S_?-;#bH%k}HZc=BF)zkg7XelPUIOd{s4By3IGq&2!M_f^ z838x;W^dG`GI#k5RT{)8g+~z@b<+%2chiDXK&2F#jo;dvHn=@*j@AF>fuzt~4_QFK zhu$r>Nu=dAinq(XcKB|&zlgNlI#`|DTkd(0mU~Y8&vH{MNgH_q8b|}}Y{M}cdFeAEtG!J~>SYCn0q-M9Pqv+n*avD1}Ml5d4C8-mbT*#*!__kSn?de`8(>I^`X86!c48gg$F5RnS@U2_ub*4|9p&qks z24mQkZ`DIz5!dC5lXMO<&O-5aHq{t)meLqGOO;Jb!TI6& z))}@LlV;TBf0us-?FjJbl!iz&5VSD0@=;?CtQZ+aWqRk_{@mamptrD0>T4KmH-O5c zx3_hIE;Z@#wYif@Lbds(2DkzqckLf(SixeA~G z$ZVW(+LAMnmrlQYn*6u~{IQfim}f@Pc4b><8!FnHnz)3Bz`mml4xw!xmel3@?hE>r znsn1c{WR#Tsc%kdg1)Yx@*yf`2iN{TlJKnCuy*F!)h{1wU_!qkuU4=P7B(njlZu#T zI!#Vv;a^}`J5KmzIY}5Rkb%i{^h|Pam1#MX(v=YB>M~udn6ccng@@vc z7+Hj^>0l*YWtZ>aPSzNdr9>Fp$r`9Ma;S@72mT&wy36-P2OU#_ug?2)n8e(}ru`J7 zI5Jun#Q$8BUQXhJvY^EQ&oSFL6MJtT7uVqA4A2MBP|6>4`4-;UL(zsfa{dy=jqVxI z;NO-yNz6Hv*S9a%u!>V7A2D|M>N{xI`=oE*lnffiAZ)!97TMQR;Vud-O3Bz-KE=)= z{9P&BlwpS6$M2ieMGUDtGYtHypGy?LnR!X990KP~3lc5|w8!8ymp0vmn>o4qpgarj6Fsfo6$6S4>O17{(W9$?lp1(j6p z(&Rh^>1XHkv*PZNFGPK8(VV6{(GiiJ0NfH4_^uSsid%!BEfG(MJLd<+_zY+u9S`tzDU9!!e;TKk?Rh!MwBCI;ogT9ZW-jpy$Q%4yI0(Y-yh)jd-KD}nGwjJ z5MIte%KK;}o$07k5w(EMZ(Zi31zR&o+$kY|$JZ$N1L)dhE;(xbXymsZ+7>omhEoq( z*LOJQ`CK4_cLS@P-MR!X&g6WR19AuC=*Q~Eb@>k5BBocsb#?hdpe6Yj*5d~)a(7fV zti#*`^E-Sqy82>Apr>=@=2@27mSC>bLTR4P6`Q{u`&L|Mmyh$C><2BO&<%gy^-o|N zHE(MsW1u>=zjk5m=Lg%S+CedIt<5~=;UM2r+SY-!5nBGqPyep|JaV(|l8pQxp1?bStS!F$Qaxp3$1S ze7{u%qrRUp7wQWA12#Z6y0Q$b1y%%`#>qEoKU{HDLk8^NO7%NrrEiEIucLGB@-^M| zr{~G|UeehtCnOb-IO2WXxeN9?!3Td3PmFx~`l@aT!Q;4mtv5q&)w~XEY}m&k-+k6d zrX@9w4(jmr?@DTv2X*51P9I1UA6vLf&sla^U^mRaXQ^pk>zr@dV}ad+i81{ko=Vsy zF3^(r{VsI_+f$7baT0&l^-Tk-{-%kjnZfTi1ZgH_EEFzZi~jrv@sHps8A0u2d}93{ zMfsx-yYl&h(feEl{3=V>r60trQSUSaGePZ4)0il>{$GnXTK2g@`7ua0hF@>l?;-}q z5Nw?|CUUzVYBk5iQ#KN}-_=XkD|)}>iAyBztm}9KVJBKP)3mtnW36Y2AV#ERWw%F` zT2{G^iQ1fFVnh)=pOy*1Md4K>k?N1+IJJIQAZhrH*(I*kwIYQ^Zp zT2Ti$l~5~c;YSqJiuxkyG(A^3^))#>{kQ!fYVybf`(0UmRnhmiO^LRtU^j5qb*zCf zV=S9snYG=+7(v}*zV!6BEjV~a)a4`|IU`0#bGtr7Piy%zqCVQNt1$9)%T^c569ce_ zW`@bO(VEwz_kmFkAX>|lxR0b0_d|llro)Kub({Gzk8Im|l*95rdr)d3hkUvmX6S2D zPTHR6Xlh$3$uz`~vBAv|I=jrd3Y<>-6X*0V%K7>;vFC9D@RsF+GC99ccoUZ1Y&^8! zCSu|;b{1YN%&nKj$Xe@WXVi1Dy=~6fV{oU(+&s5$t~ZNSxpG?%6y|yf6R|HCHWG@U zTyIZ6L2$13P;i&;Iq`cjXTugzz2SRtX_?xqRDamSlJBoYeKg+W#>_F4j%gt33}dek z?N}X8iI=a1o5n~ddds_DamSsnI4?#6H_m-t)WcT^9~UwSa|?zAoP|5jxcH@KVl%T2i)%iVX#(ex>70hSG0ZNZ)TfjQ$*U+g}4`0+sBtFmKP0 zO=TRPDBOF;!D@KTq7zmX))t12iD5I0vetsxc0StL<X)(rKrEZU~#N=FpdaT z?(HF$wK|v1AE2?GR)>wzxn^53j89tZ{FCXOzEl1X8%{L8qcvaa4AdN6mIRC0U|3fN z2`Z`fHX+Ip?p0Ik7Cq%H82ulZ2db-}T>y&1Z94NBAD}W<#OTugpfbC}HA(W)ZQ{ox zFJBKG!IdgOXG~SwV9G(M%nfJ2jwWNp1&Pj7jRuntEsB1JiXsXUek3$ElL{oqYWq0__wBL@uAjYhxYnZ0_+7-)F zDs|q~ANH`({4Q~I5}&cJK_(*!Pr5IN`$yi!-c>Q!NH}YpW+X@dV`*xY$9Au^WU61v09_~O3>GJ&bRR0A1zr0 zD^lX!;(Qi2xV}y)#f{3t;5b{+Z(lWX4qqdgM|scl;5DDgMkx5wryR2z_h#P-b$rzr zGmrMvvyC4(-f!G9t+Vmuyx!<7Nh<_9Qhy_H{NA|7L3=>OVjpAa@8=(EY`9QDC_ayR* zaPIelCxWl^Kz6^h3fRf`H!P}4f0eKc<_~zH`5T@T{$o!#{~>1eC!X>6J|kvCzfSv@ zjkvfGc|t)~%{j1qX=0cj7vDvQk^h?|=n^yHO}b|cVg{vJcX1wtGn2CgDx28v@!%*G&H8NOQq`cI$It6S|=+QK&6kSs0z8SpN3) zXvYp>tzT(k9oG6y;nOX2UWS}{4!3JUPEims1|cUm!@}#O##bDx;nPu>e66PmBNOyx z3&Dw7ayLcM!d3z68dix4)DZ4{BqVS;iL(a%bxPOidcNe(^xlV4Gb}ncmJJm6<=pb{ zoUa^*RD69&?|X3w)L*QkwI6CDPk+!fo5Z=^Z*%hLmh^Or3)N0Gc2k#7a43wv9rf)* zeJjhnmCud6a{c*vTf~o-ug0lK&^{-)lyjg5uU}_^Zm+}dud_j~G`>&guj3(TDqp|O zMc!VM^seu-jy_d!pp!4SsRi5z&Owbz%VC96j%q#x>J$&v@SIMulTd<16#tzCP9wE2WEch>e*v9l~R$z1O(faTM#QPop*{ zTKB1C(Z#69gWdcLP4iykn%nW&?^|YHnr-=%#>Ox)Z(kqbI45RlV2@Y#j8wxzQccmY zgK=8Vh%q&9Ur)h$Qr=!qBT6i!i6JME=bV_M+2242W*PXVg3&9nj%fHvG3ONaPo#-i z@J-b@F(c<)3sxbQcrh^d&xz(!Ge^ss7}>y!v%m?>;@`(TA7U2}KvH zRMvB1TpG@2E>5&;$4rgnQDUN8;wA$;$_5X(8;^?r2CL`{R>_aJNqq$~`CqWOzRd^h z{&+IpRh#LP3}{I!dHFb?}wU{BN1Hmx|=CNEaQ_L<%=)xe)Hk=`aH*v(3?9u(c{ z;WrO)XuYsDK<+EB11uE>C6$(MxETb>D*qAZOa4Haf~Q8Z>@91%RlHfEa9@Lld@1!y zE9Ukkz^XD>Z}1%EbWh^rgE z-V5C(4$R+J_OS2@dMN2wZQ%w{<$RRYG)2gjtzDS|{!9P-&ga%|)m3-*kgCa_MEmH{ zHO}-C`e-Nm=mV*b%w5|=Qxb{OxfJ03nUJ;AvME7_eFXLq3U9>|b%DO}!7g37e1jP5 z4EJ&&Dpv~1SN7Q^8uQTtld@HOi40L8S7yDgPl+S9K1-)+^)Ab*KclKG+$I`G*1^x( zjudm}55wJxx^y`K`a$W|-lk|Zr5xMPL-Z`;8UNlUtwv$}0$~gJkgsT(+wo?^KkmO# zp|IYl_{0;X?vY?_ekmL{#J&x?#KWWaxI^hU<2)tnT7WOPiZK9skWNcvDW?_I$}^?-Rx-Vo!B%oFbww^X}`aLmPC(w z1@0SY59JTHb;Vha!>*m)yTiR#i8DNUA7^+7t^L$<6>Y2oq}B(<;NJG0j;GwI9^5J8 zI9V8h`nxhTR=L+Lf3ImgcUqlWKRZJICmz*ttKXfLzbOVrLRnYQHmz8JHT+ugYdE80 z^t3OWj_Ho@T*8vpx_q5g*`!gB2B$3K|LA^6+e1eOy)gbwv?wB#p5Oh`6X0;KNbTUd zIo$J}eBeF>kl5XZ``7WN&eWs1NCt>)#ndM-G(UOm|A zP`8>3$JBG`;cRW8qE&nxlvUy+x>uo6=QW4W9-_UI1S`kf`tv&2sjG0t-ibBYQ^8jw z_78qP+}o>?rk#Shv4gJKo(k)KPeIR0U-N(4Vvf8~!Pf^V%=HQuwiF#C?lf#MAn&Ox z^(yI36u~Ybt>M3w;9S<+{4KZ-9{w5lS@3^=Z}zTsrY|oklrOh9PB_M>!@UI|>GdZW z&JlsK7|GuL33Yj!b75wEt+K>1U)aR3t>R2eeJNYf<|v*e^k)^V<`-kF;8tFw)FV0P zIX)eGj|EZ=!}WI!0nMM1410Sn47Qg2UGdprMN}V2bpsz`ub8e5NJ1ZaY718su5@HL z6w9AhXVxE6MzO~n#KE4|;V6h_lXuMh7`zI@n{nsin+jzeiT%k#a7)Ph0Jth>bXFkT zREKvZa3iOtI9FH!EP4QkI^eJfw+!8jDlz_XuJ_u=9NdvnWEhoAD#p%t`X-6V{F~qw z0%uyFCMf^j+fk(0?ETtF>D^L4DJO=zapvZ>FlYmXsbgn3;){$`oVN!jr#b_}7V-IH zTlp4oMRJN{$MV!XGT7|B=p@hzhDn@YJ;e7s;~mjh-Z&!K+W!_WU2g4tUkZ*a;Ldo#n2wvMsH@Q zJf38X;wh$7oI62}yOodQh9!C68~48)rQ)O+$6MGiMZCs^86JwB976ApD~0~WL%^xc zpV7Nq5wCJ3^S!D_+@q~a4$yT#5*}@R{s1$Ajo<2G40cc8#^J0Zea3DPpF`|U_ZD#p z{H+4zXjk-88Rc!q3Z9zR?yKvf+T_K_(8wnTSDh4>&NwF)CC@Lv5gBBA%L1M$mWkaW zIz!dvm>~?sBn)%9%|i@-q4Ef1Bzotgu2e>jCKR`hIIySCFm^lE&zZ1^^^?Nli!`n% zHDd~^qC87r6ezB-2QU(g$b-eLh65BMIvS6*Mji;qDcd{!+I?Fjtkwgot;ws!&5KTo zduI@ouRd^6+&V)Jiv*RFZiSR?KhhmeJ}I7%()31}!!yDp9`9$|MPXnIVX%Q}u_fZf z#N*1zt{S|)LGM6JO02=%EZo?FPjD0KG5FGrEczSqPrx_BpF(}yy-L+19>1sJcMbe$ zG#$dH!*{~ZOH?8BN&1V>{7)s8h)+W&mk)oo=B}P!!Bb6irC%l8#F(5|D$Y(D#;26i zmrU-yFF@bHkYrHMjHQ5{m@%^xBdc^(I=n73g(=9y$m0&ED3qd3Wqj-TQgK=|y)jM( zH@b0)H}q9S7T$80ljxDkvG!*Yyp;*Iz87S1eca`kbx$TTLsjuO{W6}epm@{rD-N=8 zXT-c2DtATyCoE5-GjX^fIZ#zcjF3MEDVqFgxLGJ4-Jp?|ig`J+4^kYmkH8AiEgQAi zvN%1Ys+TngH;1R?QA{2v2ObkX>Bd7ACl?|xho=~V%3-Urv=%oO)A9S6#CTvcQKB>$ zBb-n^6OA{4jOQi1xn%~thUCTjOLR{iF!sxS^zDr4a(e%izMg~|sKyn2`vk4GIqCGm>Tv8uqk~di8VQi&n*KDfLB|5QB^bnk_jM?ekh5PHh z@d8jFS0KkZk3Lc6a<&dY{B(jl=+d2GIv#g9L)>KsXCqcpZiyJ>DO&!c*w|Za8{Szc zCI&ff&-Eym57u7Fyv4LqD;FkNpP?FDQ_&*Oe!nI-agUVVp4Zfo7_X=An2lnp_F>#M zHl*Xd6`WnH^w(6tp2wg_QSk`nEAY07LQoFw?T%ii7~Dhf4h#a1r7MnJ#vt^DrvkZ@ zgBc-YV4_(jy*(8Xp~tI6OtNY)*Tir?31&+`_Mz{TOf(qL_fJKut1v@xO7>J@K=uok z;ua(B>FB9dXE1x2p=>;z#mWm9olwlEXv}43e)5qcKm!=i^L)&3+CK`L8F}qP=$Ot) zq`L>5gSZdbGZ3FtDaT7iOooo$rNY|_xXF}znd~>~t@PH?{k&7)Re%q$i}lCrGsg;9 z+>{Kmn!Q0Q%#Ip0b_No7#pN+!C9J(?N0Y(hg*}BFZnZGD57^)g@75TPt~=PaYGIPF zENcT^f+2VXhZs5I9^H<@@N^D5gj0MvjrMmSmUw?~K5v@|TAb>Pb?k9aJ=P#0x1LMX zwAL-isb@9+ats3BJ}EN0{&>*-W`Ej8&HfQzwK)5jAdN{c!QeLR_~LB1w-yrbRwtwX z$TJoFnhKq&;11}or!!n@$1KcXE{vtG!1cDik5WkN9+dYGp9@-WjsFmQ9F?ZuYl;qj z75)zFCi$Qp?}_h$my_MY?a@@XQ;bK7&7vN!eo)M@euo5fc&S#}V=j*jnsaK?{ukS9 z+D1^dpwaKOIp>^csgaTRQ~@hAk;Fd?|M4`E&SC-|r)+}QOaf2dUT&yxSpnLD| zy@(U%p@#3T4G5bG*BDk{GG_NHjoHMQ0vi6;#brsai<^_6nST-I0?rQKoDQn-H}G_C zUx^ois2=@AoR5D?OOHK`-SH#U&29|qyFy@F6DrXAH?U3W!rfM{S^YF_%|F^2c0h)^ z+nccW^#FhM81!S40KVS?^Kmoir4|n=v7?+sXJhSnJ)*E*(QLVb&!|5g)9c8mZ4t%2 z-81`7woFc^y+O5K2c_E7sEz*G-$ku*@WvJ1;9_Fv`!U=yHRwHqT3 zQdF))K5*aQ|89NqQ~%(yAo|`DW^v}5vUcA|@nF$|g(M-to?D;!L}vY&K^m76 z_mo)GXKmKvM}&lBwJjE|1Uz&2iY=mQH%>JC%Z^my90NB-)zUpw^=e4tce(oLwDlNm zD#Ox|K5)}qua;3;x?d}BFWmGtO4{j6!OS;%k2?dUTSuF{UpPMoSIp9VIHs}=T!{LN z=QG^Bj=2Ye)6OlTvhHJ?0KL_}XG2NPB`<#|M%2-gYMrzH2Mz_mVH+JuSv4fjE8%ZL z*88mO*Wy|3UmpaoFC*R(=Vxu-78kpJd+_f9?d>?^=;)k){xy4FbB1Crz^1h`$y;oF zsqSuXtaa{p%y*0#M|)y6r2kq-iC6i3XgQS=KLzi&?bf!NaV~l`GvL;%H{WlH4qA(t zsy33l9etyR#`(iG=fhpTp8og$v|4BhG%Za>C7&KQW!69s4zay$c?kHEVv|7evfdhX z2d6ZlvGC)(VPAMp}jGp(sC=d1aWJ+<$N6-As-p5v$o2@BtS+0nOE5-<4t=%E^ za~6N@sz7UV_qm{NdPt%d^!~F-ns=&q|Hqi8qII*nc8CMaS&(F&zO`2DD4$Oyvk;vt zgC`GK1=^dNZPSWLJn0H!#{?IOjPM9O2fFK*`l?p!Iq_oc7M&GWcIHe@epN zvP283a>_(SO~|R++NGVhc6JQ7wZ7vE3Df;;&a~(>s`sF4ARoB&>+b23v;@;z(0#~Y zt@3RL>?LB3cow|+>8(|*v(<+XyAkCN5XvyiH{gsC-23hwIA^4Kv$t-&)ivPOU-8=3 zRCP7#$*xx`_qqPw<{YKOEu@iEQ|gtsf(`+2DEdPTz!_qVjgYrSpNVPAU;T z%ohMRtF$(LtqAfmL2BH!|8_JT^JkCHzD^cwxP5zdID5%4oK_UKv5;NHgM)QrrMuP%NcJi{1?+W386w%4?1tTiOdwWp0tddf0I z+V{*!*u@e+2N~SEONrQrea>rA<$8yzh7RHfp;sSM!7`%5C%c*3I)6!;VW^SrbNxz{ zMg}L%MpI^X%%)x+W*AT4MNT_^&rbJB_?8Y|lXS9ez+Tb``V-jaVkJ5AV4JEqT%eX( zeqUkxLpcg)6sY!#&Yb({MB(PC z-{zwnQY0+d0~`Q-lgo(mBD%|axV_K+sQ=3r4e9dPyWT;LR~DCA!n*rX-yV!nQFQOg zecMUg1~*$rZD8BnME^SWVBGhUCL-#W`tFN-9Gyz589fv z7N@)GJR3z#4Sn~chdT&2FoJ~mWdiPv(DM`eUJiR<<7gFZl$hb#T|x=X}_ej5@R&$_vI;%+Gqhx9Xf_(k*` zW8`4Bx4wTlY*8a%u@1{YtU&ST0Q=__x$v~T3LNFz_Af@WZssrAl=C>LyWolBahlcr z)*|H{DK0v!^7TUsDn}eC6^n-KD_;ez8)m?;nUKepJp~KRQClpUOIoSksJT&?<0@F! z`-f3Jm5pie^j|)z{Hf(bs`}giiW;A?zi;`sn;EK2!8u1D#t<|hFrLH$o=W5{5S=97TlBX*#FOb zPUP7PpzR4~cc4Z6DwwqCWCz~C*(QuBwD z%Wv4z)0+*@*8W_u4e+g19XJwxvaO+x6c#Y+7To@Y?=5ZjRKT(6AL;KrN^^)H^Ib0zR!!^ZN7 z#B9XJWnO5e|Ux?nF0ljc0=6NdghhvET>v8yvjG^$J?U z!F;^7Ge%XhW28t>0dFzvFufW4kbw{0wbNczk>ZO$35!A`ltKcr4JL?*0}${`6q z!kW4O7OG9vGRcND0jV>S&Uq@KIT-~V!Z4voO1Y!TL3J(A415pyyIY%L;0&{%O$nB? zDJv--H{_qfz(SM#Htvg3c3F5~K5|Y(&WGH495Wo#$;FCE^+I^S_HZTkol0o4^4wm@aZVyA8uzMlUh^J+5M(wm+$#b%KtZ^m+(qiA#}8O zu}}#vW@Tp;-T;_{JoKfgS<3?!)n9rxKF~|Z1V&FtF)N&=?ih**Bn8wsRVs&QaYv(T zA$merJWv>c`X?r4gIk@HIJ9c!@=a>sj~%E4ubZV%+@L#ov~?#;NzzyD zfqcB3MqhrOXrMY`Gqgo(P)pxCBebYX!7DIUU$*p6bou6WX@;oJ*R=E?nz(@VLKIfQ zc%}>*kDI_|PO(w=#ld;=xjjv0c9LaMdN|(6$OrD4NxLk?t$hxdaH_5eDTcNrAFtdo zWV>g#BglrjyK$&N@0{si(QBKK!;3SIEmF>r2lUJ9yXSYzE12U3%va1=79fMY(q`Pz z^kz=VIaF3-bn+p*V&8-@WMI4R#dg_^{YkhP{1o_v3E(2~R*CuWC%|8cuoA#3z-qu0 z8V{H_;e?n6I5qu*sLeYeW&v^lF@Okw9uN)C<-yM0FKc@gr}m%0e+2$PzwAbw89EUE zhx|bB8|$B11xj&3TmUElECnn>SkY4hUpgVqMr|KYUnSZRGAD19_)MPSm zGyAq?aywAhC>h*kqnNkZUAx2x^umIdDHf=G6zGL&7_0)hOG*52Nf)4MmlZ@~U8W_q z`_9~AhIu6#nh$zO_vFgP8tH#PsD>@o4FI(T%!E~y^S1SN5dFUl;-F`pf_vAJ&cE*V zsQ{%(;A13v3K{>RKs5pL#s=(u4`BvB1nDgHREO0GpV?KYiqFj;#K^KyzT4$R! zwzo9l25;v%NSse+F}Pc*N;@awmJe=^YtlZ&&A|Kf;0AZ+p28?)@YzpAwRUpWpJQL{ zoL@{59)Xm21n&vcb!pb(Zm{3nJO{c6jij%I2Da`{+qz=C@JnG}b*{!5Oej7AZ8!sY zK3p)q`pephpKq#|{&^VQeKR)?OfK(!z2sAgg46UT@lu}%`#Af_V?F!` zY4sZFey8x5RQF7OLUBUX!vC+mZ-I-d+WtRhW`JQpU&fqd52|U&$~7BZvY% zD$VW3kab3EPNU8eqLW_%l3##?O2mbZPXv}jW?`O zu9@yEdoQAsLuV!HFN}V{^v|c8&v}Kuapmw(MP&0n`R1UQDhJg>t1jG)^=x-*YA$}A z+p5htto2)Up+zp;F@hM{0eOcV5Eyq2Xke{=(7%_jy@+ym7_{b9O<#X%`Z4d>(3`V( zIiNYU7?e9Idrtv0-|G9(n#9w+UhL1noweyH%9XJ(X*Vi&U^xPYr2l zdHo7Aqyal`LTBi6hhn|QOLvfRqRA6{;x3-S`o4E?Mo3aF-P?mR*soiE z;=-U@);b8BNxxQgv5a2>E7Z>5TjVEKta<$)9qn^da&ZU^REBQY_tMcgV=Jp| zaNb`}t(H;a%SU%WTrcFkOFF#%$c6RV)NM^WAp3|ZR z-;EZ6%GyG zl}Q1P>+|aPK7;Jr>vE|C!7e50fTB9cYk;CF#>gW&mtdYM;@S;gEJlnTjcj`Bu%`z!KtrRz&16_QoK`Buu-9+kqLWuD(AGGmr66){9&yz*f(Dh z-Qe`u`q35tya0z1c1^t$#7E-SF5(wMS_W%3>gIr72#qz4D`6>B9mY z?Ll*p2XA5p$7^}Nl$Z>wFjqk9^j0|D&lU1@4m8VBp68^i;(pNVBpEH8mhph3uLN$> z8q1C{i8Ni##_Eb7M?TiL9bnkEvPd~cyMxMsO z&LDomHV8%-iK{dp>A(GmA%M@zL)DCrh98-#cOI-3R>w5wTTJKq7L&u^!-v~Z?VaFX zl}Bqy`F2~1?l@Ao8uoAtrYi>u>7q8EqcL5uUCyVQwMO5N1_d;1kV82yWFTobjX}`1 zGr{?S+~>Cx=QeNj84}qJbCCWR`OBXk2$@lv@?e*#VhgLUKrN6SNMmx(PuC2@>c${y z!!<)_ue?i+xzvtDiq+SAa+P>%Qc~+$TJu9Z&)SrnsGRl^XVH4lDFKkYCp=)~*cyAz z5oW5$w=22?@uO_mS6qEvl3~M`wZx5t9mRFkrpvw2PlzfR0*y3VH{aX=HHc!~stf%f zHT|Hshazo@Hx50gWP@Tzo@y@sLUo!>kfolyEYTVpk|#(Vbi=AzL8hoj(cpY~%cd*q zFiwnkfW0koS>y{zPXS-wlAQ7NQ*%Fuo_v(rlgb&paoPsf)+^=VX@&go==sF=++*JK z-4(QjkL9g^Zf{XU=RqwopXY0F2GTn;@(lRfJaRt#=sm12;{9>7Lx?tkw~uV4Hj|)R z*YuU-mftC)=(Q;gInLTFgM+M#kE8o z%nb>!9K*~X>7f(cPoUoiajLK*V1?&@OG9&x!^Z;>2z+`m9XV>A(%r+YC5%;yeJ~_??wzrl5_|0L#(L3w(<~A@-_Z1v(OT zv1+g?ERr$2>+s2WN7gS8$~IQ-TKi)+m5M(x=1AzqPHh|v)`st!K5M$d7<10E-E6Zi z#)*BO(Q!v0C#=p6DKTB%fz=Za#Ajh;Yyrx}D4tpxS!#B2Ri}F#iW$YZ_r(S9{Ah`N zQ35|6=8WjE5f2|h?^EC*m6t56vR#>?NfNwt;GB zWRfv_>(J+vf}e)F-ZO_FSC&V-QK-mW$}RopZj?I(bd194QP{F@DYxvO_ZIqNBy%XM zMNeaCn_1klh-1i+Pf8g*<%kX#mZGH9IbUpmcIhhR`H;xB$|!A25RIIzLQcHds80d_KkwJ2w<76iI%lU9b!(!DtfN3=1a)qa{N*OzlQxMT0`Q zrBhDU_L7M6{FfbgSu$k@SRR4Z0}|Rm2Lf!$_kcrvz={(7X_b7FN~SUaTk~*kfC*M|+F~ z9VwAJ5GDnyRP{i0q~T4Zu5SbMkR-Y3(eEebV0|O}TM6C?kO;ds1pYh@VjnpGNT2y$^q>)a@+k!wf}_HpQ&Q2okov@@s~|#L1!u<2`ggP5_*&7_&nJH-rd294VFKlRl z1ugMn?Dg6ODSa5Rwt>bYs|>LO8q%M9ET2&^6ri}nX+Lye@R7fpmlMjfZXtS1|)Nx*Dps7DEd6>xfgI_d1wvL#$Q zf2Jenz+6}!m8nm&ryZJsL@}ByIf2eTg=ztad ziSdexV1-(=#-FScS{|l~1@?mJyQU8qgkBZKlC%og1!mQJ8(b>oR8Q4A_ckayf>K!K z8_MROwQv`tyA@yJdLxf|^L;!ihvcmT${mcMq37F;w=-4moQx7pHF2P$04)tFuZA1G zrj{RJ5b`y9$09>#w6jiJ&}08s+ws)eqIg;*P&uJ8v*n^D_Z^fMvFwbeQQ#97T8_VQ z)c0BB_X+gMDc|dzgFufG<42p26Kq~y)wJ~m(|1p&{*h^NkVT1^3ZZ>CLcpLAImQg{M8%!p=^yUiHexj%s@IC0_rTq@VXb5DMB z8a-aLNy!HzedrO?)Dw*#7zHhNbQ_&|(FSs92FJnx?KS#}C}ogEFQXRYJ4T5^#2@&RglQ$1CM!=Oslu64A*W*k3Fx-!D2;! z0>9H4wnXaLj;aLIw5ZjoHU3i>@rdM8l1pl%R-lG!2K&>2i3;0G-0|!gA#=#C7Ut$! zmY8iAA4gBF`4_aaA*Q}B(M<{Lh-$hukYszM^As_E!+J9tjTcot@wRw~)?`nRaId+3leC-hj%@iuJ z4_-L!1S?PZyjH_5mrnv~gB1~-#rCpUUxZem%?{{}r=7tJ_H4mcrP0(%v!&W;tCQN~ zUIQ%{*Ph93=s%My?2p-MC5>~>vg?eY4f;=4KA|KA#fv3`K=e@x~>8Pg=E0xM@Y_>WIDE z$u|7iUhUq%ssnY$y^cuiay`PG{^$6RA!fpXQ%)5liUyiDmfzhr>D=A-0AEj^l9?F2 zNCCbSkMZX5GJJcu)6cAdWU(#YFo!#o9alPbV?PFy8!{MpRGJt?w?i9eV&^?9QD#mG zNjB4ZSRn>8>^=B`Rt?5;rm?SM^o@4N(K!37Z3IexPMliy8b;W2)~jLpKYRVm=|jC2 zwH;_4D2qS6jOJ8H9*OVN3ngnf0S&9o>>;?fll3YMT-;%@@$7-89{fJROJxU#GTP&S z^8lrl#f%l5_?0yPt9uQ}Ca#Rp`){&j3#Z1atd2)L(M~RJNXaH$L2;5kpc7?s5(m|2{U%V-w?r~mdLur~85Y@D&$t7X0eS>0kTBr4zJV^Wke0See*U&L)_ zQ^IMRW27U%W1xfkxXohj%?PTkYMouTz&0V$Mrni{rtvq=gQVTnoAFQ$OokhzrWoEMDM4qgv` z%bm|I=1QMg%5}+G%0(oRpJ%P=LGmx<&PNw>-#t^zeV_O)R)}wG!$ub4f0ylmr@Hho z_bKnjXcTXatT+W@CMH@fv#^NDrj%B)0@&bOjD9FtHhK|vHNres#BK6PdNy^_ zSKPVQtztrBn!%b2V(GdS-#=ZCT|d0O-2WWrbBAG`7xL}F+gI7vwV2xpm;lJ?DyQk>StaTb-<5_Kb5AJR|CVk=w-FG|ywyaXjDJ?O-Cg|e^=NTST-T!ah&7J$dHi!D z=X0KjXKrL`&3w*Fc=Daksf8!M`J6YNUO*@ff2UAB!V^OI@=rEvYlLeCJJq}DBI7cU zUwPMz3B$PaooP)JowaJ=&ihhYS)|pge6Cl9^;<5kIqcY8oBNRs;WyQN$o7n3!h4mJ zay$Anuh5*%j{Yk_yD%z?G;4?8bj)MSC=UhMtGAH!>;ZRLd&9nPEa-SnN_Tv96Uw4ztle`Ri0p&NGDe>d&y-_>i zP@$sB{V0o`<+GJK=qpNr1|xpMxSuQ^)CW|FQN#?tDMOMCa1Rf^S)(ZXtSzuC~zM=4m0` z%8Cl*Zp@fkDip}snR@0G%eh^8A#a%_jGl77SwhG^Ed0I{+LhAml82(!xC>`XdmksR zpM%Bm04qH$Xi&js44pQu09@efCTgcwY!djdp!2+N`j%hw*;pOd(`u?XVc(kcFPs!i zE79l#CJoxmOvR7(2}iM`A&;r}7Jji9$6+c;?Xj5OK4AC5OpG$$ANHqgD4%a#qZ~ZK zdHNsWGz@4>VM9k(S|HPmQ9o_;G)kSNYLK2!VHJb@2$aImiVDSIkHyV`EGq{xOEjjy zE78rBR=q=4k!RLoopxx|Q-ON)eP0@clPUsW&yi^eRdz`_w^#Xjk+!c6t01%h%7qmNxim}?}w144?!X1T-(}j6#5k!v_q$0ywC&v ziyZ8tFy}pv|FPKj_ln&=v?HIgUVO@Q(}Xm6dsC`XE4_j!Wogq$l4)!tt#YOUzCG(}Y^?-ewBU;gyFi1+#D!KpI$CQoSFIhbw7^#7Fn>_ysSV_* zBpO@!3gvH90#W+NqeuhgHT%Av?X%3RKSpJfa`|$tl;8iVr*l^^`=ApnHXJ#FQ{4hM zw1?sY==`yf0hjUbt@{Q4-|6Ta;Vrtebhb}(C7qqw^DulmVtistJy9v8d~0pr1ZK&e zN@WXQNT1rMXG5$pJxGHT`sx$eSXI|O2s?03e4kX6J9& z>7|?6-6sb3XrGuU564EYsw^*Md5g4rEJH9iySvgWG$=+{evic;^V>F998iv{cBa<) zgXZ?WeSO3Hz{{*C{Ck=}eG2GKCJhJfWj!X=B@7eQun=pxnm2Fwn(C9Gam|>JRl6Hz z#`)0tc8e_`BMFuW6-sFRL(u-v{F(DMB%QMdqdvInlx>BV!r@I?r=XPE-Tw%;0jKut z#S`gzNzdP?<4M1ho=4b7><2z~81tUPMv78%?tq?If_34;j&L9Intn3#TY7%8sOL8~ z>UlhgdLB=rp5G?w`E7hC((`x{_58NT>w5mnns|N%v9p%etL9rHN=R2TuRyx}C5_F{ zY2mEDx1yq6VLq21O109cX7jNEL6@Lf-0YGk+v?F~m+oe&F_WcQi<$izHuSNYd6(#U zK%G~)T5*Wm$Jdkl`qS>)Q8hSSYvD-lWTSSB=T7>PT)$aOZLS*U`FbC|_AynDle!ONCZ>D&+y>qts5L{FC%Nwbh8aVA ziD4RJu$G*&kqyrY8BAwONxKA9>sM(u8}?e>hqdi~C2ix2TRkt%Z+Fa_{!xgfi^JZE z3GZ~wKUBwShz>PU{_R8lsYAy>J7k1_Bh0?a0S}R$Al<<^|5;6`yQhZLhg#{&x!5I) zGIy=qhNo!dm10YH_wp2>7Gv8LVFY&{(zkjJ%TU`ok6)!FjI#;jFDmHm<@QZic4Mst zJHs+#ahx~C+)k#pw9xEUI6u2phxvc(Fve(-siJ%Sb7=XbU=@<7;wSsu!K-s=CV8j# zNLbv-z^aC)0%+w@Qhpu!C&GSSrow@-H#^3!O%>LB8hNuvvR8_`5BkA$c_47+ICjrf z&ZG4bnobjr%IBuCG4_;n_d zD7Tohp^uGBzC2klshXG{#u;N`gkhN zO%2#lxT|n%t|xZ9cjoyXX)QqeK#A4a5&4SnL)iUls%V?9h@hBQeNay54@}3i4j=6E zY6%Nc2fA1sZSmds0A1nkTxtgtV3$1Bc9~=GTGuN~)J+CTjeE_J;1bxqz zP#%vMznI$}xtrU`Qck{aXZ17TW_XF)eKr&4sa*;1NKj)h%j5M!AagX9Li7A2cXYtn`HzIa#c;nu=B;cAxYl;oiA*W!$nVsm)6;Hf5$c%DHhJ%24;!-S?jTN6<3tHK*LkUe931 zcjkJbj;MAH;rb@@i>Fdb<0`hM~X(lJV*jYSP$~)E?svo z@+O5}z4!GxD(zXYdpv0S0i^H1y0qK?aRh&8;V_h?Z&*oDz6zg|98s`C0 zBIC=H5jcgf{oOg9;YvpUcE3ke9b2~>`<+#1DDO^UU%Gv68-~tGr2ModWNiuxZP6ZF z))#O)(<}pH5{tPH^ca&ldujCD@UKWS!RMOZeD!3i3MX#XjW)F}K6~-5V(!Q=Sg{^n zz?~cy71k@UfZP9YF?V|0{exlG@?mp(byxxCZ|i|?kHf#};o`IBfwK}h%d{xwN;=?s zz|nh(xu0=A52(O%3tK{aSVS99!2N6+7}g$GOGez*jDym2z#AN{ zg7vfzSnk#a0~7AY0VnZ%8sAjlxeCC+eGTrA420_l+<@?wu=_pIwji?j%kjhb+Nju*W5T59;$T#F!4%MWvgmE;_WC>Y}eVQ_s5}dfwZ_ zp7$WwR^9nnkC^#p)zv*Y)}w-~a?aZNPS$AbN#&gN=ofG6icm?OSNCLx#@MX;;O1Z< zAFXbGCUjS&85S*IkE)u{<4x2)ZfDd9Zt3c6=7>YVsLA<$xld!i+gRI||X{;cGwK-n{X3&TO;lfu=4^}N+nY%^(_}Mx@!qFf543v5 zjkI=-;hb;Q#{YN2A9KY9+1T2HI7P|=6&r2H;D#5d+G z8vWYdahj2O71$M4jXexi*ssl5u+J6khO0HKv6-V|Ts6*vBC8s8&I>g(<`oui@~(FF zzQ%;LOKgW7I!hNa?UY@tXM4xoTN2d8zvSty9kGw5+IgXxEcJ$4SCFk<{XC3-VJ-*j z6YeU~A)VFE@A>yD#%rBd$gmr00 zH^Lr*4q$HWr_D;udL!#pmMYBe zSCchrZfi|KmLlv*87wp7T!>Fl>)3s?S!~$(GJKJ&=u&o+(fz!!-nqYSef)+5wtRM= zvfLv`)BZ5`vEPQ;s}*l>U-=#8HjB?CeoMIRelxj4e(cq^QkQT$;4Z=#`C<4S>5s1i zOjw7`IS195!nT&JjQ8bTv30&-A5(nV^iJ!KE=vfeeL&q0bLS&pBwq%rOR?&kMQe92 zx2kMD*6AT#uu=UUy*081Psj7|{yZjaoqyPZGBvbKV68UnIsSd$Le|jCF$*$$sHPxc z)ldPtByV{KTn)AL5Sm^GP9F=EoqjbWcfXjqyKP>7g|) z<6iAQi_;kmPtC$?-$NLSIF<4cTGjg0hq#~nrQ!d4zcs1LFj6@S7Tz{tC)O;k9qzC6 ze-rbFuqzmuHoFv~k*iZ4Ycs<>kQEIoR#PMYxcQFIIcP5^_}4r+DL$W$GGUWa_|#tvBag-MB8b zCF!Dh*q;$q_5M1xXCF)j9bRzt#^9XEu<${tDw0jP^%Tr zC@bOqT5C%fQ_@k}Ri?1O8sFzOxvU^LR{1!TXo z4YjDMd>)`gMig_K6PMDNkNg_A?GZ1CPdg&I5+7j`I_he}hrYk!PfAsUG%jc3rm)2VYEZll^>2qJ=OK9E~R>UH=1@lDz6w*7Nt5;15$^iHlWR-ZkeA#=XvO= z>Qm`F50h>r!kGeI9&N%5f+`@XYF28?)Rr0ZJ+B?{*U{4fJPos1s_c`8rOZlDrq+74 z0{&LxJr;Ysg7pk$MW@GM>DJ@rXA*Z+Y689tp}D6I)eLr5*@w+G4|XUz4RJh)nW0J7 z?!npOZHx3a>=6hzSFIjRXNUAxnl81-C%?GXUwWxapNKE!l3T+Tt-)NOG8f~1n6nv5 zyp&h&ON%ZY$J_f^YCs)zEzE}X^@c-U9#@QMF-55ZTcxhBwed1tI%$6lvll&$K8A>+ zK88q~mJw7jfi+?~8U3a)Gx_^4{7+`ViJewX^#yBu7iUqgb0j4U!WoAJIO_lw8EW4y z^X&AdgVK>Ou%&GXG{cg#SIb_pEmDmrT4CE!rbVwUF5hUdl+4Fo*2)(@MW@bwH@M^z8EJ<+l_m{$?gez zIc@JQ@!jGYa3)oF@4euJF@7&+Y7Kj+*hP@#vzJT3v#l>|pW-`}1@G{jB0i_|WiU$W zZ++-w<%^}*E8ZHbHR{uX5Q^z_sq7`_F1D|q;rvndjiH>rf+<>A%Bb0I7_|{;@2y`MrDhQYWqWHJ~>zSzh)P93vA_2*PtPm<8OG8R+?)2z zT-=aN#C}npq2?8X-&2&mt1u|RHt0=R=JPI zu$T`w?&o46*W%kJFz?qR9Ihdu7zx;i=Wj$=*oXUf7@a);_y*-+A3$$Yyv)9WK2z`` zDUYS{Ba{mys{iA;zLDy>YPQYV@4H#&ZG63Pu7u>$2AQ=&&pr>>0eA`U3g80($t=}Z zoAF!%@E*=+-vN9L2!X$PlSPXI1Z(LmU7B?x*ZW(a!`XGv%F#52Q)z#8&|I8AVux+# zoWA~OMIC$GyQBs875c=cinDgib1}lI>g5Bfosri#XZE#f=j6I&*r~k~=PSH|b2>0S z1WcuN&N&r3YG1(KkZC@%xVgrq+&p7}`L2@HmlVFUxOoh$h%u&eU#8AEt^upS{$&;QkV!+#cF%Ur>F(L;o5MtxK2PzuC*gf+c@5?umW$^;LUOD z)qVAu!kYX`y{z%*aXefHzkY=Gk&uugwtEa*IBT)SzmU(L&vg6>my~| z3dPhze=qDmr;O47do?9&-%9io853)g`b!HTho1m;&SSuR?RHo_F2VUX4UA5CQj;)h zge6%O=^dv@FbBV4zIxbupaQcIW=_@DE8!J$^I%2o%4%^p7A{s(YH#eb_QJwrZ#_%ZVA}8*h8ad!uD{+9!XV9 z&>pTwk3C%Y@I74T;T+n7)y`SfLVq{D7ON4El33hHhNE%HGUt5hn$sDE^Q3H#_1r3? zv}bL&Hv`SLsh-jsQM>mFlZ+EsdOBgFY7=a^mt$2RaYQGEdz}y0N(|?OO_|je8k9Bc>A)}Y@hl5@s*^?Z&qD8kDj7bsQ5RAabENt+K%oenjnPtFcC?0U?+KR{ zI^G1ng#fzZxeE6wxK9Q20rUmfCJ5gJgNEPx?rnr!EPg}ZZ5S_nw_FzA+;kCFHKXiL;0(IDv0rj`qzoG>FXY!(etOr5s#@6r4KOW!f z;|`&}{IHd?&x-%-wKj(R52FPG3Tzl(lK7eOAfu%;jesA$qsuf-pv4CMN%Tp6y<~p7 zr4NM9e)ZoRKB0h-2uDE^0aDuVc*E8C7PvGBP5A5p3K|WN(tyX`yc*gv%u{y>u<#af zECjLV5H=7;+TJYegtkICnWkXXL=Rn(-_I>aC23^_6tThNyeo()-pGt1vI;+BN*Xa({Z#8wzOU7Wm9zf}Gye-i){Z!+Mw^0x%?Is9@%!)~cyAnb2lw~Ci^7{!|n zxK+H~&?V3Mqb<>bVYY!Ozo#>QCgQO#>bl(QkFL2;-us?^J9-hg`VWo2w>JUtn~`LW zWf^zi!OlZQn7QKK^K)@}!D?`(%!r34~l$mWxWW8SaP#kpqS$f?aziWOMxa6N}{wGI?eIS_* zBb$pPCN`NLrEQRg<=e$7+$p`=yoEkj4z~MJG|6y7wKFGiCw{4Lr*_9Swa^C3!JYKL zHiW0DTMc&*?u7Rq+)u)d;?8u&y*2L12uEeEGw|qeUk-mNyUXF$%nzT%3ghSQB zB;!5ln3Hg$>B=m}JplJ`;Kz-*7tjaL0gwa803-s20e%Kt0UQE+4R{rh4|p4}74RjX z1mFam18f1j2`B)(1_%S7Qeuc6;>{4iAi(2*seoqzuK>0KRs$*l7Xb$VM*tH6lK>9_ z;sBI>N;{>S+G+y<4+F9QPXMTqL_8qAQ<~oZ6akh4W&^$fd;y?_<|P2}nRwn2&;u|I zkPG++zyzoToB`|t90x1_ECy@>tOfiRPz*Q?s0O?T_%~o7U_RhJfB`^lcjCDj@EBkk zARVw2Fb}W}@Dbo7pbqdKz-NG`0I2{gU=)BdjPj85cUQnjKnx%a@C={}zz86@A(k^nZq6u?)2!+6a z2v`M}33v;z8K4BT0rUp613U>B4;Tzc2D}c~23P@@11JUT2mAuK42TB|2TTTJ0v-Tp z0bYPsfC+$Xz(arpKrp}q5DJI_%mTa&*a27rr~q65d=B^)&=U|2XbuPjL<1fL%m9o9 zd=J&>;{|wyZ~4P_yq7iz#q^I&ke&{Bf$K8- z=~4p_j7e6I>w5huxjhAMW{CKn@`f(@hA#S^u0z6&&pUdzLkuY4e@=`Kr0^HH38mz| z)%P|RddIuqZ!Z!g#b=PYDME5nd=kC?a=}M(FTJNvUGd#2ysrzsP+9!+7~$f+6@DKv zyu=@J%lVbzg0GNX;*!#TQ2bDG``|qVk@Az=ghF!L#rINp3kAj{xk*>hMQ*xGF8EVj z=o#bUzSVmZ!c&wIe$q$emeTLaPn|2jUEF#Xw@#KGpv3}u`oEsO+rdYuv@-nU4s~_A zAwEJO@y8wXOZezc^vm5uzuf(-*Nyq3qnEfOdOFF{Oa5Up{*&7s^b#H^J`M>6>EqyJ?16cHb(9eSiOXu8B?@?+EFrt(DZX}p>)i9QNXUQ+l% zJj>m0Q(#2sy;_wtMAc8KYb_%#cjQhA~G?xc^<$>}4v zoIY~9%9AU7w~|je{e;h*^b28Fyu)E|8P3wI0A%~#8C4-p$eynYeg z6hv~zQY5&f@8$SeSNsU~v94wU)dl;+2tAGo}I|3e*ioHAbNDT zv*Po}MS>ss%df5$oHqm@zeR&@9wuNV;#x1fdwP~|4?x%?fI>z@6}KN0>z)3eVq9zj+uWmnp?Jy+07%zx=dtr|;$0c7$2^zVI$x#3g@E z&+`%HyZ3}JKP0#d+b`_-N-~0ON~1P0etR-6%Z2laKx8z~c?*0C?TXsGmh#ug8LqZwg`Jmon<7lYtL@ z@c@czE5a;_0nczJ_m_)=dp>0EWxyp-26ZlBMgos(7z@HmGMg%XM>yq|T&|;jBTV$L zVX;GpYpv1ogJNSej1dc4di1>S{$9OPN2iTRAIl6+e66B#XXfa%gHyA33|a)>AL1KvP{^?vh(en)aiVtO*qroCZ8$u;PVNYV@tIRo zCuEG#TA~xRIg?T|C#R(oR&6-bv5z)AGj;R?tj+Qe;n)W!@sU3z~P8_ab#Luieo9HuI(X`INH~LRTHc9^G#xOi4NC%%|8pbjqJ(b5o%pW>Un>{6c zO1g{p@SA(n7XkrO#*PJBg#7KJeR9%7O5K#n+RQ0Wj3%lQleBTsi7|s>hiaL$iJ6({ zX*m-oY2#zGlXFsY5H1ZOIu5b&QkoEL$~)&dQ!ssS82N$1v`M0 z@RAyKXFI1U-vn;oseEhFJJJpGHqf6?aQF@4k zn}w%vzZagqllpfj;2^hz?-!Yy@K8HRdQWcZFUs9S54k0L|H0xwx%-&tmhi7~`To*| z{{+kNxu)kQiWHahy8H_3yLZ%z6^;6qb6{(F|= z|6#rf47$z#rt&5*@J{L9F+i^pff`V>K8!AEziR;QY6lJ!`*+kobtm2*M0#nxu!NWV zs2U_cI_KuEq~Q|2rHke#CA{QEc**at;@xwH_S%7HxeJ`#({_i#5qXsLk|1zxb z9K)EVPq=O~@i@YW%`E17*)x4Z{sd(6MLrim?O@DuvDvbD2=e z`cg*|mt3aFj|z<3j}P=4e@*frFy`+j4^8>@_sq9DrPmiV=?7jQn%WOSxzM8hNaJ{a zv>p(?y7fQV!j$86SG%uCp9#GGyVXM^XLQ{OIlB?Bd-@kma>i#@qYXWG=i8m?5B;y? z%w78IPSx{G^85Fc-(|ACnmfm)o8;l|DGz@;eb&^!;03Lze<75&znlCv>B+yZo|N}D z|H@p2kn$V}aaz1*y1G<2y}yr%CVpFZ526oHfarT+W)tO9XEG-R5KOR5_+o-ssFOZKA*z zmc7xfP~7O2TT*S5D=bVq{sE)C!TqX>`vq}b>lns_gX2s%l+6^>;_fJud0+ya^VWD_ z-ud`8Mtg85qdg8d4+v!a6^Pfw_B!}IR>3KhthXW-t6Nn&yOGImCEhV!9{CCrwoQ2` zgqxCXc*{y}l_tjH#-Q!*F)dQZdTRnB|U7w^gtWg;P{}U3n$-#XR4xLNoeFosj!+8E^zeF5Hm&W_`#4_04ATJHa{H5Y(!QKen1;-Zl#;+&u z*8}gm;i((mr^D}l+;Y0;XG)R{#g@QjFZ^y762seu!0Dp#NIzrE# zR3rMK5C|fJR%+Avckb$c%FhNBY?!%c-GYZW|3dry#sJ(k4thmFX&3epx)U#dcq#DG z`T}?24Me^X$%L2k&0T!>1V~99B)smD2Wd~MyZKN8TInMBCH}gL-qm7Bb~n9qML8q9 z?p%LwzsbBL&yL&tvqR44lIVqSh@27p|LVW|>`6My)Lr?uQ6$LS`9^0^(k0<_7rmY` zIU{*+7hdfh!mGPOcz4L;*PZJ^G(YwrPvV3K`x%!nZ$4f4Z0-wrQ&J zN%(QOo8A~1y;8XlV!FNmBjV@orq?0jrE=s>dQCEVDc{`H-f8K=Uw7f{bBFNuyF+;8 z`oW$3c@v*k?r;Cz$$TRgOXb2{@<91^C-73fNqF6vZ}Ra6D#r}t$N%5%UosJki^gHx ziC5~!-cFl|C(Pwj53X?PLeZs)+DpUD{FZ$~Sp?$DQ=vsdisi86Vt9Zl7{Ti8E6km7Q8d&gDppuZ_ZbesS3dXwrmclBeX z`i=PDPP{9{`hvtwTyI1~-}W^}mTy#FxQh<~BE6C=b9dpDY;QK+l^P$cBs6I#BHWwd z{!r}DVU(=qPg-|BIpbpU=pK9Kr6(HuE=ufI-CsY}P)uS>`pv@kM$U=~JYV$CqABB| xM`vB#H?#HWxBR!X_)p!caYd2N4zXXhkKO5g;OglCtqPwxk9bhcr4nR8KUciHZDF9m5O!$ui9tRWyN&t%i&jMBgRs%KwUIbJD zb^=}lya9LzKgcWzXxzXzzoO+h};AxkfHaNRPC1D*Y$g0OWbA&1ajB9cdaXlXUbtG3B)!)vL}h z6C$$mIvsO$%ZQG-&mgcd+iJMl}Y5F{!1BIUZZ(WT2 z5hgU3>r&5`wB$~dwwgw&%#(|jJ(lH_WG$O%so^GYU5@RNS`o$}u|2Fc>=+eU*uGJIVv)ax1u- zHEF!gs7t5P^ifu#SJ!=V-59xR*{-7K<+GRXT7GW%xnhRlLHNA*U0orYZ%XUEm_v?QCOvV2~y3Fw0eMv;ib!d27M_lB!p;V zS)xs}GWsyDCe&NEYZ*9`&GQloY9Kv_UnD$sIpbBxY59y;KI2u(7%wZ?wfy4psAe)Q zI!EP_#7pDZu9u26u4vv>LsCXqRW444lDm#9)3^*g>Nr8HV?4La+d#&J4t}$*>%!8X zJP+WDVDSq%zG$TNOHtsrToM*sTl0d6Tu?Vepw|>xjkPzBZ=mmQ z^~4ZAc-b2UeFe~M=(mEMmDa2zm z6a7SB3EE0wEFck(L@I@G+OOofF3B|Mw9s!tk0skvd4sJ~9RIJP&eechbw1QpSRr$f zm2}k65`G`UxQ#0VEm66Q<^OMdYMmM_+PYZd=5%U7mdv$A7=m)cmFH^@6cYVD6L((2 zr#8rSUe6|z#4XV(u1?uUB$GG(rL2)r;W5vj-icb0K`B!|JXxJ`i0tkrtUN9hFk43 zb__RBi9^a8uUA6SZB16W8voG7KpIe?JP;4*gxW#|@{A}2-Fl?R+++%Iv*qW@9A%m; z(z;E3^m-*btH%XTXrN@EM9_Mxu%6)gCjjuc~u4m}a%R$8ls$!Ug~#xkM|XaVEO9*l=}#L6iD zDJg~iysW|WLuIXOEdPC3bPWB9yl6=Zw^S@CxW-Y2(pS=PMsp6xeYWgY->#pq$t2Wq zyw*+h()52NsQH8*whI!ng6O1PMjBEhO;TT&+QW28yo`jIpv_VwHP&8tGii!(SKSV; zQq+p7%OuY0iOSw8Ob)-d26X_(aBja(>u;)V?bLVn0hm*vWGb6qqQ1;}nu?4v>r8Fc{|`M_TBpvD z@Q_m+Bov9~*9ci@(Dd9IVG8@DTzNXZMmat7zeA6w+qGgVWz&70;2PQVPERnERMVx? ze-rgeGurhNKme$|VHH|{0@~C8xn3#o`d~R7|9>vOCnBu{P+BLMMpNA`-wVZX)Q^!_ zWnyflFg5)46ao5{A|1yYvm+p{y>;Qr#a@YYU9~^%`NBJ*CrxkBY&97!1jay9nW@FC z=e(iZYvZ);yK?@EXWP|swOx@mOOV9g#eZnxj*sVWxYg+kvmylb122^N#vQ`=Qp5#o;fKl3?<6kCvD)c={{3p#?ssJtEif2R2WX_ArV zh&$x}O!LMd-%?q!7WCK-H~=^dI0m?#tF|nTbP)rjW)|h9TQSYaRDMyuH+F0iwKpmE zi87pB!SSKl;Ywncr9WR7ff)<6n49%z-C|geEVL$%JmchXn@r?HKM;U9n z8W(rKqOj^V!=g~6FwI2U;@N^R<0YwyFSzI|;D^C7+SAW#+Q~T$8Ssy})v|ys&bnAw zzO(7PLL8T+bh|C z^5{1h*Eek?`jroD82X|^{6Y;$hPj+lmFp=aaR&Zl*cYEiQ&|AZPGFwgZj!V!5`|0Z z^-87QP?@ZC`0!-RI9fyp5K;%5L-g z*@z>qE41x{b0$Ty%tiTuz*eAkbK}O+smdIV2k&#Xnr%WhXQ`P~zqqqxX;jvjq(DF1 zu6Mk3lCnH+esk;ySGWc}Tc&7$#N{*UW=T0a zom;Cxn+C*7_{e6qHC!Ji$R;({Dq-uLhF$$HNR13pYHS{~sADu|s4mtH>0>rgT{p_D zMo%S?&+CmHf7Nd_MKsrlGmzSSPec8o2+%e z-qpD3^{&EY7upFiwyH?6sW=lB^TgLhN_`cliYYP`Wo{FS%yBguv%>tHhtc^w+l09W zGVV;X#{4bnacZz0)UN*u*0F_J{d@uDH^0|^eHe@C|7H~h2CkQ3whCFP$u(PrT%xYo zyhxJFUWDAU7C@Sbyu(w=C>&HBvW!aWf^&Z^B!;z`H((o8wt$Zs!UZO;*rFCuE zMIy8Sq%pOI19pu=$s|JlQ?9vb`2^-5GR#vPO77+t#ts(JR3fgI*oZB$!?QJ60vnfj zQz7M1zdz(b=ac~niqdt>ICFE61L&VinEa4`YeRpy{+t!DbgiRkR+sKvR+0O4r#Jlc%qoNbC%JR zUwAlJoQJxc6`#2GVg~34H_FDJBB=jrq1dpgf{e>Tj+ZJPK|Qc~8NOPu8_+_nsh)l# zMJTyXgBGlY6mbg$hHdg;r}QgW?=V&}PU$`bxg>MXE#F%fj&-RY%d*`$%Y}xmLNP}Y z|J%)IEz7?0QAg;Uag#L zgKesp@EFzFO2KBpI*(q1T(UZh(n_J!fb}n|?=h+u%`8$jviP=~@k$hx!ZU^%tm!=2 zv_`P0kViOTW>jKqV~vcJAT0^UDi59S!~S1F^G&N1mclo}UuHmRlhNyUkUNQYz){`f z=z3aNDLk7WQcLb|bod;McgC>)w9k-z+fIf}Z^$MURow+|) zU>+Rq^-H_m>xIMl3d4G#IsenE-iJTE+VSwy)5ScV4CL{m9Cesta5~QzuDAswM<74<0&3D(3<^==R14j| z6KBkUyzP!9$UD5|l3;T@je6J|3p~v3H~9#J6gcJ~CO$an@PXnQPfqIu)M*m<|>P-N}}X_r>aWwI(wcmL#tOIdX0pdXf76EV%iCYEc#-Ur@kTz?Z<6 zEDF6t(yo?p?P~7InF!2cLnX!L=&a+>Uq$P^95Z^%B4~2X&3ZXDD(g$nBZ8!2iXd6p z=?TNAlnBhEqaI>Nt)nv%qD^f$Uifw48^D?LE^wJYwaY_iKb1m`VaU#9vG+iKFB!CZ zsm**j-Oxf{Gha>**cHa;(y89MCGYEUF9{nPw+q(%g|TY|YdU9#MIjque8R}_W`SAA zwVGv3t)Ftn4*%ViEoyVqbtN~3DHPFP>k^ZF^_%@5S$%luLG+Xt;}YPT~F;7j@Y zwN0&`arB#?JY;-pv#M3j>8)%sXx0iSj&g9HR|_J$VT0<6oHl zzV}>;Iz~6l;`jOdA+X&2X^c)~nQim?e)9)gcP%)9{?F@NH5Za1OkvrD@E`rMoCte_ zml@ORRx~KE=SKJ45(#S*_u!ThBQZ#Gj5qp9qj*Vrm~E>~omOe;MsL%yGeD2fTr1&p zlpZ^c%w4oyQhR(0BV~KIc3OiZ)T`K!`1AKm?P82!G_>oXc|&OiBKJk5*I zMW)iUHAW_#rrlQK_x;_^=qK=rXy<2QKFp+{e1_;(+Ti#7&EG20gvsC%N1nNKg?O>Y z8@?JERcQ%^<@Sw>;+#%q5j+%=TI9OxA|}ywVm?DOXuAZUVhc>8A&nSyodj}=(aS*3 z|M>SIOvOknG^F8*8udRw_bChLUZf0`@=u2QFyr{yKy^5$R=t!bt7`QL}{R&QCh=V;g^W*!Y}E);0cd;E!OAgs$($vQjc~o_Um~$dNNS1U2I8^ zPKh$+`hWDS6+97_#g+u4B_!_qK$)~XD3`Vg^AjC|)K(YfdH5Y@A1k)S?=y<+z`OzV zrl~SqVtql!5rO*2gTpArPkvWI?_m7$1J$v;GjBM9lXA`X47Eqv`zox3GA=YwqqB+WV5l#42w-m=S)i>Awu{OJi#|* z{YiWpuf=Hnb|9dM4|O@73_Z^n^d(w8iGK&*L8`C;Ymb(Z%0o{#P(AJOsOv&_nrl1R27qi$@j-?t5XODPvW4gHUFv}KIgp7;9b z_Z+@gA)FDhH~JD0CPx@Mkccpf?H1F~^+Ew9GUCeNRxyl0SR2APJ;gR4jL{DRwna=w zu}e3x6@#$>?e_A=sNT?FPV=XDC&DS-87Q}tga_*2)tWlVtR}&W@GD3|mNdZ+ zz&agpn%;qOY5HH0j|1s{9sHKolYUFvOT%e<#r$Ul(xY7QTUsvaCf0}6jfPYD4AqC? zG=KUnt^W{CX)=VE)0+fE5{tdy_-7(4O+sXnL%&~;Jk}&=lJai& z(LPmnlc3J_``UY^+<0;cqoXpVwI`K-P~@0jdJ_4GMN~o!__9P9`u3gJ<5d%5B0vRD zT8$ki($t45g)A0(5xH`U1SgGT=~X6+t=s*$AhALpKyM%WC($-yj`ICDtcBIlvV(Jf z6ealK!IG&x@Sh&-V99Uy5JR%ofU?ynTh>4{C=;LpXlo>iRQppI##l3K=X?%E##6nD>ZdaAihlsQZ&f$uTXkX9 z4b?JU#WVlH%tWrSE7CDvi5<>=guSwH*ei=!aeyS3N+$mp%bb&Ahb*B-a-Ht5X~aFW zNR{9Bk^eW(X5>X>=>NJh>QvCAr!m9Om{e}cH#K6JUO&}F@AwtsEMt+DITFSF_?pPv$P zmps1Ulwe829!kuytK05k(hwW57U`nuUm5H<4OUyp{L?~TI+K1J?rA|t-!XMN_C~EW z2sNA*BokrLojolmB!1rx|C0AnmLXp(2PLKjtUEp}f2d6MF_bwYEjTMC`q|*BH1amlp1WE*;#-Em$>eM+waVP+vB_!uFrWN+)n2txb4o#aNC^s!)h}&TP0RojGuuomRNtICJ5C>6`}lGv{=; z$DDa^KXJ~0>vYb9`;l`N+#}9>xOL8l;MO`HhWnoL5xDOHcg}{p z*I5X6kMnW3yPQwJ{fF~OxZ9mJxLch?aR2Un3hrj-f5F}8Tnu-evlQ+c=QD6CoJ--Z zaxQ~g=6n|JbI#}BE_E)4Tk2c^_i1N2+y%~6aR1``E8Ka`3b;j12izx|tKrUZu7O+N ztc3fpb1mFi&UJ9}oa^D{Iyb=0c5Z~rJD-PZc5Z@ebZ&-wzw-sS_c>pLdyn()a3?yq zz@6aS3U|D78{A}P72HJU%W&hJufWwi{{eT5a|hg5=T5j$&RuXvICsO1aJ~vx?c4)5 z#Q9ISLC)9U%AI@RN}R95Wt{uq4m8|xRWKWJNrGY8CE-i-43jtUOe2gxp)yp8@xs{t=KwPxV`XztK;vYFmGX9b>bf+SRlB z8G~VIUMHp1&VHIJ9q}~3nEICoWr*Z%tQ{;>PyDCJB%v8g_!#N7tVU*VaD@rN{K|MNMY+#{eJRzu(T> zt(l0mq{;io!^-Bcx-|Ja_i14Uq^BkAq-LZ`-nM1jrE6gejX9gp@+QMrE@bw+dGCw%X#@ z)o8bQ<8ElD(amd0PL{;ThMhKVoMPWy+giBJUNx7-iJFe;GH6V*W6DNu z3*)rRT#*OTDF>VqguA{gIV3Zm4)EJ4p;OA-jCpLqVd2-i0`%~95NQ6xLR&noe-+Mu zY!^tvtQr~;Xo1&9dPhS0A3#VTw92GvMh@|(1TRjtt$yeLayupT-4$G;v+S7q=bU(t zJfxY{YNCAhf)lkb3UV!4pp7^ky}*QBj_A3Rqlf$d{96v%yj0GKX(j9xPt73CvOjn_ zXZCR_~0b?VOG|DLK1muhpER+!-$#2k>tMf9DZR>S4@euT^naVFYh~DI&}vQ zvd~-{VoGzTBfZl0y@%M?0?r=2Q11<8)pgOuY}r;uIgV{LNur7~%M52;H$GOx=$Ib1 z<6M!WY_-wEF!!2T7*ljnbO}k+xTsYhU9`(?@=DlUwrKlIl%-kZsExLV1B*sDsBcp@ zjGp|uac9w4&(gZY=~Dh%p&-rt5nT&;$)Au@Wk+qeDqCDm#6mO9WknP(D$3Mn;NU#}mZy1XU&4+uvow1frg#r`gVlU-VzBdYaF}=xlO%6Sk%XT@IfQ#I8 zRdI`-mR4YfO}(_b_qx|nOXuaGNT(3v9fR>k#M2Wazj;I(MaLRRF}Cv{ey#8uMu#^&#vZjwV;}H6-cNsV`WX9T zs|xV@Vez-d9+?Wg<)?86gceR?kHzn2#NUU77DLo#@H|)BIx`e!_oU3pgQgKDwwSQu z7|+JX*oi)n_nl&1_j-^6A*Vi*FJ6RbD60S;*f`%Ln|yh5|EJ4X*1Yu8C-y zyiWFqG%0=~38a`T#{V&o*x%)mg*4cE%#6;(`9U7kz!?)o{rxp0fdM_*4BLg@4B<5c zp7DIQ2Q4-*$?Lt00(;H!aQhbf)>Ufvef)s$*FH)O6CYzgyXp)m^;6%7`Vg$7x8-9u zX|)L{&WkDTLyBu++tfMRgx@%VoVTG&CYfz!lU2>7Q%|6baC?|Ne3i1K%D9>CSBvX8 z2uHunMo%z?aB-!lUCf7C*in8KE4WuU#h^S^*A35Q^t47X_MNMCpg!wGYBQjApniY5 z`8yE*f>^s-@oW2FgJG?3EzOk=tkoZ(>`SMKZ)Op%&u`U^P zVbfj~3R!y%lhFumTgV#gL$JQ!P2ar;>u;D54)}!Lmxaeog*D9NpOE5l(?nR{BvXc% z)?U^cyNu2wC=XLvBChqXV2nbY(Q3?{Z8v7q5o??_+qMh3=7}_V&!?%K;pjady6*l& z+Q9{l*BgzMrXt*dxF-)eOX)sQqzmp-Bq525dl%i!jLuSZIgIjF z6N}YzU8AC|tGr^Lus5{T{n(-HLSb6+M+sJj&f~>4pwzjB9OSn2({@Id*GY<`y)r#B zNsk*vyK6~ux0}K0=YVfr?}!{m7iFnhVCWU z=tRmGBkEL4_cjPhSJy@5?za^e4fwp6duMipGoUgsy2lccJK(#s*RMBY9df{TxrctE z&JF{9u1CkK;eXpB=_-F_7%+EFrJi7Ia=`a>kIG6ZdTwrT&aSzbKf5N=eHZ|(heW{| z6~I#oYn%wk089qZ`WjQ@1U6sZOVBbeWjnN7mt)rIgy8rlK{6$*2t8Hw%If_>-$Pi_ zn1YoHDON6qUlK0Y0`>v6Rp!B6bM&g5IeJx^wK@l`hwQoUBU9N5C1 z;CrlRiFHYKG`|FC@_X`b^kVI#6!^5B+58yYVqlh@S$sDCG%&MR=A!IH!0+$5mtP3~ z-X3{ZPtgKk6MIVX@;b|x7-a5vt?p6az1@%IJepkq z>_+##_HNT7x%;|aXCKLa#ImpJhb5PUy;}!-SG#F%=V#|5)sNjeeir;o-I6X+G!xjl z?isnD+fob8-S#b+o=y3ux!bRwuggX3SKSt#);6qXzn$h{$)>mOESCK?3pncI?x_|X z>V8DbZ3@yK>Yjq!9L2QdT2P^S<|K@SgUByb_aNf;cVpcW`CaWcVo%pG0kX53`Vok` z)Sb%r`)>3mLIMeS{l4~(0`_LoJ))hPF@?h(xQZB405*UG;PX!)3ivpKfO~qR;I{{R zLn{eO;(#XtQUIv{BS4KY6$#J)==dT9Y{41{OB9GxiShWp-QVaSxr9It*#Lgx|B(=* zBNAh+6nFm^90{f4E*78xpT`2U0Lt^~hjE(=V?v9(;*dYRFPI2F1rQ66pgg}{PA-M| z{YHjExmX9pccpcCUPqQ<+EWWSd$5t(1jP$>$Gl_moyA!`V`VfwkxOmw*B}ej*j1H) z;Kx>r2 zKLxw;XMxs-hF%tK)yI*Z@w@sg^jm7)C>h>Ko*mVEt47C!58IiblWuBTmHLS`w>wze?|?g_|!D)uW0#6uvt(Nr21VhYO((@^)i3K zZK(|{a&9R7C^7vVSFdNriuu!B$C3OVLF@4Q9`l!qU){&kJ?KKCq6O!lS`-{h%gXfo z{7w;D&E&8}eqW2T`q@%-V11Tg$F|@1vtO0FPQ)(zseBAV*m=M4#^2es*t6*Oo%R!h zp~xWG-`7>bmZAB+02jz~34G}G^U9~jj%lpFhf-E@C< z88K3Q0h4cGECyx;c*Qa;j$5oUpP{X4saj@5hWNMdF)YeGexG-CT8Q1DOZ9!}c$&ixBBkH1|2sM~k-I2e>gn^S*{XKRQk+&5A&?xu6-_Ovlg* z*k_en;y}BRpwL`Us2{V@?m>Fcys7Y)6hMGSCA{gzrK0iRgRKL`j_YA}0DA#8 zX$t&}0}OVk`>`JxsT&910Y3@;D)@=;R}65vvGAP(bgv^G*y4eBdR`p6A`bChy6gJl zm+*V;?Z4w{80;ZZ`wi#%v6mJN45#U!sWiZ30&N-JVPhz_P93me2fN>A9)N_%3CDiBuVDp*?x0h8qym!x+c1zJ?j82~e)4A^r5s^@#m*w#C++v0!&szk z>-Q}c!&JbU5k~iN`+Yls(Vgag-=|_2#a==gM9%`7jq?grqWAkg@H5(e-*`W46KId` zC+I+xvwj*&bAHaB*Xej>6ez(BFj}k+LiYCiLj9?{Ld@qWN?)Md;6uNUucXp9K zekrj3+3$N87>6Cse%}lcQv$OB3ldw%`vZ3Ig%8EEBRJbKL^ryo0ohPMbqj5I8tPSn zepBe={GGtdfGc$}J_Yzv;6XYEp9K7A;1X!hvB3WVd^Jz^_Xm7Mz}N6HoNXBJ%>llS z$T5DWwB+D?alSChI;BM^eY$o^OCwzF4!JuBC$x(78mk6Ysn-y3`6rUqvQd)NA}7Wc zo)~Kr>*ZpKP-|GuH4l@B6Vu{vs(aW(saq-jQdom>zVl#D*+O$e+*H_bAJV;K+TNi# zQ777p0jGTd@F>P~9?pYxrqY!Mb=^^5xtMRoO`v-_%p`d-J;lR$r4p%RlVsDT0Z%A; zVhVcbN?%^5(PXyJUj3oZl#_4YA?Z7vZ{J#CHAZwA^Sa#+>h-$&Eg8A}z7t66m~a=q z8rg5K@8tTR`5ZGR;CCo~@4|NzbMDHf@eO@<0lOR65ny+V*da(N$1@2C6Z)`5V&Bd5 zoi^U6SYpwoBJ2S2ZktQT4ISNk`bzaiaeVLSqjzBF$gb)enG;dMc{4aoa*rFe4o?tk zy#e_eXCd#I2BdO`rD%a2r!Av)|Af)_wG6*-(-By`m_jxdVV4R{DJ15f}6*g4Ph zTli5_TbJ&^9rS+83rQmJ?s4odf$cNQc%w<3pF{gD&pS`Gddha}&am43Mf*!gyZ=4| zR$TWN8A|90Ndv+RSaYlI9cZWVnPvmt$Dmj(R^<$x#Js;K(qJ_o>g~H;k<583l!>ki zgR?Z4^m@EzFg9fp*S-^JiJd({(!*k9dps#8o&!j_vl zg+Z>{wYWD=>p*2Y>OoFXn`aolkh>$aeZCj_hl@L+eZGwiN`y+>kqBMWKLR&tWa97F z@VmT!ueQ}g*K~&3L-SdHc-#u(iT4ACecD0XHelnKcuK=Zdt^N2u3B)Hv17U@6DWrm zyhc!&_J{*LBKr9O-?(&t(J7%Z6`W>12LF`sIlhu}$Kan5J|4tB2EH-X&^dtcjlkCe zuK>OlxC7rZz#W4)dmFC04NnzuLLh}@Jl$mRHn512K&mKbv+m&LXF`1ni zVf43%V_hhKH>xvR)-k9d!hu7cP<&i=6z*K)rEfBA#LXX^BAj%mn}fdmVgB5wi{}?V zO;?fw{;7PkR{?zg)8NYD{WK1K@%(<@*=`wcuOAMcifkU9Gr}_RCQscf3+c z2OUOt9IPIbAc^_X6AEjP@?kLeP-zLe`OO$12;amC9`K@%%9cSs%&5P`iw%RkcoshU zw8>jB%hXw+2h25L6`P%pGhsL>J56u4W?A+NDamH&l+*?OThvb|b^2vv`9hG}&VFxlafZ4ckSEGrcVHm~HDqT_*|KS{!E2^ctBk8}%LV zj|ybi34v(fYp9>;#p(?Fyw0^nVMSpj&&&EwsdW?!^QxI%cT~}1MQ4jNCE89$sitU} zc5BgMuOoA2QAqaIBDX!WvvH=|wiS8f9+hpjU5|4!voSwY82fykAJMh0EzKM`-H3bI zKaL>y(|(((no(NE+$-VzTHFLUSK3fqsE98x^0j8%oH~P>Q!|Xr{XREy?{9qOY6pnE54&G7|)sgzIVF~i|E=NrKMpWG*fp}&P>#sVRY`Ql93j3XGJmPqN*aC zo=$`PC$6DP;KQI>GP~!`Gc2O{1Y0PD>G!L<8Jygs^RH54zpuPLV&QqZvy)2ageNF( z;C`ZFBJ4ka8jy?MBdqGWDq%iuy|Cj*v$2Mr1q+8YFn{n=?;9>=oE$uUNO&qd#KKIV zG3_4dIP8rG^I18pbb7W@ff}8ImDi7T;URr@!b#hVJ;PKvpbNZ5&uA!fsvs4H+9k(H z;oOLOYi5<4kVsAwE$<^n4E}hWb(Z2iD2uxaF|SF^u2;G`KKx4CWZm~-=I2kNv^gaFGXEXOBY&C#bC{vh-YJ4jE6^1m0@}9<`=6#?QrhjGPv@@v zzVD9&Xhh4N2ii~?QF=W9d0am8ft&{{v^F@;g|X0M!txGQ5`UuOg1v9-qy(I+O1>xO zlAvDQB-oSCGqC%YMKuX4k|5)iO~MON`8r5#+z<7qjmJ1UH3uivu=91iw^l3D(vEppv8_X>FeL8``3DJJvD5M+#KT62pA^&kws}Jj#boI-d z+2>pGA?<_Jxp?y{0(%x8VeJd^VIydh3c6U}r{H%1d@X+4ZlhT)ep5P100V!MkEVMD zbNsl!in>S!`AdPdiDxlq8RC->R=*zo+&J7aBHLR>&&uU_lg*KNUt{fr7$T-eOpDBo z%$a0Mw7I zGuTI>U8|wC7XY@qXw%~?D2WANK9o@xg41HFVV(E+w)#s(b4ekvW%2SslrG7x!-@^* z^ZgG!0o<+y_NBNEoY(ovOi6nRey{Ksi?Xh`D5D{-vpF-6{sX^S_lt*q9g8&8;(X;h zPavL#yhTH1p7v<0oKBNN*Uz#08HX7Z_C-GiG{(`j-2KAgtR~@DoE9?q^EkinU-+sN zHmvcP5KEtLl3#+AjXvLM_;|0(*ymg2S6U=GS|_czlLGx;A6UnX!1^U@Poo0%r-P6J z2?Z;spS=|O4TckcJ3-DZ#rYI*-z6Bl_sUFWQjU3^j@o=&a-?Y6v-03jIxn4=+J`eW z6w65M_E3K^Zj(^onA(oh@1=Dax!4inn*K_X?ajK4#4vZ`C#_7_y1!w+lr=cMAkWtZ zWo=W;b?D3P!rMrB?jKi@az;-&jna@eKWzjXA4Lv0egVK!BKh0Nme z0y~DUoBnp5{J50Ug+YF87WWZ%EqtTiQ1<=G;KBVbDn->(Y5HH#U$9$Nzvm(GKX{l) zKQ8^ZN4zNyzM|uUkclQrQ+Bih(v;qaknokb0fF&^n+kaSYVdUOqgam;(<5yj)*2IV zR;|zXCe9W+o-v^RULP>zoV3ruY^C4#UN@ZyYY}=1bK%kA{9}T^X#0E_emWBm5k&VCafIthWV0 z8ySoGd~=b8YCgh$+ehcSA=V(C?o6o<$7;S`m03f^1zG5Ryvj9C zKNsh*e|B=M4i4|(VP}Je7ufr7R_Ru|*+g>Y0(gT;QW6)7lQ^Xg@x;9TO%fHwwXWqn zwFP$Nsy^R`e(_AZJ}N3bONqVUKHuYFNHl&ouL@hWqo%;l>icm1pQeLG$U3{q?;AD1 zOe8vbI_671m*U1L8}DjHPrpvZO^RFfP#<3Mei+`Vp(pg{S(Q*|B6}L%8nDLLPYO2c zUQTgZg%b&-nA_Tdjb4ed2|iNdj2>-Qug~kEKGp5CPemC9`v4O)MqEobt8$;f`M%Ow zr-Wr`&tfHAb%JWisn}WQ_pR@x^TW*EQ^F#)-?ygsm{2;mw1MWK?hWWkDLn}RdutI3 zEfPL!0cvv7j-a%goG0Ta=l%oxxZ8yl?4)TsOt@!|@KiII1pYIOsM#)*u?pOoe6pFY zu3fo%yHK8X2y`>J!b>e5`Pi#IN0fdVG$YSEez^5|ErM7{=s|nYIBv*yo#owSiI7-!aLX51FLRu{g27Hpkm~ zd|d<4I8|JU*B9uGz^3cLT$O2rb!3jlm0;Ut!`*|v0j!c5?1xO@xQkOeKx-XCZ*S-n z;G^}pzhJPbzy}gdpRc5E*yc5_wQ-I6Nskon?O z&8{aG9KpV`#J$#9u!_#tHaYg-)qvibZ?C;s{y`g={o1vP^6+ zNfP>1YTJ~c9$)uBYMV5uAMZep#7VJtOx%U1O?ymu8HsNgmbnA#_+AM zSHDMCg!k;;btzlfVM^S@CF4%HzG!8YU$he?leDijNHr^~#Qm+%$fmUXy6WQ9*bfV` zf_lje+ms_N8(%u*psSQ$YYM;ct?+R;+w#Mb*IR>`pkAguJ7%ltpeu~eM!IbN1=G7O z%)fNO=IPndyWGN0>?gur6G?p6HC!`1_FdD=3ncNB>u4)sXPLIsw0JqvjMu*0!j-hF zoZjdv%-}w`T0fQ2Me2UQI%icxJxRgX(MoYwcA}e11|GKu?|!cNh@|8;Gunx;U2tyz zR^48G)76gv^<%}GyLsaMQiH=Ydgr&oykx-& zaO6SAhaO{xG~#7Jwk4v9GkkHKM4^QAQp2dK83tX|7am4?8hZUF@mvXg*(lsQEEMm7 zRHwLae<{tZ!wY}zwPjiQrZPJp$Evd>ou%_)&3!&)4_0ox{s{-V$UN0obQV9J)|52X zhSL**;}mXr&J2t{pL<7{c{JTo?Le7c&t;6|GXUBbx4*bo+f`M8d%M*-x2b$xc_hn} zOT8h|6G};^V_BXzi+!UVkErljEsP{ATjQE%dffClZ1zvPhgsKjInz$$7k;aE%==I9|m#jpgegNjEzF z34AnKuof@W&^H9;TRTA`UmICah1ycf_6V%qWdm>K%xgQ4^I01QEBJ9(x5ve}wy;c5Z+y2@8ZO0dk0CnhD-X^?F<8LG7zqIWyAEes2qwR#rySUwCy+GxK zipO}mu-=r8I&!$l@zD8?sbtqOT2szZL0Ce2SLUV?(%MY!)VPe`ZVtcx%bfuUN|G12 zjV(ch#?OY%#usU~B;;8kGF`GGCYqVFV~X+|?ZGpkNmJJDDTQLcJ?nV|@_hs!pvQlC zQut*!0k^^v$shJ${q@3H)K9{{Vp3fAyI8+q{y&~r+_+EY|K*9`4}yc=^~?Z%LeNAk zG`(nwIKLBLMDZttNHa6x4O7VZ{rGL*Uor(=UXaAR4Cr>B2NZN57c6)^tamQkwn*|UluBs&=$UUjS2eZ8XNTDH7~7G$ToFQtmd$3@%fnOLxa`|P4ha-Bc zJtdZLcR6;t8ZQZFE(gj?$5@gNjivi4O{AS6$C3IVtfA9_mOBDn`EDyt$4^;{QFQ$3 zXDVn)q!8xT*Pj+N=6usWQ_A@O$DbA=o0y4nrzD&&hJ{nizlqlgnMwbod(yl?hr4f5qqv z*GSNgYix9;>7U?`%uH|}R)(4f*gF%UodOz6P20EnP?xkqiPx3r>%%JeGiTA4h6!|6 zCB}qoa7^Ic=yJ6e8U$Zo!W$!1LUL+V&6e&UNLA@MdWJfXr`ywrmxCO&)m=Rm+eIn& zIi$#^;yBlw#CQU%t)}lDa0eY%h7sJA@@r~dH!)LWDR zRm_w+mxPI1w^r{Il5F?7H;5EU{NzDUNYx%G-6AL)^3H*&zu>IY4$T;|6BHSu&=8d< zg%s`n)bBu}S4A3KxXNKvz9rJ=fdP7^T!uGNn9!ZV*i`IFB#>kcbO=ri%e=J@Uk=d9 z=a#SJ${%F52*HjBFBdBB6qe(z6werT3JJEUEt-*eEfx(KufUg;<%&-43QNmLMN`>M zA)Z(cebDt$1$X8M+#M)Oll!#z#_56fSmlt^*a_-n@QWcS{^CE-u2#v+AEVx(pV9am zwN$Fn6h_29>X(^s)V}A5QHCTNJC;X)f(ftTHIgG!-e?Y^eT+LXi$HhEpDOs=iU?R? zrLe*>+_$KE2(M>q@XjtXli^t{MCkJ0%TTbH5<#8;v zyJO9_V#22{=J6`)XRpwDVa9~zmIT2zDY?#H+sCgXqQouK2pfZJ0PAjJ+ka)-&xffP4t zhtlvZK{85vnv(_T*7}VtG8XrP`*1F?mcFw^6s8u1_|hVQrVvN*OO?1=XYBYA76=dj zBzz0}Z{Zug>l~RYE6b!Svy~Cv(oj=*X3KGgE60g>ysd`ZRF5iax*Us-l}~MHl2?{5 zbZ=wWP8qhIx+4kEi+6+|0{(!xu9ehQmEkNc`gTO5owx z&l~MZ%9$muN7DKKJJ1w!lz~~#+n%Pf)n!jA*ObSwSt#ujxoqVpt@t(I7MGG$_ z-b&C8qiAa8NkvT~)6~kcR4`4v1d5t<>NMk}EG;QLjzZcX;B4;i_t`U}#Oa*#`@Qe^ z>;3$O&%@q(?X}ikmuIc@tYnF2=h=$+wyO<l$cuZKgNm5wfz|U5&{$w%2UfpufPIpS*$R!5=N+NQKW#wz@yDT$wFqzXZQ#V> z`lg*~zpSG?LUR8#-Q-!duo%pOH=C`$BrMhY6`c{5rb8M-KfB;Th+oP((6EBeQs+&= zYL%h@6bDOX2>@Q#I2cWwNJkO=kv-G0JPC6$Hm5rNz`iWakhd_3E(VS)9~C%lsj@g! z0sW#PqFWeP&U#5KZRCMX!kPt4&z$N`2dGSw(IW$^gAe#beAqG2QtMhJmh0^WD`1Nd zk{kLn!pG?h^7lCa`HghmAxAs~;w?bDbHdjq*d^41=ZL&>s)G)k6G}|}V)>?S!1*RX zlY+U6E5W`CUM94seMT3Tz&iuU%yrR1zlVd*32leu?~Dpz{oi78;60!A0X1Lb{Ll zKM72LwOIiaz(#!8r)$*}R2}u!tHGu{GE4DtAzpRsVc(g;dnB{4o*wpt zBs#?QCG1$}VE@2<(nhu|bowszCDWNhT=Yd@`T}3u$?(gSjB-eYRLMflkm)SLSwcDC zwQ_0rbH?Xj1Gnd>MTbxp)1>3DyJ3?ITxwjJKzdQEy|c;J#zvw{>5~@rC_stQkGM-@ zk|3}4!0&XEvVe)41Rc@od;)Au_v526LMDs*lw4ew3;k5!%}0LMqD{yi*<`IOB?9St zsT4)j(r9&U%RP;sMVYc5vF0OAZ`JrB*k#tTy}1~~)%yHk6(%D^Jo<-tz;Q@PeMEi5 z;#?q(clVnt#emdLYGY8McrBfPA&oXyc+&G;3jZu@Vz3!JJ<%HaPYf*drLy{u4Qf+O zi@k%}LN`$d67vTK!{Kq`R2BzIqP`}BQ@PBLU82CO$GE*kz-A?S)1qR!jnINg)LeF`X2slI_AF@04ZvxR5}a^8A~!fcOO>!Fna3KrTx50ZZ|+0{h9|fGFmhvJ1UStv)wzTw4YVeRi{0c>*Hei~3K!vY`76r3^978OkL0zU zGTv_ThumF&-EG6_mnPVSbs7|tVQqR~wf_MLY#?vM%9b1{%P&N>KmKV=P|jnvY2l-dqZ6o2h(`(fGyP%yQ9JmApUkntydrF7o1TX19Ln-|Ig4Io$7{FWHL*_70Ys z-yF93V6CfvUDeW_SxjtfMr!%sXOzWONb0~-Uirl?pVgRhp0dX-F0C^1xu6V#mTeZ~ zJDXgeH!nVZ7<_uzTvdpcToo&a{DxhpmnIDx@H#Mp_G;AM{p$?n3JKX*yIBb9%Gw>s z>22!*i~xi4wAG!vX^_Er!nzN%A4ls<RNQ#S&&tShevPB6lS~tTs}$}nFyZB$glr0zwV5N)v<@D|!e4ZiA!HP(JjuD6@tZ#8CG#?QHnrS5mQJ$_&aul3_f7ii!imCnjLG&dR_6;EYtFIaLex2RZ!tJ4Pl$5|*%6kD z*eBopFM6J|#qKrb3tEGvoRLqdTP;Wq&8A&QyWrwPGt)ECPFT4KwbrPa7{+-D7MObl zZb7e~u+GYk%~qK{!pyGV+-;yXtEiRUNW`ff&Z|}L7{lxb1zE{lbMBD0>)vkYRQGyA zyRT26l}T0UNpFGT7()%_LEe%9o2h0o{sq7Sss_ZIK3 zu|D0uXk59E&-Zq+-+IZ;M!w;A7Oms!WPKH|L+u`;E&o#)X|&QlsGm6#Wwc`^qcVOq zh_eedaH97Gp(K!rJz6}`$aKXyuW>ET1pLffV)>sa7RA3HTtlp~2v4k- zqs8P?V=rt78}45lnP<##4L(3|U$q+@biH6ZS~*=z`Hf?MS#TVw>4y=2Snx^1E=Kp# zu}`v&6iQ(y8<>pV2OjrbQj{1GlayhubEzA;f^(w-=LY(>0@2gm4=|B2kV~k?yg0DB z^8pv~V{%lsBk;ZOIR2N<&8ZGO;2q<#h7jO#C(NjX+0FG_8C^Tq64#E2l;Lc4oc4k& zr-lQS4(sqSHmo|&s-_Y}gS7`clgR2@Y~)2z@>?7ww}Q+Sw*~;$iT;?5E8+Xcxb6Y8 zz-=!qcyKn zpbyS$vG!?=$)1&O70%J>HE2g#`JjL0;lFkkcUFgLB3VwHQ!f+wi>+r9 z*eVi!1>S0~57Qz(#T{E8jdffp%M%9mUQp1*!IvN`=N(ro>jUnbS>7~ zxH2Dv)z}#II;_g8#d*rwn`0W#M>IF_5dpfEeN>23UWqvml%6}!iaOLudzzb(O`J8q zBzOO0mwG-?#75}C>+HDfKQN#zEojS+tgL?cKKmB`@Zl3u~ zl=yp;I1P8HAx*BWb^b*(UqsrN&Jks7=iQ*oHZS;;<`B;+aLLhsNn*rU%na99;yBl5 zORAlaeHbOFgO2=&7F_2>S1)kpf3)k|+=Eqy``@az4jODbT61ge82qoBI|Ki1Irkt_ z@woN)E8zQeLz|dV%Y%d86xyyQDtkyduk8O93yhr*g}wKFb3D^+xQ#~1pYix;?*Fi! zIC#rjP{uS8yu3To@84QaC%CMgiGBj>Yu~c|*|cMj#7ae4Qk-!*?}3CP8$0m9(gUNG zVjti2Z5v@FN!0DArP(Z}dhUS$Gd;iQp2s?`b+kpVMWfeVwcmEoPEH|8q{!?FXC`mJ zJQinW%HqtDlrO8Siq4RY?41W2G_`YE?9t+AE(6}401)l!Uc+6mz+hP}#VL|y*H$4w z$L9Sg{MI)gZXmV}UOOb(jHe@)?%1aFGS|8;)gP>E9=HrzDo*RTF5np$uL?o_gH0o6 z1*xA->^-CR9HyR|=D(EA8Nan&6@tYT`70|EZE$`8e$nc|GBbrno7WH4hg=d2+R4Tz z6DKFY`&k-2T@}LopG@?hL+J~xL7ipwOt-g%K=GvhBQZV2;wpUF{wx^$-w}qE$m-c& zeikfhWhJXzv-GdRP=@VwqQ3G0TmRVCQ?Qn&K_kk|^K2e4EinSJPSTjY#nOnsBMtIO z57JzP-Nz>q`_EzP`2|;(GBG(eCiWFjW$Opi`&IDyl7v~c)>YTwW42d z6>nS;CgqWzMp#+Y9vP&*=3hX3r8J}t(1jMT`NUhA4qbau2mOs#g+wON5u{=38Fd1B zObH*SjAq011rF3%w*n{it6;-MSwgr5{jH2`pmVw|F2X4ov`BWIsxq?N53dc9L!ON7 z>)-oa3p{f|b`a7$i$_Y~?J%R`kd8yi3z44!WlX1Z?a2cbENNNv`;EcZ7%f^+8xX_U zcxXpd6{xV=|E=#;v?Q$O!g5cVssM7!LC_n6P_EaB6No@7Rn=^B@aK{$-|Gyzz%TP*N%oo(Hd)x6CT!N;55mSda85b0VY?N377?# z4T-BVk&hg--p!Yiz_Re2=D0uj&3iS@`Es>BEiUC3M_h~0y7@i`)unvrn1L_%gd~}S?Fo;) zK599>KYvDWajf|~us%kWg!ifN{1A<|aNTlakHDb8S z|Hh1;5u=Ni*F1^0A;}#*H47UG&7jyY*!OjpnXkFF2;O>PgT?gzp6~Cj(JlJiA=d;Y zuL4ead0%DF2Ojbx`k_0cZou{SK*%p&g`dY>pnCN1(eVQ(e;eTJ!>BU`!Ka7?{>I{= zQ)y)iT(01g8e{XyBXRaY>xSJ$*q7UJd-| z48YYI5m}fk^w+*ABx$=IT3!&F9HilDb}nF|$)|`^9i4nu^f-O?4rZf;(PrUfq$Mg@ zT&r-_4VlW=J~pNsQxmg*sTq^DA3dtj@JM&Vkz5d#%p)&Y{TB0*sXHWJaZt*XqQ~J| z`SBE)TJm5qM`z{{W=JY`3xZV&8MCKyJuj)bJ#8-}jU+YiPye`BhCGQ26=6Q=fQ|W- zZy)kj_n@s7r-3&<8g{2fG3rP>$B$#wmI;h{H14CHLD@UZ@Ho`69nL%6eW!b{+E|ALFY%de1!T9Hd+tAe94|qU^N<_6^-yliE0gmzBvu&s)f=soL(c+pypD}xd#7jQ8Na+%iv4)4>kL-?YFjn5 z##5c+6xZ>M_E?{l*5BNA;2=jr_>mIMMrg}#EPxk+s;$Od#hUV8=DlXH!fOZ*4=kps zr5XIx+>FvRQ$}tYpHXs076AX%DyA|BekR~^bKr`ZyNzdN!VlTh-Ny69rBh!sR@wbA zilteQ#>jXn=MEgQGeSoW(x&95H5o(O-xM3;O39&`};PtA^L4gUjld;O4PnKiA`XdsLPd zWp|f+o_;&H4=*Bz&e-|I+jeJ9%bv(wEgV&TK{YD{=l&6N`tYpwF#O_9wI!ltpV`wr zB`dU@#XjVD15#O({YL^UZ@gBSbe0idnALHNT z%59j1HVMw@V(%~3W+e8nUG)8n(wF2bo@h}MJ(Uu59audI`(3JaPW3R{Q7Lk&lMbY1 zcf)SZfKwP6=aaPtaFk!gmpVM`ugMKE*ho;D&sDXNHMyQ?Q1(zbF@;+2??IiF+L#GL%3moPEk^opR z`J8rOM-QeBWg=6DosY1Z+nHs1hb6s>5mZwztx;#bDm;r*sSH3mU=m=m>6|bfmaQk5 zRtk}TD8N|2Gk|e`@p!k>cviRx5CFFUzZoG_mU#BgiA1t5BdzI$Q|2OEyW)Bn*MYbe zG%sBEDtVmWcTSjN(wHMiQ?f5C&mhki0mA_~#+Aa8xW)tena?|@TLR%82eZA%S4l(!by$Zro-h=;2NR_|;o{*V$t0>q_r(_&2=x1j4ZXL|$|AhT# z9Hi4MdPzRF^#SBfb>?{D1gw(QORQlSnQYtuT`k%j zz8OWjgW5Rgx|?1)e6Pg!bI1}t0FXTF%T24YpSWlBYA5)TW|3f844X5Hhi%50-4-E9 z&%|(x<;9)MNi8#iMmqJ13`ql64zYW3y$>jwqeA=_H4&fb}gQ6{I+7KU>~ zE*KcimMFk0gzYuhw5-!U^cUDCHU`=-o%OK=H?rL$5O|^2iX8FdkTZW2^APrn{&vtQ z`q@Q$mYk{L{IUK?*m(BgSeMoj4q;U=!5ZK($hzaCx-D|2@paj@d+Ak$)P7@WXp#06 znv=c)O?n=u@75fJSOO-t)DySZuFbiNSz{5>OYPdFpy+vEs{W8;XKVq+qFkIix7PV; zF!rQ0Gj6O?(!GN2U$1LR_j0;_wNBX`_k7fqqDp1Eh$~0&zta_EEJiEzF@`4YxElaz z&j8;+i5LOeieOs5>h67;{XC>&cidHq*DmN?*zs;=&146@tRWLx6TdvvT_~Zk$1qQk zT;t97zdoIaXK6|_&f(IbsYPCWnKJkJr~AwfRR3a$nPkec?b0k-NoY2v*{dITp??0e zQj(6%8g@|_Jz!0t45R5$pN}_9*KVk(*OyF-qS2>|8uy0CzSPO_2=;aQ`i7b zI<}_pQ5skaY}lO@>f?9mQ$gWB*3$ZIR>R0)Ti|h)iGA9381i*WaZWY(LuRYlaDN8o zKBai7$MP%64%e*B(b#WfJ;IVL(0e!zzosnKG?hJK4ZJe+y0LoXv5Chv76!t*UO~ku z*h3w~eJZZ$82ehnEdg@GtZF;FQ|`_xttt_F_6N+Cci@lu-7NSd#MdV`Q{J&fbISt) z=u98!R9l1yU4N{go$)ofeRnqP^U9D;0q>u?vs{jky2sizW=W--VYF{#alMkWmccfM zPsFa8iz9bcw&PTZRd(v%9d{qk4hi3J_c34UX`C%ZxO-cbO*laJ?jHATV$I~G#!>$o zaPcBaoKwB%z>Tb{3Shb3in)R03TPie^Dp56%@e-gYX`K%h0McCMf+2+>Rknoe4)d4 z^N6*uv{AYmGH4MKkL4HUkt_q`Y+)Z%|5F*Q3vGFW^9O6^EDbba%;omZN8l+p+Wvm_ zjqF}rhUJKYtzJs=Lk%;c*|oVoVu?0;CuZA`3WM{gbxLe%xhl|b|B#jM!Pyis%>4o@ ztF>Zxyj~cO(P(gfY@NMuCC=|Yz#2Cu;IGC(_D=;r-SxYpvL_zfad)I|exXd16~8s> zxqBbXx_&n`o35S3vG7Xc^}9o|S#t_nXIy>tJ;yAX3Eh+%ETHO-)R=Py08=_=r)6uF z{E8J&C-Lv5vE?h+*l^n+{13G;SQXW=kK0(M68s;PEf1moHU{%zDJlGxsuUApU*949+XJxJ%(G;vmJdKY}_^_=(YAxXc&3+f~#Nw-L%PYL6? zadt^eaPjPgr-Vt}g3wC75nGHWz+s<|^AG#4I5o-SbkL}w`bx|A9s{dW4=`d2yZsXp zKD5MzoAGVMxuK+sf+4&S4$CkPBn*8F)MHQ!$qz5DNDy#6ahlqr zhfO%i^k`_6W+T2SwWqIfw>H(vJ@X^KK;oNxCBFCiVg;6JlM(WR*v?8mq!Up$)I&DM zqZPyLIrm3k!mg}Pg(jP?;8fGH0~K5a8>k{JXHfds>xuih)o8DlNx^ns;DlxDlgWh1ih&-kvl1 z4>7A?mx63RjB4I-w^z1AL8mM`?)F64l1UT3e7KxSk_azZs}y804E7S56U*iNnJT5^ ze3eq(-}FV5(kC&|RBq!-s=j6hB$iewdGGv+9%!{5g|t|Yj@PrWn~?8_ZBg=l_Ss8H ztE}+kk)eMNE9*NszuOG4J8`;9>&@HteJxh_&7O9*{Nh{Uoxd(Gp81D$%-!N7f8MnP zh8phA>z#-Bep$9D`%8wc7!?qiLh_P%@G-Ji>q`E*v<`88q5H2eAzMS$6NIq*I=du>r^ zcDsim&*~!~!{U!KqGefumYjZWzb@B~vRWtBg&Ckxg6wOve3QYER}ppJ2C;o|D($Oj zw*&5uQ16$`xzA zN~AG>Rs$Ea?%waT(y835p1uW6ZKz{mJC638I0ZX;xMn|26!8t@+=<%P(;~En=ZdQ@ z;hDHnwQFnFQV6du@$Q!kxhElF!208IN^jww@^16{tt%$sMt6>{ROx+*L)4g{XF>GHINR}n&#u^&>o$2#m^i!EBhuf!Mr28_raDH zKIf3coc{v`w?Q7ocEb|Cq>?HllN-**^RcgsSj8Jm=YOz}HV5Y?IU8!k)hH zB3d=}u|h~JAf9$t0hhg5$bhVB3BzF?=ghK#4h5Tqnd#vL{x~a`%%_3+$xy8Xm-#CC z<un*yWi&z4TxFL%Kfl4|KgP zr=zGRa+MubK9YaLjhLkEgLasMc6bVu_xiaVKyP%f<8^ zIKnN%ya3Y#AB%`v`At8e#IN<@TGwiS;CpX~(qKzDDjFL4uycD_zFi4x~NZ zwu!K}q`ifkW+aNy;5=?^xqF-h%4Ah`X?8zuuBEue&Y;P)x{>cmdjo?FI|F;DVt1v2 zF&Rw>&tc4s11IWLtROGhr)8&B%N9%|)=|7ExX#f0_FDzM!c8;!Pyp)66KCeZGs(3U*~tbGPw z4abbgVGiDL*PIRTg?5C>OR0ST3lP`u8ne^xb-}v?U!vTaTnX5NKaKTC08cawcrylj zvJT?ho6laq+ZUP>nG2xj$}{);pFDQ&cVG3rF4(ynnoG00CC@D%g^@+lrjxJ(Jq()P z2NZVa7MNIta&5Y~x0Y1AEaDeBxg{K%(Z~~j5zlr@vS6z-n(&PFc@PIS{6_=BHukz$eBNZz`OKcu zABOOU<`nl{ayRHP^=aZO(E3KWB#tUr1u!^wTU+9z3gzem?WiG1oHLk{KS_IoW!TTU zDHMbAb!%?cDahyQ_{1Ub)64FzRC98XYWMPQXfCv7j>7 z6y5X9zJ6Cdi>R2eS?<^!Q)rBT04-k67!uDDuHWr2tK|v8D)jdCyX~{7*PC3iC<%}K z@KN*wo0C($8wzWhb1MIiGN5zKCAT?{Xn+dt5G{Y{@I9r)DPc${q{NM=_?U4A<{Ikxk>joDh~Kz_&FDByl)UzJJQqO{-<>F8VDKA`#QQ7e804a2k?IrIVf zY=xqOC83-Tc=rLvegoWo1GB6I_~@T}RY4dH+v2eef2fT$r`pbDCn-`y+Yn8z{3f=m zBn5PYh6UD6R^jxxnA(YOvn5WtX<0hmoPQ*6Xha6QHl;5JBfnGW@Dign)B4GD{T!$^sfH%VhOGIym zyqLbdO`5^>Nzd2^JLhVA;Re3I=mgiR0;`TngEzwkomzS`jJkt7tHeCz@Q>x2!e->b znvw};_lk>bhAG3E5uC`z8$x`GTrOk1{G=&^%@`N{z_ZSq7@y>;g&aJ1aDsdQC-@A2 zY!OfAC90Q3y_7ll3eM2@#jrN+Y%6&j^X$ZAHsiu1K5L?sD9`b*^t4blwcyLx4t6=& zGh8x8+%KFK7Mhj|^Fc-8j3j6`+C&chh}^7U;(h^dv9iq9{|+4f5N8SUm~y*iNIUK6 ztkHsP5(nFvGsD0UtSYVGRbPg@23{-MM`<%Hc{+*4`R+=8ai(8}92o5>VWB=zuyy+q zn4r_^63+VujlMQo-AlwjNh1TnAMkKo@pmxvsH;5Eu8*p;aben!-eyc zW`~Uzzri}&vEzzUjIe!+68qUW=VC4(Wfy49S;kojxx#!cX*n#^8ieyh<~iQM+05Jn za-7x7!5H>Qo~YQ?$vrE3%P<9fMDh%Tmo#Q=GjI+Jyde*)isqe0_5z+ylBGxvPr^kh z?i!nR8skI?xzeFT{4hW_0B>d!8TDEtW6vC{64=<`2EoB-Wy$`BP4jT_w>VT`pCkkS zy`nj7o4=({vGNFbN)e)Ds)TT)(rlHMV|isc-YX9M!|KRE(6yWWPSUsnCVA=>FO zwj0uJ*ce#qTCDvjq|g}jgQQ|vfL%DMwF~R?Z0}RJvk7O^oO2+TAHwQSA+*jlsqu`k zcofe1Mf!mJ;}}xNUjmbte18WoHGd*VbWf$EmahyaYiOf{P0A-z66f$0D+7Jz;Pg7| zg78ZEa$#xdbBU?WWy;fd0x$ou<-#&t4Y)2(mpFZ7SmPtR)yW!`3%TiGkf-1)+A0?y zMQ~d=v~*UaFN=6xSZVszkSnZSaKYz`Dp|z1;@5>&O>HXW%3NWUR#`Df-Z42?kbm8_ zUfJ!Mz?^}vwbEe0hn^!~Jv9=3*R-_-WE1w%Nb)?!&A2G6f!<3g{`>kEi!TZr#HS5f zz6WdLyRr5sW$dN3tn_kMcA@Q4Oo`6`F8!7Md z&^EA)CAAzkha^TM;yaNp*ZD@+c@S|@xf^l>s0WP!vbqV&qv-8T00ST~(o5UQ59_f< zjc$?`)Vmf5AK^ZtDY$?WeeF(4EVj&lW*PGDZqVhq_An}%w(>D3EU_MZ#?+|JX}wEa>n<<8ADJt6J)^I zGheZq=RO=IEQUwmx1m!^*2%cN&90!PNhu$Jb3!3|trvyO+VK{)_jW<)zg-NMpHaKjHcBfc(x)%7`Es25v5~O#yg*Xdw%Sx~;lB`U251ti z+Ek8ZOyz6fnd_7`sZCJcI$^Ybo65GV%XPOQ2=#rvG3Z0`;bCqFPr=&8z-M^mNJ!Aa z4l4W!$KpiB?NOB4HuT}j>ei>i*)_ih*7GC>H$#3cwcIZyrCb@iS>Q@=Rc;of2ZxmV z&5=}cer#N_5L@y-B+uU!NA|l~o46(u&eIx7W7l~UzB_<7gg?#EjIAx~HO6C9wlV)$ zz;%zm5|*MdV=lwIMtyd#zJsT{H$COODR~TiFID9Uwe8&A->(&e4~xFNZf`qO4Ij_9 z_m{bivnj@n=p>JLxP670iK7AhN+k;=s{HZJx* z9H!u%PJZLT(^XcEY}%8(9p)`+VeG@9RnewW$}xG2b{*#9HYs7xnmU$L!fta-4pXl? z75qA^3T0rNecQlBWQelguQ!vWF04D9H~`tz5!a9`&ZAw-Ep{Fzt6(@umgOCknEOD# z`4{Vn)Hj80qBQAME1gq7yU%&k`r;L6-sLbjLo(bS1YQwo)(wKR#ow%LasDG+W`U)@ z42rf7jr%gws!aT}#VB#wI)qcrw2P^hrs^SDvLWuSV}#SmZIo_oqcXjd z>}z21V6Chsprl%cpP)f2Hd z@dZV@2pmc&_9zRX?`O=JjsMR<|N1SfC8DcXyO+hLEb|VAb_e$3aG*V@d5YoU!nOO|9{Z@hW|yHI}Ye>wqyJ7iB}7W_th1rJcpay zwWbogTy=H*A-To}F?mYhpIoP9!^|k3E-`K$-k)?Nz<(w*;I$gGWP9MpHMHI9IYoAq zBY>=S{I!W{4-Je3$S)IG`LOnL)0Xhyg?aD}SkLKIu!V5_Cs+rbmREnjimx!mWte|t z6U%d_8_RbG-Y7g%<)axWeM#S0=~JEQ6V=u)5g`eWoBR^(g{Q0F>!KnkeFRR48I3B@ zf~Ut#gUk8nU9NZP+NGckGnu^p%7Jas)&`UwxTqM8eurLTo6IR5nw((T*O!>gT$UwsGG<%*tax2Q5`pFsebO>%#Emd4e!dVwP4~ z2gxg}A#7g%7o;`a264F3e9(VJE-TIZUf83XDD#8eO75)?jG!hfX+y>m<&g^i;>Uj! zw&@Wk4d?Gw(#~JGpLADQzsu5mwy(T`=X&(GAZ*Y_lb*W%H0~@B^G%rTmDdD`KS0M; zGdQC&jNtQ5!pfm!y%zgZExzw(8Zmz4_)ieFrrma-gKlcoa-M-^X9wLlA6fp8;s|FN zEG4{V6!EqEw02}08D{h_HTxD}_&TJc+_yuXJXD!pJwnwZlP^w!1s?MJ7{OKK zak72E=GTmTrG#H}1^%Pzw!@~OY}-UByA}HuoNfJHd$5x6ll`cukf`!%>xz#<#y!R+ z#(E3oVkSyST8d5x>01HNtG7n9seFzxmX}6MY!ke3oiJV3M;rm+SZR*d24kgprjCu6 zQn$8}?p2LH3fr+_e}(_Dy^XFx!WH4ShjZ_F;Wvp4u|~qOJg2U6F%2?tjjBd0_Y944 z1z^qOXr|V(=P_5Wo)lap*(xt!)vHIR&??Gpo1`h?w|&Vaf=jq<^cTY3v_OZlVp&_Z z*Uy6dV6MO&q-$zgyla$q-QqyK zlzvV;_ma=a-tkG2!Ac+tR2^aMqOEx=YzsUNna?C!>|!R?Y%9-TVobI2v4(?d#WBYgxSxzX7u!#-=GTmboQZEt=9QKwc=N%1o1{Nn^J`AA zeJ*z0YMlwbyQk@6i@fqp%Yh8(y6PHq{rJ`FfU=KR&Rjj+P8QJALsyx>&9bJ;TJKy^#$Wv1HZVrJn% z&-PfxMPCr6ryHD|mT^7kORRR(!iZm(u6OKy(5CKSu5f(W-DvNGew(k-6r9c`dWPik zVF5(T#z^g&qF*0|J*tu0!bwi`iwDTpFIm!9WuyKcH*2F{!~A!irykvBrIS{ho)Iw* zX#!5)0YRH0hozFU_Ct3L68I_;|vM$`aZZXD>^zaL{szf*tq z&UILM%@%uS-T|iTK(q(x>}QxCxOz4}g?c`fMB|mot8t|_Wd9Njdndj`{l46vo*n2p(U`11b*r*_PWAZxZ4f_8tj!3> zKS>{+i)8364(!YAZ0E5HWzoDn05((xR$twJ8n!W*7PbJ=(1+I5;mlZEsb8NsY=TAV z_E8eG3SKv}N0bUSX>+&T!f#{X;Z_EDa%RBL-NFfYw{VV0bv`DAuL@~=az6{a5kx_2 zo`VMr*!+?+y9LSExS{ZS0nfSev8m3TxCSHr4hFsokor8}>-MmjjH>`>!2LB`%K$fV zuY}JGe?ZV6J=a>ei;7ad&KC<*q3GU^*))tZy zngmPnoJyE80Q<{HY=wk&mp$RnBd>i5Tfqh73C=hcyh0`~;l2+anDMtscA=qDt?Na2 zwy1TzDf&R)2oF!9r$TWLn^nNc?|j6`ZvYnH{wG{tz_sPRNI1+y%7-e3buo_>B!2#V zqyi6%^O^7%%*MgC6YR|s7X$0lbVfZ6YZR?V^N!Mb^x{!kk7gewnrOg7Zo>M+A&0&b zHjR!;TxXQj)7kBk3_6QSxw&53^VQY*GE2ZU2Mdz!Jomt z8Q8g5A9qgJ6n9~XwmGM}Q9=JYk zm7BbFi1{anubCCgupMRC6n7Q8j7{L#tdHwYWr!1L<vZm~ahJ|<||>I%3g*%8AGE~n>zrgzxLkYdqlPh& zeD_Fb4Q^V0PPmP7{+8I$rt0o*d*ygnNCycnQ!QC{k2dF%eRr(_7)0{2kX$O(pss>T zFTRH_PP}Kd_Z;rfXwX07!DTupR6|l#NNjTb(nz|Zx9yZ0JbKP@ASSC8T&h}coF5%? zz(3jz@bbe5msHU^aJs0iW1QHtGqlHr%|>U+bZW6 zW-Zt9Z#we=v#3>A%lEG^R_0aaBy)!OmbvmL@qT9RF;aFW`y#uRn-6Ff<7Bb9>}%{s zb{|`WF!$d@_Gk7Vtn3e8r#C?WofvAs|0HgVc%O~&N)mln3QMu?02o8tN}|-6Q!{sE z-pFiQb~@#tKs*hnzNC=&a*{H7E-4gT{SQg0COv$_`G)%#Lz~TA_ zHM@lOMqzFl(>=re^uZ|5s?uklT`qixJDGU*5$=4X6A`vgZ-AbMA?krEvH{i*Beuf+ zz7kIz8}`$;)w^Ooys|ze7+Q&({-VIdtrklJjRojbu#DhpFKlzHhP0zoKM{To_Rw1$ z8!NN>N323l{>VwFU*nLQ)ls#ss^%5q`~C$iS$4>XxSDB!{F` zyWVX23!b~x&2cOkI&T;(zsC8c5qI+{@RP1-X`yIMM!Pd@1?Z*CI2Tv}dEy02S3p{q z_$)WlE`y%ePQ5JLj7!J=vbfz-iHEvE(CQ9DLloMexMu422vNH4K*yx7ybQkUl<*}G zzgZzfBS#@_1x{W!3ojyWFT`c~q`$fu`t~beZ}dB%On(Epj_!S9nm%iVpwk^%vO5yTF=#ZG?uq63q81#Ze6)_m?6NvW7sIR?6 zz5GNiFf@uP4)-f-@gI^~csns0W+LrXiSx_Cb@NgV=TOyjgi z#qYaZH3E6I8(3X{chXEI%Fr{q*wE#GG3UXD`=@rG8OkZzgV?p7?NcT8q~F7{Y$sNO zI}LdcOD(uQYIt4Dx5@QJ!>U`}a}wIOFt;l^mB62a1M>v=k{}-v-{PM9Nx)tNgsD0C zwHwfV0HB^~@GRLx)QD4|u4+a+XPz+nS;}2Uo_EMT^i#kXRqa#o2@}yc{1zAMd!;`@ zd~2ze{g8IK$hrI7@r1>G>j{xJTpgJ!2mmgMzA+*^*_e!TAU>*>m~W4VHIwv-z7?BX zD7M{O;7;dMYxWb(#`OuKm|`yki@o3*5h3=%Kv+Z=SlxF2<6CF-+Fh+gb+{R01YFM`&gwhV4? z^DKMfN^`9lSDJhMZ*uZia8Lfny5Dhu`=DO#6OlD+tH5R&%tr-o{mV(O3erXI3(swQ z;F?)?RFDjpm<`A0r*cv8SkF4vDI+qId?2~;!1Z|D79qWNu;y~al0{!@%oLK@0^471 z-dH%^z{I%hAt7XmX{*4fC&Y|ShHM0+W7x)Mfxlt!&7WV+^5FFw%4 z^1$_VbElL}5h0n|9FcfB+e}tyI%%gXD4#qBtUSR|S66c=Fm`bLSB@~tZ;mAME6D>6~Gws(b^!3HwC8(m2%4 z#f-2oL0cN@A9t3tli9Qx(C3OaR_~mK??pe&8!CgBQJ5w48z1@Qc}b6e%Yr;sTBA$9;KN>?ksLBLKO@}7PnJ#v)jks>I zy+;J!zNVy4z^OZen4butxVFW$qpsOCtbR}!@BHU8#NWmKZeSS>&y0U8(VRO-8E9sI+uXZ6h~Mflz}sL(p7u3pZ381`Xzr8a`O+RdTP^+wVhvWg zzq|H3Ei{t_cHLPy8y5cqHKqmCu4{EDr`QH4V}HU5c_?re_+Y`+f@?->DPS?MMz(DI z(96Q`=NRxW_FGx}_gS_Mqu{&7&roA(-`6aIx<(fd(p+%3pI2FY@$9Sl3U&AGD~Xj| zVf*v3ZAG7Q?K?&dzlR<0j05htuUG;RH&FAbCvCPxf@g{5W6$%;p7(n^&kHR|yjN=8 zcJ$WHPhMcbK2`au;NO?m!dm|?uL=QuA&0J8j?*zo?+%I`@K@Z9UoNmEn~HV4p6R8C z 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 S?JGY1t+!7vd3XGyKl?vjh$O!N literal 0 HcmV?d00001 diff --git a/panda/board/obj/panda_h7_remote_can_ignition_only.bin.signed b/panda/board/obj/panda_h7_remote_can_ignition_only.bin.signed new file mode 100644 index 0000000000000000000000000000000000000000..786adb867d5d5be18a1c5b38c44f2ec1d4caacbe GIT binary patch literal 101512 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 literal 0 HcmV?d00001 diff --git a/panda/board/obj/panda_remote_can_ignition_only.bin.signed b/panda/board/obj/panda_remote_can_ignition_only.bin.signed new file mode 100644 index 0000000000000000000000000000000000000000..b6fa980c3e9db7e34012ea1323cbd6f7c0d1a836 GIT binary patch literal 84512 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 azFqyz)r}_(uPE Panda::get_serial() { bool Panda::up_to_date() { if (auto fw_sig = get_firmware_version()) { - for (auto fn : { "panda.bin.signed", "panda_h7.bin.signed", "panda_remote.bin.signed", "panda_h7_remote.bin.signed" }) { + for (auto fn : { + "panda.bin.signed", + "panda_h7.bin.signed", + "panda_remote.bin.signed", + "panda_h7_remote.bin.signed", + "panda_can_ignition_only.bin.signed", + "panda_h7_can_ignition_only.bin.signed", + "panda_remote_can_ignition_only.bin.signed", + "panda_h7_remote_can_ignition_only.bin.signed", + }) { auto content = util::read_file(std::string("../../panda/board/obj/") + fn); if (content.size() >= fw_sig->size() && memcmp(content.data() + content.size() - fw_sig->size(), fw_sig->data(), fw_sig->size()) == 0) { diff --git a/selfdrive/pandad/pandad.cc b/selfdrive/pandad/pandad.cc index bcb430747..d3f757ff6 100644 --- a/selfdrive/pandad/pandad.cc +++ b/selfdrive/pandad/pandad.cc @@ -217,7 +217,8 @@ void fill_panda_can_state(cereal::PandaState::PandaCanState::Builder &cs, const cs.setCanCoreResetCnt(can_health.can_core_reset_cnt); } -std::optional send_panda_states(PubMaster *pm, const std::vector &pandas, bool is_onroad, bool spoofing_started) { +std::optional send_panda_states(PubMaster *pm, const std::vector &pandas, bool is_onroad, + bool spoofing_started, bool ignore_ignition_line) { bool ignition_local = false; const uint32_t pandas_cnt = pandas.size(); @@ -265,6 +266,12 @@ std::optional send_panda_states(PubMaster *pm, const std::vector health.ignition_line_pkt = 0; } + // Work around harness-box false ignition by relying only on CAN ignition. + // This is only appropriate for vehicles with reliable panda CAN ignition support. + if (ignore_ignition_line) { + health.ignition_line_pkt = 0; + } + ignition_local |= ((health.ignition_line_pkt != 0) || (health.ignition_can_pkt != 0)); pandaStates.push_back(health); @@ -353,14 +360,15 @@ void send_peripheral_state(Panda *panda, PubMaster *pm) { pm->send("peripheralState", msg); } -void process_panda_state(std::vector &pandas, PubMaster *pm, bool engaged, bool is_onroad, bool spoofing_started) { +void process_panda_state(std::vector &pandas, PubMaster *pm, bool engaged, bool is_onroad, + bool spoofing_started, bool ignore_ignition_line) { std::vector connected_serials; for (Panda *p : pandas) { connected_serials.push_back(p->hw_serial()); } { - auto ignition_opt = send_panda_states(pm, pandas, is_onroad, spoofing_started); + auto ignition_opt = send_panda_states(pm, pandas, is_onroad, spoofing_started, ignore_ignition_line); if (!ignition_opt) { LOGE("Failed to get ignition_opt"); return; @@ -494,7 +502,8 @@ void pandad_run(std::vector &pandas) { sm["selfdriveState"].getSelfdriveState().getEnabled() || preap_aol_engaged ); is_onroad = params.getBool("IsOnroad"); - process_panda_state(pandas, &pm, engaged, is_onroad, spoofing_started); + const bool ignore_ignition_line = params.getBool("IgnoreIgnitionLine"); + process_panda_state(pandas, &pm, engaged, is_onroad, spoofing_started, ignore_ignition_line); panda_safety.configureSafetyMode(is_onroad); } diff --git a/selfdrive/pandad/pandad.py b/selfdrive/pandad/pandad.py index b95eb9ed2..79d1fa95c 100755 --- a/selfdrive/pandad/pandad.py +++ b/selfdrive/pandad/pandad.py @@ -13,20 +13,33 @@ from openpilot.system.hardware import HARDWARE from openpilot.common.swaglog import cloudlog -def get_expected_firmware_path(panda: Panda, remote_start: bool) -> str: - app_fn = panda.get_mcu_type().config.app_fn +def get_selected_firmware_name(app_fn: str, remote_start: bool, ignore_ignition_line: bool) -> str: + if not remote_start and not ignore_ignition_line: + return app_fn + + h7 = app_fn == "panda_h7.bin.signed" + name_parts = ["panda_h7" if h7 else "panda"] if remote_start: - remote_fn = "panda_h7_remote.bin.signed" if app_fn == "panda_h7.bin.signed" else "panda_remote.bin.signed" - remote_path = os.path.join(FW_PATH, remote_fn) - if os.path.isfile(remote_path): - return remote_path - cloudlog.warning(f"Remote-start panda firmware not found: {remote_path}, falling back to default") + name_parts.append("remote") + if ignore_ignition_line: + name_parts.append("can_ignition_only") + return "_".join(name_parts) + ".bin.signed" + + +def get_expected_firmware_path(panda: Panda, remote_start: bool, ignore_ignition_line: bool) -> str: + app_fn = panda.get_mcu_type().config.app_fn + selected_fn = get_selected_firmware_name(app_fn, remote_start, ignore_ignition_line) + if selected_fn != app_fn: + selected_path = os.path.join(FW_PATH, selected_fn) + if os.path.isfile(selected_path): + return selected_path + cloudlog.warning(f"Selected panda firmware not found: {selected_path}, falling back to default") return os.path.join(FW_PATH, app_fn) -def get_expected_signature(panda: Panda, remote_start: bool) -> bytes: +def get_expected_signature(panda: Panda, remote_start: bool, ignore_ignition_line: bool) -> bytes: try: - fn = get_expected_firmware_path(panda, remote_start) + fn = get_expected_firmware_path(panda, remote_start, ignore_ignition_line) return Panda.get_signature_from_firmware(fn) except Exception: cloudlog.exception("Error computing expected signature") @@ -40,7 +53,14 @@ def get_remote_start_boots_comma(params: Params) -> bool: return False -def flash_panda(panda_serial: str, remote_start: bool) -> Panda: +def get_ignore_ignition_line(params: Params) -> bool: + try: + return params.get_bool("IgnoreIgnitionLine") + except UnknownKeyName: + return False + + +def flash_panda(panda_serial: str, remote_start: bool, ignore_ignition_line: bool) -> Panda: try: panda = Panda(panda_serial) except PandaProtocolMismatch: @@ -48,8 +68,8 @@ def flash_panda(panda_serial: str, remote_start: bool) -> Panda: HARDWARE.recover_internal_panda() raise - fw_path = get_expected_firmware_path(panda, remote_start) - fw_signature = get_expected_signature(panda, remote_start) + fw_path = get_expected_firmware_path(panda, remote_start, ignore_ignition_line) + fw_signature = get_expected_signature(panda, remote_start, ignore_ignition_line) internal_panda = panda.is_internal() panda_version = "bootstub" if panda.bootstub else panda.get_version() @@ -133,8 +153,9 @@ def main() -> None: # Flash pandas pandas: list[Panda] = [] remote_start = get_remote_start_boots_comma(params) + ignore_ignition_line = get_ignore_ignition_line(params) for serial in panda_serials: - pandas.append(flash_panda(serial, remote_start)) + pandas.append(flash_panda(serial, remote_start, ignore_ignition_line)) # Ensure internal panda is present if expected internal_pandas = [panda for panda in pandas if panda.is_internal()] @@ -186,7 +207,7 @@ def main() -> None: first_run = False # run pandad with all connected serials as arguments - if get_remote_start_boots_comma(params): + if get_remote_start_boots_comma(params) or get_ignore_ignition_line(params): os.environ["BOARDD_SKIP_FW_CHECK"] = "1" else: os.environ.pop("BOARDD_SKIP_FW_CHECK", None) diff --git a/selfdrive/ui/layouts/settings/starpilot/vehicle.py b/selfdrive/ui/layouts/settings/starpilot/vehicle.py index 4fafb02cf..983632e1d 100644 --- a/selfdrive/ui/layouts/settings/starpilot/vehicle.py +++ b/selfdrive/ui/layouts/settings/starpilot/vehicle.py @@ -1,12 +1,15 @@ from __future__ import annotations +import threading +import time + import pyray as rl from openpilot.system.hardware import HARDWARE from openpilot.system.ui.lib.application import FontWeight, gui_app from openpilot.system.ui.lib.multilang import tr, tr_noop from openpilot.system.ui.widgets import DialogResult, Widget -from openpilot.system.ui.widgets.confirm_dialog import ConfirmDialog +from openpilot.system.ui.widgets.confirm_dialog import ConfirmDialog, alert_dialog from openpilot.system.ui.widgets.label import gui_label from openpilot.system.ui.lib.text_measure import measure_text_cached from openpilot.system.ui.widgets.option_dialog import MultiOptionDialog @@ -143,10 +146,16 @@ class VehicleSettingsManagerView(PanelManagerView): "set_state": lambda s: self._controller._on_toggle("GMDashSpoofOffsets"), }) if cs.isGM and cs.hasOpenpilotLongitudinal: + toggles.append({ + "title": tr("CAN Ignition Only"), + "subtitle": tr("Use Panda firmware that ignores the physical ignition line and starts only from CAN ignition."), + "get_state": lambda: self._controller._params.get_bool("IgnoreIgnitionLine"), + "set_state": lambda s: self._controller._on_panda_firmware_toggle("IgnoreIgnitionLine", tr("CAN Ignition Only requires a Panda firmware update.")), + }) toggles.append({ "title": tr("Remote Start Panda"), "get_state": lambda: self._controller._params.get_bool("RemoteStartBootsComma"), - "set_state": lambda s: self._controller._on_toggle("RemoteStartBootsComma"), + "set_state": lambda s: self._controller._on_panda_firmware_toggle("RemoteStartBootsComma", tr("Remote Start requires a Panda firmware update.")), }) if cs.isGM and cs.isVolt and not cs.hasSNG: toggles.append({ @@ -559,6 +568,29 @@ class StarPilotVehicleSettingsLayout(_SettingsPage): if param_key == "ForceFingerprint": self._manager_view._rebuild_toggle_grid() + def _on_panda_firmware_toggle(self, param_key: str, prompt: str): + current = self._params.get_bool(param_key) if self._params.get(param_key) is not None else False + new_state = not current + + def flash_and_reboot(): + self._params_memory.put_bool("FlashPanda", True) + while self._params_memory.get_bool("FlashPanda"): + time.sleep(0.1) + HARDWARE.reboot() + + def on_confirm(res): + if res != DialogResult.CONFIRM: + starpilot_state.update(force=True) + self._manager_view._rebuild_toggle_grid() + return + self._params.put_bool(param_key, new_state) + threading.Thread(target=flash_and_reboot, daemon=True).start() + starpilot_state.update(force=True) + self._manager_view._rebuild_toggle_grid() + gui_app.push_widget(alert_dialog(tr("Panda flashing started. Device will reboot when finished."))) + + gui_app.push_widget(ConfirmDialog(prompt, tr("Flash"), callback=on_confirm)) + def _on_select(self, key: str): if key in ("CarMake", "CarModel") and not self._params.get_bool("ForceFingerprint"): return diff --git a/starpilot/common/starpilot_utilities.py b/starpilot/common/starpilot_utilities.py index bee39ce79..9271837f7 100644 --- a/starpilot/common/starpilot_utilities.py +++ b/starpilot/common/starpilot_utilities.py @@ -173,26 +173,43 @@ def extract_zip(zip_file, extract_path): print(f"Extraction completed!") +def get_selected_panda_firmware_name(app_fn, remote_start, ignore_ignition_line): + if not remote_start and not ignore_ignition_line: + return app_fn + + h7 = app_fn == "panda_h7.bin.signed" + name_parts = ["panda_h7" if h7 else "panda"] + if remote_start: + name_parts.append("remote") + if ignore_ignition_line: + name_parts.append("can_ignition_only") + return "_".join(name_parts) + ".bin.signed" + + def flash_panda(params_memory): params = Params() try: remote_start = params.get_bool("RemoteStartBootsComma") except Exception: remote_start = False + try: + ignore_ignition_line = params.get_bool("IgnoreIgnitionLine") + except Exception: + ignore_ignition_line = False for serial in Panda.list(): try: with Panda(serial=serial) as panda: print(f"Flashing Panda {serial}") flash_fn = None - if remote_start: - app_fn = panda.get_mcu_type().config.app_fn - remote_fn = "panda_h7_remote.bin.signed" if app_fn == "panda_h7.bin.signed" else "panda_remote.bin.signed" - candidate = os.path.join(FW_PATH, remote_fn) + app_fn = panda.get_mcu_type().config.app_fn + selected_fn = get_selected_panda_firmware_name(app_fn, remote_start, ignore_ignition_line) + if selected_fn != app_fn: + candidate = os.path.join(FW_PATH, selected_fn) if os.path.isfile(candidate): flash_fn = candidate else: - print(f"Remote-start panda firmware missing: {candidate}. Falling back to default firmware.") + print(f"Selected panda firmware missing: {candidate}. Falling back to default firmware.") panda.flash(fn=flash_fn) except Exception as exception: print(f"Failed to flash Panda {serial}: {exception}") diff --git a/starpilot/common/starpilot_variables.py b/starpilot/common/starpilot_variables.py index adfcb0ddf..1d3845eef 100644 --- a/starpilot/common/starpilot_variables.py +++ b/starpilot/common/starpilot_variables.py @@ -1361,6 +1361,7 @@ class StarPilotVariables: "GMDashSpoofOffsets", condition=toggle.car_make == "gm" and toggle.has_pedal, ) + toggle.ignore_ignition_line = self.get_value("IgnoreIgnitionLine", condition=toggle.car_make == "gm") toggle.long_pitch = self.get_value( "LongPitch", condition=toggle.openpilot_longitudinal and toggle.car_make == "gm", diff --git a/starpilot/system/the_galaxy/assets/components/tools/device_settings_layout.json b/starpilot/system/the_galaxy/assets/components/tools/device_settings_layout.json index 1d8ae1752..7b2eed841 100644 --- a/starpilot/system/the_galaxy/assets/components/tools/device_settings_layout.json +++ b/starpilot/system/the_galaxy/assets/components/tools/device_settings_layout.json @@ -2480,6 +2480,13 @@ "data_type": "bool", "ui_type": "toggle" }, + { + "key": "IgnoreIgnitionLine", + "label": "Use CAN Ignition Only", + "description": "Use Panda firmware that ignores the physical ignition line and starts from CAN ignition only.\n\nRequires a Panda flash. Use this only on vehicles with reliable CAN ignition when the harness box reports false ignition.", + "data_type": "bool", + "ui_type": "toggle" + }, { "key": "LongPitch", "label": "Smooth Pedal Response on Hills", diff --git a/starpilot/ui/qt/offroad/vehicle_settings.cc b/starpilot/ui/qt/offroad/vehicle_settings.cc index 29e2a7bfc..51e57590f 100644 --- a/starpilot/ui/qt/offroad/vehicle_settings.cc +++ b/starpilot/ui/qt/offroad/vehicle_settings.cc @@ -173,6 +173,7 @@ StarPilotVehiclesPanel::StarPilotVehiclesPanel(StarPilotSettingsWindow *parent, {"GMToggles", tr("General Motors Settings"), tr("StarPilot features for General Motors vehicles."), ""}, {"GMPedalLongitudinal", tr("Use Pedal For Longitudinal"), tr("Use the pedal interceptor for full longitudinal control on supported GM vehicles."), ""}, {"GMDashSpoofOffsets", tr("Apply Offsets To Dash Spoof"), tr("On GM pedal-long cars, add the configured set-speed offset to the spoofed dash set speed so it matches the on-screen set speed."), ""}, + {"IgnoreIgnitionLine", tr("Use CAN Ignition Only"), tr("Use CAN ignition only and ignore the physical ignition line in Panda firmware.

Requires a Panda flash. Use this only on vehicles with reliable CAN ignition when the harness box reports false ignition."), ""}, {"LongPitch", tr("Smooth Pedal Response on Hills"), tr("Smoothen acceleration and braking when driving downhill/uphill."), ""}, {"RemoteStartBootsComma", tr("Remote Start Boots comma"), tr("Use the remote-start GM panda firmware at boot.

Required for GM remote-start startup signal behavior."), ""}, {"RemapCancelToDistance", tr("Remap Cancel Button"), tr("On pedal-interceptor Bolts, treat the steering-wheel CANCEL button as an extra mappable button."), ""}, @@ -300,24 +301,28 @@ StarPilotVehiclesPanel::StarPilotVehiclesPanel(StarPilotSettingsWindow *parent, }); } - ParamControl *remoteStartToggle = static_cast(toggles["RemoteStartBootsComma"]); - QObject::connect(remoteStartToggle, &ToggleControl::toggleFlipped, [parent, remoteStartToggle, this](bool state) { - const QString prompt = tr("Remote Start requires a Panda firmware update. Flash the Panda now?"); - if (!StarPilotConfirmationDialog::yesorno(prompt, this)) { - params.putBool("RemoteStartBootsComma", !state); - remoteStartToggle->refresh(); - return; - } - - std::thread([parent, this]() { - parent->keepScreenOn = true; - params_memory.putBool("FlashPanda", true); - while (params_memory.getBool("FlashPanda")) { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); + auto connectPandaFlashToggle = [parent, this](const QString &key, const QString &prompt) { + ParamControl *toggle = static_cast(toggles[key]); + QObject::connect(toggle, &ToggleControl::toggleFlipped, [parent, key, prompt, toggle, this](bool state) { + if (!StarPilotConfirmationDialog::yesorno(prompt, this)) { + params.putBool(key.toStdString(), !state); + toggle->refresh(); + return; } - Hardware::reboot(); - }).detach(); - }); + + std::thread([parent, this]() { + parent->keepScreenOn = true; + params_memory.putBool("FlashPanda", true); + while (params_memory.getBool("FlashPanda")) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + Hardware::reboot(); + }).detach(); + }); + }; + + connectPandaFlashToggle("IgnoreIgnitionLine", tr("CAN Ignition Only requires a Panda firmware update. Flash the Panda now?")); + connectPandaFlashToggle("RemoteStartBootsComma", tr("Remote Start requires a Panda firmware update. Flash the Panda now?")); openDescriptions(forceOpenDescriptions, toggles); diff --git a/starpilot/ui/qt/offroad/vehicle_settings.h b/starpilot/ui/qt/offroad/vehicle_settings.h index a9ca211d9..ef240e9b2 100644 --- a/starpilot/ui/qt/offroad/vehicle_settings.h +++ b/starpilot/ui/qt/offroad/vehicle_settings.h @@ -23,7 +23,7 @@ private: std::map toggles; - QSet gmKeys = {"GMPedalLongitudinal", "GMDashSpoofOffsets", "LongPitch", "RemoteStartBootsComma", "RemapCancelToDistance", "VoltSNG"}; + QSet gmKeys = {"GMPedalLongitudinal", "GMDashSpoofOffsets", "IgnoreIgnitionLine", "LongPitch", "RemoteStartBootsComma", "RemapCancelToDistance", "VoltSNG"}; QSet longitudinalKeys = {"FrogsGoMoosTweak", "GMDashSpoofOffsets", "LongPitch", "RemapCancelToDistance", "SNGHack", "VoltSNG"}; QSet subaruKeys = {"SubaruSNG", "SubaruSNGManualParkingBrake"}; QSet toyotaKeys = {"ClusterOffset", "FrogsGoMoosTweak", "LockDoorsTimer", "SNGHack", "ToyotaDoors"}; diff --git a/tools/StarPilot/feasibleparams.txt b/tools/StarPilot/feasibleparams.txt index 340381d69..da0a161bd 100644 --- a/tools/StarPilot/feasibleparams.txt +++ b/tools/StarPilot/feasibleparams.txt @@ -114,6 +114,7 @@ ForceTorqueController FrogsGoMoosTweak GMDashSpoofOffsets GMPedalLongitudinal +IgnoreIgnitionLine GoatScream GoatScreamCriticalAlerts GreenLightAlert