From a83bc28a8dbf6bb4943815a3c21db2929b0a57d3 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 28 Jan 2026 17:18:59 -0600 Subject: [PATCH] Major step in the new AVR interface to send commands. It compiles, but is untested. The old code and function remains active. --- AVR Working Controller/AVR.cpp | 37 +- AVR Working Controller/AVRInterface.cpp | 326 +++++++++++++++++- AVR Working Controller/AVRInterface.h | 224 ++++++++++-- AVR Working Controller/ConsoleHandler.cpp | 10 - ...aha RX-V2400_RS232C_CommandsForSW.pdf.xlsx | Bin 51987 -> 69180 bytes 5 files changed, 534 insertions(+), 63 deletions(-) diff --git a/AVR Working Controller/AVR.cpp b/AVR Working Controller/AVR.cpp index ed70c6d..656906f 100644 --- a/AVR Working Controller/AVR.cpp +++ b/AVR Working Controller/AVR.cpp @@ -261,7 +261,7 @@ unsigned long Hex2Dec(uint8_t *p, int dig); //void ShowAllStatusInfo(); void GetAndSendCustomMessage(); - +void GetAndSendOSDMessage(); bool UserWantsToExitCanSniff = false; DWORD progStartTime_ms; @@ -532,7 +532,7 @@ void ProcessWindowsMessage(void) { } } - +#if 0 // EmitBuffer // // Emits the provided buffer to the console, translating non-printable @@ -579,6 +579,7 @@ void EmitBuffer(const char *prefix, const uint8_t *buf, size_t len = 0, bool app //Console_ScrollBottomRegion(); } } +#endif #if 0 void EchoSerialRecv(const uint8_t *pMsg) { @@ -838,11 +839,7 @@ void ProcessKeyboard(void) { avr->Power(AVRInterface::AVROnOff_E::eOff); break; case 'O': - avr->ProcessSerialQueue("\x02" "21000" "\x03", 7); - avr->ProcessSerialQueue("\x02" "3Test" "\x03", 7); - avr->ProcessSerialQueue("\x02" "3 Mes" "\x03", 7); - avr->ProcessSerialQueue("\x02" "3sage" "\x03", 7); - avr->ProcessSerialQueue("\x02" "3 WOW" "\x03", 7); + GetAndSendOSDMessage(); break; case ':': GetAndSendCustomMessage(); @@ -902,6 +899,28 @@ void HexUppercase(char *p) { } } +void GetAndSendOSDMessage() { + char buf[MAXTEXTLEN]; + Console_ScrollBottomRegion(); + Console_ScrollBottomRegion(); + Console_WriteAt(0, -2, "Enter OSD string to send: |________________|\rEnter OSD string to send: |"); + gets_s(buf, sizeof(buf)); + if (strlen(buf) == 0) { + return; + } else if (strlen(buf) > 16) { + Console_WriteAt(0, -1, " Invalid. String must be 16 chars or less"); + Console_ScrollBottomRegion(); + } else { + Console_ScrollBottomRegion(); + if (avr->AVRSendOSDMessage(buf)) { + // success + } else { + Console_WriteAt(0, -1, " Failed to send OSD message, Invalid chars perhaps."); + Console_ScrollBottomRegion(); + } + } +} + void GetAndSendCustomMessage() { char buf[20]; char msg[30]; @@ -916,7 +935,7 @@ void GetAndSendCustomMessage() { } else { Console_ScrollBottomRegion(); sprintf_s(msg, sizeof(msg), "\x02%s\x03", buf); - avr->ProcessSerialQueue(msg, strlen(msg)); + avr->ProcessSerialQueue(msg, (uint16_t)strlen(msg)); } } @@ -974,6 +993,8 @@ void InformationUpdate(AVRInterface::AVRMessageType_T type, const char *msg) { } } + + /******************************************************/ /* m a i n ( ) */ /******************************************************/ diff --git a/AVR Working Controller/AVRInterface.cpp b/AVR Working Controller/AVRInterface.cpp index df040f6..051b73f 100644 --- a/AVR Working Controller/AVRInterface.cpp +++ b/AVR Working Controller/AVRInterface.cpp @@ -14,6 +14,10 @@ #define LONGESTTEXT 150 +using AVRSubsys = AVRInterface::AVRSubsystem_E; +using AVRFunc = AVRInterface::AVRFunction_E; +//using AVRArg = AVRInterface::AVRArgument_U; + typedef enum { eReady, ePowerOn, @@ -241,7 +245,9 @@ void AVRInterface::MessageReport(const char *prefix, const void *buf, size_t len *pTxtAppend = 0; // Keep it null-terminated i++; } else if (*p == '\r') { - (*ReportInformation)(mtInfo, txtBuf); + if (ReportInformation) { // Guard it + (*ReportInformation)(mtInfo, txtBuf); + } txtBuf[0] = 0; // clear it } else if (*p == '\n') { // skip it @@ -252,7 +258,9 @@ void AVRInterface::MessageReport(const char *prefix, const void *buf, size_t len } if ((i & 3) == 0) { if (strlen(txtBuf) > 100) { - (*ReportInformation)(mtInfo, txtBuf); + if (ReportInformation) { // Guard it + (*ReportInformation)(mtInfo, txtBuf); + } sprintf_s(txtBuf, LONGESTTEXT, " "); // new line pTxtAppend = txtBuf + strlen(txtBuf); } else { @@ -264,20 +272,26 @@ void AVRInterface::MessageReport(const char *prefix, const void *buf, size_t len p++; } if (strlen(txtBuf)) { - (*ReportInformation)(mtInfo, txtBuf); + if (ReportInformation) { // Guard it + (*ReportInformation)(mtInfo, txtBuf); + } } } void AVRInterface::Tick(uint32_t now_ms) { + if (!bFirstTickInitialized) { + bFirstTickInitialized = true; + firstTick_ms = now_ms; + } lastTick_ms = now_ms; uint32_t elapsed_ms = now_ms - sentAtTime_ms; char buf[LONGESTTEXT] = ""; if (oldState != state && ReportInformation) { - oldState = state; (*ReportInformation)(mtStatus, StateText[state]); } + oldState = state; switch (state) { default: case AVRState_T::stPoweringUp: @@ -433,15 +447,11 @@ bool AVRInterface::Power(AVROnOff_E cmd) { return true; } -bool AVRInterface::VolumeButton(AVRVolume_E cmd) { +bool AVRInterface::VolumeButton(AVRUpDown_E cmd) { switch (cmd) { - case eVolumeUp: + case eUp: break; - case eVolumeDown: - break; - case eMuteOn: - break; - case eMuteOff: + case eDown: break; default: return false; @@ -451,7 +461,36 @@ bool AVRInterface::VolumeButton(AVRVolume_E cmd) { bool AVRInterface::RegisterInformationCallback(void(*StatusChangeCallback)(AVRMessageType_T type, const char *msg)) { ReportInformation = StatusChangeCallback; - return false; + return true; +} + + +bool AVRInterface::AVRSendOSDMessage(const char *pMsg) { + const char valid[] = " !#%&()*+,-.0123456789:<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz"; + char buf[17] = { 0 }; + if (strlen(pMsg) <= 16) { + for (size_t i = 0; i < 16; i++) { + if (*pMsg == '\0') { + buf[i] = ' '; + } else if (strchr(valid, *pMsg)) { + buf[i] = *pMsg++; + } else { + return false; // Invalid character + } + } + ProcessSerialQueue("\x02" "21000" "\x03", 7); // Start the OSD message + char msg[8]; + for (int i = 0; i < 16; i += 4) { + strcpy_s(msg, sizeof(msg), "\x02"); // Each chunk + strcat_s(msg, sizeof(msg), "3"); + strncat_s(msg, sizeof(msg), &buf[i], 4); + strcat_s(msg, sizeof(msg), "\x03"); + ProcessSerialQueue(msg, 7); + } + return true; + } else { + return false; + } } bool AVRInterface::ProcessSerialQueue(const void *msg, uint16_t len) { @@ -561,8 +600,10 @@ bool AVRInterface::ProcessReportResponse(const uint8_t *szBuffer, uint32_t len) memcpy(&avrStatus.config.DT0 + MessageHandlers[i].configOffset, &szBuffer[5], 2); } if (MessageHandlers[i].TextFormatter && MessageHandlers[i].fncValueToText) { - sprintf_s(buf, LONGESTTEXT, MessageHandlers[i].TextFormatter, MessageHandlers[i].fncValueToText(rdat)); - (*ReportInformation)(mtInfo, buf); + if (ReportInformation) { // Guard it + sprintf_s(buf, LONGESTTEXT, MessageHandlers[i].TextFormatter, MessageHandlers[i].fncValueToText(rdat)); + (*ReportInformation)(mtInfo, buf); + } } if (MessageHandlers[i].showAll) { showAllFlag = true; // ShowAllStatusInfo(); @@ -570,7 +611,7 @@ bool AVRInterface::ProcessReportResponse(const uint8_t *szBuffer, uint32_t len) break; // no need to scan more } } - if (!found) { + if (!found && ReportInformation) { sprintf_s(buf, LONGESTTEXT, "***** type: %X, guard: %X, cmd: %02X, data: %02X", type, guard, rcmd, rdat); (*ReportInformation)(mtInfo, buf); //Console_Write(buf); @@ -637,16 +678,267 @@ void AVRInterface::PCMessage(const char *msg, int len, uint8_t **src, const char msg, p ); - (*ReportInformation)(mtStream, outBuf); + if (ReportInformation) { // Guard it + (*ReportInformation)(mtStream, outBuf); + } } +typedef const struct { + AVRInterface::AVRSubsystem_E subsystem; + AVRInterface::AVRFunction_E function; + AVRInterface::AVRArg_T arg; + const char *Message; + uint16_t MessageLen; + // Helper? +} MessageTable_T; + +MessageTable_T MessageTable[] = { + { AVRSubsys::eMain, AVRFunc::fncVolume, AVRInterface::eUp, "\x02" "07A1A" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolume, AVRInterface::eDown, "\x02" "07A1B" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncMute, AVRInterface::eOn, "\x02" "07EA2" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncMute, AVRInterface::eOff, "\x02" "07EA3" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::ePhono, "\x02" "07A14" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eCD, "\x02" "07A15" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eTuner, "\x02" "07A16" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eCDR, "\x02" "07A19" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eMD_Tape, "\x02" "07AC9" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eDVD, "\x02" "07AC1" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eDTV, "\x02" "07A54" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eCable, "\x02" "07AC0" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eSat, "\x02" "07ACA" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eVCR1, "\x02" "07A0F" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eVCR2_DVR, "\x02" "07A13" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eVCR3, "\x02" "07AC8" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInput, AVRInterface::eV_Aux, "\x02" "07A55" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fnc6ChInput, AVRInterface::eOn, "\x02" "07EA4" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fnc6ChInput, AVRInterface::eOff, "\x02" "07EA5" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInputMode, AVRInterface::eInpAuto, "\x02" "07EA6" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInputMode, AVRInterface::eDD_RF, "\x02" "07EA7" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInputMode, AVRInterface::eDTS, "\x02" "07EA8" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInputMode, AVRInterface::eDigital, "\x02" "07EA9" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInputMode, AVRInterface::eAnalog, "\x02" "07EAA" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncInputMode, AVRInterface::eAAC, "\x02" "07E3B" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolume, AVRInterface::eUp, "\x02" "07ADA" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolume, AVRInterface::eDown, "\x02" "07ADB" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncMute, AVRInterface::eOn, "\x02" "07EA0" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncMute, AVRInterface::eOff, "\x02" "07EA1" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::ePhono, "\x02" "07AD0" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eCD, "\x02" "07AD1" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eTuner, "\x02" "07AD2" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eCDR, "\x02" "07AD4" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eMD_Tape, "\x02" "07ACF" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eDVD, "\x02" "07ACD" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eDTV, "\x02" "07AD9" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eCable, "\x02" "07ACC" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eSat, "\x02" "07ACB" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eVCR1, "\x02" "07AD6" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eVCR2_DVR, "\x02" "07AD7" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eVCR3, "\x02" "07ACE" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncInput, AVRInterface::eV_Aux, "\x02" "07AD8" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncPower, AVRInterface::eOn, "\x02" "07A1D" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncPower, AVRInterface::eOff, "\x02" "07A1E" "\x03", 7 }, + { AVRSubsys::eZone1, AVRFunc::fncPower, AVRInterface::eOn, "\x02" "07E7E" "\x03", 7 }, + { AVRSubsys::eZone1, AVRFunc::fncPower, AVRInterface::eOff, "\x02" "07E7F" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncPower, AVRInterface::eOn, "\x02" "07EBA" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncPower, AVRInterface::eOff, "\x02" "07EBB" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncPower, AVRInterface::eOn, "\x02" "07AED" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncPower, AVRInterface::eStandby, "\x02" "07AEE" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncMute, AVRInterface::eOn, "\x02" "07E26" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncMute, AVRInterface::eOff, "\x02" "07E66" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolume, AVRInterface::eUp, "\x02" "07AFD" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolume, AVRInterface::eDown, "\x02" "07AFE" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::ePhono, "\x02" "07AF1" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eCD, "\x02" "07AF2" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eTuner, "\x02" "07AF3" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eCDR, "\x02" "07AF5" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eMD_Tape, "\x02" "07AF4" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eDVD, "\x02" "07AFC" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eDTV, "\x02" "07AF6" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eCable, "\x02" "07AF7" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eSat, "\x02" "07AF8" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eVCR1, "\x02" "07AF9" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eVCR2_DVR, "\x02" "07AFA" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eVCR3, "\x02" "07AFB" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncInput, AVRInterface::eV_Aux, "\x02" "07AF0" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncOSD, AVRInterface::eOSDOff, "\x02" "07EB0" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncOSD, AVRInterface::eOSDShort, "\x02" "07EB1" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncOSD, AVRInterface::eOSDFull, "\x02" "07EB2" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSleep, AVRInterface::eSleepOff, "\x02" "07EB3" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSleep, AVRInterface::eSleep120, "\x02" "07EB4" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSleep, AVRInterface::eSleep90, "\x02" "07EB5" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSleep, AVRInterface::eSleep60, "\x02" "07EB6" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSleep, AVRInterface::eSleep30, "\x02" "07EB7" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEx_EsOnOff, AVRInterface::eOnMatrix, "\x02" "07EB8" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEx_EsOnOff, AVRInterface::eESESOff, "\x02" "07EB9" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEx_EsOnOff, AVRInterface::eAuto, "\x02" "07E7C" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEx_EsOnOff, AVRInterface::eDiscrete, "\x02" "07E7D" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncNightModeOnOff, AVRInterface::eOn, "\x02" "07E9B" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncNightModeOnOff, AVRInterface::eOff, "\x02" "07E9C" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::eEffectOn, "\x02" "07E27" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::eStereo, "\x02" "07EE0" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Hall_A, "\x02" "07EE1" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Hall_B, "\x02" "07EE2" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Hall_C, "\x02" "07EE3" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Hall_USA, "\x02" "07EE4" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Hall_E, "\x02" "07EE5" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Live_Concert, "\x02" "07EE6" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Tokyo, "\x02" "07EE7" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Freiburg, "\x02" "07EE8" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Royaumont, "\x02" "07EE9" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Village_Gate, "\x02" "07EEA" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Village_Vanguard, "\x02" "07EEB" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::The_Bottom_Line, "\x02" "07EEC" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::The_Roxy_Theater, "\x02" "07EED" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Warehouse_Loft, "\x02" "07EEE" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Arena, "\x02" "07EEF" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Disco, "\x02" "07EF0" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Party, "\x02" "07EF1" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Game, "\x02" "07EF2" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Stereo_6_8Ch, "\x02" "07EFF" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Pop_Rock, "\x02" "07EF3" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::DJ, "\x02" "07EF4" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Opera, "\x02" "07EF5" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Pavillion, "\x02" "07EF6" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Mono_Movie, "\x02" "07EF7" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Variety_Sports, "\x02" "07EF8" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Spectacre, "\x02" "07EF9" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Sci_Fi, "\x02" "07EFA" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Adventure, "\x02" "07EFB" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::General, "\x02" "07EFC" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Normal, "\x02" "07EFD" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Enhanced, "\x02" "07EFE" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::PLII_Movie, "\x02" "07E67" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::PLII_Music, "\x02" "07E68" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Neo_6_Movie, "\x02" "07E69" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Neo_6_Music, "\x02" "07E6A" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Direct_2Ch, "\x02" "07EC1" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::Stereo_2Ch, "\x02" "07EC0" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::THX_Ultra_PL, "\x02" "07EC2" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::THX_Music, "\x02" "07EC3" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::THX_Ultra_PL2, "\x02" "07EC7" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncEffect, AVRInterface::THX_Ultra_NEO6, "\x02" "07EC8" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetPage, AVRInterface::eA, "\x02" "07AE0" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetPage, AVRInterface::eB, "\x02" "07AE1" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetPage, AVRInterface::eC, "\x02" "07AE2" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetPage, AVRInterface::eD, "\x02" "07AE3" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetPage, AVRInterface::eE, "\x02" "07AE4" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetNumber, AVRInterface::e1, "\x02" "07AE5" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetNumber, AVRInterface::e2, "\x02" "07AE6" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetNumber, AVRInterface::e3, "\x02" "07AE7" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetNumber, AVRInterface::e4, "\x02" "07AE8" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetNumber, AVRInterface::e5, "\x02" "07AE9" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetNumber, AVRInterface::e6, "\x02" "07AEA" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetNumber, AVRInterface::e7, "\x02" "07AEB" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetNumber, AVRInterface::e8, "\x02" "07AEC" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioBand, AVRInterface::eFM, "\x02" "07EBC" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioBand, AVRInterface::eAM, "\x02" "07EBD" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioTune, AVRInterface::eUp, "\x02" "07EBE" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioTune, AVRInterface::eDown, "\x02" "07EBF" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSpeakerAOnOff, AVRInterface::eOn, "\x02" "07EAB" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSpeakerAOnOff, AVRInterface::eOff, "\x02" "07EAC" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSpeakerBOnOff, AVRInterface::eOn, "\x02" "07EAD" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSpeakerBOnOff, AVRInterface::eOff, "\x02" "07EAE" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetMemory, AVRInterface::eA, "\x02" "07E2B" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetMemory, AVRInterface::eB, "\x02" "07E2C" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetMemory, AVRInterface::eC, "\x02" "07E2D" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetMemory, AVRInterface::eD, "\x02" "07E2E" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetMemory, AVRInterface::eE, "\x02" "07E2F" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetMemory, AVRInterface::eF, "\x02" "07E20" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetRecall, AVRInterface::eA, "\x02" "07E35" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetRecall, AVRInterface::eB, "\x02" "07E36" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetRecall, AVRInterface::eC, "\x02" "07E37" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetRecall, AVRInterface::eD, "\x02" "07E38" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetRecall, AVRInterface::eE, "\x02" "07E39" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncRadioPresetRecall, AVRInterface::eF, "\x02" "07E3A" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeMemory, AVRInterface::eA, "\x02" "07E6B" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeMemory, AVRInterface::eB, "\x02" "07E6C" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeMemory, AVRInterface::eC, "\x02" "07E6D" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeMemory, AVRInterface::eD, "\x02" "07E6E" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeMemory, AVRInterface::eE, "\x02" "07E6F" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeMemory, AVRInterface::eF, "\x02" "07E60" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeRecall, AVRInterface::eA, "\x02" "07E75" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeRecall, AVRInterface::eB, "\x02" "07E76" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeRecall, AVRInterface::eC, "\x02" "07E77" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeRecall, AVRInterface::eD, "\x02" "07E78" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeRecall, AVRInterface::eE, "\x02" "07E79" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncVolumeRecall, AVRInterface::eF, "\x02" "07E7A" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeMemory, AVRInterface::eA, "\x02" "07E87" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeMemory, AVRInterface::eB, "\x02" "07E88" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeMemory, AVRInterface::eC, "\x02" "07E89" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeMemory, AVRInterface::eD, "\x02" "07E8A" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeMemory, AVRInterface::eE, "\x02" "07E8B" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeMemory, AVRInterface::eF, "\x02" "07E8C" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeRecall, AVRInterface::eA, "\x02" "07E8D" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeRecall, AVRInterface::eB, "\x02" "07E8E" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeRecall, AVRInterface::eC, "\x02" "07E8F" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeRecall, AVRInterface::eD, "\x02" "07E90" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeRecall, AVRInterface::eE, "\x02" "07E91" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncVolumeRecall, AVRInterface::eF, "\x02" "07E92" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeMemory, AVRInterface::eA, "\x02" "07E20" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeMemory, AVRInterface::eB, "\x02" "07E21" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeMemory, AVRInterface::eC, "\x02" "07E22" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeMemory, AVRInterface::eD, "\x02" "07E23" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeMemory, AVRInterface::eE, "\x02" "07E24" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeMemory, AVRInterface::eF, "\x02" "07E25" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeRecall, AVRInterface::eA, "\x02" "07E60" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeRecall, AVRInterface::eB, "\x02" "07E61" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeRecall, AVRInterface::eC, "\x02" "07E62" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeRecall, AVRInterface::eD, "\x02" "07E63" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeRecall, AVRInterface::eE, "\x02" "07E64" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncVolumeRecall, AVRInterface::eF, "\x02" "07E65" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDC1TrigControl, AVRInterface::eZone1, "\x02" "07E32" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDC1TrigControl, AVRInterface::eZone2, "\x02" "07E33" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDC1TrigControl, AVRInterface::eZone3, "\x02" "07E31" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncDC1OnOff, AVRInterface::eOn, "\x02" "07E71" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncDC1OnOff, AVRInterface::eOff, "\x02" "07E72" "\x03", 7 }, + { AVRSubsys::eZone1, AVRFunc::fncDC1OnOff, AVRInterface::eOn, "\x02" "07E73" "\x03", 7 }, + { AVRSubsys::eZone1, AVRFunc::fncDC1OnOff, AVRInterface::eOff, "\x02" "07E74" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncDC1OnOff, AVRInterface::eOn, "\x02" "07E83" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncDC1OnOff, AVRInterface::eOff, "\x02" "07E84" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDualMono, AVRInterface::eDualMain, "\x02" "07E93" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDualMono, AVRInterface::eDualSub, "\x02" "07E94" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDualMono, AVRInterface::eDualAll, "\x02" "07E95" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDC1TrigControl, AVRInterface::eZone1, "\x02" "07E96" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDC1TrigControl, AVRInterface::eZone2, "\x02" "07E97" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDC1TrigControl, AVRInterface::eZone3, "\x02" "07E9F" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncDC1TrigControl, AVRInterface::eZoneOR, "\x02" "07E98" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncDC2OnOff, AVRInterface::eOn, "\x02" "07E3C" "\x03", 7 }, + { AVRSubsys::eZone2, AVRFunc::fncDC2OnOff, AVRInterface::eOff, "\x02" "07E3D" "\x03", 7 }, + { AVRSubsys::eZone1, AVRFunc::fncDC2OnOff, AVRInterface::eOn, "\x02" "07E3E" "\x03", 7 }, + { AVRSubsys::eZone1, AVRFunc::fncDC2OnOff, AVRInterface::eOff, "\x02" "07E3F" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncDC2OnOff, AVRInterface::eOn, "\x02" "07E85" "\x03", 7 }, + { AVRSubsys::eZone3, AVRFunc::fncDC2OnOff, AVRInterface::eOff, "\x02" "07E86" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSpeakerBZone, AVRInterface::eZone1, "\x02" "07E28" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncSpeakerBZone, AVRInterface::eZone2, "\x02" "07E29" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncZone2SpeakerOnOff, AVRInterface::eOn, "\x02" "07E99" "\x03", 7 }, + { AVRSubsys::eMain, AVRFunc::fncZone2SpeakerOnOff, AVRInterface::eOff, "\x02" "07E9A" "\x03", 7 }, +}; + +bool AVRInterface::AVRCommand(AVRInterface::AVRSubsystem_E subsystem, + AVRInterface::AVRFunction_E function, + AVRArg_T arg) { + bool found = false; + for (int i = 0; i < sizeof(MessageTable) / sizeof(MessageTable_T); i++) { + if (MessageTable[i].subsystem == subsystem && MessageTable[i].function == function and MessageTable[i].arg == arg) { + found = true; + ProcessSerialQueue(MessageTable[i].Message, MessageTable[i].MessageLen); + break; + } + } + if (!found) { + // then what? + } + return true; +} + + /// ReportAllStatus /// /// This emits (via a callback) all the status, in DT0 to DT137 order. /// You cannot rearrange the sequence to make grouping more logical. /// void AVRInterface::ReportAllStatus() { - if (avrStatus.headerValid) { + if (avrStatus.headerValid && ReportInformation) { char buf[LONGESTTEXT]; sprintf_s(buf, LONGESTTEXT, "Model ID: %c%c%c%c%c, ver: %c\n", avrStatus.header.type[0], avrStatus.header.type[1], avrStatus.header.type[2], avrStatus.header.type[3], avrStatus.header.type[4], diff --git a/AVR Working Controller/AVRInterface.h b/AVR Working Controller/AVRInterface.h index 9ee335c..f830325 100644 --- a/AVR Working Controller/AVRInterface.h +++ b/AVR Working Controller/AVRInterface.h @@ -46,11 +46,14 @@ public: } AVROnOff_E; typedef enum { - eVolumeUp, - eVolumeDown, + eUp, + eDown, + } AVRUpDown_E; + + typedef enum { eMuteOn, eMuteOff - } AVRVolume_E; + } AVRMute_E; typedef enum { eOSDOff, @@ -89,7 +92,9 @@ public: e3, e4, e5, - e6, e7, e8 + e6, + e7, + e8 } AVRPresetNum_E; typedef enum { @@ -99,7 +104,7 @@ public: eD, eE, eF - } AVR_PresetPage_E; + } AVRPresetPage_E; typedef enum { ePhono, @@ -118,51 +123,213 @@ public: } AVRInput_E; typedef enum { - cmdZone1, - cmdZone2, - cmdZone3, - cmdSpeakerSetB, - cmdNightMode, - cmdTrigControl1, - cmdTrigControl2 - + eMain, + eZone1, + eZone2, + eZone3, + eZoneOR } AVRSubsystem_E; + typedef enum { + Hall_A, + Hall_B, + Hall_C, + Hall_USA, + Hall_E, + Live_Concert, + Tokyo, + Freiburg, + Royaumont, + Village_Gate, + Village_Vanguard, + The_Bottom_Line, + The_Roxy_Theater, + Warehouse_Loft, + Arena, + Disco, + Party, + Game, + Stereo_6_8Ch, + Pop_Rock, + DJ, + Opera, + Pavillion, + Mono_Movie, + Variety_Sports, + Spectacre, + Sci_Fi, + Adventure, + General, + Normal, + Enhanced, + PLII_Movie, + PLII_Music, + Neo_6_Movie, + Neo_6_Music, + Direct_2Ch, + Stereo_2Ch, + THX_Ultra_PL, + THX_Music, + THX_Ultra_PL2, + THX_Ultra_NEO6 + } AVRDSPProg_E; + + typedef enum { + eInpAuto, + eDD_RF, + eDTS, + eDigital, + eAnalog, + eAAC + } AVRInputMode_E; + + typedef enum { + eDualMain, + eDualSub, + eDualAll + } AVRDualMono_E; + + typedef enum { + fncPower, + fncVolume, + fncMute, + fncVolumeMemory, + fncVolumeRecall, + fncSpeakerAOnOff, + fncSpeakerBOnOff, + fncSpeakerBZone, + fncZone2SpeakerOnOff, + fncNightModeOnOff, + fncEffect, + fncInput, + fncRadioBand, + fncRadioTune, + fncRadioPresetPage, + fncRadioPresetNumber, + fncRadioPresetMemory, + fncRadioPresetRecall, + fncDSPProgram, + fncSleep, + fncOSD, + fnc6ChInput, + fncEx_EsOnOff, + fncInputMode, + fncDualMono, + fncDC1TrigControl, + fncDC2TrigControl, + fncDC1OnOff, + fncDC2OnOff, + } AVRFunction_E; + + typedef union { + AVROnOff_E onOff; + AVRUpDown_E volume; + AVRMute_E mute; + AVRPresetPage_E volumeMemory; + AVRPresetPage_E volumeRecall; + AVROnOff_E speakerA; + AVROnOff_E speakerB; + AVRSubsystem_E speakerBZone; + AVROnOff_E zone2Speaker; + AVROnOff_E nightMode; + AVRInput_E input; + AVRTunerBand_E band; + AVRUpDown_E tune; + AVRPresetPage_E presetPage; + AVRPresetNum_E presetNumber; + AVRPresetPage_E presetMemory; + AVRPresetPage_E presetRecall; + AVRDSPProg_E program; + AVRSleep_E sleep; + AVROSDScreen_E osd; + AVROnOff_E sixChInput; + AVREX_ES_E ex_es; + AVRInputMode_E inputMode; + AVRDualMono_E dualMono; + AVRSubsystem_E dc1TrigControl; + AVRSubsystem_E dc2TrigControl; + AVROnOff_E dc1OnOff; + AVROnOff_E dc2OnOff; + char *pMessage; + } AVRArgument_UX; + + typedef uint32_t AVRArg_T; + + /// @brief The single command path to control the AVR + /// + /// This lets you send a command to the AVR using this single interface, by choosing + /// the AVR Subsystem of interest, the Function of interest, and passing an argument. + /// + /// @param[in] subsystem: Main | Zone 1 | Zone 2 | Zone 3 + /// @param[in] function : Power, Speaker, Volume, etc. + /// @param[in] arg: on/off, etc. + /// @return + bool AVRCommand(AVRInterface::AVRSubsystem_E subsystem, + AVRInterface::AVRFunction_E function, + AVRArg_T arg); + /// @brief Send the power command /// @param cmd /// @return true /// bool Power(AVROnOff_E cmd); + bool VolumeButton(AVRUpDown_E cmd); - bool VolumeButton(AVRVolume_E cmd); - + /// @brief AVRMessageType_T + /// + /// Indicates the type of message being sent to the status change callback + /// typedef enum { - mtModelInfo, - mtStatus, // Special State machine status - mtInfo, // General purpose information - mtStreamStart, // Stream start - mtStream, // Status stream that word-wraps... + mtModelInfo, ///?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz" + /// @return true if the message was accepted for sending, false if it is too long or has invalid characters. + /// + bool AVRSendOSDMessage(const char *msg); private: uint32_t sentAtTime_ms; @@ -365,6 +532,7 @@ private: SerialQueue_T serialQueue[SERIALQUEUESIZE]; int serialQueueCount = 0; + bool bFirstTickInitialized; uint32_t firstTick_ms; // basically the time when the program started uint32_t lastTick_ms; // @TODO instead of this, offer a way for the class to get the current time diff --git a/AVR Working Controller/ConsoleHandler.cpp b/AVR Working Controller/ConsoleHandler.cpp index a198d7b..391e967 100644 --- a/AVR Working Controller/ConsoleHandler.cpp +++ b/AVR Working Controller/ConsoleHandler.cpp @@ -35,16 +35,6 @@ void Console_Init(short Width, short Height, short bottomScrollHeight) { newSize.X = consoleWidth; // columns newSize.Y = consoleHeight; // rows - // Step 1: Shrink window if needed before shrinking buffer - SMALL_RECT tempWindow = csbi.srWindow; - tempWindow.Right = tempWindow.Left + (newSize.X - 1); - tempWindow.Bottom = tempWindow.Top + (newSize.Y - 1); - - if (!SetConsoleWindowInfo(hStdout, TRUE, &tempWindow)) { - fprintf(stderr, "Error: Unable to temporarily resize window. Code: %lu\n", GetLastError()); - exit(1); - } - // Step 2: Set new buffer size if (!SetConsoleScreenBufferSize(hStdout, newSize)) { fprintf(stderr, "Error: Unable to set console buffer size. Code: %lu\n", GetLastError()); diff --git a/DataSheets/Yamaha RX-V2400_RS232C_CommandsForSW.pdf.xlsx b/DataSheets/Yamaha RX-V2400_RS232C_CommandsForSW.pdf.xlsx index 41c2dde5f5e6b2ae784360651f705e7a62f4a2ad..e6bbd415f2c1d8d24584efe5e45b85b525c1af82 100644 GIT binary patch delta 52258 zcmYIubyQUC8|~0YBQ0H$64DJy$I#s&0+NH2#G$3Tq$Q=LJEc>)yE})DJAS`=*ZpJG zS!>p;eV*LUexG;ZlMq_c5r01*16_UtPBe%hPy!kVgbf0L+-=$293WrJ92~x|x!c*6 zYS}3t^5Q>>TE9?-$D9=62szl%ER?j^$T|keqof4}E_KsW$Sn!5;s1PCbxY@^|7(5F z@Uf@pcym{H_f~*GD)4BQ$6oX&45Q|>i5v+MPaVqrWyGO06%X7Gh>gv zX1W~=JntX<2=7DMjeY~-K9*$9H$Wf1 zO97?$iwi}%7`H);6q2a}@Vmqg(M$NY4;8uO22mfS+$ITqQRGkG-3 zwk!rBNA%gPS0{+}ZNOaOkpLa};*Am;yw{5jJ!93jVg6#Zn2$x{>jQr&auO@iZR4Co`rmFKEvM{(sc$Nf^< ztB*>xBk#VTJ!4=Q^i9_$``A3-Y&h4u4Wa4!8wu;b@@c+i`2=9osBtsge@VX^n3Jx<4SJq)?2Y;oXi7-x8X;{&d?#m>8n-{4qDDfjT zk^rXI_V9vi_FS7<4pUJR7@Uku2zJgChY#N@2y_2!6{%@xZH11vslWNVs{c{+dgj^> zs=#7hW~e|j`w<|zUW;*d{8c@Z6Sfr9I13Ao#qDh$bsp%x zcdy1%F+?{esrWf2zBv4Ia()~El4iw6?}ftc9MQynq(i1yUPZiyVQKSLN^_!juHroDn`RW7C4mVj| zNFQ#MUrzk`u;cIO2*wMtKT7Wx$=B(?%SVx=Xu#b-^5EPNSUu(~x54z6W{>P%+xjMB z1A8J@|8E~=?9j&~eGpMX>zkaWz38x(xVuPB~)W z{XZ5-PcU>yF-WjGe2T1DY7hQrsZ%^znzHq&c9Uf_INiIy@Cj<-4hRyirAl7S^(as@FboyWhM(H?xn%nT)hF=@z8_8a|1qzO&94D zo|-@q^{c%KC6H<4WwgIIeW0g&+XelZ6 zK(T+*4L{Y?g2Ju)8MKdk`IP8~4LDyVXNor_W99PGU1&UiAcb5qRJm)d1Bg8eN<+?6 zS?Ob4KkL5$bG!un-b3YDq@R4p{{CuLbQpnb>zNgM*_}|5uak9j*Uj;e{c`cn?qp|x zrAZH;OwhKtijIZrYrrJKm~*Ui?cUoxhR;GSg!-wa6uLdXEMt&p6~eDsSfJ!3#Td)x ze3D5&<`Z$oq#r=ajWNR`&xpRLi0i`yMme{0Xn2Q^Q|ku>0)WAs?atxZqs6PJPj@ z8pCt%Fgo{Ws{S+{rctLw_^D4f`^&J4+uR1*y?u?n5isVwcD*jj0FDKQB9plo2Sz~*hS0RSLd-wze`tRVcX ztvpinxwMk=+Bb7zD=&>kVr0f52CdKMC)Z-^CqCZ^2y#ZF_11e@@Mf4E z7d}_9wp8AX-#hN6KJG)!9*wn)+n>hL*2l)rcHM8QzeAJL4EkJtWQ9^u>?9@)r_^ZF)XRym zbfOui?x7#7;px#cewWlKFD*^_FXtCM%lDJY?5oOvQEOIH?A~)VsjG3Dkz#NR@iQ4F z5cOS5;fBTj!vvYT~Hq zN(pDXOA*Cu6YaNxgTubId~(@7clCOp+(TjW_>>&4om^D)lw2_uyn6U_wktdx2Y;a? zK($NS>Eu}Hb_+^>Z$@tx{Np+gANOqd!sm2(TGWOeXun2}i!&bfS5NiI?AsPAHm&AW#_ylylq$E;J9A?`za4L)!0G&+QdQpJlHdLiXH&bsN+ywnEvRG zau-p=I-zHlG4~r9mmjdbjWFdlw)Ya=jGZoeEhtj)l;gWbI}z?VT@|nv&~F{yock+#AyosYf%s#i28d!zZf+xY zaFIfPY1EtWI$ll*Ri5al5>y9y1PikIvRIo^{KkGyZY(@MaMr8v=!q&QkKaLZ05OjuzWzgN?a^I6V5_B@zb9FMwvve}anm&6&ABcE_ ze)9kIIE@`$RB$EFxXC^vV5Fe$g6~0LIc=$pE^sH`?Ph4Zd*tJc?Ku7tOa56=E$_K7 zg>9HC@vetwK*P-?uF5w7&Z@@j9&91E(xg@3@Ke#qpwkk#rFTF(^OA5s;c3On#C~n! zx2sCYde*`wN)Zi#s+Mu`bP)UO#-mcb!dl)hax*h*mgGsbj4tTzdBoP462pe!oU2IaQhW4dI)- z-0R!TbB6}a{zU}OAjwEd50Z+2m4E~7Y_|kN^eeC#%>WHnSsE8HYSBJ)f7a>o(pN~3)IXbScHe%Xut*XnLyvgyDhms2QX5t< z_BRv1byZeY4&i}_i1kMNqHEQVa|`@K!gvRK=2pDiI_{FjP>wOxl7F^J*ItN|cdbD_ z6<_~wjyFV2YGDd$9O&!WTy2P-pw^|pfqHMfMHgARK9S1*%#p;~iBgi1Zjxzh6?xPO zoTv9gHqC7b%3IF&15qr?vbw7-$U*K!A@zPckz2tx)h_Ixf%BG3px3CTL*$$C2yJrTRr)QW>=c~a)BUPm2-pa z<>tN|Zg^HossYI6CM_twcw$_#Qa1{y{(34Y=wYpekHWXj?`t3MxWNv zy1FpWUSHh9=dyD8E^hjpH-Aqo(hXBm<~YWXjwkH_)t+V~lefNuDLC-nw82Nq8Pc0ZFHlTuO<;S=)H-}T*0q} z?br?OL;RX~d`qm_@V2=%FT7G6er8e_8?DJ5xgJloa(uWDJ^ngeGik*dyYyF>VBoN6 z@BPesx;~S8vwvh|>FU8C4YAguBia$zX$LjX2x#J0YqAuu!PtKHM_O-+c|I13U%zp6a)xeS8_T+(A%10Ogx?gU z=V>6?2PaPHBur)iA^8gE;)e2gX)!m4zmPM&QS~}oYYD?Z-~I#jNXu?YZ}BsL>(CTl z4b4tv_V8(M3;NZhLqf1G29b^wf_m!b7v=$AL`2j!C&x zYwVF_J0uNXDxdxt~RdeH}PwLq6AK2 zqgZ@@*5YOLc;rng(MiZTd%J+zkx+7-$|vY21$;@Hsyd$qfLgT(m?RJWL zJ9D?9IG|Z^ye)Y6U1(P%_`;Qliz+M{xA&Ka* zSWS0$>EoQj>*E}uMV*oh>Kusekjug$TM9=k{NTvSjEW`pQn{W> z2oRA{mfYO*mfrM5=ILl%KmU%s;uY*!p*+pP<=I;?PQ~UR$C5V}RAAgI;9#wgR zVn9HSUoRra7=cT!#jIjuqkQ9FSlsPo@~vCiSCqv4{a%eLuL?I|fz0?Ig5*$#pm)CCw)z1< ztNva7&0NgMj**rwY1-ARj?Pwoc#H|#(6wMtsWj*~_f;l(M{#(x5)NV?QwxB~+Y<}_ zo2G%Il(E#X0h3nm_*{WmoJ0nFfi4>&lo zL%dWR6v!&RH22|(p6>DV;YGQ;NFc^cx({!kgCjQ8UNrxi${CM1OXe^M5cQ?hVl;$p z;@4+v;uj=t>W8$;^ihh_$zm@}g~#V@%VnLBE`?(hb~&&P7BcDGY8L*%By(}+y_e0| z6m54ilT7ZaplRYL@l2&_c>4`VJ8S0e`cv&&5(0Kw3U9iXR8An@Tnr3{a>qAjpJfm5zXBlA5J0VqU~WS?V>D<9$`y)1g|O zH1|3-9HWLmV@rvXcO*#HAr)q12h7OgzKPnWB-&vWkb#s-*do{kZBpI^&FqW(J#rz; zPRY+%x(9elHz;*?J*v;P(e+ST&)$kDim^zV=~z(DP4( zT~uPB6udeGs7pcRB|%a;uDZ_oDPNc<%T;yjw3;jTdvo|POVycUB0Z-Au|K8 zLXj;XK-RFz;DdZaGm?8@H8yIl3U>bZ*gfAE6u?I#Nhu&CgE=L{S?7$Yk)*{ZC|7Oi znT!0bCXm~+L(_IO5;@hTGN3Z?Sl=qUHxb=Wh4XJ(y!!74Z)Pi4r=%BW|C{>dj$LC7+#pBk>I+fQ`whMZWg7nm74N(@f595+ zf^X|ci#hO{Lci2Zg5b6?Sj*Z2nW5S|g$^1jGJX7rvIYc{PiV#G%O_X1Bf$Fk&@pgE zsz5}R$2p!H&_72Un{oXl`o!HpWFBx(SjiY2nU|&KR;35B3ByaHa$T4XG-A&EE%-P; z8;^+{wmK0J+E!I_@i#1c*is!}~%+C&m`S8Qvua3qJ*XsYOL5V7uLKMGdaX#P36+I}*NA^xcMN;Q8 zKkvS0Qu$1>ehE_h!CCaGB_LUi+41aibf=)ZwHA2`z8OL1V&2p?2Eb)*Q8Fc$Z&CL{ zcPT*w@ib9wgu(}%X?ky+35_G&qUQ*P3nRXupK3O&gP!gm?R%Uz2(iwrw!N#OD8wSk zsc(_W;Xe*3n`n`@PFZWpu)F9HpxDVDUW~vqT)ftHxoTF`o2(YA$X)$lJxwlx6l;1G zOoq7XR&x}i8{o+aUeDCz7^3oul@&=n3K5k{YnUM-kl)AHx6t@#uiu{b; z8N_~n?p&b69Ti^aNBtN~JTBY3R7Ukj2y7^_7v8T~MBss+a{MoD!3n0lw9Oi!`TOAf> zQNFLEurvc_K!(Y0&na&rvxe~9I^s3fL_@_NiLJKLxT8a|t5>z1t;BQzfqH0h$Uk|z zs&UQd*PLH_cU$?^qh)<7wB`0)z5mR?k{LeXOonM;J>p#aN!0F?-N^%1-@A+ZwPCw3 zBHPv9t0lq)wE2L?XL2mRyzln&o4Rp4ClXl(F#fhEgxIml7mAWnw)Y|Y=}{v-7j$qK z?ga^N5Di@j3Fl05Ag^&im~A+EK}9DU<_8h-IhcA`AirfvzO<6$-4pA1?F zb-7oY)a*{m*DPdLU@@z=ZW?0R`8gmByLKzwF9v6I)fleC>e=+!AENo@%33OuR6igt z2S^;(++5{WayQDE+0C$*5cpnq+6{dwrH{sGh3_XA9;becU?}=|_b9oHL7ZWB8ahYejeN2G3MQIW_c{UI+y6aw4_wq}7nb-w^lr*|Ay4f!BW4HF*o2~k0D2#~K+ z7HEzah!*i<_?dc+ips^H2gcgukTPuth7G_L zr4_@{wSiGMZCo!Q4{etX0KcFXZ}r1Ut-UjB0#=PQ(ohnMIi??~xWm|clcMC;S#M7I zCW61tMDZ){i*qtDbacAcPyNP;J)0 zUGgP8oBPDzt#jf!N4+45fdzk`ohAQwYYTpqN)mhH&F)x}@((AhY1h`(ovr49N14UyhqUQg z{__F=G(IpwIVoz$+dvcwcA3{nz+2{*4#!KvjG~v6%3b=_{fB-flrudmD=~kX2Ru7#6ryI$$Jq-A?V$Ea-+BRBm=_pEsj1bV&?eR7;5? zz2Q6W1@#SlLY)+?h2aT^TIJ`La6-ZUr2jh6P1BtxP*?dE6Wk^5IRM123s zMk^mbIs~D7gTKcvE8&JYe`dwhrkI?ujEK((--KU)O7vJ=9+us84W>vbz=M4yJHg(u z^zd!2>U%P0xE4I~27FqAKS8>NOLUz)fAs0qTI^pt68vGZ7y9E#uNJ?q&zN_TiS3>@ zbk*&e4eA;2j-M0_f{jZiQLE&9aEk1hBGFkf`X>iMt_o0YX^549_d zg6psBFM0D^>(|=m0D+AzgY?& zm#&@FNs!SGxNhn^pJb?wwYI8gz;iyp)k$$W)=biJla;H+;wn}c4X#kSU&Rpnj@-a( z=9=4DpqB{{an`)M93kSVX4KVplRfVx!{QI!+;X;3XVG3Y zR!U*R=5tQ|wu|0EjA|yMT*9Hj__u4Y6VtZh4JE?!Av9Xdp#Ay$zGqpPU0F)xo|(xy zvqV#RWpJLF)pQhO5UQ`SuoO6O5s8MUS|&fFJPj;7@@kXxY6_9{%wdSM`ws7+W104a zd>rTFbfm(iJF!bd@z>4rB3)9DcpVueC0#Q?Rq4ec%PT7VW=GEEL%HCHY8w=+jL->Z z^p<`kY<a6&8P1IEOjGW_Vi~yEtzR9C86|(b*p+;MQLToi(Ejs)}?1S2_! zlbmqcQgZDVU!-11aZ3A#vmZkF`1RBDY`&+GGr-A=x$)y8qRI8ALyOvBihxn$DN@QK z+X||UB7adiF>OWV+t32S~Fd-2f%+ghQ}J z>kt#F=^bjjnez{d1uS9{0Xgk7=spY-#%?eF*ezJP)KYk$PhKc05jAPE`vE4%lhFSM z3bzbPY-KuHDajD$F)?hj_y9Ey-)_CAm`_&6>4H4|WSivTi%qwn7`vxiTQi~)Nc4p% ze8@Yv!*by}K&Qy2^0gd95po8O*y<{k%S_w#Y!E+;`!8 zS>n_`anlM|mcW(Mc(mVtiA~R`8P#S)1*iqsvi@gaUdhOP&FVh`r+xkzSoU-PgCpLz zVKE+<1V2%8Y}3`jB~|>jZi_TByDOGPD8eX-99|M$4UlzbNEKKO__XtbV=N&jadff`@&aP0$n>&Z4Bj9JG|Gdb6ciMk- zNX(|u0!v|o)w$Mpg^Nnasu}$SKHAQnCj;->Ez5v|35<_3B)%n_Kb2Yx+d7x{Iy5y- zi5%V)t0%A(J5aB&u_qDr+G9$=7sTT?=w=1Nbev-0YkStgAEHzZOX$h|zI^MXpoSK) zP*KQrZVFqz;xtgSYZKsPn_<)~|k#d+9mPUiMmxkd0>D6dO6xt*Yj} zgVeXg(R#`mdsSSTd#%`UJ~T6p*?Pu#6?mS_!v0(jl$Py_%CIQim>R56z1P7SsJ*)s z)#Pg+0s?}Hn<^QxlME^~J9Frbd7eTO`}eU2>&A=lkuO-;z)@c7N(sX*#32(YAKc!` z9}+mcpOudMm`(;)juw!CTG!&z`>XShZ(R`%@*jIqHulhy_m}Z@zvA;NDC>B2PI7 ze*$U$k<6VE>Mc|6&^)iiE8^3f5LRRr^VT!|D8GOtQ@LpdQlrG(PtrPmwGZD`avP^m6K%H`cA4t+J3}D6Idtf@ex(GrzQ+=~sBs z>#~V4BUWN&_Pgd+&*k+{K*=w}SkGTYWZZt@R@|gqYKJWM)$+Yg1TX;I0;`)S7)&2hoMvYfd zQUZOL^g2$$+WzO@Ii1k0hSX|jf?0FnAm7Ytg;;GROS*;){zSU03G$?rKvqCMAIpHg zdSrAbHG~<%q2HR>Sc><*y`-?gW)n4KzqC=QbiT-4f5c#Nqv%-~dCG9|6x9vs`QTVnD zxQ2s4^L^$KP83+qMwslKwZW>X)?n2^!@JjoTlgqVkT`#@Iff;eydB7`{LM*Hmav5> zIuse5=%1cS#Y@FW^gQK>8>diB1G_7b>Db@`$;82SGFvG?07io>Bx+F}5;Xz)n8iIV z@3zlSM%z1-&mQ2slR+qsm)!azx(<`4Mc^QqrRpND>gRdUM)i34wP+yR9{{YcLQtcK zgRat|%ru4+<5zQG`;j?^uiYl$v^l*Qa=sLAd6XzenZ19yxL#d#ijVyRlWgF7)2tVFVn||E~;w67Fn~@6f_8q%p6%?Z!9j(8Ooo z2u@4z5g}{8cfl8x-#w|h*eq*r-rqRCc{sf}*(e}d=glW7d_IYDjMcPk0Unq8I}}I8 zJ8=#k)(#%dG*+#CIY8Z=pEMT7JnRDYCxMY#CW*u^&2G`=$Rh{#Pj@$c%|It>2(83Y zj2Fyt518YdmN+H~)!E1%yj_z;&%J$vGEveYq{GISMy&RMx_wIanQJ5j9a>J4j5TbW zl(5tTi;(dTTOp{gd%RRGVAro!P_(bC_}X~>$ZXzDAB@YRrMw2@%3w|Q zmAMvn!QpEaqxX(%DI{97!)Dr)4TR#FsRA~+J&IdkoqLHnSP~SFmNbsSA8n1i z67H1AQkru`HrAaE*RbJL0(7CN4a2sjqp)r1sB?$+_Y@t(lOynYsRm+QU_d z20fl(i=&=clfw@_%g~E4XdhoaHterGVr>sz)zS;<;weM%8bf~oQ8-wHt(B4HV7D=C z623f+Q=tia2sPRYrfl8caA?$CU3vx9OAJiN=gIFJ^uDE#gENrwWcI0>%>2VW*=8ID zt$A^LxVecwp|nqO{@zj;(%}hV+y1Sb@SnY^y#MUQ`9$gn+s7(8a}4x)R-R;rSHmK3 znK%YAZ~<;K?1!&?#k&Mxr`-QELp)PQToX5SMoHOXvD;)zPc+>L=wo><2<*wH({3=Lx zT6wU=QQj`cNM0ewj`a41y|;6a2p}BfN8zKnb8l6lTuT0^V5>aSCH?8WdYeA@Kqylg ztX20|K%!RFbCtFx-H+wk<7%B{QpM3lyUKU{W_=oZ6A}?oLB*%u7Cbq4hZZIG4cH*0 zFGGv6cnYH%jlRDBy4cx1{H=JYpo?JU%khkfH{_!9yYUmUG4H3vCQXWI)8UuhI zP>o@wAePcuNO|YI!B~&?y$1GgivD$-F#^Niq~5K6zjFR0UgtR^)m$b>_*$BbIa^xT zPhPsqe_UF~|MpP1ylrE21lXxelU0W7%6NJU9<3R_711Gb6(^Xd`kJGrgx16!m%x)&*a z>RYFKC!edrgS-9BPOtBy7Z2PE<15)Y3*UR9U}KJ?z0j!qA|)<6NYbw2E?{LEUn4 zP1>_SK*1?tp#&o*pf>GW=JN3kdR<>(*ai8Uz(($TDz6_G@3HvavmECp`>s;UC~CidJ)`kxfS`RKvk*qD0Fbgaj)Dx7;cF z0}tNAhuQ_>@@L2^>nsNcjqj^JC(8S&6UL3Q6oqb+e<%knXf$+ry_b?M?$jg}Tws{6mF40NV@Ii)o9|Fp1_pvnWKa z2MYk0gtk|pZ3X&MV@FM{6V}k1Fdp& zX1UmHa?zO7l1{^iCqmrW4{F6)U*m9ntK%on05mH^jT!?#G0KwA_TPs?#(Yq1S`#<{ zp*aXSoX~6MNjzb<>pxCMs147LPEg(PEK%aWS!5CfGQqdv{Y{*%>bz>B_1)iXZ23&)0YRSomLuy&Ej|%LC_Oj0JO19c3B57^}MGFQfXlJc?#& z$heb(%DUJn6eKK`pH5}xl-Sqim&NR&Gp2vHIW1<~+Fg#s^U?Fha52F^3t*sElzB57 z!|hU&kvwOK72A0aFLQ4yLBuT9vw->db34s(*u{hUnsAG$;7cLRr@G_NK6M=3NkC@M z{#(cA$#&y;Z@}|r+60I$R{$48NM|(JpRreG9X3@u=3hFDyO73!gFmZhw8y!L5Pkxr zRtUClIQ7M9{HxkES9(4&hm_8@(|YiUtX0pivY)a!JhwoIl-C88MsoR}!1Gqbpw$%9 z1@g=Lm&SflbnV-$!}^Yb?Y}EoMyXk$&Joejp=YC_=9S3zZ8;}l7tUnLOTp3IvzHmt zE=2A0U!(d{FND3<;AP)+Cy+^nQ3|bRKraspj5AaIbvo**ciRuUAyy~(G0`8@nqjwmq_eBX%K!t zvGlMcJFlX@Dd*9vwD6ihmoKp*&dA~TKj?v`mLT%H(`1)bpu)kht*YqoLQ6thneV1m z{Qmf$x1_S77rb}pSp&E{9Ymk@9X@=iue_QZYJH)gY=|B;YHxVh-!|iZgE;;A5amlO zG@x-}nt_2FK)4~l8z!WvVDRYr#C@O_;QC;Rec0+N2^0Fb!pr^1EZ3*`I^NR0Xa&Bb2hcGA4 z$2jBArj^K8;{~3(Aa7Bv@0uXvSh4vpTVn8#tnYnedgc9Nv5N!7oz`#LyI?1|5SkR8b`C@J4A)s}ZN_4=iKoZxqF7ycf54Y_32tMiPS^Mg7S&cWItwxeeS)?=@N z=Sl!tYJodhmC2tv*pmKg9<8L2fnkFzgJYZ%26VDs`ru~0%-7|~h*K+~{@HF30Tm|$ zr7eZ1;CkjSr;u!K@0z>B;GVgVaTmAB00&gGREM~xGBysyyYsaER?3`MOJla(o#(qk z$#>W1kt8Tr64Y38mAy`dw=mP4I(k-NrlaUl^J<|E3@F}3!_XP0XPd{*vvcmlE@s@R z&SA)dZ8FT;lzQcxCNfq3fSsros)x?AKO&2oh50VRALuh-)7Y7&F=hjalP|fAuTg?A zO8a2e7Q7T%h9tiCk?D#=A$ZbWh&-oa7s~>XF1N_SVr_-*8?A9KMs>(P7Yj;1@Ngvy zxyIk@X#Kg8_}*KE7&}Fl<0K&<0PqlAgE+FXZh+>Tgsale6y7O=d*wX{O4FizxYcz( zRHFTTy=C7mrbg~u4`@HmehKNWp9piNAu=cE(Vg3U_`BJ>9N+Tj1@AD>qa)=6z8x zPK66(k3*b2(>t($smm$*q`v&Bpp4{|y=Jqu4JOmqC|{%@Ba}v9S_WMDp;hi}X}^yhtB6)uE4u(=WRmYq}5i`d0eXxn^dy2Wh|CgPi5V}4!^v? zQtqo2A{Eq$z!LNZAMxI^seVgvm2GBVrx@0C?FY}+dOH1b56a`Q74vO=?JPgiYxK@k@7&)I>8tX`TiLLRuJ$T1_JVAkgfc(QQcbFAyop=eRs@gfWeUr^Wm&Z%=tC@MGhfb;d#;;ylc z-!K8-Lk_o?#X!v>^gd;F|F_Iv+im|O=yUgN{aL&JvwQrrQ^K=T`g7&imk?5Z&*~mE z!@o#n6L9sky3LPYpVbStk)RKK6%Co?Ex*uTa@aDBrYvqzOJWhLJh)DTl7Dz$vUehV zKBo`N>J@5f@+x+E**>hkdVU%s^vS&}r0fF9M*G(LsD`fO3b`pBhfIg_&tcWltM`Vl zi$A&7v~9bKoA)D@F|+Pq^Y}VT{aB}tjXCe(g0Imj$0c+U{ zNwK)lt<@|D&tbyCS;3Kl=4{je(J|o(j-E4X`GIF2{|`)4-5Fp+2eAy#nl*Gj8UPsI z6GO~>Y=cdn+vKA!>=W)j9Py^GAK}plBeYqHCYN&Uun^#6^IW>+1s8sE?etoqOS}86 z;XJ&{*x~i|K}m4?bj=v{yLOlixvYJ(;}A=3pZ3VsiC)U-`r@{HR6+xwH&5@v%7s|h zp1-_*b-*ZFv)3#C0j|dKIqK>ZkjD%ELRd1kt5o#^JDjJ_D++%2^M}rA{^rQ&%YJK~iOWC#K*M)a)IZT>KjNKdTW0?V??nzWxEg^6ZRrw$ z2n+@1vr5!89Gi9k(MRiJkneUBDI7lsSzr+FM#{9y9iq2|JLq_J-Wf^SK`F6b9aI|#Or6MFqiU8I>9&OQDJ zC!GTig)>g0M$fAw6WMxt*~itJEZE zjg1c@^g{qOI1B!D5jKY0sW**I#qZNwNJ%9EmqS3-v$L?bg!x)j$oMw#U}tM0YGkL; zX8TX#!4WVD!4opWGjrg;9j&xHfyZGcIDuFTX zfyL?sr!t-%w2TH)^(nS5g!2;d<+d3e;$vxXCCzpL9mzU_p*8FhUHF3-zINQZn~MN! zCManxAX0aTzHMG*5`v{3)p1^cusqP0S_r`*i5C6UMmHvPBdc)N%6yQlt=;H4ZmH%H z&U^RmFUJVvG6YEa+@GShm&IuYHxuJOo6H)Y%59e*4175LG*Db=-ELp(b7G{GAKEJp zIk)qMomt9>u)%}p#0*8ofa}?uKA(M62Bv}%l!8t zmzL-b;3x+4CdSi*nj4gNjgG-Wdg0+0O?uwKVZ<~VU-7Nz3=*2p>5|iB_id>GSOm>__x9So!2doBOzn zyPuqdJILa9o+Q%Pq+TcYo39VLt7*3{50{qbHp_;V4bb)w zD>I`t%6P~t@%f7<@b%(_RsaFns?^48R|hRQF@*(Uo@za5Iuy!iFkj^DBN@n0dhwbh zPp1ZMP>vh%kqj7M#Hkwd6|(t;TL$k z=f1IR6m;g|&V8^uRB7a_adoKyt^O0hS6So1Lk1Di2U=Sn%4f)d#l5{4iOshL^GIQ@~RIIiB6aBGLCR``FD z&0E)ElxC~*$Y1U4;|jV}SRvZd=6xhuqsjg#>vkF~<(q3B9n*IDG=zTIsb>Je*pWx1 zV-SMp4x|S4TJ{56AN4@Pq-JG!kY*la)aJI0j&>H;9*HXL=yb+lCVA8axYA2Fc|?^3tSj<_2D)q~xMOet^E zSs}?b65IRuBj~8HVJY_C)O(@03KpfM;>%U(-r%|RrAJq#)ITZ9$8LX%Oi^CmLmPw1 z(Y1eNaocXbDcrU~Fg3bgFH;UxPN`b|KwGCg9KLg)SnJEFh1?}7<||U{_A|9`M6*>0 z@%Ed>TGzqkFJJX?XI-cwz%o&Euv?D7%rDF>T3S)j)`9YqomYvSyDWw#gan)zJfLa{ z5ufQr$;kP7#{M0dC?D3HR&=fNSdmM`Y!e{_9gS!_j2aeJ(QyOFsdruFZb6bBv_(Dc_3kfm*604zUnFRouk*r}>ZY z4jWp2m65+odBd5pQT;m07y0+55@8I<(NGR!NO)SgURRSXtwdxBmKZ;{VVA?eusGJE z84Fp)k>0neQh*%z7D_E)SPiE%`|*RS4QBFJ*tP4^bj9YGlmf7s@-Vog;C4FOvw3>6 zdb<35-6&AM$>>)5>g&39)r#1&k1Lb}vLkA{Qs9%SlJDjYT`wBkSJ^%|-?=a9%908S zIG!AFkiRT*BCs8O0D~<7P0J;yW4W&j=%$y2+&n+!_VVRP2 z6Q=nQ&+-4m*;~g|)vax#fOI#~2+}RmEueHrgRlS}=}x64f^;`ZcXxM}NK2P=F1i;B zzJ+_g`+c^1pWk=R`NIKYj=Ao*?i^#{Tn^HxLwysk&_`J;D2^`#CRjw)l~iph3Q??o}vEnv3GG=g=KLragsFNv)bdZtCfac z7wgw;4SnIdGum3tX2$ga1ewC*z=AS92t}g!P~>yZ6If@kBsiB&3D**=kJQ1}RK4uF zH=fFPfFAjzzmIAO*6lv&$d1Rc@9&C-d&-5r;#g0kVHxB0-8J3EokPNe$EsOHFsv35 z2dmUvJq=5Yu-$k1^R|d6^K#{eJQjXA4I8kS!_MV1-}R?>rwic3{&Fion4P)y_A9wc zi;`nJ_Xi8PNo6^qYZ5;?J%t$OmuJ6b1#UEve+VYfJ$Xg#Cp#P!Q}d1b6F;9gzN_Ee zL>Yg^?;ZI5hPH(qT&Wg0(T?e;;VQo>9`Yhgz^ANl3I3ttzff#TBll^8l;XS%A7ZX zdhcJnb-!fbwf!CwotOIRH#v-dko#FOm|im1f}*oKV7EKop!A7sk?AIvs&tU^z&(AC z-*0z((D3L+^98ZApGY;KmZujZ-r(7|%5|5b?Tc+fFkjp9SX+;m~2i)upB9(kKb{Zoy8m z#YvK3{qRk2%E8uMqh>CR3~SIZ3({b-+O$Hgt{W^$uYBP^)oJ@>D!?aV^>|;zv2Pa? zO{o_!(JmHHhb_sOL_Ns&buY(j)XibOH0_iL^QDS3*};g5Mxvbt^l9q{6j!w+X{I_A zw$GpAY^gNVzWIAafC@YqhsZ(mNS>60rSfN(h8==@1}I2@wm9e!>X_*I#0s1npBBW4 z2nBJzRkmbXRzS_m}Gh^E}pJzsfrN;fnr?AM^Ngrzc zcG0ufbgR?82-bKr)zo==ah4)Be z8`P*aoDEM+3qedd-Y?N6mC3RQ=+OLZYvxstsHoc>ep~G3?*4OyRN?Nc5c*|7`y;tX zEiC|m*=ZjoOcFX(GFr-V!lE5WZ9X^xo&MW_s{B zsso%ZD_RU2XVrxI^7MBhG?Nm{QpBE{+bHX*{32z8f$0|Zx&f(?AB7xM%F)9o4*u$3 z?)}wVQEN-GeXkwwX^22JD+P5afA4yB5Mb7-eeU!$&PBl^_F~F%uxaX`+S@AbgMm>i zGCVJq4ViVOU*NDKk6mW>!S}p`1@1|@?z+f^Nql8X=1Ol)#v4NjclG|)*#9Z^2EOd_Vz zn1(d{fIw!^F10&l0caK0D|s;Wq5*?xa57`d3vd+3xyuvFd99om(7RBKJs_P*q(Pz`UEkq|EVND(p$%x8MEeQ0Norl8dLL~nln znpidkURO{3nim9&9zu-4A<6MQ$dxS02j!Ef=su1-iO`>AyCy#(7~2HesyGXv?=Pj6 z+I{-GKI4dXcvG8eJUts1iuA0-S_DKKYf|NceLIvqG!GzW@@{($syOw0#3%=dzODGPxsJ)78t^A|sl zG~9f6QGk+o$p`ilZE(dlSGh3C5v}c-Y{SNlhubve02dl$i&noU4q9iexssWilz(6n zTfKOm5q-Hm;jti*?OtwpM4I6;4Tr?!dl~DLzw@Ht3T70rS1ZgY<|;%6Flw*%+OctS z0hpq|<+~$)ca>?7+=IQR|7ENDk(y_hvM{uMI@K5TO*U33Vuc%C&@R@sq!Tv z#hiMlXECBz@<$m(u*Idl70u`^<2;Ix1DuU5R!{b`@%s`X2cPM$IIt)HFY!)fC<84G zLJqaxI$z;^LSih>3o%B*D56~_lOqaReXc|0J7$QAAAI>);s-bh)x6;(X2!-Y*izP#y|YvWPofYt}tzE%nG#tFX$ z*s#Guj$i$tY05qi`EC!U7)xX6mi4gocgzryfC&{-)?)B{JWZiZ6}J;CPs1QZitJQalzpG`uWODe$NK4*qHh4&o}!e zIOtnFty>cWLlJ&t4i8ZucQ zkN^2bw7UGLebMXw;&R=<{mklS>vYuBeVmPZWs@LxjrrUdQg^(-l)Z(lBA)VE$tvZp zIWhY5Nc(i%Q`6tnJbt=peFk*Bhb`H=2{yffoukGs#ecT z!_=^V?|*6COY#*;M4~B@v{Ax=spwy_2 zEc<3q%5arT2zE^0o3gL9pftX~>ve){1Ks@ZFm6X#c~(R!Wq z%a0=C+HYa}!(RX?!xzeTrq%r%bo?avdI7z1O4EM>*{~dhV3~o zN1a1Rn;Cr|b`Cce7;pDpsYYqe9=v>wyNX&TEHvQBo##;wwyA4wa@(hv?vsO68;>*SsZ$954_RXYvZN9J^B4;=3IeK~kaJv&wb%mz>`iPOwM1tZu3Jag`^ zf32g|HJ=zOGNyBCrOul)7su9*NP1?-Hvlc7>xh~CC@e<#ymX-Hyld6%H|yO5nKJFR zrIwyiX!9nn_%(}d12cEf=V0HNqvvfc?;NWGA%S##D7R1}USq_i*OveQh++~Imy#nPLJx%>NlPTImIFUNJf zX9I^Ygl;~y>1={R56bQqg;4&=N8pJ`)%!rHN$PWuu&G447{N>PXxsgftnaMROEanb z9(U%6NE-NLgNMac(7&!6UJtYZZydZYlbMj@R4(yaZ*~Y(a`nQVAsO4)*(DS&7n7*e zj=;|qW`+HguO(R*r})A0z~8f9IaxwgWa?Yx8nbT2vp!#6EZhDyX5+v$=HN)Rt{DTl zI9!l=2!5M+>s)&!0!tSu`)ts$^|+oEuZ%3Mo`4-iI%l8ser+pQqIl5?I7}6m-skIT za(j*9_#9lLZYR{4#^rYaY%8+f=`TN)w$NyJ_{xz?P4!4(Z`= zn(~WfrE%s!IOGSmraV41Kz-fjD^GQOnqY$#zIc@h(Uun*5xDYdxo61*lkY503257l z?#_wyKqr(Z|{4d zHM(N!sL=nVo7gnMU!5j$vN=qii}$Qu=f(5wg30sR+W8PLF^%8%Itrbdp8P6`vB(_? z?8J-;2TwxEZ=xIyUL$gGcR^U;SyFH|Arn>R7UbsA#>ur=xu}KO#u#E>nQUB^-|?#W zeRH<3YmO|Jn;H2GKvb2;mhyFjAre%)k?TYzT+Mx-=0WQs+VR}3h((U%;#+q__F}5> zPj=u(Ahcy40N0WNJK zri!$?*HtfRa}u}D$WT4ZU+KD85%pklyc}XpzSem80Luq}sXZ?#AH~grW0FJ!Vk_JO z+Lt}JruHaiII@#;gIBd|hs)k^Vpk5!<}kU1Tz<=~J~JZuBSVO{FU<6UZ|)NXzbRKE zF{`F7@R)b|FgZ}@wxQj_U(PB9P1V&Oi!A#HE_q_|E6je*Hv&h%{NY;Iuk2v|nC50G z4d5H2wndp1kLk;=vw}}vYGY;-2J3R`*yoa-2l2HV`Bf_Opb{%;^cCfa5HhcJV<8_! zcGBXOl6yDI>Phs!SD&OX3p7t9$WWak{Nd2!a9J>Ik6&P4>`_|#QE2%klV0MbYsIn5 z{=6V6u|`5b)(qCG##>ICmO}HAxMOaJ zR;p%tP^?T(oZpq$L&Hiy?8+FT*_`k?l(8wdn5M5vt=Q5!&YbY2K2Wgb1J+0+E)F3% zLyn%~@O);&TtJbGzWMU(>6n|zWhXAb06-_>)^nZBije3tDF9VFI91zK4iEhPoB4ReOppI%rFuy z^{w0#ZZk3vMro6xw>YP?>?P8m(b-1(SnCOEHAQhtki<@xX5Ohpn-Ej8ZyMbEuMG77sAL7PSbSl3+X{&$TWVo%PUSc$M z+FNC@sj*FRz%;GJrqLlN#1{v9D}hFW%(+UY?>z6I?_9i$R&DzR{Gh(UjU zblF)uA??x!XPz<_$X1PAulY?hh6y18@uce#_+V;bp`Uy00qk7tm(KRo+c3Jy~3SMrek1#k&jD z)OZ&No%@xtjN2I&&yS5M8FL$D-;$@v2*m5w1Oe~`!e%7uB**XQg{b<4PMz@;TR&C> zwH7KX1di)*PUd2tA0XX}90^x3ZB@LVii!_s4b0dWe-ED^FI=U)(HR9bEherfs_(lA=J{GT&5UsOi z6r12V9GpZfr<^dRYdzS^x1SsRDan9Mtg9Rsg7-pofgA=rQ2wK3nhyMOb630C?oct! zZc%?#Xl1DC`Wu6Qdo)$+ov&<{+p$v4btYT-7?>wVzti6;Hkt5~BfdaO(#Xk{8(L|> z!*16v4B0g-wZ3mAHu{%9aZ2hO7cD z(`B1Zy`$wLKq(br7uN<26kwJ20h`39T{(J{9V3Uq4t!F}lgQ@FDI_x>+|5p3K`D*GHbBYti;!g)R~KxD6fkP)L`ffAV}ppVnP-4ZYP zsU#-X=cmX{?xoT`4Of;aAem)i9*4Hi zfIf(xFpic?GrUkrUIz`gx|100L*Pu1@*r4OE-I_S&zg1hXOT>jd}yJ@U0dg?xp?s* zs~=^60Ko3dLFe2}YJqBKu}Z}1P2Zcfut|EdUmaTbJVNcA>MZ@|u&!Hst7g~?lY(bI z`FWVykI}54_k^wCTR080VQTN90+_TC)&wmAKHXWsLOF5a5s~rpR{iodiFH$$E2r1by|G%|g2H*9z-1 zwU9MmfiG4c2cP%^8Oa!TbGbPj<2Ee(%A!dmH6XyNVH!a3Rq`@?^YgV?WXbH6vh>d^ zn!~(&8q0t zx|ZI10$;qGzi=L22eL-kheaIU35t1p_u_?Is~@b<#r?z{bxLR&NF1xxMfXB(LtyoAf;TO3&gaw ztKi8}u1&GSE)@Uf%6NGd)vZi2wxGi`@^JFG24L(M*3d&`VDen&{k_N$reCv)NthvDrbMGw*x7PD+Vq z76B3jG!*%;>nN0n=i+8d44z;4qD$#Fi!D&nRvg?i>mou6y^{M3KZ{0MV zykg!q!enrS9Eh_T&Wbhr%CEaa4n_&eZ5*Q-eu*_pvh@xnKPWhKdR>-=ATcuHYcHCm zQ|LIrRyV{Thubk{U^39I7(}rTb|(YvN2zZFkAb z@q)bJ{7!PQc4SkxV**k|wc!CVakz0cCh6I4H^@<_f!rT&2(kG+6<4M#3mOEoeVJdBaagKXY#AsB}gD6SzN3QboC~6w9PKr;~qWaJ|uvrAmF9ToQ-w1t( z5v^QS91BveVxcNaJWH;gMa$T{>wO;m*JrYALhWy(+BHGqXLZGQ;lMULc5U;O-y3hu zpYtyk0^<)ETy2tuEe2sP9k@VQD9*Yq&MI)Lc~;=@GUT>jyjgbUhXHvP3eui5n%XdP}|tN(rL;r z5bt|;VG0#k=(-vu#I`S3YJG4_1`*YI?d15juF5zkFV3tv)5I*HA`1~$Gpoh-zjliXE{h88 ziwaJPm@GfplxYi0$5O8?m!qQp48E5&9v)N@yj5VT+u6F&cE0gwD*TnO)9_0=Mw(d@ zUH`W(Y(-<8(cpshr3I)za_)G&KOt zpC2`UdTRb;mA;uPJcov4NGz>K5>89&kq?P;;LK(vZx^Y>i>zqSD>%QS{~sK83*uOb z#8+%Ds@IL1$Hm2m>&T&&8D4j9pn7TM+HTz+!`xhS zVMEK??t@p(}#AYek^X@E?h4?%!1(Cv^v>%hSWDHND$b$T-kspX1sUfA^Vg) z*V}+-Z^JY>Q(x_>EO!|_V~7J-P(2Lt4)~m8Hd9wlxUP2%gqyq*ZdVTj^3qhJ(zRrn z2RNg3LKxd*pDQd2>%}aM$E-#q)VONE4$dgva79lS$E{;*&FY^B)uU{QB%bG<$SmW#A*JpH z8BoB9hpt5hu*A}R?V63bz7YN*%#L3SQW|KkEgsh2d}}PSycc-#v6#AVz0~_@WIgP{ zy!$r#9sTm&NTb2+zBpDdE}ay2?{#L9$(^bqw>MMXQ*lD|FzS$JuLDd%8r_uc0wl|F zSGWgClN7iHaB7%k2F*RuZr?A;{;xx-0!`1;smQh$wt`G%&m9bB(=^FF(xt%TLwuWHxm2F#lmht-a2ky>Y$3eEQkLsqB32mSi> zb2tsQ)zl74rs5k-!)3kmPLPNE&#}ILZS>HHJDWsN3v&97Gsq(B0g}mc+ z1)4Rohk*@G$zIcs4?a#vTiSN>--oQSF5QXiv`(wGsoC)}`Vr1`e5k6YLfl)Fj;xPT zW}b(>Ip2&AB{#I4=Ky2@@8eOU#H()`eah1gZ{rpN+e_6Fk)F$6@(paN7+TUJVHlCl z;<2HycF0$tmuOWB#f}=YHcXLK5SKjJ??kS^vqnhnH0)fSDhb%Ao_qDa_Q}(lR?V!P5YzGJ7{>{pgm6lAAy3kT8r~>t_ZL_Z3$E?&PoBoBWau48X*3}r>o<|O ziGBc)5xowQRGu#e<|e(O%#*rgUH z8A-joypo3h8BJ4x?FF)Z`(7I_!D6z!S z!I=JhVf17cmGASgQF*aVjHcmc1H<bEQsOUBIb3!)`TM6X`y> z$Fb((O8PE2U|j1V>KyFJaDqTaU;M;iEI!uZF9JXdrAZGAbHZ99N*x?NpKv3BSJnXIHTBB>mTqg_x3C}f4HP3qs1K8TFRZZWEw85Sehjq*n?~q-^SQ}M0 zC)yppcsczuB6y1p4UAn8tUB~6uuJ|K5L(q%=p`Q)y!2ve+Titw{THJqiQDA#zJ6S= zo!(YG8L>s!vSHj;Uyf&EcUe`89Wx;W^t#rlD*nv~yb41@+p{B7C8UJ;n=d|jO6loc z)3a0m<@FOgFYD;8Tun6!sO0OW;cq+S9*F-A@ApoQf_b1k)?43i+HR~V<=Hrw2TiU6 zy!BZnr_-}!l~0w!f%88&_f`g0?Fj$ra!WhtK?FK55106ti&uY}!Ya$Y-r*Ow)qmqq zZ}8@Xt(~R9`m);g6oc*Q#-Zs8%+o7+t1eZ$|@&~%DzTvr3zo&auVPe%9LY zfkPZTgM`5#(#|G1!)@8z1r(GvxuDXrQg3+Ni_j|p3 zfQi8cM*jjPQDVbzhkfNRmwlzuILKNZ_MIU~2Fu2BsIv?z91z=>HIrn_hS|Jk&c4*T zPfE|)=vpn}2NqH}dR420-|B?G6L-9*5S@iTKuz%bXTqAJWM=Dy`@`|$;zy0!2?~(G zW^OrTC}6XdcHYC9`O64rO47BsRtw43CJ!Qg?qeR}JNdx4sdzB);>e+8N^kNeedLE~ zeUyT~rVy+oJ4P7SP5Vd8ep%x{sQ#XkH8Dz%;Q!!g89iz|l?7usmE|zzt;J5}re~wi zPTlgCgWEz#6uqax=_(+_H(%6y>UORBhn z2y5wI7l>B!9SF0IMfbdSn=f10^LN1itFf+V=QsR6e6E;LXB8gC{Q{9yq$2}*@Cmg< zd=4z8gZf;=(qDf4k1QEmV?fH1-pv7TIp&>E^$1oXT)1#)T`Qtz zh0pq79ukG!wtZq%QwHrgmx6A1Y_u)`@WD75>CcdXy#`uAm)BezcF&{FPc=+hF2q5N z9Qv1RLWL8KFAA&M?PRluPkA;@wAwdzJQ>Q!jCQ{S=<;?7Z$S zp0d=!s&Gaqfw$@us-UulBkyFW&>b$46bsb!BdbZ*eBsw834!riw5YY=^{n`7{l1Q# zT;bYOvmQ_rnrC}}%UPIvI3BvuSX9{`^7wVRaBCS`X-WVjwE3iV{9C=ALa3>R(u&;K z!ac14`CL|~y9cgd>DZ`aCm%(RKgobBc=H>ft-Pbip{PrSiZ>Exr9#CGV`TK9Gs|8r zQ=;2qJ#So95|&5O$EUuQ;mW;alj|Iz?iLsFZ8&3wAkE^sAr5t-SKyZ*6i=0m07g@& zf1n0kK(4XeIP}w`yW%e;lY_yOxR?&*N%>d}S|hV_5loiR=Uu4>X2s1#VVrKf!y*r0 zrwEG(Wn|9dLpQO_2TCq8&wWzGzX4I`4%?Bdpq79JiV`^1PL>M2;UakAE}y>@@;8Wl z#dDe{u#1uqBy;iRy`7T`XbHN-vmd50f^BM!Y<=k;?Rb#Hr1PA@r<4dsm{}ge*PPA7;RmmE>GU4F#BX4Vt~!AyvgbtOXdtb4(t_@EdjgP?oiPY+^)I~;=tVn0kDYUV6`Dqmu{j;UDZ`;YYFm#Vd}wSW>^dd06)$DnY{uyQvF;PoWauVkgtuhi+gqy*P} z7a*Y2J!PNQKEpDVA01vhQ(D&x`rkH(m)wkFyB>UnW6E}9=dtODwsPLAADrBmoV${p zn!8f3U%QfB3X?7xHutJsF>X3pWNTaDg&qCej=Vw*Ft-))u?+F$)7_SMBO;yB{}Py8F=}N72(UWtiaj<0KQAaD zjAFhG2ey95V!w0lw5@i1?tTlgUr<NSx`+NM*0J7_mK*H%Xc2AD(L!-9b!@$*og%&yCHrA^>vv6z%^E70Yf! zlBbUnz(U2k5R1UrXlx{5KGBOG^o*~3ysyw}QhIj5Z-k6l*Rs0=PY1RoxHLkkpwq$D z^7)OJX(3kiYomX6?u2Ua;o(^-^7(ye|A$fDT^(bFmK519| zOyFvs(R$QStk&hl-oJOTC8mX?b`r0I7g`^Y`rok^OtF2S#Pi+`=LO`n>@UG$JJP)0 z`fai)mi?*UNY@4#j5}6;6X)Z2+()OgIN~s}{IdD-l7>eS)_+ywo358U?sfi9Ob~;> z`A@~FZ@)dOsSdA(RVVB9l1HfoiXZnnf*zAUegO-9Kg3#Dbw}irHvc=p*wFtV$km7n zLu$R`5&nNrq}#H2mr}idu(q_013IWYYj?#Fe>m+1J)}Z!7dYGRm-1Z2po!3eZWZw~ z00ah0=2gHtXAAltvA!Qj08;rs3bKM;QYNCGYhBJ1%uU!Wc(Lc_VqD2d=)vnkGM_Xj z($?2WadMx-|Cde6KR363+gFqjXQV#)BNTA!olHO$jHIJsCFMag>3ETCx9E0tZG6lUBFt5+?Pu!vnjde}cZRW6Wu>|8SQ$G1GI`G2O*L(6ui<`Tc{wt&UVT*ZEjR(>~? z%Qx2lhV7$V*#9ZlE*FdjrGnlP$^6{mZ(AK&)H^s#lua7X(3g$`ita7OMwmV2=b}db z4{*0B2;M&sA?1c?LvG=+(vZ5I)9Ua@rYBC>+7aHg zr{j<2ufy^Y5xoCI^VkYg!vEe+{h6^T)?h}ygng1R z6;Hh?XG*u~znl2~rjUZ(M+f#Q0SmhnJdX)dZh8ehrH}Mj|J7Um@1&COLfMq($<2Dw zoL?&r#t<9wJ^9_(S{T2^{3GAT5W`@DW%$RX-+^G-0}FuvRmgv4;QuG8{-l)yYrhR7 z2Qv_xg-ZfFTWpjrA@Ki33ParA8l+E(?K&g)(nkSexDZnZNpB_&sGBO zcVDp);LmF`MxC%&QNd6p&}i3kYcm;XT=fPzxxQg1c0~`2?xc?5JxzF<8zNX zHu4OXjT-Gz#O_Nb`{ffBxx9X#HHbUzpL6%NN-X|CU^s?6?`vmo?#C$| z3S zbc(l?Ba^=Fn`p|2FS+lj~+W)F>lSFpOwdYU8-VZ#_iMn`ZeD>mg2F z!4gZ5!%6Un8ai{3{P0;VswK^bq!BECy5HCI%LJ-|!J zaj&;SRvbjewNgX#u+4lbm(Xr&nY-KM+obY54>R?p=c|Tn!#pTdSq?ofUM=^+=fExP zXo&iTF1?C%x9vWV>-iA%NaXv#HTVLSw}V!pjMI6eLD(WGU$J>BN(3a8V}I`U2r*MGI6`9c9d2lsrXG|pon@p(jQ5&&p= z2p`33+qAS>Y8=NLvO<(7#hohW^aK<#`4uy4Nm5z_I2(+kbhuXiBZf4PaIas#ZHPtr zoSp9~64GUBO#I0>A?i8SXOn}u+^7zVcTVrMyU>h!F8f$+_D{Qz7T_}hcHBNH*%mgr zwUl#3tEspvai!#@s0f#tz%P2lSzv+W_=(XcSnKFhfYKGaEya z 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