From 54a01f626d18540044ea824c0e19ec2aa29d2d03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2020 18:22:03 +0200 Subject: [PATCH 01/25] Bump DoozyX/clang-format-lint-action from v0.9 to v0.10 (#187) Bumps [DoozyX/clang-format-lint-action](https://github.com/DoozyX/clang-format-lint-action) from v0.9 to v0.10. - [Release notes](https://github.com/DoozyX/clang-format-lint-action/releases) - [Commits](https://github.com/DoozyX/clang-format-lint-action/compare/v0.9...2a69814cceb8653ef559b803dd7e13cda9295481) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f556146b..3b5beafd 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,13 +9,13 @@ jobs: steps: - uses: actions/checkout@v2 - name: Check src format - uses: DoozyX/clang-format-lint-action@v0.9 + uses: DoozyX/clang-format-lint-action@v0.10 with: source: './src' extensions: 'h,cpp' clangFormatVersion: 9 - name: Check examples format - uses: DoozyX/clang-format-lint-action@v0.9 + uses: DoozyX/clang-format-lint-action@v0.10 with: source: './examples' extensions: 'h,cpp,ino' From 82c434f6fb2177faccde82b2e41e5210b009382a Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Sun, 27 Sep 2020 10:36:40 +0200 Subject: [PATCH 02/25] refactoring should not stale --- .github/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/stale.yml b/.github/stale.yml index 760073d5..aa42582e 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -6,6 +6,7 @@ daysUntilClose: 7 exemptLabels: - bug - enhancement + - refactoring # Label to use when marking an issue as stale staleLabel: wontfix # Comment to post when marking an issue as stale. Set to `false` to disable From f20f7a1f0d8731724a696be8ca51b189efb45627 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Sun, 27 Sep 2020 17:31:55 +0200 Subject: [PATCH 03/25] set arduino cli version to 0.12.1 workaround for arduino/arduino-cli#960 updated platform versions --- .github/workflows/push.yml | 14 ++++++++------ .gitignore | 3 +-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index be6370a6..378df28a 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -1,8 +1,10 @@ on: [push, pull_request] name: Test +env: + ENV_CLI_VERSION: 0.12.1 jobs: test: - name: Test for ${{ matrix.board }} + name: Test for Board ${{ matrix.board }} runs-on: ubuntu-latest strategy: matrix: @@ -19,7 +21,7 @@ jobs: with: arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json - arduino-platform: arduino:avr@1.8.2,SparkFun:avr@1.1.5,Legion2:avr@0.1.3 + arduino-platform: arduino:avr@1.8.3,SparkFun:avr@1.1.13,Legion2:avr@0.2.0 required-libraries: FastLED@3.3.3 sketch-names: LightingNodePRO.ino, SingleStripLightingNodePRO.ino, @@ -37,7 +39,7 @@ jobs: DebugSketch.ino examples-build-properties: '{"DebugSketch": "-DDEBUG -DVERBOSE -DPRINT_COMMAND=true -DPRINT_RESPONSE=true -DPRINT_LOOP=true -DPRINT_UPDATE=true"}' testUnoMega: - name: Test UnoMega sketches for ${{ matrix.board }} + name: Test Arduino Uno/Mega sketches for Board ${{ matrix.board }} runs-on: ubuntu-latest strategy: matrix: @@ -48,11 +50,11 @@ jobs: uses: ArminJo/arduino-test-compile@v2.6.0 with: arduino-board-fqbn: ${{ matrix.board }} - arduino-platform: arduino:avr@1.8.2 + arduino-platform: arduino:avr@1.8.3 required-libraries: FastLED@3.3.3 sketch-names: HoodLoader2UnoMegaController.ino test16u2: - name: Test 16u2 sketch for ${{ matrix.board }} + name: Test 16u2 sketch for Board ${{ matrix.board }} runs-on: ubuntu-latest strategy: matrix: @@ -64,6 +66,6 @@ jobs: with: arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/NicoHood/HoodLoader2/master/package_NicoHood_HoodLoader2_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json - arduino-platform: arduino:avr@1.8.2,HoodLoader2:avr@2.0.5,Legion2:avr@0.1.3 + arduino-platform: arduino:avr@1.8.3,HoodLoader2:avr@2.0.5,Legion2:avr@0.2.0 required-libraries: FastLED@3.3.3 sketch-names: HoodLoader2CLPBridge.ino diff --git a/.gitignore b/.gitignore index f3640dd6..14108842 100644 --- a/.gitignore +++ b/.gitignore @@ -274,5 +274,4 @@ __vm/ .vscode/ # Arduino CLI -*.elf -*.hex +build/ From 1dd3ed02ced29706875d40e7be08fb895952be30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Oct 2020 10:34:27 +0200 Subject: [PATCH 04/25] Bump DoozyX/clang-format-lint-action from v0.10 to v0.11 (#195) Bumps [DoozyX/clang-format-lint-action](https://github.com/DoozyX/clang-format-lint-action) from v0.10 to v0.11. - [Release notes](https://github.com/DoozyX/clang-format-lint-action/releases) - [Commits](https://github.com/DoozyX/clang-format-lint-action/compare/v0.10...84b814a54950e27ac65a62069802df099405ef77) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3b5beafd..baccdf36 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,13 +9,13 @@ jobs: steps: - uses: actions/checkout@v2 - name: Check src format - uses: DoozyX/clang-format-lint-action@v0.10 + uses: DoozyX/clang-format-lint-action@v0.11 with: source: './src' extensions: 'h,cpp' clangFormatVersion: 9 - name: Check examples format - uses: DoozyX/clang-format-lint-action@v0.10 + uses: DoozyX/clang-format-lint-action@v0.11 with: source: './examples' extensions: 'h,cpp,ino' From 49e9af67c181c96dec1dbf50f79fe4c006fa0242 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2020 18:51:02 +0100 Subject: [PATCH 05/25] Bump ArminJo/arduino-test-compile from v2.6.0 to v3 (#196) * Bump ArminJo/arduino-test-compile from v2.6.0 to v3 Bumps [ArminJo/arduino-test-compile](https://github.com/ArminJo/arduino-test-compile) from v2.6.0 to v3. - [Release notes](https://github.com/ArminJo/arduino-test-compile/releases) - [Commits](https://github.com/ArminJo/arduino-test-compile/compare/v2.6.0...4b0ac82c8621c06c55935a491b42459f9546f0b4) Signed-off-by: dependabot[bot] * renamed deprecated workfloaw input * fixed the way the arduino cli version is passed Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Leon Kiefer --- .github/workflows/push.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 378df28a..b46eda15 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -1,7 +1,5 @@ on: [push, pull_request] name: Test -env: - ENV_CLI_VERSION: 0.12.1 jobs: test: name: Test for Board ${{ matrix.board }} @@ -17,8 +15,9 @@ jobs: steps: - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} - uses: ArminJo/arduino-test-compile@v2.6.0 + uses: ArminJo/arduino-test-compile@v3 with: + cli-version: 0.12.1 arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json arduino-platform: arduino:avr@1.8.3,SparkFun:avr@1.1.13,Legion2:avr@0.2.0 @@ -37,7 +36,7 @@ jobs: AmbientBacklight.ino, MultipleFans.ino, DebugSketch.ino - examples-build-properties: '{"DebugSketch": "-DDEBUG -DVERBOSE -DPRINT_COMMAND=true -DPRINT_RESPONSE=true -DPRINT_LOOP=true -DPRINT_UPDATE=true"}' + build-properties: '{"DebugSketch": "-DDEBUG -DVERBOSE -DPRINT_COMMAND=true -DPRINT_RESPONSE=true -DPRINT_LOOP=true -DPRINT_UPDATE=true"}' testUnoMega: name: Test Arduino Uno/Mega sketches for Board ${{ matrix.board }} runs-on: ubuntu-latest @@ -47,8 +46,9 @@ jobs: steps: - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} - uses: ArminJo/arduino-test-compile@v2.6.0 + uses: ArminJo/arduino-test-compile@v3 with: + cli-version: 0.12.1 arduino-board-fqbn: ${{ matrix.board }} arduino-platform: arduino:avr@1.8.3 required-libraries: FastLED@3.3.3 @@ -62,8 +62,9 @@ jobs: steps: - uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} - uses: ArminJo/arduino-test-compile@v2.6.0 + uses: ArminJo/arduino-test-compile@v3 with: + cli-version: 0.12.1 arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/NicoHood/HoodLoader2/master/package_NicoHood_HoodLoader2_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json arduino-platform: arduino:avr@1.8.3,HoodLoader2:avr@2.0.5,Legion2:avr@0.2.0 From e84412426d13a001c29ec9b8c83c9f60b2c3b995 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Fri, 13 Nov 2020 23:52:24 +0100 Subject: [PATCH 06/25] added SparkFun Boards installation hint to readme close #170 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 12a299ba..53d0244c 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ If you have an Arduino Uno or Mega, see the [other guide](https://github.com/Leg 1. Install the [CLP Boards](https://github.com/Legion2/CorsairLightingProtocolBoards). They can be installed by following the [CLP Boards installation guide](https://github.com/Legion2/CorsairLightingProtocolBoards#how-to-use-these-boards-in-arduino). After installation it should be possible to select the CLP Boards in the Arduino IDE as shown in the screenshot below. + If your are using a Sparkfun Pro Micro also install the [SparkFun Boards definition](https://github.com/sparkfun/Arduino_Boards#installation-instructions). ![select CLP Board](extra/images/select-board.png) 1. Upload the "LightingNodePRO" sketch to your Arduino. From e94eb5b76bee70270623ade4554f9af8212ce169 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Sat, 14 Nov 2020 00:09:43 +0100 Subject: [PATCH 07/25] updated issue templates with more information --- .github/ISSUE_TEMPLATE/bug_report.md | 8 +++++--- .github/ISSUE_TEMPLATE/support.md | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 5c5053a6..36d9d452 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -25,9 +25,11 @@ If applicable, add screenshots to help explain your problem. **System (please complete the following information):** - OS: [e.g. Windows 10] - Board: [e.g. Arduino Leonardo] - - IDE: [e.g. Arduino IDE] - - Version: [e.g. 0.3.0] - - Sketch: [e.g. SingleStripLightingNodePRO] + - Device: [e.g. Lighting Node PRO] + - Version of IDE: [e.g. Arduino IDE 1.8.13] + - Version of CLP: [e.g. 0.14.2] + - Version of CLP Boards: [e.g. 0.2.0] + - Sketch: [e.g. RepeatAndScale] **Code changes** Did you changed the code of the library or the sketch? diff --git a/.github/ISSUE_TEMPLATE/support.md b/.github/ISSUE_TEMPLATE/support.md index eee6ad66..d3481b28 100644 --- a/.github/ISSUE_TEMPLATE/support.md +++ b/.github/ISSUE_TEMPLATE/support.md @@ -16,9 +16,11 @@ If applicable, add screenshots to help explain your problem. **System (please complete the following information):** - OS: [e.g. Windows 10] - Board: [e.g. Arduino Leonardo] - - IDE: [e.g. Arduino IDE] - - Version: [e.g. 0.3.0] - - Sketch: [e.g. SingleStripLightingNodePRO] + - Device: [e.g. Lighting Node PRO] + - Version of IDE: [e.g. Arduino IDE 1.8.13] + - Version of CLP: [e.g. 0.14.2] + - Version of CLP Boards: [e.g. 0.2.0] + - Sketch: [e.g. RepeatAndScale] **Code changes** Did you changed the code of the library or the sketch? From 1ea7b97e7965ae6b57f36a0f53e59792a0338508 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Mon, 30 Nov 2020 20:51:24 +0100 Subject: [PATCH 08/25] document Adafruit 32u4 AVR Boards support --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53d0244c..2fe5a3fc 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ This project provides example sketches for easy use with Arduino IDE. ## Requirements The library is compatible with all boards using the MCU ATmega32U4. -This includes **Arduino Leonardo**, **SparkFun Pro Micro**, and **Arduino Micro**. +This includes **Arduino Leonardo**, **SparkFun Pro Micro**, **Arduino Micro**, and **Adafruit 32u4 AVR Boards**. It also supports the Arduino Uno and Arduino Mega, **but** this requires the [HoodLoader2](https://github.com/NicoHood/HoodLoader2) bootloader, see [this wiki](https://github.com/Legion2/CorsairLightingProtocol/wiki/How-to-use-on-Arduino-Uno-and-Arduino-Mega) for more details. It is **not** compatible with ATmega328 (Arduino Nano), STM8S103F3, teensy, ESP8266 and ESP32 see [list of architecture/platform](https://github.com/Legion2/CorsairLightingProtocol/issues?q=is%3Aissue+label%3Aarchitecture%2Fplatform) for a detailed description why they are not supported. In the rest of the documentation "Arduino" is used as a synonym for all supported boards regardless of the manufacturer. From d837bb59c12a3696e62a80216d7383d628dcac12 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Fri, 11 Dec 2020 10:28:07 +0100 Subject: [PATCH 09/25] updated arduino cli to 0.14.0 --- .github/workflows/push.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index b46eda15..050f723e 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -17,7 +17,7 @@ jobs: - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v3 with: - cli-version: 0.12.1 + cli-version: 0.14.0 arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json arduino-platform: arduino:avr@1.8.3,SparkFun:avr@1.1.13,Legion2:avr@0.2.0 @@ -48,7 +48,7 @@ jobs: - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v3 with: - cli-version: 0.12.1 + cli-version: 0.14.0 arduino-board-fqbn: ${{ matrix.board }} arduino-platform: arduino:avr@1.8.3 required-libraries: FastLED@3.3.3 @@ -64,7 +64,7 @@ jobs: - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v3 with: - cli-version: 0.12.1 + cli-version: 0.14.0 arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/NicoHood/HoodLoader2/master/package_NicoHood_HoodLoader2_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json arduino-platform: arduino:avr@1.8.3,HoodLoader2:avr@2.0.5,Legion2:avr@0.2.0 From e75f9bbc34ba68f8147a6097a671f2c73a910eb3 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Fri, 11 Dec 2020 10:28:30 +0100 Subject: [PATCH 10/25] fixed unit test --- examples/UnitTests/UnitTests.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/UnitTests/UnitTests.ino b/examples/UnitTests/UnitTests.ino index 57a33458..463b7768 100644 --- a/examples/UnitTests/UnitTests.ino +++ b/examples/UnitTests/UnitTests.ino @@ -52,7 +52,7 @@ testF(FastLEDControllerTest, simpleScaleUp) { fill_solid(leds, 10, CRGB::White); CLP::scale(&ledController, 0, 20); - assertCRGBArray(leds, 0, 9, CRGB::White); + assertCRGBArray(leds, 0, 19, CRGB::White); } testF(FastLEDControllerTest, simpleScaleDown) { From 5ce371ab2fe425ff7b03daf2580c92ec64d1b845 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Sun, 13 Dec 2020 13:11:41 +0100 Subject: [PATCH 11/25] changed time to unsinged long added unit tests for animation step functions --- examples/CommanderPRO/SimpleFanController.cpp | 6 +- examples/CommanderPRO/SimpleFanController.h | 2 +- .../CLPUSBSerialBridge.cpp | 4 +- examples/UnitTests2/UnitTests2.ino | 137 ++++++++++++++++++ src/CLPUtils.cpp | 2 +- src/FastLEDController.cpp | 10 +- src/FastLEDController.h | 4 +- src/LEDController.cpp | 3 +- src/LEDController.h | 2 +- 9 files changed, 154 insertions(+), 16 deletions(-) create mode 100644 examples/UnitTests2/UnitTests2.ino diff --git a/examples/CommanderPRO/SimpleFanController.cpp b/examples/CommanderPRO/SimpleFanController.cpp index b910ec5c..da1915c1 100644 --- a/examples/CommanderPRO/SimpleFanController.cpp +++ b/examples/CommanderPRO/SimpleFanController.cpp @@ -39,9 +39,9 @@ void SimpleFanController::addFan(uint8_t index, PWMFan* fan) { } bool SimpleFanController::updateFans() { - long currentUpdate = millis(); - long lastUpdateNumber = lastUpdate / updateRate; - long currentUpdateNumber = currentUpdate / updateRate; + unsigned long currentUpdate = millis(); + unsigned long lastUpdateNumber = lastUpdate / updateRate; + unsigned long currentUpdateNumber = currentUpdate / updateRate; lastUpdate = currentUpdate; if (lastUpdateNumber < currentUpdateNumber) { if (triggerSave) { diff --git a/examples/CommanderPRO/SimpleFanController.h b/examples/CommanderPRO/SimpleFanController.h index 61eb2999..a523b745 100644 --- a/examples/CommanderPRO/SimpleFanController.h +++ b/examples/CommanderPRO/SimpleFanController.h @@ -83,5 +83,5 @@ class SimpleFanController : public FanController { * Indicates that the configuration of the fans has been changed and should be saved. */ bool triggerSave = false; - long lastUpdate = 0; + unsigned long lastUpdate = 0; }; diff --git a/examples/HoodLoader2CLPBridge/CLPUSBSerialBridge.cpp b/examples/HoodLoader2CLPBridge/CLPUSBSerialBridge.cpp index 71688bf4..42069116 100644 --- a/examples/HoodLoader2CLPBridge/CLPUSBSerialBridge.cpp +++ b/examples/HoodLoader2CLPBridge/CLPUSBSerialBridge.cpp @@ -68,7 +68,7 @@ void CLPUSBSerialBridge::handleHID() { #ifdef DEBUG Serial.print(F("C")); Serial.println(rawHIDAndSerialBuffer[0], HEX); - long time = micros(); + unsigned long time = micros(); #endif // DEBUG if (!waitForSynchronization()) { #ifdef DEBUG @@ -93,7 +93,7 @@ void CLPUSBSerialBridge::handleHID() { sendResponse(); #ifdef DEBUG - long duration = micros() - time; + unsigned long duration = micros() - time; Serial.print(F("D")); Serial.println(duration); #endif // DEBUG diff --git a/examples/UnitTests2/UnitTests2.ino b/examples/UnitTests2/UnitTests2.ino new file mode 100644 index 00000000..76c683e6 --- /dev/null +++ b/examples/UnitTests2/UnitTests2.ino @@ -0,0 +1,137 @@ +/* + Copyright 2020 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#line 17 "UnitTests2.ino" + +#include + +#include "FastLEDController.h" +#include "FastLEDControllerUtils.h" + +using namespace aunit; + +class FastLEDControllerTest : public TestOnce { +protected: + void assertCRGB(const CRGB& actual, const CRGB& expected) { + assertEqual(actual.r, expected.r); + assertEqual(actual.g, expected.g); + assertEqual(actual.b, expected.b); + } + void assertCRGBArray(const CRGB* const leds, int from, int to, const CRGB& expected) { + for (int i = from; i <= to; i++) { + assertCRGB(leds[i], expected); + } + } +}; + +class TestFastLEDController : public FastLEDController { +public: + TestFastLEDController() : FastLEDController(false) { + } + + void setLastUpdate(unsigned long time) { + lastUpdate = time; + } + + void setCurrentUpdate(unsigned long time) { + currentUpdate = time; + } + + using FastLEDController::animation_step; + using FastLEDController::animation_step_count; +}; + +test(getLEDs) { + CRGB leds[10]; + FastLEDController ledController(false); + ledController.addLEDs(0, leds, 10); + assertEqual(ledController.getLEDs(0), leds); + assertEqual(ledController.getLEDs(1), nullptr); +} + +testF(FastLEDControllerTest, simpleScaleUp) { + CRGB leds[20]; + FastLEDController ledController(false); + fill_solid(leds, 20, CRGB::Black); + ledController.addLEDs(0, leds, 20); + + fill_solid(leds, 10, CRGB::White); + CLP::reverse(&ledController, 0); + + assertCRGBArray(leds, 0, 9, CRGB::Black); + assertCRGBArray(leds, 10, 19, CRGB::White); +} + +test(animation_step) { + TestFastLEDController ledController; + ledController.setLastUpdate(155); + ledController.setCurrentUpdate(165); + assertEqual(ledController.animation_step(5, 100), 0); + assertEqual(ledController.animation_step(10, 100), 50); + assertEqual(ledController.animation_step(20, 100), 25); + assertEqual(ledController.animation_step(40, 100), 12); + assertEqual(ledController.animation_step(5000, 100), 3); +} + +test(animation_step_long) { + TestFastLEDController ledController; + ledController.setLastUpdate(3000000000); + ledController.setCurrentUpdate(300000005); + assertEqual(ledController.animation_step(5, 100), 0); + assertEqual(ledController.animation_step(10, 100), 50); + assertEqual(ledController.animation_step(20, 100), 25); + assertEqual(ledController.animation_step(40, 100), 12); + assertEqual(ledController.animation_step(5000, 100), 0); +} + +test(animation_step_count) { + TestFastLEDController ledController; + ledController.setLastUpdate(155); + ledController.setCurrentUpdate(165); + assertEqual(ledController.animation_step_count(5, 100), 200); + assertEqual(ledController.animation_step_count(10, 100), 100); + assertEqual(ledController.animation_step_count(20, 100), 50); + assertEqual(ledController.animation_step_count(40, 100), 25); + assertEqual(ledController.animation_step_count(5000, 100), 0); +} + +test(animation_step_count_offset) { + TestFastLEDController ledController; + ledController.setLastUpdate(195); + ledController.setCurrentUpdate(205); + assertEqual(ledController.animation_step_count(10000, 100), 1); +} + +test(animation_step_count_long) { + TestFastLEDController ledController; + ledController.setLastUpdate(3000000000); + ledController.setCurrentUpdate(3000000010); + assertEqual(ledController.animation_step_count(5, 100), 200); + assertEqual(ledController.animation_step_count(10, 100), 100); + assertEqual(ledController.animation_step_count(20, 100), 50); + assertEqual(ledController.animation_step_count(40, 100), 25); + assertEqual(ledController.animation_step_count(5000, 100), 0); +} + +void setup() { + delay(1000); + Serial.begin(115200); + while (!Serial) + ; +} + +void loop() { + TestRunner::run(); +} diff --git a/src/CLPUtils.cpp b/src/CLPUtils.cpp index fbde0dd6..e4fb6a8e 100644 --- a/src/CLPUtils.cpp +++ b/src/CLPUtils.cpp @@ -56,7 +56,7 @@ void CLP::printFps(const int interval) { unsigned long now = millis(); frameCount++; - if (now - lastMillis >= interval) { + if (now - lastMillis >= (unsigned int)interval) { double framesPerSecond = (frameCount * 1000.0) / interval; Serial.print(F("FPS: ")); Serial.println(framesPerSecond, 1); diff --git a/src/FastLEDController.cpp b/src/FastLEDController.cpp index a7620e6d..97d41e5c 100644 --- a/src/FastLEDController.cpp +++ b/src/FastLEDController.cpp @@ -71,15 +71,15 @@ int FastLEDController::applySpeed(int duration, const GroupSpeed speed) { } int FastLEDController::animation_step(int duration, int steps) { - int currentStep = ((currentUpdate % duration) / ((float)duration)) * steps; + int currentStep = ((currentUpdate % (unsigned int)duration) / ((float)duration)) * steps; return currentStep; } int FastLEDController::animation_step_count(int duration, int steps) { - long lastAnimationNumber = lastUpdate / duration; - long currentAnimationNumber = currentUpdate / duration; - int lastStep = ((lastUpdate % duration) / ((float)duration)) * steps; - int currentStep = ((currentUpdate % duration) / ((float)duration)) * steps; + unsigned long lastAnimationNumber = lastUpdate / (unsigned int)duration; + unsigned long currentAnimationNumber = currentUpdate / (unsigned int)duration; + int lastStep = ((lastUpdate % (unsigned int)duration) / ((float)duration)) * steps; + int currentStep = ((currentUpdate % (unsigned int)duration) / ((float)duration)) * steps; return currentStep - lastStep + (currentAnimationNumber - lastAnimationNumber) * steps; } diff --git a/src/FastLEDController.h b/src/FastLEDController.h index a520f45b..df2c9ec1 100644 --- a/src/FastLEDController.h +++ b/src/FastLEDController.h @@ -128,8 +128,8 @@ class FastLEDController : public LEDController { ChannelData channelData[CHANNEL_NUM]; - long lastUpdate = 0; - long currentUpdate = 0; + unsigned long lastUpdate = 0; + unsigned long currentUpdate = 0; int applySpeed(int duration, const GroupSpeed speed); /** diff --git a/src/LEDController.cpp b/src/LEDController.cpp index c0423329..1483ad1d 100644 --- a/src/LEDController.cpp +++ b/src/LEDController.cpp @@ -251,6 +251,7 @@ void LEDController::startLEDAutodetection(uint8_t channel) { bool LEDController::saveIfNeeded() { if (triggerSave) { triggerSave = false; - save(); + return save(); } + return false; } diff --git a/src/LEDController.h b/src/LEDController.h index ddef3f87..6007e273 100644 --- a/src/LEDController.h +++ b/src/LEDController.h @@ -198,7 +198,7 @@ class LEDController : public ILEDController { /** * Stores the time at which the last command was received by the LEDController. */ - long lastCommand = 0; + unsigned long lastCommand = 0; /** * Trigger update of the LEDs From 8c961fa8c558e1f50ca2d08d3af9d7526549a6b5 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Thu, 31 Dec 2020 13:18:17 +0100 Subject: [PATCH 12/25] Update stale.yml --- .github/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/stale.yml b/.github/stale.yml index aa42582e..80b3adf6 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -1,5 +1,5 @@ # Number of days of inactivity before an issue becomes stale -daysUntilStale: 40 +daysUntilStale: 14 # Number of days of inactivity before a stale issue is closed daysUntilClose: 7 # Issues with these labels will never be considered stale From 663d4fef7f33028c965c2fed22160cbfa4f808e3 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Thu, 31 Dec 2020 17:57:33 +0100 Subject: [PATCH 13/25] added CLP::reverse to readme --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 2fe5a3fc..4207ce36 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,13 @@ ledController.onUpdateHook(0, []() { }); ``` +## Reverse direction of LED Strip +If you want to change the direction of the LEDs of the Strip without physically change the strip, the `CLP::reverse` function can be used. +```C++ +ledController.onUpdateHook(0, []() { + CLP::reverse(&ledController, 0); +}); +``` ## Hardware Lighting mode The [Hardware Lighting mode](https://forum.corsair.com/v3/showthread.php?t=182874) can be configured in iCUE. It allows you the set lighting effects that will be active when iCUE **is not** running. From 30752dc4623df307c32b999a4a56925a7442ffa8 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Thu, 31 Dec 2020 21:48:09 +0100 Subject: [PATCH 14/25] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4207ce36..af15d879 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,7 @@ ledController.onUpdateHook(0, []() { ## Reverse direction of LED Strip If you want to change the direction of the LEDs of the Strip without physically change the strip, the `CLP::reverse` function can be used. +The reverse function must be called be for scaling. ```C++ ledController.onUpdateHook(0, []() { CLP::reverse(&ledController, 0); From 5cfa062cbbce209a03975309422b72493aab1b41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Mar 2021 09:13:41 +0100 Subject: [PATCH 15/25] Bump peaceiris/actions-gh-pages from v3 to v3.8.0 (#224) Bumps [peaceiris/actions-gh-pages](https://github.com/peaceiris/actions-gh-pages) from v3 to v3.8.0. - [Release notes](https://github.com/peaceiris/actions-gh-pages/releases) - [Changelog](https://github.com/peaceiris/actions-gh-pages/blob/main/CHANGELOG.md) - [Commits](https://github.com/peaceiris/actions-gh-pages/compare/v3...068dc23d9710f1ba62e86896f84735d869951305) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/documentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 361aeb45..05896cb6 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -18,7 +18,7 @@ jobs: - name: Run doxygen run: doxygen extra/doxygen.conf - name: Deploy to gh-pages - uses: peaceiris/actions-gh-pages@v3 + uses: peaceiris/actions-gh-pages@v3.8.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_branch: gh-pages From 8941a11cfa99a043986c03928105a86974ec38a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Apr 2021 09:13:36 +0200 Subject: [PATCH 16/25] Bump DoozyX/clang-format-lint-action from v0.11 to v0.12 (#229) Bumps [DoozyX/clang-format-lint-action](https://github.com/DoozyX/clang-format-lint-action) from v0.11 to v0.12. - [Release notes](https://github.com/DoozyX/clang-format-lint-action/releases) - [Commits](https://github.com/DoozyX/clang-format-lint-action/compare/v0.11...2a28e3a8d9553f244243f7e1ff94f6685dff87be) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index baccdf36..88790066 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,13 +9,13 @@ jobs: steps: - uses: actions/checkout@v2 - name: Check src format - uses: DoozyX/clang-format-lint-action@v0.11 + uses: DoozyX/clang-format-lint-action@v0.12 with: source: './src' extensions: 'h,cpp' clangFormatVersion: 9 - name: Check examples format - uses: DoozyX/clang-format-lint-action@v0.11 + uses: DoozyX/clang-format-lint-action@v0.12 with: source: './examples' extensions: 'h,cpp,ino' From 17f02eabad21678d5d6864835f508b25a8788c9b Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Sun, 6 Jun 2021 12:22:11 +0200 Subject: [PATCH 17/25] added link to Troubleshooting section to readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index af15d879..d818c973 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,8 @@ If you have an Arduino Uno or Mega, see the [other guide](https://github.com/Leg Somewhere in the list of devices, there should be a device called "Lighting Node PRO". 1. Now open [iCUE](https://www.corsair.com/icue) there you should see the "Lighting Node PRO". +> If you have any problem during setup you may find the solution in the [Troubleshooting section](https://github.com/Legion2/CorsairLightingProtocol/wiki/Troubleshooting). + ## Use the Lighting Node PRO ![iCUE RGB Strip example](extra/images/iCUE.jpg) From 7383aee600738d4e8036a02718fa5d2735b9c1ae Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Thu, 17 Jun 2021 10:33:21 +0200 Subject: [PATCH 18/25] Update stale.yml --- .github/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/stale.yml b/.github/stale.yml index 80b3adf6..626f4fef 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -7,6 +7,7 @@ exemptLabels: - bug - enhancement - refactoring + - documentation # Label to use when marking an issue as stale staleLabel: wontfix # Comment to post when marking an issue as stale. Set to `false` to disable From a1640089f85322fffa706a9e31a4f3ea6b87fd6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Oct 2021 16:38:09 +0200 Subject: [PATCH 19/25] Bump DoozyX/clang-format-lint-action from 0.12 to 0.13 (#252) Bumps [DoozyX/clang-format-lint-action](https://github.com/DoozyX/clang-format-lint-action) from 0.12 to 0.13. - [Release notes](https://github.com/DoozyX/clang-format-lint-action/releases) - [Commits](https://github.com/DoozyX/clang-format-lint-action/compare/v0.12...v0.13) --- updated-dependencies: - dependency-name: DoozyX/clang-format-lint-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 88790066..fff292a4 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,13 +9,13 @@ jobs: steps: - uses: actions/checkout@v2 - name: Check src format - uses: DoozyX/clang-format-lint-action@v0.12 + uses: DoozyX/clang-format-lint-action@v0.13 with: source: './src' extensions: 'h,cpp' clangFormatVersion: 9 - name: Check examples format - uses: DoozyX/clang-format-lint-action@v0.12 + uses: DoozyX/clang-format-lint-action@v0.13 with: source: './examples' extensions: 'h,cpp,ino' From 4593dca29f4844bca209e28032f863a7d31b2576 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Sun, 16 Jan 2022 16:03:40 +0100 Subject: [PATCH 20/25] use stale github action --- .github/stale.yml | 19 ------------------- .github/workflows/stale.yaml | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 19 deletions(-) delete mode 100644 .github/stale.yml create mode 100644 .github/workflows/stale.yaml diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 626f4fef..00000000 --- a/.github/stale.yml +++ /dev/null @@ -1,19 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 14 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - bug - - enhancement - - refactoring - - documentation -# Label to use when marking an issue as stale -staleLabel: wontfix -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml new file mode 100644 index 00000000..f12c8fa8 --- /dev/null +++ b/.github/workflows/stale.yaml @@ -0,0 +1,18 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v4 + with: + days-before-stale: 14 + days-before-close: 7 + exempt-issue-labels: bug,enhancement,refactoring,documentation + stale-issue-message: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. From 69c57bd6b50ded9728dfea00665da5588406c56f Mon Sep 17 00:00:00 2001 From: Chris Spegal Date: Wed, 17 Feb 2021 14:23:22 -0500 Subject: [PATCH 21/25] Add support for TinyUSB --- .github/workflows/lint.yml | 4 +- .github/workflows/push.yml | 57 ++++++++++--- README.md | 45 ++++++++-- .../AdditionalFeatures/AdditionalFeatures.ino | 6 +- .../AmbientBacklight/AmbientBacklight.ino | 6 +- examples/CommanderPRO/CommanderPRO.ino | 9 +- examples/DebugSketch/DebugSketch.ino | 8 +- examples/DeviceIDTool/DeviceIDTool.ino | 20 ++--- .../HoodLoader2UnoMegaController.ino | 6 +- examples/LS100/LS100.ino | 6 +- examples/LT100/LT100.ino | 6 +- .../LightingNodeCORE/LightingNodeCORE.ino | 6 +- examples/LightingNodePRO/LightingNodePRO.ino | 6 +- examples/MultipleFans/MultipleFans.ino | 6 +- examples/NoEEPROM/NoEEPROM.ino | 45 ++++++++++ examples/NonAddressable/NonAddressable.ino | 6 +- examples/RepeatAndScale/RepeatAndScale.ino | 6 +- .../SingleStripLightingNodePRO.ino | 6 +- examples/TinyUSB/TinyUSB.ino | 48 +++++++++++ .../TransformLLFansFormatToStrip.ino | 6 +- examples/UnitTests/UnitTests.ino | 34 ++++---- examples/UnitTests2/UnitTests2.ino | 6 +- extra/images/board-wiring-pico.jpg | Bin 0 -> 99100 bytes extra/images/select-board-pico.png | Bin 0 -> 182319 bytes keywords.txt | 1 + library.properties | 2 +- src/CLPAdditionalFeatures.cpp | 4 +- src/CLPUtils.cpp | 12 +-- src/CLPUtils.h | 7 +- src/CorsairLightingFirmware.cpp | 49 +++-------- src/CorsairLightingFirmware.h | 54 +++++++----- src/CorsairLightingFirmwareStorageEEPROM.cpp | 29 +++++++ src/CorsairLightingFirmwareStorageEEPROM.h | 32 +++++++ src/CorsairLightingFirmwareStorageStatic.cpp | 23 +++++ src/CorsairLightingFirmwareStorageStatic.h | 28 ++++++ src/CorsairLightingProtocol.h | 5 ++ src/CorsairLightingProtocolConstants.h | 27 ++++++ src/CorsairLightingProtocolController.cpp | 2 + src/CorsairLightingProtocolController.h | 2 + src/CorsairLightingProtocolSerial.cpp | 2 +- src/CorsairLightingProtocolTinyUSBHID.cpp | 80 ++++++++++++++++++ src/CorsairLightingProtocolTinyUSBHID.h | 47 ++++++++++ src/FastLEDController.cpp | 47 +++++----- src/FastLEDController.h | 33 +++----- src/FastLEDControllerStorage.h | 24 ++++++ src/FastLEDControllerStorageEEPROM.cpp | 37 ++++++++ src/FastLEDControllerStorageEEPROM.h | 38 +++++++++ src/RawHID.cpp | 8 +- src/RawHID.h | 10 +-- 49 files changed, 747 insertions(+), 204 deletions(-) create mode 100644 examples/NoEEPROM/NoEEPROM.ino create mode 100644 examples/TinyUSB/TinyUSB.ino create mode 100644 extra/images/board-wiring-pico.jpg create mode 100644 extra/images/select-board-pico.png create mode 100644 src/CorsairLightingFirmwareStorageEEPROM.cpp create mode 100644 src/CorsairLightingFirmwareStorageEEPROM.h create mode 100644 src/CorsairLightingFirmwareStorageStatic.cpp create mode 100644 src/CorsairLightingFirmwareStorageStatic.h create mode 100644 src/CorsairLightingProtocolTinyUSBHID.cpp create mode 100644 src/CorsairLightingProtocolTinyUSBHID.h create mode 100644 src/FastLEDControllerStorage.h create mode 100644 src/FastLEDControllerStorageEEPROM.cpp create mode 100644 src/FastLEDControllerStorageEEPROM.h diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 88790066..fff292a4 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,13 +9,13 @@ jobs: steps: - uses: actions/checkout@v2 - name: Check src format - uses: DoozyX/clang-format-lint-action@v0.12 + uses: DoozyX/clang-format-lint-action@v0.13 with: source: './src' extensions: 'h,cpp' clangFormatVersion: 9 - name: Check examples format - uses: DoozyX/clang-format-lint-action@v0.12 + uses: DoozyX/clang-format-lint-action@v0.13 with: source: './examples' extensions: 'h,cpp,ino' diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 050f723e..8ccf078c 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -1,4 +1,4 @@ -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] name: Test jobs: test: @@ -17,11 +17,11 @@ jobs: - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v3 with: - cli-version: 0.14.0 + cli-version: 0.18.3 arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json - arduino-platform: arduino:avr@1.8.3,SparkFun:avr@1.1.13,Legion2:avr@0.2.0 - required-libraries: FastLED@3.3.3 + arduino-platform: arduino:avr@1.8.3,SparkFun:avr@1.1.13,Legion2:avr@0.3.1 + required-libraries: FastLED@3.5.0 sketch-names: LightingNodePRO.ino, SingleStripLightingNodePRO.ino, CommanderPRO.ino, @@ -35,7 +35,8 @@ jobs: AdditionalFeatures.ino, AmbientBacklight.ino, MultipleFans.ino, - DebugSketch.ino + DebugSketch.ino, + NoEEPROM.ino build-properties: '{"DebugSketch": "-DDEBUG -DVERBOSE -DPRINT_COMMAND=true -DPRINT_RESPONSE=true -DPRINT_LOOP=true -DPRINT_UPDATE=true"}' testUnoMega: name: Test Arduino Uno/Mega sketches for Board ${{ matrix.board }} @@ -48,10 +49,10 @@ jobs: - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v3 with: - cli-version: 0.14.0 + cli-version: 0.18.3 arduino-board-fqbn: ${{ matrix.board }} arduino-platform: arduino:avr@1.8.3 - required-libraries: FastLED@3.3.3 + required-libraries: FastLED@3.5.0 sketch-names: HoodLoader2UnoMegaController.ino test16u2: name: Test 16u2 sketch for Board ${{ matrix.board }} @@ -64,9 +65,45 @@ jobs: - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v3 with: - cli-version: 0.14.0 + cli-version: 0.18.3 arduino-board-fqbn: ${{ matrix.board }} platform-url: https://raw.githubusercontent.com/NicoHood/HoodLoader2/master/package_NicoHood_HoodLoader2_index.json,https://raw.githubusercontent.com/Legion2/CorsairLightingProtocolBoards/master/package_Legion2_CorsairLightingProtocolBoards_index.json - arduino-platform: arduino:avr@1.8.3,HoodLoader2:avr@2.0.5,Legion2:avr@0.2.0 - required-libraries: FastLED@3.3.3 + arduino-platform: arduino:avr@1.8.3,HoodLoader2:avr@2.0.5,Legion2:avr@0.3.1 + required-libraries: FastLED@3.5.0 sketch-names: HoodLoader2CLPBridge.ino + testAdafruitM0: + name: Test for Board ${{ matrix.board }} + runs-on: ubuntu-latest + strategy: + matrix: + board: + [ + "adafruit:samd:adafruit_feather_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_feather_m0_express:usbstack=tinyusb", + "adafruit:samd:adafruit_metro_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_circuitplayground_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_gemma_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_trinket_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_qtpy_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_neotrinkey_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_rotarytrinkey_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_neokeytrinkey_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_slidetrinkey_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_proxlighttrinkey_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_itsybitsy_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_pirkey:usbstack=tinyusb", + "adafruit:samd:adafruit_hallowing:usbstack=tinyusb", + "adafruit:samd:adafruit_crickit_m0:usbstack=tinyusb", + "adafruit:samd:adafruit_blm_badge:usbstack=tinyusb" + ] + steps: + - uses: actions/checkout@v2 + - name: Build for ${{ matrix.board }} + uses: ArminJo/arduino-test-compile@v3 + with: + cli-version: 0.18.3 + arduino-board-fqbn: ${{ matrix.board }} + platform-url: https://adafruit.github.io/arduino-board-index/package_adafruit_index.json + arduino-platform: adafruit:samd@1.7.8 + required-libraries: FastLED@3.5.0,Adafruit TinyUSB Library@1.9.2 + sketch-names: TinyUSB.ino diff --git a/README.md b/README.md index d818c973..43bf304a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ _This is not an official corsair project._ * Control LEDs with the [Corsair iCUE software](https://www.corsair.com/icue). * [Support common LED chipsets](https://github.com/FastLED/FastLED/wiki/Overview#chipsets). (e.g. WS2812B, WS2801) * Support [FastLED](http://fastled.io/). -* Supported platform: Arduino AVR +* Supported platforms: Arduino AVR, [TinyUSB supported cores](https://github.com/adafruit/Adafruit_TinyUSB_Arduino#supported-cores) * Hardware Lighting mode. * Use multiple devices at the same time. * Repeat or scale LED channels to arbitrary size. @@ -33,14 +33,19 @@ This project provides example sketches for easy use with Arduino IDE. - [Requirements](#requirements) - [Install the libraries](#install-the-libraries) -- [Create a Lighting Node PRO](#create-a-lighting-node-pro) +- [Create a Lighting Node PRO with AVR](#create-a-lighting-node-pro-with-avr) +- [Create a Lighting Node PRO with TinyUSB](#create-a-lighting-node-pro-for-a-raspberry-pi-pico-with-tinyusb) - [Use the Lighting Node PRO](#use-the-lighting-node-pro) ## Requirements The library is compatible with all boards using the MCU ATmega32U4. This includes **Arduino Leonardo**, **SparkFun Pro Micro**, **Arduino Micro**, and **Adafruit 32u4 AVR Boards**. It also supports the Arduino Uno and Arduino Mega, **but** this requires the [HoodLoader2](https://github.com/NicoHood/HoodLoader2) bootloader, see [this wiki](https://github.com/Legion2/CorsairLightingProtocol/wiki/How-to-use-on-Arduino-Uno-and-Arduino-Mega) for more details. -It is **not** compatible with ATmega328 (Arduino Nano), STM8S103F3, teensy, ESP8266 and ESP32 see [list of architecture/platform](https://github.com/Legion2/CorsairLightingProtocol/issues?q=is%3Aissue+label%3Aarchitecture%2Fplatform) for a detailed description why they are not supported. + +In addition, any board compatible with **Adafruit TinyUSB for Arduino** is also supported without the use of custom board definitions. Be sure to define USE_TINYUSB, which is done automatically when using a supported core and selecting TinyUSB for the USB Stack. See the TinyUSB example for implementation details. + +It is **not** compatible with ATmega328 (Arduino Nano), STM8S103F3, teensy, or ESP8266 see [list of architecture/platform](https://github.com/Legion2/CorsairLightingProtocol/issues?q=is%3Aissue+label%3Aarchitecture%2Fplatform) for a detailed description why they are not supported. + In the rest of the documentation "Arduino" is used as a synonym for all supported boards regardless of the manufacturer. When you have problems with a board not listed here, please open an [Issue](https://github.com/Legion2/CorsairLightingProtocol/issues). @@ -51,8 +56,9 @@ Open the Library-Manager in Arduino IDE via Tools->Manage Libraries... Search for "Corsair Lighting Protocol" and install the Corsair Lighting Protocol library. This library also requires the [FastLED](http://fastled.io/) library. Search for "FastLED" in the Library-Manager and install the FastLED library. +If using TinyUSB, also install the latest "Adafruit TinyUSB Library" as it supersedes some of the core versions. -## Create a Lighting Node PRO +## Create a Lighting Node PRO with AVR This guide will teach you how to create a Lighting Node PRO with an Arduino Leonardo compatible board. If you have an Arduino Uno or Mega, see the [other guide](https://github.com/Legion2/CorsairLightingProtocol/wiki/How-to-use-on-Arduino-Uno-and-Arduino-Mega). @@ -70,7 +76,7 @@ If you have an Arduino Uno or Mega, see the [other guide](https://github.com/Leg ![upload sketch](extra/images/upload-sketch.png) 1. Do the wiring. - For more information on [how to wire the leds](https://github.com/FastLED/FastLED/wiki/Wiring-leds) and [how to set up the LEDs in the code](https://github.com/FastLED/FastLED/wiki/Basic-usage#setting-up-the-leds) see the links. + For more information on [how to wire the LEDs](https://github.com/FastLED/FastLED/wiki/Wiring-leds) and [how to set up the LEDs in the code](https://github.com/FastLED/FastLED/wiki/Basic-usage#setting-up-the-leds) see the links. ![the wiring](extra/images/board-wiring.jpg) 1. Verify your device works as expected. @@ -80,6 +86,31 @@ If you have an Arduino Uno or Mega, see the [other guide](https://github.com/Leg > If you have any problem during setup you may find the solution in the [Troubleshooting section](https://github.com/Legion2/CorsairLightingProtocol/wiki/Troubleshooting). +## Create a Lighting Node PRO for a Raspberry Pi Pico with TinyUSB + +This guide will teach you how to create a Lighting Node PRO with a Raspberry Pi Pico. + +**Note:** FastLED currently does not support the RP2040 natively. You must manually merge support by modifying your library to include the [6 RP2040 platform files](https://github.com/FastLED/FastLED/pull/1261/files#diff-fda1710ad90fcc4b2f07be21a834da7d24b00008867655232c84fb0369cfc74b) in the FastLED/src/platforms/arm/rp2040 folder and `#elif defined(ARDUINO_ARCH_RP2040)` / `#include` statements in [led_sysdefs.h](https://github.com/FastLED/FastLED/pull/1261/files#diff-95f6b43a0e6b0e58988e1be3bc6415ded5284082a4f2ce2aaa90f5931d4194af) and [platforms.h](https://github.com/FastLED/FastLED/pull/1261/files#diff-255ea38a6573ed237ea1fe164d5e87ca46811eef21ba6e2cef120fda47c6e62f). + +1. Install the [Raspberry Pi Pico Arduino core](https://github.com/earlephilhower/arduino-pico#installing-via-arduino-boards-manager). + +1. Open the example "TinyUSB", you can find it in Arduino IDE in the File menu->Examples->Corsair Lighting Protocol->TinyUSB. + If you can't open the LightingNodePRO example the Corsair Lighting Protocol library is not installed correctly. + +1. Select the Raspberry Pi Pico as shown in the screenshot below. Be sure to select the "Adafruit TinyUSB" USB Stack. + + ![select Raspberry Pi Pico](extra/images/select-board-pico.png) +1. Upload the "TinyUSB" sketch to your Pico. + +1. Do the wiring. + For more information on [how to wire the LEDs](https://github.com/FastLED/FastLED/wiki/Wiring-leds) and [how to set up the LEDs in the code](https://github.com/FastLED/FastLED/wiki/Basic-usage#setting-up-the-leds) see the links. + + ![the wiring](extra/images/board-wiring-pico.jpg) +1. Verify your device works as expected. + Open the Windows settings->devices->Other devices. + Somewhere in the list of devices, there should be a device called "Lighting Node PRO". +1. Now open [iCUE](https://www.corsair.com/icue) there you should see the "Lighting Node PRO". + ## Use the Lighting Node PRO ![iCUE RGB Strip example](extra/images/iCUE.jpg) @@ -121,7 +152,7 @@ The Serial Number MAY only consist of HEX characters (0-9 and A-F). The DeviceID can be set with the `setDeviceID` function of `CorsairLightingFirmware`. ```C++ void setup() { - byte deviceId[4] = { 0x9A, 0xDA, 0xA7, 0x8E }; + DeviceID deviceId = { 0x9A, 0xDA, 0xA7, 0x8E }; firmware.setDeviceID(deviceId); ... } @@ -173,7 +204,7 @@ ledController.onUpdateHook(0, []() { The [Hardware Lighting mode](https://forum.corsair.com/v3/showthread.php?t=182874) can be configured in iCUE. It allows you the set lighting effects that will be active when iCUE **is not** running. This is the case when the PC is off, in sleep mode, booting or the user is logged out. -So if you want to have lighing effects in all these situations, use the Hardware Lighting mode. +So if you want to have lighting effects in all these situations, use the Hardware Lighting mode. If you don't want it, configure a static black color. # License diff --git a/examples/AdditionalFeatures/AdditionalFeatures.ino b/examples/AdditionalFeatures/AdditionalFeatures.ino index 77b8af60..191b934e 100644 --- a/examples/AdditionalFeatures/AdditionalFeatures.ino +++ b/examples/AdditionalFeatures/AdditionalFeatures.ino @@ -25,8 +25,10 @@ CRGB ledsChannel2[60]; // Define a custom SerialNumber for the device const char mySerialNumber[] PROGMEM = "202B6949A967"; -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); // Set the SerialNumber here CorsairLightingProtocolHID cHID(&cLP, mySerialNumber); diff --git a/examples/AmbientBacklight/AmbientBacklight.ino b/examples/AmbientBacklight/AmbientBacklight.ino index 93fedd65..bc31ecba 100644 --- a/examples/AmbientBacklight/AmbientBacklight.ino +++ b/examples/AmbientBacklight/AmbientBacklight.ino @@ -23,8 +23,10 @@ CRGB ledsChannel1[84]; CRGB ledsChannel2[105]; -CorsairLightingFirmware firmware = corsairLS100Firmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_SMART_LIGHTING_CONTROLLER, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/CommanderPRO/CommanderPRO.ino b/examples/CommanderPRO/CommanderPRO.ino index 9ebff631..f3429488 100644 --- a/examples/CommanderPRO/CommanderPRO.ino +++ b/examples/CommanderPRO/CommanderPRO.ino @@ -33,11 +33,12 @@ #define CHANNEL_LED_COUNT 96 -CorsairLightingFirmware firmware = corsairCommanderPROFirmware(); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_COMMANDER_PRO, &firmwareStorage); ThermistorTemperatureController temperatureController; -FastLEDController ledController(&temperatureController, true); -SimpleFanController fanController(&temperatureController, FAN_UPDATE_RATE, - EEPROM_ADDRESS + ledController.getEEPROMSize()); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); +SimpleFanController fanController(&temperatureController, FAN_UPDATE_RATE, EEPROM_ADDRESS + storage.getEEPROMSize()); CorsairLightingProtocolController cLP(&ledController, &temperatureController, &fanController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/DebugSketch/DebugSketch.ino b/examples/DebugSketch/DebugSketch.ino index 1a7281df..9cf56657 100644 --- a/examples/DebugSketch/DebugSketch.ino +++ b/examples/DebugSketch/DebugSketch.ino @@ -21,8 +21,10 @@ #define DATA_PIN_CHANNEL_1 2 #define DATA_PIN_CHANNEL_2 3 -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cLPS(&cLP); @@ -60,7 +62,7 @@ void loop() { void processCommand(String& cmd) { if (cmd == F("print DeviceID")) { - byte deviceId[4]; + DeviceID deviceId; firmware.getDeviceID(deviceId); CLP::printDeviceID(deviceId); Serial.println(); diff --git a/examples/DeviceIDTool/DeviceIDTool.ino b/examples/DeviceIDTool/DeviceIDTool.ino index 5d8aac87..0e9ac201 100644 --- a/examples/DeviceIDTool/DeviceIDTool.ino +++ b/examples/DeviceIDTool/DeviceIDTool.ino @@ -17,15 +17,15 @@ // UPLOAD THIS TO THE ARDUINO AND OPEN SERIAL MONITOR WITH BOUDRATE 115200 // #include -#include +#include -#define EEPROM_ADDRESS_DEVICE_ID 0 +CorsairLightingFirmwareStorageEEPROM firmwareStorage; void setup() { Serial.begin(115200); Serial.setTimeout(100); - uint8_t deviceID[4]; - EEPROM.get(EEPROM_ADDRESS_DEVICE_ID, deviceID); + DeviceID deviceID; + firmwareStorage.loadDeviceID(deviceID); while (!Serial) { ; // wait for serial port to connect. Needed for native USB @@ -47,12 +47,12 @@ void loop() { Serial.println(F("Do not forget the leading zeroes!")); Serial.println(); } else { - uint8_t newDeviceID[4]; + DeviceID newDeviceID; - newDeviceID[0] = strtol(&inputString[0], nullptr, 16); - newDeviceID[1] = strtol(&inputString[3], nullptr, 16); - newDeviceID[2] = strtol(&inputString[6], nullptr, 16); - newDeviceID[3] = strtol(&inputString[9], nullptr, 16); + newDeviceID.data[0] = strtol(&inputString[0], nullptr, 16); + newDeviceID.data[1] = strtol(&inputString[3], nullptr, 16); + newDeviceID.data[2] = strtol(&inputString[6], nullptr, 16); + newDeviceID.data[3] = strtol(&inputString[9], nullptr, 16); Serial.println(F("Set DeviceID to: ")); CLP::printDeviceID(newDeviceID); Serial.println(); @@ -66,7 +66,7 @@ void loop() { F("This is a special DeviceID, it will reset the device and then generate a new DeviceID!")); } Serial.println(); - EEPROM.put(EEPROM_ADDRESS_DEVICE_ID, newDeviceID); + firmwareStorage.saveDeviceID(newDeviceID); } } } \ No newline at end of file diff --git a/examples/HoodLoader2UnoMegaController/HoodLoader2UnoMegaController.ino b/examples/HoodLoader2UnoMegaController/HoodLoader2UnoMegaController.ino index a3331fe3..cbbb0b00 100644 --- a/examples/HoodLoader2UnoMegaController/HoodLoader2UnoMegaController.ino +++ b/examples/HoodLoader2UnoMegaController/HoodLoader2UnoMegaController.ino @@ -23,8 +23,10 @@ #define DATA_PIN_CHANNEL_1 2 #define DATA_PIN_CHANNEL_2 3 -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolSerial cLPS(&cLP); diff --git a/examples/LS100/LS100.ino b/examples/LS100/LS100.ino index 415f22c8..c4444408 100644 --- a/examples/LS100/LS100.ino +++ b/examples/LS100/LS100.ino @@ -26,8 +26,10 @@ CRGB ledsChannel1[135]; CRGB ledsChannel2[54]; -CorsairLightingFirmware firmware = corsairLS100Firmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_SMART_LIGHTING_CONTROLLER, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/LT100/LT100.ino b/examples/LT100/LT100.ino index bcb04981..81235090 100644 --- a/examples/LT100/LT100.ino +++ b/examples/LT100/LT100.ino @@ -20,8 +20,10 @@ CRGB ledsChannel1[108]; -CorsairLightingFirmware firmware = corsairLT100Firmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_SMART_LIGHTING_TOWERS, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/LightingNodeCORE/LightingNodeCORE.ino b/examples/LightingNodeCORE/LightingNodeCORE.ino index 04e3f888..0dd5bb64 100644 --- a/examples/LightingNodeCORE/LightingNodeCORE.ino +++ b/examples/LightingNodeCORE/LightingNodeCORE.ino @@ -20,8 +20,10 @@ CRGB ledsChannel1[204]; -CorsairLightingFirmware firmware = corsairLightingNodeCOREFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_CORE, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/LightingNodePRO/LightingNodePRO.ino b/examples/LightingNodePRO/LightingNodePRO.ino index 040f49f3..6891b88b 100644 --- a/examples/LightingNodePRO/LightingNodePRO.ino +++ b/examples/LightingNodePRO/LightingNodePRO.ino @@ -22,8 +22,10 @@ CRGB ledsChannel1[96]; CRGB ledsChannel2[96]; -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/MultipleFans/MultipleFans.ino b/examples/MultipleFans/MultipleFans.ino index f06dba51..1e1132ec 100644 --- a/examples/MultipleFans/MultipleFans.ino +++ b/examples/MultipleFans/MultipleFans.ino @@ -29,8 +29,10 @@ CRGB ledsChannel1[96]; CRGB ledsChannel2[96]; -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/NoEEPROM/NoEEPROM.ino b/examples/NoEEPROM/NoEEPROM.ino new file mode 100644 index 00000000..1135392b --- /dev/null +++ b/examples/NoEEPROM/NoEEPROM.ino @@ -0,0 +1,45 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#include +#include + +#define DATA_PIN_CHANNEL_1 2 +#define DATA_PIN_CHANNEL_2 3 + +CRGB ledsChannel1[96]; +CRGB ledsChannel2[96]; + +DeviceID deviceID = {0x9A, 0xDA, 0xA7, 0x8E}; +CorsairLightingFirmwareStorageStatic firmwareStorage(deviceID); +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDController ledController(nullptr); +CorsairLightingProtocolController cLP(&ledController, &firmware); +CorsairLightingProtocolHID cHID(&cLP); + +void setup() { + FastLED.addLeds(ledsChannel1, 96); + FastLED.addLeds(ledsChannel2, 96); + ledController.addLEDs(0, ledsChannel1, 96); + ledController.addLEDs(1, ledsChannel2, 96); +} + +void loop() { + cHID.update(); + + if (ledController.updateLEDs()) { + FastLED.show(); + } +} diff --git a/examples/NonAddressable/NonAddressable.ino b/examples/NonAddressable/NonAddressable.ino index 0c960c6c..17c0466f 100644 --- a/examples/NonAddressable/NonAddressable.ino +++ b/examples/NonAddressable/NonAddressable.ino @@ -22,8 +22,10 @@ #define GREEN_PIN 5 #define BLUE_PIN 6 -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/RepeatAndScale/RepeatAndScale.ino b/examples/RepeatAndScale/RepeatAndScale.ino index c227b642..5814bed8 100644 --- a/examples/RepeatAndScale/RepeatAndScale.ino +++ b/examples/RepeatAndScale/RepeatAndScale.ino @@ -22,8 +22,10 @@ CRGB ledsChannel1[100]; CRGB ledsChannel2[144]; -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/SingleStripLightingNodePRO/SingleStripLightingNodePRO.ino b/examples/SingleStripLightingNodePRO/SingleStripLightingNodePRO.ino index 94a3086b..15fc8ef9 100644 --- a/examples/SingleStripLightingNodePRO/SingleStripLightingNodePRO.ino +++ b/examples/SingleStripLightingNodePRO/SingleStripLightingNodePRO.ino @@ -27,8 +27,10 @@ // In this example we use only one pin where both channel are connected in series. #define DATA_PIN 2 -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/TinyUSB/TinyUSB.ino b/examples/TinyUSB/TinyUSB.ino new file mode 100644 index 00000000..556dccc5 --- /dev/null +++ b/examples/TinyUSB/TinyUSB.ino @@ -0,0 +1,48 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#include +#include + +#define DATA_PIN_CHANNEL_1 2 +#define DATA_PIN_CHANNEL_2 3 + +CRGB ledsChannel1[96]; +CRGB ledsChannel2[96]; + +// Most ARM devices do not contain an EEPROM; we will use static storage for the Device ID +DeviceID deviceID = {0x9A, 0xDA, 0xA7, 0x8E}; +CorsairLightingFirmwareStorageStatic firmwareStorage(deviceID); +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDController ledController(nullptr); +CorsairLightingProtocolController cLP(&ledController, &firmware); +CorsairLightingProtocolTinyUSBHID cHID(&cLP); + +void setup() { + cHID.setup(); + + FastLED.addLeds(ledsChannel1, 96); + FastLED.addLeds(ledsChannel2, 96); + ledController.addLEDs(0, ledsChannel1, 96); + ledController.addLEDs(1, ledsChannel2, 96); +} + +void loop() { + cHID.update(); + + if (ledController.updateLEDs()) { + FastLED.show(); + } +} diff --git a/examples/TransformLLFansFormatToStrip/TransformLLFansFormatToStrip.ino b/examples/TransformLLFansFormatToStrip/TransformLLFansFormatToStrip.ino index 2f284b0b..49e7851b 100644 --- a/examples/TransformLLFansFormatToStrip/TransformLLFansFormatToStrip.ino +++ b/examples/TransformLLFansFormatToStrip/TransformLLFansFormatToStrip.ino @@ -22,8 +22,10 @@ CRGB ledsChannel1[96]; CRGB ledsChannel2[60]; -CorsairLightingFirmware firmware = corsairLightingNodePROFirmware(); -FastLEDController ledController(true); +CorsairLightingFirmwareStorageEEPROM firmwareStorage; +CorsairLightingFirmware firmware(CORSAIR_LIGHTING_NODE_PRO, &firmwareStorage); +FastLEDControllerStorageEEPROM storage; +FastLEDController ledController(&storage); CorsairLightingProtocolController cLP(&ledController, &firmware); CorsairLightingProtocolHID cHID(&cLP); diff --git a/examples/UnitTests/UnitTests.ino b/examples/UnitTests/UnitTests.ino index 463b7768..096386aa 100644 --- a/examples/UnitTests/UnitTests.ino +++ b/examples/UnitTests/UnitTests.ino @@ -37,7 +37,7 @@ protected: test(getLEDs) { CRGB leds[10]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); ledController.addLEDs(0, leds, 10); assertEqual(ledController.getLEDs(0), leds); assertEqual(ledController.getLEDs(1), nullptr); @@ -45,7 +45,7 @@ test(getLEDs) { testF(FastLEDControllerTest, simpleScaleUp) { CRGB leds[20]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 20, CRGB::Black); ledController.addLEDs(0, leds, 10); @@ -57,7 +57,7 @@ testF(FastLEDControllerTest, simpleScaleUp) { testF(FastLEDControllerTest, simpleScaleDown) { CRGB leds[20]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 20, CRGB::Black); ledController.addLEDs(0, leds, 20); @@ -70,7 +70,7 @@ testF(FastLEDControllerTest, simpleScaleDown) { testF(FastLEDControllerTest, simpleScaleDownBoundaries) { CRGB leds[20]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 20, CRGB::Black); ledController.addLEDs(0, leds, 20); @@ -85,7 +85,7 @@ testF(FastLEDControllerTest, simpleScaleDownBoundaries) { testF(FastLEDControllerTest, simpleScaleIdentity) { CRGB leds[20]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 20, CRGB::Black); ledController.addLEDs(0, leds, 10); @@ -98,7 +98,7 @@ testF(FastLEDControllerTest, simpleScaleIdentity) { testF(FastLEDControllerTest, scaleLongStrip) { CRGB leds[41]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 41, CRGB::Black); ledController.addLEDs(0, leds, 27); @@ -110,7 +110,7 @@ testF(FastLEDControllerTest, scaleLongStrip) { testF(FastLEDControllerTest, LT100) { CRGB leds[30]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 30, CRGB::Black); ledController.addLEDs(0, leds, 30); @@ -125,7 +125,7 @@ testF(FastLEDControllerTest, LT100) { testF(FastLEDControllerTest, singleSegmentScaleUp) { CRGB leds[20]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 20, CRGB::Black); ledController.addLEDs(0, leds, 10); @@ -138,7 +138,7 @@ testF(FastLEDControllerTest, singleSegmentScaleUp) { testF(FastLEDControllerTest, multiScaleUp) { CRGB leds[30]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 30, CRGB::Black); ledController.addLEDs(0, leds, 10); @@ -152,7 +152,7 @@ testF(FastLEDControllerTest, multiScaleUp) { testF(FastLEDControllerTest, multiScaleDown) { CRGB leds[30]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 30, CRGB::Black); ledController.addLEDs(0, leds, 30); @@ -166,7 +166,7 @@ testF(FastLEDControllerTest, multiScaleDown) { testF(FastLEDControllerTest, singleSegmentScaleDown) { CRGB leds[20]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 20, CRGB::Black); ledController.addLEDs(0, leds, 20); @@ -180,7 +180,7 @@ testF(FastLEDControllerTest, singleSegmentScaleDown) { testF(FastLEDControllerTest, SegmentScaleOverlap) { CRGB leds[15]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 15, CRGB::Black); ledController.addLEDs(0, leds, 15); @@ -194,7 +194,7 @@ testF(FastLEDControllerTest, SegmentScaleOverlap) { testF(FastLEDControllerTest, SegmentScaleOverlapInverted) { CRGB leds[15]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 15, CRGB::Black); ledController.addLEDs(0, leds, 15); @@ -208,7 +208,7 @@ testF(FastLEDControllerTest, SegmentScaleOverlapInverted) { testF(FastLEDControllerTest, SegmentScaleMix) { CRGB leds[30]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 30, CRGB::Black); ledController.addLEDs(0, leds, 30); @@ -225,7 +225,7 @@ testF(FastLEDControllerTest, SegmentScaleMix) { testF(FastLEDControllerTest, SegmentScaleMixInverted) { CRGB leds[30]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 30, CRGB::Black); ledController.addLEDs(0, leds, 25); @@ -242,7 +242,7 @@ testF(FastLEDControllerTest, SegmentScaleMixInverted) { testF(FastLEDControllerTest, SegmentScaleMonitor) { CRGB leds[130]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 130, CRGB::Black); ledController.addLEDs(0, leds, 84); @@ -261,7 +261,7 @@ testF(FastLEDControllerTest, SegmentScaleMonitor) { testF(FastLEDControllerTest, SegmentScaleLongStrip) { CRGB leds[41]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 41, CRGB::Black); ledController.addLEDs(0, leds, 27); diff --git a/examples/UnitTests2/UnitTests2.ino b/examples/UnitTests2/UnitTests2.ino index 76c683e6..6dd35c77 100644 --- a/examples/UnitTests2/UnitTests2.ino +++ b/examples/UnitTests2/UnitTests2.ino @@ -38,7 +38,7 @@ protected: class TestFastLEDController : public FastLEDController { public: - TestFastLEDController() : FastLEDController(false) { + TestFastLEDController() : FastLEDController(nullptr) { } void setLastUpdate(unsigned long time) { @@ -55,7 +55,7 @@ public: test(getLEDs) { CRGB leds[10]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); ledController.addLEDs(0, leds, 10); assertEqual(ledController.getLEDs(0), leds); assertEqual(ledController.getLEDs(1), nullptr); @@ -63,7 +63,7 @@ test(getLEDs) { testF(FastLEDControllerTest, simpleScaleUp) { CRGB leds[20]; - FastLEDController ledController(false); + FastLEDController ledController(nullptr); fill_solid(leds, 20, CRGB::Black); ledController.addLEDs(0, leds, 20); diff --git a/extra/images/board-wiring-pico.jpg b/extra/images/board-wiring-pico.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a89eeb499cdf3ca9a3847bb9c2fcbc7b14775d7 GIT binary patch literal 99100 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⁡#)-4h$T*2VPeW@<GISD;h~$wY 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�zP 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 literal 0 HcmV?d00001 diff --git a/extra/images/select-board-pico.png b/extra/images/select-board-pico.png new file mode 100644 index 0000000000000000000000000000000000000000..cd7074e35bc873138739fd1a3a2e15fd77ab35cf GIT binary patch literal 182319 zcmaI7Wmw$Y_CDN}7A;VqK=BqY?k+9G-QC^Y2Ps~P7I$|W+}#HE!F|v{2X|h6=XrY0 z|I_;+$+eT6eI+Z)?t86-%FBwOBI6^!di4rbLR?t!)vLDxuU@_GL4y~1?V!QXEw+4jlOjVzd}HWF>Y8mB_G=~R_lgcRax0E{QI@!yo7>#g%F^X% z8UWYz>m+(r#@anmQ=#cj8n0PLx|!KdQVg;X;+Mb=|JgkY?Ob&HKSLhOn}066oa^mK zcq{PlJRw9FkirlB?`=X4R!2^b)Bg5JUzeQl>MT&u!jjcVCC<~VWs6nP@onAisQ)|l zR|l{SULXM%+v#~`KYX=1!k#Z!;!!TF_(zLs>Cj`jmZRg5WDijOlDP~zec8`BODfGYo1YkU=a(k5uIhnM^%v zYnc&}PKQyNA{!hdKtRUHCg;^5Wo3jPaJ8>tcyk{WFqD2p3?lSKGO8Dw(n6D7zb7!i z>aD$4T%~v<*ar{wnJ~)jT<1S6QLd~+wku83wjjv>QtDN}-mGR$umh$*vl;c2a)e+B-lW0lx1>cE$17-~qu?aCWZghr;15elj*@x~@} zr75=I;W}H7v$*L7*rn{&9&`CB6{6P@w28!&Y@oB>=u05M+3xG--QFk7 z*E@cFw_PnGU+IFS_1gs$@5L}sTeTh;{ior0WU6CGxK2gK{7JH(=&5WGM@=f}-jO8t zG2JNqW{POtCEnOV96Nf%vkqQf zBRRYKXU*qfT0(`%-bu#M0&~X6f}0^buJU`gi=?>E$piU|14d0wd%+j0I_)i0@RUkq zcadKy|3KdgTi?qO`Y!XQaf|w{N!Z?$Akp8C$sB$BtC3HJfVTqe8twiC+}z6!?ovkk zxd{ae3))L%UmI$zyWnh=?3L?E!q*y;MQ(ZWDt-N^g{6?Et)k!KvRX~amC;UFA?-Xr zybGHx+c~(-fCMFm=sT0oR|VRMM&(nNsl|1w21k98BQ_v(McHx8=P;<(tkQHz(kG?$ z5}Vky7PCy8+J+JoWj)EH(3b>}NZa&|napJj4AlYlpY&M_s?;l!rs?lj0^LSTF0KVK zo}X|;`PMS0KGxM437Fj_pn9#G(EDU`^v&0sEL*jnc1yKhbl_P>YE&-S^k0D?AXcjg z2dp^Eov5^tnAYfKitjtp`2CiU1Pb-j;axiIh77wkfa*#nP&_|Hl__3L&og;W*C!M= zME3g%v<9Ep-_J_N*KyF!ak~W;P&1pQB=>TCuOGOuhqj6X>f(q6B5xm2ny%QBUTJ| z5@k}qhKk(Y^coF1&lev$R#j&GEKMN{Ua~M#u+_aAfx~57>=Xkocimii(hu<_>ULva zdv!MlCI;E*4K&$R1P`zf1MYMRj>TPC22%N>6IXA;kGR}WJmdaMD8x85LVs~YOP z1#sL>6YtIl=qVc480x@KIa^s|S9FQ8keGIwcJ~AeYSsF11OR&~?OGMbzFdiNy2pKc zb)JCmsEXz|DZA%r_E2e@HeZZgKGtcjfL0`J!19rFB*l#6PmRpw@#4qe{Hu7#PTs1U zlg+_h;O`%Mxo&fn61>P}bjBlSZKkH1-6U1)7DZ!pxl;}o&xe{&o8kPt!&)Y&(*hfP zUCAa*#$a$;BpK#kbw(?9G~Y52DSUW-QAhwq7Bo4>eVcS zixC-_0vQ7r7-JWH4@3HF!=0E7#{FDzS4W6A*Se`<3yosh~SNx=~C~wUl>L5AX9gHUP**|b$gRWhs7CA{pCz)!n@&#YbumQ=Z?WfK{(2G$qggD z90*n}2_R~H;qm6Iy=C8Nm(1%*g5-DRUE0E3ZQJkT^QCIG_UJA-!m)Jv(WDt%mgZql ztA|Z93dlCcB!F1bHIdcc);+STROx`sGaZCm|GDZhY7gVTQVn(VLvH{JRTuqYUaEKS z=z*V6ia2*`aot?-KxwRo89Y=wV9C|m4KKI8aXlR9vshHS4ugyDJgS>$QmUJ=RMjEO zhK*1J98`q77Tn|Js%Q0@R>aSAOuHjwd4m9})_E@tB~|8jZBL`DdFOVSDZ|1=JZxpd ze0eiCZ;gywa~Xd9D^Mj@n~3*m1m>=F$#F$g>3`kyv@)AE-#y+8KG1oBJVY8(F(cf@Q?P#zlaIl<~X-QnhyiY7d5=t z_jp#VlbVD7?7q)c6SXQ)l_mN7HV zq>(J$vNZOP25&@H!F5N0^;U$yes2}Wgu8{sWcYm~o;#Tyv@=j-8+(EMDd!1Q&H>hq z>_KTb)3^?T_HM zS-$^DEXH^_uqPqqME_aq8~t;$gKx;=*Xd#@gcI;OGM=KwnX?7ztLC0WQI zj-caOu3k;?Xk9Hwuums;w+APu|bU>?ww*||yWcY;E29X_j({#Tb4t`NPn=S$v=*Yo>a66tsdUFpnN6dTmu@Q!28WK0H}+L!MpiB+YP{SZ4C&sl zH!NX^R%?*k`cy}oJx#cb6*3*PWZLa;$tUpiq`=2B30JvY3h=O)-dLU>ZTnL0I44y( z0!Z~kLHUJEHPi|}*X7b7oz)*J!@LieyTyy-F8Pw3gK2bvXD8T)^n8$QYk*TI(3(^r zLtsdwKn2Q$K3P+_3~zo+Y!h_w_N`Ycs>q+t)jNO0b{gQ&vR9W@2AHz~y{>-3;8WYe zR)mE?m` z*=aFkUo07Hw&PtC87aE-_8*H~m zoFn=}tVi~DjbFZbYll-=0YqR&M>LIzA5#54wrpq$jMg&IY$kp^iMqm%22F*xdUv7dvk+VgEZHM$!NxB(*}60A z#gf3RqQ*WT5>=f76+{HNTg{P9r}U~R|K!gljTD^cLjPz>(LgONWKv$!&_XL;XNgnN zrl(7tS+2kcZspkYBPv__n7?DdURmfy(#YkJI;TV^D+0$-I-8xNM4?w1Z!XHNe1;&$ zBIICzG>)rm6yT{5Ely6o+K#U`{~LVVEgEP~E;*7RaY++j`SfQ!XowSo zrW@BK`pBgqxb`rJAtM8l%k}ak==<)+LIbuF8x#$bM!HlR-vn{Lx|$**P*`6 z;&7`dM&-Y-k*oH~ysO>8lOF2a6iBS5E!t2szJ4$BL67ryNJUe?hL#Enw;P7rbq1yaKd)t|nt_do;b ze=rn+a!HJy9~DT|x&32-O+gN&0sE+5Ylw?w=QwBc=B^m_mwJCBa%Mkk;|c#&_Dx`e zSk0mm!JQ9l5Dbfo)proNq6{TLbmbG1D-9&MpSABfKlD#i@MtUA+b=(4*E)jI&Hj;p|-BwI;v3a<=U|N;Qg#Cwruh z5yH{b29+MyM|sh)v_W8|fcWEYRY*CbY`kjUP%*_)tN{0D!K~D^%7~<$GTj&*3+r-m zb&1_Vx-6NPj^~0dAt1lv3)OI#QNuCiRk-9<5ir_+UBS1zc)R=ekQ$3Q$a2#=FQ= z&5AMxFM*8en^m~!wFUHvWL-%3u&qaYuN^d%nG`yXbm-V4ml0HcMa!)~UfsM=*z6*O zIAu5U^XzT7c2x?Ln{SO|C6D%M*p(I9f@g{=Xey7>W6kxQrl(BueWDnP@~`&iW{!>h zkVENPoxG{=x#rgk0p*O+ZA}%kEIEXEcuD)H4Q!@ zbU2jE(6_dYZtq>iN?=5TI%5xYODYE~m~v>TeeZBDcSV22M8GjT?7>ubhyACSN^8Bv%+{#=k+?t%^4_{l%BjTsrTx<(p3OmW+)=)W`tcEolfQob z%abgKd(U5o*8cs{mqp>&s>Qavw?Q>J=A%#WlTn<56^XRc>L5rFW1y=Gq{O<~(e z^cWZx&=*W=hjGF`AM4bT4r;>H>2q4!OXf{D?OGCpJvQv-N0z$7$7WQ>g=TmwF&Cd7 z=JTWFVB}ba1`Y=?Uya3lKVd}v1nwC&0?m=$=Ui(j7P%!=a`Trx!gv{c*R_rx9m&nq zSpV=I(Tj%HY_9MGf6qkQ^lj20#Ci1RZVnLBju+WZMK&DST1?$J?=Jxr=cws`oWP;F z-Cdu-Q70q(oavT?;PPuMi2lWsEC#R!SDaf2ao2ed!xt)COno7f;JPiK$=q#>yo!)}!_X48b(G%bgnW67Q<6 z`Yb^;w(qakoWJg-`@Y82b^o%P?!@DUM%`)ZR08Mdu^Ta2E65jO5CG3|8aCO;V#eas z?HO-!i)V+GT%ry11|?rA9Yp!S@E19NsY`hh09%kmTTnhf&F9wCLlSh{1skur} zV!Eff&OGCFXAAxAS(>-Gn6Oj2p5t(%87>d`V-z61{OOA@UE!OI8&@Hx1XiUL;BVdd zki|r0sZO1sk}@*4kUPT&I}QnD8@tshwb%9LKI9M|b zA&mRF4kJzLlv=Hodz!0TrIhjrn%PNq%_pSiEhEQ2Se}?6%ihLX!JxTq5m)4?qFLpS zdgr83A_9bC2~Fq6mrj!Q&B_K=|DLN5lePYOYoNm5Qp|y%-e5ByE6k|@5#M5;_Lf2z#A;UKZCqVvt-PWcqH`LcnPOC7Dkh+Q)PeTn$i zkAJhG-Y=D6>tqFs%?i0@Jq)43apL4LmLsL2-sG4Zkz}Rl<7u~eR3y)Y=Uzb{w`6v@ z4pt3MrW1}a(Xne>AezXo)&@Pnm)5HpK+O{~*a|I0+DZip?IT5?sdw*Wly$$ML|rr% zO;7Z3dlq+^dm@9;ga5ma@WY8NZU>Zn-T7|M!rz}bTtD98O&oaCXV|kI%?S7!ymA|! zZDl@_>K?zyyRO_<=DRnEyj+pGzVFbNQFt9@>J2I#_YQ*@s@ZXb;}6akX*#8iMK@%% z>?`(*`hOhp$=q!p?J?!RKn;ob6q*n&h7=+h0y@+q#UWMjj9^COfcEj5JrAsi3HF4y z3Z2z6Y~^d+Pn|UZivECu+Q(BovhJ`SG}p;|L6W*W_l7hbmpEd@+YyFei1mI@ znoMfR_A}v0(Q=#-Pi;?b3(q{O#nL_-G*2(xa|PYu*p5AkSVwLri9rq0bc}O#PpRhO zlL#OG>3qs1&9R?54KSO$d^%u7M-vR+05q^KW!ztdQEU3XiuKt8HPI{LnXqvsurAIr z3qUM}SsBxM&%_wEtNrfNCF3pWBeT01uN@wW%^VgTh;F7H_@?30qb%=~c5jXeE5r

n7o((5LbF}SUIz54XD(PfVg2|SiH1GQq9uZyAZLWRg;)Fl8j*jmJ&Z;05iiHIt zueXlJ@Hs=3iFtS5R`9m*V(Zau{K3lBM__9c*`GJwzj1)U>tdE!EO&Br)@`1TGiqMpq+fQ{IHQjc%`fVXj zeOQ@hD@8T#_cO8FPl3l?8CJOxM>P7?)6M7HYy%u}k#%Z|iWE zG?fL)#-t8x&H0g5{C9;vl>9G%vl#?3tectR7eF&UixLd=;jcP|{UNzK_w@P;oj&+d zAbCB!n@#B48kMKdeUMN5A%pHR>Ex|GVy}5L^WQSq=2|bC?J^gV7om_T)<-e=G8&dx z=|j8V$sa!ubZMHh3^;h#dS7@LUyjsKQ8s)L!;}9=ZgbpJGWf@t)^4_ORi)YYcN4FMX=*3_zk%(gj(N4@7d7=c zP*<9=OqL3KFq>^KjKgL(7uloPP~h4l+SrzyY-p|Yn_t{t2LKha$cv#NYvYRVFb@|Vu{onIFIp32&V{B`+h|o$@ zOJ!H!QHxY-cqn6iu&q3akzyqtGm&Z*q#YE#&?eBCoEOLhK0Ya5Z^IF_ln1<~X*(Q> zFV+GIupi9yAGzjp7QT7MLlP^=iiuX^(BnA^)R0=Ow<&gf%J@PAbtmF;;7Q*{efDj( z_MDgG`b4)9O_R9k+*GMf-(NyJzRJ)Y$}!LASSMGeB#d zw!2P$k`kDm1CPag9&-emmGxV4=Wkig{$u<_7iBagkD_sPrK(ldgP1vfui~!W-qJ(y zX_SkFhB<6zzRr5@p7ZVLpqP$`$CDA=Oz^8M)>?@LNn%U%V)f4KEWQ?uswwj2-eROBV)tVD9Z}(1cM3rS3+9)4AapHbbj^;T+Xb)!>brma4 ziFhBzbzhaOy~-zgBM&dAe9K?*09(`W`Eu2Fe7UK9PQ)p2#VzuO>yJ1;gZHWFn6-)w zzmqIs;8!Hkug}KGl}WMTw})Rx(up?%?{>W51z#*|cyD)~*B*zt1_1~XAz#lW|F}^( zd=Hz!t9zR4LPz??CH(qfanfM}{q~Jo80>k;U1Ft{+YoZRQPq(ZQVgHeKKi z&?IztyGQ)t9)+$bxMSrgyGJ42d^RT^wAo;9s&< z9Uk$DAa!Md)e*W@4Ft16<*@0aRWe_qGl$ZnWQ~P=NVP-pWv^e{c^0cd1GzefFEu0I z?fbQ{F_7&NHrrt-Y+XY%p@ zR(n*KqH6)=;?j5cHZL4hAQ#j5C~!d!@Pwr z%yKajI`uxu-;V}5&M~z!Jp9dyK|*H;flv8efq)U#W@MiMyzN@Y8%G6V7I!qY1KW=_Y zDnm20qCD$#BHO!~7GG`Kd?U-VFD%jBah)?ppH)RwMh2^?Mr$sz7$Ggz|V zo27N?Nl7nJrrk{G@gs#+PwJY4 z^u8B>F~(jadOnDTB^!nsWri9BKI~1kvS}nj13mD_az!qDH$6qeiN~xsU3NF4 za3GGN$)}4)&iqH@V?6ioBYC#jDgaJg*@4L`M#y&w8b@fCgZ`rh0IMS3*w>WpJ_w+^ z@sqr9Un4FI?OtRmCs1fzBea>9JNLY21ZDTU_nk`PdWwLy_hgf^t#&}E-eW@Ianqk; zGm;-YDTQYyJ~8jXNwsudiAs?I={4ir@v~xta+%|W5b{od+{ISNAHnl}dR+UbmKuk| z4gdVcbKvcOt!sYyzt_rm3G(0GvR2qm5a@-bC zJL?{x2=CaXR()K~RO^sDy#o%b*P0_~`TAh4?UI~={cS|;bLo^mwtG|~@B^CzZOtx? zl0jovUjsajhN*$!+9^EGi9T^&w*q=2Yr)e;q|oz;T96Xm0t^XMwE6M&^L^uLcuM=v zg*EMAx9e4*SyVk{vq{nRru^vkN6KjBZ3aXR$TaG(dZRvfUx)T+XG4d64MoV3V4C>2 z6mWeZ6PM{WI~R6)t+y69&l`K^hi7)*dKAaTJS*295O_RMu*|{{cO;@{q?J1e+pX`Q< zX&a6tG>}4 zZ0sUNw#?AAh%RSC&SquKjq7(zU<04p*yyjQ z(6z`f4i6rLIz85DnPn>p#}O$40A$%^-=_(g*%s-#~%)`q(FZUL+gNC%c>qet? zTAQgRvh$^gP(s`ezX`>c3U8|%CDjx^Ome$dmrSi+fI`a{yUY|3;uAV5zp)EZ?0tF4 z3=c6m5!Ab=EZdCvoE;-11pV~rG^~+NDMq~TUaGf4Y@&zl*uXjid4})FHCSLN)l;QZ zzH}7k#m7n0^{;WD#hjHZgHP?I$`)KPVno8iFRL#qaaRa_bl}V( ziuXd4%QdEx-d;9%#_v_{W#CLx$};;i-_xeb4ntt_ZLUW%6Dfk71`QBKSe4@~vX=mf zli4VX|M&c^xMHjq%6$~y=*_4vX4tUo@dW2hzPZ3IfL`<`NO1#xb_;!b`VWt_zG|Xb zwSI)yXtClq{0NaY|D+9tTv!|!xl(`rkSDN~Gd_2osXv09Q#0#_I$EGw#$#8>rutCZGX4$w zrhy8@pcl+DSgcEwDCs*Ld@0KPgf!xcy98?Mt8q$oxMb$Y@yVP_?IV$tzq~=Ij06PB znKm}1;2CLd|Eg)Z1X+?94 zEvG=pc3K!$hY6~S+|czMV&YFAfxv9Ko+- zI{djy;fZLs&I~e9nl`52xu>`2ZqW9g{Q0#%Hf{Z-w6>cPjZilJuT^AhuFDZtq>!Hef@*)>qDQVNAtiwgFZzgzUOr=9HamMweMceAxfF=g3Zh|%BhXoo-{p9s=^7%Go zH0mR7>lsXT4)X({#G}dORzH2ouqemB0Lg#Ti>(ZkEh$ane7){RssWGH=NrLPpwbXz zXnkRaWzA?PS!+6IF40#*7>gme%Pm!b$wVcdXau|4#bJ=V(=aMSf8*Sdz zn9@_qx3HSkmgV8+O#S-k8;8^ak{BGqlh$lR;wPmr1(s#_^%VcvCdVH#8Jrm`tLEGo zL93guw8y}U;8k46_GL(!ue8Q5fD#p@7yBG02r!ru@DSrh3J-(Q!K^9ov8$a&c}iw1 zzMDj4NPTTPAsMl4VD*K5Y(~5DuYA&|i~3go53z;NQ_&e>`BSY-Hyt7?u#iMvOGhL< z-|9fd+8$}UNDmq=pb$cCzVGJ{cC8RKfEc5 zt4oH4PSkOH_F73z1AH=?PZHK2N4pND!*j11jESjjiSpF&4XIw0+lyuzAlQ^+C|(nM zPDlRhlS%bvrB=iS%N=mXGcGIxu9r(TeoeRj1=I@eH`~+{>|V;d$j)svmef+lzAM#1 z*9*mn>{ofL!)xP^%tR04k(=vbVeWpM9xp0sfu)c43TFP>ao?L=d(a>Qeiac&R;;(_ zmg}26*M$g9F`YbIpwp=xFb`+YXhd9_Enm0)WcSUXWd(rhY0k4EPHyQn0owcA*D>8)5vmPvrF1y}tC@(iL)~yWr=E=>mhyNS6yrAUh3Tp@L_{Pm$4Rc&Q0^@R@uHELE(Yo^ji2F+x^>%o|4;D2j!4osvYM1H= zaisfMAqmTE{|aiR!8u)u|3^s$1w_=YCc2^!YNkrpO#8yVf;|ujFD9nG$9wY|{R0z! zJ<{UdO!V+xaX1ta7fdzl@Ro3z>q{RuS;GuXWs`HBbn>2^#g05Li*!p>Ed_$SC-#Hi z_&k1R*Cy*{JOiXcejtccSJzl9wDXrMXOu_r#VlSPl+OA~Y8};Zr`PgUlc_kP|8A>& z>zsnLVy+eumi|3Z6Ve&VSpcc55BiU?P~r$nV!=nEk+Iz5`;182bNJK&Aylzgs~6P>Aa zMKM6_Q1&@!CU%24ICgKlvOuO-v8@@yezGenQYW&YL~~6oS|mhBQd08UHN!2O^OGm$ zEPkD3Y<#jz8$9Z%dz&&)W!k;mW+fOk;{I>tL+DpW$4d}z+iT*J+zq0Z;=FRP&pl@b z$>;0x6MbRw#}F%ac}!V+dCx0Ans_?p<=9}y8LV_zJ{N)}u%}iI-9YBiH+)ae zthMKSHuysAnRM_=Z9>)gxh*XOIuhIaTZwqptBi}8C7=)7PSiAX#(h&JTf5sVzB_ce z2;u*@k^kdEpN8C~D>YT%eD?(cK6$qIgh}u|!bfV>6|I$E$Cn-oeo(ONS!D0M)KYzs zo8cF?X-XsNLA%S3lixptOiL^oMP_T(S>C6=S1!y4#8@v?b`3zHCc5xidcLm&Upkcd zrj}aOCehCn1LxA&1Y6@VdMCI4+j!l(rgd8supk{e4hpWba%(SeapSqkhJzD(p$}_t z=)(seuf(pesOhNn4-(4vZuwoWdga4>hQoZ8hM)ExN|ehbM>W}f&rzv8xyE9GP?Xvf zeC+JdT_VAz?7>4LDI5_VHKxpVSBDoJHA$JenXFEf1asv*`>v12bpO>22lJza6;fie z+s(e4-(lB0TO!k4h>1(-o}+s{pRgh*W9W1%qboDqa;@{e<)?R;pu7;n%x`e+YZ^9~ zTBf^_z_hB>-Vo8;-Jz3w;8#}K)Z8fEvAxNu3L{V(qorO*Zd8H9w5hsJZo}{Y30-qr z>zJoA3*h~KpsoLX_r|F}07(b?%ntnr?rOk8t=vxGYTL)9 zA%lJsyU>Qpy;kSjXKL?qJlzvJ2HiR?9R`xFG+eHkA=WnET z)073_1Y%4dZdSe{tzZeGOC|Fg!4o7ffKPg4@>_U`^5j9INi0EirD_CD&WA@X&G$J0 zv^>B|t63H!sIrlv5?Lmk`NRR4vrh{n&nTSEP`Xu>zUq=|VZ)x)RNIfC9hll=#Dn>U zW`9I_cfGt9&}5Y=Hd&ZFvyZhPnt*}iVd8t#W`57D;{c)LQ)U->SWiHcIk%uMZ_@bF zwIICjGcD~Ige$$$@eFbH4xR7Dpq|^|q>%5f1!)Ipy3uX&78CQ~Uy1+nO>Gmyb2gga z$g;n8rHml5x)_**@88dB3G)~ar2*I z5452SOOB;eyR^YTiBd#OdS9-e`l^?p4g;1b{<~M1s04#sgIKpasU&#(PN8>WWbYe~ zwFUI7KrXMUxQH&Olg}v_z1ott1pG;GQse1a5nv-ub~RtNx;@t&IRE;d=U0>!Ef#A= zsu%VN!b0qyZMKw)zNNqTWtD~s<`FWCD1r#jm82P8_Bnn&=UkuL7>fP_{al_8*#WN* zFn>)b3wRC=3}$;q;LoUfs1&JB4&*wk%UH;vJbEr%TFq6PKtz9^pDTGBQpr~%#Al#Q z?Y$cA$~%!@!;~oBW62-3apF>jDQ=^HuxiIg)@x`PvQ2wLJGc!FNU~27GirosIh6;k zyD*1#FAEtBVWhld2hL{0OAYdv?@R8j`?oLk!6vgNQ6VsdTrL(CY67DHt!pgwtHa@@ zfI9r?^6tbJ`O@tJc|0enRl@eGKNW*@_H(S7R{3Jnaj`w-PJ{QQacmBuO z-G0dp>}TH@(s$JNyntQ%aH+^~AsAakW5#9iHBnGl;{r0xcdf#V-gb>CGc`RL_$c6t zBZcT7zW^Rzy;UllaGAgjyc{oCJ3rU@kIDU7vv}^XDS$&p0&|To)kkno7cg7z$@|=0 zX;DTJ4PQvaCb8M_bv#^-R1u&D5d8}-DPtp`4cq7n30-<~UdNB3SmdCb>{mqPg3?brETC;ULRQ142Q z=q(L@@Xt(p@-o-QNPtsx5!mCK@QRrfQ*1Y<+1A zH?_duXvQTzii~6&|qD-L4H4(aB2L}MHGk4^ov!;_-w<4c=rp*mHcA&k&~^p63`nE&*QAZd0Qv0NjGl zpj!X!oEqNHuw4Y@rfb|j-rxTaHZ#TRdeNh8%Mv*@FHe#9*TnX7<}RRFv ztpz;4rbg-Z`Y|uq_o|*AciJrb98C5XD3LU01_Aj&!GTz*mYY=F1}WOpAw8i#CK;D+ zg?@61u8Eo!z11uFTIg0LOh=fb8B(w9G$V9J;sv z(N3pVm1GO|9x3sod=Azcb9B2P=VpGCY~SJa21K2KYbbCHH*X=Izv-$drR0?WkK4Ye zw6#=4bd8Tqz(JAv zseX$ip+ffT;)0Zzi$(mIm6jQTLvoT)oN^y_9}718^dol7URxqMOLE%K1#?~?CIlcb zWQuc1r{Zy4v|XDC}LbW#HXG_IALGsElfMdAn4A?$%)=&%L8o zO2>s=kzKWAXZYhc1x~KP3VepypZ^G_xhL=WGj#MFcU!O$Y-h5r(;O4aM?4wbpILwi ztn7}^rhXKo1R4o1@|#kQTHO*uUR!! zd?G{KMz%L4ksvAENVHbI-oa+=bn6wkdigHzh;ADF<`M}2oYNIoHDyT zxHD*XBxiwX_)Gtzd%c-M+B}1~bRm{sAF-b&>I!63ss7{#xI;nk7fsa^IH^lX;WH+j z)3-TcNT}`UeMm4;$FDb;7(gFr zJ2CV`e+>1+T@|@ph;jl4FrHm<>YaLZP~F(?(P7dkh{?L-2>Om3Kun`Ey}ttaF(JpU zyQg<@WH&qDRCimpMmhzdY$hZKtpt9LhkrJr1d=-#g&1WC`rk3uh;5nlH%t3|n${Mmw{wtVF+1mT78CwSEdTqpLA0Ag{OdtVA zWhLndo9pn@b!%Q}pNp0w&*pxoG1j3P>Xu`JO7+J)hNdn>;e*`(7}uo}E9ygNFV|t* zDjVnX$biDIMzuN7kzIQtq%=7+&b731ez2ZGo!5nLTCKvkZ)mi3?}-Urdx=EPnv!hU z37LeY@tT|Bbq)Lp)2OZD!M);(#OJVAEs~1uN3~Ce6txKTd5&64=Hb_GWu8AG!t@FN zjy5_Ck&I#9y(2jLuzyPj$^|8v?-M$#NQCZ!8bZW`yyl+}E!izR_jYb7xgC}+mz;l; z7<7aU8u#rxeo!-!)J#t@@*%=q7~DDAl$PVeM}0RV@X`$v;m&1#amS=V)TrFNk=4wS ziU42{XG$6CG6Wq|V_qPHH*|fHHchiduXmQBBA#s%9zwvSD=A}$7uzp-7Uq*?`k=6_ z>QU;16rUwmHP7EjWZLbs;;uNiE14M^j)e>#3f2ET=syhUPYK6(AFRwRZE_}8;`G=n z&2gxT^+&v9E~M|c*H+acFeju^FY?1PQNMhm1EkR&g5$4BP@Jjw4^Q&I?ZbNd{}FYT z0d1^X7d}-=acFTV#frOIDHQh-+$Fesu;NY%6t_}5I23m;UL?3XK?A`8gpYgAIrsaW zOlC4Ouk5v-wKtv?*529ZMu+m_H1eOl>xSyWfjLs>)Y+kJ z0Ut3JJxodgM1=j%0NlH}YWR!_IZCKJOm#4E>bP5z9(((*TjxI#$YcEp9#Q>Ihm4Hu z0{>6-b3Xoc+=ox}1i)JFU3DSx(!pN`=Yf9)QdD-q9osvdNdZY!gJm;QIXHw_?aoSQ zZlX*NTvuyfR}pz9?#RuqpTmAtQ~!9$A_6cTu|BOm={8+__=ori-EI?8bik7ldeeB^ z2`}}A?SMo)T535FLORme;$QEj%$#ZN#leq+o1rYERhmXzj^_=vhw*2zcRGqP(<`!To8sNs z@m)*pyn`c3zw^2e0o)%F}#}f_;lWqO(0J- zdF+=mYb$+%0nYq0;w9Vm9$pc#Ckns@hAIKB)5@D9+m`HJ;o5rR>idUPG!rgi&hP!k>ff$TAcO$81eR-ZO1O|6$??d_o~j)bGSzY5(;UvBXT273A%fT!9|nw<4X zC|??+4_X-A3_4MSTxq9{z;4gaN3dj^hreN&3s@LZ{u4RQWj%WLBonj+F59-t3_1cS zLjBvD3*M^fy)`6m2t;{$bdfY9uDcf*v08T@!#CU)W9rlk&7YFy^d{11)i~Ts*B{Mw z_fq3b_TqOQUT!$g!9h@On?a{Tn~03Ev8=@lQ-xWP3?a)|53Qz;!O*0IBgn`p`r{$d!pnK^YZbe_mPKaIyB9E#wU1w;@rLd zs$3`SY*diWU)FDWP>DJ{L6ihVXl%f8Oi{Yzei%#l65T>~Na zp|B3TI~4w1?sMl=!WHi`n=sY}JPJQ{3T0pLQ)uznsZi?0*1p>wzs0z*gh*6J;dIs8rkGN;472F@Z5 z=#SOAj^Sdx2E0+ynY^)bNsV?xn(K9q2SWeV#6laN`#7TW{?ynxQ4bbP;m->G86r$EW=C)@BmRH4ow$wCsW;R6u!1Nz0bVZiD`Q- z&N4@#7Ue5p#u{(|ysH>8_a0>-S&FtCxVa*|dq?^XH;zEL(?o_+;sbLOZ-x5QY>V~t zlq_F?iv#|hvV&E#mW6sBt4~H|E3>nz4a!KQBa(`Qgd}y8k4v%C3$;ODy;MbwwU{-U zv01+{q&n;9YQm^H^lTaGSE2=u6Aj-e-bq5!`DX-OuK%b@!5^fBOLbp2XzcTCx*}J_ z6UWSqZuV-vvpwk0U$_tC8IO$PF_i44M}%v0`CuNn_Lyh+V}w^8_PORIqyk$+!yx>^Vj2ygEwaX@z;;C2KtsQgR z%_XKZTjuajqJ^`yqjC6V83m+jTM`#88${z6ki|SBVmgxMe7-T(3O}yX0NlRTjJ3Gj z5l9xzev=6D!k03Wv&&6ty<1|>^i=kQfHG-kW7iWFSBsAPa%#O+w3`|Hx5CicB@NCh z(8gf>S4t`{L;Y^F=!*;RPS?@ZMl*^`gelg3lYv0|L4tlPyR@S6nWLB&fjB$*hCJa} zX90!I3W}9}%;@)zIB}O)9(fyW5|qR9F6&BuS3Vk)VdvxSJ?u4g-I| z3+V0;|LO>hkzZd{Fj}qgWzDspAYy^d0C{Nvi+bC?D|j&DEct-qY2T$x zU-qQBDz0H!tm&I;01aR(GGs{w3m^Z`JXz`Q$bvQn(<>pz+frxZ<432_z`4q8$mx=m zSX6ZVM%7}~Jh`@_P~*f`qK=!d7gsr5FI2|XyNI%P_7s`drP72gs@Lbma&{{ZKP|tE zwfd8fC2Eu*{Ztq(8!{z!9pu1U{;O@BZEShV%wOR5R_@7{$sKh{*i7W%Yj?rRk(Erh zIrEARCq}9x;t@GzA~qFCke~QhO-CGK(wi94@58JrqT|(27bjlPIEIt~PE)h@f@eJ{#08g{kJ3M-P#zmMz4AM8^?0P9VA*eswej0@-rJqF=kPV+}^UOq+KUg{l-o-1m$Bk+d}y#mh{8u*{G zW?)=YVGA5>CFz2LV@SpHzQ|eDF z**}yE?A#SGpPFo3*4Y`nHNAgN6}iI-pUaa5t*0(@m~+yY0*ce$Qj^BvfkV19l3tcs z4itV$-Yq$4uSv5~>=2}n6s{H0lqrM*Q)&`yf(J~#L?6SS<$lDYi?n~vS79k%h7VwV z87XaA{6JGG@9HkSPfMDPp26Cc*>%Ff;?Kn`)*K_XE2G1|V_lEa8m$M)>iToatUoDG zF_bA*pwX*xJb_c=Jq7elyxkx}UaHzt%U+PRs$ zcZbc`qz_~c@$H7SN(p?_gc1t-X#Q)|`Ec_1bcdL*U&a=c$%JED*gLQ-Mn^Tecm9R+ zdk|$k>By-y^u;s!&>Jm|vN~iwXvPtfZEJVijR9}(`+W}lOQFFoSFO%wzx>ZlRnMLe z>c+ffx&KefABWg0#iGR5lsI%us}H0Uckl3echB)6dZ+ZhjPRj#CG}`ih(?+nY@bbK zmP@Z$+561F?m|Fa8tMGD5R0DeyVWfVP zWqb-qq$~7dHrL@2+uv*3Rg=FZnF`u;aupCcrPqjlaCNni*z2pOTA(poa8ik}8ds1y z8Zeai?|^&o3NNeUvA%Jk>CAmtc$m3b{i4Tv2NZ)pry%9qs(iBfV_6UdnAO~cJ;t1*%3JM!^VSe z6!j73dq9m8i=vduZ?!ON(q1z>=(|~0DZ9Lrf|O0ro}RSWbb`#SNdM0e8{-sozP(KX zXHgm15vxuHeCN8o7CSCbOs_}3D85t=b&%IS$eG{e_G%~8D5dn*9SgDe*T}wQug!S< ziV9}}S8@mau}?3Jrh|WP;yCA*P|q%DhvQIr#k^3%h%0yXf^9!}K1(0lkVl*7{1X(1 zmt@bC_Kpy`t+Ji2*cdNhTZ1h5d#haf>v)gNs%(%F+0VvN%235lIqb?`ob-2pq7>LA&whXpASO;Pi`AB# zVI|TZ%^kZimS4q|N;jeuuJ+KV%m-b^o$t{ZIE=fW+g$DU&`5@p4(zWD%#m;x=hXvF zpwa0KD?`wej`5$dWURVUmd?BAoe z>s>|RiE%QWGrXBo*0(RKl35Z=sY#^N=KS&kCSSL3VXfMLZNS!;X6;QfZ3RsWn@7io z2`kWYTg{ZP0$zQCqI9KWnsXTagw(4+3ddfS%=1Z!ZoZ}z%!Z4-oGVcpgB7E;O6|rw zX7-Hm8*7&fhL{$d?i7iFa%HX!mSsc=nrp9G<74au=*EztkUP<2oz(Ns(UOUIhac^HqGMUm&`HAH z+KG{35H<|l>_^>`q-9sR4HhabAqN>^K&KMT9Z05zOgH>dTj<8IM6lO+y6uM#jO$@w zG1F-Wg3RozA!d=uax(jaSry0mM@p-4FP7h{!BWMnxPO$XWBqD5WhKMKx5K~H_hy@1 ztG)IU2IS__l`)7+9FUb9W9e`- zGf5}W0x$Vzl{YY#mdJ4Vh(#_ZoxE#5YW(6OL;e}7o6U<16Md3wQNvNv%M@c5OXJw@ zYv5ugi<zH`jk?JV*HWDT@YWsluCAvP7w)8Y^9W?)+rVcdFmQ zLx-^k)vg9BhIZ%PqQ$%fG?~#a8G@S$aB#n3W2S8$cl-MJC zHUU@DmB(tZTSm|O;sdQKLk7zl!9k~FLNR47llO$^_)!qY{+;e4miw1KdpGzLtIxIx zHctLSb9pWauq`!){(u5S{vl`Xbg*^6;F?S5)W&FO#m`xW9AZb?30IFjZ-Fw%dd0(X z)-mgbd()hn{)nWJf7(jA`rttUNEv$_u|)Z}B<4bYkMV(W?oxV#+Rr2~KVNCT`hFdA zLlbi^{YNsI0CD8qDnwo9*Fcvbi?6v)EP=BrupDtkB7wt7d6^<8_7?HyXCT-9AtuPG z1R;NQb5Caz@Mo?v{P6oVfE4m$Q0n{F1*3%>mA#L#@Mv1Awkd@9|tRL&+*hiyw@;W%VjgC^cj$j7SlG|q08*mT4D`6fwBkG_$@N67U)C%^&0 zH4!$NtrWIk*x_Q4_vq=Hl4jQp>9Z^JD3IT0-B_h3y!>)owtE8~$hk(fm|$j{QRIk$ z2-8rn@ZbN74?M())19huGlc8DWy+sb*PW@bA8E+-vH1o0!qCRci#D)sF>@k*!16Q~ z*MO9tZ{|WZcGd^+ZgDer-M~}rwtg|DBkI6}1LTh*db5A!xnhmLw02(gn{K?&^w+8S zO2pRo9kXc4D|qvzt*MC->FrSE3hXn8he2(N3xs%W zH9ASbc#ATQH2+&UIAbP57XzdD*?W*2{Te%XA3|-#Wf3sXLfB~360G^T-(EdbQU+Tu! z&`jy>Es+DxpNd{2&C93tQXM`)fS`Vnc&9J6c^iL{M_0JkBcceg)bOK@J5Xtgjoe)C z4jFJ6ABIlaIMZ0YL>v_N-8BplCCyf@`<8-Ht5oVL_B!+;E0`BjGN-rQHaSBo%50Y2|T#&d*Dj2W|*5J6aaue8g#n*MecUw=tkqVjDWIOzt;?Wn{*QB(#kU$uMqDqNYWBX9 z6G%n9i5qQ0oWxN!Ymv#{!92l<^T?Z{__}Z?5T~QJ2?~bSQD`~W5oQOAv1^YwZ!PCb zX|vsp8*kqjj9%P`ka{I!M(e*xJs|-$axDFAkR(&Jm8*%y`^a}ux%S6ym(`ImavpRJ ztZp;J{r82s=I1JruDR>?jyTe8hy&==|7mtVkR-gWDwQ5-Wgwe?PeAqIEAnDZxi9^V z-qbFC_L`U#S=kj@sk)#OJkyj9!YjjOz|Q#0TaeJ(EfIvbyrqT3oI>_RB&zSY(^MY! z>^2fsrbtN6#^4dH^Y)zt?HgKh1^xkzp8kCo6KKoEO-gIs!|L^nD4#Bkeedj0~0Va?$xTekD!();d;w;WoB`y!-~~P zW@;DI(!*GPb;@hTMVx?AJnp01U(ulC5y+*sy=KDtUtlBs7q*qGA}(d236m9CFcN2N zYW&Co$-gvPS6G+S^QgJA7lvZ80kP%WVn-@Tl(SX)b;DlX_j10c-R@hdiM@FypK?E- z1Blv4n#ZJ}uBJUrNFCA!y+PU4@M$Qzujh-xS(SHu5C-P}^!3TT0m_@ArvW{cyv}|} zC3ZfASYkQHl^#xeodXegGy+$LwSX1m%fJ01@ZI=TfrqCr)}4@3xo^S!R?f(z!|Owx zov^IAQToHdziNSF=3nyPo6`dbjCeO#=|+f=Y*&xlS&A!>?uWv|&a~V(PwBL?j+C@t zUL;f^AdEK0fY@zku+U1>RBINMpXM#l-jB)V3d%9^3B0Aei!*hMXNJOP5xI)rx+Ua4>6 zAvTxdlYYMo$ihsYbxLdoJowcaei~!)a-Q7L@{^T z)6;r?F3%U|o2a)+p)6q7*;~1~ld|69b%@kTC5YLqT2KYAumPDP%Uy4PcOswAx%=4? zUvw+zG#0$}%r<&!N+&H=&ej%18u?1DZdGr-ZwY+sd|;2mwN}(8b;#y+=X9vW&gEYR zO4dS+(6HkaafswFtlTGX_8`x%EnPXvkwIdWz9T_LCS}dDs_;1VCwAqv4&fC>`Q>v z#d~@-eF@DxKAvLr5e3i7t>_yu@_JgM)c_pP6OxaugPht$OP{Y~0%+Gg)VS=Q(|CTY z)ntY5fOqR}vrVlHpUQNP>)~XN7h#O>*n83nx@H%ihvIPBBvFMAj}BEj6wG!i@z||q z#}!UwI?sgLoj3Zsj&wjxOg3?F;Ag~1C8o~6s_jIw#_gi#6kxkgZbM|5@atWHL*>_6 z;GOaeN0Uxnve=9n+G+>R#2r?;yoq%l2+3BRun&imG7RYtx)aOx^W+HxDHZEfKjjwl z{wi^9HfKPR3T*3_y8;)D#UBZ9*;4qi`3K%y(kit3C25HpeB9nSDyj2k$vbD2ex`A^ zm|B%iF!Eqc9LlSb>-tQlx#$}{828nHGXSDeK4d78WHZs|@wO~kALS|IXn60>IMze@ z&0@kYX2=t*X6{i4R#^)+Nkpe((Vpg{&6A>FaN2!=S0S(u>OcJ5d2j)-)E-~V-EDB@ zzS%CiuCIEnK*m1<-jTG8Tt)AUf)gP)K5z)Hfq6V)8liu(W28!D)FzgV_C7` zf#^|yA^FX;(kL?ek~;>x52Hr^4O$`s@T{}%!)Y&YZi;fCfuMv4mPDkz{@aZ<520{+|JgNW`SdnZ#1kErYG@}yMRSp*GX$s#q<7%4L zIrrX&q%ECw2_u@$URU_~z1y{K%2y;f~FtE&)7+-!2 zo^t$oB1z=z6*trqXCnY3VVOOHy$u%Fyg@B3=Amhc!1=DG@4n%Lqs_I0m~~>uwpYk1 zH|noeb`oCuPnW-W_#|Y9w}kgD;mg~if;$lsxa>C}gNpT5w%C%@?WYdHwG`MF1bpd9 zgA*xB-N9ELdF{)Jp!{T0uCTy)JNiRqoE1!d>=ufQ?8B+d>GK?yog(I&!dq!&h{;dn zTStNhpO|djL96F_w^L2`g$Mh~S5GQz=Drr3&*DzCRqDftzhHie^+2@lSwSp4^9Rxf zCJU!Z^xa|Wjo8AWdM!E9_vE5k)pSW6!%D!gB1II$ZeRVMSzLwTaU_3#bZLcqFu2i^ z6ZZ`1r=p;i+9!?4!0LBu&s#=YU#T=ub2SJ~CcIuO@a^gtrrXsSL(!*JO+cMu#4b((-5byL?> z#&0VKV)PzA7T&u6-4L_190n4XR;Sl}WU8jEPAL z8rnwuH;9qiPnePDXD5;Dciha;VeYk&;rA9nl*TnJoUs9KTKYa8eL2}!BsyNJBAwR| zzLOHmBI13@oEs9&O-ZaQ^6T5N9wmLPfl*RXuoTPCy1niu)Vafnyofu8*VZMHej1FJ z{8TbTrg0%k2`05r>w8Zemk<$#j!WloVVt$ZpY$;3d0IErVXc%DP-=E#VFESazqD^w`?RV8+LWvE72$Vu`12#ecgye!lV5p?(qC=Q~+S z(yj_o=*Sk})kV6XnLP!dkyLy_d7cB7_)g59wwu;F=JWxIG#H4L5>DS%vFetk>(HBF z_vFt*;^u=GOLQ#-9YplIzQ+pxX8!P_N|kqoaAfT#NGxXK4jY&l85{b<4oK0arc^)Y z0VL8HEHj>TEr;|Qk&C84Mw5-lI>VcelT2T-{P8A)d!G=#DdL`w#hPE#nO+KpQ41!56RZSxO`e@j7 z(ELgU_rC~>!dai4Y>gH`s`u(^wk}dg3>ug%wQ6zW7}RGg;<)Kd-`L|!?v%OiZ2`z; z5W6cy1Dh`U>nu@1#Y?=fi$*5f&@YYWcQ^X0H=@4#24-lO78Y`x!vl9QhT7tN!ZS=>?E0*h75c-xPBwp}qvhWLQN{%6GEhW~5(e~6ceWwFK zv6#EfEl22$qlKOWM^eWzsvzGVNKEy2zmV$zq0>$oW31Kkkovci2iAcy zPOUlxMIdE5<~8{v5Fv3A@~1ks6T4k`#BR#EAa#{=Ad$xD$*l4->bRXufK|vO0b&jaZWLm zutS9QJ12q4HqsZt1&!J%49eQ~d8?|W=d%htWs@@o`uKcoWUYb1hy3v+!#|R1JLW&K zI@0SE2FMqcP1jTJ#%x0qqtlR6PV{WdwCTd&lQ6|X0nN_q@pcP;iT4-uSa5Lu?qJtM zNH|)+fS-H&Phc}!s?BomLd5c`A9aTwLUim|F(p%yTQ4^IPl-giMvA{60psg`#iwHT z7fdP^?@rDfgT#CeNo$VK^DOb@2zFp;b})ByCO^?#>E){?%b7|yZW(yEWC)__t$W$A z8b0TYS-))=O|Awq9ed$LFi1NNRQTSctY~#G4a2c#c}=lhTQy|LM)L-(y6$LjZJ?sy zCk>PvqM-11LD_DNbB3V$U3)RoLZl`xjeGN# zSniXZZ)xNysEm%eobBP1#GD+JgPHQkedo7mX()O3XR=evs|xe(D(Lsf(XV4uVY3JS z5kZS}g@7_IDSZ;~bEpzWLoKi7KW|dYKSh7^t`C00={QDnbY6GYi$wZK9T_g|D-#rK zK%NxJd^0z1oYMP#N22e2bCG%3{f5nfm?4HjWnL%|bCWqTUrT+&hgpS3su$Lqjk*3M zw7R)f`s$&^6cR`h(_0O(b)8pw4iI$r`D5n_L3ps+X&V@|-d!-VxsR8riMM|foA?wq zU{J^}PaYumDnn02AZmpCdJ_66!^gx;@0S}Q;GSelCz zL9igW|9j;OtqAf^-zJjyVC2z~g-0XpG%3fh4$nsg{A0@sNPhO(m-cM-?7o#EbGks3 zq@NuDO94J;YVHyyws;60+`YA$sevHv>)*?04D($^``wm47FWxZgC<#hoe0i0J`{qg zy6S#N6H4i>rQC{L6gEB&os`rM!F{0nw|i6gs`1U z_+R4h9tZ|6S(tr*%=m+Ugad0dl|~PY$9~j27wt8qiwt}A{Amf@hyUSDxZ!^spNl;m zS+yxJtIb6Ge^Iqw@d5v5R5#}VKa0oYrV}d2|6xNOkw&xy$2FST!TroBeM1%Ie>wMv zfWrHiVrAGk7KU5@x&oDWk}{aedIhef`grpwL@M%mrdd8JPyX*5Rk_yPe4Mp$cz)V-1L$!o z8KBR`O+7a~7N9H31##m}CkrW{9qeDe+w&SaZH72LgtM7Qoek&w*?;En+l0&YfUtS1 zJH>!zn(_t8&qW^P*512X<^tHh9}*ot`UQ9jv+doB-rT-o+xrn70M#}G?PARkrVYOk zN8IG)2*#G4+{csyRnpeNKl9GqVYb}hv-x^r8_rT;`0xD~IK2gLwPtkC8S&zd@`0Oy zDH<-$-_o4+*18uYGCfAr+(clq3%}Yk!G(^!8&w;Bx}G-JS4yBq3l4rGs@%$;i+uLV zUt8mTbgiXDZ=%_NABzf-TyIgcg4ODbg*iYC77pp+EbQ2`)-r6Es{I??sL#T zoTsD8LdXL;5UQ$hb{{(`;JyC#4gqEGMRbfetyD+RRj1k*GSb)D@XS{)9?g{{XJOGq zL&Kn^UBHI;h>*R7TY~K7HjK1>TWhEw%*!us*`cpYnMRgN48TRINH;|>!K#8Rk zVsAU}Fv4)s(Gye0sb4=WR=ccZ)t}-kwr?3WG6Fy=eBiRL&!5ta9+kINrw3?8GbOU= z&7Vn2N(e2Be6>7=$!ksqTEe3>#Bco)Ak~&rp;NoM>bt}W)?!hEc7RxQ3{4tQZM;1YApy;~^s_?SqQ>NJi%8N>BGJ6z3^dOXM znWrzJJ!z|xjxNoo_iHYc(TIMw`ZxfNa{LBw`UvJDl77BTOcU_Lnj;r* zZ-$Je%i>2f>|g#VTJqDe6_FE8c0X|)$ZJ}oRUkjx~7RbHW=d!KU{~n!oM#Xq& zsemO%JgXXm{~O2W`FaQR4E_o;WO36LedoT@5gy`Q>c9f)4XwOn98h@XXMF3G-%Ium zrx)&Iyd2r{i#dL&kjQV@U(p@wGlDF*N%;MlhWQCg?fEv*K$*m2BP=YT2dN_V*zHmj zB7!E}iz%Fbm!D?XvU);p6n^8-tB>!E-JQ$Q4vYWNEJ`GeP3J&tdult*cHt9XM}yI6 zWNNG5VH>91>Hb$Dxx1G;IPQ2yLX$p`Y&#xxx?xbs!9VVBmn1-riOa879ooRXH7e6| z5b57~dB?rvy)5d>!%J1f+)ZZbz82PgGIs@Lxp!KP&#s-W z6?DYAgxFAMg)g`wns0<0s07d(7Dsoisa!^NEaBJDj%R1JDo%sm%QwE&I4Q$}4Gj&u z?P{C}Wc_EC-<+#V-mtgveI?QBj2Dkz9B=wAY~*85Fb^JP?+DVOx9{7m=e*rqS(Ho=@fLW$v@S&f@;vzK= zK_(JuWk;csGm)%!+b-ELAZF?P!LWkpJFvbfVvK5Jl-*BStv7-6X>tVqxKLQO{p{4$ z@woQ>l&Emo^Jh=+Z5sNHjhC+-y>~~6_OCj#^ql~X{q}Ji9@<{F$@Q(glA@n8=udYT z@^p+iqO?}8!x%fTH_A^e3G|Sn<88v<-+G&{027B+<=nb<5$ZR)DLXlY0I*p!rPh=X z5@U1srb>u{wt;mwyw5*w-y;g-PqR<+zm=qZIp9-})4N26lY80mvaZafVmhL$`^?n7 z=wW+P=-fC-{SVFuGR_1O@rQ1ihFOd5hnF=JL=YvZzL^vbxBlBqt%1PLqwMk*?4ZgS&9zobc@9gSB_Z<$K>7gVQr`8dapeXry8M*sG#vO;t8=TD4!4Sv7 z(%O%nFsHQl=5qa`BKG#6OaWo7dGp4cUOvjsj%m?Nz}S>VBU-X zWpIw`2hN(%2PM&4UYT6~N)eo~rAe4`PZ(SWj3=hOhC)Tds?Fm`mW|EE}tUgU^;`j>0O~(&IE8rCCQ(wi1tKk$BclE ztiCV??{|!83@mDk`tjVL2s7s@n5t!$1eE_4IXk$~eZMp5^!#8Ss1a;KIwr=TMQT{} z_*J5YmK=}s_G)c^!%*~^UxJ#W-(snVZZ)G@`3Pm4*e;ADu3{-X(fsjA3nSscyH@jbJ zAh%7~=$<5Letm!Mz058m@;>^2axY@g=;vh2H+Lj7v-w7gzHiza{wh{kAeO%H1DzN; zD8i4KpkDT&MS+K070MCrAfk+Tbv~HHp@=C zE!b+Z^?*cG=Y`*s_Y?2>Z0N`V2Xqn_zi*%*jjZHAdyO0o6l=v!^gu;_xtLxl?{3|` zS`1@YBIicEP^O2v5@E%RsJ1b(xAGN*D|-2|bHdq=f7Ix&9rUNU{(5YTEXI0|>>`Hm za~jT1>#}Jt`;0ox`RM4wagCoSH?#U?gyL_H`TXt#JJJ@$&?P}4HYp`-F6{M)T_okj0 zTP~`rEEO}AA%omRIS>Ad8dBKJl9keEM>o5rR8j+YnPoIrG|F?9%&22Y-se2$yr_&X zlpiQWiGDkaeqaLZCJ@^EstEVHu&YOdas!0edd=ljI3VH&Ldg)%0{6*c`}=sUZe<;<)fexo7dT97 z`6+XK(ig`?>&|4;o0CEG&Z^(AlXmv`q2a3LnCTHs6$Qs4ret}D3t`^;e{80C#Iku~ z2DwSk)?zQvkrt`Zf9H8E1rUKa7mESw$?hyV&6)EUL>#t*O#RAf{l%dNvAM4UNK_2i zgifp=1zG{o1@hc%CzHgt{`6fjl@#Mu0MJ-eN4m|A&$IB+-a2!0FOD6YSbHrjesN%U zO0ofI&GzsWaT^Vki+Q0YEEGeNK!tbHtpy@N!T8GF++@!@%-6eQ;hQn?$M}3>#gC-} z+bhQ042^Q{(?AXtw+`^l5$KP;y&Uhx#+ub{YlDOsU$||(URM7Bzu#0CXW=JdE zQWa9HAp`ZU7!B)TS%@!RxO!5np;pDwuT*|2QkkW!+{s_n7p0!5t2^(7N}su{_~;km zwnUaTd(JTusj>?Og;U-IeN#(m^_uTRZ0n&jjM6Fug#-i1A<{5G9*t4?tX3kS>%VoX zSc=7lT3&Y9AH6c~3de9*cS|Gn22UHE_lb(0^Chah(L>TP2^m*Mk6D5lj8&>%w^!3 zMBAJuOXHaLH$?uKP1AEl+ZBdG<7P5krkC_}gqA%CO)=LOME-_4Wn80{$nR>H_wIOo z@xJ|FiZLQH`r7we4}Dx+^}Mdv4!!KYqAqNq(l!=1X`J@tlG2#FDFA=XapFD|Zo-5j z(xGOwr*Kn3<-0WMj^frGd%3Ix%qr6^w{|0a#lfg*OfpeD{k#x9$iXa%$V!IIp@SVLodQ)K`0@p?L+LKA9>&`q?NV88&xK)?rclEd$4rY@l1 z{PhDzKFGw$W33|Nnf~|zzeG2b;Ehhl-4%dBRn!wDIe!~4yqyNgAug7!+|-{A2gpS)tp zMD%WyX;f5jzbd(bSdPu_Tn0INckBU2-^`um3bQp9_NzO`zrt0T;-zJ%da4Z;oX%R% z4Q~#Gn0}J_FvV_s)DEID?LcG_9j6bR4rPpg<2|O1gU!X8HGAat$TghyO!_MF312My zGCsGpoYBnD%A2h2o3} z#j_1i_He?|L|b zP5l7r4aL#p@XP-jC<-ttG`|riL+wY^j{rRkMdKWGsM|iv(MI$V^s6Rrf00&Iz51YQ zo(>?G9Sf`b!gxt8SA?Y0RJ@B>ZwF=0=HjJcl_%d0pV*MpL-bg54hhbgk`QjjhwgIvACr5~#w9ROT6mDZ(%I zRLrO)-jHSY;_oIs_=6UM5Z2xiN*ieLN4a;(+e7oIJz{6_-R3|*r^5l(vt4VQc1#9Sy;K4FfF%)DgkGyhHB#*O?Q8MTMsPK5|M;R;)x&F>a@Q{ z2D^aDxJ*Mu0z3H$L&A-IZ>a(8QEW-M5S75#VQoFT0-Movjq-0wt;R1DX5N~qTMI$> z^5xzZ*?jLuCpzj3Pmxa>TSg_Y^&Tr~XL*?3km^zRanzGj{bj?N z(ZhLhu0)m5XA(Z!g%^o`y1fxCT=Fd`_p*<1aGb_`G+(_w`sdNXmwjOXE10m>UN0!B zuC^MIQ%#={`qN!uj#zWMykxjEZi3`EJ^<#8wO!t|Tc!kP5E>)Y8n=xE8M;oNL*icV z)QTAw`P1QmWS35IjXXt7dtW`4+@=+wQ~{O#^WMgF(4KO-`cNp_88EgLlwo1sigoJj z@~CxO7SVpfqgT$BuO*11=G^2?=4<_KHr%V245pGVyT9S_EDbv^biQ-kT-RUW3?Iel zuNj$2-Xt?G1hW8_EYGb#)>@FlhVMmJQpV$Fklz?D0~4r?*V^YzA0dQZE8uGFCaD-1 z)sF5p;e(6n_wQ#At(Zbed9CvEJRt(O&0~9({XZy^Cxr?+oM*%M$yN9APa>cW^3GiaHOlUgPaZx*b2MN4Otre@OCpXxCGZHW?%ynxk? zp9lAZhx@$2wL;myvE?UAL+We9zNZtba+7Xb=wbr_VtPz3O*u%(ki4&SX;Ye_XNq^i z9K`N;-T3dVc+w3$Y`y3i;>J?-W3I4(W?uyzcJxr*2+s5ko1s_>BC5= zaVpW(w70OGldjcNDlz6>Uu+Gj8?<{pJ7%$y0I-{D4<;QIo)YlU`bAyz>Fat&MZU-R z&UE<}UwzV6x!F*RHOoqK@aSh@?Iz!65|;D;ZUb5x>cZHEBput?YTzQD*~1xB&k5x6 z8xHAH>&(AV(5^A1D~%r2zVnCh*-LrALH=n?-;(q&oV3b57yQwc9@QC1r;un(vQZzj z=-*M|2w32mv77Jxc|jJ@=VGN%^z_Et`+2Yg1W>A3@g#sF$zzN2AX4_Rm5QU(RfJBH z3mq0I4+kjVzp=wBxTVmRq=9_sC;uQ&f`Xzz7Nvfifh1RVApTRedm=dk>=Ys}4OGT- z7%{G+eu5u2%#_RVX29;Tktd^g3@yq0*qrmQHRx_aqoJ_A&&=cwg)3J|89>Dlue#s7 z>~#qHY95rZVfsF`T6dJz6j@LN6tU@`xkrYmcB*J+?VbU-Jm)xE9-Dymu$V+4%5q?r zI$0!*=wt*Wu#VmZK$^jfM%pvfdoxqXTBvgJfCb|6x-_i$zr64N_W&`Pq4{3%R zouI?Emn*nL(%=4iK21275+oLN_wl(=V2*J&@No4lLKgq*_BZocwa1EL6f@rf3E~fn zCR!TonnmU1eA>R7`yWZ}w87s)g+WX*g)5ckqi4sMpuKmWc<|}7d8+L%>@@oi)C?X1 zCpX?P(*(0r5`jlU26t$uw6$gvu|ZZ2U}cpQ-nWRqXU)eHL2vFkm;_C&(fO?&3s#k5 zS{GtF;{zlACtB%>1#$ZwOhPp7YUzfW3e^tCBd3a2u2_xk<&w=C-z*U5_L zN6m1ul%D3*8+k=wDV)gQ+z^{7B_NDUulZ#=V@HMQ~VLI#EU(p?M3@!Zk8h*=ghGc(#^9x*dBGg{2d%*;$9>CN7|d%qVk5&fros=F%d zR92o-nE*Q2nS9xV4C75+a7qk|zLdDWotNhI#lWZAtglaXJPiE=9*A?WG*KLI=XVg$hZp4GB(U z(c}^*{@oJSHowo3La`bK`%7De|#``)`!V)$U_s-d&vQn`v^QRj6Q< zo*$vFUfs&8CklBS6E@k=&t`jF=UMOp>FA;QIBjgjBa~BZ{C8Q%Tje(k2Hv-!zSrjx-V<; zq_)m`G{cZ52lp4TRq8}bzIJ?-kUE` zZx8uQ+gCkRZw&hb#HT|KTz0MNWA6{RVPgmjK%b=bN+V$5qX{7oN?BolsaHMaK3TEQxuC+Lm^=jy8;kjGvRz$0l|7p50Ugo^CXYo!8W^rF<7HmqG#;uJ8*+BIho+ zlM$S~ew3sMos|czal;ae0s}uy*#`w{x<5F~mMb2~2#l^+S)#UJ_Er!u1Pc|1a5+Ll5CiP6cNe7qXU}Ijc-^b1w zQ*PdKYwn{%SfCFQGwzcRW_Wczf&RF`i7aGC1jR?qJK0(P&Lf5zeO;5i^6YPFWfT8W zwdT&{5(CKV*PE-ee5sfV0|r{#{>i5<3(PUy-wnUhx_T;-PFuqmSHHYk-Um$ho+$~$ z4nh$2n}y~%ojV0Ju!&aAhdXt&t`ps$7>(%R7YV+Q;j?oL@Cy(&-B0@7t5B8Za+;~} zK7O5fblrI<3pTLhw&Us>G$m_sf$!{MjuCS8?FKfvip@UyNUmu%*G2|S?@kOB9{1dl zASU+CeXW=dvYl1}C;#R~aC26;CPpJmUy2pDZd1P=^;!GPwEYW8yFuh`8wn@lceEuG z;=NoL-{C#fMh~Ehoh5QV>Nn0sYLRf;mJUkV=1`b7V$9OBL1w2hQUjnf^sxk!86WV7*lGgO8KtBa>dzX6U$ISP>wTc!P=&K*{MsO3~pGh@1y*v68ultZc(?t37Htqb)2@?M+ zZIS(G9Iv~51}}<>-g;er#{-j+%7NYW9h0sA%kN>OCgk@A$%(9;!?HnxK|w+BY$y83 zwR_?`!AFs*b*2<*OzmNc(ir(N3~t(bF9MgFd4J*RW>CT@kP6K=3KIX*1N~%9xi+DN z1_YiK4Qa%x!bGuZ`15^WIQHv^Mo%~)<*>;g)z9ofYZCTu@R;*VyOp&Vkpp_&CNqj1 zCf16vmNClfVeAu85`=x{mJ{on0^LD_txPX7P|1yEsz%E3<=T*OFeh-A`NC;M@ zB2TKFnO&k2l)af|y$-l!A=8Gu##3c&-jQ3?#TCW@AuC+)PY-)oew-{_H23MYN+huS( zv%JQ90w+r-kdC|Y9$Vg#5+BfTWHogjp|AXy*5EsBr-aZ$r6=eweppH;Q*E}U z5dxSS-+xZ`hMA0?I-RrsB32cc?4h1yahM_s%HT~&S%o?cW4GbC4Rt_3G&Hj$(Ci>MrDSp>A zQJ%sg9252B-gX8YFAdVVhPxF7wq2D>;-Bc@V;OHKb>T#ZoxJR^CZHl8lki^tV1#oM&1wd~9b8X~^p( z{6<%akC0W)m4o!#4trl#m(07S*q2b@kgKS-3i5vqh^?V{zi_&pwuehivWCtK!E zbsDPjG+Bzq{tTy(2e{-ArY(P0v&;q*2{^&i8_e4<9T|0$;}oMoe3U=H{P^@)kt^n2 zl=LLF!iMY}Vf;i7`MT+JDRAOkGyJJw3ro}#1uD6E*=p&%$A;F@2u;0w!)EZ8k z_16;kp66KkUO}*YPTLuDM^22Y_nhD)bf;$E!sn<}Eun|HZef}iZqbvz%jnE@eET)# zRLouscCVlw1d9=D|A(uqNV(e^smZGwv97K0TVxc>z|R6&HmXL!p}jGSNp0<0kK4C| z=?q9{l;AvZo!P%D4|T;DKj>`Q&s}0NOx^zVzi)qbXS2h>iu6T$YPb7$fPONgBT^d;VJfKPzt~HC)$6+n@L*JFiF{BU|Fm^K^|B9TkE{ z)|>ep0>s#)vqnQlPk|wHI@cW}AiF84mR@{x<{!lMCFdnITkbX~FYvtIypgYk2M9xK zN4_I>sSGd%_Nm?ccxUqTbqinA^@%dg^hl=^Q2X(xybtkz>n-ehuiuhuKTK|QHB!^6 zjDtgMwP@5N^cVBLB-@dwDP&ajaaXlv2*0`AG< zn}Q+w2};?|2j}A$Naqjw>1X7NjHMK*^tw0_e9m!V)@t3)ng!na?SqB#O3F3|-ywXQ z3dtaK?HFWs{ISY7^VQQ_NG_^V&vT!AQLlt5T;8x(n=m|G3IEXIt-;`PJx1u{_Z^pP zl(WM}itYuSf-};9>#SK)WIl8B;ex(QN6VKH(`z&q6_VqjWAz9*v8T>fc^k5Ae^(xh zZlI_{ux9JePiPUzC-~72bbW`Lq#$+?VpJv}j4YQIA5grQdT%!0318A+MK)J17mh*V zRR*nVS|nSCQE#J(>%S&Yq9fK?fEK4jAa|N5BT;)Iic7X@ixH|zxl@J2Z{*!TF;CuK z*n519`t1cqP3d^P<}Vc*yXtag_$qKv2Q5zhL2CW_JKO3PUF|AEsZ6 zr^HAoi^<~w-Zt0#JMbOTVH`&Tl$EnbGHNn6i<^2zcR{ka1GI4Y)ha-tD)OzzpEwHW z${n3FI2p)!907}jw1^d-!k4Lf=8zCV@7#<$a*Os@jfZ~(S zV0P6)>%uf+P^-Z_RLw_HPI^#-A0|7e8h*X?=R0+3>)OX_&mYCJWL8rI;UKtB>74(q z4N;U}-v=fgZ(A7bp}rGP{pb33C)<-KSbF`tg8Zk~pB8fi{+(I>onRjt@mK$GZ2y^W zfjhe4C<6biI{&?ZEERf!|Lgt!_ogskdJEO0xIdw5^Zj~EBJVU{w|Mi@GDnHF_P-BO zqJVMri){QAaZ~Mjn=2zuB!vqA+>R_kt+k|#jA+#&?f<=I&y(jj!fhl1AY#REfWqq~ z>x$f62(W9HUWE#+h@zIC=OhFeo#o()R5o6Ipa*X4Kd%u*?K}Bi;3~N3%Ntw}IFZ~d z_?IsBs_O+&-W00ilPA$vBy+Q3;0yQ%!WZb08phB`W64@u+TKj~)fF&yC+&d8@L*~j z*GY+}s%(n!wA^J%c(D}o&v))zcEex_AmlS{w`F0n`W`Eqe6&XgrWn_-{$wJX=}^Vg z_{lnm_x{O@&FtIklaHqUn9$$7=$q0E8G*eLdQ#KdMZ0nHHkNYF%KJ_GOsg%KF!3zA z{YIuVM{f~w;Q;?N#_OL&DC|R!QtK(CYBi{H+)`l=X0}=#m#0w8(6ltWE_$U}ph4#4 z?{D+ZIG{ht{eV?+WaDYrD*k&0`7y_EhA07#@Os zPffNQw_BHYp4@W(0R4{PFtz>$=&RMJBWkU3k*+pGS^ar)shGnZXd3!ijnx+N_eq8MX5+oR z?yfL{-QO7EOG&fv#N~Y?Kc)h~yYM~&qW7eBCS%=R*;cj|^3VLCQu!2lzq}t%uO}x> z(X9g1f78@MxZEzQ^4FTC2?8a_exrP>t1(vnNn?Hd4 zA8Q8rPxI4-cnjJ;;pbm67THv2EWv4fzFNPcEI$lPZ!WbH_7_wTQK1A7Jon zPpDHf#qSdpZkx*U_T(W`?cL^_D)w=9Dc2FpAxJ&4*qz}w?wUXEDya=&P~)_*n4 zCGupt-JW0akwIU~T^ncd=JquGC)+7+tiJZ@Y@M^xT1(n8a-~$0hoby5J{wPZszvk2 zsJN_bB^p%}JGw`rif0eh{ong$LXxk`V;R`VmYjvH z7qg%n1j6fNE#+LNFBVxtIc8(Ozu}npWOl^&sT56@NbskIa%ku_#*%YO)Z561Q;b_g zcd-Liaw7>g@*ql#)717#gv-cKpTg8T^M1A7Ys?nN(9Dl}z%87xRpJBN^bl#A;-^}@ zDK*%o3xs6w&9PUf)fI~gio^`7r<#9@H$elEmZBdT5b^VJVP2OqQUa+3QZ%l`zTtlA z!WGuCPMt4{TrXZR{RaY3yEk(e_vtrAgT~HiVEf#!z6#?Bpc&g{W*&@}IkC_;9C>Oe zNpF*U!?SVnAS5RzN5jC}o}rknbFV1wipETukSz+Do+c$O`&1_(7{o%qk#Y98G!-O8jkb+}hJmbF24Q^?Mo`ril5P=MqT7O+7c@YRgY*Im zVb&w$dzJ=&u&lPF1%b1O9vLXmTYPO;W)g5ln>q>$R!qP5-( zG@m_jTiGK*;e7~wEa`D5MG)`pDWqGMpoI-(AYCo}*Og^2ek8Sj9tDfRA zBoZnz(E^H;tt)oVIc!#9{K*G8U`qg%-QfN z&1yc8;Cywet0QuUMa;-TN-Od}c@av&Y>8&&qRCo#s3U7Fx2sWAN-gXG01vP%pwS5= zqV)yE%VAWIZsIyB{_6#~%0A%`s?&Dvl{pF81Ms`$qoX6VK^4ojoV%?Y2E(d^)f3j; zbQ7p>JMhP5^NonYymO&iSxqLybsUFV3+5qp3kMMj!X@}=@Jh)YDTEl61WsQYYnB!>=^c9OjoZ)F^o}Php+a(%|(B9?3WuGR7+nNLvc}zc^#?Jm3gj zE*&9FM;eb;3D#1yeUal5?`Se9OE844X8oReY7#|{^Oip zUvBTw*?5FGvIHPjbo-4X^=$JzvF1&n1^>LvTRSdGS23zzV*aAt+zYTWp|=T+%bp0C zx8QkNHRlRg-6yj`TEz8l#mvrC4A3rFf&17_i-PlZ_oE{SK8>pf5% zAPB1#anXBx5Hn!fsHIy@hwga1YtYQ1}47xQsP!SNnM>sp&p! z(k>%OWc};5q}x44^5(^k@#kI})3{}T*`|h0`@S>)$Q`F(3U@f8Nk}~*^mXT{KvgDID!VjGle-R{p_X z?Mst(+g@`X#eP(w(J0fAF`A`KwG*27u`NDrc>bE?m`L@=OcGgycrv+q>THHke(*b- zLI1=fMofL^1A1@DSFkRt)sOITg}J{E&!1!L<#Ka>+&#r?j~^5+KHb~(08yD-i_^9b zYz)S@*4QEOiBcH|iwnQZ%3pmW|GaeCn0Konf*49%072?WJN@@w0_`hr>rB|nG zO_^VL!?5j->DPQ-t)+Qf$*6<=ns1Zd8nAqgIl9h61^8Zwl9KiG$X2R1XA}{DUF$gH4i!1B^zp;TjtR@Gs%*Htp`yfG?XGHxhqSf7`QcL)=Wd6t`!sbBNgUcQ) z%9*119Q!llgEe=fgfGki-gKY`dY@JNjE^qI31uDkEt3tDAQ19<_*<^D2qZfsU3W&i z;4N=w`yuzjSLx&^Mbvu|U-R3(H#1lA$8~qurgeABx6|-+Rm;9*Rc(pOIXCVn$O_qS zd^~qMpVhrsWVvU=suslrYNgqG=soZ>rNqKSe!75S4jU2zt3uBpmA9)%(!;JuCwjDB zreR#Q`+vay1f4`R$Ly$2eN}&3_AIAEg47e)of7HG8QZT*Y2d)DKr79cC##%4F|a3S zg$@WIIk7>Tw0Aq?+ek}e_$DbUSL_h^WX8_oBVzo-V`8T%GPlj9F?;we+58mJ9v}yeT{>GX1zQ?iFqGY`(nihi@o4z{KJT3ik zg3zeriW$z20ar$_lP*Vj(+_N#Dx^bdIVe7oP7XV`KDz7XbF!onYWbW)w1=oxv1B{>-}f6G{UqqRnz8Iyx*v4AH(Y{ro)(E!^5w?upfy&8;75|T#V_N z%2Ip85tB$iWsq}$2*OxgW69TgDOeMu{k3~^0Rs#OTwX`{4vx?c9zd$u(g_^o;Au2u zs(Kv$jT!Iw*9NW|mm1;1ra$4!c-pQ)rYHybq`W(soo&!r6L2xp1UT2_U#Z8(O-zHt z4=X!JtZ}aSu9JWbYgCkb=MzKduKw=F>QngO zn}IEy+N58E3XRfTgoXfn>zq*xNizb}0fYEt@hf2_iRWkszq@98xg0VJ^lg~Cy1IX} zCHm)k3k0vh2xC$CJq#=iLqB&cX=F(Znw+Y)c7DeKgU$sU&gMIGDEG0|DF0u-iB@kM zOXjO+odY95*Zc6zFPcS6M|npP4qCxXv5^3M&^Oh`PXwLyMe$kcsB}Ow7r>W9c0Wpa9cd>gelfR&`FWrQS_Y-nY>-Z zyH%~gRonK|n)NjM4W+E>kzQB(^Mu3cmS>_ube!o5uNafvi##SPq6w{$`ZC$P{{7jh zRI7kmO#3(O#Tu%`AIED@So|iRRdw8v`P(A5S_-(AtRPjoSW{p)wZ`FhD-V7rC2q~^ z-7YIFvR>T4NDF*uO>`dF`wZWUiUf6qr8BX=4iu(y9Geq#eLzyk@FX#;Pwtm_6Q3<` zeSY=XEwo?fHl0D2Zoi|scy}sjmMo>>srU5V&N-#9Uk(V3;PqtNz3>S3ij0w&tvW2h z9#wlB?oEGPQvK3k;_~sr5y!}%Bt@Y+Z0sNGc!>GRq~0*r*@BC?_V{HH*b?>O)d2%M z23|J&6AAi}^JJP0UIYD@e7d59NQ3K6M|ET3SU4Ca^z|(8d9r-**)bVNf{C))AHJ^3 z5@NOdFs%d_q>~#wnZr|zEcy)3W2TQME0{X2qTW)YUzljZqg2$~qxmtNUz#j!9(FD(?iz@$bz`iZln<=4-$nWtwHL06p@!W-vLKF!;bGmyTM4?k(uT8?B^aBjPCwU_3w z%O~fR4r)xsX&P-)gx5he6Q z3&_Ev&yAaufO6< zUlrJ8-!)EOZzZTubQoIE^kcN-H_m~@n$nIs&|v<^#dGoyw8WekFg+TLZoD?L zj>Mj?gD4YxOXO21{YjfIEuqHcgyV?Lx#@=5wBdqLvcsiTuqWJ2)W}l;4hIEPPezVn z{?QQ(6yRS8jnnTLZ*v6P5P3K;fpg#2pUhx~!NR1ru~hzM0=YsicNpUy@L<}d*oM1t zj4Zdf(5pLpDs6sqeogNl&|Jx8SIJv&C;ZWp=74OwbXm}y&5G3hLxN|MA$5GMsWRKc z;4{oTD)uXAk;DorM}FRu5y_m(3o^nBknc&>wR2i5WmBlmjtry~X``*onLS`Pa(AgV z)5fjrY=t0hLRF;-l`usl=8>k5zE{aOj(w$}oNFs zscLHsEoM!a%E8lS#Fptdx#rm{x)loCd~xJyEJ)&4Zh^NZ&mns0Q*M34{*x{AcDz=| z;gCM4%M7>AhWL1bkB6jsR1f)MgUzK1NIJn#`7!$!8`hny3ZqQk&y4Wng&sda`TJa^ z_w2yNqDZn5AD&wiFR7=9-(=yeZvX_7gW3eTlxqU+Ua09Wf?`IrTckPah#q&?LtDh! z5)~Bvzw^i?wXor4uctY=FK@5YA5R2!O7XpAqM#j0fp;H6Y3U#H-07&-wjt$3zbD6I z2{(67shbp)C?&}JQ{(a@9RowAt} zqs*&-!h}wPBid14V#Bj~R`3H!(vx3uSdrkkNMWzS$N(W{UZg)$#dG}w?o8<1J=IiB zkTz+(Lixfi_d|%N4#Q7h^Nu^hmS6GF4sCZ9?8og?msvSkw534zm&ZE~)MwudRV#r}~n=%|e{e)i?e2cm| zZknyDB>WI+yDJt~Ad+tf68ffu-bZwjg+1i~?u7Qt;sfFbmL9BkQpFA&-nfMWwsHQ< zG@`B__zq@t?b!{B_Ev{j0uxQBeUK8LZ&2az2|UmP2$Qe{|LZ*5O%$n7_9T!OXsHR#Z`t+#6Ahk5IIO_6C%XE*)&!?){ zy@rk8e53DOg$P(C&4q&J9z*A`TI_iIF$<@o-t4dPmNxCP_tWcn+Mn+Ar`#$BBv*By z^u%tRX>i`)px<#F^s8UOXHla*SuT-k4gMF`#hRP9lrz)|jf_NyHkVpUU1DNt9TDhI z5CzM7SPb1Wh;*bud*8OR;VnWNR zSu3X8?r6e3OO9ECY$M%f1TRO>VO7KrMNr*U;$DpQ5nt~4zszSk4_M2AMzRGzZFJ;z zBL9oB1Y(}vr+vl332R9UE8Rzf-5f<-m~>}RNw#DbpEdkWBBT9_{QoxQ2s>2R+>EZci-=eQh)%5llW+5Mn8DTl$Hi z0MkBdxLxnc_lR>1{H718LMf(Sm9nsae2-;0DUT+&uq&@8OSqkvSykw~Mob7HoIL{R9$~* zh?&MkSB~uRlm8Q**Um?g{$!t+D9_w1R5-X#g<*_7Zc9Z4!r(2YYK?}jZq`cduwz2V zE;@!1*jS4rrtcpHba1m;L*C-*h<%*wED1!1LzU~zMPEm>-Cdkmg-2%Yt55!~5vCybLnf0a z__>Uyuc~*^X=wi4M7jLc$!UXGy)B0>#!Kk~UT-gIV>vupuNN8d0-UMDyP_Txf`4AT z;;8J@FB-7jJXq?oQvV#;AKI^Kc5Tn4U5hMyOeu94lRk9XGZ(E3;`^>&uX(z93N)8P z^iFUmP3MVS_4twO0h&5*VnD0 z*|Hb*>m))wIeqR1CB>SfTtgT(hnR`<`?Gn@B4c_(Wwhy#YS7oS4IPp3MEa6KSdqqv z`M~siTP;yp`;g|uj^i|oayBOR9wryebK)j(xsCy6W)=1B9;>F?bs2lF1p`=J9VIEO zS20G~$hDY4qVRe?dh68%F-lR`jL`4f6db0j=Cc(9kjPnRieWAleKAup1MCr850$3C zM(PR+*e+%TF;s-uw2Y`670cK%Y_4k7lP>+w$ohaXbbItmeaomUlW|-F&Vb>GH9w9L z^b+>+o{w*M*J9UQi*n%{(C}t$kYDP#xvnr!&X9s`#BO-N`^)&SlVzOv zfDin+Ci(8jFp;2I2IMe_K8bA0eED6Qmm!0XLSkXQ@=DlEjTs_7e*SzKbfQVEi#7#; z{U!U0hSTXLc3BagcX~z@!{W`)j|{$L1Kwj%{qpfP*6f_G!IUB07KL`RC>$4#$YE7- zkIE3(vb-6%Plp#c_4Eb@u-JWEY&0ZY zVyKWJgXW^V%~P>Z9&K33=QU=i6g&fOVijwyt7EluKnJ2cLJHc|6)LHWP767;dSo`7V+Q6ro@AT-eqt(4P>@vI)Z)< z)I77F67T+jNc$bHMdU!RBwb-!l;AcT)s zuzG@nWO(%(3}k7LEzv}0(5N-g&SgRifQ9FV&~b*e=hEgtiqR4zDvHJ84S8Muh3{3cB$D%+i*m`XKvJdD>rsYHHDqt*63RLPHrGuGQ3`Xrr8W zS{8zGXYI&pBO)B6G_IwkIKAm2gZT)VN%rYMBO1hF6UrT!KVue04(Sy=jhZ`;UT87e zGO#hto(x2YH+67;a&x#Th`MyvC@GysI7CABn|(FSEH`|jnfe`Of^5?c$jHH>_#u3g zF^-V+xoaH`K0o)c6D%i&ka}~iyke^NQi)Tm({Ip1CGGLJwVt4Zy_)%^O;z%cFCoL- zI6<1`Oz5`rG=2j?yAAE8ZTJ)@ha2BotWB2wqjb*5ayF0-#X^j9+kd~>N| zpiRqVq135D_pDfPI+=<^d$j3H<3uz)m1?PW4ynICRd2L`zYo%#oQhZ566?vkW9wZlehD>xgfS#o}p4blzn{GqKh0k5c@M<7*^1KH!`-TWEhDqTl#Z#Q5ag z6-i7AHA76@$EfSoOB2g&Y37?sE-rdN^)$NF>;fZL@OrGgDO)p2AHhYsE_*6-tAQ~y z>ng9T>=qjU^hJR@b72)I^6xeAqk^vB&^>MbT7{QZBqD47LA5R zna}gU3rLH9_@fH$xg+Ec}tUocZP*B5(z( z?!Fg1P6Ie(%k0gg+E}P*EakSAbT@(9tD}!~i@S9Lp{I9!!4I)%4iuR6HCvB+H6Fbj zH>1Kk>$#K+ofs9V9K`#N8>Ih2h+)u$zR=k#jL>_j24xM7{xq{yW^9O#DQUj_bgr|U zqLob|;|k#R)7#NPv$|2Sm$fi5ZWBSa>}+8@3wkYmvgB$iMr`b<5@UTDpC>NPs^M?K zufksZ7MA$YQ$egR3&x`$?K@smvWA-nrFi8ywCQ66C`l@6M1w|+>4g2-syUI~0d`W} zq&f4Yzbe|&TgPz>7IA7U9GEzG z$h0XEQ8D|@pjLPbkrgM2t(;0^IIwj3$a?|pY4HkoBP=+_ikr9>pQTi=9`r; zp&o>|i4`QH#yKjv@O99fM?+hOcYpC~j(8XUyMY;ui!(siRI)G}qeag64vle6w5Z^Z z;lM2VjS6-y%1TT_NUI^}NE?a@W7AteFqMWBiv%JFk+8$-%cu4ui5m4jSA6>y9JPMk zE&x!ci1KXIWdFvSY+kBBba#Nwb~c(TS5p@-rCE}JB<2DL@=jq7$b=8-(f_%@F}AL6?krWQZnPvgde*1K2F1C2tF@vDUj7 zBP~>-CZB}&c)#1IY6ZG8LAfV)QGk?~J>ai`fKw%itWedR>0%NkZH>2RuDwJh1wJ9S}c z_=FEi2Z-Cm`Q77yrT(5*qz}olf@iP5Hiz!aKzD({XG1ycW70(*+D(LV(O=kW58Ch7 zrax>8YoL~9U*s*gJYWu)#X_+Jd_@$5ChHRB6|pxsn*bHN!jp{Y#A2D5^NTsCV3?Eu zQKv;kg3jHh3VK$X;JI>o4*BCr_<=U--i~oJ7Rlz5V(%}r&lGHD3?ehxx%C7t9u=h~@Zn~-N;400U`U-K zBY5*8+4yzDfZ=~Y(hZY!qWGJG0ef=B{mjan$J>$sPe_5a0XyovOs&4$ zWm2P$x`0-?UuAfGu#Og_c(gPl`!InYP+Fik>f!`H*x(A$bL1W#p_XfslwjWy3f9INAakA|ZrrFM7wjpKZRY}I_fygMUQb}AI*E^(KGY^vFZzf?>G zd=%`z$bkndyW`Rr2)dEND1twV0P&w)MkZC9HpNcW<2&!<^45VE)7So^EZx~ttZ6>R zE<%i?oI1UieEPTPbS7}H4n>|6ESK#s3B$Sm-=9o_H~3`P3xD5Ogi?zio5x2J z-7{FOUWdhO&_{gnk6C`}zy1zGNco8ztkDfq`nn8xzR{5ekIT`gmD?th5Fd|3NLb~P z362ehDPb*}p3jw_j;C<~Tfp7ce=P)l@ONpC7}wFETGbz9WC4SwpG65h!L9w^kJ`)T z#8PXs;aAbblS$(s$ASZ_?XL*eRwz~xfkhcy>@huVDk>NS1qI*(8?66PWDi39E!U+9 z05W9oM5`c)xJD!(>Psr)pvLGb&EtbdiV`Mc<4>jasYHc-fkIs2pmDtB*V=WZaBf=g z+XzBXdl{LUDygUd9xv7nEC22PCAZ zc7_)*!&Da8k^iHrzy>#%5yyf^!rTCJJ>gwGv@}#}-NI(J0Ox5{DyB2w(YS}Mq@^LP zFTstSg1fAM@*@wXTF{yqwl3cbsb|-v#_(Qi0S!>~%HOl0*l43Q3@n=+TFshB?+;&& zjq5+y$6eB9_!-BfBi9l#89sViV5G~F*0iU{OpwRrirGcCEGu!=toI0sQ9c|Iq4G@X zCE8NH(U3G#i}FoUa(Hyy==uS)v>fL@U`D|(9ns-&XV{QxXc|SxQ-@tALCDMVO#=du zhMmzJAPP!A%mNW-i_RQ@sw@4u)72A%xOlF-DA6Qz2J;8g84rJ`C})xH5X!Sj{+ z0?*fpyNj7rn@FXlHg^aFM-+aX#UGgJrL*GeLE}doRNHcq{KDf0PRRQ8mNS_f9V-UQ zWd)j5@AYT^qY~W_T#fqo&$YEpb@X7Yb~!UJ6~ab`kkD|tkQju7bn5w@bWJhvYQA~T zcB1iKYR>%Mi+qw$WhZ#Y7Z653Aja&WFe#h(7l|lv=h7zI#=%-qF;+q{ z#B^^pW$C;y8E6QcHrgJMduCgK2)mXFz>3H%d~(^ zGg0WWtCsMmjBUq`z8KiOk}M8+q6`C{j%aKX5WGdPlXD+wYR^rJBmN&%=M>oJ+J61rL2cWZ z+D2+jHMMQqn%YP^wWe;Tc00B0scj==>VIbM?>+d=a**Una_6~mUB9)~t4``R9W%9y z4L&i*mu_7Q)Rm8Oem=NNa{Y>tG~l5mCH@MS8Rokf)fO4?VjrHEC^9^>;HkEosEm&3 zAAt5BezL07%qL08`}(>V@njs8&2CaLdmwQF?D@V-e$rOKkROCEZemfZ&5C!2XFJ6~oh1xH9P=jI?>&~Ia7V|vIvd=B~u)wP#qMTfyQoq4zM+iT( zjWE!Ih2wvWBq030Uja4en*9E3eFDmWHr?kTFs*?6C7?zae@jfZJHy$v^iowHV# z3q5FpUs)`RbHPURvB}JKwK)?hbFt1^gEzGGnf6XyNer1{Z)vLP_4C;%KWR)aslErA z&-wtEli1naOz8|YTfIJTEsN0IZgXJ8?btLGtET$p=XSa>KwtAJ-50XdbSOIDxx7*^ zaFpW=5d$aBDj0zA9ffuVQ#pHF4Xh#}`jaDQ01j`C{641V<~;lkULR$7b;c(x+=Ki+ zX8xOf0?oJcAHx>MiH)B)d-ZN7-L#oMXZjltaFf*7E?AhFCQBg_RFX-*J!$QkI#~3@ zR4-}lMB=_bYxs80Rs#${L3)+9Z%8XZjaI7# z7}QEf%I=BAQJ4(9MjvCnbtPke51dT^NY~t2oKxzxL%QS&E!M+y5!Hq3ncz^^I%s6~iwP{#-g_KAJev^Vu z#16-QBnVQ`Z((?A{KzEs^I`jCXs>?QKdTo$_6-XTV;e~#at1J20Tgk}xI)ct4!(V3 z%JJd7mClrYt?G-2u9hjU%C3pR7O}f61RH>S1a3Ren9xr+4oYww22NeYR}wMeSgvC8 zCz4J@KikA?E%O_mRHy;nzs13_VpnVhKa^a}gsY_0IqJw=VY!JNny*5zx|tuezC5o4 z3#M(X8U38zBvxbQ^Rl5Z>xTIS8UVxmeXecjBR+uB35E`ls-_$22;tZNAl6l+NB05aR^#P)6L#+me=dz z4*1AAT-Ey>>$26=gOBSU(%9^T1_pU<$%&JyLd*=N3`fIBuD5Y+M(7YE#cgPfZPr^~ zuGhoK^+;G;$~+e@bf+%Jb1j=2^4lBEbf2(DB3d?buRji8^P2~U1yy#{w(`VNUCJ3v z)~$p82b1lP^vfJYhJk#D_TYDG^cSIP0J$HLxdYQG=YRTh_qOj>fi8#AM?ogUd26G_Fj|CV%XMD7cPNrZonm8; zRE)3I3RCW&A6R>JCF2t77bP?0ok$vGnWOu%6P#r@x4U*rVcr3?B^EMPy;g1*BU4ir z0XS^zJewrP%)2g_AV-C8_HseRXcKafXjbu!$7#Ex5@M&tT1$Xl#xv zA+t77ZO(o___&@mGbRMt)_i^K*mko$eccAIUq57Ts1t``!$~4bg4>r$;y+m2c7{c+<| z1~w8su~`KdDaD%W7nNwwV6J24>THcZn-S>DbkaYv(S{q?W`nl5?t_iMm5O08ZZvRKR)gg@?N>GS*UItW%B;ed^6XsMqaW1 za{Y&=_&qC9a5ARJ^0Pt5)fY%{z~X&HYux+5itEBHAMV2NZCxzwaRB9PDJ^y^b1=vU zn*GMbshu(R#f$sqEynGrf*R4O1~e}+zKMznJ!ka5Pe@G&AE~HnS+i7bB=i0JGG|1w zJOoG;6W@oX(f=YlLlv3>G|4o#i?+ED|Aa#?*k8 ztQH=Ez;P_!`@2O3y|&PS`pw-H9b)6VH&k_5ylMkS>W8;Oodd@8NEMu+UT&s?g+n2u zy9GPjmmMqOm+gPJqK9pGk{+sl2QCK4nw(};r-N3_35{OKnAd-9N)kiAo_c?la)!W?fiU)((D;K@%3ycFAi2!T51>h+VX>~U3eX!EC zb<5nmB+`Axn!@g&Z|&&?QQdBJvPqF-CuH8s)upSb-ly)_J+&-oR<0Q2bw{kcvr1YI-4HmmotF`C;{gC^L?aF!>;}$2h)U1uP%S)@syIxyKWX7$zCfXkx`#VuC zj3Hz2Jl}F60>;Y6y}2_3tJ}q8(F{r*iAXlDa3fOz0||2(sJCU6$yh@$1@q&RYSAO; zciZWQ2KkW5>Qit)C&fZQv~R3hgO_t*nz%!K())rTzJ7BCbQzqdOI?}&u6I-WQXnb} z_@rGHTsl(e`>3eFKR%5{)I866-U648XC7v(yIIK%wF*X(kl-2e0bg$Oq|Y7H zE8z4qcmLLf;c~&b7UNa1aju-9oA?;xcMnC!DNI2WeKqOlhg0;oYwE8O-h@rsf6A#3 zj|jH{$7pu(K$uh6I>C`;BcF)Z1{+2g;i}tWp@S!0bZpkG3v?Ar(ImrDOFt-O=2o}QiAj*gBVZFKmIt3mFzIFu8bOh948 zWwG3T6oODW)`-~`z9<=c-*@I*&eNg%YBIew+DB8HIs?2;RlTk0Ro>#g%oDy z{I`e;Tq2PyDv<_8nCXp{?DMuzP$H>!_o>0&y*l6E{M^+tH$Mv=2T-AUvb4y)ZO~G% z*Ks&YvDgBU==b-wVX<`TID5Y~)GIGIW11qBW&oxj9h~vuTLhM3B#-T7t< zr32QH%Q&)os}pAPc!@{-4t~dvNS%C+_>;)y9f*z$YV;zg^j!pnY3C%;bhM%?U9-L z;@;wFbPla0j^X;}eRc?hB-sX@I1$$!OyxBU{BxoTV^NzcEGm}4)u5D6tGI?R{|Pcm z&QWR?O?NL`cS~4?O6CH&c;u|wfnDl!l zozeWVC0jNG#K4P&a)hI^STNICh(GMtzPD`{uKYpXb@yUfJRkkZR0*d>oyKc z_r)(^s=ik)V_L%XEYua?$qk*|2dQy)gi}bA_dAhX`J1PqG+*u{g7n~8U&14#jgs)PYrgH7 zOUxKANG_;N6Wm#T=>3M~Poaer3JdOkO=w$wNq&ZiGE$FjCF{5u%zFqt*iJT3%9d*y zOZjWLc0ZAy{*p#KYRuo5-x^iiAU|F%(ZZ@pvb@^8iIgN$hS>w?f0cNx)~6Ug^O-C> zXQX0q4wE3F-(Mc7qAcnYyKG5sRsQ46NmJCn;vS3GXl z@hb3OGs#Jd)Tx@I=qsg^n?CJXI27mL07lt$VY2A|j@kaka^a_S1`m^O zSJ5I~tf~Nr{fUy-xYnaTV;*X{$|Pj=?Cz*9NCVspp(CF)PK<7qTtEcs6pVdNy3;&s zDzKd>|F0C~bj{m}b4OSWu&VX8x#2?H^y zUA>mEVg@x~^QS~<+PPDe1_DtV5A@PTQ*g}wDjjm(q zuYF(TU)o+s`~i=rxT)yA7;Tl6`1RDj=DN&c=^U-;yTXt8S+}zlJxZph;QnY17&rBk zhLaGlk@fL4K#qQ;1UemdO_}J@VPX3hVXZtIi{wz(_lTd(nBltrG)@Pvo+r-`QR0$L zUwwEg^zAw0o}G@oR-AUA7Mv6A$mzIZ^h&Z@Cfhm1h25_*f9_;cUgeM=5aKO}$9#9@ zz}J=VLhQWYMOQw7?_0s*cgmmn*(|vTPOu?`>`@t=pL6AhR?c|>zL7cT3SyOvM6KJK zZl*faRrIAJE+*H|EDoAI=*#Lj6}ik~ZakannGU7=3i+6i?4I7AK3~k{CjwW@!~c7Y zq~*Du!Iq2uEPV<`r(N~b8v(&wFN)hw&y@9?qJOgnlLg;-K>iMV^h>7V#D_gQB)Usf zzDIt;9|336g^@^HXHT0yv>Bl9C+9-ogQ30FDxSNKjXm@xU zt?&d7@PA0FG#}OQ8*b}5>#G2XhDXM*3JvwCuv07shJT(rRHhqMZ1M$COEm;i%R>P= z@A>Ly*IQ;g_hY#ab`j6FJ63ayVi$k?&rm6VAJVg;%Y(zn5K1WL=iW-0gj;(KOeQeM zj_A}B8>8Q_@Es~zn=eD=cCG3$skT474Yx1w?iLSz3#QEoK;~{Jo#<0!D6wBG?$z{& zR&Ydhu)=lNOBDtP$%{z}J%4GtteCtzw_!hiBRO8m<1$kKJQ+fFbv(0JN%W$YEiLSO zz{2SA5Dk3#K!#?EDw~An>Tteuvs%@+{NjwCp0gKs(3sBiW_5CZ@x9&xaun{!^$E>L`XxvXPc>+JX~DdD)L7;Z+C4nNRsHLCpdrI&*_Bt|DxUP4(CP zS(q2TPvoxo0@`x^@p*0~*TN5&_D6}sbBY~teGXU>M*|cw@W2X7ZLx6T@E0R%cUx)J5=m%a|-IvDsw&6xn#z(h9K}Fh9I}4et@_9yMfU&y5fgaK2r@ zL}Bop()~w$hnQm$njyXEduZ?^1Gn|i`F1?N0XwY zk>k{dnvo6BkikhCEp)K zg~HWxA^k@%-5D9b*wp!G;$b*YlRtD@@iO1)@b`}&KH?EjgcAF;Gblps3vmLsgW{b; zNzxO0+J8FCh*EDWrTo*c3|FS2#WIqzl#`fH>x4v&*0F7{=6!Crx192m>{1rUZJJ^EywMP*B$b+%W++q9G3(Ait z570_9O8t1{?iU+&NZ;{q@ia^I&rUH-;D0o%!qHAKIW&hh()Le)wPW;Z6{{xeu_*Xs zFL)l0^(e?wZ)OI@8BL*e-RfJ`+^C&du+WFV??*S<6m#MqdJW@3Xm)`GqMI!@pmDHU)8$O2oN2;%DR56$h9ju(?mm)V zfz1Ab+|?8ma&b7N-b~XxNLv_L)=xmn}3nH zw*uJTknTvlGq9IG#X7w8&bEAR2lsnq_XI7IuChACmRhjoSQ1dt$4ma9q9ChA$mJoy z_Akd1Lo*Vm*}acs5nt2pKuZz{qb*76N4?XfIPo$ajj6cIkFyTW&&IZbjo?zD54Bc0 zG$Y>o(fF;KW)|b6?^b-()TvV8k5lDv^bq|uvSdA8wxmKN&>vB=qF8!Gbf=BqhSp;< z0Os{FW2hws|3khW(sQ<_-%Qh_VeQZ4V@yzpgaA2oI@q#}VwNi23?z9?zv9QcBVPR1 zqv;K?v84>s1qZ?+$U0e*mc)r8d3N;RviiDx%FhoM$L;aYJ=#Nf80KA;!OnK|();p- z?-bvPA$qbN6Pmo>lc{HZl200t_}V8lk75Va2sgxFnK$+D{nrs$r0W)izKQ?99odXg zHLBrWP!?M@bVm)y4{BQ@ggKTrojct<`|P{aVgsxe)6@B^?97&WMq}5Xs*r5Mrn3)^LU}z@*!Ez<%AJ@tP{M#2SlcsVPKr^ZW)s(1k!7 zCOy;hUFi=@flLFQQGobuL>89YCPj=-!7`>Gja1FR3K#8ll;p=G$3+{umDB>GTe8h!ACF33~HedFT+&xzGtkBQtDzA=7`#D}+W z#lxIX1`SB8QKxeGwjAUPc#7h;sG#9ex>b>Frnh(wc@Zk_|F{t_!Cz;Bs8UU($4Ivn z6y^Pw?L*VU_SufnR*D!`5w$M0K3?+9&BIcwaz}m!#$@`YG7n_e*^j zPj6!@Axh`;#ezMFJg^1^77QIgO5j;-lEhtMAsOC7%Ytr_xbjW)j{el7X!F;Fl-R<^ zlEz40ejp~m*x+;B+gtK2A>yv#2KgJsq9wV?IU6^VF=%HK?6pBisCQw!(ihCiU$}+V zR!7d{Wj8L*L;S+TlNM&V1ayG7!v6csLEIAZZoF`+*(cYx@QeqWS_KyYWObQ=!W2@d zS-nSc<_#juQaXmWo}{};Hpowcox`pqp*yNl3T`tOIztiWGi6M(X+jIbi<%NGFeSgg z#Dz(g_nFrIOzq>KGy*V{G%NqTP!vXJR$OKA?|&bm3n_d^?v+Zt7wFQCR-y?A=T8~V zn^Fr!af`-+9~co)_&BpyVWNq_UKX3V!}!^@41e-Rv-Pk)(}U+^SAiQ72V>y%$cn}30x@A}miePKvTwp2k%T2<0yJ&v2_Nd>KLTQ4q8ecE{&yD zui?=)N2V%nJxOgC>ZHSs0i)m`o{jKxp6A(%ONp1yoBb$8Jl1_s{!dfMayh=AApx+a zJ6IYwV{fHP+j_4g)QVZ%g>b3PAd1WSRV#9f3m1V7=^xcCISI*)hOZO>3$b4k~f;6sOE+@^b4#Lu3XTnU$A z762g98&0y9{G6>)`#kSBo_yWJi$6-3{H7A_H`r^T?Z+ZPe<@lYE}JJRQc~|3_=43N z@WTEY9%I-)ti*wo0&E0CgP-h%v)xDx?8A8q$jE)ieJ?rd>e#&=*R@!;cZXXrqf8<( z1&S52N9n8E(U+^P_Tt_W@-0;vI8NWe$t9@;Ba+SXfnxu_AT$usFUk^7;F2?o(>e$CLmAH-51`~yFq@B9v( zAsN_=P+f{Gr&oNkPCTziF=3WP82%GsELGRnmRdey`7uc3#eJxt%p~Pw_8r2(9EhEF z42dFw3A8~6e`-_7<_IJdbZDu5>R`jCy2ztoh0+ywvPdtp<}A5-7{lqfKY+`p{mAtw zvf3O=YQ|alOB_TnkqQ~z#73LN>lK^oY;lm7Lcm=8`P`{Y1#iUT=eJEPK;cpC1HiA$ z=`ad_321;u2%N}eZE3|ckg5kUN0BJsYWhmKG2D@uH|sSilC=xXq!3d>_#=uR_ncxn zxD;m8fE4$FMJFRuw925H08ao5m0 zj$TOY!;a+C?|t1E&okY(8|L`FwM~)=t)CCt&wOJ!{QUdjOd%CH8_#L-wE|hER=eUX z?HM~s%C%VLd<9>_Ahv)bqn$(4x8# zi(0$1SPP+(K;7(!nxC@QO~FHJlTH*1gXmFV+OD%if838JnGn~fh&=RLo-*D?I3`)o zc!yLU2~F=?eVChomvrkA1DUUO+<`~lk;?Pkh7p5mEfxT`(`K5+rb=fKiAaS#!S~g} zbO0FYi3&WEHs)0!OJ3j*kSt^2TH;?R&h&2HEZv2rQkq6`fhQGguXj9G!0zUq)w8?l z&}%F(+DZ$)CNVO6I<#z8Bi#N;4EUe&#AAuqgzgt> z@s|@BaxGpdo-XJ612m~lGi^4@ZGiA)2Zf*N!x&!P>db)dBw6P#n;>)v2mf*J8JTL$ zCvwbNV_CwHO2yc{=jS2T`!hJ-b_oi;IVGqb+*I*=3ExPY$zYPV(YGvH_loREiC3ws z1u5paj+|%@=Jwza7!OCo2d4W^hjkBewZ3|PBI@m1lgFNl&=FPF$;d+PaSPnC|m&@mY_dOT_O%?Q+bq_Tr9>`QGQr8<3%=I%QgWvXX3}Y1(NdeIwB)_9< zsx!LP7JbKwckmqdF?1K)X?LG;M~D==M&g{yS@avot3?p+J;$NgC5i?@Ldj^xdUx+2 ze#J9lPWcIK&C&&WRk8Ipi&eu7RT#08KTQG-*tjZxO(t#XPUcG$tCVs^X5dLg{Zqc# z`eTeKv)c^CPmI`G4$Vv?UOsaG#$&BJBr?_Iv68u#Z76!)-0bdF%FAUNTip*tn%dbG zQbQ5T3-BHGaA+S-#_1SIscZDTx$uSmJEwnyS$H3&$*mY*-ue3e}3V;4JNu>D**?Wr)qv3LD=L}Bw1mm$a(BGX?i}tdVv4o02Ax(tGnyjz;NtbQL zOg=CRUpj9U6L)xrc$ulfS6_ZFJjk{zM1UL=aQ%k#C^16#&W}+?&0aTHo<@nCagB!N zUUxLW_A55Jo8CC7_h-EwH^_!jj}fTwTdpnrsic?s0%?99iTCQ5Knag<4;9PfIE(Ii z5_82I4t`8FvQ0H+CFw#K)XwhBeBp2;QbP>-b#L?4vmK9(t^qb&53cgv%xis+HcNK$ z#zz=bx|c}5{RGZS3H9dRk=u8XZ`br_Zy%Z@f#HBh$J?On9(@V&Ygsycm4 znJ8CPl}yP!w9)N|GnScAU_EtiI3uR`qWc$li6?fVW#1<^>emZ_+%PC+?Wx@_h57xHGefy9|~+WsA1@2G?^k4!Fc$<)OG50 zpZd9Mu8#j)`Bb?}LLc5 z?CA}zxWWk|_s7>}5c256UL@vi@95uPS_T)r|~YMk1;t-AM0m?4|*TGcIteF z&v?T+volq$Py24$pQOBVT)0ehz@EFo)p_5Fd&YvAbBv$R0k4v=MaeE$^s=r}%dcPm zR(J?=r=;54&pls2Ll6?}tN6>eIeo}EZv>*YC_xqJO66N0VtG14XgNxpvjSS8WuHfp zAxJh1Hpcw1^jz_vDEBC?wK{R@)dWS`*Cey&=F0ROykF_MAe~Efj`)ki2oMhDFGhZs zu;4|dEMy!y$3{_0My`7~xd|(suR|ySywT$sAel_Mq15ZQXyAjLW%b&U*UENVo!{5x z{90)6t*G`cu?BnheKVUf_PbsO^Fw8qRFp?2Dj}s)s1Itz=`Y04(dl|F#6@$Qn@)$- zW1dd7Ei$B!jbjbFY zl6jPQL%>eNut`^Du!{K}%$yTadZz|L`TMBxH+v(LfDd;Dnv`y^d*XTFy zuDIE9iZpRTp@WSUu-;8Pa(Zfw;lCuG#M?~gX&wB!6hCK{H?}0}`8q@;fZmmHD5NJV z>>#djLAh9*ryYc}o{Iw%bs8_j-SC~{J#?It=VrB>{yF@cga(_Da9%>())lOTd% zW6So1g23YwdP54&_)2WMlNzT?F@JVqbH!+iTY(36Yyzxh9@NL_nN=~csr(ngdtSNoIOp=lpx)nz; zQ%YH{p)t>kgZiVz<*5p(RF<96R=&j>pSqD~dSu7eRbLHn*(cW7in zT&)_gcmd}MY-MY>RF_o{s9Uu2(VO~IzH++56T{#j+MUATBSK&HkvfboGL5~G8lT&R zR5vqyS8i{%4)|(C+;; zaf&v@A{hJ^f?i-w{RKY|8Ae#cPopGij$EGD6S&@CR1s*2jMZib#?DAg>~r(^PDnQu zQ)+3q_c(k|o9{tgn_u{YIO@ZO>nfa>i>lchL7qvpAbN7@TkPlfNpl|iPKNLrAsh>_)G3y?=&pt1E%UJ`f zu18;^u1lYrT#F&ux`B7fg}P&Ms`3R!yy1wl{qHxSC?qoTb$>w(#m=l~67O(C1A`p@ zQ^d}e7NT8;7NAWPPju$Sif|Tf{6kg7@GE;$KDT;I3lBQ)<~r~V4#4ce{?Mq?dVf;h zVmvEuAMgUOWyT?HFXCC7Np)CtVJfz*j3ctLxG9@B>CXbTAxtz!loc#`gHVmDVi0xKbDi|+ zEmANajijUpArh^>swyX~>JbO@o*_@{+ThCJR`+EjN$=ccXGjqk$b8Z{qoI1R3C>0FV!@QuG32zr)0-zpevY{wF)9>|lvGCZB@fw$9~QyP~W^TE0%H(?tltuqn$@#aiI4W+71=*&}F^ z)acB6%H|A*zk9@T#jrx{HLMF_r@Digp_U23WH4IK=Ro(qEezDcg#vE5g?wzS$avH- z6;ZU~`989d&OT`!yula~M+8V>nw{gU4NKtK;K-8^!aL#+jz+;TUw?8c)#kp zU~U!K7XL?R_t*f?-NdQmIB)y)^tU^3u>jEP{JfDs5iHSVTg-qP6NQ^cTHMcfd&G}9 zw!v#V?_R9Y#}fq2-G*~P<|OR0^ATT^D*Yvcs5s!6+OmDXR;Med!A}A29}yip@B0hc zT`)_|udsv~;+P%={q|##4@nybft}`D?*cgT z`;hQ)DfUaJF_RDvg$*)aPn+F=_~Ku0ioU&Y4;wsl*)DybFfV{qih&Y}@tjf(UicL5 zH_($!IU)~spV!tYo#}e7Q^Q!i%xTOgeBxUBINDcikaTj65C?9o<_y0SHCLEjQiw3w zcp_9MghK`+Yd=x*_ZiHaU4-=P}N2 z7&HuwRXKh=_dxO!TJGMZI1%j;WfDBK|1BsK zPms|e_3CYtM)DSdZM&NxS((1#jxSNqWV~@l}+c#dUH(p>~VKkp=JVl@kaUN z?(}?2H!X1OKPJ4G)OBB1^=>Bw3eP!rQ8@^V&!ywB*kTq-71KJJWg~ zI7MQ_U2i&&K@*}>ewhyS3r8wX(J8`*h4DoT)_ICVJj5n4$pysd6GXj?(!L(u@jZ5L zJ$R9~r5_{}DlJR$P+j3nq@e!r-B-qX6zee1EeI3`9&%A_&c^*z;3C zQoRYFBk?B_vH3>6J#<2S-h45NYluA#y*~&sTpSN9-WeaGW6`j!35ZpSmpcqB0T`KP zinrT)RLF@7N#K2M@6;rO9+w27pxN@^qV6-^&?~A^xd#O0>lQR~1TpXzeEDG+)%)p1 z$mn!g6Vz{|OW>U`fpXt_EYOk?390h&;Pr-Y7}M;YlQjh7!L_D4s7!1p$g)Vei_o%zuKkip4gFH=eHawOMXZNUeJf{Iq8>2Qk*q;?*7 z9vxs_#ArwK%vp%vIdchtfocfxFn zA%bC;?=6_2v!#%0-+sniQl$WLehBNd6oDq(J$OyG`+}Cb;^5k#x!b z15Ok0CLx}3k1n4yOPFyLxFfxEy7hfZnDKe0`ZagCE0BB9s>NLVIZX_Ukk_}FEm{cD z)95P(SoMbQ^rJ4@&sGeby6=?#-aLovHf%Im@TB#iqmTeSY!$|UQKdnB`7j!C5Mb7# zChCcnZ=0AV=VuPjYL8$sIpjjo1#967x(EJ#rf~LF~ljwRva`-Xygf=-f zdB9GFvs0|KBIN8?EBT*<{5n441bsYhEcNXzYw;vu;u}3&OXdaDKmWYn%7}}o7Qc5} z^vt!E&Kq^8jl6OCW@V2Lte*}N#!(5WzcnG+1v9x;lHjM24y*j_Hi8#j>i&!9dg=H#c8dpiM2y|v`F;+i zrT5)QvfW&*WTV%AGW@1Ri0J_EeDZWbkQgBM_qif(N`m5*3PU-u1g!4(qeWthG@O?> z{u3B999-IN=LA}cdEU|fS=`1vhp~jBsitKdmNND$u}bUsDjgy|lURq7ye41#GHIk1 zq>iS2{&~tm+5?}(5OQVRC|-tF@&qTROR$Z?isVMGWv!nvIS=Um+MzLdV6t^1z+i4R z6pXnZFFK2~k)P{N3!apY9n=FNc>XV6>|el$r}G8UD251T`s{cCX5yu|I<+Ezl)!b!}~ zxrX9@8qt4gr!SZ=k5X_XlCOC;(yqXDE@POWge-oh<`>kEj#dV}>@aR;%BfITH3niF zCZoAxJHo3^6y@@5gj8qzTQNBpJfpIXF!I9_@{~{>w5!ckW)nGerD9m{?o1+^rTm=n zY?T5nCQK4Y&@+1xK+^y529W6i@>A@HU&W&d1xfHf`tJ(4R~mGmyb8TMTD`Ovq{Yf& z*AP*>FYv-Sp!oP<2=(BZX64{lcv0084)OK>lp5sG^E@+V+jlH0Ef0omh{<9k6~Ss z@6zuL$9Ul`tCvo2e|C%H8@~&sUpOl$AxF@6Q!`tC;Xz$phF( z5*;;v6s(aemE$}vU}O_fUK3pHrs~vMH$c{A(H$PubR_wHMnXhXfwV^4ovazkQD$#U zWH9-|c?-owY}UjcLjM5`(dWvI2rkNNvKMPO^wLDnScUlEBFE?=wY^nKmY>O=(UG?w zp5X@Jg~LoL#(y%<=XxF>Gs4Oj3b=jp+n^Zz;;g`&J8zkOa=W92Ipwis2qpD$)M(^{ z@)q!@^yQ7I^uMS+CyqZ=5SN@C@oUK7rc~-oHI2*N0u?GT**Va*$%BSPC8!H)zV&Qt z@$Y4U70c(9(%N8}7sQ7ThtvzOWw1L~B*oZ<#Uk|StA6cNai+0^gct>22CLA=Xa!S; zX#8SPOW5|zR`}guD^k8tsaSKBH(<#_Sm{gOe7ezv5!srdcsAmqW`;xz>^N|)_Y z@}&9v>$4>1RonG)a*q66akezaS24X{Ax#Bsb7GL2N|{~KJ{E$0hyxeFa_b8L*FN5K zn4hNht%+s5wP#!jm<%z1&_^>JK`>(x;~2okR7s3%t0&=gZcoX>&ht|?PwQ*eRe2A( zMPG79pqvL%#)53j@6XYibO%a86dcNf4E?8iDi2UcDrr22?cb-5k6N zwdn^?Xtlx7>{?yCxzK{%3AV865JQ7(Yy%lCf+k+enX=?Bb1chkP22Gfl1cc35n!_F z2kgT7f^o@AN!pz-VnzTyd{bp{g}TKreviZw`8+Q@APJTKmpAHRu3=j)sW-a+A`!z2 z{_{L}9D*eoiWbb&0Pb@O3(IyaoLhPB**6Ylt+%k zID%RnCbPXgZanArB;Cyp*a+dtP^*txl3VxT$1df z!yETm@jV7*(&l>~MucuI@14M;-k%&QhqXYmGr_O^ALIy>k_?z8cPb_{t`ycLd|ea` zL=`rj=q*Bbs*Tyw!8_5+5z*1RBy%3Uw8c{ zrT<%|m~Rv-H071fu?&yI;DT$8ogUMg3-aVe; zvG@vxt7W36_Pc#Fjc@ZA76>->o?5*tTtUY}>YNbnHqx ztk~$NV<#OO6?V*uRTX>ZdEYVi*y{(>hpO|uYF%@!IS&e{);G<4K#(*C&;Q3HRif0~ zdMc;9UGpkdE>FBU_A>jx6U_wQWIRA5V!!O90o)Hx`3$b#6nfsT#LE<)Gi~!XMFk*l z$kEb;eVLt^+~7dr+-GE-7KOuz?+23n60VECCCidEin!pyhN<~CGzpuf;;F8Ex66R> ze&;-BcN%4ZP`><)h3~CvQJW4UPB_caO6@{-$&oVO8Zh*Bm_@K&Rr#LCYGXTV8j64S z(eiJr@*u-QAR2LvMQQ3964I;8{5bV1f@w0Hw3PgwrVvRbeb6xyW{@`tj!?%Z_l=Ih z2ym^)ZUAX?%khuA;6Qp3<>&B~x^=PRhU0+VZWRdvN*2NyEaiZ|&m=*E@qlt-azBlt zMo=$VfZKqE+wFl2jm`np(bhy=KJ(9XCbo&{QKg2OtkHqO;Vi~`J8pLifWJCpKCDQ8 zMG}TPxq5;{P-xn`3ubKZ7qxYpwHBt!u4|O*!x@oB&m3`)|S@OB&B&Ed0m;VS!#8 z{Ah`W2LAi3#KvR>lsplL&7%od4u8?kBI#6bNzw4QB?OQn2!fwt6=W>9=X}6 zBPby4uLNLGTX13VN!qEa9(EFXiAfdNkM@2~$FZHS#;eieDHaWLf8=E%F;9EG)t;4n zqNYaMW&6=J)75U3g=OiHbCD#I&mBzhUHF}F zqH!Z_zT}-?U&Hi~A|K>4DEI!+u)2!zfiBsHWJOu{OYj7R@6e_LZV86HWe347+o&YU zV*YwsIFYfK-@2F~p$Mp?N**otdvr{%r@c^_0f9o8F$;`Dhf<8chpwtMrs`)f44uN+ zqqDF*7AxW#vuq4e~*d74Ln}kx0SHwgC?Tvc%FQ~3IvOn-Po!j30mE8NxEe`MLh}l%d-@j5kB7bWx;jEU=VU8XE59qaWA!jcXwXHKv zN4lnCZ__d*i}dY6pAzZ$!-bR-aD@9EUGLdE!;VT~K44@HWgd6e3UN4=AW%%5*gJYI zRXZ~RjJt(h$P3z%#cW)cEt_pvK=8dSC?FOkTGc{Ey_o6yYvv5t_yDqcL59kM#~vZ`KDc)BTnsFh$|AnMj@@$Ss1 zIV`p%X=Iy-QYAswwr^46epeKh+Zqhz1bNBc)f_Nv*eo&W4}J{2bsFBpPu7>y-pwx= z|7)UOf_VwZ?L1@N*dPj(DUXOKA^#QoFErGIG&&@dG#W12!`qu@Zo_bbdF|Qrh2wB7 zf-3&m_*-4x;U>lN6yLnN)#kkr1`y$Xr$}aggFaS@Hu}l)a*qGbyvLtSq?6{d5VB0M z(r(X0g2_LMbD2Q8Y7IVV9x#A#Sv=mIpYbz}S6Zq*Ik}k4Tv-Ye=}sPc*B$;-1i@x8 z$>|cz$HPNU1M6EFb%l$O`7C@5GbIkBMW{7PrWiTsPx>ns0J5rH^YW||{9!Q<7>z)7 zcZ$=D3-XvG^52WLuDKh72FcSK`mKLVmkl##!{%25=Z_!l+xYH+3a=LFyQ$HyXlwH>pKxunAG&mcW3TmE2J zH&_Pz@p~5Q0R|iH?|EhRrG9OR^J?1n_)JI4+EEKttot5Qb4}3+s3RR|f)V69;N{kb z*$X3V^tflaUJD;?zPUft(v|In2BKw*S)g=t6bc|TOqYR|YQHlu~}ET*%Udi2h_kzHgNUD2-2)?Mz6!s>}DOI?B~u^v=MIxj0}`mXlR zVVu89h0^n2+C8*gQ*62M#R5a1>I)I;U(US#Ag~)bvi^lAe!RB!i`5RpO7KMx&*?G^ zPCe(iX4KYSJE-ZAQ0OJlW?x5Pv+k~u@Van)V+7i+7GV1yem6fY4Pignk_ub8JeW;8 z)d+mIZgJe`%TXS`y2WVL^;?n3GE^=x-dB|ErQH%(6@L<-n2_A3sreMSYV1dXZKoXD zMRqbmKIaIfx|(=JesJF3nQ`va1lpjvlD^~FCdN3C?a$HK7_{1?Cm|}akLL5nS z%Wyxu)T?lRu_uG|dGjozsidr0W$B~h3PzaC_=b2NKcA=He|Q|dn_=eGGzY!}39 z87ZOD5`Z~M5Mfkeu&xCM6Dsx(5hwH~Zd-y@VV6xBkR-D|1{J+$b(yetT@Kw_(oK7@u?&hQ7x}#?4t5S-JExXTBn)^2XPm9IDywo6bLyd4-;5E7 z)h|L`M@R4$+&M)-!6m&lZeBW*eUglNP0`=7XLis6O>C&M)*1PLVfNbfHW0J)>WwL6 zX%*Tb>ROV`zXueRN9!QMXvN|ESnzs#an8m);so{?xa<<99L3--6%P?MLIlSF;Yi{J zDJdqQ^^L4qeQ`|h-?wuC**1?%FafvAkzWTo)4htE$xNj9!tY0VKstkjg#_hdzF*Fh zCVdg)aW+o)cC^Trkc-Q_uYi@m)i`9>P76xe88YchmOV3cCRruRmWd@Euj!s^>+WTm zfGQWS@`NR^6()pkZ=uy-l`!a3JygNVV>r;ey~xsnD9IXjEM7c9%qutY{rev?340ex z^{0*RzKv><{Y40~S20pKvPLtDnUoEOb+XHw=d_qkR4K3Dp6==Ua#l`dvE>$DJt(_p z!yK|O6CL%(`oAHrc(H$LlyqWb8fSj`%2w3n5tG5&76|K_k@&}Kga1zY8GfFsJ}|5z zUvlDK2aCq0cVu0k0~~ANAsl}^$?#&g`ieIH>V>lY*o#aeoOlG{p%2sU|uNbD9y8Pw@xN`4K%hB1$Z77-n zj9Qe7Ez5eaOU)B$FHRyJF$F^?pl99gNAyospTbnc)DxX8ZtHnLUh^ls zUxJK7M)HHg#hrVHtt5QNAN6u$_T^7?{-_QnuYFj-cZPxR4l79sJp4S=;|8Io^CA=% zaWgBKCMZ*bsprFZBgfY`t`8Q|mr=OO9+iY!4e3MBSKaPhdD$Q&DK>h448GtKIBk|Z zvkmBD^@;~!xzFXkKF!w1;2wic(+AFnATcFeWjKO753R;V8eX7m);udp7sq>^*&4f_ zq94xrij2aTzGjqBDj^%A({f#2r^}2>dY4lS8&u5kwLQQF(YnsS>^hW*aHSX6+^Ot# z{!a_rX-&CEKmJN=1%L*fE0T=UZL{Hkzz|R?3&OUX@45Z$R%qzLlvid2 z*i9P@CEXOaN<2+&k_FoW&jW;E9Z#tjd#!ZJlm-VeqU$zSDl8f?f; zXWHkiCT)f~^G9pJ^159T3u8}TD4)a$7CSNO+%BMW(`Wzsp_WlDE9Xb*ERBKZW}x?) z?TkjTbd1YJ&X=PIL7<;6Nt|SUy9-FFwvDsb_9dxNh}d@@ZME568bB<>>wbWQ9Y=Lu z8yg!t9tPe7secM^9_+-M*lW1AmB`%J3Kg92l;nO#b=7R{+-8PNc5QF} zU41m*4UYKs>OWiK&olh)7QK+E&RffTaQ%%Zrj7RN$o*!qe{T&Y^4edPD7BULMXA=! zI*beVy&G#Bu~qqhP&?PQCXMq4EQ%fnDUI#v+vd4hvV<>g*Yo-*oS{Mcf&hO<7%>$D z#J!sZ9^cpN+$P^(R81&>%FnnuSEIxj-o5==Ov*>Rn^CAQe+~!qI0E8)}H~7(2dowJyG(safYZRcc$5- z!;ZVs`O0I3Xz}Be8!@)D`FG=!e+grVIPAeUKZJ8!IUTnUh4KO$k3`%)vhyabZ1TNr zd0hCX3-TDAm;QhUT~VC%`xmCfc6vGzg;{vYmRsjD+3Zp0cQeb_oh9gx@}a>-BDA>f?Ka9BtK=h&h9HiC`Kd^?t`{j%FQP3rWlx($-mXZ?>A>enFOOJ!{bzZx6>>*s z_N?6|9jP5d<>3kk?VS?Mck2_omM-{Kbv779JdnkQsj?!IK3mPT>F@=MMC1qNFz&V* z$1^~NvN(3YHcx?`NDh8C+!!$_0*$o?oU7V0V#JYNh&5>Hb9S3=OMTwr_!9}nE-^0? zZfX8@ZK33juDw^bamz;{!NhR~%7+ughR5tdh+0)?ar!|e(oq?YyPbH9x@~baom%cY zyLeuVxdXctVz2iGrZ2654=3faj5&NUEL*SP`CfyC@*4_KQZs*O`{Mar5p(sLt>-}D zojuU<9nU0{8UpdW&B2NoZIBMQ8kQ)^>V~QZl(E3D{g-B#Vk9}PM9W^P-i3s@+y-X_ zL6!EJ>env`Zpp`Su=rbC_M_cCu2PIQU7(b>6sH*99g+TUtH{e_j;}i|Uj@y%Fu{Ol zYqAMcSU9MG{t_8?rk`r!7*x&ws%1PxJG@pBC;}?m&{sf}yM4*;0T0M_Vh+7<p_;}LwBzE5UUwc1>HX($0*I6W0D+8J7 z$Ue_i@bTGgF<;gW8ZDN6ekYuaw&xFE*y!zsB%?LT$^e+eMv2kXSizCF zE-x;`=Gt{l3ba%D9k1KvQyg~u;qBcy(2q8PwG(;y&Nble)dQP3XRH9wG3)f8RvH|$ zDU!Qc*E4D@Ud|Q_LPIyy#$7Du2$Ue2$rcJD3BsK^QD>f{27Nc!lIdOEGQYZ!oIJm$ z+nav)vkuwah?@ZKR+i@#xgSp7Ty7ZyKS5cMcIZFq_s-r{2&U7Av1$<6X&CX-1+%E+ z+plK{T=v8AfR(ugpWj3j)W~3npqHRnw4#gxHQSK4e+bT(bR#$!x8N87_+89crF3Z{ z)1%)T4yVScWGuG_1#J}8#+dOXpG|tCbE&Q(NYPbVz0nfk#4}G0sF$Ckm>y`_tYx#D7+z# zn4CgW&Ws|hfgA_Jw(Ms0d+20qP5p@VzY1l+J){}s31umcpk0gqdFl3JL^w|Na7G>7 z>Ex3*sRa(M5p6dw3A?RtOA2_fB%Rbg9>C-oRszu}G+T}fDm3}x7XU>W{xt=B8erwuo(Qm~5YNXz5P2k{coG~B$6-)E zj?rT5b)Zq8-GXL%c{?yl?D}n!h~_E z`ID=U&$N1F{6mddLGJGT1uP-;9=39PdorG5RA0!vb8$J8ayFzl%zP#Csr*@p4*pEM z%(lTi%4?WOcsND|La0|1TLHWo6L3wPJ= zDB{34F1?AgEem(`FT+@LYvystxeuLJYzFWJiSP#ZXLx5i)_5sy#!O@OcV{-Nt8 z0biIYQ>=^0js>?-b^m0$JCM_!m||;kV5xFXhW;6?@fpYD?GRB{*bO1Eyw}<)o870$ zO(gZ^1Kkux9W9_Lz2V)7{`?BaL30l8YX)8hO-i@6j&I|b2dKoK_LT7Mx<|%!Lc>A~ zekXr()cKu6lryelfpd$UOd+t+XiX!X$U3RD<7IzYgW4B@<1C>moXeYSt6o-bHKbBh zdu};@>|?p4@fTARXuV~%@DHN!T!tnP$w(7HY3210T210)2`PzD$YT%hSV4za3Zf}- z%GAsZBp^C{euSEG`C{z_^Si;sQJ4y)NavL7eU}H)^aF*g`5hBr@dP{pqX77B_y!H9 zsS+yVE4yXq$DNv|{ooS}?3>^)^c80407HrmuU+mD1~segp&WF|cB=ZH8dBZ^v#fY} z!%Slecu(!Y;Yd4m$_~p>qbu9il4!MxA$n$~+~v9j)37r$ZMiwKc^SxdfuxwVNUlby z<15W6>onJO`K!P8`fUQi{~&4GqF`tgyX1 z-ZAUW;I$g-qNMJR$u_=iaqJx4`DiJbywGww3(+k?;!12AZmTrSr6Ami&yZ2wa!UT!NQ0l{C)P;V`(6qjiL zptlq(8%8fi>~`V#P+8_jRKV8=R#Q5o3~l4Uv_uxJLWxwAsQDP7Y9!wYi=EM-s-sD6 zFoVI%P%)uW*N>em7qabj;;U3384LwX0;(S;nuhZ=cC)jB>A5Z0->jQ6epiGVP>3e& zr>r;uJb$LpeyVthgGo8anWfFr2^PP{nal{vxo?A85UpDDZX4}d30ED$y;3g!T$wF~ zn-y2m0P##IMeI7UxCbbp&dP z+25{Y!|sM$*Wk25zRLyo^Yun{8bMS-S1aW}gvgRQ5*70|XGMgw6bC*tlQ=-C{c5Yb zH0W;>0~dUk(og~U_a8D!o)O^`xwLf)#U7^%`4vjyJ~bL&#gN;Ymvkh-m(ee=8+FDa zmh+RXn||_LDQxt^tFQaMsKN4}3TGs<;WPBh{opQl)TvvsaeACO#?5`!&7xF_pZaZ$2DfB_(byF({ zIE4ytGKGIeg??R#J@j6#Wu2fJHmX2)dj?%xUs1&e=Kr&3R3hv7PNwGD5)`>-LJGBEAiZR5nsW{ zR^NZYGaKv{=-`v452}+-%@{4Jq@5AE1c#}?2(Q4P@m>EK$}If8l=Y{?p~QZMbfY63 z#}k|MlB0(1_4+?*$y4!ce?Q59w2nWH&j`X*hkI9fHtf*56UH z&E-D^m3}dVYO%CZrg4jpr&dY<0}l?=qv~4K;1D zos(%=_Mg!BN;g;WQu?AKZO`uF-Y1bRC8Si`z-=%_=kwW%xJEyDJDFk~lgr|dO@&T3 zBTOr<{g6ryBYy63u3Q6>$-Ban@v8j&oYc^Ng`fk=VK4!u;RiLyCuJvhS$#|+rO~kG zAkC~uFdo*1Dqp=;?PkO6Q4p7-AOD(Tjikw@1}$u`&U6=ES}ExIVJePi7%PhS*3 zprz@>nKK*?-St;V+@fkrE}MPWT!VLFMUd67`-HYrgvN#>A6}9wyr7^kJzMrmd@!znTuKylKm; z0kX*#&d{dK@#6DN^qw98$LB<|#ot2#_qW>dz!rGrJ1?ZuptL*5EDo;?d@Uvt$&rjG zbaT3~wLtuONEI`ZaaWEfBK55Gf?B{bQl_F&`mJB=NFLER*Hkx6=X(Bs!mVF2ayl6) zIU1i?_oN)k-TK%GR~yuHCps)3VnKWvu>zJXBs{?hK!TP(LE{91cYUf)3NIm{7Xko% zqz41BpU`c{kC@dNbEKy+^}{8a4l5L!TVXP|;*bjUK(%X2vTj`_|X zulNnigZ3^IEoR-(A})Pi_xT!p5skN&(VqQzWfAa)byeHSPcYt+8740Mb+30X`T)sr z;(*lp;%wiE6=gU>-wy7$Kkgl|~(yu)95NLwb&z3Cl;#5HrXh^&9N>?dMm2 z2~JI0y?N%;gwFU{JhVsd(=UWZPlzpAHFUPuB~t~czSmJHy`xwt`IzHr4Z-0WP~>pS z3AqEpQk(ms|6++(CjZSZC;8(rzdrGuC{GVb&WPqAkDFUWpywMz&&;f=jC0_24gOmu z#v+Sm$8l{-vlJxPK=UA_N~ZL6OMD0f2vhNU;B_)A4$gnkf-Chwtg;_PuJ7FrU-CGO zR_=LUeERe6N-c zezSX(&qnG8@FpSVcPjyakbwDXNf)0>#S9HA#MC|CQ|5#BUG=+X8EK00k5ossI!N5e zoc_-jZQ3+pp~$BAab;9*+|m*&>Um)}URzhBcQ5YfF(z6RN8%^s$&z(`CC#Ws z;sIsFakNL(ua&#Lb@#OAS(shjlX8({#2LabMQ5MMi#tx2|6R(V?wQ%#V^*F%@86Wi z!vzO*1H~*Gez`e_j5&2fYiVV^q$s^m{8pxc0`u@=*0(50MPf%u$dPP0(cag^@KaJ% zLX{xSILy)Y`WKKiqovCXIjrXGKATDfji1$+sFwT4ev;YD14xfKZbab5tVc+!tNu%W z+FAMBU%JfA%h4nz8d~jYZcRjc2;7QXox8i=vk|m&2_gsVDsrYD(O0+TI0=JEeGmA; zosBnj>+VpKl+nO%t23IU1F`_=Pl6o7N)~f7#s5r#bD637G+uo9Iq6x#QTS}iDN^0)(ti_0vKOe^ zwoE@Iv!&peIK9A&-1>d48gbQcgM%aE8&SVu^iCiN${JmO7h&fqqg!k7q-e#BFifP3 z^?C+!UyLEWI|;kqikPWg4)+UvGvD-!H{wtKrM<-FHA#850jE}Lh2_F;!+XUk;uVor zJj`Zw<0jX2$F94f)Nda+8S9*9`8-%3uM?Pj&^K|xu@!t@BGq{->fJXf_WNYi0 zJbK2yWKjLwMzyy9HAzrRW>g_8v4%FMDFL!a!|M3tQKpbLx;n5Nk(85-{w+n9)ryni zz`*({Z=g$`O~x&fk+qlRGAp(Q`81<$`89%HseO)Fq37AbA{d zRZ{-6=V+tDiKLtbq1bptO|{ZuB8Wk)YzplH6SiM;FBAQbYxpwSJ$_3&Ck>f+;{B$j$Xqgf-LJ2 zd9}ueP7pMfUfq~#>WL;NZY4e=AV1kW*~z7;qjyy%$g&J+# z?6A0h#`;f{(A>z_8~o*@dPO}}Ywx)l@b?Z5#Fbxqc?Y+KlaChs@KWtaLlWy9w$(Gn zQNzh_mO9}TFCs$w|81U*@lJ88O6yi?bfO+oqgWdn967y|suTVTMh{#0JI7+YqcH@p z;FKzpQD?QslYJ$?k?QU?ey%Gc7nGn8R775jY|Of}5kkWr!!JWX`$~+Xi{GOVF$k;{ z*&QOy+NuT3*EbzaQ>?5PT9y=TqSs2h?+qh^-hQRAy|jSD3qS?(vfBm*pPm%Y$TXbV z+RW$~mh#n<1Q1*W$`L-XFq6S{-Tou%A@Ie`ok|??j_FfhqT}Fo#uz;1QH2a0?6DZR*ad@pf3UwBg*=bYv^52iEwZjRk`Sl@*j%Heht1#vLNy`ji7%0a@wkH|jO z!)tB}u7|YS17WoE9uo|h#Js69zD6MHgE_r5;x_i@vialPF{ef##cpn+3EIZ*HJQ5y z7n)Ame`g$JGr*CTt}4WQR>}O<7J?A5ZGD=Hoz1l5(;{|DlbtxFlog zLyYG2Y$AS~$#SXIN>cpBjOoAh!iZ*+D_^Ri11^Rz*c6D)xBB!bl<7ALW4>eQK`#)w zA{GjYk4HFwSMxg5iooF;U?cE-o`;i(z;}ib4GSv`l|Kd8sP50o-@;s{^*Q4xs>JL= zWtM%*N{HFK5<*0gn6rL_oAwx&Ol~NpdxX-0IV&Q}g>O4{Q8vUqf)!R|Tmp2D- zO^2v>oKXXdIOt^gPW0|r+|p&#%!*WuhPH%RK4u6*^8ktYN*N=$jCVNeFgJ@BMQpha z6;}1nl%tQgMaBg_=KR)KGKF>tM~zUs)wlofZ?Jh=&2VQh85G)M!F0M6_~tXqCDQL& zgm@1hpg-?|AfxtRE1AmM2P6%K{1o5$au+hmeN9SZCup>>_zLmHs5@Vd_F9_O+==IK z9A|h>3rxvG=!HhDPO=+#LWTTtqPmoMPb;x7o=@{8Y}_2-Q)^W9Omo?K)0l(jgd*N; zPSzV4Ae~uirD3S@YRMt*t&3*{=a1{_f*iMlj@UE5CarNTVW}KuF{rAWH-|KV#P(Ae z**v8q(kcUijb<|;SkC&;{W)9VTvr?j*^z^wv3RQ?$GWlT<+nCW7wRlZ1vKyeSM}Un ztg$nf>UYCLu7?bcA)gB&J!h9P^I|eND*KwXFkMVIUrSp?C$?5S_cM#}|5xxpu(xhAwD72J>Jtg4U@0o3bXo?3keGL%6=2Td0bXq(v)S zglfm)%;YO6Y#=eq4+sJlt$G8lr~l<3D)8eTlE?zO5XZECBVmnWmip!I1+ZQiLiYxa z<;dvxxGav~A0XBYeH@atSH8I~ocKW@C+8xEQ_{-U787aVf%x006R zW9MqN)H#n=k`4CwXI&4t9LDwX1R(qvX%s79Y$jcXMbfBR7)Jr2-?-EPW|Oiqzb5Pr zbQ+hy%}$zl8{{~pa^TX}V=1IleOUS5(yD*KZx|hdi$3Ln1PD^2niAd#4ZE){cnI?y zip)WF_q3(-f^svu+J6p5!w0}am)=TFStk3zea!9ilu@jAAYyeYIMXm@aTf{HXgxxf@oCP90l+0j6R2G5TlH8 zkM<|R+6U&#R(h&{PMMgfg`_FPa4?PfZTV@ui;d6J=e~wJ z`#a0Wn?a>(p?EUhPO{F+Qu3KjqL;7u3ScjD(SSv(&(4!?;5Z&FdJB4(m_H}-sWfpN z*YFR;iyC}3S%`ZZ04OuxqTRB*VLFn@#8`J;xdGjqs!{=SX}>|{VMjcT5eyuuUD_E? zv7hLv4EoVLb*)xDr~Pe)cv}$y$?~5NahMh2u$fY~zMJ3Wf3&@F{8a*)%b7i^gUV2k-~t|bg(tGe$Uyz&^&>ALRoPJsCDi<_TJK+Pt-Cs z-5pGQ3<}j$17HR{4ZcQWwHpN;Lmd+Br&WRoA@Q}-38xkBKA3jl(jy|4{w&)4O*@p9 zARk7)MbLudNuqs%KYpNaLZVIeE5*cwYl=OD_)HbZ=Km`uWf)2Id$Mk$Iml;UiV`OR^)X{{U|wOEgDX^Nx~+Gg-1BXVR1*85M%Tj9n~G`qlO> zk}G-+K8qmmGsP+0juj`}Za1stv^YwfjWizeIk{k%5=A49Q=6~)LOw05 zzXT?AjWJ)(V!`bW>Ls8Ln>i27lj4Ma=+lx519h=#)AGb%S**(x+WuGx*>nxgWwB9Z z@tTcTHzt$n(q4{936!*GQ-gu}?C`e7OE2Uz**me@4nF6cQ46ZInC>v2FtEvXwE`uc z5gfVQ5c#x6k7dN{r^9nbu`nS%DPM3oVx$<2xOy4TqK2i~Y~+u1(T8HBFCL3I;)KUy z-_H;_0D8)CtxqZ(`Pj;lLYDhT2+nq)quJ7Q7!WVCbS|1?nBETujdR1cV%KB#9%=J$G)RJ6d!kZ9b_g`!xwiRfvE#KNr2n zOvZj|4FE~zwzuOkZIUHpi*l_Pio!2@sRBxX{QMZ5Z)(5VA;!1XoqjmqKzE4iXdlgHx~Utzbsa` z_|@5&l|Fca6XvtG6TjbDFJ)@0$GhAUyD;NelD4ERwrdICOwW}fsZWMnb6@3+lRTIl z1;`sg8dM0kfdwTRRoA8N&P(wG)L73=e2Y+H*u~fs_x~?^TqIS#{LVdeBt%{C9ni%eEFF`IMg}0P{GnP(k7W>Z?0)OzZd~hGwdlQM(vQY5Q$b&lyH$(?gt|#$u%N;ZEYs2fHVn{unEG^YLw6 zlSgjTd4wodJ4R=aA!tie8c%gKOrb(BLgF4Qi8DRu{4<72QVjohw)Ll@zkgM554_wOj#280K9 zT-vi=)@z-CViS0&@;rlUH2hq6!w@`9VC#u)2MdKSMc&keMZn8TJ69CWH45f$AFK7* zf8XF{FTfZ6=m_&rK0Zpci0 zFD3i)`}G#v;#FZ$5tI}@&`(A6|F1`))NVZU-{}XNgpBfjz{t&vIC5qABm3!yb-;7^GUf;cw->AJKU#!8` z_Yd8FgGHcg$C%n#Yrzx7S>WfZ!$EI>_xs5E0{4=l|65SyA6x-1RkJ3n+4Y(6xJXcT z6Lx)8JTd8%SLTm6i$K2=cp@Ac?|mf^&GYYMnEttL3wlSHog!aqrb9qB5;RZ?ZoE|U zm6Gfg2Q{dTLgx)sp zHJXo~)vbpB$b;6qbLZ-RPdZOIF2(}L>Ad79+&l8P?|pn1JD9gXN_%}LNoG!VS|J9r zCF*rU67R}zz>Jr861uND+*Q!oq`)x0{{Q>cjBkDV-vmH3j89?Y7|Y$aB{k;Cp?ws{ z6srIhs6US-$koliTdyO<^a$Hy7f9UruP`3J+AA^Px8i0|zT2=9*gGH!)pR?t)caM? z1HT73WAVY5q0TQQd49rgzH4KIvikY6_)6W!CS(%+z|3VDnf?;v{wRJ#<%@i^5YamU zOoT|}k_nmVJ!PKbEz(*oKC7SE@e*Z@bL(?G-X)TLF-LLS#*BJGESrTmqt@PrTmg3R z(8zTDlUid%OvM@B*e@>F(!BEl(BOZ5h3i{CrNYRzEfi+TkFTzohyJ-ZJ8|lS_d1Gr zl3Je%`-INnCVRY1b9JZ_OK6 z{$whScRDqNqhWhJKQ-Ujdq_Flt<9`V4jc27y~*0#1Q!TuYG}NVy@05Sfepf=& zc+3~IZc1@$W4X;cS8PtsaHSbW&&V8qN@VNWEaEsd3)8v9kJlojMf|iHB=5paC)PS` zH571ced1*hGG#V!q*yA}x-n=(EC#ZG6)ncWGt2TfgyvDZ96=c`sS7-wd{_zqw77et(zHyks zNz9|9rozZbm0Rx*!i>4uL9~nbMIQcw^to4qe6nTDbpw4O?cpLoNj9=iOri{KD7pxA z0v9*x2LOqe$fcG>)`SUD?uLB{xbv9yPyEQ0cN669Wn$@Sjo`_k{FQ|&?WQIecwJX; zF7So-bjfViHjQ6(&ZM=tRpM$hV}Q298XNI$xTse?W)?1D-ZcPAJrT#^@w+j)6Tl6ZkjNy(mt< zlC$h-@9f&wj)qzgnoN8D!l!(8>w7GT0fkP;RuS4|MD!WWc29kFAz5 zcD_gS8~+W8%$LafRimJs#-#m%v_KA#GVK|_#M@WczSD1HJS!w>?wDSOw zZHx}j_avteSn~4q9eV2Uf{2#jJ6nVDJz-W~(yg}U-p7Nt7p`|pnU(g*$P=dE<4;{& zYLWO23r=zYb0ogy3!ShJQ9jSKlARm-7+s}Cpf~oVcIWWmPL-?PnZrXZ9>x-h`PHc> zt!~j*<=_TMHl@L8VukDF;E=E{bo2X~WyBEIpz$h?e0MEXgJK?}(wSW@1t)#rZs`Q* zxYJXtO=y|{Yh0yc-5p6c06{TRC5W&-p5O*Q4q#tzoGG``0ItxeWCsXpWk+(+gRa($ z#l~;a(z>7?Tyhz;G86YSs2@uGz15~)hd{57V{1G~P#u5}OCM^Kp`|0=JGxMpKO#ZS zW3E=I-Vh2^u#-b53y2uapb`+Z7HkX(2ul`!z7Dum)3ARae_rS2MmZj&ppu{6UV%`? zJ$TL?^*Qlt)c$Bk0MkBOczX@|u)V4NG=zH`R>wFFsQs|M#Puid%629v5~sZ3rx@#x zx~pf*wp7Pps?yLYvDCo6DCCw*DHynkJ^l*tSQRKDlv6DlY@F=g7R4|M#a=AZX)qPI z_%TdHg0JuihoHsjuUa)RxY0Hu)O`0}eA4@`(meCcM@;Ijtt8vH4EB;+^M$is+0@n) zaM;#%{hTG8_Oa^b(B#|b)hHd?~VQ;o94&~~i`i(#Z2Ru$;Be6J`$N7BdW;NCA8E$#qBez}LV6$Ib8 zF@1I~7ju(Vrg2RY!<9WNKgDn~Wc)G|Rk_3bMZjFsSJ4cB ziQcs4n^D__Q(oYm?q<-lqww2<`Q7DK-Q;KAD;u`coU={NpMcGa>A6NH#>n^qqoeco zYkLcuI-=aMA9DxJ$35Gj56^Fx-BK+-Ac>X}+4+oK#Wt;?#{wS8;jX=PImZ|G?Vbb) zpX9GFw~&r!c#5`!iW_MI^QJ2fpJH7Dps!wp*u|r{Fkw`qV`*C)R_j^;RzwUzgrhf& zTH~p-vd2)ANKU))E_IVB6SgH>g|CUzI~%sr6*^j71K(~KFPD?w3 zpNYtC86*bZ|Z1TaTl2R<5@$MS;ZQ@+3_PUE0Qs>;gBac8U#SuQHV z?%{!_fTu{HGyd)Q1Yt)+w5ERMuyYep@wDkjHWH)G`Q`<8sJ@j z%?c1d>hOW5kjxQ(zBjw)qmfF85*NsD<6c7c&9@ky1WxAkh98q?n4SY20v2lN4c28& z?}t^MrbzxZx$y%eXZC77W&ia^lblF*8!M*@lus}r4dK$4C9c#!H#{)otkcG=aw)^5hct;^}(K2s+!7WVR79kzc%NJ=ixyBtP=r1tuccWU( zje%1(Non7!TW#E!$wE(DwqtL+heQ5EvO+HrWSO|p1E+sWEn#Qy5au=<`YC0Ml9|G< z@f*t9}>7o-SFIaXSAH%$2ZTXfFC=sEc6&Bp11xL@CRyD=I6Qz`|@{qq}8pi;pc!<&p$?=jJABb2H`~Oh(PvMb$ zU-U2BNXO{dwr$(CZQDtA?24UKY}>Zc>2z$nVxRi{&i~?l&vS0hzNvcZsjFSJ)*fq) z&m7ab2z8^9pI5Q_1qVUKTy!suwR>S8xp8)AYhsGxM6wdImp(m3pf5!G?kfiJ)%%>T zd^X-zk|{z7DBytbg!3XhLJ=^FTjcYaHs0*b0%Z!1CH75@dfrYCUvWN6F-aDq9-l_= z9k$lvTxb-r@cFKM(T~*_P9bRr@q6$(Faqqd-P-W-bltKGy3GvqIWLOsQ#h+eD;HhG zHOYLkd@(mHY+^x46W<>%a~o^mtF}I{9#hIqoogiFsifDt^JkgGL5|g4376hvjcRyF zu}=h_Lq5V28u_EpX(bM)GM47wY%x@Lswht)RKAZT_znSskTN>;Cuavi6W>Q;+dc)eODQJv5~T;d5ZvKG9^&m1 zTr@v{rfIg_uJ~GZdTMkUFxu&bf+gOgf`hO{! z%}UN)4IbR=xE7l@-eJ%G#@7<0kEI}?)Gx{T*%75+rtU?T5qv1(T^3IpH1a+CzrH{= z`&$TaQd*|{HIHn)UVvD>*O9M3S1?U!!%-i3ltuvj+JRQwbBKXc_={8Ee%r@n-1k4V zdhmQ-n;?-(6tbG^W5#+x=^?& zdykv7qNdOa{vZkYsZs^0zj-dEHsH))&^TY`KpsaZKr4bap@`Ll%aJ+qJYdCg>`Sn6 z2Ny1Fk)t%E6L^gHD$4xB*l#B7h-mJ3+t)F5-Z_ruCcD@+N9Ez_6LJ}PvVcXC9)O7 ze7$L_a~Xz{MRCp_&bm?!WurX>3q2C#CK9U{5p9#-Ij1twQhU@9M77AcS=N}){KHOO z3t?ol-kor7dTap90olJXfi=S6k3D_2w`K}9^xy5m zgwHfL{Z0H>@Fax&TqS{80IDP}OVZeXl@BQI1;6W<7zH&J=gVe|2$)m02en7VdOcF& zitlB-S7E#R`ld1Kv&;dd#O?>0`(qig(6SKfx$nuro4#qx72tw^BWYUOSiKMq|3nJy zD6V7I@5K|fb?|akBVhZ~1HyBP9^UYyORMU~A15uF#WFp*wvc95pA#(&Kc=Gn#3wS^`U z5~ZMdIy6`=!Q~iwxwVH3&?Nus6gaUKTjz-d6c_gHC`Fc@EVL1EskZr@Q{m1!TJ9nR zWAi-e9@=>-_w=KhE%{2xw=W*w*goNplkw8jgY(o*obA)sj^sxidZH9+$s32oER+cr z>bB)P@|)2_9o&g8;Hjw@+$7o+BZB=GC2nmxJ+ZlLAhzDvfKO(Ok9G&nhWmf)G0Vrb zp&O%xf5uH0i4c$Yd=2e`! zH=7xHnzP{Cery-#g)wS2A2o^;BSlH`GDZ#N?HYlS@fyr%yl7}}E)c6R8BY^uOe9)e zI2p7n{>dGhwRSN`A4TJODMO-9!tk4I!rIQm&UqY~`6SM-0-Pn7$`R4RnF_@iqzn$k>j&PcoFTW5DlUKm7SAX!(sX{K$rc5?dzh(>8MKd)CZqPgR zfefs$at#;U8#`3BN^w8&u~Sa4ZWM&T`M#4uT8HB{aU!~tQNTniVf6hgFfli2wX-%mu2qe;<=0*~|I z3X~Lc+*d#wv(@+XM)P9f2T=B^e-K)1YLTq(Sdq0*@d63!w_r>UdF(Mvpq~t|f6y7- zFH13(IzsjC$kT|)l#c@tVCdIxS<64|TRFkHJv}#zv0yC|OJ(>=)7zSb8E7)YS!UwD2cfXkUU>G`r;pbwT3>-` zgYFk%dVe*rPHnyILm(^-)E-!0vdw7s;N%R!YY7}&n7eZKm2!cNyl9;}4*g|4j2{@w znznbP+@l`wqZcZ0hVuD%{JS5|2bxcoys})8kmJwq3#a(H<7;Ke-a~~7`K~gBiR(p* zmS`gH^Zw^^mZV9^>gK=U#CMkwQSPP9A20&)`#xIGD%rK2?XjnPQB{xsT+q8@bU%rA zRJGvotyFO~mQGt-c6m=_38sD3&-`iqhbk*^f_kwxQleC@mcypIsHlVLZPzlU=FIfj zhWJ-B2O0Y5FE&W(2t(ms6WoqauaO~`ux^2{y4C=bjqD6LocpiOp#`6#6gXp8Q)aW? zx%yCr#WNw4>`@fo1B`Zd$?5b35**~CMSD293>=6DF@}wsvP35e#$!HDu`!0cthGw1 zAeA5Rd$y*gkR5k)K@=O7*@GtNDbAO4m6M10U1dnXvcWsA`wlw@gjcS>`DhJN6x%V` z(S(Ih-lw$g>2TH=5;nG=)p(PNMM&-zHx{@!%)?Ia$#i~80sh}rFi93l9do3CyKRc?^<3`g>Qmt=R42$ZRE#+UU2@L9O9S9_(6>-F_#)qqc)cF_TG zlp&zYqKY-9Y=<+O{Cx6K8L5+*ps%e)QJsl{>a$_L9S18|J07T|)%Lu|th7qvtP)W1 zpoTrM%NgMH`~IS=3p8I!1@zO9ggZG9PJ9!ln|Kw`y*z6yZGCwHFzHlX~n=Vr$y7V zo-7pJKNB*EBGO&9CB9Wm-)5i9lo5=odz1ca^TAc9Ca66|tzf76^*Ul;wh-r_-yaKN zRQXG=DoI7PN$Q*0g~oVcxf;F&8vDh7wnPyfAkyxSJAd*_pRhlhm6Z)(J3OGlJm$CQ zmJ&vxJ-i^=nq*XEO#&pFQI<3yc#}tm*^fG!Ol4+C(ugr%FLkI@spRzg#{OHU-qruR z?fG0jSHRw$0$Lv$xVS%lG-d{OwUns9dw1heBc?_05iSwHFf~aF9}bILs;E<&J(Qbv zfc=f1+?}EmxWIrH>Smjz0^`B32|J}Lm_DuH#63mbSdx8r%q{MyBU}~Z*NPB%D-wDhq!o{>5NYXT@ z2HfL+&4w#Nf8+zd`U&(Z&KoUZb#hi4|nBmRBaL5_^h#yZpoNqx2Ih`=M;E8OQSpeUo zU-=y@ev!stYSl`hT$66b@)rlmao_g5g!Xwn? zHiKh%9YKTiA#caqB?bCt8opUqKnJuJNwI_2=`i@1FcGE?je4RySxX}kobas}*J*!O z+|7cwJbG()QeOu|^Re-?fh@xhsbFwmQtI}8C={(Srkq`lHUD@-ReW0qG=uw-xkbRL2T zvI3mq7*EvA*b$l1HT{b~b8eh|>R#*WJP=E?+i|bHL>_FwnRL3C;r^INP1Il?mOlvm z&fWQ6dimYiGE(9ElTwIY_lnfrLOvaDYm$TqzfSDWp6L6-f$|KxP1;xpo#I~DGzooc zNN(rk6s`DMiiHjuI%DmWNBx$Ky!BE^Zh5J$Uj?M`zFO>`0(;m^ z+;KhkGbSDLzFp$ttGb^x(j?Td)XEY=quiPr}5rU&?WxJ$s}ZbtL*Hs}XCvGjA+e?n^G{p){iA1KAaW z-fWK6+_~-GQZnBzl(rNz+J(nI5k38qPBDv0aeh>UtXg7b@3+n+q1Cb3{wi^b#gMA&%=3nHt4=CRq#Jm+3CF`ynmBwkpv5Vw|D znd@=YbZ|5Uu1B@S`ki%*VJm>lyd;2+w}kUZuj|_Gx&;<~{WfRh1OR(~@%@1G{^O!HP3xs|nY;wO~14?r^2Q!|$Un zH-o6E)VZ}7q%Gu$?Ly>HmI#rHVPoHtr?Rx6+X9f|Qpdji7|&Y4(^<%CR>?CGV96?8 z5tgj^W-G!~(ygG$ z%==x{-e80=OgVh>N>XGSsHRX+e4eKsn*DFUKK-^^B6pU8^=;T?q9G>x$7K8xNiM4O z;xQ?;7Dum=@ctE%PXeI9o4&}(rol+w^(BS9VEW@5HK1EKDXw|0&EIMY8Ewk&XQctd z*?i>nM51_Dngc&F#D<8d^&3O?q5nYIs9OlN>e&|sHUfEh(G;73g-Ql%54|LC!4p*EzPvze|Rgc*6qJ61r3gou8Q{L8q?*z za<9snSkwArvhm-&NaXp!(f-iGJ_6=O;z-Ci zf06_6@8Rq6?Vejj7~qqdEDr3XG5j(h;mV@(QRn4{oMtcKyv+?R|C!X);q| zQd`K7Hh;f4narqWC6mGe7JSYHipx`Ig?(RDm{hARVptwwLq{ z*b1+C<`S5Ehv^RFskTe^nH@`N84cgf&6KJrAt85NrB-K1{D-jCcFJso)L78&oP5Dq zSf<9!y4;FSv8)PYE}B$Dn?WDntnQ@(lV{53Vhbjjy)5)B_NJE#K$TpL*l=#zWg2@C z2HjX!+i{Q-VKy~wdxES{qIi=X@x2Zv>(U(bpLFN#*@rLe?fJoDu}#l=~jr* zZ2tJl0OT4Xcf_bj9nX0P9h=?JUu)lnD>d?{{K>=KhC16o%7d#9q+xWRY`9Mg<{FdB zwUf{rhbh8p1W84{i9|j)zZ^5-^%&<%)i4n^aZ5WvP%D?vS@XO*?g>t2YfFyn9w}GA z6!T3dkoMXgby3O{jZ*9@CFB;lo_D3ja^^COj+1sq%EBo1=&kgceTi4kbdc|TU3ZK9 z8?jO1w+oN#M!Q%;u0fpr@keB^M^o?ZNp6)D`%;!SgMO++Yx2zjil7@^wokZW5-?*n zTJcCND;u;6le7`Fc|@{A4k}$T#T03sJs7%JHmcVaZ!X^;d_zjACm*cp{vAYN{vN9&B|4?_M^yg;EF<+7N=_@&Y%Fuk9-ly= zYN9B9<1cvI_!>)P`g*~Vx>`sfWK$9R>#va3$h98{pP1K7=K$)Mwtz=_f0T$&G617c zqv&>>pa)wZy)P;FM3a$r-1AB?4qEPgLICQ1I8K2)&On60YFwti!d#Uq>45v! z2f5d%X?czWwkKuw@$+)KTp7lLbNZ%VncqZ&tW zr7SzRnHsKjD}k&h%$j!Sc97utaJx|v+C=4mepM)y#tnZ3YK`=JBr66+-70_x%u9LS*@^9rNIE?m8(0ah4-!{FYlB9y>uo;RDD8(k_MmSe3EkJ zW{uSlyJH#5kL=V2zo|(kmomhJ-0PR!fe3VZZpd~DKKa=8WHC55!>(L02_G^=5}7eQ z6!x0b4mOasNP*OUkSf8Nz%^c0e*uBObM`L&{eCzaQ(8u*z-Fn!y5>I%JrJQoAgHOA z5ZYyMcyhTGIivIEj>-+ngo@l9dsnL6J}hTqrc-Q)5JuEKqGm3j*CWIzu3>+wu7&)> zf=yZ&x4kixT88U4L>#aqjNBH@n5X(}Gps)|cGtTR8J!}TraHrqyCI@%-792(oU=*p z+GZ?^9*$!EM8bTUdSO?YV^>b$VaKhrPSTuI zhyVDaRJKR95v70*ub_)%9W(c)Nyz`wmr&UZTgLq3A9z!*jx^<;=Ieo15+D{>_GwRFQ$yJIITZgIn zf^N$ve?ph}ilrjvbC*E{jPAp#Lj^v=M6@_P+nll=*@%~BtBH=`9kaUrKl6l4sQNi8rNUoc~S z7F)YRQGf8ZIdF?VXEml;O=sM)ktin-r^+3cQybUe%T=BIkrqk=Xf3*!1gMq>Ar8=c zfY4|}>w})_aqsr2RB{u^Wg?ixn=JLoh9}fY?CSZ%4y$DvkD^`P-AFiexr%eWlRSY` zzt?gcv{J3EPwoDAJ!s2FoGe%*M1IKG78Fh=iNwd9)(e&_rWI?`E`*LEkAW>bbymDmhQxy=Lg6Vp%IyGbpM z4YSSp4Uy5p0ak`@1kC~$<$;c%l=s65X5fFH@-qgzB7gL#U9ge}IG zmQg2==>gC@+>bOJ8m3h4@oR??*xPHJv%2TnW87=rCsQ3EN2B@tfdem*Z}%iBS^t53 zj3B}G^~y1G zYHly>HEwLLz+YkEoa7sVL^QdZi%MVVloIP$jy*W+RE|2oFWNU?-Vy4cx4?g5gC3p) zu#kR?8Mp8Y@46^QiG)*z!}_K}WJKM&AaWQ>2FMn(nZpseX(f#5wAZsJ5;0>mPjNh8vwQm@LPrq%Bf4p= zlAOqtUEbWY4GQi`P#HKq4@Z5dye=YcSo$lLnOvnL9E6$Wi1 z5GESI`f@m$U8Rt*9rCf2sYVAW5Aa|9B-J1oG>I%)C}bbUZH@E}$4_T9&kv~9@p@#m zd=51uj=@ggh4k8=iqTv0DpxQj|5sEws@)Ml7%4);DtVYMU5H~gZ{swgzdMwns@Fxw zneJ-Ra8zJ1je{0D2V*?ff8&qa_Oo=)M&w&ScPQ))|2CZpTA|4g&~0pKC(nEn4H7s2oUKf#NP14eM9baZ>>s&O=baHc%lw|X4AYkjda3K`IH-&+-W z=S@&&CrFV82hO$N3)-!l9uZXA)50_eWdQUS|3*I{8sTT%J}vC)qI@w9oOT4`?h(cW&wZX(bUxf5UMrs4gT|F{&#&4lqH_@LRc4Z2^1h&;eI2`~j=3_=W!&zU@%fcM)-MBW5hrr5${FY{z$y^J!QqlSG@^@~b($kn@H(@W)^! z5G`TZNA$AKi+u7P{LxHe_~_M3SiqQM{qkM-gE{$H9vTWdla)@tEJOG9_{-Jz6i)H5`H`e;ey6o+M>I@_v3D8j77{7xJ==&VPOy(gVnGrd}snqoK(dZz7^AY2l}x}-HD6mAk~ zsIBfO>`si+?^+=|V>JLPHk5L0SyhlKyN>bOu=pw1z8~Kr6$Iy(#R9~7*a9W34aEr5G!^*=rh`Z0HY=)q)jcO`)b-bAx(jMqosSjCil>gCPhq+q*!+9zI0`aI`G z!fjf={XALr0&^LDguG%et&VFWm!?O~KZ@(AFERvil?gNdoZ)r-j5c5oD0_oT7;$pP z_>XoQJiJL^wf^+qW+s&SdczpSa zL2oz_I+WKScQ`R)eRsMPol6MVR*L$X)j$5*9Q9);_F`86h%Abf$}<74fFEGueVx?@@)n-|neJm1|Ym-H_u_ z%uPkEK{)gHnFZWA+l=5Dn>Rsj7305g8D~>@($1hRp1kjv?ULRm+`jo>h(|v$5Lyn- zbbGNJkR2Z3+iOT*MPv{}Vm*jtyKwuvvU zV#Wc&b_6X_24{G%K{oy!odt55{wc{4JD8SrT4wT@jUKT;*{xe1V+F>PC?r4|oX*9) z{2;wdA_PAS!RIYl{SLQ$li?^j!yY~D2N2PG#yJ<~WAS~NY!`Vz-T_Go%BSvSR0;hL)W zypPfYw@l!OOB(Tz87GQEr+st$2SSEy(K92(+iP+Loac}!=4Yn4VC8Tk%s_R4ENk%w z=gAxv9hN)u8~d}4l`9X$8&j@T=}w$e^@3C3($)?J1&D5bP40L%b>9C;cpw(T&ia*) z`ju^?!!Amfr-S!&5+}3kk#JGgZGwKVaP{Z z-xh6e?80j(#n`)up}T6aM(G$QrlDKwAW{CrL3tgW^Ja}A5se@hrrJrf&CnMdrU*r1 zc^?)Y?z-LgH4KR`ZkpmT^_6xi`oHsS@2n`HLp3*S(rCJjn+)V&I5*}jhkq1~_9dE6 z0MhIV0-XT;5y_k2m|9Q`K9D4ERZ-e3Uvg}RNBZuQRcdxco`fH1&g+)<*k0KyOdw47 zvO1v@&O2<%TqWtesN>CA@l6m~>OTJqKSr&Y+bhUx1N$_A=<<&lpMju4DIDNRGX^36 zS>o{RPYl|GN>DrufMsUCNq_)!x4%Q3=c7EeYi$k*9|UN&tue7^Tc*YEB` zN}$ZqeC2RaM#+FVS7PZ*s+YiV@jjL@{n_3hqjv>ZxN9I)le%j~G8v{YtkcOW+Sxsd z>mLR>*<03beuI{lu3Tv&;@#*a6n(65oaT6sKmS`lAioZ>6=Z_wJLYI6FL4n8 z&Ny^`EY7*}y5+_ofP)QvqcG&4pMdJ_NYYo0x|$u{GJPA1U;{(^pWq*3GKf@w&H_&2 zQGK&KHFX4J$l~ed$|EPp=u#$0IRIM!C!4hn3J7?)yf=y#96Cd=ZE#+~%AGOJyUW}2 z@{BE#f1Kq4+K@lLi3s@iejoH{B3B8?sCLstJRM|;eo2sdnw>2jPU-y~9WE$4-t&5C z`*!V{O-9j{P$-$-P|U=$JEwz+{p9ym;He9t8_hhL6VWo7b@XTd4G#t=7`X-)_l{m>mnHKf(R|a~kaq z?P)lEI#2cQJx-(}3~8)vqpUQB$Wi+X1u$0V!5Qoxy!I95u%Xt|(nmk)N#t04RI!+G z1xX}z^fGt(=Of&-L(3XYDlPol>~QEqe1{K{oS+|NNh?EgqpO6s4vxgKk|ePCjdM}E z9_^@r#_gH)EB{Me%7FOx6)eDyNzKZ^Glp1=`o5TBH~gpP2eh@$;n^oJ~wA4HrV!GosuEXZRXUS=8o}ExrD8rx>>QJ&vjwa)4e$86%Eb znxwnFo-E3Z+6&yR3XqK!{6)$w9D*D!8VS-|*!y6FhY$SL^M@S~AS#byGM7|2N9CdsYRwpxu|T+vhkfK1~DIz8B~-*915Ce%Xfy z6w9W8z;RZ$FK4xTF8o5Ib;2>!zLvM@ey*FoDt9;It*;MxSV(Ldw3-1vkz=VA3=xQu zIM#^#%^7s+FL{em3S+>bFvZeDTYo-IBzKb$*{eM(E^+V6DL}I{hIV@o=%=EcyxMv; z9PaH6?^VNN6jbntq~5uEw!jLdbz9R8+h~(JHyYoBZzxIVt0R`&fe_Yp$lI%X)XigX zMJV^<1PpoZHXSPcW_mC!7VMhQ0xM{G=dJ@~sJ;pV$ay|>fOmk^?Et0Nea%p5;)i#l zoT|l)IL^#K^mcq7pn-rpn>m#eiD~>mD-gwSMMq-PSbzNk;mTYGGs@P{wZq+T3L#Bu z(Vqiyp2n9f15Fi_!g@5W*~W!z!HUUgxE)bR;~PZzRHmoUQ)?KJfh@R}WE@p_laBJ| zxHU<|p3=qqb#zWD`Ro~?OPLZ$Qh-{qTU$THZQOD>v^%)u#P8hL!$Hm=_~wLbhU#&K zX}eewJ$Ue#5|(xNA&I3%T2P)Mb!WbZw|$E*Mc2w53xEE6t24_V7xQ|B@|Job56b*j z_j=^=AXXxW$#VsRCj5-G{YlzgAk!5x8kvD`iItPShW|crVAZGIiWTE6H;e9^EA#Iq z(W`~$_CVeX8vZku!}IyHG}(ng%&S~f1Yc+*zpqREKTjDfPD?&<6PHZA`~nct(A6XD zUVoeOo>r#^Jt~Eq(!*~RaJ|QSj?ZaOl4*N?YX1G4&n?{$5#MC=H)(d9`^Ktof0kd0 zKa^*q(~blp*?RNHkZYv5t!Lfiu{9!)XLtvHGCfcPcF~|FTX5z#tpeV%VgwUXgXtFX z40%XMWFBv*>(K*?=Yxv|{#&TM??c1hF?9{OtT~6!ZYxdhCT}T;Thj6?25}RPv70s$d*Ow7le96nS>_2Z}sg z5U>4K%r7OSJL3Z^@&&F^RSqA{nki1nU2cJ9O8VCgvk7ZXg4(o=ogPxhktPP-MBfR_`>fRATOmxGDos;huJsmkA2xMsCk4tGj( zSaofWEZb+e@c&rT{Rp7OsSPIl_~J3+?9A)EhNxZ$UR^Ivk{PK+z6h?s9qhfl>`d|Q zk#;%o;;gBRzwCCpS-|l7`1h9`9MwTp>D_n_X_cV+G#lJuyU4-iO`GTU-^!02N)xZV zzBUdO309wXx-EQR4c{v@+-+=)+L4#0P0$$k?30NN=1>_(AXGr0ii{nn;!=0$N{wgLN+Wl zQ;H28jshzBkAJf?9EY6!=(hsy(Sd$X1n(AGMKi97sK39RDS) zpEu1VqguGS8{j2ViQghWrKN1H&?IwR&$Q%)Kake~U;;;_d77hb`E+&mK{%m0Z%q)e!q>EfZ> z9T6Lg+%okn3iq?QHXG*wgpYU?8YXiFiMMt!$jB|!|mc6hJ(>{_o-CwUe_N3pVALM7h>fkteF$&y}Z4>H!f=a3X_hORWn zW<0Z(F81tCiJn?I$WJ0j1Pdm5N-{W;r2GC!mp|7zfW_3wS-`iR(ejQX<}qNd zGpX~8BsMP*fQ8|=lt#F0s1z6VMsG$X+}^`YLyJW>k-RTU>#KTm;oh~@Tuy@dvbei| zGgV}VKU`odVbk&%MyNAX?;4)9pG8o?=?EU|rwdw#@Coe3wtc~|qpW%>7d-lgQ8i)~ z;B!LDR@+5`796iErk!a@2mZ_7y{(sEQlcq3ne0hCWOvAzT_~vCybo2;OQ+juz;}i( zdTzQ`eKtEwflH*p*_(8|$M;uT!1I+x!G9|RDCKUF<|SX|haw+8;)2<-JDb#zkB=>;0ofNOr5oO%@e9;g*24SV=>? zSO!gubI=`C4&V6cWgJ^swnvJz+xy3>yzv|Te%yrbV*@!KP)b|rq<0@ZwYY7}U~G=I zF+&|u*99YTjZ|Wkc1UXN!O>0ACH41`Rs3r_&3pZFj#L99^5=?b6=~xFlj2I>*KZ7#3^HK>_qCB#aCDxJ3(dGf{uBZlk)x5f_x6CPr#EC_C zuA4_}@mc6dN==aWhTH@lVeHfU9i|S& zxuNJ$2e*@t*oLn@8960w7Lt$Z=1tBqq zK@;uo^{7H6L_zxoDZw2-H7la57d2%Fzg8*7AW@k$o>M=zq${A71PpQ*eChe?p43Pf zyP>_n*>bjXv&dN|spOhhuXKRPfiov~a|(ohX0P?QSVf~!+V02YCksIO%@^z4eC*Ky z&l|jn5hi_i0MgP=TKS?~K;;m*v+DjGrxB(w+XKICq! zwa`PtY4gQH;h|aE!KdnQZI%x-gkJm^O~-EOqX)$#LB1lYtys4g`mAt`j0}+MVN9A^6o6D@i(!~|M;n7xg3h6 z?|$zF{+2`D-^IcdPjhI%s*kF9%S2i3zNPpkfRswYege9L@_XvXWur45&DUaqU~xe9 zP@<@kLT2GbqRk4+nwFTNpzn`fj$l6`mbrANh0|dK(Z3%|i2jIkRTy$a^JbrLC$G6B z5f2?V;EEYY&C=^7VX z{K(7AW}QZ6(5z0nl$;9Yk}Bg;58EDOuIpl~{lBxSe2l)i~1V_{1A+3-;tlt%DI{%eEK zGa&BrUSE$;v^ZL=&W`Po?ot{-vR@I)Zbst{VX~gd0i+lDwjD<7otM8?acBP`r4GHT z7B}{G=Ro)cww0SZZNKTOOP%-!pQ7S0fz!m_(KjF3$noATO z&L%_~qS1b{C21Rscc!jV#H}WP0%XnjmV<%1E&$uAWKu*&J?LweE*Y{c7Lt@k3>8=3 zrt9wf$@!NC>fP%O`A#2IhmgMa7i8$#yuG1{B2KTE{?j^QK}BzWMSHXt8O;yfZssT! zVxXed0&bQdwrF`t6&JeFx=E|wVBY*>#;35m`Rzd5t$2V1yrr$*n4*)oW>?%?eHS3$ zXjcr_KmtTuC)t{fYsc}C(97*kD$CWCw24Y`VMLVGl_Vew(DCfaX$ha7zD@80Qg4A5 z;Q} z_JL#z#2nn7wI=f6D#c=5C#Yp9oX+-(q7Lr7nXc;Ai;^YtO%O?*QvNl??dW2%r5tyz zJzK~4(&)eFZvHpCDcOs!rU{#1*D*~rqsU3{TL2P_C8CqtmO{Wvd$2te!w#mgS7;!x zjp`1EQBzwX?XO|u$+0t{;>m>MEsHVd#Ft>NVbYVm*mFbu-M}aUhx(+8JLXh7o!NRT zMjqzPHvWA7#-OjYN_=83W*~^KK-@Gvoy2En$ex2j^Jh;jSGl3)YujAHT(NXEiuKTS z%Hb0!V)EfoR(AE3YwnA0x90V)_5deg~Q0Jt4Gh1!aha#a= zX`Cue;JkM-u&x}GBK10$NXg)GCIQbNNA=%x9E1QiO`z{gK^+A+ zg9gkKV^+!&Ib#}^6RFZEp^hHx%|DC9zG-~#8Pb|Dh$S`}6PuBWCehOh?Q^*tl2$P6 z{=KM@Ix0IMT|?}K%zZtAx7W8~mDtSfRkB(5FEl$L(<`+5b!KPQhWrF%KBFH?Y6Kw4 zT9;OZZVM0DcD-|fEwRHuVbtGUk0oOfw-|K4AxcB=_AWAUE>I-gJ#LRqhf6KAsJF|n zbt$nkQ{bQOSzMN$KPWJXq;fFmmSW=L)TY-V=kNKqcP>b}m=sIlUP;P13h2fz%!W-Q zm5iIiEa?40{ZE=Dw`d#ld)#P}vUl3I4!6$gY_Ef>*DBF8!>3DvI*0Hy423X8!``@` zG3bGw20idVv0^3qjUpogv?$?`BN0Osf6q2*O`Ua_m#a1hN1L*uM~%%Ok@~jV6*uud zVCph&&DLtX64*)COz>B7b8BLG6}r3xZgRe_tgjt;i}xl*rxLQ0Yg5hcVcMC!uc{BF zoQ#jkHyF{cCOatd9N)}9@ATyUdGXJ9R>041>b&MkBraeAV{m;|>^ogfzgA2~>x@=B zPW?Mm(qzJwt98g|DdJ2fCiaqjYiRFrQu5`-3(T0Gq@AItRSuP1LZPI7?n(Eb&c-jh zbOI8rnkf8cxERh?2O5^n{xuo1(<*3Le~5^8Q4>TZ*GPC|rTA25C3M(u?UgVZoA>v` zRPq50Nq85k3Sx(FF~{}VsmV#jw(y)#eZ^&;DRC18Wf5ui0j9(0&gXG9Id$O9c$wx5L-=7F5I&|i{12E>1 z!d`^9Q5m)sM$D%u252M23FXdA*{$weW~;K$yw15nD|~J10u{~Y@*g4A@UH=1X;Z6? zZkR{CdK=Qr5+wCMGLzew;}Rxo6MDtCD+KSqPDj@iI`(E%>DD9Oo<%>mdvgqH<&^(v zbo04GdG}Q?TKYS=U#S5+9d=czUKvG`gAeUh3E6V`W8A^NJ9xsnE!_qGgP>GG;QMCN zK-x(fr03Q12AxhvlzZiJ-Kb$Ivf*Q)i-(gn>y2CG;gCJyMl^ zx`Q&+JLoNc*0|777tkQmh4kP3gK-`2n~|-d_*U2ySo4817gR7TI%~G7xaCOEaF-a{ z+Sx+c;Dns(Q^XZVJDS0J2xY;jC%aS|m~ZQii8yZo?f@&7B7J(_*IzNDq@bW_6xv6@ z`VUsh%sHq0Gh=H4>kMDgD!F=PiMWNHq zK;SrC{MP9$8xJXmw~N-Q{3wi=OKS*XpPPr`L$yAa|Y4e5Wae>au{of98}XBYTSdqf_y5;H+T!Bc&(w) z3cc4-Mx^K_jl>u{twRK|Rh)G6VV~4y)zDpa-dzw#k~ys&m@|QC%*Ql8LOyYR{Z>#V zj-ViLbmkre*N87A~CDUSp;v)2!u%BxTgQ&vK)7eaRolo>O(@Ai}J&AZ5Q#%28PaX ztkch1>)wUjLfn`T4Q5l zPrZk`LcBnz>iM8)JGs~UBT|4`7pXqRp5b4v1LYWuXzZMRv2=R3sbYyX^BBYSs*$x( zDOfj(6NdvqepV5J9IJZhz{kmWzNmSWFy%Dnk}XMT$5rH<$4LO#5|AiV)-CuS!SUbS z+4>HS#9|c2;rHv5ygf%nC^zi=ih#qG_qT8fyH1ia+56Rz=62y2x$^)@Agha@do%v< zD7eii(PgipoPrHGKR_kP5%&=mHk&o?`Uy zZ|L9uYer3K$E?RJ)bBJOmr(H2m3ggD)(r-E>6Hee)$2()y`K5oPoOuLFd2=ZdujTN zMk^Hh3>v-iJN>3Wr%ww{q(Q6I-*HbO!%sTCf_1(MeDm!H2EE&W6+K(>;k*+VOa`e% z-3~)s8U4$&%5&iLB0VO181V}~piYl9=;X`{jTXI#Gh=L8@oe(tJ*?aG3!dxynLO_R z@{9z{m0uWnHY)=Lea(Qc1~F{RdlU zI}YKNmd5n*(TMzdKm3fDmDwf(HyuoL&SgG`>g7oS%6OY@_m@-UDFj~{>hk9JARh z-us8wBK4*_XOqdxn6Xp%laaW z&GxhE|D1Zzne3r7X1L7y|3{(9KKi~>;r<+qGHup-&D5H^W*ExLX8KR(^8IIMl^KJ! zv|s-va;Bgd@9s>$KJBJN+)r~i+*K{MG5 zQy4jO0Xwe+A$XP9)2H$M)M*TxFrHx(r!s2V1iqWRoh0G!%=Q%w{9!bcH=V;Bdxhzf zexT3D%l&GimivQWW3!C+X@rCX64$(D4&kaw3r%=MOM*`UJij z`6J8Ec`^Ne1jIiBjSg+zk`ygdiHa4=P^{4F?DzbFdGqUhKK%q1t5mj4q+C13zJ2@H zyYCb(qgfH0w0a}<@JIqTPqBN?UiKfqj8}xG6Uw?f=_b+9Nd$y2CKYu@Tny1SMQsX! z)*$@HU)UcC@8nH@U9+i57VfWq0^A zaZaI-2_-}$;x!m8Lii7*P%p~Mas9X`ds+S`aOh1+`Rjz@qD#HR!TtN#bMQ1VPHkve zOE8GRCi0Uf2RdsO3Kz{L^5a*Jpj3INI2;be=#h|+z$c%4qPRT_gAA#Ue9T9h?} z42|N-mhWwLTkL;{@k1IdJlFQnqJW)tWA_mF4daD0daQm$r0KOCLZJ*|7VisARvJcact5OHn$LcWrCq@j}=elD#c{xes`_HcoY4q6GPD81|F?Se0q|qaI zY&KPMhuVX3y*bet;n4~-Y0#86UTR8lO%Si}SGa5uA}T!2E42$^%95LA^(yk%6E(;#?s?-bvU%Tm zvQ~Vaw?)`*yif=4nS<<#c2cH6TN+m=!mG{elh*)`z0jWLs+Xflqq>;F4P+61-e}#N znx!kysl`jY{c>&c2xarP2+x(3(#5OL`IUCma;{?bF?gZ*vlJ~+gC`3baQhyfS{n5G z#DBebJRaPxR096Ov~Bbl$F}VzPG=@z-xRvO)`|B%{fyqNpXZgq`-D<26bOS*$PX;y z>u>tet9N%=J=c`ZlXhUW8aOa}03W?Sm76*%7NeW>LwnO>;97iE8)w%HqD{+Z`9LT? zpMLxWEt^)M`NY#$E%yqT!GKSs%P-V+FWx|qteK+}LHf|FfwUE6`Ti%L(!E^t`jJJG`!HbEZf@=vPq!g+Nw_?d8s!_X+-b#}*3$hRANgv( z!?#~`BU805oSFX`CQneA^&tvFDVNZdf%-pP!uw}fm)-D6e` zeEh>AqLW2C@_ETqy$eGI^&qNRCr&TuiY3_<%8!c5Lqslh88Ko6Znv9Rvu0s3nbPh& z7_^2kxG;?djo+hSx4i^Kzb&uhbITKZT#Opx-IMR!?XTIETQjV5Mhh0RCGG3DoUx+6 z^`%_y^P||VH5uK)FpHNt==WmEU5#1iQ<%`D3R@1s?59~{Z~crl8F+Q_WCU@jlqs1)BAQYy!(!$f(MH)_gO@)^hVi#$#q#0xkmJH9@ z?`$)7)R)y1s;^%OUt$tvo7r}6`n7TlZ`6(BiJ>;JuTNP<4E&N4@miE*=nQw%txYNK z5O?lJWxXXt>CHB*CbP0UGRzj*qe^d1_m6OoL>plj=@mCbd$MLI=Rf`}M1#=~WcN?+ z@Y=FM>=I*uOuzHUQl882B3Z~58l4z#&hKP(pg7Ok_VDG37|a=Fvt-UK{&Vvf>o%Pu zm{wMLF^->`GL|ESvtx;rl9(t0DWe(SxF^}OVf!&E8SkSW)E*#D&2Ln{Alq@hC^ z!bgrA$-H^rxoFk{=2#7)7BLs%qxbX-D-R*Xz z{gw!&RQVmi?Uf3$Tm0?B;r4};Joyzq_9#m?Y-GvCO)T1Tfn>M56XfEx7;+RSOQqat z9j+k@4Ju^k`1u~U_^M@{l5u9nDH6(WGkAR?1`yDq>AIG_9Lh~Y!5rvtY-cB zRcJ=EWMMo)(AJ8&I!4J3AA5fq`LxztSLN${IPX=3) z-{T-9B^96BL2|P5SL-t93lJz>hRW{iBnbZ|dlV5iDTrTU(oY9@?#uaX+Pa15Bf3yf z<0C;|m2rDFv1avV&MtqQ)zg-8K{Qioyt#7i67F)Zv10Xl4y^m00taXCF2j`7E{T)}d~*?yNrJz-%?+jXBP^kzcU&TmXwTnOOr~WBin#X;GmAi>{~KVf?sT z-&K~z#hwuU`>^$_H?*`Z=wRIYwWuxPuKmVb_O2VqcbjgA9z!SfXE6+3Wynj_s8Odq zb1wujr<`L%uQ%AYdnKQ~SdZ6cUdDHP5nqp;#1)4TSIjP^kN=)!69@A`gX*+;V=R}A zq2)hPY2VbphRA0fYP|9t2UmW{>od;Y*ZARcB@+|v79+Ec>Q6Snl5ifcCYiZkc3}LB z$+WJ}j=5J;gkMBt_xBzIq64Kbj3khETKJhb%oFaz8htvxvVQ zjq22*M*q!Hd1c zg3l27o{W-q0Sg`*9ojUX~T z?qo3zdPz~f&tD?W>&Bq@9iiBehv%yo5`Uztb@JbA{2zPg0Ukxw zHQ;yqZZk+T*2JtxyaYLP2G_GBnnk5rNkyFil z5P#55v?H%$MQ}#p%E}DyoU0ybJ@Mok?B(g$ppa+_0qwZzkzk7|L$hWTiPVl<3N>WJ z#Oaee*>9>ujgnEMA3H9!eeJ0Us){`6X`~q}MDCi%%R4vlay^F_>n2g4Dlp^3evTYf zPJnExw0nY1l?-BJd$8APODBH{n^Hy5x=689mu+)s0c(=)fS`;i00ZCj)D&oz~CYZkx zZOauS`S2+M>S0sQn<%F2o6LZ18+oHiZvB^I%JG97-{WHIb_cERxDl)0Lzd4>)8;pm zuW&T}fbQndxi(RAdz?IZl2=}Ng;uRvX+5c~7-k!$-IM6QrU|b+nh#$_wixI+1buG& z<|s^S-=$ciAGrI=PxxTy8?@d11_hoNk4+5U(+5}aO|KVN)$B>$d$tO)rdQPiJn-~u98NP}$WCI({GU0Hrsh8KvEai|j9r{T z$M>G4QM?_Wv{jcxTt@Uz~<_&litZ;kw%&+E*hVVl=jaYzjeHDa~f z7~1o33O)NhPgY+|*Lw$(mG3&bbbpMh)f&?C`9VD0yf~=`)-iMO3bKM`LY~8X*6S(W zUFT%L@G;mI^ycYL*JzG~twXEQ_J=yW{@JH|*&&NtI=sU8O{YaZT`1($@I;HnDh9O~ zv&gw(1@cR?YGT31Uo&RzDcZl=kCxXJWd1A7czSYS`hW5f!#^L$*50M)GyN#nHR#4G z_cw=%op^J=gVZlq81KA?sodiPy+0qy2g6^d&cxPK8@5?9luR2xrFgB;bQ(31p#!^6 zz$$IN$jL=-H0Q~Q1?i{aA32bnkC)+*sYm(4{zY=16AHv(HU#+f>p4W0zmqa0ofzFo zeE48bre)vApy5M#>4B8>!)mc{V#_Q( zxvM`}{XeANea%Rl{S4)LuamkR!N^CdGkM&1xDTlhHg0APeU+)Z%JRyvFX&V81Zz?Z z=Quu8-JY2*N*dU+r$YDwku+{|J4wIvqI&18^4U*YHdMsj^uUb$Zl+qC5P#`!GSmn840gVbG1*&2+Xef=_;p?Y!rWQ$r<{gzh5 zZd$_bEDQg@2qm5WhbY-!x^!uV4I9RU2@{wyWy%%r0jQ&+qocUumbmJsX%)q5kHd5Ij4O+G~kR5udrb>5VS@S9TiP{R3ruE zc+RA0CgLKa*>&h3DQZkim;<}^QNBbm?YF3!c-06HZATOfUqCa!l>;M6jge4uW5~W) zOVdn5xEt&5kuToO$?f|{DpHOL)<||A+J(uH)8j+Ui*Ze0vSIP3uz7Df#o9H;>Q&B} zCphfR7Ue2{-xJWj*gjhYGQ?)daR@07fcoJhGhmU%E5{dL5=G4@0gS4y3?cj`Go~He zSSDfBUCZTC<2(IXX%u_(o1Cx2!DCE$qZ4tGR3JMWkHnq#s*w7py57ofbzCWoxgV)C z)VvzupIV^5g^36$+p%BgbE@k@)R!CX)6!7?*=YCXGy%>&bR*u6Ley&upgWpYDR7SPK@*^unemu;+GxhJ+;_7$Zc2*xa z!YO$M&wcLBlu}3Mn!+ryd)u~c+;PVpS{LW*ufP7vIzF`bDU);(G$-{L$EAkIaO*Z+ z>p6qR7X3<}%9W{5`9=m#89}`-#xYkyM2JA~Hoc#B#4s;gF@daP3kmVjl&n>Y+XlW* z=co*#?s}b(-K&%3wb86a8;ZKKSbsWG3{^8$t35oAktAHePOAr=qHC+N#EKDnZeA`# zO%AQDH=ER45L1~kt|ddi?MIUeWvKMfSA1}%7f&EZ5_sJnIt>4wd+JNJpfFT|W}8}pzH^FaCuwr|_Ys^7ljvByVK=*A8d6tg-QZ=l)zed%^{ zRq`9B@Y36{j9v8sw^gi2<*Mx%^Z8TkeQPYcql-|sLJ^2AP5lZLDIB?+?k$!u&i6C- zl&>K7G4DItC^@fk9Zn6_ZP^-9d5&vzukTMC_C0~VB@9@ zY}tMSZyx7I(Cfxt`+k}CDl?R4tcL_!zgzP|PO zeAEJr_MFwuf^tJ68{f(kMSRSdw_9|ZRDK#Wk75-cpk^7Xv{{#aKvgeDbH&P3_DQ>} zo{QW}>FE3c>N!1j>=9XrY1gS*(U?Vu z73;U}V%_F#oc6|2ra(@H{Fx`%wq++rPMwr%x3P84NtEjHM>rjJcJ5E5cKIj_&VVSf zaYRRo8s3F>1ZnYU={CfgKHfTqcqvM#dDh+#7BvxY@E9R{s zra?XO;n$3aylPs=>%pBCM9c=9p@U5MavFz%wmVZ*77z4o#EhrZl8B#kcz zw$xq}?I~1RY1VPJChoyS6PAS%x!v|Pib|XFsAsvGIo=*}X4Wj34FTuySzS zOlECK!Ya>2C~+YZSD)s(+9fcBdlTW8r>atWx+Hwh2j3sbIVR=XFn2Ys=(4nKXl2FE zOYoR&L|FVRTrivDV`*XMo{rA7g>rl>UAmNa-g$>gVmzw(KCUPskqXX85=htD2+aqP zi^+sx-!6VT2``@=^{k7k zN`8sQE!RtSC|I%{0d1}(kx3#xt}7&MmEQ*$YHpuh97vKAAs+!b=@)sbsvt{kvCL76Lh@7P-|Yz!ELxEG>_eoehE(+~2>P{oy4bXuAGnS( z(spPgJGe4G}7Hcx6-hWA1F0+Gr*LcCQCWecCs(fJ)zd$4@@a&5xvAwz~xvt~_v zYB;%$j*iY1=E_@5MhoR?Hsz*@g|)=i#GqpS!FSZ zFJPch@iG+2AA#2wHX1{I+>XNBT&ajCsS-ZmBcgC6Y88<%T9628)N4%r>k@E#{g|Um zaMShGDWG-VHBg{zO=^~oBNPx#%#u%A)gv}ne^p;`LJlfaC?krZNgG=5XWDv0OmSK@ zZ%swfm$1fBr@{5qDk!B4ghcUFPL(UKF&I=&j8VP0{nlG(-KG^SYCq1-0=Mw;=)qL9 zX5u#2;f=4JVChrksDI0C+}yl2&rdt4eKGZ9xhPS@!l?V((Y9@4%0IV|XNEpb)u4eg zH@BmlcP8EHHsSV;pOIWJfynf9F*zFX>gS#L`L2pIYjZO656Fb*D=O`k{mvchBi!xbFVT@5ZCPK%q{NZs5_%SJsIInPZ0*+0=VPLyE@gvz2dEq=}OdUq^ic$E~3x6KUu>Sia(n5H=$H~9LjNY%Z^IIb!yi+Y2^~| zW)pkkBTSt;pT%>g@IsryWVqDun>^)J!n{afBC?O*l3mp^PxWRoq=?Zj?QB$TGbqNi zN}GfPuH!hTsokt9 z5$;T~!wQeZW+!R)O7@HPspd4vSH3P~VohYF9wFHnhvUR{_N0X{#TBJSnL-#P9iwQ; z*~bsD>)>%hwqjgY)z+!GzsNO;uN*I?DQO2k{u3lrC9_j4VHei{!`b zPA56rgEi|k`%k11w8wE>xiaLls`1(ZP95Jb^?4m}c4d?~IJIXvdy^#_!2oe(Yf(1V zNYJ8|$=t=(gDLoJF6HG=;LZGJE-YinQuZO{b5i%2}x}b{kuI+(&`$7xG$NJF{MCPMg62rX8BW zO`df;^2ea;ix&7d~pDbN+3d9+Z>vwUpp$d^Bckp9x3A6QW3{_v`o-v7h+oK3W8%DD0?GT^bAQ5NGqDkD7+?%|Y zURl#<*yuBQE}O(-B^>PgWe|@{O5)S^hZA-58(w&R9QTZzP0Nz7Wz2&-^l3i6Tlo?{ zR*B~AM)OGdvN@cbM#*CB$?mtDlW)}$BRglPl3LF8~u*w0|3>@jZmoX2PWfN?G(4 zm3l2;+^;{<*tC{AsyCy=&~1#muM(VIK(`i;Q2)cVJYD5$isYZkjLBBUZ zLJue-?bd%nyiwn!4JrM73|Prvx?FE4-Hnb7R4rxkZkuXMukZnjhB~Qhc#?i6x6?Jh zYRS|US&Z-7j1P}?VaCK~nb^_5hI>-@;?6ii(|cjO?Mv<(dzi1g7v;p~Eh)6RFQG4Q zCGFQ2i2bS%p&$BcDNCjCc%|xmTJ$4)bDqST;re@XXX*T_P(xhQ@D{a|Dpl$N`LE>l z!Gi}$Pfw?Q{rcgfIyyQ!{|wrP7M&~0KcV>lA!0;_A`4NyRvqfqt0!9n8Z|0|(d9bh z^icRbZW2n@lLn|B4H`D0bToMVek?IXC>HG?zCt}3HmFa%vV|~6Ih2#a?+swfUxFI- z8&b1+VVt&D3g&mp!(||8_a;sTB8Z5~Prm67(QfL?eE2|7vcpafg_@Mj5?zGSg<{Wj zdMH8xJfhPVE>na0D&5*O$Zv6L&KouVY`*I%hn*f;U@4}F!j&7)xLQeUmS{>>F7^9P z4@D?QNb+1-l)9X{sZYa(l}RxAHK#{T5I?qjl3f{(NJ z=uafSP*GFB)z;#thIFp%qrod1NuOk-MEH1zT|L?T!vpvO*_fUA$RD4x!i6Cwf$TLC zX%eZzS@C`n;IW34_;_4r{?pQd!Bmu=4ISv#=O)ZPkwr!;2?dJaFe|xgB)(W_B276R zAo8MK-N@oKNFQA3Ox_IT`jMV5fr9FKlZSx6GCv)kk9lx7|3j*>^vzmg#H+Z2L=`Da zf=${K<@5>JDO{vDP9?I6w`6F)C|)WVL4~(BlP^9Wh4RHqZX{821o;XU!X~YMKxB|9 zB7q`>qj6_M(SNItN0;7|lUBDa%y_2(?%c^I!YFxdw8d!gnG88|E#)9`O8!^njZ)>6 zJSk_xr~6asa{4|j;W8!-@$t?5g~@hh5o$4%S4+K4eBm1zvFI>&ejj3Cmrscchkdg2 zT+Qi`;mV-V3yVn{euT2xxtfevcnA^2e7rl2?imkY4PSHQ4L4&REQ(sx%^F{tB2f}3 zZxNKdkH}B8{ohk5F6Wwr`{wiEgo(5)X@(+AnYCjn?#~)&=M1HKQhUTUo^EQ!m+uKC z4L(9Gb-eIfJpT1SN+#H)+yU%yMJO0!)#}uf<)QHlbC}tDAvP7Z!jn|$^bFM+6$MKK zp2Rua5}%Xy!S}Lw^M>p{;q=HMc3L++c`hvC-VJX_)=p6^~1*_8*fkX9ZootWY@ zT=#M~4Yl>4+{6=vbf<^TUqCsfV`5@1>h#dj(b2im=siBJ0*Q%qtlEa-jG4(9zMk zlIV_)tH8g-@u5)84^8yhPMvhe$JIc0eCX)t{98ER@nKMt^IT30BJ+Yd%aSUL zO6L84Y1X7{CbM#Sg!c*J^NNx14;4=>Q)@Z16ig7m&rjf=N=!#b=U;`vXuvD->$kb{ zx%19D3HsdOrN-qy_4mJ!HA>^vtr;C1o%2y*LFqQLX3e5;mdkhxYB;v-*gS(_RBc!+&Rn zghB=)Eg_t;DT^jIwpbH-Iy(OravdL$ zPA3)1mtoKflcuCzRz$;9y*{*`qFn3f=;-KNV~A`H27J^wHIugOZ=?Tw*qChmuN~oP zLh3TnA8fr#n8b7P{j@M@Q%1!ugJmch?w+ z%)7|SWg=JR={-JlbaZsCJ=F63%JEV0WRBzGl|`^6#fbI4R8y6+qjYqLQc(dhbR-SE zEzr@?5tQR2#uDOz8fP6JS4k>_@ML9hIz65A%xtp7`1k$Oi^2!IXO^nV%fS^Bd3VB0 zcBWj$^n-pfGhLi^Wy;?SQsu8&mhft0FjUz8M9z9n@?ni&;LW5+{C2y zN5ea3DbcVaZOcYTO$he~2 z{`g~UdwyfsQ9xFEMx4v^%(z=_$_4ZU(TI*3X3z6eG5l3amFUHtPZp*4Mq%^Cz!u{IY(T9%j^7* zxI_L^tom&RNy#UeI%_qjLk8XXq4Ph7a(Z~ZUTij7_=t{T zeiAy#(j{l}v-3o5PA`qonUDGnn{)dO<%lZVn2tBr*x-5@FVs zmoz4A=B-agu>Ocz_VMz)LI#6{pnDgi2fe_K#Le`5Wi$r^V7`n_IUSuVfpU0Enly>= z+XH!qROLH`d|u|e93y!CNWq`WpMPhQz?l)T!c?k?7L8H~0wWsR0H zTpA;0i8pW6BJ~s%f3^;^>kTHXl9uIi&k(Gm^N%4f##QbCsN_jR9(kfMr*v=6~Iy(P9 zxbknOC6cP;E0MDOXFi|sJ)?hGNB#=+s8%FGJH2(&K}uF`OtX4*Y0 zr;fAfWG1C6)u2{<6p5QwaXcLDmW>A}S>%fP7&4yv+4m7b#}9xG+}A7Mi8Zj#@H;Pfaac43Ze+r z2(=#(?)_lE9;x`tDu|0brpH`oaA3a@?mx6hR+G3jdKkJ@OeB0`~lpae{R`I9i4v? zpU+3DR;~E{`|p`DWeRa|ap5yp4(0SXG`b;=R*U4}DiJ(f*1#i!XHuxZWpsWREd-J_ z@XPz%*?vTn-Ye+*P)>@YV{YW($_^=?jr+@1V&cJ*IfakBkeddH}LHvmE@R-2O3pj@+ue6 zPEnGLRxE)OrrvLmbFy_Bf~9Dl9)wEX8nRjQQFlHcJqxeNhDns|(4n6g*)Hdr*WX@* zHUGKJ52eHhwv6PR*7-;d7#JCD=;hR?B`gvv?g$iEy{23+fm||9Tyj6?o zTf)u{Y1bn6f58(q?DSI4Z#lXCkzqt|ifQt^E!vWWL)teToogEd0k4OkvU^S6lD=3UEWENCw~VePcqjHW#}zY^s4OS;Rr(nNo~j32L*(__a+ zm6^CO>xw!*RQa+tjNs#2B6vvT_k-mV82;gp_(XPF%^{|BHSy6qKjX>c{7_DhlwW)C zLIa1?iH!%!mg4*0c54o9-?4>!*0Kl_XKxj`sLL3g|6g3WH#3Zyc+*j^1g%=%!6RL| z@!*XWIk9yS+m3lfTi(T@mD~As&NROLc{*dKPGh0Y12+-&(Asc?axz~ zxM&A^j~vR0_>zcVvqexi)``UtLwsx;h4SYk&KVW}!62sCLNu*ghZ6bXC{n%@agGeK zmEG&x$>LSpnUNSp?ZftJm0bu zQzk4V)#k)}dIx=*M~d<$2EM_`^Gm%bTivJ>K3^6;JX0&@oT&zHEj}m)yP2h*K1P?0 zA9LIkiPPq0O1~a-=`$I(81&wwtLZ8Vn|4jf2YC6BvQ&R-(?y*h=cANHV|pU}Zi))$ zCxYjehY0K(OT`^T3=C-*k$h^Si(DYrn=?FC>r8M91Fm)5^Y`!82B2v7Xyw zL^)wHH%{V~igH{_(?G44W`~_KnY>uVK<8IKrCI)*bA6Y(h;mq^Q8cmRv%Ah*Q@zuB zB)Sba;+isc{XSYWZ%6XBG1L~@!mE2fbpFQ(1OgN;Tv&5@j2%0capT5e7sL8WqIBf! zLn|@%Sj{&(vlw;cI5+*=mKQ%eh{K_jITL14{?ylVt6dELGZwW$`+~0>mrXmY5YWj4pA^ls0SM_9IlgcQRk> z4eK>S$i#Coea^t@GCs}*i5ZQgu*CgNIf)>nWM+yN_UH8 zpfa$Y@ox<#-;+o9R<0?%s3{)~Ung~w^R-b!mGg8WyGy>xxBIgBYRgd?9(|5?hcD8; zTxu9CSfsACdX@Sz=BXT2m$~(A$uqZ;y02!bV~ZR&g&ji5>7c@int;Kzm!l`Ma?Tkf zT=@COmHQ@nZVpW7#i5!LxwT0V2?rBe8tC8SQP%FtR^L(bv=6Fh$YH*0S)HsWPV)V+ z5RV#q)8)}$a7Lef7u3grltn`rSlPhv?>3MfkaSemWD6y2AoI507%OevCtE^%{>c-# z&4p;&sSEpmeurI0{gQ{XDeCB4YZ&EyOF6QOpI+VmjqLHv9sU9w4OPh(?cYueNgQ|Zu^lNUdd$l@$IB!8l@cwUw7Wzb?QUix$z0AeGxgJ#V6Nk z`gZQVv?*ql-g)vZSAHo}`Ftsfc>pV9$%S7&GrU(WRQxd-hQ}x2jCY>(>%E(}tH}}qg3JxQ9OTstUe!DVklOkBAq&S=8>*l=-ss| zk9BND#UjxXFoKx4qTF)(UEycC!RmRFN%0jy}%lo?Aw2kG_NRxN_dI3 za;73g8kj`rXkXvWv08ra%$uJ(ReoY}!u}DWa2Z7C=VG_o{_ADCE-Rq`UXg-@$`>Xf zDVczX#BX}sMRM)cBV=VvNYTD4|F znO1ZxQkLz9PKodjvUBZ9O4n#hr$z-C+w~3(KCt^t_-VJa<5#)OHm%;(YBxrT*J;JA zt*XisB_%%NQwVC$W|qf~Cp(i&`KwNaHsRO7@31`+c{Xx{yBhX_XFG4+ zKS+#^ZQ(Qz&}9A-^!{>_gs@`}C3ek515=VhWXAV+Yc0b_4v{HGUqp zEa2UVOOfo6o#Ddk_26=4Y3Frx{ufcbJ}edsFTVJqwvyF9F+b2BVGzsI5Xi=z86qRK zAU6+e&YtCq@tDP^H6^iq%4f_O^D%RO{E3t4eo-jZ@eoOyCNt-o59Qo=QVn*3r#7>D z_kIEge`EI7A24@vPI!|tP!s%l- zedPrLKMrM&OO)%p?W5An@k&0y6)HsIj!ikfcc~OW>O>3yOV$onP5y+ra{uN`n@(z$ z)V0|p}hkEwx}@O?kpp1g=BBn=Nzj%o~J&3 zf|Kpdl>EcXCUD@mPgU(XsJ4ZGn{26%Q29IQa7PjLtk@3j zlO(Q~!zou#OV4cdacHS(!-g_<+z5_l+BK()C1VrI#t&oOn2(tA>u+TEq>gn*tj;yg z-;*H!1)68olfu?jOPIBAF~2TcL^Am)QN$@{3vhkqXjU&+%FIPM=VqW#1YViDpZ!1d<<1Tr=-BlWc|caOX^VvMWl-pzp$utlB_qR2 z{#zfQSITyNJ`%`r1e}p|IXxJ(F3|kSip0)5->VcpG3Nd8ZTU~{!eqGr#84qoGEK*R z;3dh=p~+95$xkS_lx2sC(Xo04%U5m&zlYTucjKsj3xzVqF<|z74o`U|9DX<-aP;J#{lNqKN;Q`w?)bL5;^5-QXm5y}cA;Tu!%a<@G{15qh7`ufsPJmg4uO zad6)Id^K`3N|dQDbKZTkm_1=ENl9s(+BKC4?>^6-BtP~DD+hn=&ySN9knYLGv*rUv zzOev*0UJlAJ;&t1FS7Aa7Qv8*gTK5W`vcf`)C)(KFnQEx9CmrJ+RdbG{)$;YOcKR1 zr)SwYDCel!LKH-~@pOWD*VsM{g_x!Q!JMO~k*~hOh zw`alTG$NuQanwCb`gAmjM>7Z-qi`*Kg^}-n$7xR%-klQ|KXDmW^?|~0nvJ7gVa}3m zc#;orV9jh!NV=ZIpK!EcKT2By1blAXr5@$kVO=mEOXdPiL={Fd8&rQ)#mUVHB$OqF zMVvS!&yD8!2;w)yP~)MOXw{@7-VF8m;VecmY=V<|^KOs!eEjhkc|O(GU}?v)oK$aL zl$EQuVA32!Iy%=b0k50lwQitc*M6*-G)#=e(i|7Wo{iHw)FKxDzrISYxa(u@KTHvGxE*}nKEjwHFrIJJhK2lr&nZa0yJ zZOnM#X*Qp5dNq$zp*MSjlf53smr^!xP%TKTMV9nla)D#)=#I++u|)`xiZ-^V-UYC-iuKZFc^|pF}w#`kEvd37f4J^W@~@tUvxqNEzG*Fy0T$! z@Dg*liWr+%Z zv`8pfksIq&p;o1e)RglLs@A1)L9reMb6ipFx>}VgQB%&>s#>4MrT*mDaa%E(H)%}G ziWR9_wV@~(HHou8WZ}xRYt@D}Rf}kIe&oNdHn-i}jvLD)U=nE%TcU!NAC+EieyW7? zb14kgNJ^D1PxZPt@nFk(RIN~v8WqaXv{fgrF95!4#rq)&lQm@Ic$y1;)rvR{Y~>{F zd1}y8JoV(0^y$@?Z+!GbHQ3iUhor{mLu==Js+6j(Qo`5Th8CBf58`6R!)AA! z(>p{%T6{}3tnFWn`>u1)v-=Np7&DvZSG!r-7Fx{YF#q<(1s?)Id5u{~-;_WNXfGQ{X6@=cUu&v7z)B^Z|GD?oBbV)ei2M zO{L0}@cP1Tj)1f!uJd|&B{XWRGxf?4sc51x#EhPj?Q01=|DxR zG~m>Momww~OCry+aw__>)8u!aCtKPSe|nOND16{AqMROU-sQ<^k=$3eCTpU4(EG_Q zn1Vin&g*FK$mcxx_A4SczUH>ZCe|+7g~7jpRjaO}$7cgYPXC8nn^nUo;r*iU6>NMj zw?96RPS1^|!wn&peL0R4l{FD+!EznA_0bo({ppW*eBe#2dF3?@**&az<1_O0{GKP@ zdWri+O{8W12`pKbCbHU!$5w%Q_rAiN&)!P3M>&yYzvoLLmpW6eUVCh-mx}f%)o}7x z4(#hh0g-`LvDMUYo{(t;3x1=~Rl1Lrv-!9ZRA7`6-kyo`~~$y*Z*{DJbU(=NF?n;@t6Z z)`(~d6j0~#Q$P&yKaWZ`mcnvv!T1NUiIsBU;WU#A|WqI#bWh z&+l~6%f)0RHZC89rECfD5_i6Q;Vl6*I{7@k^@^g#GfNAA(-}!rqzLypuQ6)uY5LyR z2+G%{9^3Fl*XPC-Eojl=CaRSxi5i(=GFw@`av|xMwb}JqKb?<~OHjM4k$^u)hQ}>R zrPQ)1lN~EJvR^5%Wvf#sIG2@&MG!|tVU-r)w?!+l<{5K+4kinBxiLuy}4Q@hpJMzqtIeav796Ph0pjAZ)U$(x4-+?>o-0&*@0jBM|CA6L&wq!=kd4y@fvs9Yry z@QaahVLKg&EkNy(X8dXKG`jvqZjyX9saJ zxUx%e{q5PTn7fQn`cbx~9iwoahB(f1j9Mb%*!-M9D?{Ibr|7$AFV)p_S(mD65idR| zf6ce{@t?zoxq06Z=IkjfZE#Lc1Jx5`>+=RWtM~?-;K_yiBtB8}MK+s7HZ6O`&WPW- z@Z8kF6jEhS_tfK)dQ*|he+EBBlY@keRtqjmE*dt zdr^z@>t=?|wTznQ!O%9zKk;hG3jDOxjm>5inH9h(I$Wh{buox+%=Q>4Sf@F$Y00S3^GdC(*63Cu3_dbb z!Fm1dlukd1Z^tT@99_$TCt~RwD{Vo7nK5&AV+e`fC%R-ziE`wRv*68CK2x<{UfWl_ z=L%G4F1F8fj>*e@c=|^q-_xJ6p@8y#p228~;q=s}=v~IZ15Iwh)@Lmb+|y9xv$Ro{ zs4kN;o_#}WaHq(oKKG5M#rHdDbDizX9;{6zBe+$1~>lQb};xNm@k;V=J8 z!;c=JxF-W|-0ci`rvQVmKO6p${*$!)ha^9lVu)DHe&)W@gIn(%#R)^6Nt!N!Tt;@- zituMj!`prcFWs=3onP$|h22e5?Y{JGeUL#9KFm9xf6hlkUS!-}8$Ej8j17+%M$+!& zwoXB52uUN|5Y0UU?a8Iom}_Mi7frxyuc>eLj4Czt-c;C`xPQX%{}V z3PFSkYt#VVIqu_IG2XwHZN$PA)G6#$i+*XVe&wy2oPEi&BvquvBLwHoV8i|ukXndR z<>T>(71CUMS*cWeSMq;E;$Aj^G7$mEOZeoakSGG4bX+GB==$T=tbhDQwq{$jd9Az| zr>HVS;yWtwEuTnvXArlV{4aYazr0$H8BtRhv+_A2kGr+}hYA!Hxy*^Yu5s5t*+5rk%UUl54bK>FK*kJyHa_GpBmb zpneBD+7Ot`6sY*n8&u!%D~nxLoDq^IuPEDEc!Sir54XpHJvN&34X^XTBco_AJdJU3 zZ{K+FCbF`;nv+GL91iL-gX=WOoWvsygx1kS%J0iMDJMc|zFNxM{|#U7*h*kz4c_hZ z0!KVfij`Z>zHK3lYHpWHk~5jDMee_HqL|{k^P=4M{~QkSY>mTgDcF=!@sg%p!pL)V zX(S%Ak$}&G-z!xS8Bcz~A6}&5%m=o!qegj(%kCffP;_*z7HX(UM$%ChjednHH+QF8 zllJmFE3NDj1pQd@mm>bA-dN*{6L4pU{^rGAq%!&2^pgnHJCj#X`~|cgT2Q$DQ&cQ` zn3>am!|b$jY-V3R9I%Xzll+W77UIdr8j>yY-jiXX&A3e7`S?**JW`&~-^~HD6~71( zx8zCd<*bIPq$H7LiO_nqshnkGyX6%X8KGoc%3+d3=d(sj*tCZ9S`*;=10r8{`x$d6 z#QiNDWQ&p*QaZ56=3E(gW?$Nqh@$0*Hy7i;wrMP%dYaZ9DoDF}UJo%(8nGRQGBPp5 zH#-l~s1S!+WZ#)f)Q_kr?7lSAG>n?mlQJ7E zW<-1u^ahmlRR=Mup41*2_DBi!J8A0ZTy4}7tMe})==EZ2_ymJG6lBNVgB&}upBDF{02%SMS1z8Jp=&39oBBA=7jC$i4^81c(D!VbCY@Wnpt;*sPq1bKsue{%-I45`RAhC2GzP`tR z!x|%k@vLN2leNXxy^qfxZpo1&hd6rdC`V7Gkd~6n_5J5FdQbzryY{hnua`D`IuYmb ziZbk`NSpU~yy=r{6&59dF&?!7#J*A0@VAk{ne)#mt!4gLOd zv0ll4{rlhL-WnD>%9S4qXye#B4*r>UK753-aYkwU3_LLWH(tE6B&T-o<)kZtJ|BEV z%VMI4`z+it;5}Lw4aoIk7+GsE@ZA@v8uVeU(t`=}-lME21bg-+QKEiBs+Upy4bL@f zbaeh#QN29W@RqCR^avyAhr~#C#kQo+<57%%b~I_CXr9h0Mce)l6O*MnuzgPA#zUBG zHqtl#z{ZnKT7U38-Rd4<^J=sSn@=x!pT*k)6ewZf^ujT0%q&QyGWo^mG?SIMjFrpQ zVNEb$I5nR&a}z04qYBoF4^qwWHdBWkAY1jEGx}IPW+pB*G4k&b^x`hko?DCk$kear z;4Xg;#bQF?o@?jgbtRLY>?1wZjsH)}4^<~2Tt)Ar+s%ng9XbQIWJ&4jKG!MIlXBwo zNrGlmHhU+3Ok&hyygsNcZVxyU>_kX;LKPpUe*9M~nw3sWX*e+AIWk)gr)le3>H6ss z225DOt3NNN$Nl$HuhSR2`a&zLRofGj@(o*eKwJsfHg+^oxAmoXOz^_;sX0F4A+``C z&Ht872{%%+h@BGk%5!|uPK(By4neW< zH?S>n8#c?O@1M!!r$HZ8= znDfIZ#zhv1vlc-?I|)(;TgH6E{t}fbDrZBYx%rOoB&%o%jz+f@Q~H+ss8R_$duQ^~=y_NoBC#Bt#=^}|O61ccZ?wR*cQ^i^72k+Rp5i_`gfEP0H;q*uq@sTq3w}I|t+<^i|6;ZuElaf~`Pud5P!3DDd__&T zR!=6;c^#EY#{7kLNJr<&qdPwSC4~GQOl5B7rPtr$?YG~S?L9so+MQUJ3s>$0u_CcO z9v_XnzstMtzRi0deoU7tHZroaiLTU!+pCwO!6R?+!TWOlp*BRB{n7}?H5nm_N~1RL zy^nb5`BqdaU5BPkN?}wDoTUIAo_&vZ-~W(zo6e>AJ5}lXKxuq=CZ!EZ-XgDS#zW7( z!8>nD{@!_yk6wO&YWeJBW@gdw?%e!*#NE{#WT|;Zf<9c)HF=?b7m9?ka};K2)ZFgu zbHd*v;kEo%XhpYXRq;t{QLJuTI<%>ZL!|oeH4J`F78Tn*L#r|-ykU)8eQ`~w(uV%M zZ>LzaN#gU88H%J;&jGym-Vojz{4zHb%+l)A=Qh*e?x(4nkR^?jAGf(2cR$mO(k5w? zGF(_HbYsxlLm2Yj`wZxLGYPi9MGYGr9i6|2FC!o_L@jM1Ms+3>zJC-2Ry@R)<1=ab zNJ%E$Zlzn5vdr0JAgZt^Y(XQgUE}zuv5l_L2Bs!_%zZ5(E89!aCb#1Hq&)W&Gt=+I zDb#&(02SgzHmF`AMPgye^Yp9g;E{Gc@U|bs&Gic636-MbN1tr2M${nY5z98*^AxwH6H`7Sb9bkOS}D2UHs#*zhv{BAmPg7-oxhbxkB^?maa!(U+c)TOPYk1O ziQxV+HlBO>ODaD6Iu-ImOpOP~=X#c>3t8#X{!^;m(O8svmwE#5Ncv(A2qK?-@ihN@ zF4kccc%X!xZV!FTb(M-rd*;S$_p)v1?L1Y^&cn@b$8qNbsuzODJNuFE^B39SH|ANP zP3~28s+3piPqJ(@dO5me3@hesgjf$h-e%yzN)dFg*`7ex(L8WtthBSo**0+m>$acB z)636?+eLUK9)p^1oRdG@#gpYCd7zwuuU40&&+ylYk$Ys0OlQsa$7$T8rlhI&_t3d^ zQ9T!;3l^tLgEpFuriQKjA<97^I-adaW#SrlA*TKvnB$8R`Y)UwYLa@l2%wqMgEx&DbrtnMqDDEj_=B=?Aw7BaYtOhSm z2^V$ZC*E!l!M&Bsv8n!hbi2JWA-76LUib^?CwnHtG#pMx(5U zc%pa=50)|T;kYH(OsZ#CCfTmEu)J2i6wlocc#K?k>m87oO`XR&6OnPD?i%!@i_8}} zcm4^b*Spg3oHrkc!k?Wi?c;@WZ-xA#qqHoreeF?O#(qX}4(x#68JGWR#T;+wnm?t_nzTa=a98pnx)5X9;6T=5+!Gh2nnu?*| zIoZG}3#Hg2a#DMUIKN)IEHd>XV zSIQz8H3iR)&nWe1Rjacr9Xclu@}C-)9#F%3- za>|<9G^y(HdEHvK?!2gY)x>`Znf9j}QcEzY^;QeRS`MuWP>FXwWWqt%dl@u_=)RFcV8`UTk+&f+P1%q zR~EsR6r(oG?!Q5)lcl3Wl!{Uxk0gzYv;~@+6FKG0?S&{Z#A28CO}*Ozk&Bk_i>6*B z`56*f;}1$0tJ=vq6$}Km<-=#bR2F;B6Wmf4XRxox6sDqpInqgg6c z6XUAt8fN0TN^bjQb)=Ol?cj**gY z%xI2}@NLz;CjI3*tQ4_Avbkha-4eqMf)Jya`b{8h3oF7VF=HkoD zzj!TvM z_xLl{{87DKDvrOBpWh36-Z?RrOuiK6fBh8B8;8-LO6&#mu3X4p&CBnUMT{7O`y@+$ z`jp591E^QtanUciIy%=PSJUzF$6V??J@@@H2HpJ9FF%%^skEyX9tM5EHHtrqPjRv9 z&cz^QIJ)d(7S5QBw{$OhKG+#U@M^67_b2K{N9P(tcYIuJR86N;BXNH$DIOy=DhEVq z$~kp8QFk;L7DgsDWA$G~3Gx!Msl~H0WXmh4RYRhd5SEOGqQ$DYNw$U(q>AjTb4m$Q zTW-4N|IJI@coo05fBrcg9i4Mg?}&N_!^+;7S4OR!sorDd$UH6E#SA5Njk>@ln_8UN z9^T?*ljCPz-`w|G$%x#)zt6Sj`1p$$E%=VDV8>w}6>46O&6KkO%0EUpy*0mnPg3bV zbZ=LY^o$F;BkNox)H3jP)ji$&C!8Mt0AhSuY*s?*3$EUCQs;k&YuoYhXE4aW00)-+ z2V;c?D4AdO{?QM41}Ot1PI;Qm-WIfI-=4ULAOU?$w2sc7LU(*zZ33daCfP|m04YAG zQCQ-4+Otc!{KTrY`| z7lF}6_71jwlL>Jt9Eh@s4lx3H*O%(8AZkNC3$DH`F9*2 zDt~|PJ@>S_{g0{M6I%Q`NA{ zbpAZb@eykc@!-{Ue1!0;Wskf8)HpJyL#>N_9`0lOG;J*j&6{&WK2f^=0;wB*Vd9CB z^k`jG`)>J<6Y{We{%`C~s6~ewMb8=5aREV5>QCB8JP0ZBQ*(SMyZ$nxZfLIQ@Q*t_ zbQ!Fp^Djq~OLJ`zHl<}NBzjr_+49M8)nmkm+3aKErT|W71{KS8V)%w}M3`02lJiNI z>zxl*$K zd-;k!BKa<$$<@D1ZoIl2($Ue;x%N=K<~&}e{4$I7?b~AxxV51imj#jgxg$UVfuQoS zXpRrv`Jtop??yR4f+ibt=gz&_LtV02^!-XocWXxR@R5I%6YKc)U_rXqyTHxz2l&~r zdNGcQ&8ZL-KJ<49`6M6K|G$n89UUE=^Dv7LQjU+q#~?mdWK&o;Su7&|{5g%1hCyVr z=?f8Hs;9_5AQ*LYbaZsC8p;U~2n2Au-L!4n7LVtjnY&1(p-^*t=#CE^9UZIHdM!9U z(wO(%ddl5>uHz%?=vsc5zYCA0AWd#*Ol8&M!*hxy%U7^7SeSCYy&Q|GM46Zjwr<@= zi5j=iyh5~S&?lKQYZ<#Upmc@WG^<%co2E}WE)MTl!JM@Ra2YK`T21(TP`pY5ZmL#H z!uUzvyPi3lj*;PYV=G*RHuWl#-!8(^cYyDISjK5W7|k}!2DJoXL0YwIN-;I2#hY{9 zWsRd+{rWU08GlZXkF-NO`E}EJ(le~s<0{jpd1(ry*h$s7mQsRt)-ST)r0ycM+m7Mk~7{{E@qjS^6$ zufpanTP`Yps%(E0m#T+9llR;@3rd~*sr)GaSEHUYw-;P$x{)wyY1CyKpnf@U+H;;~ z$Oj3lg9v_^c!CDq8!MGr!<~`Hl4U*`-CRXY$#;g} z(e?arG(TPH77HKAC4|@GBFk;V;WU%EZw0IN$8kfe$~o5u+-z9C5_{RERE*UwxPW7c z8`l{NOkCrnYn6iR+6$+yaE}jVkb2U<7XeXX zbZCaEGESx4NfR3*E>etKD|k=AVF{=C2BZQ?#pM{n8FDN=Tf)nACNWeBNQIl_`1zAd zt2v)sCm<q?6&Qa6xQ#D)a)+lurkjM>E7YSWM@Q!hqgGs*Jb5x5I&{z-A38cZSA@Kdk36dAwS<^TBCO64S0XI^ zF(s%UFP5642;~wAN=f2!6zZH18p?<>oavfy7UkawUd#jwxY)a4IrEm!W!k)X%-wUE zY>Vk^#fZfmRM+M)NY5pt#j0fM*;F$*;IdJ@XyNd_2w-PvYI>7cBZ0*hyyDoR;rn~x z=~dtiduPmcI5-t*y&!oPng9X(cJ=mtv4fycc@`j1os+9h7=p{;K^; zBxq3arNi@Gpk6ga}^=mT1jtrs+`M{A&b=g>M?Lf582vE zeyZi%n~qOOT6-W_%Gv#4I3o2cS^3jgq}(f|E_;rUI>^0;@=QeRhU;#Vd!7%x$Kky} zIqBUkTT@AA-adJDB=2ALhjK0CKKFtFFD7M$|DDH*BtQVMUmy^1usns>|fQ0nOD=;-{vBX_CUD~(YU-pHsZqRwm) zSX7tb%Z%9`g+ndDa)nX7(({%t(qRqjw+8IaD4cf71-i4z>daFgQAF5s6j*~OsS%M; z*u@sQTxj`o*hQZ=mDrqi+a>J< zook1`a9b}oYI!D;Ht+w1*szKPX|?5<*wk#sl>H3ILIi#OGZXS1 z+qaHY+mGdZpwy6;*dl3)g?HBGb&z27us<~|ystRTK4UcHB%Z6K+B>4fI6co0RnCw2 zC^1f?I^Vooaw!JxCNWmlY=FIQK!#MA>bYU813%7&RdRgZYhrkR2OCa`VVf(Vq+E6h z_l$Cwd?e>Kic!A>W_K4OUkYpq!2N^8pe`VJP&Y@yN5#sPU$z7}mgiQhFT+tWXU|!s zVwLkFS~m3vn4}Eqc!XRNCC2szbI!`X_Nb^W&l7Hu@SA2zTFoFc5q3)c^9nXq7g1vL zJ09GMpbdALY!6+AQU;q{G%sIDQy<*Ok1eI3%Acta30ZXTX{K$zPRU zqtt2P8)5ENxJk-llyF~uBZgwKT$86)kv9ukJTLj&28%wGb9YFcu7T~d;K8a;;x1Ub z7D~%wW|VXzWpn1%o8(ay%_e`N)!XyvyLyU@AwU2-q( zpi{Tk*{2*KqA(ntJDAS558+^x(_+s*8=Iq|ayy;UI zHF+A#)^BI+(v|EyxQ-uI?Zt1+Wc9pd>5 z9~eG$wHBwsQoIBOveq$b;v~MBwwQFHh!%kt5nYy|)&qR=!z8{K_Y1520g|^aXXe%; zc(n`dq(=8-NYErGQbVra4Bb0}OAMe2h2ZXqVvLJ{{#@&vzfMW> zBQc;Ol(8;CI?@Nvca!~S$X^B~9!DE8p|Cn6YN_JZC1J!0=-Ln#ijc{5E(GMJ6|D<{ z`$BXDIro_u`RO@juu59r_lG{Cpk^v8*(Ui7d$=6&kTOlmCVw3g_n_HwU1W~&t{g1m zUV_51A6Wppjg-HIrF?UtP*Yec@kHGSE2Pf8m2_X50QDu_j}qaP8(^MFTcmiD)Y09N z-@OIl#4PCf7I>r%-?$h4^BweS4kccYaCwYG<@`{?T~15g``z+4Mef6Cd5TdTB(DFrzOTt`KHcKAWagWql zB`K@A?`}!cq(&h`$-b&c**t2#2HAoV=Z&>xU-F6M@j=PY-BRyQOFiE!_ue1&HR}Ak z@XCF^p`N@8ufognoUd9h{F>ged`=;&NQj1~)7iL-cT$tk+t+ndMw-c6ZpU()Nv zN%%zxRC=DlXu@nZYnv&r-MeOvVCqgk7MmsKy7MP# zGvuaoHa?|wsbM)rlL?bp+N!^M-hHE%UO1>=Q0LBEtMq0ouAQ^_X`hj94?NBzch+Np zD3<-lt|wrzQMbdxv~5@%i`X|xRoAYu8acV_3#Mn+=9#{IdEf>sZ*;no5nD2djxS29 zuH9*vJJwx=m%QZU+k94cl)5p6kEwFz$>Le0yiWH)KKto6F(@jKFT%u%*%L9;zL%$- z?nkTO*EDH5h^+w=`75>M!Cozh^Z0V?4i*2IIzC&EdGD3^ynAJo{WItD=1DsjuG8F} zK6&EL4XdsVq#x$D8ROZPX4XEYpL?%zI9ng0j0Xdl3RUN(j7i)(ZX3=By{q%J%vGG@ zhmC6J$5e>EQw-J-@WHKO zEJsL=B_hK?=w zMsI-9lK#LdQpSdoSBa}`e&{B7x%D`7k^Gn?z3PSGYY7)O3OcQY1#e27XTn1-LACDi zgcyril18{F8mcGCv1yX8@o@YrDU&)T_hzjal#j{Z4Fh4xhj8O_lIN|^#{(_ZkeH98 zu2SW?uVKdz5G&;zP+k812siyK_eje5l{^os2TDjHjY^dIk@`qkCC`gI6V2|Bdn0wd z=2@^hB~8hcQR;N4)ZIpTc0X(nM}LxMLh5dlgpWBP@hAtCdZtwyC1KB>14ifHg&O9v zc9*B>Shcj6}u+ zF!pnLE#HwQ^v|H;nw@1W$bYGG&Y& z26xMc@yTRfYO1<=@8aI_)hPK{60bM(lI*h)DY|OFXvP-G{^|>?gnXLqqPmwM< zM!}--I07yXAC>s?dAmc10Ych?KzJ_{k2DI(QkQZoxvqwH`lYSQ*9Q7t2VV?_xtnEQjGx1jhm@TX z|3P@QKRD84D+XO8EvaR95LvTnr{v&Di zcu~qJ`;Da>dltfORc^`O{2B1{OHe`T$0H5c3y(rnNx5DLvr5pjIjo-~ag2vT6(RYk zgi~c##=S~Q8E$HGLj8N7t}3(aOVyp@saJ>9El_o;CM?yS2ierhD9TauR~`|giX(hK z15!cPKLbw|mhzN?j%B4j_ksNexK-|{8b-rj_&Nn1s0?l;uP^Z|1f|S|3R1U6p#5s7 zcs+Fb0x~6!Cdsp1>U`om(5|Dz^*uZyb#+?qv$Pikq`sB2L)D4y^!Rt9WQ|*%hw0Oy zMs+A$P@XOIj_By<=;-KNX+(js*>isG+^~n3x(%qTmKAgD%O8-=j-Wp z&!gOZ_bArv`i>_%H|F8)edy777%%s&O|S3w;*`8v&6#}My(&*nJcvn+OU^?`6flo8 zx&izc%wnuZMq)JudF!r%3|ZtQ!g`_77xIh3ryL^kzeyCz_}F~-6KC`A1Gg}HZwRNu z$>I55(xY8-+IHzi$Cj1&Xk7$OLo!oex{vGcxShN2x`W2Ibfo{cOSK*pXH{MUCQ*(z zFa3qoradWZb!#6}m2&R)iqh)yO1f4_!$eG66k9)PM4eaW;)rx&@ux8D)d#u0;~m`9 zp(S1VzQLAsC)T8;JbrUSn%~uxZc@J$Z+V0zNBu;}HHlxers|!~^2y*nbh@iOHEXuw zmH7v>dfPPiDejm1)%&*Y^cgslG@FZGUU`rvcXW_=?x0D#J9uWyVofe2jqO+? z!rjz$t~oAY`snZ+gljKL9yRM9HWwa|<^N^7W#l_g3EpdD+hH>|MV0Ug9WzTlDyc&P?Gp}i}7Au^5Ip+v*cMhFHCaogk1CGT6pCViA&N^jslk$^nc`4H7NOW z2!@LRwt8gFu$y~dhNOk?mYSPF%D6p6{zm2)W@>nbn$ttgC8FlvII#tuycVKr0!IDXR@T~Nsg;1l=DN??Z;B)Eo0!YTswS`6hX?D z9S?n^9@X3p>y|=<)a$ddpDyLo1&WSBIYiYkvcVr{x(&}hDzBHk_j$hr>FDU_=;&M# z%yy!;P2}#*cXRgxkMjAhk_>yI6E;(TEU%N6&yHey;zqV?*-yU`i+J~k-J)F1;;G@0 zY}mVrjr$ie;MVdOf(A`5J!q@S=$R|nwrvZ~6rIQ5w`Zu4;F@B(;ZO#Tja$D9Zl~FhajaSUIu)}*q{x2L zcgC_}5s;F5vPa3q9&pf<F@oVP?rKhqsJLiJ z+{&TJ1DKQ4lm<2Bgf)gZ<%kk?PI{HsW)x!Dnk{VDv70F$^rb@KRK|4a#i_e~}m$ZMQY`8l;?6}9^R%9c$#IXu1vBOiE)?NYv|=qOGmns{j53TA(Q zAL(De&#)C``FZU&)=K`5Oz6ex4?bglQkLk=W=i>i7eH+xGS0Xix|_^Ht_9G7$o5u zl*%!XRNMt6oear`>WQIN1yPfmsvao?d%&=}pzR&f=!lW8=KY8&AjbV4NEhW$+5DRr z=B;38FSxr4biG^3_AHDaB>}{ccS;;784_0FRCDTPrAwW8WMArO+d>h-l8@md;B7JF z?y4j0;koV28I)a@_p7!N^G-EPL=E|qI92tl>O3Dc+(xB+sUA6h2GwgMFDj~#v>`Pr zfp>6GIq70TQa#*5=d*_=B*q#GG$fbz^UCba=H7Sh<)Sk(`|H4EYiY;LP8I#n(N<>kl@;98g0~F8;;A z5*f?-K}{%BARnemPZRspD4wbxO_ne0pb&*Uu<#4M^WIJGdkW*taN#mlqju~*CQRN= zh5K)(g279M%Z;^qE4nySS-dMt^yaW4YcPpEypR1mN>QPli9jGEhs*?ypQhgpg(#dq zmQqig=3^;SJ<-9n@~E!Np+iiWvXAP$yHUmLllZ;F7A{M^0~2|6S$PJ&P?LbmMMh?T z%6*=q-s)da>TAfGN!hz!qjkvuF1aSIbq_ip-_CN;y^V68i`;NC^~6RYV;4V8*-WYK zcTmNm;?KrXr8#%SWUy?f3ln}4sx+fl`^E%3*#w-WxTS6tTnCf!Z5YRptt)t~MKKEI zFF^i+cd#yHGe?d{8X>9c+VyEPb0s@P)0dLyT!Z`QB(=J2B|{O8_zYn?D3cMRFe(;ksRpf071Wt{3B7j9Y)U96v5XHwhMq0XOh1vThUNtG{aH*1ga;>^vNv{aW>mk@V z8y@=@tYYNnIyuyEnA~PXIZKqWr%=5n$~T4=B;E|E|2Miw8NvaTlR`}ZskKK^2FG4l zw*wAInJ+ervF;ZSNdFl$OpMmhsn{u(#*I+6Cck-Mhr@-!c@P%wOno7B)K7vxll#`Hj4EAh? z{$k*k?*=6#e|g$roqsXe@{IM7cXUv{oM%^edg$or=;&NEl;b1zI-0j=#gi|8NX66z zy!hQJY)&WJCp}4g(f&05XbCAPC-|;!J<_w?WK)ch$v&oc3sK*Zz@y)<4f$%%K8_tZ#Qr_|@dkoSyDyfMEdQBa z5-LWuzDGMD3;l7AAvI~ zzNiyMOh!LGul&x*x)79lDnUY#jT{wyQB6FmhU1tDM)LafJscCGB5U7NT9u8&Ak`I4 zRTY}dY!jA9I|fyMxn#IFtyTn;pE*ZEgv@44qLiv$&I-Gxu;*%`A^By|KAtM)k4?^L z;rxEG++G4&*xdM4{-x|bwI3pPspFh7t9xw1B;^gB66LqR0M;Bm%+Z4fIJp0WHGC5%cFfEaqs+`0Gc$9{%*;v5%uF#eGskQhWQv)YNhXkn5_ey(Jvcl*BnJlPg)7Yl3T?a# zfq%H&;!iJ=H%$Z_6>$chg9pis0bMYp?xBacqP-7)$V1(eR=-DJ3nkZuQ2Os9dHZ5; z2z(}9g`V#Jb}^5?kMtRGne}}!Z{q--B056(~;o33A`}VLd7C z{=*oWVN_(?epEDd1jmnMe!{haZU0|@@GG0YO34d_G=u=mF5 zI}z%_FFR|!DUpx#yM_k1Sj97^9=mE|8<*%P%)*qLLTd#?wwNggJBTI~zJ%OnepAf! z21^A6;U>bq4N3P*@l<}m-kDOqWe_2R z-t=02j#>|~*5=d&n;eYBYA`Ih{nNPq^LS6PWMWOi?M{{FWL>ne>iVTi048aG>;c`Q zW=%9zmsL_hz0;f*?qr_K@S>0OZx2XA)M$QRwt!(ji3nkhjp8{ zFOAN_m8Z@Cxm~U1FG~RH+I&3rK1mdosbO_=0h#x`W$;u^7y(mRHgbDeu`(xI#dqxO z!q9{=lF#@UQf5Ujn#M!lHI?#}-sna`Ga+jH0PlGsn8djFqH3neWEM*heIN6qdug7+ zu8GyQ1dn&4>&{dZ!G&q6Z+^4~W8m2F*SmZl&N3MpcFI~ZU?D+`iTZw8-55km>=)a9 zZR9Ggv!#rGnN3rrpA6rH6JG^W6It@FO)Bg1x(b2B%P;L*b2+ZP6RJF6F6D9^Ofolq zfAuL8WrW2Dj@Jro7DtUzJn!@>bswuitCUPh9l|Gi~2|2Fi|#p;VDmdewnMd~3()$j3H{`~+M|e}ary3+JHw@aAL$ zY;j9ZZ|m2sRe_BXq#%Bt^x^ft;oOlIjTv_%daQS)P`%5|eoq4=0iQAo&y?strW*r$ z?amY0oGB#|6Ga!0pU=7*BM~?`G>7~^2TzzD;%D;w6jGM0-DZKuM@jnMGzl&KG247Xmo_{g{lWWIvw)QEOcFe9(wVIZ}wUp9Nj4q*B`B_ITW=|FypiJi}$ z2zX#JeDR?OIpO-_>_w^&#(1#pM-Mrwx5QT>tKdVT%mMxOIsDMIQ2e3q$7OV`O|y=U z;G1_SQ~3xk#U=IF;X&~|`lshy3u(EVP6OH4b&jX*!AOH3d#K94Cl5MG`jTh$)xjT)_CDV z^PaRH_t+plkDm+snt-RU2$V7_a-i^qlGr=6BA;2Lu{t~WY1t;0tzOSsrfJx2I_@t?z)P`-HN^ZeMryJ&?$iXmVGED1r4bG zk(s-_`RgN(gh8t~X&reAfPBsN#4;+~7)|z!=Y>Wl+E~I9-2JT*Xi4#`Ke3nZZXCj! zh^@3=K(;VtG{hQ5>f7hSQD*p4n$7zrA0eG@YX6{2kZ8O?xd{~W7wGtv-|FCY1Dle6 zY-_bUb07nj2)nk_yx!%Xj$b$0o$iKm>k;=>(}}JCYP7HHatRD zW4zy439b%QI$|skEyR=wGmTYYJAl8D8C6IrQ&i4T@#>Zs(kW3mxkCu}OfUrB?ka^S9AMyoOd*b|G&BxLiaxUJW5m#t>os`>wKva_6ab#Zdj^#=dB}#m@;c z26*tY8O?5gdnEcRc=<$CjYyi2s=srXV(zQX*J}zVZblua<49r2G#ZrvEdl8d`(ap7 z^%z$nzQucF0O1eSxvmfMezZ2Zs2aEd<@D|m6{facOY+Jmi}ZJuKGAjorPP9|u#LN~ zt5=VMqpBX|%=)E?T1jiRfrhowM2)go~pHDDhFv05E6{) zAtSiU>JB{-64SQmuP~>C`S=#J*v7;b{P5C$tgrD_uuCECA<1_UAG1XBOm(*Tl@Mo& zj5bhER|Dzcbg>=nZng-E+&Pel)({Gn9vi<^;uY%mmC_aSWz()!RMWP}*$u*bL+p9W6Q11T}+ zHvP$l(jcjIaf!3Dpxz{^r7PYgL48YHviAfN& z-FC?nh947-f|8-n8V~2Bc;{2d99G<<`T7y9b)>@d^{*)_D6G4Zz3siqZzjr*54%UG z-+VpN&)jmr@GOZ>%vFdX2;oFM*q59{PVV$e0Ta9n?sX`aG<_X0Q;Vu|Na!W(Yh^ri zGptGOD;mcj&KVE#v5a{%lZ$_#llwHBUw1=>df2;|b}hL0pK=187Mw`Y@{_sIseoanxjMnCFSuy9wG(vZ|pzY!&`I2{w zx+oi#zjqaKIvwKK46w2VP-x|9!17dlui;}Q7dl5pSh%jqr~TJNThUV2H^Uzm?)xu) z1I8_spWBat7Rn}uvDSg}C9&l!-f@-w*oLpr1^_7k!^XUPlj3r+7+J4fh&d*{!xzVu z&eKHG6Mx0T^Kd)Bo`Ep+sxkUCxCbuoK-@hep6jS;SBw+T?u@ILw5ZG2RQumy(0k0g z_rG5r^iC95J|Z>T6CeZnjD(;h-@H2XhiAm&QNY zq`_Un;}As^s7S0IUqj)`)NeoqD17K7{y|WEtcZZWGI`!^nax~H%jL4Q`J@$$>VlMNoyyB8@G z-kkGpf6HwD|Ie_95LlbnK<-OAhiWL*2@VuS$e|B&@gd6QN{1u$jxNph`6WeiG>$8G zZ`$wzMVL%dATyrWZdv(0Xw%uXKMl6zeZP4O!DIBW zYw3MdxmSV`@x0gB(e>iom`{ZDQ9f+tF{Xj?b{%bttO2U+H4fPJV|+Qbq~_tD1TvB@ z1;X>i!q~y*7i}d-=Ce%9T#a3klHRoT9%mlQMItQwEnmq0nZ!ZI(4^-=k5;q|NAC3- zK&_114R1PSu7?`bXBtZ>7Z)}}9ELyV9!B}?q5tK0ZXgN#`i(tt9QpU$`ptmxR?}e? zi+ck7510qzN3T$hbxgw2`g^M_C@XstIA>+@#d;Ty--E$)INEaiz!XnBk6TWN>+Oj& zK+peEAju*0)tZs&0{=#A+AR9rOvY6SpDf(Ie_xQnkYlbp6eX{fLx&`3eV3!IbPnuXxQ3#nI%j-fuQ;b(aQ5M+A#3m?&G} z-q%~f&B%X-mFGlZ&=I$E$Vi& z;}6&y7Of4puZl>zM|}?6E*ujRqfy#^%- zpTe}4M|#JyvFZDs(5;s*`D%-U@z9=9TklBYgb+zT!GzgE2{MuFq-LlXB(gW6Pg$5)=;p>z5-cP1m{x$bZWBZ{H_y|IZMEKvfTpINT0>&et5@b|DF=}n() zb;KkXUHz^&WOAKo<*MlB1{2%7w}@TBxPhmCo4k4BG$CO|{NO;tj?8kSjfnTIB3ni! zL6Jy>i#+=b zx?Zx-e&SzQB%EK@`(Aj;uV}{;5@bp1_h!#M5>B^ksL^SZiAF6jmgC5qp4Y2eGemzf zjZ~@ZyW^-(%N8A?R~0bAs+Sm3ZIl=JpC^}bNn6lVMC%eS+{|=`zj- z>`0XfyCEnY#pp9(B$@4W_D#wKu~h2ZPeJm;+sh8y5hPeR&w!4PNxY+{1_-Q9qaz%Q zl}HXS*uK(`Q6f`K{HKlXD6jj2;OtYndkUFo&n#f{z_Ho9Epq?0gwyHj4f=Sx>A3Lz zOqi~VV@{?v@&lXg172?O>+{J%pYhSex*)>UG(;?OcgO;swaWLigRdu5=uI}MNM6=0 zhwulWOucFdYebJD(j&f`B}Y(zE2eXTAlfTNH=ut| z!v4-(YY6-u#Rs+iUG#>oV@#Nx{~ZJo}`@Kk#%_`u+Z{lIpmc4_K+wWPyYH>mgwH1oygZK+D2aF6rVic%AcOTTH%8;6fw`F*f=4dJm*tl0f8ds zd5I%p8G&E?Mgm-gsI`kxQwNlRc0X<@TMvk1>sBK$exBbveSt`PizLHD`g8>>=@f)U z4yI5SH%e;i2G2{wn%*}ba`EM9;^O~;q!v*j{xfhg`rSbQ6Yv)1IZV9wNU|R8j>qfI z5Cj(7ppaWBRi=sZc+M@HI_lPL7@jRVB-1S4EnS?c^k)4?hFN0(z~d7RVbzn6Ldhw* zyC^;8G}BRJ6CxE3e50-I;VEwROgf3l2d(c)BzV;MPusg~JZF0dV6BM$JxarG5mY$s zt`9u$KWvL+!F?Gv(FuM}Yfi3zA{oa>m?>#?&XymhwaY6%{(1b1^|`K;hk;VOrO@D8BP_S>kcyb#d!G?N!Fxe z!24ewUt9>Q%+7@;uQK59>iOhAokxBUYab-tvJfpvYw5`dH3Y>Ghxj*KrvwN>E6|$bUnU#DI0~TA}pju!bHmzQ#Z-G-hdwimJ|ptT>q&S zMd#Omv4$*yD{0x(QAJe0vw~?KF)@VoO9BdjzlV5&zs0lJwY=ATcO3Vr@p~W_S5$@C zJ`vE_X^%%gx(rC#W4&)Srf}-Av$_(cV&pLGlR<-;vI(<)!fiZWai_ZPlNVPRash$h z=KJ_2+r9EI_uLZH3a>|~-lI8qd)q4_!qyrU#rP2IQK3M9ATDEfy0{_?*lmR!C-4u^&%lM-AQf1*eGUyabT%*)bocywj{nu+kij`V5<-!kKwFsW4yHhEd zD8e}5)MwJ(xapV2GqvOJm9?|tS}V0NF$<6I)s4Wo3U=yxR(pEVn05K>+vD4Ss}CeT zXN)MNH71V;!WKcKmfaRjwVLVQ{{Wny%zE3;a1%Y|q#`l5&GpIrS_!pW#ts(vD4+#v-} zE?k(2#95cwD#Y6tCHw#ovBTApL?>9JkFsC1^lPjn4$7?!V;%@uJ>2R!%p-T{Q;j81 zO}~XuxSczr8t^|@_OB#;nhi8JQe}Q}qy5EA0TVbhg6|P%tS^MvX36sX%(&noc5nOn z@-Sa$^E+lfa1+tN)0#9S*1YHxfi?USWBzDu&&| zkZQaq55|v)+)DE7!w>WdCH$pXDx;SpMvWv22eo7>Bv{>3Bl9BA7#F1sLhSwW`1?!3 z1Os;fy6A_(AdHl;q>eq@h3s1l{C&#PElsX=Bz3x6qu}H(bd%TUvEpAk*nk*)R;|bX zo#pC>ySNMv4b7CPP^=&Sd%yzKgunK6O0gfARtjak%Oc}RQ!qPvfzhTQCNg-V<<u7{Q9-|6RxEPRg7t-d4?C|X=Xu*5Qs}=Y)W6^KTiEiF#bz@Yf^s8iv2cti< z?y1+wEjV*q@AmMYwAbA2Y8#rZ5zQt7dk1T&(%d+VTCT!wi^|*|wkxT<$LY#VwJcClTOlt-qFL!f2eK);i_@|n# zCG4Gl{og(Fg+q}zTA%13iumA1bj132<-vY(DlCyt$7r999pW!8I@~XgpDgZqahZtmEf*$o*)11V*lpWRWBJ=F{SoPK$AcVpsWsaX66ExmPdTZ0+&P@l+?>;p39ZW&}|{zNSPI+(#>K**(PXk5XZM zX0wL(=~HJ1fJ7kR*T4>WMjm^65#Bo`gE}~*eldy}$fO!oS^zl(F8{@P|6X)0YRN*@ zdK`ODXCgje3|4OsA&FZwy^H5QT4<(sjN4QkKtWZds#Up_D^TMmkPwUTbU-i6VY{nH zyVxzA&ItKv z8{Oc!fZ>5%iKgW>G_~Gw&foWa5qR_BTz@TQy$$&(CvzPF%jT zOTn)smaEeZ7oP*Z95eFhbGhk^EG6pxh{R^h+=!R{&V2fiH30H9kO^k_6eT|{G+1899yW*rM|?oU z`9djM3jPz=Wj9EJhs|FA;Okz%ByxReQ(!D?sDvYw*Twx6>n8YvSTgt416sTqS`8V- z?bf~55WrdKtF*YH3YxTOR5AeTs-O~r!Q8YuIqvCZvJ|Z&@70Sa){0xWYfBuV;1^RP zCduwU=JnJK{;&}Xt%Cnt`y{?`9W3tSL(JV2kSs{Qh{2IQb1d=d{e4L5_0cc7>=J(J zy1$LZe>30*rL)|(zj@4P|A^W9pjwZ2p-g)F-!qiN9*uPFrtUI6e{>Xbi|6JS7@xMD z%isz4N;)Ml2ID9!F4C*@SL0hHe>F<*hFA!$SNkrLq3@CTutFXvxsRFEt$UP~e21Zx z#ZDbcN@dgk%r3rG1g)T7v$F+T5MiD;U!1FXKd#rNbDq+72)#44@L%rE^aFY1)CWql zMoJw~EuSX(`~-fr~; zB{LZiG`hVME7M>_1`4=LbV3sdI?XC+O7LMcS>s6WG6*mPxYmlR{Qj9hgSHxX}P?sxcpC9GhzOUEy3>W2bgLdNy zA>9U;Jk;NH$!!U=9ux|8qN3=jL+{p+8hGw7T?aEpakrN*9LjC<(BikQ%Bk-2w|8#n z9DtTU+XDb#;M{ssC9NA4Sq+5}{FoL^*udA;Y|gDNKPZUaNe~EB8IBfKs{JsfJWrce zxJNWTGJeRQ9BX498Q$qS7y%|!(1eP1imPb(d523*{8;nhY!@fC!F4s@loRv$R8P5I zD%w7_$2L;tJWjDUt_!MYhU3|;nRt!kDp1ZR5O7oSUI6J##0rM}o?X8^^%0gC{_ZCu z|0{h%I&x^L0e>9mFGfGM_lq+MPVK3s)rlm1vZEXJ;>C?Jr-I-rBwDnD>jUBMbz4^BlUS|y&fKbyaq+iS|dJ>^)dIw42ll5S7`R8#lc(^*LdDtyH&NFP01 zSc2^_YKYTL={$NL3&N@kW-U%G(HRmw(`yc%grl2w^gtccMNqC#6{%k2r)b0up zevTBJ_)RCwrm&cC!HqNM?Y)_`3Sx%6_ojTw~+5gWo?689oR_F#yTtv>(;3afP80M<0CoX8J^ z$>di`(!BgM@GW|#DbVjn>UJ7Emz3KC4K6BW9h`dtryB)c`Z!`GqFgq)=i1zlaVb$D z$&#s%yWY^X&f?)}1ANHea+Rp=Q37?<@L*COZr6*^4o;M=9e)FdIfc?w9dFi*&p-aR^ z=jY;}86L?>xm6|&3`9A&G7(l~Zey-v_=uLM?iCzG}PRu1~ez*X7*Hbw|G-7!8&b$mAAD5q0qfiqQ5d%`5{w zI%cELrv`ycRK%RoIa*JtnO|aF{@16ql3|l}W|N-G)6Tg`$fg^+&eEAuiIBb?(Y$Qh{5ex}u-PRECfMAd=WQ{*b8hKOvuRu+=eZCT zX@~a-GsUW9{5-TdZs+>>>Qny?etLcQ$C16pc<1^r0eNxpnqdY0=@PyTqvyc`pI&xo z@%JV&(Wuj;<>X}0bYyu=J)fYPsQ2yiCSsl>#ah2nF%6fb;`8i6NM*b!XebJIu1F?n zvqb~KB_R2HIL2;q9X6rsOj;{kX?k)kUS##s_aiI3kfFGi)kk~~m*J}=%-|sISf0#R zw|%)h1rADr79+kcbfd2`GUm@YEbVlv?X&*s4C+W~idoTT(SvCeZ{0Bw%tdWRd?$a& zF~e=m0(!y|_IB<@Pm?jHb_NSvo{~nDNcxP%ZdM^YFLN{%%Fu7swCc{p?ANKypSktRhKt4?qZWCaS{7rwKh|nEh3_QL?IfO;Jhq}D#H^W z!j0DEVuVr{M#Y)< zlVIowZ9<1cXtT{BE_5CaN@V!nzY2R*7vHub(ZzC~_hOkc*PIK(aG1aoOi`;hw$Pi9 z^2)}29{fjB6C4xFBCTLCbIN+H3f>x^kFFEQ8-oWH;76T2B1;(e?9%EF96ut9kSUbc z6jf9?B+KWwAQYtRJF{d)vA&HTBv(DWjq<~A*4YT25sRWCUy)Arh>QC!eUe5duZUae zgEJj%zhdl{alwy!Q>W2XnpmCAV~0mf2cRt+*_^lpLBiV)S$0>Ovl-QcLG~TSlZI0m z8~xm3dFHR>FqF7~dAU=9#rQDc7S}g%o^y^H=(_3^V-a$~m?#IOcLs%4dbJ&0KW@SR zY_@MKDA~eseHUM|Riag6I%oD5xCYMyakY6&zSip*mAGG%>qo+2o0FO1udOBm8YH6lSsCwhUsEsi5nELMjyWE}ZRYrGp3}}8O*NRz$W<-1#3@hw zqIfu8gVsEn$FOkL#~jh_>g|{LQtj5oT;{Wm+~kJDgUu)&Hk-09)4CFQ;@Iy(NU+`^ zt|z{V?8ndb^6Bi^=d0kPUVTK8qZ8h%EF7p4q`99fyDwFd(|aCnfDDFM$wZih1Ugv}MwLG3g2 zjh+Wh=NPwRwfHPP`MvYbotzKZrrSzMK!ZmEp<~ZrB}2XbbB!ppC`j{?zpYe*iyqEC zeQT*^GgtChcP#5>?=VpA8WJcoIG%s*J99`U`)J~g@e`g6lk2YP;9Hi&_KJg@6&{k!D;TY2xCUvfrwQyT@|$cqh*4B3Qv zPqzXWkI2yZiqxMl_a6ZS{~BxtRRqQA5t)i)+&fBu+UEzyz?2#oKDNM3mX@lEfl7b< z7cXk`j6bJ0Ul)HHn5)H@Cz{iNkW+SIl?PDZP&y^_NO8U#eL0CzmG8JzP%iKxv`MAQ z5W|C+Rf*HrN=;(OBMizmN&WW3fRhFfavE069ix)7-A>$#+bfR2u4;k^Lvp+8Jeou z7I>ZmJDWbzgTLwMer~zm<+X-Df*7a&-wXKP5RkIT;ip|0DE*Eb>TJ6Yp!FAHHuSs0 zvqv1-ElBt$-w7*EpC9Lb3n2M5e(Adm-weE2e7=1WrT?>;O%G=m`AX`l{Kgf|Ld|=| zcLw=CzPbCG!heoJ=B~qSDMV_efeI{p6kjjqz%mR(;~FQh_qA`Zc@R&NOX(iNt%NtX zPxIv?QxislN!kpee?3#@Z#EA1c&$@el&irx!5|Xy^jccZiVew>9VQEAg1&1+eDJ|0 zRbWCSNAJ51tl!la{->VNXCr$mQG068_z(qSn9EO^zVE?v^t~k>H(XWW*xNOk*3pKy zmAcyD)2Upa~j@`OAL}`2YOy)PbkJACayT+-7dA*fk}lWW4dptSd zHt})%Rud!u&^~X8AZjryPc`JJlYuxktDse)H zn5uXptBI-kmyRv!%-IHK6Jw#}L#APLI`@ZcjrQ(sL83LmY{d4b>B9v6>ujU(hfRU; z*ebUwndY{Kgqgpfyn^D#_koBMF|V!W4@ANaMWP|Ac!GhSs4#6k6szA-nI7)V!dOWq zP6S34lky50X!hP->17m}l?x>~_y6@J`kpkTq)@YPe!UjH{P)7kRKncI$R&Xg=nQ`# zLfiYyg2G&myZlJjn7b8k&OY-qb{WlDN9YV|!(pTBI*)RnIWJVh>O z@Sbr>y02-3QW^0>*w?n4UYm$%0zHpr%5kw0WHnTNPKz@H=vE&I!bTV}`oRYEYY0Pk zVgHViy_xT$?bi9SO3J-1Y89y(l5xVZ!c#O?Sx1v?`icuE0pY(wB2_xnWg<1I1`uyR zI}LBc6KLHsYk&um-UEUh64Sx)hi+Y!5;uItZZ=MWn|UFArsq5;&Cg8G9HIAPH|nz6 zSR8GAT&p;N;K9B9L{d^*6!^tftDUbA^CqHw&C}F+O!IiaIPI02_>}JdxsA7n8Ee>t zL13@=g(&zEU!h1zbaFJ2=lucg_&w`E+Izowc_c7(%JHi|Ew#`aS@_c!ZRs0bVCdrD ze$}e@>npi_BE`j`dCIXNv1@Tpz$?noT@0JKKJ$@$8xg*MmimaA@L$WB?Hs$6x|GkG z!tis8E;D9-`LMfZqUUX}!>An8S+t$JTV}5FE%7?(iPH=~iPB&B+w0%+B z@7ZdNIEA{Jd0pf9>nP7CVUws5O0c7DoqX{H55(K%O@`x-u8P$33TJ|WCVeImE2-%P)Ba|Dr9V7J{W{5AlS!4gtGv_2bSYwMxl)(UTI{hC*TKWl;=q9&x0s z3ra`ue1)IcKd4xsAEKI~xx2YzM{q>*{mKuQ7ADEZeF_y~0AGz}9I`T4-07-0bBOT z)eYQN%EoWl0Xi<&!Ryb|#~;>f2`D*ksiS)eZyhwkKNeq@?yc+|y&+5JIkq@E&(U1i zTzwJtCSNiQxWC+(tmk;2Z^Ux*Va*NMPyolbs{0cx)XG(N+@<>s_BqPiyt%uFtcs->?GIf zg<+VV&U*iKL9)0p7mESzf3^1_1XFGfbkt#Hm1&8sIFQ(<=h@uZCiPmeZ|M0Vq$%JF zV`(X8uHXIGh^BIdXGR8t`~K+l8?_Gggmkor(T+YrKBT$NOq6FVj6w2A!7lOUd35wM#!Byr=x+|3yUz>4+6; zec=5!as`s1I!6S4#gH0ZCi|w2Ci8Was9gPamn3GH=%{Aa-z1e3B&Ec$ZD9Lk_V}qO zlgHyUnH$Dpty2VT2Ci%qJI30^tZJUY&2gc-ru_qyTM_0Ehm)ZdQ(m=8K$tBS1`gHf%8G!HbYd%4i<*pklOx=B-1Fr};Rvep&Q5@j=8DLB9KacPng53| zFTwqu2QJQ>wPx#+Zcpb275Az$e?p^<;iQ0_Psihi7KhU!6B~KO-N}D5^tEG^4s&%z z%CvZxeN?;(hbD`{2wfWH;6cQKz@Z54t2YXNUbJT8E^s>bBJaDbtNKe)ykP$^<_l4! zVtb-7IUoIY-iWj7s|yyhM%IXt-jB^pkSFnG>DB2?1{YXP@}(_ZY7Q2>pQ_*F>yB2P z*}MmQ7`Zxz!LIcns^H!hcwm3MESD&T>U1u((BJt^7P*r(9!;RKzSP%qkla!<_7L@5 zsmx_KG5cLVF))QI(rE5DP)|IEqEiglyXb0hfeeRP6N=_d$OKih!{AUXmT(`EsA_aP z8-((rv--+ZjAjq7CHKI&WIpXtZ=AQ|;G8leUH0i2vJu1%9E>9AKsH@{2DG zz03FD3DVGuMPnZs@lws7%6=!(7{@8Lnq2ih3>(nS#&P3=;WCAF-8dDWFBqax>G&8I zP>)&Kw$Td_tXO*@(Npx3Y+uba9Rl7=_#ER1W#0?79@q@y3N!ER>gAf3Z$>Oz4dZL~ zv2&wr)wMm$&Q2X)19{f+@x=0~fblZykTNmkv4@urX`|eLdTBhRP~3hYfm{ZtUbb6D z-6eryj%+cFZWBVzMpoG3MZXP~vsZx82`-&%Ifg_zc!_cnlGx#b_aHD!c#l$`9@K)Q z>q<~M|BF5@ON9Hd^xF*K5%&X{WaH>*CxVT zOI)RDLc1Ej3+tP{e2p)Dy&n1Pahmyw!q9$1u^m}Ne9%A^5xq|`r=&UDkWcYza+*b} z24MVrn2`1A`xG2ci#@k73RG|mgZZxO!!NQ4PTiXy?x=GMC8k(>zvlds}WFpp}|A0EzB_x^c&x0 zIHI{7&2tF_qGC=L>s`*xJnos4^75Ge#5(&y1;+@Jrj`YIhmw6`LcTxMx$R3e@BN6 zz)QbfESa{fsW29Df$0{m&L(@YQ7e74e1B~t7M56Ge_6=vqwJXwhc;hVH_ z(a}w9bn#l$nGvb14ga4#4!tv25Zb+EqDBh!na+<*m$2F`)x~^YqAbwQ&VEFgH(DF` zJ*3CWQpv27MeXdS#)lL2;UU4)49jYiI}4@WcTRgYY+e50I83Ie9B|WnBGQeqp3c2X zk%`kGh^#1l$HV#LQ*j4aapa;KICHW`{wJ=vQGCD zU|I!mk&E6-_K9wU_+Xn+spaGqx3*C?@?~?GtdH^rGuu*g z)R2Z_L4uIvw^6iwEKb7V(XsdjYZDqQ*~(5PG~$1TPQl8+b9udsp*@xefFre*DpO)o z5tS|nj2NELi9!_`u{to$ z?!|#bC}@q5>bHXH+(j~M%J=vmAd!YwG-e)qw=Rxv<0F9q1ViJ87{VXHqR!=C<~%B} zU5avrhU?3+H_6myto80B`+tfTyc4J(n7HV%XT-JvN-+1Oivm9%Yl*)Y=>yhPsa(FI zVF{~ioj+Fozx)%jDH^s;^nGj^zA5m|d9VL$_+fKuBZi(Q8@aT;}^#$U!Yddte)a<3^ZcB#i(p)>+b=KU)(q^Je`gvKXeONnEf~k_3qTmUG^R z`9A6ux(S)h&#o)!eaXy+%0=qleyf`7mg6!A*uub`X5l3KhMD{MsdDE4^f}A(-;!Ai z*_&-i@(GoF<`gz{iFU3g*t^$1_>)RVmG<65m9KM0tVmlL_~)iBQcRb9Swafx)n1yu zL)-NB0E@umvj^S1066v2*(kknUDnZG`*>=n42tQ`eEamte^igiz+K!wMeHMYaAkim zNL}r59ZWp_ycXLmUOeoyTDqs!PyKygFi+Goc$Uk34H;Wp`ddrg79_sEB*1Eyw(DBB zJR0GeCY}Mfd5VPc0$s>A#P|JX->r*`y5%z|f$#{$hGSY238pa7>BJmjI|uYq1+(*b zeP{Lc2pD)Ow8Z?W-0lXS87+_`#lH>RG=RN8VXn>ZjU z?G})$&keSlL%uy}(PmedZh5H-HvKTOe`FF2>bQ3}AF;lmbOjnrR;SOAFcrd4!j4W;24vx-vM);Cf5wXYahN;%Re3KSm zKrc)>nY2x8w#Mj~jXj`oB}K7sq^d-5Junk$CGvUIEj81Uozri{q$w->g5uq#B4L{o?&P z?6=p576A+Yxj_5uk!9JX5O;Utb^!7Cd3vsk-{)gvK>B3lI&K}c2T}BBnvM7njV8wC ze6e=q&oVB4zA%k%1!B?l8w)v^400AHs`bNlXrYj{1Le6IJ?>y)pE{JEzk&IoXJbGux;kqw>IKauMVQ zIoU;8-%Qu=eNy?hkmL90&6mSLR=YMJ85eiUPBMnm$o?`kqTLG^Ohz><@O==ex~VEO zdWRTo3rTY*h@zU74xDT~zeQ zL7Kp4Ii$1Xe){Thl@dE^=Z(CA9HV@(JHKGDv8(@;Ohm7H!)HGFroN62J$Zsno^k#< zD(CS{l9+#c(3L0c#go@$=#VQa4rM)-$D8!|xPfTGkQp&kw)^LWmO;oMMu|FL>S)I3 zMn6g)60~Ub%G*|8Dm5q!Giy}77KyDy&^d_rpcO;v)7>_FRmnd(*iW`*?O-B;dci=- zS{Y$xDzxH3^5-bQ6!LUhJ9LfB++2weX31_>mFBQ1f4G`3fDbmqZfJM~%Or#lvAv&p zqoecEKe55ylFw$B{=?1Xot-Zxb)6#Zd$v@2{OraLMxP$u*IIXB3}F3&yVu*u?@2ZJ z`#m`b56R`r1%=i?Y&6j`_O4{W1Wa?%RU1q?gXVDWYN~`x&SSs{zj{RI)i?r!Mk003 z4NZ`)qXxDbX3Z+1S;ts{#-9n4I7k77e0<^^m5ZtAB zaS5))-5mlHcXtS|({KH2?V~x!B-hMj-uIDP9^rnDn<%uIV(sj{sM46Vm~5R{hPYA{ zd!6j%K7-hfSvw4Bp^;`&_hL28J{yCMce-&gQjskKVOLD{V>JRzawo}h|xn%B?or&2F(mdjW# znS@UPJq20l8~oY9V`k!(VW)K@SeYvA^NMO!53DWqb~mSMN;WnOaIMrQ;^)ndsEgR4 z?N6A2N6svH{dSyK(jrQQhC-Z~M|KKZvSU#IY;jB6Hpq*R^+_YbvXv4=^4+VjJ@HUt z)IVb*6lNZ=cAQokhT(eCco-yU^Q>9v1H3dBPE^~S73dg|VQ8y%lpAg0&9qbq-D!H? z^g=#;4|@dxNSEx5^eUmsG#%x#P^65~n8f~^lS!3#PL`fhWx59`ELGk(8+yf7*t3Sh z4tlOOV}#EcC(Xp)6u6?j-}}yDXAMn0^{M-a7Ze`uoXzg~?yKwCXt$t=8vq(O#CmML zR8q_}PqJO!uY0k&{x}GIMiN2y{_)IM!sceeihM#U-PzpMbR1t08Bk6C{rah?xDAX{ zgs2)TcU2jSw|0jA=D@3SV?A@}K6SxC*!OYEbUPmtzr3z2OrZb?&>ql8 zJe^i)JQUyC3CW61%r2a0G{0hP5BInhREBK^fAIPBPKuY+q8sfEy2xyhk}YlQgG40y zVbkCc`|R45TlHyR+Kk?O@WMz1g(BFsVZ@OOi}ko@e<-;zASqFX?3NtN52&9bIL1d0 zP^{AtIlJGduC2}AM3RBC;)Inr9s%~Uqbl6|kVh;u^y98exd_gu(p7Aah%apuv|BFZ zf&QePM4=NaoM2qslAuibF4 z`awgi4?}9KRoW2~N^LiYQyDTM*A4i$RVUB%%=1VHGpao>} zk4Df~YT(D+Xx7bL5|JvuQ&BWhk>A0QBaN>l+*IG`1CDSHzjpNsg)Y|ZO4)-{$Wt2w za70dFu_*ixqh&KBI{vyhjy=1xwzwU9>`?3U#dh21MoUsbbkdK=4ipD#f4Wki%I^I6 zDsPG9wi`s&SNa)Zx0*AjC~r32rwsD4i6_P;{}Q-otDnXbFR~5#*7K>+8@e-J(FcfwMT6uPodqjJsAIEI2T;W9Vr>MH^LXM zR>9#Togdq4R2`on*dVP0P0k2P{b_L(6BG!T+{mD46WWrI>6H9D(-wwxOoh)KLuDo{ z<6-kG#$-XsZe2B*%Jn7;=zzIDsY580(Ii1Q*i=nuvVq797-gfa*1`^4{631G-9@|2 zacG(rS)GCgSqV`|P`5CyN#o879U;d>#d_ac)#767vg5H>@Mmc6zcEE5g3Dh|$R*`z zthLrr|9i|DX#TJ}d7C`Ljk6M<0!A%uQ2R4Be!t%Y6jCY0rnfhsU0XSwI-fkagRwh! z9og#?$mcl6LTCJ0gM(cWRRtC?=Y5ZQf35t=$G?^AX^J*+Csdsx@0&J(9*xQtjwg+B z5db0h9e}{&^Dw^re#`5%Xqb|J@Qh{&d7^kl5()qc6GAA0`W3*7_w1icc5<4dU zf(C6g^;B`O-=RH1==^s>?NU8C19j(qTAedorM0BL?u{_5ykH14P~2|E9NcPl6{ghm zm(RpxIWBN%+_@Y%@(HRpPdi_of?$`f2FW7Gi+73Mqy!?P9;iZbyHp==+YK+Mi@TRq z>aDDouJI!Z3{c8)gCuNt^ApsDa>HE+nnJ(TS&L1t9kd`pNksgNUGE{Pf(Oe9UcgAkBh=KzFDT>Z*UC%9v`GD=%EVL@o?17vRpIF0r@tlBUc6k(6H#EBMFV(MmkN1OXFc z@n}amok5(ao~H5Uy?4K2XRDh)pT?6@O-5}w1WB(p_tx-t%PrSfXn#zl#rF>9zRGfoaBhlC$n=NUT(tAvgp zlUvlA^7aj2BDc_r_1ZMreru6pgn+xMptR6Z%A91 zZUNHyehT+4xr3A!%@hHx0Qp?`_HP5a0|yw}qxTo;mLIPzJ8FP{^q=zzpM@kL-R}3P zZ~aK^HEzD{$?H75tJ#WlV*aOPxY+)JB0F(@Q{_Y$`{g+jJ>1~IDaO!q(p#_YYD76H z=@^i67&xvb&XPJHX_;g8l-yXYD(BEz%nKG~OJlLubv>UFfaYR^a*kI!4?7&xk%{hx zN>1*tvU;Bsqc^swh}l=}1_T2N=+SxGB!H>g4a~f=L~R4zQ6%B7iOtXFRuU?o-szK) ziX}fHIxFQ_XqnSe@U=es6^@gPp9GdJ23XNA*Wc{KSGVz{)9@xfp!VR^c=dAh)Qq`o zMMCGVb;O$_aQk35>?z&iHOR3rWf8r53GOY&XnN&;PRDw^(8~Ke0$8jcAw|RgqccQ^ zU^M}k;7VZAs~GX~aHodC-v0MKJ(k`q(M&mPEy76D!h|%87$+XSXDA3l%Z`#vM|j3l zaE{If-uxC9a!)=vrE_Kf?(9kOq)SNMG7+zjbeDf@cIycPoLUs3G~ix7DTaAtIZTBP zC-CI3!?ZQK0-u>;3%PuxF}HC-Y4PWVN(qFirfxIeC&Rfy>hM^rL3$1g&~DGLy3nHz zfcX&MqTSbC?7+WZf}tItc`*pcpA?I`Ooes9uOheyGROn}WJ#mx+&5uT>|D-&`fPpq z44=fHJziT7vBqN3)$O3rbm&~%?1vLoF0)e8k`)G()qqq}7t1k|MYU;sJI;qGOh&W} zs=@M5%qCL_+VpFUn-&FT*hl0{nS;(Xs@``|s0E(peDnJh}^ zqG-^-^y*?Egx-);cGL#VH?zWgkD0ttK7w@)4!s~&VcEO^muBI`DgcF!4AN4zCM~0^$9@9!keM z-M?qjg8Y+_NUvMVCROh@w$x4Qgx#1KhoInvCcnNbMzD8PoFUwn$?fV3q2~;TkLhyp ze<6-8IyKoX?9E>sNqLieCgmExRb}k)kb1Ua6_Et@2R{_I7&jFEX(VWqRH7JL8_cxW zhLgtvLfQ3zI4?dj3C2mrA2g^GNR#uF-)BKoNZ3!cSuzX;G%qbxOT6C19WDBQ_DA9L z9-3RP7j!gR3j^P+d-)%z*I^3qfaKHyK568?su!ilKMpT;`i{~#UqP)=g}^c|A(UR| zV!i*GVlIyAYl)1c5gwp2>IcH5p+Ve*RD9bH8O3Wgcvk#EvxV6jh={J*>}G9`ocs6b zJ>L(opRTs~7Hd^+Y*W(*a4l{c+NXl}{?Z1bh+RqfU4k}xK`-^|Vl}5l6-+mHRN3s} zi&F~DR6r9wp$kgJhLJz5{j##Jgm=MZmH{>_gc=oHlWnd|*ho&R+2Di32v@f?APj>u zweUh6UX7b<>tX=T-=yDE?py_LCX_9Lbcwj8ETZfT=hCC3#*CO#$i#NY(K4anF@sE1 z1hwA=$#LJc%hn))KOxNaIy0Y+?_{s&8HK=6#L*YG%41wa*NC| z&gZ!-#$`Z-vh1aJomhtZNIY8=2ezT%QRnM_%jF8eg!TW>#Qr_P zX1BP2unO1d5s0l!-ai(3SwMPf_7cF>OZw9zdQ6&+3_tHzI_!Dsp{8Q^1J?_Hk&G$8 z$r;z90b5Wm%}&V#I;}KO@5ISX@FuUlLIB;=`&=~lUt%OL%zvZOzuVEd=4A^f06Rb^ zVAiAFrM`cEx+t+%7ap=SKRp)aN`Oqb2xlYF;ftbiOc{P2ocW}>FP~w4K4&%J#JOq>Wg}g>!V{xylF(XCH0QxM_H&`}!(&ZC1w0>!U5#7V4m9a1i zKe_kx{9^<%e}-uEunI;EbhXEI(in%sqNDw(?qOC}pRWhu6*&E;x^G2sWz2Y>2<$Lj zx@Q{|P8F?YR|rABVQ>F^8A42D~Zm$uhX2>2?2l&m$Z(YBdqb6=KVYxt|^-@X!#`GTjr! zcX8)dg!1@e%+a7YEVe~GRnu%T;@`{x4)7%1t(%K@c{3H}*XLMlEt`1*`BCw1`EG$28P~ zyBuA$!VrY9?KxvMt25n34twzVhU79yH=kzl#2@N=dXXr|DZJJ0fO6{T7!+W<(mqSz zUL>wU@vK=*8VjS_yZCFD#$ks!v)N_wCN$uWwk5%y478vJ`Gs`)DU6|ZnWRzrtuf<& zCey0~H>~-N=Ynd=yQzkN1wejA^jrd3=d~Am(J?kignWVMZZW<@4aTi^#;yNnWssmu z`ZSqKKxKG-u#(fv4Fv|XP^M?HXYN?&BiEb0=P%`r=6)i~ZF18(mnRU`nrAa*&UeOD z8}FY-u>2%rc(JLOevEiv$u(pD0U;mO`rfo=DT2};Hya{$6F#ctVjX{O@W;-)fsUoJ zkH`4$Qxv9^Yr6;-^shndV;>z(`U+?0?Ax6-0nl_+hislr%9f~}Z(eGKMqFjU0Wf1+cr(=30C`B2ZRg$a|p=-m*ja->MNkM;9F%8!&*Vk3gVVBOL_9>;yI;~hO= zy_P{W2NbQgJe6o^VG%9_jcteajY>ygq7UN2eXq4Mlu$6pS&zxu5(fq|y`Fma zuZGIK%$q1=+{l0;f_RlQJ>-4Sd`gx6w*%KITh=SFCxt7(rUOh|2tg5dJi&^{AEV^? zMp|O3{P5}@tbJN{PDXD`oECC_>RRr(dG!u4m~eJoJ1&>d9gwBTCyu;4fO z`d1h@?)s4F(i!g4KU)&Qp}VMmmZPlkBLyOJqwvw>w-$>e1oxH_$z2<;c(kgCM9c2# zSy!6fcbgo>+1(&y$%)-|DX zp}-|PP99O45d z`JH$W`own964YR_v!1yH$)v~1V`KG!`#75HZ9L^$`g8E?Y;h%amLGO3s^E?Sb*UXCA#eG>4Z7fj_YTs<4x?zW zszj$sOvzV99mY& z(@JC~Np~57A7CQNT3CiWFW`r{DJ7>A?D?r7eL@6G@H< zxR@PgFi^?il{W|T%mchi4JH!@>PHsBQkET^ZJw*$;NoqoxmFHDKs)HsB4f(p`%(5I|5Njo zv1e+CI*b0>%kPfXb9ZV?98d4QB8_-wN}i60Rb+8!9qDD9(~xusi-Cv^HwD<^rB;dM zo2_)~|L}(dOoWn+@8lX!_f^@j=_4}rA98&}P0Zh?WG{SjBUT$D5T0lMA4KvuS&mJy ze^>AKh#=7nkfhJqs<-oegVJE%$LeNLx{W#9ZXi85=eIw7Eko+lj94kWidj0XKu7#V zvx-4~6_zsJBHXp9bhA_E5uDOtg_zS-x9_DXhP-Y4o3eo?@7tpI$ZLrukAm^i<6m2{ zeLtdxS!moOi8u5JUtdY0c!0F&Rs>3FeS!oM8I@nqV*Md;cRw^Uq7H)N$OJsHc5Mm5 zSzGo8Ug;+EcGDV{!04Wu-PgZ6R9VttCO#meF z^RsNN%`(1Ur;po-6Kx&x0{3q2{j%_IDf*gNCHbk-<|J4BBanDeDD~Kv;ml{vzztZ7 zwc=ApUgLw`BC%v4h;6r$*j~9RcAVQp?$Yc0Yc=WZCRx{~ZTaTFKPaXtD-v{PE<>R- zEll9p5iz;_%cZx-GxpLfEp(-0KSzHK!p^Bn+P}tn=jr~I;3W`sZs>7KGo}b3up}jV zjL!aXNwfz5l6tmI2D)gFsN@W#6*#JPfUkr!jy4YNgf)o0jZbqxJw*y(uxlR<4i@7Z z!=Fy=W?e}4nXm3x8nW;t49is|gET_)bV<7^VK!P5)w?;~cJLRdEX ziNaLM%-mHk@~s%$_`G7T4clePFYaqou`=7CGI1+EM@`NUe~8|qZ_IOGGBi#wm1@$< z%P&{&q^*btO+CpK$o<;;BGRcW4Z{d<#TTYh$vI1t-P#3}8;`z-Gx0>1;N3vXb{YEo zCQ~_rkz+&x$WMrBk!_zhv_>2}#t6p!P?7%(>BiJ3DHMKYLD4A@)kw`!0!AV&ic*X} zpb~{)VGyw+BfPLZ-b(Sc0CCrtA2R05QNn94)rz{M@^MQfS;T-I;!%VW;yT)I|Gfai zcR~Uxm-E$|Z5JaX_1~tEcB@<#`+FCkiq$E|deb^Ydpia14#MBkvk7d_10m**52*H*gOQ^dfG4#D< zaOW}Qr;6w`${_~v5@m){^EXi$)*FMelt-)zC(zuz+|NGoiDlWz&M&Cc(u0{jOS&46 z`<8wTPmCl49{lwqNy(F6qr#aW%uDaVi{Odn5q!&N%aT(1I^>A@KVw~ZAL1JvaN?AX zcgjZCa0?{fsPwC_o|MH{5%W3)jz>x56Cs8E(k?1&eIISNbEq#_!ZR#2!aC&%!cFYJ z}rBAZ!+dao{#Vt^57sAi=8Dq}q>T#!RY6HT&zuHcNArdz6b}_T~ z-LVa9GLK4e3_96x89?{{iprcjM3V$LG!2$*uO?W~yu8JgrXf45C7T}lX(&O)wiiL5 z_1RT#AmS$&X?x<6`p)Nfu`x=z2Q{7#Ekf7N+5p3VED#EcG#@_pKJ z%=sC{Kb9#np0BB6BJ{|NF2okOL+P>E?v><%+eNnN8pm2-3Gwryrmf~4wjupzRO0Rm=!b`+OdE};^I*!Gv zGI{NEv{30aa6e`8tHI^18f@MoQ*Y^5PNg8IB^01i_)B^?j3r|%OAceCske8-o4eKW zt(1#UrMcmCLENwcRSE6!o&VTOrTDtmmW~?KJ)8rmCndeBklcnaOu2rn{Ws=WZ3$@e zb8G%>MMQKUzR_T*GFkPIg&eb`B@@X!)TbjdcYg0+X)%XP|typ{Q8;aOA z7d5pKC(O{x3_6!cXy0dwfY=N8k8KOWCNhOCX1s_!n$W~Q;>g}aUrMWmDoSHyf58OD z^#q-*|BAjSU;3EwB#>RMG~WdoJF)02OS~(fM5PDgJ}_DZCzIuRjV9h*Wl92P_ua`6 zw658^0K9n9ue~7fU0f755JypQvs;OifbGPugbF25{UmGicpe6)8=TT18H+pJJ8n~Sw1VlA}n$izRUK|}KkWiB_^ zt?t5rA$3b}5mM7@lKvRW&5%**rOONmlMQ?8mv4B1d11cp(eD>+H6Rf2UOSWb>}tij z)pt2mFM&f~yvAYri_lk}i7`NiC*YYNemZy-+hnLeaL`W)Q8r@PU6N8)#4lvjfJiYt z^xWQ%;tGl~LoKd6W)n*w(H(Tbl|Q_)-#TsanZgh2QSyV4{-tk|z8)sWVk6%nCqRp2 zuKr3G;7;ZGB+=BQM~ckbfiiqCf9JICP0#);_n6A-jo}cF)P^5gki8TFQ74dJH{_ku zcckm?cmKiVbM%nkUKrK`#?DIfd2bnAp7^&D1^!GZteC-<X~`FTGWJ8^Rprm&DyN`Nrjbav;? z)p{!v=i$-Gv|-m^zZu-%K+Tv#EJcaYmE#1Y4_Ce`h-T8X893JSYd5)CW>2F$)-xH= z51e&RS3`x=GtppT3_0*IxvjFTC%8ZZEJ^$7nS)Paks9?hn7P9(BHttSUb~cjWezg> zB$-)ZO7H@uPb1tgeXv;xiL)MwDqWHjTDc>V9dN;ZiSadTBLXkeQelbC21GOrgMU`# z301zhVYjH{Gbeu=2+G3{?feASZ404hne|vUu$Q^lB-NKL>BH=b!@ee{Dk{f3T$*=( z=Arn^vhp!_N|Az8WUOU%dlaZ0eqrJPWUm;Gzi@Bd3`97~3dMAp+{p7pBb>aCo$1G~~Gt z0;Xl)cn3U_ibiilYSq2po#{imFNXnNWJ83%YS?07e3)s^BY2V<=A$KHZsWV~7K^Pn z+#;Z&D#{ImJ-rfc05(SB=<`xf&8s-tc>8BuaaoYJt{vuFh@l%l{fxxb% zv5#F?ZM;pnf~4F+R5|t+2Fvg=BVmk1ox!i~0#(Y;()Va`gI@cezri7=Y45RsptiAu zbef5?`oA^nj~tAcHT#5%YI9-XY4Z+3(&C27+?)sp%SEsyScgpF6#dNZ-Ex82niX)8 zVSo_Nq{s&%p2+RtWKNeY=?q2MFYLdD`s{c(|7*9fE*|7l4 zkT9Q8uK4}Xd11E&4enKJf%no#-?w3NJX19h2S@CdX_j5Ctxq(4Aky4-oQlo?JT6pa zpmzfoZzogXmO=u+6DD?_xlJejiTf34Pc+QH$?q$00*OV3@{*|r9*-I}SYD*Cd&4P$ zy*d&VsQ}PFg`H^t^A`w15c2B5zvpoARm1R?V0iyf^Im-G`evAw%Ul6J$jo^&R3(8I zkVl1!9nqjo*JtbqT#OzI8n(t+H&BsMk@ujTBTmFXjezxTP7UFG+-|vW^(VOhF)z*+Hc#kO6Ux^g(t0VU7t-i_r`G+o|`f83k zq45q+bcu1hKbMng{4VUDxeO6VPZnZ*5U%cWC9kxlQUyHT6M>~F3O*htV1c) zt*`M{97abig+;cN%RVum`i7+wVbj1(w)*Ng&w}Ibysu@aj;Xya60;idJ{WgR3G;#K zi~4PutHPq^J`JTbnXviMlKuWEx1Lln?qa)0HAbq}f8$CJRDWdAyBO!@+aY}4gFbh? zi~xVh0dV&apDQbkN&|(L=O=pQpTEsF|JAU`(tJ37+Oia+?T{>L~OIiQvQ*J}0uhpeid1LCB z234g8kvl@W@8FsFjIH!g(ybM6T$f4s2y0L>_3_3Q$Yz7kS%X8Lu{`)ZXy{U9WN$N1 zKfGV9Z^a8_wsmBe0a%iGTHkYmy-n)_jBu1FcS=p{rd;CUhsu^7F(+XVBwAIzAGmHnrE-@Epu zXSZ)PpBAg-g&z(x50K?b&Y$kB4TXrD&9~b`1wWPAeypb8K2`PdZwWJdgiU~^u-pt#VJ5a zV@Z#PsicP}JD_Wtge+%y`PA9+UOm=BFK3cJ2YNg{b$jjmiwdB*$MHj@P4IG$awSz@ z;}xzS;ri3F^-O_05vzt`b!6nPMx^s+PE5A}W>;cUybEyedCgP$(CoAv+AC#V_&whJ~AftehvCxG+AI6BoY-B{Ep_vIuE6BN#B$?H77xld}$N z`V={BLse?z*W7+btmNh(&N4|*yhw`Nn+*nTCebR9j;@9JTo(R|$8B_cmsVymzITP& zel+RIx9i+aFz#)2sXyQ*Y0F1 zkWHrPwf^T+f`=J8aL@3S-Uw;k**AOvS+&$F1q%`C)!?x0^<6SSF=GAFD_rMNrA6ns zCoU6TGCqp|2gT|TBacRemZv=57xX$M{zB!~v1QsR`u%mXE+2Q9zFN8;MlV>=FkaFf zWc3(;HD}D8+UtH!Er_6cp;~SAWm2y9J-&-djge_YuM+zrv9sye{&nOSU(cT#>H%8p zav^$ZFW>Y;%qHl8YjFalxxjNsc$|}3VKFh({tOLX%~LAkxs!~@@%1Yj(ixW7eL++kI>`i@ zHumizzTZ)bi}MYde;0s~z1mdpJwN$(xcRzJe+?Erw=}NSO5wJ}UGuxm+<|gAuC{9a zi`f3B+x#pG7i$TK5@Nwp@yH3+#)bpDl`Q!iCgibU zh!SWbUx!`qS|_F^fJ;ro(x`fQviv>_-9oR2)Kki@*N7aId{;3>QeU8sh2^#4nPLNL zozPa0r}qlZX2^(Of71>BvkK*I6YSGCR?$Y#FX+LrJBqNNU4iSgN+TA#oTSo@@~4O| zgjTh_E;Mke>oe1qJabcz`R{M9wuX~Wm0V5W-ogLZD-wjK-Pb=R?kT^J`SW*E7Cn=J zFpvrODM5b(L3nRnSm*qJg+#3uQXyO;8CwWxoOqLh51Zz)7hEA@1C3O_ecOyFEn3&~x zWP(}(GEu%JzY1yT6GsxP>_E|znEKEry$4L1KPXlZwXFiUe?*6JiBO7{*A#)lgop%7 zYBt}}i&HcO?q%WyeM_k5dGbf(V5^y57!n}duabY^?Z0={yB57PcH{WxbYV<`;x?gv zV3BmuSCW=ZCu4vaKL3(wV_E-@Z81ah7|GB3#V+$zvf9aT=AR86Qtx~sxNFd8TfsK2 z3Xh3DFR4AcD+y0>{E?a2l+SqpcsX!&rwa~MZr@;H<@{xPiJug(ILxFw@t29i47TPL z6+`ubH-AtiCW-9%>?C2Nyc_DvaYGIX?b0yuU_1U>R;dTp*k!2A_H_6~6V^7Ia1lUj zBd80%?#5^3Kj1tRNr3_g1q;ZWPd$6!qV8F}ni!kyQt&1_ctH2(miBc7nTsq?tm{fk`B3!CHRj+>7pZo{( zA1lzmfBiGjBmw*0_*tjv@txPYb7XzSP7tGXo|N4Sy4!=*>ntZ|>`P@{w_P3N0CbbU z=uRu9Nh0R>{FEFuwdd^I?c`AECvv%BJR*sun4`BG;9Q9ouQDE#e4tk8;CC=rEHmtr01 zT7(k{4J0Zub9&#yQ<%BJBC5~r(G25N5gnwr@B3+Xk;(SKOtD5(ADQEfS%P$6cXhR= zaQmC*NlO}QnXN%Jbk=%0V>h9;6Xc-|o>#LM$2*=mbxt}_ZxBTUt*6Z^o zPK{14cN9^pX(7W7GC|Lnklvxa{*tphK{==8(SX*eGG3zrp|Pr*H>n--Q4&I@hGKK4 z#Z8r$u*T6w7s8llF#Jh5jTUkFd!BDUv>V(#S?-C9bs@m#EnGWDR<5MJhsB@UncRim zaz4&9iGSPZ2*hU(Obj_T%=K-s+*_&>%p|M$zIwb4&Th#4-v;wSnJjy#G`bFPmeaa_ z!W@&b$9LW95eP(rEdH3a=u7dBSrpwxlG=nwUP)rmCU}8*%Lpi`d~zcDZqV23(0{Z( zcH@&)=xfn^m5hA%h6aQbXpoT_$&bzK?GU3TCSBpfY6!d~jndO#YR_wZ0(!P<`QjES zSFln(&GvR3tu+J_8Q>4sp3<_dFP}s87NnHXnuDj9wnvlbTj&JZ*vU%~AR|g4+Io#> zXnCJYzXa(imc0`$;vF-7I{zdIQjqJW^L#xZS=4XFK|94}ps4GZFmIlGI&|$5A6=&J zno{gItOT)SyYBC-HJAb=J7AG;27F!Mf7D zKSx{n`F9ir9Dp(OjD=IPTp=7vN<9Zvy}=`WR=xfvfZGwCvl~B!IudHscjp;BIkQFg zvii~i=EskUyT`N#Cbyxrc&#;PW^DtMETB(Pe%7}y5!KraZn~PWv~gobsEn`=U6>{P zuua&z>bZcl=ShDk_cJC-|4VP&O~>FV5g_-KXqJ8B%JDDVJU5Cn!q(;clS{oBf8Wm( zf7U)V#~Ei+Pi_}L-Td3wvMV2u3@MP?2sA5N7oG>q315CV^{Mbw=yX4z9%{AO;FQjl zZPq>xapmTvC)Kzd3(S@44zJf{9JGP41bHBEHP)Q{!ob6|tu{TtanW1Db#JL z3pcl0YfC;pOoF(b1{=0s^Deol{L-SAO<<9L&-)lO|A2)x)G`{7#?6>qV-_B>uSF;j zo5fZCb}G8c*oT9y&5P@(H(;q-gl}AgV~U*S=45 zK`__0HsLoW72Xz}N|S23%aG&#aIG@Y>QE43y%WW89NijW&M)6O4$C|&WbVP>LEU`( zU=&`D3P|mRt^SiZwMEt&0E7 zmO6vVuC~9Bo-~~zyh9}$nowHZEpLC)0#dZ^SRZ?4UufLoH8u>QLSaxnW_il0w0<(L zEMqZ1&NAikKD2;0ufsohx%7JbS6F+aJH2Ut@NSYdf2Vzn+Q|E^wwPG=eU%s5 z4+aq7=F~31P`rQc+Y+;-H`SVb0$)90I`;hTyEm+M-Zhw0c!|gXp&7SZ41zK`b4GPO znpZ7~^IuuWpFDl=yG31n2GZq;kVxMat(o7D^WuWOE3CDSrIP^%QzpqS&yGp(+m^xW zFx>XcHsY}g)1I^QGC)%B%KFxBcs9G&mDM}I3*E5+Y1iT}0^Ocbu<7dh>?<-3lOCrB z;g!rUmrAB}lBs6{sBZhbabQG6v!_X}AT}g=tdz~Pj8rBICAfL<<5HYlhApeKsmf@- zToBv3Rb;{zR8$7MK6>$SrYm@LUkF4pF zk*B_lc&vIg3MjQd@l#4gZFE1gp8o-nxqgxh?RGF%zkLU+W(ix_r|_}DRa(8~d+G!B zCco)fTin+g^~d!)r%}2-7>-e)ym$Ij>UJQUBDSCVw8i$pdhf&DkA3-vJ9-1J7P9UR zVz_oh#C#0UVL>+udJwEV7R~o0P(!Cm24Gz`2spmvs;KH7&({^1=Be68Z|&pmPv)~p&$yl+t%})utR$(b>*{@ z>;MT3esS+gW%lObsge<{{jSd+UQ{w4IRh6#Q}NgAuw2my8k`mz{l({~CvQ_D=2gN6 z{KI*BYVn)qyidLjtzEyB4yJE63xOOCA9f*_D!HZ$)wPVLqq;q*v%&;tGH+H%9vOVq zHpeWXQtvLGzolIfTnVLfLUmFkA236r8&h*!B`@J2$LlbV5Xj@JO`*DBaSTIieKHn% z0M10LbNW9tSWqksiwymKRe3229!~)nQ(zU1Z4Jsg6etzP@{L`<@vum4~!!gMOPC642)(7@TCF5CS6Kmu!4p~gP#{d0VBanex?p-BDI z@twoyM}Y)-dTd+Tq+!{HU@E<|LMqFYEf=j|7l%J5tMOh}V?09aR+!U1T;Zn`}zpO~RqPU*XTB!xKNK zhFkr33~jwS0TR!iY_z>vVORIfSTywO>z=*XKo90i-OrsLC@#|y4%#T?t?517-8kVN z(c1b0@kUAEcEwc_X$dFU6xsYn7o~tbseZ)MuFn}Uh8pn&%`(qrAKle3ZyzZHQNo?;eR>(Mw<2IqRZ}gS0O0ma57mffxG?bb9oqSgRCn=17uJj`A=hq!fOdazF)?ebc*L*SUmjGk4cNrO z^lmbKF!H^gHF?i>^?wkMw`DMDB-qnNymH?WyOUXT%GCde^|XS1Jr)2Q|qwot3mx>r5OW(^9@(bc!fK31~ROtwS+F^2uXE^8iOA@8JscCmCuve zR4aw*X|8HKcz>Z0qk!nDNGf?>$aQ`g-qX@-$g`4aZfA=tx#Q1{HT97>!4;ww2w|S? z|44sM>IeWNVhTE#PQ`j%WubDO;{em=v+*v3c+($kNO#i_Y&T*%WKx*GdiCox%a!(d zM7o$Vg5BDa6K5G__e+j+PKLICyZraO*Nem*bcB7$^sHf4x0dFEUl##`#x zZl7X^1QU$9gP)Fs@`Q~4r}qg!65y==t?|(28BQzMF!uv_%>$hqPr-bq{hyEp36B$w zsjE4nDv8%#fdU6>6LDP-A|3fhhx(G+g`Q{G^+Kv{I5;_n<=Bp9lU$|! zKHGeC*O|eJsGFhd64f30ezh2T=Y`-LOpBGh2AS)`iAZ*uC~_xNm}?zp$&cZWQ1AHIEK9Y8 z=KLCvg@NGntwnHi#MfbVPY?R_$v&a0w;I?v0xF0! zOse4dLieq*&AX!4-ufFmjn@*Dpjeix7G(_rWZW5Y-rtcyV%Q}U-+a^NsW$KgGTPpc z+G>yk4}egG@A7?A9DD+)njZCqYw6TTmQBu&YIKGpBU#1qi(f0aM~Ad}IIqGUQKoYp zoLP6 z#M>E*^@7X%B4qwvNU7WW<;*Bq=P{a5X#gS#hZ00sF7%6rx?)eUo@$<)?oig5A5>#m z{`WD>(XTFur+QcN!lZP4U_RzHeWNjYk$cD*4>C;b?wG?zsmgxMV$7U`oYEb=B4T(wU)5N8>?_D@xg^knIq~M@Z@Ll$gDGaSwr`rvtG8LD z>Mk%ixV!fZ>h13mPCIO6#{F@;>I{({B7vE8%edB_&qX~H6e{Q2AD${6(aY6Y zOMTI=kN1Sm?URN;dJPbNpyfGv%-(_-ttPm*y0W-1v$9}3|8Za0i*XqZ!P?)8)%E6h z-sC?m#=rfzY*44kMpwx_6AGE7)-uIX`mG+qsmbELJ5a#C6#oj54|s#U8=RFxFCl6j zDI=l%;bc?;OR(ecN9h!;5abi!joF|eZ_Ij|&i;7#jQ)n;uf84;VH*3wR(XDhZ;g@? zQF-)D9k{fZn8xs>Wclz-!HWeAiQ6Oko(c<`u}tMNPvnMV@buKs+FuI|zXwg?3T!l@z!-%xbDbEGX;hNh8rKH5(#zlwx}k)}*0Pbne`nCIvfOF!)+q^*V^vs4XeR6tWNriL z4SH=;>Z1+~8O?8woFN@VlWP@6y8Rfkf_qlZHBlFx*B{NkhrBEp(Ep(p7gUTDVS6iV zJ;~6OKAOPCwALP2i9W~YX-EyJQ@8dHbz7bvj;2fE0 zewn|VbO67sZFtUVh@c^Nb>t%08*};nOT5IUXQprb;WCoJHy3a=kvrA5QxJrq?$_|= zgZIvKIOSON#(wYfu0s{FXx2=Pn|ur^_3(o=Y=p>qzC9Hp{|sF`K(=_7MUwm(aVVv&x{T*PMpRTtkLC8Un>78 zQW22;RS(z7^-S>^Uk;61;%HteL|NYHWDSPg9!gG65cAmpk=nUy4dyw7 zF3*JG>c?@|pTHoGVE7B!3Ym?*CppD-yNImX*iyEYe*Q++UyCf34m5 z0vUzycKlc7?HXAWR|N$(r$hXef#jsX887F1XSzIaBWm;e9quVi6F#)U%@AfwQ>@Vr zA;Ujf{sD@r4Ub^CXG-0vx2D%P(7Ts$Fsq4d>l()z2>6Qtm%%S@c9UtO?!5c7;Onp2 z+w1)-d|zDx{4=dnJUN%3MM;#+>rVj8Z|0WG#=XZ$irSR1GJ;PcANhkO&M56O(izj5 zv=ncN9Jpj5-Tx~>M(?th#F)LLdZ+Uks!rM}Szzi&lBYFFVWobVWNAX-IqW8D^=G+^ znrGv&K%LajGUZa5X};$4(C^G8R8@8zA@gfn1=GU_M?5Xx8kz|x+8#_or?rF!@!Ax| zYBQ#RHiF&qw%eTm8x4oMaQ5?1d)!L1t;zQJ(mLCF0{F)wK(6-(J>_na;N$hU<=smM z%9b4llCv?|v(IYi@#%e}S$FI#sh-(d4p3&zGrF;m6uX-uY7p(hXz`d#v++3aX_*R$ zdUN+t#B>?w9_~|+@J4uXF6?n~tadbi3BYBylbSc3#Bpn4)gh{wIFxTJx(!~$R;swZ zPPULCxMf`XQw`dXi}7%HHHEgxGde$UKKl!t=3k1;{GoT?FX1%Z$YJg~jYq595x@f_ zZ?Kwd!1~?50JJB!Ztte|2TJ?(>ze6@_&79(5{X_Y>;h|3QTVM3U4zEJ1K(RvGxx)&3Cu6`CRhsP=MSnlEL?4| zV=Na7d{1A}eP@W1i3=6dT~sVRNjLv8DF0UV$>e8>dBuoK0HC{-lZgrI&M|nPO0O5X z&-WCrz>(~3D)F*BeJxpJkm(eAxca*SJqq5qkG3O#d90yp6DmquP9-}QhW((fb8@fc z{#Sa`99`a&dsF|u{gEmlJSi*3FAge+(n+~0b6ueulCIr%q$^4h-{d0SV~3$!x$~=w z-KF#|dw|k>r$b1Sk`_03cb?KI)RW`9#$5pX`uo5{iaE5KB`!|R7g0OU*bBG5tmd?0 z-F`^cjyJ^v!aoL>XgyclHvN42lvz((6 zs(s<{DHtTkoWmLq8k1~-WXUqa-wP!!)sk@$tdw6<2s++>m_>pYCy>j@P(3sm7MGb! zPsXOK!C*&cG8LI$cVz#3#-y_~7g*71b12`R?^rGS3UQ&~4s1e`-E^ z6o-^;LB<@hvcx1p+$8Q#f_af{60Bx~Y)B~?*L>Lu zFnRg|W$PQ)X@BraOI)rPr~BiSVKCUr@4IO+O2S7wT=yoqs&OzsJXi{@mcq%?qCLhR zq2I7t$-3gPt;x7f!Y9Ud^cJM_oGAvOj>-2bleOe78rZ6sUbbg%z7SKzTEN zT(!rb{Y9EAC}>zoRG3MBDkV2?)PA?;dx2_xc+?H#tEyBgg9s~#_i%m?iw>WxT%9X% z5)U)3@8SOjIj-GdPxYI_r19)J%QG6}!^*Ia`{BH;#6DYH|3HFe z!$5Vy8%vdBu6*rcKj%p(m;6KQSk#w9&h`bpWk8GXg5>SM4tp*?T|&809w6;)cTVFd z#jsWoIwNT&P=F9x-^uZr_q8?ne>{5tUxt4Q>gzc1SP!#_bivQe*Wfwolu>>{3z_(l z=9Re&6WTqrXJLvd-lw_>GQ<~>~r}MTBCNDBOM%M;#P1$>zl&b zk;_y{+zh>NzS*LQvu4E!m@`R~Y07xY!(cesJal*9T7WSuXJk3}@cp@vUyTjh$ewW; z(dP{&92!iI(++#a6(y871g+nb`57=3O9X}-Lah4XG-OAxn)%aqTfVypWrYCO(GIKE?8%a z4ELBvZw5_fXYj&Je;#Vj2-fkk+e}oW8C`6LfV9IuojGX|TQn77scH+#yA*d!3}*6r z0}QJnsX6YP+=Ze?+9XKrDH5xKh&k8!PGrg*3c!i*x|eMqf+#-;SlAUa@x) z(NUXdz^Csb7|846MHne>Fb#J4JU!wTrP?5H47Ft=(L(( zr2s1D_3RXMaa*QJI1f&*6L^h$>{u}JQKJzOYx|vAY*rnz^NFwYBW@1`GNXgzNlU1t z@h%Cp%7ijlh>m|KPvnwovd!H9vtOc3uh$uJKzqgTGEHE6vP{sO1OD?CpOvB{k3%wR zKB-2en(+=Achi|xMGMx(GiM~cDKmd}`{k*u_R`8wuX%Sbhx9S~iHeq+R)@A{rSNd} zkU>J%D%{CzIvl7t98u^?%}OVFHQ_NCZvQ%hLehk)QmF&!G~>7On2!TYeJI>cqgdbS z26XLl)5~4T1fWPh9(YTLjF=+o7_LpdX;Pvz?B^@(OYKGx0I)Im(VvmUA8ZZ>$gc~{ z8I{YFbf^#65?o#Rqq>fUoYu4$FM?hyl&VOS31{nGt5t@YI6yHg5jk69s~hFmcLj(y zY6U;`J6e1UqC>w7yI$-YmmCR9wo>WjlR$hr5NWxi75T&Nt#@Qf5X~G>Qf1v^Z)3!+ zBwt7#NyX+6?eq^NEjHYgIxPrp1_Fz6dE`p?BJw0y=+t1S)xL)-ezNT&{oqVKO^Kfo zLUG;eSNWZ1a~2FIhO;A!V{HOvZpQn9-o1}V<5e^j{%I_%;(ohAEo#7}J z<_z5fY>FA_ay4|ISh5o4k-NPED7Bl2Zs#P1u|2jqHer=$jD2azmPgYJzdg08LHJq?rhIsvHxUCS?tSrDS<7mONHhoq^I48C!$gC?VDIBqcliaWNbM)cx$~G^sgh6f$k^9Y z-ezJuv>9Y~P22kVS;zDXt;()VdvWYj#HTa6tz0n;g}BX)laTckVO<=q^~Ev06}xV8 z^+&tunQk9ACEIgxW#vdo6;4GT|0VV~_hk2(&&tuG8`jKYg#7TBI%th>(7U62XyZ73 zeKuFsrIks7;$|+`8vk`(Vs!koJi3!XW28CS?7}-#R+L6b_0V)Ofw9JyDHSX0^E}^& zWcog*r?@P3;nr+s$vfWR(ycI9XLvpT=ac)1T=tWc!F)Ssyi58g?K<`0f_gH;rSRza zkD4(j+%9iz*u+}sEhubKeX$gQ=xkIpCrR<9`DDP#XD#szMw{(c^poqr{on4_B_hAL zPv*%ZxmcF;8VURPva2b5x_rtXo$^!$SC5wsKQPnEBn_WTW=Cmec4cI}E7LBmE7;Zz zTOm^@L?^PYvr{5Dx&AQI2BlXQ2|c{2BC<)&Yc-?VeG=X#IF1c>QrWQ-Q|~b^_}1@T zXmN}CeE`od=afQb137yGrm5rnGT?pR7mn{R;Zz?ARb|2$Obcb!4zc+yAm@R$V>b_G z4!y>bEmBhYO-W|`SnD$_II`sXH%s_|gF+y=B!DUC;sZLl}{IyCLV3T#eCjfQ(QM zhWE>$Z(H=nSX_e{(_24caNH%JBnh!Zj->*`c;eHPO3q@&=(QwtDzK`H$50s7HJj^#aSZPd7~ZQ}2EFlME&3hw0YY9w~Zz$Y?eNhDqlR z^JzL_wXU>SX1h);dkq{9X2Z7mlFGJFOw*>&TNmOarN6?>(i+SQ;i zEx9NBvG}m~Y&HUvo5NVDQ3YQ59*5TXdNY=x+SD#UX zQV~tjc9v-V!R8>pCY3zA5zb}R0p%TF)9B^PcYhzV?>jkm&Ib|M>!U<=juI#P*l6bE z)M}$q@sE)k?l!#AP?ir2bU&_&v6}GX!bF~uI6i5;{;@Vx6uS3TsZbA?Bd>6}^!Ht7 zHiFMRi!)plt$ErV{mgUpwfU;A?j)C$q%N{YiGUR0)OvM(LNkz|okq1EX`)B@K|~&n zVn&a&wW)^IAEZkkE)-k{< zJ&x|DS8+DqWSfdN8tm(YlKa2J7OHpKe|)XNcB$=3L5tv6rg9+nV?t|?37ta`A)lu(RWg7#LXP1$bUXu5hqZ5&ztVXdl}19vi}XhKB*Oa3(XlflA>0F``bJAk7h+@zy*K9diZZ9&kowp2ROpf9nS8+EpJOF9)yQGYdJzchCwG%5*{>m_fgH?u16!gZ%Svb zT|>e!*(s6uxC+jPW9$hwcK83+n9rg5*e}!3d58RO3)P8U+s~?XNXbL_{l^Sxa1thG z$CskL-396svT>pzW43KB-{`_)U&sCL67-ekn3z0r%E1d!$IBw=i^$}d2=Tt(g?XBB zj6`0KwPm6bv>9=d)*~gyrQ_(62cMjFcUV2wCJc4JMeD4bFF%|upM zUQuM8#+CXqBeKXG*Wj@yRGH<@_nb3-Eitx6{wPY97FT_Ss5g{Ta@6?16#or7_`z(c zhV@@V?`QA+eMkw)_UaOZIuKxZYd&le#6EW*Co?se1%;d}aE7scG zjA&EighL!dTKBlQ$<*rC8F6r`Wv+3*u<=--(dq+5K&=e!^5k{Nm2N$Iw ztp&@;6;uu9+=m)AovY1L%X%a6qn+o-0?veb6{L_Z(azRr5A7V~8EHCS&RaL}xY6(M zI%`93e3+dF=?@p?DgQx30Os?<{s-Tlv~;Bei`QASGcolI+&ELij3})tUP-VgDn>oH zw-BZW$;qGvi`9-up!;j@cw4}x`Jicn^kiXh;MeQd-RURhf@s%k;=nE%7fZ&qx{MHH zLm49EY0A3~<*>*P4M$wyKY8C*dX$+%<^5I>M?`y}S#~6Pa)Vr1+ZODTUjB!ep-1b# z97wL3VM=|6w<9*V?2S3vV}Ak0e?-(j!Hsva4x|ZDwYN}dR0Bh-m(DnEpg=rL$qZrM z(~+`P8ePUXG)p#p3N0jqi8h+Ai94N7uA`>xzcd6rrDVqrCqHQo<6Tdo4*aynpc2_% zIt_{B(y5X4%VnAk&}r=S`U@Oe^_I7)_c;@J>LK-3@@=AOf5`PnseNJqJ*V_b8 zS*O>7Qk~)8f4=sNshrhQ+vag5iphZ@s_QM2v}7)sULVbwd`|>KAG8nJS4O#=yioKthIc2#6 zkB8IW_s!+n#=^NB4479MaW=U0qTeYc3d26`R88fcGmmdm>#Ro&F^NWste+hB>TsZ2 zr|X=@u)H~}aHK`or;NC%7b=5=d5KO}_U~{xGZ$%6>mIXH@G3Euh7KVsqh-ebn@H}U`F4#K54O|$j{YU0CH=uC5o0-8a&zB9t7L}w zMCeDK4zE(=s(S(kAYV|9PRUHZ-RVtZldPL5M z^Lqgu1>93)n$a~L!}U{|lX}CA;cHj7zaEFkzb1$!BJM&A6RV)|}dafg<}smoYnB;Dkxe!R#7Qk+vf#Y_gT`@O@z!Y4e~& ztwk^C`b$yliq~nM(3GPZtj)RCgmKCOA zU>sj5=-O?q?$~)Nd}PBPjf%kksw+w0gOsy&~ zm}nKzsjp@zsCd??FH)cw0b8KRq{{k7!Z0FS(MZr5z~pHJRVY{|B56$peOBK&!Es2N zcR+Elc_=+G>Eb)h@=yC%hMTFI*`bfy!OvLeQy#*EAPVAiL~~X=YF6tgfUq~fIys!7 zpdE19PD(XCrq75C4;j>}&!~&U90H9~N!e?+F3!lm9PPw~D;E!+qyx3Uun#jd)WIuNCV1MR${|+Z)!Jt49%LMTEOu0Eclh()j+^XL^f(@FFiz^tr!EypB(L7h2!{ud&JKK zoA1I0C}d7s=Zc$mi&l_AM~)g$NKTOtYLJ1ayl9)CB0)|a)@!5;H}{MDwt5vB{yoX) z`uG*v_~&wz(=@#IR(U0d=$<>ZvN&kPN<+7^gIk|M-oA*(f+1#W#W@I z#A{Gtt*taZn7mIwk(2!ROX9WZjZ{ArSvB-k)i(}N(dW<_*pG@y>1L}Vd&@({^&esY z7c@bs-5)AgW(5i_>C>(>P7Jo_fBRmap41ztur42J!WX_>kI*#D$_LSCB60@Fi#>=( zjqp6OM(A6erJ3)7+)3O1XoVu=BFk9bAuS_tzZ1rZ^V4dyAPh-on9qD*D*Zu&pA*%0 z`ILtydNHWVGo$}X69JC<@uRJLVTi0(4kWzEV|~mhlD?X>BUCOT1au7qn`IXZIT0Mv z{}k-}DwytB%OMuSpz{~tEaqZ&VXiLjTR01_8f;5ZVBaf>JC3_AXDVA^Lyl|Y2RU9i z%|kVxiOE1!@srw154XN~YCryV##Gl22>RrZON1_B~5t7gPt= zd_3_@pfUvuJ^v(Q1Vvf=1|Y)_D=dlRidxJ-4>(uThpuNwVF(Km=Wl6%RW!ahOAZLP zve1f~_K@%Kz1|LU*;^sUCdCmMIMja0pRFsSFN+!cX1?Pgm`s$ZFS#>8)wCC()0zfbG-c|=xp)733K6mQGYMh{O38}>Xz{g|s zE$h&>2}}oJAUQ{cI#TWycp6@YtYWJ+c^%kSL@ZwOtAAdaygHod(CWz zXd-BbgD*Z1T*hiXKCXL08DH-MAkln$bf(sNM_6nO2V5rZ3q0}y5Z3VnGbjM(nF8KyW7l@@Zm7;ZT45hwtm7GoVdJ#>8 z?cIsoWvT~WeFwxx{FaF0i>`Z^-uZdsAQ|UViB&LD%rA!Ml}~rz?EI@0cCy4RxV)3`!;|LU-+vHDeuy zof})zT8NWt+<<;|UYC|GlBX`@K1R{*K;FtjkuaqJE%*Qx{lq*|1qSD>fGNGqngk|! zih3mCD}?5^qsrlNBepDkx{YqigmJ(@Hfcr`v5Ic7j7*l@E&;}yuOAmOO|k+s?Tq3| zi_#!0TZ;Vn_ycvYA$RRu@2cUO6^ z9C%0&!cL8&Ew!_f;MKl>yY(g5#^z4T-xX|lE~3Ds2%}@~`Ov6waf72?sYiCB@80?Y zQ{{9_kIpQ6xtcJe^E{955nt`P2MI0&;%7P`>)S4Sb0T8=*Q{o$+rN4_n)VP3sxL2N z3~ODAk40`?iBX6_i{)?3kB2L00O%zLwFtv%W6%7}EYV5iJq@SDiF%}OSPo=#z^4ta z-J3I@8dv9tBq4;}SqIY@k&Z%5jhsXfwnfl+lX$j|?>BoIY|4(`zq=-(LC_Ha+IV=yV|DF%R~wCNe4z)-k)19YUN z2fsHw6ng1EOwkfWiuATG^H-tBq#cr!`Ji;sX(HqfV>$F`;#D-_sJma=Sg&wmS3ij} zmRax)8T*FaqtZn?JJO|AUfnHgH|BI=y?M?7)uI&d1fnwYgBYn;p+nDDC$w{d0dR9O zO|Uj|yVVlBM8N}lA`9r29{dziFGjRDGdS(5)j|hkegiU@NFJ9O>1%ZUCtn2qlw7B~ zkwdR74H46nL;cxr9RBm$hfx|oltR8*zsQsbH;yYZSQc(}Hj27J&J{mr8Qki%X?Je| z*<5-e7HHam(s8tYmqG&s2ZQ-hyRl93qemo2;NoN%iSj0>dk1xDYhouC^!Vfmn}gHZ zD+Zn`MWDFoM&nda6QhrYzleSwF zDsklv^J&o92dRZD3fXLl*+1mQl-23oxX2N71|wpB#41sTR#w7kFI?;c#bSv%zy5Y} zQYqw60{RBNk9*F4m6gy^ML?R zBX{*la+y{s1+`~O&wLI2oj8Soo&mu^)ehWXCu=m$0!qJ^bx1pyuqTK*iYy=@{Vv`l% za*$>J+9Hl662E)?clg=7J~ z3=-=tPMu(bVDg}(ccUN5catQW+a6Ul3-4sHGN|YIZ$95G8=|%c_;iH}@~%yPtkKrz z)&ruq_wSBPdrZH$QhtJa?~gYco1)&u2Ife4>w#T{oC2kO0q{jTFe@>5V0(FRTGq4L zt-av+2_i3d)DM{J7C`=A2h5{W9wwJrDPG1(gA3 zj_mkX-wzS& zO=(|;uZ?Y}<~jTQ)(28=HmsuD>dvAwjworN=KHRQpyBBu7fCkOnhO|btn`MG;1X+n3d5mF?|(XY8`{SJxb7YcbyWBmEiPpn#~CCV|0S zw)7TbN?4!FJR=Np?-LI3kWwi7O8>}r7iKxA?x?0}%yiwGkg-L|fQB&~501I`rx^&o zHgG}1LJTS689kmr2cOkKoh;S#wk;e|GdV%FRzi^?|Mh3&sArb}-$nH^-{x-^n-ed9 zr+sdOd=-enzYL7G!TbkR(V=iYBaHzmeij_9DYF;4lOJ&wOw|Z0r3~~7x8l<+)i(wF_CM)%Fh9DBg!n`Hg#UB=F zl`^_ZDfqB{7R#r`M`(Lvr`&FB@2s%SF-(Lp%!?iiQ%t^P^A0yx(-cbW z*e`3o9!V(D3;OcDTKI$WsX7?w?N$ZSppqPJ`W=xr;;`Y;i<4PKsi=fYlp{DYUnBVt z8SBXFX#=XD)bfHvRf#;PiJP?1)kF*zA)!G1Zr4kKQjR2ff73iZe^e`8r1afSr*2rr zaeBh+1L0=$rj7btBVR`7cJ%4A*P?i|W#Co3b(#XtU<5eo|Dlw0pu14opN#xaR|RZ>2>6V@z&EkwBE|Tjh96E8BUG2R7z> zQ8i{0c?u@YPdZ0ET7Sl3k<=spjffqfnFUpXz=4n1=hVRQEsQo1eK9JSZi*OkHD~u0 zrYOUYcBk~&IVWQVeD51KL^Dndt8Xm4Fll|2f76--8}TIJ92iQl+{$R@hO$JZ!!?<_ zbV?LuhVj^p1Zr-o?2G6}2i+>F;U6mrm9pgMRl)rt^wL-|dV^6BX<89G)`Z=c72~xR zIt#79kwBwtbk%w*Q>ZyNCyG(`8j9n_XYO2iC(lmBRQH zXsOcujK+P((_?Mkhw+So!Zr28;bWeV!_nYo?)Y-AYQ=I31|2@3&<7i#KWE({)!JbSQlp?fGG{^D?{j$Jy#kkfZ#g1v(Bz~^)2Km{GUHSf;s>sPPKp|e zh${T&02OKqk~;tHP%q+)tj5g7`%78&bsr&XPtu=*{3KRuElGqCjd9itcT8}0B8+p> zpq>7(C#Id0&&UK{PIlz9bDQlFmAoHOI|?khjQ`zGe@*}p|Mp)y7Zjljc;f*Ckuy*i zXSXkS?$E6cJU9w2Z%aEErC4Xs&uY@TheCUMp2r4uG2%TZEcD`K;oz%g;@%WI@B-9-?Q^0}iO^E7v&F{y>D*DW1gR;h|Z#e|Gum*zk zgi@7#@(}B5gb{>Zl{3sUIzVBW~fM`&N!8Jj}Xppk;4$Vfqp>uS;eG*2;o=JyZ)9zlbyb z?cYDb$_lmp3J#fsqxzi4RgS)lO+6I)6=DQ;kZ$b@baSMLdNi8D?DAtR1iLjh1joEA zEiNn3P}e2Em$CV+ELvM82|<9SpR0p(V)y`&FM&y)&o$cW3olpT*DByJ&oJuj^f*pv zy^%eR9r(w+DpqXIR6FvD30PaRp%~JC^pSs_=j*LF0kVL7!O!H_t|$uGAbr*>1)&sY zn+OfF@riia^+$?vd;s^y5z4km^;7R<_;<^Wv*zC-h(rH70 z>tM*syEAyouL`ZU((cqwS4FbWn%rEyLZ{olpr$R}2y!^IT4M)%l40^)jSttOlY-z` z!$83rkk5g`5T+Z0JnuR|n42;~kGBDeCxT}9z<|2-Q!8S@mW6ANccm6rh}c*Aqg6fIm=}GO_Alz;*i)emNBC{H{chGGEj8%RSgH#4LlpBt(wy%7;e=K1 zU%7rJ!X4)Z!a*J3Z{Q{PRDi}pXdfY)#ZAn1IgZf=-b-V3 z2f+{83?f0c1@}R*MaYmq_-Ola{lKr*8y?o|q^RH6aaI;#Sh^KJT|<5K*WoFoF5;iL z@y}Yp{YWF{vLi>DEJa@HKnc<1jGFrewH1sc3q>r7fTSGX5#}fPTx;E+Wnl$tz^L_C z6zHdU1agwEvb(BYGxZTE{16E|7>X1aJu-(m!7L>+hv1ms%pHnVA4zuV~`f_OAyy)jD0?e62`F5zlM}Tbf7bYzB08aBigXaLQ-S; z@zO5kDpj0iHSmirFB?Z|K9KiW!dR@C12^l+(Mb%BU(RZ z!K!5)HR)|C0}fI~i(lhPf}LKaPMuv!Hxg+UMPRHxt-BG3<0RbD29oh*C z5nUyXycN*)Z~bzH-Yf>8|7Yo4eXNXa@Ii|&SCPog6S=fmtlQpJ3%98ZY}!l9Qh4Ww zCQgW~ZR|ul*hlIcZA36Xq!Ef3o!x>T@}v1ki2L6Q_3FR68O~YG?i&$EjQ*IgD1Qx# zA;bsAY(S_pgO-?*YpftM{uHpb5KSNd)yA=-yP2}DgPiW44spn!or_(tS4OF#y8#nd k|8ukd`v&qu-~RZL;q|?2zmm%C%jZi{R8FK?NI&rZ0n-)6v;Y7A literal 0 HcmV?d00001 diff --git a/keywords.txt b/keywords.txt index 8f0d66f7..e370f4c5 100644 --- a/keywords.txt +++ b/keywords.txt @@ -11,6 +11,7 @@ LEDController KEYWORD1 FastLEDController KEYWORD1 CorsairLightingProtocolController KEYWORD1 CorsairLightingProtocolHID KEYWORD1 +CorsairLightingProtocolTinyUSBHID KEYWORD1 CorsairLightingProtocolSerial KEYWORD1 CorsairLightingProtocolResponse KEYWORD1 CorsairLightingFirmware KEYWORD1 diff --git a/library.properties b/library.properties index 42785776..b5b7b336 100644 --- a/library.properties +++ b/library.properties @@ -6,6 +6,6 @@ sentence=Control LED strips via USB from a PC. paragraph=The library mimics Corsair LED Controller devices and can be controlled via USB in iCUE. category=Device Control url=https://github.com/Legion2/CorsairLightingProtocol -architectures=avr +architectures=avr,samd includes=CorsairLightingProtocol.h depends=FastLED diff --git a/src/CLPAdditionalFeatures.cpp b/src/CLPAdditionalFeatures.cpp index f180c218..7d3191dc 100644 --- a/src/CLPAdditionalFeatures.cpp +++ b/src/CLPAdditionalFeatures.cpp @@ -18,12 +18,12 @@ #include "CLPUtils.h" bool CLP::shouldReset(const CorsairLightingFirmware* firmware) { - byte deviceId[4]; + DeviceID deviceId; firmware->getDeviceID(deviceId); return CLP::isResetID(deviceId); } void CLP::reset(CorsairLightingFirmware* firmware) { - byte deviceId[4] = {0x00}; + DeviceID deviceId = {0x00}; firmware->setDeviceID(deviceId); } diff --git a/src/CLPUtils.cpp b/src/CLPUtils.cpp index e4fb6a8e..1f72bef2 100644 --- a/src/CLPUtils.cpp +++ b/src/CLPUtils.cpp @@ -33,16 +33,18 @@ void CLP::disableBuildInLEDs() { #endif } -bool CLP::isNullID(const uint8_t* deviceId) { return !(deviceId[0] | deviceId[1] | deviceId[2] | deviceId[3]); } +bool CLP::isNullID(const DeviceID& deviceId) { + return !(deviceId.data[0] | deviceId.data[1] | deviceId.data[2] | deviceId.data[3]); +} -bool CLP::isResetID(const uint8_t* deviceId) { - return deviceId[0] == 0xFF && deviceId[1] == 0xFF && deviceId[2] == 0xFF && deviceId[3] == 0xFF; +bool CLP::isResetID(const DeviceID& deviceId) { + return deviceId.data[0] == 0xFF && deviceId.data[1] == 0xFF && deviceId.data[2] == 0xFF && deviceId.data[3] == 0xFF; } -void CLP::printDeviceID(const uint8_t* deviceId) { +void CLP::printDeviceID(const DeviceID& deviceId) { char tmp[16]; for (size_t i = 0; i < 4; i++) { - sprintf(tmp, "%.2X", deviceId[i]); + sprintf(tmp, "%.2X", deviceId.data[i]); Serial.print(tmp); if (i < 3) Serial.print(F(" ")); } diff --git a/src/CLPUtils.h b/src/CLPUtils.h index 005d0f3e..9188ae7d 100644 --- a/src/CLPUtils.h +++ b/src/CLPUtils.h @@ -16,6 +16,7 @@ #pragma once #include "Arduino.h" +#include "CorsairLightingFirmware.h" #define toBigEndian(a) highByte(a), lowByte(a) @@ -41,14 +42,14 @@ inline uint8_t convert255To100(uint8_t value) { return value / 2.5546875f; } * * @param deviceId the device id to check */ -bool isNullID(const uint8_t* deviceId); +bool isNullID(const DeviceID& deviceId); /** * Check if a device id is the special reset id (FF FF FF FF). * * @param deviceId the device id to check */ -bool isResetID(const uint8_t* deviceId); +bool isResetID(const DeviceID& deviceId); /** * This will disable the RX and TX built in LEDs on Arduino Leonardo, Micro and Pro Micro. @@ -60,7 +61,7 @@ void disableBuildInLEDs(); * * @param deviceId the device id to print */ -void printDeviceID(const uint8_t* deviceId); +void printDeviceID(const DeviceID& deviceId); /* * Measure and print the framerate at the given interval in milliseconds. The higher this value the more precise the diff --git a/src/CorsairLightingFirmware.cpp b/src/CorsairLightingFirmware.cpp index ea9c4f53..69a15fbd 100644 --- a/src/CorsairLightingFirmware.cpp +++ b/src/CorsairLightingFirmware.cpp @@ -15,18 +15,12 @@ */ #include "CorsairLightingFirmware.h" -#include - const uint8_t bootloader_version[] PROGMEM = {0x00, 0x02}; -const uint8_t corsairLightingNodePROFirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM = {0x00, 0x0A, 0x04}; - -const uint8_t corsairCommanderPROFirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM = {0x00, 0x09, 0xD4}; - -const uint8_t corsairLT100FirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM = {0x01, 0x01, 0x38}; - -CorsairLightingFirmware::CorsairLightingFirmware(const uint8_t* firmwareVersion) : firmwareVersion(firmwareVersion) { - EEPROM.get(EEPROM_ADDRESS_DEVICE_ID, deviceId); +CorsairLightingFirmware::CorsairLightingFirmware(corsair_product_enum_t product, + CorsairLightingFirmwareStorage* storage) + : storage(storage), product(product) { + storage->loadDeviceID(deviceId); } void CorsairLightingFirmware::handleFirmwareCommand(const Command& command, @@ -38,16 +32,17 @@ void CorsairLightingFirmware::handleFirmwareCommand(const Command& command, break; } case READ_FIRMWARE_VERSION: { - response->send_P(firmwareVersion, FIRMWARE_VERSION_SIZE); + response->send_P(firmwareVersions[product], FIRMWARE_VERSION_SIZE); break; } case READ_DEVICE_ID: { - response->send(deviceId, sizeof(deviceId)); + response->send(deviceId.data, sizeof(deviceId)); break; } case WRITE_DEVICE_ID: { - setDeviceID(command.data); - response->send(deviceId, sizeof(deviceId)); + DeviceID deviceID = {command.data[0], command.data[1], command.data[2], command.data[3]}; + setDeviceID(deviceID); + response->send(deviceId.data, sizeof(deviceId)); break; } case READ_BOOTLOADER_VERSION: { @@ -60,31 +55,15 @@ void CorsairLightingFirmware::handleFirmwareCommand(const Command& command, } } -void CorsairLightingFirmware::getDeviceID(uint8_t* deviceID) const { memcpy(deviceID, deviceId, sizeof(deviceId)); } +void CorsairLightingFirmware::getDeviceID(DeviceID& deviceID) const { deviceID = deviceId; } -void CorsairLightingFirmware::setDeviceID(const uint8_t* deviceID) { - memcpy(deviceId, deviceID, sizeof(deviceId)); - EEPROM.put(EEPROM_ADDRESS_DEVICE_ID, deviceId); +void CorsairLightingFirmware::setDeviceID(const DeviceID& deviceID) { + deviceId = deviceID; + storage->saveDeviceID(deviceID); } uint8_t CorsairLightingFirmware::getStatus() { return status; } void CorsairLightingFirmware::setStatus(uint8_t a_status) { status = a_status; } -CorsairLightingFirmware corsairLightingNodePROFirmware() { - return CorsairLightingFirmware(corsairLightingNodePROFirmwareVersion); -} - -CorsairLightingFirmware corsairLightingNodeCOREFirmware() { - return CorsairLightingFirmware(corsairLightingNodePROFirmwareVersion); -} - -CorsairLightingFirmware corsairLS100Firmware() { - return CorsairLightingFirmware(corsairLightingNodePROFirmwareVersion); -} - -CorsairLightingFirmware corsairCommanderPROFirmware() { - return CorsairLightingFirmware(corsairCommanderPROFirmwareVersion); -} - -CorsairLightingFirmware corsairLT100Firmware() { return CorsairLightingFirmware(corsairLT100FirmwareVersion); } +uint8_t CorsairLightingFirmware::getProduct() { return product; } diff --git a/src/CorsairLightingFirmware.h b/src/CorsairLightingFirmware.h index ac2e2a2b..7135a630 100644 --- a/src/CorsairLightingFirmware.h +++ b/src/CorsairLightingFirmware.h @@ -19,38 +19,50 @@ #include "CorsairLightingProtocolConstants.h" #include "CorsairLightingProtocolResponse.h" -#ifndef EEPROM_ADDRESS_DEVICE_ID -#define EEPROM_ADDRESS_DEVICE_ID 0 -#endif +#define FIRMWARE_VERSION_SIZE 3 -#define PROTOCOL_STATUS_OK 0x00 -#define PROTOCOL_STATUS_ERROR 0xFF +const uint8_t corsairLightingNodePROFirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM = {0x00, 0x0A, 0x04}; -#define FIRMWARE_VERSION_SIZE 3 +#define corsairLightingNodeCOREFirmwareVersion corsairLightingNodePROFirmwareVersion + +#define corsairLS100FirmwareVersion corsairLightingNodePROFirmwareVersion + +const uint8_t corsairCommanderPROFirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM = {0x00, 0x09, 0xD4}; + +const uint8_t corsairLT100FirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM = {0x01, 0x01, 0x38}; + +const uint8_t* const firmwareVersions[] PROGMEM = { + corsairLightingNodePROFirmwareVersion, corsairCommanderPROFirmwareVersion, corsairLightingNodeCOREFirmwareVersion, + corsairLS100FirmwareVersion, corsairLT100FirmwareVersion}; + +struct DeviceID { + uint8_t data[4]; +}; + +/** + * Interface to store the device id + */ +class CorsairLightingFirmwareStorage { +public: + virtual void loadDeviceID(DeviceID& deviceID) const = 0; + virtual void saveDeviceID(const DeviceID& deviceID) = 0; +}; class CorsairLightingFirmware { public: - CorsairLightingFirmware(const uint8_t* firmwareVersion); + CorsairLightingFirmware(corsair_product_enum_t product, CorsairLightingFirmwareStorage* storage); void handleFirmwareCommand(const Command& command, const CorsairLightingProtocolResponse* response); - void getDeviceID(uint8_t* deviceID) const; - void setDeviceID(const uint8_t* deviceID); + void getDeviceID(DeviceID& deviceID) const; + void setDeviceID(const DeviceID& deviceID); uint8_t getStatus(); void setStatus(uint8_t status); + uint8_t getProduct(); protected: - const uint8_t* firmwareVersion; - uint8_t deviceId[4]; + CorsairLightingFirmwareStorage* const storage; + const corsair_product_enum_t product; + DeviceID deviceId; private: uint8_t status = PROTOCOL_STATUS_OK; }; - -CorsairLightingFirmware corsairLightingNodePROFirmware(); - -CorsairLightingFirmware corsairLightingNodeCOREFirmware(); - -CorsairLightingFirmware corsairLS100Firmware(); - -CorsairLightingFirmware corsairCommanderPROFirmware(); - -CorsairLightingFirmware corsairLT100Firmware(); diff --git a/src/CorsairLightingFirmwareStorageEEPROM.cpp b/src/CorsairLightingFirmwareStorageEEPROM.cpp new file mode 100644 index 00000000..e45e21e8 --- /dev/null +++ b/src/CorsairLightingFirmwareStorageEEPROM.cpp @@ -0,0 +1,29 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#include "CorsairLightingFirmwareStorageEEPROM.h" + +#if defined(ARDUINO_ARCH_AVR) + +#include + +void CorsairLightingFirmwareStorageEEPROM::loadDeviceID(DeviceID& deviceID) const { + EEPROM.get(EEPROM_ADDRESS_DEVICE_ID, deviceID); +} +void CorsairLightingFirmwareStorageEEPROM::saveDeviceID(const DeviceID& deviceID) { + EEPROM.put(EEPROM_ADDRESS_DEVICE_ID, deviceID); +} + +#endif diff --git a/src/CorsairLightingFirmwareStorageEEPROM.h b/src/CorsairLightingFirmwareStorageEEPROM.h new file mode 100644 index 00000000..66074162 --- /dev/null +++ b/src/CorsairLightingFirmwareStorageEEPROM.h @@ -0,0 +1,32 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#pragma once + +#if defined(ARDUINO_ARCH_AVR) + +#include "CorsairLightingFirmware.h" + +#ifndef EEPROM_ADDRESS_DEVICE_ID +#define EEPROM_ADDRESS_DEVICE_ID 0 +#endif + +class CorsairLightingFirmwareStorageEEPROM : public CorsairLightingFirmwareStorage { +public: + virtual void loadDeviceID(DeviceID& deviceID) const override; + virtual void saveDeviceID(const DeviceID& deviceID) override; +}; + +#endif diff --git a/src/CorsairLightingFirmwareStorageStatic.cpp b/src/CorsairLightingFirmwareStorageStatic.cpp new file mode 100644 index 00000000..f80e7ac5 --- /dev/null +++ b/src/CorsairLightingFirmwareStorageStatic.cpp @@ -0,0 +1,23 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#include "CorsairLightingFirmwareStorageStatic.h" + +CorsairLightingFirmwareStorageStatic::CorsairLightingFirmwareStorageStatic(DeviceID& deviceID) : deviceID(deviceID) {} + +void CorsairLightingFirmwareStorageStatic::loadDeviceID(DeviceID& deviceID) const { deviceID = this->deviceID; } +void CorsairLightingFirmwareStorageStatic::saveDeviceID(const DeviceID& deviceID) { + // DeviceID can not be updated +} diff --git a/src/CorsairLightingFirmwareStorageStatic.h b/src/CorsairLightingFirmwareStorageStatic.h new file mode 100644 index 00000000..e3c8f983 --- /dev/null +++ b/src/CorsairLightingFirmwareStorageStatic.h @@ -0,0 +1,28 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#pragma once + +#include "CorsairLightingFirmware.h" + +class CorsairLightingFirmwareStorageStatic : public CorsairLightingFirmwareStorage { +private: + const DeviceID deviceID; + +public: + CorsairLightingFirmwareStorageStatic(DeviceID& deviceID); + virtual void loadDeviceID(DeviceID& deviceID) const override; + virtual void saveDeviceID(const DeviceID& deviceID) override; +}; diff --git a/src/CorsairLightingProtocol.h b/src/CorsairLightingProtocol.h index 0374bce1..af4c6404 100644 --- a/src/CorsairLightingProtocol.h +++ b/src/CorsairLightingProtocol.h @@ -22,13 +22,18 @@ #include "CLPAdditionalFeatures.h" #include "CLPUtils.h" #include "CorsairLightingFirmware.h" +#include "CorsairLightingFirmwareStorageEEPROM.h" +#include "CorsairLightingFirmwareStorageStatic.h" #include "CorsairLightingProtocolConstants.h" #include "CorsairLightingProtocolController.h" #include "CorsairLightingProtocolHID.h" #include "CorsairLightingProtocolResponse.h" #include "CorsairLightingProtocolSerial.h" +#include "CorsairLightingProtocolTinyUSBHID.h" #include "FanController.h" #include "FastLEDController.h" +#include "FastLEDControllerStorage.h" +#include "FastLEDControllerStorageEEPROM.h" #include "FastLEDControllerUtils.h" #include "IFanController.h" #include "ILEDController.h" diff --git a/src/CorsairLightingProtocolConstants.h b/src/CorsairLightingProtocolConstants.h index ef50fb7b..1ae392f9 100644 --- a/src/CorsairLightingProtocolConstants.h +++ b/src/CorsairLightingProtocolConstants.h @@ -60,6 +60,33 @@ #define PROTOCOL_RESPONSE_OK 0x00 #define PROTOCOL_RESPONSE_ERROR 0x01 +#define PROTOCOL_STATUS_OK 0x00 +#define PROTOCOL_STATUS_ERROR 0xFF + +#ifndef SERIAL_NUMBER +#define SERIAL_NUMBER "FB66DF55421900F5" +#endif + +#define CORSAIR_MANUFACTURER "Corsair" +#define CORSAIR_VID 0x1B1C +#define CORSAIR_LNP_PRODUCT "Lighting Node PRO" +#define CORSAIR_LNP_PID 0x0C0B +#define CORSAIR_CP_PRODUCT "Commander PRO" +#define CORSAIR_CP_PID 0x0C10 +#define CORSAIR_LNC_PRODUCT "Lighting Node CORE" +#define CORSAIR_LNC_PID 0x0C1A +#define CORSAIR_SLC_PRODUCT "Smart Lighting Controller" +#define CORSAIR_SLC_PID 0x0C1E +#define CORSAIR_SLT_PRODUCT "Smart Lighting Towers" +#define CORSAIR_SLT_PID 0x0C23 + +typedef enum { + CORSAIR_LIGHTING_NODE_PRO = 0, + CORSAIR_COMMANDER_PRO, + CORSAIR_LIGHTING_NODE_CORE, + CORSAIR_SMART_LIGHTING_CONTROLLER, + CORSAIR_SMART_LIGHTING_TOWERS +} corsair_product_enum_t; struct Command { union { diff --git a/src/CorsairLightingProtocolController.cpp b/src/CorsairLightingProtocolController.cpp index 3f4de55e..7da95368 100644 --- a/src/CorsairLightingProtocolController.cpp +++ b/src/CorsairLightingProtocolController.cpp @@ -55,3 +55,5 @@ void CorsairLightingProtocolController::handleCommand(const Command& command, response->sendError(); } } + +CorsairLightingFirmware* CorsairLightingProtocolController::getFirmware(void) { return corsairLightingFirmware; } \ No newline at end of file diff --git a/src/CorsairLightingProtocolController.h b/src/CorsairLightingProtocolController.h index a05c9412..ee279d41 100644 --- a/src/CorsairLightingProtocolController.h +++ b/src/CorsairLightingProtocolController.h @@ -58,6 +58,8 @@ class CorsairLightingProtocolController { */ void handleCommand(const Command& command, CorsairLightingProtocolResponse* response); + CorsairLightingFirmware* getFirmware(void); + private: CorsairLightingFirmware* const corsairLightingFirmware; ILEDController* const ledController; diff --git a/src/CorsairLightingProtocolSerial.cpp b/src/CorsairLightingProtocolSerial.cpp index d7c9d00a..878b3647 100644 --- a/src/CorsairLightingProtocolSerial.cpp +++ b/src/CorsairLightingProtocolSerial.cpp @@ -45,7 +45,7 @@ bool CorsairLightingProtocolSerial::handleSerial() { delayMicroseconds(100); if (Serial.available()) { - size_t read = Serial.readBytes(rawCommand, sizeof(rawCommand)); + size_t read = Serial.readBytes((char*)rawCommand, sizeof(rawCommand)); if (read == sizeof(rawCommand)) { return true; } else { diff --git a/src/CorsairLightingProtocolTinyUSBHID.cpp b/src/CorsairLightingProtocolTinyUSBHID.cpp new file mode 100644 index 00000000..56d96748 --- /dev/null +++ b/src/CorsairLightingProtocolTinyUSBHID.cpp @@ -0,0 +1,80 @@ +#include "CorsairLightingProtocolTinyUSBHID.h" + +#if defined(USE_TINYUSB) + +const char* corsairProducts[] = {CORSAIR_LNP_PRODUCT, CORSAIR_CP_PRODUCT, CORSAIR_LNC_PRODUCT, CORSAIR_SLC_PRODUCT, + CORSAIR_SLT_PRODUCT}; +const int corsairPIDs[] = {CORSAIR_LNP_PID, CORSAIR_CP_PID, CORSAIR_LNC_PID, CORSAIR_SLC_PID, CORSAIR_SLT_PID}; + +Command CorsairLightingProtocolTinyUSBHID::command; +int CorsairLightingProtocolTinyUSBHID::newData; + +/* clang-format off */ +uint8_t const hid_report[] = {HID_USAGE_PAGE_N (HID_USAGE_PAGE_VENDOR | 0xC0, 2), + HID_USAGE_N (0x0C00, 2), + HID_COLLECTION (HID_COLLECTION_APPLICATION ), + HID_REPORT_SIZE (8 ), + HID_LOGICAL_MIN (0x00 ), + HID_LOGICAL_MAX_N(0xff, 2), + HID_REPORT_COUNT (RESPONSE_SIZE ), + HID_USAGE (0x01 ), + HID_INPUT (HID_DATA | HID_VARIABLE | HID_ABSOLUTE), + HID_REPORT_COUNT (COMMAND_SIZE ), + HID_USAGE (0x02 ), + HID_OUTPUT (HID_DATA | HID_VARIABLE | HID_ABSOLUTE), + HID_COLLECTION_END}; +/* clang-format on */ + +Adafruit_USBD_HID usb_hid(hid_report, sizeof(hid_report), HID_ITF_PROTOCOL_NONE, 10, true); + +uint16_t get_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { + (void)report_id; + (void)report_type; + (void)buffer; + (void)reqlen; + return 0; +} + +void set_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { + (void)report_id; + (void)report_type; + + if (bufsize <= sizeof(Command)) { + memcpy(&CorsairLightingProtocolTinyUSBHID::command.raw, buffer, bufsize); + CorsairLightingProtocolTinyUSBHID::newData = 1; + } +} + +CorsairLightingProtocolTinyUSBHID::CorsairLightingProtocolTinyUSBHID(CorsairLightingProtocolController* controller) + : controller(controller), serialNumber(SERIAL_NUMBER) {} + +CorsairLightingProtocolTinyUSBHID::CorsairLightingProtocolTinyUSBHID(CorsairLightingProtocolController* controller, + const char* serialNumber) + : controller(controller), serialNumber(serialNumber) {} + +void CorsairLightingProtocolTinyUSBHID::setup() { + Serial.end(); + + TinyUSBDevice.setManufacturerDescriptor(CORSAIR_MANUFACTURER); + TinyUSBDevice.setProductDescriptor(corsairProducts[controller->getFirmware()->getProduct()]); + TinyUSBDevice.setID(CORSAIR_VID, corsairPIDs[controller->getFirmware()->getProduct()]); + TinyUSBDevice.setSerialDescriptor(serialNumber); + + usb_hid.setReportCallback(get_report_callback, set_report_callback); + usb_hid.begin(); + + while (!TinyUSBDevice.mounted()) delay(1); +} + +void CorsairLightingProtocolTinyUSBHID::update(void) { + if (newData) { + controller->handleCommand(command, this); + newData = 0; + } +} + +void CorsairLightingProtocolTinyUSBHID::sendX(const uint8_t* data, const size_t x) const { + usb_hid.sendReport(0, data, x); +} + +#endif \ No newline at end of file diff --git a/src/CorsairLightingProtocolTinyUSBHID.h b/src/CorsairLightingProtocolTinyUSBHID.h new file mode 100644 index 00000000..21c4666e --- /dev/null +++ b/src/CorsairLightingProtocolTinyUSBHID.h @@ -0,0 +1,47 @@ +#pragma once + +#include "Arduino.h" +#include "CorsairLightingProtocolConstants.h" +#include "CorsairLightingProtocolController.h" +#include "CorsairLightingProtocolResponse.h" + +#if defined(USE_TINYUSB) + +#include "Adafruit_TinyUSB.h" + +class CorsairLightingProtocolTinyUSBHID : CorsairLightingProtocolResponse { +public: + /** + * Create a new adapter for CorsairLightingProtocolController using the default Serial Number. + * + * @param controller the CorsairLightingProtocolController + */ + CorsairLightingProtocolTinyUSBHID(CorsairLightingProtocolController* controller); + /** + * Create a new adapter for CorsairLightingProtocolController using the given Serial Number for the usb interface. + * + * @param controller the CorsairLightingProtocolController + * @param serialNumber the Serial Number used for the USB interface + */ + CorsairLightingProtocolTinyUSBHID(CorsairLightingProtocolController* controller, const char* serialNumber); + /** + * Setup the TinyUSB HID connection. + * This function must be called in setup. + */ + void setup(); + /** + * Read commands form HID interface and pass them to the contoller. This function must be called in loop. + */ + void update(void); + + static Command command; + + static int newData; + +protected: + CorsairLightingProtocolController* const controller; + const char* serialNumber; + void sendX(const uint8_t* data, const size_t x) const override; +}; + +#endif \ No newline at end of file diff --git a/src/FastLEDController.cpp b/src/FastLEDController.cpp index 97d41e5c..f6ef75d4 100644 --- a/src/FastLEDController.cpp +++ b/src/FastLEDController.cpp @@ -15,12 +15,13 @@ */ #include "FastLEDController.h" -#include - -FastLEDController::FastLEDController(bool useEEPROM) : temperatureController(nullptr), useEEPROM(useEEPROM) { load(); } +FastLEDController::FastLEDController(FastLEDControllerStorage* storage) + : temperatureController(nullptr), storage(storage) { + load(); +} -FastLEDController::FastLEDController(TemperatureController* temperatureController, bool useEEPROM) - : temperatureController(temperatureController), useEEPROM(useEEPROM) { +FastLEDController::FastLEDController(TemperatureController* temperatureController, FastLEDControllerStorage* storage) + : temperatureController(temperatureController), storage(storage) { load(); } @@ -455,34 +456,36 @@ bool FastLEDController::updateLEDs() { return anyUpdate; } -size_t FastLEDController::getEEPROMSize() { return sizeof(channels); } - void FastLEDController::onUpdateHook(uint8_t channel, void (*callback)(void)) { channelData[channel].onUpdateCallback = callback; } bool FastLEDController::load() { - if (useEEPROM) { - EEPROM.get(EEPROM_ADDRESS, channels); - for (LEDChannel& channel : channels) { - if (!isValidLEDChannel(channel)) { - channel = LEDChannel(); - } + if (storage == nullptr) { + return false; + } + + for (int i = 0; i < CHANNEL_NUM; i++) { + storage->load(i, channels[i]); + } + + for (LEDChannel& channel : channels) { + if (!isValidLEDChannel(channel)) { + channel = LEDChannel(); } - return true; } - return false; + return true; } bool FastLEDController::save() { - if (useEEPROM) { -#ifdef DEBUG - Serial.println(F("Save to EEPROM.")); -#endif - EEPROM.put(EEPROM_ADDRESS, channels); - return true; + if (storage == nullptr) { + return false; } - return false; + + for (int i = 0; i < CHANNEL_NUM; i++) { + storage->save(i, channels[i]); + } + return true; } void FastLEDController::triggerLEDUpdate() { trigger_update = true; } diff --git a/src/FastLEDController.h b/src/FastLEDController.h index df2c9ec1..77f066a9 100644 --- a/src/FastLEDController.h +++ b/src/FastLEDController.h @@ -18,13 +18,10 @@ #include #include "Arduino.h" +#include "FastLEDControllerStorage.h" #include "LEDController.h" #include "TemperatureController.h" -#ifndef EEPROM_ADDRESS -#define EEPROM_ADDRESS 4 -#endif - #ifndef LED_CONTROLLER_TIMEOUT #define LED_CONTROLLER_TIMEOUT 30000 #endif @@ -57,22 +54,22 @@ class FastLEDController : public LEDController { public: /** - * Create a new FastLEDController and specify if the EEPROM of the Arduino should be used. See the other contructor - * for more details. + * Create a new FastLEDController and specify which storage should be used. The EEPROM of the Arduino can be used as + * Storage. See the other contructor for more details. * - * @param useEEPROM specify if the EEPROM should be used + * @param storage specify the storage which should be used, e.g. EEPROM */ - FastLEDController(bool useEEPROM); + FastLEDController(FastLEDControllerStorage* storage); /** - * Create a new FastLEDController and specify if the EEPROM of the Arduino should be used to store persistent - * information like the Hardware Lighting. If enabled, the hardware lighting configured in iCUE works without a USB - * connection and even after a restart of the Arduino. Also the the TemperatureController used for temperature - * related lighting can be passed here. + * Create a new FastLEDController and specify which storage should be used. If the EEPROM of the Arduino should be + * used to store persistent information like the Hardware Lighting use {@code FastLEDControllerStorageEEPROM}. If + * enabled, the hardware lighting configured in iCUE works without a USB connection and even after a restart of the + * Arduino. Also the the TemperatureController used for temperature related lighting can be passed here. * * @param temperatureController used for temperature based lighting - * @param useEEPROM specify if the EEPROM should be used + * @param storage specify the storage which should be used, e.g. EEPROM */ - FastLEDController(TemperatureController* temperatureController, bool useEEPROM); + FastLEDController(TemperatureController* temperatureController, FastLEDControllerStorage* storage); ~FastLEDController(); /** * Add a LED array on a channel with a given length. The length define how many LEDs iCUE can control. The actual @@ -106,12 +103,6 @@ class FastLEDController : public LEDController { * @return true if the LED data of a channel was updated, false otherwise */ virtual bool updateLEDs(); - /** - * Get the total size of all data stored in EEPROM by this LEDController. - * - * @return the size in bytes - */ - virtual size_t getEEPROMSize(); /** * Register an update hook, which is executed after a channel has been updated. This can be used to apply * transforamtions to the channel before the data is displayed by FastLED. @@ -123,6 +114,7 @@ class FastLEDController : public LEDController { protected: TemperatureController* const temperatureController; + FastLEDControllerStorage* const storage; bool trigger_update = false; @@ -168,7 +160,6 @@ class FastLEDController : public LEDController { bool renderSequential(ChannelData& channelData, LEDGroup& group, int groupLedCount); bool renderRainbow(ChannelData& channelData, LEDGroup& group, int groupLedCount); - const bool useEEPROM; bool load() override; bool save() override; diff --git a/src/FastLEDControllerStorage.h b/src/FastLEDControllerStorage.h new file mode 100644 index 00000000..366458cc --- /dev/null +++ b/src/FastLEDControllerStorage.h @@ -0,0 +1,24 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#pragma once + +#include "LEDController.h" + +class FastLEDControllerStorage { +public: + virtual bool load(const int index, LEDChannel& channel) = 0; + virtual bool save(const int index, const LEDChannel& channel) = 0; +}; diff --git a/src/FastLEDControllerStorageEEPROM.cpp b/src/FastLEDControllerStorageEEPROM.cpp new file mode 100644 index 00000000..2ab8572e --- /dev/null +++ b/src/FastLEDControllerStorageEEPROM.cpp @@ -0,0 +1,37 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#include "FastLEDControllerStorageEEPROM.h" + +#if defined(ARDUINO_ARCH_AVR) + +#include + +bool FastLEDControllerStorageEEPROM::load(const int index, LEDChannel& channel) { + EEPROM.get(EEPROM_ADDRESS + (sizeof(LEDChannel) * index), channel); + return true; +} + +bool FastLEDControllerStorageEEPROM::save(const int index, const LEDChannel& channel) { +#ifdef DEBUG + Serial.println(F("Save to EEPROM.")); +#endif + EEPROM.put(EEPROM_ADDRESS + (sizeof(LEDChannel) * index), channel); + return true; +} + +size_t FastLEDControllerStorageEEPROM::getEEPROMSize() { return sizeof(LEDChannel) * CHANNEL_NUM; } + +#endif diff --git a/src/FastLEDControllerStorageEEPROM.h b/src/FastLEDControllerStorageEEPROM.h new file mode 100644 index 00000000..a50a8ff1 --- /dev/null +++ b/src/FastLEDControllerStorageEEPROM.h @@ -0,0 +1,38 @@ +/* + Copyright 2021 Leon Kiefer + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#pragma once + +#if defined(ARDUINO_ARCH_AVR) + +#include "FastLEDControllerStorage.h" + +#ifndef EEPROM_ADDRESS +#define EEPROM_ADDRESS 4 +#endif + +class FastLEDControllerStorageEEPROM : public FastLEDControllerStorage { +public: + virtual bool load(const int index, LEDChannel& channel) override; + virtual bool save(const int index, const LEDChannel& channel) override; + /** + * Get the total size of all data stored in EEPROM by this LEDController. + * + * @return the size in bytes + */ + virtual size_t getEEPROMSize(); +}; + +#endif diff --git a/src/RawHID.cpp b/src/RawHID.cpp index efe991df..e7537c03 100644 --- a/src/RawHID.cpp +++ b/src/RawHID.cpp @@ -2,17 +2,14 @@ Copyright (c) 2014-2015 NicoHood modified by Leon Kiefer See the readme for credit to other people. - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -49,9 +46,6 @@ static const uint8_t _hidReportDescriptorRawHID[] PROGMEM = { 0xC0 /* end collection */ }; /* clang-format on */ -#ifndef SERIAL_NUMBER -#define SERIAL_NUMBER "FB66DF55421900F5" -#endif const char defaultSerialNumber[] PROGMEM = SERIAL_NUMBER; @@ -173,4 +167,4 @@ uint8_t CLP::RawHID_::getShortName(char* name) { namespace CLP { RawHID_ RawHID; } -#endif +#endif \ No newline at end of file diff --git a/src/RawHID.h b/src/RawHID.h index 2cb0b87d..d7771f02 100644 --- a/src/RawHID.h +++ b/src/RawHID.h @@ -2,17 +2,14 @@ Copyright (c) 2014-2015 NicoHood modified by Leon Kiefer See the readme for credit to other people. - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,10 +20,11 @@ THE SOFTWARE. */ #pragma once -#include +#include "Arduino.h" +#include "CorsairLightingProtocolConstants.h" #if defined(ARDUINO_ARCH_AVR) -#include +#include "HID.h" #endif #if defined(ARDUINO_ARCH_AVR) && defined(USBCON) @@ -165,4 +163,4 @@ class RawHID_ : public PluggableUSBModule, public Stream { }; extern RawHID_ RawHID; } // namespace CLP -#endif +#endif \ No newline at end of file From 23c61c22c7e2d6b69172ac6a47249eda62d04534 Mon Sep 17 00:00:00 2001 From: Chris Spegal Date: Sat, 5 Feb 2022 12:42:28 -0500 Subject: [PATCH 22/25] Fix TinyUSB HID polling, add debug macro --- .github/workflows/push.yml | 46 +++++++--- README.md | 4 +- library.properties | 2 +- src/CLPUtils.cpp | 41 +++++++++ src/CLPUtils.h | 105 ++++++++++++++++++++++ src/CorsairLightingFirmware.h | 4 +- src/CorsairLightingProtocolConstants.h | 12 ++- src/CorsairLightingProtocolTinyUSBHID.cpp | 31 +++++-- src/CorsairLightingProtocolTinyUSBHID.h | 3 +- src/FanController.cpp | 21 +++++ src/FastLEDController.cpp | 1 + src/FastLEDControllerStorageEEPROM.cpp | 1 + src/LEDController.cpp | 20 +++++ src/TemperatureController.cpp | 7 ++ 14 files changed, 272 insertions(+), 26 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 8ccf078c..91979378 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -71,7 +71,7 @@ jobs: arduino-platform: arduino:avr@1.8.3,HoodLoader2:avr@2.0.5,Legion2:avr@0.3.1 required-libraries: FastLED@3.5.0 sketch-names: HoodLoader2CLPBridge.ino - testAdafruitM0: + testAdafruitSAMD: name: Test for Board ${{ matrix.board }} runs-on: ubuntu-latest strategy: @@ -79,25 +79,20 @@ jobs: board: [ "adafruit:samd:adafruit_feather_m0:usbstack=tinyusb", - "adafruit:samd:adafruit_feather_m0_express:usbstack=tinyusb", "adafruit:samd:adafruit_metro_m0:usbstack=tinyusb", "adafruit:samd:adafruit_circuitplayground_m0:usbstack=tinyusb", "adafruit:samd:adafruit_gemma_m0:usbstack=tinyusb", "adafruit:samd:adafruit_trinket_m0:usbstack=tinyusb", "adafruit:samd:adafruit_qtpy_m0:usbstack=tinyusb", - "adafruit:samd:adafruit_neotrinkey_m0:usbstack=tinyusb", - "adafruit:samd:adafruit_rotarytrinkey_m0:usbstack=tinyusb", - "adafruit:samd:adafruit_neokeytrinkey_m0:usbstack=tinyusb", - "adafruit:samd:adafruit_slidetrinkey_m0:usbstack=tinyusb", - "adafruit:samd:adafruit_proxlighttrinkey_m0:usbstack=tinyusb", "adafruit:samd:adafruit_itsybitsy_m0:usbstack=tinyusb", - "adafruit:samd:adafruit_pirkey:usbstack=tinyusb", - "adafruit:samd:adafruit_hallowing:usbstack=tinyusb", - "adafruit:samd:adafruit_crickit_m0:usbstack=tinyusb", - "adafruit:samd:adafruit_blm_badge:usbstack=tinyusb" + "adafruit:samd:adafruit_itsybitsy_m4:usbstack=tinyusb", + "adafruit:samd:adafruit_metro_m4_airliftlite:usbstack=tinyusb", +# "adafruit:samd:adafruit_feather_m4:usbstack=tinyusb", #Should work but doesn't have the pins needed for the sketch + "adafruit:samd:adafruit_matrixportal_m4:usbstack=tinyusb" ] steps: - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v2 - name: Build for ${{ matrix.board }} uses: ArminJo/arduino-test-compile@v3 with: @@ -107,3 +102,30 @@ jobs: arduino-platform: adafruit:samd@1.7.8 required-libraries: FastLED@3.5.0,Adafruit TinyUSB Library@1.9.2 sketch-names: TinyUSB.ino + testAdafruitnRF52: + name: Test for Board ${{ matrix.board }} + runs-on: ubuntu-latest + strategy: + matrix: + board: + [ + "adafruit:nrf52:feather52840", + "adafruit:nrf52:itsybitsy52840", +# "adafruit:nrf52:cplaynrf52840", #Should work but doesn't have the pins needed for the sketch + "adafruit:nrf52:metro52840" + ] + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Get adafruit-nrfutil + run: | + pip3 install adafruit-nrfutil --user + - name: Build for ${{ matrix.board }} + uses: ArminJo/arduino-test-compile@v3 + with: + cli-version: 0.18.3 + arduino-board-fqbn: ${{ matrix.board }} + platform-url: https://adafruit.github.io/arduino-board-index/package_adafruit_index.json + arduino-platform: adafruit:nrf52@1.3.0 + required-libraries: FastLED@3.5.0,Adafruit TinyUSB Library@1.9.2 + sketch-names: TinyUSB.ino \ No newline at end of file diff --git a/README.md b/README.md index 43bf304a..b8735ed6 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ OpenRGB **This library can be used to integrate custom/unofficial RGB strips with iCUE.** -_This is not an official corsair project._ +_This is not an official Corsair project._ ## Features * Add support of Corsair DIY device protocol to Arduino. @@ -104,6 +104,8 @@ This guide will teach you how to create a Lighting Node PRO with a Raspberry Pi 1. Do the wiring. For more information on [how to wire the LEDs](https://github.com/FastLED/FastLED/wiki/Wiring-leds) and [how to set up the LEDs in the code](https://github.com/FastLED/FastLED/wiki/Basic-usage#setting-up-the-leds) see the links. + + A level shifter or buffer, like [this one](https://www.ti.com/product/SN74AHCT1G126), is recommended in between the Pico and LEDs to translate the 3.3v logic level of the Pico IO to the 5v logic level of the LEDs. Your setup may not work reliably without one. ![the wiring](extra/images/board-wiring-pico.jpg) 1. Verify your device works as expected. diff --git a/library.properties b/library.properties index b5b7b336..ed69ee5e 100644 --- a/library.properties +++ b/library.properties @@ -6,6 +6,6 @@ sentence=Control LED strips via USB from a PC. paragraph=The library mimics Corsair LED Controller devices and can be controlled via USB in iCUE. category=Device Control url=https://github.com/Legion2/CorsairLightingProtocol -architectures=avr,samd +architectures=avr,samd,rp2040 includes=CorsairLightingProtocol.h depends=FastLED diff --git a/src/CLPUtils.cpp b/src/CLPUtils.cpp index 1f72bef2..62ceba0b 100644 --- a/src/CLPUtils.cpp +++ b/src/CLPUtils.cpp @@ -66,3 +66,44 @@ void CLP::printFps(const int interval) { lastMillis = now; } } + +#if CLP_DEBUG + +int CLP_printf(const char* __restrict format, ...) { + char buf[64]; + int len; + va_list ap; + va_start(ap, format); + len = vsnprintf(buf, sizeof(buf), format, ap); + CLP_DEBUG_PORT.write(buf); + va_end(ap); + return len; +} + +int CLP_printf(const __FlashStringHelper* __restrict format, ...) { + char buf[64]; + char fmt[64]; + int len; + va_list ap; + va_start(ap, format); + strcpy_P(fmt, (const char*)format); + len = vsnprintf(buf, sizeof(buf), fmt, ap); + CLP_DEBUG_PORT.write(buf); + va_end(ap); + return len; +} + +void clp_print_data(uint8_t const* buf, uint32_t bufsize, bool address_table) { + if (address_table) { + clp_printf(">>>> "); + for (uint32_t i = 0; i < 16; i++) clp_printf("0x%X ", i); + clp_printf("\r\n"); + } + for (uint32_t i = 0; i < bufsize; i++) { + if (address_table && (i % 16 == 0)) clp_printf("0x%02X ", (i / 16) << 4); + clp_printf(" %02X ", buf[i]); + if ((i + 1) % 16 == 0 || (i + 1) == bufsize) clp_printf("\r\n"); + } +} + +#endif diff --git a/src/CLPUtils.h b/src/CLPUtils.h index 9188ae7d..a1efc675 100644 --- a/src/CLPUtils.h +++ b/src/CLPUtils.h @@ -20,6 +20,111 @@ #define toBigEndian(a) highByte(a), lowByte(a) +#if CLP_DEBUG + +#define CLP_STRCAT(a, b) a##b +#define CLP_STRCAT3(a, b, c) a##b##c + +#define CLP_XSTRCAT(a, b) CLP_STRCAT(a, b) +#define CLP_XSTRCAT3(a, b, c) CLP_STRCAT3(a, b, c) + +#if defined(CLP_DEBUG_PORT) +extern int CLP_printf(const char* format, ...); +extern int CLP_printf(const __FlashStringHelper* format, ...); +#define clp_printf CLP_printf +#else +#define clp_printf printf +#endif + +static inline void clp_print_var(uint8_t const* buf, uint32_t bufsize) { + for (uint32_t i = 0; i < bufsize; i++) clp_printf("%02X ", buf[i]); +} + +extern void clp_print_data(uint8_t const* buf, uint32_t bufsize, bool address_table); + +/* clang-format off */ +#define CLP_LOG(n, ...) CLP_XSTRCAT(CLP_LOG, n)(__VA_ARGS__) +#define CLP_LOG_VAR(n, ...) CLP_XSTRCAT3(CLP_LOG, n, _VAR)(__VA_ARGS__) +#define CLP_LOG_HEX(n, ...) CLP_XSTRCAT3(CLP_LOG, n, _HEX)(__VA_ARGS__) +#define CLP_LOG_DAT(n, buf, size, at) CLP_XSTRCAT3(CLP_LOG, n, _DAT)(buf, size, at) +#define CLP_LOG_LOCATION() clp_printf("%s: %d:\r\n", __PRETTY_FUNCTION__, __LINE__) +#define CLP_LOG_FAILED() clp_printf("%s: %d: Failed\r\n", __PRETTY_FUNCTION__, __LINE__) +#define CLP_LOG_FUNC(func) func + +// Log Level 1: Error +#define CLP_LOG1 clp_printf +#define CLP_LOG1_VAR(_x) clp_print_var((uint8_t const*)(_x), sizeof(*(_x))) +#define CLP_LOG1_HEX(_x) clp_printf(#_x " = %lX\r\n", (unsigned long) (_x) ) +#define CLP_LOG1_DAT(_x, _y, _z) clp_print_data((uint8_t const*)(_x), _y, _z) + +// Log Level 2: Warn +#if CLP_DEBUG >= 2 +#define CLP_LOG2 CLP_LOG1 +#define CLP_LOG2_VAR CLP_LOG1_VAR +#define CLP_LOG2_HEX CLP_LOG1_HEX +#define CLP_LOG2_DAT CLP_LOG1_DAT +#endif + +// Log Level 3: Info +#if CLP_DEBUG >= 3 +#define CLP_LOG3 CLP_LOG1 +#define CLP_LOG3_VAR CLP_LOG1_VAR +#define CLP_LOG3_HEX CLP_LOG1_HEX +#define CLP_LOG3_DAT CLP_LOG1_DAT +#endif + +// Log Level 4: Data +#if CLP_DEBUG >= 4 +#define CLP_LOG4 CLP_LOG1 +#define CLP_LOG4_VAR CLP_LOG1_VAR +#define CLP_LOG4_HEX CLP_LOG1_HEX +#define CLP_LOG4_DAT CLP_LOG1_DAT +#endif +/* clang-format on */ + +#endif // CLP_DEBUG + +#ifndef CLP_LOG +#define CLP_LOG(n, ...) +#define CLP_LOG_VAR(n, ...) +#define CLP_LOG_HEX(n, ...) +#define CLP_LOG_DAT(n, buf, size, at) +#define CLP_LOG_FUNC(n) +#endif + +#define CLP_LOG0(...) +#define CLP_LOG0_VAR(...) +#define CLP_LOG0_HEX(...) +#define CLP_LOG0_DAT(...) + +#ifndef CLP_LOG1 +#define CLP_LOG1(...) +#define CLP_LOG1_VAR(...) +#define CLP_LOG1_HEX(...) +#define CLP_LOG1_DAT(...) +#endif + +#ifndef CLP_LOG2 +#define CLP_LOG2(...) +#define CLP_LOG2_VAR(...) +#define CLP_LOG2_HEX(...) +#define CLP_LOG2_DAT(...) +#endif + +#ifndef CLP_LOG3 +#define CLP_LOG3(...) +#define CLP_LOG3_VAR(...) +#define CLP_LOG3_HEX(...) +#define CLP_LOG3_DAT(...) +#endif + +#ifndef CLP_LOG4 +#define CLP_LOG4(...) +#define CLP_LOG4_VAR(...) +#define CLP_LOG4_HEX(...) +#define CLP_LOG4_DAT(...) +#endif + namespace CLP { uint16_t fromBigEndian(const byte& byte1, const byte& byte2); diff --git a/src/CorsairLightingFirmware.h b/src/CorsairLightingFirmware.h index 7135a630..da310193 100644 --- a/src/CorsairLightingFirmware.h +++ b/src/CorsairLightingFirmware.h @@ -31,9 +31,11 @@ const uint8_t corsairCommanderPROFirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM const uint8_t corsairLT100FirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM = {0x01, 0x01, 0x38}; +const uint8_t corsairCommanderCOREFirmwareVersion[FIRMWARE_VERSION_SIZE] PROGMEM = {0x02, 0x06, 0xC9}; + const uint8_t* const firmwareVersions[] PROGMEM = { corsairLightingNodePROFirmwareVersion, corsairCommanderPROFirmwareVersion, corsairLightingNodeCOREFirmwareVersion, - corsairLS100FirmwareVersion, corsairLT100FirmwareVersion}; + corsairLS100FirmwareVersion, corsairLT100FirmwareVersion, corsairCommanderCOREFirmwareVersion}; struct DeviceID { uint8_t data[4]; diff --git a/src/CorsairLightingProtocolConstants.h b/src/CorsairLightingProtocolConstants.h index 1ae392f9..0ead66ba 100644 --- a/src/CorsairLightingProtocolConstants.h +++ b/src/CorsairLightingProtocolConstants.h @@ -17,6 +17,13 @@ #include "Arduino.h" +// CLP_DEBUG: 0=Off, 1=Error, 2=Warning, 3=Info, 4=Data (Only for TinyUSB) +// CLP_DEBUG_BAUD: Setting too low will severely affect performance depending on debug level; +// 2000000 needed when CLP_DEBUG is 4 +#define CLP_DEBUG 0 +#define CLP_DEBUG_PORT Serial1 +#define CLP_DEBUG_BAUD 115200 + #define COMMAND_SIZE 64 #define RESPONSE_SIZE 16 @@ -79,13 +86,16 @@ #define CORSAIR_SLC_PID 0x0C1E #define CORSAIR_SLT_PRODUCT "Smart Lighting Towers" #define CORSAIR_SLT_PID 0x0C23 +#define CORSAIR_CC_PRODUCT "CORSAIR iCUE Commander CORE" +#define CORSAIR_CC_PID 0x0C1C typedef enum { CORSAIR_LIGHTING_NODE_PRO = 0, CORSAIR_COMMANDER_PRO, CORSAIR_LIGHTING_NODE_CORE, CORSAIR_SMART_LIGHTING_CONTROLLER, - CORSAIR_SMART_LIGHTING_TOWERS + CORSAIR_SMART_LIGHTING_TOWERS, + CORSAIR_COMMANDER_CORE // Currently not functional } corsair_product_enum_t; struct Command { diff --git a/src/CorsairLightingProtocolTinyUSBHID.cpp b/src/CorsairLightingProtocolTinyUSBHID.cpp index 56d96748..01979356 100644 --- a/src/CorsairLightingProtocolTinyUSBHID.cpp +++ b/src/CorsairLightingProtocolTinyUSBHID.cpp @@ -2,9 +2,10 @@ #if defined(USE_TINYUSB) -const char* corsairProducts[] = {CORSAIR_LNP_PRODUCT, CORSAIR_CP_PRODUCT, CORSAIR_LNC_PRODUCT, CORSAIR_SLC_PRODUCT, - CORSAIR_SLT_PRODUCT}; -const int corsairPIDs[] = {CORSAIR_LNP_PID, CORSAIR_CP_PID, CORSAIR_LNC_PID, CORSAIR_SLC_PID, CORSAIR_SLT_PID}; +const char* corsairProducts[] = {CORSAIR_LNP_PRODUCT, CORSAIR_CP_PRODUCT, CORSAIR_LNC_PRODUCT, + CORSAIR_SLC_PRODUCT, CORSAIR_SLT_PRODUCT, CORSAIR_CC_PRODUCT}; +const int corsairPIDs[] = {CORSAIR_LNP_PID, CORSAIR_CP_PID, CORSAIR_LNC_PID, + CORSAIR_SLC_PID, CORSAIR_SLT_PID, CORSAIR_CC_PID}; Command CorsairLightingProtocolTinyUSBHID::command; int CorsairLightingProtocolTinyUSBHID::newData; @@ -25,13 +26,16 @@ uint8_t const hid_report[] = {HID_USAGE_PAGE_N (HID_USAGE_PAGE_VENDOR | 0xC0, 2) HID_COLLECTION_END}; /* clang-format on */ -Adafruit_USBD_HID usb_hid(hid_report, sizeof(hid_report), HID_ITF_PROTOCOL_NONE, 10, true); +Adafruit_USBD_HID TinyUSBDevice_HID(hid_report, sizeof(hid_report), HID_ITF_PROTOCOL_NONE, 2, true); uint16_t get_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { (void)report_id; (void)report_type; (void)buffer; (void)reqlen; + + CLP_LOG(2, F("Get report callback!\r\n")); + return 0; } @@ -42,6 +46,12 @@ void set_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8 if (bufsize <= sizeof(Command)) { memcpy(&CorsairLightingProtocolTinyUSBHID::command.raw, buffer, bufsize); CorsairLightingProtocolTinyUSBHID::newData = 1; + + CLP_LOG(3, F("Received command: %02X\r\n"), CorsairLightingProtocolTinyUSBHID::command.command); + CLP_LOG_DAT(4, &CorsairLightingProtocolTinyUSBHID::command.raw, + sizeof(CorsairLightingProtocolTinyUSBHID::command), true); + } else { + CLP_LOG(2, F("Command too large\r\n")); } } @@ -52,16 +62,16 @@ CorsairLightingProtocolTinyUSBHID::CorsairLightingProtocolTinyUSBHID(CorsairLigh const char* serialNumber) : controller(controller), serialNumber(serialNumber) {} -void CorsairLightingProtocolTinyUSBHID::setup() { - Serial.end(); +void CorsairLightingProtocolTinyUSBHID::setup(void) { + CLP_LOG_FUNC(CLP_DEBUG_PORT.begin(CLP_DEBUG_BAUD)); TinyUSBDevice.setManufacturerDescriptor(CORSAIR_MANUFACTURER); TinyUSBDevice.setProductDescriptor(corsairProducts[controller->getFirmware()->getProduct()]); TinyUSBDevice.setID(CORSAIR_VID, corsairPIDs[controller->getFirmware()->getProduct()]); TinyUSBDevice.setSerialDescriptor(serialNumber); - usb_hid.setReportCallback(get_report_callback, set_report_callback); - usb_hid.begin(); + TinyUSBDevice_HID.setReportCallback(get_report_callback, set_report_callback); + TinyUSBDevice_HID.begin(); while (!TinyUSBDevice.mounted()) delay(1); } @@ -74,7 +84,10 @@ void CorsairLightingProtocolTinyUSBHID::update(void) { } void CorsairLightingProtocolTinyUSBHID::sendX(const uint8_t* data, const size_t x) const { - usb_hid.sendReport(0, data, x); + TinyUSBDevice_HID.sendReport(0, data, x); + + CLP_LOG(3, F("Sent response: %02X\r\n"), data[0]); + CLP_LOG_DAT(4, data, x, true); } #endif \ No newline at end of file diff --git a/src/CorsairLightingProtocolTinyUSBHID.h b/src/CorsairLightingProtocolTinyUSBHID.h index 21c4666e..c8383833 100644 --- a/src/CorsairLightingProtocolTinyUSBHID.h +++ b/src/CorsairLightingProtocolTinyUSBHID.h @@ -1,6 +1,7 @@ #pragma once #include "Arduino.h" +#include "CLPUtils.h" #include "CorsairLightingProtocolConstants.h" #include "CorsairLightingProtocolController.h" #include "CorsairLightingProtocolResponse.h" @@ -28,7 +29,7 @@ class CorsairLightingProtocolTinyUSBHID : CorsairLightingProtocolResponse { * Setup the TinyUSB HID connection. * This function must be called in setup. */ - void setup(); + void setup(void); /** * Read commands form HID interface and pass them to the contoller. This function must be called in loop. */ diff --git a/src/FanController.cpp b/src/FanController.cpp index e8e5e874..d68beee6 100644 --- a/src/FanController.cpp +++ b/src/FanController.cpp @@ -29,6 +29,7 @@ bool isValidFanDetectionType(const FanDetectionType type) { void FanController::handleFanControl(const Command& command, const CorsairLightingProtocolResponse* response) { switch (command.command) { case READ_FAN_MASK: { + CLP_LOG(3, F("Read fan mask\r\n")); FanMask mask[FAN_NUM]; for (uint8_t i = 0; i < FAN_NUM; i++) { switch (getFanDetectionType(i)) { @@ -50,8 +51,10 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case READ_FAN_SPEED: { + CLP_LOG(3, F("Read fan speed\r\n")); const uint8_t& fan = command.data[0]; if (fan >= FAN_NUM) { + CLP_LOG(1, F("Invalid fan: %d\r\n"), fan); response->sendError(); return; } @@ -61,8 +64,10 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case READ_FAN_POWER: { + CLP_LOG(3, F("Read fan power\r\n")); const uint8_t& fan = command.data[0]; if (fan >= FAN_NUM) { + CLP_LOG(1, F("Invalid fan: %d\r\n"), fan); response->sendError(); return; } @@ -72,8 +77,10 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case WRITE_FAN_POWER: { + CLP_LOG(3, F("Write fan power\r\n")); const uint8_t& fan = command.data[0]; if (fan >= FAN_NUM) { + CLP_LOG(1, F("Invalid fan: %d\r\n"), fan); response->sendError(); return; } @@ -83,8 +90,10 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case WRITE_FAN_SPEED: { + CLP_LOG(3, F("Write fan speed\r\n")); const uint8_t& fan = command.data[0]; if (fan >= FAN_NUM) { + CLP_LOG(1, F("Invalid fan: %d\r\n"), fan); response->sendError(); return; } @@ -94,8 +103,10 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case WRITE_FAN_CURVE: { + CLP_LOG(3, F("Write fan curve\r\n")); const uint8_t& fan = command.data[0]; if (fan >= FAN_NUM) { + CLP_LOG(1, F("Invalid fan: %d\r\n"), fan); response->sendError(); return; } @@ -110,8 +121,10 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case WRITE_FAN_EXTERNAL_TEMP: { + CLP_LOG(3, F("Write fan external temp\r\n")); const uint8_t& fan = command.data[0]; if (fan >= FAN_NUM) { + CLP_LOG(1, F("Invalid fan: %d\r\n"), fan); response->sendError(); return; } @@ -121,6 +134,7 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case WRITE_FAN_FORCE_THREE_PIN_MODE: { + CLP_LOG(3, F("Write fan 3-pin mode\r\n")); if (command.data[0] == FAN_FORCE_THREE_PIN_MODE_ON) { setFanForce3PinMode(true); } else if (command.data[0] == FAN_FORCE_THREE_PIN_MODE_OFF) { @@ -134,17 +148,20 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case WRITE_FAN_DETECTION_TYPE: { + CLP_LOG(3, F("Write fan detect type\r\n")); if (command.data[0] != 0x02) { response->sendError(); return; } const uint8_t& fan = command.data[1]; if (fan >= FAN_NUM) { + CLP_LOG(1, F("Invalid fan: %d\r\n"), fan); response->sendError(); return; } const FanDetectionType type = static_cast(command.data[2]); if (!isValidFanDetectionType(type)) { + CLP_LOG(1, F("Invalid fan detection type: %d\r\n"), type); response->sendError(); return; } @@ -153,12 +170,14 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } case READ_FAN_DETECTION_TYPE: { + CLP_LOG(3, F("Read fan detect type\r\n")); if (command.data[0] != 0x01) { response->sendError(); return; } const uint8_t& fan = command.data[1]; if (fan >= FAN_NUM) { + CLP_LOG(1, F("Invalid fan: %d\r\n"), fan); response->sendError(); return; } @@ -168,6 +187,8 @@ void FanController::handleFanControl(const Command& command, const CorsairLighti break; } default: + CLP_LOG(1, F("Unkown command: %02X\r\n"), command.command); response->sendError(); + return; } } diff --git a/src/FastLEDController.cpp b/src/FastLEDController.cpp index f6ef75d4..8bea4673 100644 --- a/src/FastLEDController.cpp +++ b/src/FastLEDController.cpp @@ -419,6 +419,7 @@ bool FastLEDController::updateLEDs() { break; } default: { + CLP_LOG(3, F("Unkown group mode: %02X\r\n"), group.mode); #ifdef DEBUG Serial.print(F("unkown group mode: ")); Serial.print(group.mode, HEX); diff --git a/src/FastLEDControllerStorageEEPROM.cpp b/src/FastLEDControllerStorageEEPROM.cpp index 2ab8572e..c96ba30d 100644 --- a/src/FastLEDControllerStorageEEPROM.cpp +++ b/src/FastLEDControllerStorageEEPROM.cpp @@ -25,6 +25,7 @@ bool FastLEDControllerStorageEEPROM::load(const int index, LEDChannel& channel) } bool FastLEDControllerStorageEEPROM::save(const int index, const LEDChannel& channel) { + CLP_LOG(3, F("Save to EEPROM.\r\n")); #ifdef DEBUG Serial.println(F("Save to EEPROM.")); #endif diff --git a/src/LEDController.cpp b/src/LEDController.cpp index 1483ad1d..e38897f7 100644 --- a/src/LEDController.cpp +++ b/src/LEDController.cpp @@ -21,6 +21,7 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti lastCommand = millis(); auto& data = command.data; if (command.command == WRITE_LED_TRIGGER) { + CLP_LOG(3, F("Write LED trigger\r\n")); triggerLEDUpdate(); saveIfNeeded(); } else { @@ -31,6 +32,7 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti const uint8_t& channel = data[0]; switch (command.command) { case READ_LED_STRIP_MASK: { + CLP_LOG(3, F("Read LED strip mask\r\n")); uint8_t ledMask[GROUPS_NUM]; for (uint8_t i = 0; i < GROUPS_NUM; i++) { if (i < channels[channel].groupsSet) { @@ -45,6 +47,7 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti break; } case WRITE_LED_RGB_VALUE: { + CLP_LOG(1, F("Write LED RGB value!\r\n")); #ifdef DEBUG Serial.println(F("WriteLedRgbValue")); #endif @@ -54,10 +57,12 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti break; } case WRITE_LED_COLOR_VALUES: { + CLP_LOG(3, F("Write LED color values\r\n")); const uint8_t offset = data[1]; const size_t inputLength = min((size_t)data[2], sizeof(data) - 4); const uint8_t color = data[3]; if (color >= 3) { + CLP_LOG(1, F("Invalid color: %d\r\n"), color); response->sendError(); return; } @@ -65,11 +70,14 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti break; } case WRITE_LED_CLEAR: { + CLP_LOG(3, F("Write LED clear\r\n")); clearLEDColorValues(channel); break; } case WRITE_LED_GROUP_SET: { + CLP_LOG(3, F("Write LED group set\r\n")); if (channels[channel].groupsSet >= GROUPS_NUM) { + CLP_LOG(1, F("Invalid LED group: %d\r\n"), channels[channel].groupsSet); response->sendError(); return; } @@ -95,6 +103,7 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti group.temp3 = CLP::fromBigEndian(data[21], data[22]); if (!isValidLEDGroup(group)) { + CLP_LOG(1, F("Invalid LED config received\r\n")); response->sendError(); return; } @@ -103,16 +112,20 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti break; } case WRITE_LED_EXTERNAL_TEMP: { + CLP_LOG(3, F("Write LED external temp\r\n")); setLEDExternalTemperature(channel, CLP::fromBigEndian(data[2], data[3])); break; } case WRITE_LED_GROUPS_CLEAR: { + CLP_LOG(3, F("Write LED groups clear\r\n")); triggerSave |= clearLEDGroups(channel); break; } case WRITE_LED_MODE: { + CLP_LOG(3, F("Write LED mode\r\n")); const ChannelMode mode = static_cast(data[1]); if (!isValidChannelMode(mode)) { + CLP_LOG(1, F("Unkown LED channel mode: %02X\r\n"), data[1]); #ifdef DEBUG Serial.print(F("unkown LED channel mode: ")); Serial.print(data[1], HEX); @@ -126,11 +139,13 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti break; } case WRITE_LED_BRIGHTNESS: { + CLP_LOG(3, F("Write LED brightness\r\n")); uint8_t brightness = CLP::convert100To255(data[1]); triggerSave |= setLEDBrightness(channel, brightness); break; } case WRITE_LED_COUNT: { + CLP_LOG(2, F("Write LED count!\r\n")); #ifdef DEBUG Serial.print(F("WRITE_LED_COUNT: ")); Serial.print(data[1], HEX); @@ -141,8 +156,10 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti break; } case WRITE_LED_PORT_TYPE: { + CLP_LOG(3, F("Write LED port type\r\n")); const PortType portType = static_cast(data[1]); if (!isValidPortType(portType)) { + CLP_LOG(1, F("Invalid port type: %d\r\n"), portType); response->sendError(); return; } @@ -150,10 +167,12 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti break; } case WRITE_LED_START_AUTODETECTION: { + CLP_LOG(3, F("Write LED start autodet\r\n")); startLEDAutodetection(channel); break; } case READ_LED_AUTODETECTION_RESULTS: { + CLP_LOG(3, F("Write LED get autodet results\r\n")); const uint8_t result = getLEDAutodetectionResult(channel); uint8_t buffer[] = {result}; response->send(buffer, sizeof(buffer)); @@ -162,6 +181,7 @@ void LEDController::handleLEDControl(const Command& command, const CorsairLighti break; } default: { + CLP_LOG(1, F("Unkown command: %02X\r\n"), command.command); #ifdef DEBUG Serial.print(F("unkown command: ")); Serial.print(command.command, HEX); diff --git a/src/TemperatureController.cpp b/src/TemperatureController.cpp index ffc84760..e14b9c2e 100644 --- a/src/TemperatureController.cpp +++ b/src/TemperatureController.cpp @@ -21,6 +21,7 @@ void TemperatureController::handleTemperatureControl(const Command& command, const CorsairLightingProtocolResponse* response) { switch (command.command) { case READ_TEMPERATURE_MASK: { + CLP_LOG(3, F("Read temp mask\r\n")); uint8_t mask[TEMPERATURE_NUM]; for (uint8_t i = 0; i < TEMPERATURE_NUM; i++) { mask[i] = isTemperatureSensorConnected(i) ? TEMPERATURE_MASK_CONNECTED : TEMPERATURE_MASK_NOT_CONNECTED; @@ -29,8 +30,10 @@ void TemperatureController::handleTemperatureControl(const Command& command, break; } case READ_TEMPERATURE_VALUE: { + CLP_LOG(3, F("Read temp value\r\n")); const uint8_t& tempSensor = command.data[0]; if (tempSensor >= TEMPERATURE_NUM) { + CLP_LOG(1, F("Unknown temp sensor: %d\r\n"), tempSensor); response->sendError(); return; } @@ -40,6 +43,7 @@ void TemperatureController::handleTemperatureControl(const Command& command, break; } case READ_VOLTAGE_VALUE: { + CLP_LOG(3, F("Read voltage\r\n")); const uint8_t& rail = command.data[0]; uint16_t voltage; switch (rail) { @@ -56,6 +60,7 @@ void TemperatureController::handleTemperatureControl(const Command& command, break; } default: { + CLP_LOG(1, F("Unkown voltage rail: %d\r\n"), rail); response->sendError(); return; } @@ -66,7 +71,9 @@ void TemperatureController::handleTemperatureControl(const Command& command, break; } default: + CLP_LOG(1, F("Unkown command: %02X\r\n"), command.command); response->sendError(); + return; } } From f4667ab89f0b345c37e5d0baa970d73aa049b91b Mon Sep 17 00:00:00 2001 From: Chris Spegal Date: Fri, 18 Feb 2022 15:01:22 -0500 Subject: [PATCH 23/25] Requested changes --- src/CLPUtils.cpp | 23 +++++----- src/CLPUtils.h | 55 ++++++++++++----------- src/CorsairLightingProtocolTinyUSBHID.cpp | 8 ++-- 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/src/CLPUtils.cpp b/src/CLPUtils.cpp index 62ceba0b..1738225b 100644 --- a/src/CLPUtils.cpp +++ b/src/CLPUtils.cpp @@ -68,8 +68,9 @@ void CLP::printFps(const int interval) { } #if CLP_DEBUG +#if defined(CLP_DEBUG_PORT) -int CLP_printf(const char* __restrict format, ...) { +int CLP::printf(const char* __restrict format, ...) { char buf[64]; int len; va_list ap; @@ -80,7 +81,7 @@ int CLP_printf(const char* __restrict format, ...) { return len; } -int CLP_printf(const __FlashStringHelper* __restrict format, ...) { +int CLP::printf(const __FlashStringHelper* __restrict format, ...) { char buf[64]; char fmt[64]; int len; @@ -93,17 +94,19 @@ int CLP_printf(const __FlashStringHelper* __restrict format, ...) { return len; } -void clp_print_data(uint8_t const* buf, uint32_t bufsize, bool address_table) { +#endif // defined(CLP_DEBUG_PORT) + +void CLP::printData(uint8_t const* buf, uint32_t bufsize, bool address_table) { if (address_table) { - clp_printf(">>>> "); - for (uint32_t i = 0; i < 16; i++) clp_printf("0x%X ", i); - clp_printf("\r\n"); + clpPrintf(">>>> "); + for (uint32_t i = 0; i < 16; i++) clpPrintf("0x%X ", i); + clpPrintf("\r\n"); } for (uint32_t i = 0; i < bufsize; i++) { - if (address_table && (i % 16 == 0)) clp_printf("0x%02X ", (i / 16) << 4); - clp_printf(" %02X ", buf[i]); - if ((i + 1) % 16 == 0 || (i + 1) == bufsize) clp_printf("\r\n"); + if (address_table && (i % 16 == 0)) clpPrintf("0x%02X ", (i / 16) << 4); + clpPrintf(" %02X ", buf[i]); + if ((i + 1) % 16 == 0 || (i + 1) == bufsize) clpPrintf("\r\n"); } } -#endif +#endif // CLP_DEBUG diff --git a/src/CLPUtils.h b/src/CLPUtils.h index a1efc675..9b6a068e 100644 --- a/src/CLPUtils.h +++ b/src/CLPUtils.h @@ -29,56 +29,59 @@ #define CLP_XSTRCAT3(a, b, c) CLP_STRCAT3(a, b, c) #if defined(CLP_DEBUG_PORT) -extern int CLP_printf(const char* format, ...); -extern int CLP_printf(const __FlashStringHelper* format, ...); -#define clp_printf CLP_printf +namespace CLP { +extern int printf(const char* format, ...); +extern int printf(const __FlashStringHelper* format, ...); +} // namespace CLP +#define clpPrintf CLP::printf #else -#define clp_printf printf +#define clpPrintf printf #endif -static inline void clp_print_var(uint8_t const* buf, uint32_t bufsize) { - for (uint32_t i = 0; i < bufsize; i++) clp_printf("%02X ", buf[i]); +namespace CLP { +static inline void printVar(uint8_t const* buf, uint32_t bufsize) { + for (uint32_t i = 0; i < bufsize; i++) clpPrintf("%02X ", buf[i]); } - -extern void clp_print_data(uint8_t const* buf, uint32_t bufsize, bool address_table); +extern void printData(uint8_t const* buf, uint32_t bufsize, bool address_table); +} // namespace CLP /* clang-format off */ #define CLP_LOG(n, ...) CLP_XSTRCAT(CLP_LOG, n)(__VA_ARGS__) #define CLP_LOG_VAR(n, ...) CLP_XSTRCAT3(CLP_LOG, n, _VAR)(__VA_ARGS__) #define CLP_LOG_HEX(n, ...) CLP_XSTRCAT3(CLP_LOG, n, _HEX)(__VA_ARGS__) #define CLP_LOG_DAT(n, buf, size, at) CLP_XSTRCAT3(CLP_LOG, n, _DAT)(buf, size, at) -#define CLP_LOG_LOCATION() clp_printf("%s: %d:\r\n", __PRETTY_FUNCTION__, __LINE__) -#define CLP_LOG_FAILED() clp_printf("%s: %d: Failed\r\n", __PRETTY_FUNCTION__, __LINE__) +#define CLP_LOG_LOCATION() clpPrintf("%s: %d:\r\n", __PRETTY_FUNCTION__, __LINE__) +#define CLP_LOG_FAILED() clpPrintf("%s: %d: Failed\r\n", __PRETTY_FUNCTION__, __LINE__) #define CLP_LOG_FUNC(func) func // Log Level 1: Error -#define CLP_LOG1 clp_printf -#define CLP_LOG1_VAR(_x) clp_print_var((uint8_t const*)(_x), sizeof(*(_x))) -#define CLP_LOG1_HEX(_x) clp_printf(#_x " = %lX\r\n", (unsigned long) (_x) ) -#define CLP_LOG1_DAT(_x, _y, _z) clp_print_data((uint8_t const*)(_x), _y, _z) +#define CLP_LOG1 clpPrintf +#define CLP_LOG1_VAR(_x) CLP::printVar((uint8_t const*)(_x), sizeof(*(_x))) +#define CLP_LOG1_HEX(_x) clpPrintf(#_x " = %lX\r\n", (unsigned long) (_x) ) +#define CLP_LOG1_DAT(_x, _y, _z) CLP::printData((uint8_t const*)(_x), _y, _z) // Log Level 2: Warn #if CLP_DEBUG >= 2 -#define CLP_LOG2 CLP_LOG1 -#define CLP_LOG2_VAR CLP_LOG1_VAR -#define CLP_LOG2_HEX CLP_LOG1_HEX -#define CLP_LOG2_DAT CLP_LOG1_DAT +#define CLP_LOG2 CLP_LOG1 +#define CLP_LOG2_VAR CLP_LOG1_VAR +#define CLP_LOG2_HEX CLP_LOG1_HEX +#define CLP_LOG2_DAT CLP_LOG1_DAT #endif // Log Level 3: Info #if CLP_DEBUG >= 3 -#define CLP_LOG3 CLP_LOG1 -#define CLP_LOG3_VAR CLP_LOG1_VAR -#define CLP_LOG3_HEX CLP_LOG1_HEX -#define CLP_LOG3_DAT CLP_LOG1_DAT +#define CLP_LOG3 CLP_LOG1 +#define CLP_LOG3_VAR CLP_LOG1_VAR +#define CLP_LOG3_HEX CLP_LOG1_HEX +#define CLP_LOG3_DAT CLP_LOG1_DAT #endif // Log Level 4: Data #if CLP_DEBUG >= 4 -#define CLP_LOG4 CLP_LOG1 -#define CLP_LOG4_VAR CLP_LOG1_VAR -#define CLP_LOG4_HEX CLP_LOG1_HEX -#define CLP_LOG4_DAT CLP_LOG1_DAT +#define CLP_LOG4 CLP_LOG1 +#define CLP_LOG4_VAR CLP_LOG1_VAR +#define CLP_LOG4_HEX CLP_LOG1_HEX +#define CLP_LOG4_DAT CLP_LOG1_DAT #endif /* clang-format on */ diff --git a/src/CorsairLightingProtocolTinyUSBHID.cpp b/src/CorsairLightingProtocolTinyUSBHID.cpp index 01979356..6828fd5c 100644 --- a/src/CorsairLightingProtocolTinyUSBHID.cpp +++ b/src/CorsairLightingProtocolTinyUSBHID.cpp @@ -26,7 +26,7 @@ uint8_t const hid_report[] = {HID_USAGE_PAGE_N (HID_USAGE_PAGE_VENDOR | 0xC0, 2) HID_COLLECTION_END}; /* clang-format on */ -Adafruit_USBD_HID TinyUSBDevice_HID(hid_report, sizeof(hid_report), HID_ITF_PROTOCOL_NONE, 2, true); +Adafruit_USBD_HID tudHid(hid_report, sizeof(hid_report), HID_ITF_PROTOCOL_NONE, 2, true); uint16_t get_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { (void)report_id; @@ -70,8 +70,8 @@ void CorsairLightingProtocolTinyUSBHID::setup(void) { TinyUSBDevice.setID(CORSAIR_VID, corsairPIDs[controller->getFirmware()->getProduct()]); TinyUSBDevice.setSerialDescriptor(serialNumber); - TinyUSBDevice_HID.setReportCallback(get_report_callback, set_report_callback); - TinyUSBDevice_HID.begin(); + tudHid.setReportCallback(get_report_callback, set_report_callback); + tudHid.begin(); while (!TinyUSBDevice.mounted()) delay(1); } @@ -84,7 +84,7 @@ void CorsairLightingProtocolTinyUSBHID::update(void) { } void CorsairLightingProtocolTinyUSBHID::sendX(const uint8_t* data, const size_t x) const { - TinyUSBDevice_HID.sendReport(0, data, x); + tudHid.sendReport(0, data, x); CLP_LOG(3, F("Sent response: %02X\r\n"), data[0]); CLP_LOG_DAT(4, data, x, true); From a14c4be845db3a9f7e6e9f428d3c0f0c4fa7de5f Mon Sep 17 00:00:00 2001 From: Chris Spegal Date: Fri, 18 Feb 2022 18:06:32 -0500 Subject: [PATCH 24/25] Fix refresh interval --- src/CorsairLightingProtocolTinyUSBHID.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CorsairLightingProtocolTinyUSBHID.cpp b/src/CorsairLightingProtocolTinyUSBHID.cpp index 6828fd5c..b8b17bef 100644 --- a/src/CorsairLightingProtocolTinyUSBHID.cpp +++ b/src/CorsairLightingProtocolTinyUSBHID.cpp @@ -26,7 +26,7 @@ uint8_t const hid_report[] = {HID_USAGE_PAGE_N (HID_USAGE_PAGE_VENDOR | 0xC0, 2) HID_COLLECTION_END}; /* clang-format on */ -Adafruit_USBD_HID tudHid(hid_report, sizeof(hid_report), HID_ITF_PROTOCOL_NONE, 2, true); +Adafruit_USBD_HID tudHid(hid_report, sizeof(hid_report), HID_ITF_PROTOCOL_NONE, 1, true); uint16_t get_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { (void)report_id; From dc2eb9cb2f377e681dbbf2de7b9fec20276fe9eb Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Sat, 19 Feb 2022 13:16:50 +0100 Subject: [PATCH 25/25] release 0.15.0 --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/support.md | 2 +- extra/doxygen.conf | 2 +- library.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 36d9d452..dfef69f0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -27,7 +27,7 @@ If applicable, add screenshots to help explain your problem. - Board: [e.g. Arduino Leonardo] - Device: [e.g. Lighting Node PRO] - Version of IDE: [e.g. Arduino IDE 1.8.13] - - Version of CLP: [e.g. 0.14.2] + - Version of CLP: [e.g. 0.15.0] - Version of CLP Boards: [e.g. 0.2.0] - Sketch: [e.g. RepeatAndScale] diff --git a/.github/ISSUE_TEMPLATE/support.md b/.github/ISSUE_TEMPLATE/support.md index d3481b28..45ccfb70 100644 --- a/.github/ISSUE_TEMPLATE/support.md +++ b/.github/ISSUE_TEMPLATE/support.md @@ -18,7 +18,7 @@ If applicable, add screenshots to help explain your problem. - Board: [e.g. Arduino Leonardo] - Device: [e.g. Lighting Node PRO] - Version of IDE: [e.g. Arduino IDE 1.8.13] - - Version of CLP: [e.g. 0.14.2] + - Version of CLP: [e.g. 0.15.0] - Version of CLP Boards: [e.g. 0.2.0] - Sketch: [e.g. RepeatAndScale] diff --git a/extra/doxygen.conf b/extra/doxygen.conf index 326f5c86..c167f413 100644 --- a/extra/doxygen.conf +++ b/extra/doxygen.conf @@ -38,7 +38,7 @@ PROJECT_NAME = "Corsair Lighting Protocol" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 0.14.2 +PROJECT_NUMBER = 0.15.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/library.properties b/library.properties index ed69ee5e..4d2cb98a 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Corsair Lighting Protocol -version=0.14.2 +version=0.15.0 author=Leon Kiefer maintainer=Leon Kiefer sentence=Control LED strips via USB from a PC.