From 10894d2a6ee812d40b9320dee3a903e8bbfbcbff Mon Sep 17 00:00:00 2001 From: Maik Hofmann Date: Sun, 14 Feb 2021 13:07:08 +0100 Subject: [PATCH] initial commit --- .gitignore | 1 + HCPBridge/.gitignore | 5 + HCPBridge/include/README | 39 +++ HCPBridge/lib/README | 46 +++ HCPBridge/platformio.ini | 17 + HCPBridge/src/hciemulator.cpp | 425 ++++++++++++++++++++++++ HCPBridge/src/hciemulator.h | 130 ++++++++ HCPBridge/src/index_html.h | 1 + HCPBridge/src/main.cpp | 163 +++++++++ HCPBridge/src/webpage/buildindex.cmd | 1 + HCPBridge/src/webpage/command | 0 HCPBridge/src/webpage/compress.py | 42 +++ HCPBridge/src/webpage/index.html | 159 +++++++++ HCPBridge/src/webpage/runtestserver.cmd | 1 + HCPBridge/src/webpage/status | 9 + HCPBridge/test/README | 11 + Investigation/ProtocolAnalyse.txt | 71 ++++ Investigation/bussniffer/.gitignore | 5 + Investigation/bussniffer/include/README | 39 +++ Investigation/bussniffer/lib/README | 46 +++ Investigation/bussniffer/platformio.ini | 14 + Investigation/bussniffer/src/main.cpp | 81 +++++ Investigation/bussniffer/test/README | 11 + Investigation/oszi/busscan.png | Bin 0 -> 108024 bytes Investigation/readme.txt | 53 +++ 25 files changed, 1370 insertions(+) create mode 100644 .gitignore create mode 100644 HCPBridge/.gitignore create mode 100644 HCPBridge/include/README create mode 100644 HCPBridge/lib/README create mode 100644 HCPBridge/platformio.ini create mode 100644 HCPBridge/src/hciemulator.cpp create mode 100644 HCPBridge/src/hciemulator.h create mode 100644 HCPBridge/src/index_html.h create mode 100644 HCPBridge/src/main.cpp create mode 100644 HCPBridge/src/webpage/buildindex.cmd create mode 100644 HCPBridge/src/webpage/command create mode 100644 HCPBridge/src/webpage/compress.py create mode 100644 HCPBridge/src/webpage/index.html create mode 100644 HCPBridge/src/webpage/runtestserver.cmd create mode 100644 HCPBridge/src/webpage/status create mode 100644 HCPBridge/test/README create mode 100644 Investigation/ProtocolAnalyse.txt create mode 100644 Investigation/bussniffer/.gitignore create mode 100644 Investigation/bussniffer/include/README create mode 100644 Investigation/bussniffer/lib/README create mode 100644 Investigation/bussniffer/platformio.ini create mode 100644 Investigation/bussniffer/src/main.cpp create mode 100644 Investigation/bussniffer/test/README create mode 100644 Investigation/oszi/busscan.png create mode 100644 Investigation/readme.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b830d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +HCPBridge/.vscode diff --git a/HCPBridge/.gitignore b/HCPBridge/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/HCPBridge/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/HCPBridge/include/README b/HCPBridge/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/HCPBridge/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/HCPBridge/lib/README b/HCPBridge/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/HCPBridge/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/HCPBridge/platformio.ini b/HCPBridge/platformio.ini new file mode 100644 index 0000000..e4d26de --- /dev/null +++ b/HCPBridge/platformio.ini @@ -0,0 +1,17 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:esp12e] +platform = espressif8266 +board = esp12e +framework = arduino +lib_deps = + ottowinter/ESPAsyncWebServer-esphome@^1.2.7 + bblanchon/ArduinoJson@^6.17.2 diff --git a/HCPBridge/src/hciemulator.cpp b/HCPBridge/src/hciemulator.cpp new file mode 100644 index 0000000..eb015d9 --- /dev/null +++ b/HCPBridge/src/hciemulator.cpp @@ -0,0 +1,425 @@ +#include "hciemulator.h" +#define CHECKCHANGEDSET(Target,Value,Flag) if((Target)!=(Value)){Target=Value;Flag=true;} +int hciloglevel = DEFAULTLOGLEVEL; + +#ifdef SOFTSERIAL +#define Log(Level,Message) LogCore(Level,Message) +#define Log3(Level,Message,Buffer, Len) LogCore(Level,Message,Buffer,Len) +//LOGLEVEL +void LogCore(int Level, const char* msg, const unsigned char * data=NULL, size_t datalen=0){ + if(Level>hciloglevel){ + return; + } + if(data!=NULL && datalen>0){ + String newmsg(msg); + char str[4]; + for (size_t i = 0; i < datalen; i++){ + snprintf(str,sizeof(str),"%02x ", data[i]); + newmsg+=str; + } + Serial.println(newmsg); + }else{ + Serial.println(msg); + } +} +#else + #define Log(Level,Message) + #define Log3(Level,Message,Buffer, Len) +#endif + + +int HCIEmulator::getLogLevel(){ + return hciloglevel; + +} +void HCIEmulator::setLogLevel(int level){ + hciloglevel=level; +} + +//modbus crc calculation borrowed from: +//https://github.com/yaacov/ArduinoModbusSlave +#define MODBUS_CRC_LENGTH 2 +#define readCRC(arr, length) word(arr[(length - MODBUS_CRC_LENGTH) + 1], arr[length - MODBUS_CRC_LENGTH]) +#define readUInt16(arr, index) word(arr[index], arr[index + 1]) +/** + * Calculate the CRC of the passed byte array from zero up to the passed length. + * + * @param buffer The byte array containing the data. + * @param length The length of the byte array. + * + * @return The calculated CRC as an unsigned 16 bit integer. + * + * Calculate and add the CRC. + * uint16_t crc = Modbus::calculateCRC(_responseBuffer, _responseBufferLength - MODBUS_CRC_LENGTH); + * _responseBuffer[_responseBufferLength - MODBUS_CRC_LENGTH] = crc & 0xFF; + * _responseBuffer[(_responseBufferLength - MODBUS_CRC_LENGTH) + 1] = crc >> 8; + * + * + * #define MODBUS_FRAME_SIZE 4 + * #define MODBUS_CRC_LENGTH 2 + * uint16_t crc = readCRC(_requestBuffer, _requestBufferLength); + * #define readUInt16(arr, index) word(arr[index], arr[index + 1]) + * #define readCRC(arr, length) word(arr[(length - MODBUS_CRC_LENGTH) + 1], arr[length - MODBUS_CRC_LENGTH]) + */ +uint16_t calculateCRC(uint8_t *buffer, int length) +{ + int i, j; + uint16_t crc = 0xFFFF; + uint16_t tmp; + + // Calculate the CRC. + for (i = 0; i < length; i++) + { + crc = crc ^ buffer[i]; + for (j = 0; j < 8; j++) + { + tmp = crc & 0x0001; + crc = crc >> 1; + if (tmp) + { + crc = crc ^ 0xA001; + } + } + } + return crc; +} + +HCIEmulator::HCIEmulator(Stream * port) { + m_state.valid = false; + m_statemachine=WAITING; + m_rxlen = m_txlen = 0; + m_recvTime=m_lastStateTime=0; + m_skipFrame=false; + m_port = port; + m_statusCallback = NULL; + setLogLevel(DEFAULTLOGLEVEL); +}; + +void HCIEmulator::poll(){ + + if(m_port==NULL) return; + + // receive Data + if(m_port->available() >0) + { + m_rxlen+= m_port->readBytes((char*)(m_rxbuffer+m_rxlen), _min((int)(255-m_rxlen),m_port->available())); + if(m_rxlen > 254) + { + Log(LL_ERROR,"RX Bufferoverflow, skip next Frame"); + Log3(LL_DEBUG,"Buffer Data: ", m_rxbuffer, m_rxlen); + m_rxlen=0; + m_skipFrame = true; + } + m_recvTime = micros(); + } + + + // check frame, process frame + if(m_rxlen>0 && (micros()-m_recvTime > T3_5)) + { + // check last action timeout -> reset > then 2sec + if(m_statemachine!= WAITING && m_lastStateTime+2000 0){ + + // fix crc + uint16_t crc = calculateCRC(m_txbuffer, m_txlen - MODBUS_CRC_LENGTH); + m_txbuffer[m_txlen - MODBUS_CRC_LENGTH] = crc & 0xFF; + m_txbuffer[(m_txlen - MODBUS_CRC_LENGTH) + 1] = crc >> 8; + + // send data + m_lastSendTime = micros()-m_recvTime; + + //Log(LL_DEBUG, ("ST:"+String(m_lastSendTime)).c_str()); + + m_port->write(m_txbuffer, m_txlen); + Log3(LL_DEBUG,"Response: ", m_txbuffer, m_txlen); + m_txlen = 0; + } + } + + m_skipFrame = false; + m_rxlen=0; + } +} + +void HCIEmulator::processFrame(){ + m_txlen = 0; // clear send buffer + + if(m_rxlen<5) { + Log(LL_ERROR,"Frame skipped, invalid frame len"); + Log3(LL_ERROR,"Data:", m_rxbuffer,m_rxlen); + return; + } + + // check device id, pass only device id 2 and 0 (broadcast) + if(m_rxbuffer[0] != BROADCASTID && m_rxbuffer[0] != DEVICEID){ + Log(LL_DEBUG,"Frame skipped, unsupported device id"); + Log3(LL_DEBUG,"Data:", m_rxbuffer,m_rxlen); + return; + } + + // check crc + uint16_t crc = readCRC(m_rxbuffer, m_rxlen); + if(crc != calculateCRC(m_rxbuffer,m_rxlen-MODBUS_CRC_LENGTH)){ + Log3(LL_ERROR,"Frame skipped, wrong crc", m_rxbuffer,m_rxlen); + return; + } + + Log3(LL_DEBUG,"Incomming Data: ", m_rxbuffer, m_rxlen); + + // dispatch modbus function + switch(m_rxbuffer[1]){ + case 0x10:{ // Write Multiple registers + if(m_rxlen == 0x1b && m_rxbuffer[0] == BROADCASTID) + { + processBroadcastStatusFrame(); + return; + } + break; + } + + case 0x17:{ // Read/Write Multiple registers + if(m_rxbuffer[0] == DEVICEID){ + switch(m_rxlen){ + case 0x11:{ + processDeviceStatusFrame(); + return; + } + + case 0x13: + processDeviceBusScanFrame(); + return;; + } + } + break; + } + } + Log3(LL_ERROR,"Frame skipped, unexpected data: ", m_rxbuffer, m_rxlen); +} + +const unsigned char ResponseTemplate_Fcn17_Cmd03_L08 []= {0x02,0x17,0x10,0x3E,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x1B}; +const unsigned char ResponseTemplate_Fcn17_Cmd04_L02 []= {0x02,0x17,0x04,0x0F,0x00,0x04,0xFD,0x0A,0x72}; +void HCIEmulator::processDeviceStatusFrame(){ + if(m_rxlen==0x11){ + unsigned char counter = m_rxbuffer[11]; + unsigned char cmd = m_rxbuffer[12]; + if(m_rxbuffer[5] == 0x08){ + // expose internal state + // 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 + //0011: 02 17 9C B9 00 08 9C 41 00 02 04 3E 03 00 00 EB CC + //res=> 02 17 10 3E 00 03 01 00 00 00 00 00 00 00 00 00 00 00 00 74 1B + memcpy_P(m_txbuffer, ResponseTemplate_Fcn17_Cmd03_L08, sizeof(ResponseTemplate_Fcn17_Cmd03_L08)); + m_txbuffer[0] = m_rxbuffer[0]; + m_txbuffer[3] = counter; + m_txbuffer[5] = cmd; + m_txlen = sizeof(ResponseTemplate_Fcn17_Cmd03_L08); + + + switch(m_statemachine) + { + // open Door + case STARTOPENDOOR: + m_txbuffer[7]= 0x02; + m_txbuffer[8]= 0x10; + m_statemachine = STARTOPENDOOR_RELEASE; + m_lastStateTime = millis(); + break; + case STARTOPENDOOR_RELEASE: + if(m_lastStateTime+SIMULATEKEYPRESSDELAYMS 02 17 04 0F 00 04 FD 0A 72 + memcpy_P(m_txbuffer, ResponseTemplate_Fcn17_Cmd04_L02, sizeof(ResponseTemplate_Fcn17_Cmd04_L02)); + m_txbuffer[0] = m_rxbuffer[0]; + m_txbuffer[3] = counter; + m_txbuffer[5] = cmd; + m_txlen = sizeof(ResponseTemplate_Fcn17_Cmd04_L02); + return; + } + } + + Log3(LL_ERROR,"Frame skipped, unexpected data: ", m_rxbuffer, m_rxlen); +} + +const unsigned char ResponseTemplate_Fcn17_Cmd02_L05 []= {0x02,0x17,0x0a,0x00,0x00,0x02,0x05,0x04,0x30,0x10,0xff,0xa8,0x45,0x0e,0xdf}; +void HCIEmulator::processDeviceBusScanFrame(){ + // 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 + //0013: 02 17 9C B9 00 05 9C 41 00 03 06 00 02 00 00 01 02 f8 35 + //res=> 02 17 0a 00 00 02 05 04 30 10 ff a8 45 0e df + unsigned char counter = m_rxbuffer[11]; + unsigned char cmd = m_rxbuffer[12]; + memcpy_P(m_txbuffer, ResponseTemplate_Fcn17_Cmd02_L05, sizeof(ResponseTemplate_Fcn17_Cmd02_L05)); + m_txbuffer[0] = m_rxbuffer[0]; + m_txbuffer[3] = counter; + m_txbuffer[5] = cmd; + m_txlen = sizeof(ResponseTemplate_Fcn17_Cmd02_L05); + + Log(LL_INFO,"Busscan received"); +} + +void HCIEmulator::processBroadcastStatusFrame(){ + //001B: 00 10 9D 31 00 09 12 64 00 00 00 40 60 00 00 00 00 00 00 00 00 00 01 00 00 CA 22 + bool hasChanged = false; + CHECKCHANGEDSET(m_state.lampOn,m_rxbuffer[20] == 0x14,hasChanged); + CHECKCHANGEDSET(m_state.doorCurrentPosition,m_rxbuffer[10],hasChanged); + CHECKCHANGEDSET(m_state.doorTargetPosition, m_rxbuffer[9],hasChanged); + CHECKCHANGEDSET(m_state.doorState, m_rxbuffer[11],hasChanged); + CHECKCHANGEDSET(m_state.reserved, m_rxbuffer[17],hasChanged); + CHECKCHANGEDSET(m_state.valid, true,hasChanged); + + if(hasChanged){ + Log3(LL_INFO,"New State: ",m_rxbuffer,m_rxlen); + if(m_statusCallback != NULL){ + m_statusCallback(m_state); + } + } +} + +void HCIEmulator::openDoor(){ + if(m_statemachine != WAITING){ + return; + } + m_lastStateTime = millis(); + m_statemachine = STARTOPENDOOR; +} + +void HCIEmulator::openDoorHalf(){ + if(m_statemachine != WAITING){ + return; + } + m_lastStateTime = millis(); + m_statemachine = STARTOPENDOORHALF; +} + +void HCIEmulator::closeDoor(){ + if(m_statemachine != WAITING){ + return; + } + m_lastStateTime = millis(); + m_statemachine = STARTCLOSEDOOR; +} + +void HCIEmulator::stopDoor(){ + if(m_statemachine != WAITING){ + return; + } + m_lastStateTime = millis(); + m_statemachine = STARTSTOPDOOR; +} + +void HCIEmulator::toggleLamp(){ + if(m_statemachine != WAITING){ + return; + } + m_lastStateTime = millis(); + m_statemachine = STARTTOGGLELAMP; +} + +void HCIEmulator::ventilationPosition(){ + if(m_statemachine != WAITING){ + return; + } + m_lastStateTime = millis(); + m_statemachine = STARTVENTPOSITION; +} + +void HCIEmulator::onStatusChanged(callback_function_t handler) { + m_statusCallback = handler; +} \ No newline at end of file diff --git a/HCPBridge/src/hciemulator.h b/HCPBridge/src/hciemulator.h new file mode 100644 index 0000000..f496025 --- /dev/null +++ b/HCPBridge/src/hciemulator.h @@ -0,0 +1,130 @@ +#ifndef __hciemulator_h +#define __hciemulator_h + +#include +#include "SoftwareSerial.h" + +#define LL_OFF 0 +#define LL_ERROR 1 +#define LL_WARN 2 +#define LL_INFO 3 +#define LL_DEBUG 4 + +#define DEFAULTLOGLEVEL LL_WARN + +#define DEVICEID 0x02 +#define BROADCASTID 0x00 +#define SIMULATEKEYPRESSDELAYMS 100 + + +// Modbus states that a baud rate higher than 19200 must use a fixed 750 us +// for inter character time out and 1.75 ms for a frame delay. +// For baud rates below 19200 the timeing is more critical and has to be calculated. +// E.g. 9600 baud in a 10 bit packet is 960 characters per second +// In milliseconds this will be 960characters per 1000ms. So for 1 character +// 1000ms/960characters is 1.04167ms per character and finaly modbus states an +// intercharacter must be 1.5T or 1.5 times longer than a normal character and thus +// 1.5T = 1.04167ms * 1.5 = 1.5625ms. A frame delay is 3.5T. +#define T1_5 750 +#define T3_5 4800 //1750 + + +enum DoorState : uint8_t { + DOOR_OPEN_POSITION = 0x20, + DOOR_CLOSE_POSITION = 0x40, + DOOR_HALF_POSITION = 0x80, + DOOR_MOVE_CLOSEPOSITION = 0x02, + DOOR_MOVE_OPENPOSITION = 0x01, + +}; + +struct SHCIState{ + bool valid; + bool lampOn; + uint8_t doorState; // see DoorState + uint8_t doorCurrentPosition; + uint8_t doorTargetPosition; + uint8_t reserved; +}; + +enum StateMachine: uint8_t{ + WAITING, + + STARTOPENDOOR, + STARTOPENDOOR_RELEASE, + + STARTOPENDOORHALF, + STARTOPENDOORHALF_RELEASE, + + STARTCLOSEDOOR, + STARTCLOSEDOOR_RELEASE, + + STARTSTOPDOOR, + STARTSTOPDOOR_RELEASE, + + STARTTOGGLELAMP, + STARTTOGGLELAMP_RELEASE, + + STARTVENTPOSITION, + STARTVENTPOSITION_RELEASE +}; + +class HCIEmulator { +public: + typedef std::function callback_function_t; + + HCIEmulator(Stream * port); + + void poll(); + + void openDoor(); + void openDoorHalf(); + void closeDoor(); + void stopDoor(); + void toggleLamp(); + void ventilationPosition(); + + const SHCIState& getState() { + if(micros()-m_recvTime > 2000000){ + // 2 sec without statusmessage + m_state.valid = false; + } + return m_state; + }; + + unsigned long getMessageAge(){ + return micros()-m_recvTime; + } + + int getLogLevel(); + void setLogLevel(int level); + + void onStatusChanged(callback_function_t handler); + +protected: + void processFrame(); + void processDeviceStatusFrame(); + void processDeviceBusScanFrame(); + void processBroadcastStatusFrame(); + +private: + callback_function_t m_statusCallback; + Stream *m_port; + SHCIState m_state; + StateMachine m_statemachine; + + unsigned long m_recvTime; + unsigned long m_lastStateTime; + unsigned long m_lastSendTime; + + size_t m_rxlen; + size_t m_txlen; + + unsigned char m_rxbuffer[255]; + unsigned char m_txbuffer[255]; + + bool m_skipFrame; +}; + + +#endif \ No newline at end of file diff --git a/HCPBridge/src/index_html.h b/HCPBridge/src/index_html.h new file mode 100644 index 0000000..4d8feaa --- /dev/null +++ b/HCPBridge/src/index_html.h @@ -0,0 +1 @@ +const uint8_t index_html[] PROGMEM = {0x78,0xDA,0xA5,0x57,0x6D,0x6F,0xE3,0x36,0x12,0xFE,0xBC,0xFE,0x15,0x5C,0x15,0x08,0xA4,0x8D,0xED,0x48,0xB2,0xB3,0xEB,0x4A,0x96,0x8B,0xED,0x66,0xAF,0xED,0x61,0x7B,0x2D,0x9A,0x5C,0xD1,0x17,0xEC,0x07,0x9A,0x1A,0xD9,0x44,0xA8,0x97,0xA3,0xA8,0xD8,0xAE,0xE1,0x4F,0xF7,0x9F,0x0E,0xF7,0xF9,0x0E,0xF7,0xBF,0x6E,0x48,0xCA,0xB6,0x9C,0x38,0xDB,0x02,0x0D,0xAC,0x88,0xE4,0xCC,0x3C,0xF3,0xC2,0x99,0x21,0x35,0x7D,0x79,0xF3,0xDD,0xBB,0xBB,0x9F,0xBF,0x7F,0x4F,0xBE,0xBE,0xFB,0xF6,0xC3,0x6C,0xBA,0x54,0xB9,0xC0,0xFF,0x40,0xD3,0xD9,0x54,0x71,0x25,0x60,0xF6,0x15,0x95,0x74,0x01,0x85,0x2A,0x25,0xB9,0x55,0xD0,0x80,0x6C,0x8A,0xC5,0xF4,0xCA,0xD2,0xA6,0x39,0x28,0x4A,0x0A,0x9A,0x43,0xF2,0xC0,0x61,0x55,0x95,0x52,0x11,0x56,0x16,0x0A,0xD9,0x13,0x67,0xC5,0x53,0xB5,0x4C,0x52,0x78,0xE0,0x0C,0x06,0x66,0xD2,0x27,0xBC,0xE0,0x8A,0x53,0x31,0xA8,0x19,0x15,0x90,0x04,0x4E,0x8B,0xC0,0x96,0x54,0xD6,0xA0,0x92,0xBF,0xDF,0xFD,0x65,0x30,0x99,0x4D,0x05,0x2F,0xEE,0x89,0x04,0x91,0x70,0x04,0x23,0x4B,0x09,0x59,0x92,0x52,0x45,0xA3,0xFE,0x6C,0x5A,0xAB,0x0D,0xEA,0xED,0x11,0xFC,0xD3,0xA6,0x92,0x6D,0x86,0xEA,0x06,0x19,0xCD,0xB9,0xD8,0x44,0xE4,0xAD,0x44,0xF0,0x98,0xA4,0xBC,0xAE,0x04,0xC5,0x39,0x2F,0x10,0x0A,0x06,0x73,0x51,0xB2,0xFB,0x98,0x28,0x58,0xAB,0x01,0x15,0x7C,0x51,0x44,0x84,0xA1,0x89,0x20,0xE3,0x9D,0x45,0x0A,0x5B,0x9C,0x9A,0xFF,0x06,0x11,0x19,0x0D,0x7D,0x09,0x79,0x4B,0xAB,0x9E,0x27,0xCD,0xCB,0x74,0x43,0xB6,0x39,0x5D,0x5B,0xEF,0x22,0xF2,0xDA,0xF7,0xAB,0x75,0x4C,0x72,0x2A,0x17,0xBC,0x88,0x70,0x4C,0x68,0xA3,0xCA,0x98,0x54,0x34,0x4D,0x79,0xB1,0x18,0xCC,0x4B,0xA5,0xCA,0x3C,0x22,0xE1,0x35,0xB2,0x59,0x8C,0x61,0xBD,0xE2,0x8A,0x2D,0xC9,0xB6,0x2A,0x6B,0x0C,0x4D,0x89,0xA6,0xA1,0xE3,0x54,0xF1,0x07,0x78,0xD6,0x8F,0x56,0xDB,0xC4,0x28,0x5B,0x02,0x5F,0x2C,0x55,0x44,0xC6,0x93,0x6A,0xBD,0x23,0x27,0x98,0xBC,0xA8,0x1A,0x45,0xB6,0x07,0x94,0xA2,0x2C,0x60,0xAF,0x55,0xF0,0x14,0x64,0x57,0x2B,0x9D,0xD7,0xA5,0x68,0x14,0x6A,0x55,0x65,0x15,0x11,0x3F,0x26,0x02,0x32,0x65,0x06,0xD2,0x6A,0xC0,0xD1,0xDE,0x01,0x3D,0xA4,0xEC,0x7E,0x21,0xCB,0xA6,0x48,0x07,0xAC,0x14,0xA5,0x8C,0xC8,0x67,0x8C,0x31,0xCD,0x22,0x11,0x79,0x20,0x69,0xCA,0x9B,0x1A,0x43,0x82,0x56,0x75,0x55,0x46,0x73,0xC8,0x4A,0x09,0xE7,0x35,0xB7,0xA9,0x13,0x11,0xC7,0x39,0x3A,0x36,0x0A,0xB5,0x9B,0xAD,0xCF,0x76,0x62,0x2D,0x9B,0xE8,0xE1,0xDE,0x22,0x3B,0x79,0x6A,0x53,0x96,0x65,0x31,0x19,0xAC,0x60,0x7E,0xCF,0xD5,0x40,0x49,0x5A,0xEC,0xB5,0x0E,0xC7,0x35,0xBA,0xFA,0x78,0xE1,0x91,0xF5,0xA3,0xBD,0xF5,0x26,0x94,0x11,0x5B,0x02,0xBB,0x87,0xF4,0xF2,0x10,0xBE,0x33,0x0A,0xE7,0x23,0x1F,0xFF,0x3E,0x21,0x75,0x88,0xC0,0x89,0x55,0xB8,0x84,0x5E,0x98,0x21,0xEE,0x3E,0xFC,0xE4,0x6A,0x4F,0x3D,0x34,0x3D,0xAF,0x3F,0xCD,0xF0,0x09,0xE2,0xAE,0xF7,0xA2,0xF7,0x62,0x38,0x6F,0x30,0x42,0x05,0xD9,0xF6,0x5E,0xBC,0xB0,0xDE,0x61,0xAE,0x60,0xB0,0x0E,0xD3,0x81,0x29,0xA9,0x88,0xE0,0x26,0xF0,0x54,0x2F,0xB7,0x9E,0xCC,0x05,0x3A,0xA7,0xE7,0x6D,0xE8,0x03,0x93,0xDC,0x38,0xDF,0x6F,0xCC,0x61,0xE1,0x4C,0x5D,0xE1,0xEA,0xA3,0xE4,0x3D,0x30,0xA6,0xC0,0x4A,0x49,0x6D,0xCC,0x75,0x46,0x9E,0xE1,0x6D,0x13,0x1D,0x09,0xA6,0xF4,0x56,0xAD,0xC2,0x79,0x29,0xD2,0xC3,0xA2,0xAD,0xC7,0xB0,0x35,0xA1,0x2D,0x39,0xED,0x19,0x09,0xED,0x12,0x6B,0x64,0xAD,0xFD,0xA8,0x4A,0xBE,0x37,0xE9,0xD1,0xEE,0x5E,0x5B,0xE1,0xDD,0x21,0x48,0x12,0x52,0xDC,0x53,0xCB,0xB4,0xDF,0xCF,0xF7,0x37,0xD7,0x9F,0xBF,0x0E,0xE2,0x23,0xD3,0x06,0x84,0x28,0x57,0x4F,0xF8,0x32,0xC6,0xA8,0xEF,0x77,0xF8,0x16,0x12,0xA0,0x78,0xC2,0x36,0x9E,0xCC,0xD3,0x09,0xC2,0x11,0x5D,0xAA,0xD3,0x2B,0xDB,0xCE,0xA6,0x57,0xB6,0xE1,0xEA,0x86,0x82,0xCD,0x37,0xEC,0xF4,0x5C,0x24,0x85,0xB3,0x29,0xA3,0xC5,0x03,0xAD,0x6D,0x11,0x24,0xA1,0xB6,0xBB,0x2D,0x8F,0x76,0xC2,0xD3,0x24,0x65,0x08,0x63,0xF9,0x10,0x62,0xA4,0x97,0x6A,0x45,0x55,0x53,0xCF,0x56,0x54,0x2A,0xC0,0x4E,0x94,0x91,0x1F,0x41,0xCE,0x79,0x91,0x62,0x03,0x1F,0x22,0xEE,0x08,0xF9,0x24,0x2A,0xB5,0xF9,0xC1,0x04,0xAD,0xEB,0xC4,0x69,0x67,0x87,0x78,0x38,0xA4,0x2C,0x98,0xE0,0xEC,0x3E,0x49,0xCB,0x77,0x65,0x9E,0xD3,0x22,0x75,0x03,0x6F,0xF6,0xB6,0xC9,0xA6,0x57,0x96,0xE9,0x93,0x08,0x36,0x58,0xE7,0x40,0x42,0x6F,0x76,0x8B,0x9D,0xE6,0x0F,0xA1,0x98,0x50,0x9E,0x03,0xF1,0xBD,0xD9,0x2F,0xCD,0x11,0x42,0xBB,0xB3,0x1C,0xCF,0x3E,0x70,0xB6,0x54,0xE8,0xE0,0x18,0x4F,0x12,0x3A,0x07,0xD1,0x62,0xDA,0xAE,0x38,0x9B,0xDA,0xB6,0xA8,0x36,0x15,0x24,0xA6,0x34,0xE7,0xE5,0x5A,0x43,0x2F,0x69,0xB1,0x80,0x0E,0xF6,0xB5,0xA7,0x63,0x28,0x74,0x94,0xF1,0xD8,0xA9,0xE8,0xDE,0x34,0x5B,0xC5,0x18,0x6C,0xBD,0x86,0x2F,0xA3,0xC2,0xEA,0xAE,0x99,0xE4,0x95,0x9A,0xA5,0x65,0x29,0xB1,0xBD,0x25,0x81,0x1F,0xA7,0x5C,0x26,0x83,0x20,0xE6,0x35,0xB6,0xB6,0x02,0x98,0x82,0x34,0xC9,0xA8,0xA8,0x21,0x7E,0xA0,0x92,0xD0,0x82,0xE7,0xA6,0x10,0xE2,0xAC,0x29,0x98,0x1E,0x10,0xDC,0x32,0xA9,0x6E,0x50,0xFE,0xED,0x9E,0xE6,0x7A,0x5B,0x9E,0xB9,0x2F,0x0F,0xBC,0xDE,0xF6,0x30,0x4C,0xF0,0xC8,0xFC,0x46,0xE7,0xF6,0x03,0x15,0xEE,0x8D,0xA4,0xAB,0x7E,0xE8,0xFB,0x5E,0xBC,0xDB,0xF5,0x3A,0x78,0x65,0x75,0x06,0xAE,0x83,0xC6,0x04,0x50,0x79,0x40,0x39,0x12,0x30,0x93,0x8F,0x8A,0x8A,0x46,0x88,0xB8,0x03,0xAB,0x95,0x21,0x92,0x76,0xA2,0x7E,0x58,0x60,0xD0,0x58,0x93,0x63,0xBA,0x0E,0x17,0xA0,0xDE,0x0B,0xD0,0xC3,0x2F,0x37,0xDF,0xA4,0xAE,0x83,0x44,0xC7,0x33,0xBE,0xA6,0xEC,0x79,0xAE,0x94,0xB5,0x4C,0x4C,0xAD,0x31,0x8F,0x35,0xFD,0x9D,0x3E,0x09,0xD6,0xCA,0x75,0xC2,0x14,0x69,0xED,0x4D,0x82,0x0D,0xCD,0x20,0x6E,0x53,0x1F,0xE7,0x76,0x14,0xA3,0xDC,0xD0,0xF8,0xF1,0x03,0x86,0xD8,0xF5,0xFB,0x7E,0xDF,0x5E,0x37,0x2C,0xD9,0x8B,0xD7,0x34,0xF9,0x35,0x98,0xF4,0xF5,0xCF,0xEF,0x8F,0xFA,0xC1,0x9B,0x71,0x7F,0x34,0x7E,0x83,0x0F,0xCE,0x46,0xA1,0x79,0xC2,0xCF,0xDF,0x98,0xE7,0x3A,0xD4,0xBF,0x60,0xF2,0x31,0xDE,0xA0,0xD0,0x28,0x7C,0xD3,0x0F,0x82,0x31,0x3E,0xF8,0xF6,0xFD,0x7E,0x18,0x9A,0x97,0x99,0xE2,0xB2,0x26,0x5B,0x96,0xD0,0x3C,0xED,0xFC,0xA3,0x31,0x28,0xE3,0x42,0xDC,0xEA,0xF2,0xC6,0x64,0xD6,0xAD,0xD4,0x31,0xAB,0x73,0xC0,0x3E,0xF5,0x3D,0x55,0x4B,0xD7,0x8B,0xB1,0x6B,0xBB,0x3C,0xF1,0x63,0x3E,0x5D,0xD3,0xA1,0x80,0x62,0x81,0xBE,0xF1,0xCB,0x4B,0xB3,0x43,0x3C,0x49,0x7C,0xDC,0x1C,0x94,0xC8,0xCB,0x07,0xB8,0x2B,0x5D,0x77,0x4D,0x7F,0xE5,0x1F,0xAF,0x46,0xD7,0xBE,0xF7,0xCA,0x7A,0xE7,0x6E,0x1E,0xAD,0xE0,0x9E,0x01,0xE6,0x96,0x91,0xD2,0x6D,0xF4,0x0F,0x4B,0xED,0x7A,0x7B,0x83,0x4F,0xAC,0x6A,0xF3,0xD8,0xDA,0xB4,0xE7,0x30,0x21,0x76,0x5F,0x87,0x27,0x98,0x6E,0x10,0xFA,0x97,0x61,0xF0,0x8A,0x7B,0x27,0xCB,0x61,0x78,0x7D,0x32,0x0F,0x26,0xA7,0x7A,0x7B,0xAD,0x86,0xCB,0x04,0xEB,0x24,0x46,0xAF,0xF1,0x35,0xF5,0x2F,0x2E,0xDA,0xE5,0xA9,0x0E,0x81,0xAE,0x20,0x7C,0x5E,0x0D,0x74,0x0F,0xB6,0x2C,0xB3,0x23,0xCB,0x0C,0x8B,0xEC,0x94,0xA7,0x93,0xA5,0xC7,0x5A,0xA6,0xCC,0x26,0xBB,0xAE,0xA4,0x4E,0x2D,0x7A,0x5B,0x09,0xAA,0x91,0x05,0x22,0xEB,0xF4,0x5B,0x2F,0x65,0x52,0xC0,0x8A,0xFC,0xF4,0xED,0x87,0xAF,0x95,0xAA,0x7E,0x80,0x7F,0x34,0x50,0x2B,0x0C,0x09,0x12,0x86,0x65,0x05,0x85,0xEB,0x7C,0xF5,0xFE,0xCE,0xE9,0x3B,0x57,0xCC,0xE2,0x7E,0x61,0x71,0x13,0xE7,0xD2,0x0E,0xFA,0x4A,0x36,0x60,0xD9,0x6B,0x40,0xB5,0x5E,0xB7,0x66,0xB0,0x58,0x75,0x25,0xDE,0x62,0x53,0x06,0x57,0xB7,0x66,0xF0,0xB6,0x67,0xCA,0x53,0x87,0xC1,0x50,0x4D,0x02,0x3C,0x69,0x25,0xBB,0x0E,0x3D,0x38,0xD2,0x2D,0xF9,0x84,0x1A,0x1E,0xA9,0xD7,0x7B,0xAA,0xAD,0xDB,0x0E,0xD3,0xC8,0x3B,0xD7,0x71,0xBA,0x66,0x63,0x31,0xDE,0x9A,0x73,0xE4,0x4E,0xD7,0x23,0x37,0x31,0xAB,0x1B,0x81,0xF7,0xFB,0x1B,0x3C,0x91,0xEE,0xF0,0xAB,0xC0,0xE9,0xD9,0xCE,0xAA,0x89,0xBD,0x2D,0xA3,0x35,0x10,0x7F,0x1D,0xFA,0xD1,0x89,0xC3,0x81,0x17,0xDB,0x58,0x13,0x2B,0x7E,0xE9,0xF0,0x5A,0x21,0xF8,0x7F,0xFF,0xF9,0x9F,0x7F,0x65,0x59,0x01,0x6A,0x88,0xF5,0x61,0x45,0xC7,0x8F,0x44,0xFD,0x67,0x44,0x6B,0xB6,0x14,0x65,0x8D,0x81,0x3E,0x8A,0x4E,0x1E,0x89,0x86,0x67,0x45,0x15,0x70,0x71,0x56,0xB3,0xFF,0x27,0xC5,0xC3,0x53,0xF1,0xD1,0x13,0x71,0x6D,0x32,0x47,0xD1,0xFF,0xFD,0xBB,0x2B,0x16,0xFC,0x9E,0xD8,0x63,0x5D,0x83,0xE0,0x99,0x08,0x39,0xF7,0x80,0x75,0xDF,0x39,0xE7,0xC9,0x6F,0x4D,0xAE,0x37,0x09,0x05,0x53,0xC8,0x28,0xA2,0x45,0x2D,0x67,0x53,0xCC,0xE1,0x9E,0xEA,0xBE,0x4F,0xEC,0xFE,0xE2,0xAD,0xFB,0x12,0x2F,0x80,0xDD,0x02,0x6A,0x2A,0xFC,0xEC,0x82,0x1B,0xFC,0xF4,0x6A,0x9B,0xFD,0x3A,0x17,0x4B,0xAC,0x8C,0x67,0xAA,0xC4,0x12,0x87,0xFA,0xDE,0x40,0xD3,0x8D,0xC9,0xB0,0xF6,0x54,0xDD,0x23,0xDA,0xD3,0x47,0x2D,0x79,0x3D,0x34,0x3C,0xB7,0x36,0x0B,0xC7,0x17,0x17,0x66,0xCD,0x5E,0x58,0x30,0x75,0xF1,0x18,0xB3,0x87,0x8B,0x5D,0xF8,0xEB,0xED,0x77,0x7F,0x1B,0x56,0xFA,0x13,0x71,0x2F,0x5B,0x57,0x65,0x51,0x83,0x4E,0x49,0xEF,0xE4,0x70,0xB5,0x02,0x43,0x3C,0xCA,0xD0,0x95,0xE7,0x8F,0x25,0xC3,0xE5,0x78,0x43,0x8E,0x72,0x52,0x7F,0xF8,0x26,0xA7,0x69,0xDE,0x85,0xF9,0xA2,0x9D,0xE8,0x62,0x32,0x3E,0x45,0x03,0x4C,0xE6,0x67,0xB1,0xCD,0x85,0x01,0xA1,0xDB,0x5B,0xFF,0xDE,0x22,0x41,0xF3,0xEA,0xE2,0xC4,0xBA,0x43,0xEB,0x79,0x7A,0x39,0xD8,0x1D,0x63,0xD9,0xED,0x3A,0xAD,0xD9,0xFB,0x2E,0xD3,0xB2,0x1C,0x3A,0x4D,0x5B,0xDC,0xDD,0x4D,0x8B,0xBB,0x37,0x84,0x23,0xA1,0xAF,0xBF,0x51,0xBC,0x18,0xAF,0x30,0xF6,0xC2,0x82,0x37,0x28,0x73,0xF3,0xBC,0x32,0x5F,0xFF,0xFF,0x07,0x0E,0x2F,0x8B,0x65}; \ No newline at end of file diff --git a/HCPBridge/src/main.cpp b/HCPBridge/src/main.cpp new file mode 100644 index 0000000..39055ed --- /dev/null +++ b/HCPBridge/src/main.cpp @@ -0,0 +1,163 @@ +#include +#include +#include "AsyncJson.h" +#include "ArduinoJson.h" +#include "hciemulator.h" +#include "index_html.h" + +/* create this file and add your wlan credentials + const char* ssid = "MyWLANSID"; + const char* password = "MYPASSWORD"; +*/ +#include "../../../private/credentials.h" + + +// switch relay sync to the lamp +// e.g. the Wifi Relay Board U4648 +#define USERELAY + +// use alternative uart pins +//#define SWAPUART + +#define RS485 Serial + +// Relay Board parameters +#define ESP8266_GPIO2 2 // Blue LED. +#define ESP8266_GPIO4 4 // Relay control. +#define ESP8266_GPIO5 5 // Optocoupler input. +#define LED_PIN ESP8266_GPIO2 + + +// Hörmann HCP2 based on modbus rtu @57.6kB 8E1 +HCIEmulator emulator(&RS485); + +// webserver on port 80 +AsyncWebServer server(80); + + +// switch GPIO4 und GPIO2 sync to the lamp +void onStatusChanged(const SHCIState& state){ + //see https://ucexperiment.wordpress.com/2016/12/18/yunshan-esp8266-250v-15a-acdc-network-wifi-relay-module/ + //Setting GPIO4 high, causes the relay to close the NO contact with + if(state.valid){ + digitalWrite( ESP8266_GPIO4, state.lampOn ); + digitalWrite(LED_PIN, state.lampOn); + }else + { + digitalWrite( ESP8266_GPIO4, false ); + digitalWrite(LED_PIN, false); + } +} + +// toggle lamp to expected state +void switchLamp(bool on){ + bool toggle = (on && !emulator.getState().lampOn) || (!on && emulator.getState().lampOn); + if(toggle){ + emulator.toggleLamp(); + } +} + +// setup mcu +void setup(){ + + //setup modbus + RS485.begin(57600,SERIAL_8E1); + #ifdef SWAPUART + RS485.swap(); + #endif + + //setup wifi + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + WiFi.setAutoReconnect(true); + while (WiFi.status() != WL_CONNECTED) { + emulator.poll(); + } + + // setup http server + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ + AsyncWebServerResponse *response = request->beginResponse_P( 200, "text/html", index_html,sizeof(index_html)); + response->addHeader("Content-Encoding","deflate"); + request->send(response); + }); + + server.on("/status", HTTP_GET, [](AsyncWebServerRequest *request){ + const SHCIState& doorstate = emulator.getState(); + AsyncResponseStream *response = request->beginResponseStream("application/json"); + DynamicJsonDocument root(1024); + root["valid"] = doorstate.valid; + root["doorstate"] = doorstate.doorState; + root["doorposition"] = doorstate.doorCurrentPosition; + root["doortarget"] = doorstate.doorTargetPosition; + root["lamp"] = doorstate.lampOn; + root["debug"] = doorstate.reserved; + root["lastresponse"] = emulator.getMessageAge()/1000; + serializeJson(root,*response); + request->send(response); + }); + + server.on("/command", HTTP_GET, [] (AsyncWebServerRequest *request) { + if (request->hasParam("action")) { + int actionid = request->getParam("action")->value().toInt(); + switch (actionid){ + case 0: + emulator.closeDoor(); + break; + case 1: + emulator.openDoor(); + break; + case 2: + emulator.stopDoor(); + break; + case 3: + emulator.ventilationPosition(); + break; + case 4: + emulator.openDoorHalf(); + break; + case 5: + emulator.toggleLamp(); + break; + default: + break; + } + } + request->send(200, "text/plain", "OK"); + }); + + server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) { + if (request->hasParam("channel") && request->hasParam("state")) { + String channel = request->getParam("channel")->value(); + String state = request->getParam("state")->value(); + if(channel.equals("door")){ + if(state=="1"){ + emulator.openDoor(); + }else{ + emulator.closeDoor(); + } + } + if(channel.equals("light")){ + switchLamp(state=="1"); + } + } + request->send(200, "text/plain", "OK"); + }); + + server.begin(); + + //setup relay board +#ifdef USERELAY + pinMode( ESP8266_GPIO4, OUTPUT ); // Relay control pin. + pinMode( ESP8266_GPIO5, INPUT_PULLUP ); // Input pin. + pinMode( LED_PIN, OUTPUT ); // ESP8266 module blue L + digitalWrite( ESP8266_GPIO4, 0 ); + digitalWrite(LED_PIN,0); + emulator.onStatusChanged(onStatusChanged); +#endif + +} + +// mainloop +void loop(){ + emulator.poll(); +} \ No newline at end of file diff --git a/HCPBridge/src/webpage/buildindex.cmd b/HCPBridge/src/webpage/buildindex.cmd new file mode 100644 index 0000000..6ed0ebd --- /dev/null +++ b/HCPBridge/src/webpage/buildindex.cmd @@ -0,0 +1 @@ +python compress.py diff --git a/HCPBridge/src/webpage/command b/HCPBridge/src/webpage/command new file mode 100644 index 0000000..e69de29 diff --git a/HCPBridge/src/webpage/compress.py b/HCPBridge/src/webpage/compress.py new file mode 100644 index 0000000..4ef9f95 --- /dev/null +++ b/HCPBridge/src/webpage/compress.py @@ -0,0 +1,42 @@ +#pip install htmlmin +#or python -m pip install htmlmin +#pip install jsmin +#or python -m pip install jsmin + +import gzip +import zlib +import htmlmin +from jsmin import jsmin + + + +content = "" +with open('index.html','rt') as f: + content=f.read() + + +content = htmlmin.minify(content, remove_comments=True, remove_empty_space=True, remove_all_empty_space=True, reduce_empty_attributes=True, reduce_boolean_attributes=False, remove_optional_attribute_quotes=True, convert_charrefs=True, keep_pre=False) + + +import re +regex = r"" ,content, 0, re.DOTALL) + + +#with gzip.open('htmltest.html.gz', 'wb') as f: +# f.write(content.encode("UTF-8")) + +#with open('htmltest.html.z','wb') as f: +# f.write(zlib.compress(content.encode("UTF-8"),9)) + +result ="" +for c in zlib.compress(content.encode("UTF-8"),9): + result= result + ("0x%02X" %c) + if len(result)> 0: + result=result + "," + + +with open('../index_html.h',"wt") as f: + f.write("const uint8_t index_html[] PROGMEM = {"); + f.write(result.strip(",")) + f.write("};"); \ No newline at end of file diff --git a/HCPBridge/src/webpage/index.html b/HCPBridge/src/webpage/index.html new file mode 100644 index 0000000..303cbef --- /dev/null +++ b/HCPBridge/src/webpage/index.html @@ -0,0 +1,159 @@ + + + Garagentor Steuerung + + + + + + +

