From 38e506a108cf9ae634ad9ab32a91ec0577dd0172 Mon Sep 17 00:00:00 2001 From: furrtek Date: Sat, 6 Aug 2016 08:49:45 +0200 Subject: [PATCH] OOK transmit is mostly working, bit durations are wrong Simplified messages carrying data (uses shared_memory instead) Added SymField widget (bitfield, symbol field...) Added some space for baseband code BMP palette loading bugfix --- firmware/application/CMakeLists.txt | 6 +- firmware/application/Makefile | 81 -------- firmware/application/baseband_api.cpp | 24 +-- firmware/application/baseband_api.hpp | 10 +- firmware/application/main.cpp | 4 +- firmware/application/ui_encoders.cpp | 127 ++++++------ firmware/application/ui_encoders.hpp | 186 ++++++++++++------ firmware/application/ui_lcr.cpp | 11 +- firmware/application/ui_navigation.cpp | 12 +- firmware/application/ui_xylos.cpp | 3 +- firmware/application/ui_xylos.hpp | 2 + firmware/baseband/CMakeLists.txt | 44 ++--- firmware/baseband/proc_afsk.cpp | 30 +-- firmware/baseband/proc_afsk.hpp | 3 +- firmware/baseband/proc_ook.cpp | 67 ++++--- firmware/baseband/proc_ook.hpp | 8 +- firmware/baseband/proc_xylos.cpp | 14 +- firmware/baseband/proc_xylos.hpp | 5 +- firmware/bootstrap/bootstrap.bin | Bin 228 -> 228 bytes firmware/bootstrap/bootstrap.c | 8 +- .../GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld | 2 +- firmware/common/lcd_ili9341.cpp | 11 +- firmware/common/lcd_ili9341.hpp | 13 +- firmware/common/message.hpp | 121 ++++++------ firmware/common/portapack_shared_memory.hpp | 3 +- firmware/common/spi_image.hpp | 8 +- firmware/common/ui_widget.cpp | 151 +++++++++++++- firmware/common/ui_widget.hpp | 39 +++- firmware/portapack-h1-firmware.bin | Bin 508288 -> 758240 bytes firmware/tools/make_spi_image.py | 6 +- 30 files changed, 588 insertions(+), 411 deletions(-) diff --git a/firmware/application/CMakeLists.txt b/firmware/application/CMakeLists.txt index 587692d8..052bbe25 100644 --- a/firmware/application/CMakeLists.txt +++ b/firmware/application/CMakeLists.txt @@ -160,11 +160,11 @@ set(CPPSRC ui_alphanum.cpp ui_spectrum.cpp ui_about.cpp - ui_jammer.cpp + # ui_jammer.cpp ui_handwrite.cpp ui_afsksetup.cpp - ui_closecall.cpp - ui_soundboard.cpp + # ui_closecall.cpp + # ui_soundboard.cpp ui_rds.cpp ui_lcr.cpp ui_xylos.cpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile index 1ec2c7c2..e16a202a 100644 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -3654,30 +3654,6 @@ ui_channel.cpp.s: cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_channel.cpp.s .PHONY : ui_channel.cpp.s -ui_closecall.obj: ui_closecall.cpp.obj -.PHONY : ui_closecall.obj - -# target to build an object file -ui_closecall.cpp.obj: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_closecall.cpp.obj -.PHONY : ui_closecall.cpp.obj - -ui_closecall.i: ui_closecall.cpp.i -.PHONY : ui_closecall.i - -# target to preprocess a source file -ui_closecall.cpp.i: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_closecall.cpp.i -.PHONY : ui_closecall.cpp.i - -ui_closecall.s: ui_closecall.cpp.s -.PHONY : ui_closecall.s - -# target to generate assembly for a file -ui_closecall.cpp.s: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_closecall.cpp.s -.PHONY : ui_closecall.cpp.s - ui_debug.obj: ui_debug.cpp.obj .PHONY : ui_debug.obj @@ -3798,30 +3774,6 @@ ui_handwrite.cpp.s: cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_handwrite.cpp.s .PHONY : ui_handwrite.cpp.s -ui_jammer.obj: ui_jammer.cpp.obj -.PHONY : ui_jammer.obj - -# target to build an object file -ui_jammer.cpp.obj: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_jammer.cpp.obj -.PHONY : ui_jammer.cpp.obj - -ui_jammer.i: ui_jammer.cpp.i -.PHONY : ui_jammer.i - -# target to preprocess a source file -ui_jammer.cpp.i: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_jammer.cpp.i -.PHONY : ui_jammer.cpp.i - -ui_jammer.s: ui_jammer.cpp.s -.PHONY : ui_jammer.s - -# target to generate assembly for a file -ui_jammer.cpp.s: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_jammer.cpp.s -.PHONY : ui_jammer.cpp.s - ui_lcr.obj: ui_lcr.cpp.obj .PHONY : ui_lcr.obj @@ -4062,30 +4014,6 @@ ui_setup.cpp.s: cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_setup.cpp.s .PHONY : ui_setup.cpp.s -ui_soundboard.obj: ui_soundboard.cpp.obj -.PHONY : ui_soundboard.obj - -# target to build an object file -ui_soundboard.cpp.obj: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_soundboard.cpp.obj -.PHONY : ui_soundboard.cpp.obj - -ui_soundboard.i: ui_soundboard.cpp.i -.PHONY : ui_soundboard.i - -# target to preprocess a source file -ui_soundboard.cpp.i: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_soundboard.cpp.i -.PHONY : ui_soundboard.cpp.i - -ui_soundboard.s: ui_soundboard.cpp.s -.PHONY : ui_soundboard.s - -# target to generate assembly for a file -ui_soundboard.cpp.s: - cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_soundboard.cpp.s -.PHONY : ui_soundboard.cpp.s - ui_spectrum.obj: ui_spectrum.cpp.obj .PHONY : ui_spectrum.obj @@ -4609,9 +4537,6 @@ help: @echo "... ui_channel.obj" @echo "... ui_channel.i" @echo "... ui_channel.s" - @echo "... ui_closecall.obj" - @echo "... ui_closecall.i" - @echo "... ui_closecall.s" @echo "... ui_debug.obj" @echo "... ui_debug.i" @echo "... ui_debug.s" @@ -4627,9 +4552,6 @@ help: @echo "... ui_handwrite.obj" @echo "... ui_handwrite.i" @echo "... ui_handwrite.s" - @echo "... ui_jammer.obj" - @echo "... ui_jammer.i" - @echo "... ui_jammer.s" @echo "... ui_lcr.obj" @echo "... ui_lcr.i" @echo "... ui_lcr.s" @@ -4660,9 +4582,6 @@ help: @echo "... ui_setup.obj" @echo "... ui_setup.i" @echo "... ui_setup.s" - @echo "... ui_soundboard.obj" - @echo "... ui_soundboard.i" - @echo "... ui_soundboard.s" @echo "... ui_spectrum.obj" @echo "... ui_spectrum.i" @echo "... ui_spectrum.s" diff --git a/firmware/application/baseband_api.cpp b/firmware/application/baseband_api.cpp index 08d493cb..c030bde0 100644 --- a/firmware/application/baseband_api.cpp +++ b/firmware/application/baseband_api.cpp @@ -78,18 +78,17 @@ void WFMConfig::apply() const { audio::set_rate(audio::Rate::Hz_48000); } -void set_xylos_data(const char ccir_message[]) { - const XylosConfigureMessage message { - ccir_message +void set_ccir_data( const uint32_t samples_per_tone, const uint16_t tone_count) { + const CCIRConfigureMessage message { + samples_per_tone, + tone_count }; send_message(&message); } -void set_afsk_data(const char message_data[], const uint32_t afsk_samples_per_bit, const uint32_t afsk_phase_inc_mark, - const uint32_t afsk_phase_inc_space, const uint8_t afsk_repeat, const uint32_t afsk_bw, - const bool afsk_alt_format) { +void set_afsk_data(const uint32_t afsk_samples_per_bit, const uint32_t afsk_phase_inc_mark, const uint32_t afsk_phase_inc_space, + const uint8_t afsk_repeat, const uint32_t afsk_bw, const bool afsk_alt_format) { const AFSKConfigureMessage message { - message_data, afsk_samples_per_bit, afsk_phase_inc_mark, afsk_phase_inc_space, @@ -97,7 +96,7 @@ void set_afsk_data(const char message_data[], const uint32_t afsk_samples_per_bi afsk_bw, afsk_alt_format }; - send_message(&message); + send_message(&message); } void set_pwmrssi(int32_t avg, bool enabled) { @@ -109,14 +108,15 @@ void set_pwmrssi(int32_t avg, bool enabled) { send_message(&message); } -void set_ook_data(const char ook_bitstream[], uint32_t stream_length, uint32_t samples_per_bit, uint8_t repeat) { +void set_ook_data(const uint32_t stream_length, const uint32_t samples_per_bit, const uint8_t repeat, + const uint32_t pause_symbols) { const OOKConfigureMessage message { - ook_bitstream, stream_length, samples_per_bit, - repeat + repeat, + pause_symbols }; - send_message(&message); + send_message(&message); } static bool baseband_image_running = false; diff --git a/firmware/application/baseband_api.hpp b/firmware/application/baseband_api.hpp index 80a38b4a..5e91fceb 100644 --- a/firmware/application/baseband_api.hpp +++ b/firmware/application/baseband_api.hpp @@ -52,12 +52,12 @@ struct WFMConfig { void apply() const; }; -void set_xylos_data(const char ccir_message[]); +void set_ccir_data( const uint32_t samples_per_tone, const uint16_t tone_count); void set_pwmrssi(int32_t avg, bool enabled); -void set_afsk_data(const char message_data[], const uint32_t afsk_samples_per_bit, const uint32_t afsk_phase_inc_mark, - const uint32_t afsk_phase_inc_space, const uint8_t afsk_repeat, const uint32_t afsk_bw, - const bool afsk_alt_format); -void set_ook_data(const char ook_bitstream[], uint32_t stream_length, uint32_t samples_per_bit, uint8_t repeat); +void set_afsk_data(const uint32_t afsk_samples_per_bit, const uint32_t afsk_phase_inc_mark, const uint32_t afsk_phase_inc_space, + const uint8_t afsk_repeat, const uint32_t afsk_bw, const bool afsk_alt_format); +void set_ook_data(const uint32_t stream_length, const uint32_t samples_per_bit, const uint8_t repeat, + const uint32_t pause_symbols); void run_image(const portapack::spi_flash::image_tag_t image_tag); void shutdown(); diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index 1b130989..16afe649 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -37,20 +37,20 @@ //TODO: Check jammer bandwidths //TODO: Closecall wide range fix //TODO: SD card wiper -//TODO: Use progressbars //TODO: GSM channel detector //TODO: SIGFOX RX/TX //TODO: Bodet :) //TODO: Whistler //TODO: LCR full message former (see norm) -//TODO: AFSK NRZI, parity and format +//TODO: AFSK NRZI //TODO: TX power setting //TODO: Playdead amnesia and login //TODO: Setup: Play dead by default ? Enable/disable ? //TODO: Hide statusview when playing dead //TODO: Persistent playdead ! + //TODO: Show MD5 mismatches for modules not found, etc... //TODO: Module name/filename in modules.hpp to indicate requirement in case it's not found ui_loadmodule //BUG: Description doesn't show up first time going to system>module info (UI drawn on top) diff --git a/firmware/application/ui_encoders.cpp b/firmware/application/ui_encoders.cpp index f3e8c10e..2ad0e27a 100644 --- a/firmware/application/ui_encoders.cpp +++ b/firmware/application/ui_encoders.cpp @@ -36,7 +36,7 @@ using namespace portapack; namespace ui { void EncodersView::focus() { - bitfields[0].focus(); + bitfield.focus(); } EncodersView::~EncodersView() { @@ -45,48 +45,56 @@ EncodersView::~EncodersView() { } void EncodersView::generate_frame() { - uint8_t i; + size_t i; - debug_text = encoder_def->sync; + debug_text.clear(); i = 0; for (auto c : encoder_def->word_def) { - if (c <= 'J') - debug_text += encoder_def->bit_format.at(bitfields[i++].value()); + if (c < 'S') + debug_text += encoder_def->bit_format.at(bitfield.value(i)); + else if (c == 'S') + debug_text += encoder_def->sync; + i++; } - if (visible()) parent()->set_dirty(); + //if (visible()) parent()->set_dirty(); // Might be called before on_show ? } -void EncodersView::paint(Painter& painter) { +void EncodersView::draw_waveform() { float x = 0, x_inc; Coord y, prev_y = 1; - uint8_t prelude_length = encoder_def->sync.length(); + uint8_t prelude_length = 0; //encoder_def->sync.length(); - painter.fill_rectangle( { 0, 160, 240, 24 }, Color::black() ); + // Clear + painter_->fill_rectangle( { 0, 160, 240, 24 }, Color::black() ); x_inc = 230.0 / (debug_text.length() - prelude_length); - for (auto c : debug_text.substr(prelude_length)) { + for (auto c : debug_text) { //.substr(prelude_length) if (c == '0') y = 23; else y = 0; - if (prev_y != y) painter.draw_rectangle( { (Coord)x, 160, 1, 24 }, Color::yellow() ); - painter.draw_rectangle( { (Coord)x, 160 + y, ceil(x_inc), 1 }, Color::yellow() ); + if (prev_y != y) painter_->draw_rectangle( { (Coord)x, 160, 1, 24 }, Color::yellow() ); + painter_->draw_rectangle( { (Coord)x, 160 + y, ceil(x_inc), 1 }, Color::yellow() ); prev_y = y; x += x_inc; } } +void EncodersView::paint(Painter& painter) { + painter_ = &painter; +} + void EncodersView::update_progress() { char str[16]; - text_status.set(" "); + // text_status.set(" "); - //if (tx_mode == SINGLE) { + if (tx_mode == SINGLE) { strcpy(str, to_string_dec_uint(repeat_index).c_str()); strcat(str, "/"); strcat(str, to_string_dec_uint(encoder_def->repeat_min).c_str()); @@ -101,11 +109,11 @@ void EncodersView::update_progress() { strcat(str, "/"); strcat(str, to_string_dec_uint(scan_count).c_str()); text_status.set(str); - progress.set_value(scan_progress); + progress.set_value(scan_progress);*/ } else { text_status.set("Ready"); progress.set_value(0); - }*/ + } } void EncodersView::on_txdone(int n) { @@ -186,9 +194,9 @@ void EncodersView::start_tx(const bool scan) { n++; } - ook_bitstream_length = n - 1; + ook_bitstream_length = n; // - 1; - transmitter_model.set_tuning_frequency(433920000); // TODO: Change ! + transmitter_model.set_tuning_frequency(433920000); // TODO: Make modifiable ! transmitter_model.set_baseband_configuration({ .mode = 0, .sampling_rate = 2280000U, @@ -200,44 +208,34 @@ void EncodersView::start_tx(const bool scan) { transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); + memcpy(shared_memory.tx_data, ook_bitstream, 64); + baseband::set_ook_data( - ook_bitstream, ook_bitstream_length, // 2280000/2 = 1140000Hz = 0,877192982us // numberfield_clk.value() / encoder_def->clk_per_symbol // 455000 / 12 = 37917Hz = 26,37339452us 1140000 / ((numberfield_clk.value() * 1000) / encoder_def->clk_per_symbol), - encoder_def->repeat_min + encoder_def->repeat_min, + encoder_def->pause_symbols ); } -void EncodersView::on_bitfield() { - generate_frame(); -} - void EncodersView::on_type_change(size_t index) { std::string word_format; - size_t data_length; - size_t address_length; + //size_t data_length; + //size_t address_length; enc_type = index; - + encoder_def = &encoder_defs[enc_type]; - + numberfield_clk.set_value(encoder_def->default_frequency / 1000); - size_t n = 0; - for (auto& bitfield : bitfields) { - if (n < encoder_def->word_length) { - bitfield.hidden(false); - bitfield.set_range(0, encoder_def->bit_states - 1); - } else { - bitfield.hidden(true); - } - n++; - } + bitfield.set_length(encoder_def->word_length); + bitfield.set_range(0, encoder_def->address_bit_states - 1); - word_format = encoder_def->word_format; + /*word_format = encoder_def->word_format; size_t address_start = word_format.find_first_of("A"); size_t data_start = word_format.find_first_of("D"); size_t format_length = word_format.length(); @@ -274,7 +272,7 @@ void EncodersView::on_type_change(size_t index) { text_format_d.set(std::string(data_length, 'D')); } else { text_format_d.hidden(true); - } + }*/ generate_frame(); } @@ -285,6 +283,13 @@ void EncodersView::on_show() { } EncodersView::EncodersView(NavigationView& nav) { + using name_t = std::string; + using value_t = int32_t; + using option_t = std::pair; + using options_t = std::vector; + options_t enc_options; + size_t i; + baseband::run_image(portapack::spi_flash::image_tag_ook); encoder_def = &encoder_defs[0]; @@ -302,14 +307,27 @@ EncodersView::EncodersView(NavigationView& nav) { &numberfield_wordduration, &text_us2, &text_bitfield, - &text_format_a, - &text_format_d, + &bitfield, + //&text_format_a, // DEBUG + //&text_format_d, // DEBUG &text_waveform, &text_status, &progress, &button_transmit } }); + for (i = 0; i < ENC_TYPES_COUNT; i++) + enc_options.emplace_back(std::make_pair(encoder_defs[i].name, i)); + + options_enctype.set_options(enc_options); + options_enctype.set_selected_index(0); + + bitfield.on_change = [this]() { + this->generate_frame(); + }; + + button_transmit.set_style(&style_val); + options_enctype.on_change = [this](size_t index, int32_t value) { (void)value; this->on_type_change(index); @@ -339,30 +357,7 @@ EncodersView::EncodersView(NavigationView& nav) { } }; - const auto bitfield_fn = [this](int32_t value) { - (void)value; - this->on_bitfield(); - }; - - size_t n = 0; - for (auto& bitfield : bitfields) { - bitfield.on_change = bitfield_fn; - bitfield.id = n; - bitfield.set_value(0); - bitfield.set_parent_rect({ - static_cast(16 + 8 * n), - static_cast(80), - 8, 16 - }); - add_child(&bitfield); - n++; - } - - //options_enctype.set_selected_index(0); - - button_transmit.set_style(&style_val); - - button_transmit.on_select = [this](Button&) { + button_transmit.on_select = [this, &nav](Button&) { if (tx_mode == IDLE) start_tx(false); }; } diff --git a/firmware/application/ui_encoders.hpp b/firmware/application/ui_encoders.hpp index 1f963a4e..a417a36c 100644 --- a/firmware/application/ui_encoders.hpp +++ b/firmware/application/ui_encoders.hpp @@ -28,6 +28,8 @@ namespace ui { +#define ENC_TYPES_COUNT 13 + class EncodersView : public View { public: EncodersView(NavigationView& nav); @@ -41,97 +43,179 @@ public: private: struct encoder_def_t { - uint8_t bit_states; - uint16_t clk_per_bit; - uint16_t clk_per_symbol; + std::string name; + uint8_t address_bit_states; // Often 0, 1, [f, [4]] + uint8_t data_bit_states; // Often 0, 1 + uint16_t clk_per_bit; // Oscillator periods per bit + uint16_t clk_per_symbol; // Oscillator periods per bit fragment std::vector bit_format; - uint8_t word_length; + uint8_t word_length; // Total # of bits std::string word_def; std::string word_format; - std::string sync; - uint32_t default_frequency; + std::string sync; // Like bit_format + uint32_t default_frequency; // Default encoder clk frequency uint8_t repeat_min; + uint32_t pause_symbols; }; // S = Sync - // 0~9 A~J = Address/data bits - const encoder_def_t encoder_defs[11] = { - // PT2260: Data bits can only be 0 or 1 ! - { 3, 1024, 128, + // 0~9 A~R = Address/data bits + const encoder_def_t encoder_defs[ENC_TYPES_COUNT] = { + // PT2260 + { + "xx2260", + 3, 2, + 1024, 128, { "10001000", "11101110", "10001110" }, 12, "0123456789ABS", "AAAAAAAAAADD", "10000000000000000000000000000000", - 200000, 1 }, + 200000, 1, + 10 // ? + }, // PT2262 - { 3, 32, 4, + { + "xx2262", + 3, 2, + 32, 4, { "10001000", "11101110", "10001110" }, - 12, "0123456789ABS", "AAAAAAAAADDD", + 12, "0123456789ABS", "AAAAAADDDDDD", "10000000000000000000000000000000", - 30000, 4 }, + 30000, 4, + 10 // ? + }, + + // 16bit? + { + "16bit?", + 2, 2, + 32, 8, + { "1110", "1000" }, // Opposite ? + 16, "0123456789ABCDEFS", "AAAAAAAAAAAAAAAA", + "10000000000000000000000000000000", + 114000, 50, + 10 // ? + }, + + // RT1527 + { + "xx1527", + 2, 2, + 128, 32, + { "1000", "1110" }, + 12, "0123456789ABS", "AAAAAAAADD", + "10000000000000000000000000000000", + 100000, 4, + 10 // ? + }, // HK526E - { 2, 24, 8, + { + "xx526 ", + 2, 2, + 24, 8, { "110", "100" }, - 12, "0123456789AB", "AAAAAAAAAAAA", + 12, "0123456789AB", "AAAAAAAADDDD", "", - 20000, 4 }, + 20000, 4, + 10 // ? + }, // HT12E - { 2, 3, 1, + { + "xx12E ", + 2, 2, + 3, 1, { "011", "001" }, 12, "S0123456789AB", "AAAAAAAADDDD", "0000000000000000000000000000000000001", - 3000, 4 }, + 3000, 4, + 10 // ? + }, // VD5026 13 bits ? - { 4, 128, 8, + { + "xx5026", + 4, 4, + 128, 8, { "1000000010000000", "1111111011111110", "1111111010000000", "1000000011111110" }, 12, "S0123456789AB", "AAAAAAAADDDD", "000000000000000000000000000000000000000000000001", // ? - 100000, 4 }, + 100000, 4, + 10 // ? + }, // UM3750 - { 2, 96, 32, + { + "UM3750", + 2, 2, + 96, 32, { "011", "001" }, 12, "S0123456789AB", "AAAAAAAAAAAA", "1", - 100000, 4 }, + 100000, 4, + 10 // ? + }, // UM3758 - { 3, 96, 16, + { + "UM3758", + 3, 2, + 96, 16, { "011011", "001001", "011001" }, 18, "S0123456789ABCDEFGH", "AAAAAAAAAADDDDDDDD", "1", - 160000, 4 }, + 160000, 4, + 10 // ? + }, // BA5104 - { 2, 3072, 768, + { + "BA5104", + 2, 2, + 3072, 768, { "1000", "1110" }, 9, "S012345678", "DDAAAAAAA", "", - 455000, 4 }, + 455000, 4, + 10 // ? + }, // MC145026 - { 3, 16, 1, + { + "145026", + 3, 2, + 16, 1, { "0111111101111111", "0100000001000000", "0111111101000000" }, 9, "S012345678", "AAAAADDDD", "000000000000000000", - 455000, 2 }, + 455000, 2, + 10 // ? + }, // HT6xxx - { 3, 198, 33, + { + "HT6xxx", + 3, 2, + 198, 33, { "011011", "001001", "001011" }, 18, "S0123456789ABCDEFGH", "AAAAAAAAAAAADDDDDD", "0000000000000000000000000000000000001011001011001", - 100000, 3 }, + 100000, 3, + 10 // ? + }, // TC9148 - { 2, 48, 12, + { + "TC9148", + 2, 2, + 48, 12, { "1000", "1110", }, 12, "0123456789AB", "DDDDDDDDDDDD", "", - 455000, 3 } + 455000, 3, + 10 // ? + } }; enum tx_modes { @@ -140,6 +224,7 @@ private: SCAN }; + Painter * painter_; uint8_t enc_type = 0; const encoder_def_t * encoder_def; tx_modes tx_mode = IDLE; @@ -151,6 +236,7 @@ private: //rf::Frequency f; uint8_t repeat_index; + void draw_waveform(); void on_bitfield(); void on_type_change(size_t index); void generate_frame(); @@ -158,17 +244,6 @@ private: void start_tx(const bool scan); void on_txdone(int n); - radio::Configuration ook_radio_config = { - 0, - 2280000, - 2500000, // ? - rf::Direction::Transmit, - true, - 0, - 0, - 1, - }; - const Style style_val { .font = font::fixed_8x16, .background = Color::green(), @@ -191,7 +266,11 @@ private: .foreground = Color::blue(), }; - std::array bitfields; + SymField bitfield { + { 16 + 8, 80 }, + 12, + { 0, 1 } + }; Text text_enctype { { 2 * 8, 3 * 8, 8 * 8, 16 }, @@ -199,19 +278,8 @@ private: }; OptionsField options_enctype { { 2 * 8, 5 * 8 }, - 8, + 6, { - { "PT2260 ", 0 }, - { "PT2262 ", 1 }, - { "HK526E ", 2 }, - { "HT12E ", 3 }, - { "VD5026 ", 4 }, - { "UM3750 ", 5 }, - { "UM3758 ", 6 }, - { "BA5104 ", 7 }, - { "MC145026", 8 }, - { "HT6xxx ", 9 }, - { "TC9148 ", 10 } } }; @@ -267,8 +335,8 @@ private: { 2 * 8, 8 * 8, 5 * 8, 16 }, "Word:" }; - Text text_format_a; - Text text_format_d; + //Text text_format_a; // DEBUG + //Text text_format_d; // DEBUG Text text_waveform { { 1 * 8, 16 * 8, 9 * 8, 16 }, diff --git a/firmware/application/ui_lcr.cpp b/firmware/application/ui_lcr.cpp index 8dc4e34e..f79d5abf 100644 --- a/firmware/application/ui_lcr.cpp +++ b/firmware/application/ui_lcr.cpp @@ -251,7 +251,7 @@ void LCRView::start_tx(const bool scan) { transmitter_model.set_tuning_frequency(portapack::persistent_memory::tuned_frequency()); transmitter_model.set_baseband_configuration({ .mode = 0, - .sampling_rate = 2280000U, + .sampling_rate = 1536000, .decimation_factor = 1, }); transmitter_model.set_rf_amp(true); @@ -259,12 +259,13 @@ void LCRView::start_tx(const bool scan) { transmitter_model.set_vga(40); transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); + + memcpy(shared_memory.tx_data, lcr_message_data, 300); baseband::set_afsk_data( - lcr_message_data, - 228000 / portapack::persistent_memory::afsk_bitrate(), - portapack::persistent_memory::afsk_mark_freq() * (0x40000 * 256) / (228000 / 25), - portapack::persistent_memory::afsk_space_freq() * (0x40000 * 256) / (228000 / 25), + (153600 * 5) / portapack::persistent_memory::afsk_bitrate(), + portapack::persistent_memory::afsk_mark_freq() * 437 * 5, //(0x40000 * 256) / (153600 / 25), + portapack::persistent_memory::afsk_space_freq() * 437 * 5, //(0x40000 * 256) / (153600 / 25), afsk_repeats, portapack::persistent_memory::afsk_bw() * 115, // See proc_fsk_lcr.cpp afsk_format diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 57e7203d..aba9e24b 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -34,8 +34,8 @@ #include "ui_setup.hpp" #include "ui_debug.hpp" -#include "ui_soundboard.hpp" // DEBUG -#include "ui_closecall.hpp" // DEBUG +//#include "ui_soundboard.hpp" // DEBUG +//#include "ui_closecall.hpp" // DEBUG #include "ui_freqman.hpp" // DEBUG #include "ui_encoders.hpp" @@ -46,7 +46,7 @@ #include "ui_lcr.hpp" #include "analog_audio_app.hpp" #include "ui_audiotx.hpp" // DEBUG -#include "ui_jammer.hpp" // DEBUG +//#include "ui_jammer.hpp" // DEBUG #include "analog_audio_app.hpp" #include "ais_app.hpp" @@ -238,13 +238,13 @@ ReceiverMenuView::ReceiverMenuView(NavigationView& nav) { /* SystemMenuView ********************************************************/ SystemMenuView::SystemMenuView(NavigationView& nav) { - add_items<14>({ { + add_items<12>({ { { "Play dead", ui::Color::red(), [&nav](){ nav.push(false); } }, { "Receiver RX", ui::Color::cyan(), [&nav](){ nav.push(); } }, { "Capture RX", ui::Color::cyan(), [&nav](){ nav.push(); } }, - { "Close Call RX", ui::Color::cyan(), [&nav](){ nav.push(); } }, + //{ "Close Call RX", ui::Color::cyan(), [&nav](){ nav.push(); } }, { "Numbers station TX", ui::Color::purple(), [&nav](){ nav.push(); } }, //nav.push(); - { "Pokemon GO Away TX", ui::Color::blue(), [&nav](){ nav.push(); } }, + //{ "Pokemon GO Away TX", ui::Color::blue(), [&nav](){ nav.push(); } }, //{ "Soundboard TX", ui::Color::yellow(), [&nav](){ nav.push(md5_baseband_tx, SoundBoard); } }, //{ "Audio TX", ui::Color::yellow(), [&nav](){ nav.push(md5_baseband_tx, AudioTX); } }, //{ "Frequency manager", ui::Color::white(), [&nav](){ nav.push(); } }, diff --git a/firmware/application/ui_xylos.cpp b/firmware/application/ui_xylos.cpp index 0a4b33b2..d5e33cfd 100644 --- a/firmware/application/ui_xylos.cpp +++ b/firmware/application/ui_xylos.cpp @@ -173,7 +173,8 @@ void XylosView::start_tx() { transmitter_model.set_baseband_bandwidth(1750000); transmitter_model.enable(); - baseband::set_xylos_data(ccir_message); + memcpy(shared_memory.tx_data, ccir_message, 21); + baseband::set_ccir_data(CCIR_TONELENGTH, 20); } // ASCII to frequency LUT index diff --git a/firmware/application/ui_xylos.hpp b/firmware/application/ui_xylos.hpp index 287578d5..9b97a0e5 100644 --- a/firmware/application/ui_xylos.hpp +++ b/firmware/application/ui_xylos.hpp @@ -35,6 +35,8 @@ //#include "receiver_model.hpp" #include "portapack.hpp" +#define CCIR_TONELENGTH (15360*2)-1 // 1536000/10/10 + namespace ui { /* diff --git a/firmware/baseband/CMakeLists.txt b/firmware/baseband/CMakeLists.txt index 1586c7ca..4f273c26 100644 --- a/firmware/baseband/CMakeLists.txt +++ b/firmware/baseband/CMakeLists.txt @@ -326,19 +326,26 @@ set(MODE_CPPSRC ) DeclareTargets(PSPE wideband_spectrum) -### Jammer +### OOK set(MODE_CPPSRC - proc_jammer.cpp + proc_ook.cpp ) -DeclareTargets(PJAM jammer) +DeclareTargets(POOK ook) + +### Jammer + +#set(MODE_CPPSRC +# proc_jammer.cpp +#) +#DeclareTargets(PJAM jammer) ### Audio transmit -set(MODE_CPPSRC - proc_audiotx.cpp -) -DeclareTargets(PATX audio_tx) +#set(MODE_CPPSRC +# proc_audiotx.cpp +#) +#DeclareTargets(PATX audio_tx) ### AFSK @@ -349,17 +356,17 @@ DeclareTargets(PAFS afsk) ### Epar -set(MODE_CPPSRC - proc_epar.cpp -) -DeclareTargets(PEPR epar) +#set(MODE_CPPSRC +# proc_epar.cpp +#) +#DeclareTargets(PEPR epar) ### Play audio -set(MODE_CPPSRC - proc_playaudio.cpp -) -DeclareTargets(PPAU play_audio) +#set(MODE_CPPSRC +# proc_playaudio.cpp +#) +#DeclareTargets(PPAU play_audio) ### Xylos @@ -375,13 +382,6 @@ set(MODE_CPPSRC ) DeclareTargets(PRDS rds) -### OOK - -set(MODE_CPPSRC - proc_ook.cpp -) -DeclareTargets(POOK ook) - ### HackRF "factory" firmware add_custom_command( diff --git a/firmware/baseband/proc_afsk.cpp b/firmware/baseband/proc_afsk.cpp index 624072f1..b4754596 100644 --- a/firmware/baseband/proc_afsk.cpp +++ b/firmware/baseband/proc_afsk.cpp @@ -34,14 +34,15 @@ void AFSKProcessor::execute(const buffer_c8_t& buffer) { if (!configured) return; for (size_t i = 0; i= (5 - 1)) { + s = 0; + if (sample_count >= afsk_samples_per_bit) { if (configured) { - cur_byte = message_data[byte_pos]; - ext_byte = message_data[byte_pos + 1]; + cur_byte = shared_memory.tx_data[byte_pos]; + ext_byte = shared_memory.tx_data[byte_pos + 1]; if (!(cur_byte | ext_byte)) { // End of data @@ -49,8 +50,8 @@ void AFSKProcessor::execute(const buffer_c8_t& buffer) { // Repeat bit_pos = 0; byte_pos = 0; - cur_byte = message_data[0]; - ext_byte = message_data[1]; + cur_byte = shared_memory.tx_data[0]; + ext_byte = shared_memory.tx_data[1]; message.n = repeat_counter + 1; shared_memory.application_queue.push(message); repeat_counter++; @@ -98,6 +99,8 @@ void AFSKProcessor::execute(const buffer_c8_t& buffer) { } else { s--; } + + //tone_phase += 432759; // 1981Hz tone_sample = (sine_table_i8[(tone_phase & 0x03FC0000) >> 18]); @@ -120,13 +123,12 @@ void AFSKProcessor::on_message(const Message* const p) { const auto message = *reinterpret_cast(p); if (message.id == Message::ID::AFSKConfigure) { - memcpy(message_data, message.message_data, 512); - afsk_samples_per_bit = message.afsk_samples_per_bit; - afsk_phase_inc_mark = message.afsk_phase_inc_mark; - afsk_phase_inc_space = message.afsk_phase_inc_space; - afsk_repeat = message.afsk_repeat - 1; - afsk_bw = message.afsk_bw; - afsk_format = message.afsk_format; + afsk_samples_per_bit = message.samples_per_bit; + afsk_phase_inc_mark = message.phase_inc_mark; + afsk_phase_inc_space = message.phase_inc_space; + afsk_repeat = message.repeat - 1; + afsk_bw = message.bw; + afsk_format = message.format; s = 0; sample_count = afsk_samples_per_bit; diff --git a/firmware/baseband/proc_afsk.hpp b/firmware/baseband/proc_afsk.hpp index 19d8bb40..74d056a7 100644 --- a/firmware/baseband/proc_afsk.hpp +++ b/firmware/baseband/proc_afsk.hpp @@ -35,7 +35,7 @@ public: private: bool configured = false; - BasebandThread baseband_thread { 2280000, this, NORMALPRIO + 20, baseband::Direction::Transmit }; + BasebandThread baseband_thread { 1536000, this, NORMALPRIO + 20, baseband::Direction::Transmit }; uint32_t afsk_samples_per_bit; uint32_t afsk_phase_inc_mark; @@ -43,7 +43,6 @@ private: uint8_t afsk_repeat; uint32_t afsk_bw; uint8_t afsk_format; - char message_data[512]; uint8_t repeat_counter = 0; int8_t re, im; diff --git a/firmware/baseband/proc_ook.cpp b/firmware/baseband/proc_ook.cpp index 73a1ae56..eaca0da4 100644 --- a/firmware/baseband/proc_ook.cpp +++ b/firmware/baseband/proc_ook.cpp @@ -35,31 +35,38 @@ void OOKProcessor::execute(const buffer_c8_t& buffer) { for (size_t i = 0; i= samples_per_bit) { if (configured) { - cur_bit = (bitstream[bit_pos >> 3] << (bit_pos & 7)) & 0x80; - - bit_pos++; - - if (bit_pos >= stream_size) { + if (bit_pos >= length) { // End of data - if (repeat_counter < repeat) { - // Repeat - bit_pos = 0; - cur_bit = bitstream[0] & 0x80; - message.n = repeat_counter + 1; - shared_memory.application_queue.push(message); - repeat_counter++; - } else { - // Stop + if (pause_counter == 0) { + pause_counter = pause; cur_bit = 0; - message.n = 0; - shared_memory.application_queue.push(message); - configured = false; + } else if (pause_counter == 1) { + if (repeat_counter < repeat) { + // Repeat + bit_pos = 0; + cur_bit = shared_memory.tx_data[0] & 0x80; + message.n = repeat_counter + 1; + shared_memory.application_queue.push(message); + repeat_counter++; + } else { + // Stop + cur_bit = 0; + message.n = 0; + shared_memory.application_queue.push(message); + configured = false; + } + pause_counter = 0; + } else { + pause_counter--; } + } else { + cur_bit = (shared_memory.tx_data[bit_pos >> 3] << (bit_pos & 7)) & 0x80; + bit_pos++; } } @@ -71,13 +78,17 @@ void OOKProcessor::execute(const buffer_c8_t& buffer) { s--; } - if (cur_bit) phase += 100; // ? - - sphase = phase + (64 << 18); + if (cur_bit) { + phase = (phase + 200); // What ? + sphase = phase + (64 << 18); - re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]); - im = (sine_table_i8[(phase & 0x03FC0000) >> 18]); - + re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]); + im = (sine_table_i8[(phase & 0x03FC0000) >> 18]); + } else { + re = 0; + im = 0; + } + buffer.p[i] = {(int8_t)re, (int8_t)im}; } } @@ -86,12 +97,12 @@ void OOKProcessor::on_message(const Message* const p) { const auto message = *reinterpret_cast(p); if (message.id == Message::ID::OOKConfigure) { - //memcpy(bitstream, message.ook_bitstream, 64); - samples_per_bit = message.samples_per_bit; - stream_size = message.stream_length; repeat = message.repeat - 1; + length = message.stream_length - 1; + pause = message.pause_symbols + 1; + pause_counter = 0; s = 0; sample_count = samples_per_bit; repeat_counter = 0; diff --git a/firmware/baseband/proc_ook.hpp b/firmware/baseband/proc_ook.hpp index 400ec049..65218873 100644 --- a/firmware/baseband/proc_ook.hpp +++ b/firmware/baseband/proc_ook.hpp @@ -39,17 +39,17 @@ private: uint32_t samples_per_bit; uint8_t repeat; - char bitstream[64]; + uint32_t length; + uint32_t pause; + uint32_t pause_counter = 0; uint8_t repeat_counter = 0; int8_t re, im; uint8_t s = 0; - uint16_t bit_pos = 0; uint8_t cur_bit = 0; uint32_t sample_count; - uint32_t stream_size; - uint32_t phase, sphase; + uint32_t tone_phase, phase, sphase; int32_t tone_sample, sig, frq; TXDoneMessage message; diff --git a/firmware/baseband/proc_xylos.cpp b/firmware/baseband/proc_xylos.cpp index 0b64c186..c77c3285 100644 --- a/firmware/baseband/proc_xylos.cpp +++ b/firmware/baseband/proc_xylos.cpp @@ -43,13 +43,13 @@ void XylosProcessor::execute(const buffer_c8_t& buffer) { // Just occupy channel with carrier if (sample_count >= CCIR_SILENCE) { silence = false; - sample_count = CCIR_TONELENGTH; + sample_count = samples_per_tone; } else { sample_count++; } } else { - if (sample_count >= CCIR_TONELENGTH) { - digit = xylosdata[byte_pos++]; + if (sample_count >= samples_per_tone) { + digit = shared_memory.tx_data[byte_pos++]; if ((digit == 0xFF) || (byte_pos >= 21)) { configured = false; message.n = 25; // End of message code @@ -103,12 +103,12 @@ void XylosProcessor::execute(const buffer_c8_t& buffer) { } void XylosProcessor::on_message(const Message* const p) { - const auto message = *reinterpret_cast(p); - if (message.id == Message::ID::XylosConfigure) { - memcpy(xylosdata, message.ccir_message, 21); + const auto message = *reinterpret_cast(p); + if (message.id == Message::ID::CCIRConfigure) { byte_pos = 0; digit = 0; - sample_count = CCIR_TONELENGTH; + samples_per_tone = message.samples_per_tone; + sample_count = samples_per_tone; as = 0; silence = true; configured = true; diff --git a/firmware/baseband/proc_xylos.hpp b/firmware/baseband/proc_xylos.hpp index 124ce985..f6c226fc 100644 --- a/firmware/baseband/proc_xylos.hpp +++ b/firmware/baseband/proc_xylos.hpp @@ -28,7 +28,6 @@ //#include "audio_output.hpp" -#define CCIR_TONELENGTH (15360*2)-1 // 1536000/10/10 #define CCIR_PHASEINC (436.91/2) // (65536*1024)/1536000*10 #define CCIR_SILENCE (122880)-1 // 400ms @@ -62,12 +61,12 @@ private: (uint32_t)(1055*CCIR_PHASEINC) }; - char xylosdata[21]; + uint32_t samples_per_tone; int8_t re, im; uint8_t s, as = 0, ai; uint8_t byte_pos = 0; uint8_t digit = 0; - uint32_t sample_count = CCIR_TONELENGTH; + uint32_t sample_count = 0; uint32_t tone_phase, phase, sphase; int32_t tone_sample, frq; bool silence = true; diff --git a/firmware/bootstrap/bootstrap.bin b/firmware/bootstrap/bootstrap.bin index c234f8ae31e4a5df3bef9695206fd90c78bc6fef..784058649519f60fa99117504fa1874ae22ed336 100755 GIT binary patch delta 11 ScmaFD_=Isn8Y9QV^jZKLWCT9| delta 11 ScmaFD_=Isn8Y9cZ^jZKLR0KN! diff --git a/firmware/bootstrap/bootstrap.c b/firmware/bootstrap/bootstrap.c index 862b861f..00870638 100644 --- a/firmware/bootstrap/bootstrap.c +++ b/firmware/bootstrap/bootstrap.c @@ -92,16 +92,12 @@ int main(void) { LPC_GPIO->DIR[2] = (1 << 8) | (1 << 2) | (1 << 1); /* Indicate M4 is working */ - LPC_GPIO->SET[2] = (1 << 1); + LPC_GPIO->SET[2] = (1 << 2); #endif configure_spifi(); - /* NOTE: MEMMAP registers are ORed with the shadow address to create the - * actual address. - */ - LPC_CREG->M0APPMEMMAP = LPC_SPIFI_DATA_CACHED_BASE + 0x40000; + LPC_CREG->M0APPMEMMAP = LPC_SPIFI_DATA_CACHED_BASE + 0x80000; - /* Change M0APP_RST to 0 */ LPC_RGU->RESET_CTRL[1] = 0; while(1) { diff --git a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld index 24951182..ae9bfec3 100755 --- a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld +++ b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/ld/LPC43xx_M0.ld @@ -23,7 +23,7 @@ __process_stack_size__ = 0x1000; /* main() stack */ MEMORY { - flash : org = 0x00000000, len = 256k /* SPIFI flash @ 0x140????? */ + flash : org = 0x00000000, len = 256k /* SPIFI flash @ 0x140????? */ ram : org = 0x20000000, len = 64k /* AHB SRAM @ 0x20000000 */ } diff --git a/firmware/common/lcd_ili9341.cpp b/firmware/common/lcd_ili9341.cpp index 8826d717..612e2780 100644 --- a/firmware/common/lcd_ili9341.cpp +++ b/firmware/common/lcd_ili9341.cpp @@ -291,7 +291,7 @@ void ILI9341::render_box(const ui::Point p, const ui::Size s, const ui::Color* l // RLE_4 BMP loader (delta not implemented) void ILI9341::drawBMP(const ui::Point p, const uint8_t * bitmap, const bool transparency) { - const bmp_t * bmp_header = (const bmp_t *)bitmap; + const bmp_header_t * bmp_header = (const bmp_header_t *)bitmap; uint32_t data_idx; uint8_t by, c, count, transp_idx = 0; ui::Color line_buffer[240]; @@ -303,13 +303,14 @@ void ILI9341::drawBMP(const ui::Point p, const uint8_t * bitmap, const bool tran (bmp_header->compression != 2)) return; data_idx = bmp_header->image_data; + const bmp_palette_t * bmp_palette = (const bmp_palette_t *)&bitmap[bmp_header->BIH_size + 14]; // Convert palette and find pure magenta index (alpha color key) for (c = 0; c < 16; c++) { - palette[c] = ui::Color(bmp_header->palette[c].R, bmp_header->palette[c].G, bmp_header->palette[c].B); - if ((bmp_header->palette[c].R == 0xFF) && - (bmp_header->palette[c].G == 0x00) && - (bmp_header->palette[c].B == 0xFF)) transp_idx = c; + palette[c] = ui::Color(bmp_palette->color[c].R, bmp_palette->color[c].G, bmp_palette->color[c].B); + if ((bmp_palette->color[c].R == 0xFF) && + (bmp_palette->color[c].G == 0x00) && + (bmp_palette->color[c].B == 0xFF)) transp_idx = c; } if (!transparency) { diff --git a/firmware/common/lcd_ili9341.hpp b/firmware/common/lcd_ili9341.hpp index 534d6da2..06f0dac3 100644 --- a/firmware/common/lcd_ili9341.hpp +++ b/firmware/common/lcd_ili9341.hpp @@ -111,7 +111,7 @@ private: }; #pragma pack(push, 1) - struct bmp_t { + struct bmp_header_t { uint16_t signature; uint32_t size; uint16_t reserved_1; @@ -128,15 +128,20 @@ private: uint32_t v_res; uint32_t colors_count; uint32_t icolors_count; - struct palette { + }; + #pragma pack(pop) + + #pragma pack(push, 1) + struct bmp_palette_t { + struct color_t { uint8_t B; uint8_t G; uint8_t R; uint8_t A; - } palette[16]; + } color[16]; }; #pragma pack(pop) - + scroll_t scroll_state; void draw_pixels(const ui::Rect r, const ui::Color* const colors, const size_t count); diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index fd3bc1ac..a0c1cab4 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -67,7 +67,7 @@ public: TXDone = 20, Retune = 21, - XylosConfigure = 22, + CCIRConfigure = 22, AFSKConfigure = 23, PWMRSSIConfigure = 24, OOKConfigure = 25, @@ -473,7 +473,7 @@ public: class TXDoneMessage : public Message { public: - TXDoneMessage( + constexpr TXDoneMessage( ) : Message { ID::TXDone } { } @@ -485,7 +485,7 @@ public: class PWMRSSIConfigureMessage : public Message { public: - PWMRSSIConfigureMessage( + constexpr PWMRSSIConfigureMessage( const bool enabled, const uint32_t freq, const int32_t avg @@ -501,93 +501,96 @@ public: const int32_t avg; }; -class XylosConfigureMessage : public Message { +class CCIRConfigureMessage : public Message { public: - XylosConfigureMessage( - const char data[] - ) : Message { ID::XylosConfigure } + constexpr CCIRConfigureMessage( + const uint32_t samples_per_tone, + const uint16_t tone_count + ) : Message { ID::CCIRConfigure }, + samples_per_tone(samples_per_tone), + tone_count(tone_count) { - memcpy(ccir_message, data, 21); } - char ccir_message[21]; -}; - -class OOKConfigureMessage : public Message { -public: - OOKConfigureMessage( - const char data[], - const uint32_t stream_length, - const uint32_t samples_per_bit, - const uint8_t repeat - ) : Message { ID::OOKConfigure }, - stream_length(stream_length), - samples_per_bit(samples_per_bit), - repeat(repeat) - { - memcpy(ook_bitstream, data, 64); - } - - char ook_bitstream[64]; - uint32_t stream_length; - uint32_t samples_per_bit; - uint8_t repeat; + const uint32_t samples_per_tone; + const uint16_t tone_count; }; class RetuneMessage : public Message { public: - RetuneMessage( - ) : Message { ID::Retune } + constexpr RetuneMessage( + const int64_t freq + ) : Message { ID::Retune }, + freq(freq) { } - int64_t freq = 0; + const int64_t freq = 0; }; class AFSKConfigureMessage : public Message { public: - AFSKConfigureMessage( - const char data[], - const uint32_t afsk_samples_per_bit, - const uint32_t afsk_phase_inc_mark, - const uint32_t afsk_phase_inc_space, - const uint8_t afsk_repeat, - const uint32_t afsk_bw, - const uint8_t afsk_format + constexpr AFSKConfigureMessage( + const uint32_t samples_per_bit, + const uint32_t phase_inc_mark, + const uint32_t phase_inc_space, + const uint8_t repeat, + const uint32_t bw, + const uint8_t format ) : Message { ID::AFSKConfigure }, - afsk_samples_per_bit(afsk_samples_per_bit), - afsk_phase_inc_mark(afsk_phase_inc_mark), - afsk_phase_inc_space(afsk_phase_inc_space), - afsk_repeat(afsk_repeat), - afsk_bw(afsk_bw), - afsk_format(afsk_format) + samples_per_bit(samples_per_bit), + phase_inc_mark(phase_inc_mark), + phase_inc_space(phase_inc_space), + repeat(repeat), + bw(bw), + format(format) { - memcpy(message_data, data, 512); } - uint32_t afsk_samples_per_bit; - uint32_t afsk_phase_inc_mark; - uint32_t afsk_phase_inc_space; - uint8_t afsk_repeat; - uint32_t afsk_bw; - uint8_t afsk_format; - char message_data[512]; + const uint32_t samples_per_bit; + const uint32_t phase_inc_mark; + const uint32_t phase_inc_space; + const uint8_t repeat; + const uint32_t bw; + const uint8_t format; +}; + +class OOKConfigureMessage : public Message { +public: + constexpr OOKConfigureMessage( + const uint32_t stream_length, + const uint32_t samples_per_bit, + const uint8_t repeat, + const uint32_t pause_symbols + ) : Message { ID::OOKConfigure }, + stream_length(stream_length), + samples_per_bit(samples_per_bit), + repeat(repeat), + pause_symbols(pause_symbols) + { + } + + const uint32_t stream_length; + const uint32_t samples_per_bit; + const uint8_t repeat; + const uint32_t pause_symbols; }; class FIFOSignalMessage : public Message { public: - FIFOSignalMessage( + constexpr FIFOSignalMessage( ) : Message { ID::FIFOSignal } { } - char signaltype = 0; + const char signaltype = 0; }; class FIFODataMessage : public Message { public: - FIFODataMessage( - ) : Message { ID::FIFOData } + constexpr FIFODataMessage( + ) : Message { ID::FIFOData }, + data ( nullptr ) { } diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index 45359aaa..882c7d1b 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -51,8 +51,7 @@ struct SharedMemory { JammerRange jammer_ranges[16]; - char epardata[13]; - int32_t excursion; + char tx_data[512] { 0 }; }; extern SharedMemory& shared_memory; diff --git a/firmware/common/spi_image.hpp b/firmware/common/spi_image.hpp index c2378c84..ad8ddcaa 100644 --- a/firmware/common/spi_image.hpp +++ b/firmware/common/spi_image.hpp @@ -103,16 +103,16 @@ struct region_t { constexpr region_t bootstrap { .offset = 0x00000, - .size = 0x8000, + .size = 0x10000, }; constexpr region_t images { - .offset = 0x8000, - .size = 0x38000, + .offset = 0x10000, + .size = 0x40000, }; constexpr region_t application { - .offset = 0x40000, + .offset = 0x80000, .size = 0x40000, }; diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index 0a49853b..e5506f5c 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -1,3 +1,25 @@ +/* + * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2016 Furrtek + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + #include "ui_widget.hpp" #include "ui_painter.hpp" #include "portapack.hpp" @@ -1026,10 +1048,6 @@ void NumberField::set_value(int32_t new_value, bool trigger_change) { } } -void NumberField::set_value(int32_t new_value) { - set_value(new_value, true); -} - void NumberField::set_range(const int32_t min, const int32_t max) { range.first = min; range.second = max; @@ -1081,4 +1099,129 @@ int32_t NumberField::clip_value(int32_t value) { return value; } +/* SymField **************************************************************/ + +SymField::SymField( + Point parent_pos, + size_t length, + range_t range +) : Widget { { parent_pos, { static_cast(8 * length), 16 } } }, + range { range }, + length_ { length } +{ + set_focusable(true); +} + +uint32_t SymField::value(const uint32_t index) { + return values_[index]; +} + +void SymField::set_value(const uint32_t index, int32_t new_value) { + new_value = clip_value(new_value); + + if( new_value != values_[index] ) { + values_[index] = new_value; + if( on_change ) { + on_change(); + } + set_dirty(); + } +} + +void SymField::set_length(const uint32_t new_length) { + if (new_length <= 30) { + prev_length_ = length_; + length_ = new_length; + erase_prev_ = true; + set_dirty(); + } +} + +void SymField::set_range(const int32_t min, const int32_t max) { + size_t n; + + range.first = min; + range.second = max; + for (n = 0; n < length_; n++) + set_value(n, values_[n]); +} + +void SymField::paint(Painter& painter) { + size_t n; + Point pt_draw = screen_pos(); + + if (erase_prev_) { + painter.fill_rectangle( { pt_draw, { prev_length_ * 8, 16 } }, Color::black() ); + erase_prev_ = false; + } + + for (n = 0; n < length_; n++) { + const auto text = to_string_dec_uint(values_[n], 1); + + const auto paint_style = (has_focus() && (n == selected_)) ? style().invert() : style(); + + painter.draw_string( + pt_draw, + paint_style, + text + ); + + pt_draw.x += 8; + } +} + +bool SymField::on_key(const KeyEvent key) { + switch (key) { + case KeyEvent::Select: + if( on_select ) { + on_select(*this); + return true; + } + break; + + case KeyEvent::Left: + if (selected_ > 0) { + selected_--; + set_dirty(); + return true; + } + break; + + case KeyEvent::Right: + if (selected_ < (length_ - 1)) { + selected_++; + set_dirty(); + return true; + } + break; + + default: + break; + } + + return false; +} + +bool SymField::on_encoder(const EncoderEvent delta) { + set_value(selected_, values_[selected_] + delta); + return true; +} + +bool SymField::on_touch(const TouchEvent event) { + if( event.type == TouchEvent::Type::Start ) { + focus(); + } + return true; +} + +int32_t SymField::clip_value(int32_t value) { + if( value > range.second ) { + value = range.second; + } + if( value < range.first ) { + value = range.first; + } + return value; +} + } /* namespace ui */ diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index 85e630ef..b67608fa 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2016 Furrtek * * This file is part of PortaPack. * @@ -411,7 +412,7 @@ public: NumberField(Point parent_pos, size_t length, range_t range, int32_t step, char fill_char); NumberField( - ) : NumberField { { }, 1, { 0, 1 }, 1, ' ' } + ) : NumberField { { 0, 0 }, 1, { 0, 1 }, 1, ' ' } { } @@ -419,8 +420,7 @@ public: NumberField(NumberField&&) = delete; int32_t value() const; - void set_value(int32_t new_value); - void set_value(int32_t new_value, bool trigger_change); + void set_value(int32_t new_value, bool trigger_change = true); void set_range(const int32_t min, const int32_t max); void paint(Painter& painter) override; @@ -439,6 +439,39 @@ private: int32_t clip_value(int32_t value); }; +class SymField : public Widget { +public: + std::function on_select; + std::function on_change; + + using range_t = std::pair; + + SymField(Point parent_pos, size_t length, range_t range); + + SymField(const SymField&) = delete; + SymField(SymField&&) = delete; + + uint32_t value(const uint32_t index); + void set_value(const uint32_t index, int32_t new_value); + void set_length(const uint32_t new_length); + void set_range(const int32_t min, const int32_t max); + + void paint(Painter& painter) override; + + bool on_key(const KeyEvent key) override; + bool on_encoder(const EncoderEvent delta) override; + bool on_touch(const TouchEvent event) override; + +private: + range_t range; + int32_t values_[30] = { 0 }; + uint32_t selected_ = 0; + size_t length_, prev_length_; + bool erase_prev_ = false; + + int32_t clip_value(int32_t value); +}; + } /* namespace ui */ #endif/*__UI_WIDGET_H__*/ diff --git a/firmware/portapack-h1-firmware.bin b/firmware/portapack-h1-firmware.bin index 40420022b4f09a5d5d141b72d80501bf37f76e87..ea3669b6932eb422309e7bf0bf91c2920e8af9c8 100644 GIT binary patch delta 79418 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 IEUv)*56HymKmY&$ delta 96658 zcmce;2YggT*FQdU?`AW*3CX4aDVwk*Ku7>L2_+OY%{3vEP*fDuB|%uqqXE!|DCzJ!C2n<`M>|=Gr3dF%$%7! zbIzIXnM>Q&f%c`n%4cB3u9?-gW%yn0mk({Dvd6s83n8RHnpPg6R)s%w^h5~9AQSTa$c3poz%RvPIP z4Vv9nEkfr$Rzs^CLUdUwpGhCzjy1MID@sMezwHBl5ylPpH@6z~`9V6h1j4Q#{yl%y zD-f18D9kI(L(RrnIakBySLS40t+B6jbT^%qP*LA$IAcmSI)UpT z+{ry9Pt1HGav@5&(gJxCV=_+sf{YLwKknBPi#2JjzaSiWIgAUk-LT)2+kyBgnsL9T zbBe+He^DCu{}PRZIy49gY2M4$+172=sJtn05vkKoAtBSd&Jk_8D|OQM#dD%mwfs_H z)x@ROe~OCALwf#(YT_LkpIv)Chg^P+JN|F9sBTtC$;>PDi?+C)5{K|+5E)CCr(SK%`!dgvKehD`LQHS>Y>RkJuN9rc*r|Bcix=!Hs7%OU)<{5 zKMOD2uPtaSne%o#&M;1UrG1+<)ryC!v&IRUFy1C{Z9A-1Yd`A)+T6sbtgj}`vTnB~ zTMHAp^th}~FJtwG9pT|?_Z+?)#v|iZGpH&0C#uCY$yWZd8e?IU zbI-MhU)o`f%-CT;!d6eR83{l8X0(^yjgUPTA#Y9*Y_3T?5KONBCr30*Y;Em#=**hk zRA|6vx_BUO#S>`zKz^9I4ECxb8fh-Y(M|uvahzRCy}R&Q<$2hH|5DI_!|;cJc=IL` z|0L$JgXyt%@j|*LosZcbT_9Y$mi-rT+y8|4 z|A5x^pL078W{U||_R}==mj&wrXa9g;z2a1C3n^qmm8&;eu<*L{M}hj5^k;#Z8Sih4 z{l$gcs5n}Y%HL)yZef!2hkvKfP9L|lq0EeWkGsC;soYsBW--AO91u)1ue`p9zcD+H z$rk>`+joFqN>RBucj#p$#vS%W`>s82K78%@!r;p*l);x*htz`n`33@4-1kZ!kW8=t zjbuU=kWTmOmd;i#$XReoLJfPRq`gr>R=A?Wq6oWjaB=h=qj`Zj2;-xh7iaNtnA0TsMFtZ^^70FajFDZ^Ol0IIb`cpupAc0jNQDX} z8DJk&G@l>G_heGTJn=|xXa=N4gc8iJV1JmVgWe%5fzX-P`P>(v=}e~u(iqmsE@s00 zsr)}l+x{oS{|B@nHU1OskSt?wNsV#W<4RY6L6+l#*nEW<>9O#!PiKxR%#t)Cu+acI zIi_He5es^+avL&68<<2<)bE!phGo*=^kq^egkkBgO2gqf62k2x;7?Zierb9-7JhK@ zx2!e=SaI!6#jP~bDZz?Edk*Rm$~tU7>__)5z$P2Wo4dQ2-@HMdRhY+J51x;q<``e9 zwP)&WtplHV%=)!N>b{mj%fFVQ?E@B%yN>2}>qx+gj==~E!+iJ-u*-nC{+7PQ`=zA1 z{ZexIe#vBCCJiduFXhemv&>lk1KW_!N;fR%c7p^x3)13w`kj(D*p7|;LCSn*c|*8a zVcupQC#c9e7%@tn-g;8XOE=7h#-6LpDLG+$x@6b8FbBrGN@=hTX2MV@4KcxNq(|jG z)3Qz)gi!KBt?M9voir?R0?H9Ex35FR=Q#OmynuPq?^WpzU^*-P!BaR5Sc?Q!*PgUV z`397FdrQgesJ#7BemY3pT>YG@_nwqS!wgR{U>A2aDv$55KLaJ%N3K1eHSgXY4%D_x z8XCDw8ge1ix?h@VK$q|0_RBSjK1EXZw(+G;TbX#QJ{2Sj#s?B%7>1M3{;~E4wCm)z zm&eiu8%o{Rx;4=G-gcZk8pbj#@?GhUbl{$g%J%cl_?aJ}}`c9;bi$1o1FHDTD; zzD^npWA3l1$Qg4Q3~aPc8lr(bU~yPFx?z7n-JwupwpEa zXQWWw8A+izBN2pa)p?O|suXl}r5y=AFEo^nGuT2L3nt+@m~O@%n`XvX?youj!6e&m zj(t18=vq!@G`}5~)3GJY1(;$l&&HN9;|X{X-v3)x6kx-D= zNf;;Lwwj-nkO!;}$0jao^`yX1bopQpb6G3ng8Si$8K?QmqmrTx>LSIBm<7xl#x-0e zwh0G3xR$SB1+iwXHZ~6nyFJV#h9*twjKlC33D0!0;b1kPip6zcBFZ zUl@>o4I75`<%OjGa2Z)&$$#X6Uv+MKrYKb$2Q~VxFUmJ zT~3E`W>^=2K!UieFX8#t>cxE2HTW;4705I0GsFoHo1WtZr#-?)dl zK}P!4VJ?mxQ!ZQa2QB*kos_7x(7s znI_v(f`#foVI-SxVI+}NcQcTr6yBWKpd^RUHbI`bOpC<$#%lnP2($tE*HUnh??vLs0KAZ5L-D!#g*gvlTxv_B1Ft z6G|Q1VqDCn-rs^V&Ng0n*7ziMIfpakMdejGy6G+yBjd$sr)(0^l+3=Rx=NYq+6$mX zFn|`pT|f&%$zMSW44?(aKnu;w4x&5%xZ#O!0JJD64!e98UsoI^b=N#lxc(Mm(U03|1@kzCLefyThgP;xL)5cvm9T~Sk?y2?*C6fWn zU=Yt~&{%+*Xij(0Sc#w}26?e@%i?7=n5c`OuBPj;;e3f@Ldt~j#7#Q;x2J-&GKrJwUgf`!n#rd*U;VNqa z&u`ip?o$M7o1N%r+a4}QhIzPOJ@n^+e5Tr}gCTdpc`OO?;Y|Ts^J6-GA^s?6mmH0F z3THQ;Gx0+(j-cne@lW}I9)_FT0($HTU5;;M30;nFJz#g z-x?CS9N*ptiF^y_*_+@$z5zHR13i}lKu-$@SBT5{2%f*6-w??3v|#`FttiodeydCL zpWpUE*+~cukY-4a1`rr`0O?r=SkCX~w}>w1Hw4or{Eqa%`E6I={HBAFd4Rd3L8yQ* zzDMBvrUPh;K|WbPzTl+*0|Hd)8cZ$tVlvDua^frHAQfBQfxwn8`$VHa*X z5E7?o{?|Wn7H;l8o5IXZZpX>-*U)>qhGA*tTGRzq72ae(%$HM&IwM?uG#V@+0W|)=< zY7llyTDmHgPxs^R3@ysO8o{F^rbG5mDzv`Xz!3Q@c64L;L+HkeiD35MKi{m#c)_fw zEHHB&T0Y1O;-Djv54y4J-XMrY@ybeNM+|?^9M%yN77RHNJRta+U-|cfRiqL$kcxDK zk)RtZru@@9!#ukU8COck^ge`OTMel`E}^}tc|kYq6Dl2{rY|9zER5$+2M${T+M>Ut zF@>fx;>a=#=z0i$JnqwLAzb5)tjFphS9u25n9w7gTN?>*e_=~%-f%0lqZxPIX<3Po z3tx+4XnQHNs{y^0tp>dX$otp|fU^|UHZ`cQa}W)&F!eRu!ccdmT~eAeMfxVp?*U|p)sPmIY5i3?6G+oN8KYgCmR_k0Gn zzPd8fTDIq?l+?x;2+feSi>f9Bg!@07s%>G1;KWiJW5vP@S+L`pN~=1f5}^D~fITem zQgb^K-b|3U!QSos`7M-7GJenUGMhrI@u{dKb9eUD&>)35Yf6DtmpAUZy*Si_g-mD3 zl8cp4T@^!VKrz?@ieVin zvk3mHAkYgCmGuHVZ|Q}g1}Nz8I{;8XEr5EEVZBmN3Ckc@0&0P&iJbwpkk?f$?Ca_P zXaMC=_qS@H1xlDo=m2Rt9-a}MYM~|I2@rsQ{W{fxyGxp>1tP13PEWulUeyice+0;P zrVI3n=CS?psDKLC5X38NBYQ(*paQbtjb(#)XQ2Yx+zeqCgwDLqXGeghGd(SkW=x+4 zgs(IIzxlNNPb>U?Ob;97?>VIprQsd}wmKBsP%Q}X+qrsVWInYT=kM4*sw(Z`R(+Xf zzr^+ADxCDgG@N4--tA@%H!IEIN6Q-U&hY)~e-1_?tUXef!84|n+ZleO?^C83^JeI* zjWYl$G~9jF_xQCLrkN|G$4gg8i!>{wry(rVT!)->y7UF4LHHN|_dW94hd=z&OcPwN z`%fI_8ZIP;`r z*PWD>nV6?D>*_t}Pu;s;dO^dvupb7S2X2P3aGuE84>bFwGR=s4dpg22`=xSd^GU$t zp3pEcdl!h=?tU=~FxUh*y8P3`r|vst!x@3@O(^A13o^!&Ojhqq$$*% zZPe#2lNOmOB#UMljMmo=w?wBdI&CQg2*@691sNotnPQFmrHv-gRA5VW_rZz41jad> z3W$ceepRXQ%&_)8@6|e2&(a+sR zcJN@_`Ohmger2)zG&@+p*}&9QJwP74O!#5I1j*adUZexz{R5T}9#H$)!RF^0>U3C0 z^VAuXGM2p4V*=C^lb(e=$1p@W-F#F+_DRO>1y~4khaXjT=oI1m!;kvI`k%uQyz9lN z_cDk@8#B$Yn2KOwL3kR%I{N`>W6>R!198$bZ3m<(6UXq&C1_73Fd_??(w=mWicjD& zb$+A?o-)!@kh0>UCzCSLbOIXG!mQfbYkEEJkIR#Z*=0@T=ntho|#q~5z!{3G* z=rj$#6z`?_e{nOplK_E%J4T@g%be;X`33kSZT&ZQIY@w)6O5g9bm!kt7D05Rj4X}AMj2Sbo10sE0{hA=z?Dog zu5@Sfm{@+OLOl({2(y_Rk{FyMHt%zAUtoNyd5n(FfG1s|=QDy%LACL;;#=0!e_zo#wtYXqaGzUnh{H?UH6dQZfKkVE@zillXi!2I;Mb5WzL8d-EF< zs%hYgssJFVf@c4~O>GWJ;jbmzipGsA+z4GWd4FC3@)~NekjCUZgz*qM^E#gu@M1gT z?1=;ER_3J!dEd3{zlhuZC&d2;w6_18TLvTTg1~;7rgb{z%h};w7l4xbfG4MC7f()i z*^{%{^G8q43m_XG0oiCZy(-Oy=UkASF`WD^kIj->YyJx^z&EMP!UiKF9uY@ za#=N0jr&2G-ndQ0?)s>9~!NwhLT#^G5rh|#o>^@;zCq1HDCnbTeV_?A7(Objj zlpS~&kcQLsf(46>$?=Hk1qM}tC%g1+zq4Yl z37i#j%j}J*Yyn5bM}OO(5*qvj8f0S(t(*D3#&bHI6@EbJ1^McZ?5q%MU&y`!KcM7y zR($domGrEvk}gOe{;wJ6bXNR@fdb+Azc8@)FAUr+Gq6RP@E2zV+EWg~D!Jz|0jN5;3@JHo?gY2%r<7H*S?F9=rj33Cg=wx>Vh}Spw zgZ6lQKc}JEa6Xyt+|Lo3^f_nZ1fAbwApt3PEHLtG6XMq<8oxHt`L)R)S(_XS(t+|A z>FilhBS0oJ(-DvQ; zD8QY;ToeG2`87!$D4BAj-$T)240tH^wsPR1z@SdjAZTQjauaI;N+mO(R5E3yqRa$w z-VrCeCnAa}wu>3iKN;k`;=+lu3U0bt;r+x}=#x0WF-w4{a_#!x0>` zS;6YRe3q-_RhV6CfHu>ZE}7CSP2f+x`7VjZ-Cp#?3i(!uuZDfXQ?HQ-mg1aXQOZ z3)dE$pDH}$Oh^5Y&YB`j^CAPT)muv}I&^r_le>$K(}y^6=Kd7ns#}7#W6VfrI>n(8 z5blI93c^?j_d|FPf)#>&G}29b-#-D!2xsE_pi#Uf*Rs^2C`b{Gxi!#^1nn@o&9s6i zJ;UOK30@r?nYe}~=dJy_;fY8pCvXn_tT3XK7N5`{Md{3Hq+0{kQj z6#;${g=Yi&Bnk@y{3Hq`0e%vNhrBXBwiMy8i%s9p|6P7M{QPK|)T7nFPm(a(tupG+ z)@h_bYf2JI+|fqmsFD&Tl%)t8U2IAZ<|Eyb2|W5~A}_y!jxij#X<|ml6zFWIw=mzw z_0gf%r}cmadJA)W1ez-;i7Lp1)N~);TZei-5>YS-QV;rc=*Jo11*H(b&u2tBRF;uo z2`zX5(&HfgYDS_(HHxv7B0TH@XH5Y(ZSLVwFa$M(#YsF0gJ&cJ_KufKw{n5iz#K=K z(Hf}QS4ff6(CKT_!hoT^f>GjRhC+a$zJgX_?5Kd9zCsU)HV?FH6M!NkFN)K@8AUvskB#DXaEqwZi(nSa8nUN&1 zM{i-f4;zh^t~G53XxQx}1*d+!N# zF3tv8cwWsW=Qzz5^mqt3Z(_&PadQ>X0k}R2I89z(ofCA%w-*->buE%>amAF znn8H<5IuZ1sZmxyeCr`PJ0JQ~AExi+lObHj;pQv(M9C>_hdH$7Fm;ZC0qi|YiwnuU zoX|o)EF_Ie0m?jw>HN{;4&|gTIW+f6`rc@0P=L7SOM34ZlA{bg!l9TWbki8}oN_3{ zCmo@E#*+EU1rUD;^2d@m?)4+|L-u_C2>oU(d4Ov3b7_xi28^jzFmSihA#XK8Ci?lzU-N1uf0y zdr7ofVFWcsAF{v;u(bGJ=<=54#AyU>+HG&4!;8tM?CC8g$AC1;O$F`K#heSDnMPs zLFg{?``>H*Uh{}tbBUV{Tnc^Yg?Vl|b}7kB)(aEeI+SekiMIiTPaFw5c(-U48w4GFj7i#oeeQ;&aIs{i=g6e(Z zSx`bqKpp_ogyrqjl1P-8kPMtnh)U zar1eSsn7}S9-3Z8N_%dSG7&Fab1K`|GuVaoCb%kBNk1qf@!fPnw4~103->z^+T8d1%7aKVQx1RB;@)OiK-Uf+7H#v29HoO z->O3jVIlRcB=_J1de16i?CJ7$(wyx=W1=suBDuveg<31>pVDIQGX&h}NdHEx4jF|7 z5{qX->`}>XM7^irAB(~YFBM&kdD-%i<$FtLVOxw#6g(k??YHt&a^6oKQm8Yu#q@)^ zMG`X?Xx3^HL#M7Lcfcb1#X~o(Ch7P#+Pa#|(intozGO5%-kLWI8HBAqI_d@Too%Ft z7>)K4`>Bkr_M(i7c6D{J6<5JGA;N7QlTq0V54hCV6+lW#SFE=|-ZZ-;@rjo+cOULwQd20BcLT|?Pxem58CUW9%+f3#&Ej;1Xykv#l0?Osl1-CpO((%XCY zAFDKM9?$FCVwLB$@k&EK#Nul`eG8R_AB*}S4pOTEwjvPQ8%pLCLsPC%oa&gE8-q zZ}yb#ZeYw>NR~7ua6tRcCRY6AfF$k^h z6l5&uQEw2AK+I5(46!fV%M5xn0dYHrLu#*^YSxk-(+$EqK+$8{YRG#FV#(WHhS)Zs z9lmV>dK=#@=Fr*=L{>lxg=}^N26jWd}8w8!(YW9f(d>B}I z&RNiac56QVotD+sT0quzS{odf+5ys#qREdmM zxQ^r#i|7yQh>K}sCq1{GByw51sdqhDqb!FmTfU}iH;@#i<{J*}{hEHt;sWGD{3?q# zK)mj2YM>BrgE;zzPM~1BLA^~B%q5^ZMxjl3USUt54XYxF5eVAD#?@Icbx3J&i`$xS zuL5Pz!z&pnUpQz`b(U@+2W8i#=K5;#5Kg@=b?O#P6SBI*Xh&ySXbM8TP$=pF z7aCZ}8#Jw!^i;(=6ew9vj;|#Nv1JZYn+}o|RVG_UAeWdQD1L!HUrW*wG8`-Phk``0 zmp4e;W|hQL2i7KQMe$CzD85O*t|fgFA_62Hk5a2clBfa_6ObeT$?E3VjbtVcp6L$C zcZpN!^DmRTQ?uORkQnTK+jthP2;TIh(f}hpwq3GeCRZs3TK)=mn*x zn@(dS2L7#nuzE8}^+Gofow1qBzNZu#%z{t^p#?$%guM`S5KIv2AlM;v{z^f(+pVG) z;`L95=w#C&ioDl99X%a4#pSg37MPA-Jbsd|ooqTp5yYlE9XF(#VhNqKg{%iW^ENl` zqXOQzH=oSWgJiVkr2=a0GPATtas8H~d$H#Kb~FcbS|;hVb?1ShcJt; zcOYFqWLcmzxWt#}yn3=6+$>@}8Q=41r(u+;jnnJ%3vyHjd+bx$$aqsMr4Mf-15}%x z_ZV369=d)Tq3WVaGM%+i3au~xme%YbbB)s- zs9(@`T&upYDhHp!y-^$2JH{{}{-$V?5=JqWGHAb@4|M$xnU`<%z~*p>}HGkrr1Y% zq)e%;D`Rj(z0D)i=c$i7VI1>38I`M#5UI>ZTYfdG#xUZiL&B$IP1px$*R|cZmu&(Wl-e2@yw}1qC<7U56J8gQO zY=!rJ{|BVk;8Fk^*-rzS2kCXlE2c|WCyC#>v7Abk)R1a%`^%D~g^)Vb{N@KF6)Q8` z!MjbT>A4R9A~2n9F8+vUF}OZ$ACq`o(_H&8c@3*eVP^{vfNs<$aDt!Wl$R5xKB$S{mCl z8S&6!6v9;q^ej4{`26PikyDO zH#JTH$)+)?HpbM?M4>w`#k5aR*W!)6Cg9rn+E<=A`%GkGJl881*T#c*9FaTo**ldZ za%*zPaZTUp=FlByW8KyB@KAbeMF zo*Q_!Wj+aB8;AHRTn)@mRjmz;n2ugGa}^qWu{m_-^q4IVsH$V$K0FcEY-(Kl%mVE? z^E5NAiEljq%w5_@PMwRZRnMvvHWn#(R;5(uR_25p4>xF%IIvqIvO>Xzjf|b}05{~! z#EeG1Cb)Wg-0{YW9PV@+$bGooZRnm;-LhOu+v6L-?&^(UlDXPdQ@LuK!KEoHP>Q8x zf+iSlu7#l!Q&pAm5$ehvjUiwW_Ie?t_F3(NvB9-(Hcqjj%Q3Z$p_QSvFXs$zQNx!v zl{sN8a}qCaUYB&xb{I5Qu|=6 zvUWgY6nje>Xgjxw9|CWwM!D(4R5+Nm8sLkf$i`^+B=fiSz2=X>a>a1%o=g3?WeQPM zlG=x$_Ir(7C7hCKa7HjZzn#k0jEJa|S=jKmEEvXk-)x+t{cnuN*ei>#{V1nf%K~lJ zxv?S54rgFy+;GhPjKt{PZO6voO^G>`E!-wi5X^}nFmFqo?5JBuf7=h@ zeH{({oFs%TcOkW|G*~|CmY=5SpTqI=J9^*eBn`f7U->yHN%#OzYj(;dXmicDUV4^0zqt(^mKi5>&~;O8bm zc*eonWF(Bc1mW>NrRV-BJ^c@9pZEeCdJ_Q2>1;*rjE-1JLdZtBsK7zT9wIT((`9Ix zIk&*pPR1<>LWYAbIz-|k6NPB+)>%8IX$NZuU2RVW5RLXZOol`y3RWjFGNeg|qDnQp zgOYgq(qS@d$ZBYq@ys|5l4qd5$t707p<4^jb@0^eE;`eR!!e97LD(k2JrJTZSs=xz z9}iHM%G7NERIzg&d?LdO6NDua{p3s1XLzEJ=gf(omTFz4rm$oegrcCKo|PZ5z=3gDD3mmHAethMQ7>u zBP1Pis(iHV2+4!k<35^vlw{(E>9nIHiUWK6$)jWgeu{QG21gx0OpcK$wg&gmKfQRN zX?25gCy0E+tXH2H43^o}hsbsevZ%HUB~7#o#!CCgBTm?(?M5xB&P1vjEWF@Oo;_{=7hJZ4T^0KOoCkvM-8_8n|#V0C`tP;G9D=7DnD&=f?c{6T@z2+d|WwS!Bv5I zyyK@BHDq5Czw)tk<2+4yZIOMr0$~V=|)b zxHc0hG62tFgc-jR8r%xGIXE|Lk4cNLDh&F7iS6%&C zS+SMP&Lb{r{)+S&Io@@-Oj#W)&lvCO2CcJpUusYwT;UVby^1$ca&QY zIu&g!J=aU?zaoaXRh~?whx7`M!tl{UdU#`M8FpCgp_ibCM9yWB%Vz}WiamOyu2&d+ z5BbEY9-7=jl6qHz;PZ(yJjzD)EcT#i`090t)jrUUja*G=H3wf92Ge;hB*B*K;dZjc zdmZpnHcS)RT83*-H5T4+_Ctz#ZCavm#i7_?K&YC*)jvBF^$EgJkD7hf7MQkRw7x;T zldte^C7&C?R?0-6^xzq~lffU)0;I>aj#wNY9Q<`A^tRi>XtD4?hC=~pIP4uy=)uta zbIkE8!*&`2OS;4!W87-LX!nV)d&18A&EQhL>wHP!t zmr(-ivbUYpBs*$Xg)zujxapwlTFD@8ibM~$l6wJl)*mOv#007T;LwfzP*{DU(9019 zJ_w(9(Lu_?V2nODEj~^RwnRbU2-^|5T~*Dx@=C1iqPx4S*Ro*gF!9YWT=ruSNo51s z85R&L;qqK02j)WkHvBg`FemVJE&Nr$ygUyF6RtH?o)`8OzHnp2meXhO88S=nafe16 z4E;j=wyTW5IM@pq;-JwdU>(eMsB7Vp1E}9b;Z;eGm>FbsD9f3MUFN2fPmuH;i6E>Q z3?3}Mx~IVlogi4;wC)6n8yM$SyxqALrv|#6ECtDHaguw4ycm>k=@A3QpK;NjPY@mE zsp=$&@1H0Pf~I_M1WiMHc`{rt=r5&0Hw+fXLLVs^x(RWc;4g90qLUfFUlf^|bEbz+N8eAvNTIlzBF>cA2% zlc?nkN#bsJ=!!Go&zV9$I75s&>?v8z*VM+8EX6}UY1aYXsDnw}uQxMO!IctV+_ z!AhbWRQ(-cFZ^k@-+~gMq!%JP63bLO63V>deLh8D`!tf#XW1jmVDVVI@Ph2$(|f-I zhqcd3uYN}iiMlSnRRQWRZ-7fTh^ye&dc_~SH2r&$q)q_eXflcye)dw!_wdr&zN6c} zC&RhrUi#DbBqcpTxanf$tGyh$C)O~%c=~J8`D0#jiU;ffgJrr7U7T)Q%tpXI_F}db z%{d1kLJF-tM}~1lXXrQQ$fD7jCTw7)mfwIyD0i-=>Hb{)ABSRmVh6zbo%!s|vY)1D zUkNuI{{um-eNbzu6>QN|+?pWFcG1yovHPy9M*wt4N!pdE3bLOv`b`EhnvSvm@;_K17v=AXz2Jdb|= z6S<93xoKEC8HhXR?d@dSfQ_zTm{7LfLl%o5!b4GQu;Oc^XBf;_-)(JJjun9U>J{Ij zQ9qM@5i6a;KzjMauYK2Gb$i8XI_77R8p%6Ra!?DC%gi41iq{-;)z4&x@iu2r8v(LH zC>L5)ZT&5%zp}*$-^Rwzs=7NFMwdvVegUU;ys#Fg^B0m2vBw>>>KAgazQuu(C$t3B zs^4UNf)3f}74LPx|45N~_o*0kRZOPgzmjalRZ%I?NxzaU_&X~8O76DB3$I8j*#v?2 zEdNTIf~;mMN@~gpK3?!39u!;3oFlw7K9;vIiyhXk^=|77E$aPAj_P=~2Uk8gfa{kV zYX@{Q1-Ed66qaOwkUCpq`c7fJ%ZmE!%+Ub#V~x!@_-sO{qV324(i&=uowhKx6!-CW zQ43v|{!p1UBQ*7b%>w@^+}a$txWi_?G6$bPx}I&^j&lhah^^(hm?;XfIC*mCOC5CAUgHl}q<#CMHil)gkWiPQGvQO`U2jLWJ|^UaiDUw`8|n%C6&NA zlkbIwuC-*8eUzgN?47&db^O%&OFOGyD%Vd0_9G#ez1h$<`Q`=Wv_j6!7DX)z4DbVQ z>F#sJkWyqUEVZpJ;bL8@|ghv?)ItS*GZ*+Pj3uV*z23$Xtbgf z#Ti!Z2vqPla0M#TQJ3KYjaGQa)jaz$N#^N8lBi4o7wO(hbd*4< zMviq3jKSsM$swoVwl3J<@xprd@ArAN!W|C(MVokG7`Sl%be}h|1MV)7v((%{43V8T zp-P*&!IvspVYNgTb&&pQNo1E;~IA)m_PyOE^sL6 z0(Eu}-6X9rOk$RaSNz(+Xye@M|H(=QimpGlG@W7|To1uIYu4UIr#KMiOaYg7(E!xK z7kI_@;DYB~vj*zfFVRP@f*lYmEO&3Jk7qW}#;fGs#CYMTkKY+r!1C&V%T3$6ZHpCB zy)0etqMB;QM?zuXOkOPMFsi1T=Sv}$uCskhu!>!&)P1ngtg$GawT6&!f zv6YT49rqgiA4jJ=j}?aQOtm~#z+{KY`)J{#1;(Y17WS;)TKs5X)P|B`pXl`rG0w^R z;rTg*a|%ixnNw(}PuyU9#3x?$B=6{Dw-(MS=wCUja6o;(4Hswn#CA^x4~lN)efFm^pZ8*Mpbpn>)YtompuA6>8<%9lX(r#xO`!L71hq4!-Y>sD@ z@vc#|fqHpRmRC>Q#69_I8;kP%(veWU)a7Bq>1qE)F zddpK|>_4OyZOXaQTDudVyOBQeRnHqa4nU#a2*A2<85po=Uob*!$D7%*m3+P;c&5Qu zz2kp_EBPvn{sHNE5Z~oNXcfdOAb#FsL+A}i?1Dt-L7#7z0;BzqZiRG&7YHEU0r6~z zdm$bnz&8#MkG}|wL%hx9^KFLoc!+00UMs}sLHr(wV;_812JtD37UH`gJ`Li#c#K*h zZiV=?ASmb%=r=b>vMyc-_a>t_IN_o;6S_NAXL-W{&Yl)#DQblRi6)9fr?@UY?4>y( z$sev2A|&B{MIZ3V#NQvQ71R>@Z@LDftyX2mR?Bs9xK}ZNYt`rN?79?rNs`?2Xcx7G(CKDor5Gn&L}x2TIl1V`~5lT za!!nJ%t^1q|E{BXRks&fkCSt|32!-Rk`qvgSb>*w)WX9aCNuGRpP1ug7iqrr4&6N& zu1j_P7>6$aK`h*GW*kPq74*&;{p1>-K#fjn#175Y;CvXgOdT%F^mbB5%G7TFwL~9r zl5pEqx!Dh8!bo7alhEO1jI8-fvn%DHY?0~1gvE|d`tvgVlYgO~tBZx>5Mvr{qTgcU zuuT21cPPE)BvJ9P!UCB@A=qv)&?uAKP4zC)6Q=3`nLs7XxHVPPGQq$<_lQ`JxiYm6 zuB3GG_na5-I~Y+9FT(^nr^>J16z-C_Z~>qd&h^tT&e<}j7XEhz^=T$BeXfghVtTcO zl=ws^9P9zjanVm*q$+f+b9qh#m@y7>MJ@mCkAj}spD3dVuRXh+7WLrUy%1vrD$`{A)w4o1n~A&>a6htU>zIRn2#v5nL# zXb?!4ZEmuS9qiXT2n-{Ij_{C#j0^y3!oh0ZdmgTa!^Q(&0-6TERqM6R5&EAD)S?Z+ zfM2ent39N5)==Ord`D=vff5c%?vYF2%Py^##Mo{~{`Pq&xl=BA7uuIH6qTc){W@cIm-c@M z&?<6Xa{8YGJ+~~#>}BcI~j5|W(d^SYM&`{bRbY82x>@f#{F`ru>@);E6bt% ztP#f4F63_q$dy2TUM7Fk(+?#T7NkX18Vh}C;q?)qS5A7v>qT*vk6!VTIE5%a;G>~F za5}y2V)tac;#x2Zd}3b!0D8iVx3qC+Da`mw5Z;7v2tqrAYY;>To8b*aTm=~oZ$l5y z&L7*Fzv{9;9HhJ1uJDOBZ|#bC@-;l=A3Pm`8eZK?4GemoPd|chWU_S9?@ML2lP#4W z+_#}3V~b%bOx0FcR+%G6eX)$Xs$t}vOK_x{(H?TIPgKRs5yj8E{0AF#eQ1W}(D z@A9v&V2Q1-jeujw3(MR9%Et)<3cJLiY#7Y=E`wo%VgqV`E%y!_|JiU}@^x;xtMaA5 z=htsmCG_)(zro$$j6yx&I$1+gEy?g{)C#yv?G?X-{DFnH6{Jp|YVwL3*SD*B&3M5# z-)cl~xdvX?C*WC%6AHo3<7>;))Rj8GhAvuq6>hco05xN`sqXT^o=O2_B*?JHL+XDtW0`AAK0hity@I=UEGN#@6$aL|RjA4flb}E)c zqkD&Si*-AEa{KaJ*9zr}_F6yq|+w^aX4ypK;Q;yedYU0J|iyFl_xrOJd=r zH2BsFraTp;hd>Fk4pBrqwMnaxaQQ%@e1!_u)sNV^Vu zq5~|08?Z0f^Cp-W@Z9AB^8%ji*Ev@qE}EiHnQRw4`a)Yy-=$F-wid&yFX&lcQtTDK z4VbJ6g^3$V9!Y>@h3k!vc*S_wOAL?(5We0k_V@PO#-5r$?#FVj-rE!M5JIEL@c{c^HN~@?pvEYTSyQk~b^+^b7cj-M zz~SEo^wy$ibg(4>dMrrQujgz}l02G77>%)z-A-ns0mo;Ms;6zDr!QF6sBc1H@`lvP zgu;t6&&OKLUXcR6$_AC|?mv{J-|#HEt)o>BgV^Hf0e@eCT>v`=URFe52nvt2Uq-rH3m4_-^n zh|4myODymv7Ls+BEeVBObu!vvkwm+LW(BL_O441DsPlXV-cBZ(awR1i27JE)?yyWm zK$$)VdebNNlsMUQbs07f^YgKzrwQbGDaZmHJYiL#R+tC92=f9@rbR0n__bVxSDZ(8 z2dnzp65PdB^^RbWRBmymR}BL8JER;Ez|yTk z6j#86aJBEIg;a(Xs_VP4zw1Lm6<%X@X~#+yYZ0j6*g( zT{%1NrFW>IRvVPF{u%OUtgukt#xDk1 zV4A9HP5AQnoLZG-bBWJ`OmmCxy2x87Iif`eH@6RXU7`Z;HMN|&+lK+6_rMhov5eHd zSH_%nF8ILfi?S7EfZtYP*nb{Z2I9+=)m&9@jYqr*>j*v*aWTwp>zZJhej~Jb2GG8n z@Zb8plY?3TSgldNt)?%Bs8V~xfukXG$8f;wnIciRLIL0S1sDub>2z&iKxtt(CxK14 z$pVVOKa79LlidOCgiuu+$$&25%DI;Pr28Z$ zYAXf5nk6Hl^ubalHXoVs+6>qTZoZnmzNn1^*3 zU>Fv07Qhiu2M|OdQ&3`@TuN`bWdpd3;)3NZv}MLt+eOrerA4!B5G}K8y>)H*ckABj zFV*d~UknR#eGv7TectamGZ=R7`+wj0e9oNxJZC?@^V?3eOH%T-EhJ70$veSc&~Qn7 zCio3tl1Gh;$gNIQo$(dyC}GVA zvpJbD=S>*sLfBBIi^-wWUO71)^6_U?TsENc+7Pcw;&cfsyxn#ksI_#meB$FLCvnA& zn|;L4y@cpxU|Z;35(Ci|x$)c*1>BG`YR!PWo^I70*(1vz(KlDeww@FJ>dolN0Es#z z{yn5LDC|TZhmH1vw|C_u`jMax#P2*O9$;zWkmik0l-;)K)~s;;gw{mDlr@0Y@5;P6$m6Fqb;ROw+oZ=O!Y&dQAL>v}gv5)zv|1ReL{<41q zV!w*`XuJvjPlJ4U8aH~x$lp6?s3XFdcP%a#{M~8X5_ytf_w&7J=&mZaoY?If%zp7I zH(k+ zU=c|ZJ_2rKZ+fNeU7Mt{yDH`=-S{Y4K3#Yj(!Cknc;IiMuoI*S9YNA-BGKt)+v_$m zMs^gux9#ar6LPyv#7PQl=hd`dv3-I}v)IgS@rx}uG`gCPqrV=7YmNE0<`CQu!2OJYT}`w|T1cMz z1l;d2w~iHPT2BkiUgRLp2vF90sH<-D2mY>o~)wGpIq}|v*i%Y5uRrh zm~$;es*8ac7L_Xz(6JDZ7;ACU(f|}Z z8IT%lEZMFRa32rIjMFURNUkdfz8?efaYn_?!hOqadu<%>mq#WPAoyY2N@EOBz$1|PqV18cPo4En^#btzgKa7~Wo z<4_$(kOH-SaS?W!fG9wO?2<>K2hVYp^eAok?7*IA**_(E+B{1@uP7&$M8CMfO)&;z zinvx4P&{$?=UlO^F*^bdadwDvT?8v^_*w*!AgpVZPDZj|ieZXiDq*I>%!Z-(0DYDO z>UAV^db0b_A>eS*gzq9a98Kg#6cEz`bd+Aa5{Cn>#2p8@mVlVyx!KC!oz3N>WP@2R zwtW>Y?>;Gmmk(UETFIgHVOe-%RzD3GfU zP^ng!AK+CZxvZ3LBQep4c?D}tD@?&$qA~A9Vw8yKWHF`y-!zibC?Cb}Tom;VHTO%!u*5lD1;>xZBRS%`jG z7wM~8Ve54gvKjr=lL25Hg)G(8(2~N{BuUmJn1oC zIT?jvKB$+GO&Hn|B_aQghA=nWvJx42VA!y~JW_(EDZD2zBr zh@d)w=k>B7_Y50ycD?QdlG;y4JcrA5jPuspYMpc4i}qp5;$&J2{{t}z!HLqFgusauz%^H;q{o1Uh#ie%p|XJ-%{fZ zPLel{SW&fPeCP|<|3q;1TE(1eVAao8=no$0M~=M0G}yhajbpbY9haWjTC zB-Z$nQK4int(FQbQ@NN-TO(hiOMjJz#)y!h$mLAq7cy+8Pb|YlGa&xMt*=!H-}osP zs!x0rc++ekx)Xs<0uWo2&>FV`f}UP}Y#yg|e2B4+?rg{IsHSLe{KvTxS_7gE_qL1T zVam&faX*6Xu>)iL63oXiy)XfoSj>kcm^2tW7_TH4_uW|P$1wKq!5;pjxPcRF`9B*$ zB7GE;j6yd^b^s^urjy||_a7$%MSJ_jpZ)ylJgzXMkKwZE#nLPOGpIxd%<%AqqqvNe zPa`q(=CKzSIW3jJScsU)!@!kCVTfo~Ji%hJJkriss3(ziD(N7!M(vE@!^7|(E{Z0k zYryL9i|!DAa1?gM)xfY{6mgyW9KNhlPXUSPa4}R$Y)1@GDN3MHVp}eXC%ijNT#92l zOa2`&Ct(=XhQ7&yDS)Bd;&mg?M|6F_eh>Bl`s!GuuV^1Vjy}=|Uog60NSu6mi%dcn z`Nh3gpid||N|M)uP6F?m?^vU_5t6|wRD<$_U`TsR>Y3cq@X?Hf*vaYt2wO(zVcR|jRg%!ovLlC8g-D9eT)hdEWr)1{n)Xmm_1@SmeobDkmwk;hYo1?azyb^ z8bSJPkYAF|87BV=363M%m#_~aTOzV8hV6rGf=xC3K-QEMLl4YwAyl45BXkA%ck^-R z?)7|)O}bZmQQYnMgtL_G&%i-vX31fV#f$Q;?Us-U-|vaea(wOW{|K_zJ#6 zp;`~v40MFvcRb>oh&>Mbd4$l~y$nCC-Ba+>+I7KyaRknI+Df|7(_grX`&kt&LH_On zif=;-if{9XZy~E2_T9+(A?!`Cx5B)@UHwe@cNQMP$nEDm)WbDQN(ce ztJCo33}dgd!9Se+N{*`RN2MvaPCJ3v{SfU4`-c2f>?{0v)!`|KUp&mu*tJI4g18FM zLhKmq;lFTgDbhB$?z(acP9xz5EwN+zd^fTWO5Op+NzOJ?@mQ zSj5ft^2Np6eCaK2{?TG?eEt(YImmyKc8dC$7)pR_jhr1!kAxCjX%N&`7*8yb>CcEp zFMqO_D|h7Ke*X3ngZtYw7R8_%uyH}aW8S!J! zXbVwD4677qNR?aKJ%3B)7N|%{e;}P!gmyrpPeSA_FHkFrt~fLxF%;J=-$#W(ydnqC zCQUf&Rp9>=np46Vq!Yb-!gx;OX!I(}jH_lzs?Z;b+BauQ5=500-4AIWNKbbzVRd=Mt02lQ+KsOT z6S|9u0_0GycrZvqcHnqT6SjFJrEm1(=E3h7&!tLV@$her=PENb!o3X6^ov9MG=A}Y z5UBj(jeJrmmx=_9ECHU+jBt_o#eFQn)%?^_ZUm(5Z!YCVNyp=&U&`exZ^OJy6J%cg zE$W+&-N!F}=jKnBav6?PXmGO5AbJhz^8kP?73}lgYjA^36W)bC2KGrWXfv>1^i$sl z9vXMVLvy_2k@nJ<(LTxe|Lw1^Q1{z@V%%uYAR6?|vfzYB+4Cc1f9Q=dNFcADCfts( zigC~kk>VY!`0cFt7FPV@9&k;!hl`pL%#9RP5-IAL%SByJi$X~|BPA_lC9Pv6t!5>y z#1ja#!gmEUU4%{sH}x&?te}LWJB!kw=1t>Dr~f;&t>|vA#&tow(MQ{JEhy_0d3mH} z7uKv7CIlk^0Z9gDSEg&EAjT5*rF&?o403W8Mhkteg zw@`T)c+XY>lxh=}q4ng9?qqgt;Joh$B4=kEwEH zBm!2BYfpai~^=Ud7F1xfkta;`+_#*|1C z*0}j!%Q=&>m-+q#{O?3ATl!0YFPq5anciffW8Ed-ev!6*jLXGVV}sKKu{f2n&slFz zz`o%T-wp8hO+*5c&ZHA2z;*;qgt0r({4B(BV%1!N9{Pf!r|1S)WM zpc`E(Qzs=sSu0V7MtBh_OUg+sFNhPt3`JALVy{aT7W%=8g;Y1NRGpzHLj}blB4#FH zWQeh_n8!m!gzJ2n-WYH<=!2Fx$^Zarf*Z;(X~slZT$FN2>)E`vVtJz%zc;tf}Day4NNXn+OuiTk{9fX$3HBgra>{w(@~ zd^=xR!NplGi1&nEvDX7&JY;KV7_>jzc;2?Bq3MbfB0QU-LAA{y@@-L=QElG2*60Ju zk_uY|P@YJwk$r&e;wj$EAU z7sR*RAd+-)U`f%l4$?s)&Wuj5 zf~k;7W&DElIiJO3h-r6=kNe~pDBw!HdMLT@h-EmrG{POhaz>1`<;o^pW>i@f>Fgpb zpaFFDF}j$Ff1k~?`Avtn9gG5`P~qcauHtekQ-u{kLCYZxIT{b%;MyFLfn`Fr6K7pO zhGC%K?ggN%<8W9M2i3s-uE$qiM#)9R{Hm)svpf~gQt(e-#cA@^upCmLfi8&AEQddk zj7gz;7y37mYXG?h#`E7@#T6r$8|v03a~jilmg^Isjt9lhakyxN4_K}vH8h_S`F7KG zl=8DCb7PV32v9S~H^J|x^=o1IcCvhr49m9#`C5=qQYvAX1W8^ZdGlaE+{k}6nOo^d z6Bc<^)s&3P+){+or}bXH*np)?(TZ5&DE2E{U9QH}rN3tke4n`u`2V{*4gY_`c>2T- zflky~@~7(u!xt=6RqvIw&A=E$Dp6RUtY^NIiBlcsQ)l27CI#G2!95l3=V4z5f6_Dw+ho_%bd@l$2hgZG z7z(o~*+JbKwm6(;)lr>BCVH7J%N zRT~Nz51aChwISYQc8gT6!yx$FDX4g)28)F*0rm@*L+@Lu0_VfKAY69oAW-AseA8II zW0?CiA3Y_8e#5_i4Cjc7FRE51uS#KU*nykSp!jcOtAoo8{BHPmqbZt>1$eq(Y zVHG+I6eDL&jGn*lV`Vacl6ka-?}Q5>(9QPh<@>=0S+d%w0_itWaIm+{Z@T7S9!|kw z?Ub3x;V6^xo71AfBa_LZqoZV2X|K#mV6B^I#-T)8PcjXQT-K06qt7{uJ2G z1SI(!HcAkbp=OD~l?S{oVH#Jc*5I|vFaiBr)O;kE&~yJj}3f4p}Xtlu0ddWsA%1hnwD!Mglgu#?ixO0I=6PYDDGpl8hZ5u|HS31 z;vX+dXT_bND+zQO)be)%okn;d7$(qZ1gJmxqu9&Y>6~_@+>KGk0dB8J5grew;O3$c z-UpyYVfC|Kuiiu+BB#aMahk-rWQG(xQ60BW0nAlMoE@ZF=U+TD<(m+2(Fm^rs*J+r z>sjp~`E*y(WsZ_uY5O-vw@hs3)>rY;GNrz#fv zpvOpxz)eeIrHEaJSbBJsu-InAjwb#R6H{tXhd3GHa#`Fe7WXmYs9^D2#K{qdEfL>b z>@hl!aXTWZ!kOuaj6x*GB4>FzE>}o_*fPW_5bF)ntXF#|5+q#RXvB^}Y&2p|u~@U` zbHx728WR%J5ogAn`;o;Nps3D-OIkwc1k%*^YE4~Gz{R3cBTPiHHgs@ zU`N|di=Vjp$rd1*pL9#014lx#&~-Jz97`5T$iU^p0K3Mcw@UOGH&M6SBSH6Sgi6l{ z=xfyoN~F=i9`B*PB%I0`A;C>^$GXkX*yAa~QQlep!*D&zxAJ}|0(99!Fz zVQp7Y6?UO1WD1}IGG&yEl*81*+yzzr*TSaDWYcyT(ZT%<9xK@LGq0Gz88T#klB>X! zEho{?26!68uwn>|o)$;B`KlRQe)chtfGC?_Il>AMXM`Q?rev~H;s*i#;Tha`8-=G* zg}c}s^J(dJNLSRd0ENQc;%FATHbm!HIF{-sy#cXwq%v6S%^^D1LM(4ctVJB1S8*)v zI*{V6T#ou(?^futH$vB`tY@k294MsxJS%PrRe_lH_^pZPlIfwlu1$1N=@#OJ=2vuA zp*y}k6EWqX%zdd{dbnDBdZI_nISj)n*qQFw_Av+_6&kZ|R96XH_xMTxG`YpS{t{eM zPX))||3q*U{(lMT@&9u$6aW7XrsDsHU}7$;Z-Wqf?kFM)tLY~Up~W-xuFUW*&`t*pp5SdoWWk%w53F9o^w=(bbhmwrXNg3zXX9n{0tK+KvpBvp79R~6cj zzXyjJk{fBr=Eye=gyL93-V6>kBn1tjU0lw-dRK6a0|jkjpS_)Zb^~k4de)M)5DiEb z8iQP?0*|7G8}cexhiPBUiG1SDP&DFbZ@qB&BR_jf*dCx@AF;Bg)v|9)$2Zb?_07;w zd`NB>gGF>*p-+vA`WO`1@0JkSy>mn1&hGb7Um?prI;gl-XFn(Y(@p=2J<~DE8B^vw zU~ur32PMkUsXP}uK0lK)CZq^@uo4u5i&Z0B@be$f#8H_nJP5+*Om1vS3IuALP$=`g zMA@Zqy<|^@N?m^ZEUqj+SvUrEb;uQG^w}gil3rQP(ki7ZS*Y<#dZlnn8D=U4$PRw{ zEN&9YjP~>87NTisbGQmM@FWPNtaJl_qEdvfef-inXkLo& zrjLJo4rjoby4Q#Ebr>X&D&+cqhXh{tybegz(8NN0_c5ObR3hqI!+cah2KC**eE$GH`}Oc$&3vzd zJ@I;6_eU|`lRkb6^(8XjeLnsTn$qp2-&^CuQwS8fz- zAAcM5wJ~43kKa2NrEF%tOJ4pf8n=@9e)972d0dWiF7tg1;n8`Bt6;u^Ufwnj`Er=A z9r{veTpaUl_VVu{UyLYT4AHu+^75y{{-2nCu9wgF6PIZLFh{QhE3li=so4no&oB;{ zhhcWYJOlF_OeGZecEb(?*y`|oCcC}#NX zPpI51)@|QI3&;)dl`-E39)8jd;EPOwhO{VRH`q(FyE3;vZ__|`8CA}-%;pxq@@Gco z@H1|mHQS|c9cj(xb*;~1xAkZT#aBIhjXEGUJ@dVDGOYRzU5jUaw#z$5-*R4D?o02? zc4fDwTJu^J|fV73Mmtk*)xfAaDV5+S^_m{|Q`;Bt)JvpL1FW%t08Y=qFi`Vl?SKErkBk~qx)XFGFV4c9W}ngmx7bCts7 zN3tT=AHyC4dpqpWux+q&VHd*I2bI>|l|~yyg(nMt2XqT{ftX~p_h@g@Ni>{6mfj@7 zcPQmj3JMD^hxixga}R6345;2&jKmx`1+CfbQz=a(UO4LG=PckfY4O6B0QD&)8{AxW zNo~Aviu(DPg3`$ETEJyvJNb7g4Bm&q`c&aTJRLCn*@#r(ZvUK!CMjACdS$?6hQw#f zY;w?7&Vc=#moMbT>L|XA*6rv2!V-sagZ%Xixh0O1REv%gTf2eoo=tw;+Pbw%p?&To z@SSGBBqzn!LS|zUiF3&f$xsYM`Hf3Maxj2X6=j#i+i@?W!0@d;c`x;^3qeWON7VIJ zPyzi+YPQ9wf$Wz+gu*SZ@TqYYU5j43Bz6U*{J2H9G+fUDC$PZnLD`G46qDKPgyK!t ztYdEl@~P0AQ&`5q1}$-9mqKgu>kamFDxJ3Ojfq z>^Rt2u$8cJksXbDA>Nu~zwnS!OhB@b4xaKw+!Wu0UensVTnRt-tqx%_X7 zxdL3NFW@w$w=;W)cFlC$x>AIyAZ^>#K&;RXoQwOYx~m+_uxDBOOMqxe5zN7K+`-hK zr=$uoo*$rF^i@nfdK-HaHX4r}xYL}3PXCgz3{wB6C}Y}Xy+6^1rF`p6+=QHk7+1_h z)0LOxaDPxjVzR&m__H^0CKK-CfC~r2UW9_6h#W(&zYOoaV|ZC+372gc5D&6Jjc4Tp z=Yn1vUg~?7(`{wx&Y-s`eq>JmmFaf-`FEFaSOu2bLtU!nfHl1q&=n0D7&<<-vcra;CQJohw zf3h$YTF-ChbPio$sqrdHyo(C3WCXm%3QH$RaV5i-9GGaGXvuVCz#Shbx0YKB*zBP( zGBCk9!7|!qf?Ex4%=lmts63cYgG`N5B z7h8)h*Sf55_xX#gMGnhc*Y)uH=r>zkx&`23oI+%+^46%XG>IbDf%iwYHHug4 zCu5?HQf8A>;Uo7Rsv>m!!tSinC#%l)$hv{e2WO<57eyt*lYSOxteLxi#7HcQ$`m{| zu^&nTz)fi_u`Oc9iGVS?1hdqSzc*qDkz#PRBom^9y-G_+0&J5J&)d>L!y3$h{gs&z z9c;Qh@?h_JK!SH;fWgN)Er#vf*+xFbxrFx*wnha_e_ zHva zLU5TXtqPYC1wCZ~y}JZ&XQ+ zs`1Fo5Z@HrxzOIBAN?eMki#cC_-;G6K_6hBjECyzOW;?gpIinqoSmzjr2vnX9>^VQt^tjz@n@GmK8#?z?wz!DUpwo=2C>QZjMzeAE+IJRkfoJVlr(-l-PA%w7dDH zmB3$Qf-O?Z;{GQWI`yQ%7EOg?Y|74fzRz|$c-%u^EH^<0 zToh;c;vmBy>1y$6X@wq@dRs$}ibV(*83sIqY zrCt4^Smfnj#8(#%K-_GrQ3a^_*!-X8BwLd@R4vEmo5{~}l3E7Dvu;I4bSGV&5}YKI zwRjFz4~5t$t(G2{Z^66`GZh{8G8hStEyna*j`eU8pS_wh%|Gpau`255ysHZA;9a!0 zT_ZxX8)uzo-qVmQ?8Si5!(|@`Is@YC_-~?TS>y{t=j2e=|9-@%g_l9^TFtpMA6`ZU zH(@@;5qVJ(ULoZdui*;wl7zR|>G#I4Sxd|M{XA7um3c3&;j}So;d^{tEocM$QRGcd z7VN=4s)SBl%Z-o%Z$5S{H={TOxc*x*H>T_CnCJc>eJF>rzSQoq-JW?yZ1rxc+BEfF zhhD6rno$PC#vs3MEmt@`2?`74Kw3x&(vH%u1<4Qlxztr?EQS)1Tt9TKB91#splBa@ zGhInSg`baE$5khx6~k+O9oUc7aki8reyV3lu0q4`*v>Abn(`h0#X4@RBT2Z;H+CZ# zJGqBG95HdN!lf4O_vFkd0xCNhB8<`l6w*o-`T}wL)W9Jn37><@G#PkK8vll$=GFD2 z<1yI|%x4M8pd~Ezq((}B4#!9d?_VzA04t$`mf#S0f5Aqezo0Bx@fmde_JU%(UX2z} zfx@S7HKFe^JqnFFa|*&c+fA^C|DZ^`aSPM(OA1s+C0$bFJ?t|!(z6fK8}MjDqsc7o zYP&{?3fug{UvL9h8EgWf{!{-x`ziZxq6@FHtmib#)xs(FY)d}Uj|3o|1KS#)K9fJE zD<2SKC8j~HIlqfumcI7Tm`p!Sr3EK@InctiJvy=lvHd>dT2ip#Xg&~3ql5Wf_L?N& z7az?b_4E7JV~@JYe@q`mIEjh;CZ>6HjH(caF5K-dm=)(L!nW`g=tgSfAc0EI6@CM= zcO{nagLIQHXp!i`Qs@1^}sdbneHOxsE< z^oO8;>sE-OsfCLkUa^5Q0NCCJMw?r0TQR#PjyR!}V;g+P(_)-RI>}kBvPf<)<9vZk z`kW11eol(85~<_5Zne?xb_bO&F0fG7-5{Tj9--csB#id(PjA3TCJT2!H6)Q17FlV+f)%G-kP%E*$w$MLX@R{=luhkL#S+S~h{x>2X65^xJJi z9ju;8Yh0J|BbsAbQ2EkCR#rL6DgrV&N$6v3p5m>*3R3c=f949Zl7-2@a7x=Qir?YD z!UP6rV6^-NQ}GKAf9IdM9GzOo^RO3Ix+FWu&S(?^LIOAlWuVXtBJuM_kg7OYIPOWu zPW}z{iaDU~ug3`A21EDBJ76D$d2bV7qg$|>!>(J;Yi{Ef%TJ5(A^x`8xGmYhEP6~p z^MRKZd@pLD*?kVXdJBeY09-kI*6mytx@?kXn^8v=k*Vfi=7h}2LNO>&IwF+Bn@8BF zKcD%NX8r{)2ltu(Fe*+k3!5?WQ8xh&~d0e*fn z#8w<`{+?#YZZ^94eXx}xdM{a6jpqlcub272O{Cb!;;IA?)XwX?;1 z$~NDcPt^L5xf`eVzX56p;&?AVeE(0(^ zkts<6IuX1Zr6FR-cY-T9#RX*ytDGu`*+|QhPT+P7Ar0#f? zvA`#HsKEknA`5NFErNIwYDJ1zYO}SMizL^%cW#0zkuN2}PWCNLgs0Qj^XTorUa!EQk~9We>qLqB@1b!;JaNikx0Kq%@=z18Pr3T^V zN_1AT@U{2`3Pe{mOQC>s$d zX*O)3+@qO?D3D58FW|o3uw^t+l}KG94_yGE3;M39mTLg9(4LNXS%A;Ko6E``6bpjT zH^1dqdd0v+V~DSfD$dczEDP%A;Sv}u1?bcSs!|^>kR1`$^#0QVuu-hpxXHL-Jk%NISh5FTY^(3W-i=?^X*pF&&vlYUuShdvm+f!Sk zJ5@Rj%ayUS;MOFe&pBMlC~epYOyiN5wop8Ri8VCA{FrF;j#P9%G;}#7TgrO1=fubS8W0c8i4XZx zt-okZP<8RD|35ERiPk1_!!ot77T|%&d``T@AA9-WOcEaPgfCgNs`J4-M5}4Sr)d>v z)#*`6H+5A!L+HJVnV2N3_wd>Gb31W@R$Pq_#@?L zh&mxcbEq*UFDgsYdaK2hbwW({5EFOQl(o)sLM(uc2x3Y$R7+aV^_#NPLVoBsvCS>h zE4E77PKfK>e9RWkAnzBOL%ewlS3XZAECf$Eh3D?}Nyu32aBq3Cx~P2{{07*EJk<9D zpc;BLDF>X=?pD|hEX|YtvDhKOKp2o6Qf(az-9-R--TYs+aOSZSficZ|NLp4-8l7XE z7sQoN{}j%(+CLTo1ttg-Tojl4Y3WuspYafvBZWe{%CYrvbillx2A`V8ya&`qU;z8WA? z^J`>;8!sal%K5h*;;PUWTZ20v=2GCeFUV^j26FRJKVSPWK*YQJ{Brp7m-*=l1uaP6 zll!C42iQWvA5Cc!gFv|Q?>@{;!`)V;UFEu)81f&NlIX4eW z?vhyR9c?vDP?pe_te4drZRJ1%P4?zmrozS%5qm2N*LE@g3Vx}ipMhir#@2jL|9CGCx_RSPxVFjSQURi5MzynnARd7M*963#<9@U0o;3y5AVX#D(!C%8E} zXe;de@X+GwP$Bs-lp`}XRzEkxr|r~gnK~oxm8k=mv?UEwo3o) z;ngi%x%PUG1y3fsm*B9(ilBK=|IH3WSw8st5qR&J%M;a3Z0 zH!ti2+GP;0n#KWLbBzZtEQ4cUP<)&D&A58=Tps*;m|yGRo#FULnP1}JU*sX$vk1KF zNx}&?-^+6;d5=N5`mFe~7n-y8CAO}!X6O@IMeqdlYU40N?`E-Ig4Lmo%cxI;Oojq| zkWv=c#ch2N_nG^!hZ>b-*Qm=6RSsu zd#;7(PKr+lchm38A*PC>L_cdrl5l^B-`U2!n^215m2%eGaD&zr^Y!gqaT(RL{2?w5 zy+z=kfGLb7jH8XItKc#7G3#GNSkKd#{cy*E$sn5fm0EBZ`=lz#TP&c#HuX?MZQ;U&$0PpA+wQ|E`Gnq^N)_ zO9w!!SUcI4xe;o2@yH?pNIczdwA*VwgpS#e$cK_IAFZ?wS=J`T;2_5hHr*fY?XzN5 zFbyEcSy3B2&HDeW*y>4{nPUBAP8Md6N|+b=H^P6JlY~?%VP;5mIp&(s7mHX_9E+L~ z`W-4s6zYHoZo+P+Lx<1~qEHC!yc8JPq5EO}`*FG-gPSN!g~)Fq_eI8&I6A}J7?YSd zCFK{sC~gPBieLCQ?gqziP@!<;9)U_mZd`PaND?kZ_6U_Q@E?1G6jwsw@Z;7eW{j{u zVSVJFZ0jlQK5crFuB4;N*CXr9viGg3Z`{2~*VtMm{UNGnbCvAdUG+cL>l+#x42=zq z8VA|6>e#B0q%7l!sbr^wcg%VzUGg*;8}&m{&t0=#tsze@pC0!uG2Sslt+h@i`boAs zY#Xf`YfovlwgtA7-f-wQiPZi!`g&zd^&(Z=-zd#(oi)aAPD_lxf|;}2w$Uaru9&gA zv3uTq#>N?oBq!(eHP)}zt#%BnSHsT@`lSs^S-r@v#$%1YSL^0s)w*$5wf;1$S~ptf z{r{-etjpE%1yC&q>NR7=?$zD%?uXuXRkzbj+yZr z`Xa_=wWVFrXO1!UF|&s{?p%7f>qcL$<33tPRI&R{4;Zsq^*#h1(O~&`u}w?zp+(7{ zv-~^{oIU|r=SWMIJvp_vHPAXJVG<%6IcT;YRweoXFC36%k$V;ml; z^^4-^?P@~oz}Yv!P!g|hcQk2+o05HZZGwVUxZ7a1z_?%z!n{G_FgqOhkAVZ(p)IT#Ije4MQAT!V;V~=ii-Rfr> z`x?U~krv=?TIlkOl;s#I42gynw!DA&ui~#>6t)6|t&nu)^y=2st)a6&T#yt6h2Ody zUMb@mP4%;@hn2IUf5op5_%s3pb(XxJrnN1!$vUG9xfs@S?%b|qmqR7QhG-wSeUN62 zjB+ugTq!$KI+Fe1{(bcG{Nvc@8~k+iN3zlX)Lq0z`Ghx}jrv#KQOtkTJCgZ7_2x7G z$KGV-|1c7N#7k$zOovB{$#kf`r`5bm@gXt5Bo~6%7!yIQ5c`H z;5t%pj!eUu@+piIigKc0zA2NDzaV@Ame%l}c$nlS+iMNcz}PRWmTc4J;3@^0+;MG% zy&R7_Z7s>LFS3IzDOh1&nU$H|#{8cgDo27mNjC~M*HpXzXo-D)R5975weccbQR%mV+nHk-NkGJu37YjWP1Kyarwem9P#t=0rj6{qIWRRKmGn_sTus zfypWz=r1RC+UPS-udn(3HOsaf_6CA@IKe*KE+?_IiNZ0EHT0kjRzRMOD!`I}_Ha?m zM%fa;TJ#;PMWFgZ`7K)b7to2xY#8%liT(bAQN&a<1(o{-NH#eEfw+i3NZ4K@Yvruc z*0bUdc!AQ;XlwvUV_SWry{4f-w(ShW4Wk$vN6QNUn084BUw9n6>LjnV`dNeQHlMZs zpt2;I$ZXq4bjt(IkDQ9lHJcyUtf;H0`>0M)UsFG5*a)>lGUn}vmM3U5K53!IosWG+Vg&MC*>)Z}DY3x{S9|}7oIWkrT5iysM4w^TqOc1YailNtM#OG@-43-4Br z>;_dFGM}j-xdBWP?HnLbs^u4YBzzT^%ba&S{uSOa_?Mw~Rge|aopeNa_ zO4h;=XyNlvgQqm;+hftfXx73{y*KWsEo$>*RgUc5Q|0ctA1lMBjYG?(;wOp>cB7xQ!m0;R&l_tHq~{Z`BcfcLuZ;gv7IW(fLudY!8OwgjZsG zIMTA8y;9?rNXvfk%8U<0TK2V9ZoDtjvZLN8 z(SR2~{u0I2UJGkLxhKmJX~71o@qka8z{X~Z(VR!?Z)WumzxT5TyED{=wI`td&(rf- z$nZRAoMWKvmbR|2WOPFlK5M|^Xu#4)1Gb<6^^peLg9g|l4Y(5xSi&0M2#L3$1&bps zXhI7XM#g59S7DqV8JeZuXyXl*C9az=OiR3YgB-0~idLqhmHO=lwDL*#T${M{y!bCR zI{V$*jg^;^<$5R84y92c&Hu189qx~frI*trd*2*ZQW8=fVyPZ<+cDo4VZO^Mx}9p{ z=vk+nMIcYi={-`jwb%iUxxY$D4EA#sj0PqP#sFi283$7eQvov-<{FrpFmquRz}yT& znOauCZi2ZD=1!PQN8IDEd6-==T`-4W-iG-Q<}(NWzJ~cX%n29)hVJKX*aW9f z2pU}nYpKFG+COTvit=x&gb}P&tI?_y)~X_M%1O7K7SCtsg`xDxNKaKxtAr?bpS2HD zT?U0~1O4OU`#=glP>T;F z3jbv3cOiZ473nRWzg@0=DpD7*)bEA{*^-qzSbYv5n}*frZA-WvV!O6Txhd3kMFZNtp>8k zw!@eyN!7cxXPBnxGos0J$BennNzGf?(~Cqdt3KLH6x!;uVu@GTIbWC8%5^r_VmkNO zVmt95LZ`7#+SyPS*SV)IzO%0`vC~+u>TCdS*q(Zay0fo7xs#ri4Gk%sdm2(Z`x@k( z%a<9KYC0R1rgiRF8r9jiRMBZ%MvTVRMq9TnL68I$WWHg388{SyC{YPrc>S6pN(RM3 zuaO~25(F`zXq#&p5dRUJJCkaV9)JdOJYn57AifVf3ii7}X`9la9~7%RR@PQ4Q@b$3 zD#`VrrDD)xH8BZ{(U8C}L1IHkymLmkoB`KYbY~tvsBHivlL{ zjMx#0uVnERh_8T5#|7~cX2u!u5%)y)wQ}|~h*i+2-&oY$$fyHAFdljq$0OT#7WX}i zYjPLOD7J2|$+Q>ElD0NXqcB|Fwo$F)z#y>4HrAS3*JsQ9vl47hwm*YqK(Kq{<9BWN zWkY_K(qOMqfk7So=^^OK%%Ce1koW%yU7f*O9RCSjorXI0Fm$yW71QHG^mkQ6 z)`Fn^$%QV*-e-2Bt(!Vznvef@%#5K<#oPy%j@5hmH;< z9a4I4phHaW3v}G+7EjNH#Ut=H96=T4LRpF_mmok<*xjAnlWACR{y(w~BnTnC=t*uw zp$ZIFM(7&4nQ;XWytS&rTVBwH(zOUYZf)1t>=*E2dl*H>?|V?0QZiDIF@RIRiIYg52fp(u zu3RoagC+mQQ=AF6m&c*H>S^bX&TQw+P7R*?fD)^Y-o`;Z=CKP(4U?To)*GEWo&R)Z zZjrW!WBv?XJWq2uszI^N9fey(n1C^5JU`=U?pl0n5ya*bg92+SVN!Qrs}SwtpiXGXe4X5Oh<~i zvNF6Xn{;#{k%JHX6A%CSF0KsiIPT?@ySc4!b$IzFcXMxKtAy=taEf(gHcLv9o5Dhe zlxDjWu+(>#2&3GqEjhACa zk)ND5IXj%{_T&z_RYG^ohCQ4O?c4zNu0#RY?w|H>Ig8JWH!=T7_aj#IzSP!7Kz~Vr zW+FO;)!WaAk9*Xv)3{wdV1ej2^6d>VGX9-Y@bbt#R$1GghJNU~qy3?6iULd|@05Xr zf3rDJXbJI4p5rPf#S8C2e^Q(wt`y=gTN8F93M(-;?e) ztyPsr(^<}qK7Q8o+_hPW!bIdGX#MjnX9jvW&h?BlQAl<3uRYJ{VlIfcvi2#xeDCv| zMjkIDhj{Pv;32yp&SfztKxGbzW3VVG-3-xUuRzlez5amraN7KT>K_*M${l|fQ2Qo zu+I^e<$u~>v~MGATKZb`8F9S-=ZJp*!e~dBI|{J_q8J(@Ckj*b8Sx9R4J7scP!m7+ z0yozYFAPRV=Q8lg4c9-|FV6Y{$~-~XF$`s%C`|T+$!ZD0L~yNL`I2l{Tg-6%gH0H{ z;lC&xE^Q8I9ZVF|zAWSXYV<0qa-?Pm*>IGhFL#0um@{C1!}MPZ{>+I00Sw*|5iHhm zaX;v&6o)By#S1t1hOk)2#a+Qvq&Y4=8KhXO7+|sDg&J_E&~mO1BwDCFD^L-`0%kx7 zoytXZZ(#fHT8v@%B%pF7fbTK}{}n+w{>y`!gGYyBmv~1PS0_&pvP1mwE>4%3AjE~b zSH4mweLAc3Y=5qOc|@~(g3!y4+{abqoB=*dK{U0Am=-_ysU$caY-#t3KLwt9AlM2F-MG5-g+90r2omfc1nB_OijW&6tA-RJsjA76Sgc`*P`f9C-f(TA0r zKwk(pAHeG_;0_J&i^DO8SqvnN9)%w<|Mc^(!Nm=TTUbnh|K$KT5?`H%Wq*-&Ny3XP zdKxy~1fhq&>P60qdHZ)Sgfr++Zj_P~K1n|CMW=gPsJOKMKm>n=r!8{Lh0Ol}E z+ay9hfZYT0Lzyg{`~t@r809tC^&&!K2@po&buV!li3!4WKKa-;dNiG>9ZzM<;4Lq4 zMUDhKl{AE3JKvuP%^+FZ2gH$~O!WIa|7pC70e}tr<=(()Xo!jh9}<0_mPgF}q4XRm zqG_wE9>7DIr^Ov$513jVjkM+Py&HlWN4SgOJ{qjf{{E1J)EAI%qx2j?NBJj`LcpS;Jn05z|h%)FbHlGsP zFz+b;)K?)n+wt+r8fG5dndoF;JW`BD<2j^{2a6Pq8){0}jS$)#1}()G&r7>OXV&sG#u# zTlfa(lj2W~<4g`JA*~RSk>huXX@yV_@&9pO2gM-qoQ z*LOM4E5m=n;nQHV(c=-M?B*Q@qsjW}DXaS+L0Swd>ZaniwA*V=8>CyCm&#kPa`e|% zZK@_)B`u#@D#-O(lB*({N}{$mOxGUGXnu3`!&T}prB7a$@n}`TH#@50z5s|(6yF@x zzMy)l){;(IK1q|bIJyp{5_yZH5(178%(;w=02PQ_f?Va+`Sc~k~E_{(((TI zjw(fuq?16aixI*gx zV42h0H?dD8hoo(?_W7*MGlzZZuaVR;mYP5YhJM%&jDxIwsPxjvcO1vTllS|Fo{ePv z75xw|^o8Oe8be<$sj@1%+}KC91!(xcLO6R3?*oorRioZAqawpuftT{8!e7`c8DH2m zx|is1qiA}+D7N|DD#Ou9&;^*>tSHFrQ8t+w-^dNYaG%FH(CPL-911-U8tQcHAVuc@ z_=Y=O08UQQORpBIYAT3&OMOX(a}s$A1;*{Cp%qU^@P@)d=%0)?X3Xq!?sejEKuAIo z<5|%cYOGP=db8JQbXGhVPSfYa^8mPXQU2<)qT^(U%I9r)A{2U|2ns8n425PlK$i!W z<(FDQ#`K3mufk2~VpN=#s->YQ&vy~V?l%z~3ButJK&^P_O?t~K0N}bF1D7CFf*E4& ztm}xPdx16?DA7}kCB=(KXS%j|5pY+s>PMVr2e~c(Y)^NVwDq=Fx$)uTw=go-TD-YR@`Z#PIwUE((657T3exNl@+9T=)!bV}#fhsB zP?oVtcd&~40+jWu&)xK9mGp~=L^^WYA&GggzgMdu9p+7CMNQJCd=f0(Qk>LmTP-P` zs;yhP1C$79N8M_5^TXQurP2;4T`rbxd${TXD)Jr}_(^`o(Ognj+AuxpdwMT<0_5|C zrNn`eEojPbjgi?WY@`wfEUOs!|cxU_WM;RHRSY zSnV*{uO|z%5{%Z>0m>KDX9q2=q|Zi0lQf~e{^|6S?58>$5D5M(k9}X;bSmw&jAsz;O?*vz^HfjtEnrz8`r2B_Q+KG?X44_V`&6 zu?VN&Y|pc6`_>YDLG38w%xIrF23t#?m=mls$h#Lh1w)5ZZWul5J7?8|5zg|af-HG^ zREHUh$QrEE(}~&YOm$x8Oa@u}JEzVn$07^ISKz(yNzL-E&Wu=REUDAeauzthbEa9N z937ckvj{=KXfff`XE9PO^sRhJ=a5Ha5O56+T zVmk2mJW5PuC61s(B}zm)D_A35^FoKwq!DISMAtx~-wA%YT6vhsiKX2hDCFKoRxSDy z)*@`GCGC7?15aX*i6Su-@nZ{TJ4}#~cjGqy3X6|%?m_$(79Ruc!sC4(u=rT#(aw5e z5wG*nydmP^SaiiuxDew*WAs#{^Uy&Z9-uh%-izaCtaO*3-mlNl#d!!t=y}6M?2#fN zZ@5GklxSonZuZk|Mn;clP%BV^j2^|qtWTJp(*pV>jZh*=e8Eaw?{@%S;xokCnW1_I zcCQNPST+irxyb?EW=J=iz`h@k0+J_8;7!1j+jjZx6 z{;9U9pynj8?i}rWVPR^{mPr02rze(uYguoiSb>Jl0%Ifne>_qo3Pt9#CQkWA z+DgzwvU3JHwG(8WqaYX&0{~6ByCTniFsa;+` zIOFrseh8E5NFK~pwh0ha;wMc8<728ahF1Lzz;Jn;tj>E=Nci^?y-r42A0gS-md3?R6Y zG85~$UVj;)1kGZX3gSIbZ&=q+Io}_0SFjb_$QCA$u9760`|MOCN=XbLr4)nKej~ z-*cy9&#y`YPw;Cu7 zDl0!WATp&o$lPNKeeFu7NG zH=)xf?Ce>G+Inp44kBL|18^RK8iQ>^CiHL)fsko;XM0t;r~zw8J7(}`$X-8E(Y=mN zIZ;QI=5)yM_o%x{G0y$?E@F)Nm4*#5QXcXdFgqTuAkD!BXRNfxQ(t9(=HPlzDtBOk z)@*z)Kdr(}&!qAz1m2V|!H5G$`kL;}jP)An80gL*RZ1^|yjh4Xwl`)u-H;C*|1td- zW_BZh_%0i9pi~?NeeF2>aA_-6d;$F zOg0hc+T}Pmty1LEy9XiWy!L8R>4u0?R;Ps)+3c2m_Q=wOcp4TJ^KHA@?qK87X12!0-TN`sXe5@o} zPNbpx5)_~TamIZ2gJkYT%)M|wfqQolyyEkP3X<}Of$GyR6B#XNG&CeeOp6jNSToeP zCApwCWGaqH*V5tW$P`Aym!p|z$rBPM?$vJ`c?rfl;}23=n5V89C*7gIt;B;dO=l*y zG%s*Y;jqD+$HK)d%vJp^m%}G6FzD~Sp;><89~NO_q(DR?9Wj&xnH{kR8w<4$|HPt* zr}pX744377xQoU}GO&4yUGZow3;WEWpcubjpM1k*`FWPwh*YhsI1ij%u69qsyTF`hB(xfNFo8N>c!k4l1#ha@ky%AG?>tj70 zGeFyuEGvQ0XkdDtl6Ey)4K9+nqdRJowWq5G`0$>DDcMGArmHttz*fSPEb%M$h5sR# zk|ln{eE63I)Qn$o82on!G{Udek*;F+7X`G!&k+{0+h+u#gdZb3W)*?&iNg&1W77kA z;aG&jY)XI^zO~ME%|X#gfoS1~b&+c!{MJB>@RfCm>u&f<0v6*(LaaGv`*cokI9ztW z>oZK?0`a-G^eOg!NIWHU=}cVZI*3Gbz+$=}#O#=Cm=5I3v9jk}Zy~lD@_L1Y&b%93 zuOl`Fu`7i{#MZIuH@RLztOBu52}zx?FS+Uw`}0-(l13gWw` zhG)tEe-|(vh8ab(;lDXDQ3U^#$VBPkj}vZ+OcaAZMz}FNQS5S}e-h0TD140dPo!A_ zpU(f0pf^v)wlmIpKN{uyM=>oZJjS{LVYlxTIJcV1Mq5`Qbj5cel6$1}IfUDMUO~%p zkFah)xY4%~rD+ozZrz0NufC@+11UVzYJbVKxZwwAv9Ms#DmwX)rVMB2dieJM4gd}U zJ_39JI12a)a0<`@xCpoc_zU0zD2A#y9uN;O0E~cafCVrVPz)FgC<9CZ%p9t+bGO5D z2jFhNeEynR{*;J2LJ~Fp8$>kegd2VGy^UJWIzC*83yB^fFwW~pceof zpg0C7*mDQ0^%#eneYJv}XAxfOK159PZHZ)%t#2b->U&j)X6b)e4!rgqw1dW|V zG+EChq6==kdKPZ5UO_m@cRJGCZ&o+LA#Y3My&boP5SG0cS^kjgOxaJ?4Cu4Gmfr(uEi<(?Xf5BM5dVfw^-C_ugd(Y@r_8f11#<_ z?@Pk#tg4v${VZm=H_p7jsjwHRrl5F0$g*a5Pl~u8o#TBEekBu)x@@-~u*Le>K&!a=lXsC|G^!IAb zhmEz7Ts17Nm-lnlp$)9I^(-z89Xe)o+78*-Fsx;f@!oInt)Adkvy9KNIITCv{EP9K zNQFK7zbV)*(l%kD22Ns8|8kF zO1LAkQSS1ng@v^IA^)o$jW9p5{B8AUg?W+Xug()C%#AF6>pgR5`NKB6+M@?ccbF6V zNe_>u75iics#)oY#@ZU*C?VMjmhSLIxlHVG2wUPE9*glPUQEY+xxzIWYyT|7o)Wfz z8?isW>;k|Dz!<`Y)B5;4*bZt<-Tv3IVAPK0BYSyhJml-iI*v-*-eDrmsz@ojen&|(Im zH%K~7j(2e?10~A6!sy__c?%5M)t6xknDTCOFGD^uq227*%W^JoZ@4CB6lzUnwLa^v z0fLZfE`#klqwuQT+T@_BC%d;@Q$U9TZ6T`qUN;%K>*z);t9-cot!wh?k@tI+x5Dib z-bn4}$QqV6(|zQcygc&$2xgHOX`K5l)@3{Oc@@i=;68p$)@Wos#Ig=%eWq@N`@EcW zIVgKVt;m0aAv_+0L|@Ii(cL{3&-gGl_t}n@3h62Dj+AH!`BCC}1C4c<0Ct~_6;Znv zh`&weyWw`)6^sWntyz{BNf9dGW?1v!^9RLMAH&}2MHsysWF9owussD@=wras6xKq2 zSvL4m7(W~@H3bXrc<_$WaqrIc&xJITAOn{^l!Im@7+5T}J)f73e}k9?9h{eN>Q3AE z64Sv&s%EAEL2+wE`kFS_4Te4h(`C84S5=b;H`S}AupPQ{!WHGAigah5EzP+Ko2AEa zMV2rT+T=$){h)A$>9j!;J0fXkSlWG_aM?^&HWOv(8ct=uW9joeW>(h3x_2p(_6bXy z#>(0a&U9NkAPqnT-(ZP053EMpNHOD~((mvwoCGug=w{Of_hn!X={iRkLI+&Jn^ZOe zKk*xQmT@;JhMRC2m_zs#@K*x1HUNW&a02{$;l`*ruCG}9sXo=-4uPrj@(8aVJ!~+v z!Fon(#MjSrTV zcaf=~i!Tl8ueZYX**F5y!120Vnpan_)jLk zzcCE!aO>uw9!%{2nI1foXr^Fzv@}vY@tHn7?V|iKv{&@v>5{IfQkysBg@9CW%Uno| z|6IRi@>v)#_)m6>Xld6q+ACsUa5l`25iQ;LKP1x$$#E^4opHFR{6gQiKN#@+s+g+= z)s8AlyyGUvQ1HNo0HFyBRxr!sX2D4n_0tvwK z1EJtP51sM_;Pi{L8Z3GP#r1LnZHtwp%(GEQ7Zm3V{Ps&=-KNS1VC>o`S)5{>Bt!iVTL5vB3Q~{b{7U>si`K7T`Sp@q?@=QtLFf2a zm@IW}buHnEE_*5Vq|XK{QH=D9w+-JAO@uT~jWJji$@MkM^`&oqDT&B82WVU`$^T|G zzVF*Qb7q4w_qJni;Aq!4BTO*mr3I0)@3XS?zWj+*rC+)RR zLIEU5!(G$vYLo}~SL}h;imRYe z7YkX8l<3_$Q&TssrbiEtD2RcY#Spms1HWfulw87>@>G$UwyTtNI59X4~){xq)p76A$q?#G6N zF{^;)50Jj|Kb*m3D^Oy~#*oj=E>R3R zgjkT6`d&SjRdrE5>%sS41^oizx8LYT48I6d#fO2-OjK+#kg`71>7Nh8D187`rO}en zt1uan{cKRxum>Oebnc^a!gwAktsE|n`&QpS_Kdv1n>BC#JR0ji#Yexz1!Hb-kI)C3 zQPYe~usy)#_Bc9-P0}`)uBA!%qdWX%T=5OCsUiD*QC=CM@9IlWUmItl@YkU|SYRi! z*E*nK$z8oUMgEd`pE7A1tZ-h9X~|t0%d`@j79~~g!P5){_*UL_XWcdbF3xW5YC9t* zdEXGIUy9x*aQ|s8hYI&VHhjPc1k)N+QWAKnjc6bQ^zva;+-!J z6u+vmNNd>SzCWzkf?g6{&^%0Hn%wll?z(0|#~%=1JPL(oZn>XV{OqXyb~~04C_P^S zt-LW(l3QawZ?#~tZ^1^YF`u(uu|!K`HbY}>vHk`Bappg3^}+u`s3JpSK4T5R|4nF1 zca6D$`M*G(Xp6>tiiJKzC?25`Ec6aSDG2?_LiOIC6DcY13yjvLVPPJ=l~JocTwA0qx08qXr~Mg8|!MlQ-r17g%!TD^6LT-j#>4q{~b+;ijDa9*P!cJ)QDJW@T+ zLnbrd@e6Wqfpr0cV2$M7;~CSLI}W+su%639h0|{2zO!(NV<76jE&u8`#|W%qz`=O- zfi<$D`YtHYzzW;Felm`YT z<2G)&9=C1m&R^jxI12a?a2#+Na2C)8xCFQga03DWCCWqrVgLz%u7Gra5zrfu1K5g- zvV?kRr@v4h-rbj??1O-n!$D7f8Xh_ltb@A=unhiJ;C>BvC*0}7#ruE677`U1cpd|P zBYW0U!KoOW$8h6X;&=~(DLZzu=l$JX-}$_Wc;3nEc|Q+MH7D1nJ@TxOykk1|5^~=3 z2vBNnPIxggaei_ugoU$D7*fFukW#P2r*6O$srP+~k=FKP^TcR~Muj|-Qe2V0WwYaX z)|J|zc*9S6W0DJ|D`O(hi9ZJhs4VWB{BO7T>`(f>J=<`S5V%dm zuTzucya-xI$M%?16D>^_fBi{+eedysD9&QGKnb&P^_vyZU}wc8fV;2al6;@X$j&`_ z9NG(i)(cZF!&(#7ALCZkDa@N4iXogp8=+p>?;Quzfb^}r0%Jr*Oz6araeEq8>Y$rK z?W~*U0%_YRj~~`c73h2wi~TJizVS1bK`?c?#p6Hg2gY0^%QCe_Y%M3a z%2F@OwJfba(x|MNl{F#N#8RJRsXaqIZJF!ZD|#Tcz5?Q$RB$;^c!f5>|^$*;Ko^CHSi7rlS0QRJl!VByEdQ^iYbeE+0q z|F^uCG=iOIfw+tO><7BqG+;EvX5&+2YAs3Q4{=!rWmO5zuu9nU%ID(88FA`VN@sBD zq_}(WAXy00?nmzCkPbIVrSv4iO6fIxqE(i2@&f_;!9iFTX;4TSnvRI{v*2d@%pQG; zIRz)JXla=^;*>sh~b3EzD1?egRku5$|~-r$12AW!oAgvZ4vjW1{@ z)D}1DGsZz@P-i`Sq@G`3t(7hw;ad1eEk`1?m^?b9Q5`X!a1UzW-{2NkHtHW7azXyg zEmZMrw$Q!cg#g_PF3KhDs#0Eh3pI!22|@Zl9H1M)aO~2UFGJ1%36T~kwc*T-+Fr)G zLOovNE@8KeJ0i6tuv#9&7Mfpucf)TOn@)?It1pC3-Ua-h1FSt4QD=tm0O`ooR?;}$JrZ5(jF5QjB?qwC%CC4ih|Sf zvY^7!B**&bWs+j)i}I^(E=zq>WhySB&=zk`rf~YAT=yUG>%8=G!zG^mkCex~&}NX3 z0|SFi5I{dCtDqwItbT;Dw^p2fR-c-k!}Y8-r~Lg~ zdNTSewx88!Yc9xscvGA8+4>8RgIr+$z^o0whppeK4#f0cfzA7$n*7wHR zdmuzMJFgnLIxT3g2>AMVpv;>bFR?a1ixlsQ;#I8pZ_L`~RRiyI0RK&8jKYBHmCl}p z3Nyad^@UtcEnm}5?7#j3uwOLguNtDE!bEV4Lf$G?|Fgi9(-VpINcGXEekiMccaRo^ ztKdnd>ZynkW~r{NTob8$T8I{ut5C|c1v!g^`_bXqj*xtZPiv-OqEo?Z0UD;2!KJoa z24961ChA7G3v=;^)mA(8VoIbFu_z$>sKBBitv6SpdWAYMTj=l1FP!U8ItLUgoU`(k zX3m*YTL^B;e&Pj?@cw11uwDi8^A@3>OK{9Z7y9~Orx{&{LydQ`E|dhfuo}Bzlm#er z2~!!0#Gb8sy*(+?fo{ltfOQ}zxXL`ac0%0VX$<=ZbijG?^vSmi6O9)DumJq zeeWu6J)+Bgx;kah{6X#-U;Yk$`L;?&Z~H}Vy07Phh!ev z9Q@?ES1WQ>_v^Gc$V(wl*y7-A5sQO4^-<=m+AcM@c<$n0j!TlYp<8xl?jlm9UOE~e zdxM#_oLyH92FB(5GZcO~Tep``H0}Zxx>?IX&D2KzBeUU=W}$koARd$x@~j?nH{mE;|iwC15^aG2q{T z6@VuIE0MkiE_KXY|9q*TPi1MqZhOsf*^!m6`AYNQtkSG{bM0ho_%PZQARhFb+IaNz zfj~b<>lS#gBJWk)7$%{kx1f?s<@==wgzfl*&+%|pcgauV;$UltbmpwnQ_R^j2Ab&C#>%T!uSv!jIRbQz-GSz3* zW^bgPrU$5>3#!slvO6nz+(XOrRdEff#7F+Cmv*wNh72b$o)M@KmoOn?mS^?`n2MPOVaeMM7s%O%k`( zZ~^K}AHhNMs-cH-8FIdaoM9<})e)Zg+aulRfx309p;7~yW)e{BC9IPG|(j2ya8=5NYj4R%5OEyV3@$%ROTI7EPADr~SvZ2e~iYP%! z<8T*V20=_HLTZ((LOtuaKK-1@b&HImu3bMoE=LsR#Mj+bF?&vG-D?%%_;$V7u9I?o zAQPJx<(s%tTWN4q=a3qfu z4~6o`WZ|E3e~ej+{Ba7^Y!$>w4UDFQ1^IKT=Zf4yJvCg;3)xMi-12$fn z`g@rL;^+g`T$u_zBxRO0EwaE~Q@i{*%EzL7l5ZR@d>L7tcEPD)nCBUu48G}u~I24 zGX)R2B{fnW@pT>%9!mC(;SD}V~1^ip# zKMDU8_&2EPk^h4QZi->6Z|IlSLpCc;jY3Qcp8w0_)3K5V6I&Avojv+ z(Tq2J^jHN*tgZ56ffAfFTV=0%B-|GHUO%le#52A(M26Da!dGXceStn zcl(xz+Vb-t$Iz|(dYfeac&c>Z)S@kYIN`ZHx}7gNei&Nvin<~d+eaH9@{TWACd zY{284oBG#2M|z_?$4{gi&N#r@0LIZq&^!9s)T`SJ3L<}x9EfFjc0l($jPLYr!og1= zXg01JS#;FAteZX4lEWS4GB=M*fboz9d5c?HZ*cqz8-^BwklpgXcVyVK5P^(>LDLIz zWk6li2xA>|;v+#(D)Bfgkq_f^s@g62+8sAJ8s%o6w!Vhd@x3GFn)1bgEQnj4mX~`K zgESfW+`FxI9ZrL#r13Zt9Og#FIIT!S#8pBY? zwqB60_hhk-*i)A)>TD&coW_RUfC+-M0bko0>WKS5G^eggofyTvIL%O%u>2Gh@ev}0 zDpzAg6Ih>4I*i1%_8?ST|2YxrHJl3*9V0H}&Y|Aarwwo%K_J zK2c>?-EQ_8XauMe97cnDVZ>3C$Ir%Kpj1;28b)`=<^NMV<0I;`rF1T2Zp%krk@Sl1kM>8f#KX!@#5>)xBz)s)E=) zna0qAB+*9P8XZ3gWsQ?ewhyO$W_Waug&Uivmtx(VvB^G7C2pF3VtzYRuqx{|jqG(a zciFhyp1-K-TBnv|K#hvC9NY@Dwlo< zx2;0;fpo=_dpN2VJMZ?NnJqvPMeU%RnAnqqNGDmYgARLmy)5U zNC%E5!guMVKp@$sb~R0%!$gqNxF~67B%c(Zd>4cB?Ti?o8mW2{tNKh3AID5u^_u-* zay5~vKS8gFTuo0v*769q_V^wyTk~7IO_BE@D2cCx3=MJE0!I4Q3moW+&E;X*>G@zQ zTmI*lwnOl&s#GWK4Qg#fwQ85`uQMCAR5_slx|z@bDyLsqhxN27pi_@-U{ZgV>6J?4w=!&v&k9oROQLB4x*^J6kU5TQ08RSk{T7?M; z7_Kry>`x(`^>QZDxI*A>v}-kMqC|x>opEz0zy?7Sa)soJxZQjP5JeP{3iMJ1Ofu7o zK+l{TQq`TAn#9e?&sb*nVq00WYHG6CoZzqp4I(z7~OtDMQKb<*f`3_DF8 zhUPTVp0KICj`<21F)lBZ*w zOr=)48t-Thbj)bDQJCd=={Aq1PO*AH26wDG2h&Icxnsb2KwG?GV_llksamUSn4Ye3 zD%TIQwHj2=#gcWjfHgeKTOshfmynu?!6&%=xW`IvtSV{4Qnw z2`(%kt*oNtHSch*wW4j3Z^)&0nP~}W2pA@P- zn1Lfe`~iIxhi@iY%y#SZ&5J$p`0TZimU<<1c*Xk_3aoLuqg-FrQKI_mr7LdnAvX*` znXexB$ibPFD>!f%jKu#V5a51zg~A+OXH}5;Uu$rdCGAn2c zLGik(f)pI%sp`Tw+zfcriWdqC2`0+_{; zw$7doA(BT!G3EkJQ+LUlc25zO@?FSs!8#Q_7kusD&!E(9jj*hjl$}|3ms~qe|5d%SJw0s{$E(rkNSURO|L+0(B_TCYb+V-x})W> z_E3yaz~$a^lyUhlMuub7LuhUhd`GOmz&FqTjSYI*Z!hHjfE3sWG})guoQqXQ2NTjt zp=xk$wE>rZo$yKIGCaZmF>Bb0)MXh;vx)2J3|TDoB#YGrT&Xcaf+hE!cR}`t=)rYp zD%1j#OS0`Qa?SZZ6>72JbV5lez0q1Zh2(~mC z68!b7;aJq86y{r~X%lPOh^D^-yK9W_Z#4ZPYr*R)u)~7y78dvee6!mvo0&#P#@fp&pM`IlB^wEo0=%X>I zVjY|7dm3X>$HwFs>zEPT_+i|{ z8)jNVxQ*5@{}lKa_(;oGCF{r>-)*cTFC&IJLXGFJ#``d_*MK2dPTCXVA^8+;*yfwU z8Xn^-XCqSLbD=CvL24X?(G7V2`d}iO-^rS^p~*boKIXT=pX(!@*O9FG-VoNNiTD9x zsCgQJb}x0}91sIKsTo2U;So4w4j2*@3xHD^#%6`iHZ-fEcV` zMX_K_gloBn<1QlZcgX6FMR*v1&S}Pp9B02}3{({%VhmskU@zb;EN8ReE&;3rtOvXT zAjacMP_F(n{HFl5DBBFz1K<`bx#MW$0yU2KZh)y*v>2CL+34KjJ&tbED~iV}QV8Dg zE3(TEcs*=z?(@3YJ6hsBiHsfZC}&+RmWiQkgc=aCz8C!Y$IH`w;#3n3_YrK(g_dEkzcUc z=%gP#k7JIUU|$KT2I*x-A3kSYaC<&uU4Sh=VF1|DPjpU_{+J_gLs~EQo+nv@B#+tX zd4~D1hRG*9tKol#HU6Wg-Zm7CzZq$K6Ki&(XC3r8P_vv_m+vj#Yun3mzwfcv3VX(% zU>}6Rte0+fKQEZEv-%8%fvUr*k2gg^un~sP=13@ug=oL^87zaeUu!?6bBWKOc5b$* zH~9=vxaew~J)u{I%hc9cb`Emt>d5G*(y0Zf0*)0<1$a;_wfP&`?Q*O)s;+!+{m8as z&)MR8lTvsCXb4&Py+3}P$A1l~GkEv=_Rers;=Dd6`n2+Hc=*coaYI_tqM0C!4 zS1R-ib$5j1TRab2hq;F0Wli=d1c$ZQRRp5Ic#P;n*0HWJ@Rvf6=t1iw*F^Y>AV_4t z-+Hra3If9*Nwmy5(=`MBL69W6*E+{F8~*-~BwA`+=vn}OmPZGEth-%{;WtB;sM`8( z*E0AsJR6O?kXdni#VZv>oZT5EsbFkV!wnu18e&9Tekb7pdxt+vcyNRX5B6i0U1Xyp z6^vVVRcY!?{1kLSYm?^pSci3qkK>uE;%N%S##QbBh%n- zfrSJ8>hrMbMAPgg2$JMFR%3Sn9>V;NG2i(I_L12YoI<&_=P<%UTWXWI0)uj(onPH9 zPwjfiJ-oB(XjH9aRo@3unOsEA(a>ZdR=3y+NU?8y?c?wN$8sy|?qi(;*9DnxWSKt;(ZCf5M$E5_)YId7v4jqL1=dWptH^d)Y*sC`FyB| zUT|T5ytGS>eJtlkA^UOGTT88g>5z!b2`uwtq1Uj07`P;7P(Byh#r(L}{Fz_t|17Eno7g)|GA#(Kh=yY9u-Y);jGEWTsfv>(7 zq>VP%S{yz@rUT!5t%2+2JTGSj*4p|bF3R~hIOG;O-p8706rN?2lAv4}A`*|KHVSJ) z9j0iMloeWK%NLs}Rx!fI;~;#v4b9NK1{MH(wkyY$EK@MDM;iCYGW(%r`-?bjQi-9Y z1r``I8y~W9ncgyO-B^4yy1LmF`nqi}2GIm#5P$0oiu;Elhz^}W$nt0Z zW_PQ*vqG2?Rks^d6D>3?VDmMP1+ApMLgTco)BwD@d))t+pW>2S@BV3|Z4Gzw5q*l?dbWZ?@@%cnnu%172dY zyvuzPOPkDUn+%Dgt8z3;+2WqWQYMA5_!C)D5HF%xcDl<1jZ+QA@cf<5k$sPjg(5Z@ z%rUmUd4z7iDxYWh>~3`(XWHa2;J&pLEMYq`(!n!QS7mlAC|&#HD~?%?c=H)Ye(kI( zbxq9}HLil~(Blp3A9Z`4&K-geW&N{ z8+mST89jBeyMVLr`RibpJ`hdBXKDipMZhO}7XBBoUJ&kX5uoG#mW{OGxW^HvKVdmO z0T3tOR-;|X?M+j1hAtdegiLe+JSKqNg17>#1ET6zL5Q@;L7$zt=GtVQnTKeDiFI(zfrSLZ4?fz{TMYlSbx!tf-nU-o=wrRbmwV(Ea z4t_iudcs_WAQ55Yw2~FmHq3qZ_e()~3qBL^W}aUS9+zz%@jTDx6tu|WVE`L?QBb%w zq~t#CmYBM*n9RMkLXA`P!M`gAH<8N4gPJwYEsl@ojj&^#6y4uS zOs1}AJ_D%`T>YZccP{LE&n@a=cyoNK{5A+0A^FabaX~9SZgE%)KT6juUxq^Ava#Z0 zF??obvs?gd@S#$N?Qc{qjF&G^jy;4a^e{`4CWzm~@MH0GABMypvHU9f0M6qM1J+Scj34H_i~@_?KRGYOI}`aH<`qCN zX{D~1G99R%`jIeP+E>F+JyDV(Ans1&hjb^&M~!qo#5H7bQK^=SH!HY)s-tG;sELxE z6BS8(YSwq2UR64)7DwLYFgKyyZUmo}%dZ8Z`DJjZMM*EZV_^QGXMs2}iSIk8O}-_- z2^G_3-&iwJaTGS!@D7M9#+lkcvN3XP5&u&7Iny3Xn|zmBd@+gdg<<*LBOXp-^D#Xj zo=@V3_h^+r_P>PN&0oN!UzOMUo8{R)b>B(97`c=3kf1m!nJ-f}%gH{mCYc`=b5*{_ zukNcj+6vo%;;Cf5>$svDubq!-F3P5=m;oNq`Ph^-wo#UCv$PWAKOh1~N(|!<>cAS^ zK`ID;sH7EK1BpiQ(oB6u{y8w>{9W=XR&om~IraZia;x}E3ctK7A2b>@(k(Ew1U)~s zb+C`pCRal_d{@55R6-Qm4{kvP9ls^8TA_x@U>!^iMM({TJt*4`W%&t;jk%!M|1S3r z&M(CP;#RR2EPW8rVZ)rwh466h;1Ya_Tgt=@UGb4!k$(?~Uw7rR^lkEZzuu*lJ`@98 z`4X~$j6xUXuR`4rSrd%M|N0z1r zGMMb#56@eGgMccmu%Mo`5ujU6c#i z6X@6zXxI}dBTo&W^aQ_x)0>{)j{orl>8P_wZoniCKLO1WJV7_^ zBX~Xsd>wg$1U$jk0`V^c-?z_0{+)PhU->iezEvAFSU^7w#x+1qA+(Aq@$uZr(%%)W zseExVL>B_|8nvJcS(w^(yuQt;d=J>N+5=`1T7UcEQ-x>>xSaoxH^UrDDwdbC@>2oP zo67e$*dPKMHX!l4JRxF00xJ3Zq+BY~&;*q5e=3t}90n@?Q1PKOz6aKVO=o*`Q(2-Cu;7Pxjn0+Ab*$aJYyRQCjUm;3`>2*Sr~iB;+kNO0H<1(deUYvwO5?9 zRj|}Dmilr~EKTQ!WgfOo9y$AVq5JW9I+piyTinq0iqCB;SzaT{drwe&C7mB`KVVDP zom7#;Ei+FZne04XnKo;$EeGxH1vmd$9N($cQ9*&*1I4OY!d(t<4(X1eX_J2gKWn>uxA&Hb7F?!o4-$c&9)2k1S zk|94a$@Vokfa@!O6M_TVX@z^qGNm*TYAPUf{&z!)1+FUYIilsXfsqglDpwhOG> z1^E${QWh}Txnd;UgF;2%WeOL&hb4|gvEfMj6={W?Y4cdxAnZUv7{HAJ6SlslO+E>Q zsMN81)-Va>HyZr%G>l)9+#}GRrS)fNkFvB2V56qA_<)@%qUDcty&VfJtl~{l+DZ9! ze6f7Z?7TLZv?y+n@CjxaRNRf2*Cs3?m2ivUE<@a6_$%T60{#{7uYms;^8W-l0cZd; z1A5`8Mhnr6_>3EoXK@Km(}mz_I%Y+sL-D~Bp;EXBa4X>!Bf|=chr1PSclH$B*;CZA zr#K7DX`Rq@Bc68ZnX+!+Wa_%6acUM+({x+Y1Oi4EAfJ+9Mx(tV0rPx!q|DFWJ=c`6 z|7W2m{4Jop8DaSbYPo_jpez#z7G4j989U@;3j z7AATgOl+K!GqCT`P8DAN^Y9P~yq?7veiPh|pZK7W?_tMrF4!L(ekgEO9t1wQ1}u%$ zZaN&0W#|W>+md`_{*;jUB$#8395>F%Ps8_-U>rA{`_*!$ECe3+6Ts0wilfLmnYeXU z3u#EZCz5sqX>?>cCubpT53K*}^a{7)p%WRcX{Y6^ya);LSjJ}G4t)*q$6@&sW}lTS z;Gco?8E~8Aw^0$DifL}ryrTKlp`4QDBF#EW1%W zEb!+I7ej8KC&K4@%K@^LtXSKM`>yzPFTNMf=09O!RMtKSWizevQU8YCd@^{g#>2-?JEMBCxUV;F zE^Wrcs-^pb|9z6wNIbwPrzPqAc9NLHfAZoe?Hj<>V zVyF*4)11u$U4zL&wKGHy&QV;+T;dL4Dx&my_;ZP!kH>In=e#D zj@~1V&*szSti)$R9ohrU2^#5{z_uz=cP>`}35^VF|5|C0TW#KdTa@|NZV5$S8d3); zU0=p)q-i1Lb{$fm@ho1Ize=x8Ey>|@^#!>5uJlkn^Pz-N1FAH!NZr3qJesQHxRd^za{0IT!q)CFg=J* zW;T*rp_{l`-1?$EMJ&zb4L#1uV-U-k&dDVn5}SlNZFXFxiJ9gVAI!x`rWv9p;)}U_ zf&Bzdli;m@!icI;wG{111^Wt=GlyXC2+zJSpfVY`6Hv&VY&{|W?zIRpF0C21``j@* zwA&M1m*vCmf#^#j^2P>9vPL7_7@$ypKfSPA+*~vu(Ndkg@$DE$1p^fPk|_)_i2<^F z_$T2ew||djO{<)PTY9V9)6ehH)oZ`der!Uetq|=JAMVSKkKN-1nOgb{`Uh=mlG%K~e~h5h&evEx|D`&h}P;;a4m8wV6ddOQy-qehow zTnN`pBeZfPyDky35IrBpvR?2=vAO z25+&ILK_2_+bO);N1><0e-GeIvEx|NWT;#t;SmP#+4dEap{5Y<3e@vH1$Q-IJ;32X z#MQgBMW$lap|pQ%Z@&rmotD!vn=$aDuw*0hyob0=aHqk25$*xN2Y_RMCV&hG0<=hv z19S!S1oQ(G0Vdr9BfJd|Lfb)r3w|E_9Vg_zkh5B` zFAc9&CA|@}`ZVY@=wj`D0lo+tJx%xM^;mx5_KGI0-rv~chqXe-c2-y?UN zD_tXn*ifJJq@n1q9;)CcyaZ$r+bkHfwK&#jqz~B0y(f0d!DQmtjrbTLSoR!|oJ;+TJZ}n2>A=df>to3Ccs_h<6-0oz| zU^1%`Q%^dCl^Yb;;`M%=_(2}8>7tbe;f|(}Dp_Z56Ti>n3%giQE0vzXY8@(eAIO`! zxN+*l*W>BCn;JBU69)46Lw?4^L?fx$V<|lO?5al})gBD-n*e&Z^v*v4dbjw7_a!K0jO;6%x&Z_`V|{4-isfg~XZIsfEk$)Hqw^-fq=upkD;}widb7 zpTFu=hu~OPn*LOSV>Xz53{@>)m?Ar6$6=#cTs?@dK+PLM;va+fiCHZWzKW}TWEEk5 z&&l`sNs-W;D#gIpTa_CX`H5A^wQsayul___Fqj{x9O@T04+gfW4dyn*cLwvr^}u~W zC9s;dn8AEEAg`QWF>MH+R(eKW8WK45#xI!GFU>|Zw0G;tq^TM7s`4O*p{}BFGba!1){ACE=AI;hP@o4Ul*yTEYbm0L^s;+ez zmMG``N)n{&wp}CDd%M>ynXRo;nRT_%PE`$G-wI7VJZ|N0;6|*L9>I-REjh&JuH#eq zGh`&hb%tc*cVEZ%P&dgAk9hPtKC>$!8TlHL23EnOq5{(9tyoyam;%1P-RqA#!q=RY zGktVH_%tucISS|eco#%f)}4`O2U~d5U}MG!+K=L#T8r zu+2fq0$WG9F~P*TGj}%Ko>Z5()_hmIOPH6mwh=;gV8gM!gq#C9a$4kpxbh`#+{uPE zX=5UWHXcKpv<7^|p(l+Fe61e;lV&Zq7UyAHx5c&seyIHoT$RIDbt69fUw{Pq9y9JI zz%Ng}sy_}lYobeEITHwSybFoKmo`I~KaEpNQF3b#cdQ&pc(`le9)o)dc{+ZC7}7Hy z_m?b<@>|%-3M@gn95>=DgdHJcEY~PMgJ?SYapmIfp?u$dXQ3gZNfvP~^x!~tM&_}p z(9x_#4gmFSso}d?wDy&w6@ZgA$HEuo4Z$L?pdA?w=UP-(ZO7KhK0}X>`P>FljH> zNSCmwlB~B{YV-dS}3yQ~g84G_mjoz7G^Byd3Hcm4s?oJ6CW$;P&%dwv*cyP;kBA_V$~t!7r&7xwKOmr}~Z zi9k zhfK?KILE#ooH0S?g5`DTIrJ+I)x7JgtV%}8Yr*6laod$H*h38^BmOxrr9SP|;r|J7 z`3Sxn^k^$^lu%2xzGP%ngYZG2yIID&ysCzg(14C`VB3RSZnvYRC*x49Gnj*;8&wq- zDSdyW^bM@^O{{boO6RlEHwCs<<=JX+j?QCYTcBG5C#cMEE~Q=iv$L{uSf{D+@Ci!>7pl{?OgOu?gO;qv%iG*u?&6*C*n1b!GLW+Tn1a@ZXTt1 zTV#XUb{qei#@QnO<_T|5Ew?qxF9d~E?>h?F2IY1<;81nJ4%LhWKD7to4cOM)KuZ zXJGz@!aw6=3G-Mx5}ls{JD1}81h_lk@tA$(M)?b`7+=DVN9nOF_a?7+dkKGo{Tbl6 z4A^3n*kbhSX_HCau9hD5_rxX>vrA>p<#-q@T2#?0e}N-R;_i0&X-_J~Y#NRYYOv{m z?U|&dleiTS0XJG9}JT!_Q67xJ*1G715yr)l8j^-`-?|ZB6F+%CzN5I*+?rFbA zXO7>FPi(MSS{#f!lDIRbhTqjB*ZFne>qB=%wKP|pJDTq;G|EqSh_lZ#RfC-_-%Hzw zQWAqtnmN;2PK#%mFYX!*{PHBQWtuP@EK?x$RtuU z$Hf7rBJ4mt+?KyWgbSd}rV{ntI8Vv>C@+4}f!K^kq3Z48KIIxHiV^QB<*x|Ma%M1& zP7slw1w6e6_DrZ!bMHZ~A+0Gli;s-q`{PSdPLFr*u~so365 z!liBQ7r2e`V3eXIj7F#fv%#<$N`p$gYb<{s=!CNaOAZ>Rym@IXFwN>;p`u-kAII;3 zZ?o^sPsZ`%C{p%{iR1ZY@V)I7pB>M?(sh^bpW9nAguujc6L@1>vs~-$iQQy4`kR4! z&IH^VPs+i6s4G!PqkVr9%~aB*h`JJ$)b{_OuB7PZ@H^=k_P_V82JmtlxdwS6{^JkU z&^zTgalk}AH~x(LWe5Y0P0fKJ`pP3Nn8;_vG(eCvJWLH!#LW}=+r~5o>Nud%a!pzuOy+e;oRlayi-|N+$6Wt`~#X z?wTrT5*UoH-8EG(anZ4Bw#bfP3@U-bOYE8|sZu;Li9cX!mJi~bItZ$;yEq5g^d^TT z&Ka`~sy?x)HOL{Kg(=ciH_G~e_>x}$1!8})VCnlti;!SILnoBK&H_>)piwe*^3x{=TB^&(nNV(V@LhLeW$%7gec z?p1OYyoUHsmE8E7#XE204LI32VLFqx!@Mfm4%Y>TP13oB;uts&n?oEP&FNjtw!`Px zc9`b6AbTOkOINm=k%R764|}gvWuh#IN82-ZD3PNrkV)ydC#j^HaC1^Y0ckS+CwQpF zaX`JOq%oeoRmK>$u^F+?AVN%-%%@bHg;pghUFOZ)PSMGJ3T3mpGNA-@+dq&zDu{$A zalckUqiN+TfgyPolxEfwayygtBN{uAO451yVMJ&j3hzPUvy*v0mc|6=xVnk&rMw{| zzJ3#*Gx99B{{OiTHOn(27p0cl&dNOl|JaAH4V{&fG3PWjzsOQhG?wGjJ1c*LMYo(E zmvvTd>bxkm$S-$Zly-IQK(FDV6#uChH-)z-s>Bgf_(~MlhTeQ>3cp36w0!zz=`Flb zfw**^xL_*Zt4NZ&`L8{Ya-1LHDRt2PBgrF~DdXw`S}wUtJGQx7E~E~8@@Y4jE_7JT zAiGQpiQi1+M*=f6@gKTzmD2iabmOX|8zQ=KmD14v58b%c|Kl5fdJk~l(hit;3Ddj} zMrhvWWXJU$+?l22K#42CY!W7V|8tQbhKxoz-O~tJJcXcwfnG9ic}8CA5x<_s-vC`- z3Xd3fE59zQL4Fyl!fDwH(vGIi%q2PxVy|whIB1({*;dgYZ(ynILGkdd{A7CrbcRuG zaGG+x9gh6DY%f(qx7pc1J}2czIm?8(xC|$P=L`y!pggIV(YYLvSUptmJ?_ir)+3e& zO)Q+3N9-uXdJr4!bVXvL5v%Zt*decilQmw5d+hRN8A(8Eq1dl5!wNWaqRg#8iYyzr?zVWi>g}NYi~$!4JsEegBt7sub4E$O(8D~ zDu{%FV3}QHKol?BE6vJbw2PXz(R6vKqtw$${p%zdO{cOS9-lf{o%1u5sdyB~(o_A_ zV9#j)aroc0XU4fWM4qRAKhL+3j?*5pe=vG~5?NF*#MpwB zpO|Sr5V|L9R~ABFD#*%uO~y#-j=vu$Z^<1-Pn7R4-`Is)@o-1w-fyitL0~$f8-P9f z(?Fs}Mjs|e*d4!b`Fm}0f4tHG#fB)Wk3b` zEX?(oQ~^}N-f+UwL;6o8henSfQf&Zfgu4;${K3U#xVKE$<&QtxIn1>U#jRxmhJBo~ z%0JLCh>S-# z)^W?bKgvs84|eL>?1z6_tZO^D?zKYQp6=|9jzF`;e#=-3Hs{;B&)-;c@W=Q>FSlvF zliM^c7!Q)jZnSB>v8KUOi?1K87vN@rsYBtZfq4S@8+;z%hX%J;@9JWUbaYI_MeA4B$+!XL zU-|`}{tgFawO~Iz87DUJuT357Pdb_|wcw&|E&!fOVd%04k`N5WV@Q6N@Lw0L={DwH zNMrpkTCdw!QX!q<--2c!d$f?Q9Zv4`77@q3Xnnkg(IR?LzZ(9DfDnKmpdTO_FcFXo zm1HX*p*mh4=fE*w>s zv|#UKzldRDabdfLytroX@>22VVKL+`B2GSwbGKrMRG=%k3+wbWE-JF!R8 z%*n6`mV?ZQz+%8P_U2MLWxPeE@OLya(NM$yGv8185q=_qEwm}1(q zjII?YU1y;sG->h~Ofg;#uP$lJ{a867^NjUWH$NQV2W4de*^Mm}2Zm-U*Ic@Mzr>t{Y{ha~mOi0dj1nP?9_vNh*n+W@SWpF~8`34Ptp*eTo_P)< z`e^sLKlT}^@dbgXqW+4kSwYn^TQP0Kb+sY=30woX22fESoQ-@aA>(LMGw!e!RO3p{ zV`iGa!!d$Bp#Uvi^+l@!IXDU?2Ap@Uph=iAiRogWt)PF#*N`su=t{Z=DzLGe1+T)- zt;M>wo87UBjvUx*eW^#xQi6)@MEmpXo>la-{=asQ$KoNua+OUerFZF{z__b`LlFn5 zgsAbU!59xZ*%5q%!mV8PdFq;wV7}si1ov3u5Jj?=9#N_hzK4f+6gNQ&mg;L{?=T3( zd!Vk_`m0wjN3cwF>*WZR%RO=7@<^TFqnpEQrF3NI8S9l!VTxL#s=#Jc)fwxePIgBb zT>|&lJlrEY*-K^gg9o2QOOflw@oUi~L5IU{>pw`14MVuH4I0F!+;G1JPGaF|U3EQj zG*&v}>&0uT5_R>gY6?jM$TQbjp$0AamN5OlBjD24UxNau@^S(dEnGezN5s zoeKr~9(|5{_{MheFcZ2s#<;FDyhnHO7@{y3Cs-o8)EO{Fc5!~fF}x>OhGKY6z`znu zNic@@1j_*Qgaixa-6l%_M)Cw)#H#*?*yvv%e2RJkT;sRtuJ0Xut}V9XPdIuxw?IRMPtf ziI(Xd?}YOazVvX>lFKesQk5iH#-dQ!WK zS|v4Ge~=f$5-c~s3FkK!({g*W_4XdqUtr2O)V{sgHZgS*xKsom<^QY#jkc0Nqk2Z%Wznub1skpq0Nq$lY%v1TFr=t;T= zrYUM2y)5`QTjzALpc=Yy%z5iK9pg#S6Vem=Qn91WdV$;4N^9*lJ{DbZ;^T$v-5Rgl=E1@F#uh}eHa0?$`X7Z zDmg$as7WxLkENa+i@!TCDn8TiaC|nwC7^*(ahU?@j;kzdJsmByu*&sx*KiBx!VUjI z4i!_YQCZ%{A~w)zV(M!4&<4z3!Q8ol&KA1Z`3>~W1tMlVm5zV9GfJL4iU|LvkTv+b zTiVbr4)h9vb0}hjCSv);k-dQ>3bfkxrith1Y+^aarawhTjEzBl%S$`-6+2z&!THrC zf$_oh`|-mJ#`>*DW_XIKRL^wtI5s*0rj}s+^l<;#{guWv@pC1(C}Ss|qKk!RSoG6a z3$w+P@ig@lg?Cxjv-Cr8*e+A(Mw%`RUcAd5(ImNbG5|mA&}(efCYmE=?qVNo!V==M zIE0N|+(g&nYkwDeU^5*lZrx>CyBX_7G#%(`4kCle?SxDeo2pA*NE5#hq|`Lp8ecM= z3=iiyb~`Td5X?ftk63-v!HiG#4;vOphGIp;S*sbhC;AaSsMv!w-4*P>b2R*pZ?C~_ z9yfvy)OFO)D#0#O#Bmk_v@ux9`*a#PC!$ZJF6rU7Hncv6j&ln$Y@sUubsagMv!pF_ zPROf{irn6w!_Glw+(N@dc>j3|jS`NtQ(I_c_@|DvSJV#x;Sj{yZ%za_VNBRc!{%Og zc=JpSuD9XBYxnH7;odt>`vo`qptqFK$Lq-(-Ad`Rap3(*2P@o4qe4z}HKg+~O#X11 z^=$W68a@76XEa%nzBc}R;Cb@J@E6mAqE|+BDzO&K@)N3<()1{@QmsLrUSVzEObmXW z{koN=3GcDwZS>^u(^gAYzXQV5{mQV%Br>4_2TbF%fzx1+4c$(U27P7SgBB5Y3BrGQ zJKC9FVF4ry+Ci1@TjKC*?qup6G!8Da94_y5va%g?1wD;@+C+64BU|k29W-X}X&eaF zZ{*c0H1o7IOZNFwCzFgcM|tYa^~xRC3gWlsIVh{3?znMAPKL*oa>MB^ z#Z=aC`ytzW12>)SHRle>_@rWTvb(zzKXp@8nVWklIrQ46PjUyz@cKG850a{jk{NO` zb|Zo>KadHKX9iZdhj-#1TCiR3?(R$wXN*;r3L{xgrQnaHMc{qcSvhFy#Zfif?u;UJ z;kQZL&RJkWfFeOg3Fc1DSjq9}m0n&sx4+$=huHDgxBGi}?J)mOIQOb}==*S&m&`-( z)XNWYuVW{#$flDA^^Y;~$w^JscVx2MU~!Z*Hg>vdDi7*>BDseB{5X-#)&Nt(ZYl^A zw$=c6MEaRN-9v{82`&fJGO~w^)|7_U2fi#0GkAvGuI45eR2chsHw{Vgi4H!Iz|K^kME_g1SPir4H7Q{thZ*t@LTU}zg9gyRor4xo3D5yl zrUkFiyujqTPq3d2;EP7vX%`IvVRBnRgPWWNYkQpz%WLPKh|(8&-DfUz9z6%nf{YH+ z{h8kH{&`DFpA68Kr*a7m(fA_R_yQL8`bd*ZkeUBNM>O~IPUb4cD4Ka>L)b@g!+vJLv zvn{jk6d`MTgGTCo398S`N6NjQcDSkB(qHQ)J;ChBM%&joxX>;=EWKu$zt{y}>?IX~ zoA_={Mdce1fTkBz^O6DG;4(a5mAuw}c z>R4@WXqqowjMh0+LMl$7e6K_X8h?V4`;et(pg?p0&T1{h;H0PLAHPLV2Y+7#>yYjc2f;cwg11Od{)x(I zHiMWj$j+hp775lO)!vT|608Nt)dzlF&J=qxi1@ul*jtJXV6e`SVxt#>bc2%69u;sLv4J9Nun(NAE21-*R&MFyJeF<7?p8J39WN%E`dg^@44Hd#~6g;eV-r zzo2k*rXifgT>PwUj6$g&0VKd5B_53$cbNis2I@f9xAMAl_dzXkkC*@6l(+6q$jd=c z`#T7F&@YLs}ef}_vAZT_lsOg)aCp|Xn z-!xhu5-$)9;E&44T+pig{q(T+t&fZ}q~q=&02i7uu5Zogi=HYGRRw_46HZO=tS8Nr zf1@lgv}=@8XQ5IAaP-DoWXG7mF8@luPBs9~46w7{#Q|9BwKOsnIM72FI)^}NZ;=CE zKQ=Q`6XKv(_dDoK?@hw3t`3b{kv5FMQY{A@gULZX#*dxppbv>KCv{Rya%Bc|58z7{ z?Qn0L4S#_9PsUzz*LKpu1*1Lx3#o|0`!U`RDi7FWsLi}tfsFYA$pyH_aHD2nL%Qhk zWT6OX04I~bzaPRYUp+8u-LO^Ac-~Cp=6})>Y1bjc3SHc|)AQBA>#wyp?9tej^#`cB zUeNy&b{ZFh6%KNNLi?i_!g3_9@gbKstCk`k;Md;(M|&2^jpzzE12}r_gEwc7uflL6 zdwf)~1|+T4EqNh`*2zvE(rN3atCJgn+vbKZ^nvdZuJJk@OAVE%9{}b`X534|aCiyf zPP%HSaW(t;IxP}o{8)yKY8MNSBPIY(c_qTQ=i{wpgxo-y;8J{UmnQhJD>k~BH@7dH z@GcVQqHIJhxXBTBjc44o>s^`VvrxE8ozs8kX8LWLLGw9*=tJ-!IJCi;4LU?z33mga z&j=i}&A@4MFzijQZ5wDIvO0sSfuKd%h%4&Cwckva>yKAX=!m4nUO-WrF&CI z{$mxzDP+E`v_c~3`fN#(NKRfB-udNa#nmKlb#ZY;3Xvqu?6pMFsPWdQ`CHPgWp?9sw)qRmH`!OGaMyMD9su&YF=gyUeS2c=^)hg%Zik%a#)2<0X=j zlgE7|q>OW-ahP!qGoDPu6U$%O5QWpCn#g6sZ4-HlJRgV@YuLI{f$EJPqePyv6RQN#Td56d8w5`#VQXs^ zh~}SmdbOY2Os^4cbpQ<*0(dsWDnE4*boJH9-Q`6qis>-Wy>VnEUiRPbC4lVW+nvqg>iJ33_b{(d@=t^MD{F!-# zoeortdAq+N$4@E8lcP<~^N0{*vqeFQ(ZV#HKMp0py)1II-R>E!@#=3!TY1&=(Evr1 zI9(f#rD4PEL<|AgkI(Cd-`OT;4-nbdU_~5T9IR;MGbETwi40K)qP_-qRq`hXPlFh+>%Z$lJ|*~FoW zdlR(IXXebA#QDullBd?h#U~^tO`4pnO}pWRU^CedLluv*@?na^!LC4L=1d1V`)C;E zCd=aYvN!^bN9) zEXay&p*aw|;%XI|HVR@?8VH?H?y7^*wBsS0+RN|8CW4aaqu=YZoBk!S(F zl-CS*N7dphExBI*f;3>!!Aa}aVdtV36%Qi5xN0m$ zHUONd%&l^zQnkWG&ww!6DsiAELH6%aikGLgV`EGs4qC2-6xz6y+-eF9?7zj6wwQf2 zS`nq!twxmvaPkqNcjMzp7Y*Gyq#u5LNxPQQ0vNG_pb_BClNNR_o;;bzO<+oD{H-k diff --git a/firmware/tools/make_spi_image.py b/firmware/tools/make_spi_image.py index 57cf8a92..2098a267 100755 --- a/firmware/tools/make_spi_image.py +++ b/firmware/tools/make_spi_image.py @@ -56,12 +56,12 @@ images = ( { 'name': 'bootstrap', 'data': bootstrap_image, - 'size': 0x8000, + 'size': 0x10000, }, { 'name': 'baseband', 'data': baseband_image, - 'size': 0x38000, + 'size': 0x70000, }, { 'name': 'application', @@ -75,7 +75,7 @@ spi_image_default_byte = bytearray((255,)) for image in images: if len(image['data']) > image['size']: - raise RuntimeError('data for image "%(name)s" is longer than 0x%(size)x bytes' % image) + raise RuntimeError('data for image "%(name)s" is longer than 0x%(size)x bytes 0x%(sz)x' % {'name':image['name'], 'size':image['size'], 'sz':len(image['data'])}) pad_size = image['size'] - len(image['data']) padded_data = image['data'] + (spi_image_default_byte * pad_size) spi_image += padded_data