Garagentor

+ +

warte auf Verbindung.

+ +
+ +
+

Licht

+
+ + + + \ No newline at end of file diff --git a/HCPBridge/src/webpage/runtestserver.cmd b/HCPBridge/src/webpage/runtestserver.cmd new file mode 100644 index 0000000..092262b --- /dev/null +++ b/HCPBridge/src/webpage/runtestserver.cmd @@ -0,0 +1 @@ +python -m http.server diff --git a/HCPBridge/src/webpage/status b/HCPBridge/src/webpage/status new file mode 100644 index 0000000..c050664 --- /dev/null +++ b/HCPBridge/src/webpage/status @@ -0,0 +1,9 @@ +{ + "valid" : true, + "doorstate" : 1, + "doorposition" : 0, + "doortarget" : 0, + "lamp" : true, + "debug" : 0, + "lastresponse" : 0 +} \ No newline at end of file diff --git a/HCPBridge/test/README b/HCPBridge/test/README new file mode 100644 index 0000000..b94d089 --- /dev/null +++ b/HCPBridge/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/Investigation/ProtocolAnalyse.txt b/Investigation/ProtocolAnalyse.txt new file mode 100644 index 0000000..8ff7a0b --- /dev/null +++ b/Investigation/ProtocolAnalyse.txt @@ -0,0 +1,71 @@ +0011: 02 17 9C B9 00 08 9C 41 00 02 04 3E 03 00 00 EB CC (Lese 9CB9:08), (Sende) (zähler)3E (cmd)03 (Data) 0000 +0015: 02 17 10 3E 00 03 01 00 00 00 00 00 00 00 00 00 00 00 00 74 1B Default response +----------- + 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 +0015: 02 17 10 70 00 03 01 02 10 00 00 00 00 00 00 00 00 00 00 6C 88 <- Tor auf pressed +0015: 02 17 10 78 00 03 01 01 10 00 00 00 00 00 00 00 00 00 00 6F 4A <- Tor auf released +ORG: 00 00 +0015: 02 17 10 6C 00 03 01 02 20 00 00 00 00 00 00 00 00 00 00 9B 41 <- Tor zu pressed +0015: 02 17 10 78 00 03 01 01 20 00 00 00 00 00 00 00 00 00 00 90 4A <- Tor zu released +ORG: 00 00 +0015: 02 17 10 02 00 03 01 02 40 00 00 00 00 00 00 00 00 00 00 C9 0C <- Stop pressed +0015: 02 17 10 05 00 03 01 01 40 00 00 00 00 00 00 00 00 00 00 8F 3A <- Stop released +ORG 00 00 +0015: 02 17 10 48 00 03 01 02 00 40 00 00 00 00 00 00 00 00 00 29 4E <- Lüftunsschalter pressed +0015: 02 17 10 4C 00 03 01 01 00 40 00 00 00 00 00 00 00 00 00 2F 89 <- Lüftunsschalter released +ORG: 00 00 +0015: 02 17 10 44 00 03 01 02 00 04 00 00 00 00 00 00 00 00 00 6F 4A <- 1/2 pressed +0015: 02 17 10 53 00 03 01 01 00 04 00 00 00 00 00 00 00 00 00 24 B0 <- 1/2 released +ORG 00 00 +0015: 02 17 10 0A 00 03 01 10 00 02 00 00 00 00 00 00 00 00 00 02 F9 <- Lichtschalter pressed +0015: 02 17 10 0D 00 03 01 08 00 02 00 00 00 00 00 00 00 00 00 60 EB <- Lichtschalter released +ORG: 00 00 +----------- +0011: 02 17 9C B9 00 02 9C 41 00 02 04 0F04 1700 7B 21 <- 0F zähler, 04 cmd? data: 1700 (licht an) oder 1701 (licht aus) +0009: 02 17 04 0F00 04FD 0A 72 <- 0F00 zähler, 04FD 04 cmd, FD result? + + +################################################################################### +# Broadcast Message +################################################################################### +001B: 00 10 9D 31 00 09 12 65 00 00 00 40 60 00 00 00 00 00 00 00 10 00 01 00 00 5A 1D <- Licht startet +001B: 00 10 9D 31 00 09 12 66 00 00 00 40 60 00 00 00 00 00 00 00 14 00 01 00 00 5B 99 <- Licht an +001B: 00 10 9D 31 00 09 12 3A 00 00 00 40 60 00 00 00 00 00 00 00 04 00 01 00 00 48 18 <- Licht geht aus +001B: 00 10 9D 31 00 09 12 3D 00 00 00 40 60 00 00 00 00 00 00 00 00 00 01 00 00 08 AD <- Licht ist aus + 00 +------------------ + +AA: Zielwert? +BB: Istwert +CC: 0x40 Tor zu, 0x01 Tor öffnet, 0x20 Tor komplett auf, 0x02 Tor schließt, 0x05 1/2 öffnen, 0x80 Teilgeöffnet, 0x00 gestoppt + 0x42(66) kurz beim schließen + + +DD: ? Geschwindigkeit / Kraft? + + AA BB CC DD + 00 01 02 03 04 05 06 07 08 09 00 01 02 03 04 05 06 07 08 09 00 01 02 03 04 05 06 +001B: 00 10 9D 31 00 09 12 53 00 00 00 40 60 00 00 00 00 00 00 00 14 00 01 00 00 44 5B <- Tor zu +001B: 00 10 9D 31 00 09 12 55 00 C8 00 01 60 00 00 00 00 00 00 00 14 00 01 00 00 B2 05 <- Tor öffnet komplett +001B: 00 10 9D 31 00 09 12 5B 00 C8 04 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 55 61 +001B: 00 10 9D 31 00 09 12 5D 00 C8 04 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 B5 E8 +001B: 00 10 9D 31 00 09 12 60 00 C8 06 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 AA 49 +001B: 00 10 9D 31 00 09 12 63 00 C8 08 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 D4 09 +001B: 00 10 9D 31 00 09 12 65 00 C8 0A 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 B6 81 +001B: 00 10 9D 31 00 09 12 67 00 C8 0C 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 91 3B +001B: 00 10 9D 31 00 09 12 68 00 C8 0E 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 20 2D +001B: 00 10 9D 31 00 09 12 6A 00 C8 10 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 1F 9D +001B: 00 10 9D 31 00 09 12 6C 00 C8 12 01 60 00 00 00 00 0E 00 00 14 00 01 00 00 7D 15 +.. +001B: 00 10 9D 31 00 09 12 2F 00 C8 C6 01 60 00 00 00 00 02 00 00 14 00 01 00 00 4C 8F +001B: 00 10 9D 31 00 09 12 30 00 C8 C8 20 60 00 00 00 00 00 00 00 14 00 01 00 00 55 A1 <- Tor komplett auf +.. +001B: 00 10 9D 31 00 09 12 11 00 00 38 02 60 00 00 00 00 09 00 00 14 00 01 00 00 4A 0D <- Tor schließt +001B: 00 10 9D 31 00 09 12 4F 00 00 16 02 60 00 00 00 00 06 00 00 14 00 01 00 00 D7 AB +001B: 00 10 9D 31 00 09 12 53 00 00 14 02 60 00 00 00 00 06 00 00 14 00 01 00 00 92 3C +001B: 00 10 9D 31 00 09 12 0A 00 00 00 02 60 00 00 00 00 03 00 00 14 00 01 00 00 84 83 +001B: 00 10 9D 31 00 09 12 0B 00 00 00 40 60 00 00 00 00 00 00 00 14 00 01 00 00 D7 28 <- Tor komplett zu + + +001B: 00 10 9D 31 00 09 12 30 00 C8 00 05 60 00 00 00 00 00 00 00 14 00 01 00 00 B9 12 <- 1/2 Öffnung +001B: 00 10 9D 31 00 09 12 59 00 18 18 80 60 00 00 00 00 00 00 00 14 00 01 00 00 B5 41 <- 1/2 Teilgeöffnet diff --git a/Investigation/bussniffer/.gitignore b/Investigation/bussniffer/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/Investigation/bussniffer/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/Investigation/bussniffer/include/README b/Investigation/bussniffer/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/Investigation/bussniffer/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/Investigation/bussniffer/lib/README b/Investigation/bussniffer/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/Investigation/bussniffer/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/Investigation/bussniffer/platformio.ini b/Investigation/bussniffer/platformio.ini new file mode 100644 index 0000000..2c7f0eb --- /dev/null +++ b/Investigation/bussniffer/platformio.ini @@ -0,0 +1,14 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:esp12e] +platform = espressif8266 +board = esp12e +framework = arduino diff --git a/Investigation/bussniffer/src/main.cpp b/Investigation/bussniffer/src/main.cpp new file mode 100644 index 0000000..d29532b --- /dev/null +++ b/Investigation/bussniffer/src/main.cpp @@ -0,0 +1,81 @@ +#include +#include + + +SoftwareSerial RS485(D6,D7); +#define RS485IF RS485 +//#define RS485IF Serial + + +void setup() +{ + // Hörmann HCP2 based on modbus rtu @57.6kB 8E1 + RS485IF.begin(57600,SWSERIAL_8E1); + Serial.begin(115200,SERIAL_8N1); +} + +#define T3_5 1750 + +#define BUFFERSIZE 255 +int rxlen = 0; +int txlen = 0; +byte rxbbuffer[BUFFERSIZE]; +byte txbbuffer[BUFFERSIZE]; + +unsigned long recvTime =0; +unsigned long recvStartTime =0; +unsigned long recvGapTime = 0; + +void sendUShort(ushort data){ + Serial.write(data>>8); + Serial.write(data&0xFF); +} + +int loopcount = 0; +void loop() +{ + if(loopcount==0) + { + rxlen=0; + rxbbuffer[rxlen++] = 0x8; + rxbbuffer[rxlen++] = 0xDE; + rxbbuffer[rxlen++] = 0xAD; + rxbbuffer[rxlen++] = 0xBE; + rxbbuffer[rxlen++] = 0xEF; + rxbbuffer[rxlen++] = 0xDE; + rxbbuffer[rxlen++] = 0xAD; + rxbbuffer[rxlen++] = 0xBE; + rxbbuffer[rxlen++] = 0xEF; + + Serial.write(rxbbuffer,rxlen); + + rxlen=0; + loopcount=1; + } + + if(RS485IF.available() >0) + { + if(rxlen==0){ + recvStartTime = micros(); + recvGapTime = recvStartTime-recvTime; + } + rxlen+= RS485IF.readBytes((char*)(rxbbuffer+rxlen), _min(BUFFERSIZE-rxlen,RS485IF.available())); + recvTime = micros(); + + } + + if(rxlen>0 && (micros()-recvTime > T3_5 || rxlen > 0x80)) + { + Serial.write(rxlen); // Len + sendUShort((short)recvGapTime); // Gap + sendUShort((short)recvTime-recvStartTime); // Packagelen + Serial.write(rxbbuffer,rxlen); + rxlen=0; + } + + if(Serial.available() >0) + { + rxlen= Serial.readBytes((char*)(rxbbuffer), _min(BUFFERSIZE,Serial.available())); + RS485IF.write(rxbbuffer,rxlen); + } +} diff --git a/Investigation/bussniffer/test/README b/Investigation/bussniffer/test/README new file mode 100644 index 0000000..b94d089 --- /dev/null +++ b/Investigation/bussniffer/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/Investigation/oszi/busscan.png b/Investigation/oszi/busscan.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7a0130f7d2dcc3c6c6d8f01095c69ddcc2c4f5 GIT binary patch literal 108024 zcmY(q1yoyE*Dze8lwxghr#Qt*aSiTPC~l>=y9Nj??heH@xDVmS_a|13kwTr3o8?Z@+n6NUFL@aPdW_{Ssc{{yXGpS_4VK0fxlTdjZ! z>Sc0yj&2`(Fklyd!=*M1V)8l*%WYd~a->>Q%S)4w z3E~jL#m442x+|HVVo9I`kYMQqD%%q{b|D_K{6*t`t^n@W?q1z;@Y5b#4qfk33+!}< zNhQ7BCcIxnxd$W2&tzllm6%xYw4yoGP<}7^EL*5N! zTJNkAf2}Nc23vv^t+W|r2g)vnhTeyIdwnGFWXk&a3QT>>JW2IEja>JMwo<4^mKu?- zoORdnzpHp;8q`kBuwp#&=B1WkLJFIHBXAezl9XHDuPCiPY@05GLkx6trH^*fMP+wG zO}spVzYOH|DrphAIg@Rioo)Oa$I)6|qZO|utVc^QBdl=TDsA+&qTRK)`C?2#%SPfT zB-wV*q6JiA;qNY}P1Cf@F3fFAdHi0+Yso^Z#Y6Hk+C{_pLc+gfkn=DuJ6adAI`W%| zfV|2i%~@q4Wyu>2%)%uwl5**Jv@uv8*23GdgCUr`bo2b*_5TzQ*8@lPV#;LtU<+!N zLq6@{?D4I=6Y@~vhv!MpPqF%b;+Vd=3lSVk;^EGumWs=M#`fy#^Oeuo`Q_~w$R!Vv zHs(b^Q!JiP&&uzBNHEJuyDPRLxF;nQNAwo6#5HnJ0bqL1vfK48&rY_Bz+V#zS}_Z}`% zuFw?T7c%OJP5gta`@%BFWp>$Xi5)@F$3R+3VZRPv&#-e>ZeimPX*oUh(Mp)cW3<6J z(c{=q*DGeB7a{|8sw$yhW&-dFOo za+Kv!*{^+Wp|d+n^R9YZyz$_Q{}lJ9+-DYziBpAL%I!h2p*nsq@i#Y5V48CVt~2g) zm7VAN!|eL*3*hpqTxYoXoT2Av(qQ7ZM);Pmdh>LXSvbf!98|Ohu-^YP`!2!PwVYZ` zF+P3w-SG9rYV}xorKp^Q=gko0@N?6;0-4alP;L89!Ke_H8!nzCrBVi}gdbP(U`nEW z%~r6EVPRVX-^Tm;pjavFp1N-`fcS z)y|~(Z)NqTcH4ra z+xXHr{P%L$jjY0;l<>^`2c=g>UWqA48#3c&E%Ara7WDT5_J92T(>+IR4IOeW@UZGnb7y8Mz4~{SXlX$&A_WO+&7R{Bv>yPv&PU^LR-vqT8?)J z;vu?mggTNeBa>W0TN&w1b}uyJk9|`p#Z7AS=wL0OLsN;{>A!J3bzDvNYH(j0ey0}+ zpxJ1&OMG{-tb4KdGSJ;T5CTB z+!s+DS~^%b&<%78w(Y?IXGHNOsvR!|9x@X@FJ?+``=wLfKj+mZ1Rx_;VT zhm%X66W`O-E-g{#k6%%?l#{35`t+RVt||TJE$S{vO@E~<@!*=Nh_ptgIw&EbG?qE9 z`I{nKujros``jp1=i`9JrK6^`dkziJiqppUSwfd(o|E5>zCAV#XB)1=iMFFF$K|zz} zxfGuXm&@>f(RQ5|QrP2;8CjP)q|Y*5DTNBIz8F2;p1WQn(F>q-xe)$$)&P9PO`j!Q z8n@^5pdzg#qk`Mgo?$GWL;6!Y(bEf{00r`GUy7PeiYiqx7YY zLOH}x2a>TqB8dN%^ypCnK?_~6er{yz7b1)Nh!E#U9mMw~S+mOZSVh9(H1V32iuK4t zsX1`C9~OxCH`|v>QwOS6y&fvPW!~p~JGCV!Aj;70@vXLGpx^)V)HlWY;Tq<|)sxm~ z<v+MF&LUu7Im*yS+x%MMHrh+738jP_P&o6;LBJratAmSm~hW&Mo;plvAfgQ zSe27;qq?p^+7Cn=gZK+@&ktYxOMpkz;xdX}Wx@qt7<}Zhc4qb6lShse^=-Xqv1WK} z%*%?`k7Bx?)PFT=oenR_t8^H@uc7i&H45-QCCcum%qCiEY>RM!Q>Z3lQu$wB3cb7e z{bL#hX&|~sTu^o1R6>PKZ)jxBFT1k6U^dy5IE#bTyS)@LFJ&^C`8xTIs0OB1x(r5} zM#FeMyM|`UoCmi_1Et)%;P;bv0}xr)&(`7`Yefx1TT#MrN2Dxr$9B_j;bWH(1GJxH z=2G0TXYsKYuSb$&WDF@+pV1k7!QMZY&jD|034p zn~|2V9qe($xA~l(Cr(h;HZ>DDBG*ht5lD)`KGbj1Hyq{h8-?Y4__Ym;w&#d~y@rVK zK_VTOJR?yjhaw!lihA7nP!N1&4%t;@Ok9;)YFiXohH6E%T;(qUmrxg^MrNx{=xN7+ zlX;<6S&L{}dx!n%4H`X?#Dkj&SMF8VFqv(yfj#?BiQ;n#|2|DmP;nat!2=d)Zd+ef)jDm4 zpiq%9@;3Wcv*^g5Pv&ymxY8YDW6SvnOB0s9*hk zi)wq(!OXBf5|+y?AR~UaF21HV94#STZ|TkiFH;M0`PDI)w{`Ji%B@POxpq2GxX_9C zsuX9oPVie0v8)v8HMd_#;44lADHyBtjZ^-n>7Um&_GFE7PSN%T65j|FTC9&oXy$bNfn=;EOggTL z6#S5iX={4zyyU6adBzRj3ni)x+!E&VL8 z_}B{P?eFe)P$p9xsvA_0KKRm$MawVS&PRDM-i>G1K!X!?T|Epe6}nnKRM?bf!KVHa zajpb?G6N95&^6~WHYlqvHC5&RWE{IlZjQwo>TnMK4Y42k9q=z-9@x|S9iwxeh<2lL z;A|VvIH-0130(6{6Nl&HEyi^bj=OnFrznk2?#Z#_>q>wAB!^_J^wq6#ZJbc`ce2gN zlO|?X`=OFE#YOVXs`L`l`&#Q^>H;=WB+s$!l?ge4ynAmg`~uZ9aXjD9D#6Ih@w^}F z89`!i+P-~%+mNJ%NGA7=4ri#+GhUgHFx_MWc^#hJ4*SdFZQX~iRUhks(wH1j$9)+N zh1PoOB+dxD%jXCzAuC)e#OcP+ugRfbpf{*@N5K~Ro`odDj$U4~AoqGR4cUFVZ3@==$8|?<<%*!o%PqUsxmEn%Wl(M2pU~idug?b<_(!z>vC>hQW>E4 z!64Px5)+lhC5LvMAPkgV0`gta^bmd$B|7YhY)WT8Y><=Ix;0J?;7QyMioW zXD^?!LeQSyV(~)qA}5|yl-{ujsuO$#{!Vbsa3$iTz`G^smn4O^suP9k7q2 zNuDYO?JmtaswhK=|52-dw2Qd!L8~UdO_=RVDr*#CU@Mmj!ng^N!elg}Ww02^Id^Q; z8OpnvHZjM87y`RZp4q=vbIb;m8>qCy3-ZJ3A{n$qDnF^c=|8|pL|hvxDOwWw!K;Dg z2eb-!I4(#@q1bEzKiJ4vTCCFji z=#T85WA>V}e`Qd8l-&*pd&Ax7-cZ2Xt$kc2zRrLjmDkU6L29#?Y?@HY1A zTztQ`?~)>wKlHe4y!-rt(B|&d%i@js0L#W+c@%yapHZITEe;ZbDnOVegBz6H<-J0Y(}f z?dqNEAD`!@=Wl^e3@#=ujqiemT?ieQHRzFN#o80~&aNvMoS;JtbP?;rgZTbLUk>$; zFe#h<|DU#$pzBK~Pf5i%#Sf}o=Hkv;R%GkC(sP63^Nyos_dE;}MXYFjn;gwbJo4=G zF)phl^G^KezT~An52-pugOj9tgA?wAL@9YZyDM)|XjR(TalX~{@;1|n{Xxn%gZ048Z&jRe9Cl6Q?a6Na-nba zz870tF>Fju^HGIxyT8HVQT~|FZS{dieEv!Os~QV@W2==gpX=jfK+bh&j)8old;c|i zhCmj>ep6R{toDmJ*6Q!F*?wD1Wd!wM{%`P)#TTLQy1nB|p$L)p%pE8&-`1^qaK>Ck z442*oI#`8q)Q%j@@-jcpbysF|F|oDPXrF@?^FM@*L!(he#aeaPFd`HXDb!hxJq+1H5su5DMH z>!p70Q5aRV8^Hhsb;c-_o~E%W`j%!-1y5EHn&-PH zztT)zI|nxjB`V-A7^A{qc)Z-ve}u!iolWg~Pt2osJ0bhsx$3dIG;^U)4-M@neC@*> zPMYcO{iiyW=GLEe$AbZ?lOg8%tU; z_V@L-io3Sc;92jUr1dm#3G&I+wp;)NJ+Ih0c%CaDc+{=Zf~W%BAhfrK^!uuVLyM^{ zhGdaHZT&M0$jSts^s^WW)gCU|f|(Tpv+X62-VMSFh00t{oAR~ixicfv+#1m{;rbee zqd$s@zP({6pCESNQSKB~*N>juB7R;lIF0`B4N5PPqaaOJC!P3SA%oqdXTVVYaoy$@ z?e!R;XDd}1mcQYYRnJv$Gx z`M4-$A$z2wpSu*Z_#r`@hndCbT4qbIEaKzh_mP-+UK_kLBCvMPlY**(M(ywlS}9w+ zYL)^;)9K%4*A_mBT=}r#H(=X>!+xrERlR`DO5tbg!!mHK|>65#>fg+h3j%V;bxHeG^*#=AWffznodr zXDT&}nX=qV({ttCm(3t@H!gc3K+-^iSFZC86G0VQ74uF~CHA;w zn8I_m4G#%<+6Zk9g_eoq0#7gtXO+!#X-H{T;`@EsC6z_wC}jQ#41wDM9AOuGnmMW> z3=f7Nt*8{&V7tGm3XL zS8&Z3IT_1-$A`NDA2lMTH{Lv=Ra!-Okmo zpncK?5*5HlX^$`CVBTS`YUkf?isyp{D7V-Qi+ffhKL&0A!5dYTwvh#zppA9(LbN>y zXwxJ6{|W8mUUDEIc#}`K*Z#|)K6)faVKTnbllb5Kj~kh>GEGdLKmc6np7sBeKls`FW4#k(T2A&5-L##d;rM)i`=~$; z{^Z%;nEXU?nB%Cc@sLFo07Nc$NP`}kJp?z41!;4Zz2-ZR_1(@~~BOM@ngHs9pF zom(V$IeraDMV@8kAWn}jyWFoEr|SD`5)~47BoM`ScJF6oV^o;Zba)%SIWpQ@H_oM2 zw?{D;q_wc36GOyKRjkE8RQP*44~(9dw$h^G9Qt+n z&K_cFS8wZv-(LE8PNwznQEzqd@q)L8t}fjm*??GcT~=nezQ|YQH{~<_4r6h~%Xg#I z%Wx_ZT@3c~+jdDwN=SU{m77PVF7N_SH$v4;a6gC*X3Z+hXdyk1F+gfbk{LNVr>pa4Wl$Ri zLfYvrc0f&-pk73!sA{Hgawmo=gSxBiVzb5Tu)YMR7h2`!Hhm)%%bBhF1?{qUf9=Ty z=^e?T*VptGTiwOn_57SHcJB4Z!o0gTDy;Y20r( z($!kw3xIPQ*_axHeZ!*dpNXwP(^weYCR$ z)Lk|-QKCjQVjXTks1rUiW8mh|*ciK!u)q96S*>23iOuC%AO15x6BdTS&}GvIpeg7_ z;I6gdXzv%Z+c`4^@(CHmg07|}I|Tv1Ce~dBd;@+o=MqRZJWf9)MHzZ>l*sX}qh8$O zt1d}_fg|B)^yNj0k(K9sJEiA`*DZKq5-mDCFI(t4YM&w;JZ84a)4#>ZCk7n_#$%3U zk-QNl>%kW94Cbl+QSxPMSp)m>&~4&jhZc_13%OYX1yje|HF03CMXL{ZF*R#sm~fwQ zVS&o>G@Vmq|Nh)Rg{MM&N8`2QYXHB?*53H|E5F$HTO@)mHv?Cmp3N(ZjE`fu4sook zM|LO)$7!X)05MMC1A6N&%^_e!Qqe2y|CRd5|tdTu*hWw%#mUFCS5#}NGqqg5ov zGRz~c2TS6~H)@OREqJ@pwj0{FULv^%X4wUVeZ<`!QkV-YZg5ZdCuPY`v{2Fb?fyP< znY?_)rbdSx2k79i8kA3y;eP0!X{0dVDHb{aS(ke^MtJxKE<;+_hMJy?(pvqK@%kiH zS+<$2w^s!pEDGGAT~2Y3PH5Zp(h3u0G^qfMZ!$6^YisGDaYe<(xFNQKJ!iySx!v8~ zdQ$xI$Q|FMi@F39oyODC4^VCo^IFj`y#b9=v$Lg0B$BYr)AG}BBs!bzCQpu=;jmDG z&aXlKO}l-#!m6E%H_jTzoB>c%JiH(UsWMxtt_Uh^w7X!c=H+|hIJ@K@0zXr z@`!0#>N;5H@H0XTKd-K`(`bj*EzL|F5K^WZ0rGQ}y^Mc~g5laaAa0fGER>6@xs_e5 zkY6_?+p}>__$91<<{8?udp_yDC9&lWRAQw;Ej-2u>m}lTq3|k56TIl#lbapDV|t=E9P!t#mI>9wx`##Y?J9e=0<*g6_54phrTA1_v%Hxg zoypZMxuOw09`jjnqGcvusgfX&ThA6xRJ#y zB>H-Bnw>vj)k3%4^i$IvJi-@avZxD{G9N_`JMpuKyM1rHq{${D=4F=^I4hwNrJlF; z@GfXkr4`LcGSXN#0_@$W@S$Lvi0p65k7>gEXw2i!D(Z~2Jt1ja6xh*>tw0~Wr9}iX z4EHmx$hSZ?YTKNW*N1i(vy_QObum;UaI4~iYGn;^vPl4~#mTIj__tXKp@QJXT6kEE z>}DLU_V3Bom+|pqNMLLFIcB64synaq&mUybl(_hdR`Tu*5+ZAx^r)Ry3U7FtVO9sX z)rQ*&u!BxcQbU;_VPHb0lany0M7%f0!S?Ju14a)?dY2-D>vK_YG)H{4r=aAm!XRR~{0`BIbkQ;H*yncz;f%So{B~IqlkSmg~^A|X1 z6f=v=i|Wcj#{shj%*{&DJ$QC$pueoM$&Lfu%A46u%|BEa!CXHJ>@^tk{rxxp&97a2aNkmPo0X%j4f_C|kBfFciFJj-kHV*h(9v*Fq89N%Am~;nNj$1T6fATfgEyqR2 zD$meIsB&h7=Blmlmx1%ppN}S=snyi}RFpbjHlBTSXY zDdpO7TiWpp!!O{n^H7axsHCPDv5Vi#$AfoPG?j?RZ}f?s5t39{4hiq-g71IRwk;Ok zrSc?iN-3^9sAk1+Oy?m~(aO#9a$>aNLk;aLF|5Em<18hi?@y0VtG8Zk6OWDPIKP^2 zu${kFPu?e1Y+P>MW|nsm@Dv#f_&G~Ts^xhlXQUr|PXuN}Br@YG8Op~i+0yL7vMMSV z%EfZAi=9{WvF4?Gd759>vf*E~{GrH)4vI3zB-h?i%#&7nY{hZfCfV82Y$!{)L33F3 zva0QJJu4TBqOP08{Nx2!?A6*0Jv7_OW+|INS)UnpW3)w_O!8*)4KY5nDpyuVNNr$H(b!o~^r1)e}sM3&mSq(@S5c$t)VYi*ix8h%B0y0xXX&PL>eU@0i-hIlI!>(n+7rHC$EN>$3 zd`twIEwyJt>#BW|5>xS0MiEo-!vMk<8QPP7Q|EYJz_NC=qK`E3>}tN;2FzCwDkp~h zEhGV)GX4N&jOT&=U27um=iORc>gpnih6$d0{h8Z8HMyvzq3?M*9^y@(Q(|INs^|KBEYN@HPd1*5 ztay}1cS0vlQrW~5v8{v}ZwK?+qz_#q&9}d#9o2)IPSk!+W|!6>;PA#qUUweStkE)M z?=|SvD)TN-DAQN6G8;ve=$3o_ajGX}QdpmU1;Hg^I0{F@y9r@RNj{TPa$PxYZ?C9| z>8u!{_r5Y9)#XZcbHAJzNvpY?j!m%-nbmqIw0P<0iB4_Xe)Gsr)ioNMi>RwruVoh= zUro{Eyh{C!J-93Xt0`Kzy+Ge5F5>kp?{s>W6aBOmg}-z1LHXE3&{T3|1)F-hI=vfE zem8_$&rMjOZHqHbQ!3Cv*^$?Om_C;8!e1u#Qw~_W1ZW65J*LkJ1%!50@1&t z692(Eizo*a)AVt|P$<2)vv!eOxzPMC!}VOcmBlK~R7v#lZ!he|=SM^9Ek2XZ^2w5+ z%z&qQ*K*jTq~EB0^Ca|T!{;FZDMDcir9a=v_Ux-^8;MlL#R>Zq1|?O0mvJR0oZLP; z^V#`P^&wic#CsZ8VAXRS>+R5TeE-ya#i+|`e>#n?>15w$(}&a(adS-sajqF#YJJi! z{_HQaw6pNGA}k@>hc-ukXg$st9yt0XZ(E)IZ{Z@g7tN{es_rUpYlFKD*X%Ef07aK? z7xh8jS8xDwJ&nl7YkOc~KLGH@12d*JnG zQ=|Q2`y~emu|$P}9cDN>RErp`EiDnf*jvSZvvCQ3{`~pf?X8edn@YBwpxfSQ)e2R6 zE4%@453L3vFV;K`eb)+rR<)FVeB$WKGbwP?r7 zZzZ0#-=nL`@*-s}2Yyipy5BVBv-d|Ns^Zi)HcX9ed(wQI;G9}-Xl(TJ`7=)D=m0zp zPBr#6pK3d4zlIj0+s0B=3mJLtovvSBANn0#@8$4~(B2%fs;?Z_x%3Ud;sT=gCd z%HK&zsg=ir77cIL>(H$JIYYBTEP;Fs;&?pnHgUYV;JB{+_n!&~SW+sx!WJ*n9836gGK z=TTMGk|-Ynb3(uRV_2HYu#yi$My(u|Spd14PHp%1Sh{;}Nfl&n;>jj&U7h!?cGX(; z^T-Z$$<@Vgm?`phT?>bRj&>1*?K1fHwlcqF`G0kD#F68k?7fM~DWG9I z4Q6+{xs}-|`IQ`BZls^Iw|_c*OmF>9uN$qFru^u-A*QAFIri1};M0{#eTQ9DvljqA zapvS<-cxiwDZetAdl7~(!%t~D2@lTOq~6eiR;b$@7fY%z0=8WGE8RBZc{(_M>Dc&p ztu;l)Xp!x(gnf|3iw>20J*K%au_(n{mPuprKwDCA&$6Cw+krjKN!poDYQer%_wT`s zI@Vf=x_c7~H{i5I8&(OBNQD74C0ZW=ckAMTwSFl-H)oPmp_60*b)cai?DB|Db?emz zO|OdFW)+@#XDoj6Udn?P@TbFXdr8~(fat&?1yWpd5130{_L4sDKy0-DQI{>i#J%W{ ztpMMXx_&Y*+q>f`zA95`?z6kDj^8Yqu(I?Z8aH!#;mXn;S$(mA9Mo0Q;J4E~W28hF zY7KPJWS;h`3;8GYyl0GCnfsp*rQk$KcDE*dlj;O;+8s)DwAx?^$?llxFN4%)kr2b4 zJwYNnk*57N9*6TCz-x4DMwLbTMtO7dsUnp$L30;fYioc1>`@!c=TD5PtBZ^8PUC4E z+s_{KaJ96ul8lseL+FLI=*lk#`c>3mahvCf_wGv8o#=fD(#ua(yJ?O^q&s#la%}e^ z%fSKew1#BUHv;WuWgSsaBr>YDewhL1z(+3Uj6Fwrv@1KW_F3ktT6RLnL|waUFOEE9 z9UUDF4G};gkB;;6a@ebM{lW%=)l`M|#D_-*<)xKNorsQ9;{_?(D>qNo>JpuX{d4z& zSp(pTrnX_re!6Yd{YdKp;4Y0v+ql7I{Tm$a?QPFind9sGXOwTv-~Gb2Z4H&1ch>tS zmywIhbasSfVL=y6-)C-)XV1Ixgqz}VL3`7&Jzgatr|q}zE33qA{Jv;t-V2l16ZLYf z7`M~RU<+WeTx8PdD|$(abYE=ukISFG6v0=9SdA&(c$~6UmWu_3r>T^oKD!<{T&LX@ zF~o<&xk`_(Q5~WJibRYi%!wk4jY~?YM0%(CJGLv(BT#Qf-vdiQExF37_&~(VH zttaB(Xf=?|u`TCa(V0Y`2XX+kr>1gH+s8wK##pPF92|GOxj$x30*g4>EGSf^BT}k= zjj31Q^^H#*JM9DTd6rXhV6RdJPb*&e#pLIj6?xcm`j|(|$&nh1`9o#S!Ur09m*yya zVMdx-+gaBS?T(6hJUgk`?MFx<7VAn~Pqt-NTsfcnZ?#n|2UR`ifn>aEjR#ei>6Rb9 zubTdv2Zw_ql#Ca`stwXrL3(~Jx#=@+jZwFZIg~<<6NlvhkWvdGEoD;Bzsq<^D<X$-#@L=ZNKbSoYS@$>H3~+Q{C@WPwq3n z4GtRT9u?38%5)CvEYZpQSiNmsJ~Y~>AX(u4CZ3R?m~f)(FVRrXl%wOwy@eCDw0j;w zLI~tlK2Ria_h+KZQ)kG3LUz6u+_Igl2s^h!)&2XK-v0+FS zXMyj;FK-t1PA6zBeT#Pstg>`D>`1{sysEkygzC?609p2T`cVP>Ixoib<@)Pj_ZLG9 zDHdkUhaMT47Ih0QwGTPg93jV5a_A;DbSYMB{D_j@?PlOu1bBA`4)rdB`yz{qb_|8C z+pmvf_7@kwc6UPwwo?uLp=iS?Ke8!2gbrpMnk+3Xm9qr5^CMHLjr`!>q%SCNLf1}C z_7Cr2Kl7T_{5`L;aTg(OW@ctdgha!N7mJ`ZQvc`NeyWAS@&#*b7M5}t(63}9BpoDp zA0nl?j1L|0gcu=&!r7UfTBUj!doE%1a@KM}CWcVSL{+|-JoX5(eFlrk{m<~BkNqX4 zqLnx)RBa$qH^LtStgJ)`#1|BLaYpakTbTuRLT!VRQgT|oeUB+aIfx&-VM0#o@D)>~ z$W-LpF2N%biL?CUD$#UR7Tff?+x>|UK6AGlo7KE-s;ZGqvWc_bALXxU`OMh(e0W_g z`kn|hH8+1ZOTix|D69v57W21~y;~0hrYwvuny+oT?^^GT&c;)mM? z3%qhjkJB0$4%@nje#S(k-6FW3spi%=jdd@JR-HSpxfw5*?0KBDGaAiN>Y$a9f=88Z zTwn+`a5c3;^BGpO1Qf#R>J%VVbi7O!~bhb>ngB{JgHu_rt>W=8G78 zp08-MQ%j~ota2zS8!9xp*KQVfT@M2-g|V-Z>&NU8g3xM>$LHI{C!-w>9}x#aT~p@@ z-F2W1P36xW9muunY;vq@x~&LDf%n0pHxLIkR?TBq~4u7j$Ykl}!W{F|1|eHgSGv2dyHy?TkYH z0=)l&yxCL*z+nNmo~Zlw_K^{##gyax!b1Mg*-FJUJxf*MtA!>gtM8*y+26`~I}Gk!mQQ zGOnxtWw52($am@;oO)g1K;*9{DQP*hSGaQFV&a{ZaBk&HXad#L>jf=QPgB16p>p3t zw?J@%`$+$o;fbw_(v`6=LV|Fzs94|o{5gb^0!%AE7Y(3N)D9_$>@o`rC^=-TQE>0jGZeXheqdbP@#o9!Zed%er2n;$#~qjC!MNk& z#YWcY-@RDj&KUVb!PTE1vdIZpI=Yh?l9EO{W`?98QAUvBB~1_SL}97&kY! z(<3>pNVldBYhlI3#h$xWBJTYM9Y)oCG)ft~=3|En#Z!Zk(c@nU2nh`Q7b0w{TU@py z6xmz0@@=b({GdaMwOpF2=X8bTb-?R8;NlYG+0(-iCYRL>=?B*-1id^yKCQ;}-tSE9$NdPjv^GQ|Ra$oIxF6z8j_WU)hh2;@`XORZnT+ENoE#meK?zH{`_a?IKS-l+WjO~L z0@bN_VMRfht}a05QW^sri7Lzn#p`zZdP^6%$=2^|qH}T8-4qBGCPN2go#Z}5D$40g zN(usM<0^$1-A=dwX}7t>>Dg+^7EHh91+-5MNFXmKcCDI$OEWA{!gDXG;|tmJB_RFt z=aY#nJCJ-(RhMlZ%n4gE`M`kzQe}*?D+z(+x#sn|OgnfnT|Es*GdboII8-3%eP3O1 z-bXL}5&F;{bX}}|HlDH0lqGJBFQ zc(mVn6~Vu!QK6EGOzOS<6r%*4zd+Heg^{xwD9wx8-?OpE$+^|dYb8YPMa0v#)`85Y z!4QP*6rD`e_Uc}&*v4z=9Hx#*s+dU#JF|no)c1~?2+2@VLS^?L7TISHwGdr%Zh}I& zFZJv2f3l0Fa$6Z3wp;ys(xy#ImP$EBx&n!g!y&?wj4Hfm*c8@$46C~ne4OYwl%n3} zpWZWd^tcITB@QtN&ZFn{o7L!?pSxI&rnlHZH!xG!(}X-dOiaFh4xis%jlJ@8_dwr< z(B}6muX!n84i#;i?T%#d6;pQwI4atXcc)CTHS{0cc+fqxFy0#bs7m2RNh8IUf;41< zbLT~!QxcfBEhASt@^_<%2Oys0fb6WdlQy%R{@^D^K_1DoH#eJsx@lBq=8Y3UY4t@d zzSHqEEK&!ui3}UO%94~m=`Z6a+%|Of2FZqbq0x-tRLHJRKB-Sl#HjTE2GL^+oikj{y8bh zlWj130fT77Y31hly5!Z4weMg+Cm=2}4{xs-;O##CnXrD$`Pz9b0nRck?Z0i*7zDbU z5xpYo0q?5fe5%tg1gFQ_TU%X`n^T_?=SzLzGV4*edSwaay*lk_HGiH;4HFOkCy#^| zT%SUWRxTD>-c=lJNfJM1vNbVr(w07BMu=s94!Sz4Q|Z56p??U2x2SH_?E}L?J%Br~ zkM`wzXB?>e1$6&&3i?7u(m6ZPcvs}tp9Bp#^@(YBk=dy7BKaudwhoN^y%%q6)#}l$ z^;&IQ{I!R_?k~t8;5@?Zp|IGM~b zC)XDbc`uchohNV@m6-Bn*&I)a&wZ94nPI(IJ6PCf?rO zB`vK~-n)6R9ORfcBz#{QEQNoxDs>i!;LH*r-f5u^o9z{)XZBBV!mjHha5;tt*f*90 zi!8!P?iV`VGC}<>|6TY;DfKs3igxWm{C(_@-xa(Y5vQA6pq$DsUsXkb{xw~nPQ!~EfeIFPX zv%PK(YvzW3{FXzTp1X#{Q$EP5lNAd1V;$TY^X8C)PA7--NLiM)l>CSX>Q9CX3g0_ZZh}==%Z^U63@ym##-V0xZkL z$npxS(WiCkxsR0~F>IF~9LsZniPLPxP6>`k?swsI7dl1wBad2iR#UJIkED=!i~5_V|YTtc}lbxnQd z6S{^efLau$xOX3z#LSk(6MrnXq<|x0?lYdteHl%g#U-T&ia~KFOO?cO(=2A-JQTc1 z(S+DHXhZn*`*=DAx9DEVO z2ZhN~>7zqKrETYhMKN$<+K%uR*j(v&kuN&TeGQ=SVfVNkYK;oKFU6RY=fmG{*g+Z`BZUc!}?N1~1|XLFBuGc+&BZEhX7 zh_M=*veuV&#ytzzi+e1h4Lq9kkFLVVLmo;1yK=3;0x-JhUP;lFyt};qFH)U|#L4uR z59O$C?8VmvBi9_S;4P4CBCB(}m(D08LOJvxz3f2c+6<(}K`E3aj;D;ipHBMlIe=}N zJ>)lS@MHp9#_(|9cR^CAR2DjggG$uY&qrGnsA;My@`lu}QSh@l$D4biF2qU>a@Zb) zM2R4@8(~VWR-$a%mu_At6INLanZz_PI@3`+XGe1tEC9OvhF?ujQubqtC@PzD8qz#V zG1(c9eYJWXD zyc37LuZpTqEsmr&ocI~=2?WTW=fsyRKV}0IikD@6lH-`1?|0d=ekX+uU$wL^Vt;67 z_rljU5R*(y(;3OqZ8V$6oX@j<6G6<)gZF~?v7Laa*A~az*4Zkx2zT*!KV_2Mp}qyw zZhuor;EvV)9!<=du;iAhB8?T%xBDhf6IgL2;1$6Cl=4VS0`Gxf_ax)5Q{|~9tjg$# zAIL@8=+fHKdf9~XYbtVU=Dh9DE!6Io1vPDemRb?o8cY6E*X4mB*+mkWVSIXjOB?Z0 zNZqYc%gR$mmCS@yE`?{s!|vT^!!9m+ZMdfD*LjA$^P1xRM$Yo_GZvOcn0+ z5x~35TE}+W&~OC^ST@#YS;-l4c_yy&;0Z@5rIsxE`AM2?h9~;=JnMqY%@woSU=l`x zOG>PM!(R627Z;*gd7qpE54NP+`$!|ZLzywbqrZm~*~deRR7xOHw^Z;K(eH)zBJ6)H z1RL>rT&Zz=z0ZtG{AdqTej!u-n<2NQj z_Ppg zHw+MjNrB69VC(3^g(mg?v<8}IsDGSPpB&_ug{UQn8_#=N%&B1T7{)_{%<2Rh;26)O zBq7Rw{XvqV>TY9QO)>oOivi?SV_2q|j`jb?-do01)wO+q7zjuzt%OK7NFGu^x|Htj z?(US3?rx+Tq*J=P5jdnYhdP9_xz+pje%^VX-^_>kFuxhTz}fq-_S$P*>x%zXN;Km| zhFWbVH55HK`?#Z>PitX@%Fsd!Kh9C-%Th0beySDPsi~>f*v_{eKZFV0D=#|Td0N9; z)(89gl$)U^{)n6NuX&Q_AG(X9P2N?_XF#O*gwgzha!HF6)ivalx~g(6DB4ShOP3li zxB&OmJ(hfB7Xm;&?gGsFpHQytYzKgsZ-$%{9q!M{%g8kCo`?gM+mz`VYqI(A8f?6p zowkF+rPMx9&A@SGY0e|h*HV~`eH-MqEuyN*xj>WlzG)L`O4XmQLet;L`r6NSCvu#v zO|)D2s5Ch2J#G$1D%H=W!W1>gE4rE#Et)C?li;8cw${HnMl0SQ%4e#2<~99QavG&Q~UBmN}^&?qUu^d z<<9qg^J0(+t3DO4?jG)_x1KMrQOH>k4k8e{FZ(k_n4!B5h?lFbZaJQ=g$4-Kxwd^j zy}Er6K<37y>Dk&?+Oj$|RJOm|9EfG0r#GCaUhgneQ$=OCjjcU5L{V(6DC}q{T?Uy> ze3N-qk{%uhcNQ`R7zWEu>kXt^w8O*06)NUFkVETS&o7H(WA$6UsG4pYQ>{GL z9j7C$Cu`zmEzsR*Y)$C(N}6j>_dr=w!;f`oGu8zb#j=*0li0+>Cy2r*fx5@eh%;)Q z`^Cz@l|+T2*n=OF1$k^M^A3APEZin8YDw**t7GV6b8|JO7ij{*VdKO@Lj$S}5I2sF z%Anja3us>POsSGf`$o}%D>p8RY2GIi+{p~K2usv=O*1dViEf2^E2MdwwWewgmRXbH zcwh4B|BASisdrAK%~yS=(?_48RWpZZy_-o57ubbn7e^FU>Q1gOjzUH^(Ob<#$gSrJ%6#R^p z$-E&IqZ-cWAa1~2V!glR)QV=4RZ2#x=wOx6Sk0V%hI^*!#E(~6Y-<~^=dpemLf4Xl zB5`+FzY2Scsb$o=esIWn-q*rpKBVaGK>Pi4X>%`8f37M-B#N&Udxo{Ki~>;;9*6b` zZ_mb!+y~DGe?=0v;V^z9_*`0W=EQY^<&OR;CI-t;UypS%-H2mp(K@dxJ6dQavG#mo zh?WJ&Um{?418-M&d$%_&E}oni55&36&372Dt40& zN-dJ7OzP&8L@sCs92rrao0+$NB%SHxcQQKngDGXn^uMTK75Q_EcIrIKS;+L|oA(50 zt*$QopljdZ`q6{uZ|mU27|m7^FrKbf4>jl>pmY&q_>|6wKWd10J{BF5I2FVS!GF_pMY6Sx`;oeh!|ZhHZOPdrWy=Ff z`_&q@6S?O$HgEDJs5f2~+_6R_s`}tY!9WF;4XQRIQ>xDqSH*88xK}+9Vw(tQO;;&# zxOeVArFTDLu)P?wn)e6uXv^#!sS$HJIs{J@HEgVf^Q(^*7iP9_Up&2hltm#%_)M>Y z9q$|fKo=Jm0SvTh5ihW_ePIXEcpt{0QAYoEVc>#YynfuBp6Em-Y|5lY>2dOqlxrGe zGe6zv$@Qa0zK@ntxz(4{-ES>MGJ3WyU>`l;cnuAZCy+7F(6G?f=F_k!o!A*I3+Qs8r{%4)eFU#JejlRxY_r-Q&QI8f@^IX zK@j2<+?M7`%X-~k6U!(7gH%pWeU+Xdc%vuhUf)N#j~&C)$snHT_M4c;mOTsr7k^_z zN1Y+9O7&48by)_2@en&2WMH6YFA_r`$Syhxa`pCjlx)1RW~W9=1=P(w5Xwx#K@k*_ z0qT4qV^(aqlSzD{E38C@&%3Xo5>hLAVel0{GoTu#c}?X`I_QCx+w2+CK;QY9=C_Q% z`>6VuUy;{1#MOwSua&D4=-&#Q0O~{9V=wD>${KpfFfZ<7>fwLo_3H+EJa9Q)6I9f2 z2Cevk;e8JX(tZZp--|Q$p6Z$!%jFZ7OWe_*P0z@^F4`1Rf0eaBgRW!xLaX%9^;tA>J2}VcAth^lbD4 z1THYuu5Ih5aHqCRa|R3)wT|a8QoV-BF-HT3D|Fn&K-Gd*L|@{66;&G604g4F*t<-` z&2ae=qzQ@$eytuUZd^8romSH2Z3m%|+`Y0!g?-Yrh9)T*GTikN4ep8Ct$;_oFDsS` z=XLJLNtMdG*BE+piv*gMt@QK@jNcFqIL)Pstnx;5t5l5SKa^wYsXTG_xbRvrsDeHu zA)iRwD7UNU#tMmuUmdhk@_l%G_0WzUgd5g`lsupvxsc>O$PCmSFzR)LT=s<*y)09; z_E0wF1N_c=2P;)SjD+$`zm7Z8gb--rzeAItKU$o27+kFu1h zRKSu6CiKbetuIf*L<*9sMqH;hQzMcjYHL;gVcS@D8o>o@2=#y%qVMYhQ!e)}o0EPW zi~1o3s8e zo}`FIUN%FIaZQ)9FP3k6cOFxqskFWUN8DgZ@4%1^Dw4ZRb!JJn=`e)S)<7Z;ZpEr$ z-)cy-ajH^hrzyouQS-;Qv31Fz{c8TXltfvd*TyE1E>`Sj;#)(5BLfhp02H}&6VL>U zuGmiTPBe2k+$!QIR4~}DT+o5&+r>0K$V%(*dZWrf^NR~DwfJn=;d;@_QVEYw?OZ@A zjOUNbgP%Dob6lngZp)cO;ak1Jt{j}h#m!gg&K4i1HWwRDn+Hmjd+K_kE|zDjAz6r5 zLcNwA=beo+Kc<%!q$aRTyEIivpH6rTitbb&DqWKscK=byeqrFX;90v&n3CYD>qs5%xK_RY_Xld#t(o^o`wup3gGm;+d3RQT?3nW<4 z_k%VnZ}#6|h_-54xe5l7Cajl_o3wb%g3xj-bF1*M^5yYxo=(;^auaxd(CCiIl0ZbL zwR4?sfb;2k<7(p(HnDaNZMY8PYI$p2O3gcf3;$8w!m`e_*SJcG#tO7odq=dANH7vX zuavM((eLm?aD0w!a{pX~wgcQj6W{s5nOZ$zWb69Usk{KvWed)k}BO-X|`+(9Y5bnH16ZE6$D|U&_ zZRd6t_OgjMLkezbN>fw4cpSDQ#nR0lp>z1UkHtfBtb}u2x!^qazRlJD3V3PPzbq>lud1-GI(@^#R5TO}gl1nliw=FPz_6V?2?PMP<(wz(#wCbMv zE633UzFi5fLlsGMma2FqpyEz&6g}b27dRx7VBBX1@AGvRK?U)&av-ECARu7AafyJi zf+JN{+y=4A>=W%0K{{`be!5(Ydcr=(-15rgv}w&#bemM!;7Z>tCD(>{)?SDCe5qc# ze(RK-kdJ3 zo|X1HO*^NCQud&Iz> zN-cob_7GqbKbbchHo$FPJMdU2i@VNjrlw0!^w*!P`J;;?KJ@-39QYk&Iz_ETt2+y{ zA(fxqxNtjt4fi<2YG)h-NP(R(cbgpRg%)CLnuHcT4MB&vqDI4SBW2B&70RV56#%rw z@8U#=Z{l>go-~C$sL9d#nsY)h`6yLT$8_9|xd5qld3CV&=$b1FM}(?ZN%K31+Gu1K zz^J`meN+ZH^OVJxXj8U3GAI}ei3_BTso45v!b@RGz%?pJrOpupBjc_S6=yifn_e7Q*8A z#aCx^qnwtC-b%$^`ujY$z=LE#ilLDN-jbtiXjmMR#Rm+g)LM`%qR&InvEW_D`~DiqgH7&4@R)79x_)S zX|8eX29Hz64Gs0%p&(yrtQ_}wH^{PSx@%wM0NTo(-U6cKVWZJqs66&?KIW4rfy-A% zvjw%oFH4m;jAb&XOg_~@CHfrSieGXF2J@>#MKnr2a88N9@Suu*t~c?~(!cz!hlWQi zw%2W_N%9TDeh(IK$H$nEjY09}YHD$1AG+Q0jqg8Oxb{V_qN$hiZowot2`M@7>g4Z7 zEPnXxQI=i4Z8$kQWls{RJR0|d<4{f`Oh27k722oG0yOBkhVbuR2>^6V4}Fx= zGzu~l%bd{WTppj=ic1qsjW#YziJF<(0=egn2%Ez5J1bj=Y6uPOgdMc-K^3?r^ff_s zIW>)C6*aEC-}7%r(o!^IqObanYc($3zrqoG zbr4j3A7kO~;eNrFJk@Ysd1_P11YJrCN1bY}-8wR)Q*Uw_o_zaic5(R@nkF!(JX}`X zOhVjA=l*WBqFcI9TCG)Qb#F(1yx-OJVmRCc04-{$v9>l1D$y|?c~S*dQ$%u9x4y62 zwGV#hbM{DdJY}luHRQ;~!95md9bgRYB0G~Z95X3(kAL5NIKjiZ%=nWZv^inK#6|g+ zwr9*p=Yd7p-oW|f%uqX^2GyhN2pOpKpubA>&CBQL_-rzSKKDRVA_j&ZG4t^ z{rBt=u z1uBa2<4iOD^RAA)&C&-d?S%02X46-gU%g>KWAg)XCHXPnL5cy>3~swG%`I>91{fVx zR*z-(%MNcKda5&ph?_C77+>I;g~QqQxz%{dJY#uJ{r{0^%j%q?x zuq|#2WEbafA}v~W^+8~_WkxpVR-EM?$3$#rUG~<|Co~6-p9>AsjSKad!A83d5J^|G zoAXCV9H%vT4jI%md(6@1Xa08 z2_XGSQg7Q|Q4SBJsKrctConNOICr{rNUqV*(a0NcsQg5)iVZf9pda}D5|3kQdSZIc zGpAG(-f4ggYbb@I-f`5kuzr0)_tVm?Z+tqhp@ZODMvrT8>5h`St>}kk%&ieXh7Ikj z6OKJ?ek8sbHBwkH2F9@DiRAhjyqGPoe?O=gzb|te9Rrq1;sHu=9KUnewHQN!A!N7hb zsCs^%3v|~TKa0bC1$oYnm*~bx)}c@>cZnir5kFG93d(0KMv5&Zso|pkbV(uq`jmLH zq;u|j!)+CAe6RI!bdn4@W8s9yLb$uFC!PhRIbHUuXJO=4ug{NXi2_BpJ&j!42j!+_ z6jKv-OI~iZ$Ri-4Pu}zaVy&0e?K2XE#~%vcZJKVDV6@(BEEm&k(R*I;E#m1jVGvur z{k6@+!7WSn*CI1$k`Zd;eYJ=lk#$MiKf5TrwFyJthqNYX6f4fs!d+>m- zJVttunzr{~55L%$gK7JCLvKDmb`xY4m;DL9MBT!8u7SZ&=Ys-359YF4qY-SJojlI` zQsSyJrj4l8ju5&OZu_rm{Wo|$cf|IMyao0kd?0!=Ejo2>eEO<=73vZ0csE!H!qji^ z`q9~m3^>KaPAlVw(>2s078a*(m&tqJxC8*3K;u1#6bH$}rMRLYv%dV*R+eC_{@1IA zp2Y!_nGH#2^q>@TQhJ&r`b*7H?ou_$NV2XBGGUb{EpdEC_7vqrUdwOS;bHO&qADwH zL5tmWBz0w^$s3IjtYtyg&v9Hciy{vAo5m)H=Jv$W;R4ST$=~Qf_}NpH=d(U)Ve|9E z?lPPhA=BqbrwvvjxY+;gr2NovC)@!-!uk}u)f8uGybsFDO zjrm%4P{P&O{nUOVB+-TKh*pQYVZ;NX*a0Pca=Ac?1>2lv}l)_Vtc$b#9$`PW) zZK%mMYaA~K3r+1&T}~?1CI(KJO7t}CCjg7?I-D8FrFmdeikgCoeQaD^-E((+HyS;} z274%p1A_#x_zvBiAXe(9gQ8zU3?&Cf`U=g>JWLOtCBKauE=W+;-~i*!-|ie|f1<4- z!%k;&RI%1@=q#vBy*7RKL5a7}__}N5J z_oeRet|pC*e;f>N3#KsE-H6pWLjbA1iOX}>{T5QlnM%4by>&6?>4CYDRojetb0dE; zbG{Mh8gv=A8?d;;<1R#|1BAt&jA_LW}iw$Qh{N(kFRu^UdJr~Nc z(Q4M>?5RR_gX6p9Zbcf4hxGLVMdz#7o(SW`o~_{i@_vCs5dGj#eD+i}C+zMdszX%J8HK34tU-ImyFnt~77C8?F;jF@9N|o#PBr>oKtbC-WW$nX;=F$Q zs6_pi8e5Sr0R&ijD?f4^dh&b3PpasZnX|tzG!_(?PYj2@ly;;^)wEt-H1@xm8z(Lb z45xqlvU`F4@r;@fo#wiyU5I)=g3I;>S~1pDDVzDmNBEMiV^y%-YJaaheW$3My^{z& zS!r!jal*(%Y!$JEGg&Nn6BA5Y%U-CGPcYzti(mFk&}g;ql@l^3KcYm(y5J039eoB7Dk=6#6@ zSEGB5vzMJq&UI3VnolQ{UBlN}k1=#KL^VB|Ft?d1h{U{h@$$S`oUy(?^$7LIh@FQM z80?x3cxQH!64Dv#*&Cs9-^CB{+_tiHo4Idc9Ztr)lU7-8HH8cqYiZ^ zit8V%U+1}*dRx|C4}Kd*cQh~ej8MiQVXZfK8>8Z9dXC~Um24v-{@h0Y5iF45F<>=D zE!z~3bi)AW(swW~INcw#z{19#TyCWdUmQn2cmJau%FJ=tiCx+JQ!g&+QdmZAMeDA zyV~?1a@v+Z?^=EP8r7Dft~ix?T2y@8aNv|}_`tYTOX#&H6V9856KUNqE%)j-lZ=_I z`$%P1JX?7j!sr5Qf0y|Y3MbdXKT?H0!m5+rzKB{Tsu&@6xy_O%aYl*KCWn}pE|5bX zwbL|`&hVwMhOoWm;%gW3b0hD|^F*_5BQL?yR}l&GWiRfC(8PlvD1=0qqcfSmmb~;K z=@b&H^zWlvU7-sc*C`IF%4s2&kA{|R%`K#r zjaPx2n)OBo3JTpj!#wl|bfpPjT*g9Sney$BuaX=Rg1+rtcA3I&WUDN5?+CAAK9Gm(+bt4+Zp>K@Ag++nz7fQYbkR@`mr zsWjVPf%nj}0NidBsJY=rrOR zAN_Vi@D^tg!5#x%hx|;`(1PGNg~ABwg!3kjBbLG|)`I_KNiJB8oSFf~5Z!A~bP}917u_m6j{-)z9K85$X<117AFc9Rn>$kW_6V*jK z^5UdViy9-cLjRF71iF|t-k&v|I5P&pYRr2Wf|Re0H2&@#ImE8QVgr-I7iXI@TRC(> z?mho51Hvw#9uW4l%SR;#K|VN*Jg+Q`+WO?ayFt!0U=?FWne~lD50dredidy}Km+wx zRUu+tXI)nAx?Q+5674TNrGN2m=EliquOD;i^^<~|S`7&)rl%uyL#18MblE1u*S}FI zAb`)l)$YHppUzT!PFOXZXH3uSoGp{FrEuF8O@ib(KahT8%(Bt3`3)vY>s)80l*e`yF@ zTI07UF`Ra0h@k5CrXGo0`}@0qXRm2H&&0%~J_vM|iNOzqZk{WT!=YB1+HKu}`)UdU zb0?#a5lVznzt3LX8%$HttT*x;-=6gqEP(8#zyRTHMkI0c* zUaCp^6}`sJ$j!Hk_*Um3IbAAtuK7N+xJqxn_2rklnU3|n7qP0Xr-|R{53~b4 zD2$!8ll^m97&FbnCZjo+Li4f%8tWu$aPn!9{Ub-2GGaeMk+#JuZJ9i!nCB!8CTW=z zONpsJws$~g*+TW%T?n#uF}MA<4~^HAg}?(ZHf**RSwb}9uUHE6vx|vzkU?MKuo3Da z?1MbWR?EY|ZfubUw4EtXjibSbygs1p%s{ zdR7J~Hi1?PO<~_C)-kwa;dD;i86CMesHeSBm6sM)zLmY6_C#;}N}qUWp(6@mLI~vC z&qhhbSEMK`k}g(a{4m#a2gMBlu`Mxome==H{a!rA$2Zr~H&=aITBZ{lh>x)Ey$VTc+=O+;Ktli;lmTr6Ydg|K_$d}IH z96k~9A3!KDztKtdWA5l@N{1#8a22|gfUC|Fw#AmnqW!RN!E@U5-9xhG@VkPo5?-;2 z{g&muiKe%Pc6r>MPwd!Vr#}D)^fNH<6fa95`fGdrat6SZXEH`BNIQpssb>Tofw2y* zRE5?`ZF&52-lHa1zJp$$7VYT}ub_SHH^zsiT&(=S`tH3}PXy_K`(4}H>)i%ePdeef z5i&Q&yw0;=a*5vlK_H-QZ{bH@CUFl60oUTvgm_3pgDVdd{8s%o=r$d1Z+kn+1Tm*> zrP=aFzNMvW*^Zs)L;~J~By;vr$z6&IrnPFkAtH$TDi#hP0HZwN9hK!C4 zms%{d6X>^7HEFdAAc+Y?2xU?~6+8wz7gtEAcPaEwfj(q6@1P+|8tA<}*~VlHJJ0iF zW=<4pr+e%^1rE0cY#=Qql|n3x<;qrcuGRtEh zXJuvOGi35&EO8Buw3RJOQ(h+5X^Hd|&6UyZGicZh%jKgxP%KlvWUAY@w#;EEyC5efVt7lNKJ&7^CZ}aG;jEsvxUK0|&PThhUUH-}z>XWa0;XNi5 zP=o1IvY?i+olCH$Q__fcu0&58%8r~HPXN86r_NbHf&Par|dQ*dPYazOG!J;bLuUE?ZfenUP*;=jUxK4f{)LE%?gO zQ%%Te7d_{uHJ^-m@EcuKhuOq@n5U>q}!2cPVC~O=4_T^H8ZK2BH(l`uoLFq_&Ftac#E-f!K~} zY84`0ddK;gzE~!zJqJ~7AOuU%+B$N|Bv)`lHh)w-MmkxAE3=oA83XA_z64cK3ZuJ@ z@o|LX=jQBnC-u(J(b2~ZGpmbt68_VLUonLL6>7?VfD#q^zsHppLaEYWv4xpbUWAe{ z33?mz=A|@Fq`ko_Cu1W0wZSlyQK_jw*j#dYdVFkRds;aSJP9>*)hk|lPHNy-jRC=G zeAM8rjd8q?SL~_dK*U*TRIgS2n>T7Q9BeZiHskLsETpz~MwFT3fucA%k!go~;<+9) zSV^71l~r$YlTY?)2a7|20Kl{~p0W{5rS}oBiO!o6TYb^_hQq}fnBe22uO>wnG2()w zKelKz9S$$*nvp8I{y|$45jS&VW(KM2~0&c!+VLg216-a z#yWf+%YxW+sl1*J0pifN9oo+bfLNjPYXZD&^L5+;t%^Bio$o7m(=NLh;+@L^=G;hJ6|;}0Qho|m$WINxw#)>U+eD*9o? z-In=UkQsJoWvsWuyLvw%yP$o2`*(YqtVpa3MYYDb`>r!c zJ*6{jf82UjSXk)vtK#te6JPoNtG^zlqP#rjx^~8|$=v@6iY92UuwEBRdM+5L|C>&L z>m(9rkD6OW67X?~kwNY9khpF-GM6=%@taWlh!uL;J4B z^mDNaJuPY3x@zSY4=53f!UW`f?)MdHLc5SSVyYbMBcKc{~M2YO?VB3Y$K8b}%; zKorQ2;*a+fgkkfU#Fip1@gyzsuWR;UV2Wfp6W6?dzA_0)6PVbO@6$#Azwgb2fGEk~ zeV}oM-PU`=P!)Ok*h*NV%2fE|k6$#T*rHe*BUa3aPMFg5g>tXK^r#@jS5#0zALobG z+G$?63FK(lWC#h~&JPW=(%z~ikZ3*G{P{7*KCMf`OKORjT_MtyfJnM8o%YKuBfo`A z36Ja_y|`es7DbovM<*R#7ssJre711#2sP6-cK^Gv7_e?b<4$mp!n49DLlewrf}ohQ z4VOwQeCZc4zZD=Dn6}GYWiPDI*VYSck@XYKfAm)BChVyQXKqKFL>$$zYwA8KQIWRz zbXUHG&7a-|kM`)-WdA*PYwf7}H~Z^VBBz}@up^0&-vE>Rz30I1g8!h$%)&yG_3ls1 zxh?d6Jp2`-&nx#YTEH)9>ME7=`iK8895S`)C>EppRF7Gc4 zqHVuEu62++U}BK|>!U8l7Q(+r61jc|Id|=AUT{uwHbHhSjLiRswzQg_1GL3zu_z*& zMNwIdu^{Cq`A%)5PJ~$57Vc^YOJ=z4k1wk|d+gn!ATOW$;~8F2FLyZF2EleW8$vxo z(a(wue@%FOMTF~-%M!PqtPw19XscIJ@$`>33DqU8fN3_tch-weF(DawW@Ep7XXqwG z{);^R8?}V4ap4BR8f{SGIo9R@31liq*t9zK_|DW&c8K3U@oDS{POZs-Jf0> zi(v@H#bPZ49chB0{(1v0e-_bRk9q|UsR8x|sQVa~)=?2lqt^3Jmo9+zUKYR_@lS{7 z-BP9f^H?uyOE6Z(*%5B)-_-oS69{AQsU9=-ADl}Iuk&Bq>;GO}zUF`9dBAb={}G)$tZJ{4h$p7m|e-h8% z?et(^A{hA4woU&ZJg@&g`TsXbL#7^P=@R4FW6Ei+ueKd8`d-wFC<**g44&aG*X%*V zF{O-k%*QMYRf~tW{7|nsZB=nv;hw3Ruv_M-{aQ z^xA$w_-A{xZp6nP+7W}CP(dvLygus%y|A0z>tJX-mt=omM@deaYd9YbkEOvmAXN*U10+ybkqlJ4y#v2w^UO2ya^M5Bs zN)<0M@HDMoaU73#`5I`vTw~aT#PlE*-LH5>sE{gWe5%mU`j6#ej{}6TNwdhi7yUh` z)6xFlmBbnlRH(Arr}O^c*-heOfoL!0Jm^7p_%_sextpGXG-q>TxEC6 zwfLU1atS~SmG3n}_DGS&q zLDv@F?1VeT)IvXYm-|HZov;{xGP(+tc|kilo7WJt!O)*4)5R*BU~tIToiX{L%Uma| zff_32EA`yoz^oVn(LF4xz)&fNSsTHATX2Al(!y4O4_|B(UiL|wL&=<+EcTALEdNf* z5W0PrR!g39F`<2(SSZ&mOw2nZgWZI7=vbgkj#Ma4E$0~*uAtdrzX)@(NkF2gPBSI9 za7bkSTqBQmT0N9r@>74&`f6f^RWR%(%BW{%`}p2dKV_6|-ej>7vS>Ln^; zcSS~y{1^gACRWLdAw}#8cVkxJ00WZ#Wn~_5rXKBbjzvWM!5W9|Q(3$nP!T#uYLR<=}S8xU=*# z$PSfLf0|A0S`vJ^bAf4o!z?)_=?E65lQ9}CWBURMYIkJQw$K)vyRI0N^_8zSd7K05CF9W#`}()D5tRSsUwgzkz)JYmGfEM)T~>4R;YnUF=uE}lxi=Kud&aoxL8)=Jt9oGtx|2u- zemxFY>IX4MEQwN4cwP<857l$QM}Y7_(*9F~jOzf(FH3qe#Yzl*7epevmU~w;a>9~pC!3mWX*w&G z**9bPf>kduKoEw3<`TyGw`P1yUean#)w*4H@tm`ytn68~NTV+#IEhS{KntVg$a5Y~rDeV2f#AbhZvFrMAI=>;PL8=;xK`qlt6*Gi0 zG{u~XbDlS>clwTRqCbx(edF`#l#blTrT4@_ES;}OW!3w~lknUnCH--fjQ2P~TcoO+ zDU2oaT%vVAG_tZeA0r9tXmc?HibWjS)Cqz~AP{dpV^5HpUXN_0ld zQ!$_1xgs*z=rXfH%H&;+UCFp?(IVSfGTko)D5SEf@5gr~S#o1w2gYRMsf=q2GK@cX ztl+-*ppHCs%3lnHuvWxXw2z7Eu>Y{TNq(vBQR& z^d3bPA#UWkSdxFk8}X{AyCz~uq>x)`keFngg6tMGFfzFOv8()(PSz;^33iu%E>Z0k ztWS0PwO*el`dr927rEe6IjMyTL0>kN_1)=Ik6;0H6*IDeFn+OIL8sC9p1iD>0Ek&3 zr>U}eR8iqCz2%kj-i*{aCwX>GtXteD7@Hn^yOX$s-RUY#23fZSHmgqdugB017T zKXo>pe)67tYMH0}b4cthl@z)d!!91yu7uE>oDGCIHz1itIJNA(m~v8cq3L+_rk)Iq zF#a9`ZbP32OMAIr1DsHmC?$wy;waX?g-vWuE_ky21UG3Ek}<5E+)v#}wXIt5IGavK zNu^KGva%E>u9H8LZYoq#^s}Zi#o@U^K%wGxYCHYmzyAk0_HB^E^pLZa`X z<700CV{UK2H86)5-Nivr$E+dAysPp-*1hk*xiiS@> zl2Tr!fDN}+w4%S*$7f1z>wS_5bGy$5wGzIher=zR4sz^cM1`(V=7A52TJ0R#z=Npm zaTH|LbHJa0bzBlFkQnPa6~0=zsKit7&c!7yk(-#*PG*j&=7_#Ob|)qx##tm3Lq&Ng z*?N_3!BhD$Zo#BR<IFRz z4TU`{X-QdL3>AVTz9f%0wNcU#y8rk)!rj+#T4z(qNCTNM(B1bGx&36OxmqAGGI0t} zG3|mLLR{Z-nrKoS()QhQ85plfZ%fW>sjCMMU>I~}**rI{!=ntYXxhh_aqKAv6ypnR zjmrCJD5l?487qAv#ZeFzEi#p1&IGo*q^a>ls+|>Ar61UIMOli}@~1RI6y}r)-a1n;im*#^KAE{RlY(Z^G8!xhaSAUgB}oJI zsRWUV+MXAS%*j26;4?1BQI#`O=OV-zOk&2!B#p*U2{KbC1o|hDMNcVOjx!I)mE(~P zvBr{#`HW*%Xbmaz7i36PDcbXYV#z6^;q(3Q1~>PiIK|b|>9`GQgxnXB&Xl7DX~B>o+Dn%V4mBVm7ek+x{DypGP{z>(6L0U4PEY6UgPv|1`IZHb{0 zlS8!8+5xjgUC=%oW5q@6O+|vC2Z_lJj{M@L=s7P<#RX=GT%WYZ=S^1;56#W5%QGTj zes6ejNK-qWp%fKi9I%znUccdu0;4impo#)zmI?rQb!PMovjo6p+mQI~tYrY~1C{7k z9<&z&4fi9Mw@?44a5-)t{iV{q2@5(|FM<(z(vs+fo8;_cDXRs)A`SD3^l0cO7V!`G zfMct}m59*|N3$3%`GpS93?ghORlSxy${@+X7#Alg@SpUMsn!37@eI9G+p!!lHY3&> zlI4=MzQ>9A=+s3H;A1_srEsMmybJsb=meClZ-1$t_o!#vTv&@|Uz+O zvN@JKZ)78={9ouX3LD?=$N&Js@+<(nNLwHMw{oRu}V^V?qf18G&I5>x?F_Z5xnW; z?ER39a=$3_>%j>b4lkVRH+Y#1u`+yf&oCV|H&rYA$b^@u4&aqh0R9nB0<>BH^@mY( za#Z`+z#@+XMBzGW%I)Eu-OmBIfBnV`^WuxrYn8Co$inYk%|4WaL5=hqTG=&X7js$& zN$3|(^B9EZumRv)p=&pRkV%{*F?(;gT&mjiStF)6NvmVrdmAJ}MDZLh^7EF#kvQ#7 zb4O-fOYv8>pOFG&c0UV$-lLwk51(f8$1}mOjgh3P;g;>q>=s7(`bKt{$>#HMOtx7V zlK0)@y+%f*k2tz;NSZtyc@}WNV@ckTH`-zM8-S$)Dhd&@rhNJdAt0Ym^QSA|7zm*^ z27Xa5pzbQgD=}D9rx?7jq^NkhJ7{Fg-I)|1sdFKK>%c-2R3j#_=Z;GtzBt&0bDnW$ z@Z1&K8cs`z4>)LnQ?XYH0Z5H9Aq(a@*OG1JLQ%673Hdu>KLmPiV50DT9pNBkq0~gM z(GZ)ojc{ky-oR0ObR-@ErmN%bxY3RtQc=3x{$%L?JjB{Got*f8DOxyJ&RH~X^S7Vj zeFC?N#M}e)^;^$QVs83;7YK>LWI#ev$IO#o@b4d_`JZ$u3gAfGbI^~FnS8EkG~=53 z$m05V%;>WP5qW>PYLzn@z`pT{Bw0hR`0HT6zz8V-=!~N1;ch1pueR^xJw8%V=yQND z2Hdv_Lpzdo|4Z9|8D<247uHI5^hD0oeB@>{7XsF|NWYMMz-RFX&<~UI_@1i(_qr*D zqnYX6mI00eeboC9LH3?+3Ysu5quIPKju`Ii8nVyi{0EHkH=Nj&ssb3C{?K#PPF3qb zdryl!f;ETSQnW^!>LhE&%#W%QH!w)J3hxc6cC_s=8|8J>k;QdNo=419bPY*JEE4D_ ziWJv#$cmyCQJ(X_psJv?$~%AjskDNd;xC7g}w(#AEDMFK@?$VRGGBVI52NY^3il=Kfprzh4r$B zXg~N1{M4fPH)Q>9kA&WrcN2s@%xM<1c-N<0H}>Al?QGFiy%Zim>i_+UF*tnF3{IK) z4<_to4gWpi*LE>r-P@)xFyHpPRA>LX_N|!sZ%eHy^8pNwaEyPU5w!xDV&xiZ_(J%- z*cvnGUh;o!A$j_ULGKq?%U3f;TPbdmPE$Py!oR2du6-g0|E{DWrr7GMQlw;5@kL<0 zlV?59wG4!drK*!C@k|y=k*E_!nCUAbb3}D~KNymMR8EJY7stxGmS$#gLmQY?IB+|6 z$>lj&h=JoCPIC1qbV1<6SNjS$1;zl~#h`CXzu*TrsTJHGzK$GNtb5E~OG3BK;(-_L zrOQ3Rc~uwy*3j|4{01q4Lf;8tb^rD#{fp4h7a#oO^)OqHxz2!=!dl>e3qbzQg@yB9 ztcfLqE<>~c=j6NkcJldD9^%))Q8c77K2^tMC5-#R-L=nJaZA=V7^akJ#3IW+ z`9&R9fg#;EEpb!yprh#vXRzy&D7?Ze;FFQk+JWgFl92if+SE|(v*^OqZcInvP2s4U z2VremN-e-D0vr5l<1sWkAOhfef4|rLZvS-NdX4!dhYP_VNpX{x=-`*pK0Um7Gs>tA*c=yG3WQ{2%PSWmr{hyEZx%DG_OqMjGkv5b2hb z?(XhVLRz}JySoIXyQP&bL0WnbK-6bFKJQxZ-fMr~pLfjT@L(d??m(4x0M}BjXh#|cr zo2>C_pnzC(t&KG8m2ZK>qk`Zp;!T;v0V@Uop5-w2g zb8b=Ba6zzio*^$8$`e~~&PWiiT-#qtcf~_)J6?$3?nclEw~+D28fsiArtQFvQ`IW?BoZ^X2Alb3kPJ z4a=#RG@m9ZX4T>9%FOfS7WC_k@*glV+4dQzl8rVRJ~Ot!Mz>GB1HIBDvn4y%vB%fNodSIbWt4Go<1 z2wujOGi<(V%(L#5s?HRvN;42ABAo(*<;>(Y@v$`^-VC?Z%EIl|sWcd6my-yvGO!6> zF2{<}utnZrqbOV=FD`IYDZqst&(>^uEjK8eZb(Er9#SXws31-{)|PGtXOwaB$*9=T zi_*BbQ=9N05p>LH@ceeG2sVlqe_(rjGBFC`5Gzu{x=8tv$#pLPs;gmGN`z4pVv_`; zuW2+fAJZt0jNjzZM#7U{vP zMGYdiW#tyzw5l;)jEEC4jPe)A8nzBwl0}Y%yyLF z0&t^@_(}GZL+%Q(R!K&X$57j4H^Q~o;X$0|11&uv%H_vvLoN?GU^?QOX|e;&L43E} zdcGIUvx|*hX|C^;6V^Xtf&_l+Ib#@yKWJtS7I(oA0RX8F8!7@gAuosZi=kw)L>V!24rOP#fWci{OiFDc|CJsG0>IZrYj$ zYw^D6ha|WTpFQ=jzFn2>d}9!F+3x`?rFCq8w2|}Gga8s;FX_qjc=a;x9^8a_?v-Jy zK6LrF`y%RO@uqZ)BH+VpXd@I zV~fQ*3t5jW7zF8vC8AzvwD$|;gyIHHqkTWsFCK!^TN30=I;5&Eae)Q|slCZj!0XT->&&96sMWrFv~1NOa&UwU<8t{bcb9IW8$GqG1GweeFw$I!hRBYqstK zVqp=9p6}LniBSk=dR9zs2tgj@%N074g&d6dG|I!iz+V)c1iKy_3!F|9%zMy+?bzI* zCup3Odmsyml%2$|=8M?0M8c~}Cb{vQi{($i*VjA0il$}Ak`T><2tVhYt4W|_q4cp( zdPL-|)Sk&c|Ky|LJ&=br(sgR?*PK)*R=DsJB%4i=pn7cDpU|I|f#tf1a&ffk$gK8l z78B;Xz-~tIymgDc+-~hj1EFr<{Lw&u%~ic<#&@S!8+qh5-FdB(c~z@@j-+g%y}qg; zAr%F;#GUQS9eIj{*dbrEu=8oR#gR0uCZ}ef*k^_;l}I5!T2CA3VrAfp z9w--R|HMU^PLKF(!%f@OSvc%u=gLx2l&xt*@^PGEMieGWK*5z*=Y=3AVeEt@rDWq|(ax(;%`yf9=eVgKf*ML(<>FKGzbw_cA3x=S-z)D}UZ_rY;vnq3mTny<4 z(dP5`<}iD)di4*zHuQ6b!m0UA`4Pg4lLQph2wB8_S|)v{-L}j82>G^q&(yeB`JGMo(S*c}wdV@a4@g;Bolt?*GVG;_tzq`oJK_O%MKvHz7 zI22(q6xkj}cXdfuTC;|V8!!|GGj)$_A5$BuK?{kV92aNdU2rnd|qcaGahb)Sb%+x7G!I2Ef#5n+Ydi!4@CQkdHa+&6q}&vrvZ0E&+X z-2Q;5tS|=7qbWhQ;$8LlKIO)DdanjirOEdC3{(6rt#t&e@864YPQFDNHD%J8FK6`6 zW>23)iG&S=F*#&&wkX;(ESowiK-yJ@b>DYfr@8W9PKtIPv)~aCeY|C`l5NCSfwQ?z z+WSsGi-QB;u)H*B47jM>tK0xfTSv9cPNLU$cosLB997Dsyds_;Go5#d&-M*y7GLB& zJ$mgzm)+)2YqZsi+U?Lh3;A7moy%&5QS-iNb}x+tOgv?=jc8XW1IB~_OLpej*Fhy0 zX+-r^yrbLGO`&nK9ZNL}xRljO-872F^W_z{=|H#3&@ABmGUnMiBe zM!VR{SozaqbD$*J6z}%B96`+vvpVuqq`JAYr+rV`V2*aS>pTX-cnk-%+i=0YKCccq zTYCM&psSW9VLiZQ#QLK6lk@SEKUAwGzwxOS>A{^#bmy}zt`i7+?8_*r75kYYPLa)% z6HX^zzpZYRyO3x(U;^4cM(Beh3Nvz56VkFdR2XYTC@ZC+oh~CyUMRYsu(lD6K6KA& zmh$6@vgzd9&*b&4I;jyz6SV~ zL*_fzvc#r=kcJ@@57c`gJk#&hO0gD)^cIaEIUh3uKwg*K7+=K&A5wU8IlWs*_!7&ti& zb8{n{R%ph(y-~xWt7=n@46(lIAz<96b0-|S?V%7S<`i|S{8vzwUug-RB z9l8@1UUvugBd97E&$e)%Z|pu^-RggC_;s=OomIN=qppUL;E}4v%~uMS9FDQQ8V>7d zr8!CoFEi8)VRf%R&a&pR7z*yt3%4#f8nDsm>P$7`Rxlj*dhR)F7N* z1=XOBF`a{mzDRDR_@NCD@8`@B^%_(m1pEg)Ir4~eX}B1m#;6OV;mPiMWzdv z!PGBS&BAW0>iE*lR(v6wpIaDN+o8&ao1FS}&ybXOo%-e2%cD>gJwkeAzL!`d<=%8N zI~;&HYl+7^(dtDqdXk;lxcP*vk@vDbb6Aul&e6%iD6pLoqur21tuoe3vmy6O& zJuL);69j`Smv)vJ&ECeWOk}APb|Qe5sA~xQ(*1Ov%)Z2-E|U6CqJqLA;8a~wn?gSx zp}cn4dgNp=sV~rrZi{lP)cf@ko&Q*!?E((QDqr0M0_eB1;iS9&LY50BmL7h<`66m}ms?CqKx?>BV? zJnP&JJyH0Q3O9ZxGFQr7Mlyy0M}1M3JiDR!rq+{zgNpkdn}}W=`nD`9rS?PIa_%<~PtM4DW6c6u(bq-ysGo}y^FX2r>U<#bH9aI7vGi2y%i z2HtFbCk7^Gp=zuz&Hd1r%-OnPswrO{>B$m0D24G!ibm+Fr!tU#DgZ=Glud#glvgg5 z=Z+pQUCDN5lDn@f%G|=g?izKZRShmC3F;F9HuMtuhs-Zm$4ybV7l0muyXzAcRkwn{ zg9p!RPV%qzKEHwMPvnYp^UaRW1qQXMfH63i5{Xm$q90|o;t;ord*)>}bfIHKlKbaW zx|l;}_b#ijkJ}!41gTnZSpakiTONfYCQ1(bICn&z?JW(VeOZyQu^;#8;p?tYDd5h~ z6Uf0jfeEPL1gYVCCoZfBs24({x-{!C)!KG6-9n^nF-*trR;-}}jS00kD%K$B?F4v( z&NXJ5-cN8l2f5J@a3gL|#8Ju`L8hZaXFh5_7ut3qV01_CA1^y3NEL9Pu_5%yUItu* zWv}J&g^&jFm)mft7kJK*%58A1B^)!DyBAap`=c|BPD|i?W{q`Bbv0K4k*-LCQT&PB zv?&yRD#5Omxu2GnxU1GhNsEP9Qgp_gcyX`dvvWY|lWd|MvyJe18s&a$lfGzkP>j!S zrAWwU5a>xYj?1^_%g@~oU_)ADSOlQ4do8&A;WcL7*9E3VB%n^c5JBB*?`Oo2$=2O^ zZ%FGk62^51_piVX(hJXD3JnsK{$LQcC|sybt;D z^)J#I+t!Q-A(86IFN6T=Kz#2uc+Enh57La^ipYls&5s>mQl+@((B8xUrYF}n4f}lD zUJ8AO4whECVqST)@91c>L-mI9;C((md((n9PyA7<^pgow{@7^vnFhuCkm)CBv(q=~ z@Rau(`=7jit`^Lo0|Z0D$lA`U7cX9@6*B{0R8d*!Dj%}{SMh}B_JY6~$zt|_8_Zlj(#tSU8k{c$?ro^%vfBm*`FOBzw%)${ zoO#|QylGfW$%}EV9Q?8j4Tuc?O3lsX1>dh~a(GhRd_gHb5JQ_@SvmIAZp21jUf$5q zP*oLM+No~mkJa&8n>E?e$`GQAK6gYX>AeA3ucE~251_fL{EGxHfG zcd?%JS3(J!JV{WYba^WdHoA!!j=I0BeKKIuCZ}ML>Nz4<7s@2>sre7N*UO zjZYi&{75E;v1up(J$eQg?wvFhl1>xoS?dJaaeah`}cz`TQtx#ij^!YixO?1r_lsZ#I(Q z5j6a7mzbR`z?9c&q4JVA+goRcaOEDyzE@S@t7iC{3cHlz$(9{F=t*B<=T~E4@>?Ns z&XjV9XdbQPUM)bcW_j9)H9WPqN*$|Hx(gEml9t(9|?D zp8NYH94f`DSMySmZ;023`!e_|?w^VA*52?%>G+H!50i+ zt5CI5y$^Fj(|t@Mxx|B?XK{ZR%@X{MSQ4ix4)y`7y)nP*m|!AnRc%1Qx!N56xFEb7 ziq-9%tX!w$fYhvK)AbYrl4Qrzt48nb7@gErFRx^*w7nJU;ar;XbaR(Q%mI%5N6vc? z%C1dk+dD%V#)Ayus6!7c;#9D2F68U&K#(Wf{Qo#J3*cVZBT7pB{#C)i%8Ew;-0$* zvv^WuAlCV;7K)IsOr_}Zo+lqzSPDErPv)6BRp0|~a6$xFK?fCoKgfsocU$IHA3i|U zwt#*97^&sG6J9_Ie342GuU5p1ZLIy`?Y!LF^>V$rgZQM_9bYYJRaMoIv5WYmBqvVJ zF~wDmCiAwkFHGSRsT3vNqAyB2kY8w5qMoJsjJ;y&v5bO9-mD-BrtebT$g^CY4$N_m zL~iUE>v=PkK1?M}R)fisWO<%%;!MA2v+-tpI4Utm6!B4{))*ubo5K=RW^RS*@zra8h&0ZeO2WXgQOg zAn3MtgadbkTc)GD%YJduZIrv}1Tj+=!fu~-Y;Aq@{b)KFW4mup;8~l0;un?O@IE-K ziTRVc73=mBqDxmVI9oO<^iR9RZI5fK++AJE9q{D@BTZ^`G~8FWtBWsksK_P|@;S{4 zt+(pOT=VBIroYa#sp(%F3L86)jUyFP&)F?Au|_E=>6gkjgH6=!tq^7w4(-C0J{C=^ zO;3OeIWSw;VwsMLQc|-C-iOxjX_sc_waE3$(>dAt%0omcR zW9uiMCVEvt6Ms>GgR|zdgK+lK?BYhw2L1P9`aRU#%sgWLnU4>v@)iq@HxhPsMz~cJ zIM%ufTNoLRKeMfV@Gjino~iS7qk4(BVQ7)tofNeoxK$iXpgv94=Rh^I>ztj#NqT>e zo21#bOLMMZ5Y^hws@iO(W*0E@`u%=(b?2{@JyeZiY7Z#&f-qP&B;B3P(*me5SS&tU zc3?9*?kzoi;nSeBb^O`deWX~@tyKCH+0uA$JW@`gs3`9tJPZRB5K+xD_m5^#x3X*9)uX!tCuX7toq(oDMfU z!63V*c>=ly zHrV*gzUVG+FSqB5Fsn<IqBRFJ(r8JpZu1(7N3re)+ui5pe5J;$ z8Dwq0JS(IXd31&=VrjKlkYj4FXO3AoF{s=n{n`6)XGc}JQLD{=EMFm@*SNURZm11S z{A!7W4-wr_+kjS7b}%wj|8&Qh=l;TjTqwj(coG_KSe`$7{ebB$()E*cPfO|SduxpS zv-{`u&^?5Z0TZk;BF$XP_PKSl-v}3_Crc2rS?NQ9YfN`P*7i>=CWdAn?XWa0l*!u? zXgBYsSsE5T!(GQ}mIt!T)ViCBoE-_PsP3{~e@(vZmrnMCN?NquhuMicz45X*`;7e6 zCQnvbj`@SU@|a{Mo?5|#SQR~sd~2EpkvMY1PdGjHmSIS7`m0!&r2c_x6b0=>U+(wF zR#~fNTm}pF$zW@Fi+l(#Om02BgAlog7pI4tYisY)2U^#L(jgyXk?!LY5bLVR!jJLk zvI5Zl`gpH4Yu19G8B0&TD?QWPbXnCzZ@#I#BId|s_>EK9@GNbBZzhF6+|CkT>k=>~ zr3!-~;AA9XF&3+d_LrX_x#5?yzb~~7jbw>WyPbVqR)Bb?50mWDv}3O4mGvS459RrF zto%#hG&yih7`?(7)a=n?9Y{j4Ob@KG)n1n$b)_ab<1O%Mcwz7Mw#5DHYxQzp3bWaa z!$xklf3G-jml2&#_|WyWwNGaCU!UAfc;pSEferGMf2y2CGFOJwTJ`$$?nC|1DX54$Yc2oz+V8jmua{GqYu)iBY-qEA5 zq$He3FwoKqef{k2F=Z;VmKIiY;9_nA|7+O?*H;ES!IN`_5SEmbv?IUC?*K(Uu{<2I!egSzf zwS>Um6_#`@pu1*#MezDac7DRsvJyB3E0EKd@PT|R_>e!mA5_?LNVhb4gJA>4^2=vQ zROzds1G|1;khz8+gFxUMI}Q8&o?livTbo)?Zf8AHiW|TCCLcv`)XY&UHJeplna>6# zjXG|5sg856aZe7&H_)AzJnE=ZcUtF<1oLQrRb%mm`*Ih~x<)aWD}a|)H0po|;#wvE zfU3p7B%4nby91|?(R%ck9Bc0{_|EE1(5}9Ha_T^DQoo>WMjXs4q|wgHkqUN`x@g4*k%ya!Up`zEsCAQ&%SW6PHkK{4*b+QO67SS6%E^-N zmZ4SVN_5H_d`*oZ?xiF(kXvp=d12C4caP@+%XakT2On6Z*wtkB%OvORQ13VnyZ}K) zRr8`v{|?^N_jgN03xUltgqh{4+eXKF3S6FKXQ|?smc!r%1p%GZGP78B8Q6|V-J1QF z?kTldiem3M-H)U%odJ-%yq^!q1w=}+snezY>KZy-!cU(FVc7NE-Eul%;q zGbghBEb0koE3U}AY4!8|lvz6%Di{!@?>(Tw2^@n^M&BnDuVS#=im>`r8~f`S56tR= zf}hE1x3&Q_oG4b`2~mfelB3uvWCo4S9;}b}!eSmZNa|qh?Z1&GfJ`~*Q@;(8 zH}?En#N>O@*o@`Yzp*k9hIN9?m3E&0=8~whxIlS74MPZrYk|l8$t3m5rNeRQ(Tz5$ z9B}1t6WY-TXFJ?l(TAIttGc1{w(h0)Loi?-sr3GFXfLidK65s`H%C08E&4G?>?(0_ zq|r9^0p(3wrscxeOK-VHQ+evx9AdN8FD{5v>(-PW69Tu$!4Zf;d$~F75XePy>W1?L zyfOw=XBUVWd)+ z&K|}0W7i|M73#7QjQnUPX5T1So9=r0&HT6vPn}c_L<*xbd$Xub+fPu67>H_80fsHg zt!J<=%(4p$Nl8il{Sv!5z;s&> z0bD0w-xKkhbql3Zq!!?Jj*f@)2$*iTJ?Mry?-{u5qy5NCzo)5p{&@F56@CJ9U`h?M z61ePQ;vm}F{PmYt<#E2@n+Id7R}Q`pGC63u7wi1<OeCIssAQYJ;NtFPxTdPUKVfAhW`b(_H5Kex6bLh?v`E<*)eb6JRZ zYjoOPpU{Dg&U%GQpoL8GQxoxK5wYQRU3#d{PuR9;r%D+tfowK>Ko4%h@?S5~XaKJi zYo~Ldy{jwkW1)b8!bAeA^(Y^3?_I{zS3Si7azkwrw97h-UQ3MYJ@*XEfQIeu(fI)E z$CNw|ij|cg`5-a|E2z&H<rBEAdhEDtE;mf=f+DQ zhGMxtdoba1Hzwc)G+tvgyHm8KGGYY+JZ|G&zwP@!2j{()C~bqyiJ8Tp)A^tx3SQB; z_b0IG`Mn#mhK_)$<9p|AYtBkS1VA<<3AR~^uI*YrMTK6avUJ)1F=Ph z`2pUaldIpdgW%1FBQ#^ItE)Qz+2D4bjIU`^He<-~qp`O|gpa|8O=M6*rqqJ}xNj{8 z59tugL(M*Yu}&?{D*YLm@~YUbeyt4Oj}dGGdDhyGC|Uvr^STPr)}RglMdf$%IuN--IW z=xUzJAf5i4*lGoWn%#n8ur(ywoeG*~Gk*khz_z*@+g~m-O37kYfTf{!Twr~`5@|2M zayIw1;3d+nW$}b7eqY*u28k!02$3?uVn1LlpSUysT02*U<--Ps{=fCX{C;;K^34P? zg2eiZt>H9!%h*M=5{p)F;5!%Pz(TrBUiZd1(QOTHRenP+i7ajy&72w?3L<3u4nqq+fotdKz=jKtFbo z%Fci9@sL2@`4-#~`VI8{Yn@c7|BeQv8ecQk`4v>by|&~ks-{I=6^<(^F&q7AF6ImB`gR1lWfofrI|!@bKSjE*2U?3Ymy%+P9IjR>RO5h|dhrNn zb-5XPc|$4__^MOp8``3OsFdws42=ZCEUb!9eJfw-!|I-SV0pa)Cywd4BcO`KgsP90 z#E!F=j=tsc>RTK=11$YBnG%{A%=TfH)VHJB9wl0#5lL3{sTu?&Lwiws%|01R5#+XY z;DQ;t{S+Os%9fP3*~38QX#TreOrLm;xBN53QjMl2VP02dR3{mH;HxIP@>aQ7CFDp? znbV=7A9Oxkcv+o}7Md>a$=}-dFiol`#=H9elx${rQwL{f zDXrR0=fH0{!1seABO{ZOWVmuKA6-le?s#zj*(#RvVfAL zL08aP@Z8ZFe?MG^c@rkbWT*B zh^ek3Ktd!=u&GlFo3(z4uk$i(KXePOlhImLfdlm+_#GBgUwg9~Tm|e{CS=M`hqT~v z9QM%IULe?>U{#`3s`VHg`;k=n20t8tNKvtzOmKvFZn@3>F6n`$86CGLrW4X%P3fspEMbWil!|w#V+pah(D{)^{vy{WJW%b4ee+ ziD17(EiK0T6cdD-XXa49N<&k!Md10*8d0LBB<;4xOuZS!vqT&Pv zaYeD!O>Dg_ikgT98w_dy_r-~aMEpZFh4MTMj~kPO#JJTc#^GzsC$b;W?oUL6l=pbk z6@-*}5SGVE<-=Pd=bG;Loz)?{t(i+Oh}GDM?fm`5pgITQ{)k|J-5IFAcQOGWjeo0l zfmZklQ+^Kt=jRQW@7(|GkM_?{>?8;HF2u8_jUglvFN>csPv=-A0?JelKh3yRI9q?H ztXB$OM>UOvKoRGi^M_mV_s+asQ{md#r$iJKqOm*#=9Pistt;KRFL=$!5vVU_^OY@n ztr8V`WarBJV;B6huq^E^XU%`@5`14mMD+vTO&~1VdyT^}Wh>X8SQ1zxXBe{Lg`q z)L0zy1lMx#E@X^1rvOVxfxM&o-i&PHDMBkyN3?aYSd%!N{OF>LoTFcUO${MqyTp>5 zQE{b4Y~&|J_*aj(OfTH01=McDk0+njDXD$-P-!@!S5E9XbKhvZ?Deea0JL}52CoT53FM3m->4`)o63eJERU*s z@D3<_;i3BVav{s~c7h|DZMDq3exS@xPkd?Aio~jL^%VJk8dE*;#y?`$+V94$j()V> zOn4)Z-$3nXmRC0mHWj{|v0wdX4Zn3bX3uO>bNL3R{Ou&cglGrCP%cX3$p_>u5Ib z(BMtB@Pk<CDVh z_?CIC`xJS$v1hKb8mn>EFM@Oetb^*N+pS@$Y&fylCzOiayl7_W^rO zI13yVnwk79Z!On~wO<$y_GH9~$|aUu+G;m%X@MJ+Dn9+*3DXaHIALbC(Ms7%R~;fFclO~Ubf0LX@D9FKk!)(xY_&D}0Fd@GEq;u3Mc z)xY##bPw^nBKvBsLOV|_t#wl=Xu+SY%9y3Y91cT5>TrTo2b_5nL__+(p#MPo_~ZR# z9pHUG(cF|S;XvthM=U8lxnnSZO82^KJCXS0!S^rIzbDH_pZ^l+>5wlen>y83%L}rI z1`3PWiiFjRnBGDDs|<*L!25$|d2l-3N|HPCL);rY+ln{V43svA*UCn+H zs(;f&_@Ct-m|LLq7sBbL@BnQD{9wF1nl#*dUS9NBa`p=P!IR#gBT;hz9g!kT)dIKp zy^i(qM3bCoM7*c~g_KLZbFc3Q`@RO_N;5Yk|2>vP$M-g}_ffLkI-tk1H5iF|8AktB z-SJ;ImY>{O4(}e2EolHC5jXMdPd$f!O5}flEjIoG7s5* zJNy5+FcG?RWCmsZFQJM51)}XYBXDz@gYD%0U0!f&Yqk?Vfg18fr6p%OV8>L~cH9e6 zjIkJAzo9?JiJa)dmhaUvtK4{#=N-|FcB;_;2GU6XeMJGj3|P(a3EzK+AppS){U;y_ z(7Jb3{~+3dxf;+~;#oYH41uTn5#vsIvu@gAv_GCJK~8Xi@yu0x2OR)DpUh}z zW1;$^byzZVY?%gh9)4nrzYxiX-aOe&U=4>c%-k{LmEp~Pv2?UIX`UXZWApE^O__JOvc^MqO zI?kFMNR?!DQ^et%#hMP}YUS1(k=X}wpHpnnwmRxmb|2sWS@ZHZziO^?*qkxdcVeD= zVlgtOJfQyW5DtuKPY|lFc|Z(c`}J&|65S^XqbP9hiGaF(m`bOSc%N2LNa5c-DjfYf zdjx@eb^C${s9Yi^=^XQ(`$W9P5m03%+mtf+71DljDsIaw#)8pqs^7j)YDXVATUA|V zwk-4|Pj0BF)zR8mn8_W4z%yC>Yyb?}Cn=XKyJV~Pf-0CfT<0_H0bCslV}91}Ol*ZO zC)eng-r2gD9#r$DREO>i|J~&mB(>Euc;=5(8w`uAdwq>CU77AI1ZX!bG-6k)EGBGR zKz)g76Fi~#R3Ez%p&0c zqvCj=i-4+DKVyFEGPF*@10^UiVkFxGX-_d89nDuNjOCVRSro!b^(Z!mm69cg$EQyHTvw;d4%|8Q1*IPE1QP;Rm2``<5NRd8a)I@zLUV_&(JRuX8 zAUtWAQYudctUT93O=5$$oDfgy`AT2w1J6@W{@&V^j956G`(4Gxu8 zIYtaG-+Obj>sx`W6GALP*X1L5YRpa;t6>Ugm;rIs2Pc}iBnH=|BLj^Dh9jK8(ARZs z-&|t4T`iNHf+K#R7ijoapzIa(U&YWqN*vTk)@6AH5- zs7Q(fUQQFM^06Qn6Tzm|M4Y>ummW7oe?3#Dmdt{NHlC3rvlF$ocl9Ahu?bBj_P*nX z0GP7D0^+x=JbuU%yeXABWo0J~xsqtC3Q!!0ij=nEHp@$KmXd|u3S15Hdcxnu1?6cb z1XsYmLeEkWmt!W(*VSPb@VQ88O`uxZLbd&Q5CSj(dGF zx-di$9ZrWtMx!7>O#S-&bNJ)yV0fL+ckX??+95xxO)fYM=)Sjm16x|>aGW*pkl+<@ zsKit`ieBrDixrvl!!Gsd_9?zr#EC({Ti}x)WVF3_uanUEP){?Z<$+!w53t<@c=VPB z_;l3ta?sR~gDDiWJs)gaTSfU1QSgm7gv(XrACDrp5{2UD$3liLMad-d%MJ>ov{h)J z3iub0?d8IVtSnekdeK|(os_Hb-W0t(=`b}Z2_Nt&F_fGF64R;Nyw~EoiXZ#4yhc&)OA^vq2E;pt zs}M@bNX9L9QgW@|h)i8^NvwKnTex{UarJNIL>X#yjqq8_K>@ml3!Zih-5+cc*2cG@ z`y{^Sf^F)hZ*LZ3Rw#1D>sRLzOim#4En8gVDM1Nw#mG*VsWi?NNYeF0*;ZOycqu}M zkq6YuRiZ}CcCU54mj*5vCp+4l4Y*OB)N$tha+9fIQ*5s#@MV>Fwmu?832AnsXKQSp z-77jO?3T;KiXB;cJR7eWD-4GN0>q4D8jIoaHseLX_r{nE@-!72g+Av}#y?ajSAl13 zA;G?GJp-b;)*p1^JFn-;Adpe}&y0Ihg{pM|IqdJ917R*$(u)Y(K?;_bJKgO~9;^KT zx=B_Q5Z7!sPmw8(J-q$g1B%`2JCyLu0aZfW{F>JvI_MzVmX;f(pMgfg-;e54 zRgtoOgNdur+E(+8xV6^#H_j$0iYhUZ_=}U&s(b|SV@;Vv1jseog|+Kr&$m2l*>Dwb z;1zH*6#EDj@ETI6LJ}~$%Hkph3lelE?ZQ=(ztEr*uhN8E@B zdXPs%A%`;C)E`e7;L^B#Z%PDA?VO3>r_lKIdFQE3f0pIT4mWHa@pyj3XKMnzT`XEf zu{wSUy2IAuq25f0adfzSZ-kfdpRK|uKn17}YPMKhSS(v$N9L<7l|{jB7~vCyCx~e% z7AobM%AYmpEqCgISt1s}8$4gudM5e>IH@oH_@fHL5e?qNQQdr$W0g7@m8WHHShY10 zb%a(?WGeVwdo{J1dI`w&B9aq_CC}(Mt2KIFxo?xf_~+#){Hh>SF$!K^Kp3GA^)t!$GdVoM!CqTsJ!Q9 ztgU;0Hi<@otyQ)BJ>dywB&8gG;{*L}YIWUijuj^F-n*@&XR&+&6PixDs zGTSknqaSey5(MS*U8uhicmeKdpyd*MEttq@+as^$V9lRTHG0M#)Bt(VI$T(M2;u;c z(d~m*jtJmK57g~1Rdfy#gZZ&T(Y!q~dzGJNR~5vM5%DfrpIE>C8Z(d??e9WGt1wz% zM-~fBjiM+h3uO-bJc{pVv_QKkl>#ATMcN5mdScQocgYsDH;95w6YJoi*nV=(#I*iqnR01 z2DH)LPR3AWgtle70qsFlLMkI7fKtnz(S=9WYD*otT zutpT0S+I54%HuJNtmG zQhhyMGTBkLW%yhOq5CQsy zVD>oo@b4&rVGA&;D{adMH_#LTon+w&sd+67D9T~v=96_>TCJH_@=8loCoHKhHn>&N z*V=F!s6MsvU7Pxqo+^qLTqSKEDV)@4|AgUF(d?_f*v>gFv;R_fz@utGbMsCZPe}g8 z>;*C49XIzuje4k01I)0;=(XA~9qA7;w!zWwn9^?l;!GeA+(hGjkVoCM+N^m9`mc>c zPZrJhk3(6Kez`c<;_oW6pXArAx^N#e@ea3MX8{*+oUWVnFO5d&zKOW-;J;o|XJr#s zD!e3Nl7u)2>dPV2bp}_u-Ml_eOGn@-L*g~l_w%$VR6ojzkI)`bGL=>3fhHb~-DM0ZaLAk&7Uo2z`YKEz*Fw}Auq|5a6Sz*tmrJz_CP{1>SH^PS;I zKpU^$+!)BvEi+(1cHP!#nopw&OfdeSLNoZb=|egNb2!C;aoaHC2kGdbbhOc+%|KXd zgv5!EP@6s>r(G{2=m40NGS3F?=GR4d;ZzamExjMBu(b^KN4R~dC# zoiU=|#9)Xk-B$ZUy#|&6)1qe2i#^23N?zX2e@d?>oIE7?42RoorsLotVX>bgWv!mv z{edFf&F{b$RHM9$lP8^P zF2HFpUcqu2QkP-JqHST00_f;WH*Yr@g2?NtEOg`quPvY`H4&$#+U#kFYN&C;XC?De z9&8o&Mq`d8*OPb{WvpAJK}AKxEG_sY`!Q63pPD->Sqye)?A%*r+@5vQ1KOBfm9g8N?o}VmOPFZf~5e`it3Jufz48 zK74Tbc9ljW1>#ioEQ@mJ&6LSvu_dDisL{6gFkoBBXo`zJfzm=)2~~#owI!CL{bBlDh`pe{dwg{$u|xCcP!puG>DIzll!&IUM{| zn(~wG`^RVk{dX1}1RCwV?cx8!r~E&1ktyOR^^d1G`XyE2^6^K2mTBPOYEoHB)n+vM z-O_s;9avcQCIX#Ud};U90!rp9MHKQozIq1Wt07jE4F4w^^0A|<1v}ZPxH~vDg>Gsu zvrR_NX6uXYtc*TufV=7k{=r{)!E`4UrN47nqoVk~u+s|Zp+JW`xL)#qm3vMKtUB-R zn+V=^?-8Dpgp5KqzwDJ?-MidCT)*qj>v=yo6@bOaZGXHg#7i(4+le~@n6 zWvo)mGB?}Z@p7gRcA-oeREKIqH=rR=~rK%S5@;O3=s1%25RIbTU0{0ieta@V?}q}XfX8UOHV)LAZf?^{%tz5UGU00z6g zv4g|Z>z`8n0#hi=A1*x@h%-lLXV^@lUvE@4yhqMF&usWU;Z5T?5Tz1!4(gXP*5aNP zZOQ?q!fye5z1Fs$EIlCmJJ31&t=0~X`nq?35R`KH#JK>@XsMQe!qPu^>uSlw{vG2*gK#}i32rVkMRDwafco3hz_@?CbW;hE+- zB)aE=n@S1D6Mqp?-q4!BZ)8zOwi9sewo>;RJN~5S_|r@jU@1l`b#v4hfa>=@f&V`( z(Ep_HyXl61nZgak&4}bM4!%W|LYgWT5pxVs!e8@*6(cP>)XQ6)v*V+0iv|HxvX%Dr}XB!CoqQ@R4GCeqqL%%keRRqnZzn$NHCwuPZftM%nDsQ9?B39K!_b$_tdm9$+bc;#H5R z1=Y`3R|H;$$7w(`zE+6rrSvU6o?1{z->%vPPOS>p(H}J7p=^<(0`*J%oSx&cRWHJ>f8LT0dhZ_TglcTKPB;|$W*o_#fkyj%_I=M!2K4_AVebLd)E2c3V*#!OQE4hose%*{=~bmj zmo8n9ju7cR0THDLNSEHbfYMut^xm7agx(=QfI#YZxc7SB_xoqQ`Ogf@B$L@^owfH~ zXYKW@^{lM1@xrzcF3F5t=1dmd=~*3Po0RBbM-w)$@wX^Zt`^u;L9&w{G!C z%$UNdmF+DDy?H6uqPg0RdKX9{udm0Pp_oIFpi-y5@z+yDc*meB`|e3Mj`Rc?FeUm;3So}ZW4mP)zvISgAH=!YKeY$Fc} z)99r{4*fU|*vLy+4s36F_CFAwQ5?6kKN1V2b$5B*Uscx~CD@bke)$E9(`B*&-orPy znI2yW{X+gB*Gj%a>9A|IyM7wXGWd?fXIjXU0m10rpDL=!$j-?mh}zS2urxLDP%}rM zCT2?$&3b3w^@;n;J&eDWM@A);V0Qk?bye3kyHa`&wb4OTu+S83DR|aS1KcUXO3~-O~2RxXWhiD8z6%hVFrvq0u;j=9Z?k67$dX z=0nG)>{Z!tKzxfOxm7mz2KKNZkgkBx$i4Q@b>8846GnIHkW~6xYy!cyLN$s(VQ+8z z9GPt2ixTA=Y2OKnrLrKq;QYW`@L~`xwZNODzo)>F9da&n59g99Sthhjz0Q6F_H@pj zj+qKaJJLX3?t?q+$)k(%Vjp-^$p65~UA8~2V#TCMe z@Tpt;t>R_N_LXIo7vX~q*uA>hA-QJVj&V7Mo4$TUf;|#fjfI>XHy+*;1J+LG9vivZ z;GXSG(Y2fOA$0!0qPc%xoJ~vN&2TXbnW|*;f$Z0+oRz5BXxB=doH6mjhP#M*sJMg3 zY2qik@GhPkxDoZ#M$%^L5@cdR&jg}7=vF}*GZX~T6 zJsM=0+71QQbbCin$XFR2^D?foR4{efh72}q-=v#2E+8Z>OU( z)g7f9hJgbk_fMdqzh&ccQKo<@SHHew4t(|~jOlS`D6p8-{?X(r=TZZuEPrGEd(TaY z2eE5nD2@)WGk9q(Pf%rw!mCN}De5Zncgl3;acEEx`T@UNz;&`KhDH?Rfv56+rBBk< zLLN0Q7Q?W~w+&lrIjg>WTn=c?wCzbRS(EpV*Q_iLU1Mo&gPLx(Fb8=~_`_ zslLCc{nfJ%7U_g40GYN!=>L&v;J?`gWGWePL5wC1_U8q{x_ONBwpxJceS+j#O8c$f zbS3JWUz2uSXE|eG813z9ki5ZB;*00cK1}MhJ-hF5>q9|x2NDt5)t~AaFWGY2#xxSg z;s&U(8BpVI267fy@14811Ofs<;TZ(g4Og~U`=xfRpUaQ*~o*xtPYSn2q(d$oEQ(TY%A`6)S-Z=zF; zS^0BNj8|3=n~Rh3*Y}U@95sPWR2jElPyTacEqhR@SAfd3@CAa?1KK(Rhi@rhF*<9D+H&X67axoL<#`IhJtvKb2&0yM9Jj(AIG+^vY-|Z7MVK3*QiCJ zmQ;%St2RYuo3Nm{AG;lw9_{s+XEj{dh^6$@qwt8FoA)-)5p?>XUxDy)=f5#F+%lL? z!HqBid<88YQ)Ft(pP~qo`IX=R-bU1?#&xGdQwAC`G4(hR+}a_0tF%w`{E6bkUCU0x<5beo+A!I|tJ_`l!KUJ_a0`Y19I*7cB64xq z=|Byl%v~Du4Bdl}$caLFPJX$uP6;O+c`LJJawvI{1ILTFnF|#+l2?g*$9+ISk)h=4 zaO7FrK&?;Z3H=g}zv}p_OT!gEq{pME8ur)};rV}J0k8Nw8l6y|;zjV*vjZ?LamcJk zrDttKsizdLbv@Fr=rng(^6Xl9uFmWDEr3O9{iiSV!KR^FY6-;baVib*;dPmRN0LQw zN#jzodnXH}|3hj>F8@y@qG_bnpL;IU{Y{7QKl$GzPc)k^Vm4*)LtzM+CZ7&g7ljWa zR5z0M2|*$tZ?zk5FUdN1f#;LmOVUqgKbg*rF#+q6;fh@(6}n4~HurTL5^ zrR_d|0refoOvg*Z^Zfg-4Mds!Qgh<5u-3vKO2&s5^2n5>`@j%0AmOA@yS+r48_eTquPYod8f~5&7O<(1%tS&fZ7dvB3xm#-gf|6DcQ=e z%=#KB$GSqm+TUV({O&f>)5(=t=OdCMgG7L^RD`gouT6ISHvwy6b}MOU=nS(q0P1Po z^_)9P4sX^uJtPIfX144ybz6t~<~Kk}L5yB(^!=K9x&8 zzZl^H8#7{pHpaspz?caSZrDzlctiuw4vfF7tDovYApLJx{G5DZ2Y%%NpwoflL^Fo- z!DSObUCx(=5njs^Fl@ZX*frQ0Mup|=jB|mfsl<9;M&pLd`K;YUV-p7_KR+X}6%ZM~ zV~Q%9Eu@R@k_;QJbWIGI`QIIJoicf<%Q=;t2NUCVhoR7b&G!LGK z#KxzpP0T2+r?gYt@2gz~P|qO~T=f+3XHWUs-MYR;cdByep}xVxrnl=YQzn=RLH;xG z^F{DUG}9ls#7}-Bh-CPQPcwdC&~-?VdEz>WE$`v-79Ag+?0kogPYJmWihNdE`V>ie z=JB08Q^L|N)GLb5_jonJ!dsJj<~DD!7Sd$Sm(_Fr#_do!`=k}oL$AUcZY0AND;Ea+ zE(avA$&`g@H~#8j3YBAtewk~^L1ff}E+*#;l{YtO#wWzVBjbTubN!~1UIn0cq}`PH z(!oSxMq+I1FOyHko|~jL?gOhpZNj-anteySqX8`gsSDQt4TLB9j}ec6vfiyVU%H{E zpVeA}I+Oh*BAZFO?$U*F2%k>GT%WVrI8HR#4^~+RiYhYQ>-IePaWSiaN=Zo00Lj1y zhaj=@(C;gK1azaRSRpEhJX6LMz5{0Ls73fql;3r1Wb~M67{D)zl;c{h5SAqOWc%JT zqPMOMRg0Zlf~PXX9OJWRS8W~<4^9o<&e-S(R>b3C4uhx%^$5!cm7P^Xh1Qm&fVew- zFq7}NLw*3Q%R`!;<^eZjCCj8cF&44hSa8NN*0n_<_a7+xQy4wlo0M0y@IB0>C_7A(kAu5l941b87G)Wy8>a$pEH?Ht z_TQVfiQ@Nb;c|*)2hu$4^Gnu*=4$Yb_`mxM0v|KWnt;;p6cG)zKOWC3NQct->QulF(DeEG+LXpiV?bbb_$FWv9HVq@rQ&})i8Yd*GKnb@%C)tejc;B z6?$m0e`U_3J0B@&+>M_nmAIPb2{(`|wlk}HY)t|THt*Xhx;~Q8U43@KTKszwMW3Nl z@8h-DQn}(GhEA`u?gC?WfT#@CHD}xsbQXk^%3u;c?n|7gH27C?+bd%lM8G8c$0LZU z*Z{WlPv7gbQ84@fvAd@c%ph?{U$vG#7|SnyNN?ZL{A8z%-20KS2(00(JC=V7cYyNr zU(ROLXvQ=M6$5<*|Gw^T3T!a@Z=+a(6*Gdr`O5Y^%4A&U4~HSnme;M4Y{oUE^qEdH zzlBJ<2qe;eK(|uI`?9v(IlFZr_eTNeYzsiEwPtNDV{=aLiugiszV^&S5@XLRYs1W z@xm(UWXG)OkTNxk?E9)V&O>v9j|Jc@Xp6XfdFG2>*!ZAA;ZBI5E^&}kgAcOA4+c8( z{e5k)gZw5mqGN@OM2UR>Tca#nhxb}E0-M_aO?rNgf{1}r= zmkn{>CxSPzETrJrS7B$jS~VcWZd9Ro%45FG`6{P~hF9oIW0Ci^hrVI#;zKPB>WhV! zrC@_i&Q%L|+UzF&t~WmqmzeR?o0G(2{yc~5)hGdOg%tREKb-bu-&<2}LT2tU^O))W z@x#S(6*G>@Z)_pho_1v}mjy6M;+4gk@I91XXuT6K^U&GE0Gu&a#nVz6ecwRvla*D9 zJ%(wx*2nW=sM{1o`jifm<|{4rZY$Bs$~$GPq#WzqpM?sQTnf_5-<{km*o{zr^6*3T)&8zqR0P7B#;ra?94O~hiSM8dO zng9Gfp+9y|P0sW}Dd0%_tMEd8ArdJNTvF_h2(tVGsbboaF8`CI$-!L~U|MAxZT4r| z$VTL=rEru7+_)hdei!cd??@!YoLxz8$umKinX}m%r(eTgOA-)K!hf2*OL9cV55w%%n$fY(c+Bn=y6C#D$^?=p|RfITW=@h?np~v-<* zEW1o&%+BF;U!@m6FM0MW7;gRmuywbV=s)f{^CzkbaL@4u4kn zKFBJ;F_A$;Cjkvr*_+!xj&ci8T`>>)`r}r8_{f*7BXEH_F|5PUrNNV1o#O&Yq0WJ3 zL4EZr{TZ!M!nMJYd?%z%m7e_A#CKuZ?C%;!hf=$~no?6OiYzT#S0TF@Ep@`)4Yr9{YuYWB%3N9mzb*T0*dPY- z^nU0%X=X57(OxAFo&3hzF|?MKME0WdlPT_^m-hA4zdOW9izh@#(@ScoZ3Tr$X*HCi zFS@_eqPWQW?aFi*Q^1KuLEV5Vji#>EVf;+=E<12`=G(%$9RKSOQF$#1zGj$ol&lV$#3r$U-jRn0nk8GiHiIYo+34`G{-|=W@ir8YT_FwRQ_j` z&JBsC)C%AC203)vZ#1b_+${P)?>LrE@q(Q4#6~QLQpPW}{{c+7aj18&k%CG|ZM+zx z&?}$-97q5urv=NloOd|Z6W64ZC#xpNm1h&G63AJaV8}iG z&ZqcUX7Ih3h+i!3O6GxA-8F#aDJ);KO3Q$+ncW-&9wLYtw@_k+-=c$^b{IL;%k#Md z4B=r)nh&i*uVyFL$GwxEj61VLr%K?uwnP#pv>bet-7enBWWJ{3w%RjCvmgV$Cq_A-mY*w)zI9!3qu%pF?+pBp zy?q%lV-qe3{YTtAk1~$|opW4!k-m@QbH)e3(^xD`qvaoDt9z*zy%PGde?=D_H-2*H zJ+|Db@%zV7WSEiNH}vFVR0>la96_>HDz0p`n&N!f;fz-@vqlQNvmsTD`hcXqW%ny! zcm5iaH*oeQ?JZHuCLM{i<$cAJasC2Z0s8-HauH}5ECR!F3Hc-C2#>N^5J2KzF}XES z0`xf$N}{_fz=g{GP{_f(O{y!QRX_dPZDm{=j2^d_@G zYaOoNgjQjVYydmjmZ`%e(YZ#_m2Y;#J@MGWh411VQ2*yWVjB)H6Z9wtzyCUGR(*8= z7MQZC?et?5D-oZrc1=cPG&M!@P{IL<*7Z5*tk+0AOyX?zov+L?xMDXBL!hQI{G4<#yPp6xdOl8}GwSUVqy zJe`>tWofCOV9&5stGb&?llJA#zZS#Z?`rBLY!6T9%L={B$I{-_Di!S3+I?^0DsZmBGkcuZvmOMQ(oM)z15+%71sagoVDr#V%SlQ1zJ- z$|8R1NAW6;z5djjs=5ms7IW;JPO#mMohwuv-2xjxCkRuIO{;5=L+xle1=TQsw_WGv zT}=btwS$>k!5>E6`Q58thv7ETeJ57<>4+OEMa;r$3T*tBn{Iu1<1M=D+_^M?!0gxb zp!A4KM^evS-EUJc)u9Vz&F8gwApDjrjS0)%X~&+;^KkUomM?gZ0Xxmlu#G!P7Ya0} z&hNhe^GoWTk_^Hw?8~(Fnj#*1m-&F825%Lfm8noClThD{tI?`Af>J+BjJ+_#(>yO` zKKY$0b(Ri&Vz?q;W9Ef<(KEpC1k4{_(k~(c*ytyH@|}(3ZX1La(yLEgAg4}ddK}moBkx%wcLo>j;LoK!+MvtkD;H*6?Q+XivvkhBH#~|&dVH{ zj>`%*ZCaqGjV0SPH1xtf7dEnDS4ySagpQuuq1mUMuz{;1HlS!z%~C*(yX3{AY^#5! zuvecuf?L$u{INmmke7aUH``zWj$OHuoA?;SlO0o}^V(@ZqhU^k=3>NlF1K$uc3V5T z)iGH~nEvHb>~pzdTbYN$-<6kio=WRJbvj~CHzbc&?juX)WuH%cbGWuOt*KONJPpoF zc*8-&{Ea^8!)~9>h|7<(5KJER1HiX+xt2h`yHPve89@)KUrnH( z7Y^|;6C*xC`XZVgCd+OqS+?gsq^^`B)l}1&yp}L?uxU*-+8vtVMJx?RqETqX7zz~2 z8Q#B@A}wxtBmsSjl`aPoqCYc0_Po2Wv0zHw#SPE&TAe{C;nOr2Kf(+(SF_tYm?}R> z;a$h~UGVON(-2V93z_UH&$N+>vjflWC2 zow@s)qH?&=&k&irLg)tiX6}qU+_G?BI^2-LnmfTLDC z#^@zou)bJ*Jqa|SPCUl%>Vy~LiHdG|J?0e>e6#fnJKphfnrPy^0msTx)x& zA4V-i$uJ9A_Y2su4%4JOjIUp`G?i3OLrS_0np!N`vm*7c3h(hgdHd;MrFWT+mXTOk z@hv5gd0M~A!AUi*=u@89Z?)CgmOVIu&ji2fbasvc_`2jc>J~cpT7nmio|*s19W)#N zz^Q)`0e9^NuNqmbm#M2zuXmb#<>oVgSja+zkaDGk)8vSky{Cev5KD(+Rm*2)8M}?J zcqmNP`vXSlMV4FM(=Dal#^DrsE=O3K`r1Y%|LcNY9S%d<-Ot=Q9E@-N@nc@rD=+0J zWwL#1Pf}g#`GQ_lsEyUDXX)t$`_G4{(+J6r#^W*3McJhO_h`*vsmi=1c^B2U` zAeLACZX)F6t>R|#s&BqP=MT6`AMfEHz01*A6RMdlh9QVH*dn3ue({-F5vkRq>~{Vt z0bJo*%GYN{hS81aGSW2d8~n71X;=uY1{PUBJZT++GN9*d#r((mzSxVa?sO5xhlX*&IXp;v)3SI3&u}T4MLwG z+rfM4>j94l*v&>6iMj7~YdJG?kG#*keqQ94^fz&Kj{2!{{rqi7|A9ehW1eN8d8*MK z+j&3-e-AoHTu)t@Yp!$6EfXyF!gtyb2`S;J*I;gGo8KW!E(B%=fp3*bJ5quT zmz)(q*Sv%2K|5|hXH1bHf`9sNxoqRFDtH`K_A8ybi6mbrq~oXI%3+Uyt2_c96AM`{ z{YK>Z*|Utq#SLiItR>30=Q9XZyk-z{POd!N8^!-(tvSQXe1mG#>L0d_A(Gj)y9f9_ zEV9Z-oiz6vGr@yxk_?u46smu1$bGJSi6`xqNZsE!6r{>1H6Ml=;NPM^Mrib8VHg1#+j93}D8G)bedgZ=ImSalK1wBBJ5o(=YGL@f+zW zdho~6<8?2yxm<>icU9NL&wA z0D;@Y^PS}DOJ#x%nq2a5QmrjPpA*VVOslny{r67~Ug*a;72N{ue|-=sFLd-_#=FJy zYP<)%!9{oO^XlaQV{J}!{5#}@(xUo3B#@I9<~YCpS@ zgCBDW1*X_&f6eruz72}Y?MWMq9r~^}(R6J~CH&O;VCaIrU+q}q6e?seDFb}Og^c{= z<78}#qp~;qzJldH{Q$d|BkgN#<6X2tt-<5HKtsg$BZNa%D9Y)=75%m+m#(}3Hcx!) z2eb8L^#g-a(F)f!7=E#5q9eODUOgFO4r%5)a!{8TrB_0uFi9%jpdy)m!a_Qdp<-P^ zqxslVqqOKXoAn+|hD>V;*1R04!AW?PvsIqUNi~*iHn-~MmtCtE)+U2-UjN_#UQG;N zeKG5|l1@Bi4$c7$*P>1`91#evJw_`pg<}Za8FWZ29);>dg=J1FZY%L#_{X>JU zbB{?u-;zzbk8zZmMjCOrw*Wda+L&6jr?Xzx%tSKL+GgH!$&zW>S&+2%#nEXcL*R+R zJgfXWme}O#DKYHi6I14Subr13lUuM=y#C^v<1M?CjWv@FdM5NJ*XQ2b5E60jO7C6m zAu-B%pDN!iFZB3bREGDO-E?c<=ZJ$f1@?ocHTyV}xB(a9k`G2YveIr$L5j^E8%6=a zmlU&y7`%}2t1Da<4Wg7_sYUzm?efufQcUNPt(KdJue1x^K$B%sW{8@1ID)5@3&znc zpEI17Zo0chd~B4DN&&C273lDum5mlg!;nij|K-YZh0xc4NH)*|Zhv*LwM~X&G*b1h(WbdKFF`TXamu`)7Vq)Wajf zJT1=`H4Be-F}~33SB}jt+*1bFekuZwL6LD*9RJjpUf<2!S=^&w=+i0Y#fgcSb+SWE zCHKh!Z2GqZf6u`jSc>aPw5@fBhzyj;#}467#fot!EFe-;;t7 zm4|)1<&`Akb&D{5FQ=&%E5AqW07ouzQP8{IctYMWO5WX0dj&by>mp|N`UyJq^O4n} zZyM^WAVd?#%YR!qnrXV+dv?_UJLTCI-ana*I;ja^TXT%yx?&^8EnWcGi|Ro3xQ)d9 zntR{7!!%5VD@pZ-e{(}^4)C2^>r~Uni|l>N>dV*2knUoRD|;AE(~&Dy5{CvoEcH6J zD9+NeM+C!p+4M%4XNga+2iY1_F@JxRr^ z-kabX)_oTmBvU{1PjYLg#*vXOzbl;sEXKQg<3-tONjs#pRZ2Y<<4evXcJ?Y40_&kl zK-h#!z6e9h07N&%EW5vItBYA}3}x)qTi#-k% zbpt#G9(!CJq(j6^uioH1EO&@_6dxv7W}z9A7!HOk#VO5(v9{|O{&*ePRz`rJ2yOh| zZF#wo{6a{ww>$9f36ixe%!!tzM*~?Q5q`t^5EM)Ur<-SH3?6p$jOXLyt2SQ?&$(KQ zTZ_4r?xnEPu65SU8Y%Hm?2V) zZfLSB@7_1C?Jw;H(VtC|!gj^qo#eeq_EDHQWpL*`b^Ee)RSPK9ywV zZFGgWM&AJ#Ie&l3B@(fx)`GGeUPk#^na1h~yarEUOWFGcFxQv;f4Q}DDA!D#zEDnl z5^i%qjL>yo_RoqmGPPU+e|&X=Sux?GU<#rVy*G$sCoax=zbJTr&6=A+wq#=1Ta8xF zW`E(qU|6pNC@#c+9()!6G1^e0ByeZcE)3hlJBt5OlizJxkdT-6!B4=F-VO)WPjF0x z$zXU4Z}dkfpGQAj)Y6vp!|n#?5%0Ahf@d%%+ZOg6VKgQB<+MpaGs9h=r(-gqMKLyfd)@T_|8!|YiEDQ} z7FXv`q3`v(Hem?7q)qtnnMcg2p693*)=y2Dg0X|G8W7ZYb?R&51lJ#)xy4s%t?R9^ zYRB&pJ9deO2cbC=agTA`QOx@}W^zd9^+eYu{9(Gkv{#Smy1(A1u%~{VLu*LwtKU%I zBIOr23K!dVa$JE-n@{alwCzP0-52Z5RGK8fcZ|G7ixMUD!Lt4MrAlm*nd4T-E`-?O zG7Ek)2sfq6Mo0Im5)H~ON)u&rb38pn_LUB*k*Ep%tSn2VMZqOiA~ zBNc`O*z@}1{PSh1HeRDu5_xZ(*~#G5o%c-5#D5*f=-(dskTf23b8=dGYzX&5+uLX( z#y>yfv3bX?=>g*)*2Nb%`!v$gxp42R-%>6ozSZ`=F8;K(VFjg-LHx-j`sfJ&EUkPK zH7LTKg}tjZ`m4go5p2L6n*`tWkU-T1KW8sjNlv94+7M04UXie2Wkg;EX-gx~0e-+f&k z1bSjKh`Rv|JPA8CGT4JCHSgv4bttKy%U?J}#Mz{`D`bC)C?pfM-V!8;@Wq?Ln!OeF z;h&(DCo=iqjcF9YPsvuav48HzgztV6+PD^dXtdQdbGI7}uN`fair2P)?MQA&!HftC z=88-?VTSWTXg($p`03au{+mg=HEI}ztpwOnEmCszYZlCybN#4@GU~mPw{2So^J!x@ z5ahRbz7!g4qOqerl;SWBZIPz=-GKya#Gd4o_H@_!!RT=s@Odp^e4f6@a#>Au-8L7n z>F#B@O|B5>Ay=)$6xG_NCXG{+n}2;f6FDLQu(NaotIilBVMonOQH9CUgb5qgsvo;!Bnop1DWR={#Mhf zF4VIsAZWuu-CJPm41rG^%&;?_Fzh^F{^j}J&pCI6{ufHtDPmL-Ny*5a`r))m*ls?- z1}Q|`h}Y);nDD;>U3a8ocfRLh;l^CUIg>B5%^bVuN}nhNDvhVXTg8>QVWk`IrY8ed z=E>l%DKh%EsckxTO{Ns#);abXJV)T~uhgFMr$l^`jKvQ6rG%)Z5Dq`S3~aU6K91P< z6Wq6dQz0o>^j64#vp(NIF<+K6`XY^6Z=qqPWGYWdsHL{rRq9W%)DN$7a=p3(MAmuI zS})Sbg;5u>YNgtjNtjE`}FcyKMdNh7h8}=esRVzewo6 z!&R!%anAYWu>FWHR%T8{uQLzbx%;r+#{NPeQ?zLrFV|HCy7`$e6tcT`CKN(tUr z9Jrbh0@3>`t`C^rnP#$c)J|yQsx45m3jJRo(Xfs(mJbF1y_w#>QyW9XizYD5>d%Et z9%LEXleT=PGT?pnEI;6vaWo6*RtWXYZzZu@k5xFe-z2D?&t8?R_kE?n*7q?NgROzT zMN4f?7WuIHi{d{DiK)=sWs^$`?<-wLsbgt}!A~nDWu?Y!RXZ@nRsdQB} zdk+{#iF+05D+_Xz)j|i{D34M9(XQa&vBt#quje(LJENYRD{F2)dU3ULz4FaMyL_EMjCkJF@x&g5H@BjBCTikzX0@I>s$3D`-2iGu4~Ck&QSHmw^5FoI zKIwnfFUZ%lGm$8AN<*!Wo05=+>=IDq^BG9Yi5U?G#8Tm)-}%EAePQhAxZnJZH<*t9 zMV5;TC(e;&XjikoTHIxp%J~`q44*$tl&QeRUHaU6*j&3pNzW&_K^h$@se0?SFpH-^ zvgUsr`H%5A9W&G6QQawjPS2`jZ6Z zrF}?zI!P0o&oJTHaf!EHkEmx4oCe3qH z4(-d*IN{w*`~<0RU*gs&Q4jwSez7Gu`<{~H@BHX-YYXedaP5Thg{cU``_<8Jf`>0| zlG19mvAPSf%)RgEsJS$pkv6Y8SECy@KHpG~!GLPUi@@-ok`*M(k*paZ{R%yc37mhY zJFV#O1_cgq7lSBvL1r@ERLD7IW3es|63o|}{4k|+|LOdCC+Rk10*uP?CtEE*s^kI? z$*wvS!u|6Lk^r8j>S^r3e%uAy=s&p`nPh7uZlC{cUJ2}^=Kq!KpG~M;I9&!oN?raP zAQ>S8S$M%s{<`~wX&8drEvJ+?ydyMX&D7-i(<>M2QZYa5fAA8$YT1~DU5ei8QzEft zW*~O3&L_t1e%cFHY~bgdrI@!Nxu?6x1Y~3WeFgOY4?T3Z9PARM0fBF0;qKS;f5Om_B%|vUN1Be)3Rs0r#j`I4PeCyd{e06_Qa$3LH0z>FA$bL)| zGB4jKVS_M?zOGLdKq@xqHzb7)@k1D2ka8PMa{VX>^qod}y@}<%ZdAQrLqnyWD!Bfo z4H_8l0*4Q0(SwZYl+{)~S)sKaVk8%G>pv zOp8-$nEmWUvj(;m=taP-pVU@wd^fDOXgxg@BD4#NAi>Y3Vrcqy*t{bOnTg%POP9riR35dh?XJfJTTJM8?W>^A}gp*kwp;XfNNK3 zIVhX^u>tOzuCfb)M*yI?WEUqzclXx^>hi#S59g`o+PQ!O%1n55WGWwwN&Qd=Q8 zj)0nq%|MBS8)74OxUOYf`a&<$GF>+!Ay!d1SM>zD5W5^9?DgXSocQFjO-ZPMZ`ddYe&E^}4HYPwlR&`Eg3LgE%k3b)B~C=`=4a2M z{7310Ixs?ZbL6dQ|ME-mW_eHatKFtPgqb!{x)trdJ=@J`rW?Vx>>=ogIL}pNZwOrX zh^310DE&5`FxIIx;7|1VOjwI3zDsl4nmYd8j)a}B+2NG-c;h{P@?Xx0ZIp3#w3^DUk!5Zw zb9{XncGL6nd$}&A>7sG+`nU3>Zy-V=gTUejMTe32cKw>t$NQx@6;SHl!rA+7G-X_Y zvBa>LYuBf_@IoV&?)86_M?-0J&4iwcym*+;8iXrvgf*`imJcHbF}*pq%e4wV=!kCW zN0xHUug}7!yjJI=qu!DfYPDZ@KZZ=?nLjg&q-1XWa%s7k+zIh?>04U|y}$A5+E))8 z|N4v1p2*!Ix2v4e%ON69P#NZ`~Qx_nKD_`0u zMGgrUn$maC=K znNvZ>!gjWt#q8ofYp3y39_~G$H;L$q9rFnDO~>q!ge`>Qt1tPD)%w;nQ9E-^^# zcisb|;`=qsh3F;0xL4i+#m$$;mr6@s%k}t~9y#QYJY)Zn#cD4_3uVf!CN&)lID;sU7*)6`^!rZWRI}Gx z7pHA*Xm;>>k+&cGMi0PwVbY&gzz&7oUwn{{&bx!DJveyH73STNEXN^r??T`@^UXW!@_1r7G3L)wAwm@&r=p=N~Wq zlBpMk*S|=8B?kqkxL*4hB*Stz@et4PGrE`gUhz&jI?2BK>u9U3`V|S2)Z7x|*pcWY zzy9(q#tS5eN~x%i>Ryk$Y)JE%zblo_#qr3TvV}|XAL>F!-VNrrX0+Ppsr#rP&PtYz zjF2*_$ALQy2p4sq12Qzdj<9rs}tB<;dV>Whg z7P;`$2nk1WG-x*;|Eka$uF*;)XO?#E9-U3lgM(RxNywPNpF~ssN_ToXPy6yOLSZC! z{T-#`j|#U4uL*p-nRz(gHvZD&XMf^laVV0&p|w5@e^lUx2dSTxZ-_13F~iI%*QJa| zK#!=@O{?0`0x+Ytkp7joU>f9KBwvl-6P}OyAL)un-8?nShv>1v9;BPr(~P@$@u$&| zYA}_|+AfMr0wf8&8s^ZYQm?bzseGgbJFE0xapSvfI*39~H19-Sw0NN}I%V5S3%wU5 z;TKbRG~@C)ZX;n={o947I&EZ`s|O>Mqe|H1FKBwq((mOd_4*{+B%;1W{1Cl24~>8Q z+p({`?$jp7PKT>$gpa;bPPofN70U#p`;_O(%;sThVM_RaJG9;`&q+0}Y`>cT^AYaf4!{9GV+g@+7 zAF{)YT=}Z$v$|&E>s9XOiRzqa_trdhx~uD0wNLMGI-q|`S0$s>M?Q6!VnU?l$Cht9 zd0>UO|2Hkt=@M786y{5I1En^FCUH*$SbBT&=w^oP`BwGY>!SdFLblP3jK`O{8G&lx z5Xjm<3MUgCui;b2nWwNOkN-b^TOehx+;D?pK@W##0nPX!FWK5O;X}K28u;NC^&^Ln z%u~~UJLNqdv9LY#<`qF-VusBA1ECAAzb^L!bt}|o3MT*bW|!^G9|nB}&hFO#^0(io z6qb4qg-CD_XHS4Lg3#aPU(yjN(wtLh1n>pC3EMolxJwzptNtx;?Q4%zrtZJJx@1uR zp>Sas5T(FS{>Q~MLo4(APo8%-!+BlSKPQ3z+VKLs8vk`)|G()r{vThTcam?HL9Go? zMTOJyCJQ?zo9*2_jbtR?c9?+#+rR4p|GtN8&xyp|5nPIRRy~E#8Iu+plyqHFjn=pq z06sV?@R&I^k)XUcGcuw<^X~yk_8NCFGr;L~l%b z_QD389?^V7nt5ZY9ClvD_xF`)xjo72ka4=ZmqV#D)(n&(E5eX(rrbfzR)K$#)`zXh zZZH(O*qW3>Pm+5Lu;W~uplYAS0B+&?kN1-uv4VI&E~x{O~II^ zoi8DFd}gDK%o+@Zn5|SUsvHi+J;?=hv&~2jf4*l|8H``Lp}V+R@-@f}HkDko9OD(e zXJ$H~iH*9+&Xp{+RxP_frLyTYimG&HjT}I~Z#LB}x#aVb>$c8sku>q5?3}hEAy&l?Lf< zq=xRH2i~pMt=HxKUf=Wmp6}y7WPam5&%O3q$2yK>7`g`Jkpx!R7F-+}6g;d0?ia{CIy5XLZ0ktq7KK@+`S_rT{1W z#Q9?M?%E)u34x#3)EkgFHU?Ly_tf`mMyPV)ONDXR;2nOOZ!5eYbEO66% zpl;KfYcE(|vg*f6j(T*M44TArwN7GZhj@&!;kQ0ytDFBq4|#diTY4Hs!flDXE79<* z)kAsIee&+<7V<(6>~6iGFbxZk4iPjO)TL(Aow6VO^mGkUX}EqaSaeTnmEYelAI)Fd z5+;1`F=6{%Ez+fzc8qh3yDwsD=Ds(6z{I?CJ7P7o4kzizH?1xdIFRve4dFUM(0mZb zg>55LIjUpI9`6b7n{lL!*X#9O^0S-d0t$$1jIf?fWJ?u~J zvi(*6Q1?LGnix5eAt3N=I>z8}7J~O=D4BT_^L}z#2X3 ziS(;ihZyco@fw^`PtxP=YL-M3G_auu*W{Z!g+|%7$T?7n)aj>peJv4(@msbrb~t61 zu*~oIV$Y^x(?MnnXIMQ3g+8uG%%v)yZXJDv7CY0da>2z8yXK+$I3RBUR71v!qs|WT z>&ejF4{bumfs-lI{C&9gIRm@il1K%Q0lRCWmU%9#RHK-SLh0<+eA*;GK7F!tZW%^RO0sT zbkqhU1M3z zn8NlLZ2QiJyl-EiSH5os)w^hgp_z3mWKAiiZ2BQ=$I#Q0F$Egnq1dQhQ$XI-mpPov zKzdjp-y@HuH9CV-4o8^L7wL!PqMHI`6{~YkxEuYZ5ODlhDaBHS`>Nt=Z&tc^i_o$R;#|^KAP)8~z>8_cn;Y zIasc9gs;Ha-*d0|+8%u(a{kc?-q*Ld50CpV3S#_xHNT`r&=?%>Hm1vfSPoeS4~3Am zG-_9nuUyWWWk5_oC|;%T+;0w?N?vG=Qz@pm%hkU)))GB2F7CWhPj-#`wd6`dK$g|F zMnAj3Ok-EiZ?LgFAIDFYoW0^j4~xC~;+?07T+WEj(q+H}%XuS}vk*4$inWDm%wPc z1M6#2mTevgBp11n-l=at=>S!hsS9kNpRYH0v?9OwiCm5zI$2@Fp;8aqyrmBD=m-&T zLdN4!IxnB6PPwq$Aqw+g!km%$ef9pC7-<^>tCs6Fm4S8aj3B-YsIs^8 zLddInO0vCE8EmpWoepwba8=IyXnE(sIzk|Y;Tpa3k2}kxtFId#aCSI+Gp(SAVOEpb>Ib zK~U*&-4@1h2CB(IuF~K-2IiMp*6p2esn2t>!)wtsZIZrD;`F(KCJ7wF`xI^)`+c=I zeXgtRqWY@fCML#wAv0nL&76kCkZi7*WLDkwocFEhpgq(LqT>D<@t!p-!D(GoX4;TB zjv4o~rIYFn{|GWSUrwOtD9%_oRYc&OC&}bimQT>SMU>5ZmDCpU1D0uAtW*oPw zA_o`uS1=sX;>jARGyP|-Tx)OZ`Dn&%78s6+jyXDQOc5c{Nzc_FgB`KFH!CmB&mXFZ z&xFJbf-b$0OnxjXyeNjL1?BK|zA74-vfIR#-Kx7-HeL&eLree)uiBiuL!$}kOw4Mz zPWLs#x$?k;AX=7wsYhhjlKo;!ItF?YLj7DTsY7!swb$;$Qh;mk4pP(P{ONkL43Tiv zL}~H>?(56sL=%>p%7V_M3o$42U^CSBy7L{)Fof1>x2-bi7uEbH7LgxSYu`}UYiDMU z@~tYEoamaw44?IY8d$H(eAvEKUz#wy{K+EZ@D9z+tAeWrSLd!W(bv0LlhY27UD;*8 zKZ9r=Ep9oxej-V#7TAnQZ@fT9^jA_H)1Sn0hrdy-Vn$dG+k%1_~$&%S=u^2rgJNqBPu3o9XlFXs^IrJgT@**m9& zeqxZ%AF!krJ&Go_d(BqlZPE1o0XS|?%NjmAVLt05KBNph>NCSu!w4a-Pp;C5qldjR zK4m(h!Z9b~S`C{BN}^y-3tF~`mkpZ`N068Y@<&>=WkdDc?+o2Or+6@=w&?C)Fi3Oc z%QO4m($7+yr-2qGpl?fX)Ojk=PCNB|xGb51hlj_Yz%HwtfZY3KWp;uSV)Q>kvD~3PmSp zNyX63xnl3lIVMrpod;%mPR(ZBiNYq!FO|V8@qxc52AaFVHHFH0d_iO-Q$D~P1vD^8 zWM_$#?Z@;CyZVDU(&BRr8ftxSrBd_!WSof<>}e{244wOg!L6v*NcjCVKIM&q)1}Ux zuek4SZSaDp3|n1ugSdWA>c!&t^7nCB&e)@<4Kb&h z5D!u#7w`r~-#BRXwK`sOp9@>$@;s{~$k9^;@C+lc9aKwJuvX$(uAQ!c?{i8{p- zw&hv8mKsr_LU=`EXQ=^%U#$gtWO~m)Ls?y6(O0gpOfSG7H3dU*Qop+R>4AFVQ@zgB zmC9S(M0)jVoG(ga=~)!B)XS~AsuC#WEvIe82$T&A<{G#jT>)dY6m+B#aeifsrK1ad z*^UxXR8D&}RylcpSp>L+Vx41#t@_9rbd2k|kd~q*TluBsM@k{kT87EWEq=%5nnB<_ zpX9nT3)HTQ8~^+H&^3eeBPz?XsVlYM@lz$(YfrPqX)wp3OY5ktZ~LnUm512+q>cv; zTZ@#F&L>ne@!V31qL}1X-5oR)Pn!WsXg|Ds*FwE_4)-_|y3Ki*U44-}K~#NSTFi0u z)}B?NFFmEEcJF|oepGYobXx1Z2Z|^bCM>O?`WQ@?W~y-64rISY_hmOnQ=kmwXuS=-G z1ndi=S)51*Iq>>R>zGyj3I5^W{5i6)`@(I^@lArIV9XSeAZFiUItRtxn)Jf{31n$i zYMzbRF7tCHE$$p=(Lr}dL$GAiJ7_~-y+|fkOdaxx{~^R=L}>a$%6sK7??axPgwoR# zv!WE`+CZ6t95+%ITz*W^;saxb!mX7UyqJTfNU1Pb?||dijR*50EQ}|;M4^rqslZmy zlg)1|G7db4o-x{guJt-!am{L29qOblDM+HfGA%MUt!Ol3`dGc%f5~2ONw{GIu4(@n zPeZq?ZOnDiVDT+NWj^X!cZa;CRo8)>XZ4iNt9z$%t$f7SNgZ8!Tyf)(=5mw4S$UZ$ zr`%G038o_ss;NL;GF^crI)gTh>NcjSWMHDAsI@ue1=n%sT+ti>;u-AmIwI7*c$H=ZKFxQBYg(mz4AF`8l;I z_g6a`rzax`3nJ-rbyX&t8}pd&_*<3K2B7q}X|8a(^>a>5*A!0Z`JjXuvvz;1T_axd zd>FA}GFz+K!qFbPG2n!HgIpUAyNfb6^bFC|Jnr0y%h423^SCOR=M{e?b_fV0_ANT) z#WGBXXs>#?|4yroL>HXM{WG2#0TcgB{1W-%mP2-|$oO?`(L5PgOw8c0j4(^&kM`U*Hi}H0H+nY|X%>m58y2yBw&!vgAJ`}HkXWzrO6iYqD z;{MpZz{_;Gb><0YbGdDBw#etYgF4l`615F2GD*6fc!wvduV0pZUD>sJ=(*(?Snr~^ zP|vi`lBk(|RF~r0y5cgpyN0!aCn~#kHqM5OucHMcj!)=$uxJ zN=%WM8&v=@ujT%`@Oj!xAK_R9AAUw|HXtb-YaYY0w z34Dq2HSZBZyERweOVC)Y0jsLzYP+!TUIog~3dGX|WV5*Eh&Tt5aPYUai&5IvRIBhQ z;Z%$+QLF(}sn|>Qm5>}ruJ29D`bL}Xa}T18e7IQbH(@h`DDG@XyQ1)ZZ})q-&P4e@ zYy{K**2=EM(yLl-r9jB<8*G$ci%T~$rD@kvf9IA0p>UDi0RtP@j_o_23|yrVK_n0s zcF1<@+Fgpwuxl>MXWl=!i?*E$V!|ucYkW8F;x}Dru-{-#!91bI7A-I2te$r-kH1~04hU=q^ByUMI;7=gN{bU0CdYL1i0i$ovugQ06( znnM-yz$hWGR6Cqav^cxalp724O*IT|mvRjDO?GJ1-z}qYU7er#u93R&s-s{_NJM@8 ztie|F%PDc$BhFXM${ASGfl00f28ep2{>S3=!8P^LJ?)36Au**Mih1W5Sh-2xyvMUI z7a~Og7phiOLvvcdtqucjwQoj}9Fn8~#QKb{i3@?x}O>{$_>pIzEj{y1*0_1LLSPi|d>YoZ}2$ zV@!$8wi7jNCrji8H5KUo9^E)T6WxFK$;`br%h3`OA);Oo3-aWIf zo5RImXtl&L%4MHP*oDtFVC~U}ebd`DVZJ#eBwdgB;~C96G{|R(NO|Z_ta@s(w+Zmu zWEU%l1ana!Ey9BiBo2vvY;lP1{By)K-S0j5zb0CqLp@zDgLvIhcl3-=B5hLQ^5X4= z^i3amGHDrkWL9`y2zq|(VcjgP$eysiZ5pgETSa>PMJ`pHv$>7D+#E%)cIwON!?&Va zW&}hkp**D$kvwAdcSgILiSNz5BNLgAKdi}&ppc^pdDTK30s)_o_Gie1?F$K@f(m|F zZ?Jr##c+NNvIGJoQ*u=xHL+ubm)c+4uQHk1k1mEc=sV?g9dBm=t6PeRV1>c{!7Ib^ zz|`=MkhS2qUtVwqW526>>c7d6Y3WB?W;&HR6f&$aH7xn0`}%lyG5OH5CyznqtJlId zF@4E1ZfA*jH}~q_wB=_jWRMuwR;|e$PZm>2l*=6IMh?{zcxnsVY&>gjFNgDIeJ~)* z59K#?)J~YNz9P3XX^VAEbzmgD-Z5U<{V)`pyPCDn?Q8p$OzF}sj90{$^1+z(Te%|n zVXN3aavi`T#`grMn_|y8EFCzdLK|P?=2wb6>vDSvFD}SX%rl%o)=swdAp8%gc!IdFzkus^i?#uBm1j}w)sNmZvSw$vbF|@L`n&`(NoY#?MxXbA` z(HVMA4T_cna@iIcFX305)b{peN3-UfN-DQ^47=?5mMgd0b;hKeKcS)D+0{9@8!Pf$ zTzdJo5w0`y#<^eLC$!*%u4Zg69yx!fLdFR73Ko@s73tn^N8JYyTnX4Scw$Teea&sA zt4!5gq$e*pv{a3)EWEuf-loL`teRW3!{`s~O$pajK~ptriVdFOhM7@bW;W_m9W2jf z8u%C%ZoQKifa<`WD~`FPYkOJciqcQ$4G>-sem1ggb6>oVOuOn zjH)tN^~Fdo`KRpQm$oTK)rAKd2Z?6vQ&&zt%s0T;INV}uBfT#T$)KAl^Fbx6*iH1! zTRzzrUy+1UxK9UFR;fKceXVjwjW5Z$ z3-_}Tj*b!{o?f(Fp!iL5)qU8(opc;oGn>k?+OLmcc<>o*T@7tbO+BsY!TU{}Pd10@I!MxDc5!N zmN<1R3q=7b(_88JivM1Ebl2SDb~ghC(^{rI4IQsr-1gceKG4N)okSAvj;TMYD#J9T zx-Zw*SdHl?!3mxxIMyHTNnPtv(JW(2Jpn=<^bJ@tlOK6+a;0Bd%e{F}sJPgDn{-gZ z9q98!)lwdq^Y!S;#l1R*op!L$H6!-ml1OhIy2IV8XJgzPlCbd3yRKWcJ&P8Myh?{u zk}^=AZ6ykSJbDt4hGe4jQi6aT|s0$TP35vR(h8 zvyQ_qs|K9=C@$;Lk*1j^{Gj^UQZOa|!{$?Gd6IVR&x<$cyZEP1kE!39haLnaZEJ5yc^ob;ep5Xny zuT~4qC^j^Rc=a<-H=dUh>J_C;I64@?Wmw-D1#-r`^8OL0i9eU1pL^%W64X`QZL{3I zhb>B#WE4u>zFVknYG8YLAmYy$RmQy308z5$t@>YmxeB;H;K;IW z5u^#n?sqKapRa(uJ=iy|Pnv#2Lf_)a%zRC=wJxh6n+Zy^kPV(KUc(j_Xdh6;!qBlk zM-YVL{uPmmY0^6W@f(2QVlrRh+3d_3}`-1GD-|#Q?#)pf`YO}c@IKJ1J3!dCP?lXRx#BJSV9y@kP;P+fH zEUY)StqK>Xb!M>RE(y_NXLK$2TyrQJXKO;sxhLar1|57lEab3-2Zi*k!e+`>zt?TK zxovDzT0yq~%gWvX@=WdQlF#6=UI?+FB)u_}qRFO^yMkqdmI!m6Gq%-th!Q?#7lddC+bDM#Ejsbj)o$>D-d^@aXHu>@Hs`LeyO~g^sSr zvmeCa(;=}*W&$5ezrp#Do@KXzgoSu`BgID(g!Se&3i{VA{m-rJyF`A4an+}ViSPG+ ziADLS_b)@hU;o7Di);S(A7yVi{TB3raZ>WB*uRdP1U{oeT}j@nxR|y}Co-z7`_Sm7 zm7u%)(tx_Cx$F>2RaF9sO^i8#g<#-C;xqV7<6P#fs-QuVrIvPvOy!%{4(sp9$hf_YE3=q?qzi<)_JZ^fGG$M7aO?jUipgov>6Q-17Un$k)+znS{YN&(!=htc z^P$5rU{D*%_VL zh*!xg+|DiwX`RRbO+gU&BsFzft;lGd6kI1Z3=7#75prhMzwj$9uVODYu(__X7W1g$ z7L}PhV*|BZAytUwnGU9V+@Uh#PsE}olc-XgWV@dp8B@5?q8RlT!eAhwff6o>7Q~b9F4PK)w)rf^4){p%*s-2 zcfuiq-uuhEI7@M-fr4XQZ`1gl&q^NxK5iJ;h}=sg(N$PmQy{&4!LgtadI&+Z&1$d8 zA6x}W8qwQa$me`Kd>EA%j+4S844I#(%yrz8{nl~w9M$Ji-UbiGt~yK%>xf+IIcF$+ zmdBf1v_`Vb`4YgUHD`t;p$Qt}0V6dvR4@^}$RfNUUUlAu(jwgK48=a^Qk*W0^!!oD zNphuWjI(pI-=dkmds zpSj?KIxR&jWj+peg6oF54VRQx>1gX4Rz4x`ft$HEM3qIv09a~S8xpKi0I8r7VvCL} z0#+Vumqz!aP=L_*j-zmA8R}m!X=?KL6A;=HJ`BbyRL;5-36yM{{Cb*ddRt7~-#VT;uMaB9q5$ z#2tzUhpF~WDyybe3_c*j+2lz2iGaLfDi;$469Hg*2M=`ZtrN3YcBISsWc_7K`8N*q z5EuD^q{g&~>#VHVa|<6m>ny4GWOM9`6^PqgSf=r+ndZE20;dm-21 zt;&TmE-Yvt$cX*Gaz0{oP^CTrgU_A?=QmL4jzofMZJ6NZh7D;&2HHS-6EXV29tS{np zg9=l;8aQKO*-kP(^r(2~$e9uOQ)D52}Yhx?V=>ehGfi z>gs>f2-Z>fthEQeK;SnF{+wTYzp%)HC3|h+MQyFDZOHr45aUOM@Sfgadzo$4#?_Qb zt#kyLl;Fc4|SSW}^>dtZPgp93L2H6XsYR@S0wVOu`-6I-_heC#q{ zF`eIQJV3dZAwoS`T_>pN8*qV$xm#Iho&CjiHN_NoEYcu z?xr@l-g+9ZS*RoBzjG5;wk93R3E6_bz4~j+zgT$MA9e6D`7d`HP!(Tp!<`Q=PLTPK zy(s64hI1sv>B`9oOnBd|tEZ{L?T-q2Tce-`RVS)<%65TR5`;tC1~%Xwkk_r%Oi;?~ zW}0L0ZwDQ4=JFM=_`@sxaro!EUp$+yB-?3fG@U+r*S_V`!khm7Z=fcU4{Qnj>=2F* zW#ciB`e?qq1!{m1t=kK4Covq~!Apt|=?d8QFV`Pv+>g8m#^Eyf@|&x`!n)@6Cs|Q8 zeJSMs10Z03<~&SDLco!zhrvqIO<*k8xG(p{7DTzxC`rnws`IQ6QFNda{3J70glG!M>057pduCzr=91*g=Q!iO*5eyg<#K|ecc(5wT9L<}p7byU7FgDD<+Ep7)ulxD zU`RN)Je`n_w7UdLJn5tmQB-EKdSP?Wz}>^hu`nnxHijVBty51Sa-_| zzR_31jQapg!-9YMXMGgG`j}aOoj~T6_Cnpt_n~P*KIwf4@ujkSNVro4BRBco^dD4) zeV=z~UcJ_sc)7K5ejBmCTb+XPs)DrWVTc06wDLrmIww6|BR0DTpe6Kac_VCsO)r<( zJ2L6&L|5TPgnwbKf?S#@1A1U5rJmO<*kctF5_Fs!XNrqd_6hV0s);+FN`!1wR%6mL zD$+hIL`icy)S`*G5!|#XEoTc32-F4@9{l>k3u>d{Wl>U!0H zdPr((Eq3ZX)|EEf8K+(wME~E_K0VB!Xb8+zA451JuBaD#ZI&h$MbJqzHFu4VW|M&I zzi2s}a$vb6>A2?Sa=7I9zREzsH|IIyFRZ|G8YX;?WMQ>%azjnYA6W3489**UT|#d6 z(JweO-SJwF?|GB-zVdiILsDB8f{-OhAgK&HS0T`@_&8g=O2Gf1i=6wayaF&KYnHW< zP#1h=VUzjRy2NQxk1=OrgDOf+5Nd1Sd#?Q|9tdJVo24b<=jp&IqiwyVoss^mb~^P% z6kw!B*0`-g2eU{i%TQ(d*or&{m|64>klPrGfuO73Ae3*XjVLSEI)(Yxf^dA^S#7KDWo`Z1WNhAdeXsBY)TT+6D_b zYqY}>@u|LI*5XK?sA~ia|KQV$b8(A-l~G*_TO!LwQwuB+BdAD3*nTMOBvuaNzdUnd zdcaldcr64=ww21^J`=hXx3cW0p=K+==)Gg5>h2y@kEdom{uL(qqp-Vq2o`9`+M14g z8<;{JypuIxIlNVt$=6i~6n-M`^UZ)1uT_hP1#xZd_=h)BPEI_4 z&UBe8CXOkQTa_A3}Bkzo_r&`rr5JIIbelJz>%I4wY*?`^}p^6g<{y3|38c`S3|6vH1tT zj*bA0@piTOA0V;Gl<_<{2#j`)~oN<_a>D0LhbN#vMBiU zt;{9@6XCge)Z74v*l!_4PclFv9y3tuPtY#^)2+$Z7y6`7uMuNB;iKv4hB!h4nxzjn z{t1Mv5Um8QS2i-h z)FpfzcR73ag*yT1Y5~h_b|WGD^dUT2RAF&;xe1G^p$$E3-A)Hx`JP>eAh$iembMPU zH6Ol8_{wsMwm&vT8vBa{D&U#v^u!QnqSqD4fg#M-1KGRULry?H^K8ULm=Si$ZDM|~ z3{faca5Z9s=M*OA@wvNj=S25)iVv~pShFfPCWcTlrT{&=(ruiA(L6=Z$^_PINg0+< z0wm3yd;c>m=>lXA%sc=f)P4C#vQ}|I;Ds}42HArH`)%3O9OHf2gHFArOYg~2zEpo0 zBC4eSOCVX3FOLQkm{r^M;sQDtAHZ#BEjF9`Q{9Qw9qUi8a1MNTo6bhtUBXO=NKn+| z@xb)78pUIcs%_!VPOsQz>AmdrON3PtI^6I6&}nF4T=@|L0OS1M1jT0H!dMnOvtvSh zqlkk-!7+~IiwpKP!TcrCd4%nwsfio*-Rvp1IRpNsIsN=YOBzGL0Ys7=CEBw!6>K}I zA^LFA8uPRGkL*O?Iox9_&H@>(L{Xc(>!w_K(b~TWepm=-1rr}Ni(Os=7%i)F<@FEg z<=}Z%u6VM_4_@P;s0IwU&6>PS+DZ<@8aFj;EqM0ROc*RWJ4glQYetW$ROLK9e~BjE zGP<`KSVzejfqsig!Tc_u%d|Jtb9I!xa9N2w8V=vAvT8MlNI`AaIGh6+} z^-SwymR!<;DoK4{vN#1(-pMTX9Q&Mq)_~xrYN9WPZ~}XJ8?X~FA=>dOVQ<+3zv;rf zW`8vIoFLt3BS^n(UMBD6()nQRwG&x684C$kXjNuLc4fr3-XFY!u;g5rOm<>E>8@4} zPE=wJmv#1oM;o728BXqx>eTRv6hO>uv`zK(?G4>kRe>ViA6q%y`_y>yuSEiD+fuJ+ zQ91$?l-Tx7*%bhXc=P^+L*Cr$A#wQ$kH}6!go;xZ$s?je3NpQ7OaQilLmyb+Z|pIQ zQ-Jo?XBR%U$f2Ka??wJQ{-_1?F~x=K0t3ciOg)ncU1uTNW`*P4C>T}7T#%uDerqyj zeOmaR2;}kVUVa-(ov2H0wsfOR_)jE4AOj!~5rq}tIpvOhc+s1%V~BQqoFHgwFtW2B>r6`E<;K?95fk4a3g-j8MC^Z4NPl(bZg=!?xS}}mU>t8cOVI7I z@__yx07Go|KAeURDXFoe)0E1v*UAfVH@q;s` z_`wwZXqUst1vNg1Ep@;|=O^0<%F6@%$^zG4XjGkWD%>#jGkN0&^?&L78Bgwg zU2qkf**{PLn2<323W7g+`+r|a2DZR;mBC9Pz!m-e`EM5g5B4Jb-amDX|I52zDVVA` z?ba9T*Y~}xHki6vi3R^gyb>7mGG3(et+mxX-V_>@T*sH$%>k& zUC)dMdV+~V!L1)+sK?a6Z#1+`@Ns0hps%R78}v1Io@Lvbm%#t#f;t0beVnZ#Ei=OkNnSiGj3qjV(&=?uG64?U8w@hZLkxBle^3oAp+aNb5Y8y* zuE%~yhWkL(A^Y*(<=2l`KOLMc7CPbJpVrh*m(v=M`IV9Ny9Sy&LzOSmw_S6;bRG_8mv31nmuX<7E7}454 zX{t~H^vROb6NNqE(R`;319XCQ`7xyZ#56KpXy$=_5~i9{LKg`Ee(ssScKi z{zEwECB|ml=5S4BPQvSN^=#b>}TlpZgFXXN!PGO5Wfse|HnygsMCxA;3zZfUww z8ChluU4>gTR=cO2&xA>o2XbP`L~7&lK&x9O$o7b@5ICS7L~!%wPeg$IV-VS92d5Yq z;ba>u+xq<0)UtCSy<>X~>wzuIy+FzPdFy49D;6lWPcHI(U{NQ5RhjNYc{YMw-;79G ziuKJ$deg>D)&Bmf6=-hZ??VIn)LmoNtieALChP8RtHa#)?u*`tvbfXtyFI0Xmrg?d zge1gjqOX6{YJ8wpPwHGv-@B@|-eb|DnQ|fqS&9%@c2e`Yog&}|sdxpolNEsyGSaW? zQT8w-W+LSgZb`fMq0islZ-bGLDs}H(g^`YYNzvmJt%@ZiOsPBD4kBd#y1c4TtPWPr zui&N!iQ_5-71ZUrk1N**02Ta8B}!9I2r{t2slf^y0r&}BQg-IJKR`2<<$g13W&^v; zi&=~gpw!PSXxxj_xgjEYu8=;kQe@{lw6Afkdr4hfi7aoDouAuquiN{o@9t=3wg?rT zy3TZzpGvl4M0Nk1Zf?+zQrET0Ol!eEsRS8M#=v%B?kV}F%z}=T?w2FQ2G18XoUY{dT$aJacVqx1LTBPz}kl!y-O(;RWGhLY;WIp=;s9SCH;I5 z4CUjB*^*AVqo4P=)EA|oAN417?UpUOr^TYE|8_vcqqSvKp4dpDzKhfmq$2tL&G^7A zN#4s65c9sc*OvQa^wkHMbjpnVN^(Mp!LP&>VME!ZMT@VY$|BJ6rt6C(orruy2Mj@; zzX4`Jk7oNh%HKcHf`vE^8*n1h=hEA1#~v&=IG+xxc+>0r#OK00||kP z37UU1z_dk|??=i`yno=)<;S_KS@4WBqA_KQ@+nwXNWcE;$Mt*rizUU-7e&3ow7aI& zTko^*93##isP^ydt$y99(ScrqBT5l6NA!12L_%ojJE0z#yFqxzjcgIcA-Uci$EAYQ zf5{FuKV*k)aKAj#Rd#v<`={Q(xp}r9lDp1SRd5L1xfvRqP`tthed7{FvNR;ii|2B9 zPo>t$yYG{}L?3Zxa=J}V`?Q8qt)%5bKk!7S5L$Y&?y3Q1);?kpZ)X~}ZD=3u4xJnVnLQBd6U`-`Las%XddK;p~ZsFWaJen>ChZ6WR;$c}qz zMy3W5ME(K_SXfWr?1}zh+kY$X#;u_bXu@lDQ9XRFyG`rshH1>yg3&RB=igMswW&y` zq^Ly2_XEVwJLy(TS{e#j22jj%ey{6c?nC+NCT_VYKK@wnTVjV+w=Wg{$4m;K6XO4Y zlK3yRK4{^G&EnUO$vv+dhWO0iI=%Ol1P>aH&Dbdhk`xfH+fCzoIvN6Rx1Rq*6mkEs zg#5A(`~`*nWrfQ=xNp`sm0o?TfB7Z-5sge(s3i5xW7wJ6*IGl81y{SnmFk(Jz3*Y7 z$8~mI0pA|hVUrZk{<@$aMhS1bbN4UlS&cHcx3+|bMgT7iYG8VEUN|QVowT|ta(p9b zfIc)y#QtbMD6G7kn#dax(P@^|_fLyLM=rbZwVvC7cReu;Inp5%G}1|bs46OdAexs? zjNYAn*!y$?6_oa;`jYOC2RdH%zF>D4oioFganozV!RD}|YP*;qT=5BGa8Hw5j5RCt;u+3^(xI6tpnaB8e z{QD>~O-Fg+24*#K$Bv~kuIjPtk#jXuSZ5OJ%^#|mbm>Tzaq;zE?Xl0xEZipiZ?-_} zmHR&8;vu)kW#WgN=XxC92xb_5L51&uI^02sI~r|jKW*0vOHN@IroL(wkMfoH8CtK^11=CZ6-^qGx9tnL4Z}F zgp9cBlQBvSI9x&IC(%#{tTo~psx*5yoR8$X`vqHWnl{Z3$DdfKFit*>8qm@bx6_AM zF6@W$_{G_2S$kQ@(rNNCc!8_x#NBm;?Oz7g%Cwj3>I+`CyJch9W6TnnMCcO#lSd%3 z*Djs2j&F;{!)Gb~{_&9hU-FzuuCFg*Yw8qcGTV20ZoEG#SAQ6vnRK#G!y}9f zSU$SD2w>ymx?@{Dh9I^zg=Vc;*`aF75WxT8#E+=}tCf{i>U&XEo3sBU99)<8+wXFu zdp?mQSEz#;Mz8h{<}Oq(N{=M6FGc7|%(t$pCRZ+6nznmHc9y7=I4C$?^Gb2>SA{kE zPX1sfK<~~EUq*EsCs(RFGgb4Eqkk$Q4%R)s3w%1-;=yg&2J)MWS<10~WeRZsaB-^E zXF4!VWK#PImsu-{DAzU+6k_`q)#L1OPC6nxwMZE{tMh1_j1uu*TKHeW2mXBwW=aRd zb=>X&6Mdyhdv|BTAD}uf%-q=T#U;Hzseim%%2;hZ z`u<%xh+3oZx6vsVDo?lo8Esdq8f3z?A~f7L{MGY8VWnDG(a=v0f^4)ed)ZSVOF2YJ zfNjQYw7J|rxpJsu^(NeJ#mzwYAnsrx+Ln(^er&ynJcUTU&n#qQm5pRt{+IQkILZCk zNVb)uPb}$S2yny^!M|wf*P{{Bs`YpYXF}d{*Oj9ATqpuG3bdX=3c<*fGiz&WW=2NC zmA`Wnmi;fPnDOi%o-C~E9731wy!0izW%O&D2^Q8|rtnW)^cElC?=QIL`$v~`^MBBY z|GUeQ4ZvM4j3J^&zlHzQ`+q9lCS^a&SG}=sidfs!%wL^QzA*ErZl=N{73C}a> z!F?jz_PfN!qt)M+P(?GUJAFst-B6<2#oeQ$9|zB~wj^X;(kLUte5qbE6oK(R4)6(>-6~CNC;>$emEPeH?Lz zx47Li)>+??o#)+MtBDEQy6I0Bzwdw;iEJG1@^STwC)0{V;hL>(QK<06WKm-5S{)5a z&lPhIj(C}1yXu?mJq91@wqmLv;2!2|yv!)GU)$1Id%>@h+W8>$08!4wCIh}#n4D(A zysP!zYUPw?@~nF`VXf(*jalCeoCN|lnh3H+ry#Dc*$;Wcdhro=qPkrj#>%J8o)K3a~G`* zAbOtH1w~ZCN@_ljGT}E*d)bo~e{chHFg9rkdQ&h_#C97{8ZkI@vydK>>CAW6EM7g| zyghYGY-wSE-}X^RGu@I)VV(w0{~Nn;Q%I`LgnBRbuhV0(!Xf=R*gD!S69VVdGlh7? z?NJokRm-gvYbAsIm9Anv#V+U6g2PbxnH=lQcczP4h{;Bp&dVW8lpb+6Y@E$i&}YK6 zL=hzvGmD8?Y?lX7rS}f|wGa2CB_e1Wy9!i4vdoMc?fY6*(vR+6uaIg`tI{7*7~b)V zdZSn@)`wBOy5Z}BY56zFSSouo4(0L#e=J#dS)FP_wC2vkDpSRqaHywwukSG6Ex{)a8^0Q z7Ry&L@^qZ&xAk2n*Zh3;>}a@9$I2S=q06wFAZjg(4SrX@WxZzQ(b_@%>rM_8Lo}6{ z^UmWFzX;3Am?CjUQ|2AT0#8-tA6fbL_5k@nLztd@)#JbN%_)I%&ndxwVx{QXpLRZd6TYdSbmT9K5kaIGHT&V>F>P{5B%X{hFKh3amr3` z>}*+s>6)C(HK>i(9zrzlTlGt*qHpE42MnipKW`?Ez z%(yAA&xnCopf2+G;gMM@Iyj9hHd)xnb&rSrvc1lJbCwZ;y+MlsdSIBs!gigodOs3Bv3YV#RL*%|}e@~g<7xy}v z_Kj){>*=hM&15&XlzW^YP$NSox@TSzFSO$zd8E_tB3?`6PaW|Dr1W7li$fnRQ1(SQG8+lDk>@^4N}q|xpa3dEuf^Zbcb{)ct&(d2To=1(h_uO7A=Sf>JS_wk!#k?zpl3Shp>U?>&9c z`k4{ehO&SZEgp8l9tDu|B`xkd6GCbdW#P}Q)b3L1nK)@STWn)podbwP$av#7UmX>? z$=iKVeO+pLmSLBm>Y5t%R9=t!o^bS=V`BQgAjtJQA{Bcf_txOvH1v!?+a9pYZI-pi z1(9V}AnTT^BelD=W^+TOfW%~|wS8N#mA|^xB4=3<0{CBtBu-?xm}tV3F|Ao_sm+xf zfWsF=8fnqgqm(R1z=h=?bdA^WZ*)H?CR}5}g22Qf6hZ+;!NCgLvAEsOT0{5-GIYpP z8vd4`uaf9ZHp+Xw(u&keuksc1p0z&A4;IUsqd7MUj*H(1x+=U5;`;^C2WJX7ZE$mQ z(BK3vMxUcOP z6#u)_)nDdT6eg@e(@BS*F;ToBYUM$)tkmcGiQ>POW4|vAt&Mk*^`3ndAo2cfC-!EY zg1U6h-rIM~D`K^UBvOfaT%+6Ma!}jK+V`eC>^%}g#UY>GV?9ikNqy)PiY&mxq-Ha~ zFy*tHJklc>b|P$E7@%TT}d&C`*mlVUH1F$Z!Bj1bX*$(V$ zPJVcg3r|kGrXTNA+N|xG3aS^=`|7Ln8~7cNh)#Q#!xo)clT;b{mb)hJUbfWBgi!mj zt8bzpQY;w#E@wOl63ubj+6PI-PJ14hG8lM2P8>E$06O#96r_0zkG&qOebXM2S>N^Q z`Lll=d-c2v%mkyDc)Z@sxxUHX@R$|r0$p0LC6>j;#FmDz9}AcJx?hB42R&Lj!Z^2A z%8?8BdwGYHjl0nYpllH&Zcd^@NDN7YhlEcJO2dL9h{NONTk>p{u89BzF584JOu}-r zh#@Ns6nqJvK&l{{YbYlceqo~%$(ei!THl${#(rsE3n*9Bj zYr7(C$*{6jArtTODWx9fM5s1wvw^)YToMj6Js*IqhRfJ~U4g&+j;eVWg~mGHm?fzIJK-T%%qg$xBCRwM#b&sa zo0MORWD1(iFvz=*$O(9T=@$Cg`*Mi9p#9YM9$Sz#5eTFc%vGU#5VhAyi>26cQcWh| z4CTRiG*wY&=nkEF3lcq(~4X0CNgRxhnzlo)n$$L=2xzS#ASoO@XbYZvsj3D>Xfyepy^um z_GHu{%3@K<$l-cT6FP==k(RodZj1Q+5A1pg>Wmg*hEs^u+Ys~Rt3|A&7NkS(wRx`a z9yhKDrB5w2?NC61eR9>~7D!kee3`ZB*gARlX2}5?k0WYMHL`%dJw&6%7S|C`6r)^5 zjKcVcn!cO^neCZ1=u$p48qleJm{9S2pY)e{Io3i!Q78U_PE>#yp!MtY8$*NLq=_@f(EOp)PXJS2OD^WHXwK(W#1FKj7v$@`_xLjD8;>buINKta!b*duQ%>s#ShZ%1;;ooIPRD0 zCxI=GXQB19zCGVmq17)^%jvhl3RD}QSF)^MygxGu6Q}?zh+ZgeFTK|v_C_lVLs^@> z$-*Bxef7uPQTd}Huy7h>^i7a^YfpD72}M2j?7&VPZ;&CA8JXf%dkRh#>Cat!!7qD@ zh{drL9^{2_4A2DFOkHUEIM&wR`}H84B_xUaLG-2#hHFg)a0vA{n4p3%%oLqXBrJZU z3g>mZ33WV&tTy@h6RXjb+05JqB{xZ%73#~7snS5dXtnaz`3{_Y+*7w8HJfxY-vHI; zBw89%^S#9pEq=I)o45E;r9MUjoz~KDmXR?mrE7R9?y0W0){twqkrX(|ea%_ywyR6ifc=oUD8}(O3#yD#*EVEN0>Y)kOS89(2kAak#SWmZM^lO6IdM&yQ7Fw* zZiy4Ks=3bDKNMN^Yd&>lO6=7r5Yd>>r4s?T17YE<;k~ae%Rg9qs06?I2aqW6wtFW>*B*bGwBRTD^0(!CvS^L zF&xcz>mQ~WOzc+%Mf=%b=~Qd>>(br-aYy(W11cVl+CrNd4Vqm6;S2fV0%v{|Kn4c2 z^!ceNMmd7Q!+EE88o7{ID~yES_Wi(>-mvi0G(6@^S-kFe&E@HWDj#pgal$guGzRk1 z`I0R?Ua>S-CsZM&Qeg-^bT4k&2ek&0J9`G3tc-qY&(ib}CqRDd$9Kx%_X!L#(S{nF zi#!-u>P+3q@dqe8BfsDUl!#$al;)MJZtZPZDAfv!Tv`gHA;J>z8A!W`#K*#))VX2v zg(GFh$&s)r{5H{|mw6Py7p+9pW9u3+H0zSz?~OVXBv}nm!Uo0jd|T7UP9or9@%2pk zXi{f&en}nkRZYj`ecYqZr5#`=YBVpeAgREZiv;`8YJI9-H49!_gfIh@UK0oZp3nBu z+&=AP!gT=~{ua6Mt|DX1KM69vQeK``B0yF0dh%pHV7d65@#lV4A#?PxH?ocy^njpG zkQrJw*B<3HtHe-Mgb`&XGId39uX9t#FSazdBz~+1R?9nRyWyx!ew9uS9xo`TD~f{X z>l}(Twx|qBQ`IC`DW%&lwFmZR_~>1?!ntq&YP{tg z%ZD84y4r(l|L#@h+b_u<_?=YRK8?CF+Nv^oeH_SuRwiu4ccCf%8CxsS%RZ_TZ@=Fl z;}wpWgin_8zD8JHX=J*XCd@jTT=WOduf9mi6*pz@#`P_OxqBEoL)+Scka|lE(YBr}Cc&VD*^UiG}l2lP!J95|FXZ3V1O^~1d z@yQ=8kwu;44VwcJ_txf&AQJT~e8F@OXF9pJ$#Pgq@k{;Z`lg3KU+&&2^$-Gmr`7lM z@n9JyVvdj5OWyC(Z#OVvzz8yaD6?KY4;Hr;HJUT!4jL8M`3OaaXri?hp?fFUrPJ($ z;|o?yVQ+F`@cneCy^SsDF0H~CkQfuZ1EZm#1(s4RLU`(iGWmYLV5Dat$xO6*#SKWX z;UsT=oU|PH)2)p>?eC9HxE5bsgvud5f;n0%euYJF6Gv*L)6)xOR%elaV@10yu_rQ6y)eZj5!eTSvlQFm%*9YDRA ztN+BtkFG+x3yz14LZu1@Eo}rG_e()K6f99Sdc4%3t}btIvK?3iRaT}}RuG*TP!D0( zo9k#wHp3NRi)p5Z%bnUAm!T^Dg<+vY(y1gI9N5TT92G_?NAtdAR>O2X@f4!_TlmH# zN9=nvxIzj+Gy}6zid=y!W%CQHUW*@1>fWoC8ETJ)iPYVEZ;9>SQtIi)0cUX~rPX&< zylqz(RrFmeZTU}#Beay--8UWcTm~a*(o%wF-#3TR2);z`7DY4J%--7Lmqa2u?U`kz2MT}!upo^X4v zuzs>3JA~WmAnN847k`yocqo+*kx??uEsO|@e=|puo|gRQG^DPQRg@q84nJNiD1%`4FPsz+R^k3ev3hrGkab(BkwzK#Npzo*3r^3u-7vFcr9@<=h%9j zOy-FAU41#8^8v9s54f`t@*a+w8_o7wVbdPhW-w6Y@-=4|zF$nNs2%}0JY?$l)u;2JSpr-I9e3!=mCZEDNU{Pbl zI2Z9JfL7CTpURKOar5T|!4w%)GfrkUN?QwECKKoHrl3i~$r04FEv}Mt@sPG}LCIF( zsvlT&@^)~k-y{z4<3Ei5*eFI9I*0$5C`5Vh$gb}W*GDy9Y)if}IU!9J(MA2MGTC2P z8tO}*ePZbjiQ&1a3%6!4`!Qf#VS9?qCY_2h$joO{Bb}L2YEc~TL-60)2v-PNhvL%8 zN5nC$v^poeL(P6Zu?*TCK)E?^PuIR)I)nmtIgHXcMzfSb{Q%nFl}Fz?)6%BD)x|2p z!dMUIvM=W^$Dj&I$ue?LKVoy>u9U6HxW1%X@qRKodqS|z)P(~%Tx;pDiu%iR#@(>L znl#!RkF$>a9RnKIZLmxY-xbzuRSmrl2vx{@2@K zA|KvN6OW-^FE1bowFc%q)(mcZ)GuN#{gf=1f7z823#vraWNQc2636{iG8=g1f7u5w zj1n>T(Oo)yT)z^(2Oow{tsEr$4)H3ZIq0gwu!z#<^jYo|+`QaXyZy4-6P%)~2fJfV z!ODbY>n88;hDwCo){LXrzME>~Q;k$N>(=&CO1;a2?#%MSSWt2lN1e+S%Zwdt6O!rPrmC|Hay2A!Unb1md2=G-O)aYY(RmcaJ{ZD9_9r(^*L-Ju z)5Y-w-S6?Y=c9{qJUzSdaUM_pFdFpJ;xj7m-*zYXi;Z1q@X&H3S+svWVdWD!-=J^m zZ;pma%BH#ARYx#3DSnFJidfAWlH94p(zKv7!@IM-MLf)J|DqnH`C&3YWNYe8_c_P5 z*M3a^L;+zT5o|o|)z?}T2rM-4GaXH_O1Iw__V7ctW)9MoKPFAOpBYF8R80gA_Kgf> zxHYTXPz0{56eXRY-N)_J)2aa$YChBqi=zG(w zg5GmK`HL^#Nk^R>{CBowZ-N)Zthu^BKd#t*RDKGQp0ap2yczOTz1(2kt?Rc{jLlNS zOv@B8zI=mio%5+8neu{nn96Q&iHCMvW=CE_Ze%u=i6yRK@lCg$k9CDoIXQwbk%K?zC)QUKt4FJk4^_agIZVwJ#zT23~JF(cARRyr#os;xXtS6r1M z>B%!6#2TN)&+g=K9tW?DJ^5oAKcDUwAUxq6I6+ed|wvLtV@x3Kno>k&pKDoKcXv+Rjx= z`C#&6Cs`W8L!6`($}n45`+n@GhrhMn2x1Cn%55qC>iHpU+?KZi zvirb~!_<_L?vqojj?ci--`p&Atihm?y!tlFnVR2ejxeDMS5Tc8(@~jnhk#NVI{h+V zK5DjOUGi}U9Syz`n3EOo@Idc^Bks_n=>^DUhyu`m_By(jELb z_<1PUyaVwIENym`xZl*!0kq(Ww&6a&Xi(-^&ZsgT?$sr>qOv(w%h`Xpp0zCpTdWg5 zW{5WbWa6e0y5Z(cfJ|pj5x@J`!8#_uVeri@h&IrX!sj@uyXA&_@vbPw{Rm#UJ%f|3 zzq&SikEH4z`Wa8Z8-r`tQ5)4+Ir@;RBV95B>72x3%P+J-Yc_TfKJ_^&S&OVpEW`O? zkqI@)KbtK5UMFtN0Uwt0@W{D75k(l0-r9gJSI}4WoDdNTNf`D>h<#VwXqRCJFu@;Qf=3x|*t$M%(lOUdav4YH<*o%mt z4H(c^3ux%iVLQ?gK=E^Cy1wENFWvM2_9ALm%t1IVC19`GIO)!Re^T(en04@yZIohZnYHt7V(5E43mrmSC9|r|3;55B6esu zUtK<$oRmAFV>3us#5S^saxdu6HpL;HFMlz zmlLQ3?5c`O4Z=-UWd($$HzYVSM5W zJ#h4J>$pQhA+z79Of+a-yDzu>rkV*k{>~v!uSPG4RCDDPv`<6@L5*f1p1h;FG&Yve zbd%^V>QzO@irZSDeHM)YzqjOxc|}|I zX`|t?UIp8y4%f0RanZB02p)6C6%HBI;oh{}Ivm3()J#=0@FB3fi?$z!N-)5Kk0o#+ zaJ?$7vnsHy8}5Z(%Tw|BBWz{_7j6;xF&S@2Yj0|bhbHa_h+5!#0Kv*^ZRqkbaJ{p> ze9rLE^Cm}pu?f*lAuMjSaPH@F>9bVdanmo}jtG^EA8qH+!pWH7E3##VEBMYYk0FFS zKzts26rN3S$lOmOBiEgC9}gco?mKol?q@PzWLS)Oxx(*o)Uq#X&NnIFt(3s@+rLXk zTZLc@*`C@Vb_wBGX533IGzd!l$DX+#<#89b-4*wLbCQbuor8hOMyDn-iW>i;HhGne zSs!(P;jE0*^y$(Z>0`q@$*j=HQR=A_3rt~+06H@>Lte}mHpboc5>n#A7}5cHjf|sv z4CD%TE1~qvF}o894D_hkIg@;;_E#Aid}2e7L$1Q&lYMzBJ8|!YZBQyO-jcOt9nbuR zDESsf%h67}u+|ltvkV^F2;Ni(5p;>^fU{=wa8a!cIg242POwtOjp?U4Vopq4L=h>> z!zOeG5%HupCin}Av-ic9j8U0y#ilG9KsJ)@j;oG^!HJz*1-d|Ly14wCuGvvrAiY;D zniA&tZGY%&!(;ayahB4?jf>wkeew!J)%t>0l9JBG9r4Q9G&-FM$OzMQ+b(iFMsiBb zYLTq$*Z5NNtzM_+Wf5^oTUC&iOh{x;^gSRVaSpzxHbn>is&VK0Ng9#Ui{NhrXcl=L z2VCocRCC7W*0|C$Jctb28=Jg%$ROe?L3c)pc`p2;a(-jFu5P;yhhkR$FnUH!9Ua=< z9^V7**;W}3$BN0ioQ|b{pu4MQrVMKD$|9=|$W(aScj{TxY*c(+*j0JyzJ#V@X1Kbi z>#0Y3oVoj5=0jbGCsZHRr^NZSjl&Uy*(TEu>jCA=_r1#@r*z8K;xEs58w~C|Gt%!T z(FJ=75*wvr*rJV;YUB3)A;QzN+oL#gqqX-D0n;0{4lNfbuntqR{4V7;N8)PLMva|} zQpZK^4)0Lg-1#A*=@HpK5OH(1PJgpAIWlRrRkKZ47_&CO^~io7YdQZ#v4d;A2-B4XjFu~T$oO+qk}ScU zRCB$Pv#lZ*m%;joT%05~hTzO@tW(L&ISz{(2p8mkh`V>L6^}9`hNZ zNB~arm9H0a&lSyDxdhmk#V!7hgjI4$p_~qFvZPYhRhhh>Yw^Euhpjz^knchIGG_0P zmqwdtZ9q?=Vf-GsrY%-3a_QE-=&#+uAJ;al+4c`Rd|wtTTsHy#%;L~)X)r#hHXpS# z;pu7VstyUMP^`K4jz*ad`AwMxj4L1HxEk)?AV{QyqEmPFuoujC!`e`6?PA&mSt}BeSLRl?Rb5L3&R-!E#19Q z;`{4G_aCo6Sl#a6?l}2gk0Qe(lDTzxCjUGcJ%0fyI&>tvc*asg3|5HzwM-uA_~3Rr z$x^X@>ftvV@4uV65&@ErBx!S58jirIAlS5yIr>BlYPP!ldhVNN)&pF8y0o@i*(R0y z(etBM(N)xf%Q&%ul}*AlZ=DjnJ2qC1eqPyRnTb$drdi<3(`kKGSgi5Xv8T~P^YQfi zzzyvha+9|RZcPQV#(QXERQ1Rafi4lh+oPCO^T|n5%4yjSUR&-9J?8PRK2+jvhs~bP zp<9DoQs1K0Ql(*^wdj~EGw%BPA(h4K7|$ms!NPiV{x@l2&4e%Ew|}01`(JHC9;W0W zvlvgFaJ@t9YOXj&xqO#V_81}>H69_g72D;SVWlS46--fzQT@uaa2(H8y)bf6EfFev z2wAX9C~DN>876pG?_o%g*RJUVxr&lZ|;ed-k) zl-w1#11+Pbn$0gh8T$rqTcPU-3*V1CbbJ7>M1$?U^9V^?-pFf0rx{k$^&%Ukv8A0k zFN}xt<5LEqPIe3lpU82oH*R9emmY$fYI=3ZfmvHdWDowxo1|SsZ@0tfIekNaMAS7J z0*3-wu-h{jko^=+=j2H@|xh*O}hnv>wui@Z^JJ_Ur%)*HC!C8V{^Be>>S zHj+7UA@1ihQdwI}*GB-UEL|C2dSF^%ELVo~5Jxb;1xTf#+QOMEA)R~KhkdwkwQmFD ze%DpoB~pL~%iYE`&V&N&hM_N-)brIO)||%!i_|c;OYm0L;3W+Vk5gQCudO0vVyZ)@ zI$%`fa)+OC-J{AH{nNiVoWc11brd{(ClKQgh9YoWOPC|wsw1RYPE z!a=$aJ4&Aua$x2ZfPehH+J+F#*l!R12WjYv|4ujm{q+MCJ@S^@W5t6CR~jJtc<7HW z4QM+bLpNc9jF0C~hnOf<*48dZqYAkmD^!r9;5roHE$R_d*%yvp%5WNzx>udX8U7J?+|6puRWpO5h6mC766+?05rUQ zp;ReC_xHA0oLMT39N)4(sQ(<>nmKA?eS(KEgTk{h~m+GqDKmT*z__={%C+SVFgh8epM)Mntj z5WoVWQz#gvkL$Hpp|fC0M3@zZZKY6p)K{DOLXL6KqK2K#qBuE0Hs1IL$pWgF!y+Og zKStS7B4`{|X_>PPo0p`rSIf**R?UgmdKw=4Zc2zD@*PQnn<5pR?2zdj)pw$YwO7#Z z33v(k(w>}B8mSqda=OssrEF#j(CLDk6t0+GiN9o|r}_W9191H!ggSgdfEh}jnfMDQ zoaZx!sCB#;tUy5zSWx`GjqZpJkdYxG)4D)TFPcH-WSLJfp>S|?-mvB7B|E&X!YVh3 z^PjCSd4mE=pf#$cQPBq88^BxzW^GXP%HoBL7%#2@v)Qk>&#IgQICWUOJTs|X=l}Pp zre@Li`k&9~3uANTv;;ffiz{b@L*8lriK#@bL;K{t*YfhGSdr+3<=yZswx;c#v7J=; zoPf}@#DGwlbj7at#Lys_^xwhRJPQByfJdX5$b0f%V3a2)z^wj8Rgot&Lxkql)oUxR zjTRu^B+YtIAb*K5*4@{4FX?Cq*@`*X_JbLL`c!NJ4__}Z7dizjMt;St`f~{TG$vAd z+-fjEUzwx+Tk1Xro*VOr0jQ^&%I6=u)-wyJeHk}0;Qj>>vwL{z3l zxJk&nW=)E{DQ;lyG?G;%O|puWnwQJ#jUwk2BB$Ky-Y1ED1y)i-#P1pv4z{SIPt3|= zb$crkDsbw=O~!3g1F56YH(wAdi^9**LvbkH0c@0MsPzW5tE;P}7rI;J+?iMo^F7v% z_r=5>TEpQCvYHw69mR#x44r>0OhRtMBuJzd8K*wXzcUg3A2E6Vc2!z^FXioOYyAPN zDD)P+@{f?GO%RD<2uA-^LXNPZ?|w7ckg982KmOFH;O^M!N~=nwMCQ(T4s%Gn%A)~m@Y)fnju73nTCfuhx-)y z{rF#w^hr>`T9895XLK5Lf7Z(`f^O^iAs%c`d!uR4oJa*_RU*_G`-TW=$kX51S|m}& z%n-j5BI@GO*`6$1ATR;e57IJ_6zT2Ou}OZdJ69&%3fgM~>qZX)lkzC3#Vpf;~W%ksvvS@oOUP15yTgdAs;B zlA>zB6lRsu-zii%ZHuq0GuD|uD$vs3Zibi%RaYH2EIu{xn|lDaF?wk!f3ktct+J^d9Zl2;K;TyrtgW2E8Ebm&tEE02b#2#%&{w+FdpwJxcVg?h+Yx z-hU| Slave: +min 3974 ms +max 5916 ms + + +Kommunikation (siehe ProtocolAnalyse.txt): +nach dem BUS-Scan wird folgendes Muster immer wieder durchlaufen: + +Master: Statusabfrage + 02 17 9C B9 00 08 9C 41 00 02 04 3E 03 00 00 EB CC +Slave: Status des Erweiterungsboards + 02 17 10 3E 00 03 01 00 00 00 00 00 00 00 00 00 00 00 00 74 1B +Master (Broadcast): Status des Antriebs + 00 10 9D 31 00 09 12 16 00 C8 C8 20 60 00 00 00 00 00 00 00 14 00 01 00 00 BE E2 + + +Besondere Nachrichten: +1. Beim Lichtschalten: +Master: 02 17 9C B9 00 02 9C 41 00 02 04 0F 04 17 00 7B 21 <- 0F zähler, 04 cmd? data: 1700 (licht an) oder 1701 (licht aus) +Slave: 02 17 04 0F00 04FD 0A 72 <- 0F00 zähler, 04FD 04 cmd, FD result? Konstante Nachricht? + +2. Busscan +Master: 02 17 9C B9 00 05 9C 41 00 03 06 00 02 00 00 01 02 f8 35 +Slave: 02 17 0a 00 00 02 05 04 30 10 ff a8 45 0e df